From a90b1de832124af3bf4260af4a53aa778598de4a Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 12 Dec 2023 14:48:27 +0100 Subject: [PATCH 01/27] Pulls ML-DSA-ipd Adds test cases with NIST supplied test vectors for ML-DSA/ML-KEM --- .CMake/alg_support.cmake | 25 +- CMakeLists.txt | 3 + .../copy_from_upstream/copy_from_upstream.yml | 45 + ...ls-dilithium-standard-avx2-shake-aes.patch | 256 ++++ ...als-dilithium-standard-ref-shake-aes.patch | 231 ++++ .../pqcrystals-dilithium-standard-yml.patch | 69 + src/CMakeLists.txt | 4 + src/oqsconfig.h.cmake | 8 + src/sig/ml_dsa/CMakeLists.txt | 62 + .../LICENSE | 7 + .../align.h | 19 + .../api.h | 88 ++ .../config.h | 27 + .../consts.c | 100 ++ .../consts.h | 38 + .../invntt.S | 238 ++++ .../ntt.S | 197 +++ .../ntt.h | 19 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../pointwise.S | 211 +++ .../poly.c | 1138 +++++++++++++++++ .../poly.h | 112 ++ .../polyvec.c | 588 +++++++++ .../polyvec.h | 105 ++ .../rejsample.c | 476 +++++++ .../rejsample.h | 28 + .../rounding.c | 200 +++ .../rounding.h | 17 + .../shuffle.S | 52 + .../shuffle.inc | 25 + .../sign.c | 445 +++++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 28 + .../LICENSE | 7 + .../api.h | 88 ++ .../config.h | 27 + .../ntt.c | 98 ++ .../ntt.h | 13 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../poly.c | 911 +++++++++++++ .../poly.h | 79 ++ .../polyvec.c | 389 ++++++ .../polyvec.h | 93 ++ .../reduce.c | 69 + .../reduce.h | 22 + .../rounding.c | 102 ++ .../rounding.h | 19 + .../sign.c | 341 +++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 36 + .../LICENSE | 7 + .../align.h | 19 + .../api.h | 88 ++ .../config.h | 27 + .../consts.c | 100 ++ .../consts.h | 38 + .../invntt.S | 238 ++++ .../ntt.S | 197 +++ .../ntt.h | 19 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../pointwise.S | 211 +++ .../poly.c | 1138 +++++++++++++++++ .../poly.h | 112 ++ .../polyvec.c | 588 +++++++++ .../polyvec.h | 105 ++ .../rejsample.c | 476 +++++++ .../rejsample.h | 28 + .../rounding.c | 200 +++ .../rounding.h | 17 + .../shuffle.S | 52 + .../shuffle.inc | 25 + .../sign.c | 445 +++++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 28 + .../LICENSE | 7 + .../api.h | 88 ++ .../config.h | 27 + .../ntt.c | 98 ++ .../ntt.h | 13 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../poly.c | 911 +++++++++++++ .../poly.h | 79 ++ .../polyvec.c | 389 ++++++ .../polyvec.h | 93 ++ .../reduce.c | 69 + .../reduce.h | 22 + .../rounding.c | 102 ++ .../rounding.h | 19 + .../sign.c | 341 +++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 36 + .../LICENSE | 7 + .../align.h | 19 + .../api.h | 88 ++ .../config.h | 27 + .../consts.c | 100 ++ .../consts.h | 38 + .../invntt.S | 238 ++++ .../ntt.S | 197 +++ .../ntt.h | 19 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../pointwise.S | 211 +++ .../poly.c | 1138 +++++++++++++++++ .../poly.h | 112 ++ .../polyvec.c | 588 +++++++++ .../polyvec.h | 105 ++ .../rejsample.c | 476 +++++++ .../rejsample.h | 28 + .../rounding.c | 200 +++ .../rounding.h | 17 + .../shuffle.S | 52 + .../shuffle.inc | 25 + .../sign.c | 445 +++++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 28 + .../LICENSE | 7 + .../api.h | 88 ++ .../config.h | 27 + .../ntt.c | 98 ++ .../ntt.h | 13 + .../packing.c | 237 ++++ .../packing.h | 38 + .../params.h | 80 ++ .../poly.c | 911 +++++++++++++ .../poly.h | 79 ++ .../polyvec.c | 389 ++++++ .../polyvec.h | 93 ++ .../reduce.c | 69 + .../reduce.h | 22 + .../rounding.c | 102 ++ .../rounding.h | 19 + .../sign.c | 341 +++++ .../sign.h | 36 + .../symmetric-shake.c | 28 + .../symmetric.h | 36 + src/sig/ml_dsa/sig_ml_dsa.h | 41 + src/sig/ml_dsa/sig_ml_dsa_44.c | 90 ++ src/sig/ml_dsa/sig_ml_dsa_65.c | 90 ++ src/sig/ml_dsa/sig_ml_dsa_87.c | 90 ++ src/sig/sig.c | 39 + src/sig/sig.h | 11 +- tests/CMakeLists.txt | 7 + tests/KATs/sig/kats.json | 11 +- .../Decapsulation -- ML-KEM-1024.txt | 87 ++ .../Decapsulation -- ML-KEM-512.txt | 57 + .../Decapsulation -- ML-KEM-768.txt | 71 + .../Encapsulation -- ML-KEM-1024.txt | 64 + .../Encapsulation -- ML-KEM-512.txt | 38 + .../Encapsulation -- ML-KEM-768.txt | 50 + .../Key Generation -- ML-DSA-44.txt | 60 + .../Key Generation -- ML-DSA-65.txt | 88 ++ .../Key Generation -- ML-DSA-87.txt | 130 ++ .../Key Generation -- ML-KEM-1024.txt | 53 + .../Key Generation -- ML-KEM-512.txt | 29 + .../Key Generation -- ML-KEM-768.txt | 40 + tests/PQC Intermediate Values/Readme.txt | 4 + .../Signature Generation -- ML-DSA-44.txt | 484 +++++++ .../Signature Generation -- ML-DSA-65.txt | 273 ++++ .../Signature Generation -- ML-DSA-87.txt | 211 +++ .../Signature Verification -- ML-DSA-44.txt | 75 ++ .../Signature Verification -- ML-DSA-65.txt | 107 ++ .../Signature Verification -- ML-DSA-87.txt | 153 +++ tests/kat_sig.c | 30 + tests/vector_test.sh | 68 + tests/vector_test_kem.sh | 55 + tests/vector_test_sig.sh | 46 + tests/vectors_kem.c | 273 ++++ tests/vectors_sig.c | 269 ++++ 183 files changed, 25764 insertions(+), 3 deletions(-) create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch create mode 100644 src/sig/ml_dsa/CMakeLists.txt create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/align.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.inc create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/align.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.inc create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/align.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.inc create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/LICENSE create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/api.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/config.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/params.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.h create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c create mode 100644 src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric.h create mode 100644 src/sig/ml_dsa/sig_ml_dsa.h create mode 100644 src/sig/ml_dsa/sig_ml_dsa_44.c create mode 100644 src/sig/ml_dsa/sig_ml_dsa_65.c create mode 100644 src/sig/ml_dsa/sig_ml_dsa_87.c create mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt create mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt create mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt create mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt create mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt create mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt create mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt create mode 100644 tests/PQC Intermediate Values/Readme.txt create mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt create mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt create mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt create mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt create mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt create mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt create mode 100755 tests/vector_test.sh create mode 100644 tests/vector_test_kem.sh create mode 100644 tests/vector_test_sig.sh create mode 100644 tests/vectors_kem.c create mode 100644 tests/vectors_sig.c diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index b31320616..3b2286a43 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -273,6 +273,29 @@ endif() endif() +option(OQS_ENABLE_SIG_ML_DSA "Enable ml_dsa algorithm family" ON) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_44" OFF) +endif() +endif() + +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_65" OFF) +endif() +endif() + +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_87" OFF) +endif() +endif() + + option(OQS_ENABLE_SIG_FALCON "Enable falcon algorithm family" ON) cmake_dependent_option(OQS_ENABLE_SIG_falcon_512 "" ON "OQS_ENABLE_SIG_FALCON" OFF) if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS)) @@ -396,7 +419,7 @@ if(NOT ((OQS_MINIMAL_BUILD STREQUAL "") OR (OQS_MINIMAL_BUILD STREQUAL "OFF"))) filter_algs("${OQS_MINIMAL_BUILD}") elseif (${OQS_ALGS_ENABLED} STREQUAL "STD") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_START - filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") + filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44;SIG_ml_dsa_65;SIG_ml_dsa_87;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_END elseif(${OQS_ALGS_ENABLED} STREQUAL "NIST_R4") filter_algs("KEM_classic_mceliece_348864;KEM_classic_mceliece_348864f;KEM_classic_mceliece_460896;KEM_classic_mceliece_460896f;KEM_classic_mceliece_6688128;KEM_classic_mceliece_6688128f;KEM_classic_mceliece_6960119;KEM_classic_mceliece_6960119f;KEM_classic_mceliece_8192128;KEM_classic_mceliece_8192128f;KEM_hqc_128;KEM_hqc_192;KEM_hqc_256;KEM_bike_l1;KEM_bike_l3") diff --git a/CMakeLists.txt b/CMakeLists.txt index e1f070b3a..c404b4370 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,6 +170,9 @@ endif() if(OQS_ENABLE_SIG_DILITHIUM) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/sig/dilithium/sig_dilithium.h) endif() +if(OQS_ENABLE_SIG_ML_DSA) + set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/sig/ml_dsa/sig_ml_dsa.h) +endif() if(OQS_ENABLE_SIG_FALCON) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/sig/falcon/sig_falcon.h) endif() diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index 8c1313ac1..f2735ae53 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -37,6 +37,14 @@ upstreams: sig_meta_path: '{pretty_name_full}_META.yml' sig_scheme_path: '.' patches: [pqcrystals-dilithium-yml.patch, pqcrystals-dilithium-ref-shake-aes.patch, pqcrystals-dilithium-avx2-shake-aes.patch] + - + name: pqcrystals-dilithium-standard + git_url: https://github.com/bhess/dilithium.git + git_branch: bhe-standard-fixes + git_commit: 588562ac2cc777dfa407e34532d945b5f06b8ffd + sig_meta_path: '{pretty_name_full}_META.yml' + sig_scheme_path: '.' + patches: [pqcrystals-dilithium-standard-yml.patch, pqcrystals-dilithium-standard-ref-shake-aes.patch, pqcrystals-dilithium-standard-avx2-shake-aes.patch] kems: - name: classic_mceliece @@ -121,6 +129,23 @@ kems: scheme: "1024" pqclean_scheme: kyber1024 pretty_name_full: Kyber1024 +# - +# name: ml-kem +# default_implementation: ref +# upstream_location: pqcrystals-kyber-standard +# schemes: +# - +# scheme: "512" +# pqclean_scheme: ml-kem-512-ipd +# pretty_name_full: ML-KEM-512-ipd +# - +# scheme: "768" +# pqclean_scheme: ml-kem-768-ipd +# pretty_name_full: ML-KEM-768-ipd +# - +# scheme: "1024" +# pqclean_scheme: ml-kem-1024-ipd +# pretty_name_full: ML-KEM-512-ipd sigs: - name: dilithium @@ -146,6 +171,26 @@ sigs: pqclean_scheme: dilithium5 pretty_name_full: Dilithium5 signed_msg_order: sig_then_msg + - + name: ml_dsa + default_implementation: ref + upstream_location: pqcrystals-dilithium-standard + schemes: + - + scheme: "44" + pqclean_scheme: ml-dsa-44-ipd + pretty_name_full: ML-DSA-44-ipd + signed_msg_order: sig_then_msg + - + scheme: "65" + pqclean_scheme: ml-dsa-65-ipd + pretty_name_full: ML-DSA-65-ipd + signed_msg_order: sig_then_msg + - + scheme: "87" + pqclean_scheme: ml-dsa-87-ipd + pretty_name_full: ML-DSA-87-ipd + signed_msg_order: sig_then_msg - name: falcon default_implementation: clean diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch new file mode 100644 index 000000000..0d7b3fd03 --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch @@ -0,0 +1,256 @@ +diff --git a/avx2/poly.c b/avx2/poly.c +index c1b21c1..25d3682 100644 +--- a/avx2/poly.c ++++ b/avx2/poly.c +@@ -401,6 +401,7 @@ void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) + stream128_state state; + stream128_init(&state, seed, nonce); + poly_uniform_preinit(a, &state); ++ stream128_release(&state); + } + + void poly_uniform_4x(poly *a0, +@@ -415,7 +416,7 @@ void poly_uniform_4x(poly *a0, + { + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; +- keccakx4_state state; ++ shake128x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)seed); +@@ -433,6 +434,7 @@ void poly_uniform_4x(poly *a0, + buf[3].coeffs[SEEDBYTES+0] = nonce3; + buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; + ++ shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); + +@@ -449,6 +451,7 @@ void poly_uniform_4x(poly *a0, + ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } ++ shake128x4_inc_ctx_release(&state); + } + + /************************************************* +@@ -530,6 +533,7 @@ void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_eta_preinit(a, &state); ++ stream256_release(&state); + } + + void poly_uniform_eta_4x(poly *a0, +@@ -546,7 +550,7 @@ void poly_uniform_eta_4x(poly *a0, + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; + + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); +@@ -568,6 +572,7 @@ void poly_uniform_eta_4x(poly *a0, + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); + +@@ -584,6 +589,7 @@ void poly_uniform_eta_4x(poly *a0, + ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); + ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); + } ++ shake256x4_inc_ctx_release(&state); + } + + /************************************************* +@@ -611,6 +617,7 @@ void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_gamma1_preinit(a, &state); ++ stream256_release(&state); + } + + void poly_uniform_gamma1_4x(poly *a0, +@@ -624,7 +631,7 @@ void poly_uniform_gamma1_4x(poly *a0, + uint16_t nonce3) + { + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; +- keccakx4_state state; ++ shake256x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); +@@ -647,8 +654,10 @@ void poly_uniform_gamma1_4x(poly *a0, + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + polyz_unpack(a0, buf[0].coeffs); + polyz_unpack(a1, buf[1].coeffs); +@@ -670,12 +679,12 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + ALIGNED_UINT8(SHAKE256_RATE) buf; +- keccak_state state; ++ shake256incctx state; + +- shake256_init(&state); +- shake256_absorb(&state, seed, SEEDBYTES); +- shake256_finalize(&state); +- shake256_squeezeblocks(buf.coeffs, 1, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, seed, SEEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); + + memcpy(&signs, buf.coeffs, 8); + pos = 8; +@@ -695,6 +704,7 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } ++ shake256_inc_ctx_release(&state); + } + + /************************************************* +diff --git a/avx2/sign.c b/avx2/sign.c +index c8f2398..70599a3 100644 +--- a/avx2/sign.c ++++ b/avx2/sign.c +@@ -161,7 +161,7 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t + polyvecl y; + polyveck w0; + } tmpv; +- keccak_state state; ++ shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; +@@ -172,11 +172,11 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Compute CRH(tr, msg) */ +- shake256_init(&state); +- shake256_absorb(&state, tr, TRBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, tr, TRBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + #ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +@@ -223,11 +223,11 @@ rej: + polyveck_decompose(&w1, &tmpv.w0, &w1); + polyveck_pack_w1(sig, &w1); + +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(sig, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&c, sig); + poly_ntt(&c); + +@@ -272,6 +272,7 @@ rej: + hint[OMEGA + i] = pos = pos + n; + } + ++ shake256_inc_ctx_release(&state); + /* Pack z into signature */ + for(i = 0; i < L; i++) + polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); +@@ -329,18 +330,19 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size + polyvecl *row = rowbuf; + polyvecl z; + poly c, w1, h; +- keccak_state state; ++ shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_ctx_release(&state); + + /* Expand challenge */ + poly_challenge(&c, sig); +@@ -390,11 +392,12 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size + if(hint[j]) return -1; + + /* Call random oracle and verify challenge */ +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(buf.coeffs, CTILDEBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); ++ shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(buf.coeffs[i] != sig[i]) + return -1; +diff --git a/avx2/symmetric.h b/avx2/symmetric.h +index 8f3c3c5..fa49963 100644 +--- a/avx2/symmetric.h ++++ b/avx2/symmetric.h +@@ -6,21 +6,23 @@ + + #include "fips202.h" + +-typedef keccak_state stream128_state; +-typedef keccak_state stream256_state; ++typedef shake128incctx stream128_state; ++typedef shake256incctx stream256_state; + + #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +-void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); ++void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); + + #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +-void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce); ++void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); + + #define STREAM128_BLOCKBYTES SHAKE128_RATE + #define STREAM256_BLOCKBYTES SHAKE256_RATE + + #define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) + #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream128_release(STATE) shake128_inc_ctx_release(STATE) + #define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) + #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + + #endif + \ No newline at end of file diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch new file mode 100644 index 000000000..ae0c75c3b --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch @@ -0,0 +1,231 @@ +diff --git a/ref/poly.c b/ref/poly.c +index 054ed98..d44063f 100644 +--- a/ref/poly.c ++++ b/ref/poly.c +@@ -365,6 +365,7 @@ void poly_uniform(poly *a, + buflen = STREAM128_BLOCKBYTES + off; + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); + } ++ stream128_release(&state); + } + + /************************************************* +@@ -450,6 +451,7 @@ void poly_uniform_eta(poly *a, + stream256_squeezeblocks(buf, 1, &state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); + } ++ stream256_release(&state); + } + + /************************************************* +@@ -473,6 +475,7 @@ void poly_uniform_gamma1(poly *a, + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); ++ stream256_release(&state); + polyz_unpack(a, buf); + } + +@@ -490,11 +493,11 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + uint8_t buf[SHAKE256_RATE]; +- keccak_state state; ++ shake256incctx state; + +- shake256_init(&state); +- shake256_absorb(&state, seed, SEEDBYTES); +- shake256_finalize(&state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, seed, SEEDBYTES); ++ shake256_inc_finalize(&state); + shake256_squeezeblocks(buf, 1, &state); + + signs = 0; +@@ -518,6 +521,7 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } ++ shake256_inc_ctx_release(&state); + } + + /************************************************* +diff --git a/ref/sign.c b/ref/sign.c +index d25a399..5f57036 100644 +--- a/ref/sign.c ++++ b/ref/sign.c +@@ -90,7 +90,7 @@ int crypto_sign_signature(uint8_t *sig, + polyvecl mat[K], s1, y, z; + polyveck t0, s2, w1, w0, h; + poly cp; +- keccak_state state; ++ shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; +@@ -102,11 +102,11 @@ int crypto_sign_signature(uint8_t *sig, + + + /* Compute mu = CRH(tr, msg) */ +- shake256_init(&state); +- shake256_absorb(&state, tr, TRBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, tr, TRBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + #ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +@@ -138,11 +138,11 @@ rej: + polyveck_decompose(&w1, &w0, &w1); + polyveck_pack_w1(sig, &w1); + +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(sig, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&cp, sig); /* uses only the first SEEDBYTES bytes of sig */ + poly_ntt(&cp); + +@@ -175,6 +175,8 @@ rej: + if(n > OMEGA) + goto rej; + ++ shake256_inc_ctx_release(&state); ++ + /* Write signature */ + pack_sig(sig, sig, &z, &h); + *siglen = CRYPTO_BYTES; +@@ -240,7 +242,7 @@ int crypto_sign_verify(const uint8_t *sig, + poly cp; + polyvecl mat[K], z; + polyveck t1, w1, h; +- keccak_state state; ++ shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; +@@ -253,11 +255,11 @@ int crypto_sign_verify(const uint8_t *sig, + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + /* Matrix-vector multiplication; compute Az - c2^dt1 */ + poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ +@@ -281,11 +283,12 @@ int crypto_sign_verify(const uint8_t *sig, + polyveck_pack_w1(buf, &w1); + + /* Call random oracle and verify challenge */ +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, buf, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(c2, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(c2, CTILDEBYTES, &state); ++ shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(c[i] != c2[i]) + return -1; +diff --git a/ref/symmetric-shake.c b/ref/symmetric-shake.c +index 11ec09c..963f649 100644 +--- a/ref/symmetric-shake.c ++++ b/ref/symmetric-shake.c +@@ -3,26 +3,26 @@ + #include "symmetric.h" + #include "fips202.h" + +-void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) ++void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) + { + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + +- shake128_init(state); +- shake128_absorb(state, seed, SEEDBYTES); +- shake128_absorb(state, t, 2); +- shake128_finalize(state); ++ shake128_inc_init(state); ++ shake128_inc_absorb(state, seed, SEEDBYTES); ++ shake128_inc_absorb(state, t, 2); ++ shake128_inc_finalize(state); + } + +-void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce) ++void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) + { + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + +- shake256_init(state); +- shake256_absorb(state, seed, CRHBYTES); +- shake256_absorb(state, t, 2); +- shake256_finalize(state); ++ shake256_inc_init(state); ++ shake256_inc_absorb(state, seed, CRHBYTES); ++ shake256_inc_absorb(state, t, 2); ++ shake256_inc_finalize(state); + } +diff --git a/ref/symmetric.h b/ref/symmetric.h +index cba12d1..211de3b 100644 +--- a/ref/symmetric.h ++++ b/ref/symmetric.h +@@ -6,16 +6,16 @@ + + #include "fips202.h" + +-typedef keccak_state stream128_state; +-typedef keccak_state stream256_state; ++typedef shake128incctx stream128_state; ++typedef shake256incctx stream256_state; + + #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +-void dilithium_shake128_stream_init(keccak_state *state, ++void dilithium_shake128_stream_init(shake128incctx *state, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); + + #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +-void dilithium_shake256_stream_init(keccak_state *state, ++void dilithium_shake256_stream_init(shake256incctx *state, + const uint8_t seed[CRHBYTES], + uint16_t nonce); + +@@ -26,9 +26,11 @@ void dilithium_shake256_stream_init(keccak_state *state, + dilithium_shake128_stream_init(STATE, SEED, NONCE) + #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream128_release(STATE) shake128_inc_ctx_release(STATE) + #define stream256_init(STATE, SEED, NONCE) \ + dilithium_shake256_stream_init(STATE, SEED, NONCE) + #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + + #endif + \ No newline at end of file diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch new file mode 100644 index 000000000..6f9ed598d --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch @@ -0,0 +1,69 @@ +diff --git a/Dilithium2_META.yml b/Dilithium2_META.yml +index 78a3b82..1e37507 100644 +--- a/Dilithium2_META.yml ++++ b/Dilithium2_META.yml +@@ -24,16 +24,14 @@ implementations: + signature_keypair: pqcrystals_dilithium2_ref_keypair + signature_signature: pqcrystals_dilithium2_ref_signature + signature_verify: pqcrystals_dilithium2_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=2 + signature_keypair: pqcrystals_dilithium2_avx2_keypair + signature_signature: pqcrystals_dilithium2_avx2_signature + signature_verify: pqcrystals_dilithium2_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium3_META.yml b/Dilithium3_META.yml +index d9b76e2..dbd3677 100644 +--- a/Dilithium3_META.yml ++++ b/Dilithium3_META.yml +@@ -24,16 +24,14 @@ implementations: + signature_keypair: pqcrystals_dilithium3_ref_keypair + signature_signature: pqcrystals_dilithium3_ref_signature + signature_verify: pqcrystals_dilithium3_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=3 + signature_keypair: pqcrystals_dilithium3_avx2_keypair + signature_signature: pqcrystals_dilithium3_avx2_signature + signature_verify: pqcrystals_dilithium3_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium5_META.yml b/Dilithium5_META.yml +index c2ea5f0..3eb4bf5 100644 +--- a/Dilithium5_META.yml ++++ b/Dilithium5_META.yml +@@ -24,16 +24,14 @@ implementations: + signature_keypair: pqcrystals_dilithium5_ref_keypair + signature_signature: pqcrystals_dilithium5_ref_signature + signature_verify: pqcrystals_dilithium5_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=5 + signature_keypair: pqcrystals_dilithium5_avx2_keypair + signature_signature: pqcrystals_dilithium5_avx2_signature + signature_verify: pqcrystals_dilithium5_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ca5adf407..2f1000c60 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,10 @@ if(OQS_ENABLE_SIG_DILITHIUM) add_subdirectory(sig/dilithium) set(SIG_OBJS ${SIG_OBJS} ${DILITHIUM_OBJS}) endif() +if(OQS_ENABLE_SIG_ML_DSA) + add_subdirectory(sig/ml_dsa) + set(SIG_OBJS ${SIG_OBJS} ${ML_DSA_OBJS}) +endif() if(OQS_ENABLE_SIG_FALCON) add_subdirectory(sig/falcon) set(SIG_OBJS ${SIG_OBJS} ${FALCON_OBJS}) diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index 8fba8a160..82dfc89fd 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -120,6 +120,14 @@ #cmakedefine OQS_ENABLE_SIG_dilithium_5_avx2 1 #cmakedefine OQS_ENABLE_SIG_dilithium_5_aarch64 1 +#cmakedefine OQS_ENABLE_SIG_ML_DSA 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_44 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_44_avx2 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_65 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_65_avx2 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_87 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_87_avx2 1 + #cmakedefine OQS_ENABLE_SIG_FALCON 1 #cmakedefine OQS_ENABLE_SIG_falcon_512 1 #cmakedefine OQS_ENABLE_SIG_falcon_512_avx2 1 diff --git a/src/sig/ml_dsa/CMakeLists.txt b/src/sig/ml_dsa/CMakeLists.txt new file mode 100644 index 000000000..8ef4174c8 --- /dev/null +++ b/src/sig/ml_dsa/CMakeLists.txt @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MIT + +# This file was generated by +# scripts/copy_from_upstream/copy_from_upstream.py + +set(_ML_DSA_OBJS "") + +if(OQS_ENABLE_SIG_ml_dsa_44) + add_library(ml_dsa_44_ref OBJECT sig_ml_dsa_44.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_44_ref PUBLIC -DDILITHIUM_MODE=2) + target_include_directories(ml_dsa_44_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref) + target_include_directories(ml_dsa_44_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_44_ref PUBLIC -DDILITHIUM_MODE=2) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +if(OQS_ENABLE_SIG_ml_dsa_44_avx2) + add_library(ml_dsa_44_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_44_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2) + target_include_directories(ml_dsa_44_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_44_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_44_avx2 PUBLIC -DDILITHIUM_MODE=2) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +if(OQS_ENABLE_SIG_ml_dsa_65) + add_library(ml_dsa_65_ref OBJECT sig_ml_dsa_65.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_65_ref PUBLIC -DDILITHIUM_MODE=3) + target_include_directories(ml_dsa_65_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref) + target_include_directories(ml_dsa_65_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_65_ref PUBLIC -DDILITHIUM_MODE=3) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +if(OQS_ENABLE_SIG_ml_dsa_65_avx2) + add_library(ml_dsa_65_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_65_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2) + target_include_directories(ml_dsa_65_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_65_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_65_avx2 PUBLIC -DDILITHIUM_MODE=3) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +if(OQS_ENABLE_SIG_ml_dsa_87) + add_library(ml_dsa_87_ref OBJECT sig_ml_dsa_87.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_87_ref PUBLIC -DDILITHIUM_MODE=5) + target_include_directories(ml_dsa_87_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref) + target_include_directories(ml_dsa_87_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_87_ref PUBLIC -DDILITHIUM_MODE=5) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +if(OQS_ENABLE_SIG_ml_dsa_87_avx2) + add_library(ml_dsa_87_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_87_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2) + target_include_directories(ml_dsa_87_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_87_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_87_avx2 PUBLIC -DDILITHIUM_MODE=5) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +endif() + +set(ML_DSA_OBJS ${_ML_DSA_OBJS} PARENT_SCOPE) diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/align.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/align.h new file mode 100644 index 000000000..33fac1d96 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT32(N) \ + union { \ + int32_t coeffs[N]; \ + __m256i vec[(N+7)/8]; \ + } + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/api.h new file mode 100644 index 000000000..55b637669 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_avx2_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_avx2_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_avx2_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_avx2_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_avx2_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_avx2_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_avx2_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_avx2_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_avx2_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/config.h new file mode 100644 index 000000000..e59f81a5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_avx2_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_avx2_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_avx2_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c new file mode 100644 index 000000000..414d99ece --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c @@ -0,0 +1,100 @@ +#include +#include "params.h" +#include "consts.h" + +#define QINV 58728449 // q^(-1) mod 2^32 +#define MONT -4186625 // 2^32 mod q +#define DIV 41978 // mont^2/256 +#define DIV_QINV -8395782 + +const qdata_t qdata = {{ +#define _8XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, + +#define _8XQINV 8 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _8XDIV_QINV 16 + DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, + +#define _8XDIV 24 + DIV, DIV, DIV, DIV, DIV, DIV, DIV, DIV, + +#define _ZETAS_QINV 32 + -151046689, 1830765815, -1929875198, -1927777021, 1640767044, 1477910808, 1612161320, 1640734244, + 308362795, 308362795, 308362795, 308362795, -1815525077, -1815525077, -1815525077, -1815525077, + -1374673747, -1374673747, -1374673747, -1374673747, -1091570561, -1091570561, -1091570561, -1091570561, + -1929495947, -1929495947, -1929495947, -1929495947, 515185417, 515185417, 515185417, 515185417, + -285697463, -285697463, -285697463, -285697463, 625853735, 625853735, 625853735, 625853735, + 1727305304, 1727305304, 2082316400, 2082316400, -1364982364, -1364982364, 858240904, 858240904, + 1806278032, 1806278032, 222489248, 222489248, -346752664, -346752664, 684667771, 684667771, + 1654287830, 1654287830, -878576921, -878576921, -1257667337, -1257667337, -748618600, -748618600, + 329347125, 329347125, 1837364258, 1837364258, -1443016191, -1443016191, -1170414139, -1170414139, + -1846138265, -1631226336, -1404529459, 1838055109, 1594295555, -1076973524, -1898723372, -594436433, + -202001019, -475984260, -561427818, 1797021249, -1061813248, 2059733581, -1661512036, -1104976547, + -1750224323, -901666090, 418987550, 1831915353, -1925356481, 992097815, 879957084, 2024403852, + 1484874664, -1636082790, -285388938, -1983539117, -1495136972, -950076368, -1714807468, -952438995, + -1574918427, 1350681039, -2143979939, 1599739335, -1285853323, -993005454, -1440787840, 568627424, + -783134478, -588790216, 289871779, -1262003603, 2135294594, -1018755525, -889861155, 1665705315, + 1321868265, 1225434135, -1784632064, 666258756, 675310538, -1555941048, -1999506068, -1499481951, + -695180180, -1375177022, 1777179795, 334803717, -178766299, -518252220, 1957047970, 1146323031, + -654783359, -1974159335, 1651689966, 140455867, -1039411342, 1955560694, 1529189038, -2131021878, + -247357819, 1518161567, -86965173, 1708872713, 1787797779, 1638590967, -120646188, -1669960606, + -916321552, 1155548552, 2143745726, 1210558298, -1261461890, -318346816, 628664287, -1729304568, + 1422575624, 1424130038, -1185330464, 235321234, 168022240, 1206536194, 985155484, -894060583, + -898413, -1363460238, -605900043, 2027833504, 14253662, 1014493059, 863641633, 1819892093, + 2124962073, -1223601433, -1920467227, -1637785316, -1536588520, 694382729, 235104446, -1045062172, + 831969619, -300448763, 756955444, -260312805, 1554794072, 1339088280, -2040058690, -853476187, + -2047270596, -1723816713, -1591599803, -440824168, 1119856484, 1544891539, 155290192, -973777462, + 991903578, 912367099, -44694137, 1176904444, -421552614, -818371958, 1747917558, -325927722, + 908452108, 1851023419, -1176751719, -1354528380, -72690498, -314284737, 985022747, 963438279, + -1078959975, 604552167, -1021949428, 608791570, 173440395, -2126092136, -1316619236, -1039370342, + 6087993, -110126092, 565464272, -1758099917, -1600929361, 879867909, -1809756372, 400711272, + 1363007700, 30313375, -326425360, 1683520342, -517299994, 2027935492, -1372618620, 128353682, + -1123881663, 137583815, -635454918, -642772911, 45766801, 671509323, -2070602178, 419615363, + 1216882040, -270590488, -1276805128, 371462360, -1357098057, -384158533, 827959816, -596344473, + 702390549, -279505433, -260424530, -71875110, -1208667171, -1499603926, 2036925262, -540420426, + 746144248, -1420958686, 2032221021, 1904936414, 1257750362, 1926727420, 1931587462, 1258381762, + 885133339, 1629985060, 1967222129, 6363718, -1287922800, 1136965286, 1779436847, 1116720494, + 1042326957, 1405999311, 713994583, 940195359, -1542497137, 2061661095, -883155599, 1726753853, + -1547952704, 394851342, 283780712, 776003547, 1123958025, 201262505, 1934038751, 374860238, + +#define _ZETAS 328 + -3975713, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 1826347, 1826347, 1826347, 2353451, 2353451, 2353451, 2353451, + -359251, -359251, -359251, -359251, -2091905, -2091905, -2091905, -2091905, + 3119733, 3119733, 3119733, 3119733, -2884855, -2884855, -2884855, -2884855, + 3111497, 3111497, 3111497, 3111497, 2680103, 2680103, 2680103, 2680103, + 2725464, 2725464, 1024112, 1024112, -1079900, -1079900, 3585928, 3585928, + -549488, -549488, -1119584, -1119584, 2619752, 2619752, -2108549, -2108549, + -2118186, -2118186, -3859737, -3859737, -1399561, -1399561, -3277672, -3277672, + 1757237, 1757237, -19422, -19422, 4010497, 4010497, 280005, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -3677745, -1452451, 2176455, -1257611, -4083598, -3190144, -3632928, + 3412210, 2147896, -2967645, -411027, -671102, -22981, -381987, 1852771, + -3343383, 508951, 44288, 904516, -3724342, 1653064, 2389356, 759969, + 189548, 3159746, -2409325, 1315589, 1285669, -812732, -3019102, -3628969, + -1528703, -3041255, 3475950, -1585221, 1939314, -1000202, -3157330, 126922, + -983419, 2715295, -3693493, -2477047, -1228525, -1308169, 1349076, -1430430, + 264944, 3097992, -1100098, 3958618, -8578, -3249728, -210977, -1316856, + -3553272, -1851402, -177440, 1341330, -1584928, -1439742, -3881060, 3839961, + 2091667, -3342478, 266997, -3520352, 900702, 495491, -655327, -3556995, + 342297, 3437287, 2842341, 4055324, -3767016, -2994039, -1333058, -451100, + -1279661, 1500165, -542412, -2584293, -2013608, 1957272, -3183426, 810149, + -3038916, 2213111, -426683, -1667432, -2939036, 183443, -554416, 3937738, + 3407706, 2244091, 2434439, -3759364, 1859098, -1613174, -3122442, -525098, + 286988, -3342277, 2691481, 1247620, 1250494, 1869119, 1237275, 1312455, + 1917081, 777191, -2831860, -3724270, 2432395, 3369112, 162844, 1652634, + 3523897, -975884, 1723600, -1104333, -2235985, -976891, 3919660, 1400424, + 2316500, -2446433, -1235728, -1197226, 909542, -43260, 2031748, -768622, + -2437823, 1735879, -2590150, 2486353, 2635921, 1903435, -3318210, 3306115, + -2546312, 2235880, -1671176, 594136, 2454455, 185531, 1616392, -3694233, + 3866901, 1717735, -1803090, -260646, -420899, 1612842, -48306, -846154, + 3817976, -3562462, 3513181, -3193378, 819034, -522500, 3207046, -3595838, + 4108315, 203044, 1265009, 1595974, -3548272, -1050970, -1430225, -1962642, + -1374803, 3406031, -1846953, -3776993, -164721, -1207385, 3014001, -1799107, + 269760, 472078, 1910376, -3833893, -2286327, -3545687, -1362209, 1976782, +}}; diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.h new file mode 100644 index 000000000..930d2f09b --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.h @@ -0,0 +1,38 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _8XQ 0 +#define _8XQINV 8 +#define _8XDIV_QINV 16 +#define _8XDIV 24 +#define _ZETAS_QINV 32 +#define _ZETAS 328 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define _cdecl(s) decorate(s) +#define cdecl(s) _cdecl(DILITHIUM_NAMESPACE(##s)) +#else +#define cdecl(s) DILITHIUM_NAMESPACE(##s) +#endif + +#ifndef __ASSEMBLER__ + +#include "align.h" + +typedef ALIGNED_INT32(624) qdata_t; + +#define qdata DILITHIUM_NAMESPACE(qdata) +extern const qdata_t qdata; + +#endif +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S new file mode 100644 index 000000000..3e9864c99 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S @@ -0,0 +1,238 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpsubd %ymm\l,%ymm\h,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vpmuldq %ymm\zl0,%ymm12,%ymm13 +vmovshdup %ymm12,%ymm\h +vpmuldq %ymm\zl1,%ymm\h,%ymm14 + +vpmuldq %ymm\zh0,%ymm12,%ymm12 +vpmuldq %ymm\zh1,%ymm\h,%ymm\h + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vpsubd %ymm13,%ymm12,%ymm12 +vpsubd %ymm14,%ymm\h,%ymm\h + +vmovshdup %ymm12,%ymm12 +vpblendd $0xAA,%ymm\h,%ymm12,%ymm\h +.endm + +.macro levels0t5 off +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +/* level 0 */ +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,5,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 6,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-72)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-72)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,9,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-104)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-104)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 10,11,1,3,2,15 + +/* level 1 */ +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,6,1,3,2,15 +butterfly 5,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,10,1,3,2,15 +butterfly 9,11,1,3,2,15 + +/* level 2 */ +vpermq $0x1B,(_ZETAS_QINV+104-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+104-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,8,1,3,2,15 +butterfly 5,9,1,3,2,15 +butterfly 6,10,1,3,2,15 +butterfly 7,11,1,3,2,15 + +/* level 3 */ +shuffle2 4,5,3,5 +shuffle2 6,7,4,7 +shuffle2 8,9,6,9 +shuffle2 10,11,8,11 + +vpermq $0x1B,(_ZETAS_QINV+72-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+72-8*\off-8)*4(%rsi),%ymm2 +butterfly 3,5 +butterfly 4,7 +butterfly 6,9 +butterfly 8,11 + +/* level 4 */ +shuffle4 3,4,10,4 +shuffle4 6,8,3,8 +shuffle4 5,7,6,7 +shuffle4 9,11,5,11 + +vpermq $0x1B,(_ZETAS_QINV+40-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+40-8*\off-8)*4(%rsi),%ymm2 +butterfly 10,4 +butterfly 3,8 +butterfly 6,7 +butterfly 5,11 + +/* level 5 */ +shuffle8 10,3,9,3 +shuffle8 6,5,10,5 +shuffle8 4,8,6,8 +shuffle8 7,11,4,11 + +vpbroadcastd (_ZETAS_QINV+7-\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+7-\off)*4(%rsi),%ymm2 +butterfly 9,3 +butterfly 10,5 +butterfly 6,8 +butterfly 4,11 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm10,256*\off+ 32(%rdi) +vmovdqa %ymm6,256*\off+ 64(%rdi) +vmovdqa %ymm4,256*\off+ 96(%rdi) +vmovdqa %ymm3,256*\off+128(%rdi) +vmovdqa %ymm5,256*\off+160(%rdi) +vmovdqa %ymm8,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.macro levels6t7 off +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +/* level 6 */ +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +/* level 7 */ +vpbroadcastd (_ZETAS_QINV+0)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+0)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) + +vmovdqa (_8XDIV_QINV)*4(%rsi),%ymm1 +vmovdqa (_8XDIV)*4(%rsi),%ymm2 +vpmuldq %ymm1,%ymm4,%ymm12 +vpmuldq %ymm1,%ymm5,%ymm13 +vmovshdup %ymm4,%ymm8 +vmovshdup %ymm5,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm4,%ymm4 +vpmuldq %ymm2,%ymm5,%ymm5 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm4,%ymm4 +vpsubd %ymm13,%ymm5,%ymm5 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm4,%ymm4 +vmovshdup %ymm5,%ymm5 +vpblendd $0xAA,%ymm8,%ymm4,%ymm4 +vpblendd $0xAA,%ymm9,%ymm5,%ymm5 + +vpmuldq %ymm1,%ymm6,%ymm12 +vpmuldq %ymm1,%ymm7,%ymm13 +vmovshdup %ymm6,%ymm8 +vmovshdup %ymm7,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm6,%ymm6 +vpmuldq %ymm2,%ymm7,%ymm7 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm6,%ymm6 +vpsubd %ymm13,%ymm7,%ymm7 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm6,%ymm6 +vmovshdup %ymm7,%ymm7 +vpblendd $0xAA,%ymm8,%ymm6,%ymm6 +vpblendd $0xAA,%ymm9,%ymm7,%ymm7 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t5 0 +levels0t5 1 +levels0t5 2 +levels0t5 3 + +levels6t7 0 +levels6t7 1 +levels6t7 2 +levels6t7 3 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S new file mode 100644 index 000000000..38415de89 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S @@ -0,0 +1,197 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpmuldq %ymm\zl0,%ymm\h,%ymm13 +vmovshdup %ymm\h,%ymm12 +vpmuldq %ymm\zl1,%ymm12,%ymm14 + +vpmuldq %ymm\zh0,%ymm\h,%ymm\h +vpmuldq %ymm\zh1,%ymm12,%ymm12 + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vmovshdup %ymm\h,%ymm\h +vpblendd $0xAA,%ymm12,%ymm\h,%ymm\h + +vpsubd %ymm\h,%ymm\l,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vmovshdup %ymm13,%ymm13 +vpblendd $0xAA,%ymm14,%ymm13,%ymm13 + +vpaddd %ymm13,%ymm12,%ymm\h +vpsubd %ymm13,%ymm\l,%ymm\l +.endm + +.macro levels0t1 off +/* level 0 */ +vpbroadcastd (_ZETAS_QINV+1)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+1)*4(%rsi),%ymm2 + +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +/* level 1 */ +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) +.endm + +.macro levels2t7 off +/* level 2 */ +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +vpbroadcastd (_ZETAS_QINV+4+\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+4+\off)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +/* level 3 */ +vmovdqa (_ZETAS_QINV+8+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+8+8*\off)*4(%rsi),%ymm2 + +butterfly 3,5 +butterfly 8,10 +butterfly 4,6 +butterfly 9,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +/* level 4 */ +vmovdqa (_ZETAS_QINV+40+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+40+8*\off)*4(%rsi),%ymm2 + +butterfly 7,8 +butterfly 5,6 +butterfly 3,4 +butterfly 10,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_QINV+72+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+72+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 + +butterfly 9,5,1,10,2,15 +butterfly 8,4,1,10,2,15 +butterfly 7,3,1,10,2,15 +butterfly 6,11,1,10,2,15 + +/* level 6 */ +vmovdqa (_ZETAS_QINV+104+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,7,1,10,2,15 +butterfly 8,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+104+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,3,1,10,2,15 +butterfly 4,11,1,10,2,15 + +/* level 7 */ +vmovdqa (_ZETAS_QINV+168+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,8,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 7,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+64)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+64)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,4,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+96)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+96)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 3,11,1,10,2,15 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm8,256*\off+ 32(%rdi) +vmovdqa %ymm7,256*\off+ 64(%rdi) +vmovdqa %ymm6,256*\off+ 96(%rdi) +vmovdqa %ymm5,256*\off+128(%rdi) +vmovdqa %ymm4,256*\off+160(%rdi) +vmovdqa %ymm3,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t1 0 +levels0t1 1 +levels0t1 2 +levels0t1 3 + +levels2t7 0 +levels2t7 1 +levels2t7 2 +levels2t7 3 + +ret + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.h new file mode 100644 index 000000000..0c4fbdd34 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include + +#define ntt_avx DILITHIUM_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *a, const __m256i *qdata); +#define invntt_avx DILITHIUM_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *a, const __m256i *qdata); + +#define nttunpack_avx DILITHIUM_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *a); + +#define pointwise_avx DILITHIUM_NAMESPACE(pointwise_avx) +void pointwise_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); +#define pointwise_acc_avx DILITHIUM_NAMESPACE(pointwise_acc_avx) +void pointwise_acc_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S new file mode 100644 index 000000000..ae7ff7995 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S @@ -0,0 +1,211 @@ +#include "params.h" +#include "consts.h" + +.text +.global cdecl(pointwise_avx) +cdecl(pointwise_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop1: +#load +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa 64(%rsi),%ymm6 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vmovdqa 64(%rdx),%ymm14 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm6,%ymm7 +vpsrlq $32,%ymm10,%ymm11 +vpsrlq $32,%ymm12,%ymm13 +vmovshdup %ymm14,%ymm15 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 +vpmuldq %ymm6,%ymm14,%ymm6 +vpmuldq %ymm7,%ymm15,%ymm7 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm0,%ymm6,%ymm14 +vpmuldq %ymm0,%ymm7,%ymm15 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpmuldq %ymm1,%ymm14,%ymm14 +vpmuldq %ymm1,%ymm15,%ymm15 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsubq %ymm14,%ymm6,%ymm6 +vpsubq %ymm15,%ymm7,%ymm7 +vpsrlq $32,%ymm2,%ymm2 +vpsrlq $32,%ymm4,%ymm4 +vmovshdup %ymm6,%ymm6 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 +vpblendd $0xAA,%ymm7,%ymm6,%ymm6 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm6,64(%rdi) + +add $96,%rdi +add $96,%rsi +add $96,%rdx +add $1,%eax +cmp $10,%eax +jb _looptop1 + +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0x55,%ymm2,%ymm3,%ymm2 +vpblendd $0x55,%ymm4,%ymm5,%ymm4 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +ret + +.macro pointwise off +#load +vmovdqa \off(%rsi),%ymm6 +vmovdqa \off+32(%rsi),%ymm8 +vmovdqa \off(%rdx),%ymm10 +vmovdqa \off+32(%rdx),%ymm12 +vpsrlq $32,%ymm6,%ymm7 +vpsrlq $32,%ymm8,%ymm9 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm6,%ymm10,%ymm6 +vpmuldq %ymm7,%ymm11,%ymm7 +vpmuldq %ymm8,%ymm12,%ymm8 +vpmuldq %ymm9,%ymm13,%ymm9 +.endm + +.macro acc +vpaddq %ymm6,%ymm2,%ymm2 +vpaddq %ymm7,%ymm3,%ymm3 +vpaddq %ymm8,%ymm4,%ymm4 +vpaddq %ymm9,%ymm5,%ymm5 +.endm + +.global cdecl(pointwise_acc_avx) +cdecl(pointwise_acc_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop2: +pointwise 0 + +#mov +vmovdqa %ymm6,%ymm2 +vmovdqa %ymm7,%ymm3 +vmovdqa %ymm8,%ymm4 +vmovdqa %ymm9,%ymm5 + +pointwise 1024 +acc + +#if L >= 3 +pointwise 2048 +acc +#endif + +#if L >= 4 +pointwise 3072 +acc +#endif + +#if L >= 5 +pointwise 4096 +acc +#endif + +#if L >= 6 +pointwise 5120 +acc +#endif + +#if L >= 7 +pointwise 6144 +acc +#endif + +#reduce +vpmuldq %ymm0,%ymm2,%ymm6 +vpmuldq %ymm0,%ymm3,%ymm7 +vpmuldq %ymm0,%ymm4,%ymm8 +vpmuldq %ymm0,%ymm5,%ymm9 +vpmuldq %ymm1,%ymm6,%ymm6 +vpmuldq %ymm1,%ymm7,%ymm7 +vpmuldq %ymm1,%ymm8,%ymm8 +vpmuldq %ymm1,%ymm9,%ymm9 +vpsubq %ymm6,%ymm2,%ymm2 +vpsubq %ymm7,%ymm3,%ymm3 +vpsubq %ymm8,%ymm4,%ymm4 +vpsubq %ymm9,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 + +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +add $64,%rsi +add $64,%rdx +add $64,%rdi +add $1,%eax +cmp $16,%eax +jb _looptop2 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c new file mode 100644 index 000000000..25d36828a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c @@ -0,0 +1,1138 @@ +#include +#include +#include +#include "align.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" +#include "symmetric.h" +#include "fips202x4.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. Assumes input +* coefficients to be at most 2^31 - 2^22 - 1 in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i off = _mm256_set1_epi32(1<<22); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_add_epi32(f,off); + g = _mm256_srai_epi32(g,23); + g = _mm256_mullo_epi32(g,q); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_addq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i zero = _mm256_setzero_si256(); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_blendv_epi32(zero,q,f); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + __m256i f; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_slli_epi32(f,D); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by up to +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +void poly_nttunpack(poly *a) { + DBENCH_START(); + + nttunpack_avx(a->vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + DBENCH_START(); + + pointwise_avx(c->vec, a->vec, b->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod^+ Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + power2round_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod^+ Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except if c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + decompose_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint array. The coefficients of which are the +* indices of the coefficients of the input polynomial +* whose low bits overflow into the high bits. +* +* Arguments: - uint8_t *h: pointer to output hint array (preallocated of length N) +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of hints, i.e. length of hint array. +**************************************************/ +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1) +{ + unsigned int r; + DBENCH_START(); + + r = make_hint_avx(hint, a0->vec, a1->vec); + + DBENCH_STOP(*tround); + return r; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) +{ + DBENCH_START(); + + use_hint_avx(b->vec, a->vec, h->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input polynomial to be reduced by poly_reduce(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int r; + __m256i f,t; + const __m256i bound = _mm256_set1_epi32(B-1); + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + t = _mm256_setzero_si256(); + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_abs_epi32(f); + f = _mm256_cmpgt_epi32(f,bound); + t = _mm256_or_si256(t,f); + } + + r = 1 - _mm256_testz_si256(t,t); + DBENCH_STOP(*tsample); + return r; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_preinit(poly *a, stream128_state *state) +{ + unsigned int ctr; + /* rej_uniform_avx reads up to 8 additional bytes */ + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf; + + stream128_squeezeblocks(buf.coeffs, REJ_UNIFORM_NBLOCKS, state); + ctr = rej_uniform_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + /* length of buf is always divisible by 3; hence, no bytes left */ + stream128_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM128_BLOCKBYTES); + } +} + +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + stream128_state state; + stream128_init(&state, seed, nonce); + poly_uniform_preinit(a, &state); + stream128_release(&state); +} + +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[32], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; + shake128x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec,f); + _mm256_store_si256(buf[1].vec,f); + _mm256_store_si256(buf[2].vec,f); + _mm256_store_si256(buf[3].vec,f); + + buf[0].coeffs[SEEDBYTES+0] = nonce0; + buf[0].coeffs[SEEDBYTES+1] = nonce0 >> 8; + buf[1].coeffs[SEEDBYTES+0] = nonce1; + buf[1].coeffs[SEEDBYTES+1] = nonce1 >> 8; + buf[2].coeffs[SEEDBYTES+0] = nonce2; + buf[2].coeffs[SEEDBYTES+1] = nonce2 >> 8; + buf[3].coeffs[SEEDBYTES+0] = nonce3; + buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling using the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_eta_preinit(poly *a, stream256_state *state) +{ + unsigned int ctr; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf; + + stream256_squeezeblocks(buf.coeffs, REJ_UNIFORM_ETA_NBLOCKS, state); + ctr = rej_eta_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + stream256_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM256_BLOCKBYTES); + } +} + +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_eta_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; + + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); + + ctr0 = rej_eta_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_eta_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_eta_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_eta_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_eta(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE256_RATE); + ctr1 += rej_eta(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE256_RATE); + ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); + ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); + } + shake256x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state) +{ + /* polyz_unpack reads 14 additional bytes */ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf; + stream256_squeezeblocks(buf.coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, state); + polyz_unpack(a, buf.coeffs); +} + +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_gamma1_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; + shake256x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + polyz_unpack(a0, buf[0].coeffs); + polyz_unpack(a1, buf[1].coeffs); + polyz_unpack(a2, buf[2].coeffs); + polyz_unpack(a3, buf[3].coeffs); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + ALIGNED_UINT8(SHAKE256_RATE) buf; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); + + memcpy(&signs, buf.coeffs, 8); + pos = 8; + + memset(c->vec, 0, sizeof(poly)); + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf.coeffs, 1, &state); + pos = 0; + } + + b = buf.coeffs[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly * restrict r, const uint8_t a[POLYETA_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are positive standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly * restrict r, const uint8_t a[POLYT1_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly * restrict r, const uint8_t a[POLYT0_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +#if GAMMA1 == (1 << 17) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1, 9, 8, 7,-1, 7, 6, 5,-1, 5, 4, 3,-1, 3, 2, 1, + -1, 8, 7, 6,-1, 6, 5, 4,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(6,4,2,0,6,4,2,0); + const __m256i mask = _mm256_set1_epi32(0x3FFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[18*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA1 == (1 << 19) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1,11,10, 9,-1, 9, 8, 7,-1, 6, 5, 4,-1, 4, 3, 2, + -1, 9, 8, 7,-1, 7, 6, 5,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set1_epi64x((uint64_t)4 << 32); + const __m256i mask = _mm256_set1_epi32(0xFFFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[20*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} +#endif + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +#if GAMMA2 == (Q-1)/88 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0,f1,f2,f3; + const __m256i shift1 = _mm256_set1_epi16((64 << 8) + 1); + const __m256i shift2 = _mm256_set1_epi32((4096 << 16) + 1); + const __m256i shufdidx1 = _mm256_set_epi32(7,3,6,2,5,1,4,0); + const __m256i shufdidx2 = _mm256_set_epi32(-1,-1,6,5,4,2,1,0); + const __m256i shufbidx = _mm256_set_epi8(-1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0, + -1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/32; i++) { + f0 = _mm256_load_si256(&a->vec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift1); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx2); + _mm256_storeu_si256((__m256i *)&r[24*i],f0); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA2 == (Q-1)/32 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0, f1, f2, f3, f4, f5, f6, f7; + const __m256i shift = _mm256_set1_epi16((16 << 8) + 1); + const __m256i shufbidx = _mm256_set_epi8(15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0, + 15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/64; ++i) { + f0 = _mm256_load_si256(&a->vec[8*i+0]); + f1 = _mm256_load_si256(&a->vec[8*i+1]); + f2 = _mm256_load_si256(&a->vec[8*i+2]); + f3 = _mm256_load_si256(&a->vec[8*i+3]); + f4 = _mm256_load_si256(&a->vec[8*i+4]); + f5 = _mm256_load_si256(&a->vec[8*i+5]); + f6 = _mm256_load_si256(&a->vec[8*i+6]); + f7 = _mm256_load_si256(&a->vec[8*i+7]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f2 = _mm256_packus_epi32(f4,f5); + f3 = _mm256_packus_epi32(f6,f7); + f0 = _mm256_packus_epi16(f0,f1); + f1 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift); + f1 = _mm256_maddubs_epi16(f1,shift); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_permute4x64_epi64(f0,0xD8); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + _mm256_storeu_si256((__m256i *)&r[32*i], f0); + } + + DBENCH_STOP(*tpack); +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.h new file mode 100644 index 000000000..7bcd8e5e0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.h @@ -0,0 +1,112 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" +#include "symmetric.h" + +typedef ALIGNED_INT32(N) poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_nttunpack DILITHIUM_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform_preinit DILITHIUM_NAMESPACE(poly_uniform_preinit) +void poly_uniform_preinit(poly *a, stream128_state *state); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce); +#define poly_uniform_eta_preinit DILITHIUM_NAMESPACE(poly_uniform_eta_preinit) +void poly_uniform_eta_preinit(poly *a, stream256_state *state); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_uniform_gamma1_preinit DILITHIUM_NAMESPACE(poly_uniform_gamma1_preinit) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define poly_uniform_4x DILITHIUM_NAMESPACE(poly_uniform_4x) +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[SEEDBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_eta_4x DILITHIUM_NAMESPACE(poly_uniform_eta_4x) +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_gamma1_4x DILITHIUM_NAMESPACE(poly_uniform_gamma1_4x) +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t a[POLYETA_PACKEDBYTES]); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t a[POLYT1_PACKEDBYTES]); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t a[POLYT0_PACKEDBYTES]); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c new file mode 100644 index 000000000..6e2302168 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c @@ -0,0 +1,588 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ + +#if K == 4 && L == 4 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], NULL, rho); + polyvec_matrix_expand_row1(&mat[1], NULL, rho); + polyvec_matrix_expand_row2(&mat[2], NULL, rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 256, 257, 258, 259); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 512, 513, 514, 515); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 768, 769, 770, 771); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +#elif K == 6 && L == 5 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvecl tmp; + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &tmp, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 4, 256, 257, 258); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 259, 260, 512, 513); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowb->vec[0], rho, 514, 515, 516, 768); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 769, 770, 771, 772); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1028, 1280, 1281, 1282); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 1283, 1284, 1536, 1537); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +#elif K == 8 && L == 7 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &mat[6], rho); + polyvec_matrix_expand_row6(&mat[6], &mat[7], rho); + polyvec_matrix_expand_row7(&mat[7], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 4, 5, 6, 256); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 257, 258, 259, 260); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 261, 262, 512, 513); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 514, 515, 516, 517); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 518, 768, 769, 770); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 771, 772, 773, 774); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 1028, 1029, 1030, 1280); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 1281, 1282, 1283, 1284); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 1285, 1286, 1536, 1537); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 1538, 1539, 1540, 1541); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1542, 1792, 1793, 1794); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row7(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 1795, 1796, 1797, 1798); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +#else +#error +#endif + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, const polyvecl *u, const polyvecl *v) { + pointwise_acc_avx(w->vec, u->vec->vec, v->vec->vec, qdata.vec); +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - uint8_t *hint: pointer to output hint array +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1) +{ + unsigned int i, n = 0; + + for(i = 0; i < K; ++i) + n += poly_make_hint(&hint[n], &v0->vec[i], &v1->vec[i]); + + return n; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.h new file mode 100644 index 000000000..1b6dc87ac --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.h @@ -0,0 +1,105 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_expand_row0 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row0) +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row1 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row1) +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row2 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row2) +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row3 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row3) +void polyvec_matrix_expand_row3(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row4 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row4) +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row5 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row5) +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row6 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row6) +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row7 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row7) +void polyvec_matrix_expand_row7(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c new file mode 100644 index 000000000..8b1dde444 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c @@ -0,0 +1,476 @@ +#include +#include +#include "params.h" +#include "rejsample.h" +#include "symmetric.h" + +const uint8_t idxlut[256][8] = { + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0, 0, 0}, + { 2, 0, 0, 0, 0, 0, 0, 0}, + { 0, 2, 0, 0, 0, 0, 0, 0}, + { 1, 2, 0, 0, 0, 0, 0, 0}, + { 0, 1, 2, 0, 0, 0, 0, 0}, + { 3, 0, 0, 0, 0, 0, 0, 0}, + { 0, 3, 0, 0, 0, 0, 0, 0}, + { 1, 3, 0, 0, 0, 0, 0, 0}, + { 0, 1, 3, 0, 0, 0, 0, 0}, + { 2, 3, 0, 0, 0, 0, 0, 0}, + { 0, 2, 3, 0, 0, 0, 0, 0}, + { 1, 2, 3, 0, 0, 0, 0, 0}, + { 0, 1, 2, 3, 0, 0, 0, 0}, + { 4, 0, 0, 0, 0, 0, 0, 0}, + { 0, 4, 0, 0, 0, 0, 0, 0}, + { 1, 4, 0, 0, 0, 0, 0, 0}, + { 0, 1, 4, 0, 0, 0, 0, 0}, + { 2, 4, 0, 0, 0, 0, 0, 0}, + { 0, 2, 4, 0, 0, 0, 0, 0}, + { 1, 2, 4, 0, 0, 0, 0, 0}, + { 0, 1, 2, 4, 0, 0, 0, 0}, + { 3, 4, 0, 0, 0, 0, 0, 0}, + { 0, 3, 4, 0, 0, 0, 0, 0}, + { 1, 3, 4, 0, 0, 0, 0, 0}, + { 0, 1, 3, 4, 0, 0, 0, 0}, + { 2, 3, 4, 0, 0, 0, 0, 0}, + { 0, 2, 3, 4, 0, 0, 0, 0}, + { 1, 2, 3, 4, 0, 0, 0, 0}, + { 0, 1, 2, 3, 4, 0, 0, 0}, + { 5, 0, 0, 0, 0, 0, 0, 0}, + { 0, 5, 0, 0, 0, 0, 0, 0}, + { 1, 5, 0, 0, 0, 0, 0, 0}, + { 0, 1, 5, 0, 0, 0, 0, 0}, + { 2, 5, 0, 0, 0, 0, 0, 0}, + { 0, 2, 5, 0, 0, 0, 0, 0}, + { 1, 2, 5, 0, 0, 0, 0, 0}, + { 0, 1, 2, 5, 0, 0, 0, 0}, + { 3, 5, 0, 0, 0, 0, 0, 0}, + { 0, 3, 5, 0, 0, 0, 0, 0}, + { 1, 3, 5, 0, 0, 0, 0, 0}, + { 0, 1, 3, 5, 0, 0, 0, 0}, + { 2, 3, 5, 0, 0, 0, 0, 0}, + { 0, 2, 3, 5, 0, 0, 0, 0}, + { 1, 2, 3, 5, 0, 0, 0, 0}, + { 0, 1, 2, 3, 5, 0, 0, 0}, + { 4, 5, 0, 0, 0, 0, 0, 0}, + { 0, 4, 5, 0, 0, 0, 0, 0}, + { 1, 4, 5, 0, 0, 0, 0, 0}, + { 0, 1, 4, 5, 0, 0, 0, 0}, + { 2, 4, 5, 0, 0, 0, 0, 0}, + { 0, 2, 4, 5, 0, 0, 0, 0}, + { 1, 2, 4, 5, 0, 0, 0, 0}, + { 0, 1, 2, 4, 5, 0, 0, 0}, + { 3, 4, 5, 0, 0, 0, 0, 0}, + { 0, 3, 4, 5, 0, 0, 0, 0}, + { 1, 3, 4, 5, 0, 0, 0, 0}, + { 0, 1, 3, 4, 5, 0, 0, 0}, + { 2, 3, 4, 5, 0, 0, 0, 0}, + { 0, 2, 3, 4, 5, 0, 0, 0}, + { 1, 2, 3, 4, 5, 0, 0, 0}, + { 0, 1, 2, 3, 4, 5, 0, 0}, + { 6, 0, 0, 0, 0, 0, 0, 0}, + { 0, 6, 0, 0, 0, 0, 0, 0}, + { 1, 6, 0, 0, 0, 0, 0, 0}, + { 0, 1, 6, 0, 0, 0, 0, 0}, + { 2, 6, 0, 0, 0, 0, 0, 0}, + { 0, 2, 6, 0, 0, 0, 0, 0}, + { 1, 2, 6, 0, 0, 0, 0, 0}, + { 0, 1, 2, 6, 0, 0, 0, 0}, + { 3, 6, 0, 0, 0, 0, 0, 0}, + { 0, 3, 6, 0, 0, 0, 0, 0}, + { 1, 3, 6, 0, 0, 0, 0, 0}, + { 0, 1, 3, 6, 0, 0, 0, 0}, + { 2, 3, 6, 0, 0, 0, 0, 0}, + { 0, 2, 3, 6, 0, 0, 0, 0}, + { 1, 2, 3, 6, 0, 0, 0, 0}, + { 0, 1, 2, 3, 6, 0, 0, 0}, + { 4, 6, 0, 0, 0, 0, 0, 0}, + { 0, 4, 6, 0, 0, 0, 0, 0}, + { 1, 4, 6, 0, 0, 0, 0, 0}, + { 0, 1, 4, 6, 0, 0, 0, 0}, + { 2, 4, 6, 0, 0, 0, 0, 0}, + { 0, 2, 4, 6, 0, 0, 0, 0}, + { 1, 2, 4, 6, 0, 0, 0, 0}, + { 0, 1, 2, 4, 6, 0, 0, 0}, + { 3, 4, 6, 0, 0, 0, 0, 0}, + { 0, 3, 4, 6, 0, 0, 0, 0}, + { 1, 3, 4, 6, 0, 0, 0, 0}, + { 0, 1, 3, 4, 6, 0, 0, 0}, + { 2, 3, 4, 6, 0, 0, 0, 0}, + { 0, 2, 3, 4, 6, 0, 0, 0}, + { 1, 2, 3, 4, 6, 0, 0, 0}, + { 0, 1, 2, 3, 4, 6, 0, 0}, + { 5, 6, 0, 0, 0, 0, 0, 0}, + { 0, 5, 6, 0, 0, 0, 0, 0}, + { 1, 5, 6, 0, 0, 0, 0, 0}, + { 0, 1, 5, 6, 0, 0, 0, 0}, + { 2, 5, 6, 0, 0, 0, 0, 0}, + { 0, 2, 5, 6, 0, 0, 0, 0}, + { 1, 2, 5, 6, 0, 0, 0, 0}, + { 0, 1, 2, 5, 6, 0, 0, 0}, + { 3, 5, 6, 0, 0, 0, 0, 0}, + { 0, 3, 5, 6, 0, 0, 0, 0}, + { 1, 3, 5, 6, 0, 0, 0, 0}, + { 0, 1, 3, 5, 6, 0, 0, 0}, + { 2, 3, 5, 6, 0, 0, 0, 0}, + { 0, 2, 3, 5, 6, 0, 0, 0}, + { 1, 2, 3, 5, 6, 0, 0, 0}, + { 0, 1, 2, 3, 5, 6, 0, 0}, + { 4, 5, 6, 0, 0, 0, 0, 0}, + { 0, 4, 5, 6, 0, 0, 0, 0}, + { 1, 4, 5, 6, 0, 0, 0, 0}, + { 0, 1, 4, 5, 6, 0, 0, 0}, + { 2, 4, 5, 6, 0, 0, 0, 0}, + { 0, 2, 4, 5, 6, 0, 0, 0}, + { 1, 2, 4, 5, 6, 0, 0, 0}, + { 0, 1, 2, 4, 5, 6, 0, 0}, + { 3, 4, 5, 6, 0, 0, 0, 0}, + { 0, 3, 4, 5, 6, 0, 0, 0}, + { 1, 3, 4, 5, 6, 0, 0, 0}, + { 0, 1, 3, 4, 5, 6, 0, 0}, + { 2, 3, 4, 5, 6, 0, 0, 0}, + { 0, 2, 3, 4, 5, 6, 0, 0}, + { 1, 2, 3, 4, 5, 6, 0, 0}, + { 0, 1, 2, 3, 4, 5, 6, 0}, + { 7, 0, 0, 0, 0, 0, 0, 0}, + { 0, 7, 0, 0, 0, 0, 0, 0}, + { 1, 7, 0, 0, 0, 0, 0, 0}, + { 0, 1, 7, 0, 0, 0, 0, 0}, + { 2, 7, 0, 0, 0, 0, 0, 0}, + { 0, 2, 7, 0, 0, 0, 0, 0}, + { 1, 2, 7, 0, 0, 0, 0, 0}, + { 0, 1, 2, 7, 0, 0, 0, 0}, + { 3, 7, 0, 0, 0, 0, 0, 0}, + { 0, 3, 7, 0, 0, 0, 0, 0}, + { 1, 3, 7, 0, 0, 0, 0, 0}, + { 0, 1, 3, 7, 0, 0, 0, 0}, + { 2, 3, 7, 0, 0, 0, 0, 0}, + { 0, 2, 3, 7, 0, 0, 0, 0}, + { 1, 2, 3, 7, 0, 0, 0, 0}, + { 0, 1, 2, 3, 7, 0, 0, 0}, + { 4, 7, 0, 0, 0, 0, 0, 0}, + { 0, 4, 7, 0, 0, 0, 0, 0}, + { 1, 4, 7, 0, 0, 0, 0, 0}, + { 0, 1, 4, 7, 0, 0, 0, 0}, + { 2, 4, 7, 0, 0, 0, 0, 0}, + { 0, 2, 4, 7, 0, 0, 0, 0}, + { 1, 2, 4, 7, 0, 0, 0, 0}, + { 0, 1, 2, 4, 7, 0, 0, 0}, + { 3, 4, 7, 0, 0, 0, 0, 0}, + { 0, 3, 4, 7, 0, 0, 0, 0}, + { 1, 3, 4, 7, 0, 0, 0, 0}, + { 0, 1, 3, 4, 7, 0, 0, 0}, + { 2, 3, 4, 7, 0, 0, 0, 0}, + { 0, 2, 3, 4, 7, 0, 0, 0}, + { 1, 2, 3, 4, 7, 0, 0, 0}, + { 0, 1, 2, 3, 4, 7, 0, 0}, + { 5, 7, 0, 0, 0, 0, 0, 0}, + { 0, 5, 7, 0, 0, 0, 0, 0}, + { 1, 5, 7, 0, 0, 0, 0, 0}, + { 0, 1, 5, 7, 0, 0, 0, 0}, + { 2, 5, 7, 0, 0, 0, 0, 0}, + { 0, 2, 5, 7, 0, 0, 0, 0}, + { 1, 2, 5, 7, 0, 0, 0, 0}, + { 0, 1, 2, 5, 7, 0, 0, 0}, + { 3, 5, 7, 0, 0, 0, 0, 0}, + { 0, 3, 5, 7, 0, 0, 0, 0}, + { 1, 3, 5, 7, 0, 0, 0, 0}, + { 0, 1, 3, 5, 7, 0, 0, 0}, + { 2, 3, 5, 7, 0, 0, 0, 0}, + { 0, 2, 3, 5, 7, 0, 0, 0}, + { 1, 2, 3, 5, 7, 0, 0, 0}, + { 0, 1, 2, 3, 5, 7, 0, 0}, + { 4, 5, 7, 0, 0, 0, 0, 0}, + { 0, 4, 5, 7, 0, 0, 0, 0}, + { 1, 4, 5, 7, 0, 0, 0, 0}, + { 0, 1, 4, 5, 7, 0, 0, 0}, + { 2, 4, 5, 7, 0, 0, 0, 0}, + { 0, 2, 4, 5, 7, 0, 0, 0}, + { 1, 2, 4, 5, 7, 0, 0, 0}, + { 0, 1, 2, 4, 5, 7, 0, 0}, + { 3, 4, 5, 7, 0, 0, 0, 0}, + { 0, 3, 4, 5, 7, 0, 0, 0}, + { 1, 3, 4, 5, 7, 0, 0, 0}, + { 0, 1, 3, 4, 5, 7, 0, 0}, + { 2, 3, 4, 5, 7, 0, 0, 0}, + { 0, 2, 3, 4, 5, 7, 0, 0}, + { 1, 2, 3, 4, 5, 7, 0, 0}, + { 0, 1, 2, 3, 4, 5, 7, 0}, + { 6, 7, 0, 0, 0, 0, 0, 0}, + { 0, 6, 7, 0, 0, 0, 0, 0}, + { 1, 6, 7, 0, 0, 0, 0, 0}, + { 0, 1, 6, 7, 0, 0, 0, 0}, + { 2, 6, 7, 0, 0, 0, 0, 0}, + { 0, 2, 6, 7, 0, 0, 0, 0}, + { 1, 2, 6, 7, 0, 0, 0, 0}, + { 0, 1, 2, 6, 7, 0, 0, 0}, + { 3, 6, 7, 0, 0, 0, 0, 0}, + { 0, 3, 6, 7, 0, 0, 0, 0}, + { 1, 3, 6, 7, 0, 0, 0, 0}, + { 0, 1, 3, 6, 7, 0, 0, 0}, + { 2, 3, 6, 7, 0, 0, 0, 0}, + { 0, 2, 3, 6, 7, 0, 0, 0}, + { 1, 2, 3, 6, 7, 0, 0, 0}, + { 0, 1, 2, 3, 6, 7, 0, 0}, + { 4, 6, 7, 0, 0, 0, 0, 0}, + { 0, 4, 6, 7, 0, 0, 0, 0}, + { 1, 4, 6, 7, 0, 0, 0, 0}, + { 0, 1, 4, 6, 7, 0, 0, 0}, + { 2, 4, 6, 7, 0, 0, 0, 0}, + { 0, 2, 4, 6, 7, 0, 0, 0}, + { 1, 2, 4, 6, 7, 0, 0, 0}, + { 0, 1, 2, 4, 6, 7, 0, 0}, + { 3, 4, 6, 7, 0, 0, 0, 0}, + { 0, 3, 4, 6, 7, 0, 0, 0}, + { 1, 3, 4, 6, 7, 0, 0, 0}, + { 0, 1, 3, 4, 6, 7, 0, 0}, + { 2, 3, 4, 6, 7, 0, 0, 0}, + { 0, 2, 3, 4, 6, 7, 0, 0}, + { 1, 2, 3, 4, 6, 7, 0, 0}, + { 0, 1, 2, 3, 4, 6, 7, 0}, + { 5, 6, 7, 0, 0, 0, 0, 0}, + { 0, 5, 6, 7, 0, 0, 0, 0}, + { 1, 5, 6, 7, 0, 0, 0, 0}, + { 0, 1, 5, 6, 7, 0, 0, 0}, + { 2, 5, 6, 7, 0, 0, 0, 0}, + { 0, 2, 5, 6, 7, 0, 0, 0}, + { 1, 2, 5, 6, 7, 0, 0, 0}, + { 0, 1, 2, 5, 6, 7, 0, 0}, + { 3, 5, 6, 7, 0, 0, 0, 0}, + { 0, 3, 5, 6, 7, 0, 0, 0}, + { 1, 3, 5, 6, 7, 0, 0, 0}, + { 0, 1, 3, 5, 6, 7, 0, 0}, + { 2, 3, 5, 6, 7, 0, 0, 0}, + { 0, 2, 3, 5, 6, 7, 0, 0}, + { 1, 2, 3, 5, 6, 7, 0, 0}, + { 0, 1, 2, 3, 5, 6, 7, 0}, + { 4, 5, 6, 7, 0, 0, 0, 0}, + { 0, 4, 5, 6, 7, 0, 0, 0}, + { 1, 4, 5, 6, 7, 0, 0, 0}, + { 0, 1, 4, 5, 6, 7, 0, 0}, + { 2, 4, 5, 6, 7, 0, 0, 0}, + { 0, 2, 4, 5, 6, 7, 0, 0}, + { 1, 2, 4, 5, 6, 7, 0, 0}, + { 0, 1, 2, 4, 5, 6, 7, 0}, + { 3, 4, 5, 6, 7, 0, 0, 0}, + { 0, 3, 4, 5, 6, 7, 0, 0}, + { 1, 3, 4, 5, 6, 7, 0, 0}, + { 0, 1, 3, 4, 5, 6, 7, 0}, + { 2, 3, 4, 5, 6, 7, 0, 0}, + { 0, 2, 3, 4, 5, 6, 7, 0}, + { 1, 2, 3, 4, 5, 6, 7, 0}, + { 0, 1, 2, 3, 4, 5, 6, 7} +}; + +unsigned int rej_uniform_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]) +{ + unsigned int ctr, pos; + uint32_t good; + __m256i d, tmp; + const __m256i bound = _mm256_set1_epi32(Q); + const __m256i mask = _mm256_set1_epi32(0x7FFFFF); + const __m256i idx8 = _mm256_set_epi8(-1,15,14,13,-1,12,11,10, + -1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6, + -1, 5, 4, 3,-1, 2, 1, 0); + + ctr = pos = 0; + while(pos <= REJ_UNIFORM_BUFLEN - 24) { + d = _mm256_loadu_si256((__m256i *)&buf[pos]); + d = _mm256_permute4x64_epi64(d, 0x94); + d = _mm256_shuffle_epi8(d, idx8); + d = _mm256_and_si256(d, mask); + pos += 24; + + tmp = _mm256_sub_epi32(d, bound); + good = _mm256_movemask_ps((__m256)tmp); + tmp = _mm256_cvtepu8_epi32(_mm_loadl_epi64((__m128i *)&idxlut[good])); + d = _mm256_permutevar8x32_epi32(d, tmp); + + _mm256_storeu_si256((__m256i *)&r[ctr], d); + ctr += _mm_popcnt_u32(good); + + if(ctr > N - 8) break; + } + + uint32_t t; + while(ctr < N && pos <= REJ_UNIFORM_BUFLEN - 3) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + r[ctr++] = t; + } + + return ctr; +} + +#if ETA == 2 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1, f2; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(ETA); + const __m256i bound = mask; + const __m256i v = _mm256_set1_epi32(-6560); + const __m256i p = _mm256_set1_epi32(5); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + r[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < N) { + t1 = t1 - (205*t1 >> 10)*5; + r[ctr++] = 2 - t1; + } + } + + return ctr; +} + +#elif ETA == 4 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(4); + const __m256i bound = _mm256_set1_epi8(9); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 9) + r[ctr++] = 4 - t0; + if(t1 < 9 && ctr < N) + r[ctr++] = 4 - t1; + } + + return ctr; +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.h new file mode 100644 index 000000000..61f3f357a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.h @@ -0,0 +1,28 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_NBLOCKS ((768+STREAM128_BLOCKBYTES-1)/STREAM128_BLOCKBYTES) +#define REJ_UNIFORM_BUFLEN (REJ_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES) + +#if ETA == 2 +#define REJ_UNIFORM_ETA_NBLOCKS ((136+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define REJ_UNIFORM_ETA_NBLOCKS ((227+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#endif +#define REJ_UNIFORM_ETA_BUFLEN (REJ_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES) + +#define idxlut DILITHIUM_NAMESPACE(idxlut) +extern const uint8_t idxlut[256][8]; + +#define rej_uniform_avx DILITHIUM_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]); + +#define rej_eta_avx DILITHIUM_NAMESPACE(rej_eta_avx) +unsigned int rej_eta_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]); + +#endif + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c new file mode 100644 index 000000000..3ada65677 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include "params.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: power2round +* +* Description: For finite field elements a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be positive standard representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high bits +* - __m256i *a0: output array of length N/8 with low bits a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i mask = _mm256_set1_epi32(-(1 << D)); + const __m256i half = _mm256_set1_epi32((1 << (D-1)) - 1); + + for(i = 0; i < N/8; ++i) { + f = _mm256_load_si256(&a[i]); + f1 = _mm256_add_epi32(f,half); + f0 = _mm256_and_si256(f1,mask); + f1 = _mm256_srli_epi32(f1,D); + f0 = _mm256_sub_epi32(f,f0); + _mm256_store_si256(&a1[i],f1); + _mm256_store_si256(&a0[i],f0); + } +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low parts a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod Q - Q < 0. Assumes a to be positive standard +* representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high parts +* - __m256i *a0: output array of length N/8 with low parts a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +#if GAMMA2 == (Q-1)/32 +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i hq = _mm256_srli_epi32(q,1); + const __m256i v = _mm256_set1_epi32(1025); + const __m256i alpha = _mm256_set1_epi32(2*GAMMA2); + const __m256i off = _mm256_set1_epi32(127); + const __m256i shift = _mm256_set1_epi32(512); + const __m256i mask = _mm256_set1_epi32(15); + + for(i=0;i +#include +#include "params.h" + +#define power2round_avx DILITHIUM_NAMESPACE(power2round_avx) +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define decompose_avx DILITHIUM_NAMESPACE(decompose_avx) +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define make_hint_avx DILITHIUM_NAMESPACE(make_hint_avx) +unsigned int make_hint_avx(uint8_t hint[N], const __m256i *a0, const __m256i *a1); +#define use_hint_avx DILITHIUM_NAMESPACE(use_hint_avx) +void use_hint_avx(__m256i *b, const __m256i *a, const __m256i *hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S new file mode 100644 index 000000000..133e05132 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S @@ -0,0 +1,52 @@ +#include "consts.h" +.include "shuffle.inc" + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +#store +vmovdqa %ymm9,(%rdi) +vmovdqa %ymm8,32(%rdi) +vmovdqa %ymm7,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm5,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm3,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.inc b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c new file mode 100644 index 000000000..a39f8515c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c @@ -0,0 +1,445 @@ +#include +#include +#include "align.h" +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +static inline void polyvec_matrix_expand_row(polyvecl **row, polyvecl buf[2], const uint8_t rho[SEEDBYTES], unsigned int i) { + switch(i) { + case 0: + polyvec_matrix_expand_row0(buf, buf + 1, rho); + *row = buf; + break; + case 1: + polyvec_matrix_expand_row1(buf + 1, buf, rho); + *row = buf + 1; + break; + case 2: + polyvec_matrix_expand_row2(buf, buf + 1, rho); + *row = buf; + break; + case 3: + polyvec_matrix_expand_row3(buf + 1, buf, rho); + *row = buf + 1; + break; +#if K > 4 + case 4: + polyvec_matrix_expand_row4(buf, buf + 1, rho); + *row = buf; + break; + case 5: + polyvec_matrix_expand_row5(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif +#if K > 6 + case 6: + polyvec_matrix_expand_row6(buf, buf + 1, rho); + *row = buf; + break; + case 7: + polyvec_matrix_expand_row7(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif + } +} + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl rowbuf[2]; + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#if K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, rho, i); + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 2*SEEDBYTES + TRBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + unsigned int i, n, pos; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *rnd, *mu, *rhoprime; + uint8_t hintbuf[N]; + uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + uint64_t nonce = 0; + polyvecl mat[K], s1, z; + polyveck t0, s2, w1; + poly c, tmp; + union { + polyvecl y; + polyveck w0; + } tmpv; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Compute CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + memset(rnd, 0, RNDBYTES); +#endif + shake256(rhoprime, CRHBYTES, key, SEEDBYTES + RNDBYTES + CRHBYTES); + + /* Expand matrix and transform vectors */ + polyvec_matrix_expand(mat, rho); + polyvecl_ntt(&s1); + polyveck_ntt(&s2); + polyveck_ntt(&t0); + +rej: + /* Sample intermediate vector y */ +#if L == 4 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + nonce += 4; +#elif L == 5 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1(&z.vec[4], rhoprime, nonce + 4); + nonce += 5; +#elif L == 7 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1_4x(&z.vec[4], &z.vec[5], &z.vec[6], &tmp, + rhoprime, nonce + 4, nonce + 5, nonce + 6, 0); + nonce += 7; +#else +#error +#endif + + /* Matrix-vector product */ + tmpv.y = z; + polyvecl_ntt(&tmpv.y); + polyvec_matrix_pointwise_montgomery(&w1, mat, &tmpv.y); + polyveck_invntt_tomont(&w1); + + /* Decompose w and call the random oracle */ + polyveck_caddq(&w1); + polyveck_decompose(&w1, &tmpv.w0, &w1); + polyveck_pack_w1(sig, &w1); + + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Compute z, reject if it reveals secret */ + for(i = 0; i < L; i++) { + poly_pointwise_montgomery(&tmp, &c, &s1.vec[i]); + poly_invntt_tomont(&tmp); + poly_add(&z.vec[i], &z.vec[i], &tmp); + poly_reduce(&z.vec[i]); + if(poly_chknorm(&z.vec[i], GAMMA1 - BETA)) + goto rej; + } + + /* Zero hint vector in signature */ + pos = 0; + memset(hint, 0, OMEGA); + + for(i = 0; i < K; i++) { + /* Check that subtracting cs2 does not change high bits of w and low bits + * do not reveal secret information */ + poly_pointwise_montgomery(&tmp, &c, &s2.vec[i]); + poly_invntt_tomont(&tmp); + poly_sub(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + poly_reduce(&tmpv.w0.vec[i]); + if(poly_chknorm(&tmpv.w0.vec[i], GAMMA2 - BETA)) + goto rej; + + /* Compute hints */ + poly_pointwise_montgomery(&tmp, &c, &t0.vec[i]); + poly_invntt_tomont(&tmp); + poly_reduce(&tmp); + if(poly_chknorm(&tmp, GAMMA2)) + goto rej; + + poly_add(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + n = poly_make_hint(hintbuf, &tmpv.w0.vec[i], &w1.vec[i]); + if(pos + n > OMEGA) + goto rej; + + /* Store hints in signature */ + memcpy(&hint[pos], hintbuf, n); + hint[OMEGA + i] = pos = pos + n; + } + + shake256_inc_ctx_release(&state); + /* Pack z into signature */ + for(i = 0; i < L; i++) + polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); + + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk) { + unsigned int i, j, pos = 0; + /* polyw1_pack writes additional 14 bytes */ + ALIGNED_UINT8(K*POLYW1_PACKEDBYTES+14) buf; + uint8_t mu[CRHBYTES]; + const uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + polyvecl rowbuf[2]; + polyvecl *row = rowbuf; + polyvecl z; + poly c, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + shake256_inc_ctx_release(&state); + + /* Expand challenge */ + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Unpack z; shortness follows from unpacking */ + for(i = 0; i < L; i++) { + polyz_unpack(&z.vec[i], sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES); + poly_ntt(&z.vec[i]); + } + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, pk, i); + + /* Compute i-th row of Az - c2^Dt1 */ + polyvecl_pointwise_acc_montgomery(&w1, row, &z); + + polyt1_unpack(&h, pk + SEEDBYTES + i*POLYT1_PACKEDBYTES); + poly_shiftl(&h); + poly_ntt(&h); + poly_pointwise_montgomery(&h, &c, &h); + + poly_sub(&w1, &w1, &h); + poly_reduce(&w1); + poly_invntt_tomont(&w1); + + /* Get hint polynomial and reconstruct w1 */ + memset(h.vec, 0, sizeof(poly)); + if(hint[OMEGA + i] < pos || hint[OMEGA + i] > OMEGA) + return -1; + + for(j = pos; j < hint[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > pos && hint[j] <= hint[j-1]) return -1; + h.coeffs[hint[j]] = 1; + } + pos = hint[OMEGA + i]; + + poly_caddq(&w1); + poly_use_hint(&w1, &w1, &h); + polyw1_pack(buf.coeffs + i*POLYW1_PACKEDBYTES, &w1); + } + + /* Extra indices are zero for strong unforgeability */ + for(j = pos; j < OMEGA; ++j) + if(hint[j]) return -1; + + /* Call random oracle and verify challenge */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(buf.coeffs[i] != sig[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, const uint8_t *pk) { + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric.h new file mode 100644 index 000000000..fa49963ae --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric.h @@ -0,0 +1,28 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/api.h new file mode 100644 index 000000000..78caa5c72 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_ref_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_ref_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_ref_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_ref_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_ref_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_ref_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_ref_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_ref_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_ref_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/config.h new file mode 100644 index 000000000..eddf13f5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_ref_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_ref_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_ref_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c new file mode 100644 index 000000000..5ea8b530e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c @@ -0,0 +1,98 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +static const int32_t zetas[N] = { + 0, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, + 2725464, 1024112, -1079900, 3585928, -549488, -1119584, 2619752, -2108549, + -2118186, -3859737, -1399561, -3277672, 1757237, -19422, 4010497, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -1528703, -3677745, -3041255, -1452451, 3475950, 2176455, -1585221, + -1257611, 1939314, -4083598, -1000202, -3190144, -3157330, -3632928, 126922, + 3412210, -983419, 2147896, 2715295, -2967645, -3693493, -411027, -2477047, + -671102, -1228525, -22981, -1308169, -381987, 1349076, 1852771, -1430430, + -3343383, 264944, 508951, 3097992, 44288, -1100098, 904516, 3958618, + -3724342, -8578, 1653064, -3249728, 2389356, -210977, 759969, -1316856, + 189548, -3553272, 3159746, -1851402, -2409325, -177440, 1315589, 1341330, + 1285669, -1584928, -812732, -1439742, -3019102, -3881060, -3628969, 3839961, + 2091667, 3407706, 2316500, 3817976, -3342478, 2244091, -2446433, -3562462, + 266997, 2434439, -1235728, 3513181, -3520352, -3759364, -1197226, -3193378, + 900702, 1859098, 909542, 819034, 495491, -1613174, -43260, -522500, + -655327, -3122442, 2031748, 3207046, -3556995, -525098, -768622, -3595838, + 342297, 286988, -2437823, 4108315, 3437287, -3342277, 1735879, 203044, + 2842341, 2691481, -2590150, 1265009, 4055324, 1247620, 2486353, 1595974, + -3767016, 1250494, 2635921, -3548272, -2994039, 1869119, 1903435, -1050970, + -1333058, 1237275, -3318210, -1430225, -451100, 1312455, 3306115, -1962642, + -1279661, 1917081, -2546312, -1374803, 1500165, 777191, 2235880, 3406031, + -542412, -2831860, -1671176, -1846953, -2584293, -3724270, 594136, -3776993, + -2013608, 2432395, 2454455, -164721, 1957272, 3369112, 185531, -1207385, + -3183426, 162844, 1616392, 3014001, 810149, 1652634, -3694233, -1799107, + -3038916, 3523897, 3866901, 269760, 2213111, -975884, 1717735, 472078, + -426683, 1723600, -1803090, 1910376, -1667432, -1104333, -260646, -3833893, + -2939036, -2235985, -420899, -2286327, 183443, -976891, 1612842, -3545687, + -554416, 3919660, -48306, -1362209, 3937738, 1400424, -846154, 1976782 +}; + +/************************************************* +* Name: ntt +* +* Description: Forward NTT, in-place. No modular reduction is performed after +* additions or subtractions. Output vector is in bitreversed order. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void ntt(int32_t a[N]) { + unsigned int len, start, j, k; + int32_t zeta, t; + + k = 0; + for(len = 128; len > 0; len >>= 1) { + for(start = 0; start < N; start = j + len) { + zeta = zetas[++k]; + for(j = start; j < start + len; ++j) { + t = montgomery_reduce((int64_t)zeta * a[j + len]); + a[j + len] = a[j] - t; + a[j] = a[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inverse NTT and multiplication by Montgomery factor 2^32. +* In-place. No modular reductions after additions or +* subtractions; input coefficients need to be smaller than +* Q in absolute value. Output coefficient are smaller than Q in +* absolute value. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void invntt_tomont(int32_t a[N]) { + unsigned int start, len, j, k; + int32_t t, zeta; + const int32_t f = 41978; // mont^2/256 + + k = 256; + for(len = 1; len < N; len <<= 1) { + for(start = 0; start < N; start = j + len) { + zeta = -zetas[--k]; + for(j = start; j < start + len; ++j) { + t = a[j]; + a[j] = t + a[j + len]; + a[j + len] = t - a[j + len]; + a[j + len] = montgomery_reduce((int64_t)zeta * a[j + len]); + } + } + } + + for(j = 0; j < N; ++j) { + a[j] = montgomery_reduce((int64_t)f * a[j]); + } +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.h new file mode 100644 index 000000000..731132d5c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.h @@ -0,0 +1,13 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define ntt DILITHIUM_NAMESPACE(ntt) +void ntt(int32_t a[N]); + +#define invntt_tomont DILITHIUM_NAMESPACE(invntt_tomont) +void invntt_tomont(int32_t a[N]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c new file mode 100644 index 000000000..d44063fee --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c @@ -0,0 +1,911 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "rounding.h" +#include "symmetric.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = reduce32(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_caddq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = caddq(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] + b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] - b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] <<= D; + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_tomont(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = montgomery_reduce((int64_t)a->coeffs[i] * b->coeffs[i]); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = power2round(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = decompose(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint polynomial. The coefficients of which indicate +* whether the low bits of the corresponding coefficient of +* the input polynomial overflow into the high bits. +* +* Arguments: - poly *h: pointer to output hint polynomial +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of 1 bits. +**************************************************/ +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1) { + unsigned int i, s = 0; + DBENCH_START(); + + for(i = 0; i < N; ++i) { + h->coeffs[i] = make_hint(a0->coeffs[i], a1->coeffs[i]); + s += h->coeffs[i]; + } + + DBENCH_STOP(*tround); + return s; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + b->coeffs[i] = use_hint(a->coeffs[i], h->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input coefficients were reduced by reduce32(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int32_t t; + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + /* It is ok to leak which coefficient violates the bound since + the probability for each coefficient is independent of secret + data but we must not leak the sign of the centralized representative. */ + for(i = 0; i < N; ++i) { + /* Absolute value */ + t = a->coeffs[i] >> 31; + t = a->coeffs[i] - (t & 2*a->coeffs[i]); + + if(t >= B) { + DBENCH_STOP(*tsample); + return 1; + } + } + + DBENCH_STOP(*tsample); + return 0; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#define POLY_UNIFORM_NBLOCKS ((768 + STREAM128_BLOCKBYTES - 1)/STREAM128_BLOCKBYTES) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce) +{ + unsigned int i, ctr, off; + unsigned int buflen = POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES + 2]; + stream128_state state; + + stream128_init(&state, seed, nonce); + stream128_squeezeblocks(buf, POLY_UNIFORM_NBLOCKS, &state); + + ctr = rej_uniform(a->coeffs, N, buf, buflen); + + while(ctr < N) { + off = buflen % 3; + for(i = 0; i < off; ++i) + buf[i] = buf[buflen - off + i]; + + stream128_squeezeblocks(buf + off, 1, &state); + buflen = STREAM128_BLOCKBYTES + off; + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); + } + stream128_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling on the +* output stream from SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#if ETA == 2 +#define POLY_UNIFORM_ETA_NBLOCKS ((136 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define POLY_UNIFORM_ETA_NBLOCKS ((227 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#endif +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + unsigned int ctr; + unsigned int buflen = POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_ETA_NBLOCKS, &state); + + ctr = rej_eta(a->coeffs, N, buf, buflen); + + while(ctr < N) { + stream256_squeezeblocks(buf, 1, &state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); + } + stream256_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1m1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + uint8_t buf[POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + stream256_release(&state); + polyz_unpack(a, buf); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + uint8_t buf[SHAKE256_RATE]; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_squeezeblocks(buf, 1, &state); + + signs = 0; + for(i = 0; i < 8; ++i) + signs |= (uint64_t)buf[i] << 8*i; + pos = 8; + + for(i = 0; i < N; ++i) + c->coeffs[i] = 0; + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf, 1, &state); + pos = 0; + } + + b = buf[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyz_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = a[9*i+0]; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+1] << 8; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+2] << 16; + r->coeffs[4*i+0] &= 0x3FFFF; + + r->coeffs[4*i+1] = a[9*i+2] >> 2; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+3] << 6; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+4] << 14; + r->coeffs[4*i+1] &= 0x3FFFF; + + r->coeffs[4*i+2] = a[9*i+4] >> 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+5] << 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+6] << 12; + r->coeffs[4*i+2] &= 0x3FFFF; + + r->coeffs[4*i+3] = a[9*i+6] >> 6; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+7] << 2; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+8] << 10; + r->coeffs[4*i+3] &= 0x3FFFF; + + r->coeffs[4*i+0] = GAMMA1 - r->coeffs[4*i+0]; + r->coeffs[4*i+1] = GAMMA1 - r->coeffs[4*i+1]; + r->coeffs[4*i+2] = GAMMA1 - r->coeffs[4*i+2]; + r->coeffs[4*i+3] = GAMMA1 - r->coeffs[4*i+3]; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[5*i+0]; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+1] << 8; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+2] << 16; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+1] = a[5*i+2] >> 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyw1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA2 == (Q-1)/88 + for(i = 0; i < N/4; ++i) { + r[3*i+0] = a->coeffs[4*i+0]; + r[3*i+0] |= a->coeffs[4*i+1] << 6; + r[3*i+1] = a->coeffs[4*i+1] >> 2; + r[3*i+1] |= a->coeffs[4*i+2] << 4; + r[3*i+2] = a->coeffs[4*i+2] >> 4; + r[3*i+2] |= a->coeffs[4*i+3] << 2; + } +#elif GAMMA2 == (Q-1)/32 + for(i = 0; i < N/2; ++i) + r[i] = a->coeffs[2*i+0] | (a->coeffs[2*i+1] << 4); +#endif + + DBENCH_STOP(*tpack); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.h new file mode 100644 index 000000000..d2fd989b6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.h @@ -0,0 +1,79 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +typedef struct { + int32_t coeffs[N]; +} poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t *r, const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t *a); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t *r, const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t *a); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t *r, const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t *a); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t *r, const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c new file mode 100644 index 000000000..40032b656 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c @@ -0,0 +1,389 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + unsigned int i, j; + + for(i = 0; i < K; ++i) + for(j = 0; j < L; ++j) + poly_uniform(&mat[i].vec[j], rho, (i << 8) + j); +} + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v) +{ + unsigned int i; + poly t; + + poly_pointwise_montgomery(w, &u->vec[0], &v->vec[0]); + for(i = 1; i < L; ++i) { + poly_pointwise_montgomery(&t, &u->vec[i], &v->vec[i]); + poly_add(w, w, &t); + } +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - polyveck *h: pointer to output vector +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1) +{ + unsigned int i, s = 0; + + for(i = 0; i < K; ++i) + s += poly_make_hint(&h->vec[i], &v0->vec[i], &v1->vec[i]); + + return s; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.h new file mode 100644 index 000000000..615ac5299 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.h @@ -0,0 +1,93 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + + + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c new file mode 100644 index 000000000..75feff8bc --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c @@ -0,0 +1,69 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: For finite field element a with -2^{31}Q <= a <= Q*2^31, +* compute r \equiv a*2^{-32} (mod Q) such that -Q < r < Q. +* +* Arguments: - int64_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t montgomery_reduce(int64_t a) { + int32_t t; + + t = (int64_t)(int32_t)a*QINV; + t = (a - (int64_t)t*Q) >> 32; + return t; +} + +/************************************************* +* Name: reduce32 +* +* Description: For finite field element a with a <= 2^{31} - 2^{22} - 1, +* compute r \equiv a (mod Q) such that -6283009 <= r <= 6283007. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t reduce32(int32_t a) { + int32_t t; + + t = (a + (1 << 22)) >> 23; + t = a - t*Q; + return t; +} + +/************************************************* +* Name: caddq +* +* Description: Add Q if input coefficient is negative. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t caddq(int32_t a) { + a += (a >> 31) & Q; + return a; +} + +/************************************************* +* Name: freeze +* +* Description: For finite field element a, compute standard +* representative r = a mod^+ Q. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t freeze(int32_t a) { + a = reduce32(a); + a = caddq(a); + return a; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.h new file mode 100644 index 000000000..26d9b4ee2 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.h @@ -0,0 +1,22 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -4186625 // 2^32 % Q +#define QINV 58728449 // q^(-1) mod 2^32 + +#define montgomery_reduce DILITHIUM_NAMESPACE(montgomery_reduce) +int32_t montgomery_reduce(int64_t a); + +#define reduce32 DILITHIUM_NAMESPACE(reduce32) +int32_t reduce32(int32_t a); + +#define caddq DILITHIUM_NAMESPACE(caddq) +int32_t caddq(int32_t a); + +#define freeze DILITHIUM_NAMESPACE(freeze) +int32_t freeze(int32_t a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c new file mode 100644 index 000000000..889f0a296 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c @@ -0,0 +1,102 @@ +#include +#include "params.h" +#include "rounding.h" + +/************************************************* +* Name: power2round +* +* Description: For finite field element a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be standard representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t power2round(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + (1 << (D-1)) - 1) >> D; + *a0 = a - (a1 << D); + return a1; +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low bits a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod^+ Q - Q < 0. Assumes a to be standard +* representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t decompose(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + 127) >> 7; +#if GAMMA2 == (Q-1)/32 + a1 = (a1*1025 + (1 << 21)) >> 22; + a1 &= 15; +#elif GAMMA2 == (Q-1)/88 + a1 = (a1*11275 + (1 << 23)) >> 24; + a1 ^= ((43 - a1) >> 31) & a1; +#endif + + *a0 = a - a1*2*GAMMA2; + *a0 -= (((Q-1)/2 - *a0) >> 31) & Q; + return a1; +} + +/************************************************* +* Name: make_hint +* +* Description: Compute hint bit indicating whether the low bits of the +* input element overflow into the high bits. +* +* Arguments: - int32_t a0: low bits of input element +* - int32_t a1: high bits of input element +* +* Returns 1 if overflow. +**************************************************/ +unsigned int make_hint(int32_t a0, int32_t a1) { + if(a0 > GAMMA2 || a0 < -GAMMA2 || (a0 == -GAMMA2 && a1 != 0)) + return 1; + + return 0; +} + +/************************************************* +* Name: use_hint +* +* Description: Correct high bits according to hint. +* +* Arguments: - int32_t a: input element +* - unsigned int hint: hint bit +* +* Returns corrected high bits. +**************************************************/ +int32_t use_hint(int32_t a, unsigned int hint) { + int32_t a0, a1; + + a1 = decompose(&a0, a); + if(hint == 0) + return a1; + +#if GAMMA2 == (Q-1)/32 + if(a0 > 0) + return (a1 + 1) & 15; + else + return (a1 - 1) & 15; +#elif GAMMA2 == (Q-1)/88 + if(a0 > 0) + return (a1 == 43) ? 0 : a1 + 1; + else + return (a1 == 0) ? 43 : a1 - 1; +#endif +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.h new file mode 100644 index 000000000..b72e8e8d6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.h @@ -0,0 +1,19 @@ +#ifndef ROUNDING_H +#define ROUNDING_H + +#include +#include "params.h" + +#define power2round DILITHIUM_NAMESPACE(power2round) +int32_t power2round(int32_t *a0, int32_t a); + +#define decompose DILITHIUM_NAMESPACE(decompose) +int32_t decompose(int32_t *a0, int32_t a); + +#define make_hint DILITHIUM_NAMESPACE(make_hint) +unsigned int make_hint(int32_t a0, int32_t a1); + +#define use_hint DILITHIUM_NAMESPACE(use_hint) +int32_t use_hint(int32_t a, unsigned int hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c new file mode 100644 index 000000000..9298ad217 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c @@ -0,0 +1,341 @@ +#include +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[TRBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, + size_t *siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + unsigned int n; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *mu, *rhoprime, *rnd; + uint16_t nonce = 0; + polyvecl mat[K], s1, y, z; + polyveck t0, s2, w1, w0, h; + poly cp; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + + /* Compute mu = CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + for(n=0;n OMEGA) + goto rej; + + shake256_inc_ctx_release(&state); + + /* Write signature */ + pack_sig(sig, sig, &z, &h); + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, + size_t *smlen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, + size_t siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *pk) +{ + unsigned int i; + uint8_t buf[K*POLYW1_PACKEDBYTES]; + uint8_t rho[SEEDBYTES]; + uint8_t mu[CRHBYTES]; + uint8_t c[CTILDEBYTES]; + uint8_t c2[CTILDEBYTES]; + poly cp; + polyvecl mat[K], z; + polyveck t1, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + unpack_pk(rho, &t1, pk); + if(unpack_sig(c, &z, &h, sig)) + return -1; + if(polyvecl_chknorm(&z, GAMMA1 - BETA)) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + + /* Matrix-vector multiplication; compute Az - c2^dt1 */ + poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ + polyvec_matrix_expand(mat, rho); + + polyvecl_ntt(&z); + polyvec_matrix_pointwise_montgomery(&w1, mat, &z); + + poly_ntt(&cp); + polyveck_shiftl(&t1); + polyveck_ntt(&t1); + polyveck_pointwise_poly_montgomery(&t1, &cp, &t1); + + polyveck_sub(&w1, &w1, &t1); + polyveck_reduce(&w1); + polyveck_invntt_tomont(&w1); + + /* Reconstruct w1 */ + polyveck_caddq(&w1); + polyveck_use_hint(&w1, &w1, &h); + polyveck_pack_w1(buf, &w1); + + /* Call random oracle and verify challenge */ + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(c2, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(c[i] != c2[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, + size_t *mlen, + const uint8_t *sm, + size_t smlen, + const uint8_t *pk) +{ + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric.h new file mode 100644 index 000000000..211de3b86 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric.h @@ -0,0 +1,36 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, + const uint8_t seed[CRHBYTES], + uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) \ + dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) \ + dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/align.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/align.h new file mode 100644 index 000000000..33fac1d96 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT32(N) \ + union { \ + int32_t coeffs[N]; \ + __m256i vec[(N+7)/8]; \ + } + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/api.h new file mode 100644 index 000000000..55b637669 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_avx2_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_avx2_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_avx2_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_avx2_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_avx2_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_avx2_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_avx2_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_avx2_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_avx2_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/config.h new file mode 100644 index 000000000..e59f81a5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_avx2_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_avx2_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_avx2_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c new file mode 100644 index 000000000..414d99ece --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c @@ -0,0 +1,100 @@ +#include +#include "params.h" +#include "consts.h" + +#define QINV 58728449 // q^(-1) mod 2^32 +#define MONT -4186625 // 2^32 mod q +#define DIV 41978 // mont^2/256 +#define DIV_QINV -8395782 + +const qdata_t qdata = {{ +#define _8XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, + +#define _8XQINV 8 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _8XDIV_QINV 16 + DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, + +#define _8XDIV 24 + DIV, DIV, DIV, DIV, DIV, DIV, DIV, DIV, + +#define _ZETAS_QINV 32 + -151046689, 1830765815, -1929875198, -1927777021, 1640767044, 1477910808, 1612161320, 1640734244, + 308362795, 308362795, 308362795, 308362795, -1815525077, -1815525077, -1815525077, -1815525077, + -1374673747, -1374673747, -1374673747, -1374673747, -1091570561, -1091570561, -1091570561, -1091570561, + -1929495947, -1929495947, -1929495947, -1929495947, 515185417, 515185417, 515185417, 515185417, + -285697463, -285697463, -285697463, -285697463, 625853735, 625853735, 625853735, 625853735, + 1727305304, 1727305304, 2082316400, 2082316400, -1364982364, -1364982364, 858240904, 858240904, + 1806278032, 1806278032, 222489248, 222489248, -346752664, -346752664, 684667771, 684667771, + 1654287830, 1654287830, -878576921, -878576921, -1257667337, -1257667337, -748618600, -748618600, + 329347125, 329347125, 1837364258, 1837364258, -1443016191, -1443016191, -1170414139, -1170414139, + -1846138265, -1631226336, -1404529459, 1838055109, 1594295555, -1076973524, -1898723372, -594436433, + -202001019, -475984260, -561427818, 1797021249, -1061813248, 2059733581, -1661512036, -1104976547, + -1750224323, -901666090, 418987550, 1831915353, -1925356481, 992097815, 879957084, 2024403852, + 1484874664, -1636082790, -285388938, -1983539117, -1495136972, -950076368, -1714807468, -952438995, + -1574918427, 1350681039, -2143979939, 1599739335, -1285853323, -993005454, -1440787840, 568627424, + -783134478, -588790216, 289871779, -1262003603, 2135294594, -1018755525, -889861155, 1665705315, + 1321868265, 1225434135, -1784632064, 666258756, 675310538, -1555941048, -1999506068, -1499481951, + -695180180, -1375177022, 1777179795, 334803717, -178766299, -518252220, 1957047970, 1146323031, + -654783359, -1974159335, 1651689966, 140455867, -1039411342, 1955560694, 1529189038, -2131021878, + -247357819, 1518161567, -86965173, 1708872713, 1787797779, 1638590967, -120646188, -1669960606, + -916321552, 1155548552, 2143745726, 1210558298, -1261461890, -318346816, 628664287, -1729304568, + 1422575624, 1424130038, -1185330464, 235321234, 168022240, 1206536194, 985155484, -894060583, + -898413, -1363460238, -605900043, 2027833504, 14253662, 1014493059, 863641633, 1819892093, + 2124962073, -1223601433, -1920467227, -1637785316, -1536588520, 694382729, 235104446, -1045062172, + 831969619, -300448763, 756955444, -260312805, 1554794072, 1339088280, -2040058690, -853476187, + -2047270596, -1723816713, -1591599803, -440824168, 1119856484, 1544891539, 155290192, -973777462, + 991903578, 912367099, -44694137, 1176904444, -421552614, -818371958, 1747917558, -325927722, + 908452108, 1851023419, -1176751719, -1354528380, -72690498, -314284737, 985022747, 963438279, + -1078959975, 604552167, -1021949428, 608791570, 173440395, -2126092136, -1316619236, -1039370342, + 6087993, -110126092, 565464272, -1758099917, -1600929361, 879867909, -1809756372, 400711272, + 1363007700, 30313375, -326425360, 1683520342, -517299994, 2027935492, -1372618620, 128353682, + -1123881663, 137583815, -635454918, -642772911, 45766801, 671509323, -2070602178, 419615363, + 1216882040, -270590488, -1276805128, 371462360, -1357098057, -384158533, 827959816, -596344473, + 702390549, -279505433, -260424530, -71875110, -1208667171, -1499603926, 2036925262, -540420426, + 746144248, -1420958686, 2032221021, 1904936414, 1257750362, 1926727420, 1931587462, 1258381762, + 885133339, 1629985060, 1967222129, 6363718, -1287922800, 1136965286, 1779436847, 1116720494, + 1042326957, 1405999311, 713994583, 940195359, -1542497137, 2061661095, -883155599, 1726753853, + -1547952704, 394851342, 283780712, 776003547, 1123958025, 201262505, 1934038751, 374860238, + +#define _ZETAS 328 + -3975713, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 1826347, 1826347, 1826347, 2353451, 2353451, 2353451, 2353451, + -359251, -359251, -359251, -359251, -2091905, -2091905, -2091905, -2091905, + 3119733, 3119733, 3119733, 3119733, -2884855, -2884855, -2884855, -2884855, + 3111497, 3111497, 3111497, 3111497, 2680103, 2680103, 2680103, 2680103, + 2725464, 2725464, 1024112, 1024112, -1079900, -1079900, 3585928, 3585928, + -549488, -549488, -1119584, -1119584, 2619752, 2619752, -2108549, -2108549, + -2118186, -2118186, -3859737, -3859737, -1399561, -1399561, -3277672, -3277672, + 1757237, 1757237, -19422, -19422, 4010497, 4010497, 280005, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -3677745, -1452451, 2176455, -1257611, -4083598, -3190144, -3632928, + 3412210, 2147896, -2967645, -411027, -671102, -22981, -381987, 1852771, + -3343383, 508951, 44288, 904516, -3724342, 1653064, 2389356, 759969, + 189548, 3159746, -2409325, 1315589, 1285669, -812732, -3019102, -3628969, + -1528703, -3041255, 3475950, -1585221, 1939314, -1000202, -3157330, 126922, + -983419, 2715295, -3693493, -2477047, -1228525, -1308169, 1349076, -1430430, + 264944, 3097992, -1100098, 3958618, -8578, -3249728, -210977, -1316856, + -3553272, -1851402, -177440, 1341330, -1584928, -1439742, -3881060, 3839961, + 2091667, -3342478, 266997, -3520352, 900702, 495491, -655327, -3556995, + 342297, 3437287, 2842341, 4055324, -3767016, -2994039, -1333058, -451100, + -1279661, 1500165, -542412, -2584293, -2013608, 1957272, -3183426, 810149, + -3038916, 2213111, -426683, -1667432, -2939036, 183443, -554416, 3937738, + 3407706, 2244091, 2434439, -3759364, 1859098, -1613174, -3122442, -525098, + 286988, -3342277, 2691481, 1247620, 1250494, 1869119, 1237275, 1312455, + 1917081, 777191, -2831860, -3724270, 2432395, 3369112, 162844, 1652634, + 3523897, -975884, 1723600, -1104333, -2235985, -976891, 3919660, 1400424, + 2316500, -2446433, -1235728, -1197226, 909542, -43260, 2031748, -768622, + -2437823, 1735879, -2590150, 2486353, 2635921, 1903435, -3318210, 3306115, + -2546312, 2235880, -1671176, 594136, 2454455, 185531, 1616392, -3694233, + 3866901, 1717735, -1803090, -260646, -420899, 1612842, -48306, -846154, + 3817976, -3562462, 3513181, -3193378, 819034, -522500, 3207046, -3595838, + 4108315, 203044, 1265009, 1595974, -3548272, -1050970, -1430225, -1962642, + -1374803, 3406031, -1846953, -3776993, -164721, -1207385, 3014001, -1799107, + 269760, 472078, 1910376, -3833893, -2286327, -3545687, -1362209, 1976782, +}}; diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.h new file mode 100644 index 000000000..930d2f09b --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.h @@ -0,0 +1,38 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _8XQ 0 +#define _8XQINV 8 +#define _8XDIV_QINV 16 +#define _8XDIV 24 +#define _ZETAS_QINV 32 +#define _ZETAS 328 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define _cdecl(s) decorate(s) +#define cdecl(s) _cdecl(DILITHIUM_NAMESPACE(##s)) +#else +#define cdecl(s) DILITHIUM_NAMESPACE(##s) +#endif + +#ifndef __ASSEMBLER__ + +#include "align.h" + +typedef ALIGNED_INT32(624) qdata_t; + +#define qdata DILITHIUM_NAMESPACE(qdata) +extern const qdata_t qdata; + +#endif +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S new file mode 100644 index 000000000..3e9864c99 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S @@ -0,0 +1,238 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpsubd %ymm\l,%ymm\h,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vpmuldq %ymm\zl0,%ymm12,%ymm13 +vmovshdup %ymm12,%ymm\h +vpmuldq %ymm\zl1,%ymm\h,%ymm14 + +vpmuldq %ymm\zh0,%ymm12,%ymm12 +vpmuldq %ymm\zh1,%ymm\h,%ymm\h + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vpsubd %ymm13,%ymm12,%ymm12 +vpsubd %ymm14,%ymm\h,%ymm\h + +vmovshdup %ymm12,%ymm12 +vpblendd $0xAA,%ymm\h,%ymm12,%ymm\h +.endm + +.macro levels0t5 off +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +/* level 0 */ +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,5,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 6,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-72)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-72)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,9,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-104)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-104)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 10,11,1,3,2,15 + +/* level 1 */ +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,6,1,3,2,15 +butterfly 5,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,10,1,3,2,15 +butterfly 9,11,1,3,2,15 + +/* level 2 */ +vpermq $0x1B,(_ZETAS_QINV+104-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+104-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,8,1,3,2,15 +butterfly 5,9,1,3,2,15 +butterfly 6,10,1,3,2,15 +butterfly 7,11,1,3,2,15 + +/* level 3 */ +shuffle2 4,5,3,5 +shuffle2 6,7,4,7 +shuffle2 8,9,6,9 +shuffle2 10,11,8,11 + +vpermq $0x1B,(_ZETAS_QINV+72-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+72-8*\off-8)*4(%rsi),%ymm2 +butterfly 3,5 +butterfly 4,7 +butterfly 6,9 +butterfly 8,11 + +/* level 4 */ +shuffle4 3,4,10,4 +shuffle4 6,8,3,8 +shuffle4 5,7,6,7 +shuffle4 9,11,5,11 + +vpermq $0x1B,(_ZETAS_QINV+40-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+40-8*\off-8)*4(%rsi),%ymm2 +butterfly 10,4 +butterfly 3,8 +butterfly 6,7 +butterfly 5,11 + +/* level 5 */ +shuffle8 10,3,9,3 +shuffle8 6,5,10,5 +shuffle8 4,8,6,8 +shuffle8 7,11,4,11 + +vpbroadcastd (_ZETAS_QINV+7-\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+7-\off)*4(%rsi),%ymm2 +butterfly 9,3 +butterfly 10,5 +butterfly 6,8 +butterfly 4,11 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm10,256*\off+ 32(%rdi) +vmovdqa %ymm6,256*\off+ 64(%rdi) +vmovdqa %ymm4,256*\off+ 96(%rdi) +vmovdqa %ymm3,256*\off+128(%rdi) +vmovdqa %ymm5,256*\off+160(%rdi) +vmovdqa %ymm8,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.macro levels6t7 off +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +/* level 6 */ +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +/* level 7 */ +vpbroadcastd (_ZETAS_QINV+0)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+0)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) + +vmovdqa (_8XDIV_QINV)*4(%rsi),%ymm1 +vmovdqa (_8XDIV)*4(%rsi),%ymm2 +vpmuldq %ymm1,%ymm4,%ymm12 +vpmuldq %ymm1,%ymm5,%ymm13 +vmovshdup %ymm4,%ymm8 +vmovshdup %ymm5,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm4,%ymm4 +vpmuldq %ymm2,%ymm5,%ymm5 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm4,%ymm4 +vpsubd %ymm13,%ymm5,%ymm5 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm4,%ymm4 +vmovshdup %ymm5,%ymm5 +vpblendd $0xAA,%ymm8,%ymm4,%ymm4 +vpblendd $0xAA,%ymm9,%ymm5,%ymm5 + +vpmuldq %ymm1,%ymm6,%ymm12 +vpmuldq %ymm1,%ymm7,%ymm13 +vmovshdup %ymm6,%ymm8 +vmovshdup %ymm7,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm6,%ymm6 +vpmuldq %ymm2,%ymm7,%ymm7 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm6,%ymm6 +vpsubd %ymm13,%ymm7,%ymm7 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm6,%ymm6 +vmovshdup %ymm7,%ymm7 +vpblendd $0xAA,%ymm8,%ymm6,%ymm6 +vpblendd $0xAA,%ymm9,%ymm7,%ymm7 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t5 0 +levels0t5 1 +levels0t5 2 +levels0t5 3 + +levels6t7 0 +levels6t7 1 +levels6t7 2 +levels6t7 3 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S new file mode 100644 index 000000000..38415de89 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S @@ -0,0 +1,197 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpmuldq %ymm\zl0,%ymm\h,%ymm13 +vmovshdup %ymm\h,%ymm12 +vpmuldq %ymm\zl1,%ymm12,%ymm14 + +vpmuldq %ymm\zh0,%ymm\h,%ymm\h +vpmuldq %ymm\zh1,%ymm12,%ymm12 + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vmovshdup %ymm\h,%ymm\h +vpblendd $0xAA,%ymm12,%ymm\h,%ymm\h + +vpsubd %ymm\h,%ymm\l,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vmovshdup %ymm13,%ymm13 +vpblendd $0xAA,%ymm14,%ymm13,%ymm13 + +vpaddd %ymm13,%ymm12,%ymm\h +vpsubd %ymm13,%ymm\l,%ymm\l +.endm + +.macro levels0t1 off +/* level 0 */ +vpbroadcastd (_ZETAS_QINV+1)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+1)*4(%rsi),%ymm2 + +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +/* level 1 */ +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) +.endm + +.macro levels2t7 off +/* level 2 */ +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +vpbroadcastd (_ZETAS_QINV+4+\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+4+\off)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +/* level 3 */ +vmovdqa (_ZETAS_QINV+8+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+8+8*\off)*4(%rsi),%ymm2 + +butterfly 3,5 +butterfly 8,10 +butterfly 4,6 +butterfly 9,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +/* level 4 */ +vmovdqa (_ZETAS_QINV+40+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+40+8*\off)*4(%rsi),%ymm2 + +butterfly 7,8 +butterfly 5,6 +butterfly 3,4 +butterfly 10,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_QINV+72+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+72+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 + +butterfly 9,5,1,10,2,15 +butterfly 8,4,1,10,2,15 +butterfly 7,3,1,10,2,15 +butterfly 6,11,1,10,2,15 + +/* level 6 */ +vmovdqa (_ZETAS_QINV+104+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,7,1,10,2,15 +butterfly 8,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+104+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,3,1,10,2,15 +butterfly 4,11,1,10,2,15 + +/* level 7 */ +vmovdqa (_ZETAS_QINV+168+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,8,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 7,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+64)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+64)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,4,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+96)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+96)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 3,11,1,10,2,15 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm8,256*\off+ 32(%rdi) +vmovdqa %ymm7,256*\off+ 64(%rdi) +vmovdqa %ymm6,256*\off+ 96(%rdi) +vmovdqa %ymm5,256*\off+128(%rdi) +vmovdqa %ymm4,256*\off+160(%rdi) +vmovdqa %ymm3,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t1 0 +levels0t1 1 +levels0t1 2 +levels0t1 3 + +levels2t7 0 +levels2t7 1 +levels2t7 2 +levels2t7 3 + +ret + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.h new file mode 100644 index 000000000..0c4fbdd34 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include + +#define ntt_avx DILITHIUM_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *a, const __m256i *qdata); +#define invntt_avx DILITHIUM_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *a, const __m256i *qdata); + +#define nttunpack_avx DILITHIUM_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *a); + +#define pointwise_avx DILITHIUM_NAMESPACE(pointwise_avx) +void pointwise_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); +#define pointwise_acc_avx DILITHIUM_NAMESPACE(pointwise_acc_avx) +void pointwise_acc_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S new file mode 100644 index 000000000..ae7ff7995 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S @@ -0,0 +1,211 @@ +#include "params.h" +#include "consts.h" + +.text +.global cdecl(pointwise_avx) +cdecl(pointwise_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop1: +#load +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa 64(%rsi),%ymm6 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vmovdqa 64(%rdx),%ymm14 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm6,%ymm7 +vpsrlq $32,%ymm10,%ymm11 +vpsrlq $32,%ymm12,%ymm13 +vmovshdup %ymm14,%ymm15 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 +vpmuldq %ymm6,%ymm14,%ymm6 +vpmuldq %ymm7,%ymm15,%ymm7 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm0,%ymm6,%ymm14 +vpmuldq %ymm0,%ymm7,%ymm15 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpmuldq %ymm1,%ymm14,%ymm14 +vpmuldq %ymm1,%ymm15,%ymm15 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsubq %ymm14,%ymm6,%ymm6 +vpsubq %ymm15,%ymm7,%ymm7 +vpsrlq $32,%ymm2,%ymm2 +vpsrlq $32,%ymm4,%ymm4 +vmovshdup %ymm6,%ymm6 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 +vpblendd $0xAA,%ymm7,%ymm6,%ymm6 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm6,64(%rdi) + +add $96,%rdi +add $96,%rsi +add $96,%rdx +add $1,%eax +cmp $10,%eax +jb _looptop1 + +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0x55,%ymm2,%ymm3,%ymm2 +vpblendd $0x55,%ymm4,%ymm5,%ymm4 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +ret + +.macro pointwise off +#load +vmovdqa \off(%rsi),%ymm6 +vmovdqa \off+32(%rsi),%ymm8 +vmovdqa \off(%rdx),%ymm10 +vmovdqa \off+32(%rdx),%ymm12 +vpsrlq $32,%ymm6,%ymm7 +vpsrlq $32,%ymm8,%ymm9 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm6,%ymm10,%ymm6 +vpmuldq %ymm7,%ymm11,%ymm7 +vpmuldq %ymm8,%ymm12,%ymm8 +vpmuldq %ymm9,%ymm13,%ymm9 +.endm + +.macro acc +vpaddq %ymm6,%ymm2,%ymm2 +vpaddq %ymm7,%ymm3,%ymm3 +vpaddq %ymm8,%ymm4,%ymm4 +vpaddq %ymm9,%ymm5,%ymm5 +.endm + +.global cdecl(pointwise_acc_avx) +cdecl(pointwise_acc_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop2: +pointwise 0 + +#mov +vmovdqa %ymm6,%ymm2 +vmovdqa %ymm7,%ymm3 +vmovdqa %ymm8,%ymm4 +vmovdqa %ymm9,%ymm5 + +pointwise 1024 +acc + +#if L >= 3 +pointwise 2048 +acc +#endif + +#if L >= 4 +pointwise 3072 +acc +#endif + +#if L >= 5 +pointwise 4096 +acc +#endif + +#if L >= 6 +pointwise 5120 +acc +#endif + +#if L >= 7 +pointwise 6144 +acc +#endif + +#reduce +vpmuldq %ymm0,%ymm2,%ymm6 +vpmuldq %ymm0,%ymm3,%ymm7 +vpmuldq %ymm0,%ymm4,%ymm8 +vpmuldq %ymm0,%ymm5,%ymm9 +vpmuldq %ymm1,%ymm6,%ymm6 +vpmuldq %ymm1,%ymm7,%ymm7 +vpmuldq %ymm1,%ymm8,%ymm8 +vpmuldq %ymm1,%ymm9,%ymm9 +vpsubq %ymm6,%ymm2,%ymm2 +vpsubq %ymm7,%ymm3,%ymm3 +vpsubq %ymm8,%ymm4,%ymm4 +vpsubq %ymm9,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 + +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +add $64,%rsi +add $64,%rdx +add $64,%rdi +add $1,%eax +cmp $16,%eax +jb _looptop2 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c new file mode 100644 index 000000000..25d36828a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c @@ -0,0 +1,1138 @@ +#include +#include +#include +#include "align.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" +#include "symmetric.h" +#include "fips202x4.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. Assumes input +* coefficients to be at most 2^31 - 2^22 - 1 in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i off = _mm256_set1_epi32(1<<22); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_add_epi32(f,off); + g = _mm256_srai_epi32(g,23); + g = _mm256_mullo_epi32(g,q); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_addq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i zero = _mm256_setzero_si256(); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_blendv_epi32(zero,q,f); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + __m256i f; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_slli_epi32(f,D); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by up to +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +void poly_nttunpack(poly *a) { + DBENCH_START(); + + nttunpack_avx(a->vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + DBENCH_START(); + + pointwise_avx(c->vec, a->vec, b->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod^+ Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + power2round_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod^+ Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except if c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + decompose_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint array. The coefficients of which are the +* indices of the coefficients of the input polynomial +* whose low bits overflow into the high bits. +* +* Arguments: - uint8_t *h: pointer to output hint array (preallocated of length N) +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of hints, i.e. length of hint array. +**************************************************/ +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1) +{ + unsigned int r; + DBENCH_START(); + + r = make_hint_avx(hint, a0->vec, a1->vec); + + DBENCH_STOP(*tround); + return r; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) +{ + DBENCH_START(); + + use_hint_avx(b->vec, a->vec, h->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input polynomial to be reduced by poly_reduce(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int r; + __m256i f,t; + const __m256i bound = _mm256_set1_epi32(B-1); + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + t = _mm256_setzero_si256(); + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_abs_epi32(f); + f = _mm256_cmpgt_epi32(f,bound); + t = _mm256_or_si256(t,f); + } + + r = 1 - _mm256_testz_si256(t,t); + DBENCH_STOP(*tsample); + return r; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_preinit(poly *a, stream128_state *state) +{ + unsigned int ctr; + /* rej_uniform_avx reads up to 8 additional bytes */ + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf; + + stream128_squeezeblocks(buf.coeffs, REJ_UNIFORM_NBLOCKS, state); + ctr = rej_uniform_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + /* length of buf is always divisible by 3; hence, no bytes left */ + stream128_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM128_BLOCKBYTES); + } +} + +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + stream128_state state; + stream128_init(&state, seed, nonce); + poly_uniform_preinit(a, &state); + stream128_release(&state); +} + +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[32], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; + shake128x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec,f); + _mm256_store_si256(buf[1].vec,f); + _mm256_store_si256(buf[2].vec,f); + _mm256_store_si256(buf[3].vec,f); + + buf[0].coeffs[SEEDBYTES+0] = nonce0; + buf[0].coeffs[SEEDBYTES+1] = nonce0 >> 8; + buf[1].coeffs[SEEDBYTES+0] = nonce1; + buf[1].coeffs[SEEDBYTES+1] = nonce1 >> 8; + buf[2].coeffs[SEEDBYTES+0] = nonce2; + buf[2].coeffs[SEEDBYTES+1] = nonce2 >> 8; + buf[3].coeffs[SEEDBYTES+0] = nonce3; + buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling using the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_eta_preinit(poly *a, stream256_state *state) +{ + unsigned int ctr; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf; + + stream256_squeezeblocks(buf.coeffs, REJ_UNIFORM_ETA_NBLOCKS, state); + ctr = rej_eta_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + stream256_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM256_BLOCKBYTES); + } +} + +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_eta_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; + + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); + + ctr0 = rej_eta_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_eta_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_eta_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_eta_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_eta(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE256_RATE); + ctr1 += rej_eta(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE256_RATE); + ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); + ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); + } + shake256x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state) +{ + /* polyz_unpack reads 14 additional bytes */ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf; + stream256_squeezeblocks(buf.coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, state); + polyz_unpack(a, buf.coeffs); +} + +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_gamma1_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; + shake256x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + polyz_unpack(a0, buf[0].coeffs); + polyz_unpack(a1, buf[1].coeffs); + polyz_unpack(a2, buf[2].coeffs); + polyz_unpack(a3, buf[3].coeffs); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + ALIGNED_UINT8(SHAKE256_RATE) buf; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); + + memcpy(&signs, buf.coeffs, 8); + pos = 8; + + memset(c->vec, 0, sizeof(poly)); + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf.coeffs, 1, &state); + pos = 0; + } + + b = buf.coeffs[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly * restrict r, const uint8_t a[POLYETA_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are positive standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly * restrict r, const uint8_t a[POLYT1_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly * restrict r, const uint8_t a[POLYT0_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +#if GAMMA1 == (1 << 17) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1, 9, 8, 7,-1, 7, 6, 5,-1, 5, 4, 3,-1, 3, 2, 1, + -1, 8, 7, 6,-1, 6, 5, 4,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(6,4,2,0,6,4,2,0); + const __m256i mask = _mm256_set1_epi32(0x3FFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[18*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA1 == (1 << 19) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1,11,10, 9,-1, 9, 8, 7,-1, 6, 5, 4,-1, 4, 3, 2, + -1, 9, 8, 7,-1, 7, 6, 5,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set1_epi64x((uint64_t)4 << 32); + const __m256i mask = _mm256_set1_epi32(0xFFFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[20*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} +#endif + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +#if GAMMA2 == (Q-1)/88 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0,f1,f2,f3; + const __m256i shift1 = _mm256_set1_epi16((64 << 8) + 1); + const __m256i shift2 = _mm256_set1_epi32((4096 << 16) + 1); + const __m256i shufdidx1 = _mm256_set_epi32(7,3,6,2,5,1,4,0); + const __m256i shufdidx2 = _mm256_set_epi32(-1,-1,6,5,4,2,1,0); + const __m256i shufbidx = _mm256_set_epi8(-1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0, + -1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/32; i++) { + f0 = _mm256_load_si256(&a->vec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift1); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx2); + _mm256_storeu_si256((__m256i *)&r[24*i],f0); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA2 == (Q-1)/32 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0, f1, f2, f3, f4, f5, f6, f7; + const __m256i shift = _mm256_set1_epi16((16 << 8) + 1); + const __m256i shufbidx = _mm256_set_epi8(15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0, + 15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/64; ++i) { + f0 = _mm256_load_si256(&a->vec[8*i+0]); + f1 = _mm256_load_si256(&a->vec[8*i+1]); + f2 = _mm256_load_si256(&a->vec[8*i+2]); + f3 = _mm256_load_si256(&a->vec[8*i+3]); + f4 = _mm256_load_si256(&a->vec[8*i+4]); + f5 = _mm256_load_si256(&a->vec[8*i+5]); + f6 = _mm256_load_si256(&a->vec[8*i+6]); + f7 = _mm256_load_si256(&a->vec[8*i+7]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f2 = _mm256_packus_epi32(f4,f5); + f3 = _mm256_packus_epi32(f6,f7); + f0 = _mm256_packus_epi16(f0,f1); + f1 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift); + f1 = _mm256_maddubs_epi16(f1,shift); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_permute4x64_epi64(f0,0xD8); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + _mm256_storeu_si256((__m256i *)&r[32*i], f0); + } + + DBENCH_STOP(*tpack); +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.h new file mode 100644 index 000000000..7bcd8e5e0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.h @@ -0,0 +1,112 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" +#include "symmetric.h" + +typedef ALIGNED_INT32(N) poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_nttunpack DILITHIUM_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform_preinit DILITHIUM_NAMESPACE(poly_uniform_preinit) +void poly_uniform_preinit(poly *a, stream128_state *state); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce); +#define poly_uniform_eta_preinit DILITHIUM_NAMESPACE(poly_uniform_eta_preinit) +void poly_uniform_eta_preinit(poly *a, stream256_state *state); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_uniform_gamma1_preinit DILITHIUM_NAMESPACE(poly_uniform_gamma1_preinit) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define poly_uniform_4x DILITHIUM_NAMESPACE(poly_uniform_4x) +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[SEEDBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_eta_4x DILITHIUM_NAMESPACE(poly_uniform_eta_4x) +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_gamma1_4x DILITHIUM_NAMESPACE(poly_uniform_gamma1_4x) +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t a[POLYETA_PACKEDBYTES]); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t a[POLYT1_PACKEDBYTES]); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t a[POLYT0_PACKEDBYTES]); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c new file mode 100644 index 000000000..6e2302168 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c @@ -0,0 +1,588 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ + +#if K == 4 && L == 4 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], NULL, rho); + polyvec_matrix_expand_row1(&mat[1], NULL, rho); + polyvec_matrix_expand_row2(&mat[2], NULL, rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 256, 257, 258, 259); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 512, 513, 514, 515); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 768, 769, 770, 771); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +#elif K == 6 && L == 5 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvecl tmp; + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &tmp, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 4, 256, 257, 258); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 259, 260, 512, 513); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowb->vec[0], rho, 514, 515, 516, 768); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 769, 770, 771, 772); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1028, 1280, 1281, 1282); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 1283, 1284, 1536, 1537); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +#elif K == 8 && L == 7 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &mat[6], rho); + polyvec_matrix_expand_row6(&mat[6], &mat[7], rho); + polyvec_matrix_expand_row7(&mat[7], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 4, 5, 6, 256); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 257, 258, 259, 260); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 261, 262, 512, 513); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 514, 515, 516, 517); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 518, 768, 769, 770); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 771, 772, 773, 774); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 1028, 1029, 1030, 1280); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 1281, 1282, 1283, 1284); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 1285, 1286, 1536, 1537); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 1538, 1539, 1540, 1541); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1542, 1792, 1793, 1794); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row7(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 1795, 1796, 1797, 1798); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +#else +#error +#endif + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, const polyvecl *u, const polyvecl *v) { + pointwise_acc_avx(w->vec, u->vec->vec, v->vec->vec, qdata.vec); +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - uint8_t *hint: pointer to output hint array +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1) +{ + unsigned int i, n = 0; + + for(i = 0; i < K; ++i) + n += poly_make_hint(&hint[n], &v0->vec[i], &v1->vec[i]); + + return n; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.h new file mode 100644 index 000000000..1b6dc87ac --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.h @@ -0,0 +1,105 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_expand_row0 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row0) +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row1 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row1) +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row2 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row2) +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row3 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row3) +void polyvec_matrix_expand_row3(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row4 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row4) +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row5 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row5) +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row6 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row6) +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row7 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row7) +void polyvec_matrix_expand_row7(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c new file mode 100644 index 000000000..8b1dde444 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c @@ -0,0 +1,476 @@ +#include +#include +#include "params.h" +#include "rejsample.h" +#include "symmetric.h" + +const uint8_t idxlut[256][8] = { + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0, 0, 0}, + { 2, 0, 0, 0, 0, 0, 0, 0}, + { 0, 2, 0, 0, 0, 0, 0, 0}, + { 1, 2, 0, 0, 0, 0, 0, 0}, + { 0, 1, 2, 0, 0, 0, 0, 0}, + { 3, 0, 0, 0, 0, 0, 0, 0}, + { 0, 3, 0, 0, 0, 0, 0, 0}, + { 1, 3, 0, 0, 0, 0, 0, 0}, + { 0, 1, 3, 0, 0, 0, 0, 0}, + { 2, 3, 0, 0, 0, 0, 0, 0}, + { 0, 2, 3, 0, 0, 0, 0, 0}, + { 1, 2, 3, 0, 0, 0, 0, 0}, + { 0, 1, 2, 3, 0, 0, 0, 0}, + { 4, 0, 0, 0, 0, 0, 0, 0}, + { 0, 4, 0, 0, 0, 0, 0, 0}, + { 1, 4, 0, 0, 0, 0, 0, 0}, + { 0, 1, 4, 0, 0, 0, 0, 0}, + { 2, 4, 0, 0, 0, 0, 0, 0}, + { 0, 2, 4, 0, 0, 0, 0, 0}, + { 1, 2, 4, 0, 0, 0, 0, 0}, + { 0, 1, 2, 4, 0, 0, 0, 0}, + { 3, 4, 0, 0, 0, 0, 0, 0}, + { 0, 3, 4, 0, 0, 0, 0, 0}, + { 1, 3, 4, 0, 0, 0, 0, 0}, + { 0, 1, 3, 4, 0, 0, 0, 0}, + { 2, 3, 4, 0, 0, 0, 0, 0}, + { 0, 2, 3, 4, 0, 0, 0, 0}, + { 1, 2, 3, 4, 0, 0, 0, 0}, + { 0, 1, 2, 3, 4, 0, 0, 0}, + { 5, 0, 0, 0, 0, 0, 0, 0}, + { 0, 5, 0, 0, 0, 0, 0, 0}, + { 1, 5, 0, 0, 0, 0, 0, 0}, + { 0, 1, 5, 0, 0, 0, 0, 0}, + { 2, 5, 0, 0, 0, 0, 0, 0}, + { 0, 2, 5, 0, 0, 0, 0, 0}, + { 1, 2, 5, 0, 0, 0, 0, 0}, + { 0, 1, 2, 5, 0, 0, 0, 0}, + { 3, 5, 0, 0, 0, 0, 0, 0}, + { 0, 3, 5, 0, 0, 0, 0, 0}, + { 1, 3, 5, 0, 0, 0, 0, 0}, + { 0, 1, 3, 5, 0, 0, 0, 0}, + { 2, 3, 5, 0, 0, 0, 0, 0}, + { 0, 2, 3, 5, 0, 0, 0, 0}, + { 1, 2, 3, 5, 0, 0, 0, 0}, + { 0, 1, 2, 3, 5, 0, 0, 0}, + { 4, 5, 0, 0, 0, 0, 0, 0}, + { 0, 4, 5, 0, 0, 0, 0, 0}, + { 1, 4, 5, 0, 0, 0, 0, 0}, + { 0, 1, 4, 5, 0, 0, 0, 0}, + { 2, 4, 5, 0, 0, 0, 0, 0}, + { 0, 2, 4, 5, 0, 0, 0, 0}, + { 1, 2, 4, 5, 0, 0, 0, 0}, + { 0, 1, 2, 4, 5, 0, 0, 0}, + { 3, 4, 5, 0, 0, 0, 0, 0}, + { 0, 3, 4, 5, 0, 0, 0, 0}, + { 1, 3, 4, 5, 0, 0, 0, 0}, + { 0, 1, 3, 4, 5, 0, 0, 0}, + { 2, 3, 4, 5, 0, 0, 0, 0}, + { 0, 2, 3, 4, 5, 0, 0, 0}, + { 1, 2, 3, 4, 5, 0, 0, 0}, + { 0, 1, 2, 3, 4, 5, 0, 0}, + { 6, 0, 0, 0, 0, 0, 0, 0}, + { 0, 6, 0, 0, 0, 0, 0, 0}, + { 1, 6, 0, 0, 0, 0, 0, 0}, + { 0, 1, 6, 0, 0, 0, 0, 0}, + { 2, 6, 0, 0, 0, 0, 0, 0}, + { 0, 2, 6, 0, 0, 0, 0, 0}, + { 1, 2, 6, 0, 0, 0, 0, 0}, + { 0, 1, 2, 6, 0, 0, 0, 0}, + { 3, 6, 0, 0, 0, 0, 0, 0}, + { 0, 3, 6, 0, 0, 0, 0, 0}, + { 1, 3, 6, 0, 0, 0, 0, 0}, + { 0, 1, 3, 6, 0, 0, 0, 0}, + { 2, 3, 6, 0, 0, 0, 0, 0}, + { 0, 2, 3, 6, 0, 0, 0, 0}, + { 1, 2, 3, 6, 0, 0, 0, 0}, + { 0, 1, 2, 3, 6, 0, 0, 0}, + { 4, 6, 0, 0, 0, 0, 0, 0}, + { 0, 4, 6, 0, 0, 0, 0, 0}, + { 1, 4, 6, 0, 0, 0, 0, 0}, + { 0, 1, 4, 6, 0, 0, 0, 0}, + { 2, 4, 6, 0, 0, 0, 0, 0}, + { 0, 2, 4, 6, 0, 0, 0, 0}, + { 1, 2, 4, 6, 0, 0, 0, 0}, + { 0, 1, 2, 4, 6, 0, 0, 0}, + { 3, 4, 6, 0, 0, 0, 0, 0}, + { 0, 3, 4, 6, 0, 0, 0, 0}, + { 1, 3, 4, 6, 0, 0, 0, 0}, + { 0, 1, 3, 4, 6, 0, 0, 0}, + { 2, 3, 4, 6, 0, 0, 0, 0}, + { 0, 2, 3, 4, 6, 0, 0, 0}, + { 1, 2, 3, 4, 6, 0, 0, 0}, + { 0, 1, 2, 3, 4, 6, 0, 0}, + { 5, 6, 0, 0, 0, 0, 0, 0}, + { 0, 5, 6, 0, 0, 0, 0, 0}, + { 1, 5, 6, 0, 0, 0, 0, 0}, + { 0, 1, 5, 6, 0, 0, 0, 0}, + { 2, 5, 6, 0, 0, 0, 0, 0}, + { 0, 2, 5, 6, 0, 0, 0, 0}, + { 1, 2, 5, 6, 0, 0, 0, 0}, + { 0, 1, 2, 5, 6, 0, 0, 0}, + { 3, 5, 6, 0, 0, 0, 0, 0}, + { 0, 3, 5, 6, 0, 0, 0, 0}, + { 1, 3, 5, 6, 0, 0, 0, 0}, + { 0, 1, 3, 5, 6, 0, 0, 0}, + { 2, 3, 5, 6, 0, 0, 0, 0}, + { 0, 2, 3, 5, 6, 0, 0, 0}, + { 1, 2, 3, 5, 6, 0, 0, 0}, + { 0, 1, 2, 3, 5, 6, 0, 0}, + { 4, 5, 6, 0, 0, 0, 0, 0}, + { 0, 4, 5, 6, 0, 0, 0, 0}, + { 1, 4, 5, 6, 0, 0, 0, 0}, + { 0, 1, 4, 5, 6, 0, 0, 0}, + { 2, 4, 5, 6, 0, 0, 0, 0}, + { 0, 2, 4, 5, 6, 0, 0, 0}, + { 1, 2, 4, 5, 6, 0, 0, 0}, + { 0, 1, 2, 4, 5, 6, 0, 0}, + { 3, 4, 5, 6, 0, 0, 0, 0}, + { 0, 3, 4, 5, 6, 0, 0, 0}, + { 1, 3, 4, 5, 6, 0, 0, 0}, + { 0, 1, 3, 4, 5, 6, 0, 0}, + { 2, 3, 4, 5, 6, 0, 0, 0}, + { 0, 2, 3, 4, 5, 6, 0, 0}, + { 1, 2, 3, 4, 5, 6, 0, 0}, + { 0, 1, 2, 3, 4, 5, 6, 0}, + { 7, 0, 0, 0, 0, 0, 0, 0}, + { 0, 7, 0, 0, 0, 0, 0, 0}, + { 1, 7, 0, 0, 0, 0, 0, 0}, + { 0, 1, 7, 0, 0, 0, 0, 0}, + { 2, 7, 0, 0, 0, 0, 0, 0}, + { 0, 2, 7, 0, 0, 0, 0, 0}, + { 1, 2, 7, 0, 0, 0, 0, 0}, + { 0, 1, 2, 7, 0, 0, 0, 0}, + { 3, 7, 0, 0, 0, 0, 0, 0}, + { 0, 3, 7, 0, 0, 0, 0, 0}, + { 1, 3, 7, 0, 0, 0, 0, 0}, + { 0, 1, 3, 7, 0, 0, 0, 0}, + { 2, 3, 7, 0, 0, 0, 0, 0}, + { 0, 2, 3, 7, 0, 0, 0, 0}, + { 1, 2, 3, 7, 0, 0, 0, 0}, + { 0, 1, 2, 3, 7, 0, 0, 0}, + { 4, 7, 0, 0, 0, 0, 0, 0}, + { 0, 4, 7, 0, 0, 0, 0, 0}, + { 1, 4, 7, 0, 0, 0, 0, 0}, + { 0, 1, 4, 7, 0, 0, 0, 0}, + { 2, 4, 7, 0, 0, 0, 0, 0}, + { 0, 2, 4, 7, 0, 0, 0, 0}, + { 1, 2, 4, 7, 0, 0, 0, 0}, + { 0, 1, 2, 4, 7, 0, 0, 0}, + { 3, 4, 7, 0, 0, 0, 0, 0}, + { 0, 3, 4, 7, 0, 0, 0, 0}, + { 1, 3, 4, 7, 0, 0, 0, 0}, + { 0, 1, 3, 4, 7, 0, 0, 0}, + { 2, 3, 4, 7, 0, 0, 0, 0}, + { 0, 2, 3, 4, 7, 0, 0, 0}, + { 1, 2, 3, 4, 7, 0, 0, 0}, + { 0, 1, 2, 3, 4, 7, 0, 0}, + { 5, 7, 0, 0, 0, 0, 0, 0}, + { 0, 5, 7, 0, 0, 0, 0, 0}, + { 1, 5, 7, 0, 0, 0, 0, 0}, + { 0, 1, 5, 7, 0, 0, 0, 0}, + { 2, 5, 7, 0, 0, 0, 0, 0}, + { 0, 2, 5, 7, 0, 0, 0, 0}, + { 1, 2, 5, 7, 0, 0, 0, 0}, + { 0, 1, 2, 5, 7, 0, 0, 0}, + { 3, 5, 7, 0, 0, 0, 0, 0}, + { 0, 3, 5, 7, 0, 0, 0, 0}, + { 1, 3, 5, 7, 0, 0, 0, 0}, + { 0, 1, 3, 5, 7, 0, 0, 0}, + { 2, 3, 5, 7, 0, 0, 0, 0}, + { 0, 2, 3, 5, 7, 0, 0, 0}, + { 1, 2, 3, 5, 7, 0, 0, 0}, + { 0, 1, 2, 3, 5, 7, 0, 0}, + { 4, 5, 7, 0, 0, 0, 0, 0}, + { 0, 4, 5, 7, 0, 0, 0, 0}, + { 1, 4, 5, 7, 0, 0, 0, 0}, + { 0, 1, 4, 5, 7, 0, 0, 0}, + { 2, 4, 5, 7, 0, 0, 0, 0}, + { 0, 2, 4, 5, 7, 0, 0, 0}, + { 1, 2, 4, 5, 7, 0, 0, 0}, + { 0, 1, 2, 4, 5, 7, 0, 0}, + { 3, 4, 5, 7, 0, 0, 0, 0}, + { 0, 3, 4, 5, 7, 0, 0, 0}, + { 1, 3, 4, 5, 7, 0, 0, 0}, + { 0, 1, 3, 4, 5, 7, 0, 0}, + { 2, 3, 4, 5, 7, 0, 0, 0}, + { 0, 2, 3, 4, 5, 7, 0, 0}, + { 1, 2, 3, 4, 5, 7, 0, 0}, + { 0, 1, 2, 3, 4, 5, 7, 0}, + { 6, 7, 0, 0, 0, 0, 0, 0}, + { 0, 6, 7, 0, 0, 0, 0, 0}, + { 1, 6, 7, 0, 0, 0, 0, 0}, + { 0, 1, 6, 7, 0, 0, 0, 0}, + { 2, 6, 7, 0, 0, 0, 0, 0}, + { 0, 2, 6, 7, 0, 0, 0, 0}, + { 1, 2, 6, 7, 0, 0, 0, 0}, + { 0, 1, 2, 6, 7, 0, 0, 0}, + { 3, 6, 7, 0, 0, 0, 0, 0}, + { 0, 3, 6, 7, 0, 0, 0, 0}, + { 1, 3, 6, 7, 0, 0, 0, 0}, + { 0, 1, 3, 6, 7, 0, 0, 0}, + { 2, 3, 6, 7, 0, 0, 0, 0}, + { 0, 2, 3, 6, 7, 0, 0, 0}, + { 1, 2, 3, 6, 7, 0, 0, 0}, + { 0, 1, 2, 3, 6, 7, 0, 0}, + { 4, 6, 7, 0, 0, 0, 0, 0}, + { 0, 4, 6, 7, 0, 0, 0, 0}, + { 1, 4, 6, 7, 0, 0, 0, 0}, + { 0, 1, 4, 6, 7, 0, 0, 0}, + { 2, 4, 6, 7, 0, 0, 0, 0}, + { 0, 2, 4, 6, 7, 0, 0, 0}, + { 1, 2, 4, 6, 7, 0, 0, 0}, + { 0, 1, 2, 4, 6, 7, 0, 0}, + { 3, 4, 6, 7, 0, 0, 0, 0}, + { 0, 3, 4, 6, 7, 0, 0, 0}, + { 1, 3, 4, 6, 7, 0, 0, 0}, + { 0, 1, 3, 4, 6, 7, 0, 0}, + { 2, 3, 4, 6, 7, 0, 0, 0}, + { 0, 2, 3, 4, 6, 7, 0, 0}, + { 1, 2, 3, 4, 6, 7, 0, 0}, + { 0, 1, 2, 3, 4, 6, 7, 0}, + { 5, 6, 7, 0, 0, 0, 0, 0}, + { 0, 5, 6, 7, 0, 0, 0, 0}, + { 1, 5, 6, 7, 0, 0, 0, 0}, + { 0, 1, 5, 6, 7, 0, 0, 0}, + { 2, 5, 6, 7, 0, 0, 0, 0}, + { 0, 2, 5, 6, 7, 0, 0, 0}, + { 1, 2, 5, 6, 7, 0, 0, 0}, + { 0, 1, 2, 5, 6, 7, 0, 0}, + { 3, 5, 6, 7, 0, 0, 0, 0}, + { 0, 3, 5, 6, 7, 0, 0, 0}, + { 1, 3, 5, 6, 7, 0, 0, 0}, + { 0, 1, 3, 5, 6, 7, 0, 0}, + { 2, 3, 5, 6, 7, 0, 0, 0}, + { 0, 2, 3, 5, 6, 7, 0, 0}, + { 1, 2, 3, 5, 6, 7, 0, 0}, + { 0, 1, 2, 3, 5, 6, 7, 0}, + { 4, 5, 6, 7, 0, 0, 0, 0}, + { 0, 4, 5, 6, 7, 0, 0, 0}, + { 1, 4, 5, 6, 7, 0, 0, 0}, + { 0, 1, 4, 5, 6, 7, 0, 0}, + { 2, 4, 5, 6, 7, 0, 0, 0}, + { 0, 2, 4, 5, 6, 7, 0, 0}, + { 1, 2, 4, 5, 6, 7, 0, 0}, + { 0, 1, 2, 4, 5, 6, 7, 0}, + { 3, 4, 5, 6, 7, 0, 0, 0}, + { 0, 3, 4, 5, 6, 7, 0, 0}, + { 1, 3, 4, 5, 6, 7, 0, 0}, + { 0, 1, 3, 4, 5, 6, 7, 0}, + { 2, 3, 4, 5, 6, 7, 0, 0}, + { 0, 2, 3, 4, 5, 6, 7, 0}, + { 1, 2, 3, 4, 5, 6, 7, 0}, + { 0, 1, 2, 3, 4, 5, 6, 7} +}; + +unsigned int rej_uniform_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]) +{ + unsigned int ctr, pos; + uint32_t good; + __m256i d, tmp; + const __m256i bound = _mm256_set1_epi32(Q); + const __m256i mask = _mm256_set1_epi32(0x7FFFFF); + const __m256i idx8 = _mm256_set_epi8(-1,15,14,13,-1,12,11,10, + -1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6, + -1, 5, 4, 3,-1, 2, 1, 0); + + ctr = pos = 0; + while(pos <= REJ_UNIFORM_BUFLEN - 24) { + d = _mm256_loadu_si256((__m256i *)&buf[pos]); + d = _mm256_permute4x64_epi64(d, 0x94); + d = _mm256_shuffle_epi8(d, idx8); + d = _mm256_and_si256(d, mask); + pos += 24; + + tmp = _mm256_sub_epi32(d, bound); + good = _mm256_movemask_ps((__m256)tmp); + tmp = _mm256_cvtepu8_epi32(_mm_loadl_epi64((__m128i *)&idxlut[good])); + d = _mm256_permutevar8x32_epi32(d, tmp); + + _mm256_storeu_si256((__m256i *)&r[ctr], d); + ctr += _mm_popcnt_u32(good); + + if(ctr > N - 8) break; + } + + uint32_t t; + while(ctr < N && pos <= REJ_UNIFORM_BUFLEN - 3) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + r[ctr++] = t; + } + + return ctr; +} + +#if ETA == 2 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1, f2; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(ETA); + const __m256i bound = mask; + const __m256i v = _mm256_set1_epi32(-6560); + const __m256i p = _mm256_set1_epi32(5); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + r[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < N) { + t1 = t1 - (205*t1 >> 10)*5; + r[ctr++] = 2 - t1; + } + } + + return ctr; +} + +#elif ETA == 4 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(4); + const __m256i bound = _mm256_set1_epi8(9); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 9) + r[ctr++] = 4 - t0; + if(t1 < 9 && ctr < N) + r[ctr++] = 4 - t1; + } + + return ctr; +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.h new file mode 100644 index 000000000..61f3f357a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.h @@ -0,0 +1,28 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_NBLOCKS ((768+STREAM128_BLOCKBYTES-1)/STREAM128_BLOCKBYTES) +#define REJ_UNIFORM_BUFLEN (REJ_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES) + +#if ETA == 2 +#define REJ_UNIFORM_ETA_NBLOCKS ((136+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define REJ_UNIFORM_ETA_NBLOCKS ((227+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#endif +#define REJ_UNIFORM_ETA_BUFLEN (REJ_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES) + +#define idxlut DILITHIUM_NAMESPACE(idxlut) +extern const uint8_t idxlut[256][8]; + +#define rej_uniform_avx DILITHIUM_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]); + +#define rej_eta_avx DILITHIUM_NAMESPACE(rej_eta_avx) +unsigned int rej_eta_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]); + +#endif + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c new file mode 100644 index 000000000..3ada65677 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include "params.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: power2round +* +* Description: For finite field elements a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be positive standard representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high bits +* - __m256i *a0: output array of length N/8 with low bits a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i mask = _mm256_set1_epi32(-(1 << D)); + const __m256i half = _mm256_set1_epi32((1 << (D-1)) - 1); + + for(i = 0; i < N/8; ++i) { + f = _mm256_load_si256(&a[i]); + f1 = _mm256_add_epi32(f,half); + f0 = _mm256_and_si256(f1,mask); + f1 = _mm256_srli_epi32(f1,D); + f0 = _mm256_sub_epi32(f,f0); + _mm256_store_si256(&a1[i],f1); + _mm256_store_si256(&a0[i],f0); + } +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low parts a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod Q - Q < 0. Assumes a to be positive standard +* representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high parts +* - __m256i *a0: output array of length N/8 with low parts a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +#if GAMMA2 == (Q-1)/32 +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i hq = _mm256_srli_epi32(q,1); + const __m256i v = _mm256_set1_epi32(1025); + const __m256i alpha = _mm256_set1_epi32(2*GAMMA2); + const __m256i off = _mm256_set1_epi32(127); + const __m256i shift = _mm256_set1_epi32(512); + const __m256i mask = _mm256_set1_epi32(15); + + for(i=0;i +#include +#include "params.h" + +#define power2round_avx DILITHIUM_NAMESPACE(power2round_avx) +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define decompose_avx DILITHIUM_NAMESPACE(decompose_avx) +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define make_hint_avx DILITHIUM_NAMESPACE(make_hint_avx) +unsigned int make_hint_avx(uint8_t hint[N], const __m256i *a0, const __m256i *a1); +#define use_hint_avx DILITHIUM_NAMESPACE(use_hint_avx) +void use_hint_avx(__m256i *b, const __m256i *a, const __m256i *hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S new file mode 100644 index 000000000..133e05132 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S @@ -0,0 +1,52 @@ +#include "consts.h" +.include "shuffle.inc" + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +#store +vmovdqa %ymm9,(%rdi) +vmovdqa %ymm8,32(%rdi) +vmovdqa %ymm7,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm5,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm3,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.inc b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c new file mode 100644 index 000000000..a39f8515c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c @@ -0,0 +1,445 @@ +#include +#include +#include "align.h" +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +static inline void polyvec_matrix_expand_row(polyvecl **row, polyvecl buf[2], const uint8_t rho[SEEDBYTES], unsigned int i) { + switch(i) { + case 0: + polyvec_matrix_expand_row0(buf, buf + 1, rho); + *row = buf; + break; + case 1: + polyvec_matrix_expand_row1(buf + 1, buf, rho); + *row = buf + 1; + break; + case 2: + polyvec_matrix_expand_row2(buf, buf + 1, rho); + *row = buf; + break; + case 3: + polyvec_matrix_expand_row3(buf + 1, buf, rho); + *row = buf + 1; + break; +#if K > 4 + case 4: + polyvec_matrix_expand_row4(buf, buf + 1, rho); + *row = buf; + break; + case 5: + polyvec_matrix_expand_row5(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif +#if K > 6 + case 6: + polyvec_matrix_expand_row6(buf, buf + 1, rho); + *row = buf; + break; + case 7: + polyvec_matrix_expand_row7(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif + } +} + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl rowbuf[2]; + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#if K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, rho, i); + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 2*SEEDBYTES + TRBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + unsigned int i, n, pos; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *rnd, *mu, *rhoprime; + uint8_t hintbuf[N]; + uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + uint64_t nonce = 0; + polyvecl mat[K], s1, z; + polyveck t0, s2, w1; + poly c, tmp; + union { + polyvecl y; + polyveck w0; + } tmpv; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Compute CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + memset(rnd, 0, RNDBYTES); +#endif + shake256(rhoprime, CRHBYTES, key, SEEDBYTES + RNDBYTES + CRHBYTES); + + /* Expand matrix and transform vectors */ + polyvec_matrix_expand(mat, rho); + polyvecl_ntt(&s1); + polyveck_ntt(&s2); + polyveck_ntt(&t0); + +rej: + /* Sample intermediate vector y */ +#if L == 4 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + nonce += 4; +#elif L == 5 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1(&z.vec[4], rhoprime, nonce + 4); + nonce += 5; +#elif L == 7 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1_4x(&z.vec[4], &z.vec[5], &z.vec[6], &tmp, + rhoprime, nonce + 4, nonce + 5, nonce + 6, 0); + nonce += 7; +#else +#error +#endif + + /* Matrix-vector product */ + tmpv.y = z; + polyvecl_ntt(&tmpv.y); + polyvec_matrix_pointwise_montgomery(&w1, mat, &tmpv.y); + polyveck_invntt_tomont(&w1); + + /* Decompose w and call the random oracle */ + polyveck_caddq(&w1); + polyveck_decompose(&w1, &tmpv.w0, &w1); + polyveck_pack_w1(sig, &w1); + + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Compute z, reject if it reveals secret */ + for(i = 0; i < L; i++) { + poly_pointwise_montgomery(&tmp, &c, &s1.vec[i]); + poly_invntt_tomont(&tmp); + poly_add(&z.vec[i], &z.vec[i], &tmp); + poly_reduce(&z.vec[i]); + if(poly_chknorm(&z.vec[i], GAMMA1 - BETA)) + goto rej; + } + + /* Zero hint vector in signature */ + pos = 0; + memset(hint, 0, OMEGA); + + for(i = 0; i < K; i++) { + /* Check that subtracting cs2 does not change high bits of w and low bits + * do not reveal secret information */ + poly_pointwise_montgomery(&tmp, &c, &s2.vec[i]); + poly_invntt_tomont(&tmp); + poly_sub(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + poly_reduce(&tmpv.w0.vec[i]); + if(poly_chknorm(&tmpv.w0.vec[i], GAMMA2 - BETA)) + goto rej; + + /* Compute hints */ + poly_pointwise_montgomery(&tmp, &c, &t0.vec[i]); + poly_invntt_tomont(&tmp); + poly_reduce(&tmp); + if(poly_chknorm(&tmp, GAMMA2)) + goto rej; + + poly_add(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + n = poly_make_hint(hintbuf, &tmpv.w0.vec[i], &w1.vec[i]); + if(pos + n > OMEGA) + goto rej; + + /* Store hints in signature */ + memcpy(&hint[pos], hintbuf, n); + hint[OMEGA + i] = pos = pos + n; + } + + shake256_inc_ctx_release(&state); + /* Pack z into signature */ + for(i = 0; i < L; i++) + polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); + + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk) { + unsigned int i, j, pos = 0; + /* polyw1_pack writes additional 14 bytes */ + ALIGNED_UINT8(K*POLYW1_PACKEDBYTES+14) buf; + uint8_t mu[CRHBYTES]; + const uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + polyvecl rowbuf[2]; + polyvecl *row = rowbuf; + polyvecl z; + poly c, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + shake256_inc_ctx_release(&state); + + /* Expand challenge */ + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Unpack z; shortness follows from unpacking */ + for(i = 0; i < L; i++) { + polyz_unpack(&z.vec[i], sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES); + poly_ntt(&z.vec[i]); + } + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, pk, i); + + /* Compute i-th row of Az - c2^Dt1 */ + polyvecl_pointwise_acc_montgomery(&w1, row, &z); + + polyt1_unpack(&h, pk + SEEDBYTES + i*POLYT1_PACKEDBYTES); + poly_shiftl(&h); + poly_ntt(&h); + poly_pointwise_montgomery(&h, &c, &h); + + poly_sub(&w1, &w1, &h); + poly_reduce(&w1); + poly_invntt_tomont(&w1); + + /* Get hint polynomial and reconstruct w1 */ + memset(h.vec, 0, sizeof(poly)); + if(hint[OMEGA + i] < pos || hint[OMEGA + i] > OMEGA) + return -1; + + for(j = pos; j < hint[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > pos && hint[j] <= hint[j-1]) return -1; + h.coeffs[hint[j]] = 1; + } + pos = hint[OMEGA + i]; + + poly_caddq(&w1); + poly_use_hint(&w1, &w1, &h); + polyw1_pack(buf.coeffs + i*POLYW1_PACKEDBYTES, &w1); + } + + /* Extra indices are zero for strong unforgeability */ + for(j = pos; j < OMEGA; ++j) + if(hint[j]) return -1; + + /* Call random oracle and verify challenge */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(buf.coeffs[i] != sig[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, const uint8_t *pk) { + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric.h new file mode 100644 index 000000000..fa49963ae --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric.h @@ -0,0 +1,28 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/api.h new file mode 100644 index 000000000..78caa5c72 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_ref_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_ref_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_ref_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_ref_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_ref_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_ref_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_ref_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_ref_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_ref_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/config.h new file mode 100644 index 000000000..eddf13f5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_ref_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_ref_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_ref_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c new file mode 100644 index 000000000..5ea8b530e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c @@ -0,0 +1,98 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +static const int32_t zetas[N] = { + 0, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, + 2725464, 1024112, -1079900, 3585928, -549488, -1119584, 2619752, -2108549, + -2118186, -3859737, -1399561, -3277672, 1757237, -19422, 4010497, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -1528703, -3677745, -3041255, -1452451, 3475950, 2176455, -1585221, + -1257611, 1939314, -4083598, -1000202, -3190144, -3157330, -3632928, 126922, + 3412210, -983419, 2147896, 2715295, -2967645, -3693493, -411027, -2477047, + -671102, -1228525, -22981, -1308169, -381987, 1349076, 1852771, -1430430, + -3343383, 264944, 508951, 3097992, 44288, -1100098, 904516, 3958618, + -3724342, -8578, 1653064, -3249728, 2389356, -210977, 759969, -1316856, + 189548, -3553272, 3159746, -1851402, -2409325, -177440, 1315589, 1341330, + 1285669, -1584928, -812732, -1439742, -3019102, -3881060, -3628969, 3839961, + 2091667, 3407706, 2316500, 3817976, -3342478, 2244091, -2446433, -3562462, + 266997, 2434439, -1235728, 3513181, -3520352, -3759364, -1197226, -3193378, + 900702, 1859098, 909542, 819034, 495491, -1613174, -43260, -522500, + -655327, -3122442, 2031748, 3207046, -3556995, -525098, -768622, -3595838, + 342297, 286988, -2437823, 4108315, 3437287, -3342277, 1735879, 203044, + 2842341, 2691481, -2590150, 1265009, 4055324, 1247620, 2486353, 1595974, + -3767016, 1250494, 2635921, -3548272, -2994039, 1869119, 1903435, -1050970, + -1333058, 1237275, -3318210, -1430225, -451100, 1312455, 3306115, -1962642, + -1279661, 1917081, -2546312, -1374803, 1500165, 777191, 2235880, 3406031, + -542412, -2831860, -1671176, -1846953, -2584293, -3724270, 594136, -3776993, + -2013608, 2432395, 2454455, -164721, 1957272, 3369112, 185531, -1207385, + -3183426, 162844, 1616392, 3014001, 810149, 1652634, -3694233, -1799107, + -3038916, 3523897, 3866901, 269760, 2213111, -975884, 1717735, 472078, + -426683, 1723600, -1803090, 1910376, -1667432, -1104333, -260646, -3833893, + -2939036, -2235985, -420899, -2286327, 183443, -976891, 1612842, -3545687, + -554416, 3919660, -48306, -1362209, 3937738, 1400424, -846154, 1976782 +}; + +/************************************************* +* Name: ntt +* +* Description: Forward NTT, in-place. No modular reduction is performed after +* additions or subtractions. Output vector is in bitreversed order. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void ntt(int32_t a[N]) { + unsigned int len, start, j, k; + int32_t zeta, t; + + k = 0; + for(len = 128; len > 0; len >>= 1) { + for(start = 0; start < N; start = j + len) { + zeta = zetas[++k]; + for(j = start; j < start + len; ++j) { + t = montgomery_reduce((int64_t)zeta * a[j + len]); + a[j + len] = a[j] - t; + a[j] = a[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inverse NTT and multiplication by Montgomery factor 2^32. +* In-place. No modular reductions after additions or +* subtractions; input coefficients need to be smaller than +* Q in absolute value. Output coefficient are smaller than Q in +* absolute value. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void invntt_tomont(int32_t a[N]) { + unsigned int start, len, j, k; + int32_t t, zeta; + const int32_t f = 41978; // mont^2/256 + + k = 256; + for(len = 1; len < N; len <<= 1) { + for(start = 0; start < N; start = j + len) { + zeta = -zetas[--k]; + for(j = start; j < start + len; ++j) { + t = a[j]; + a[j] = t + a[j + len]; + a[j + len] = t - a[j + len]; + a[j + len] = montgomery_reduce((int64_t)zeta * a[j + len]); + } + } + } + + for(j = 0; j < N; ++j) { + a[j] = montgomery_reduce((int64_t)f * a[j]); + } +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.h new file mode 100644 index 000000000..731132d5c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.h @@ -0,0 +1,13 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define ntt DILITHIUM_NAMESPACE(ntt) +void ntt(int32_t a[N]); + +#define invntt_tomont DILITHIUM_NAMESPACE(invntt_tomont) +void invntt_tomont(int32_t a[N]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c new file mode 100644 index 000000000..d44063fee --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c @@ -0,0 +1,911 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "rounding.h" +#include "symmetric.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = reduce32(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_caddq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = caddq(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] + b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] - b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] <<= D; + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_tomont(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = montgomery_reduce((int64_t)a->coeffs[i] * b->coeffs[i]); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = power2round(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = decompose(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint polynomial. The coefficients of which indicate +* whether the low bits of the corresponding coefficient of +* the input polynomial overflow into the high bits. +* +* Arguments: - poly *h: pointer to output hint polynomial +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of 1 bits. +**************************************************/ +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1) { + unsigned int i, s = 0; + DBENCH_START(); + + for(i = 0; i < N; ++i) { + h->coeffs[i] = make_hint(a0->coeffs[i], a1->coeffs[i]); + s += h->coeffs[i]; + } + + DBENCH_STOP(*tround); + return s; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + b->coeffs[i] = use_hint(a->coeffs[i], h->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input coefficients were reduced by reduce32(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int32_t t; + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + /* It is ok to leak which coefficient violates the bound since + the probability for each coefficient is independent of secret + data but we must not leak the sign of the centralized representative. */ + for(i = 0; i < N; ++i) { + /* Absolute value */ + t = a->coeffs[i] >> 31; + t = a->coeffs[i] - (t & 2*a->coeffs[i]); + + if(t >= B) { + DBENCH_STOP(*tsample); + return 1; + } + } + + DBENCH_STOP(*tsample); + return 0; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#define POLY_UNIFORM_NBLOCKS ((768 + STREAM128_BLOCKBYTES - 1)/STREAM128_BLOCKBYTES) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce) +{ + unsigned int i, ctr, off; + unsigned int buflen = POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES + 2]; + stream128_state state; + + stream128_init(&state, seed, nonce); + stream128_squeezeblocks(buf, POLY_UNIFORM_NBLOCKS, &state); + + ctr = rej_uniform(a->coeffs, N, buf, buflen); + + while(ctr < N) { + off = buflen % 3; + for(i = 0; i < off; ++i) + buf[i] = buf[buflen - off + i]; + + stream128_squeezeblocks(buf + off, 1, &state); + buflen = STREAM128_BLOCKBYTES + off; + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); + } + stream128_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling on the +* output stream from SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#if ETA == 2 +#define POLY_UNIFORM_ETA_NBLOCKS ((136 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define POLY_UNIFORM_ETA_NBLOCKS ((227 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#endif +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + unsigned int ctr; + unsigned int buflen = POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_ETA_NBLOCKS, &state); + + ctr = rej_eta(a->coeffs, N, buf, buflen); + + while(ctr < N) { + stream256_squeezeblocks(buf, 1, &state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); + } + stream256_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1m1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + uint8_t buf[POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + stream256_release(&state); + polyz_unpack(a, buf); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + uint8_t buf[SHAKE256_RATE]; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_squeezeblocks(buf, 1, &state); + + signs = 0; + for(i = 0; i < 8; ++i) + signs |= (uint64_t)buf[i] << 8*i; + pos = 8; + + for(i = 0; i < N; ++i) + c->coeffs[i] = 0; + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf, 1, &state); + pos = 0; + } + + b = buf[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyz_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = a[9*i+0]; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+1] << 8; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+2] << 16; + r->coeffs[4*i+0] &= 0x3FFFF; + + r->coeffs[4*i+1] = a[9*i+2] >> 2; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+3] << 6; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+4] << 14; + r->coeffs[4*i+1] &= 0x3FFFF; + + r->coeffs[4*i+2] = a[9*i+4] >> 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+5] << 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+6] << 12; + r->coeffs[4*i+2] &= 0x3FFFF; + + r->coeffs[4*i+3] = a[9*i+6] >> 6; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+7] << 2; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+8] << 10; + r->coeffs[4*i+3] &= 0x3FFFF; + + r->coeffs[4*i+0] = GAMMA1 - r->coeffs[4*i+0]; + r->coeffs[4*i+1] = GAMMA1 - r->coeffs[4*i+1]; + r->coeffs[4*i+2] = GAMMA1 - r->coeffs[4*i+2]; + r->coeffs[4*i+3] = GAMMA1 - r->coeffs[4*i+3]; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[5*i+0]; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+1] << 8; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+2] << 16; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+1] = a[5*i+2] >> 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyw1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA2 == (Q-1)/88 + for(i = 0; i < N/4; ++i) { + r[3*i+0] = a->coeffs[4*i+0]; + r[3*i+0] |= a->coeffs[4*i+1] << 6; + r[3*i+1] = a->coeffs[4*i+1] >> 2; + r[3*i+1] |= a->coeffs[4*i+2] << 4; + r[3*i+2] = a->coeffs[4*i+2] >> 4; + r[3*i+2] |= a->coeffs[4*i+3] << 2; + } +#elif GAMMA2 == (Q-1)/32 + for(i = 0; i < N/2; ++i) + r[i] = a->coeffs[2*i+0] | (a->coeffs[2*i+1] << 4); +#endif + + DBENCH_STOP(*tpack); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.h new file mode 100644 index 000000000..d2fd989b6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.h @@ -0,0 +1,79 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +typedef struct { + int32_t coeffs[N]; +} poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t *r, const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t *a); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t *r, const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t *a); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t *r, const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t *a); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t *r, const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c new file mode 100644 index 000000000..40032b656 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c @@ -0,0 +1,389 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + unsigned int i, j; + + for(i = 0; i < K; ++i) + for(j = 0; j < L; ++j) + poly_uniform(&mat[i].vec[j], rho, (i << 8) + j); +} + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v) +{ + unsigned int i; + poly t; + + poly_pointwise_montgomery(w, &u->vec[0], &v->vec[0]); + for(i = 1; i < L; ++i) { + poly_pointwise_montgomery(&t, &u->vec[i], &v->vec[i]); + poly_add(w, w, &t); + } +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - polyveck *h: pointer to output vector +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1) +{ + unsigned int i, s = 0; + + for(i = 0; i < K; ++i) + s += poly_make_hint(&h->vec[i], &v0->vec[i], &v1->vec[i]); + + return s; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.h new file mode 100644 index 000000000..615ac5299 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.h @@ -0,0 +1,93 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + + + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c new file mode 100644 index 000000000..75feff8bc --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c @@ -0,0 +1,69 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: For finite field element a with -2^{31}Q <= a <= Q*2^31, +* compute r \equiv a*2^{-32} (mod Q) such that -Q < r < Q. +* +* Arguments: - int64_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t montgomery_reduce(int64_t a) { + int32_t t; + + t = (int64_t)(int32_t)a*QINV; + t = (a - (int64_t)t*Q) >> 32; + return t; +} + +/************************************************* +* Name: reduce32 +* +* Description: For finite field element a with a <= 2^{31} - 2^{22} - 1, +* compute r \equiv a (mod Q) such that -6283009 <= r <= 6283007. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t reduce32(int32_t a) { + int32_t t; + + t = (a + (1 << 22)) >> 23; + t = a - t*Q; + return t; +} + +/************************************************* +* Name: caddq +* +* Description: Add Q if input coefficient is negative. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t caddq(int32_t a) { + a += (a >> 31) & Q; + return a; +} + +/************************************************* +* Name: freeze +* +* Description: For finite field element a, compute standard +* representative r = a mod^+ Q. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t freeze(int32_t a) { + a = reduce32(a); + a = caddq(a); + return a; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.h new file mode 100644 index 000000000..26d9b4ee2 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.h @@ -0,0 +1,22 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -4186625 // 2^32 % Q +#define QINV 58728449 // q^(-1) mod 2^32 + +#define montgomery_reduce DILITHIUM_NAMESPACE(montgomery_reduce) +int32_t montgomery_reduce(int64_t a); + +#define reduce32 DILITHIUM_NAMESPACE(reduce32) +int32_t reduce32(int32_t a); + +#define caddq DILITHIUM_NAMESPACE(caddq) +int32_t caddq(int32_t a); + +#define freeze DILITHIUM_NAMESPACE(freeze) +int32_t freeze(int32_t a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c new file mode 100644 index 000000000..889f0a296 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c @@ -0,0 +1,102 @@ +#include +#include "params.h" +#include "rounding.h" + +/************************************************* +* Name: power2round +* +* Description: For finite field element a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be standard representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t power2round(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + (1 << (D-1)) - 1) >> D; + *a0 = a - (a1 << D); + return a1; +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low bits a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod^+ Q - Q < 0. Assumes a to be standard +* representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t decompose(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + 127) >> 7; +#if GAMMA2 == (Q-1)/32 + a1 = (a1*1025 + (1 << 21)) >> 22; + a1 &= 15; +#elif GAMMA2 == (Q-1)/88 + a1 = (a1*11275 + (1 << 23)) >> 24; + a1 ^= ((43 - a1) >> 31) & a1; +#endif + + *a0 = a - a1*2*GAMMA2; + *a0 -= (((Q-1)/2 - *a0) >> 31) & Q; + return a1; +} + +/************************************************* +* Name: make_hint +* +* Description: Compute hint bit indicating whether the low bits of the +* input element overflow into the high bits. +* +* Arguments: - int32_t a0: low bits of input element +* - int32_t a1: high bits of input element +* +* Returns 1 if overflow. +**************************************************/ +unsigned int make_hint(int32_t a0, int32_t a1) { + if(a0 > GAMMA2 || a0 < -GAMMA2 || (a0 == -GAMMA2 && a1 != 0)) + return 1; + + return 0; +} + +/************************************************* +* Name: use_hint +* +* Description: Correct high bits according to hint. +* +* Arguments: - int32_t a: input element +* - unsigned int hint: hint bit +* +* Returns corrected high bits. +**************************************************/ +int32_t use_hint(int32_t a, unsigned int hint) { + int32_t a0, a1; + + a1 = decompose(&a0, a); + if(hint == 0) + return a1; + +#if GAMMA2 == (Q-1)/32 + if(a0 > 0) + return (a1 + 1) & 15; + else + return (a1 - 1) & 15; +#elif GAMMA2 == (Q-1)/88 + if(a0 > 0) + return (a1 == 43) ? 0 : a1 + 1; + else + return (a1 == 0) ? 43 : a1 - 1; +#endif +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.h new file mode 100644 index 000000000..b72e8e8d6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.h @@ -0,0 +1,19 @@ +#ifndef ROUNDING_H +#define ROUNDING_H + +#include +#include "params.h" + +#define power2round DILITHIUM_NAMESPACE(power2round) +int32_t power2round(int32_t *a0, int32_t a); + +#define decompose DILITHIUM_NAMESPACE(decompose) +int32_t decompose(int32_t *a0, int32_t a); + +#define make_hint DILITHIUM_NAMESPACE(make_hint) +unsigned int make_hint(int32_t a0, int32_t a1); + +#define use_hint DILITHIUM_NAMESPACE(use_hint) +int32_t use_hint(int32_t a, unsigned int hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c new file mode 100644 index 000000000..9298ad217 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c @@ -0,0 +1,341 @@ +#include +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[TRBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, + size_t *siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + unsigned int n; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *mu, *rhoprime, *rnd; + uint16_t nonce = 0; + polyvecl mat[K], s1, y, z; + polyveck t0, s2, w1, w0, h; + poly cp; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + + /* Compute mu = CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + for(n=0;n OMEGA) + goto rej; + + shake256_inc_ctx_release(&state); + + /* Write signature */ + pack_sig(sig, sig, &z, &h); + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, + size_t *smlen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, + size_t siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *pk) +{ + unsigned int i; + uint8_t buf[K*POLYW1_PACKEDBYTES]; + uint8_t rho[SEEDBYTES]; + uint8_t mu[CRHBYTES]; + uint8_t c[CTILDEBYTES]; + uint8_t c2[CTILDEBYTES]; + poly cp; + polyvecl mat[K], z; + polyveck t1, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + unpack_pk(rho, &t1, pk); + if(unpack_sig(c, &z, &h, sig)) + return -1; + if(polyvecl_chknorm(&z, GAMMA1 - BETA)) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + + /* Matrix-vector multiplication; compute Az - c2^dt1 */ + poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ + polyvec_matrix_expand(mat, rho); + + polyvecl_ntt(&z); + polyvec_matrix_pointwise_montgomery(&w1, mat, &z); + + poly_ntt(&cp); + polyveck_shiftl(&t1); + polyveck_ntt(&t1); + polyveck_pointwise_poly_montgomery(&t1, &cp, &t1); + + polyveck_sub(&w1, &w1, &t1); + polyveck_reduce(&w1); + polyveck_invntt_tomont(&w1); + + /* Reconstruct w1 */ + polyveck_caddq(&w1); + polyveck_use_hint(&w1, &w1, &h); + polyveck_pack_w1(buf, &w1); + + /* Call random oracle and verify challenge */ + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(c2, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(c[i] != c2[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, + size_t *mlen, + const uint8_t *sm, + size_t smlen, + const uint8_t *pk) +{ + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric.h new file mode 100644 index 000000000..211de3b86 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric.h @@ -0,0 +1,36 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, + const uint8_t seed[CRHBYTES], + uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) \ + dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) \ + dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/align.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/align.h new file mode 100644 index 000000000..33fac1d96 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT32(N) \ + union { \ + int32_t coeffs[N]; \ + __m256i vec[(N+7)/8]; \ + } + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/api.h new file mode 100644 index 000000000..55b637669 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_avx2_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_avx2_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_avx2_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_avx2_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_avx2_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_avx2_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_avx2_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_avx2_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_avx2_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_avx2_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_avx2_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_avx2_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_avx2_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/config.h new file mode 100644 index 000000000..e59f81a5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_avx2_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_avx2_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_avx2 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_avx2_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c new file mode 100644 index 000000000..414d99ece --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c @@ -0,0 +1,100 @@ +#include +#include "params.h" +#include "consts.h" + +#define QINV 58728449 // q^(-1) mod 2^32 +#define MONT -4186625 // 2^32 mod q +#define DIV 41978 // mont^2/256 +#define DIV_QINV -8395782 + +const qdata_t qdata = {{ +#define _8XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, + +#define _8XQINV 8 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _8XDIV_QINV 16 + DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, DIV_QINV, + +#define _8XDIV 24 + DIV, DIV, DIV, DIV, DIV, DIV, DIV, DIV, + +#define _ZETAS_QINV 32 + -151046689, 1830765815, -1929875198, -1927777021, 1640767044, 1477910808, 1612161320, 1640734244, + 308362795, 308362795, 308362795, 308362795, -1815525077, -1815525077, -1815525077, -1815525077, + -1374673747, -1374673747, -1374673747, -1374673747, -1091570561, -1091570561, -1091570561, -1091570561, + -1929495947, -1929495947, -1929495947, -1929495947, 515185417, 515185417, 515185417, 515185417, + -285697463, -285697463, -285697463, -285697463, 625853735, 625853735, 625853735, 625853735, + 1727305304, 1727305304, 2082316400, 2082316400, -1364982364, -1364982364, 858240904, 858240904, + 1806278032, 1806278032, 222489248, 222489248, -346752664, -346752664, 684667771, 684667771, + 1654287830, 1654287830, -878576921, -878576921, -1257667337, -1257667337, -748618600, -748618600, + 329347125, 329347125, 1837364258, 1837364258, -1443016191, -1443016191, -1170414139, -1170414139, + -1846138265, -1631226336, -1404529459, 1838055109, 1594295555, -1076973524, -1898723372, -594436433, + -202001019, -475984260, -561427818, 1797021249, -1061813248, 2059733581, -1661512036, -1104976547, + -1750224323, -901666090, 418987550, 1831915353, -1925356481, 992097815, 879957084, 2024403852, + 1484874664, -1636082790, -285388938, -1983539117, -1495136972, -950076368, -1714807468, -952438995, + -1574918427, 1350681039, -2143979939, 1599739335, -1285853323, -993005454, -1440787840, 568627424, + -783134478, -588790216, 289871779, -1262003603, 2135294594, -1018755525, -889861155, 1665705315, + 1321868265, 1225434135, -1784632064, 666258756, 675310538, -1555941048, -1999506068, -1499481951, + -695180180, -1375177022, 1777179795, 334803717, -178766299, -518252220, 1957047970, 1146323031, + -654783359, -1974159335, 1651689966, 140455867, -1039411342, 1955560694, 1529189038, -2131021878, + -247357819, 1518161567, -86965173, 1708872713, 1787797779, 1638590967, -120646188, -1669960606, + -916321552, 1155548552, 2143745726, 1210558298, -1261461890, -318346816, 628664287, -1729304568, + 1422575624, 1424130038, -1185330464, 235321234, 168022240, 1206536194, 985155484, -894060583, + -898413, -1363460238, -605900043, 2027833504, 14253662, 1014493059, 863641633, 1819892093, + 2124962073, -1223601433, -1920467227, -1637785316, -1536588520, 694382729, 235104446, -1045062172, + 831969619, -300448763, 756955444, -260312805, 1554794072, 1339088280, -2040058690, -853476187, + -2047270596, -1723816713, -1591599803, -440824168, 1119856484, 1544891539, 155290192, -973777462, + 991903578, 912367099, -44694137, 1176904444, -421552614, -818371958, 1747917558, -325927722, + 908452108, 1851023419, -1176751719, -1354528380, -72690498, -314284737, 985022747, 963438279, + -1078959975, 604552167, -1021949428, 608791570, 173440395, -2126092136, -1316619236, -1039370342, + 6087993, -110126092, 565464272, -1758099917, -1600929361, 879867909, -1809756372, 400711272, + 1363007700, 30313375, -326425360, 1683520342, -517299994, 2027935492, -1372618620, 128353682, + -1123881663, 137583815, -635454918, -642772911, 45766801, 671509323, -2070602178, 419615363, + 1216882040, -270590488, -1276805128, 371462360, -1357098057, -384158533, 827959816, -596344473, + 702390549, -279505433, -260424530, -71875110, -1208667171, -1499603926, 2036925262, -540420426, + 746144248, -1420958686, 2032221021, 1904936414, 1257750362, 1926727420, 1931587462, 1258381762, + 885133339, 1629985060, 1967222129, 6363718, -1287922800, 1136965286, 1779436847, 1116720494, + 1042326957, 1405999311, 713994583, 940195359, -1542497137, 2061661095, -883155599, 1726753853, + -1547952704, 394851342, 283780712, 776003547, 1123958025, 201262505, 1934038751, 374860238, + +#define _ZETAS 328 + -3975713, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 1826347, 1826347, 1826347, 2353451, 2353451, 2353451, 2353451, + -359251, -359251, -359251, -359251, -2091905, -2091905, -2091905, -2091905, + 3119733, 3119733, 3119733, 3119733, -2884855, -2884855, -2884855, -2884855, + 3111497, 3111497, 3111497, 3111497, 2680103, 2680103, 2680103, 2680103, + 2725464, 2725464, 1024112, 1024112, -1079900, -1079900, 3585928, 3585928, + -549488, -549488, -1119584, -1119584, 2619752, 2619752, -2108549, -2108549, + -2118186, -2118186, -3859737, -3859737, -1399561, -1399561, -3277672, -3277672, + 1757237, 1757237, -19422, -19422, 4010497, 4010497, 280005, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -3677745, -1452451, 2176455, -1257611, -4083598, -3190144, -3632928, + 3412210, 2147896, -2967645, -411027, -671102, -22981, -381987, 1852771, + -3343383, 508951, 44288, 904516, -3724342, 1653064, 2389356, 759969, + 189548, 3159746, -2409325, 1315589, 1285669, -812732, -3019102, -3628969, + -1528703, -3041255, 3475950, -1585221, 1939314, -1000202, -3157330, 126922, + -983419, 2715295, -3693493, -2477047, -1228525, -1308169, 1349076, -1430430, + 264944, 3097992, -1100098, 3958618, -8578, -3249728, -210977, -1316856, + -3553272, -1851402, -177440, 1341330, -1584928, -1439742, -3881060, 3839961, + 2091667, -3342478, 266997, -3520352, 900702, 495491, -655327, -3556995, + 342297, 3437287, 2842341, 4055324, -3767016, -2994039, -1333058, -451100, + -1279661, 1500165, -542412, -2584293, -2013608, 1957272, -3183426, 810149, + -3038916, 2213111, -426683, -1667432, -2939036, 183443, -554416, 3937738, + 3407706, 2244091, 2434439, -3759364, 1859098, -1613174, -3122442, -525098, + 286988, -3342277, 2691481, 1247620, 1250494, 1869119, 1237275, 1312455, + 1917081, 777191, -2831860, -3724270, 2432395, 3369112, 162844, 1652634, + 3523897, -975884, 1723600, -1104333, -2235985, -976891, 3919660, 1400424, + 2316500, -2446433, -1235728, -1197226, 909542, -43260, 2031748, -768622, + -2437823, 1735879, -2590150, 2486353, 2635921, 1903435, -3318210, 3306115, + -2546312, 2235880, -1671176, 594136, 2454455, 185531, 1616392, -3694233, + 3866901, 1717735, -1803090, -260646, -420899, 1612842, -48306, -846154, + 3817976, -3562462, 3513181, -3193378, 819034, -522500, 3207046, -3595838, + 4108315, 203044, 1265009, 1595974, -3548272, -1050970, -1430225, -1962642, + -1374803, 3406031, -1846953, -3776993, -164721, -1207385, 3014001, -1799107, + 269760, 472078, 1910376, -3833893, -2286327, -3545687, -1362209, 1976782, +}}; diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.h new file mode 100644 index 000000000..930d2f09b --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.h @@ -0,0 +1,38 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _8XQ 0 +#define _8XQINV 8 +#define _8XDIV_QINV 16 +#define _8XDIV 24 +#define _ZETAS_QINV 32 +#define _ZETAS 328 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define _cdecl(s) decorate(s) +#define cdecl(s) _cdecl(DILITHIUM_NAMESPACE(##s)) +#else +#define cdecl(s) DILITHIUM_NAMESPACE(##s) +#endif + +#ifndef __ASSEMBLER__ + +#include "align.h" + +typedef ALIGNED_INT32(624) qdata_t; + +#define qdata DILITHIUM_NAMESPACE(qdata) +extern const qdata_t qdata; + +#endif +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S new file mode 100644 index 000000000..3e9864c99 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S @@ -0,0 +1,238 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpsubd %ymm\l,%ymm\h,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vpmuldq %ymm\zl0,%ymm12,%ymm13 +vmovshdup %ymm12,%ymm\h +vpmuldq %ymm\zl1,%ymm\h,%ymm14 + +vpmuldq %ymm\zh0,%ymm12,%ymm12 +vpmuldq %ymm\zh1,%ymm\h,%ymm\h + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vpsubd %ymm13,%ymm12,%ymm12 +vpsubd %ymm14,%ymm\h,%ymm\h + +vmovshdup %ymm12,%ymm12 +vpblendd $0xAA,%ymm\h,%ymm12,%ymm\h +.endm + +.macro levels0t5 off +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +/* level 0 */ +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,5,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 6,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-72)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-72)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,9,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+296-8*\off-104)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+296-8*\off-104)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 10,11,1,3,2,15 + +/* level 1 */ +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,6,1,3,2,15 +butterfly 5,7,1,3,2,15 + +vpermq $0x1B,(_ZETAS_QINV+168-8*\off-40)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+168-8*\off-40)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 8,10,1,3,2,15 +butterfly 9,11,1,3,2,15 + +/* level 2 */ +vpermq $0x1B,(_ZETAS_QINV+104-8*\off-8)*4(%rsi),%ymm3 +vpermq $0x1B,(_ZETAS+104-8*\off-8)*4(%rsi),%ymm15 +vmovshdup %ymm3,%ymm1 +vmovshdup %ymm15,%ymm2 +butterfly 4,8,1,3,2,15 +butterfly 5,9,1,3,2,15 +butterfly 6,10,1,3,2,15 +butterfly 7,11,1,3,2,15 + +/* level 3 */ +shuffle2 4,5,3,5 +shuffle2 6,7,4,7 +shuffle2 8,9,6,9 +shuffle2 10,11,8,11 + +vpermq $0x1B,(_ZETAS_QINV+72-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+72-8*\off-8)*4(%rsi),%ymm2 +butterfly 3,5 +butterfly 4,7 +butterfly 6,9 +butterfly 8,11 + +/* level 4 */ +shuffle4 3,4,10,4 +shuffle4 6,8,3,8 +shuffle4 5,7,6,7 +shuffle4 9,11,5,11 + +vpermq $0x1B,(_ZETAS_QINV+40-8*\off-8)*4(%rsi),%ymm1 +vpermq $0x1B,(_ZETAS+40-8*\off-8)*4(%rsi),%ymm2 +butterfly 10,4 +butterfly 3,8 +butterfly 6,7 +butterfly 5,11 + +/* level 5 */ +shuffle8 10,3,9,3 +shuffle8 6,5,10,5 +shuffle8 4,8,6,8 +shuffle8 7,11,4,11 + +vpbroadcastd (_ZETAS_QINV+7-\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+7-\off)*4(%rsi),%ymm2 +butterfly 9,3 +butterfly 10,5 +butterfly 6,8 +butterfly 4,11 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm10,256*\off+ 32(%rdi) +vmovdqa %ymm6,256*\off+ 64(%rdi) +vmovdqa %ymm4,256*\off+ 96(%rdi) +vmovdqa %ymm3,256*\off+128(%rdi) +vmovdqa %ymm5,256*\off+160(%rdi) +vmovdqa %ymm8,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.macro levels6t7 off +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +/* level 6 */ +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +/* level 7 */ +vpbroadcastd (_ZETAS_QINV+0)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+0)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) + +vmovdqa (_8XDIV_QINV)*4(%rsi),%ymm1 +vmovdqa (_8XDIV)*4(%rsi),%ymm2 +vpmuldq %ymm1,%ymm4,%ymm12 +vpmuldq %ymm1,%ymm5,%ymm13 +vmovshdup %ymm4,%ymm8 +vmovshdup %ymm5,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm4,%ymm4 +vpmuldq %ymm2,%ymm5,%ymm5 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm4,%ymm4 +vpsubd %ymm13,%ymm5,%ymm5 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm4,%ymm4 +vmovshdup %ymm5,%ymm5 +vpblendd $0xAA,%ymm8,%ymm4,%ymm4 +vpblendd $0xAA,%ymm9,%ymm5,%ymm5 + +vpmuldq %ymm1,%ymm6,%ymm12 +vpmuldq %ymm1,%ymm7,%ymm13 +vmovshdup %ymm6,%ymm8 +vmovshdup %ymm7,%ymm9 +vpmuldq %ymm1,%ymm8,%ymm14 +vpmuldq %ymm1,%ymm9,%ymm15 +vpmuldq %ymm2,%ymm6,%ymm6 +vpmuldq %ymm2,%ymm7,%ymm7 +vpmuldq %ymm2,%ymm8,%ymm8 +vpmuldq %ymm2,%ymm9,%ymm9 +vpmuldq %ymm0,%ymm12,%ymm12 +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 +vpmuldq %ymm0,%ymm15,%ymm15 +vpsubd %ymm12,%ymm6,%ymm6 +vpsubd %ymm13,%ymm7,%ymm7 +vpsubd %ymm14,%ymm8,%ymm8 +vpsubd %ymm15,%ymm9,%ymm9 +vmovshdup %ymm6,%ymm6 +vmovshdup %ymm7,%ymm7 +vpblendd $0xAA,%ymm8,%ymm6,%ymm6 +vpblendd $0xAA,%ymm9,%ymm7,%ymm7 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t5 0 +levels0t5 1 +levels0t5 2 +levels0t5 3 + +levels6t7 0 +levels6t7 1 +levels6t7 2 +levels6t7 3 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S new file mode 100644 index 000000000..38415de89 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S @@ -0,0 +1,197 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro butterfly l,h,zl0=1,zl1=1,zh0=2,zh1=2 +vpmuldq %ymm\zl0,%ymm\h,%ymm13 +vmovshdup %ymm\h,%ymm12 +vpmuldq %ymm\zl1,%ymm12,%ymm14 + +vpmuldq %ymm\zh0,%ymm\h,%ymm\h +vpmuldq %ymm\zh1,%ymm12,%ymm12 + +vpmuldq %ymm0,%ymm13,%ymm13 +vpmuldq %ymm0,%ymm14,%ymm14 + +vmovshdup %ymm\h,%ymm\h +vpblendd $0xAA,%ymm12,%ymm\h,%ymm\h + +vpsubd %ymm\h,%ymm\l,%ymm12 +vpaddd %ymm\h,%ymm\l,%ymm\l + +vmovshdup %ymm13,%ymm13 +vpblendd $0xAA,%ymm14,%ymm13,%ymm13 + +vpaddd %ymm13,%ymm12,%ymm\h +vpsubd %ymm13,%ymm\l,%ymm\l +.endm + +.macro levels0t1 off +/* level 0 */ +vpbroadcastd (_ZETAS_QINV+1)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+1)*4(%rsi),%ymm2 + +vmovdqa 0+32*\off(%rdi),%ymm4 +vmovdqa 128+32*\off(%rdi),%ymm5 +vmovdqa 256+32*\off(%rdi),%ymm6 +vmovdqa 384+32*\off(%rdi),%ymm7 +vmovdqa 512+32*\off(%rdi),%ymm8 +vmovdqa 640+32*\off(%rdi),%ymm9 +vmovdqa 768+32*\off(%rdi),%ymm10 +vmovdqa 896+32*\off(%rdi),%ymm11 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +/* level 1 */ +vpbroadcastd (_ZETAS_QINV+2)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+2)*4(%rsi),%ymm2 +butterfly 4,6 +butterfly 5,7 + +vpbroadcastd (_ZETAS_QINV+3)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+3)*4(%rsi),%ymm2 +butterfly 8,10 +butterfly 9,11 + +vmovdqa %ymm4, 0+32*\off(%rdi) +vmovdqa %ymm5,128+32*\off(%rdi) +vmovdqa %ymm6,256+32*\off(%rdi) +vmovdqa %ymm7,384+32*\off(%rdi) +vmovdqa %ymm8,512+32*\off(%rdi) +vmovdqa %ymm9,640+32*\off(%rdi) +vmovdqa %ymm10,768+32*\off(%rdi) +vmovdqa %ymm11,896+32*\off(%rdi) +.endm + +.macro levels2t7 off +/* level 2 */ +vmovdqa 256*\off+ 0(%rdi),%ymm4 +vmovdqa 256*\off+ 32(%rdi),%ymm5 +vmovdqa 256*\off+ 64(%rdi),%ymm6 +vmovdqa 256*\off+ 96(%rdi),%ymm7 +vmovdqa 256*\off+128(%rdi),%ymm8 +vmovdqa 256*\off+160(%rdi),%ymm9 +vmovdqa 256*\off+192(%rdi),%ymm10 +vmovdqa 256*\off+224(%rdi),%ymm11 + +vpbroadcastd (_ZETAS_QINV+4+\off)*4(%rsi),%ymm1 +vpbroadcastd (_ZETAS+4+\off)*4(%rsi),%ymm2 + +butterfly 4,8 +butterfly 5,9 +butterfly 6,10 +butterfly 7,11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +/* level 3 */ +vmovdqa (_ZETAS_QINV+8+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+8+8*\off)*4(%rsi),%ymm2 + +butterfly 3,5 +butterfly 8,10 +butterfly 4,6 +butterfly 9,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +/* level 4 */ +vmovdqa (_ZETAS_QINV+40+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+40+8*\off)*4(%rsi),%ymm2 + +butterfly 7,8 +butterfly 5,6 +butterfly 3,4 +butterfly 10,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_QINV+72+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+72+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 + +butterfly 9,5,1,10,2,15 +butterfly 8,4,1,10,2,15 +butterfly 7,3,1,10,2,15 +butterfly 6,11,1,10,2,15 + +/* level 6 */ +vmovdqa (_ZETAS_QINV+104+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,7,1,10,2,15 +butterfly 8,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+104+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+104+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,3,1,10,2,15 +butterfly 4,11,1,10,2,15 + +/* level 7 */ +vmovdqa (_ZETAS_QINV+168+8*\off)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 9,8,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+32)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+32)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 7,6,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+64)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+64)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 5,4,1,10,2,15 + +vmovdqa (_ZETAS_QINV+168+8*\off+96)*4(%rsi),%ymm1 +vmovdqa (_ZETAS+168+8*\off+96)*4(%rsi),%ymm2 +vpsrlq $32,%ymm1,%ymm10 +vmovshdup %ymm2,%ymm15 +butterfly 3,11,1,10,2,15 + +vmovdqa %ymm9,256*\off+ 0(%rdi) +vmovdqa %ymm8,256*\off+ 32(%rdi) +vmovdqa %ymm7,256*\off+ 64(%rdi) +vmovdqa %ymm6,256*\off+ 96(%rdi) +vmovdqa %ymm5,256*\off+128(%rdi) +vmovdqa %ymm4,256*\off+160(%rdi) +vmovdqa %ymm3,256*\off+192(%rdi) +vmovdqa %ymm11,256*\off+224(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _8XQ*4(%rsi),%ymm0 + +levels0t1 0 +levels0t1 1 +levels0t1 2 +levels0t1 3 + +levels2t7 0 +levels2t7 1 +levels2t7 2 +levels2t7 3 + +ret + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.h new file mode 100644 index 000000000..0c4fbdd34 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include + +#define ntt_avx DILITHIUM_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *a, const __m256i *qdata); +#define invntt_avx DILITHIUM_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *a, const __m256i *qdata); + +#define nttunpack_avx DILITHIUM_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *a); + +#define pointwise_avx DILITHIUM_NAMESPACE(pointwise_avx) +void pointwise_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); +#define pointwise_acc_avx DILITHIUM_NAMESPACE(pointwise_acc_avx) +void pointwise_acc_avx(__m256i *c, const __m256i *a, const __m256i *b, const __m256i *qdata); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S new file mode 100644 index 000000000..ae7ff7995 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S @@ -0,0 +1,211 @@ +#include "params.h" +#include "consts.h" + +.text +.global cdecl(pointwise_avx) +cdecl(pointwise_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop1: +#load +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa 64(%rsi),%ymm6 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vmovdqa 64(%rdx),%ymm14 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm6,%ymm7 +vpsrlq $32,%ymm10,%ymm11 +vpsrlq $32,%ymm12,%ymm13 +vmovshdup %ymm14,%ymm15 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 +vpmuldq %ymm6,%ymm14,%ymm6 +vpmuldq %ymm7,%ymm15,%ymm7 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm0,%ymm6,%ymm14 +vpmuldq %ymm0,%ymm7,%ymm15 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpmuldq %ymm1,%ymm14,%ymm14 +vpmuldq %ymm1,%ymm15,%ymm15 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsubq %ymm14,%ymm6,%ymm6 +vpsubq %ymm15,%ymm7,%ymm7 +vpsrlq $32,%ymm2,%ymm2 +vpsrlq $32,%ymm4,%ymm4 +vmovshdup %ymm6,%ymm6 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 +vpblendd $0xAA,%ymm7,%ymm6,%ymm6 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm6,64(%rdi) + +add $96,%rdi +add $96,%rsi +add $96,%rdx +add $1,%eax +cmp $10,%eax +jb _looptop1 + +vmovdqa (%rsi),%ymm2 +vmovdqa 32(%rsi),%ymm4 +vmovdqa (%rdx),%ymm10 +vmovdqa 32(%rdx),%ymm12 +vpsrlq $32,%ymm2,%ymm3 +vpsrlq $32,%ymm4,%ymm5 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm2,%ymm10,%ymm2 +vpmuldq %ymm3,%ymm11,%ymm3 +vpmuldq %ymm4,%ymm12,%ymm4 +vpmuldq %ymm5,%ymm13,%ymm5 + +#reduce +vpmuldq %ymm0,%ymm2,%ymm10 +vpmuldq %ymm0,%ymm3,%ymm11 +vpmuldq %ymm0,%ymm4,%ymm12 +vpmuldq %ymm0,%ymm5,%ymm13 +vpmuldq %ymm1,%ymm10,%ymm10 +vpmuldq %ymm1,%ymm11,%ymm11 +vpmuldq %ymm1,%ymm12,%ymm12 +vpmuldq %ymm1,%ymm13,%ymm13 +vpsubq %ymm10,%ymm2,%ymm2 +vpsubq %ymm11,%ymm3,%ymm3 +vpsubq %ymm12,%ymm4,%ymm4 +vpsubq %ymm13,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0x55,%ymm2,%ymm3,%ymm2 +vpblendd $0x55,%ymm4,%ymm5,%ymm4 +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +ret + +.macro pointwise off +#load +vmovdqa \off(%rsi),%ymm6 +vmovdqa \off+32(%rsi),%ymm8 +vmovdqa \off(%rdx),%ymm10 +vmovdqa \off+32(%rdx),%ymm12 +vpsrlq $32,%ymm6,%ymm7 +vpsrlq $32,%ymm8,%ymm9 +vmovshdup %ymm10,%ymm11 +vmovshdup %ymm12,%ymm13 + +#mul +vpmuldq %ymm6,%ymm10,%ymm6 +vpmuldq %ymm7,%ymm11,%ymm7 +vpmuldq %ymm8,%ymm12,%ymm8 +vpmuldq %ymm9,%ymm13,%ymm9 +.endm + +.macro acc +vpaddq %ymm6,%ymm2,%ymm2 +vpaddq %ymm7,%ymm3,%ymm3 +vpaddq %ymm8,%ymm4,%ymm4 +vpaddq %ymm9,%ymm5,%ymm5 +.endm + +.global cdecl(pointwise_acc_avx) +cdecl(pointwise_acc_avx): +#consts +vmovdqa _8XQINV*4(%rcx),%ymm0 +vmovdqa _8XQ*4(%rcx),%ymm1 + +xor %eax,%eax +_looptop2: +pointwise 0 + +#mov +vmovdqa %ymm6,%ymm2 +vmovdqa %ymm7,%ymm3 +vmovdqa %ymm8,%ymm4 +vmovdqa %ymm9,%ymm5 + +pointwise 1024 +acc + +#if L >= 3 +pointwise 2048 +acc +#endif + +#if L >= 4 +pointwise 3072 +acc +#endif + +#if L >= 5 +pointwise 4096 +acc +#endif + +#if L >= 6 +pointwise 5120 +acc +#endif + +#if L >= 7 +pointwise 6144 +acc +#endif + +#reduce +vpmuldq %ymm0,%ymm2,%ymm6 +vpmuldq %ymm0,%ymm3,%ymm7 +vpmuldq %ymm0,%ymm4,%ymm8 +vpmuldq %ymm0,%ymm5,%ymm9 +vpmuldq %ymm1,%ymm6,%ymm6 +vpmuldq %ymm1,%ymm7,%ymm7 +vpmuldq %ymm1,%ymm8,%ymm8 +vpmuldq %ymm1,%ymm9,%ymm9 +vpsubq %ymm6,%ymm2,%ymm2 +vpsubq %ymm7,%ymm3,%ymm3 +vpsubq %ymm8,%ymm4,%ymm4 +vpsubq %ymm9,%ymm5,%ymm5 +vpsrlq $32,%ymm2,%ymm2 +vmovshdup %ymm4,%ymm4 + +#store +vpblendd $0xAA,%ymm3,%ymm2,%ymm2 +vpblendd $0xAA,%ymm5,%ymm4,%ymm4 + +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm4,32(%rdi) + +add $64,%rsi +add $64,%rdx +add $64,%rdi +add $1,%eax +cmp $16,%eax +jb _looptop2 + +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c new file mode 100644 index 000000000..25d36828a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c @@ -0,0 +1,1138 @@ +#include +#include +#include +#include "align.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" +#include "symmetric.h" +#include "fips202x4.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. Assumes input +* coefficients to be at most 2^31 - 2^22 - 1 in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i off = _mm256_set1_epi32(1<<22); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_add_epi32(f,off); + g = _mm256_srai_epi32(g,23); + g = _mm256_mullo_epi32(g,q); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_addq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + __m256i f,g; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i zero = _mm256_setzero_si256(); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_blendv_epi32(zero,q,f); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_add_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + __m256i f,g; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + g = _mm256_load_si256(&b->vec[i]); + f = _mm256_sub_epi32(f,g); + _mm256_store_si256(&c->vec[i],f); + } + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + __m256i f; + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_slli_epi32(f,D); + _mm256_store_si256(&a->vec[i],f); + } + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by up to +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_avx(a->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +void poly_nttunpack(poly *a) { + DBENCH_START(); + + nttunpack_avx(a->vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + DBENCH_START(); + + pointwise_avx(c->vec, a->vec, b->vec, qdata.vec); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod^+ Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + power2round_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod^+ Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except if c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be positive standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) +{ + DBENCH_START(); + + decompose_avx(a1->vec, a0->vec, a->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint array. The coefficients of which are the +* indices of the coefficients of the input polynomial +* whose low bits overflow into the high bits. +* +* Arguments: - uint8_t *h: pointer to output hint array (preallocated of length N) +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of hints, i.e. length of hint array. +**************************************************/ +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1) +{ + unsigned int r; + DBENCH_START(); + + r = make_hint_avx(hint, a0->vec, a1->vec); + + DBENCH_STOP(*tround); + return r; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) +{ + DBENCH_START(); + + use_hint_avx(b->vec, a->vec, h->vec); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input polynomial to be reduced by poly_reduce(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int r; + __m256i f,t; + const __m256i bound = _mm256_set1_epi32(B-1); + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + t = _mm256_setzero_si256(); + for(i = 0; i < N/8; i++) { + f = _mm256_load_si256(&a->vec[i]); + f = _mm256_abs_epi32(f); + f = _mm256_cmpgt_epi32(f,bound); + t = _mm256_or_si256(t,f); + } + + r = 1 - _mm256_testz_si256(t,t); + DBENCH_STOP(*tsample); + return r; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_preinit(poly *a, stream128_state *state) +{ + unsigned int ctr; + /* rej_uniform_avx reads up to 8 additional bytes */ + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf; + + stream128_squeezeblocks(buf.coeffs, REJ_UNIFORM_NBLOCKS, state); + ctr = rej_uniform_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + /* length of buf is always divisible by 3; hence, no bytes left */ + stream128_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM128_BLOCKBYTES); + } +} + +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + stream128_state state; + stream128_init(&state, seed, nonce); + poly_uniform_preinit(a, &state); + stream128_release(&state); +} + +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[32], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; + shake128x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec,f); + _mm256_store_si256(buf[1].vec,f); + _mm256_store_si256(buf[2].vec,f); + _mm256_store_si256(buf[3].vec,f); + + buf[0].coeffs[SEEDBYTES+0] = nonce0; + buf[0].coeffs[SEEDBYTES+1] = nonce0 >> 8; + buf[1].coeffs[SEEDBYTES+0] = nonce1; + buf[1].coeffs[SEEDBYTES+1] = nonce1 >> 8; + buf[2].coeffs[SEEDBYTES+0] = nonce2; + buf[2].coeffs[SEEDBYTES+1] = nonce2 >> 8; + buf[3].coeffs[SEEDBYTES+0] = nonce3; + buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling using the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +void poly_uniform_eta_preinit(poly *a, stream256_state *state) +{ + unsigned int ctr; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf; + + stream256_squeezeblocks(buf.coeffs, REJ_UNIFORM_ETA_NBLOCKS, state); + ctr = rej_eta_avx(a->coeffs, buf.coeffs); + + while(ctr < N) { + stream256_squeezeblocks(buf.coeffs, 1, state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf.coeffs, STREAM256_BLOCKBYTES); + } +} + +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_eta_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; + + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); + + ctr0 = rej_eta_avx(a0->coeffs, buf[0].coeffs); + ctr1 = rej_eta_avx(a1->coeffs, buf[1].coeffs); + ctr2 = rej_eta_avx(a2->coeffs, buf[2].coeffs); + ctr3 = rej_eta_avx(a3->coeffs, buf[3].coeffs); + + while(ctr0 < N || ctr1 < N || ctr2 < N || ctr3 < N) { + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_eta(a0->coeffs + ctr0, N - ctr0, buf[0].coeffs, SHAKE256_RATE); + ctr1 += rej_eta(a1->coeffs + ctr1, N - ctr1, buf[1].coeffs, SHAKE256_RATE); + ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); + ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); + } + shake256x4_inc_ctx_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state) +{ + /* polyz_unpack reads 14 additional bytes */ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf; + stream256_squeezeblocks(buf.coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, state); + polyz_unpack(a, buf.coeffs); +} + +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_gamma1_preinit(a, &state); + stream256_release(&state); +} + +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[64], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3) +{ + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; + shake256x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); + _mm256_store_si256(&buf[1].vec[0],f); + _mm256_store_si256(&buf[2].vec[0],f); + _mm256_store_si256(&buf[3].vec[0],f); + f = _mm256_loadu_si256((__m256i *)&seed[32]); + _mm256_store_si256(&buf[0].vec[1],f); + _mm256_store_si256(&buf[1].vec[1],f); + _mm256_store_si256(&buf[2].vec[1],f); + _mm256_store_si256(&buf[3].vec[1],f); + + buf[0].coeffs[64] = nonce0; + buf[0].coeffs[65] = nonce0 >> 8; + buf[1].coeffs[64] = nonce1; + buf[1].coeffs[65] = nonce1 >> 8; + buf[2].coeffs[64] = nonce2; + buf[2].coeffs[65] = nonce2 >> 8; + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + polyz_unpack(a0, buf[0].coeffs); + polyz_unpack(a1, buf[1].coeffs); + polyz_unpack(a2, buf[2].coeffs); + polyz_unpack(a3, buf[3].coeffs); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + ALIGNED_UINT8(SHAKE256_RATE) buf; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); + + memcpy(&signs, buf.coeffs, 8); + pos = 8; + + memset(c->vec, 0, sizeof(poly)); + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf.coeffs, 1, &state); + pos = 0; + } + + b = buf.coeffs[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly * restrict r, const uint8_t a[POLYETA_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are positive standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly * restrict r, const uint8_t a[POLYT1_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly * restrict r, const uint8_t a[POLYT0_PACKEDBYTES]) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly * restrict a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +#if GAMMA1 == (1 << 17) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1, 9, 8, 7,-1, 7, 6, 5,-1, 5, 4, 3,-1, 3, 2, 1, + -1, 8, 7, 6,-1, 6, 5, 4,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(6,4,2,0,6,4,2,0); + const __m256i mask = _mm256_set1_epi32(0x3FFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[18*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA1 == (1 << 19) +void polyz_unpack(poly * restrict r, const uint8_t *a) { + unsigned int i; + __m256i f; + const __m256i shufbidx = _mm256_set_epi8(-1,11,10, 9,-1, 9, 8, 7,-1, 6, 5, 4,-1, 4, 3, 2, + -1, 9, 8, 7,-1, 7, 6, 5,-1, 4, 3, 2,-1, 2, 1, 0); + const __m256i srlvdidx = _mm256_set1_epi64x((uint64_t)4 << 32); + const __m256i mask = _mm256_set1_epi32(0xFFFFF); + const __m256i gamma1 = _mm256_set1_epi32(GAMMA1); + DBENCH_START(); + + for(i = 0; i < N/8; i++) { + f = _mm256_loadu_si256((__m256i *)&a[20*i]); + f = _mm256_permute4x64_epi64(f,0x94); + f = _mm256_shuffle_epi8(f,shufbidx); + f = _mm256_srlv_epi32(f,srlvdidx); + f = _mm256_and_si256(f,mask); + f = _mm256_sub_epi32(gamma1,f); + _mm256_store_si256(&r->vec[i],f); + } + + DBENCH_STOP(*tpack); +} +#endif + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be positive standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +#if GAMMA2 == (Q-1)/88 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0,f1,f2,f3; + const __m256i shift1 = _mm256_set1_epi16((64 << 8) + 1); + const __m256i shift2 = _mm256_set1_epi32((4096 << 16) + 1); + const __m256i shufdidx1 = _mm256_set_epi32(7,3,6,2,5,1,4,0); + const __m256i shufdidx2 = _mm256_set_epi32(-1,-1,6,5,4,2,1,0); + const __m256i shufbidx = _mm256_set_epi8(-1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0, + -1,-1,-1,-1,14,13,12,10, 9, 8, 6, 5, 4, 2, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/32; i++) { + f0 = _mm256_load_si256(&a->vec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift1); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + f0 = _mm256_permutevar8x32_epi32(f0,shufdidx2); + _mm256_storeu_si256((__m256i *)&r[24*i],f0); + } + + DBENCH_STOP(*tpack); +} + +#elif GAMMA2 == (Q-1)/32 +void polyw1_pack(uint8_t *r, const poly * restrict a) { + unsigned int i; + __m256i f0, f1, f2, f3, f4, f5, f6, f7; + const __m256i shift = _mm256_set1_epi16((16 << 8) + 1); + const __m256i shufbidx = _mm256_set_epi8(15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0, + 15,14, 7, 6,13,12, 5, 4,11,10, 3, 2, 9, 8, 1, 0); + DBENCH_START(); + + for(i = 0; i < N/64; ++i) { + f0 = _mm256_load_si256(&a->vec[8*i+0]); + f1 = _mm256_load_si256(&a->vec[8*i+1]); + f2 = _mm256_load_si256(&a->vec[8*i+2]); + f3 = _mm256_load_si256(&a->vec[8*i+3]); + f4 = _mm256_load_si256(&a->vec[8*i+4]); + f5 = _mm256_load_si256(&a->vec[8*i+5]); + f6 = _mm256_load_si256(&a->vec[8*i+6]); + f7 = _mm256_load_si256(&a->vec[8*i+7]); + f0 = _mm256_packus_epi32(f0,f1); + f1 = _mm256_packus_epi32(f2,f3); + f2 = _mm256_packus_epi32(f4,f5); + f3 = _mm256_packus_epi32(f6,f7); + f0 = _mm256_packus_epi16(f0,f1); + f1 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift); + f1 = _mm256_maddubs_epi16(f1,shift); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_permute4x64_epi64(f0,0xD8); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + _mm256_storeu_si256((__m256i *)&r[32*i], f0); + } + + DBENCH_STOP(*tpack); +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.h new file mode 100644 index 000000000..7bcd8e5e0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.h @@ -0,0 +1,112 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" +#include "symmetric.h" + +typedef ALIGNED_INT32(N) poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_nttunpack DILITHIUM_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(uint8_t hint[N], const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform_preinit DILITHIUM_NAMESPACE(poly_uniform_preinit) +void poly_uniform_preinit(poly *a, stream128_state *state); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce); +#define poly_uniform_eta_preinit DILITHIUM_NAMESPACE(poly_uniform_eta_preinit) +void poly_uniform_eta_preinit(poly *a, stream256_state *state); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_uniform_gamma1_preinit DILITHIUM_NAMESPACE(poly_uniform_gamma1_preinit) +void poly_uniform_gamma1_preinit(poly *a, stream256_state *state); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define poly_uniform_4x DILITHIUM_NAMESPACE(poly_uniform_4x) +void poly_uniform_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[SEEDBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_eta_4x DILITHIUM_NAMESPACE(poly_uniform_eta_4x) +void poly_uniform_eta_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); +#define poly_uniform_gamma1_4x DILITHIUM_NAMESPACE(poly_uniform_gamma1_4x) +void poly_uniform_gamma1_4x(poly *a0, + poly *a1, + poly *a2, + poly *a3, + const uint8_t seed[CRHBYTES], + uint16_t nonce0, + uint16_t nonce1, + uint16_t nonce2, + uint16_t nonce3); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t r[POLYETA_PACKEDBYTES], const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t a[POLYETA_PACKEDBYTES]); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t r[POLYT1_PACKEDBYTES], const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t a[POLYT1_PACKEDBYTES]); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t r[POLYT0_PACKEDBYTES], const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t a[POLYT0_PACKEDBYTES]); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t r[POLYZ_PACKEDBYTES], const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c new file mode 100644 index 000000000..6e2302168 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c @@ -0,0 +1,588 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ + +#if K == 4 && L == 4 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], NULL, rho); + polyvec_matrix_expand_row1(&mat[1], NULL, rho); + polyvec_matrix_expand_row2(&mat[2], NULL, rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 256, 257, 258, 259); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 512, 513, 514, 515); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 768, 769, 770, 771); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); +} + +#elif K == 6 && L == 5 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvecl tmp; + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &tmp, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 4, 256, 257, 258); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 259, 260, 512, 513); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowb->vec[0], rho, 514, 515, 516, 768); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 769, 770, 771, 772); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1028, 1280, 1281, 1282); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowb->vec[0], &rowb->vec[1], rho, 1283, 1284, 1536, 1537); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); +} + +#elif K == 8 && L == 7 +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + polyvec_matrix_expand_row0(&mat[0], &mat[1], rho); + polyvec_matrix_expand_row1(&mat[1], &mat[2], rho); + polyvec_matrix_expand_row2(&mat[2], &mat[3], rho); + polyvec_matrix_expand_row3(&mat[3], NULL, rho); + polyvec_matrix_expand_row4(&mat[4], &mat[5], rho); + polyvec_matrix_expand_row5(&mat[5], &mat[6], rho); + polyvec_matrix_expand_row6(&mat[6], &mat[7], rho); + polyvec_matrix_expand_row7(&mat[7], NULL, rho); +} + +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 0, 1, 2, 3); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 4, 5, 6, 256); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 257, 258, 259, 260); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 261, 262, 512, 513); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 514, 515, 516, 517); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 518, 768, 769, 770); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row3(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 771, 772, 773, 774); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[0], &rowa->vec[1], &rowa->vec[2], &rowa->vec[3], rho, 1024, 1025, 1026, 1027); + poly_uniform_4x(&rowa->vec[4], &rowa->vec[5], &rowa->vec[6], &rowb->vec[0], rho, 1028, 1029, 1030, 1280); + poly_nttunpack(&rowa->vec[0]); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); +} + +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[1], &rowa->vec[2], &rowa->vec[3], &rowa->vec[4], rho, 1281, 1282, 1283, 1284); + poly_uniform_4x(&rowa->vec[5], &rowa->vec[6], &rowb->vec[0], &rowb->vec[1], rho, 1285, 1286, 1536, 1537); + poly_nttunpack(&rowa->vec[1]); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); +} + +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[2], &rowa->vec[3], &rowa->vec[4], &rowa->vec[5], rho, 1538, 1539, 1540, 1541); + poly_uniform_4x(&rowa->vec[6], &rowb->vec[0], &rowb->vec[1], &rowb->vec[2], rho, 1542, 1792, 1793, 1794); + poly_nttunpack(&rowa->vec[2]); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); + poly_nttunpack(&rowb->vec[0]); + poly_nttunpack(&rowb->vec[1]); + poly_nttunpack(&rowb->vec[2]); +} + +void polyvec_matrix_expand_row7(polyvecl *rowa, __attribute__((unused)) polyvecl *rowb, const uint8_t rho[SEEDBYTES]) { + poly_uniform_4x(&rowa->vec[3], &rowa->vec[4], &rowa->vec[5], &rowa->vec[6], rho, 1795, 1796, 1797, 1798); + poly_nttunpack(&rowa->vec[3]); + poly_nttunpack(&rowa->vec[4]); + poly_nttunpack(&rowa->vec[5]); + poly_nttunpack(&rowa->vec[6]); +} + +#else +#error +#endif + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, const polyvecl *u, const polyvecl *v) { + pointwise_acc_avx(w->vec, u->vec->vec, v->vec->vec, qdata.vec); +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - uint8_t *hint: pointer to output hint array +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1) +{ + unsigned int i, n = 0; + + for(i = 0; i < K; ++i) + n += poly_make_hint(&hint[n], &v0->vec[i], &v1->vec[i]); + + return n; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.h new file mode 100644 index 000000000..1b6dc87ac --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.h @@ -0,0 +1,105 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(uint8_t *hint, const polyveck *v0, const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_expand_row0 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row0) +void polyvec_matrix_expand_row0(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row1 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row1) +void polyvec_matrix_expand_row1(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row2 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row2) +void polyvec_matrix_expand_row2(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row3 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row3) +void polyvec_matrix_expand_row3(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row4 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row4) +void polyvec_matrix_expand_row4(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row5 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row5) +void polyvec_matrix_expand_row5(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row6 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row6) +void polyvec_matrix_expand_row6(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); +#define polyvec_matrix_expand_row7 DILITHIUM_NAMESPACE(polyvec_matrix_expand_row7) +void polyvec_matrix_expand_row7(polyvecl *rowa, polyvecl *rowb, const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c new file mode 100644 index 000000000..8b1dde444 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c @@ -0,0 +1,476 @@ +#include +#include +#include "params.h" +#include "rejsample.h" +#include "symmetric.h" + +const uint8_t idxlut[256][8] = { + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0, 0, 0}, + { 0, 1, 0, 0, 0, 0, 0, 0}, + { 2, 0, 0, 0, 0, 0, 0, 0}, + { 0, 2, 0, 0, 0, 0, 0, 0}, + { 1, 2, 0, 0, 0, 0, 0, 0}, + { 0, 1, 2, 0, 0, 0, 0, 0}, + { 3, 0, 0, 0, 0, 0, 0, 0}, + { 0, 3, 0, 0, 0, 0, 0, 0}, + { 1, 3, 0, 0, 0, 0, 0, 0}, + { 0, 1, 3, 0, 0, 0, 0, 0}, + { 2, 3, 0, 0, 0, 0, 0, 0}, + { 0, 2, 3, 0, 0, 0, 0, 0}, + { 1, 2, 3, 0, 0, 0, 0, 0}, + { 0, 1, 2, 3, 0, 0, 0, 0}, + { 4, 0, 0, 0, 0, 0, 0, 0}, + { 0, 4, 0, 0, 0, 0, 0, 0}, + { 1, 4, 0, 0, 0, 0, 0, 0}, + { 0, 1, 4, 0, 0, 0, 0, 0}, + { 2, 4, 0, 0, 0, 0, 0, 0}, + { 0, 2, 4, 0, 0, 0, 0, 0}, + { 1, 2, 4, 0, 0, 0, 0, 0}, + { 0, 1, 2, 4, 0, 0, 0, 0}, + { 3, 4, 0, 0, 0, 0, 0, 0}, + { 0, 3, 4, 0, 0, 0, 0, 0}, + { 1, 3, 4, 0, 0, 0, 0, 0}, + { 0, 1, 3, 4, 0, 0, 0, 0}, + { 2, 3, 4, 0, 0, 0, 0, 0}, + { 0, 2, 3, 4, 0, 0, 0, 0}, + { 1, 2, 3, 4, 0, 0, 0, 0}, + { 0, 1, 2, 3, 4, 0, 0, 0}, + { 5, 0, 0, 0, 0, 0, 0, 0}, + { 0, 5, 0, 0, 0, 0, 0, 0}, + { 1, 5, 0, 0, 0, 0, 0, 0}, + { 0, 1, 5, 0, 0, 0, 0, 0}, + { 2, 5, 0, 0, 0, 0, 0, 0}, + { 0, 2, 5, 0, 0, 0, 0, 0}, + { 1, 2, 5, 0, 0, 0, 0, 0}, + { 0, 1, 2, 5, 0, 0, 0, 0}, + { 3, 5, 0, 0, 0, 0, 0, 0}, + { 0, 3, 5, 0, 0, 0, 0, 0}, + { 1, 3, 5, 0, 0, 0, 0, 0}, + { 0, 1, 3, 5, 0, 0, 0, 0}, + { 2, 3, 5, 0, 0, 0, 0, 0}, + { 0, 2, 3, 5, 0, 0, 0, 0}, + { 1, 2, 3, 5, 0, 0, 0, 0}, + { 0, 1, 2, 3, 5, 0, 0, 0}, + { 4, 5, 0, 0, 0, 0, 0, 0}, + { 0, 4, 5, 0, 0, 0, 0, 0}, + { 1, 4, 5, 0, 0, 0, 0, 0}, + { 0, 1, 4, 5, 0, 0, 0, 0}, + { 2, 4, 5, 0, 0, 0, 0, 0}, + { 0, 2, 4, 5, 0, 0, 0, 0}, + { 1, 2, 4, 5, 0, 0, 0, 0}, + { 0, 1, 2, 4, 5, 0, 0, 0}, + { 3, 4, 5, 0, 0, 0, 0, 0}, + { 0, 3, 4, 5, 0, 0, 0, 0}, + { 1, 3, 4, 5, 0, 0, 0, 0}, + { 0, 1, 3, 4, 5, 0, 0, 0}, + { 2, 3, 4, 5, 0, 0, 0, 0}, + { 0, 2, 3, 4, 5, 0, 0, 0}, + { 1, 2, 3, 4, 5, 0, 0, 0}, + { 0, 1, 2, 3, 4, 5, 0, 0}, + { 6, 0, 0, 0, 0, 0, 0, 0}, + { 0, 6, 0, 0, 0, 0, 0, 0}, + { 1, 6, 0, 0, 0, 0, 0, 0}, + { 0, 1, 6, 0, 0, 0, 0, 0}, + { 2, 6, 0, 0, 0, 0, 0, 0}, + { 0, 2, 6, 0, 0, 0, 0, 0}, + { 1, 2, 6, 0, 0, 0, 0, 0}, + { 0, 1, 2, 6, 0, 0, 0, 0}, + { 3, 6, 0, 0, 0, 0, 0, 0}, + { 0, 3, 6, 0, 0, 0, 0, 0}, + { 1, 3, 6, 0, 0, 0, 0, 0}, + { 0, 1, 3, 6, 0, 0, 0, 0}, + { 2, 3, 6, 0, 0, 0, 0, 0}, + { 0, 2, 3, 6, 0, 0, 0, 0}, + { 1, 2, 3, 6, 0, 0, 0, 0}, + { 0, 1, 2, 3, 6, 0, 0, 0}, + { 4, 6, 0, 0, 0, 0, 0, 0}, + { 0, 4, 6, 0, 0, 0, 0, 0}, + { 1, 4, 6, 0, 0, 0, 0, 0}, + { 0, 1, 4, 6, 0, 0, 0, 0}, + { 2, 4, 6, 0, 0, 0, 0, 0}, + { 0, 2, 4, 6, 0, 0, 0, 0}, + { 1, 2, 4, 6, 0, 0, 0, 0}, + { 0, 1, 2, 4, 6, 0, 0, 0}, + { 3, 4, 6, 0, 0, 0, 0, 0}, + { 0, 3, 4, 6, 0, 0, 0, 0}, + { 1, 3, 4, 6, 0, 0, 0, 0}, + { 0, 1, 3, 4, 6, 0, 0, 0}, + { 2, 3, 4, 6, 0, 0, 0, 0}, + { 0, 2, 3, 4, 6, 0, 0, 0}, + { 1, 2, 3, 4, 6, 0, 0, 0}, + { 0, 1, 2, 3, 4, 6, 0, 0}, + { 5, 6, 0, 0, 0, 0, 0, 0}, + { 0, 5, 6, 0, 0, 0, 0, 0}, + { 1, 5, 6, 0, 0, 0, 0, 0}, + { 0, 1, 5, 6, 0, 0, 0, 0}, + { 2, 5, 6, 0, 0, 0, 0, 0}, + { 0, 2, 5, 6, 0, 0, 0, 0}, + { 1, 2, 5, 6, 0, 0, 0, 0}, + { 0, 1, 2, 5, 6, 0, 0, 0}, + { 3, 5, 6, 0, 0, 0, 0, 0}, + { 0, 3, 5, 6, 0, 0, 0, 0}, + { 1, 3, 5, 6, 0, 0, 0, 0}, + { 0, 1, 3, 5, 6, 0, 0, 0}, + { 2, 3, 5, 6, 0, 0, 0, 0}, + { 0, 2, 3, 5, 6, 0, 0, 0}, + { 1, 2, 3, 5, 6, 0, 0, 0}, + { 0, 1, 2, 3, 5, 6, 0, 0}, + { 4, 5, 6, 0, 0, 0, 0, 0}, + { 0, 4, 5, 6, 0, 0, 0, 0}, + { 1, 4, 5, 6, 0, 0, 0, 0}, + { 0, 1, 4, 5, 6, 0, 0, 0}, + { 2, 4, 5, 6, 0, 0, 0, 0}, + { 0, 2, 4, 5, 6, 0, 0, 0}, + { 1, 2, 4, 5, 6, 0, 0, 0}, + { 0, 1, 2, 4, 5, 6, 0, 0}, + { 3, 4, 5, 6, 0, 0, 0, 0}, + { 0, 3, 4, 5, 6, 0, 0, 0}, + { 1, 3, 4, 5, 6, 0, 0, 0}, + { 0, 1, 3, 4, 5, 6, 0, 0}, + { 2, 3, 4, 5, 6, 0, 0, 0}, + { 0, 2, 3, 4, 5, 6, 0, 0}, + { 1, 2, 3, 4, 5, 6, 0, 0}, + { 0, 1, 2, 3, 4, 5, 6, 0}, + { 7, 0, 0, 0, 0, 0, 0, 0}, + { 0, 7, 0, 0, 0, 0, 0, 0}, + { 1, 7, 0, 0, 0, 0, 0, 0}, + { 0, 1, 7, 0, 0, 0, 0, 0}, + { 2, 7, 0, 0, 0, 0, 0, 0}, + { 0, 2, 7, 0, 0, 0, 0, 0}, + { 1, 2, 7, 0, 0, 0, 0, 0}, + { 0, 1, 2, 7, 0, 0, 0, 0}, + { 3, 7, 0, 0, 0, 0, 0, 0}, + { 0, 3, 7, 0, 0, 0, 0, 0}, + { 1, 3, 7, 0, 0, 0, 0, 0}, + { 0, 1, 3, 7, 0, 0, 0, 0}, + { 2, 3, 7, 0, 0, 0, 0, 0}, + { 0, 2, 3, 7, 0, 0, 0, 0}, + { 1, 2, 3, 7, 0, 0, 0, 0}, + { 0, 1, 2, 3, 7, 0, 0, 0}, + { 4, 7, 0, 0, 0, 0, 0, 0}, + { 0, 4, 7, 0, 0, 0, 0, 0}, + { 1, 4, 7, 0, 0, 0, 0, 0}, + { 0, 1, 4, 7, 0, 0, 0, 0}, + { 2, 4, 7, 0, 0, 0, 0, 0}, + { 0, 2, 4, 7, 0, 0, 0, 0}, + { 1, 2, 4, 7, 0, 0, 0, 0}, + { 0, 1, 2, 4, 7, 0, 0, 0}, + { 3, 4, 7, 0, 0, 0, 0, 0}, + { 0, 3, 4, 7, 0, 0, 0, 0}, + { 1, 3, 4, 7, 0, 0, 0, 0}, + { 0, 1, 3, 4, 7, 0, 0, 0}, + { 2, 3, 4, 7, 0, 0, 0, 0}, + { 0, 2, 3, 4, 7, 0, 0, 0}, + { 1, 2, 3, 4, 7, 0, 0, 0}, + { 0, 1, 2, 3, 4, 7, 0, 0}, + { 5, 7, 0, 0, 0, 0, 0, 0}, + { 0, 5, 7, 0, 0, 0, 0, 0}, + { 1, 5, 7, 0, 0, 0, 0, 0}, + { 0, 1, 5, 7, 0, 0, 0, 0}, + { 2, 5, 7, 0, 0, 0, 0, 0}, + { 0, 2, 5, 7, 0, 0, 0, 0}, + { 1, 2, 5, 7, 0, 0, 0, 0}, + { 0, 1, 2, 5, 7, 0, 0, 0}, + { 3, 5, 7, 0, 0, 0, 0, 0}, + { 0, 3, 5, 7, 0, 0, 0, 0}, + { 1, 3, 5, 7, 0, 0, 0, 0}, + { 0, 1, 3, 5, 7, 0, 0, 0}, + { 2, 3, 5, 7, 0, 0, 0, 0}, + { 0, 2, 3, 5, 7, 0, 0, 0}, + { 1, 2, 3, 5, 7, 0, 0, 0}, + { 0, 1, 2, 3, 5, 7, 0, 0}, + { 4, 5, 7, 0, 0, 0, 0, 0}, + { 0, 4, 5, 7, 0, 0, 0, 0}, + { 1, 4, 5, 7, 0, 0, 0, 0}, + { 0, 1, 4, 5, 7, 0, 0, 0}, + { 2, 4, 5, 7, 0, 0, 0, 0}, + { 0, 2, 4, 5, 7, 0, 0, 0}, + { 1, 2, 4, 5, 7, 0, 0, 0}, + { 0, 1, 2, 4, 5, 7, 0, 0}, + { 3, 4, 5, 7, 0, 0, 0, 0}, + { 0, 3, 4, 5, 7, 0, 0, 0}, + { 1, 3, 4, 5, 7, 0, 0, 0}, + { 0, 1, 3, 4, 5, 7, 0, 0}, + { 2, 3, 4, 5, 7, 0, 0, 0}, + { 0, 2, 3, 4, 5, 7, 0, 0}, + { 1, 2, 3, 4, 5, 7, 0, 0}, + { 0, 1, 2, 3, 4, 5, 7, 0}, + { 6, 7, 0, 0, 0, 0, 0, 0}, + { 0, 6, 7, 0, 0, 0, 0, 0}, + { 1, 6, 7, 0, 0, 0, 0, 0}, + { 0, 1, 6, 7, 0, 0, 0, 0}, + { 2, 6, 7, 0, 0, 0, 0, 0}, + { 0, 2, 6, 7, 0, 0, 0, 0}, + { 1, 2, 6, 7, 0, 0, 0, 0}, + { 0, 1, 2, 6, 7, 0, 0, 0}, + { 3, 6, 7, 0, 0, 0, 0, 0}, + { 0, 3, 6, 7, 0, 0, 0, 0}, + { 1, 3, 6, 7, 0, 0, 0, 0}, + { 0, 1, 3, 6, 7, 0, 0, 0}, + { 2, 3, 6, 7, 0, 0, 0, 0}, + { 0, 2, 3, 6, 7, 0, 0, 0}, + { 1, 2, 3, 6, 7, 0, 0, 0}, + { 0, 1, 2, 3, 6, 7, 0, 0}, + { 4, 6, 7, 0, 0, 0, 0, 0}, + { 0, 4, 6, 7, 0, 0, 0, 0}, + { 1, 4, 6, 7, 0, 0, 0, 0}, + { 0, 1, 4, 6, 7, 0, 0, 0}, + { 2, 4, 6, 7, 0, 0, 0, 0}, + { 0, 2, 4, 6, 7, 0, 0, 0}, + { 1, 2, 4, 6, 7, 0, 0, 0}, + { 0, 1, 2, 4, 6, 7, 0, 0}, + { 3, 4, 6, 7, 0, 0, 0, 0}, + { 0, 3, 4, 6, 7, 0, 0, 0}, + { 1, 3, 4, 6, 7, 0, 0, 0}, + { 0, 1, 3, 4, 6, 7, 0, 0}, + { 2, 3, 4, 6, 7, 0, 0, 0}, + { 0, 2, 3, 4, 6, 7, 0, 0}, + { 1, 2, 3, 4, 6, 7, 0, 0}, + { 0, 1, 2, 3, 4, 6, 7, 0}, + { 5, 6, 7, 0, 0, 0, 0, 0}, + { 0, 5, 6, 7, 0, 0, 0, 0}, + { 1, 5, 6, 7, 0, 0, 0, 0}, + { 0, 1, 5, 6, 7, 0, 0, 0}, + { 2, 5, 6, 7, 0, 0, 0, 0}, + { 0, 2, 5, 6, 7, 0, 0, 0}, + { 1, 2, 5, 6, 7, 0, 0, 0}, + { 0, 1, 2, 5, 6, 7, 0, 0}, + { 3, 5, 6, 7, 0, 0, 0, 0}, + { 0, 3, 5, 6, 7, 0, 0, 0}, + { 1, 3, 5, 6, 7, 0, 0, 0}, + { 0, 1, 3, 5, 6, 7, 0, 0}, + { 2, 3, 5, 6, 7, 0, 0, 0}, + { 0, 2, 3, 5, 6, 7, 0, 0}, + { 1, 2, 3, 5, 6, 7, 0, 0}, + { 0, 1, 2, 3, 5, 6, 7, 0}, + { 4, 5, 6, 7, 0, 0, 0, 0}, + { 0, 4, 5, 6, 7, 0, 0, 0}, + { 1, 4, 5, 6, 7, 0, 0, 0}, + { 0, 1, 4, 5, 6, 7, 0, 0}, + { 2, 4, 5, 6, 7, 0, 0, 0}, + { 0, 2, 4, 5, 6, 7, 0, 0}, + { 1, 2, 4, 5, 6, 7, 0, 0}, + { 0, 1, 2, 4, 5, 6, 7, 0}, + { 3, 4, 5, 6, 7, 0, 0, 0}, + { 0, 3, 4, 5, 6, 7, 0, 0}, + { 1, 3, 4, 5, 6, 7, 0, 0}, + { 0, 1, 3, 4, 5, 6, 7, 0}, + { 2, 3, 4, 5, 6, 7, 0, 0}, + { 0, 2, 3, 4, 5, 6, 7, 0}, + { 1, 2, 3, 4, 5, 6, 7, 0}, + { 0, 1, 2, 3, 4, 5, 6, 7} +}; + +unsigned int rej_uniform_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]) +{ + unsigned int ctr, pos; + uint32_t good; + __m256i d, tmp; + const __m256i bound = _mm256_set1_epi32(Q); + const __m256i mask = _mm256_set1_epi32(0x7FFFFF); + const __m256i idx8 = _mm256_set_epi8(-1,15,14,13,-1,12,11,10, + -1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6, + -1, 5, 4, 3,-1, 2, 1, 0); + + ctr = pos = 0; + while(pos <= REJ_UNIFORM_BUFLEN - 24) { + d = _mm256_loadu_si256((__m256i *)&buf[pos]); + d = _mm256_permute4x64_epi64(d, 0x94); + d = _mm256_shuffle_epi8(d, idx8); + d = _mm256_and_si256(d, mask); + pos += 24; + + tmp = _mm256_sub_epi32(d, bound); + good = _mm256_movemask_ps((__m256)tmp); + tmp = _mm256_cvtepu8_epi32(_mm_loadl_epi64((__m128i *)&idxlut[good])); + d = _mm256_permutevar8x32_epi32(d, tmp); + + _mm256_storeu_si256((__m256i *)&r[ctr], d); + ctr += _mm_popcnt_u32(good); + + if(ctr > N - 8) break; + } + + uint32_t t; + while(ctr < N && pos <= REJ_UNIFORM_BUFLEN - 3) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + r[ctr++] = t; + } + + return ctr; +} + +#if ETA == 2 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1, f2; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(ETA); + const __m256i bound = mask; + const __m256i v = _mm256_set1_epi32(-6560); + const __m256i p = _mm256_set1_epi32(5); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + f2 = _mm256_mulhrs_epi16(f1,v); + f2 = _mm256_mullo_epi16(f2,p); + f1 = _mm256_add_epi32(f1,f2); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + r[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < N) { + t1 = t1 - (205*t1 >> 10)*5; + r[ctr++] = 2 - t1; + } + } + + return ctr; +} + +#elif ETA == 4 +unsigned int rej_eta_avx(int32_t * restrict r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]) { + unsigned int ctr, pos; + uint32_t good; + __m256i f0, f1; + __m128i g0, g1; + const __m256i mask = _mm256_set1_epi8(15); + const __m256i eta = _mm256_set1_epi8(4); + const __m256i bound = _mm256_set1_epi8(9); + + ctr = pos = 0; + while(ctr <= N - 8 && pos <= REJ_UNIFORM_ETA_BUFLEN - 16) { + f0 = _mm256_cvtepu8_epi16(_mm_loadu_si128((__m128i *)&buf[pos])); + f1 = _mm256_slli_epi16(f0,4); + f0 = _mm256_or_si256(f0,f1); + f0 = _mm256_and_si256(f0,mask); + + f1 = _mm256_sub_epi8(f0,bound); + f0 = _mm256_sub_epi8(eta,f0); + good = _mm256_movemask_epi8(f1); + + g0 = _mm256_castsi256_si128(f0); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm256_extracti128_si256(f0,1); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good & 0xFF]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good & 0xFF); + good >>= 8; + pos += 4; + + if(ctr > N - 8) break; + g0 = _mm_bsrli_si128(g0,8); + g1 = _mm_loadl_epi64((__m128i *)&idxlut[good]); + g1 = _mm_shuffle_epi8(g0,g1); + f1 = _mm256_cvtepi8_epi32(g1); + _mm256_storeu_si256((__m256i *)&r[ctr],f1); + ctr += _mm_popcnt_u32(good); + pos += 4; + } + + uint32_t t0, t1; + while(ctr < N && pos < REJ_UNIFORM_ETA_BUFLEN) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + + if(t0 < 9) + r[ctr++] = 4 - t0; + if(t1 < 9 && ctr < N) + r[ctr++] = 4 - t1; + } + + return ctr; +} +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.h new file mode 100644 index 000000000..61f3f357a --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.h @@ -0,0 +1,28 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_NBLOCKS ((768+STREAM128_BLOCKBYTES-1)/STREAM128_BLOCKBYTES) +#define REJ_UNIFORM_BUFLEN (REJ_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES) + +#if ETA == 2 +#define REJ_UNIFORM_ETA_NBLOCKS ((136+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define REJ_UNIFORM_ETA_NBLOCKS ((227+STREAM256_BLOCKBYTES-1)/STREAM256_BLOCKBYTES) +#endif +#define REJ_UNIFORM_ETA_BUFLEN (REJ_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES) + +#define idxlut DILITHIUM_NAMESPACE(idxlut) +extern const uint8_t idxlut[256][8]; + +#define rej_uniform_avx DILITHIUM_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_BUFLEN+8]); + +#define rej_eta_avx DILITHIUM_NAMESPACE(rej_eta_avx) +unsigned int rej_eta_avx(int32_t *r, const uint8_t buf[REJ_UNIFORM_ETA_BUFLEN]); + +#endif + diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c new file mode 100644 index 000000000..3ada65677 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include "params.h" +#include "rounding.h" +#include "rejsample.h" +#include "consts.h" + +#define _mm256_blendv_epi32(a,b,mask) \ + _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(a), \ + _mm256_castsi256_ps(b), \ + _mm256_castsi256_ps(mask))) + +/************************************************* +* Name: power2round +* +* Description: For finite field elements a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be positive standard representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high bits +* - __m256i *a0: output array of length N/8 with low bits a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i mask = _mm256_set1_epi32(-(1 << D)); + const __m256i half = _mm256_set1_epi32((1 << (D-1)) - 1); + + for(i = 0; i < N/8; ++i) { + f = _mm256_load_si256(&a[i]); + f1 = _mm256_add_epi32(f,half); + f0 = _mm256_and_si256(f1,mask); + f1 = _mm256_srli_epi32(f1,D); + f0 = _mm256_sub_epi32(f,f0); + _mm256_store_si256(&a1[i],f1); + _mm256_store_si256(&a0[i],f0); + } +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low parts a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod Q - Q < 0. Assumes a to be positive standard +* representative. +* +* Arguments: - __m256i *a1: output array of length N/8 with high parts +* - __m256i *a0: output array of length N/8 with low parts a0 +* - const __m256i *a: input array of length N/8 +* +**************************************************/ +#if GAMMA2 == (Q-1)/32 +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a) +{ + unsigned int i; + __m256i f,f0,f1; + const __m256i q = _mm256_load_si256(&qdata.vec[_8XQ/8]); + const __m256i hq = _mm256_srli_epi32(q,1); + const __m256i v = _mm256_set1_epi32(1025); + const __m256i alpha = _mm256_set1_epi32(2*GAMMA2); + const __m256i off = _mm256_set1_epi32(127); + const __m256i shift = _mm256_set1_epi32(512); + const __m256i mask = _mm256_set1_epi32(15); + + for(i=0;i +#include +#include "params.h" + +#define power2round_avx DILITHIUM_NAMESPACE(power2round_avx) +void power2round_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define decompose_avx DILITHIUM_NAMESPACE(decompose_avx) +void decompose_avx(__m256i *a1, __m256i *a0, const __m256i *a); +#define make_hint_avx DILITHIUM_NAMESPACE(make_hint_avx) +unsigned int make_hint_avx(uint8_t hint[N], const __m256i *a0, const __m256i *a1); +#define use_hint_avx DILITHIUM_NAMESPACE(use_hint_avx) +void use_hint_avx(__m256i *b, const __m256i *a, const __m256i *hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S new file mode 100644 index 000000000..133e05132 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S @@ -0,0 +1,52 @@ +#include "consts.h" +.include "shuffle.inc" + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +#store +vmovdqa %ymm9,(%rdi) +vmovdqa %ymm8,32(%rdi) +vmovdqa %ymm7,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm5,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm3,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.inc b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c new file mode 100644 index 000000000..a39f8515c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c @@ -0,0 +1,445 @@ +#include +#include +#include "align.h" +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +static inline void polyvec_matrix_expand_row(polyvecl **row, polyvecl buf[2], const uint8_t rho[SEEDBYTES], unsigned int i) { + switch(i) { + case 0: + polyvec_matrix_expand_row0(buf, buf + 1, rho); + *row = buf; + break; + case 1: + polyvec_matrix_expand_row1(buf + 1, buf, rho); + *row = buf + 1; + break; + case 2: + polyvec_matrix_expand_row2(buf, buf + 1, rho); + *row = buf; + break; + case 3: + polyvec_matrix_expand_row3(buf + 1, buf, rho); + *row = buf + 1; + break; +#if K > 4 + case 4: + polyvec_matrix_expand_row4(buf, buf + 1, rho); + *row = buf; + break; + case 5: + polyvec_matrix_expand_row5(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif +#if K > 6 + case 6: + polyvec_matrix_expand_row6(buf, buf + 1, rho); + *row = buf; + break; + case 7: + polyvec_matrix_expand_row7(buf + 1, buf, rho); + *row = buf + 1; + break; +#endif + } +} + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + unsigned int i; + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl rowbuf[2]; + polyvecl s1, *row = rowbuf; + polyveck s2; + poly t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Store rho, key */ + memcpy(pk, rho, SEEDBYTES); + memcpy(sk, rho, SEEDBYTES); + memcpy(sk + SEEDBYTES, key, SEEDBYTES); + + /* Sample short vectors s1 and s2 */ +#if K == 4 && L == 4 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s2.vec[0], &s2.vec[1], &s2.vec[2], &s2.vec[3], rhoprime, 4, 5, 6, 7); +#elif K == 6 && L == 5 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s2.vec[0], &s2.vec[1], &s2.vec[2], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[3], &s2.vec[4], &s2.vec[5], &t0, rhoprime, 8, 9, 10, 11); +#elif K == 8 && L == 7 + poly_uniform_eta_4x(&s1.vec[0], &s1.vec[1], &s1.vec[2], &s1.vec[3], rhoprime, 0, 1, 2, 3); + poly_uniform_eta_4x(&s1.vec[4], &s1.vec[5], &s1.vec[6], &s2.vec[0], rhoprime, 4, 5, 6, 7); + poly_uniform_eta_4x(&s2.vec[1], &s2.vec[2], &s2.vec[3], &s2.vec[4], rhoprime, 8, 9, 10, 11); + poly_uniform_eta_4x(&s2.vec[5], &s2.vec[6], &s2.vec[7], &t0, rhoprime, 12, 13, 14, 15); +#else +#error +#endif + + /* Pack secret vectors */ + for(i = 0; i < L; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + i*POLYETA_PACKEDBYTES, &s1.vec[i]); + for(i = 0; i < K; i++) + polyeta_pack(sk + 2*SEEDBYTES + TRBYTES + (L + i)*POLYETA_PACKEDBYTES, &s2.vec[i]); + + /* Transform s1 */ + polyvecl_ntt(&s1); + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, rho, i); + + /* Compute inner-product */ + polyvecl_pointwise_acc_montgomery(&t1, row, &s1); + poly_invntt_tomont(&t1); + + /* Add error polynomial */ + poly_add(&t1, &t1, &s2.vec[i]); + + /* Round t and pack t1, t0 */ + poly_caddq(&t1); + poly_power2round(&t1, &t0, &t1); + polyt1_pack(pk + SEEDBYTES + i*POLYT1_PACKEDBYTES, &t1); + polyt0_pack(sk + 2*SEEDBYTES + TRBYTES + (L+K)*POLYETA_PACKEDBYTES + i*POLYT0_PACKEDBYTES, &t0); + } + + /* Compute H(rho, t1) and store in secret key */ + shake256(sk + 2*SEEDBYTES, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + unsigned int i, n, pos; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *rnd, *mu, *rhoprime; + uint8_t hintbuf[N]; + uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + uint64_t nonce = 0; + polyvecl mat[K], s1, z; + polyveck t0, s2, w1; + poly c, tmp; + union { + polyvecl y; + polyveck w0; + } tmpv; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Compute CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + memset(rnd, 0, RNDBYTES); +#endif + shake256(rhoprime, CRHBYTES, key, SEEDBYTES + RNDBYTES + CRHBYTES); + + /* Expand matrix and transform vectors */ + polyvec_matrix_expand(mat, rho); + polyvecl_ntt(&s1); + polyveck_ntt(&s2); + polyveck_ntt(&t0); + +rej: + /* Sample intermediate vector y */ +#if L == 4 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + nonce += 4; +#elif L == 5 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1(&z.vec[4], rhoprime, nonce + 4); + nonce += 5; +#elif L == 7 + poly_uniform_gamma1_4x(&z.vec[0], &z.vec[1], &z.vec[2], &z.vec[3], + rhoprime, nonce, nonce + 1, nonce + 2, nonce + 3); + poly_uniform_gamma1_4x(&z.vec[4], &z.vec[5], &z.vec[6], &tmp, + rhoprime, nonce + 4, nonce + 5, nonce + 6, 0); + nonce += 7; +#else +#error +#endif + + /* Matrix-vector product */ + tmpv.y = z; + polyvecl_ntt(&tmpv.y); + polyvec_matrix_pointwise_montgomery(&w1, mat, &tmpv.y); + polyveck_invntt_tomont(&w1); + + /* Decompose w and call the random oracle */ + polyveck_caddq(&w1); + polyveck_decompose(&w1, &tmpv.w0, &w1); + polyveck_pack_w1(sig, &w1); + + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Compute z, reject if it reveals secret */ + for(i = 0; i < L; i++) { + poly_pointwise_montgomery(&tmp, &c, &s1.vec[i]); + poly_invntt_tomont(&tmp); + poly_add(&z.vec[i], &z.vec[i], &tmp); + poly_reduce(&z.vec[i]); + if(poly_chknorm(&z.vec[i], GAMMA1 - BETA)) + goto rej; + } + + /* Zero hint vector in signature */ + pos = 0; + memset(hint, 0, OMEGA); + + for(i = 0; i < K; i++) { + /* Check that subtracting cs2 does not change high bits of w and low bits + * do not reveal secret information */ + poly_pointwise_montgomery(&tmp, &c, &s2.vec[i]); + poly_invntt_tomont(&tmp); + poly_sub(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + poly_reduce(&tmpv.w0.vec[i]); + if(poly_chknorm(&tmpv.w0.vec[i], GAMMA2 - BETA)) + goto rej; + + /* Compute hints */ + poly_pointwise_montgomery(&tmp, &c, &t0.vec[i]); + poly_invntt_tomont(&tmp); + poly_reduce(&tmp); + if(poly_chknorm(&tmp, GAMMA2)) + goto rej; + + poly_add(&tmpv.w0.vec[i], &tmpv.w0.vec[i], &tmp); + n = poly_make_hint(hintbuf, &tmpv.w0.vec[i], &w1.vec[i]); + if(pos + n > OMEGA) + goto rej; + + /* Store hints in signature */ + memcpy(&hint[pos], hintbuf, n); + hint[OMEGA + i] = pos = pos + n; + } + + shake256_inc_ctx_release(&state); + /* Pack z into signature */ + for(i = 0; i < L; i++) + polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); + + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, const uint8_t *sk) { + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk) { + unsigned int i, j, pos = 0; + /* polyw1_pack writes additional 14 bytes */ + ALIGNED_UINT8(K*POLYW1_PACKEDBYTES+14) buf; + uint8_t mu[CRHBYTES]; + const uint8_t *hint = sig + CTILDEBYTES + L*POLYZ_PACKEDBYTES; + polyvecl rowbuf[2]; + polyvecl *row = rowbuf; + polyvecl z; + poly c, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + shake256_inc_ctx_release(&state); + + /* Expand challenge */ + poly_challenge(&c, sig); + poly_ntt(&c); + + /* Unpack z; shortness follows from unpacking */ + for(i = 0; i < L; i++) { + polyz_unpack(&z.vec[i], sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES); + poly_ntt(&z.vec[i]); + } + + for(i = 0; i < K; i++) { + /* Expand matrix row */ + polyvec_matrix_expand_row(&row, rowbuf, pk, i); + + /* Compute i-th row of Az - c2^Dt1 */ + polyvecl_pointwise_acc_montgomery(&w1, row, &z); + + polyt1_unpack(&h, pk + SEEDBYTES + i*POLYT1_PACKEDBYTES); + poly_shiftl(&h); + poly_ntt(&h); + poly_pointwise_montgomery(&h, &c, &h); + + poly_sub(&w1, &w1, &h); + poly_reduce(&w1); + poly_invntt_tomont(&w1); + + /* Get hint polynomial and reconstruct w1 */ + memset(h.vec, 0, sizeof(poly)); + if(hint[OMEGA + i] < pos || hint[OMEGA + i] > OMEGA) + return -1; + + for(j = pos; j < hint[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > pos && hint[j] <= hint[j-1]) return -1; + h.coeffs[hint[j]] = 1; + } + pos = hint[OMEGA + i]; + + poly_caddq(&w1); + poly_use_hint(&w1, &w1, &h); + polyw1_pack(buf.coeffs + i*POLYW1_PACKEDBYTES, &w1); + } + + /* Extra indices are zero for strong unforgeability */ + for(j = pos; j < OMEGA; ++j) + if(hint[j]) return -1; + + /* Call random oracle and verify challenge */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(buf.coeffs[i] != sig[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, const uint8_t *pk) { + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric.h new file mode 100644 index 000000000..fa49963ae --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric.h @@ -0,0 +1,28 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/LICENSE b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/LICENSE new file mode 100644 index 000000000..cddfe615c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/LICENSE @@ -0,0 +1,7 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and the random number generator +we are using public-domain code from sources +and by authors listed in comments on top of +the respective files. diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/api.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/api.h new file mode 100644 index 000000000..78caa5c72 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/api.h @@ -0,0 +1,88 @@ +#ifndef API_H +#define API_H + +#include +#include + +#define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 +#define pqcrystals_dilithium2_BYTES 2420 + +#define pqcrystals_dilithium2_ref_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +#define pqcrystals_dilithium2_ref_SECRETKEYBYTES pqcrystals_dilithium2_SECRETKEYBYTES +#define pqcrystals_dilithium2_ref_BYTES pqcrystals_dilithium2_BYTES + +int pqcrystals_dilithium2_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium2_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium2_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 + +#define pqcrystals_dilithium3_ref_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES +#define pqcrystals_dilithium3_ref_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +#define pqcrystals_dilithium3_ref_BYTES pqcrystals_dilithium3_BYTES + +int pqcrystals_dilithium3_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium3_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium3_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 + +#define pqcrystals_dilithium5_ref_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES +#define pqcrystals_dilithium5_ref_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES +#define pqcrystals_dilithium5_ref_BYTES pqcrystals_dilithium5_BYTES + +int pqcrystals_dilithium5_ref_keypair(uint8_t *pk, uint8_t *sk); + +int pqcrystals_dilithium5_ref_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +int pqcrystals_dilithium5_ref_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +int pqcrystals_dilithium5_ref_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/config.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/config.h new file mode 100644 index 000000000..eddf13f5e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/config.h @@ -0,0 +1,27 @@ +#ifndef CONFIG_H +#define CONFIG_H + +//#define DILITHIUM_MODE 2 +#define DILITHIUM_RANDOMIZED_SIGNING +//#define USE_RDPMC +//#define DBENCH + +#ifndef DILITHIUM_MODE +#define DILITHIUM_MODE 2 +#endif + +#if DILITHIUM_MODE == 2 +#define CRYPTO_ALGNAME "ML-DSA-44-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_ref_##s +#elif DILITHIUM_MODE == 3 +#define CRYPTO_ALGNAME "ML-DSA-65-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_ref_##s +#elif DILITHIUM_MODE == 5 +#define CRYPTO_ALGNAME "ML-DSA-87-ipd" +#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_ref +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_ref_##s +#endif + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c new file mode 100644 index 000000000..5ea8b530e --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c @@ -0,0 +1,98 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +static const int32_t zetas[N] = { + 0, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, + 2725464, 1024112, -1079900, 3585928, -549488, -1119584, 2619752, -2108549, + -2118186, -3859737, -1399561, -3277672, 1757237, -19422, 4010497, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -1528703, -3677745, -3041255, -1452451, 3475950, 2176455, -1585221, + -1257611, 1939314, -4083598, -1000202, -3190144, -3157330, -3632928, 126922, + 3412210, -983419, 2147896, 2715295, -2967645, -3693493, -411027, -2477047, + -671102, -1228525, -22981, -1308169, -381987, 1349076, 1852771, -1430430, + -3343383, 264944, 508951, 3097992, 44288, -1100098, 904516, 3958618, + -3724342, -8578, 1653064, -3249728, 2389356, -210977, 759969, -1316856, + 189548, -3553272, 3159746, -1851402, -2409325, -177440, 1315589, 1341330, + 1285669, -1584928, -812732, -1439742, -3019102, -3881060, -3628969, 3839961, + 2091667, 3407706, 2316500, 3817976, -3342478, 2244091, -2446433, -3562462, + 266997, 2434439, -1235728, 3513181, -3520352, -3759364, -1197226, -3193378, + 900702, 1859098, 909542, 819034, 495491, -1613174, -43260, -522500, + -655327, -3122442, 2031748, 3207046, -3556995, -525098, -768622, -3595838, + 342297, 286988, -2437823, 4108315, 3437287, -3342277, 1735879, 203044, + 2842341, 2691481, -2590150, 1265009, 4055324, 1247620, 2486353, 1595974, + -3767016, 1250494, 2635921, -3548272, -2994039, 1869119, 1903435, -1050970, + -1333058, 1237275, -3318210, -1430225, -451100, 1312455, 3306115, -1962642, + -1279661, 1917081, -2546312, -1374803, 1500165, 777191, 2235880, 3406031, + -542412, -2831860, -1671176, -1846953, -2584293, -3724270, 594136, -3776993, + -2013608, 2432395, 2454455, -164721, 1957272, 3369112, 185531, -1207385, + -3183426, 162844, 1616392, 3014001, 810149, 1652634, -3694233, -1799107, + -3038916, 3523897, 3866901, 269760, 2213111, -975884, 1717735, 472078, + -426683, 1723600, -1803090, 1910376, -1667432, -1104333, -260646, -3833893, + -2939036, -2235985, -420899, -2286327, 183443, -976891, 1612842, -3545687, + -554416, 3919660, -48306, -1362209, 3937738, 1400424, -846154, 1976782 +}; + +/************************************************* +* Name: ntt +* +* Description: Forward NTT, in-place. No modular reduction is performed after +* additions or subtractions. Output vector is in bitreversed order. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void ntt(int32_t a[N]) { + unsigned int len, start, j, k; + int32_t zeta, t; + + k = 0; + for(len = 128; len > 0; len >>= 1) { + for(start = 0; start < N; start = j + len) { + zeta = zetas[++k]; + for(j = start; j < start + len; ++j) { + t = montgomery_reduce((int64_t)zeta * a[j + len]); + a[j + len] = a[j] - t; + a[j] = a[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inverse NTT and multiplication by Montgomery factor 2^32. +* In-place. No modular reductions after additions or +* subtractions; input coefficients need to be smaller than +* Q in absolute value. Output coefficient are smaller than Q in +* absolute value. +* +* Arguments: - uint32_t p[N]: input/output coefficient array +**************************************************/ +void invntt_tomont(int32_t a[N]) { + unsigned int start, len, j, k; + int32_t t, zeta; + const int32_t f = 41978; // mont^2/256 + + k = 256; + for(len = 1; len < N; len <<= 1) { + for(start = 0; start < N; start = j + len) { + zeta = -zetas[--k]; + for(j = start; j < start + len; ++j) { + t = a[j]; + a[j] = t + a[j + len]; + a[j + len] = t - a[j + len]; + a[j + len] = montgomery_reduce((int64_t)zeta * a[j + len]); + } + } + } + + for(j = 0; j < N; ++j) { + a[j] = montgomery_reduce((int64_t)f * a[j]); + } +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.h new file mode 100644 index 000000000..731132d5c --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.h @@ -0,0 +1,13 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define ntt DILITHIUM_NAMESPACE(ntt) +void ntt(int32_t a[N]); + +#define invntt_tomont DILITHIUM_NAMESPACE(invntt_tomont) +void invntt_tomont(int32_t a[N]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c new file mode 100644 index 000000000..039a686da --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c @@ -0,0 +1,237 @@ +#include "params.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: pack_pk +* +* Description: Bit-pack public key pk = (rho, t1). +* +* Arguments: - uint8_t pk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const polyveck *t1: pointer to vector t1 +**************************************************/ +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], + const uint8_t rho[SEEDBYTES], + const polyveck *t1) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + pk[i] = rho[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_pack(pk + i*POLYT1_PACKEDBYTES, &t1->vec[i]); +} + +/************************************************* +* Name: unpack_pk +* +* Description: Unpack public key pk = (rho, t1). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const polyveck *t1: pointer to output vector t1 +* - uint8_t pk[]: byte array containing bit-packed pk +**************************************************/ +void unpack_pk(uint8_t rho[SEEDBYTES], + polyveck *t1, + const uint8_t pk[CRYPTO_PUBLICKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = pk[i]; + pk += SEEDBYTES; + + for(i = 0; i < K; ++i) + polyt1_unpack(&t1->vec[i], pk + i*POLYT1_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Bit-pack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - uint8_t sk[]: output byte array +* - const uint8_t rho[]: byte array containing rho +* - const uint8_t tr[]: byte array containing tr +* - const uint8_t key[]: byte array containing key +* - const polyveck *t0: pointer to vector t0 +* - const polyvecl *s1: pointer to vector s1 +* - const polyveck *s2: pointer to vector s2 +**************************************************/ +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = rho[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + sk[i] = key[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + sk[i] = tr[i]; + sk += TRBYTES; + + for(i = 0; i < L; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s1->vec[i]); + sk += L*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyeta_pack(sk + i*POLYETA_PACKEDBYTES, &s2->vec[i]); + sk += K*POLYETA_PACKEDBYTES; + + for(i = 0; i < K; ++i) + polyt0_pack(sk + i*POLYT0_PACKEDBYTES, &t0->vec[i]); +} + +/************************************************* +* Name: unpack_sk +* +* Description: Unpack secret key sk = (rho, tr, key, t0, s1, s2). +* +* Arguments: - const uint8_t rho[]: output byte array for rho +* - const uint8_t tr[]: output byte array for tr +* - const uint8_t key[]: output byte array for key +* - const polyveck *t0: pointer to output vector t0 +* - const polyvecl *s1: pointer to output vector s1 +* - const polyveck *s2: pointer to output vector s2 +* - uint8_t sk[]: byte array containing bit-packed sk +**************************************************/ +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]) +{ + unsigned int i; + + for(i = 0; i < SEEDBYTES; ++i) + rho[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < SEEDBYTES; ++i) + key[i] = sk[i]; + sk += SEEDBYTES; + + for(i = 0; i < TRBYTES; ++i) + tr[i] = sk[i]; + sk += TRBYTES; + + for(i=0; i < L; ++i) + polyeta_unpack(&s1->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += L*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyeta_unpack(&s2->vec[i], sk + i*POLYETA_PACKEDBYTES); + sk += K*POLYETA_PACKEDBYTES; + + for(i=0; i < K; ++i) + polyt0_unpack(&t0->vec[i], sk + i*POLYT0_PACKEDBYTES); +} + +/************************************************* +* Name: pack_sig +* +* Description: Bit-pack signature sig = (c, z, h). +* +* Arguments: - uint8_t sig[]: output byte array +* - const uint8_t *c: pointer to challenge hash length SEEDBYTES +* - const polyvecl *z: pointer to vector z +* - const polyveck *h: pointer to hint vector h +**************************************************/ +void pack_sig(uint8_t sig[CRYPTO_BYTES], + const uint8_t c[CTILDEBYTES], + const polyvecl *z, + const polyveck *h) +{ + unsigned int i, j, k; + + for(i=0; i < CTILDEBYTES; ++i) + sig[i] = c[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_pack(sig + i*POLYZ_PACKEDBYTES, &z->vec[i]); + sig += L*POLYZ_PACKEDBYTES; + + /* Encode h */ + for(i = 0; i < OMEGA + K; ++i) + sig[i] = 0; + + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + if(h->vec[i].coeffs[j] != 0) + sig[k++] = j; + + sig[OMEGA + i] = k; + } +} + +/************************************************* +* Name: unpack_sig +* +* Description: Unpack signature sig = (c, z, h). +* +* Arguments: - uint8_t *c: pointer to output challenge hash +* - polyvecl *z: pointer to output vector z +* - polyveck *h: pointer to output hint vector h +* - const uint8_t sig[]: byte array containing +* bit-packed signature +* +* Returns 1 in case of malformed signature; otherwise 0. +**************************************************/ +int unpack_sig(uint8_t c[CTILDEBYTES], + polyvecl *z, + polyveck *h, + const uint8_t sig[CRYPTO_BYTES]) +{ + unsigned int i, j, k; + + for(i = 0; i < CTILDEBYTES; ++i) + c[i] = sig[i]; + sig += CTILDEBYTES; + + for(i = 0; i < L; ++i) + polyz_unpack(&z->vec[i], sig + i*POLYZ_PACKEDBYTES); + sig += L*POLYZ_PACKEDBYTES; + + /* Decode h */ + k = 0; + for(i = 0; i < K; ++i) { + for(j = 0; j < N; ++j) + h->vec[i].coeffs[j] = 0; + + if(sig[OMEGA + i] < k || sig[OMEGA + i] > OMEGA) + return 1; + + for(j = k; j < sig[OMEGA + i]; ++j) { + /* Coefficients are ordered for strong unforgeability */ + if(j > k && sig[j] <= sig[j-1]) return 1; + h->vec[i].coeffs[sig[j]] = 1; + } + + k = sig[OMEGA + i]; + } + + /* Extra indices are zero for strong unforgeability */ + for(j = k; j < OMEGA; ++j) + if(sig[j]) + return 1; + + return 0; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.h new file mode 100644 index 000000000..8e47728ce --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.h @@ -0,0 +1,38 @@ +#ifndef PACKING_H +#define PACKING_H + +#include +#include "params.h" +#include "polyvec.h" + +#define pack_pk DILITHIUM_NAMESPACE(pack_pk) +void pack_pk(uint8_t pk[CRYPTO_PUBLICKEYBYTES], const uint8_t rho[SEEDBYTES], const polyveck *t1); + +#define pack_sk DILITHIUM_NAMESPACE(pack_sk) +void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const uint8_t rho[SEEDBYTES], + const uint8_t tr[TRBYTES], + const uint8_t key[SEEDBYTES], + const polyveck *t0, + const polyvecl *s1, + const polyveck *s2); + +#define pack_sig DILITHIUM_NAMESPACE(pack_sig) +void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + +#define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) +void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); + +#define unpack_sk DILITHIUM_NAMESPACE(unpack_sk) +void unpack_sk(uint8_t rho[SEEDBYTES], + uint8_t tr[TRBYTES], + uint8_t key[SEEDBYTES], + polyveck *t0, + polyvecl *s1, + polyveck *s2, + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + +#define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/params.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/params.h new file mode 100644 index 000000000..1e8a7b505 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/params.h @@ -0,0 +1,80 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#include "config.h" + +#define SEEDBYTES 32 +#define CRHBYTES 64 +#define TRBYTES 64 +#define RNDBYTES 32 +#define N 256 +#define Q 8380417 +#define D 13 +#define ROOT_OF_UNITY 1753 + +#if DILITHIUM_MODE == 2 +#define K 4 +#define L 4 +#define ETA 2 +#define TAU 39 +#define BETA 78 +#define GAMMA1 (1 << 17) +#define GAMMA2 ((Q-1)/88) +#define OMEGA 80 +#define CTILDEBYTES 32 + +#elif DILITHIUM_MODE == 3 +#define K 6 +#define L 5 +#define ETA 4 +#define TAU 49 +#define BETA 196 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 55 +#define CTILDEBYTES 48 + +#elif DILITHIUM_MODE == 5 +#define K 8 +#define L 7 +#define ETA 2 +#define TAU 60 +#define BETA 120 +#define GAMMA1 (1 << 19) +#define GAMMA2 ((Q-1)/32) +#define OMEGA 75 +#define CTILDEBYTES 64 + +#endif + +#define POLYT1_PACKEDBYTES 320 +#define POLYT0_PACKEDBYTES 416 +#define POLYVECH_PACKEDBYTES (OMEGA + K) + +#if GAMMA1 == (1 << 17) +#define POLYZ_PACKEDBYTES 576 +#elif GAMMA1 == (1 << 19) +#define POLYZ_PACKEDBYTES 640 +#endif + +#if GAMMA2 == (Q-1)/88 +#define POLYW1_PACKEDBYTES 192 +#elif GAMMA2 == (Q-1)/32 +#define POLYW1_PACKEDBYTES 128 +#endif + +#if ETA == 2 +#define POLYETA_PACKEDBYTES 96 +#elif ETA == 4 +#define POLYETA_PACKEDBYTES 128 +#endif + +#define CRYPTO_PUBLICKEYBYTES (SEEDBYTES + K*POLYT1_PACKEDBYTES) +#define CRYPTO_SECRETKEYBYTES (2*SEEDBYTES \ + + TRBYTES \ + + L*POLYETA_PACKEDBYTES \ + + K*POLYETA_PACKEDBYTES \ + + K*POLYT0_PACKEDBYTES) +#define CRYPTO_BYTES (CTILDEBYTES + L*POLYZ_PACKEDBYTES + POLYVECH_PACKEDBYTES) + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c new file mode 100644 index 000000000..d44063fee --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c @@ -0,0 +1,911 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "rounding.h" +#include "symmetric.h" + +#ifdef DBENCH +#include "test/cpucycles.h" +extern const uint64_t timing_overhead; +extern uint64_t *tred, *tadd, *tmul, *tround, *tsample, *tpack; +#define DBENCH_START() uint64_t time = cpucycles() +#define DBENCH_STOP(t) t += cpucycles() - time - timing_overhead +#else +#define DBENCH_START() +#define DBENCH_STOP(t) +#endif + +/************************************************* +* Name: poly_reduce +* +* Description: Inplace reduction of all coefficients of polynomial to +* representative in [-6283009,6283007]. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = reduce32(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_caddq +* +* Description: For all coefficients of in/out polynomial add Q if +* coefficient is negative. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_caddq(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] = caddq(a->coeffs[i]); + + DBENCH_STOP(*tred); +} + +/************************************************* +* Name: poly_add +* +* Description: Add polynomials. No modular reduction is performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first summand +* - const poly *b: pointer to second summand +**************************************************/ +void poly_add(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] + b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract polynomials. No modular reduction is +* performed. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial to be +* subtraced from first input polynomial +**************************************************/ +void poly_sub(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = a->coeffs[i] - b->coeffs[i]; + + DBENCH_STOP(*tadd); +} + +/************************************************* +* Name: poly_shiftl +* +* Description: Multiply polynomial by 2^D without modular reduction. Assumes +* input coefficients to be less than 2^{31-D} in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_shiftl(poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a->coeffs[i] <<= D; + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_ntt +* +* Description: Inplace forward NTT. Coefficients can grow by +* 8*Q in absolute value. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_ntt(poly *a) { + DBENCH_START(); + + ntt(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Inplace inverse NTT and multiplication by 2^{32}. +* Input coefficients need to be less than Q in absolute +* value and output coefficients are again bounded by Q. +* +* Arguments: - poly *a: pointer to input/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *a) { + DBENCH_START(); + + invntt_tomont(a->coeffs); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_pointwise_montgomery +* +* Description: Pointwise multiplication of polynomials in NTT domain +* representation and multiplication of resulting polynomial +* by 2^{-32}. +* +* Arguments: - poly *c: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + c->coeffs[i] = montgomery_reduce((int64_t)a->coeffs[i] * b->coeffs[i]); + + DBENCH_STOP(*tmul); +} + +/************************************************* +* Name: poly_power2round +* +* Description: For all coefficients c of the input polynomial, +* compute c0, c1 such that c mod Q = c1*2^D + c0 +* with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_power2round(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = power2round(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_decompose +* +* Description: For all coefficients c of the input polynomial, +* compute high and low bits c0, c1 such c mod Q = c1*ALPHA + c0 +* with -ALPHA/2 < c0 <= ALPHA/2 except c1 = (Q-1)/ALPHA where we +* set c1 = 0 and -ALPHA/2 <= c0 = c mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - poly *a1: pointer to output polynomial with coefficients c1 +* - poly *a0: pointer to output polynomial with coefficients c0 +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_decompose(poly *a1, poly *a0, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + a1->coeffs[i] = decompose(&a0->coeffs[i], a->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_make_hint +* +* Description: Compute hint polynomial. The coefficients of which indicate +* whether the low bits of the corresponding coefficient of +* the input polynomial overflow into the high bits. +* +* Arguments: - poly *h: pointer to output hint polynomial +* - const poly *a0: pointer to low part of input polynomial +* - const poly *a1: pointer to high part of input polynomial +* +* Returns number of 1 bits. +**************************************************/ +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1) { + unsigned int i, s = 0; + DBENCH_START(); + + for(i = 0; i < N; ++i) { + h->coeffs[i] = make_hint(a0->coeffs[i], a1->coeffs[i]); + s += h->coeffs[i]; + } + + DBENCH_STOP(*tround); + return s; +} + +/************************************************* +* Name: poly_use_hint +* +* Description: Use hint polynomial to correct the high bits of a polynomial. +* +* Arguments: - poly *b: pointer to output polynomial with corrected high bits +* - const poly *a: pointer to input polynomial +* - const poly *h: pointer to input hint polynomial +**************************************************/ +void poly_use_hint(poly *b, const poly *a, const poly *h) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N; ++i) + b->coeffs[i] = use_hint(a->coeffs[i], h->coeffs[i]); + + DBENCH_STOP(*tround); +} + +/************************************************* +* Name: poly_chknorm +* +* Description: Check infinity norm of polynomial against given bound. +* Assumes input coefficients were reduced by reduce32(). +* +* Arguments: - const poly *a: pointer to polynomial +* - int32_t B: norm bound +* +* Returns 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise. +**************************************************/ +int poly_chknorm(const poly *a, int32_t B) { + unsigned int i; + int32_t t; + DBENCH_START(); + + if(B > (Q-1)/8) + return 1; + + /* It is ok to leak which coefficient violates the bound since + the probability for each coefficient is independent of secret + data but we must not leak the sign of the centralized representative. */ + for(i = 0; i < N; ++i) { + /* Absolute value */ + t = a->coeffs[i] >> 31; + t = a->coeffs[i] - (t & 2*a->coeffs[i]); + + if(t >= B) { + DBENCH_STOP(*tsample); + return 1; + } + } + + DBENCH_STOP(*tsample); + return 0; +} + +/************************************************* +* Name: rej_uniform +* +* Description: Sample uniformly random coefficients in [0, Q-1] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_uniform(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + t = buf[pos++]; + t |= (uint32_t)buf[pos++] << 8; + t |= (uint32_t)buf[pos++] << 16; + t &= 0x7FFFFF; + + if(t < Q) + a[ctr++] = t; + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform +* +* Description: Sample polynomial with uniformly random coefficients +* in [0,Q-1] by performing rejection sampling on the +* output stream of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length SEEDBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#define POLY_UNIFORM_NBLOCKS ((768 + STREAM128_BLOCKBYTES - 1)/STREAM128_BLOCKBYTES) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce) +{ + unsigned int i, ctr, off; + unsigned int buflen = POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES + 2]; + stream128_state state; + + stream128_init(&state, seed, nonce); + stream128_squeezeblocks(buf, POLY_UNIFORM_NBLOCKS, &state); + + ctr = rej_uniform(a->coeffs, N, buf, buflen); + + while(ctr < N) { + off = buflen % 3; + for(i = 0; i < off; ++i) + buf[i] = buf[buflen - off + i]; + + stream128_squeezeblocks(buf + off, 1, &state); + buflen = STREAM128_BLOCKBYTES + off; + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); + } + stream128_release(&state); +} + +/************************************************* +* Name: rej_eta +* +* Description: Sample uniformly random coefficients in [-ETA, ETA] by +* performing rejection sampling on array of random bytes. +* +* Arguments: - int32_t *a: pointer to output array (allocated) +* - unsigned int len: number of coefficients to be sampled +* - const uint8_t *buf: array of random bytes +* - unsigned int buflen: length of array of random bytes +* +* Returns number of sampled coefficients. Can be smaller than len if not enough +* random bytes were given. +**************************************************/ +static unsigned int rej_eta(int32_t *a, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint32_t t0, t1; + DBENCH_START(); + + ctr = pos = 0; + while(ctr < len && pos < buflen) { + t0 = buf[pos] & 0x0F; + t1 = buf[pos++] >> 4; + +#if ETA == 2 + if(t0 < 15) { + t0 = t0 - (205*t0 >> 10)*5; + a[ctr++] = 2 - t0; + } + if(t1 < 15 && ctr < len) { + t1 = t1 - (205*t1 >> 10)*5; + a[ctr++] = 2 - t1; + } +#elif ETA == 4 + if(t0 < 9) + a[ctr++] = 4 - t0; + if(t1 < 9 && ctr < len) + a[ctr++] = 4 - t1; +#endif + } + + DBENCH_STOP(*tsample); + return ctr; +} + +/************************************************* +* Name: poly_uniform_eta +* +* Description: Sample polynomial with uniformly random coefficients +* in [-ETA,ETA] by performing rejection sampling on the +* output stream from SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 2-byte nonce +**************************************************/ +#if ETA == 2 +#define POLY_UNIFORM_ETA_NBLOCKS ((136 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#elif ETA == 4 +#define POLY_UNIFORM_ETA_NBLOCKS ((227 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +#endif +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + unsigned int ctr; + unsigned int buflen = POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES; + uint8_t buf[POLY_UNIFORM_ETA_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_ETA_NBLOCKS, &state); + + ctr = rej_eta(a->coeffs, N, buf, buflen); + + while(ctr < N) { + stream256_squeezeblocks(buf, 1, &state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); + } + stream256_release(&state); +} + +/************************************************* +* Name: poly_uniform_gamma1m1 +* +* Description: Sample polynomial with uniformly random coefficients +* in [-(GAMMA1 - 1), GAMMA1] by unpacking output stream +* of SHAKE256(seed|nonce) +* +* Arguments: - poly *a: pointer to output polynomial +* - const uint8_t seed[]: byte array with seed of length CRHBYTES +* - uint16_t nonce: 16-bit nonce +**************************************************/ +#define POLY_UNIFORM_GAMMA1_NBLOCKS ((POLYZ_PACKEDBYTES + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce) +{ + uint8_t buf[POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES]; + stream256_state state; + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); + stream256_release(&state); + polyz_unpack(a, buf); +} + +/************************************************* +* Name: challenge +* +* Description: Implementation of H. Samples polynomial with TAU nonzero +* coefficients in {-1,1} using the output stream of +* SHAKE256(seed). +* +* Arguments: - poly *c: pointer to output polynomial +* - const uint8_t mu[]: byte array containing seed of length SEEDBYTES +**************************************************/ +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + uint8_t buf[SHAKE256_RATE]; + shake256incctx state; + + shake256_inc_init(&state); + shake256_inc_absorb(&state, seed, SEEDBYTES); + shake256_inc_finalize(&state); + shake256_squeezeblocks(buf, 1, &state); + + signs = 0; + for(i = 0; i < 8; ++i) + signs |= (uint64_t)buf[i] << 8*i; + pos = 8; + + for(i = 0; i < N; ++i) + c->coeffs[i] = 0; + for(i = N-TAU; i < N; ++i) { + do { + if(pos >= SHAKE256_RATE) { + shake256_squeezeblocks(buf, 1, &state); + pos = 0; + } + + b = buf[pos++]; + } while(b > i); + + c->coeffs[i] = c->coeffs[b]; + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } + shake256_inc_ctx_release(&state); +} + +/************************************************* +* Name: polyeta_pack +* +* Description: Bit-pack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYETA_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyeta_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint8_t t[8]; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + t[0] = ETA - a->coeffs[8*i+0]; + t[1] = ETA - a->coeffs[8*i+1]; + t[2] = ETA - a->coeffs[8*i+2]; + t[3] = ETA - a->coeffs[8*i+3]; + t[4] = ETA - a->coeffs[8*i+4]; + t[5] = ETA - a->coeffs[8*i+5]; + t[6] = ETA - a->coeffs[8*i+6]; + t[7] = ETA - a->coeffs[8*i+7]; + + r[3*i+0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6); + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7); + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5); + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + t[0] = ETA - a->coeffs[2*i+0]; + t[1] = ETA - a->coeffs[2*i+1]; + r[i] = t[0] | (t[1] << 4); + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyeta_unpack +* +* Description: Unpack polynomial with coefficients in [-ETA,ETA]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyeta_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if ETA == 2 + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = (a[3*i+0] >> 0) & 7; + r->coeffs[8*i+1] = (a[3*i+0] >> 3) & 7; + r->coeffs[8*i+2] = ((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7; + r->coeffs[8*i+3] = (a[3*i+1] >> 1) & 7; + r->coeffs[8*i+4] = (a[3*i+1] >> 4) & 7; + r->coeffs[8*i+5] = ((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7; + r->coeffs[8*i+6] = (a[3*i+2] >> 2) & 7; + r->coeffs[8*i+7] = (a[3*i+2] >> 5) & 7; + + r->coeffs[8*i+0] = ETA - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = ETA - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = ETA - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = ETA - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = ETA - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = ETA - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = ETA - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = ETA - r->coeffs[8*i+7]; + } +#elif ETA == 4 + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[i] & 0x0F; + r->coeffs[2*i+1] = a[i] >> 4; + r->coeffs[2*i+0] = ETA - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = ETA - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_pack +* +* Description: Bit-pack polynomial t1 with coefficients fitting in 10 bits. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r[5*i+0] = (a->coeffs[4*i+0] >> 0); + r[5*i+1] = (a->coeffs[4*i+0] >> 8) | (a->coeffs[4*i+1] << 2); + r[5*i+2] = (a->coeffs[4*i+1] >> 6) | (a->coeffs[4*i+2] << 4); + r[5*i+3] = (a->coeffs[4*i+2] >> 4) | (a->coeffs[4*i+3] << 6); + r[5*i+4] = (a->coeffs[4*i+3] >> 2); + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt1_unpack +* +* Description: Unpack polynomial t1 with 10-bit coefficients. +* Output coefficients are standard representatives. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt1_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = ((a[5*i+0] >> 0) | ((uint32_t)a[5*i+1] << 8)) & 0x3FF; + r->coeffs[4*i+1] = ((a[5*i+1] >> 2) | ((uint32_t)a[5*i+2] << 6)) & 0x3FF; + r->coeffs[4*i+2] = ((a[5*i+2] >> 4) | ((uint32_t)a[5*i+3] << 4)) & 0x3FF; + r->coeffs[4*i+3] = ((a[5*i+3] >> 6) | ((uint32_t)a[5*i+4] << 2)) & 0x3FF; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_pack +* +* Description: Bit-pack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYT0_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyt0_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[8]; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + t[0] = (1 << (D-1)) - a->coeffs[8*i+0]; + t[1] = (1 << (D-1)) - a->coeffs[8*i+1]; + t[2] = (1 << (D-1)) - a->coeffs[8*i+2]; + t[3] = (1 << (D-1)) - a->coeffs[8*i+3]; + t[4] = (1 << (D-1)) - a->coeffs[8*i+4]; + t[5] = (1 << (D-1)) - a->coeffs[8*i+5]; + t[6] = (1 << (D-1)) - a->coeffs[8*i+6]; + t[7] = (1 << (D-1)) - a->coeffs[8*i+7]; + + r[13*i+ 0] = t[0]; + r[13*i+ 1] = t[0] >> 8; + r[13*i+ 1] |= t[1] << 5; + r[13*i+ 2] = t[1] >> 3; + r[13*i+ 3] = t[1] >> 11; + r[13*i+ 3] |= t[2] << 2; + r[13*i+ 4] = t[2] >> 6; + r[13*i+ 4] |= t[3] << 7; + r[13*i+ 5] = t[3] >> 1; + r[13*i+ 6] = t[3] >> 9; + r[13*i+ 6] |= t[4] << 4; + r[13*i+ 7] = t[4] >> 4; + r[13*i+ 8] = t[4] >> 12; + r[13*i+ 8] |= t[5] << 1; + r[13*i+ 9] = t[5] >> 7; + r[13*i+ 9] |= t[6] << 6; + r[13*i+10] = t[6] >> 2; + r[13*i+11] = t[6] >> 10; + r[13*i+11] |= t[7] << 3; + r[13*i+12] = t[7] >> 5; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyt0_unpack +* +* Description: Unpack polynomial t0 with coefficients in ]-2^{D-1}, 2^{D-1}]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyt0_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + + for(i = 0; i < N/8; ++i) { + r->coeffs[8*i+0] = a[13*i+0]; + r->coeffs[8*i+0] |= (uint32_t)a[13*i+1] << 8; + r->coeffs[8*i+0] &= 0x1FFF; + + r->coeffs[8*i+1] = a[13*i+1] >> 5; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+2] << 3; + r->coeffs[8*i+1] |= (uint32_t)a[13*i+3] << 11; + r->coeffs[8*i+1] &= 0x1FFF; + + r->coeffs[8*i+2] = a[13*i+3] >> 2; + r->coeffs[8*i+2] |= (uint32_t)a[13*i+4] << 6; + r->coeffs[8*i+2] &= 0x1FFF; + + r->coeffs[8*i+3] = a[13*i+4] >> 7; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+5] << 1; + r->coeffs[8*i+3] |= (uint32_t)a[13*i+6] << 9; + r->coeffs[8*i+3] &= 0x1FFF; + + r->coeffs[8*i+4] = a[13*i+6] >> 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+7] << 4; + r->coeffs[8*i+4] |= (uint32_t)a[13*i+8] << 12; + r->coeffs[8*i+4] &= 0x1FFF; + + r->coeffs[8*i+5] = a[13*i+8] >> 1; + r->coeffs[8*i+5] |= (uint32_t)a[13*i+9] << 7; + r->coeffs[8*i+5] &= 0x1FFF; + + r->coeffs[8*i+6] = a[13*i+9] >> 6; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+10] << 2; + r->coeffs[8*i+6] |= (uint32_t)a[13*i+11] << 10; + r->coeffs[8*i+6] &= 0x1FFF; + + r->coeffs[8*i+7] = a[13*i+11] >> 3; + r->coeffs[8*i+7] |= (uint32_t)a[13*i+12] << 5; + r->coeffs[8*i+7] &= 0x1FFF; + + r->coeffs[8*i+0] = (1 << (D-1)) - r->coeffs[8*i+0]; + r->coeffs[8*i+1] = (1 << (D-1)) - r->coeffs[8*i+1]; + r->coeffs[8*i+2] = (1 << (D-1)) - r->coeffs[8*i+2]; + r->coeffs[8*i+3] = (1 << (D-1)) - r->coeffs[8*i+3]; + r->coeffs[8*i+4] = (1 << (D-1)) - r->coeffs[8*i+4]; + r->coeffs[8*i+5] = (1 << (D-1)) - r->coeffs[8*i+5]; + r->coeffs[8*i+6] = (1 << (D-1)) - r->coeffs[8*i+6]; + r->coeffs[8*i+7] = (1 << (D-1)) - r->coeffs[8*i+7]; + } + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_pack +* +* Description: Bit-pack polynomial with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYZ_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyz_pack(uint8_t *r, const poly *a) { + unsigned int i; + uint32_t t[4]; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + t[0] = GAMMA1 - a->coeffs[4*i+0]; + t[1] = GAMMA1 - a->coeffs[4*i+1]; + t[2] = GAMMA1 - a->coeffs[4*i+2]; + t[3] = GAMMA1 - a->coeffs[4*i+3]; + + r[9*i+0] = t[0]; + r[9*i+1] = t[0] >> 8; + r[9*i+2] = t[0] >> 16; + r[9*i+2] |= t[1] << 2; + r[9*i+3] = t[1] >> 6; + r[9*i+4] = t[1] >> 14; + r[9*i+4] |= t[2] << 4; + r[9*i+5] = t[2] >> 4; + r[9*i+6] = t[2] >> 12; + r[9*i+6] |= t[3] << 6; + r[9*i+7] = t[3] >> 2; + r[9*i+8] = t[3] >> 10; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + t[0] = GAMMA1 - a->coeffs[2*i+0]; + t[1] = GAMMA1 - a->coeffs[2*i+1]; + + r[5*i+0] = t[0]; + r[5*i+1] = t[0] >> 8; + r[5*i+2] = t[0] >> 16; + r[5*i+2] |= t[1] << 4; + r[5*i+3] = t[1] >> 4; + r[5*i+4] = t[1] >> 12; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyz_unpack +* +* Description: Unpack polynomial z with coefficients +* in [-(GAMMA1 - 1), GAMMA1]. +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: byte array with bit-packed polynomial +**************************************************/ +void polyz_unpack(poly *r, const uint8_t *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA1 == (1 << 17) + for(i = 0; i < N/4; ++i) { + r->coeffs[4*i+0] = a[9*i+0]; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+1] << 8; + r->coeffs[4*i+0] |= (uint32_t)a[9*i+2] << 16; + r->coeffs[4*i+0] &= 0x3FFFF; + + r->coeffs[4*i+1] = a[9*i+2] >> 2; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+3] << 6; + r->coeffs[4*i+1] |= (uint32_t)a[9*i+4] << 14; + r->coeffs[4*i+1] &= 0x3FFFF; + + r->coeffs[4*i+2] = a[9*i+4] >> 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+5] << 4; + r->coeffs[4*i+2] |= (uint32_t)a[9*i+6] << 12; + r->coeffs[4*i+2] &= 0x3FFFF; + + r->coeffs[4*i+3] = a[9*i+6] >> 6; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+7] << 2; + r->coeffs[4*i+3] |= (uint32_t)a[9*i+8] << 10; + r->coeffs[4*i+3] &= 0x3FFFF; + + r->coeffs[4*i+0] = GAMMA1 - r->coeffs[4*i+0]; + r->coeffs[4*i+1] = GAMMA1 - r->coeffs[4*i+1]; + r->coeffs[4*i+2] = GAMMA1 - r->coeffs[4*i+2]; + r->coeffs[4*i+3] = GAMMA1 - r->coeffs[4*i+3]; + } +#elif GAMMA1 == (1 << 19) + for(i = 0; i < N/2; ++i) { + r->coeffs[2*i+0] = a[5*i+0]; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+1] << 8; + r->coeffs[2*i+0] |= (uint32_t)a[5*i+2] << 16; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+1] = a[5*i+2] >> 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; + r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; + r->coeffs[2*i+0] &= 0xFFFFF; + + r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; + r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; + } +#endif + + DBENCH_STOP(*tpack); +} + +/************************************************* +* Name: polyw1_pack +* +* Description: Bit-pack polynomial w1 with coefficients in [0,15] or [0,43]. +* Input coefficients are assumed to be standard representatives. +* +* Arguments: - uint8_t *r: pointer to output byte array with at least +* POLYW1_PACKEDBYTES bytes +* - const poly *a: pointer to input polynomial +**************************************************/ +void polyw1_pack(uint8_t *r, const poly *a) { + unsigned int i; + DBENCH_START(); + +#if GAMMA2 == (Q-1)/88 + for(i = 0; i < N/4; ++i) { + r[3*i+0] = a->coeffs[4*i+0]; + r[3*i+0] |= a->coeffs[4*i+1] << 6; + r[3*i+1] = a->coeffs[4*i+1] >> 2; + r[3*i+1] |= a->coeffs[4*i+2] << 4; + r[3*i+2] = a->coeffs[4*i+2] >> 4; + r[3*i+2] |= a->coeffs[4*i+3] << 2; + } +#elif GAMMA2 == (Q-1)/32 + for(i = 0; i < N/2; ++i) + r[i] = a->coeffs[2*i+0] | (a->coeffs[2*i+1] << 4); +#endif + + DBENCH_STOP(*tpack); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.h new file mode 100644 index 000000000..d2fd989b6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.h @@ -0,0 +1,79 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +typedef struct { + int32_t coeffs[N]; +} poly; + +#define poly_reduce DILITHIUM_NAMESPACE(poly_reduce) +void poly_reduce(poly *a); +#define poly_caddq DILITHIUM_NAMESPACE(poly_caddq) +void poly_caddq(poly *a); + +#define poly_add DILITHIUM_NAMESPACE(poly_add) +void poly_add(poly *c, const poly *a, const poly *b); +#define poly_sub DILITHIUM_NAMESPACE(poly_sub) +void poly_sub(poly *c, const poly *a, const poly *b); +#define poly_shiftl DILITHIUM_NAMESPACE(poly_shiftl) +void poly_shiftl(poly *a); + +#define poly_ntt DILITHIUM_NAMESPACE(poly_ntt) +void poly_ntt(poly *a); +#define poly_invntt_tomont DILITHIUM_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *a); +#define poly_pointwise_montgomery DILITHIUM_NAMESPACE(poly_pointwise_montgomery) +void poly_pointwise_montgomery(poly *c, const poly *a, const poly *b); + +#define poly_power2round DILITHIUM_NAMESPACE(poly_power2round) +void poly_power2round(poly *a1, poly *a0, const poly *a); +#define poly_decompose DILITHIUM_NAMESPACE(poly_decompose) +void poly_decompose(poly *a1, poly *a0, const poly *a); +#define poly_make_hint DILITHIUM_NAMESPACE(poly_make_hint) +unsigned int poly_make_hint(poly *h, const poly *a0, const poly *a1); +#define poly_use_hint DILITHIUM_NAMESPACE(poly_use_hint) +void poly_use_hint(poly *b, const poly *a, const poly *h); + +#define poly_chknorm DILITHIUM_NAMESPACE(poly_chknorm) +int poly_chknorm(const poly *a, int32_t B); +#define poly_uniform DILITHIUM_NAMESPACE(poly_uniform) +void poly_uniform(poly *a, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); +#define poly_uniform_eta DILITHIUM_NAMESPACE(poly_uniform_eta) +void poly_uniform_eta(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_uniform_gamma1 DILITHIUM_NAMESPACE(poly_uniform_gamma1) +void poly_uniform_gamma1(poly *a, + const uint8_t seed[CRHBYTES], + uint16_t nonce); +#define poly_challenge DILITHIUM_NAMESPACE(poly_challenge) +void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define polyeta_pack DILITHIUM_NAMESPACE(polyeta_pack) +void polyeta_pack(uint8_t *r, const poly *a); +#define polyeta_unpack DILITHIUM_NAMESPACE(polyeta_unpack) +void polyeta_unpack(poly *r, const uint8_t *a); + +#define polyt1_pack DILITHIUM_NAMESPACE(polyt1_pack) +void polyt1_pack(uint8_t *r, const poly *a); +#define polyt1_unpack DILITHIUM_NAMESPACE(polyt1_unpack) +void polyt1_unpack(poly *r, const uint8_t *a); + +#define polyt0_pack DILITHIUM_NAMESPACE(polyt0_pack) +void polyt0_pack(uint8_t *r, const poly *a); +#define polyt0_unpack DILITHIUM_NAMESPACE(polyt0_unpack) +void polyt0_unpack(poly *r, const uint8_t *a); + +#define polyz_pack DILITHIUM_NAMESPACE(polyz_pack) +void polyz_pack(uint8_t *r, const poly *a); +#define polyz_unpack DILITHIUM_NAMESPACE(polyz_unpack) +void polyz_unpack(poly *r, const uint8_t *a); + +#define polyw1_pack DILITHIUM_NAMESPACE(polyw1_pack) +void polyw1_pack(uint8_t *r, const poly *a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c new file mode 100644 index 000000000..40032b656 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c @@ -0,0 +1,389 @@ +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +/************************************************* +* Name: expand_mat +* +* Description: Implementation of ExpandA. Generates matrix A with uniformly +* random coefficients a_{i,j} by performing rejection +* sampling on the output stream of SHAKE128(rho|j|i) +* +* Arguments: - polyvecl mat[K]: output matrix +* - const uint8_t rho[]: byte array containing seed rho +**************************************************/ +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]) { + unsigned int i, j; + + for(i = 0; i < K; ++i) + for(j = 0; j < L; ++j) + poly_uniform(&mat[i].vec[j], rho, (i << 8) + j); +} + +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v); +} + +/**************************************************************/ +/************ Vectors of polynomials of length L **************/ +/**************************************************************/ + +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_uniform_gamma1(&v->vec[i], seed, L*nonce + i); +} + +void polyvecl_reduce(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyvecl_add +* +* Description: Add vectors of polynomials of length L. +* No modular reduction is performed. +* +* Arguments: - polyvecl *w: pointer to output vector +* - const polyvecl *u: pointer to first summand +* - const polyvecl *v: pointer to second summand +**************************************************/ +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_ntt +* +* Description: Forward NTT of all polynomials in vector of length L. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyvecl *v: pointer to input/output vector +**************************************************/ +void polyvecl_ntt(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_ntt(&v->vec[i]); +} + +void polyvecl_invntt_tomont(polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v) { + unsigned int i; + + for(i = 0; i < L; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + +/************************************************* +* Name: polyvecl_pointwise_acc_montgomery +* +* Description: Pointwise multiply vectors of polynomials of length L, multiply +* resulting vector by 2^{-32} and add (accumulate) polynomials +* in it. Input/output vectors are in NTT domain representation. +* +* Arguments: - poly *w: output polynomial +* - const polyvecl *u: pointer to first input vector +* - const polyvecl *v: pointer to second input vector +**************************************************/ +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v) +{ + unsigned int i; + poly t; + + poly_pointwise_montgomery(w, &u->vec[0], &v->vec[0]); + for(i = 1; i < L; ++i) { + poly_pointwise_montgomery(&t, &u->vec[i], &v->vec[i]); + poly_add(w, w, &t); + } +} + +/************************************************* +* Name: polyvecl_chknorm +* +* Description: Check infinity norm of polynomials in vector of length L. +* Assumes input polyvecl to be reduced by polyvecl_reduce(). +* +* Arguments: - const polyvecl *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyvecl_chknorm(const polyvecl *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < L; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/**************************************************************/ +/************ Vectors of polynomials of length K **************/ +/**************************************************************/ + +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_uniform_eta(&v->vec[i], seed, nonce++); +} + +/************************************************* +* Name: polyveck_reduce +* +* Description: Reduce coefficients of polynomials in vector of length K +* to representatives in [-6283009,6283007]. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_reduce(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_reduce(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_caddq +* +* Description: For all coefficients of polynomials in vector of length K +* add Q if coefficient is negative. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_caddq(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_caddq(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_add +* +* Description: Add vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first summand +* - const polyveck *v: pointer to second summand +**************************************************/ +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_add(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_sub +* +* Description: Subtract vectors of polynomials of length K. +* No modular reduction is performed. +* +* Arguments: - polyveck *w: pointer to output vector +* - const polyveck *u: pointer to first input vector +* - const polyveck *v: pointer to second input vector to be +* subtracted from first input vector +**************************************************/ +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_shiftl +* +* Description: Multiply vector of polynomials of Length K by 2^D without modular +* reduction. Assumes input coefficients to be less than 2^{31-D}. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_shiftl(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_shiftl(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_ntt +* +* Description: Forward NTT of all polynomials in vector of length K. Output +* coefficients can be up to 16*Q larger than input coefficients. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_ntt(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_ntt(&v->vec[i]); +} + +/************************************************* +* Name: polyveck_invntt_tomont +* +* Description: Inverse NTT and multiplication by 2^{32} of polynomials +* in vector of length K. Input coefficients need to be less +* than 2*Q. +* +* Arguments: - polyveck *v: pointer to input/output vector +**************************************************/ +void polyveck_invntt_tomont(polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_invntt_tomont(&v->vec[i]); +} + +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]); +} + + +/************************************************* +* Name: polyveck_chknorm +* +* Description: Check infinity norm of polynomials in vector of length K. +* Assumes input polyveck to be reduced by polyveck_reduce(). +* +* Arguments: - const polyveck *v: pointer to vector +* - int32_t B: norm bound +* +* Returns 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8 +* and 1 otherwise. +**************************************************/ +int polyveck_chknorm(const polyveck *v, int32_t bound) { + unsigned int i; + + for(i = 0; i < K; ++i) + if(poly_chknorm(&v->vec[i], bound)) + return 1; + + return 0; +} + +/************************************************* +* Name: polyveck_power2round +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute a0, a1 such that a mod^+ Q = a1*2^D + a0 +* with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be +* standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_power2round(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_decompose +* +* Description: For all coefficients a of polynomials in vector of length K, +* compute high and low bits a0, a1 such a mod^+ Q = a1*ALPHA + a0 +* with -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA where we +* set a1 = 0 and -ALPHA/2 <= a0 = a mod Q - Q < 0. +* Assumes coefficients to be standard representatives. +* +* Arguments: - polyveck *v1: pointer to output vector of polynomials with +* coefficients a1 +* - polyveck *v0: pointer to output vector of polynomials with +* coefficients a0 +* - const polyveck *v: pointer to input vector +**************************************************/ +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]); +} + +/************************************************* +* Name: polyveck_make_hint +* +* Description: Compute hint vector. +* +* Arguments: - polyveck *h: pointer to output vector +* - const polyveck *v0: pointer to low part of input vector +* - const polyveck *v1: pointer to high part of input vector +* +* Returns number of 1 bits. +**************************************************/ +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1) +{ + unsigned int i, s = 0; + + for(i = 0; i < K; ++i) + s += poly_make_hint(&h->vec[i], &v0->vec[i], &v1->vec[i]); + + return s; +} + +/************************************************* +* Name: polyveck_use_hint +* +* Description: Use hint vector to correct the high bits of input vector. +* +* Arguments: - polyveck *w: pointer to output vector of polynomials with +* corrected high bits +* - const polyveck *u: pointer to input vector +* - const polyveck *h: pointer to input hint vector +**************************************************/ +void polyveck_use_hint(polyveck *w, const polyveck *u, const polyveck *h) { + unsigned int i; + + for(i = 0; i < K; ++i) + poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]); +} + +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1) { + unsigned int i; + + for(i = 0; i < K; ++i) + polyw1_pack(&r[i*POLYW1_PACKEDBYTES], &w1->vec[i]); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.h new file mode 100644 index 000000000..615ac5299 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.h @@ -0,0 +1,93 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +/* Vectors of polynomials of length L */ +typedef struct { + poly vec[L]; +} polyvecl; + +#define polyvecl_uniform_eta DILITHIUM_NAMESPACE(polyvecl_uniform_eta) +void polyvecl_uniform_eta(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_uniform_gamma1 DILITHIUM_NAMESPACE(polyvecl_uniform_gamma1) +void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyvecl_reduce DILITHIUM_NAMESPACE(polyvecl_reduce) +void polyvecl_reduce(polyvecl *v); + +#define polyvecl_add DILITHIUM_NAMESPACE(polyvecl_add) +void polyvecl_add(polyvecl *w, const polyvecl *u, const polyvecl *v); + +#define polyvecl_ntt DILITHIUM_NAMESPACE(polyvecl_ntt) +void polyvecl_ntt(polyvecl *v); +#define polyvecl_invntt_tomont DILITHIUM_NAMESPACE(polyvecl_invntt_tomont) +void polyvecl_invntt_tomont(polyvecl *v); +#define polyvecl_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyvecl_pointwise_poly_montgomery) +void polyvecl_pointwise_poly_montgomery(polyvecl *r, const poly *a, const polyvecl *v); +#define polyvecl_pointwise_acc_montgomery \ + DILITHIUM_NAMESPACE(polyvecl_pointwise_acc_montgomery) +void polyvecl_pointwise_acc_montgomery(poly *w, + const polyvecl *u, + const polyvecl *v); + + +#define polyvecl_chknorm DILITHIUM_NAMESPACE(polyvecl_chknorm) +int polyvecl_chknorm(const polyvecl *v, int32_t B); + + + +/* Vectors of polynomials of length K */ +typedef struct { + poly vec[K]; +} polyveck; + +#define polyveck_uniform_eta DILITHIUM_NAMESPACE(polyveck_uniform_eta) +void polyveck_uniform_eta(polyveck *v, const uint8_t seed[CRHBYTES], uint16_t nonce); + +#define polyveck_reduce DILITHIUM_NAMESPACE(polyveck_reduce) +void polyveck_reduce(polyveck *v); +#define polyveck_caddq DILITHIUM_NAMESPACE(polyveck_caddq) +void polyveck_caddq(polyveck *v); + +#define polyveck_add DILITHIUM_NAMESPACE(polyveck_add) +void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_sub DILITHIUM_NAMESPACE(polyveck_sub) +void polyveck_sub(polyveck *w, const polyveck *u, const polyveck *v); +#define polyveck_shiftl DILITHIUM_NAMESPACE(polyveck_shiftl) +void polyveck_shiftl(polyveck *v); + +#define polyveck_ntt DILITHIUM_NAMESPACE(polyveck_ntt) +void polyveck_ntt(polyveck *v); +#define polyveck_invntt_tomont DILITHIUM_NAMESPACE(polyveck_invntt_tomont) +void polyveck_invntt_tomont(polyveck *v); +#define polyveck_pointwise_poly_montgomery DILITHIUM_NAMESPACE(polyveck_pointwise_poly_montgomery) +void polyveck_pointwise_poly_montgomery(polyveck *r, const poly *a, const polyveck *v); + +#define polyveck_chknorm DILITHIUM_NAMESPACE(polyveck_chknorm) +int polyveck_chknorm(const polyveck *v, int32_t B); + +#define polyveck_power2round DILITHIUM_NAMESPACE(polyveck_power2round) +void polyveck_power2round(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_decompose DILITHIUM_NAMESPACE(polyveck_decompose) +void polyveck_decompose(polyveck *v1, polyveck *v0, const polyveck *v); +#define polyveck_make_hint DILITHIUM_NAMESPACE(polyveck_make_hint) +unsigned int polyveck_make_hint(polyveck *h, + const polyveck *v0, + const polyveck *v1); +#define polyveck_use_hint DILITHIUM_NAMESPACE(polyveck_use_hint) +void polyveck_use_hint(polyveck *w, const polyveck *v, const polyveck *h); + +#define polyveck_pack_w1 DILITHIUM_NAMESPACE(polyveck_pack_w1) +void polyveck_pack_w1(uint8_t r[K*POLYW1_PACKEDBYTES], const polyveck *w1); + +#define polyvec_matrix_expand DILITHIUM_NAMESPACE(polyvec_matrix_expand) +void polyvec_matrix_expand(polyvecl mat[K], const uint8_t rho[SEEDBYTES]); + +#define polyvec_matrix_pointwise_montgomery DILITHIUM_NAMESPACE(polyvec_matrix_pointwise_montgomery) +void polyvec_matrix_pointwise_montgomery(polyveck *t, const polyvecl mat[K], const polyvecl *v); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c new file mode 100644 index 000000000..75feff8bc --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c @@ -0,0 +1,69 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: For finite field element a with -2^{31}Q <= a <= Q*2^31, +* compute r \equiv a*2^{-32} (mod Q) such that -Q < r < Q. +* +* Arguments: - int64_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t montgomery_reduce(int64_t a) { + int32_t t; + + t = (int64_t)(int32_t)a*QINV; + t = (a - (int64_t)t*Q) >> 32; + return t; +} + +/************************************************* +* Name: reduce32 +* +* Description: For finite field element a with a <= 2^{31} - 2^{22} - 1, +* compute r \equiv a (mod Q) such that -6283009 <= r <= 6283007. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t reduce32(int32_t a) { + int32_t t; + + t = (a + (1 << 22)) >> 23; + t = a - t*Q; + return t; +} + +/************************************************* +* Name: caddq +* +* Description: Add Q if input coefficient is negative. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t caddq(int32_t a) { + a += (a >> 31) & Q; + return a; +} + +/************************************************* +* Name: freeze +* +* Description: For finite field element a, compute standard +* representative r = a mod^+ Q. +* +* Arguments: - int32_t: finite field element a +* +* Returns r. +**************************************************/ +int32_t freeze(int32_t a) { + a = reduce32(a); + a = caddq(a); + return a; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.h new file mode 100644 index 000000000..26d9b4ee2 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.h @@ -0,0 +1,22 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -4186625 // 2^32 % Q +#define QINV 58728449 // q^(-1) mod 2^32 + +#define montgomery_reduce DILITHIUM_NAMESPACE(montgomery_reduce) +int32_t montgomery_reduce(int64_t a); + +#define reduce32 DILITHIUM_NAMESPACE(reduce32) +int32_t reduce32(int32_t a); + +#define caddq DILITHIUM_NAMESPACE(caddq) +int32_t caddq(int32_t a); + +#define freeze DILITHIUM_NAMESPACE(freeze) +int32_t freeze(int32_t a); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c new file mode 100644 index 000000000..889f0a296 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c @@ -0,0 +1,102 @@ +#include +#include "params.h" +#include "rounding.h" + +/************************************************* +* Name: power2round +* +* Description: For finite field element a, compute a0, a1 such that +* a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}. +* Assumes a to be standard representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t power2round(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + (1 << (D-1)) - 1) >> D; + *a0 = a - (a1 << D); + return a1; +} + +/************************************************* +* Name: decompose +* +* Description: For finite field element a, compute high and low bits a0, a1 such +* that a mod^+ Q = a1*ALPHA + a0 with -ALPHA/2 < a0 <= ALPHA/2 except +* if a1 = (Q-1)/ALPHA where we set a1 = 0 and +* -ALPHA/2 <= a0 = a mod^+ Q - Q < 0. Assumes a to be standard +* representative. +* +* Arguments: - int32_t a: input element +* - int32_t *a0: pointer to output element a0 +* +* Returns a1. +**************************************************/ +int32_t decompose(int32_t *a0, int32_t a) { + int32_t a1; + + a1 = (a + 127) >> 7; +#if GAMMA2 == (Q-1)/32 + a1 = (a1*1025 + (1 << 21)) >> 22; + a1 &= 15; +#elif GAMMA2 == (Q-1)/88 + a1 = (a1*11275 + (1 << 23)) >> 24; + a1 ^= ((43 - a1) >> 31) & a1; +#endif + + *a0 = a - a1*2*GAMMA2; + *a0 -= (((Q-1)/2 - *a0) >> 31) & Q; + return a1; +} + +/************************************************* +* Name: make_hint +* +* Description: Compute hint bit indicating whether the low bits of the +* input element overflow into the high bits. +* +* Arguments: - int32_t a0: low bits of input element +* - int32_t a1: high bits of input element +* +* Returns 1 if overflow. +**************************************************/ +unsigned int make_hint(int32_t a0, int32_t a1) { + if(a0 > GAMMA2 || a0 < -GAMMA2 || (a0 == -GAMMA2 && a1 != 0)) + return 1; + + return 0; +} + +/************************************************* +* Name: use_hint +* +* Description: Correct high bits according to hint. +* +* Arguments: - int32_t a: input element +* - unsigned int hint: hint bit +* +* Returns corrected high bits. +**************************************************/ +int32_t use_hint(int32_t a, unsigned int hint) { + int32_t a0, a1; + + a1 = decompose(&a0, a); + if(hint == 0) + return a1; + +#if GAMMA2 == (Q-1)/32 + if(a0 > 0) + return (a1 + 1) & 15; + else + return (a1 - 1) & 15; +#elif GAMMA2 == (Q-1)/88 + if(a0 > 0) + return (a1 == 43) ? 0 : a1 + 1; + else + return (a1 == 0) ? 43 : a1 - 1; +#endif +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.h new file mode 100644 index 000000000..b72e8e8d6 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.h @@ -0,0 +1,19 @@ +#ifndef ROUNDING_H +#define ROUNDING_H + +#include +#include "params.h" + +#define power2round DILITHIUM_NAMESPACE(power2round) +int32_t power2round(int32_t *a0, int32_t a); + +#define decompose DILITHIUM_NAMESPACE(decompose) +int32_t decompose(int32_t *a0, int32_t a); + +#define make_hint DILITHIUM_NAMESPACE(make_hint) +unsigned int make_hint(int32_t a0, int32_t a1); + +#define use_hint DILITHIUM_NAMESPACE(use_hint) +int32_t use_hint(int32_t a, unsigned int hint); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c new file mode 100644 index 000000000..9298ad217 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c @@ -0,0 +1,341 @@ +#include +#include "params.h" +#include "sign.h" +#include "packing.h" +#include "polyvec.h" +#include "poly.h" +#include "randombytes.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: crypto_sign_keypair +* +* Description: Generates public and private key. +* +* Arguments: - uint8_t *pk: pointer to output public key (allocated +* array of CRYPTO_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key (allocated +* array of CRYPTO_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk) { + uint8_t seedbuf[2*SEEDBYTES + CRHBYTES]; + uint8_t tr[TRBYTES]; + const uint8_t *rho, *rhoprime, *key; + polyvecl mat[K]; + polyvecl s1, s1hat; + polyveck s2, t1, t0; + + /* Get randomness for rho, rhoprime and key */ + randombytes(seedbuf, SEEDBYTES); + shake256(seedbuf, 2*SEEDBYTES + CRHBYTES, seedbuf, SEEDBYTES); + rho = seedbuf; + rhoprime = rho + SEEDBYTES; + key = rhoprime + CRHBYTES; + + /* Expand matrix */ + polyvec_matrix_expand(mat, rho); + + /* Sample short vectors s1 and s2 */ + polyvecl_uniform_eta(&s1, rhoprime, 0); + polyveck_uniform_eta(&s2, rhoprime, L); + + /* Matrix-vector multiplication */ + s1hat = s1; + polyvecl_ntt(&s1hat); + polyvec_matrix_pointwise_montgomery(&t1, mat, &s1hat); + polyveck_reduce(&t1); + polyveck_invntt_tomont(&t1); + + /* Add error vector s2 */ + polyveck_add(&t1, &t1, &s2); + + /* Extract t1 and write public key */ + polyveck_caddq(&t1); + polyveck_power2round(&t1, &t0, &t1); + pack_pk(pk, rho, &t1); + + /* Compute H(rho, t1) and write secret key */ + shake256(tr, TRBYTES, pk, CRYPTO_PUBLICKEYBYTES); + pack_sk(sk, rho, tr, key, &t0, &s1, &s2); + + return 0; +} + +/************************************************* +* Name: crypto_sign_signature +* +* Description: Computes signature. +* +* Arguments: - uint8_t *sig: pointer to output signature (of length CRYPTO_BYTES) +* - size_t *siglen: pointer to output length of signature +* - uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign_signature(uint8_t *sig, + size_t *siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + unsigned int n; + uint8_t seedbuf[2*SEEDBYTES + TRBYTES + RNDBYTES + 2*CRHBYTES]; + uint8_t *rho, *tr, *key, *mu, *rhoprime, *rnd; + uint16_t nonce = 0; + polyvecl mat[K], s1, y, z; + polyveck t0, s2, w1, w0, h; + poly cp; + shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; + key = tr + TRBYTES; + rnd = key + SEEDBYTES; + mu = rnd + RNDBYTES; + rhoprime = mu + CRHBYTES; + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + + /* Compute mu = CRH(tr, msg) */ + shake256_inc_init(&state); + shake256_inc_absorb(&state, tr, TRBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + +#ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +#else + for(n=0;n OMEGA) + goto rej; + + shake256_inc_ctx_release(&state); + + /* Write signature */ + pack_sig(sig, sig, &z, &h); + *siglen = CRYPTO_BYTES; + return 0; +} + +/************************************************* +* Name: crypto_sign +* +* Description: Compute signed message. +* +* Arguments: - uint8_t *sm: pointer to output signed message (allocated +* array with CRYPTO_BYTES + mlen bytes), +* can be equal to m +* - size_t *smlen: pointer to output length of signed +* message +* - const uint8_t *m: pointer to message to be signed +* - size_t mlen: length of message +* - const uint8_t *sk: pointer to bit-packed secret key +* +* Returns 0 (success) +**************************************************/ +int crypto_sign(uint8_t *sm, + size_t *smlen, + const uint8_t *m, + size_t mlen, + const uint8_t *sk) +{ + size_t i; + + for(i = 0; i < mlen; ++i) + sm[CRYPTO_BYTES + mlen - 1 - i] = m[mlen - 1 - i]; + crypto_sign_signature(sm, smlen, sm + CRYPTO_BYTES, mlen, sk); + *smlen += mlen; + return 0; +} + +/************************************************* +* Name: crypto_sign_verify +* +* Description: Verifies signature. +* +* Arguments: - uint8_t *m: pointer to input signature +* - size_t siglen: length of signature +* - const uint8_t *m: pointer to message +* - size_t mlen: length of message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signature could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_verify(const uint8_t *sig, + size_t siglen, + const uint8_t *m, + size_t mlen, + const uint8_t *pk) +{ + unsigned int i; + uint8_t buf[K*POLYW1_PACKEDBYTES]; + uint8_t rho[SEEDBYTES]; + uint8_t mu[CRHBYTES]; + uint8_t c[CTILDEBYTES]; + uint8_t c2[CTILDEBYTES]; + poly cp; + polyvecl mat[K], z; + polyveck t1, w1, h; + shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + unpack_pk(rho, &t1, pk); + if(unpack_sig(c, &z, &h, sig)) + return -1; + if(polyvecl_chknorm(&z, GAMMA1 - BETA)) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); + shake256_inc_init(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, m, mlen); + shake256_inc_finalize(&state); + shake256_inc_squeeze(mu, CRHBYTES, &state); + + /* Matrix-vector multiplication; compute Az - c2^dt1 */ + poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ + polyvec_matrix_expand(mat, rho); + + polyvecl_ntt(&z); + polyvec_matrix_pointwise_montgomery(&w1, mat, &z); + + poly_ntt(&cp); + polyveck_shiftl(&t1); + polyveck_ntt(&t1); + polyveck_pointwise_poly_montgomery(&t1, &cp, &t1); + + polyveck_sub(&w1, &w1, &t1); + polyveck_reduce(&w1); + polyveck_invntt_tomont(&w1); + + /* Reconstruct w1 */ + polyveck_caddq(&w1); + polyveck_use_hint(&w1, &w1, &h); + polyveck_pack_w1(buf, &w1); + + /* Call random oracle and verify challenge */ + shake256_inc_ctx_reset(&state); + shake256_inc_absorb(&state, mu, CRHBYTES); + shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); + shake256_inc_finalize(&state); + shake256_inc_squeeze(c2, CTILDEBYTES, &state); + shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(c[i] != c2[i]) + return -1; + + return 0; +} + +/************************************************* +* Name: crypto_sign_open +* +* Description: Verify signed message. +* +* Arguments: - uint8_t *m: pointer to output message (allocated +* array with smlen bytes), can be equal to sm +* - size_t *mlen: pointer to output length of message +* - const uint8_t *sm: pointer to signed message +* - size_t smlen: length of signed message +* - const uint8_t *pk: pointer to bit-packed public key +* +* Returns 0 if signed message could be verified correctly and -1 otherwise +**************************************************/ +int crypto_sign_open(uint8_t *m, + size_t *mlen, + const uint8_t *sm, + size_t smlen, + const uint8_t *pk) +{ + size_t i; + + if(smlen < CRYPTO_BYTES) + goto badsig; + + *mlen = smlen - CRYPTO_BYTES; + if(crypto_sign_verify(sm, CRYPTO_BYTES, sm + CRYPTO_BYTES, *mlen, pk)) + goto badsig; + else { + /* All good, copy msg, return 0 */ + for(i = 0; i < *mlen; ++i) + m[i] = sm[CRYPTO_BYTES + i]; + return 0; + } + +badsig: + /* Signature verification failed */ + *mlen = -1; + for(i = 0; i < smlen; ++i) + m[i] = 0; + + return -1; +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.h new file mode 100644 index 000000000..295f378c0 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.h @@ -0,0 +1,36 @@ +#ifndef SIGN_H +#define SIGN_H + +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" + +#define challenge DILITHIUM_NAMESPACE(challenge) +void challenge(poly *c, const uint8_t seed[SEEDBYTES]); + +#define crypto_sign_keypair DILITHIUM_NAMESPACE(keypair) +int crypto_sign_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_sign_signature DILITHIUM_NAMESPACE(signature) +int crypto_sign_signature(uint8_t *sig, size_t *siglen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign DILITHIUM_NAMESPACETOP +int crypto_sign(uint8_t *sm, size_t *smlen, + const uint8_t *m, size_t mlen, + const uint8_t *sk); + +#define crypto_sign_verify DILITHIUM_NAMESPACE(verify) +int crypto_sign_verify(const uint8_t *sig, size_t siglen, + const uint8_t *m, size_t mlen, + const uint8_t *pk); + +#define crypto_sign_open DILITHIUM_NAMESPACE(open) +int crypto_sign_open(uint8_t *m, size_t *mlen, + const uint8_t *sm, size_t smlen, + const uint8_t *pk); + +#endif diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..963f64981 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c @@ -0,0 +1,28 @@ +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake128_inc_init(state); + shake128_inc_absorb(state, seed, SEEDBYTES); + shake128_inc_absorb(state, t, 2); + shake128_inc_finalize(state); +} + +void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) +{ + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + + shake256_inc_init(state); + shake256_inc_absorb(state, seed, CRHBYTES); + shake256_inc_absorb(state, t, 2); + shake256_inc_finalize(state); +} diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric.h b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric.h new file mode 100644 index 000000000..211de3b86 --- /dev/null +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric.h @@ -0,0 +1,36 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx stream128_state; +typedef shake256incctx stream256_state; + +#define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +void dilithium_shake128_stream_init(shake128incctx *state, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); + +#define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +void dilithium_shake256_stream_init(shake256incctx *state, + const uint8_t seed[CRHBYTES], + uint16_t nonce); + +#define STREAM128_BLOCKBYTES SHAKE128_RATE +#define STREAM256_BLOCKBYTES SHAKE256_RATE + +#define stream128_init(STATE, SEED, NONCE) \ + dilithium_shake128_stream_init(STATE, SEED, NONCE) +#define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream128_release(STATE) shake128_inc_ctx_release(STATE) +#define stream256_init(STATE, SEED, NONCE) \ + dilithium_shake256_stream_init(STATE, SEED, NONCE) +#define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + +#endif diff --git a/src/sig/ml_dsa/sig_ml_dsa.h b/src/sig/ml_dsa/sig_ml_dsa.h new file mode 100644 index 000000000..5f2ee9c50 --- /dev/null +++ b/src/sig/ml_dsa/sig_ml_dsa.h @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT + +#ifndef OQS_SIG_ML_DSA_H +#define OQS_SIG_ML_DSA_H + +#include + +#ifdef OQS_ENABLE_SIG_ml_dsa_44 +#define OQS_SIG_ml_dsa_44_length_public_key 1312 +#define OQS_SIG_ml_dsa_44_length_secret_key 2560 +#define OQS_SIG_ml_dsa_44_length_signature 2420 + +OQS_SIG *OQS_SIG_ml_dsa_44_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +#endif + +#ifdef OQS_ENABLE_SIG_ml_dsa_65 +#define OQS_SIG_ml_dsa_65_length_public_key 1952 +#define OQS_SIG_ml_dsa_65_length_secret_key 4032 +#define OQS_SIG_ml_dsa_65_length_signature 3309 + +OQS_SIG *OQS_SIG_ml_dsa_65_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +#endif + +#ifdef OQS_ENABLE_SIG_ml_dsa_87 +#define OQS_SIG_ml_dsa_87_length_public_key 2592 +#define OQS_SIG_ml_dsa_87_length_secret_key 4896 +#define OQS_SIG_ml_dsa_87_length_signature 4627 + +OQS_SIG *OQS_SIG_ml_dsa_87_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +#endif + +#endif diff --git a/src/sig/ml_dsa/sig_ml_dsa_44.c b/src/sig/ml_dsa/sig_ml_dsa_44.c new file mode 100644 index 000000000..79421a1f8 --- /dev/null +++ b/src/sig/ml_dsa/sig_ml_dsa_44.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_SIG_ml_dsa_44) + +OQS_SIG *OQS_SIG_ml_dsa_44_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_44; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 2; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_44_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_44_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_44_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_44_keypair; + sig->sign = OQS_SIG_ml_dsa_44_sign; + sig->verify = OQS_SIG_ml_dsa_44_verify; + + return sig; +} + +extern int pqcrystals_ml_dsa_44_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_44_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_44_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); + +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +extern int pqcrystals_ml_dsa_44_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_44_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_44_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); +#endif + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_avx2_signature(signature, signature_len, message, message_len, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_avx2_verify(signature, signature_len, message, message_len, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_verify(signature, signature_len, message, message_len, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_44_ipd_ref_verify(signature, signature_len, message, message_len, public_key); +#endif +} + +#endif diff --git a/src/sig/ml_dsa/sig_ml_dsa_65.c b/src/sig/ml_dsa/sig_ml_dsa_65.c new file mode 100644 index 000000000..9f2854560 --- /dev/null +++ b/src/sig/ml_dsa/sig_ml_dsa_65.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_SIG_ml_dsa_65) + +OQS_SIG *OQS_SIG_ml_dsa_65_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_65; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 3; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_65_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_65_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_65_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_65_keypair; + sig->sign = OQS_SIG_ml_dsa_65_sign; + sig->verify = OQS_SIG_ml_dsa_65_verify; + + return sig; +} + +extern int pqcrystals_ml_dsa_65_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_65_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_65_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); + +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +extern int pqcrystals_ml_dsa_65_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_65_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_65_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); +#endif + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_avx2_signature(signature, signature_len, message, message_len, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_avx2_verify(signature, signature_len, message, message_len, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_verify(signature, signature_len, message, message_len, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_65_ipd_ref_verify(signature, signature_len, message, message_len, public_key); +#endif +} + +#endif diff --git a/src/sig/ml_dsa/sig_ml_dsa_87.c b/src/sig/ml_dsa/sig_ml_dsa_87.c new file mode 100644 index 000000000..e1b5a32a5 --- /dev/null +++ b/src/sig/ml_dsa/sig_ml_dsa_87.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_SIG_ml_dsa_87) + +OQS_SIG *OQS_SIG_ml_dsa_87_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_87; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 5; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_87_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_87_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_87_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_87_keypair; + sig->sign = OQS_SIG_ml_dsa_87_sign; + sig->verify = OQS_SIG_ml_dsa_87_verify; + + return sig; +} + +extern int pqcrystals_ml_dsa_87_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_87_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_87_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); + +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +extern int pqcrystals_ml_dsa_87_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_dsa_87_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); +extern int pqcrystals_ml_dsa_87_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); +#endif + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_avx2_signature(signature, signature_len, message, message_len, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_signature(signature, signature_len, message, message_len, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_avx2_verify(signature, signature_len, message, message_len, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_verify(signature, signature_len, message, message_len, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_dsa_87_ipd_ref_verify(signature, signature_len, message, message_len, public_key); +#endif +} + +#endif diff --git a/src/sig/sig.c b/src/sig/sig.c index c45084947..a2283bf4c 100644 --- a/src/sig/sig.c +++ b/src/sig/sig.c @@ -18,6 +18,9 @@ OQS_API const char *OQS_SIG_alg_identifier(size_t i) { OQS_SIG_alg_dilithium_2, OQS_SIG_alg_dilithium_3, OQS_SIG_alg_dilithium_5, + OQS_SIG_alg_ml_dsa_44, + OQS_SIG_alg_ml_dsa_65, + OQS_SIG_alg_ml_dsa_87, OQS_SIG_alg_falcon_512, OQS_SIG_alg_falcon_1024, OQS_SIG_alg_sphincs_sha2_128f_simple, @@ -68,6 +71,24 @@ OQS_API int OQS_SIG_alg_is_enabled(const char *method_name) { return 1; #else return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87 + return 1; +#else + return 0; #endif } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) { #ifdef OQS_ENABLE_SIG_falcon_512 @@ -182,6 +203,24 @@ OQS_API OQS_SIG *OQS_SIG_new(const char *method_name) { return OQS_SIG_dilithium_5_new(); #else return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44 + return OQS_SIG_ml_dsa_44_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65 + return OQS_SIG_ml_dsa_65_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87 + return OQS_SIG_ml_dsa_87_new(); +#else + return NULL; #endif } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) { #ifdef OQS_ENABLE_SIG_falcon_512 diff --git a/src/sig/sig.h b/src/sig/sig.h index f7f48ec32..4d65a4698 100644 --- a/src/sig/sig.h +++ b/src/sig/sig.h @@ -38,6 +38,12 @@ extern "C" { #define OQS_SIG_alg_dilithium_3 "Dilithium3" /** Algorithm identifier for Dilithium5 */ #define OQS_SIG_alg_dilithium_5 "Dilithium5" +/** Algorithm identifier for ML-DSA-44-ipd */ +#define OQS_SIG_alg_ml_dsa_44 "ML-DSA-44-ipd" +/** Algorithm identifier for ML-DSA-65-ipd */ +#define OQS_SIG_alg_ml_dsa_65 "ML-DSA-65-ipd" +/** Algorithm identifier for ML-DSA-87-ipd */ +#define OQS_SIG_alg_ml_dsa_87 "ML-DSA-87-ipd" /** Algorithm identifier for Falcon-512 */ #define OQS_SIG_alg_falcon_512 "Falcon-512" /** Algorithm identifier for Falcon-1024 */ @@ -70,7 +76,7 @@ extern "C" { // EDIT-WHEN-ADDING-SIG ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_START /** Number of algorithm identifiers above. */ -#define OQS_SIG_algs_length 17 +#define OQS_SIG_algs_length 20 ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_END /** @@ -240,6 +246,9 @@ OQS_API void OQS_SIG_free(OQS_SIG *sig); #ifdef OQS_ENABLE_SIG_DILITHIUM #include #endif /* OQS_ENABLE_SIG_DILITHIUM */ +#ifdef OQS_ENABLE_SIG_ML_DSA +#include +#endif /* OQS_ENABLE_SIG_ML_DSA */ #ifdef OQS_ENABLE_SIG_FALCON #include #endif /* OQS_ENABLE_SIG_FALCON */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ff6843882..59821e75a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -97,6 +97,13 @@ set(SIG_TESTS example_sig kat_sig test_sig test_sig_mem speed_sig) add_executable(dump_alg_info dump_alg_info.c) target_link_libraries(dump_alg_info PRIVATE ${TEST_DEPS}) +# Intermediate values vector tests +add_executable(vectors_sig vectors_sig.c) +target_link_libraries(vectors_sig PRIVATE ${API_TEST_DEPS}) + +add_executable(vectors_kem vectors_kem.c) +target_link_libraries(vectors_kem PRIVATE ${API_TEST_DEPS}) + # Enable Valgrind-based timing side-channel analysis for test_kem and test_sig if(OQS_ENABLE_TEST_CONSTANT_TIME AND NOT OQS_DEBUG_BUILD) message(WARNING "OQS_ENABLE_TEST_CONSTANT_TIME is incompatible with CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}.") diff --git a/tests/KATs/sig/kats.json b/tests/KATs/sig/kats.json index 86d5ce46c..48089af2e 100644 --- a/tests/KATs/sig/kats.json +++ b/tests/KATs/sig/kats.json @@ -19,6 +19,15 @@ "all": "f4f23c1153682007d5dec02c35e47061c17900fcf0adb3fd0437f1988fa13655", "single": "da27fe8a462de7307ddf1f9b00072a457d9c5b14e838c148fbe2662094b9a2ca" }, + "ML-DSA-44-ipd": { + "single": "e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1" + }, + "ML-DSA-65-ipd": { + "single": "7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7" + }, + "ML-DSA-87-ipd": { + "single": "f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f" + } "SPHINCS+-SHA2-128f-simple": { "all": "4437eb44516630184c3cb5d3a4392e8bb955c2bf59ad17ab3c607fb7b7285780", "single": "cd1e13db3a56c0a6b3486a7b12bcddfda50cf5d1e4d14d3113e6456e969b8114" @@ -67,4 +76,4 @@ "all": "dadcf175289c25aaa530a389cc84154dc4331fabda06ffaf2a292944e4d03841", "single": "37d37c9b43d71341b7dd5da7f8ebbe8bbae3d7bfc53f5378446023cbcf6e04f2" } -} \ No newline at end of file +} diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt new file mode 100644 index 000000000..58b3e7a06 --- /dev/null +++ b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt @@ -0,0 +1,87 @@ +Decapsulation -- ML-KEM-1024 +dk: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B005C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 +c: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 + +dk_pke: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061 +ek_pke: A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12 +h: FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B0 +z: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 + +c1: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4 +c2: FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 +u: [[3071, 1403, 2568, 1534, 2888, 2554, 884, 3019, 1058, 2038, 995, 871, 2394, 1510, 2544, 2102, 688, 50, 1824, 3032, 2676, 2706, 2637, 1257, 3209, 2845, 1052, 1172, 636, 530, 1795, 748, 1515, 288, 2643, 2601, 3062, 2962, 1265, 816, 388, 192, 2628, 1172, 974, 1500, 1814, 1302, 1482, 549, 2910, 1001, 1315, 870, 1851, 2329, 1079, 1717, 2973, 2064, 1648, 1338, 3028, 1539, 145, 242, 1749, 559, 2441, 1804, 2459, 50, 2614, 1892, 1190, 2546, 2409, 1361, 1715, 3220, 367, 637, 966, 683, 231, 375, 1577, 1222, 249, 1213, 1331, 600, 996, 232, 1284, 325, 3147, 2355, 640, 766, 20, 2276, 2554, 3123, 145, 2823, 2051, 2637, 2687, 2320, 5, 2552, 2386, 904, 2438, 1118, 3145, 2934, 57, 488, 2845, 2641, 2949, 180, 2454, 2680, 390, 535, 55, 3227, 1640, 2901, 566, 2388, 766, 2373, 1469, 444, 1304, 1544, 98, 70, 2845, 575, 322, 2056, 1843, 2346, 3184, 1016, 265, 673, 957, 571, 2767, 692, 2211, 1851, 1091, 2915, 502, 164, 1521, 2167, 2705, 1426, 966, 268, 1123, 1629, 3155, 1364, 1959, 783, 63, 2077, 553, 306, 3023, 1790, 437, 1105, 1757, 18, 1650, 3175, 3066, 923, 1913, 2003, 2755, 1086, 1952, 1946, 354, 1959, 418, 2789, 55, 1738, 2303, 450, 3114, 15, 2887, 1923, 2867, 2199, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3158, 2685, 1239, 1242, 2120, 1375, 330, 1968, 1013, 3002, 2341, 1980, 2090, 3240, 925, 3010, 842, 2467, 753, 3188, 1128, 366, 2025, 1772, 2849, 3171, 964, 1213, 3028, 1349, 304, 567, 1148, 1916, 2237, 1087, 3041, 935, 1720, 1562, 140], +[606, 2207, 1164, 535, 1988, 2767, 2697, 3197, 1435, 2404, 89, 918, 2087, 1426, 2284, 2705, 2063, 618, 176, 1481, 2654, 1230, 3009, 1679, 1170, 210, 681, 3253, 117, 271, 1751, 2843, 2705, 1227, 3071, 444, 362, 1149, 1240, 1157, 1925, 1796, 268, 1965, 463, 2059, 712, 709, 3231, 1474, 1508, 1240, 1096, 1482, 1812, 2360, 795, 1204, 10, 3184, 2086, 2110, 1237, 2568, 2152, 1556, 2797, 2376, 606, 1973, 2380, 335, 2562, 845, 580, 2589, 85, 1955, 2393, 1271, 1320, 2177, 1335, 1388, 2064, 1460, 1226, 231, 884, 636, 2467, 1756, 2867, 2988, 1842, 2454, 172, 2736, 961, 3092, 1890, 1582, 2201, 1850, 759, 488, 1782, 327, 1400, 1517, 1252, 3061, 3171, 2484, 3215, 2380, 3246, 673, 301, 2373, 640, 1877, 1933, 1039, 2107, 2788, 728, 2183, 1398, 2781, 1603, 652, 2750, 1200, 562, 1161, 3327, 1612, 2775, 930, 751, 2672, 224, 1302, 1346, 1447, 3079, 806, 2258, 3129, 689, 2354, 392, 2292, 247, 3002, 2702, 2380, 1648, 712, 1003, 180, 725, 1691, 1461, 1599, 319, 104, 1159, 3175, 1671, 2567, 1326, 1998, 2760, 1048, 2581, 2, 1595, 2142, 2781, 514, 263, 1084, 2989, 1318, 858, 320, 822, 3183, 863, 1401, 1455, 1185, 358, 1239, 881, 2342, 2936, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3114, 1486, 1068, 34, 176, 2606, 1206, 2820, 2819, 268, 2754, 2747, 2541, 2043, 3264, 1162, 2037, 1824, 1520, 819, 2146, 1430, 2669, 2502, 2942, 627, 1700, 1013, 1352, 2367, 1682, 3210, 644, 1343, 3012, 2212, 3179, 2454, 2923, 65, 2952, 2557, 1973, 463, 1994, 2381], +[1769, 3266, 3045, 127, 262, 2121, 2316, 1681, 2310, 2910, 1416, 2105, 953, 229, 1318, 2671, 2033, 2342, 2063, 1270, 2885, 2750, 2832, 1396, 1458, 618, 154, 3149, 11, 714, 2289, 2997, 2389, 284, 2682, 215, 1442, 237, 310, 281, 2575, 1403, 735, 3002, 1318, 276, 1770, 2017, 1170, 2232, 2477, 720, 2498, 2068, 2674, 2294, 1092, 2012, 2581, 2347, 2684, 624, 2526, 1482, 2950, 3197, 1910, 743, 1169, 1634, 1515, 3040, 2747, 2298, 1091, 1484, 788, 1647, 2771, 2659, 3058, 671, 3189, 1782, 2653, 106, 72, 1123, 2394, 3152, 1860, 3062, 158, 1835, 1026, 1135, 2263, 3038, 2599, 2207, 780, 41, 1022, 1027, 2255, 2110, 2077, 2094, 2120, 2698, 597, 3041, 1499, 463, 1057, 85, 257, 413, 2996, 1588, 367, 2825, 2507, 2407, 1565, 2635, 2033, 1681, 2485, 1107, 650, 1707, 3293, 3010, 3212, 1565, 1148, 649, 1417, 2066, 42, 2742, 393, 2903, 2216, 3253, 640, 114, 1157, 85, 60, 2677, 358, 718, 2255, 428, 845, 3205, 268, 738, 2589, 1830, 2038, 2516, 2417, 2554, 1543, 2757, 2190, 961, 3067, 2658, 2086, 3132, 1739, 2633, 182, 1791, 930, 1437, 1946, 923, 2352, 2994, 291, 2511, 1554, 2328, 2341, 540, 1344, 1565, 1100, 1365, 3162, 2905, 380, 1655, 814, 2693, 16, 1715, 1013, 902, 569, 2284, 2329, 1325, 1570, 535, 2094, 992, 1320, 229, 884, 133, 2422, 98, 1858, 3244, 3279, 2695, 2667, 2266, 1157, 2549, 2437, 387, 805, 803, 944, 2866, 1279, 1856, 1460, 1916, 2121, 494, 1284, 1452, 1986, 2046, 1625, 3183, 2363, 31, 1538, 1861, 2739, 80, 2581, 1213, 2396, 2191, 931, 2915], +[1603, 907, 2780, 2897, 1440, 1196, 866, 2225, 1720, 2596, 1432, 1359, 2268, 2489, 548, 1928, 1364, 1925, 1850, 2866, 1073, 2029, 2971, 2937, 93, 1243, 2389, 1985, 1817, 3305, 1704, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2368, 811, 328, 28, 975, 2684, 509, 2572, 1130, 657, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2931, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 836, 1855, 1830, 3279, 3184, 2064, 3309, 2082, 1047, 1257, 2715, 783, 3111, 821, 2619, 161, 2911, 2020, 429, 1281, 1918, 580, 2285, 3103, 1504, 2903, 1567, 1492, 1947, 1903, 3136, 3253, 3144, 7, 1942, 458, 3048, 2680, 2890, 2211, 814, 623, 432, 1697, 65, 2915, 918, 746, 393, 1447, 1091, 2146, 1006, 813, 692, 987, 2204, 1951, 3119, 1437, 670, 1764, 2190, 2534, 247, 3110, 2500, 2363, 3009, 590, 2924, 2032, 2373, 2796, 3179, 444, 665, 1942, 2698, 788, 1383, 1109, 1577, 158, 1913, 2380, 3202, 891, 1299, 2313, 1837, 2651, 1035, 348, 2949, 341, 312, 1643, 1191, 416, 522, 2848, 1227, 1525, 2185, 1291, 2750, 2684, 3301, 1843, 1330, 983, 2276, 98, 3214, 957, 2386, 2653, 3212, 1765, 2882, 909, 585, 3035, 2211, 312, 465, 1721, 397, 2502, 2477, 336, 1110, 2682, 3041, 1211, 1274, 2963, 866, 692, 1960, 2355, 1417, 1439, 540, 2149, 2495, 1908, 478, 2211, 1782, 1923, 2141, 1795, 735, 1484, 3238, 2368, 73, 892, 896, 922, 180, 2550, 3254, 1785, 782, 3318, 3235, 2822, 3205, 1022, 3100, 914, 855, 2667, 3290, 3035, 1087, 1055, 1939, 1975, 770, 1305, 897, 2929, 2976]] +v: [3121, 1560, 1665, 2393, 3017, 2705, 1665, 520, 936, 208, 2289, 2081, 1977, 3121, 520, 1665, 3121, 2809, 1144, 520, 624, 0, 0, 104, 832, 416, 2809, 104, 2809, 2185, 3225, 3225, 1560, 1560, 2705, 3121, 1560, 728, 624, 1144, 1248, 1665, 3121, 1144, 208, 3225, 1456, 2185, 104, 104, 2497, 2289, 2185, 1769, 936, 1144, 2913, 520, 1144, 416, 1040, 2809, 0, 1665, 2497, 2809, 520, 1144, 1873, 728, 312, 1456, 1560, 832, 2185, 2497, 312, 416, 2289, 624, 1560, 936, 1248, 208, 2289, 1665, 1769, 1040, 728, 1248, 1560, 1665, 104, 2809, 2705, 2497, 1144, 1560, 2081, 3121, 936, 312, 728, 728, 1665, 520, 2913, 2705, 3225, 1977, 104, 3225, 1040, 2809, 1040, 520, 624, 2705, 2081, 1977, 3225, 2185, 3121, 1977, 2497, 2913, 312, 624, 1769, 2705, 936, 1560, 2913, 2809, 2289, 2393, 2289, 2497, 728, 2705, 2913, 2601, 3017, 1248, 1248, 1769, 2809, 1144, 1560, 1352, 1456, 1977, 2393, 1352, 3017, 312, 728, 2185, 2809, 2393, 520, 104, 2913, 1040, 2913, 3225, 624, 624, 1248, 2393, 1040, 3225, 104, 1456, 3121, 2081, 936, 2185, 1769, 728, 1352, 1560, 2081, 2081, 2809, 728, 3225, 1456, 936, 1456, 2289, 2809, 624, 2601, 416, 1873, 832, 3225, 2185, 1560, 2185, 2497, 0, 2289, 1560, 624, 416, 312, 1352, 520, 2393, 2393, 1560, 3017, 1248, 1248, 208, 728, 624, 3121, 520, 208, 312, 208, 2497, 0, 1456, 2081, 1352, 1977, 1769, 2601, 208, 3225, 2081, 1977, 3017, 3225, 1977, 2289, 2393, 1977, 1769, 416, 1248, 0, 2497, 728, 3017, 2289, 104, 520, 1248, 2913, 1560, 2497] +sHat: [[2575, 622, 1476, 1098, 1189, 1089, 1866, 441, 2652, 2085, 1880, 3074, 669, 1124, 2462, 837, 588, 2767, 518, 2266, 2355, 2574, 2578, 2620, 2929, 711, 2363, 162, 1287, 2081, 2321, 3136, 2764, 3150, 1183, 467, 941, 1917, 2772, 882, 2342, 353, 2988, 2967, 3300, 145, 2156, 394, 1308, 2111, 1872, 1013, 1632, 2117, 3233, 2651, 2109, 600, 884, 3157, 1589, 1473, 1870, 685, 159, 1391, 325, 663, 1537, 1743, 16, 1277, 1118, 2603, 2028, 1827, 2537, 2276, 1181, 1212, 3005, 1818, 3003, 3021, 1532, 2952, 1537, 771, 2697, 1550, 1519, 2158, 737, 398, 2060, 2851, 1255, 2667, 1598, 125, 2889, 3152, 2746, 1415, 2988, 451, 782, 2404, 114, 3184, 664, 2304, 1259, 287, 1154, 920, 3310, 2280, 2401, 2850, 344, 990, 3090, 2839, 90, 3248, 1659, 2260, 832, 2898, 2825, 2487, 46, 2485, 2128, 2318, 2998, 1139, 2055, 1940, 609, 2538, 1304, 1750, 210, 2541, 2922, 2179, 579, 2126, 1084, 2139, 2127, 273, 366, 2007, 987, 1360, 423, 853, 690, 1696, 3189, 2274, 383, 2287, 2575, 916, 796, 2042, 2907, 3266, 2440, 2460, 1204, 1918, 1104, 1628, 3143, 126, 618, 348, 560, 711, 2554, 1663, 409, 3222, 2182, 3128, 2902, 370, 204, 2072, 326, 602, 2418, 2908, 1535, 417, 1195, 1045, 265, 2112, 1550, 1058, 1849, 3160, 736, 2285, 2802, 1342, 1514, 2398, 542, 2758, 1403, 397, 953, 168, 3149, 3307, 874, 1625, 2705, 2286, 1522, 119, 2442, 1840, 2693, 1234, 1043, 2384, 3024, 1008, 1313, 344, 153, 457, 2557, 879, 1155, 3204, 528, 756, 254, 2218, 3053, 428, 895, 1581, 1631, 2818, 308, 760], +[1955, 2736, 44, 2370, 1364, 1350, 365, 2611, 1089, 26, 317, 2200, 1460, 255, 232, 2662, 2664, 3197, 945, 1088, 1566, 505, 206, 3163, 945, 1247, 1522, 2446, 2246, 3325, 2144, 1611, 3093, 1792, 2877, 3042, 2988, 9, 538, 266, 1921, 2788, 2667, 2792, 1836, 2327, 2523, 1390, 2497, 2863, 2564, 343, 2422, 1072, 1671, 1216, 58, 440, 2317, 3224, 1430, 3322, 163, 299, 1217, 900, 953, 1343, 3084, 1520, 2217, 2547, 2832, 1007, 753, 30, 2099, 1043, 2911, 471, 436, 2769, 3321, 1841, 1462, 1716, 2920, 1994, 3068, 3223, 1065, 1262, 2904, 846, 202, 2785, 49, 959, 2860, 2659, 716, 2026, 3251, 2837, 2615, 313, 3082, 2170, 2275, 1883, 719, 1342, 943, 3136, 2237, 1015, 1304, 2604, 2552, 692, 3263, 1383, 1415, 2437, 1713, 1019, 3046, 108, 148, 1165, 268, 3210, 1784, 1992, 2065, 3067, 819, 714, 1824, 2555, 1180, 2154, 1669, 264, 1969, 2105, 1982, 2127, 3007, 246, 3205, 424, 377, 769, 2522, 1398, 754, 561, 2382, 2156, 377, 1208, 2536, 3059, 2833, 1104, 2241, 2108, 3308, 989, 2227, 559, 1956, 3103, 1573, 1765, 1745, 854, 2152, 1052, 60, 461, 1570, 1956, 213, 418, 3082, 1901, 1332, 2595, 1483, 3280, 196, 1831, 937, 1796, 1269, 843, 3319, 117, 395, 1428, 2195, 1358, 477, 1982, 1727, 3080, 2502, 2620, 1316, 808, 729, 316, 926, 3199, 2906, 3177, 2195, 263, 3168, 2797, 2607, 1423, 3289, 1356, 2447, 3089, 974, 1605, 3208, 2032, 3253, 3184, 190, 1332, 1554, 3277, 916, 1888, 792, 2191, 196, 2809, 399, 2966, 1204, 1216, 2807, 1477, 2775, 337, 2949, 1523, 726, 1218], +[1387, 2313, 1509, 24, 466, 1064, 2304, 412, 1010, 3272, 2347, 2772, 2699, 1471, 682, 2426, 895, 2080, 63, 2534, 1275, 610, 1785, 3123, 1794, 152, 1659, 2941, 1725, 1932, 1378, 2184, 2947, 1437, 2132, 64, 2345, 3291, 2562, 2412, 3260, 3249, 475, 533, 2271, 95, 688, 1192, 2542, 2537, 2859, 731, 1410, 995, 2669, 771, 519, 1929, 2064, 3157, 1902, 159, 906, 1419, 78, 1578, 30, 818, 2685, 2419, 861, 3321, 2098, 1749, 362, 2599, 3012, 2859, 2050, 1339, 2559, 3136, 1031, 955, 2332, 2833, 3268, 2956, 2081, 724, 2013, 882, 1921, 2727, 383, 1926, 3145, 1015, 2490, 1815, 1107, 2248, 2909, 496, 1344, 1259, 413, 2357, 2704, 772, 575, 1527, 3084, 1644, 3270, 2844, 1368, 104, 1029, 1747, 2996, 2162, 2429, 3309, 1701, 2511, 530, 539, 3271, 1310, 1792, 1631, 2439, 2107, 75, 3180, 833, 2293, 2179, 1470, 2483, 208, 3002, 3263, 267, 391, 3327, 2423, 745, 1589, 21, 1047, 3320, 1034, 82, 1037, 53, 3264, 2127, 2374, 1877, 1225, 3051, 117, 103, 2569, 80, 2878, 2038, 679, 1911, 1350, 1567, 2927, 2683, 466, 1876, 2080, 1798, 1668, 1679, 163, 299, 1136, 1847, 1814, 2345, 2848, 1319, 2230, 1510, 1924, 1096, 1036, 373, 1671, 2054, 2177, 3160, 2825, 2394, 2537, 2389, 1652, 401, 427, 1778, 1712, 2744, 1868, 352, 3141, 2664, 176, 960, 2087, 2625, 2946, 952, 410, 2011, 2380, 1757, 2380, 3007, 2077, 63, 2904, 651, 535, 1677, 1245, 3068, 2589, 2219, 2708, 2639, 2263, 714, 1641, 1485, 2625, 2861, 2649, 2043, 1654, 1449, 1317, 1388, 208, 2530, 2229, 2577, 690, 2576, 2595], +[209, 1551, 1647, 2222, 2389, 481, 3061, 771, 3119, 407, 802, 28, 2766, 2446, 666, 310, 64, 2697, 1632, 1911, 1135, 1130, 1831, 795, 1635, 1400, 1898, 2070, 629, 395, 1254, 2095, 2997, 3170, 2818, 3047, 1715, 2436, 185, 760, 1750, 839, 2497, 1242, 1492, 3292, 3145, 1774, 1581, 1526, 1906, 2071, 3281, 270, 1706, 1711, 2008, 2482, 667, 1231, 2201, 1886, 1260, 857, 1581, 89, 250, 3251, 2877, 616, 134, 923, 1905, 1546, 1459, 944, 1076, 1747, 269, 2887, 2893, 2008, 1582, 426, 92, 2705, 819, 2237, 932, 872, 369, 1857, 340, 1142, 3028, 660, 2068, 1391, 2441, 3101, 191, 880, 1991, 895, 2428, 781, 1743, 255, 132, 2603, 3328, 997, 1534, 3189, 2865, 433, 609, 1891, 651, 2309, 1752, 2947, 1067, 1084, 3011, 1266, 1772, 41, 2841, 541, 1842, 2463, 1546, 2125, 675, 2551, 2621, 705, 2794, 499, 484, 619, 1141, 2204, 1007, 403, 399, 2576, 6, 1768, 2300, 2350, 1053, 1772, 3223, 161, 1546, 1189, 1529, 1742, 1959, 2674, 3172, 1377, 1420, 2729, 1625, 2325, 2059, 2114, 2089, 239, 743, 1762, 1181, 108, 1150, 2371, 1615, 2336, 1133, 2852, 1999, 1608, 1015, 1425, 1083, 660, 3064, 2290, 204, 1910, 408, 1721, 2945, 2309, 920, 227, 1219, 659, 2061, 3083, 2123, 976, 2803, 268, 1486, 1875, 7, 643, 1257, 2601, 1883, 654, 2424, 756, 1761, 2411, 3258, 2837, 935, 407, 2874, 643, 1188, 1039, 2222, 725, 711, 1276, 1511, 468, 1638, 567, 2347, 1563, 1221, 192, 670, 21, 938, 3295, 1101, 174, 2517, 1402, 1418, 655, 1296, 2363, 489, 1512, 1571, 1023, 86, 1556]] +w: [1740, 3246, 1647, 44, 19, 3261, 2, 20, 1595, 3296, 110, 1684, 48, 81, 1566, 1653, 30, 3215, 137, 1688, 1685, 3285, 1601, 3240, 3245, 4, 1683, 1611, 3292, 1659, 1736, 1630, 135, 1607, 1654, 51, 65, 1611, 47, 3, 3293, 1747, 1678, 2, 1817, 3266, 1618, 3283, 1701, 1574, 3287, 1667, 1758, 8, 14, 49, 1692, 3185, 1628, 1648, 3315, 1749, 1745, 26, 5, 3249, 3217, 1781, 1620, 1588, 48, 1654, 70, 33, 3304, 1692, 1762, 3292, 58, 3241, 76, 23, 1609, 14, 1617, 1629, 1721, 1696, 3260, 9, 3322, 1663, 1684, 1668, 3326, 1641, 1729, 1599, 75, 1573, 3275, 26, 1652, 1550, 3256, 1567, 1647, 1724, 3226, 1704, 3294, 3296, 85, 54, 3263, 1654, 3293, 1685, 3318, 3296, 1758, 3222, 3227, 1648, 1724, 3314, 39, 1734, 3270, 1729, 1655, 1702, 8, 3273, 3233, 35, 52, 3304, 1681, 43, 1637, 1701, 1738, 3257, 99, 3305, 1574, 3220, 3281, 3290, 80, 1631, 1657, 1674, 1692, 190, 1683, 3291, 25, 3289, 3248, 54, 3313, 1695, 1613, 3290, 1604, 3296, 1576, 1635, 1737, 1575, 1781, 1685, 1636, 142, 3237, 25, 1565, 1683, 3132, 1612, 1598, 1580, 51, 6, 3253, 1693, 1610, 1580, 3257, 134, 1643, 3205, 51, 21, 115, 1593, 3326, 1714, 42, 83, 3293, 1620, 23, 1648, 73, 3327, 1630, 1665, 56, 1717, 3286, 3198, 1563, 140, 1569, 1761, 3299, 1660, 1652, 1661, 82, 1654, 1770, 1606, 1676, 1541, 3272, 107, 1671, 3284, 1622, 18, 3324, 1639, 1723, 1613, 1653, 1725, 3297, 15, 1673, 3253, 3306, 1647, 1668, 1595, 3305, 47, 0, 1574, 1587, 1692, 1761, 3278] +mPrime: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 + +KPrime: C61F73D2BFB18594E1BA5D3B58B4C934206D3A6F8EC91395AB7779C61FA1DD6F +rPrime: 6DC410C18448882046E2162045D93FE36D6F9C6B27F2A04E04050E9985617B1D + +tHat: [[1188, 120, 2593, 2579, 176, 2297, 1867, 1265, 1414, 1853, 1274, 896, 2148, 3049, 2408, 2275, 653, 215, 295, 280, 472, 1851, 3, 678, 918, 1534, 2902, 607, 3095, 1267, 842, 3232, 2346, 3068, 3193, 2749, 2934, 3300, 68, 1025, 30, 305, 742, 2245, 460, 309, 1333, 1912, 986, 1880, 992, 1074, 3088, 664, 548, 1373, 3102, 3157, 161, 1243, 2287, 808, 1357, 1272, 3273, 1186, 3295, 567, 769, 2019, 69, 3058, 1475, 1382, 1647, 150, 1582, 1955, 1766, 288, 1652, 1332, 3009, 1150, 752, 152, 593, 2586, 588, 1428, 1033, 211, 1927, 386, 2702, 138, 1764, 1928, 2200, 1892, 208, 2256, 2478, 25, 1627, 1587, 3069, 1836, 343, 1332, 779, 2204, 347, 1569, 780, 2894, 791, 522, 2273, 312, 3257, 569, 90, 1788, 85, 246, 2200, 2083, 191, 47, 54, 1969, 592, 1348, 2907, 1910, 2136, 2790, 2555, 2903, 2453, 1685, 1538, 2492, 2718, 988, 3125, 1560, 254, 878, 2258, 2753, 2627, 1019, 82, 1708, 2191, 424, 1918, 61, 1158, 705, 1466, 3276, 3076, 3135, 1566, 625, 374, 3301, 3117, 1292, 1556, 2991, 346, 1481, 2067, 2099, 1102, 1871, 438, 1431, 3091, 1963, 2382, 965, 1896, 1640, 1965, 109, 920, 2027, 1286, 926, 789, 2143, 3128, 600, 1732, 1506, 1052, 1275, 227, 413, 465, 2786, 588, 1075, 1871, 2819, 2980, 1692, 3271, 2396, 880, 1287, 2499, 980, 271, 459, 212, 2557, 3113, 1389, 3008, 3207, 3051, 3328, 2824, 1042, 324, 1106, 3174, 531, 939, 836, 2407, 1515, 1986, 2116, 291, 2236, 3314, 1806, 2878, 2607, 2700, 3037, 1858, 2955, 1331, 209, 621, 1514, 2736, 2096], +[40, 745, 2093, 2480, 1621, 2477, 2733, 2377, 2264, 609, 1100, 2821, 333, 1238, 2580, 775, 3243, 63, 729, 2521, 2710, 2043, 1665, 1496, 931, 3141, 2644, 1963, 2215, 424, 1209, 3095, 184, 2111, 2334, 3143, 1601, 1608, 1001, 2645, 2381, 814, 2323, 1830, 1153, 467, 1335, 143, 3048, 2796, 317, 2136, 1285, 1652, 3294, 2287, 3131, 2731, 1858, 2308, 2172, 948, 2959, 2113, 1203, 3090, 2727, 2124, 2882, 1725, 635, 2241, 899, 3041, 543, 1406, 145, 2482, 2694, 996, 282, 2262, 1878, 269, 982, 3071, 1365, 265, 3094, 1127, 2892, 2486, 1163, 2316, 184, 926, 37, 989, 2830, 1502, 1912, 2369, 2856, 2059, 3027, 335, 136, 1796, 412, 324, 2170, 1782, 3273, 3035, 1997, 3199, 3306, 775, 1275, 246, 3056, 1877, 2873, 2746, 2416, 664, 2312, 974, 969, 1148, 3320, 2186, 1694, 1125, 906, 1457, 1433, 1143, 312, 1534, 1870, 2006, 1523, 3063, 795, 1540, 3178, 1138, 2872, 256, 416, 1228, 2088, 965, 387, 419, 1064, 2853, 937, 505, 214, 2150, 1985, 1168, 1267, 1395, 1919, 189, 2385, 1291, 1888, 1296, 409, 2483, 3135, 2903, 1970, 771, 1836, 163, 1827, 1505, 334, 960, 2134, 434, 687, 3054, 671, 1448, 1584, 2742, 2699, 1403, 659, 494, 2170, 2420, 1676, 207, 2825, 497, 128, 3116, 1080, 2609, 1807, 1543, 2656, 3297, 427, 539, 82, 2368, 2575, 351, 546, 151, 1389, 2260, 3328, 61, 927, 1714, 1831, 2898, 1672, 556, 1796, 2510, 1605, 2065, 1247, 270, 1262, 700, 1140, 1449, 1004, 304, 419, 2377, 298, 2846, 1826, 1233, 2494, 2741, 2334, 195, 2518, 1044, 3139, 1878, 681, 963], +[1641, 1050, 2184, 1792, 763, 2059, 947, 1979, 2363, 2093, 2488, 1362, 2914, 112, 2179, 747, 393, 2630, 2820, 3187, 3318, 230, 2802, 1509, 977, 613, 504, 1768, 1118, 362, 2174, 3070, 1638, 1110, 285, 1459, 1324, 327, 1857, 705, 807, 8, 550, 1560, 3271, 1784, 1548, 1380, 2343, 2871, 2465, 1777, 903, 1528, 3193, 2943, 3040, 2588, 1619, 3267, 387, 1390, 709, 640, 2183, 154, 1158, 2507, 1819, 1621, 660, 794, 578, 1190, 703, 1157, 290, 2244, 353, 2304, 594, 2054, 613, 1175, 1869, 1331, 704, 2070, 487, 2031, 2317, 1735, 1751, 2039, 2524, 30, 2046, 289, 2720, 976, 2870, 1070, 2366, 2146, 1672, 2356, 1066, 793, 2744, 1644, 271, 2428, 862, 2674, 2651, 1300, 222, 1681, 1491, 2554, 2926, 686, 1884, 686, 1673, 2897, 1000, 1142, 2670, 3158, 626, 2553, 2348, 3010, 1878, 2978, 409, 1588, 974, 1453, 951, 448, 2304, 116, 1316, 1445, 1741, 318, 1198, 3131, 2537, 2073, 3014, 1490, 2502, 2874, 1883, 2346, 1056, 866, 137, 1438, 1609, 2137, 1148, 1488, 2407, 977, 414, 436, 847, 2527, 3087, 968, 10, 2775, 2743, 1794, 801, 1758, 2916, 671, 845, 697, 292, 2606, 3004, 3136, 2588, 2612, 3253, 974, 1776, 1838, 1246, 241, 1864, 820, 765, 3064, 2312, 834, 181, 2660, 1077, 1164, 2200, 2750, 1678, 1104, 2672, 2645, 385, 2231, 577, 3139, 551, 2041, 1454, 3063, 1686, 2641, 3138, 516, 2848, 3166, 463, 3020, 270, 1629, 1338, 14, 1882, 1345, 1560, 513, 183, 1759, 881, 310, 2819, 2931, 42, 1604, 2938, 749, 870, 1799, 2034, 1276, 1243, 1065, 1037, 2266, 2001, 2515], +[2490, 2725, 2082, 1407, 482, 3155, 960, 664, 1536, 3158, 1608, 439, 2271, 1523, 1327, 2072, 379, 514, 870, 2557, 1795, 2043, 1166, 303, 1049, 3070, 441, 748, 2383, 2188, 1792, 469, 2594, 2707, 554, 3187, 675, 2684, 3279, 2457, 90, 2686, 949, 2329, 2814, 1273, 781, 950, 2555, 2247, 1844, 699, 2746, 2550, 1046, 316, 2094, 2904, 1392, 2231, 469, 3221, 539, 2781, 1003, 2677, 1578, 2732, 2051, 2518, 3030, 52, 2391, 2688, 1711, 2132, 2883, 380, 2870, 3229, 3015, 1314, 158, 1431, 2157, 2833, 1692, 2282, 2657, 327, 2172, 2513, 2600, 1907, 3176, 2808, 2708, 1453, 2830, 1593, 2584, 1025, 1979, 3038, 2113, 2598, 1869, 1074, 2329, 2362, 2748, 2222, 191, 1525, 744, 294, 662, 2905, 2237, 1182, 2803, 3222, 303, 1815, 2277, 1427, 1585, 67, 490, 188, 2274, 1783, 1523, 2968, 2247, 337, 2120, 1905, 1839, 2954, 153, 1260, 2301, 2689, 2561, 1945, 1718, 1247, 2651, 713, 1877, 2126, 1995, 3236, 2089, 1380, 2664, 2665, 3239, 3104, 3195, 518, 468, 3197, 1065, 156, 2512, 603, 3268, 768, 1984, 1927, 1813, 1904, 2121, 2228, 141, 927, 1286, 2745, 1243, 2240, 380, 2142, 566, 2640, 1357, 961, 1522, 362, 1047, 1976, 1553, 974, 1612, 407, 1382, 2781, 1427, 211, 2746, 1197, 277, 588, 189, 2184, 2417, 1017, 1479, 2919, 228, 3121, 2438, 245, 2675, 2272, 1993, 1508, 494, 1289, 2361, 446, 1135, 606, 1721, 1664, 3270, 1322, 1880, 2811, 2832, 2547, 862, 178, 2929, 3001, 1801, 472, 705, 342, 2583, 683, 3203, 2409, 1706, 1098, 1802, 1512, 172, 2857, 1688, 445, 979, 2767, 1161, 91]] + +bHat = aHat^T: [[[2624, 568, 2343, 2233, 2805, 2899, 2873, 862, 1680, 1122, 2223, 1232, 675, 223, 877, 554, 3109, 1566, 1221, 2974, 631, 3155, 353, 85, 3205, 916, 3125, 2800, 13, 2810, 1568, 429, 563, 1252, 1415, 2283, 2688, 1290, 3302, 649, 589, 1319, 2435, 655, 549, 2025, 2435, 1070, 995, 3155, 1026, 2083, 974, 2385, 93, 1256, 2492, 2678, 3138, 1863, 1159, 1109, 2613, 662, 2632, 1104, 1563, 1378, 2425, 1369, 611, 236, 2763, 2290, 3078, 2556, 386, 1806, 735, 831, 2924, 2003, 2871, 2522, 2509, 914, 1083, 1197, 1758, 2568, 1334, 2933, 543, 2137, 3112, 434, 776, 1395, 2779, 2681, 439, 1404, 2186, 2413, 3163, 34, 1561, 2114, 2889, 2952, 1819, 2707, 2234, 2185, 2329, 1552, 2269, 1453, 3081, 2519, 2289, 539, 806, 1893, 3036, 2448, 283, 2499, 117, 677, 994, 1962, 461, 2927, 2741, 331, 2486, 2447, 1930, 2426, 2701, 2778, 224, 772, 2444, 97, 0, 12, 626, 2491, 3044, 655, 2045, 738, 1645, 1426, 1334, 936, 2424, 192, 3313, 334, 1788, 1179, 149, 2674, 2776, 3000, 3129, 606, 732, 1811, 636, 355, 702, 3041, 2996, 1356, 1668, 2856, 3297, 2606, 2095, 973, 488, 2087, 532, 662, 2483, 528, 1732, 1731, 2227, 307, 1570, 2730, 2661, 512, 2669, 1085, 376, 2425, 1357, 2493, 1542, 2905, 27, 2645, 1219, 3235, 964, 825, 1505, 1674, 2035, 2117, 883, 961, 338, 1483, 1964, 2875, 731, 817, 164, 1113, 2260, 1775, 3152, 2447, 2146, 322, 1161, 3061, 1272, 2586, 46, 1580, 2792, 1404, 2247, 479, 1185, 268, 2075, 1355, 2787, 159, 3022, 14, 2382, 15, 2529, 815, 3234, 2762], +[2629, 1997, 2999, 1097, 137, 1577, 1900, 1104, 1001, 1440, 2424, 609, 2363, 1592, 130, 3142, 2673, 3040, 1280, 3295, 1901, 2413, 3046, 2832, 201, 439, 1201, 2413, 1883, 622, 92, 13, 1687, 2757, 1880, 1234, 2632, 560, 251, 396, 1783, 2916, 1138, 2990, 361, 2641, 27, 2237, 2272, 2193, 3129, 886, 1795, 1779, 2149, 2804, 2857, 1854, 1378, 3054, 394, 1916, 845, 2223, 158, 30, 3243, 277, 2010, 2276, 2939, 2488, 1972, 1670, 950, 1919, 1914, 2179, 2793, 782, 1729, 765, 2667, 364, 373, 2127, 2856, 291, 1981, 1220, 3128, 1221, 1286, 642, 2538, 2719, 2928, 1831, 26, 215, 3185, 2281, 518, 306, 1696, 1186, 2416, 3172, 1707, 761, 1563, 2160, 64, 2901, 1932, 2750, 2014, 3232, 1255, 2255, 60, 155, 2295, 1060, 279, 761, 1916, 835, 1373, 582, 1286, 2901, 1228, 2238, 611, 299, 1915, 22, 2933, 337, 2796, 2308, 2280, 1388, 2764, 1312, 1073, 3084, 2467, 2918, 1874, 3254, 3078, 2895, 2580, 2327, 1351, 1919, 1337, 409, 3067, 1023, 2327, 413, 1829, 2534, 2638, 1918, 3215, 35, 3248, 3325, 1764, 1766, 1393, 745, 82, 1052, 1128, 3070, 1811, 802, 679, 241, 2434, 1471, 1158, 1994, 3075, 2179, 2694, 579, 16, 2918, 2980, 1404, 168, 1251, 3011, 2492, 1835, 2206, 1910, 1589, 1495, 2248, 699, 522, 1341, 1561, 2988, 3196, 1256, 1345, 508, 252, 211, 1764, 203, 1641, 1042, 396, 1582, 1581, 3321, 1317, 1307, 3201, 2143, 3186, 1067, 2674, 1455, 2192, 1017, 2701, 2103, 513, 1084, 2345, 1712, 2798, 2048, 880, 851, 2992, 2355, 48, 4, 1212, 2558, 2978, 715, 2217, 2388, 2088], +[2987, 273, 1770, 1102, 1971, 3319, 510, 2205, 3078, 1835, 191, 851, 89, 2463, 3156, 2065, 3103, 872, 3160, 1639, 2774, 945, 875, 2723, 2952, 3094, 2384, 837, 1586, 2229, 1725, 2179, 3081, 2650, 2181, 1175, 1049, 1294, 90, 1765, 555, 3164, 2556, 1274, 796, 2802, 1471, 1642, 2526, 1128, 3287, 976, 671, 2519, 1954, 1740, 1026, 1812, 2252, 845, 1144, 1595, 648, 2181, 1608, 1664, 830, 695, 3260, 1279, 2937, 2090, 1488, 1583, 930, 1576, 1832, 1167, 564, 1811, 1975, 2946, 1567, 1744, 416, 624, 2742, 275, 2330, 261, 2551, 1218, 275, 1296, 3056, 2183, 245, 1847, 1705, 874, 914, 565, 1927, 501, 2152, 2471, 3211, 2397, 2891, 1258, 2064, 1753, 999, 1006, 3315, 2414, 1949, 1231, 2831, 3146, 1703, 2372, 2345, 156, 3078, 343, 2771, 1873, 1709, 2947, 1945, 1644, 1648, 547, 1193, 1949, 2797, 827, 3136, 310, 636, 2212, 71, 2744, 1694, 3218, 1367, 2236, 2096, 2133, 2509, 1490, 2800, 2296, 3096, 3200, 2041, 813, 2231, 3255, 2686, 3180, 995, 2066, 748, 3059, 1857, 1182, 2027, 708, 1658, 2201, 647, 2114, 2442, 629, 3146, 1167, 2999, 3254, 2345, 740, 3109, 716, 1227, 740, 3188, 220, 443, 2741, 1181, 634, 2402, 2461, 804, 1544, 224, 345, 449, 2810, 688, 1900, 172, 941, 667, 1613, 1424, 764, 26, 1666, 974, 2352, 2772, 397, 3037, 1452, 1423, 927, 2881, 2724, 3182, 2090, 784, 1973, 780, 794, 1469, 2338, 3118, 826, 2391, 2938, 172, 2039, 1162, 1330, 138, 3133, 1518, 2500, 1571, 2412, 3111, 2600, 1767, 1177, 935, 1238, 1054, 2788, 3015, 52, 1839, 1319, 1638, 3304], +[2564, 46, 3039, 1265, 664, 3080, 3046, 737, 1933, 895, 2587, 227, 480, 254, 1794, 3059, 1222, 477, 833, 387, 1745, 3025, 1713, 2893, 1063, 11, 3121, 724, 404, 3122, 1214, 1049, 496, 1828, 1278, 960, 3093, 639, 2967, 2987, 1777, 1251, 193, 1933, 319, 2372, 2975, 2140, 584, 454, 3118, 1832, 2460, 1921, 571, 981, 1009, 1318, 2167, 851, 1839, 3154, 2923, 2121, 3192, 2486, 3268, 1020, 449, 1355, 1720, 2757, 616, 3262, 3237, 585, 2873, 1484, 2566, 1664, 2767, 2250, 1187, 3278, 1661, 329, 634, 606, 2877, 2035, 975, 433, 445, 14, 1683, 157, 25, 3075, 1176, 2831, 945, 1947, 744, 1907, 2585, 2300, 2869, 2347, 113, 281, 429, 694, 1261, 3221, 2524, 2928, 2528, 474, 2659, 2178, 2044, 2418, 2623, 1366, 1110, 2711, 1449, 453, 1862, 3086, 1665, 1522, 45, 900, 2857, 3286, 1714, 2597, 109, 2432, 2006, 562, 3247, 2119, 1769, 422, 1348, 2281, 898, 755, 2120, 359, 2189, 2682, 589, 442, 1435, 2438, 3315, 241, 142, 2907, 25, 1337, 724, 2767, 2929, 492, 1136, 533, 1590, 321, 575, 1052, 2051, 902, 3208, 626, 2637, 1349, 945, 1624, 1225, 928, 968, 438, 1202, 1447, 1819, 499, 1134, 1702, 141, 1522, 1259, 3188, 2952, 2275, 1974, 2385, 1084, 2399, 3150, 403, 1802, 615, 2440, 1036, 3114, 2179, 1054, 2675, 232, 1358, 673, 1759, 1779, 53, 1113, 862, 1907, 2112, 1388, 752, 1247, 3067, 2591, 2477, 440, 323, 1086, 1599, 3174, 3179, 2493, 375, 365, 2496, 2012, 3239, 624, 3187, 490, 2254, 1256, 2758, 2170, 317, 1619, 2913, 3150, 2862, 1356, 259, 249, 192]], +[[381, 2010, 2217, 1935, 3124, 1918, 3067, 2709, 2398, 1950, 949, 3173, 1987, 2300, 3321, 3290, 2006, 3170, 2635, 3264, 2064, 1442, 1427, 197, 2613, 988, 2821, 2533, 2379, 3066, 1247, 2768, 2704, 3307, 3222, 2868, 46, 14, 177, 3281, 3083, 2638, 1200, 1130, 1336, 2347, 2636, 2717, 1414, 1911, 3073, 2977, 2154, 700, 2743, 2137, 865, 1748, 2420, 3187, 2830, 429, 2817, 995, 3232, 2409, 366, 571, 597, 2748, 999, 1717, 3245, 1510, 520, 1472, 1571, 1308, 2647, 2104, 2201, 3127, 2504, 3313, 1963, 3236, 3132, 1973, 1926, 2273, 1464, 433, 990, 1395, 1439, 1944, 118, 245, 1968, 73, 2213, 2863, 1629, 1291, 2108, 919, 2326, 1607, 1124, 2463, 1063, 1909, 548, 990, 843, 1599, 2128, 1820, 1629, 580, 729, 1649, 1041, 1857, 2661, 1263, 117, 1986, 2337, 1459, 3305, 3041, 88, 3314, 685, 1898, 3303, 662, 845, 2607, 894, 3200, 1403, 2958, 999, 1700, 2838, 781, 1807, 2331, 2205, 2672, 2411, 856, 185, 1136, 228, 3177, 2475, 932, 3264, 1968, 1843, 2819, 1970, 245, 464, 1845, 2761, 1190, 1102, 1581, 1915, 621, 1083, 452, 3092, 1567, 1436, 2040, 953, 155, 2788, 314, 1167, 1017, 422, 917, 3286, 1063, 1086, 208, 460, 2537, 93, 2322, 2852, 1876, 2207, 2289, 2385, 2937, 2935, 1774, 411, 1893, 897, 2465, 1228, 204, 1036, 299, 3140, 1190, 2309, 3125, 143, 188, 569, 2166, 1952, 1963, 2791, 2692, 1003, 1272, 671, 212, 3204, 1518, 1627, 2391, 2481, 1162, 891, 234, 3160, 33, 1095, 1921, 1902, 586, 1479, 256, 3005, 14, 1312, 2855, 1017, 2588, 1662, 2974, 2668, 2186, 1232, 2454], +[2762, 243, 107, 2437, 1701, 3113, 1491, 1412, 59, 1936, 1069, 143, 1822, 3004, 1307, 2896, 591, 2456, 3104, 3228, 2832, 1517, 1186, 801, 1049, 1786, 293, 2898, 2994, 2183, 1966, 2133, 1823, 1015, 2101, 854, 1381, 11, 1377, 2887, 1587, 270, 1719, 2804, 2076, 595, 3158, 1782, 2244, 1967, 1156, 2483, 2271, 2011, 2829, 2783, 933, 1300, 3312, 66, 594, 1992, 2471, 792, 3224, 240, 2242, 1235, 305, 1374, 130, 1248, 3130, 1380, 3075, 3224, 1643, 269, 560, 2250, 3156, 1084, 3316, 1254, 2705, 1011, 852, 1665, 2469, 51, 2986, 1126, 3080, 322, 3263, 306, 284, 69, 432, 3307, 1563, 2270, 2650, 118, 2398, 1171, 3073, 377, 2549, 1390, 1255, 2624, 1885, 2614, 289, 1373, 2201, 875, 490, 3300, 1697, 2130, 2387, 230, 3106, 964, 1618, 1786, 2565, 717, 2280, 2892, 2662, 355, 478, 2333, 37, 2236, 83, 862, 2302, 1349, 3050, 1944, 1096, 86, 3182, 2964, 2045, 2845, 2654, 3261, 1209, 706, 1881, 665, 2871, 939, 993, 1598, 1160, 2792, 3021, 398, 2892, 938, 2505, 2795, 2316, 2641, 2867, 2979, 677, 1050, 3313, 2851, 120, 1476, 615, 1299, 3185, 1919, 528, 590, 1317, 2059, 572, 1579, 3018, 1104, 1557, 706, 3294, 154, 1592, 1195, 1587, 1498, 2034, 1586, 1425, 2087, 1068, 2078, 1673, 1391, 1534, 1126, 2936, 2390, 334, 1332, 1738, 2686, 1195, 564, 1864, 1712, 2155, 740, 1529, 494, 3117, 3118, 2098, 503, 440, 977, 1407, 2450, 2408, 1645, 2068, 160, 1809, 2710, 606, 776, 680, 918, 1485, 2401, 163, 488, 856, 1283, 445, 2185, 1773, 3004, 975, 1157, 234, 800, 3266, 2201], +[2117, 656, 1637, 514, 414, 3033, 3278, 927, 1965, 2351, 2372, 2572, 2285, 1624, 1529, 2780, 2665, 3015, 1022, 303, 1509, 2229, 897, 368, 52, 337, 1722, 2719, 1336, 2374, 2388, 1094, 318, 481, 3276, 2700, 39, 3112, 2367, 3010, 3220, 1094, 3203, 61, 3264, 1979, 2048, 292, 1475, 1328, 1112, 2813, 375, 1839, 1986, 2295, 1697, 2070, 112, 674, 921, 1719, 1195, 1767, 1483, 924, 703, 1606, 1365, 694, 3098, 3120, 2285, 1212, 2531, 401, 1093, 2550, 676, 2945, 465, 1061, 3053, 750, 2714, 2615, 2047, 2270, 3069, 1945, 1286, 2207, 2170, 2816, 1972, 299, 1068, 1767, 1968, 1078, 2544, 2320, 236, 3019, 1531, 2493, 1717, 1885, 2289, 2477, 2462, 1624, 2352, 2360, 2580, 2544, 3134, 902, 2502, 3233, 1789, 252, 197, 1803, 372, 1343, 922, 856, 633, 130, 2445, 1149, 1796, 381, 16, 2159, 2764, 3185, 2271, 2513, 1133, 1126, 1096, 272, 30, 1062, 3126, 676, 3236, 2500, 1695, 95, 2682, 2890, 3286, 3301, 2070, 1087, 1976, 2259, 692, 1612, 1169, 1045, 3022, 1192, 1469, 2662, 1868, 2545, 1135, 3258, 5, 2323, 1039, 2021, 1337, 931, 1029, 557, 2597, 2287, 955, 1463, 2298, 685, 2263, 310, 708, 2283, 3234, 1586, 20, 357, 2502, 2507, 1812, 2436, 271, 736, 1490, 2144, 718, 367, 2901, 1572, 1384, 2268, 875, 1557, 745, 2024, 1149, 2133, 1916, 2525, 469, 1764, 470, 1399, 386, 2296, 1765, 3046, 976, 1578, 1532, 1111, 3047, 690, 2033, 2307, 1834, 1736, 630, 2184, 1893, 1516, 658, 2016, 2476, 361, 2781, 62, 789, 677, 758, 1460, 891, 2299, 2601, 1327, 1484, 1102, 13, 1328], +[227, 2881, 2934, 1877, 1445, 1035, 841, 1422, 2771, 2429, 439, 32, 3042, 2410, 2433, 3047, 342, 159, 2687, 164, 2746, 514, 1542, 185, 815, 3173, 417, 2081, 1736, 2824, 3188, 166, 1176, 227, 499, 834, 829, 2850, 872, 109, 1051, 3219, 1974, 2581, 246, 2085, 276, 784, 2832, 2893, 1818, 1162, 3156, 2671, 1458, 1269, 516, 1650, 1956, 152, 81, 650, 405, 1885, 1425, 2756, 1080, 1575, 1526, 1370, 1159, 2365, 2244, 3219, 1231, 391, 2300, 836, 2430, 2808, 2017, 2430, 2782, 1098, 721, 2547, 223, 2068, 2136, 303, 1057, 830, 446, 1691, 2516, 953, 2930, 2537, 2846, 1274, 1762, 982, 945, 1742, 376, 1052, 1974, 2328, 354, 474, 1604, 2917, 1202, 1867, 1998, 2692, 3228, 2207, 3013, 3192, 1731, 2191, 2099, 1237, 2132, 767, 2776, 650, 2881, 2442, 561, 1370, 143, 2114, 312, 1124, 2301, 1839, 3214, 1812, 697, 534, 3285, 346, 698, 103, 1895, 1926, 1233, 2431, 2814, 1204, 2568, 538, 1855, 2019, 1934, 3319, 2912, 2543, 1651, 2416, 2303, 416, 2725, 1484, 611, 727, 1756, 2115, 1847, 647, 3133, 2504, 158, 832, 1346, 2857, 350, 1722, 1583, 936, 1232, 3297, 1156, 1933, 1842, 439, 728, 2141, 612, 325, 731, 2358, 1969, 1649, 1438, 886, 691, 2115, 1323, 552, 421, 2834, 1097, 625, 2630, 814, 265, 1019, 3063, 208, 1734, 2395, 1264, 2214, 2112, 1205, 159, 2197, 2168, 2655, 764, 3128, 603, 241, 973, 2703, 1961, 1396, 2123, 264, 2771, 440, 2114, 288, 1235, 108, 2591, 341, 2753, 851, 879, 0, 2593, 1439, 368, 2797, 1415, 2834, 2179, 1599, 2494, 3285, 2028, 3323]], +[[3236, 336, 469, 393, 681, 1084, 2197, 49, 1351, 3173, 375, 300, 2754, 1981, 2260, 1105, 3152, 1208, 2983, 499, 1136, 3164, 2357, 657, 605, 1497, 2533, 1348, 2158, 806, 694, 1567, 1923, 3087, 473, 2114, 2185, 908, 3164, 2866, 3141, 3277, 3216, 854, 1591, 729, 1452, 961, 161, 355, 443, 2223, 3317, 1304, 1652, 1442, 2772, 1720, 951, 1645, 130, 3033, 2055, 670, 832, 2254, 220, 1226, 2317, 1560, 349, 945, 771, 1444, 1982, 144, 2894, 1534, 1865, 828, 856, 1426, 1475, 2268, 3175, 546, 3296, 2563, 3319, 423, 704, 1344, 2872, 129, 164, 986, 2004, 1171, 3029, 133, 1575, 1335, 1751, 2557, 1109, 453, 3193, 271, 2591, 216, 600, 2636, 1672, 283, 27, 1953, 812, 755, 968, 2653, 2349, 2087, 1150, 1463, 3035, 1365, 2749, 1326, 2790, 2920, 2242, 1955, 847, 1397, 15, 1378, 944, 3321, 1966, 1229, 720, 318, 728, 928, 257, 3173, 1205, 2681, 1333, 3228, 1533, 320, 2894, 1949, 1272, 1989, 1736, 811, 496, 782, 1947, 644, 606, 1791, 1273, 71, 3315, 592, 518, 1533, 1808, 2655, 2309, 665, 1545, 1743, 2915, 1705, 2116, 505, 2412, 1350, 1864, 317, 3213, 10, 1706, 3272, 1106, 2320, 1374, 3164, 314, 314, 1038, 1136, 611, 2173, 2909, 2481, 738, 103, 451, 438, 2576, 2561, 1511, 2263, 2636, 1168, 2942, 191, 603, 860, 2554, 1244, 139, 2014, 2121, 2244, 2104, 1900, 329, 1029, 1442, 1570, 3179, 2639, 1979, 2676, 2442, 3151, 141, 1884, 2742, 291, 2484, 2689, 394, 2867, 2908, 2791, 1525, 2209, 2755, 191, 1586, 2448, 972, 2742, 252, 1519, 1568, 546, 623, 2252], +[832, 1602, 2989, 2379, 2113, 3210, 609, 473, 1515, 2815, 2191, 945, 160, 937, 499, 2405, 3261, 651, 2491, 3309, 3122, 1898, 2484, 3252, 961, 1596, 837, 222, 1565, 488, 2795, 2389, 2828, 2079, 2018, 742, 1034, 1403, 343, 290, 2825, 3298, 2511, 568, 2218, 1521, 2638, 1424, 3058, 704, 370, 3135, 620, 2591, 319, 1525, 755, 2292, 2693, 331, 426, 2079, 993, 3254, 1230, 191, 145, 408, 1872, 20, 1920, 769, 2126, 1916, 3021, 1857, 2011, 420, 1694, 2362, 1954, 395, 720, 1531, 2266, 2108, 413, 1245, 2026, 3217, 1376, 119, 2314, 625, 2097, 1104, 2393, 2683, 2226, 2676, 2280, 3312, 1804, 1114, 1523, 1992, 392, 1907, 285, 568, 513, 708, 657, 1423, 3133, 3307, 1207, 8, 2310, 2378, 2873, 2270, 2854, 1284, 2285, 641, 816, 454, 1325, 468, 2772, 190, 1505, 3255, 1251, 2992, 2894, 116, 2457, 1064, 2312, 973, 3258, 935, 3064, 173, 2050, 3168, 1692, 1068, 2453, 2082, 548, 3262, 2125, 440, 2306, 1938, 2384, 1955, 233, 280, 118, 1222, 274, 2085, 1908, 2087, 2212, 448, 2353, 252, 391, 3048, 777, 1508, 424, 2206, 1898, 2551, 2808, 477, 1657, 3179, 1966, 54, 1419, 2285, 2237, 188, 270, 280, 2891, 968, 905, 962, 96, 2227, 1891, 1156, 1500, 355, 2003, 2275, 2870, 3184, 3323, 1906, 1972, 190, 568, 660, 2809, 2041, 1645, 1081, 3094, 409, 2276, 2356, 1609, 1728, 828, 955, 2498, 1505, 3211, 2375, 2869, 488, 2156, 52, 653, 729, 2382, 718, 1951, 2230, 2240, 1783, 2121, 2923, 3155, 979, 242, 2043, 1017, 133, 2810, 2374, 1782, 2345, 2054, 1872, 815, 1463], +[1532, 932, 1476, 3209, 1469, 237, 1495, 518, 809, 1710, 792, 2096, 907, 458, 1013, 1682, 1325, 399, 315, 3121, 1584, 2286, 1284, 325, 682, 1028, 2536, 1911, 736, 3288, 2873, 1554, 3216, 2288, 42, 175, 3233, 913, 1911, 2404, 1242, 1113, 1228, 379, 2127, 1083, 39, 193, 2582, 1882, 1649, 1818, 2640, 2071, 1623, 235, 2732, 1679, 2441, 535, 420, 1138, 1195, 302, 1432, 308, 2467, 656, 1366, 3041, 1086, 1934, 1208, 1024, 3308, 2488, 1767, 1120, 2926, 1963, 2864, 2933, 80, 2866, 3030, 1695, 2909, 67, 65, 1636, 1089, 738, 2700, 3084, 2695, 1058, 1656, 3319, 224, 1451, 41, 1593, 1178, 1662, 840, 552, 3181, 2575, 2166, 1850, 2973, 2995, 634, 2451, 1441, 2762, 1771, 1929, 2412, 1112, 3004, 1852, 716, 2652, 959, 2800, 1101, 496, 3037, 2905, 2802, 202, 1202, 571, 512, 585, 2866, 850, 743, 486, 2687, 1888, 1106, 573, 78, 1063, 2228, 1641, 245, 919, 697, 2634, 1610, 780, 936, 1039, 1543, 1284, 1462, 1004, 354, 1155, 1687, 1840, 859, 2896, 3315, 1318, 130, 989, 1124, 2040, 2413, 2674, 710, 338, 1893, 1198, 2660, 1998, 2285, 1665, 2538, 1650, 475, 3049, 2349, 309, 758, 2224, 2565, 3254, 3207, 684, 1966, 1513, 1737, 2758, 2642, 644, 1096, 2784, 1586, 460, 1021, 758, 2654, 305, 880, 325, 2425, 1223, 1939, 215, 3120, 1573, 291, 2409, 995, 510, 1129, 291, 2608, 98, 2270, 2947, 2485, 2283, 1842, 1011, 2585, 1730, 317, 3132, 3157, 1118, 3262, 951, 2089, 1881, 1864, 2404, 2086, 1387, 1269, 1862, 975, 1230, 557, 2111, 1776, 966, 1184, 951, 3275, 2089], +[672, 2087, 876, 1898, 2630, 2142, 1294, 333, 2333, 1969, 1052, 2146, 1713, 600, 1682, 1838, 1185, 3287, 8, 1757, 600, 1574, 2145, 130, 165, 1300, 2361, 782, 968, 124, 2840, 2632, 3301, 2035, 944, 2758, 2208, 2858, 896, 1722, 3067, 2068, 2749, 823, 934, 3185, 2817, 1438, 1056, 1542, 2048, 3004, 1705, 1925, 956, 639, 2097, 3047, 1673, 911, 11, 2913, 1860, 1988, 735, 2807, 953, 739, 835, 2894, 453, 1245, 1892, 1397, 2048, 2611, 895, 2964, 2164, 2358, 286, 3100, 3160, 1177, 475, 1861, 2092, 1461, 551, 521, 2237, 406, 2330, 3247, 1019, 1857, 2175, 2319, 3028, 2994, 3148, 927, 3292, 121, 334, 1440, 2360, 2535, 2291, 1598, 2794, 2630, 2406, 1884, 451, 3040, 3277, 2540, 3198, 2417, 1351, 2159, 2963, 2971, 257, 113, 3206, 1765, 1616, 1436, 2958, 1010, 1102, 96, 879, 725, 1885, 1827, 943, 255, 1519, 950, 372, 1401, 224, 1102, 1767, 2568, 352, 794, 2799, 147, 1226, 129, 2321, 1896, 957, 2396, 1043, 3202, 3159, 2915, 2073, 2125, 1919, 1750, 725, 79, 3244, 151, 2732, 1865, 1394, 314, 764, 315, 402, 2059, 353, 2167, 1815, 1438, 1038, 269, 2779, 2334, 1444, 2011, 1586, 1529, 2333, 463, 3234, 1181, 1051, 407, 751, 2725, 1613, 1009, 2313, 1004, 2877, 2238, 80, 2864, 538, 2178, 1243, 3061, 1563, 868, 2781, 2727, 461, 3117, 455, 2223, 2366, 2862, 725, 2922, 924, 1900, 1060, 2, 692, 472, 2799, 3034, 1025, 2992, 1863, 3261, 3099, 1175, 1786, 1076, 1511, 693, 1215, 359, 807, 1408, 1766, 183, 324, 819, 259, 2641, 3319, 1578, 348, 349, 2057, 608]], +[[1206, 1314, 1500, 1288, 2199, 664, 813, 1904, 2451, 461, 2466, 2183, 2431, 776, 2967, 3088, 3049, 1792, 933, 1003, 2293, 1341, 1359, 3259, 2973, 1400, 612, 1613, 952, 2484, 1818, 404, 2014, 647, 1432, 2797, 1457, 1290, 2649, 1943, 718, 900, 790, 1446, 389, 889, 781, 462, 977, 1974, 2606, 2918, 2488, 237, 2308, 3095, 1012, 2124, 2726, 1336, 1792, 3305, 3093, 2377, 1547, 2182, 2880, 2633, 848, 1158, 300, 3027, 2569, 2545, 1263, 1963, 2641, 1932, 3147, 2821, 2944, 3076, 686, 1868, 1204, 1014, 1952, 1683, 1059, 3135, 268, 1244, 1507, 3095, 1571, 2442, 1178, 1159, 1042, 879, 144, 1099, 2983, 3234, 725, 381, 426, 1419, 1041, 128, 832, 3274, 124, 3283, 1727, 1904, 313, 1167, 2242, 1296, 2870, 1383, 2064, 501, 1913, 2534, 2438, 672, 2274, 1915, 1455, 2594, 1279, 159, 3243, 3280, 2797, 259, 445, 2811, 142, 2013, 783, 696, 1631, 558, 345, 1168, 1955, 1078, 1947, 2936, 2788, 1081, 2559, 462, 1620, 2475, 1728, 377, 1544, 1050, 3024, 2876, 1432, 1121, 699, 1533, 2260, 1408, 1831, 930, 2100, 71, 1666, 3261, 1884, 2231, 1354, 3024, 2044, 2449, 538, 1509, 618, 1669, 2663, 1719, 3081, 2214, 239, 2467, 1059, 3227, 1923, 1552, 1728, 1338, 2181, 2189, 2258, 2682, 1700, 2020, 625, 2116, 1856, 2870, 477, 978, 1114, 1294, 1468, 2735, 1811, 1152, 1660, 1107, 184, 1583, 2037, 2539, 1350, 1879, 534, 705, 275, 305, 203, 2815, 1902, 3067, 2206, 1811, 3204, 3132, 852, 1501, 47, 1, 661, 104, 2152, 2150, 1737, 740, 551, 1825, 1997, 1544, 2819, 712, 44, 1701, 261, 3035], +[619, 3204, 369, 1810, 1593, 84, 1721, 875, 3204, 56, 1919, 604, 3290, 2766, 2033, 2417, 2425, 313, 2004, 746, 1985, 2051, 1234, 1054, 1320, 1098, 1955, 262, 1348, 39, 527, 417, 2256, 3202, 2238, 499, 3139, 144, 3139, 2389, 2404, 1092, 699, 1025, 2972, 3318, 2298, 2652, 223, 1688, 3268, 2887, 2294, 557, 23, 155, 285, 414, 2557, 2945, 2210, 156, 2850, 141, 2659, 2339, 1480, 883, 2049, 1994, 1178, 1484, 3275, 1799, 3166, 1711, 2050, 872, 1574, 932, 3071, 177, 1168, 883, 472, 2145, 1423, 1457, 1918, 2797, 2903, 1729, 341, 3128, 2575, 1996, 2388, 1188, 1157, 301, 1138, 2038, 907, 2812, 1922, 1428, 1018, 2401, 3232, 3317, 2160, 974, 1329, 3191, 676, 972, 2908, 1875, 2224, 1555, 694, 760, 997, 502, 1563, 594, 889, 2186, 1065, 577, 2396, 335, 1544, 975, 599, 564, 910, 2978, 2913, 1944, 2351, 3219, 134, 2920, 1204, 69, 2971, 72, 2134, 463, 1935, 3206, 2809, 2857, 923, 2603, 1448, 800, 3001, 458, 1507, 2955, 765, 1677, 567, 2614, 1233, 1110, 2627, 5, 2068, 3101, 2636, 1418, 2125, 1039, 2024, 3150, 842, 1494, 311, 2810, 2003, 1067, 2904, 774, 1501, 1649, 564, 343, 946, 1037, 2142, 1504, 2264, 1407, 1013, 1114, 1872, 2516, 1986, 124, 2125, 1631, 2711, 1541, 3135, 2558, 1044, 35, 546, 3296, 1710, 705, 1986, 570, 306, 136, 2041, 3159, 1077, 965, 2006, 1172, 3097, 2706, 1766, 1822, 1975, 2586, 2887, 2441, 694, 3029, 2763, 3325, 646, 2618, 1128, 795, 2460, 913, 38, 466, 1841, 740, 2563, 1556, 1531, 425, 2553, 2570, 2341, 3193, 862, 1921], +[3248, 2199, 1872, 1800, 252, 2561, 1433, 1415, 610, 3292, 2771, 2753, 2871, 1735, 2797, 131, 1348, 2221, 1271, 2042, 1041, 2476, 1145, 1854, 3229, 1441, 2327, 2990, 2265, 998, 2400, 841, 248, 138, 231, 2486, 1360, 1079, 2207, 2606, 1258, 2862, 2262, 1495, 2776, 1520, 291, 2184, 1988, 947, 926, 2727, 1929, 971, 934, 962, 2360, 1037, 758, 2801, 2759, 2321, 2593, 986, 1858, 1963, 791, 1722, 957, 1547, 879, 2237, 1133, 738, 1404, 2684, 458, 2263, 2855, 2170, 963, 1821, 1563, 1524, 1223, 1441, 1606, 737, 158, 1859, 2721, 1756, 2168, 368, 1219, 828, 2155, 479, 1680, 1180, 2964, 811, 1681, 126, 1166, 1691, 694, 2515, 1890, 963, 1987, 2789, 79, 424, 1082, 365, 3216, 781, 1788, 3091, 2053, 2677, 593, 2000, 3020, 1884, 2396, 284, 2489, 3223, 1520, 2460, 2438, 2583, 2285, 663, 2540, 1668, 2208, 3087, 1751, 30, 1930, 1544, 1688, 3052, 3326, 452, 3232, 1905, 1960, 2547, 909, 1030, 774, 357, 3114, 1973, 1607, 2624, 236, 2273, 308, 507, 1123, 616, 1083, 127, 1848, 1701, 808, 220, 1735, 3153, 1223, 2654, 1719, 2409, 2233, 1793, 420, 3238, 1927, 460, 2615, 27, 1242, 2823, 2504, 1706, 2352, 1916, 1257, 2408, 1232, 3174, 1401, 1517, 518, 1072, 2849, 728, 293, 1397, 1844, 1830, 2559, 75, 492, 2869, 2848, 1265, 2524, 1421, 358, 3202, 1837, 2925, 932, 2859, 389, 1295, 1920, 488, 2459, 1364, 2853, 1247, 289, 2486, 2806, 807, 1535, 2870, 29, 2879, 3195, 1054, 2148, 422, 2057, 585, 88, 1290, 1579, 2426, 1553, 976, 517, 1857, 2045, 475, 3117, 2334, 1878, 2771], +[1351, 279, 2141, 1097, 1906, 3306, 776, 1713, 3070, 2649, 1632, 996, 469, 552, 952, 714, 2772, 1663, 2450, 233, 939, 3077, 2355, 879, 1038, 1875, 2196, 1381, 3011, 3159, 1812, 2979, 2788, 1530, 2606, 2497, 433, 2491, 2733, 263, 2487, 194, 1191, 770, 2073, 1575, 3291, 1698, 2815, 2684, 2822, 1770, 2092, 42, 2484, 2177, 2609, 2743, 3036, 2211, 1958, 2673, 1232, 1046, 1748, 3250, 3243, 2517, 1274, 3124, 2877, 2737, 3012, 2560, 1170, 2219, 2189, 2855, 585, 2168, 992, 3051, 1151, 2110, 2031, 658, 781, 3158, 906, 349, 140, 1103, 38, 388, 1605, 1860, 1049, 229, 1512, 476, 2634, 33, 2385, 1801, 665, 2179, 2441, 1095, 1406, 214, 1005, 1809, 1883, 1220, 1491, 2155, 2349, 3199, 62, 748, 580, 2035, 1474, 365, 1455, 967, 1337, 2746, 2766, 3124, 1666, 3308, 2553, 2952, 3309, 1779, 2683, 2204, 2239, 664, 2049, 3317, 3129, 786, 1448, 2343, 3312, 1591, 2325, 2021, 1646, 164, 822, 419, 1237, 1989, 2556, 1951, 3134, 1162, 206, 1566, 1846, 2440, 663, 1801, 2154, 835, 1901, 2141, 410, 1820, 1170, 967, 2540, 630, 205, 1623, 209, 2169, 3196, 2962, 1241, 2218, 1372, 179, 1672, 1089, 282, 552, 38, 2889, 1454, 331, 1075, 2603, 1851, 1004, 1580, 837, 2250, 1390, 2129, 69, 1183, 2592, 2701, 2512, 2779, 1930, 167, 1678, 687, 2626, 3029, 518, 1729, 1466, 2969, 1638, 3243, 509, 1912, 2760, 722, 2714, 1012, 1370, 1733, 3288, 1646, 2526, 1406, 1304, 1442, 1755, 549, 1627, 1479, 2781, 2842, 525, 973, 499, 888, 413, 3097, 2384, 173, 520, 1527, 2000, 2653, 318, 1623, 386]]] + +r: [[0, 3328, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 2, 0, 2, 3328, 0, 3328, 1, 1, 0, 3328, 0, 3327, 1, 0, 1, 3327, 1, 3328, 0, 0, 1, 3328, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 2, 2, 0, 3328, 3327, 1, 1, 0, 0, 3327, 2, 0, 3327, 1, 3328, 1, 0, 3328, 1, 1, 0, 0, 2, 3327, 0, 0, 0, 3327, 3328, 1, 0, 3328, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 0, 0, 3327, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 0, 1, 1, 2, 1, 1, 3328, 1, 3328, 1, 1, 3327, 3328, 1, 0, 2, 3328, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 3328, 0, 2, 1, 0, 3327, 1, 0, 1, 1, 2, 2, 0, 3327, 1, 3327, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 1, 3328, 2, 1, 0, 0, 2, 1, 3328, 3328, 0, 1, 0, 0, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3327, 1, 3327, 3328, 1, 3327, 0, 1, 0, 0, 3328, 0, 1, 3328, 3328, 0, 1, 0, 3328, 0, 0, 1, 0, 1, 3328, 3328], +[1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 3328, 3328, 0, 3328, 3328, 3328, 1, 1, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 1, 1, 3328, 1, 3328, 2, 0, 3328, 0, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 0, 3327, 3328, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 3327, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 2, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 2, 3327, 3328, 3327, 2, 1, 2, 0, 0, 3328, 3328, 0, 3327, 0, 1, 3327, 1, 0, 3328, 1, 0, 3327, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 1, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 1, 0, 3328, 1, 1, 1, 0, 0, 1, 3328, 3327, 1, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 3327, 0, 3327, 3328, 1, 3328, 1, 3328, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3327, 0, 0, 2, 0, 1, 3328, 2, 1, 0, 3328, 0, 0, 0, 1, 3327, 0, 0, 3327, 0, 1, 0, 0, 2, 0, 3328, 1, 1, 3328, 3328, 1, 0, 3327, 1, 0, 3327, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 2, 3327, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 1, 1, 1, 1, 1, 3328, 0, 2, 3327, 2, 1], +[3328, 0, 0, 1, 0, 3328, 1, 1, 1, 1, 3328, 0, 1, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 3328, 2, 0, 1, 1, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 3328, 1, 2, 0, 3328, 1, 3327, 0, 1, 0, 1, 3327, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 3327, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 1, 1, 3327, 3327, 1, 1, 1, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 1, 2, 0, 0, 1, 0, 3327, 0, 0, 0, 0, 0, 3327, 3328, 3328, 3328, 0, 0, 1, 2, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 3328, 1, 3328, 2, 1, 1, 1, 0, 3327, 3327, 3328, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 1, 3327, 1, 1, 1, 3328, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 3327, 0, 0, 0, 3328, 3328, 1, 3327, 1, 0, 1, 3328, 0, 0, 0, 3327, 3328, 2, 0, 3328, 1, 2, 0, 3328, 0, 2, 1, 0, 2, 0, 3328, 1, 3328, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 3327, 1, 0, 3328, 0, 3328, 0, 1, 1, 3327, 0, 3327, 1, 3328, 2, 0], +[1, 3328, 0, 1, 3327, 1, 1, 1, 2, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 0, 0, 2, 3328, 3328, 0, 3328, 3328, 0, 1, 0, 3328, 3327, 1, 3328, 1, 2, 3328, 1, 0, 0, 3328, 3328, 0, 0, 1, 0, 3328, 3328, 3328, 0, 2, 1, 2, 3328, 0, 3328, 0, 0, 1, 2, 1, 0, 2, 3328, 3328, 0, 0, 3328, 0, 0, 0, 2, 3328, 3328, 2, 3327, 2, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 3327, 0, 1, 0, 1, 2, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 3328, 2, 1, 3327, 1, 3328, 1, 2, 1, 0, 0, 2, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 1, 2, 2, 2, 1, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 3327, 3328, 0, 1, 3328, 0, 0, 3327, 0, 0, 2, 0, 0, 3327, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 0, 2, 2, 3328, 0, 1, 1, 3327, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 2, 3328, 3328, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 3328, 3328, 1, 3327, 3327, 1, 0, 0, 3328, 1, 0]] + +e1: [[0, 3328, 3328, 3328, 3328, 3327, 0, 3328, 2, 3327, 3328, 3328, 0, 0, 2, 3328, 3328, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 3328, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 3327, 1, 3327, 0, 3328, 1, 3327, 3328, 3328, 1, 1, 0, 1, 0, 0, 3328, 0, 3328, 3328, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 0, 3327, 0, 1, 3327, 3328, 3328, 3327, 1, 1, 3328, 0, 3328, 0, 0, 1, 3328, 0, 3328, 3328, 3328, 1, 2, 0, 3328, 3328, 0, 0, 1, 3328, 3328, 1, 1, 1, 0, 0, 3328, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 3328, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 0, 1, 3327, 3328, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 0, 3327, 1, 0, 0, 0, 3328, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 0, 2, 3328, 1, 1, 1, 0, 0, 1, 3328, 2, 0, 1, 3328, 1, 1, 0, 3328, 3327, 1, 1, 1, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 3327, 1, 0, 0, 1, 3328, 3328, 3328, 0, 0, 2, 2, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3327, 1, 3327, 1, 1, 0, 0, 0, 1], +[0, 2, 3328, 0, 1, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 0, 2, 3327, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 3327, 1, 3328, 2, 3328, 0, 1, 0, 3327, 0, 3328, 0, 0, 3328, 3328, 3327, 0, 3327, 0, 3328, 1, 0, 0, 3328, 3328, 1, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3327, 1, 1, 0, 1, 3328, 2, 3328, 3328, 3328, 3327, 2, 3328, 1, 0, 3328, 3328, 0, 3327, 0, 3328, 1, 1, 2, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 0, 0, 0, 3328, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 1, 3327, 1, 0, 1, 0, 0, 1, 1, 1, 3328, 1, 3327, 2, 0, 1, 3328, 3327, 1, 3328, 2, 2, 1, 0, 1, 3327, 0, 0, 0, 3328, 3328, 0, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 3328, 0, 1, 1, 3328, 0, 0, 0, 2, 0, 0, 2, 0, 3328, 1, 0, 3328, 2, 0, 3327, 0, 2, 3328, 0, 0, 0, 1, 3328, 2, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 2, 0, 0, 0, 1, 3327, 3328, 0, 3328, 2, 0, 1, 3327, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3327, 2, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 2, 3328, 3327, 1, 0, 3328, 1, 0, 3328, 3328, 0, 1, 0, 1], +[3328, 0, 1, 3328, 1, 3328, 3328, 2, 3327, 1, 1, 3328, 0, 3328, 0, 3327, 0, 3328, 1, 3328, 1, 2, 1, 0, 0, 3328, 3328, 2, 3327, 1, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3327, 3328, 3328, 0, 2, 0, 3328, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 1, 0, 1, 3327, 3327, 2, 1, 1, 0, 1, 3328, 3328, 1, 1, 3328, 1, 0, 3328, 2, 3328, 3328, 0, 3328, 3328, 3328, 3327, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 3327, 2, 0, 1, 1, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 1, 3328, 3328, 1, 1, 0, 0, 0, 3328, 3328, 3327, 0, 3328, 3328, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 2, 3327, 0, 2, 2, 1, 0, 3328, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3328, 0, 0, 1, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 1, 1, 2, 3328, 2, 1, 1, 1, 0, 3328, 1, 3327, 3328, 0, 3327, 2, 1, 1, 3328, 0, 1, 0, 3328, 0, 3328, 2, 3327, 3328, 3328, 3328, 0], +[3328, 0, 0, 1, 0, 1, 1, 3328, 0, 0, 1, 3328, 1, 1, 0, 3328, 3327, 2, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 1, 3328, 1, 0, 3328, 2, 0, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 3328, 3327, 3328, 1, 2, 0, 3328, 3328, 1, 1, 1, 2, 3328, 2, 3328, 0, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1, 3328, 1, 1, 2, 0, 2, 0, 3328, 3328, 0, 3328, 1, 0, 2, 2, 0, 3328, 1, 1, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 3328, 3327, 1, 1, 1, 0, 3328, 1, 1, 0, 1, 0, 2, 0, 1, 1, 0, 0, 3327, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 0, 3327, 0, 0, 2, 3328, 3327, 0, 1, 1, 3327, 3328, 0, 0, 0, 1, 3328, 3328, 0, 2, 3327, 1, 1, 3328, 0, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3328, 1, 3328, 0, 3328, 1, 2, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 0, 0, 3328, 1, 0, 3327, 1, 0, 1, 0, 2, 0, 1, 1, 3328, 0, 1, 1, 0, 1, 1, 3327, 3327, 0, 3328, 1, 0, 0, 0, 2, 3327, 2, 1, 3328, 2, 0, 1]] + +e2: [0, 3327, 1, 3328, 1, 2, 0, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 1, 2, 0, 0, 0, 1, 0, 2, 1, 2, 0, 3327, 2, 3328, 3327, 2, 1, 1, 0, 0, 0, 3328, 0, 1, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 0, 1, 3327, 3328, 3328, 3327, 0, 0, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 2, 1, 3328, 0, 0, 2, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 0, 3328, 0, 2, 3328, 3328, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 0, 0, 0, 0, 3327, 1, 1, 0, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3327, 1, 0, 2, 3328, 1, 1, 0, 1, 0, 3328, 1, 3328, 1, 0, 3328, 1, 1, 2, 3328, 1, 0, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 1, 0, 3328, 2, 0, 2, 3328, 0, 0, 0, 3327, 2, 3328, 3328, 3327, 0, 0, 0, 3328, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 3327, 0, 3328, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 1, 0, 1, 3327, 3328, 1, 1, 3328, 3327, 1, 0] +rHat: [[2961, 3151, 3250, 2522, 466, 1490, 1030, 1206, 2334, 2137, 1753, 2041, 2417, 1536, 2849, 2167, 2109, 919, 3056, 1731, 1659, 1875, 2419, 2016, 2710, 1881, 2237, 2309, 2798, 1029, 2844, 3148, 2249, 2078, 1804, 1091, 3190, 1373, 3122, 2914, 1641, 358, 2751, 1763, 206, 424, 2254, 2358, 1224, 3280, 2695, 2390, 2284, 274, 1151, 2264, 172, 2380, 1036, 2592, 2833, 2022, 1622, 491, 1655, 2741, 3282, 290, 206, 175, 2374, 1809, 908, 779, 1458, 305, 2308, 2476, 3075, 811, 2695, 2671, 1230, 782, 1376, 1540, 2642, 928, 1982, 864, 1397, 2176, 138, 1232, 898, 340, 2206, 2730, 1402, 2119, 2834, 1508, 2641, 1930, 288, 1599, 2775, 490, 1978, 1969, 3010, 2127, 1484, 2233, 3010, 1764, 690, 2285, 779, 1092, 859, 1627, 566, 502, 314, 1790, 2788, 771, 1950, 2163, 250, 718, 756, 239, 1797, 508, 2590, 2409, 2409, 3069, 1069, 219, 606, 618, 2155, 2175, 1603, 2041, 1765, 3072, 1492, 2660, 1511, 982, 2442, 2669, 735, 685, 1153, 1729, 2108, 2742, 1146, 1168, 2604, 2012, 796, 766, 1232, 2440, 2645, 1584, 2624, 892, 402, 1440, 1987, 2819, 457, 3142, 1976, 2606, 345, 3267, 465, 3282, 472, 882, 1081, 409, 614, 1273, 1904, 1507, 344, 496, 2426, 1611, 1595, 191, 2808, 2900, 1971, 269, 2413, 1656, 1031, 3323, 3094, 1094, 710, 1983, 1669, 1443, 19, 2852, 168, 3199, 1599, 393, 1722, 2438, 914, 2791, 1879, 1726, 889, 2821, 1074, 2815, 1281, 2225, 1240, 1544, 3134, 768, 3268, 1102, 2173, 133, 1603, 3152, 2293, 2947, 2342, 2474, 314, 157, 2066, 2186, 749, 967, 1908, 2, 1503, 747], +[1189, 2551, 2100, 2299, 2054, 2162, 3251, 1612, 2462, 3169, 915, 103, 2714, 3276, 2159, 3154, 3152, 2348, 559, 1071, 2421, 2154, 1575, 2261, 2653, 468, 1337, 662, 907, 2087, 527, 541, 549, 1961, 1239, 2163, 727, 490, 393, 2693, 1601, 757, 487, 990, 555, 1418, 298, 354, 1450, 1595, 1914, 1794, 1274, 1825, 1624, 1290, 3162, 1400, 1705, 1487, 3041, 2435, 1288, 1391, 3147, 825, 842, 1775, 1484, 2047, 500, 1973, 878, 1261, 60, 2102, 236, 558, 2754, 2788, 682, 434, 1646, 1171, 2657, 2727, 2339, 2040, 2008, 1623, 1963, 2666, 934, 1717, 39, 778, 1289, 960, 1094, 2293, 614, 3234, 1820, 1398, 575, 1580, 1041, 2844, 2708, 3137, 1537, 2148, 408, 2415, 1547, 2957, 2357, 409, 1685, 491, 3119, 129, 2576, 183, 487, 2265, 2827, 3032, 2544, 2631, 3182, 474, 2093, 2298, 1329, 2063, 296, 1911, 3148, 133, 1214, 1762, 3081, 1864, 2522, 1331, 1523, 1694, 1563, 1370, 1183, 38, 638, 1960, 2711, 2801, 2339, 2802, 535, 1774, 2869, 1522, 2765, 2201, 3262, 410, 1833, 588, 421, 2501, 3156, 494, 1935, 106, 970, 1266, 1488, 3260, 2111, 2712, 3199, 1525, 2672, 3109, 732, 2472, 861, 1811, 1910, 1641, 499, 2052, 1771, 787, 1658, 231, 124, 1770, 2701, 645, 3203, 3029, 1169, 2875, 1435, 2968, 2212, 308, 232, 3289, 2018, 1813, 1815, 3203, 61, 822, 2652, 250, 990, 2565, 175, 1404, 2600, 3175, 100, 2623, 1234, 1411, 1116, 1753, 767, 3180, 2619, 829, 1328, 2731, 1207, 2624, 872, 497, 2731, 2358, 3038, 3214, 2936, 2091, 1250, 1210, 3167, 3138, 246, 1191, 1091, 239, 1618, 451], +[125, 1510, 2110, 3009, 1778, 1285, 938, 1419, 68, 809, 2600, 491, 492, 1897, 978, 2401, 2711, 779, 348, 752, 2074, 3128, 1260, 1871, 1244, 1799, 735, 1223, 2239, 1419, 791, 1997, 2045, 3275, 2715, 3147, 250, 3157, 878, 1816, 1889, 3318, 1364, 1787, 2863, 1533, 1639, 1559, 2493, 1826, 2511, 1427, 844, 2177, 428, 1155, 1057, 3018, 207, 43, 2134, 602, 3327, 3013, 179, 1926, 838, 3004, 3158, 90, 2275, 534, 3006, 2862, 2681, 1791, 3046, 2263, 3065, 985, 2779, 732, 2646, 2516, 2047, 79, 1034, 2434, 1120, 1250, 2537, 609, 2270, 3287, 786, 2528, 344, 2972, 1448, 1516, 275, 128, 2558, 1660, 1027, 2989, 3241, 2639, 2732, 227, 362, 1615, 591, 2044, 1780, 1745, 550, 536, 2711, 628, 1441, 1748, 1709, 1869, 2078, 687, 3015, 1322, 1432, 2658, 3140, 2281, 2191, 323, 138, 654, 1176, 850, 2368, 2482, 12, 3080, 1749, 1813, 3322, 3027, 65, 298, 2844, 1375, 3116, 728, 1257, 1884, 890, 2929, 1469, 3037, 2862, 2379, 672, 1024, 2695, 1775, 1282, 542, 2094, 531, 1913, 3001, 2015, 1040, 2433, 2971, 140, 2241, 1209, 636, 836, 2245, 592, 823, 3328, 1526, 459, 1862, 3120, 2843, 1484, 3174, 1490, 3225, 1991, 740, 415, 2169, 1873, 3322, 795, 2649, 3272, 418, 1002, 2662, 2162, 1275, 2861, 2247, 2890, 134, 2181, 1308, 2549, 976, 574, 2913, 1394, 2749, 3158, 2666, 2592, 1712, 725, 1962, 171, 1324, 2697, 718, 1202, 1190, 3133, 3115, 2979, 221, 433, 1932, 801, 1204, 1392, 46, 1184, 3102, 1601, 1880, 3110, 2858, 3208, 461, 1577, 3170, 1715, 2465, 3150, 2297, 542, 1373], +[129, 3281, 1891, 987, 608, 1105, 536, 193, 517, 1519, 230, 2266, 1852, 1290, 1686, 1876, 1797, 2312, 2503, 556, 420, 1266, 2259, 2616, 230, 1176, 2515, 291, 3169, 1769, 1159, 3237, 2988, 934, 2904, 1271, 570, 2276, 2989, 2393, 1965, 695, 2379, 1903, 971, 165, 210, 2288, 1241, 243, 1719, 551, 1060, 1233, 1384, 2422, 2036, 3001, 425, 2274, 307, 1758, 2723, 2651, 1423, 1577, 395, 610, 1573, 2921, 2026, 584, 1903, 2244, 3222, 520, 1770, 811, 1289, 1722, 786, 2263, 2679, 2071, 2698, 1651, 1006, 2944, 1272, 726, 2615, 1124, 440, 2276, 2512, 574, 2680, 1050, 1004, 45, 2342, 1647, 2928, 1933, 2311, 148, 1034, 2048, 1445, 1002, 15, 136, 2344, 1942, 109, 291, 656, 2244, 2034, 305, 2914, 1130, 1918, 305, 587, 932, 1431, 1574, 47, 2833, 3201, 2256, 1489, 961, 2810, 2670, 2188, 1434, 2185, 1288, 2792, 3142, 2263, 2399, 2350, 115, 2424, 2344, 2261, 1936, 1724, 2299, 446, 2972, 1929, 780, 1832, 835, 1574, 1361, 2763, 2881, 313, 3294, 1868, 2936, 1533, 1264, 553, 2251, 1071, 2463, 3150, 2330, 826, 3275, 1284, 1996, 2776, 925, 847, 1197, 3217, 2821, 2864, 1138, 915, 2495, 14, 1451, 3150, 927, 1371, 1069, 1247, 121, 1147, 1844, 1608, 1240, 1748, 1637, 3270, 1827, 3217, 837, 2605, 1693, 2588, 2886, 901, 1535, 459, 428, 154, 2854, 1067, 2096, 2589, 55, 396, 1053, 46, 154, 1228, 3036, 328, 128, 72, 204, 2303, 3104, 112, 489, 377, 1990, 145, 2473, 2994, 859, 1758, 1730, 291, 517, 2892, 3093, 1430, 2643, 1636, 837, 59, 1968, 460, 1939, 3307, 185]] + +BHat * rHat: [[3177, 2307, 2045, 211, 502, 2182, 280, 2061, 1553, 1500, 2903, 1612, 1218, 2202, 3131, 26, 1881, 1487, 3171, 1176, 1953, 232, 887, 2834, 2475, 1504, 1778, 1293, 194, 1958, 1224, 1530, 1718, 1679, 1414, 390, 1106, 1685, 416, 399, 1732, 1013, 2278, 1386, 3112, 1003, 516, 1180, 2108, 962, 633, 2541, 2704, 2031, 2667, 203, 3160, 2046, 477, 887, 448, 1666, 742, 2912, 2329, 56, 1688, 2262, 1513, 1327, 709, 2954, 395, 630, 661, 941, 2012, 1957, 1816, 1923, 918, 1565, 1838, 859, 1923, 2054, 58, 1737, 2812, 1887, 2569, 108, 2063, 971, 1718, 2233, 1898, 344, 517, 2919, 955, 16, 1172, 2114, 620, 382, 1751, 3232, 3138, 2853, 2268, 615, 3031, 188, 2982, 1177, 494, 14, 2450, 3270, 2362, 2313, 1171, 2530, 3105, 2013, 726, 507, 626, 2708, 405, 3037, 2565, 43, 2351, 858, 1215, 1800, 268, 2370, 2945, 1237, 2408, 125, 156, 651, 2315, 2590, 3107, 2172, 2577, 2998, 2058, 1320, 282, 1180, 2891, 3096, 174, 2048, 20, 3163, 1973, 844, 283, 3136, 732, 1697, 409, 906, 2185, 812, 1788, 738, 2249, 1968, 1649, 2209, 2856, 1061, 775, 1351, 746, 556, 1226, 1770, 2504, 2836, 1207, 2312, 2080, 275, 2630, 2516, 1272, 1101, 2973, 1436, 1524, 3035, 454, 2458, 1753, 1931, 1964, 92, 1254, 3250, 2434, 2808, 2506, 1511, 325, 464, 1494, 2469, 207, 1521, 2190, 2403, 239, 3050, 1137, 423, 574, 355, 655, 1042, 2432, 259, 310, 2204, 1840, 2348, 1549, 2843, 1785, 1748, 239, 2160, 1567, 776, 1617, 1229, 2520, 421, 3261, 3065, 1618, 2951, 654, 2350, 867, 386, 1073, 366], +[1396, 3277, 3123, 1246, 892, 1821, 416, 1095, 2313, 2155, 2538, 2380, 1873, 1203, 2992, 2095, 2261, 1877, 2457, 2468, 495, 1649, 1243, 1662, 2288, 2281, 2418, 1597, 2094, 3288, 1542, 806, 2473, 903, 1672, 90, 2657, 1705, 1626, 1477, 487, 919, 1259, 3171, 1721, 857, 1687, 346, 1801, 1593, 1652, 660, 1968, 97, 2612, 2233, 2873, 2963, 1398, 472, 1926, 1154, 2078, 269, 3280, 1349, 2388, 93, 1133, 165, 1737, 1830, 2177, 1312, 2229, 1327, 488, 2667, 1459, 1308, 1783, 2551, 2327, 1986, 1383, 1908, 107, 2509, 2191, 3272, 3040, 3279, 3275, 1218, 2459, 1888, 87, 1165, 1375, 1875, 2271, 2946, 2299, 1128, 495, 552, 688, 3004, 152, 410, 1706, 632, 2611, 2036, 1790, 2214, 1592, 844, 1472, 2743, 1792, 252, 585, 359, 2170, 1522, 1900, 65, 74, 2510, 2767, 2301, 372, 1756, 549, 1051, 1007, 72, 2808, 1828, 3141, 2584, 200, 563, 3181, 1327, 368, 3293, 257, 774, 221, 26, 308, 2068, 578, 272, 1610, 1013, 468, 1070, 220, 1664, 1234, 601, 1194, 2200, 2547, 2965, 1694, 534, 2042, 1404, 2826, 2958, 1936, 3262, 1578, 1323, 2605, 457, 2837, 669, 2711, 2288, 2007, 773, 1257, 2458, 943, 240, 190, 3281, 3227, 2377, 69, 1314, 1833, 1513, 2404, 2121, 3097, 1291, 2166, 3246, 2954, 1836, 1516, 2412, 72, 833, 101, 2060, 157, 1939, 885, 1336, 3167, 2181, 206, 2808, 334, 1889, 1535, 767, 2805, 732, 2998, 356, 160, 3208, 1443, 1173, 193, 1504, 2434, 3227, 183, 82, 2620, 3273, 3081, 767, 1207, 607, 2747, 1262, 972, 2984, 2697, 203, 1905, 962, 744, 2490, 542, 3117], +[36, 2141, 2507, 2722, 695, 674, 2402, 2411, 1481, 2602, 3005, 1950, 2693, 1536, 873, 2707, 1997, 527, 885, 22, 2263, 994, 415, 2981, 386, 1029, 2066, 274, 3196, 441, 273, 3108, 1768, 2146, 2047, 2282, 2835, 1038, 385, 2576, 2918, 208, 255, 2576, 2187, 874, 3139, 835, 2396, 1696, 63, 2747, 3205, 242, 96, 457, 2308, 3260, 1349, 2451, 1719, 2309, 967, 407, 2934, 293, 2298, 3205, 1763, 614, 124, 77, 973, 136, 549, 118, 637, 2582, 169, 1297, 3001, 1396, 1595, 761, 759, 433, 729, 27, 1740, 1629, 1811, 542, 2412, 322, 844, 137, 2249, 2113, 21, 2530, 612, 1769, 249, 2471, 3212, 2598, 2453, 3208, 329, 1930, 937, 2077, 57, 735, 2468, 3244, 3315, 374, 2168, 142, 2230, 475, 1683, 838, 2564, 2306, 102, 3014, 3063, 21, 3024, 2846, 1269, 3079, 224, 2172, 2107, 1115, 3317, 3328, 1378, 923, 401, 1672, 618, 1277, 377, 2658, 513, 1936, 666, 702, 584, 2002, 36, 3017, 207, 2434, 549, 1219, 2350, 2086, 2559, 756, 628, 805, 1905, 3150, 2897, 2029, 2765, 247, 1230, 1896, 2107, 2033, 1011, 915, 1524, 140, 1635, 2194, 2348, 2336, 2280, 2779, 3115, 1641, 1595, 2152, 2749, 1450, 2547, 3306, 2367, 586, 1598, 717, 1996, 779, 764, 2292, 3140, 1476, 2384, 308, 1295, 1623, 1989, 548, 796, 1048, 1658, 2125, 2501, 2980, 530, 1418, 1004, 275, 8, 712, 3316, 1078, 1101, 2937, 616, 2132, 2592, 2561, 2491, 2334, 1656, 1386, 2760, 809, 1606, 1941, 3010, 593, 1688, 1666, 2927, 1582, 2431, 1202, 1691, 2145, 1046, 2138, 1407, 1859, 645, 1954, 198, 527], +[1506, 379, 1200, 924, 1096, 407, 3201, 2679, 1175, 2383, 151, 1150, 1101, 3211, 1477, 2148, 1078, 2363, 3224, 2756, 1525, 2512, 583, 785, 328, 2669, 895, 2307, 949, 2127, 1386, 1876, 2459, 1636, 686, 2969, 2242, 2840, 1416, 826, 2899, 885, 2234, 37, 425, 1235, 1578, 1055, 2907, 525, 858, 430, 1908, 15, 3221, 933, 1880, 2226, 2412, 2800, 1729, 959, 820, 2324, 15, 1322, 3226, 1066, 2086, 1501, 2703, 2905, 3003, 1714, 241, 2339, 1210, 1327, 3154, 1245, 1820, 1694, 1151, 1516, 1575, 1272, 1425, 2292, 618, 809, 2588, 988, 2176, 1135, 2106, 2675, 924, 1053, 1126, 2056, 2818, 1862, 1974, 818, 379, 2933, 2314, 1803, 862, 2891, 934, 2381, 842, 446, 3241, 142, 2881, 550, 2934, 3284, 989, 1467, 2565, 2278, 1305, 245, 708, 2434, 1235, 1982, 1056, 2099, 459, 2260, 2464, 2604, 2231, 2657, 2326, 842, 1833, 3224, 395, 72, 1997, 3071, 1006, 2584, 685, 1198, 1230, 939, 909, 2634, 1056, 2503, 2068, 3074, 3163, 2885, 1216, 2512, 1366, 1287, 497, 3168, 1704, 1239, 2795, 829, 1926, 1073, 1499, 1657, 3278, 1090, 1274, 809, 535, 1055, 2486, 3073, 2668, 2030, 2353, 1250, 3195, 696, 493, 1422, 2327, 971, 464, 1228, 115, 827, 2712, 631, 1340, 69, 2131, 505, 503, 879, 1769, 3048, 1737, 937, 2082, 2227, 183, 2823, 20, 2032, 559, 157, 2032, 2079, 2871, 1940, 1468, 2682, 2785, 2394, 2195, 3067, 2872, 2930, 2607, 3300, 1986, 3165, 3308, 282, 397, 2735, 1390, 2599, 1483, 315, 2720, 1197, 2965, 2466, 1095, 1057, 1383, 1411, 2811, 247, 2240, 1499, 2765, 2881, 144, 2083]] +NTTInverse(BHat * rHat): [[3070, 1403, 2569, 1535, 2889, 2555, 885, 3020, 1056, 2040, 995, 873, 2394, 1510, 2542, 2103, 689, 51, 1822, 3032, 2675, 2707, 2636, 1256, 3207, 2846, 1050, 1173, 636, 530, 1794, 746, 1513, 286, 2642, 2601, 3062, 2961, 1264, 818, 388, 194, 2629, 1173, 973, 1503, 1815, 1303, 1481, 548, 2909, 1001, 1315, 869, 1852, 2329, 1081, 1718, 2971, 2064, 1649, 1337, 3030, 1542, 145, 243, 1749, 559, 2441, 1805, 2460, 49, 2615, 1890, 1190, 2547, 2409, 1359, 1717, 3221, 369, 639, 964, 682, 232, 375, 1578, 1223, 248, 1212, 1333, 599, 998, 234, 1285, 324, 3145, 2356, 642, 766, 19, 2276, 2553, 3123, 146, 2823, 2051, 2636, 2687, 2320, 6, 2552, 2385, 902, 2438, 1118, 3145, 2935, 58, 485, 2846, 2641, 2949, 181, 2455, 2681, 390, 534, 55, 3226, 1641, 2901, 567, 2387, 765, 2375, 1468, 442, 1303, 1543, 97, 70, 2844, 577, 323, 2056, 1844, 2345, 3185, 1016, 265, 672, 958, 570, 2765, 693, 2210, 1849, 1092, 2915, 502, 164, 1522, 2167, 2705, 1425, 967, 271, 1125, 1629, 3157, 1363, 1959, 784, 63, 2079, 551, 305, 3022, 1790, 438, 1106, 1757, 17, 1650, 3176, 3066, 923, 1911, 2003, 2754, 1085, 1952, 1946, 354, 1958, 418, 2788, 56, 1736, 2304, 449, 3114, 14, 2888, 1925, 2867, 2199, 1207, 2101, 310, 2433, 3082, 1564, 1887, 3159, 2687, 1239, 1243, 2119, 1375, 330, 1968, 1013, 3003, 2343, 1979, 2092, 3238, 925, 3011, 841, 2468, 753, 3189, 1128, 366, 2024, 1769, 2850, 3171, 964, 1213, 3029, 1350, 304, 568, 1149, 1915, 2239, 1087, 3040, 935, 1720, 1562, 139], +[607, 2205, 1165, 535, 1987, 2768, 2696, 3197, 1435, 2405, 88, 919, 2087, 1426, 2285, 2705, 2061, 620, 176, 1481, 2653, 1231, 3007, 1679, 1172, 209, 682, 3254, 118, 272, 1751, 2843, 2706, 1229, 3072, 442, 364, 1148, 1240, 1159, 1924, 1797, 266, 1967, 464, 2058, 712, 711, 3231, 1476, 1509, 1240, 1097, 1483, 1814, 2360, 797, 1204, 10, 3184, 2085, 2110, 1238, 2570, 2151, 1553, 2796, 2378, 606, 1974, 2380, 334, 2562, 846, 581, 2588, 85, 1957, 2392, 1270, 1319, 2175, 1335, 1388, 2066, 1459, 1225, 231, 883, 636, 2465, 1757, 2869, 2989, 1844, 2453, 174, 2735, 960, 3092, 1892, 1581, 2203, 1849, 760, 486, 1781, 324, 1399, 1515, 1252, 3060, 3171, 2483, 3214, 2381, 3245, 673, 300, 2373, 641, 1877, 1933, 1040, 2106, 2787, 729, 2182, 1399, 2782, 1603, 651, 2753, 1199, 563, 1160, 3327, 1613, 2774, 929, 750, 2673, 224, 1304, 1344, 1447, 3078, 807, 2259, 3128, 690, 2352, 390, 2291, 247, 3002, 2703, 2380, 1648, 712, 1004, 181, 725, 1689, 1460, 1599, 320, 105, 1158, 3174, 1670, 2567, 1327, 1997, 2759, 1048, 2583, 2, 1594, 2143, 2779, 514, 263, 1083, 2990, 1320, 857, 320, 823, 3180, 863, 1403, 1455, 1183, 359, 1238, 881, 2343, 2934, 2977, 1768, 1878, 1486, 1744, 1995, 1156, 1071, 2892, 347, 69, 3113, 1485, 1068, 34, 175, 2608, 1207, 2821, 2819, 266, 2754, 2746, 2543, 2045, 3263, 1163, 2036, 1822, 1520, 821, 2146, 1432, 2671, 2500, 2942, 629, 1701, 1012, 1352, 2367, 1684, 3211, 641, 1344, 3014, 2212, 3179, 2455, 2922, 65, 2953, 2558, 1974, 463, 1995, 2380], +[1770, 3266, 3043, 128, 261, 2123, 2318, 1679, 2312, 2908, 1415, 2106, 952, 231, 1318, 2672, 2033, 2343, 2062, 1271, 2885, 2749, 2830, 1397, 1458, 619, 156, 3146, 13, 712, 2290, 2997, 2389, 285, 2680, 215, 1442, 237, 311, 281, 2575, 1402, 734, 3001, 1319, 279, 1769, 2017, 1170, 2232, 2479, 719, 2499, 2068, 2674, 2293, 1093, 2012, 2581, 2347, 2686, 625, 2527, 1482, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1486, 789, 1648, 2771, 2658, 3058, 673, 3189, 1781, 2653, 106, 71, 1122, 2394, 3152, 1859, 3062, 157, 1835, 1027, 1134, 2264, 3036, 2598, 2207, 781, 40, 1023, 1027, 2254, 2111, 2079, 2093, 2120, 2697, 595, 3042, 1497, 465, 1059, 82, 256, 412, 2995, 1587, 368, 2826, 2505, 2406, 1566, 2634, 2034, 1682, 2483, 1108, 651, 1706, 3294, 3012, 3213, 1568, 1147, 650, 1416, 2066, 43, 2743, 396, 2903, 2214, 3254, 639, 113, 1157, 84, 60, 2678, 357, 720, 2255, 427, 847, 3204, 268, 737, 2590, 1831, 2037, 2516, 2417, 2553, 1542, 2758, 2190, 962, 3068, 2659, 2086, 3133, 1740, 2634, 180, 1791, 930, 1437, 1946, 923, 2351, 2992, 293, 2512, 1552, 2326, 2340, 539, 1345, 1565, 1101, 1365, 3161, 2904, 382, 1654, 814, 2694, 17, 1715, 1013, 901, 569, 2283, 2331, 1325, 1572, 535, 2094, 991, 1320, 228, 884, 135, 2421, 97, 1859, 3246, 3280, 2695, 2668, 2268, 1157, 2547, 2436, 385, 805, 801, 944, 2865, 1279, 1857, 1461, 1916, 2123, 495, 1284, 1453, 1985, 2046, 1624, 3183, 2364, 30, 1537, 1862, 2739, 80, 2579, 1215, 2397, 2192, 932, 2914], +[1604, 907, 2780, 2896, 1440, 1196, 865, 2226, 1719, 2596, 1431, 1360, 2267, 2487, 547, 1929, 1366, 1922, 1848, 2866, 1071, 2029, 2971, 2938, 92, 1243, 2389, 1985, 1817, 3303, 1704, 2386, 124, 1364, 2576, 727, 450, 944, 1975, 793, 436, 3138, 2370, 811, 330, 27, 977, 2684, 509, 2572, 1129, 656, 2651, 3175, 2299, 2138, 1874, 1231, 1038, 2930, 954, 324, 1412, 3221, 578, 2157, 157, 2462, 147, 835, 1855, 1831, 3277, 3186, 2064, 3310, 2081, 1046, 1255, 2715, 784, 3111, 821, 2619, 161, 2911, 2020, 427, 1280, 1918, 582, 2287, 3104, 1504, 2902, 1566, 1491, 1947, 1901, 3135, 3252, 3142, 8, 1941, 457, 3045, 2681, 2888, 2211, 816, 624, 432, 1698, 64, 2915, 916, 744, 394, 1448, 1090, 2144, 1006, 813, 692, 987, 2205, 1951, 3121, 1438, 671, 1765, 2188, 2533, 246, 3109, 2501, 2362, 3007, 590, 2924, 2032, 2371, 2796, 3178, 442, 665, 1942, 2701, 787, 1384, 1107, 1575, 157, 1914, 2380, 3203, 890, 1299, 2312, 1837, 2649, 1035, 349, 2949, 342, 313, 1645, 1191, 415, 521, 2850, 1227, 1525, 2183, 1291, 2753, 2684, 3300, 1842, 1332, 984, 2275, 98, 3213, 956, 2387, 2654, 3212, 1764, 2884, 907, 584, 3036, 2211, 314, 465, 1722, 397, 2501, 2477, 337, 1110, 2683, 3042, 1210, 1275, 2964, 867, 692, 1958, 2356, 1419, 1437, 541, 2149, 2496, 1907, 477, 2210, 1782, 1923, 2141, 1793, 734, 1486, 3237, 2369, 72, 892, 893, 922, 179, 2550, 3256, 1785, 781, 3317, 3235, 2821, 3205, 1024, 3101, 913, 856, 2667, 3290, 3034, 1088, 1053, 1942, 1973, 769, 1307, 895, 2929, 2976]] +u = NTTInverse(BHat * rHat) + e1: [[3070, 1402, 2568, 1534, 2888, 2553, 885, 3019, 1058, 2038, 994, 872, 2394, 1510, 2544, 2102, 688, 51, 1823, 3031, 2676, 2707, 2637, 1256, 3208, 2845, 1051, 1172, 635, 530, 1794, 748, 1515, 287, 2643, 2601, 3062, 2961, 1264, 816, 389, 192, 2629, 1172, 974, 1501, 1814, 1302, 1482, 549, 2909, 1002, 1315, 869, 1851, 2329, 1080, 1717, 2973, 2064, 1648, 1337, 3029, 1540, 145, 242, 1749, 559, 2441, 1804, 2459, 51, 2613, 1892, 1190, 2545, 2409, 1360, 1715, 3220, 368, 637, 965, 683, 231, 375, 1577, 1223, 248, 1213, 1332, 599, 997, 233, 1284, 325, 3147, 2356, 641, 765, 19, 2276, 2554, 3122, 145, 2824, 2052, 2637, 2687, 2320, 5, 2552, 2386, 903, 2438, 1119, 3145, 2934, 57, 487, 2845, 2641, 2949, 181, 2455, 2680, 390, 535, 55, 3226, 1640, 2901, 566, 2388, 765, 2374, 1469, 443, 1303, 1544, 98, 70, 2845, 575, 322, 2057, 1843, 2345, 3185, 1016, 265, 673, 958, 571, 2766, 693, 2210, 1851, 1091, 2915, 502, 164, 1522, 2167, 2704, 1426, 966, 269, 1124, 1629, 3155, 1364, 1959, 784, 63, 2078, 552, 305, 3023, 1789, 438, 1106, 1757, 18, 1650, 3175, 3066, 923, 1913, 2002, 2755, 1086, 1953, 1946, 354, 1959, 417, 2790, 56, 1737, 2303, 450, 3115, 14, 2887, 1923, 2868, 2200, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3159, 2686, 1239, 1242, 2119, 1375, 330, 1968, 1013, 3003, 2341, 1980, 2090, 3239, 925, 3011, 842, 2467, 752, 3188, 1128, 366, 2026, 1771, 2850, 3172, 964, 1213, 3028, 1349, 304, 567, 1147, 1916, 2237, 1088, 3041, 935, 1720, 1562, 140], +[607, 2207, 1164, 535, 1988, 2767, 2696, 3197, 1435, 2404, 89, 919, 2087, 1426, 2284, 2705, 2063, 618, 175, 1481, 2654, 1231, 3008, 1679, 1171, 210, 681, 3253, 117, 272, 1751, 2843, 2705, 1228, 3071, 443, 363, 1149, 1240, 1157, 1925, 1796, 268, 1966, 464, 2059, 712, 709, 3231, 1475, 1509, 1240, 1096, 1482, 1812, 2360, 795, 1204, 9, 3185, 2085, 2110, 1237, 2569, 2152, 1555, 2797, 2377, 606, 1973, 2379, 335, 2561, 845, 581, 2589, 85, 1956, 2392, 1271, 1320, 2176, 1335, 1388, 2064, 1460, 1226, 231, 884, 635, 2467, 1756, 2868, 2988, 1842, 2455, 173, 2736, 960, 3091, 1891, 1581, 2201, 1849, 759, 487, 1782, 326, 1399, 1516, 1251, 3060, 3171, 2483, 3215, 2380, 3246, 673, 300, 2373, 640, 1877, 1933, 1039, 2107, 2788, 729, 2183, 1398, 2782, 1602, 652, 2751, 1200, 563, 1161, 3327, 1613, 2775, 930, 751, 2672, 225, 1302, 1346, 1447, 3079, 806, 2257, 3129, 689, 2354, 392, 2292, 247, 3003, 2701, 2380, 1648, 712, 1003, 180, 725, 1690, 1461, 1600, 319, 104, 1159, 3175, 1671, 2566, 1326, 1997, 2760, 1049, 2582, 2, 1594, 2143, 2781, 514, 263, 1085, 2990, 1319, 858, 320, 822, 3182, 863, 1401, 1455, 1185, 358, 1238, 881, 2343, 2935, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3115, 1485, 1068, 34, 176, 2606, 1206, 2821, 2818, 268, 2754, 2747, 2541, 2044, 3264, 1162, 2036, 1823, 1520, 820, 2145, 1431, 2669, 2502, 2942, 627, 1700, 1012, 1352, 2366, 1683, 3211, 643, 1343, 3012, 2213, 3179, 2454, 2923, 65, 2952, 2557, 1974, 464, 1995, 2381], +[1769, 3266, 3044, 127, 262, 2122, 2317, 1681, 2310, 2909, 1416, 2105, 952, 230, 1318, 2670, 2033, 2342, 2063, 1270, 2886, 2751, 2831, 1397, 1458, 618, 155, 3148, 11, 713, 2289, 2998, 2389, 285, 2682, 215, 1442, 238, 311, 282, 2574, 1402, 734, 3002, 1318, 277, 1770, 2017, 1170, 2231, 2478, 720, 2498, 2067, 2674, 2294, 1093, 2012, 2581, 2348, 2684, 625, 2526, 1483, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1484, 788, 1647, 2771, 2660, 3058, 672, 3189, 1781, 2653, 106, 72, 1123, 2395, 3152, 1860, 3063, 158, 1835, 1026, 1134, 2263, 3038, 2599, 2207, 780, 40, 1023, 1027, 2254, 2110, 2078, 2093, 2119, 2698, 596, 3042, 1498, 463, 1057, 84, 257, 413, 2995, 1588, 367, 2825, 2506, 2407, 1565, 2635, 2034, 1681, 2485, 1107, 650, 1706, 3293, 3011, 3212, 1566, 1147, 649, 1417, 2066, 43, 2743, 394, 2903, 2215, 3252, 641, 113, 1158, 85, 60, 2677, 358, 719, 2255, 427, 846, 3205, 268, 738, 2589, 1830, 2038, 2517, 2417, 2553, 1542, 2757, 2189, 960, 3068, 2658, 2085, 3132, 1740, 2634, 182, 1792, 930, 1437, 1946, 923, 2352, 2994, 291, 2512, 1554, 2328, 2341, 539, 1344, 1566, 1100, 1365, 3162, 2905, 381, 1654, 814, 2694, 17, 1715, 1013, 902, 569, 2284, 2330, 1324, 1571, 535, 2093, 991, 1320, 229, 884, 133, 2422, 97, 1858, 3245, 3279, 2695, 2668, 2266, 1157, 2548, 2437, 387, 804, 803, 945, 2866, 1280, 1857, 1460, 1917, 2121, 494, 1284, 1451, 1987, 2047, 1625, 3182, 2364, 31, 1537, 1861, 2739, 79, 2581, 1213, 2396, 2191, 931, 2914], +[1603, 907, 2780, 2897, 1440, 1197, 866, 2225, 1719, 2596, 1432, 1359, 2268, 2488, 547, 1928, 1364, 1924, 1849, 2866, 1073, 2029, 2971, 2938, 93, 1243, 2389, 1985, 1818, 3304, 1703, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2369, 811, 329, 27, 976, 2684, 509, 2572, 1129, 656, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2930, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 835, 1855, 1830, 3279, 3184, 2064, 3310, 2082, 1047, 1256, 2714, 784, 3111, 821, 2619, 161, 2912, 2021, 429, 1281, 1918, 581, 2286, 3103, 1503, 2903, 1567, 1492, 1947, 1903, 3136, 3252, 3143, 7, 1942, 458, 3047, 2681, 2890, 2211, 815, 623, 432, 1697, 65, 2915, 918, 746, 394, 1447, 1091, 2145, 1006, 812, 693, 986, 2204, 1951, 3120, 1437, 670, 1763, 2189, 2534, 247, 3109, 2500, 2363, 3008, 590, 2925, 2032, 2373, 2796, 3179, 443, 665, 1942, 2699, 789, 1384, 1108, 1576, 158, 1914, 2380, 3203, 890, 1299, 2313, 1836, 2651, 1036, 348, 2949, 341, 312, 1643, 1192, 416, 521, 2848, 1227, 1525, 2185, 1290, 2751, 2684, 3301, 1843, 1330, 983, 2275, 98, 3213, 957, 2386, 2653, 3212, 1766, 2882, 908, 585, 3035, 2211, 312, 465, 1721, 396, 2502, 2477, 337, 1111, 2682, 3041, 1211, 1274, 2964, 866, 693, 1960, 2355, 1417, 1438, 539, 2149, 2495, 1908, 478, 2210, 1782, 1923, 2140, 1794, 734, 1484, 3238, 2369, 73, 892, 895, 922, 180, 2551, 3255, 1785, 782, 3318, 3235, 2822, 3206, 1022, 3099, 913, 855, 2668, 3290, 3034, 1088, 1055, 1940, 1975, 770, 1306, 897, 2929, 2977]] + +mu: [1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0] +tHat^T * rHat: [2521, 1369, 68, 1528, 885, 2690, 1603, 1010, 2439, 2475, 3038, 2950, 2802, 515, 997, 2224, 265, 2892, 1640, 1056, 2648, 2894, 761, 3110, 1444, 809, 1776, 153, 1273, 2927, 1206, 474, 1024, 1319, 709, 1223, 372, 1046, 702, 2886, 1740, 1983, 3267, 3286, 2119, 119, 2873, 2020, 2698, 873, 388, 2392, 1860, 1105, 1484, 296, 2039, 103, 2512, 3108, 1212, 476, 1874, 422, 2025, 1328, 59, 2041, 835, 2678, 1733, 2812, 1648, 1426, 420, 1770, 2865, 218, 3125, 3324, 2568, 66, 2746, 1487, 2559, 2516, 2680, 3000, 3225, 1933, 2058, 565, 2699, 2311, 436, 989, 1998, 455, 2658, 3143, 1628, 1347, 400, 1533, 526, 2834, 337, 1605, 2508, 2211, 2642, 727, 600, 2363, 1027, 2666, 1051, 592, 1384, 1563, 1353, 2589, 3316, 2491, 3246, 1824, 487, 1599, 1557, 2240, 2645, 601, 78, 1153, 2842, 2609, 2477, 914, 2910, 1203, 795, 1324, 1369, 1941, 350, 3231, 1514, 2083, 1753, 2156, 2885, 2080, 532, 2189, 1530, 1072, 3173, 1407, 2806, 2507, 3309, 1225, 1431, 728, 1562, 183, 1475, 2509, 3181, 3023, 632, 1610, 630, 2779, 1042, 1494, 698, 2106, 2687, 63, 1288, 1777, 1555, 1383, 2064, 1961, 2394, 689, 3249, 500, 656, 2249, 2442, 331, 2729, 2280, 1736, 111, 1669, 1719, 1198, 1197, 2329, 1953, 1931, 2421, 856, 2272, 2114, 412, 597, 2752, 2077, 1388, 2382, 207, 2363, 3299, 3038, 1663, 2261, 3147, 2806, 2432, 2666, 398, 2874, 1470, 2710, 98, 186, 2820, 1241, 3283, 601, 85, 37, 2846, 627, 1262, 238, 816, 1033, 2485, 602, 816, 1408, 2509, 1723, 511, 2256, 1595, 2550, 654, 1254, 780] +NTTInverse(tHat^T * rHat): [1412, 1558, 3294, 2350, 2981, 2714, 1658, 564, 2631, 244, 2252, 431, 1955, 3100, 2202, 38, 3093, 2809, 1095, 2136, 2259, 15, 1706, 78, 857, 458, 1099, 1767, 2837, 522, 1536, 1544, 1508, 3242, 1050, 3077, 1549, 2401, 574, 1124, 1293, 3307, 1429, 1156, 1855, 3243, 3173, 2230, 1721, 1805, 2457, 640, 482, 1742, 937, 1105, 1233, 572, 2803, 2059, 1081, 1098, 1681, 1665, 2498, 2846, 536, 2773, 241, 2365, 300, 3112, 1536, 788, 2196, 831, 1930, 406, 2239, 656, 1550, 929, 2924, 195, 622, 43, 77, 2653, 751, 1284, 1538, 25, 1757, 1150, 2694, 811, 2783, 3181, 2082, 1504, 964, 324, 2392, 2445, 1646, 2211, 1253, 1008, 3252, 301, 128, 3261, 1039, 2807, 1094, 2214, 590, 1086, 2116, 1952, 1537, 2226, 3127, 361, 808, 2908, 268, 2253, 1765, 1000, 2632, 3179, 2911, 2830, 2241, 2390, 2276, 2450, 2395, 2700, 1280, 948, 1321, 1284, 1198, 1808, 1192, 1179, 1561, 1365, 1414, 338, 718, 3056, 1338, 281, 2380, 2232, 2846, 2442, 548, 141, 2880, 2664, 1288, 3179, 2325, 647, 2925, 747, 2703, 1598, 1759, 3080, 1446, 2048, 980, 2228, 79, 2430, 1390, 3251, 451, 422, 2767, 700, 3242, 3123, 2623, 3128, 2298, 2766, 2336, 2637, 380, 1826, 783, 1534, 2157, 3240, 2149, 2461, 3317, 623, 1529, 2295, 368, 326, 3064, 2141, 2387, 775, 1550, 3068, 2961, 1202, 1899, 2383, 652, 1455, 2205, 1921, 322, 1857, 784, 1673, 3138, 465, 1388, 1943, 110, 2634, 1909, 3214, 2062, 276, 1304, 1535, 358, 593, 2391, 1968, 108, 449, 1268, 1701, 833, 2384, 3020, 2241, 69, 2209, 2960, 1240, 3207, 2501] +e2 + mu: [1665, 3327, 1666, 3328, 1, 2, 0, 1, 1665, 0, 0, 1663, 0, 1, 1665, 1664, 1, 2, 0, 1665, 1665, 1, 1665, 2, 1, 2, 1665, 1663, 2, 1664, 1663, 1667, 1, 1666, 1665, 0, 0, 1664, 0, 1, 3328, 1665, 1663, 1, 1666, 1, 1664, 3328, 1665, 1666, 3327, 1664, 1664, 3327, 0, 0, 1665, 0, 1665, 1664, 0, 1664, 1663, 1, 3328, 0, 2, 1666, 1664, 1665, 0, 1667, 0, 1, 0, 1665, 1666, 1, 0, 1, 0, 1, 1666, 0, 1667, 1664, 1665, 1665, 3328, 0, 2, 1664, 1664, 1665, 0, 1665, 1665, 1665, 1, 1667, 0, 0, 1666, 1663, 1, 1666, 1665, 1666, 3328, 1666, 0, 0, 0, 0, 3327, 1666, 1, 1665, 0, 0, 1665, 3328, 0, 1664, 1665, 0, 0, 1665, 1, 1665, 1666, 1664, 3327, 1, 0, 2, 3328, 1, 1666, 0, 1666, 1665, 1664, 1, 3328, 1, 1665, 3328, 1, 1, 2, 1664, 1666, 1665, 1666, 3328, 1666, 3328, 0, 1, 3328, 1, 1, 1665, 1666, 3328, 1665, 0, 1665, 1665, 1666, 1664, 1666, 1664, 1666, 3328, 3328, 3328, 1665, 1665, 3328, 1666, 1664, 1664, 1, 0, 3328, 1667, 1665, 1667, 3328, 0, 1665, 0, 3327, 2, 3328, 1664, 3327, 1665, 0, 0, 3328, 1665, 3328, 1664, 0, 1, 1664, 1664, 0, 1663, 0, 3328, 1664, 3328, 1665, 1664, 1, 1665, 1666, 1664, 0, 1664, 1664, 1666, 1665, 1664, 0, 3327, 1664, 3328, 1664, 3328, 3328, 1665, 1665, 1665, 1666, 1665, 2, 1, 1665, 0, 0, 1666, 1665, 1666, 3327, 3328, 1, 1666, 1664, 1663, 1666, 0] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [3077, 1556, 1631, 2349, 2982, 2716, 1658, 565, 967, 244, 2252, 2094, 1955, 3101, 538, 1702, 3094, 2811, 1095, 472, 595, 16, 42, 80, 858, 460, 2764, 101, 2839, 2186, 3199, 3211, 1509, 1579, 2715, 3077, 1549, 736, 574, 1125, 1292, 1643, 3092, 1157, 192, 3244, 1508, 2229, 57, 142, 2455, 2304, 2146, 1740, 937, 1105, 2898, 572, 1139, 394, 1081, 2762, 15, 1666, 2497, 2846, 538, 1110, 1905, 701, 300, 1450, 1536, 789, 2196, 2496, 267, 407, 2239, 657, 1550, 930, 1261, 195, 2289, 1707, 1742, 989, 750, 1284, 1540, 1689, 92, 2815, 2694, 2476, 1119, 1517, 2083, 3171, 964, 324, 729, 779, 1647, 548, 2918, 2674, 3251, 1967, 128, 3261, 1039, 2807, 1092, 551, 591, 2751, 2116, 1952, 3202, 2225, 3127, 2025, 2473, 2908, 268, 589, 1766, 2665, 969, 1514, 2909, 2831, 2241, 2392, 2275, 2451, 732, 2700, 2946, 2613, 2985, 1285, 1197, 1809, 2857, 1178, 1562, 1366, 1416, 2002, 2384, 1392, 3004, 280, 717, 2231, 2846, 2443, 547, 142, 2881, 1000, 2954, 3178, 661, 647, 1261, 2412, 1040, 3262, 96, 1415, 3112, 2047, 979, 2227, 1744, 766, 1389, 1588, 2115, 2086, 2768, 700, 3241, 1461, 959, 1466, 2297, 2766, 672, 2637, 378, 1828, 782, 3198, 2155, 1576, 2149, 2461, 3316, 2288, 1528, 630, 368, 327, 1399, 476, 2387, 2438, 1550, 3067, 1296, 1201, 235, 718, 653, 3120, 542, 256, 322, 192, 2448, 10, 1474, 2129, 1388, 1941, 1774, 2633, 244, 3213, 2061, 1941, 2969, 3200, 2024, 2258, 2393, 1969, 1773, 449, 1268, 38, 2498, 721, 3018, 2240, 70, 546, 1295, 2903, 1544, 2501] + +KBar: 62C86B23A76F753CD161DAE4D4B44E900BAACE3D758C356D534FBFAFF6BDCCFA +cPrime: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 + +Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt new file mode 100644 index 000000000..1ca796fcd --- /dev/null +++ b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt @@ -0,0 +1,57 @@ +Decapsulation -- ML-KEM-512 +dk: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C52B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 +c: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 + +dk_pke: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD +ek_pke: 9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C5 +h: 2B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481 +z: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 + +c1: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE +c2: 1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 +u: [[1261, 1795, 1691, 1489, 741, 1005, 517, 2136, 3114, 432, 2705, 2877, 2633, 2988, 2767, 1430, 1317, 3062, 20, 2253, 1037, 1235, 1573, 705, 3140, 3046, 836, 2048, 683, 3277, 2955, 2259, 2640, 127, 3085, 2237, 1300, 289, 1791, 940, 2523, 2126, 42, 2682, 660, 670, 2698, 72, 2949, 348, 2045, 1138, 114, 3228, 257, 85, 3043, 2094, 800, 2578, 2370, 1053, 605, 601, 1421, 1190, 1291, 3270, 2003, 543, 2363, 803, 2441, 3290, 205, 1112, 2435, 2624, 549, 1089, 754, 1700, 312, 2919, 1313, 575, 185, 1908, 2656, 855, 3225, 2585, 2129, 2620, 992, 367, 1622, 52, 2526, 1782, 2637, 2568, 2331, 3101, 800, 1586, 2594, 2467, 221, 3238, 478, 2890, 2958, 42, 2272, 2120, 1651, 273, 1307, 2077, 2952, 988, 780, 1326, 2923, 1492, 127, 351, 2744, 3251, 3033, 940, 2617, 1873, 2835, 1118, 1912, 1378, 2698, 3319, 507, 364, 1473, 488, 1632, 2838, 371, 3088, 1538, 497, 348, 966, 1362, 497, 3319, 85, 2116, 2588, 2129, 2370, 306, 319, 1577, 575, 2923, 2737, 2637, 1632, 2812, 361, 2253, 1235, 631, 2048, 796, 2328, 1141, 59, 640, 2276, 2415, 2715, 387, 1534, 588, 992, 878, 757, 1200, 2815, 3049, 3322, 2799, 280, 1473, 2578, 2949, 244, 1326, 1921, 3140, 2253, 3222, 796, 94, 2406, 3322, 1063, 3205, 2337, 2741, 878, 2542, 2984, 1440, 2637, 458, 1795, 1479, 3027, 1599, 2393, 1161, 1808, 1651, 2295, 553, 419, 335, 111, 2728, 1752, 2949, 2936, 2113, 2731, 2526, 783, 2097, 2175, 1330, 2744, 3040, 114, 2295, 354, 3033, 2598, 1811, 2243, 1411, 988, 1440, 1759, 2698, 3137], +[1131, 1313, 868, 2363, 1580, 1447, 774, 546, 800, 2864, 2289, 2224, 3157, 1860, 796, 891, 2276, 2893, 2620, 2747, 289, 3319, 1456, 3192, 728, 192, 1938, 436, 1970, 2984, 2224, 3131, 709, 1873, 1863, 2757, 3166, 2702, 3033, 754, 575, 2682, 2776, 1031, 241, 598, 120, 2454, 1070, 1037, 972, 341, 1573, 1310, 2754, 2770, 2854, 2757, 2350, 800, 790, 364, 1115, 832, 361, 3322, 868, 2806, 3150, 1918, 65, 2708, 2445, 741, 55, 1362, 923, 2702, 328, 1294, 2389, 832, 1352, 780, 2279, 3137, 1463, 1005, 2913, 2867, 367, 2767, 1369, 2705, 345, 3303, 2984, 1021, 582, 1437, 166, 439, 1170, 3309, 2133, 1934, 3157, 107, 2042, 484, 686, 1463, 1024, 2812, 2324, 618, 585, 465, 699, 150, 16, 1037, 2929, 2516, 276, 156, 2448, 179, 575, 1310, 2120, 2721, 575, 569, 3040, 3228, 436, 1300, 2676, 1395, 2942, 2399, 1749, 2607, 1759, 163, 995, 3189, 2929, 731, 250, 2962, 1027, 2165, 1990, 975, 1567, 3023, 3196, 601, 1609, 2220, 1655, 3231, 458, 3212, 2897, 637, 2448, 2523, 2679, 2932, 2656, 2685, 2861, 1450, 2376, 2666, 2588, 2646, 1460, 946, 836, 2240, 2061, 849, 1570, 1476, 1798, 1619, 1700, 2770, 660, 1131, 2428, 1733, 2802, 1144, 1456, 2845, 2871, 2711, 764, 2120, 202, 403, 1534, 29, 2578, 1879, 764, 631, 3300, 1502, 2962, 2032, 3215, 2578, 1726, 770, 2536, 2357, 2432, 3160, 2646, 2162, 1248, 2737, 696, 1495, 384, 1495, 1473, 2207, 2211, 575, 3316, 2702, 3124, 2097, 1440, 276, 3056, 653, 1492, 497, 2217, 335, 647, 566, 1138, 2581, 445, 738, 2493, 3095]] +v: [2705, 208, 2289, 2913, 208, 0, 1456, 832, 2289, 416, 1456, 2913, 2497, 1248, 2081, 624, 1665, 1456, 2289, 2497, 832, 416, 2913, 416, 3121, 2705, 416, 2913, 2705, 208, 1248, 1873, 3121, 208, 2289, 2497, 1040, 1665, 624, 2497, 3121, 2497, 2497, 1248, 2913, 2913, 208, 416, 1873, 1665, 1248, 1665, 208, 2497, 2705, 2289, 624, 1873, 2289, 416, 1873, 3121, 2289, 1456, 1248, 2497, 2913, 2705, 2081, 2497, 2289, 2081, 1665, 3121, 1248, 2497, 1873, 416, 0, 832, 0, 2497, 1040, 2081, 2913, 1665, 1456, 1665, 1248, 2497, 2705, 2913, 2497, 2705, 1456, 2705, 2289, 832, 3121, 1456, 208, 1456, 2705, 1040, 2497, 1665, 416, 416, 416, 1040, 1040, 0, 1248, 832, 624, 416, 3121, 1873, 2081, 624, 2081, 2081, 0, 208, 832, 2081, 1040, 624, 416, 1665, 208, 0, 624, 0, 832, 2289, 624, 2913, 1873, 416, 624, 1040, 208, 208, 1873, 2705, 416, 1873, 1873, 2497, 1665, 2497, 1456, 1456, 2081, 208, 2497, 624, 1665, 2913, 1873, 832, 1248, 1665, 3121, 1665, 1248, 624, 624, 3121, 416, 208, 832, 208, 1873, 3121, 624, 1248, 2497, 1873, 416, 0, 3121, 1665, 2081, 832, 3121, 1040, 1873, 832, 1040, 832, 416, 3121, 2913, 2289, 1873, 2497, 1665, 1040, 0, 1040, 1456, 1456, 3121, 2289, 3121, 416, 624, 1248, 2705, 1456, 1040, 416, 1873, 832, 1665, 3121, 832, 624, 2497, 1665, 0, 0, 2497, 2913, 3121, 2289, 1873, 208, 832, 2497, 0, 1456, 3121, 2705, 1040, 416, 2913, 1040, 3121, 3121, 416, 1248, 416, 624, 208, 1665, 832, 624, 1873, 416, 1665, 3121, 624, 1040] +sHat: [[791, 308, 2543, 858, 544, 2222, 1648, 3207, 2440, 1760, 2, 3035, 2264, 774, 2889, 1559, 2813, 2926, 3104, 1737, 3319, 1569, 1628, 2052, 3191, 837, 2167, 453, 2626, 1783, 225, 859, 2926, 74, 2699, 1084, 847, 2904, 2114, 2956, 352, 96, 1430, 1834, 2969, 619, 2082, 2198, 3103, 1839, 3092, 2578, 1704, 390, 2140, 730, 5, 1636, 2709, 1403, 2516, 780, 505, 2012, 866, 1314, 1340, 2639, 1266, 826, 1187, 1110, 154, 2764, 734, 1351, 840, 657, 2856, 440, 2017, 3272, 293, 2546, 584, 1100, 828, 533, 1433, 2360, 597, 211, 4, 2959, 2317, 1694, 2545, 2614, 2770, 843, 1041, 2779, 444, 2912, 354, 2087, 2380, 1357, 2108, 2983, 1096, 2784, 897, 2815, 768, 1731, 860, 1692, 1155, 3077, 2272, 1841, 418, 2010, 1386, 2617, 2066, 2470, 3225, 2205, 264, 1284, 1448, 701, 3251, 1009, 1267, 541, 863, 3146, 2833, 1025, 537, 2153, 366, 997, 2129, 2594, 2318, 1533, 1758, 334, 3205, 2365, 2430, 2512, 1910, 2495, 914, 1239, 3012, 2972, 1191, 314, 1790, 650, 91, 3116, 1660, 489, 327, 2445, 1078, 3140, 447, 985, 1138, 2831, 816, 1149, 568, 1828, 2147, 1966, 180, 2940, 3039, 1824, 2762, 2568, 1722, 1978, 2311, 921, 2005, 2056, 29, 3206, 122, 1026, 3166, 1317, 3168, 115, 2863, 1597, 482, 3118, 3241, 3109, 2671, 3045, 2294, 2096, 51, 136, 134, 2365, 458, 2672, 1903, 5, 1374, 848, 1129, 741, 1802, 1712, 920, 1751, 2381, 2819, 271, 1628, 3135, 731, 2578, 814, 2985, 2484, 1682, 2236, 1700, 2219, 2894, 887, 778, 2818, 2111, 558, 2326, 2819, 1042, 2052, 1900, 98], +[2170, 53, 2077, 219, 813, 1632, 282, 1968, 2996, 2870, 2673, 3249, 2646, 1272, 2987, 2814, 2757, 111, 2807, 236, 1613, 745, 49, 3255, 17, 2700, 2769, 152, 1998, 2658, 1705, 999, 2066, 2131, 581, 576, 2014, 3264, 1047, 1733, 1303, 505, 2014, 1764, 1288, 2099, 239, 3057, 2422, 2218, 2559, 2847, 1325, 1035, 796, 1661, 1332, 921, 1069, 295, 913, 2732, 632, 196, 3210, 2903, 1791, 1294, 2322, 1993, 1101, 810, 2350, 186, 1104, 2897, 180, 397, 1, 576, 1904, 836, 3102, 580, 3001, 2262, 124, 512, 2898, 1988, 1565, 3126, 3296, 2856, 2969, 1262, 2758, 239, 2792, 94, 1021, 244, 87, 1510, 2953, 562, 45, 1138, 3018, 1257, 2506, 3037, 3280, 2457, 2385, 1681, 534, 1493, 2334, 540, 950, 3310, 1550, 2350, 2027, 650, 2996, 269, 2291, 499, 2239, 1189, 3003, 1703, 146, 3185, 1220, 3298, 1610, 2355, 2928, 1164, 2262, 1584, 2634, 187, 511, 3161, 2658, 272, 137, 3245, 663, 468, 1090, 659, 1787, 918, 3154, 301, 1073, 875, 299, 1575, 2814, 1059, 3089, 2321, 2775, 2406, 1100, 347, 1089, 521, 2974, 2733, 2079, 436, 1745, 3122, 293, 1389, 888, 2494, 1228, 3198, 2564, 1166, 1650, 1604, 3210, 1734, 37, 2900, 246, 2616, 606, 2094, 1602, 1108, 522, 2359, 2802, 2305, 463, 1261, 2042, 2303, 1955, 813, 290, 3173, 1345, 234, 2965, 1515, 2757, 188, 2144, 2526, 2172, 2929, 2724, 244, 1199, 3019, 2477, 2910, 392, 2941, 508, 703, 417, 142, 1613, 2837, 2711, 2318, 2727, 985, 643, 1961, 1827, 1536, 571, 284, 960, 200, 1719, 704, 1284, 1154, 1828, 1461, 3106, 2774]] +w: [1558, 92, 164, 1760, 1700, 82, 3105, 3297, 1538, 1766, 1763, 181, 1746, 3293, 1756, 3229, 1581, 8, 1636, 3282, 1699, 3307, 1542, 41, 39, 46, 1686, 1653, 29, 1697, 1665, 1697, 73, 3243, 1717, 2, 3277, 34, 3276, 68, 1621, 1657, 3315, 1666, 1664, 1717, 3311, 1598, 3262, 1738, 1544, 3302, 1628, 1521, 1606, 3239, 1658, 3316, 209, 108, 1510, 1568, 1658, 108, 48, 5, 1696, 78, 3141, 3300, 1557, 1676, 1577, 1765, 85, 3312, 1720, 1592, 3250, 3181, 142, 45, 1613, 47, 1830, 3239, 3216, 3269, 3232, 1703, 1712, 33, 3111, 3253, 1703, 3251, 1663, 1709, 224, 1684, 1623, 1643, 3231, 1767, 3319, 15, 156, 1611, 3132, 1753, 1498, 1764, 1593, 128, 1737, 3279, 1753, 60, 3263, 1540, 1655, 5, 1655, 15, 3275, 1574, 149, 227, 134, 49, 1633, 24, 1752, 3319, 46, 8, 3270, 36, 78, 113, 1701, 8, 44, 1723, 1668, 1589, 3290, 103, 1718, 86, 1582, 38, 1561, 133, 3309, 3160, 93, 1733, 3315, 3313, 116, 1723, 3238, 3254, 3306, 1665, 27, 1534, 1672, 1676, 1773, 3237, 1562, 5, 70, 19, 182, 1737, 1688, 1670, 36, 1532, 1757, 3210, 1725, 1596, 3272, 3275, 1759, 41, 3310, 1625, 1661, 1739, 3279, 1614, 1641, 3285, 1639, 158, 3266, 3238, 1755, 27, 1468, 193, 1660, 43, 68, 18, 3164, 19, 5, 1560, 3209, 3321, 3182, 3315, 57, 3164, 73, 3304, 1688, 1743, 1758, 72, 1555, 114, 1898, 3174, 1652, 1616, 2, 1791, 3209, 1685, 3225, 1552, 1823, 1636, 42, 17, 1715, 26, 3234, 92, 1605, 199, 1802, 0, 1641, 3224, 3295, 1749, 1513, 3251] +mPrime: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 + +KPrime: 224B9C051213EF46549243796532282973FA7CF97E8913C339C1940AC17E05E0 +rPrime: 92A1F927E9CB290EA28358A8927D1CB7E25789194C510DC1462A04EE4CC75B21 + +tHat: [[1946, 3106, 1444, 405, 2478, 1347, 1892, 1686, 1284, 1176, 650, 163, 2517, 2358, 2737, 2517, 1570, 412, 1556, 3252, 2624, 1882, 71, 356, 3201, 3197, 1507, 2406, 3249, 112, 2810, 514, 3252, 1203, 1025, 1026, 2591, 232, 2164, 1924, 2503, 1634, 1827, 924, 2395, 2374, 3281, 1144, 647, 2202, 219, 1483, 689, 1864, 2129, 1021, 2311, 66, 1363, 2375, 1525, 3233, 1808, 2449, 22, 2610, 2366, 1760, 3296, 157, 1050, 3246, 1686, 48, 433, 2896, 692, 1006, 2970, 1621, 1761, 3119, 3240, 2204, 820, 2097, 1719, 1824, 1374, 2877, 1864, 1685, 2840, 2289, 886, 2500, 773, 1702, 1036, 867, 2815, 2235, 1414, 778, 367, 282, 3318, 1823, 2027, 2487, 37, 1991, 250, 2670, 3034, 167, 2517, 1213, 528, 495, 2639, 2348, 2953, 2547, 1022, 535, 775, 1030, 1811, 2103, 122, 3233, 1430, 834, 620, 2772, 1479, 3024, 2962, 845, 2342, 621, 3022, 1508, 2754, 1476, 2015, 3250, 1425, 2686, 1767, 1233, 3099, 2461, 1751, 1941, 2555, 940, 1624, 1151, 474, 140, 2412, 798, 2236, 2336, 2355, 1166, 2174, 1648, 2236, 1141, 299, 3056, 1320, 3129, 1571, 1243, 2750, 372, 2217, 1054, 944, 3237, 3291, 1893, 1488, 1827, 588, 435, 956, 1633, 2671, 848, 2783, 125, 2081, 2446, 886, 594, 2410, 1241, 2709, 463, 1285, 1999, 1310, 2609, 2572, 196, 2179, 2561, 3288, 1043, 1548, 643, 2146, 382, 2781, 2998, 2986, 3044, 1909, 875, 3020, 2892, 2735, 386, 644, 3024, 1356, 2430, 147, 130, 2182, 1618, 1331, 1570, 1267, 3186, 1188, 338, 1311, 2523, 266, 2094, 2079, 1602, 1735, 2446, 2578, 2775, 914, 956, 2353, 2179], +[2754, 153, 226, 1094, 2715, 1980, 1774, 131, 354, 1251, 327, 2533, 499, 2265, 1245, 62, 2535, 683, 201, 2297, 1683, 876, 1436, 3148, 3195, 2840, 2780, 835, 1913, 1580, 2806, 386, 1534, 2704, 1200, 1446, 339, 2561, 2072, 1826, 2874, 1310, 250, 1509, 662, 2539, 2877, 1762, 859, 625, 2782, 1555, 3243, 1280, 446, 576, 2998, 820, 2865, 804, 726, 593, 1040, 1614, 1349, 1960, 672, 3150, 688, 1389, 1685, 517, 2216, 470, 1310, 1301, 38, 93, 777, 1470, 1781, 2105, 2781, 1034, 3304, 1298, 1435, 1416, 850, 1644, 1227, 1109, 2347, 271, 432, 1680, 35, 835, 2135, 1616, 319, 389, 256, 235, 3328, 2553, 125, 2641, 2875, 776, 959, 2817, 1391, 1250, 1736, 2986, 1875, 9, 1526, 2259, 1760, 932, 1281, 1033, 1993, 1016, 1599, 2052, 482, 929, 3196, 1372, 1535, 1239, 2693, 1658, 1513, 1534, 1160, 583, 736, 1579, 598, 2648, 733, 394, 3312, 963, 528, 1130, 205, 3275, 401, 2525, 655, 1232, 441, 1051, 95, 2757, 1752, 1503, 2274, 1975, 913, 3152, 1653, 2171, 1398, 1829, 2767, 1439, 3074, 694, 1998, 1870, 3107, 2811, 1491, 1200, 760, 1822, 2111, 1467, 1547, 2639, 366, 1559, 1362, 3231, 419, 480, 457, 320, 3015, 22, 1873, 2454, 2493, 277, 2881, 1797, 1093, 116, 2175, 2177, 1286, 1511, 492, 788, 1509, 1381, 219, 1017, 1090, 3096, 249, 2144, 1023, 436, 1384, 511, 2146, 297, 243, 2898, 351, 2514, 370, 2346, 2191, 3219, 3233, 2094, 315, 2442, 2746, 3001, 1708, 671, 770, 3243, 3082, 2399, 2794, 3128, 2819, 2239, 2525, 2994, 2205, 2561, 1083, 1258, 344, 2827]] + +bHat = aHat^T: [[[1341, 1232, 1520, 1770, 1003, 1831, 2265, 2612, 3123, 2306, 2308, 2255, 1490, 1757, 3189, 527, 3134, 69, 1977, 3080, 2397, 130, 1582, 978, 3006, 804, 2954, 2425, 1044, 1858, 3045, 2399, 2205, 2550, 2921, 122, 1228, 2138, 2028, 121, 2672, 2810, 2355, 918, 3306, 1704, 760, 542, 3315, 2757, 2693, 1951, 1877, 1773, 1983, 1080, 708, 2782, 3172, 1953, 1452, 1721, 1892, 1248, 1798, 1997, 1316, 2886, 2562, 2126, 3292, 31, 3282, 2460, 1927, 2546, 2859, 1498, 905, 1786, 199, 2414, 1990, 1834, 515, 2527, 494, 743, 2335, 2652, 2521, 1445, 1538, 275, 2051, 1796, 1074, 333, 2770, 1060, 2473, 2840, 979, 648, 2891, 139, 2866, 3043, 1062, 159, 2676, 1072, 1455, 1652, 1722, 1985, 2592, 2855, 2396, 1723, 3, 304, 3034, 2717, 899, 72, 2047, 3212, 1207, 2879, 3130, 1150, 453, 1398, 518, 916, 3155, 520, 629, 2344, 966, 3254, 577, 2344, 1025, 1063, 1548, 2577, 2271, 665, 1798, 3220, 2069, 1307, 3102, 3220, 1057, 437, 1217, 941, 487, 885, 1418, 2967, 1058, 1396, 1932, 721, 2302, 730, 522, 2775, 372, 359, 1712, 2573, 2476, 2273, 2627, 1436, 417, 2326, 2963, 1542, 1470, 2662, 728, 2267, 2454, 836, 443, 998, 3223, 2987, 440, 2548, 539, 1465, 1776, 532, 406, 1756, 3231, 2506, 1574, 1183, 1437, 2043, 1381, 1618, 2438, 416, 3158, 2431, 760, 1974, 1599, 1637, 611, 826, 1576, 1703, 3197, 127, 2296, 2774, 3170, 1351, 1635, 2287, 1133, 1110, 1299, 915, 2495, 787, 2044, 689, 3080, 1719, 1343, 3007, 1914, 1995, 1831, 2520, 2468, 694, 965, 665, 1532, 2025, 733, 2621, 752, 1605], +[1107, 1430, 1656, 2723, 1978, 2161, 2909, 1681, 2024, 1209, 2176, 1472, 2579, 3193, 1266, 2891, 2717, 2156, 2500, 2580, 1459, 1409, 1570, 1053, 538, 1782, 2370, 2274, 2948, 325, 2898, 857, 3112, 710, 1579, 1744, 3081, 1871, 2509, 2458, 1463, 479, 1749, 2296, 1140, 2636, 328, 1349, 502, 1761, 989, 359, 2149, 1892, 2098, 1286, 804, 933, 149, 1944, 2217, 2744, 2954, 1092, 1103, 878, 3326, 1679, 3102, 2809, 1795, 574, 696, 2034, 2029, 2448, 2135, 2194, 2503, 823, 2128, 144, 1105, 963, 1929, 1328, 3113, 1097, 3052, 1648, 2484, 1650, 2180, 958, 606, 1317, 1804, 1384, 672, 3053, 2554, 865, 1727, 1415, 1929, 3154, 652, 875, 3149, 998, 3240, 2022, 2963, 1205, 1546, 3195, 767, 2671, 2607, 1803, 20, 1117, 948, 2191, 3261, 2478, 404, 1826, 3250, 2506, 2373, 932, 1131, 2317, 2269, 1348, 1468, 1091, 748, 1428, 1056, 1387, 1239, 2847, 3157, 2702, 2015, 1255, 2443, 2435, 2593, 90, 3119, 499, 1133, 1612, 1520, 2342, 1072, 2683, 83, 2279, 1263, 3266, 2199, 1519, 1825, 1309, 2528, 47, 438, 309, 1518, 2420, 3090, 2179, 2935, 1451, 2304, 951, 2545, 1654, 3056, 2547, 77, 1009, 205, 1809, 1568, 2342, 599, 836, 2768, 3005, 2877, 301, 475, 2302, 305, 2121, 1705, 1426, 134, 1412, 2429, 795, 688, 3322, 2501, 2658, 2624, 3098, 878, 687, 1608, 1006, 1545, 1968, 2378, 468, 2303, 2194, 2518, 1457, 16, 504, 95, 2007, 734, 2785, 98, 1422, 3236, 3044, 1251, 2906, 2639, 2433, 3163, 1519, 1576, 1630, 2987, 1430, 1823, 2949, 2139, 637, 298, 3004, 2426, 3260, 3128, 3059, 291, 2868]], +[[1490, 2832, 3007, 87, 745, 2812, 374, 2590, 2710, 2551, 3299, 346, 1573, 2189, 2468, 139, 551, 1030, 1873, 3009, 1273, 1775, 2465, 190, 1929, 666, 2757, 1478, 1525, 362, 784, 472, 2798, 715, 2660, 855, 76, 2123, 524, 394, 3257, 1995, 205, 2851, 2305, 202, 3016, 2563, 816, 161, 992, 379, 1278, 2061, 95, 1542, 1884, 1431, 2503, 62, 3180, 1320, 1291, 2129, 697, 2997, 367, 1277, 948, 2299, 228, 1321, 1930, 2895, 842, 2553, 1372, 3135, 1074, 2797, 2292, 3180, 291, 1832, 2580, 201, 2690, 2465, 2544, 1341, 2051, 2719, 692, 2968, 1173, 728, 595, 968, 39, 2628, 1344, 2638, 1878, 2022, 138, 974, 2049, 1125, 1616, 603, 1373, 2565, 1100, 143, 1672, 3104, 1243, 2222, 2379, 2517, 1040, 2306, 1932, 2232, 2414, 1713, 2733, 2613, 210, 2899, 2225, 2417, 1153, 497, 532, 1226, 262, 2346, 1385, 924, 3111, 468, 1646, 191, 2982, 2701, 2902, 2380, 3032, 494, 174, 2728, 1105, 744, 125, 1495, 38, 2909, 1141, 3020, 2882, 1922, 2506, 2908, 2238, 1611, 41, 431, 2658, 2025, 2119, 3256, 3101, 2231, 2925, 3299, 791, 2320, 84, 3084, 1029, 2357, 2775, 2083, 2328, 1041, 1048, 991, 1106, 2707, 1944, 3248, 1587, 548, 2929, 600, 3258, 1248, 2516, 1528, 358, 1167, 106, 1476, 1446, 1374, 2209, 2259, 234, 928, 3253, 3168, 478, 2383, 2531, 2209, 630, 2093, 962, 55, 318, 2421, 1577, 1821, 751, 1514, 294, 1757, 425, 1024, 895, 390, 2531, 2178, 2151, 1118, 3219, 299, 2208, 2239, 407, 2184, 2323, 742, 1553, 3275, 1188, 1947, 60, 1538, 989, 1589, 2246, 677, 2878, 1923], +[1870, 3321, 145, 1061, 1324, 1482, 2251, 3214, 3210, 2036, 1155, 393, 3199, 3013, 627, 371, 1565, 1594, 523, 2681, 452, 1173, 2787, 2781, 1422, 420, 1010, 1164, 1696, 2259, 464, 1557, 709, 2202, 986, 2065, 3081, 3085, 1543, 2780, 1209, 1584, 452, 631, 943, 2201, 3047, 617, 156, 1642, 1750, 3056, 2725, 158, 2234, 2969, 3002, 3121, 2707, 3103, 1852, 312, 2732, 2553, 836, 1663, 2660, 1299, 1227, 732, 2633, 1653, 2922, 1352, 2187, 383, 2319, 2650, 1625, 828, 3144, 1333, 2004, 830, 888, 1811, 1248, 2772, 543, 2505, 1352, 2143, 3127, 2158, 89, 2546, 2032, 918, 1347, 1170, 1139, 1824, 605, 1597, 1536, 360, 2817, 1845, 2283, 2681, 1821, 1632, 1674, 3289, 695, 651, 2882, 3127, 1179, 2895, 4, 2780, 1420, 2965, 545, 2508, 278, 1726, 467, 1242, 2215, 1513, 424, 2896, 1910, 2627, 576, 2049, 408, 3020, 2565, 3272, 1820, 1438, 1010, 523, 3067, 2464, 1939, 624, 347, 1840, 2150, 2970, 1050, 1275, 3275, 760, 1072, 1447, 355, 2674, 1035, 2885, 840, 665, 1106, 2391, 2849, 3088, 2274, 2110, 2245, 3223, 1668, 256, 1557, 406, 1585, 2563, 194, 1876, 2882, 1126, 1050, 2555, 3260, 2140, 2434, 700, 1806, 512, 3174, 841, 2889, 1971, 652, 821, 828, 1498, 3151, 1440, 1038, 1782, 2297, 2146, 871, 2472, 3117, 21, 86, 2439, 3245, 1017, 2212, 2431, 1440, 1670, 1586, 1253, 2961, 1185, 2464, 704, 213, 1625, 961, 1036, 2316, 355, 1592, 3255, 3012, 365, 1156, 1393, 1085, 1161, 2603, 601, 3076, 799, 1919, 914, 561, 2296, 1331, 2214, 2464, 2121, 311, 2043, 2450, 2336, 1608, 1583]]] + +r: [[2, 0, 3328, 3328, 3328, 1, 0, 2, 0, 3328, 2, 1, 1, 3327, 1, 3327, 3328, 3328, 3328, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 3326, 1, 3328, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3326, 3328, 1, 3328, 3327, 0, 3328, 1, 1, 3328, 3327, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3326, 1, 0, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 3327, 3328, 0, 3328, 2, 0, 3327, 0, 2, 1, 0, 1, 3327, 0, 0, 1, 1, 2, 3328, 2, 3328, 0, 3328, 1, 3328, 1, 1, 2, 0, 3328, 3, 1, 3327, 3328, 3328, 3328, 0, 0, 0, 3327, 0, 3328, 0, 0, 3328, 3, 3327, 3328, 0, 0, 0, 1, 1, 2, 3327, 0, 2, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 0, 3328, 0, 0, 3328, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 0, 2, 0, 3328, 0, 0, 1, 3328, 2, 0, 0, 1, 1, 2, 2, 1, 1, 3327, 0, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 3326, 2, 1, 3328, 3328, 2, 3328, 1, 1, 0, 2, 0, 3328, 1, 2, 1, 3328, 3328, 0, 1, 0, 0, 3327, 0, 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 3328, 1, 0, 0, 3328, 3328, 0, 0], +[3327, 0, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 0, 0, 0, 1, 3328, 3328, 3, 3328, 3327, 3328, 0, 0, 0, 1, 0, 1, 1, 3326, 3, 0, 1, 3328, 1, 3328, 3328, 1, 0, 3327, 3326, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 1, 1, 0, 3328, 1, 0, 2, 0, 3328, 3328, 3327, 3328, 3328, 3328, 1, 1, 3327, 1, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 2, 1, 1, 0, 1, 3328, 0, 0, 0, 3, 0, 1, 3327, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 2, 1, 0, 0, 0, 2, 2, 0, 0, 1, 3328, 3328, 1, 1, 1, 2, 3327, 1, 3328, 3328, 2, 2, 3328, 3328, 1, 3328, 0, 3, 1, 0, 3328, 1, 3328, 0, 0, 1, 2, 3328, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 1, 3328, 0, 2, 2, 0, 2, 0, 0, 3328, 1, 1, 0, 3328, 3328, 2, 1, 1, 0, 2, 0, 1, 0, 3327, 3328, 2, 0, 0, 1, 3327, 3328, 3328, 1, 3327, 0, 2, 1, 2, 0, 3326, 1, 1, 3327, 0, 3328, 3327, 3328, 0, 3328, 1, 2, 3327, 2, 2, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 3328, 2, 1, 0, 0, 1, 3327, 3328, 1, 3328, 1, 1, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 3327, 3328, 3328, 0, 0, 1, 0, 0, 3328, 2, 3328]] + +e1: [[3328, 1, 0, 3328, 0, 0, 3328, 0, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 1, 3328, 3328, 1, 0, 0, 3328, 3328, 1, 1, 2, 3327, 3328, 3328, 0, 0, 3327, 0, 0, 0, 3327, 0, 3327, 3328, 2, 1, 2, 3328, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 2, 0, 2, 3328, 3328, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 3327, 0, 3327, 3328, 0, 1, 3328, 3327, 1, 3327, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 2, 1, 0, 0, 3327, 3328, 3327, 0, 3328, 3328, 1, 3328, 2, 2, 3328, 0, 0, 2, 3328, 3327, 3328, 1, 1, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 3327, 1, 1, 1, 1, 3328, 3328, 3328, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 0, 1, 1, 1, 3327, 1, 0, 3328, 3328, 3327, 2, 3328, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 1, 1, 3328, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 3328, 1, 0, 0, 3328, 2, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 1, 0, 1, 2, 3327, 3328, 0, 3328, 3328, 3328, 1, 0, 3327, 3328, 3328, 0, 3328, 0, 0, 1], +[3328, 0, 3328, 2, 1, 3328, 3328, 1, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 0, 1, 3328, 0, 0, 3328, 1, 1, 3328, 0, 3328, 1, 1, 3328, 1, 0, 0, 0, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 2, 0, 1, 2, 0, 3328, 0, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 0, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 2, 0, 0, 1, 2, 0, 2, 1, 3328, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 2, 0, 1, 3328, 2, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 3328, 1, 0, 3328, 3327, 0, 0, 3328, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3327, 1, 2, 3327, 1, 1, 0, 3328, 1, 0, 1, 3328, 0, 1, 1, 0, 3328, 1, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 3328, 1, 3328, 3328, 1, 1, 3328, 3327, 3328, 1, 0, 0, 0, 1, 0, 3327, 3328, 0, 0, 1, 0, 0, 3328, 3328, 3328, 1, 1, 2, 1, 3328, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 3328, 3327, 0, 1, 3328, 0, 1]] + +e2: [0, 2, 2, 0, 3328, 0, 1, 1, 1, 2, 1, 3328, 3328, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 3328, 1, 3327, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 3327, 3328, 0, 1, 0, 1, 0, 1, 1, 0, 3328, 0, 1, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 1, 1, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 1, 1, 2, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 3328, 0, 1, 3327, 3328, 1, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 2, 0, 0, 0, 3327, 1, 0, 1, 1, 0, 2, 0, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 0, 1, 1, 3328, 0, 1, 2, 0, 0, 1, 1, 3328, 1, 0, 0, 2, 0, 1, 1, 1, 1, 3328, 0, 1, 3328, 1, 0, 3328, 0, 0, 0, 3328, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 1, 1, 0, 0, 0, 1, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3327, 3327, 3327, 3327, 3328, 3327, 3328, 2, 1, 0] +rHat: [[2524, 3201, 2259, 2409, 1681, 275, 2303, 818, 2724, 1213, 1874, 1491, 2627, 2267, 1790, 12, 3216, 2734, 1684, 2342, 1622, 1659, 3106, 855, 2814, 529, 2170, 1324, 273, 1745, 1941, 1553, 2165, 1335, 2735, 1669, 520, 1013, 2681, 3008, 2408, 3292, 843, 1569, 2385, 2734, 1605, 1413, 443, 2593, 1163, 1239, 2014, 783, 1773, 2574, 2450, 80, 760, 3150, 2495, 763, 3235, 2456, 2033, 1064, 2718, 534, 2202, 299, 612, 1585, 2342, 1360, 1308, 3246, 1146, 788, 1211, 783, 1471, 2124, 398, 2285, 2531, 994, 3263, 2893, 1074, 695, 1524, 3080, 894, 2625, 512, 1759, 2052, 916, 1074, 608, 644, 3141, 277, 1115, 1244, 3295, 1022, 1937, 1207, 1096, 2567, 1853, 1625, 2532, 534, 1443, 2334, 2936, 3230, 1282, 542, 18, 1030, 1792, 1598, 3267, 1880, 3213, 1318, 2900, 1931, 1871, 1677, 223, 2486, 2627, 1779, 1945, 240, 2493, 70, 3217, 189, 2838, 952, 2143, 3236, 1620, 398, 1922, 479, 440, 1424, 1538, 281, 971, 668, 994, 1200, 154, 2452, 745, 474, 462, 25, 684, 2216, 2045, 2962, 1599, 1659, 2517, 460, 19, 696, 2294, 614, 2282, 2546, 3081, 2283, 1197, 675, 537, 2278, 2680, 1624, 2793, 1187, 1766, 3278, 3162, 298, 561, 3300, 210, 2649, 643, 272, 1969, 1891, 787, 568, 423, 3263, 2003, 2642, 3065, 845, 726, 1002, 2673, 211, 6, 1058, 1126, 2912, 2357, 2493, 1682, 2878, 1044, 1661, 2427, 2278, 1435, 2201, 964, 2782, 1094, 1585, 95, 996, 1635, 462, 101, 2586, 702, 1186, 1200, 2658, 785, 1751, 2850, 1082, 1995, 1832, 592, 718, 2503, 845, 471, 917, 2668, 2022, 2520], +[153, 2870, 2700, 2222, 2289, 2362, 2880, 434, 237, 1157, 1217, 1258, 529, 216, 2039, 632, 801, 1177, 846, 3283, 2928, 556, 497, 2045, 488, 2415, 270, 932, 3309, 2207, 1567, 1072, 3038, 1143, 1162, 2202, 1093, 897, 1530, 1793, 875, 1533, 344, 2089, 1670, 1517, 3316, 1918, 1807, 689, 2044, 1087, 523, 1793, 29, 3297, 2309, 3292, 2088, 1136, 2044, 2922, 570, 414, 2765, 2010, 1848, 355, 2566, 256, 2477, 2794, 990, 882, 994, 1062, 485, 1696, 550, 648, 2853, 2085, 3065, 1942, 317, 2527, 1139, 671, 1979, 437, 57, 2648, 1536, 3309, 69, 1061, 779, 2239, 388, 2325, 648, 1406, 811, 2049, 1520, 2168, 2834, 935, 2073, 2211, 2863, 412, 374, 511, 1478, 1497, 1286, 1904, 1994, 49, 2022, 2931, 2250, 2824, 3277, 198, 135, 67, 2689, 942, 1624, 10, 2475, 3012, 2342, 620, 743, 1841, 2725, 351, 2842, 2368, 3198, 2234, 902, 1513, 1034, 3104, 2285, 2153, 692, 1349, 2132, 363, 1355, 932, 334, 1150, 2968, 496, 2963, 1153, 2525, 2895, 787, 1747, 2289, 657, 511, 2167, 863, 2640, 185, 3061, 139, 3245, 2298, 285, 1725, 3324, 1094, 2624, 2431, 3195, 1644, 2997, 929, 1264, 943, 1465, 884, 3262, 687, 2971, 711, 1222, 509, 119, 1482, 1233, 174, 1969, 2405, 1928, 3170, 1896, 781, 2754, 2283, 3300, 1106, 853, 3086, 2295, 694, 2001, 1864, 1166, 1783, 623, 231, 2970, 221, 2465, 839, 3095, 1322, 2849, 589, 239, 1850, 152, 2995, 2443, 1516, 509, 2137, 2231, 2276, 3156, 1772, 3261, 105, 2271, 2845, 3071, 2791, 2548, 571, 2241, 2621, 1945, 3259, 1238, 2645, 2941]] + +BHat * rHat: [[1543, 2042, 1510, 2836, 1201, 2517, 2269, 179, 2136, 1238, 1383, 1803, 493, 2955, 3151, 3114, 1526, 2974, 2350, 4, 1260, 2779, 1774, 1509, 2880, 2684, 2612, 1779, 2610, 242, 2279, 2924, 2714, 210, 2765, 2912, 1737, 376, 2090, 3112, 2113, 1662, 891, 621, 2484, 2511, 1311, 2014, 395, 2519, 726, 796, 3074, 2714, 1336, 1669, 1272, 2131, 714, 1523, 1719, 1344, 669, 3130, 1254, 1492, 2878, 448, 2314, 336, 736, 2346, 2842, 2432, 2778, 1767, 2107, 2579, 884, 2490, 851, 2861, 1907, 1423, 116, 2521, 620, 1217, 1675, 1322, 1058, 200, 2651, 1753, 1460, 1280, 2913, 3219, 2773, 147, 738, 2656, 1455, 1688, 53, 2552, 1957, 2717, 1278, 678, 667, 294, 7, 836, 3224, 1846, 62, 574, 2446, 2639, 1747, 1911, 56, 2958, 2384, 223, 368, 2590, 2915, 541, 1855, 26, 652, 1692, 1555, 2431, 2461, 1852, 181, 2682, 1954, 591, 2169, 1335, 3209, 2526, 1862, 3108, 3004, 68, 1295, 1407, 3241, 2109, 1606, 3057, 2888, 1175, 1393, 911, 584, 89, 2305, 2683, 782, 3218, 1617, 19, 2209, 119, 2961, 141, 424, 28, 1874, 2287, 1264, 1326, 2725, 2876, 2694, 2237, 2529, 1851, 3078, 2013, 1574, 1222, 2029, 1185, 2870, 1424, 2724, 3292, 2679, 3088, 2311, 2703, 468, 356, 2705, 1483, 2729, 2718, 1225, 122, 3303, 3177, 2833, 3053, 1444, 1330, 3222, 3052, 2086, 2284, 3007, 506, 2570, 3220, 3139, 1385, 2444, 1138, 1341, 2767, 568, 1659, 784, 3218, 387, 1786, 3169, 308, 1169, 1873, 1585, 2188, 1603, 2695, 1532, 116, 3132, 2442, 1544, 1001, 835, 135, 3063, 2831, 2785, 2821, 2186, 1203, 1197, 3050], +[855, 2295, 2396, 1118, 2704, 3002, 565, 2103, 1429, 1441, 1242, 1576, 2583, 3119, 1139, 3018, 544, 1377, 2295, 3013, 2574, 1439, 821, 2014, 3087, 2157, 2434, 355, 2732, 2912, 256, 864, 593, 8, 2616, 106, 3056, 2697, 1801, 1734, 1270, 3157, 60, 1387, 1052, 1982, 2484, 3176, 2816, 1969, 628, 1358, 3153, 3256, 1461, 338, 2578, 2644, 1646, 1878, 2747, 997, 2614, 727, 1080, 133, 672, 842, 2712, 1418, 2037, 676, 1549, 1245, 484, 508, 1030, 1661, 2599, 642, 454, 186, 845, 3310, 2879, 2313, 156, 2644, 2236, 604, 783, 1517, 732, 2089, 1259, 2998, 2775, 2937, 2500, 291, 2532, 1756, 2864, 2294, 3191, 829, 177, 1517, 2062, 1439, 2751, 133, 1872, 3047, 2975, 729, 1421, 1456, 1163, 2328, 2561, 439, 439, 503, 2237, 1870, 1097, 24, 674, 220, 3318, 851, 1060, 1020, 2849, 703, 2635, 2069, 2037, 2951, 2918, 205, 1429, 2787, 1382, 2586, 405, 2514, 88, 3084, 519, 2053, 3116, 951, 2652, 1920, 296, 2216, 1285, 683, 935, 1984, 1775, 464, 1532, 3201, 2990, 1336, 726, 40, 2626, 342, 606, 1178, 1540, 3109, 2010, 2268, 939, 220, 759, 2749, 1763, 814, 2665, 1811, 850, 2335, 2294, 1206, 1667, 1102, 2159, 2394, 2172, 3289, 1505, 664, 1253, 1786, 2980, 1728, 2365, 2843, 738, 1760, 1232, 446, 3197, 2777, 257, 2884, 3119, 2519, 2060, 1728, 2968, 1082, 2682, 521, 877, 2171, 930, 1763, 2310, 1044, 236, 2134, 96, 1641, 58, 2641, 2003, 1507, 1108, 1760, 2299, 1637, 2372, 710, 1796, 769, 738, 3247, 1656, 2790, 1624, 2209, 1494, 1108, 2064, 1565, 1656, 1725, 1307, 3133]] +NTTInverse(BHat * rHat): [[1262, 1792, 1692, 1491, 741, 1006, 518, 2135, 3114, 433, 2704, 2877, 2631, 2987, 2765, 1430, 1319, 3062, 20, 2252, 1035, 1235, 1575, 706, 3139, 3047, 838, 2049, 682, 3276, 2954, 2263, 2640, 129, 3084, 2238, 1304, 288, 1791, 938, 2524, 2126, 43, 2683, 659, 669, 2697, 71, 2950, 349, 2044, 1138, 115, 3228, 257, 85, 3042, 2092, 801, 2577, 2370, 1051, 605, 604, 1421, 1188, 1290, 3270, 2004, 545, 2363, 802, 2442, 3289, 206, 1112, 2435, 2623, 552, 1088, 756, 1699, 314, 2919, 1314, 576, 186, 1908, 2657, 854, 3226, 2586, 2128, 2621, 991, 367, 1622, 52, 2528, 1782, 2638, 2568, 2330, 3101, 801, 1587, 2595, 2470, 224, 3238, 479, 2892, 2956, 42, 2270, 2117, 1652, 273, 1308, 2074, 2952, 990, 781, 1324, 2923, 1492, 126, 354, 2743, 3250, 3034, 937, 2617, 1870, 2838, 1116, 1910, 1377, 2697, 3320, 507, 366, 1472, 488, 1633, 2840, 371, 3091, 1538, 497, 347, 965, 1363, 496, 3318, 83, 2117, 2590, 2127, 2371, 308, 318, 1580, 573, 2925, 2738, 2638, 1632, 2813, 362, 2255, 1236, 632, 2049, 797, 2328, 1141, 58, 639, 2275, 2416, 2716, 387, 1532, 588, 991, 877, 756, 1199, 2816, 3048, 3322, 2798, 280, 1472, 2577, 2948, 243, 1327, 1918, 3142, 2251, 3222, 797, 91, 2406, 3323, 1063, 3207, 2337, 2741, 877, 2542, 2982, 1438, 2635, 458, 1792, 1479, 3026, 1599, 2391, 1159, 1807, 1653, 2296, 552, 419, 337, 112, 2731, 1754, 2949, 2935, 2112, 2731, 2524, 784, 2095, 2172, 1331, 2746, 3040, 116, 2295, 356, 3033, 2599, 1813, 2243, 1411, 987, 1441, 1760, 2699, 3135], +[1131, 1312, 870, 2363, 1580, 1447, 776, 544, 801, 2862, 2291, 2223, 3157, 1862, 797, 893, 2277, 2895, 2622, 2746, 289, 3319, 1456, 3194, 729, 192, 1937, 437, 1971, 2984, 2224, 3130, 707, 1873, 1863, 2758, 3168, 2702, 3031, 755, 575, 2682, 2775, 1028, 243, 598, 119, 2454, 1069, 1037, 972, 341, 1572, 1309, 2755, 2769, 2854, 2757, 2350, 800, 791, 364, 1114, 830, 361, 3321, 865, 2807, 3152, 1918, 64, 2708, 2444, 740, 54, 1363, 924, 2704, 328, 1292, 2389, 832, 1351, 780, 2281, 3137, 1463, 1004, 2911, 2868, 368, 2765, 1367, 2705, 343, 3304, 2982, 1020, 580, 1438, 166, 438, 1167, 3310, 2132, 1932, 3157, 109, 2040, 484, 685, 1462, 1023, 2813, 2326, 618, 588, 464, 697, 148, 15, 1036, 2928, 2515, 276, 153, 2448, 179, 575, 1312, 2120, 2721, 576, 569, 3042, 3229, 436, 1299, 2676, 1395, 2943, 2397, 1750, 2605, 1760, 163, 998, 3189, 2929, 733, 249, 2960, 1025, 2164, 1987, 975, 1564, 3024, 3195, 602, 1612, 2219, 1653, 3234, 457, 3211, 2897, 639, 2446, 2524, 2678, 2932, 2655, 2683, 2861, 1449, 2378, 2666, 2586, 2648, 1459, 946, 833, 2242, 2062, 847, 1570, 1476, 1796, 1620, 1702, 2770, 660, 1131, 2427, 1734, 2802, 1143, 1456, 2846, 2871, 2709, 764, 2119, 201, 402, 1536, 29, 2577, 1879, 765, 629, 3302, 1503, 2962, 2031, 3217, 2581, 1728, 769, 2535, 2356, 2431, 3158, 2645, 2164, 1248, 2736, 697, 1493, 382, 1497, 1474, 2210, 2213, 575, 3316, 2700, 3124, 2099, 1439, 276, 3056, 655, 1492, 497, 2214, 336, 648, 566, 1139, 2582, 445, 740, 2492, 3093]] +u = NTTInverse(BHat * rHat) + e1: [[1261, 1793, 1692, 1490, 741, 1006, 517, 2135, 3114, 432, 2704, 2877, 2632, 2988, 2765, 1430, 1318, 3062, 20, 2253, 1036, 1234, 1574, 707, 3139, 3047, 837, 2048, 683, 3277, 2956, 2261, 2639, 128, 3084, 2238, 1302, 288, 1791, 938, 2522, 2126, 41, 2682, 661, 670, 2699, 70, 2949, 349, 2044, 1138, 115, 3228, 257, 86, 3043, 2093, 800, 2579, 2370, 1053, 604, 603, 1421, 1189, 1290, 3271, 2003, 544, 2362, 802, 2440, 3289, 206, 1112, 2435, 2622, 551, 1088, 755, 1700, 313, 2919, 1312, 576, 184, 1907, 2657, 855, 3225, 2584, 2129, 2619, 990, 366, 1623, 51, 2527, 1782, 2637, 2569, 2332, 3102, 801, 1587, 2593, 2469, 222, 3238, 478, 2891, 2957, 41, 2272, 2119, 1651, 273, 1308, 2076, 2951, 988, 780, 1325, 2924, 1492, 127, 352, 2744, 3251, 3034, 938, 2616, 1871, 2836, 1117, 1911, 1378, 2698, 3319, 506, 365, 1472, 489, 1632, 2839, 371, 3090, 1538, 496, 348, 965, 1362, 496, 3319, 84, 2118, 2588, 2128, 2371, 307, 317, 1578, 575, 2924, 2738, 2638, 1631, 2812, 362, 2254, 1236, 630, 2047, 798, 2327, 1141, 59, 639, 2277, 2415, 2716, 387, 1533, 588, 992, 878, 756, 1201, 2815, 3048, 3323, 2799, 279, 1472, 2578, 2948, 244, 1327, 1920, 3142, 2252, 3222, 798, 93, 2407, 3324, 1063, 3207, 2338, 2741, 878, 2543, 2983, 1439, 2635, 457, 1793, 1479, 3026, 1598, 2393, 1159, 1807, 1652, 2296, 552, 418, 336, 111, 2729, 1753, 2949, 2936, 2113, 2732, 2525, 784, 2096, 2174, 1329, 2745, 3040, 115, 2294, 355, 3034, 2599, 1811, 2242, 1410, 987, 1440, 1760, 2699, 3136], +[1130, 1312, 869, 2365, 1581, 1446, 775, 545, 800, 2863, 2290, 2223, 3157, 1860, 797, 892, 2277, 2894, 2621, 2748, 288, 3318, 1456, 3193, 728, 193, 1937, 436, 1971, 2983, 2224, 3130, 708, 1872, 1863, 2758, 3167, 2703, 3032, 754, 575, 2681, 2776, 1029, 242, 599, 119, 2454, 1069, 1036, 973, 340, 1572, 1309, 2755, 2770, 2853, 2757, 2351, 801, 791, 363, 1114, 832, 361, 3322, 867, 2807, 3151, 1918, 65, 2708, 2445, 740, 55, 1361, 924, 2703, 327, 1293, 2389, 832, 1352, 779, 2279, 3137, 1463, 1003, 2912, 2867, 368, 2765, 1368, 2705, 344, 3304, 2983, 1020, 582, 1438, 166, 439, 1169, 3310, 2134, 1933, 3156, 108, 2042, 484, 685, 1462, 1024, 2812, 2326, 617, 586, 464, 699, 149, 16, 1038, 2928, 2516, 275, 155, 2448, 179, 576, 1311, 2120, 2722, 577, 569, 3041, 3229, 436, 1299, 2675, 1395, 2943, 2398, 1749, 2606, 1760, 162, 996, 3189, 2929, 732, 250, 2961, 1026, 2165, 1988, 976, 1566, 3025, 3197, 603, 1610, 2220, 1655, 3232, 458, 3212, 2897, 638, 2447, 2524, 2679, 2931, 2655, 2684, 2862, 1449, 2377, 2667, 2587, 2647, 1459, 947, 834, 2241, 2062, 847, 1570, 1477, 1797, 1620, 1701, 2770, 660, 1131, 2428, 1733, 2801, 1143, 1457, 2845, 2871, 2710, 763, 2119, 200, 403, 1536, 28, 2577, 1880, 764, 630, 3301, 1502, 2963, 2032, 3216, 2579, 1727, 770, 2535, 2356, 2431, 3159, 2645, 2162, 1247, 2736, 697, 1494, 382, 1497, 1473, 2209, 2212, 576, 3317, 2702, 3125, 2098, 1439, 276, 3057, 654, 1492, 498, 2216, 335, 647, 565, 1137, 2582, 446, 739, 2492, 3094]] + +mu: [1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0] +tHat^T * rHat: [474, 1376, 1132, 3010, 891, 2219, 2908, 2935, 1253, 763, 2954, 1511, 2031, 331, 2722, 1959, 1548, 58, 2185, 2256, 2257, 692, 2086, 1659, 3002, 627, 2156, 2421, 2648, 13, 1169, 2843, 1429, 2709, 563, 992, 2112, 2855, 1367, 92, 1669, 3044, 1221, 2938, 919, 357, 1616, 2927, 1260, 77, 2778, 2526, 2148, 1749, 446, 2201, 3125, 1803, 784, 2865, 3074, 3057, 715, 1352, 203, 1281, 3021, 2640, 2088, 1453, 2081, 1846, 375, 1467, 1925, 1486, 1653, 78, 3047, 1159, 3119, 854, 1992, 2435, 949, 2631, 2924, 1393, 2232, 3067, 2685, 3159, 875, 197, 2418, 521, 2211, 2482, 2034, 1237, 1239, 2799, 3260, 508, 1583, 2208, 853, 2224, 187, 2505, 2902, 724, 492, 1388, 3239, 948, 3229, 594, 2246, 555, 131, 734, 2142, 1682, 1735, 1488, 2786, 223, 1346, 66, 936, 2635, 688, 3028, 1727, 945, 2259, 735, 883, 2039, 260, 2687, 1643, 3310, 1819, 2805, 1954, 107, 2899, 3172, 2126, 2686, 1656, 884, 2654, 1351, 23, 1013, 1695, 694, 224, 2518, 1195, 3034, 2178, 830, 1088, 2782, 1916, 1058, 3175, 1914, 2925, 264, 2699, 1523, 1140, 1949, 407, 686, 2624, 2646, 2078, 3080, 1324, 2449, 2388, 2390, 215, 2167, 190, 178, 1342, 3051, 637, 3012, 1031, 1600, 2066, 834, 2532, 2080, 2114, 115, 2480, 1006, 57, 208, 3068, 2594, 3205, 3067, 1244, 2583, 1495, 1844, 2610, 867, 3008, 698, 702, 835, 2898, 272, 2742, 210, 1750, 3128, 73, 1308, 634, 1916, 1286, 1831, 731, 3255, 1165, 2, 1559, 2539, 1751, 1680, 200, 1957, 2809, 2302, 2968, 399, 1064, 1227, 333, 2502, 2727, 510, 2271, 2451] +NTTInverse(tHat^T * rHat): [1121, 135, 2210, 1197, 1834, 3261, 1526, 865, 695, 1984, 3092, 2833, 763, 1317, 345, 713, 1, 1484, 632, 2551, 2446, 486, 1259, 376, 3102, 2743, 2082, 1299, 2606, 1823, 2957, 177, 3043, 200, 554, 2434, 1046, 1647, 711, 2409, 1465, 835, 2470, 2840, 1326, 1173, 159, 2113, 1887, 3242, 2935, 1698, 1918, 891, 1052, 2314, 2251, 1814, 2198, 356, 305, 1548, 607, 1413, 1205, 2524, 1311, 2635, 2176, 2517, 701, 444, 61, 1423, 1152, 2509, 184, 2048, 82, 908, 3227, 2433, 2769, 2125, 1145, 1743, 1501, 1694, 1346, 828, 957, 2822, 2588, 2758, 3044, 2766, 562, 2392, 3072, 3141, 1901, 3151, 2754, 2606, 2551, 1653, 314, 2106, 477, 2685, 2792, 1697, 2961, 730, 2228, 490, 1399, 1844, 2072, 2389, 485, 2141, 1680, 184, 891, 497, 953, 552, 371, 1682, 1958, 3274, 2237, 21, 793, 2266, 643, 2849, 1821, 313, 2310, 993, 239, 1906, 222, 1087, 435, 1833, 263, 2435, 62, 2402, 3174, 1401, 2068, 310, 2415, 2268, 1628, 2928, 1861, 2409, 1332, 1716, 3083, 22, 1172, 2393, 2300, 1465, 1995, 225, 2466, 149, 1770, 3098, 642, 2861, 736, 206, 352, 1741, 1404, 1739, 402, 2576, 3163, 1120, 108, 767, 938, 2507, 2034, 1415, 2998, 634, 286, 2494, 26, 938, 3326, 1119, 3059, 1412, 1527, 2190, 1492, 387, 547, 1227, 2762, 1379, 1023, 2151, 1925, 799, 1715, 3053, 759, 714, 2460, 1592, 1654, 1584, 774, 2901, 1501, 2187, 111, 296, 2520, 923, 47, 3019, 3187, 1018, 1100, 2185, 1146, 2734, 3063, 3069, 2020, 1239, 486, 598, 1936, 1595, 2447, 623, 293, 418, 1621, 1373, 2371, 1097] +e2 + mu: [1665, 2, 2, 1665, 1664, 0, 1, 1, 1666, 1667, 1666, 3328, 1664, 0, 1664, 2, 1665, 1, 1666, 1, 1664, 3328, 1664, 1, 3327, 3328, 1666, 1666, 0, 1665, 1664, 1666, 0, 0, 1663, 3328, 0, 1, 0, 1, 1665, 1666, 1, 1665, 1664, 1665, 1, 1663, 0, 1664, 1665, 0, 1665, 1664, 1664, 2, 1666, 1, 0, 0, 1666, 1664, 1664, 3328, 3328, 1, 1666, 0, 1, 3328, 1665, 1666, 1666, 1667, 0, 0, 1664, 1665, 1, 0, 3328, 0, 1666, 1, 1666, 3328, 0, 1, 3327, 1664, 1666, 1, 0, 3328, 1664, 3327, 1665, 1666, 3328, 1665, 1666, 1665, 3328, 1664, 3327, 3328, 0, 1665, 0, 1665, 1665, 1666, 1664, 3328, 1664, 3328, 1666, 1, 0, 1666, 1664, 0, 1664, 3328, 2, 1664, 3328, 0, 3328, 2, 1665, 0, 1665, 3327, 1, 0, 1, 1, 0, 2, 1665, 1, 0, 1665, 1664, 1665, 0, 1, 1664, 1, 1666, 0, 1665, 0, 0, 3328, 0, 1666, 1, 0, 0, 1666, 0, 0, 3328, 1666, 3328, 1664, 1664, 1664, 1665, 0, 1666, 0, 0, 0, 1, 1666, 1664, 1665, 0, 1666, 1666, 3328, 1665, 1666, 2, 0, 1665, 1, 1, 1664, 1666, 1665, 0, 1667, 1665, 1, 1666, 1, 1, 3328, 1665, 1, 1664, 1, 1665, 3328, 0, 0, 0, 3328, 1, 1663, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 1667, 1665, 1664, 0, 1664, 3327, 1665, 3328, 1666, 1666, 0, 1665, 0, 1666, 0, 1664, 1666, 1665, 3328, 3328, 1666, 3328, 0, 0, 1663, 3327, 1663, 3327, 1664, 3327, 3328, 1667, 1666, 0] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [2786, 137, 2212, 2862, 169, 3261, 1527, 866, 2361, 322, 1429, 2832, 2427, 1317, 2009, 715, 1666, 1485, 2298, 2552, 781, 485, 2923, 377, 3100, 2742, 419, 2965, 2606, 159, 1292, 1843, 3043, 200, 2217, 2433, 1046, 1648, 711, 2410, 3130, 2501, 2471, 1176, 2990, 2838, 160, 447, 1887, 1577, 1271, 1698, 254, 2555, 2716, 2316, 588, 1815, 2198, 356, 1971, 3212, 2271, 1412, 1204, 2525, 2977, 2635, 2177, 2516, 2366, 2110, 1727, 3090, 1152, 2509, 1848, 384, 83, 908, 3226, 2433, 1106, 2126, 2811, 1742, 1501, 1695, 1344, 2492, 2623, 2823, 2588, 2757, 1379, 2764, 2227, 729, 3071, 1477, 238, 1487, 2753, 941, 2549, 1652, 314, 442, 477, 1021, 1128, 34, 1296, 729, 563, 489, 3065, 1845, 2072, 726, 2149, 2141, 15, 183, 893, 2161, 952, 552, 370, 1684, 294, 3274, 573, 19, 794, 2266, 644, 2850, 1821, 315, 646, 994, 239, 242, 1886, 2752, 435, 1834, 1927, 2436, 1728, 2402, 1510, 1401, 2068, 309, 2415, 605, 1629, 2928, 1861, 746, 1332, 1716, 3082, 1688, 1171, 728, 635, 3129, 331, 225, 803, 149, 1770, 3098, 643, 1198, 2400, 1871, 352, 78, 3070, 1738, 2067, 913, 3165, 1120, 1773, 768, 939, 842, 371, 3080, 2998, 2301, 1951, 2495, 1692, 939, 3327, 1118, 1395, 1413, 3191, 2191, 3157, 386, 547, 1227, 2762, 1378, 1024, 485, 1926, 798, 1714, 3052, 760, 714, 2459, 1592, 3321, 3249, 2438, 2901, 3165, 2185, 1776, 295, 857, 2589, 47, 1355, 3187, 2684, 1100, 520, 2812, 1070, 3062, 3068, 357, 1238, 486, 598, 270, 1593, 781, 621, 1957, 416, 1620, 3040, 708, 1097] + +KBar: 59083ED864711F4AE886A8F055932D84294CEAB01B51A0F12ABBA30EB9809715 +cPrime: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 + +Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt new file mode 100644 index 000000000..b50892fcb --- /dev/null +++ b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt @@ -0,0 +1,71 @@ +Decapsulation -- ML-KEM-768 +dk: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C1234E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C03010B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF714EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC +c: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 + +dk_pke: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C12 +ek_pke: 34E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C0301 +h: 0B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF7 +z: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC + +c1: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C1 +c2: 10FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 +u: [[2389, 2006, 1232, 556, 322, 146, 2919, 2048, 722, 1521, 1713, 2780, 2854, 1622, 2263, 3306, 1642, 2614, 2181, 374, 458, 3153, 1996, 3049, 1437, 780, 803, 2809, 1219, 2965, 569, 2799, 1739, 559, 1795, 397, 1778, 1112, 172, 1531, 406, 943, 770, 1284, 793, 2305, 2906, 3059, 1343, 2955, 1791, 2051, 0, 2295, 2936, 231, 2542, 2360, 400, 2624, 845, 1476, 2393, 2263, 2510, 1515, 1765, 1713, 2354, 878, 2630, 1294, 969, 1378, 481, 1265, 504, 923, 1112, 436, 1443, 1476, 478, 858, 777, 715, 2337, 679, 2315, 1196, 894, 3101, 2536, 2214, 940, 2731, 393, 1222, 2389, 741, 3267, 218, 3306, 1821, 1788, 237, 3075, 478, 150, 2789, 2237, 634, 2897, 1876, 325, 2337, 478, 3257, 2022, 3228, 2237, 3179, 2113, 1554, 1434, 2354, 1021, 3192, 494, 562, 3053, 2298, 257, 2607, 33, 748, 2926, 1661, 1830, 3313, 2874, 1443, 1177, 2770, 1824, 686, 2116, 501, 806, 1759, 2337, 2754, 536, 2786, 231, 1925, 2633, 3189, 46, 1960, 2679, 2760, 0, 2207, 725, 676, 1232, 1131, 927, 878, 2055, 1827, 1635, 1625, 888, 120, 1687, 650, 296, 2055, 855, 2568, 211, 2116, 3267, 124, 1489, 3040, 1336, 1229, 2438, 1219, 2263, 1837, 705, 3066, 286, 1057, 1427, 2204, 1219, 163, 2965, 2695, 969, 1037, 2958, 81, 1339, 2146, 1674, 120, 1749, 2750, 68, 221, 1567, 36, 2334, 2305, 1057, 3069, 1782, 2107, 2562, 1619, 631, 1684, 267, 1808, 1424, 2627, 829, 1109, 979, 2357, 2737, 2578, 679, 3303, 1635, 1551, 306, 1037, 777, 1200, 2939, 1352, 1486, 1525, 1382, 2458, 2224, 1281, 2155, 572], +[663, 2877, 1505, 1456, 1180, 1349, 1050, 273, 2984, 1964, 1242, 2324, 1333, 3157, 1830, 705, 992, 1489, 1814, 397, 2081, 1294, 793, 507, 2562, 598, 1346, 445, 2055, 631, 153, 1138, 666, 1057, 2318, 2724, 1560, 20, 1847, 1837, 2461, 1151, 3176, 2224, 2520, 1232, 400, 3014, 2113, 3296, 1860, 328, 1944, 2669, 705, 2090, 1196, 1096, 2110, 2461, 1343, 429, 1021, 982, 2337, 640, 3134, 1996, 1892, 1769, 894, 150, 101, 3007, 3075, 787, 2507, 3290, 1070, 1206, 1648, 2188, 2533, 2055, 966, 2467, 1486, 2773, 1144, 3017, 393, 543, 819, 2428, 1534, 1489, 1970, 2129, 3251, 2893, 1908, 1730, 2110, 1320, 2958, 1638, 101, 2295, 670, 2581, 3079, 1502, 1005, 1622, 2461, 2949, 1769, 3179, 1326, 1508, 2724, 380, 634, 2851, 1625, 159, 666, 2659, 211, 1866, 1196, 2656, 1317, 2380, 3118, 1882, 312, 1534, 1765, 1622, 2952, 3313, 2029, 962, 3326, 728, 1034, 2308, 2806, 1076, 497, 2100, 189, 2695, 2949, 2929, 1183, 1427, 1866, 1261, 3192, 2750, 494, 49, 595, 218, 1873, 683, 914, 166, 943, 276, 1700, 1625, 1326, 3199, 2598, 3316, 523, 2019, 1599, 2350, 770, 2520, 3303, 3114, 3075, 3170, 2903, 2285, 673, 1655, 767, 3049, 2380, 1278, 1180, 413, 2425, 3007, 858, 176, 2087, 263, 3023, 1856, 289, 488, 1148, 2155, 481, 2480, 312, 2402, 169, 2224, 1606, 744, 2220, 1209, 2259, 1307, 914, 2003, 1242, 2097, 2994, 2038, 2370, 1778, 2211, 3131, 1349, 1674, 751, 1612, 1242, 2393, 741, 1775, 585, 406, 1658, 2149, 1070, 120, 2331, 2428, 3183, 1024, 2185, 953, 2728, 1860, 3010, 3010], +[221, 862, 471, 2399, 1684, 1037, 81, 3004, 2949, 1804, 2120, 1700, 2422, 172, 2539, 198, 371, 10, 1873, 3004, 1541, 1307, 1456, 1209, 1743, 133, 2711, 55, 33, 153, 156, 416, 46, 1213, 1840, 299, 2988, 2198, 2393, 546, 1369, 1248, 465, 1278, 1551, 130, 1050, 2198, 1349, 543, 2507, 2214, 2133, 2389, 3322, 2848, 1661, 1281, 3, 2900, 2598, 1957, 2090, 979, 2552, 1430, 2890, 176, 1268, 1034, 936, 3023, 972, 2087, 1960, 1248, 400, 1674, 2451, 2448, 855, 416, 2315, 1541, 813, 1141, 1378, 2282, 3257, 315, 2185, 3085, 2607, 156, 1372, 510, 1278, 962, 3007, 3290, 2955, 741, 114, 2838, 1427, 679, 1957, 1050, 3248, 2669, 75, 2159, 2611, 2139, 3215, 1395, 1408, 1999, 1573, 1317, 312, 1869, 3010, 1443, 2298, 159, 462, 3088, 1144, 614, 2910, 263, 1736, 2477, 1934, 2480, 2728, 865, 228, 1873, 1183, 1573, 1554, 2003, 2100, 715, 881, 111, 1008, 2357, 3205, 185, 1476, 3105, 361, 1567, 2172, 2471, 1769, 3053, 2133, 2659, 172, 270, 2568, 1034, 579, 2285, 2146, 1008, 2084, 3306, 2838, 2789, 2796, 478, 1235, 1651, 575, 3040, 166, 1300, 543, 1362, 2152, 1391, 1713, 293, 3072, 1655, 2900, 520, 416, 1762, 1278, 2311, 1330, 2591, 2256, 130, 1359, 2968, 1427, 1027, 387, 901, 1235, 1408, 744, 1330, 1057, 3043, 901, 3069, 2113, 2289, 2978, 397, 3127, 1590, 1229, 676, 1099, 1541, 2324, 1840, 738, 2991, 2936, 728, 2042, 624, 2227, 2988, 3313, 1057, 2360, 3274, 2520, 553, 3079, 98, 514, 1388, 3056, 2624, 2975, 133, 910, 2042, 1993, 2428, 1437, 2588, 462, 2516]] +v: [0, 208, 2705, 3121, 832, 1665, 624, 2497, 1248, 624, 3121, 2705, 624, 1248, 3121, 0, 1456, 416, 2497, 208, 1456, 3121, 624, 1873, 1665, 416, 1248, 2289, 1665, 2497, 1873, 1456, 3121, 2705, 2497, 1456, 2913, 2705, 3121, 0, 0, 1456, 208, 1456, 416, 416, 0, 416, 208, 2289, 2289, 3121, 1873, 2289, 2497, 2081, 832, 2289, 416, 1665, 1665, 832, 1873, 2705, 3121, 208, 2913, 0, 2289, 416, 2913, 1248, 2289, 624, 832, 2913, 2497, 0, 2289, 416, 416, 416, 2913, 208, 416, 1248, 2913, 1248, 2913, 1456, 624, 624, 2705, 0, 2705, 1873, 624, 1665, 2497, 2497, 1248, 0, 1665, 1248, 1456, 3121, 0, 624, 1040, 1665, 208, 1873, 208, 2913, 2497, 832, 2705, 1456, 416, 1456, 1665, 2289, 208, 832, 1248, 2081, 0, 3121, 3121, 1040, 3121, 624, 2497, 2705, 624, 208, 2913, 1873, 2497, 2913, 208, 2497, 624, 1040, 1456, 1248, 1040, 1248, 1040, 1248, 2289, 0, 1040, 1040, 1873, 2081, 2913, 2497, 1248, 2497, 2289, 2289, 1040, 3121, 2497, 832, 2913, 2497, 1040, 2497, 624, 2497, 2497, 2081, 2081, 1873, 2913, 0, 1873, 624, 832, 3121, 3121, 1665, 624, 416, 2289, 1456, 832, 2705, 1248, 2497, 0, 1248, 2289, 2497, 2081, 208, 2705, 1665, 1040, 416, 2289, 0, 1248, 2289, 1665, 2497, 0, 2497, 0, 208, 2913, 3121, 624, 2497, 2497, 832, 624, 2497, 1873, 2705, 1040, 208, 1873, 1873, 1456, 416, 2497, 208, 1040, 1456, 208, 624, 624, 624, 3121, 0, 416, 208, 624, 2081, 832, 2913, 3121, 832, 3121, 2081, 1873, 2705, 1040, 0, 416, 2705, 1248, 2497] +sHat: [[1588, 2133, 1947, 127, 742, 2759, 2929, 2018, 1392, 1071, 1141, 1431, 629, 2944, 2077, 2366, 540, 2713, 704, 685, 1934, 1841, 1995, 1144, 1314, 2608, 540, 515, 1131, 3018, 756, 1426, 3155, 2867, 3233, 41, 1536, 40, 1604, 3130, 758, 393, 69, 2571, 88, 389, 890, 260, 1459, 557, 2618, 2570, 3015, 2489, 3260, 3263, 1343, 295, 2836, 206, 506, 2604, 2206, 2125, 2698, 1173, 1210, 2984, 1640, 2926, 1525, 2000, 329, 83, 2303, 2707, 3060, 1252, 3199, 3046, 381, 1602, 1800, 2895, 1414, 2848, 624, 1339, 432, 2640, 3136, 193, 1937, 3266, 2840, 437, 2316, 703, 2969, 2575, 2777, 661, 1887, 856, 533, 197, 646, 435, 1676, 1737, 2691, 2743, 564, 3067, 762, 2603, 164, 435, 2869, 614, 1229, 1388, 568, 2304, 1819, 1572, 1266, 648, 2074, 739, 1631, 695, 2031, 2900, 2073, 426, 1552, 1400, 2539, 1582, 702, 177, 863, 2971, 1005, 2243, 1999, 2868, 2464, 1315, 1697, 822, 1782, 2910, 1588, 2926, 1341, 1792, 2670, 255, 148, 940, 1323, 1704, 485, 1061, 47, 281, 2290, 2469, 2369, 1707, 556, 317, 2502, 2489, 2313, 510, 1012, 3250, 2576, 422, 2962, 2112, 440, 1121, 1940, 345, 834, 2434, 127, 1472, 2162, 2815, 2872, 152, 780, 2550, 1932, 1271, 709, 2378, 2759, 532, 300, 2697, 620, 2211, 2795, 1374, 1162, 1019, 1931, 856, 2612, 751, 1785, 1742, 3311, 1315, 1997, 420, 951, 1880, 1511, 2964, 2768, 1626, 2002, 2226, 1426, 2791, 2131, 2836, 1644, 687, 1736, 1392, 1076, 3038, 2167, 203, 2511, 1896, 2821, 1902, 1524, 2808, 2954, 1120, 1893, 2693, 572, 2336, 2508, 63], +[2798, 2647, 2940, 1299, 1709, 22, 2185, 1563, 825, 2062, 2882, 789, 1705, 2194, 1247, 786, 1983, 2922, 2974, 378, 1319, 436, 2601, 2237, 2187, 1311, 3297, 731, 826, 310, 2380, 1642, 1852, 2789, 2246, 1481, 1515, 1757, 1200, 1972, 2835, 22, 1914, 1145, 865, 3180, 893, 1907, 2351, 1609, 997, 1236, 1380, 67, 2611, 770, 2343, 1186, 3079, 1432, 668, 2331, 99, 2497, 1507, 1739, 2278, 2889, 1491, 2543, 1577, 2581, 2800, 1203, 1429, 2357, 754, 1117, 2687, 2799, 1174, 2562, 113, 1105, 1459, 1327, 658, 207, 201, 3293, 2681, 529, 2905, 247, 2348, 2061, 499, 245, 523, 912, 2, 2, 1495, 1411, 1646, 2686, 2623, 979, 1739, 3037, 1306, 3208, 613, 2737, 1523, 460, 2784, 48, 1585, 1343, 1632, 708, 770, 658, 2649, 2071, 2499, 767, 2497, 903, 969, 2289, 321, 897, 2425, 3111, 911, 832, 505, 400, 802, 1857, 218, 1115, 2962, 1177, 2788, 2403, 582, 1082, 1780, 1236, 431, 424, 1712, 768, 2503, 1557, 1212, 2813, 2397, 281, 1882, 1171, 2841, 2689, 509, 3300, 3083, 2195, 1446, 2889, 1467, 104, 847, 2813, 2453, 2892, 174, 2478, 199, 3275, 3177, 2622, 106, 1200, 1644, 1581, 934, 637, 1429, 992, 240, 938, 3034, 2435, 959, 2894, 2410, 1831, 2622, 1107, 3243, 787, 1685, 1680, 1965, 119, 544, 3270, 59, 1237, 1009, 1267, 214, 2537, 2476, 343, 1521, 2781, 790, 2550, 1375, 1611, 1089, 1350, 293, 841, 1493, 2182, 812, 2075, 1483, 2234, 2166, 120, 1383, 171, 2241, 1403, 1941, 621, 900, 2867, 881, 226, 2004, 764, 2969, 426, 1489, 2398, 2468, 3317, 778, 834], +[1194, 1585, 1197, 3038, 1225, 2402, 2053, 387, 2903, 2443, 2825, 1045, 2323, 1122, 1226, 1394, 2783, 2330, 2121, 677, 2465, 633, 1718, 2195, 738, 2473, 164, 625, 1214, 2351, 25, 2983, 1492, 1354, 2448, 429, 1470, 466, 1519, 1316, 2250, 56, 1601, 2560, 1068, 2830, 2136, 2911, 1174, 2914, 1662, 944, 2289, 2823, 1045, 654, 286, 331, 3234, 587, 1108, 937, 1611, 1140, 3090, 1058, 2763, 1262, 1428, 1265, 1235, 2942, 1681, 671, 2059, 663, 148, 1666, 1619, 1805, 1536, 826, 243, 2690, 1187, 3239, 93, 900, 2809, 1068, 3140, 2829, 2606, 2121, 2017, 3215, 424, 306, 555, 2963, 168, 1364, 1147, 1923, 1286, 774, 1047, 2978, 1574, 1664, 1053, 1513, 1844, 3325, 2964, 2193, 2659, 2588, 2560, 1169, 2843, 744, 1859, 229, 2458, 1483, 1802, 3157, 3, 2751, 2966, 1152, 86, 605, 1045, 1815, 1295, 3262, 583, 2116, 252, 1169, 2730, 1970, 2307, 1190, 1564, 999, 2713, 3181, 2989, 2688, 2819, 312, 1162, 1078, 1070, 2323, 22, 794, 2024, 2348, 1912, 1297, 1978, 964, 1469, 1407, 32, 1440, 2749, 314, 469, 2080, 1776, 830, 2935, 2822, 3175, 1029, 2887, 2770, 1567, 1833, 374, 2105, 3280, 3212, 3088, 603, 1960, 805, 1568, 2549, 1130, 2988, 2754, 306, 2132, 2877, 1388, 2048, 1488, 670, 670, 2502, 3152, 3190, 1381, 1125, 2047, 2066, 1804, 2905, 27, 1386, 2235, 1775, 3033, 1996, 778, 2037, 114, 3325, 666, 3117, 561, 2542, 1471, 1013, 3169, 2995, 789, 1835, 26, 114, 126, 1525, 211, 3257, 1561, 1167, 138, 2001, 3310, 2753, 2904, 1802, 2612, 1691, 3, 528, 1429, 2873, 3177, 293]] +w: [68, 163, 1585, 16, 1716, 11, 3326, 51, 52, 3252, 1770, 1636, 3287, 1786, 1720, 1554, 20, 1550, 1709, 1771, 1697, 12, 1754, 20, 3227, 1698, 42, 1763, 1637, 1607, 1608, 1707, 1790, 1695, 59, 10, 3285, 3274, 1590, 1631, 1625, 9, 3219, 146, 1584, 1612, 55, 1718, 1623, 1815, 1771, 20, 1792, 3222, 78, 1808, 1557, 1786, 3313, 1782, 3233, 1678, 1637, 3310, 1608, 106, 5, 1563, 92, 1584, 3202, 135, 9, 1537, 3282, 1691, 1705, 3312, 1623, 1719, 1595, 1623, 3267, 1613, 1734, 3273, 1564, 1710, 9, 19, 88, 50, 66, 1760, 1615, 27, 1707, 1603, 117, 1602, 1545, 3273, 1559, 3328, 4, 3277, 1698, 32, 1646, 75, 3299, 105, 1651, 1636, 154, 46, 1661, 8, 1742, 1730, 1753, 1537, 36, 3290, 1712, 1806, 1512, 45, 1693, 1571, 9, 1733, 139, 1579, 133, 32, 1555, 29, 1657, 1708, 1720, 3209, 1668, 57, 1611, 39, 3300, 96, 3225, 1615, 1544, 1601, 53, 3301, 26, 1750, 1722, 3231, 78, 3309, 1519, 3323, 53, 1727, 1542, 70, 1593, 127, 1723, 90, 1689, 3263, 16, 1580, 1852, 34, 3256, 1790, 1665, 53, 1649, 52, 13, 3326, 1683, 3276, 1678, 48, 0, 8, 53, 1651, 1676, 3311, 3302, 3247, 3299, 3224, 121, 1613, 1644, 1479, 1744, 3277, 1812, 3319, 3202, 3308, 3319, 1580, 65, 122, 3220, 1629, 1638, 1696, 1643, 1560, 83, 180, 68, 1634, 1549, 3293, 15, 72, 1537, 1598, 3259, 3141, 1620, 3253, 49, 1759, 1718, 1753, 3308, 3210, 1592, 108, 30, 119, 55, 8, 24, 1608, 10, 1692, 3276, 3280, 1788, 1539, 3261, 84, 1703, 1659] +mPrime: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC + +KPrime: BD7256B242F404869D662F80BF677A16C0C6FC1568CCA5B64582A01A6A142D71 +rPrime: 5AE7C624837B9165CB3469F5F573F94FB3B1DE20C97F718135CEA8A97A81DC4D + +tHat: [[2100, 2910, 894, 3203, 211, 1162, 2629, 1556, 877, 3231, 2741, 1782, 754, 1696, 2041, 1833, 2399, 1372, 1145, 944, 942, 2457, 2486, 215, 2915, 1271, 168, 2818, 690, 3245, 1974, 2976, 1014, 1834, 3187, 788, 238, 608, 243, 1900, 2769, 2276, 1598, 1710, 2989, 3000, 3020, 2526, 3271, 1968, 107, 3003, 630, 12, 450, 1539, 28, 2170, 2110, 1820, 2831, 388, 725, 2311, 944, 1827, 124, 486, 475, 3111, 176, 3119, 1309, 997, 2574, 1271, 375, 1671, 1849, 3212, 2628, 3000, 1695, 2646, 2638, 1208, 1800, 2522, 2458, 707, 1953, 2, 2097, 2227, 1709, 533, 638, 2787, 1269, 277, 2455, 100, 1442, 3076, 519, 2865, 459, 379, 1286, 408, 575, 1454, 2765, 3095, 573, 115, 2111, 1939, 1957, 2109, 117, 95, 1836, 2335, 2677, 2891, 621, 882, 1797, 3033, 2054, 2535, 2013, 272, 716, 1076, 2640, 39, 2740, 2783, 699, 598, 2316, 2428, 942, 624, 174, 219, 747, 2325, 1682, 1210, 1552, 2697, 2411, 1649, 2893, 160, 3312, 1189, 1966, 2241, 2604, 1609, 2370, 1262, 1488, 1546, 307, 490, 1764, 802, 1216, 2731, 1105, 541, 2384, 247, 1601, 688, 1399, 962, 2597, 1243, 2533, 1893, 2591, 2304, 774, 2200, 2930, 3224, 1911, 207, 3319, 3323, 2237, 984, 3313, 1939, 757, 3135, 579, 3249, 2589, 1365, 3287, 440, 36, 2402, 168, 1436, 2876, 639, 1619, 180, 2771, 2976, 3120, 1862, 2327, 2387, 884, 2136, 3024, 864, 1648, 318, 2084, 2013, 488, 1098, 3152, 1181, 2103, 1910, 127, 3311, 104, 2353, 378, 295, 1577, 421, 606, 3007, 1641, 264, 116, 190, 729, 1635, 2276, 1579, 361, 2286], +[3306, 2722, 203, 2582, 1589, 872, 2765, 1991, 2982, 1675, 33, 579, 1047, 2840, 2561, 1470, 3325, 934, 1287, 2145, 289, 1142, 1590, 2463, 2669, 1253, 1556, 937, 2066, 877, 997, 2563, 456, 729, 439, 366, 1157, 2650, 573, 2136, 2032, 1288, 1759, 1759, 3234, 567, 1465, 1063, 3038, 2463, 228, 2759, 1749, 1150, 201, 3252, 87, 435, 3139, 1004, 1640, 1262, 40, 1659, 2416, 1510, 2550, 608, 1630, 3168, 527, 3250, 2183, 1173, 3046, 2738, 3208, 268, 1772, 559, 2499, 3255, 340, 991, 2955, 2754, 2960, 2466, 2992, 2866, 1072, 1451, 1992, 1051, 1218, 1958, 3012, 1461, 2804, 1752, 63, 926, 3224, 3222, 1600, 172, 1684, 1742, 1270, 1332, 1552, 2641, 1063, 1282, 898, 324, 1717, 678, 10, 2473, 1215, 1787, 3026, 2791, 3027, 2698, 805, 1561, 2137, 2086, 2992, 680, 967, 914, 3120, 895, 902, 2279, 2258, 495, 2278, 3139, 2908, 2499, 2557, 1297, 3035, 3269, 1300, 3108, 705, 1494, 1367, 1981, 83, 1209, 2666, 2913, 2177, 117, 2133, 2558, 1959, 1881, 1958, 3285, 1122, 1067, 1123, 3008, 268, 487, 1832, 2592, 2249, 1326, 1236, 859, 1694, 2910, 1598, 1876, 1013, 3218, 519, 1400, 1837, 876, 1167, 11, 2243, 3186, 2063, 1132, 2485, 2222, 67, 2995, 1974, 3026, 1239, 2888, 218, 2847, 1526, 2372, 585, 2884, 1730, 555, 2908, 792, 2537, 1352, 597, 2978, 111, 913, 1120, 3251, 1820, 1114, 2199, 1095, 213, 2199, 332, 422, 2134, 2672, 343, 1748, 1389, 2462, 867, 636, 1176, 2364, 751, 621, 844, 402, 2320, 2622, 0, 3241, 891, 2117, 498, 2947, 1691, 2218, 291, 2312, 2799, 673], +[2883, 28, 1136, 1795, 160, 1567, 1959, 896, 2964, 3284, 155, 71, 2034, 2420, 2990, 2188, 2481, 448, 254, 1437, 1035, 336, 3141, 915, 3254, 1118, 950, 86, 2810, 1726, 1109, 2938, 1430, 87, 2302, 1571, 1954, 2774, 191, 1470, 401, 2568, 357, 2192, 307, 1625, 2574, 2634, 422, 1677, 1107, 2339, 2422, 2287, 1039, 3284, 1650, 342, 3270, 353, 113, 2371, 3032, 154, 3132, 1818, 242, 1000, 2429, 259, 1438, 15, 3228, 713, 2010, 2943, 934, 1963, 1075, 2442, 1153, 3007, 605, 1111, 3233, 1284, 2114, 194, 2166, 1258, 1123, 2527, 269, 2518, 1862, 573, 1978, 1146, 2723, 2315, 2982, 1599, 2682, 473, 704, 1666, 3325, 69, 2109, 3249, 673, 2213, 712, 606, 2497, 575, 3281, 2124, 2034, 2286, 3109, 973, 974, 1337, 2761, 3117, 685, 1703, 1657, 1183, 64, 472, 213, 487, 3323, 2957, 2058, 2601, 857, 3289, 127, 1432, 19, 2914, 561, 1815, 1926, 2964, 2422, 2218, 1655, 2145, 752, 161, 2821, 195, 1092, 1543, 1347, 2192, 3087, 2814, 1827, 1492, 476, 444, 2752, 2504, 2399, 677, 2747, 337, 317, 2955, 131, 1292, 1662, 2299, 120, 2590, 2893, 3070, 1774, 540, 2785, 1680, 2742, 2813, 426, 1721, 1363, 825, 2277, 0, 380, 2180, 1486, 3200, 354, 29, 3028, 477, 1267, 1292, 3115, 2216, 1505, 1860, 904, 1770, 1709, 1618, 3263, 2874, 1569, 39, 2945, 2509, 3239, 1890, 1556, 835, 4, 2698, 3306, 91, 906, 2610, 1862, 1528, 2985, 2838, 650, 3276, 1008, 2953, 1448, 1653, 312, 3297, 3284, 3047, 2078, 478, 44, 2031, 3139, 1167, 2418, 128, 1107, 791, 1544, 1528, 1282, 1564]] + +bHat = aHat^T: [[[504, 2561, 2088, 2399, 2069, 274, 1069, 2208, 2645, 1765, 1640, 521, 787, 2050, 2822, 2997, 781, 1188, 2933, 1171, 2759, 2455, 950, 891, 348, 2834, 1385, 700, 1585, 1576, 576, 291, 1843, 662, 3091, 3142, 1490, 1488, 281, 1242, 1900, 2462, 444, 691, 3262, 184, 1193, 2680, 550, 1625, 2801, 1621, 3120, 1201, 194, 326, 2485, 1941, 1407, 959, 2886, 2526, 1406, 1385, 2114, 3007, 2940, 1188, 2724, 2563, 3055, 2818, 327, 564, 63, 1667, 3065, 1932, 5, 1290, 3017, 331, 419, 224, 2851, 2633, 3076, 2962, 2068, 2099, 1693, 1130, 2106, 1270, 441, 1013, 1765, 458, 2772, 2202, 1835, 1049, 2259, 2454, 2650, 1365, 1627, 2967, 3093, 1882, 2911, 510, 2129, 642, 2237, 2085, 2050, 864, 2870, 1072, 2052, 2223, 2191, 2426, 957, 447, 1237, 2365, 2069, 1161, 1049, 936, 1374, 3132, 608, 1800, 3108, 2674, 3265, 1940, 426, 771, 1148, 328, 2337, 2425, 117, 3062, 664, 653, 1628, 2268, 2932, 365, 1186, 3233, 3026, 2257, 2522, 1096, 3141, 1785, 2330, 1394, 717, 1691, 38, 1601, 2433, 2305, 538, 673, 3275, 421, 2579, 405, 892, 1534, 1396, 1827, 648, 1721, 2241, 698, 265, 43, 2673, 1673, 2438, 1445, 3143, 2364, 561, 831, 1097, 2447, 473, 2584, 518, 2594, 1930, 160, 3103, 523, 818, 1547, 2342, 1909, 220, 405, 2025, 1972, 1353, 2370, 1261, 2552, 736, 1993, 514, 2503, 97, 2700, 1505, 619, 3128, 2609, 2608, 2280, 826, 1528, 3181, 1835, 1107, 739, 1033, 587, 512, 828, 2049, 588, 2052, 1067, 2020, 3175, 2234, 1586, 2374, 1862, 1807, 1121, 2289, 760, 1079, 1776, 657, 1874], +[1435, 2714, 2093, 2896, 517, 494, 2247, 2648, 2828, 2715, 1739, 878, 392, 376, 1827, 2132, 2803, 1460, 2753, 59, 1064, 724, 934, 1041, 1642, 3064, 1629, 1249, 1891, 2787, 2524, 2964, 271, 2785, 3317, 3054, 3050, 1946, 149, 2757, 2099, 3066, 2070, 126, 3059, 1287, 817, 663, 846, 1671, 669, 1630, 230, 134, 1851, 956, 3227, 144, 2684, 1896, 1365, 793, 453, 804, 895, 1377, 1305, 3144, 614, 414, 2549, 1391, 511, 565, 2795, 1321, 1259, 1745, 2527, 508, 1770, 1839, 1316, 2127, 1302, 1044, 2759, 2112, 669, 453, 2185, 349, 2549, 3017, 3173, 1789, 2817, 2493, 658, 2102, 297, 2025, 816, 1083, 970, 372, 1964, 906, 823, 2432, 2817, 2965, 2882, 2338, 3005, 2385, 1198, 521, 2632, 1714, 159, 2135, 31, 3278, 1230, 1100, 479, 1492, 642, 111, 1104, 939, 901, 2950, 1227, 2008, 873, 1790, 1779, 1706, 781, 1017, 1747, 2670, 1125, 2139, 1174, 726, 1934, 3180, 1299, 988, 473, 266, 2481, 2115, 1483, 3244, 499, 1211, 492, 1495, 3301, 1054, 3261, 3169, 560, 2466, 2040, 1180, 1126, 1371, 342, 917, 215, 2825, 1900, 1015, 3253, 1106, 1878, 3052, 2792, 1743, 152, 1733, 2732, 1031, 1338, 2118, 285, 1338, 1878, 3325, 2550, 219, 2947, 247, 1082, 1126, 2652, 2538, 2871, 2715, 2810, 2969, 3131, 258, 844, 578, 3197, 3069, 2519, 2894, 2860, 1627, 1428, 1206, 628, 2543, 335, 1101, 227, 2985, 2607, 2666, 2251, 2018, 613, 1187, 3057, 1355, 2599, 2119, 960, 2002, 343, 453, 3082, 964, 1855, 3167, 1176, 1334, 2813, 2580, 698, 2624, 1672, 1906, 1836, 984, 2838, 1044, 1528, 479], +[173, 872, 2311, 901, 2233, 305, 1614, 153, 2648, 1301, 1372, 1173, 1956, 1923, 1074, 1787, 827, 802, 2238, 1507, 360, 2287, 530, 52, 1078, 2726, 3283, 323, 995, 1454, 38, 1260, 3029, 1150, 1296, 605, 307, 1490, 1189, 1163, 2788, 1006, 311, 1585, 712, 2709, 2767, 1200, 2872, 1181, 2113, 681, 21, 240, 1383, 2755, 2439, 2202, 1396, 148, 2791, 1213, 431, 3074, 1902, 655, 2953, 2758, 1289, 2689, 1210, 2897, 562, 1719, 1022, 1480, 3242, 1193, 2429, 1038, 596, 1432, 515, 12, 1484, 2369, 3012, 1330, 1834, 279, 1301, 421, 2313, 2182, 139, 1734, 1923, 2672, 2362, 200, 1017, 843, 596, 724, 346, 894, 2515, 1914, 3208, 1104, 2891, 381, 751, 321, 2038, 2740, 2049, 315, 3109, 672, 1259, 2627, 2576, 2376, 3229, 185, 19, 2373, 2249, 311, 720, 2180, 1752, 1684, 2874, 1873, 242, 1445, 1156, 826, 2464, 2821, 1976, 340, 1973, 3163, 2666, 3216, 343, 1948, 1672, 2281, 3079, 1685, 1856, 1883, 714, 758, 223, 2844, 2117, 1899, 2167, 806, 2296, 72, 160, 1508, 2985, 2758, 671, 638, 2766, 89, 2292, 2447, 1963, 448, 1878, 1446, 2991, 2114, 405, 2676, 2944, 1891, 1392, 1271, 1018, 714, 166, 2714, 1782, 2490, 2039, 1542, 2674, 1223, 1699, 2470, 67, 2778, 2201, 1330, 607, 116, 1375, 2339, 2912, 1032, 2632, 1539, 1349, 357, 288, 877, 962, 2331, 2148, 1493, 797, 2809, 1334, 1087, 1515, 228, 494, 1690, 2989, 2906, 2594, 576, 146, 1646, 451, 2629, 1249, 459, 990, 1058, 2371, 1143, 711, 63, 2602, 208, 961, 1872, 2135, 1727, 1865, 460, 2063, 1377, 1961, 674]], +[[877, 2689, 1314, 2901, 2383, 2676, 776, 1093, 373, 619, 2108, 1575, 302, 2884, 2512, 3312, 354, 3190, 2488, 1489, 450, 2083, 950, 3219, 1736, 858, 990, 1726, 1010, 268, 1985, 2456, 2400, 1322, 1692, 792, 830, 2967, 1496, 305, 1859, 3199, 181, 773, 737, 654, 2211, 2472, 1979, 1700, 1487, 481, 1512, 1996, 704, 3195, 1924, 577, 2456, 2113, 620, 1900, 747, 1711, 3029, 330, 3103, 344, 1648, 193, 1535, 2411, 1276, 3311, 2481, 2874, 391, 101, 2934, 877, 2063, 1063, 528, 89, 2131, 2800, 2878, 1023, 1280, 851, 1870, 2841, 1500, 1453, 1779, 1740, 447, 3105, 1459, 2871, 1054, 2457, 2503, 2298, 2740, 2664, 3326, 703, 2697, 1073, 588, 1797, 146, 3163, 482, 3245, 328, 2927, 1894, 1676, 2011, 2012, 3326, 2628, 2114, 51, 9, 325, 3212, 2441, 104, 1908, 2893, 2419, 1131, 2260, 1076, 3290, 3303, 1284, 1342, 272, 1042, 499, 2096, 697, 94, 1653, 3156, 1314, 707, 132, 540, 395, 3132, 2127, 2717, 2405, 827, 593, 224, 2818, 1100, 1236, 1585, 3159, 2404, 2160, 657, 1064, 1578, 1321, 1941, 1275, 1228, 943, 2773, 3179, 1719, 1584, 940, 2966, 2024, 843, 1858, 2536, 1122, 2306, 3257, 1191, 1368, 83, 2567, 1552, 1912, 286, 2792, 183, 1800, 705, 1242, 1652, 469, 555, 123, 2646, 950, 3230, 941, 3104, 2895, 1836, 592, 1449, 95, 3121, 2440, 2724, 1799, 1139, 214, 494, 534, 2152, 2559, 1648, 1041, 1856, 1250, 1418, 3159, 1988, 1690, 162, 711, 1731, 1316, 1566, 2396, 2183, 2879, 907, 2796, 3073, 100, 3060, 2629, 2117, 2826, 3135, 2089, 3126, 301, 1620, 3086, 2870], +[2030, 1476, 1307, 1939, 469, 688, 102, 935, 1684, 2508, 2703, 2261, 3181, 7, 1626, 2393, 1204, 1721, 1179, 1497, 2130, 2115, 1335, 1073, 2528, 773, 949, 2385, 562, 2111, 2643, 2432, 2674, 570, 3076, 2459, 1549, 322, 964, 2775, 1385, 727, 3251, 844, 3017, 305, 1718, 74, 246, 2901, 2480, 2465, 2876, 2534, 2461, 2405, 2370, 1091, 3058, 2925, 174, 1887, 1655, 868, 666, 3224, 639, 1967, 7, 323, 668, 2464, 496, 2743, 2606, 2358, 2146, 503, 1470, 377, 1935, 1406, 2879, 2045, 1266, 3100, 1121, 822, 2643, 953, 310, 816, 1910, 671, 3122, 780, 1930, 1547, 2064, 63, 651, 1358, 3187, 2051, 1087, 3039, 400, 2813, 2661, 466, 1380, 3102, 1423, 587, 760, 2773, 217, 520, 843, 309, 2936, 2653, 59, 2991, 310, 1523, 2450, 901, 245, 1000, 1998, 543, 1124, 2506, 783, 1442, 652, 2915, 636, 3058, 601, 264, 1463, 2600, 194, 831, 609, 871, 1298, 811, 913, 2155, 2352, 3094, 1291, 2202, 2384, 1109, 407, 419, 2011, 252, 929, 2402, 2480, 610, 2196, 1179, 365, 383, 1843, 690, 3274, 843, 1526, 180, 340, 2717, 246, 1660, 1494, 2922, 1744, 1293, 674, 3307, 2035, 3176, 1011, 2997, 187, 2305, 2535, 3095, 2049, 1458, 3089, 479, 1693, 2935, 1871, 1208, 2406, 1548, 59, 2275, 172, 2777, 1653, 1702, 2404, 1153, 19, 2692, 722, 2679, 2435, 1039, 2537, 10, 410, 485, 2369, 465, 1481, 1427, 2357, 2868, 2171, 2474, 2812, 2681, 3184, 388, 2601, 468, 2609, 1566, 1300, 848, 1776, 1073, 3059, 2328, 1887, 1799, 2995, 3099, 498, 2584, 2918, 591, 2214, 709, 837, 2916], +[1699, 1753, 2869, 3202, 1534, 2495, 1639, 2474, 3258, 502, 315, 2343, 2767, 2558, 782, 3300, 763, 719, 2597, 770, 1299, 2184, 1891, 2564, 2579, 328, 818, 105, 2248, 2130, 2559, 2964, 2411, 3256, 835, 1059, 3154, 2224, 2134, 2836, 2372, 2213, 2197, 941, 688, 2759, 3100, 3214, 1206, 482, 761, 1515, 684, 3073, 130, 3204, 177, 2931, 1937, 283, 51, 2569, 2983, 2924, 1276, 595, 225, 2274, 1372, 1458, 31, 931, 537, 359, 47, 710, 3270, 735, 549, 1245, 2463, 1829, 2641, 3320, 451, 2958, 3219, 2582, 2743, 2170, 603, 426, 1730, 3270, 1241, 2177, 341, 2549, 2362, 1529, 2581, 1944, 3265, 1705, 1458, 1757, 966, 350, 1235, 2974, 1305, 1257, 1476, 818, 2677, 742, 1442, 3305, 2688, 1263, 5, 2460, 1315, 3313, 1831, 1135, 1908, 2076, 1739, 2340, 1771, 592, 1136, 346, 528, 3141, 756, 302, 1663, 341, 3211, 2052, 3228, 1009, 124, 3147, 591, 66, 1445, 2356, 106, 1276, 1299, 2065, 382, 1965, 2930, 2989, 1787, 2113, 1759, 2501, 1978, 1898, 591, 406, 3110, 1522, 3239, 1451, 2368, 2957, 2291, 582, 2707, 370, 871, 3257, 1335, 1495, 1790, 27, 1934, 2767, 1933, 2027, 3172, 2031, 880, 916, 193, 695, 2225, 817, 2187, 549, 2, 2608, 31, 1501, 1901, 853, 2148, 2952, 1211, 270, 477, 820, 2580, 2250, 95, 651, 1475, 360, 2596, 660, 353, 2985, 1346, 33, 2966, 2156, 1732, 2577, 2902, 148, 979, 2601, 1659, 1423, 368, 1435, 2324, 1147, 996, 3191, 2176, 1055, 3219, 427, 3077, 2739, 2896, 3220, 693, 2421, 1259, 893, 3075, 3112, 1219, 218, 3006, 2683, 260, 1594]], +[[944, 2368, 2787, 2753, 1705, 169, 2455, 2348, 1200, 3008, 513, 1731, 441, 2153, 493, 2496, 1405, 2360, 2147, 2699, 1629, 2955, 353, 2774, 1471, 1444, 1430, 2000, 2051, 956, 2517, 3193, 1350, 1581, 2066, 2621, 2178, 866, 1706, 420, 1024, 428, 1180, 2236, 31, 2331, 2615, 2312, 3054, 2288, 485, 1167, 2293, 946, 3103, 2625, 3258, 2567, 2840, 2568, 2198, 1295, 3081, 1233, 334, 269, 2864, 1981, 1823, 646, 1377, 757, 1997, 183, 1819, 2432, 2779, 2861, 2612, 975, 1288, 2691, 2196, 864, 441, 2778, 799, 1224, 2825, 1130, 3188, 2877, 2661, 1563, 476, 3208, 3266, 1094, 338, 56, 936, 210, 563, 3179, 628, 604, 1738, 3232, 1899, 2116, 1616, 2938, 3075, 446, 971, 166, 2634, 2641, 2881, 1533, 3082, 2998, 834, 2501, 1380, 2904, 1934, 3302, 3194, 1864, 543, 668, 3162, 3136, 1542, 1482, 336, 140, 2347, 938, 1300, 2734, 2140, 347, 283, 1220, 1000, 1185, 2426, 1996, 1903, 1608, 2316, 500, 2018, 2520, 1712, 825, 464, 2240, 1720, 1602, 868, 1703, 1748, 495, 2972, 432, 2901, 687, 1700, 512, 532, 2738, 2935, 2770, 434, 425, 1358, 2528, 623, 574, 1719, 589, 2229, 2713, 524, 2083, 630, 2900, 122, 3289, 23, 1215, 678, 2081, 423, 3004, 1949, 72, 1439, 1410, 66, 1038, 989, 1498, 2423, 3096, 3191, 1954, 523, 965, 753, 515, 99, 1500, 634, 3144, 1190, 2916, 1319, 3141, 1491, 2471, 1143, 2160, 2206, 1933, 1550, 1899, 2968, 396, 2964, 947, 456, 2026, 1666, 2535, 2078, 2911, 53, 2785, 1750, 1115, 197, 1643, 137, 499, 3078, 1343, 2495, 1636, 1800, 1670, 842, 3096], +[701, 632, 1748, 2683, 1252, 1738, 953, 2885, 2065, 3283, 1280, 65, 150, 2085, 687, 1257, 1828, 3211, 3204, 3016, 2508, 3259, 2379, 1469, 2774, 2441, 1831, 979, 1840, 2930, 250, 2733, 2091, 1663, 126, 2994, 2941, 124, 1260, 2555, 813, 462, 1359, 1108, 2598, 1961, 453, 228, 1688, 2019, 745, 1924, 3183, 2730, 2857, 970, 853, 3174, 2550, 1691, 2114, 1921, 1568, 1852, 2851, 2882, 2838, 914, 377, 1767, 1026, 602, 1162, 691, 16, 2105, 1066, 2449, 2264, 3126, 1580, 1207, 927, 2682, 658, 2350, 456, 2203, 1390, 1665, 2836, 3194, 1357, 315, 1680, 787, 2404, 681, 3128, 55, 645, 225, 2332, 2371, 297, 831, 865, 1022, 2016, 2860, 1134, 3159, 3000, 1703, 2896, 1555, 858, 1331, 3113, 2002, 637, 1153, 133, 1369, 2392, 1332, 1122, 2070, 1858, 2577, 2766, 1889, 1808, 3322, 2828, 1534, 1708, 1433, 561, 1073, 2651, 2576, 3219, 493, 1964, 2504, 1388, 1955, 670, 285, 1201, 2333, 3009, 1526, 3324, 2845, 2875, 12, 734, 381, 3094, 1188, 2567, 981, 1434, 2909, 3229, 1392, 885, 553, 329, 2917, 1254, 1733, 2306, 3163, 2760, 90, 2761, 2545, 2023, 1064, 1617, 485, 1501, 1834, 417, 740, 2618, 1530, 2781, 3183, 933, 2813, 163, 2695, 2418, 2915, 1864, 2416, 3096, 11, 3251, 208, 2963, 3042, 1177, 802, 1301, 893, 1178, 2365, 1836, 913, 990, 44, 858, 1250, 1826, 1028, 2652, 2647, 1886, 857, 3109, 2386, 2999, 309, 1793, 2014, 1510, 484, 1292, 1250, 826, 2990, 3286, 2879, 249, 1737, 2728, 1980, 2468, 1574, 212, 1477, 1690, 1738, 1462, 2880, 1990, 209, 37, 2970, 327, 2770], +[454, 1606, 3133, 139, 2795, 769, 2212, 86, 131, 527, 505, 544, 2963, 2093, 2911, 982, 2357, 2477, 3171, 1936, 232, 94, 2258, 2957, 1822, 2592, 2248, 591, 644, 2553, 56, 2399, 2031, 2479, 512, 2031, 2073, 696, 2997, 1479, 2115, 1333, 2071, 2112, 2857, 1975, 1589, 739, 1865, 1143, 1707, 1359, 878, 2913, 2013, 269, 1244, 218, 2514, 829, 577, 3189, 3005, 1949, 2682, 1797, 927, 551, 1430, 2855, 2441, 1418, 2388, 828, 750, 2561, 2617, 908, 1994, 576, 3117, 701, 3133, 327, 2484, 2193, 3224, 941, 276, 1944, 2895, 2002, 2352, 1759, 1646, 1277, 93, 262, 2000, 755, 3251, 2887, 96, 2626, 2898, 826, 558, 238, 1874, 3065, 2603, 412, 2462, 2709, 216, 2452, 3234, 2320, 2180, 2328, 3309, 2342, 2563, 1471, 1771, 1419, 2533, 684, 1128, 2261, 1698, 245, 1626, 1846, 330, 1136, 3169, 3277, 316, 635, 1532, 672, 6, 2971, 2318, 2494, 1756, 1532, 3120, 888, 1856, 1097, 17, 654, 2313, 2165, 3316, 1952, 73, 254, 2355, 3106, 62, 3157, 2767, 2106, 109, 2500, 454, 2668, 988, 961, 2317, 1731, 480, 346, 2506, 3081, 1855, 1033, 1453, 1419, 2298, 2688, 1949, 966, 2697, 2766, 2787, 2752, 1609, 2440, 1453, 2303, 3002, 2149, 3135, 1694, 100, 2178, 1566, 2395, 485, 1617, 288, 2597, 236, 99, 1462, 1487, 734, 1105, 2786, 3195, 634, 2823, 1219, 539, 2446, 3027, 1322, 3251, 887, 571, 2691, 1538, 3111, 661, 454, 2600, 2306, 1674, 727, 206, 2435, 2979, 1853, 2309, 379, 2419, 196, 2090, 2423, 1876, 2189, 2, 3270, 506, 2055, 1309, 736, 2176, 1070, 633, 1274, 3239]]] + +r: [[1, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 3328, 1, 2, 0, 0, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 0, 1, 0, 0, 2, 3328, 2, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 2, 2, 3328, 3328, 1, 3328, 2, 1, 0, 1, 1, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 3328, 2, 0, 1, 3328, 0, 0, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 3328, 1, 3328, 1, 1, 1, 3327, 3327, 1, 1, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 1, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 2, 3328, 1, 2, 2, 3328, 1, 2, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3327, 2, 3328, 1, 3328, 3328, 3328, 1, 1, 1, 0, 3328, 0, 1, 3327, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 3327, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 3327, 2, 0, 3328, 0, 0, 3327, 3328, 1, 3328, 3327, 1, 3327, 0, 0, 3327, 1, 3328, 3328, 0, 2, 3327, 3328, 0, 0, 0, 2, 0, 3328, 0, 3328], +[2, 3327, 0, 1, 3328, 3328, 0, 2, 3328, 1, 2, 1, 1, 1, 0, 3328, 2, 3328, 0, 3327, 3328, 1, 2, 0, 0, 0, 1, 0, 1, 3328, 1, 0, 3328, 0, 3327, 1, 0, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 3328, 1, 2, 3328, 1, 0, 3328, 1, 1, 3328, 3328, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 2, 1, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 0, 0, 2, 0, 2, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 3328, 0, 0, 0, 2, 3328, 0, 0, 1, 0, 3327, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 1, 0, 3327, 0, 3327, 0, 1, 1, 3327, 0, 1, 1, 1, 3328, 3328, 1, 3328, 1, 0, 1, 1, 1, 3328, 0, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 0, 1, 1, 3328, 1, 1, 1, 1, 3328, 1, 0, 3328, 3327, 0, 1, 1, 0, 3328, 3328, 3327, 0, 0, 2, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 3327, 1, 2, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 3328, 3328, 1, 0, 1, 0, 0, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 3328, 1, 0, 2, 3328, 3328, 3328, 0, 3327, 0, 0, 1, 1, 3328, 0, 0, 2], +[0, 3328, 3328, 0, 3328, 1, 0, 0, 0, 3327, 3327, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 3328, 3328, 1, 3327, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 1, 3327, 3328, 3328, 0, 3328, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 3328, 0, 1, 3327, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 2, 3327, 3328, 0, 0, 0, 3328, 3328, 1, 3327, 1, 1, 3327, 1, 3328, 3328, 1, 1, 2, 2, 3328, 3328, 1, 0, 0, 0, 0, 3328, 2, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 3328, 3328, 1, 2, 3328, 2, 1, 0, 1, 0, 3328, 3328, 0, 3327, 1, 1, 1, 0, 1, 0, 1, 3328, 0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 3327, 0, 0, 3328, 3328, 0, 2, 1, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3327, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 3327, 3328, 1, 0, 1, 0, 0, 0, 2, 3328, 3328, 1, 0, 1, 1, 0, 3327, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 0, 3327, 3328, 0, 3328, 3328, 0, 3328, 2, 1, 0, 3328, 0, 3328, 3328, 0, 3327, 0, 0, 3327, 0, 3328, 0, 2]] + +e1: [[0, 2, 0, 0, 1, 3328, 0, 0, 1, 3328, 3328, 0, 0, 3327, 3327, 3327, 3328, 3328, 1, 1, 3327, 0, 1, 0, 1, 0, 3327, 0, 1, 1, 3327, 1, 2, 1, 1, 0, 3328, 1, 0, 0, 2, 3328, 0, 0, 2, 0, 3328, 0, 0, 0, 0, 3328, 1, 2, 1, 3328, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 0, 3327, 1, 0, 1, 0, 3328, 0, 0, 2, 2, 3328, 1, 0, 0, 3328, 1, 0, 0, 1, 3328, 0, 1, 3327, 3328, 3328, 2, 3327, 1, 3328, 3328, 0, 3328, 0, 3328, 3328, 3327, 1, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 3328, 3327, 2, 3328, 0, 3328, 0, 1, 1, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 2, 1, 3327, 1, 3328, 1, 0, 0, 1, 1, 2, 3328, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 0, 1, 0, 0, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 2, 0, 0, 2, 0, 0, 0, 1, 1, 3328, 3328, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 0, 1, 2, 3328, 3327, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 3327, 3327, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 0, 0, 1, 3327, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 1, 0, 3327, 0], +[1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 0, 1, 3327, 0, 2, 3327, 3328, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 3328, 3327, 0, 1, 3328, 0, 1, 0, 1, 0, 0, 1, 3328, 3327, 3327, 3328, 1, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 1, 3327, 1, 1, 0, 0, 0, 1, 2, 3328, 3328, 0, 0, 3328, 0, 1, 1, 3328, 0, 2, 3328, 2, 3328, 0, 0, 3328, 0, 3328, 3327, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 0, 3327, 3327, 0, 2, 1, 2, 0, 2, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 1, 1, 0, 0, 0, 3328, 0, 3328, 0, 0, 1, 2, 2, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 1, 3327, 3328, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 3328, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 2, 0, 0, 3328, 1, 3328, 0, 3327, 3328, 3328, 2, 0, 3328, 1, 3328, 1, 2, 1, 1, 0, 1, 3328, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3327, 0, 0, 3327, 1, 3328, 3327, 1, 3328, 1, 0, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 3328, 0, 3327, 1, 0, 1, 2, 3328, 0, 1, 1, 0, 3328, 0, 1, 3328, 3327, 0, 1, 1, 3327, 3328, 1, 3328, 1, 3328, 3328], +[3328, 3328, 1, 0, 3328, 0, 1, 0, 3327, 1, 0, 0, 1, 0, 0, 2, 0, 3328, 0, 3328, 0, 3328, 0, 2, 0, 3327, 2, 1, 1, 0, 3328, 1, 0, 0, 3327, 3327, 0, 3327, 0, 3328, 1, 0, 2, 1, 3328, 0, 1, 1, 3328, 3328, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 3328, 3328, 3328, 1, 3327, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 1, 3328, 0, 1, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 0, 3328, 3328, 1, 3328, 0, 3327, 1, 0, 3328, 0, 0, 0, 1, 0, 0, 3327, 1, 3327, 0, 0, 1, 2, 2, 1, 0, 1, 1, 3328, 3328, 3328, 0, 0, 0, 1, 2, 0, 0, 2, 1, 1, 2, 0, 2, 0, 3327, 3327, 1, 0, 1, 0, 0, 1, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 2, 0, 3328, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 1, 2, 3328, 1, 3327, 1, 0, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 3328, 0, 2, 0, 1, 2, 1, 3328, 1, 1, 0, 3328, 1, 3327, 1, 0, 2, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3327, 1, 0, 0, 1, 0, 2, 0, 3327, 3328, 3328, 1, 2, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 0, 0, 0, 3328, 1, 0, 1, 3328, 3328, 3328, 1, 0, 0, 1, 0, 3328, 3328]] + +e2: [0, 3328, 1, 3328, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 0, 3328, 0, 2, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 3328, 0, 1, 0, 0, 1, 3328, 2, 1, 0, 3328, 3327, 0, 1, 0, 0, 1, 3328, 3328, 0, 1, 1, 0, 3328, 3328, 3327, 0, 3327, 3328, 1, 1, 0, 1, 0, 0, 0, 3328, 0, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 3327, 3328, 0, 0, 0, 3328, 3328, 3327, 3328, 1, 3328, 0, 0, 0, 2, 0, 1, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 1, 0, 1, 2, 1, 0, 2, 3328, 3328, 1, 3327, 0, 1, 0, 2, 3328, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 3327, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2, 3328, 3328, 0, 3328, 0, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 0, 1, 3327, 0, 2, 1, 0, 1, 0, 1, 0, 3327, 0, 3327, 1, 3328, 0, 0, 0, 0, 0, 3327, 2, 0, 0, 0, 1, 3328, 3328, 3328, 0, 1, 1, 0, 0, 3328, 3328, 3328, 3328, 0, 3328] +rHat: [[1307, 1115, 2843, 2750, 53, 3232, 564, 1601, 2979, 2813, 1924, 1256, 1363, 633, 2606, 249, 2826, 2564, 2747, 1538, 2332, 21, 893, 2167, 611, 3127, 2608, 1426, 1081, 1514, 1018, 510, 1079, 399, 1279, 509, 1997, 1460, 2516, 2053, 1757, 3107, 2995, 277, 1354, 446, 322, 2854, 419, 2019, 1109, 335, 869, 2546, 3265, 2635, 1718, 1225, 3045, 2903, 803, 2065, 999, 516, 2535, 320, 933, 3171, 1749, 1406, 2421, 1363, 1268, 586, 1371, 1555, 497, 496, 699, 3237, 1947, 2316, 804, 831, 3009, 1795, 2522, 2963, 1788, 785, 373, 1016, 2314, 2753, 2892, 3128, 246, 2345, 2091, 1837, 2095, 2036, 1994, 1765, 883, 1531, 209, 2778, 1779, 676, 205, 2197, 806, 2525, 2371, 3288, 158, 531, 2376, 8, 2869, 1665, 2627, 2850, 221, 2139, 1131, 1301, 2577, 80, 1259, 203, 1327, 3149, 1171, 2194, 2991, 2128, 2983, 1248, 1251, 1904, 1525, 351, 2595, 1305, 1386, 2865, 1327, 1410, 650, 1645, 1282, 1884, 52, 308, 1745, 2224, 212, 1390, 2506, 1300, 180, 1271, 1145, 1839, 725, 237, 2801, 2338, 361, 2214, 30, 907, 1822, 380, 2219, 1293, 894, 160, 1426, 2145, 653, 2098, 86, 1136, 1388, 3070, 602, 712, 208, 1233, 2304, 1531, 255, 579, 2002, 197, 1904, 328, 854, 126, 18, 2581, 1522, 2321, 3212, 2555, 792, 1870, 913, 1792, 55, 2535, 797, 863, 953, 165, 1324, 3024, 43, 69, 716, 965, 2489, 1861, 256, 1146, 686, 2695, 1081, 1053, 552, 2553, 2344, 808, 850, 791, 2257, 1480, 748, 1285, 1412, 154, 3276, 1722, 2047, 87, 76, 140, 22, 1221, 857, 774, 2763, 1461], +[1606, 193, 658, 2035, 830, 1434, 2887, 2937, 1435, 750, 371, 486, 1389, 3313, 1789, 356, 1508, 331, 1781, 3270, 1515, 1980, 465, 130, 1415, 3281, 2759, 2523, 2849, 2101, 2599, 2120, 2625, 1888, 2754, 1413, 2725, 2188, 1204, 80, 664, 1229, 168, 3045, 83, 1983, 1496, 697, 955, 2869, 2222, 3294, 1102, 549, 370, 1293, 1899, 430, 2203, 3234, 1947, 2397, 461, 651, 803, 1038, 2293, 1020, 3296, 2577, 306, 1966, 2308, 2718, 1657, 2698, 2867, 1522, 558, 292, 3009, 1182, 2047, 1330, 1802, 257, 1514, 31, 1540, 1028, 76, 2765, 421, 774, 530, 1433, 294, 879, 3102, 2394, 2190, 1496, 1356, 1777, 3044, 2226, 39, 3260, 2623, 2750, 1977, 2371, 805, 1154, 2686, 1858, 2028, 1393, 1022, 1547, 1241, 1322, 1216, 2805, 2162, 3026, 1251, 2360, 646, 641, 3200, 1178, 1950, 2938, 613, 318, 2880, 2281, 1880, 2294, 2750, 849, 3268, 1666, 1833, 1310, 418, 3191, 721, 1925, 1152, 2260, 2448, 874, 1347, 11, 1614, 2288, 2603, 1244, 2736, 662, 1146, 88, 1941, 1015, 414, 2587, 3298, 3023, 3154, 413, 1499, 1620, 992, 925, 1058, 334, 2122, 1282, 652, 2395, 2905, 443, 966, 1127, 2259, 3137, 1184, 2542, 2273, 346, 3271, 2285, 100, 2988, 704, 2947, 3197, 1133, 283, 1698, 714, 3, 2664, 2180, 1280, 401, 2419, 2301, 1578, 1876, 199, 627, 2908, 940, 226, 780, 1597, 964, 115, 155, 1280, 3325, 3019, 460, 1876, 2699, 2839, 2161, 1179, 2061, 3257, 1889, 2580, 3259, 1888, 2110, 987, 180, 1521, 3077, 2340, 1854, 91, 1039, 1621, 1250, 169, 1894, 1936, 927, 992, 1705, 2434, 1367], +[2587, 820, 2401, 2720, 764, 2141, 1899, 2778, 135, 3105, 1553, 3121, 2658, 633, 395, 974, 1703, 1573, 129, 276, 2071, 1564, 2379, 2705, 1804, 243, 980, 2120, 691, 3200, 494, 2145, 2791, 1635, 373, 991, 2625, 2728, 3050, 848, 1414, 1703, 1755, 1962, 1299, 386, 1507, 2018, 3197, 2260, 1397, 1340, 3120, 351, 3280, 421, 1643, 375, 1710, 974, 942, 2396, 518, 2195, 1439, 2069, 1251, 2831, 2416, 1189, 2869, 1659, 3100, 1962, 2662, 2289, 1946, 1021, 1254, 1971, 1156, 1955, 445, 1211, 135, 2617, 3239, 820, 1338, 2348, 690, 406, 763, 1621, 89, 866, 3324, 89, 822, 2244, 566, 1003, 2011, 1258, 335, 2550, 755, 901, 1904, 541, 41, 1246, 1841, 939, 2912, 531, 2272, 1474, 2719, 2344, 794, 3234, 280, 2473, 1947, 2513, 2620, 1857, 615, 3190, 625, 2697, 3189, 3219, 1279, 481, 1864, 3168, 3040, 2774, 2037, 2584, 2972, 2375, 382, 537, 1543, 998, 705, 1351, 1718, 3261, 1764, 2789, 2223, 1768, 3227, 1644, 3010, 2718, 2505, 315, 1174, 2729, 974, 2857, 2621, 186, 1992, 1278, 2543, 2680, 125, 323, 3078, 2591, 85, 2116, 1580, 1807, 2817, 2867, 679, 2415, 1596, 1879, 2695, 2730, 2359, 1791, 2906, 2400, 1099, 827, 2784, 110, 295, 1134, 859, 2748, 1282, 654, 929, 2850, 2781, 3132, 2707, 175, 738, 1896, 1218, 288, 1496, 3163, 1920, 3298, 2708, 1040, 1738, 3097, 3030, 2954, 686, 1682, 269, 1011, 1271, 3295, 816, 2693, 3173, 2675, 2277, 1242, 2829, 1963, 1314, 2069, 1233, 3188, 249, 661, 1787, 920, 3266, 70, 2834, 37, 656, 2035, 243, 1184, 2410, 2491, 2367, 411]] + +BHat * rHat: [[1, 127, 2252, 1774, 1319, 216, 2740, 506, 2897, 1644, 1067, 272, 434, 1016, 25, 1865, 3075, 443, 73, 142, 1652, 1257, 2977, 353, 1340, 2123, 1191, 655, 883, 1513, 2253, 274, 2589, 20, 2457, 2532, 2608, 402, 2513, 286, 1696, 2329, 2459, 875, 2707, 2484, 2913, 1826, 2816, 1611, 16, 415, 1928, 337, 2103, 2763, 1296, 2036, 2062, 2354, 101, 584, 2008, 3280, 2525, 1548, 246, 1703, 1568, 472, 1609, 349, 1357, 959, 3200, 2951, 2227, 782, 2490, 2235, 1387, 1622, 1661, 990, 1976, 1582, 1407, 3172, 1473, 2834, 2960, 75, 1568, 3224, 1296, 1940, 1550, 1713, 2506, 536, 1045, 2653, 1081, 2949, 3005, 1827, 609, 2200, 1382, 2198, 1180, 1562, 2810, 49, 1645, 2656, 3067, 3038, 981, 897, 1083, 2694, 642, 400, 523, 2424, 527, 1242, 1739, 546, 2235, 2736, 1763, 2130, 1377, 2308, 1538, 1232, 2629, 929, 2115, 1378, 1060, 3099, 806, 432, 2297, 2946, 2275, 1134, 1453, 232, 2713, 291, 1665, 1074, 1044, 255, 2862, 2514, 83, 330, 62, 2434, 2266, 683, 3256, 1522, 840, 3000, 1333, 3187, 3085, 458, 3256, 3316, 1038, 1171, 2442, 493, 2839, 1183, 1600, 1313, 2039, 526, 3072, 349, 949, 1199, 2694, 2752, 1395, 3207, 28, 1796, 595, 949, 3083, 294, 93, 1699, 3004, 3208, 485, 2079, 1355, 3306, 2745, 1964, 2455, 146, 2867, 172, 3275, 2714, 1099, 613, 1441, 3172, 2834, 1475, 1921, 2885, 1165, 2685, 1536, 1784, 2594, 141, 1216, 3145, 3277, 2496, 599, 1651, 2438, 2737, 2311, 3269, 2152, 2195, 481, 218, 2828, 1972, 2310, 382, 1456, 140, 3067, 3229, 2774, 842, 1012, 2412], +[553, 3304, 606, 2390, 2439, 2992, 902, 713, 2388, 2438, 132, 1771, 3202, 1334, 490, 2721, 2671, 1012, 2173, 938, 1959, 1191, 1677, 2515, 1574, 836, 1836, 3183, 2296, 2289, 3179, 2232, 2928, 197, 166, 332, 2753, 2646, 2298, 2711, 1350, 490, 2870, 2235, 2918, 2828, 1561, 2357, 2159, 184, 2253, 640, 2873, 2394, 2230, 865, 2393, 2503, 391, 3100, 1793, 1546, 397, 3085, 851, 97, 1301, 2233, 3314, 2698, 3251, 2196, 1593, 803, 1605, 994, 1418, 746, 3196, 729, 1403, 1298, 643, 1675, 1787, 534, 370, 3232, 1686, 2598, 1886, 3283, 445, 854, 3323, 949, 2849, 2782, 1617, 443, 1948, 3086, 2953, 3100, 2336, 111, 1765, 413, 1124, 286, 338, 2339, 2850, 1587, 3280, 2864, 1172, 3075, 1997, 1997, 338, 1024, 274, 91, 890, 1989, 404, 1888, 127, 2298, 2886, 2757, 2279, 2150, 3016, 2494, 1390, 2966, 1358, 563, 2247, 456, 1157, 2369, 250, 3309, 1777, 3320, 3272, 306, 413, 102, 351, 3053, 1085, 969, 2087, 1190, 634, 1079, 2126, 696, 1167, 297, 494, 3040, 2000, 2614, 1999, 802, 1963, 923, 34, 964, 190, 3115, 647, 1547, 2607, 218, 1690, 2456, 2504, 2319, 1393, 593, 3071, 1446, 3062, 1412, 2611, 3195, 2298, 781, 1046, 2504, 1785, 2999, 2703, 979, 1129, 2581, 2207, 1750, 485, 1886, 1583, 3132, 1742, 1903, 762, 1963, 1239, 1563, 1124, 1270, 1507, 866, 782, 182, 2914, 3017, 336, 2441, 2254, 2512, 52, 999, 174, 464, 2492, 2199, 1438, 2773, 2897, 1467, 2074, 501, 1194, 2547, 2249, 2446, 677, 1997, 2216, 2948, 2732, 834, 586, 2992, 2472, 1905, 859, 2921, 1055, 2004], +[2316, 944, 2344, 1074, 2292, 2320, 467, 469, 1195, 2346, 412, 1069, 112, 429, 109, 3279, 424, 2370, 1830, 2462, 2954, 1978, 510, 3030, 967, 3129, 701, 58, 1276, 3243, 1783, 3303, 2591, 1043, 2943, 665, 1894, 2510, 2957, 1146, 214, 178, 3231, 2723, 2173, 2074, 1816, 1938, 428, 3113, 3295, 1175, 964, 3138, 523, 2481, 296, 378, 2010, 472, 421, 499, 2116, 1005, 285, 2464, 796, 2584, 2057, 1346, 1797, 331, 45, 1603, 274, 1827, 1079, 302, 168, 2187, 397, 2744, 249, 2563, 1121, 909, 3018, 956, 2470, 1813, 1820, 2624, 2874, 2647, 2890, 3127, 3067, 1529, 1147, 3230, 2408, 2763, 2696, 2800, 1711, 1506, 3190, 965, 298, 2594, 565, 1539, 2807, 2217, 2391, 1869, 537, 2180, 81, 2321, 1763, 484, 669, 1392, 2916, 2131, 129, 789, 3127, 399, 1187, 3191, 1979, 935, 1935, 1044, 2655, 727, 2522, 344, 2430, 1110, 3295, 611, 2187, 2144, 2455, 1458, 2139, 1893, 2289, 704, 1122, 623, 906, 1144, 2343, 2466, 3269, 2820, 1224, 1022, 2068, 709, 2582, 249, 184, 1551, 2515, 2369, 1128, 310, 3080, 27, 1050, 2871, 2122, 3066, 2109, 2875, 2461, 719, 379, 2049, 35, 854, 459, 2540, 2163, 3142, 1070, 3305, 2288, 396, 2493, 3197, 2796, 1991, 1830, 1198, 1239, 775, 1419, 2608, 2478, 1745, 847, 2966, 781, 2721, 1248, 2899, 1616, 492, 815, 70, 3100, 2110, 3179, 1690, 3144, 3051, 1373, 2483, 1489, 2908, 2671, 780, 2532, 577, 1460, 640, 3120, 1128, 1857, 1752, 807, 2342, 557, 2649, 1119, 2044, 2522, 1365, 964, 922, 2027, 1282, 1771, 857, 3212, 695, 853, 996, 1613, 15]] +NTTInverse(BHat * rHat): [[2390, 2004, 1233, 557, 320, 148, 2920, 2049, 722, 1522, 1714, 2781, 2853, 1623, 2266, 3309, 1643, 2616, 2182, 372, 459, 3152, 1994, 3049, 1436, 781, 805, 2808, 1217, 2963, 572, 2798, 1738, 559, 1794, 395, 1779, 1110, 171, 1532, 403, 943, 769, 1283, 790, 2306, 2907, 3058, 1342, 2956, 1792, 2051, 0, 2293, 2935, 233, 2541, 2358, 401, 2622, 846, 1476, 2393, 2262, 2512, 1515, 1767, 1711, 2355, 878, 2631, 1296, 970, 1380, 478, 1263, 506, 921, 1113, 437, 1444, 1475, 478, 857, 776, 715, 2336, 680, 2316, 1196, 895, 3098, 2537, 2212, 942, 2731, 392, 1222, 2391, 741, 3269, 219, 3306, 1823, 1789, 236, 3076, 477, 148, 2791, 2236, 634, 2897, 1875, 325, 2339, 480, 3257, 2021, 3226, 2237, 3178, 2113, 1556, 1433, 2354, 1022, 3195, 495, 561, 3054, 2300, 256, 2607, 33, 747, 2928, 1660, 1829, 3314, 2874, 1443, 1176, 2772, 1822, 685, 2116, 501, 804, 1759, 2335, 2755, 538, 2785, 231, 1924, 2632, 3191, 47, 1962, 2679, 2760, 1, 2205, 726, 675, 1234, 1130, 926, 878, 2055, 1828, 1633, 1627, 887, 119, 1687, 651, 295, 2055, 854, 2568, 211, 2117, 3268, 125, 1490, 3040, 1336, 1230, 2439, 1220, 2263, 1836, 706, 3065, 285, 1055, 1427, 2205, 1220, 161, 2966, 2696, 970, 1037, 2957, 81, 1340, 2147, 1675, 118, 1749, 2749, 67, 220, 1567, 37, 2337, 2306, 1058, 3070, 1780, 2105, 2564, 1620, 631, 1685, 270, 1805, 1426, 2626, 831, 1107, 978, 2357, 2736, 2577, 683, 3304, 1634, 1552, 303, 1038, 777, 1201, 2937, 1353, 1484, 1524, 1382, 2458, 2223, 1280, 2159, 572], +[662, 2876, 1504, 1457, 1182, 1351, 1049, 272, 2986, 1962, 1243, 2325, 1333, 3155, 1830, 706, 990, 1491, 1815, 398, 2081, 1293, 796, 506, 2560, 599, 1348, 445, 2054, 631, 151, 1136, 665, 1057, 2318, 2725, 1561, 22, 1850, 1838, 2460, 1152, 3175, 2223, 2519, 1232, 399, 3014, 2113, 3296, 1861, 330, 1944, 2668, 707, 2089, 1196, 1094, 2110, 2461, 1343, 427, 1019, 982, 2338, 640, 3133, 1997, 1891, 1770, 892, 148, 102, 3008, 3077, 786, 2506, 3291, 1068, 1205, 1649, 2189, 2532, 2055, 965, 2468, 1485, 2773, 1144, 3016, 393, 545, 817, 2428, 1535, 1488, 1968, 2130, 3253, 2893, 1908, 1730, 2108, 1320, 2958, 1639, 103, 2295, 668, 2581, 3077, 1501, 1001, 1620, 2460, 2950, 1769, 3180, 1328, 1509, 2725, 381, 633, 2849, 1624, 158, 666, 2659, 210, 1868, 1196, 2655, 1316, 2379, 3115, 1883, 312, 1534, 1764, 1624, 2954, 3314, 2027, 962, 3328, 728, 1035, 2306, 2805, 1077, 497, 2100, 188, 2695, 2950, 2929, 1182, 1428, 1866, 1262, 3195, 2750, 496, 47, 593, 217, 1872, 685, 913, 165, 941, 275, 1702, 1623, 1326, 3200, 2595, 3317, 521, 2019, 1600, 2351, 768, 2520, 3304, 3116, 3077, 3170, 2900, 2285, 675, 1654, 769, 3048, 2377, 1277, 1178, 413, 2425, 3009, 857, 174, 2088, 261, 3023, 1856, 288, 486, 1146, 2158, 480, 2480, 313, 2400, 170, 2225, 1605, 746, 2220, 1209, 2261, 1309, 913, 2004, 1240, 2096, 2992, 2037, 2369, 1779, 2210, 3133, 1347, 1675, 749, 1609, 1243, 2392, 739, 1774, 585, 408, 1659, 2148, 1071, 123, 2331, 2429, 3183, 1027, 2186, 952, 2730, 1858, 3010, 3010], +[223, 863, 472, 2398, 1684, 1037, 80, 3005, 2951, 1804, 2121, 1700, 2420, 171, 2540, 196, 371, 10, 1873, 3006, 1541, 1308, 1457, 1207, 1742, 136, 2708, 54, 30, 154, 158, 415, 47, 1212, 1841, 300, 2988, 2199, 2393, 546, 1368, 1247, 464, 1277, 1552, 131, 1049, 2198, 1349, 544, 2507, 2212, 2133, 2388, 3323, 2846, 1660, 1280, 3, 2900, 2597, 1957, 2092, 976, 2554, 1430, 2889, 173, 1266, 1035, 937, 3025, 973, 2088, 1959, 1249, 401, 1673, 2449, 2447, 855, 415, 2313, 1540, 812, 1139, 1380, 2282, 3255, 313, 2187, 3087, 2608, 158, 1374, 511, 1279, 961, 3008, 3290, 2954, 742, 114, 2838, 1428, 680, 1958, 1049, 3250, 2669, 77, 2159, 2610, 2139, 3213, 1392, 1407, 2000, 1571, 1316, 312, 1870, 3013, 1442, 2298, 160, 461, 3087, 1143, 614, 2907, 263, 1735, 2474, 1933, 2480, 2726, 868, 229, 1872, 1182, 1572, 1553, 2002, 2100, 714, 882, 108, 1009, 2359, 3205, 185, 1474, 3104, 360, 1568, 2173, 2472, 1770, 3053, 2133, 2659, 172, 270, 2566, 1036, 579, 2284, 2144, 1010, 2082, 3309, 2836, 2788, 2797, 477, 1237, 1653, 576, 3041, 167, 1301, 542, 1361, 2153, 1393, 1713, 293, 3073, 1656, 2900, 519, 417, 1762, 1277, 2309, 1330, 2590, 2254, 129, 1359, 2966, 1429, 1026, 387, 900, 1235, 1407, 746, 1329, 1058, 3044, 900, 3071, 2114, 2289, 2977, 397, 3128, 1591, 1228, 676, 1101, 1543, 2327, 1840, 736, 2991, 2936, 728, 2042, 626, 2227, 2987, 3314, 1057, 2360, 3273, 2520, 553, 3078, 99, 516, 1387, 3056, 2622, 2975, 134, 912, 2040, 1994, 2428, 1437, 2588, 463, 2517]] +u = NTTInverse(BHat * rHat) + e1: [[2390, 2006, 1233, 557, 321, 147, 2920, 2049, 723, 1521, 1713, 2781, 2853, 1621, 2264, 3307, 1642, 2615, 2183, 373, 457, 3152, 1995, 3049, 1437, 781, 803, 2808, 1218, 2964, 570, 2799, 1740, 560, 1795, 395, 1778, 1111, 171, 1532, 405, 942, 769, 1283, 792, 2306, 2906, 3058, 1342, 2956, 1792, 2050, 1, 2295, 2936, 232, 2541, 2359, 400, 2622, 846, 1476, 2393, 2263, 2511, 1515, 1765, 1712, 2355, 879, 2631, 1295, 970, 1380, 480, 1265, 505, 922, 1113, 437, 1443, 1476, 478, 857, 777, 714, 2336, 681, 2314, 1195, 894, 3100, 2535, 2213, 941, 2730, 392, 1221, 2391, 740, 3268, 217, 3307, 1822, 1788, 237, 3075, 477, 148, 2790, 2236, 633, 2895, 1877, 324, 2339, 479, 3257, 2022, 3227, 2237, 3179, 2114, 1555, 1433, 2353, 1021, 3194, 495, 561, 3052, 2300, 258, 2608, 31, 748, 2927, 1661, 1829, 3314, 2875, 1444, 1178, 2771, 1823, 685, 2116, 500, 805, 1760, 2336, 2755, 537, 2785, 231, 1923, 2632, 3190, 47, 1961, 2679, 2761, 1, 2206, 726, 675, 1233, 1131, 927, 878, 2056, 1828, 1634, 1626, 887, 121, 1687, 651, 297, 2055, 854, 2568, 212, 2118, 3267, 124, 1489, 3040, 1335, 1228, 2438, 1220, 2263, 1836, 705, 3065, 286, 1057, 1426, 2203, 1219, 161, 2965, 2696, 969, 1037, 2957, 82, 1340, 2147, 1675, 119, 1748, 2749, 67, 220, 1568, 37, 2335, 2304, 1058, 3069, 1781, 2106, 2563, 1618, 631, 1684, 268, 1806, 1425, 2626, 830, 1107, 979, 2357, 2736, 2578, 681, 3304, 1634, 1552, 305, 1038, 777, 1201, 2938, 1353, 1486, 1524, 1381, 2458, 2224, 1280, 2157, 572], +[663, 2876, 1504, 1456, 1181, 1350, 1049, 272, 2985, 1962, 1242, 2325, 1334, 3156, 1829, 706, 990, 1490, 1814, 398, 2081, 1294, 794, 506, 2562, 597, 1347, 445, 2054, 631, 152, 1137, 665, 1057, 2317, 2725, 1562, 21, 1848, 1838, 2461, 1151, 3175, 2224, 2519, 1233, 399, 3014, 2114, 3295, 1859, 328, 1943, 2669, 706, 2089, 1196, 1094, 2110, 2460, 1343, 428, 1020, 983, 2336, 641, 3134, 1997, 1891, 1770, 893, 150, 101, 3007, 3077, 786, 2505, 3291, 1069, 1206, 1648, 2189, 2534, 2054, 967, 2467, 1485, 2773, 1143, 3016, 392, 543, 818, 2430, 1536, 1488, 1969, 2129, 3252, 2893, 1907, 1729, 2109, 1320, 2958, 1637, 101, 2295, 670, 2582, 3079, 1501, 1003, 1621, 2460, 2949, 1770, 3181, 1327, 1510, 2725, 381, 634, 2850, 1624, 158, 666, 2658, 210, 1867, 1196, 2655, 1317, 2381, 3117, 1882, 312, 1534, 1765, 1623, 2953, 3313, 2027, 961, 3327, 728, 1034, 2307, 2806, 1075, 496, 2101, 188, 2695, 2949, 2930, 1183, 1428, 1865, 1262, 3194, 2750, 494, 48, 594, 218, 1871, 684, 912, 165, 942, 275, 1701, 1624, 1327, 3199, 2596, 3317, 523, 2019, 1600, 2350, 769, 2519, 3304, 3114, 3076, 3169, 2902, 2285, 674, 1655, 768, 3049, 2379, 1278, 1179, 413, 2426, 3008, 858, 174, 2088, 262, 3022, 1857, 288, 487, 1146, 2156, 480, 2480, 311, 2401, 169, 2223, 1606, 745, 2221, 1209, 2261, 1308, 913, 2002, 1241, 2096, 2993, 2037, 2370, 1778, 2210, 3131, 1348, 1675, 750, 1611, 1242, 2392, 740, 1775, 585, 407, 1659, 2149, 1070, 121, 2331, 2430, 3184, 1025, 2185, 953, 2729, 1859, 3009, 3009], +[222, 862, 473, 2398, 1683, 1037, 81, 3005, 2949, 1805, 2121, 1700, 2421, 171, 2540, 198, 371, 9, 1873, 3005, 1541, 1307, 1457, 1209, 1742, 134, 2710, 55, 31, 154, 157, 416, 47, 1212, 1839, 298, 2988, 2197, 2393, 545, 1369, 1247, 466, 1278, 1551, 131, 1050, 2199, 1348, 543, 2507, 2213, 2134, 2388, 3324, 2847, 1661, 1280, 3, 2900, 2596, 1956, 2091, 977, 2552, 1431, 2889, 174, 1267, 1034, 937, 3025, 973, 2087, 1959, 1250, 400, 1673, 2450, 2447, 855, 415, 2314, 1540, 812, 1140, 1379, 2282, 3256, 315, 2186, 3086, 2608, 157, 1373, 512, 1278, 961, 3006, 3291, 2954, 741, 114, 2838, 1428, 681, 1958, 1049, 3248, 2670, 75, 2159, 2610, 2140, 3215, 1394, 1408, 2000, 1572, 1317, 311, 1869, 3012, 1442, 2298, 160, 462, 3089, 1143, 614, 2909, 264, 1736, 2476, 1933, 2482, 2726, 866, 227, 1873, 1182, 1573, 1553, 2002, 2101, 714, 882, 109, 1008, 2358, 3206, 185, 1475, 3104, 362, 1568, 2172, 2472, 1769, 3053, 2132, 2658, 172, 269, 2567, 1035, 579, 2285, 2146, 1009, 2083, 3307, 2837, 2788, 2796, 478, 1236, 1652, 577, 3041, 167, 1300, 544, 1362, 2153, 1392, 1713, 293, 3073, 1655, 2900, 521, 417, 1763, 1279, 2310, 1329, 2591, 2255, 129, 1358, 2967, 1427, 1027, 387, 902, 1235, 1407, 746, 1330, 1056, 3042, 899, 3069, 2112, 2290, 2977, 397, 3129, 1591, 1230, 676, 1099, 1542, 2326, 1841, 738, 2992, 2936, 727, 2043, 625, 2228, 2988, 3314, 1056, 2359, 3273, 2520, 553, 3078, 99, 515, 1388, 3056, 2623, 2974, 133, 911, 2041, 1994, 2428, 1438, 2588, 462, 2516]] + +mu: [0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665] +tHat^T * rHat: [168, 1978, 1879, 506, 2991, 2549, 1591, 3010, 2292, 3168, 735, 2810, 809, 2276, 173, 2808, 3298, 1969, 368, 1506, 1472, 3275, 292, 590, 3078, 2931, 2675, 2578, 567, 1161, 2015, 3020, 2566, 2296, 860, 1511, 1139, 1161, 3020, 1988, 2403, 1878, 513, 342, 215, 2884, 1115, 1845, 3082, 980, 1395, 1520, 17, 2863, 603, 569, 1322, 715, 1465, 2054, 2488, 2923, 1385, 1926, 2847, 3174, 1309, 44, 2990, 3300, 1894, 2855, 2882, 596, 2113, 2173, 2488, 2587, 2610, 2707, 2338, 2011, 2050, 3181, 2208, 2572, 2347, 955, 3284, 1416, 2106, 1698, 1044, 1087, 2930, 1895, 2493, 2836, 87, 1212, 2012, 660, 377, 1982, 3063, 2234, 1604, 2972, 297, 2607, 185, 3176, 1179, 52, 1105, 2425, 2655, 1992, 571, 329, 3318, 1336, 2715, 2042, 1316, 3046, 435, 141, 2283, 2272, 487, 2767, 1208, 2900, 1355, 1420, 2897, 376, 2389, 193, 1804, 1101, 338, 89, 1510, 2702, 3065, 2652, 983, 2245, 2677, 604, 41, 3037, 3282, 2371, 1804, 747, 1341, 1148, 2174, 2645, 3093, 1297, 508, 137, 3097, 1526, 1875, 2438, 1330, 2284, 72, 932, 2674, 2714, 3005, 2400, 2457, 1273, 3190, 3099, 2290, 1724, 2420, 2006, 34, 1441, 623, 428, 1286, 3175, 44, 311, 198, 2210, 3236, 1936, 2655, 3239, 1190, 3072, 3231, 1773, 970, 1631, 1927, 843, 2192, 3310, 1153, 922, 1770, 246, 1467, 2142, 1566, 931, 870, 2016, 2271, 41, 1153, 128, 254, 1707, 3255, 3297, 2955, 2360, 74, 3061, 1746, 878, 2738, 2738, 409, 247, 247, 611, 162, 3152, 2853, 1623, 2673, 2255, 2709, 3261, 3157, 1628, 2144, 1375, 1998, 555, 526, 1701] +NTTInverse(tHat^T * rHat): [3281, 129, 1087, 3110, 2523, 1722, 632, 2517, 1209, 720, 1354, 1061, 665, 2811, 1418, 1765, 1465, 2182, 847, 1799, 3093, 3104, 2223, 1845, 1735, 2124, 1227, 526, 9, 879, 286, 3103, 1395, 1074, 2472, 1474, 2942, 2733, 1516, 1637, 1671, 1449, 305, 1462, 2130, 2158, 3279, 2030, 1895, 578, 537, 3135, 144, 2361, 2423, 335, 2587, 584, 399, 3321, 1770, 2466, 179, 2746, 1488, 124, 2933, 1743, 2206, 2141, 3015, 1149, 2344, 2363, 905, 1195, 779, 44, 626, 1980, 2074, 2113, 2982, 1942, 2032, 1330, 1306, 2907, 2899, 1397, 566, 589, 2703, 1610, 1065, 1844, 2260, 42, 2428, 814, 2948, 31, 64, 1232, 1421, 3124, 1641, 603, 2757, 1572, 141, 1863, 1945, 1253, 2403, 769, 1022, 1458, 2067, 3079, 3245, 703, 131, 882, 2829, 342, 1710, 3145, 1515, 2800, 3129, 2228, 2402, 1083, 555, 192, 1286, 1852, 869, 1145, 1785, 2593, 2297, 957, 3197, 1240, 1109, 1167, 1135, 2977, 689, 1727, 960, 1032, 1854, 381, 1242, 2563, 1172, 2511, 716, 2236, 1036, 1387, 932, 784, 1289, 2397, 2608, 2489, 2185, 2571, 2504, 468, 364, 1779, 2899, 1582, 173, 590, 2530, 3055, 3057, 1668, 2253, 447, 578, 1413, 868, 2620, 1185, 844, 1691, 1330, 2338, 2476, 2030, 310, 2611, 90, 2633, 2180, 552, 59, 2834, 2316, 1761, 2493, 43, 886, 3233, 126, 2940, 1478, 2338, 825, 849, 2553, 562, 2400, 1808, 1090, 2777, 254, 1814, 1772, 3214, 2124, 2556, 303, 2709, 1546, 145, 2220, 2247, 2206, 3113, 65, 2125, 106, 687, 2032, 732, 2960, 3056, 2494, 3084, 358, 1895, 2795, 2621, 1702, 449, 2606, 2886, 816] +e2 + mu: [0, 3328, 1666, 3328, 1666, 0, 2, 3328, 0, 0, 1666, 1665, 1, 1666, 1665, 1667, 0, 1664, 1665, 1667, 1667, 0, 1666, 1, 1, 1665, 0, 1665, 1665, 1665, 1666, 1666, 1667, 1664, 0, 1, 0, 0, 1666, 1664, 1667, 1, 0, 3328, 1663, 1665, 1, 1665, 1665, 1666, 1664, 3328, 1665, 1, 1, 1665, 1664, 1664, 3327, 1665, 3327, 1664, 1666, 1, 1665, 1, 0, 1665, 0, 1664, 0, 3327, 0, 1665, 0, 1665, 1665, 1, 1664, 1665, 1665, 1666, 0, 1665, 1665, 1, 1663, 1664, 0, 0, 0, 3328, 3328, 1663, 1664, 1, 1664, 1665, 0, 1665, 1667, 0, 1666, 3328, 3328, 3328, 1666, 3328, 1664, 0, 1, 0, 1664, 1665, 3328, 1, 1665, 0, 1665, 1663, 1665, 1666, 0, 3328, 1665, 1664, 1666, 0, 1666, 1664, 1, 1665, 1, 1665, 1, 2, 1666, 0, 1667, 1664, 1664, 1, 1663, 0, 1666, 0, 2, 3328, 3328, 1664, 1664, 1666, 0, 0, 3328, 1665, 1665, 1, 0, 3328, 1665, 0, 3328, 1664, 1665, 0, 1664, 1, 1665, 0, 1666, 3327, 0, 1666, 1667, 1, 0, 1666, 1665, 0, 1665, 0, 1, 3328, 1665, 0, 1665, 0, 1, 0, 1, 1665, 1666, 2, 3328, 3328, 0, 3328, 0, 1665, 1665, 1667, 1666, 1, 1664, 1, 0, 0, 0, 1666, 3328, 0, 0, 1664, 1665, 1665, 1666, 1663, 0, 2, 1, 1665, 1666, 0, 1, 0, 1663, 1665, 3327, 1, 1664, 0, 0, 1665, 1665, 1665, 3327, 2, 1665, 0, 0, 1, 3328, 3328, 3328, 1665, 1, 1666, 0, 0, 1664, 1664, 3328, 3328, 1665, 1664] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [3281, 128, 2753, 3109, 860, 1722, 634, 2516, 1209, 720, 3020, 2726, 666, 1148, 3083, 103, 1465, 517, 2512, 137, 1431, 3104, 560, 1846, 1736, 460, 1227, 2191, 1674, 2544, 1952, 1440, 3062, 2738, 2472, 1475, 2942, 2733, 3182, 3301, 9, 1450, 305, 1461, 464, 494, 3280, 366, 231, 2244, 2201, 3134, 1809, 2362, 2424, 2000, 922, 2248, 397, 1657, 1768, 801, 1845, 2747, 3153, 125, 2933, 79, 2206, 476, 3015, 1147, 2344, 699, 905, 2860, 2444, 45, 2290, 316, 410, 450, 2982, 278, 368, 1331, 2969, 1242, 2899, 1397, 566, 588, 2702, 3273, 2729, 1845, 595, 1707, 2428, 2479, 1286, 31, 1730, 1231, 1420, 3123, 3307, 602, 1092, 1572, 142, 1863, 280, 2918, 2402, 770, 2687, 1458, 403, 1413, 1581, 2369, 131, 881, 1165, 2006, 47, 3145, 3181, 1135, 3130, 564, 2403, 2748, 556, 194, 2952, 1852, 2536, 2809, 120, 2594, 631, 957, 1534, 1240, 1111, 1166, 1134, 1312, 2353, 64, 960, 1032, 1853, 2046, 2907, 2564, 1172, 2510, 2381, 2236, 1035, 3051, 2597, 784, 2953, 2398, 944, 2489, 522, 2569, 2504, 2134, 2031, 1780, 2899, 3248, 1838, 590, 866, 3055, 3058, 1667, 589, 447, 2243, 1413, 869, 2620, 1186, 2509, 28, 1332, 2337, 2475, 2030, 309, 2611, 1755, 969, 518, 2218, 60, 1169, 2317, 1761, 2493, 43, 2552, 3232, 126, 2940, 3142, 674, 2490, 2515, 887, 562, 2402, 1809, 2755, 1114, 254, 1815, 1772, 1548, 460, 2554, 304, 1044, 1546, 145, 556, 583, 542, 3111, 67, 461, 106, 687, 2033, 731, 2959, 3055, 830, 3085, 2024, 1895, 2795, 956, 37, 448, 2605, 1222, 2480] + +KBar: 72A437218AD22B2318C371896616F14B6E85EE8CED6FC1D3B87199B9522E59D4 +cPrime: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 + +Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt new file mode 100644 index 000000000..986ce7a20 --- /dev/null +++ b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt @@ -0,0 +1,64 @@ +Encapsulation -- ML-KEM-1024 +ek: 27669A667667B8D5466858602260115B6209BC2C45DF7A4E64932B75C78B9F7083F131BCD4E20EFF8CCF69736BDBC88406F9B69AD3CE356A0F5E676DD0A7C4ABB1A1C9D62021BB384A4014FB04CD2F821890D90427C49F4A628ECEC2731FAC025237360D582CD06647B1109AA6C2AC5D433758C1CAA53555FFF577EBB521FBE32D10F790604C53C2F82C17B08EF3625674214844906DB3FB9520031422A13BD7612D4201C27D15B9D194830CC3669BB8BA34C2523764413971C40D84AEE65675D5215309DA8367F001497546ECE07CBF002D781B830682484080AD6F9558B36B6BF610917130B7419B39F85029621264CF2C8AE4D808387B20CC5AA0B969C39BC80E6CB9CA0351A3F60ACEAF12BD41FA0996E39906A9B61697B747C2031C760288364457425BBBB40F4898AD085876608A77A5EB9D124BC9922651B76395881558CAD06F3C4BCF08E45B67BA516038A364B7740E9740EE2B93C5C65F49020AD42B3C0AEA5BF242A4F1B089B5A3458BE8A371CA1F293C53F2780ECE281293D991E6E579042BABC169724F10681FD1C7D2FB1648B0BF80818A7DD3B709734D38972E3E44875AF0927A9AADE82613FCA05EE5B3210647A5632AA170D09E70B56A2F04337A337EE952383A1A8AEEA6CDB90CCD86A818D1BB39465BA313D266BBB10581FA187D926AC3A8B749F64445FAB56C9927555793FB4ACFB039B1AA543B1B87AE6A49AB562933C4C97BD74C07BF29851A469851A982595596FE7ACAE0DB23533028AA34676F7A9B29263E7AA27900104B1BA1B5674739B2FC4ED8A330BBA5A0B6247C63F1153DA01DC8F616F10483A693A634C1BA6AE1AB2F163400BB5771E70171FCB54155ABFCB2044FCB30BAD67F742183861819EDB1AA6C771FC8E11A92E08B71F40D036C15D2896A204725BA90A03B478D98C49084382F1D223FE12980E947A415E55FE67B85DA40441342445B46C2FC42020D04769A2A1C64641F0C36636BA6C4652B267A4B9219E333A06817B5817B6E6CC485E352614169ABC20E1891B7A000C52AF15A7B904C976C1BFD3A2377EB76B55033C7C4C69E7174AAF27715756316CACCCE63A5A22435C7D1020443AA71693BF062303D13331F795424C20D266C1D90305FC8C2536684A93D506DE6329B6162405999BD5CAA7DDB9613C8238CC6D335A1EB4082E7710D079F87A4BFF6478B5F0C587786AF427192D9A34A4FA33BF0D3CC58FB463B4838CA2C337E65397DA15690C52AC0E5468BDC03DF5A62F7020934E267E0F7CF95599435F952FAB74CFEB4308B173F12E073F7F040DB4C63C1C48A7B7A41F4779A6B57A922C970771180008493D4C76805400B7C664D0B92B22C49551B1247E62C85E1E540C82093371013C4676CEAD77C5F3064A37349C7165EB3AA7DEF8731E9D66A56368F195C045B2A50E59786161A630D280089801298C130E4483150CA9152C2A0F247750C062259B84C28236C3FB54625D5CDBECC68DBA22FB1558055FB9B243501C75851E76ABE4847B9B972A73411A6B4282BF5983A82DA7413E54BA35BAB37A9B3C62884B643C134165C9870C6BB390F6B7A1E5745158FB251D6909433551FEBD30BA575A1E2F10958498D9F147ED9531322A16097F55D811795457912912B1C65F38025429B3E764A2E1ABC4E30C288082742995590981C43DBB365966BCB9720B178C5EB963B82934C02814B7525546DB7C96D65822E4942E4A4AC13C99490E7AB4A702371F21316A57906B19258428801192567C2045BF8775CF58C5DB28BA1B05E042A1859E64286B5B114F39FCACC127BE63DFF590BC184B83B168C30199890374100E40D2FC7752B1430355022F3D58925D1991BF3B98A90395F8579646C8413BAB3C0C0707A238A27D09FA57A32FF85392FD08C2F2286ABDB2B6936B9D3503802C6B51E415B81673CC78054F1B2C4BDFA733E5264C55A7C4DA5B73944402462033D08AE620BD05644B477AB315E936D3F25B5BA7AC19EB559A5C1195F568B313C2675092E6DF58FF399C42CAB6363AA033691CB8CE06699E701F2B92597CB8FC23516E9F40CE75B7BC1E0520A5A3895EB7D8D474009A0CB0ADC2DF476B5164112C3B600B6776DAB49B20381A4014691652A3C3161AAC6616CFAA265638C6C665A8454F36780B789CFA35D2AF49E6D5F482BFA3C864B0EF29E18D2EFFF92DB1876A22076AB1AAC0A7393ED9E5A48 +m: 034FF14A56249C2521D4279EBA3D04931CC892BBC45002B5B33D9F0188ACBAF6 + +K: 46C200F3F6EE8E11D47653801E3482241CB783B9D794EB116A4BDA085AEB6BB7 +r: 8A6BF0ABC0660F5EAF82FC503DA73AA76A2BD0D8E85424D27F4F750AC3CCE15E +tHat: [[1575, 2470, 1638, 1655, 1464, 1133, 2152, 1541, 34, 278, 603, 150, 3260, 1106, 2783, 1255, 868, 697, 1909, 2236, 159, 2103, 497, 3011, 724, 238, 3327, 3320, 873, 1719, 2267, 2124, 2310, 2927, 922, 3309, 2613, 246, 1886, 1750, 2000, 3146, 427, 2587, 1737, 525, 2849, 907, 74, 324, 1275, 3280, 559, 392, 2448, 77, 1063, 2556, 586, 2278, 718, 1852, 3103, 42, 1874, 867, 2061, 709, 1744, 1142, 177, 2465, 678, 2764, 861, 884, 344, 3244, 1445, 1363, 1535, 1919, 1515, 539, 1019, 734, 1808, 2319, 3168, 1332, 2242, 719, 23, 2283, 755, 1382, 372, 1154, 68, 1753, 2995, 2399, 800, 320, 290, 954, 471, 726, 322, 3104, 1405, 2961, 1233, 2105, 780, 1644, 2203, 2987, 564, 1324, 1079, 1046, 313, 3143, 1037, 2792, 1766, 1877, 469, 1330, 2569, 2109, 103, 31, 1353, 1127, 236, 1998, 191, 720, 2936, 2097, 518, 1160, 64, 2776, 1391, 1417, 2995, 1718, 246, 2321, 113, 2931, 2881, 921, 248, 661, 610, 1601, 3279, 2210, 2276, 141, 2872, 519, 2764, 2565, 2489, 3126, 2203, 236, 2412, 3243, 259, 2613, 2806, 3296, 687, 3025, 2625, 159, 918, 2462, 2310, 2922, 1814, 2937, 583, 60, 1564, 39, 1672, 1091, 599, 1460, 1211, 251, 2120, 2777, 2056, 1893, 2656, 1912, 2981, 2526, 2834, 3220, 1682, 1298, 951, 2390, 1416, 1409, 202, 1789, 2876, 3316, 1032, 1470, 2663, 1307, 2144, 2611, 1892, 1867, 1806, 1033, 3054, 2354, 1733, 1532, 585, 160, 3028, 962, 2570, 1470, 754, 2628, 241, 2203, 949, 1114, 2187, 2622, 2673, 508, 3113, 1331, 2290, 231, 2254, 290, 2451, 2333], +[1510, 1950, 2820, 2738, 2497, 1830, 79, 1665, 287, 3197, 3026, 367, 72, 3067, 384, 2216, 893, 2941, 777, 1239, 1848, 745, 1086, 2164, 90, 2351, 2682, 2777, 1768, 306, 252, 1514, 997, 539, 1798, 2644, 2659, 2578, 112, 2541, 1392, 1707, 1071, 816, 890, 2019, 745, 901, 2618, 2209, 1774, 3290, 3257, 3280, 2182, 394, 3025, 923, 2886, 2613, 531, 1645, 443, 91, 2689, 399, 637, 1705, 2243, 2938, 1609, 1103, 2629, 2911, 2412, 633, 1877, 2357, 2811, 3316, 2480, 2835, 1194, 949, 1819, 2792, 2410, 2740, 2390, 818, 2500, 1980, 3287, 116, 2495, 2130, 1562, 2436, 2385, 2090, 1369, 2405, 2814, 3239, 3040, 573, 83, 643, 1194, 1651, 2671, 2487, 1577, 994, 634, 1946, 0, 1201, 283, 2906, 1895, 916, 3250, 1263, 984, 778, 1467, 2570, 1206, 1986, 355, 351, 61, 474, 1736, 367, 1265, 2096, 934, 2665, 308, 2988, 362, 2750, 1583, 833, 2816, 1403, 1905, 30, 3185, 2911, 1345, 2741, 764, 75, 2895, 780, 1722, 2045, 372, 2098, 2182, 401, 493, 2731, 1900, 503, 456, 430, 146, 2238, 1137, 223, 3075, 342, 2514, 1704, 1824, 596, 186, 2569, 1851, 2260, 1176, 2316, 2180, 755, 541, 1010, 2529, 2050, 2025, 2628, 1301, 1534, 3046, 2135, 218, 1092, 531, 1092, 1627, 3108, 764, 36, 1037, 1888, 2714, 450, 1124, 502, 1548, 1587, 1643, 3146, 2917, 610, 2938, 2340, 793, 830, 2208, 374, 437, 1976, 3182, 3142, 901, 1326, 353, 1684, 683, 236, 280, 2937, 160, 3152, 298, 1455, 123, 1225, 3223, 438, 2813, 563, 2935, 1902, 181, 821, 1223, 3180, 414, 1863, 682, 1919], +[1301, 1591, 2582, 3276, 974, 2646, 1186, 850, 455, 45, 772, 2724, 2417, 950, 752, 774, 829, 817, 2335, 1351, 548, 220, 3110, 470, 144, 1523, 712, 1340, 1126, 2712, 61, 1749, 742, 2483, 609, 1030, 2393, 3033, 2652, 2010, 1755, 313, 968, 2242, 966, 861, 2977, 1038, 1922, 1822, 1805, 2544, 1159, 3066, 2038, 2228, 3167, 1408, 1655, 2808, 322, 2343, 985, 1194, 847, 954, 1008, 3277, 2904, 1135, 2107, 900, 3274, 818, 1406, 918, 381, 1386, 1424, 684, 1472, 1134, 3211, 61, 2783, 1573, 759, 144, 564, 1662, 2016, 3327, 2453, 2373, 2357, 1327, 2042, 1227, 1278, 779, 1931, 1009, 18, 1854, 247, 1039, 3291, 1588, 1217, 2220, 2683, 1047, 2036, 2471, 1899, 2709, 2338, 1804, 375, 2049, 1024, 2360, 2004, 1676, 5, 180, 1660, 1238, 523, 2857, 2348, 1364, 539, 1137, 3302, 2130, 1505, 1038, 200, 2354, 55, 305, 1988, 1734, 2026, 1997, 95, 1603, 931, 1175, 1735, 1505, 2739, 2010, 2031, 792, 1769, 1709, 1622, 2291, 3097, 69, 2651, 1282, 2021, 2153, 2582, 1585, 2061, 2, 137, 296, 408, 780, 2276, 788, 2640, 2332, 594, 2572, 2034, 1876, 1548, 544, 2137, 1227, 808, 1730, 1343, 1131, 1317, 3293, 3262, 1676, 731, 762, 1457, 2053, 2901, 2495, 1316, 19, 2247, 1301, 2791, 3046, 1864, 2964, 697, 2679, 308, 2657, 2228, 690, 2293, 937, 2690, 1869, 1299, 1214, 2979, 2741, 2359, 2874, 2246, 2114, 950, 3092, 1588, 1473, 152, 3175, 2491, 243, 2667, 487, 1367, 340, 655, 1307, 214, 2377, 1331, 501, 1003, 189, 1445, 2583, 482, 159, 2392, 2260, 1183, 2017, 985, 309], +[290, 1546, 1431, 1503, 1921, 2385, 2373, 295, 2961, 450, 869, 2063, 549, 2484, 1598, 1191, 2606, 3009, 78, 3107, 2184, 624, 2370, 1369, 2192, 457, 2883, 2877, 1637, 1721, 1995, 521, 2225, 3159, 1771, 953, 898, 1225, 258, 1208, 1397, 1346, 1901, 3227, 1389, 2086, 2350, 1060, 1252, 2762, 2323, 2380, 1936, 2750, 74, 567, 625, 319, 1302, 1946, 262, 2347, 600, 2180, 2305, 593, 615, 76, 2139, 1919, 1372, 2255, 605, 2235, 161, 1515, 2564, 386, 1625, 1070, 1414, 2843, 788, 2559, 3274, 300, 1659, 990, 2559, 181, 1217, 2952, 1595, 2241, 2352, 2433, 1936, 1043, 1024, 222, 1839, 1884, 1067, 769, 53, 549, 1523, 2205, 293, 2461, 795, 2975, 138, 921, 1375, 1944, 3172, 2118, 2579, 2875, 192, 1804, 890, 2210, 39, 2557, 2725, 807, 1535, 920, 47, 2253, 559, 2146, 2987, 701, 1641, 2963, 211, 901, 1538, 2908, 286, 1460, 1921, 966, 199, 1352, 753, 3147, 2749, 1855, 574, 1605, 2757, 1989, 1357, 2938, 1081, 1028, 548, 54, 2109, 2784, 2914, 3328, 1110, 2884, 2935, 794, 862, 1753, 1343, 2898, 2746, 3095, 1438, 1435, 421, 412, 1631, 2229, 3121, 611, 2421, 736, 1389, 2303, 2547, 3145, 2860, 1594, 2659, 58, 310, 3257, 140, 1646, 1945, 30, 2546, 603, 2967, 2300, 1474, 355, 1257, 207, 3047, 1973, 193, 1326, 2570, 901, 2965, 2014, 1933, 1028, 9, 3258, 3082, 733, 1780, 2903, 278, 292, 1731, 11, 1974, 1751, 2475, 2852, 259, 2632, 1537, 2324, 2661, 962, 305, 2726, 454, 1734, 762, 1626, 3171, 1736, 2662, 2117, 852, 1663, 1920, 2203, 975, 1498, 1066, 2543]] + +bHat = aHat^T: [[[1596, 166, 2137, 2913, 2171, 2784, 98, 1417, 3000, 1618, 389, 1082, 698, 2456, 1546, 1879, 1476, 1505, 253, 1946, 2617, 1049, 1030, 843, 1737, 1130, 1534, 2075, 333, 2836, 3098, 2545, 1405, 1599, 875, 934, 1448, 2461, 2195, 1386, 934, 390, 2440, 1968, 2256, 960, 733, 901, 3052, 266, 1081, 2479, 232, 1555, 1694, 3051, 1877, 65, 2794, 524, 627, 1155, 2873, 2252, 2479, 3087, 433, 2665, 431, 2806, 3032, 2107, 2170, 747, 2505, 3199, 1197, 1621, 263, 694, 2398, 622, 1469, 1509, 794, 2227, 1861, 1426, 2700, 99, 2717, 2351, 396, 1696, 882, 1892, 1147, 1040, 479, 2515, 2940, 259, 2745, 399, 1364, 1103, 410, 781, 2815, 2477, 1635, 2780, 1096, 3064, 785, 484, 2168, 2426, 1858, 3117, 1632, 543, 369, 3113, 3030, 2921, 758, 3176, 609, 2454, 3051, 2209, 1112, 1291, 2055, 3136, 3007, 995, 2647, 3179, 731, 1932, 276, 2695, 849, 3325, 1137, 2638, 2292, 1922, 1928, 3284, 1123, 2278, 2721, 1556, 1571, 2421, 2737, 578, 656, 2725, 3105, 1246, 217, 2019, 752, 3150, 310, 3241, 1335, 34, 220, 629, 2425, 2803, 439, 2208, 2398, 3001, 1840, 1937, 1472, 1139, 1431, 2934, 519, 1539, 554, 94, 273, 1015, 2142, 3198, 1325, 791, 2864, 1562, 685, 1097, 1253, 2870, 2492, 2970, 2159, 401, 2843, 3250, 2194, 211, 2734, 1246, 2450, 2960, 1153, 929, 1165, 2438, 3145, 381, 2831, 1063, 436, 2205, 362, 2615, 1057, 2712, 1897, 1491, 893, 869, 404, 490, 3205, 1272, 2492, 904, 1765, 1996, 92, 1555, 885, 1577, 530, 1226, 1824, 1342, 3315, 2765, 2350, 1384, 713, 2605, 3294, 2813], +[326, 286, 474, 255, 188, 2276, 1226, 3148, 1420, 880, 812, 1837, 1553, 263, 2959, 3060, 54, 355, 2367, 820, 2668, 2969, 1728, 408, 3122, 1251, 1078, 1983, 938, 2492, 3315, 877, 321, 2522, 3057, 252, 2960, 1050, 3230, 1128, 3131, 1411, 2373, 3050, 1821, 3191, 1236, 2236, 3048, 106, 1559, 925, 116, 1976, 2069, 2884, 2308, 1281, 2983, 599, 3045, 369, 227, 2771, 1683, 2977, 2722, 1788, 535, 2751, 1272, 1407, 1059, 1642, 2166, 1776, 2215, 3251, 1673, 2074, 1810, 487, 364, 2356, 2234, 1012, 2346, 270, 82, 3190, 810, 1349, 161, 2091, 1671, 677, 1888, 1560, 2664, 1684, 1044, 232, 356, 2750, 188, 132, 426, 449, 2983, 1903, 1253, 1802, 864, 222, 2370, 3251, 989, 1291, 3073, 854, 1200, 2325, 2939, 1221, 205, 1373, 1102, 921, 1115, 1733, 1187, 3209, 1318, 970, 1062, 1972, 2525, 1966, 3230, 448, 2847, 522, 3156, 855, 2078, 1390, 461, 642, 1760, 568, 212, 2529, 665, 2532, 2451, 293, 352, 1344, 740, 1848, 2749, 857, 602, 172, 232, 1064, 1615, 3010, 1848, 2265, 210, 1008, 2368, 2876, 2552, 2055, 2123, 2095, 2164, 2177, 3147, 948, 50, 1486, 410, 619, 856, 105, 2018, 327, 2979, 806, 700, 2181, 1048, 1069, 2256, 2391, 2265, 874, 1830, 3107, 2170, 2601, 3044, 3109, 128, 3292, 285, 306, 3085, 240, 1101, 2412, 511, 3021, 175, 225, 2269, 1790, 2171, 971, 966, 3096, 1015, 3222, 621, 892, 3227, 1766, 2783, 1026, 1868, 2559, 78, 2655, 2271, 1728, 423, 327, 1603, 1192, 1397, 1368, 216, 2771, 202, 2822, 441, 427, 2315, 1095, 1104, 2640, 939, 954], +[2304, 262, 1834, 801, 2275, 286, 2335, 2942, 2851, 2246, 1255, 1520, 1021, 990, 3051, 2949, 2904, 1963, 0, 1581, 910, 795, 2111, 3256, 2929, 531, 136, 28, 123, 2185, 984, 1609, 965, 2068, 742, 119, 1595, 3008, 585, 1428, 400, 2525, 538, 62, 2585, 2448, 277, 2010, 1256, 1090, 3303, 1341, 2800, 1149, 833, 1578, 544, 15, 649, 2807, 2929, 1755, 2170, 3321, 200, 230, 3323, 1134, 1399, 2363, 109, 2979, 1425, 2608, 741, 2765, 887, 2764, 165, 731, 1005, 578, 1297, 259, 105, 77, 3207, 2526, 846, 1758, 1552, 596, 3167, 2723, 202, 1116, 1324, 2725, 3158, 1523, 336, 1042, 414, 1355, 166, 2971, 662, 2018, 174, 1754, 3290, 20, 1458, 719, 2436, 781, 1797, 1759, 2981, 673, 2252, 1515, 1705, 318, 1816, 134, 426, 1564, 1395, 665, 2143, 1311, 2596, 361, 2335, 1660, 1711, 2211, 13, 288, 431, 2911, 1340, 1202, 1594, 205, 1503, 692, 1459, 2459, 1149, 2902, 1524, 1298, 170, 1090, 1635, 549, 2167, 1557, 1673, 437, 2738, 2835, 1004, 1618, 566, 282, 2191, 2888, 1707, 2791, 827, 2242, 1872, 1392, 2516, 829, 1817, 480, 1163, 1400, 1224, 1727, 120, 2934, 3186, 272, 2478, 1131, 1923, 516, 1710, 452, 1418, 2533, 633, 2716, 1925, 1962, 1897, 2446, 3135, 972, 677, 511, 157, 585, 88, 1963, 2920, 2406, 1757, 724, 202, 2989, 30, 1541, 1395, 2772, 1144, 1945, 502, 2765, 1833, 1603, 483, 3286, 2403, 502, 361, 1170, 2061, 1818, 132, 2745, 888, 1152, 1965, 2589, 3064, 1221, 2634, 2914, 2760, 1594, 360, 1302, 2936, 1785, 2229, 846, 1209, 3207, 2837, 1295], +[1732, 1508, 1472, 1564, 2690, 2020, 1063, 1683, 3059, 2257, 341, 2097, 1960, 2634, 2680, 1223, 414, 3158, 1673, 2617, 2828, 2012, 778, 2605, 1170, 1119, 2624, 2699, 1294, 1474, 2531, 372, 260, 589, 1173, 776, 2827, 774, 42, 1298, 1190, 1291, 477, 1476, 1692, 956, 635, 2371, 2505, 409, 2380, 2933, 1573, 2256, 3224, 1776, 1203, 65, 2017, 955, 3190, 1453, 3226, 1254, 1568, 1790, 2185, 2714, 2984, 1664, 2394, 576, 2337, 1389, 2900, 33, 317, 2537, 1320, 44, 2510, 2721, 1528, 1742, 574, 2134, 1932, 1913, 1913, 2640, 106, 893, 2061, 2414, 3068, 2916, 286, 1577, 1743, 186, 1028, 1008, 1700, 2693, 790, 725, 2624, 2032, 2988, 2662, 366, 1926, 2331, 252, 1319, 2609, 417, 3189, 37, 1881, 715, 1880, 1865, 1715, 999, 1421, 1715, 592, 2579, 2941, 241, 2139, 1259, 1847, 182, 1395, 3187, 774, 113, 1600, 2914, 1644, 2576, 1651, 27, 837, 994, 340, 1212, 856, 355, 2627, 778, 2191, 976, 2928, 2578, 3237, 2438, 1072, 1523, 267, 1626, 759, 2718, 2606, 2037, 2156, 711, 2793, 2668, 2253, 1973, 2041, 2359, 634, 3294, 1698, 2746, 1496, 1410, 806, 1114, 2795, 1865, 716, 1521, 2974, 1401, 2716, 2752, 970, 2460, 781, 182, 1885, 1162, 3119, 1830, 1659, 2326, 3089, 2101, 1208, 1434, 960, 2832, 2584, 1417, 1407, 3034, 292, 29, 2033, 338, 2005, 92, 1660, 2218, 734, 2689, 275, 3001, 2136, 1209, 1252, 2499, 1742, 1025, 1681, 845, 1519, 121, 2231, 2696, 3273, 362, 3162, 1921, 1214, 3048, 2755, 1035, 2048, 1581, 3204, 2196, 2957, 334, 577, 3051, 2611, 2111, 2173, 583, 841]], +[[867, 2459, 154, 2063, 1119, 846, 1765, 1508, 1937, 701, 1350, 640, 884, 1092, 2013, 714, 3044, 413, 1441, 2118, 454, 631, 1334, 2704, 226, 3225, 2277, 1146, 1180, 2535, 3160, 2872, 955, 3215, 886, 838, 2297, 2854, 894, 700, 873, 2878, 2981, 319, 754, 424, 1595, 2704, 2021, 3033, 2257, 1114, 1689, 1960, 2621, 960, 1241, 2022, 960, 1863, 2691, 1909, 1072, 1674, 2215, 1403, 1226, 3141, 657, 2453, 3303, 1435, 557, 2429, 398, 512, 2956, 761, 293, 1278, 2157, 2289, 39, 711, 2458, 2286, 1941, 3024, 495, 1463, 2109, 1163, 3245, 1089, 2667, 3048, 50, 1407, 1976, 2451, 2252, 3074, 334, 538, 1693, 2198, 1061, 425, 2529, 1000, 486, 2651, 985, 1629, 2680, 2429, 399, 2383, 564, 3172, 1523, 1570, 286, 3301, 55, 1652, 2988, 2257, 1400, 1765, 3188, 735, 1280, 2502, 663, 3268, 1716, 2449, 745, 696, 1115, 1318, 3086, 1460, 25, 107, 1773, 2802, 67, 1825, 1804, 2681, 1929, 2862, 2391, 2263, 2796, 41, 1109, 2056, 2459, 369, 399, 1790, 1334, 3038, 1139, 2452, 2600, 2642, 386, 2186, 930, 295, 1388, 1527, 1763, 1280, 2408, 373, 635, 3103, 2968, 3052, 1077, 24, 660, 708, 373, 1459, 2037, 2177, 2796, 1090, 2361, 1908, 1332, 2042, 231, 292, 1150, 3125, 387, 2885, 2637, 3040, 32, 2758, 788, 1011, 814, 2970, 2199, 3164, 1817, 912, 939, 1584, 2101, 389, 1490, 2396, 862, 1985, 2915, 1481, 360, 3100, 347, 3054, 697, 1431, 1456, 1699, 1569, 1110, 952, 3262, 8, 1944, 1744, 830, 120, 2073, 2652, 3023, 1639, 1857, 2185, 1525, 2457, 1910, 3251, 2908, 931, 1854], +[1874, 1090, 3206, 1005, 475, 666, 913, 3174, 1808, 1376, 667, 1889, 1375, 3187, 1036, 3131, 2664, 2013, 3310, 2979, 2962, 1128, 1187, 1418, 1050, 1331, 3194, 2413, 2426, 706, 1413, 422, 1899, 2934, 1401, 1515, 1639, 3133, 2137, 2153, 2740, 1582, 744, 3322, 1018, 433, 1769, 2595, 520, 2684, 1155, 723, 2458, 608, 789, 3006, 1109, 1821, 968, 656, 2300, 2276, 1050, 114, 2141, 926, 1235, 152, 104, 1928, 401, 3282, 1368, 971, 2620, 835, 1520, 3124, 2728, 1842, 1710, 50, 398, 2059, 2479, 1755, 622, 977, 734, 2277, 2071, 2450, 129, 2231, 1302, 2176, 2567, 2627, 699, 381, 241, 1124, 2468, 1302, 645, 2050, 1417, 678, 3235, 950, 2007, 1294, 1036, 451, 2822, 968, 2924, 2703, 2804, 610, 2423, 1824, 652, 2482, 1334, 419, 81, 715, 2701, 985, 1572, 641, 1234, 1484, 1282, 296, 1080, 2109, 220, 2492, 2611, 2851, 3133, 1721, 1680, 2433, 204, 2611, 2846, 63, 1690, 1667, 1032, 2461, 627, 1383, 2451, 2928, 3084, 863, 134, 2984, 2133, 2442, 161, 1633, 86, 1255, 2963, 2355, 849, 206, 687, 1150, 1171, 53, 1941, 1195, 2811, 1982, 2038, 736, 2207, 3102, 1497, 328, 1951, 1674, 2774, 1346, 1969, 2278, 295, 2054, 663, 2151, 97, 1712, 2390, 2055, 244, 3152, 1314, 2546, 58, 2298, 588, 2885, 2739, 2158, 1, 2620, 2211, 83, 1974, 2234, 3068, 2247, 1295, 2540, 2471, 1452, 1382, 3210, 335, 1623, 1584, 1249, 954, 88, 1171, 2163, 851, 1195, 2071, 1269, 121, 2415, 1799, 3016, 917, 1659, 158, 231, 416, 117, 2562, 12, 88, 1433, 879, 1166, 884, 3133, 2147, 2039], +[2271, 230, 1006, 3028, 1294, 724, 986, 579, 956, 1950, 413, 1686, 281, 1401, 3037, 892, 392, 2394, 2259, 3083, 2181, 2601, 1089, 2263, 2088, 1850, 1037, 84, 488, 1919, 1917, 218, 2996, 1822, 104, 700, 1887, 1139, 2333, 1935, 2619, 223, 2036, 997, 583, 861, 1682, 3171, 2192, 1862, 847, 2573, 1319, 571, 1270, 2048, 2464, 89, 2028, 1239, 1324, 155, 3142, 920, 552, 1401, 3318, 1764, 2750, 445, 2111, 374, 2540, 1644, 2934, 2757, 2848, 1616, 2205, 537, 102, 2501, 591, 514, 2559, 881, 21, 3060, 1093, 1730, 2068, 1055, 2962, 1668, 3314, 1264, 2169, 2915, 1829, 1282, 499, 3241, 1663, 2318, 2401, 1208, 314, 1495, 2705, 1971, 766, 596, 2543, 943, 1701, 2866, 903, 2611, 2997, 1646, 1369, 1593, 817, 2368, 1955, 398, 2318, 231, 2032, 417, 395, 1175, 1298, 1627, 2565, 728, 1643, 310, 2896, 2175, 2508, 968, 1289, 1346, 3046, 765, 3027, 810, 1298, 2880, 2969, 2490, 846, 2373, 340, 624, 1996, 864, 2973, 1603, 2299, 2633, 787, 1015, 1102, 2182, 2817, 1238, 1610, 2315, 28, 546, 804, 1846, 1120, 292, 1022, 2511, 1135, 2848, 3247, 1596, 2510, 451, 115, 797, 570, 567, 2795, 111, 1891, 1183, 827, 1252, 1452, 2230, 1682, 2314, 3140, 965, 2515, 1540, 2546, 2178, 502, 749, 3109, 480, 2765, 1317, 1947, 1016, 899, 1811, 517, 431, 1419, 464, 620, 880, 486, 901, 3101, 1710, 3167, 1540, 3015, 706, 2999, 31, 1862, 1052, 2016, 1410, 2746, 1305, 812, 2694, 2056, 1777, 1149, 1817, 134, 144, 967, 4, 3142, 1919, 281, 2680, 2465, 2122, 1654, 2006, 3153, 2197], +[376, 1719, 1024, 2535, 9, 310, 820, 1549, 681, 558, 1868, 1619, 3129, 667, 1773, 2251, 2282, 597, 3153, 965, 3252, 570, 986, 1843, 2876, 1852, 330, 2692, 1698, 1761, 2771, 473, 3008, 193, 1916, 822, 378, 11, 1469, 2309, 1592, 2415, 514, 1417, 2205, 181, 2936, 2740, 3181, 2936, 196, 1409, 237, 1263, 2701, 872, 1810, 3225, 754, 2575, 374, 2608, 952, 226, 1737, 2540, 1567, 55, 2133, 820, 1313, 1181, 1593, 1492, 2597, 1760, 214, 308, 1934, 3224, 1837, 1585, 777, 3071, 1828, 1507, 117, 222, 2348, 416, 76, 3307, 3211, 3220, 1361, 2724, 898, 2848, 2291, 3128, 122, 666, 2519, 1732, 1851, 130, 2713, 1893, 3178, 3038, 1228, 1085, 50, 2596, 1101, 2151, 598, 2753, 1947, 1262, 2542, 530, 57, 2533, 1050, 123, 2318, 577, 2406, 2980, 847, 3213, 1181, 2454, 2843, 631, 3154, 288, 2088, 3208, 744, 2912, 1155, 1996, 1470, 1984, 2877, 3158, 144, 648, 1623, 1088, 2624, 1616, 778, 453, 1983, 989, 3066, 1210, 1142, 877, 791, 1308, 1700, 612, 540, 3147, 2147, 3288, 1416, 2479, 2554, 2494, 2050, 2286, 321, 1621, 487, 1002, 919, 805, 1467, 2796, 2339, 2340, 2847, 554, 2446, 611, 220, 925, 80, 320, 1630, 501, 426, 2344, 3178, 423, 1907, 2347, 662, 2479, 1059, 2696, 2538, 1739, 2114, 3253, 1966, 1467, 748, 985, 2820, 1503, 808, 637, 790, 2782, 2169, 1463, 1904, 311, 1458, 3173, 2455, 2436, 1398, 1587, 458, 593, 101, 2641, 634, 3138, 980, 277, 2731, 904, 1481, 83, 2503, 1800, 3074, 1891, 3035, 3157, 1500, 173, 1, 494, 2493, 144, 3172, 534]], +[[3256, 1412, 1157, 2871, 2908, 2935, 2445, 2517, 2735, 1116, 1788, 3322, 2762, 3222, 2304, 292, 903, 2013, 3311, 3298, 970, 2952, 861, 1193, 2507, 1395, 3081, 2610, 1985, 86, 2877, 1762, 2574, 936, 3218, 774, 1892, 642, 717, 1856, 2079, 527, 536, 311, 414, 2034, 997, 705, 1804, 1077, 2754, 2377, 100, 2461, 3083, 2501, 2432, 3044, 2423, 1772, 142, 2924, 2229, 762, 2759, 935, 2169, 1635, 2681, 2744, 1428, 65, 1416, 1752, 796, 276, 1508, 94, 601, 2459, 1748, 2994, 786, 428, 3036, 2504, 723, 782, 1581, 2046, 713, 223, 3094, 2883, 1874, 418, 1198, 947, 557, 2059, 2430, 372, 2942, 1938, 1922, 3085, 795, 2261, 145, 1857, 627, 679, 1909, 1955, 529, 1922, 2364, 226, 1616, 738, 1419, 674, 569, 1850, 1690, 2288, 2886, 2360, 3230, 2850, 2808, 2531, 2421, 2109, 2868, 319, 320, 2518, 1619, 3292, 3179, 2573, 3243, 1720, 1469, 1968, 2157, 857, 1025, 3282, 3259, 2696, 2710, 3124, 982, 859, 2631, 2495, 2897, 2786, 940, 3092, 672, 2539, 3243, 1079, 2257, 434, 2103, 1895, 42, 2653, 3058, 1442, 500, 1732, 298, 1094, 127, 558, 2647, 2609, 1596, 1400, 3142, 1634, 1668, 1326, 1682, 2095, 2939, 2326, 1460, 2679, 122, 2549, 2562, 182, 425, 2006, 82, 2252, 2949, 2174, 2420, 1099, 1024, 424, 2839, 2363, 1480, 2945, 684, 2461, 1981, 2580, 1770, 17, 3251, 1566, 441, 1348, 61, 3189, 2123, 2455, 740, 258, 2773, 11, 1548, 2899, 22, 592, 200, 778, 205, 400, 209, 1526, 2336, 1572, 2424, 537, 3232, 1320, 1035, 1657, 2100, 2873, 125, 1719, 2029, 2009, 1317, 2534], +[41, 2034, 256, 1285, 2151, 2067, 834, 2772, 2864, 2380, 3041, 650, 2684, 1687, 2070, 664, 1396, 54, 1558, 1858, 1655, 2529, 731, 171, 1066, 2956, 769, 1889, 2023, 2924, 3020, 3059, 2573, 679, 307, 2741, 244, 576, 774, 683, 1923, 965, 265, 948, 1048, 144, 1044, 1889, 2668, 91, 2877, 982, 1510, 2511, 2868, 1421, 2853, 360, 1066, 2800, 178, 293, 492, 1584, 2456, 2067, 3202, 552, 1032, 2693, 2245, 2361, 3181, 1015, 2903, 529, 3148, 289, 2527, 2146, 537, 3096, 1802, 1849, 1589, 520, 2254, 1125, 1782, 2380, 1335, 1610, 93, 3182, 1628, 82, 3058, 448, 2921, 2190, 476, 35, 1979, 1995, 1330, 1529, 922, 2558, 330, 439, 2626, 1162, 430, 682, 2990, 2644, 2288, 2702, 777, 357, 1091, 3083, 2344, 2753, 972, 2831, 1638, 2527, 2257, 614, 3029, 320, 1685, 1402, 2337, 1816, 498, 2384, 2627, 2739, 1811, 2798, 1517, 3219, 945, 2048, 951, 3043, 767, 366, 2951, 2092, 2022, 1812, 2132, 775, 3075, 3123, 1446, 1355, 1476, 1346, 3200, 3224, 2416, 1049, 1429, 2278, 260, 1510, 2027, 555, 3284, 1502, 1628, 829, 556, 332, 928, 1065, 542, 1527, 1000, 1154, 3271, 1168, 274, 766, 411, 2841, 583, 387, 1050, 1189, 829, 1996, 361, 267, 826, 1635, 647, 3056, 1728, 538, 960, 1568, 3116, 264, 836, 3168, 3144, 2675, 75, 1145, 1467, 962, 2590, 2501, 149, 619, 2218, 1831, 2576, 2960, 3008, 1772, 1341, 2024, 2952, 821, 2780, 3257, 1993, 2869, 1324, 1508, 1002, 1698, 1999, 2538, 2299, 2023, 2695, 3327, 2251, 2527, 262, 3018, 789, 986, 2343, 1497, 1024, 2006, 1576, 228], +[1264, 1853, 982, 2897, 1684, 690, 1172, 1929, 1182, 3159, 3154, 1368, 1617, 1250, 612, 93, 768, 2698, 569, 1787, 3097, 2310, 1119, 1412, 307, 2318, 85, 307, 2429, 1069, 3238, 920, 1213, 1841, 1752, 1767, 2365, 676, 2149, 503, 2194, 2359, 890, 1510, 1918, 3212, 1859, 150, 2758, 262, 2057, 3228, 1138, 2854, 1227, 851, 3328, 1438, 1840, 1705, 492, 276, 2365, 1427, 3235, 982, 882, 2752, 894, 1869, 9, 2275, 2468, 1090, 2538, 899, 1845, 2263, 1970, 1521, 1495, 2202, 1582, 222, 1566, 2721, 2368, 1968, 3277, 1674, 1789, 1305, 295, 1487, 501, 1329, 478, 1755, 33, 3178, 2591, 1531, 564, 2475, 2216, 2993, 673, 2616, 2858, 59, 3164, 383, 1217, 3251, 620, 2224, 2821, 1422, 3075, 1128, 2659, 687, 288, 1659, 115, 56, 2523, 242, 2252, 3238, 524, 2490, 2194, 699, 3301, 1566, 2334, 1649, 1198, 3071, 2620, 457, 2365, 795, 335, 1117, 1779, 689, 2771, 46, 1565, 585, 3255, 667, 2094, 1608, 166, 2541, 2497, 1421, 1822, 1990, 229, 2733, 2473, 2004, 1479, 245, 3230, 1609, 2243, 2167, 1504, 2946, 1739, 644, 2403, 2029, 537, 2803, 1610, 593, 2693, 2051, 3027, 314, 737, 697, 166, 3165, 1824, 3216, 64, 1534, 3184, 1012, 1101, 1931, 3298, 411, 3007, 1690, 901, 2191, 739, 953, 2270, 1634, 2873, 1871, 1789, 2677, 1546, 3046, 1429, 469, 1386, 2222, 2229, 1022, 995, 759, 1966, 581, 2820, 973, 416, 2070, 2039, 23, 3164, 1936, 997, 359, 2210, 3327, 3170, 1512, 2912, 2714, 1959, 1431, 1429, 862, 2424, 1198, 2660, 895, 1663, 2420, 2969, 1724, 2479, 2261, 855, 577], +[887, 1074, 3018, 81, 1837, 539, 1344, 2879, 2345, 2253, 1725, 1117, 2547, 1307, 3039, 644, 569, 1530, 3152, 3203, 2617, 594, 100, 3251, 1692, 1615, 1624, 211, 3016, 1711, 2315, 2555, 2174, 2397, 1888, 301, 1863, 2502, 3111, 990, 2551, 1333, 3220, 3059, 334, 920, 742, 860, 977, 1518, 432, 1884, 3056, 1457, 2237, 2070, 647, 2503, 1133, 48, 1923, 135, 3110, 3301, 1045, 752, 2466, 3055, 6, 505, 2015, 2858, 2846, 2470, 2887, 1147, 817, 277, 71, 26, 2017, 104, 3231, 2363, 1968, 2968, 3052, 2882, 1247, 2945, 3142, 3090, 2552, 3232, 1585, 863, 793, 808, 944, 514, 2259, 343, 452, 3165, 2686, 1413, 412, 59, 3274, 1230, 2528, 2772, 1233, 2672, 2127, 773, 864, 1860, 1898, 1931, 838, 162, 673, 3152, 1994, 2406, 2283, 2076, 3008, 615, 112, 1365, 2030, 3308, 1574, 2361, 93, 1701, 2380, 1890, 3152, 1971, 1573, 2460, 191, 2241, 674, 3111, 1657, 1557, 982, 1777, 2589, 633, 499, 1273, 2809, 533, 1732, 1129, 563, 33, 1882, 371, 2383, 423, 1643, 376, 1286, 2727, 17, 1822, 2652, 1239, 2159, 2859, 2359, 3048, 2656, 3184, 940, 1203, 719, 88, 1272, 483, 717, 789, 238, 1387, 1330, 1999, 2229, 1214, 1673, 1435, 3057, 1092, 1906, 2316, 960, 830, 1503, 1066, 1051, 340, 1598, 681, 1459, 970, 1421, 3097, 2004, 3258, 2411, 627, 1745, 585, 1316, 649, 1374, 2625, 2042, 2801, 793, 1156, 2998, 3026, 1532, 1216, 1831, 1077, 2314, 2736, 1672, 2440, 819, 2769, 751, 2337, 2606, 1808, 108, 3200, 2220, 1366, 778, 406, 847, 2422, 570, 3207, 705, 1727, 2319, 1485]], +[[2956, 2744, 2646, 1052, 2049, 587, 782, 1688, 47, 347, 1187, 2560, 3010, 2052, 580, 2356, 1623, 98, 1400, 960, 2216, 1701, 667, 3230, 474, 3145, 2220, 3283, 3025, 2462, 2293, 2593, 1746, 444, 3186, 2338, 1372, 32, 598, 1387, 169, 1435, 2638, 1518, 1094, 2023, 2598, 2795, 1853, 273, 241, 1158, 1844, 2151, 775, 1477, 2683, 2007, 3143, 562, 3002, 2787, 2843, 887, 2685, 2994, 903, 2383, 1956, 2741, 870, 3128, 1322, 658, 2565, 300, 2834, 2250, 194, 2023, 2595, 2220, 2241, 1336, 661, 1583, 2866, 437, 2487, 2439, 2826, 491, 1575, 1139, 1499, 2996, 2635, 1122, 2239, 237, 2416, 2681, 384, 2224, 3088, 2225, 2121, 1815, 916, 3294, 1581, 2158, 999, 2320, 2150, 1126, 681, 1987, 1384, 641, 3062, 1519, 1166, 2074, 859, 2588, 616, 1220, 1586, 450, 1537, 1400, 2887, 3079, 2944, 1810, 2175, 2691, 1316, 332, 73, 1421, 55, 2032, 254, 1352, 2605, 637, 649, 3220, 1217, 2319, 3061, 535, 2298, 585, 3132, 1129, 1178, 2871, 81, 1808, 2410, 2987, 1663, 1022, 2431, 3049, 625, 1888, 2510, 1925, 900, 2652, 97, 1084, 374, 250, 2444, 3079, 2087, 507, 3115, 1133, 977, 565, 1115, 107, 3030, 2384, 836, 2536, 90, 2678, 518, 1892, 2408, 167, 1662, 320, 2116, 2375, 859, 2159, 2706, 1424, 319, 1316, 2517, 2150, 577, 407, 168, 910, 107, 535, 249, 3112, 388, 839, 510, 2423, 1769, 2288, 2205, 347, 1782, 1000, 2316, 1271, 728, 279, 3327, 542, 1500, 2144, 2622, 1700, 440, 217, 1232, 302, 1187, 206, 1090, 2052, 1927, 407, 527, 3324, 1627, 3151, 1080, 2646, 1280, 2663], +[1938, 2889, 762, 3213, 3128, 3238, 3240, 141, 978, 3260, 3073, 2367, 739, 2139, 2363, 1280, 128, 1091, 2084, 52, 3113, 841, 488, 2846, 1234, 940, 981, 1561, 2118, 1290, 2368, 2210, 1683, 1659, 1208, 1072, 1810, 1917, 886, 1873, 1276, 3101, 796, 1854, 613, 814, 1502, 2709, 1534, 357, 1250, 430, 190, 491, 2734, 1635, 1683, 1128, 567, 1347, 592, 1075, 249, 3011, 645, 1917, 2360, 2703, 537, 458, 3076, 1970, 2132, 2019, 2729, 1581, 362, 3230, 2948, 3012, 2422, 974, 440, 2249, 816, 3290, 2347, 2334, 3037, 1572, 1581, 2208, 561, 553, 1830, 1234, 3249, 1115, 838, 36, 2338, 2738, 2080, 3249, 2055, 844, 1813, 3058, 1166, 1112, 2769, 1860, 2391, 2632, 1583, 1527, 1092, 529, 2270, 382, 761, 3053, 2024, 1236, 2909, 3210, 2843, 603, 2655, 2468, 1039, 1251, 1161, 918, 2686, 451, 985, 3229, 2735, 974, 819, 1687, 2820, 61, 743, 887, 2358, 2664, 2544, 1465, 2609, 3175, 1414, 755, 2810, 3030, 1223, 774, 2454, 2843, 2800, 1722, 2966, 1738, 729, 1163, 485, 953, 2028, 1074, 434, 153, 97, 2185, 951, 1683, 1366, 2291, 907, 605, 1722, 1373, 1197, 571, 2974, 2349, 2832, 1674, 2740, 151, 3000, 2163, 727, 1317, 2949, 3034, 2810, 1760, 2929, 3317, 1614, 1390, 1039, 3143, 1137, 2475, 3018, 2063, 2717, 3270, 1995, 224, 2902, 2393, 21, 332, 2490, 1538, 3028, 2626, 2144, 3170, 2540, 1635, 2423, 214, 3165, 3316, 2596, 974, 2135, 804, 1282, 714, 904, 2408, 1086, 374, 722, 2173, 3248, 3161, 600, 963, 946, 327, 868, 1306, 71, 566, 1891, 2864, 100, 970, 536, 1156], +[1079, 835, 3192, 2207, 1405, 2431, 2088, 2296, 1745, 1733, 62, 3022, 2033, 1702, 2802, 1572, 1967, 2146, 88, 1099, 3180, 2543, 3281, 415, 2252, 1666, 2565, 1977, 1484, 2383, 191, 2587, 711, 975, 2854, 474, 1083, 2241, 1488, 1336, 473, 2322, 2189, 2977, 73, 1623, 2933, 3089, 1499, 1916, 1261, 1038, 1780, 1375, 417, 2103, 3154, 3212, 1661, 1024, 3249, 2405, 2613, 1845, 769, 1334, 438, 2633, 2698, 803, 164, 2912, 2342, 834, 710, 543, 2478, 1015, 806, 913, 2278, 1453, 543, 1093, 375, 2411, 2800, 582, 2010, 886, 3246, 2816, 96, 2696, 3312, 551, 73, 2224, 1658, 349, 1595, 1965, 9, 814, 1678, 3034, 1168, 1472, 2642, 840, 148, 2025, 1438, 331, 1622, 475, 775, 3311, 466, 21, 941, 1834, 205, 710, 859, 2954, 915, 143, 246, 71, 3325, 1116, 3020, 628, 2015, 637, 2070, 1517, 1728, 2834, 1785, 3001, 2437, 2904, 1174, 1740, 1339, 1089, 1185, 2107, 814, 2432, 1553, 2091, 880, 2052, 1886, 2821, 1352, 2545, 2699, 3137, 842, 2402, 186, 764, 1538, 1857, 1140, 906, 1861, 2120, 463, 854, 58, 368, 1514, 228, 2193, 197, 1535, 2356, 3140, 2935, 376, 1160, 2248, 275, 1532, 1900, 2296, 2437, 2794, 178, 249, 216, 2806, 2043, 993, 1858, 1552, 372, 108, 2362, 2346, 1136, 675, 2095, 1456, 3064, 2680, 2244, 136, 920, 1214, 380, 2802, 1041, 693, 2446, 951, 2764, 355, 2531, 707, 641, 2519, 3144, 674, 1104, 509, 3150, 150, 1889, 858, 70, 1545, 712, 4, 1827, 2627, 1988, 3120, 1808, 2328, 1049, 3071, 455, 3278, 1876, 1446, 1090, 2901, 2976, 1448, 1925], +[2192, 2394, 3045, 1041, 2255, 2164, 2168, 1421, 708, 1046, 2571, 2080, 391, 2271, 1998, 772, 251, 1508, 1377, 1610, 1582, 169, 1903, 1253, 2187, 2718, 2638, 2088, 3253, 332, 2647, 2457, 1904, 2140, 1655, 2071, 2489, 3115, 861, 1395, 219, 49, 67, 1335, 983, 820, 1354, 1304, 2208, 1907, 2364, 2977, 885, 2566, 1014, 1253, 414, 1961, 2695, 426, 182, 1505, 1354, 2693, 2580, 3183, 253, 3308, 895, 1761, 983, 1709, 40, 2188, 216, 2172, 1369, 1639, 109, 1916, 718, 177, 1754, 1518, 2487, 1611, 670, 297, 123, 159, 710, 2589, 296, 2863, 1572, 2895, 312, 2306, 2473, 44, 3157, 1761, 1416, 1158, 887, 1745, 1762, 272, 560, 2794, 3228, 373, 715, 2745, 645, 2513, 2256, 903, 1928, 1603, 1365, 110, 2754, 2264, 3062, 3091, 3099, 3234, 166, 49, 459, 483, 1835, 2884, 395, 802, 2690, 1005, 2556, 1318, 1428, 790, 1200, 2239, 430, 1310, 952, 2798, 1767, 3266, 2216, 368, 1127, 899, 2853, 1394, 2395, 561, 2213, 782, 1498, 1533, 364, 2335, 1646, 1239, 931, 2893, 2365, 3123, 346, 1194, 868, 115, 103, 1420, 1851, 938, 1192, 1571, 2394, 2010, 2475, 1281, 124, 1042, 2064, 1391, 3059, 2824, 815, 29, 2758, 2435, 1058, 968, 1324, 1141, 3231, 2260, 1515, 2698, 2040, 1948, 986, 2474, 2428, 1270, 3133, 1347, 1570, 3222, 2877, 2574, 712, 1697, 58, 2862, 2634, 631, 2186, 1915, 1702, 1788, 1987, 3289, 3184, 2398, 726, 775, 1612, 1184, 1064, 3171, 2943, 2840, 3306, 3306, 430, 1675, 263, 956, 7, 2571, 1364, 1553, 124, 2442, 498, 2560, 2977, 944, 10, 268, 1759, 1297]]] + +r: [[1, 3327, 1, 0, 0, 1, 0, 0, 1, 2, 0, 3328, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 0, 3328, 0, 3327, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 0, 2, 0, 0, 3327, 1, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 1, 0, 1, 3328, 0, 1, 0, 0, 1, 3328, 3328, 3328, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 0, 3328, 1, 3328, 3327, 2, 3328, 0, 0, 0, 3328, 2, 3328, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 3327, 3328, 0, 3328, 2, 3328, 2, 0, 1, 1, 1, 3327, 0, 3328, 1, 1, 1, 1, 3327, 0, 1, 0, 0, 0, 1, 1, 0, 3328, 1, 1, 1, 1, 1, 0, 1, 3328, 0, 3328, 1, 2, 0, 3328, 3328, 1, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 3327, 0, 1, 1, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3328, 2, 2, 1, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 2, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 3328, 1, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 3327, 0, 0, 0, 3328, 0, 3328, 3327, 3327, 1, 0], +[0, 0, 1, 1, 0, 1, 0, 3328, 3328, 1, 3327, 3328, 0, 0, 1, 0, 3328, 3327, 3328, 3328, 1, 1, 0, 0, 3327, 1, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 2, 1, 3328, 3327, 3327, 0, 1, 3327, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 3328, 1, 3328, 0, 3328, 3328, 0, 0, 0, 1, 1, 0, 2, 3328, 1, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 0, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 3327, 0, 3328, 0, 3328, 0, 3327, 1, 0, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 0, 1, 3328, 0, 1, 3327, 1, 3328, 2, 3328, 1, 0, 2, 3328, 1, 0, 3328, 1, 1, 0, 3328, 2, 3328, 1, 0, 1, 3328, 3328, 0, 0, 1, 1, 0, 1, 3328, 0, 2, 1, 3328, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, 1, 1, 3328, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 1, 3327, 3328, 1, 2, 2, 0, 0, 0, 1, 3328, 1, 0], +[2, 1, 3328, 3327, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 3328, 3327, 0, 1, 0, 3328, 1, 1, 0, 2, 0, 3327, 3328, 1, 2, 3328, 3328, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 0, 2, 3327, 3327, 0, 1, 0, 1, 1, 1, 1, 3328, 0, 0, 3328, 2, 0, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 1, 3328, 0, 1, 2, 0, 0, 3328, 1, 0, 3328, 1, 2, 1, 0, 3327, 1, 1, 1, 3327, 0, 2, 3328, 0, 0, 3327, 0, 0, 1, 1, 3328, 3328, 0, 0, 3327, 3327, 1, 0, 2, 0, 3327, 0, 3328, 3327, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 2, 1, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 2, 2, 3328, 3328, 0, 1, 1, 1, 1, 3328, 3328, 1, 3327, 0, 2, 0, 0, 0, 3327, 0, 0, 3328, 3328, 2, 0, 0, 3327, 3328, 0, 0, 1, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 1, 1, 3328, 0, 0, 0, 3327, 1, 3328, 3327, 3328, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 1, 0, 0, 3328, 0], +[0, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 3328, 3328, 3328, 1, 0, 1, 3328, 2, 0, 0, 1, 3328, 1, 0, 3327, 2, 3328, 2, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 3327, 1, 2, 0, 1, 2, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 3328, 2, 0, 3328, 2, 0, 0, 2, 3327, 0, 0, 3327, 3328, 0, 0, 0, 0, 3327, 1, 0, 3327, 3328, 2, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 1, 3328, 2, 1, 1, 3327, 0, 1, 0, 0, 0, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 3327, 2, 1, 3328, 0, 3328, 1, 0, 2, 3328, 0, 3328, 0, 3328, 3327, 3327, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 1, 0, 3328, 3327, 3328, 3328, 3328, 1, 2, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 2, 1, 3328, 1, 1, 0, 3327, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 1, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 0, 3328, 0, 1, 0, 1, 2, 3328, 3328, 0, 1, 3328, 3327, 2, 0, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 3328, 0, 1, 3328, 2, 0, 0, 1, 2, 1, 3327, 2, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 1, 0, 3328, 2, 1, 0, 3327, 3328, 0, 0, 2]] + +e1: [[3327, 0, 3328, 0, 0, 0, 0, 2, 3327, 0, 3328, 3328, 0, 0, 0, 3327, 1, 0, 1, 0, 2, 3328, 1, 0, 3328, 1, 3328, 1, 1, 3328, 0, 3328, 1, 3327, 3328, 0, 1, 1, 1, 0, 2, 3328, 2, 3328, 1, 3328, 2, 2, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3327, 1, 1, 0, 0, 1, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 3328, 1, 1, 3328, 1, 0, 1, 1, 0, 0, 0, 0, 3327, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 1, 3327, 1, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 0, 1, 1, 1, 2, 1, 3328, 3327, 3328, 0, 0, 1, 0, 0, 3328, 1, 0, 3328, 3328, 2, 3328, 0, 1, 3327, 1, 3328, 3328, 3328, 2, 3328, 3328, 2, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 3327, 3328, 2, 0, 0, 0, 0, 3328, 3328, 1, 0, 0, 0, 2, 3327, 0, 1, 1, 3328, 0, 3327, 1, 1, 3327, 1, 0, 1, 0, 0, 3328, 0, 1, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 2, 0, 2, 1, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 3327, 3327, 0, 3328, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 0, 3328, 0], +[1, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 0, 1, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 2, 3328, 0, 1, 0, 2, 0, 1, 0, 1, 3327, 0, 1, 1, 0, 3328, 1, 3328, 1, 3327, 0, 1, 3327, 3328, 3328, 1, 2, 1, 1, 1, 3328, 3328, 3327, 1, 0, 0, 3327, 3327, 0, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 0, 1, 2, 3328, 3327, 2, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 3328, 3327, 1, 0, 0, 2, 1, 0, 0, 1, 3327, 1, 2, 3328, 1, 3328, 1, 0, 0, 0, 3328, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 1, 2, 3328, 3328, 1, 3328, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 0, 3328, 3328, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 2, 0, 3328, 1, 3327, 0, 3328, 3328, 0, 3328, 0, 2, 3328, 0, 3328, 1, 0, 1, 0, 3328, 3328, 2, 2, 0, 3327, 1, 2, 0, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 0, 1, 3327, 0, 1, 0, 1, 0, 0, 3328, 3328, 3327, 0, 3328, 2, 1, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 0, 2, 1, 3328, 3328, 0, 0, 1, 0, 0, 0, 1], +[2, 3328, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 2, 1, 1, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 2, 2, 3328, 1, 1, 1, 0, 0, 3328, 1, 0, 3328, 0, 3328, 3328, 1, 1, 0, 1, 1, 0, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 0, 3327, 0, 3327, 0, 1, 1, 3327, 3328, 3327, 1, 0, 1, 1, 0, 2, 1, 0, 3328, 1, 0, 3328, 3328, 0, 0, 3327, 2, 3327, 3328, 0, 0, 0, 2, 1, 3328, 3328, 3328, 3328, 3328, 0, 0, 2, 2, 1, 3328, 0, 0, 1, 1, 0, 0, 0, 2, 1, 0, 3328, 0, 0, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3328, 0, 1, 1, 0, 0, 3328, 2, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 3328, 3328, 1, 1, 0, 0, 0, 3328, 0, 3328, 2, 0, 3328, 3328, 3328, 0, 1, 1, 0, 2, 0, 1, 3328, 0, 1, 2, 3328, 1, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 1, 3328, 0, 3328, 1, 1, 2, 3328, 0, 3328, 1, 1, 1, 3328, 0, 0, 3327, 3328, 3328, 2, 3328, 2, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 3328, 0, 3328, 0, 1, 3327, 0, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 1, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 0, 1, 0, 0, 2, 3327, 2, 3328], +[1, 1, 0, 3328, 1, 2, 3328, 3327, 0, 0, 0, 3327, 3328, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 0, 0, 0, 0, 0, 3328, 0, 2, 0, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 3328, 1, 1, 2, 3328, 1, 0, 2, 2, 0, 3327, 3327, 3328, 2, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 2, 1, 0, 2, 2, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 3327, 0, 3327, 2, 0, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 3328, 0, 0, 1, 0, 0, 3328, 3328, 0, 1, 2, 3328, 3328, 2, 0, 3328, 1, 1, 0, 0, 1, 3328, 0, 3327, 1, 3328, 1, 3328, 0, 1, 1, 0, 1, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 1, 3328, 1, 1, 1, 2, 0, 0, 3327, 0, 0, 0, 1, 3327, 0, 2, 3327, 3328, 1, 0, 3328, 3328, 3327, 0, 2, 0, 0, 0, 1, 3328, 1, 3328, 1, 1, 2, 3328, 0, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 3327, 0, 3328, 3328, 0, 3328, 3328, 0, 1, 3328, 0, 1, 0, 1, 0, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 1, 2, 2, 2, 0]] + +e2: [3328, 3328, 0, 2, 0, 0, 0, 0, 3327, 3328, 1, 1, 0, 3328, 2, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 3328, 2, 1, 0, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 3328, 1, 2, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3327, 3327, 0, 0, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 0, 2, 1, 1, 3327, 2, 0, 0, 2, 3328, 3328, 0, 3328, 3327, 1, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 3328, 0, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 3327, 3328, 0, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 2, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 2, 3328, 3328, 1, 3328, 0, 0, 2, 2, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 3328, 0, 1, 1, 3327, 3328, 3328, 2, 0, 0, 3328, 0, 1, 3328, 0, 1, 3327, 0, 0, 3328, 1, 0, 0, 3328, 3327, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1, 1, 3328, 0, 1, 1, 1, 0, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 0, 1, 3328, 3328, 3327, 3328, 0, 0, 3328, 0, 1, 1] +rHat: [[1895, 1256, 3, 1874, 570, 1626, 984, 2228, 1975, 1271, 1874, 3151, 2407, 1664, 829, 837, 2011, 1836, 354, 22, 2574, 242, 1950, 2861, 422, 605, 2908, 1886, 3089, 1720, 850, 1391, 1683, 553, 60, 1104, 141, 2392, 2513, 1034, 1697, 3126, 2575, 990, 585, 2978, 2867, 906, 1388, 1830, 727, 569, 1339, 3, 35, 2751, 1124, 950, 1884, 1833, 894, 462, 382, 1856, 1831, 18, 1098, 664, 50, 2252, 1435, 1571, 1038, 456, 914, 1621, 2777, 485, 1985, 2933, 2707, 1244, 2281, 232, 3129, 3160, 2071, 2029, 38, 1456, 2487, 3315, 279, 847, 3032, 2373, 2099, 1161, 775, 290, 1763, 627, 233, 1197, 1314, 2189, 3129, 911, 2609, 2213, 3315, 20, 2409, 798, 1747, 3045, 560, 2377, 2821, 1903, 1233, 2035, 3143, 1506, 839, 2487, 204, 392, 1468, 1339, 1634, 2431, 1955, 3014, 2153, 1803, 732, 541, 530, 1944, 296, 1071, 1050, 3042, 1493, 1520, 465, 1266, 127, 219, 2566, 1483, 480, 2661, 845, 2882, 2498, 1842, 1212, 1217, 2029, 711, 1742, 950, 1819, 196, 791, 2569, 2207, 3100, 1883, 2760, 2133, 1975, 3001, 1120, 2061, 1317, 3295, 1679, 2575, 270, 650, 1020, 1841, 352, 46, 2659, 3077, 2593, 1978, 389, 1677, 1847, 1515, 1507, 1350, 1937, 1182, 1459, 2354, 3272, 1979, 2307, 520, 1133, 541, 1102, 838, 301, 2397, 1001, 3267, 2764, 1768, 544, 3121, 1160, 2344, 169, 2464, 1851, 142, 1810, 876, 874, 961, 147, 2578, 1359, 1511, 1869, 1887, 3328, 2213, 1855, 597, 1925, 278, 1676, 3121, 1837, 2860, 2532, 628, 1050, 2785, 687, 1170, 2906, 431, 2763, 1915, 3082, 1361, 3210], +[2457, 3029, 949, 1672, 367, 997, 1951, 2482, 1619, 1181, 2198, 1891, 199, 2458, 757, 1297, 292, 3214, 1235, 15, 2977, 18, 1972, 2941, 1320, 454, 1932, 1981, 3219, 2728, 888, 2779, 2488, 1603, 360, 369, 1261, 1308, 3246, 1767, 1073, 416, 2752, 59, 951, 2852, 2481, 2709, 2187, 1330, 1651, 454, 57, 1531, 2072, 1117, 2897, 2985, 1470, 2352, 2893, 2160, 1108, 435, 697, 1725, 2070, 2925, 838, 877, 398, 2151, 753, 2895, 2648, 727, 1491, 782, 497, 1173, 1962, 1199, 648, 489, 1778, 199, 2526, 1285, 496, 1028, 846, 689, 89, 2127, 2490, 555, 2078, 2968, 2515, 95, 725, 3012, 779, 2917, 191, 60, 3297, 311, 2021, 3161, 895, 2885, 801, 3046, 2914, 2021, 12, 2490, 924, 2795, 92, 2643, 630, 2107, 1291, 2201, 1340, 2936, 1061, 810, 1302, 2217, 2893, 1693, 488, 2710, 1088, 273, 421, 2458, 2793, 195, 373, 3025, 189, 2486, 1842, 3267, 1175, 1778, 596, 484, 480, 2524, 1087, 2875, 2149, 1060, 1904, 3077, 1764, 852, 758, 2313, 3285, 2905, 788, 694, 241, 1333, 1958, 376, 2953, 2951, 2705, 3, 1155, 3322, 2101, 1415, 1118, 1009, 2734, 342, 2301, 1408, 626, 3012, 2295, 1846, 1913, 1999, 184, 1301, 296, 297, 2182, 3225, 654, 3215, 2422, 328, 1267, 582, 1386, 2902, 1732, 1121, 542, 1128, 495, 1054, 1552, 391, 553, 421, 2663, 2768, 1240, 2658, 2572, 479, 1446, 1289, 587, 436, 2096, 452, 1700, 642, 2628, 1044, 2716, 2457, 1934, 1518, 235, 2370, 2194, 1500, 2763, 1672, 1397, 1483, 1402, 2033, 2430, 1435, 2869, 2871, 2873, 1874, 708, 2737, 817, 2932], +[3087, 2138, 1880, 2919, 1063, 302, 1, 3033, 2212, 2417, 1770, 830, 2173, 1019, 1782, 2840, 2339, 734, 2303, 421, 917, 2841, 1180, 2575, 2094, 797, 2356, 3048, 2471, 2926, 805, 397, 1850, 2934, 1468, 2111, 639, 2044, 588, 1790, 1995, 851, 1360, 449, 2948, 2876, 803, 3316, 1114, 2633, 1983, 505, 2017, 2868, 1187, 2667, 2356, 1540, 1686, 2466, 2116, 2200, 1465, 2131, 658, 2929, 3204, 1492, 1735, 1149, 1288, 3151, 714, 1685, 3031, 444, 664, 2819, 86, 2149, 2638, 509, 2564, 1848, 1124, 218, 2495, 2862, 431, 1498, 680, 171, 1014, 1754, 2296, 936, 872, 263, 3054, 2106, 2560, 1495, 1807, 3219, 975, 995, 1477, 1758, 1417, 1025, 136, 428, 1206, 1979, 349, 1283, 2556, 281, 1373, 3165, 1778, 260, 3299, 2793, 2687, 610, 3279, 29, 11, 1829, 2817, 672, 1331, 2768, 1722, 2700, 2134, 325, 3032, 1637, 2784, 2451, 1054, 2212, 335, 2390, 40, 210, 606, 3325, 2231, 2519, 539, 3112, 1406, 356, 1259, 1313, 2839, 1220, 2862, 3063, 2641, 3178, 2492, 1254, 744, 1427, 1278, 2631, 28, 2645, 2374, 1838, 1499, 1258, 2927, 2588, 2517, 2803, 1670, 909, 644, 2740, 1823, 1813, 1290, 2202, 3242, 33, 1038, 2582, 2474, 774, 1259, 291, 403, 2092, 333, 824, 2072, 192, 2602, 1489, 1005, 1471, 2752, 2463, 213, 203, 2834, 1970, 1748, 2506, 837, 387, 1298, 2467, 980, 1456, 199, 1623, 826, 2494, 2296, 2928, 3298, 32, 49, 1239, 1917, 2086, 2421, 1834, 2380, 1928, 445, 1990, 166, 676, 3, 2308, 3270, 2992, 830, 3121, 3298, 2950, 443, 868, 2191, 64, 491, 2825, 657, 704], +[1723, 2076, 2569, 611, 2206, 800, 2025, 1086, 436, 2132, 1067, 3264, 2429, 3304, 2669, 1826, 251, 2504, 2919, 963, 244, 547, 695, 2239, 3252, 2611, 2828, 1663, 3228, 2228, 892, 1213, 1901, 2900, 2269, 1843, 1662, 2633, 1372, 490, 3148, 308, 236, 1862, 1927, 3091, 1024, 2622, 1517, 386, 861, 3194, 212, 1821, 902, 464, 1589, 487, 373, 216, 1072, 1802, 422, 797, 1708, 1125, 2194, 1550, 896, 2831, 2511, 1609, 2751, 3208, 1825, 3241, 714, 2711, 996, 1824, 2575, 31, 2940, 2250, 1990, 2936, 2432, 879, 1212, 794, 1481, 1342, 1517, 2512, 1091, 2200, 2008, 1905, 459, 1673, 2813, 2762, 2011, 64, 2398, 2636, 2554, 2469, 58, 1729, 627, 1673, 790, 1952, 90, 218, 16, 2133, 1183, 622, 2782, 1637, 597, 95, 2893, 1200, 2368, 2063, 2388, 1456, 639, 765, 1430, 2289, 969, 2459, 1083, 2658, 750, 433, 669, 2648, 1441, 3163, 1661, 2127, 541, 2436, 2380, 1703, 1948, 1491, 540, 829, 364, 2461, 1675, 2389, 1052, 1144, 2657, 344, 406, 1421, 335, 165, 3058, 142, 74, 2050, 774, 1420, 604, 2786, 2928, 477, 699, 1616, 553, 816, 1626, 821, 954, 1198, 2638, 623, 601, 2814, 2120, 272, 1790, 2623, 3264, 500, 2617, 3001, 740, 2774, 2819, 1614, 2403, 1904, 1448, 3058, 2054, 1214, 1328, 2793, 383, 2684, 2156, 2298, 2020, 3057, 379, 421, 1155, 1730, 1048, 377, 207, 2704, 3157, 708, 664, 1454, 2279, 215, 1749, 1234, 2377, 1315, 2755, 2017, 2403, 602, 1, 1526, 281, 618, 2243, 1730, 2396, 1819, 611, 2415, 3018, 1922, 966, 3308, 895, 3189, 2484, 3228, 364, 2389]] + +BHat * rHat: [[82, 2041, 2174, 3197, 1198, 59, 1197, 724, 722, 183, 1908, 3236, 1348, 3322, 147, 888, 1675, 1639, 228, 2865, 1500, 1884, 1180, 1297, 2251, 2484, 2135, 3169, 1146, 610, 2942, 2932, 2831, 2633, 428, 1384, 3155, 1682, 2699, 946, 1501, 804, 786, 2079, 954, 3242, 3195, 2968, 3071, 2, 2502, 1403, 338, 1282, 867, 2636, 3277, 474, 1238, 924, 1132, 1406, 1788, 3313, 1065, 1319, 2694, 1915, 3053, 106, 1409, 1664, 3328, 122, 329, 1776, 1480, 2284, 741, 1557, 478, 1924, 2182, 202, 2672, 2372, 1520, 2612, 2939, 1174, 2494, 2916, 2011, 3186, 2274, 1795, 2044, 215, 2806, 290, 2319, 2887, 1256, 2323, 392, 2625, 673, 2544, 1519, 2588, 3257, 3233, 2892, 2505, 3123, 580, 604, 879, 2118, 2090, 2535, 1477, 285, 2066, 2555, 2361, 2910, 2097, 498, 35, 108, 2468, 1624, 377, 0, 2519, 155, 2824, 1519, 939, 1746, 2378, 1338, 3282, 1578, 1483, 3283, 871, 1463, 1538, 968, 918, 1126, 1184, 1974, 739, 571, 2895, 245, 1666, 1430, 485, 574, 178, 2452, 2379, 2820, 3270, 1422, 1704, 622, 855, 2569, 2489, 2421, 2137, 3312, 1525, 52, 3286, 2494, 46, 499, 1146, 1661, 1923, 48, 1552, 69, 3193, 1446, 1015, 2550, 898, 3218, 528, 662, 2502, 904, 2250, 1614, 2300, 1220, 691, 2688, 261, 1868, 2408, 1899, 579, 38, 1235, 811, 2947, 1815, 882, 1194, 3134, 3244, 2463, 123, 2440, 183, 3223, 2638, 2617, 823, 1641, 2883, 267, 1488, 2846, 585, 1051, 839, 1750, 3168, 1975, 1896, 2000, 176, 2179, 1439, 2071, 470, 1044, 532, 2035, 1076, 907, 337, 467, 99, 356, 1260, 1036], +[298, 1526, 142, 1986, 2985, 844, 2506, 390, 1487, 141, 845, 158, 555, 2913, 0, 482, 1123, 2714, 2716, 1852, 550, 1725, 1852, 1372, 3067, 955, 711, 2558, 654, 3105, 982, 1874, 2222, 2760, 2257, 2276, 597, 2661, 3059, 2634, 2210, 983, 1633, 1721, 2478, 322, 465, 3132, 1179, 434, 461, 2539, 601, 326, 1785, 502, 2981, 3081, 917, 2402, 1680, 472, 2128, 2107, 1216, 2390, 1783, 2839, 1922, 2393, 1673, 93, 3323, 848, 1086, 1501, 3121, 199, 793, 3171, 451, 962, 3070, 1357, 2656, 1624, 1592, 764, 2772, 1352, 577, 2675, 676, 3167, 1150, 1816, 124, 2235, 428, 1068, 425, 1190, 1013, 3192, 3143, 2710, 877, 772, 1167, 2408, 3298, 1007, 1335, 363, 1062, 2914, 2256, 3029, 797, 1221, 1261, 847, 227, 1048, 1977, 2577, 1092, 105, 1577, 1026, 1460, 2642, 1551, 1245, 323, 853, 1261, 993, 1488, 2670, 2731, 2904, 2127, 767, 2958, 192, 3157, 2357, 3275, 3146, 3121, 691, 889, 1734, 1159, 79, 2913, 361, 1733, 2236, 2261, 1616, 2574, 937, 1359, 2632, 1984, 2138, 1544, 3305, 1663, 2564, 1092, 368, 409, 2457, 1254, 3095, 675, 637, 429, 2170, 2007, 3147, 2088, 373, 1007, 946, 1204, 65, 3082, 629, 3246, 2266, 1811, 194, 1179, 1235, 2394, 1746, 143, 2450, 3319, 1631, 1880, 729, 983, 3030, 852, 2381, 1361, 1599, 2272, 1610, 523, 761, 2680, 223, 3322, 457, 324, 2743, 976, 391, 2680, 1389, 499, 2915, 1514, 812, 1659, 1601, 344, 1818, 494, 2935, 3064, 3082, 2173, 298, 3096, 2712, 759, 2050, 1036, 2418, 2616, 2210, 2477, 2855, 1075, 1361, 3115, 3299, 1800, 518], +[808, 2799, 2135, 1035, 1245, 2352, 3009, 2676, 81, 3082, 68, 288, 2308, 806, 1503, 2054, 855, 2957, 126, 1364, 758, 1389, 1682, 2971, 38, 678, 2957, 3119, 2161, 1979, 2172, 2695, 1932, 12, 54, 528, 1085, 656, 3044, 2836, 1429, 1030, 914, 523, 2788, 2710, 1520, 2492, 1192, 1703, 115, 2741, 681, 1549, 1915, 2899, 2887, 2954, 366, 3142, 918, 131, 1244, 1908, 2317, 3181, 3327, 372, 2503, 985, 782, 431, 2979, 2682, 2522, 2130, 479, 1660, 3060, 761, 570, 2081, 736, 1596, 827, 976, 1780, 3049, 1652, 2238, 3094, 2675, 2093, 580, 904, 178, 345, 1911, 2005, 1185, 1164, 3242, 2654, 2773, 2036, 2748, 2441, 521, 1805, 1904, 1707, 186, 499, 532, 3319, 1271, 2901, 1806, 2394, 607, 1007, 1662, 864, 2504, 3000, 2140, 1453, 340, 2286, 1843, 1040, 2593, 1180, 997, 1767, 1731, 965, 733, 1538, 286, 1131, 1928, 2516, 2104, 476, 1377, 2356, 1051, 581, 1075, 1170, 1296, 1808, 631, 312, 2110, 1464, 1935, 1475, 2691, 1940, 231, 2629, 716, 2507, 1020, 9, 650, 689, 206, 3249, 202, 2260, 357, 2423, 2499, 2816, 1477, 355, 1152, 2762, 1233, 792, 344, 2927, 3054, 498, 2251, 2073, 2275, 1724, 721, 1751, 2142, 1107, 3311, 580, 3280, 2711, 510, 3235, 2157, 2476, 2486, 430, 948, 19, 503, 1064, 1348, 1645, 3306, 416, 226, 953, 1966, 2836, 573, 1209, 1059, 2356, 1520, 2203, 3164, 3068, 406, 1020, 1643, 2718, 214, 2905, 2134, 485, 2775, 2970, 1952, 994, 2714, 435, 1334, 1180, 1598, 3156, 3226, 1796, 2536, 1249, 2730, 176, 718, 2373, 549, 2033, 235, 725, 533], +[899, 558, 2689, 1909, 217, 2327, 807, 877, 878, 308, 3314, 2512, 3053, 363, 2776, 16, 1283, 1961, 1550, 1597, 1435, 2939, 1239, 2402, 466, 1230, 1513, 1521, 3256, 2231, 2511, 2229, 3184, 3118, 717, 531, 1133, 1324, 708, 258, 1526, 683, 1264, 16, 676, 1831, 1585, 1898, 1085, 2092, 1617, 1672, 1454, 2486, 68, 2425, 1679, 2770, 560, 2174, 800, 1183, 2804, 2198, 650, 337, 684, 2774, 3031, 3078, 1187, 140, 277, 3134, 1531, 3319, 1597, 2349, 1120, 1571, 3241, 1979, 408, 1229, 2287, 1043, 1667, 3016, 2042, 92, 965, 738, 2882, 620, 41, 686, 126, 2946, 1414, 903, 2657, 784, 453, 2965, 2157, 2341, 635, 2488, 2855, 947, 788, 1406, 1028, 2582, 1515, 814, 1742, 2088, 113, 2736, 1172, 402, 2119, 2479, 1536, 2638, 1199, 358, 1444, 327, 2826, 1740, 1921, 3185, 270, 2493, 2885, 1837, 2729, 724, 1444, 2469, 1231, 1890, 1711, 2820, 74, 2185, 691, 1263, 2091, 100, 230, 2176, 9, 1258, 1925, 3259, 2583, 2192, 1856, 3181, 10, 2804, 2283, 1201, 2246, 2240, 2654, 192, 799, 1644, 2593, 965, 2413, 1838, 12, 2274, 3018, 470, 2028, 2203, 527, 1869, 2017, 532, 1460, 1766, 892, 3327, 1595, 1101, 1548, 1628, 2418, 1906, 664, 665, 3202, 885, 1965, 1840, 1941, 1125, 1698, 2078, 2610, 181, 3311, 1983, 2378, 812, 1468, 923, 967, 1127, 232, 1618, 2772, 1192, 1107, 574, 2760, 2148, 1880, 337, 3246, 433, 2123, 496, 1443, 2159, 1948, 847, 2625, 1417, 566, 2617, 646, 739, 2192, 2494, 1877, 1939, 997, 3173, 2085, 761, 1253, 1202, 1811, 1050, 2410, 2963, 2355, 22]] +NTTInverse(BHat * rHat): [[2728, 2304, 2829, 2833, 2625, 1826, 1467, 2857, 59, 3288, 577, 376, 3174, 1542, 1012, 1689, 926, 1310, 311, 1655, 2244, 3216, 837, 3012, 3150, 2318, 2182, 2567, 824, 1286, 891, 674, 1539, 3002, 175, 3299, 815, 1447, 284, 3224, 353, 257, 1842, 811, 288, 496, 551, 3101, 3221, 1527, 1446, 2279, 498, 1731, 1763, 1165, 568, 953, 2071, 1559, 2967, 1778, 353, 1027, 2928, 3209, 998, 1065, 3066, 2081, 3137, 897, 1825, 2258, 401, 2417, 2783, 1297, 431, 2029, 1012, 1197, 1993, 1339, 1674, 950, 2893, 3028, 3269, 2453, 2228, 2556, 418, 1874, 792, 254, 253, 436, 473, 1571, 1459, 980, 2296, 2527, 547, 2299, 3215, 3220, 3292, 2644, 2939, 3073, 500, 3084, 2883, 138, 1781, 3120, 3129, 1320, 95, 201, 1850, 2622, 2788, 364, 2424, 508, 2011, 689, 2130, 2770, 1817, 938, 3130, 853, 878, 188, 2862, 91, 3055, 2944, 646, 3070, 3264, 145, 1708, 1713, 520, 2190, 283, 472, 1842, 1878, 3277, 1862, 1835, 3317, 818, 1899, 2287, 1418, 2458, 3167, 1572, 3114, 1667, 899, 2027, 528, 2017, 199, 1982, 485, 1139, 3241, 2560, 918, 665, 2345, 1483, 2717, 2134, 3193, 1540, 977, 1919, 2029, 2493, 2140, 242, 2093, 280, 2944, 533, 2427, 2647, 3151, 3039, 1297, 2561, 1283, 2802, 1925, 2968, 1887, 335, 763, 1091, 1953, 665, 1046, 2485, 2470, 1043, 866, 1944, 1177, 1944, 1702, 2378, 3114, 1789, 2269, 810, 1162, 700, 3234, 635, 2606, 438, 2619, 3169, 1240, 1872, 1098, 2608, 654, 1668, 393, 1334, 3322, 2884, 2581, 1959, 2831, 1913, 1758, 1996, 1996, 3163, 3095, 1053, 1390, 1464, 1648], +[1569, 2344, 876, 650, 2412, 697, 3077, 236, 1862, 1645, 955, 3257, 920, 1123, 2068, 2601, 463, 1294, 1418, 527, 1123, 88, 106, 839, 2029, 3247, 374, 1607, 2576, 2305, 2402, 333, 2861, 125, 710, 3202, 545, 2265, 1184, 2044, 1172, 2624, 2725, 1821, 3210, 1643, 1265, 1081, 1029, 2086, 1619, 803, 22, 2330, 1617, 220, 2560, 1399, 1994, 2741, 2972, 2750, 2863, 2690, 2273, 1715, 2811, 1293, 2335, 3089, 2287, 2508, 3054, 1353, 1539, 3071, 2950, 56, 3147, 1778, 2417, 340, 404, 2208, 2937, 420, 1936, 2998, 481, 3321, 194, 1111, 71, 999, 450, 496, 3157, 1670, 329, 2883, 594, 1938, 2728, 1713, 2188, 2330, 1174, 427, 1051, 289, 2200, 1509, 1185, 1691, 1206, 2931, 1463, 2824, 1545, 3005, 3123, 1975, 1099, 1683, 1448, 3155, 2111, 2524, 2827, 1125, 179, 1429, 1625, 73, 1843, 2674, 2811, 724, 2916, 1958, 1462, 1449, 2466, 1743, 1130, 1663, 494, 2207, 2234, 2156, 1853, 2817, 570, 3004, 2976, 1272, 670, 2828, 2385, 124, 1714, 486, 2372, 955, 1265, 879, 3079, 2080, 1854, 579, 3218, 1740, 1938, 820, 2064, 1998, 3017, 2329, 797, 1154, 659, 821, 2385, 2181, 3149, 2134, 2848, 1691, 36, 490, 1024, 345, 3211, 1268, 1796, 1216, 17, 2878, 1658, 94, 1077, 3145, 2226, 2840, 945, 1876, 2850, 2053, 2261, 2871, 1835, 171, 2216, 3160, 83, 2986, 1016, 2546, 2772, 1613, 2387, 3108, 2953, 1225, 1296, 858, 2014, 1446, 3243, 2490, 521, 2225, 2228, 1960, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1329, 1374, 1722, 2064, 3035, 290, 2169, 2141, 2715, 2493, 3259, 610, 1423, 846, 1488], +[2425, 529, 3010, 2623, 707, 1719, 1392, 697, 69, 1760, 2602, 841, 2529, 245, 3266, 1397, 406, 2831, 2126, 1601, 1242, 2769, 2400, 1585, 2104, 495, 444, 235, 2172, 1364, 2942, 3237, 1084, 1839, 2895, 1196, 2250, 1591, 573, 2794, 1307, 3, 1620, 2694, 2657, 2972, 1558, 2406, 1405, 2983, 2700, 1915, 2909, 852, 501, 3004, 2775, 1964, 1464, 1304, 2225, 992, 2283, 491, 414, 3224, 2212, 2651, 1239, 1968, 1412, 914, 3300, 2713, 1696, 906, 2662, 2527, 2346, 2321, 3141, 2169, 1518, 1788, 351, 122, 193, 2146, 2173, 1351, 2225, 2633, 1274, 3062, 2549, 2428, 3159, 2925, 2320, 2078, 2999, 2581, 2851, 840, 900, 1349, 92, 440, 2232, 2015, 1139, 2161, 2831, 2480, 2433, 2833, 316, 1182, 3037, 1588, 3197, 758, 687, 596, 1977, 219, 2611, 905, 1864, 234, 44, 2359, 3216, 313, 3142, 829, 662, 728, 12, 1995, 2044, 2098, 3158, 2037, 1008, 3174, 56, 3185, 10, 1905, 1383, 584, 2759, 489, 2213, 2450, 230, 54, 1295, 2158, 3095, 2907, 1937, 2320, 0, 3227, 2886, 1971, 2864, 2748, 1375, 2674, 2281, 1503, 2115, 1325, 288, 795, 3273, 505, 1494, 2495, 368, 3014, 3070, 1503, 1779, 47, 441, 2063, 1099, 2963, 1246, 1129, 1165, 2571, 761, 2194, 906, 1596, 229, 890, 92, 1479, 2960, 665, 1742, 2903, 816, 1997, 22, 1835, 2640, 1128, 2758, 2264, 1035, 1646, 277, 2288, 90, 2978, 922, 2276, 3048, 1626, 2210, 1592, 2268, 2268, 180, 2605, 2660, 786, 37, 2195, 45, 2075, 2490, 2485, 1153, 132, 2656, 619, 883, 237, 1363, 239, 773, 2909, 2026, 829, 606, 2009, 2039, 394], +[820, 1829, 641, 967, 2242, 772, 435, 1740, 1911, 1805, 581, 2080, 3116, 22, 2646, 3253, 543, 1048, 1517, 2828, 948, 2801, 1211, 3222, 1466, 2299, 583, 785, 3287, 234, 2877, 1666, 1705, 1421, 414, 1021, 1814, 3027, 452, 323, 2367, 3296, 265, 466, 1450, 895, 1924, 2906, 3168, 92, 6, 3022, 1080, 57, 3115, 1047, 95, 2807, 2773, 1388, 1697, 178, 2042, 2612, 980, 2645, 2253, 1960, 654, 1216, 706, 2110, 1440, 1001, 2487, 251, 2494, 1278, 487, 1936, 1539, 436, 1580, 2042, 2811, 1530, 1239, 2147, 720, 6, 2698, 1710, 1759, 1747, 896, 2876, 1075, 511, 2132, 784, 1956, 2623, 3038, 836, 977, 3066, 1781, 332, 1054, 1937, 2436, 372, 1052, 2296, 2089, 2565, 996, 2935, 3196, 3080, 2166, 2104, 2135, 3025, 438, 2998, 2138, 2857, 2635, 2116, 2009, 1602, 180, 866, 1630, 2814, 722, 3053, 2808, 1552, 1657, 3196, 2219, 3253, 2591, 998, 3144, 985, 1499, 1438, 1052, 1517, 2243, 1454, 1895, 966, 2020, 1742, 2090, 2468, 401, 1129, 2235, 1099, 2836, 1429, 1401, 2931, 2868, 474, 831, 532, 199, 3113, 1515, 3105, 3301, 674, 1224, 977, 2388, 265, 1627, 3146, 3318, 3303, 330, 1566, 1180, 371, 149, 1469, 1678, 1804, 3213, 1902, 1584, 1369, 749, 2116, 1424, 897, 1940, 3255, 1337, 944, 2899, 2317, 471, 777, 808, 2697, 2302, 2191, 2402, 2506, 1003, 2978, 2448, 2896, 2783, 2550, 1963, 857, 2567, 1079, 392, 21, 2708, 3274, 2598, 1661, 2575, 1637, 587, 394, 2874, 2117, 2723, 3065, 565, 40, 1101, 64, 2879, 2464, 2470, 947, 2685, 1563, 1115, 399, 2129, 951, 558, 400]] +u = NTTInverse(BHat * rHat) + e1: [[2726, 2304, 2828, 2833, 2625, 1826, 1467, 2859, 57, 3288, 576, 375, 3174, 1542, 1012, 1687, 927, 1310, 312, 1655, 2246, 3215, 838, 3012, 3149, 2319, 2181, 2568, 825, 1285, 891, 673, 1540, 3000, 174, 3299, 816, 1448, 285, 3224, 355, 256, 1844, 810, 289, 495, 553, 3103, 3221, 1528, 1445, 2279, 497, 1731, 1764, 1164, 568, 953, 2070, 1560, 2966, 1777, 353, 1027, 2928, 3208, 997, 1065, 3066, 2081, 3138, 895, 1826, 2259, 401, 2417, 2784, 1298, 430, 2029, 1011, 1195, 1993, 1341, 1675, 951, 2892, 3029, 3270, 2452, 2229, 2556, 419, 1875, 792, 254, 253, 436, 471, 1572, 1458, 980, 2297, 2526, 547, 2299, 3215, 3221, 3293, 2645, 2939, 3073, 501, 3082, 2884, 138, 1781, 3119, 3129, 1319, 94, 202, 1849, 2622, 2789, 365, 2425, 510, 2012, 688, 2128, 2769, 1817, 938, 3131, 853, 878, 187, 2863, 91, 3054, 2943, 648, 3069, 3264, 146, 1706, 1714, 519, 2189, 282, 474, 1841, 1877, 3279, 1862, 1836, 3317, 818, 1899, 2287, 1419, 2459, 3167, 1572, 3112, 1666, 901, 2027, 528, 2017, 199, 1981, 484, 1140, 3241, 2560, 918, 667, 2343, 1483, 2718, 2135, 3192, 1540, 975, 1920, 2030, 2491, 2141, 242, 2094, 280, 2944, 532, 2427, 2648, 3150, 3041, 1297, 2560, 1282, 2801, 1925, 2968, 1886, 333, 763, 1093, 1953, 667, 1047, 2483, 2470, 1043, 866, 1944, 1177, 1945, 1701, 2378, 3112, 1787, 2269, 809, 1161, 698, 3234, 634, 2606, 438, 2620, 3168, 1239, 1871, 1099, 2609, 653, 1668, 394, 1334, 3322, 2883, 2580, 1959, 2830, 1912, 1758, 1995, 1996, 3162, 3096, 1053, 1390, 1463, 1648], +[1570, 2343, 876, 650, 2411, 697, 3077, 236, 1861, 1645, 956, 3257, 921, 1124, 2069, 2601, 463, 1295, 1417, 527, 1123, 88, 108, 838, 2029, 3248, 374, 1609, 2576, 2306, 2402, 334, 2859, 125, 711, 3203, 545, 2264, 1185, 2043, 1173, 2622, 2725, 1822, 3208, 1642, 1264, 1082, 1031, 2087, 1620, 804, 21, 2329, 1615, 221, 2560, 1399, 1992, 2739, 2972, 2749, 2863, 2690, 2272, 1714, 2810, 1293, 2334, 3089, 2286, 2509, 3053, 1352, 1541, 3071, 2949, 57, 3147, 1779, 2418, 340, 405, 2210, 2936, 418, 1938, 2999, 480, 3321, 194, 1111, 71, 998, 450, 495, 3158, 1671, 329, 2882, 592, 1938, 2727, 1714, 2188, 2329, 1172, 428, 1051, 289, 2202, 1510, 1185, 1691, 1207, 2929, 1464, 2826, 1544, 3006, 3122, 1976, 1099, 1683, 1448, 3154, 2111, 2522, 2827, 1124, 178, 1428, 1624, 73, 1843, 2674, 2812, 723, 2918, 1957, 1463, 1451, 2465, 1742, 1131, 1662, 495, 2206, 2235, 2156, 1852, 2817, 570, 3005, 2975, 1271, 669, 2829, 2386, 124, 1713, 485, 2371, 954, 1265, 878, 3078, 2079, 1854, 581, 3218, 1740, 1937, 818, 2066, 1998, 3016, 2330, 795, 1154, 658, 820, 2385, 2180, 3149, 2136, 2847, 1691, 35, 491, 1024, 346, 3211, 1267, 1795, 1218, 19, 2878, 1656, 95, 1079, 3145, 2227, 2840, 945, 1877, 2852, 2052, 2261, 2872, 1835, 171, 2217, 3158, 83, 2987, 1016, 2547, 2772, 1613, 2386, 3107, 2951, 1225, 1295, 860, 2015, 1447, 3242, 2489, 522, 2225, 2228, 1962, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1328, 1374, 1723, 2064, 3037, 291, 2168, 2140, 2715, 2493, 3260, 610, 1423, 846, 1489], +[2427, 528, 3009, 2623, 707, 1720, 1391, 696, 68, 1760, 2601, 843, 2530, 246, 3266, 1397, 407, 2831, 2125, 1602, 1242, 2769, 2400, 1586, 2106, 497, 443, 236, 2173, 1365, 2942, 3237, 1083, 1840, 2895, 1195, 2250, 1590, 572, 2795, 1308, 3, 1621, 2695, 2657, 2971, 1560, 2406, 1405, 2983, 2701, 1914, 2909, 851, 501, 3002, 2775, 1962, 1464, 1305, 2226, 990, 2282, 489, 415, 3224, 2213, 2652, 1239, 1970, 1413, 914, 3299, 2714, 1696, 905, 2661, 2527, 2346, 2319, 3143, 2167, 1517, 1788, 351, 122, 195, 2147, 2172, 1350, 2224, 2632, 1273, 3062, 2549, 2430, 3161, 2926, 2319, 2078, 2999, 2582, 2852, 840, 900, 1349, 94, 441, 2232, 2014, 1139, 2161, 2832, 2479, 2434, 2832, 316, 1183, 3037, 1588, 3198, 757, 685, 595, 1977, 220, 2610, 905, 1865, 235, 44, 2359, 3215, 315, 3142, 829, 663, 728, 12, 1994, 2044, 2099, 3159, 2037, 1007, 3173, 57, 3186, 10, 1905, 1383, 583, 2759, 488, 2215, 2450, 229, 53, 1294, 2158, 3096, 2908, 1937, 2322, 0, 3228, 2885, 1971, 2865, 2750, 1374, 2675, 2282, 1502, 2116, 1325, 287, 795, 3273, 506, 1493, 2496, 368, 3015, 3070, 1504, 1778, 48, 440, 2064, 1098, 2963, 1245, 1130, 1166, 2573, 760, 2194, 905, 1597, 230, 891, 91, 1479, 2960, 663, 1741, 2902, 818, 1996, 24, 1836, 2640, 1130, 2758, 2264, 1035, 1646, 278, 2288, 90, 2977, 922, 2275, 3048, 1627, 2208, 1592, 2268, 2269, 181, 2603, 2660, 786, 38, 2196, 45, 2075, 2491, 2485, 1152, 132, 2657, 619, 883, 236, 1364, 238, 773, 2910, 2026, 829, 608, 2007, 2041, 393], +[821, 1830, 641, 966, 2243, 774, 434, 1738, 1911, 1805, 581, 2078, 3115, 22, 2645, 3254, 543, 1048, 1517, 2827, 947, 2801, 1211, 3222, 1466, 2299, 583, 784, 3287, 236, 2877, 1666, 1706, 1420, 414, 1022, 1813, 3027, 451, 324, 2366, 3297, 266, 468, 1449, 896, 1924, 2908, 3170, 92, 4, 3020, 1079, 59, 3116, 1048, 95, 2806, 2772, 1389, 1696, 177, 2044, 2613, 980, 2647, 2255, 1960, 654, 1216, 707, 2111, 1440, 1001, 2486, 251, 2494, 1279, 487, 1936, 1540, 437, 1580, 2041, 2811, 1531, 1239, 2146, 720, 7, 2699, 1709, 1758, 1746, 895, 2874, 1075, 509, 2134, 784, 1955, 2622, 3039, 835, 978, 3066, 1780, 331, 1054, 1936, 2436, 372, 1053, 2296, 2089, 2564, 995, 2935, 3197, 3082, 2165, 2103, 2137, 3025, 437, 2999, 2139, 2857, 2635, 2117, 2008, 1602, 178, 867, 1629, 2815, 721, 3053, 2809, 1553, 1657, 3197, 2220, 3253, 2590, 999, 3143, 986, 1500, 1438, 1051, 1516, 2244, 1455, 1894, 966, 2020, 1741, 2089, 2467, 401, 1130, 2235, 1101, 2837, 1430, 1403, 2932, 2869, 474, 831, 532, 200, 3112, 1516, 3106, 3302, 676, 1224, 977, 2386, 265, 1627, 3146, 3319, 3301, 330, 1568, 1178, 370, 150, 1469, 1677, 1803, 3211, 1902, 1586, 1369, 749, 2116, 1425, 896, 1941, 3254, 1338, 945, 2901, 2316, 471, 776, 808, 2697, 2301, 2192, 2402, 2506, 1004, 2979, 2449, 2896, 2784, 2550, 1963, 857, 2565, 1079, 391, 20, 2708, 3273, 2597, 1661, 2576, 1636, 587, 395, 2874, 2118, 2723, 3063, 564, 41, 1100, 64, 2880, 2463, 2469, 947, 2685, 1563, 1115, 400, 2131, 953, 560, 400]] + +mu: [1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665] +tHat^T * rHat: [2832, 998, 1041, 112, 1377, 3292, 2245, 2778, 1275, 131, 1065, 1532, 1554, 3218, 321, 64, 713, 2494, 1080, 1187, 1448, 2307, 2085, 600, 1497, 1186, 243, 356, 97, 3068, 2998, 1766, 1245, 1393, 1446, 70, 3167, 1797, 393, 2580, 789, 593, 2041, 422, 1847, 1834, 2425, 3181, 54, 1941, 2527, 1251, 828, 1724, 586, 789, 1630, 721, 2239, 1085, 259, 2515, 217, 3208, 930, 2981, 3085, 3225, 851, 2573, 2518, 609, 2072, 3236, 2034, 2805, 1671, 2242, 3032, 2593, 1943, 176, 895, 196, 885, 920, 3047, 2375, 646, 3039, 2687, 1152, 785, 1572, 207, 2196, 2962, 866, 523, 1363, 2262, 2797, 1400, 1828, 2406, 1579, 680, 1879, 180, 1614, 116, 3168, 2110, 3106, 2738, 3256, 3185, 2813, 2433, 2343, 64, 841, 2623, 3211, 2036, 123, 2832, 2922, 1144, 2110, 2682, 1124, 862, 1205, 524, 3286, 439, 3121, 2484, 1957, 1531, 1002, 2941, 3205, 982, 1679, 1973, 1222, 1430, 1574, 2859, 10, 345, 344, 1108, 1822, 784, 2299, 2135, 2346, 3206, 2656, 2077, 757, 1195, 303, 1971, 706, 993, 1931, 2663, 1192, 3152, 2734, 707, 3013, 242, 2335, 2685, 1550, 1923, 1604, 2041, 2685, 2607, 1429, 2139, 2041, 2099, 1781, 1376, 1258, 2320, 346, 1478, 3321, 572, 1093, 316, 787, 2434, 1114, 1757, 1293, 3051, 1743, 1842, 1527, 2670, 822, 2980, 1818, 2503, 1163, 214, 3061, 1190, 2501, 1650, 180, 64, 2031, 2924, 1525, 3214, 2702, 715, 3050, 1714, 3228, 1269, 155, 11, 1043, 2307, 3294, 3308, 2766, 67, 563, 765, 2037, 125, 1582, 810, 2910, 1856, 2345, 3146, 3039, 3002, 1274, 2109, 2488, 2045, 520] +NTTInverse(tHat^T * rHat): [2232, 1324, 153, 262, 1847, 1416, 1179, 704, 88, 3232, 1082, 2292, 1628, 1916, 3032, 2802, 1858, 890, 2481, 1541, 804, 1566, 2553, 2200, 2924, 2688, 0, 2050, 2407, 3241, 2099, 1311, 2358, 528, 1275, 386, 552, 2798, 924, 2192, 1443, 1889, 2438, 2186, 3233, 2258, 1093, 726, 2741, 2431, 651, 870, 1376, 2355, 168, 2366, 692, 2672, 1340, 1489, 1460, 2443, 284, 256, 975, 2416, 2213, 831, 1123, 192, 1765, 530, 1509, 1172, 3312, 2025, 2872, 2944, 1809, 1716, 987, 463, 3269, 2654, 3194, 2944, 1906, 904, 633, 2175, 695, 2662, 2358, 2672, 720, 2781, 1279, 2227, 2303, 2049, 2443, 1296, 1965, 2113, 2468, 1294, 65, 1591, 757, 1164, 3166, 2137, 2708, 1248, 3093, 2018, 2280, 1013, 1610, 2916, 2591, 2842, 1635, 2816, 580, 514, 1221, 2231, 2433, 743, 1694, 707, 19, 896, 2286, 1789, 693, 306, 57, 3257, 1273, 2850, 763, 2603, 1261, 2474, 2133, 2079, 1286, 2860, 1782, 195, 2165, 2808, 1879, 1, 1951, 2754, 2700, 286, 2031, 880, 2542, 25, 2342, 1074, 3036, 1057, 128, 1079, 3282, 1918, 1609, 41, 491, 1524, 2377, 67, 227, 2073, 2509, 1439, 1160, 1490, 1222, 3251, 1901, 1490, 2225, 272, 1737, 1372, 1324, 3310, 226, 2776, 1335, 2768, 1113, 1620, 311, 1735, 160, 443, 1913, 1803, 3181, 1457, 2569, 2543, 148, 974, 2701, 1357, 2180, 1294, 1637, 1155, 709, 2124, 2828, 1059, 1415, 488, 184, 710, 2323, 205, 2977, 2645, 2103, 3014, 1927, 693, 791, 2997, 1509, 2940, 80, 3245, 789, 2218, 2282, 1865, 2319, 941, 3314, 2810, 2836, 715, 741, 1423, 2100, 2656, 3122, 2027] +e2 + mu: [1664, 1664, 0, 2, 0, 0, 0, 0, 1663, 1664, 1666, 1666, 0, 3328, 1667, 0, 1665, 0, 0, 0, 1666, 1665, 1666, 1665, 0, 1665, 2, 1665, 3328, 2, 1666, 0, 3328, 1664, 1666, 2, 1664, 3328, 1666, 0, 3328, 1, 1667, 0, 1, 1664, 0, 3328, 1, 3328, 1666, 1663, 1663, 0, 0, 1665, 1666, 3328, 1665, 3328, 1, 1665, 3328, 0, 1666, 0, 3328, 3328, 3328, 1664, 2, 0, 0, 0, 1664, 3328, 1665, 0, 1665, 1666, 1664, 1665, 1664, 0, 2, 1666, 1, 3327, 2, 1665, 1665, 1667, 1664, 3328, 0, 1664, 3327, 1666, 2, 1665, 1666, 1666, 1, 1666, 1666, 0, 1665, 1665, 1664, 1665, 2, 1, 0, 1, 1664, 3328, 0, 3328, 3328, 3327, 1664, 1665, 3328, 0, 1666, 3328, 3328, 1666, 3328, 1, 1665, 1664, 1664, 3328, 1, 0, 2, 0, 0, 1665, 0, 3327, 1666, 1664, 0, 1667, 0, 3328, 1664, 0, 0, 1664, 1665, 1664, 1, 1666, 1666, 1666, 1, 1666, 0, 1, 1665, 1, 2, 3328, 1664, 1666, 3328, 0, 0, 2, 1667, 0, 1666, 0, 1, 1666, 0, 0, 0, 1, 3328, 0, 1666, 0, 1664, 3328, 1664, 1664, 3328, 1665, 1666, 1666, 3327, 3328, 1664, 1667, 0, 1665, 1664, 0, 1666, 1664, 1665, 1666, 3327, 0, 1665, 1664, 1666, 1665, 1665, 3328, 3327, 1664, 1665, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1666, 1, 3328, 0, 1666, 1, 1, 1665, 1665, 2, 1666, 0, 1666, 2, 1665, 2, 1664, 1665, 1666, 3328, 1664, 3327, 1664, 1665, 0, 1664, 1665, 1666, 1666] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [567, 2988, 153, 264, 1847, 1416, 1179, 704, 1751, 1567, 2748, 629, 1628, 1915, 1370, 2802, 194, 890, 2481, 1541, 2470, 3231, 890, 536, 2924, 1024, 2, 386, 2406, 3243, 436, 1311, 2357, 2192, 2941, 388, 2216, 2797, 2590, 2192, 1442, 1890, 776, 2186, 3234, 593, 1093, 725, 2742, 2430, 2317, 2533, 3039, 2355, 168, 702, 2358, 2671, 3005, 1488, 1461, 779, 283, 256, 2641, 2416, 2212, 830, 1122, 1856, 1767, 530, 1509, 1172, 1647, 2024, 1208, 2944, 145, 53, 2651, 2128, 1604, 2654, 3196, 1281, 1907, 902, 635, 511, 2360, 1000, 693, 2671, 720, 1116, 1277, 564, 2305, 385, 780, 2962, 1966, 450, 805, 1294, 1730, 3256, 2421, 2829, 3168, 2138, 2708, 1249, 1428, 2017, 2280, 1012, 1609, 2914, 926, 1178, 1634, 2816, 2246, 513, 1220, 568, 2432, 744, 30, 2371, 1683, 895, 2287, 1789, 695, 306, 57, 1593, 1273, 2848, 2429, 938, 1261, 812, 2133, 2078, 2950, 2860, 1782, 1859, 501, 1143, 1880, 1667, 288, 1091, 2701, 1952, 2031, 881, 878, 26, 2344, 1073, 1371, 2723, 127, 1079, 3282, 1920, 3276, 41, 2157, 1524, 2378, 1733, 227, 2073, 2509, 1440, 1159, 1490, 2888, 3251, 236, 1489, 560, 1936, 1736, 3037, 2990, 1647, 224, 2775, 2999, 1106, 1113, 3285, 1975, 1735, 1826, 2107, 249, 140, 3179, 1457, 905, 878, 1814, 2639, 1037, 1356, 2178, 2958, 3302, 1155, 711, 2125, 2828, 1059, 1415, 488, 185, 711, 2321, 1871, 2978, 2644, 2103, 1351, 1928, 694, 2456, 1333, 1511, 1277, 80, 1582, 791, 554, 2284, 200, 655, 2607, 3313, 1145, 2834, 2379, 2406, 1423, 435, 992, 1459, 364] + +c: 8D4E2CB39FFDE4311AEEDB2338BF58CE11FADABDC9813A321930F46756DD13A8E7919FAC4F59CC9F8B91C833B3B3F91ADC6F9FBDBDE2F7DAE8841BE5238B9850A5EEBE675DDEF42A9314F690595D51523E8117F22266034F09B77D991EE575802AFE446374EB3D9E1BEB8F25049C6EFA96327366C024CDFBE8DC27EF56492C90409E87139C6088488E17B82D1556C25131ACEE7DAFFE2D437CEC3441BBBBAB80C4BF177E653AE0831C9B4CEB70505727D63C4D474FEDC52019BE411C9A43B87170F5893F06ECD8D782063DF893A1B682246D1C64F8F5A8C6FCDF07927F4D5B7A397FBCBD075045DF2C4A36F5304C95F44AF927AE9166420B39448794F5B3C35227C3C9DF925602A1AC98F851AADB65C93FDD6327AED8AE4129724436A33AA08AA56608855FF80AAA42ACA4562B2D78DBBD2F91AEF251566B8C6F98213784C99DD7D71F495564C908501E35E3BFBB675CCB66635287CB6466E6E38EA8AB11CE7EC60BED8620B3DCD6943D1279A41F93A87FA359E513C81DE918DA88322B1B088140E074BE39BC17E3C51AB719DF6E426D64FF94B8662B9DD26A32A3C3687BF9294C537A2268F9DED380CC8A0F1127EE5A322B4DF24D87FBCE76F560B037C659B6FB15C156071AEDC26EF11140DE88D08D463EA0EAF080A0B2E627D9FF1D56C502335524269727A032DACD16543ADA8342CD6CB40E7228592C3574D982E0B9145EB865DB2EE7810726A916B837CA4F14C2CB9E951BDE76BE16B8B1CDC2EECDC06949B8BEB11786B8F25F4C9AFA5597CEB1D85FC9B9C91DC61966F396091E54C96C97A4300E99FD9F752C0BEF5D88CAFBDCB3993FCF6C7A8C5519FCECB6A79117E9B521680197D8A91AB75F1814DBC58075EF4F07987ABC56A75DA4416EDB9D6F3D771AD340D5CBCFC0E571FA70AAC1C7DBBB5F5C5E1D8B1036F5A6FCFD0625AB5BBDA571839C5835DD6979778F59D348684FA6CFC2A62535B47FAD7F97B5218872D52DCACE9D3C1B11628D352AD821900F44E14B647F6BFA70F646B5C7AF5313177A10954944229153A449FCF89A6263BDBF8556E981E5D6251340F9F43C6692030FB9605BB99F33E96F06D1E4E6ABBE65E14696D530F1B525FFF87D54C1AC2F5E964D46EE37F4045B54E6098F76B28EAF69E998888D25E021A538FD1956A7FC30AE83F8BA9947F864FD59731A6FBB402AF2990E1ED2D56BF62AA6CEAE6F769D2D0C6C313D7AAF974E69DC02CC4318B9457B8CC40656AB7B6134DE3F9801CE019699CE855EBE9C6C02FD08506F004A4EED2CA166C954C7DB8810700CA671EF372A290B00E1BFBB97E3E674D3DCCC57CE59F465B1488FF76F6239008BE3E761EF9C113DF0107B8EEAE3FEBA55B35E4C1DA3B6C87A8D20110E1CD771CCBC30DFF761E603D488E55B853AAE7DAADF2A007B8393DF08AF534F9F53A73757BABE21C86426CF058ECA817EF237BFC58AC298FBF2A1481C4D12DCF1B737FD639769A2531EF931A362A44456EE2CA48598B46259FCC977076C59FA4E2954E9967DA45DA7CBF78633EC59C463FE48A83B801A54DB3FEAB445A357E418B0653F2940B2B71381B2DF9ECF8100848E2912F4BD503AF075AAAF36C136A413C95BE2F25A6D291976CD66A27643537E35E1DF89B1E494B36B08F3D0196CD7E90BA5BB21009F37A843199E08DD95CA4948C533CB263B5D405AF2FA119981A8536EB71C88226C41534C2687BF1EED3475E8488BDE909A93D4DB55B6E834B5E7860AA98FD8BCB13AB077B7BFD75B35FA393E93E3BFB4B9BA1DAA7465FD5B23A5B4CD1716D4BDF7B8D5574B156DB87D8DE1E526C97F8EB287BD97EEEEEF074DBCB2C4DB51A4EFF1FA7FFF328A572D7270017108ACE2ED25093DA535C7A26D3B912AA57FB322E53BB222E94E7CF68CD8A21AD7C06A4AF978ED1DEB10E3F2412AC6543C182068EFFBD87F31765F5AE681EE8B2E9AEB5BC940A94EC0EEF5BEF74874169EABECF1512565C51EA58721DD3AF1690365DB22E1877F2A5C01723F69B7725277AE4E9EFACD3AFA5ADCAF385777E7CE10F956B4642C6FC1C97808993EFD994CA65C75F459AC5872F82488C57FB7AF9AB969D5E369C16D0B2BF7800B938D6784C7F64D0C55CA7794654938949E14217055D34101F9417D370A8ADD72FC0B5766EC1D8ADDD702334A2AC27709C5AC5AE5601DBA952BE258D9336DF3E0F65878A858613258FB5E47941B diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt new file mode 100644 index 000000000..d9c83f3c2 --- /dev/null +++ b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt @@ -0,0 +1,38 @@ +Encapsulation -- ML-KEM-512 +ek: A5409718CB72F2438A3555A3C8F18F2671A1F81403DF7B5A4659A51F50827BA6577AA70800D78D8BC5AA86B89E08B58F3480A89E104DC6922EDBC12D06F891027C654E994A22F91A2AF63404CA98D7B67EEA25911B24C70DEB8146A0821F34A302551F2D510C0588C8BCA74EB4DC0CFA4603C1C5A3C5537061789068682C4CC3143FBA9BB5542F9778BDF23B3652F2A7524756FA73909DDAC7E532522659218CBA25F33B6B0458CB03DA7935BA59111955312B15CCE2C0F73466A8006283A2AA7CBB61022ABBC2D19F2920BC302472DC97C4A1788C9BD3BBEDC9122B827B279C074C80443141119F4B1629F62F10D4CE2BE3BB343816CAD16A1C87582F2B70E26635B08BB390C13398FCCDA7E9BB3D9B0B7803750C955C57A028A5D26C270316BB2B815C3B972BA6782DAB02F306821E61285BB072BF79781CABC386142A50C7AAAE66A947585BB0D8288DBCAF4B3B85BB7926987BAF7643AAB5FB02210580A0264352E69C6098989CFB87483395960A3A4F31BEFDA80B5F286ECFDAA555D4390AF6B55D313920929093449CD6729D00218E2D86570ADC0C4F6545FFB5632EFB3AAE2625A6982670FACE8D16126FA607E6D0A1FF616A46ECA642CC6AAC554DBBC43DFCF57F364C190CEA5776C1CEB58B7007505FD79C5F005A4BA218CF0693B058B510A4CA204324602F59BB8F2281C4D7B0BC8625E7881650F57C89E32CF4809144775C9073B673E39412A27C914321CCB6A7CF7C37C5BCBE7CA51BE0C928466A458EB778D6466A892A0ACBC09638784A27739C970CA58BC2595AD6BFA4E52EB438AC97C41623802248E110B074838F31A6E7503737704E7AE4AD91299572A8C13603500F3609B625B4E24CAE332B0D7A5BB47A038512A081BC27CDF0F2923CD3479F5307020B77F149584564060E5083CED55312B6A6A465A82B4577D63A4B49C80B07A9367E39778AF76FA8EC2CF528722856CE7813401A8383BDB7151B9B6D2DD6BFF55401D28AC612818C88C9287347B098A966EB9C0A2DB71F0A75555E1757D3AC4E3D802C8DC6A261521255186ABB98C2480301B8C6B31228B54461BC44EA3C2CF94B86C7A5B82C55167A7606CA9DC8253B7604E44A07F3ED55CD5B5E +m: 109A248FE8052F84271FF57BAC156B1BA6A509CDCDBCC96CCDB1CCB85CA49315 + +K: 4DDD304E274899BD82971856824B587130927952060121858F9ADEB96AB7F571 +r: D93F0F5C16390B24AB38D288F511F0ECEB618C0E7F0BB9BD65E0321A5C4712A6 +tHat: [[165, 2420, 2840, 1836, 1010, 2212, 1333, 2613, 456, 2303, 294, 2583, 1272, 49, 3039, 1447, 2374, 2645, 31, 2085, 1659, 1402, 1914, 138, 1792, 2269, 1419, 2732, 2182, 2539, 1288, 2299, 52, 2696, 158, 1233, 710, 745, 475, 732, 2054, 2335, 3074, 1623, 2382, 1193, 2338, 431, 1578, 847, 2564, 2444, 1751, 2027, 1514, 2322, 1051, 3186, 2829, 2078, 70, 2090, 1055, 2611, 1282, 501, 301, 197, 2053, 3208, 1980, 1258, 3252, 205, 1786, 52, 1473, 2620, 965, 1797, 2145, 2311, 2152, 710, 844, 332, 2623, 2491, 1205, 757, 2199, 3031, 3058, 867, 594, 2687, 1874, 1380, 1018, 2311, 2717, 3197, 741, 1315, 2342, 533, 2700, 603, 3059, 1715, 2052, 3253, 2563, 1949, 2613, 1435, 2321, 1361, 2865, 338, 716, 3086, 1271, 1635, 168, 1568, 643, 2730, 2940, 1563, 2562, 2994, 450, 2557, 41, 3010, 1072, 1826, 2012, 3145, 2209, 2247, 923, 3005, 2541, 300, 555, 1976, 3111, 121, 76, 1096, 305, 276, 2975, 356, 1577, 767, 1040, 3309, 811, 3006, 2100, 355, 458, 1709, 1820, 1416, 2863, 1794, 1762, 854, 2992, 2872, 400, 828, 3224, 3295, 2471, 3006, 2877, 185, 888, 1872, 1292, 1481, 87, 650, 677, 1741, 807, 352, 3003, 2066, 2908, 2419, 1579, 1930, 2861, 42, 1779, 2080, 286, 646, 91, 1835, 2495, 1927, 2844, 3130, 1158, 673, 1872, 2732, 1710, 2710, 2119, 1461, 2224, 653, 3213, 2811, 2891, 2131, 2491, 615, 2968, 2807, 886, 2724, 2997, 47, 1313, 2048, 1696, 1074, 1618, 2510, 2144, 2441, 2972, 2175, 840, 2387, 2710, 928, 335, 3043, 2301, 186, 2143, 1762, 2767, 2653, 1109, 925], +[1546, 2911, 349, 915, 544, 2313, 1171, 2500, 726, 2519, 256, 2274, 1581, 1400, 3082, 205, 1359, 1110, 1535, 1595, 2862, 943, 1710, 594, 2214, 617, 2672, 3311, 1677, 289, 1647, 122, 230, 2589, 511, 1702, 3142, 2670, 3138, 1708, 1452, 1237, 1211, 988, 1532, 2047, 3126, 404, 2572, 1406, 374, 3308, 2997, 1800, 7, 1525, 3287, 1529, 2560, 1205, 2210, 3313, 774, 2825, 1368, 267, 2724, 524, 1091, 1538, 2351, 2997, 655, 2066, 1988, 2829, 1724, 600, 2279, 360, 1360, 1999, 905, 718, 244, 2328, 1860, 1479, 912, 2919, 883, 2382, 530, 1994, 913, 532, 1740, 2683, 3279, 887, 3269, 3051, 1404, 442, 2528, 652, 2630, 1110, 1934, 1931, 1750, 1700, 2697, 162, 203, 2412, 2104, 1191, 807, 2503, 3223, 2640, 651, 1436, 1626, 3069, 1444, 750, 2228, 2755, 1175, 364, 35, 552, 328, 270, 1200, 2103, 399, 2659, 231, 885, 55, 1255, 1146, 2782, 2449, 2386, 2162, 3098, 822, 1280, 1551, 147, 1462, 2882, 3298, 2788, 2867, 210, 2938, 2885, 890, 2128, 18, 2074, 1980, 3282, 752, 2351, 828, 1149, 927, 117, 2818, 1904, 2545, 1412, 1093, 102, 14, 2101, 1486, 1341, 1554, 2667, 1444, 2694, 1323, 1908, 2774, 1203, 2121, 188, 2311, 874, 2430, 1907, 1930, 1791, 3240, 718, 2293, 1826, 1576, 3301, 888, 1025, 794, 2104, 1981, 347, 2843, 1753, 1581, 3069, 1269, 21, 2770, 3176, 274, 2248, 2440, 652, 1907, 2820, 2456, 1642, 3307, 169, 1837, 507, 1290, 1367, 1886, 1393, 3283, 1258, 61, 712, 1677, 2604, 609, 293, 2133, 1697, 2235, 3113, 840, 16, 1720, 2876, 2066, 2898, 324, 3014]] + +bHat = aHat^T: [[[3168, 3188, 3062, 1132, 108, 2666, 3029, 1599, 507, 3166, 2406, 2585, 37, 2415, 1386, 25, 959, 2147, 1383, 3278, 683, 1054, 2230, 2766, 2314, 2519, 561, 3279, 2896, 487, 1783, 863, 1614, 2452, 829, 2499, 1590, 2885, 789, 316, 1769, 574, 1646, 540, 674, 2867, 2914, 3209, 361, 51, 3098, 2013, 3200, 942, 3179, 2862, 1119, 1122, 1797, 2223, 2597, 2122, 2572, 2138, 1966, 2500, 3270, 891, 1876, 2437, 2629, 1616, 41, 2058, 1054, 1545, 757, 1962, 1818, 2937, 825, 2705, 466, 2824, 1660, 331, 82, 2240, 2568, 1589, 1858, 1407, 2784, 1015, 2616, 2349, 690, 1988, 2528, 1832, 989, 1959, 446, 1593, 1246, 2648, 1616, 2206, 2007, 2371, 2827, 2930, 2403, 1045, 1896, 175, 24, 2046, 1072, 797, 1169, 1119, 2787, 349, 2736, 2002, 2066, 2431, 1344, 2496, 1125, 3195, 2685, 3036, 1036, 1516, 825, 2956, 1746, 1447, 1426, 2442, 1389, 1812, 2052, 1402, 1113, 2637, 531, 2004, 1146, 3243, 132, 3089, 1283, 908, 2812, 2253, 2537, 1909, 1017, 1705, 3227, 1163, 2574, 2166, 3244, 1812, 2087, 3037, 3298, 489, 221, 2927, 1370, 1305, 2338, 1158, 945, 2619, 595, 1229, 423, 1971, 1664, 1565, 669, 2658, 848, 657, 631, 2314, 2768, 3193, 1855, 2042, 2704, 2438, 776, 1597, 2565, 1917, 961, 1584, 3201, 2285, 231, 989, 2946, 1792, 3156, 224, 1483, 2249, 116, 2272, 926, 2505, 428, 106, 1806, 173, 3113, 2337, 2885, 1255, 677, 785, 2010, 1898, 1970, 744, 490, 2718, 3158, 1388, 1822, 2541, 1595, 171, 1835, 2104, 1636, 1308, 458, 708, 410, 2025, 2854, 2630, 657, 1906, 2612, 1548, 1285, 2985], +[2187, 2809, 281, 1086, 1360, 711, 2799, 2132, 1448, 914, 1940, 2572, 623, 1180, 2183, 2741, 2595, 1022, 908, 893, 1752, 3285, 2013, 2536, 2996, 2211, 948, 330, 1830, 2894, 1862, 3010, 1941, 1152, 2089, 425, 925, 3041, 2780, 12, 2052, 1880, 2438, 1003, 540, 2464, 3313, 1791, 1080, 2187, 373, 830, 2382, 2167, 3242, 868, 2239, 825, 2591, 577, 1956, 2541, 1666, 3175, 3237, 3294, 803, 1654, 4, 2142, 804, 1030, 2469, 3106, 2674, 1241, 2770, 1947, 587, 839, 2135, 1409, 583, 11, 423, 2898, 2065, 2559, 2037, 2465, 3139, 918, 348, 571, 1605, 3114, 1457, 321, 364, 2883, 608, 2389, 966, 504, 2656, 2214, 2447, 850, 2028, 3182, 2321, 341, 1618, 1636, 558, 530, 1971, 1119, 2794, 591, 3323, 1004, 540, 46, 1901, 1272, 88, 463, 1969, 3173, 339, 561, 550, 1136, 1709, 1277, 2686, 2038, 478, 2874, 2435, 1733, 2164, 2182, 2979, 852, 12, 3235, 2603, 1357, 1687, 438, 272, 1349, 1036, 429, 1408, 1422, 608, 1369, 2870, 1167, 434, 1669, 2656, 974, 1555, 430, 640, 238, 1626, 76, 454, 2897, 1009, 2852, 1176, 1861, 206, 2633, 1301, 3141, 556, 3305, 1897, 808, 2044, 2623, 2863, 173, 336, 400, 970, 3214, 2334, 1544, 1594, 2119, 870, 3166, 1047, 2902, 958, 198, 2697, 1357, 1468, 568, 2975, 2777, 3228, 3115, 12, 2378, 820, 2341, 645, 31, 1373, 2581, 175, 1393, 2148, 1199, 1866, 2720, 2706, 2886, 24, 845, 3327, 2259, 3315, 2380, 2455, 2167, 1450, 2326, 221, 2727, 1293, 1541, 1152, 2420, 2015, 2573, 3109, 1298, 777, 2173, 1094, 994, 2095, 2504, 2729, 1062]], +[[1357, 636, 1559, 1810, 938, 644, 229, 103, 89, 381, 547, 1750, 1336, 1791, 32, 850, 1642, 3065, 2026, 749, 1380, 924, 2593, 2078, 1428, 2606, 2705, 2884, 866, 965, 515, 3196, 1999, 501, 3092, 790, 2427, 3080, 1155, 2250, 1382, 1619, 1826, 2660, 734, 3268, 984, 617, 2085, 1164, 3016, 198, 482, 2666, 961, 1377, 2830, 3234, 2228, 514, 459, 2799, 2507, 2383, 2515, 1917, 2617, 410, 966, 1685, 3251, 2135, 2910, 310, 999, 1428, 2153, 1082, 157, 336, 398, 2706, 2102, 643, 2493, 1464, 1569, 2378, 1221, 2471, 174, 2576, 721, 2689, 614, 303, 223, 710, 2205, 724, 1091, 2823, 576, 1710, 1972, 1524, 89, 1509, 1520, 2865, 2165, 1541, 1303, 1047, 1128, 1920, 3317, 2991, 2163, 1650, 1932, 2030, 2433, 3115, 376, 556, 1817, 839, 2698, 2316, 822, 1934, 50, 1299, 2961, 3240, 2212, 691, 148, 3239, 698, 321, 3154, 1743, 2713, 64, 2915, 444, 723, 2208, 645, 474, 1985, 2558, 2888, 1379, 53, 1675, 410, 1671, 2221, 1496, 2614, 1098, 4, 3325, 2043, 2059, 2991, 2307, 2704, 1422, 88, 682, 897, 478, 1576, 2699, 658, 2050, 2189, 364, 149, 2210, 3245, 2546, 1965, 2084, 901, 1083, 2854, 3265, 1808, 260, 1680, 2862, 3296, 1011, 2302, 1512, 688, 1287, 2895, 604, 2252, 3083, 2024, 938, 718, 1790, 2428, 294, 428, 2817, 209, 340, 1227, 3287, 2732, 2282, 2064, 1087, 1694, 3095, 1564, 1239, 2204, 2483, 1421, 1358, 1880, 1268, 434, 1552, 565, 20, 893, 2896, 1756, 2499, 2204, 574, 1211, 2151, 1210, 299, 960, 2134, 2990, 930, 2171, 2848, 1297, 3271, 1241, 2550], +[327, 2990, 1094, 2515, 2012, 2050, 1995, 1283, 486, 625, 2883, 245, 3038, 2509, 383, 524, 1019, 1128, 564, 314, 75, 3314, 425, 2395, 824, 31, 652, 2056, 587, 2799, 1466, 2818, 2306, 2785, 3113, 3246, 738, 382, 3306, 1503, 616, 184, 3142, 3259, 1168, 335, 1831, 1243, 1052, 9, 100, 2557, 1609, 20, 3229, 1640, 2221, 2405, 629, 508, 216, 2961, 2631, 1270, 2931, 1574, 2751, 2361, 2026, 1541, 210, 1043, 2443, 1143, 1923, 2032, 2688, 3139, 884, 1725, 644, 200, 2440, 565, 868, 1261, 2603, 2003, 484, 349, 1083, 1599, 1042, 2402, 508, 123, 1624, 352, 1537, 10, 1323, 1047, 1898, 1050, 2852, 2851, 1079, 275, 602, 931, 1956, 3212, 119, 1771, 2944, 2631, 3044, 1561, 725, 3244, 3282, 3236, 2764, 3121, 2703, 209, 3152, 120, 1035, 2101, 2675, 1320, 724, 2295, 1034, 504, 398, 3117, 13, 955, 1287, 2680, 2963, 2382, 415, 2417, 3284, 2099, 1668, 926, 3039, 2604, 1481, 438, 2263, 896, 1430, 1101, 494, 332, 3042, 2114, 2219, 1788, 1194, 2630, 589, 455, 2802, 1218, 2933, 865, 2761, 1921, 1625, 1521, 1448, 978, 514, 3153, 2354, 11, 3165, 3203, 12, 1042, 2122, 493, 1980, 1363, 947, 205, 672, 1565, 247, 918, 2205, 2249, 2083, 665, 672, 1724, 3326, 178, 341, 683, 1306, 2359, 2343, 578, 1846, 1704, 1676, 1248, 750, 3062, 712, 2959, 2430, 3004, 2082, 945, 548, 8, 3003, 3020, 2994, 1248, 2782, 2460, 1158, 3313, 2543, 1244, 721, 1804, 537, 924, 1560, 915, 1428, 1599, 490, 1916, 2237, 2342, 3031, 2823, 2350, 1063, 2087, 1721, 1099, 2391, 1478, 674]]] + +r: [[0, 2, 3328, 3328, 3327, 0, 0, 1, 3328, 0, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 0, 0, 1, 3, 0, 2, 2, 0, 0, 0, 0, 3327, 0, 3328, 2, 1, 0, 0, 0, 2, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 1, 3327, 0, 1, 1, 3327, 0, 0, 1, 1, 3328, 3327, 3328, 0, 0, 0, 0, 3328, 0, 0, 3327, 0, 0, 1, 0, 1, 3328, 3328, 2, 1, 1, 3328, 2, 3328, 1, 3328, 0, 0, 1, 0, 2, 0, 1, 2, 3328, 3328, 1, 1, 1, 1, 2, 3327, 1, 1, 1, 0, 3328, 0, 1, 2, 3328, 3328, 3328, 1, 1, 0, 3328, 1, 3328, 0, 3328, 3327, 1, 1, 1, 1, 0, 3328, 0, 1, 3328, 3326, 3327, 0, 1, 0, 3, 0, 1, 3328, 3328, 3327, 2, 1, 3, 1, 3327, 0, 1, 3328, 2, 0, 3327, 0, 3328, 3327, 0, 2, 1, 3328, 1, 1, 0, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 1, 3328, 1, 1, 1, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 3328, 0, 1, 1, 0, 2, 1, 1, 3326, 3, 3328, 3328, 3328, 0, 1, 3327, 0, 3327, 1, 0, 3328, 0, 0, 0, 3328, 2, 1, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 2, 3327, 3328, 2, 2, 1, 3328, 1, 1, 0, 0, 3328, 1, 1, 1, 0, 3327, 3328, 3328, 3327, 3327, 0, 0, 3328, 1, 1, 3328, 2, 1, 0, 0], +[3328, 3328, 1, 1, 2, 3328, 3328, 1, 3327, 1, 3328, 3327, 3, 0, 0, 3328, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 1, 3328, 3328, 3, 0, 3327, 1, 3328, 1, 2, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 2, 2, 1, 1, 1, 1, 0, 3328, 1, 3328, 3327, 0, 0, 3328, 1, 0, 3328, 0, 0, 3326, 0, 2, 0, 3328, 0, 0, 3327, 0, 1, 0, 2, 2, 1, 3328, 3327, 1, 3, 3328, 3327, 1, 1, 0, 1, 3328, 3327, 3327, 0, 1, 3, 3328, 0, 1, 3327, 0, 3328, 2, 0, 3328, 0, 2, 3327, 1, 3328, 1, 3328, 3328, 3328, 1, 1, 3327, 0, 3326, 3328, 2, 3327, 0, 3, 1, 0, 2, 2, 1, 0, 0, 0, 1, 3327, 1, 2, 2, 2, 3327, 1, 1, 3328, 0, 3328, 2, 1, 0, 1, 1, 1, 0, 0, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 3327, 3328, 3327, 1, 3328, 3328, 3328, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3327, 3326, 3327, 0, 0, 1, 0, 1, 1, 0, 3326, 2, 0, 0, 0, 1, 3327, 1, 2, 1, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 3328, 1, 3327, 3327, 2, 0, 1, 3328, 3326, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 1, 1, 3327, 1, 2, 0, 3328, 1, 0, 1, 2, 0, 0, 0, 1, 2, 3328]] + +e1: [[3328, 0, 0, 1, 2, 0, 3328, 0, 3328, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3328, 3327, 3328, 2, 0, 0, 1, 0, 1, 0, 2, 1, 3328, 1, 3328, 0, 1, 2, 0, 1, 0, 0, 0, 3328, 3327, 0, 1, 3328, 3327, 0, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 0, 3327, 0, 3328, 0, 0, 0, 3327, 3328, 3327, 1, 3328, 0, 3328, 0, 2, 2, 3328, 3328, 2, 1, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3328, 1, 3327, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 1, 0, 0, 3328, 0, 0, 0, 1, 3328, 1, 3327, 0, 3328, 3328, 0, 2, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 0, 1, 2, 3327, 1, 1, 0, 3328, 2, 3328, 1, 1, 1, 0, 1, 0, 2, 0, 0, 2, 0, 1, 0, 0, 2, 3328, 0, 3327, 3328, 3328, 0, 2, 1, 3328, 1, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 1, 3328, 3327, 0, 3328, 0, 0, 3328, 0, 1, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 0, 2, 3327, 2, 3327, 1, 0, 1, 3328, 2, 3328, 3327, 1, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 0, 1, 0, 2, 0, 3328, 3328, 2, 0, 0, 3328, 2, 3327, 0, 0, 0, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 1, 0], +[1, 0, 0, 0, 0, 0, 1, 0, 0, 3327, 0, 0, 3328, 0, 3328, 3328, 1, 2, 1, 0, 0, 0, 0, 2, 3328, 1, 0, 1, 2, 3327, 2, 0, 3327, 0, 1, 1, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 3328, 0, 1, 1, 0, 0, 0, 0, 3328, 0, 0, 1, 2, 0, 0, 2, 0, 3328, 3328, 1, 0, 1, 0, 2, 3328, 0, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 1, 2, 0, 0, 0, 0, 2, 3328, 0, 0, 3328, 3327, 1, 0, 3328, 3328, 1, 2, 0, 0, 0, 0, 1, 1, 3328, 1, 3328, 3328, 0, 3328, 2, 0, 3328, 0, 3328, 0, 1, 1, 0, 1, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 1, 3328, 1, 3328, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 1, 3328, 3328, 3327, 3328, 2, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 3328, 1, 0, 1, 0, 3327, 0, 0, 1, 0, 1, 3327, 3328, 0, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3327, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 1, 0, 0, 3328, 0, 0, 3328, 1, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 0, 0, 2, 3328, 1, 0, 3328, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 0, 0, 3328, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3327, 1, 1, 1, 0, 1]] + +e2: [1, 1, 1, 3328, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3328, 1, 2, 0, 0, 2, 1, 3328, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 0, 3328, 0, 0, 3328, 0, 2, 0, 0, 1, 0, 2, 3328, 0, 3327, 0, 1, 1, 0, 1, 2, 1, 1, 1, 0, 0, 0, 1, 3327, 1, 0, 0, 3327, 0, 1, 0, 1, 0, 1, 3327, 3327, 2, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3327, 0, 1, 3327, 2, 1, 1, 3328, 1, 2, 3328, 0, 3328, 3328, 1, 2, 3327, 3328, 1, 0, 3328, 3328, 0, 0, 2, 0, 0, 0, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 2, 3328, 3327, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 1, 0, 0, 1, 3327, 3327, 3328, 0, 0, 3328, 3327, 1, 3328, 3327, 2, 3328, 3327, 2, 1, 3328, 1, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 0, 1, 0, 1, 1, 3328, 1, 3328, 3327, 1, 1, 2, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 3328, 0, 1, 3327, 3328, 1, 0, 1, 1, 0, 3328, 3328, 3327, 3328, 3328, 0, 3328, 0, 3328, 0, 2, 3328, 0, 0, 3328, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 0] +rHat: [[1859, 3002, 1459, 1664, 1376, 1748, 2271, 3230, 32, 2576, 2658, 234, 3252, 1763, 1324, 635, 2205, 1894, 953, 1375, 1659, 1649, 2944, 2869, 3176, 3103, 2306, 1553, 304, 2679, 735, 561, 3117, 2017, 527, 888, 1853, 2191, 290, 228, 1274, 992, 1359, 2416, 1481, 2617, 3153, 606, 1072, 333, 1630, 833, 3030, 303, 1331, 1900, 566, 2927, 2126, 1823, 443, 442, 2283, 2262, 2674, 2690, 1286, 2859, 1166, 1385, 3056, 2408, 2850, 1495, 456, 2051, 2040, 2554, 2907, 1943, 1514, 2826, 2020, 242, 3276, 2554, 3119, 961, 1246, 955, 1608, 2697, 2451, 2670, 624, 27, 2372, 2130, 2136, 1820, 2375, 2146, 900, 1655, 2891, 2826, 2141, 2689, 528, 2409, 3135, 1014, 32, 2279, 621, 1779, 92, 1908, 1162, 2040, 247, 2523, 1911, 2141, 2085, 2, 1687, 2853, 1528, 1671, 528, 3000, 3040, 2018, 916, 114, 3196, 2196, 1876, 2508, 834, 2437, 1645, 1148, 2659, 1543, 2292, 2399, 1537, 1178, 2860, 821, 1578, 3039, 232, 1732, 2079, 1299, 494, 569, 2828, 1488, 2407, 2593, 1112, 13, 1233, 2269, 3199, 1034, 877, 3029, 2671, 3055, 2567, 3092, 1890, 3208, 1855, 2280, 2708, 2264, 2801, 1973, 418, 2370, 1785, 783, 694, 1755, 854, 2507, 2007, 236, 3197, 1625, 1632, 2522, 1555, 2027, 2927, 2840, 196, 2435, 1109, 1797, 1761, 2465, 2047, 500, 3248, 2507, 264, 2913, 970, 1505, 1122, 92, 1797, 3092, 1663, 56, 2334, 1668, 2254, 1771, 1780, 336, 1603, 2375, 767, 1679, 1510, 960, 2645, 3091, 430, 162, 2121, 3036, 122, 77, 3026, 2312, 2055, 2452, 889, 317, 1522, 1817, 392, 961, 1157, 1355, 1763, 1747], +[1396, 1200, 448, 2954, 1293, 2927, 1975, 933, 146, 1434, 2041, 2095, 1823, 2620, 711, 3141, 3152, 634, 1182, 416, 2474, 3280, 373, 1316, 3262, 1169, 1558, 342, 3177, 2735, 1538, 2137, 2401, 612, 2490, 2924, 1880, 2579, 1096, 319, 2294, 733, 1086, 2039, 2071, 2171, 1240, 2471, 2139, 128, 2939, 3175, 1350, 1374, 514, 2979, 748, 952, 475, 736, 110, 2567, 2024, 2719, 1812, 1023, 461, 2623, 1349, 666, 1226, 1488, 1629, 1294, 2623, 915, 2983, 1747, 2993, 2606, 3025, 188, 10, 209, 442, 3283, 1173, 4, 1504, 863, 1856, 3033, 174, 2137, 196, 2844, 3298, 3089, 2877, 596, 200, 1804, 2530, 1811, 136, 2285, 311, 230, 3322, 545, 352, 845, 755, 2275, 862, 1616, 2317, 1392, 3128, 1985, 3134, 1629, 686, 966, 1910, 3087, 3254, 1306, 1292, 116, 837, 2114, 1743, 2539, 3135, 204, 701, 2656, 86, 3181, 2501, 76, 3004, 2133, 2417, 2131, 1991, 2393, 918, 1488, 3269, 3160, 706, 1302, 2173, 1038, 967, 1768, 492, 115, 3320, 2759, 529, 108, 665, 2759, 1220, 248, 2926, 752, 846, 2846, 1462, 1596, 2427, 751, 190, 1171, 2597, 2740, 455, 938, 2866, 625, 2233, 2336, 2325, 2919, 1381, 3180, 2262, 1224, 2516, 1913, 265, 2104, 1209, 1718, 1463, 775, 2554, 373, 2742, 1494, 2545, 3025, 2248, 624, 3239, 2439, 449, 532, 1068, 2300, 1901, 1495, 2063, 1745, 2759, 369, 1118, 380, 534, 1496, 1212, 2392, 2617, 2525, 600, 445, 989, 2228, 1947, 2183, 614, 1039, 3244, 1482, 1104, 2314, 2300, 1219, 3155, 1912, 1283, 3011, 2028, 2021, 2450, 1424, 397, 3255, 868, 726, 1577, 409]] + +BHat * rHat: [[368, 1205, 1220, 520, 154, 1973, 2334, 175, 6, 1926, 228, 2816, 2562, 776, 1737, 1513, 278, 1914, 970, 553, 1784, 304, 2153, 2947, 1926, 2330, 2242, 3027, 397, 1160, 1904, 3038, 1905, 1497, 136, 1610, 49, 956, 1788, 3025, 871, 434, 1904, 1621, 2582, 1159, 1123, 140, 245, 947, 2166, 1148, 193, 1888, 3004, 2795, 18, 993, 2139, 2998, 691, 1431, 3146, 3156, 1242, 1383, 884, 913, 1753, 2866, 551, 2793, 1156, 2944, 573, 2610, 48, 1200, 1886, 2051, 2708, 1526, 2290, 273, 1678, 692, 3273, 1775, 1278, 508, 525, 1953, 783, 1418, 1755, 108, 395, 3184, 1456, 941, 2814, 519, 686, 3136, 2684, 2798, 2114, 1842, 543, 2400, 1959, 1800, 2907, 2908, 1920, 3210, 1412, 962, 2146, 1408, 1544, 823, 117, 3120, 2163, 457, 2644, 2044, 1122, 1152, 2660, 2959, 1642, 1062, 1741, 3080, 871, 864, 308, 2753, 339, 806, 139, 3011, 1971, 1603, 2145, 123, 2336, 2806, 457, 688, 1029, 695, 53, 2840, 2805, 408, 627, 807, 582, 1401, 1811, 2468, 2358, 1227, 2756, 2077, 378, 1309, 2573, 56, 3211, 681, 1068, 2073, 1192, 1140, 2575, 616, 1358, 905, 844, 2698, 2080, 940, 2319, 2494, 1765, 2141, 2472, 481, 3018, 2430, 2143, 1889, 2830, 2952, 504, 1247, 2757, 1505, 988, 686, 1329, 819, 1862, 3132, 1960, 3127, 1861, 876, 1097, 756, 2717, 1710, 684, 597, 1092, 40, 327, 1993, 166, 2921, 2705, 1982, 1623, 923, 834, 1437, 2807, 2587, 1767, 3154, 2628, 3121, 1448, 3326, 3151, 1804, 510, 2297, 1591, 1044, 2990, 1828, 1594, 3275, 1853, 2537, 74, 1059, 1517, 3148, 2724, 1788], +[1636, 1928, 1024, 2513, 1985, 3275, 3080, 2495, 1462, 969, 2904, 828, 2133, 129, 825, 1494, 783, 1421, 1070, 662, 2001, 2652, 1188, 2452, 3310, 45, 1085, 2849, 576, 1640, 2429, 1386, 1894, 2809, 2880, 130, 1433, 688, 643, 2448, 1633, 2777, 1211, 2426, 1359, 3299, 647, 1961, 2675, 2079, 1358, 1475, 870, 2074, 2210, 2549, 2408, 2109, 274, 2941, 3102, 2704, 1180, 2510, 1089, 1668, 2851, 1457, 3319, 2836, 3093, 1585, 1370, 490, 678, 2338, 2127, 613, 1276, 3149, 876, 2110, 706, 2841, 3048, 2488, 2486, 2741, 2140, 927, 978, 1442, 2152, 1703, 674, 23, 756, 726, 1217, 2849, 2528, 490, 2623, 567, 3169, 1953, 3299, 2067, 2221, 3123, 1904, 2555, 2139, 206, 70, 1099, 669, 246, 2799, 2828, 2592, 1005, 20, 306, 2115, 2917, 3153, 742, 2101, 2586, 1482, 280, 662, 1151, 2084, 3000, 1456, 1509, 292, 2914, 3324, 646, 1909, 2950, 479, 348, 1411, 1216, 1351, 638, 328, 269, 3032, 2445, 1910, 465, 1969, 45, 1360, 582, 3214, 97, 320, 298, 834, 2023, 2199, 2401, 38, 1438, 965, 720, 152, 965, 2348, 659, 19, 682, 1588, 2416, 243, 1944, 921, 1739, 992, 823, 2542, 1942, 70, 1907, 2200, 1180, 2479, 2947, 1587, 2559, 87, 1132, 2621, 369, 171, 1557, 79, 1261, 2623, 2305, 3189, 2226, 3024, 1626, 2158, 516, 868, 792, 2069, 2995, 1730, 2263, 1905, 1092, 484, 2507, 1082, 888, 2070, 654, 3190, 292, 307, 3161, 2697, 1986, 1403, 901, 2761, 848, 1786, 3312, 887, 1446, 2556, 2197, 3007, 1821, 3095, 2429, 2910, 432, 2448, 2364, 2541, 3066, 338, 2861, 2803, 1919]] +NTTInverse(BHat * rHat): [[1954, 1346, 1561, 2402, 2082, 2172, 713, 1618, 1556, 529, 545, 2116, 171, 357, 2189, 3225, 3041, 2117, 2709, 2684, 3018, 2481, 2380, 1743, 2956, 483, 975, 2951, 2508, 3057, 3225, 1070, 85, 973, 2803, 2854, 1088, 1105, 941, 942, 2284, 1184, 2830, 351, 778, 1567, 946, 2593, 1283, 1569, 949, 510, 1102, 731, 2200, 979, 1697, 746, 149, 815, 1370, 3069, 2156, 567, 1978, 1277, 1928, 1699, 2594, 692, 1890, 1503, 351, 1925, 116, 166, 477, 2961, 610, 1142, 1327, 1668, 3139, 157, 2415, 1690, 3073, 345, 573, 443, 2931, 2937, 2767, 1411, 182, 654, 2084, 1922, 2702, 842, 1372, 1301, 2641, 1946, 747, 609, 1712, 946, 3109, 1556, 1444, 2571, 2267, 1509, 439, 1361, 1534, 1436, 2768, 57, 120, 2808, 811, 2091, 2616, 131, 1488, 2424, 1942, 628, 3110, 1074, 1418, 2568, 2945, 3253, 3110, 124, 765, 2421, 9, 2064, 312, 1484, 2794, 893, 2175, 1546, 784, 508, 9, 923, 1413, 1065, 470, 253, 1991, 1815, 1833, 1769, 3274, 1658, 3097, 1726, 2606, 60, 607, 2184, 2823, 2430, 3153, 2004, 920, 1765, 1626, 1603, 1327, 2325, 1038, 1466, 778, 3034, 599, 1194, 184, 3145, 501, 46, 289, 492, 3072, 403, 437, 1497, 1863, 1357, 919, 1662, 1113, 1337, 3275, 3063, 1770, 1536, 3051, 479, 1648, 2206, 634, 2823, 2888, 3126, 2092, 818, 182, 2386, 1232, 991, 2450, 2050, 2001, 3081, 1879, 1756, 1462, 624, 17, 568, 2531, 777, 3075, 2684, 21, 1727, 830, 3229, 2334, 1453, 767, 2059, 1720, 796, 780, 2562, 2477, 317, 2187, 2862, 1023, 529, 3141, 1628, 1585, 277, 3106, 2480], +[586, 3093, 251, 2710, 1969, 1081, 1181, 1433, 1108, 1107, 399, 1048, 1366, 846, 1998, 743, 579, 929, 2878, 2923, 2512, 3241, 3252, 488, 1180, 2798, 1010, 2834, 2825, 676, 3105, 96, 2148, 2627, 2882, 1152, 1968, 426, 2390, 1936, 192, 862, 1317, 3292, 656, 3276, 720, 2661, 3090, 3067, 737, 704, 145, 242, 1123, 1712, 2929, 2776, 1057, 1762, 3244, 411, 3232, 601, 1888, 2482, 1298, 2287, 1461, 944, 1142, 1309, 1950, 1886, 1819, 2243, 3025, 1056, 1745, 477, 3109, 2099, 2219, 1725, 1167, 1732, 2222, 1571, 1718, 1644, 2529, 1252, 3249, 1127, 3209, 3170, 3312, 3303, 8, 1399, 3073, 3274, 3053, 2501, 1481, 2432, 3245, 1518, 1784, 1459, 2310, 3195, 1629, 1507, 1421, 1794, 490, 63, 899, 1656, 726, 3219, 2191, 309, 1422, 733, 355, 2857, 3324, 303, 1906, 1805, 70, 2561, 3031, 728, 1303, 1262, 848, 156, 569, 3106, 1308, 750, 2230, 3038, 1640, 2623, 623, 1655, 2795, 1206, 2318, 2756, 1525, 151, 1031, 1432, 2378, 2271, 1804, 726, 669, 1265, 4, 404, 2758, 1879, 1089, 2790, 2088, 1287, 1111, 2643, 327, 2684, 2948, 2247, 1555, 2490, 1601, 234, 2484, 192, 1495, 1157, 3328, 1183, 3049, 2748, 127, 2047, 659, 3158, 1596, 2146, 3287, 228, 1064, 920, 3096, 40, 359, 328, 1253, 3247, 334, 37, 1873, 1937, 1208, 1138, 2190, 3215, 1318, 2667, 1805, 460, 453, 1732, 499, 597, 381, 954, 2752, 1798, 1608, 3056, 3274, 3082, 2792, 2553, 2056, 635, 1935, 59, 909, 2448, 2486, 3161, 1121, 1408, 1591, 529, 1193, 1237, 1590, 506, 31, 2969, 1477, 2038, 1469, 1581, 1873, 3069]] +u = NTTInverse(BHat * rHat) + e1: [[1953, 1346, 1561, 2403, 2084, 2172, 712, 1618, 1555, 529, 545, 2118, 170, 357, 2189, 3225, 3041, 2117, 2709, 2685, 3019, 2481, 2381, 1742, 2954, 482, 977, 2951, 2508, 3058, 3225, 1071, 85, 975, 2804, 2853, 1089, 1104, 941, 943, 2286, 1184, 2831, 351, 778, 1567, 945, 2591, 1283, 1570, 948, 508, 1102, 732, 2201, 980, 1696, 746, 148, 815, 1371, 3069, 2155, 566, 1977, 1277, 1928, 1699, 2594, 692, 1890, 1501, 352, 1925, 114, 166, 476, 2961, 610, 1142, 1325, 1667, 3137, 158, 2414, 1690, 3072, 345, 575, 445, 2930, 2936, 2769, 1412, 182, 654, 2084, 1923, 2700, 840, 1371, 1299, 2640, 1947, 745, 609, 1712, 946, 3109, 1557, 1445, 2569, 2267, 1509, 440, 1361, 1534, 1435, 2768, 57, 120, 2809, 810, 2092, 2614, 131, 1487, 2423, 1942, 630, 3111, 1073, 1418, 2567, 2946, 3252, 3109, 123, 766, 2420, 9, 2064, 311, 1484, 2794, 894, 2177, 1544, 785, 509, 9, 922, 1415, 1064, 471, 254, 1992, 1815, 1834, 1769, 3276, 1658, 3097, 1728, 2606, 61, 607, 2184, 2825, 2429, 3153, 2002, 919, 1764, 1626, 1605, 1328, 2324, 1039, 1466, 777, 3034, 598, 1194, 185, 3146, 500, 45, 288, 493, 3073, 402, 435, 1497, 1862, 1357, 919, 1661, 1113, 1338, 3274, 3063, 1771, 1537, 3050, 478, 1647, 2207, 634, 2825, 2886, 3128, 2090, 819, 182, 2387, 1231, 993, 2449, 2048, 2002, 3081, 1879, 1755, 1462, 623, 18, 569, 2531, 776, 3075, 2685, 21, 1729, 830, 3228, 2333, 1455, 767, 2059, 1719, 798, 778, 2562, 2477, 317, 2186, 2862, 1024, 528, 3140, 1628, 1585, 276, 3107, 2480], +[587, 3093, 251, 2710, 1969, 1081, 1182, 1433, 1108, 1105, 399, 1048, 1365, 846, 1997, 742, 580, 931, 2879, 2923, 2512, 3241, 3252, 490, 1179, 2799, 1010, 2835, 2827, 674, 3107, 96, 2146, 2627, 2883, 1153, 1968, 428, 2391, 1936, 193, 864, 1317, 3294, 655, 3275, 720, 2662, 3091, 3067, 737, 704, 145, 241, 1123, 1712, 2930, 2778, 1057, 1762, 3246, 411, 3231, 600, 1889, 2482, 1299, 2287, 1463, 943, 1142, 1309, 1950, 1886, 1821, 2242, 3026, 1056, 1745, 476, 3110, 2101, 2219, 1725, 1167, 1732, 2224, 1570, 1718, 1644, 2528, 1250, 3250, 1127, 3208, 3169, 3313, 3305, 8, 1399, 3073, 3274, 3054, 2502, 1480, 2433, 3244, 1517, 1784, 1458, 2312, 3195, 1628, 1507, 1420, 1794, 491, 64, 899, 1657, 725, 3219, 2189, 309, 1422, 733, 356, 2856, 3323, 301, 1907, 1805, 70, 2561, 3030, 729, 1302, 1263, 847, 155, 570, 3105, 1308, 751, 2231, 3037, 1641, 2622, 623, 1657, 2796, 1205, 2317, 2754, 1524, 153, 1031, 1432, 2379, 2272, 1805, 726, 670, 1266, 4, 404, 2760, 1879, 1089, 2789, 2089, 1287, 1112, 2643, 325, 2684, 2948, 2248, 1555, 2491, 1599, 233, 2484, 192, 1496, 1156, 3328, 1184, 3050, 2747, 127, 2047, 658, 3156, 1595, 2148, 3287, 227, 1063, 919, 3096, 40, 358, 326, 1253, 3248, 334, 37, 1872, 1937, 1208, 1137, 2191, 3215, 1317, 2666, 1804, 460, 455, 1732, 499, 596, 379, 954, 2752, 1800, 1607, 3057, 3274, 3081, 2791, 2552, 2055, 634, 1936, 58, 909, 2448, 2486, 3161, 1121, 1407, 1592, 530, 1191, 1237, 1589, 507, 30, 2970, 1475, 2039, 1470, 1582, 1873, 3070]] + +mu: [0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0] +tHat^T * rHat: [2898, 604, 1851, 197, 557, 1080, 2663, 933, 720, 668, 749, 1062, 1483, 1476, 2960, 3036, 1765, 1359, 218, 2737, 2553, 462, 2252, 354, 1127, 347, 1348, 1699, 2478, 1293, 2625, 906, 2098, 1280, 1579, 728, 149, 3146, 2194, 1059, 1410, 2619, 997, 1785, 2820, 2761, 761, 2061, 181, 2980, 3068, 1359, 1662, 782, 2010, 699, 884, 1048, 617, 624, 1691, 81, 2861, 676, 2791, 206, 2391, 1580, 1438, 850, 1898, 2109, 2720, 1645, 2249, 3107, 2672, 3237, 1103, 468, 910, 594, 1827, 775, 934, 3169, 1070, 1433, 1175, 693, 2250, 320, 2731, 1428, 2938, 2619, 1695, 3008, 2426, 3271, 56, 310, 271, 1992, 107, 2799, 2512, 467, 35, 622, 2631, 1385, 2686, 593, 252, 531, 1783, 1991, 1599, 2361, 3057, 351, 899, 2698, 783, 2618, 1876, 367, 1074, 52, 3165, 1141, 2789, 1714, 3135, 3309, 2522, 1471, 681, 207, 1334, 622, 418, 3034, 1884, 2753, 2536, 2857, 935, 1322, 2436, 1783, 1149, 144, 449, 2373, 3175, 2481, 2831, 2889, 2556, 866, 622, 1406, 2082, 2905, 1659, 753, 2708, 1557, 2755, 186, 2609, 2913, 682, 2745, 2057, 1080, 2787, 1890, 2345, 653, 2151, 2866, 2966, 588, 601, 2193, 459, 502, 727, 1304, 2099, 1200, 1624, 2509, 2910, 20, 1596, 198, 2915, 1272, 701, 1040, 2329, 323, 793, 1409, 2345, 2112, 544, 237, 2468, 1139, 2860, 789, 3030, 577, 352, 1310, 862, 1729, 1967, 2303, 834, 1753, 2271, 356, 3272, 973, 1334, 1513, 552, 42, 325, 2105, 37, 1164, 1976, 166, 1473, 2088, 485, 1945, 454, 666, 288, 2608, 3144, 121, 730, 2849, 1823, 1620, 55, 1461] +NTTInverse(tHat^T * rHat): [619, 2111, 495, 3086, 1708, 2575, 1456, 2210, 3041, 2742, 2098, 3252, 2817, 563, 2989, 768, 1240, 1666, 2270, 385, 1667, 52, 3302, 3155, 520, 1750, 742, 2379, 1962, 1056, 2747, 2281, 2575, 131, 2532, 31, 2060, 2972, 2587, 734, 1013, 1051, 2209, 1470, 1552, 2181, 3082, 338, 2982, 1455, 2472, 685, 1576, 1443, 1139, 50, 201, 2373, 1957, 717, 2787, 2950, 3013, 2403, 1364, 361, 2847, 1063, 174, 1698, 1539, 2669, 3038, 636, 659, 2291, 1259, 82, 1523, 581, 2524, 392, 3100, 2847, 1038, 2746, 23, 2669, 1076, 1034, 3234, 2790, 2650, 1380, 3039, 1605, 2565, 127, 2442, 2758, 579, 495, 2510, 3169, 2450, 274, 1849, 1691, 2280, 523, 1361, 252, 108, 2708, 852, 1381, 2999, 714, 2995, 1596, 713, 1402, 1746, 2727, 2152, 2127, 2957, 2889, 3305, 1762, 1863, 715, 3261, 2306, 1267, 1410, 1288, 1353, 3289, 224, 2433, 3119, 2208, 3227, 2664, 2168, 158, 1760, 2356, 965, 1484, 2864, 2377, 297, 227, 2099, 1129, 1150, 132, 34, 865, 2040, 1403, 422, 3202, 2231, 2703, 3013, 1216, 1791, 288, 3235, 1150, 3176, 628, 1581, 2397, 2726, 461, 295, 2414, 3327, 1897, 211, 444, 3181, 2242, 2974, 539, 2391, 3091, 2360, 1393, 2294, 3018, 1880, 1651, 1807, 1370, 448, 1832, 1566, 2529, 1121, 2210, 125, 874, 1002, 3204, 2720, 2624, 2630, 2780, 2283, 3176, 2590, 3282, 2094, 409, 35, 217, 2400, 3143, 649, 118, 242, 1685, 2327, 2268, 1264, 701, 3035, 713, 2364, 2667, 1838, 593, 1713, 1872, 1164, 2830, 700, 742, 2714, 1303, 525, 2451, 338, 652, 1462, 927, 3254, 1730, 534, 2147, 1083] +e2 + mu: [1, 1, 1, 3328, 1665, 3328, 0, 1, 0, 1665, 3328, 1666, 1664, 1, 3328, 1666, 3328, 3328, 1664, 1, 0, 1665, 3327, 0, 1665, 1664, 1666, 1667, 0, 0, 2, 1666, 3328, 0, 1, 1665, 3328, 1664, 1665, 1664, 1663, 3328, 1666, 1, 0, 3328, 3328, 0, 1665, 1664, 1664, 1666, 0, 1664, 0, 0, 3328, 0, 1667, 0, 0, 1, 0, 1667, 1664, 1665, 1663, 0, 1, 1666, 0, 1, 1667, 1666, 1666, 1666, 1665, 0, 0, 1, 1663, 1, 1665, 0, 1663, 1665, 1666, 1665, 1666, 1665, 1, 1663, 1663, 1667, 1665, 0, 1, 1, 1664, 1664, 0, 1664, 3327, 1665, 1666, 3327, 1667, 1, 1666, 3328, 1, 2, 1664, 1665, 3328, 1664, 1, 1667, 1663, 3328, 1666, 1665, 3328, 1664, 1665, 0, 2, 0, 0, 1665, 1666, 0, 3328, 1664, 0, 1666, 1664, 3328, 1666, 0, 2, 1664, 3327, 1665, 1664, 3328, 3328, 1666, 3328, 1, 0, 1, 1665, 0, 1666, 1663, 3327, 3328, 1665, 1665, 1664, 3327, 1666, 1664, 3327, 2, 1664, 1663, 2, 1, 1664, 1666, 1665, 1665, 0, 1665, 1666, 1, 3327, 1665, 0, 0, 1666, 1665, 1, 1, 1664, 1666, 3328, 1663, 1666, 1, 1667, 3328, 1665, 1664, 1, 3328, 1665, 1664, 1665, 3328, 0, 0, 1666, 1665, 3328, 1665, 1, 3327, 1664, 1666, 0, 1, 1666, 1665, 3328, 3328, 3327, 1664, 1664, 1665, 3328, 1665, 3328, 0, 1667, 1664, 1665, 0, 1664, 0, 1, 0, 1665, 0, 1, 1664, 0, 1665, 1665, 1665, 0, 3328, 1664, 0, 0, 1666, 1665, 0, 1665, 3328, 1665, 0, 0, 0] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [620, 2112, 496, 3085, 44, 2574, 1456, 2211, 3041, 1078, 2097, 1589, 1152, 564, 2988, 2434, 1239, 1665, 605, 386, 1667, 1717, 3300, 3155, 2185, 85, 2408, 717, 1962, 1056, 2749, 618, 2574, 131, 2533, 1696, 2059, 1307, 923, 2398, 2676, 1050, 546, 1471, 1552, 2180, 3081, 338, 1318, 3119, 807, 2351, 1576, 3107, 1139, 50, 200, 2373, 295, 717, 2787, 2951, 3013, 741, 3028, 2026, 1181, 1063, 175, 35, 1539, 2670, 1376, 2302, 2325, 628, 2924, 82, 1523, 582, 858, 393, 1436, 2847, 2701, 1082, 1689, 1005, 2742, 2699, 3235, 1124, 984, 3047, 1375, 1605, 2566, 128, 777, 1093, 579, 2159, 2508, 1505, 787, 272, 187, 1692, 617, 522, 1362, 254, 1772, 1044, 851, 3045, 3000, 2381, 1329, 1595, 2379, 3067, 1745, 1062, 488, 2127, 2959, 2889, 3305, 98, 200, 715, 3260, 641, 1267, 3076, 2952, 1352, 1626, 224, 2435, 1454, 2206, 1563, 999, 2167, 157, 97, 2355, 966, 1484, 2865, 713, 297, 1893, 433, 1127, 1149, 1797, 1699, 2529, 2038, 3069, 2086, 3200, 2233, 1038, 1347, 1218, 1792, 1952, 1572, 2815, 1512, 628, 3246, 734, 2727, 459, 1960, 2414, 3327, 234, 1876, 445, 3182, 577, 1311, 538, 725, 1428, 2361, 3060, 2293, 1354, 215, 1652, 1806, 3035, 2112, 168, 1565, 2529, 1121, 547, 1790, 873, 2667, 3205, 2718, 959, 967, 2780, 2284, 1513, 926, 3281, 2093, 407, 1699, 1881, 736, 3142, 2314, 117, 242, 23, 662, 604, 1264, 2365, 3035, 714, 2364, 1003, 1838, 594, 48, 1872, 2829, 1166, 2365, 742, 2713, 2967, 525, 2451, 2004, 2317, 1462, 2592, 3253, 66, 534, 2147, 1083] + +c: 597A06DEB88172BA8D7CDE8D82CAA234B8112AF8A72F1AB4CEA1EFCB2D868D53D212E303B70E7E521AB0F4B5DB4F51159248BFB275361BEF883752C78B8D4712275385536A4B0A96E3C23EA6C17EA92B602616E5821E5753A4736C4039C20C923CCECB579805587C0CE72218BB1AB12452F8E154CB8643328142F9B340A641C6F295E5ECF2E048BC7FC79BC5B94277C868D8E536B50425809DCFA024A3905CBA550AD3BB52B459AC38FABC9BC00EBA03EC0906725B4FE4E976F174320047B31D15891365BA482388F0FB973B85224FB00BA865AFAB3C9A1B7D489F7B982D0BD470EF948ECB5B3920AF89035960123B1F8630D763681BFD671567EFBB1E6276AA4FB2DFA9C3948DB7F083F28383B77BC514AF9D68D22E2487C20163C02B0BBF23BBCE0650F84FF8CE02C74E9E11D6F30EC5FA8A012ADC3B89627C7DE855C1FBBEB5DCDE84D05E36C5566E5551B58750A411642639B27864F7E005978FFE256B757D13DA663FC3BB0794A27CF7585D12F22D953B285459FDC9BCDFCDCCB7BF3E4E362D2891D583855F5D9487E6FB217E2E45EE0BD9AFC289F4D564581209A3ACA31795A124BD1BBAEA846755C8EA7810EAA73060E86FB5FDF3FBE72F806BB1BFBFBAC0C7B16BFE74250277ECF5F541571B8A975050917FDF781FEA17B585E3C6DBFE77B1E48A16504C3A38901156100CAFEC2ED939AE9A9EDFC9C0F8C7F55CC93E5DDD0B3DE1C6EDAE2B7EE34C6101F011B5904F693D286356B54C86CE8BCFEA9DBFEC21C1EF0ECC9105005BAA377D829DCA2CBF5EA5F31B71D446B833E00619819D7FC6024052499757A2765F19CD2B36C2488599DC5247494FABE81EEBEFD3BE75C4780E43A50418C5DB2FF359C5A6DE286EF5951E2709486EDC9CC49D0724ECA3F2C0B75F8A36CE862388F00B3C593D1C8C6AC45D73A72FF6B4F805B131ED4EAF5601D7B73B0E3724E75D58DD50F5871C54A37C1481331759F4BE86FB58A2EE003130F66E187C8BA5015BE713296589ACAFBF6596897E03D4920C91F26333B7BF1798AF815C93D4DF55BD47A08249BF113063FBB39503E9B6D43EAC7B0C305A diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt new file mode 100644 index 000000000..835173cf5 --- /dev/null +++ b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt @@ -0,0 +1,50 @@ +Encapsulation -- ML-KEM-768 +ek: 1456A2EE8C3556054ABC79B4882C3190E5CA726AB402E5B09728C0F4F79C9FC2ADD828ABE432B1501B60F46CCBC86A3378C34895708A13671B20B389479AAA01C69D6B3B7D07D1C3AB54B91C580F5A336B30069A4F134FFD3764CE73A047E2844771742BF4710B972D4F6590A1C53A975368C271B670F1A4036441054A66E8815997512288552FD7149FFB705AAE133F8414060D0092FA8A1627D78AB2ABC6696288BAF5C60EF370827A7EFA72AE5C6741A5DA043D5940F121485372A98F472D60F05F74D95F01A1991E73A3E0A9536467A4738AB4CF385BA772827EB8CC058B3572E40B598444C181C7F6D9B760A7B907092E9C3351EA234E4449BD9B61A134654E2DA191FF0793961569D3594448BBC2586999A6671EFCA957F3A6699A4A1B2F4707ABA0B2DB20114FE68A4E2815AF3AAC4B8C6BE5648C50CC35C27C57288028D361708D302EEBB860BEE691F656A2550CB321E9293D7516C599817B766BA928B108779A1C8712E74C76841AC58B8C515BF4749BF715984445B2B53063384001E55F68867B1AF46CA70CA8EA74172DB80B5218BDE4F00A0E658DB5A18D94E1427AF7AE358CCEB238772FCC83F10828A4A367D42C4CB6933FDD1C1C7B86AD8B009657A96222D7BA92F527AF877970A83247F47A23FC2285118B57717715204674DA9C94B62BC7838CF87200156B26BA4671159931C49322D80671A0F332EAA2BBF893BE408B9EAC6A505483AA9075BD1368B51F99211F480A9C542A75B5BE08E43ADAF301DD729A85954010E64892A2AA4F15C0BD70B3D856494FF9BA0FE4CE12991CA06B5E3D0B2AF1F797B7A2B760910AE9F833D0D4267A58052C2990F161B886E251711C09D085C3D958B144192C9CC3224A460715B6784EB0B26F237187507D85C5110ACC71CE47198F254553356DAB448C38D243A7C02BE40C908C828D05C081DFAB8FC6B5CFE7D56E7317157DC053B2B3489986B081288871818585E09931095E3274A084115BE276438254A796270A7B4306F08B98D9C2AAECF7065E74446B7C696DBAAF8B4625A10B07827B4A8BABAB09B64AE1C375BB785441F319FB9AC2F14C95FFB252ABBB809C6909CD97706E40691CBA61C9252BD38A04311CA5BB2CA79578347505D0888851E082648BD003BE97C0F8F66759EC96A96A081C6822C4510559537042FC15F069A649B74A10961B354A1F625B04E25B293CF65FB4F53A80CC733D7A175775BF8A9ABB9201620E83A7F3E724D1287DBC44BDD5D85FC71545A927BEEDE537A7768735CC1486C7C3F31104DB67343F435D2D45554BAAC9CDB5822E8422AE8321C78ABE9F261FD4810A79E33E94E63B3341872C92253521997C084FBC060B8B125CCC88AC85AC5FE3168ACB059B3F119C4E050A20732F501BB9B3E687C846B5C2653F8886373E1004A2AB8D1BB970A7E571D8A46EE81B782F26942DD394FDD9A5E4C5631D985528604B1CC976275B6AC8A67CEEC10FFACBBA3D3BB141321DFC3C9231FC96E448B9AB847021E2C8D90C6BCAF2B1240783B62C79DEDC072A5763E660AF2C27C3F0C3C09207CAD990BB41A7BFCEC99F51596A0E83778F85C006AC6D1FE981B4C4BA1CB575A7D07AE2D31BA760095F74BC163841CF8FF77F894ABC6D261ED87A4530363B949C4AD24EFB3A56809478DDA2 +m: 40BE9DCAC16E9CA73D49D0C83F9D3D89BB71574A4219A0F393DFECE2988394C4 + +K: 616E0B753A3B7F40FEF9A389F58F16BFBB04622941D2464BDAE767820DFAC38E +r: DF3BF6F2937BC204C19CB6531298C968C4099B04718020BED6C7F3B0D1A33AFB +tHat: [[1556, 2597, 3310, 856, 1366, 1184, 2492, 2887, 3208, 786, 1424, 3246, 2674, 2886, 1282, 2830, 2199, 3074, 2036, 2511, 671, 2780, 2264, 2738, 740, 2835, 2896, 1537, 3316, 3254, 2760, 822, 888, 1164, 149, 2215, 1811, 438, 800, 2203, 2631, 2729, 1537, 2524, 2923, 2003, 263, 3133, 1195, 2965, 2076, 245, 858, 1715, 1584, 2464, 847, 1265, 2045, 1603, 974, 2567, 583, 2126, 327, 1863, 1067, 1823, 1803, 729, 1359, 2310, 1441, 940, 919, 1669, 450, 2919, 368, 2639, 1027, 1046, 2565, 1636, 488, 1432, 407, 549, 1416, 757, 1239, 2545, 251, 1447, 942, 1009, 1156, 97, 13, 2336, 2810, 360, 1831, 2221, 2994, 3178, 617, 2182, 1466, 3183, 782, 1807, 2690, 2023, 762, 2791, 1884, 1046, 2725, 77, 2365, 1029, 497, 1154, 595, 2711, 1935, 724, 96, 1535, 2420, 1533, 257, 2458, 798, 2615, 2528, 1338, 1892, 2630, 2675, 2888, 2255, 1459, 679, 2087, 2174, 3275, 2821, 856, 1138, 190, 1113, 1096, 449, 3192, 2550, 2941, 1888, 2970, 2311, 736, 924, 1299, 1002, 1250, 2372, 3028, 411, 2582, 1332, 1254, 301, 2330, 2047, 2352, 1430, 1681, 2515, 1093, 2888, 3115, 2392, 2454, 1958, 486, 2556, 1402, 1779, 1690, 2714, 436, 1839, 116, 171, 2858, 219, 274, 1615, 2222, 2126, 338, 2735, 2755, 3147, 1720, 1253, 2246, 3152, 860, 3266, 1399, 40, 648, 467, 1798, 141, 739, 2283, 1547, 1726, 2334, 1782, 2597, 3157, 2864, 2337, 670, 1341, 359, 2501, 2073, 1659, 1719, 2217, 2834, 1800, 2471, 1820, 296, 3303, 1892, 2692, 3153, 3211, 1304, 1115, 1871, 1947, 351, 1176, 1108, 1458, 779, 2147, 1027], +[1281, 1534, 1640, 1976, 1050, 1743, 3239, 2688, 1258, 375, 2093, 187, 2130, 3025, 228, 175, 1294, 2262, 437, 2266, 404, 1070, 1914, 2799, 3125, 3304, 2226, 1907, 3119, 2108, 2289, 640, 932, 1658, 3284, 1218, 950, 1017, 3293, 449, 1659, 2776, 139, 2400, 2391, 1578, 1826, 2989, 1426, 639, 1967, 1944, 2160, 810, 1095, 1967, 3107, 559, 389, 2225, 343, 1911, 21, 1122, 2676, 2509, 1684, 699, 967, 2248, 760, 7, 2837, 614, 1722, 1812, 2325, 793, 964, 553, 1752, 1808, 928, 815, 746, 3002, 1016, 3049, 2880, 2536, 2732, 1286, 852, 2728, 1424, 3031, 2067, 2902, 2335, 537, 2079, 164, 1180, 677, 1397, 3051, 1032, 942, 986, 31, 733, 2471, 1413, 1033, 1552, 1166, 658, 2730, 1359, 3073, 189, 2871, 1752, 1173, 2383, 2991, 1039, 3310, 2322, 457, 2976, 1510, 2877, 672, 2033, 2431, 695, 2938, 352, 169, 2281, 831, 1232, 621, 2170, 85, 2348, 2306, 497, 2950, 646, 1310, 3185, 145, 1488, 3128, 2265, 2837, 2372, 705, 924, 556, 1610, 116, 1557, 1931, 78, 2859, 879, 1810, 135, 2005, 1413, 284, 3082, 1820, 1998, 404, 1423, 1106, 1363, 1747, 1195, 2244, 568, 1085, 167, 700, 3300, 2304, 652, 2264, 5, 2076, 3039, 2298, 1478, 3323, 1511, 1773, 1907, 337, 125, 1340, 946, 1163, 1689, 2824, 2177, 2178, 369, 2136, 133, 2462, 2353, 1504, 1074, 2567, 388, 1457, 1762, 1079, 1154, 2677, 1942, 162, 891, 100, 3056, 2440, 729, 2732, 2028, 111, 1118, 1095, 3179, 1687, 2669, 2811, 1675, 596, 2977, 112, 2946, 1191, 2955, 2746, 1545, 1195, 993, 1884, 2235, 1351, 833, 415], +[2811, 3113, 3313, 2388, 767, 1323, 2987, 2059, 2460, 150, 1997, 1801, 110, 1684, 2588, 1563, 1481, 690, 2771, 72, 3121, 2641, 3259, 2674, 2197, 839, 1397, 3328, 2184, 1304, 736, 1608, 139, 61, 1982, 3081, 1784, 1663, 3161, 2414, 2729, 134, 2076, 550, 452, 85, 857, 1797, 3138, 351, 2544, 2662, 1865, 1195, 1552, 441, 2613, 500, 2914, 69, 3042, 661, 1596, 1535, 1460, 943, 3200, 1852, 2621, 375, 1367, 3063, 2698, 3001, 402, 1568, 782, 2680, 2035, 590, 2257, 2002, 1212, 3028, 2261, 1533, 1479, 1105, 1961, 3042, 1517, 894, 1703, 2167, 3125, 332, 1926, 3132, 499, 65, 2011, 838, 831, 1492, 1325, 1364, 2635, 3226, 1485, 2091, 1070, 552, 942, 536, 2759, 3048, 1695, 498, 468, 168, 889, 1006, 1684, 958, 307, 2164, 556, 601, 309, 2450, 2172, 1264, 1724, 176, 651, 1473, 2252, 2760, 3205, 1530, 1763, 2209, 1483, 2480, 319, 2497, 1358, 160, 800, 759, 2896, 2961, 1715, 2174, 1736, 2900, 1474, 1014, 1672, 888, 62, 65, 2978, 2266, 2331, 1803, 1447, 1822, 1240, 1770, 3048, 1921, 1583, 2370, 813, 2381, 2557, 2653, 1508, 1596, 2077, 1369, 40, 1206, 2332, 1900, 2855, 1701, 1736, 1994, 494, 252, 3066, 2988, 2877, 2835, 577, 467, 3324, 2339, 3121, 2415, 2276, 2964, 1195, 1800, 545, 3214, 3289, 1712, 714, 2847, 1828, 2096, 3254, 1938, 3294, 125, 1834, 1589, 230, 2806, 1836, 3122, 1008, 3084, 1938, 3232, 217, 3001, 1857, 3066, 2510, 2556, 2385, 1701, 782, 1912, 1423, 3080, 3078, 1754, 2335, 2078, 1204, 2988, 1308, 1883, 167, 1965, 994, 445, 167, 150, 1119, 3015]] + +bHat = aHat^T: [[[2269, 1855, 3190, 1178, 1407, 2272, 1027, 2845, 2746, 1751, 72, 2945, 186, 951, 2139, 1192, 680, 13, 3106, 1489, 1902, 3294, 1138, 763, 1831, 2818, 2977, 177, 3258, 2714, 132, 2734, 1592, 2562, 2053, 1789, 171, 1288, 1286, 1162, 2581, 871, 3022, 2765, 2169, 2217, 364, 2465, 3320, 1916, 2379, 3095, 25, 1543, 878, 1779, 800, 2024, 2207, 141, 2080, 2214, 2974, 2486, 949, 2890, 654, 456, 1555, 1042, 3113, 3294, 1991, 2229, 807, 2276, 793, 2593, 697, 2451, 3284, 1578, 2676, 2117, 2859, 3327, 2070, 1825, 1276, 2330, 2798, 1535, 2196, 1129, 3215, 2831, 481, 1140, 2006, 3157, 3212, 1426, 1295, 1075, 1239, 2423, 506, 830, 1351, 1221, 1433, 3291, 1535, 2310, 1752, 2368, 1473, 3212, 488, 2120, 361, 2503, 1924, 2448, 65, 675, 94, 2918, 1555, 659, 816, 2161, 2494, 2824, 2991, 2262, 153, 282, 2985, 1424, 1414, 1752, 2365, 1838, 98, 1268, 2494, 1658, 2630, 1054, 737, 895, 3230, 2826, 63, 192, 2911, 659, 1305, 2323, 2139, 2689, 3031, 254, 1240, 1531, 860, 2771, 2364, 2679, 248, 2788, 1488, 755, 1952, 227, 1322, 1020, 2194, 2163, 2193, 885, 2056, 3150, 993, 462, 850, 84, 289, 2921, 1854, 1563, 1042, 21, 3224, 156, 2831, 2807, 1620, 1073, 2186, 2767, 210, 393, 1354, 1184, 3130, 115, 221, 2358, 761, 1914, 753, 2891, 3316, 3254, 1656, 1645, 203, 1911, 1625, 1173, 2392, 2401, 1360, 409, 1594, 827, 2260, 249, 1195, 2382, 1151, 2177, 284, 1040, 2926, 436, 2523, 2038, 2498, 793, 2840, 2954, 2997, 2117, 991, 2190, 1337, 1771, 1975, 1077, 127, 17, 3033, 2498], +[1095, 705, 1916, 1081, 375, 739, 1365, 2439, 2118, 2041, 630, 1130, 1568, 2436, 2929, 179, 2991, 2512, 1633, 409, 2913, 1810, 2503, 1023, 442, 79, 1857, 2823, 2818, 2645, 2864, 115, 2145, 2331, 2676, 1861, 3203, 3117, 473, 468, 2784, 146, 76, 964, 849, 2961, 2280, 2558, 809, 205, 2824, 3082, 2492, 2018, 1903, 1673, 288, 1722, 2343, 541, 3203, 2841, 2345, 89, 3320, 236, 2280, 1391, 1597, 2273, 2533, 548, 507, 355, 1546, 2739, 2543, 2558, 270, 1315, 2722, 3212, 2848, 1869, 1600, 1787, 1175, 2023, 2586, 1523, 1641, 3305, 884, 1276, 1421, 1807, 837, 358, 2362, 601, 691, 2324, 393, 1846, 316, 2699, 3078, 1634, 1142, 2404, 1387, 1191, 2397, 1426, 1479, 290, 59, 1215, 1201, 3293, 2873, 972, 2165, 678, 2008, 3298, 2638, 2180, 2714, 2381, 1550, 1804, 204, 945, 2851, 416, 2770, 1122, 1142, 2013, 694, 2295, 2307, 2635, 682, 608, 1151, 1950, 2841, 1866, 559, 1316, 1155, 494, 1501, 876, 148, 2667, 2921, 2072, 1265, 3, 84, 404, 484, 275, 3096, 2436, 2642, 2678, 1642, 1481, 790, 850, 965, 514, 2246, 3019, 2008, 113, 1267, 3155, 2372, 2496, 2165, 1187, 936, 405, 574, 1843, 1622, 903, 1312, 1797, 3257, 1665, 108, 3116, 3068, 2422, 2209, 1731, 2095, 1288, 885, 2155, 2203, 1623, 1471, 2778, 473, 1017, 2698, 1997, 2531, 2057, 453, 2846, 3136, 1563, 206, 2211, 2232, 755, 1246, 2544, 1244, 76, 2249, 2612, 2928, 1830, 577, 532, 1204, 2859, 19, 1381, 788, 2405, 33, 1178, 3207, 2113, 753, 1473, 3013, 749, 1239, 601, 2943, 482, 2855, 2388, 2022, 965], +[2208, 2157, 2178, 1185, 1280, 2238, 2077, 2805, 2681, 3221, 752, 750, 2988, 1739, 1339, 2432, 186, 2001, 1032, 2098, 1649, 3054, 2910, 1141, 1887, 2610, 1111, 509, 1407, 1690, 2802, 582, 3214, 2829, 3008, 1659, 3211, 1666, 117, 762, 2108, 1902, 2916, 2419, 2439, 219, 1625, 2854, 176, 1682, 2301, 1044, 854, 3050, 1592, 1156, 463, 2845, 2283, 2646, 1915, 638, 2554, 2814, 1146, 1244, 2721, 962, 1392, 3156, 533, 2553, 2823, 2209, 2963, 285, 1290, 2703, 1093, 1772, 829, 1851, 1800, 1326, 909, 2644, 1913, 496, 3012, 1380, 649, 3224, 394, 315, 2323, 3201, 3295, 1217, 3031, 2329, 1190, 944, 977, 1204, 2562, 1434, 1898, 2948, 1640, 3097, 55, 2132, 2496, 302, 2697, 965, 810, 17, 953, 2697, 1842, 1345, 2684, 1497, 920, 13, 622, 3014, 1256, 3030, 2553, 1521, 583, 739, 1351, 1958, 1743, 2987, 2572, 60, 474, 834, 2627, 884, 983, 1577, 3297, 1625, 1669, 465, 1636, 1264, 2673, 3302, 2050, 647, 532, 611, 483, 24, 2714, 3037, 3039, 2707, 2341, 3233, 3154, 736, 2547, 2014, 2763, 99, 3280, 3226, 1960, 1007, 380, 2517, 349, 333, 2684, 1316, 1790, 3321, 2929, 1941, 32, 229, 1338, 701, 1491, 822, 1221, 2419, 1831, 1198, 570, 2512, 2922, 367, 1496, 766, 1, 909, 1160, 2469, 652, 29, 403, 604, 31, 79, 466, 3082, 2291, 701, 578, 100, 1781, 1286, 2720, 106, 892, 667, 3156, 1299, 3256, 2328, 2608, 2933, 1728, 3035, 952, 3294, 2879, 2234, 1192, 510, 309, 1038, 3122, 1590, 608, 2798, 561, 1073, 2259, 152, 2552, 1574, 1697, 846, 2698, 3074, 1195, 1963]], +[[1071, 2351, 1127, 2119, 3312, 2999, 2149, 2452, 1025, 644, 932, 2564, 2187, 1448, 1896, 2685, 2389, 415, 661, 713, 2005, 1447, 2556, 2554, 2768, 3071, 3147, 1915, 2606, 1647, 1073, 2062, 1653, 381, 424, 440, 2427, 1215, 3144, 1401, 2518, 2407, 2332, 2428, 375, 655, 1585, 417, 64, 2798, 2810, 118, 2723, 2708, 1947, 2336, 2321, 179, 2986, 558, 1419, 1941, 1175, 2079, 2633, 3244, 3237, 261, 147, 2993, 2316, 760, 1280, 1325, 2856, 655, 153, 1621, 2098, 2620, 1659, 339, 2957, 2693, 1814, 675, 3130, 2725, 725, 1937, 1817, 1121, 76, 756, 983, 994, 300, 2438, 619, 883, 115, 598, 362, 2283, 1650, 2989, 515, 1863, 2033, 2299, 75, 304, 98, 3122, 1701, 490, 3312, 2519, 1667, 2819, 1950, 1087, 856, 2023, 3211, 3250, 2252, 2632, 625, 1046, 1320, 145, 2375, 2833, 2979, 220, 3275, 1959, 1763, 653, 1898, 1631, 3011, 1115, 1607, 2800, 92, 1340, 148, 3152, 3087, 1062, 2605, 1522, 2989, 413, 983, 1770, 260, 1420, 2236, 2251, 8, 2757, 2039, 3075, 2727, 150, 1455, 2070, 239, 528, 873, 1113, 1076, 3303, 154, 1937, 2944, 834, 596, 1254, 1359, 2347, 233, 2372, 3017, 314, 992, 661, 3232, 2959, 482, 2652, 3003, 2508, 1663, 2198, 1532, 3195, 2295, 380, 1042, 1050, 1400, 1121, 56, 2036, 147, 3314, 1884, 1370, 2144, 2963, 680, 13, 357, 1539, 949, 210, 433, 797, 524, 847, 1971, 981, 1831, 3259, 75, 1210, 19, 2299, 148, 1125, 302, 2396, 2005, 2212, 861, 2847, 1687, 280, 1649, 1509, 2082, 1369, 1918, 1970, 2790, 2188, 951, 2220, 2347, 2050, 277, 1554], +[180, 2663, 814, 3229, 3165, 1307, 364, 3020, 445, 1191, 2817, 3050, 463, 2180, 738, 294, 415, 3273, 1589, 3216, 1676, 1273, 2046, 471, 3134, 118, 1336, 1214, 3114, 225, 2165, 537, 2131, 2198, 1989, 94, 2173, 533, 1549, 1665, 2887, 386, 1461, 769, 726, 703, 2980, 2249, 2867, 1508, 2235, 507, 2884, 2596, 313, 703, 474, 3009, 2428, 1012, 1851, 2338, 2046, 655, 1985, 2969, 1478, 428, 703, 3180, 1370, 1053, 3137, 1898, 2200, 1246, 1016, 90, 3045, 1555, 1295, 858, 1270, 1277, 3136, 2448, 72, 1075, 1010, 1238, 2310, 37, 1785, 1508, 405, 2690, 2519, 284, 2507, 1437, 96, 1911, 2815, 756, 1326, 1602, 967, 428, 881, 417, 324, 1318, 1920, 2453, 341, 11, 385, 1810, 1320, 2661, 351, 547, 2099, 551, 1225, 1674, 1841, 1210, 2012, 114, 36, 107, 337, 466, 517, 2336, 1165, 2594, 898, 563, 613, 1855, 714, 2259, 2951, 2710, 1288, 1168, 3003, 1405, 2897, 2528, 1129, 184, 1627, 1792, 2191, 2326, 2605, 1165, 1952, 2075, 1278, 2860, 38, 1492, 789, 2519, 1925, 1561, 1662, 2386, 1788, 1480, 1324, 257, 2375, 1468, 507, 2334, 1526, 540, 253, 466, 644, 2432, 1771, 2168, 3153, 1091, 2151, 2480, 177, 1853, 2193, 288, 2046, 951, 1409, 3107, 2832, 2643, 1599, 571, 1412, 1055, 2363, 1015, 2949, 408, 2613, 589, 3258, 1670, 3114, 954, 1847, 40, 507, 781, 1824, 1366, 2740, 2969, 252, 358, 2715, 2814, 808, 812, 2054, 692, 232, 791, 263, 2386, 746, 2266, 1387, 508, 2461, 2959, 314, 1756, 2168, 469, 1554, 2054, 121, 62, 458, 2574, 3296, 2465, 3288, 372], +[723, 581, 904, 461, 2378, 342, 1830, 2996, 910, 1321, 2030, 2259, 795, 2411, 2424, 34, 2461, 1854, 3095, 1818, 1011, 174, 1151, 2981, 189, 1311, 1146, 437, 2922, 3019, 1695, 343, 787, 598, 1294, 3140, 523, 476, 3242, 3242, 1000, 1770, 2989, 2346, 168, 1496, 1909, 743, 597, 1130, 1726, 948, 2693, 2028, 16, 2882, 2515, 1447, 1809, 1288, 378, 1502, 899, 1637, 2241, 45, 526, 2657, 2389, 2377, 724, 2412, 1517, 373, 1356, 1200, 875, 3321, 2860, 558, 3297, 3171, 3096, 2364, 3050, 2730, 339, 529, 1201, 1138, 722, 1628, 1167, 1258, 1382, 1616, 2411, 896, 2828, 59, 469, 930, 718, 207, 110, 1821, 735, 1621, 621, 1594, 1062, 2427, 3004, 3020, 401, 2093, 125, 1227, 2002, 2520, 2238, 869, 1895, 851, 817, 2861, 179, 3104, 2378, 1927, 1470, 409, 3096, 140, 2104, 1000, 223, 1756, 2452, 1022, 2089, 1979, 3318, 995, 2092, 2441, 3184, 140, 187, 395, 3111, 27, 1504, 2966, 1323, 1693, 2517, 2612, 1505, 2889, 2489, 1824, 866, 1269, 1681, 1827, 407, 1389, 1116, 1092, 2945, 848, 1557, 1595, 3238, 2311, 2923, 2462, 274, 1955, 2463, 1342, 1731, 1454, 1364, 1628, 1570, 1476, 2938, 2954, 970, 1817, 46, 3030, 654, 739, 374, 3198, 177, 1534, 2718, 2869, 2664, 2267, 2065, 3132, 38, 442, 999, 289, 2084, 2908, 3177, 1684, 34, 3189, 1391, 1676, 2139, 2095, 1912, 517, 0, 1557, 2562, 1289, 1913, 2468, 317, 2793, 1956, 2990, 2994, 3060, 595, 866, 860, 3121, 63, 2572, 1881, 1168, 39, 309, 865, 727, 348, 2448, 395, 961, 1946, 3101, 1465, 2904, 862, 768]], +[[2651, 1652, 2254, 2887, 2120, 2620, 3273, 686, 2064, 1481, 2850, 1022, 1425, 194, 691, 1735, 457, 978, 365, 2518, 1750, 330, 1284, 3323, 2989, 435, 2756, 2568, 2991, 1261, 896, 1805, 2302, 1271, 2013, 1273, 2264, 3094, 1175, 722, 2233, 197, 1498, 1711, 1169, 1132, 2014, 1230, 1053, 1091, 545, 161, 1688, 2043, 2022, 1310, 292, 344, 2600, 2904, 758, 2494, 651, 2044, 1098, 1866, 2059, 2189, 1674, 1863, 1887, 1289, 3291, 126, 481, 2007, 2274, 1421, 2276, 2468, 968, 423, 2822, 3135, 3176, 2982, 1695, 2262, 1407, 2768, 2205, 202, 2458, 366, 2719, 2875, 2237, 217, 1032, 899, 3235, 2588, 26, 1609, 1386, 298, 986, 2333, 1911, 1444, 1171, 2001, 2218, 795, 1995, 2098, 224, 534, 211, 3131, 1947, 3033, 821, 3128, 3145, 1882, 1419, 2881, 2362, 3231, 1336, 2831, 1593, 2988, 3007, 622, 843, 2264, 2462, 1990, 2736, 2049, 1993, 2361, 1415, 3283, 2295, 2590, 2993, 701, 733, 523, 2956, 771, 1420, 3047, 116, 1638, 86, 3263, 3184, 1998, 1793, 792, 1081, 951, 1261, 647, 1796, 769, 2909, 809, 1916, 161, 2267, 1184, 1757, 357, 17, 1264, 2133, 1296, 3207, 1855, 3221, 2353, 2659, 2430, 269, 556, 1104, 748, 1144, 3139, 1651, 2804, 2903, 1466, 398, 2972, 1937, 2169, 674, 2747, 1505, 1039, 2369, 1875, 2115, 1265, 1169, 2279, 514, 152, 2626, 484, 1636, 2074, 939, 2954, 1231, 271, 10, 1096, 2838, 1132, 23, 1100, 3264, 2853, 1400, 1959, 624, 2537, 828, 3206, 778, 2224, 2916, 2704, 2497, 264, 1607, 1060, 920, 2008, 1820, 3255, 2853, 3171, 315, 1682, 989, 1760, 1165, 1921], +[276, 361, 2772, 1882, 433, 2175, 2154, 1970, 394, 1482, 2631, 1555, 1225, 1052, 1649, 2373, 611, 472, 1721, 221, 94, 2685, 1077, 2197, 3107, 462, 2275, 953, 2925, 708, 219, 5, 224, 30, 3314, 2215, 1406, 2821, 1492, 160, 3227, 1324, 2629, 291, 967, 2088, 2107, 1511, 253, 1429, 321, 590, 2920, 1692, 1161, 2233, 75, 1820, 2404, 913, 3220, 3071, 2034, 2107, 2161, 1380, 1742, 640, 881, 1574, 2017, 504, 1045, 1369, 922, 163, 554, 1351, 362, 2383, 3016, 1899, 2658, 2912, 2950, 868, 350, 2206, 315, 2532, 840, 3320, 2823, 2209, 592, 1017, 1048, 2342, 333, 109, 3293, 1671, 290, 1984, 1235, 134, 2367, 1750, 1927, 1187, 1598, 1582, 1542, 1236, 857, 774, 2381, 752, 2294, 478, 240, 2802, 2257, 837, 915, 1899, 1536, 1755, 2528, 617, 2332, 927, 2205, 3071, 2298, 652, 3308, 268, 1201, 2347, 1334, 275, 898, 3254, 376, 1783, 2377, 2719, 2590, 3250, 2998, 1533, 563, 114, 220, 2152, 491, 2777, 297, 1168, 1477, 2531, 1369, 1342, 637, 2192, 1672, 3261, 1056, 2071, 2428, 41, 2678, 964, 1599, 658, 1341, 1680, 2262, 2153, 2997, 2637, 1404, 1785, 2695, 2404, 715, 1732, 2783, 384, 656, 3012, 2878, 637, 2802, 1893, 2592, 551, 884, 2338, 2011, 812, 841, 1843, 456, 1090, 2724, 637, 137, 606, 1687, 1074, 2530, 269, 2357, 2398, 3237, 144, 147, 372, 1525, 2427, 1182, 2978, 851, 968, 122, 1540, 2380, 22, 1818, 1278, 2496, 240, 1937, 2198, 1234, 1366, 759, 1124, 2839, 1193, 2927, 1517, 190, 958, 2617, 134, 2304, 493, 2787, 1350, 575, 68, 3163, 3025], +[966, 2452, 116, 2534, 1196, 754, 3152, 1210, 1734, 970, 2156, 1172, 1741, 364, 2810, 3072, 2247, 37, 344, 3156, 590, 3234, 1310, 1828, 1654, 188, 2537, 2766, 1378, 395, 2993, 3029, 770, 2307, 697, 686, 627, 2696, 1133, 2779, 733, 1478, 1202, 180, 901, 2510, 2905, 1511, 3325, 2720, 2992, 210, 49, 2466, 3259, 1684, 2542, 290, 2588, 397, 579, 309, 1275, 2095, 530, 2230, 608, 2879, 20, 2031, 403, 155, 234, 3103, 766, 2912, 457, 202, 2701, 2776, 214, 1778, 3146, 1114, 1640, 1190, 1870, 2251, 1017, 2507, 1603, 2591, 949, 3028, 2257, 222, 3051, 879, 1185, 1764, 290, 3163, 1082, 172, 1555, 2535, 2225, 2930, 812, 694, 1759, 688, 3266, 2354, 369, 917, 903, 1897, 1154, 596, 2, 2130, 3168, 2448, 930, 993, 2230, 2156, 1960, 1882, 576, 3305, 1027, 1135, 1282, 2001, 1787, 3141, 3070, 2465, 2149, 2889, 164, 1857, 180, 1177, 3102, 1375, 2565, 1363, 2105, 3221, 536, 707, 1474, 1103, 467, 1915, 3294, 621, 1733, 817, 939, 349, 2446, 514, 2959, 3256, 2103, 959, 1006, 1446, 1625, 933, 2034, 1970, 3297, 66, 3020, 2573, 1363, 822, 370, 1550, 1695, 1048, 728, 2544, 1942, 2194, 323, 2172, 499, 2199, 1322, 2747, 2130, 578, 623, 3033, 807, 94, 2384, 1548, 1935, 1907, 809, 1350, 2853, 1169, 883, 2790, 1766, 45, 670, 739, 886, 2962, 669, 1511, 1412, 180, 2166, 3127, 471, 2346, 3126, 785, 312, 1281, 300, 336, 1189, 2833, 2363, 1690, 2966, 2874, 2130, 1315, 1108, 1457, 2350, 1598, 2809, 607, 3245, 306, 1523, 897, 1487, 1771, 1831, 2650, 54, 2877]]] + +r: [[0, 0, 3327, 1, 0, 1, 1, 3328, 1, 0, 0, 3328, 0, 1, 0, 3327, 0, 1, 3328, 0, 1, 0, 3328, 0, 3328, 1, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 3328, 1, 1, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 2, 0, 3328, 0, 0, 0, 2, 3328, 1, 3328, 0, 1, 0, 1, 3328, 0, 0, 3328, 0, 0, 3327, 3328, 0, 1, 1, 1, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 1, 0, 3328, 1, 2, 3328, 0, 1, 0, 3327, 1, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 2, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 1, 2, 1, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 3327, 0, 1, 0, 1, 0, 3328, 0, 2, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3327, 0, 3328, 3328, 1, 3327, 3328, 0, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 2, 0, 1, 3328, 1, 3327, 0, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 2, 1, 3328, 0, 3328, 1, 0, 0, 0, 2, 3328, 1, 2, 0, 0, 1, 3327, 3328, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 2, 0, 0, 1, 3328, 2, 0, 3328, 0, 0, 1, 0, 3328, 3328, 3327, 1, 0, 3328, 3328, 3328, 0, 1, 3328, 1, 0, 0, 1, 3328, 0, 1, 2], +[0, 3327, 1, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 0, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 1, 3327, 1, 1, 1, 3328, 1, 0, 0, 3328, 1, 0, 3328, 0, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 3328, 0, 0, 2, 3328, 0, 0, 0, 3328, 2, 3328, 0, 0, 3328, 3328, 2, 3328, 3328, 2, 2, 1, 1, 3328, 0, 3328, 0, 1, 1, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 2, 1, 1, 2, 0, 2, 0, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 1, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 2, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3327, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 3328, 2, 0, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 1, 1, 2, 1, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 3328, 3327, 0, 1, 1, 1, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 3327, 1, 0, 3328, 3327, 0, 3328, 1, 3327, 0, 3328], +[0, 2, 0, 0, 2, 3328, 0, 1, 3328, 0, 2, 3328, 3328, 0, 1, 3328, 3328, 0, 1, 0, 2, 0, 3328, 3328, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 3328, 3327, 0, 1, 2, 1, 3327, 1, 1, 1, 3327, 1, 1, 1, 3328, 0, 1, 1, 0, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 1, 2, 3327, 3328, 1, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 1, 0, 0, 3328, 1, 1, 3327, 3328, 3328, 1, 3328, 3327, 1, 0, 3328, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 1, 1, 3328, 0, 1, 3328, 0, 0, 1, 3328, 0, 3328, 0, 3328, 0, 3327, 1, 3327, 3327, 0, 0, 2, 0, 3327, 1, 0, 3328, 1, 1, 3327, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 3327, 3328, 0, 3328, 0, 1, 2, 1, 3328, 3328, 0, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 1, 3328, 2, 0, 1, 2, 1, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 0, 1, 1, 3328, 0, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 0, 1, 3328, 0, 0, 1, 3327, 1, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 2, 3328, 2, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 0, 1, 2, 3327, 3328, 0, 1, 0, 0, 0, 0, 0, 2, 1, 1, 3327, 3327, 3327, 3328, 1, 3327, 3328, 3328, 1, 2, 1, 1, 0]] + +e1: [[0, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 1, 0, 3328, 0, 1, 2, 1, 0, 3328, 3328, 1, 3327, 3327, 3328, 0, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 3328, 1, 0, 3327, 0, 1, 1, 0, 0, 3328, 1, 1, 3328, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 3328, 2, 2, 2, 1, 0, 3328, 3328, 0, 2, 1, 1, 3328, 0, 1, 3327, 0, 0, 2, 1, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 2, 1, 0, 0, 2, 3328, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 3328, 1, 1, 3328, 1, 0, 1, 0, 0, 0, 0, 3328, 0, 3327, 1, 0, 0, 0, 3327, 2, 3328, 3328, 1, 2, 0, 1, 1, 0, 1, 1, 1, 1, 3328, 2, 3328, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 3328, 3327, 1, 0, 1, 1, 1, 3328, 3328, 1, 1, 3328, 1, 1, 0, 2, 0, 3328, 1, 1, 3327, 0, 0, 3328, 1, 0, 1, 3328, 0, 1, 3328, 1, 3327, 0, 3328, 0, 2, 0, 2, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 2, 1, 3328, 3328, 1, 3328, 0, 1, 0], +[0, 1, 3328, 0, 1, 1, 3327, 1, 3327, 1, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 1, 1, 0, 2, 2, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 1, 3327, 3328, 1, 3328, 1, 3327, 3328, 1, 1, 3328, 3328, 0, 0, 1, 2, 1, 3328, 1, 0, 2, 0, 3328, 1, 3327, 2, 0, 0, 2, 2, 0, 3327, 3327, 3327, 2, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 1, 3327, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 1, 3327, 0, 3328, 3328, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 3327, 1, 0, 2, 0, 0, 0, 0, 2, 2, 3327, 3328, 3328, 1, 3328, 0, 1, 2, 3328, 1, 0, 0, 1, 0, 0, 1, 2, 3328, 1, 3327, 3328, 0, 3328, 0, 3328, 3328, 3328, 0, 3328, 1, 3327, 3328, 3328, 3328, 1, 0, 2, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 3327, 0, 1, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 3328, 0, 3327, 3328, 3328, 1, 1, 0, 0, 1, 1, 0, 3328, 3328, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 1, 1, 1, 1, 0, 0, 0, 2, 3328, 0, 3327, 0, 3327, 1, 0, 0, 0, 2, 0, 3328, 3328, 3328, 3328, 0, 0, 3328, 1, 1, 1, 3328, 1, 0, 3328, 1, 0, 3327, 3328, 0, 1, 1], +[0, 3328, 3328, 0, 1, 0, 0, 3328, 1, 0, 0, 0, 1, 1, 3328, 3328, 2, 3328, 3328, 0, 0, 1, 0, 3328, 1, 0, 1, 0, 3328, 1, 0, 3327, 3328, 3328, 0, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 0, 2, 0, 0, 0, 2, 3327, 3328, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 3328, 3327, 1, 1, 0, 0, 0, 1, 0, 1, 0, 2, 1, 1, 0, 3327, 2, 1, 3328, 0, 2, 3328, 1, 0, 0, 3327, 3328, 3327, 0, 3327, 3328, 0, 1, 0, 0, 3328, 1, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 1, 3327, 0, 1, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 1, 0, 3328, 1, 0, 1, 3328, 1, 0, 0, 3328, 1, 1, 0, 2, 3328, 3328, 3328, 0, 3328, 1, 3328, 1, 2, 1, 0, 2, 3327, 3327, 1, 2, 1, 0, 3327, 0, 0, 1, 0, 0, 1, 1, 1, 3328, 3328, 1, 0, 3328, 3328, 3328, 3327, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3328, 0, 3327, 3328, 2, 3328, 0, 3328, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 1, 3328, 3327, 2, 3328, 3328, 1, 3328, 0, 2, 0, 0, 2, 1, 0, 3328, 0, 3328, 1, 0, 3327, 1, 0, 3328]] + +e2: [0, 1, 1, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 0, 0, 0, 0, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 3327, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 2, 3328, 3328, 2, 0, 3328, 3328, 3328, 1, 0, 0, 2, 3327, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 1, 1, 0, 0, 2, 1, 3327, 3328, 1, 3328, 0, 0, 0, 1, 1, 2, 1, 1, 3327, 3328, 0, 0, 0, 3328, 0, 3327, 1, 2, 3328, 3328, 3328, 0, 1, 3327, 1, 1, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 1, 1, 0, 3328, 1, 2, 1, 0, 2, 0, 3328, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3327, 0, 1, 1, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3327, 1, 0, 0, 1, 3328, 0, 1, 0, 1, 3327, 0, 3327, 1, 1, 2, 3327, 3328, 0, 0, 1, 1, 2, 3327, 0, 0, 3328, 0, 3328, 0, 0, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 2, 3328, 2, 3328, 0, 0, 1, 0, 1, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 0, 3328, 3328, 3327, 3328, 3328, 1, 3328, 2, 0, 1, 2, 0, 1, 3328, 0, 0, 3328, 0] +rHat: [[686, 2870, 147, 3262, 3159, 1222, 1207, 2995, 2249, 3295, 1022, 1568, 385, 1447, 642, 1705, 1821, 3053, 2730, 294, 1279, 2060, 1538, 1773, 716, 971, 3051, 1928, 1011, 607, 1083, 1598, 414, 1866, 2491, 2973, 1082, 1995, 574, 3258, 1506, 2441, 1882, 370, 1234, 1317, 101, 3057, 2495, 2307, 2624, 976, 2319, 547, 2011, 2255, 3323, 222, 349, 1635, 2221, 1814, 1184, 2256, 1648, 2204, 1284, 188, 646, 1939, 223, 2501, 2732, 844, 1319, 2892, 1937, 164, 1269, 1389, 1297, 1512, 231, 3328, 3057, 3074, 427, 2734, 328, 2379, 1716, 3188, 1454, 1944, 109, 195, 2537, 1493, 1763, 213, 2991, 3281, 603, 2651, 1717, 2652, 1159, 234, 2855, 3275, 1814, 514, 904, 1871, 897, 211, 2704, 2308, 2855, 862, 598, 1540, 331, 518, 848, 1900, 2953, 50, 582, 1628, 780, 561, 977, 2181, 1358, 2005, 841, 2567, 1585, 574, 1487, 836, 212, 963, 2111, 552, 1217, 521, 217, 909, 2238, 2724, 1643, 474, 2509, 1109, 321, 542, 1858, 2617, 3289, 352, 426, 1796, 1612, 1456, 409, 2321, 1305, 1416, 1524, 575, 1145, 1938, 146, 2746, 866, 2688, 3213, 2052, 2235, 1098, 1989, 731, 352, 2665, 2931, 2147, 1797, 2190, 117, 1602, 3009, 3133, 86, 1330, 2462, 1369, 78, 1623, 2215, 931, 1508, 2284, 288, 1826, 2758, 690, 1259, 2420, 182, 50, 307, 2796, 2876, 3140, 469, 1145, 574, 866, 1320, 2129, 909, 2287, 407, 921, 387, 2096, 1694, 3151, 759, 216, 1902, 2128, 132, 424, 3294, 1722, 331, 3004, 1117, 336, 1887, 1775, 1799, 2444, 106, 2113, 446, 1832, 790, 437, 1336, 1747, 716, 1499], +[1139, 1269, 364, 2358, 888, 1140, 2032, 1827, 1827, 1980, 1179, 1062, 765, 1125, 1792, 1287, 1787, 2419, 2297, 2020, 358, 82, 776, 1074, 1492, 947, 1073, 2663, 133, 1332, 1500, 2401, 411, 684, 272, 2463, 1249, 878, 2765, 2292, 1587, 1971, 2917, 1654, 2480, 1395, 619, 2210, 14, 1469, 2403, 1714, 2508, 1702, 1201, 3043, 233, 1558, 732, 1298, 1455, 3101, 1699, 916, 718, 1989, 3284, 361, 1573, 2155, 752, 468, 2806, 2746, 2507, 2646, 288, 2542, 807, 2978, 2016, 1740, 1805, 1412, 2472, 2107, 267, 809, 665, 2095, 1522, 892, 1471, 2937, 2020, 2830, 36, 731, 2945, 1444, 1367, 3174, 2862, 131, 316, 1044, 2821, 341, 2164, 209, 2431, 1319, 3134, 297, 2838, 1617, 1429, 597, 1493, 2484, 2877, 1144, 1294, 2056, 741, 965, 873, 3075, 1326, 2056, 2551, 690, 390, 1879, 2210, 24, 2111, 2170, 3325, 2664, 2735, 1586, 1147, 846, 483, 888, 1801, 1002, 165, 2569, 2517, 2586, 2364, 165, 640, 1283, 2103, 2417, 2561, 1778, 2308, 2060, 1181, 3290, 2737, 1187, 2772, 1779, 2131, 2122, 2434, 3293, 3150, 2796, 2390, 2490, 2011, 2899, 2490, 2738, 2466, 2304, 2781, 1952, 4, 1399, 1285, 2771, 1122, 2172, 1000, 1253, 1899, 2928, 1836, 1019, 585, 2751, 288, 1072, 607, 1075, 846, 2323, 3317, 3248, 1969, 2062, 2879, 2967, 2641, 442, 1579, 1673, 250, 2075, 2023, 540, 1819, 688, 1393, 2153, 1043, 325, 278, 2313, 730, 467, 0, 1344, 1961, 2027, 442, 910, 514, 2400, 2666, 270, 1364, 2477, 2397, 2644, 1198, 2579, 3126, 2335, 804, 686, 1406, 2096, 168, 2903, 2395, 2277, 1414, 1941], +[3022, 3246, 2122, 1725, 1400, 2270, 227, 1537, 2513, 2783, 2623, 1702, 336, 1561, 1219, 2282, 709, 2746, 1664, 1575, 2625, 1490, 2179, 2681, 1325, 1600, 1587, 256, 1564, 1013, 551, 1338, 755, 437, 2792, 2579, 1328, 2406, 2628, 2888, 2425, 2847, 922, 1513, 2224, 1839, 3213, 2255, 630, 2707, 1301, 1868, 148, 1090, 2360, 2483, 2982, 3172, 3014, 3009, 1707, 578, 3113, 2504, 3292, 2984, 16, 404, 2882, 2665, 3319, 2097, 694, 3175, 729, 2050, 921, 3068, 548, 1367, 1580, 3304, 197, 405, 1851, 3052, 1376, 2613, 603, 1304, 3312, 1327, 1995, 572, 1093, 202, 1865, 38, 2297, 305, 1397, 885, 1967, 2441, 1307, 239, 1059, 2308, 811, 777, 1156, 909, 1988, 2488, 3180, 3158, 2041, 2813, 158, 1367, 1905, 1279, 3084, 464, 2306, 1550, 1720, 1053, 2724, 1259, 2946, 338, 1194, 126, 3149, 1075, 944, 2115, 41, 1242, 2433, 2100, 1711, 358, 2170, 1739, 717, 234, 1498, 874, 2728, 3136, 2918, 584, 1383, 1508, 1202, 2300, 1236, 2179, 1958, 759, 1510, 350, 2771, 3184, 2331, 471, 1739, 2205, 2679, 2209, 2235, 2122, 3128, 2641, 3226, 3, 852, 1347, 1218, 2839, 2977, 2789, 1371, 2538, 2742, 369, 1412, 2471, 1493, 486, 2454, 1877, 60, 1919, 1758, 2167, 982, 1761, 352, 643, 1152, 3270, 1321, 2523, 2368, 2615, 514, 272, 1489, 2406, 1130, 1601, 1236, 2617, 2768, 3320, 384, 294, 2878, 1025, 1193, 1889, 1201, 1948, 3313, 2800, 1780, 2108, 2900, 1220, 860, 2818, 2017, 1697, 872, 1780, 1369, 2459, 806, 2305, 295, 240, 3065, 492, 752, 664, 608, 940, 965, 854, 470, 561, 580, 2292]] + +BHat * rHat: [[3180, 200, 1027, 305, 2077, 3315, 928, 1920, 2199, 1675, 136, 2064, 1757, 436, 2372, 1758, 1695, 523, 786, 1394, 606, 457, 3031, 3261, 218, 218, 1028, 2791, 417, 2055, 1933, 2512, 1229, 3316, 290, 2483, 607, 2162, 504, 1140, 2923, 2571, 2137, 2484, 1634, 548, 1222, 1955, 2188, 119, 380, 2972, 371, 1928, 2301, 1406, 1270, 2086, 1331, 1361, 2549, 1653, 207, 2479, 1636, 3006, 1458, 313, 2280, 1115, 2134, 1143, 756, 1339, 2645, 1243, 2242, 2023, 256, 3179, 1671, 1767, 1455, 3038, 3149, 979, 1776, 1584, 2930, 2939, 1786, 2354, 1046, 2312, 20, 1380, 1515, 1924, 1770, 621, 1859, 1810, 1826, 906, 2314, 3261, 1814, 540, 1245, 2998, 1432, 616, 1647, 374, 2352, 2, 52, 664, 2675, 2822, 2766, 1024, 564, 1200, 1089, 1918, 1301, 782, 2193, 1926, 348, 2432, 1026, 2377, 2398, 941, 3023, 2388, 687, 1494, 229, 1161, 3261, 680, 1196, 3052, 2782, 1944, 3313, 532, 1276, 3142, 90, 3172, 982, 29, 2865, 3047, 1103, 1841, 1644, 2557, 2361, 1495, 1324, 1634, 1636, 1789, 2657, 645, 670, 1129, 2909, 1179, 2013, 152, 2908, 2922, 384, 1642, 1514, 3022, 3128, 3271, 2504, 1542, 2410, 2540, 496, 94, 1875, 682, 1367, 1007, 3019, 1292, 3149, 1881, 1220, 1308, 1725, 1044, 608, 2901, 1849, 2334, 1526, 1066, 248, 465, 882, 1431, 2126, 1380, 3267, 974, 1091, 2936, 2940, 305, 3127, 2955, 2181, 1755, 2294, 2789, 2372, 1131, 2716, 1829, 550, 2022, 594, 2516, 1723, 31, 1041, 1345, 336, 545, 1759, 846, 3119, 1230, 2632, 1507, 1849, 1452, 868, 137, 1920, 444, 2047, 3106, 1281, 1903], +[2785, 3122, 762, 2696, 1716, 1470, 536, 2583, 3211, 2866, 1305, 2567, 2741, 2096, 35, 1744, 2725, 1031, 3087, 1062, 2322, 1763, 3231, 989, 2949, 3097, 1688, 480, 1939, 2761, 718, 1185, 1423, 285, 1677, 406, 1596, 1062, 2585, 2500, 151, 372, 1609, 2541, 547, 1092, 1239, 2901, 1642, 524, 1999, 1831, 578, 39, 3245, 2595, 837, 1520, 82, 1638, 2332, 316, 475, 3163, 3328, 2423, 1562, 1888, 412, 1389, 1376, 490, 40, 3080, 847, 1294, 1133, 1691, 351, 912, 1143, 976, 2034, 1982, 2648, 2330, 514, 1847, 3089, 1477, 955, 827, 2711, 485, 486, 384, 2265, 715, 204, 2427, 1189, 2760, 155, 1036, 509, 2792, 1758, 2622, 2744, 1089, 1967, 2790, 2917, 172, 2998, 1928, 2224, 605, 877, 1045, 2370, 2673, 36, 1210, 1511, 1525, 2295, 2534, 1940, 2250, 1632, 238, 2283, 2064, 3253, 2696, 2893, 681, 2131, 733, 2392, 1210, 907, 49, 1216, 1166, 2488, 2659, 259, 2585, 2568, 1648, 1241, 1213, 2237, 693, 2917, 3217, 2922, 716, 2489, 611, 208, 1391, 3089, 1894, 2264, 171, 3321, 925, 2251, 552, 1978, 1662, 2797, 1727, 519, 2389, 1892, 1997, 596, 361, 1516, 2679, 2509, 884, 807, 9, 1994, 3318, 1720, 1341, 730, 3101, 3196, 3243, 2462, 1975, 2698, 1385, 1173, 1457, 2465, 2427, 3303, 1997, 1567, 2121, 2071, 2012, 758, 955, 86, 3068, 2395, 16, 1771, 1068, 2819, 570, 384, 2842, 2514, 3145, 2197, 1437, 929, 2592, 2964, 190, 2937, 690, 1887, 2458, 3216, 1610, 330, 1464, 2851, 1381, 1894, 2026, 971, 3236, 1141, 1894, 2126, 2760, 3058, 3111, 2838, 251, 2877, 290, 1621, 1178], +[1822, 1407, 1469, 2389, 3194, 1635, 1631, 2494, 2381, 3227, 2278, 3060, 794, 2225, 204, 1726, 587, 2679, 1766, 705, 385, 3052, 1591, 628, 1844, 258, 305, 1434, 1080, 2867, 1526, 2706, 2730, 1409, 427, 1587, 2178, 855, 3288, 939, 1695, 2582, 763, 422, 3130, 1252, 1967, 2057, 2038, 1847, 1747, 2712, 3066, 2710, 3099, 1605, 1960, 747, 1344, 532, 403, 2103, 250, 815, 774, 2558, 2296, 1514, 1224, 2987, 2639, 2673, 1867, 2485, 1376, 124, 672, 2692, 1768, 106, 1471, 444, 2681, 2148, 599, 3151, 1918, 1324, 172, 2365, 3177, 1490, 3235, 1963, 3159, 2033, 3186, 1164, 3261, 2411, 1348, 2896, 1331, 841, 2281, 2556, 1538, 2089, 2000, 1913, 1981, 2609, 349, 1026, 3073, 2897, 1422, 3053, 86, 251, 634, 635, 1927, 1457, 1459, 621, 566, 893, 2888, 864, 53, 1366, 686, 2956, 2954, 3302, 3209, 876, 1478, 3274, 1038, 2875, 1522, 1084, 1615, 2336, 2842, 2167, 2911, 1637, 1523, 2654, 1471, 42, 2316, 3187, 2943, 2349, 212, 1984, 2037, 96, 3249, 2506, 2598, 3088, 1351, 295, 2022, 448, 2120, 2462, 2219, 1320, 2704, 35, 1097, 455, 2664, 2429, 838, 1221, 805, 118, 75, 2166, 1954, 642, 2574, 1150, 375, 1696, 947, 3229, 3210, 1093, 2193, 1828, 3286, 2825, 2103, 488, 3137, 1458, 2025, 2031, 1925, 720, 2065, 2295, 2846, 908, 2532, 1204, 1478, 1188, 611, 3077, 1400, 2104, 318, 3101, 1916, 807, 2458, 2150, 579, 2184, 1548, 2106, 149, 3054, 226, 2968, 2387, 3093, 932, 2701, 818, 1941, 2663, 1253, 2456, 676, 430, 1370, 476, 2846, 890, 2037, 2575, 2752, 1531, 819, 1075, 887]] +NTTInverse(BHat * rHat): [[1219, 2403, 179, 1572, 1750, 1202, 2338, 2213, 3317, 2657, 2418, 1205, 1444, 3043, 406, 722, 3254, 3281, 572, 2979, 791, 732, 248, 2916, 2922, 1481, 663, 1691, 1077, 978, 288, 425, 263, 3223, 752, 2083, 1991, 1323, 2949, 1791, 1928, 1139, 1763, 1391, 40, 2901, 1462, 827, 875, 1895, 3170, 1437, 252, 606, 2846, 2145, 3260, 320, 787, 1304, 956, 2586, 1571, 115, 3225, 164, 1926, 2832, 101, 1529, 333, 2301, 3270, 2770, 1674, 923, 363, 679, 2866, 1866, 2969, 1542, 1978, 3096, 1595, 3240, 3098, 2012, 642, 42, 560, 1927, 1507, 748, 578, 179, 2750, 2588, 518, 854, 2718, 1019, 455, 954, 943, 2785, 1879, 1902, 453, 1334, 252, 3202, 2870, 1206, 3213, 812, 2937, 2453, 1941, 1687, 3041, 2626, 2939, 3126, 2483, 1845, 2360, 1354, 100, 1741, 565, 3190, 427, 695, 1185, 803, 1248, 508, 1584, 1180, 1378, 2264, 2647, 2870, 2342, 2351, 2696, 951, 2777, 2778, 2624, 1470, 2381, 154, 2845, 2659, 2064, 1867, 1820, 1136, 1262, 245, 1304, 1499, 1858, 1097, 3217, 2572, 1560, 1414, 738, 1125, 432, 2426, 1402, 3304, 2756, 970, 2482, 885, 1210, 1276, 722, 2028, 2132, 2507, 1783, 1827, 1747, 2295, 35, 2539, 328, 614, 366, 393, 487, 2218, 3009, 1418, 244, 1632, 726, 3057, 1767, 0, 3155, 1696, 2766, 2162, 1594, 2496, 784, 1674, 1776, 846, 2013, 2225, 1149, 2637, 2039, 1359, 2157, 1702, 515, 2283, 213, 1987, 32, 1088, 1223, 1416, 1010, 1030, 385, 1207, 1627, 2274, 726, 1907, 1707, 1705, 591, 688, 644, 2421, 34, 24, 2931, 125, 1547, 1616, 467, 1415, 1246, 2760], +[2186, 2520, 1230, 906, 2777, 2834, 1273, 2176, 2822, 1460, 947, 2903, 718, 1956, 423, 371, 1401, 1656, 1009, 2089, 2732, 2288, 1094, 584, 2750, 1371, 2972, 1728, 1302, 409, 1629, 2776, 1314, 1253, 2693, 2543, 2522, 2427, 1183, 1794, 2993, 1110, 1325, 1102, 1372, 2668, 1604, 2197, 1812, 1268, 2999, 921, 1364, 2881, 1171, 2638, 1821, 3217, 1287, 711, 2649, 2010, 603, 2318, 1990, 2658, 1643, 1112, 299, 1744, 3149, 2561, 1144, 2933, 2755, 3023, 3328, 1675, 2876, 2999, 2121, 1630, 2516, 154, 267, 2979, 2639, 1920, 1368, 1595, 2959, 1488, 2021, 285, 1713, 703, 930, 2313, 2584, 833, 228, 2558, 2226, 2459, 2422, 1226, 1300, 1834, 2949, 1294, 2583, 2408, 1721, 3140, 2556, 1521, 423, 2604, 1947, 21, 278, 497, 2338, 2850, 860, 780, 1264, 1598, 1553, 1897, 2765, 1032, 1834, 431, 1091, 2802, 1141, 1021, 1072, 3297, 2905, 2164, 2063, 1397, 1949, 3257, 1297, 2051, 2502, 2839, 2762, 2608, 1736, 109, 2139, 1833, 2783, 2944, 3052, 1429, 30, 348, 2197, 1990, 3050, 1920, 199, 1714, 1092, 1722, 221, 802, 3189, 346, 2042, 2301, 218, 903, 2707, 986, 1402, 544, 3288, 2528, 1381, 1116, 3097, 610, 779, 2164, 3229, 1477, 851, 1103, 1555, 1392, 1346, 1823, 1197, 2396, 3269, 1029, 50, 711, 994, 2963, 987, 1346, 322, 1604, 3221, 2994, 2170, 2706, 1104, 1541, 93, 2183, 2488, 341, 2949, 1290, 1211, 1082, 1474, 2387, 2950, 1943, 1610, 2646, 2700, 3283, 2804, 1377, 2404, 717, 379, 1653, 2598, 836, 3097, 2172, 1962, 1763, 2269, 795, 2804, 1332, 2216, 2237, 1159, 1921, 1063, 1226, 819, 1759], +[782, 2928, 1475, 97, 2729, 1954, 41, 1553, 2326, 2219, 3235, 2151, 222, 2730, 2804, 386, 2172, 3050, 2951, 940, 3248, 3235, 2019, 2918, 2072, 452, 2659, 34, 2760, 3028, 471, 152, 3066, 2937, 1211, 1626, 250, 2621, 1606, 958, 341, 3179, 1202, 2522, 1832, 2983, 1091, 1767, 518, 3164, 621, 2342, 799, 1750, 6, 786, 2426, 2303, 1882, 1270, 1091, 502, 2253, 764, 1564, 291, 955, 566, 1686, 312, 330, 2542, 2355, 2455, 887, 3163, 3151, 2534, 947, 3152, 1512, 3181, 990, 2316, 577, 3013, 2265, 1779, 1805, 3078, 2911, 1814, 1241, 344, 763, 1021, 1011, 2549, 434, 995, 402, 1407, 1882, 1280, 2091, 2606, 2902, 2824, 2236, 1627, 883, 358, 3203, 1818, 2073, 3257, 1682, 1194, 3247, 161, 1913, 3207, 25, 2169, 1753, 2878, 2034, 2267, 998, 354, 581, 2926, 965, 1467, 1498, 260, 2576, 1644, 225, 2487, 1797, 261, 1962, 434, 374, 2214, 2163, 598, 2035, 827, 1936, 1796, 2601, 2568, 2195, 2413, 2534, 831, 1925, 399, 386, 2456, 2, 963, 1670, 618, 2960, 765, 600, 2714, 3295, 1411, 794, 18, 90, 3170, 2844, 3200, 1724, 1369, 1406, 1608, 3056, 2044, 1699, 2519, 1, 1560, 170, 3275, 2213, 2437, 3048, 3208, 999, 1122, 1084, 1800, 2394, 1778, 316, 758, 2108, 306, 236, 1003, 345, 1486, 3072, 1441, 262, 3148, 2176, 2304, 2734, 2383, 175, 356, 2805, 13, 1530, 553, 991, 222, 449, 514, 1986, 1337, 3032, 1672, 98, 168, 1935, 2121, 945, 1406, 804, 1174, 202, 2176, 1343, 1673, 1694, 63, 814, 1440, 2209, 831, 411, 2401, 1427, 2287, 1926, 3295, 1551, 2910]] +u = NTTInverse(BHat * rHat) + e1: [[1219, 2402, 177, 1572, 1749, 1202, 2338, 2214, 3316, 2657, 2418, 1205, 1445, 3043, 407, 721, 3254, 3281, 570, 2981, 791, 732, 249, 2916, 2921, 1481, 664, 1693, 1078, 978, 287, 424, 264, 3221, 750, 2082, 1991, 1322, 2950, 1792, 1928, 1138, 1762, 1391, 40, 2903, 1461, 828, 874, 1896, 3171, 1436, 251, 607, 2845, 2145, 3259, 319, 787, 1303, 956, 2586, 1570, 115, 3225, 164, 1925, 2831, 102, 1529, 331, 2301, 3271, 2771, 1674, 923, 362, 680, 2867, 1865, 2969, 1542, 1979, 3096, 1594, 3241, 3099, 2011, 643, 41, 562, 1929, 1509, 749, 578, 178, 2749, 2588, 520, 855, 2719, 1018, 455, 955, 941, 2785, 1879, 1904, 454, 1334, 252, 3201, 2870, 1205, 3212, 811, 2937, 2453, 1941, 1686, 3042, 2625, 2941, 3127, 2483, 1845, 2362, 1353, 99, 1740, 567, 3191, 428, 695, 1184, 803, 1248, 509, 1583, 1181, 1379, 2263, 2648, 2870, 2343, 2351, 2696, 951, 2777, 2777, 2624, 1468, 2382, 154, 2845, 2659, 2062, 1869, 1819, 1135, 1263, 247, 1304, 1500, 1859, 1097, 3218, 2573, 1561, 1415, 737, 1127, 431, 2428, 1402, 3304, 2756, 970, 2482, 886, 1211, 1276, 722, 2029, 2131, 2506, 1783, 1826, 1747, 2295, 35, 2539, 328, 615, 366, 393, 486, 2216, 3010, 1418, 245, 1633, 727, 3056, 1766, 1, 3156, 1695, 2767, 2163, 1594, 2498, 784, 1673, 1777, 847, 2011, 2225, 1149, 2636, 2040, 1359, 2158, 1701, 515, 2284, 212, 1988, 30, 1088, 1222, 1416, 1012, 1030, 387, 1207, 1628, 2272, 726, 1906, 1706, 1704, 592, 687, 644, 2421, 35, 26, 2932, 124, 1546, 1617, 466, 1415, 1247, 2760], +[2186, 2521, 1229, 906, 2778, 2835, 1271, 2177, 2820, 1461, 948, 2902, 719, 1955, 422, 370, 1401, 1656, 1010, 2090, 2732, 2290, 1096, 583, 2751, 1370, 2971, 1728, 1301, 410, 1630, 2775, 1312, 1253, 2694, 2541, 2521, 2428, 1182, 1795, 2991, 1109, 1326, 1103, 1371, 2667, 1604, 2197, 1813, 1270, 3000, 920, 1365, 2881, 1173, 2638, 1820, 3218, 1285, 713, 2649, 2010, 605, 2320, 1990, 2656, 1641, 1110, 301, 1743, 3148, 2561, 1143, 2934, 2754, 3023, 3328, 1675, 2874, 2999, 2120, 1629, 2515, 153, 268, 2977, 2640, 1920, 1367, 1594, 2958, 1487, 2021, 286, 1714, 703, 930, 2314, 2582, 833, 227, 2557, 2226, 2460, 2422, 1228, 1300, 1834, 2950, 1294, 2583, 2410, 1719, 3141, 2556, 1523, 423, 2604, 1947, 21, 280, 499, 2336, 2849, 859, 781, 1263, 1598, 1554, 1899, 2764, 1033, 1834, 431, 1092, 2802, 1141, 1022, 1074, 3296, 2906, 2162, 2062, 1397, 1948, 3257, 1296, 2050, 2501, 2839, 2761, 2609, 1734, 108, 2138, 1832, 2784, 2944, 3054, 1428, 30, 349, 2197, 1990, 3051, 1919, 200, 1714, 1093, 1722, 220, 803, 3189, 347, 2042, 2301, 217, 903, 2706, 984, 1402, 545, 3290, 2528, 1381, 1116, 3097, 608, 780, 2163, 3229, 1476, 851, 1101, 1554, 1391, 1347, 1824, 1197, 2396, 3270, 1030, 50, 710, 993, 2963, 987, 1346, 323, 1605, 3222, 2996, 2170, 2707, 1104, 1543, 94, 2184, 2489, 342, 2949, 1290, 1211, 1084, 1473, 2387, 2948, 1943, 1608, 2647, 2700, 3283, 2804, 1379, 2404, 716, 378, 1652, 2597, 836, 3097, 2171, 1963, 1764, 2270, 794, 2805, 1332, 2215, 2238, 1159, 1919, 1062, 1226, 820, 1760], +[782, 2927, 1474, 97, 2730, 1954, 41, 1552, 2327, 2219, 3235, 2151, 223, 2731, 2803, 385, 2174, 3049, 2950, 940, 3248, 3236, 2019, 2917, 2073, 452, 2660, 34, 2759, 3029, 471, 150, 3065, 2936, 1211, 1627, 250, 2622, 1607, 956, 341, 3179, 1200, 2521, 1831, 2983, 1091, 1766, 517, 3164, 619, 2343, 799, 1752, 6, 786, 2426, 2305, 1880, 1269, 1091, 503, 2253, 764, 1563, 292, 954, 565, 1685, 311, 329, 2541, 2355, 2455, 888, 3163, 3151, 2533, 947, 3151, 1510, 3182, 991, 2316, 577, 3013, 2266, 1779, 1806, 3078, 2913, 1815, 1242, 344, 761, 1023, 1012, 2548, 434, 997, 401, 1408, 1882, 1280, 2089, 2605, 2900, 2824, 2234, 1626, 883, 359, 3203, 1818, 2072, 3258, 1682, 1195, 3248, 161, 1913, 3206, 25, 2170, 1753, 2879, 2032, 2267, 999, 355, 582, 2925, 965, 1466, 1497, 259, 2576, 1644, 224, 2487, 1796, 261, 1962, 434, 373, 2213, 2162, 600, 2033, 828, 1936, 1795, 2602, 2568, 2196, 2412, 2535, 831, 1925, 398, 387, 2457, 2, 965, 1669, 617, 2959, 765, 599, 2715, 3294, 1412, 796, 19, 90, 3172, 2842, 3198, 1725, 1371, 1407, 1608, 3054, 2044, 1699, 2520, 1, 1560, 171, 3276, 2214, 2436, 3047, 3209, 999, 1121, 1083, 1799, 2392, 1777, 315, 757, 2107, 306, 236, 1004, 345, 1486, 3072, 1441, 263, 3148, 2175, 2304, 2732, 2382, 177, 355, 2805, 12, 1530, 555, 991, 222, 449, 513, 1986, 1337, 3032, 1672, 98, 168, 1936, 2120, 943, 1408, 803, 1173, 203, 2175, 1343, 1675, 1694, 63, 816, 1441, 2209, 830, 411, 2400, 1428, 2287, 1924, 3296, 1551, 2909]] + +mu: [0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665] +tHat^T * rHat: [2789, 2045, 1564, 2584, 3322, 2870, 1233, 1876, 2979, 99, 785, 711, 1339, 1869, 2114, 320, 2129, 1008, 1461, 2283, 2195, 2360, 3197, 1966, 1521, 753, 1276, 517, 424, 868, 1927, 1774, 1601, 2598, 1829, 629, 2540, 1814, 1493, 2873, 3035, 2859, 895, 2067, 3299, 2768, 1941, 1520, 240, 1276, 512, 2015, 544, 15, 688, 734, 2091, 268, 2053, 2375, 1177, 709, 3186, 1700, 318, 3203, 2278, 2672, 1175, 2297, 1389, 158, 1482, 917, 242, 2820, 1382, 2339, 2476, 2319, 1760, 2836, 2764, 2992, 216, 689, 1957, 2518, 2976, 2274, 98, 1727, 2169, 3121, 2990, 1893, 1692, 848, 383, 1378, 1271, 2513, 2877, 2542, 1915, 2043, 3033, 284, 707, 229, 267, 380, 426, 2922, 2909, 230, 2463, 898, 1788, 74, 256, 868, 2214, 934, 685, 2176, 1903, 1400, 215, 66, 657, 170, 3173, 2434, 2087, 1473, 3008, 2858, 2109, 1604, 2264, 2651, 510, 1352, 104, 1602, 59, 2314, 1218, 1363, 2972, 2477, 902, 2273, 488, 1072, 1058, 3154, 746, 558, 258, 443, 1786, 3161, 2115, 1871, 1425, 2081, 2524, 2885, 253, 324, 1256, 1084, 1800, 2570, 275, 460, 1156, 1462, 231, 1611, 1716, 2522, 1639, 779, 931, 1927, 261, 1778, 1443, 3317, 2091, 1834, 2910, 1029, 2727, 797, 3269, 2356, 2600, 2977, 2224, 1866, 245, 2342, 3084, 860, 1473, 1660, 609, 1777, 1428, 1869, 834, 10, 2054, 2642, 3223, 677, 3042, 92, 1272, 1213, 2508, 2843, 897, 2437, 2623, 2634, 1795, 1867, 2063, 2488, 2064, 724, 2842, 3083, 2745, 467, 1319, 1891, 996, 2271, 1164, 2569, 1876, 2238, 1001, 3311, 234, 1026, 1130, 2514, 1888, 1091] +NTTInverse(tHat^T * rHat): [3165, 661, 2894, 3181, 3096, 2553, 1089, 1146, 3139, 2327, 3046, 3041, 452, 1230, 2199, 2491, 528, 1887, 2834, 1825, 832, 2627, 1113, 3176, 3139, 2533, 2112, 2531, 1676, 1186, 2610, 1289, 1477, 2822, 464, 602, 1339, 3167, 1847, 316, 1390, 2311, 3093, 1315, 1918, 766, 2377, 3009, 723, 2400, 30, 1252, 2054, 2582, 436, 1263, 2846, 2330, 3219, 2495, 2253, 1201, 861, 735, 996, 1111, 2904, 2551, 897, 1300, 1176, 214, 3062, 1450, 1077, 447, 1730, 2089, 630, 2270, 1229, 351, 1674, 1326, 2471, 848, 701, 2381, 2299, 3320, 1583, 1231, 1877, 1331, 1017, 2314, 2093, 873, 3137, 2734, 1795, 1367, 2729, 638, 582, 1662, 400, 199, 1689, 1784, 3269, 1785, 596, 104, 2156, 204, 2402, 656, 286, 2706, 2893, 1424, 2240, 1816, 303, 1620, 1289, 167, 2248, 3182, 562, 89, 893, 1986, 499, 2277, 1993, 78, 1266, 3272, 1875, 3067, 1454, 2343, 2202, 534, 1572, 2758, 2112, 384, 495, 15, 1280, 2288, 2877, 2342, 2335, 741, 1122, 2954, 2666, 3010, 901, 1307, 2660, 1862, 1392, 554, 2279, 1542, 1615, 2999, 1401, 2408, 84, 2938, 126, 1729, 171, 2937, 1212, 133, 892, 491, 1078, 2304, 1502, 874, 73, 1636, 221, 3114, 1329, 63, 304, 628, 580, 2373, 2023, 2080, 1390, 2119, 1863, 2834, 2166, 1609, 2882, 2462, 931, 1521, 716, 354, 499, 468, 737, 1394, 2695, 149, 2627, 2563, 1125, 1565, 572, 1112, 800, 1565, 1672, 536, 2108, 1287, 1997, 3073, 1800, 1279, 817, 197, 1641, 1692, 1627, 54, 3190, 1284, 2030, 1810, 545, 162, 1439, 915, 2065, 1856, 1942, 2995, 2801, 3128, 2244, 1673] +e2 + mu: [0, 1, 1, 3328, 0, 3328, 1665, 3328, 0, 1664, 1665, 1666, 1666, 1665, 3328, 1665, 1663, 3327, 1666, 1664, 1665, 0, 3327, 1664, 0, 1665, 0, 1665, 1, 0, 1664, 1664, 1663, 0, 1, 3328, 3327, 3328, 1666, 1664, 0, 1665, 1666, 1665, 1, 1665, 1667, 3328, 3328, 2, 1665, 1664, 1664, 3328, 1, 1665, 1665, 1667, 1663, 3328, 0, 1665, 3328, 1665, 1664, 0, 1664, 1665, 1666, 1664, 1, 1, 1665, 0, 2, 1666, 3327, 3328, 1666, 3328, 0, 0, 0, 1, 1666, 2, 1666, 1666, 3327, 3328, 0, 1665, 0, 3328, 1665, 1663, 1666, 1667, 1664, 1664, 1664, 1665, 1, 3327, 1666, 1, 1665, 1665, 1665, 3327, 3328, 1664, 1666, 0, 1666, 1665, 1665, 1665, 3328, 1, 1666, 1, 1, 1665, 3328, 1, 2, 1666, 1665, 1667, 0, 1664, 1666, 1664, 3328, 1665, 1664, 0, 3328, 1, 1665, 1664, 1667, 3327, 1665, 1665, 1666, 1, 1666, 3327, 1665, 1, 1, 1665, 1, 1665, 0, 0, 1667, 0, 1, 1665, 0, 1, 3328, 1, 1664, 1, 1664, 3328, 3327, 1666, 1665, 0, 1, 3328, 0, 1, 0, 1, 3327, 1665, 3327, 1666, 1666, 1667, 3327, 3328, 1665, 1665, 1666, 1666, 1667, 1663, 0, 0, 1664, 0, 3328, 1665, 1665, 1665, 1663, 1664, 1665, 0, 1664, 1664, 0, 1, 1665, 1664, 0, 1664, 1666, 1667, 3328, 1667, 3328, 0, 0, 1666, 1665, 1666, 1, 3328, 3328, 1664, 1664, 0, 1, 1665, 1666, 1665, 1, 3328, 0, 0, 3328, 1664, 3327, 3328, 1664, 1, 1664, 2, 0, 1666, 2, 0, 1666, 3328, 0, 0, 1664, 1665] +v = NTTInverse(tHat^T * rHat) + e2 + mu: [3165, 662, 2895, 3180, 3096, 2552, 2754, 1145, 3139, 662, 1382, 1378, 2118, 2895, 2198, 827, 2191, 1885, 1171, 160, 2497, 2627, 1111, 1511, 3139, 869, 2112, 867, 1677, 1186, 945, 2953, 3140, 2822, 465, 601, 1337, 3166, 184, 1980, 1390, 647, 1430, 2980, 1919, 2431, 715, 3008, 722, 2402, 1695, 2916, 389, 2581, 437, 2928, 1182, 668, 1553, 2494, 2253, 2866, 860, 2400, 2660, 1111, 1239, 887, 2563, 2964, 1177, 215, 1398, 1450, 1079, 2113, 1728, 2088, 2296, 2269, 1229, 351, 1674, 1327, 808, 850, 2367, 718, 2297, 3319, 1583, 2896, 1877, 1330, 2682, 648, 430, 2540, 1472, 1069, 130, 3032, 2730, 636, 2248, 1663, 2065, 1864, 25, 1782, 3268, 120, 2262, 104, 493, 1869, 738, 2321, 285, 2707, 1230, 1425, 2241, 152, 302, 1621, 1291, 1833, 584, 1520, 562, 1753, 2559, 321, 498, 613, 328, 78, 1265, 3273, 211, 1402, 3121, 2341, 538, 2199, 3238, 2759, 449, 382, 2160, 16, 1281, 624, 2878, 678, 2335, 741, 2789, 2954, 2667, 1346, 901, 1308, 2659, 1863, 3056, 555, 614, 1541, 1613, 1336, 3066, 2408, 85, 2937, 126, 1730, 171, 2938, 1210, 1798, 890, 2157, 2744, 642, 1500, 873, 1738, 3301, 1887, 1451, 2996, 1726, 304, 628, 2244, 2373, 2022, 416, 3055, 455, 197, 1169, 502, 1609, 1217, 797, 931, 1522, 2381, 2018, 499, 2132, 2403, 3061, 2694, 1816, 2626, 2563, 1125, 3231, 2237, 2778, 801, 1564, 1671, 2200, 443, 1287, 1998, 1409, 137, 2944, 818, 196, 1641, 1692, 1626, 1718, 3188, 1283, 365, 1811, 2209, 164, 1439, 2581, 2067, 1856, 279, 2994, 2801, 3128, 579, 9] + +c: 778D6B03791ACAF56CAAFCC78CEE5CBCA1DE8737E9C7FF4AE5F384D344E08223C74C824CB5848520517C7F0EA0645EB6F889517AE5216B0CF41DDC3F0D1DF9BC6E4DECB236A5EA8B214F64266D3CDE08E0CB00E5D91F586706B1EE533D20476F4423B78F916B1726EEEA959FFB9AC634D04A94D09923CB0D4E730CCA4144E7C4884921652DA4928C68E644F673CFC57D3E87CF5BE581A89F9CB8F0FCE2782D681E5CE88AF58458C3D63D807572DE5AA8E1FAF2DCD14EDB7349565B7D3271DDBEB0B6CC7AFE08635784311159733C46E5FDC5E0CD36CE5685ACFB1AFE50ABB46F447521E60D9C8F0E4CA28C190ABB40C365F412471E95A8EA396D4BD8070EEB1F02B07C825367AA1EC0F10C3862416BB21AD6CA748A86E9829EFC1A0499093C85176D37F574C75CF5EDFA8D920D3268CB34C6A4BB0002869BC05D7C8FCC0658D4A01EACD74557A37D98A763074752DFDD6429881CAFF577D3A048031BD52C4E9726398590F9519FD59405D6B3C307AFCB168A985785D954A6D1DC1EA92E1EB6F946A4D99DD6CA307ABFD8362FABA98BB264C69C5F555D60883CC56019FEB4E8000C48B7E68CD667F00B5250CEF293A4A9E778726E62F120361E21AB3140464CDC6ABDE9EA05198D8B3BB671B9111A2F317582847CA5015664F22CDB08C143187BDE2129B54F34160295D75FE9A494FD7E67AAA76B57AAFFD89D01A71DF5C8158620298D582BBEFA6D09AC412A99AA3BE9C383504948C43DD5AF4127B1435804F44BAFA142BFC2A95D95FB2EF0641ABE71064DE51D6B9EC50857B8EEF7F48036313D0E936763B8F7BDE69B064DD5761D80EA6F1A8B37565753C579BBB895EFB9FCB3FC5FA3362E3774F0F77140B973CAE587BAD2F3B566A9C25A969347E5C54F87F1105E9C074867D94077CCAE3ABEA54520EDB51D9DAABE7848E78FDF66E07E2E22B30251931E890BAF1F5E177D4D9CEC9E4969481FD7C1335A0ED5879F34EF4BB4F66C28803CEA162BA461506D52EB3AE16951922B06825186C3D4CE1B51F3C92F3C52F2D04D1F13B2B17C9EEB882CCE0EB88B7EA9A1CE4E37415CC84C7BC436A4628386CC77D9AFD207911BD9BFD8A7FA05C275BE0C4C6A8FC0A61BDA1D67AE33B5310BE1290DC71C1418EB5744BF2842C1652173A49A692E71FE43258A205B3CAAB90C0304A51E77D01B404A01FAE2F83AB80C5DBF6CF518C001F46A633FA169B1BDB77A9D0B1E0C007835C09F6ABBA96F3F53564DA508EE8861A483A81749D4A44672B1EF1605F29D168B74B736B4F13501D7AD1213118A7832E666A50BE8010D54322A526CF7A4E543A79D0D98E004FBEC76EA3F7E887BDBAF50DADFDDDF3FFECF6D3F77EA4B9B16DC754F4A68E5EF32F6A137E7C9E3C3E8C2E236C7EBC45D46EC1677A5A8BB2668443B0BE8693DC257F13D8B9A90100B92B4D1761B819673832C32020671BFB3D0220A363E4BED6D649D3F7368CFE081E196A43D4708798E31BB2A2F61824674ABA2FC9DCD05DB84B8627AE11488886F921BC79AE1FD03 diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt new file mode 100644 index 000000000..00df74291 --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt @@ -0,0 +1,60 @@ +Key Generation -- ML-DSA-44 +seed: 6CAE2E9C2CF64D2686C31C2118E0F24A47DD46DB85590910AAC9DF4C1B854E44 +rho: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28B +rhoPrime: 11779B16A7054953860C14796F63018C9EFD3957CC53A12AF727A5AFC64507445D9EA5E19B6403B3DD3ABAD9B1DAD1146E9C64410E372E7A6D9973F0D04D9632 +k: B149C045A55EADA0C519069A8EE0602FBEDA8D2EDFEA09CAE01D542D47DCBA1E + +aHat: [[[4518441, 4610216, 2805006, 6522567, 958931, 2266298, 7298857, 6160680, 4376220, 5886423, 2456656, 7246256, 4825911, 4337879, 2286865, 4975700, 7723526, 6630454, 2204799, 6974152, 3641877, 2682186, 3758592, 330607, 1959748, 3746432, 7597266, 4910389, 641899, 1715509, 4016248, 7983993, 461860, 1925060, 5588342, 6865940, 801570, 1437121, 2888995, 4630526, 7744414, 3207892, 3168892, 3304860, 2869380, 1589994, 6622481, 2993789, 239572, 1127468, 4289687, 3743089, 8306066, 670866, 224252, 2668871, 4766662, 6351470, 107841, 4351591, 6149703, 4029424, 2974292, 2952371, 2390000, 3452883, 5520752, 8045611, 3071748, 6918874, 1598525, 5839685, 2588194, 1661639, 8283367, 451132, 2401602, 4482892, 1648467, 3766818, 5943364, 2607508, 1396017, 354778, 7392330, 3426517, 2252104, 7582171, 7041680, 8254132, 4837419, 3427646, 5648239, 1340483, 2106014, 5619971, 8047549, 1766861, 4997094, 2655087, 1833901, 6496344, 1627718, 5577072, 1614037, 8275918, 3612158, 4023975, 2857599, 2705923, 4976039, 1646530, 3668470, 7279361, 1139314, 6200673, 6509985, 7634125, 751210, 1686515, 3632581, 6879928, 6710111, 5998910, 3641475, 7918054, 7161821, 781378, 7072756, 406340, 6364143, 3877989, 5757571, 4960393, 978980, 3293448, 8071153, 3426539, 2209015, 5829651, 6805842, 2205790, 4854682, 5689645, 4011852, 672630, 617486, 7641292, 4172951, 552101, 4850266, 2002565, 4698909, 668414, 2894419, 5170042, 6623145, 4969904, 5081850, 3046208, 2744487, 6937629, 4859523, 7875762, 2030321, 5614884, 6294169, 6123973, 7804743, 3650248, 6927979, 1296021, 325849, 7021109, 4763099, 5292228, 5427774, 6977480, 8119876, 376758, 1371392, 5321018, 3940066, 7227323, 1881381, 2508237, 1826744, 6054373, 1469672, 2013638, 2815608, 5224298, 3744517, 2208767, 3195006, 5346041, 3555416, 2810011, 5767192, 1992423, 1996425, 673727, 3820400, 2603024, 1265806, 4105841, 5709176, 1701301, 1257375, 2322551, 2282344, 6197550, 4919774, 1715437, 2310440, 4139096, 2777066, 4690551, 4375746, 1204776, 4339181, 492762, 6285749, 5544359, 2609114, 7793257, 5522279, 6469830, 6966070, 7131876, 1192681, 3121188, 3585363, 1109594, 544971, 1239128, 2606639, 383455, 4553205, 7290844, 5113828, 6265912, 5040919, 2360841, 5979830, 2226344, 5995031, 1428977, 6093613, 3906579, 6105434, 6821401, 454876, 4358818, 2011397, 3753793], +[1518172, 2060152, 4749985, 6513620, 2245042, 7549147, 2532897, 6922184, 1547706, 7925910, 4641118, 6372818, 5442868, 3048857, 7986176, 21420, 5056353, 6891298, 4542399, 7076213, 6275361, 8208180, 154945, 1948346, 3284898, 4989897, 7108808, 7056573, 6885085, 571778, 4065644, 2685766, 8155194, 541203, 5470838, 1472371, 2416151, 7749407, 8064363, 7548353, 4712156, 6871549, 8036386, 6504374, 3864765, 8053363, 8318453, 125969, 1939728, 632034, 2998769, 436571, 5781522, 2508874, 801728, 4798344, 1008085, 1423633, 1265200, 5674908, 7925025, 6212469, 673086, 8105049, 5030459, 7006432, 5881726, 158417, 7556353, 5968301, 973369, 527641, 3238686, 4879338, 610039, 4739629, 7852300, 5153192, 5167041, 1339561, 549682, 1776472, 270443, 7329846, 2925703, 51375, 3372021, 4292891, 8137765, 6613054, 6358921, 6961144, 1627786, 1999316, 225990, 1011796, 1146585, 2475820, 2057713, 970282, 5258000, 7836558, 3749162, 5684970, 2554920, 3989052, 3989309, 818669, 355042, 7609968, 3599884, 8237170, 4479000, 5550720, 1990775, 713096, 4937363, 3958646, 4051217, 4966364, 6410537, 7346515, 3787148, 1435141, 406867, 1274391, 4801696, 5836062, 5288721, 4747517, 640604, 4391898, 2414827, 3432201, 333532, 235219, 450266, 1274021, 2323020, 7881933, 2990152, 4693110, 1709601, 6672812, 465669, 2288253, 7720032, 1857528, 3611405, 8306302, 881492, 2094316, 3495978, 3387236, 4248594, 5144503, 2136154, 1923534, 6312530, 8023281, 1784993, 1014235, 2591079, 7276663, 4964399, 5833711, 5882067, 6787296, 1007764, 5428257, 1054806, 1862149, 5925847, 4453996, 1583669, 4383789, 4034600, 8279879, 3014613, 7745916, 5572748, 4191518, 124358, 5330651, 5649969, 5220517, 1969915, 5773922, 2155348, 7028310, 5826040, 5432945, 2178759, 1591689, 2687555, 1233601, 5835556, 4766760, 4122842, 7080329, 8233748, 2915448, 5224484, 7189786, 3972229, 8371705, 4438065, 6082193, 5771723, 3819276, 2996234, 3370235, 7895249, 3379379, 8105675, 1685296, 3453709, 6974001, 3392577, 5323805, 6564006, 2922350, 5250917, 4816644, 6745278, 6692013, 54937, 7819808, 1099662, 6594866, 2579133, 8127228, 7500445, 1077904, 1666808, 1627578, 7121000, 5726282, 2747483, 7782887, 6902073, 1423073, 3162770, 197711, 4261107, 7234872, 8079119, 7069423, 6875165, 2517374, 3357707, 5793532, 1574278, 5929221, 6438097, 1301156], +[5580016, 7782159, 4916820, 3492846, 1528232, 8008932, 7778144, 980016, 3083229, 8050068, 4533047, 3121986, 1216278, 1788935, 5913428, 2162915, 6613702, 7187741, 6399716, 649528, 544655, 6984351, 124762, 7905385, 4802618, 5676543, 978087, 7760525, 2252449, 5178828, 4024996, 7488399, 5945620, 3516586, 6926424, 851414, 1905338, 7805119, 7215103, 1367698, 7005025, 6583705, 2678247, 4431560, 3621123, 714899, 5589627, 3661459, 6251607, 7180144, 2041125, 8123654, 4508779, 1642245, 535598, 5791575, 3243986, 288972, 1258976, 6162954, 2678852, 3362489, 6783099, 2673543, 7949924, 7158207, 555311, 523584, 7898033, 5007402, 7048741, 1089711, 1038614, 8049732, 7151128, 5877201, 4199472, 3234224, 305330, 3409089, 7529662, 7093835, 7058243, 3103514, 8257718, 3430935, 2214545, 4830751, 7647853, 2548093, 1567164, 3347946, 4184655, 7725624, 1151396, 4558452, 3438973, 5913013, 6490784, 1816083, 1235129, 7714209, 7318389, 2443984, 4543605, 4550342, 6260869, 2009870, 3798982, 3596706, 2082602, 7487515, 5877287, 6535731, 2245110, 7979759, 1505718, 4801130, 19098, 4411481, 1436961, 2033515, 2267667, 8058670, 1073955, 6357383, 709520, 6872430, 4721983, 5360679, 3873632, 6149355, 7363592, 2845178, 2562854, 5496102, 2909217, 373723, 7138856, 613927, 2858137, 3130330, 7503022, 3222249, 5958159, 3619194, 3427195, 826897, 3613603, 3023499, 2513752, 262049, 7209308, 4572034, 5715316, 6851643, 4058379, 6356935, 1440714, 514135, 6906799, 6402882, 2558726, 3237259, 4465496, 1881604, 3392275, 459158, 4799953, 7181344, 6262321, 6085045, 3935786, 4292640, 3016549, 5513699, 5488484, 4269176, 3290063, 234979, 7209054, 5142806, 7101425, 8084356, 8369708, 6975023, 6467417, 7551178, 2509660, 2220413, 1744880, 8330255, 7740428, 5818101, 2958695, 8293183, 1703104, 5170863, 694158, 5810297, 6807628, 8124310, 6290425, 5997606, 5608879, 1296268, 7237136, 1822457, 4493472, 8255348, 5378147, 898876, 6900344, 1881619, 4712423, 2014144, 946306, 5177584, 3172773, 5441677, 7194832, 5233822, 6188125, 3818815, 2986839, 2891747, 3238179, 2665510, 4670825, 4431218, 2558983, 5303695, 5335001, 7211671, 1324392, 4155560, 1238623, 352487, 3111224, 8046879, 11016, 2642804, 8031881, 470499, 866313, 5069481, 2873574, 667775, 6897652, 3681050, 3265012, 1011725, 2310395, 6794032, 8221903, 5058927], +[3867698, 3883645, 7640217, 1653450, 7082472, 1447081, 7250588, 6581285, 294533, 5402653, 604135, 2911419, 6568667, 5301208, 4153480, 7717253, 3503939, 7212932, 5358805, 431999, 8123001, 3575610, 2966989, 6920466, 4811686, 5262876, 5878254, 1228969, 4668617, 136369, 4564256, 674798, 7403258, 3103734, 1902817, 3507509, 5780034, 5794528, 8343498, 6855770, 3314569, 7117130, 6455227, 493097, 2127494, 3351787, 248360, 6445957, 6449069, 7360619, 2832685, 2737524, 444922, 789268, 1785731, 5519708, 6852687, 3463042, 1363515, 4846634, 6309176, 7758177, 7140078, 4999039, 4168434, 4845481, 8376655, 1222988, 2220523, 814073, 7350739, 929651, 3207340, 2209495, 1801246, 6842001, 8161678, 2392071, 7100808, 8165593, 1266683, 26287, 1077846, 6835607, 7718291, 1416286, 2269897, 4921558, 485785, 3315594, 611576, 7989995, 987839, 6167298, 6411012, 248289, 833830, 7731057, 4594799, 7648777, 4674945, 2441770, 3659260, 7949656, 4424607, 5983814, 1014632, 49698, 619222, 7934754, 5933766, 5439181, 4175593, 76864, 1817838, 3352907, 7096503, 3873149, 6979849, 6868478, 6423983, 323477, 4902231, 4095937, 2776794, 8135714, 3564606, 1815038, 3363841, 7009231, 4599109, 6499403, 5401067, 7297969, 5973110, 4103010, 4954796, 2097084, 7347436, 4889534, 4262124, 4235038, 4932033, 6632728, 4928069, 1837592, 1352565, 4928866, 5553589, 5194490, 1822136, 2656487, 4329299, 4852935, 6044336, 6789270, 2636592, 284470, 6095094, 3148181, 7193700, 8039321, 7114030, 5318912, 3813707, 2312678, 2590242, 1964027, 2520436, 1472838, 1543667, 3889347, 535775, 274776, 4927494, 5500148, 2398943, 5789622, 947547, 1550227, 6740223, 1409204, 3434700, 3849397, 3814243, 646926, 111329, 6875554, 864036, 1432465, 1482868, 1986078, 63247, 4160214, 7392191, 4363968, 3335444, 5539216, 749669, 3060665, 3020591, 3514511, 3972481, 5352850, 6653620, 571371, 6913910, 5560871, 824977, 4712403, 1862050, 3251723, 467235, 6107009, 7570225, 7137228, 2567958, 174754, 1671568, 6781061, 6536043, 1474348, 203283, 1929596, 4268021, 7324374, 6864285, 2320114, 5894602, 486347, 849717, 7946989, 195446, 1212363, 8181349, 6223219, 4117548, 7261111, 7958608, 7723700, 6973511, 5142677, 3569022, 7339732, 4492625, 7723827, 7375389, 2086411, 181908, 396347, 2726536, 4452170, 5837876, 8377072, 5627687, 1379342]], +[[1279303, 2532728, 3723926, 1729839, 3554515, 7192021, 7349548, 488026, 4908512, 4753212, 2935848, 582517, 8226312, 3995094, 3902326, 5741747, 4972919, 4115615, 3317175, 6834082, 7323460, 573427, 117906, 2680762, 3977869, 6802298, 4350808, 7476367, 692851, 7212430, 7247385, 2513003, 1258295, 3256675, 5405716, 2036577, 4278264, 3388709, 953424, 6452628, 2700855, 8220831, 5011710, 8208478, 4352772, 2928017, 4393396, 2168691, 623598, 3328599, 3998364, 534668, 6148112, 3227690, 4861477, 8283266, 586852, 4073984, 6884509, 2169099, 1569696, 4711636, 7913079, 7454742, 211250, 3592870, 2498642, 513598, 3282434, 6651101, 4122429, 7450059, 2729210, 4272498, 2079560, 4592438, 1901429, 1893014, 6617247, 894772, 1128794, 5516347, 6371640, 7871953, 1496239, 5869781, 206873, 2188900, 7149361, 7023493, 6337361, 1758757, 3851211, 2092765, 8218384, 5907086, 5536899, 4082483, 2130791, 5057091, 2006344, 4039813, 8107433, 1668350, 5283839, 3606048, 5272715, 2397565, 5007287, 3790945, 8115279, 4020548, 7556076, 3942239, 3524809, 2994266, 6884771, 1077683, 1996486, 6978119, 5971665, 2606909, 6787740, 3383593, 7450843, 7584824, 8105951, 1401479, 5181903, 2690540, 523297, 3321928, 1367725, 3543984, 1555558, 6823124, 1831065, 1243203, 6990122, 4631942, 787269, 5553480, 693494, 1444751, 3485719, 7485710, 7420792, 7104326, 4283267, 1843580, 4260034, 1873542, 426165, 401486, 6589358, 3880011, 2032423, 2121508, 1916138, 4758351, 4401552, 5779887, 2860436, 6593863, 5081695, 4202248, 5069924, 2398934, 5506877, 8137104, 4429075, 6598969, 3964736, 555130, 3539468, 5937585, 1170550, 827954, 7297302, 7923441, 3067402, 943901, 1557953, 1934928, 2733436, 490124, 6849329, 8150031, 2303296, 1599065, 2537381, 333500, 862886, 8055632, 3540201, 1032498, 4792804, 6054459, 522909, 3185613, 464367, 1863182, 3295536, 4103063, 7423023, 5385995, 2775855, 3199389, 892455, 5296759, 849365, 5139235, 2008389, 2911983, 6241941, 1238812, 6174687, 2982094, 1113422, 938783, 7059221, 1734800, 4016617, 2292347, 5311484, 2543992, 299568, 2472565, 1310012, 4427750, 1680141, 4739129, 1351576, 6281068, 2885304, 561892, 3275418, 1798270, 1556508, 7335164, 454592, 1481328, 7120546, 4556406, 3425680, 2524385, 2696744, 8182132, 6449102, 2413664, 5718114, 521636, 1155506, 460943, 8092747, 1833977], +[2588787, 7264972, 1949825, 6006983, 4106024, 65365, 8042118, 4118970, 7298493, 5150193, 3503187, 6298208, 7082413, 6628507, 875436, 2772530, 1406536, 2280872, 2828381, 954090, 2076839, 5050897, 4475769, 2225131, 7118120, 7733023, 5380256, 7923294, 2471163, 5656587, 5229877, 1349453, 5489004, 7160049, 8092605, 1728427, 2175550, 635825, 897094, 3815049, 3282124, 2029619, 5550263, 4936206, 4294227, 6979739, 655083, 35701, 7380879, 3080743, 6423293, 7548297, 8229387, 1780180, 5014966, 6949210, 6671373, 4066690, 1277373, 3977637, 2320299, 3833464, 2158176, 7612292, 5098910, 642704, 6354228, 6855810, 1257984, 656182, 4155134, 7657851, 6786028, 4163551, 3658918, 696975, 3176269, 3299909, 589382, 5413667, 7564428, 7624131, 7752638, 2730219, 419268, 3892274, 714867, 1416747, 4555948, 3951837, 1909180, 6148843, 2626201, 5092443, 1473012, 5642995, 4211814, 6216758, 5798255, 2972642, 6069745, 7531656, 5510550, 2303940, 5456128, 560229, 6324598, 6728416, 2485231, 5553409, 105343, 6016571, 6462957, 3308595, 3153700, 2592460, 4215420, 600521, 3123877, 2644776, 1046855, 6048332, 7014019, 7269070, 1643295, 235324, 5040734, 5633949, 2855572, 7599411, 4989659, 6649349, 3749099, 6717074, 764211, 982726, 6822644, 2333790, 4353857, 1220958, 975158, 1154488, 4638406, 5038614, 2667522, 3507565, 5427602, 5555482, 934836, 1027744, 4011580, 3871212, 5853435, 7102778, 1196843, 6813958, 2825362, 99776, 1284806, 289769, 3318585, 2705395, 8308591, 107187, 1389506, 1431304, 4774512, 2847857, 7358547, 1558739, 7365439, 6194242, 1911145, 2891273, 1316031, 3360773, 1403043, 30324, 1698587, 3761446, 385509, 1858284, 705870, 8258769, 377990, 1898545, 894576, 3557282, 4629897, 5833132, 2586828, 4798068, 5611442, 6511628, 6884634, 1493708, 6048510, 8221241, 6021553, 5248480, 5765260, 5721630, 5661859, 4085633, 3348565, 1999214, 1958294, 6872939, 3567283, 534321, 5312654, 4153388, 5093992, 6454300, 7952066, 467209, 2177999, 5440902, 4520149, 6811250, 7364753, 2178359, 7325634, 6880754, 1405754, 7492063, 4465431, 5877044, 6364516, 4337892, 2462302, 6913486, 2440627, 409901, 5659563, 1559745, 8193169, 1215069, 2166309, 232782, 8196663, 1987072, 7793561, 7802230, 1949546, 6091111, 162868, 8220543, 5975956, 2171296, 1492660, 7845511, 3236095, 966714, 3316883, 2131015], +[7214090, 1245002, 5091873, 3288262, 5791684, 3803755, 1182560, 491901, 8125913, 8076680, 5245769, 261418, 5214617, 1778846, 4876381, 7795651, 7190721, 5880649, 4408791, 2467023, 3574516, 1248173, 7761758, 2235975, 4374782, 1626661, 3978887, 837583, 5235745, 1599171, 4722125, 8036000, 2714503, 7942919, 6652999, 1026397, 1043823, 379474, 8252447, 6841482, 6076136, 7991346, 2205377, 87069, 3074605, 2717905, 5328781, 3968095, 903688, 506337, 7220319, 5755646, 448503, 2644949, 831389, 357262, 538889, 4163796, 6057964, 1294134, 2663052, 4076289, 5586600, 1396275, 4705160, 7053357, 2883964, 406345, 1374354, 4332948, 1029004, 279419, 6636542, 4529366, 2351108, 4409698, 1338142, 5908375, 6384170, 4842362, 544686, 8234323, 4616269, 627864, 1631970, 5736636, 3659316, 6468911, 8344375, 5961775, 594709, 2850593, 6324275, 5042376, 1075204, 6152354, 6431084, 5546271, 7674344, 2823850, 1584983, 5034374, 8117886, 568783, 4611894, 39963, 983742, 1684251, 2643291, 3825305, 6225251, 2028326, 2009291, 7273081, 5679386, 544533, 7520328, 2101684, 2813660, 7336240, 7345845, 1093431, 6453688, 4827055, 409973, 1987340, 3579976, 5385536, 5829031, 4751524, 7257923, 3104015, 5510642, 8373776, 6078296, 519100, 2906332, 4401342, 1856885, 3005697, 5404444, 2558656, 2944819, 7349099, 2382031, 3211224, 8312742, 8103659, 8062449, 7392699, 3818121, 4225616, 6928598, 7109620, 4627220, 5284981, 1272140, 8073111, 135960, 2650625, 1533684, 1127131, 1898644, 247448, 5408073, 3682733, 5494057, 1767908, 6580607, 6935412, 1880523, 7293620, 6258505, 6978421, 3991535, 3556132, 576859, 5736265, 6633259, 884, 7605607, 4004045, 523198, 3396954, 6941056, 8112620, 1708240, 414090, 5260636, 3779436, 3580935, 3547923, 3238368, 1750330, 2693699, 769137, 4105604, 2851917, 5412669, 4823799, 4087508, 5916080, 2233153, 8094207, 5453445, 2431140, 7991852, 238306, 2267382, 252683, 6856823, 6552092, 4407510, 5917084, 1708488, 3967746, 814512, 4347019, 4287715, 4242787, 7485937, 1663006, 3581033, 5766274, 6649947, 2339668, 6884550, 6910508, 3669313, 5580577, 3551337, 5757673, 158343, 4404680, 5102557, 7042148, 2222677, 1398435, 6502015, 7121462, 1120694, 7500838, 3547108, 7722409, 8172842, 4078832, 7432114, 5607647, 2406552, 3823941, 5704073, 119155, 4984839, 6996480, 8222205, 678670], +[1502785, 581000, 1879879, 3156914, 1881, 5520763, 5935759, 6693937, 3320379, 537813, 3615546, 5159640, 8378114, 7826275, 4223748, 1036709, 4188652, 1484384, 5837742, 1356604, 7125068, 2395989, 1330893, 2911668, 1939147, 4710718, 1719727, 8071301, 5634364, 545563, 654278, 3304318, 4969457, 5539370, 2303242, 4995627, 4465753, 8245885, 6763821, 6734333, 3898452, 3722998, 1299712, 6769049, 1377368, 2908214, 4567604, 421417, 6262335, 2350617, 33592, 6581823, 7307321, 1202346, 8201474, 976710, 4506529, 6166292, 7327699, 807370, 3100909, 2687642, 1616262, 6499341, 2856549, 418495, 1508468, 2333450, 1800626, 8181786, 5911687, 2107476, 4333817, 4213541, 4063539, 6735982, 2820646, 6389940, 1158843, 4515074, 244540, 7813631, 1184677, 810509, 2194550, 8007913, 658508, 4985024, 1092544, 467220, 6540210, 7811261, 5855992, 6679079, 5671171, 6307749, 8189132, 7587409, 4129306, 1248229, 1951351, 528847, 1847435, 5277341, 3056245, 3383891, 46623, 4076284, 3481972, 7861379, 3161346, 3301328, 3963460, 648312, 5207105, 4952087, 564963, 5425267, 6659913, 8355131, 5399906, 4927795, 7431636, 2815882, 2538145, 5339797, 6863498, 4815843, 7963571, 390704, 4657086, 3257065, 2450447, 4756488, 260609, 4908346, 6471042, 6821104, 365682, 3167001, 7436986, 3754100, 8014606, 3653522, 5691317, 7225196, 703841, 4991615, 5060750, 4802316, 5669898, 2923891, 4096639, 2876583, 6916570, 1295212, 7070463, 3815406, 5593591, 307863, 7887401, 1195013, 2062930, 6493420, 7162249, 6165917, 1633371, 1155848, 4102687, 2595361, 1594031, 699359, 6340600, 6346037, 1394702, 6598893, 3450996, 1217433, 3986188, 7739076, 2918353, 3715297, 6796746, 2035447, 2314395, 5986496, 7940579, 996360, 7374792, 7397647, 4571139, 1824594, 8208877, 5912141, 1557570, 6492115, 1435560, 7362202, 495028, 1608298, 7712470, 5007077, 6445561, 8007526, 1229785, 5782624, 3752609, 6294465, 1219456, 4207775, 6782427, 5431652, 5014733, 6303859, 747560, 6130760, 742958, 1446765, 1441348, 5942755, 7017974, 5377921, 437429, 3479341, 118404, 6745093, 3385406, 4169486, 6915264, 2014287, 313377, 1266882, 4414167, 2092747, 3487847, 2727246, 5453665, 7929258, 3767661, 3543330, 1351459, 278072, 1017968, 1030806, 5304879, 679742, 2719859, 5557184, 3672367, 4095138, 7136369, 3378300, 7895056, 1112543, 5904443, 1202903]], +[[2404918, 276932, 3882934, 6309816, 7054, 1227527, 6032464, 1468902, 1006551, 7960608, 2274509, 6217106, 2692912, 3723609, 7365367, 479793, 8275436, 1223182, 7857245, 1698505, 4382472, 1020689, 4187499, 7730791, 1141069, 4064588, 2100349, 2608143, 5621896, 135891, 4094687, 5270722, 4117897, 6779221, 4130188, 2188880, 7309237, 8142312, 3208894, 2447742, 2444463, 5923969, 4340653, 4451352, 3157937, 4105317, 2036212, 5601367, 7290177, 7253956, 18454, 7080442, 3041740, 4371122, 1237977, 1371602, 5955693, 277450, 542356, 6950067, 4990246, 3317434, 1480980, 7103270, 4294298, 1195832, 415981, 2970518, 7707786, 6928318, 7251838, 7642040, 7660974, 3743720, 7290830, 5954427, 4780109, 964684, 7684066, 6979418, 1725456, 7383614, 2856087, 626237, 6401866, 3106189, 1444619, 4347453, 2951395, 1373500, 3207489, 3054027, 4187665, 2217116, 4606640, 2937783, 2753791, 4969896, 2478917, 4230228, 3142542, 4154066, 2249014, 6111716, 5250896, 1649030, 2616659, 1579147, 3229291, 5686831, 4078876, 6995665, 2846322, 6486235, 1936229, 7277093, 800481, 2388028, 5232539, 572028, 3408175, 8106863, 4771058, 1731325, 1791876, 4076429, 4431610, 5208613, 276462, 6781837, 4529871, 7045443, 1788896, 6958841, 2990803, 6754275, 3238036, 5448829, 8193306, 2476490, 1640507, 5280259, 2520904, 5198571, 5162632, 6571150, 6202832, 984789, 7199638, 4531630, 3170130, 859036, 7942670, 7980584, 492489, 4227106, 5311994, 2661568, 7654661, 2514672, 1704729, 928536, 5911230, 6845108, 6008402, 2655746, 4421201, 8287461, 5671446, 3330378, 1554315, 4185797, 8269183, 8361400, 2645345, 3545311, 4207346, 4376263, 44161, 509423, 881404, 2027491, 4801259, 2053698, 2445544, 5595661, 8015735, 3821274, 4795254, 2597044, 1703431, 523947, 4878164, 2948061, 6164412, 5935226, 6292998, 322269, 3877967, 6201686, 7083060, 4610491, 2591483, 8323966, 8210203, 6008787, 459729, 6682324, 54016, 5495567, 2341092, 2863364, 2469355, 7398004, 8181252, 63214, 4482387, 6869539, 7865106, 8298372, 3045726, 5956776, 3350095, 2414255, 1007141, 4612954, 3193628, 7229815, 7941391, 7818244, 6249602, 1134627, 1155382, 3806264, 6043308, 3861063, 4125831, 7150584, 2662306, 3134283, 5882310, 7954242, 2696106, 1531245, 6441348, 5025275, 993951, 8310223, 5200671, 1404277, 6774394, 6970434, 7466655, 2065592, 3474453, 6088781], +[693190, 1361324, 7727759, 1970984, 6574841, 5428942, 6405128, 7678800, 803027, 5292092, 7678200, 2171904, 4578474, 116086, 5949644, 7854469, 4486967, 6189516, 8037897, 190272, 4338939, 3526540, 2879168, 6535121, 868861, 3614109, 5851122, 809245, 3172146, 5334031, 2779523, 337330, 6244908, 5824737, 2773828, 1261154, 7470403, 5320506, 3732204, 4315046, 3837757, 969234, 5396148, 4315988, 332850, 2345289, 2541008, 3119173, 1261821, 1033729, 4386047, 2127580, 5228707, 5131727, 6255688, 1845701, 2725457, 560492, 4391584, 5155992, 5563458, 6850300, 6916701, 1405351, 3465283, 5372839, 3137242, 4568056, 6528909, 5493622, 1513135, 3042164, 2338753, 1956182, 8172059, 5768417, 4205354, 282772, 2589352, 7115443, 3974986, 8100327, 3241822, 443132, 5961877, 4984198, 245231, 3578585, 3576186, 2463032, 5524928, 7950739, 2614044, 5048629, 6849381, 8110943, 2554144, 7896925, 7009014, 3680131, 1146379, 2262467, 7222102, 6010112, 3567221, 5989929, 4466557, 6213649, 5578746, 3919629, 1591954, 1672284, 7951015, 2011223, 4394647, 3681219, 4046387, 1122127, 6995689, 4115547, 3486871, 5559996, 7016542, 5185015, 4138064, 4418241, 6454394, 6757035, 8012689, 1783927, 8157596, 45041, 8092587, 2470080, 7185169, 8317186, 1773582, 7845756, 4742896, 3108596, 5807894, 3636438, 2633279, 3089498, 1259630, 5404158, 7523232, 6382223, 5726497, 2198256, 7175573, 7590947, 6960575, 5319174, 3436716, 566892, 411351, 2744838, 6251469, 7524716, 686571, 8029625, 5579022, 1853509, 1066438, 5953627, 6174703, 1477997, 2578358, 4267691, 1066977, 2814682, 2229131, 6223372, 678095, 6556461, 8002646, 1003093, 7473557, 4645612, 2586747, 3919328, 5937281, 6870125, 3445412, 5786669, 1455705, 5885834, 3273128, 6923558, 1845642, 7740846, 1354208, 6535242, 4306761, 48780, 2305909, 6171013, 3181982, 4011679, 2923333, 7914097, 2329686, 1922218, 7603714, 2493637, 7762006, 7385885, 7628070, 5389856, 4157813, 7746219, 4536210, 5503325, 3034993, 941457, 2345223, 4856719, 1439570, 6246479, 759606, 6602955, 5781037, 5404049, 2339107, 6317760, 6516372, 2266187, 1041332, 3797342, 7626320, 6944604, 8123476, 8050895, 1147683, 3258224, 3535601, 2484659, 209440, 7068358, 4970998, 866248, 8117128, 2482345, 2352048, 5322014, 824820, 4752577, 849390, 1432826, 1130729, 169765, 7920358, 4450407, 6641840, 6176528], +[7312216, 779896, 2063100, 2626307, 113765, 2660404, 5929719, 639671, 4486125, 7505161, 3557068, 3961934, 3889306, 5903614, 4669780, 3123630, 4197544, 635814, 7701796, 2359696, 6854366, 6229635, 4784683, 239568, 479175, 2104853, 1396955, 2203805, 4558511, 647737, 7987135, 3209153, 8281079, 6540443, 8248882, 1482326, 5887339, 259681, 159989, 2310553, 3329609, 5679840, 6023629, 4496991, 3429663, 4063270, 6657076, 7482065, 4391535, 696832, 2866708, 4883516, 7916041, 3033765, 5673338, 4913378, 7804184, 6662795, 4598281, 6064331, 630175, 2233938, 7914047, 4283458, 4253688, 5327841, 3592582, 5344832, 1151693, 7603432, 3925031, 2193557, 2174267, 8173986, 7447582, 2925498, 7327635, 7672205, 2581250, 6237118, 2972818, 1404298, 6592867, 3545527, 5447734, 8186271, 3445122, 1277089, 6547218, 5031239, 7745109, 6935811, 8006482, 2210686, 246778, 4428898, 4343029, 415501, 7904272, 978164, 255568, 6374957, 5789812, 7041591, 6515334, 6788081, 7618211, 4963012, 323170, 611857, 5273777, 4903229, 6731920, 428412, 3992136, 691353, 6575120, 2248642, 4825680, 4526726, 4127444, 6061438, 3304649, 4612242, 2725296, 3114125, 4397194, 1092739, 8162970, 7769125, 7808259, 3278989, 5995383, 6276587, 2727229, 7163774, 7412419, 5696460, 8165463, 3186393, 2398123, 1302525, 4106632, 2465301, 4087308, 2394718, 557157, 4811562, 4480504, 4504800, 5632014, 4097984, 4498638, 3597303, 6478980, 1550286, 7668897, 296776, 4433133, 5419330, 7424148, 3902819, 4064440, 5024723, 785701, 8345980, 1456362, 3222982, 8002975, 297381, 6194682, 5811299, 4869584, 1250891, 1428092, 1854047, 3056635, 4229045, 2431615, 7045505, 206352, 5432465, 1009988, 110, 6225272, 964878, 6345997, 6848714, 4698291, 7007322, 6258933, 4098716, 7176292, 7590976, 6438244, 6457630, 391110, 359845, 5119649, 1858632, 8115938, 3054259, 6012581, 4448016, 6792916, 1401512, 1938527, 6982560, 3116142, 7760458, 5565554, 2920048, 7348697, 1908832, 758977, 7851218, 6584745, 5318671, 992796, 3653043, 6659111, 4527057, 595830, 2707998, 4657398, 2054082, 692515, 3577784, 6355980, 2554996, 2530985, 1675947, 7109321, 5034422, 2771451, 6292098, 601358, 931391, 3400188, 7208107, 4702570, 3464873, 3500337, 6880386, 6686795, 7057403, 6010082, 150408, 6011018, 1263009, 1551712, 2248193, 1177138, 4274837, 5576282, 7330853], +[5053121, 7113161, 8075856, 4167528, 3962210, 5505083, 2796737, 4967776, 2306280, 5546792, 2245077, 1129294, 1964533, 3418665, 3511436, 8207089, 2810020, 4388346, 1411686, 4853493, 327938, 7637758, 7560222, 5238956, 1778815, 6129527, 6177635, 3452768, 5295532, 8021070, 1706652, 3739501, 3145917, 5839037, 5599134, 3081251, 2772458, 7977709, 5134985, 2507338, 2332534, 2569773, 331459, 3371897, 3221114, 195644, 550863, 1681486, 5059769, 586938, 1108857, 2900477, 4446757, 1539910, 6350051, 770954, 3570979, 2387478, 8096619, 2734668, 702551, 633689, 758025, 2364495, 3957274, 7406722, 2797219, 7029565, 7991452, 764245, 1595294, 7921833, 5991981, 8218968, 621124, 5737525, 4837685, 2455209, 4514442, 1936167, 5692592, 1221236, 2267334, 2687325, 2840651, 1515157, 1845797, 1897198, 4926292, 8030343, 7509627, 5246153, 3989494, 7241730, 3118087, 8072141, 6044673, 6523822, 7082361, 4111590, 3396837, 4113521, 7911901, 3201742, 5769722, 4130087, 4639559, 3675432, 7530660, 4855053, 354, 4501909, 6180067, 4897693, 8224838, 5167137, 7687644, 1235701, 5771096, 3404054, 5753519, 383198, 5872232, 1948807, 3083525, 8104652, 7284239, 4906245, 3128685, 4067292, 7122, 989376, 5573652, 5950796, 6945281, 384627, 7355365, 7757148, 2442962, 6667045, 4274814, 3372859, 3977532, 5931239, 4726461, 7746291, 5745573, 4316024, 7726951, 4981744, 785671, 4959451, 7653107, 22380, 1289175, 6403709, 7231033, 5463892, 8104869, 2541338, 2288040, 4057059, 4961008, 2100467, 2984322, 736030, 1218345, 6994080, 6189742, 4213330, 6738712, 1496909, 979234, 5239844, 5180599, 417385, 3791658, 3641082, 7989596, 1964599, 4986514, 3255786, 94642, 1903907, 6835331, 8070542, 6391182, 3542224, 303226, 176878, 2988048, 1091003, 4813143, 8064394, 6374449, 4394761, 6252684, 1880120, 8019341, 7308861, 7013053, 5352621, 1241279, 1037965, 2985476, 2925196, 4340053, 7102167, 6532306, 6852547, 4323909, 1563722, 586450, 5973773, 607003, 1126586, 6999294, 7335884, 1119994, 4818376, 6264692, 2748165, 2923740, 4301253, 3502805, 1676677, 6283617, 3642267, 1194169, 3132115, 7024173, 7611267, 59918, 3567656, 6098403, 5507452, 3061729, 1892859, 4402578, 6470247, 8127388, 3951037, 1482816, 2038659, 4254688, 7785673, 8213130, 7448512, 8240705, 8178839, 3350255, 8043978, 5109954, 361166, 6331899, 6456125]], +[[8083583, 3829710, 4605090, 5594754, 3627807, 5380754, 6806165, 770598, 3986640, 7635515, 5405099, 2939507, 6176056, 5874875, 3050712, 2456835, 6040581, 918818, 1541763, 3527058, 6747497, 6680706, 2784782, 5338300, 5859035, 7861767, 5226208, 3646731, 2218415, 6777641, 3231279, 8089193, 2178602, 7352675, 8063521, 165409, 441802, 3532451, 2613031, 5788169, 3006463, 6034609, 1001381, 958354, 1255337, 972768, 5808421, 1532766, 343788, 6756310, 1635683, 4670195, 5004542, 4592303, 5349095, 1285586, 3770574, 8052986, 6648749, 7563122, 3582203, 5071876, 627014, 1066212, 2783078, 7530243, 673350, 3415794, 2304320, 61299, 3550745, 4385362, 8288515, 7029031, 7135897, 4346516, 5589622, 3994416, 821603, 97113, 4581136, 1609172, 1347491, 4617698, 1082075, 2579610, 5386582, 6940164, 476513, 4322096, 6561422, 8219390, 4255989, 7812840, 5376072, 6698656, 5848557, 7902483, 5226871, 775683, 5307299, 5739756, 3050838, 5095521, 5621441, 6041779, 5805538, 6559790, 4189853, 5779003, 3049125, 7525742, 2320349, 1696816, 7920223, 5919733, 5017285, 553575, 131679, 4422676, 7164224, 2658873, 6089695, 6922988, 758027, 6510045, 8040002, 1381866, 5063180, 2601947, 4144146, 1374267, 8288919, 586314, 7441113, 1287378, 5462646, 5658937, 4284260, 4653572, 8063585, 6354293, 7593945, 5454366, 2611916, 510348, 2359458, 820976, 8337310, 3100210, 355101, 757901, 5283304, 7474986, 4096366, 5529677, 5709894, 664473, 6374713, 5533511, 344196, 8240797, 2338959, 5959194, 5611329, 4732139, 2457133, 154121, 1030519, 2167510, 1031979, 8372840, 4393587, 4484784, 6594928, 964770, 4985949, 4123609, 1239689, 4823883, 4774558, 633791, 5078423, 29259, 7245694, 657847, 6328017, 4870886, 785978, 2440597, 5421803, 6593890, 7548395, 1499676, 4214453, 2989860, 3499875, 3194605, 7561819, 2100019, 7946911, 4331233, 5556846, 5016598, 5370252, 7576719, 1403288, 5522006, 486574, 6818497, 552158, 1663226, 3611901, 8108953, 7371325, 2968884, 2397774, 1701035, 6544439, 2640284, 2792045, 3251781, 1735899, 7122846, 5466290, 4090216, 2994553, 3904379, 6057140, 2200799, 2631972, 3825961, 6981918, 4757714, 3856461, 6599790, 2294283, 1228402, 4193039, 8232376, 6341481, 7657431, 3676721, 7676424, 5424772, 1319610, 2013683, 3086216, 3689587, 7478360, 374908, 8180582, 5272359, 2284128, 903495, 5779499], +[5225355, 3636085, 6264034, 4804566, 1436962, 4576464, 7345998, 2774594, 1298527, 6241183, 6452112, 187476, 4626517, 6625557, 6117743, 6996883, 7546288, 1645702, 5143135, 5781126, 3313530, 6198350, 1071644, 1606743, 2030585, 2793394, 6437354, 6815069, 365786, 912402, 2807180, 2444846, 4207302, 5682515, 3324528, 250138, 2241677, 2778633, 8187203, 5125080, 3685097, 6842468, 237575, 8277760, 5985038, 2182313, 3513126, 1558495, 1690723, 984433, 3065390, 834325, 3900087, 1220339, 8027192, 7827501, 5712377, 2309316, 7618569, 4667917, 209111, 547671, 2990894, 3029875, 3840480, 6234876, 6480262, 1616142, 3134535, 3219630, 5903603, 7724765, 4615016, 5343619, 4522733, 5695734, 4291086, 911497, 3378050, 5356362, 5920416, 6821882, 1303450, 289612, 1555202, 1050374, 985790, 2737361, 5747509, 5535358, 3900404, 6544391, 5064737, 6671371, 3953175, 211361, 7527848, 6249726, 7148351, 7859904, 751071, 370454, 4613019, 2094402, 3571025, 1485717, 3892850, 1000587, 3278578, 5518440, 2984482, 1988260, 2351049, 5780817, 2929124, 6025521, 5084991, 2432110, 1449094, 5949310, 1807630, 7614877, 2703509, 4930137, 8302121, 747394, 2700056, 4536986, 3004349, 645733, 1288299, 7899319, 4109700, 4260048, 6648121, 6234741, 7985892, 5415175, 2044539, 489102, 1650901, 599336, 7307686, 6971641, 2703366, 2714248, 6999091, 4062573, 5545722, 2514055, 572633, 262522, 6472981, 265927, 2333781, 5041919, 1757128, 2481415, 3044811, 6589382, 3793092, 535524, 8186782, 4168229, 4318436, 5949493, 1084649, 5152536, 6411003, 5507716, 5974543, 4173381, 3423803, 5184262, 6028781, 3119267, 1283937, 4269048, 3859755, 586742, 312849, 2977024, 3898483, 4595251, 5801076, 2286770, 7623905, 1931066, 4964292, 3168799, 4770064, 28804, 7315918, 7671593, 4423708, 4057181, 2078662, 6503625, 1152746, 791986, 6442096, 4333331, 5487539, 7718371, 1605053, 6395432, 284042, 5604759, 5887185, 2682932, 230814, 1253929, 6667400, 58175, 1946573, 8362101, 4601871, 4184777, 6572308, 423782, 6737961, 800386, 5423496, 5877781, 6739683, 6528507, 4496177, 2531393, 8095426, 7580028, 5380411, 5751984, 1228410, 6040280, 5230298, 2296028, 6362081, 671020, 5034343, 3130863, 4908217, 2360897, 361744, 2833225, 335952, 6760196, 2544094, 4654514, 4339287, 216508, 4532246, 1377143, 5431824, 1775666, 5169329, 7061706], +[1465241, 4597311, 4033004, 7584645, 4594230, 4330242, 6022842, 5220659, 1647018, 7693321, 6223896, 8022657, 5312843, 5162426, 1117933, 5704909, 3493111, 2599624, 4480078, 3295852, 5624992, 4594863, 8230150, 974360, 8015534, 1995426, 1505614, 2589524, 6523951, 105287, 2469411, 5678031, 2781466, 672652, 3955923, 3139639, 1067095, 782352, 1266575, 8132925, 5250378, 475689, 2848663, 1913665, 3923580, 8007784, 836532, 6475242, 3831088, 5251180, 2549448, 4934936, 7247629, 7843280, 5784618, 8263811, 470896, 4553059, 8222955, 2275616, 5423534, 7309517, 7722118, 7437545, 3726263, 516684, 3556441, 122422, 4223007, 4526597, 8191165, 4952207, 6684892, 2832200, 2956491, 2754815, 6384374, 3919934, 3156562, 6215647, 3648719, 4165962, 1049908, 3191371, 2463831, 5021312, 7163765, 983969, 1359389, 2807336, 7439773, 2846933, 210226, 8149774, 1224069, 1900516, 4082063, 2663906, 6731764, 5006256, 4843786, 131139, 8271247, 411094, 2141873, 2355696, 6482312, 6826733, 2872902, 3860070, 3892877, 8149564, 4072039, 5062393, 8369491, 971439, 1355257, 8067320, 7536078, 3362841, 3945360, 7922609, 1038076, 4585186, 3835586, 5543012, 6313539, 226082, 4435081, 7352070, 2398569, 4482981, 8347431, 4711297, 3545174, 3952417, 3522452, 2721926, 1584094, 4567039, 7180922, 5968668, 170613, 5490782, 6119679, 6045696, 2205548, 3234941, 4903033, 1332410, 4235969, 3064915, 7897050, 7239215, 5369900, 6142596, 491818, 6707112, 3706937, 1255157, 2476220, 2893221, 6604928, 3139627, 1718334, 8313885, 6429985, 862562, 7612735, 748282, 7973838, 1279466, 4372463, 6621194, 2670786, 2233196, 4755001, 607504, 4944429, 1107232, 6199537, 1132528, 1155726, 3575983, 4717358, 481821, 2023359, 8243902, 3685018, 3121498, 2360585, 7742988, 7887096, 5218910, 6415040, 4448412, 7883474, 2480538, 900303, 2700253, 3998553, 3887133, 5620654, 156068, 8183022, 2015316, 4731305, 7852980, 1498502, 5796115, 8102492, 4636472, 2433034, 6167914, 7685033, 6093632, 3155651, 2892040, 2321847, 2887011, 2143816, 6791238, 2373275, 2685789, 3050458, 8245498, 4366677, 331700, 781321, 4332612, 6332567, 351154, 7260785, 6092982, 901299, 2942274, 7153861, 8323324, 4735868, 900965, 6039242, 5662516, 6090297, 926985, 8256193, 4086608, 1786977, 1185340, 4049740, 355908, 1897329, 3716753, 1180520, 2162734, 4781944, 2114859], +[8338083, 4172559, 2550928, 1858116, 1603331, 4131505, 2410053, 6945245, 898089, 3000517, 836782, 3521873, 334161, 4235527, 2384101, 1220958, 3847163, 7230856, 669901, 1440757, 151879, 4242253, 183867, 3910486, 4970837, 1623134, 2920090, 6959202, 1373651, 5985685, 2220843, 8133725, 3326927, 35825, 627425, 6193505, 848088, 6885358, 5019375, 6403478, 8117835, 3528005, 4492911, 542425, 6167725, 8252674, 727831, 78912, 2053472, 1324828, 3598492, 6634512, 2417142, 3252452, 1458450, 1726049, 6248714, 7476988, 1995347, 1881935, 6808933, 3156255, 278053, 5826239, 5483659, 687474, 7957086, 5692599, 697569, 5874222, 5427099, 5240244, 7630248, 4203622, 3959272, 6988683, 5388598, 1456552, 5082875, 1365122, 4007360, 3921703, 775627, 7806091, 7888629, 6044033, 7169982, 3780967, 6439875, 1443136, 2913909, 4218596, 7179240, 6260750, 3975141, 7419390, 53458, 3522404, 7994183, 6411437, 2748132, 6625626, 4463553, 4256789, 6310680, 2080141, 4510977, 5855328, 539537, 7967406, 7562182, 335787, 5357214, 92049, 7763723, 2267335, 6296010, 2065654, 5704841, 469102, 3763995, 6398911, 8308380, 3362687, 493320, 3950692, 7590853, 1475516, 5875077, 201774, 599891, 139368, 6305444, 4973939, 3295421, 5608627, 4844526, 558116, 814564, 5061749, 7036311, 6634378, 6733961, 5951848, 2733103, 7588816, 1483859, 6325051, 629433, 5730649, 1661245, 3269145, 6314505, 7404969, 7470313, 3667537, 6484873, 4631831, 4022979, 3852366, 3714167, 266257, 4257440, 6515045, 3016602, 745014, 3524800, 2042961, 6722723, 2354629, 4610120, 721354, 35727, 4639915, 233090, 106241, 8145968, 2081586, 1242429, 5783828, 2802750, 4415986, 2120175, 2233461, 726528, 579024, 6849259, 6805860, 1395524, 5037239, 6193815, 476449, 7572016, 896779, 3236923, 7696116, 6898251, 7520417, 3135474, 7859088, 948642, 6983885, 1435791, 1269996, 7579894, 548325, 6984424, 3161041, 2899221, 3872096, 2380664, 1524458, 5454790, 596129, 8274749, 106451, 4595248, 4632249, 5470993, 5115659, 3764016, 1003334, 6488856, 1609339, 5511444, 6790866, 2251480, 6037630, 4582999, 2981359, 1126406, 6562051, 3842385, 1514483, 8035349, 2185048, 3455701, 2143171, 2545005, 5569422, 3811652, 2453715, 495237, 3994722, 547936, 6535376, 5207309, 3263934, 1362044, 3582116, 4124308, 7761829, 8226121, 6060326, 3498777, 6463985]]] +s1: [[-2, -1, 1, 2, -2, -1, 2, 2, -1, 1, 1, 0, -2, 2, 0, 2, -2, 0, 2, 2, -1, 2, -1, 2, 0, -2, -2, 0, 0, -2, 2, -2, 2, -2, 1, 1, -2, 0, -2, -1, 0, 1, 0, 2, -2, -2, 2, -1, -2, 1, -2, 0, 0, 0, 2, 0, -1, 1, 0, -2, -1, 0, -2, 2, -1, -2, 1, 2, 2, 2, 1, -1, 0, 2, 2, 0, 2, -1, -1, -2, 2, 2, -1, 2, -2, -1, -2, -1, -1, -2, -2, 1, -2, 2, -1, 0, -2, 1, 2, 2, 2, -1, 1, 2, -1, -2, -2, 1, 0, 2, -2, 2, -1, -1, -2, 0, 0, 1, -1, 0, 2, -2, -1, 2, 2, -1, -2, 0, -1, 1, -1, -2, 1, 2, 1, 0, 2, 2, -2, -2, 2, 2, -2, 2, 2, 1, 2, 0, 1, -1, 0, 1, 2, 0, -2, -1, -2, 2, 0, 1, 0, 0, 2, 2, 1, -1, 0, 1, -2, -2, -2, 0, 1, -1, 1, -1, 0, -2, -2, -2, 0, -2, -2, -1, 2, -2, -2, -1, 1, 0, 2, 1, -2, 1, 2, 0, 0, -2, 1, 1, 1, -1, 0, 0, 2, -2, 1, -1, 1, -2, 1, 1, 2, 0, 2, 1, 2, 2, 2, 2, 0, 2, 0, -2, 0, -1, -1, 1, 1, 1, -1, -1, -2, 1, 1, -1, 0, 2, 1, -1, -2, -2, -1, -2, -1, -2, 2, 1, -2, -2, 0, 0, 1, -2, 1, -2], +[1, 1, 0, 0, 0, 2, 0, 0, 1, 1, 2, 0, -1, -1, 0, 0, -1, 1, 1, 0, 2, -1, -1, 0, 0, 0, 2, 1, -2, 2, -2, -1, 1, -2, -1, 1, -1, 2, 2, -2, -2, -2, 2, 1, 1, 1, -2, 1, 1, 1, 2, 1, 0, 2, 0, -2, -2, 0, 1, -2, 0, -1, 0, 0, 1, 2, -1, -2, -2, -2, 2, 0, 2, 1, 0, -1, 0, 0, 0, 2, -2, 0, 0, -1, 1, -2, 1, -2, 2, 2, -1, 2, 1, 0, 0, 0, 2, 0, 2, -2, -1, -1, 2, 0, 1, 2, 2, 1, 0, 0, 1, 1, -2, 2, -2, -1, 1, -1, 0, 1, 1, 0, 2, 1, -1, 1, -1, -2, 0, -2, -1, 2, 0, 2, -1, 1, -1, 2, 0, 0, 1, -2, -1, -2, -1, 1, -2, -1, 0, 1, 2, 1, 2, -1, 1, 1, -2, -1, 0, 2, 1, -1, -1, 0, 2, 1, -1, -2, -1, 1, -1, 1, 1, 0, -2, -2, -2, -2, 2, 0, -2, 1, 1, 0, 0, 0, -1, 1, -1, -2, 2, 2, -2, -2, 1, 2, 2, 0, -1, 1, -1, 1, -1, 0, -1, 1, 0, 2, -2, 0, -1, -1, -2, -1, 2, 2, 1, -2, 2, -1, -2, -2, 0, 0, -2, 0, -1, 2, -1, 2, -2, 2, 1, -1, 2, 0, 2, -2, 2, 0, -1, 1, 2, 0, -2, 0, -1, 0, -2, 0, 2, -1, -1, 1, 0, -2], +[0, -1, -2, 0, 2, -1, 1, -1, -2, -1, 1, -2, 2, 2, 0, 2, -1, -1, 1, -2, 0, 0, 2, 0, 0, 0, 2, -2, 2, 2, -1, 2, 2, 0, 2, 0, -1, 1, 0, -2, -1, -2, 1, 1, 0, -1, -1, -1, 0, 2, 0, -2, -1, 0, -1, 0, 1, -1, -1, 0, 2, -2, 2, 1, 1, -2, -2, 2, -2, 0, -1, 1, -2, -2, 0, 1, 0, 1, -2, -2, -2, 2, 0, -1, -2, -1, -1, 1, 0, 1, 2, 1, 0, -2, -1, -2, 0, 2, 1, 2, -2, 1, 2, 2, 0, 0, -2, 0, -1, 2, 1, 1, -1, -1, -1, 0, -2, 2, 1, -2, -1, -2, -2, 2, -2, 1, 0, 2, 1, -1, -2, -1, 1, 1, 2, 0, 0, -1, 2, 1, -2, 1, -2, 0, 2, 0, 0, 0, -1, -1, 1, -1, 1, 0, -1, 1, 1, -1, 2, 0, 2, 2, 1, 2, -1, -2, -2, 2, 2, -1, -1, 1, 1, 1, 0, 1, -2, 0, 2, 1, -1, 2, 1, -2, 1, -1, 0, -2, 1, -2, -1, -2, 0, 1, 0, 1, 1, -1, 1, -2, 0, -1, -2, 0, 1, 2, -2, -2, -1, -2, 1, 1, -2, -2, -2, -2, 2, -2, -1, -2, 0, -2, 0, 1, -1, 2, 1, 2, 0, 2, -1, -2, 2, -2, -2, -2, -2, 2, 0, -2, 2, 0, -2, 1, 2, 1, 1, -2, 0, -1, 2, 0, 1, 0, -1, 0], +[0, -2, 2, 2, 2, -2, 2, 0, 1, 1, -2, -2, 2, 2, -1, -1, -2, 1, 1, -2, -2, 0, -2, -1, 1, -2, 1, -1, 2, -1, 2, -1, 0, -2, -2, 2, 0, 2, 1, 2, 1, -2, 0, 2, -2, -1, -1, 1, 0, 2, 1, -2, -2, 0, 1, 0, -2, -2, 1, -2, -2, 2, 1, -2, 2, -2, 2, 1, 2, -1, -1, -1, 2, 2, 0, 2, 0, 2, 1, -1, -2, 2, -2, -2, -1, 2, 2, 2, 0, -2, -1, 2, -1, 2, -1, -1, -1, 0, -2, -2, 2, 1, 0, 0, 2, -2, -1, 2, 2, -1, 0, 1, 2, 2, 0, -1, 1, -2, -1, 2, 2, 1, 2, 2, -1, -2, 2, 0, 0, 1, 2, 2, 1, 2, 1, 0, 0, 2, 2, -2, -2, 2, 0, -2, -1, -2, 0, 1, 1, 2, 1, 1, -1, 0, 0, 1, 0, -1, -1, -2, 2, 1, -1, 1, -2, 0, -1, 2, -2, 2, -2, 1, -2, 0, 1, -2, 1, 2, 2, 2, 0, -2, -2, -1, 0, 0, 0, -2, -1, 2, -2, 2, -2, 0, -2, 2, -1, 1, 2, -1, 1, 1, 0, -1, 2, 2, -1, 2, 2, -2, 1, 1, -1, 2, -2, 1, -2, 1, -1, 1, 0, -2, 0, 1, 2, -2, 0, 2, -2, -1, 1, -1, 2, 2, -2, -1, -2, -2, 2, 0, -2, 1, 2, 2, 2, 1, 2, 0, 2, 0, -2, 1, -1, 0, -2, 1]] +s2: [[1, 1, -1, 0, 1, -1, 2, -2, 1, 0, 0, 1, -2, -1, 2, -1, 2, 1, 1, 0, 2, 1, -1, -1, 0, 2, -2, 0, 2, 2, 2, -2, -2, -2, -1, -2, 2, -1, -1, -1, 2, 2, 0, -1, -1, 2, 2, 1, -2, 1, 0, 2, -1, -1, 0, -1, 1, -1, -1, 2, 1, 2, -1, 0, 2, 0, 2, -1, 2, -2, 2, -1, 2, -1, 1, 0, 0, -2, 0, 1, 2, 1, 1, 0, -1, 2, 1, 0, -2, 2, 1, 2, -1, 2, 2, 0, -1, 2, 2, -1, 1, -2, -2, 2, 0, -1, 1, 2, 1, 1, 1, -1, -1, -1, 0, -1, -2, 0, -2, -2, 2, 2, 1, 2, 2, 1, 2, -1, 2, -2, 0, -1, 2, 2, -2, -2, -2, 1, -1, 0, 2, 2, 0, 2, 0, -1, 0, -1, 2, -1, 1, 1, -1, -2, 1, -1, -1, 2, 0, -2, -2, 1, 0, 1, -2, -2, 1, -1, 0, 2, -2, -2, 2, -1, 1, -1, 0, 0, -1, 0, -1, 2, 2, -1, 2, -2, 1, -2, -1, 1, 2, 2, 0, 2, 2, 0, -1, -2, -2, 2, 2, -2, -2, -2, 2, 0, -1, 2, -2, 1, 2, 2, 1, -2, 2, 2, 1, -1, 2, -1, -1, 0, -2, 1, 0, 0, 1, 1, 0, 1, 2, 0, -1, 0, 0, -2, -2, -2, -1, -2, 0, 0, -1, -1, -1, -1, 2, 2, 0, -2, -1, -2, -2, 1, 2, 1], +[2, 0, 1, 1, 2, -1, 0, 0, -1, 1, -1, 0, -2, 0, -1, 2, 2, 1, 0, -2, 2, -1, -1, 1, 2, -2, 1, -2, 1, 0, 0, 2, -2, -2, 0, -2, 1, -1, 0, -1, 0, -2, 1, 0, -1, -1, 2, -1, -2, 0, -1, 2, -2, 1, 2, -1, -2, 2, -1, 2, 0, 0, 0, -1, -1, 0, 1, 2, -2, 2, -1, -2, 2, -2, 2, 0, 2, -2, 2, 1, -2, 0, 0, 1, 2, -1, 0, 2, 0, -1, 1, 2, 0, -1, -1, 0, 1, 2, 0, -1, -1, 0, 1, 0, -1, -1, -1, 2, 1, -2, -1, -1, -1, -2, 2, 1, 2, -1, -1, 0, -2, 0, -2, 0, -2, 0, 2, 0, 2, -2, 2, -1, -1, 2, 2, -2, 2, 0, -2, 1, 1, -2, -1, 2, 0, -1, -2, 2, 2, 0, 2, -2, 1, 1, 2, 2, -2, 1, -2, 2, 0, -2, 0, -2, 2, 2, -1, 2, 0, 0, -1, 1, 2, -1, -1, 2, -1, 1, 2, 1, 2, 2, 2, 2, 1, 1, -2, 1, 2, -2, -2, 0, -1, -1, -1, 1, -1, 0, 1, -1, -1, 0, -1, -1, 0, 0, -1, -2, -2, 2, -1, -1, 1, -2, 2, 0, 2, 2, -2, -2, 1, 0, 2, -1, 2, -1, 2, 1, 2, 1, -2, 1, 1, 2, -1, -2, -2, 1, -2, -1, -2, -2, 0, 0, 0, -1, -1, -1, 1, -1, -1, -2, 0, -1, -2, 0], +[0, -2, -1, -2, 1, 2, 1, 2, 0, -2, 1, 2, 1, -2, -1, -2, 0, -2, 1, 0, 0, 0, -1, 2, 0, -1, 0, -2, -2, -1, 1, 2, 0, 1, -1, 1, 2, 0, 1, -1, 0, 0, 1, -2, 1, -1, -1, -1, 1, 0, 1, -1, 1, 1, 2, 1, 2, -1, 1, 2, 0, 2, -2, 2, 0, 1, 1, 1, -1, -1, -1, -1, -2, 0, -2, 1, 1, -1, 2, 2, 1, -1, -1, -1, 0, 2, -1, 0, -2, 1, -2, -2, -2, 0, 1, 2, 0, 0, 1, 2, -2, 0, -2, -1, 0, 2, 1, -1, 0, 2, 2, -1, -2, 0, -1, 0, 0, 1, -1, 2, -1, -1, -1, 0, 2, 1, -1, 0, -2, 1, -1, -1, -1, -1, 2, 1, -2, -1, 1, -1, -1, 0, -2, -1, -2, 1, 2, 2, 0, 0, 2, -2, 1, -1, 1, -1, 2, 2, -1, 2, -2, -1, 0, -2, 1, 1, 0, -1, 1, 1, 1, 2, 2, 1, 2, -2, -1, 2, -1, -1, 0, 0, 0, 0, -1, 0, -2, -2, 2, -1, -1, 0, 0, -1, 2, 1, -2, -1, 2, -1, 0, 0, -2, -1, -2, 1, -2, -1, 2, 0, -2, -1, -2, -1, -2, 1, -1, 0, 2, 2, 1, 0, -1, -2, 0, 1, 1, -2, 2, 0, 0, 1, -1, 2, 2, -1, -1, -1, -2, 0, 2, 0, 1, 0, -1, 1, -2, -2, 2, -2, 1, 1, -1, -2, 2, -1], +[1, 2, 1, 1, 1, -1, -2, 0, 2, 1, -1, 2, -1, 1, 0, -2, 2, 1, -1, -2, -1, 0, -1, -2, 2, -1, -1, -1, -1, 2, -1, 1, 0, 1, 1, 1, 1, 2, -1, -1, 0, -2, 1, 2, -1, 0, 1, 1, 2, -1, 0, -2, 0, 1, 0, 2, 0, 1, 0, -2, -2, 0, 0, -2, -2, -1, 0, 0, 1, 1, -2, -2, -2, 2, -2, 2, 2, -2, 1, 2, 0, 0, 0, -2, -1, 2, 2, 0, -1, -1, -2, 0, 1, 2, 1, -1, 0, -2, -1, 2, 0, -1, -1, 1, 2, 1, -1, 0, 1, 1, -2, -2, 1, 2, 1, 1, 2, 1, 2, -1, -2, -2, 2, 1, 0, 1, -2, -1, -1, 0, 0, 2, 0, -2, 1, 2, 1, 0, 2, 2, 1, 0, 1, 2, 2, 1, -1, 1, 0, 2, 0, 0, 1, 1, -1, -2, 1, 1, -1, -2, 2, 2, 0, 0, 2, 0, 2, 1, -2, -1, 0, -2, 1, -1, 0, -2, 0, -1, -2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 0, -1, -2, 2, 0, 0, 2, 1, -2, -2, 0, -1, -1, 2, 2, -2, -1, 0, 0, -1, -2, 0, 0, 0, 0, -2, -2, 0, 0, 1, 0, 2, 1, 0, -2, -1, -2, 0, 2, 0, 0, 1, 1, 1, -2, 1, -1, 2, 0, 0, 0, -1, -1, 0, -2, 1, 1, -1, -1, 1, -2, 1, 0, -2, 2, 2, 2, 1]] + +s1Hat: [[6579390, 3234202, 5760413, 813693, 7870206, 2714807, 5107675, 3985485, 7446642, 7802351, 141, 5569695, 7400683, 4456408, 3517152, 6601894, 3332893, 55620, 1169651, 3111757, 661012, 3610743, 5046516, 8072167, 508778, 1766524, 3229308, 7203161, 5380902, 5188330, 8055823, 8128169, 2817872, 4107211, 6367648, 1695164, 3786392, 7225557, 2553668, 3778664, 3699611, 2182416, 1488561, 1267703, 2951877, 5445089, 5654853, 3346216, 7966369, 4377444, 4951861, 2854808, 1524437, 2942619, 769466, 8189886, 7518358, 2016270, 5304549, 3962640, 1244803, 3496148, 5890731, 4006497, 1365117, 6765135, 1399066, 6950605, 2254178, 5327227, 1610130, 7482656, 6639515, 2134671, 2797987, 6708377, 6680920, 4251072, 4497451, 5756808, 8198722, 3326241, 2240860, 4774795, 7008524, 1969453, 3244854, 2750638, 615380, 3885211, 2353675, 6259422, 115442, 4047902, 1485587, 3101808, 5447822, 510632, 2875594, 2764403, 6359926, 1687163, 3176520, 3837004, 4684471, 6679118, 2584327, 2707017, 1122616, 2622865, 7477253, 6434841, 316700, 6947181, 5276845, 8094036, 2224801, 7817467, 5605892, 1763986, 3830369, 6956190, 353481, 1890521, 3620122, 3021081, 1625346, 7205026, 479943, 7254439, 5334505, 4432845, 133218, 8280893, 4460942, 5355173, 5201069, 6857548, 5066208, 6695302, 4226067, 6816327, 8017334, 2752344, 2789281, 3741958, 2516782, 4752862, 6615384, 7622555, 7469261, 604980, 4280277, 4441746, 2759765, 3427063, 6198445, 577872, 7309699, 2421732, 6829873, 7333638, 3082152, 1042274, 4995667, 3153414, 6296691, 7254489, 3687149, 1384177, 7562126, 5827974, 5957043, 776181, 1871817, 5008466, 8313612, 207994, 4059440, 2762107, 2498073, 6211891, 8304285, 3440601, 1958798, 3410905, 4407271, 4105466, 6554661, 948386, 7565578, 3238770, 5348055, 7700742, 7187028, 2827373, 151723, 6734005, 7529760, 6296162, 7599625, 6523851, 6962820, 5963896, 3489862, 7535357, 2821382, 6868118, 6533303, 358286, 4783166, 3532648, 483862, 8195643, 530865, 530010, 6475981, 1220411, 3387939, 2317848, 4660787, 5956734, 5516147, 5275866, 3800910, 2769699, 1025042, 363223, 3720915, 3290599, 6615991, 4046541, 4965397, 5544664, 7874159, 4782981, 7285488, 6243171, 7479862, 1387929, 3612500, 7789, 1361188, 4537444, 7636644, 7325338, 6619043, 2144286, 4684364, 6645684, 5392547, 1741394, 8129123, 226488, 5008522, 5413940], +[1777819, 261206, 3793527, 4091808, 8075935, 8319015, 1591393, 6418054, 2659780, 5318519, 4711574, 7434797, 1779310, 4891453, 7850950, 3606500, 6953358, 6567997, 4000959, 7793710, 4221931, 5061350, 397144, 5848952, 3992205, 1048912, 4906375, 378078, 3154532, 1986180, 7351667, 4901240, 3831291, 4457571, 6756994, 1184063, 3326351, 4545355, 4573799, 3066837, 954002, 3777153, 5416138, 560161, 1271638, 8296968, 8337038, 357740, 5201860, 3635609, 3710042, 2129489, 1054585, 6441249, 4897927, 4789549, 4284817, 2916227, 1613838, 5350683, 8105129, 1691146, 7230283, 5818923, 4504536, 3505099, 4763339, 3969503, 4601754, 7943124, 1541811, 3579580, 7752585, 2569266, 5582802, 527110, 7800025, 5999933, 5240212, 5489096, 7594664, 7892749, 8339295, 5813455, 3072485, 7500889, 7715052, 7741685, 8267641, 7721448, 1735362, 1622116, 5012310, 1114293, 3617880, 7751481, 4984741, 8362961, 8242480, 563139, 6356273, 3369936, 7860188, 3586347, 4160032, 2128411, 993930, 5868301, 4374049, 4493726, 3675523, 5208597, 500897, 1927534, 17145, 7977174, 3097861, 7217438, 2679712, 2017426, 3086931, 655663, 528636, 1408453, 1294053, 5674646, 5398960, 5163639, 986231, 2039018, 1665291, 1650164, 1775820, 3584220, 8228266, 4275387, 8376284, 3306274, 4239049, 5424552, 2016017, 8076321, 2975703, 6824058, 1910491, 1124358, 3025053, 5992539, 1357374, 462145, 1840035, 4980580, 7455912, 5685185, 1702221, 8368335, 4576883, 1191289, 6631773, 6393827, 7108068, 3102656, 8373950, 5339894, 5952018, 5288816, 7239649, 884244, 1918455, 7996127, 1109648, 748377, 8347152, 2749158, 4184314, 5981177, 5859752, 2878076, 350219, 8068589, 1192939, 3845527, 4450823, 2034780, 8104147, 3755756, 2267333, 4524780, 1571126, 1694039, 8363207, 6519186, 7655560, 6368507, 942539, 701445, 8328360, 2621252, 6380467, 1773815, 4647469, 7060147, 2475923, 5462960, 673272, 8065209, 7207180, 8141424, 4010569, 7737861, 2053448, 1531535, 6497567, 4615341, 6442307, 6618443, 3931807, 6783312, 4285425, 7932012, 704918, 5667957, 5924372, 2508599, 6041736, 8352639, 4105086, 6574689, 1452132, 5917986, 8142073, 2760529, 850421, 3689343, 8186586, 8048995, 1471403, 5766166, 3416432, 2975963, 320464, 4671906, 3361886, 7147872, 7119040, 5278942, 1999948, 7805974, 2554862, 3228850, 8071247, 1968259, 3206951, 322650, 1346000, 8015815], +[4210846, 2632563, 1462415, 7922880, 6998343, 2905191, 1706001, 4830423, 8168731, 3073535, 1021728, 3391631, 7847474, 4202026, 5017409, 7715663, 2190774, 5789630, 7632613, 5260264, 1633572, 529986, 608417, 8053588, 532671, 6341917, 4739054, 6284372, 1184604, 2616586, 3822612, 7873299, 646484, 7485308, 3096700, 1341094, 3897162, 5977822, 1946230, 3799171, 3531553, 5262057, 7105025, 3129309, 6592650, 2306241, 703288, 5501454, 835221, 7286058, 6447395, 3701317, 3151883, 2102688, 2508019, 7419072, 5493830, 1167334, 1092113, 3500870, 3199898, 4500193, 6206158, 4654671, 2452867, 7047682, 3713394, 6729779, 5595074, 4300514, 2830220, 7825357, 7184511, 6656569, 5961395, 6398149, 4773990, 7053708, 7043945, 6610263, 5903516, 6427273, 6673380, 7331906, 1636264, 6439231, 2630090, 7437495, 1562711, 310978, 1336264, 2638743, 5523535, 6157256, 7228206, 1327784, 1408589, 5639984, 6398948, 8303172, 4163198, 1214819, 3159419, 3323112, 4236011, 7365422, 6119754, 4188613, 4599034, 6750659, 3963885, 5566213, 8032890, 6705399, 1627261, 5596707, 3369915, 5894168, 2791646, 1627712, 1928989, 1502498, 5092528, 4574107, 3515054, 44637, 6225401, 3705451, 7480701, 231684, 4837474, 5812809, 2796129, 8039178, 664757, 3239434, 6586534, 987181, 6771301, 2467911, 4762599, 7331833, 6791249, 2606543, 7950095, 4317319, 1794048, 4433576, 3004013, 1509470, 1368933, 1958976, 5074369, 3782457, 4963484, 7512407, 3721208, 7607113, 2600686, 4771850, 2823703, 7125126, 4071644, 7407005, 2263430, 1577937, 7525562, 5420729, 7286064, 3091365, 7040038, 4160447, 2360769, 306859, 1151146, 1258695, 3356637, 2098003, 7806531, 4546081, 1668275, 3113968, 4031587, 5727394, 3696996, 2662191, 4385469, 3954235, 721299, 5064616, 3575042, 792515, 4023773, 2500093, 5024093, 5251714, 5430853, 596123, 5448558, 3740167, 7085660, 5646570, 1203098, 5191110, 12283, 1670591, 4431962, 1940154, 3757822, 3792108, 8049016, 157827, 7015364, 4443649, 1424391, 5721124, 7951897, 4784997, 7607976, 7639798, 180896, 7068729, 5579847, 8345891, 482938, 3243912, 4119032, 4044079, 6152105, 2165999, 2815576, 183984, 5700573, 3634357, 3299126, 2604516, 3167438, 4552953, 4797131, 4094544, 781367, 7323094, 3957716, 2837595, 6475888, 7772725, 5367157, 1766678, 5557409, 5642029, 5016057, 4739958, 1199913, 2649352, 81630, 5494236], +[3403971, 3716226, 2350306, 311129, 1392253, 5521860, 2432006, 1589053, 715014, 3344243, 3872748, 7139941, 933479, 6536172, 7059154, 659654, 2372053, 4631029, 4706989, 7191318, 1581026, 4093836, 7906106, 5822701, 5474901, 4682649, 5793945, 6341552, 3592866, 999973, 6911492, 7414933, 4699049, 4135185, 7754957, 2214785, 1559232, 3498898, 3223528, 7804173, 6564043, 3416337, 2098231, 6460717, 2190718, 6870293, 6812863, 5429070, 4485814, 7931908, 3885564, 108673, 1333436, 1100374, 5389416, 2634959, 5493555, 820519, 2891908, 1215297, 8022625, 1052319, 8171684, 552251, 7707606, 1301876, 6613266, 108202, 1546325, 5542902, 3616405, 7398941, 5102734, 7106617, 7709406, 3440500, 82263, 1292286, 8355094, 1426041, 2537192, 1386053, 3967622, 4540861, 189623, 6028704, 194583, 3262408, 3843705, 3891321, 5966332, 8084755, 3846192, 957106, 3563402, 6525384, 8007749, 1571876, 506995, 4751162, 5546215, 5030703, 6822558, 8225476, 6039693, 2691985, 831000, 1768135, 5792236, 3720218, 4965142, 7702380, 7865283, 4344721, 2659363, 5188879, 1845034, 2325646, 2849999, 6341118, 8228912, 473604, 5958848, 7481882, 6382303, 5301092, 8072043, 7982189, 2011207, 2662834, 3994474, 5733637, 7370637, 5457818, 4896232, 3044205, 6394406, 2637125, 8137749, 7103744, 2410412, 4912777, 7236253, 1906101, 5867038, 7430061, 3496728, 2361595, 7162981, 4688635, 4663715, 564460, 4319560, 5497315, 1131778, 8357520, 4449396, 2887298, 5176808, 8310409, 2103164, 5355198, 1314192, 1333922, 7627092, 5035248, 4012636, 82094, 6160396, 5238502, 521834, 6169832, 3956039, 7990750, 6823038, 4384273, 6076013, 149552, 7859758, 5081836, 5979316, 2886707, 801491, 2408061, 7621040, 4394426, 7992912, 3311222, 8236976, 3604812, 188568, 5814755, 5208294, 1542434, 5748310, 752834, 8157781, 6609789, 3230371, 6825820, 1260726, 4232643, 4673970, 5749046, 2579455, 3582036, 8027541, 8287944, 1039528, 1224694, 1979993, 2949218, 4343295, 8210997, 4443771, 7371963, 6881009, 7204172, 786485, 5167849, 4383249, 6365828, 3655991, 4768139, 5331403, 6054675, 5379218, 1061808, 8204951, 2653330, 2084986, 7376605, 7412925, 2070061, 5789716, 5533405, 81429, 4396569, 145151, 7694275, 2416267, 8061887, 1917003, 6986799, 4689104, 3481676, 3602354, 5285944, 2626294, 273894, 2469254, 4502811, 7324319, 3572447, 6555545, 3176930]] +aHat * s1Hat: [[7173756, 4463163, 7813712, 8016531, 3997849, 5162484, 7557753, 5209556, 2455766, 1538558, 5954781, 7567856, 8230327, 5889153, 3360342, 1138821, 181145, 4804369, 2808142, 6333266, 3085444, 975796, 4574536, 4489251, 7527120, 373153, 6008302, 3141197, 5608805, 1043230, 6743931, 7811993, 2682956, 7739834, 1864028, 8157075, 7576707, 6020957, 4683726, 4124676, 3516847, 7815986, 6043031, 4976847, 7787749, 4890002, 4952002, 5665440, 3298602, 3234377, 2526698, 7786455, 4379810, 6237612, 5889381, 438607, 5181618, 8248510, 7193304, 284918, 5432635, 6790412, 1785156, 979070, 2110597, 5818966, 5731551, 1443433, 3178894, 5535253, 2533321, 7778379, 734983, 6045692, 3407963, 5523841, 7632620, 4660511, 3948421, 7212453, 197434, 2447231, 6133534, 6773050, 2921294, 1314805, 3206488, 7654354, 2743508, 525315, 3367701, 3644062, 7975859, 8219225, 7416907, 6990697, 5651960, 488369, 5698785, 5470582, 7900704, 3279218, 8207650, 1711549, 3499379, 3039621, 2778722, 5563946, 7790020, 1870085, 1164406, 2827076, 2867556, 4381889, 6198274, 1772562, 7624864, 944102, 1748708, 5659987, 2141930, 6742563, 1955877, 1204357, 8205041, 8075370, 1935743, 2298664, 7158458, 5419090, 1793717, 2319608, 1676958, 640214, 7702535, 5080581, 6921654, 5411094, 2731479, 6296734, 2241471, 6689308, 2734852, 5753792, 7597455, 4257683, 8299793, 7898875, 6612590, 6782606, 5765883, 4301433, 396655, 5048539, 6595430, 4514167, 5033687, 3948416, 8371884, 6133585, 206517, 6977786, 6656907, 3595264, 2618658, 2317087, 5278380, 1140711, 2270649, 1226621, 6504948, 2982810, 1220884, 1169248, 6804380, 8061390, 7130391, 5698609, 2917631, 4870488, 6771651, 3577087, 6419000, 4287419, 7677836, 2991718, 8123281, 3751452, 5559827, 4206879, 881391, 721806, 3269284, 5465012, 2415071, 3086890, 7190174, 934025, 5558825, 6805457, 2741958, 7618748, 4167520, 6510915, 4531194, 7138987, 5934426, 1742549, 1332316, 1337852, 3945028, 3764133, 7030001, 4200351, 3566501, 4869468, 2122174, 4769298, 5510392, 4719401, 4119965, 7931459, 2547042, 2698259, 1686597, 5183322, 2135077, 3308862, 5645462, 6666154, 878250, 4181880, 3137050, 6609634, 6287614, 4251094, 412379, 7912804, 636015, 7767796, 8105857, 7760035, 1182664, 1425300, 738558, 6601834, 2923470, 1793608, 7209242, 4842600, 1424066, 3339528, 2894985, 1610136, 844885, 6974182], +[5284259, 3885376, 1368620, 132205, 6879018, 685232, 7336444, 6249654, 2777641, 2709738, 3850162, 6826710, 7020678, 3892065, 1694446, 5674450, 1387712, 2742244, 6830513, 6694116, 6449419, 2587617, 2862001, 6993137, 4993423, 5191364, 7871548, 1709781, 2499282, 7094064, 1931730, 6612107, 2422206, 4544859, 4097710, 1240405, 7819296, 5039980, 8273103, 4328835, 1384560, 4612419, 2927531, 7678616, 8042905, 5540072, 1813238, 3336605, 4485892, 234744, 6326804, 1428110, 2868336, 5252129, 4692503, 247667, 6029092, 4569463, 6940634, 6316079, 2357833, 2961166, 7044263, 4193375, 4323430, 721207, 3520689, 1983955, 6486585, 7428184, 3490782, 6402040, 5632770, 6052599, 2392897, 1843030, 54600, 3452802, 7592889, 4348669, 232870, 4936540, 4505370, 1226226, 6846259, 7978702, 7135420, 725085, 7279340, 4022518, 3580894, 4490629, 1188006, 3023546, 271963, 3958021, 2967085, 1742538, 7974138, 7813494, 5216320, 5045473, 7171949, 573799, 3868474, 4120761, 5561968, 4568926, 4356697, 50391, 1335694, 3010752, 667170, 5893837, 6747946, 6922841, 7679909, 1321817, 7249114, 6803703, 563728, 836610, 6687639, 1078442, 3031955, 2398308, 6014605, 3793995, 7182934, 3740413, 4977967, 3183907, 4697706, 1047560, 115947, 6275570, 7108168, 564545, 6037497, 4249495, 7181731, 1594144, 831004, 2844727, 1341690, 3763207, 6734110, 2142665, 5937723, 1523678, 6661419, 4110393, 4661110, 153775, 1831294, 5661523, 1088074, 2438553, 6436489, 6493131, 3980503, 1974865, 1911800, 3898070, 2982239, 4955344, 1456388, 5514401, 7899861, 6006142, 1950111, 564686, 628696, 6747763, 2409809, 6766205, 2027279, 1335548, 8044860, 8065642, 6284116, 1143350, 110906, 4901667, 3969739, 213428, 7850848, 2112202, 5132388, 7398187, 2008037, 7419596, 6646869, 164900, 5250517, 670605, 2517637, 8028184, 3241948, 579951, 6574635, 2821707, 5273368, 4471160, 5262380, 2862328, 7371545, 66487, 998449, 707717, 5349877, 7761980, 154147, 1284556, 544310, 3384496, 1831031, 8215913, 5332844, 6501612, 5650853, 7986074, 6023911, 6769778, 6845814, 2590542, 227588, 186742, 2906736, 7021328, 7209266, 1348916, 2895486, 6323851, 2874799, 944544, 547546, 3445958, 4927316, 2244703, 7666869, 2341454, 4783335, 4187707, 265376, 3081431, 2958912, 4404846, 808479, 8208562, 7357641, 149446, 3011179, 3815373, 1152471, 290835], +[1828613, 8016403, 5983422, 6981535, 5591372, 3243001, 2083753, 755060, 6994817, 236727, 7259592, 3082803, 4788195, 4417006, 127649, 6622423, 6290244, 204714, 7692701, 2433055, 4616518, 5542513, 702763, 2369015, 1262351, 6082768, 1317834, 5632989, 4369493, 3633054, 1865683, 448730, 3995611, 1978094, 8255725, 5443626, 3335714, 5228716, 1276548, 2525005, 3539778, 7339034, 8229561, 1188959, 5295636, 8359844, 3999191, 2844072, 5623737, 2324931, 7118387, 3690742, 480546, 4860952, 2229159, 129017, 6579449, 1161086, 6914990, 5310637, 2802356, 6893936, 3082578, 503004, 7517607, 8327600, 4659301, 6434554, 7161961, 6699552, 8244848, 3453018, 8173438, 5602359, 6184039, 4861973, 4920905, 458434, 5951104, 6301117, 212785, 4307324, 9935, 5856350, 7887116, 5068732, 6670294, 8076921, 6039646, 5771485, 2840701, 2662546, 5732224, 4991429, 2569381, 2240628, 6488656, 910312, 2811854, 5059180, 7212233, 6272578, 5039645, 7812602, 2913486, 5308512, 1844973, 1583306, 2987065, 3868461, 4177759, 5989914, 6699121, 1980919, 7981068, 813187, 6017264, 1082665, 1973788, 4577724, 2660607, 3467445, 5016886, 5629206, 1735677, 5340212, 6747271, 7796070, 1810761, 2917464, 1454610, 288724, 8328418, 2896928, 5527649, 7523745, 3331102, 2066184, 4515028, 6237003, 5920268, 3380294, 971341, 5956007, 4680424, 7826416, 3741661, 6217149, 4782079, 6678674, 5433007, 2443426, 4056992, 4236574, 1716903, 2745623, 4690903, 4027458, 5070286, 6737845, 6713729, 7448403, 869110, 345984, 4142952, 311497, 35586, 818857, 7685169, 6229066, 8208985, 4182387, 1815494, 7682553, 7919073, 5298111, 6708928, 2719787, 8148063, 4433677, 6317452, 6693699, 7650640, 2803205, 1267025, 717633, 8077413, 4299309, 2569654, 3671841, 1182656, 3509469, 87076, 1680595, 3909067, 446204, 6473563, 1811194, 7113769, 6407595, 2937192, 1757380, 7222684, 4790444, 6669094, 6631017, 4250252, 7733012, 5733400, 603663, 3848738, 7238566, 1841786, 6437669, 3843662, 7634813, 6085483, 3993109, 567969, 4175191, 2538293, 8211327, 454464, 1642273, 4664663, 2141046, 2890663, 7375350, 4196109, 3057923, 6547589, 2187753, 8216849, 6959826, 5725311, 6917744, 4979582, 1929950, 5991694, 6141079, 4399771, 5624709, 5566349, 8105364, 6050465, 6820262, 3547671, 7845983, 1978852, 617977, 3104838, 8060717, 3782109, 8212420, 1467857, 4448722], +[7860225, 8258854, 8004522, 1814955, 6846388, 7533577, 2341537, 5866449, 3366727, 6720900, 7291455, 4012098, 6941796, 2314989, 1645772, 2138598, 5286343, 7487624, 8210689, 33563, 3564209, 1856957, 6534553, 6881485, 2561379, 3017989, 6789878, 7102051, 2817256, 564530, 3067077, 3656212, 4371530, 2132581, 2041098, 2631160, 3982766, 6394254, 5025594, 1605205, 5641729, 4505604, 2406708, 4092343, 2191105, 6368215, 3137793, 2844984, 6914375, 4221834, 4137512, 6335431, 1971127, 7373512, 1774790, 2136978, 7743031, 3573225, 5684438, 5516650, 7207590, 5937035, 122569, 6363695, 6771970, 8296868, 1537199, 1346922, 3192988, 2076345, 4134661, 8019395, 7419384, 3009199, 1922666, 8044741, 3921073, 6600873, 8207018, 6492013, 3006065, 5900203, 547836, 2980975, 2131131, 6947195, 5375492, 4427678, 6892976, 3120613, 1171951, 1243698, 5872579, 2785402, 7708361, 7099479, 4752281, 7948118, 5922733, 723391, 4624631, 2740564, 4259525, 5657874, 5325567, 5359405, 772350, 3595552, 3483510, 7417827, 7771405, 161324, 5196676, 7300938, 4927723, 2554498, 2544443, 998221, 2202086, 3131352, 4404360, 2946575, 8153277, 7001860, 5679096, 3760070, 3534988, 514274, 2660858, 6257379, 7207894, 567665, 1771629, 3174060, 8242633, 4276413, 3207377, 7752938, 3833869, 3254416, 26862, 1771400, 3203798, 1185679, 375778, 505615, 7267195, 1449631, 2740566, 4787711, 712135, 991024, 7909384, 3911679, 1681431, 8072886, 4914954, 7734829, 6858951, 1419099, 1339437, 2025224, 1705915, 5466742, 8078014, 5391686, 3844478, 6886645, 747718, 4383878, 3869858, 942492, 3242733, 5687559, 6895735, 5881233, 4161708, 5929248, 7099194, 3796109, 3955833, 7565367, 8227477, 8218633, 5214871, 2895768, 7258486, 2621253, 7094061, 7379042, 4664278, 474556, 5570377, 876246, 4712328, 2499461, 3526909, 19243, 136964, 2115851, 8103704, 575225, 56562, 1128901, 3275524, 4958361, 6789310, 1279013, 5586423, 3324951, 4045874, 1326878, 3205980, 4611414, 6443909, 6014391, 117606, 2176988, 7434126, 4591873, 2650966, 5131929, 6562520, 1708158, 5426752, 6623645, 3619627, 3894145, 3397506, 130596, 290406, 4160791, 6959084, 4794458, 3384833, 3688557, 3321598, 6269178, 2216576, 5805188, 6337638, 8286344, 6357418, 910624, 7783248, 6640376, 3196282, 7163882, 5338782, 8352592, 1475796, 5743556, 5612352, 3834791, 1298088, 6926856]] +NTTInverse(aHat * s1Hat): [[4089385, 3243627, 2997576, 1860759, 7743501, 7853441, 1170077, 1195218, 7888106, 665458, 5751129, 5154174, 7545301, 4808040, 4175098, 7253799, 7354401, 4374114, 4898140, 8044441, 4815372, 4010427, 6091385, 7511375, 5519099, 8122144, 2751558, 5957631, 3470660, 302268, 5061991, 4165622, 2714659, 8063459, 2847894, 1533472, 4438403, 6443104, 2347662, 289547, 184159, 5498888, 5443787, 1425670, 3078839, 5300425, 5553617, 7454249, 3728399, 6859040, 2564941, 2503834, 6526467, 3139810, 4830966, 3195083, 3837599, 3020684, 5099414, 7632484, 7411640, 949374, 4008957, 25711, 5508339, 8179926, 5906373, 7293751, 7933155, 2462199, 7399825, 2422046, 1919134, 2219453, 5125954, 4215190, 6111785, 4964145, 4699695, 3414382, 5633204, 8253928, 6384382, 5252926, 1909370, 7134709, 1002384, 2857427, 782475, 6710664, 578965, 6004387, 250791, 1740254, 2869920, 6754518, 5004253, 3901061, 6136709, 257472, 434038, 5473324, 3029021, 9021, 6504021, 533317, 172691, 449164, 903614, 5480884, 5137554, 2470044, 5050434, 4148316, 6679782, 7441998, 732383, 7945132, 6825658, 626286, 5927752, 421578, 6978195, 5197373, 2226286, 7037106, 1725738, 6927486, 6997502, 1201567, 2573924, 8193142, 2094057, 3138833, 6966564, 7497571, 6111573, 6131203, 3073023, 3823983, 8264453, 4390787, 3881140, 4873363, 5557490, 792772, 7477984, 7046048, 8348349, 6302649, 6541801, 8341189, 1418279, 2709922, 700308, 1217449, 2297217, 1470439, 3212806, 790777, 5213120, 5758425, 2076338, 7545777, 1805605, 2703815, 2067337, 2102944, 636299, 4233636, 6027475, 600281, 7267577, 5879100, 8103361, 415092, 3881831, 6691668, 3448279, 2899642, 3276783, 4799396, 7504762, 1243741, 6158462, 2871358, 5882567, 3341518, 542921, 732539, 7112079, 6697560, 4666153, 3317112, 5864087, 6699666, 2879704, 3446807, 2688491, 5407074, 139236, 6915964, 3050814, 7186377, 5246300, 3820169, 4976134, 6808630, 983871, 5644977, 8027008, 6509110, 2021339, 444784, 6184213, 6370231, 3543847, 7815931, 2290130, 1767280, 2494956, 7165443, 2394185, 6418859, 2101956, 5246065, 5209342, 4703811, 2405169, 3885181, 5663167, 3017062, 2999548, 1031789, 2800455, 3702120, 748277, 1095694, 2873435, 6784032, 999330, 7553807, 7064382, 795640, 1427808, 1871738, 4214659, 8127216, 8074002, 1777326, 2706004, 7614288, 6665819, 6039723, 2142283, 792449], +[3424695, 3851902, 7946663, 7319124, 3293286, 4224957, 4060028, 3286208, 60159, 2504816, 5758015, 5804699, 749986, 7462904, 5351146, 2632035, 2853283, 611042, 524618, 7013505, 7063882, 5050956, 7482637, 1669759, 7283173, 879, 6404094, 1897950, 7624650, 1459694, 1738080, 631549, 4880914, 6642021, 6838518, 5550582, 5960333, 6207807, 5242158, 1822450, 7437190, 3238536, 6645595, 423243, 6066631, 8056918, 6399922, 5697097, 8242501, 732180, 198418, 2766884, 2270581, 5701403, 1135138, 8197833, 1974559, 6143785, 1682114, 3402104, 7819628, 5787659, 4651657, 748064, 6811831, 1379049, 469113, 5052180, 8208855, 1952045, 7813633, 6299960, 5840565, 7080326, 400269, 3186522, 1864224, 423158, 3305970, 7123647, 843954, 5789455, 6919577, 5837478, 7614468, 7722304, 6482681, 8156351, 6028288, 7136110, 6812329, 2521103, 879313, 6313515, 4155740, 5957056, 3461072, 3674013, 1303662, 5323132, 3109450, 2862258, 5839198, 1025044, 2735530, 1681423, 1158434, 7562638, 5632777, 3879238, 180855, 7020215, 4748859, 3243932, 5979262, 6160414, 6066632, 792368, 4192626, 7863217, 886899, 2009585, 4326007, 7085219, 7622610, 3118274, 3992835, 4532977, 2600098, 2491388, 1127216, 5770495, 688904, 5422250, 5655242, 6793791, 8036904, 1111124, 4090337, 5072013, 4959199, 413106, 5278590, 6905221, 3538262, 593483, 126314, 7748366, 4923111, 5544693, 7950001, 7708029, 3428345, 1358095, 793299, 8008047, 7398863, 4939405, 7195367, 1931939, 2135454, 4586798, 3358235, 4574039, 3741742, 6546536, 5907758, 4525561, 126526, 6537530, 346442, 4154402, 2506090, 5054506, 7833272, 5492834, 5929410, 5773490, 1021035, 4190007, 3953982, 7606524, 830722, 7246442, 4788771, 4564004, 1958702, 6741305, 3003739, 2311838, 6282800, 4374990, 4019103, 60861, 2260773, 4739317, 774350, 546887, 3298028, 7537930, 1936736, 5147247, 5491279, 5188527, 5636260, 5782248, 3051842, 6902039, 5967255, 7162124, 5618424, 543754, 6005114, 2159043, 7534796, 2940798, 7011455, 145590, 3728597, 2750789, 5753651, 7992286, 5411603, 6677323, 8287529, 6095749, 7690576, 6993070, 5893833, 6523179, 4769266, 7673291, 1651630, 7320632, 4753701, 221529, 6982325, 778411, 2930144, 1244932, 3503055, 6465906, 3250207, 7735918, 6383851, 6921164, 346844, 2805486, 3481572, 3781001, 914637, 2398891, 3206325, 515530, 6168665, 731884], +[1285947, 630930, 2012121, 7066228, 3129344, 6394749, 6593383, 4387907, 887463, 812692, 603020, 4377173, 4103483, 1156382, 5369498, 8071448, 2281453, 4224566, 5272032, 1838907, 6047178, 3329268, 6749205, 5458253, 2186741, 5519041, 1329113, 5438547, 1681210, 3590947, 7028899, 2422292, 2277841, 7547872, 7732011, 7483190, 5098267, 2051635, 1542359, 3226695, 7028976, 4609970, 1337465, 869137, 871165, 5141036, 2774985, 2462731, 6505028, 2104296, 1724592, 1894598, 1679234, 347885, 6959033, 6726898, 5240702, 2056539, 6605145, 2564441, 7296784, 1081689, 7618357, 2375022, 6556161, 6182829, 3602326, 6469673, 3773524, 6640991, 5379744, 1221214, 1129515, 4256148, 1140741, 6895784, 8178431, 3580574, 6387912, 5879466, 3702168, 6930283, 4337076, 126424, 7509137, 2286265, 5870223, 2376601, 5636159, 486415, 1528271, 8238139, 690718, 125230, 4177471, 4455488, 6551702, 1094664, 8170974, 6038971, 1798727, 2266183, 4421546, 3745496, 1589438, 2209460, 683195, 562950, 3373443, 5523241, 2278508, 3634124, 1096875, 4354897, 3833136, 4074198, 3708176, 5291681, 6186251, 2618800, 784904, 2033447, 5349566, 5776766, 5773857, 1526787, 2865668, 7065941, 4745134, 2361342, 6739405, 6553049, 7230049, 5267037, 4333511, 6041430, 3679567, 5119173, 8254748, 1474374, 2147226, 4632197, 4911442, 5848354, 2159421, 3779114, 1189628, 2952580, 8158330, 2045331, 7518659, 2492139, 8282027, 4299058, 3945633, 7926724, 3682565, 5705509, 3832827, 5979921, 6594509, 2978022, 7446868, 6975705, 2051725, 3479710, 5465505, 7887015, 3890278, 8324545, 2645564, 4163467, 5766302, 7936624, 3535460, 5478595, 5301466, 3712564, 927667, 3179850, 2621833, 5002164, 7248770, 4961154, 3312121, 852237, 7544291, 3618228, 5028488, 1177452, 3145740, 6302583, 2428133, 638999, 6442056, 3274606, 4033377, 1860127, 6969393, 2787442, 3562126, 8277329, 7610342, 6438965, 8278100, 3790348, 5467721, 3864836, 5724001, 5779859, 6082966, 4474644, 6065861, 7322462, 3707245, 1379623, 332429, 8379773, 2534853, 4699512, 5398130, 2769315, 254641, 4062657, 7750574, 1192805, 5132465, 4328165, 2105878, 4126113, 5040662, 6964074, 3039283, 6055839, 7602129, 572323, 3086649, 3627091, 1424735, 1528581, 2587179, 1346346, 5868296, 4496993, 1793023, 1955943, 337849, 8332896, 2784200, 6417779, 1936980, 1080565, 7848398, 1975180, 6760728, 1622118], +[2744379, 6885345, 1807923, 6069656, 7723085, 1276462, 7935274, 1842025, 7671994, 1471837, 2361166, 5712830, 6416006, 4256155, 2086655, 6041980, 7850710, 4851603, 7559832, 678895, 6609594, 6073222, 1182875, 4529032, 7074411, 1931892, 2958057, 2685279, 417066, 1718998, 47645, 8330578, 5570086, 6731127, 8220976, 8261900, 4382920, 7621374, 3941221, 1436124, 2328952, 1354935, 626480, 5542502, 2895930, 6265126, 6388096, 5139463, 4275154, 2069743, 7711751, 4705240, 68367, 2347443, 469656, 6013859, 7038082, 5969353, 3314702, 4767343, 4697703, 294325, 4710633, 6229667, 8050294, 7047753, 8095673, 3078183, 1355152, 3375925, 153571, 6840666, 6022515, 2078726, 941659, 4566963, 4583903, 8232962, 3622647, 5082093, 114695, 7270847, 5136449, 2425559, 6942636, 5456916, 415748, 2666815, 2621575, 5434989, 5721327, 2349115, 2628653, 4263657, 8771, 2476565, 2676940, 3385837, 5030150, 7533730, 2216672, 1231656, 8290981, 2140179, 2373735, 2021092, 5831682, 8072098, 3759584, 15227, 5279577, 432118, 1864527, 3316973, 6050653, 3467487, 3236496, 7704965, 5308437, 628019, 1482419, 8125918, 3890681, 794066, 5054805, 2062883, 2190391, 4744113, 2199426, 4541677, 5153949, 4001735, 8124426, 6226277, 4216809, 3124782, 2918839, 6895211, 6824640, 7488676, 8288762, 7748465, 1235531, 2751766, 5125883, 1192491, 4502710, 5665762, 2126057, 4085647, 6968122, 2178470, 5528926, 4137035, 6996256, 1489785, 694167, 7897283, 210877, 2940709, 652576, 4693054, 2526938, 5241819, 4647590, 7677156, 1302757, 2447116, 1934618, 1971507, 6648280, 3985967, 151420, 7767100, 2729502, 2822212, 5552807, 156455, 5544071, 568745, 7341009, 6339283, 4488696, 1194494, 7121982, 6570664, 233959, 5248444, 1360166, 726667, 6903157, 8134001, 1302246, 3707545, 7482388, 4743618, 4193426, 5569903, 4457089, 2075984, 4936280, 6826065, 1997664, 8046952, 3242090, 3865359, 6215919, 2395352, 7812330, 144665, 5376732, 3695858, 2878804, 7275898, 5907422, 1774677, 556449, 2898796, 908702, 1599506, 2662060, 2503504, 7345946, 1233447, 7197613, 8029531, 2256785, 1307416, 5099849, 7162618, 6247378, 4132615, 4571828, 3707672, 3665606, 1175100, 6902652, 189897, 8059671, 6330145, 637737, 7586354, 4344977, 2149996, 21487, 6908532, 2491590, 6042182, 306412, 2393074, 7046117, 2009454, 3857205, 4266714, 4101378, 6804066]] +t: [[4089386, 3243628, 2997575, 1860759, 7743502, 7853440, 1170079, 1195216, 7888107, 665458, 5751129, 5154175, 7545299, 4808039, 4175100, 7253798, 7354403, 4374115, 4898141, 8044441, 4815374, 4010428, 6091384, 7511374, 5519099, 8122146, 2751556, 5957631, 3470662, 302270, 5061993, 4165620, 2714657, 8063457, 2847893, 1533470, 4438405, 6443103, 2347661, 289546, 184161, 5498890, 5443787, 1425669, 3078838, 5300427, 5553619, 7454250, 3728397, 6859041, 2564941, 2503836, 6526466, 3139809, 4830966, 3195082, 3837600, 3020683, 5099413, 7632486, 7411641, 949376, 4008956, 25711, 5508341, 8179926, 5906375, 7293750, 7933157, 2462197, 7399827, 2422045, 1919136, 2219452, 5125955, 4215190, 6111785, 4964143, 4699695, 3414383, 5633206, 8253929, 6384383, 5252926, 1909369, 7134711, 1002385, 2857427, 782473, 6710666, 578966, 6004389, 250790, 1740256, 2869922, 6754518, 5004252, 3901063, 6136711, 257471, 434039, 5473322, 3029019, 9023, 6504021, 533316, 172692, 449166, 903615, 5480885, 5137555, 2470043, 5050433, 4148315, 6679782, 7441997, 732381, 7945132, 6825656, 626284, 5927754, 421580, 6978196, 5197375, 2226288, 7037107, 1725740, 6927485, 6997504, 1201565, 2573924, 8193141, 2094059, 3138835, 6966562, 7497569, 6111571, 6131204, 3073022, 3823983, 8264455, 4390789, 3881140, 4873365, 5557490, 792771, 7477984, 7046047, 8348351, 6302648, 6541802, 8341190, 1418278, 2709920, 700309, 1217448, 2297216, 1470441, 3212806, 790775, 5213118, 5758426, 2076338, 7545778, 1805603, 2703813, 2067338, 2102943, 636299, 4233638, 6027473, 600279, 7267579, 5879099, 8103362, 415091, 3881831, 6691668, 3448278, 2899642, 3276782, 4799398, 7504764, 1243740, 6158464, 2871356, 5882568, 3341516, 542920, 732540, 7112081, 6697562, 4666153, 3317114, 5864089, 6699666, 2879703, 3446805, 2688489, 5407076, 139238, 6915962, 3050812, 7186375, 5246302, 3820169, 4976133, 6808632, 983869, 5644978, 8027010, 6509112, 2021340, 444782, 6184215, 6370233, 3543848, 7815930, 2290132, 1767279, 2494955, 7165443, 2394183, 6418860, 2101956, 5246065, 5209343, 4703812, 2405169, 3885182, 5663169, 3017062, 2999547, 1031789, 2800455, 3702118, 748275, 1095692, 2873434, 6784030, 999330, 7553807, 7064381, 795639, 1427807, 1871737, 4214661, 8127218, 8074002, 1777324, 2706003, 7614286, 6665817, 6039724, 2142285, 792450], +[3424697, 3851902, 7946664, 7319125, 3293288, 4224956, 4060028, 3286208, 60158, 2504817, 5758014, 5804699, 749984, 7462904, 5351145, 2632037, 2853285, 611043, 524618, 7013503, 7063884, 5050955, 7482636, 1669760, 7283175, 877, 6404095, 1897948, 7624651, 1459694, 1738080, 631551, 4880912, 6642019, 6838518, 5550580, 5960334, 6207806, 5242158, 1822449, 7437190, 3238534, 6645596, 423243, 6066630, 8056917, 6399924, 5697096, 8242499, 732180, 198417, 2766886, 2270579, 5701404, 1135140, 8197832, 1974557, 6143787, 1682113, 3402106, 7819628, 5787659, 4651657, 748063, 6811830, 1379049, 469114, 5052182, 8208853, 1952047, 7813632, 6299958, 5840567, 7080324, 400271, 3186522, 1864226, 423156, 3305972, 7123648, 843952, 5789455, 6919577, 5837479, 7614470, 7722303, 6482681, 8156353, 6028288, 7136109, 6812330, 2521105, 879313, 6313514, 4155739, 5957056, 3461073, 3674015, 1303662, 5323131, 3109449, 2862258, 5839199, 1025044, 2735529, 1681422, 1158433, 7562640, 5632778, 3879236, 180854, 7020214, 4748858, 3243930, 5979264, 6160415, 6066634, 792367, 4192625, 7863217, 886897, 2009585, 4326005, 7085219, 7622608, 3118274, 3992837, 4532977, 2600100, 2491386, 1127218, 5770494, 688903, 5422252, 5655244, 6793789, 8036906, 1111124, 4090335, 5072014, 4959200, 413104, 5278589, 6905223, 3538262, 593482, 126312, 7748368, 4923113, 5544693, 7950003, 7708027, 3428346, 1358096, 793301, 8008049, 7398861, 4939406, 7195365, 1931941, 2135454, 4586796, 3358235, 4574037, 3741744, 6546538, 5907757, 4525563, 126526, 6537530, 346441, 4154403, 2506092, 5054505, 7833271, 5492836, 5929409, 5773491, 1021037, 4190008, 3953984, 7606526, 830724, 7246444, 4788772, 4564005, 1958700, 6741306, 3003741, 2311836, 6282798, 4374990, 4019102, 60860, 2260772, 4739318, 774349, 546887, 3298029, 7537929, 1936735, 5147247, 5491278, 5188526, 5636260, 5782248, 3051841, 6902037, 5967253, 7162126, 5618423, 543753, 6005115, 2159041, 7534798, 2940798, 7011457, 145592, 3728595, 2750787, 5753652, 7992286, 5411605, 6677322, 8287531, 6095748, 7690578, 6993071, 5893835, 6523180, 4769264, 7673292, 1651631, 7320634, 4753700, 221527, 6982323, 778412, 2930142, 1244931, 3503053, 6465904, 3250207, 7735918, 6383851, 6921163, 346843, 2805485, 3481573, 3781000, 914636, 2398889, 3206325, 515529, 6168663, 731884], +[1285947, 630928, 2012120, 7066226, 3129345, 6394751, 6593384, 4387909, 887463, 812690, 603021, 4377175, 4103484, 1156380, 5369497, 8071446, 2281453, 4224564, 5272033, 1838907, 6047178, 3329268, 6749204, 5458255, 2186741, 5519040, 1329113, 5438545, 1681208, 3590946, 7028900, 2422294, 2277841, 7547873, 7732010, 7483191, 5098269, 2051635, 1542360, 3226694, 7028976, 4609970, 1337466, 869135, 871166, 5141035, 2774984, 2462730, 6505029, 2104296, 1724593, 1894597, 1679235, 347886, 6959035, 6726899, 5240704, 2056538, 6605146, 2564443, 7296784, 1081691, 7618355, 2375024, 6556161, 6182830, 3602327, 6469674, 3773523, 6640990, 5379743, 1221213, 1129513, 4256148, 1140739, 6895785, 8178432, 3580573, 6387914, 5879468, 3702169, 6930282, 4337075, 126423, 7509137, 2286267, 5870222, 2376601, 5636157, 486416, 1528269, 8238137, 690716, 125230, 4177472, 4455490, 6551702, 1094664, 8170975, 6038973, 1798725, 2266183, 4421544, 3745495, 1589438, 2209462, 683196, 562949, 3373443, 5523243, 2278510, 3634123, 1096873, 4354897, 3833135, 4074198, 3708176, 5291682, 6186250, 2618802, 784903, 2033446, 5349565, 5776766, 5773859, 1526788, 2865667, 7065941, 4745132, 2361343, 6739404, 6553048, 7230048, 5267036, 4333513, 6041431, 3679565, 5119172, 8254749, 1474373, 2147225, 4632197, 4911440, 5848353, 2159419, 3779115, 1189630, 2952582, 8158330, 2045331, 7518661, 2492137, 8282028, 4299057, 3945634, 7926723, 3682567, 5705511, 3832826, 5979923, 6594507, 2978021, 7446868, 6975703, 2051726, 3479711, 5465505, 7887014, 3890279, 8324546, 2645565, 4163469, 5766304, 7936625, 3535462, 5478593, 5301465, 3712566, 927666, 3179849, 2621833, 5002164, 7248770, 4961154, 3312120, 852237, 7544289, 3618226, 5028490, 1177451, 3145739, 6302583, 2428133, 638998, 6442058, 3274607, 4033375, 1860126, 6969395, 2787441, 3562126, 8277329, 7610340, 6438964, 8278098, 3790349, 5467719, 3864835, 5724003, 5779859, 6082964, 4474643, 6065859, 7322461, 3707243, 1379624, 332428, 8379773, 2534855, 4699514, 5398131, 2769315, 254640, 4062655, 7750574, 1192806, 5132466, 4328163, 2105880, 4126113, 5040662, 6964075, 3039282, 6055841, 7602131, 572322, 3086648, 3627090, 1424733, 1528581, 2587181, 1346346, 5868297, 4496993, 1793022, 1955944, 337847, 8332894, 2784202, 6417777, 1936981, 1080566, 7848397, 1975178, 6760730, 1622117], +[2744380, 6885347, 1807924, 6069657, 7723086, 1276461, 7935272, 1842025, 7671996, 1471838, 2361165, 5712832, 6416005, 4256156, 2086655, 6041978, 7850712, 4851604, 7559831, 678893, 6609593, 6073222, 1182874, 4529030, 7074413, 1931891, 2958056, 2685278, 417065, 1719000, 47644, 8330579, 5570086, 6731128, 8220977, 8261901, 4382921, 7621376, 3941220, 1436123, 2328952, 1354933, 626481, 5542504, 2895929, 6265126, 6388097, 5139464, 4275156, 2069742, 7711751, 4705238, 68367, 2347444, 469656, 6013861, 7038082, 5969354, 3314702, 4767341, 4697701, 294325, 4710633, 6229665, 8050292, 7047752, 8095673, 3078183, 1355153, 3375926, 153569, 6840664, 6022513, 2078728, 941657, 4566965, 4583905, 8232960, 3622648, 5082095, 114695, 7270847, 5136449, 2425557, 6942635, 5456918, 415750, 2666815, 2621574, 5434988, 5721325, 2349115, 2628654, 4263659, 8772, 2476564, 2676940, 3385835, 5030149, 7533732, 2216672, 1231655, 8290980, 2140180, 2373737, 2021093, 5831681, 8072098, 3759585, 15228, 5279575, 432116, 1864528, 3316975, 6050654, 3467488, 3236498, 7704966, 5308439, 628018, 1482417, 8125916, 3890683, 794067, 5054805, 2062884, 2190389, 4744112, 2199425, 4541677, 5153949, 4001737, 8124426, 6226275, 4216810, 3124784, 2918840, 6895211, 6824642, 7488678, 8288763, 7748465, 1235532, 2751768, 5125885, 1192492, 4502709, 5665763, 2126057, 4085649, 6968122, 2178470, 5528927, 4137036, 6996255, 1489783, 694168, 7897284, 210876, 2940707, 652578, 4693056, 2526938, 5241819, 4647592, 7677156, 1302759, 2447117, 1934616, 1971506, 6648280, 3985965, 151421, 7767099, 2729502, 2822210, 5552807, 156454, 5544069, 568747, 7341010, 6339284, 4488697, 1194494, 7121982, 6570666, 233960, 5248445, 1360166, 726666, 6903155, 8134003, 1302246, 3707545, 7482390, 4743619, 4193424, 5569901, 4457089, 2075983, 4936279, 6826067, 1997666, 8046950, 3242089, 3865359, 6215919, 2395351, 7812328, 144665, 5376732, 3695858, 2878804, 7275896, 5907420, 1774677, 556449, 2898797, 908702, 1599508, 2662061, 2503504, 7345944, 1233446, 7197611, 8029531, 2256787, 1307416, 5099849, 7162619, 6247379, 4132616, 4571826, 3707673, 3665605, 1175102, 6902652, 189897, 8059671, 6330144, 637736, 7586354, 4344975, 2149997, 21488, 6908531, 2491589, 6042183, 306410, 2393075, 7046117, 2009452, 3857207, 4266716, 4101380, 6804067]] + +t0: [[1578, -404, -697, 1175, 2062, -2688, -1377, -816, -789, 1906, 345, 1407, 467, -665, -2820, 3878, -2013, -413, -675, -103, -1522, -3652, -3464, -690, -2309, 3874, -956, 2047, -2746, -834, -663, 4084, 3105, 2529, -2923, 1566, -1659, -4001, -3443, 2826, 3937, 2058, -3893, 261, -1354, 203, -557, -470, 1037, 2337, 845, -2916, -2558, 2273, -2314, 202, 3744, -2165, 3989, -2458, -2119, -896, 3068, 1135, 3317, -3882, -57, 2870, 3301, -3595, 2451, -2787, 2208, -580, -2237, -3690, 553, -209, -2513, -1681, -2890, -3607, 2815, 1854, 633, -521, 2961, -1581, -3959, 1418, -2666, -347, -3162, 3552, 2722, -3882, -1060, 1671, 903, 3519, -137, 1066, -2021, 831, -427, 836, 660, -1394, 2495, 437, 1171, -3941, -4031, 3163, 3302, 3661, 3293, -1108, 1720, 3692, -3254, 3788, -1388, 3647, -1936, 179, -2772, -2947, 1536, -2659, 1636, 1141, -3093, 1299, 3362, 1889, 339, 3588, 1022, -1681, -1273, -123, -1868, -875, 3314, -1853, -1312, 927, 703, 3000, -3606, 1734, 1062, -1632, 3989, -3160, 3456, 4073, 1542, -3849, 3006, -550, 3762, 946, 3363, 453, 2954, -2401, -2677, -1626, -1839, 2263, 1275, -2757, 1474, -2701, -1177, -1196, -554, -326, -18, -1114, 892, -1444, -1920, -4036, 712, -820, 2248, 3452, 1425, -3494, -3287, -646, -1383, -1390, -3881, -2027, 1513, 356, -26, 1914, 3388, 1991, 3422, 2697, 3589, 1080, 829, 690, -1150, -3528, -2084, 2414, -745, -3143, -3288, 762, -3628, -2193, -3605, -2557, 2119, -3668, -3388, 3185, -769, 1604, -3279, 2174, 2497, 2406, 1275, -403, -1209, -666, 2803, -2036, -1958, 1054, -94, 783, 2877, 1015, 2399, 3961, 3973, 754, -3310, -340, 2643, 3918, -2471, 2220, -4019, -2174], +[441, 1662, 424, 3669, 104, -2116, -3204, 1216, 2814, -1935, -962, -3429, -3680, -8, 1769, 2405, 2469, -3357, 330, 1151, 2380, -3509, 3340, -1408, 487, 877, -2049, -2596, -2101, 1518, 1376, 767, -1520, -1693, -1802, -3596, -3442, -1730, -722, 3825, -1146, 2694, 1884, -2741, -3642, -4011, 1972, 3656, 1347, 3092, 1809, -2010, 1395, -228, -3548, -2360, 285, -213, 2753, 2426, -3732, -4085, -1399, 2591, -3914, 2793, 2170, -2282, 469, 2351, -1536, 310, -329, 2436, -1137, -166, -3550, -2828, -3596, -3392, 176, -2289, -2663, -3417, -4090, -2753, 2809, -2879, -1024, 877, -3414, -2031, 2769, -2518, 2395, 1472, 4049, 3999, 1134, -1669, -3511, 3250, -1697, 1044, -599, 2062, 3361, 1424, -3318, -3772, 630, -330, -2502, -102, -896, 31, -3638, -2257, -1679, -1103, 2161, 2545, 629, -861, 4048, -2878, 3333, 2801, 3236, 1018, -3278, 3326, 775, -852, 2764, 2621, 554, -2988, 2527, 1166, 3040, 3504, 2941, -633, -682, 3658, 3432, -1264, -279, -1291, 3763, -645, 4090, -1776, -1323, -3727, 1485, -370, 2789, -1371, -2658, -724, -485, 2901, -2000, 1130, 1325, 3579, 3646, 314, 2377, 1059, -660, 41, 1719, -3996, -1599, -1869, -2963, 3896, -2752, -3842, 3332, -3476, -3548, 1061, 812, -710, -2723, 1692, -466, 462, -3170, 3516, -220, -3850, -3891, -1977, -3347, 1289, 3423, 2671, 2638, 2990, 164, -1304, -3775, -3819, 3477, 2318, -1289, 3081, 379, -3647, -1842, -130, -895, -1864, 1235, -1725, 2868, -3106, -3307, 842, -2773, 900, -1710, -2897, 3787, 2348, 1520, -2612, -3153, -3014, 2340, 343, 2739, 172, -2594, -253, -3123, 2416, -2017, 2670, 2283, -1077, 2779, 3821, -27, -3704, -2868, -1367, 3253, -567, 87, 2796], +[-197, 144, -3112, -3470, 1, -3201, -1176, -3003, 2727, 1682, -3187, 2647, -708, 1308, 3737, 2326, 4077, -2508, -3615, 3899, 1482, 3316, -1004, 2383, -523, -2368, 2009, -943, 1848, 2850, 164, -2538, 465, 3041, -1238, 3895, 2845, 3635, 2264, -954, 240, -2126, 2170, 783, 2814, -3541, -2104, -3062, 581, -1048, -3919, 2245, -125, 3822, 4027, 1267, -2176, 346, 2394, 347, -2288, 347, -205, -656, 2561, -2130, -2153, -2006, -2989, -2722, -2401, 605, -983, -3692, 2051, -1879, 2816, 669, -1846, -2388, -615, -150, 3507, 3543, -2927, 699, -3442, 921, 61, 3088, -3635, -3015, 2588, 2350, -448, -958, -1898, -3064, 3551, 1469, -3515, -3001, -2136, 1751, 190, -2378, 3260, -2299, -1661, 1835, 1134, -3125, -855, -3247, -721, 2774, -2800, -350, 1290, -2638, -1529, 1830, 189, 1406, -1501, 3076, -1533, -3755, 1964, 2047, -2612, -552, -3488, -420, -55, 3927, 1357, -828, -2787, -187, 921, 3717, -3760, -735, -3269, 2603, 1790, 3462, -902, -2669, -1595, 1769, -84, -1743, -2910, -3133, -3833, 3879, -1030, -237, -53, -3867, 340, -3881, 3726, -1889, 1441, -1882, -921, 1474, -451, 1933, -864, -1423, -3482, -1855, 1241, 1590, 1970, 1353, 393, -3148, -1150, -3198, 2552, 269, -543, -2638, -1398, -2197, 11, 2935, 3301, 22, 3146, -2193, 2911, 542, -1997, 2161, -1394, 3409, -28, 52, -4014, -2547, 3655, -1789, -2205, -3693, -3692, 1811, 3779, -1187, -3733, 3368, -3444, -643, 3527, -2694, -397, 419, 688, -577, 942, -3226, -3918, 2787, 536, -2655, 2582, 875, 50, 1953, -45, -1118, -1736, -1966, -675, -3323, -1491, 2858, 2825, -415, -1026, -1944, 1975, 1630, -1078, 3441, 3669, -778, 461, 906, 2330, 101], +[60, 4067, -2508, -615, -1970, -1491, -2776, -1175, -3908, -2722, 1869, 3008, 1669, -3684, -2305, -3718, 2776, 1940, -1385, -1043, -1351, 2950, 3226, -1146, -3475, -1421, 744, -1698, -727, -1320, -1508, -685, -474, -2696, -3791, -3827, 201, 2816, 868, 2523, 2424, 3253, 3889, -3480, -4039, -1754, -1663, 3080, -1068, -2834, 3079, 3030, 2831, -3660, 2712, 933, 1154, -2614, -3058, -403, 3685, -587, 233, 3745, -2444, 2632, 1977, -2009, 3473, 822, -2079, 344, 1393, -2040, -423, 4021, -3615, 0, 1784, 3055, 7, -3649, 65, 725, 4011, 1046, -2042, -3777, 134, 3692, 3309, -1989, -978, 3819, 580, 2580, -1844, 2539, 261, -2908, -3360, 2855, 676, 2068, -1943, -2331, -1023, 2978, -543, -1156, 3927, -2060, -3248, -785, -3234, 2272, 658, -3706, 23, -2766, -335, -548, -517, -557, 341, -1500, 3125, 944, 3969, 3309, 1181, 4041, -2038, 355, -2070, 3632, 2488, -2453, 706, 1190, -1541, -1167, -1460, -744, -2307, -3540, -2891, -3101, -3863, -2159, -3270, -602, -673, 76, 287, -1161, -2152, 196, -2116, -221, -2782, -960, 3802, -1061, 2728, 1252, 231, -2291, 1304, -2766, -3624, -3539, 3965, 1083, 1566, -4030, -1369, 806, -1915, 3499, 978, -1324, -519, -1538, 3134, 682, -3608, -2627, 294, -2422, -2701, -653, -282, -3431, 3094, 451, -880, -659, 641, 3407, -3497, 2131, -1182, 2406, -1943, -1265, -1809, 3287, -2840, -2791, 2780, 1266, 3412, 1400, 988, -2987, -607, -1171, -610, 2068, -339, -3248, -2280, -3546, -3157, 1371, 3987, -3304, -3767, 2811, -3117, 3848, 690, -3303, 3781, 3646, -3204, 1481, -1257, -2272, -1240, 562, 3215, 3693, -3088, 2675, 1221, -3513, 3306, 1011, 997, 2412, -1225, -1316, -2812, -3485]] +t1: [[499, 396, 366, 227, 945, 959, 143, 146, 963, 81, 702, 629, 921, 587, 510, 885, 898, 534, 598, 982, 588, 490, 744, 917, 674, 991, 336, 727, 424, 37, 618, 508, 331, 984, 348, 187, 542, 787, 287, 35, 22, 671, 665, 174, 376, 647, 678, 910, 455, 837, 313, 306, 797, 383, 590, 390, 468, 369, 622, 932, 905, 116, 489, 3, 672, 999, 721, 890, 968, 301, 903, 296, 234, 271, 626, 515, 746, 606, 574, 417, 688, 1008, 779, 641, 233, 871, 122, 349, 96, 819, 71, 733, 31, 212, 350, 825, 611, 476, 749, 31, 53, 668, 370, 1, 794, 65, 21, 55, 110, 669, 627, 302, 617, 506, 815, 908, 89, 970, 833, 76, 724, 51, 852, 634, 272, 859, 211, 846, 854, 147, 314, 1000, 256, 383, 850, 915, 746, 748, 375, 467, 1009, 536, 474, 595, 678, 97, 913, 860, 1019, 769, 799, 1018, 173, 331, 85, 149, 280, 179, 392, 97, 636, 703, 253, 921, 220, 330, 252, 257, 78, 517, 736, 73, 887, 718, 989, 51, 474, 817, 421, 354, 400, 586, 916, 152, 752, 351, 718, 408, 66, 89, 868, 818, 570, 405, 716, 818, 352, 421, 328, 660, 17, 844, 372, 877, 640, 466, 607, 831, 120, 689, 980, 795, 247, 54, 755, 778, 433, 954, 280, 216, 305, 875, 292, 784, 257, 640, 636, 574, 294, 474, 691, 368, 366, 126, 342, 452, 91, 134, 351, 828, 122, 922, 862, 97, 174, 228, 514, 992, 986, 217, 330, 929, 814, 737, 262, 97], +[418, 470, 970, 893, 402, 516, 496, 401, 7, 306, 703, 709, 92, 911, 653, 321, 348, 75, 64, 856, 862, 617, 913, 204, 889, 0, 782, 232, 931, 178, 212, 77, 596, 811, 835, 678, 728, 758, 640, 222, 908, 395, 811, 52, 741, 984, 781, 695, 1006, 89, 24, 338, 277, 696, 139, 1001, 241, 750, 205, 415, 955, 707, 568, 91, 832, 168, 57, 617, 1002, 238, 954, 769, 713, 864, 49, 389, 228, 52, 404, 870, 103, 707, 845, 713, 930, 943, 791, 996, 736, 871, 832, 308, 107, 771, 507, 727, 422, 448, 159, 650, 380, 349, 713, 125, 334, 205, 141, 923, 688, 474, 22, 857, 580, 396, 730, 752, 741, 97, 512, 960, 108, 245, 528, 865, 930, 381, 487, 553, 317, 304, 138, 704, 84, 662, 690, 829, 981, 136, 499, 619, 605, 50, 644, 843, 432, 72, 15, 946, 601, 677, 970, 941, 418, 166, 97, 978, 903, 603, 878, 236, 261, 560, 410, 558, 457, 799, 721, 552, 15, 798, 42, 507, 306, 617, 956, 671, 724, 705, 125, 511, 483, 929, 101, 885, 585, 557, 239, 823, 367, 282, 767, 534, 491, 7, 276, 579, 95, 67, 403, 920, 236, 628, 670, 633, 688, 706, 373, 843, 728, 874, 686, 66, 733, 264, 920, 359, 856, 18, 455, 336, 702, 976, 661, 815, 1012, 744, 939, 854, 719, 796, 582, 937, 202, 894, 580, 27, 852, 95, 358, 152, 428, 789, 397, 944, 779, 845, 42, 342, 425, 462, 112, 293, 391, 63, 753, 89], +[157, 77, 246, 863, 382, 781, 805, 536, 108, 99, 74, 534, 501, 141, 655, 985, 278, 516, 644, 224, 738, 406, 824, 666, 267, 674, 162, 664, 205, 438, 858, 296, 278, 921, 944, 913, 622, 250, 188, 394, 858, 563, 163, 106, 106, 628, 339, 301, 794, 257, 211, 231, 205, 42, 849, 821, 640, 251, 806, 313, 891, 132, 930, 290, 800, 755, 440, 790, 461, 811, 657, 149, 138, 520, 139, 842, 998, 437, 780, 718, 452, 846, 529, 15, 917, 279, 717, 290, 688, 59, 187, 1006, 84, 15, 510, 544, 800, 134, 997, 737, 220, 277, 540, 457, 194, 270, 83, 69, 412, 674, 278, 444, 134, 532, 468, 497, 453, 646, 755, 320, 96, 248, 653, 705, 705, 186, 350, 863, 579, 288, 823, 800, 883, 643, 529, 737, 449, 625, 1008, 180, 262, 565, 600, 714, 264, 461, 145, 360, 996, 250, 918, 304, 1011, 525, 482, 968, 450, 696, 468, 730, 805, 364, 909, 852, 250, 425, 667, 963, 475, 1016, 323, 508, 704, 969, 432, 669, 647, 453, 113, 388, 320, 611, 885, 606, 404, 104, 921, 442, 614, 144, 384, 769, 296, 78, 786, 400, 492, 227, 851, 340, 435, 1010, 929, 786, 1011, 463, 667, 472, 699, 706, 743, 546, 740, 894, 453, 168, 41, 1023, 309, 574, 659, 338, 31, 496, 946, 146, 627, 528, 257, 504, 615, 850, 371, 739, 928, 70, 377, 443, 174, 187, 316, 164, 716, 549, 219, 239, 41, 1017, 340, 783, 236, 132, 958, 241, 825, 198], +[335, 840, 221, 741, 943, 156, 969, 225, 937, 180, 288, 697, 783, 520, 255, 738, 958, 592, 923, 83, 807, 741, 144, 553, 864, 236, 361, 328, 51, 210, 6, 1017, 680, 822, 1004, 1009, 535, 930, 481, 175, 284, 165, 76, 677, 354, 765, 780, 627, 522, 253, 941, 574, 8, 287, 57, 734, 859, 729, 405, 582, 573, 36, 575, 760, 983, 860, 988, 376, 165, 412, 19, 835, 735, 254, 115, 557, 560, 1005, 442, 620, 14, 888, 627, 296, 847, 666, 51, 326, 320, 663, 698, 287, 321, 520, 1, 302, 327, 413, 614, 920, 271, 150, 1012, 261, 290, 247, 712, 985, 459, 2, 644, 53, 228, 405, 739, 423, 395, 941, 648, 77, 181, 992, 475, 97, 617, 252, 267, 579, 268, 554, 629, 488, 992, 760, 515, 381, 356, 842, 833, 914, 1012, 946, 151, 336, 626, 146, 550, 692, 260, 499, 851, 266, 675, 505, 854, 182, 85, 964, 26, 359, 80, 573, 308, 640, 567, 937, 159, 299, 236, 241, 812, 487, 18, 948, 333, 345, 678, 19, 677, 69, 896, 774, 548, 146, 869, 802, 29, 641, 166, 89, 843, 993, 159, 453, 913, 579, 512, 680, 544, 253, 603, 833, 244, 982, 396, 472, 759, 292, 954, 18, 656, 451, 351, 888, 721, 217, 68, 354, 111, 195, 325, 306, 897, 151, 879, 980, 275, 160, 623, 874, 763, 504, 558, 453, 447, 143, 843, 23, 984, 773, 78, 926, 530, 262, 3, 843, 304, 738, 37, 292, 860, 245, 471, 521, 501, 831]] + +tr: 75A821E4FF2B52A3AB3DDD0C77C3A9F96FCC9BE360C2B75C97D7F9DEC97D1BDDE028D36C4FE18093AF6C5794AD19F9FA090C19A76F05A7F3B930B11792A13A7A +pk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BF331E6D638B1FFFE8824C347E16B9D992FE95FDD825B68A5F54CAA876EE5A27E0FD5B5A895A0267F4B61CFD52E1E4EFCD108167C9AA92B781D6AAAE3C7159D934C1DFFE5A461D4C5E526E989D391DE00A09E1FADDEC8B774384AEA3C24E780EA7AE96368B0C2BF70A0E99CAD475760CC7C44B71F50E355CE6372D7EE0735702A57001A0751C10D6E743AA74B69EAF732E359281F3413D4CE40B59E106D3D8DD3564FA213FA00FD25F5E4EAB27BD774F163A8DD94A6861139D7FB07FCB1FEAD2C55452518CD8258187CFEDA4FE6DC28C54F404E14086E12773BDBFD0CDAC55C9A589029493926F07EE52C66426441B6CC3A56C6ACCC60958614A511304D57DB804AF7E5CF78C44AFDC6F7D830AFC2B1E98E113631AD4D12C40101CAA78F2669372B5C6EF96115715B18F215CF7A68EE7518AE902320F8DA67A354E82E876B5018A259A77CDF9211085F6407C8F46BB15C3CDE68505C2D0104D65EA71939337903E0303AA3CB424D1354AE3CB4A9D8DA0BA8378C2FB6320DE562DFF0ADEE6781815415E1BA48FAF1B8DBCC67BB0F8BE31640A392439AEABBA37BC0C9821D4361E4D04099D9670CDB74B2A2BF7E31F9E09E0D344D6B0CBCDFB5A601F789A27C75956C1F4E35D3C8E6B06A6741D64432A62DBCE5860120F06CD40361D8A2F7755E8A3DC1A408B054582A6BCFD52332DF9A5DCA40E8D2B021F180EC5996AA7CEBA2991286F4876FE9363B05C1A8998BC97D1C2D8A0F78ACC27E32A5C9FBA7D406DBC77FE3855E46DD49B6F8CECD6F69F4AF85EB1D40D1905F0C3119E6ECD0E9699EB00A5BD7D2D8AAEDAA10DD2284F959584B701C54BE425FE9CBF4A3BBBAD5CF726C64EACAF84DE406547F611626AC55DC18EC0B37AD8255A93907474987FD106F169D3461CFD77E355C32866C8CA18485F535F268F61611482838E25A86B3A60B892A0AA6CDD8A6354A16650E7BE46EEAC38B625ACF388A1A6AD039554B1A0734CD39CDA81075CD80EE63724E7B1322BA4820CF8B9BC5CDAD1C69258A20B888D2E6D7C6B0B3C4391DE103955FD4AC48B0EEB08BFB543CE01F88201B527EB8DC54C46172C2383445119C896A116F8650485D7CC5193A2F5060E0D368B0C1EAE2D5D743827433C8730F1A61B8C1C5093F2D06D588A5B2083517095AE4EB63394CF337281EF2C2E14A9DB625B3D538D5FAA4B6E9F0DBE13F147FC0260F5BA78716170761408D59B79794A191B96E66420258C02839213164EC8D333555B3C91FBAC4F33FB72976BB0A7BAE88E4FA5D1C2A29FC5F938F934AF5017CB24B32278401E177A6D4738D0BBA1179EDE6CA2E3C91C26C89DBBC9342FE543DCC0E21BEC793B3314F21DD4DB9AF73927C38A9D30252AE0F23F88FB8BE43B9F91427970B498A60B393165233486340FEA8DACC7EFC178A1EDE2B1C95C244A962F5CBF09C0AF6D3BA8F087C9483B75B675B99913D92F023BED773CD3D5EA57036C1D0DFFA33478B30B6AF1B9B0EE03D274A4F6B3A8351405DAAEB47412118804B47756626E60F59427F4122DD836CF6CB0940680DE45436EE698BB58E6813B580BF5D1869F2B3D0900CA958277AE0E33B605F64291DB4E4F4CB7E0954724A6222AD04CD37B542A3E667B52D5510AFC15950F44813A037A6FEC94AECC4C3F27912D0DE5456A64E506A11801B4CA224658BDC41A0A664B174F89F1417F99000A20A623F5B064D8FF58C61772F49BA4B00E9705FE11D6D364488F5C63045C914F8256F533F11286FAABD2F7E2E16F7DB234B5F807DC14E782EA141032C0D93B82590C4753DD72558DFCF +sk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BB149C045A55EADA0C519069A8EE0602FBEDA8D2EDFEA09CAE01D542D47DCBA1E75A821E4FF2B52A3AB3DDD0C77C3A9F96FCC9BE360C2B75C97D7F9DEC97D1BDDE028D36C4FE18093AF6C5794AD19F9FA090C19A76F05A7F3B930B11792A13A7A5CC0014B440814300C2225826042718A40620C25418B381163006402848DC0C07123434C0C80052323101BA54CE08051CB18440009100894291047281290292495652229722017210C2426990466610221002088DA926C4C2664E43822A4148689244809B4494B844D124270E1328024923009228854A849C14842882609941686C0104910B84101222504972911B28CE2202C83148E0BA72058C209D9848CCB129124C444D2320264002DCBB408D4C60121464AD430101904420B444D14B6881A85655C08085B284112080C10B48863A26D82384DD9042221412DA4A29084C62D0A228E42C000123524DB448423C1081997401AC25090B465D19241403012D8922814328499188E8A92851A1590634292E0282A43208C2049881083841A144D22004209096C4C4871618661222104A1C02D42484564488420826D802064043900E2306C138948E0802980160E0830420A1044024888A3122493A28DC8420D04438501207292381014B16089060C603230CC222AA0C0650047420C8040103331C9948191C26148846C020580E4886D8036208CB069D9104C10066258242A4834444430400316125A90649B4691408060A00690CC04089A86256336888C4266028965D2346060B80002341220090D0C100219363152A24093488ED2B601E2C820508249CB440D88882D601809A4986962B461D4C060C4206953408C2004229482095AA04D813645DB106E23824D14454120368010130E1A018109C010A2080CD2820D0B0200090352DB3265D3268DC41642001961188230C1C870A4A46DD9A851E2180462108E62240D9AC805CA026552986D5196205820104AB26D149301D9264C0C4905524071422660D4A40CDB844CCCB6215C36710C208159060C9C9868498080C3264913894D1AC26112C77010C73113108D4A082903B65150B490603262419251C8B088C8388DD8362C4A126C62302598A8088A48899C94900401069238401B1564E2A02DC8949041826024A270932006111005C82248C9988C8004219C98891A914442A21112426A0338699424528A107114A424CC206913932D8C0820D68932E6CAB4257F007558859915D3119DBA40D5E23225C1D606DDB7338ECA33285F893C62979505D91BF0CE00A4AB85E6A56400DFE3C3AC6DF1B46743FF5CB7279FC0FED4FC7DA7546B5E8BB48EF3EBDBCC32B2ED9F3F8E42B67960A10EAF01CD7C84012701895C0B43E5E74065B231167C9B19D7608748F662357FDDA261748EB44AFBC207146174D812E41B69B177DF4EA9E9ADA8C541845751F924342FE5B1209108AD57F90D66AB9197B135B91A64965CDB2AFBBFBF74688CD93032A82852A20CB69C26B0D5E000799B1EB51EDC006A4C73A6C555C1DB95B7F844AD8E3F08B0489B4FF720D35D9B0EA3E782D43016D4908885D749DA0BCCAE012C0E282E807E4AF842C4443A0527D62D769C1D09CB755ACBBEDC9453B08AB58F6AD4999495AA48A32801B5282123AD8097F8E3349A897308C59B32EDD7DC509E55B79AF2D7EF85E2741AD010118B1C242AEECA7E405EC3CCA9F951E44E82254DBA3CE2D8DCA0B1F8485CE1FB73EEA1F23CFD71044CDEF4CC05CF8FD134056B32E6524DD950E8AFE9155F5E309E0D9304166A0EC11E7068EE9C2AB61659709AA9CEECF7C3474E3061B9D580F9883021075A02E5F10ACFB20EE611E045DA345BA6A3DBBAC0456B6A3BBD00AC196E920560125D832514A80A68F0B5D32A5C062FD785ADB47C087A54AF90A25AADE3573F13C20DBD8A7DBC23EDDBA8C82177C7C9E3AE1AFE144343E9EBFF5D0D2F4AFFA2181E75BCE2A20D8055764991CFC45153E8DD19368307EA502F1E9FE9ACAEFF83F541F9D900749259F5F7FB52AC73A901522F200C48AE427BDB9D46A8655F5752FE7C0B3865CF79BD62538AC6D90C02CEF067E3A3F1A37DA28FE7C12CB6AE09037CF6BE78285CC38039738191CFA8264D192ED68D758718B90542A0C420C993AAD236600A787A11176A5328940600DEAED4473FA3E4E246D9AA629A5A96C755027D2DD7B42A10C2C1D8DD9AEE4529AF5F52E2FC3FB6E94E6E6400AC053EBFA0ECDC7D7B51336339AAC992749471629C487043853FF373EF44BF57A122B2C81629C2F530EAAF5FF76B42DE24D4FB51E87EBCCC15847F13E9B6AC5ECB4C44F83AB765D59A8FB9DAA85D13A80D84A2D151DC78739B54D754A89E88EE87331CD2845FC952716A684999081B10CFD3ECABBA346E64EAA328C510EEA170C7FEFF023926DDDD59C52DCDF1D4422CC9D55950371380397FF86260A31806FB8C350B12289FA0D7898CBC09D753CF2FEE8358D364304E9A03CAD19D10CF091B9E782650AA3B0EB6DFBB0D833EFD9DD307254211685880D8D4999A52078F4B5D338494FF450AA761EBDBBA4575581E6DD793CDF79FAB0B50C69ACDA5CA67D212368914F1B68B9A5C3F63C30F7ECCF8E34D5EA40D70F49D6A177F878821B5DB7337164E49424F29138D7DDC67AB91E4AAE157F395474B9502AFBDA2BD72D2F9551B0D3D41D55DF9477F5DF5542800D1681409DA49E30D4C05B38A678EEB5D78C6F602ACFF96C5BCBA08243D6138DBF48EBD4854F0D97AED1E9EEFB381016D873570E3B3BA942F17C2EE97D2BA99D3470DC73904361FAB66FFB9274B3939A15B75E798B81FF5E30866DE7D48276D572B71FD4B241B43FDD98E481C4AC45BF37D3C72F5557040E6E7FAE7736EE8B79DB8CDB3F976D4134669A5C716747D50E60843DD18BB1C540B92524C933BFD8E82DEBEB47AA964CEEF0BB5402F8A6C5DEFA8DCE7D3D59ADC93CF2840316F12124D36F451AC068539E3EC98B9D97CC4AF0330E733297BA72BB6BEA4445F54CF2220B297C87C4036F428850DA5D5097A54F588D9D0A393BDB16234517B2D512A796D95DA11513FFB797FF3000A272B318866693C03CC7EFCB5ED9FC51F2C5462E70F15124F983C5AD9627ECB46CBEFC9B81996E4C5FB0A8C19B71CA1ECFB2694D90746758F0AFF9EC625F0E10120428A20F92FC8FFBE955605D497FE0DF67A8F324C8CE22B3D2B026F632F34B7C2EC3BAE0DD2B30957633F977723FF4F2FF22109692A60C0B03C628A7290E3D6F47CFA73D64F914416C816B9EAB8EBF280627F60628CAD1B607F3B9D05860E48A632FB34AD55601F296D45970399BA2FED0E7EF1DFB031D792A192F685BB448A86791E11EE86DE1A789A84128A553856C69BC7E8CA59A3F8E93E088A9778F2FD59559BEDDD2AE1C258EA8114B0C2C3AA61F821ADEDEC72A36E941AF1ACAB8F1E073727E55F8B15A9BDF578524D7379E369C44D1918FB5C931487C52A1015095BDD5F72928A49F6331561393AD6EE55BC54B501747EEB0B4A0BC7074EED9CEF04E140C86F543A05C7D8D4B9C58DC900C11BCBCECAED16A3816D304A934C492ABFEEEC diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt new file mode 100644 index 000000000..011562875 --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt @@ -0,0 +1,88 @@ +Key Generation -- ML-DSA-65 +seed: 72C3C5E0CC9F332F49D0FC0FD6399DA75645A3E33DBF56F1E96897662D0A9B37 +rho: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F +rhoPrime: DC6A3A1A9734E79B41C2ED6F988BE18802726D9B975E35A656E6303C3FE798EAF9049E0DDEBBC32902605BCE6F2536B9AC71E124827025A1C4E4524CA6E39459 +k: 9B2E348E4865616680FC184376A8CCB8DBE598365A23A2723944F5351F42F474 + +aHat: [[[3482139, 8186163, 2372395, 3386819, 1143206, 2532484, 8052453, 4473490, 106443, 7179739, 507086, 3597062, 3935196, 4173570, 4894936, 73631, 3923816, 485984, 8303229, 418498, 4036494, 3329435, 87822, 2247277, 952450, 1978109, 2997645, 5170958, 7137052, 498572, 6902549, 5000158, 4440102, 6172438, 8254652, 7211061, 5854442, 3139758, 5893400, 7655936, 4531127, 2920492, 694997, 3700280, 1015307, 7330957, 6698948, 8190071, 7370326, 5031935, 6475609, 7449364, 821181, 2258657, 8177579, 342859, 1927209, 621786, 2591863, 8005111, 6471577, 2890207, 1607020, 1722749, 2444680, 1525424, 874519, 2912496, 3122222, 8121488, 14954, 6974534, 853039, 5043046, 2563397, 2968386, 7990895, 1126735, 4798433, 2401947, 1275283, 868219, 6004047, 2208907, 2722238, 2340420, 4128269, 6331126, 1974241, 7439181, 8252773, 1219710, 62405, 2800555, 5705387, 2872004, 41065, 493061, 2544170, 1158560, 4009348, 3142805, 7476154, 6828659, 7691796, 3548866, 8134542, 7765604, 5718455, 2342255, 510863, 5388852, 3800516, 938253, 6663034, 7645963, 242746, 5025356, 1847800, 2410227, 6437351, 4054057, 2058288, 1105810, 7244758, 5549033, 2838854, 7376749, 648271, 6116217, 3156383, 5607076, 7100285, 7217664, 1365942, 6316618, 4417786, 1418305, 8017787, 1921823, 2737106, 1977270, 7909604, 1659612, 2263825, 4223224, 4903412, 1092262, 3918378, 1438847, 1125058, 8347845, 1579301, 7446952, 7852836, 1225947, 977321, 3498691, 7212891, 918627, 1612511, 3803396, 8085172, 3891699, 5743866, 6941716, 219579, 6278823, 1585468, 8099873, 4315795, 8096204, 6503682, 3710042, 7627375, 2627448, 5126134, 6861330, 7140328, 5252709, 1481849, 2143309, 5989699, 1243249, 859264, 5272237, 1536840, 5653399, 6191690, 5659837, 435597, 4255912, 6260676, 7436604, 4285241, 458782, 6386431, 2374394, 538345, 7694314, 1454040, 416175, 4678198, 3575352, 6429995, 3545291, 3173558, 7889992, 3746243, 7911255, 1957610, 701184, 2995003, 3222046, 7941019, 5678653, 304959, 1450925, 7836173, 1066653, 4162595, 3349735, 5519259, 1610239, 527540, 5141930, 863259, 509637, 7725149, 6503527, 7635929, 5341698, 2869, 6057974, 7824865, 4185418, 6940188, 4827490, 3875104, 3278037, 6563827, 4940836, 1466788, 5790742, 4260142, 3825122, 6317302, 4911489, 6390531, 4276141, 3475545, 4800230, 3691606, 4956359, 3900278, 1672013], +[5438570, 2582029, 476691, 7191286, 2585592, 259673, 5132184, 5304984, 7471548, 6079566, 5747610, 5836232, 4384043, 5798278, 4102804, 6679763, 6394993, 818458, 5349407, 8335947, 6190534, 1208792, 5944248, 8199254, 7530919, 3770439, 1297150, 2031460, 2669841, 3132013, 524538, 5492819, 534244, 547639, 4670529, 14568, 3368987, 664855, 7875525, 4923871, 4462990, 3022074, 2118563, 2961478, 5907039, 692432, 1642953, 2610518, 7939355, 5509519, 4984306, 4122697, 1258171, 5452769, 5204721, 7840797, 2989959, 1701597, 297604, 3574666, 3707519, 2114222, 5005479, 4193750, 1668159, 4615160, 4437794, 7190922, 3613558, 1993108, 2138810, 312935, 3190082, 463665, 5177630, 6720233, 3731685, 5631048, 5978728, 7035710, 4117003, 7123630, 787266, 5464484, 1961082, 2033646, 6591362, 6639385, 4816307, 6683133, 5700568, 71465, 4946562, 5188973, 156042, 364133, 2207368, 380139, 527053, 3330429, 7501581, 3382499, 6372334, 416536, 5101859, 488629, 6338551, 7271446, 8270270, 4307424, 1451712, 7992496, 7603148, 3776937, 2438046, 4319786, 3707206, 389422, 6910972, 529208, 1416130, 4810143, 3935619, 7559708, 17392, 7886517, 371325, 4230074, 1741984, 3289908, 3195576, 6918528, 8079750, 2217284, 7416144, 7420576, 1580838, 1964192, 7916703, 5067297, 5119624, 204286, 1488284, 7332350, 6068193, 3753559, 6768045, 4213776, 7474293, 2548003, 7555890, 3553370, 8327619, 1999423, 6768513, 330234, 7061070, 7890760, 3017400, 3087379, 2633673, 2187081, 620210, 5247048, 2497916, 5122648, 5686129, 6744691, 7853553, 1708297, 4334265, 1310587, 2045700, 5928006, 4068358, 7539964, 3800637, 3167192, 8360027, 1690416, 6073663, 2828153, 1675142, 3724388, 3883689, 5880046, 4952860, 3707792, 7453217, 729439, 3070594, 5329750, 3362410, 2125123, 3043978, 3521393, 5703054, 1370925, 5406918, 1591252, 1303019, 1293393, 4227055, 3055522, 3358196, 176035, 5850238, 593643, 822974, 548120, 4734793, 1732895, 4562498, 8201655, 1410791, 3634893, 7931722, 7945593, 1573721, 4616392, 5355072, 5842947, 2980710, 1486907, 5095599, 336857, 7693615, 5611732, 6733969, 6197569, 4630263, 6271829, 2973178, 7015926, 7801236, 6215313, 7405116, 6871848, 2588139, 3760749, 95648, 7601471, 2589548, 2450351, 5048990, 97855, 6611633, 7065544, 341583, 1288022, 3078434, 6004158, 8187757, 4451491, 4933470, 2311673], +[6652261, 6541307, 6782340, 5753970, 4113496, 6955120, 3450748, 5458598, 960745, 4000649, 6166376, 411068, 6698363, 5711965, 2429410, 1513165, 2883391, 4190049, 1944020, 6178123, 6271809, 4405845, 5257683, 4887849, 3749545, 5969309, 6214374, 3811135, 1558680, 7433632, 3560180, 1410448, 2911662, 4972166, 4395531, 3592157, 7339514, 3664701, 2952690, 3545688, 7342895, 3073704, 2098936, 3420599, 5178999, 5470640, 955703, 5709101, 97334, 5816955, 1298574, 4282856, 7486521, 6273259, 1348516, 3119121, 8031321, 5085085, 3434472, 6765975, 3929320, 7604658, 1272194, 29271, 5468536, 7577414, 322414, 554961, 6821168, 890206, 770338, 2080875, 1168270, 2407478, 5612788, 4394170, 5478303, 193684, 2051261, 6972777, 2239394, 4750351, 3981553, 6551996, 687583, 6509119, 1817966, 4018884, 7205519, 7637188, 3003822, 2449536, 3415547, 969623, 2462280, 7905281, 4951087, 5841146, 3960102, 1092115, 5950017, 3213896, 2017269, 5297586, 5835272, 3695697, 269390, 4709564, 960828, 5030190, 1742791, 7388403, 3128945, 2906886, 6667421, 7177674, 4613596, 5209254, 2960552, 8227208, 6694316, 6711739, 2706133, 3817813, 3838022, 937045, 6864967, 4008544, 402088, 5807892, 428208, 3790476, 1318907, 2877469, 7990380, 3032242, 21451, 5885796, 465921, 4390846, 8043751, 4786736, 7136018, 3419177, 2157445, 2441359, 3891080, 4329755, 2841563, 3609049, 8007623, 1883878, 7682401, 1601609, 6003281, 7779390, 1122039, 4477399, 1553478, 890442, 7404340, 5361176, 5641402, 2081397, 6510144, 6920505, 4283596, 5634518, 6633841, 5191763, 5621243, 7196318, 4142022, 780212, 1635009, 947072, 3595538, 2085074, 5354220, 54931, 6159725, 7486772, 7126639, 2877709, 3205742, 3135622, 6182789, 2554015, 5262829, 1714468, 7164424, 6124899, 8079303, 195295, 4575362, 2633997, 4745366, 6653210, 6305797, 5945622, 6760103, 5035169, 1073413, 7444232, 4411889, 4220543, 4498261, 5917215, 920455, 5727269, 5075890, 7525675, 7689923, 5919938, 4013729, 1019013, 2681976, 5267409, 2354513, 2557662, 6259207, 4703693, 7484114, 7119571, 8309036, 3036680, 158377, 3117589, 6831946, 6899466, 7964531, 1369018, 2358610, 3665923, 5246283, 2844298, 3641762, 4812802, 7961027, 6097700, 2559219, 7946116, 379456, 7896221, 4209858, 286355, 8029395, 1077992, 6432603, 5872619, 4710598, 938250, 7602299, 2389152, 3270399, 905234], +[7985693, 6078251, 5840586, 6613275, 1381273, 8210977, 7550052, 6009435, 6242491, 707762, 2017360, 1331300, 2251714, 3679902, 7779754, 6773968, 5930500, 5014032, 4260964, 5422762, 2450300, 2027233, 1992753, 2754268, 432716, 7119874, 6162539, 2182505, 4125201, 4266091, 4925476, 8015676, 6508714, 4889238, 3462207, 4566275, 1835938, 5487005, 3720689, 1511712, 2664811, 3982532, 8194346, 3393585, 6007733, 7967322, 6205818, 5741452, 4544907, 4646190, 5519869, 3287901, 5923099, 2182944, 2064854, 3815742, 6686393, 4783020, 2177242, 6101200, 1037921, 5271868, 6411614, 5431009, 5976849, 6532476, 1783929, 7811311, 5786204, 4853687, 2633835, 3410959, 6628562, 4182869, 1947254, 3122941, 5982497, 3739322, 3332582, 5504931, 2895983, 2243285, 3717956, 1282777, 8290861, 30795, 2024107, 1210456, 1058442, 6796606, 4252203, 5751756, 5564439, 1378505, 1342258, 7725439, 8349669, 7569610, 488102, 4073771, 2460149, 6829223, 2639903, 2603860, 5449725, 956105, 616539, 5873432, 2079589, 3781342, 3775169, 3723442, 7393898, 309146, 185923, 4688590, 6811842, 123883, 7165280, 3949632, 1218847, 6196103, 8301369, 7177375, 1248430, 661857, 17991, 1955843, 4074492, 2052785, 7209252, 3733308, 376121, 6561163, 1148722, 6343925, 5018951, 7420833, 1654862, 4387024, 4348469, 6727942, 6547430, 3812313, 7695373, 3798270, 4707464, 7971766, 680887, 5116224, 3726638, 5766891, 7741411, 2256354, 4163240, 3720160, 398850, 7610548, 5149296, 6819280, 6135632, 3352453, 4358514, 3161739, 386889, 349172, 7040871, 5224942, 5272761, 2601070, 1278010, 7356156, 433242, 4003781, 2214156, 1583454, 8336220, 7686470, 4114562, 6578720, 6068537, 1161400, 6199508, 7773024, 5407288, 5980335, 3869854, 4440459, 5506390, 5067956, 2232381, 2029665, 7794356, 6025808, 6857280, 3403334, 7927056, 4662526, 5883067, 686166, 179599, 8201685, 174345, 5781929, 755052, 1115137, 5024525, 839187, 3257500, 5763330, 1215479, 1933585, 7223327, 5378528, 1749178, 419724, 4450447, 5043616, 3561734, 6935749, 4442718, 6971923, 670657, 6410415, 7246613, 7344167, 2660520, 2302586, 2470812, 3379453, 3508582, 5853335, 4418479, 1510824, 5224888, 4151395, 4792770, 3373493, 7586675, 8349439, 6280616, 7577210, 584543, 4384275, 4237175, 7176755, 7920996, 5563123, 3737229, 738334, 3572924, 1205638, 7046856, 1462701, 7012449, 5624468], +[5424179, 5787241, 4195854, 7735838, 7905232, 4574482, 2131536, 3311482, 6413372, 7626247, 2860041, 5132035, 8226949, 5223107, 1854983, 4793255, 852237, 3633582, 1672837, 4067706, 5202217, 876070, 3704970, 3156759, 1222948, 871061, 1455072, 4458640, 6457588, 7541960, 3202293, 1582312, 7650212, 1968461, 1052120, 3413638, 2942986, 5119538, 5519467, 5448651, 6346255, 1687389, 4471083, 863399, 6196820, 6493771, 6955590, 5009549, 2465220, 5358048, 7785064, 3653211, 7873361, 4610421, 170202, 7866952, 3563379, 4202280, 6315898, 5754033, 8133606, 4861977, 6376653, 1307325, 4258192, 7619018, 2800654, 6524763, 2607712, 3282486, 5913216, 1731258, 584855, 1618423, 4914143, 7031692, 3426098, 8246106, 1282852, 3019019, 7409207, 253703, 3334926, 144079, 2692066, 2264528, 6186387, 836918, 3267612, 6401263, 296232, 8151779, 463440, 6391898, 3183049, 3281309, 2159035, 4396983, 5304606, 2288026, 490467, 2163129, 6828117, 4005513, 1210901, 2253292, 803493, 4769045, 3881413, 5529444, 5801469, 4289797, 5840192, 7887002, 4520373, 6596749, 6604950, 5565768, 7467512, 7705507, 8305057, 819216, 6514168, 4716015, 7411049, 5752180, 297416, 3562660, 4924245, 6081708, 4831775, 892682, 1128522, 4554056, 7026900, 53640, 5975867, 3251505, 281219, 5507791, 6001547, 1432080, 1026919, 7449941, 583243, 5777121, 3745441, 3979561, 5076878, 1169144, 2528658, 5181148, 3811918, 7856529, 5255566, 8115892, 3295063, 4312384, 5455094, 7815256, 7545636, 3047804, 589130, 3414108, 6259223, 289623, 6578413, 1672078, 5087695, 7375364, 201820, 503803, 4953186, 4208785, 6345345, 1590631, 3100605, 3247495, 6024674, 6033243, 673378, 644510, 8143842, 6540547, 3874992, 424990, 6227253, 8042344, 7998417, 2000721, 2005396, 2995089, 4990018, 797926, 4819604, 4056907, 5742190, 7829418, 727939, 1691992, 5512606, 3904456, 7889119, 7742616, 840078, 5551261, 6736331, 918473, 2485394, 2281630, 6914943, 5451052, 3097753, 6477967, 1855261, 4739532, 996851, 12860, 3787948, 1651767, 2274626, 8309069, 6443873, 7718177, 8161157, 2028659, 3332388, 1485406, 3609939, 7995661, 3797310, 2084907, 2042975, 1877613, 3697209, 3447179, 6112980, 6049832, 7064708, 2287706, 4594474, 2006163, 1806106, 5139374, 4245180, 1207754, 4306656, 2991375, 6697138, 2534290, 8055506, 3594386, 917652, 58971, 4430633, 374541]], +[[4649733, 7839693, 1176635, 7094572, 8112287, 8378837, 7410710, 1675627, 6501946, 6304930, 2718622, 6410547, 6737589, 5080538, 5229488, 1497989, 6886819, 7227769, 2199632, 4770407, 6674588, 8026616, 8205559, 7671196, 7665129, 1456331, 7592813, 2609859, 3806907, 1693343, 2162068, 5869827, 3916365, 2700497, 1580059, 8072761, 4232247, 2376608, 3753206, 5896261, 3704432, 5019116, 1768168, 1361641, 8084289, 7490233, 6913541, 6721433, 6056051, 7656172, 703686, 7382463, 5808104, 4485957, 5980043, 7589848, 1522662, 2259426, 417832, 3734547, 1191862, 6790961, 6062865, 2028816, 6330195, 2022987, 749404, 8270504, 3890131, 2465303, 4369381, 1762826, 7432428, 1907802, 7309246, 7794531, 8320287, 894048, 2298801, 5816322, 5112430, 1354658, 6940249, 7786547, 1208385, 5797686, 6989393, 2446771, 4139336, 6510501, 6261181, 5999584, 6180245, 1060945, 2381010, 2485426, 2252781, 6432217, 7954960, 4709093, 7033059, 2461788, 1841251, 7337042, 2127699, 4068407, 7547222, 2190119, 2583747, 2050472, 2426161, 5843870, 7299325, 8344963, 6871491, 1006689, 2832911, 3925697, 2849735, 75728, 7198342, 4301374, 6092932, 3519448, 7060611, 1163163, 8084853, 1331374, 7962486, 7263185, 1910905, 3613143, 154624, 3664459, 6580470, 6005599, 7806387, 1919457, 7965132, 5621780, 6312159, 1596898, 6693846, 3946018, 4698954, 878298, 3432583, 6546700, 1195581, 3446670, 1565414, 2253317, 3624622, 7233247, 5344620, 3187464, 1628306, 4612362, 5101486, 1129890, 4498238, 445140, 6482994, 7821973, 2905913, 3294837, 3773129, 4472331, 5822506, 835089, 7572994, 2612091, 4724810, 5419319, 903190, 12096, 5554843, 7265448, 7673775, 1705238, 7044667, 6704282, 7199668, 7329821, 8237739, 2261075, 1377969, 7742820, 1695988, 5082142, 5591409, 2433714, 6319589, 2402496, 5694352, 4985742, 4916005, 3428981, 618443, 1183373, 452198, 5309330, 5370749, 193466, 8080875, 1425971, 1083271, 2350632, 1406924, 2358515, 4747118, 6078060, 6115880, 3200723, 4067786, 1570187, 2317231, 5503409, 8177615, 7294724, 5778378, 714238, 4361243, 814477, 67710, 5820002, 4640050, 2585379, 2362730, 4342168, 6806898, 2113205, 2361273, 6642001, 672748, 2911904, 7556621, 4545620, 332570, 201132, 1341879, 5806826, 4895419, 957831, 5228315, 4412372, 4167994, 1331918, 1154756, 6440185, 2836764, 3486650, 774979, 6361536, 4799719, 7160844], +[295054, 4576058, 7453620, 6444719, 3590039, 1205456, 1326657, 4179157, 3091771, 2655398, 7011701, 245782, 1933388, 5106078, 790836, 1182457, 2765782, 5179936, 7927656, 788893, 3955679, 2274806, 3335998, 304793, 7467777, 3553577, 7576063, 8009116, 2848170, 8248207, 6936451, 4779530, 1656180, 3713129, 750693, 5341445, 201552, 3379582, 3440809, 6125796, 1246801, 298226, 2636352, 9339, 4324698, 7723037, 7180306, 3744055, 1027669, 772725, 7557679, 2147801, 3539715, 3604642, 6770068, 7485658, 4802877, 6720431, 5163560, 1345830, 3322401, 6990883, 6289071, 1166625, 4015981, 3331105, 5175393, 3545816, 830793, 5953327, 1316267, 3370688, 6371357, 355100, 5588527, 5471224, 6188891, 6626334, 4156844, 5846895, 8331394, 1980847, 7388428, 4783035, 4919848, 5173976, 3212274, 6705265, 980121, 5719566, 6332092, 8376966, 3158156, 3518797, 689559, 181977, 5122173, 6055130, 4379853, 5860103, 5288198, 355722, 7708101, 318840, 4640477, 985566, 6422140, 6713411, 517495, 3072077, 2525827, 6312916, 466780, 4019614, 4735775, 417132, 3061069, 6310957, 6653291, 5878635, 1120440, 2572515, 3244310, 6979448, 7801207, 6345962, 6689911, 5944521, 7585391, 3125645, 3336969, 6987451, 4133329, 1531376, 4995244, 6974225, 1303244, 942311, 7276631, 8041896, 8004841, 754978, 2881510, 8377870, 3828014, 2187494, 3684950, 6074324, 4664242, 4578196, 4775636, 7062730, 1620373, 7693605, 7798882, 4616131, 531283, 178722, 4206429, 7405845, 3101328, 6945906, 7858104, 1524473, 554931, 5884296, 6618424, 7840706, 1010234, 2984806, 2710615, 267116, 2957478, 5576577, 6951222, 7889884, 379634, 2975498, 5484095, 4472044, 5247429, 4253642, 8325958, 7350115, 3503644, 4136644, 4635642, 1189636, 6471186, 5864911, 7947832, 3937732, 5732634, 287232, 4709097, 1824947, 1455120, 243852, 899868, 7219866, 1174644, 5271191, 3351561, 3742871, 1544200, 5137207, 105150, 2992301, 7137780, 8182594, 8200214, 2967438, 5964580, 3792155, 2965196, 6301626, 185698, 7750229, 4874808, 597790, 925099, 1529742, 5238433, 4030080, 8035192, 1675802, 2420361, 5942216, 1067874, 3763957, 7150703, 2199269, 815292, 8188423, 2211229, 7426086, 7073460, 6180198, 6635296, 4229795, 4682570, 662521, 5715342, 4539327, 8134224, 1198185, 4975549, 1299167, 1659968, 5463635, 6101082, 6747339, 8167690, 7941548, 283849, 6763969], +[7673148, 976616, 4457727, 6388970, 3566215, 7402657, 3350824, 3841935, 3275456, 7858859, 758444, 4163041, 7825743, 980464, 6300486, 8074614, 2315733, 7043423, 7802290, 2377706, 994848, 5278947, 2977991, 6267332, 2445398, 3800157, 4322300, 5016323, 7395334, 4405424, 1881905, 5068017, 5508466, 5904170, 4281777, 5858902, 2693953, 1505905, 7906719, 7100292, 1349783, 3686089, 8130816, 6578801, 5766856, 6070951, 4634193, 2643616, 3940231, 5878844, 642889, 8329892, 5144300, 3872876, 1225792, 919081, 7622480, 8121829, 179236, 7404907, 2062787, 6090703, 5398868, 4259682, 8190710, 4478927, 3496234, 1858313, 4938672, 4062419, 4559482, 3478599, 2311581, 3183370, 6169980, 4368245, 6056375, 5425139, 5206909, 2371100, 1499676, 2378411, 328020, 1956992, 4505079, 1050622, 675039, 6313202, 1376053, 2404858, 5895018, 655845, 338718, 2813534, 4167879, 6691679, 2147144, 1684798, 619895, 4381893, 4183788, 8234345, 1598272, 5533700, 7660946, 8199815, 3018534, 4303801, 6517618, 4954868, 864530, 8144259, 96738, 486887, 617388, 4184566, 5872303, 6915745, 1178465, 7434190, 6163591, 6337102, 2982593, 6370294, 5376964, 1944879, 1699775, 8358216, 8220123, 3785267, 1361959, 4960972, 5114625, 2831460, 7973822, 3050994, 7639689, 6880710, 6082505, 8209106, 719842, 2504803, 5876796, 3273962, 1182924, 3061631, 2361952, 3730379, 1965494, 395371, 938954, 5350881, 2295978, 4394194, 5906993, 3821273, 111850, 3555977, 7747492, 7876168, 3784018, 4882799, 3466470, 5361608, 2508006, 5103205, 5319542, 4862690, 2463938, 7696025, 5940580, 7348233, 3403000, 6921506, 6585536, 2035742, 1933570, 6150533, 7871734, 7038762, 3032672, 130289, 5001588, 480688, 3140118, 5491390, 2430602, 1416863, 7957419, 7735283, 6555760, 596960, 3289910, 1643826, 2202241, 3032934, 6366209, 1786, 5965164, 4866666, 1136863, 5385741, 5169399, 6078944, 7172410, 6720099, 2527901, 145524, 686030, 5660987, 5853627, 866793, 8178451, 6847177, 7361642, 1254079, 839605, 5654757, 7128472, 1856380, 839253, 359525, 5833885, 8297128, 70323, 4758322, 829341, 315880, 2644103, 7409207, 6524640, 729161, 6172611, 7137080, 2167806, 6864985, 3513950, 2104282, 3692923, 4481811, 3440227, 2193608, 4083676, 5548289, 7382506, 7573737, 2053959, 875765, 3477328, 705749, 8176119, 6077864, 6720077, 7997943, 7870436, 7852704], +[2720925, 7740388, 4654673, 5956258, 7403917, 6770026, 3547414, 1510133, 6593562, 2004045, 3809, 6455333, 3420561, 3548681, 4616473, 4184514, 5986836, 3901625, 3046054, 703512, 776072, 1136425, 7237732, 795340, 7198823, 2763047, 1556893, 5640853, 731802, 2468735, 7377846, 7678956, 7957132, 6107505, 5216562, 6422393, 7151753, 8270673, 1464261, 4516378, 7954024, 4447432, 2989936, 4404705, 3985161, 8242669, 4072027, 2884548, 7632118, 3421244, 6421485, 3831684, 2391021, 1787211, 5283053, 7055242, 2190098, 7093471, 3003786, 3637174, 1561848, 3299129, 3932463, 7614400, 5216949, 7494179, 6380879, 6204634, 6583631, 4083746, 4045638, 8170796, 5215344, 3579781, 6871000, 4806150, 3853073, 248833, 5270175, 3652955, 4518387, 2426767, 5707634, 7058720, 7098812, 4026175, 8227990, 4816939, 5531173, 2223099, 4663106, 6566278, 2376055, 7272019, 5108653, 3216965, 2708562, 1232604, 6690879, 56628, 7265995, 1973668, 5878316, 2300523, 6357550, 5753958, 2537165, 1985881, 1028257, 225997, 5712148, 5412952, 3244258, 2217143, 6902244, 6559259, 4309325, 1833951, 2580566, 6045438, 3362712, 3101581, 3783289, 6131074, 4398022, 5925983, 1193858, 1346576, 1980982, 2228003, 4621509, 1116643, 6491218, 6880830, 3413998, 1417318, 2733527, 5420415, 7499407, 1812297, 4399825, 7072862, 6130617, 944589, 4028424, 4367086, 4276595, 6569791, 7184576, 1949448, 4550637, 4628924, 3770861, 634159, 1203795, 931835, 5761933, 2717593, 106015, 6745418, 7436387, 4947479, 8101510, 2207992, 2616472, 4991634, 3876031, 389463, 4160162, 6672272, 1225685, 2227743, 5353468, 1766506, 4031787, 6149406, 2608927, 3777216, 4940824, 279906, 6860189, 8070834, 275323, 971545, 7211849, 7428946, 7543842, 374383, 1075485, 1215066, 8342588, 6759825, 401765, 8325595, 2511635, 704285, 2751538, 8200399, 1725124, 3146639, 8329362, 1540767, 3838272, 3863301, 776300, 2259226, 5597898, 7889667, 6805979, 7791123, 2484890, 4717779, 5452415, 7435801, 1438643, 2272868, 7940162, 776577, 1868891, 3251149, 1368078, 742232, 6393079, 3364179, 2119117, 1867071, 2811055, 4145292, 8230276, 251631, 8047523, 4569002, 7357706, 1905882, 635728, 8159738, 1558749, 233755, 4566175, 979751, 1714188, 5022087, 6380669, 1490067, 2816354, 1973797, 6649068, 1414546, 2494783, 5144643, 2776308, 3729744, 6652652, 2432888, 3972132, 3711142], +[552390, 2397067, 2887944, 7804461, 7234408, 1636118, 5562648, 7540599, 1158599, 4087937, 4987072, 5516104, 2098937, 675725, 5077964, 8312622, 1771356, 6650986, 7054654, 3023309, 8078404, 4797276, 622198, 4361887, 5715593, 6889201, 2074927, 911794, 39002, 6209955, 5006776, 5105033, 67897, 5249489, 5527340, 5591626, 21872, 7629883, 7098427, 5062124, 5980747, 5790611, 6745363, 674410, 6970499, 6384137, 5023368, 3186017, 820896, 2606597, 5695259, 2000842, 8114270, 6243168, 1786047, 2580993, 1183677, 3557882, 4173264, 5079801, 1396923, 3052443, 4300035, 7541635, 6074704, 2903400, 8330489, 5173144, 2560438, 2763259, 6154121, 4698521, 7946308, 2795518, 5218272, 7254964, 5356212, 7372408, 3140778, 4930850, 5579271, 2371776, 6843134, 2340632, 5648730, 1265097, 5355931, 1006038, 7750759, 7199519, 1881816, 1300085, 7925848, 531, 2160021, 5155874, 3538299, 582289, 8134772, 1265552, 3130768, 7985349, 2524206, 1405861, 7362435, 4254529, 7443457, 5615886, 1104003, 4305652, 5118570, 6090067, 4170824, 5647446, 5041804, 7060488, 2354280, 6185182, 5207064, 8154862, 6620403, 8190048, 2070036, 3934886, 3063290, 3900965, 4454636, 7397502, 4168861, 2893386, 677035, 337437, 5760715, 3371977, 3868792, 4526981, 5035105, 6329332, 2611369, 6129885, 1508860, 3846070, 1601252, 4450692, 1200474, 5995920, 3828412, 346593, 5040225, 2714309, 3198273, 2215556, 6162339, 6450017, 3573817, 3091688, 7603582, 7277688, 3308129, 4962936, 4977748, 6182533, 5584508, 4204721, 7064916, 1953962, 6228195, 973483, 2249192, 1208295, 1091124, 4100848, 6034419, 6602957, 1356765, 5122199, 7177258, 7899853, 3374139, 4957665, 2752547, 4556920, 2541013, 4205340, 7163748, 3557887, 3570256, 8367601, 7547882, 5556420, 5121774, 3435852, 4067201, 2627692, 7460175, 1650192, 3037325, 2547966, 6684611, 1372407, 4683867, 7498933, 5165643, 5646028, 1223719, 1568638, 2070704, 4660673, 900382, 8059680, 3687681, 511194, 5600958, 2923377, 4939747, 1575368, 6999579, 1447039, 7437421, 6437605, 3118244, 7286437, 6481393, 1519437, 3926156, 6532317, 6939248, 252472, 2912066, 8147034, 5027193, 2188989, 2189260, 3763453, 510797, 2082540, 4000308, 6381644, 3655600, 6428808, 1441509, 8109232, 2474473, 6897806, 1632147, 469528, 7308795, 6382619, 4537728, 4322543, 5607522, 7998645, 4944575, 2977279, 3186018, 3509744]], +[[3055621, 253220, 2141435, 5157504, 2299058, 5911211, 1650028, 3200129, 1107256, 1401739, 4299394, 7170278, 1220670, 2455171, 8127000, 256472, 5211715, 534019, 6881150, 1721208, 1069144, 2803022, 139065, 3585292, 7028783, 807646, 5280402, 6576372, 7298086, 1886604, 6756676, 1313290, 321382, 1193706, 6312231, 2943041, 4863328, 1492448, 4456718, 2473343, 6348835, 5255735, 5386931, 5456196, 3801817, 6130346, 4427080, 1337806, 7487491, 5390060, 3471001, 6631998, 4433590, 1393269, 2478925, 1601395, 5199410, 6438869, 680716, 974491, 5544108, 5255666, 7199509, 3554202, 5314312, 5203629, 3374330, 2938342, 1960244, 3969680, 1692715, 5677870, 6583488, 6577074, 4711655, 5080325, 6674681, 878315, 1426728, 985303, 7918432, 3308517, 1857576, 7009440, 2233492, 3664085, 1002079, 7863140, 2869670, 780366, 6205257, 957735, 992457, 1687049, 5769479, 2752668, 1955872, 561275, 3928936, 2901202, 4967962, 6375645, 5648275, 4512968, 3279378, 6740792, 3755016, 4383743, 6793566, 2876567, 3157952, 5373597, 5509035, 1209095, 6226160, 6079918, 2105263, 4885118, 996379, 3234841, 3856473, 2202884, 6803001, 4733265, 6643024, 3215165, 3807789, 3033191, 7731796, 3077585, 1950726, 2827590, 1528965, 7378054, 938369, 6986810, 1627824, 1964301, 1574093, 3432700, 2372013, 2881047, 1891048, 3156844, 3475634, 4106075, 7371347, 6553218, 4745701, 3656188, 8224210, 3966432, 3387922, 3622931, 6868638, 8378960, 7214763, 7939934, 5117256, 8158280, 974931, 449159, 7022158, 3771645, 814504, 3685253, 7015812, 681852, 5963253, 3070882, 1754957, 4742665, 3892152, 3173227, 1947077, 5514468, 7712598, 2683036, 2446204, 3749079, 2205171, 6622470, 7182184, 7544003, 738394, 6716574, 3715616, 8274323, 6915521, 5863544, 6311565, 8268524, 3731534, 27851, 6642560, 1376311, 279305, 1388191, 7344912, 1475984, 1415889, 5086930, 6893610, 3621030, 900598, 4030395, 7402016, 912363, 5837516, 6287088, 4486993, 2329026, 2194271, 2853280, 1968042, 6634153, 1162108, 4088513, 841196, 3493509, 432522, 4731749, 5370820, 3024778, 5922181, 5106080, 3556630, 7035024, 2829579, 8086519, 3210579, 317485, 7824967, 7204928, 5677454, 6392380, 5499575, 7241688, 7332415, 4332232, 4366511, 2981204, 6493263, 6093525, 8360622, 2805834, 7967505, 5254507, 8280828, 5627408, 4757805, 2686804, 2043932, 4897395, 2965455, 7805546], +[2934033, 8297616, 1753081, 793100, 2624086, 5951809, 2368924, 3642449, 3628337, 2510873, 843241, 3399762, 6049661, 1308811, 1844196, 7570107, 3776994, 4990759, 7872975, 600395, 95034, 2524756, 8302746, 7416617, 5830444, 749311, 5424318, 5889750, 4862963, 2090249, 949652, 3504011, 3629722, 2571717, 640148, 3785690, 6232560, 6304682, 7548921, 2176853, 5321451, 5399379, 5089236, 2463707, 5640565, 3958460, 6569065, 7080704, 6767461, 232282, 4657506, 4794136, 763365, 4867033, 6978540, 8215880, 390903, 2133527, 1948439, 6350529, 6069408, 2775020, 6856188, 8175317, 5101649, 7991989, 6747016, 3568420, 7041223, 2469731, 1496226, 319961, 6114810, 2363457, 520258, 2523724, 6980061, 3447694, 7344351, 4743537, 7036716, 2230249, 1063804, 186512, 7442234, 3302469, 3765313, 4832316, 1484791, 6648600, 40493, 7067851, 6171655, 5395355, 1812511, 6336191, 7245767, 2563825, 6519907, 3247422, 8072188, 4531977, 3623648, 4123016, 2777687, 7301043, 4788185, 3999332, 1715415, 8104856, 3978795, 6813107, 1793836, 201978, 7463566, 6440292, 1630326, 2130775, 8326886, 4335662, 3745029, 1783580, 3311166, 7273642, 7684685, 6245874, 5709086, 7129365, 5025063, 893290, 4738028, 3152906, 4339250, 323990, 6380078, 697242, 1057142, 3916677, 2318352, 7328457, 3952541, 8069142, 3087149, 3753932, 7712285, 2073167, 3602786, 4031034, 2489600, 8007631, 2658187, 6931803, 6794414, 6073204, 679778, 1805779, 6826805, 5110806, 1056117, 8220440, 8145585, 2994939, 6453278, 4889298, 2476777, 3163281, 2774114, 1964232, 5611187, 7255445, 3347773, 7069646, 2117202, 1205747, 7675106, 6828424, 670388, 5284066, 7983404, 892024, 6295518, 2081793, 2886099, 936294, 1521937, 4208382, 7135525, 6831597, 5535951, 7560651, 3994095, 2552644, 873826, 8298185, 1496546, 4968620, 4656784, 1956223, 733244, 7651365, 5833090, 5595051, 4769280, 3489548, 6902837, 6140860, 6104396, 927707, 16055, 83586, 3844274, 5709697, 6862059, 6790622, 8216835, 5921253, 333906, 4729823, 3607729, 5581920, 5809233, 7548353, 3256357, 6306715, 1089769, 5969153, 7653626, 2430438, 7621938, 340165, 7702400, 49014, 8102014, 7846758, 152676, 376314, 1740793, 2001213, 4433185, 5147164, 5937370, 8196885, 2995703, 1867220, 4044866, 7494937, 8108271, 6079753, 819107, 2428042, 4199013, 126737, 4576000, 7142502, 7596031, 2913537], +[7004300, 915788, 4014760, 79757, 1249838, 5284349, 1380057, 3808673, 955149, 5235039, 6803918, 4172312, 1747296, 5926216, 4424366, 2370805, 4876797, 164232, 457575, 2185733, 3428043, 2852476, 3788694, 1478699, 4840740, 4253222, 5148906, 6802279, 6992244, 2602415, 1823338, 6170057, 4098881, 6250120, 1064322, 4614149, 2213247, 5793055, 1064953, 1462604, 2564136, 2014015, 6836391, 3252663, 8350826, 2665021, 437362, 7270503, 2849352, 4551946, 5358911, 5867831, 5469480, 6233959, 3033636, 2856290, 1100934, 2788484, 3753437, 5615198, 2940259, 3465140, 92644, 7851538, 7578902, 1010747, 6418918, 3416893, 4089128, 7305248, 1211636, 2526384, 5542440, 6872305, 7453179, 5936429, 2635044, 6883772, 3122606, 128083, 1085859, 6505690, 276644, 7740467, 3411319, 2158805, 554181, 2200897, 6206299, 4732542, 6589619, 6163563, 3456612, 170399, 6636509, 5473063, 1956465, 4801337, 732260, 1705400, 7348160, 5083748, 6285514, 4056405, 5323757, 3628245, 7730365, 6697689, 7414110, 398817, 968148, 401278, 2175346, 6505994, 5220022, 971318, 7907419, 7209862, 4653328, 1981244, 1923032, 7798358, 5231389, 5464523, 6312095, 18876, 3461420, 5602874, 1092480, 268112, 117324, 6347549, 7159966, 3353668, 4624068, 3770635, 4807835, 6169692, 3677241, 1151250, 4134569, 3205422, 1990937, 8302266, 3136165, 4726757, 5837065, 4702797, 3853068, 1245117, 792180, 5818132, 6833287, 4280601, 1461304, 5613485, 2474325, 1406105, 1246494, 5648294, 318066, 5596366, 7871031, 6437049, 7127678, 7193752, 1217155, 5568012, 1914138, 4501985, 4547290, 6047889, 4891560, 3107106, 4393481, 2526967, 6819577, 186831, 1624443, 517234, 2839157, 6685749, 1553708, 4685694, 1857657, 5924317, 3515149, 7322247, 2133573, 114531, 6019365, 2286094, 2708121, 2552545, 4838055, 7789292, 880322, 5906624, 6045075, 2280702, 6213342, 2661784, 2585959, 6865080, 7297263, 3832535, 1995087, 5394201, 1571175, 4849545, 670836, 4366471, 8121890, 554050, 4038011, 1773881, 3670872, 3858605, 4230729, 2458644, 720513, 2300544, 711862, 950587, 4938225, 7014733, 4007060, 3574109, 5864814, 516179, 8262561, 6871847, 5196667, 2602014, 4225518, 6443215, 4213526, 3604806, 2994394, 7865383, 8353577, 6341909, 748909, 6457997, 6860778, 2615442, 6447455, 1257316, 4693995, 4811019, 7661723, 2287455, 4052841, 1445471, 8262581, 1169714], +[6306941, 7774709, 4867312, 8275210, 2044331, 3338976, 5234627, 1414527, 3016525, 572061, 7534689, 76515, 2143233, 2490688, 7497176, 5446123, 4556568, 7356066, 7367651, 503772, 1665224, 3666140, 6084674, 5724700, 5639967, 6028670, 4084018, 3754281, 7786483, 5086982, 2983489, 1905682, 3161550, 3223638, 6851865, 1142211, 3989833, 3173043, 1879280, 8224661, 6022037, 250507, 1963832, 4919151, 6394376, 7563425, 3198496, 1898801, 1252885, 7636652, 2635203, 7628235, 530443, 5615986, 1176260, 4421943, 2909765, 7540878, 6693600, 7453488, 2334820, 7558347, 4001115, 2873524, 1777057, 3032568, 1561480, 3606359, 4875930, 190172, 6848728, 564169, 807104, 4433073, 1253405, 2895868, 7531142, 6450499, 6291286, 6139401, 5660522, 53981, 938613, 5694608, 1253755, 1156611, 6156324, 3983408, 3724171, 5252103, 5707346, 7185348, 3736757, 8291725, 4818352, 1547651, 1216548, 3110142, 3125016, 5019683, 6303763, 1031486, 773817, 6825729, 2471424, 4672713, 6289242, 486308, 82094, 4620797, 2749820, 669585, 5599861, 2947421, 711933, 7162902, 7952293, 6710429, 2248338, 313730, 4487341, 8045092, 4505941, 310192, 6415414, 314111, 510561, 8208601, 8149650, 4775653, 1759521, 3433461, 5599311, 2521929, 2604893, 237292, 485899, 1536236, 6909059, 5390913, 4561530, 1442033, 1362623, 7576755, 7542217, 6700621, 2482600, 1689219, 3142972, 2418147, 5895026, 6229567, 5410923, 7349115, 4069828, 8179162, 8364381, 7810039, 712359, 470670, 1983179, 4710717, 7557829, 2576138, 3756181, 4524150, 547785, 4540205, 5990727, 3250489, 3818238, 1687569, 5950249, 2400784, 2109352, 6406111, 6637505, 1370852, 1438782, 7473311, 5951127, 7566930, 4205219, 1710569, 4160116, 2110211, 660045, 1917362, 2938976, 6884441, 1820725, 918348, 6765625, 49439, 1317964, 6393221, 257248, 6276738, 4359018, 3899372, 2015098, 6286283, 5755719, 7461733, 3800550, 7759176, 1057180, 4620505, 6591882, 8267796, 8169293, 2632727, 4101846, 5144561, 4760243, 5573383, 3993112, 392796, 8212027, 2031386, 1092276, 1436792, 6255511, 1145895, 5862306, 631388, 7665381, 7295567, 2708042, 206672, 8304625, 6931177, 7916214, 5813462, 7435542, 2015715, 7358527, 4791663, 1245607, 1602687, 6713400, 5149131, 5255498, 2698946, 3146678, 5019751, 7483068, 3133201, 5287101, 3382540, 8208299, 2728025, 7790396, 213621, 7797413, 4814107], +[7725198, 7633963, 6413316, 5731361, 7540199, 128591, 4821612, 6212127, 6810113, 1211955, 295913, 8354527, 46620, 8110900, 2275380, 4358642, 7475882, 962360, 6765148, 4961947, 7913442, 8015312, 7174556, 4789718, 554868, 7173551, 4909946, 4939143, 7047753, 3974148, 6662056, 304799, 1391145, 5836281, 7230526, 2614843, 4870362, 6857793, 3680490, 1134467, 2189445, 1210184, 51592, 7312570, 6780943, 7930397, 1691839, 7485231, 3567420, 7835737, 4753753, 1152826, 939007, 5965187, 4218637, 3946217, 1537980, 4448319, 4460847, 7918607, 6367843, 2140224, 5907316, 4796820, 2614211, 6586255, 7252180, 2098329, 4146903, 7854297, 321784, 928175, 4239850, 7777248, 2215564, 5011700, 7719717, 3737769, 88704, 4492584, 2142490, 6919256, 7575592, 1478996, 3911774, 4609333, 1301987, 6264586, 1265915, 7812262, 1692583, 2739677, 330770, 6184163, 4265861, 1725064, 8264332, 2284959, 4280533, 2904889, 6308067, 1875808, 3551751, 4485197, 2919505, 5486281, 4962134, 2527742, 3514385, 7315132, 127784, 4261974, 5263238, 5604075, 701909, 6280390, 6938821, 1044613, 7964520, 5692118, 953681, 3053227, 1197544, 4281457, 3780231, 1252185, 4708165, 2003187, 4084457, 5656519, 6958325, 2319997, 7506325, 7123729, 461165, 1094623, 7708501, 3541434, 3519289, 7563098, 7689586, 1356003, 909606, 7643653, 3974702, 6505031, 3125330, 1293218, 1075280, 8365159, 3704791, 6981222, 1458188, 5578641, 3519482, 7039078, 8018178, 1293101, 2397652, 6480515, 7775610, 3789047, 4121076, 770484, 2594083, 1269742, 3009655, 2618649, 7470252, 106878, 579576, 4107756, 5830590, 7658936, 4114194, 7382598, 4924833, 1283335, 3337297, 946497, 5957185, 6917627, 438705, 3370248, 1388398, 1306034, 1739123, 4667024, 1169520, 5153243, 3310558, 2308490, 630323, 5634896, 5540694, 1732900, 3673596, 5506979, 117526, 1414140, 1573157, 8052668, 4726471, 6565859, 2546967, 4586608, 5724294, 7373799, 3246474, 3897553, 3381936, 977587, 4059367, 1971969, 3391071, 7073920, 4174108, 6147634, 6591619, 1742301, 535757, 1327059, 6006653, 746886, 4707665, 1870228, 2875071, 2540565, 6390950, 8200707, 958398, 2458544, 1345519, 3628746, 3908788, 1290047, 180666, 7424037, 8156840, 6313699, 6763647, 4618455, 7133896, 5471329, 4839920, 2276882, 3624163, 3496914, 842488, 4867623, 1225302, 2682877, 2935131, 8068944, 6712065, 4352260]], +[[2230647, 8114300, 2009753, 6160015, 964480, 2776573, 1434730, 8286757, 7826461, 1928132, 6381276, 5760852, 5271830, 778443, 6247865, 8064890, 4902308, 824385, 4166061, 401113, 2544470, 7456396, 5789009, 5618655, 52382, 6560128, 7574048, 2375317, 6567849, 2218260, 1765451, 3427376, 1529911, 2425189, 3402507, 2917371, 6466665, 321766, 6229265, 7144743, 7517647, 5320468, 1634459, 289829, 2575648, 4137523, 6628123, 7231666, 4827826, 590104, 812432, 414012, 2762495, 8077397, 4605082, 2445727, 1570435, 607649, 6218115, 3396240, 5334715, 6019834, 6398227, 1355655, 4766910, 5550481, 8167214, 4945167, 3377581, 7765521, 232365, 6513523, 2670832, 6284903, 1576458, 7552370, 3016137, 1919684, 1214537, 5265124, 3897034, 4275602, 5673933, 6488981, 1901516, 8345439, 7215886, 4013147, 1424849, 6049087, 3507779, 130594, 2966912, 3729077, 5837328, 5382410, 485952, 890878, 6421734, 2604218, 7145929, 4154744, 7606349, 3521902, 45521, 885705, 6929374, 4572360, 4532033, 3794668, 3446050, 6717990, 7326382, 805389, 1768134, 4791081, 2564396, 3035513, 1765969, 4941897, 3601056, 1285055, 5786668, 3074502, 6958764, 6226273, 4841883, 8035522, 173242, 949526, 5938505, 748194, 4367652, 809363, 2631803, 7474065, 4401080, 3125667, 3331362, 8152088, 4084259, 7959402, 528168, 899913, 1789941, 4832677, 5586706, 4668105, 7744976, 7936314, 7796491, 3210882, 615566, 5304143, 2345564, 1366023, 4399492, 572238, 7115627, 6610000, 2680511, 7876324, 365109, 5142308, 925931, 3103788, 1553894, 5416703, 3523589, 2402997, 1486436, 4144435, 6655586, 5673032, 5088045, 7080206, 3071709, 5848767, 1408124, 6083879, 2884119, 6132034, 5466614, 694013, 6513332, 7374256, 5378010, 1815615, 4064765, 492366, 6977808, 551960, 1664460, 4235034, 407168, 5185875, 6316934, 8016846, 7938257, 434355, 2756281, 534876, 2767228, 7662910, 6901934, 3307514, 2061288, 3120142, 7919340, 8265625, 5240439, 6261323, 5678950, 5385669, 4294662, 661073, 1100098, 1047288, 8035780, 7508659, 2660967, 5876031, 6246217, 7138581, 8085651, 5800642, 3836080, 6443466, 485623, 6579487, 3227494, 1986494, 5501317, 494115, 5569335, 6558588, 5985291, 2978816, 1478921, 7416740, 5955468, 3738566, 514983, 5654387, 6829429, 8221325, 487459, 5657651, 1659466, 850825, 1157901, 682934, 4466581, 1300485, 3879090, 1964252], +[1447243, 5620686, 6178370, 2927328, 2053160, 8379945, 637580, 1710660, 215651, 2686398, 4635947, 3299001, 786702, 5713347, 6296038, 764103, 4014072, 1829355, 7306631, 5330815, 7788907, 3553201, 6534665, 3986428, 39728, 319160, 2688271, 5018337, 3947302, 4388085, 4476493, 4326410, 7449058, 341058, 4162017, 1563824, 1424309, 1278603, 474356, 6544600, 6006749, 3417744, 2201620, 6187661, 3971624, 1535590, 4003829, 3180496, 2259235, 2321216, 799675, 4198649, 6224123, 8812, 5962513, 8327521, 2584609, 4831997, 5609889, 7512167, 1031982, 3658032, 6843123, 526728, 5499354, 7039986, 6080893, 61965, 2816968, 5835659, 7317174, 2901191, 6642010, 2795099, 2883396, 5988771, 4469319, 2681531, 3562245, 1453476, 3945504, 5414567, 4829362, 4408466, 5121056, 3977730, 8046180, 2728908, 1537034, 2352391, 8138158, 6602423, 6851918, 2007718, 2885066, 1578919, 7741938, 7117103, 363606, 3595016, 6530487, 6715289, 8250330, 6808816, 3421706, 4292350, 690376, 4334390, 2061098, 8077603, 3578893, 8326019, 5918422, 7850347, 7350435, 3329135, 2755897, 6946695, 1789268, 90697, 6241727, 1908885, 8099228, 1764305, 5147316, 3949393, 6071272, 8036544, 1408179, 4874737, 4918134, 2407641, 7673380, 6748056, 678880, 2132429, 4298221, 7371316, 303536, 7106030, 7441862, 5619936, 972591, 6415746, 4434530, 1990393, 3245767, 7572520, 8327693, 2054359, 2678403, 3998838, 7177390, 6403085, 475604, 4792922, 2042394, 8007153, 7269030, 3796442, 4143932, 5682906, 2688232, 5715687, 5003153, 2821005, 4492433, 3610176, 2316781, 4577067, 5333184, 996016, 4266736, 188914, 7639190, 916177, 7606580, 3420092, 3749927, 39067, 8217460, 3428519, 1735347, 997420, 5519613, 7708246, 8151013, 8166126, 4727460, 6435299, 6015714, 147151, 2149168, 7818834, 7524475, 2613942, 4248100, 2606354, 4773390, 1100816, 1437050, 4007596, 5130815, 6861544, 3393695, 5021827, 8082026, 2494149, 2509387, 6222739, 5897215, 4896468, 5858459, 2670235, 1338970, 5961099, 6704452, 7145979, 439882, 4455545, 1009931, 7585055, 6479916, 3566314, 6201691, 6927266, 6642585, 3464687, 2041050, 6608642, 4228311, 4917483, 920129, 105613, 3093131, 8367610, 4471627, 2174513, 4028834, 1353748, 998576, 788257, 28562, 4400906, 2305415, 1848367, 6919803, 190949, 3132264, 8043528, 8204826, 6996812, 4648639, 7607010, 6315383, 5645967], +[2633358, 8012073, 4614158, 7402919, 4177768, 8066715, 976119, 2606421, 1463127, 6710633, 8115362, 8056063, 7038303, 6310141, 6252073, 460936, 7872668, 2519829, 1763824, 1598684, 5205205, 792019, 1159548, 2204542, 3401458, 4218415, 5667204, 4280073, 3316597, 1583405, 4553530, 3209900, 3437049, 4063983, 8016632, 3013033, 1105381, 1837783, 1483525, 8008074, 4794925, 803237, 3314056, 3616840, 917960, 8259636, 197108, 3765335, 3221202, 6396137, 5033394, 4987300, 731227, 7251946, 235929, 5101551, 388187, 6385402, 4565710, 3314221, 4255767, 6295373, 4415471, 509580, 1065458, 4261189, 3366598, 4251340, 7054266, 6167956, 8318840, 1189308, 4661019, 5792949, 7745732, 5582884, 2201435, 1757766, 4858355, 6783438, 5238584, 6518297, 2051283, 5375743, 6477715, 2474929, 1736279, 499111, 4970183, 1263329, 8225082, 4931793, 6567664, 1515304, 1153074, 1431602, 2596616, 1178996, 1694760, 2947734, 1277533, 5433842, 1758876, 8224960, 3311951, 8160582, 7354266, 8327057, 5422142, 4129076, 1089547, 6320367, 5128612, 7028489, 2250803, 3375655, 7333112, 2114942, 178201, 452543, 5682149, 4092269, 409941, 3614504, 5840528, 253451, 5648709, 7802525, 884904, 1176231, 1941768, 649975, 6808430, 6185770, 1172496, 1348050, 1187504, 1587907, 8170186, 7733096, 4297553, 2880262, 3967130, 958243, 7204757, 975214, 4714606, 3501725, 3966694, 4683176, 2594458, 3814653, 7289713, 1538335, 6901735, 179264, 2167534, 2371293, 3327312, 6407030, 3536679, 7292391, 3803808, 744960, 1658073, 6220343, 432825, 3583867, 3276034, 1815634, 3793807, 775320, 3467861, 4729047, 5015819, 4149457, 4352844, 1838156, 6519188, 5023515, 8321918, 2308603, 5508306, 6687349, 3526905, 1582122, 3852955, 3275934, 8347110, 3513550, 3201175, 1430274, 3071325, 4259249, 2587055, 418391, 7047811, 1659962, 430037, 2288575, 5777361, 750682, 767218, 7606467, 5634350, 8184239, 4401779, 2210697, 4328353, 3418137, 4590872, 2804016, 2964565, 2998340, 506031, 1661014, 4250082, 2560737, 6909470, 7879522, 6478429, 8280523, 7316392, 6280350, 7364993, 1348647, 5643723, 2376106, 6953018, 99699, 351040, 6035548, 2957015, 7034638, 3580185, 3693283, 7412696, 1329858, 6232103, 1824743, 7444500, 7050783, 1175508, 3731989, 945925, 5782026, 5886507, 4247009, 6896541, 4161222, 5085319, 6796105, 7736084, 7593603, 4558951, 5926830], +[7719462, 5722654, 6611372, 3364567, 4051125, 3017073, 3813789, 5286110, 2633777, 8119331, 397713, 2853073, 6647612, 4607685, 8271234, 7960935, 889189, 6996793, 7352920, 7076784, 8122706, 5646135, 3480699, 2001396, 8343630, 578611, 2400041, 991225, 2364988, 2495406, 6597455, 1537939, 964506, 6224803, 5033136, 965646, 5970270, 1349284, 6592701, 7617898, 2565632, 5016439, 4707919, 1971085, 6393286, 6668038, 1059679, 3785439, 4332815, 3969519, 6712897, 3940667, 6797030, 7875332, 4571412, 2729173, 1305651, 6880393, 2033747, 2001062, 3725693, 5771256, 4150814, 2219099, 371329, 1537977, 4572869, 1558119, 8367599, 5477770, 2002258, 4180558, 3856036, 5869694, 7117910, 600507, 2570674, 7643147, 4101426, 3454214, 4096396, 7886153, 5913513, 2458291, 7539254, 7539870, 8174184, 2529394, 5713014, 8229248, 2316805, 7689214, 5841153, 5782592, 323101, 7178422, 4065713, 8369754, 7413568, 3408764, 1948480, 4253162, 2183891, 7106418, 8152939, 1088546, 7437659, 2185432, 4524755, 1455020, 3305025, 6939890, 2178559, 7995739, 8017872, 7420487, 2612547, 7139562, 7054699, 4909384, 4831949, 2000688, 47605, 874626, 4748872, 495333, 2009762, 2995737, 5481078, 1793223, 4538157, 1190074, 6252182, 3402118, 3647359, 2527984, 5090505, 6099381, 7005962, 5975558, 7115240, 5771754, 2567782, 2857616, 3726181, 7896232, 4737374, 4062726, 6632136, 6866967, 212626, 3620973, 6871445, 6809980, 5725339, 5816786, 1361967, 5022066, 7011527, 944152, 6680505, 1087473, 6382477, 2093949, 2515501, 4488141, 6017968, 4191559, 7725325, 2747270, 4742058, 4570474, 7914837, 6441631, 7163410, 5216873, 1807200, 2484437, 7795428, 6827133, 5001449, 4604074, 4710693, 3178833, 7548361, 2308297, 6862214, 2503462, 8249598, 1457503, 4856632, 6827292, 5446755, 2097725, 1852099, 7175902, 6079018, 8147852, 5264284, 1009213, 6943902, 930258, 1156024, 3948112, 8137925, 6913293, 6525276, 8247398, 2400315, 5557492, 1693667, 1343057, 3588050, 95866, 204428, 5574318, 2063419, 5724793, 613983, 7437871, 7417235, 1894388, 6142649, 1313613, 6488513, 5183001, 17528, 6579339, 6408933, 7471280, 3068306, 193493, 4303865, 2208984, 5094311, 3172978, 2493620, 8330198, 2559792, 1180075, 3818880, 4319971, 2828216, 5316937, 845856, 5388932, 1903842, 1585803, 5132327, 3694398, 5556569, 2763003, 6937062, 8323531, 198887, 7959418], +[2448101, 6662568, 5874963, 5604877, 6083714, 7422096, 1062595, 6414757, 1140955, 2557662, 3884050, 1802161, 6748290, 6002932, 263524, 1167400, 1138609, 4043733, 1645166, 5003376, 5601973, 872422, 7065530, 7478649, 1065817, 5489094, 3811882, 6741964, 1750533, 1263510, 1298505, 1674670, 2936553, 3830044, 2123995, 6675587, 473052, 860110, 3015907, 3394151, 5822441, 4324208, 2606049, 6916089, 1924704, 5015846, 7285223, 147747, 3301757, 2216756, 4109216, 361004, 7832614, 5648159, 4141204, 2810727, 919905, 1713227, 7664503, 7047150, 6653800, 1600239, 5863601, 5672026, 505557, 3551981, 2940849, 1721032, 2477018, 1781291, 3530039, 5252448, 7475581, 333059, 4319253, 4037608, 1373871, 2204658, 4441165, 5246563, 1702199, 7093105, 8186401, 5862789, 3418917, 3669080, 8309153, 4898700, 1230456, 4404771, 2696894, 6497796, 4060020, 7930979, 5401114, 2081042, 2383411, 166430, 7090163, 915221, 1555237, 1083212, 4725733, 5286841, 7895883, 510760, 1439114, 5056961, 4522705, 684817, 5607509, 8098199, 6899806, 3979574, 6573821, 1240014, 7301853, 2383038, 1286383, 671193, 5851630, 3131347, 7923600, 66660, 1033456, 2408019, 6279889, 1990999, 6743479, 5650287, 8364278, 6885120, 6297668, 3348575, 8082875, 4067622, 3001120, 108710, 7140829, 7454466, 7228357, 7753743, 4784758, 7938260, 2353293, 448060, 1741928, 4195511, 1444911, 7456189, 5797026, 7230325, 1963453, 8185828, 6645764, 2645360, 3387555, 3560684, 841748, 6733204, 7477370, 5323454, 5356731, 4355825, 3821903, 5935629, 3274735, 3499523, 33508, 4914753, 548478, 1547134, 4686241, 4261010, 5535676, 7271238, 4680782, 1786078, 4493001, 395569, 2771325, 8057297, 49713, 304073, 3820650, 2940210, 7067325, 6879599, 8245804, 181380, 3308495, 8094819, 3047305, 2789148, 62896, 7654120, 8108111, 2201816, 2877597, 6635771, 1344133, 3858162, 888948, 4421713, 332327, 5671599, 2418696, 7286413, 5750110, 5932576, 6293950, 3546890, 5110277, 7733545, 5351593, 3785957, 3529257, 7666301, 135821, 1229858, 5333976, 1765, 4829907, 3662381, 734995, 991668, 3740864, 5265890, 625546, 2977582, 3255087, 2473716, 7083704, 3085942, 7898217, 4016531, 1290850, 3116360, 468819, 6650965, 2909700, 540831, 1055724, 1928242, 2660764, 8033425, 5611670, 2417446, 3930125, 1603155, 8270157, 1690991, 6073329, 3929254, 1690826, 6569610]], +[[8378172, 7261396, 5774731, 3383062, 8134772, 327996, 5867237, 156926, 7571321, 8181947, 2174378, 5150583, 398664, 2615313, 5462278, 1767273, 3069822, 5235680, 7395268, 336945, 2361199, 3860627, 881239, 4039430, 717041, 863270, 6881696, 4626978, 3814261, 7262728, 2551891, 7655943, 5754678, 5966132, 3877827, 3459173, 996670, 7177032, 4804864, 5739081, 2426055, 2406161, 5906587, 618350, 3078371, 6371837, 3750844, 236931, 2944786, 7719491, 2026948, 5708079, 5144017, 1116840, 566791, 786675, 1889499, 3721243, 3555113, 1492396, 786022, 5133526, 64287, 2850588, 223842, 3356616, 6019049, 4448757, 653088, 7528829, 275584, 159038, 3825558, 3088354, 7310264, 6818674, 8100566, 7898348, 6899249, 2388538, 8027198, 5146602, 4536220, 147290, 2739203, 5732549, 5350912, 1080915, 6954879, 6318264, 126478, 5018822, 2998648, 2664339, 6380753, 4469679, 7208907, 5139534, 1843029, 4404400, 6848207, 1246585, 1972847, 4950392, 2321710, 4066298, 2260960, 1636871, 2293718, 2825493, 7132562, 2264623, 1588961, 5572512, 679649, 5653745, 3933144, 6063773, 7017612, 708930, 1482318, 1954880, 2620537, 2579769, 8371394, 704957, 2322241, 3525431, 4391789, 2965048, 8296739, 2403301, 3737582, 3502164, 7645780, 7803912, 4789693, 532228, 2286600, 2384577, 4517864, 3098080, 7439329, 5366348, 5649621, 4102794, 5832211, 2964632, 8039831, 2702049, 3023443, 7632951, 93020, 1503213, 1385910, 7751722, 7834955, 4837419, 953137, 3916441, 1799221, 1239998, 7528965, 4534011, 4007163, 1743812, 899153, 5476667, 7117109, 720840, 6957303, 2628706, 525728, 2936528, 7573821, 7403145, 292045, 5095538, 1490127, 3157777, 6107727, 761277, 4416143, 1445990, 3206103, 3673733, 1350712, 6316924, 3819606, 2974114, 7931170, 6823643, 1757358, 7655988, 4285178, 6372337, 6269041, 5922888, 7897407, 5375515, 4906342, 3783319, 5408993, 3695194, 1236717, 6077962, 4985635, 5681758, 3394323, 5112356, 7751802, 4474140, 5070570, 6285174, 4652935, 6343648, 7398041, 236740, 8055614, 2064037, 3374243, 5990043, 4234588, 7393399, 6027458, 793788, 4052971, 3381784, 2568259, 490959, 3725665, 905499, 3001459, 5604553, 1970875, 2534467, 1057659, 2386099, 2827205, 7706946, 8318239, 7984859, 2275073, 7433410, 6766113, 3775440, 3040270, 1879535, 4706333, 4048350, 5362283, 1000944, 98332, 1951613, 3586865, 5997392], +[3732528, 2713657, 1007895, 4575674, 3274828, 7221646, 4321978, 221931, 6165071, 5626098, 7020551, 924080, 6123235, 387320, 2955856, 1599048, 1375616, 6048544, 5367153, 3312832, 7005254, 6384379, 4421814, 3686336, 7170222, 5435143, 4324653, 1672347, 4144340, 8185570, 7813524, 3647085, 7746831, 676210, 4899482, 7876481, 7075033, 4909107, 6581915, 7044011, 93817, 6687894, 6271672, 6112871, 7118660, 7953389, 4252727, 6946583, 587624, 1285194, 6955090, 7821106, 3722438, 7584598, 2258605, 6166621, 5568090, 1979813, 2767741, 2893454, 7806900, 2992025, 2999962, 1674020, 4864498, 7896007, 6618013, 2645549, 5022311, 8158836, 5892004, 2200306, 7830786, 1282481, 5655627, 1297423, 5710739, 7968477, 7793938, 553508, 8162833, 6063214, 6391781, 1450009, 3449768, 6465817, 2301921, 6478017, 4639978, 4167968, 278099, 4250332, 1017061, 2231155, 7923956, 1065047, 1957822, 3920677, 7873947, 4235976, 2611513, 4299471, 1960770, 380488, 5842234, 4151221, 4192892, 5166817, 5314549, 1153641, 3806050, 5744914, 6414130, 403410, 5323246, 7924239, 274257, 7572400, 5420842, 2358309, 2741442, 1944105, 3101909, 6003341, 3437601, 2775012, 4874491, 8158860, 7074931, 4005764, 1389997, 6392552, 3819548, 8244348, 1882476, 867156, 2492975, 2065949, 4193719, 8189751, 6099978, 3177488, 7192838, 6063162, 5553343, 6560004, 7924009, 8115515, 7188155, 5178023, 5350070, 2433724, 8349022, 7906338, 5789494, 38113, 2880062, 5281680, 4787827, 6885557, 3506618, 6600717, 3542598, 2151794, 6303066, 5335626, 4549739, 6272279, 2118779, 7213175, 5643972, 1372897, 6876333, 3273922, 8291828, 8114789, 1422088, 5270784, 2807105, 4733039, 1786329, 310417, 1114158, 6097916, 7823578, 4247911, 7152325, 3054769, 4906132, 1156065, 7962085, 4928356, 3747252, 5408792, 7358401, 6515934, 4459367, 2089865, 958051, 3397642, 5514349, 3439351, 3228489, 359335, 717809, 4857118, 4915481, 1371058, 1694560, 1878103, 7286787, 7187966, 2702372, 7185278, 3700841, 6718785, 7909221, 8304523, 7206518, 7641358, 3806321, 691483, 3775532, 3397093, 2505747, 5636797, 923495, 5233998, 1283414, 4117711, 891197, 2038798, 6305997, 8289532, 4638172, 3121108, 6212076, 3106269, 3592892, 770680, 6241295, 4615470, 840274, 1198665, 5001169, 5555325, 2736418, 4799737, 5361891, 723808, 7984418, 7450820, 5679426, 1368683, 905892, 791173], +[7495, 1396935, 4005406, 3108302, 8043426, 3536632, 6701684, 5167442, 4942030, 5210685, 5233371, 5596218, 6734161, 7783665, 492697, 6743409, 2517369, 3962936, 6270186, 6587861, 6028806, 52664, 6319465, 3346214, 6817642, 6329698, 3544930, 3665145, 1345646, 4200001, 7151149, 1792889, 3556688, 5926264, 3910765, 2438774, 7719663, 3509727, 2150901, 6701953, 6124892, 941767, 6310791, 2119047, 7462993, 944258, 333227, 276385, 5072246, 1819631, 815587, 2503199, 4781950, 5948502, 6651298, 6967753, 2977648, 6882829, 3365399, 3482728, 2612714, 2038485, 4964122, 7811329, 7996976, 6757901, 7843574, 1311716, 1262226, 1859222, 7640047, 752714, 501463, 1367067, 3475559, 6987068, 3942128, 8048793, 1701358, 4612647, 4729972, 5713514, 857281, 1980447, 4024295, 3152782, 5439583, 6912271, 7915433, 1518400, 7301337, 778640, 5113676, 2725337, 267749, 5701730, 3019222, 6869273, 5879802, 508003, 1039018, 1384051, 328908, 4409776, 7177984, 5240747, 30356, 8190683, 3025379, 5518282, 5689312, 7390019, 7516418, 6235620, 2333729, 1261037, 3846185, 3365562, 5154571, 6130023, 8210723, 7462966, 7122619, 6676521, 5165338, 2563481, 7664721, 4731854, 1102595, 5187125, 5045893, 2533, 780, 5753260, 6399754, 55466, 4186497, 2064623, 7356499, 6788470, 8126671, 3399735, 4316245, 3647992, 5165620, 718395, 3344730, 6923220, 5074622, 6988651, 3845079, 6216376, 7529001, 824698, 7368322, 7164420, 5266438, 7522673, 6704243, 4372588, 7711039, 1082233, 7311030, 4554571, 5191674, 7979624, 8136653, 6618871, 6397920, 6942207, 1959986, 4338516, 794803, 2754495, 7590618, 5997063, 3660239, 2367444, 553152, 270708, 4580462, 6214482, 644770, 6296164, 3442395, 7533651, 515447, 5281429, 2690155, 1493762, 2786184, 4926646, 557862, 4697319, 3012989, 2807563, 6679147, 1858419, 6708237, 7984914, 6757997, 2467707, 952073, 5918700, 2095586, 3177263, 6247482, 6921127, 7848902, 1555412, 1989019, 5449228, 6151124, 4004716, 2664192, 7438908, 7240248, 848233, 7276457, 5631274, 1057733, 5895515, 6644964, 3157923, 140187, 4254865, 3786967, 6528558, 401552, 1942928, 4094701, 7233756, 6646730, 2109407, 1690082, 6387808, 731468, 7978863, 4077124, 4637795, 940602, 207523, 1421870, 5746723, 276151, 3998737, 3480550, 4564234, 4421463, 307868, 7777777, 6231509, 6043057, 5019785, 44772, 6749828], +[7386307, 1379258, 676829, 8241592, 1244323, 446804, 804254, 6811871, 2867796, 3598417, 3145398, 4726293, 5180912, 1630966, 2551279, 7254244, 7931307, 3624077, 4380050, 8264023, 5099033, 3238238, 7312518, 2047095, 1897019, 870330, 7343678, 4287883, 6198880, 1546735, 1559744, 3108970, 7658528, 6548461, 763687, 5432056, 5431432, 986174, 2614419, 7769829, 8150699, 3488595, 2864195, 3705473, 988346, 55858, 7979988, 8202064, 536417, 4722319, 5641463, 3588638, 457143, 398757, 4953716, 3151729, 6649316, 5403874, 5134630, 4211342, 2565980, 3466276, 6749183, 5717125, 5014772, 6663686, 2062539, 8054320, 6449034, 621165, 4919990, 7579844, 4714552, 5790876, 7670692, 8311418, 7944465, 263909, 1207492, 1516985, 8090345, 4165843, 5872260, 7947950, 3121854, 1131567, 3251689, 5367558, 2067786, 8248401, 4908800, 3704766, 5642508, 2966371, 5352836, 84207, 7770952, 6205239, 1374440, 4526034, 7110631, 7798831, 1794882, 6630557, 5141216, 6390779, 2410915, 4410403, 1815795, 7590988, 4548002, 488486, 3174710, 6671255, 6978001, 560543, 7110392, 1158792, 7478177, 1271888, 6887485, 1646538, 2811147, 7922597, 6398021, 3561394, 5821017, 3984567, 6500217, 3392063, 2486688, 4501875, 2124286, 7072198, 3608821, 554831, 3553932, 8104851, 5961245, 2847556, 6514890, 5675908, 2079225, 5424898, 7821788, 2030447, 7006307, 5567338, 7865760, 7889844, 5067046, 3545189, 3693168, 7902753, 7056108, 1158106, 2888269, 6698116, 4462748, 2112875, 2440095, 7456827, 4181188, 757011, 6975622, 4700388, 4981669, 541295, 8051388, 4781639, 528844, 2295913, 4565148, 3277808, 716370, 3142574, 5718023, 2218786, 624774, 3194419, 7405256, 95017, 5209340, 1902114, 4356676, 169865, 6659150, 1515691, 5103827, 7338933, 2944651, 606527, 880086, 2484372, 5686183, 3988914, 2618389, 6996715, 7057720, 7547250, 5561468, 1138994, 1695840, 8326338, 2590072, 3623275, 4656064, 3921766, 3745922, 4865649, 6962628, 3552925, 2741436, 1890444, 5319301, 7230350, 5537962, 5364182, 5865619, 1210969, 4479752, 252073, 1406044, 4056591, 5342275, 1453051, 251271, 1355358, 71195, 5175466, 7430060, 5991216, 4830471, 2612603, 4522290, 346246, 7137716, 3195316, 7148951, 5843975, 1577286, 187530, 5045659, 6760122, 6614964, 3327813, 6743305, 5783057, 4366313, 6813733, 1905890, 8180946, 4393461, 7974498, 23493, 6510078], +[2434900, 3798566, 3376271, 1953701, 6676207, 5868056, 2055634, 7123189, 5284801, 3631581, 3668357, 3398740, 7589662, 1082204, 5798589, 3182027, 1630066, 2313434, 6506223, 619768, 3273198, 1560389, 3841851, 5276819, 1386282, 2030856, 6808668, 3425259, 4862242, 2631912, 1671669, 3226128, 1474867, 5496764, 1107292, 167768, 2882007, 958430, 5021020, 8053168, 5450904, 1461781, 7882194, 2921175, 6801961, 2659965, 7091037, 2726044, 4285669, 3502117, 3751791, 5689664, 5551458, 3585846, 3442925, 1905869, 2448734, 638864, 2802696, 1676371, 3724013, 3809731, 2293880, 1086434, 2542750, 1033756, 1021976, 8308317, 6921547, 8108113, 3873340, 4505634, 3028517, 7984425, 1535424, 5331983, 3946276, 5472663, 3825515, 4235412, 4853978, 584397, 28610, 173862, 1855743, 1588581, 3574600, 6864399, 1038584, 900426, 7577673, 7581819, 7435695, 5267042, 4179829, 666369, 3800415, 4964526, 6421813, 5659951, 6501765, 2974457, 2188710, 7724602, 2196384, 1664779, 4711579, 7462237, 869454, 7109616, 6495888, 8269731, 3824820, 144732, 7655145, 5285692, 7196607, 991770, 3289521, 1836340, 1423993, 530299, 2691526, 1082718, 712168, 1800120, 3748868, 5625102, 2942270, 691778, 223180, 4128394, 4450810, 5930083, 5264628, 5488184, 4131950, 7507199, 1266319, 4652565, 4197940, 2515415, 4698091, 8335560, 460081, 118480, 626306, 715270, 2069556, 1417045, 5387602, 5946205, 7860436, 7781887, 8043205, 1039085, 6011584, 4504946, 1727567, 5214558, 385738, 7774456, 7506202, 293129, 8254200, 987225, 5267997, 5528505, 8374025, 7176889, 3492097, 216153, 544980, 315023, 6407868, 4143020, 284510, 576825, 7653063, 4877469, 914484, 7607493, 401618, 6387361, 6016924, 1297886, 358281, 7118600, 2716165, 4337418, 6052836, 3979683, 3541522, 2081655, 1061549, 4731608, 347443, 1320671, 1523193, 3941260, 6160135, 3231417, 5532001, 7585393, 10610, 735189, 6289554, 5651815, 2177521, 8320004, 3702100, 185447, 7708711, 486816, 7020560, 4931945, 4916199, 4144419, 8311018, 4012260, 8022533, 562061, 5013010, 7318858, 7630476, 401816, 1033247, 2882170, 2944399, 6846491, 6276053, 6256876, 7896483, 6278828, 898156, 5198588, 4360333, 3784628, 8193490, 1819136, 3989623, 2678738, 1965077, 6047235, 261892, 455805, 3111353, 6663479, 3520337, 1155576, 5545023, 1742838, 6669363, 87926, 8300433, 4931814]], +[[8187837, 6379403, 2173589, 2600248, 2866964, 6403163, 2811043, 6019308, 2194728, 7159578, 6810241, 3492279, 4448090, 7619833, 6011331, 5323808, 562206, 7712254, 2532978, 7842816, 1821781, 5446239, 4474567, 2988436, 7643147, 1446806, 7785746, 7016849, 3013611, 2761989, 1908562, 5755825, 7859242, 643883, 6383259, 6106476, 7899169, 4922562, 5726236, 5642215, 6746425, 6070851, 7802714, 5013967, 5445084, 5453238, 5975506, 921480, 8073248, 7659294, 5204296, 2771305, 413105, 3845131, 978790, 1356011, 6812917, 4975603, 6909716, 1828431, 846978, 2456582, 1635671, 5600350, 5755312, 4378902, 3795358, 4878226, 5686002, 4653415, 6352908, 2603143, 4684206, 3744063, 2080459, 4723764, 5042936, 1960477, 2572620, 6357056, 3240844, 7856195, 3859400, 6842347, 4040874, 6430235, 8062807, 2168963, 6428689, 7647913, 1224211, 2085657, 6025986, 7394557, 1116478, 3839805, 3434036, 3749348, 6779124, 7990323, 617575, 7042825, 5861180, 7296146, 4646285, 2658334, 2150828, 2524517, 6510397, 7798597, 2461585, 512108, 2747928, 1826782, 1964397, 5261949, 4770719, 1303612, 2141583, 82378, 757086, 2472302, 1682345, 3350197, 8356049, 5367042, 3804881, 4595729, 6341012, 7085856, 3086256, 5317011, 4429223, 7265660, 833888, 4523844, 681146, 3801776, 2599067, 3941570, 3745797, 1871114, 470910, 4101801, 2383412, 2934171, 1065669, 1536064, 7046251, 7731418, 6530465, 1981650, 7906289, 4675528, 4099628, 3487335, 3418978, 3702177, 4395443, 5957172, 3565819, 5950722, 5781540, 6325176, 1431313, 2741875, 618583, 373271, 6612419, 416583, 7471913, 2219721, 3681653, 6197922, 2214436, 1302353, 7736300, 2901670, 2548995, 2865031, 8315268, 4461481, 2242162, 7302840, 4719293, 5054504, 2915472, 8166945, 7656257, 5783318, 6171134, 5905156, 5839870, 6439012, 7123804, 5514283, 2470276, 2423879, 1872612, 6155349, 4968025, 41251, 1559118, 6199596, 2725486, 7059018, 1729131, 5034684, 5496931, 7171417, 4363637, 4702456, 5038379, 8032329, 6407461, 585911, 7883756, 6838450, 6433835, 4061443, 7244186, 365128, 5196907, 6615155, 7187022, 2051202, 3126582, 3845405, 7845407, 5725007, 2849585, 3966771, 5437766, 3494104, 1490517, 7569880, 1130825, 2154606, 2513140, 7319465, 7382845, 4385189, 2957877, 3322913, 1713992, 3310478, 7048977, 4742078, 6550044, 2274070, 7225541, 5089799, 6373855, 3444199, 7051598, 8110102], +[4253518, 7662918, 4114508, 7801340, 405692, 28913, 3946824, 8256773, 79705, 7800304, 1276253, 1139422, 4778725, 6469836, 780489, 1826302, 157311, 4112780, 1475439, 6435674, 3668018, 2563727, 2623612, 3406837, 1252277, 4577991, 1600027, 6916166, 6392032, 5039103, 3181669, 3928641, 4361855, 3755824, 3305638, 2362782, 8158271, 1639762, 4680707, 5991935, 6384478, 1676328, 3459933, 1473617, 7755639, 5945105, 3850075, 4941644, 6365155, 1024691, 2305984, 7093251, 7684000, 616639, 7346158, 881320, 4492872, 1123045, 2290342, 6487427, 7651092, 2735082, 8000749, 2907928, 6442076, 599230, 862870, 8223863, 3765878, 8227579, 2088793, 1715129, 2153719, 1017416, 7864577, 7750107, 5129555, 2508115, 105388, 2988945, 1195800, 1630002, 6525948, 198779, 2624236, 6847157, 4831526, 8102789, 2497325, 583208, 7920822, 4493397, 272517, 1945926, 3580, 3666334, 6589672, 236791, 2300522, 510220, 6211167, 5649786, 3515856, 1760959, 3208456, 5533998, 8066708, 6571, 7060440, 2959165, 3405084, 2760704, 4264946, 2833162, 2504381, 475265, 359601, 4070009, 1255872, 3159147, 3197916, 8077040, 7992344, 3569032, 1910312, 3684163, 2987043, 5328668, 5666232, 8070587, 8046626, 2284948, 4210580, 4770003, 1453654, 7066497, 6154446, 4673876, 239548, 4905629, 5583956, 3706147, 7332245, 7269814, 7450975, 4437585, 4096270, 2992488, 5976500, 528336, 8116764, 7656649, 3866725, 7703037, 8109523, 1730816, 7227134, 3969107, 8128030, 8305651, 5381849, 5884277, 8115677, 737127, 4890267, 6545900, 2164346, 3644657, 4002420, 6341736, 7856383, 5249793, 324479, 6516645, 7602941, 937608, 3651443, 3611763, 2932032, 3089964, 4312785, 420305, 6674455, 7019178, 2482924, 8359701, 8139390, 8277689, 1302957, 893071, 7093334, 2264782, 4342173, 7806076, 6810526, 8350253, 6492149, 4127326, 3617705, 6612338, 3865666, 1271189, 1198042, 2958575, 4251042, 122136, 5914618, 1133993, 2180602, 3965385, 5726315, 5046657, 6236915, 1276392, 2128828, 3026007, 6250796, 5337251, 2164908, 5753225, 5149817, 1862263, 4927667, 7888202, 6681349, 8229142, 6528755, 6449304, 841305, 647968, 7374925, 703053, 648055, 4004488, 6804112, 714384, 4362418, 3884967, 6082142, 5549784, 6469197, 4746217, 5996044, 5402545, 1398409, 6384831, 5061198, 1668626, 7950771, 3051552, 3705674, 331406, 5095829, 8194150, 6779334, 3045952], +[8076424, 4374323, 1332547, 2385778, 189403, 1893282, 8335790, 3542929, 1738063, 5128874, 6473638, 7124537, 1951861, 84412, 3447547, 7754231, 4893534, 3788366, 6527856, 7660545, 4331834, 144222, 1248533, 5122656, 7556632, 3289749, 27116, 6622017, 2617217, 2225824, 72246, 4911759, 4670029, 3796250, 5699224, 490645, 1318778, 6101370, 6842959, 8008990, 7682950, 7313768, 2854954, 6787490, 6511912, 1927395, 1288817, 343853, 5986155, 6236866, 7119865, 3691968, 3582786, 7803899, 6723856, 4870194, 5957409, 7682142, 3912028, 3509308, 413478, 6574358, 1078161, 1800944, 5551836, 3869990, 6513227, 3114454, 2111092, 4437005, 1880533, 7617853, 4609070, 305334, 5398449, 5956671, 6479043, 6519750, 1742715, 4684772, 100399, 9929, 2302926, 2831031, 2992262, 169248, 5753369, 701445, 1129094, 711785, 8103501, 2484482, 5699143, 7706179, 1278466, 7283808, 7146735, 3337949, 6225802, 960628, 28640, 5235018, 3481949, 978403, 7972291, 5328426, 59610, 7756189, 2835548, 6497, 7769742, 313187, 1216754, 7062710, 7172572, 6092532, 5531608, 5578506, 325548, 2559339, 3876618, 6776676, 970146, 7321815, 1501344, 6357637, 532273, 3377559, 7405523, 5835967, 5080569, 6715366, 563759, 6250555, 5483783, 4318053, 6328137, 4282076, 3134985, 2909706, 5929977, 7066274, 7142018, 869346, 1493887, 4766440, 2837215, 4002878, 2957607, 7918486, 3769481, 4086091, 7266390, 3685302, 1606635, 2396976, 586133, 4555270, 6343297, 3831859, 3280449, 2448056, 160330, 1759502, 8379096, 4904682, 1154043, 2869687, 912028, 8053066, 1487799, 2231750, 717413, 221488, 1621181, 6941071, 4523652, 6038137, 2616724, 7826719, 4277994, 3492032, 7614875, 6426563, 3061090, 5795789, 2339496, 693157, 1718124, 6820144, 3124465, 7054195, 6231882, 7918439, 8091610, 2189611, 7406934, 7092667, 3536836, 4732329, 2410802, 7509133, 1547452, 5876473, 7151824, 5974629, 5682239, 7131127, 7200249, 5453534, 6092680, 5250359, 3290066, 5605335, 5734433, 335554, 1152000, 3620120, 627321, 1367477, 4902462, 4792965, 7501415, 844824, 5854358, 6983534, 5547838, 1370136, 2223801, 3082317, 3533866, 8145766, 4885340, 2844844, 2003950, 7935593, 2438514, 6204978, 8093498, 311491, 177919, 6163354, 801957, 4082131, 7367577, 5748131, 6961647, 6392969, 1036809, 1918482, 5635069, 3478098, 6555565, 2636000, 606712, 7103276], +[4315109, 6215373, 8316044, 7935864, 8350855, 4438923, 4067859, 5715190, 5835796, 6256065, 3117085, 1399465, 1567242, 39362, 4146744, 520388, 7893782, 6452636, 431924, 7880616, 1709641, 6113165, 6702449, 6862489, 4558108, 6005513, 7613112, 4922317, 4207220, 4281399, 5103929, 5220774, 2771281, 5905357, 1827187, 7909850, 5890565, 7021370, 4631205, 1287100, 7150914, 7473657, 1324136, 6946726, 1642581, 5952824, 7611242, 7229573, 1623148, 5849562, 4931806, 6054121, 2135461, 1580408, 750087, 5963863, 5807313, 6232421, 1116633, 527285, 2902105, 5240879, 2266075, 6940042, 4961750, 1667664, 211973, 4574333, 5643004, 3214951, 7286168, 4491899, 7260554, 6482877, 5521731, 2559686, 3157776, 5376433, 8359775, 7555254, 6892641, 703927, 3211504, 875200, 1189181, 7580581, 6931969, 2283918, 2766401, 2164977, 4840544, 2516637, 6589765, 2129518, 2655871, 500453, 1451779, 3275042, 5399005, 7137294, 8349931, 856724, 1663318, 3346712, 7576898, 1859503, 4852078, 3723377, 3514158, 2019909, 8102965, 5783363, 5514530, 7183990, 4519744, 1870855, 7211994, 3266922, 2639240, 3353327, 8029705, 4333654, 5895651, 2904081, 3523815, 4299810, 2370992, 2441104, 5119991, 7123868, 7649986, 4651715, 2515757, 7138607, 6411412, 2530027, 2929711, 1663192, 1039761, 2756364, 6898730, 6467687, 999083, 1083676, 6777553, 5357007, 912928, 1534974, 1109887, 3067431, 6347331, 402977, 7065759, 7287628, 7174104, 7410844, 4190755, 4000606, 4844876, 640018, 5576717, 3061168, 3260601, 5352182, 3328256, 647870, 7921598, 5697308, 4370033, 594255, 5903141, 5566164, 1102883, 321350, 7499056, 3650051, 6135457, 6266049, 4876207, 5561767, 1533177, 3270642, 7305442, 1656204, 5869976, 7557437, 3376202, 2248905, 6366497, 305839, 4733686, 7889559, 7070705, 5829791, 4569069, 4112463, 5217212, 3451057, 2558787, 4639449, 1626800, 3310025, 2903215, 1256192, 6466330, 189903, 2655709, 2191514, 5134001, 5296706, 3238435, 2501268, 502033, 3856826, 6844773, 6945047, 4607268, 6335183, 3673315, 3570540, 2572617, 6640037, 6422699, 94512, 5754440, 4342108, 5312934, 5080243, 6853, 7676134, 5718824, 752542, 4727293, 5616446, 4150687, 5033829, 8143484, 165204, 7853039, 5835353, 4647973, 5115427, 4428956, 2338034, 7540552, 455610, 2693628, 1049318, 4747379, 6573914, 7306896, 7970265, 7232117, 3260641, 3686054, 6818729], +[6330211, 6233563, 2514758, 2371630, 4743218, 1212502, 4148355, 2265497, 5584901, 6448812, 4781764, 3399792, 7432249, 3088046, 5855212, 2769493, 494029, 549387, 6625994, 5577766, 1687390, 970169, 7929970, 5348871, 58838, 1585912, 1782023, 6974962, 6000138, 4700540, 1056554, 3284607, 4088881, 4401060, 4756202, 3770154, 1657904, 7075728, 4928806, 4263320, 7169946, 8001091, 3757128, 3360686, 7559013, 4035598, 99621, 96008, 2504393, 608086, 4493813, 4702740, 1150731, 1628671, 7711437, 836368, 1172049, 7886179, 6349983, 4964028, 7624853, 7282956, 7482503, 2255801, 5207801, 4496869, 999039, 4908708, 7593692, 1505115, 7759111, 5761142, 5475907, 4944072, 934112, 1099447, 7088858, 4829679, 2309818, 4767917, 1601173, 5970905, 2811884, 1971253, 7918309, 6247468, 2240428, 5068568, 4156255, 106542, 5601507, 5008570, 5267196, 427149, 7357355, 6378748, 2086103, 2479322, 5827292, 6482612, 8100508, 6749188, 3591140, 1882419, 482888, 2176652, 4788632, 4123191, 7560831, 5089753, 209643, 1595891, 4331119, 1951703, 5092083, 4532179, 7162489, 1951250, 2133953, 3264996, 2062903, 1507723, 3326997, 6033018, 5246967, 5278643, 2143250, 6295629, 1170997, 5957457, 2513010, 540821, 2134967, 6206181, 1813815, 4964543, 4212877, 5312462, 7874798, 3306412, 2234436, 6276842, 7956356, 4915885, 5211781, 3622056, 4857734, 4240258, 6237538, 2088185, 981200, 6449051, 5524747, 833377, 2449754, 5037824, 1344389, 7448739, 1262786, 6857116, 7276762, 5959055, 1332558, 613190, 6186203, 7647230, 92029, 4651123, 6230573, 4821414, 3189347, 4973578, 7688352, 2186614, 6918762, 55358, 4300957, 6145274, 7997842, 631452, 3837933, 7405530, 4289622, 7827469, 5738840, 4105172, 895305, 8237924, 1725102, 6087720, 5761887, 5873485, 6756455, 2746602, 3190012, 2670519, 5847156, 713505, 5241471, 7968520, 7950533, 3590373, 1045524, 1940170, 431775, 1200555, 5434544, 2800567, 3690411, 4436835, 24172, 1232848, 2867671, 7686600, 7523712, 4150161, 4454850, 297567, 5968300, 1863560, 1673540, 2053876, 4767201, 7152623, 3420177, 1374707, 8053512, 4065077, 2417032, 8253914, 6496900, 6772209, 3090929, 3794538, 3641492, 3017177, 3583623, 3566219, 1367747, 7242862, 2357697, 3148102, 2784456, 1375455, 1706363, 910495, 2901642, 8067151, 63597, 6025069, 5172778, 461998, 6228996, 1908066, 878461, 4080959]]] +s1: [[-1, -2, -1, 0, -1, 3, 0, -4, 1, 3, 1, 2, 2, 2, -1, 2, 4, -4, 2, 1, 4, 3, 4, 0, 2, 3, -2, 4, 2, 0, 4, -2, 1, -4, -2, -3, -4, 3, -1, -4, 4, -1, -3, 3, -2, -2, 0, 1, 1, -3, -1, 3, 4, 3, -4, -2, 1, 1, 1, 1, -2, 2, 4, 0, -4, -3, -4, 2, -2, -3, -1, 3, 2, 1, 3, -1, -3, 2, 0, 2, 4, 1, 1, -1, -4, 1, 1, -1, -1, 1, -2, -3, -3, 0, 4, -1, -1, -2, 0, 3, 3, 3, -1, 1, -4, 2, -2, -4, 3, 0, 0, 2, -3, 0, 0, 0, -4, 3, 0, -1, -1, -2, 0, -2, -2, 2, -4, -1, 3, 2, -3, -3, -1, -4, -4, -2, 3, 3, -4, 1, 4, -1, 2, 4, 1, 3, -4, -2, 3, 0, -2, -4, -3, 1, -1, -4, -3, 0, -2, 2, 0, 3, -4, 0, -2, -1, 0, 0, 4, 2, 2, -3, 0, -4, -2, -4, -3, 1, -2, 0, -3, 2, 3, -1, -2, 3, 2, 4, 2, 3, 0, 0, -2, 1, 0, 2, 2, -3, -3, 4, 0, -2, 2, 1, -1, -4, 2, 0, -3, 3, -4, 3, 4, 0, 4, 3, 2, 0, -3, 3, -1, -3, -4, 3, 3, 0, 0, -2, -4, -1, 3, -1, -4, 0, -4, 4, -3, -2, 4, 3, 0, 1, -1, -4, -3, 4, 3, 1, 1, -1, -4, 2, 2, 4, -1, -3], +[1, 1, 1, -2, -1, 2, 0, -1, -1, 0, 2, -3, 2, -3, -3, 4, -2, 2, -3, 1, 1, 3, 1, -1, 1, 4, 3, 4, -2, -4, -3, 4, 2, -1, 0, -4, -2, 0, -1, 3, -4, -1, 1, -1, 3, -2, 2, 3, -1, 1, 2, 4, 2, -3, 3, 2, -1, -4, -1, 0, 3, 4, -2, -1, 0, 2, 4, 4, 0, -4, 1, -1, -4, 0, -2, 2, -3, -4, 4, 0, 3, 3, -2, -4, -2, 1, 2, 0, 3, 1, 4, 1, 3, 3, -2, 2, 4, 4, 4, 4, 1, -4, 0, 4, 3, -3, -1, 3, -4, 2, 0, -1, 1, -3, 4, 3, 1, -1, 0, 4, -4, 0, 1, -2, -3, -1, 1, 0, -1, 0, -3, -2, 0, 3, 3, 3, -3, 0, -2, 1, 0, 4, 2, 0, -4, 1, 3, 4, -2, 1, 3, 4, -3, -1, -4, -1, -2, -1, 2, 0, -4, -1, 0, 3, -3, -2, -2, -1, 1, 1, 4, 2, -2, 3, -2, 0, -1, 4, 4, 0, 3, -3, -4, -2, -2, -2, -1, 4, 1, -3, 2, -2, 3, 3, -1, 3, 4, 3, -2, -3, 1, -2, 0, -3, 1, 3, -1, 1, -3, -3, 0, 3, 4, 2, -1, 4, -1, -1, 0, 3, 2, -4, -2, 4, 2, 1, 2, -4, -1, -3, 0, 0, 0, -4, -2, -4, 2, -4, -4, 4, -1, 3, -3, 2, 4, 1, -4, -2, -4, -1, -4, 3, -1, -2, 3, -4], +[-4, 1, -4, -4, 0, -3, 0, 2, 4, 3, 1, -3, -1, 1, -4, -3, -3, 0, 3, -4, -1, 0, -3, -1, -3, -1, 0, -4, 3, -1, 0, 4, -3, -4, 3, 0, 0, 1, -4, -4, -2, -2, 4, -2, 2, -2, 1, -2, -4, 0, -2, -3, 4, -4, 3, 4, 0, -2, 1, -2, 4, -3, -2, 3, 1, -4, 0, -2, -4, 4, 4, 1, 2, 1, 3, 3, -3, -2, -2, -2, 4, -2, -2, -3, -2, 1, -3, 1, 4, -4, 1, -4, -2, -1, 0, -3, 4, -3, -3, 3, -3, 4, 3, -1, 4, -2, 1, 0, 2, 3, -3, 1, -2, -4, -3, 1, -2, 4, -1, -1, 4, -2, 0, 0, -4, -1, 1, 2, -1, -1, 3, 3, -3, 0, 4, -2, -4, -3, 2, -2, 2, -3, 0, -4, -1, 0, 0, -2, 3, -2, -1, -1, 0, 3, 4, -1, -4, 2, 2, -4, -3, -3, 0, 3, -4, -4, -4, -2, 3, -1, -2, -1, 3, -1, 0, -4, -2, 3, -1, -1, 2, 4, -1, -1, -1, 1, 3, 3, -2, 3, 1, 3, 1, 3, 4, -4, 2, -3, 3, 2, -4, -2, 0, 4, 2, 4, -3, 4, 3, -4, -1, -3, 3, 0, 2, 1, 4, 3, -2, 2, 4, 3, 1, -1, 2, 1, -3, 1, -1, 2, 1, 3, -4, -1, -1, -4, 4, -2, -4, 0, -2, -2, -2, -2, -2, -3, -2, 1, -1, 4, -1, 3, 0, 1, 4, 4], +[-4, -2, 4, -2, -2, 1, -4, -3, -3, 3, 1, -3, 1, -1, 1, 2, 1, 4, -4, -1, -1, 0, -1, -4, -4, -1, 1, -1, 2, -4, -1, -1, 3, -2, -1, 0, -3, -4, 2, 1, 3, 1, 4, -3, -2, 2, 3, -1, 2, -4, -2, 3, 3, 4, 3, -2, 0, -1, -1, -3, 3, -2, 0, 1, -1, 1, -1, 0, 2, 1, -1, 4, -1, 2, -2, 1, -2, 0, 4, -1, 4, 1, -1, -3, 2, 3, 1, 0, -1, -3, 3, 4, 1, -2, -4, 3, 3, 1, -2, 0, 0, 2, 1, 2, -3, 2, -3, -3, -2, -2, -4, 1, 3, 4, -3, -4, 0, -4, -2, 2, 2, 0, -4, 0, -3, 1, 4, -4, -3, -3, -3, 0, 0, 0, -1, 0, 4, 1, 1, 1, -3, -1, 1, 0, 0, -4, 2, 4, 1, -1, 2, -3, -1, 0, 1, 1, -3, 4, -4, -2, 3, 3, 3, 0, 3, -1, -2, 2, 2, -1, 1, 2, 4, 2, 4, -4, 1, 3, -3, 4, -2, 1, 2, 3, 2, 2, -2, 1, 2, 0, 3, -2, -3, 1, 1, -2, 4, 4, -4, 1, -4, 0, 3, -2, 1, -4, 3, 1, 0, 1, 2, -2, 1, 1, -1, 4, -1, 4, 4, 4, -1, -3, -2, 3, 0, -2, -4, 3, 4, -1, 2, -2, -1, 4, -3, 3, -4, -1, -4, -2, 0, -3, -1, -1, 0, 1, 3, -1, 1, 0, 4, 1, -4, -2, 2, -3], +[3, -4, 3, 3, -4, -4, 4, -2, 3, 4, 1, -2, 4, -1, -3, 1, 3, 3, -2, -4, -2, -2, 1, 1, -4, 2, -4, 3, 1, -4, 4, 3, 1, -4, -3, 4, -1, 0, -3, 2, -2, 1, 4, -1, 2, -3, 3, 4, -1, 4, -4, 3, -3, 2, -3, 1, 2, 2, -3, 1, -1, 2, -4, 1, -2, -1, -1, 1, 4, 1, 2, -1, 3, 3, 2, 4, 3, 0, -4, -3, 3, -2, -4, 1, -2, 2, -4, -1, -3, 1, 0, -3, 1, -4, 4, 3, 1, 0, 0, -1, 3, -4, 1, 3, 3, -2, 2, -3, 4, -2, -2, 2, -4, 0, -1, -4, -1, 4, -4, -3, -4, 1, 0, 4, -3, 4, 4, -2, 4, 1, 3, 2, 4, 3, 4, -3, -4, 3, 3, 2, 0, -3, -2, 4, 3, -4, -1, 4, -4, -2, 4, -4, 2, 1, 1, -2, -1, -3, -2, -2, 1, 0, 2, -4, -2, 2, 4, 0, 2, 3, 3, -4, 3, 3, 4, -2, -3, 0, -1, -4, 1, 4, -4, 2, 1, -4, 0, 0, -2, 2, -3, -2, 3, 0, 2, -3, 2, 2, -3, -2, -4, 4, 4, 1, 0, 4, 2, 1, 3, 2, 4, -3, 0, -1, 4, -1, -1, -1, -3, 1, -1, -2, -4, 2, -2, -4, 4, 2, -1, 2, -1, -2, 2, 0, 0, -3, 4, -1, 0, -2, 0, 3, 2, 3, -3, -3, -4, 1, -1, 2, 3, 3, 0, -4, -2, -3]] +s2: [[3, -2, -1, -4, 3, -2, -3, 0, -3, 1, -4, 0, 4, -4, -3, 0, -4, 4, -4, -1, 4, -4, -4, 3, 0, 2, 2, 3, 0, 4, 0, -1, -2, 1, 0, 0, 3, 2, 4, 1, 3, -4, 0, 3, -2, -1, -1, -3, -4, 2, 1, 0, 4, 2, 3, 2, 4, -1, 1, 3, -3, -4, -1, -1, 2, -3, -2, -3, -4, 4, -1, -4, 0, -2, 2, -4, 2, -2, -4, 2, -4, 1, 2, 0, 0, 0, 2, 4, 0, -4, -1, 0, -3, -4, 1, 2, -3, 1, 0, -3, -3, 3, 1, 1, 3, 0, -3, -2, 3, 1, 4, 3, -3, 4, 0, 4, 1, -4, 3, 4, 4, 0, -4, -2, 1, -3, 2, 4, -3, -3, -4, 3, 3, -3, -2, 3, -2, 1, 1, -3, 0, -3, 0, -4, -1, 4, 4, -4, 2, 2, -3, 2, -4, -3, -1, -2, -4, -1, -1, -2, -1, -3, -3, 2, -2, -1, -4, 3, 3, -2, 3, -3, -2, -4, 4, -4, -4, -2, -2, 2, -2, -3, 1, 2, -3, -1, 1, 4, 4, 0, 2, -3, 4, -4, -3, -4, 0, 0, 2, 4, 2, -2, -2, 4, 0, 0, 1, 3, 2, 1, -3, 3, 0, -4, 4, 0, -1, -3, 4, 1, 1, 0, -2, 2, -1, -3, 4, 0, 3, 0, 1, -1, 3, -1, 2, 4, 2, 2, 4, -4, 3, 3, -3, 2, 2, -4, -1, -4, -4, -3, -4, 2, 1, -2, -4, 2], +[2, -2, 2, 4, -1, 0, 3, -1, 0, 0, 0, -4, 1, 4, 4, -4, -4, 3, -1, -1, -4, 0, -2, 3, 4, 2, 2, -4, -1, 4, 4, -1, 0, 0, -2, -1, 0, 2, 2, 2, 4, 2, -2, 2, -2, 4, 4, -1, 1, -3, -2, 4, -1, 0, 0, 3, -3, -2, 1, 2, -2, 4, 3, 2, 3, 1, 1, 4, -3, -2, 0, 2, -1, -1, 4, -1, 2, 4, -1, -3, 1, 2, 2, 0, -3, -1, 4, 2, -3, -1, -3, -2, -1, 2, -2, -2, 0, 0, -3, 4, 0, -4, 3, 2, 1, -1, -1, -2, -3, -1, 4, 0, 0, -4, 0, 3, 4, -1, 2, 3, -2, 0, -4, -2, -2, -1, 0, 4, -1, 0, 1, 4, 3, -3, -2, 2, 2, -4, -3, -1, -1, 0, 0, 0, -4, 3, 2, 2, -3, -2, -3, 0, 1, -4, -4, 0, 1, -1, 3, 1, 1, 4, 2, 2, 3, 2, 1, -1, -4, 0, -1, 4, -2, 2, 3, 0, 0, -1, -4, -1, 0, 4, 1, 1, 3, -1, 1, 1, 0, 2, 2, 1, -4, 1, -1, -4, 0, 0, -2, -3, -4, 2, 2, -4, -4, -1, -3, 3, 0, 3, 1, 4, 4, 0, -1, -2, 0, -4, -1, 2, -2, 4, -1, 4, 3, 2, 3, 2, -1, -4, 0, -3, 4, 4, 3, -1, 4, -2, 3, 2, 2, 2, -2, -3, -4, -1, 0, -3, -1, -2, 2, -4, 3, -2, 1, 2], +[1, -1, 4, 0, 1, -1, -3, 4, -1, 4, 2, -3, -3, -2, 1, 1, 1, -4, 0, 0, -4, -4, -2, -4, -3, -3, 0, 1, 4, 0, 3, -2, 0, -3, -3, 2, 0, 3, 2, 1, 3, -4, 2, 0, 1, 1, 2, 1, 2, -1, -2, -2, 1, 1, -3, 0, 1, -2, 3, 2, -4, -2, 2, 1, -4, 0, 3, 4, 4, 2, -3, -1, 2, 0, -2, -1, -4, 0, 3, -1, -2, -4, 0, -3, 3, 3, -2, 2, 0, -4, 2, 4, 1, 2, -2, 1, -2, 2, -4, 2, -1, 0, -4, -3, -2, 1, 4, -1, 3, -4, 1, 3, 2, -1, 1, 4, -4, 1, 1, -4, -3, 3, -4, -1, 1, -1, 3, -4, -2, -3, -2, -4, -4, -3, 0, 1, 0, 3, -3, -2, 1, -1, -4, -2, 3, 2, -4, -4, 3, -3, 1, 1, -3, -3, -2, -2, -1, 3, -2, 4, 0, -3, -3, -3, 4, -1, -3, -3, 2, -3, -4, 4, -3, -4, -4, -4, -3, 0, 2, -1, 1, 2, -2, 3, 3, 4, -4, 1, 4, -4, -3, 0, -1, 3, 2, -3, -1, -4, -1, 1, -4, -3, 4, -2, 1, 2, -2, 2, -2, 4, -2, 0, 2, -4, 4, -2, 3, 2, -4, -4, -3, -1, 2, 3, 4, 1, 2, -2, 3, -4, 0, -2, -4, -3, 2, 3, -2, 4, 1, 2, 2, -3, 3, -4, 2, 3, -2, -4, -2, 1, -2, 1, 3, 3, 0, 4], +[-3, -2, -3, 2, 4, -4, 4, -4, -3, -1, 2, -3, 0, 4, 2, 0, -3, -3, 3, -2, 2, 1, -4, -3, 4, 3, -3, -2, 3, -3, 1, -2, 2, -1, -4, 0, 1, -4, 3, -2, -2, 4, -3, 2, 1, 1, -1, 2, -4, 3, -2, -2, -1, 4, -2, 0, -1, -4, -1, -4, -4, -3, 4, 0, -1, 0, 0, -3, 4, 2, 0, -1, 4, 2, 1, 2, 0, -1, 3, -1, -1, -1, -2, -3, 1, -1, -3, -3, -1, -4, 4, -3, 0, -4, -4, -1, 2, 2, 0, 0, 4, -1, 0, -4, -1, -2, 1, 3, 4, -1, -1, 1, -3, 3, 0, 2, -4, -1, -2, 2, -4, 3, -2, 3, -1, -1, 1, 0, 0, 1, -1, 2, 1, 0, -3, 3, -2, 3, 3, -2, 3, -3, 3, 1, -4, 1, 0, 2, -3, 1, 2, 2, -4, -4, 1, 1, 0, 4, -2, -4, 0, 1, -4, -4, 4, 1, 1, 2, 3, 2, -1, 1, -2, 1, -3, -4, -3, 3, 1, 2, -2, 2, 1, 1, 4, 2, 0, 0, 4, -4, 0, 2, 1, -1, 2, -2, 2, -3, 1, 0, -1, 2, 4, -3, 2, 2, 3, -2, 1, -1, 3, -2, -4, 2, -1, 2, 4, 2, -3, 4, 0, -2, 1, 3, 4, 2, 1, -4, 0, 3, -3, -2, -3, -3, -4, -2, 2, 4, 3, 3, -4, 0, -3, -4, -4, 0, 0, -4, -1, -2, 3, 0, -4, 4, -2, 2], +[-1, 4, -2, 1, 2, 4, 0, -1, 4, 1, 4, 3, -2, -3, -2, 2, 3, 4, 2, 0, 0, -3, 0, 2, 4, 2, -2, -4, 3, -3, 1, -1, 1, 2, 3, -3, 1, -2, 2, -2, 4, 3, 0, 3, 2, -3, 0, 2, -1, -4, 3, 4, 1, 1, 2, -1, 4, 4, 1, 1, -4, 2, -4, 3, 4, -3, 0, 4, -1, -1, 0, -3, -4, -1, -3, -3, -1, 1, 0, 4, -1, 4, 1, 1, 4, -3, -3, 0, 1, -4, -2, 3, 0, -1, 2, 3, -4, -2, 4, 4, -4, -3, 1, -3, 3, 3, -3, -1, -3, 0, 4, -3, 3, -1, -1, 3, -2, 2, 0, 3, 2, 1, -1, 0, -3, 3, -4, -1, 4, 3, -4, -4, 1, 0, -3, 3, -1, -4, 3, 0, 2, -3, -1, -3, -2, 3, -2, 2, 2, 1, 4, 0, 0, 3, 1, -3, 2, 1, 4, 3, 1, -4, 3, -4, -2, -1, -4, -3, -1, -4, -1, -2, -1, 0, 0, -3, -3, -2, -2, -3, -3, 1, -4, 0, 0, -3, 4, 1, -4, 0, 4, 4, 2, -2, 4, -2, -3, 4, 1, 0, -4, 1, 1, -2, 0, 4, 1, -4, -1, 4, 0, 2, 3, 2, -4, -2, 0, -4, 3, -3, -4, 2, -4, 0, 3, -1, -3, -1, -4, -3, 0, -1, 4, -2, 2, 3, 2, -3, 3, 0, -3, 1, -2, 1, 4, -4, 2, 3, 4, 1, 3, 1, 2, 1, -1, 4], +[4, 3, -1, -3, -1, 1, -3, -1, -3, 0, 0, -2, -1, -1, 3, -2, 0, -4, 2, -4, -1, 2, -2, -3, 3, -3, -3, 2, 4, 3, 4, 0, 4, 0, 4, 1, 4, -1, -4, 3, 4, 2, 1, -1, 1, -2, 0, -1, -2, 0, 3, -2, -4, 3, 2, 0, -3, 1, -3, 3, 2, -4, 4, 4, 1, 1, -1, -4, 4, 2, 0, -2, -1, 2, -4, -2, 1, -2, 0, 2, 4, -1, 2, -2, -4, -3, 0, -3, -4, 1, 1, 0, 4, -2, -3, -4, 4, -2, -2, 3, -2, -3, -3, 0, -1, 4, -4, 2, 2, 3, -1, -3, 0, -2, 0, 1, -1, -4, 3, 4, 4, -1, 4, 1, 4, 0, 2, -2, 2, 3, -4, 1, -1, 1, 0, -2, 2, -1, 0, 0, 4, 4, -1, 4, -1, -1, 1, 1, -4, 0, 0, -1, 0, -4, 1, 4, 0, 4, 0, -4, 4, -2, 4, -3, 2, -1, -2, 2, 2, -3, 4, 0, 4, -2, 0, 4, 2, -4, -1, -1, 3, -4, 2, 4, 0, 3, 3, -3, 1, 0, 1, -1, 1, -2, 3, -2, 3, 3, -4, 3, 0, 0, -3, 3, -1, -4, -4, -2, 4, 1, 3, 0, 3, -4, 4, 0, 4, 2, -1, 3, -1, 0, 4, -3, 0, -3, 1, 0, 4, 1, 1, -1, -3, 1, 2, 0, 3, 3, -4, 1, 1, 4, 2, -2, 2, -3, 2, -2, 3, 3, 0, 2, -4, 3, -3, 0]] + +s1Hat: [[4742810, 5480085, 3608963, 3572361, 2496000, 2560487, 1879108, 7694448, 4144377, 481365, 496577, 2004557, 699714, 16806, 4146884, 7783158, 6884497, 6641795, 4384217, 1947609, 998521, 7290413, 4072600, 5608672, 6631341, 2833450, 5897029, 165165, 1576227, 3659892, 900301, 5623437, 2181875, 1627946, 2727906, 3487624, 7508307, 5755376, 2864362, 2608896, 3258353, 2590830, 4237257, 4174680, 7179975, 1460909, 5979467, 1474464, 6760411, 6303748, 8201639, 6894863, 3112627, 6910164, 1508457, 6473353, 1943579, 1463737, 1359400, 2902378, 8178643, 4317241, 6685413, 8026163, 3301660, 7044457, 3439009, 5744555, 6152722, 3014283, 6058961, 8365038, 399666, 2119299, 3396852, 7022737, 3008383, 315350, 6501458, 3387653, 6625409, 4606020, 1131561, 2151472, 5803074, 3841116, 8123727, 5508007, 6412910, 2055109, 2322296, 8285823, 8300747, 3489835, 3811394, 1143352, 2868638, 6972554, 1492157, 7716486, 5371524, 4686843, 1085263, 2473126, 5877038, 1497798, 600354, 4608458, 7702667, 7433639, 125544, 5323574, 7618090, 2057154, 6040255, 5936125, 110885, 4107097, 5421373, 8060130, 5292167, 760352, 4690292, 4306544, 7841892, 4994673, 5074318, 887462, 6961082, 379750, 8305721, 7017340, 6471524, 4467235, 7152940, 3551894, 8004129, 3382378, 724796, 3127534, 252087, 2884838, 531759, 7560865, 2721490, 3791369, 1136535, 3687571, 936818, 1088541, 3319493, 4519220, 1328103, 8131139, 6429866, 393625, 2046143, 5465673, 8063077, 5568335, 3899826, 1842740, 589162, 4757690, 609938, 4819034, 7655049, 7070533, 5615885, 3172114, 5313703, 4959257, 6250952, 6918828, 6857035, 6609080, 7692885, 8030051, 1615402, 6955080, 2286740, 4407476, 606604, 3356322, 8058683, 4185891, 1691746, 2698101, 6333230, 1146647, 1087217, 5217248, 2771676, 7828671, 2167790, 1546174, 1363015, 499739, 7334143, 5759686, 5328535, 1036146, 2379415, 1140967, 3901410, 6846918, 6595738, 5832715, 5415196, 4212970, 5367332, 5410205, 4742509, 2002189, 2870536, 4877419, 984309, 5855181, 6631970, 3788761, 4334494, 5829412, 1150724, 1939133, 105854, 8126125, 6797850, 9688, 4960827, 1695452, 8242294, 5210506, 8240725, 8209102, 999171, 2306590, 4789018, 4536218, 2420646, 3910025, 4861587, 4269982, 2244078, 6702738, 1257823, 4270500, 4468924, 6286369, 3407422, 8091003, 2977249, 374112, 5383805, 4247084, 5819009, 7392348], +[4057742, 4504507, 3272907, 1325218, 4129292, 3614014, 3051254, 515860, 2896719, 7331125, 3068150, 6889345, 2679067, 7725131, 2945046, 4430364, 8366187, 6233011, 2012958, 2704720, 6176319, 7646431, 1648438, 5605772, 2087021, 2331259, 4021949, 4050459, 4288940, 5804777, 110243, 7140203, 2096061, 2112249, 7901451, 5168353, 1034549, 5771529, 5433791, 191550, 6683817, 4498246, 4621580, 214617, 5668917, 3364260, 5166168, 2214349, 4360953, 2816284, 7714822, 5944605, 6988769, 7954004, 576659, 6326309, 7010102, 6959509, 2765375, 7040910, 4223149, 8122428, 6855107, 8314989, 563974, 1441020, 5472131, 4204271, 4520923, 5386552, 1918067, 6996849, 2316080, 357039, 1029277, 1866262, 3708669, 4082413, 3004974, 6795766, 2867039, 2308409, 6282574, 7886290, 6162311, 4916288, 5306585, 7274262, 7250841, 7909926, 5201722, 4126739, 3076833, 6709000, 5926199, 1444951, 5212402, 7134450, 197067, 3919942, 863699, 5443129, 1918165, 2778212, 7263849, 6118697, 2178381, 3485673, 1208288, 139330, 5024781, 5043037, 2221110, 6097437, 6106138, 7764066, 780548, 7070299, 2498217, 8322955, 4586736, 3813378, 5151798, 7406008, 6276196, 6217018, 5755459, 1099503, 3575146, 6102774, 2964012, 926433, 4328627, 3615244, 7391692, 5554540, 3797117, 51861, 8232452, 7083324, 4989615, 3702898, 348260, 1725796, 5497734, 8102994, 6434606, 4027324, 291592, 2814646, 7323824, 6166333, 6925324, 7656746, 6695096, 3230053, 7413794, 3060856, 6883854, 7713532, 2186669, 5905912, 4906071, 1967626, 3054806, 7834661, 2115295, 6322191, 5367632, 7287859, 5234513, 2585842, 304049, 5685064, 1929869, 298709, 2910674, 2510939, 599066, 4136888, 5853903, 4411476, 2111209, 6883754, 1120627, 1548788, 4640918, 2667744, 6516162, 6314411, 4371749, 2270319, 7509479, 7642954, 4462218, 8159345, 8150674, 8045255, 5127711, 705581, 2098680, 5669706, 6999632, 6083014, 6487059, 650155, 4628853, 1005457, 3504795, 5903682, 5756730, 7519173, 5889468, 4896138, 7748999, 2736802, 5497205, 3128595, 959972, 8335224, 8171489, 1444771, 5320604, 1724381, 3426518, 5760546, 3387879, 2318852, 5413196, 653872, 311452, 1580413, 7735800, 556333, 4991242, 6137507, 173966, 2400249, 5038727, 7681569, 5567161, 4423377, 7638399, 189995, 1908705, 1891134, 3339752, 3856409, 6009315, 1363060, 4017586, 2728608, 1728326, 2764362, 6904627, 6439809], +[6953814, 6814454, 1217384, 612897, 6922873, 5405353, 7135231, 5774090, 799795, 4977818, 7803032, 7649318, 4996106, 7851605, 6725313, 362100, 2987055, 6692467, 40443, 6498445, 862258, 5711596, 5337215, 7955582, 4992135, 1701207, 463730, 7417484, 5876278, 2267908, 2215213, 4432291, 5885303, 2997526, 209409, 7821505, 6221350, 3488579, 6799091, 5543671, 6891879, 2603213, 6301964, 2512553, 5509165, 5714249, 7270980, 1362287, 3972095, 4980458, 5878714, 3241230, 2982259, 5198395, 7115127, 5112616, 4125505, 2418174, 81187, 6692002, 7528352, 5502543, 2037313, 8266079, 7608305, 2124856, 7289179, 6453940, 4891044, 1940314, 5782661, 4416088, 4841869, 929952, 6815878, 7831779, 2288892, 1890421, 5761360, 5012909, 5392049, 2511256, 7068885, 4619972, 3670047, 907334, 6145325, 3790292, 1142795, 2877784, 2281682, 2960638, 5154172, 4208305, 654647, 5936628, 3055480, 7634046, 6790097, 2292844, 4635011, 7439580, 4088543, 2094691, 3838119, 1172693, 7413973, 7991401, 5073239, 2728751, 6254184, 8287721, 4013087, 3741031, 7465690, 862337, 1797439, 2691253, 6955062, 5961000, 1569240, 7121029, 2365629, 7130732, 5846416, 5468102, 4874709, 7759054, 1222556, 919130, 888204, 5668583, 5093655, 4726339, 7484010, 6291575, 3114170, 7501232, 403689, 4876819, 7344540, 1259805, 6464789, 7192864, 1024345, 7033738, 6015782, 1342526, 2273308, 7364294, 33923, 5688051, 7908773, 1156932, 373222, 4491595, 1956502, 515934, 3478840, 7436585, 1069809, 7925369, 7743291, 5941966, 4466988, 5151368, 6711015, 2471268, 1099720, 6388932, 2394345, 2101723, 5496518, 3818056, 6854134, 1572021, 7231272, 7284060, 2328732, 2875470, 7726987, 873011, 7772926, 7315676, 6062587, 1763500, 1951267, 945209, 3423894, 6173072, 6578837, 8195070, 1307301, 7247339, 3566851, 5589443, 2358788, 7537900, 8201492, 2364753, 7970825, 8099068, 6196502, 7101964, 4120873, 1583410, 793634, 4969124, 2314974, 7619496, 7411221, 1063764, 7088307, 4054162, 5310509, 4390194, 6913740, 2764053, 8041179, 8194201, 7171222, 214913, 120276, 6133011, 934775, 6814908, 3669836, 5943734, 7591335, 4511234, 2246426, 5018515, 1113822, 7113270, 1570146, 5606778, 7403074, 1380791, 3289994, 1010851, 1456716, 7931266, 6809676, 8175216, 5815228, 6723542, 1426142, 2476815, 5624393, 8061398, 296336, 6547471, 7344723, 642269, 5356322, 5950758], +[7580950, 121835, 2575656, 4013929, 2116951, 555454, 7123823, 952520, 2676357, 1002897, 1216620, 7813254, 4612479, 3061420, 3095931, 423876, 4796045, 3577541, 2286620, 2978899, 6610343, 1191787, 5685471, 5943566, 1868404, 6281782, 7113597, 4050325, 5854261, 6173120, 5187256, 4736560, 2117293, 2789339, 4466605, 2176465, 3739152, 6598267, 6197330, 2015918, 4149801, 689908, 6469872, 7148395, 5469384, 7713534, 7844203, 2884697, 4008141, 3383841, 7845986, 2429126, 4211028, 3448437, 7989874, 5920200, 7677860, 4358883, 3563621, 2756671, 3392545, 4958999, 3060910, 2628507, 5371441, 2616622, 3317225, 2771897, 1730996, 3541038, 3832165, 4677409, 6036998, 6983898, 2398906, 3543147, 7941528, 621166, 5283227, 133657, 7593406, 7507594, 364799, 6206369, 4321986, 759160, 6185417, 2821013, 3349951, 3266218, 6798193, 7532981, 4971744, 6204454, 1275945, 1629119, 7862380, 3649977, 1553669, 1092506, 3333968, 3584786, 6930986, 3004116, 2643600, 7782664, 1550062, 6068735, 8335951, 2132795, 318512, 7733779, 5198713, 4339508, 3038698, 6141014, 5793237, 7943784, 1484504, 5729452, 5785754, 3687807, 606009, 4860684, 5698933, 176290, 1664478, 4990079, 871366, 6170295, 4487007, 3012238, 7981429, 5908633, 1056580, 3842041, 8105872, 2259239, 64070, 7185957, 4184392, 2329175, 6615289, 5677773, 6193848, 1895389, 3873198, 2719975, 2872839, 2652168, 3270101, 1817955, 5966991, 2959374, 3700217, 8294568, 3302596, 2349187, 6146517, 5421222, 1548073, 5042351, 2547281, 2498460, 3751226, 5764320, 3146244, 7077372, 6087595, 4338908, 4081369, 687530, 625281, 4801891, 1610171, 5856598, 159833, 6458802, 4036566, 6813967, 512410, 45561, 2791738, 6402607, 8098289, 3299501, 4254300, 4981710, 8189825, 6498810, 2634809, 3303729, 6704669, 2143613, 5488608, 3882672, 5635140, 6336147, 5673998, 2323857, 8291263, 6812437, 2348883, 7224700, 5712459, 3038720, 6242010, 1795283, 3358271, 3251121, 5935174, 7956806, 795420, 6159956, 4251054, 977493, 2091440, 676618, 7636918, 6859175, 2407980, 6707440, 4247835, 6510547, 8537, 155079, 6986811, 3944954, 6949813, 7436668, 5115668, 1878654, 7122155, 2143538, 6983228, 7416321, 6510422, 6486638, 449133, 3285601, 2044056, 4824430, 465614, 7656101, 7472515, 3414715, 7032733, 2994610, 747196, 3019380, 590965, 3856107, 4264260, 5244173, 1196906, 691616], +[4659932, 7874021, 4231352, 924735, 4703317, 965774, 6393902, 6863374, 901654, 5652694, 7938571, 4832367, 7464835, 8179857, 7770819, 6163337, 1303760, 283948, 1242537, 5599518, 3513553, 2480578, 4143242, 3893509, 275418, 6482118, 2074408, 8180475, 79321, 4352813, 3060784, 1366152, 7917417, 7610704, 8175782, 7817441, 7877659, 6621792, 5909495, 4476380, 843585, 2992718, 5064139, 5333779, 7207317, 4864287, 4317435, 5557788, 6348198, 1997392, 4680686, 7424041, 7602633, 8105240, 4109879, 689713, 6147234, 7327001, 2155591, 3308062, 5854310, 180010, 3435136, 2046757, 1012797, 4335829, 5974352, 6789877, 7246198, 6359872, 8191573, 5230790, 6409546, 6143722, 7623992, 556304, 7483237, 3974581, 6141575, 7728281, 3548335, 7207867, 2234830, 2455786, 1354562, 1377489, 3546326, 2472958, 3498149, 2515684, 3909826, 2901439, 6433830, 2210936, 1024414, 951939, 8177746, 6436569, 4174846, 2750979, 6550354, 5462021, 5941601, 7836833, 6158868, 5323260, 8023674, 8212869, 1390674, 377625, 2685700, 2258720, 5306122, 8310378, 413159, 7974340, 6092689, 4197160, 7691621, 4557752, 2552851, 4134660, 1318735, 4367927, 6490992, 4276831, 5399038, 1416955, 1016882, 1735877, 5924496, 5957056, 2612406, 2062302, 5465307, 4517243, 1912686, 4235228, 1368920, 3588540, 6443746, 6922479, 1248124, 7025503, 7870081, 584950, 2582915, 7727932, 4127426, 4538352, 1062647, 6434381, 1056807, 8042197, 8283390, 6864375, 4642395, 685912, 5824501, 5335081, 6022323, 6643765, 4733978, 646023, 7879739, 5320722, 6625951, 4502686, 4994089, 5359556, 3083171, 6886236, 6785421, 2603038, 1740275, 1993760, 5493924, 4759109, 4427683, 2287009, 4296385, 8036687, 2426681, 2044884, 4263275, 5777671, 776367, 143654, 7664802, 7748225, 3694326, 7087240, 6643656, 8013010, 8097380, 6860592, 1818358, 8361991, 859415, 4390694, 6960440, 5939280, 4472328, 1522653, 2826166, 115526, 1625827, 2829052, 1171227, 3300166, 710056, 3098632, 3912007, 7054283, 725411, 6027219, 3116191, 3200921, 6731579, 1398604, 3507322, 3258616, 6825799, 3291889, 8054646, 4707151, 1570765, 2100782, 1096983, 7262128, 4933036, 7488634, 4001214, 2618541, 2908108, 638159, 2099954, 4486700, 6895229, 6148691, 3701358, 1345137, 7520307, 1084253, 309274, 4571178, 1090521, 2778319, 3359548, 4514317, 1232502, 5092537, 3679755, 1792107, 335803, 7481206]] +aHat * s1Hat: [[5356299, 1931310, 7303741, 7925554, 2153837, 609392, 6305657, 3136250, 2941288, 530460, 8077615, 8360692, 6894278, 7030219, 491152, 7104545, 3742922, 3207142, 4883433, 1511246, 6926855, 5652647, 7723983, 1685813, 5189481, 7924854, 7857432, 260149, 8040421, 3066709, 759368, 7369831, 5231708, 3098412, 449339, 7505413, 6761792, 6127929, 7737545, 2384712, 637080, 5859717, 4986448, 596930, 8225240, 1893100, 3179678, 2952658, 242386, 4439989, 3609305, 8339777, 7047361, 91504, 1848779, 5030401, 951986, 2558192, 7002698, 6068533, 5568880, 7346691, 5889181, 6155743, 7886383, 1406972, 7622529, 4259958, 1983168, 8307712, 3712779, 4492607, 3759662, 1287669, 7629642, 7539518, 2623392, 7980251, 3212723, 4151028, 768304, 5822283, 3792129, 8302021, 2595602, 7531997, 8031649, 4473840, 3275962, 6893515, 7281840, 5262910, 6127579, 3912538, 3978695, 610274, 5243166, 1689202, 3037693, 2252742, 2604673, 2932227, 4575112, 2128926, 3526816, 4392014, 6919548, 4237007, 1280989, 5365150, 6046784, 459760, 7666802, 6557688, 5118724, 5417274, 3319485, 63477, 7233436, 2291441, 1588833, 5606815, 2727231, 432604, 5809954, 2747821, 4806416, 4764130, 4556330, 7163641, 631617, 1045133, 307949, 397031, 270426, 4094691, 4484784, 100358, 3766967, 6785913, 5734322, 5865128, 8072991, 2023343, 2974590, 5748970, 7478122, 4624596, 3357713, 4015674, 7388030, 3282545, 7733751, 5733733, 7267858, 4992679, 1454395, 4429094, 5282522, 110936, 5083990, 4420166, 7011717, 6578737, 3353466, 5075507, 7035190, 5684036, 8104361, 6702454, 2974524, 854467, 667178, 4368892, 6648292, 1315627, 3012288, 7645736, 6188714, 208579, 2454757, 5101499, 2619064, 6026627, 1448404, 1102214, 5779571, 3481475, 449031, 3325074, 6267010, 7308622, 2501928, 4196686, 720831, 7616509, 6529535, 3360967, 8080649, 5058368, 1015046, 972229, 6852326, 95777, 6955902, 1801530, 7628665, 515802, 146604, 2162265, 6257569, 2410346, 5690426, 3447994, 5373061, 7440421, 396258, 4797877, 8283433, 2691490, 1424515, 7738954, 3906238, 5487514, 4215290, 4753319, 4210441, 6764287, 7570213, 584239, 3668780, 637971, 5634150, 3426236, 3744154, 3397217, 1405566, 1804261, 2335962, 5807738, 162426, 6709099, 6287954, 3977910, 8057417, 6151491, 3663207, 4876059, 7694499, 3682806, 6167620, 3072556, 7938834, 2337471, 4558027, 1951482], +[3558904, 6768771, 4705558, 2862463, 3409666, 2996371, 6242882, 3757159, 5662539, 383660, 4491438, 759267, 5424063, 4889573, 7326241, 7980019, 3742759, 4644347, 4262593, 2477044, 1002331, 7043673, 451189, 7689104, 3071955, 374146, 1591762, 2996709, 3114743, 7330025, 2643775, 247995, 3569180, 5419172, 2900161, 5936569, 6481244, 2734873, 6054115, 6531286, 5460917, 4379365, 7244506, 4191749, 7248879, 1799303, 3623316, 4049686, 3688415, 3827381, 2447369, 6220814, 483348, 3427525, 4290025, 3365314, 5585246, 1006501, 8214852, 7104886, 2198214, 5330389, 2007901, 7308495, 1700767, 2555451, 165618, 1834227, 1158173, 1819053, 7824040, 5717722, 821614, 5048193, 7985083, 6188988, 5148089, 7084066, 1220989, 6792374, 1009070, 2050913, 6790422, 6427299, 674355, 1627258, 4397266, 2832912, 4730434, 243321, 7550827, 80232, 1048461, 8146792, 8338365, 6675319, 7661743, 364863, 5774159, 6475087, 6292737, 7573144, 6083929, 3734651, 8207220, 5329015, 6433982, 5291060, 3129118, 7050324, 2154368, 976851, 1667668, 3902028, 6436341, 1587797, 1155044, 4404011, 5581934, 1233837, 7277224, 6518419, 128512, 3612838, 5545190, 49004, 8159326, 563769, 3788419, 6748956, 6344107, 295910, 7594454, 3134827, 4336216, 7505282, 2559031, 5388010, 1974057, 5211954, 2424849, 2445622, 79727, 2334714, 3138703, 2368451, 2171409, 3999410, 3442251, 7552737, 7208383, 4841373, 4508413, 5673001, 2185455, 6113276, 4575391, 3481170, 6180665, 7197361, 5214333, 3470102, 8182446, 3770025, 381096, 5808211, 7356975, 4781193, 350210, 197307, 4772947, 6452774, 4845586, 6974712, 7515912, 7452559, 3356214, 1672268, 397810, 1750361, 6855144, 6177818, 3614689, 7086944, 3287180, 3793765, 399733, 1995251, 1871766, 5180869, 7031007, 99965, 4074931, 4892003, 3442196, 2926270, 7127199, 3831799, 2780952, 1873263, 1403272, 8128548, 2523340, 5763286, 1870704, 984576, 3650112, 7757898, 8083309, 1636193, 3404879, 7109682, 1027577, 7640729, 7981983, 5008376, 7207556, 963197, 5122111, 5268390, 1158819, 2964630, 2058801, 2518266, 1071640, 3500024, 3375324, 4793926, 822441, 2411320, 7655190, 6716969, 346125, 3819766, 7092035, 531028, 3472811, 486244, 7389042, 6161019, 5397903, 2760257, 4230022, 5102704, 4724338, 8376316, 2501561, 7392212, 6370734, 5134456, 3109703, 7922650, 4776311, 6845182, 5817507, 8204684], +[1736177, 1413435, 7706408, 2975456, 5541766, 1407143, 5351381, 8314562, 7482370, 8360761, 1850524, 7137151, 5840118, 166235, 7431434, 5648752, 4432041, 788979, 1851176, 3496698, 3780252, 2937292, 5434817, 1064974, 236707, 1250746, 2222339, 4320174, 2131550, 928781, 7306841, 5124759, 4895324, 399193, 1792728, 3465199, 2084837, 8145715, 6636274, 4568047, 1976674, 1836236, 8062792, 692434, 2831469, 4736878, 4122127, 4372989, 640425, 7439050, 2591081, 4418362, 3305827, 5969019, 2261242, 6554920, 2465713, 5245952, 1983931, 1271500, 3011614, 1067043, 3970539, 7909291, 5206094, 250012, 4879503, 81208, 2739298, 648731, 1558801, 6745331, 8303640, 7457443, 4418672, 385096, 3105715, 4927609, 7541436, 2181328, 5870284, 1600494, 4662224, 226320, 5856066, 3496678, 6749208, 4624495, 4302333, 2852355, 7856347, 677223, 558609, 2776096, 2557201, 5563015, 6616010, 3313126, 7607996, 5479431, 2291257, 4392734, 4143015, 1051672, 8009194, 504711, 5058301, 3757696, 2654352, 2540709, 7151100, 2919697, 439871, 3410382, 2456633, 4604384, 6608420, 3383305, 6257192, 7069955, 1236023, 555014, 2072677, 6946566, 14713, 2283660, 216914, 5627933, 7930609, 6437241, 438137, 4911098, 1686839, 6761181, 5509143, 262063, 755015, 7674455, 1654731, 5743511, 3454331, 7261702, 3619418, 96543, 7729918, 1384649, 285985, 2533951, 8045238, 2168776, 6387019, 1067557, 4153406, 3020824, 2095574, 5780465, 2341870, 5675490, 6336409, 1447496, 4541788, 5009178, 4409257, 6786077, 7561108, 7893177, 3592624, 7666868, 3534481, 5028053, 5110934, 1226483, 2047932, 4128767, 4675459, 5415041, 840943, 4037233, 6543131, 7203919, 956131, 2749308, 5884020, 6767142, 1928634, 3731400, 3664668, 5802370, 6032771, 175697, 3137093, 2466276, 6489882, 2848365, 6884231, 6646169, 7309768, 3859265, 7328997, 8361875, 1190167, 6142719, 4186680, 6127118, 6236844, 1404501, 4282843, 2154006, 3275749, 5975450, 6117874, 567668, 617152, 4152757, 2265453, 3101148, 5052928, 5570942, 5428680, 7534011, 1203430, 829181, 563900, 2777447, 3697340, 5651521, 7985108, 529550, 4610894, 2078265, 3940489, 534980, 6400923, 5160599, 7659849, 5582558, 6951454, 5915050, 6721575, 7985818, 700572, 7757999, 2584187, 2783847, 450075, 158491, 5361698, 1131103, 938885, 2096040, 6751884, 1351101, 3840053, 178489, 3282801, 1469284], +[8195053, 5209273, 7760591, 5111799, 5033477, 5220217, 5816911, 2790632, 1882047, 8053438, 8363037, 1727849, 8375343, 964121, 1805868, 7691589, 1978348, 2211389, 5544905, 2002840, 8352538, 3132816, 840338, 6975354, 1987393, 1610570, 8141019, 5050259, 1888213, 1057513, 7222225, 3174907, 5293066, 5263632, 3791797, 2721531, 3838501, 7337213, 5011589, 376161, 3159905, 806808, 7391617, 2088126, 264803, 7337546, 5903316, 622705, 741733, 2790949, 4438828, 4775174, 547623, 818397, 7136919, 818607, 7489543, 7738255, 23290, 3434731, 1042561, 2691851, 4815652, 1678654, 1825681, 6457756, 349255, 4594800, 310873, 6697089, 6240592, 7103037, 5696914, 4332529, 3492136, 3917923, 1262892, 7953092, 1920568, 2555944, 5072881, 2315180, 6957431, 177798, 5699776, 6824307, 2760992, 4833286, 7712090, 2684464, 1467346, 4929204, 4454877, 1108170, 8224563, 82902, 2484842, 2357130, 3232578, 24952, 2274475, 728841, 7195908, 5727303, 3623643, 838846, 3920478, 4235618, 718653, 7532564, 4557544, 2436959, 7213176, 7669046, 3331455, 1178400, 7817710, 3208789, 1629271, 5172388, 5982717, 4907072, 6323887, 5462831, 4805307, 6357291, 8120665, 2381741, 7998498, 268758, 7343715, 5257781, 3319982, 7146488, 437234, 4955033, 103225, 2926410, 2618646, 2944721, 725647, 1519647, 4376885, 7991228, 8175824, 2850050, 7327080, 440942, 5519994, 6161359, 4936433, 70578, 4867002, 7112087, 4869869, 4275994, 7857879, 3672893, 7440392, 3515136, 1818598, 6787287, 6430306, 1101593, 8061605, 831734, 6835791, 6193237, 7531769, 4464051, 5740268, 6009117, 1243319, 1500293, 6868103, 7858882, 5413083, 3659775, 6360697, 2138582, 6144076, 2230374, 508546, 1399531, 4850610, 7047172, 1334121, 6564445, 746023, 6021639, 615477, 6041008, 5831326, 6078494, 6583612, 119319, 2632431, 1999150, 458088, 6996226, 631885, 1856257, 6278413, 7806208, 2141307, 1986677, 3757898, 2736599, 801425, 1563372, 5725935, 1232416, 1811041, 7526837, 8051317, 7162834, 3310954, 4553764, 7311034, 1536885, 2095088, 7326548, 8288780, 3654076, 7027177, 8054848, 7245326, 2536699, 1137399, 1816611, 3796605, 4726902, 5980753, 464134, 7419166, 3720557, 1616045, 6690455, 6498205, 160189, 1607728, 8083423, 4529838, 5948501, 105499, 3649347, 451385, 6687759, 1032804, 7210834, 5979066, 8036766, 3694435, 3083572, 4921833, 5504434], +[3098851, 1886755, 5522073, 1016488, 3725422, 1253971, 342708, 423704, 2973749, 3165878, 8221646, 6877523, 3292551, 6923273, 3257483, 3023046, 7899239, 296086, 172616, 4662667, 6573943, 852115, 835471, 5854615, 2301872, 439941, 5291504, 7896942, 7116033, 7111310, 7013905, 2734543, 6086352, 1010042, 1981762, 5261669, 6712327, 103726, 2080301, 3988747, 7007856, 6265645, 4598218, 281618, 1265298, 4755410, 2311304, 4067381, 2933466, 2337632, 5546531, 5234842, 4942613, 7049662, 1942109, 4889101, 6649520, 612211, 4482039, 8277468, 7626273, 8147219, 1005729, 4040760, 7836315, 7121187, 1222784, 7021037, 7952923, 5008922, 1882006, 1730779, 6004583, 6243590, 3715888, 8082314, 5972844, 7042952, 4692272, 2183719, 8161343, 2759012, 7182235, 283672, 3387077, 1515562, 90578, 3031621, 6251259, 4576845, 1910721, 7069640, 412577, 6275616, 6688687, 7976830, 1569774, 6831598, 6113113, 2614702, 6823871, 2643338, 6681982, 6720254, 2803194, 349508, 3691921, 4808547, 4329014, 3343125, 2697937, 5242, 6732474, 3416725, 240680, 1931664, 3883168, 5208386, 8013248, 3736292, 7792905, 6690422, 7183166, 1451736, 1640736, 5969315, 5659049, 6986618, 490362, 7871522, 3990672, 5380233, 2823715, 5770687, 953334, 1053611, 1300886, 5864321, 5717787, 4110582, 1530210, 4931595, 3059017, 5071479, 6767078, 1040879, 1431308, 3852177, 1335639, 7100011, 6418954, 1584552, 4931476, 7418994, 414679, 4103554, 2645348, 1802686, 525632, 1605744, 3116085, 3444400, 5564831, 1312712, 6084957, 7509210, 5653708, 4338717, 3099921, 4318787, 5576858, 6318540, 1429150, 5068796, 2817215, 5181984, 8214074, 572616, 2057466, 2920154, 7651755, 6885494, 7842682, 262630, 2369527, 7195419, 3026995, 3496337, 4808487, 2766970, 2903344, 5834993, 7414649, 7938878, 1968847, 2538133, 6603793, 3038288, 3884783, 2455080, 8376578, 5244839, 8308816, 3345155, 3627615, 7541787, 8206725, 4263507, 4039576, 4829772, 6161614, 7413142, 4543067, 2454072, 8243882, 6825134, 5260857, 1555600, 3939658, 2999140, 1702661, 5312710, 2145047, 4963470, 5429391, 8025428, 6277212, 1307072, 7063011, 2404323, 8313382, 2548738, 4981588, 6935441, 8106254, 5872353, 7007947, 839045, 6987357, 5572400, 6930805, 7068799, 5796677, 7367956, 2715874, 3356088, 5959118, 8269838, 6401981, 2311271, 4044570, 1103727, 7777793, 811488, 8337093, 2754126], +[2691317, 5881308, 2992825, 2286970, 8335510, 6922817, 3420603, 5279667, 2121819, 3216961, 7147090, 6407303, 5477005, 4558109, 942353, 3709871, 5923384, 8200569, 761056, 6105791, 1426494, 6194601, 4113371, 5734571, 3718720, 1728355, 2640984, 3587659, 7141534, 5967259, 8142931, 1151393, 7801353, 933775, 6268989, 1550451, 1605007, 4134200, 3381988, 3664079, 5841538, 2866330, 829264, 3917779, 6694605, 5187145, 4260166, 6242231, 2055947, 226025, 2981359, 2173990, 2188916, 5510032, 7332265, 4394574, 2173354, 911561, 8160963, 1744427, 6761902, 544096, 5413152, 4640858, 8185099, 1398118, 4960017, 1582944, 3869233, 1708033, 7322079, 8325941, 1360348, 3232179, 1611688, 737615, 6076125, 3429290, 2402165, 4785013, 1847266, 2538329, 2759108, 6602760, 1606892, 8127286, 2388567, 1456208, 6384370, 4877567, 4214655, 6090586, 2049959, 2225865, 7009355, 5700307, 6191618, 5557941, 8141315, 3292171, 913705, 8349414, 41426, 8360466, 4872505, 2603721, 7450064, 6104949, 2279064, 6754453, 8056014, 1717223, 1516202, 5021651, 2874116, 1656917, 466806, 8109411, 5853335, 2694007, 6822700, 6084876, 7677653, 7941019, 4985398, 129850, 331770, 391757, 1399332, 5971004, 1279308, 3936313, 3523317, 2133122, 4839090, 5092130, 2187705, 8337478, 1052408, 6876169, 3615044, 1590033, 1527167, 6784469, 5194852, 1863803, 8195191, 3403823, 7977928, 7709637, 3513379, 2821413, 2967675, 2696167, 2265021, 8260322, 7747021, 4598263, 707536, 8209497, 6562846, 1244127, 398180, 622322, 2458535, 4468503, 7235940, 7701458, 3431313, 4050708, 7039024, 353385, 3074772, 3478149, 2234459, 5426962, 7446204, 852751, 1192793, 2896515, 6932426, 4093594, 290179, 6172877, 4693391, 4692414, 1115243, 4116500, 4556568, 8332345, 443006, 7953251, 71568, 6485800, 5967720, 7596577, 2907311, 2172070, 7909839, 1317817, 909156, 7565357, 6725905, 2125918, 602119, 4853232, 4183993, 2928585, 1476079, 6729365, 8091060, 4269713, 3634563, 1758471, 6085769, 6024439, 1572329, 8054454, 7940640, 6937184, 7785521, 7187013, 3968381, 209864, 7520244, 1517611, 3576123, 4779529, 1737471, 8222951, 7246754, 2965172, 4284164, 5852692, 6801096, 5973961, 1631018, 5424368, 3146561, 8243545, 2898472, 2765348, 5412674, 4308907, 2410301, 4761874, 6135359, 7120165, 6902879, 4199065, 113303, 7825652, 1268469, 4945691, 4273253, 4120001]] +NTTInverse(aHat * s1Hat): [[830897, 2049833, 6969400, 7713335, 5408488, 7739107, 6814387, 5445045, 4299840, 4623630, 5600489, 970754, 6088905, 5234075, 4265145, 4827235, 6985528, 8132429, 7904641, 2124141, 2214658, 1990802, 6491209, 1466042, 3906849, 422790, 2844497, 5635218, 3052908, 3693638, 7069807, 5149612, 6793090, 6316831, 5223556, 4906560, 2640758, 6259040, 4603354, 350630, 2676843, 642972, 1194346, 5057399, 1197066, 7592819, 6001672, 8183194, 7914878, 5330704, 6947177, 2890033, 2528985, 8237993, 910660, 2104710, 6815144, 483063, 3043336, 4341116, 3620738, 254071, 2265370, 6178683, 7489213, 401005, 867999, 1172157, 1815764, 4059760, 5383393, 3043078, 473863, 6728410, 808005, 3000087, 2826274, 2287193, 1175760, 720220, 2434523, 862109, 2667457, 5338582, 6495963, 5491680, 4325993, 754733, 1906144, 4680928, 6780178, 7492093, 5356156, 6345635, 7283384, 1417413, 5550317, 5304042, 4624792, 649064, 3151665, 8139938, 1415280, 5185361, 4359608, 822499, 5057029, 3453267, 6898914, 372767, 664304, 6781702, 3473923, 3631653, 5954646, 6724674, 1149409, 3956638, 5627577, 7636946, 3706592, 1746907, 7734756, 3722467, 827361, 903702, 31090, 5772814, 1665351, 7000261, 6776039, 8351822, 5804027, 1694323, 574486, 6736393, 3280669, 2804553, 7022444, 5492468, 5300019, 4706983, 1476604, 8333644, 4385118, 8290495, 6378992, 1211684, 120187, 7583559, 3761388, 7679430, 4506238, 979295, 8258427, 1039168, 6552448, 5942033, 7114669, 3915990, 6195466, 4623256, 5115335, 6476043, 1516424, 5987993, 2962237, 2153131, 903430, 7822971, 4335736, 7340380, 7347333, 2846393, 5789183, 4324995, 5359805, 2574489, 7943831, 7250479, 5355207, 2097405, 6511510, 2891214, 1544013, 2468945, 2261919, 6923981, 785750, 7168456, 3889771, 6802616, 4866776, 4838100, 5467167, 2599498, 3843348, 3080907, 8035389, 5510313, 6180840, 7198481, 1425344, 325996, 6144076, 1213298, 7716704, 7830318, 6511496, 2575529, 3832433, 4768048, 4599869, 4430115, 1424196, 7910434, 3210195, 7904069, 5251564, 3872663, 3962856, 2958241, 6415110, 5314643, 4718362, 2957079, 6361575, 3624111, 632494, 1766540, 5904115, 5307677, 7778880, 6385387, 5668306, 3031461, 7408523, 1107530, 7262246, 5641663, 5909338, 4632800, 5274126, 3773435, 7142527, 7746948, 2683311, 5237050, 5615659, 5852448, 6063504, 3077534, 6186557, 1497080, 4197381, 5483691], +[4592415, 5153279, 4630162, 8013727, 2438913, 2145174, 5103918, 6594116, 1964706, 5675452, 2120068, 1411298, 149435, 5563055, 4826949, 5463073, 1566682, 541590, 2914919, 7028119, 8370750, 7679217, 6797260, 4310226, 6733539, 8345798, 4855383, 3311401, 4214074, 4681586, 1405343, 2389656, 4576062, 7882220, 1343756, 806412, 2380852, 6428998, 7435815, 4957499, 5341197, 6297497, 2890529, 2011091, 21312, 5700337, 841142, 8279776, 340211, 2680436, 1567372, 4642734, 303716, 4588000, 954357, 7516685, 8000311, 556713, 4268427, 5886085, 3776330, 580825, 741650, 6521908, 428585, 1757913, 1139555, 1271587, 4188190, 6297921, 6353457, 7341871, 278667, 5528715, 677489, 4047886, 5211162, 460309, 4838532, 5416501, 4255888, 352927, 4653490, 1987430, 6049583, 1458006, 8193416, 1792290, 2396159, 746900, 3059760, 4599055, 4865765, 5673808, 2038313, 4571592, 7372586, 4876261, 8071403, 4559099, 6901679, 624880, 1213247, 742437, 2479534, 1549581, 289997, 1313748, 3908495, 177857, 2327634, 1032168, 3965419, 3912590, 6274256, 8064114, 7693567, 2227184, 5233996, 6081523, 4125051, 4205008, 6245450, 4989176, 4756688, 4754690, 6807733, 6823527, 7483162, 7968599, 5242427, 1022754, 4789181, 1307998, 2941870, 4931752, 2648397, 6418741, 6107579, 6934175, 3953297, 1605391, 5714599, 7731621, 664492, 3905930, 7160887, 4497988, 5533705, 7110106, 271066, 5213343, 4463502, 2595383, 1931815, 5407974, 4969151, 1632292, 192335, 5755591, 1983977, 5285764, 1727522, 2059834, 6943238, 6399418, 2871853, 5887443, 2239285, 1465831, 4131431, 1679154, 2405050, 6523084, 6550802, 3244215, 7601208, 421743, 2936727, 7112410, 8209256, 3077780, 2083139, 7404340, 4908911, 5434009, 5633403, 7786379, 8359734, 5078551, 3574840, 5183943, 5168403, 7576958, 3046321, 5326148, 812211, 2521821, 70283, 3652865, 1316450, 4268777, 213726, 2742138, 8169721, 7122315, 6988426, 8188827, 2635151, 3322438, 447857, 6604058, 7056059, 259486, 5180679, 71721, 3264409, 5105523, 7159751, 2895697, 1886056, 4336823, 3206815, 403509, 6124788, 4011653, 6089384, 6491742, 3755413, 7959816, 2305185, 4196513, 476001, 7017368, 5569862, 7869277, 2039182, 5911568, 2788257, 4261139, 1821970, 1070015, 6217894, 3551701, 4795383, 5276772, 7586695, 693074, 2086600, 486415, 1381673, 4885134, 8107906, 6881654, 6204728, 8280693], +[2740557, 6007421, 5931051, 3757377, 4836137, 1153007, 6299116, 3461784, 5064365, 569404, 8372552, 190220, 6097117, 3008663, 2112941, 82737, 1276153, 1966476, 1938665, 7246408, 1073683, 2933818, 1457258, 6289821, 3826808, 7639039, 5350343, 3728906, 7642817, 2773085, 5252976, 3057401, 5468748, 8296322, 711076, 7715031, 2316303, 8234944, 7469701, 5504741, 1318867, 2922626, 7346584, 3268244, 674218, 236063, 6836301, 7855565, 7879839, 6595194, 1137711, 5241047, 2598323, 8239991, 895808, 6894915, 2720983, 8089168, 4585442, 6821664, 2561609, 7661468, 802335, 2176307, 2909782, 3769173, 1747216, 929740, 841768, 6080272, 6280149, 2311763, 6706490, 7758854, 2188456, 5796405, 980094, 1869249, 1207568, 3311942, 5370121, 8084922, 1484540, 45466, 5986116, 6326969, 2010476, 7700450, 7718070, 5297615, 1200189, 4691455, 6852796, 2486223, 6566937, 3376700, 5975811, 377560, 2992123, 5719152, 124601, 2943199, 3413509, 1425227, 2725134, 7893789, 5595018, 7183180, 4625576, 6637224, 1631761, 1928130, 6477318, 7806911, 2717771, 5929829, 5015387, 783422, 7402749, 2839557, 3898792, 4974707, 8141499, 4799250, 2006911, 724092, 750613, 7305545, 1591728, 7032265, 5929216, 3044433, 2275185, 7410199, 4512554, 7175003, 1382107, 1892424, 70708, 1405837, 8139616, 681539, 749605, 2232636, 114923, 4179288, 7854707, 1388169, 8079202, 8327210, 2994360, 3891771, 805618, 7338730, 2844575, 5759135, 3312670, 8378473, 4664736, 5670733, 6117139, 1829278, 6808408, 7593467, 3192688, 3087763, 7842602, 6578147, 2614315, 1062153, 1448826, 6850521, 2826323, 5347360, 893855, 4484169, 2679184, 4170079, 4721908, 2846492, 2225969, 734576, 4009121, 77517, 7654277, 3307933, 5840922, 5619375, 7951566, 5161784, 1134459, 600687, 322361, 3536657, 3682802, 4157582, 7668200, 1051427, 6101820, 6776779, 6469347, 7952998, 3227276, 7585212, 7964744, 3309650, 8036897, 354535, 7955459, 7987967, 3582072, 4043344, 4978792, 2047531, 5015151, 2530612, 38091, 2223337, 3229099, 3311431, 1704177, 2833718, 1373173, 7807851, 4081251, 350181, 4915974, 3230182, 5088912, 5741127, 46999, 121159, 4548609, 588759, 3058129, 6996731, 4551434, 2863896, 7114998, 7266462, 6997283, 3047642, 4775473, 2536925, 1591922, 1680284, 2863277, 7545610, 3598855, 494535, 1700690, 3072120, 8273142, 4126342, 265812, 420681], +[1165922, 6792254, 7240533, 4959654, 7163765, 2479428, 2718384, 1386152, 6409068, 7204480, 7296443, 5064345, 6282509, 4909950, 6871560, 5062845, 518940, 7356617, 4700085, 6303551, 4120110, 1333608, 1446586, 3218126, 6515906, 2342962, 8116363, 1756661, 2749747, 1926680, 4765514, 3638330, 1430573, 6526919, 850159, 7642442, 2623215, 2389318, 1688207, 879891, 7539896, 572428, 823105, 2467476, 1722302, 3401292, 6019980, 5433811, 3914407, 5152592, 5880296, 325364, 5271356, 5006123, 4497005, 7755062, 5100632, 6716977, 265352, 2913943, 4308361, 325770, 8190788, 894466, 6141811, 5095200, 3617557, 2951312, 7073117, 1044940, 2632184, 2075567, 5102243, 6696955, 1467227, 4257292, 2393651, 1090145, 2386335, 6445110, 1235481, 7820046, 2739736, 6296785, 6075674, 8055931, 2523517, 4311714, 5060848, 4996690, 1226347, 2161777, 5036212, 6408704, 4376538, 563575, 4662674, 5447949, 2983142, 3544127, 2461204, 472760, 5685843, 7083710, 3331055, 375279, 3011108, 3365187, 4414443, 6599024, 6948574, 1784217, 4292718, 6833875, 4919211, 3121660, 3097935, 4906454, 2299645, 1786654, 5613340, 7103172, 3505385, 7361360, 2981186, 1080003, 2745679, 2523274, 3848616, 4855258, 7094923, 1461412, 3549634, 5210298, 1721017, 7935000, 6573710, 3526769, 4933189, 3953994, 124645, 4155263, 7734041, 5363945, 2023898, 4681685, 5717705, 2923714, 4684569, 601241, 5116695, 2279070, 1543846, 7926817, 4638629, 256165, 1732749, 5274674, 7760054, 3411594, 5920789, 935213, 5145041, 3751384, 3315394, 6942898, 533028, 4365841, 485550, 2640630, 5761238, 6519994, 576913, 3394708, 373724, 1469610, 185985, 3142141, 715083, 3282873, 8283929, 849701, 7280659, 4449668, 8378645, 3856700, 5446620, 2640008, 7923692, 3764092, 4077919, 2389415, 4686681, 7841337, 33907, 4501743, 6596869, 1115221, 1185202, 6030838, 7845021, 4433026, 4556660, 6530018, 1005194, 2353208, 392020, 3200471, 4419834, 4992842, 7629983, 7999834, 7576583, 6121793, 5503897, 2573041, 3917311, 788310, 713615, 4398330, 5770590, 2956824, 4424490, 458228, 6865698, 5063749, 5533821, 2836357, 3516222, 4222168, 5731722, 72813, 2151774, 1512336, 7423130, 7295495, 3343582, 4462879, 91819, 3873229, 1596607, 35110, 3775259, 7452950, 2394584, 6767273, 5207202, 2815479, 1102983, 2456420, 4235062, 5911800, 3715813, 3195018, 1371865, 3115713], +[4684360, 1726385, 5037526, 934248, 8117288, 1152637, 7176799, 1254229, 2336714, 361782, 8374155, 2728471, 794828, 7344574, 5796679, 1009357, 859095, 5138797, 8081098, 2378654, 3694575, 8214384, 5342217, 370018, 7582101, 662992, 3512818, 1550381, 6756713, 2159746, 7249251, 6721355, 6816583, 5187090, 2721104, 857463, 48719, 5633021, 6525980, 1920051, 2487365, 1655239, 7373066, 2815836, 6544017, 3503349, 5260343, 1303671, 4963255, 1998433, 6227129, 3898909, 1776751, 1760740, 2273285, 3027084, 6344126, 2415717, 7053257, 5071738, 2087796, 2214594, 3207192, 6073885, 5658525, 7659046, 1871656, 1180335, 7936821, 2390818, 7223535, 7249072, 6960120, 2089291, 3602050, 7262916, 4490582, 3636458, 7560760, 8355905, 5454640, 2723159, 4986637, 3780578, 3923420, 6298252, 6957399, 5961486, 8291705, 8351841, 4343476, 3932531, 1458805, 485326, 4036550, 4141875, 3358343, 6280875, 4491748, 7250024, 4887076, 38561, 4537942, 6248065, 2455585, 1853113, 955799, 1330879, 6909030, 1401304, 2035250, 4475595, 887631, 2124273, 5236894, 2107167, 4939746, 3690251, 7651734, 8119108, 3001568, 5398911, 3288628, 1699543, 135880, 8271083, 1000247, 7797886, 8268796, 3895005, 5384630, 8062628, 4244946, 1710336, 3662334, 6087177, 370975, 363527, 540193, 8171400, 6272485, 1746157, 7361814, 7142487, 5787816, 546197, 4946586, 4526863, 6284879, 6763192, 999986, 6182228, 4731261, 4229706, 1616447, 1658170, 2396584, 1621393, 7557399, 378614, 2932410, 1222804, 5869491, 2644699, 7572073, 4944327, 4042877, 2475161, 317964, 5930686, 6513231, 889689, 7832117, 8290498, 8065607, 6473147, 467457, 5038536, 8204414, 8321093, 1954798, 4216969, 6141032, 2652546, 5900350, 1855015, 2192647, 6164920, 4284918, 190335, 7383178, 1733132, 4020451, 3602858, 7433743, 2513852, 2634869, 6226651, 477430, 6596145, 5962858, 794999, 1417006, 8198466, 3497585, 281111, 7680403, 2443684, 1011917, 6073083, 3873022, 575347, 7047485, 1825853, 8061795, 3809162, 7514118, 337665, 2160851, 1936810, 6092886, 8249223, 2301270, 2432694, 6716509, 1878961, 7994941, 483679, 2626358, 7627828, 1134616, 7947459, 317201, 6566970, 4853487, 5859299, 1808804, 171054, 7959524, 7386347, 4186915, 4916270, 461253, 6646769, 3215518, 6359038, 3851356, 1170287, 2206751, 3846975, 7933797, 6960326, 7172109, 6407306, 5944817, 7568736], +[1951915, 3838908, 3756091, 4942758, 6438653, 6929857, 7684886, 5183908, 4582831, 5540235, 6473838, 4907421, 4580004, 7996268, 7505443, 6555094, 5372016, 5676161, 3811222, 5517851, 7983205, 1000478, 7327670, 268379, 4955664, 3719508, 4260597, 4433527, 909436, 2309540, 1359836, 4279147, 8098079, 5090944, 2826781, 864624, 6426334, 1094150, 2029358, 2864608, 8123313, 420666, 7713286, 6512271, 1779054, 4738312, 4494405, 6792685, 2659027, 6322127, 677084, 6280011, 7186569, 1301764, 5863648, 6180101, 4046917, 3511561, 4105404, 1436767, 5793601, 7768950, 5236955, 5512131, 2909016, 624905, 6831932, 7569438, 507421, 6975683, 5424097, 7228020, 7271781, 5084201, 492980, 2336256, 4461399, 6023447, 7293537, 2046166, 294946, 2932991, 6794956, 5427881, 6623646, 4445475, 3282147, 6198313, 158054, 6526217, 3604427, 1954483, 3010574, 5181770, 6432019, 6690092, 8885, 6257878, 567396, 7698811, 4261643, 4198201, 2770665, 4907225, 1275497, 7748961, 3402173, 3182989, 1307339, 1115522, 5841994, 4642303, 2182272, 3299200, 4457, 3624240, 5678075, 4629038, 4715180, 6394531, 1935151, 1035597, 4716195, 2159454, 5403929, 5241668, 1068632, 1150356, 3205192, 7464596, 1791722, 8244970, 5083707, 3152408, 7694101, 8076840, 3378366, 448096, 7869255, 4926424, 83653, 1380726, 481499, 2742996, 875123, 1419587, 815580, 631302, 952072, 6798375, 6413567, 2374919, 406894, 5968674, 4263795, 104133, 325965, 5447609, 6282146, 334045, 8313408, 2317000, 6973482, 2982826, 7497638, 6425268, 6793903, 6579432, 8332390, 7132041, 3262463, 4615482, 1337702, 6730997, 5924950, 3389788, 6729045, 2673763, 4487645, 207969, 2738031, 1372362, 2253789, 4202252, 7081219, 1241675, 3065948, 5066996, 3067654, 1898189, 876069, 3887170, 6467498, 4280182, 1920861, 4262365, 7800920, 4324875, 3911318, 2727607, 5224718, 8281029, 3920138, 6706120, 1222966, 3515452, 3716316, 8188782, 608133, 232299, 6247912, 4788444, 2724103, 7032321, 934790, 7385469, 6250595, 6574643, 5906701, 7106016, 4970121, 4963271, 6646485, 2585470, 2009028, 4096226, 2575954, 7089876, 2901776, 5943537, 4461610, 1894206, 3498810, 1985333, 6998062, 346676, 1030114, 508651, 6346205, 3129931, 2415770, 588702, 3950752, 6073905, 81219, 2294871, 5092181, 4891073, 4958391, 6458962, 4732317, 1094440, 857115, 4854223, 6996668, 2297021]] +t: [[830900, 2049831, 6969399, 7713331, 5408491, 7739105, 6814384, 5445045, 4299837, 4623631, 5600485, 970754, 6088909, 5234071, 4265142, 4827235, 6985524, 8132433, 7904637, 2124140, 2214662, 1990798, 6491205, 1466045, 3906849, 422792, 2844499, 5635221, 3052908, 3693642, 7069807, 5149611, 6793088, 6316832, 5223556, 4906560, 2640761, 6259042, 4603358, 350631, 2676846, 642968, 1194346, 5057402, 1197064, 7592818, 6001671, 8183191, 7914874, 5330706, 6947178, 2890033, 2528989, 8237995, 910663, 2104712, 6815148, 483062, 3043337, 4341119, 3620735, 254067, 2265369, 6178682, 7489215, 401002, 867997, 1172154, 1815760, 4059764, 5383392, 3043074, 473863, 6728408, 808007, 3000083, 2826276, 2287191, 1175756, 720222, 2434519, 862110, 2667459, 5338582, 6495963, 5491680, 4325995, 754737, 1906144, 4680924, 6780177, 7492093, 5356153, 6345631, 7283385, 1417415, 5550314, 5304043, 4624792, 649061, 3151662, 8139941, 1415281, 5185362, 4359611, 822499, 5057026, 3453265, 6898917, 372768, 664308, 6781705, 3473920, 3631657, 5954646, 6724678, 1149410, 3956634, 5627580, 7636950, 3706596, 1746907, 7734752, 3722465, 827362, 903699, 31092, 5772818, 1665348, 7000258, 6776035, 8351825, 5804030, 1694320, 574484, 6736396, 3280667, 2804554, 7022445, 5492465, 5300019, 4706980, 1476604, 8333640, 4385117, 8290499, 6378996, 1211680, 120189, 7583561, 3761385, 7679432, 4506234, 979292, 8258426, 1039166, 6552444, 5942032, 7114668, 3915988, 6195465, 4623253, 5115332, 6476045, 1516422, 5987992, 2962233, 2153134, 903433, 7822969, 4335739, 7340377, 7347331, 2846389, 5789187, 4324991, 5359801, 2574487, 7943829, 7250481, 5355205, 2097402, 6511511, 2891216, 1544010, 2468944, 2261920, 6923985, 785754, 7168456, 3889773, 6802613, 4866780, 4838096, 5467164, 2599494, 3843348, 3080907, 8035391, 5510317, 6180842, 7198479, 1425342, 326000, 6144076, 1213298, 7716705, 7830321, 6511498, 2575530, 3832430, 4768051, 4599869, 4430111, 1424200, 7910434, 3210194, 7904066, 5251568, 3872664, 3962857, 2958241, 6415108, 5314645, 4718361, 2957076, 6361579, 3624111, 632497, 1766540, 5904116, 5307676, 7778883, 6385386, 5668308, 3031465, 7408525, 1107532, 7262250, 5641659, 5909341, 4632803, 5274123, 3773437, 7142529, 7746944, 2683310, 5237046, 5615655, 5852445, 6063500, 3077536, 6186558, 1497078, 4197377, 5483693], +[4592417, 5153277, 4630164, 8013731, 2438912, 2145174, 5103921, 6594115, 1964706, 5675452, 2120068, 1411294, 149436, 5563059, 4826953, 5463069, 1566678, 541593, 2914918, 7028118, 8370746, 7679217, 6797258, 4310229, 6733543, 8345800, 4855385, 3311397, 4214073, 4681590, 1405347, 2389655, 4576062, 7882220, 1343754, 806411, 2380852, 6429000, 7435817, 4957501, 5341201, 6297499, 2890527, 2011093, 21310, 5700341, 841146, 8279775, 340212, 2680433, 1567370, 4642738, 303715, 4588000, 954357, 7516688, 8000308, 556711, 4268428, 5886087, 3776328, 580829, 741653, 6521910, 428588, 1757914, 1139556, 1271591, 4188187, 6297919, 6353457, 7341873, 278666, 5528714, 677493, 4047885, 5211164, 460313, 4838531, 5416498, 4255889, 352929, 4653492, 1987430, 6049580, 1458005, 8193420, 1792292, 2396156, 746899, 3059757, 4599053, 4865764, 5673810, 2038311, 4571590, 7372586, 4876261, 8071400, 4559103, 6901679, 624876, 1213250, 742439, 2479535, 1549580, 289996, 1313746, 3908492, 177856, 2327638, 1032168, 3965419, 3912586, 6274256, 8064117, 7693571, 2227183, 5233998, 6081526, 4125049, 4205008, 6245446, 4989174, 4756686, 4754689, 6807733, 6823531, 7483161, 7968599, 5242428, 1022758, 4789184, 1307995, 2941868, 4931754, 2648399, 6418737, 6107576, 6934174, 3953296, 1605391, 5714599, 7731621, 664488, 3905933, 7160889, 4497990, 5533702, 7110104, 271063, 5213343, 4463503, 2595379, 1931811, 5407974, 4969152, 1632291, 192338, 5755592, 1983978, 5285768, 1727524, 2059836, 6943241, 6399420, 2871854, 5887442, 2239281, 1465831, 4131430, 1679158, 2405048, 6523086, 6550805, 3244215, 7601208, 421742, 2936723, 7112409, 8209256, 3077784, 2083140, 7404341, 4908914, 5434008, 5633404, 7786380, 8359734, 5078553, 3574842, 5183944, 5168399, 7576959, 3046320, 5326144, 812211, 2521821, 70281, 3652862, 1316446, 4268779, 213728, 2742134, 8169717, 7122314, 6988423, 8188830, 2635151, 3322441, 447858, 6604062, 7056063, 259486, 5180678, 71719, 3264409, 5105519, 7159750, 2895699, 1886054, 4336827, 3206814, 403513, 6124791, 4011655, 6089387, 6491744, 3755412, 7959812, 2305185, 4196510, 476005, 7017372, 5569865, 7869276, 2039186, 5911566, 2788260, 4261141, 1821972, 1070017, 6217892, 3551698, 4795379, 5276771, 7586695, 693071, 2086599, 486413, 1381675, 4885130, 8107909, 6881652, 6204729, 8280695], +[2740558, 6007420, 5931055, 3757377, 4836138, 1153006, 6299113, 3461788, 5064364, 569408, 8372554, 190217, 6097114, 3008661, 2112942, 82738, 1276154, 1966472, 1938665, 7246408, 1073679, 2933814, 1457256, 6289817, 3826805, 7639036, 5350343, 3728907, 7642821, 2773085, 5252979, 3057399, 5468748, 8296319, 711073, 7715033, 2316303, 8234947, 7469703, 5504742, 1318870, 2922622, 7346586, 3268244, 674219, 236064, 6836303, 7855566, 7879841, 6595193, 1137709, 5241045, 2598324, 8239992, 895805, 6894915, 2720984, 8089166, 4585445, 6821666, 2561605, 7661466, 802337, 2176308, 2909778, 3769173, 1747219, 929744, 841772, 6080274, 6280146, 2311762, 6706492, 7758854, 2188454, 5796404, 980090, 1869249, 1207571, 3311941, 5370119, 8084918, 1484540, 45463, 5986119, 6326972, 2010474, 7700452, 7718070, 5297611, 1200191, 4691459, 6852797, 2486225, 6566935, 3376701, 5975809, 377562, 2992119, 5719154, 124600, 2943199, 3413505, 1425224, 2725132, 7893790, 5595022, 7183179, 4625579, 6637220, 1631762, 1928133, 6477320, 7806910, 2717772, 5929833, 5015383, 783423, 7402750, 2839553, 3898789, 4974710, 8141495, 4799249, 2006912, 724091, 750616, 7305541, 1591726, 7032262, 5929214, 3044429, 2275181, 7410196, 4512554, 7175004, 1382107, 1892427, 70705, 1405835, 8139617, 681538, 749601, 2232634, 114926, 4179290, 7854703, 1388165, 8079205, 8327207, 2994361, 3891772, 805615, 7338727, 2844573, 5759133, 3312669, 8378476, 4664734, 5670737, 6117139, 1829275, 6808405, 7593464, 3192692, 3087762, 7842599, 6578144, 2614317, 1062150, 1448822, 6850525, 2826320, 5347356, 893851, 4484165, 2679181, 4170079, 4721910, 2846491, 2225970, 734578, 4009119, 77520, 7654280, 3307937, 5840918, 5619376, 7951570, 5161780, 1134456, 600687, 322360, 3536660, 3682804, 4157579, 7668199, 1051423, 6101819, 6776780, 6469343, 7952995, 3227280, 7585210, 7964745, 3309652, 8036895, 354537, 7955457, 7987971, 3582070, 4043344, 4978794, 2047527, 5015155, 2530610, 38094, 2223339, 3229095, 3311427, 1704174, 2833717, 1373175, 7807854, 4081255, 350182, 4915976, 3230180, 5088915, 5741123, 46999, 121157, 4548605, 588756, 3058131, 6996734, 4551432, 2863900, 7114999, 7266464, 6997285, 3047639, 4775476, 2536921, 1591924, 1680287, 2863275, 7545606, 3598853, 494536, 1700688, 3072121, 8273145, 4126345, 265812, 420685], +[1165919, 6792252, 7240530, 4959656, 7163769, 2479424, 2718388, 1386148, 6409065, 7204479, 7296445, 5064342, 6282509, 4909954, 6871562, 5062845, 518937, 7356614, 4700088, 6303549, 4120112, 1333609, 1446582, 3218123, 6515910, 2342965, 8116360, 1756659, 2749750, 1926677, 4765515, 3638328, 1430575, 6526918, 850155, 7642442, 2623216, 2389314, 1688210, 879889, 7539894, 572432, 823102, 2467478, 1722303, 3401293, 6019979, 5433813, 3914403, 5152595, 5880294, 325362, 5271355, 5006127, 4497003, 7755062, 5100631, 6716973, 265351, 2913939, 4308357, 325767, 8190792, 894466, 6141810, 5095200, 3617557, 2951309, 7073121, 1044942, 2632184, 2075566, 5102247, 6696957, 1467228, 4257294, 2393651, 1090144, 2386338, 6445109, 1235480, 7820045, 2739734, 6296782, 6075675, 8055930, 2523514, 4311711, 5060847, 4996686, 1226351, 2161774, 5036212, 6408700, 4376534, 563574, 4662676, 5447951, 2983142, 3544127, 2461208, 472759, 5685843, 7083706, 3331054, 375277, 3011109, 3365190, 4414447, 6599023, 6948573, 1784218, 4292715, 6833878, 4919211, 3121662, 3097931, 4906453, 2299643, 1786656, 5613336, 7103175, 3505383, 7361363, 2981185, 1080002, 2745680, 2523274, 3848616, 4855259, 7094922, 1461414, 3549635, 5210298, 1721014, 7935003, 6573708, 3526772, 4933192, 3953992, 124648, 4155260, 7734044, 5363946, 2023894, 4681686, 5717705, 2923716, 4684566, 601242, 5116697, 2279072, 1543842, 7926813, 4638630, 256166, 1732749, 5274678, 7760052, 3411590, 5920789, 935214, 5145037, 3751380, 3315398, 6942899, 533029, 4365843, 485553, 2640632, 5761237, 6519995, 576911, 3394709, 373721, 1469606, 185982, 3142144, 715084, 3282875, 8283927, 849703, 7280660, 4449669, 8378649, 3856702, 5446620, 2640008, 7923696, 3764088, 4077919, 2389417, 4686682, 7841336, 33909, 4501741, 6596871, 1115218, 1185203, 6030838, 7845020, 4433028, 4556664, 6530015, 1005196, 2353210, 392023, 3200469, 4419835, 4992841, 7629986, 7999832, 7576579, 6121795, 5503896, 2573043, 3917315, 788312, 713612, 4398334, 5770590, 2956822, 4424491, 458231, 6865702, 5063751, 5533822, 2836353, 3516222, 4222171, 5731719, 72811, 2151771, 1512333, 7423126, 7295493, 3343584, 4462883, 91822, 3873232, 1596603, 35110, 3775256, 7452946, 2394580, 6767273, 5207202, 2815475, 1102982, 2456418, 4235065, 5911800, 3715809, 3195022, 1371863, 3115715], +[4684359, 1726389, 5037524, 934249, 8117290, 1152641, 7176799, 1254228, 2336718, 361783, 8374159, 2728474, 794826, 7344571, 5796677, 1009359, 859098, 5138801, 8081100, 2378654, 3694575, 8214381, 5342217, 370020, 7582105, 662994, 3512816, 1550377, 6756716, 2159743, 7249252, 6721354, 6816584, 5187092, 2721107, 857460, 48720, 5633019, 6525982, 1920049, 2487369, 1655242, 7373066, 2815839, 6544019, 3503346, 5260343, 1303673, 4963254, 1998429, 6227132, 3898913, 1776752, 1760741, 2273287, 3027083, 6344130, 2415721, 7053258, 5071739, 2087792, 2214596, 3207188, 6073888, 5658529, 7659043, 1871656, 1180339, 7936820, 2390817, 7223535, 7249069, 6960116, 2089290, 3602047, 7262913, 4490581, 3636459, 7560760, 8355909, 5454639, 2723163, 4986638, 3780579, 3923424, 6298249, 6957396, 5961486, 8291706, 8351837, 4343474, 3932534, 1458805, 485325, 4036552, 4141878, 3358339, 6280873, 4491752, 7250028, 4887072, 38558, 4537943, 6248062, 2455588, 1853116, 955796, 1330878, 6909027, 1401304, 2035254, 4475592, 887634, 2124272, 5236893, 2107170, 4939744, 3690253, 7651734, 8119111, 3001570, 5398912, 3288627, 1699543, 135877, 8271086, 1000243, 7797885, 8268800, 3895008, 5384626, 8062624, 4244947, 1710336, 3662331, 6087180, 370974, 363523, 540196, 8171400, 6272487, 1746154, 7361813, 7142484, 5787814, 546200, 4946584, 4526865, 6284881, 6763193, 999990, 6182228, 4731261, 4229709, 1616448, 1658167, 2396586, 1621394, 7557403, 378617, 2932411, 1222800, 5869494, 2644695, 7572071, 4944326, 4042873, 2475158, 317963, 5930682, 6513230, 889687, 7832116, 8290498, 8065607, 6473144, 467454, 5038534, 8204412, 8321090, 1954795, 4216970, 6141028, 2652546, 5900350, 1855012, 2192651, 6164921, 4284914, 190335, 7383182, 1733136, 4020453, 3602856, 7433747, 2513850, 2634866, 6226655, 477431, 6596145, 5962854, 795000, 1417007, 8198464, 3497585, 281115, 7680404, 2443680, 1011916, 6073087, 3873022, 575349, 7047488, 1825855, 8061791, 3809160, 7514118, 337661, 2160854, 1936807, 6092882, 8249225, 2301266, 2432694, 6716512, 1878960, 7994938, 483678, 2626354, 7627825, 1134616, 7947458, 317205, 6566968, 4853489, 5859302, 1808806, 171051, 7959527, 7386347, 4186912, 4916271, 461251, 6646770, 3215522, 6359034, 3851358, 1170290, 2206755, 3846976, 7933800, 6960327, 7172111, 6407307, 5944816, 7568740], +[1951919, 3838911, 3756090, 4942755, 6438652, 6929858, 7684883, 5183907, 4582828, 5540235, 6473838, 4907419, 4580003, 7996267, 7505446, 6555092, 5372016, 5676157, 3811224, 5517847, 7983204, 1000480, 7327668, 268376, 4955667, 3719505, 4260594, 4433529, 909440, 2309543, 1359840, 4279147, 8098083, 5090944, 2826785, 864625, 6426338, 1094149, 2029354, 2864611, 8123317, 420668, 7713287, 6512270, 1779055, 4738310, 4494405, 6792684, 2659025, 6322127, 677087, 6280009, 7186565, 1301767, 5863650, 6180101, 4046914, 3511562, 4105401, 1436770, 5793603, 7768946, 5236959, 5512135, 2909017, 624906, 6831931, 7569434, 507425, 6975685, 5424097, 7228018, 7271780, 5084203, 492976, 2336254, 4461400, 6023445, 7293537, 2046168, 294950, 2932990, 6794958, 5427879, 6623642, 4445472, 3282147, 6198310, 158050, 6526218, 3604428, 1954483, 3010578, 5181768, 6432016, 6690088, 8889, 6257876, 567394, 7698814, 4261641, 4198198, 2770662, 4907225, 1275496, 7748965, 3402169, 3182991, 1307341, 1115525, 5841993, 4642300, 2182272, 3299198, 4457, 3624241, 5678074, 4629034, 4715183, 6394535, 1935155, 1035596, 4716199, 2159455, 5403933, 5241668, 1068634, 1150354, 3205194, 7464599, 1791718, 8244971, 5083706, 3152409, 7694101, 8076838, 3378368, 448095, 7869255, 4926424, 83657, 1380730, 481498, 2743000, 875122, 1419586, 815581, 631303, 952068, 6798375, 6413567, 2374918, 406894, 5968670, 4263796, 104137, 325965, 5447613, 6282146, 334041, 8313412, 2316998, 6973486, 2982823, 7497640, 6425267, 6793901, 6579434, 8332392, 7132038, 3262467, 4615482, 1337706, 6730995, 5924950, 3389792, 6729047, 2673759, 4487644, 207968, 2738034, 1372358, 2253791, 4202256, 7081219, 1241678, 3065951, 5066993, 3067655, 1898189, 876070, 3887169, 6467499, 4280180, 1920864, 4262363, 7800923, 4324878, 3911314, 2727610, 5224718, 8281029, 3920135, 6706123, 1222965, 3515448, 3716312, 8188780, 608137, 232300, 6247915, 4788444, 2724106, 7032317, 934794, 7385469, 6250599, 6574645, 5906700, 7106019, 4970120, 4963271, 6646489, 2585467, 2009028, 4096223, 2575955, 7089876, 2901780, 5943538, 4461611, 1894205, 3498807, 1985334, 6998064, 346676, 1030117, 508654, 6346201, 3129932, 2415771, 588706, 3950754, 6073903, 81221, 2294868, 5092183, 4891071, 4958394, 6458965, 4732317, 1094442, 857111, 4854226, 6996665, 2297021]] + +t0: [[3508, 1831, -1993, -3533, 1771, -2335, -1360, -2635, -963, 3343, -2843, -4094, 2253, -617, -2890, 2147, -2252, -2223, -643, 2412, 2822, 142, 3141, -323, -735, -3192, 1875, -875, -2708, -950, 111, -3157, 1920, 800, -2940, -448, 2937, 354, -546, -1625, -1938, 3992, -1686, 2938, 1032, -1166, -3065, -617, 1402, -2286, 362, -1743, -2339, -3157, 1351, -632, -596, -266, -4087, -641, -129, 115, -3815, 1914, 1727, -406, -355, 698, -2864, -3468, 1248, 3842, -1273, 2776, -3001, 1811, 36, 1623, -3892, -674, 1495, 1950, -3133, -2602, -293, 3040, 619, 1073, -2592, 3292, -2799, -3587, -1415, -3169, 697, 199, -3862, 3819, -3688, 1893, -2258, -2907, -1935, -174, 1467, 3299, 2562, -3759, 1253, -4064, 756, -1271, 512, 2601, -938, -954, 2530, -102, -324, 2006, 3812, 2011, 1504, 3297, -30, 2579, -1676, -2542, 2372, -3902, 1251, -4015, 4094, -1424, 1044, 2572, 3867, 2890, 1901, 3825, -205, -3420, 2044, 2376, 2397, 195, -2572, -736, -2691, -2231, 1257, 3528, 634, -3748, 890, -1218, -1156, 2832, 4012, 212, 2313, 2965, 3524, -3827, 902, -360, -3271, -1362, 2313, -391, 2171, 345, -893, 3765, -2557, -385, 2233, 2199, -2411, 561, -2363, 250, -1129, -560, 3914, 3152, 928, 1745, -678, 456, -1427, 3253, 732, -3376, 3100, 2630, 1300, 715, -961, -2899, 4074, -2289, -66, -1680, 76, 882, -159, -1231, -1142, 3242, -1426, 307, -4035, -1761, -1208, -3038, -1070, -1214, 496, -2152, -2071, 929, 772, -1963, -231, -236, -3605, 3247, 1713, -2932, -2316, -740, -3517, 3818, -556, 425, 2957, 1612, -4054, -2629, 2909, -3869, -1525, -3075, -895, -2688, -3666, 2358, -4057, 3357, 1420, -2656, 1598, -2058, 3073, 3245], +[-3295, 509, 1684, 1955, -2304, -1130, 305, -445, -1374, -1604, -1660, 2270, 1980, 691, 1865, -995, 2006, 921, -1434, -618, -1478, 3313, -2102, 1237, -281, -1848, -2471, 1829, 3385, 3958, -3677, -2409, -3266, 1516, 266, 3595, -3020, -1720, -2519, 1341, 17, -2149, -1249, 4053, -3266, -1291, -2630, -2337, -3852, 1649, 2698, -2126, 611, 480, 4085, -3568, -3276, -345, 396, -3961, -184, -803, -3819, 1078, 2604, -3366, 868, 1831, 2075, -1729, -3535, 1841, 138, -886, -2443, 1037, 1052, 1561, -2941, 1586, -3951, 673, 436, -3226, 3884, -171, 1420, -1756, 4092, 1427, -4051, 3341, -284, -3246, -1497, 454, -214, 2021, 2280, -3841, 4015, 2284, 834, -3033, -2641, 1292, 3276, 3026, 908, -2368, 1110, -24, 491, -3190, -816, 3189, 1283, -1041, -690, 3062, -3719, 2512, 3142, 246, -2866, 3329, 181, -405, 3865, -2217, -452, -1242, -3136, -2725, 940, 170, 2383, -3791, -3656, 3742, -3440, -241, -3417, -1627, 936, -1651, 1081, 582, -4090, -552, 727, 3231, -1137, -1485, -1501, 1254, -3392, 2083, 3922, -3384, 1514, 1928, -988, 3644, -3575, 1468, -3538, -2606, 2865, -537, 2662, -202, -3400, 2254, -2795, 183, -968, 3950, 3987, 1753, 872, -2408, 2372, -1227, 1906, 2712, -2692, 3980, 3894, -487, 3130, -1592, -753, -641, -1104, 1344, 1203, -1315, -3447, -770, -2466, 747, 736, -2186, 2293, 3466, 647, -3170, -2673, -3511, -2702, 1310, 2751, -2658, 3334, -2009, 3993, 1903, -58, 3923, 1894, 3259, 3742, 2105, -2825, -2425, 2731, 3680, 3476, -2812, 3233, 2206, 869, -3172, -695, -3236, -622, -3058, 2980, 1301, 3348, -3135, 164, -3630, 3059, 1123, 903, -3249, -2361, 3085, -2773, 2698, -2171, 372, 3385, -1417], +[-3762, 2684, 47, -2751, 2858, -2066, -535, -3428, 1708, -4032, 330, 1801, 2266, 2197, -594, 818, -1798, 392, -2839, -3512, 527, 1078, -920, -1639, 1141, 4092, 967, 1547, -315, -4003, 1907, 1783, -3508, -2177, -1631, -1831, -2033, 1987, -1401, -282, -42, -1922, -1638, -364, 2475, -1504, -4017, -562, -863, 633, -979, -1835, 1460, -1160, 2877, -2749, 1240, 3662, -2075, -2270, -2491, 1946, -479, -2764, 1618, 853, 2323, 4048, -2004, 1810, -3118, 1618, -2756, 1030, 1190, -3532, -2950, 1473, 3347, 2373, -3833, -586, 1788, -3689, -2233, 2748, 3434, -28, 1206, -2613, -4033, -2557, -3907, 4049, -3049, 1597, 3841, 730, 2039, 1138, 1720, 2271, -2559, -184, -2804, -3298, -114, -1205, -2901, 1700, 1554, 3013, -2552, -66, -1972, -1175, 1879, -3009, -2818, -3071, -603, 2166, -1353, -1263, -128, 3195, -3048, -1723, 2478, 3526, -1794, -2995, -2195, -3564, -1238, -1188, -2341, 75, -3023, -3189, -3231, 1602, -4063, -3782, 238, 1370, -1425, 3717, 1893, -4057, -3911, 572, 2799, -1305, 1949, 157, 3101, -1940, 3486, 1873, -2285, 2459, 853, -520, -2188, -622, 2855, -32, 1069, -2810, -1162, 2013, 80, -2020, 923, 3141, 397, 351, 3318, 3867, -2254, -2702, 3231, 3792, 2952, -1631, 22, -336, -2862, 820, 3960, 2671, 2872, -2284, -3596, -3957, 487, 2847, -1221, 1996, -2337, -1437, -368, -582, 2121, 84, 543, 2281, 1025, 771, 2166, -3504, -1942, -473, 1651, -718, -2866, 3307, 1447, 1859, 238, -715, -3081, 878, 1639, -2074, 776, 2532, 1683, -1469, -2153, -1723, 2045, -1068, 2515, 766, -3320, -3300, -3849, 160, 1317, 215, -460, -2599, 2676, 927, -3925, 774, 2565, 3016, -3248, 121, -775, -2423, 3668, 2893], +[2655, 1084, -1198, 3496, 3961, -2752, -1356, 1700, 2921, 3711, -2627, 1686, -755, 2946, -1526, 189, 2841, 198, -2120, 3901, -464, -1687, -3402, -1333, 3270, 53, -1912, 3571, -2762, 1557, -2229, 1080, -3025, -2106, -1813, -694, 1776, -2750, 658, 3345, 3254, -1008, 3902, 1686, 1983, 1613, -1141, 2517, -1373, -173, -1562, -2318, 3899, 815, -405, -2762, -2985, -467, 3207, -2413, -635, -1913, -1208, 1538, -2190, -224, -3307, 2189, 3425, -3634, 2552, 2990, -1369, 4093, 860, -2546, 1587, 608, 2466, -1995, -1512, -3315, 3606, -2866, -2789, 3194, 378, 2719, -1809, -434, -2449, -914, -1868, 2556, 2006, -1674, 1428, 271, 1254, -3009, 3608, -2377, 595, -2374, -3090, -1555, -3547, -1722, -1041, -3729, 1757, -1638, 107, 1750, 4011, 510, 1355, -555, -2309, 800, 1816, 711, -793, -3245, -703, -1342, 1360, 138, -1624, -2597, 650, 3238, 2499, 186, 694, -3045, 3724, -3980, 1608, -2744, 1768, 1916, 796, -1814, 470, 4054, -311, -828, -1258, 3226, -3303, 1696, 3746, -3043, 1958, 2214, -3955, -970, 2228, 3718, -2027, 1326, 461, -556, -2362, -3917, 549, -493, 2225, 2808, 2261, -837, 3471, 3221, -3111, 3238, -2434, -3584, 2380, -2117, 1815, -2265, -2028, 1413, -1767, -1730, -1060, 2184, 2032, 3960, -1697, -2647, 858, 1592, 1141, -3859, 2311, 1106, -2637, 1526, -2916, 1156, 1912, 991, -2420, 2106, -1193, -2603, -3845, 3913, 3234, -3752, -1021, 2371, -1128, 755, 1539, 1880, 908, -770, 3422, -490, 811, -521, 806, 1095, -3970, 1921, 1854, 3291, -2681, -917, -2725, -3187, 1174, -3579, 1248, -1757, 1710, -1584, -837, 2342, -1256, -1774, 2516, 681, -2910, -2573, -2938, -1182, -199, -2824, -3359, 142, 3799, 2755], +[-1465, -2123, -556, 361, -982, -2431, 607, 852, 1998, 1335, 1935, 538, 202, -3653, -3259, 1743, -1062, 2417, 3788, 2974, -17, -2195, 1033, 1380, -3687, -558, -1552, 2089, -1684, -2945, -668, 3914, 840, 1556, 1363, -2700, -432, -3077, -3042, 3121, -2999, 458, 266, -2209, -1389, -2830, 1079, 1145, -1098, -419, 1212, -479, -912, -539, -4089, -3957, 3522, -919, -54, 891, -1168, 2756, -4076, 3616, -2143, -477, 3880, 691, -1228, -1247, -1809, -851, -3084, 330, -2433, -3391, 1365, -789, -456, 69, -1233, 3419, -2290, 4067, -544, -1399, 2388, -2290, 1402, -4003, 1714, 374, 629, 1997, -2104, -3274, -381, -2391, 2536, 108, -3552, -2402, -425, -2434, -2012, 1724, -2668, 3774, 3171, 472, 3638, 2760, 2898, 2544, 2205, 1826, -32, 3853, 406, 839, 3298, 384, 3635, 3799, -3387, -2834, 819, -899, 3072, 3808, 2482, 1696, 1491, -1792, 507, 524, 2334, 3075, -476, 3976, -2585, 1258, -2795, -940, -3930, -2664, -1384, -3311, 1617, -3399, 566, -2732, -3715, 2637, 2624, 3383, -3670, -622, -3813, 1785, -325, 2192, 4022, -1321, 2663, -3642, -3975, 1174, -1525, -326, 590, -3241, 564, 194, -3513, 1464, 510, 454, -3972, -1982, -3093, -1910, -2972, -1662, 2110, 3620, -2805, -3655, 498, 1919, 2190, -3568, -1819, -1624, 3603, -1094, -2958, 735, 2295, 1585, -922, 376, -209, -1728, -399, 2587, -3692, 2464, -3892, 2815, -1794, 1909, 2368, -961, 863, -120, 2054, 1789, -1834, 3495, -1966, -119, -686, -330, -928, 2992, -454, 350, -3278, 1073, -4072, 1218, -2283, -3016, 3825, 2022, -1626, -981, -3097, -2837, 800, 1071, 2499, 3058, -3934, 2042, 1118, -1166, 3107, -3264, 3944, -2873, -4081, 1163, -2576, -668], +[2223, -3137, -4038, 2979, -260, -574, 787, -1629, 3500, 2443, 2158, 411, 675, 875, 1574, 1492, -1936, -899, 1944, -3561, -3996, 1056, 4020, -1960, -493, 337, 754, 1657, 128, -601, -32, 2923, -3805, 3712, 545, -3727, 3810, -3579, -2262, -2589, -3147, 2876, -3577, -370, 1391, 3334, -3003, 1516, -3375, -2097, -2849, -3255, 2181, -761, -1822, 3333, 66, -2806, 1209, 3170, 1859, 2930, 2271, -1081, 857, 2314, -197, 26, -479, -3899, 993, 2674, -2716, -3029, 1456, 1534, -3240, 2325, 2657, -1832, 38, 254, 3790, -3417, -3686, -2784, -2845, -3034, 2402, -2806, -52, -3405, -4078, -3768, 1296, -2776, 697, -812, 2146, -1666, 1801, 3894, 1766, 217, -2456, -667, 2489, -3697, -3379, 1413, 1097, -2564, 3200, -2178, -3735, 3377, 1018, 554, -3409, -3417, 1843, 3404, -2393, -3233, -2787, -1212, 3674, 3474, 2122, 1687, -2330, 3819, -3526, -1511, 1813, -474, 3264, -2465, -3257, 3032, 1737, -3718, -1830, -1320, -1422, 2370, -3619, 519, 1796, -985, -769, -762, -2706, -3298, 3956, -2359, -1715, -67, -1118, -1831, -1468, -1338, 2094, 935, 1960, 2739, 2733, 1258, 1128, -3194, 2051, 3386, 2410, -2829, 2134, -1696, 3415, 3167, -1572, 3168, 1906, -3898, 991, -240, 3331, -3506, 2143, -3855, 3847, -2355, -474, -4031, 4011, 3956, 3936, 2523, 2139, -498, 3730, -326, -1778, -1083, -3833, -3125, 2357, 1080, -2856, -3220, 1929, 2924, -2581, -3876, -3830, 3581, 906, -3715, 103, -3531, 268, 3555, -2424, -1081, 2777, -3205, 1988, 223, 3667, 3796, 1812, -3854, -3029, 1853, 823, 2870, 2096, 2612, -2075, 750, -2599, 588, -869, -1118, 2210, 3631, -699, 1108, -3241, 447, 2234, 3669, -2659, -3286, -3049, -3630, 697, 3261]] +t1: [[101, 250, 851, 942, 660, 945, 832, 665, 525, 564, 684, 119, 743, 639, 521, 589, 853, 993, 965, 259, 270, 243, 792, 179, 477, 52, 347, 688, 373, 451, 863, 629, 829, 771, 638, 599, 322, 764, 562, 43, 327, 78, 146, 617, 146, 927, 733, 999, 966, 651, 848, 353, 309, 1006, 111, 257, 832, 59, 372, 530, 442, 31, 277, 754, 914, 49, 106, 143, 222, 496, 657, 371, 58, 821, 99, 366, 345, 279, 144, 88, 297, 105, 326, 652, 793, 670, 528, 92, 233, 571, 828, 915, 654, 775, 889, 173, 678, 647, 565, 79, 385, 994, 173, 633, 532, 100, 617, 422, 842, 46, 81, 828, 424, 443, 727, 821, 140, 483, 687, 932, 452, 213, 944, 454, 101, 110, 4, 705, 203, 855, 827, 1020, 708, 207, 70, 822, 400, 342, 857, 670, 647, 575, 180, 1017, 535, 1012, 779, 148, 15, 926, 459, 937, 550, 120, 1008, 127, 800, 725, 868, 478, 756, 564, 624, 791, 185, 731, 362, 263, 110, 955, 529, 896, 897, 347, 707, 528, 654, 314, 970, 885, 654, 256, 795, 353, 188, 301, 276, 845, 96, 875, 475, 830, 594, 591, 667, 317, 469, 376, 981, 673, 754, 879, 174, 40, 750, 148, 942, 956, 795, 314, 468, 582, 562, 541, 174, 966, 392, 965, 641, 473, 484, 361, 783, 649, 576, 361, 777, 442, 77, 216, 721, 648, 950, 779, 692, 370, 904, 135, 887, 689, 721, 566, 644, 461, 872, 946, 328, 639, 686, 714, 740, 376, 755, 183, 512, 669], +[561, 629, 565, 978, 298, 262, 623, 805, 240, 693, 259, 172, 18, 679, 589, 667, 191, 66, 356, 858, 1022, 937, 830, 526, 822, 1019, 593, 404, 514, 571, 172, 292, 559, 962, 164, 98, 291, 785, 908, 605, 652, 769, 353, 245, 3, 696, 103, 1011, 42, 327, 191, 567, 37, 560, 116, 918, 977, 68, 521, 719, 461, 71, 91, 796, 52, 215, 139, 155, 511, 769, 776, 896, 34, 675, 83, 494, 636, 56, 591, 661, 520, 43, 568, 243, 738, 178, 1000, 219, 292, 91, 374, 561, 594, 693, 249, 558, 900, 595, 985, 557, 842, 76, 148, 91, 303, 189, 35, 160, 477, 22, 284, 126, 484, 478, 766, 984, 939, 272, 639, 742, 504, 513, 762, 609, 581, 580, 831, 833, 913, 973, 640, 125, 585, 160, 359, 602, 323, 784, 746, 846, 483, 196, 698, 944, 81, 477, 874, 549, 676, 868, 33, 636, 545, 317, 236, 660, 607, 199, 23, 703, 242, 645, 211, 251, 848, 781, 351, 719, 273, 179, 504, 205, 294, 796, 800, 396, 928, 51, 358, 868, 1002, 376, 254, 904, 599, 663, 688, 950, 1020, 620, 436, 633, 631, 925, 372, 650, 99, 308, 9, 446, 161, 521, 26, 335, 997, 869, 853, 1000, 322, 406, 55, 806, 861, 32, 632, 9, 398, 623, 874, 353, 230, 529, 391, 49, 748, 490, 743, 792, 458, 972, 281, 512, 58, 857, 680, 961, 249, 722, 340, 520, 222, 131, 759, 434, 585, 644, 926, 85, 255, 59, 169, 596, 990, 840, 757, 1011], +[335, 733, 724, 459, 590, 141, 769, 423, 618, 70, 1022, 23, 744, 367, 258, 10, 156, 240, 237, 885, 131, 358, 178, 768, 467, 932, 653, 455, 933, 339, 641, 373, 668, 1013, 87, 942, 283, 1005, 912, 672, 161, 357, 897, 399, 82, 29, 835, 959, 962, 805, 139, 640, 317, 1006, 109, 842, 332, 987, 560, 833, 313, 935, 98, 266, 355, 460, 213, 113, 103, 742, 767, 282, 819, 947, 267, 708, 120, 228, 147, 404, 656, 987, 181, 6, 731, 772, 245, 940, 942, 647, 147, 573, 837, 303, 802, 412, 729, 46, 365, 698, 15, 359, 417, 174, 333, 964, 683, 877, 565, 810, 199, 235, 791, 953, 332, 724, 612, 96, 904, 347, 476, 607, 994, 586, 245, 88, 92, 892, 194, 858, 724, 372, 278, 905, 551, 876, 169, 231, 9, 172, 994, 83, 92, 273, 14, 510, 959, 169, 986, 1017, 366, 475, 98, 896, 347, 703, 404, 1023, 569, 692, 747, 223, 831, 927, 390, 377, 957, 803, 319, 130, 177, 836, 345, 653, 109, 547, 327, 509, 576, 347, 272, 90, 489, 9, 934, 404, 713, 686, 971, 630, 138, 73, 39, 432, 450, 508, 936, 128, 745, 827, 790, 971, 394, 926, 972, 404, 981, 43, 971, 975, 437, 494, 608, 250, 612, 309, 5, 271, 394, 404, 208, 346, 168, 953, 498, 43, 600, 394, 621, 701, 6, 15, 555, 72, 373, 854, 556, 350, 869, 887, 854, 372, 583, 310, 194, 205, 350, 921, 439, 60, 208, 375, 1010, 504, 32, 51], +[142, 829, 884, 605, 874, 303, 332, 169, 782, 879, 891, 618, 767, 599, 839, 618, 63, 898, 574, 769, 503, 163, 177, 393, 795, 286, 991, 214, 336, 235, 582, 444, 175, 797, 104, 933, 320, 292, 206, 107, 920, 70, 100, 301, 210, 415, 735, 663, 478, 629, 718, 40, 643, 611, 549, 947, 623, 820, 32, 356, 526, 40, 1000, 109, 750, 622, 442, 360, 863, 128, 321, 253, 623, 817, 179, 520, 292, 133, 291, 787, 151, 955, 334, 769, 742, 983, 308, 526, 618, 610, 150, 264, 615, 782, 534, 69, 569, 665, 364, 433, 300, 58, 694, 865, 407, 46, 368, 411, 539, 806, 848, 218, 524, 834, 600, 381, 378, 599, 281, 218, 685, 867, 428, 899, 364, 132, 335, 308, 470, 593, 866, 178, 433, 636, 210, 969, 802, 431, 602, 483, 15, 507, 944, 655, 247, 571, 698, 357, 572, 73, 625, 278, 188, 968, 566, 31, 212, 644, 947, 416, 723, 114, 628, 458, 405, 848, 65, 533, 59, 322, 703, 796, 70, 414, 46, 179, 23, 384, 87, 401, 1011, 104, 889, 543, 1023, 471, 665, 322, 967, 459, 498, 292, 572, 957, 4, 550, 805, 136, 145, 736, 958, 541, 556, 797, 123, 287, 48, 391, 540, 609, 931, 977, 925, 747, 672, 314, 478, 96, 87, 537, 704, 361, 540, 56, 838, 618, 676, 346, 429, 515, 700, 9, 263, 185, 906, 891, 408, 545, 11, 473, 195, 4, 461, 910, 292, 826, 636, 344, 135, 300, 517, 722, 454, 390, 167, 380], +[572, 211, 615, 114, 991, 141, 876, 153, 285, 44, 1022, 333, 97, 897, 708, 123, 105, 627, 986, 290, 451, 1003, 652, 45, 926, 81, 429, 189, 825, 264, 885, 820, 832, 633, 332, 105, 6, 688, 797, 234, 304, 202, 900, 344, 799, 428, 642, 159, 606, 244, 760, 476, 217, 215, 278, 370, 774, 295, 861, 619, 255, 270, 392, 741, 691, 935, 228, 144, 969, 292, 882, 885, 850, 255, 440, 887, 548, 444, 923, 1020, 666, 332, 609, 461, 479, 769, 849, 728, 1012, 1020, 530, 480, 178, 59, 493, 506, 410, 767, 548, 885, 597, 5, 554, 763, 300, 226, 117, 162, 843, 171, 248, 546, 108, 259, 639, 257, 603, 450, 934, 991, 366, 659, 401, 207, 17, 1010, 122, 952, 1009, 475, 657, 984, 518, 209, 447, 743, 45, 44, 66, 997, 766, 213, 899, 872, 707, 67, 604, 553, 767, 826, 122, 755, 578, 516, 197, 202, 293, 198, 923, 46, 358, 149, 716, 323, 924, 604, 494, 302, 39, 724, 795, 109, 956, 1012, 985, 790, 57, 615, 1002, 1016, 239, 515, 750, 324, 720, 226, 268, 753, 523, 23, 901, 212, 491, 440, 907, 307, 322, 760, 58, 805, 728, 97, 173, 1001, 427, 34, 938, 298, 124, 741, 473, 70, 860, 223, 984, 465, 917, 41, 264, 236, 744, 1007, 281, 297, 820, 229, 976, 59, 321, 931, 139, 970, 39, 802, 592, 715, 221, 21, 972, 902, 511, 600, 56, 811, 393, 776, 470, 143, 269, 470, 968, 850, 876, 782, 726, 924], +[238, 469, 459, 603, 786, 846, 938, 633, 559, 676, 790, 599, 559, 976, 916, 800, 656, 693, 465, 674, 975, 122, 894, 33, 605, 454, 520, 541, 111, 282, 166, 522, 989, 621, 345, 106, 784, 134, 248, 350, 992, 51, 942, 795, 217, 578, 549, 829, 325, 772, 83, 767, 877, 159, 716, 754, 494, 429, 501, 175, 707, 948, 639, 673, 355, 76, 834, 924, 62, 852, 662, 882, 888, 621, 60, 285, 545, 735, 890, 250, 36, 358, 829, 663, 809, 543, 401, 757, 19, 797, 440, 239, 368, 633, 785, 817, 1, 764, 69, 940, 520, 512, 338, 599, 156, 946, 415, 389, 160, 136, 713, 567, 266, 403, 1, 442, 693, 565, 576, 781, 236, 126, 576, 264, 660, 640, 130, 140, 391, 911, 219, 1006, 621, 385, 939, 986, 412, 55, 961, 601, 10, 169, 59, 335, 107, 173, 100, 77, 116, 830, 783, 290, 50, 729, 520, 13, 40, 665, 767, 41, 1015, 283, 851, 364, 915, 784, 829, 803, 1017, 871, 398, 563, 163, 822, 723, 414, 821, 326, 548, 25, 334, 168, 275, 513, 864, 152, 374, 619, 374, 232, 107, 475, 789, 522, 234, 520, 952, 528, 477, 333, 638, 1011, 479, 819, 149, 429, 454, 1000, 74, 28, 763, 585, 333, 858, 114, 902, 763, 803, 721, 867, 607, 606, 811, 316, 245, 500, 314, 865, 354, 726, 545, 231, 427, 242, 854, 42, 126, 62, 775, 382, 295, 72, 482, 741, 10, 280, 622, 597, 605, 788, 578, 134, 105, 593, 854, 280]] + +tr: 2077582102F6F313C22564F8414E3766704FFD18017FDCAE570DB8C8FCB567E413219CB4B45175B83E6BA5E322A112D18CF9F356B57697230350D2591EE02AD2 +pk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F65E833B5EB94C60E74A60DD2C8EA1DE7FE99609355875FFC400ECD83F12CDDD1B015AC750DF7759D3D0FECE79542F12BE30A473921499A927CDEEDF9C62F0A755835B9FF464040EF409784BA7D5091BC92C7A0C623DEC017E95C3AD43C865B595D04091629A56114A3197B0A2117E9ECC8F3E48E1E9C772BA61E5AE3138189DF4A9E149291A6694ABB1005CFA8ED766DCD8C8CF72AE9C45503BB7165B84140B0CB5CBD33FFC43E6384CD905995B5A787FE484BFE17D2BF30250F78BE5CEA26E201FF1F20574BB677F4D208E7C5B96CABD6416EEC1E21E0816F352C848EEAA47CDD8E02B47158BCB44451D360ACBD9DCF523EB9694FD5E1557DA8F2BEED0A0AEE52E23AEF1BEB449D913276E88AF188151F6876E4A5F570A240A695B06E4D60132DA2B62F4CAB5C881F7277ACD1DA48687368CB8ED49FAE2A4B2E5EF3DE0260A731D659A3F42A19F466C9F0D43A102B129CDAE4A6BF084196D6FEA7EEB38336EF1F256502EEC80A492F0A4F8A182345CC78978C061C563D03E07AC6FC2A1CF5CB8D25C04887E5D11391E0B3CD1DB105C7345CB3C826FF058C30E0228C3A857B7CE2F064A508AE80E33CE2CA82FE36246D61578C52D69A8F8B844F997D8B4A3341C9162FF5320228DD59C0911FE479E72FF6AB43F4A7B9F805A86F984512F973D091370F681F49827296964341ACAED3E311A32BEC5174A77689A4921D029F21F6C40EA55F1E73C1AFF2143ACD3E5037FCD5B311CD825F3326710C3263A0CF6016D9EAE3E50FE2575E0AABEDFCB3495B9E77764E97A263D094806FA124A8C153E5975D35FA42597683C95D838067028EBDA97658E64478580CECAA772EC6CA319F11803A648D6AF0F9484B1582DE0C72AF6C4912EA7915FFEC900A95DE235DEFFC4F754BED724E3612F0696A1AE1FF05E8BE2590029CC0D34EDD8398250BC0D391DEE871A54F15685D9CD67F85EB1BB50F39A8A19415F863527430F4EFC297BC08A03DB9DF86D24C6D0F63D0399D2E86426331574D1C6798FBAF4633CFBE10B17890330965906E5F8B01DB125C0FEBAE1F3A498F45BF243267D9BAD096AE0F9C159A2B4D11BF6ADB35AA7CCC3A17E7CE14B5648281F856DC7D29BE92F560C105DFC2684D2D5D16257E22DBA99C93002BE24FC145440EF8F77B2ADAE7EFD6766200BED5AF94FD9F23ADEB7EF3F3E786E5D5FBC83F09120BD15935DAC68847F507E4561069915E02A65396ACABCBDBA9481227C0261C7FA80392EECE162FAF98E7CC5356FD0ACB3F5F9B7B60EA43664D053CA41865D068854AEEF2AD80A5626DF66AC0032B225197D52C7A55F6DD56D375A44DC234E355E6B7F100CD5DF2E307C20C8EF44C77976ABFC4542A0EBFBDB79AFF5E79B49A3F08EE63C0F78D124B621B7BF4BD3550AD63246FAF748C46E94091E4CC1A981B41464BD27CF6EDA5DED5E92C0A838E59E2EC6FD20C02590EA2807E1BEEBAA91B5A5F0312543F6FC63C0B82241532D2C497ECEE54C0E65E4F93836A8A690942673A6C61113966CA566C2CE9606BD897B900D7661B9A0CB5360C0A8D655F7A5D999136AD8ECDDAE06C11F2144DD64529B62CB1F1294DF222BFA6E5780FEC07FBA3F7ECA86B593C2611A745BC206FE307D4103A3B68D3CA41A77295411D44853B08F52BC74678E6C22C1700764564F3A391F787FF5F97A950C72F271F493CF64E808925231209B8BE77C862C77B7C04C3611C86397AF49DAF0BAA4EDE81714586C0A6C5210E46AB49AA56AD0DC86B0207E5A2F8DE9885B84076C310D09CE324E9CC275687B054A0B4C619760A5F3C4E73A61CDF37C276261DB1E07F5361044EEC1E69CCA9BD48C3ADCF680B9E47D15A2F39235437CD40E7C9541A06C0DAB13A30294338561FB326E8275ED2832F77D95C63915C069FD4F59AFF388458B9B39E4E0E24C9932477DD52FF83DBDD24F2B639FF9A32156673DF051C35B6F4F32F2178B2ECD09E7E9AFD4B62DD5516A0E2BE2C895387284BAF828F886C0CF467405B0A67FAF76E4D1AD93311C8AF07EEF16F1729F60646F3DBB92DB02044F9FE563338DAC30EC1658AFFEAACC7BC4212588C322519B3B90B6655C2EC509C73E99E4B2750BB711BBCD39FBDC5399CA93EFEEF0CE82E51D08AC350BC0B5E503835EBE1B6F84C42E1AB43C9D886D14AFAAB89A0BA4A7C949B9D115C7F837D7495A780103BE8BE9F514A349703FD0E418DBE88F227880CE5B2DD54C0BCE1FF6189C3CA89216CDD230D5987BCD46C3B6C2DE7EE54B7DC96123BAD7A9E2F926AF1952F424F39C890D61A9DA8CFEBE177085D1A8760876F68648A82DDB799951A101B828F57E0CFE0FAC6D9085962CF45113CC5BF6D7FC2ACBCEEB556DF2BC3D2FE67A863312134E73E506DA9DC78B7C94347217EABB73E2498D5F3A5297F1859BD13748CDB3B70E51971CC01F05B04EB080228D5959CC8FE5961A02092EC8D0A4D16806EB5D60864C3ECF801244294022A0823873DBE8DFB6D06B6BAF69CDD107C960AA4B2C3536BB442461374F8FCB04832648B60032864FA6F0AF76F34355B9343DCF3C8F99FEDD88CA3D83CAD67351B4562064EA1325180606362D79A76A1B3C676152BA80E82B843D85D537ECEFFDDCC95B4661CFA4A70B06F924D692D87E1FB8E1CEDD85F7AB9324FF5D0A753D862591BE239ABC963B50A7EF870B05F2721215EB90A60E466955D522CA4216944693546 +sk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F9B2E348E4865616680FC184376A8CCB8DBE598365A23A2723944F5351F42F4742077582102F6F313C22564F8414E3766704FFD18017FDCAE570DB8C8FCB567E413219CB4B45175B83E6BA5E322A112D18CF9F356B57697230350D2591EE02AD2654515841323222580321040120642608376188550176634731510683333264078287615325127243053385335764750651411352886412447441854656426582177856811385002136841863785472614485644207284863746275116021244362472076432854217184010421775184164585148086710348507315328027533632554457272072637135303018607528446155853611235027221854501562400845348268740118636423130112600008304711528547310530448635743456714114736044238013601575856425814675633201646054071686605736211151076637413357714200555148206328275448486820815273068581865813888742410733578478145575784510487413488666062634876800164637016836408303211676660763637808356747017075160431237863706556044582355114760786272844564615514502882771488685156518416550255351116131380722168040207817541321026105332372513588560486666763605153400686036781773532303584585585382556145873231702651821601615475613435453205253646503075124375016318314624232777663801878426424837807747444530335743840253724533076811415126522320801307361222364261376300384861833134623305050075166418506205175868745534514330687281118860016350371186663328188310830745273650720105182737223725385635305211024178613826583774831043548113617260264885057838040760302110701821740681056880326375664382264012811160478503288344266741722267083004322170545055376528862025654274506414127738251184766185614737488047085880182412045436442130811456752843202150138755727608856482622838424402844587233774173341673110070483014068730277187116367374840580222778655865752756186171868068267623570340728087440262064413321784407530432675404153510222801127828578286328620245514484038018554816208205504456242220260650730645146723062131036724555002752342572057672566440784215365574084145012466856044503712682574544182267478348533103222153480526415458043351332432388544762882581714034065842506052121857400516021227658746582612353405307057267338344888677344061742714328142333252663347632168324801205742564851867411268402233626284578365081135203388317585381768678341467536821887133776615067477507772088788475223160138804715728535786023260646826021885712306281647812062372811286363611046727808057720442776132781067716352488361062733251866054685857840457420542023545155765377857084582244508465135035172458261816554334254317166171313824372288330486348830232135368717232633204480245362724325702261536128252007641320831467776802114887488465410826053602543010762601427424208671532371636210147224850133520033281870045574587735040533704783165412680078731157477051152614324517581088431785417275162632401473321083815678856545746776374874304800626007433863048305242168847128485157785460127241373680123031320510753557476455618482257671271040403050182053635446611842371782003385206425686324506278743843608760167647052812756434850150304062123835645244000555334854840304846070522672406004825581021471435363611118441785683041814020154570744330533742113803627262112418474C221B25DFE65E913E32545DD2C3335E6C6CFF3F73D2A4D2EE3CCCF8150F4A4AA34FE4DEEE188ADF128FB7A2B549A96D67E4ABE280089CF16DE078483C9D88CCB292170D585A4382BF1C69FE4E9386CA1D5BBA673B92AB78AEC293545221DEFF4019081BDFB9374441C9328E45A306B3193BC8F207F914A5E4EE76C4FD5213CD1795294A0CF570155D124148657B5E209A64BCEB017F58C3F851CB7916BF22A0F94D248DB7F6E3758545AA63F89757BFB1C03F43BBA700EEBAA84EDDE961CC205154411CA10481A88FE101DB0BA375CFBCC6E777ACD72F00202BFBA22FE5C0964CA287D00CB93A01C235A3A6E731687039A86FF1C5C211868DD41B32614A48E109156079F7668DF08879AFC7D0E23197AAF7E630169E53D73797427F0E8C4727EDACE5E7B6930D5E1A8591B6007680B197642A71DC645D1A240DA6930FDDC2AE6A5AF09CDA16201E0B41484BFB1CD9277CA676D46A48D66637FCC32D2EF5DE2ED4974238347C81BF183F5BBDE7901D56F8A8F194E836432697BDDD22B0C82B37476893F52FD2A3A4E3D7D701FE3701B5945736D97F5CD029302D9C14F0FF981ADF7CC0B1A52E0490D5E8B3EB8D5E95C8F2599143849ADA2D1A9F2AE88C695635695C1F860D5E591911E79EE66D742C1441974FCBC29C42D9BBFAC0BC71ED751E56EFAF0C87D31520CC17AA910EC90CFF31D91527DCD940DC0280EFCC3C2BD2B9BC8F0B47E6BA575ED4C5A473B26C547E82ED737F4676CF6E2EE6F945BECE53DF764E6FFFAB31394D4E0D56219DE2B604A04D4DFF79C1115D7976D571D67003619C801F05288E2FCBDE519A5ED10C1742C780B2EAC28015CE8EC3CCC5D1AF22A8AC5420871EC6E80E8527B3FFC5D2AB8CE7201513476D0AC44B3515B37AB1E6D92379B100D7E36156DFB2586CCE1E2FDDA6FF51644A0B1B71B4B976578D05D4BB8F2BC0E9160A0F714FE270DF89947477D1CF24436A166588D465CEBA4E7AC85312B4819384C9D032AF59A68E08AD106A3AA00CCEA3F1C0B1F13250425160D5B446EA5D1798A2B9A2813445BC70EC445E13E371FAB63B6A711554C4B4BEC8BE672012E9C056A0898A8658383E093B2F5715D0C026F8F5D7103B9B8C8CDF4A52EE26E537175957ECE287733D17DF403A571E8BE539797E546BBBB28719DDB148ACB29EB044BF5F6D4D24F08524EB5409F8DBBA7B6472D68E9474660617CF5D6CDC1EDF9417E63CB38B8B00E4B0FAB413477F234A48B43D107FD9931B7F7B505ED5882A50F09A59B65865C06BEC97915FF3B04DCF95CBA410E930E9D5284B366C606FBC9BCDD07764D6AE6995B51B18407DDD910B774DC45A7F692DE66EB87F54BBD835F95E4912A4349F8B898AA5E0804AAB4607FFFE3CF45F40FA1E4EFFC0A42520C7859442CE7FC685F45A9CCBC15A5AB5B9927BDA21F85908D2DE4B9A8A82B7C0FEDF5B52F124D5770A080B07FADEB552464708DCD93D89D9BB3525A525B9F63DEF3AFEC97DD3F737F612CF5445D6BDB089B2FFD1276E1125A38EA1B1373E28AF987845EDB8CCAC3204C988DD64360181D34B5F2BD21104FBC86F19DB1D732ED4298C72E08C1D75D8800978E4CBAA3FA8E8B2991922882CC8841D33F8BA9FE1C24931A54121B9B3C24523797B585F78BB38FFAB9F291ED86E79B36363729632BB6264A95E24F19665029764994903E3330ED3967A6B1ADEB5038885B6188186CFC979C2077BDB2AE531C713CD58C258D5D767FB0587C0F2C37730EF326B9825A18578B9522C7108803553E54A9724300C69B5342FFD887D1D7AE744E721E161001D2FAD52AFA93A63F9E1DD06A1ACD7532D465ED15B07575C5B09917CB55B7B174A037E0A03B5148466531D5D315DB5156A58875C0CA2596554D6A97B3AE68DB6BC27F32E2EF54F8E181CAEF3B9F329643C8291225975009032F9DC9C409B9759BEE8759EAB07995DAE0D87A10B2B1157364666C9C974098C0A52B46C2ADE69ACE08D1E92726B33CA127CC26E775D1B4123FD4832B3954F2555010157AB5664410667E828A765CC56FE2B7D2AACB27B58B644DB35ADD1638C9E522BDF7481F1E3265C8D91081139B3B82A4E05DC449EA94ECDC639074B5E617C6B21AD33F79527D3D10BEB575ACD3816A9939BFE766B8F4F07A1AC9CA21927D6C609D71A8219C0D39A229C8EB231FBDD53E756D89250BC03811041A8BDD2A60C392DAE899F6F5C57935650649B6F21A21046978D4F2A5DD105FF16780D54DF3F7B0D1A6D68FD0915D13181292AD463354B90DA2C7709FE3F248C4A469EAE9CA57A8EABADFD0EB2BAAD5482B14553DBA05377CB62AE9AD76ED07ADB931E4384FDD1E55E4AE829B97509B3C84B673DFF72686365322859C521F366F38AFC2E8F4926F4D1D00431120127F1FDE25467DE4542D8EB43690337A7B405B88C3DB52A460D1B0BB8F87E1EB7DBC6D9BB50DC561D76F23A5C4A743412ADEF08393764FEAFFB3EE272DAC0420649790AFB070F5FB83B6283A6C64CBF69C49D9A0CDCD605E69FBEAA2A2672DC7DD1B454C8E30E0022EF2AAB91C7866AF43B2545B7D866100E56E67DF12A6318CA07DEC5726A14CCDC9728B169A1D039509C72C029AE04C28C1D6F0402E7819ACB651E03D0358794B0D32576331B9C0004243819B0D4A2006E81A36FE2A67F70473C90A12DD6BA669D5A1F4DA3D577FE9A8EBA7263D5837EB600976461E5DD64B93F484511EE2881949A5974FCE1575BF5D528CAB654CEDC7C5E6E4752024EC7117EDF5BC1ED2EE7F6B3C2873BD4EB23EFE00291DC81EF1B17CBB60723EAB8435AC2794E9A13D1454360FB18CB0B9B0733343FA008DC45046C826728C383FA6720A9DC2CE17AEFA0AB548AA0138A184751E7CC9F17FAF759EB18793F040DA465AB6706AFD8E02C7AF51807E2F50D90E872A4DD039863829C1DFFEB1684E6945127881BFF2E42107D643BEBB254A2CE489E32D7D52A99766251907770A2A1F4CEF9C1171340BDEDF1D539B4C304F8B22408AC24DD1E307CB747EF11F6BB35EED04B9C98E477B918A9F4C5EEA6502F3D0687EC5BBE77F2A5C7DD17BECF5E1F2DCFD18B1C49C8C9A1A7CCDE1443F3F71D77FE07732C9CBA7A43290185CAD7CD6741B9DA4FE0C984AC6EE6C175C7D6DE9EC65ED3C0A6EEFE713DBCC2D6478D657A1E417B8F9481463A799879531E99383FD3F7D4ED22D08043105FFA6761C0AC5B54CFEACD885664E5503EAE79A9697013B6272D69E48A60DCCFEB3AD28E402334E7721472930CBDC945A98ED5D78CF8FCC68FB267C0D497925A9C33829B3C6B87A0173DB9BC55A74A9F2C86859ACA54B158984B8FF71F6361691AB6EA01B5A922749058D0E188747E088387FD42B6879E879F0F66B276FCFD558011808212537AE4A35B308AF27687E6FB1ABE6C9017CAA6E47788925468926FEF07841D1BF4996FB9D3BB0E819773E84929E43C28E4B50696C08E1C7EF51E46C94C99401FE6B28125DA89A66D65D38B7A9DE8B02B59572A0F724667358C696B9EBE5DFC511B1A diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt new file mode 100644 index 000000000..a9e11477d --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt @@ -0,0 +1,130 @@ +Key Generation -- ML-DSA-87 +seed: 6DDC6B90E85615F0B14B4404DF3980684561530D0836B13E83E3D0FCB6BAE3A7 +rho: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4 +rhoPrime: 3045D0593BE84B554E7F8F01B0E495189D29CB5FD0623D43942B73C5A2FB1CA3601FEF3D2B7534DB93A6366BA829F0976192E5E1AF6FA53C310977D320D48637 +k: 292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5 + +aHat: [[[4942817, 8033578, 6193969, 328164, 3123076, 5608360, 1966694, 6159093, 6759326, 6515321, 4110789, 2846010, 10361, 7650249, 7781336, 6041326, 3536117, 2317544, 2721408, 3046749, 6270459, 1299626, 1215811, 3133880, 2370213, 920527, 1371791, 6811904, 2145793, 6207375, 8116305, 6492100, 252579, 5753948, 2401968, 7443724, 6047272, 2583106, 4272483, 5642404, 7540939, 2340897, 8148728, 6414703, 3554582, 4848846, 6304416, 4682923, 4866938, 1589246, 5949669, 1816143, 4144854, 739672, 1612639, 3960420, 4823091, 5152652, 162563, 7250025, 7861187, 1075468, 2760719, 5325368, 2853995, 2491970, 184325, 8285647, 1101892, 8236541, 2352450, 4836362, 4400092, 1730566, 5875078, 1163328, 3799181, 1078400, 6473097, 176770, 4389290, 3930702, 2247381, 5252155, 5094297, 5798128, 1548908, 786346, 2167616, 3408943, 6482932, 8268308, 6846461, 311108, 3509443, 292335, 2139945, 5315971, 4034246, 3368750, 3185661, 850239, 4727176, 2835091, 1966568, 628972, 3540979, 5585861, 4851680, 6954667, 5585688, 7575029, 1022666, 1224100, 2117265, 8081556, 5564272, 6094337, 3512192, 4447560, 2593735, 7029115, 1615057, 6182604, 6007387, 440008, 6161124, 285274, 3999454, 1761041, 2682656, 403435, 2315983, 5882539, 1551338, 4646148, 4502297, 4745509, 3584078, 3034937, 318029, 2307385, 5511360, 5629585, 4943712, 1674374, 6932098, 404086, 3453431, 4041486, 4634031, 2114236, 2992967, 5097826, 427152, 1671710, 8117492, 8244909, 4947244, 7239291, 3863419, 784527, 7897835, 6455885, 132223, 5997318, 2639167, 475440, 4874364, 8341775, 5628523, 1704181, 1098470, 7942278, 3058693, 3581325, 7088671, 5471389, 5666382, 5936984, 738801, 4232882, 424231, 5718096, 2810555, 6995518, 7506366, 6192412, 1757809, 1852167, 8088408, 7915331, 3188672, 3633386, 2245020, 2109698, 8282768, 4928891, 4784934, 8234992, 313604, 3282379, 1182558, 1215938, 2941269, 6527348, 3668135, 7140353, 6666194, 2123640, 3890789, 4426242, 4754497, 7088400, 6357265, 1544629, 186145, 4633732, 5978430, 1508484, 6936717, 3072796, 3033893, 8284754, 7504959, 6804803, 7393696, 2806493, 5282554, 7253014, 7185358, 2664060, 5981318, 5057868, 2331017, 7531460, 2845195, 6326162, 4354426, 5894280, 1602267, 6299024, 6615246, 1498629, 5102463, 7208301, 2184276, 4872292, 6275357, 1334360, 2731352, 1632393, 2666965, 4482704, 3506670, 5714329], +[1550168, 7424210, 292109, 7423684, 1750345, 6974931, 5688264, 8172582, 770260, 1381627, 1430742, 693826, 1001472, 6715016, 1188195, 1888150, 3818556, 4676105, 6034536, 676245, 8304778, 2161621, 1600065, 4407112, 2158044, 835278, 6792695, 6929321, 6760175, 1439959, 1023596, 1154979, 1529259, 5763706, 8334783, 5823503, 4999957, 7234018, 6957958, 1228673, 2899197, 6071344, 501162, 6338780, 348247, 6966377, 8354104, 5109858, 8248876, 7506290, 2141176, 5088302, 2589322, 3257874, 35325, 3628863, 7891066, 3961938, 7778545, 4186932, 4544233, 7669253, 7142240, 4164782, 2509776, 5557977, 1239692, 629677, 6586379, 3360713, 1958463, 3764734, 1682603, 2598256, 1418342, 2138070, 3711210, 4332406, 5252160, 1253277, 6428406, 3393451, 4341410, 6485247, 2227999, 2690968, 875285, 1447394, 7206506, 1558323, 965728, 652347, 3011978, 2437239, 1823421, 144, 729592, 3499376, 2958953, 6006172, 771666, 6233402, 791991, 3989110, 7045738, 6702703, 4506662, 4675489, 5488081, 5637200, 3266530, 2294293, 5597871, 5543096, 7933404, 5422472, 6442413, 3556798, 6221072, 1330862, 3079373, 1215107, 4472703, 700557, 6503776, 3711232, 8016347, 2297024, 5321936, 7719190, 2619287, 6428343, 7931800, 339829, 1210465, 1083452, 7581552, 4333105, 7219062, 8349424, 2110987, 5827470, 1903192, 6042708, 1260469, 404345, 1308913, 3877033, 2156613, 3818187, 682298, 5693335, 8221670, 7241503, 4244003, 7377251, 7599163, 3143159, 6714452, 5889779, 4242052, 3780681, 1681893, 4207853, 3939263, 1254054, 4637554, 5677431, 7446000, 2908649, 5745245, 1125336, 2914898, 2246931, 6519697, 747492, 3807501, 4510429, 7516883, 7420863, 46634, 7519094, 5632365, 7495346, 4046425, 4648072, 7600501, 7802465, 3036604, 7028666, 5613020, 369226, 3095310, 4874432, 1079495, 6601707, 2555469, 4647714, 4287202, 6893076, 1130447, 7845836, 2725068, 1644341, 1445534, 2873352, 6836269, 1098473, 7034864, 186560, 5900811, 3032385, 1546486, 3120856, 5387893, 5268223, 3833296, 502334, 2324504, 1602597, 2153345, 2891768, 4175188, 5234338, 5254478, 5533199, 5364139, 3814120, 1196947, 706277, 7598811, 6387988, 5315995, 1287836, 1107367, 7834361, 2430011, 5174785, 6101375, 229022, 6316026, 4036416, 426020, 4898874, 7591, 507098, 5712767, 7951861, 3393251, 3246455, 4503296, 3783317, 7261701, 2807309, 6255617, 7918489], +[124268, 3454508, 4540277, 2184358, 7715163, 1896113, 7392215, 2245934, 1933423, 544210, 2362289, 1133934, 5522240, 7079493, 6220452, 6725585, 4287242, 7872520, 6621741, 3618444, 3504714, 4508259, 80298, 6477825, 450462, 2979288, 2311097, 8017037, 1898478, 1693384, 4568288, 825712, 659735, 2197465, 6608878, 5097441, 329414, 1492926, 7771628, 2764980, 8267025, 1045780, 6086304, 5728373, 1185312, 4403074, 1113298, 2528623, 636481, 6048978, 5522881, 5237844, 7252175, 6302111, 1737301, 7430134, 6042491, 6280648, 592171, 6568069, 7386665, 260177, 8162793, 5396531, 2080605, 2879094, 6550355, 4316630, 4693187, 7227018, 1878178, 4062968, 660982, 4107999, 7342087, 143367, 5924700, 5292073, 5963544, 6392840, 1479198, 1674589, 6104642, 4482736, 8249291, 6361729, 1378596, 4908681, 4536361, 4362312, 7063547, 6487585, 6293197, 5083317, 1023209, 7483314, 7347362, 8016708, 6258737, 841418, 5986694, 8187776, 7314254, 4069187, 4777966, 1282229, 6849823, 3651546, 5167237, 448982, 1617535, 6148062, 2563831, 341348, 462953, 2726092, 470426, 4389745, 1897006, 4198701, 922933, 4832433, 3998732, 1019961, 4704547, 3686639, 1630795, 7480248, 4423139, 6066099, 1658452, 6587344, 2406221, 2616268, 3370493, 945748, 7548847, 3540138, 5497123, 1777802, 2285179, 6059608, 1116857, 276355, 847199, 470378, 380991, 2090624, 5511114, 5338633, 3294702, 2758899, 6750230, 7849133, 2519388, 5952859, 2024128, 2765296, 4432592, 4002463, 5501721, 8048477, 3042065, 1048052, 3038342, 317406, 5628826, 5089941, 2414816, 97410, 2666506, 5195965, 4308509, 5255146, 3067360, 3058663, 3154174, 4210082, 1201494, 335802, 4732686, 5599873, 1517675, 5649550, 82666, 8196174, 3041934, 1141908, 2422690, 6366263, 2276637, 4975039, 4811690, 4288619, 546780, 4828023, 849944, 2754180, 5503830, 1260152, 6280854, 4347769, 1714217, 7055213, 1845288, 6519162, 162994, 3813822, 2123297, 4083321, 94343, 2805404, 8015229, 1940844, 970280, 5414903, 3027911, 5144950, 5266658, 8296429, 7608062, 2147950, 3858856, 6791048, 4115046, 2360009, 1007126, 1420551, 6999770, 5397107, 3240435, 3315224, 5647378, 6172666, 4887504, 4141035, 2861062, 3122658, 4093908, 715621, 1714512, 4633066, 767499, 4331334, 2272858, 7241032, 3107744, 7800848, 6296453, 3911231, 3540601, 2068866, 3927560, 1040826, 2201935, 664526], +[7090291, 1989201, 6118115, 1476146, 7536419, 8322799, 5950956, 8267461, 7609389, 1431325, 112675, 8267806, 2877813, 4587228, 577546, 6811694, 2846461, 6055685, 1172044, 7701176, 350602, 3345503, 1484354, 4957584, 6104233, 8114112, 6390720, 8160489, 5543073, 6161915, 6908779, 3470522, 5663216, 1025863, 5518546, 179031, 5319046, 6492566, 4387380, 328865, 2385300, 7509164, 4523830, 1769437, 7305191, 1799542, 2579784, 3379695, 5023935, 5119468, 6440062, 2478574, 5947135, 958864, 180362, 983875, 3631642, 3133879, 7769249, 5795411, 418829, 3861659, 7308043, 2791794, 5470605, 828605, 2531813, 1043049, 4853410, 7922908, 2008161, 392887, 6419330, 6961948, 6912016, 224530, 7823713, 3084620, 5966231, 5456628, 939767, 226305, 243958, 3042851, 4844383, 1859447, 4688504, 5537197, 5850555, 5348179, 4615676, 1784321, 8078674, 4808530, 743138, 4156228, 6846512, 6273431, 5871168, 7755251, 5252026, 1891973, 7255979, 3093452, 6088132, 4544061, 6903402, 7069266, 2713182, 1732214, 3097381, 7338844, 3829305, 8201661, 1264893, 7370864, 1319291, 7615276, 7261221, 5162860, 3374788, 487509, 2734496, 4436233, 6454810, 3515043, 901118, 8015800, 1048476, 3640805, 1445919, 2573951, 41572, 4724743, 310668, 2494134, 1127574, 3700120, 1140349, 6456036, 363970, 3869283, 3279457, 7762368, 2866833, 6299927, 1719650, 4131478, 3913974, 116163, 5214814, 723937, 6021159, 7621537, 3356650, 4600497, 1298750, 2427630, 1482432, 6759971, 6863640, 6354088, 7045221, 662877, 6594395, 978353, 3130181, 1412508, 2686843, 6669197, 3433059, 6682135, 2522990, 8345241, 4097226, 2199179, 5021392, 1997087, 4416448, 1851497, 3676944, 4864657, 1591364, 2453500, 6349615, 4985104, 273089, 6509201, 142979, 5212001, 6724389, 6847978, 192405, 6975782, 4255889, 2256402, 7721989, 1586571, 6669505, 6615576, 2454479, 6254706, 6553216, 678558, 6052126, 197972, 5932736, 6717340, 4478648, 610318, 6591033, 7963332, 58445, 7514386, 7185820, 1503190, 3721213, 7131565, 7114576, 5410511, 4436485, 4755765, 3078576, 5879490, 397700, 1948141, 196872, 2587143, 3256582, 536885, 8291646, 4951029, 497181, 3717800, 1439253, 1539922, 2107716, 4688967, 7120882, 7560935, 928356, 5989369, 917995, 2455435, 2352765, 2883184, 2695744, 7213419, 4429725, 4589005, 8187736, 7721735, 7801436, 7824046, 6971001, 1076175], +[6562658, 4589386, 6234799, 7747056, 5404545, 2851093, 6252981, 7600008, 5648332, 7563286, 6404145, 7446438, 1037168, 5590589, 304912, 6960005, 5744852, 2746386, 2898502, 3422249, 8167784, 1309529, 2758962, 2671454, 4194029, 1085914, 797984, 1647852, 206216, 4073375, 5435427, 1499910, 6729526, 2635710, 5632714, 7529680, 1428005, 4103599, 3821554, 7098260, 465711, 2757861, 5446148, 3440599, 4530016, 7700119, 6190804, 861232, 3944011, 6180181, 7139693, 6235623, 2983564, 1706716, 6738505, 5250519, 1738465, 1270613, 363412, 6579829, 4925248, 3329734, 6411381, 1783469, 6605643, 1721359, 7398433, 6872567, 160503, 171249, 2336352, 7364444, 4603427, 1956714, 2766079, 3050834, 2233409, 1364666, 8266683, 7161440, 8350339, 3670932, 1703959, 22757, 5317210, 6512134, 5242806, 4243750, 6531552, 7312805, 7511890, 3287607, 767868, 4987844, 1938322, 277307, 3685347, 7676723, 6628398, 6580532, 1230075, 3836024, 701948, 149399, 3755502, 3370574, 3267189, 200216, 1632788, 796172, 6374951, 6761509, 8073339, 5555301, 1367489, 3701593, 6876839, 7391291, 2042009, 6628353, 6453810, 7228110, 7245753, 8098564, 7201603, 1493223, 1693809, 623301, 3445276, 1016451, 1475111, 3382255, 1203580, 5943013, 3043118, 1644084, 5771140, 3522427, 131065, 1126935, 4217440, 4984877, 4872483, 7793824, 1260334, 5232320, 5184612, 6915124, 2335251, 7318959, 6655725, 494764, 2819970, 2159975, 4308005, 4871776, 5668657, 4555501, 3923486, 8042080, 3351893, 8165657, 5047625, 2086590, 7434653, 290308, 6596745, 5204995, 1611056, 8223486, 3545529, 6785072, 6380045, 1672801, 1761495, 7561702, 6328723, 3819929, 7100920, 7760954, 998438, 7106637, 640831, 6285002, 1555626, 5308276, 1431966, 7121865, 6685259, 6267600, 424532, 4442371, 3188000, 1131698, 3361174, 473970, 2028693, 4594364, 101879, 7911894, 7849749, 3702466, 1929498, 7602101, 6438906, 8290092, 4622910, 5379401, 8277555, 6076121, 687759, 6303932, 8014870, 4304568, 6836794, 1534152, 6135528, 3561472, 8091493, 7321206, 5416391, 1911962, 7726862, 2606264, 6310349, 4307424, 179712, 5888195, 730849, 175061, 4954712, 2800340, 7000348, 7002065, 3643029, 7336409, 8327667, 2405013, 4737561, 7978872, 7558159, 2966653, 7609329, 2694919, 5579629, 4894203, 2124591, 1588521, 6168078, 1981865, 2604210, 817321, 4997594, 6341282, 7888693, 2178309], +[3291489, 355298, 6318436, 2743739, 2683026, 2452262, 4419231, 4318992, 3175689, 6158679, 6560796, 5470575, 7202885, 2142351, 1162017, 833132, 7115046, 1024202, 4011955, 1243334, 1566406, 7291028, 1800528, 7434535, 4753067, 6669087, 5157910, 1225615, 733758, 5059269, 1405834, 5737760, 1827199, 7429041, 4945180, 7288049, 4592238, 4669567, 1540085, 6732701, 5121778, 1176156, 6513025, 634514, 7058789, 3658132, 7299854, 3960003, 6337720, 6944448, 1572149, 6614321, 2327214, 6448700, 8211235, 1310972, 2861913, 240787, 2120767, 5811986, 3496974, 7830062, 1777202, 8295596, 5670692, 4565177, 7762600, 7384213, 6073137, 758809, 1562827, 3650471, 3230719, 6276997, 6364453, 7790129, 2165338, 7405311, 2523061, 5370921, 7308988, 6428925, 7636941, 3852314, 404904, 5787905, 2404242, 7669057, 6630597, 2045477, 1538028, 7178786, 4031242, 6868106, 1006508, 2894804, 5252844, 1540351, 6641674, 4819286, 3346530, 2127824, 292560, 8241122, 7089843, 3993080, 5335622, 6190000, 7762219, 4082211, 7182135, 4871977, 6074725, 5973764, 3437891, 510067, 2579299, 1383156, 1804347, 1625094, 3296368, 1998359, 1111718, 5523524, 3928799, 6662714, 7046742, 4716316, 6110031, 7745795, 6745752, 2759022, 4656918, 3932306, 2031488, 3772845, 3911021, 3007748, 7322319, 2757657, 566202, 7266127, 6770431, 866924, 5989071, 2932644, 8066863, 144656, 5453890, 1244952, 3957526, 5526654, 1226544, 2137720, 1884574, 8012225, 7355529, 5641775, 3474075, 5009081, 1422018, 3757299, 3895970, 5861437, 8267021, 2572551, 5122437, 8305441, 2795997, 6490598, 7850818, 7333662, 3652637, 4191273, 7561082, 5225217, 3614063, 6607886, 3498001, 966846, 5942594, 7337788, 3191805, 4224922, 5202069, 1688596, 1981936, 3862115, 6326591, 7265125, 4742705, 2774314, 5329378, 7112644, 2536312, 6976007, 8356455, 4102683, 7647006, 5160465, 4374949, 4683296, 4124670, 2441640, 2545570, 5622816, 5459400, 2598296, 1708806, 7250218, 360980, 4055939, 6637525, 498900, 7474442, 6365726, 3736619, 6265007, 1782616, 2229228, 7113972, 1439365, 4304835, 2717545, 3850714, 2426070, 635255, 7178569, 3647900, 1304479, 3620126, 4314908, 380949, 5261176, 2220297, 6801588, 319274, 5555023, 762561, 4283760, 7707711, 4155486, 7717787, 6062317, 5256117, 1494618, 3461102, 2150123, 2693569, 6246660, 5150462, 1052373, 6150796, 6409892, 6156663, 4125505], +[2318043, 7634396, 4128865, 1470370, 8206572, 4934646, 1248748, 7691275, 6739257, 2035651, 1186985, 64591, 6787706, 2783456, 2005998, 7121044, 2615939, 7792539, 2107293, 6455128, 2905042, 4871871, 119937, 255218, 2463182, 1894493, 1153410, 3578021, 5361819, 7504103, 2063679, 6813131, 1375990, 1337553, 4671486, 7911246, 5814813, 7039830, 5267927, 4867866, 4627304, 1274635, 29492, 6802158, 857730, 4742465, 8139844, 3784980, 8178018, 5230085, 678155, 1866601, 5002198, 292759, 119103, 4862978, 914208, 4463045, 1980598, 3763875, 8289289, 537456, 1396433, 7223993, 6028806, 7404699, 5722404, 1571479, 4536443, 5470083, 7393180, 782089, 7410085, 2580657, 3277785, 7604831, 967464, 6362582, 5870678, 5918271, 7761026, 2469347, 3696925, 4597721, 2199906, 146141, 7742163, 4407167, 1837463, 192411, 6087419, 4704629, 3296522, 3746844, 7564947, 2349514, 7338993, 2606699, 6572041, 7386240, 3431541, 5693487, 2761404, 3718757, 6438353, 4047003, 1448719, 7618901, 6713099, 1916112, 6713348, 6394728, 6287415, 4908384, 5238618, 5035257, 682648, 7642357, 6338709, 4266467, 464443, 1948226, 7034213, 3799, 4819257, 603692, 286512, 4613495, 6413019, 8093545, 6472938, 2713773, 7684995, 2988502, 992015, 7651302, 7549382, 6820837, 1077546, 3172635, 5812266, 4075566, 7605044, 3121055, 4797932, 4550027, 7869895, 2597491, 4130894, 5780693, 7380796, 1634434, 93222, 7331275, 2519148, 6961480, 7254808, 4925813, 28176, 1339337, 761837, 3735627, 1138328, 6127790, 2607131, 1351154, 789103, 2268991, 1650990, 1953390, 8129282, 140889, 3695278, 2577608, 85218, 6634886, 5256301, 4190229, 2427849, 1201555, 2142420, 6071051, 8096546, 924908, 4372138, 787581, 4282091, 2832449, 8024845, 3929088, 1779977, 5160502, 2968631, 5928748, 2422370, 890621, 54158, 1544166, 7992931, 562184, 5369427, 782984, 2939808, 6263502, 1767407, 3093903, 5483480, 4159618, 2831389, 2815050, 545622, 8152053, 3137421, 8337969, 1329605, 2005251, 1800340, 5750814, 4246108, 3440553, 7525381, 3794399, 661566, 3212729, 4884181, 8271048, 667405, 2531805, 8157274, 1036172, 7043646, 1070459, 6789345, 4781654, 1824175, 7878106, 3336934, 4519946, 3671062, 1902593, 4200439, 1713694, 3405389, 6746655, 7336880, 7879513, 6707627, 1062511, 2028245, 1188314, 1792884, 752605, 7901641, 7147858, 6152594, 8343818]], +[[6751095, 4795203, 885047, 7940309, 3478932, 3238845, 863413, 7851412, 6543404, 1357512, 4757923, 3430655, 3676858, 1096643, 2035346, 1725087, 3507397, 879250, 2288486, 280410, 3000791, 1984678, 1373405, 7853247, 4736334, 2332728, 2350953, 2186166, 6808659, 7979162, 5080950, 8143904, 7268047, 5605829, 7908376, 7948657, 6561944, 3135604, 2691985, 3994273, 1821263, 6695907, 3712683, 7708795, 3716683, 433189, 4666287, 1892953, 1205689, 1884751, 7742487, 4865850, 7322163, 4706767, 6052298, 4627777, 3847127, 3228439, 7721549, 8117503, 2882600, 4816017, 1510540, 2317754, 291126, 5849360, 7724084, 7403677, 104336, 3619157, 1202556, 1110298, 7841957, 4238043, 7393146, 1968558, 3168770, 2877227, 2714562, 944233, 5588351, 2384955, 6110746, 1965275, 491269, 295712, 6818342, 291487, 5020579, 1971892, 2059733, 6497678, 4047600, 7556301, 6539029, 2338681, 4043349, 4364643, 347335, 3195915, 239945, 8332701, 517255, 5605823, 7357017, 2734022, 8202537, 6301241, 8111641, 3110622, 2239943, 2802622, 2202877, 1688656, 5280977, 6759869, 5804947, 787123, 5042862, 4689223, 3934824, 2819262, 1273265, 5904214, 489859, 4147976, 3948606, 431460, 2439562, 1903663, 2840047, 8287966, 5297735, 402689, 1502823, 3587927, 6606677, 4816862, 8047747, 5965768, 2650493, 4630375, 6813294, 7124647, 1033707, 2825313, 8177791, 235634, 3212471, 3215376, 3035029, 6311988, 1086544, 5212123, 217492, 4333461, 5296456, 238495, 6728832, 1018752, 7972486, 4044650, 4886825, 5510336, 2219791, 729333, 6868987, 536484, 5733946, 3233489, 774738, 1349325, 400438, 3636645, 7554378, 6015410, 3532873, 5538835, 401019, 2883838, 2723643, 6607023, 5519380, 3094919, 6027316, 2685918, 2909373, 1415425, 5240992, 278754, 2345667, 6235146, 7620696, 4121899, 4502119, 2555363, 664532, 5547725, 2628573, 7180606, 3391994, 5424680, 3210167, 2042474, 3769922, 5621045, 4201283, 6594107, 2133648, 6931021, 473998, 4046819, 1403445, 6255888, 2137075, 3652598, 824511, 5254020, 6063424, 6057342, 280780, 5740573, 3672971, 7403778, 119374, 848070, 3299338, 6886103, 1900989, 3833782, 1207252, 1822715, 4606129, 8294995, 933298, 5445054, 8026640, 5049098, 1682529, 5876662, 4810134, 1592882, 1511200, 7136876, 1331216, 3121004, 5162348, 2518345, 5177633, 1545182, 4734107, 4125372, 7565800, 2987938, 223471, 7434975], +[6476891, 1272736, 6895586, 5995035, 3702657, 1401339, 2764560, 2935833, 6056732, 5204200, 7883077, 6613066, 5655867, 3999117, 7461239, 25070, 661785, 6153359, 8246781, 7146281, 7007317, 1650728, 5956800, 2758622, 5034532, 7065320, 2124924, 3964137, 965414, 1625485, 1733553, 7504007, 6551472, 7900070, 7482544, 793905, 1026118, 1571976, 3913244, 2822754, 777321, 1024911, 483321, 6691468, 6102271, 3558611, 6695078, 2093271, 8278712, 5208811, 4569412, 3656736, 4554180, 377091, 7861784, 6083642, 6561199, 7078199, 7223561, 944610, 1137887, 4395992, 7543311, 4133130, 3287430, 7753270, 734286, 602206, 4091314, 4514852, 3320601, 4331908, 4309428, 4333282, 6969814, 2354487, 2453465, 728783, 4025949, 5329756, 1281858, 3912836, 5407965, 6967513, 2082577, 5564225, 86243, 8065043, 6542808, 6112996, 3334872, 8273080, 2332332, 2278327, 2140087, 461490, 5681877, 8086723, 7178764, 7215555, 1999691, 5462873, 4779520, 5038401, 2072430, 54234, 3458740, 6841286, 195726, 4711342, 2673222, 6133969, 8157160, 4522306, 3172419, 6118689, 3671789, 6016236, 6690747, 4767189, 7629121, 6638934, 3448050, 116322, 672154, 7126721, 4383307, 4043477, 3840265, 3429511, 1204334, 6102473, 5091034, 1963914, 8272802, 5960368, 1792045, 5960367, 7552500, 1008550, 5659021, 4128869, 3311842, 3127272, 3788843, 7450387, 3411140, 4866745, 3947284, 1004443, 7011341, 1282024, 1380404, 4314417, 2976249, 920749, 2695644, 4653367, 2153892, 680205, 3949025, 4846090, 3013192, 3437938, 5853869, 2110353, 2018090, 5642105, 2061456, 295805, 7281932, 2190730, 5469153, 2801403, 2644754, 659541, 6421762, 6108961, 3861817, 4543297, 6832299, 5496097, 2903780, 6527846, 5006095, 6477294, 5075665, 5529606, 1913399, 313944, 2485155, 8043278, 3403779, 2005266, 3388133, 3669212, 3135482, 341739, 292356, 6260799, 3101772, 6218234, 267767, 1689670, 963126, 1799986, 7748068, 2475689, 4814367, 4782406, 7834185, 3228347, 71406, 5096387, 1015713, 4204839, 4380399, 3017429, 5278885, 1329709, 2741256, 8352956, 1789673, 1705272, 1296461, 4014281, 2025872, 4521377, 4560695, 2745517, 3802749, 4941885, 4810271, 3945148, 7710417, 3894015, 4735556, 616183, 3133252, 1730823, 5185677, 6729885, 3704649, 6951087, 951499, 1629073, 3551815, 4971465, 5156933, 6963295, 3240860, 2262626, 7106398, 8294249, 3311636, 6982187], +[111619, 1676994, 1098033, 7710340, 4760347, 6602290, 7315031, 583574, 1626727, 114820, 4149543, 3038751, 7361786, 5735246, 3890677, 8012447, 2604931, 2684764, 6581247, 4394982, 7701225, 7909965, 7526721, 5118485, 5320434, 5698954, 5349329, 1473466, 3400943, 412228, 4770835, 3459174, 2095715, 27144, 4941901, 8140658, 7117633, 7432500, 8265263, 2725505, 7151706, 1165339, 2214439, 4267376, 4437403, 2692371, 4311270, 7136977, 2521293, 8227583, 401703, 8360516, 8261995, 5781447, 7086980, 24140, 4828655, 6050732, 7958, 5310267, 6805324, 3332368, 7096315, 2010763, 1779478, 5507514, 817253, 8003762, 3812905, 7138960, 6221024, 2603806, 5800256, 2699033, 1168661, 865306, 1017725, 1362241, 4594286, 2153557, 2753094, 636703, 1917776, 5222181, 3814607, 6597777, 8336267, 7372776, 4797723, 5145069, 4398226, 4477675, 7138360, 5104574, 92449, 1541680, 5146709, 4714944, 1340886, 2521418, 6210599, 6763988, 648010, 1210506, 4522327, 7220120, 2539632, 5502013, 5429101, 7297533, 2330200, 801829, 4307704, 1564563, 7660938, 1486554, 7085516, 2067582, 4177849, 7771615, 6902300, 3782060, 1780540, 3387065, 5338543, 3783816, 1808309, 5025146, 5497441, 6669583, 6440450, 1387637, 5308114, 5958104, 7962645, 5297694, 217910, 5818179, 8107471, 1742062, 3323546, 3205566, 5438963, 865402, 5244058, 2129686, 7648350, 7525973, 378679, 1639334, 8106734, 6638892, 5592849, 2137207, 2385452, 6482525, 4479444, 2617984, 2137320, 2658402, 4812798, 2509087, 5945382, 3670439, 4705473, 1142377, 8201723, 1045729, 2362050, 6678922, 207442, 4363495, 5593076, 3950996, 1424564, 1439296, 2428094, 575177, 1048, 2632687, 7183292, 517156, 2866908, 4019740, 5485492, 1630403, 3854222, 7494081, 2613643, 39814, 5570057, 2565918, 5594189, 8256879, 1437564, 4428191, 4695604, 3325202, 7999642, 7620225, 5072968, 1209312, 7771244, 6978854, 443972, 4372896, 4087611, 1887400, 229728, 7586330, 1123133, 5814707, 6081995, 3186047, 3477409, 3860170, 6503187, 4480135, 95838, 6350297, 1229136, 3623912, 3682561, 6224580, 5762404, 2480050, 247450, 1613365, 2351719, 6229159, 2065951, 8148746, 4567389, 4524949, 2421069, 7709944, 5273185, 978712, 3282297, 2052230, 96588, 7056422, 6939803, 3227456, 5376329, 656857, 1707491, 2361931, 4749949, 6452618, 309084, 6722262, 3919921, 2719174, 368589, 3099014], +[1440271, 5728915, 6744425, 5387316, 2224474, 3278861, 7884805, 2439391, 4207727, 7990031, 6602542, 6027830, 1622622, 420242, 3955074, 7508794, 3594656, 6506828, 5210271, 1641300, 2002611, 1890290, 7165934, 4864127, 7528599, 5159198, 7411610, 1600681, 8097738, 2775133, 5582741, 6756740, 1472117, 44100, 5121027, 4737891, 6721415, 8107516, 7749325, 4166297, 623411, 4332720, 6327763, 3851672, 1830623, 2567124, 2086122, 1655603, 4987454, 7553431, 7074153, 5497490, 4315022, 1170125, 2999857, 3513096, 3077743, 4365435, 2656943, 4567950, 8261950, 1428889, 1945783, 3505370, 827025, 5490949, 1463425, 6913993, 4490590, 3262197, 6723810, 5270961, 1693688, 3194706, 7870375, 282821, 8154936, 5439411, 7346416, 2322829, 4498397, 4448288, 4926603, 412709, 1467492, 1744393, 6324381, 6807702, 6698955, 2836148, 1098737, 7787632, 5600183, 371117, 4441500, 2874651, 6341038, 3413325, 2812055, 5535489, 624307, 6650283, 5199110, 2376768, 5823438, 6852952, 1630717, 6391776, 6510242, 1486924, 5867609, 4047369, 5837502, 4363815, 5387744, 8289435, 7811456, 1511827, 5326328, 142721, 6737079, 2641974, 4083182, 7422018, 7730845, 3724776, 4416264, 3890631, 6679547, 1921729, 4035936, 7817015, 5181126, 5020502, 7595951, 7975474, 4893442, 1576956, 7209064, 4364720, 2438984, 2032332, 4744565, 4688186, 5703513, 8100558, 7230920, 3311055, 4439061, 5635770, 3899831, 1885655, 617854, 1255288, 2395895, 3631106, 1570697, 4396400, 1695570, 4407054, 5299201, 7882535, 4034632, 2725065, 821406, 5826558, 7013710, 5380165, 2386136, 5192039, 5084403, 2421784, 2808044, 6011123, 3873461, 1249881, 6209740, 8219344, 6974819, 7235173, 8339928, 2076486, 1733701, 8084269, 6959599, 5771827, 5707238, 93481, 41310, 8061116, 2085879, 7141713, 7677783, 5843820, 5992287, 7737448, 802522, 7052498, 992924, 841287, 5500278, 1329849, 3629010, 5377923, 4811434, 5232705, 925726, 2674185, 4741592, 5814553, 6329610, 4618171, 3774201, 568387, 8148374, 3064425, 208034, 7527510, 5217180, 3572150, 5711951, 7035536, 6239242, 8294020, 8074928, 2103706, 6772843, 1083972, 5009329, 3177257, 6149619, 835559, 1011387, 7414590, 3597950, 2542614, 2691486, 7159129, 2652292, 849763, 6607563, 1830791, 728450, 4795880, 7201012, 6741918, 2307056, 6694005, 2205922, 6343351, 1940664, 8125548, 2213634, 519296, 6398731, 1742236], +[6370436, 182888, 7464879, 2196521, 3016161, 5710855, 2178731, 5242891, 7175646, 3376572, 692652, 115256, 4681265, 2327364, 2866131, 711001, 2543099, 3952645, 6873295, 5874177, 7842267, 7460562, 2103889, 5307755, 2748798, 5682641, 2064938, 994731, 7316148, 7724024, 6661771, 7891061, 3333696, 3505649, 6523273, 887444, 6717279, 2121048, 2210738, 4195354, 6759001, 1863853, 376520, 1308760, 7186525, 4452157, 783534, 134073, 2252782, 1339413, 1861831, 3241553, 5573493, 3828234, 2542644, 6324500, 1571161, 2652195, 2037112, 6669366, 4686981, 2056409, 1564989, 7246088, 3488787, 2424423, 623278, 140110, 3051064, 7864232, 768386, 1315674, 1511982, 7121946, 1538112, 7211115, 6300123, 3663354, 1726877, 28613, 4445831, 5273734, 3002191, 385451, 5009543, 4747052, 499099, 4633017, 3164423, 6692198, 1151832, 7368178, 1730215, 7593663, 4420845, 6559731, 1778274, 7733518, 3493353, 7115783, 1328832, 2776578, 4566058, 239026, 8259472, 6553016, 6416483, 2929324, 5498164, 6281446, 1943822, 4238161, 963731, 8064601, 2622570, 6355087, 4337091, 1503751, 4093881, 291377, 5411105, 6900748, 1285139, 2996804, 1639018, 4451582, 4467082, 8097000, 4047496, 2908878, 8338836, 2089162, 3783940, 1771450, 6799800, 4997128, 5100179, 1796653, 550299, 1219994, 4008138, 383514, 6311848, 7640655, 537625, 4510206, 1034153, 5330904, 4657692, 3396866, 6742694, 4497646, 4217863, 2007116, 3072597, 8067082, 1109224, 5139740, 7294832, 3383664, 2509457, 3744060, 6408599, 1302642, 8329512, 4588043, 1102524, 4964929, 2821649, 1823572, 6767145, 2586648, 308995, 4776529, 8157535, 4316630, 4735203, 1011890, 2695909, 5143059, 7353613, 724804, 3130264, 5338244, 8139815, 4239395, 6222159, 4321803, 8322735, 6234963, 6507140, 1842719, 5625545, 4511207, 3406794, 8020465, 3309806, 98342, 105605, 361485, 7289774, 7343717, 5474574, 3382938, 81991, 1648491, 6095443, 1708831, 5419209, 297297, 877589, 1901449, 7055875, 4390177, 7180193, 3813482, 623224, 2133247, 5237295, 2580078, 8297584, 8140553, 2207391, 1791402, 469374, 1258826, 4457375, 7059905, 3903672, 7032837, 2336308, 7562556, 549571, 3207520, 6897500, 2374073, 2525078, 2405454, 866625, 6922550, 4767212, 3713596, 6227576, 6905221, 1758141, 3361235, 6912194, 4383639, 5525742, 3496007, 5593733, 4665592, 7956024, 1706800, 7680460, 1302122], +[5188684, 5135238, 2297957, 6853152, 915652, 396775, 2807763, 1583950, 4150010, 3415769, 7391999, 6813601, 7072294, 5490506, 2824855, 49545, 8264355, 4098461, 4777510, 6500465, 1428602, 1855085, 5447637, 1145048, 4935218, 5419327, 1677402, 2990969, 1051297, 6256614, 5530434, 5012074, 8075416, 1304490, 7707684, 5299912, 5734297, 7846005, 5107826, 213311, 2703934, 8005644, 5214795, 7613563, 1212925, 8125766, 1361743, 4455087, 1496409, 4410391, 4436496, 8283312, 7151812, 5539885, 6707432, 7994726, 7095397, 6192040, 5077777, 5577855, 2869095, 4047545, 8189070, 6220763, 75955, 4385765, 636052, 4572864, 2066601, 4508464, 5945656, 3324303, 6189266, 1287276, 6926910, 8210694, 3218693, 929109, 2972097, 5072056, 769760, 5472836, 2286651, 6514537, 3099230, 1663793, 1719663, 8192586, 338385, 6428412, 7306278, 7668214, 2508447, 5775485, 2913751, 227433, 159552, 6590226, 5599974, 5442169, 4795632, 7948716, 2136690, 1391615, 5475437, 1731855, 1108447, 2259297, 1328225, 5226910, 860282, 8323024, 7020816, 714547, 5708399, 6831589, 2230688, 7522236, 7411356, 4143192, 1206109, 3603321, 5592645, 6391587, 4782316, 4232161, 5108558, 6948077, 2233238, 8371438, 4040646, 6319502, 6702108, 6942376, 2186013, 7048495, 6011145, 7920113, 6182143, 1142088, 3001344, 888009, 2366964, 3813796, 404752, 186801, 6710043, 989313, 2939002, 1540143, 203997, 3992775, 1019585, 7467304, 6273972, 8226276, 6835853, 5683825, 783467, 4779036, 6538227, 6581944, 1311199, 78493, 6255063, 2786811, 4880643, 1671827, 3209645, 3753049, 7382031, 3385531, 4736602, 4517108, 678625, 7688556, 7048041, 8268232, 4313694, 1346460, 509573, 4695861, 904968, 5515360, 4197105, 1429467, 4196332, 4508373, 5323233, 2096377, 1723206, 6385954, 7562597, 7740186, 5645050, 7979631, 1712487, 7263435, 4077406, 6099701, 3720423, 5030308, 5225176, 3492173, 6042577, 6819292, 4602024, 1753319, 6095055, 5107877, 7544405, 793939, 2432377, 5345564, 1069504, 3431216, 3026505, 5635957, 6427472, 4422110, 1516109, 3010762, 4798740, 1636871, 2261079, 666510, 4979533, 2771542, 1603972, 7448104, 4134703, 7842028, 3607408, 4855718, 6830817, 7330854, 1180320, 8342148, 8202896, 2103302, 4726766, 207074, 4336685, 5301805, 8017531, 3207765, 4800668, 4566823, 5510486, 477610, 1241002, 2889600, 7107733, 3843327, 808457, 6037945], +[7393218, 1010544, 3183488, 218660, 1441560, 7836839, 4983576, 4533836, 4969688, 3733928, 6869004, 5587507, 3764032, 4131977, 3851001, 1453460, 5118791, 3854553, 2073971, 2228573, 6929473, 4323941, 7733547, 1524685, 2865938, 399231, 5733417, 5736532, 417290, 2588427, 6919824, 71817, 6867722, 4383823, 6190831, 7968742, 2026367, 6042561, 2146353, 5878182, 4203143, 4541042, 6083522, 4939206, 3988980, 7283451, 2999672, 6853643, 8182666, 1151008, 6527229, 6864305, 2819138, 6714176, 1288565, 3207889, 2065181, 916640, 3059622, 1598106, 6112770, 429106, 969034, 5076607, 7130262, 2339937, 6908584, 749908, 6922910, 4837313, 6383853, 4326285, 750885, 6416544, 5486858, 2293387, 7413210, 6218001, 1596253, 1976809, 2120109, 4792013, 2612340, 5217977, 7350753, 5974215, 4446632, 140160, 2585069, 3101378, 2755997, 4206147, 4253155, 5845946, 8107194, 1963949, 3871759, 4881533, 1652782, 7983440, 7685161, 4284228, 5654027, 7044660, 1583462, 5104430, 7834647, 2532939, 2841082, 5057887, 1823885, 6823299, 2144802, 228342, 2805703, 573965, 3727947, 4627422, 1117472, 8300813, 2533346, 3635354, 4840010, 5144115, 8284731, 5033354, 2163030, 5590009, 7644617, 4960397, 3407240, 631099, 7524712, 96012, 3605586, 3082542, 7905016, 6199246, 718259, 7694530, 3956311, 6266425, 1150139, 8084362, 1915011, 2644793, 5243211, 3139878, 2689012, 1286078, 4451144, 481318, 4632259, 8335499, 6855889, 6500657, 8194073, 3641807, 3933466, 6943907, 4783841, 689874, 7223634, 2127663, 1553196, 3446462, 2093820, 6158213, 2446582, 2581522, 7758883, 8305768, 3764022, 8326987, 2982826, 6419194, 4128593, 658068, 7600883, 2259852, 2916371, 6336323, 4427505, 6009050, 6598145, 5442426, 8356766, 6331308, 1923665, 2062793, 8133521, 1321759, 1984376, 1476431, 832971, 4118161, 1757245, 6384005, 314822, 4708615, 3648245, 605737, 5968656, 2276625, 7434635, 1038395, 695736, 2330549, 3838059, 3828632, 3673039, 878015, 1331304, 8266234, 656965, 4365274, 1078122, 3717961, 2481642, 3895505, 8269144, 4792734, 6966191, 4643038, 4611752, 2812883, 1283788, 7402851, 2675286, 7957640, 3306450, 6993067, 5590700, 1584176, 5971990, 2948979, 2207517, 5592115, 3090390, 8238826, 3141801, 3497152, 5500832, 2763996, 2426928, 3522197, 6429592, 7644530, 6766918, 7615983, 7988132, 4084939, 3031288, 5365043, 4759102, 3014436]], +[[3370263, 1299342, 5032432, 7061446, 6126697, 6765940, 6437056, 7315301, 4981667, 2489899, 3182661, 1225959, 100414, 134135, 2004517, 3625453, 578729, 6939089, 4536144, 2456983, 3387733, 6724231, 5731499, 5173368, 4730278, 3814469, 8167680, 2279258, 8049541, 742775, 7581054, 7256159, 7971096, 5079182, 6344532, 508911, 7301600, 2795538, 5234115, 7367426, 6346625, 7453439, 2412006, 521226, 7980331, 392874, 7570550, 4793369, 3728966, 3234210, 3425449, 1022433, 2375398, 3377419, 4509020, 6722704, 7724484, 2351714, 1528176, 1073572, 7674001, 8110410, 500114, 303841, 8214655, 7101694, 826539, 2394823, 825759, 1586550, 5547245, 6992106, 1243916, 1890801, 1241774, 5360335, 7989979, 6152430, 7841138, 1770796, 3144485, 7808898, 664244, 4726379, 7416723, 1199638, 4059396, 573458, 4297269, 6586347, 5159968, 7751445, 13923, 7178485, 6174051, 3787674, 240725, 4186665, 4402460, 1591098, 288813, 2807572, 8290861, 5059356, 5063924, 5776449, 4436483, 5864031, 5409614, 1281189, 1295414, 2173938, 551794, 2051025, 776118, 4472346, 805703, 580048, 3225194, 7595431, 7108433, 272339, 6702207, 1142788, 63817, 6823331, 1916328, 2663113, 2711045, 1259772, 8131532, 8088118, 2963971, 3078835, 7413207, 8010696, 220298, 2297499, 4892617, 1879194, 2218141, 5853492, 7734517, 4957669, 6045751, 7552485, 1197893, 5406474, 6568777, 4209272, 5539442, 3502497, 4800896, 6527371, 7003313, 3254711, 3623152, 3820113, 378599, 3456670, 5306285, 5213009, 757733, 6552657, 7765895, 2487483, 7938810, 2860798, 3368951, 4464133, 627361, 6560682, 1662374, 1223048, 564743, 4435405, 3081744, 1490237, 4258025, 5994084, 8067940, 8074694, 5688845, 6084869, 652500, 1382884, 5414137, 2001653, 1272341, 6870987, 8271120, 5730142, 4481312, 1275364, 5380118, 7671022, 5982366, 4186302, 1357454, 5900277, 7381177, 1159252, 4699439, 3786881, 5363490, 6406565, 4617969, 8248384, 4929029, 5919827, 7562778, 165143, 2202408, 989063, 3686245, 5442312, 3393707, 5488221, 3934599, 3037552, 219778, 3432133, 7156069, 4045239, 6166246, 5141467, 6450221, 6664669, 4545185, 5563393, 6940125, 7815759, 5068078, 3999753, 6394938, 2149591, 1848783, 2658595, 4988305, 6439136, 6660796, 747320, 7512029, 2274920, 6997800, 1067768, 5919123, 4928164, 584410, 742930, 6419491, 8189549, 5784638, 6364383, 1279991, 5426589], +[6486891, 4134635, 6662125, 2267307, 1485590, 4866120, 1942594, 2315799, 4549479, 1310108, 2865296, 7414502, 4158063, 5585248, 6904333, 4709561, 6522755, 7391681, 662500, 6919424, 1242586, 7982493, 7840114, 2124013, 3424444, 6579333, 5367006, 4153374, 7163413, 6726895, 84724, 919943, 5497524, 7270822, 670241, 3864373, 3346706, 5996766, 2412285, 3829599, 4858004, 5057848, 780037, 5046363, 5183361, 3135466, 5577767, 818796, 5038430, 6809301, 7318763, 8125019, 4066804, 3466827, 4310899, 4287981, 3521391, 7907687, 6770724, 986189, 164639, 1475778, 5264157, 7908300, 5086771, 882803, 3612346, 2065187, 4710360, 3274338, 1295124, 2161795, 849661, 3174432, 5999437, 7487091, 900155, 1450944, 533484, 5211631, 666194, 5789488, 7530482, 4301058, 4783584, 7920266, 6702854, 5599039, 7273077, 1782238, 250705, 2442885, 1709783, 201696, 5569405, 2242299, 5760132, 7265903, 1737699, 6441095, 6089094, 5569757, 5917349, 5450989, 1063932, 3251013, 443637, 6124621, 7959269, 4991146, 5731727, 2615447, 2156300, 3178573, 285810, 7293436, 1844124, 5593131, 772619, 3425537, 8365223, 8149101, 6293446, 5880537, 460898, 1857027, 5221106, 1586575, 7251322, 3417109, 8059674, 5951072, 6849694, 1783382, 1403634, 7651653, 3478968, 249491, 4472553, 1726046, 7217115, 6111415, 5832718, 4082258, 4822680, 205835, 2593960, 4825894, 2836919, 8198750, 5698654, 4516557, 5665758, 4116568, 2599079, 6496023, 3940040, 2766724, 6274875, 7061605, 28616, 2509242, 5249922, 8297378, 2361152, 5057827, 6142467, 301752, 7061292, 5817479, 1253298, 6303816, 7775455, 5316596, 5341496, 8124618, 984136, 7503890, 1462637, 4485311, 4279213, 6224857, 934511, 1243241, 5967475, 5025962, 5379516, 3603492, 242553, 4151226, 41772, 890208, 1813771, 2011794, 5554248, 5881586, 7663788, 4130647, 4671251, 3634669, 521215, 5300628, 4615848, 4755718, 1176214, 4367269, 2461989, 696253, 3868849, 7148228, 3388382, 1505924, 6867076, 4168625, 5713705, 2486287, 2849323, 2640768, 4010455, 8239474, 326057, 6881231, 3209082, 6201440, 561880, 6246623, 4351250, 8192610, 7738037, 524215, 5374035, 185308, 4055774, 7980145, 7933828, 8001448, 3512516, 446900, 2421450, 1951241, 1269221, 4824212, 1632840, 4115509, 4040146, 3952078, 2277565, 5557504, 2420974, 5088619, 6694090, 6620405, 7294355, 687112, 2660872, 648892], +[3441553, 3979285, 133147, 5349434, 1017619, 2776213, 4142221, 3803179, 4540498, 5675471, 6470991, 4841527, 3357281, 7357435, 2894473, 7900698, 3169619, 5713251, 3118857, 1277342, 415609, 7220625, 6026701, 643116, 6097489, 7727734, 4065351, 6375860, 8117575, 4545678, 4333574, 5110984, 3598055, 7581953, 2439618, 1863069, 1449982, 1349515, 530357, 5619299, 5469847, 479772, 3081697, 7956057, 6309245, 1706839, 5622278, 2183376, 4213386, 2181687, 1396500, 5887806, 6740532, 5931761, 5967880, 1770294, 6007649, 7580694, 3430048, 4800265, 4891315, 5685215, 4919189, 5798984, 3538331, 8313848, 7969850, 7988911, 1608787, 3293872, 772400, 623896, 3728568, 5454949, 2814662, 5165114, 1742262, 2374598, 1642942, 7894219, 7322533, 1949042, 2448548, 4638378, 7962919, 6629587, 4951618, 4277901, 4652755, 2201231, 7749850, 8293548, 266824, 1888667, 3087474, 7102866, 2916373, 6522551, 6817945, 5223176, 1638848, 456022, 5003183, 6602242, 7404340, 4592256, 2167063, 6541547, 7976695, 386098, 5949474, 6177768, 2993831, 4216730, 3627729, 7464546, 872995, 6822210, 4862710, 3810456, 4994117, 3955423, 1509830, 2545105, 372891, 2509240, 2575381, 3430551, 1832096, 3427950, 771891, 7635736, 4430734, 7375712, 7150891, 3871714, 2369104, 5171594, 1359332, 4437796, 6942610, 3366405, 5931856, 4753520, 4961026, 5091945, 1885608, 6671291, 4423946, 5776029, 3298572, 8233382, 4931343, 5362711, 8111959, 2776709, 5390292, 717530, 6588152, 3095563, 3804043, 7346099, 2478173, 4461446, 2083375, 157666, 4793003, 3148614, 213230, 4593374, 10063, 3749586, 3835925, 3801118, 1127922, 2864566, 6785763, 7113581, 787089, 6465796, 7798302, 3835108, 3347848, 1305703, 6241286, 4328459, 8284094, 1327814, 1711177, 1795444, 665896, 1351202, 5885776, 5854065, 2797435, 1496487, 5102304, 668646, 6868654, 6333796, 3047870, 556935, 2479556, 8220176, 6155594, 7741281, 482135, 6960884, 1194451, 5715420, 3695884, 6075020, 8092721, 3222329, 3025710, 7599302, 1521787, 4912624, 6041466, 236583, 7253076, 4410617, 4101159, 2014830, 3109051, 2771533, 2807780, 3405961, 1293401, 7737756, 5592598, 3152558, 1464853, 5780958, 577125, 1681876, 3673899, 1739891, 8118368, 4230372, 2945845, 8260598, 6813870, 1723907, 7390798, 6010412, 754533, 425234, 6806744, 5113717, 361194, 7065522, 120535, 7426601, 1508200, 1582144], +[487068, 4872182, 3989539, 6199493, 95514, 2737219, 5857363, 6680601, 622058, 1133125, 5273818, 1409124, 1358525, 399396, 4353870, 3231532, 3310152, 6974637, 6200098, 5546740, 691227, 6643278, 354333, 7205498, 5548124, 1903322, 4247416, 2874696, 1186573, 7174683, 6107693, 4908518, 7164153, 5974054, 7028793, 3174692, 4392813, 5213258, 3705591, 2106541, 1319290, 5737421, 5688327, 5577885, 5337155, 2730292, 4246605, 2538795, 772522, 7508220, 5255561, 3312279, 4583530, 7160014, 6336223, 4594751, 3723083, 436532, 2369653, 1912121, 2535519, 1619808, 4779908, 6759677, 6276297, 2386901, 6087741, 1450686, 5165245, 1738944, 2672610, 4238194, 3590303, 4365412, 7218300, 2493194, 3879852, 2407856, 2644048, 1974150, 5152025, 7010351, 2354088, 4007288, 1047338, 983944, 513507, 1849449, 529633, 5994969, 4647398, 5379193, 7552795, 6049401, 8336049, 6279915, 4519899, 8310840, 1158628, 4696338, 4907405, 7236116, 7211083, 4811923, 5276319, 7742602, 3461985, 366427, 4378192, 1671837, 393983, 7094048, 3666886, 5354669, 1491114, 2712512, 328250, 6009111, 8104441, 6232089, 2698106, 3628631, 5255690, 6883789, 7316359, 3587755, 5963485, 4919045, 6687792, 4109601, 4412564, 1912747, 7262334, 5347955, 4426786, 311241, 332959, 3580117, 7276386, 6903712, 4781318, 2246500, 5811249, 1577361, 4858340, 3682371, 7810555, 1286787, 7171507, 4554132, 3627523, 6865068, 3273788, 6163772, 5856193, 1217427, 659399, 2272128, 437058, 2563401, 6672872, 3627954, 7473688, 5415216, 5271923, 5463356, 2128542, 8358876, 4291261, 5793229, 6260387, 3070863, 5090012, 3185548, 1932542, 4399391, 7598852, 4844478, 3259610, 2736770, 6860609, 3091564, 8240410, 7664840, 3747418, 6745269, 4081088, 2266090, 3306751, 6007412, 1039428, 1696325, 2427732, 8171600, 1787865, 1031445, 2893969, 5429540, 5990122, 3075135, 8014552, 2115921, 5038113, 5064367, 1414699, 5405798, 7454758, 3962826, 2159435, 3276562, 4616159, 4853070, 6260083, 5432963, 2240173, 4307068, 296823, 4571915, 620118, 5217500, 7037946, 7320181, 3770120, 7678233, 5514933, 4895649, 4257799, 3313641, 2227804, 5403601, 343819, 7346391, 7109382, 6279623, 2104229, 6555309, 937478, 8252972, 7190254, 2664726, 6348362, 4726872, 7110892, 7536209, 484507, 4761687, 3384015, 364756, 1971456, 7569751, 7382717, 3201109, 357990, 2987105, 8288771, 3630083], +[866447, 3947679, 1769457, 544454, 319297, 5389592, 3919245, 1952922, 3937569, 3387302, 4847677, 5140047, 1861483, 3601976, 414205, 4130652, 3626428, 6927278, 5260596, 7361355, 3627341, 5708923, 421046, 3703726, 1306583, 1837160, 3945516, 5411417, 4409756, 4215664, 2431852, 4063280, 921951, 47571, 947720, 8270019, 7197412, 3049706, 1270261, 4652623, 6912549, 5555621, 6696417, 2154647, 6040628, 7598532, 444172, 3049526, 5794903, 5920103, 6354485, 2717719, 2207372, 7556334, 7868006, 1461599, 3013143, 1801908, 4849285, 463172, 1739405, 5179098, 4289047, 7100056, 5813131, 6637292, 6170526, 446737, 5332989, 2674163, 3925636, 6804718, 2638722, 3748940, 6367884, 7322326, 1516153, 852415, 3451688, 1318027, 2645531, 2519773, 7598657, 184929, 4488231, 6768979, 1011689, 7290243, 2378310, 7475067, 7873783, 3656638, 8186730, 6743149, 4188385, 4051391, 7858336, 1381129, 7660103, 4685916, 1504622, 4384716, 2975229, 1474990, 4694943, 4094186, 8072676, 3294041, 8025753, 18461, 5690362, 45376, 4607830, 7530916, 3347828, 3690910, 2351029, 3669517, 2181843, 1110894, 8195706, 6841683, 32192, 2254708, 224086, 5930798, 3526744, 6536872, 5667114, 3226430, 3006410, 664562, 7917881, 693785, 6967946, 3552647, 5908198, 700826, 3161048, 5312239, 1797094, 6314893, 4667552, 7420950, 5090698, 3189713, 7192755, 919644, 3597773, 3931684, 6175687, 3920149, 325368, 8256184, 1287962, 4160480, 3325302, 6884333, 4452767, 6947824, 1330966, 1927529, 4150262, 2848542, 7887260, 7374041, 8268955, 6012176, 215748, 5791198, 5782089, 6301537, 6017312, 4065444, 2385270, 357938, 5847966, 882968, 4176509, 6192628, 3615277, 4844233, 4905553, 7067094, 5843983, 3494509, 4799205, 6141654, 5851709, 3640179, 6424051, 2432810, 2548809, 5307795, 6785641, 3191344, 725500, 2132647, 2069807, 7959108, 492023, 2928847, 2597774, 4648793, 8086471, 2731366, 4111957, 5296417, 2359449, 5718971, 95783, 7734177, 331516, 1420844, 3176128, 4010975, 139119, 40913, 350585, 2518210, 4472044, 4533156, 429368, 552783, 8018912, 4968601, 2911681, 1367732, 3751855, 2708915, 4003099, 6744823, 838092, 7668051, 4879005, 1670642, 6539701, 8318157, 4590938, 5320069, 4237749, 589813, 1786385, 1538608, 7363186, 4914439, 7984182, 5300400, 3960278, 3835028, 1758814, 7874135, 2523781, 359969, 2299194, 426777], +[1073395, 5657154, 6544594, 5142518, 3127479, 163603, 2031343, 5765489, 904245, 1034349, 7163678, 2500418, 2804720, 7733422, 6024520, 6211821, 6894846, 8358426, 7020469, 1159448, 2137158, 7325056, 3982222, 3726458, 4159121, 581021, 5855839, 4842745, 5493257, 2017884, 4938904, 1247342, 5084380, 4201598, 7289364, 3930204, 8111510, 3233383, 8123729, 5529036, 6108560, 7969165, 3802419, 1248697, 2669809, 582053, 7602678, 359827, 7102416, 7049899, 615644, 6710279, 2326573, 5676793, 709910, 4546315, 4440134, 2983390, 5603906, 6352893, 4012150, 88873, 7356523, 7922013, 5316083, 3218471, 1229305, 2331183, 1774526, 2468353, 6082168, 4467890, 2051974, 5311193, 2185199, 3983995, 636449, 7683173, 6976708, 2359199, 7630490, 5444850, 7099528, 4589720, 6207511, 6070601, 5252204, 7785845, 1598687, 417694, 3119547, 1302914, 1164756, 4471488, 2182031, 4990793, 7392796, 6221607, 2415649, 7043957, 1686557, 5308191, 1043068, 6913747, 2711492, 6832940, 7470813, 4105624, 7218337, 3729370, 3649877, 7898397, 7303069, 7999998, 7539544, 5504971, 5298476, 5315978, 335654, 6585163, 3847871, 104077, 2251840, 3784865, 2689769, 3322006, 7915242, 5033344, 7403842, 207817, 4047109, 5895551, 5314554, 805738, 2090200, 6101253, 1932159, 3213089, 5423322, 5555222, 2765815, 1003830, 6642836, 4989331, 1854998, 2726512, 1063926, 2314196, 4357559, 4941745, 1034470, 2172177, 236885, 6670628, 3538854, 564881, 5663550, 1498214, 4980961, 4150543, 3196640, 3326073, 2866721, 1275750, 5655474, 3177899, 3448846, 7446357, 6448869, 374180, 2296737, 8235941, 6957014, 5670644, 7680933, 7183947, 5354752, 5648560, 84742, 230321, 4951775, 4182627, 1014047, 5036690, 6523130, 2667668, 4074835, 3430880, 2069902, 6214553, 2211210, 2402142, 1799331, 7641195, 248846, 2870575, 4179921, 3999181, 2766387, 5361256, 2020385, 3936778, 3110820, 6843107, 541994, 6960644, 475677, 4049315, 1303632, 2209309, 8237298, 6784317, 2912388, 3576854, 5166596, 3875597, 7668509, 7551469, 5188298, 3340684, 3365695, 2934298, 5669260, 408513, 497445, 7710719, 2799603, 2127868, 2633101, 4208433, 2653519, 6011240, 3210626, 4527122, 2769037, 846747, 6850903, 6695043, 4534988, 4376037, 5658002, 4321125, 3444444, 7785273, 4819806, 3518442, 7660022, 1360830, 6388208, 3071767, 5747428, 6500875, 3906812, 5681769, 6368480, 7412897], +[1091497, 5888885, 5945547, 2880565, 1447085, 2690723, 108740, 983805, 1260361, 8032161, 2936029, 1785380, 6112095, 1994872, 79532, 3077177, 2964652, 5359618, 5359651, 2986548, 4032941, 59371, 3803946, 6243804, 8142756, 266347, 7430749, 4628145, 3684061, 7568280, 1727752, 3293707, 1176920, 1416086, 381956, 759510, 4638303, 307382, 7466831, 6420465, 3868486, 7212259, 3336735, 7785055, 3392653, 3319832, 1452478, 2634977, 6248949, 5163732, 1080444, 6039360, 5314580, 4252618, 5750481, 5223530, 1176312, 2877927, 914338, 24183, 7982210, 6586021, 8312315, 185610, 7660912, 6901543, 3734474, 108177, 1389719, 7074642, 6539600, 1569442, 1114271, 171575, 7945294, 742430, 3785546, 2458678, 4479547, 1723972, 8097353, 3521327, 2485040, 6424723, 2779848, 3405193, 813098, 2950085, 7206715, 6422772, 5244855, 6466051, 5512150, 6091835, 6251868, 997002, 5051077, 129099, 3966085, 6322269, 7136957, 1861223, 7216215, 7934179, 5763921, 2505075, 5045266, 541109, 8253516, 7957826, 5174331, 6109912, 5522359, 430725, 4348935, 7848288, 847964, 7579877, 1186688, 2795794, 8203186, 3717882, 273977, 6806558, 1931939, 5339534, 6657207, 2097390, 7787353, 2211503, 4033233, 3829874, 498898, 284839, 6528472, 5444690, 1190447, 6514354, 4106148, 1195303, 8323366, 8157369, 6721871, 3185748, 2359412, 479260, 6776310, 1504006, 3397140, 6280421, 5448049, 6321251, 4294833, 760819, 5665060, 5666810, 2139339, 593614, 3365896, 4223012, 706215, 5614132, 1015453, 5208741, 7125391, 2500415, 2190623, 7241064, 6774419, 985451, 2693600, 2585293, 3912648, 2763566, 4452648, 6897261, 2851520, 5564469, 6063664, 342509, 535117, 7457880, 610637, 2289616, 7072403, 1166571, 597267, 4342576, 6433689, 2053020, 4854467, 7122474, 3236606, 2852219, 1411019, 1067602, 4034975, 3307185, 6987468, 8188574, 2536672, 8317394, 3481082, 418944, 3168953, 6826194, 3305744, 8156918, 2727679, 5319840, 6903436, 99739, 5492437, 688023, 2023161, 5058813, 6477746, 6265546, 4248552, 3361626, 6360121, 3043848, 494761, 434014, 7762789, 6140129, 2452502, 7796445, 5206461, 5601787, 4843562, 5108236, 5611560, 5135291, 49356, 3082726, 222102, 2068422, 2887627, 2451878, 4084165, 5152179, 1751777, 7818436, 6248250, 532717, 688194, 3898514, 7879288, 6366190, 3584176, 7651835, 4213487, 1989911, 5042449, 4539840]], +[[7811034, 4101752, 4245472, 6073675, 1840404, 6250945, 1555058, 2120393, 1371489, 1671518, 4281717, 3309207, 6016120, 2526947, 2597507, 3488163, 1473549, 3896396, 7464922, 5062365, 720334, 2654250, 2806963, 2343272, 7959183, 5625930, 4238586, 2828879, 3218093, 8275971, 255241, 95652, 7358277, 2955752, 6588258, 5436651, 4310701, 4115484, 3997590, 1681180, 6377377, 4984026, 7728084, 1124172, 5151515, 7392587, 7212320, 1988786, 1469334, 6576597, 7671570, 2457976, 2032623, 7915765, 25792, 1993849, 5812670, 4145655, 7681746, 5613768, 5907693, 4310916, 2356521, 4579667, 5528002, 1081873, 3731128, 6821365, 5640258, 6908964, 6689436, 6691586, 1960130, 7978197, 1361321, 2204205, 4792675, 6751253, 6224912, 2714525, 7157068, 7773271, 3449774, 3704355, 1948548, 7333442, 4142247, 7190427, 2644876, 5893841, 4040484, 6436308, 6162570, 4586169, 1124328, 8122457, 7688341, 2198877, 3049460, 7538209, 7955893, 6706569, 3936421, 1182256, 1275366, 7542693, 8240356, 6695277, 8349688, 3857760, 48323, 3991311, 6045712, 1178717, 5180071, 4071305, 7031633, 3814811, 1042233, 3301709, 7651908, 2429255, 1194267, 6145474, 7142062, 168019, 2603243, 1929145, 712081, 8342879, 5792855, 6278775, 2615169, 7076719, 4476696, 4287465, 3661903, 5285781, 7800841, 7584498, 4088201, 1348969, 5369736, 2441916, 948390, 1353929, 7715351, 3431405, 3430793, 7588591, 619170, 1658274, 6969721, 4132746, 911100, 129925, 4738018, 4278712, 5533966, 6258744, 1520978, 6743151, 6468528, 5029792, 4775056, 5178178, 1137833, 8128756, 3935124, 1658609, 4297552, 302874, 5179623, 5821844, 251791, 2181799, 5885328, 4114299, 7910280, 2640821, 2630708, 5646095, 1572538, 6120953, 3006955, 2127227, 4920357, 1404365, 4804281, 5524336, 7553822, 7094073, 5635183, 3997367, 931747, 5483244, 4680653, 4228086, 8236395, 118522, 7617447, 7319084, 2974225, 1215473, 3555039, 6662272, 7110713, 5436233, 3979616, 6272857, 2003140, 1237529, 7266963, 5765861, 785352, 7206448, 8224950, 5224884, 3735985, 4149803, 2557395, 5401731, 797413, 944538, 691439, 7879378, 4427982, 1758520, 5266671, 2666997, 4760746, 4165771, 6017287, 2755530, 2999992, 642462, 1354184, 4126885, 7111344, 3700, 5555924, 6694733, 6452652, 1535625, 4307722, 3570299, 4056305, 7861196, 322078, 158368, 5079383, 3448260, 1313471, 6011413, 2035183, 6251261], +[1256704, 1488355, 7581873, 7558212, 7859489, 7092691, 7575430, 4205350, 1319598, 1739683, 623414, 6513847, 4614254, 5691051, 3896457, 3201893, 5354838, 1747765, 6887182, 5075088, 6633310, 674619, 5762972, 3983920, 7317707, 1288197, 2318301, 7236862, 1999326, 605736, 4887038, 1937153, 3701597, 926606, 4575448, 5383892, 2688188, 4901594, 4137514, 3877928, 5436773, 2536088, 4110745, 57030, 7657193, 6898520, 5187922, 7337738, 4067762, 5516933, 1579484, 3933838, 5110111, 959253, 8009430, 388313, 2920587, 449655, 6870454, 7317543, 7938387, 5961729, 6016667, 869106, 77445, 7966818, 595236, 7006559, 1386164, 296446, 5173226, 2273891, 5119728, 5299221, 2329867, 3571905, 1341274, 6108746, 3521510, 7151103, 6333391, 7746300, 690008, 2058189, 1538670, 518253, 2864732, 6847196, 436780, 781503, 7820175, 3555789, 2895884, 4329272, 4007871, 387699, 2146874, 4880718, 4813518, 169614, 2416606, 4371208, 1581503, 5450949, 7338913, 2413508, 974281, 6182988, 2007399, 2378714, 5566680, 2332982, 284428, 4079364, 2479613, 412453, 2958177, 2323915, 3073554, 6925681, 2838387, 7256803, 7963195, 5427935, 5753546, 1897883, 2599545, 1047633, 4656600, 1308018, 6616741, 1785945, 6386465, 5871322, 2717040, 1840926, 7406815, 4247873, 3539674, 4505060, 6457339, 2309193, 568925, 3979458, 690765, 7486625, 104640, 1028101, 7581807, 4692806, 7417001, 1989144, 979611, 4032945, 7204189, 5262250, 3927790, 599505, 6301276, 824057, 5381724, 2081592, 3943831, 1363517, 6158597, 4940388, 80763, 4144015, 292403, 936608, 78183, 5200365, 5380622, 6275487, 7205203, 7792195, 7862887, 5956808, 6917451, 3837513, 2652991, 6788080, 4547298, 6258780, 3013551, 1909177, 2751272, 8069917, 8350637, 6115312, 6420050, 1859334, 1134198, 477566, 5139461, 5246866, 6997939, 8226041, 2729740, 7422743, 2194665, 6475007, 8047526, 4429272, 6910083, 3942719, 6830983, 5712321, 3380462, 4901570, 4242386, 5844186, 1716794, 2789389, 4481338, 3741804, 751713, 72888, 2380303, 3100852, 1052470, 4755402, 7379879, 137045, 3045108, 1350904, 4366777, 5732703, 261014, 6270944, 7390063, 4739261, 3026858, 841503, 2073893, 5688322, 3191351, 3636487, 7246195, 7470765, 6000780, 809318, 5205086, 3461811, 3761188, 4553585, 1289828, 6146932, 7809159, 6804052, 7695660, 2315687, 4127215, 1115226, 6150121, 5731701], +[109922, 4185020, 646071, 4045549, 7361432, 7699670, 2954929, 5255748, 3714642, 6832145, 8037086, 8211787, 3834552, 7989652, 6418615, 3353711, 3600625, 2807706, 3532517, 7351418, 7076621, 7762202, 8151520, 2144508, 4589692, 4743880, 3194433, 680377, 2458095, 1483222, 8284513, 693750, 3318666, 5831973, 4370188, 145627, 4375869, 8144341, 2213926, 592792, 7681198, 7023921, 6950836, 7102755, 2199059, 8006675, 6526003, 6399429, 4991621, 3425378, 3868271, 7347478, 2631896, 6315997, 7252311, 3819053, 5724728, 3597198, 5190987, 4203206, 8215746, 2536959, 1303784, 6765998, 3614651, 2662547, 3633239, 7718348, 4512462, 497572, 2961067, 1090436, 6431850, 6685021, 4475041, 5640488, 6397796, 7208426, 2192549, 1406456, 6105572, 6592591, 6848068, 3269128, 7029944, 7391674, 2306085, 4668390, 7384417, 4973328, 6802039, 7503461, 6366739, 3548138, 520290, 2728819, 7686180, 848848, 4634200, 6976636, 2698139, 1500942, 531637, 1365438, 7378624, 2832560, 1547201, 3607022, 5182797, 1274524, 1120935, 4537781, 7285878, 7815823, 5448805, 3115927, 717397, 1342678, 8165940, 7751375, 6165536, 7606850, 8175106, 4819176, 2616014, 7209646, 6324214, 2618433, 590915, 3205647, 6405045, 5355917, 196609, 6788593, 5193005, 2954403, 7698605, 2330814, 2758946, 3834615, 2724704, 1919839, 6181472, 645634, 3209922, 5732551, 7457721, 4206286, 268221, 2018033, 5536207, 6243472, 4728415, 596017, 6162972, 2917444, 686065, 7448051, 7188144, 3698257, 6687114, 7277146, 2524804, 1089670, 5061967, 3331757, 2496812, 6140951, 3507352, 4342099, 8139096, 6780893, 4723825, 4489752, 622398, 259375, 7725254, 8087603, 3364148, 2642604, 4571747, 3475495, 8237459, 2653030, 3877743, 2267222, 2376385, 387997, 7879722, 6818908, 2888989, 2068812, 951382, 5258253, 3002237, 4330703, 2166667, 6671132, 6254560, 656374, 3715709, 4866989, 2312321, 2182911, 1999505, 763684, 7615860, 5723638, 2153463, 7622031, 4255488, 8341721, 3141229, 211020, 4644884, 6258259, 8092958, 7053192, 3382074, 748840, 4580928, 2958149, 6435024, 4649496, 7847275, 1158032, 6255740, 4134874, 5882852, 19161, 3701972, 7237434, 5767498, 389894, 2626734, 6917378, 8331028, 4312429, 1642940, 4871803, 2684100, 4110681, 6904038, 4254741, 454595, 7622610, 5514822, 6565493, 639234, 2697405, 8332752, 2268418, 1165456, 3930460, 4035883, 5306127], +[4483816, 3379592, 1203546, 2692844, 3427347, 3560702, 327826, 7632973, 8024956, 4331491, 6748621, 1459765, 2904956, 1951615, 4513228, 6971204, 5846516, 6030800, 3877016, 6434794, 2339897, 5552229, 4219454, 5405387, 3114314, 2225157, 396615, 92872, 1079978, 6884247, 1168789, 3510860, 1717039, 6275755, 2663979, 660714, 7922203, 3546608, 1205723, 4966453, 5866114, 5571988, 7879994, 7043226, 3062032, 3622844, 2092782, 2942763, 4795751, 4904374, 7744555, 1725917, 5860205, 475395, 1034126, 5066202, 4405744, 7050318, 530491, 8359120, 3358424, 1717516, 690729, 4676559, 1094250, 1695506, 4465868, 4740971, 2239327, 4966152, 4689145, 3284467, 1580817, 852538, 3741767, 6451186, 3778806, 6159023, 214477, 1237453, 3995042, 5226216, 4053200, 6275128, 6391361, 1609377, 3137151, 6800822, 1902869, 411819, 331183, 7567583, 3515536, 3968800, 3586825, 6690600, 2997817, 7192003, 7456641, 2132739, 2180485, 4079933, 1988700, 1026873, 3874858, 370845, 201437, 635322, 5198928, 3008997, 6276376, 5390774, 274788, 1442311, 839132, 4746707, 2263155, 8024317, 2668925, 4276631, 3075967, 7655496, 2396561, 1006296, 480569, 2741029, 6989234, 1040298, 2787738, 2908218, 7805540, 6996655, 430918, 4700629, 3018146, 6141364, 4086145, 8341757, 3506329, 6410534, 2202976, 88672, 7219552, 5657181, 7868798, 6668100, 8293960, 6093194, 5781844, 1915347, 2855028, 518222, 4840426, 6328358, 4896957, 2068139, 3181328, 2680058, 6603632, 4317271, 1837761, 6639253, 2201105, 2625448, 5508122, 5367425, 1595870, 7476458, 8106677, 5948865, 4695503, 7802511, 2242096, 7632432, 345069, 817086, 5464529, 4361594, 2017789, 5126058, 3597053, 7863302, 7637726, 8357340, 6803380, 6282652, 3199666, 7418499, 7010635, 7938770, 6626909, 2009459, 3142533, 5305210, 4370962, 1720330, 1495234, 4844605, 8096759, 7718297, 2066004, 1708289, 3218672, 4579767, 3994046, 4948983, 5809873, 1814558, 8140746, 4034502, 2227392, 6289371, 3407837, 2303869, 4896085, 3215749, 5993081, 4652499, 6402551, 3507036, 4284634, 2779926, 5053256, 4700734, 4624439, 5819197, 7579824, 6497464, 8301976, 759075, 6134726, 6616248, 2925808, 1628154, 5139381, 4649740, 2611764, 45664, 2438990, 1116980, 3415587, 4806248, 7230362, 3984018, 268676, 2174811, 4506765, 7764197, 3315762, 2609243, 5712324, 3243764, 2883906, 3038378, 2058201, 5999244], +[8051145, 5145816, 1776929, 1565352, 3826835, 255606, 7531483, 5409777, 78830, 80006, 5094255, 6403281, 6227379, 7122081, 4312321, 7267994, 6284531, 5630679, 1535142, 5621959, 6872447, 2949585, 6621261, 380618, 4972084, 536535, 8250887, 6369664, 6306588, 2816537, 3802017, 8282333, 5606907, 8254701, 2463360, 203279, 3885991, 6000707, 1186711, 3653237, 6599927, 4155527, 2283701, 6112953, 144165, 2849003, 3131070, 5774682, 7944174, 913848, 6412105, 2067794, 1806582, 3181323, 2808803, 1483852, 7356835, 1701030, 76715, 4976722, 1946731, 5556745, 735141, 2472958, 3034498, 5964770, 6461590, 3663453, 3579686, 7806684, 431355, 7447767, 1639772, 3948854, 3579701, 5996845, 4835117, 3761968, 1114643, 7803303, 5558087, 6130280, 6837251, 3240831, 2661974, 7265694, 6123, 7130221, 4047124, 2737230, 7687334, 3565149, 6329857, 2127526, 1939858, 2246148, 5026402, 1366582, 4408979, 5044312, 3056539, 7647688, 5601482, 3945656, 782895, 2563355, 4084915, 7886949, 1663457, 792218, 116788, 2650204, 6220050, 4767858, 2135096, 4383604, 6068199, 6980386, 8100125, 3717870, 1751799, 1169428, 6601735, 346037, 7721802, 6474309, 5035155, 7207522, 3305271, 2411038, 4694592, 4948476, 7531435, 4968575, 3436510, 665667, 7184482, 7646505, 4231544, 3857385, 3948538, 6813903, 7841245, 2820874, 2097148, 6662407, 3014948, 1351909, 7298755, 172484, 5062326, 7124626, 7917513, 4738864, 6039188, 2000501, 589729, 2022173, 5710600, 3707244, 5385622, 4067453, 5891045, 4453487, 5495426, 2090686, 7100792, 540553, 7258372, 4744151, 6477215, 4359700, 7198626, 5126790, 7102482, 6021695, 5631416, 2110081, 5606040, 7127673, 2732845, 1269337, 5385847, 6071973, 1648112, 4012618, 2554936, 7453012, 5869976, 5190781, 4984310, 8269436, 1053969, 6646070, 5448377, 1068431, 2780819, 2889768, 527531, 7713764, 1639612, 6918726, 4056204, 3420246, 3370180, 5077292, 1850388, 3456363, 3324234, 3869511, 6983293, 3264994, 6952813, 6629000, 1530196, 1269398, 2145320, 7586100, 9091, 5363502, 3434928, 1088026, 7444489, 884347, 7474044, 4081981, 2761150, 7607852, 5437025, 5566456, 4311956, 4521115, 4108533, 5923142, 6105850, 191156, 2785562, 5087888, 1896068, 4129716, 750810, 4120008, 6890438, 4691909, 2069278, 578527, 5023581, 2123017, 2309955, 5129166, 5187886, 4325504, 3130060, 2110730, 6731086, 6879866], +[1630276, 523180, 2797640, 2762571, 75733, 4223242, 6272299, 6599994, 3270576, 8299462, 2868060, 7091997, 1433287, 5825090, 6838783, 2199558, 3354990, 7115668, 4667311, 1661288, 400830, 18133, 5073934, 662345, 6174430, 5559616, 1296802, 6195848, 2709860, 4645106, 6870301, 6480242, 1783682, 5878939, 4848048, 6383603, 7796085, 3362918, 2320705, 7477367, 3790148, 2166149, 5184348, 3493576, 6660923, 8155232, 1437872, 1124258, 8037137, 3556598, 3888628, 3677225, 4839596, 880652, 5139752, 477012, 7226642, 2780778, 4436703, 6316265, 5409256, 206849, 3267902, 7318947, 4974291, 6870905, 6153128, 1679853, 3948769, 5540510, 6962514, 4275622, 4985516, 4799772, 1835328, 5465327, 2145165, 877519, 8254963, 2690654, 1903699, 4717278, 1455748, 1920264, 4614067, 2737606, 3001127, 1968039, 5874809, 5861629, 2233521, 3884365, 5162206, 3018088, 5278649, 8062625, 4241874, 7589272, 1096604, 7300491, 4527378, 1273497, 1433633, 7723238, 248133, 5997038, 5111139, 576518, 2608269, 582230, 4158483, 5220008, 1660209, 3555975, 2059227, 3055112, 1145482, 3179263, 3903974, 5007914, 1560801, 120909, 7016349, 5390387, 2466294, 4745506, 4701950, 4615508, 6395300, 4771558, 3646858, 2905980, 2936907, 222613, 2290260, 6649832, 2487272, 7606870, 3226133, 6286485, 752564, 5291910, 1717460, 7766798, 4391771, 7204765, 3937422, 6590678, 5714907, 755546, 5551649, 2544917, 3436186, 6901681, 1758541, 5006312, 5649748, 4660045, 4382653, 869434, 5972359, 5392261, 2784078, 6677345, 987288, 3999373, 6220372, 5220792, 7936016, 6864280, 6043212, 8139255, 3321310, 6230630, 6681532, 293740, 5880645, 1003359, 5025143, 1166524, 7521743, 1243824, 3397665, 7374145, 6787561, 6778317, 6162283, 2699401, 483819, 6707997, 2302692, 999784, 3257905, 2346885, 2655946, 2558008, 5397536, 4643384, 3325909, 7231049, 2569893, 5578458, 2336952, 3650104, 5078456, 4588238, 535103, 1428479, 5267909, 7110638, 648978, 3753595, 6739991, 3454160, 2467079, 4844239, 1259945, 2457759, 4223943, 6631487, 8356361, 1579483, 5126787, 2826789, 4443343, 601641, 2864994, 3274408, 2627862, 5822624, 7146096, 4050572, 3903430, 194490, 5498980, 5022682, 4621536, 2840691, 195461, 4834166, 6786792, 4525861, 565141, 1540056, 701331, 5619166, 6085163, 1491014, 7828941, 4586411, 3526621, 7966877, 515244, 5826290, 5540034, 1605806], +[751530, 5905843, 3672147, 4127071, 6938257, 7569913, 5720039, 5698380, 1076489, 6078155, 6140224, 976796, 4359689, 1431756, 2263584, 4458374, 5660321, 7100983, 5830682, 5039840, 3545504, 5360258, 5548835, 1822537, 894864, 1328328, 5334186, 8126709, 5662139, 6165209, 3552847, 6794949, 1284556, 646401, 1957098, 7612063, 2075893, 6426311, 7418949, 8250033, 5534641, 4933989, 836951, 4254844, 451369, 8213836, 6666052, 6881094, 6017598, 2906435, 7140232, 658296, 5831168, 2715854, 5569452, 4864739, 4223620, 5446283, 1444386, 4750472, 6430572, 5678195, 3742508, 1773619, 2419742, 6328743, 3495481, 5498585, 1168765, 7778401, 7783292, 2585518, 189877, 1519462, 2278452, 4308869, 1603426, 5967464, 6474730, 2177500, 2324828, 8014510, 3370896, 5440640, 4081174, 3287298, 76333, 7801033, 3380507, 5616079, 6779437, 6196679, 5020492, 5202345, 3224340, 6431670, 7397932, 5909088, 5461769, 779990, 4839690, 1857373, 3623298, 1369497, 1460706, 2943193, 5202106, 3483202, 4095858, 7951836, 1072067, 5593151, 6579328, 4484671, 3564098, 4039949, 406144, 5514184, 8237154, 2186454, 7515983, 898844, 1743549, 2529736, 5644280, 5375228, 2476243, 7091064, 3297269, 4770674, 6979279, 7559932, 2012394, 313989, 1485807, 1157859, 6874030, 173990, 5380925, 1777874, 2068217, 1978150, 1057131, 8134735, 3336236, 7358905, 1466324, 2290795, 8178763, 7489415, 1173640, 8268809, 6066941, 5011141, 6448773, 3367821, 4318769, 5476441, 543744, 313760, 5879783, 5781450, 4946107, 4357621, 1353832, 2580726, 5125600, 7950855, 8054853, 1423231, 6145445, 7360399, 8128706, 6444457, 1155444, 2560997, 7923929, 2347011, 6296431, 7347275, 2881346, 7477119, 3896982, 6639865, 536591, 3703725, 727079, 3641942, 2649035, 6752022, 6416050, 3646962, 3474762, 6224146, 7292612, 4317752, 6631707, 626905, 3832919, 1455118, 3531308, 1241716, 3039723, 2637620, 2201581, 3870412, 718136, 4144478, 2188112, 4102630, 4473449, 4332451, 4299788, 434455, 5464736, 2349781, 4800943, 4828454, 7697639, 1199874, 7104871, 5215017, 2710162, 372782, 1837242, 8097956, 7683642, 3840989, 7886703, 4614107, 1663442, 5735352, 6620824, 8158491, 3557378, 3695912, 7026647, 3973571, 7707159, 7523748, 7017564, 8230503, 2903301, 1683179, 2722733, 5797940, 4694416, 5042813, 720723, 4461916, 947782, 1117287, 6737929, 3069419, 7988813, 6706592]], +[[6065439, 8098530, 5023810, 3381156, 6754733, 8094528, 2177707, 3111036, 7726676, 629546, 484643, 3088074, 8083517, 3432654, 5947760, 7464840, 2809352, 1293705, 2161515, 5167235, 7588976, 5272972, 2507932, 4740874, 6713670, 2677670, 5944836, 6280256, 3504771, 5665806, 4261247, 5346554, 6855031, 2342557, 5386712, 374061, 5834168, 4738021, 924002, 1651429, 2817473, 3775056, 8191761, 3019257, 4873383, 6864721, 6005610, 1554003, 890595, 5017759, 129837, 1797130, 6927116, 7222023, 5456406, 2989326, 5239270, 4960563, 2804667, 5558044, 8248954, 7231731, 6851615, 2736490, 4381530, 1851355, 7327469, 2633801, 1188268, 6666886, 6009233, 7138474, 5855102, 6936599, 2208617, 7506787, 6935467, 3083477, 268341, 5051249, 685554, 1631620, 5502636, 5703894, 476211, 841551, 5578983, 5496622, 267959, 5083084, 1086771, 1813620, 1877396, 3046376, 3953948, 2812225, 1752363, 6287571, 2783914, 6861632, 907280, 1692098, 712059, 5579485, 4443683, 8225659, 8094792, 6219611, 3934896, 3058583, 682062, 4094924, 4572655, 4595098, 348239, 8194569, 7069956, 1158279, 4203848, 8159248, 7301504, 1376237, 3003634, 3139321, 3393982, 7678646, 5361024, 5600871, 5115313, 6164519, 5052485, 2125740, 187821, 7855321, 6141126, 6321742, 6663527, 3085067, 7177000, 1123310, 3035694, 1060155, 7565014, 5349429, 1442616, 807345, 5422688, 1909112, 4792902, 8077562, 8068234, 3876796, 3664755, 7997599, 7742808, 1596915, 6646805, 7029787, 6356840, 4550401, 1342566, 7172620, 1281840, 3033542, 1221120, 642163, 3649099, 8000533, 3943967, 7447439, 4935652, 5839684, 4628894, 1927890, 4487704, 2170724, 5682155, 178968, 4409051, 5818012, 8198602, 3963301, 5548696, 3533619, 1479720, 7758344, 7216034, 6520999, 5008243, 426108, 7910967, 1519116, 6430637, 7696642, 3230976, 5997069, 5676833, 3780721, 3757373, 4468243, 4757017, 7609122, 4958938, 4423267, 1159821, 4754098, 1880200, 3249813, 4596375, 3205560, 1475629, 892832, 2266101, 1369551, 5856215, 5169258, 808305, 8135676, 1723528, 8242694, 7000718, 5239617, 1439637, 3866441, 1672738, 1640374, 3451118, 3979491, 2727658, 3960102, 6885664, 5084531, 3139692, 2309980, 6745314, 3779889, 4473594, 787503, 962662, 7848557, 5524131, 5105164, 1112207, 129779, 7662914, 6864707, 1046269, 3598044, 7924894, 4919929, 5504571, 7644181, 6175045, 8347723, 6810483, 2845860], +[4007120, 5423943, 4306969, 4494957, 2761168, 800537, 6538318, 897473, 5377893, 2096060, 1890988, 3770397, 2216755, 4691747, 7702645, 6363843, 2625662, 7527301, 1503125, 5164199, 5842069, 2036053, 1992862, 5119892, 841022, 8308219, 5278310, 4113988, 3996346, 7495801, 2924478, 6829166, 3053315, 6290721, 3999812, 2369223, 1006380, 648489, 3345382, 2843439, 1332072, 3127630, 6085969, 1168473, 3281009, 1579820, 4532577, 3911106, 5704565, 4311750, 4973522, 7249092, 2690177, 6076057, 7146221, 6810693, 7229874, 4067772, 7589685, 5523885, 2285367, 7505433, 3337642, 2997313, 8242998, 5172400, 917219, 3211637, 8024970, 1373899, 6398327, 8334626, 2376275, 1040964, 6855672, 2097302, 19747, 1290176, 102349, 5686201, 7291506, 5016938, 6334176, 4196839, 1014297, 1042425, 3899853, 4340175, 5817727, 1299889, 1520217, 7379288, 3902502, 6287771, 3292794, 4996075, 6704117, 3732567, 5266808, 4248435, 7865397, 4312725, 1846977, 4708806, 5750892, 2099692, 8244241, 3643726, 881312, 465703, 7355745, 6934849, 4731372, 6529701, 7866754, 2146466, 4752091, 1196952, 3864527, 3888854, 6318296, 4503032, 989019, 988975, 7964009, 6765922, 6670523, 6000973, 7367533, 3028000, 380308, 7263464, 1053469, 904372, 2771224, 7045432, 841953, 8283212, 543359, 7116833, 7788957, 3377047, 1410397, 6638640, 5930780, 2848485, 805857, 1406190, 2988106, 5204346, 3666932, 7926941, 2488280, 4985040, 2865110, 3035363, 1497202, 2817796, 1993263, 1590887, 1844254, 7001652, 4194258, 6393088, 8003079, 3852112, 1727679, 3541710, 7503319, 7555829, 4955325, 2643206, 1369803, 6691658, 4943062, 3026882, 1142921, 7661220, 1678271, 3149574, 8167950, 7623039, 4896419, 6722398, 2939096, 5729350, 3568411, 1422175, 4604617, 784613, 6608734, 4650598, 5974213, 2397461, 5545194, 5198203, 2996451, 4597343, 4153035, 6772858, 2639233, 6847483, 2664030, 8190252, 6634332, 7274845, 4795777, 5385361, 5996962, 1739905, 8319401, 6223355, 3877982, 6956879, 2427708, 6002480, 5433573, 6775158, 5207754, 7121567, 6044217, 7430943, 3353263, 5479123, 2057020, 3965090, 5103532, 9620, 7894203, 195375, 3553067, 4562964, 3521892, 2639695, 7326355, 7694597, 4188489, 4077371, 3229382, 3455191, 2777309, 1065956, 4343354, 2983455, 7148309, 4548468, 3024992, 2040118, 7211470, 1920227, 7706345, 1668559, 3029285, 4463782, 3510335, 6700969], +[6323841, 5209833, 5157296, 466039, 2749828, 6970345, 1962517, 7353185, 3694630, 3683167, 5208263, 4427881, 5780948, 5375250, 5100008, 7179708, 5070481, 3838328, 4793520, 226234, 3680194, 7823751, 4272524, 2530644, 3256965, 7689738, 2369891, 6122504, 4686244, 3569148, 8317704, 7020426, 4220274, 887330, 692608, 5378003, 8285122, 134049, 2624513, 1868211, 987881, 665778, 1815333, 5586872, 2203713, 3377406, 3404010, 7127424, 8022483, 2303055, 954376, 7697690, 6403982, 986782, 104867, 2254228, 8306009, 4319806, 6171726, 4755601, 2243642, 5767709, 2867879, 7167377, 7719897, 7484176, 1566245, 3924729, 3445057, 5308767, 4588273, 2681809, 4248141, 7167510, 860789, 828580, 5868201, 4841612, 5615046, 2241199, 68068, 2089044, 2264942, 663786, 3776796, 7030236, 7492646, 1268409, 5505005, 4935375, 1030628, 4907225, 3986279, 7918597, 264305, 2122525, 2107495, 1543964, 7223646, 2459152, 4141351, 4836274, 435860, 1306531, 4277859, 6035603, 5067301, 624480, 2331879, 4749864, 6551227, 3908396, 3851233, 919087, 6562890, 3314476, 3067031, 6914429, 5470171, 6572362, 5474978, 3727388, 6693137, 1506493, 1633673, 787017, 591648, 2557564, 2570816, 6445452, 2016023, 5199010, 8051130, 3678378, 1172422, 6755164, 1114389, 3000723, 8190855, 1841795, 1330841, 4639722, 1099629, 7637507, 2118361, 928782, 6790090, 8362917, 3103942, 2233548, 374401, 2849666, 3590394, 6351470, 8073256, 752145, 7439588, 3757919, 7696535, 5786268, 4201353, 3897052, 275547, 2911786, 6912150, 8197144, 3021691, 279320, 7192665, 1805177, 8140386, 5870875, 2156492, 4339064, 8123514, 5483203, 2694781, 6821387, 793256, 3383296, 8000491, 5694434, 2650030, 4527299, 2052913, 7457517, 7866862, 5867514, 7431849, 7973790, 3977604, 6589365, 4253888, 1628453, 1537005, 7135886, 6545013, 3739472, 4760670, 2483672, 7276474, 2652710, 76150, 964432, 1590418, 7444807, 6778848, 3767619, 4630593, 9830, 1803185, 4072069, 6194467, 1422413, 5033131, 682879, 4652767, 2402001, 7809203, 208637, 8375957, 8070047, 2260867, 1706434, 2610320, 3542000, 3597433, 2890298, 6751982, 5330380, 779100, 1675140, 1353843, 3088832, 2629579, 6467217, 7778088, 564663, 5091190, 4345288, 2792860, 7793481, 6583310, 6796384, 39045, 7562747, 5550914, 4199782, 1017567, 6255493, 4139212, 8219736, 7585519, 7835405, 6977604, 7231492], +[8154847, 7566155, 6146913, 2462188, 5971340, 1798655, 6204442, 7607641, 3936291, 1606870, 7125553, 73749, 2568183, 5390254, 7182909, 4042384, 2765143, 6809397, 4729520, 4658091, 1692613, 4815224, 857808, 1850571, 4415706, 5828583, 1510374, 4333325, 840381, 4465684, 6648950, 7710895, 6094197, 1167586, 2150385, 868522, 8090466, 3543213, 6862447, 5414557, 6745364, 7873095, 7615115, 7248369, 5926609, 3836333, 6017410, 7145166, 3554046, 2304324, 1386528, 3258835, 4181051, 963172, 5627171, 7476731, 4313342, 4743085, 4092880, 661108, 4592973, 3021186, 6417065, 5896927, 6197897, 4550478, 6995515, 3522238, 1082938, 1235805, 7622564, 6515645, 2822702, 2913189, 2553916, 306480, 2596679, 3147894, 2003502, 5242706, 2518437, 5697984, 8258205, 6636021, 259943, 6890034, 7901191, 4552161, 6291357, 3503629, 2759818, 1969485, 3098650, 4051220, 5117605, 8225404, 4357592, 6705720, 8105378, 8250338, 3223284, 1310449, 492274, 2307000, 3961233, 7363485, 5577650, 8068442, 6695612, 3403410, 6060904, 1628342, 2009841, 7466363, 913053, 5191025, 489039, 6433274, 6416666, 7516965, 1234497, 866504, 537164, 6815340, 7380410, 2381525, 3432042, 5257016, 5940752, 6773508, 4181364, 804323, 4917649, 7679849, 2532945, 1833247, 6750930, 741532, 5705471, 594678, 8020641, 6827685, 2622621, 7709457, 2623542, 7924848, 1291259, 3755298, 1469448, 7537353, 6065121, 4824131, 1883842, 2475181, 1898269, 4502642, 2190114, 6648633, 3894977, 3072148, 970904, 231839, 3682422, 3654869, 1513149, 4386838, 7302344, 683068, 1458725, 5573891, 5293368, 6804543, 1242510, 2198628, 3617190, 3267290, 7987379, 6459326, 1908387, 6613312, 2029049, 6191882, 3892387, 3698734, 6964746, 3397539, 5716224, 6282650, 5956617, 2023007, 3861456, 2267203, 1979851, 6934881, 5854970, 3931281, 392332, 1392461, 4171168, 4721159, 6239800, 7787564, 1248320, 744301, 7498446, 2866748, 5909376, 5807494, 1193609, 965605, 3452681, 2631568, 2666659, 2645873, 960192, 810012, 3076060, 3026031, 7542342, 5816586, 708606, 4670334, 238456, 3303528, 125255, 3843602, 2607509, 966211, 2899406, 4887532, 7242203, 1821906, 992231, 1025328, 4068852, 4791641, 4188290, 2755045, 573124, 1751171, 2643011, 5419168, 3374866, 5916663, 1220910, 7534329, 2150395, 3468485, 3439803, 4644089, 7920444, 3154676, 8168607, 4522101, 6287873, 5750589], +[3012424, 4406492, 2546740, 5034037, 7784928, 8376615, 4586774, 4380561, 6402916, 8140939, 6443466, 3744222, 7553967, 7410966, 2482042, 6520029, 3303186, 1286771, 2292328, 3841531, 1636778, 4411532, 5693288, 1363128, 1736141, 3222265, 8005379, 1699184, 1257265, 8043985, 8082978, 2026893, 4852547, 3005247, 1525389, 1668353, 3874912, 6022074, 3273505, 654468, 642093, 2223334, 7502337, 5380851, 657264, 4037865, 7251145, 4212111, 6679634, 1943579, 6078682, 401147, 6533959, 4141494, 7135384, 5400916, 1652938, 3389236, 3727774, 6267994, 7519709, 4834477, 553194, 4007619, 5609838, 1786393, 1638799, 5160205, 8061976, 5625006, 4825203, 1419534, 2702679, 4650093, 7300915, 4485580, 4388954, 6367834, 3923510, 6017306, 3426495, 8009268, 7308311, 2499285, 790514, 6808118, 608123, 6295758, 6423865, 4759630, 3917677, 3419702, 7178834, 823783, 1485586, 5935385, 487631, 840516, 6722655, 2117490, 6275340, 6191135, 4893139, 4155211, 5333992, 1103425, 16580, 2547910, 4129018, 2986445, 5482707, 6868553, 4824018, 7833849, 7028073, 8252119, 7757600, 1261160, 7964682, 6386172, 5694990, 6535857, 3284294, 1570198, 2622184, 1429615, 6670897, 7364735, 4015211, 731626, 764562, 216213, 1513319, 8088547, 3053229, 2434054, 1518110, 3132242, 1310597, 6880613, 7369064, 5312815, 7839808, 4085736, 6663264, 3425227, 3688897, 7327407, 4412355, 3322230, 8079276, 4380264, 2845840, 8324985, 5412228, 8049379, 6978279, 2984319, 2931, 3879882, 7421619, 4462199, 6205925, 2307212, 2433541, 734802, 7411708, 739470, 2116407, 1654059, 490509, 5584903, 2741517, 2364361, 2738670, 2975393, 700217, 6075957, 4088927, 5813673, 3436721, 4332931, 5583951, 6551375, 3912310, 2259905, 2350513, 590624, 788849, 250945, 3698979, 7470226, 5796027, 6924870, 1122159, 6904221, 5444170, 6831056, 5300518, 1184024, 3304848, 4173966, 600504, 5244215, 268278, 2338377, 1086791, 4268868, 516080, 2306418, 4563883, 2097104, 3770710, 6574383, 7667401, 5084888, 2591342, 5437156, 2099151, 7804463, 4660469, 5073141, 6907634, 4255955, 5023475, 4058249, 5825964, 8185866, 2927171, 5565488, 97410, 6596410, 7440701, 4199496, 5769811, 7438274, 4671802, 4760803, 1987269, 8044167, 3095292, 5294419, 3640742, 7029844, 4929730, 3660095, 6309054, 6442179, 6520550, 3987381, 5989950, 7984765, 4911458, 4731245, 5836420, 7253460], +[1200975, 8294972, 6178632, 667223, 6306105, 1602816, 7266288, 1198660, 1611996, 1835252, 3104937, 7478491, 119976, 2811530, 1092120, 2344890, 3262023, 781322, 6636599, 5679588, 784842, 8285318, 4904312, 5156472, 1028975, 3590408, 8003281, 7434876, 4024121, 542526, 2123272, 8055066, 4864331, 3628644, 4653774, 1510572, 740902, 1024777, 5377874, 2742709, 956080, 1897066, 5580186, 725884, 791497, 5923539, 7165898, 4891983, 3566451, 1503607, 1230301, 4660205, 6707890, 4534136, 7925405, 3352078, 7415718, 4706861, 7555575, 8178537, 252523, 6739908, 5613889, 3779526, 3558819, 6210177, 3105543, 2795679, 1045114, 7844101, 7717405, 4860246, 4793041, 5995040, 5555415, 4694463, 2600659, 4220265, 2100962, 6636830, 3496220, 6946030, 6747615, 4990114, 7783185, 8017266, 3338364, 6024643, 6525385, 401113, 2128518, 4179736, 735853, 7754507, 232607, 8353222, 5831300, 8107928, 5742849, 1089107, 1150253, 5096851, 377956, 4785616, 3480720, 1957601, 4855281, 6376587, 5810343, 6607052, 4761022, 5139937, 5234553, 5061764, 4958843, 730534, 985272, 5921641, 2114478, 723322, 1020823, 8296367, 2913968, 882051, 6279296, 855590, 1921432, 5731488, 7594353, 6785515, 2181488, 5458463, 8048273, 3979383, 6783908, 6803903, 2872969, 7984094, 2995606, 7659849, 6818495, 4447457, 1150577, 4021049, 8093162, 7616850, 8016521, 1719806, 2512302, 258798, 7380299, 2471186, 3357367, 3535392, 4491835, 4560765, 4017763, 5807016, 6429446, 1117538, 5967637, 7897423, 4662486, 6120042, 5253149, 6542425, 1675433, 5314423, 1856179, 8052899, 979398, 5240186, 3593021, 5408479, 2452698, 6569240, 5750344, 7162286, 1901408, 7610249, 8047499, 878623, 6958425, 2368784, 4640386, 2628599, 5563328, 4184264, 1182730, 1148992, 7530228, 4193800, 1686875, 6526257, 1626523, 2557530, 719981, 4143524, 98280, 5445546, 908860, 7320267, 5614781, 2680102, 4051477, 7656240, 7565619, 4577163, 2241199, 4223826, 5520324, 6266248, 6669455, 5104042, 7979000, 5687279, 5984952, 4341664, 5622583, 4165678, 5034494, 3124982, 6987063, 6611500, 1504848, 6880616, 877733, 5201510, 3786331, 6399382, 5865555, 3183897, 6227623, 1432560, 909739, 5871071, 4236552, 7544582, 1543963, 7372744, 3788089, 6125649, 7908285, 2123918, 3700116, 5922065, 1970857, 6546629, 8153448, 5679421, 662072, 2701253, 6739043, 3667053, 2115351, 4952822], +[1110207, 247437, 6926931, 759266, 179, 2872777, 1627927, 1633244, 6758329, 2523719, 5435926, 868629, 7097254, 3694812, 961799, 3632419, 2482338, 3122158, 3041753, 4798795, 6062680, 4523031, 1221940, 1569028, 6139793, 646517, 4719057, 8047080, 660144, 5017165, 4177372, 3390288, 6900732, 5231594, 3099315, 589575, 1569259, 6932308, 226200, 2528806, 3470878, 4474637, 1100913, 3311646, 5058737, 3494823, 5271311, 4468048, 4262916, 1884375, 1306141, 2847164, 1372685, 6749769, 2369220, 6198477, 4672905, 1137811, 1219967, 4151529, 5411818, 1793961, 2693006, 5257651, 5397635, 5965885, 6101327, 181089, 1512830, 7749924, 2657493, 1916973, 7707444, 1140328, 6155562, 2912351, 226138, 6541107, 6501552, 638964, 5077425, 8290197, 8326432, 2693488, 2527993, 6106005, 3159702, 3379969, 5963216, 636009, 7893901, 8270926, 3597573, 3400254, 833667, 6987033, 7141436, 2726879, 5604107, 1931341, 1532279, 1607073, 2071695, 8278730, 3031706, 8305383, 7033001, 6509108, 1137086, 587822, 3174792, 5748092, 5604087, 5574221, 7815185, 4376829, 2230471, 3470758, 5401246, 1654278, 4725924, 1514222, 6382160, 5113718, 7937878, 1580311, 2879779, 6978018, 1503597, 4234207, 4489347, 3539647, 7964368, 1790915, 5684583, 1349298, 4870522, 5486435, 2746351, 6543101, 2925633, 7387373, 8113499, 4063237, 2754031, 1461855, 7429663, 7618697, 3314698, 7611427, 1636009, 2028195, 6861402, 111020, 1449528, 7229952, 2439655, 681019, 6482518, 6089687, 6352678, 1749691, 537978, 48724, 3888754, 954122, 3014340, 4089798, 6385135, 6495002, 4007464, 1776101, 112874, 6703560, 3936519, 2713100, 5845341, 2950865, 2959950, 7575819, 5894951, 2010816, 1963700, 307910, 1401599, 533523, 2992814, 5172325, 5904526, 6899275, 3739698, 4513442, 4504301, 4274890, 5525610, 6136740, 5711774, 6970910, 6514393, 2405723, 3663240, 2819312, 5610046, 578112, 6318028, 8235168, 2818108, 3189030, 3291646, 4309501, 858403, 539869, 7644290, 5427619, 5191510, 4261061, 1912718, 3888893, 3130066, 4954991, 5716329, 4184973, 7166603, 4897517, 6289440, 4058463, 3569250, 884235, 7776646, 2577166, 5582048, 5034505, 6450335, 8354142, 413939, 5786370, 5755357, 5216239, 5164226, 6001083, 2781595, 7334875, 3783840, 4533314, 5651216, 6990931, 5827191, 602334, 2667688, 6600632, 6019790, 6179058, 6921172, 4377416, 7570949, 423032]], +[[4388288, 497144, 2983146, 1570740, 4073113, 1504059, 1003568, 5651483, 5095800, 2831436, 7119888, 4974541, 2920629, 2654728, 7179884, 6671636, 6362431, 789803, 4618871, 6684088, 8277939, 1487583, 7556318, 7699884, 5776907, 5937795, 7322064, 2894382, 4841218, 7777089, 1437842, 4935259, 2248004, 5941399, 6733840, 2352903, 7256419, 832888, 1962971, 3747072, 6363768, 1561960, 2256890, 578707, 2019367, 5741516, 2026676, 3956084, 6409717, 7146411, 4892640, 4712965, 2172806, 2934575, 7727325, 7443271, 2314514, 827320, 2240087, 2201837, 1731606, 7840791, 2278291, 7456278, 4921109, 2984550, 6012301, 6324136, 6176775, 4761686, 5434479, 7406592, 5923578, 2352329, 2081716, 7511585, 6462049, 2628954, 3626780, 1573688, 5089133, 7853394, 1017126, 6616383, 6811389, 3762499, 4321213, 8258037, 384583, 5634400, 3491937, 2630391, 591453, 1974490, 4246951, 6529752, 4881550, 3884232, 6516929, 4745055, 4206681, 5169934, 6804510, 3385123, 6481489, 8122200, 1739482, 406587, 4059056, 8165991, 2283511, 7944880, 5223218, 2537541, 5998303, 7006843, 3268667, 6202276, 5132869, 2037770, 5008874, 2432729, 6689564, 5088550, 5244148, 4012711, 4513502, 7233819, 3321544, 6591286, 448686, 3314683, 2699086, 5376627, 5533349, 3690750, 7748559, 1416287, 2399111, 1945648, 6977420, 5303151, 6167988, 6565001, 1031107, 1708121, 2408401, 5079705, 7714974, 4077452, 7824356, 7716840, 3710457, 188952, 1824516, 6831727, 139480, 4850196, 7507467, 7208788, 4142273, 907916, 8033143, 4256614, 5892773, 1961945, 5286387, 8246953, 4316592, 1185705, 455270, 6781497, 494963, 1221179, 6863836, 3042112, 3051826, 5935136, 7263756, 8104497, 2008778, 7599509, 3014968, 8121844, 2410262, 2679694, 1677585, 3523574, 6897082, 2036337, 394569, 2782900, 7169456, 3090219, 6854123, 5170978, 1059557, 8280866, 3408289, 2164135, 4456763, 6510425, 4141118, 8176954, 810380, 8158406, 6994641, 2122221, 5562599, 4397184, 4495968, 3590537, 4946971, 2034930, 5536086, 1385996, 8034252, 1619980, 4887531, 1596246, 3159985, 2624227, 2817104, 838003, 5995979, 8336089, 6047556, 6924634, 6732327, 2802547, 2371319, 2756821, 3450215, 6481992, 6170484, 8327859, 1081603, 3790908, 6227758, 7849985, 1358497, 3722530, 1109346, 7345538, 6912963, 2746798, 4417344, 6903947, 5871831, 7933057, 7657550, 3576049, 78103, 4918836, 5572644, 1430029], +[1750910, 6951273, 8232392, 7393526, 636560, 7364581, 6958310, 7378466, 6633679, 5193564, 3168714, 200963, 265328, 515516, 5254982, 3614670, 2292436, 8047878, 4096052, 3217799, 4465900, 4027920, 6407331, 2845717, 2508952, 1459636, 6550777, 2553901, 419091, 1188539, 5300457, 4013389, 1418700, 7373795, 7048944, 1132807, 2191804, 3411503, 325832, 4101088, 4858390, 3868377, 5759145, 3046463, 3926241, 7726677, 5661229, 7159769, 2615255, 337690, 1138933, 4474394, 7076269, 5278210, 2086735, 3131557, 8271983, 4237277, 4207062, 311409, 5550960, 1224347, 4117558, 950597, 5417669, 7384514, 2623227, 7259247, 4739970, 5825506, 6668690, 3292970, 3220133, 3890839, 6922670, 7419166, 2122972, 3904503, 3423359, 8356437, 2079151, 1245806, 254939, 7189517, 7126374, 5232343, 6928761, 448424, 7889648, 6201813, 5932872, 6761070, 8053705, 3329052, 7350640, 2857512, 513075, 3247585, 5201098, 5205125, 6478236, 2346887, 3471787, 2704436, 200167, 5222735, 5167112, 3468804, 7460050, 4734734, 7107221, 716666, 1163790, 6384809, 227019, 6428189, 4165678, 916629, 3463413, 1987749, 7599401, 438125, 7899608, 5638627, 1119557, 4237370, 2141109, 1350612, 5018742, 4348999, 992843, 5771306, 1361967, 1370081, 126407, 5807955, 4964482, 7467516, 1454580, 8132157, 6155283, 7124004, 624270, 5824280, 4048721, 7364402, 3711001, 6938613, 2439112, 3901012, 5417732, 6690740, 4935835, 7993677, 887046, 6953436, 4145173, 3393255, 8332615, 120143, 7944423, 7202280, 6216415, 4896072, 3377205, 4633190, 3992741, 2666755, 3738850, 616582, 7481242, 2265791, 4246091, 846419, 3091519, 5727512, 4601564, 3219023, 2665042, 7782713, 6223576, 7320769, 2673377, 6901189, 2884698, 4420420, 3044829, 6097144, 1290116, 440763, 2481254, 1085366, 1937349, 46980, 4931638, 2197994, 168396, 4609138, 3118019, 1166656, 977282, 4823643, 188352, 1217000, 3198373, 135109, 652454, 2288221, 6685141, 7761935, 6279890, 6128261, 7740931, 1446550, 143615, 1697942, 4509352, 6214681, 4559273, 4743760, 4568772, 2848212, 247661, 5649908, 5069503, 233466, 6752497, 5878304, 1103412, 4273029, 5565128, 319492, 3595728, 5742835, 3973341, 1589084, 5308989, 3731961, 5641556, 1353323, 4128893, 6683095, 5209641, 7070660, 493748, 2298416, 6047563, 2425129, 391941, 2680536, 8241086, 2745936, 8282743, 2132676, 6113173, 1527866], +[68549, 1468933, 6381093, 2184999, 7461915, 3762500, 6017944, 6263114, 6054502, 5026470, 3489242, 2290266, 948767, 8297397, 7239339, 3168740, 6301781, 4129359, 7879401, 3999213, 5540787, 8241709, 5072866, 2841696, 2183988, 902985, 3924715, 5926149, 6681924, 5825783, 1833574, 4877516, 148387, 118220, 1952290, 4984706, 5498500, 5351671, 4023111, 4957255, 709634, 5997724, 227832, 640693, 7524742, 6073279, 1435369, 3138860, 715847, 3773392, 3270528, 3446566, 7468118, 5725515, 7495194, 7460807, 225616, 7602703, 3734373, 2243470, 3667699, 7618156, 915670, 2388810, 336754, 3183048, 6731736, 5072254, 3372722, 7879870, 1767187, 6907509, 5450430, 3966274, 1866890, 6481799, 8329982, 519548, 5692812, 3211030, 1467604, 6253800, 5503980, 5982830, 4179073, 7990800, 4295551, 8250912, 3607765, 73477, 1311827, 977238, 239676, 8100081, 577083, 2360024, 5792013, 2707035, 2031027, 5593208, 2622624, 535256, 4447976, 6035836, 1723062, 8355725, 5355326, 200865, 5997835, 1884944, 4826194, 5149592, 2463189, 5853701, 1753623, 2398150, 6288718, 3586003, 2940577, 3050408, 6762530, 862058, 2899737, 4327364, 7375183, 5833873, 569948, 6702133, 4314842, 2360071, 7290293, 1908892, 543441, 5411054, 6469658, 4735636, 854645, 3381997, 5311635, 7807019, 1019160, 1365310, 3504526, 3722874, 8219202, 8055219, 6728223, 5329803, 3215479, 3579077, 246425, 356737, 4992355, 8176147, 8183096, 7992820, 3277092, 5620023, 8133065, 3970990, 6932683, 5379523, 614387, 2170200, 1147671, 3694432, 2236786, 6457150, 3684798, 2884192, 4589407, 7944361, 4590692, 956261, 3358316, 3586828, 4363068, 1710504, 7502608, 2602531, 5132769, 7453275, 7117295, 1734959, 5292059, 4766078, 3793389, 8140885, 5846209, 4690408, 5459738, 1121280, 6434759, 487204, 7478247, 5849513, 5199191, 5181923, 1839284, 1239229, 2856552, 5744499, 2881097, 3892786, 4000423, 2753744, 5145955, 2928746, 1775469, 7719021, 5141358, 1070919, 1761094, 6347761, 2811869, 4328064, 8280718, 6880716, 5617548, 855542, 2923389, 2028182, 42349, 8341736, 6062979, 2366338, 4112637, 3395662, 258109, 374495, 453344, 4763043, 2618033, 925044, 4376153, 73930, 3169161, 2865844, 4581751, 6868307, 3032531, 891082, 701598, 5526005, 4296721, 3251571, 4630245, 4084525, 4640947, 3923723, 6532392, 2397905, 1629993, 3122931, 4923232, 498035], +[1013954, 3233436, 1912641, 2522565, 8174999, 493675, 4399449, 3766932, 3809737, 1507590, 8330073, 6585932, 1911700, 5908661, 2302698, 1937726, 2263048, 6269694, 6961156, 5356016, 6862280, 4469937, 3393050, 4772966, 5031906, 6102619, 2100545, 1826658, 3614014, 3630218, 5679021, 5449786, 2428031, 7870161, 1948904, 3849415, 4575028, 6342375, 4731316, 1651071, 2917738, 651139, 206169, 133239, 2797793, 2786796, 8377905, 2965827, 3852276, 4580204, 1667067, 4766596, 8145707, 5075894, 2736882, 7387464, 2647996, 4494544, 2218930, 4375199, 2155463, 7594721, 2024665, 2224481, 3434277, 6033659, 1016134, 2232946, 1529502, 1594817, 5965829, 400898, 4092621, 3399888, 58480, 7805510, 4299595, 1709481, 4031727, 6744054, 4307843, 1553668, 4425055, 412210, 4817030, 3816602, 619205, 1053470, 878182, 1099129, 1123043, 1238183, 8365733, 7802804, 2926473, 7947354, 5728898, 6037691, 7418090, 4001492, 6461185, 5692095, 6885865, 1607588, 7570125, 506017, 1836049, 1246379, 2498637, 3426812, 6318561, 3889305, 3511277, 5217940, 6074695, 7476544, 2378357, 4028078, 3942589, 6249310, 7383987, 3307549, 1538465, 1400401, 2967319, 1634879, 1689846, 131038, 1863605, 5499496, 3006157, 932748, 2074161, 7080595, 8003388, 3215935, 5153168, 3874737, 5170783, 2238204, 6997047, 6091899, 8343249, 5488701, 397808, 1256767, 1352603, 2587664, 2060077, 465278, 1665944, 7956370, 1898969, 4364106, 7794671, 3060346, 5466773, 3573196, 6407047, 7860187, 7442171, 1329410, 6435913, 4860460, 697593, 5117436, 52177, 2964431, 7384476, 2423436, 2739580, 956611, 1214725, 7319672, 5450380, 7790833, 721179, 3841071, 1932896, 2713944, 2515587, 2560788, 3800683, 8151942, 1652547, 4300571, 5702188, 6479999, 7915551, 1564437, 2817301, 6037461, 7951831, 5777006, 1181957, 5506392, 5763434, 4800686, 5704968, 3204301, 5503790, 1384828, 6218571, 2014758, 4259621, 4761796, 6611945, 2318983, 4554697, 3810678, 7168304, 3462584, 3458490, 8299110, 5169127, 8260870, 7496389, 6578045, 4826837, 8178737, 8072823, 5623390, 2232570, 3525911, 4996764, 2928741, 3543331, 2245710, 4591456, 4334082, 7616920, 6772356, 6214777, 1489097, 3849439, 1232786, 1587687, 4558593, 8376404, 3327296, 4746468, 6458494, 251244, 7741495, 6379952, 6968511, 353484, 4180329, 8008034, 3747904, 1112714, 3439194, 1762647, 4023730, 7522344, 7958134], +[5648881, 3781786, 3517480, 5728285, 1650729, 6213397, 3656094, 5452810, 2200149, 1099769, 31270, 1894560, 5327906, 2048487, 8192367, 883697, 832879, 2837250, 223884, 4312798, 2218625, 1813087, 5872070, 6660335, 2970713, 5257118, 6949191, 1951313, 1382289, 6231699, 5710347, 3984693, 1234513, 6856681, 8010440, 7366840, 868895, 93541, 1464609, 1106158, 4349789, 353290, 7720134, 3672417, 3170447, 741700, 4831358, 6546793, 7881942, 6261297, 6593493, 4325802, 3264171, 3297808, 7440009, 3946617, 6194846, 5206975, 3454237, 773208, 5165172, 3137150, 2130511, 192649, 494753, 7482632, 1524593, 4347465, 2751033, 6479011, 6148361, 4864402, 6355813, 4005090, 3747527, 5598436, 4768672, 334170, 3137115, 7387733, 6937122, 6504560, 4813170, 4111934, 4038848, 6576662, 2054875, 6932854, 2601973, 984992, 4466337, 1773640, 6138559, 5865861, 8092369, 2455254, 3026557, 7901906, 5906429, 1632268, 6739444, 795953, 2384382, 7554215, 7769022, 7088494, 2504817, 7937202, 5648077, 1166172, 1083104, 5513913, 8211921, 2543688, 8116413, 4719702, 6649444, 8160086, 916517, 4297516, 5824953, 1069705, 3885920, 3039646, 5448725, 6103888, 3631180, 3264789, 1046670, 2873130, 6674383, 5002328, 5677500, 7016677, 4733154, 7724558, 4670630, 5322897, 3100250, 24935, 2680488, 7271714, 6107847, 2930977, 2391299, 3650750, 5127422, 1657995, 4338777, 7095139, 723428, 5202319, 6511846, 7983709, 3017155, 3946856, 3040867, 8352471, 7387387, 3629103, 2759615, 7393440, 2358844, 8191782, 1456277, 6543875, 6275693, 2427920, 2876351, 7376096, 5219847, 5143526, 4466408, 8064012, 2784469, 3539129, 2838447, 5987963, 2330338, 2798880, 8076354, 7195860, 4160379, 6176190, 3421773, 6239816, 343464, 6357642, 4687988, 6730105, 328960, 7745247, 4720406, 6930127, 1866770, 666367, 323398, 2910821, 263571, 5681164, 1554271, 4021738, 5089858, 4179337, 1937642, 1028263, 3857335, 5797292, 2245354, 7730652, 1032088, 748909, 1697606, 1415513, 18819, 7163165, 5632886, 1706799, 8217135, 566844, 1633836, 7799239, 6604838, 899047, 314425, 2451697, 8066214, 5820318, 1400877, 1655029, 1788268, 7120600, 3171645, 5438772, 2530575, 2119142, 4056569, 6977459, 2505551, 98471, 7013420, 7870721, 3112903, 91085, 902130, 1146652, 1897864, 7246455, 1880281, 357582, 8219545, 2499442, 6792958, 2005935, 5081598, 3784585], +[6128253, 7915070, 2598082, 1643279, 6376975, 4206287, 2056122, 120138, 2512862, 2897316, 4643110, 75314, 986492, 7497241, 3445832, 1299098, 943893, 3118881, 275456, 1808617, 863429, 5065896, 7295041, 4854915, 5183173, 4800806, 2581027, 4895786, 7636878, 5582083, 6426355, 4552370, 8064347, 4307036, 172146, 1926291, 3183437, 2583157, 1981112, 3636139, 971442, 1796370, 7790843, 135702, 3763407, 1277277, 3803580, 1715528, 7873011, 7015998, 5243222, 7808672, 5603992, 6107520, 8179912, 4619831, 5497215, 1010662, 1970681, 2802202, 766787, 527571, 1379360, 1143208, 5283728, 917366, 8014933, 1759527, 960233, 3763166, 4096961, 6974227, 5860053, 5339025, 2310403, 6463909, 5932724, 2191500, 2353174, 1387328, 6925553, 3021390, 4405017, 5201159, 2940328, 291307, 1210912, 7808597, 436863, 5121959, 7266786, 4799888, 7807263, 2082986, 1213569, 7310657, 2997878, 3849605, 6532198, 5042995, 7071263, 1398088, 6516888, 2378817, 3785885, 6036533, 7312211, 1238009, 3093264, 1493503, 716565, 5150916, 7337371, 5196598, 2715288, 6699467, 30902, 4136569, 3355768, 349116, 3795679, 4541644, 1067333, 3140688, 4385781, 7632915, 353336, 4395983, 6469507, 2302264, 2784608, 392989, 2102863, 4719605, 6662527, 4994209, 440529, 7016041, 433514, 1418774, 2105224, 3865879, 92803, 3937115, 762019, 5276383, 5296168, 8288056, 1083769, 2201648, 6149320, 1400986, 3634019, 6558902, 4941783, 3656972, 1238307, 6871140, 2512946, 3721684, 5843749, 524120, 848060, 6004089, 5101416, 576610, 290617, 6854404, 5806583, 4890734, 216650, 3516954, 3406903, 618771, 765218, 7500844, 4511685, 7452585, 8192609, 3328167, 2884677, 1439478, 6346323, 1997887, 3711555, 4050657, 3775598, 7185691, 2317440, 3880325, 592817, 6738999, 4180615, 5533687, 8101325, 6639241, 978824, 3863338, 1652785, 3337898, 4641320, 7314497, 1697337, 5276793, 6837750, 3688788, 3083183, 650199, 5477877, 5739888, 2360861, 842418, 4233010, 5776965, 6934508, 3281500, 3197329, 3764944, 5618065, 7878879, 8105516, 4868332, 3781972, 908211, 8004603, 5632102, 7323156, 1865565, 80203, 5985627, 2686529, 3981144, 1863459, 4397308, 1919687, 5806665, 1237169, 7033650, 4093302, 6208367, 1520480, 6024587, 4174979, 718411, 1859488, 3153337, 5738138, 2052412, 5103675, 5451372, 3340224, 6088800, 2301536, 2880489, 5756886, 7294370], +[4811026, 2543527, 523859, 952036, 6081653, 7574093, 8220092, 73168, 295029, 1353722, 2484995, 10567, 51992, 3388257, 2111470, 2186645, 105565, 3407063, 7010059, 4684642, 6938576, 1591386, 3587272, 7223976, 6023349, 7448215, 3157205, 3497083, 7261541, 3374507, 1262644, 7436014, 5332801, 684969, 4620023, 7949677, 2605237, 833277, 628161, 6655422, 4008693, 1985280, 2622001, 3617288, 2147230, 6558266, 6827074, 5644960, 2803565, 8209731, 3591817, 5139823, 139398, 5205422, 2760195, 4593220, 3632612, 4241148, 2800975, 6857396, 6384876, 5469107, 7740838, 8147235, 5312906, 1986923, 1687889, 4409056, 1664789, 6936530, 4118246, 953892, 7263138, 6041387, 6205446, 4848152, 6807239, 319761, 2185413, 600141, 6448937, 3230682, 7975858, 7065145, 1542190, 4962614, 6267289, 8111822, 538336, 23458, 3540312, 6157754, 3318792, 2206119, 3445825, 4837399, 3045613, 2543093, 7024353, 4774664, 8205629, 1172146, 3330254, 7494359, 4964695, 3483179, 2385497, 7069758, 296966, 680993, 3426095, 1062070, 7379100, 3096237, 817370, 5965020, 7406395, 3652113, 370165, 5821054, 2264370, 6959640, 7648294, 556882, 7726437, 3107257, 8169520, 3572411, 3051063, 3820034, 6831913, 5653824, 1383155, 5913899, 6280358, 7787329, 1854646, 5989040, 4869405, 5612375, 2452709, 84341, 5610719, 4960952, 7042537, 7458704, 2875010, 1024429, 1412095, 213209, 5507069, 4332023, 8278424, 6124721, 6681806, 1030779, 6003120, 4219895, 2252407, 4562541, 8149541, 3974428, 1248299, 6578176, 5108529, 1872535, 5073630, 3490444, 9404, 7332060, 1865302, 1855165, 3364203, 7124500, 4107085, 7339141, 1847817, 7562332, 3945207, 5161534, 3784020, 7709475, 3792133, 2562723, 4285367, 4048580, 7384350, 5636154, 493219, 3503220, 564250, 5933649, 4830850, 6658194, 1691293, 5027947, 3465019, 8037576, 4192178, 2189905, 6862370, 6747669, 7757641, 5508590, 4852443, 946201, 5174684, 4384642, 8025731, 2983563, 7691614, 4054211, 6793529, 2732277, 1998925, 1355297, 260495, 7455108, 3107341, 1747359, 4431630, 5424534, 6812500, 1816766, 1625193, 3683346, 6464886, 3712843, 3030033, 2856032, 8018305, 4755437, 4911969, 225283, 156811, 5569275, 3478201, 2839459, 6438380, 1808839, 4903764, 4455862, 6045039, 6936245, 3350208, 3978082, 4632385, 1824829, 4322134, 5772210, 7794457, 1470465, 3404405, 584840, 130285, 1961599]], +[[7484207, 1398862, 3230161, 6236595, 5855087, 8324820, 3582388, 2987610, 878980, 3744099, 5495501, 4295584, 1630699, 975433, 3403837, 567054, 6178913, 2635493, 182352, 1182883, 1317627, 1981981, 6217975, 318145, 278352, 3761501, 5977213, 7802388, 4605824, 404040, 6026529, 5650251, 7582537, 1898589, 4866091, 1213926, 5834115, 2121386, 897884, 4310058, 592313, 5259203, 5118194, 5520969, 7532186, 3649534, 8108429, 2632133, 1791021, 3212587, 1225674, 6238574, 812108, 2651895, 8072686, 6434983, 3541236, 5017328, 836417, 7841899, 5492124, 6574288, 7681128, 3562937, 7879632, 6346353, 4287972, 2994701, 3865600, 3304091, 5799313, 3499595, 7929033, 2564463, 8097434, 585417, 1099562, 4800743, 907428, 956029, 2543491, 4218929, 7604487, 3530826, 2011780, 5186247, 7918053, 6536848, 5249085, 5570967, 4983205, 4556045, 5039343, 2739394, 5419798, 5908096, 1345135, 5441517, 8050114, 1418837, 4626884, 4850609, 7742925, 6615924, 7317040, 6011167, 1580549, 278825, 6695698, 5580034, 3722718, 3644219, 6232399, 1910876, 131721, 4967489, 6791751, 7666156, 5294938, 5779819, 1326103, 4414195, 8209884, 777715, 6988519, 6985284, 5226578, 2682348, 8318827, 5170013, 624072, 8271021, 2712893, 7978523, 5684887, 2830664, 1123957, 5339800, 7821894, 7819124, 1599392, 963017, 4441170, 994371, 1273152, 7278833, 446368, 7885392, 2730838, 8098316, 8353277, 679567, 7426641, 509902, 4429732, 4075644, 4722133, 5149737, 2882910, 38621, 3899091, 8046371, 4697469, 4864854, 4016787, 7339346, 4348201, 5890273, 7449167, 2115155, 7787532, 78333, 4169887, 5805246, 156531, 8345100, 3769431, 2509242, 1824424, 4627997, 7550733, 2361964, 3541547, 1649216, 7811161, 250431, 3642759, 3795799, 3343568, 1791532, 3652729, 4380298, 3753806, 3926810, 1312420, 2323382, 2990996, 2078773, 7463896, 7071316, 5217026, 140741, 3516754, 5247685, 6060717, 2111695, 27063, 2777134, 4776862, 1849426, 2457884, 5803292, 3191419, 5464522, 3604752, 4082224, 6048545, 822343, 5193295, 1404464, 7580984, 4164456, 6787285, 316202, 3416965, 1237421, 1112952, 1371158, 2950656, 2015113, 5729522, 504732, 2956961, 2140070, 1942284, 5023358, 292386, 990886, 2107381, 2593502, 2534615, 2327755, 1716549, 7007086, 3989533, 7964308, 4973205, 1713189, 6842091, 786515, 6150566, 4719827, 2513031, 3593021, 5850873, 5482748], +[2877996, 4124424, 1198751, 7004319, 9754, 6985264, 5563151, 461591, 4151903, 318273, 3142549, 2101869, 6318229, 4660153, 4796887, 5002479, 4145043, 3688597, 5270624, 8110572, 3912515, 1987450, 475904, 2492428, 7070600, 3709352, 3361941, 3527147, 54723, 3527445, 7219088, 6755642, 2677862, 7594805, 2266404, 3849156, 7884279, 3070867, 4362632, 1582761, 7081804, 1312980, 500997, 7098631, 2960254, 8320016, 1592378, 6070242, 7488822, 1474864, 2643899, 7142717, 6058441, 5425626, 3143584, 5003211, 2482339, 5825915, 6885694, 6491216, 888863, 356634, 1960766, 5568046, 4223430, 2184898, 862876, 2966036, 1476832, 4240072, 1077906, 6513602, 3158485, 972240, 2526847, 5933226, 2184223, 2742163, 8009622, 3706049, 4967759, 3887322, 2122217, 4872678, 828666, 1007206, 7507097, 3415482, 3633473, 220708, 444245, 4017084, 8355373, 3753870, 3055035, 2987874, 409766, 7256420, 7057501, 7940759, 2690686, 2555288, 8241921, 2689466, 4581371, 4092655, 1808073, 5362139, 4066252, 142254, 7923596, 1221139, 8292676, 7368029, 3456454, 7328921, 5870604, 6751249, 414935, 1543175, 1171538, 3142976, 6066702, 325271, 2153610, 4750561, 7587867, 7211362, 8055239, 1730914, 1432370, 3997397, 2552338, 6745947, 2797470, 6423769, 2630307, 5358144, 1600099, 3489502, 3889650, 7740521, 7452003, 761023, 5793556, 3414934, 6602437, 3469542, 2226750, 6733361, 3183289, 2681287, 4034796, 5332033, 878464, 2835838, 3708467, 7041138, 6052732, 1182108, 1533514, 2336008, 5312662, 6519757, 2396904, 278876, 6956104, 3108921, 7225567, 6188202, 6002441, 5952684, 1329229, 5540422, 7744193, 1875019, 2001280, 6183985, 6485066, 5598816, 1946068, 6334175, 8179784, 5355482, 4538998, 3304989, 7874706, 5772949, 6706700, 3715649, 6879477, 8022587, 1491951, 7600851, 2306834, 6484219, 707645, 4306917, 3142086, 3955916, 199527, 7182617, 6439526, 6621210, 2501404, 7069402, 1511317, 5200509, 1471358, 4015139, 3666356, 2135186, 7742381, 2476913, 380661, 1383781, 8344370, 4135237, 4537328, 3457866, 5818782, 4039639, 3803276, 2958981, 4633936, 7670898, 1499387, 6673606, 4117197, 6917479, 4071318, 59441, 8371370, 7115133, 8028244, 5139268, 6950913, 205569, 7373668, 2851878, 2348800, 1506044, 2473374, 8125477, 726436, 1638471, 1561341, 4804185, 3479065, 678630, 8030068, 3963928, 2344574, 2877594, 6549948, 3040866], +[1332294, 1431905, 6583020, 4445281, 3578159, 5090392, 884824, 5451892, 1176416, 3119898, 1022452, 2512096, 4130058, 1059205, 251496, 6591216, 3980721, 415723, 5957345, 1294891, 6345505, 2596805, 7904305, 7931242, 2571402, 6618399, 2554628, 1082870, 8146583, 1782641, 1931623, 7605154, 7465876, 4440983, 4270607, 3293215, 6386138, 2184084, 2394602, 7546735, 2978572, 6657218, 5718061, 4245378, 3585896, 6820466, 2038090, 306700, 4524788, 2973327, 5456369, 132840, 6038410, 5712542, 230369, 5012177, 5378128, 4891105, 5814072, 7164391, 1340347, 2987256, 1576420, 3945810, 1421929, 5635544, 7228704, 6667267, 3541133, 2931264, 280305, 6185265, 6292095, 7063421, 55808, 5576887, 265508, 8332387, 6599337, 6289587, 1491900, 4330973, 1063976, 282164, 1555035, 7231885, 6244819, 5702463, 4018324, 3343603, 531787, 2584725, 5520646, 426359, 6220922, 8341337, 2958022, 7166271, 283265, 3649084, 3745942, 5533797, 7217096, 1889512, 4432744, 918297, 633676, 7160965, 5577127, 4084535, 6818226, 3176622, 2348590, 6695795, 7907577, 1976928, 5282974, 6432613, 5043994, 1553265, 2692934, 327159, 3649826, 3379284, 4555753, 2156975, 3856993, 4700880, 4964085, 6963602, 1521740, 4764558, 2187255, 7586448, 5284316, 6682397, 5887195, 7648885, 6917702, 7349628, 8230586, 297712, 533435, 3933697, 6566398, 2154850, 8117744, 1865317, 5517779, 6482795, 4119335, 6480799, 7265454, 2560307, 4370374, 8046636, 7166055, 6077238, 7833474, 7718756, 4913452, 1894873, 2824449, 7545217, 1805908, 6548972, 5462165, 2429162, 7679812, 6946691, 1833962, 606919, 4215456, 2721033, 4491799, 5705027, 5658636, 2393764, 1467734, 79343, 2163936, 7489916, 6313348, 6955507, 4059353, 2194415, 8141719, 3742259, 1455297, 3717120, 6872234, 4883661, 5700475, 3002092, 3695588, 2651519, 770245, 4081512, 7250887, 293878, 895721, 945158, 6729347, 7855167, 4716394, 7881865, 8261158, 2270059, 5472597, 433292, 7643946, 4566741, 8104685, 8285640, 2543629, 3987008, 211691, 4193827, 6401168, 6244893, 8352337, 3028498, 6907330, 3151958, 7017104, 6486576, 209986, 3838610, 3440694, 5071909, 1731300, 3572011, 8213370, 6502601, 7684204, 273794, 1483125, 3316948, 6494624, 6371712, 8076921, 3001774, 5767612, 2810732, 8007981, 3067462, 3881865, 1964512, 2324657, 5683830, 911383, 2774338, 7041162, 6016112, 5488486, 3811906], +[7265270, 4634067, 6250786, 2524054, 6384266, 2802831, 4889491, 6532268, 2792783, 6546221, 3467516, 5768646, 6249036, 2363514, 5234784, 7244796, 5654292, 7691109, 3195777, 6203918, 4759157, 6429929, 1395667, 8350366, 6819675, 533977, 7609630, 1366958, 3794326, 2802526, 2807249, 4588340, 3958086, 1923206, 3982390, 1714889, 2381393, 3716510, 4560259, 7154489, 6404120, 2536620, 228135, 3547727, 7084963, 1832254, 2975548, 3743838, 5783634, 4203353, 4654283, 7636373, 4142420, 421285, 383645, 313612, 7172355, 6058592, 4389846, 4864869, 6367300, 2859845, 6908472, 3278018, 5994591, 5679912, 5659444, 568562, 8156651, 4168252, 8102567, 7484767, 5506082, 1345818, 7979888, 54441, 4523085, 2684838, 6708566, 3804048, 7901003, 4817162, 7740258, 6976533, 2453655, 2643600, 1051174, 6283829, 6976661, 6267874, 1004129, 4455265, 6985890, 6813555, 3957163, 4675037, 6560910, 2130707, 7939605, 1078726, 3886, 7819311, 1188382, 5505051, 3288712, 2176973, 1932854, 2402391, 6523184, 4330352, 6489598, 7346659, 118983, 3481388, 4228051, 4774911, 3031121, 6983129, 1722490, 4840118, 3655661, 4993731, 2356401, 6417051, 5000334, 2120005, 6275218, 2408072, 236114, 2518313, 8017520, 2371461, 6695011, 3662735, 2021718, 8122943, 4145453, 6873269, 2250544, 1993275, 2126658, 1706834, 7266911, 2235057, 932682, 2600429, 1434018, 7528685, 7823248, 943883, 8016206, 7500018, 5874570, 3513683, 7510666, 1674179, 704355, 5146378, 1633470, 3371650, 2788195, 7538775, 2502432, 1371893, 482977, 5181607, 5185165, 4206654, 3913603, 1958739, 8132496, 321943, 7662774, 1807112, 5736899, 390841, 4293434, 1861152, 1509708, 4684561, 5947058, 2240089, 45839, 7610075, 4561912, 3683030, 4275915, 1970359, 8260606, 85804, 8062366, 1847917, 2412330, 877897, 3008764, 4577642, 1005689, 7322501, 7826265, 7469509, 4662849, 4989945, 8016270, 3098903, 3244186, 1650960, 1396886, 6976436, 355995, 6364497, 367517, 2539474, 1002502, 350022, 4639391, 5787651, 4423980, 5311845, 7055269, 1438164, 7624894, 4795378, 1522004, 1171912, 3329714, 2755679, 2618705, 6809795, 4879321, 670061, 4933027, 3310811, 321465, 6137756, 3613010, 1127913, 496769, 8063181, 7159849, 6265544, 6799870, 1795581, 4869113, 3001644, 8090942, 678836, 5460105, 6894469, 6965185, 2383060, 2953086, 6090371, 3625443, 4668028, 5969818, 1742173], +[6892481, 5688825, 6408196, 6053802, 6888138, 5752874, 5091096, 6608290, 1333452, 3648184, 5767894, 4715836, 7108134, 1834216, 7743815, 6143360, 793608, 5524615, 4546628, 3046169, 1739769, 5245132, 6547813, 6820778, 7478310, 4415716, 1896850, 1341790, 7600673, 1044159, 6591195, 792179, 1027538, 1955082, 1849376, 396093, 7059280, 3866917, 2854651, 2281945, 1629317, 17372, 1550266, 2361983, 5225620, 6385609, 7534129, 4027952, 5305941, 8331529, 6981043, 2718245, 972460, 3804836, 2388676, 5180308, 6239950, 4144115, 222874, 32999, 6120759, 1264301, 1190914, 4955489, 2929740, 1677540, 3800173, 5797709, 7329819, 4182640, 4463307, 5412392, 6135130, 4631608, 1231335, 67938, 6961783, 4003520, 7948146, 1356864, 3400550, 4437243, 7489668, 4138868, 4510315, 4908919, 1325525, 1464288, 8287356, 7682976, 3162050, 8357323, 2341254, 5680266, 2371993, 7474532, 6855298, 904910, 2869944, 36775, 996194, 1069682, 3113290, 6899662, 496836, 5081132, 6871386, 7847766, 5055044, 4995816, 7103152, 1903773, 7332664, 549637, 7866981, 3814771, 5214528, 1941670, 83015, 8046463, 8080239, 4517507, 4920554, 1234036, 3470737, 4299252, 6089733, 2323130, 153798, 579035, 4232594, 1410715, 7789418, 7597450, 7471978, 1093754, 632816, 7561661, 1592964, 2249967, 5066137, 3945095, 1958855, 8351384, 934439, 3314682, 5836350, 5017833, 6679528, 5320586, 6825376, 8340941, 3466296, 2362265, 6787107, 4807170, 4333957, 1394245, 3599035, 4768545, 1575915, 6437081, 7040097, 55247, 1654745, 1390792, 7201639, 2418910, 5186367, 7332502, 4387306, 6839560, 543808, 5894877, 2483726, 7219110, 7935831, 1139525, 6992558, 846376, 5859530, 6317565, 7942679, 37947, 5183688, 1592401, 6529717, 4035494, 8108698, 4684617, 6844543, 3158350, 5395608, 6636334, 1662557, 746988, 1376241, 3236495, 5008172, 4505726, 3259166, 6684669, 942470, 331687, 3749291, 5126514, 5820265, 8159827, 126021, 6809820, 3343410, 5159888, 3598046, 501519, 5921345, 5314976, 1058325, 7434392, 3877895, 588078, 674273, 7305442, 3188365, 7685511, 5559671, 4192277, 861624, 7536334, 2319533, 3728647, 7756385, 8364501, 6598826, 1534742, 163375, 342504, 1646182, 767209, 7034769, 3821040, 4885333, 5246133, 3588668, 3401465, 417621, 6967607, 4812638, 3425124, 605222, 3003235, 5222469, 4520441, 4659020, 2592686, 7675923, 4624315], +[4189740, 5020560, 532067, 3830956, 3826880, 431460, 666573, 3263671, 5580150, 3275760, 5874585, 4959570, 1748071, 5176862, 1881136, 6465617, 691141, 2891199, 1100770, 8261023, 4113747, 3617881, 2975674, 7685858, 4041173, 1449957, 5553501, 4773514, 3810312, 3957007, 7853804, 3006438, 203971, 8113036, 4739447, 4336414, 2169449, 4501124, 424473, 781311, 7012922, 6565664, 8207031, 911624, 2316314, 1673663, 117393, 465249, 5395315, 2520947, 5119540, 8014618, 6861865, 1031718, 681877, 454634, 4121090, 4254389, 4620463, 883283, 3562913, 4115613, 5796672, 3179571, 7351785, 6654764, 4338181, 5416077, 3156093, 2808821, 4345210, 1283437, 7891884, 1125541, 2045285, 2075229, 1387447, 2007199, 7006868, 6657652, 7140287, 3205808, 8158172, 6508025, 8377681, 4862900, 1731077, 101048, 1465923, 847195, 6012757, 763714, 6294017, 3739163, 4307627, 706993, 981201, 8355418, 7260845, 2564600, 2166057, 4731318, 8189949, 4253209, 7924705, 7636080, 4365555, 772888, 1768142, 1306685, 7521374, 3213880, 2012313, 6641607, 6602243, 2760716, 5932003, 6531755, 6530631, 6410078, 5981003, 2578512, 7649702, 6414865, 4233752, 6116349, 1917413, 1478043, 8003833, 3265784, 1521867, 3984151, 389497, 2942633, 2792220, 3084710, 6454102, 6570969, 4802088, 5191150, 802476, 2588110, 5082202, 8252585, 7194656, 7888857, 7088224, 7126635, 7254545, 1107774, 5916083, 1094568, 1312316, 6718825, 7375921, 4613162, 7896364, 3346862, 6821061, 259908, 7109047, 4855916, 5786122, 4583498, 7768313, 4133565, 6996650, 1853155, 1863196, 5516844, 906200, 4477562, 6322379, 3956106, 6863253, 6383739, 7788789, 7908501, 714241, 8207061, 4733014, 437107, 8119278, 4488504, 5822922, 7767337, 5964811, 3773354, 747621, 2751000, 1831426, 2652748, 7277669, 4223765, 5506370, 5752223, 7270315, 7466047, 511634, 3237018, 7748887, 1268046, 3211163, 7700460, 762594, 5349376, 5317352, 5256109, 3452792, 4737441, 463937, 2840918, 5960491, 281990, 2809923, 5789978, 120369, 3752813, 2357812, 7567491, 3929786, 3282410, 1705967, 3403927, 672563, 2782935, 2302183, 5357036, 5538409, 8353718, 1317636, 7952312, 4629337, 4262269, 8192576, 4293275, 4646192, 1242987, 5504492, 6146023, 2349451, 6652976, 543701, 7479620, 5436338, 4190154, 3600015, 5926659, 3954491, 5714014, 3699285, 1770495, 7958478, 5087283, 1891295, 3569946], +[2064287, 7538397, 1701410, 6692398, 3431600, 5966918, 1719034, 2860070, 7963510, 8158351, 5253319, 566275, 2866288, 1676583, 1237647, 1522936, 7931959, 3295878, 7864774, 7501524, 1044599, 2132524, 4810773, 2340734, 679501, 1481389, 3545268, 2973722, 7366213, 2698372, 3459652, 3709749, 7456968, 5715018, 6636305, 3729062, 2833227, 5879416, 5406117, 781615, 175863, 3865580, 758176, 7744206, 1914882, 3120618, 2651096, 4603140, 7295198, 3506041, 8027845, 6210098, 1990501, 481437, 738205, 7897895, 6898338, 3479403, 6065228, 1841662, 4888726, 5598386, 4785758, 6837766, 2940975, 5510652, 5643773, 136423, 1407522, 6755845, 7179057, 2688261, 5710611, 590548, 4470456, 7024065, 4153270, 4541349, 1255524, 1645470, 2763645, 5237491, 4706300, 4660171, 6594112, 6630581, 2713007, 2041515, 1356921, 4779328, 4645766, 4886815, 2588029, 8021517, 6658728, 547034, 6488812, 695550, 7160167, 5918762, 2473293, 2593517, 8295315, 4903675, 6734028, 3719147, 6278945, 7178693, 5185274, 4658151, 6935036, 5215940, 7608510, 4824835, 8273998, 1182395, 1045103, 2682146, 4546469, 4300336, 4286538, 4879969, 5527623, 7244471, 7970328, 8244494, 3035012, 5959435, 406435, 7789343, 2657498, 4989012, 4216523, 1517667, 1305321, 2069601, 4984735, 2441342, 7585824, 808842, 5170240, 3292273, 8316001, 7809544, 2347137, 3664902, 6421568, 159731, 7118092, 6828866, 5760482, 7265976, 4698602, 3411936, 630024, 6698406, 3395223, 5958735, 6984905, 3132440, 5621114, 3995504, 665568, 860449, 6580675, 3448746, 2229821, 7529207, 2649775, 1186071, 6234692, 7451976, 5762821, 94247, 7157366, 2833082, 956459, 4569649, 7715883, 8347776, 3006275, 7370970, 3734708, 1919084, 1977095, 7337386, 3680085, 5355607, 3207798, 3311878, 5514375, 584253, 2992778, 8006776, 3190562, 2915892, 3330467, 4622787, 1403118, 1990601, 4541749, 1470908, 2429084, 8328944, 3586219, 4686514, 395647, 5842073, 7234799, 2799072, 8083849, 5322562, 6654064, 1847701, 3797747, 18947, 7948329, 4491608, 8137493, 1173344, 2517742, 7933058, 4604314, 721883, 8211781, 5384837, 5009467, 3658001, 426518, 1734177, 7951028, 3635905, 1247086, 3633795, 5283865, 6420083, 3145285, 7214906, 2035587, 5784531, 3303010, 6178688, 4631632, 6579312, 4227601, 4462950, 3101417, 2149614, 3336063, 2110448, 5784497, 1220553, 4096902, 1750082, 3145805, 3217584]], +[[5683391, 3710350, 92719, 1308362, 7290103, 3944071, 753228, 2477620, 5628327, 2844743, 646481, 1331593, 1103650, 3107746, 7647179, 4318608, 7294668, 2756838, 4884808, 8285339, 1269566, 1770852, 6974741, 7195195, 1683878, 104725, 7371601, 2657716, 4117127, 3054077, 230785, 1503264, 6762082, 7512641, 5998732, 3430376, 1376117, 5125504, 4495264, 4616177, 8234425, 5948466, 7945236, 2826866, 1747539, 5382666, 8271396, 2763986, 1798221, 5617535, 4514790, 3912812, 910278, 4430894, 4472792, 920498, 7831594, 3391036, 8159560, 4482961, 5644483, 3970881, 8317951, 3361483, 4832442, 5727054, 7668045, 6812533, 6952711, 746664, 5874158, 239779, 1366675, 3864332, 1890651, 1171664, 3421772, 6882534, 333444, 4431937, 3877383, 3518335, 3967629, 2426444, 3732139, 2315628, 2950494, 3869759, 966542, 6758356, 5071254, 7497892, 3562349, 2725540, 2100949, 4875092, 7950602, 7973212, 1293637, 7783907, 8184304, 6914214, 6956953, 678440, 3964167, 5019123, 2953816, 33134, 7103616, 4771436, 374294, 4967828, 2195906, 8286830, 1905910, 417751, 7106533, 6082346, 1943376, 1115236, 2587573, 2862562, 6824032, 3597436, 5275150, 7812016, 6019254, 5462659, 3384997, 5497100, 4397929, 687520, 6166316, 2144845, 2358303, 6942245, 8138531, 815541, 7603570, 5018190, 7009997, 710061, 1576455, 212713, 7094710, 2670726, 1384932, 2476995, 3000927, 627627, 2155112, 7340356, 1188666, 4001321, 764087, 7106602, 6550930, 5399850, 3375346, 3708768, 8144182, 4709848, 7340111, 6745872, 2635217, 1414146, 8165502, 3657014, 2963298, 6118933, 2423496, 1794421, 3722883, 2062261, 4583571, 6265227, 1970404, 8088295, 8002594, 8368139, 6288791, 7387656, 5171444, 7477085, 6576009, 5466034, 2704096, 8268019, 1925743, 174523, 2530070, 2560462, 518848, 5671761, 6596698, 5486552, 584502, 2382640, 7166679, 3495914, 4669506, 132828, 706321, 34309, 2170945, 1739874, 4124945, 8312651, 123306, 2794030, 5326396, 1432097, 3395293, 74078, 4861039, 6015628, 6213190, 4649215, 1570113, 5446964, 3260667, 7749376, 6487671, 3664254, 2236782, 7021557, 696484, 7911555, 1086990, 3198664, 17850, 3683312, 3288003, 4217996, 555822, 4614956, 6176937, 6459481, 7876317, 4893512, 7383955, 7940986, 1675795, 7770017, 4412811, 7626775, 7813763, 4350655, 2087956, 2026481, 5154897, 3610764, 6676835, 331133, 3184716, 637448], +[3845441, 5948345, 2526079, 3527655, 8340658, 3871182, 5148928, 5273305, 4432905, 1891173, 5260826, 6465732, 4540806, 2818528, 4544029, 4430633, 3482639, 2702517, 5146042, 6419635, 1109684, 2372543, 8311838, 2085052, 3507878, 26762, 7716435, 8042736, 2138382, 7979425, 76163, 4807471, 3606062, 7946765, 330929, 734329, 4104102, 1808857, 477449, 8163261, 6971057, 7843251, 4927691, 6677920, 7665717, 3750609, 4701258, 3058870, 1251659, 6129335, 3556202, 1283857, 7630073, 1124997, 3130214, 1734737, 6007745, 4348698, 1397023, 7082059, 1163772, 6078529, 3517091, 4020385, 897223, 3798751, 7959469, 5063932, 1267106, 52148, 5430708, 2714705, 2666072, 4875376, 1226832, 6721928, 5063888, 6380967, 933788, 2481579, 2263113, 7780343, 2048034, 987223, 2698835, 4314650, 4962142, 1974605, 4487825, 898178, 7427615, 2636860, 2146730, 384510, 5570125, 4600025, 2744349, 970545, 341361, 4100257, 2926654, 6861050, 4939857, 5174127, 2490985, 4322473, 6611647, 6683729, 4435760, 3273613, 4556997, 904654, 536191, 1109818, 6632377, 767075, 5487421, 1211712, 3135240, 4474932, 7124961, 2680467, 6172472, 637392, 1445508, 1741521, 1569219, 3534604, 7302355, 6016112, 545828, 4227739, 5696466, 5642100, 6919350, 8144659, 1677477, 5773615, 874454, 1757969, 5750019, 1593476, 6362379, 1713607, 2706621, 3233779, 6479540, 892299, 4636373, 6377149, 5664978, 13120, 8281728, 5159402, 5696454, 5605574, 4653622, 1817441, 171885, 4374113, 3492702, 4162724, 7346068, 4733212, 2311547, 2477432, 6274796, 5416878, 1617111, 222937, 725686, 7257772, 6728147, 6471494, 763061, 719071, 6524550, 5519922, 971694, 2743166, 1508664, 3216851, 1060612, 6929127, 574077, 3871271, 3989461, 1099586, 4101828, 2818783, 4684972, 4972365, 2089600, 43683, 4556841, 7602949, 3615224, 3810031, 3427704, 1895016, 3547470, 3704258, 7424605, 6413426, 3248473, 2785536, 1654293, 3783061, 3425238, 3710350, 7102589, 7479478, 822457, 5167322, 6826453, 87829, 5699697, 2120761, 6801762, 7653895, 4940055, 7463717, 6572931, 7651737, 1239232, 3285823, 5308731, 6587411, 635269, 8068897, 7814186, 7007527, 6594288, 4494652, 4786689, 6077348, 4353010, 3982747, 2629676, 6452340, 2511502, 5592118, 7629882, 7821505, 4997854, 4071122, 177996, 6561917, 3801074, 10598, 6352643, 3098145, 4116065, 1527167, 7537296, 1578787], +[3891096, 6185093, 4971478, 4257325, 1020462, 675281, 134694, 4822802, 5810277, 3955271, 1491528, 3794827, 253530, 6428696, 4818163, 2884145, 2903266, 298298, 4603064, 8160714, 5792499, 865799, 1619577, 533766, 6972000, 6098559, 2326570, 969769, 6130060, 4397918, 6968167, 3637012, 7283379, 6301530, 6195231, 7955036, 6469135, 4020548, 7853350, 7961177, 3028661, 5220419, 6277568, 4695048, 4029424, 8010317, 4689206, 7720318, 4002318, 1113351, 2234670, 7906967, 439390, 5063227, 7370501, 7895781, 4524, 795561, 3628925, 4723394, 5398137, 4562159, 807714, 5878753, 4272113, 1357717, 825704, 5887330, 4319744, 4196390, 6727146, 7306212, 7203743, 2697266, 4687508, 4697954, 2530266, 3688268, 7307078, 2964441, 3293843, 5911467, 8214149, 5127001, 671444, 6351888, 6998433, 3710780, 643318, 5062735, 8069513, 7433864, 1807428, 5642159, 2721109, 2096781, 5836671, 1518576, 5844253, 2863227, 2592012, 479290, 549486, 433947, 5491622, 2252945, 3090577, 4722684, 7096096, 5137542, 6307772, 5188696, 4497272, 7105336, 1756597, 5072162, 3158415, 4870493, 107132, 5609711, 1827485, 1840804, 3017463, 7261892, 5897131, 3893754, 2336067, 3534738, 3862427, 1668761, 2059021, 1408013, 2645537, 6802499, 7345627, 6877105, 4304158, 1135307, 3684153, 6344078, 5869579, 5248261, 6501, 4693562, 4705703, 41217, 7487942, 77835, 1222738, 2992465, 322889, 3158864, 6610809, 4150224, 1441527, 2152252, 7620592, 7839794, 7057093, 7546652, 3054583, 1998065, 5085277, 2923084, 5624592, 6130206, 3219899, 2027486, 7892198, 7381486, 5754551, 7300624, 4279935, 3771460, 2850110, 1323702, 3628136, 7404930, 5343431, 6826326, 7577609, 119856, 2490216, 3433424, 8281375, 7149694, 7470393, 7906970, 5758272, 1139062, 5235439, 5968308, 434025, 6653678, 8324197, 3846059, 3352235, 2432978, 461841, 718037, 1241021, 6979115, 218058, 3620647, 5247186, 1630029, 1422383, 405956, 4371450, 1083953, 3691402, 7412225, 2952833, 1155508, 4630029, 6642268, 2222359, 3074423, 4496171, 722030, 1933910, 7783306, 5363795, 4241947, 4478330, 6369040, 2701766, 2893780, 1619372, 6732951, 384933, 587101, 376500, 7168867, 4352422, 7298991, 5641566, 3365784, 7788116, 280828, 3611013, 127448, 6495127, 3602655, 4039854, 7342936, 6614505, 4220213, 2049870, 1984412, 1135319, 1485097, 1820592, 1367085, 5005544, 5806867], +[5490328, 6103382, 7375552, 1282221, 3029624, 3110897, 151679, 1735155, 5636900, 8126990, 1822332, 320718, 5264538, 6595771, 7535240, 1176690, 4927375, 5026013, 3009081, 6115026, 4933795, 3745120, 6615052, 4593525, 514722, 4739787, 5181504, 8049019, 4876778, 680977, 7823729, 7102549, 1731093, 2650587, 7288671, 7007274, 2329313, 5913831, 2625239, 1421543, 4096507, 5287827, 7741390, 4467290, 4934718, 5941948, 753373, 1958841, 6845215, 5533006, 5176679, 339157, 5901403, 4314943, 2052431, 4561751, 8256012, 311349, 8016485, 4340808, 5194472, 3475832, 5959032, 7415319, 7054535, 5058689, 5662985, 4728338, 1899776, 2812415, 7321986, 706825, 5980822, 8303324, 2917536, 7593600, 634645, 190380, 3762069, 3640030, 1337266, 2747661, 2134756, 6449709, 2186332, 8114154, 4930325, 1403549, 7856665, 6036945, 2567732, 557921, 6034843, 7263045, 2796676, 5289811, 2167016, 4190744, 2692845, 5648414, 3505129, 1677213, 3177843, 4018468, 6093027, 5311844, 7524766, 6330320, 4846043, 6672832, 6410792, 1134778, 1435678, 6954372, 8332817, 5592628, 6524481, 6584781, 2969407, 6682130, 7722806, 2292745, 6806724, 7580684, 1286847, 2361421, 4195108, 1821989, 2594429, 3725881, 8082694, 3927265, 6173582, 7435094, 7974320, 2663486, 7826202, 174879, 1787137, 7009547, 4990512, 5055362, 3292997, 7550092, 6894673, 2323713, 7943700, 5251060, 6784237, 6975398, 2847573, 631158, 2767586, 7384238, 3609378, 6410445, 7439884, 8325182, 5570429, 1838353, 6650691, 1047299, 3756663, 1947278, 367966, 1371153, 1193339, 3048657, 7415152, 8245192, 7239919, 5509247, 3838864, 7020648, 4552428, 7039101, 6660695, 8364395, 7548446, 1795311, 2262848, 7388484, 968001, 7165526, 6934633, 3201576, 3398382, 4326142, 4988619, 58103, 8206263, 7471474, 5800029, 4648766, 7643818, 2706946, 7690640, 4191529, 1932311, 7548429, 1618612, 3822340, 5674483, 398672, 2183801, 1417526, 7678333, 509238, 8288451, 3993762, 7699208, 4897923, 4062488, 5912152, 7263613, 2633162, 876336, 1318836, 7965983, 2964620, 3043715, 6108188, 712841, 4418616, 5403849, 2627894, 2517626, 5918639, 4777756, 150791, 81461, 6759800, 2272791, 3839455, 5446312, 6664687, 7620308, 2740215, 2187833, 6951716, 3506031, 4437310, 3800782, 5251191, 7359081, 5375135, 3263448, 1005779, 8174544, 1089636, 1270856, 6781891, 4956628, 6664988, 7957389, 5791918], +[1960391, 6492981, 2680159, 5794776, 2695689, 2994834, 4319039, 2802253, 5456051, 5880760, 380440, 994922, 1273115, 973634, 1330084, 551564, 4507054, 2810921, 583228, 2882919, 917977, 245061, 2491996, 3112425, 3368498, 1925914, 5961626, 6760898, 1678195, 1608615, 3952754, 2755186, 7601800, 950361, 3833227, 7413328, 3301678, 5924922, 6817243, 1431720, 91360, 2995101, 4507620, 2729246, 3477020, 4551907, 817811, 3127024, 2405339, 4054149, 5605307, 5248727, 6087820, 5749850, 7714642, 6728393, 3591532, 577585, 6473552, 7522817, 1392819, 6880935, 5312690, 506945, 8091145, 742929, 6799260, 2652586, 7452729, 4541860, 3381481, 3061014, 3376644, 5481519, 5731437, 1932141, 3621310, 5147332, 806862, 7357747, 4986069, 4576253, 5069876, 2652690, 8064760, 3839600, 4424535, 780086, 4691504, 1699483, 5974470, 8020211, 1201612, 809656, 4464587, 7252763, 6052120, 6076335, 3083068, 3168047, 4957750, 3478661, 835216, 584933, 4127478, 4942548, 2728615, 1054891, 4836533, 3177007, 2577866, 8073339, 3264847, 6210100, 1043897, 6918130, 2532474, 6341590, 413784, 6546039, 900589, 4908413, 3854232, 1298302, 8293745, 6435805, 5588713, 8162310, 5733943, 564722, 2568541, 5535776, 1334324, 1698880, 506678, 7038492, 6452016, 3572627, 148130, 3717450, 6821979, 2914494, 3924012, 1545574, 8276309, 2424409, 4448223, 7133022, 869513, 5849107, 8117963, 3771355, 8324513, 562863, 8346779, 7642036, 7777906, 6411315, 4438572, 2928891, 4155741, 5247557, 948670, 5148880, 2836540, 6068476, 2790331, 3860362, 6130088, 3493728, 318684, 1574949, 6425420, 6630654, 3591850, 5439494, 6254389, 5600976, 2534116, 4057493, 3751239, 4348479, 6989249, 2345693, 654691, 3403550, 691586, 1979429, 8064223, 4606604, 739758, 548107, 5179586, 2730203, 7257148, 2610058, 365507, 1384500, 1967234, 1705797, 6700681, 7225578, 7389586, 6165942, 922604, 5114800, 7891846, 1154582, 3049978, 3867059, 6029908, 4114632, 3496583, 6250390, 697990, 5041106, 4313626, 3439979, 4213705, 3476530, 7441723, 4038065, 5458545, 6069422, 5275723, 538502, 8104834, 1741116, 5251792, 1927295, 1078520, 2405168, 3132377, 6658912, 2024428, 135843, 894294, 978881, 156397, 5845025, 903581, 7596297, 5894171, 741065, 1568180, 1979423, 4668001, 5184514, 7454511, 6928227, 2360543, 2878160, 3997382, 7975802, 2949452, 5117284], +[24448, 911491, 7427273, 3055044, 6727997, 1380282, 1024871, 7315650, 1758021, 5081711, 3522078, 3823749, 641736, 4837778, 247446, 6899785, 7829133, 4293145, 5196979, 7771104, 7351477, 1468067, 3457945, 7194757, 7472864, 7116529, 1379297, 7875722, 4722927, 8125863, 2373250, 4752283, 7397445, 3101527, 8218504, 1096673, 2314375, 3296859, 7363912, 1815690, 2998871, 1200499, 8260569, 634424, 8258449, 6894614, 8285099, 141189, 1949477, 8040110, 1786560, 7358607, 5017383, 5295747, 5585198, 4398961, 3653257, 4645692, 6961420, 7294531, 5967803, 1051854, 2995747, 5678452, 7377075, 1447653, 6063890, 1270842, 3865195, 4744815, 7998826, 1064391, 3606436, 966076, 724279, 8196623, 985045, 3944293, 3044492, 7283955, 988148, 681120, 434246, 345234, 5945994, 3692422, 7323481, 3316639, 4844627, 5288159, 559594, 2447028, 1454464, 1765968, 3869036, 2189817, 407292, 8179694, 5477854, 227526, 925453, 7975518, 824609, 5699764, 7844466, 2053154, 3982992, 1350080, 4486299, 1319191, 3664229, 6996815, 7497336, 659671, 5732007, 6343583, 4360474, 4174342, 8106737, 7085598, 7445358, 4795540, 6007096, 7363100, 7571393, 2467383, 3261958, 750473, 2092204, 4523560, 5954472, 7733481, 767316, 1731503, 4690616, 7602015, 8267516, 173659, 6240898, 4452819, 948704, 1582705, 3485660, 5320108, 3364478, 5560344, 1652741, 805836, 2119977, 856448, 3545859, 6269842, 977818, 5482292, 8286115, 5928481, 5545946, 945323, 8064057, 5062629, 8101232, 2361444, 1342352, 5074037, 6451710, 3642825, 967000, 3068060, 5679383, 4875558, 1902169, 7646938, 7956660, 3764508, 7530686, 1489544, 4359946, 3577810, 2163531, 3112585, 6344303, 7437705, 3104641, 2903089, 7703074, 1986921, 6498273, 650936, 7190182, 4977232, 3735528, 1191251, 1268285, 3421582, 7161511, 1539658, 2827847, 5057412, 4975728, 5574462, 6753096, 5757133, 2298886, 7952150, 1147000, 172458, 7337009, 1366819, 1902206, 3817146, 3153154, 6804049, 7253881, 2060635, 1315198, 1301267, 1231714, 1867468, 184067, 3629133, 1075220, 8184728, 7934963, 6465061, 6187164, 3396129, 549001, 3820231, 7577133, 332606, 7740569, 6964709, 517732, 4604688, 5573216, 521069, 7563427, 4203692, 1143995, 1523296, 6740048, 6728098, 1281990, 1608403, 856636, 1488357, 2426433, 7966635, 8157559, 5277437, 4963441, 2998979, 151003, 5975265, 2337800, 4791086], +[853006, 3965114, 5798521, 2355536, 473987, 2094950, 1746940, 3439199, 2184668, 1528327, 2814729, 7208660, 739852, 2295255, 1239273, 770499, 1130010, 7149225, 965208, 2409132, 5887529, 4581272, 7786968, 6556903, 6112103, 5435067, 1716408, 2924294, 2646088, 3190283, 3499688, 1778366, 7772718, 4874214, 2787961, 457558, 254830, 942496, 767122, 5419708, 2192423, 7273882, 7413199, 3336916, 233451, 2108313, 5041745, 3389504, 6217239, 1702498, 4738958, 300807, 3472322, 3902738, 5011384, 3733792, 5222317, 6948108, 1111755, 6517087, 2914158, 7000117, 4428692, 4450110, 5443175, 877295, 3646490, 543826, 3563968, 5868858, 1436491, 3674677, 6746738, 6136970, 2441634, 3309425, 5499044, 4424694, 1161656, 2693751, 6636057, 1239961, 4920262, 5871366, 3502632, 5116544, 4911027, 1612766, 1034534, 509103, 3278852, 5908563, 623688, 8056947, 7735596, 1914792, 5900891, 7691411, 1316995, 6751492, 810226, 3353662, 2661343, 4458342, 5917673, 3109593, 2208143, 1009948, 4987592, 4786600, 6984048, 1898867, 6400767, 2620334, 3692795, 4464587, 5231992, 6303993, 1797052, 2853704, 6417686, 6782822, 3650870, 4488170, 4025408, 5710940, 616570, 4476180, 3569417, 2565452, 3734889, 911583, 5755623, 4754613, 5320042, 5568908, 4826025, 7685369, 984166, 2446207, 722936, 4592228, 3614133, 44202, 289014, 1906484, 8058444, 2875352, 7368410, 926432, 3777554, 7015834, 3606747, 3836257, 63917, 2656071, 2646224, 53954, 6673012, 2562718, 1420073, 1635984, 6575278, 2069706, 6629513, 2293698, 527493, 3846643, 2241747, 3736104, 3223765, 1533664, 1474159, 7819457, 7650427, 7950472, 3346343, 690335, 491626, 8119383, 3341691, 4319927, 8162307, 7444286, 3747712, 3440703, 3469757, 5985746, 4225955, 705945, 6439342, 8093677, 61798, 6626687, 4309974, 8262902, 844978, 452, 8044627, 4068662, 4044885, 7791150, 5185798, 2216436, 7238558, 8025482, 5205687, 5421381, 7276796, 3546405, 189627, 316710, 5752157, 2501730, 4811974, 4010658, 2011957, 6306560, 3965919, 3731480, 1399952, 7493624, 1997305, 6885143, 5167542, 5304802, 7896963, 4466286, 5230402, 7533362, 7552379, 2209957, 5255290, 2160918, 7922991, 1650354, 7646074, 2821172, 6992810, 1060641, 6475595, 3694520, 6826389, 684812, 6687845, 7118866, 6151799, 6938089, 5613508, 1617252, 3806555, 6052647, 3375998, 460657, 3113800, 6571280]]] +s1: [[1, -1, 0, 2, -2, 2, -1, 0, -1, 2, 2, 2, 0, -2, 0, -1, -1, 2, -1, -2, 0, -1, -2, -1, 1, 2, 0, 1, 2, 2, 1, 1, 0, -2, -1, -1, 0, -1, 0, 2, 1, 0, 0, 1, -2, -2, 2, 0, 0, -1, 2, -2, -2, -2, 1, -2, -2, 0, -2, 2, 0, -1, 0, 0, -1, 0, -1, 2, -2, 1, -2, 1, -1, -1, 2, 1, 1, 2, -2, 0, 1, 0, 1, 2, 0, -1, -1, 2, -1, 2, 0, -2, -1, -2, -2, 2, 2, 1, -1, -1, 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, -1, -2, 1, 2, -1, 1, 1, 1, 0, -2, 1, 1, 0, -1, 1, -1, -2, 2, -1, 1, 0, 1, -1, -2, -2, 2, -2, 2, 2, 1, 1, 1, 0, 1, 1, 0, 1, 1, -1, 1, 1, 0, 0, 1, 0, -2, -2, 1, 2, 2, 0, 0, -2, -1, -1, 2, -2, -2, 1, -2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 1, 1, 0, 0, 2, 0, 1, 2, 2, 0, -1, -1, 1, 1, 1, -1, -2, 2, -2, 1, -2, 2, -2, 2, -1, 2, 0, 0, 2, 1, 0, -1, 1, 0, -1, 1, 1, 2, 0, 2, -1, -2, 2, 0, -2, 0, 0, -2, 2, 1, 2, 1, 0, 0, 1, 1, -1, -2, 0, -2, 2, -2, -1, 0, 0, 0, 1, 0, -2, 1, -1, -2, 2, -2, -2, -1, 1], +[-1, 1, 2, 1, 0, 1, 0, 0, -2, -2, -1, 1, 0, 1, 0, 1, 2, 2, -1, 2, -2, -2, 0, -1, 2, -2, 1, 0, 0, -1, -2, -1, -2, -1, -2, 0, 1, 0, -2, -1, -2, 1, 2, -1, -2, -1, -2, 2, -1, -2, -2, -2, 2, -1, -2, 2, 0, -1, 1, 2, -2, 1, -1, 0, 0, 2, 1, 0, -1, 2, -1, -2, 2, 1, 2, 2, 2, 0, 1, 2, 1, -1, 1, 0, -1, -2, 0, 1, 2, 0, 1, 1, 2, -2, -1, 2, -2, -2, 2, 2, 2, 1, 1, 2, 0, 1, 1, -2, 1, 0, 1, -1, 2, 0, -1, 1, -1, 2, -1, -1, 0, -2, -1, 1, -1, -2, 1, 1, -1, 1, -2, 1, 0, 1, 2, -2, -2, -1, -1, -2, 1, -2, 1, 1, 2, 2, 2, 2, -1, 0, -1, -1, 0, -2, 1, 0, -1, 2, 0, 1, -1, -2, 0, 1, -1, 0, 2, -2, 1, 1, -1, 1, -2, 1, -1, 1, -2, -2, -1, -2, -1, 2, 2, -2, -2, -1, -2, 2, 2, -1, -2, -2, 1, 2, 2, 0, 2, 1, -1, -1, -2, 0, -1, 1, -2, 1, -1, -1, 1, 1, -2, -2, -1, -2, 2, 1, 0, 0, -1, 2, 2, 1, -2, -2, -2, -2, -1, 0, 2, 1, 2, 0, 2, 1, 2, -1, 2, 1, 2, 1, -2, 2, 2, -1, -2, -2, 0, -1, 0, 1, 1, -1, 2, -2, -2, 2], +[0, 2, 2, 2, -1, 1, 2, -1, -1, 2, -1, -2, -1, 2, 1, -2, -1, 1, -1, 1, 0, 0, -2, 0, 2, 2, 2, 2, -1, 0, -1, 2, 2, 1, 1, -2, -1, 1, 0, 0, 1, 1, -2, -2, -1, 2, 2, 1, -2, 1, -1, 0, 1, 0, 0, -1, -2, 2, 2, 2, 2, 2, -1, -2, 1, 0, -2, -2, 1, 0, -1, 1, 1, -2, -2, 0, -1, -2, 0, -2, -2, -1, -1, -1, 1, -1, 0, 1, 0, 0, -1, -1, 0, -1, -2, 0, -1, 0, 1, 2, -1, -1, -1, -1, 1, -1, 2, -1, 1, 2, 1, 0, 1, -2, 2, 2, 0, -1, -2, 1, -2, -1, 1, 1, 2, -1, -2, 1, 1, 1, -2, 2, 1, 1, 1, 0, -1, 1, 2, -2, -2, 0, -2, 1, -2, -1, 2, -1, -2, -2, -2, 0, 0, -1, 2, 2, -1, 1, 0, 0, 2, 1, 0, 1, 2, 1, 2, -1, 2, 2, 1, -2, 2, 0, 0, 0, 2, 1, 2, 0, 2, -2, 1, 2, 0, -1, 1, 0, -2, 0, -2, -1, 1, 1, 0, 1, -2, -1, 1, -1, 2, 2, 2, 2, 2, 2, -2, -2, 1, 2, 2, 2, 2, 2, 1, -1, 0, -1, 1, -1, -1, -2, 0, 2, 2, 1, -2, 2, 2, -1, 1, 2, 2, 1, -2, 0, 1, 2, -1, -1, -2, 0, -1, -1, -2, 2, -1, 0, -1, 2, 1, 0, -1, 1, 2, -1], +[-2, -2, 1, -2, -1, 1, 2, -1, 0, 1, 1, -1, 0, 1, 0, 1, -2, 0, 0, 1, -2, 0, 0, 1, 2, 1, 2, -1, 2, -2, 0, 1, 1, -1, 1, 1, -2, -1, -1, 0, 1, 1, 1, -2, 2, -1, 1, -1, -2, 2, -2, -2, -2, -2, 2, 2, 2, 0, -1, -1, 0, -2, -1, 0, -1, -2, -1, 2, 0, -1, 1, -1, 1, -2, -2, 1, 0, 2, 2, -2, 0, -1, -2, -2, 2, 1, -1, 2, -1, -2, 1, -1, 1, 0, 2, -1, 1, 1, 2, 2, 0, -1, 0, 2, 0, 0, 2, -2, -1, 0, -1, -2, -1, 1, 2, 1, 2, -2, 2, -1, 0, -2, 0, 2, -1, 2, 2, 2, -1, 2, -1, 0, -2, -2, -1, 0, 1, 0, 0, 0, -1, -1, 2, 1, 0, 1, 2, 0, -1, -1, 2, -2, -1, -1, -1, 0, -2, -1, 1, 2, -2, 2, -2, 1, 0, 2, 2, 1, -2, 1, 0, -1, 1, 1, 0, -1, 2, -2, 2, 0, -1, 0, 0, 1, 1, -2, 2, 0, 2, 1, 1, 1, -2, 2, 0, 0, -1, 0, 1, 0, -2, -1, -2, 2, 2, -1, 2, -1, -2, 0, 1, 2, -1, 1, 1, -1, 0, 0, 2, 1, 0, 0, 2, -1, 1, -2, 2, 2, 2, 0, -1, 0, 2, -1, 1, -1, 0, 0, 0, -2, -2, -2, 2, -2, 1, -1, 1, 1, 1, 0, 1, 1, -1, 2, -1, 2], +[-1, 1, -2, 2, 1, -2, 1, 1, -2, 2, 0, 1, 2, 0, -1, 1, 1, 0, -2, 2, 2, 0, 0, 2, -1, -1, 2, 0, -2, 1, 2, -1, -1, 2, 1, 0, -2, -2, -1, -1, 0, -2, -2, -2, 1, -1, -1, 2, 1, 1, 1, 2, 0, 1, 2, -1, -2, 0, 2, 0, 0, -2, -2, 2, 1, -2, -2, 1, 2, 1, -1, -2, 2, -1, 2, 2, -1, 1, -2, -1, -1, -1, 0, 0, 2, 1, 1, 0, 2, 1, 2, 1, 0, 1, 2, -2, 1, -1, 1, 0, -1, -1, -1, 0, -1, -2, 1, 0, -2, 2, -1, -2, 1, 2, 1, 2, 2, 0, 0, 0, 2, 0, 2, -2, -1, 0, 0, -2, -1, 2, -1, 1, 1, -1, -1, -2, -1, 0, -1, -2, 2, -1, 2, 0, 2, 0, 1, 1, -1, 1, 0, 1, 2, -1, 0, 2, -2, 2, -1, -1, 0, -1, 0, 0, 2, -1, 1, -1, 0, -2, -1, 0, -2, 0, 1, -2, 1, 0, 0, -2, -2, 1, 1, 1, -2, 0, 0, 0, 2, -1, -2, -2, 0, 2, -1, 1, 1, 0, -2, 2, -2, 1, -1, 1, -2, 2, -1, 1, -1, -1, 2, 1, 1, -1, -2, -1, 2, 2, -2, 0, -2, 1, -2, -2, -1, 1, 1, -2, -1, -2, -1, 2, 1, 1, 1, -1, 2, 2, -1, -2, 0, -2, -1, -2, -2, -2, -1, 2, 1, -2, -2, 2, -2, -1, 0, -2], +[1, 0, 2, 0, -2, -2, 1, -2, 2, 0, 2, 2, 2, 0, 0, -2, 1, 2, -2, 2, -1, 1, 1, -1, -2, 1, 1, 2, 0, -1, 0, -2, -1, -1, 0, 0, -1, -1, 0, 1, -2, -2, 1, -1, 2, -2, 1, -2, -2, 0, 2, 1, 1, -2, 0, 2, -2, 2, 2, 2, 1, -2, 1, 1, 1, 2, 0, 0, 1, 0, 1, -2, -1, -1, -1, 1, 1, 2, 0, -2, 0, 1, 1, 0, -1, 2, -1, 0, 1, -2, -2, 0, 0, -2, 1, -1, 2, -1, -2, -1, 2, -2, 2, -1, -2, 2, 2, -2, -2, 0, -1, -1, 2, 1, 1, -1, -1, -2, -1, -2, -2, -2, 2, 2, 0, 1, 2, 1, 2, 0, -1, -2, -1, 0, -2, 0, 1, -2, 1, -2, -1, 0, -2, -1, 0, 0, -2, 0, 0, -1, 1, -2, 0, 1, 1, -1, 2, -1, -1, 1, 0, 0, -2, 2, 2, -1, -1, 1, 0, -2, -2, -1, -1, -2, 1, 0, -2, 0, 2, 2, -1, 0, -1, 1, 0, 2, -2, 1, -1, 1, 2, 0, 2, 1, 1, -1, 2, 2, 2, 2, -1, 1, -2, 1, -1, 2, 2, -1, 0, -2, -1, 1, 1, -1, -1, -1, 0, -2, -1, 1, -2, -2, 1, -1, 2, -1, 2, -1, 1, -1, 1, 1, 0, -2, 0, 0, 2, 0, -1, -1, 1, 2, 1, -1, -2, 0, 1, 2, 2, 0, 1, 0, -1, 2, -2, 1], +[-2, 1, 0, 1, -1, 0, 0, 1, -2, 1, 1, -1, 2, 2, 1, -2, 1, -1, -2, 0, -2, -1, 2, -2, -2, -1, 0, 2, 2, 1, 0, 1, 2, 2, -1, -2, 0, 1, 0, 1, 0, -2, 0, -1, -1, 2, -1, -1, -2, 2, -2, -2, 1, 1, 1, -1, 2, 1, -1, -2, -2, 0, 1, 0, -1, 1, 2, 1, -2, -2, -2, 1, 2, -2, 0, -2, 1, 1, -2, -1, -1, 2, 0, -2, -1, -2, -1, -1, 1, -2, -1, 2, -2, 0, 2, -2, 0, -2, -2, 2, 2, -1, -2, -1, 1, -1, -2, 0, 1, -1, 1, -2, -2, -2, 2, 2, 2, -2, -1, 1, -1, -2, 1, 2, 1, -1, 2, -1, -2, -1, 0, 2, 0, 1, 1, -2, 2, -1, 0, -1, -1, 1, 2, -1, 0, 1, 1, 0, 2, -1, 1, 0, -2, -2, 0, -2, 2, 0, 0, 2, -2, 1, 1, -1, 0, -1, 2, -1, 0, -2, 1, -2, 0, -2, 1, 0, -1, 1, 0, 1, 2, 2, -2, 1, 1, -2, -2, -2, -2, 0, 0, 0, 2, -2, 2, -1, 0, 1, 1, -1, 1, 2, -1, -2, -1, -1, 2, 1, -1, 1, 1, -2, 2, 1, -2, -1, 0, 2, 0, 0, 0, -2, 0, 1, 0, 1, 1, -1, 0, 0, -1, 2, 1, 0, 0, 1, -2, 0, 0, 0, -1, 0, -2, -1, 1, 2, 1, 1, -2, -2, 0, -2, 0, 1, 1, -2]] +s2: [[-2, -1, -2, 0, 0, 1, -1, 2, 2, 2, 0, -1, -2, 1, 0, -1, 1, 2, 0, -2, 1, -1, 1, 2, 1, 0, 1, -2, -2, 2, -1, 0, -2, -1, -1, 2, 2, 2, 1, -1, 1, -2, -2, 1, 1, 0, -2, 2, 0, 1, 0, 2, -2, -1, 0, -1, 1, -1, -2, 0, 1, 2, -1, -2, 0, 0, 1, 1, -2, 0, -2, -2, -2, 0, 2, -1, -1, -1, 2, 2, 0, 2, 2, -1, 0, -2, -2, 1, 0, -1, 0, 1, 2, 1, 0, -1, 2, 0, -2, 2, 2, -2, -1, -2, 2, 1, 0, 1, 1, 0, 2, -1, -2, 2, 1, -2, 0, 2, 1, -2, -2, 2, -1, -1, 2, 2, 1, -1, 0, 1, 1, -1, 0, 0, 2, -2, 2, -1, 0, -2, -2, 0, 0, 0, 1, 0, 0, 2, -2, 2, -1, 0, 2, -2, -1, -2, 2, 1, -2, -2, 0, -2, 2, 0, 2, 0, -1, 1, -2, 1, 0, -2, 1, 1, 1, 0, 2, 0, -1, 2, 0, 0, -2, 2, -2, -2, 2, 1, 0, 0, 0, -1, -2, 1, 0, 2, -2, 0, 2, 2, 1, -1, 2, 2, 2, -1, 1, -2, -2, -2, -2, 1, 2, -2, 2, 1, 0, 1, 1, 2, 1, -2, 2, 0, -1, -2, 1, 1, 2, -2, -1, -2, -1, 1, -2, 1, -2, 1, -1, 0, -2, 1, -2, 2, -1, -2, 2, 0, 1, 2, 1, -2, 0, -1, 2, 1], +[2, -2, 2, 1, -2, -1, 1, -2, 1, -1, 0, -2, -2, -1, 0, 1, 2, 2, -2, 0, 2, 2, 2, -2, 1, 2, 1, 0, -2, -2, 0, 1, -2, 1, 1, -2, 0, 1, 2, 2, 1, 1, 2, 0, 1, 2, 0, -2, 0, 1, -2, -1, -1, 2, 1, -2, 0, 2, -2, 0, 2, -2, 1, 1, -2, -2, 1, 0, 1, 1, 1, 0, 1, -2, -2, 0, -2, -1, 0, 2, 0, -2, 2, 1, 1, 1, -1, 2, -1, -1, 2, -2, 2, 0, -1, -1, 2, -1, -2, -1, 0, 2, 0, 2, -2, 0, 0, -1, -1, 1, 1, -2, 1, -1, -2, 1, 0, 0, 2, 1, 2, -1, -1, -2, 1, 1, 0, -1, 1, -1, 1, 1, 2, 0, 0, -1, 2, -2, 0, 0, 1, 1, -1, 2, -1, 0, 2, 1, -1, 1, -2, -2, -1, 0, -2, 0, 1, -1, -1, -2, 1, 1, 0, 0, 2, 2, 0, 0, -2, -1, 2, 0, 1, -1, -2, -1, -1, 1, 2, -2, 0, -2, -2, -1, 0, 1, 2, 2, 1, -1, 0, -1, 2, 0, 2, 1, 2, -1, 2, -2, -2, -2, 0, -1, -1, -1, 2, 0, 1, 2, 2, 0, 0, -2, 2, 2, 1, 2, 2, 2, -2, -1, 1, 2, 2, 2, 2, 0, -1, 0, 2, -1, -1, -1, 2, 2, 0, -1, -2, 1, 0, 2, -1, 0, 1, -1, 2, 1, 1, 0, 0, -1, 1, -2, 1, 2], +[2, -2, 1, -2, 1, 1, 2, -2, 0, 2, -2, 0, -1, 0, -1, 0, 1, -1, 1, -2, -1, -2, -2, -1, -2, 0, -1, 1, 0, -1, 2, 2, -1, 0, 0, 2, -2, -1, -1, 2, 2, -1, -2, 0, 0, 0, 1, 2, -2, -1, 2, 0, 1, 1, -1, -1, 2, -1, -1, 1, -1, 2, -1, -1, -1, -2, -1, -2, -2, -2, -1, 1, 2, 0, -1, 1, -2, -1, 2, 1, -2, -1, -2, 1, 0, -2, 2, 2, -1, -2, 1, -1, -2, 1, 1, 1, 2, -2, 1, 2, 0, 2, -2, 0, -2, 2, 2, -1, -1, -1, 0, 2, 0, -2, 0, 2, -2, 1, 0, -2, -1, 0, 2, 0, 0, 2, 0, -1, 0, -2, 1, -1, -1, -2, 2, 0, 1, -2, 0, 2, -1, 2, 2, 0, 1, 1, 1, -2, 1, -2, 1, 2, -2, 2, -1, 0, 2, 1, 2, -2, 1, 2, 1, -1, -1, 0, 1, 2, 0, -2, 1, 1, 0, 1, -2, -1, -1, 0, 1, 1, -2, 2, 0, 2, -2, 0, 2, -2, 1, -2, 0, 2, -2, 1, 0, 0, -1, 1, 2, -2, 1, 1, 2, 1, -1, 0, -2, 0, -1, 0, 0, -2, 1, -2, 0, 1, 2, 2, 0, -2, -1, -2, 0, 2, -2, 0, 0, 0, 0, 1, -2, -1, 0, 1, -2, 0, 0, 2, 2, -2, -2, 0, -1, -1, 1, 0, 1, 2, -1, 0, 2, 0, 1, 1, -1, 0], +[0, 1, 1, 2, -2, -1, -2, -2, 2, 2, 2, 1, -2, 1, -1, -1, 0, -1, 2, -2, 1, -2, -1, 0, 0, -1, -1, 2, 0, -1, 0, -1, 2, -2, -2, 1, -1, -2, -2, 1, -1, 2, -2, 1, -2, 0, 1, 1, 2, 1, -1, -2, -1, 0, 2, -1, 0, 1, -2, 0, 2, 2, 0, 2, -2, 1, -2, -1, 2, 1, 1, -1, 1, 1, 2, -1, -2, 0, 0, 1, 0, 0, -2, -1, -1, 0, 0, 2, 2, -1, -1, 1, -2, 1, -1, 2, 0, -2, 0, -2, 0, 2, 0, 1, -2, 2, 0, 1, 2, 2, 1, -2, 2, 2, 2, -2, 2, -2, 2, 2, 0, -1, -2, -2, 2, 1, -1, 1, -2, -2, -1, 2, 0, -2, 1, 1, 1, -1, -2, -2, 2, -2, -1, -2, -1, 1, 1, 1, 2, 1, 1, -1, 0, 2, 2, 2, 0, -1, -1, 0, 1, -2, 1, 0, -2, -1, 1, -1, 1, 1, 1, -2, -1, -1, 1, 0, 1, 0, -1, -1, 2, 0, 0, -2, -2, 0, -2, 1, 1, 2, -2, 2, 1, -1, 1, -2, 2, 1, 0, 0, 2, 0, -1, 1, 0, -1, 1, -2, 0, 0, -2, -1, 0, -2, 1, -2, 2, -2, 1, 0, -1, 1, 2, 1, 1, -1, -2, -1, 1, 1, -1, 0, -1, 2, 1, 1, -1, -1, -2, 1, 1, 1, 0, 2, -2, 2, -2, 1, -2, 0, 1, -1, -2, 2, -2, -2], +[1, 1, -2, 0, 2, -1, -2, -2, 1, 1, 0, -1, 2, 0, 2, 1, -2, 2, -1, -2, -1, -2, -2, -2, 1, 2, 1, 1, -1, 2, 2, 2, 1, -1, 2, 0, -2, 1, 1, 0, 0, 2, -2, -2, 2, 2, 2, 2, -1, 0, -1, 1, 2, -2, 1, -2, -2, 1, 0, -2, -1, -1, 2, 1, 1, 1, 1, 1, 1, 0, 1, 0, -2, -1, 2, 1, -1, 2, -2, 0, -2, -2, 2, 1, 2, -2, 0, 2, 1, 2, -1, -2, 2, 0, -1, 0, -1, 2, 1, -2, 1, 1, -1, -2, -2, 2, -1, -1, 1, 1, 0, 2, 2, -1, 2, 2, 0, -2, 2, -1, 2, -2, 1, 2, 1, 1, -2, 1, -2, -1, 0, 2, 2, -2, 0, 2, 2, -2, -1, -2, 0, 2, -2, 0, 2, -2, 1, -2, -1, 0, 2, -2, -1, -1, 0, 1, 0, 0, 1, 1, 1, -1, 0, 1, 2, 2, 0, 0, 0, 2, 0, 0, -2, 2, 2, -2, 2, -2, 2, -2, 2, -2, -2, 1, -1, -1, 0, 2, 1, 0, 1, -1, 0, 1, -1, 0, 1, -1, -1, 1, -2, -1, 0, 1, -1, -1, 2, -2, 0, 1, 1, 2, -2, 0, -1, -2, 1, -2, 1, -2, -2, 0, 2, -1, -1, 1, 0, 1, -1, 0, 2, -1, -1, 0, 2, 1, 0, 2, -1, 1, 2, -1, 1, -2, 1, 1, -2, 2, -1, 1, -1, 1, 1, 0, 0, 1], +[1, -1, 0, -1, 2, -2, -1, 0, -2, -1, 1, 2, 0, -1, -1, -2, 2, -1, -2, 0, -1, -2, 1, -1, -2, 1, -2, 0, 2, -2, -2, -2, 2, -2, 0, 0, 0, 0, 1, 1, -2, -2, -2, 0, 1, 0, -1, 1, -1, 1, -2, -2, 2, -2, 0, 2, 0, 2, 2, -1, 2, 0, 2, -1, -1, 0, 2, 2, 2, -2, 2, 1, 2, 2, 2, 0, -2, 2, -2, 0, -2, 2, -2, 2, 0, -1, 1, 2, -1, 0, 2, 1, -2, 1, 1, -2, 0, 0, 1, 0, -1, -2, -2, -2, -2, 0, -1, 0, -2, 1, 1, 1, -2, -2, -1, 0, -2, 2, 1, 1, -2, 0, -2, -1, 1, -2, -2, 1, -1, -2, 0, 2, -2, 2, 0, 1, 0, -1, -1, 2, -2, -1, 2, -1, 1, 2, 2, 2, -2, -1, -2, 1, 1, -2, 2, -1, -1, 2, 0, 0, 2, 0, 0, -2, 0, -1, 0, -1, 2, 2, 0, 1, 1, -1, 1, -1, -1, 0, 0, 1, 1, -1, 2, -2, 1, -2, -1, 2, -1, 2, -1, 2, -2, -1, -1, 0, -1, 1, 2, 2, 1, 2, -1, 1, -2, 2, -1, 0, -1, 2, 2, 0, -2, 1, 1, 1, 1, 2, 1, -1, -2, 2, 1, 1, 2, -2, -1, -1, 2, 2, 1, 0, 0, -1, 1, -1, 1, 0, -1, 1, 2, -2, -2, 2, 2, -2, 2, 2, 2, 1, -2, -1, -2, 0, -2, 1], +[0, 2, 0, -1, 1, -2, -1, 2, -2, -1, 0, 0, 1, 2, -2, 1, 1, 1, -1, 0, 2, 0, 0, 0, -2, 2, 2, 1, 1, -2, -1, 1, -1, -2, -1, 0, 1, 0, 2, 2, 1, 1, -2, 2, 0, 0, 2, -2, 0, 2, 0, 0, 1, 0, 1, 2, 0, -1, 1, 0, -2, 2, 2, 0, 0, 1, -1, -1, 2, -2, -2, 0, 2, 2, 2, 1, -2, -2, 1, -2, 0, 1, 0, 0, -2, 1, 2, -2, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, -2, -2, 2, 2, -1, 2, 0, 2, 1, 0, 2, -2, 0, 2, 1, 2, 0, -2, 1, 2, 2, -1, 1, -2, 2, 1, 1, 1, -2, -2, 0, 1, 0, -1, -1, -2, -2, 0, 2, -2, 0, -1, -1, 2, 1, 1, 2, -2, 2, 2, -1, -1, 0, 1, 0, -1, -2, -1, 2, 2, 1, 0, 0, -2, -1, 0, 1, 2, -2, 0, -2, -1, -2, -1, 1, 0, -1, 2, 2, 1, 1, 0, 1, 1, 0, 2, 1, 1, 0, 1, 2, 0, 2, -1, 0, -2, 0, 2, -1, 1, 0, 2, -1, 1, -2, 0, -1, 2, -2, 0, 0, 1, 1, 0, 0, -2, -2, 1, -2, 0, -2, 0, 0, -2, 0, 1, 0, -1, 2, -2, 2, 1, 0, -2, -2, 1, -2, -2, 1, 0, -2, 1, -2, -2, 0, -2, 1, 1, 1, 1, -2, 2, 1, 0, 0, 2, -1], +[-2, 2, 1, -2, 2, 2, -2, -1, -2, -1, -2, 1, -2, 1, 0, 1, 2, 1, 1, 1, 2, -2, 2, 2, 1, -1, -1, -1, 1, 0, -2, -1, 1, -1, -2, 0, 0, 0, 0, -1, 1, -1, 0, 1, -2, -1, 0, -2, -1, 2, 2, -2, 1, 0, -1, -2, 2, -2, 2, 2, -2, -1, 0, -2, 1, -2, 1, 2, -2, 0, 2, 1, -1, 0, 2, -2, 2, 2, -2, 2, -2, -1, 0, 2, 0, 2, -2, 0, -1, -2, 1, -2, -1, 0, 0, 0, -1, -2, -2, -2, 1, 1, -1, 0, -1, -2, 1, -1, 1, -1, 0, 2, -1, -1, 1, 0, -2, -2, -2, 1, -1, 0, 1, 2, 1, -2, 0, 0, 2, 1, 1, -1, 0, 0, 2, 2, 2, -1, 0, -2, 1, 1, 1, -2, 2, 0, -1, 2, 1, 0, 0, -1, 1, 0, -1, -1, 2, 2, -1, -1, 0, 2, 2, 0, 1, 0, 2, -1, 0, 0, -2, 0, 1, 0, 2, 1, 0, 1, 0, -2, 2, 2, 0, -2, 1, 0, 1, 1, 1, -2, 2, 0, 2, -1, -2, -2, 1, -2, -1, 1, 1, -2, 0, 0, 2, 0, 2, -2, 1, 1, -1, 2, 0, -1, -1, 2, -1, -2, -2, -1, 1, 1, -1, 1, -2, -1, -1, 0, 1, -1, -2, 0, -2, 2, 0, 0, 0, -1, -1, -1, 0, 2, 2, -1, 1, 0, -1, -1, 1, 0, 2, 0, 1, -2, -2, 1]] + +s1Hat: [[5795647, 3150302, 5761214, 72796, 2266350, 6924562, 6191710, 4214634, 1336751, 4238696, 7592796, 2159125, 5848504, 4844318, 6573695, 6686111, 8357433, 835445, 157395, 7303916, 6588758, 837730, 843272, 3312442, 5643095, 4080364, 4048366, 40873, 6396702, 4747670, 1570463, 2326475, 6561750, 8025716, 5633476, 4483686, 1462341, 8359766, 6737641, 1956744, 3404848, 488982, 5751175, 6906454, 594413, 8363428, 4389333, 69269, 3815336, 1348627, 8373909, 8365022, 3482251, 7041865, 7306425, 1550567, 1882569, 1912996, 4143590, 5074495, 1167162, 3102841, 7989002, 8149533, 965003, 3366442, 3684153, 1175633, 4883063, 3718574, 6246334, 419135, 6753720, 8152352, 8291950, 6602975, 17937, 4220092, 3027474, 5379264, 2275, 4097168, 2107701, 3391767, 5314207, 901476, 6010766, 5729071, 3941058, 3815443, 8116932, 1738505, 7047820, 1162479, 8072637, 6611116, 119081, 1003931, 164033, 8007953, 5333731, 1003603, 4807358, 1249177, 7575880, 450378, 6591435, 7369346, 3775550, 6506459, 5340081, 6999878, 7190151, 5226240, 6058982, 4368572, 4138180, 7381248, 8267598, 7793721, 5114279, 3283739, 2251895, 31698, 3922389, 6263873, 4184574, 2427319, 7835643, 4506324, 127266, 3526243, 341269, 650594, 5224491, 7269124, 6417481, 334377, 616254, 7992832, 6154385, 3077993, 4950088, 2362844, 1886191, 3040677, 2510860, 4119625, 2085030, 4844539, 2904940, 5945485, 4467886, 4119194, 2582006, 7176134, 1280915, 31882, 6730022, 744177, 2428141, 2200455, 6888105, 2288192, 3562211, 1551121, 5633473, 6685202, 2707345, 2233115, 5824472, 77656, 523169, 1414621, 3560903, 2469298, 5009442, 7898198, 429315, 7750314, 6367769, 4612983, 3327000, 2340908, 6568536, 6827196, 3399524, 7024260, 1375254, 5830403, 2319527, 3958281, 180585, 4394514, 2005930, 3666266, 5734950, 1688091, 4629570, 1305699, 4499339, 6296001, 4961620, 1882644, 2512083, 6741794, 827858, 1385426, 7712054, 712049, 328281, 6091668, 1355595, 2707459, 5816135, 36351, 5821274, 1804511, 6819135, 6253963, 7284305, 3071199, 2912600, 200908, 4689401, 1908853, 2322028, 4586006, 7818432, 6550217, 8120410, 2352478, 7213643, 1872281, 5294908, 7478978, 2193154, 2795257, 1499615, 1611547, 5515853, 6449513, 2335204, 3381388, 7342801, 164336, 6575088, 4012267, 8253357, 1915394, 6062895, 2950942, 5508741, 4385532, 3180426, 818743], +[7151875, 1460286, 3779147, 2797845, 4811306, 5419464, 6753226, 5694248, 2370198, 1786178, 931182, 7859667, 4212058, 1252827, 7958658, 1353091, 4208922, 4421226, 2746249, 4722939, 7755899, 4959990, 965729, 6519033, 3659620, 5159830, 6887304, 4009839, 1618838, 3429110, 4010083, 2883381, 5682293, 7114304, 8187150, 6030738, 6272538, 1801148, 7770281, 6220736, 6067318, 688099, 677184, 7548805, 2791915, 5556038, 7971323, 3794919, 7032458, 5825575, 4548090, 4995366, 2994003, 213799, 5634793, 2760494, 4801623, 4185089, 7725355, 4477619, 4494551, 2172618, 7718530, 6066283, 2144979, 7244906, 4148645, 713253, 6202226, 6222332, 6029876, 7831357, 6023837, 1308989, 7736208, 6539395, 1099109, 4187155, 364971, 3117229, 7409649, 4102620, 7357000, 3265697, 8089895, 4385210, 6246408, 7538926, 3462686, 2208874, 1368532, 5892036, 3946331, 3694260, 7208729, 817649, 1924077, 4256761, 2689823, 4165659, 900897, 6815584, 5327960, 4232581, 2277362, 3516382, 2494122, 546984, 1506704, 4063012, 2418940, 7495887, 871147, 5007958, 5369712, 6956562, 5521691, 1918109, 8366343, 1195651, 3514248, 846301, 5116585, 2975539, 2144316, 7622382, 6159253, 6692053, 1086452, 2052779, 8299643, 1160535, 1328966, 7427487, 4180778, 7718281, 185624, 2672762, 900197, 4636933, 4743192, 5325988, 5083166, 3213145, 2489648, 3807530, 3198620, 1029556, 1187414, 7984371, 8106531, 6186659, 296074, 3776452, 5632802, 5457021, 917438, 1935963, 1106681, 5121716, 5208847, 8188872, 7691062, 1216545, 8312888, 5129642, 4664147, 2989029, 88805, 3960967, 558279, 7079551, 8034422, 8306258, 6492685, 779099, 5719596, 1258639, 6852737, 4645572, 1550886, 1772755, 7676385, 295344, 1434580, 4308662, 1117011, 5379707, 2183429, 6827463, 3081078, 4353259, 6870390, 3228048, 2506658, 1359078, 789929, 3937603, 2346512, 5293653, 3775686, 6009227, 6089431, 2388938, 96981, 7919616, 5647575, 1362269, 4205221, 925980, 4139068, 2840967, 1148588, 6517475, 6164119, 2794406, 6208963, 7039692, 7639253, 4342331, 429917, 5224776, 5446088, 291586, 641054, 1881035, 446264, 3898200, 6589430, 6061339, 3754558, 6745543, 7046183, 5474018, 7447495, 5101052, 2821590, 5992416, 3866877, 5765950, 1596148, 7417539, 1430171, 5847174, 8349914, 697355, 3460737, 2294578, 3626548, 7912444, 5221528, 6085186, 3238008, 4173425, 4917828, 3073901], +[5165910, 7508523, 6136157, 7092897, 1989069, 5382216, 4537391, 7269969, 61242, 7729887, 2235094, 4825796, 1463414, 5391268, 7043218, 2056267, 4616504, 1333028, 2880498, 5343036, 4323425, 1190874, 6144562, 6417547, 1067841, 3085417, 3815701, 5988306, 8041686, 4181803, 6164865, 3594826, 4882806, 6916121, 3501199, 3563633, 7510370, 8108, 1777842, 2982607, 5095312, 4167266, 4465534, 7963731, 4141136, 3860294, 5313402, 4505358, 4987184, 5383760, 8027012, 5017245, 778248, 170575, 3380103, 2499811, 7443783, 6401947, 6404624, 924632, 2848401, 734228, 8195474, 324676, 2133477, 7902597, 6332337, 6059523, 4501988, 95105, 1553797, 337931, 5253085, 1645715, 5995282, 1238538, 1998690, 2765405, 1094983, 6263371, 4035926, 6292372, 8320046, 8012173, 1119137, 1898875, 5529768, 390697, 1266807, 6756123, 544335, 6591132, 1689751, 2141708, 5458817, 407063, 6093385, 7091704, 5794026, 1624416, 6634659, 6014887, 2068641, 5014960, 4902572, 384896, 7398651, 7470390, 4215288, 1418897, 7743411, 7483555, 5712419, 6342296, 3514360, 5654700, 2168407, 806193, 8046287, 6786917, 3470178, 7919698, 3117736, 8249459, 1106705, 134851, 8315549, 1824190, 5341004, 5384861, 2377042, 3764106, 3781293, 7232654, 5804693, 2570019, 5187771, 3291296, 1053566, 5390852, 1806844, 4176210, 1031824, 8037171, 1102287, 4549996, 1682869, 4086803, 2207521, 1476853, 6155709, 6021544, 527068, 6021873, 3420479, 3791561, 4564909, 6884226, 2297416, 1001014, 3456304, 7978168, 7864081, 6474704, 7294567, 189002, 6730217, 3844279, 5216942, 5246428, 1344024, 139635, 6787779, 5089428, 512388, 7568327, 2201671, 2612616, 3792887, 7967057, 4251140, 7612127, 3697913, 5951767, 5829773, 6842557, 7771544, 7174683, 4272439, 2821249, 740958, 3276280, 4691924, 4523318, 8291494, 1114377, 942976, 5930280, 6392889, 129435, 7493961, 7394628, 5811217, 8048889, 3454984, 5598482, 1823487, 6356935, 2428931, 2982560, 7522215, 4855245, 6180155, 7365317, 3477330, 4305342, 2715920, 5428577, 6688879, 6910687, 6007482, 6538858, 3581829, 4143429, 866402, 3662964, 3341130, 2942034, 4964150, 2376352, 7649915, 8237162, 3944038, 4736098, 6277242, 7393356, 2299012, 1211658, 6331808, 7544530, 3486398, 2180438, 1240594, 119391, 8373658, 2098556, 6702493, 2279223, 2636458, 1633123, 1366292, 624488, 4723119, 2743833, 4712575, 5402758], +[7026961, 2185768, 771806, 2120769, 3125969, 4544875, 5402957, 8030344, 7563176, 7342287, 2150838, 601073, 2617396, 4125810, 7853309, 6589193, 8959, 3712147, 3358323, 4776550, 7016772, 2964318, 7010311, 1660424, 7734119, 3365715, 5173906, 486936, 5594242, 969764, 2021290, 6996729, 5060171, 6697597, 6758739, 4889942, 6986108, 6361676, 6904128, 4594704, 7799568, 1539724, 2911783, 1103743, 2880017, 2045171, 1348006, 1504456, 7285949, 340418, 741003, 5908881, 1095654, 1463671, 7603542, 4091705, 1585982, 71557, 3623030, 3216250, 4259381, 5235021, 520420, 675712, 6629205, 1949355, 3470421, 6290423, 7451369, 4690422, 5284380, 4515335, 5935319, 153859, 4893579, 5340490, 4700627, 3909859, 7278600, 2837372, 2912009, 6293666, 8295140, 7236660, 2423974, 2085137, 2593864, 279419, 5167864, 6303428, 7487194, 761023, 6199022, 4479322, 5657905, 3128634, 1937528, 460640, 1248529, 1302242, 6746045, 6566765, 8285194, 2194889, 6972238, 6175678, 7870543, 6145773, 5043305, 5400229, 4630279, 6540563, 5930843, 7020425, 5595285, 5047063, 1781759, 6928296, 1338247, 5591596, 2741032, 2636007, 2345111, 190488, 2601299, 5756273, 5213801, 4168872, 4267666, 6921630, 6784253, 2751398, 6484197, 5662911, 2528542, 1508946, 329989, 6175241, 7748090, 3001740, 9818, 6329820, 775880, 2877728, 3084025, 7647566, 3684286, 7604994, 7996268, 2241346, 749932, 4171599, 5592726, 816871, 7574647, 2406175, 7382081, 1709372, 4000657, 3201538, 2550042, 5568818, 3842756, 7659492, 1716586, 5342806, 5887976, 2797303, 3126430, 7135256, 8309606, 8149823, 5957802, 6431071, 2712321, 8349006, 1919608, 1644339, 5554624, 5584696, 3485605, 2877607, 2967940, 2309440, 4109165, 2604769, 8195600, 6453514, 1424412, 2981345, 5812857, 3079824, 4769177, 2392579, 6894709, 211496, 1737234, 7559766, 3944753, 3951976, 7904260, 4422540, 685409, 1764823, 4526123, 6230055, 1443615, 6542238, 2207956, 2487931, 1534268, 984098, 2352007, 624699, 2864845, 1598074, 5669258, 4207264, 3516109, 867375, 2270006, 7192518, 8327083, 6000744, 775704, 4197481, 4063685, 7415846, 5358554, 3110982, 1431613, 2740900, 8056811, 7823520, 1825369, 3186987, 7456629, 4327904, 7223114, 1310325, 7467346, 4488442, 4311034, 8358601, 7543833, 2927441, 1133996, 2729071, 2477822, 944967, 5969230, 503031, 3554560, 7330726, 3495026, 8234914], +[6566183, 901367, 2269152, 8292510, 1269082, 7261436, 5166259, 1844722, 3308544, 2302256, 1847468, 3412069, 4618800, 3783586, 589875, 3149388, 1493546, 3054257, 3587331, 4242579, 5566465, 4004656, 3907398, 3386721, 7951057, 3703483, 5433244, 729306, 4447645, 938700, 8181275, 3941198, 2772777, 4605282, 264408, 7611068, 2332180, 7379542, 2644429, 553541, 4829457, 3074836, 5249797, 4422426, 7568354, 2154788, 1431233, 4658516, 4330003, 7852314, 210629, 6169362, 3661390, 6549808, 625479, 6925257, 1058095, 6186815, 2920319, 5391179, 2377458, 4425075, 4006271, 6336568, 3181977, 1064531, 1109405, 4701303, 3674475, 6826404, 1070590, 5406092, 7557045, 1687647, 2182774, 5416564, 5715716, 1950187, 3372938, 5526493, 513838, 6454315, 2690288, 3817220, 2739903, 6356034, 5738195, 2804915, 1740419, 962179, 5224932, 2467224, 7933513, 2189779, 4019734, 5493399, 6497170, 7177221, 2081757, 3905860, 5965021, 1660417, 7859251, 2179465, 7837722, 3253249, 4927275, 707373, 1730562, 479222, 7603177, 2079727, 6099948, 5658629, 5679252, 8242212, 7953675, 8009643, 6832543, 7249526, 724568, 3871205, 2124720, 2877659, 3617522, 592087, 3959253, 3150182, 6948062, 8347087, 1965646, 6855942, 2541747, 8214023, 7012450, 4844515, 6545379, 988839, 5348637, 5031618, 7026672, 4898913, 5268636, 57317, 1834392, 3575704, 6358870, 2722534, 5033800, 2466890, 1694408, 3502678, 2822948, 6723141, 6884537, 113724, 7482520, 2363175, 6769809, 8353865, 3631863, 5416185, 5865219, 6645725, 3066837, 5758482, 5052706, 4060678, 3902119, 2067721, 2334366, 73892, 4741400, 7103102, 6763010, 6798453, 6691505, 7372247, 2323302, 7330471, 8283747, 4232468, 6900784, 7280079, 3656169, 3088254, 8326620, 2954741, 8259674, 2307723, 3115399, 7806089, 5029624, 2946674, 7252704, 79025, 1346054, 1761752, 7400208, 467759, 6512935, 4410084, 3894827, 4689142, 5825154, 2713021, 7233580, 716227, 2605578, 6738749, 1384755, 2238191, 4384765, 8220875, 1866511, 6521235, 1375746, 2204286, 2984798, 3870519, 4402200, 6386181, 3729308, 8154795, 5591355, 6797872, 995958, 8338378, 5071538, 828690, 4608292, 372849, 432738, 7243132, 349202, 3505243, 528166, 2451964, 6504081, 3021087, 2919609, 788626, 6206825, 6360312, 4725916, 7957732, 5773545, 158962, 1084093, 4301838, 6472987, 6597182, 7933776, 2686475, 3254157, 6527269], +[4754400, 7297762, 1784184, 6577486, 901234, 3072649, 703734, 7142635, 6446904, 3978792, 1105978, 3460331, 328804, 4577883, 3789043, 1898530, 3246250, 1042023, 3543636, 3957541, 7246236, 706371, 6892937, 3442473, 6470, 6476042, 5211050, 6068272, 2098371, 6194879, 5422825, 2785782, 6132251, 4025838, 1498267, 5174312, 4850092, 4513768, 7723416, 6320191, 6828666, 1053379, 5740083, 2732436, 4328266, 1090238, 8347562, 7680568, 4570507, 2508104, 2502792, 7564902, 7639953, 3814116, 1041569, 7883164, 756249, 980071, 5594204, 693709, 3013934, 1961412, 7118020, 7384486, 1501117, 841099, 6818372, 2566942, 7220439, 5917103, 284079, 2459215, 7228428, 5176490, 6975454, 6079804, 2360216, 8058737, 5998455, 5059168, 5996385, 334917, 7250820, 391852, 3588934, 6138841, 4844744, 2541107, 1888105, 1780039, 7591768, 5703902, 4101594, 8282029, 843955, 7076446, 3675124, 1680432, 3253870, 5992913, 2951215, 2309858, 1197461, 3677159, 2375261, 4249435, 7993489, 4225831, 4322946, 2778853, 8072543, 5906409, 2418286, 2337160, 3531001, 1809944, 5086548, 1472920, 6120185, 2055130, 1870572, 6705124, 4261897, 6391245, 1167475, 142302, 1191884, 7589704, 293598, 1616521, 1863033, 1721361, 6362952, 1225806, 98811, 771108, 4943597, 4839603, 1438462, 5587494, 1719379, 515749, 2907436, 7695303, 8374642, 6807899, 2486959, 1391218, 6684534, 7536216, 7483032, 7411894, 2146027, 2062870, 8162450, 4435464, 6817738, 7580243, 6840705, 2917539, 7330450, 2707496, 6303219, 4107425, 943576, 8197060, 4434915, 1484207, 7482421, 3340948, 1746452, 1869957, 6757580, 2692360, 2707082, 6113317, 6755377, 6570807, 2336775, 1121018, 6868684, 7396036, 2105089, 6474261, 1200049, 194792, 2771268, 5929346, 5332695, 5391695, 167409, 4940274, 687476, 1353871, 1388817, 2898827, 4701431, 1067596, 4214096, 3066917, 5649900, 1590503, 6469683, 1398442, 2626668, 3558511, 2698313, 129431, 548579, 2463421, 5218934, 1869677, 4868108, 3343788, 7233175, 1311666, 7751777, 8297024, 7018583, 4902429, 8271601, 19671, 4844348, 5130145, 7805231, 8158353, 723817, 6111363, 1934882, 8172456, 5308646, 2439491, 1179394, 7556971, 7103189, 6605937, 7402526, 8206821, 7077839, 5352934, 420546, 5344376, 4141843, 5792143, 5997639, 5607885, 1679502, 8258754, 7857810, 4211555, 1728944, 6051236, 6515486, 1446972, 2348475, 4100761], +[4180256, 4430151, 2666320, 2063999, 3793431, 5042253, 4874051, 2908133, 3076555, 4839220, 7731176, 1748073, 3869518, 7461708, 444401, 8003022, 7652106, 7110979, 7306248, 309481, 7532431, 904459, 6853198, 1746848, 7971138, 1030445, 6348084, 2817255, 2569892, 6887987, 3075307, 6905165, 1829540, 7788168, 2361658, 2627737, 7452687, 2582402, 6369817, 7012970, 4231620, 4879563, 2196506, 115709, 750309, 6683681, 81279, 2467820, 6788999, 7276340, 6228591, 2371105, 3647487, 7098409, 3099116, 1532937, 900184, 1400246, 4075463, 6691598, 388408, 2802168, 4116545, 8315613, 3360274, 5403976, 6061133, 7856581, 2490199, 4081204, 8352901, 1247142, 5861748, 6847822, 1497612, 7288780, 1985562, 3204272, 7223782, 7139080, 6921679, 789868, 2353548, 3804159, 3404916, 5032412, 640182, 4019974, 1948087, 2245937, 7282954, 5498097, 3512955, 3974950, 1272959, 5346825, 688356, 2174310, 4639633, 3243152, 5999016, 5585961, 1568902, 3038709, 1170324, 4843198, 7062800, 471085, 5065362, 8140006, 4764303, 2980249, 2928108, 2714172, 3496555, 62834, 8000094, 4248362, 5657930, 3146768, 7963983, 4630848, 3303687, 5208522, 2678793, 3361654, 4023423, 6239433, 5049228, 6236682, 2044478, 3317147, 1971873, 684430, 3054978, 2258802, 4597204, 1510693, 4025531, 5081994, 3237172, 7438322, 2338501, 2243880, 4784011, 6754986, 3565544, 4757548, 185560, 1342875, 153027, 7969158, 7190555, 2217310, 706039, 5807232, 6723928, 7993995, 688043, 6774150, 313778, 4136987, 234085, 1068687, 3998044, 6265263, 3266286, 190253, 1557745, 6495130, 1859939, 6627746, 4847265, 937921, 1643988, 7479434, 7636005, 7690048, 678976, 5100305, 1272390, 2886631, 7860728, 4794748, 4287807, 6849071, 4622017, 6233667, 877935, 8223736, 6053379, 4624674, 7702858, 848981, 4836966, 3056477, 7559380, 100050, 5351493, 1462561, 5335426, 7528987, 6458902, 6557191, 4134163, 1061770, 5244219, 8366185, 6442328, 1136862, 4806844, 7219692, 637760, 2577205, 612586, 2119869, 3128725, 5394960, 6063875, 4317098, 7877548, 5463281, 7284286, 935179, 7618540, 2359366, 1144281, 5719589, 3272742, 5723623, 5763522, 886167, 3620419, 5644406, 2737553, 6451695, 7239177, 5588810, 83997, 4391023, 3648013, 2068894, 1402083, 4561848, 1244021, 5015440, 6895509, 8009243, 6745434, 3144483, 4597973, 2344958, 4901968, 7038808, 980775, 1154769]] +aHat * s1Hat: [[8245964, 3625183, 3907468, 1685519, 2157647, 5362673, 5257729, 6171207, 5107407, 351925, 563434, 3807257, 7296681, 5906750, 2786173, 6594600, 2492252, 2616910, 1332168, 3008716, 3761219, 532908, 1692959, 1189134, 4801545, 7940227, 6798233, 7682383, 2194640, 5301200, 3815418, 2846737, 6344554, 4890285, 4768514, 5950651, 4488235, 4378288, 3825488, 4155023, 3431869, 1957667, 3144579, 7237126, 838028, 4195458, 625180, 155554, 5307678, 4947387, 1887486, 4635331, 3622887, 7569181, 3396116, 2179813, 6996631, 4252077, 2920831, 8377855, 7186373, 7622837, 14005, 6608758, 4499036, 3035172, 1234337, 7254380, 5105299, 148408, 6005161, 3432080, 13639, 2003384, 5769463, 5858572, 3857889, 813189, 3715140, 1475753, 6944958, 3544071, 724560, 104908, 7296815, 6067741, 1383606, 4129722, 907532, 1403293, 755174, 4398644, 5230183, 8066317, 2105592, 5575801, 1645449, 7565416, 5657156, 7550370, 4108611, 7534569, 896362, 4765719, 3221190, 613572, 2092690, 792254, 4309606, 5509641, 6336741, 641397, 6686490, 3419670, 6878267, 3607956, 1993871, 2957681, 5678862, 481815, 4170642, 7994150, 4853036, 7795358, 7407786, 5727510, 921246, 3413862, 2937336, 2046037, 7689675, 1728994, 1171872, 3292917, 6974300, 3360533, 7093990, 4786257, 3524684, 7951506, 1900547, 226314, 2597794, 5413871, 303160, 65829, 3648276, 2861087, 7300694, 877131, 7693614, 6194507, 5566740, 5278074, 528911, 7291501, 7893689, 7724012, 1667383, 280795, 7728098, 7265318, 4230753, 2174001, 6241165, 5755690, 662207, 7048442, 7647728, 632097, 8272440, 5133894, 3984322, 6871442, 2245913, 2041098, 6224492, 6799104, 5132700, 2972312, 1925503, 7623937, 7158503, 605114, 299539, 7438859, 5048818, 5491804, 5246430, 2023735, 4460221, 5647008, 3746400, 3177830, 6624184, 3053185, 5056865, 5316026, 2710083, 4362380, 1274393, 1268610, 2785680, 6875187, 3106891, 5830736, 3946591, 3291432, 6204471, 1074766, 2474591, 652928, 5931895, 3227532, 3474876, 498899, 7075396, 2781731, 7647885, 4273539, 6715984, 2597718, 7208169, 4233331, 2430566, 5984397, 4658665, 3834807, 4404187, 8156040, 6115137, 1258427, 6403704, 1627989, 766815, 7219507, 4590834, 4447176, 3968407, 4973019, 309406, 3567447, 6504506, 3942900, 7650186, 2030157, 2719629, 7781989, 5492568, 7847443, 438690, 1799522, 7766241, 2070949, 2323682, 2168258], +[2276159, 7337188, 7586299, 1787140, 3908649, 545777, 2049367, 3038981, 7118485, 8049766, 3621486, 863391, 2890554, 8668, 2004767, 838845, 3519926, 7626474, 4487058, 1877858, 5438558, 4443113, 2213278, 2577367, 2472824, 7989757, 323915, 2067342, 689365, 6437828, 7664897, 3232184, 7687090, 4028748, 547044, 4704213, 5822532, 642108, 76151, 3360900, 3550282, 369793, 8008028, 949558, 422200, 2015146, 5647564, 2712923, 3137759, 3803542, 4545506, 4419047, 6325528, 5478185, 2023085, 1597865, 3136371, 6585062, 3641668, 3656929, 8296496, 683795, 4020542, 3799299, 6746421, 487706, 4078763, 1841217, 2052239, 3294664, 5614684, 4537948, 3454756, 2168993, 4279061, 6136104, 5582916, 4729069, 7158419, 4862471, 2414460, 6159770, 2705229, 2135192, 2406554, 5547228, 720339, 2640422, 2067456, 7598260, 3402465, 3904070, 3656843, 3835479, 34973, 3085199, 7526706, 2035372, 2219468, 4748143, 1381422, 4439553, 5685324, 4495798, 2597174, 7052621, 5068914, 5574572, 60906, 5468916, 1160524, 4618599, 5066661, 4772704, 3003260, 571673, 1703480, 1764067, 7954421, 8032087, 3537220, 1585356, 3553725, 6832607, 983342, 8223523, 3497496, 7030471, 2588688, 6002926, 1361561, 3309053, 5198678, 5009855, 1475913, 2201133, 7545881, 1844850, 6708293, 6770034, 8218179, 1093183, 610981, 7197954, 6100172, 4325531, 1506581, 6590367, 8224328, 7909921, 5458884, 6975777, 3586841, 5247965, 1363414, 1083518, 6604031, 7535781, 5315957, 6035961, 1010799, 7173530, 6280418, 2732687, 7000718, 6843504, 3819165, 3129894, 3990850, 4423185, 3884946, 1265442, 1134864, 209917, 124520, 6242239, 7047350, 1555616, 4919468, 3724921, 6692055, 7053549, 7221878, 6599746, 2574954, 2753624, 7643035, 5448214, 884490, 1898717, 1945606, 6780368, 7208197, 7920212, 5295447, 7298616, 1723790, 5949675, 659581, 286231, 242283, 3867257, 6365761, 2088174, 1445826, 4454046, 2538009, 3781371, 7812249, 6704886, 516014, 1595300, 7219271, 6771979, 1502289, 3920812, 4309438, 4054168, 6513125, 5469848, 5538949, 5833539, 1789947, 4980513, 2528293, 1810810, 1037523, 7883135, 6412161, 7929664, 7408191, 7861128, 4646238, 5166485, 5144583, 5739762, 1731372, 1466201, 7977220, 6977699, 4315207, 6992200, 3280984, 5671110, 3402538, 2194984, 6694420, 1810473, 3368645, 776298, 140395, 8302754, 910760, 7977249, 2754154, 16598], +[4991109, 3907269, 586589, 6062954, 5753798, 6665990, 2325849, 372455, 8129687, 8363465, 485795, 5114757, 3691818, 7015920, 7093902, 2278483, 1844223, 3144846, 4600075, 4648783, 3793584, 8336172, 2638458, 1399586, 1351204, 3117814, 8280391, 1791423, 8127379, 7589341, 8293223, 8052991, 2334753, 7173943, 6817190, 7010520, 4991921, 6107706, 8163810, 8209566, 2898646, 3923926, 805658, 7173080, 1901129, 4125547, 1361100, 8028091, 3052046, 2607267, 4234556, 8235642, 1031668, 2637180, 3884331, 8100271, 143325, 1848130, 7247915, 7050356, 6072792, 2505962, 4092440, 156283, 1152252, 2393534, 7223927, 2366306, 545909, 4299631, 782331, 1034687, 1980812, 5249753, 556308, 1238002, 7057210, 2591644, 3158575, 3999497, 6794899, 7923163, 1115246, 6795917, 7213380, 1997756, 1003253, 7044832, 7235083, 3845331, 1556166, 1548960, 3224966, 3832645, 6722952, 2419642, 6380838, 856583, 2904551, 5648453, 4526977, 6917330, 5179571, 5487868, 941635, 5648215, 6015115, 7900977, 4749206, 7954437, 4336955, 2098228, 6153691, 7019705, 4296287, 4997305, 1188789, 3895069, 40517, 114951, 2599255, 153477, 5556945, 1812593, 4021191, 1859661, 4175545, 3167381, 918395, 2360055, 3444553, 361874, 3062366, 6763889, 2445704, 68750, 7632663, 786904, 4685835, 8002456, 4192729, 5760888, 3366498, 5797990, 8357651, 5535316, 4388336, 4030798, 7967781, 4660529, 3852506, 8143424, 4752292, 307952, 1493754, 7510188, 6495932, 5075563, 3053488, 4386769, 2694573, 4902252, 1203625, 3795235, 3620718, 1573628, 5202970, 3235236, 7808439, 420447, 4759778, 6267380, 3915950, 5567276, 3964599, 6007864, 1533852, 2145561, 5937883, 3822215, 2135474, 2910518, 6008247, 7843690, 3912393, 5179193, 3327863, 4822621, 3958872, 7574701, 7768760, 7574791, 3200335, 1322185, 7808170, 3521928, 268088, 3538276, 3966494, 6382985, 5122424, 4214990, 96730, 6419390, 7975222, 4321889, 1929328, 5721006, 8269034, 4203033, 879215, 3642131, 6886777, 6973960, 5503982, 6560604, 8078468, 6064736, 1296181, 141610, 1668970, 2440517, 8149265, 1619975, 5220839, 5051546, 7150628, 7648019, 7937522, 7036941, 5221363, 1274376, 5464561, 4922638, 4091644, 6841757, 7482052, 5598009, 2175838, 6849784, 4035430, 6846295, 2866898, 4190656, 646574, 7172848, 7414881, 343399, 4619800, 6182378, 5949963, 7954224, 6553973, 5662394, 462421, 3556002], +[6885229, 4604296, 4725779, 2429067, 7812135, 380345, 8144350, 4550488, 7683444, 2086316, 2687, 6311051, 8316591, 1134905, 764565, 5965465, 6096109, 2136053, 4249748, 5942633, 5040916, 4648845, 3378470, 2106526, 7311439, 4691062, 1943901, 2329109, 7407017, 3336754, 4116615, 2324171, 5787420, 6245768, 6940518, 1806521, 4836623, 5040965, 883996, 3044132, 2422638, 3690199, 1944031, 1095242, 4762435, 8043835, 5176778, 8133846, 3108939, 2196233, 2403452, 2563390, 6406667, 1004317, 2416541, 4054499, 5203998, 1217022, 1006446, 6539396, 5007197, 4749712, 6343622, 6158592, 2948892, 6314352, 1130287, 5756795, 4443848, 4725217, 1483542, 2678874, 6177845, 2545886, 1601222, 6831460, 4268242, 5032608, 7410926, 4422064, 3635043, 6498332, 7439468, 1988693, 166147, 1975268, 4167725, 634461, 1681447, 698987, 3181162, 2464223, 2795038, 8361682, 315619, 849219, 6138490, 8275051, 7358116, 3260647, 5009084, 6952680, 1537825, 90492, 1704264, 3324205, 365698, 4467358, 2935585, 6456283, 7880360, 1027256, 3746689, 3470222, 6022313, 5885309, 3310149, 2261937, 1888501, 3410214, 5217319, 6353683, 19561, 175946, 6586044, 1239123, 7630473, 1544082, 5030992, 1271255, 2412908, 7272448, 6085293, 3699425, 1346869, 4567239, 6603363, 7437647, 8051205, 6198399, 2992771, 494267, 863409, 4319333, 7435145, 1659691, 8030517, 2024218, 4901705, 2207429, 6586284, 7616882, 7441010, 3289095, 625404, 7950444, 8192916, 953325, 4227443, 2235130, 3601894, 1472373, 3762825, 1843988, 2623755, 6933981, 1990059, 6013913, 2341931, 4898857, 7203767, 5703364, 3242653, 579501, 6216902, 4404254, 5972157, 2789349, 3036287, 7498883, 2573728, 4635267, 3958520, 3791197, 5879884, 3387420, 3019258, 3044993, 4662605, 6423405, 3314996, 1100949, 3300593, 6324299, 3085266, 2904123, 874866, 514363, 5288300, 5344759, 4126887, 3203708, 1640490, 1451254, 2400453, 5283239, 6404715, 2064020, 6680582, 2151818, 499872, 4099524, 591246, 1586715, 6550928, 4998606, 3814765, 1335363, 6890397, 3032373, 1676916, 5704296, 3448102, 7531013, 769797, 7126549, 1168981, 5373293, 2219241, 2748691, 6523648, 1503228, 7002418, 2782148, 3238674, 5674031, 7947886, 5019923, 4146208, 4618195, 6881494, 4760476, 6893418, 6827137, 1887253, 6167450, 3599759, 769058, 3643769, 7443716, 7493680, 6311505, 869719, 7528635, 2952595, 4490408], +[4747136, 389335, 7662797, 8117388, 3835580, 5384398, 7216539, 6907247, 6534651, 6490049, 1133453, 3985816, 812389, 3122916, 639849, 3210115, 2992278, 7827360, 6684258, 2831831, 906820, 6957251, 5707498, 4166826, 5115465, 8185903, 5050388, 464927, 414211, 1136285, 7096179, 293112, 1766115, 5272589, 6261178, 1603539, 2554331, 3644222, 4246274, 1219534, 1359851, 4526458, 4044910, 3428955, 4887145, 3732089, 7293540, 1957697, 1908860, 8042769, 5820248, 6896171, 496268, 1725052, 6201560, 6388088, 5190711, 425849, 1954089, 7795276, 4267056, 1036266, 4405729, 3501756, 6391537, 5538072, 7008013, 5624044, 1413123, 50506, 2553152, 3770224, 7721336, 8262724, 44262, 5485051, 6560093, 1339247, 7979747, 1800314, 4057885, 7179653, 5378561, 368222, 3461584, 2691961, 4619154, 2881683, 6163629, 4429959, 4243472, 3173397, 955752, 3342651, 656202, 259825, 38479, 7787834, 3748902, 5105735, 5986747, 401379, 465231, 6485270, 1222118, 1892947, 1079554, 33707, 3945770, 4151990, 294734, 3399847, 7845738, 330230, 157876, 1002743, 1542329, 1524041, 7659848, 5655461, 4340192, 4821737, 2162039, 3840571, 2280487, 5007058, 1456103, 4978571, 4633290, 4297101, 5463076, 2753348, 7911684, 6763800, 7171432, 5399191, 2797666, 6429587, 2562121, 4825074, 474038, 693987, 3116924, 6206716, 8140596, 2317498, 8310582, 4264907, 48040, 2761671, 4015777, 1884047, 641, 1516145, 183276, 7535185, 5499674, 3728792, 7800823, 8248651, 6679594, 5448051, 5968460, 4339821, 2965031, 5968707, 6063982, 3922299, 5296633, 4793893, 7579410, 1746278, 6296392, 139452, 1524820, 635563, 2210092, 4853425, 6083559, 6241651, 1595166, 2656435, 6568541, 7340894, 2486640, 5659987, 5771710, 5599572, 3789803, 1654350, 6184559, 1915649, 6468973, 4913402, 5342900, 1594436, 3908292, 1750622, 5475897, 725917, 4796998, 5173311, 7211384, 5489244, 4172936, 5791992, 804989, 1334329, 3520930, 8229557, 6185493, 1517540, 4016298, 4944674, 181338, 7249524, 6660233, 4194026, 3487746, 4050994, 1727733, 5790994, 6088657, 7407568, 3615986, 1374034, 6861027, 4012296, 4795074, 6351953, 7709670, 3869077, 7052380, 711215, 5261529, 989706, 3354103, 5291294, 5270686, 2543272, 5664362, 3855999, 7901454, 4671320, 7477129, 7694737, 900417, 4963190, 854482, 811429, 4560251, 1803156, 7201326, 4833805, 6429765, 1169112], +[4556891, 1824098, 239439, 3819970, 5659273, 385399, 2765989, 7797397, 3120677, 2962941, 209788, 2050857, 2322757, 1951173, 7659775, 1420146, 4947465, 2001984, 6678087, 8231520, 6029242, 5070664, 5422470, 3124475, 1156679, 1658010, 6178254, 2524959, 360715, 8044560, 7471404, 8096601, 7198975, 7317818, 4884801, 8349917, 7727081, 7071105, 6540580, 294259, 7230696, 1377339, 7015690, 3169802, 8275058, 4543649, 5491438, 3827986, 2856872, 3238620, 822501, 2500841, 32380, 6753682, 8368780, 6850127, 2750498, 7010748, 2149658, 7668401, 3066620, 1441847, 3954301, 7637228, 3507730, 6836831, 3044836, 1260484, 1966495, 3634327, 1328584, 7899229, 4114852, 4127609, 6078337, 4141401, 1872302, 4076357, 2422543, 4223252, 4163248, 1610441, 3103341, 1188354, 4944210, 5786850, 1342238, 195142, 7051530, 3695129, 1614274, 5882180, 2410933, 3371091, 1487553, 4087442, 4290164, 4415504, 1428707, 2412315, 4396642, 8264903, 4514750, 4730623, 4108948, 5042719, 1663374, 6718756, 8083005, 8056364, 355593, 7650601, 5240967, 2049482, 7760859, 6263560, 6490057, 1119636, 7855203, 1648559, 3409023, 3237821, 7865019, 3278566, 637042, 4527028, 4873133, 4286538, 2427005, 4742331, 2686196, 2552718, 6849666, 294041, 4909396, 5364221, 4376302, 915267, 1541302, 5319115, 4224260, 2880649, 6599216, 6837847, 7104952, 5059263, 1792855, 132592, 122871, 4262755, 7771486, 2558697, 5075260, 1430517, 7867445, 174191, 5748413, 6381600, 7050066, 3049672, 2746287, 2731080, 8114209, 4969274, 872309, 1270690, 1653782, 1643803, 8019820, 3825467, 2974292, 4741018, 5441311, 1071985, 5228666, 713894, 5802960, 1723788, 6173189, 2727848, 3862266, 4331710, 1881961, 6007975, 4699287, 5821479, 4675629, 1035175, 4033134, 6029199, 6236405, 2302870, 6989361, 6985727, 110264, 6925945, 5834418, 1351925, 6228324, 6945638, 7617401, 3478169, 3623435, 6853144, 3361066, 1635758, 4586184, 32742, 2592485, 4101808, 1018555, 286986, 8353752, 7399079, 1528145, 3429129, 3740734, 60232, 8211003, 6406938, 6598060, 5945777, 7107961, 405338, 511477, 146428, 6598459, 1128908, 6431083, 5783065, 1509497, 6457238, 1954717, 3179853, 2825411, 291847, 7325731, 3075033, 3420317, 6693619, 3028668, 47562, 6154441, 5738385, 4639450, 5672715, 7709445, 7270017, 5167395, 4698328, 5430194, 2129107, 3500360, 582311, 5156926, 7626970], +[6005898, 8151477, 4291178, 3518324, 5461855, 5324846, 7256057, 1982610, 7159157, 2015938, 6197616, 4997862, 979173, 2232049, 4251050, 5413264, 6293536, 4782858, 6198556, 5055018, 5274874, 2033801, 3298727, 6366179, 7965609, 5546935, 5701041, 5291416, 8195625, 5017391, 2673518, 3139238, 6816702, 2123335, 646532, 7711463, 5856499, 2534908, 295029, 3824350, 996572, 1380250, 2152224, 2712889, 6249002, 8114002, 4246562, 52867, 1500186, 5211968, 3032365, 5910767, 4330183, 6252276, 4734750, 7199426, 5641786, 4019663, 7624124, 2765156, 5184206, 4611183, 8310539, 5499469, 1695877, 3964178, 512383, 7524192, 7716802, 3690117, 720671, 2726916, 1817191, 5018493, 7900759, 7524570, 1607349, 1116219, 2594705, 6927422, 8001547, 5845518, 3667146, 2795162, 292457, 7244092, 4126800, 6565810, 564693, 4426749, 4520825, 4057251, 3438244, 8094052, 5039204, 1703548, 7403397, 572162, 2764277, 4809199, 5271090, 3937306, 7048419, 2087901, 5426276, 7792639, 6580075, 6578289, 5984145, 18786, 655335, 3428749, 115160, 4856013, 6637648, 6247088, 4841103, 6702413, 1347551, 3053143, 1914812, 3468076, 2654820, 7451389, 534762, 3610700, 5577319, 481503, 4724645, 3587857, 2957063, 2666899, 7645283, 1143141, 6870155, 5230343, 6188084, 2400898, 1941804, 2938333, 366918, 1895749, 6023352, 1231834, 2796184, 5960429, 3593859, 5374589, 4329570, 5471508, 7408111, 7020848, 7301944, 3617384, 6619969, 7598857, 3084694, 2015810, 1020508, 5706321, 6475102, 7847748, 7745160, 84659, 6775309, 5184660, 856656, 46810, 3255767, 2217528, 1650213, 1530029, 5670064, 4977489, 3751037, 2698680, 324375, 208117, 1908443, 7407199, 6106521, 408077, 3381121, 1289532, 3393863, 3384772, 7132692, 3657484, 2376078, 1666269, 7674803, 2611823, 3634930, 3615384, 4827833, 5947695, 8348721, 7485697, 1240370, 2175933, 1628526, 4037535, 899926, 8027569, 1692718, 4800453, 2681150, 5027375, 2179139, 4497459, 4097274, 6716522, 4532503, 2639718, 6834426, 1055295, 3140518, 2264911, 202030, 49635, 7526526, 6565712, 4254562, 379857, 3942668, 7845306, 2438961, 1142245, 3105941, 467807, 2746694, 1992368, 5687853, 4474229, 1366176, 7712787, 4623152, 5355928, 241415, 1914514, 4093355, 5915183, 7303744, 6830703, 3306027, 1172668, 6374361, 5522637, 725117, 5248358, 7328649, 4290757, 1558745, 4591504, 5959082, 3841663], +[5241048, 640128, 1856278, 358125, 6406690, 5708373, 1814274, 6765413, 5912712, 429661, 8175856, 1217095, 400922, 1308683, 4453582, 3797370, 5752938, 7720107, 7890927, 1026895, 5778212, 603402, 3428962, 4886401, 7998649, 1581129, 1895905, 8283606, 6612473, 2861784, 955011, 1624634, 272036, 5348771, 3707657, 4745053, 4321662, 6552754, 3873607, 7269344, 1516672, 3116331, 1577115, 4726487, 7249482, 6004991, 221228, 4065233, 2686783, 4224005, 2289006, 7785968, 7943012, 3373, 838103, 4866498, 3597139, 3132181, 5003987, 5162869, 6739589, 123893, 5021881, 672956, 886059, 8095039, 3867024, 7156761, 7685971, 3418484, 6787728, 370384, 8342499, 6284004, 7450598, 6018907, 2876252, 8312144, 272987, 4815966, 738704, 2053743, 507004, 4847436, 6247502, 1162609, 4412674, 2014297, 5592532, 8297244, 955731, 2392032, 4790801, 3276687, 7034819, 4096810, 7005377, 7718966, 3858907, 5215034, 2263631, 5838332, 3713119, 474675, 6921604, 6797272, 6737808, 3466588, 3195878, 6379602, 2173160, 4331799, 8009923, 5349440, 6975150, 6447689, 3900440, 3323125, 4827529, 6267799, 5051210, 5279169, 6304940, 619662, 2656958, 751836, 6331999, 569553, 8348492, 3594281, 6807500, 8185537, 219013, 2819942, 6845714, 5262306, 1655165, 358315, 4823804, 7429698, 2628222, 3208550, 5622008, 2889556, 5559393, 6656973, 6431879, 6987471, 1967698, 5330781, 4973335, 4919690, 1046153, 6441556, 4189278, 175008, 360213, 5002772, 1562271, 1843186, 5933440, 6851209, 6689108, 2145522, 6680129, 2391126, 3743183, 5613936, 765484, 616547, 891464, 1377523, 5249964, 707930, 6843699, 4593067, 331169, 2651760, 5208814, 3006332, 7996599, 1038395, 5598215, 1975264, 2051432, 6181445, 1718163, 2606207, 1439647, 7283154, 4118977, 3145989, 7399181, 7212895, 1547343, 3325251, 3342764, 5809079, 1888333, 1948844, 3753765, 1014686, 6987052, 8008388, 2085482, 3705972, 7722710, 7306457, 7022565, 5895770, 6963132, 7402558, 7423764, 4862477, 2086753, 7183074, 8183556, 4190235, 5980521, 5258655, 3459396, 104474, 5872499, 1068338, 5688516, 478201, 8054312, 110837, 3685239, 1589900, 7620524, 5557668, 5129342, 753034, 391746, 5653160, 8127761, 476724, 1636549, 358492, 31087, 4355238, 2187093, 8348843, 4886242, 1680131, 7266140, 5880175, 7452251, 7897815, 8236767, 8115733, 1538366, 2628728, 6520350, 6779371]] +NTTInverse(aHat * s1Hat): [[4200210, 4078470, 2691151, 979714, 3056064, 4106053, 5083725, 7794482, 269738, 8322132, 1813450, 3894380, 144005, 6350291, 5434749, 911790, 4566374, 7419350, 2303506, 4661661, 1551022, 7168093, 4744713, 7715500, 3025283, 2680461, 1318264, 4993426, 6891155, 8033053, 5838813, 5047757, 3772135, 3430779, 472832, 5998817, 1338430, 775811, 7093373, 7410958, 814343, 7151529, 3451479, 1625482, 8278417, 5424683, 1938777, 6854035, 6011505, 3849691, 6301540, 4580127, 1465270, 7448920, 1192228, 6733809, 3540232, 6079835, 6219522, 5671304, 5805338, 4310190, 8231550, 2317065, 6080229, 6190598, 1424413, 4207320, 605752, 3672336, 3121229, 1498357, 2028597, 3502038, 2285064, 4605330, 4799543, 5979845, 4465892, 2227064, 5138212, 7710153, 1124627, 459279, 668895, 4601150, 4204238, 1443647, 785334, 6627681, 6979782, 30282, 5181569, 664701, 5834365, 3619832, 8012093, 4134652, 2279538, 103277, 3289225, 6453009, 413615, 6848704, 1986449, 5660083, 1427130, 3144061, 7895328, 7039939, 2720687, 3292155, 2820786, 4557152, 4339217, 3239605, 2630161, 3536451, 3289126, 7205080, 2171479, 1638374, 1699203, 2732010, 3888807, 3809857, 5228290, 8358670, 5838505, 6590284, 2532697, 5636865, 7725617, 5849529, 3402014, 5243909, 7494053, 3806846, 2975343, 6944657, 197386, 2668077, 7429284, 7463952, 4034182, 3764420, 4808472, 1328472, 2638693, 7052528, 3924630, 5567143, 643984, 7980146, 584179, 6772730, 1191944, 5705123, 6847795, 4298308, 3674341, 30026, 2226428, 1004894, 5212871, 881588, 7112576, 3871317, 4533464, 1044369, 7867098, 8267246, 2232174, 2343072, 571699, 5854078, 3888292, 5156829, 654789, 1569568, 5081038, 494706, 955562, 2850999, 7215908, 3913313, 1769923, 3088271, 4399968, 3766179, 346093, 1201464, 6141322, 569198, 2234422, 7624521, 4545802, 6269847, 6404110, 487756, 4570722, 5342030, 6223350, 183711, 3354408, 3593038, 6563701, 3938350, 140597, 5602799, 7592537, 7349170, 635144, 7139654, 584897, 1791578, 7890734, 3684164, 3783904, 4283562, 3465874, 2044450, 6651105, 7466985, 6496511, 6393859, 6134186, 750865, 3176111, 7920742, 6844712, 6372544, 56056, 8238631, 3209420, 2093371, 8199189, 5604506, 219653, 3895870, 5537094, 2424621, 6386025, 634503, 6602462, 2779209, 7333630, 367434, 208467, 2697552, 6242895, 4281711, 7247269, 5419613, 3350500, 3753196], +[3395615, 7382856, 6134019, 7203116, 4640363, 2350333, 6043129, 5953192, 8010030, 5433125, 5773725, 4459948, 7536554, 1647344, 1699921, 4404626, 401705, 7268014, 7727277, 175753, 6336589, 4830357, 3649866, 3168903, 2386641, 2166840, 7576180, 5919326, 5725146, 7907383, 4503288, 2884310, 7107146, 5534308, 1711072, 8268535, 7126994, 1195720, 152511, 2883111, 6662672, 7642045, 6509674, 4805832, 5448089, 1574664, 93432, 5735580, 1579055, 3054194, 7087337, 1651500, 6433402, 306604, 7238417, 7717815, 1327616, 4705411, 5329079, 1349780, 255284, 4067605, 2061597, 7053041, 4956381, 1183367, 8308362, 6753956, 3666184, 7433726, 1438513, 7950830, 6683695, 6487864, 6397587, 2294339, 1326783, 2528098, 3736113, 3432165, 7959134, 5394253, 3039309, 3855811, 3471609, 5587005, 3016201, 4315875, 3085890, 723618, 2876567, 24919, 3718200, 2484840, 8363137, 4104195, 1619741, 510832, 6504624, 4392114, 7219299, 2336720, 5270809, 968154, 7742678, 6421526, 5982398, 604610, 4485295, 5483118, 1087986, 2420613, 8250658, 2972397, 6087429, 6587405, 5408374, 246125, 5329450, 5016993, 2702558, 7584686, 526029, 6613613, 6752745, 5155261, 1756106, 5524116, 312234, 528780, 1104228, 2367700, 7591249, 758441, 410137, 3264460, 520068, 2693930, 3291196, 641215, 6148871, 691540, 2371726, 5359748, 1616884, 715914, 745144, 135538, 1096659, 5777373, 960842, 2729767, 6916091, 2118014, 2188234, 5227070, 2779640, 3596137, 5802539, 5578436, 2904972, 6014510, 4710109, 4019761, 7600620, 2687893, 4172781, 3327174, 1705197, 6142137, 7176036, 6327598, 1988511, 6923568, 2890144, 4904609, 1102234, 745703, 8032404, 6943553, 605237, 7467543, 3779671, 4189978, 2943051, 5308687, 5676016, 1239832, 2953273, 3346467, 7282974, 855028, 3849887, 3732960, 1344397, 8226774, 6603917, 51060, 8199632, 7526740, 5624231, 5374307, 4543328, 8210830, 3083862, 7233942, 2516294, 401126, 183675, 6239069, 7473986, 2068907, 6614057, 2502659, 5880951, 8177718, 4815704, 7594979, 4927934, 3652104, 7519171, 5329921, 3474544, 3318119, 7591743, 3768413, 4569726, 7747867, 1712964, 5007983, 4462163, 5000718, 7154664, 3825133, 5805500, 8084403, 2236649, 6710948, 5072714, 3426793, 7983850, 6780606, 3677395, 1407082, 7860466, 1077708, 7364494, 7939604, 2431652, 8007446, 5933526, 1493553, 2641167, 1210822, 2339983, 2033318], +[8049065, 5172075, 6609228, 392917, 1378445, 2628393, 2778725, 1169299, 4421628, 3700041, 2203570, 2269677, 4755417, 8020717, 2242828, 286164, 7801757, 5795876, 2089000, 7876775, 4732355, 2694836, 7217667, 2444829, 3989582, 3046824, 3608035, 1127497, 4793604, 6866, 1141034, 7836431, 4340222, 3905186, 5004529, 6927362, 1708206, 6515607, 3135190, 279647, 2778002, 4701846, 2666026, 4875151, 1591246, 5919261, 4269781, 4996074, 6702296, 3608843, 7665813, 7110166, 4948171, 3998820, 416201, 405993, 4061978, 6970667, 5720765, 2128898, 5698319, 4900726, 3996248, 4520198, 4606922, 7711035, 6573045, 4050854, 1196088, 5826679, 2516846, 3677357, 2223870, 1955291, 2510668, 6213747, 6910481, 2188986, 4678774, 5066127, 7577016, 4763932, 2538891, 241147, 3821305, 3295805, 4442066, 2393555, 289980, 6124508, 3560066, 5033703, 7449932, 4647415, 3863937, 6809685, 896030, 4765413, 925016, 4476930, 7032469, 5597046, 1523165, 5369679, 1934591, 1767998, 6504521, 6402810, 3550319, 4300986, 7087231, 3865144, 7683931, 4590921, 4094222, 7333278, 7214799, 1362864, 6039770, 6030430, 4312464, 520097, 892824, 4648007, 7416492, 1447312, 4971887, 6032397, 2100685, 5207449, 3202133, 6821140, 976692, 2777702, 3972425, 5918317, 3571211, 2862277, 7088104, 6398823, 1208533, 5800544, 8222420, 5929355, 6473109, 4200675, 80856, 2527625, 5209779, 166608, 7197128, 1329998, 7770290, 4353565, 8086686, 5593189, 4234068, 6182972, 6339434, 6741902, 514049, 3357626, 1801881, 1518448, 6494335, 7501432, 899098, 989730, 3786385, 1503236, 3359571, 7208838, 1328534, 5922544, 6273989, 4746132, 2712246, 4182320, 2741887, 7782529, 4095533, 5559823, 8119672, 3096272, 1159754, 1722381, 2670450, 6812717, 3709331, 3457109, 4472479, 6071864, 4096892, 1834566, 1627778, 162942, 4553203, 8351377, 1255355, 725028, 3854137, 4809739, 1105069, 3917255, 6884253, 1567879, 2422764, 6465132, 174074, 5146566, 3162097, 5778981, 2171131, 6275701, 4184236, 2851540, 3848023, 2267416, 4908926, 3942278, 3355668, 5172771, 5880290, 3498861, 3633212, 5318487, 1071182, 7998822, 8097262, 1404005, 1526558, 6435772, 2427415, 7432902, 7108210, 258632, 3477560, 2348227, 3468452, 8259272, 7002699, 7429489, 5297830, 3362614, 1209779, 1335528, 7233990, 5240511, 7311296, 6137179, 7050625, 7673457, 5227004, 8020602, 6506008, 7686123], +[6101483, 4606584, 5791266, 4946564, 1939739, 7680607, 2203240, 1399982, 723336, 5046118, 979604, 5954501, 6201328, 6789404, 1253168, 7756452, 4625995, 6185599, 1980754, 3594967, 6422446, 7026615, 1957722, 5645514, 7740321, 4686960, 1331305, 3455585, 4905752, 7248286, 5668416, 4541871, 7290249, 6607676, 4710195, 6157613, 6050426, 2245346, 328195, 18898, 5467410, 3973885, 836464, 6054939, 882890, 4228150, 6656591, 4884894, 4301028, 3781472, 3802560, 5042982, 4001583, 6977952, 6216344, 5397040, 6551939, 3621383, 888563, 619527, 1698509, 883422, 6833706, 2767492, 3272630, 1399120, 2120714, 3416149, 313668, 2465175, 284628, 2975810, 2157312, 8230265, 569007, 899778, 1050864, 6174648, 4838925, 5531527, 8118473, 194087, 7159289, 1586731, 940165, 5710507, 8237211, 752695, 8377810, 2108961, 245408, 3633402, 3406353, 7756894, 915776, 3426303, 77615, 3312955, 5112254, 2114792, 6882233, 7160736, 8331429, 4902412, 5339840, 7711840, 1575016, 3006408, 7473389, 3908195, 1633362, 3207765, 2190299, 7898371, 8182241, 3586833, 3441970, 8058594, 4604757, 1640108, 3125270, 3070971, 1324951, 412024, 7152836, 1101259, 2121152, 571480, 7694311, 4089498, 5311801, 3623706, 2292161, 6885184, 8306939, 6037653, 3204929, 4400529, 5449985, 3206124, 2299664, 4950800, 7735007, 4165039, 6923982, 5679551, 357275, 2665031, 4353778, 6333662, 3185161, 1278337, 4139572, 2592024, 5624921, 6573986, 7233749, 3327772, 5210746, 3902728, 5514813, 6534265, 2456052, 3162345, 532999, 4223448, 7489596, 859443, 305355, 6199902, 5479235, 5481982, 5328625, 2657107, 5473449, 5673607, 5137783, 4669339, 1518053, 2822529, 4137803, 8087879, 3027512, 6902316, 3631730, 3476992, 5785608, 6805474, 4536585, 5685895, 7221238, 6050350, 2471067, 322960, 998597, 5995092, 7638241, 3134903, 3359920, 7271318, 60600, 1664580, 97368, 458931, 5784844, 1117172, 3075636, 811007, 5640254, 756329, 5200973, 5829774, 229452, 8193437, 4332508, 1357113, 3431270, 3714424, 4303942, 3905281, 5999273, 7989454, 5183870, 4465407, 6941647, 5619025, 7345892, 6574985, 7793882, 2142708, 1403489, 6862979, 8056689, 6585185, 8180850, 6650289, 7718853, 3410291, 3766890, 4818030, 4042865, 3378722, 7694849, 5679798, 4862443, 2276925, 4627990, 5247272, 8202471, 4594784, 7338082, 6401932, 3907070, 5180152, 5085183, 2731041], +[607033, 8370673, 6814491, 1988463, 2641459, 757384, 7467239, 4660425, 1902074, 4501430, 2717782, 8017822, 1058410, 4341092, 3899939, 2865375, 3450516, 7541455, 2155830, 6039444, 2496260, 5623614, 8188483, 3353329, 7542277, 856471, 6576744, 5265237, 8169542, 1973031, 1805820, 3014477, 604358, 7216983, 8368164, 4894597, 2098049, 2000117, 4551418, 6338805, 1832710, 5715364, 107983, 441655, 7453645, 5673680, 2943285, 6896764, 2565843, 7777466, 7545319, 3908433, 4476851, 231791, 4134426, 6482706, 5536022, 4823669, 3681411, 3567805, 5047872, 7893663, 1483051, 853187, 1248655, 8160500, 3327582, 7402474, 918171, 4961336, 263684, 1084263, 4908175, 1436887, 6003635, 4595359, 7601243, 410637, 2775456, 3154799, 223862, 523919, 6836012, 5443000, 6604513, 3262063, 7597320, 1959990, 7778533, 5639235, 5698221, 1390096, 3868531, 7606398, 1348663, 6776313, 6876298, 7429224, 1122406, 8138412, 479568, 8088562, 778735, 3085321, 4235411, 8164471, 2274865, 4413653, 3463249, 8078388, 2240183, 4544116, 3290801, 146748, 463740, 1259314, 3653428, 7511606, 4081635, 6469278, 63588, 5964737, 7074148, 6607683, 6949247, 5467165, 3525945, 896004, 1375620, 1226342, 4781604, 359048, 2859174, 7889652, 8058958, 8013117, 6717093, 3423051, 5289875, 3758943, 8101600, 5531336, 4874399, 798438, 4103047, 5927025, 1804025, 2791497, 7070085, 8315533, 6344215, 5240583, 216799, 4396321, 2909510, 710534, 2780863, 7290966, 6423897, 5687520, 3512498, 7517354, 4755822, 5814197, 4559404, 5897245, 1451154, 3512545, 1839938, 5607965, 141513, 5127599, 6803656, 7885645, 7372449, 339660, 5720501, 2024346, 6229730, 2118703, 762641, 737880, 6563209, 6743370, 4384422, 226692, 6861065, 1755349, 5502778, 3016560, 191884, 1965208, 4613054, 5435992, 5129396, 6646963, 8074384, 6644704, 2651361, 3018694, 3633563, 757682, 4620204, 1889566, 2442923, 6937732, 7247096, 7769590, 5540976, 8224149, 799761, 3024610, 4769697, 2568438, 5707305, 3586030, 5589140, 6602714, 253130, 8279287, 2681542, 806221, 646591, 7533536, 597591, 3400310, 2954168, 1390196, 2759895, 7707938, 5348661, 7963207, 1096866, 5446238, 5121297, 889832, 3995003, 1900244, 4424512, 2704420, 7588129, 4870947, 4485251, 8093160, 1805922, 6610328, 4727787, 2193558, 6583119, 7004019, 8131714, 5505179, 2602885, 4100195, 5415329, 1452050], +[3114178, 1989458, 427606, 4342809, 360380, 5257612, 4182914, 4504968, 3282758, 4915455, 3580536, 8192997, 784823, 4674814, 4324036, 89502, 1175225, 1595091, 1011066, 2215818, 1675232, 5040917, 2499283, 6073868, 7094002, 6300655, 4070738, 4065888, 4977779, 6923394, 6441515, 3563096, 2685123, 5156495, 1061273, 5640642, 6088491, 3537426, 8239238, 2162850, 552581, 7350597, 5277318, 3740477, 1933348, 5447994, 3230561, 368909, 7879396, 4770818, 5875380, 3916148, 1594766, 6752664, 2418859, 3647311, 1307436, 5923925, 3681504, 1529783, 2364369, 5037464, 3866259, 7437566, 7664488, 6536495, 1956975, 4060190, 6679471, 474787, 914916, 621854, 4154325, 3276674, 3800958, 2017540, 3844989, 5291904, 5951163, 2736818, 7953326, 3853721, 3049169, 4296801, 1096520, 3731685, 7388898, 2932921, 7857234, 1775644, 2609129, 1443037, 100976, 2422674, 2586487, 5051579, 3978522, 5591606, 6143350, 7332741, 2963549, 1044350, 1773289, 4004596, 7016261, 4057765, 7130121, 8239100, 2674345, 4700150, 3298175, 6085947, 5312999, 4018090, 3805635, 3422060, 1656156, 251074, 7355205, 8156616, 6627328, 388234, 7124609, 74533, 6290717, 6738219, 4805379, 4001787, 1709631, 579082, 2918135, 4411271, 3749053, 3396035, 3053824, 2215145, 3219894, 4315242, 4442604, 4971866, 2484297, 1103148, 6352113, 2567648, 5360878, 4046056, 5252513, 479678, 7451376, 1982583, 4769222, 7028023, 1725160, 3822880, 6188467, 3752358, 7046119, 5148126, 1168717, 5286359, 3704735, 5828718, 6540623, 3275606, 3395308, 6660463, 2055803, 430531, 7517172, 4012902, 5700722, 2918705, 1186788, 2706589, 7778458, 6328622, 2500429, 825934, 1244964, 2407753, 2847436, 5007430, 6145619, 7068494, 1649995, 3393056, 2238769, 991417, 425821, 3352418, 205639, 5736797, 177662, 5532295, 2799649, 8073097, 3047701, 4793410, 6065084, 2201336, 501172, 2809324, 7438017, 38396, 1787204, 2214380, 1896714, 5441528, 63135, 4212477, 781537, 5341502, 2257133, 4390334, 2551447, 451069, 2025318, 753517, 8029634, 6155440, 3140209, 217524, 4058117, 5502179, 3528142, 4187819, 3420502, 1686789, 5702211, 238838, 2312447, 6862358, 8123586, 5749462, 7019800, 477252, 6846145, 5979647, 6568792, 7885990, 4758829, 7189537, 7286595, 6368874, 4404987, 8221630, 6106598, 530042, 7442257, 5052903, 2054784, 1506792, 7154725, 8051353, 3849621, 199113], +[2116719, 3421845, 2847422, 1150099, 4097761, 1864633, 8194329, 3467779, 3823400, 48808, 1626014, 1184796, 2728861, 5978728, 1879632, 3785382, 6920388, 222133, 1446502, 1903917, 5487587, 6459112, 4591992, 5138880, 7994017, 2574888, 4419821, 5012940, 4171355, 7468635, 5969596, 5537049, 4036871, 4284466, 7481456, 4920449, 7609955, 3929553, 8257621, 6817016, 2967891, 1769265, 5379677, 3565779, 347367, 5325722, 5480099, 2631671, 7212251, 7880842, 3980958, 2264085, 2627139, 4287004, 1648230, 1108168, 2105451, 2970230, 1820178, 5026686, 4997185, 6469323, 1308910, 5038259, 4744032, 6309725, 3393472, 225908, 1060666, 5184443, 4712433, 3877932, 3058857, 115639, 3815849, 2576916, 6585756, 2361789, 6703395, 6155191, 8321381, 2425971, 3816528, 1531265, 7210514, 1931138, 3493921, 6476254, 5267434, 2989141, 5509055, 7665759, 7228107, 435967, 2594485, 6446085, 6892219, 5059124, 483657, 1858682, 2407897, 509119, 3425983, 6372064, 4280231, 4810805, 7319785, 4801989, 7180821, 7140834, 4703317, 5011038, 5290714, 1567562, 4244867, 4187570, 7286102, 445198, 2772926, 6144097, 2087952, 853052, 6294402, 2932832, 6655568, 6433165, 6464008, 3097117, 4759918, 163839, 1455950, 956107, 2052853, 4195996, 6768456, 1402834, 737353, 6447343, 6140301, 893094, 4313928, 893615, 6942911, 811655, 5265621, 49498, 5002617, 3776116, 3053823, 6057471, 2903090, 8186192, 5185644, 4372520, 2634683, 4107034, 95426, 1830737, 1798535, 1224941, 4148560, 5727539, 6111476, 1996882, 8309987, 227939, 7816754, 8243296, 819684, 1841965, 718035, 6948390, 4712968, 2145628, 5803984, 6998073, 6476401, 5727670, 4616924, 4002108, 2674499, 5953516, 1821330, 3522721, 4980269, 318725, 6853364, 5234901, 6331659, 5533968, 7359003, 6252660, 65837, 7063189, 8239059, 2949055, 5577909, 8340837, 4434820, 7652549, 2828973, 3033856, 5997302, 2661927, 904990, 4605189, 8292511, 7404121, 6199913, 6400660, 7691291, 6527596, 6559847, 6878944, 6989283, 6495070, 7876882, 4021187, 4906427, 1941848, 7889927, 684733, 6018753, 5787604, 4780615, 3667108, 2262623, 8290209, 4847518, 3687614, 1719186, 3807512, 4126415, 513176, 6844973, 192676, 8362087, 4017628, 1487185, 3368234, 2838315, 6097862, 392005, 2397756, 6224527, 5728651, 477975, 6024395, 6879876, 1603047, 6593033, 4383324, 1403810, 3982219, 7742494, 5722991], +[7313862, 3439943, 2567310, 137916, 8191487, 4244600, 5253841, 2548624, 5733002, 5620118, 4444650, 7533731, 4698832, 579280, 5760201, 8328699, 6446305, 5322843, 1549474, 4678267, 7401283, 5429117, 6211707, 4666000, 1610894, 6229915, 2723930, 4923530, 962176, 7217883, 4326740, 4342079, 4015793, 4435445, 6945023, 266447, 6151355, 6058257, 4784990, 7979034, 6045541, 3008453, 4349926, 3051421, 2504440, 6621221, 5697657, 4370817, 8365527, 7672827, 6846228, 3366439, 3092085, 748955, 2134687, 2404271, 7130160, 4769951, 3975804, 3415748, 6428144, 5665806, 4747269, 3580518, 7619629, 2981565, 3994482, 5517587, 6000465, 5950615, 5287882, 3684020, 2696201, 2344936, 3429020, 383786, 1112162, 4589197, 945599, 5305963, 6528131, 4463628, 5724576, 5198179, 4299974, 767039, 2799664, 2124725, 4768640, 6497489, 1568935, 4829160, 4766613, 2868528, 6310334, 3459948, 4201388, 4028373, 3091498, 2899954, 3174940, 7187229, 6493489, 4683427, 4378311, 2860751, 5085874, 1052373, 969176, 3768578, 8050733, 1463088, 4804314, 968114, 4977281, 4865207, 5447579, 106994, 3627883, 3332741, 4649374, 982965, 2187074, 6523620, 1571838, 7728639, 7811682, 2263524, 7732431, 2278349, 5564044, 6371277, 809114, 8345406, 7621495, 3066512, 6542490, 5796925, 3539412, 6364903, 372704, 3309825, 1579438, 7578683, 6678277, 7456949, 7334289, 997632, 6024438, 4583708, 8208281, 3523534, 3429255, 4544306, 1328172, 3999819, 5255286, 6581208, 2025926, 8147913, 8072447, 2933302, 5320521, 6709177, 1418290, 7341339, 2230280, 3390661, 2330646, 3679767, 2748030, 4572071, 4741937, 7847649, 5564229, 8283833, 6823949, 6118882, 3306028, 5827396, 2311476, 997773, 959286, 2322028, 6258025, 3606887, 6652669, 6737513, 3638310, 6823598, 497892, 1128250, 4733292, 5401528, 333687, 6580057, 2811943, 371074, 801930, 4399883, 8377349, 1013102, 6449218, 6293978, 2872959, 2355844, 3067472, 1282869, 6079322, 6215689, 4531644, 1339641, 3666636, 4133798, 1459833, 3494343, 4234229, 4159020, 3848142, 1426642, 1242925, 2294354, 6029463, 783085, 3254154, 125688, 2717514, 3797025, 1046162, 3902775, 5586050, 6058244, 8289824, 5115352, 5815898, 6352152, 7197731, 7956374, 6850567, 3395372, 4470829, 8273569, 5604708, 599355, 4006397, 3356000, 3425834, 246510, 549613, 919264, 6720942, 1580358, 5945241, 2126121, 3002166, 6479288]] +t: [[4200208, 4078469, 2691149, 979714, 3056064, 4106054, 5083724, 7794484, 269740, 8322134, 1813450, 3894379, 144003, 6350292, 5434749, 911789, 4566375, 7419352, 2303506, 4661659, 1551023, 7168092, 4744714, 7715502, 3025284, 2680461, 1318265, 4993424, 6891153, 8033055, 5838812, 5047757, 3772133, 3430778, 472831, 5998819, 1338432, 775813, 7093374, 7410957, 814344, 7151527, 3451477, 1625483, 8278418, 5424683, 1938775, 6854037, 6011505, 3849692, 6301540, 4580129, 1465268, 7448919, 1192228, 6733808, 3540233, 6079834, 6219520, 5671304, 5805339, 4310192, 8231549, 2317063, 6080229, 6190598, 1424414, 4207321, 605750, 3672336, 3121227, 1498355, 2028595, 3502038, 2285066, 4605329, 4799542, 5979844, 4465894, 2227066, 5138212, 7710155, 1124629, 459278, 668895, 4601148, 4204236, 1443648, 785334, 6627680, 6979782, 30283, 5181571, 664702, 5834365, 3619831, 8012095, 4134652, 2279536, 103279, 3289227, 6453007, 413614, 6848702, 1986451, 5660084, 1427130, 3144062, 7895329, 7039939, 2720689, 3292154, 2820784, 4557154, 4339218, 3239603, 2630161, 3536453, 3289127, 7205078, 2171477, 1638376, 1699202, 2732009, 3888809, 3809859, 5228291, 8358669, 5838505, 6590285, 2532698, 5636864, 7725617, 5849529, 3402016, 5243907, 7494055, 3806845, 2975343, 6944655, 197384, 2668077, 7429284, 7463952, 4034183, 3764420, 4808472, 1328474, 2638691, 7052530, 3924629, 5567143, 643986, 7980144, 584178, 6772728, 1191946, 5705124, 6847793, 4298306, 3674341, 30024, 2226430, 1004894, 5212873, 881588, 7112575, 3871318, 4533462, 1044370, 7867098, 8267244, 2232175, 2343073, 571700, 5854078, 3888294, 5156829, 654788, 1569570, 5081038, 494706, 955560, 2851001, 7215906, 3913311, 1769925, 3088272, 4399968, 3766179, 346093, 1201463, 6141320, 569199, 2234422, 7624523, 4545800, 6269847, 6404112, 487758, 4570723, 5342029, 6223352, 183713, 3354410, 3593037, 6563702, 3938348, 140595, 5602797, 7592535, 7349171, 635146, 7139652, 584899, 1791579, 7890734, 3684165, 3783905, 4283564, 3465875, 2044448, 6651107, 7466985, 6496510, 6393857, 6134187, 750866, 3176113, 7920740, 6844711, 6372542, 56055, 8238632, 3209418, 2093372, 8199187, 5604507, 219652, 3895870, 5537092, 2424622, 6386023, 634505, 6602461, 2779207, 7333632, 367434, 208468, 2697554, 6242896, 4281709, 7247269, 5419612, 3350502, 3753197], +[3395617, 7382854, 6134021, 7203117, 4640361, 2350332, 6043130, 5953190, 8010031, 5433124, 5773725, 4459946, 7536552, 1647343, 1699921, 4404627, 401707, 7268016, 7727275, 175753, 6336591, 4830359, 3649868, 3168901, 2386642, 2166842, 7576181, 5919326, 5725144, 7907381, 4503288, 2884311, 7107144, 5534309, 1711073, 8268533, 7126994, 1195721, 152513, 2883113, 6662673, 7642046, 6509676, 4805832, 5448090, 1574666, 93432, 5735578, 1579055, 3054195, 7087335, 1651499, 6433401, 306606, 7238418, 7717813, 1327616, 4705413, 5329077, 1349780, 255286, 4067603, 2061598, 7053042, 4956379, 1183365, 8308363, 6753956, 3666185, 7433727, 1438514, 7950830, 6683696, 6487862, 6397585, 2294339, 1326781, 2528097, 3736113, 3432167, 7959134, 5394251, 3039311, 3855812, 3471610, 5587006, 3016200, 4315877, 3085889, 723617, 2876569, 24917, 3718202, 2484840, 8363136, 4104194, 1619743, 510831, 6504622, 4392113, 7219299, 2336722, 5270809, 968156, 7742676, 6421526, 5982398, 604609, 4485294, 5483119, 1087987, 2420611, 8250659, 2972396, 6087427, 6587406, 5408374, 246125, 5329452, 5016994, 2702560, 7584685, 526028, 6613611, 6752746, 5155262, 1756106, 5524115, 312235, 528779, 1104229, 2367701, 7591251, 758441, 410137, 3264459, 520070, 2693928, 3291196, 641215, 6148872, 691541, 2371725, 5359750, 1616883, 715914, 745146, 135539, 1096658, 5777374, 960840, 2729765, 6916090, 2118014, 2188232, 5227070, 2779641, 3596136, 5802538, 5578434, 2904973, 6014511, 4710109, 4019761, 7600622, 2687895, 4172781, 3327174, 1705195, 6142136, 7176038, 6327598, 1988512, 6923567, 2890142, 4904608, 1102233, 745704, 8032406, 6943551, 605237, 7467541, 3779669, 4189977, 2943051, 5308688, 5676018, 1239834, 2953274, 3346466, 7282974, 855027, 3849889, 3732960, 1344399, 8226775, 6603919, 51059, 8199634, 7526738, 5624229, 5374305, 4543328, 8210829, 3083861, 7233941, 2516296, 401126, 183676, 6239071, 7473988, 2068907, 6614057, 2502657, 5880953, 8177720, 4815705, 7594981, 4927936, 3652106, 7519169, 5329920, 3474545, 3318121, 7591745, 3768415, 4569728, 7747867, 1712963, 5007983, 4462165, 5000717, 7154663, 3825132, 5805502, 8084405, 2236649, 6710947, 5072712, 3426794, 7983850, 6780608, 3677394, 1407082, 7860467, 1077707, 7364496, 7939605, 2431653, 8007446, 5933526, 1493552, 2641168, 1210820, 2339984, 2033320], +[8049067, 5172073, 6609229, 392915, 1378446, 2628394, 2778727, 1169297, 4421628, 3700043, 2203568, 2269677, 4755416, 8020717, 2242827, 286164, 7801758, 5795875, 2089001, 7876773, 4732354, 2694834, 7217665, 2444828, 3989580, 3046824, 3608034, 1127498, 4793604, 6865, 1141036, 7836433, 4340221, 3905186, 5004529, 6927364, 1708204, 6515606, 3135189, 279649, 2778004, 4701845, 2666024, 4875151, 1591246, 5919261, 4269782, 4996076, 6702294, 3608842, 7665815, 7110166, 4948172, 3998821, 416200, 405992, 4061980, 6970666, 5720764, 2128899, 5698318, 4900728, 3996247, 4520197, 4606921, 7711033, 6573044, 4050852, 1196086, 5826677, 2516845, 3677358, 2223872, 1955291, 2510667, 6213748, 6910479, 2188985, 4678776, 5066128, 7577014, 4763931, 2538889, 241148, 3821305, 3295803, 4442068, 2393557, 289979, 6124506, 3560067, 5033702, 7449930, 4647416, 3863938, 6809686, 896032, 4765411, 925017, 4476932, 7032469, 5597048, 1523163, 5369679, 1934589, 1768000, 6504523, 6402809, 3550318, 4300985, 7087231, 3865146, 7683931, 4590919, 4094222, 7333280, 7214797, 1362865, 6039770, 6030428, 4312463, 520097, 892826, 4648007, 7416492, 1447314, 4971887, 6032396, 2100685, 5207447, 3202134, 6821139, 976691, 2777700, 3972427, 5918317, 3571212, 2862275, 7088104, 6398825, 1208532, 5800546, 8222422, 5929355, 6473110, 4200676, 80857, 2527623, 5209780, 166606, 7197129, 1330000, 7770288, 4353567, 8086685, 5593189, 4234070, 6182973, 6339436, 6741900, 514050, 3357628, 1801882, 1518447, 6494334, 7501432, 899099, 989732, 3786385, 1503234, 3359572, 7208839, 1328534, 5922545, 6273987, 4746131, 2712245, 4182320, 2741888, 7782530, 4095531, 5559825, 8119672, 3096274, 1159752, 1722381, 2670452, 6812715, 3709332, 3457107, 4472479, 6071866, 4096890, 1834567, 1627778, 162942, 4553202, 8351378, 1255357, 725026, 3854138, 4809740, 1105071, 3917256, 6884252, 1567879, 2422762, 6465132, 174073, 5146566, 3162097, 5778979, 2171132, 6275699, 4184236, 2851541, 3848025, 2267418, 4908926, 3942276, 3355667, 5172769, 5880290, 3498863, 3633210, 5318487, 1071182, 7998822, 8097262, 1404006, 1526556, 6435771, 2427415, 7432903, 7108208, 258632, 3477560, 2348229, 3468454, 8259270, 7002697, 7429489, 5297829, 3362613, 1209780, 1335528, 7233991, 5240513, 7311295, 6137179, 7050627, 7673457, 5227005, 8020603, 6506007, 7686123], +[6101483, 4606585, 5791267, 4946566, 1939737, 7680606, 2203238, 1399980, 723338, 5046120, 979606, 5954502, 6201326, 6789405, 1253167, 7756451, 4625995, 6185598, 1980756, 3594965, 6422447, 7026613, 1957721, 5645514, 7740321, 4686959, 1331304, 3455587, 4905752, 7248285, 5668416, 4541870, 7290251, 6607674, 4710193, 6157614, 6050425, 2245344, 328193, 18899, 5467409, 3973887, 836462, 6054940, 882888, 4228150, 6656592, 4884895, 4301030, 3781473, 3802559, 5042980, 4001582, 6977952, 6216346, 5397039, 6551939, 3621384, 888561, 619527, 1698511, 883424, 6833706, 2767494, 3272628, 1399121, 2120712, 3416148, 313670, 2465176, 284629, 2975809, 2157313, 8230266, 569009, 899777, 1050862, 6174648, 4838925, 5531528, 8118473, 194087, 7159287, 1586730, 940164, 5710507, 8237211, 752697, 8377812, 2108960, 245407, 3633403, 3406351, 7756895, 915775, 3426305, 77615, 3312953, 5112254, 2114790, 6882233, 7160738, 8331429, 4902413, 5339838, 7711842, 1575016, 3006409, 7473391, 3908197, 1633363, 3207763, 2190301, 7898373, 8182243, 3586831, 3441972, 8058592, 4604759, 1640110, 3125270, 3070970, 1324949, 412022, 7152838, 1101260, 2121151, 571481, 7694309, 4089496, 5311800, 3623708, 2292161, 6885182, 8306940, 6037654, 3204930, 4400528, 5449983, 3206122, 2299666, 4950798, 7735006, 4165037, 6923981, 5679552, 357276, 2665032, 4353780, 6333663, 3185162, 1278336, 4139572, 2592026, 5624923, 6573988, 7233749, 3327771, 5210745, 3902728, 5514814, 6534263, 2456053, 3162345, 532997, 4223447, 7489597, 859442, 305356, 6199903, 5479236, 5481980, 5328624, 2657106, 5473450, 5673607, 5137784, 4669339, 1518052, 2822528, 4137805, 8087879, 3027512, 6902314, 3631728, 3476992, 5785606, 6805475, 4536586, 5685897, 7221236, 6050352, 2471068, 322959, 998598, 5995090, 7638243, 3134904, 3359920, 7271318, 60602, 1664580, 97367, 458932, 5784844, 1117171, 3075637, 811005, 5640254, 756329, 5200971, 5829773, 229452, 8193435, 4332509, 1357111, 3431272, 3714422, 4303943, 3905281, 5999272, 7989455, 5183872, 4465408, 6941648, 5619024, 7345890, 6574984, 7793883, 2142709, 1403488, 6862979, 8056688, 6585187, 8180851, 6650290, 7718852, 3410290, 3766888, 4818031, 4042866, 3378723, 7694849, 5679800, 4862441, 2276927, 4627988, 5247273, 8202469, 4594784, 7338083, 6401931, 3907068, 5180154, 5085181, 2731039], +[607034, 8370674, 6814489, 1988463, 2641461, 757383, 7467237, 4660423, 1902075, 4501431, 2717782, 8017821, 1058412, 4341092, 3899941, 2865376, 3450514, 7541457, 2155829, 6039442, 2496259, 5623612, 8188481, 3353327, 7542278, 856473, 6576745, 5265238, 8169541, 1973033, 1805822, 3014479, 604359, 7216982, 8368166, 4894597, 2098047, 2000118, 4551419, 6338805, 1832710, 5715366, 107981, 441653, 7453647, 5673682, 2943287, 6896766, 2565842, 7777466, 7545318, 3908434, 4476853, 231789, 4134427, 6482704, 5536020, 4823670, 3681411, 3567803, 5047871, 7893662, 1483053, 853188, 1248656, 8160501, 3327583, 7402475, 918172, 4961336, 263685, 1084263, 4908173, 1436886, 6003637, 4595360, 7601242, 410639, 2775454, 3154799, 223860, 523917, 6836014, 5443001, 6604515, 3262061, 7597320, 1959992, 7778534, 5639237, 5698220, 1390094, 3868533, 7606398, 1348662, 6776313, 6876297, 7429226, 1122407, 8138410, 479569, 8088563, 778734, 3085319, 4235409, 8164473, 2274864, 4413652, 3463250, 8078389, 2240183, 4544118, 3290803, 146747, 463742, 1259316, 3653428, 7511604, 4081637, 6469277, 63590, 5964735, 7074149, 6607685, 6949248, 5467166, 3525943, 896005, 1375618, 1226341, 4781604, 359050, 2859176, 7889650, 8058958, 8013119, 6717095, 3423049, 5289874, 3758941, 8101600, 5531338, 4874397, 798438, 4103049, 5927023, 1804026, 2791495, 7070084, 8315533, 6344217, 5240581, 216798, 4396320, 2909510, 710535, 2780863, 7290966, 6423898, 5687521, 3512499, 7517353, 4755822, 5814198, 4559406, 5897247, 1451154, 3512545, 1839938, 5607967, 141513, 5127599, 6803654, 7885647, 7372451, 339658, 5720503, 2024344, 6229732, 2118701, 762643, 737878, 6563207, 6743371, 4384421, 226691, 6861065, 1755351, 5502779, 3016560, 191885, 1965207, 4613054, 5435993, 5129395, 6646963, 8074385, 6644703, 2651360, 3018695, 3633561, 757681, 4620204, 1889567, 2442922, 6937731, 7247098, 7769588, 5540976, 8224150, 799762, 3024612, 4769695, 2568438, 5707304, 3586028, 5589141, 6602712, 253131, 8279285, 2681540, 806221, 646593, 7533535, 597590, 3400311, 2954168, 1390197, 2759894, 7707938, 5348663, 7963206, 1096865, 5446238, 5121299, 889833, 3995003, 1900246, 4424511, 2704421, 7588131, 4870946, 4485252, 8093158, 1805923, 6610329, 4727785, 2193560, 6583118, 7004020, 8131713, 5505180, 2602886, 4100195, 5415329, 1452051], +[3114179, 1989457, 427606, 4342808, 360382, 5257610, 4182913, 4504968, 3282756, 4915454, 3580537, 8192999, 784823, 4674813, 4324035, 89500, 1175227, 1595090, 1011064, 2215818, 1675231, 5040915, 2499284, 6073867, 7094000, 6300656, 4070736, 4065888, 4977781, 6923392, 6441513, 3563094, 2685125, 5156493, 1061273, 5640642, 6088491, 3537426, 8239239, 2162851, 552579, 7350595, 5277316, 3740477, 1933349, 5447994, 3230560, 368910, 7879395, 4770819, 5875378, 3916146, 1594768, 6752662, 2418859, 3647313, 1307436, 5923927, 3681506, 1529782, 2364371, 5037464, 3866261, 7437565, 7664487, 6536495, 1956977, 4060192, 6679473, 474785, 914918, 621855, 4154327, 3276676, 3800960, 2017540, 3844987, 5291906, 5951161, 2736818, 7953324, 3853723, 3049167, 4296803, 1096520, 3731684, 7388899, 2932923, 7857233, 1775644, 2609131, 1443038, 100974, 2422675, 2586488, 5051577, 3978522, 5591606, 6143351, 7332741, 2963548, 1044348, 1773287, 4004594, 7016259, 4057765, 7130120, 8239100, 2674343, 4700151, 3298176, 6085948, 5312997, 4018088, 3805634, 3422060, 1656154, 251076, 7355206, 8156617, 6627326, 388234, 7124607, 74532, 6290718, 6738217, 4805377, 4001788, 1709630, 579080, 2918135, 4411273, 3749051, 3396037, 3053824, 2215146, 3219894, 4315241, 4442603, 4971868, 2484295, 1103147, 6352115, 2567647, 5360879, 4046058, 5252515, 479680, 7451374, 1982582, 4769220, 7028024, 1725161, 3822878, 6188469, 3752357, 7046118, 5148128, 1168717, 5286359, 3704737, 5828718, 6540623, 3275604, 3395308, 6660462, 2055803, 430530, 7517174, 4012904, 5700722, 2918706, 1186789, 2706588, 7778459, 6328621, 2500428, 825934, 1244964, 2407754, 2847437, 5007429, 6145621, 7068492, 1649996, 3393054, 2238768, 991419, 425820, 3352420, 205638, 5736799, 177660, 5532294, 2799648, 8073097, 3047700, 4793411, 6065086, 2201338, 501173, 2809326, 7438016, 38397, 1787202, 2214382, 1896713, 5441528, 63134, 4212479, 781539, 5341502, 2257131, 4390335, 2551448, 451070, 2025319, 753519, 8029635, 6155439, 3140207, 217526, 4058118, 5502180, 3528144, 4187817, 3420501, 1686788, 5702213, 238840, 2312448, 6862358, 8123586, 5749461, 7019801, 477251, 6846146, 5979647, 6568791, 7885991, 4758831, 7189535, 7286593, 6368876, 4404989, 8221628, 6106600, 530044, 7442259, 5052904, 2054782, 1506791, 7154723, 8051353, 3849619, 199114], +[2116719, 3421847, 2847422, 1150098, 4097762, 1864631, 8194328, 3467781, 3823398, 48807, 1626014, 1184796, 2728862, 5978730, 1879630, 3785383, 6920389, 222134, 1446501, 1903917, 5487589, 6459112, 4591992, 5138880, 7994015, 2574890, 4419823, 5012941, 4171356, 7468633, 5969595, 5537050, 4036870, 4284464, 7481455, 4920449, 7609956, 3929553, 8257623, 6817018, 2967892, 1769266, 5379675, 3565781, 347367, 5325722, 5480101, 2631669, 7212251, 7880844, 3980958, 2264085, 2627140, 4287004, 1648231, 1108170, 2105451, 2970229, 1820179, 5026686, 4997183, 6469325, 1308912, 5038259, 4744032, 6309726, 3393471, 225907, 1060668, 5184441, 4712431, 3877932, 3058859, 115641, 3815851, 2576917, 6585754, 2361787, 6703396, 6155189, 8321381, 2425972, 3816528, 1531265, 7210512, 1931139, 3493923, 6476252, 5267433, 2989142, 5509055, 7665760, 7228107, 435967, 2594485, 6446085, 6892219, 5059124, 483658, 1858680, 2407895, 509121, 3425985, 6372063, 4280233, 4810805, 7319787, 4801990, 7180821, 7140836, 4703315, 5011038, 5290716, 1567563, 4244869, 4187570, 7286100, 445199, 2772928, 6144099, 2087951, 853053, 6294400, 2932834, 6655569, 6433166, 6464009, 3097115, 4759916, 163839, 1455951, 956107, 2052852, 4195995, 6768454, 1402832, 737353, 6447345, 6140299, 893094, 4313927, 893614, 6942913, 811656, 5265622, 49500, 5002615, 3776118, 3053825, 6057470, 2903089, 8186192, 5185645, 4372520, 2634682, 4107032, 95425, 1830739, 1798537, 1224942, 4148560, 5727539, 6111474, 1996881, 8309987, 227940, 7816756, 8243294, 819684, 1841963, 718034, 6948388, 4712967, 2145629, 5803984, 6998072, 6476403, 5727672, 4616925, 4002109, 2674499, 5953517, 1821331, 3522721, 4980271, 318726, 6853365, 5234901, 6331660, 5533970, 7359003, 6252662, 65836, 7063189, 8239057, 2949055, 5577911, 8340836, 4434821, 7652549, 2828975, 3033855, 5997303, 2661925, 904990, 4605188, 8292513, 7404119, 6199913, 6400660, 7691292, 6527597, 6559847, 6878944, 6989281, 6495068, 7876883, 4021185, 4906427, 1941846, 7889927, 684733, 6018751, 5787604, 4780616, 3667108, 2262622, 8290211, 4847516, 3687616, 1719187, 3807512, 4126413, 513174, 6844974, 192674, 8362085, 4017629, 1487185, 3368232, 2838316, 6097860, 392003, 2397756, 6224525, 5728652, 477976, 6024396, 6879877, 1603045, 6593035, 4383325, 1403810, 3982219, 7742496, 5722990], +[7313860, 3439945, 2567311, 137914, 8191489, 4244602, 5253839, 2548623, 5733000, 5620117, 4444648, 7533732, 4698830, 579281, 5760201, 8328700, 6446307, 5322844, 1549475, 4678268, 7401285, 5429115, 6211709, 4666002, 1610895, 6229914, 2723929, 4923529, 962177, 7217883, 4326738, 4342078, 4015794, 4435444, 6945021, 266447, 6151355, 6058257, 4784990, 7979033, 6045542, 3008452, 4349926, 3051422, 2504438, 6621220, 5697657, 4370815, 8365526, 7672829, 6846230, 3366437, 3092086, 748955, 2134686, 2404269, 7130162, 4769949, 3975806, 3415750, 6428142, 5665805, 4747269, 3580516, 7619630, 2981563, 3994483, 5517589, 6000463, 5950615, 5287884, 3684021, 2696200, 2344936, 3429022, 383784, 1112164, 4589199, 945597, 5305965, 6528129, 4463627, 5724576, 5198181, 4299974, 767041, 2799662, 2124725, 4768639, 6497487, 1568936, 4829158, 4766612, 2868528, 6310334, 3459948, 4201387, 4028371, 3091496, 2899952, 3174941, 7187230, 6493488, 4683427, 4378310, 2860749, 5085875, 1052372, 969177, 3768577, 8050733, 1463090, 4804313, 968113, 4977282, 4865207, 5447577, 106992, 3627881, 3332742, 4649373, 982965, 2187075, 6523622, 1571839, 7728637, 7811682, 2263524, 7732433, 2278350, 5564045, 6371276, 809114, 8345406, 7621497, 3066514, 6542492, 5796924, 3539412, 6364901, 372705, 3309826, 1579439, 7578681, 6678279, 7456949, 7334288, 997634, 6024439, 4583708, 8208281, 3523533, 3429256, 4544306, 1328171, 3999818, 5255288, 6581210, 2025925, 8147912, 8072447, 2933304, 5320523, 6709177, 1418291, 7341339, 2230282, 3390660, 2330646, 3679767, 2748028, 4572071, 4741938, 7847649, 5564231, 8283834, 6823949, 6118883, 3306028, 5827394, 2311478, 997775, 959286, 2322026, 6258026, 3606887, 6652670, 6737514, 3638311, 6823596, 497894, 1128250, 4733294, 5401527, 333685, 6580055, 2811944, 371072, 801929, 4399884, 8377350, 1013100, 6449218, 6293978, 2872961, 2355844, 3067474, 1282867, 6079323, 6215690, 4531643, 1339643, 3666636, 4133797, 1459832, 3494345, 4234228, 4159018, 3848140, 1426641, 1242926, 2294355, 6029462, 783086, 3254152, 125687, 2717513, 3797025, 1046163, 3902774, 5586048, 6058244, 8289822, 5115354, 5815898, 6352152, 7197731, 7956373, 6850566, 3395371, 4470829, 8273571, 5604710, 599354, 4006398, 3356000, 3425833, 246509, 549614, 919264, 6720944, 1580358, 5945242, 2126119, 3002164, 6479289]] + +t0: [[-2288, -1147, -4019, -3326, 448, 1862, -3508, 3892, -596, -938, 3018, 3179, -3453, 1492, 3453, 2477, 3431, -2600, 1554, 411, 2735, 92, 1546, -1362, 2436, 1677, -647, -3696, 1681, -3297, -2084, 1485, 3813, -1670, -2305, 2275, 3136, -2427, -898, -2803, 3336, -89, 2645, 3467, -3694, 1579, -2729, -2667, -1423, -548, 1892, 801, -1100, 2391, -3804, -16, 1289, 1370, 1792, 2440, -2789, 1200, -1411, -1273, 1765, -2554, -994, -3367, -458, 2320, 75, -781, -3021, 4054, -502, 1425, -970, -316, 1254, -1158, 1828, 1483, 2325, 526, -2849, -2756, 1740, 1856, -1098, 352, 198, -2485, -3965, 1150, 1661, -1033, 319, -2308, 2160, -3217, -3957, -2289, 4014, 190, 3987, -588, 1722, -1666, -1759, 3011, 945, -1030, 2736, 2402, -2542, 3763, 529, -2491, -4057, -3882, 597, -24, 3458, 4073, -2391, 579, 1795, 2829, -2391, 3917, 1370, 768, 561, 441, 2336, 1027, -1625, -2435, 1647, -2161, 776, -2515, -860, 1040, 3719, -3900, -232, 1370, 867, -782, 661, -3417, -3182, 1136, 2546, -2056, -4086, 3492, -719, -2494, -3867, -2744, -1794, -2722, 2761, -3148, 1919, -3498, 3286, 3986, 2778, 1516, 3951, 161, -1740, -3202, -2906, 4061, -572, -3294, 1998, 3186, -2904, 185, -1246, -2465, 453, -112, 864, -2141, 2029, -2761, -2680, 3951, -1994, -2229, -760, 2967, -2032, -3762, -413, 845, -2568, 3489, 3882, -3251, 1910, -2004, 1331, -531, -1449, 947, -3830, -3772, 3267, -2469, 1838, -2235, -799, -852, 659, -3552, -797, 4073, 254, -4095, -1621, -2798, -2383, -924, -3801, -834, -1289, -2520, -1846, -3780, -1005, 1179, -1532, -3522, -700, -210, -3737, 3721, -291, 2119, 1792, -1206, 3668, 2386, 592, -2707, -2651, -3492, -26, 1261], +[-4063, 1862, -1787, 2349, 3689, -772, -2566, -2394, -1745, 1828, -1635, 3498, -88, 751, -4015, -2669, 299, 1712, 2219, 3721, -4017, -2921, -3764, -1403, 2770, -4038, -1419, -3490, -1064, 2101, -2312, 727, -3512, -3483, -1055, 2805, -46, -311, -3135, -471, 2577, -1090, -2964, -2872, 410, 1802, 3320, 1178, -2001, -1421, 1255, -3285, 2681, 3502, -3310, 949, 512, 3205, -3915, -1900, 1334, -3821, -2786, -270, 219, 3717, 1675, 3748, -3831, 3583, -3278, -3602, -976, -202, -367, 579, -323, -3231, 561, -281, -3490, 3915, 79, -2620, -1798, 62, 1544, -1307, -2495, 2721, 1177, 341, -966, 2664, -896, 2, -2273, 2927, 174, 1201, 2147, 2002, 3353, 1500, 1236, -1002, 2238, -1599, -3922, 2671, -1549, 3971, 1315, -1300, 771, 1038, 1654, 365, -3540, 3490, -800, -1107, 1740, 2667, 2538, 2494, 3018, 2707, 939, -3701, -1691, 213, -2733, -3415, 537, 4043, 3974, -1240, -1988, 2239, -3320, 3413, -3955, 2182, 3059, 3210, -326, -3725, -1070, 2014, 2376, 1829, 2042, -3714, 968, 574, 2553, -152, 2602, -318, -3187, 1583, -291, -2511, -1554, 919, 3053, 1222, 1259, -1864, -154, 3374, -2144, 1327, -1634, -2400, -3687, 232, -3946, -3265, -971, -3563, 3157, 3865, 2123, 272, -1038, 2842, -4038, -4062, 286, 3059, -351, -2592, 911, 2007, 1167, 1907, -558, -1710, -3675, 353, -3232, 2445, 3669, 405, 1352, -282, 3452, -3233, 2884, -3669, 3113, -4095, -903, 2104, -1191, 997, -3648, -1526, -1087, -3072, 1137, 361, -2239, 95, -1408, -1765, 835, 2671, -2475, 3597, 3047, -532, -2626, -1099, 233, 1699, 1864, 2538, -3350, -2368, -814, -1942, -3853, -3637, -112, 1557, -1371, 3862, 2518, 2608, 3344, -1596, -2928, 1704], +[-3669, 2921, -1715, -301, 2190, -1238, 1639, -2159, -2052, -2741, -80, 493, 4056, 749, -1781, -556, 2974, -4061, 41, -3931, -2622, -334, 513, 3612, 76, -600, 3554, -2998, 1284, -1327, 2348, -3311, -1539, -2398, -783, -3068, -3924, 2966, -2347, 1121, 916, -363, 3624, 911, 1998, -3555, 1750, -1044, 1238, -3830, -1897, -490, 204, 1125, -1592, -3608, -1252, -726, 2748, -1021, -3314, 1912, -1449, -1787, 3017, 2361, 3060, 4004, 54, 2165, 1901, -850, 3840, -2597, 3915, -3980, -3569, 1721, 1144, 3472, -586, -3813, -631, 3580, 3833, 2619, 2004, 1493, 3259, -3110, -3453, 3814, 3402, 2552, -2686, 2134, 3104, -2333, -679, -4092, 3733, 1912, -549, 3919, 1277, -1472, 75, -3335, 3182, 185, 1151, -1478, -165, 3399, -1778, 1440, -2355, 2993, 2266, 1116, 3471, 4001, -102, 3143, 2732, -2670, -657, 3084, 3533, -2665, -938, -2797, 1843, 612, -693, 3693, -500, 3267, 2024, 873, -3884, 610, -2346, -1653, 1430, -1820, -1063, -3705, -332, 2766, -3639, 2896, -3920, 3615, 1181, -1947, -1194, -1987, -1172, -116, -2046, -1092, -358, 2927, -1922, -2440, -2021, -1500, 1681, -4094, 852, -121, 1430, -271, -1085, 2963, 693, -3792, -2432, 130, -469, -2543, 1400, -302, -3512, 2061, -140, -3029, -1644, 83, -353, 1594, 890, -441, -2430, -898, -1550, 3730, 1981, -4062, 3898, 1036, -849, 1480, 2972, 3207, -2070, 1644, 2041, 1990, -15, 3619, 252, 627, -1876, 725, -2215, -1766, 1918, 1924, -3053, 3617, -1566, 879, -4038, 1879, -1970, 3430, 3566, 3174, 2844, -3141, 2583, 2759, -2448, -3512, -4040, -2875, 3238, 1734, -1463, -655, -2395, 3893, -2636, 232, 455, -2367, 4031, 1371, -2685, -2447, 509, 635, 1559, 2027], +[-1557, 2681, -477, -1402, -1767, -3490, -410, -852, 2442, -152, -3434, -1082, -18, -1763, -209, -1373, -2485, 638, -1708, -1323, -81, -2123, -167, 1226, -1119, 1135, -3992, -1437, -1256, -1635, -448, 3502, -629, -3270, -207, -2770, -3463, 736, 513, 2515, 3345, 767, 878, 1052, -1848, 1078, -3504, 2463, 230, -3231, 1471, -3292, 3886, -1632, -1382, -1489, -1661, 520, 3825, -3065, 2767, -1312, 1578, -1402, 4020, -1711, -1016, 84, 2374, -616, -2091, 2113, 2817, -2694, 3761, -1343, 2286, -2120, -2547, 1928, 201, -2521, -521, -2518, -1916, 683, -3941, -967, -2604, 3616, -353, -3845, -1521, -929, -1729, 2049, 3887, 3385, 446, 1254, 953, 930, 165, 3597, -1346, 3170, 2152, -55, 2287, 613, 3155, -3501, 3037, 1285, -1565, -1265, 1332, -2336, 855, 1710, -4074, -1030, -2155, 2422, 1222, 3532, -577, -1959, 2021, 1688, 3384, 2844, -1599, 3902, 252, 150, 1858, 1424, 2303, 3050, -2286, 2830, 1758, 3501, 1741, 2496, -3172, 2632, 3828, 1247, -1526, 384, 2612, 3354, -2981, 4004, 213, 1819, 633, 3336, 1598, -2953, -1547, 233, 517, -3625, 2109, -718, 2252, -1441, -1212, 1532, 3824, 2898, 1194, -3449, 1400, -101, 2532, -3712, 845, 2375, -3528, -3542, 2672, 3584, 2054, -2077, -1782, 649, 4084, -3536, -2916, 3471, -826, -1454, 3299, -2632, 1200, -3178, 3258, 1604, -937, 180, 1292, 3059, 3637, -3, -4034, 2665, -949, -2931, 76, 1435, -1059, -2761, -1176, 3446, 3143, -2303, 2728, 2255, -1664, 768, 3024, -688, -2334, -3192, 3291, -3595, 2656, -1917, 3952, -1181, -2957, -1614, 1988, 2418, -1432, 1135, -3982, 3619, 2561, 2744, -3607, -449, -492, -3799, 2277, -928, -1949, 3979, -516, 2810, -2051, 3103], +[826, -1550, -1255, -2193, 3637, 3719, -3867, -825, 1531, 4023, -1962, -2147, 1644, -668, 549, -1824, 1682, -3375, 1333, 1938, -2301, 3900, -3519, 2799, -2554, -3687, -1431, -2218, 2117, -1239, 3582, -177, -1849, -170, -4058, 3973, 895, 1270, -3333, -1803, -2298, -2650, 1485, -715, -1073, -3374, 2359, -898, 1746, 3258, 486, 850, 4021, 2413, -2533, 2832, -1772, -1418, 3203, -3909, 1599, -3426, 301, 1220, 3472, 1269, 1631, -3093, 668, -3016, 1541, 2919, 1165, 3286, -1099, -352, -934, 1039, -1634, 879, 2676, -371, 3886, 3513, 1763, 1645, 3336, 2104, -3866, 3141, -3412, -2546, 1909, -3970, -3018, 1529, 3209, -918, 103, 3754, -3759, 3059, 494, -3065, 145, -2951, -2512, -1836, -1966, 1077, 3767, -2442, -2381, -709, -3202, -2252, -204, -460, 2021, -2403, -1946, 959, -3739, -3259, 2432, 3102, 3383, 3077, -638, -2459, -2524, -1398, 168, 754, -1970, 1343, -345, -1207, -2158, -1187, -288, 1738, 157, 3814, -1143, -3985, 1786, -1977, 388, 653, 3609, -2299, 3806, -2784, 1350, -2169, 3775, 86, 1370, 2273, -1869, -2903, -3730, -2122, -3538, -993, 1170, -1823, -3262, -3553, 2249, -593, -3898, -3249, -349, 3786, 2487, 920, 3812, -3027, 787, 598, 1415, 1355, 1701, -2685, -3831, 2263, -2245, 1904, 3469, -873, 958, -3495, 1203, 3251, -2927, 991, -2848, 4039, -3687, 4017, -84, -2785, 1706, -893, -2822, 3572, 3184, -618, -3054, 1764, 1951, -3850, -2520, -2068, 2197, -40, -821, -2827, 2756, 3405, -575, -3105, -426, 631, -3144, -2443, -810, -734, -713, 582, -863, -1442, 1299, -3095, -2693, -298, 831, 1061, 2339, -3294, -3964, -538, 3683, -615, 1001, -1896, -3250, -140, -2943, 156, -2170, -3997, 417, 2067], +[1219, -1199, 1622, 1048, -66, -1654, -3199, -632, -2236, 254, 633, 999, -1609, -2819, -1341, -612, 3771, -2350, 3448, 3978, 4063, 2835, 724, 3595, -272, 1008, -688, 2656, -2955, 1152, 2601, -426, -1851, 3725, -3687, -3646, 1835, -1518, -1913, 163, 3715, 2371, 1668, -3267, 37, 314, 2912, 270, -1309, 3075, 1714, 370, -2672, 2454, 2219, 1873, -3284, 1111, 3298, -2122, -3117, -616, -363, -771, -3225, -721, -911, -3040, 2993, -351, -2586, -737, 983, -124, -128, 2308, 2939, -126, 3769, 690, -1108, 3483, 1743, -3997, -1208, -3868, -285, 187, 1105, -2020, 4075, 1246, 2670, -2157, -2184, -2887, -2790, -3530, -649, 901, -1956, 3964, 3815, -1294, 3907, 2725, 3080, -2052, 3751, -2057, -3200, -708, -3611, 4008, -3646, -2196, 1370, -2876, -1210, -2615, -2, 3210, -2433, 804, -738, -3799, -3327, 4092, -2498, -2552, 1783, 3977, -2885, -3643, -1792, 3306, 438, -1943, 2539, -676, 2119, -2773, 3315, 3551, 3311, -790, 1443, -3648, -3346, 118, 1476, -712, -3351, -2786, 3509, 421, 998, 3552, -2739, 2519, 1953, -3986, 3407, -1196, 3820, 366, -389, -3646, -3082, -1176, -910, 2354, -1051, 3228, -3941, -3795, 1868, -1458, -220, -694, -3379, 2117, 1621, -1204, 3404, 1566, 2352, 187, -164, 1892, 838, 2399, -2564, 2694, -2016, 3977, 276, 1091, 3006, -2310, 1461, -530, -320, -2563, 1346, 2542, -3831, 2040, -2402, 1791, 3299, 318, -3861, -577, 3736, 510, 1895, -145, 1475, 3247, 2671, -3658, 3078, -2844, -2608, 1705, -3755, -764, 581, 1272, 2304, -2538, -2878, -1323, -743, 2115, -2366, -513, -1193, -2905, -721, -3041, 3905, 3692, -2307, -3140, 3560, -2436, 3923, -1560, -1410, -537, 3107, -1383, -621, 2506], +[3183, -2409, -3394, 3218, 1762, -3145, 2328, 2565, -2266, -345, 3998, -3044, 926, -1430, 3662, 679, -1851, 950, -3483, 3373, -1051, 3816, -3720, 2496, -1377, 2602, -3857, -563, 1628, -2471, -2373, -742, -1786, 48, 2159, -2943, -412, -2607, 87, 1274, 2388, -206, -2469, 2261, 3303, 922, -347, 2037, 3291, 140, -354, 3093, -2492, 2588, 1639, 2250, 107, -3467, 1555, -3202, 63, -2355, -1808, 179, 864, 1886, 1983, -3469, 3900, -1095, 2031, 3116, 3243, 953, -1621, -3563, -614, 2491, 2340, 2997, -1691, 1140, -944, -639, 1552, -2173, -4061, -3620, -23, -938, 4031, -1952, 2763, 1791, -2379, -1019, 2747, -3532, 330, -904, -553, 1217, 1729, -1313, 4009, 2101, -3861, 1478, -3563, -2588, 1107, -2466, -1316, 2891, 1413, 1458, 3412, 2831, 4032, 99, -1009, 1085, 2944, 98, 3665, 2446, 521, 539, 364, -1, -2225, -2357, -3340, 1691, 1862, 2000, 73, 241, -3701, 166, -3257, 686, -3903, 648, -1834, 348, -2697, -394, -1791, 3582, 3121, 2384, 109, -2008, -3142, 2840, -2879, 3923, -3703, -3858, 3408, 1331, 242, -1967, 3299, -1436, 1588, 2142, 484, -1237, -2862, 1572, 2567, -675, 4048, 2104, -3469, 1464, -3363, -3779, 3907, -2067, 2707, 161, -465, -762, -3339, 213, -756, -3822, 2587, 2166, 300, 1685, -2095, -65, -841, 1380, 2949, 1221, 2735, 2815, 759, -475, 3870, 1284, 2209, -1449, -1431, 2708, -996, -1427, -1945, -2336, 1505, -1188, -3821, -1087, -581, 342, 1031, -3395, -2369, 4052, -3512, -2908, 1630, -93, -2148, 1216, -1133, -1768, -2355, -2922, -3538, -3934, -1947, 3549, -3759, 1320, 3884, 3012, -1213, -2500, -1395, 2444, 2840, 3276, -1403, -2587, -1525, 605, 2978, 907, 1056, -3218], +[-1596, -695, 3215, -1350, -511, 1146, 2767, 911, -1400, 405, -3608, -2908, -3378, -2351, 1225, -2564, -797, -1956, 1187, 636, 3909, -2181, 2173, -3438, -2929, 3994, -4007, 137, 3713, 731, 1362, 318, 1714, 3572, -1795, -3889, -837, -3823, 862, 25, -154, 1988, -26, 3998, -2314, 2084, -3975, -3713, 1494, -3075, -2282, -475, 3702, 3483, -3426, 4013, 3122, 2205, 2686, -314, -2578, -3059, -4091, 612, 1070, -325, -3213, -3819, 3919, 3223, 4044, -2379, 1032, 2024, -3426, -1240, -1948, 1679, 3517, -2451, -895, -1013, -1632, -3739, -826, -3007, -2002, 2997, 895, 1231, -3928, 4070, -1132, 1328, 2494, 2924, -1109, -2093, 3112, -16, -3555, 2846, -2768, -2397, 3782, 1741, -1357, 3796, 2521, 257, -2003, -3278, 3801, 1457, -3454, -841, -103, 496, -1175, -1402, -3683, -75, -189, 2790, -1025, 3581, -3486, 2532, -815, 974, 1677, -2100, -1894, -2242, 2937, 2706, -2916, -3012, 468, -283, 4065, 258, -1617, 1081, 1799, 2229, 2448, -1790, 3319, -3812, -103, 973, -3192, -2254, 1067, 2122, -3976, 3034, 2501, -3128, 3327, 568, 3915, -71, 1075, 1307, 2058, -828, -4074, 1559, 3708, 935, -1230, -287, 1863, 1722, 13, -541, -3540, 2882, 1334, -1649, 822, 3690, -662, 2407, 766, 3690, 1063, -340, -1818, -2246, -1682, 2999, -2187, 1879, 2088, 2432, -887, 780, -3066, -2708, 2114, 2522, -2431, -3452, 3666, -3277, 859, -2038, 1467, -3845, -3380, -3163, 1656, -3639, -1036, -2518, -2100, 1233, -2258, 595, 150, -3346, 1928, 2807, -2231, -4063, -2413, 3382, -896, -3836, -482, 3546, -422, 3352, -3037, 1941, 2054, 3883, -2003, -349, 1382, 1338, 510, -2720, 1577, 749, 750, 1760, 3504, -698, -2150, -3801, 3892, -583]] +t1: [[513, 498, 329, 120, 373, 501, 621, 951, 33, 1016, 221, 475, 18, 775, 663, 111, 557, 906, 281, 569, 189, 875, 579, 942, 369, 327, 161, 610, 841, 981, 713, 616, 460, 419, 58, 732, 163, 95, 866, 905, 99, 873, 421, 198, 1011, 662, 237, 837, 734, 470, 769, 559, 179, 909, 146, 822, 432, 742, 759, 692, 709, 526, 1005, 283, 742, 756, 174, 514, 74, 448, 381, 183, 248, 427, 279, 562, 586, 730, 545, 272, 627, 941, 137, 56, 82, 562, 513, 176, 96, 809, 852, 4, 633, 81, 712, 442, 978, 505, 278, 13, 402, 788, 50, 836, 242, 691, 174, 384, 964, 859, 332, 402, 344, 556, 530, 395, 321, 432, 402, 880, 265, 200, 207, 333, 475, 465, 638, 1020, 713, 804, 309, 688, 943, 714, 415, 640, 915, 465, 363, 848, 24, 326, 907, 911, 492, 460, 587, 162, 322, 861, 479, 680, 79, 974, 71, 827, 146, 696, 836, 525, 449, 4, 272, 123, 636, 108, 868, 473, 553, 127, 960, 1009, 272, 286, 70, 715, 475, 629, 80, 192, 620, 60, 117, 348, 881, 478, 216, 377, 537, 460, 42, 147, 750, 69, 273, 931, 555, 765, 782, 60, 558, 652, 760, 22, 409, 439, 801, 481, 17, 684, 927, 897, 78, 872, 71, 219, 963, 450, 462, 523, 423, 250, 812, 911, 793, 781, 749, 92, 388, 967, 836, 778, 7, 1006, 392, 256, 1001, 684, 27, 476, 676, 296, 780, 77, 806, 339, 895, 45, 25, 329, 762, 523, 885, 662, 409, 458], +[415, 901, 749, 879, 566, 287, 738, 727, 978, 663, 705, 544, 920, 201, 208, 538, 49, 887, 943, 21, 774, 590, 446, 387, 291, 265, 925, 723, 699, 965, 550, 352, 868, 676, 209, 1009, 870, 146, 19, 352, 813, 933, 795, 587, 665, 192, 11, 700, 193, 373, 865, 202, 785, 37, 884, 942, 162, 574, 651, 165, 31, 497, 252, 861, 605, 144, 1014, 824, 448, 907, 176, 971, 816, 792, 781, 280, 162, 309, 456, 419, 972, 658, 371, 471, 424, 682, 368, 527, 377, 88, 351, 3, 454, 303, 1021, 501, 198, 62, 794, 536, 881, 285, 643, 118, 945, 784, 730, 74, 548, 669, 133, 295, 1007, 363, 743, 804, 660, 30, 651, 612, 330, 926, 64, 807, 824, 629, 214, 674, 38, 65, 135, 289, 927, 93, 50, 398, 63, 329, 402, 78, 751, 84, 290, 654, 197, 87, 91, 17, 134, 705, 117, 333, 844, 259, 267, 638, 339, 439, 708, 681, 355, 734, 575, 491, 928, 328, 509, 406, 208, 750, 876, 772, 243, 845, 353, 599, 135, 91, 981, 848, 74, 912, 461, 511, 359, 648, 693, 151, 361, 409, 889, 104, 470, 456, 164, 1004, 806, 6, 1001, 919, 687, 656, 555, 1002, 376, 883, 307, 49, 22, 762, 912, 253, 807, 306, 718, 998, 588, 927, 602, 446, 918, 651, 424, 405, 927, 460, 558, 946, 209, 611, 545, 610, 873, 467, 709, 987, 273, 819, 619, 418, 975, 828, 449, 172, 960, 132, 899, 969, 297, 977, 724, 182, 322, 148, 286, 248], +[983, 631, 807, 48, 168, 321, 339, 143, 540, 452, 269, 277, 580, 979, 274, 35, 952, 708, 255, 962, 578, 329, 881, 298, 487, 372, 440, 138, 585, 1, 139, 957, 530, 477, 611, 846, 209, 795, 383, 34, 339, 574, 325, 595, 194, 723, 521, 610, 818, 441, 936, 868, 604, 488, 51, 50, 496, 851, 698, 260, 696, 598, 488, 552, 562, 941, 802, 494, 146, 711, 307, 449, 271, 239, 306, 759, 844, 267, 571, 618, 925, 582, 310, 29, 466, 402, 542, 292, 35, 748, 435, 614, 909, 567, 472, 831, 109, 582, 113, 547, 858, 683, 186, 655, 236, 216, 794, 782, 433, 525, 865, 472, 938, 560, 500, 895, 881, 166, 737, 736, 526, 63, 109, 567, 905, 177, 607, 736, 256, 636, 391, 833, 119, 339, 485, 722, 436, 349, 865, 781, 148, 708, 1004, 724, 790, 513, 10, 309, 636, 20, 879, 162, 949, 531, 987, 683, 517, 755, 774, 823, 63, 410, 220, 185, 793, 916, 110, 121, 462, 184, 410, 880, 162, 723, 766, 579, 331, 511, 335, 950, 500, 679, 991, 378, 142, 210, 326, 832, 453, 422, 546, 741, 500, 224, 199, 20, 556, 1019, 153, 89, 470, 587, 135, 478, 840, 191, 296, 789, 21, 628, 386, 705, 265, 766, 511, 348, 470, 277, 599, 481, 410, 631, 718, 427, 444, 649, 131, 976, 988, 171, 186, 786, 296, 907, 868, 32, 425, 287, 423, 1008, 855, 907, 647, 410, 148, 163, 883, 640, 892, 749, 861, 937, 638, 979, 794, 938], +[745, 562, 707, 604, 237, 938, 269, 171, 88, 616, 120, 727, 757, 829, 153, 947, 565, 755, 242, 439, 784, 858, 239, 689, 945, 572, 163, 422, 599, 885, 692, 554, 890, 807, 575, 752, 739, 274, 40, 2, 667, 485, 102, 739, 108, 516, 813, 596, 525, 462, 464, 616, 488, 852, 759, 659, 800, 442, 108, 76, 207, 108, 834, 338, 399, 171, 259, 417, 38, 301, 35, 363, 263, 1005, 69, 110, 128, 754, 591, 675, 991, 24, 874, 194, 115, 697, 1006, 92, 1023, 257, 30, 444, 416, 947, 112, 418, 9, 404, 624, 258, 840, 874, 1017, 598, 652, 941, 192, 367, 912, 477, 199, 392, 267, 964, 999, 438, 420, 984, 562, 200, 382, 375, 162, 50, 873, 134, 259, 70, 939, 499, 648, 442, 280, 840, 1014, 737, 391, 537, 665, 391, 281, 604, 944, 508, 845, 693, 44, 325, 531, 773, 389, 156, 505, 316, 687, 802, 883, 406, 636, 476, 673, 798, 300, 386, 65, 516, 914, 105, 37, 757, 669, 669, 650, 324, 668, 693, 627, 570, 185, 345, 505, 987, 370, 843, 443, 424, 706, 831, 554, 694, 881, 739, 302, 39, 122, 732, 932, 383, 410, 888, 7, 203, 12, 56, 706, 136, 375, 99, 689, 92, 635, 712, 28, 1000, 529, 166, 419, 453, 525, 477, 732, 975, 633, 545, 847, 686, 897, 803, 951, 262, 171, 838, 983, 804, 999, 812, 942, 416, 460, 588, 494, 412, 939, 693, 594, 278, 565, 641, 1001, 561, 896, 781, 477, 632, 621, 333], +[74, 1022, 832, 243, 322, 92, 912, 569, 232, 549, 332, 979, 129, 530, 476, 350, 421, 921, 263, 737, 305, 686, 1000, 409, 921, 105, 803, 643, 997, 241, 220, 368, 74, 881, 1022, 597, 256, 244, 556, 774, 224, 698, 13, 54, 910, 693, 359, 842, 313, 949, 921, 477, 546, 28, 505, 791, 676, 589, 449, 436, 616, 964, 181, 104, 152, 996, 406, 904, 112, 606, 32, 132, 599, 175, 733, 561, 928, 50, 339, 385, 27, 64, 834, 664, 806, 398, 927, 239, 950, 688, 696, 170, 472, 929, 165, 827, 839, 907, 137, 993, 59, 987, 95, 377, 517, 997, 278, 539, 423, 986, 273, 555, 402, 18, 57, 154, 446, 917, 498, 790, 8, 728, 864, 807, 848, 667, 430, 109, 168, 150, 584, 44, 349, 963, 984, 978, 820, 418, 646, 459, 989, 675, 595, 97, 501, 724, 220, 341, 863, 1015, 774, 640, 26, 537, 355, 87, 339, 890, 784, 694, 429, 918, 581, 710, 557, 720, 177, 429, 225, 685, 17, 626, 831, 963, 900, 41, 698, 247, 760, 259, 93, 90, 801, 823, 535, 28, 838, 214, 672, 368, 23, 240, 563, 664, 626, 811, 986, 811, 324, 368, 444, 92, 564, 231, 298, 847, 885, 948, 676, 1004, 98, 369, 582, 314, 697, 438, 682, 806, 31, 1011, 327, 98, 79, 920, 73, 415, 361, 170, 337, 941, 653, 972, 134, 665, 625, 109, 488, 232, 540, 330, 926, 595, 548, 988, 220, 807, 577, 268, 804, 855, 993, 672, 318, 501, 661, 177], +[380, 243, 52, 530, 44, 642, 511, 550, 401, 600, 437, 1000, 96, 571, 528, 11, 143, 195, 123, 270, 204, 615, 305, 741, 866, 769, 497, 496, 608, 845, 786, 435, 328, 629, 130, 689, 743, 432, 1006, 264, 67, 897, 644, 457, 236, 665, 394, 45, 962, 582, 717, 478, 195, 824, 295, 445, 160, 723, 449, 187, 289, 615, 472, 908, 936, 798, 239, 496, 815, 58, 112, 76, 507, 400, 464, 246, 469, 646, 726, 334, 971, 470, 372, 525, 134, 456, 902, 358, 959, 217, 318, 176, 12, 296, 316, 617, 486, 683, 750, 895, 362, 127, 216, 489, 856, 495, 870, 1006, 326, 574, 403, 743, 649, 490, 465, 418, 202, 31, 898, 996, 809, 47, 870, 9, 768, 823, 587, 488, 209, 71, 356, 538, 458, 415, 373, 270, 393, 527, 542, 607, 303, 135, 775, 313, 654, 494, 641, 59, 910, 242, 582, 858, 211, 467, 755, 458, 860, 628, 143, 645, 452, 712, 798, 400, 414, 813, 251, 53, 918, 490, 696, 356, 145, 330, 950, 773, 305, 101, 152, 294, 348, 611, 750, 863, 201, 414, 273, 121, 52, 409, 25, 700, 22, 675, 342, 985, 372, 585, 740, 269, 61, 343, 908, 5, 218, 270, 232, 664, 8, 514, 95, 652, 276, 536, 311, 55, 247, 92, 980, 751, 383, 27, 495, 672, 431, 511, 418, 206, 696, 29, 282, 838, 992, 702, 857, 58, 836, 730, 802, 963, 581, 878, 889, 777, 538, 1004, 745, 65, 908, 617, 251, 184, 873, 983, 470, 24], +[258, 418, 348, 140, 500, 228, 1000, 423, 467, 6, 198, 145, 333, 730, 229, 462, 845, 27, 177, 232, 670, 788, 561, 627, 976, 314, 540, 612, 509, 912, 729, 676, 493, 523, 913, 601, 929, 480, 1008, 832, 362, 216, 657, 435, 42, 650, 669, 321, 880, 962, 486, 276, 321, 523, 201, 135, 257, 363, 222, 614, 610, 790, 160, 615, 579, 770, 414, 28, 129, 633, 575, 473, 373, 14, 466, 315, 804, 288, 818, 751, 1016, 296, 466, 187, 880, 236, 427, 791, 643, 365, 672, 936, 882, 53, 317, 787, 841, 618, 59, 227, 294, 62, 418, 778, 522, 587, 894, 586, 877, 872, 574, 612, 646, 191, 518, 511, 889, 54, 338, 750, 255, 104, 768, 358, 812, 785, 789, 378, 581, 20, 178, 117, 251, 512, 826, 171, 90, 787, 750, 109, 527, 109, 848, 99, 643, 6, 611, 461, 373, 739, 354, 999, 633, 534, 322, 501, 12, 223, 220, 150, 506, 699, 746, 244, 1014, 28, 954, 1006, 100, 225, 88, 848, 575, 262, 708, 854, 791, 699, 564, 489, 326, 727, 222, 430, 608, 39, 837, 639, 773, 676, 898, 763, 8, 862, 1006, 360, 681, 1018, 541, 934, 345, 370, 732, 325, 110, 562, 1012, 904, 757, 781, 939, 797, 801, 840, 853, 793, 962, 491, 599, 237, 963, 84, 735, 706, 584, 448, 276, 1012, 592, 450, 210, 465, 504, 63, 836, 24, 1021, 490, 182, 411, 346, 744, 48, 293, 760, 699, 58, 735, 840, 196, 805, 535, 171, 486, 945, 699], +[893, 420, 313, 17, 1000, 518, 641, 311, 700, 686, 543, 920, 574, 71, 703, 1017, 787, 650, 189, 571, 903, 663, 758, 570, 197, 760, 333, 601, 117, 881, 528, 530, 490, 541, 848, 33, 751, 740, 584, 974, 738, 367, 531, 372, 306, 808, 696, 534, 1021, 937, 836, 411, 377, 91, 261, 293, 870, 582, 485, 417, 785, 692, 580, 437, 930, 364, 488, 674, 732, 726, 645, 450, 329, 286, 419, 47, 136, 560, 115, 648, 797, 545, 699, 635, 525, 94, 342, 259, 582, 793, 192, 589, 582, 350, 770, 422, 513, 492, 377, 354, 388, 877, 793, 572, 534, 349, 621, 128, 118, 460, 983, 179, 586, 118, 608, 594, 665, 13, 443, 407, 568, 120, 267, 796, 192, 943, 954, 276, 944, 278, 679, 778, 99, 1019, 930, 374, 799, 708, 432, 777, 45, 404, 193, 925, 815, 910, 895, 122, 735, 560, 1002, 430, 419, 555, 162, 488, 642, 803, 247, 995, 985, 358, 649, 819, 173, 896, 272, 414, 285, 449, 335, 558, 579, 958, 679, 1011, 833, 747, 404, 711, 282, 122, 117, 283, 764, 440, 812, 822, 444, 833, 61, 138, 578, 659, 41, 803, 343, 45, 98, 537, 1023, 124, 787, 768, 351, 288, 374, 157, 742, 759, 553, 164, 448, 505, 178, 427, 517, 508, 470, 174, 152, 280, 736, 96, 397, 15, 332, 464, 128, 476, 682, 740, 1012, 624, 710, 775, 879, 971, 836, 414, 546, 1010, 684, 73, 489, 410, 418, 30, 67, 112, 820, 193, 726, 260, 366, 791]] + +tr: DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E049 +pk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B401CA97141E75D5D7E6ED21E0DFCD76121C7CE91B2D2A9E518EBDAC3DA4EB711D158A9849579F2C9ACC8DA603B7A37C2176E263A45D9A31F35BDA4ED1DE5A17F08BB3342E89CDB0997B2FADC53AD8FE46E6D2EB8A804A00D7D72DF8AC76918C4A6A1B224473B69E080E52C818202C60A44C3501794681AC6ED2E767510392512C03D1F2CCEA0A60C46FCD946458B128E16241C12619DC0921F34C53DB45E727FFC9925C13ACAF2BFB19A09347B716D41818B5F8E3EC31B7A4284275FD1DAA4F387FC4CE92E04A7483C11100D11E7CB241767629FE017CFC107964C4B2DBD50905306CF2500757717B874D5E1932A7C224EE1611D1E82BF6EB300F2E328AAF0599DD16727811B0FA79E04EA07DC436C30BE7DC82A7E9C3F2E31937DC2E17841D4FB4C207B88F1840E9B3BA0177A4A2C47013264FF5770B1924A5EF82755B9A99729F15DEEEDB367E24EEB5D25F1A2C889827038D8631DCFD7A05063BE9DB602325D4F9B4BB166F225864931A4DFC664B3201582D97BEF1929902B300AFC1D415B632119740B7EBA2F8B868291FC4C74FD75D42623FCEC02D0ECBF23063DC3046A2D484DC68CC4B3AD775A8A90AD7837961F1D500C6BDD47F7DC6F8A03186717734A81DB143ACAD1224765AC849EFAF752EC9947AB028994A790EC4C938D7698DA826047148489F772183633F24259913EF522192A3C55CB1450486045B47534C0FB4909F53DD466CAA6379FBE37AA023D59F65D0B8CB36C1F3341DD695876C513DD44A40DEDC7F67215AEB25696596371AD621470AFB261B90FEE5AF42BAA2FA78CD3D530C16E80B793F27CBE4ACF94C7EAEA56F962F8A5A659F33E7A2ECD18C19A298694F57ECF611CDBCA668CFF31C1C2BC0133278F229454FAD2D4251E2113ED7DF79320CA80435D5231C12D75045444E2FD108B813FB8FF0422615B74AE7D1859B224906B048EF127637A6D3D16CFC970853F958D494C24C9BA09832E7863AD95CA237830CF04DAD2B41B85A891E8A32B62EB27B921C3B53700FBD23D3BD4C2FB4A39A9D1B695307D249E6214923B03B9B998DDF88DDCF6D1819C7885AAFAACBA3EC60A3B1C3B135183676AAC348DFDF719B122EB80EFED0C68D89C7F225B800F17958D0774C559EB4B4751576C39410CB3EB51607A8404D7C52F0B628B54FB8FDAA05CE6BF0CD3F68C64D2E1953EE461ECEE1A219DCA24CEBEF904BFDF794EDF49DFABD5E8E486314D0C5992662B9F481730C052CEE9F4916D62D79887748FF8252C515D02958B009F9FB1F57D6557465789ADDE9EC6ABC253A08F4DCAFA28BC4282D4E3608A97D741AFC572F7EA866948C3237A07CB7DB75EA7E4EAFB1EAE9CA382C97EDA8DED02A58A089C7B5F5F69CC9EC35CE2BCF6D106BFD4EACB1F3388A6957D64DAB8A7A9FFC23BCE34A8482009B9667C6B86C10D832950D3A071D9AE8517DEFA420EBC60613CFB021B4548FAD32506826B434C25A07B55F841B80C8FBE4A8DF63A0B63073E4EA3E17FF07E4016FA0CD0E8768095006A74048AB9DBF958CB60ECC5B9077770C620B117FBE6DA4612F23327EDD258A0C691B329011ABCF87A86E18216D7FB8876598E9611971093B7F4DD7CA425113165C1827F9F1F4AAC8735BC62777A17ACC9260411028791A25D4DB69A78A12C569AD73EA984B56F96D2FD7D2BBA126ECCF2ADA1AF7B82E9DA007B7A4FFA519DE072CC3000EC22272D718B172B127B21CA01FA129A315D76077DC3E9F67884FBB1AF8C8B71BB48AD1D7937C3ECBAE83C61C93EE71B67AAD525A5463A0E9C70878C3DDE1D966534AF80FF43C427101798EE894C8D4F48148C89D57A5657E50B831B98A7E6699A731F2A0E5C7C30D5C4AC4ED7F9500D1C3A2C1E0E8DA800D8ED77A96D239D59E7977227290DFC5A436191C6D68125F0B1A98906F19E2707809022157BED26D8CA0CB3055601B002134A6263BF6F93BB6C38AAB2AD8855ECACE472F9E48F83B6CFF455E05966FD186A7691FD18A9249908326BE552E9FC508600BF6C9506FEA5A1BA85882240B5D0D8FBDF4348B66E872DD8F3A6518F551CB4D555FDF6F30A01A6438D61553E90DB1ADAD595EA4B12D421B4B6BE1B41A819C3F0F4F780ABADE83EF405D6811F2CD177260B435A0C275013C33622AE7CADAAF4C145CBC7141E3392A3D5D37EDA4B22F465C46EA94AB6DAA9AFCC1FC4789F104E6497C96962A51B5DE28F386641A671BE8A1C3A1529E4F4922F7DC9C1C2443245F1D3EA83ED557692C7CCD4383842C08FA9F899161591BFA60EC08E1028F0CB38743CC9C1953B962071C1F7C60362DF16C48D52948ACE7C2E63E4243044E6872EC64AA580BC21BD9AC77C3E07C526FA04C1BDC2E219D891DE3A87BFC0E7C2FEB000713FB41069D3DD5196AAD53CB5B475783862067B859BF67E3132C0CA0C4539AE6ADEAEEDF6AFD814D7A58BF67B6FB46F938D9B989AA179D68CA7C2038F929BF60760200DFBC247AD11C419686CA7D569743893DE8E1972F1D72704E8EBA17E80E8ECB63A4D6D34C37AF725CD3F948A1C421EB31649EB5BC4F0D96AB872B599128657BC131958189495C8DE9EED7C97816511E34649601AF168C6A55F67425496E433D5CC57801DA38840EA60808F805A3146178D30DF77041FDBB7F6DF01EA8AFFD279A33B876A091D1E0FB9AB50E446B2BF2F045BA9D77C21AB29F6E108CA7B90F2E695F6F1D060289C61523F49183FE69D319604C244D695B8E734D6F100B3A9E521CE39CD0EBC42199FD419E2DA9ED2D187996A183073FD06A6113E96C2A28DA6950700B6F1E45412D98CC2101ADE58D99625A0CCA99430AEC190781E4F96376753920DD4E248324F3BBF8A324DD2E70B3B3DAC583B6052AEA72D7D0D3C449ABB9C33826F9209AC20A2EE9B7926DA3ED239986FE62E07F79DB2095BBFFA001B0592C475CB15E4552204B1DFB00A8F32A5A4CEC6E1B0FB601F518831A306673758D2BD6F9795A28547D0C7CC38D25FAEDAA2E3DF673A0BBFB64848305D43F1A44ACD517EF4A637A465DEB8D6B609E50F49F05932AF8BE0878ED3E5AA9EADFA1E959C9C56D516EC8483FE2F536BC7AC721235D75C6C2AF77653BC353F1ADB048024711FD500A274D74F8FD403406FDAB67CB665AA10B4349F8EEAAC3B7481353F285AB9817FBAE7D93965304E81B18E84DBCBAFA21E63E1EF16BFE132BDACB8E875F6AAF8EC5E0DB549675C40DA184EA75087508EF928BA4F3E2BE35215D32A18CAB85FDA74EF466796D515049661B595E6811D34A646DA2B3859EA8DC5A5BA870497934DA0B88C03807A21D87B8EB9E0D7A61D54046660C4C93467A25B06901B297975884B59D318F1676D52620763077FD2C4ADA01A6949936B0DB6538E2B110C7C0BCAE3B45B05B74AAC263EC2FBA5D1F130B5BC22D50164CE72F3BFEB71EDFC2A8BE6BA3AD280A7A828E7CCFF8D99B95E8CCAD000E91671D05F7948B43FA7EEAFC41AF4BD9B11AE951C746FCE2C6B2CDBC05DD8322424E9AC2C857B5204686FFF33131C05F81645727E6DE9B2229C0E527CB6A05F2679D2B9860042E188D3DC014748070A72AB9F4C369ECC16F2F4FB46722CACF6A12E969269A0743C0417330D612E4D6C5 +sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt new file mode 100644 index 000000000..8df751a9a --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt @@ -0,0 +1,53 @@ +Key Generation -- ML-KEM-1024 +z: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C +d: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C + +rho: 30052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B +sigma: 889827B5C3F8C203A48974ECF1CAD9CB2BFE5F87EBA26F585BBF02AC89176D2A + +aHat: [[[1652, 2709, 763, 2938, 1546, 2812, 478, 1643, 2699, 3011, 80, 152, 2846, 2573, 2671, 382, 1188, 1272, 2324, 1034, 1267, 1818, 2144, 2478, 2843, 2676, 2244, 1278, 2717, 2408, 1897, 2639, 2481, 781, 2925, 1506, 7, 1056, 2984, 2660, 3088, 2597, 578, 1579, 628, 3025, 2972, 2376, 3307, 1208, 1112, 2414, 2516, 286, 2978, 2668, 614, 2095, 370, 724, 2983, 2724, 1214, 728, 551, 826, 2744, 2417, 1999, 1540, 1055, 378, 1369, 2764, 3108, 2801, 1962, 373, 1856, 2283, 324, 834, 2121, 556, 1, 2100, 2203, 591, 2729, 2066, 1406, 2540, 2258, 2177, 2625, 1717, 791, 2880, 836, 2708, 905, 651, 811, 154, 262, 1018, 3009, 60, 1648, 92, 840, 1552, 2757, 1412, 1897, 1441, 983, 1683, 3313, 1330, 1288, 1630, 2284, 3144, 1038, 3244, 1610, 354, 1945, 1578, 2309, 1091, 1881, 2674, 1253, 905, 2869, 1686, 2600, 82, 1434, 2382, 2771, 87, 663, 1390, 1547, 2663, 1989, 5, 1488, 882, 3131, 933, 1649, 1516, 1832, 141, 1582, 1438, 2470, 716, 151, 781, 3045, 3312, 2271, 3090, 1235, 761, 3272, 1157, 1707, 2185, 66, 1214, 655, 430, 1771, 2217, 2222, 741, 358, 2928, 1325, 3222, 2696, 818, 1342, 825, 1070, 2540, 374, 2469, 2990, 2717, 1272, 2211, 878, 1355, 173, 2303, 2390, 2158, 1532, 829, 2634, 811, 1838, 812, 841, 760, 3151, 2392, 2594, 3217, 561, 3163, 37, 529, 3170, 2221, 3191, 1694, 873, 1880, 2071, 2460, 1896, 140, 2316, 2480, 1419, 1261, 3184, 31, 1114, 1447, 3318, 2221, 1601, 2732, 1451, 504, 2698, 80, 716, 2138, 2815, 387, 2871, 2115, 1732, 3062, 7, 2013], +[1814, 3075, 1364, 2326, 2782, 1230, 1232, 3219, 2519, 287, 972, 562, 908, 217, 1149, 1377, 117, 2774, 3169, 2260, 1907, 2670, 997, 2736, 2936, 3288, 1602, 563, 1987, 1760, 405, 939, 1338, 58, 3053, 597, 188, 122, 2583, 3121, 2142, 1170, 1294, 27, 2263, 2034, 1286, 2297, 27, 2873, 2087, 3118, 786, 1370, 271, 1822, 2446, 1803, 1262, 3283, 2316, 2874, 666, 322, 1288, 1377, 2592, 1481, 1902, 3026, 2224, 1162, 412, 62, 1255, 1701, 646, 2379, 984, 1324, 86, 1394, 3159, 3217, 297, 3214, 1775, 224, 1211, 1689, 3219, 1238, 2832, 1472, 780, 791, 2068, 2175, 512, 1092, 3179, 1491, 1925, 1155, 1475, 1718, 1518, 2788, 2326, 1701, 290, 1324, 1269, 69, 1429, 1600, 2173, 2777, 3232, 1623, 62, 1683, 495, 1874, 1180, 2961, 1213, 515, 2100, 2066, 956, 2085, 2189, 2267, 1718, 28, 127, 2729, 1719, 1773, 855, 1141, 3278, 2240, 2496, 2034, 1352, 2506, 1490, 1826, 2498, 2023, 1520, 3215, 3279, 2406, 2761, 1950, 678, 408, 488, 2901, 2410, 1445, 2383, 1429, 644, 3033, 1460, 2388, 374, 2267, 1380, 63, 172, 2726, 803, 1599, 1886, 1025, 1569, 2498, 524, 3227, 2984, 1514, 44, 2340, 2516, 2693, 2254, 1294, 2879, 1998, 2702, 242, 1931, 1111, 3182, 682, 2301, 2044, 1972, 380, 90, 405, 1024, 1188, 866, 1395, 505, 2727, 1152, 3231, 412, 1908, 2840, 2030, 2785, 2578, 3305, 1310, 2011, 388, 1321, 12, 1264, 1758, 274, 900, 1998, 1261, 1271, 3265, 540, 36, 1910, 2520, 213, 352, 283, 139, 0, 363, 2048, 1945, 2466, 2287, 3085, 1636, 996, 2390, 3156, 2946, 113, 2175], +[1514, 2850, 3241, 3269, 252, 2471, 2422, 2055, 2274, 1913, 2400, 2995, 1555, 3061, 3285, 3116, 1030, 82, 3145, 1455, 2641, 1402, 1888, 3293, 1285, 2872, 891, 2921, 2097, 1545, 2014, 1326, 2677, 1729, 1590, 2450, 2907, 2271, 1668, 865, 1278, 2849, 2672, 2257, 1484, 2148, 900, 700, 2760, 2472, 685, 2963, 3257, 1272, 2867, 1589, 2955, 3263, 2704, 774, 3118, 584, 568, 3061, 2231, 3201, 229, 2718, 3062, 584, 2849, 2412, 694, 2647, 640, 3270, 390, 2610, 664, 1495, 2429, 3053, 2549, 2419, 818, 2609, 2339, 2026, 1548, 1134, 2454, 2876, 2505, 2552, 378, 1157, 831, 816, 3166, 1638, 3104, 976, 2329, 2103, 4, 764, 1211, 2090, 3229, 2114, 2933, 60, 2659, 1302, 1511, 2460, 786, 1183, 1358, 1956, 3287, 1821, 1273, 912, 2532, 2368, 1188, 2003, 1173, 3293, 236, 1869, 1242, 3291, 2992, 1419, 3117, 2527, 1453, 2844, 2778, 2646, 2881, 2216, 559, 2669, 772, 1769, 694, 2330, 1002, 1417, 2725, 729, 3306, 1594, 2677, 2035, 3155, 727, 727, 2996, 1625, 1651, 699, 799, 2698, 2601, 2737, 1563, 3098, 335, 680, 12, 1980, 702, 2465, 979, 983, 1048, 2206, 1920, 2646, 2249, 2964, 2629, 298, 2961, 421, 2314, 2903, 321, 2198, 1927, 338, 1780, 1364, 2710, 1835, 823, 2269, 925, 113, 267, 472, 1423, 3087, 11, 2467, 2293, 2263, 1801, 277, 2138, 919, 3113, 2740, 1935, 964, 502, 781, 1649, 2970, 553, 264, 2051, 1190, 1389, 2909, 865, 2662, 1132, 3019, 2770, 3311, 434, 515, 3051, 1592, 2082, 2140, 658, 2595, 566, 3199, 2974, 1778, 1182, 2, 3126, 1278, 1678, 2056, 2101, 1642, 2578], +[2612, 1718, 2853, 989, 2686, 2869, 3278, 2056, 1801, 2774, 793, 476, 276, 3297, 533, 2268, 2306, 507, 32, 1470, 889, 685, 341, 1131, 2929, 1698, 880, 869, 1720, 470, 375, 380, 2541, 1818, 2951, 792, 1033, 2912, 443, 2128, 271, 2744, 1407, 1252, 2667, 544, 3091, 2378, 1892, 1686, 3278, 517, 399, 1573, 1942, 1037, 82, 2526, 958, 2031, 405, 2959, 3169, 204, 625, 2736, 2397, 3148, 1093, 2058, 752, 2022, 3196, 890, 2625, 1031, 2472, 564, 3162, 39, 2309, 714, 2743, 2724, 826, 2890, 1984, 540, 993, 2822, 2741, 1082, 2047, 1620, 2134, 1405, 1282, 2771, 1473, 1882, 2709, 106, 1206, 1946, 1978, 2538, 2256, 1975, 1434, 1651, 537, 900, 2005, 430, 2270, 994, 1757, 2700, 784, 2957, 1675, 2139, 3278, 845, 1405, 86, 3136, 3069, 1535, 3263, 1259, 2131, 341, 105, 1790, 1957, 1727, 631, 2150, 3150, 1981, 2673, 3190, 496, 635, 674, 1617, 2193, 2236, 3192, 1049, 2757, 3203, 2301, 1627, 298, 145, 2531, 700, 828, 1875, 414, 3245, 965, 1563, 1234, 3106, 1618, 2638, 2177, 2684, 2123, 2569, 95, 1793, 2361, 2453, 196, 251, 2301, 1851, 1988, 837, 2740, 937, 1798, 183, 2702, 198, 205, 26, 2505, 641, 1472, 3271, 1467, 2649, 1098, 30, 1524, 1406, 185, 14, 1364, 1047, 1584, 2182, 1160, 2381, 1045, 2472, 17, 630, 730, 612, 2248, 1098, 2496, 181, 2113, 690, 985, 2370, 2211, 226, 1994, 1459, 1645, 2771, 3277, 2230, 2953, 22, 3135, 2967, 1519, 488, 1299, 430, 2557, 2757, 146, 2268, 467, 2096, 2182, 2013, 2743, 1869, 1117, 3326, 769, 3106, 397, 137, 291]], +[[550, 1346, 65, 3260, 365, 436, 431, 1333, 2159, 1739, 1199, 294, 671, 361, 2154, 927, 83, 42, 1028, 402, 3223, 3057, 2718, 2237, 2211, 3109, 565, 2834, 1914, 1935, 1455, 1284, 1244, 1584, 565, 258, 1972, 1700, 1897, 2505, 1257, 2436, 2975, 364, 352, 1334, 736, 3195, 2843, 575, 1460, 448, 2038, 692, 1703, 1059, 2382, 1490, 328, 1689, 2641, 2478, 820, 1548, 2185, 2674, 2416, 3258, 2095, 1639, 2470, 1326, 2538, 1620, 3227, 3296, 726, 567, 1549, 1617, 687, 1984, 12, 1173, 2507, 3017, 688, 1109, 703, 247, 891, 997, 2290, 1086, 2760, 2816, 998, 2921, 2657, 2914, 595, 1186, 2536, 864, 918, 2592, 2904, 809, 700, 2929, 2200, 402, 1605, 263, 2440, 1177, 1306, 2056, 2898, 1111, 1710, 1997, 2983, 1924, 903, 1204, 642, 2756, 751, 691, 455, 3129, 1921, 3137, 584, 2230, 1115, 278, 2811, 395, 1598, 3137, 2356, 142, 1226, 3060, 1647, 3031, 498, 1150, 441, 334, 1432, 609, 2878, 1227, 1778, 1888, 2070, 3279, 1866, 208, 2755, 3175, 153, 3246, 2089, 2556, 1811, 928, 1197, 746, 788, 2953, 1564, 2364, 3022, 2833, 3112, 2502, 3080, 1981, 1585, 1254, 3083, 2670, 151, 2749, 685, 1836, 248, 1297, 203, 1234, 3246, 434, 630, 793, 1119, 3228, 1903, 725, 3218, 2536, 1421, 2918, 2480, 1757, 2321, 1641, 2463, 2715, 1621, 2726, 1373, 2081, 244, 1724, 1758, 1041, 158, 3223, 1646, 2191, 2393, 2520, 658, 520, 17, 1519, 2102, 2603, 637, 3020, 2618, 2201, 3015, 2870, 354, 1936, 2557, 2835, 793, 36, 3212, 1246, 2680, 2975, 283, 2555, 2631, 1941, 2649, 2085, 633, 1263], +[322, 638, 1997, 309, 2643, 406, 3306, 1544, 101, 1685, 1366, 3197, 2937, 1799, 707, 1050, 1924, 3217, 2258, 2127, 1995, 2877, 2495, 1081, 521, 1575, 1341, 57, 2552, 1379, 976, 1729, 2626, 2455, 819, 3014, 644, 1176, 561, 747, 2500, 1358, 2911, 794, 3100, 218, 2730, 975, 1001, 632, 918, 1903, 357, 2755, 2644, 581, 2686, 2692, 55, 888, 65, 2497, 178, 2829, 1162, 1635, 427, 3065, 3157, 464, 3006, 1286, 2396, 2168, 628, 602, 220, 578, 1060, 2274, 2057, 762, 2517, 1550, 3138, 2931, 207, 3327, 2323, 2556, 1208, 1573, 281, 1964, 850, 1708, 2369, 2183, 566, 3024, 1668, 140, 3161, 1117, 79, 1929, 1056, 742, 1685, 489, 1608, 2611, 271, 1645, 3175, 206, 2278, 2206, 1791, 2933, 2768, 3096, 1571, 3210, 2759, 1361, 934, 785, 3116, 136, 1433, 613, 220, 2890, 2745, 1577, 1661, 676, 1296, 2236, 567, 303, 2945, 1198, 2992, 1425, 2762, 1312, 683, 1146, 1207, 1707, 1142, 2796, 2202, 184, 174, 1986, 1031, 1002, 1772, 3020, 1211, 1255, 250, 848, 2432, 2272, 1378, 764, 750, 523, 1310, 1146, 1692, 662, 1993, 691, 273, 1055, 2359, 2521, 806, 1438, 3036, 2348, 3017, 1499, 2933, 2416, 497, 3175, 524, 3312, 2248, 1895, 410, 3259, 1996, 681, 3093, 543, 1088, 1890, 2657, 2648, 2157, 1074, 893, 634, 358, 1859, 608, 1233, 1481, 1745, 3327, 1090, 2564, 1013, 1373, 2318, 3261, 432, 2784, 180, 15, 1956, 2500, 359, 297, 1724, 2404, 2740, 1306, 2973, 2027, 2479, 1947, 2957, 3234, 1838, 2792, 2873, 2814, 1430, 1925, 2999, 2932, 509, 1153, 2091, 808, 1612, 2441, 1342], +[2804, 2793, 2684, 2670, 3135, 2888, 2598, 244, 1960, 480, 3315, 1827, 3014, 782, 1090, 1338, 1933, 995, 3035, 1184, 3324, 417, 198, 746, 1283, 1082, 3039, 1804, 2478, 550, 1206, 1513, 2837, 2730, 807, 57, 746, 2764, 381, 2421, 144, 3315, 2507, 1487, 1443, 1796, 1426, 401, 1108, 2236, 1377, 2427, 307, 542, 1667, 1305, 949, 766, 483, 3130, 3145, 2579, 570, 886, 2129, 2242, 1613, 240, 1463, 351, 3180, 1201, 2740, 781, 3251, 2702, 1764, 1046, 1481, 2888, 2517, 1703, 86, 521, 3078, 2558, 1949, 2410, 1568, 94, 1013, 717, 247, 378, 1952, 1927, 3240, 1392, 782, 3023, 2299, 2478, 1758, 2049, 1710, 3092, 3288, 2593, 1307, 142, 253, 139, 965, 2649, 3034, 148, 2296, 2432, 1096, 2630, 2340, 2238, 2577, 1850, 658, 1307, 2354, 2113, 2006, 1606, 2597, 1571, 2255, 900, 827, 1446, 1876, 3157, 1619, 1027, 188, 989, 2942, 2544, 1386, 1188, 2152, 405, 857, 2565, 1080, 2485, 2802, 254, 219, 1104, 1268, 2522, 1923, 1201, 880, 1130, 1647, 2094, 1792, 3079, 2208, 1577, 1380, 1838, 95, 3022, 3212, 10, 2613, 1079, 85, 2584, 2995, 2772, 991, 929, 2480, 3203, 252, 1570, 919, 2028, 2938, 1477, 2124, 3055, 71, 2687, 2058, 472, 1450, 2294, 3208, 1597, 3015, 2778, 1364, 885, 3003, 721, 634, 3293, 2239, 193, 2675, 3292, 2241, 1013, 396, 764, 2677, 399, 1287, 3282, 2695, 741, 1292, 685, 898, 1101, 2217, 1212, 3132, 1561, 3252, 2329, 2746, 1506, 2007, 3205, 1905, 2177, 1918, 1337, 231, 2530, 1817, 1486, 3086, 3278, 765, 2573, 2295, 2667, 1970, 1762, 588, 2410, 1184, 2318], +[1066, 1563, 2850, 1114, 1007, 2546, 1986, 44, 1719, 974, 2071, 3199, 2394, 2627, 3052, 398, 969, 228, 2661, 2231, 1429, 2042, 135, 2096, 2188, 925, 219, 290, 520, 200, 1983, 1203, 1408, 221, 3309, 2579, 2969, 1439, 3189, 2629, 17, 2245, 2609, 2462, 2363, 2342, 2781, 2824, 365, 826, 2457, 2887, 2586, 970, 1467, 2273, 3085, 2760, 1074, 370, 3166, 1207, 2684, 1012, 2601, 1118, 2237, 3167, 2590, 2677, 1843, 1439, 532, 279, 2557, 2890, 1497, 3032, 302, 822, 2774, 476, 1731, 118, 1270, 1931, 1778, 654, 554, 2135, 1882, 2658, 2467, 1593, 2621, 1646, 3322, 861, 555, 2359, 940, 708, 3157, 2440, 691, 1526, 378, 1709, 1977, 2639, 2704, 2698, 1377, 1228, 2951, 1411, 1947, 1144, 1231, 3020, 2677, 686, 1423, 820, 2296, 2265, 1956, 2072, 1703, 1506, 3098, 842, 1575, 2905, 1311, 2494, 2502, 3119, 1650, 612, 1749, 999, 1293, 2558, 1788, 2612, 223, 2401, 2847, 724, 1873, 2791, 3264, 1623, 2037, 2871, 386, 2840, 807, 2928, 2527, 2828, 754, 1359, 610, 2350, 2819, 512, 1198, 178, 1332, 1548, 984, 496, 892, 2599, 531, 2252, 2437, 1891, 2311, 1479, 1441, 1509, 1675, 402, 1669, 435, 708, 531, 1761, 3132, 1390, 1254, 139, 902, 3300, 3161, 3317, 2413, 2877, 1298, 1532, 1989, 2446, 1919, 1686, 465, 1972, 1929, 2209, 424, 2154, 224, 1231, 2702, 1772, 1218, 1344, 62, 1619, 2557, 187, 1222, 2996, 1431, 1851, 2399, 2976, 1863, 66, 829, 350, 1321, 2616, 2218, 2319, 2242, 762, 212, 664, 1806, 142, 2739, 441, 2362, 449, 2371, 14, 1276, 1829, 692, 1964, 1140, 1891, 2619]], +[[2969, 364, 2109, 2109, 944, 2810, 685, 936, 2351, 942, 3308, 2687, 3264, 2404, 2898, 3092, 197, 3253, 3039, 1696, 3118, 1362, 2478, 824, 131, 1304, 3297, 1659, 2575, 1044, 2588, 434, 1853, 695, 2046, 1330, 1920, 1817, 2042, 1862, 85, 1906, 1526, 455, 356, 1132, 311, 274, 530, 2967, 2344, 1542, 2241, 972, 2078, 3201, 246, 3316, 2083, 803, 2794, 2479, 336, 1961, 256, 1555, 977, 1824, 406, 137, 214, 76, 934, 565, 829, 1875, 929, 657, 2453, 2004, 2087, 2357, 3079, 1666, 1331, 998, 2255, 149, 1473, 3229, 1403, 2448, 1707, 1669, 1533, 3276, 2592, 1923, 610, 171, 2653, 1755, 1461, 1410, 733, 754, 2210, 989, 68, 1132, 2770, 85, 846, 517, 2035, 2926, 1293, 3260, 3022, 2349, 2388, 2678, 720, 1663, 1136, 3251, 2820, 1869, 1909, 1917, 803, 1541, 2507, 2545, 1979, 3058, 333, 2800, 2125, 183, 707, 224, 194, 3064, 1183, 1180, 1473, 1418, 1777, 1888, 1194, 3309, 664, 461, 1616, 2693, 2108, 1873, 1762, 2683, 1165, 641, 2678, 3123, 1182, 1304, 35, 2739, 1252, 951, 1590, 840, 431, 1041, 801, 2808, 2362, 2429, 3017, 2184, 1038, 3280, 2569, 1505, 465, 2804, 1476, 1565, 445, 161, 1878, 939, 1343, 1321, 3163, 1499, 762, 3091, 2383, 271, 544, 1682, 2329, 1278, 1476, 2296, 1642, 2425, 216, 1671, 2340, 2779, 80, 2074, 1357, 3048, 3026, 1090, 2633, 501, 2202, 2825, 2754, 251, 2418, 321, 2937, 1061, 700, 1757, 405, 776, 2517, 2604, 2297, 2399, 1517, 602, 69, 1149, 546, 1629, 978, 1161, 3019, 3245, 596, 2371, 2783, 922, 868, 1828, 1011, 2876, 2194, 1324], +[605, 3270, 1954, 1889, 816, 2873, 3317, 2439, 1484, 10, 1401, 480, 750, 1630, 1261, 2894, 1537, 585, 2060, 1720, 689, 167, 3118, 2117, 1891, 1343, 2247, 2293, 2963, 2725, 295, 826, 2165, 457, 1534, 800, 15, 1560, 1613, 18, 1278, 615, 658, 764, 1759, 1900, 2730, 867, 1718, 2447, 1058, 1082, 3131, 1375, 454, 323, 3292, 2084, 2344, 1914, 392, 2533, 2710, 2623, 1101, 1525, 902, 1585, 1182, 144, 2408, 941, 1478, 2665, 594, 525, 2070, 16, 3091, 2952, 674, 2445, 1922, 2188, 1088, 2951, 1149, 1683, 582, 2391, 1402, 470, 1157, 3296, 1644, 64, 222, 1674, 2554, 1300, 2680, 252, 2116, 2860, 2650, 2779, 1538, 990, 1107, 2635, 445, 3196, 1724, 1318, 2298, 194, 1210, 1719, 1914, 1697, 1510, 2725, 1152, 1256, 2778, 228, 1002, 1033, 1814, 1964, 3083, 2496, 1330, 1627, 1511, 3024, 813, 2026, 2485, 2479, 614, 418, 2968, 1559, 737, 666, 1221, 294, 1398, 417, 82, 362, 1809, 1570, 1869, 2532, 3020, 2954, 720, 2568, 1621, 2879, 482, 2602, 115, 2279, 1977, 2530, 1873, 2981, 2859, 2195, 46, 1816, 1722, 1440, 1565, 612, 2994, 852, 3315, 1549, 1037, 407, 543, 1367, 1913, 1584, 120, 1034, 2850, 2383, 1734, 3135, 2075, 69, 2728, 2146, 1138, 1133, 1603, 902, 2910, 877, 917, 2455, 1082, 539, 2108, 3038, 3166, 2452, 349, 1694, 1681, 1521, 3157, 213, 1189, 2326, 3308, 2460, 1286, 376, 2344, 2709, 2542, 936, 1959, 1549, 2227, 842, 2523, 2345, 406, 805, 593, 497, 1398, 1396, 2357, 146, 1444, 2060, 2618, 2452, 1684, 131, 1969, 2807, 2545, 3324, 866, 838, 2643, 2820], +[3074, 946, 699, 2360, 3284, 869, 2741, 2437, 403, 138, 1479, 3100, 1659, 794, 1730, 1410, 1659, 1924, 2899, 3125, 2395, 2904, 495, 1586, 902, 737, 395, 1954, 434, 1671, 550, 2737, 2514, 541, 2529, 771, 679, 187, 1290, 2656, 1169, 2201, 1620, 1640, 2949, 626, 1693, 2041, 2679, 23, 1627, 957, 1937, 3140, 1007, 1177, 1029, 1386, 1437, 255, 1715, 2096, 2140, 3282, 2835, 3102, 2220, 3253, 3288, 2311, 2584, 1433, 483, 1167, 2153, 664, 1387, 2578, 3116, 3171, 2304, 2681, 1453, 1536, 626, 1647, 2189, 2760, 3134, 1012, 185, 2069, 532, 2209, 3090, 1122, 19, 163, 2718, 132, 2075, 796, 2073, 3196, 2119, 2662, 2339, 2385, 2895, 1772, 1401, 1128, 152, 1561, 1013, 2488, 13, 2187, 2155, 936, 2275, 1749, 102, 1524, 3120, 1219, 1256, 372, 2263, 1886, 959, 621, 1065, 925, 768, 742, 2948, 1238, 2255, 92, 150, 1670, 3324, 1392, 763, 2795, 2843, 949, 1497, 1763, 398, 70, 2841, 2547, 2491, 1320, 2328, 82, 761, 1763, 3107, 1419, 370, 2524, 2667, 3272, 2041, 792, 385, 869, 103, 1282, 503, 2951, 41, 813, 1683, 1899, 2667, 2252, 1887, 779, 192, 2493, 3256, 2260, 2628, 2734, 2317, 2915, 1483, 869, 985, 2107, 61, 2273, 809, 466, 1603, 2916, 2543, 3108, 865, 94, 2696, 1213, 1277, 2696, 674, 2416, 1972, 1388, 2193, 3089, 1189, 795, 2503, 1671, 3111, 1827, 2094, 556, 1585, 69, 2416, 1811, 1675, 3012, 3179, 3242, 124, 2227, 818, 2940, 216, 1151, 1997, 2070, 246, 1955, 2409, 1996, 1279, 951, 2576, 2178, 1884, 1016, 3308, 2614, 303, 2956, 96, 2249, 2331, 2642], +[2345, 807, 563, 1066, 1579, 1614, 317, 261, 674, 1044, 3238, 1330, 1482, 1880, 901, 2270, 2513, 2257, 1636, 869, 2410, 2277, 2542, 951, 2777, 1161, 548, 1812, 168, 674, 1375, 499, 169, 2052, 1243, 2911, 758, 1518, 900, 678, 142, 3063, 335, 968, 947, 190, 1913, 2847, 1250, 1866, 3056, 1092, 2627, 3255, 664, 1583, 1784, 2454, 2131, 1933, 1196, 1688, 909, 3257, 1365, 851, 1262, 2352, 2464, 663, 1514, 2634, 669, 22, 1610, 2040, 1159, 1714, 499, 1388, 2654, 3090, 2542, 1951, 1604, 2515, 1000, 850, 2970, 2874, 1273, 1301, 1883, 1091, 875, 2189, 3144, 439, 2364, 1662, 1898, 507, 2927, 550, 1415, 113, 399, 1726, 3068, 2799, 289, 1040, 2578, 298, 260, 2581, 1007, 2457, 2794, 889, 2573, 2914, 1382, 1941, 619, 2300, 1533, 2698, 707, 1471, 1473, 2151, 14, 655, 1569, 2909, 2369, 3123, 708, 1190, 2025, 1351, 1085, 3021, 1197, 672, 2710, 2010, 1832, 2327, 2061, 1735, 156, 1742, 890, 179, 1182, 1813, 37, 3306, 713, 1251, 3117, 2084, 3099, 2895, 2171, 1954, 2197, 2587, 81, 41, 2295, 650, 370, 2149, 1976, 2025, 2921, 2562, 3043, 2887, 1516, 80, 720, 1344, 373, 744, 1835, 3299, 3260, 12, 467, 1840, 638, 67, 2152, 1866, 192, 387, 3039, 1371, 1095, 2653, 837, 1681, 2058, 1527, 2924, 593, 2474, 2083, 412, 926, 3266, 3065, 701, 1439, 2678, 2344, 3058, 1880, 1698, 2916, 1214, 698, 2859, 2608, 862, 1165, 1053, 480, 1567, 2899, 3046, 2962, 2717, 10, 207, 318, 1383, 1784, 972, 2996, 3242, 174, 3154, 339, 178, 1667, 725, 2915, 1265, 883, 639, 1905]], +[[2365, 1266, 2849, 1275, 548, 561, 1179, 2946, 687, 1099, 2510, 1315, 1438, 2146, 2139, 3288, 139, 3246, 2153, 123, 3115, 1287, 1993, 775, 201, 787, 49, 308, 269, 946, 375, 2129, 767, 1699, 2139, 959, 2959, 2141, 2145, 2681, 2594, 1879, 784, 2516, 2582, 3169, 2886, 2278, 3147, 2971, 1923, 271, 342, 2002, 332, 1386, 2954, 468, 2997, 1087, 1574, 1637, 1068, 281, 2390, 196, 3271, 3318, 663, 3027, 1928, 3164, 2294, 1543, 459, 1702, 2518, 371, 1612, 3081, 3163, 795, 3265, 2508, 3082, 669, 619, 2344, 222, 145, 225, 1602, 742, 348, 2075, 1794, 243, 2857, 1571, 1413, 345, 2659, 1408, 3008, 1022, 470, 457, 933, 1851, 792, 1015, 584, 763, 1668, 2289, 872, 320, 409, 1703, 2836, 46, 2937, 2667, 2075, 2149, 1966, 1755, 437, 1843, 1898, 1686, 1170, 743, 3054, 647, 395, 1672, 1333, 65, 665, 2435, 2133, 2227, 2249, 1211, 1782, 2706, 2030, 2923, 453, 99, 2365, 2452, 2565, 1333, 1762, 292, 485, 626, 736, 1601, 1599, 1779, 1014, 1964, 2591, 2180, 1877, 1835, 2109, 2418, 596, 9, 1309, 1890, 404, 64, 1433, 1348, 389, 1775, 2945, 3034, 3293, 1702, 2862, 72, 1654, 600, 1061, 2456, 2448, 1906, 590, 1943, 608, 1685, 3139, 3047, 2248, 2493, 933, 2476, 1683, 1885, 787, 2348, 542, 2071, 2213, 1807, 2371, 1054, 2942, 63, 2026, 2238, 2692, 3007, 1133, 2669, 2217, 1865, 132, 1424, 991, 2629, 2114, 2353, 988, 2469, 1482, 3309, 1476, 324, 1517, 2860, 684, 2483, 2030, 3273, 1606, 844, 263, 3222, 2916, 484, 3135, 130, 2728, 2211, 406, 655, 3093, 197, 3193], +[1712, 1394, 145, 2844, 1948, 2192, 2370, 513, 2183, 2290, 2056, 2771, 2563, 853, 2403, 2026, 1086, 2065, 1238, 1455, 2215, 304, 2203, 495, 1533, 2888, 965, 1635, 500, 1487, 2013, 2375, 2036, 2000, 2839, 1638, 2278, 3134, 348, 3008, 2404, 914, 1821, 2713, 1155, 1851, 421, 279, 2313, 1096, 175, 2157, 3000, 564, 1670, 2428, 1902, 1705, 3009, 385, 3316, 3151, 1442, 2501, 1764, 512, 2838, 1490, 934, 3216, 136, 1071, 18, 85, 1628, 2685, 537, 588, 2786, 2331, 2683, 1023, 62, 3141, 1856, 2911, 1166, 2158, 152, 336, 1760, 1158, 2198, 2721, 1298, 1070, 337, 2277, 969, 815, 2317, 1358, 3247, 2107, 20, 1832, 696, 1135, 2555, 1022, 2254, 831, 1816, 1057, 3062, 683, 1264, 1502, 3311, 1865, 2802, 606, 14, 888, 1297, 1122, 571, 2968, 288, 1014, 2922, 1087, 1637, 3151, 74, 486, 1663, 1565, 2503, 878, 2585, 1898, 547, 1500, 645, 733, 1120, 2309, 1789, 1921, 3169, 513, 736, 3138, 1980, 1186, 2148, 949, 2970, 2402, 312, 1148, 1260, 297, 2717, 1516, 1280, 2000, 697, 349, 3220, 3050, 1525, 1574, 3032, 733, 263, 2195, 1045, 3095, 2452, 1619, 1128, 1644, 111, 2168, 39, 1699, 2666, 1544, 2845, 985, 2846, 1853, 2182, 287, 320, 426, 2158, 2292, 3131, 1519, 1120, 1319, 1974, 2875, 2684, 2308, 3133, 77, 3209, 1927, 404, 986, 2135, 2576, 169, 2499, 333, 1720, 1293, 695, 1486, 1470, 1089, 3167, 2412, 53, 2799, 2423, 2450, 3245, 437, 2724, 1249, 1404, 2004, 871, 1813, 553, 121, 1390, 713, 478, 3198, 2283, 282, 2391, 945, 135, 1423, 2407, 1598, 597, 933, 1708], +[354, 221, 2080, 3251, 804, 1387, 3049, 56, 2710, 1630, 2480, 1811, 1041, 3195, 2626, 3274, 2785, 30, 2718, 1953, 890, 2750, 1894, 687, 1784, 916, 518, 1460, 1770, 3055, 2914, 1869, 133, 1597, 447, 267, 1985, 225, 2375, 444, 1139, 1324, 2256, 2917, 833, 3125, 1460, 3102, 1848, 1542, 2631, 2467, 2941, 1130, 2903, 12, 1240, 556, 1033, 1161, 1051, 621, 1364, 2550, 2314, 1690, 1176, 1860, 1308, 2842, 550, 2759, 307, 494, 2556, 1049, 972, 1625, 237, 395, 2307, 293, 2621, 1381, 1812, 535, 1591, 39, 195, 1428, 3301, 602, 1505, 2453, 2358, 216, 646, 1965, 1543, 512, 1891, 1687, 1725, 316, 1168, 861, 3247, 1114, 2962, 949, 3211, 2070, 2615, 2693, 3226, 155, 189, 2203, 477, 819, 1655, 377, 364, 551, 1940, 2884, 2704, 2831, 2533, 1099, 1187, 284, 346, 2287, 1431, 236, 3188, 2099, 3302, 29, 2603, 2226, 822, 776, 2037, 2196, 585, 2166, 2966, 1618, 688, 855, 2489, 812, 174, 1221, 1491, 58, 831, 15, 9, 1654, 736, 1996, 2712, 2865, 2057, 162, 1288, 2866, 1368, 3164, 324, 306, 2569, 721, 3250, 375, 57, 1342, 2490, 1421, 377, 1557, 494, 11, 1562, 892, 1332, 915, 1746, 1274, 36, 2471, 1427, 2391, 1327, 1329, 46, 390, 2445, 2152, 3176, 1868, 2831, 1870, 2856, 807, 3001, 3300, 2334, 362, 1147, 712, 3206, 11, 2976, 1392, 2401, 1916, 2246, 2328, 2268, 1670, 52, 949, 791, 911, 1575, 2720, 2983, 293, 1665, 1792, 2998, 920, 2407, 442, 1920, 2204, 1520, 668, 1084, 2588, 1643, 3094, 3178, 1646, 873, 1303, 3115, 226, 950, 381, 1552, 3142], +[2864, 1188, 1418, 1457, 1252, 3318, 531, 2402, 461, 159, 1891, 1633, 744, 1336, 2711, 205, 883, 916, 1815, 1212, 3114, 1381, 2045, 557, 2808, 1461, 2749, 1509, 2502, 491, 2328, 399, 2763, 208, 1072, 1216, 451, 3293, 2945, 3052, 2879, 67, 2180, 1184, 2000, 1534, 2749, 2425, 3139, 2893, 3117, 2580, 2012, 11, 2366, 832, 3264, 2973, 2905, 57, 2431, 548, 2091, 435, 2574, 1466, 57, 627, 591, 2485, 2464, 2641, 238, 725, 2952, 3277, 2062, 1804, 993, 2697, 1415, 114, 2273, 711, 34, 847, 2697, 2394, 2913, 1456, 653, 2849, 138, 2649, 224, 2500, 2097, 77, 1278, 1136, 1607, 689, 2353, 3224, 3281, 248, 2795, 414, 2609, 3216, 961, 2489, 2680, 988, 2596, 1061, 2772, 2266, 1269, 996, 3061, 1473, 373, 1802, 1431, 637, 651, 1875, 351, 317, 2908, 796, 702, 317, 2421, 591, 1893, 443, 575, 3083, 1304, 887, 1312, 1834, 1082, 589, 2385, 1098, 1322, 862, 1974, 1730, 1552, 767, 537, 2304, 524, 1798, 2627, 2330, 644, 2732, 296, 2331, 875, 1402, 2872, 451, 2923, 674, 698, 813, 639, 11, 2256, 3135, 1224, 2430, 2759, 1475, 3222, 2654, 1639, 367, 1966, 404, 2916, 1110, 1374, 3123, 1629, 841, 2582, 2528, 1295, 26, 1476, 1931, 2752, 2170, 3030, 2842, 3309, 2768, 561, 3246, 2396, 3202, 1019, 1043, 578, 1441, 1177, 1047, 2101, 732, 3176, 192, 3109, 2618, 1528, 687, 2795, 1103, 2879, 472, 226, 466, 1802, 1347, 2673, 2096, 602, 1282, 3082, 3085, 1120, 3240, 1802, 1092, 2457, 489, 2875, 1486, 2430, 774, 897, 1392, 2477, 906, 980, 615, 772, 1209, 954, 148]]] + +s: [[3327, 3328, 3328, 3327, 2, 1, 1, 1, 3327, 1, 3327, 0, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 2, 0, 3327, 1, 3328, 3328, 0, 1, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 3327, 1, 0, 3327, 2, 3328, 3327, 3328, 3328, 1, 0, 0, 3327, 1, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 0, 0, 3328, 1, 1, 2, 0, 3328, 0, 0, 3327, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 1, 1, 0, 0, 1, 0, 3327, 1, 0, 0, 2, 3328, 0, 0, 3328, 3328, 1, 0, 1, 1, 2, 1, 3328, 1, 1, 0, 0, 1, 0, 0, 0, 3328, 3327, 3327, 2, 0, 1, 0, 1, 2, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 3328, 3328, 0, 0, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 1, 1, 3328, 0, 1, 0, 1, 1, 3328, 1, 1, 1, 0, 1, 2, 3328, 0, 1, 1, 1, 1, 1, 0, 0, 3327, 0, 3328, 2, 1, 0, 2, 1, 1, 1, 0, 0, 0, 0, 3327, 3328, 0, 1, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 3328, 3328, 3327, 3328, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 3328, 1, 3328, 1, 3328, 2, 2, 1, 0, 3328, 3328, 3328, 1, 1, 2, 3327, 0, 1, 0, 0], +[3328, 0, 3327, 1, 0, 3327, 1, 3328, 0, 3328, 0, 2, 3327, 3328, 1, 0, 2, 3328, 0, 0, 0, 0, 1, 3327, 3328, 3328, 1, 1, 0, 3328, 0, 3327, 3328, 0, 2, 0, 0, 3327, 3328, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 1, 3328, 1, 1, 1, 3328, 3328, 2, 0, 1, 3327, 0, 1, 3327, 3328, 0, 3328, 1, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 1, 3328, 0, 3328, 1, 3328, 2, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 0, 3328, 0, 0, 3328, 2, 0, 3328, 0, 1, 1, 3328, 3327, 1, 1, 0, 2, 3328, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 0, 3328, 1, 0, 2, 0, 3328, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 0, 0, 1, 3327, 3327, 1, 1, 1, 1, 1, 0, 2, 0, 1, 0, 3328, 0, 2, 3327, 3328, 0, 3328, 3328, 3328, 3328, 0, 1, 3327, 0, 1, 3328, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 3328, 1, 3328, 1, 2, 0, 0, 2, 2, 0, 1, 1, 3328, 0, 1, 1, 2, 1, 1, 0, 3328, 1, 0, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 3327, 0, 3327, 1, 0, 3328, 2, 1, 0, 1, 0, 1], +[1, 0, 1, 3328, 1, 3327, 3328, 3328, 1, 0, 1, 1, 0, 3328, 2, 0, 3327, 0, 0, 1, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 1, 0, 1, 3328, 2, 0, 1, 1, 1, 0, 0, 3327, 2, 0, 0, 0, 1, 1, 1, 3327, 0, 3327, 2, 2, 1, 0, 1, 0, 3328, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 0, 0, 0, 1, 0, 1, 3327, 3327, 3328, 3328, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 1, 2, 1, 3328, 0, 0, 3328, 3327, 3328, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 1, 3328, 0, 1, 0, 3327, 0, 3327, 1, 0, 3328, 1, 3328, 0, 3328, 1, 3328, 0, 0, 2, 0, 1, 1, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 2, 3327, 1, 0, 0, 0, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 0, 3328, 1, 1, 3328, 1, 1, 3328, 0, 3328, 1, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 3328, 2, 0, 0, 3327, 0, 2, 0, 3327, 0, 3328, 1, 3328], +[0, 3328, 2, 1, 1, 1, 1, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 3328, 2, 1, 1, 1, 3328, 0, 0, 3327, 0, 3327, 1, 3328, 3327, 1, 2, 3328, 1, 3328, 3327, 3328, 3328, 0, 2, 0, 0, 3328, 0, 0, 0, 3327, 0, 0, 3328, 3328, 1, 1, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 3328, 3328, 0, 1, 2, 0, 0, 2, 0, 0, 3328, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 3328, 2, 0, 0, 0, 0, 0, 3328, 1, 2, 0, 3328, 0, 3328, 0, 2, 0, 0, 3328, 2, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 0, 0, 1, 0, 3328, 0, 2, 1, 3327, 1, 0, 1, 3328, 2, 1, 0, 3328, 3328, 1, 1, 0, 3328, 2, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 1, 3328, 3327, 0, 0, 0, 1, 3327, 1, 1, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 0, 1, 0, 0, 1, 1, 3327, 1, 0, 2, 1, 3328, 1, 0, 1, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, 2, 1, 1, 2, 0, 1, 3328, 0, 3327, 3328, 3327, 1, 3328, 3328, 3327, 0, 0, 0, 3328, 2, 0, 0, 1, 3328, 3328, 2, 0, 0, 3328, 3328, 0, 0, 1, 2, 1, 1, 0, 1, 0, 3328, 3327, 3328, 2, 3328, 3328, 3327, 2, 3328, 3327, 2, 1]] + +e: [[3327, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 3328, 1, 3327, 3328, 1, 0, 3328, 0, 1, 3328, 3327, 3328, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 3327, 0, 1, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 1, 0, 3328, 0, 3328, 1, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 1, 0, 1, 2, 0, 3328, 0, 1, 0, 0, 2, 2, 0, 0, 3327, 0, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 0, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 3327, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3327, 0, 0, 1, 1, 2, 1, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 1, 3328, 1, 0], +[3328, 3327, 3328, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 3327, 3328, 0, 0, 1, 3328, 0, 2, 0, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 1, 1, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 3327, 3328, 0, 3328, 3328, 2, 1, 0, 3328, 3328, 0, 0, 3328, 1, 1, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 2, 0, 3328, 1, 1, 3327, 0, 3328, 0, 1, 0, 0, 1, 3327, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3327, 3327, 3328, 0, 1, 1, 1, 0, 1, 0, 2, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 0, 3327, 1, 1, 0, 3328, 3328, 0, 3327, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 0, 3327, 0, 0, 0, 3328, 0, 0, 2, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 2, 1, 1, 3328, 0, 3328, 1, 1, 1, 3327, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 3327, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3328, 1, 3328, 2, 0, 0, 3328, 1, 3328, 3328, 2, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 0, 1, 2, 0, 0, 1, 0, 3328, 1, 3328, 3327, 0, 3327, 3328, 3327, 0, 1], +[0, 0, 0, 3328, 1, 0, 3328, 3328, 1, 0, 0, 0, 3328, 3327, 1, 0, 3328, 0, 0, 0, 3327, 3328, 0, 3328, 3327, 0, 3327, 3328, 1, 0, 0, 1, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 1, 3328, 1, 0, 3327, 0, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 1, 2, 3328, 3328, 0, 0, 0, 3328, 0, 1, 3328, 3328, 3328, 1, 0, 1, 0, 2, 3328, 1, 0, 0, 2, 3328, 3327, 0, 3328, 3328, 1, 0, 0, 1, 1, 2, 0, 3327, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 1, 3328, 1, 3328, 3328, 0, 3327, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 3327, 0, 0, 0, 1, 1, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 2, 0, 3328, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 0, 0, 1, 3328, 3327, 0, 1, 3328, 3328, 1, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 1, 1, 3328, 0, 3327, 3328, 3328, 0, 1, 3328, 3328, 3327, 2, 3328, 3327, 1, 0, 3328, 1, 1, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 3328, 1, 0], +[1, 3328, 1, 1, 1, 1, 1, 3328, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 0, 2, 0, 3328, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 2, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 1, 0, 1, 2, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 0, 2, 0, 0, 0, 1, 3328, 0, 3328, 1, 1, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 3327, 1, 0, 3328, 0, 0, 1, 0, 2, 2, 0, 0, 3328, 1, 0, 0, 0, 1, 3327, 1, 1, 2, 3328, 1, 0, 3328, 2, 1, 0, 3327, 1, 3328, 1, 1, 1, 0, 3327, 0, 2, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 3328, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 2, 1, 3328, 3327, 1, 3327, 0, 0, 1, 0, 0, 3328, 2, 3328, 3327, 1, 3328, 0, 1, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 0, 3328, 0, 1, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 0, 1, 1, 0, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1]] + +sHat: [[138, 2909, 2800, 601, 938, 1497, 2777, 845, 683, 3240, 373, 730, 2406, 2510, 3060, 3240, 2373, 2859, 1243, 436, 1986, 441, 2524, 553, 2229, 3023, 1596, 1920, 1876, 1430, 3079, 2947, 1678, 2978, 465, 2875, 1188, 1702, 2405, 3170, 2610, 2622, 839, 1191, 1339, 2110, 468, 1927, 3081, 1188, 3175, 3008, 3137, 110, 1673, 1383, 1128, 741, 1391, 2673, 1749, 3224, 2786, 1702, 1795, 332, 617, 3164, 2879, 327, 795, 722, 390, 1698, 1829, 2700, 2291, 1318, 3205, 120, 681, 1253, 3041, 2663, 2612, 2592, 1442, 3089, 1514, 536, 1639, 2203, 284, 1644, 2754, 319, 1952, 162, 2082, 841, 19, 2766, 1220, 3060, 576, 2254, 325, 1262, 7, 1268, 2402, 1593, 2409, 2037, 3088, 3103, 3200, 2766, 2733, 1649, 2841, 2554, 1051, 1956, 2785, 713, 2736, 2002, 4, 1554, 1650, 2241, 2639, 2448, 2746, 2367, 1581, 1174, 1256, 2697, 2032, 1973, 1665, 1612, 1411, 2908, 207, 2790, 1141, 1098, 2642, 2486, 1078, 807, 2655, 907, 757, 2403, 2626, 1921, 336, 3089, 989, 2667, 1945, 1111, 987, 3288, 3160, 195, 1857, 3191, 1175, 173, 2383, 2550, 31, 3156, 2625, 3139, 996, 1842, 2889, 1698, 2604, 1030, 877, 2036, 1858, 181, 1118, 2537, 1524, 211, 2538, 199, 2046, 731, 1810, 1304, 895, 638, 3133, 2659, 858, 3233, 878, 3154, 123, 2015, 2976, 2132, 796, 2815, 2977, 2808, 94, 527, 2169, 1394, 1961, 542, 3056, 2545, 3050, 1559, 3118, 1764, 1833, 2352, 102, 555, 2182, 3048, 1578, 2032, 702, 2121, 557, 2061, 1971, 1244, 2042, 1563, 998, 2689, 3168, 1140, 1390, 1121, 1382, 3176, 3221, 858, 2681, 2321], +[1113, 761, 1888, 193, 1186, 3185, 3008, 425, 2891, 3265, 3151, 3172, 13, 431, 2320, 337, 681, 3018, 341, 403, 102, 805, 2524, 1149, 2671, 1979, 432, 1399, 3283, 2499, 2702, 1727, 3280, 906, 3265, 618, 1375, 395, 87, 349, 279, 1334, 2598, 236, 1288, 182, 2726, 1039, 3203, 1970, 332, 2916, 324, 1543, 1570, 1323, 689, 2009, 2389, 2876, 639, 1534, 1562, 1963, 922, 3184, 3072, 2120, 3248, 1175, 1574, 907, 30, 3316, 468, 68, 1298, 387, 1652, 3297, 1731, 3238, 1903, 1787, 2976, 1770, 2610, 616, 3137, 1151, 2012, 1773, 2705, 2380, 305, 2494, 767, 3296, 2146, 3106, 819, 2086, 504, 234, 670, 3214, 1521, 2359, 656, 10, 292, 1466, 2363, 192, 19, 3241, 771, 1940, 1138, 584, 2155, 2381, 1845, 2928, 1958, 507, 2755, 51, 2231, 2106, 1126, 2814, 493, 1397, 1337, 3182, 2719, 616, 2670, 500, 1875, 925, 2352, 2174, 2389, 790, 1835, 50, 3198, 2037, 389, 2, 2754, 875, 328, 2971, 449, 1179, 1526, 226, 2826, 102, 850, 305, 79, 595, 1385, 1463, 3212, 1269, 2300, 182, 503, 392, 1093, 3, 309, 1807, 2224, 2982, 1127, 3130, 1712, 1745, 3075, 2092, 1121, 24, 656, 250, 2970, 483, 1524, 3110, 2290, 721, 2728, 2269, 3131, 2243, 2481, 338, 2551, 1005, 2052, 2125, 1292, 1651, 2597, 1973, 1238, 829, 207, 1665, 1240, 1320, 463, 508, 2969, 1985, 2531, 631, 2774, 2796, 136, 1857, 559, 324, 2443, 1768, 3012, 2910, 820, 2144, 2865, 709, 2846, 1074, 3217, 69, 3156, 3209, 2753, 2889, 2830, 1987, 2865, 1057, 97, 2705, 443, 2267, 2363, 681, 66, 396], +[146, 3049, 2663, 915, 124, 2308, 2884, 2179, 1477, 3165, 357, 250, 1514, 1536, 1597, 579, 2634, 2692, 1513, 1474, 1265, 2792, 873, 1445, 2435, 3097, 1990, 1743, 1266, 675, 2783, 1710, 2884, 2887, 2896, 2465, 1132, 1428, 62, 1083, 1511, 1290, 2095, 1733, 243, 2004, 2795, 247, 3011, 1010, 326, 591, 1372, 2405, 480, 3055, 2009, 515, 1404, 148, 2273, 2445, 1883, 1118, 2557, 3062, 68, 2344, 67, 643, 1470, 2386, 912, 275, 1351, 2153, 2979, 724, 73, 1857, 3088, 1211, 1746, 1337, 3095, 1903, 2869, 1586, 909, 2879, 1443, 801, 1616, 2050, 2974, 3139, 3168, 184, 2092, 1243, 2544, 1468, 704, 1797, 383, 2620, 631, 2891, 2917, 1966, 1117, 1190, 1972, 2258, 1500, 2926, 2846, 2866, 167, 1313, 3157, 2869, 1722, 2364, 751, 1520, 1008, 1328, 1787, 2375, 2651, 2616, 1513, 249, 914, 2071, 391, 3273, 1709, 2181, 2118, 325, 2858, 1234, 1523, 2028, 970, 2769, 1092, 2491, 1635, 3172, 2110, 2318, 2168, 2533, 2462, 2715, 2688, 52, 2751, 631, 1647, 2968, 3175, 1414, 2003, 478, 1836, 1800, 2688, 1556, 345, 1922, 2484, 3188, 2965, 3045, 1164, 767, 1841, 598, 483, 1755, 1365, 635, 719, 811, 2920, 529, 2994, 764, 3120, 1898, 2817, 2901, 2625, 70, 273, 1868, 600, 1049, 2094, 934, 1944, 877, 2797, 1217, 217, 1560, 2173, 528, 3010, 42, 1922, 160, 2657, 273, 2001, 25, 1531, 1453, 1825, 2866, 1572, 2318, 1053, 2440, 1132, 1600, 478, 519, 1455, 260, 2479, 469, 3033, 1947, 3143, 1529, 1960, 328, 2502, 2426, 1812, 1711, 30, 708, 2191, 1187, 1614, 3022, 1492, 1, 3186, 3092], +[2681, 3059, 984, 3117, 243, 914, 1137, 2819, 1551, 727, 1466, 2600, 314, 1375, 3302, 60, 115, 3096, 1245, 2710, 2931, 861, 1207, 1796, 2884, 584, 33, 1570, 1910, 2164, 2533, 938, 72, 1816, 1905, 1818, 3164, 2207, 3260, 2539, 2068, 2145, 2040, 2576, 1785, 2125, 712, 1780, 513, 2178, 3197, 1225, 2599, 1694, 1484, 433, 2381, 2900, 2590, 1253, 1450, 2778, 2822, 2698, 2413, 1071, 1769, 2648, 2517, 519, 3200, 1167, 1539, 2873, 1684, 1672, 2299, 707, 3272, 351, 2119, 3252, 1840, 1611, 543, 1792, 1224, 899, 3252, 991, 281, 608, 88, 1032, 1873, 3015, 1151, 1924, 386, 2741, 1220, 631, 309, 531, 1578, 630, 158, 823, 890, 146, 1277, 2543, 2821, 3033, 2479, 1844, 1957, 1955, 333, 1973, 1447, 1797, 1836, 3267, 1589, 2133, 3136, 2388, 1583, 2027, 2308, 3185, 1421, 2113, 1232, 2345, 84, 1181, 1874, 591, 315, 1039, 808, 3216, 1020, 1847, 2085, 312, 2680, 1916, 1518, 3151, 2837, 63, 2173, 2470, 1112, 2581, 3026, 1620, 1319, 2490, 1691, 2385, 1171, 856, 652, 964, 1145, 1478, 463, 819, 3042, 1201, 1380, 1977, 1556, 1023, 554, 1594, 343, 3115, 610, 2719, 3087, 3271, 1322, 2353, 2409, 2825, 1185, 2443, 2987, 803, 67, 803, 2761, 572, 3080, 1361, 3283, 2769, 2358, 206, 28, 2910, 1276, 1986, 2280, 1084, 2290, 856, 1572, 1611, 506, 2860, 1547, 46, 2721, 2800, 869, 2151, 2944, 267, 1061, 612, 3065, 156, 1441, 1241, 1463, 1382, 34, 2291, 1454, 95, 1196, 2427, 2645, 2292, 2511, 1706, 1413, 1442, 1752, 1348, 800, 2945, 2369, 1301, 1213, 1485, 769, 489, 2238, 997]] +eHat: [[1188, 957, 1854, 1760, 2017, 88, 868, 2372, 693, 1472, 2585, 1400, 703, 433, 285, 1530, 1630, 2272, 151, 2609, 1180, 2761, 644, 2679, 2660, 335, 601, 2078, 3050, 1130, 2149, 3115, 1708, 1655, 1728, 494, 2085, 1845, 398, 1935, 193, 1201, 2097, 1450, 1750, 2345, 444, 1826, 2013, 1078, 2698, 8, 1490, 588, 130, 2570, 497, 2623, 1411, 2635, 466, 697, 1232, 113, 935, 957, 2798, 518, 2017, 171, 3124, 2448, 2324, 433, 1140, 233, 562, 776, 2263, 2529, 2292, 2029, 122, 2008, 1839, 867, 138, 1193, 1029, 2575, 2162, 1872, 291, 1241, 433, 1926, 1072, 2199, 2765, 798, 1817, 1096, 3029, 2758, 995, 1389, 2676, 2342, 2735, 2718, 2927, 827, 3324, 262, 1621, 1702, 2966, 2568, 2212, 3290, 1192, 1794, 1833, 2804, 1974, 1438, 537, 854, 2601, 3328, 2472, 65, 3102, 1983, 1985, 1727, 2215, 3125, 1182, 1622, 1919, 781, 571, 2067, 1131, 208, 1586, 3043, 464, 614, 3057, 3259, 432, 1740, 1201, 2758, 3090, 1868, 9, 2816, 335, 1950, 1187, 107, 955, 1508, 1527, 567, 962, 810, 644, 376, 789, 2117, 146, 2175, 1674, 879, 2940, 3181, 1699, 290, 1965, 197, 1920, 287, 3289, 3003, 165, 1990, 3272, 2143, 724, 1268, 1132, 131, 473, 1610, 2858, 702, 2468, 351, 1270, 335, 2578, 251, 2873, 156, 566, 2502, 2806, 764, 2318, 2692, 2792, 2681, 563, 1522, 1042, 1447, 577, 627, 1958, 0, 1693, 203, 2669, 2636, 16, 2995, 1292, 107, 1634, 818, 2654, 493, 2990, 793, 2980, 2797, 1474, 1209, 2521, 3217, 1852, 1183, 1452, 915, 276, 952, 373, 2961, 377, 2848, 1334, 1992], +[660, 1462, 1225, 231, 1832, 1747, 446, 2909, 2260, 2983, 2541, 3043, 1601, 334, 2664, 576, 2804, 1440, 222, 886, 66, 827, 3269, 932, 622, 525, 2296, 2905, 2910, 1715, 975, 3096, 912, 3042, 816, 499, 3290, 1148, 710, 2164, 2767, 3112, 251, 1747, 359, 1338, 108, 3324, 801, 2445, 221, 156, 576, 3201, 2284, 2898, 2066, 2724, 504, 1961, 1593, 1258, 2258, 1285, 919, 510, 3319, 2749, 2221, 871, 3145, 1993, 2248, 1477, 3079, 2211, 1060, 541, 2461, 486, 2779, 2527, 2636, 3035, 1625, 2428, 1154, 1902, 112, 1179, 1357, 2583, 1665, 650, 3121, 812, 2923, 2451, 1643, 1659, 2761, 2880, 2319, 2781, 600, 1259, 281, 371, 1043, 1112, 746, 1141, 1719, 1515, 3002, 1431, 1716, 2137, 1529, 2076, 3236, 2321, 2396, 2645, 3058, 590, 2011, 2822, 3227, 1063, 1030, 423, 2421, 2647, 1887, 1873, 661, 3080, 3053, 856, 1540, 112, 1608, 151, 1822, 2253, 2260, 2572, 13, 888, 2506, 1945, 651, 360, 1111, 1906, 1704, 2273, 2852, 2268, 2021, 1101, 2451, 11, 1018, 2909, 1157, 1102, 2921, 1325, 2566, 2084, 934, 1191, 2414, 1459, 700, 447, 1178, 843, 2590, 836, 1371, 2535, 2327, 247, 286, 3135, 3043, 3282, 3287, 749, 1565, 922, 522, 2734, 2843, 1879, 1602, 1287, 3306, 3003, 1355, 2699, 2926, 461, 3195, 363, 730, 1433, 2374, 165, 917, 2990, 1976, 847, 2761, 2088, 923, 776, 305, 311, 1511, 2786, 2987, 3298, 687, 626, 344, 130, 2444, 2642, 2218, 1765, 2093, 3202, 2462, 3218, 1164, 3204, 1215, 2887, 3254, 622, 2544, 2340, 2047, 1413, 1246, 1099, 3313, 2317, 601, 2352, 411, 2615], +[153, 1005, 2013, 532, 1130, 2665, 1355, 739, 3165, 2693, 371, 3127, 1007, 1010, 2105, 2202, 956, 1878, 1528, 2279, 221, 2621, 153, 398, 1973, 1308, 1451, 80, 3200, 589, 1017, 2428, 737, 3132, 2638, 487, 1023, 1676, 3103, 2390, 655, 2497, 1654, 2329, 1154, 505, 1204, 1810, 1805, 3262, 785, 353, 994, 658, 2437, 1148, 2197, 3229, 70, 1811, 1271, 162, 2431, 2246, 690, 2678, 1875, 2044, 264, 985, 1210, 2388, 308, 2081, 1676, 2471, 805, 2364, 728, 526, 1248, 3246, 623, 2912, 355, 391, 631, 1596, 542, 1146, 1476, 565, 2831, 1362, 2943, 2944, 2544, 390, 2626, 1996, 1103, 3135, 628, 1411, 2217, 1858, 1445, 2566, 1438, 2031, 2535, 220, 596, 1747, 1331, 2503, 86, 779, 3149, 2835, 2958, 2333, 1812, 604, 7, 472, 2046, 1230, 3019, 2780, 1362, 2592, 918, 1585, 1458, 2473, 3249, 2330, 298, 2364, 2580, 699, 3088, 208, 1969, 2024, 85, 2280, 361, 251, 909, 3156, 196, 3037, 853, 2215, 1397, 1255, 2016, 2247, 163, 3180, 1817, 694, 3254, 2878, 2937, 3280, 1957, 2267, 1003, 2286, 3020, 2037, 2688, 1570, 2071, 352, 2374, 3295, 1935, 2634, 2133, 1590, 2202, 2574, 3140, 2541, 1782, 683, 1009, 1293, 2297, 3325, 2875, 2390, 1811, 2168, 2221, 1348, 1140, 1525, 1503, 1550, 492, 508, 227, 1523, 432, 2674, 896, 1324, 357, 2279, 2312, 3028, 907, 892, 3222, 404, 1767, 105, 2378, 109, 2900, 3090, 1661, 964, 3320, 341, 1636, 724, 2551, 2540, 2273, 1818, 326, 3148, 488, 1760, 706, 221, 3306, 453, 1264, 877, 2571, 3193, 716, 290, 3106, 1728, 2563, 892, 920, 2144], +[688, 1592, 214, 3271, 2431, 1606, 831, 1479, 388, 3003, 2320, 1682, 1456, 3211, 2513, 2272, 1060, 1871, 969, 1896, 648, 3000, 95, 3075, 3277, 386, 363, 470, 294, 1239, 371, 1109, 2835, 138, 2534, 540, 2522, 1460, 3243, 2434, 772, 3161, 3184, 69, 2491, 1174, 344, 973, 2366, 1649, 2468, 1888, 2030, 940, 3055, 712, 1197, 103, 939, 1873, 2083, 1011, 3315, 2546, 2746, 3025, 3218, 279, 1662, 2881, 979, 1158, 2828, 846, 1158, 2539, 1638, 2212, 560, 117, 2418, 2844, 2013, 1115, 970, 1551, 1891, 1294, 332, 1761, 563, 3145, 738, 1892, 3232, 648, 2870, 8, 809, 1136, 2962, 2893, 2419, 3060, 1695, 795, 348, 2859, 2331, 2900, 1581, 2299, 826, 993, 1165, 61, 2560, 3189, 1196, 3274, 690, 1564, 207, 3256, 2970, 1760, 1721, 3136, 1601, 2694, 706, 2503, 2281, 1899, 2084, 1341, 949, 2015, 1584, 2203, 1352, 1384, 1812, 417, 1662, 2599, 2747, 1867, 2197, 903, 3188, 2060, 1078, 601, 1630, 3177, 259, 1388, 1220, 1330, 175, 866, 1614, 902, 1314, 969, 1663, 1014, 1733, 2308, 1780, 3041, 336, 3067, 935, 2283, 2630, 2566, 754, 378, 2058, 1559, 450, 475, 666, 1407, 255, 1817, 2301, 2155, 1624, 59, 2518, 2096, 454, 1, 1817, 1957, 1852, 602, 1822, 1713, 441, 3058, 1699, 761, 338, 3151, 1758, 1360, 823, 2014, 967, 2460, 2305, 2457, 581, 3114, 155, 3225, 337, 2637, 866, 2055, 496, 2471, 2985, 2190, 2676, 2213, 2936, 2675, 296, 736, 1084, 2315, 419, 2485, 165, 1288, 811, 296, 2261, 1224, 1333, 212, 132, 987, 3258, 2750, 2510, 1364, 337, 712, 2877, 766]] +aHat * sHat: [[2509, 65, 2803, 1938, 2517, 130, 780, 1456, 1710, 2897, 2632, 206, 2222, 1377, 281, 188, 1646, 1437, 1397, 693, 2361, 432, 433, 1853, 2559, 3145, 1827, 1581, 2872, 2857, 1481, 771, 79, 900, 1054, 654, 2518, 2823, 2717, 121, 1805, 842, 2412, 2876, 1846, 2327, 2737, 1696, 3282, 938, 2467, 2146, 3162, 2040, 1422, 3259, 1492, 813, 2104, 788, 74, 1714, 589, 522, 356, 1978, 2852, 1744, 1355, 1629, 1549, 2462, 109, 641, 1787, 1186, 3008, 234, 2719, 1125, 2418, 2371, 989, 2567, 2821, 2765, 844, 3211, 2329, 17, 1930, 2225, 2726, 1266, 2860, 185, 397, 1023, 1960, 3303, 3081, 1488, 1182, 12, 3135, 2583, 2960, 1142, 2103, 2273, 427, 2172, 437, 2889, 1326, 1249, 1197, 415, 451, 3116, 204, 2203, 1763, 977, 1392, 178, 1879, 3296, 1653, 2351, 337, 715, 876, 614, 607, 3011, 3041, 2978, 290, 1405, 1653, 3127, 2479, 400, 280, 2364, 3208, 1354, 653, 2828, 540, 2798, 1322, 1238, 1810, 201, 2243, 1455, 997, 2849, 2792, 3048, 2976, 1196, 2340, 90, 1385, 2434, 142, 785, 2909, 1964, 2673, 1363, 1343, 783, 1684, 1128, 2457, 975, 1066, 3219, 936, 2524, 1171, 879, 1458, 375, 1547, 30, 797, 2146, 2668, 2875, 2908, 469, 1581, 537, 2233, 1574, 2653, 2993, 1297, 403, 182, 1458, 707, 1574, 2908, 1924, 61, 2511, 2979, 2427, 2139, 2892, 2317, 12, 1863, 1029, 2977, 232, 1856, 1298, 2159, 164, 308, 622, 777, 1278, 110, 2075, 53, 602, 2071, 3153, 1188, 2864, 2300, 3069, 1683, 2106, 1767, 2426, 720, 606, 85, 2599, 1121, 1081, 479, 3093, 501, 23, 2232, 2098], +[2537, 897, 572, 210, 2232, 2325, 1387, 775, 710, 90, 525, 2028, 337, 17, 1446, 194, 403, 55, 999, 1580, 108, 3272, 1122, 2223, 87, 254, 1628, 685, 971, 2207, 115, 2376, 1808, 172, 3130, 383, 839, 3051, 651, 699, 2169, 1797, 2488, 1839, 2796, 1342, 2781, 326, 1814, 2750, 2071, 566, 1234, 1369, 1969, 1672, 2529, 2526, 611, 1758, 1293, 1086, 2580, 2686, 305, 1446, 1062, 1134, 1101, 2335, 2374, 825, 1170, 3067, 2589, 2963, 767, 226, 1698, 380, 541, 1945, 580, 3275, 1292, 505, 3006, 2175, 936, 1762, 58, 601, 1281, 2612, 787, 1122, 1010, 709, 2885, 1159, 3097, 2951, 1261, 1152, 796, 684, 641, 2114, 254, 2467, 3172, 1802, 2372, 2000, 1055, 449, 865, 2084, 790, 1004, 1841, 1164, 2471, 2075, 1931, 2928, 1326, 3153, 2241, 341, 3111, 1309, 175, 463, 2584, 2710, 2793, 927, 184, 2496, 1891, 274, 716, 306, 3326, 2561, 2985, 552, 1595, 1123, 1198, 2206, 2812, 1713, 1517, 204, 2392, 1559, 631, 1178, 1672, 2249, 1234, 2274, 2316, 1921, 19, 2042, 2009, 1239, 118, 1240, 227, 1241, 383, 2271, 3063, 907, 2712, 1676, 1188, 3196, 2340, 1044, 1673, 1810, 68, 1311, 3177, 2595, 1426, 1713, 883, 2585, 217, 2826, 2840, 2834, 2642, 1455, 1319, 630, 2769, 2696, 306, 2651, 1349, 638, 699, 1428, 2518, 2567, 3112, 2181, 892, 2345, 611, 277, 540, 787, 1865, 1735, 1401, 176, 2015, 2845, 2325, 1442, 3066, 1760, 3096, 2585, 1847, 3098, 1899, 3013, 3013, 511, 2298, 882, 2664, 2613, 1005, 1131, 107, 973, 1277, 3178, 784, 1612, 2523, 3070, 2450, 2506, 1091, 2049], +[1286, 2474, 3112, 1474, 1364, 73, 1088, 2985, 2631, 1792, 2704, 2856, 2219, 3121, 2733, 1009, 1919, 170, 1978, 1755, 2298, 1873, 1170, 2086, 2487, 3196, 2676, 124, 1996, 1409, 2867, 2090, 278, 2976, 978, 352, 2335, 1011, 1617, 2413, 154, 703, 524, 1112, 1297, 1854, 86, 1832, 1767, 364, 93, 326, 2378, 1721, 2619, 1918, 1910, 792, 1415, 195, 1720, 442, 585, 1430, 814, 2148, 950, 3150, 2551, 248, 300, 113, 2210, 3239, 2733, 3110, 236, 871, 1108, 1819, 2916, 434, 443, 95, 1665, 2278, 1861, 564, 259, 1193, 2377, 392, 2864, 765, 269, 2061, 2390, 759, 2932, 3208, 3081, 1817, 671, 730, 2232, 2775, 1005, 1386, 947, 326, 2632, 457, 564, 2842, 306, 2720, 1462, 2998, 26, 76, 818, 998, 2178, 3059, 1235, 863, 2138, 464, 2508, 305, 2325, 1172, 806, 2167, 2414, 2181, 707, 1492, 3202, 986, 1522, 2587, 2389, 2422, 2362, 3025, 1048, 750, 1474, 1506, 561, 2256, 785, 1995, 1803, 2479, 1684, 2729, 920, 2467, 1045, 2941, 1666, 352, 1450, 2104, 2003, 79, 1202, 3052, 1283, 1368, 368, 2651, 0, 1444, 2717, 2244, 528, 3182, 2246, 1781, 1182, 374, 2629, 2137, 748, 0, 700, 1162, 3211, 2030, 157, 3032, 2736, 1949, 2206, 2784, 954, 1091, 2453, 2601, 1851, 1054, 1473, 611, 2299, 355, 1348, 1364, 598, 69, 1358, 2547, 2852, 1053, 1653, 1780, 1099, 998, 3067, 889, 357, 1937, 395, 2587, 381, 628, 534, 296, 2825, 26, 395, 2469, 1008, 2262, 1025, 1, 944, 3035, 1657, 2901, 1125, 1857, 3150, 1075, 935, 1172, 600, 2007, 591, 657, 1267, 113, 2607, 2904], +[1492, 3021, 868, 2511, 2212, 612, 741, 516, 527, 956, 2887, 329, 2931, 235, 1121, 2871, 2234, 2848, 168, 2285, 583, 273, 2453, 2787, 308, 3180, 1259, 83, 2452, 854, 921, 2976, 1043, 2634, 2827, 1084, 1777, 1333, 2958, 941, 89, 630, 2704, 1794, 153, 755, 1741, 3150, 2464, 2928, 3044, 2668, 2674, 198, 2321, 2172, 962, 3121, 500, 2609, 2247, 1648, 2306, 2828, 3169, 740, 879, 2263, 3205, 685, 1918, 392, 304, 2692, 1530, 748, 581, 764, 1906, 2326, 2808, 1968, 2502, 1857, 1177, 1351, 1461, 1738, 1490, 3036, 2270, 2728, 708, 2819, 3304, 878, 2835, 1999, 2785, 3089, 1638, 3225, 1726, 1250, 919, 303, 93, 2273, 271, 2643, 2346, 2748, 694, 2756, 682, 2701, 1563, 1935, 202, 549, 2136, 1819, 305, 3269, 1527, 2651, 2246, 2459, 829, 2887, 2175, 1715, 493, 527, 3041, 3061, 2731, 1034, 1452, 1624, 771, 2293, 1911, 2420, 2167, 2033, 2741, 2052, 915, 1296, 2552, 1709, 2836, 758, 127, 1003, 2200, 1820, 1632, 3021, 1971, 2499, 1329, 1877, 2603, 1366, 1177, 278, 38, 1624, 1455, 1623, 298, 822, 2121, 2852, 2112, 629, 2811, 1500, 870, 774, 963, 1986, 2408, 2541, 967, 780, 899, 1386, 316, 2299, 1539, 1563, 2748, 1273, 492, 1402, 1575, 220, 1279, 3036, 1283, 3077, 153, 657, 3075, 710, 1677, 2587, 1796, 3141, 1175, 1109, 878, 2337, 2597, 2736, 775, 1473, 2503, 1901, 2868, 2165, 225, 2380, 2941, 996, 804, 2727, 244, 1976, 2542, 692, 1334, 31, 450, 1993, 3159, 2896, 2919, 1237, 41, 2559, 3026, 697, 2888, 563, 1026, 841, 2282, 2774, 312, 2848, 1008, 1401]] +tHat = aHat * sHat + eHat: [[368, 1022, 1328, 369, 1205, 218, 1648, 499, 2403, 1040, 1888, 1606, 2925, 1810, 566, 1718, 3276, 380, 1548, 3302, 212, 3193, 1077, 1203, 1890, 151, 2428, 330, 2593, 658, 301, 557, 1787, 2555, 2782, 1148, 1274, 1339, 3115, 2056, 1998, 2043, 1180, 997, 267, 1343, 3181, 193, 1966, 2016, 1836, 2154, 1323, 2628, 1552, 2500, 1989, 107, 186, 94, 540, 2411, 1821, 635, 1291, 2935, 2321, 2262, 43, 1800, 1344, 1581, 2433, 1074, 2927, 1419, 241, 1010, 1653, 325, 1381, 1071, 1111, 1246, 1331, 303, 982, 1075, 29, 2592, 763, 768, 3017, 2507, 3293, 2111, 1469, 3222, 1396, 772, 1569, 2584, 882, 2770, 801, 643, 2307, 155, 1509, 1662, 25, 2999, 432, 3151, 2947, 2951, 834, 2983, 2663, 3077, 1396, 668, 267, 452, 37, 1616, 2416, 821, 925, 2350, 2809, 780, 649, 2597, 2592, 1409, 1927, 2774, 1472, 3027, 243, 579, 3050, 2467, 1411, 2572, 1465, 1068, 1117, 113, 268, 2728, 1754, 2978, 3011, 2959, 2004, 3323, 1006, 2336, 3127, 1669, 834, 1303, 3295, 1598, 2912, 3001, 1104, 1595, 224, 2340, 133, 151, 1489, 2958, 29, 2007, 2068, 827, 2765, 180, 2901, 2721, 3091, 1166, 1418, 49, 1712, 2020, 740, 960, 63, 814, 711, 600, 2054, 2147, 1762, 2276, 1792, 15, 2567, 738, 2760, 1709, 251, 1730, 145, 1097, 2867, 3275, 1968, 1790, 1602, 2244, 2880, 1534, 2905, 2476, 225, 859, 485, 1298, 523, 367, 2977, 3258, 793, 944, 1402, 2182, 1687, 1420, 1396, 317, 849, 328, 1951, 2537, 3157, 3315, 959, 2314, 2572, 1789, 1537, 185, 1397, 2033, 852, 2725, 878, 2871, 237, 761], +[3197, 2359, 1797, 441, 735, 743, 1833, 355, 2970, 3073, 3066, 1742, 1938, 351, 781, 770, 3207, 1495, 1221, 2466, 174, 770, 1062, 3155, 709, 779, 595, 261, 552, 593, 1090, 2143, 2720, 3214, 617, 882, 800, 870, 1361, 2863, 1607, 1580, 2739, 257, 3155, 2680, 2889, 321, 2615, 1866, 2292, 722, 1810, 1241, 924, 1241, 1266, 1921, 1115, 390, 2886, 2344, 1509, 642, 1224, 1956, 1052, 554, 3322, 3206, 2190, 2818, 89, 1215, 2339, 1845, 1827, 767, 830, 866, 3320, 1143, 3216, 2981, 2917, 2933, 831, 748, 1048, 2941, 1415, 3184, 2946, 3262, 579, 1934, 604, 3160, 1199, 2818, 2529, 2502, 251, 604, 1396, 1943, 922, 2485, 1297, 250, 589, 2943, 762, 186, 728, 1880, 2581, 892, 2319, 3080, 1748, 156, 1538, 1391, 1660, 189, 8, 2646, 2139, 1404, 812, 1732, 2596, 3110, 1142, 1254, 125, 678, 3237, 23, 102, 386, 2324, 457, 1819, 1485, 1916, 3124, 1608, 2011, 375, 822, 134, 2073, 2628, 2110, 767, 503, 154, 117, 364, 21, 356, 2285, 5, 1501, 1176, 3144, 1601, 2564, 2684, 3324, 1161, 2432, 2797, 401, 434, 1354, 561, 2519, 449, 703, 382, 250, 671, 2057, 354, 1117, 2891, 2548, 1384, 2462, 2448, 178, 739, 2231, 2354, 1384, 915, 2742, 1296, 304, 795, 2066, 3232, 3112, 1215, 1001, 1429, 2861, 1563, 2732, 700, 1842, 2868, 3192, 43, 2365, 1463, 1563, 2170, 2046, 2912, 2962, 1673, 2814, 3012, 2068, 81, 1890, 2211, 1898, 736, 1534, 663, 2886, 2146, 400, 133, 757, 550, 2171, 930, 1753, 2651, 3313, 3324, 1262, 2030, 2711, 2507, 2058, 3051, 1529, 1502, 1335], +[1439, 150, 1796, 2006, 2494, 2738, 2443, 395, 2467, 1156, 3075, 2654, 3226, 802, 1509, 3211, 2875, 2048, 177, 705, 2519, 1165, 1323, 2484, 1131, 1175, 798, 204, 1867, 1998, 555, 1189, 1015, 2779, 287, 839, 29, 2687, 1391, 1474, 809, 3200, 2178, 112, 2451, 2359, 1290, 313, 243, 297, 878, 679, 43, 2379, 1727, 3066, 778, 692, 1485, 2006, 2991, 604, 3016, 347, 1504, 1497, 2825, 1865, 2815, 1233, 1510, 2501, 2518, 1991, 1080, 2252, 1041, 3235, 1836, 2345, 835, 351, 1066, 3007, 2020, 2669, 2492, 2160, 801, 2339, 524, 957, 2366, 2127, 3212, 1676, 1605, 1149, 2229, 1875, 855, 1623, 1299, 2141, 1120, 1304, 2450, 623, 2385, 2357, 1838, 677, 1160, 1260, 1637, 1894, 1548, 448, 3175, 2911, 447, 2, 661, 334, 1242, 1335, 855, 1694, 2198, 3085, 358, 435, 1724, 423, 543, 1325, 627, 493, 171, 21, 773, 3286, 2148, 2630, 1002, 1720, 1133, 3030, 1835, 1757, 1470, 2083, 981, 1703, 2656, 1365, 3081, 655, 2936, 1385, 1208, 2792, 154, 1046, 1375, 1653, 1611, 30, 3159, 1990, 2286, 325, 59, 1359, 2688, 3014, 1459, 2596, 2902, 3148, 852, 1086, 3315, 1964, 1502, 1382, 559, 2541, 2482, 1845, 891, 3323, 2454, 3028, 2282, 1010, 688, 1623, 3175, 2439, 264, 797, 25, 2604, 1965, 1119, 2526, 1878, 1780, 709, 1494, 1393, 1715, 1497, 1835, 752, 2560, 2672, 992, 1402, 1505, 994, 2735, 2046, 3295, 2348, 2042, 1592, 525, 637, 1132, 750, 2946, 1680, 3281, 751, 1351, 3149, 1432, 1466, 2363, 3122, 1102, 2310, 1085, 1952, 177, 1036, 1316, 2297, 368, 2385, 501, 1005, 198, 1719], +[2180, 1284, 1082, 2453, 1314, 2218, 1572, 1995, 915, 630, 1878, 2011, 1058, 117, 305, 1814, 3294, 1390, 1137, 852, 1231, 3273, 2548, 2533, 256, 237, 1622, 553, 2746, 2093, 1292, 756, 549, 2772, 2032, 1624, 970, 2793, 2872, 46, 861, 462, 2559, 1863, 2644, 1929, 2085, 794, 1501, 1248, 2183, 1227, 1375, 1138, 2047, 2884, 2159, 3224, 1439, 1153, 1001, 2659, 2292, 2045, 2586, 436, 768, 2542, 1538, 237, 2897, 1550, 3132, 209, 2688, 3287, 2219, 2976, 2466, 2443, 1897, 1483, 1186, 2972, 2147, 2902, 23, 3032, 1822, 1468, 2833, 2544, 1446, 1382, 3207, 1526, 2376, 2007, 265, 896, 1271, 2789, 816, 981, 2614, 1098, 441, 1803, 2602, 2214, 598, 1718, 1520, 420, 1847, 2762, 794, 1795, 1398, 494, 2826, 54, 512, 3196, 1168, 1082, 638, 2266, 2430, 2252, 2881, 889, 2774, 2426, 1796, 1073, 351, 3049, 3036, 498, 2123, 348, 394, 2837, 500, 1303, 2159, 590, 3112, 2199, 2411, 440, 585, 1359, 1757, 851, 2459, 3208, 2852, 1022, 2146, 36, 2943, 2779, 588, 2335, 2840, 1292, 1771, 603, 3235, 1335, 634, 560, 3056, 1806, 1413, 3195, 236, 1878, 2928, 2333, 1413, 2461, 3074, 619, 1222, 2597, 3200, 212, 1940, 2358, 728, 330, 3202, 1274, 2309, 30, 98, 822, 3101, 1420, 1724, 2806, 1852, 1418, 84, 532, 106, 618, 2619, 1826, 2142, 240, 3183, 1465, 3178, 2521, 930, 1369, 2840, 1209, 405, 891, 721, 1522, 2597, 3186, 151, 1611, 3180, 1322, 2838, 1428, 2418, 2346, 869, 1149, 3324, 855, 401, 1533, 2302, 454, 1030, 909, 3020, 1550, 955, 262, 1463, 809, 649, 231, 556, 2167]] + +ek: 70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B +dk: 8AD0B5F09A25AA935DD9DA34AB82CA75A12D66E99CF48BCA45B9B2DB441BC2971BDC9922B5F8BC3C0678546759073CB88E26BAD1B1B3A4646A6529C632EAA347734A3BE583D47178094C4A670CBC41EC0689765668542E6F15A7D586C9E26A6A03C71469C2C53F7B141B232D86216A25C7A8F36852858C07A9524EE17BA6340AA2A215C1EA852167B6891CC166C2FA13A0270A22983413E0ACC444BF40E28C45E14E07404F62996369597F10FCC180ECACAD1A6719AB9F1B447AE19A2CB02A7D04206172168C4F0A99BAFA932D6649E894A8F0577B81C66483C5B5CF60AE75A444526A9B3674325FBA38F53296421A785011C1DDB3A6997745DB83CD583C0C4177C797D40A4F699F1F40C5413AC4E42373492B6A2C6A406D437F42570B5E949EF4350DEA790CFEB72D1287517FE3273D3CA65A13CA6E23C57BF07DA04B851CF3AFA18BAF5EF020792857A9E721F01B9FEA7B612E4C6E29079366B0228688BE2A067FBE92842DD280B3C74DFAB761E613A8604C476E15466685C695AC35791A9159942F60170CA214C7C09B1A4B1BCC4F4CC60DF01A101915A9A2BC553119665032DCD9476FBA7BB07157D33C9C8EFA6BD0AC38C1AC265FB51857D01517615326CA0E08650BA6FA40832C7B4C41B644716022B652B1927D55C9B37FE25F1AB67A9A03C7008C84B07C4926B6381E40CFD441041235187416CEC366CA6FB76FA0AB6E328A2641FC47DCD76E91CA9431E19BFF02CE6228C2336382F8A10E9EE2C8F1759390A20024A15B3B090C1390CA0343797284246BD8943507B7A6B71FC33A03B7A88366E4AFED515739E5C69F8A266E4A1F53D73930E9875569312B27037E5C7F852100C2BA3648B1B9C1B149F6250E0A6B065213134F302569755B8C5C4FFC680BF7811845340035F170B068BA67A4C3B0166D03CC8261840190A20F9A3B1EF465C2F2182DA8DA8D3B3C8CB12915F7D93E04D8840C3567255A7BD6D433CF1068D88452CFC11F991B7CE37927D6CAAE8810742F42148B896EC4EBB5340386315B2C1E2B43915C04549CC8C19AB40E3B7C311B426110A9BBB18D3B992A42C0189290BE673A397C4090443B88C5D5C565A10FEA05603D36244A4AA8E9255CF184AE69535A8399C1C6F76CF2342ADFEA6A447BB4501B9A6C44593EB043E7A5502F586CF3407DEB7A0FC32B3F46F1245C5596E0F1BED937207C4509E1D8985BE745FD69BF448092433028BE2595903311479586A34B2D49107410BC4BD2965317FC76352B638DF3B3A315325026809E3BC4608C0B2CB84DF0C95BC052707FC1A377B2B465EB7A5D644AB4278DDCE5B61E2BB3A71052555CB3BAC693EF025FF00353FB76945B8AA3E9950F9273818791CCAD56884658142A2B4DF3C57ECA13AD44B49B6346C63EE89078589E9EB9A9804A03BF7A276F86B9676C58D3E71D2C8770804A61592178B449C7955BBE8CF42F316725E3B16D55B527CFB232681B21B2CB2F30AC76015BB5416A0411C1745892412E683A98D736ED1A4CD980617D0821C2AB0282070A611A11D19701FBD55A2127B324E6901D84986C0464DE7120AF4510AF591DD9BB79479C5FA88714C6A99714F76A1E402C8F384A4EE6BCD41500724CC1793ABFD8D3C2F320397134B00F762DBA85A23AF155E6CC037380C1DD64A973DB35B74470448B24212062764787E5A93A48807171A7715CFC89BCBC9E141886F807A1F9D684C8426F0122887D9C4C27EA69CC151B4D49B51E5A4EAAA5AD06ABA86DF942E986A5D5792080FC480396B3948668FB382CC8FC154748CB30B7641F0270C83438B4FC3D1901265880405177BC7F44788251ABC474273531212A66279E70337A2309FDF49E059BBDAF4973A5377A4D517BA755702C37CC355685404C952FB67E0419C78D1584D0949254D04952F7243BF1402803C9FC737325881378CA77EEF5C415FB037D689A5854A1D24B6527A59B9B16959384358C423C79645CCF3133E21B4B64957B14F63F2AA26357B1C262F2A90F7CCC2A15936999B0A1B498AB3B32433032C9CA23081C55D31CAD36E90C1CE0B5FC247CE8C843F2883524B664FAC1B20BE602A10AAF65738680BB10254426F9CB09A1954DB7655622308FAEF505ACB497554A8FCFA96A85255AD846542013B8415951BDD45C01931EBE583E70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271BE6E832F2498CA5A3431F40D3187B1ED965FDD6693B37F6EB408A99977AE496447AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt new file mode 100644 index 000000000..4badc394d --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt @@ -0,0 +1,29 @@ +Key Generation -- ML-KEM-512 +z: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC +d: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC + +rho: B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 +sigma: AC0901D990F43DD3FBC28234B27082414B64B340950CB71059DC2EE2712BF19C + +aHat: [[[874, 2151, 1834, 1833, 1123, 1560, 1623, 2685, 2968, 1755, 479, 522, 3279, 3134, 2578, 1373, 1613, 1975, 2734, 2886, 2848, 2425, 3302, 1229, 35, 2238, 1168, 1710, 2456, 109, 2249, 2281, 856, 98, 2411, 1748, 646, 2423, 1182, 501, 2636, 3290, 2232, 2204, 1912, 553, 1609, 2800, 1034, 2472, 1002, 2938, 1255, 1057, 2987, 2203, 1005, 3160, 136, 1693, 2708, 2228, 3141, 2666, 1886, 2059, 3154, 724, 456, 2863, 1913, 2237, 1847, 665, 2204, 1641, 791, 3068, 756, 81, 709, 2728, 2207, 1650, 1620, 2345, 854, 2044, 3255, 1014, 1710, 695, 2732, 1558, 1211, 527, 2351, 684, 1557, 655, 2771, 1658, 1508, 3022, 2189, 2389, 698, 365, 517, 1479, 2069, 211, 2498, 303, 195, 2883, 1279, 2888, 1430, 542, 1408, 2098, 1702, 1521, 165, 1755, 2634, 2979, 517, 878, 2569, 1750, 2099, 3296, 2834, 2898, 1754, 3182, 2974, 1779, 906, 2264, 3227, 523, 2593, 124, 590, 1108, 1741, 1521, 2489, 510, 1081, 1153, 531, 117, 866, 443, 347, 2026, 17, 241, 1803, 2857, 1806, 3317, 2301, 32, 2694, 2336, 1767, 832, 2127, 2642, 447, 231, 1849, 561, 3131, 133, 2619, 1571, 1669, 81, 2340, 2208, 2989, 949, 2962, 48, 2159, 1060, 977, 801, 1283, 564, 2120, 1236, 1824, 2651, 1362, 834, 2749, 1383, 991, 196, 2701, 3234, 1294, 888, 998, 679, 1821, 666, 2277, 2962, 2453, 2188, 807, 2175, 2682, 1058, 2254, 849, 1796, 2731, 568, 858, 2107, 2649, 715, 2217, 2404, 73, 821, 24, 1050, 1367, 356, 2395, 2238, 1378, 1125, 258, 2965, 917, 1166, 2616, 620, 1385, 1126, 1895, 864, 2923, 2356, 671], +[3311, 1836, 162, 1739, 606, 1712, 627, 1758, 1002, 3101, 946, 1310, 2995, 1857, 2569, 2796, 1743, 1146, 3210, 168, 94, 1700, 628, 3077, 1949, 1668, 1601, 1698, 835, 814, 2372, 1960, 1896, 1507, 1715, 1590, 1310, 1269, 1591, 2109, 3041, 4, 1484, 779, 341, 1192, 3099, 1440, 931, 2552, 2114, 2837, 1259, 3039, 3312, 1146, 1360, 2275, 1836, 789, 1545, 1665, 2107, 145, 1914, 2633, 1890, 2732, 2083, 75, 2826, 2165, 2518, 1587, 1961, 349, 2697, 1315, 69, 3259, 1570, 447, 587, 2759, 3091, 525, 2125, 2702, 178, 1374, 633, 3177, 2760, 2028, 3214, 3275, 2911, 3019, 3032, 79, 2180, 2971, 974, 941, 3024, 873, 506, 1825, 2951, 3030, 3065, 1523, 30, 2625, 1916, 959, 43, 1866, 3188, 2534, 316, 1647, 2692, 2318, 1881, 1579, 324, 73, 2897, 1170, 673, 1402, 1377, 2819, 2723, 1685, 123, 1814, 2583, 986, 2878, 542, 1762, 1513, 1639, 1309, 3325, 1432, 1284, 2587, 2444, 1861, 2898, 1994, 1878, 2072, 1689, 501, 2896, 102, 2572, 1928, 3125, 1480, 1420, 286, 1988, 2536, 132, 1335, 1795, 420, 1503, 623, 1228, 2807, 2741, 2155, 80, 2800, 2546, 661, 1914, 2439, 1421, 1650, 535, 3059, 982, 1519, 635, 5, 1519, 643, 2693, 2774, 1813, 1940, 3021, 384, 1287, 2782, 114, 2365, 2690, 1973, 289, 356, 123, 1710, 2328, 2540, 2418, 3259, 2268, 1529, 2479, 1824, 483, 260, 786, 89, 1767, 2085, 56, 3052, 3155, 2485, 925, 1483, 2331, 1902, 2798, 2526, 1532, 2792, 694, 3039, 1848, 3173, 1998, 552, 1978, 2634, 2084, 217, 992, 139, 407, 365, 274, 1279, 1682, 782, 2133, 2292]], +[[704, 1581, 1782, 3300, 319, 2966, 3229, 425, 636, 465, 2507, 2501, 599, 2768, 2663, 1274, 2799, 1206, 2202, 1994, 312, 1774, 3064, 2777, 582, 1277, 1448, 2237, 1577, 1039, 1440, 2351, 1103, 1239, 1957, 3022, 163, 64, 845, 1905, 94, 2267, 1063, 2277, 2053, 2900, 1759, 2027, 614, 2596, 1196, 633, 1624, 2855, 2133, 434, 459, 579, 213, 573, 804, 1256, 2377, 3263, 646, 1464, 2950, 1846, 2594, 2737, 746, 1866, 2663, 1472, 151, 2479, 2680, 1863, 2361, 2532, 607, 1070, 2194, 275, 514, 242, 2025, 1254, 3147, 2015, 2301, 594, 794, 1753, 2774, 1728, 470, 1067, 916, 2934, 412, 3062, 1254, 2672, 2712, 2972, 1068, 2144, 2791, 3262, 1345, 774, 2646, 1092, 1905, 3148, 228, 517, 1634, 2077, 2564, 1485, 1116, 2445, 2830, 1978, 971, 165, 742, 1118, 1262, 276, 3221, 319, 1708, 1129, 2544, 1548, 2239, 1855, 1386, 1718, 1449, 1424, 1765, 1483, 1748, 361, 1434, 339, 1651, 790, 401, 2347, 1058, 588, 3088, 1579, 326, 1413, 3050, 3161, 3086, 1880, 253, 1307, 1630, 1074, 1664, 2738, 396, 1987, 714, 1243, 651, 261, 173, 741, 2760, 318, 198, 2501, 2361, 1523, 3066, 2218, 36, 354, 1117, 330, 2148, 517, 1221, 3152, 1845, 1099, 1897, 3159, 3008, 79, 542, 1244, 2627, 2347, 2259, 884, 1088, 74, 652, 408, 3248, 2727, 376, 2805, 2253, 1925, 339, 1447, 1973, 120, 2949, 2273, 1850, 1528, 2211, 2211, 2411, 1920, 2173, 2688, 2943, 2864, 2904, 508, 1412, 1454, 687, 541, 2408, 3258, 795, 3013, 1824, 330, 1047, 1375, 469, 41, 3100, 2334, 1321, 1654, 1849, 2078, 909, 374], +[206, 3093, 1216, 1950, 1396, 3065, 1119, 3323, 2732, 1581, 70, 2075, 1035, 658, 354, 777, 1357, 650, 2033, 2517, 896, 2303, 3237, 186, 2106, 2128, 596, 3180, 1400, 2980, 495, 2122, 843, 339, 261, 315, 841, 2221, 2768, 2702, 1567, 218, 2327, 1797, 1780, 1334, 490, 2946, 592, 2803, 804, 348, 3227, 1956, 885, 3316, 20, 2295, 2938, 1893, 2630, 1058, 2222, 2449, 1682, 1110, 1651, 2703, 1651, 89, 2228, 2831, 2312, 2897, 999, 2236, 3085, 220, 2765, 3270, 2998, 1891, 2798, 3083, 2197, 1517, 1253, 1666, 1681, 3101, 2775, 1721, 600, 2112, 387, 284, 468, 1330, 1440, 1938, 2252, 2404, 698, 2402, 1883, 2558, 1112, 706, 1007, 2571, 2375, 408, 565, 2839, 1182, 1976, 817, 920, 2775, 580, 437, 3071, 2833, 711, 200, 1973, 1621, 3198, 3065, 128, 1765, 208, 2197, 3151, 2237, 706, 229, 2769, 1253, 3268, 507, 1662, 748, 2455, 1707, 2980, 2562, 1470, 33, 1591, 1455, 2926, 1047, 2430, 50, 217, 430, 727, 3182, 2318, 2416, 1565, 2153, 2128, 3106, 2065, 1435, 1245, 1012, 1932, 339, 1886, 3281, 764, 1224, 2563, 749, 2787, 21, 536, 2171, 1779, 392, 1624, 1824, 45, 1676, 276, 3251, 2499, 330, 2474, 1113, 239, 1247, 1242, 2332, 1877, 2354, 2776, 1236, 3186, 1896, 2231, 1648, 397, 2655, 753, 1402, 3278, 1426, 2605, 426, 2943, 1831, 3009, 1896, 2127, 1823, 1368, 559, 1859, 84, 3240, 599, 882, 1729, 244, 2235, 317, 1229, 2630, 2312, 2969, 2388, 2336, 3299, 3151, 1772, 1745, 2530, 494, 2589, 3316, 2421, 1328, 309, 2978, 569, 470, 604, 1655, 2522, 2450, 2711, 2823]]] + +s: [[1, 3328, 3327, 1, 1, 1, 3328, 3328, 2, 3328, 0, 2, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 3, 3327, 3328, 3328, 3327, 3326, 0, 3327, 0, 1, 3328, 0, 0, 0, 2, 0, 0, 0, 0, 3, 1, 0, 1, 1, 3328, 1, 3327, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 3327, 3328, 0, 1, 1, 0, 1, 0, 0, 0, 3328, 1, 0, 3327, 2, 3327, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 1, 1, 3328, 2, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 3328, 1, 3327, 3327, 0, 3328, 3327, 1, 2, 0, 2, 3328, 3328, 0, 3328, 0, 1, 3328, 1, 2, 0, 3328, 0, 3328, 3, 2, 2, 1, 0, 0, 1, 3328, 0, 3328, 3328, 1, 3327, 1, 0, 2, 3327, 2, 0, 0, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 2, 3328, 0, 0, 3328, 1, 3328, 0, 0, 3326, 3328, 1, 1, 1, 3328, 3328, 3328, 1, 2, 3327, 0, 3328, 3327, 3328, 1, 1, 0, 3327, 3328, 2, 0, 0, 3328, 0, 3, 0, 3327, 0, 1, 0, 1, 0, 3326, 0, 1, 0, 3328, 0, 3328, 3328, 1, 0, 3328, 3326, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 3327, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 0, 2, 1, 2, 2, 3326], +[2, 0, 3327, 2, 2, 0, 0, 1, 3328, 2, 3327, 3328, 3328, 1, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 3327, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 3328, 0, 2, 3326, 0, 1, 2, 3328, 3327, 0, 3328, 0, 0, 3328, 3327, 1, 3328, 2, 0, 0, 3328, 3328, 1, 2, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 3327, 3328, 1, 3328, 3328, 3327, 3327, 1, 2, 0, 3328, 3328, 1, 0, 1, 3328, 3327, 0, 0, 0, 0, 2, 1, 0, 0, 3328, 0, 1, 3327, 0, 0, 0, 0, 1, 3328, 1, 3328, 3328, 3328, 0, 2, 3327, 1, 3328, 0, 0, 3327, 0, 1, 1, 0, 3327, 0, 2, 1, 3328, 1, 3328, 0, 1, 3328, 1, 3328, 0, 0, 3328, 1, 1, 3328, 3328, 0, 2, 3328, 1, 0, 3328, 3328, 0, 0, 3, 3, 1, 3328, 3328, 1, 0, 3327, 0, 0, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 0, 3328, 3328, 1, 3328, 1, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 0, 3327, 1, 3328, 3328, 3327, 3327, 0, 3326, 0, 3327, 0, 3328, 0, 3328, 0, 1, 3327, 3328, 1, 0, 3328, 3328, 0, 3326, 3327, 0, 0, 1, 1, 0, 1, 3328, 0, 1, 3327, 1, 3327, 3328, 0, 3, 2, 3328, 0, 0, 0, 2, 3328, 1, 1, 0, 1, 3328, 0, 2, 0, 0, 0, 1, 0, 0, 3327, 2, 1, 0, 3328, 0, 2, 3328, 0, 2, 0]] + +e: [[1, 0, 1, 0, 3328, 1, 1, 0, 1, 3327, 3328, 2, 0, 3326, 1, 1, 3328, 0, 1, 2, 1, 3328, 3328, 3327, 3326, 3327, 3328, 2, 3328, 0, 1, 2, 3326, 2, 3326, 2, 3327, 3327, 1, 2, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 0, 1, 1, 3328, 3328, 0, 3328, 0, 1, 3328, 3328, 3327, 1, 0, 0, 1, 1, 0, 3328, 2, 3, 2, 3328, 1, 3327, 3328, 2, 0, 1, 3326, 3328, 3328, 1, 1, 3326, 3328, 1, 1, 0, 0, 3, 1, 0, 3328, 3, 3328, 3, 3328, 3328, 3328, 1, 3327, 3327, 0, 1, 3328, 1, 3327, 1, 3328, 0, 0, 1, 3328, 0, 3327, 3327, 3327, 3328, 1, 3326, 1, 1, 0, 0, 0, 2, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 3327, 0, 0, 3328, 1, 0, 3327, 2, 3328, 3326, 0, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 2, 3328, 2, 3328, 3328, 2, 3328, 1, 1, 0, 2, 2, 3328, 1, 0, 2, 0, 0, 0, 2, 3328, 3327, 2, 3328, 3328, 0, 2, 0, 3328, 3328, 3327, 0, 1, 0, 3327, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 1, 0, 0, 1, 3328, 0, 3327, 0, 1, 0, 0, 1, 3328, 2, 1, 1, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3327, 0, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 2, 3328, 3, 1, 3327, 3327], +[0, 1, 3328, 1, 3327, 3, 0, 1, 0, 2, 0, 3327, 1, 3328, 1, 0, 1, 3327, 2, 0, 0, 0, 0, 0, 1, 1, 3328, 1, 2, 1, 2, 3328, 0, 0, 0, 1, 1, 2, 3328, 0, 3327, 1, 3328, 3, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 2, 0, 3328, 1, 2, 0, 0, 3328, 1, 1, 3328, 1, 0, 1, 1, 1, 0, 0, 0, 3327, 0, 3328, 3327, 0, 0, 3328, 3327, 0, 3328, 1, 0, 0, 1, 0, 0, 3328, 3327, 0, 0, 3328, 1, 0, 1, 1, 3327, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 3327, 1, 3327, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 1, 1, 0, 1, 3327, 0, 3328, 0, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3327, 1, 3328, 2, 0, 2, 3328, 2, 0, 0, 3327, 2, 1, 1, 3328, 1, 3327, 2, 3328, 0, 3327, 3328, 3327, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 3327, 3328, 0, 1, 3327, 1, 3328, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 2, 1, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 1, 3328, 0, 1, 0, 0, 3328, 3328, 3327, 0, 0, 0, 0, 3328, 0, 0, 3, 0, 0, 3327, 0, 3328, 2, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 3328, 3328, 1, 1, 0, 2, 0, 3326, 0, 0, 3327, 0, 1, 1, 0, 2, 1, 3327, 3328, 3328]] + +sHat: [[3127, 1150, 382, 1970, 251, 900, 1356, 232, 337, 2108, 2161, 3029, 956, 2610, 536, 3011, 2341, 444, 305, 1090, 1098, 1341, 823, 2979, 2047, 3232, 2945, 1607, 2738, 1068, 2713, 618, 3141, 2980, 1531, 2915, 427, 398, 1116, 1995, 1612, 429, 1017, 2104, 452, 1208, 2848, 2170, 3156, 1311, 847, 114, 1089, 3121, 2277, 266, 932, 2949, 2645, 2042, 19, 3185, 2891, 16, 2789, 2858, 488, 1847, 3215, 634, 1926, 2572, 2909, 950, 50, 1290, 3024, 559, 1593, 3221, 92, 3114, 1473, 1053, 1876, 1978, 2003, 883, 2724, 9, 357, 1069, 2634, 2978, 765, 2725, 3219, 2436, 772, 2345, 8, 1487, 3023, 2232, 1664, 792, 2414, 1072, 1952, 264, 3152, 2320, 2954, 530, 1933, 2947, 602, 2062, 2850, 28, 2868, 1183, 1269, 1500, 920, 3085, 1355, 1447, 2144, 72, 1570, 2278, 43, 435, 1304, 413, 2381, 2334, 1458, 3062, 2452, 2022, 2922, 2068, 2128, 2956, 850, 912, 789, 1510, 1584, 1462, 474, 2322, 1498, 90, 980, 1091, 2557, 3218, 508, 3164, 2311, 470, 2887, 1557, 1148, 2297, 1228, 2840, 2736, 456, 3171, 1000, 2067, 197, 2531, 1925, 2202, 1545, 1765, 2500, 1223, 2821, 910, 1022, 265, 3026, 1519, 2705, 1542, 2553, 1325, 1964, 2085, 206, 1252, 1532, 17, 1198, 2641, 2825, 2955, 2345, 2684, 307, 416, 3320, 506, 241, 3244, 1516, 653, 2380, 1941, 2233, 853, 261, 1869, 932, 2327, 389, 2989, 1349, 2951, 2667, 663, 2785, 1683, 351, 2758, 2256, 2872, 3303, 1343, 486, 2134, 168, 2898, 722, 952, 1302, 1738, 1499, 1043, 1691, 61, 2859, 2504, 864, 506, 3309, 615, 1513, 1899, 3099], +[1040, 1004, 1155, 2002, 34, 2262, 140, 561, 3139, 2913, 146, 2633, 2552, 1434, 315, 591, 797, 1991, 268, 1757, 2933, 1294, 1222, 712, 736, 474, 2510, 1028, 566, 1224, 742, 1315, 745, 1523, 1797, 843, 2885, 290, 657, 2835, 2198, 1184, 2103, 3000, 689, 175, 567, 3117, 2483, 239, 1805, 2605, 2420, 2844, 169, 751, 1991, 542, 1268, 986, 2624, 601, 2555, 2476, 1092, 1901, 1841, 3184, 647, 150, 1601, 487, 3284, 2360, 1065, 2978, 2402, 2144, 1999, 1954, 1827, 452, 891, 817, 829, 1737, 1037, 2541, 783, 1231, 2979, 2090, 1076, 684, 1259, 1438, 710, 81, 1835, 361, 3049, 518, 1982, 396, 18, 1030, 2473, 496, 2411, 1098, 1375, 2052, 2922, 1774, 1592, 1809, 3087, 3063, 493, 17, 582, 2113, 1757, 697, 635, 65, 2684, 160, 2704, 86, 1161, 2715, 1700, 1122, 2715, 925, 2374, 416, 2871, 405, 2386, 458, 3107, 241, 1510, 2043, 2428, 2028, 254, 3021, 272, 864, 888, 3042, 1560, 776, 2699, 531, 2885, 2018, 69, 1637, 3185, 3273, 1770, 2687, 3110, 559, 956, 2456, 3061, 3060, 1994, 3247, 2659, 1851, 3095, 1955, 424, 2470, 2111, 1476, 830, 67, 33, 1648, 1126, 1783, 1614, 1631, 1086, 228, 3164, 1437, 83, 388, 707, 3077, 2083, 1221, 1979, 1251, 2487, 2938, 2179, 806, 958, 2805, 2599, 98, 1431, 3301, 559, 2511, 984, 2379, 1221, 546, 1971, 228, 295, 1524, 833, 2427, 2387, 1429, 241, 6, 1339, 708, 1780, 2425, 1463, 874, 1417, 696, 3262, 3318, 1247, 187, 2376, 814, 397, 350, 34, 2637, 305, 347, 165, 3116, 244, 2003, 664, 3078, 3037, 1025]] +eHat: [[522, 1963, 2339, 1049, 383, 728, 639, 1380, 2621, 1800, 108, 2626, 634, 1542, 1849, 2631, 2057, 2926, 497, 1024, 565, 1356, 2933, 794, 318, 3186, 2569, 993, 2342, 739, 2976, 3282, 3032, 614, 16, 1012, 786, 1595, 196, 15, 2915, 1049, 2749, 1800, 1800, 2324, 3241, 3304, 1155, 2244, 1769, 2734, 3169, 3178, 601, 2361, 555, 2812, 2264, 759, 875, 542, 2092, 2831, 215, 413, 1225, 1877, 1896, 2264, 2780, 634, 1826, 2287, 1868, 1290, 234, 710, 2712, 2357, 1067, 1119, 1206, 2304, 183, 1410, 1768, 746, 65, 440, 1037, 2510, 3325, 1563, 1922, 2168, 1858, 1235, 196, 1795, 1950, 1141, 886, 2853, 3304, 2031, 1706, 2689, 3312, 2787, 3313, 1111, 3282, 205, 1245, 2005, 2284, 1949, 3225, 677, 314, 3257, 1812, 3316, 2891, 2844, 319, 1207, 826, 1901, 2413, 1690, 3215, 1750, 173, 1810, 1593, 1712, 1216, 2008, 3036, 404, 2263, 1792, 1185, 3043, 2914, 833, 1165, 717, 1122, 1198, 1764, 2877, 2924, 815, 548, 2566, 1423, 2030, 535, 913, 1190, 589, 3046, 1151, 445, 2512, 2388, 3097, 1571, 1220, 1915, 3117, 114, 3107, 64, 174, 1921, 908, 275, 1711, 2969, 1215, 2424, 1707, 3059, 2024, 2928, 3214, 1456, 243, 2870, 1789, 1505, 2588, 2603, 2617, 3309, 2012, 156, 2381, 2128, 3147, 2309, 871, 2153, 3153, 3160, 749, 807, 1840, 984, 876, 245, 94, 1118, 1698, 1691, 1317, 213, 59, 1997, 2128, 2415, 2561, 1121, 2771, 2243, 1712, 129, 2363, 2232, 79, 1043, 1351, 733, 1938, 39, 2265, 2798, 1649, 2423, 2892, 1116, 2102, 2354, 1351, 1280, 1952, 519, 1486, 3181, 1942, 2437, 875], +[1744, 65, 540, 293, 2235, 2869, 395, 195, 83, 89, 2366, 631, 50, 426, 3199, 1907, 538, 644, 488, 2131, 464, 1969, 2439, 3121, 2213, 3302, 828, 1346, 2442, 2660, 596, 2958, 1917, 1177, 1398, 421, 3194, 1342, 1305, 2364, 1478, 2589, 1094, 555, 1316, 2753, 887, 3000, 1232, 1322, 627, 303, 421, 2032, 1001, 1328, 2856, 834, 2074, 1789, 1275, 2949, 2616, 722, 2763, 581, 74, 1768, 1669, 498, 1515, 533, 117, 358, 2153, 2987, 1524, 443, 225, 1568, 2600, 1429, 274, 2060, 1899, 1735, 1973, 1804, 2735, 419, 3305, 535, 767, 128, 239, 2055, 3257, 901, 3260, 1816, 853, 2397, 2657, 1576, 3207, 406, 1248, 1743, 816, 1842, 2258, 760, 332, 680, 1648, 1286, 1550, 1901, 476, 1134, 1500, 496, 742, 2744, 527, 1463, 2268, 614, 1007, 941, 756, 749, 2518, 1085, 683, 3020, 1473, 3147, 1002, 2834, 3030, 1384, 1012, 1311, 2789, 2302, 1744, 719, 2852, 955, 2699, 442, 494, 2390, 658, 411, 971, 1910, 1739, 539, 243, 3213, 2858, 117, 1723, 84, 1883, 591, 2856, 1185, 2782, 2394, 625, 428, 487, 1156, 2619, 2041, 1354, 1233, 30, 148, 2611, 2197, 88, 439, 3262, 3215, 1344, 1842, 477, 1536, 945, 1503, 506, 2115, 1709, 3191, 3133, 1956, 1262, 1948, 2944, 1456, 1393, 2697, 1491, 667, 1941, 3058, 1087, 2870, 51, 141, 232, 1503, 1838, 1816, 2519, 2632, 1939, 1552, 2752, 1677, 1687, 2481, 1299, 1732, 3052, 1015, 1926, 479, 1969, 1999, 2080, 1209, 96, 2246, 2278, 2613, 1020, 132, 1465, 554, 2822, 927, 1808, 3031, 2614, 1438, 1706, 2851, 2059, 2839, 3035, 178]] +aHat * sHat: [[2236, 1835, 2939, 1371, 1272, 1590, 3036, 1269, 1935, 2891, 2736, 1191, 216, 1652, 2371, 1488, 1078, 2642, 1383, 1041, 1821, 1305, 1849, 1617, 2823, 1356, 1705, 755, 2604, 3276, 2410, 885, 1240, 1294, 21, 2125, 219, 2965, 2586, 1441, 757, 67, 2602, 1456, 3200, 1758, 3160, 554, 2631, 122, 1890, 1023, 2127, 401, 2976, 2809, 2812, 57, 1107, 2957, 572, 2991, 2988, 2437, 395, 2789, 2787, 1876, 2347, 784, 1089, 2771, 1954, 2641, 1217, 1977, 2545, 1754, 2470, 2333, 2561, 298, 522, 2279, 2470, 1989, 968, 133, 1437, 1708, 541, 102, 1442, 865, 2093, 956, 2512, 1529, 2398, 33, 2105, 202, 3142, 1329, 784, 923, 2311, 1887, 1572, 20, 1896, 17, 3106, 2078, 38, 1442, 1436, 1289, 1057, 1955, 2156, 1106, 655, 2442, 3002, 2780, 1527, 2916, 942, 2749, 1738, 290, 356, 1707, 386, 1991, 401, 1976, 4, 700, 47, 938, 560, 1188, 2488, 1098, 2910, 1770, 2848, 2593, 1639, 428, 1450, 750, 198, 2429, 3097, 2723, 2308, 1711, 837, 2159, 571, 1008, 954, 1630, 40, 2356, 3114, 2460, 337, 3255, 2645, 2259, 3160, 2451, 737, 3064, 2691, 208, 3291, 2419, 1248, 2310, 1513, 2529, 2600, 2361, 784, 896, 1096, 2818, 2344, 110, 1017, 2229, 2976, 781, 1038, 810, 2107, 2993, 1626, 1658, 621, 440, 542, 2610, 1864, 983, 2161, 1348, 1396, 2070, 3183, 308, 108, 1823, 2562, 197, 3150, 2203, 1502, 2056, 1548, 573, 3149, 2150, 348, 1995, 2509, 917, 829, 2990, 553, 872, 808, 2746, 1555, 1683, 3233, 2977, 1850, 1150, 2236, 1398, 1250, 1504, 2779, 2428, 2290, 2917, 1427, 2774, 3148, 2335], +[950, 2207, 1036, 133, 1127, 2447, 1077, 1553, 1105, 569, 455, 3174, 2827, 2598, 3075, 376, 712, 1987, 1108, 996, 3137, 415, 654, 3311, 2716, 2015, 1015, 2178, 1021, 2949, 886, 2653, 446, 3090, 2231, 1884, 3277, 2452, 2530, 1734, 2139, 403, 2149, 2281, 3264, 1318, 2177, 949, 1632, 223, 2271, 2804, 1395, 792, 1430, 920, 1214, 1828, 3249, 490, 165, 461, 1614, 1199, 2820, 2421, 53, 756, 3213, 3272, 897, 1248, 1054, 319, 2353, 2486, 2139, 3089, 1775, 1819, 3252, 773, 1295, 1693, 1565, 2981, 1181, 9, 1530, 945, 1110, 2800, 376, 759, 3034, 1214, 1480, 2371, 1873, 188, 1809, 2025, 1049, 936, 1222, 663, 1559, 2550, 936, 703, 1649, 2190, 2523, 809, 234, 1920, 2228, 1850, 2514, 3178, 2858, 2579, 1183, 946, 3055, 1544, 2189, 1699, 2470, 767, 39, 2474, 724, 1940, 3145, 1656, 1917, 228, 2495, 2283, 2495, 694, 2070, 1558, 1423, 1659, 117, 3135, 68, 440, 1982, 2221, 632, 2692, 880, 1790, 1908, 2845, 286, 613, 2970, 2236, 1632, 1752, 798, 2478, 3328, 406, 2479, 3318, 806, 237, 764, 952, 1252, 1063, 3184, 1230, 244, 395, 790, 1245, 1338, 77, 2527, 3219, 270, 3051, 1143, 1924, 1340, 1498, 2695, 1643, 1753, 2645, 2269, 540, 3080, 862, 1227, 1039, 3048, 2828, 2128, 3029, 2038, 301, 598, 2237, 1984, 907, 1250, 1782, 3258, 1780, 83, 1501, 3230, 1822, 2864, 287, 429, 1933, 2961, 2723, 2622, 593, 1609, 2960, 1128, 2273, 1107, 1224, 2149, 1020, 2871, 501, 2071, 2120, 1248, 2583, 726, 849, 1988, 3134, 267, 1953, 19, 126, 1247, 624, 362, 2547, 376, 2142]] +tHat = aHat * sHat + eHat: [[2758, 469, 1949, 2420, 1655, 2318, 346, 2649, 1227, 1362, 2844, 488, 850, 3194, 891, 790, 3135, 2239, 1880, 2065, 2386, 2661, 1453, 2411, 3141, 1213, 945, 1748, 1617, 686, 2057, 838, 943, 1908, 37, 3137, 1005, 1231, 2782, 1456, 343, 1116, 2022, 3256, 1671, 753, 3072, 529, 457, 2366, 330, 428, 1967, 250, 248, 1841, 38, 2869, 42, 387, 1447, 204, 1751, 1939, 610, 3202, 683, 424, 914, 3048, 540, 76, 451, 1599, 3085, 3267, 2779, 2464, 1853, 1361, 299, 1417, 1728, 1254, 2653, 70, 2736, 879, 1502, 2148, 1578, 2612, 1438, 2428, 686, 3124, 1041, 2764, 2594, 1828, 726, 1343, 699, 853, 759, 2954, 688, 1247, 1555, 2807, 1880, 1128, 3059, 2283, 1283, 118, 391, 3238, 953, 2632, 2470, 1034, 2467, 2429, 2564, 2295, 1846, 794, 1768, 1321, 822, 1980, 242, 128, 559, 472, 1994, 359, 1220, 2708, 3083, 1342, 2823, 2980, 344, 812, 2495, 2603, 684, 3310, 2761, 1626, 3214, 298, 3122, 3244, 316, 1960, 402, 412, 1372, 3072, 1761, 1597, 671, 2781, 485, 1539, 2173, 2228, 1908, 1146, 1231, 2047, 3274, 2229, 801, 3238, 1283, 1116, 237, 801, 888, 196, 608, 907, 2330, 1056, 383, 781, 2552, 3061, 1885, 1899, 2522, 1488, 2250, 69, 1018, 2822, 2263, 2045, 425, 1476, 2930, 1311, 2695, 2434, 1695, 1732, 2968, 3188, 2380, 2946, 99, 402, 1226, 192, 924, 1514, 34, 2262, 170, 855, 634, 3134, 941, 1592, 2591, 378, 2638, 3280, 3061, 3069, 1596, 2223, 1541, 1355, 1594, 619, 2702, 1297, 944, 713, 23, 171, 275, 2855, 730, 1051, 2809, 1074, 1279, 1387, 2256, 3210], +[2694, 2272, 1576, 426, 33, 1987, 1472, 1748, 1188, 658, 2821, 476, 2877, 3024, 2945, 2283, 1250, 2631, 1596, 3127, 272, 2384, 3093, 3103, 1600, 1988, 1843, 195, 134, 2280, 1482, 2282, 2363, 938, 300, 2305, 3142, 465, 506, 769, 288, 2992, 3243, 2836, 1251, 742, 3064, 620, 2864, 1545, 2898, 3107, 1816, 2824, 2431, 2248, 741, 2662, 1994, 2279, 1440, 81, 901, 1921, 2254, 3002, 127, 2524, 1553, 441, 2412, 1781, 1171, 677, 1177, 2144, 334, 203, 2000, 58, 2523, 2202, 1569, 424, 135, 1387, 3154, 1813, 936, 1364, 1086, 6, 1143, 887, 3273, 3269, 1408, 3272, 1804, 2004, 2662, 1093, 377, 2512, 1100, 1069, 2807, 964, 1752, 2545, 578, 2950, 2855, 1489, 1882, 3206, 449, 422, 2990, 983, 1029, 3075, 1925, 361, 253, 3007, 1128, 2313, 148, 1708, 795, 3223, 3242, 3025, 499, 1347, 61, 46, 168, 1788, 2196, 2078, 3082, 2869, 883, 632, 1861, 525, 2920, 1395, 1352, 2663, 1126, 1753, 1538, 2201, 2879, 1426, 2025, 1152, 3213, 2120, 1161, 1869, 2521, 2562, 1882, 997, 2006, 1174, 259, 2631, 1389, 1380, 1739, 2219, 2474, 3271, 1598, 1628, 820, 1393, 620, 2274, 2615, 329, 203, 2937, 2487, 437, 1817, 3034, 311, 3146, 2259, 1431, 649, 402, 2884, 2818, 2489, 2987, 2663, 955, 192, 2397, 200, 968, 2539, 1966, 3071, 448, 1301, 1923, 161, 3283, 1921, 3317, 2420, 1125, 1474, 1839, 3181, 281, 1319, 1875, 592, 2325, 1332, 646, 3054, 2752, 3076, 3223, 900, 2229, 2967, 2747, 1020, 1404, 2268, 2715, 2191, 1403, 1481, 732, 2075, 1655, 2633, 1564, 2953, 146, 2421, 2057, 82, 2320]] + +ek: C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 +dk: 37EC477E217BFB40384C850E51C1837158BDBC23A31832BC25C91B3121444AD4533733BAFF07CA817B64B2CA4299AA26454CBAFB35B6ABE1185CB47C4CD61AF98383C4814B20AB8754FC514F23074114C3E5A810A453B855AA7F1310C74B0B01E5AAB2E871738FAC2786C7A05D6B3B32A050D0FB223956C95CA0C2C1D54154A77BD33737A49A0065D1424A2ABAFD52AA934C9804939208F05CCF8B8B8086316E0943A08710500C918A2B218D37B85AE28022CB0134FB49F5C45D98D3C04B755A60880422668E2B301B18D5194DE991B265BF94697E6A4B8150C8B852033915635E30665BDA2191DAA505D43344FD29C9FCC1C507691D475B617C948FCC84B1B08A1C638C3E13580CE359789A9860E5469CC754B08EE33F0921BDEF15A906969F2DC57A25E80CE4C45F11E04A519AB08B9B927C3A13A081CFFA110FACCC5E8DC29495978B5553104D473A175918AD5B5487BBA69712AE93F615C60A8D387BCE3F651E56880A522B2DB86351CAB65D13B4693DB0B2C80936FAD1CE67925E6BB7C110C43E83247D22608D8C1023431CB69290A4F8A9593BF1241D737C0CD16D75EB50C6842CE0A21DCE494036824CE63252E9325F05B734452B129132B196084A3788BBB1F20A37D2C2B3F90E0DD7A274C9B1A9F02EC7E721F4A43D409A25FBC99A44D4763107C787620941761ED48C932924BA620986CF277A23471C7B13333D936C0DD49E0FF34CA3AB8234C42AEBE459C612052B9716E96B20BEC718126040A9091F6BA9445F45806AEB6E3816710F7CBFED1101461284DD962B7B12047C0A0A906A0589B4A9A426469BDA3946091A375B1952A91C231C0FE6B57F7CC97EFED0BC1001367823BE1886308B3A21452B7E455066719CCCEAF6A726FC22BC8399F54BBFCAF7CA63BA73173C7AA8619A3F485C3E330421006766746F4EF6653E440E5CDC59534018C352C023584CBB374EB7A9B7836832BE53AF272A069755CE2FF29CD8B394C52422B3470E27415F41B397535959F160003B452CF49697B7A53689852BBE6CCFDFB40B48E9328DE11522D0A431B115A5C0C2F4307D9862C0DD1B40C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636C0ECC8DDAE8B594A14037868BEC0B22300DEFDFAA1D973AC5CEC84AE4386B8FBCD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt new file mode 100644 index 000000000..79626920f --- /dev/null +++ b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt @@ -0,0 +1,40 @@ +Key Generation -- ML-KEM-768 +z: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC +d: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC + +rho: 7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD +sigma: E71CB52F313F38B4CF0ADD7270390FB1ADE0AEE2D1EF704562409F6F9F825F2F + +aHat: [[[503, 2488, 1249, 1628, 3202, 1319, 414, 1890, 2741, 1035, 2249, 881, 402, 455, 2452, 1726, 610, 1860, 2796, 2467, 1906, 1982, 2045, 298, 1925, 2123, 1925, 1486, 1733, 1907, 1152, 2585, 1259, 1341, 2565, 1580, 1308, 2806, 1535, 780, 1417, 9, 831, 377, 2838, 1062, 2037, 111, 1148, 396, 1151, 1545, 1380, 1520, 912, 3104, 3245, 515, 2156, 2341, 613, 42, 1262, 2597, 1121, 2364, 897, 2206, 3019, 2194, 628, 890, 1345, 2183, 0, 1138, 1315, 2939, 356, 482, 1065, 514, 1033, 2523, 1791, 2845, 436, 3038, 643, 813, 2979, 1867, 3056, 2369, 1542, 2820, 344, 232, 3302, 1791, 2607, 3293, 2915, 774, 3072, 1977, 3295, 950, 2318, 1807, 111, 3001, 307, 2725, 1142, 361, 1118, 1309, 2969, 528, 2827, 1406, 2579, 1436, 2059, 438, 1942, 823, 704, 3234, 2247, 1902, 2097, 2143, 1700, 414, 2370, 1503, 1930, 2643, 1340, 2640, 842, 617, 2757, 410, 2400, 2905, 2636, 1854, 598, 1598, 3256, 2780, 2094, 215, 1285, 368, 364, 2328, 2187, 229, 1425, 1028, 1304, 17, 1313, 613, 29, 2378, 2316, 515, 890, 2648, 568, 763, 566, 1078, 315, 2898, 13, 925, 1052, 3132, 3276, 2750, 145, 1410, 1541, 1684, 2488, 3249, 1427, 3197, 3175, 1711, 1076, 2583, 1127, 1319, 629, 3238, 1244, 1272, 1548, 2882, 818, 2576, 1325, 1555, 3210, 1553, 2269, 681, 1180, 2870, 72, 1058, 1018, 1243, 1907, 3263, 2172, 2016, 1962, 191, 1585, 1174, 1300, 1399, 867, 342, 2750, 2353, 1341, 1064, 1004, 680, 1720, 792, 166, 943, 3243, 1543, 2988, 2333, 2223, 2080, 2610, 2275, 57, 1481, 1374, 1436, 1895, 1779], +[170, 3122, 168, 852, 273, 11, 87, 3134, 1240, 623, 349, 894, 2031, 2474, 2364, 2688, 791, 1502, 3253, 3225, 1850, 75, 661, 37, 2792, 1555, 2110, 2365, 711, 916, 967, 2584, 1940, 1388, 2500, 1102, 2625, 3112, 2519, 2890, 1729, 2487, 432, 1730, 2935, 1104, 2177, 369, 2456, 1882, 1416, 713, 494, 2002, 530, 223, 1129, 271, 789, 3011, 2723, 2920, 1672, 3062, 1211, 844, 922, 317, 2353, 1828, 245, 2530, 2496, 2560, 3015, 1780, 795, 443, 2755, 2605, 1379, 405, 2053, 1079, 1548, 2758, 1472, 858, 2939, 1358, 2786, 1832, 1107, 1205, 2992, 2699, 313, 91, 617, 3040, 2353, 2693, 1646, 1818, 3079, 2548, 1590, 1806, 1074, 2930, 3288, 3204, 2051, 2131, 2763, 2782, 2248, 1621, 2857, 2887, 514, 2412, 114, 202, 487, 17, 1475, 600, 826, 105, 679, 721, 2067, 324, 556, 671, 386, 1627, 1094, 778, 2684, 3285, 2071, 2071, 2938, 608, 3276, 739, 1303, 1530, 2443, 2880, 3177, 1933, 2643, 2657, 800, 753, 1540, 1306, 1628, 1057, 3306, 2064, 299, 366, 1699, 1352, 226, 1254, 682, 1525, 2404, 112, 55, 568, 610, 1097, 2022, 1897, 733, 1611, 2291, 957, 1701, 1240, 388, 2126, 634, 1782, 2581, 2346, 784, 1618, 1516, 667, 2958, 839, 2691, 684, 331, 1725, 594, 252, 2425, 2261, 2981, 1930, 2399, 948, 2755, 2735, 1881, 1280, 1740, 863, 1849, 882, 2766, 279, 2854, 694, 892, 1802, 445, 198, 2152, 2448, 2609, 2649, 3208, 333, 3207, 1460, 69, 2927, 3308, 235, 2466, 3030, 180, 218, 1033, 492, 2020, 1757, 2780, 653, 1137, 1437, 195, 660, 2614, 1499, 2041, 806], +[1374, 59, 66, 1050, 2591, 2316, 593, 2806, 162, 2198, 3073, 2638, 145, 1038, 1027, 2730, 736, 1123, 204, 2989, 974, 2145, 1750, 784, 417, 583, 1694, 1072, 736, 1124, 1603, 3279, 1478, 1043, 2154, 1322, 2709, 2841, 2283, 1171, 601, 988, 735, 2892, 2516, 1596, 575, 3267, 484, 2051, 618, 1776, 744, 2682, 2762, 2886, 1855, 573, 458, 1921, 746, 2738, 1954, 1501, 1494, 27, 2999, 1362, 1430, 1903, 1829, 2282, 1920, 1572, 1717, 706, 2400, 684, 1193, 3192, 1902, 2209, 2493, 2289, 380, 220, 2308, 1791, 2876, 1727, 2071, 1681, 1453, 666, 1431, 215, 2436, 3158, 400, 616, 1759, 646, 2966, 1337, 295, 1106, 141, 1981, 134, 2597, 1052, 2939, 1763, 2219, 1771, 2965, 756, 2143, 2055, 479, 314, 2364, 2507, 401, 672, 383, 1532, 1356, 2485, 1911, 747, 506, 2203, 1040, 1363, 3318, 1533, 1154, 2224, 876, 2211, 1896, 3153, 2607, 463, 2613, 1208, 2891, 759, 511, 2951, 1867, 2710, 1808, 1384, 1090, 1916, 196, 2471, 2310, 1781, 380, 79, 2937, 1650, 387, 1971, 2708, 359, 2622, 1884, 1559, 2280, 2928, 1588, 2198, 591, 3313, 3167, 342, 94, 304, 2877, 1272, 3121, 1303, 2367, 381, 1221, 1727, 136, 543, 170, 1495, 1140, 8, 2629, 1281, 2408, 389, 1418, 2520, 2085, 2977, 2133, 2043, 1705, 585, 2964, 2524, 301, 463, 1253, 1685, 1342, 2489, 2230, 2392, 993, 1870, 2287, 3285, 3152, 2416, 2121, 1802, 672, 2850, 2884, 1130, 363, 1192, 1470, 1163, 2282, 806, 2472, 2719, 3122, 2266, 1165, 1482, 2823, 957, 2694, 1350, 3299, 2023, 1730, 573, 1409, 1205, 1427, 1099, 2442, 2460]], +[[2477, 657, 1008, 914, 2644, 3115, 1701, 124, 1237, 2897, 2444, 2579, 1646, 1288, 1786, 1949, 3202, 767, 1479, 2484, 2355, 3029, 3175, 621, 2647, 1535, 2320, 2744, 1065, 1369, 649, 266, 1964, 52, 1017, 1651, 2300, 385, 3154, 2545, 2585, 2808, 2427, 1894, 1101, 2881, 2864, 2131, 1168, 210, 191, 663, 2270, 2921, 2626, 155, 3305, 1858, 236, 3250, 1448, 874, 509, 1827, 66, 727, 2581, 1007, 108, 796, 3099, 1302, 2163, 783, 1520, 2983, 2560, 3306, 1078, 1912, 2986, 1053, 2098, 1540, 2134, 3065, 2171, 612, 233, 2026, 2027, 683, 2595, 656, 2127, 842, 965, 2274, 1436, 1170, 996, 3176, 1757, 474, 1745, 2129, 200, 2537, 48, 2472, 2944, 1920, 1180, 2961, 665, 32, 1911, 2182, 205, 3010, 2598, 356, 2980, 1208, 3159, 947, 609, 2166, 1714, 2162, 696, 1457, 906, 896, 183, 434, 2534, 2493, 3019, 1019, 1691, 1910, 3071, 251, 974, 3132, 974, 906, 1754, 912, 1849, 345, 2120, 509, 366, 3174, 1248, 2425, 1866, 1913, 2382, 2335, 1353, 370, 998, 69, 1760, 316, 1007, 1425, 1337, 2521, 2915, 2570, 2043, 2808, 2911, 2687, 2946, 1640, 331, 3093, 2922, 3208, 333, 866, 1564, 962, 1768, 943, 3239, 883, 3075, 1084, 821, 444, 1020, 947, 1381, 249, 2621, 1579, 1604, 2626, 1923, 1772, 2675, 257, 520, 129, 1126, 2349, 2476, 1234, 2760, 873, 1105, 1285, 746, 3035, 430, 286, 1376, 2601, 505, 1415, 1643, 2312, 694, 1562, 3012, 2342, 2117, 2785, 1796, 1636, 1123, 2184, 1658, 2308, 850, 609, 534, 1294, 804, 27, 170, 3094, 2549, 1432, 2006, 2967, 731, 1757, 2042, 983], +[2415, 302, 2224, 160, 2409, 2914, 570, 216, 119, 562, 1106, 2122, 220, 66, 884, 2875, 602, 1463, 145, 974, 2728, 436, 1227, 1445, 1876, 102, 2273, 3068, 635, 3217, 2866, 2440, 2103, 1964, 1136, 1284, 1888, 3080, 2933, 1696, 1812, 3267, 2910, 400, 1673, 1177, 2239, 3092, 849, 2846, 2365, 1527, 1284, 1305, 434, 2138, 367, 761, 638, 472, 1132, 16, 3217, 52, 2708, 1545, 987, 3314, 642, 182, 2977, 300, 2319, 165, 2594, 835, 884, 564, 2909, 1570, 2651, 2401, 243, 638, 2602, 493, 233, 2260, 1668, 2980, 2889, 2405, 2627, 2662, 2891, 488, 730, 2451, 569, 3056, 1898, 1746, 1939, 2420, 1989, 2450, 2360, 646, 84, 2192, 1014, 3230, 2302, 1567, 173, 3172, 2516, 2120, 2135, 70, 1598, 1446, 1844, 867, 830, 203, 3315, 3107, 1804, 2836, 876, 2924, 1000, 1048, 483, 2937, 2600, 2906, 641, 1655, 1450, 1531, 1840, 2212, 2902, 2930, 181, 2936, 1776, 172, 282, 2041, 183, 363, 2135, 3171, 122, 1731, 1582, 2383, 2294, 2999, 3076, 1134, 2405, 1781, 120, 2644, 1080, 3150, 1842, 2826, 2373, 3089, 3278, 2364, 2102, 3037, 2028, 1219, 1376, 619, 2897, 3287, 2694, 1064, 2328, 1477, 115, 2585, 42, 1810, 689, 625, 2129, 1404, 1992, 2436, 520, 2555, 2787, 1155, 795, 323, 2595, 618, 2432, 530, 397, 2967, 1276, 2950, 3151, 989, 569, 1134, 2608, 2692, 1997, 1191, 1909, 2416, 2131, 2321, 2670, 1623, 186, 1381, 2268, 81, 2274, 1437, 2557, 36, 3076, 2556, 1562, 369, 1796, 2765, 3234, 3159, 2353, 140, 756, 335, 275, 1688, 3192, 3118, 753, 2313, 1668, 361, 1894, 1348], +[1387, 669, 2843, 320, 1888, 1947, 3000, 173, 3061, 2470, 336, 189, 2719, 810, 237, 1545, 1053, 3226, 725, 1754, 1844, 549, 3293, 2417, 196, 1852, 794, 235, 1922, 3, 262, 3259, 3281, 1843, 177, 3285, 1980, 2359, 1584, 2869, 2202, 404, 2439, 2874, 2901, 1309, 1118, 1333, 724, 217, 757, 2605, 474, 342, 2761, 818, 607, 2074, 1586, 183, 241, 1589, 1884, 1145, 1511, 2981, 332, 3187, 1481, 182, 2156, 2337, 2911, 1263, 3072, 2458, 3294, 685, 553, 2181, 1539, 644, 2851, 263, 1591, 2685, 1399, 1783, 2323, 1319, 2618, 871, 3251, 329, 755, 1819, 2855, 2252, 149, 1525, 1842, 3213, 815, 111, 1016, 2601, 881, 1191, 962, 193, 575, 727, 2807, 680, 2077, 2205, 1826, 1701, 2804, 1228, 2797, 70, 3035, 2617, 430, 1780, 1190, 851, 253, 648, 3004, 2685, 1855, 2552, 3096, 2489, 1887, 333, 823, 1169, 3255, 615, 1990, 66, 1233, 2168, 2752, 416, 1117, 2408, 2343, 1249, 2128, 3245, 2747, 1606, 472, 991, 875, 2280, 2077, 2662, 2250, 79, 1123, 1282, 3075, 3142, 1229, 226, 2220, 2257, 170, 1691, 561, 2270, 2436, 960, 487, 1867, 1704, 3197, 2302, 2704, 2518, 2088, 2070, 1051, 1795, 815, 529, 1592, 2160, 1655, 500, 3297, 1793, 440, 1509, 999, 439, 744, 1107, 15, 2895, 1108, 545, 2390, 1997, 1530, 831, 3269, 3107, 1694, 2830, 2221, 1473, 1294, 1671, 571, 3013, 2996, 3013, 1979, 1614, 1899, 2822, 2674, 2163, 498, 2424, 1081, 2045, 2502, 2358, 2013, 59, 597, 2476, 398, 447, 2889, 2891, 3114, 804, 1983, 1683, 2293, 2450, 2233, 1213, 1355, 410, 2145, 1639, 695]], +[[458, 3073, 1091, 2535, 1094, 1943, 1517, 612, 823, 2562, 961, 3148, 2102, 2898, 2302, 3274, 1990, 590, 2543, 2127, 269, 2158, 1898, 2142, 2617, 1806, 2830, 895, 3107, 2424, 3323, 654, 2317, 2595, 646, 831, 442, 839, 2546, 344, 1877, 1782, 206, 1611, 2549, 3152, 2200, 1022, 2247, 2769, 2133, 1318, 3202, 196, 2240, 2517, 509, 2046, 1217, 1162, 962, 673, 3260, 1960, 833, 2255, 2696, 2559, 2216, 1544, 672, 2335, 3137, 2870, 2134, 1478, 929, 3117, 71, 1323, 209, 885, 11, 297, 637, 918, 394, 692, 2146, 1054, 693, 1084, 2665, 397, 2290, 579, 867, 2556, 664, 1469, 2241, 1680, 279, 2432, 2276, 2922, 2817, 2906, 506, 2123, 2163, 637, 2221, 2176, 494, 583, 3173, 452, 2273, 1564, 2759, 2236, 2676, 1900, 2165, 1297, 3292, 1921, 2376, 102, 2910, 1360, 1376, 2755, 3006, 1346, 579, 301, 2897, 437, 3040, 532, 2756, 3124, 2622, 796, 2327, 2225, 2470, 1837, 21, 2810, 2394, 1202, 2418, 2068, 2669, 3009, 2605, 2708, 1689, 256, 981, 2372, 566, 121, 800, 2325, 3026, 144, 1717, 447, 3133, 482, 608, 918, 2362, 2249, 2477, 1043, 549, 2131, 1158, 2677, 1991, 2206, 91, 2383, 2315, 511, 2510, 2981, 2787, 398, 3256, 3039, 1253, 2682, 3229, 1645, 1894, 901, 200, 810, 2945, 2771, 2689, 2402, 872, 2320, 1910, 1908, 2454, 2747, 1986, 453, 1590, 361, 979, 3218, 2348, 1361, 855, 2976, 906, 2007, 2590, 2210, 2175, 1606, 1693, 987, 2643, 1760, 2347, 2341, 60, 273, 3296, 558, 1255, 1275, 1610, 2742, 660, 3157, 1586, 2457, 3022, 371, 470, 1863, 1148, 3266, 1523, 1905], +[56, 2761, 2607, 2958, 1428, 73, 3236, 2181, 3088, 1588, 736, 2868, 3172, 1142, 833, 171, 1755, 2209, 1592, 190, 876, 2625, 991, 163, 1899, 2251, 1345, 1914, 2530, 2024, 1833, 1094, 2406, 2561, 1984, 1014, 1067, 2406, 353, 1217, 3007, 2788, 2864, 2042, 2472, 1902, 3295, 2420, 1327, 102, 167, 3153, 1079, 461, 3226, 554, 2561, 188, 709, 237, 1747, 2327, 2596, 771, 914, 2942, 1811, 2030, 2001, 635, 516, 1786, 3255, 2861, 723, 2557, 2285, 1591, 1883, 844, 2426, 2113, 1573, 1796, 3160, 365, 1433, 1091, 1769, 937, 244, 650, 309, 3210, 1955, 1163, 2310, 2034, 685, 1462, 1903, 1057, 1277, 883, 2106, 2582, 2792, 2110, 1969, 226, 2577, 1601, 307, 1471, 638, 2438, 1996, 146, 2879, 2799, 599, 1011, 2148, 1353, 1223, 3059, 2710, 242, 861, 1193, 1790, 40, 125, 1656, 184, 954, 2453, 957, 558, 2368, 1358, 614, 2888, 1752, 584, 1878, 1297, 1236, 2505, 805, 354, 2350, 815, 242, 2373, 881, 3055, 2177, 160, 3120, 2451, 635, 1449, 520, 3320, 1111, 28, 483, 2198, 1300, 1556, 976, 1294, 340, 2108, 1986, 1188, 2567, 1361, 2318, 42, 988, 1513, 2456, 3299, 2559, 1750, 1951, 566, 2435, 2072, 725, 2578, 3145, 1094, 1679, 1289, 3260, 2411, 3263, 2764, 1863, 800, 163, 535, 1434, 1896, 628, 905, 638, 1994, 1886, 633, 2923, 1854, 973, 3226, 1, 2995, 2480, 487, 208, 2777, 2661, 1475, 765, 2268, 1747, 2877, 3143, 2719, 400, 2759, 1817, 2237, 2715, 2308, 2123, 1163, 3184, 2705, 66, 2859, 1543, 1730, 3231, 380, 1175, 157, 1174, 3321, 1291, 2646, 268, 1462, 1694], +[2401, 200, 2377, 1120, 1797, 2462, 975, 1295, 1107, 3103, 822, 2259, 478, 157, 2498, 315, 238, 373, 2218, 3326, 1328, 1479, 1224, 1117, 1824, 2327, 737, 2957, 3287, 3303, 2706, 2408, 1931, 2060, 892, 403, 1036, 3027, 2042, 570, 1233, 731, 215, 2635, 1250, 739, 1287, 109, 3125, 3246, 421, 2756, 602, 1482, 1006, 1111, 1227, 497, 1037, 1001, 3285, 3075, 1947, 1613, 882, 655, 407, 2465, 1546, 1641, 2880, 2275, 1751, 2763, 230, 1735, 1655, 1232, 207, 1521, 275, 2302, 2074, 1090, 1838, 1810, 2398, 2400, 3095, 1871, 3109, 3029, 2055, 2648, 3293, 1373, 2444, 1836, 1521, 2099, 1910, 3283, 1744, 1176, 1149, 2951, 2130, 164, 948, 2539, 2920, 2951, 1801, 84, 3229, 597, 3164, 645, 2370, 806, 2007, 2465, 2359, 2795, 2657, 573, 1119, 1978, 22, 2661, 609, 746, 1684, 2329, 1658, 2028, 132, 1510, 1913, 1867, 1774, 975, 1900, 2021, 529, 1164, 268, 1592, 57, 798, 1975, 2997, 590, 1263, 570, 1306, 552, 782, 472, 3105, 400, 580, 795, 335, 616, 1218, 1056, 2128, 885, 2161, 2594, 236, 640, 191, 3141, 215, 2020, 2870, 2042, 978, 2068, 2729, 219, 2219, 736, 2210, 222, 3225, 3071, 2663, 2110, 1827, 796, 3152, 1390, 1639, 1529, 508, 1639, 196, 3163, 599, 2540, 199, 2565, 192, 25, 614, 1343, 90, 1995, 2068, 328, 2499, 2315, 2751, 1063, 335, 1128, 1208, 1061, 2845, 272, 1685, 1659, 2745, 525, 1958, 3099, 311, 1197, 3002, 340, 3180, 2576, 2474, 622, 2704, 2922, 2248, 2015, 3049, 176, 2307, 122, 1379, 510, 149, 1777, 632, 2248, 2614, 2369, 3111, 1926, 2229]]] + +s: [[3328, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 1, 0, 0, 1, 0, 1, 3328, 3328, 0, 1, 3328, 1, 2, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 3328, 1, 0, 3328, 0, 1, 0, 0, 3328, 3327, 0, 1, 3328, 0, 0, 1, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 2, 3327, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 1, 0, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3327, 3328, 0, 2, 1, 2, 2, 1, 3328, 3327, 0, 0, 1, 1, 3328, 0, 0, 0, 3328, 2, 0, 1, 1, 0, 3328, 0, 3328, 0, 0, 3328, 2, 2, 3328, 2, 1, 0, 0, 3328, 0, 3328, 2, 1, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 0, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 1, 0, 2, 0, 3328, 3328, 0, 0, 3328, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 3328, 1, 3327, 0, 3328, 0, 0, 0, 1, 1, 3327, 0, 3327, 1, 0, 1, 2, 2, 3328, 1, 3328, 1, 0, 0, 3328, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 3328, 2, 3327, 3328], +[0, 3327, 2, 3327, 0, 3327, 0, 0, 0, 1, 0, 2, 2, 0, 3327, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 3328, 1, 1, 1, 1, 2, 3328, 3328, 3327, 1, 0, 1, 0, 1, 0, 0, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 2, 1, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 0, 1, 3328, 2, 3328, 2, 0, 2, 0, 3328, 1, 3327, 3327, 1, 3328, 3327, 1, 1, 2, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 3328, 3327, 3328, 3328, 0, 3328, 0, 1, 1, 1, 1, 0, 0, 0, 3327, 2, 3328, 0, 0, 3328, 0, 2, 1, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3327, 3328, 1, 3328, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 1, 1, 0, 1, 3328, 0, 2, 3328, 1, 1, 3328, 3327, 1, 2, 0, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 2, 3328, 1, 1, 1, 1, 0, 0, 3328, 1, 0, 0, 3328, 3327, 0, 0, 0, 3327, 1, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 3327, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 0, 3328, 0, 1, 3327, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 3328, 0, 3327, 1, 1, 3328, 0, 0, 2, 0, 0, 0], +[0, 1, 1, 0, 1, 0, 1, 2, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 1, 0, 0, 1, 3328, 2, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 3328, 0, 1, 0, 3328, 3328, 1, 1, 3327, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3327, 1, 3328, 0, 1, 1, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3328, 0, 1, 3327, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 3327, 1, 1, 3328, 0, 0, 3328, 0, 1, 3328, 1, 0, 2, 3328, 1, 1, 1, 1, 0, 3328, 3328, 3328, 2, 0, 0, 3327, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 3328, 3327, 0, 3328, 0, 1, 1, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 1, 3328, 3328, 3328, 0, 2, 0, 1, 0, 0, 1, 3328, 3328, 1, 3327, 0, 2, 3328, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 3328, 2, 3327, 3327, 0, 1, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 1, 3327, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 2, 3328, 1, 0, 3328, 3328, 1, 3328, 1, 1]] + +e: [[1, 3328, 0, 3327, 0, 0, 0, 3327, 1, 1, 3328, 1, 1, 0, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 0, 3328, 3327, 0, 2, 3328, 0, 2, 0, 0, 1, 0, 3328, 0, 0, 1, 1, 0, 3328, 3328, 2, 3328, 3328, 1, 0, 1, 1, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 1, 1, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3327, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 1, 1, 1, 3328, 0, 0, 0, 1, 3327, 0, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 2, 1, 1, 3327, 3328, 3328, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 2, 3327, 1, 0, 0, 0, 0, 0, 3328, 2, 0, 1, 1, 3328, 3328, 2, 0, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 2, 3328, 1, 1, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 2, 0, 1, 0, 3327, 3328, 0, 3327, 0, 0, 3327, 0, 3327, 1, 1, 1, 0, 3328, 3328, 3328, 1, 1, 0, 1, 2, 0, 3327, 0, 3328, 1, 1, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 2, 2, 0, 3328, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 0, 1, 1, 1, 2, 3327, 2, 0, 0, 0, 0, 0, 0, 1, 3328, 1, 0, 0, 1, 1, 3328, 1, 3328, 3327, 3328, 2, 1], +[1, 1, 3328, 1, 3328, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 3327, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 1, 3328, 0, 3327, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 0, 0, 2, 2, 1, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 2, 3327, 3328, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 0, 0, 3328, 3327, 0, 0, 0, 1, 2, 2, 1, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 1, 3327, 3328, 0, 1, 3328, 2, 1, 0, 3328, 2, 3328, 1, 3328, 3328, 1, 1, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 3327, 0, 3328, 1, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 0, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3328, 0, 1, 3328, 2, 0, 1, 1, 1, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 1, 3328, 3328, 2, 3327, 2, 2, 1, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 1, 1, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 3328, 1, 0, 0], +[3328, 1, 0, 3328, 0, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 3328, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 3327, 1, 2, 0, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 0, 0, 0, 0, 3328, 1, 0, 3328, 1, 3328, 3328, 0, 0, 1, 0, 1, 3328, 0, 3328, 0, 1, 0, 2, 0, 2, 2, 2, 1, 0, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 3327, 1, 3328, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 3327, 0, 2, 1, 0, 3327, 0, 3327, 3328, 0, 3327, 3328, 3328, 0, 0, 3328, 0, 1, 0, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 2, 0, 3328, 1, 0, 1, 0, 0, 3328, 3327, 3328, 3328, 1, 0, 0, 0, 0, 1, 2, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 0, 1, 1, 0, 1, 2, 0, 2, 3327, 3328, 3328, 1, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 2, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 3327, 3327, 0, 1, 2, 3328, 0, 0, 3327, 0, 3327, 1, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 3328, 0, 2, 0]] + +sHat: [[1817, 1197, 2005, 676, 2955, 2722, 1490, 1658, 2306, 2876, 437, 229, 755, 1161, 1624, 464, 2391, 223, 473, 2570, 3103, 766, 1367, 428, 2184, 88, 2868, 1553, 380, 1365, 2361, 1909, 848, 1480, 1854, 2573, 51, 923, 1239, 2322, 3123, 1490, 1780, 2490, 621, 1567, 1905, 1960, 1489, 174, 453, 0, 1982, 644, 1656, 2134, 2778, 1847, 1182, 1016, 1264, 1437, 1826, 653, 286, 210, 606, 2968, 1348, 758, 584, 3318, 2483, 45, 222, 2806, 464, 1610, 2887, 609, 2580, 468, 2170, 147, 869, 144, 345, 1889, 2606, 1947, 1122, 1308, 1309, 2576, 552, 1935, 2846, 988, 2847, 2837, 548, 884, 2657, 2977, 1209, 2450, 2591, 632, 562, 1806, 1330, 1939, 288, 2431, 2503, 726, 2400, 1098, 580, 599, 1164, 1403, 1985, 443, 2423, 1353, 873, 2719, 866, 2751, 2470, 2406, 3092, 3279, 1258, 487, 1569, 12, 1476, 1971, 3007, 1114, 1833, 3122, 468, 3060, 1934, 797, 1874, 1487, 1288, 1039, 1761, 2760, 970, 611, 756, 3202, 2123, 2265, 1655, 430, 2278, 1425, 1487, 1048, 760, 153, 2276, 777, 1344, 1564, 1142, 2053, 648, 2917, 2121, 2459, 2467, 2793, 2242, 3004, 1448, 1066, 1523, 2740, 498, 1016, 2405, 2686, 913, 717, 1986, 1549, 2854, 2271, 1036, 2921, 2135, 2468, 2235, 2004, 676, 3082, 1763, 2264, 1084, 2047, 2844, 763, 3239, 1337, 1743, 623, 1863, 3079, 1947, 1985, 401, 1347, 644, 2877, 3083, 2592, 1311, 2773, 3282, 1395, 481, 457, 2111, 1712, 714, 381, 2200, 1764, 2996, 1991, 1880, 1845, 129, 2556, 594, 1413, 2861, 625, 1447, 2957, 224, 3302, 120, 2498, 3016, 2786, 1613, 106], +[3200, 2256, 1713, 2290, 634, 2941, 1171, 1274, 308, 710, 974, 458, 2023, 2413, 2726, 613, 1681, 349, 512, 1526, 1923, 3054, 1879, 2016, 489, 2956, 2753, 2588, 3127, 1212, 869, 775, 2444, 1633, 1163, 2818, 1566, 1689, 2819, 3018, 2999, 1657, 2750, 992, 1342, 2208, 429, 2202, 2745, 2062, 2613, 3113, 3183, 1476, 851, 1527, 3300, 863, 804, 887, 3190, 3232, 2357, 2946, 1746, 2998, 2156, 20, 1030, 3285, 2748, 997, 1943, 1317, 1350, 2743, 964, 305, 524, 1804, 2079, 2354, 2878, 2954, 2873, 210, 1389, 2496, 2812, 771, 3122, 1270, 460, 184, 1079, 1866, 3212, 1329, 2706, 1176, 1043, 2238, 1560, 2422, 3094, 818, 3071, 111, 477, 1557, 968, 2518, 1457, 3177, 1226, 2086, 2971, 930, 3118, 2404, 1667, 1755, 3063, 415, 9, 1257, 512, 208, 954, 1249, 258, 1674, 2775, 3078, 2934, 1915, 3284, 2125, 1174, 3003, 1255, 1691, 523, 2490, 2402, 426, 702, 3047, 1011, 2626, 2380, 56, 740, 2920, 2317, 2985, 353, 3005, 3279, 2969, 1383, 835, 1729, 1149, 870, 1858, 3310, 1986, 95, 2064, 442, 1181, 756, 100, 1649, 2119, 1241, 1719, 2080, 1588, 1850, 2671, 2188, 1622, 2555, 53, 2136, 3325, 1154, 1409, 2870, 201, 2865, 1438, 1404, 3055, 2936, 1166, 14, 1258, 2613, 3279, 824, 1824, 200, 2572, 589, 1902, 1969, 538, 1313, 2414, 715, 1515, 1015, 1701, 211, 1048, 2180, 1978, 1503, 2683, 1641, 177, 251, 3243, 1596, 115, 1424, 1390, 1835, 2283, 254, 1680, 1223, 2103, 1453, 3235, 1986, 3171, 1821, 2222, 1149, 1787, 1993, 289, 332, 1882, 2832, 2013, 2210, 2193, 1039, 2276, 502, 2147], +[275, 3226, 636, 2281, 2859, 1703, 340, 1974, 1740, 3291, 2290, 2791, 2900, 1378, 2989, 2903, 2284, 3149, 1642, 3142, 2554, 1280, 462, 852, 2092, 1403, 2321, 72, 600, 2463, 191, 2980, 623, 3087, 2161, 1571, 2854, 1528, 1032, 2446, 69, 2379, 2371, 1961, 2738, 1577, 3079, 211, 2200, 3073, 1568, 2001, 2375, 564, 1308, 2528, 2159, 1012, 2199, 374, 3273, 512, 2473, 892, 3079, 729, 843, 222, 1193, 2711, 2942, 3156, 2366, 1709, 1621, 2545, 842, 2610, 1258, 3026, 398, 2944, 3066, 2398, 1492, 1022, 3327, 2926, 520, 3120, 1160, 250, 70, 1350, 2827, 497, 1665, 3223, 2945, 2849, 2154, 966, 2471, 1384, 2378, 1026, 3068, 718, 2534, 682, 1054, 1518, 996, 396, 2391, 2972, 1464, 1707, 2425, 1453, 2886, 924, 314, 2595, 2931, 2807, 3306, 2070, 2566, 1654, 1067, 3091, 2314, 2202, 2391, 380, 1894, 779, 2563, 1382, 217, 2724, 3150, 2939, 88, 2107, 593, 3150, 2557, 1105, 827, 2671, 2601, 2450, 1853, 3190, 2028, 764, 1858, 2095, 3049, 2734, 2842, 952, 1551, 1957, 1203, 537, 1782, 1962, 1131, 264, 1277, 2681, 801, 1629, 1009, 2534, 2717, 3069, 1744, 3306, 1562, 84, 3005, 450, 1947, 1977, 2769, 814, 902, 1671, 1750, 926, 2512, 2753, 2064, 1329, 1468, 961, 2182, 1327, 3200, 1903, 571, 1274, 2741, 663, 364, 731, 50, 2222, 3251, 1362, 2589, 1109, 676, 2298, 3226, 653, 759, 2314, 1294, 2626, 267, 2309, 2738, 2834, 2973, 591, 623, 2852, 1871, 3273, 169, 2491, 746, 1133, 993, 1271, 1604, 1910, 2995, 1880, 1826, 2059, 3186, 279, 116, 3220, 241, 586, 3154, 320, 2330, 3286]] +eHat: [[1982, 1061, 127, 1369, 2445, 716, 350, 1511, 1239, 1299, 3046, 526, 3296, 795, 2588, 640, 261, 1048, 2063, 543, 2956, 469, 2187, 2087, 2540, 919, 950, 763, 1865, 248, 2449, 552, 698, 2932, 3027, 848, 830, 2408, 2447, 1113, 3112, 1661, 2414, 1875, 3276, 2741, 2414, 774, 1121, 2867, 197, 76, 340, 1177, 1060, 2528, 1326, 2092, 169, 1024, 2774, 122, 1810, 2397, 1939, 3147, 1929, 3255, 421, 574, 1204, 3197, 170, 930, 340, 1978, 581, 1664, 2689, 112, 1670, 1082, 2171, 540, 413, 1836, 91, 2592, 2611, 2021, 1357, 1035, 1626, 860, 2475, 2502, 212, 735, 1018, 2212, 2893, 2802, 2850, 2223, 1529, 1146, 2615, 125, 2885, 2587, 1278, 1440, 14, 2962, 1450, 354, 2192, 791, 3201, 3066, 2632, 2983, 1777, 2447, 367, 2915, 1432, 1713, 2399, 2086, 379, 53, 512, 2100, 2199, 1885, 2933, 2750, 2066, 464, 34, 253, 1169, 2809, 2372, 590, 1821, 2757, 2114, 2355, 1181, 1888, 1332, 1960, 2666, 3072, 2630, 3252, 1858, 1930, 1088, 870, 2917, 1813, 2629, 2049, 1642, 1887, 661, 23, 1917, 3123, 1094, 735, 2733, 2529, 576, 423, 260, 387, 958, 2056, 440, 3268, 756, 2311, 766, 2878, 1595, 2302, 975, 1767, 1616, 3088, 2910, 732, 1635, 1755, 1548, 295, 2027, 2419, 2145, 1311, 1045, 2412, 659, 2082, 2385, 1614, 2583, 1164, 3006, 2693, 916, 2770, 1102, 2121, 2946, 109, 1861, 2020, 1841, 608, 39, 85, 1524, 1452, 167, 881, 90, 2323, 94, 372, 1544, 883, 2020, 2214, 760, 2742, 2221, 2077, 869, 1184, 2004, 3187, 2571, 1985, 2718, 1865, 2310, 3292, 1058, 3173, 249, 388], +[121, 1331, 2061, 3202, 1885, 2068, 1746, 1667, 470, 1010, 1738, 3270, 354, 502, 3017, 3269, 268, 2680, 2015, 913, 1987, 228, 2231, 2319, 2877, 771, 527, 2743, 355, 287, 3250, 361, 3208, 1414, 2325, 1499, 353, 1438, 1956, 2707, 2180, 2792, 35, 2477, 1512, 2800, 2824, 1233, 500, 498, 704, 929, 2592, 2625, 1928, 1044, 2506, 1923, 2014, 2634, 48, 234, 2260, 1693, 627, 1461, 360, 1243, 2092, 1817, 1128, 1871, 2281, 2383, 1537, 943, 2848, 1096, 1949, 3299, 2784, 737, 2085, 2530, 2688, 3236, 912, 3246, 803, 3057, 460, 882, 2519, 1471, 2039, 2909, 960, 1741, 91, 1561, 2559, 3044, 1578, 3259, 3291, 2221, 3146, 975, 1561, 109, 572, 3092, 2099, 2646, 1138, 1020, 2087, 379, 2369, 361, 787, 791, 2459, 271, 470, 2309, 1667, 1930, 224, 532, 1145, 206, 3295, 828, 2180, 2473, 1454, 261, 2642, 359, 2419, 3327, 2028, 3045, 1053, 1876, 3083, 827, 1102, 116, 1185, 2527, 3221, 1232, 3120, 1201, 490, 3256, 1494, 1894, 999, 2336, 1494, 2894, 63, 1185, 1116, 301, 2783, 1031, 2383, 2973, 2463, 2371, 2446, 1812, 562, 1015, 104, 1594, 2341, 1821, 1101, 2749, 91, 2057, 1050, 2610, 1522, 623, 763, 699, 1546, 3181, 811, 728, 2816, 2123, 2725, 647, 3024, 283, 799, 970, 75, 174, 3096, 277, 549, 1202, 423, 429, 2906, 1965, 2218, 2599, 1539, 2288, 1802, 1118, 1315, 2111, 3096, 675, 1679, 3300, 29, 2835, 1177, 812, 965, 1243, 1650, 2370, 1938, 1853, 1763, 2257, 3299, 2849, 1348, 2504, 3160, 1175, 2906, 3224, 1901, 137, 1249, 2251, 3173, 1525, 2754, 1115, 1573, 1811], +[1002, 3149, 2353, 1914, 1865, 1014, 1066, 1038, 1534, 2250, 1870, 2632, 976, 942, 399, 851, 370, 1962, 2930, 810, 3093, 734, 1355, 645, 1324, 777, 2584, 2503, 445, 1466, 564, 1824, 3234, 2682, 237, 212, 399, 797, 3099, 1364, 240, 1515, 1299, 1179, 950, 567, 694, 765, 1781, 2354, 121, 2522, 758, 242, 1892, 159, 737, 3036, 978, 984, 337, 438, 576, 582, 2043, 2584, 474, 1810, 2794, 117, 3150, 277, 866, 3116, 1647, 635, 3072, 1436, 2613, 2882, 974, 1070, 2912, 2123, 2672, 2929, 1981, 3045, 2296, 973, 456, 2578, 1042, 2161, 175, 2079, 228, 2500, 2740, 107, 692, 1508, 3202, 1342, 2642, 545, 1077, 2897, 2809, 1760, 939, 2155, 918, 2775, 3090, 2663, 2376, 451, 657, 1271, 305, 1693, 2221, 1765, 2845, 2778, 1238, 2530, 1261, 1576, 1310, 1608, 1168, 2028, 1120, 2735, 1824, 3052, 186, 161, 3325, 3266, 992, 1258, 2176, 1923, 2130, 1897, 1704, 239, 2763, 637, 2615, 2997, 777, 2641, 1504, 1643, 1953, 3136, 2427, 1016, 1096, 1621, 688, 849, 275, 589, 1405, 1842, 2629, 3041, 2801, 3189, 69, 2086, 2833, 2248, 3152, 2430, 1857, 1178, 969, 322, 1635, 523, 113, 25, 576, 2295, 3314, 29, 1380, 1592, 757, 545, 1521, 178, 919, 369, 2620, 2122, 2546, 1374, 2340, 2878, 1186, 56, 2160, 2170, 567, 942, 2169, 2846, 278, 2049, 3184, 2046, 3071, 2942, 2542, 890, 2961, 514, 3104, 2610, 1828, 2052, 2219, 2649, 1775, 971, 1367, 1414, 199, 910, 3181, 2399, 1183, 998, 1614, 127, 639, 220, 1109, 890, 2120, 394, 2253, 2882, 3193, 2712, 1107, 1739, 1652, 173]] +aHat * sHat: [[3093, 1417, 646, 3149, 1510, 2439, 1683, 132, 1554, 208, 3069, 3249, 2119, 755, 1928, 3109, 2265, 2771, 204, 168, 2592, 2183, 1606, 506, 1584, 1269, 305, 1396, 167, 2211, 3232, 2239, 1925, 2382, 947, 1165, 1489, 1453, 2294, 1204, 1339, 2357, 2057, 2344, 2409, 806, 231, 1616, 1147, 1442, 275, 3319, 1945, 2060, 2546, 599, 104, 3325, 208, 53, 887, 3219, 2569, 813, 2945, 664, 2247, 115, 745, 2707, 596, 1811, 1018, 3188, 2488, 1370, 199, 1272, 1741, 2528, 757, 833, 56, 2481, 2390, 846, 305, 1435, 838, 1579, 2445, 3131, 1080, 652, 2483, 67, 853, 332, 1194, 3294, 3255, 1191, 929, 1665, 183, 1729, 1401, 292, 2982, 3304, 2904, 1589, 3043, 1916, 1488, 29, 3185, 746, 2351, 824, 885, 1337, 2755, 1933, 1387, 1343, 3217, 2188, 582, 2378, 1262, 1013, 564, 918, 1595, 149, 1406, 2041, 3016, 1591, 989, 2012, 2604, 759, 1618, 2117, 906, 2037, 453, 176, 2801, 1740, 2314, 1611, 1349, 267, 1905, 2179, 1613, 1519, 1759, 1724, 3056, 1397, 1868, 3050, 1470, 2288, 3225, 2050, 1711, 1630, 2539, 888, 3282, 1735, 778, 2832, 313, 1554, 1296, 2305, 930, 2841, 3257, 1109, 3105, 1187, 1701, 188, 3313, 2296, 671, 1882, 1313, 417, 1354, 2498, 2597, 2952, 1766, 1825, 1211, 1160, 2618, 538, 2378, 2259, 1383, 1286, 935, 1898, 371, 976, 602, 1686, 1876, 2636, 360, 2480, 3315, 1609, 2592, 1223, 1604, 2066, 3321, 2314, 468, 843, 611, 1257, 2149, 483, 2605, 379, 1790, 809, 1139, 1, 2717, 2894, 787, 1236, 131, 3269, 2491, 114, 615, 748, 1525, 78, 2872, 915, 3143, 1380], +[1013, 1640, 3112, 1717, 1698, 283, 2650, 1257, 1813, 2930, 2278, 1322, 1355, 2822, 2214, 2048, 1058, 2121, 796, 1398, 1250, 3202, 1818, 284, 953, 766, 1114, 1784, 3065, 1638, 2063, 1612, 2113, 904, 2810, 2288, 2771, 1924, 2826, 1878, 1314, 963, 1743, 942, 2020, 2195, 1742, 2994, 2777, 1051, 1520, 1154, 1453, 1936, 2444, 476, 2402, 903, 3095, 90, 1397, 1935, 1421, 249, 1234, 2367, 2927, 2734, 2937, 87, 830, 2224, 616, 148, 261, 1767, 1691, 39, 804, 2393, 2620, 2986, 2064, 1937, 1299, 2695, 34, 1886, 2813, 3203, 1283, 1106, 1194, 976, 1563, 87, 901, 618, 134, 234, 1939, 2521, 2864, 1671, 144, 1081, 209, 2693, 298, 2410, 320, 1296, 3195, 3100, 2853, 2128, 281, 2146, 2233, 84, 63, 3160, 2955, 411, 975, 2971, 2343, 1584, 2591, 1879, 726, 12, 2516, 2377, 3291, 733, 2150, 1715, 2498, 2701, 1191, 1242, 441, 1162, 557, 2561, 732, 1511, 239, 1365, 1408, 2163, 1599, 1973, 2791, 2205, 2185, 2681, 590, 2939, 1915, 2291, 2049, 2916, 1546, 670, 2386, 3265, 2403, 333, 1658, 1540, 2562, 2223, 2199, 3266, 1211, 3299, 1017, 2632, 561, 2784, 675, 2601, 3289, 3114, 2035, 457, 32, 1152, 2609, 2156, 2807, 2809, 435, 3219, 1813, 1441, 338, 3020, 672, 890, 989, 8, 140, 752, 2990, 720, 196, 806, 2898, 949, 1540, 1189, 436, 2794, 963, 2165, 2700, 117, 625, 2378, 2968, 1880, 1511, 255, 2956, 93, 1163, 1132, 2366, 2198, 2052, 1877, 1464, 2186, 101, 3292, 178, 2132, 3145, 955, 790, 572, 1568, 1055, 1603, 734, 2021, 3100, 2718, 1265, 1340, 943, 1878, 1219], +[1429, 496, 562, 1458, 2796, 1300, 1646, 1526, 2068, 1558, 3059, 2779, 2633, 476, 1524, 2020, 1637, 1805, 2842, 1119, 2693, 2211, 803, 57, 1772, 3110, 3005, 1000, 1378, 664, 1545, 552, 1144, 2196, 1777, 1179, 747, 589, 2655, 1778, 1856, 1609, 3097, 397, 1523, 341, 184, 2911, 565, 2869, 2097, 1774, 2023, 1999, 499, 2763, 1498, 1186, 718, 2921, 2660, 770, 2403, 2343, 64, 1268, 2356, 1397, 927, 2931, 2672, 325, 2651, 863, 2164, 2094, 797, 3223, 872, 1724, 1474, 2467, 1568, 1469, 1309, 18, 1093, 622, 3226, 1103, 543, 821, 2513, 3236, 481, 1504, 1061, 2103, 1807, 408, 46, 2051, 2076, 1274, 3263, 1831, 1737, 2270, 220, 282, 1572, 3009, 848, 991, 3081, 769, 231, 1214, 3230, 2218, 1393, 2281, 1638, 646, 55, 2878, 3235, 752, 1995, 3169, 1293, 61, 768, 3270, 2151, 2914, 1420, 2751, 2308, 1, 3311, 897, 3016, 2949, 2570, 1330, 499, 2270, 427, 2503, 3097, 3135, 528, 1115, 167, 1618, 1065, 304, 1883, 754, 2320, 2453, 644, 1978, 1509, 510, 431, 2807, 2860, 3212, 695, 2050, 2325, 822, 1200, 2445, 775, 1621, 178, 1233, 16, 2380, 2537, 1055, 3100, 3038, 8, 3316, 468, 2076, 525, 1511, 3231, 2848, 1793, 3010, 3221, 258, 3306, 817, 2393, 998, 927, 1933, 3200, 1279, 1979, 1724, 1302, 731, 1805, 3231, 1478, 136, 774, 151, 354, 2206, 2713, 742, 2717, 149, 788, 2310, 1238, 1611, 1538, 1183, 2396, 819, 509, 3268, 852, 1633, 1306, 1520, 573, 2205, 1995, 968, 2030, 2606, 2831, 2757, 1901, 1545, 1211, 319, 264, 3185, 1526, 1864, 2657, 1783, 135, 312]] +tHat = aHat * sHat + eHat: [[1746, 2478, 773, 1189, 626, 3155, 2033, 1643, 2793, 1507, 2786, 446, 2086, 1550, 1187, 420, 2526, 490, 2267, 711, 2219, 2652, 464, 2593, 795, 2188, 1255, 2159, 2032, 2459, 2352, 2791, 2623, 1985, 645, 2013, 2319, 532, 1412, 2317, 1122, 689, 1142, 890, 2356, 218, 2645, 2390, 2268, 980, 472, 66, 2285, 3237, 277, 3127, 1430, 2088, 377, 1077, 332, 12, 1050, 3210, 1555, 482, 847, 41, 1166, 3281, 1800, 1679, 1188, 789, 2828, 19, 780, 2936, 1101, 2640, 2427, 1915, 2227, 3021, 2803, 2682, 396, 698, 120, 271, 473, 837, 2706, 1512, 1629, 2569, 1065, 1067, 2212, 2177, 2819, 664, 450, 559, 1712, 2875, 687, 417, 2538, 2562, 853, 3029, 3057, 1549, 2938, 383, 2048, 1537, 2223, 561, 188, 991, 1203, 1051, 1754, 929, 1320, 572, 2981, 1135, 1641, 1066, 1076, 3018, 465, 2034, 1010, 1462, 1753, 2055, 1023, 2265, 444, 239, 661, 2707, 2727, 1465, 2567, 2531, 653, 299, 317, 242, 686, 10, 1206, 2102, 142, 120, 2847, 2594, 2644, 3210, 1168, 1770, 3112, 846, 557, 2073, 299, 1424, 304, 1623, 2686, 935, 1354, 3255, 573, 1941, 2254, 1032, 1370, 2780, 684, 91, 542, 736, 3296, 2490, 959, 734, 2287, 1641, 894, 1149, 2989, 924, 816, 3247, 464, 915, 27, 2471, 334, 2950, 3037, 1012, 439, 2900, 189, 3062, 48, 340, 1518, 1127, 2978, 1428, 3306, 2589, 1847, 300, 1104, 1831, 1643, 2151, 1516, 437, 635, 1724, 701, 251, 2243, 855, 820, 1262, 481, 3023, 1899, 2743, 1609, 1642, 1656, 2420, 2135, 3127, 1733, 2099, 4, 2613, 506, 41, 601, 759, 63, 1768], +[1134, 2971, 1844, 1590, 254, 2351, 1067, 2924, 2283, 611, 687, 1263, 1709, 3324, 1902, 1988, 1326, 1472, 2811, 2311, 3237, 101, 720, 2603, 501, 1537, 1641, 1198, 91, 1925, 1984, 1973, 1992, 2318, 1806, 458, 3124, 33, 1453, 1256, 165, 426, 1778, 90, 203, 1666, 1237, 898, 3277, 1549, 2224, 2083, 716, 1232, 1043, 1520, 1579, 2826, 1780, 2724, 1445, 2169, 352, 1942, 1861, 499, 3287, 648, 1700, 1904, 1958, 766, 2897, 2531, 1798, 2710, 1210, 1135, 2753, 2363, 2075, 394, 820, 1138, 658, 2602, 946, 1803, 287, 2931, 1743, 1988, 384, 2447, 273, 2996, 1861, 2359, 225, 1795, 1169, 2236, 1113, 1601, 106, 3302, 26, 339, 1859, 2519, 892, 1059, 1965, 2417, 662, 3148, 2368, 2525, 1273, 445, 850, 622, 2085, 682, 1445, 1951, 681, 185, 2815, 2411, 1871, 218, 2482, 3205, 2142, 3206, 275, 1976, 1811, 3060, 281, 1240, 2469, 878, 1610, 1108, 486, 2338, 1341, 1481, 2593, 1361, 1491, 3205, 2582, 77, 2675, 2608, 2084, 1504, 2914, 1298, 214, 2481, 1609, 1855, 173, 237, 1857, 1364, 712, 1184, 1696, 1265, 1316, 1749, 1773, 985, 1121, 897, 2902, 1276, 1776, 2021, 51, 1842, 3085, 3067, 1554, 1775, 43, 2855, 1024, 2661, 1246, 618, 1300, 235, 3063, 338, 367, 1173, 1788, 978, 215, 926, 2757, 997, 745, 2008, 3321, 1378, 1117, 3154, 2654, 2064, 2502, 1124, 1173, 1235, 1940, 1160, 2735, 2555, 3190, 226, 2985, 2928, 2340, 1944, 2, 112, 373, 918, 73, 710, 1864, 2220, 148, 1652, 1164, 130, 621, 1747, 1145, 950, 175, 871, 3270, 2022, 2562, 2790, 765, 2058, 122, 3030], +[2431, 316, 2915, 43, 1332, 2314, 2712, 2564, 273, 479, 1600, 2082, 280, 1418, 1923, 2871, 2007, 438, 2443, 1929, 2457, 2945, 2158, 702, 3096, 558, 2260, 174, 1823, 2130, 2109, 2376, 1049, 1549, 2014, 1391, 1146, 1386, 2425, 3142, 2096, 3124, 1067, 1576, 2473, 908, 878, 347, 2346, 1894, 2218, 967, 2781, 2241, 2391, 2922, 2235, 893, 1696, 576, 2997, 1208, 2979, 2925, 2107, 523, 2830, 3207, 392, 3048, 2493, 602, 188, 650, 482, 2729, 540, 1330, 156, 1277, 2448, 208, 1151, 263, 652, 2947, 3074, 338, 2193, 2076, 999, 70, 226, 2068, 656, 254, 1289, 1274, 1218, 515, 738, 230, 1949, 2616, 2576, 2376, 2814, 1838, 3029, 2042, 2511, 1835, 1766, 437, 2842, 103, 2607, 1665, 558, 160, 1698, 645, 530, 2411, 2900, 2327, 1144, 3282, 3256, 1416, 2603, 1669, 1936, 1969, 3271, 2320, 3244, 2474, 2494, 162, 3307, 834, 679, 878, 1417, 3253, 2629, 838, 2131, 2742, 2531, 443, 3143, 783, 944, 930, 2569, 1947, 507, 561, 1418, 140, 1740, 270, 2197, 1359, 706, 67, 936, 1725, 3324, 1762, 1797, 682, 1269, 1202, 279, 540, 1, 334, 1873, 229, 177, 1377, 1406, 232, 121, 12, 1044, 1042, 510, 1540, 1282, 1111, 2550, 226, 1413, 436, 896, 1186, 1684, 3120, 144, 3307, 2211, 828, 3165, 1780, 133, 2901, 2372, 844, 318, 2982, 1052, 2200, 209, 923, 2455, 355, 1930, 1039, 420, 2824, 1013, 892, 37, 3235, 1286, 139, 2284, 910, 2219, 3047, 1505, 2430, 425, 1275, 3178, 1966, 315, 2733, 141, 2977, 3010, 2435, 2, 713, 2517, 2738, 1390, 1247, 435, 193, 1787, 485]] + +ek: D2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD +dk: 19D74AD5472A8B2BAAD2A56702C9B3B5510EF3924858061D57F90DD9A1A01FEC2F57C51A888805341B617C515539597750835C3ED7A033B039D72491332C5DF4A69B6DF26171877AD1E50AC50100BE4728786685DA7A739E843FF0D45922D7281E210D5E82B944652F4862CFB3D902DE60AFD0A164471B26144A1D7A38096503095911762EBA7962C4511D05A128F2781ECB3D1F5BB1244237611ABAB924991F8A2732E27032357920F197C7692D60A9444472258CB457C1B71B77995469F3A962F3ABA6699614FCCCEA741E21C600C4357BBFAB452927C3D441BF8ED73152F75C08F540E186ACCA3326F422C84B988D77E61AE61859CF8541F89209E4983040C5617654808852B649B899A399AEC2C8BBA8A542F345ABF2813F65E9A791D32CC2D76026FB8D0C94B657489ABB487DA4A2C0E3868D3CF47F1CBB2FA79C53CFF6264777C09B177C91315484D2B30B0CA21F55ADD23C57E1911C3F086BCAD21798486EB47B7C58577381C09F5252582D1B27A7D5B8E060CE78209CC82BAE4DA606800C8DB1268F7AD2B793A44F34612CCEA31CE7D796A65A2691D61500625F83E7BE57077EE9C1B8C1CAA137CC4B6573308C19668B24B01E966903ABBCB79B67BE0A3E3E058AADA189B9EA80359AC26F4C5C53735FE4FC35247337760CCA3529B8D266BB6C48010654CDBC5A3E9757524675ABC413130CC2701F28933EABB8392B0D6D059CFC3A30326C4FCC810B37A4748C1C53928A4913E48B186697162C33FFFB06DD5161C8639DB195C6CA64829B2B3A2E4C9683B66DF7FB1909904E00020DBA134E02A168D76AC076BB77D4DC8496B4BBE7B4690BA29B62A91ABE72BEF323A44C8903E482B60D99BA61D1BBCF9CB9673534C1D647662374EE2C7C5F0081BAD149F44206717684D9746B2048633AF7A68C6865FB590358D8CF821458369B0C31EB597CF5BE78EB480EA04E35FACC380372C8C0A04DE276B1A72121E596CBB25EF7536AD3804184A87BDFB5A769160BFBB0CA3C360790E5562BB78EFE0069C77483AD35CAC237C61DE78A7DB46FC917124CA17510DB7DA218890F448EF6318613A1C97C928E2B7B6A54617BCCB6CDF278AE542B56AD7BB5ECD8C46A66C4FA0950CE41352CB85711890458F299BF40BA6FF2C0713862268B5F08E49845B09443997AB29A62073C0D9818C020167D4749231C059E6F483F976817C90C20A9C937079C2D4BE30DA974A97E4BC53ED96A55169F4A23A3EA24BD8E01B8FAEB95D4E53FFFECB60802C388A40F4660540B1B1F8176C9811BB26A683CA789564A2940FCEB2CE6A92A1EE45EE4C31857C9B9B8B56A79D95A46CB393A31A2737BAFEA6C81066A672B34C10AA98957C91766B730036A56D940AA4EBCB758B08351E2C4FD19453BF3A6292A993D67C7ECC72F42F782E9EBAA1A8B3B0F567AB39421F6A67A6B8410FD94A721D365F1639E9DDABFD0A6CE1A4605BD2B1C9B977BD1EA32867368D6E639D019AC101853BC153C86F85280FC763BA24FB57A296CB12D32E08AB32C551D5A45A4A28F9ADC28F7A2900E25A40B5190B22AB19DFB246F42B24F97CCA9B09BEAD246E1734F446677B38B7522B780727C117440C9F1A024520C141A69CDD2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CDECE9E246AAD11021A67B20EB8F7765AC2823A9D18C93EC282D6DBC53CD6DF57592AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC diff --git a/tests/PQC Intermediate Values/Readme.txt b/tests/PQC Intermediate Values/Readme.txt new file mode 100644 index 000000000..406cc2b7e --- /dev/null +++ b/tests/PQC Intermediate Values/Readme.txt @@ -0,0 +1,4 @@ +October 2023 Note on the intermediate values for ML-KEM: These test results were from an implementation of the 3 ML-KEMs in draft FIPS 203 with two specific changes: + 1) The order of the input i and j to the XOF at step 6 in Algorithm 12 K-PKE.KeyGen() is switched. 2) The order of the input i and j to the XOF at step 6 in Algorithm 13 K-PKE.Encrypt() is switched. + +In addition to the above, our implementation of Algorithm 13 uses a matrix variable "bHat" which is equal to the transpose of the matrix "aHat", i.e., bHat[j,i]=aHat[i,j]. This is done for convenience, and does not affect functionality. Ê Ê Note on the intermediate values for ML-DSA. Ê We recognize that Table 2 of the draft FIPS 204 gives incorrect values for the sizes of the signature and private key.Ê In addition, we note that the incorrect signature length is also reflected in the output description in Algorithm 2 and the input description in Algorithm 3 (both in draft FIPS 204). The lengths of signatures and private keys in this Intermediate Values document are not consistent with these, but rather with what would be expected from following the steps of the pseudocode in draft FIPS 204. \ No newline at end of file diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt new file mode 100644 index 000000000..0c2402b36 --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt @@ -0,0 +1,484 @@ +Signature Generation -- ML-DSA-44 +message: DA5FBC7F78116BC8537E8E522DFBB6F68710FC36AE5AF0ACE5CFA3BA4FEBF6C86D966A44C2CF53CCC4FF5B9CC4E6403CFF3C23B4F292AAC01E35A21AB11F0707726E88048DD05887448B870741FDCDFB4451E1216FA2F89D90D872B67B4BA546C8CBF504A46FC02036FB5B287BC82DB9E2D835802DDE3075C7B703ADF4FAE4F98840670964A1ABC61105C3B99C78609605E7F17CD262BE67F7E7A2C6ECC519ECDE8D5B76C21FE5C15859FC94382608A15C7E656AD8E0042CA649EB8EEB59B8E266C244591B265B672D4654C5FF28296707815C647DD11AB3148AEDE24E96D7ABD6C479C0C367B00E464804184140152063153EC3982987618F7D9BD9812DF3B95DDBC47D1F96C752C01B742255946461509EF7A7A67DA0123D670845BE07725D9C1E9F419B4B9133EBA36BC90DE45666C40EA664D93A16948F848CDB9688E116B00B0A4F03B26BB836DFBA93EA6247550FD983371E360F04C9F2793EB769A00BF4049E94F225EE035676E983FC9CB01D15EEB621CC0D4B840EE777ECE351EC66C4B28A36FAF02C42B24804E8126E3852735C2A6F6E201662DC18E125210C78197372B4787A8163ACF4B758921AB23ECC4AB8F3C1DB3549050E26F9C35594DCC1C27AE5999DB695A19681FFD9CD4416E0C79E3457C0B5144F3993E945F6006EA0F541B1C3F473D78F4FED4011E07D46F8DAF7998BBD4A9F5161050D9982DFF28C72E15D158A630B8972E8E2B70611C299BE4BD3405350D2FEB84C93E97FE4DFBDCA5BCC9B6708D7E542D7101BD8D5589BAAEC5649E1C9844C37C5DB0556BBB6B2EB577FB65909B1EBFA7F1590D53D98FC9975BC06F7AC581FE22066BACCA0375AE09DBADC8940E98A38B15FC190523FA6D0CF326D7495B5CC948AC994181EE0DFCAB11722E1B46AD6FD2065442D1FA06ADF21FD9187B55320F554B929BC795F367AFEF11A5CE4128AE32E6C1662D013A91456AD292DFB8B4C161EA7A4D5B43AF63BE7BFC5EEAB9D1E3198F441AD70DF9D6BDEAEAFBD0A293F1A6DF07339A4C34C7375CB6096EB06EC035777C22344912DCCF3D0F8DAED1D0B046118A22886299DA5782DC77487CA5FD0D3CFC724769D658131FA415672996CE8E8BED83E057E3AFE26703012DFED31C732D770FFC7FA55C59BC3FD68C34D00738FC9E3DBECCF4B695B99BBD6A0082752E3A95150AFFE793D8F7FF19BAEFF7744688445E7B561294371E1909035929D654606EED6BD011D2CB0512B1A0987827BB07F14E0E8F0207519DF24BA69AB788EFAB21F1BD69BCB14AB44AED8FEF80F1F63685C6A85100DA1671405F8D6454FCD7D5FB6656959AD68D3E1896C6EB4967615332993D4207DB6B0F5A6E33EF4B2494DCDBA368A052FB8CD48A9E215D30C8C9D37DDAA6B4F3080744E6861B9889E23E9D964F75C5BD5E1DEA98EEEA8E66C60DA73ED1E39115EE0274F2747858D5D644C09B5EFC978D4496A007DAC35F2F68B1F9A3B43A638F38F663E6124740234119D6E8DBAF933ED0FD5A02FEFFF7AE3235C82D90B2F8557DDDC9102FAAF8181E6EE3E9BCEC78E4C61F73FBDA23D4382E5050A0E151E3F51BC22347F9B1A19D74649558ACFF8B21AF69EFFF78BA3E83CEB9EA36D4799272E10F56D3C151209C99105A133B665EA51E4A245D37E7A0F84F5222E3A0401E67BFC1BAB6269CA4A87D3CF062CFFEEE0B5EE5FBFBE1029E93F46FAE68A91CFBCBD5CF8B78F122AF22A11E77095DEAEBC96F1613911E02237F795AE717301499936B440E07B32DDB09008276C9A5A314889E8B9ACDF32D6695AE2931CC29ED1DAFDB61B708B52F9888DA67ECED25217F1A5FC1EE7D482917C7C7E44CA7F0508FD3BC94BEC116A630ADB08DDD882A221DC5D2C60A2E9F2F849B3E8B5DF150EF753C35251850D0B4980164F8C07339E035D5B2EEC4BEEFB885E261E401BDBA408869951075DEEED3C7EE7452AB39856D240E954FC8A4BEB01A0F79187BB72DD2925E63B3DE9E16CDDC041BC3BE47F318DA6DC6A9AD8710B18883367E374DA58D97F00B1E75AC8D4658F04295223C8C4F61B2CF7104492DC7A0C6267F45B5A4A2D258239455A31D265BDBAC9FA6E4A1812043C9112ACD4240625F08B901263EC456D2A5877BC9223A6C483673BE5CAB8C32516AD5B956688A01374AA48789D53AE79E7FB109632969E45684804DAD54FAB1E94A19C2A9B53BB9079F484C64A924C9C940FE5A3ECF29C739E3826311E42B310CF75A47B932BEF104CB27FF35D51E3FED9D724D90A17982F2897E2FD09E555977CD668E67A34216637380B8720A593FFC4175BB27E293C652C2DD8C506F4D1F551542EDBB31EFB3C1BD5DE6315280BB04BFA53CDC2D38C385C04E9BDF389745ED394147063CE3639ABCAA429C68475F9D466321EEBDE9392A2A2A6EAF53FDE20803B76B0903DDC6C81874A81AC147FCFB9FDA970BA5D87E4C346DDB83B60A718882E16F256A0F13969606C43D84AFD193D7BA3CFAB875646401547458F36DD53C2182B36B84DE8F8A50E62921A5B011319C555766E46EFECEB239297DFBFABEF3AE370CF48A08BC073B1E16A8C840F2604F75F39B3F0F4847A445A15F0B946D423210BD32A09A9EDF4CCEAA6E90AD1379E5928B66BD3A02C5E2AEAB56E8987B342EBFD9D3C70EED3465D78F12AF4423319B3106AD8BDBD9AA5736E6CC15C7AEE0DC78A1FAB83015CF880DE6249734153F6058F567D648AECF70D1BAB8397879617FD6FB06DA1AF6713E3CE584B214742587A5D35C6DFD33AFDAAF00AFE00E1CB516C955DDA9E0A5FB78DEF914B532F556D7E72E9717BA49A2D0F9EAFB5F526565C58E0FFC1B55138C8DE7A9D6CC06FC9927F6D04440512163B58A236F57B093E80F3CE0F4CCE282ABDCCE284057C4DB6314E05EE0A32B5F20C481F8BA4ADF943CA1B0277119DA1BBC4EA1D24CF7E3DB4C759E98753EFCABE2FB5B1FA593F2AE2B7ECEA96B8E0E5B3FFEEE97DD6C50CFE8602613FAC2D71174984C2EB59E532A35CF4FB0BFD60B8CF7CA3E7D5C0EEAD822648533D3CDE72C787DAA412FC70674E95CE2F5BF58D3646B4881D4CB6DD96659BB1A937B24795B435A103C03CEB6AC85E8FFE9C495082A87854392BEA530D61A7F60B3431455DB85414E6C365F9721ED2DD4F7C8A37B88131F5B2FFB5FC4A40BDB12EACE61AA956F8724C99DA98DAC18F6D33DB5F4A189454C736 +deterministic: true +sk: 5AE5192442A0894AC775D84419BB7EDE9E8143A6E21CD709A47B58545EAEC7F59EAD08050900CBCF4093F9327CAD67B7600D9F8425084B6905BB6550F426F58B27B47C434BC194D466D83C14BF5ABEA249E05287EC80D1B56BD0824E4EB84CE1CD4CCD0DBD1BDE59106AE10516E1150E841B03E759DFDD930F6C7BAC857530451C438E128029E436491980441BA56913074A8A8831E084641A152C40B865C9A22100800C13828C1C080A84C850221688241100D220085302695B1881524812C832881CA970D91445A122221226449106800413504BA86DC126321C312288486280A64463C261C220220A210653C8910919925308200988640A3100CB9868434050C2A06C1830482138640CA80D03339254C44D42B29014B9500400220BB38D8C269010B62DCC481261980522A03050A489DA2225A120859BC80480129252906193985182B470584481D2806448C669C8B65164B6219C964143262D1294641887111414500A166D64364EC282095C980502202683C48113A20559B02D10090DC084519CA6215C8885E1088990200E11126D182129D422421C2811214611582829482830A1400EA4400A428040D0882504C72111B20C8A148123002C53B688943411E0448140044A03A4111B042C6330715204285114864B8004E3B649E4B831D13264D814094B468881424A01430C41388008478A20378A01A8080831228CB285CB880D0A13499C860191848D04A72192A80181248959964D0805202341511A36081012842407300A1820D39881E0164A0AA669A2462044240C54084D1B208C923869588428D1144E63920022C94DC9320800497111A28909B384234591C22452D8C220C810610106669B062959B24C11B38941149083886108C488D1462682B00D14B8685AB65080409119B38DE2A44D1A0161981489A196610181514106019B0804C3C461A1823010A32D21876098103190425252145293A241534692212332A1828D40286ED3288AA38689D1048E1C936910970DD4125184C891D4246A194609E33426D0A485481605618489124126C9B6281C2111A3860543C05158386121828C1835645AB68C04892C03422EA148065280910146852219205B3292E1440404A908C9C884E4928C5342400C181010064A1BC07142887010284D2241602393905A88455A186E618445400884139084D4406964140288006A63380E18362E98160C04A7894B964D04844051B08419450612912411B410E186895A00318C129097956ABE59E75ECDE4E7482F0BB70D6502309163C9467EA51E7B467C114BA884CBDF37291400166F7E2450D27C5A20FC1130192F1B482740712446605F49EA14E3C35515D05EFB062339E69349C7D416830F426282A4C0C0BF875B0F8D98BCA9B55BC1E199C9482A8D5CFEC68166F9545F54F3B0BF14B2117DDC6356966BE0DD3CD42FA47EEC9FE4058A0679F3EF50F7306EDF0DBC58D2020702F3C1F0B23A70C4B9023B43E7EC670EABB06869A3AA3D315E9606F0216BAFE585E0006BB6656E1C146E2396A44D3B545A1D722B6BEDD33B40433B7A9A0B91DB43A0AE280F57DAFF4EC8E534885C436A6745FDF857A093F9067BA95229CF52D0C8DF29C52736EFD4FA98FC4C71F6A94983F8F008F29178BB53CBDD56A045408151FBFDE28941F7D7446D5C2B2CAB3C418E04C851D230A49F288713F3E7221CEE86FEB67B469B076871A7CB576D423B5CE20FDDCDBC6F3BFE841C494E6D6050BE92AED653F7B387CBD662AFB7B01401609D66EE5739BC0E9188EF3F61B23F6402A8C60D6C272EB27E3C36ED15A7D95E1BB15C8DF6774170CCBF50A2628F1E80F3007BE33D0C5D86C61BD927BA3EADCF000C5B4A1BBC0889C42183A1FDFFDA0FDEC7A2CB5148953B3C428F1153E802B0E60F39EC4CF4108DE315B8870E80790E6B67799499A768A60F0E70EE861369F0B0110498B206B01AEC9C56CC335221E675F0DB77B6A2F9BE317407442F152D32E2FA57054C2F05757079D29BF85077E571973C5410743C679AEC39B51163A9B3AF4049647FA008AC5E304F82AF0A0F28E5CE3040C8D9AD6799BD4E70B7CA23F965FE96539EBE04ABAD5DF057FE26437FE44289ECF68807FD2C8900A0D3C5B3910BAAD7AF92BE09B83D0E16CC617607623DD8A2A8ABAE82C48C1B383C13DFFBC62CFC3F45B7A0150E799868D55AB5A9F67EA0D4D35D9D2EB0317768E1F67FFB8DCDC9A6FF9FAF58BC260DE56A0165900F4C54DF209CC148CB93469C59CE5D0576BD2CD40BB0D0A9EB21A41EADEE0039D603FC2917366B7F238E75E431ED7DE076E9E72701DB873D86F73A4A99A82538FDF5611FC42BA4D899BBEE81EC55E997A697A9591AFCC2425A570BD026CF0F3DA4999D0CE7C2238037D8077B3E13290DF420A41771548FF2C2D89416FE776481236B3AE22DD2A21EF8EDFD5E2CA526A796B568AC47B3CD4FFB0743771E647138AFD6ED35AB242B0252DD19862AC4DC3310D905FF68DB2F53038D176D22D350401857794DC2E2C1443696E65D7886759A5ED653F14D9F804FE55E45DB4090C0E166C01F1FA8AA939B8D83CB3B1B65ADF4B31656CB8D04F21452BF2B6B36BC18A8EFA7A0E4AB67479844DE5EF231C8E8168BCC252411E67EB3F6598176F4D6739DA69AB952CA12B7A951B2333A991477CA51E1183D2769CCF90FA87EA2C62DF0145990C787AE739D5802E9362E5EDF969DC71FE7D2542A4DD1EBF12A08240BAB3FB4EC2126DD0C0AC740EBA06CCA2AC6ECA57E4094ED4C818965105037D1EF2E739DC2D58F2554C40AF69ABBD483A896654C5A26668691A6A8C005ADCA4EE51BAA82DB5D7495E29FBDE6DADC67929A60FA95267A1AB764A1A41B3CA0C3FE03FB5A8400130E6ACE93197D3DF50FA789F16BFBE6B292FCC2E9C03C792473A70AFE13935DF76C2E5A2FAB154B5CC5723E5611BB363B621EEF74343CE19AEED62BF771DCAAE501977CD573A412F15FC8D294A512B7B412F462298713889F6F9E7DC35A0541A2A306CFB9AECFB74C0F94817AB81C804A0508718269E5691A24A2CFAEE8D0BAA69BB30FE04C45881485B2D67AD09D5EBB43A3508AA45BA2D54CCE4E7FD7B679E735A4D78E8DB1BB1583F1C91B0330D2AD7A80C7D2BC60DB220287413E9B4DF7F68E8A8541C1F1F85D15BDD51C6902DBA86A67B2E4CD86B92E7BF58724AC5A53219216B78BD1B50CFBE9B468A667FC6C4F35A610E7AECDA8A12DAB0C5A658005879E2608EA6549999DE0C396E2E0E19895E77A68356EA29BD2A1F24BE4552E679DFF66EFF39235183E26DF4D23CDD284BE2D9D706A301CCF33D0C85DAE62ECCBACC1503246B853603F68DB14C2E0B972BE2AAE6856BEEEF83DE2227AA876E5DC62636E2E95BCE79597E01A5A3FEAAFACC205AB09FFF7641BCE3ACEBDC6E6AC2C95276148543F2AA1A4E949DE5F35F4DC1048824389CB90910D47C7ECEF591BAF68D6A456B79278F356A6C34AEBC370EAFB722F0791033708C24A3CCFAEDCA515C6DC1B83B85251A2F665B3777E1805FC8F98F9789944139C60BB8AB0BFA34D3783599707BD44CC99D2E4ED71F31EF7AE6B8FBAAA4A5377DF40F8D6A4C1F720159E57718C78FE40 +rho: 5AE5192442A0894AC775D84419BB7EDE9E8143A6E21CD709A47B58545EAEC7F5 +k: 9EAD08050900CBCF4093F9327CAD67B7600D9F8425084B6905BB6550F426F58B +tr: 27B47C434BC194D466D83C14BF5ABEA249E05287EC80D1B56BD0824E4EB84CE1CD4CCD0DBD1BDE59106AE10516E1150E841B03E759DFDD930F6C7BAC85753045 +mu: A12A0CBDCEC8AEF5EC6AD85326CA82938BBEA6C371CA19083DC23BED8053940A544CA299C0CF8AF2DD7BDA21A995598DB01944BAEC75E78D9774652CB8CB3250 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +aHat: [[[6040986, 2350664, 1214746, 7632339, 2508550, 633397, 2663794, 7047179, 821075, 758878, 8358712, 1928899, 6060553, 760254, 7369556, 7140499, 5751989, 2504697, 5094036, 4563991, 4073328, 5622919, 6029102, 7379655, 7672951, 3416667, 6485296, 2830854, 2621718, 5963945, 7183670, 3586882, 2852838, 6786342, 2722121, 1503122, 2769766, 1427614, 7088930, 4600100, 8250050, 4813409, 6980912, 996957, 424822, 8000666, 7168583, 6950036, 8032196, 3564965, 6073353, 5931172, 7965533, 4375723, 6870372, 4198660, 8122158, 1243945, 5946829, 4007480, 5577699, 5764870, 8198821, 3235891, 3775167, 7793765, 5103782, 7141522, 3760488, 4589128, 2336101, 4457102, 4358559, 3193742, 373175, 7970714, 6877204, 6792324, 937506, 3123328, 4921926, 2848763, 3843554, 4543318, 5220100, 1044889, 6976011, 6616235, 1422172, 6498443, 8067844, 7151509, 6940488, 1358047, 5571135, 299233, 1372766, 6104339, 5198985, 2782218, 1342478, 3375712, 8183129, 1065696, 8012685, 1045386, 6354609, 2986786, 4663298, 719975, 6282346, 7461351, 5956596, 1063719, 4931518, 4651650, 3736048, 1755530, 7231879, 202559, 15167, 7300860, 6786295, 2490106, 6023958, 6389610, 4719427, 2776704, 7744577, 4661900, 2162433, 7843585, 5312677, 777875, 7056587, 4051586, 3478653, 4103665, 8137683, 7838098, 7165642, 805903, 5308595, 7882519, 4857878, 843301, 1833251, 526798, 4160036, 2013578, 5522673, 3075203, 203206, 5987368, 8194761, 291971, 369785, 802696, 6736990, 7473766, 3311312, 131382, 4296582, 6080976, 1675688, 7465367, 1257519, 3266340, 2060356, 5464389, 3980210, 5160260, 5507144, 3680373, 4341454, 6818539, 2503229, 5166713, 3174085, 5425190, 1262366, 7221283, 969984, 525652, 2577772, 7428087, 2183705, 3952735, 1766039, 347449, 3564017, 3307055, 917795, 3286384, 5329952, 5102294, 4346614, 7014312, 356924, 4283440, 2748067, 1580767, 5945677, 7713147, 2832096, 6137232, 2134942, 4635898, 5498935, 2047474, 4970409, 1778801, 5940793, 4251259, 5134961, 6853766, 6589754, 6504205, 2464387, 5640175, 1430364, 6437125, 5061577, 6037427, 3037, 5345539, 7571573, 6525051, 953744, 3474556, 169659, 1912028, 4376513, 8231914, 6844852, 716251, 5795044, 340017, 1946710, 6759462, 251690, 8170448, 251458, 5692683, 18769, 5759733, 7499596, 2345673, 7340984, 7323149, 2082272, 5564966, 6116153, 2370989, 5704252, 7193998], +[7400627, 6870200, 1419581, 6282757, 2134937, 2354926, 8261572, 5849282, 5519182, 7542763, 5975707, 3266136, 3059571, 5539098, 5795874, 1179544, 4284364, 120186, 2874906, 2071355, 4448035, 3222271, 3495009, 897168, 2388109, 1092283, 6550981, 1583447, 7538440, 5070538, 13553, 558889, 6245438, 2277600, 730121, 4532827, 1781556, 3420649, 2068783, 4337434, 2277661, 8049309, 6984878, 5931505, 7328016, 7074393, 2954725, 5965493, 5652142, 6625631, 6892203, 8125775, 5531168, 290843, 7260383, 612911, 5185051, 2614831, 4623830, 6291687, 7538505, 6320741, 3178623, 6905548, 6244890, 7781851, 5148957, 7636680, 7836589, 5249043, 388848, 503761, 4830466, 2345461, 4632432, 2259582, 2647329, 5661878, 1696911, 4429315, 5318820, 8326822, 6858526, 6403528, 4786259, 6835733, 1162450, 4506619, 755495, 3065292, 5922804, 697182, 1405833, 4372182, 3161430, 5449301, 3462775, 1764096, 5528444, 1025706, 2373896, 303720, 2108546, 7824951, 3596449, 7685093, 4828252, 8312840, 4772197, 2499089, 442743, 5932698, 3536734, 3324307, 3225526, 6591268, 2312992, 3567260, 6721063, 3851742, 810532, 5468890, 4771510, 6181777, 4789263, 6389001, 6813976, 2084975, 8171342, 7222138, 1293110, 2625004, 3294269, 82878, 3984841, 4821506, 6991945, 3159101, 4972272, 14235, 1504903, 8033692, 4394438, 6807836, 413940, 5738134, 5404032, 2256070, 5019967, 2339563, 5150354, 4386691, 2824836, 2869880, 2755542, 6337881, 4422618, 1155102, 5085714, 63752, 5365541, 4110836, 3466858, 4958839, 2577689, 6676325, 7236122, 6410227, 6332592, 3207179, 5959969, 2285320, 6225326, 928696, 2161402, 7687291, 5586096, 1194962, 104865, 2235291, 2217017, 41035, 3952855, 3753055, 6317891, 7609740, 2852994, 1551446, 3181894, 112819, 799673, 2204563, 6199546, 6085242, 4328109, 6492099, 4567643, 2465653, 3387806, 2040155, 3587722, 3084345, 6422377, 4743150, 4777413, 773516, 1273239, 346282, 7533928, 449658, 6425655, 6914451, 4777356, 5441643, 4856084, 6881040, 7058880, 7407460, 4823203, 5830854, 1188799, 5647284, 2706403, 1862090, 4604473, 152232, 2777889, 6195409, 2606489, 1035729, 220215, 7617107, 4930824, 5428395, 7863419, 4484121, 2705161, 3964671, 2871947, 7862108, 1004210, 6882610, 6522855, 5384088, 7874694, 3320238, 4790199, 417141, 3787916, 5820038, 6818634, 3480353, 4808631, 3711225, 8128642, 5819550], +[4853538, 5915247, 6459939, 623769, 866340, 1744787, 2650216, 1046178, 4635104, 1794943, 5661288, 8122745, 799868, 2108125, 3052542, 6100564, 2865788, 6089437, 5220755, 2037081, 4379922, 5582163, 2448088, 4504515, 5321899, 4613171, 406236, 8077470, 7990411, 1063724, 2934744, 4522204, 5842923, 3503823, 7185068, 5913346, 7828007, 5508785, 5321584, 7442301, 3024375, 3604039, 2734390, 5452258, 404841, 2384787, 1519097, 1455901, 2285989, 3628398, 975336, 1958834, 8266421, 4666161, 3631579, 3897372, 6221613, 1560914, 3263699, 4706474, 6036472, 6488238, 972056, 2716167, 5932873, 8293548, 2838850, 416571, 2106667, 6124679, 4260155, 810929, 2023230, 5985183, 1017564, 3659063, 7379451, 4089633, 5124208, 8360716, 4060887, 6833022, 7427054, 2912817, 1149825, 6188522, 6071188, 4993302, 6306037, 4231083, 3346406, 5297801, 2188233, 4080814, 1710296, 7819204, 5685176, 7328652, 5218298, 1959928, 4194539, 5805582, 6996022, 1042189, 5124908, 7241095, 6552674, 7833514, 4194524, 5644761, 6485081, 48588, 3792236, 436444, 3290049, 4492322, 7319406, 6770639, 4180196, 2912661, 6397747, 1422061, 8010635, 7786311, 5369737, 665976, 5217316, 7631112, 6310865, 2232768, 3618633, 1595379, 7909923, 4729314, 4564163, 5832317, 1725894, 5257592, 4167924, 6329239, 3759913, 4353246, 5025159, 3632505, 4678821, 425197, 2499814, 1033851, 782773, 5368592, 8003695, 4760092, 4504737, 5020982, 4782905, 8187276, 5344493, 314845, 8357378, 2226682, 3240295, 4440549, 764865, 5787224, 641326, 5594643, 8313230, 3881357, 1260517, 2766964, 5330606, 6922164, 5093003, 142392, 2114231, 2678808, 3783916, 7654186, 6299382, 464106, 6417625, 729071, 5000046, 2745435, 4067325, 7517469, 6362860, 6517993, 4509595, 7120260, 2434601, 3867001, 7129347, 4241221, 2224626, 5029728, 6586530, 6417395, 4487576, 404446, 3438979, 2371788, 4564901, 8206003, 2097966, 1550698, 3372670, 4764303, 719120, 4897600, 2406317, 8051463, 6929783, 7439481, 7869575, 5585767, 5862779, 6759326, 7562526, 6851477, 5108259, 1282037, 8038366, 1768454, 1995291, 7897783, 7577009, 7580388, 5156407, 3119265, 1616943, 6732731, 5094137, 5144998, 4103118, 1053782, 7516472, 2113499, 7612103, 928775, 8060362, 1169340, 3702717, 3062940, 3615559, 812523, 4173212, 4673563, 476588, 5367143, 7400390, 5268641, 2417345, 5804478, 1889545, 8277141], +[3916585, 1206507, 7616051, 1490935, 7681477, 4390106, 2603657, 5730813, 7464249, 7237698, 3578248, 568065, 4982191, 6213955, 6384033, 3672923, 4717541, 336488, 7221385, 615973, 764226, 1613342, 1246937, 97773, 5364192, 3685094, 803120, 937091, 1687667, 4394966, 7290406, 1687650, 7635845, 3949325, 3886352, 7852358, 1765082, 4090215, 6128515, 4539939, 3652634, 5188739, 4390586, 5199000, 6613748, 3286640, 4254635, 7063028, 922375, 2030990, 7041584, 4262137, 1681998, 3063411, 5452184, 6166809, 4556276, 414742, 1810769, 212236, 7468167, 4316928, 818734, 4333750, 2240541, 7864948, 7378612, 5924823, 3425348, 3860587, 2129696, 4968571, 1791832, 3508992, 8170303, 2889471, 3042330, 3232357, 3029026, 4978007, 2691564, 2240364, 188587, 7152960, 2739076, 2672481, 1010789, 5488065, 3970830, 5916842, 1588309, 7040781, 416653, 3317316, 3092535, 1565174, 6761026, 3269781, 3966978, 1437541, 5400410, 833755, 5718359, 2934489, 5036070, 6634214, 4942721, 3339684, 305306, 5667871, 1731480, 8329642, 5132373, 4624986, 1377978, 318062, 5760584, 2624957, 5503689, 8204506, 2766223, 6193133, 5123684, 3154130, 8106880, 466003, 5463043, 658514, 5667837, 4055595, 3535682, 3496767, 1114431, 3219882, 2635973, 3952966, 2367373, 4796374, 4546132, 2231085, 4268517, 3879949, 3405663, 5846403, 3639589, 877294, 337978, 2677033, 5358393, 7644305, 3871781, 7172891, 2308052, 4051605, 8129219, 4750611, 2045710, 4229823, 1761920, 6713159, 1463876, 6332328, 8008486, 5590536, 3724686, 1727507, 4914229, 7917140, 867080, 974839, 3448358, 2008336, 4359491, 3390669, 7756766, 93104, 3483049, 8224409, 7227294, 6435410, 4843071, 3257605, 1304406, 4873970, 4994857, 1386668, 272858, 3140550, 3513453, 1039773, 2013547, 7355417, 3062993, 6210376, 6532551, 4727020, 1162842, 4356968, 4312146, 5526594, 386527, 2075986, 1632091, 6825230, 6849077, 7128308, 8274619, 5213217, 5602993, 4477639, 7284067, 6538728, 3760874, 7570530, 5902036, 4147590, 6513061, 6225644, 5911373, 3471479, 3246988, 3568867, 1175643, 1505016, 2549273, 6989750, 6079665, 6245893, 4972101, 5156682, 4958438, 4755302, 2601190, 2068972, 2321962, 6144658, 4523163, 6015871, 5578888, 560943, 7184031, 8184715, 6264208, 7459668, 7256367, 7127086, 7971736, 4725900, 4714203, 5100592, 2354309, 5993817, 5770704, 5494745, 4044922, 7669754]], +[[943959, 7939384, 3714210, 3779061, 3532517, 1733564, 3701928, 5174646, 8297884, 6102742, 4457757, 3421267, 6110238, 2334728, 340452, 5776822, 6474300, 3130351, 4372768, 5996505, 5052928, 5814508, 2131019, 7338319, 3644226, 1106524, 2526268, 3905430, 4494217, 4191473, 304496, 3199683, 3717876, 3081250, 5719122, 6030393, 1954531, 3817209, 8005103, 4965486, 1758713, 5413977, 82479, 7880951, 742237, 6002511, 1394290, 472533, 404021, 1882170, 4032671, 6432358, 6795388, 2443002, 5889884, 6171124, 1964878, 1771943, 965911, 927593, 5902067, 1522949, 3939619, 4680020, 6889907, 2413868, 7858643, 3017252, 7058517, 3737157, 4959766, 3958362, 375084, 5506268, 7535769, 4390403, 490498, 2573136, 662004, 1488585, 2721182, 2672427, 1334673, 2356143, 2930290, 6041728, 3249280, 591357, 868996, 2325971, 6098676, 2780586, 2161230, 6143945, 2686827, 2300228, 7967951, 1018711, 6261457, 4960894, 6235685, 5885644, 2589026, 911483, 3642627, 4421007, 4514757, 6550697, 27446, 8060107, 3211014, 7898656, 5584780, 4581466, 2126052, 4605312, 6885237, 5669562, 3727218, 7225366, 5368400, 1979073, 5683812, 2708226, 4454797, 4688412, 1769119, 5926660, 4563037, 4462882, 7745003, 1049874, 3534476, 3358910, 2954672, 7084321, 2060171, 3908503, 8272077, 4253294, 7516237, 2651887, 4003822, 8114374, 2947161, 2748585, 852854, 6176299, 6502819, 902094, 3486913, 6841190, 49662, 3403925, 2471537, 1881602, 7599355, 6369915, 686662, 5618445, 7842347, 2225164, 7245678, 1913838, 8331607, 2717159, 2683038, 6109921, 2843752, 7749817, 2833474, 1355177, 5481326, 8067483, 3803983, 7763620, 3050005, 4407253, 1657589, 5148605, 5016304, 185227, 4808840, 1289373, 6740904, 8262553, 1273329, 8115749, 3017499, 7292218, 6497792, 7550433, 4091032, 2143791, 2460490, 6212132, 8119137, 4347484, 5005034, 1684746, 3548730, 5501499, 79497, 5552699, 3997816, 8262012, 6267241, 6959093, 1694467, 2201802, 5685642, 779698, 750559, 4476308, 1836786, 4050375, 6102774, 910865, 1589976, 7915433, 4934361, 2328018, 8025883, 532075, 6465207, 7431440, 2470382, 4601581, 3279614, 8271024, 6675761, 6023468, 6856373, 6864428, 5601183, 4935051, 6199641, 5463351, 326921, 3032141, 7431480, 5431912, 1539503, 3678946, 796191, 2570078, 5375508, 5014384, 914800, 3591309, 6887978, 6504111, 1274063, 2357688, 6056808, 3514954], +[5477485, 2611553, 1259502, 2429692, 2155400, 5304211, 108616, 7182226, 5890307, 6712102, 4890109, 3285941, 5670628, 4516456, 1881767, 1532264, 5785651, 3643681, 7558957, 866280, 5474191, 5168458, 5352260, 5765163, 7527682, 5531228, 5949368, 8235171, 1609466, 5179517, 5716509, 5071034, 5411802, 2123764, 2395459, 6623179, 7810236, 5986950, 5436983, 4530726, 6467720, 3776060, 4946082, 2391326, 5006656, 2498454, 2271349, 405023, 674230, 5845937, 7903681, 3409409, 3438532, 3476555, 4007833, 2464115, 7670651, 7137671, 1035547, 7750171, 3347655, 1822552, 8079398, 2571881, 3221957, 3986260, 6071756, 5558671, 7269962, 2145085, 6390803, 3604702, 1435387, 420237, 1043670, 5116954, 2472428, 7149441, 1429561, 3308342, 344940, 5431288, 2486291, 4211372, 4227623, 430553, 3867634, 1101067, 2526803, 6835425, 3430778, 3909184, 8100403, 293741, 3372164, 4264601, 1554039, 2477471, 7970317, 5076852, 4977799, 7789276, 576961, 2830066, 4302902, 4364376, 7674461, 3765539, 7611145, 1651007, 921371, 7090990, 6521421, 3287635, 8218714, 6653295, 815643, 4430270, 959047, 2516027, 5628866, 4883513, 7046453, 7713656, 4569333, 2985039, 8152827, 749491, 559814, 377076, 3432561, 965264, 1572302, 5357870, 7185653, 6272776, 1234654, 2087855, 2321320, 3348607, 4203379, 405898, 6991254, 8098013, 319283, 5630003, 6944629, 5576041, 6511440, 496114, 5712949, 2969403, 6489143, 2621990, 8305639, 4908298, 48187, 3429344, 4532854, 6832322, 4123672, 94210, 5413908, 7500165, 5636879, 6755228, 1903555, 1180252, 3438774, 6830089, 2105691, 6266992, 6032013, 2602148, 7541627, 489068, 5707446, 3858943, 1317006, 1669685, 4828512, 6764954, 5818989, 1772850, 3219865, 3994867, 2711441, 1113378, 1297267, 4574730, 1213680, 6445830, 4664725, 7484632, 1630526, 3534856, 2361491, 2273748, 3985715, 8048616, 6560596, 3538090, 1876081, 3940340, 365648, 5176385, 1655910, 3156679, 694083, 1752647, 7740301, 3116345, 5231813, 4229458, 8311039, 7551996, 164738, 2517303, 7156147, 1462147, 7629657, 3125879, 1268394, 1294279, 293896, 1964874, 8353743, 5959680, 4394843, 280307, 1312690, 1414413, 526453, 2446659, 5006392, 2679129, 5035671, 420049, 1019204, 1334255, 2683529, 3329910, 6701487, 1570643, 6666619, 7228976, 768790, 7411802, 4798054, 7478657, 489634, 1557118, 5070996, 8058851, 56261, 2422508], +[7915225, 4356971, 5032330, 4384725, 7883036, 4028534, 8055029, 267544, 7542538, 6772860, 7559022, 5734317, 3926646, 4942056, 5690476, 685077, 2090582, 7225046, 19007, 6745057, 5117744, 6860211, 5478393, 217967, 6532812, 4286124, 6924643, 8101335, 864043, 1551549, 6513821, 4081011, 3329965, 55641, 3753397, 3580005, 4976850, 7512819, 6134790, 2982428, 2002471, 3736587, 7874148, 5803081, 2512006, 2550455, 3438734, 2417623, 3404263, 4933986, 6213443, 7083184, 6916985, 6474335, 4017514, 4712230, 553325, 2359538, 7494780, 1718149, 7869582, 2123262, 1824898, 5091796, 2719332, 7738020, 2629477, 5326493, 7418583, 1296640, 4159118, 3293871, 1622681, 4324320, 5867231, 871359, 6734276, 4579750, 376625, 4088782, 5800814, 6832260, 5019301, 4856215, 6998676, 532380, 1763354, 7399583, 2976755, 4716213, 1430434, 5202023, 488578, 5276093, 6264559, 5517229, 1068912, 6777192, 4657847, 2152256, 4410805, 760007, 5863510, 5798849, 6975929, 2820812, 8039782, 7146821, 6681860, 1019625, 898443, 5361564, 6708253, 5753615, 622015, 6006207, 1406548, 3626147, 6824846, 8125892, 5278510, 7814767, 7675451, 6359885, 3798106, 388249, 7814157, 2012772, 6721072, 459479, 8265673, 4867464, 5496566, 3597616, 2770584, 7700804, 6290512, 1301340, 114523, 7566454, 1510365, 4379545, 2726916, 561870, 8048211, 758285, 239127, 5071102, 1725545, 4094057, 2404891, 1962107, 6655152, 5066933, 7332889, 527396, 3507026, 636480, 540139, 1047993, 544511, 2243964, 4901676, 347561, 2550825, 73706, 6049842, 72448, 6474990, 1131124, 6888056, 1746282, 7207162, 3883198, 223896, 3437887, 3089299, 7250264, 7774651, 7616501, 5025927, 1974133, 7703449, 6502031, 6404627, 3886706, 3260730, 2736627, 5604043, 7427473, 6624331, 7569725, 2499752, 1852045, 1975181, 2221242, 7091308, 453529, 3105323, 1300798, 4461636, 2624177, 3413292, 3685876, 7632686, 6277789, 816205, 6743846, 850139, 6891018, 2602942, 5703447, 5401554, 567771, 6712413, 1581149, 4118778, 1350212, 6268856, 7150293, 8079643, 2746562, 3297139, 6216809, 12651, 860094, 7647487, 8377669, 1827068, 6024422, 217447, 2881693, 4184318, 661362, 3973412, 108488, 4160964, 2707377, 599643, 7164804, 2021045, 937318, 5148154, 1862205, 362759, 4908556, 5072105, 1998547, 2566508, 4022100, 6018342, 8351838, 6855323, 7725886, 2173906, 7406255], +[967844, 2541863, 1434278, 7791641, 6290694, 477058, 2117736, 5389582, 6432849, 2186234, 5524702, 1879624, 5388089, 3042210, 159604, 4293019, 3327343, 3827274, 3412627, 6571396, 2326984, 7516402, 2948752, 671201, 3450320, 2904095, 2538269, 209490, 6274644, 3976807, 3792786, 1039704, 7763789, 1315608, 7133381, 6502861, 6344955, 8276070, 1776713, 4194447, 2604416, 7377652, 5021967, 6299819, 4922686, 6707320, 856267, 4889566, 95774, 4868956, 5486333, 3358981, 5770324, 757260, 8280508, 7044409, 3907599, 1168006, 2720775, 6664087, 3231803, 5644718, 7052649, 4799256, 3568850, 7429051, 1105175, 5304811, 3650174, 1815613, 2640843, 8115575, 2559589, 2356591, 7137220, 3577900, 1932301, 6768823, 2556418, 5696253, 5969922, 4228867, 3561451, 1018706, 3254167, 4583464, 1838871, 6144598, 4803200, 1350593, 4673289, 3056202, 8022786, 2108074, 7011624, 2721083, 921786, 5488784, 5391012, 4853305, 1530682, 5034814, 4738978, 980082, 2142703, 1081476, 6618148, 7642423, 8199177, 2433260, 5146648, 3327993, 4912906, 2341023, 5516987, 1731669, 7325564, 6091134, 2151067, 6250345, 2122742, 7838557, 2212290, 77283, 5755893, 1848073, 2338603, 7979592, 325507, 6204273, 672900, 8286658, 3506648, 2304161, 2600966, 4085952, 8272204, 1701937, 1345748, 4039812, 6324055, 5971923, 1424390, 537097, 25133, 6555649, 2978522, 2908926, 2705280, 5905685, 192790, 1718596, 4829328, 4749325, 4006797, 5895057, 2841282, 2897179, 7328882, 3800821, 5569747, 4303259, 5100988, 4926991, 3159362, 2012950, 3107380, 4171473, 7238795, 1307102, 6318211, 5573980, 5972942, 5475298, 2949982, 768498, 755622, 1101003, 7547127, 7134264, 1746475, 3135561, 7822619, 7756816, 2975015, 3043018, 6278447, 1068710, 1923466, 5402567, 5863669, 2067185, 2141560, 766277, 1197154, 7698951, 4263338, 8347598, 4094660, 57322, 764577, 2342424, 7288869, 2766171, 5014574, 2916582, 7099545, 6014113, 2894218, 147510, 456445, 4967372, 2653805, 4077958, 6616736, 5733628, 7939204, 1738532, 2604714, 5598485, 7814931, 5350288, 2920940, 1508954, 106263, 1763058, 96765, 7448207, 1673518, 4350710, 4737780, 3273607, 2484428, 2451107, 995118, 2388633, 2702217, 6740080, 4563890, 5427169, 6878681, 3714471, 589067, 6625361, 4987907, 2920346, 5817314, 6249538, 6156545, 2366813, 4040640, 6129527, 7607252, 2882841, 6965097, 3968827]], +[[1250521, 4914661, 3956311, 304150, 1808420, 6170884, 4896688, 7569431, 6368685, 5599167, 6795675, 4292470, 2230677, 7633465, 2348413, 940116, 4197286, 5181628, 633589, 3734563, 888025, 5877099, 6912313, 3225327, 6168885, 1398850, 1260883, 2529837, 8871, 4657687, 3154945, 3891835, 4044599, 1597732, 941904, 1226071, 5828122, 188477, 1812902, 309821, 3058862, 7881988, 6717771, 8085074, 4817867, 6522016, 5894563, 3063915, 17188, 5420681, 4378541, 671435, 2546654, 1633532, 7378333, 1546991, 8290543, 1901423, 6940229, 3737986, 6558717, 2350480, 863912, 1170733, 6730828, 509628, 5744393, 2164437, 4843824, 4444118, 5865494, 4538355, 7650974, 347132, 8076471, 7353549, 738256, 1573735, 5040738, 7545240, 53326, 7286109, 601174, 578330, 727880, 8107056, 7822019, 8280943, 860141, 6654304, 6215871, 7093700, 455064, 2220824, 5904819, 4669190, 604607, 6715927, 8152756, 6500941, 6829124, 2608008, 938444, 6678466, 8000825, 6170351, 5107097, 8289501, 5952719, 6842136, 4952404, 3096467, 4858456, 3622324, 7957037, 2316384, 1254244, 1750463, 4730756, 4371115, 4043479, 7024431, 5274554, 206505, 873873, 3135298, 6585393, 1752434, 5220777, 4886195, 2226409, 6458321, 1794860, 1607596, 308189, 4035096, 2446644, 6945980, 867185, 533349, 4108847, 5508751, 41313, 4773383, 184836, 6523691, 7853447, 6367620, 4301343, 3127986, 635037, 3733509, 3790433, 1228502, 10727, 6424167, 3821829, 2497613, 3611480, 5177044, 7068318, 4068346, 7265964, 6602253, 2580175, 2659637, 1671411, 7896097, 1390867, 1465099, 6412807, 4846411, 3058749, 3751032, 870722, 6547110, 2921172, 1819100, 4777710, 7203515, 4542572, 5127533, 124634, 7114833, 5110276, 6830038, 502569, 5970676, 3315504, 3756423, 1475614, 7803568, 6215874, 2489806, 628473, 5895680, 1324931, 8005015, 7919696, 4665338, 2107062, 2721343, 4347300, 7521310, 6004717, 6845564, 4160645, 6416432, 2694617, 7374477, 5565378, 3615914, 6300703, 6214750, 7414747, 6636766, 5236917, 1383523, 3071592, 2927893, 4380628, 1130080, 8327431, 3627953, 2388826, 5835976, 137133, 2504395, 7013150, 551102, 3960135, 450100, 1465251, 1862173, 2150067, 251808, 135884, 4048771, 835819, 407676, 6791818, 4630958, 4748100, 8373532, 4385037, 876026, 7199354, 2730815, 7368818, 332800, 3455059, 1855042, 7181968, 4749469, 3276030, 7493616], +[7723786, 1986439, 5167384, 5129199, 5986250, 5843946, 2363491, 5431901, 5836706, 1548222, 5312317, 2608992, 4175032, 5499437, 2380595, 1418505, 1681347, 3361875, 2502457, 5927211, 6532917, 1722151, 5506086, 8156520, 1833901, 8337805, 54942, 6907445, 3041590, 6775081, 7689834, 1112730, 6089735, 4427719, 3986338, 3666144, 2884735, 885358, 5929704, 1568826, 2843111, 2031425, 4944157, 3150457, 4761517, 2340867, 4804268, 5239327, 1582801, 8077184, 2409928, 5998099, 1643581, 1506376, 1555792, 2763346, 7551387, 4124739, 2420905, 3917803, 3408958, 7483458, 6642263, 5472650, 3548981, 5631632, 2459935, 2594235, 3737163, 5555506, 239976, 1909749, 7707760, 7819175, 4955017, 5660349, 1852543, 5542733, 4395805, 2541381, 671357, 8061464, 4632161, 8084452, 2521347, 7340554, 2191944, 7157303, 2893221, 8284036, 3680207, 1881790, 8048710, 7291868, 8099313, 522341, 319805, 2136804, 2022349, 2492478, 980679, 1292653, 3526436, 1421233, 8356279, 1350398, 4496600, 4087872, 5451796, 7787515, 83947, 420963, 6441117, 6235876, 114846, 6033746, 5881080, 2946885, 282160, 4141534, 2960904, 4476822, 3944605, 1555692, 5655704, 606960, 2806244, 7154700, 3314822, 8038635, 3970295, 2013060, 7843291, 3586336, 7516901, 6989869, 1849847, 1102909, 4391909, 4341038, 5265586, 1963810, 4752051, 6719792, 1518053, 4097171, 340894, 1709789, 6291899, 3861046, 8189247, 7533039, 1084567, 4838401, 5385028, 5124206, 4872182, 1422365, 409212, 1779736, 3736379, 1379753, 585809, 5144178, 1707854, 1258045, 3077614, 226126, 7707359, 2651632, 8314640, 1538874, 7650980, 7900836, 7166545, 5201702, 5754699, 5452038, 1822486, 3089098, 23479, 2411462, 6071592, 991129, 5024374, 3154941, 5895839, 841184, 4841739, 7275841, 2484713, 672514, 5422246, 895173, 3758110, 3531791, 5759418, 3986745, 1493773, 3352426, 5483284, 6434390, 7281801, 5534272, 1076227, 3186270, 3556199, 7837551, 3483822, 1647286, 801830, 5008096, 4797599, 7660617, 1680182, 3901719, 3403778, 5608267, 6310954, 7247455, 7963819, 3608211, 8358323, 3601713, 690378, 1865087, 343295, 78952, 6322561, 2237835, 176870, 4925674, 5296341, 1078801, 7218621, 1801092, 2226042, 629470, 3708705, 1252749, 3856157, 28744, 5807092, 5947434, 6699157, 3645627, 4134974, 7369092, 5762212, 869676, 6000296, 2144590, 3671731, 2868805, 5560276, 5729186], +[3975431, 4948822, 763025, 65789, 4414616, 6756589, 7422492, 4171291, 3197578, 4422295, 1518670, 8127993, 6088136, 2061394, 7026758, 3450526, 327492, 8192319, 7060189, 4417964, 636452, 7416154, 3022659, 6488427, 1466493, 4040701, 7594229, 3813765, 6603185, 6483726, 3489088, 616672, 2987084, 6473467, 2838705, 5712190, 6995424, 7169136, 3901932, 500731, 4523292, 3587392, 5666900, 6379705, 6194988, 1364979, 8264532, 6150681, 496511, 4971422, 4044652, 3106289, 667489, 75218, 2919672, 4091625, 4361129, 2889576, 6306681, 2129137, 6146160, 4851695, 6254983, 2321029, 7541271, 11430, 1613832, 7839761, 706482, 1343049, 7067, 1561107, 6109439, 2628540, 5537288, 2656321, 2493023, 1732303, 6494908, 6920116, 5072570, 2460893, 3114078, 5728547, 4525953, 6099069, 7371451, 5016200, 5135550, 2398642, 6079257, 4375107, 1487911, 192899, 6437836, 5747514, 5262209, 7739127, 1193296, 3522141, 4386115, 7974882, 2327045, 1822958, 2705572, 1201582, 2684857, 2744602, 1298710, 923635, 4596572, 580899, 1412398, 1840073, 318606, 7194574, 3791402, 3092672, 571145, 2923260, 6141519, 723175, 1621410, 5887665, 3015737, 712414, 2809743, 3143293, 3098120, 496597, 1667892, 1200331, 2957629, 218047, 6742990, 2416117, 3499071, 8127702, 3072734, 2636835, 4802538, 3797170, 4147332, 4599309, 2168363, 488328, 7769689, 4730130, 7440460, 777040, 2512705, 3901243, 4725457, 3243804, 3523967, 1922704, 3583958, 3584608, 1443973, 763019, 3926101, 2467018, 3753960, 5205545, 2408814, 3890817, 4678757, 2422162, 5762203, 4420537, 4728893, 1736897, 2215484, 7291610, 7589211, 5336290, 2015100, 3723806, 5041412, 3489590, 2674858, 6616899, 3597229, 3359974, 3603425, 1199764, 7444555, 4138384, 5974832, 3585020, 7306856, 667733, 6654867, 7369705, 3505879, 6246192, 4153491, 7083579, 3394892, 8123235, 4169877, 7212789, 4753205, 6262295, 5558100, 7045282, 7022381, 5482237, 6598016, 7027625, 8087538, 8014063, 2717139, 6481772, 4351022, 6083588, 3758705, 6210218, 21702, 2517591, 7788963, 409959, 4108038, 4024168, 2410576, 4343751, 6800111, 7426274, 1297907, 3162456, 2935484, 2392072, 3660222, 7345270, 7620665, 6390632, 7840479, 6726748, 6545381, 8116470, 2125240, 1244667, 7438344, 4590609, 8297936, 6715183, 1929018, 342968, 4187636, 6167731, 485377, 8366734, 3443058, 3061628, 5999351, 2578700], +[2372094, 5397346, 7224234, 4647690, 1380723, 8020559, 7654057, 3062121, 7027898, 2226550, 4801860, 7819970, 1451714, 5809247, 6771665, 7292397, 5633880, 5755388, 6298762, 241822, 3093555, 5288614, 1200449, 4057770, 4010560, 6091691, 2411704, 6690184, 24808, 3290777, 3330515, 1500509, 4934671, 8298145, 3752881, 4385658, 3493371, 2594776, 2532073, 2021125, 1907527, 1111563, 8121148, 2949828, 7276406, 1184130, 2966417, 5332728, 2270445, 7228250, 7719894, 7951793, 2504903, 5384899, 3735175, 2956435, 8243568, 1200863, 233943, 5331856, 140296, 8349564, 6264093, 214046, 4442726, 4765155, 6995858, 6869843, 4904125, 6406765, 5976151, 7326691, 6316510, 6195709, 8217547, 3269135, 2505267, 672193, 1400606, 522548, 3843656, 5824902, 1186331, 1919520, 2187381, 2297754, 3394597, 7199550, 1416201, 6836040, 3458096, 2459218, 3201773, 6079244, 1735371, 5859952, 2380644, 4190148, 2763549, 3016070, 2357671, 3388458, 4643918, 5488121, 6423039, 4901896, 4218493, 4508152, 5175428, 3443569, 1644332, 6743827, 4643699, 5994407, 2672475, 7509641, 5789301, 516721, 6607249, 5390605, 7436402, 2274185, 4222038, 6389618, 2597747, 6287010, 5708276, 1408003, 2148485, 5344525, 4019942, 5614433, 3270875, 6625112, 7928832, 8268274, 1203449, 890712, 958002, 7110952, 1514749, 8045792, 369413, 3321235, 944235, 4068640, 2858621, 5609734, 4226436, 6302302, 4468522, 3295654, 8295655, 239387, 209353, 5667091, 7875188, 2311537, 1773236, 3554355, 4935697, 7464904, 5137013, 7192813, 1342904, 6440806, 4986357, 3913888, 1866355, 6035857, 7174788, 1413502, 7948842, 8344498, 3961707, 3313637, 7275853, 6360175, 886233, 3682457, 7803874, 7738724, 3862360, 7236074, 1812187, 4543661, 463956, 5840977, 8362107, 3001281, 873843, 6328285, 3972329, 3574178, 6964901, 5123406, 3555370, 195722, 2847001, 3331011, 5596729, 4561019, 686072, 2401930, 4893025, 4659334, 2723055, 1913031, 6963739, 3143281, 2391048, 2476051, 7447234, 627228, 3371897, 4251975, 3317739, 1839326, 5126002, 4199130, 6664575, 6940244, 4893432, 1253235, 172273, 6787670, 2320347, 2982261, 6942603, 4837322, 7198513, 7290153, 2404245, 3576506, 3725220, 3237445, 1428908, 7948567, 8113739, 3796587, 1239308, 2266244, 8136747, 8058820, 1733802, 651103, 5286921, 2158029, 2198421, 1145401, 3542003, 3761123, 1871601, 2807334, 475599, 775870]], +[[1286566, 1892857, 7600279, 2094394, 3830016, 1410580, 2187758, 1207715, 983845, 6450122, 5787642, 4170645, 5728402, 3347029, 4856373, 5635836, 4279081, 5025224, 7525090, 458210, 8528, 2824407, 4403511, 1454742, 121667, 7059016, 255208, 7606885, 7341947, 8369331, 3140002, 1121527, 7772268, 3280030, 6056826, 4447171, 922549, 6232653, 438060, 1134790, 5847510, 674793, 272422, 7548664, 2090286, 1656050, 3191995, 7929149, 5841385, 1589763, 6507932, 1684859, 2559409, 393613, 4917930, 5866357, 8152257, 5628975, 7764787, 5819603, 1936646, 264682, 3253259, 322770, 2978668, 6972763, 572826, 7385941, 6828008, 365200, 5254467, 5750234, 958015, 1761079, 5871793, 920410, 2725801, 1540587, 3762911, 2479543, 1441646, 8140907, 5767455, 7987034, 4286505, 798500, 5455498, 2465585, 984338, 6823195, 6088289, 4531471, 3119328, 787461, 4466633, 4373545, 7528150, 1326535, 5054034, 3883314, 3334611, 6235707, 5217727, 7555014, 5405777, 922409, 7757515, 5517540, 6864727, 2800677, 7818476, 372203, 3457870, 6644441, 5476661, 4789628, 4659073, 7731027, 3993627, 6787204, 4609415, 4928619, 764979, 797306, 2056368, 3750402, 2750494, 6823131, 3620629, 4116279, 2378108, 4042587, 2047942, 8201847, 6471231, 4238807, 7036094, 4178322, 8103240, 7124277, 4435367, 213797, 1366494, 4757420, 2346950, 4954200, 5178234, 4436863, 4153121, 4014457, 6087867, 6261739, 6133482, 35806, 958315, 1534562, 4135704, 3827386, 6753728, 2235731, 2369747, 8123199, 7884249, 8128961, 392580, 24889, 6465333, 44608, 1313336, 4856377, 3547043, 5382818, 8008553, 1954568, 5174489, 1861350, 2075304, 7487212, 6490783, 7708676, 5183968, 6756258, 450512, 5952302, 7005617, 2107318, 4335687, 1911349, 2708213, 367782, 5483115, 3066429, 2700, 1842837, 729992, 3664833, 2670527, 3734899, 2402851, 5662899, 5085488, 3815157, 1437075, 755647, 1187904, 3012138, 3678031, 7517031, 7810247, 558392, 6194713, 3344003, 3337589, 290725, 1636009, 3251352, 1878557, 2742540, 3172815, 4577216, 3181422, 2625911, 648306, 2947540, 5503827, 1074046, 7394177, 1770955, 6784500, 760925, 5882413, 7977793, 5616699, 1638150, 2322476, 3510936, 3558911, 2130310, 1434531, 1556585, 3011019, 4079911, 7410377, 7751685, 3136624, 2042079, 8156182, 2206915, 2477664, 3357698, 7769443, 238446, 5013706, 6890552, 4298398, 6226006], +[4597438, 1858914, 2048909, 149414, 4881059, 5550767, 3233540, 7590486, 6645948, 2271790, 4936024, 7436776, 1975151, 3365797, 8055158, 6369121, 5167870, 4133220, 886117, 1097887, 1483599, 3659288, 52859, 4920779, 6841182, 164338, 6324255, 2355270, 5928037, 8270143, 6601159, 7650881, 6932785, 4310607, 109897, 253901, 5054724, 1034080, 6860941, 690906, 3615750, 3551291, 3358628, 1064873, 5741611, 1304492, 7985020, 7188049, 3331060, 2969779, 7672962, 3800628, 747425, 2396944, 3519915, 1556844, 1250210, 7292915, 8208532, 4934132, 1499663, 2852574, 3928550, 8144814, 6268265, 5123984, 6494442, 6268404, 874793, 8323509, 7531644, 2753878, 2974698, 8108967, 3314173, 6211937, 1102349, 6754938, 5659386, 5212740, 687654, 4064345, 4950918, 7332111, 6069814, 2962546, 5913673, 6720488, 5083138, 4842488, 4336189, 4565202, 8331225, 8211541, 1929906, 6922572, 3228353, 6162781, 194537, 5519547, 7471820, 652436, 3973493, 3546129, 2146384, 4834279, 7877176, 740881, 3741375, 7377531, 4180008, 3410734, 3080044, 729438, 3434440, 7759605, 64264, 6858484, 1577468, 3517288, 7844426, 3778433, 8336158, 839896, 471993, 1917498, 4214116, 3644363, 469839, 1613754, 23793, 4639432, 2786191, 8104526, 153582, 7869326, 1336389, 5629166, 715228, 2526490, 4672500, 5025599, 430554, 7452759, 3169052, 8023830, 4429010, 3530712, 3818850, 4552366, 1293181, 6806378, 2348334, 6179546, 8143805, 4676178, 6647487, 1129606, 4456050, 5946737, 6969638, 5285206, 8039335, 4333517, 6895662, 6020596, 1927229, 7207897, 6557996, 184152, 6738097, 3015963, 6070270, 2202268, 5791286, 4373362, 7546428, 3437216, 7568967, 7449953, 4525248, 336594, 985871, 7173260, 2419452, 4980606, 154127, 6400386, 1093660, 2370336, 5555039, 1658103, 973950, 7475048, 4376169, 6844003, 6554737, 6706622, 3728803, 6950759, 7059463, 3982715, 8366754, 5184101, 8012343, 4817353, 6819476, 7679339, 2883349, 6917692, 513042, 1148994, 6457310, 6535977, 3839278, 3416533, 7513884, 7945433, 60514, 547721, 5650212, 7935738, 4944070, 4893652, 1028545, 3551093, 7212200, 2314684, 5067894, 4739967, 3725984, 2481822, 5294700, 2061409, 2055070, 1808466, 2945795, 2955886, 4480351, 3961264, 8244830, 4531426, 242610, 7436456, 4492587, 567385, 2024404, 8320861, 7532621, 3606496, 5487212, 1207247, 1326056, 6828627, 8082761, 3988257], +[6415545, 5183767, 3793280, 3140822, 3501151, 4562966, 7366328, 5744523, 4336994, 5186210, 3928108, 1420493, 3675722, 7522454, 7842773, 6099531, 3645181, 3572654, 4756745, 1548390, 5831892, 3920298, 2393044, 6285228, 6441795, 3813227, 3815686, 7862948, 7749338, 5532211, 2664299, 4039055, 4528626, 175358, 4625507, 2489354, 4088684, 8190699, 3142575, 4774643, 576160, 2499333, 5787575, 7232277, 8349918, 4093253, 8020398, 3937728, 8316695, 2405469, 5926910, 2353314, 1059408, 2850163, 3157194, 1399243, 2139366, 195491, 5742659, 5325667, 8265517, 3502570, 2901749, 3938485, 6213467, 8053229, 2621618, 1285030, 1242346, 3173759, 6270555, 7422337, 970439, 1168402, 6272412, 1826119, 3788864, 7553947, 7974108, 4972367, 620046, 7390717, 6030999, 1473051, 1080671, 5427952, 5103294, 3088835, 6670532, 718221, 2094700, 3221740, 1508128, 1709962, 3690983, 6511631, 6612735, 344217, 4786239, 7849594, 3243305, 1574993, 1656797, 3089085, 2423743, 4112242, 2506510, 4872467, 3176304, 7868853, 3417709, 4786034, 3630913, 7336765, 7475827, 3986539, 7035953, 5232408, 5772024, 578508, 5061872, 5996757, 3974466, 2082171, 2626811, 3993370, 6994921, 5512177, 3384674, 2397512, 2580519, 5018224, 2806343, 2922219, 6427676, 5495309, 6643539, 7420731, 2847646, 1444924, 7120603, 2832488, 3257902, 3731264, 3446571, 6009375, 98182, 6507832, 5121108, 1214131, 6463895, 8286949, 1590106, 7196880, 6941308, 4815245, 1522710, 8096049, 2528946, 7056037, 4135040, 7024485, 5451226, 5126487, 4204216, 3262762, 1274387, 8338888, 6275653, 1633021, 446301, 137698, 7030467, 533046, 3111389, 3803015, 291153, 6979956, 8140828, 7675012, 6712413, 7814825, 8355834, 6699735, 8039866, 768856, 1322282, 3762471, 7418304, 2732176, 4523505, 7814750, 3541933, 756240, 4311591, 5329646, 8056989, 6669403, 3868780, 7157850, 208547, 8161669, 5137928, 6732707, 3094886, 7441864, 805624, 834529, 5627993, 7719531, 953493, 4343482, 8306310, 2058503, 2369152, 2490233, 193781, 1435984, 245229, 2348006, 6575035, 5104217, 3645215, 7249841, 5897059, 3241262, 47669, 6141227, 4680518, 6724666, 4736699, 3370815, 6361168, 359100, 2294821, 5308409, 3106567, 7197163, 4895696, 1363492, 7136673, 6618873, 3327992, 4078007, 5204495, 2695715, 5346679, 5306616, 7701022, 5127799, 53490, 605060, 5037181, 4919945, 5031195, 846999], +[7965062, 607644, 2309032, 2362594, 8260421, 7879312, 110959, 2350996, 702703, 7741031, 539149, 5773106, 95166, 3022158, 3317906, 1923911, 6167338, 3046735, 2655534, 525158, 3042272, 5290724, 8189567, 32847, 4107297, 2419793, 8313797, 3766935, 5258815, 6665926, 6696256, 2953752, 7298055, 7006622, 419777, 5241700, 6046739, 2397370, 4716248, 6976785, 7327031, 6419241, 7521092, 961119, 4595176, 6642141, 1427773, 1161820, 4615095, 6154554, 968363, 2387186, 5429923, 371797, 5014040, 4153830, 3395514, 5265524, 904460, 4356343, 883773, 1382843, 2148499, 563978, 2997794, 8285983, 2133341, 239434, 2121782, 6588802, 4767873, 6181611, 8357241, 3062839, 4509182, 4951825, 5033639, 3169328, 5032188, 4195990, 5106194, 2867161, 2557858, 2193590, 7421491, 3629264, 3129173, 5286339, 7256043, 2418304, 2570507, 8127689, 7720454, 2810982, 5571343, 4341745, 4861930, 262578, 2091132, 8310333, 3158351, 1532405, 8367992, 7305108, 4751817, 6950708, 1759001, 4309248, 2674236, 8353450, 6463959, 2698951, 3113187, 4001306, 1311319, 4668635, 7317375, 4621808, 1514097, 4531017, 7226150, 617451, 4396992, 2861365, 1982091, 1729732, 6288204, 2175692, 6069070, 5188985, 4432205, 5383122, 2497060, 4554289, 1915749, 358346, 6377223, 1893901, 2169346, 7147482, 5169962, 4222755, 3639693, 792583, 4650832, 7312196, 3791658, 6804120, 4592398, 6380017, 8067994, 2007970, 107157, 5381554, 5844187, 1480517, 4470892, 7841829, 6309205, 5076529, 5402678, 160187, 6846484, 530182, 4098294, 1878699, 6334728, 2055196, 2844029, 4151605, 3827304, 5852606, 1747165, 1767222, 5072173, 3552028, 3265773, 4890573, 2189271, 7501180, 3216068, 1946349, 2383492, 7739269, 2130294, 5009524, 3651266, 5937084, 6989388, 7927415, 509669, 4717418, 186952, 956923, 7329346, 3990036, 5569359, 2856246, 7586748, 4108732, 3647516, 5392871, 8056427, 1919460, 7745843, 6696542, 4984083, 1299456, 7218916, 3403678, 1720313, 1278490, 4163918, 8290156, 1681040, 707969, 5312310, 4651349, 5336590, 954991, 2452752, 6650679, 3772483, 4861858, 8113790, 4696283, 4604238, 5774658, 1958830, 8199028, 4288958, 5425782, 1709745, 5025098, 1374902, 1197773, 2852247, 2195543, 5307440, 2078658, 7176359, 1922399, 849968, 4134702, 4684560, 2018289, 7912848, 752394, 2308927, 5659476, 7331343, 6640917, 1468151, 7138190, 6826836, 2837496]]] +s1Hat: [[3780472, 8001483, 7484040, 4059895, 7647343, 3434819, 902292, 6727194, 2342222, 4671283, 2590107, 8356189, 3994258, 2362867, 1015481, 901117, 2057577, 3818479, 7514602, 2834012, 2872015, 1117313, 3754976, 4587196, 377034, 3596764, 3558223, 5346916, 4822395, 7541493, 4876216, 8013761, 4619399, 3884541, 7067946, 3288249, 3122674, 3148154, 5724895, 558455, 7148082, 4087158, 2706701, 6414162, 1600947, 6225087, 3488397, 1393499, 3407333, 6615811, 625797, 6745026, 5161872, 641377, 7117916, 1412922, 88979, 761715, 2736024, 844724, 5577113, 3935628, 50484, 277629, 3912207, 2716145, 336983, 6194732, 7956586, 2476195, 3213793, 736974, 7669490, 6591687, 5455725, 286773, 5798834, 3445153, 5264877, 6901969, 2918204, 6158632, 1247106, 1731982, 1224779, 2879753, 7766107, 1737079, 3712876, 1494224, 3627760, 4441196, 2559466, 2586371, 6665468, 3616081, 6369594, 3832102, 7177406, 387632, 5004314, 169531, 4466944, 5727377, 5450513, 1646717, 4314737, 4828468, 7556714, 202091, 573008, 1886421, 7407237, 4793758, 2516709, 1501952, 2912975, 501398, 1910916, 4258279, 6339988, 899719, 492320, 1248493, 627247, 7133292, 2363123, 5442236, 300666, 2307884, 5568729, 2746930, 8088555, 2797021, 6541834, 8353505, 1080202, 3170193, 1653966, 6027538, 5776215, 2476940, 6353397, 2062159, 7186611, 908166, 5273713, 2399920, 7983166, 212791, 158642, 2080870, 7778091, 6087871, 7653873, 3068291, 3471243, 2523763, 548390, 2196162, 1977811, 2079189, 4926090, 318216, 2468780, 7613829, 5752063, 6760760, 2051824, 7980632, 4174570, 6606611, 6314394, 8292559, 2073384, 2315992, 847414, 3481592, 3885108, 5408354, 708414, 1162338, 1920983, 7823037, 4025355, 1623338, 5431531, 108757, 5836508, 2473617, 7784454, 3992727, 1672043, 4791723, 4727614, 4550193, 4790100, 3833476, 2922653, 3293432, 5906689, 1820614, 316721, 6949903, 7057224, 4871626, 2215822, 3892485, 744545, 4575901, 7544641, 1375977, 1859843, 2889133, 3703576, 2985816, 5823879, 8180807, 4092816, 3114300, 4458987, 2094981, 3894080, 3088197, 6630018, 6601178, 457195, 3278540, 4485374, 834323, 5312864, 327329, 3136137, 8220473, 7266614, 2400672, 4409641, 104790, 5571322, 6634357, 146509, 475692, 411263, 3398622, 1722946, 7730545, 5654645, 5628631, 7355926, 5474327, 237898, 1259182, 7491577, 6184739, 301897, 5558578], +[7490143, 2416677, 6018412, 4886851, 4661549, 951995, 1217523, 200620, 4047296, 5752223, 5204483, 629955, 7868040, 5657793, 2519186, 7379324, 6277538, 4438049, 2975906, 941441, 5707699, 7778781, 3615008, 1962990, 397022, 4297837, 8139510, 4455900, 3297031, 977526, 1146196, 7692715, 8363126, 2989622, 7443475, 4686312, 829050, 2159711, 7873900, 7417623, 2355442, 636554, 5247813, 2741442, 1705844, 3349823, 512773, 5746069, 1410581, 4320810, 4748088, 2471804, 5681603, 1889210, 250418, 3375817, 1740586, 7023616, 1383344, 991532, 1386480, 3416571, 2991066, 7295662, 6752145, 399232, 2407594, 4220687, 6841208, 91492, 6385609, 6471466, 5440045, 3581841, 3238400, 1445899, 6591434, 6046404, 4175614, 6242164, 2069210, 6022136, 5396287, 3910328, 6091407, 5263676, 2078083, 8310059, 5899745, 2513494, 6955184, 5554072, 2000856, 3996830, 6460829, 798819, 4659061, 2571223, 3457056, 3531604, 6860393, 7486079, 3619350, 850669, 4037213, 4520361, 4151224, 305902, 5885218, 6147278, 7204562, 6570737, 2112376, 5430331, 3265589, 2035980, 4066990, 7654941, 5581671, 2580931, 857526, 544898, 5132083, 7632701, 1841308, 251988, 6742135, 3929132, 7342560, 4792460, 2584290, 7140337, 2952249, 2139281, 122010, 2950547, 3892823, 1059965, 4169551, 8171839, 3556085, 3444318, 7322197, 6219406, 2499331, 8169629, 1132692, 5614906, 1700320, 6982836, 3240404, 823680, 5894285, 6635759, 4479224, 7911155, 5433574, 957541, 2227913, 5233041, 8065525, 4708575, 1772128, 7019421, 7238940, 243872, 6408013, 2038403, 6415019, 7006297, 2470766, 3510418, 1917510, 4250390, 1146893, 260711, 3796860, 5299774, 1187338, 7287103, 8230953, 3188461, 5463536, 1432402, 4093616, 8168956, 1622255, 1249460, 1500481, 2902430, 286695, 4458792, 8148629, 5732743, 160205, 5113649, 413002, 6974928, 3793222, 559966, 8185373, 1419330, 99797, 2731143, 3156355, 7739043, 5036417, 4723991, 378541, 745074, 4385898, 7883483, 673438, 3077408, 7302415, 7313423, 891988, 2478460, 776200, 845696, 2565548, 3961703, 3435660, 1003929, 2341778, 3250738, 8209645, 5549708, 7126463, 8010297, 3259731, 3710545, 2198832, 567401, 2134515, 1439720, 3070406, 3241022, 5559551, 4808643, 3087692, 1960718, 2966572, 5453411, 8019599, 829933, 2289216, 3900490, 2043518, 5454290, 1292962, 3051361, 85872, 4296336, 6726366, 4339035], +[674988, 7034336, 4666570, 6284494, 4350353, 7495817, 2574693, 7634530, 6913604, 560773, 7663665, 2035513, 3454030, 33489, 5804374, 2874174, 5610439, 8091833, 6640077, 7242939, 5270752, 7301966, 4117641, 8115935, 1367508, 4680418, 8069033, 402730, 2467679, 7109184, 6065796, 6294164, 4995502, 3924429, 7699875, 8324968, 3079342, 7165699, 884347, 819697, 1199410, 1707140, 3377848, 2555184, 4609963, 3218481, 626573, 6514932, 6616470, 6328505, 3682921, 1040096, 7203670, 95402, 2803852, 6002958, 6042438, 5377666, 6782350, 8347385, 7724395, 7443249, 3443784, 2890904, 937760, 5111095, 6032106, 5453636, 6346154, 7363067, 3603272, 7053352, 6013411, 5274369, 1137106, 3636954, 1922868, 7047056, 1581761, 3602368, 3399231, 3453226, 163808, 6440026, 1211705, 1971100, 1468621, 8173986, 7885118, 5982472, 4959566, 8315860, 7446768, 2826908, 5088900, 5464137, 8235639, 2557164, 2901597, 145114, 5768687, 4349012, 4427602, 5920634, 733275, 6456688, 7083577, 6663572, 75663, 5688665, 1824820, 6096941, 7755539, 4467817, 3368800, 4738941, 6895485, 6997885, 2886394, 3687406, 5451576, 8075163, 215371, 6940785, 2573795, 8077435, 7116222, 7411933, 4991634, 1254916, 664579, 67217, 6911772, 885917, 5393394, 6012017, 7032973, 5924484, 3571157, 5979290, 383609, 3918569, 864033, 4196913, 5880771, 5949815, 2469273, 6050912, 26666, 6706282, 3909879, 1063169, 7677943, 8267037, 6681415, 1301326, 1197763, 7954759, 4240836, 2164329, 3752085, 1235952, 1619110, 6882323, 5915963, 7172443, 3316331, 6006084, 5937873, 6581970, 3371258, 7161055, 382992, 5686877, 6457770, 5975337, 7045337, 7957289, 743890, 2808804, 3631893, 2298159, 1165304, 6832217, 7111225, 2557734, 1989655, 6470484, 2538786, 1993041, 4911200, 1330206, 3068161, 1245204, 6838466, 6607252, 2487651, 4145660, 3779867, 7249278, 5871860, 3664539, 5969912, 3067353, 1147974, 6680537, 1141800, 3623057, 8026219, 7205137, 5985239, 3164129, 175923, 7559038, 7518272, 8337204, 8070357, 3553177, 4044405, 5602329, 3010056, 8308691, 7700438, 4058410, 6874480, 1382170, 3889748, 2678524, 5606782, 7329873, 5603777, 5728954, 750133, 5174557, 1922845, 6772490, 1452767, 521065, 7514917, 4695096, 474962, 4229374, 1556080, 4599836, 7671549, 4698146, 5912621, 876442, 4024696, 4378664, 6847307, 1802246, 8105670, 561439, 2771671, 7736039], +[4406566, 5954670, 7130704, 1917294, 3030143, 7617234, 1177455, 3376554, 5350376, 3264614, 7417136, 2215991, 224662, 7250601, 4335013, 6761466, 1317099, 2345440, 532480, 1936264, 3490566, 4477507, 6489169, 7856679, 2334618, 4227774, 5456976, 7027353, 5407026, 3288707, 8118040, 7449171, 225176, 8040574, 6272821, 2398797, 2780133, 204627, 3446811, 7076249, 1187712, 862083, 3326208, 8146515, 1114850, 5753622, 731798, 3779457, 3831158, 1430783, 2513220, 2227479, 167927, 7974858, 5805902, 3123388, 2004267, 2152391, 7854303, 5447621, 4083283, 1738812, 6898381, 3744485, 4510705, 4672465, 6855374, 3587089, 2326402, 5865435, 6602623, 6329014, 5445784, 5668496, 4762211, 7779789, 6138532, 5987389, 4403569, 7627046, 1438624, 1401790, 6351369, 2290148, 5189700, 7675560, 4914961, 6880208, 8122871, 3981786, 1687890, 644941, 1348864, 2182124, 485253, 7433796, 3701459, 6699727, 5151946, 6275560, 1613443, 5865956, 6704180, 3562312, 3579947, 4484573, 5558222, 593306, 4613736, 5475088, 8257767, 2766461, 3475092, 4556941, 5323282, 5536148, 3179620, 5830119, 7889988, 4569687, 1568291, 960391, 3135612, 2252202, 2871417, 5931358, 7920019, 3081081, 1684886, 764859, 8089522, 5837179, 2177247, 7686882, 5091120, 5099785, 680534, 7120158, 6648810, 7071882, 4428841, 4762358, 6674688, 2754810, 5114776, 4375489, 3786554, 1877104, 2856860, 1944281, 2010832, 218760, 4923418, 4006565, 6484528, 5971839, 7732666, 4074071, 6628035, 3640244, 7722617, 7085326, 6277964, 1872886, 1259127, 4242358, 5165474, 509652, 2278217, 3168934, 4537649, 3785635, 2240631, 427791, 5520927, 2385656, 5816074, 2649992, 7274109, 1660400, 2703091, 5460052, 8015214, 7296887, 85420, 2860224, 4566975, 7338559, 1022184, 1962560, 765998, 8257322, 2195050, 6470013, 2682354, 1030994, 2478119, 3041681, 2165385, 4745595, 3807511, 1337552, 2245481, 3559287, 3406619, 238984, 1552865, 1081564, 4824348, 1632127, 7131467, 1694325, 3573924, 3554488, 7849409, 7111869, 3638176, 921506, 8328651, 1011245, 68065, 1353114, 5302971, 1256712, 7183518, 1869687, 8022197, 3454416, 5189088, 1565664, 6016864, 7591504, 1486340, 3837498, 7986965, 5188466, 7272041, 4088314, 4783331, 2517289, 2438297, 3385645, 2616900, 5443176, 3603790, 3090236, 8219112, 3585732, 7244020, 4346380, 5936094, 3491793, 1931361, 2226264, 31751, 5835021]] +s2Hat: [[3629686, 4323385, 1136763, 1892621, 396580, 4015673, 7506969, 413433, 3429836, 5013117, 5164433, 3162170, 3109721, 7122983, 2862134, 7835515, 3443139, 1216071, 4400887, 5301233, 498101, 2585222, 2724554, 870133, 1724740, 6181750, 2638389, 3361347, 5690056, 2060513, 960108, 1371185, 4742391, 7638652, 2949217, 6369537, 8155223, 7476791, 6834454, 2136536, 4460144, 5567329, 2254921, 680146, 5002506, 6197174, 7382619, 1946922, 7294370, 1275504, 5855339, 5375244, 3839455, 4745604, 7842326, 6857672, 962116, 5966114, 4272168, 2605526, 4358797, 5220736, 101184, 5612470, 7489244, 375068, 7914536, 7747344, 3403130, 7667289, 818728, 6087460, 4501742, 1147280, 6654387, 2486774, 1936421, 6049872, 3272855, 1327320, 1663066, 1933720, 4236504, 414102, 1032279, 7158786, 3519705, 3079904, 4727731, 3749441, 4717070, 974543, 7625923, 8203239, 6855725, 4839557, 4636518, 710879, 2058559, 2855127, 5456922, 6375973, 5481394, 3669129, 4384794, 2627025, 1052271, 4520173, 2998508, 4998669, 5892011, 3466581, 6169517, 467203, 3368917, 1942219, 6836643, 82898, 6425499, 5889372, 7510294, 6513571, 3595486, 8249639, 3793137, 4476796, 7126137, 2701903, 3175828, 6849692, 266465, 5171458, 2081437, 3990636, 387543, 3151076, 5721073, 1608216, 6814281, 3252209, 6505892, 6013787, 3794590, 5856081, 1438447, 846044, 5197889, 5210625, 4411171, 5507389, 2384182, 3775287, 6701082, 2319557, 2079773, 2459927, 7807647, 6795612, 6538213, 3337476, 1097662, 7927629, 4017477, 8047574, 6153612, 2692562, 6113902, 2599359, 2267298, 1406501, 2204553, 403410, 1967242, 4765186, 457501, 447580, 4273774, 88082, 4816897, 4703968, 693466, 3898874, 1077498, 7827138, 7262745, 6116800, 7413546, 545452, 707694, 1590633, 3436405, 2002147, 6609679, 5962106, 7488017, 2185516, 312439, 32631, 907151, 8196157, 382968, 6025804, 4176334, 2333455, 4066462, 6965699, 2927417, 1622550, 6294377, 4791100, 7012608, 3656498, 6856868, 3962455, 402808, 7062678, 2772150, 7478089, 2126815, 1056175, 1561116, 2464831, 6137266, 1129124, 3374878, 3238515, 2234866, 3115110, 7546753, 1452741, 4969563, 315646, 3093038, 1356114, 2569767, 6228689, 7254710, 2164300, 4874069, 5824044, 4324985, 3713315, 3483527, 3367275, 5359290, 6665937, 3118106, 3852266, 1616532, 1361275, 20968, 1351100, 413351, 6436321, 6502602, 1049893], +[1691622, 622196, 3664387, 1888517, 6954472, 1664504, 4698479, 6040992, 3462971, 8143638, 1775563, 4512773, 4656917, 1689760, 1077062, 874302, 1811691, 3362096, 3871642, 8298838, 6348712, 8194682, 6008666, 3759777, 4142541, 5265378, 7251827, 3658940, 3184186, 6689508, 4594372, 6300187, 2909893, 2801071, 5100854, 7803908, 1230071, 3155806, 2632709, 6090515, 1926220, 378933, 2349147, 6243904, 6585648, 5503971, 1351042, 2835369, 7224695, 7495821, 3914337, 1644163, 6423757, 4526416, 2510355, 2382274, 1910502, 4607825, 8149776, 4556231, 7050873, 6338060, 5492615, 6989335, 654504, 2560286, 4932358, 3441552, 6296675, 6832338, 6649419, 931795, 5150478, 6993776, 8244494, 419449, 5596276, 2586641, 3385680, 7353149, 7051473, 6821530, 769346, 681513, 263013, 7926847, 6361186, 8224351, 47881, 6913600, 6624965, 4356878, 163232, 6340185, 2751966, 2876565, 6927242, 6697439, 7976350, 5200635, 7208686, 646420, 8232672, 8122606, 7328552, 2301445, 8162505, 444080, 6364875, 3276357, 7509617, 7886229, 7357945, 339801, 2124618, 1976232, 5453730, 5520065, 8371749, 8292537, 5976407, 4749215, 6547455, 1519091, 4035189, 8140748, 2678327, 2779932, 3361759, 8257301, 6302450, 4258721, 5054534, 4656021, 802431, 8049352, 7826122, 3601955, 5620786, 7786012, 1887101, 4835126, 1433879, 86004, 7392579, 4524221, 4796530, 8137047, 3125570, 4067398, 6317304, 3002343, 5052937, 4283099, 7712279, 1094187, 1824099, 1797466, 3955250, 7401265, 7320241, 3177813, 63966, 6441524, 3839732, 1063559, 713838, 142135, 594101, 4496270, 7825121, 886744, 5504682, 2143428, 5630395, 7151912, 4138159, 3563701, 463247, 3944431, 6605573, 1987470, 1324001, 7753662, 4383529, 6190942, 8132988, 3584329, 4280915, 858036, 8035383, 5732339, 1434416, 287384, 252126, 782056, 2538480, 842510, 814422, 5419409, 1181197, 474845, 54042, 2083464, 229363, 6241425, 3568733, 3734372, 6532970, 313655, 6933746, 4758179, 536432, 4613241, 3790574, 812038, 1969549, 7205109, 2359167, 5558347, 4752827, 3409663, 4464066, 6587902, 7623981, 6264846, 1826243, 6189711, 6968541, 1516166, 2478154, 5552249, 3881023, 6713424, 6374859, 8367840, 4056049, 8373121, 6784334, 3702890, 5909442, 5660540, 3809143, 231023, 7926503, 6895537, 5783716, 3641055, 4260499, 2046925, 7901106, 5761837, 4220890, 4710257, 4184090, 5917947], +[1613043, 4987276, 7287169, 6380375, 224343, 5098268, 1770771, 294873, 858281, 2279584, 6969794, 4732503, 6092736, 370529, 5329783, 1832892, 2840003, 3583275, 4567554, 8072429, 4530929, 4860054, 4452789, 515012, 5294495, 3431611, 3406884, 2662023, 3080812, 7380928, 4242848, 1478978, 2453443, 2447485, 2895332, 7420193, 7747439, 4527517, 6015467, 1042476, 3651780, 6952557, 1065041, 2253056, 2095906, 4090301, 6078012, 7985353, 2363403, 800454, 4465647, 2719060, 7619551, 6295180, 2090922, 6454370, 4980179, 182173, 959630, 413533, 5999117, 5054129, 3740388, 5956218, 7915133, 6698033, 539560, 6872443, 5019135, 2630774, 7425408, 7445534, 6295712, 7967375, 6940082, 2761668, 5601996, 1933249, 2891563, 5497365, 3655132, 4567675, 2466133, 1278977, 4299683, 7427231, 7454645, 1887621, 5149468, 754344, 615225, 6493646, 6056725, 6615436, 2632994, 2699135, 3511640, 7985562, 6112319, 5514548, 7398766, 1076887, 5552486, 3896541, 7582829, 7126828, 359291, 3749763, 6613060, 8340897, 4372312, 3354401, 5824476, 3070532, 5781978, 6872541, 5004060, 2147061, 230113, 7420173, 1646934, 4143655, 4253389, 7480166, 7185077, 4168398, 5178897, 6003205, 7500345, 6404284, 1054591, 8024280, 3811621, 7561174, 3935931, 5176090, 2617511, 2835103, 1574019, 5572463, 2553209, 4776359, 8316177, 1058117, 1697693, 45248, 4235182, 1961276, 746255, 4287214, 3938349, 6306148, 2516149, 3268835, 4191863, 5464751, 6151910, 782095, 3003856, 4607359, 5800052, 2644955, 3953084, 3355452, 767646, 404803, 6037201, 1963388, 7778333, 3140878, 2378529, 7813196, 6268369, 341862, 6750932, 4270396, 2422273, 1991277, 4570180, 2214659, 3514429, 3630794, 7275831, 2623346, 1192463, 8027765, 8316720, 1509238, 7256714, 7276158, 6939242, 4014977, 563567, 2549646, 6868081, 2811058, 3231489, 2867520, 4581862, 3068174, 5779279, 6186823, 964592, 5728992, 1374741, 3023510, 6891413, 4702750, 2862172, 6641381, 5927817, 7951816, 4009687, 1282811, 6851720, 4713465, 2023930, 3457495, 4937259, 5442523, 7986282, 4031091, 6269724, 3775426, 5209053, 916666, 8198372, 4632399, 6185595, 7881527, 3383221, 4466245, 2219391, 8279846, 1163718, 3392028, 5082690, 2825241, 6003644, 2501885, 7325119, 7018932, 307682, 760268, 2774742, 7010186, 6272820, 4450402, 3417420, 387535, 2009676, 4408645, 7297873, 2501695, 7938805, 3046826], +[1302014, 5489441, 37061, 4413680, 1025518, 6704923, 6704959, 5549932, 2780863, 1049739, 364807, 716450, 5247856, 63141, 3739196, 7655028, 4955270, 560276, 1132518, 6450351, 4382245, 125445, 6088857, 298074, 8110838, 829829, 6862554, 2816576, 2774253, 4977013, 6560054, 3485187, 6556554, 6229476, 622238, 4242717, 2759508, 3597811, 8257265, 3244837, 694917, 3181610, 7061554, 7327015, 3277887, 7639742, 2118228, 4471783, 7662959, 938128, 712366, 3390440, 3116076, 2402942, 3126576, 3606055, 1169409, 6400788, 6372642, 7859353, 1695220, 1626092, 6871291, 6770596, 7560733, 890451, 7964985, 6406507, 2802658, 5345617, 952819, 6599201, 3084031, 2587292, 3985672, 4756068, 4301312, 7190463, 170630, 4088476, 6556223, 2210718, 2386583, 8297733, 1814972, 4237486, 8091625, 2695348, 6311070, 2153144, 7797042, 50058, 2807042, 4881327, 7017041, 4039484, 3060995, 634744, 4094216, 4226018, 6186514, 4799778, 3495038, 2798081, 5530670, 220156, 7500716, 2857934, 5779706, 800751, 4981923, 4785414, 2480083, 3445496, 7885616, 507823, 3637938, 1268943, 1842093, 6959192, 973199, 3808746, 4058101, 1158543, 3347492, 1406565, 5132126, 5891955, 4912986, 2032677, 6002485, 3256250, 1440529, 7792749, 2393309, 3788672, 2989968, 4233945, 7643371, 671725, 2650783, 1762477, 746404, 8228286, 4298910, 5213540, 7256794, 5828525, 4862671, 784590, 5705017, 7451001, 2979884, 1806141, 6842084, 1889482, 2340791, 2110546, 7905189, 7512049, 3897685, 3091660, 4300579, 3452896, 4116066, 2499722, 6158506, 5017498, 4988476, 4281211, 2272670, 6955297, 729777, 5550944, 3962225, 481652, 8086715, 7729957, 3465930, 4519395, 14947, 915182, 4928557, 4620652, 1987855, 2083154, 8170164, 1598313, 217470, 934749, 755500, 7447507, 5858205, 44613, 8185089, 7134059, 170867, 5532125, 3312329, 1955903, 6850031, 8300812, 6784704, 1505379, 6822615, 7954525, 2946832, 2294136, 2844340, 232653, 3179833, 1735975, 4714499, 4733889, 2726486, 3889463, 153793, 2410578, 5560746, 700134, 5025806, 4050594, 5162649, 2528856, 6713599, 1862416, 5318308, 2908611, 6873560, 2803087, 594723, 1455568, 7644043, 6053464, 618839, 687194, 4904332, 2828979, 4029209, 6649796, 7245539, 7499495, 7224351, 6137411, 1383318, 4042123, 7563872, 2476145, 1620406, 131159, 5958855, 8375009, 6363364, 7791554, 2832657, 101718]] +t0Hat: [[610973, 5626726, 3451877, 7487350, 6292492, 6530640, 1903374, 7333475, 6327440, 7331451, 1406104, 1022202, 8154710, 6372860, 1693340, 6923492, 896656, 1701499, 3271025, 988771, 920893, 3030485, 4017370, 632660, 5527856, 6686272, 7217499, 452753, 6832027, 3041629, 3192632, 2914297, 979062, 7087365, 5358512, 412204, 3619931, 8339506, 2456709, 6754473, 446411, 4728744, 3169238, 95839, 8012760, 3483239, 845224, 7748375, 6267498, 2439012, 6236957, 7878754, 4875606, 5195378, 3251399, 4477589, 4615855, 7890813, 6483850, 4509797, 2918113, 2712377, 4355987, 1055428, 110636, 7141710, 2317624, 6675102, 5884565, 1673566, 4873347, 6250376, 2182090, 1149918, 7440641, 475522, 173090, 5322016, 978828, 1380713, 3044969, 6148659, 7024237, 1630187, 4159540, 2548121, 7088777, 1014204, 7662153, 4338182, 6435686, 5706354, 784863, 35521, 5515223, 3103110, 6694045, 6904720, 2140778, 6497909, 3561026, 4447628, 909997, 3906225, 1544725, 3504108, 3184159, 4810298, 4572346, 5328378, 7439395, 7798535, 7497196, 5381328, 8133611, 6949421, 5442246, 52152, 5127248, 9718, 3498321, 7822138, 899431, 4964109, 5379974, 8215181, 7511854, 5216915, 3151607, 8243471, 7739801, 3032075, 6554720, 2080098, 4844823, 5309640, 6603077, 7215912, 6624323, 1107886, 5733323, 3085663, 5718473, 5936425, 1014409, 136365, 901138, 231573, 3964639, 4710826, 1013296, 1397957, 8090348, 5930648, 999984, 2725682, 4222660, 4691619, 5350249, 4037080, 7446237, 3605175, 6784989, 7578796, 3117855, 146989, 463372, 3211034, 5636977, 5395207, 4443525, 2705180, 5568984, 2840343, 6364721, 5740332, 521361, 4390220, 4167131, 7899805, 7808015, 1235522, 5870762, 966474, 7775834, 4097522, 2986262, 1771870, 6395676, 1876404, 2304501, 5858846, 2687399, 6889063, 8354122, 3427164, 2038220, 424259, 8287978, 7214200, 2279422, 947812, 1398450, 5208409, 1933295, 5440170, 2219265, 1906405, 6331323, 707561, 294365, 7933297, 1900250, 8107073, 6791100, 5898220, 7910271, 215132, 7933668, 6935701, 7110514, 1443878, 7452136, 3902668, 3501479, 4845524, 1197180, 5233294, 203624, 7231585, 1094477, 7025176, 1002730, 4165923, 1600550, 3390574, 4632360, 1078389, 5622929, 4087339, 5481056, 3661222, 1988419, 5518398, 7883810, 3957233, 4870771, 5410125, 1814256, 4455678, 6279467, 2114073, 5403492, 1384433, 7756678, 1807232], +[6938612, 1405233, 2812565, 2424669, 85312, 2801824, 4388851, 4016848, 956731, 3276110, 1543239, 2157804, 7522223, 3984456, 673385, 3865973, 38925, 2806610, 6785343, 5504465, 7783692, 5745501, 6848689, 3213630, 6973764, 2842810, 7728160, 1873723, 114233, 1639870, 7891136, 349761, 766069, 3974782, 799993, 1278412, 7419390, 320879, 6191130, 2411826, 5688646, 6504894, 7785510, 6945250, 7309125, 7820053, 2686547, 3771393, 1497002, 3405460, 2163205, 7830535, 4803241, 1709051, 1845242, 6219461, 3089788, 6000718, 30358, 4767261, 4741154, 6118959, 4615620, 415331, 8146484, 5481181, 149372, 3281988, 781913, 2517023, 5997370, 7926143, 3829380, 736831, 1853117, 1485473, 7455217, 926908, 205221, 2301763, 1885414, 5401882, 478821, 5150059, 8095709, 6141562, 6254393, 4266386, 1103322, 5419137, 1407248, 4637589, 493250, 2198799, 279709, 4119382, 2736000, 25225, 6778957, 7192480, 5821392, 341730, 3808995, 5870199, 2919084, 6384753, 8317223, 2687241, 3717188, 7985333, 1828290, 795856, 3732213, 501745, 6474185, 553276, 4788013, 4175543, 3670893, 1885544, 2743145, 3507549, 8317223, 1986501, 5034000, 7181625, 1490799, 3729491, 7606359, 2183576, 4193468, 6376589, 4431806, 1333519, 4342017, 2322773, 2706831, 5962261, 6157802, 4190480, 650267, 3883194, 3967516, 3526324, 3475501, 3596619, 978931, 2386804, 6112728, 8153934, 4633100, 4249068, 4697541, 953870, 7172816, 4992392, 2100132, 6901762, 1792893, 3950509, 2213669, 7948190, 5933192, 4629147, 2730772, 7571128, 1580500, 24476, 7340231, 4362446, 8270016, 7989966, 6333163, 7351937, 6685981, 977238, 5930967, 265026, 4945754, 4951897, 2358026, 5149731, 5481552, 7667962, 3889394, 7595917, 2638206, 389890, 2301856, 4810100, 6144314, 5065428, 6866152, 2553458, 7103810, 6212588, 1086303, 7746640, 6263621, 6360252, 1753684, 7825173, 5776217, 4083339, 7557370, 6532508, 2933923, 5280828, 6127716, 5345262, 5408466, 4922315, 2766285, 3961457, 2963203, 3231129, 3971204, 7460596, 4070262, 3611414, 4219439, 3130763, 2768990, 4654211, 1152976, 122085, 3952718, 5880843, 4210691, 6329242, 4709007, 2787718, 6320281, 3596077, 6528667, 3020282, 7320635, 7925385, 5174440, 760500, 4363350, 6736035, 626013, 4171435, 2137995, 6330098, 5846200, 4743799, 7697376, 5858306, 1850654, 3802945, 5510210, 2013307, 6117808, 4574096], +[317716, 7952704, 5819693, 7775640, 6498344, 692925, 296983, 3947939, 2170031, 2731242, 991907, 4337667, 7009311, 5014777, 447037, 586519, 4402718, 2604042, 350455, 2351923, 2328352, 8355353, 6097737, 3065570, 8152695, 191198, 5819041, 6950882, 4976775, 7473310, 6447616, 7834104, 7483925, 1806461, 6126030, 4265223, 1669681, 5894461, 2712556, 2614443, 1228609, 3731586, 4779504, 2002769, 2830423, 1778917, 1238836, 3233524, 85368, 6408992, 2256291, 6423433, 7530238, 2886199, 5831078, 8296003, 1536815, 3160546, 8004459, 6237077, 6257213, 2524231, 669762, 4468406, 5132086, 2333413, 4940411, 1946284, 5595607, 4176165, 3217299, 6865813, 6950470, 679533, 3964530, 4077159, 1613104, 1022976, 565174, 4520394, 3383796, 3055526, 7682784, 5320035, 7072207, 4321591, 5596608, 5542713, 3839622, 6439121, 4273622, 6843833, 3368890, 2607410, 4781497, 7260262, 5643260, 3163338, 4775382, 4375342, 975875, 4306192, 4159713, 8341094, 1635527, 6124766, 2662572, 1414118, 7171182, 1135356, 1325807, 949241, 3123980, 631027, 2090449, 3958614, 3787522, 5030949, 3211661, 623099, 3096270, 3947472, 1328299, 5644144, 177198, 6416462, 5838664, 8168831, 150542, 5093188, 6183431, 7066336, 2080050, 7336842, 2866581, 4724868, 1085654, 1943207, 1953965, 5255817, 7750428, 5548206, 498495, 3480857, 5847160, 3101729, 1924858, 3814678, 5908325, 7909263, 1693322, 8010113, 7163597, 2920462, 1192082, 5744004, 8047903, 6449702, 4028155, 8118325, 6341777, 7201555, 6068738, 2782972, 705928, 6149032, 3858877, 3932470, 7512152, 5989478, 5535435, 419468, 7129259, 5613980, 2591268, 5392106, 7889393, 1397344, 3521596, 7103323, 6896011, 7484099, 1951338, 4732530, 5643931, 962806, 7323203, 5823926, 3228887, 185006, 1055644, 213982, 5153263, 3558577, 3536474, 7208986, 3691419, 930472, 7440403, 7524248, 561805, 7164868, 678214, 8244858, 5879323, 6839943, 1193887, 2283280, 3739933, 2209873, 4280988, 1676352, 5365855, 5307969, 5431705, 15230, 2037636, 3235191, 7204534, 697733, 5997406, 7714462, 3691768, 2101251, 3545975, 5940996, 7397924, 8293790, 7084550, 4600664, 7376491, 1835186, 5640765, 421583, 5599301, 5311184, 2639855, 8347733, 4766640, 462618, 1223800, 1504237, 6192671, 7051358, 1247347, 2917298, 5718729, 1296321, 7719669, 3938265, 3295475, 2409064, 1351962, 350848, 7135082, 4847184], +[1570404, 3374127, 6203829, 3403877, 8157306, 6508111, 4782724, 2219282, 4184276, 4852824, 3605792, 1342862, 1287197, 8372404, 5693597, 3661467, 6326627, 7153325, 6211371, 6526012, 2020091, 1771102, 6241797, 1357363, 7607119, 2073443, 5054176, 1771299, 5531947, 8271765, 6597038, 6259651, 6880061, 7089895, 590772, 2145951, 6421682, 641759, 7934919, 715842, 6968225, 3868079, 63579, 7031869, 3129039, 4979914, 4281280, 1276531, 3226314, 1767020, 6862807, 1598672, 6339046, 1873372, 3665094, 5207848, 4924248, 2487121, 5679461, 4176553, 2740805, 7059597, 4527368, 7072602, 4274221, 7714169, 71306, 4520803, 5379297, 137667, 7278378, 5825137, 110072, 740497, 7762901, 7227963, 2473550, 8202144, 4534630, 2925710, 7877993, 3801163, 6058400, 2009613, 7931962, 2326616, 4093909, 3217423, 8197632, 5298678, 6281184, 1577380, 702423, 5766812, 6667920, 4223, 4549231, 5223902, 2984665, 947568, 6910865, 731397, 6894109, 814661, 4271938, 4952930, 2629503, 101533, 3365587, 5398558, 195825, 5185414, 3339965, 3885402, 3960985, 4495375, 4719657, 88679, 7256404, 3623562, 6778626, 2712758, 5595800, 7512097, 5800708, 1427537, 7071733, 5962141, 482184, 6695953, 6603466, 748166, 3036892, 7670188, 4265260, 6078743, 3919020, 5656783, 8120398, 713773, 59727, 611243, 7777094, 7301003, 6353098, 4128861, 8336842, 2016068, 1873087, 649102, 7211325, 3746468, 4235722, 7974178, 7050065, 6597303, 333156, 2036329, 7167824, 2628452, 7145670, 5398761, 4749752, 7788186, 1201302, 3272982, 6396460, 6473043, 6817399, 2713736, 546956, 6099077, 3936865, 330521, 820294, 211599, 1859586, 4364485, 2644762, 6418040, 7553698, 8075199, 681738, 7587338, 7627856, 3870439, 2986043, 2063441, 4291340, 5756085, 5696183, 145540, 4139724, 802484, 3377639, 1015223, 1081888, 3892696, 1170703, 7592173, 5838885, 337129, 2984923, 3956815, 6131988, 1908356, 1590974, 8363798, 6944379, 6648649, 980622, 5775093, 4734466, 6743812, 5903497, 1141660, 703605, 2412880, 69377, 5651431, 1357639, 591929, 717511, 7645106, 7415780, 2588422, 2172724, 1620095, 4767010, 7304743, 2345432, 4723904, 8053773, 7274156, 7546678, 7963392, 256057, 8372559, 1128193, 1622932, 6401558, 3494263, 7468679, 5157259, 3277134, 6366278, 7530289, 6540690, 3439462, 6815227, 5906631, 7099855, 5138749, 1225009, 536149, 3085217]] + +rhoPrime: A9A9F85C9C20C2B207E25FDC800A2E59F41FB874B7A5DB2CA80C3CD2F6FD1DD6D8F945C176A75CCDEE86D21C830C4164C2386D38968EC0F58ECAA2E6C5193BC7 +y: [[-16088, -48849, 63050, 50124, -117504, 29493, 110219, -11008, -94012, 29530, 41186, -11050, -104046, -3384, -45232, -68582, 14328, 17028, -69181, -69300, 3293, 70652, -2121, -378, 117461, 72983, -117864, 67363, -35215, 51094, -22819, 51871, 86131, 101059, 30470, -66277, -15511, 34287, -42349, -35828, -17686, 42515, 1527, 126597, 17083, -100496, -118979, -85759, -87971, 41953, 99297, -67052, -71217, -77397, -60850, -10260, 10481, -3214, -39450, -48254, -89976, -68475, -5510, 89904, -125478, -128840, 48793, 128372, -32895, -29612, -120833, 29165, 21313, -110467, 108580, 59996, 115299, 50449, 29181, -88440, -33487, 117379, 61524, 124643, -82773, 96060, 58742, -3877, 109797, -31935, -60274, 64993, -74226, 47448, 87510, -64687, 34601, 52799, -63930, -81677, 112409, 30915, -106070, 77538, 70562, -53589, 91150, 107995, -5512, 55207, -60775, 80791, 1353, 81585, 82427, 33866, -120743, 61869, 32363, 42325, -46410, -2777, -5760, -84458, 24696, 30009, -109606, 110435, -128592, -3302, -115967, 22284, -74860, 65511, 49688, -125485, 45757, 35101, -89371, 40420, -113396, 85846, 84166, 37368, 127856, -124543, 63829, -97527, -106716, -101857, -55900, -32374, -32430, 14336, 7829, 114856, -14174, -50613, 103267, -106749, -66426, 83411, -53153, 67851, -81939, 13627, -83060, 50535, 33201, 102480, -52579, -106417, 30107, 31619, -83124, 19515, -102746, -60688, 21293, -93959, 108080, 123561, 80735, -3372, -69144, -40638, -17900, 123059, -55070, 32873, -125683, -90691, 41079, -78901, -92599, 4529, 54296, -95390, 38964, 2301, 130745, -63473, 82935, 66454, -11647, -39686, 19820, -41764, -5873, -37486, 68562, 51809, 126581, 28064, 87229, 112468, -45476, -106781, 64626, -5539, 18762, -91123, 84360, 25677, -86374, 46299, 27925, -18086, -115752, -26103, -16191, 28268, 92458, 51404, 25308, 4325, 106974, 128246, -37792, -24646, -88331, 22653, 2459, 85289, 12361, 5356, -70765, -17811, -22046, 14438, 91798, -14723, -62699, 4024, -33621, 47932], +[-49377, -73585, -45443, -27462, 26060, 118796, -126939, -81588, 97485, -34038, -101409, -20398, -6286, 130451, 108502, 15632, 33952, 113909, 107688, 84947, 121773, -62990, -7811, -78100, -84591, 6438, 34103, 112902, -3786, 27501, 73553, -67296, -104579, 87550, -123921, 12997, -41973, -109852, -70361, 84459, 3595, -70596, -20570, 64071, 127678, 15894, 41890, -10796, 54694, -80393, 64510, -130253, -90319, 41583, 41404, 61936, 43701, -61889, -47411, -76176, -2845, 6936, 1039, -707, 130567, 104514, 94116, 114853, 107037, 122310, 28505, 66665, 18175, 85314, -121390, -3847, 40011, 63703, 39832, -25817, 109725, 89333, 14223, -102614, -18697, 23924, 25211, -77495, 117901, -11550, -32847, -82603, -120813, -96990, -1008, 23792, -74934, 92968, 101369, 109093, -39370, -61265, 93395, 80409, 53523, -117393, -88241, -11798, 119493, 81457, -8663, -107363, 73739, 65482, -23261, 9041, 70709, -39592, -105084, -116035, -77888, -63839, 14574, -1629, -74212, 83445, 77483, 103281, 17861, -3056, -87478, 37252, 102951, -16005, 11803, -74507, -58771, -41738, 125879, -18196, 31660, -103421, 126957, -85013, -95252, -52708, 77371, -44347, 94673, -19548, -63293, 15351, 93994, -115072, 107481, 62050, 120492, 129793, 54130, 44804, 6443, -42939, -83994, -44762, 92175, 4170, -18009, -101238, -92712, 36731, -126521, -74986, 87454, -126335, -42968, -65791, -21947, 21884, -39734, 124175, -21156, -97254, 95854, -4740, -76395, -5323, 11564, -29688, -32052, -74604, 54506, -118189, 83396, -81678, -16415, -74228, -105243, -92277, -13483, -81992, 41313, 97981, -30747, -100981, -72478, -25019, -99707, 112041, 2296, -89787, 21152, 42077, 46314, 60583, 38437, -113374, 51396, 48722, -83901, 100610, 40949, 110234, -80983, -123639, -77325, 19997, -13706, 117953, -9001, 73428, -9907, 30882, -120449, 52409, -126179, 88655, -25076, -13925, 57776, -87937, 79412, 104939, -105775, 48688, -92727, 83620, -115159, 50442, 33650, 36699, 40622, 64085, -30877, 98310, -57586, -56481], +[106078, -34816, 58147, 11659, -42750, 62417, -126762, -120564, -69150, -750, 119074, 72712, -121945, 14163, -72493, -49792, 120019, -24362, -58201, 119464, 99309, 34091, -38736, -19079, -27311, 50472, -3894, -92162, 33886, 2149, 48130, 67760, 119547, -94167, 23907, -127150, -32475, -77647, 66621, 2347, 71599, 60678, -72707, -91752, 41582, 103341, 88667, 28487, 115533, 119416, 107523, -50231, 115541, -15847, 50349, -15283, 94168, -40938, -92094, -21304, -120367, -130594, 103949, -11890, -100130, -102530, 61815, -26927, 43863, -59205, 123123, -117229, -106808, 44615, -331, 120519, -25327, 119254, 17986, 85399, -26099, 21496, -84469, 91335, 71578, -29115, -90306, 46190, -106824, 34176, 93638, 105924, -4933, -30903, -104382, -25734, 92951, -71518, 94597, -40815, 127099, -14026, -22534, 58051, -36308, 29870, -7767, -81605, 123752, -75333, 98310, -119405, -119275, -85714, -78553, 42308, 124651, -49610, 30784, 12889, 8620, 1890, -117284, 5522, -79380, -117666, -104399, 127065, 104080, 69260, 1769, -48101, -113859, 27524, 71854, 113332, 128813, 80305, 5838, 97077, -51666, 55496, 73528, 68561, -108197, -34039, -92954, -128836, -64711, -9761, 31679, -112115, -54118, 74079, -21748, 128815, 45471, -110126, 37538, -16446, -5271, -124654, 89969, 99201, -47570, 125374, 113823, 92266, -77867, -87812, -68215, 53432, -108221, -127302, -105026, 61661, 67180, 98461, 126599, 87431, -130270, -173, 44630, 11378, 32079, 35720, 29672, 76352, -53631, 65164, -55836, 11975, 80953, -53292, 1030, 29002, -81920, 129011, 95349, -66997, 77527, -19082, -121362, -62597, -107999, -9304, -119632, 111077, 64852, -40756, -125459, -10203, 36586, -37954, -122470, 1429, 10839, 90932, -40695, 5749, 64052, 44524, 35300, -9980, 126724, -117095, 63082, -92280, -16913, -22385, 102758, 421, 125529, 52191, 39073, -80973, -68341, -21546, 25283, -4828, -104021, -109772, 114700, -90686, 10403, -82871, 96829, -113392, -125575, 81964, -44010, -86323, 70442, -94945, -28797, -119267], +[-98574, -78763, -87710, -28962, -79473, -50851, -62821, -5213, 76005, -11100, 72963, 78058, -69941, -54968, -51710, 81369, -122193, -11067, -32462, 20787, 104041, 37140, -23427, 110165, 127719, -80603, 6654, 117981, 19692, 76880, -91927, -46683, -27975, -115832, 50139, 44373, 2179, 2875, -35300, 6860, 116567, 119654, 82411, -59897, 11920, 111334, 34936, -19235, 18012, 108187, -41065, 8572, -49338, 80783, -33097, 163, 69124, -56875, 87423, -114715, 29113, 55759, -13130, -124307, 129338, -37770, 778, 28634, 20946, 91575, -109285, 46015, 44491, 99918, -23379, 29551, 122952, 93669, -71182, 42575, 122674, 101629, -46265, 87621, 75058, 38492, 43221, 123138, 123030, 117270, -72825, -31716, -20233, -85491, -63856, 40161, 28798, -52994, 121513, 64817, 106285, -130326, -71219, -23003, -102105, 81984, -50205, -125795, -37445, 83779, -9762, 40538, -24000, -53947, -117553, 130594, -102226, 85695, 66413, 99525, -90702, -75918, -39594, -88380, -70639, -88372, -42388, -96820, -74805, -8372, 4904, -14687, 83097, -102034, -40988, 88593, -51297, 85898, -125234, 63541, 41150, 37518, -124676, -28563, -9387, -54477, 18805, -29976, 115346, -77975, -2717, -55725, 69346, 127946, 69318, 73740, 15240, 55908, -39874, -30705, -33293, -122085, -123057, 95548, 77189, -17528, 93237, 12570, -99050, 40460, -25672, -19572, -76971, 82403, -39822, 94398, 47407, 112108, -54925, 30109, -30569, -18869, -97093, -120239, 15717, -89366, -70614, 49075, 96815, -37795, 40941, 99362, 129506, -79914, 47398, -114309, 10389, 109649, -37690, -51902, 81854, 95897, 122787, -119513, -12582, 65354, 112057, -28350, -64338, 69652, 37931, 65661, -109976, -22932, 75159, 103357, -83843, -67305, -9742, 42977, -125009, 34600, 39432, 60522, 117679, -72445, 95954, -17664, 62912, -98316, 48700, -41892, -94817, -83422, 43895, 39721, 123334, -41690, 112537, -64785, 63199, -455, -55741, 60812, 3099, 41207, -46472, -89077, -70379, 52387, -49603, -128978, 50389, 115459, 35717, -54854]] +NTT(y): [[4047304, 6951015, 1424143, 997117, 6879402, 1833717, 7020260, 1181620, 3857346, 5444919, 8194325, 6688481, 3045723, 2553835, 8293136, 4135624, 3903731, 3168071, 7750529, 4203151, 2358050, 4620113, 7261178, 2102960, 7239039, 3563889, 4250473, 5247329, 2095144, 3579081, 1375903, 2824842, 3508276, 583279, 7985971, 6337149, 1733785, 4719941, 4130201, 7606023, 2208405, 698220, 421291, 2862132, 6100156, 4241289, 492684, 6318413, 5386611, 5054202, 8366094, 915437, 2887972, 3733125, 6441182, 151919, 8141130, 6456516, 6048296, 6651902, 5254766, 1766460, 6748660, 4928040, 7969474, 6780814, 1074451, 7522205, 2499719, 2655016, 5433007, 2794576, 6129091, 2260903, 4836517, 2744265, 5586478, 2950576, 6600262, 6411158, 5387029, 4175444, 4875532, 6716643, 3381244, 5659854, 5679166, 1816373, 5944766, 2369891, 7308601, 510008, 498395, 138446, 2276734, 2763675, 2144328, 7539623, 517247, 1571496, 5711698, 3032615, 1384373, 5677335, 3641703, 7040295, 3943525, 5417434, 6430363, 442182, 6129980, 3575821, 5390203, 3176150, 285838, 4963248, 2902075, 4262715, 6259777, 5677937, 7007778, 1059424, 6365813, 7950419, 925573, 8313399, 5292476, 2134967, 7281546, 2717888, 3597495, 3492668, 2062518, 3845010, 7429111, 4335417, 1327773, 7136735, 8187227, 4700109, 6486499, 6211795, 2797058, 2519385, 7015187, 2079427, 6372435, 5317176, 3965252, 2928176, 5876382, 5121900, 1162414, 642330, 6383348, 5893097, 51428, 5835574, 2937850, 5972764, 1855507, 3267790, 7455812, 264858, 5564922, 4758826, 884993, 1607726, 3265364, 7148294, 8091595, 131995, 8061313, 1011446, 3502483, 2229343, 559564, 5125686, 2979146, 1681278, 7104775, 3603982, 658824, 4958666, 1924888, 3487831, 4370447, 7134267, 165753, 4049890, 3586582, 7579657, 7986363, 5025107, 3121885, 7234851, 5940341, 1776020, 1324805, 5778235, 4727508, 509985, 4217559, 5197029, 6112860, 5483161, 7832985, 2735436, 4844039, 5681837, 1624960, 6506659, 4278687, 3165902, 1662950, 4698023, 314344, 5609489, 1436721, 4100014, 4539342, 7637951, 1338933, 5111603, 4160731, 7955561, 7756072, 5026188, 7704780, 3503469, 1545409, 5985360, 2287942, 3539150, 6131328, 5717386, 1338790, 3847046, 5032089, 7919773, 1125763, 2608017, 7687993, 2419895, 6489167, 6157808, 36230, 1243929, 7559586, 1683170, 3551563, 8000633, 5150948, 2086616, 7132968, 7129578], +[4178864, 8277210, 5532799, 3218212, 6790163, 4187444, 2718546, 8115736, 7414998, 8001594, 7388631, 7101592, 1756098, 5221140, 2733177, 3585605, 1546552, 5457291, 4358642, 5729935, 8171151, 5270187, 6621524, 4792252, 1806432, 5189620, 3355374, 4292954, 6032600, 7034028, 4465204, 5923506, 6067931, 4965865, 5536899, 5233880, 1012182, 3630257, 1335508, 1411742, 5761884, 8076663, 6156523, 5055876, 6306172, 2901626, 4463774, 594131, 1397757, 6836423, 3668147, 518416, 4712382, 3664480, 6365108, 5717459, 7414061, 97817, 1144430, 3875542, 1914959, 3703393, 3490974, 5347691, 2507083, 3422451, 3823956, 3653016, 2368429, 1508086, 5040565, 6271546, 1772742, 2014764, 2395473, 4203579, 6743936, 3291102, 4452066, 4772126, 3044442, 4542497, 7416197, 2784765, 4773584, 866291, 2360281, 7954249, 5463107, 1113964, 3902206, 4905848, 4506947, 2676638, 6456490, 2645741, 6528962, 1279653, 7660350, 4749827, 5684602, 1359909, 6278744, 1893510, 522560, 3439150, 3602204, 6520710, 4153727, 5165463, 1783411, 2788112, 978583, 271029, 356134, 7545202, 7327858, 4583913, 1248438, 5334990, 6410543, 3664754, 4649432, 7826286, 6240735, 3404418, 5247367, 5636298, 3228859, 7948000, 779498, 3714494, 6705896, 1105196, 1748120, 769327, 2602638, 2995923, 2638239, 3052068, 1153111, 7426747, 4347428, 3642786, 1620233, 7510548, 5582057, 261765, 1905857, 4685302, 6989285, 2525028, 7195938, 6387725, 4332855, 8346752, 3447180, 4669923, 5935284, 285504, 5365387, 750458, 8129534, 3799319, 1372994, 7690717, 8359932, 5952268, 2668843, 7513519, 1579797, 4435194, 4921456, 658245, 3485380, 7658826, 3840696, 5574612, 4367784, 3239, 8123551, 6602237, 5667529, 4150683, 7406043, 6951162, 457930, 2755552, 5924780, 4999538, 2411501, 4675458, 5973794, 6885773, 7635583, 1974600, 5970090, 7375076, 609644, 6136632, 2900815, 5589889, 5697995, 4481884, 3082135, 5600754, 6156159, 7533243, 4028948, 6366842, 3924093, 3608754, 635457, 134163, 8108403, 7106940, 2982117, 7415341, 1557420, 2662532, 4049024, 5398253, 6856813, 3861902, 5061633, 3629702, 3775152, 1752335, 6045490, 512500, 3625326, 1036820, 8103889, 2566336, 237309, 6700378, 2726792, 6711521, 1516383, 2430096, 5837929, 6135308, 72440, 2725875, 5373620, 5296413, 1970212, 253842, 5143391, 1334811, 7346455, 2498019, 892858, 1261856, 3923925, 160647], +[6221069, 5071213, 5233243, 7246516, 3046386, 273627, 5694753, 7681721, 735904, 489493, 3912647, 7563435, 6490180, 5709317, 679610, 8218614, 3632908, 8215178, 1857135, 471651, 4275627, 902876, 2906103, 5080494, 7485157, 4813643, 4928297, 4382962, 1979118, 6521219, 3324312, 4699111, 2187205, 4575640, 36504, 4854473, 3738509, 302508, 7146744, 1283310, 1278234, 470192, 8005346, 4516256, 6393546, 678454, 5913550, 1680792, 2687720, 1387465, 5423539, 983550, 5686987, 6830164, 6230790, 3064320, 1757874, 1160485, 4682885, 5590351, 7336287, 1468845, 6045909, 355318, 7435146, 3946098, 8132779, 7031334, 2259491, 283119, 5576844, 7218700, 6617910, 6836036, 1211007, 4156113, 3572456, 6043257, 6003709, 210808, 3306411, 3622281, 3844378, 4937849, 5442651, 2508505, 5151961, 8286856, 3430099, 3407125, 7985566, 6688200, 6544157, 4587968, 8121026, 3182973, 2769884, 6828778, 734197, 8010322, 4755409, 7346488, 1837274, 4517110, 1143531, 5554115, 1965115, 2848029, 6097548, 401415, 7388084, 2308525, 3123792, 5976925, 2220815, 5352830, 1573176, 8132143, 5906450, 3726028, 3712508, 1376363, 6849912, 3997916, 2457556, 6535367, 7514308, 1847727, 3601701, 6601238, 421057, 323638, 5714366, 7714466, 2329932, 1898765, 2919818, 1855438, 2490488, 1679539, 3696100, 8258064, 80120, 2810612, 5794690, 6289830, 7137786, 8241390, 4079243, 4695290, 7538821, 848760, 3371600, 2781355, 1332621, 1788241, 1581302, 3810196, 8146826, 8259256, 3635062, 6948963, 5759538, 5329513, 2575877, 5985047, 3670581, 8287533, 1433224, 6968974, 1689972, 8329324, 2851238, 1399880, 3950314, 4870868, 5809209, 5786978, 1618821, 2353114, 2724445, 537420, 4222432, 2610595, 2320445, 549069, 4081970, 1337054, 7455098, 5989622, 8190909, 5269272, 5767226, 7062700, 2131884, 6750889, 6383646, 5639975, 3965719, 3676893, 5999022, 3380634, 5790412, 955174, 101834, 376619, 4980827, 2251034, 3538843, 6171621, 1335011, 1892849, 3536724, 379733, 6254120, 8097074, 1096294, 3916145, 8099159, 1343321, 5113737, 5408085, 6582044, 3339295, 2976983, 2469362, 4578346, 6761458, 5338976, 4039662, 2507110, 2771830, 3062742, 4292093, 688234, 5653998, 716460, 5051071, 5225527, 681557, 3145204, 5319600, 334900, 654509, 5638807, 2085146, 671948, 7761143, 7704097, 1184162, 7175874, 2570267, 49697, 3716326, 1299761, 3596815], +[2798587, 1932060, 6277196, 739855, 394065, 3463139, 570713, 5907339, 2481270, 3662599, 5151296, 3173381, 3585865, 548692, 6675016, 6809766, 7943215, 8249315, 3790498, 7866708, 3941080, 6414760, 5259566, 1292680, 6127024, 3219474, 3174223, 8001594, 189592, 138203, 6512524, 570861, 6102423, 1690139, 4925457, 2536026, 3317607, 1465107, 1642101, 3906423, 5954211, 3659285, 3195631, 4075032, 6845971, 6924700, 7399565, 6300612, 4028667, 638443, 6753233, 4258961, 819926, 3963997, 7340562, 4934500, 8283505, 7109253, 8308459, 1570973, 148388, 5132258, 5959189, 5252142, 2068184, 2457432, 5665769, 7730135, 8147106, 376675, 7650836, 7873943, 7062391, 5927148, 7014981, 4609955, 2861548, 384626, 2103925, 1762087, 3334571, 5285202, 8311061, 6300850, 7733814, 7238551, 3172392, 1200346, 3710567, 3948624, 2647832, 6691477, 5046141, 3287839, 2621535, 5394494, 1316203, 6617643, 8312807, 5982983, 7334321, 6862573, 7290411, 1312422, 7847077, 4044970, 2672770, 1427387, 4811123, 8118408, 5318624, 2215143, 5943613, 7135381, 3275137, 4111365, 5518411, 2794886, 3757217, 8220196, 6160631, 920659, 620286, 6716008, 1575680, 4864910, 783726, 1394414, 580768, 8301555, 4246935, 3814756, 4669168, 7677617, 4661095, 5968123, 5539826, 7820909, 5619281, 7503995, 3381907, 1943706, 7096689, 367795, 5329341, 2898402, 1759147, 1520293, 6390486, 7018582, 4853391, 652576, 8037335, 8195819, 5230643, 6671359, 4097904, 1305292, 3714808, 6402737, 6691742, 3363707, 5914525, 2603540, 2459967, 2328322, 2083674, 4640373, 7734788, 4076304, 7249487, 6721964, 5183438, 2792513, 2654167, 3517871, 3390069, 2448401, 9157, 6469505, 5326077, 4219253, 1427769, 3390249, 131629, 784738, 3403761, 5448113, 5812172, 1210943, 5432614, 655410, 8366712, 4187701, 7876775, 6444733, 6577200, 5625561, 6190829, 7717858, 7396412, 3466281, 2575216, 5180091, 1190168, 3721634, 4696209, 5466607, 3463744, 3196113, 5491204, 2277874, 1880116, 5581699, 4968880, 6038829, 3036991, 3496696, 227665, 2514383, 1683790, 4290910, 5758880, 1516484, 5530904, 570074, 1217501, 8154645, 8326953, 7022, 148950, 2547509, 3990961, 405386, 529996, 1967496, 837573, 2573733, 6146199, 4357622, 4722384, 5752651, 5965459, 2017400, 1466182, 1007632, 3725146, 2226866, 4262580, 2319173, 4851481, 5226915, 6062827, 4587659, 776790, 5919797]] +aHat * NTT(y): [[4353692, 5048177, 801391, 576865, 5871765, 6252585, 7465370, 186136, 3504805, 6073060, 2228432, 1605873, 7451066, 1616403, 5584379, 4341230, 7359284, 5762964, 4997819, 4456214, 7523576, 2099024, 6130237, 1055023, 8088381, 2282984, 4153079, 5579630, 6962123, 3858284, 6119695, 4457767, 4666119, 228485, 3854215, 8099180, 4643912, 4257606, 3177559, 3135056, 3639849, 7757802, 2096630, 2213004, 7368272, 3772597, 7868678, 5629074, 2174686, 6914100, 7303605, 950259, 8280872, 699475, 4016484, 3322830, 1883449, 3854522, 6006936, 2631445, 8053882, 6674021, 241381, 5048386, 1545904, 3859296, 4783187, 1109343, 6239057, 8285136, 5101044, 7813898, 436930, 8250640, 3110701, 8175078, 4363994, 2100130, 1976302, 3033362, 6644228, 2174377, 3091381, 3247049, 3329611, 6975717, 2924381, 13764, 5896559, 174175, 3855191, 5245158, 343947, 3467010, 5949901, 2454555, 2982182, 6153818, 7862746, 3051280, 1605784, 2958351, 4869784, 8025145, 6097104, 1382431, 6075556, 3084004, 5170117, 1562121, 3535913, 3791005, 4706879, 2629851, 3489184, 112577, 8222955, 2365891, 1005617, 2828492, 7909693, 6017852, 2218640, 5764700, 5461341, 1185790, 2272654, 6711460, 42942, 3515681, 4282320, 6402239, 2142770, 7523713, 3236075, 297844, 1440040, 7094358, 1931694, 139857, 5891260, 1596241, 6535867, 8344683, 3830882, 5106051, 604954, 7429707, 7078697, 6638027, 2540562, 2101819, 1124933, 442161, 6227052, 573461, 154368, 5038560, 8210269, 644696, 6000172, 7171980, 5390423, 8096820, 4895302, 7358454, 2502384, 6260099, 7278040, 3578500, 7694700, 4933454, 5347081, 3417200, 7997460, 2398739, 2869745, 4611598, 2414021, 3577643, 7737332, 2121445, 3247120, 4673961, 3272341, 2355845, 385931, 7275147, 5608293, 5691917, 7303988, 7031679, 530681, 4543860, 513030, 6536974, 532849, 4540802, 3316414, 1450980, 1394302, 5858210, 4373408, 7510238, 2456810, 5650429, 2529673, 8251471, 3834347, 1917675, 3316559, 686638, 689049, 6413634, 7439663, 3701099, 4531644, 2042082, 8005752, 6507205, 7389037, 37450, 3727399, 5461799, 2573871, 4841323, 680402, 7518464, 2138818, 8127928, 6739315, 2970565, 2237299, 7189858, 1205158, 2516134, 100081, 7932786, 6538105, 8299739, 2886258, 5372459, 6513398, 3063269, 1561643, 269133, 1150140, 5906916, 8197992, 3721737, 5695862, 2587735, 5716960, 5793312, 4970017, 8319353], +[738060, 3232700, 7967298, 6079826, 8240678, 4329585, 6843740, 7763930, 5548893, 2044020, 7566831, 2433770, 519751, 5889672, 355766, 4942098, 8354750, 3607886, 273603, 5204862, 4935492, 4915302, 8167655, 3218985, 8245930, 5262332, 1010710, 3177209, 2316288, 3547964, 5589198, 1429728, 3136218, 1238158, 364063, 2154533, 4261315, 8229063, 6129089, 3016456, 6185527, 6884298, 6524022, 351428, 6616844, 22500, 1614010, 994962, 7287316, 6892081, 4887638, 707065, 1202420, 2578208, 5570477, 3022302, 137766, 3589061, 3842660, 2001695, 5196551, 892043, 998239, 1341095, 1459376, 230011, 5295960, 1664877, 920372, 7991123, 2814081, 3503745, 4987092, 3005585, 8221651, 4563522, 256165, 4055658, 5343786, 7168390, 3665489, 7869730, 2692333, 3480480, 463771, 3637718, 208051, 2599526, 4162932, 2010474, 6233801, 166421, 1816076, 2096811, 6163768, 2630813, 7558773, 1858856, 6301860, 346505, 7280218, 175373, 1229202, 7767864, 7705021, 6423207, 7234789, 1595767, 6492944, 1055356, 6971535, 4702393, 1951640, 1301153, 2253464, 7900522, 6375856, 5728677, 6815739, 5114008, 645650, 7084458, 8338522, 473792, 8346457, 6734123, 7778742, 4188560, 7218521, 1116878, 353790, 3891248, 6715531, 1375148, 4929901, 6971147, 3038151, 3074678, 914604, 4991566, 6402240, 1102720, 3133643, 1326364, 411158, 2859705, 2100114, 4135231, 1186564, 3102643, 7672655, 580019, 6022456, 7728292, 4985711, 2798353, 3636949, 3057338, 6686604, 8330880, 1855755, 4677768, 365168, 1584011, 3116224, 4372354, 8362768, 8074099, 4519801, 7908049, 6846324, 7461038, 1093905, 6493311, 8043076, 7945174, 813821, 830477, 4618119, 255864, 3694847, 7123989, 6998601, 5718793, 3332595, 440019, 6466879, 6807085, 462422, 8140442, 3979677, 6770976, 1796222, 3933862, 3745957, 4470120, 3481188, 5754506, 1169468, 4861912, 1945747, 5171317, 3265332, 3429754, 5092470, 7508356, 6138332, 5894295, 593405, 7020983, 5083692, 929673, 6883013, 5448237, 497658, 5457403, 8212937, 6396419, 4912114, 246600, 3242305, 3090218, 2262760, 3361457, 3009838, 3895765, 7482885, 944689, 8286046, 763236, 5406299, 6851962, 5596328, 2704189, 6769011, 6660318, 3350371, 1211374, 7566229, 3677063, 4750253, 6746456, 4065769, 644609, 7644778, 8120011, 7688289, 7736713, 4579698, 7779359, 7868078, 7735865, 6712663, 3611674, 1035051, 6240036], +[2608116, 2639997, 7069639, 5437784, 6827606, 1998995, 3184681, 5699063, 6100134, 7241135, 1726100, 677525, 7499890, 2431889, 6200308, 259086, 1315171, 784564, 8121128, 7968989, 6865461, 2038823, 4877810, 5560668, 7883584, 7346267, 6137992, 6236942, 683787, 4627933, 6315469, 7595758, 4603352, 4790238, 3200038, 3452426, 2797795, 7399453, 2597845, 2211253, 7035083, 6699980, 8268632, 5945207, 4154418, 975930, 2899561, 1430002, 1727048, 2924544, 5148192, 7341274, 6836422, 774949, 1245170, 4173473, 3403874, 7982762, 7714365, 7486628, 4064345, 8272019, 4316131, 7833828, 3115529, 4583931, 6979684, 1160292, 3013105, 5508270, 7384846, 4665061, 7942141, 1076647, 648083, 517547, 2701137, 8363539, 5818872, 5653384, 1205296, 5732793, 4231045, 8378719, 1789038, 6101557, 869751, 4188502, 1501241, 1304758, 1537131, 5652471, 49117, 1478889, 6582812, 3807680, 4687241, 1742201, 7671462, 6687645, 5102031, 4838263, 4513572, 398874, 1596364, 7281575, 4858826, 609512, 4945384, 7345231, 852358, 7488300, 1915000, 5051692, 1984457, 97114, 3852843, 3411906, 3362368, 7542507, 966611, 1685613, 2325440, 3612235, 3111818, 5566544, 6916278, 1346133, 2332939, 6497066, 7929141, 5178877, 5402454, 1600647, 2566879, 3277628, 2673975, 3679263, 142807, 250735, 1287697, 5255598, 8315316, 980407, 5661699, 6018776, 2450922, 1310523, 3572412, 2758432, 5522308, 4931982, 7027495, 1625498, 5930962, 5764783, 3547948, 4995873, 5151973, 98678, 2347919, 5812659, 5278241, 526343, 5878530, 7641880, 7132254, 8273537, 2194115, 4135198, 1024375, 7637611, 1622093, 7717669, 6372977, 7602797, 6033441, 3310675, 8170655, 3035896, 5219046, 3763856, 3880224, 5303026, 5470773, 1112961, 7194288, 2120391, 699978, 2868071, 2254233, 2101352, 7186927, 4690283, 7481246, 3186783, 2064177, 7013141, 3493420, 1586114, 5304631, 274100, 1118326, 1694748, 3561125, 6936488, 3213936, 6538594, 324772, 1840949, 916147, 2701978, 204197, 4000529, 3554147, 778954, 803788, 6558478, 5330495, 645668, 1509269, 7107096, 1300847, 483125, 617165, 4492030, 3700032, 7429155, 2518311, 6382556, 5514368, 6802273, 4920761, 2660272, 5469550, 5849559, 2249208, 4559327, 2969632, 7041270, 3063274, 4084340, 2576837, 5214231, 4112947, 3260748, 23527, 7884933, 3188964, 2244500, 6364981, 2702024, 6032331, 1299146, 7754278, 3465935], +[1138512, 7566907, 7035146, 1279552, 3507202, 7211876, 929897, 108860, 3521083, 5554161, 5005824, 167922, 890861, 6643266, 2962597, 2288439, 6652557, 6349689, 5489954, 136949, 1522464, 2018825, 3052928, 7388027, 407824, 3728010, 184326, 6107534, 2210818, 2452624, 1354566, 4542882, 7144267, 1040041, 4849743, 5019032, 3910098, 4743124, 5582739, 3031105, 2811254, 5376443, 1273481, 5153077, 7244128, 990743, 845956, 4659615, 8181230, 6581889, 1108975, 4097986, 7701391, 3219176, 7353199, 6991255, 1805830, 114527, 8000377, 3805619, 5909585, 963066, 820713, 3103933, 2752987, 5350402, 1075220, 8290902, 5517790, 4092341, 5008171, 676548, 3875217, 1693210, 6810503, 6472215, 4622516, 8233029, 3674513, 6542180, 4354263, 6165224, 4005461, 4769167, 6550632, 5707434, 7162072, 1284555, 1030848, 7484282, 7542440, 2188438, 609767, 274156, 5744171, 7179464, 2172112, 6150176, 7983009, 4211240, 3135953, 6792138, 5136384, 4660671, 2096948, 3155071, 2571849, 3179365, 5581203, 7398902, 2270545, 4048853, 3525706, 5986145, 5001563, 7132980, 5082908, 5215387, 3857781, 6200254, 2577322, 2771578, 2322713, 6805395, 3154821, 5414665, 3531576, 405061, 6619155, 432158, 6033939, 3913633, 7638193, 2576432, 6801758, 1330552, 3345240, 6496812, 6223375, 2392201, 8207976, 4976928, 6721484, 3246432, 6721201, 7646539, 1558843, 2396850, 3670704, 5653833, 3081704, 3212998, 4335394, 3384877, 1079687, 804826, 7970506, 3250602, 6141897, 7909757, 6047699, 6768169, 7961213, 8260428, 5717626, 4661333, 4425286, 2944052, 8299592, 3203905, 7102910, 6657340, 5780536, 956507, 7016581, 364759, 7756423, 7428274, 2086798, 5774733, 518438, 7485428, 7422195, 7020543, 1889255, 6847812, 7340228, 2076224, 4056747, 3586055, 3338376, 5916148, 3455345, 8375222, 8039757, 1201212, 2862066, 3918553, 1818303, 2458920, 4008328, 1639532, 5391017, 5627204, 1063742, 3010713, 7585007, 547434, 1931537, 7750745, 7700829, 225464, 5713566, 6069921, 1268004, 328077, 3544705, 1238722, 7482536, 5195323, 5330182, 2480840, 3571439, 4781162, 4038252, 1931907, 6369889, 6965785, 2132916, 5764207, 6708816, 5700308, 5414389, 5294862, 4018668, 6061098, 550368, 3338844, 1772725, 7379810, 3442708, 4982682, 866797, 8039685, 522561, 7762634, 4831191, 3517447, 8066381, 1789931, 7109925, 1018738, 1508398, 3994855, 2157616, 1318054]] +w = NTTInverse(aHat * NTT(y)): [[4090552, 3533489, 3040556, 7911513, 7938043, 4498751, 8247264, 4019279, 4489651, 1937009, 2134142, 8254119, 5094448, 5222799, 4576247, 3403906, 2975355, 2140940, 3628608, 5281315, 5109889, 1200233, 195163, 2108850, 6480104, 7855161, 3333152, 7956488, 3193974, 5711179, 7180786, 3453736, 1821842, 2110116, 2878243, 7162500, 4778256, 4585424, 5690153, 7214683, 7867794, 2415723, 2750775, 6199950, 5719012, 2555792, 8356651, 3060335, 2218881, 2981138, 880777, 2010263, 4240860, 3033290, 4162306, 7281551, 5050617, 2706197, 6037641, 2789071, 7542768, 5586676, 1796352, 7117584, 396604, 5672109, 2211396, 7377636, 3191925, 3589697, 3458243, 6379171, 6282224, 7514513, 8093269, 744491, 6530745, 6680303, 7959458, 6468404, 4554613, 1579512, 7291999, 7940063, 5019760, 6110959, 574920, 1509170, 2888154, 1483394, 4374310, 5359784, 8352303, 6983263, 3258247, 6175746, 1484936, 6603038, 4425884, 5388303, 7924352, 2295988, 357783, 6525701, 991874, 541802, 1891087, 1683548, 1436139, 6093709, 4703588, 2636067, 7443210, 3950995, 7438244, 944369, 1009384, 2164098, 1776297, 7705035, 2651433, 4265265, 2499396, 7229014, 4506901, 5760894, 3042795, 2855661, 7863673, 2822996, 4370369, 1689991, 4483121, 7462859, 5232048, 1998726, 6947975, 2216539, 854217, 3298338, 7281699, 67968, 4282308, 5533878, 2648693, 8270748, 7048058, 8080304, 945526, 1061351, 3105094, 6747922, 2060092, 4308541, 7899, 4691965, 1970672, 2573098, 2648528, 4774027, 4483315, 7794077, 5267629, 5118370, 6540218, 3008373, 8351187, 4767263, 5247715, 4942060, 3176502, 188236, 8036029, 468894, 8299608, 1200966, 3396215, 4071474, 7010176, 2333943, 1514853, 5727543, 7097700, 5803346, 747441, 728038, 3038012, 7421953, 3616257, 878509, 1073073, 1471585, 4678718, 6739394, 3823885, 3885780, 2141989, 5404595, 2739157, 3790080, 1495297, 3192452, 7681032, 7973598, 478836, 1872058, 6164948, 1242520, 2012693, 2823987, 4319384, 7352140, 2080489, 4333079, 6387854, 7945174, 3186302, 1021503, 5663058, 2112936, 5241400, 832081, 1374845, 2208928, 550747, 1558786, 118265, 239678, 6818495, 6013688, 7967061, 2194948, 5730629, 8373419, 823721, 6536521, 7935959, 3299061, 1701492, 7337991, 318236, 3178638, 5878875, 5250341, 4727458, 5440170, 5264828, 2273682, 3509101, 8219686, 8352834, 3882307, 3053324, 8316046, 6618579, 1562087], +[878938, 3249557, 2546737, 901344, 4319125, 6286731, 1073874, 4468646, 4873825, 6112187, 6504777, 6313410, 7373300, 5166865, 2229412, 4599942, 3176733, 5918893, 2110433, 2936140, 6373051, 667948, 4140520, 1725804, 204641, 6045189, 2252608, 4255291, 6262883, 163760, 1412968, 4821595, 7935453, 2708222, 933957, 4500050, 138844, 408630, 6502197, 7262840, 1163397, 5627306, 7402806, 7861057, 1758547, 2345204, 8356980, 6563412, 2313286, 2827412, 3402809, 7614175, 2277052, 8056482, 8107101, 213027, 6338730, 5233873, 6499462, 4748998, 1668948, 5198538, 5010804, 120779, 3959128, 2521763, 3670633, 1204808, 4361868, 6034800, 494841, 1871868, 6440200, 3117304, 8049483, 3828500, 5373817, 2031370, 1601600, 2532597, 1381862, 2748671, 6631491, 1934826, 1078559, 862694, 1304191, 1358889, 4440775, 2431981, 4227383, 5697653, 5228498, 5039500, 1410003, 257044, 4666693, 1202107, 2010016, 131507, 2318054, 3845556, 552283, 3459844, 837006, 2785903, 8262068, 3460199, 168305, 1760628, 3637969, 6024250, 3191775, 2150754, 3726576, 6757779, 1150298, 949237, 2102380, 7967130, 3188952, 572209, 7718459, 7493283, 1891765, 4931885, 5112738, 4430536, 8006791, 3746032, 3253506, 3174672, 1353867, 3154691, 508565, 888929, 5454374, 7955958, 24454, 3365575, 8282178, 777531, 845346, 3637631, 1453232, 2075734, 7096562, 6139591, 2722325, 5225277, 4241028, 3575242, 5945092, 5476576, 3198403, 1987397, 4866150, 312218, 1359972, 6746793, 1155214, 1801715, 2242161, 906046, 6792312, 4059310, 4229945, 2110549, 3332339, 2964876, 4447897, 1816874, 7746804, 7812956, 3920419, 8111815, 7091234, 1667459, 3087906, 1764031, 1450458, 2043160, 2442670, 6005704, 6558394, 116958, 5094677, 7847250, 7507664, 4095400, 7023782, 6392253, 7565551, 5319510, 6159000, 1731864, 3717139, 4391564, 6298226, 7473137, 4483685, 1636080, 5133935, 7818133, 1782733, 7111545, 852554, 2594918, 4266609, 6498212, 4522996, 1089165, 6790276, 3361049, 1549395, 3471617, 1201373, 3583212, 2444993, 6898816, 6552876, 3749508, 4700392, 3043028, 4661823, 4024273, 3202206, 6052747, 3482436, 7703626, 1196435, 2983682, 7233760, 3922570, 7127966, 3482486, 8250148, 2031260, 7079700, 8231754, 5264529, 7149341, 2404310, 1144725, 7516909, 1057587, 6292480, 1254399, 3497441, 4594875, 3333922, 4146648, 4679828, 4409222, 5228574, 4755418], +[949258, 2730384, 6772847, 2325014, 1541422, 6739241, 1315386, 6582122, 8247226, 1516007, 7681105, 3495421, 7583492, 2787120, 5028909, 5730230, 674353, 723156, 389094, 3351610, 2786893, 3410207, 7182702, 3925753, 7951764, 1790268, 5635310, 645113, 1930471, 4062226, 6584283, 5481427, 7089053, 2369054, 801270, 179953, 5926968, 900145, 5009571, 4245071, 7083092, 4422199, 2154899, 796250, 2306127, 7448105, 462157, 679943, 3571850, 5211288, 3964723, 1627455, 2886677, 7617132, 602119, 430905, 1396450, 2029600, 3595332, 3813722, 7886677, 2912068, 4070594, 5181576, 2186384, 1241029, 5447972, 8372516, 3924601, 945220, 4932906, 2502416, 2775615, 3899458, 4648100, 7216349, 1205996, 728357, 4907391, 1755333, 8288424, 5405263, 1603919, 7322763, 2751873, 150240, 3975486, 3486651, 1136953, 8166892, 2507859, 1668704, 3127259, 6027470, 991426, 2376955, 5207746, 3782224, 1431460, 4525537, 1370748, 2285534, 8264842, 4236673, 973783, 383807, 1251015, 5669850, 7226309, 7425110, 2469729, 2467342, 1239313, 1387187, 5256387, 6627559, 1212356, 8251804, 1550772, 3513287, 5458448, 2264605, 4823016, 4557317, 7078610, 2053054, 4192231, 3227316, 7132330, 3272839, 8370103, 6602303, 335850, 5233248, 3599779, 3155861, 6733495, 5649995, 7002782, 8226502, 2725156, 4449116, 3079731, 5580074, 5070515, 4990059, 7101675, 1823455, 5454129, 3142142, 8316183, 864244, 6821266, 1798778, 6960057, 614214, 6982659, 2677947, 4603311, 6327689, 947688, 1704442, 6221412, 285918, 4855096, 7098856, 7477311, 4693713, 7890139, 7016105, 1274072, 2291314, 4652673, 6812173, 5371564, 811237, 6047427, 829086, 3766500, 8203302, 524923, 6855414, 5086194, 1667802, 6406852, 1700252, 3011561, 2459790, 7337118, 5266765, 5923131, 5345145, 1769304, 3407946, 4193648, 2343293, 1675996, 1034255, 5944434, 7369101, 4438442, 626711, 6819989, 2672185, 2947413, 4675667, 1354402, 4029472, 852777, 5790913, 538542, 283230, 7903200, 3193834, 5107166, 3751001, 3769409, 6626424, 6530476, 3892262, 7618977, 2347059, 469100, 6639510, 2402352, 5861211, 1857368, 301732, 5798050, 8179576, 3993177, 5858735, 5940629, 3834140, 6203750, 7220144, 7716386, 2555009, 2765433, 1619297, 6618898, 2655535, 7063753, 5594193, 6014760, 892863, 2385558, 6808267, 1764062, 1516629, 3211851, 4537452, 4272330, 6767391, 820445, 5089936], +[5612534, 1325268, 5996650, 7140063, 1681842, 2797563, 136924, 1441163, 5564941, 4546184, 6692952, 5526876, 8172948, 3295924, 2117538, 942003, 537856, 7130446, 4618022, 315386, 5202296, 2536365, 2704110, 1645595, 2279123, 2757187, 1668750, 6575889, 1281181, 7823110, 4362281, 1640345, 1988457, 4866317, 5400951, 6308463, 618928, 7153979, 4755408, 422177, 4053260, 8019893, 8294628, 588143, 164887, 6052838, 6115248, 8229314, 2349695, 1175441, 7884808, 4357051, 6924038, 5656605, 7385258, 7334903, 4659417, 2368368, 4528565, 4124112, 3473584, 6171739, 3440859, 6266883, 5575069, 7371746, 774184, 3667157, 8146068, 504476, 2382967, 1810183, 1230436, 4020527, 7340243, 7440581, 355702, 87707, 3697082, 4713199, 5835854, 4796085, 8239673, 4897032, 6552996, 6498093, 7484998, 8043160, 6023693, 239341, 2000746, 2523429, 4501539, 4520298, 1870911, 5221338, 2598281, 4125043, 4410591, 2646252, 3217045, 7376344, 222515, 4477742, 62539, 4935544, 4626514, 6460484, 6297138, 7450942, 6141738, 6893121, 4973650, 2982908, 2595687, 1826015, 3986993, 5414018, 3013135, 1764142, 441615, 6275680, 3536442, 492634, 4252513, 4168546, 5352734, 6655757, 1204944, 4916046, 3013786, 6148695, 7162577, 1431994, 6560207, 676899, 1109492, 1164898, 1501136, 7532915, 5515742, 2508355, 6822032, 1612574, 2724830, 203269, 2208209, 2750082, 5071785, 5501531, 6956869, 4144941, 2774710, 380242, 2835160, 6167947, 6797382, 5293807, 2204194, 4913562, 2977351, 7930993, 5604160, 5116348, 1812952, 53486, 1528512, 1799805, 5768274, 756496, 4929665, 1920089, 4803189, 5243810, 6365143, 6579175, 603136, 5064057, 2339349, 3389408, 2453871, 8285616, 4584387, 6411732, 5144173, 99388, 2131575, 1452525, 3983634, 969828, 4378282, 8205045, 3782624, 5089001, 6059932, 2887528, 6174773, 7344489, 5339932, 1741106, 910857, 5289849, 173524, 7838004, 7318043, 963318, 7274591, 5262196, 4586343, 2937409, 3123760, 3424644, 7560800, 6039850, 6069225, 2810, 2261513, 3839467, 2230671, 7042500, 5789684, 2042659, 4722213, 5552956, 6514200, 2308786, 3086463, 7469164, 4034604, 2761265, 7080266, 1229916, 7932884, 7653844, 6534803, 7686752, 4716211, 4585792, 7261430, 4577991, 8113268, 927711, 4290933, 5754768, 8104430, 6030500, 2190639, 140086, 5741957, 188256, 8289244, 1625491, 32795, 6031073, 3321604, 3522678]] + +w1: [[21, 19, 16, 42, 42, 24, 43, 21, 24, 10, 11, 43, 27, 27, 24, 18, 16, 11, 19, 28, 27, 6, 1, 11, 34, 41, 18, 42, 17, 30, 38, 18, 10, 11, 15, 38, 25, 24, 30, 38, 41, 13, 14, 33, 30, 13, 0, 16, 12, 16, 5, 11, 22, 16, 22, 38, 27, 14, 32, 15, 40, 29, 9, 37, 2, 30, 12, 39, 17, 19, 18, 33, 33, 39, 42, 4, 34, 35, 42, 34, 24, 8, 38, 42, 26, 32, 3, 8, 15, 8, 23, 28, 0, 37, 17, 32, 8, 35, 23, 28, 42, 12, 2, 34, 5, 3, 10, 9, 8, 32, 25, 14, 39, 21, 39, 5, 5, 11, 9, 40, 14, 22, 13, 38, 24, 30, 16, 15, 41, 15, 23, 9, 24, 39, 27, 10, 36, 12, 4, 17, 38, 0, 22, 29, 14, 43, 37, 42, 5, 6, 16, 35, 11, 23, 0, 25, 10, 14, 14, 25, 24, 41, 28, 27, 34, 16, 0, 25, 28, 26, 17, 1, 42, 2, 0, 6, 18, 21, 37, 12, 8, 30, 37, 30, 4, 4, 16, 39, 19, 5, 6, 8, 25, 35, 20, 20, 11, 28, 14, 20, 8, 17, 40, 42, 3, 10, 32, 7, 11, 15, 23, 39, 11, 23, 34, 42, 17, 5, 30, 11, 28, 4, 7, 12, 3, 8, 1, 1, 36, 32, 42, 12, 30, 0, 4, 34, 42, 17, 9, 39, 2, 17, 31, 28, 25, 29, 28, 12, 18, 43, 0, 20, 16, 0, 35, 8], +[5, 17, 13, 5, 23, 33, 6, 23, 26, 32, 34, 33, 39, 27, 12, 24, 17, 31, 11, 15, 33, 4, 22, 9, 1, 32, 12, 22, 33, 1, 7, 25, 42, 14, 5, 24, 1, 2, 34, 38, 6, 30, 39, 41, 9, 12, 0, 34, 12, 15, 18, 40, 12, 42, 43, 1, 33, 27, 34, 25, 9, 27, 26, 1, 21, 13, 19, 6, 23, 32, 3, 10, 34, 16, 42, 20, 28, 11, 8, 13, 7, 14, 35, 10, 6, 5, 7, 7, 23, 13, 22, 30, 27, 26, 7, 1, 25, 6, 11, 1, 12, 20, 3, 18, 4, 15, 43, 18, 1, 9, 19, 32, 17, 11, 20, 35, 6, 5, 11, 42, 17, 3, 41, 39, 10, 26, 27, 23, 42, 20, 17, 17, 7, 17, 3, 5, 29, 42, 0, 18, 43, 4, 4, 19, 8, 11, 37, 32, 14, 27, 22, 19, 31, 29, 17, 10, 26, 2, 7, 35, 6, 9, 12, 5, 36, 21, 22, 11, 17, 16, 23, 10, 41, 41, 21, 43, 37, 9, 16, 9, 8, 11, 13, 32, 34, 1, 27, 41, 39, 22, 37, 34, 40, 28, 32, 9, 20, 23, 33, 39, 24, 9, 27, 41, 9, 37, 4, 14, 22, 34, 24, 6, 36, 18, 8, 18, 6, 19, 13, 36, 34, 20, 25, 16, 24, 21, 17, 32, 18, 40, 6, 16, 38, 21, 37, 18, 43, 11, 37, 43, 28, 38, 13, 6, 39, 6, 33, 7, 18, 24, 18, 22, 25, 23, 27, 25], +[5, 14, 36, 12, 8, 35, 7, 35, 43, 8, 40, 18, 40, 15, 26, 30, 4, 4, 2, 18, 15, 18, 38, 21, 42, 9, 30, 3, 10, 21, 35, 29, 37, 12, 4, 1, 31, 5, 26, 22, 37, 23, 11, 4, 12, 39, 2, 4, 19, 27, 21, 9, 15, 40, 3, 2, 7, 11, 19, 20, 41, 15, 21, 27, 11, 7, 29, 0, 21, 5, 26, 13, 15, 20, 24, 38, 6, 4, 26, 9, 0, 28, 8, 38, 14, 1, 21, 18, 6, 43, 13, 9, 16, 32, 5, 12, 27, 20, 8, 24, 7, 12, 43, 22, 5, 2, 7, 30, 38, 39, 13, 13, 7, 7, 28, 35, 6, 43, 8, 18, 29, 12, 25, 24, 37, 11, 22, 17, 37, 17, 0, 35, 2, 27, 19, 17, 35, 30, 37, 43, 14, 23, 16, 29, 27, 26, 37, 10, 29, 16, 0, 5, 36, 9, 37, 3, 37, 14, 24, 33, 5, 9, 33, 2, 25, 37, 39, 25, 41, 37, 7, 12, 24, 36, 28, 4, 32, 4, 20, 43, 3, 36, 27, 9, 34, 9, 16, 13, 39, 28, 31, 28, 9, 18, 22, 12, 9, 5, 31, 39, 23, 3, 36, 14, 15, 25, 7, 21, 4, 30, 3, 1, 41, 17, 27, 20, 20, 35, 34, 20, 40, 12, 2, 35, 13, 31, 10, 2, 30, 43, 21, 31, 31, 20, 33, 38, 41, 13, 15, 9, 35, 14, 37, 29, 32, 5, 13, 36, 9, 8, 17, 24, 22, 36, 4, 27], +[29, 7, 31, 37, 9, 15, 1, 8, 29, 24, 35, 29, 43, 17, 11, 5, 3, 37, 24, 2, 27, 13, 14, 9, 12, 14, 9, 35, 7, 41, 23, 9, 10, 26, 28, 33, 3, 38, 25, 2, 21, 42, 0, 3, 1, 32, 32, 43, 12, 6, 41, 23, 36, 30, 39, 39, 24, 12, 24, 22, 18, 32, 18, 33, 29, 39, 4, 19, 43, 3, 13, 10, 6, 21, 39, 39, 2, 0, 19, 25, 31, 25, 43, 26, 34, 34, 39, 42, 32, 1, 11, 13, 24, 24, 10, 27, 14, 22, 23, 14, 17, 39, 1, 24, 0, 26, 24, 34, 33, 39, 32, 36, 26, 16, 14, 10, 21, 28, 16, 9, 2, 33, 19, 3, 22, 22, 28, 35, 6, 26, 16, 32, 38, 8, 34, 4, 6, 6, 8, 40, 29, 13, 36, 8, 14, 1, 12, 14, 27, 29, 37, 22, 15, 2, 15, 32, 36, 28, 12, 26, 16, 42, 29, 27, 10, 0, 8, 9, 30, 4, 26, 10, 25, 28, 33, 35, 3, 27, 12, 18, 13, 0, 24, 34, 27, 1, 11, 8, 21, 5, 23, 43, 20, 27, 32, 15, 32, 39, 28, 9, 5, 28, 1, 41, 38, 5, 38, 28, 24, 15, 16, 18, 40, 32, 32, 0, 12, 20, 12, 37, 30, 11, 25, 29, 34, 12, 16, 39, 21, 14, 37, 6, 42, 40, 34, 40, 25, 24, 38, 24, 43, 5, 23, 30, 43, 32, 12, 1, 30, 1, 0, 9, 0, 32, 17, 18]] +w1Encode: D504A92AB65698B2ACDB8649D032719B112C622AA991674ACAF29819E69969E3845E03400C542C1664999B033E68979482C79CD12485E1A912E2A88A1862AA1A38200F7271401981C878712A2388C5A024089839677516C592A08ED59898073DE97325D8B929244344266075CE5AAA85018DCB05648AE36458CA6D2204649C1605AA001852553288577A04019D536120D948510BE7504884AA83021ECB739DCB25AA51E12D1C713003120424A8321E40886A949C42F47159C731D20A5010302245D41457685C1A2886E7C660D1B73C21612501C858617064AA536081209A8677A6090388CC23A18CBA06E12666C9A60555331917382822A452DC823487332A46711C5763799B760499B1040C3548C4B34A413281D1428D46B1A8D1909E8AB65D2A15454734149D0A482B414CC85282CE664D5F17299A708C46C21464652D117429695AAD650225C8D28062B0A5A7558A280726D4159E58B2A5494938968819A48448C6D490229541581581126A4066554AEB52AE9CD918A7111E122659D9B565854332C8788C2B824AE8A3790421488F64566AE20D4A35762543045FA159E5B510CC2910D356250F3A08C73251E9536DCBD10155A1350F859906A1250087984E5049C6DA241058301B856007B35A857078E6D934C7C18DC68A481D9361E5624565048CC23645A357AECE05759B562A1D041464520EA5838545120A59796669793018C9112041AD03B92562023527F77189643149F19DD7403A4F765484370469B451D4285228238CCDA708DE5A7D1F159A69F324A3537660D19009126116496CDDF195C913201D36766BB4144389095BE3248C938C477A258AC685839909950A0C0108AE8C915EA4779E188359122885DD494CEBD02846759E0230655FB66AA278AA60B03418A66C8E7539D11960808689E109921AE42815072542380D96C58D8606812622128681A05D43224EC0385B575A8FF08024C76890DA6D0A80241EA12919178EC3C6480D80895BB0205571ADD4063EE0C9250517A4666172D803492808020CC594DE927522039D95531A2A2AA21966626B71792BC8045E0024001849 + +cTilde: 71F7304848C9CF3A3BF5D462212B4725AC2117EE7E420270B25A58AF64729F7F +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, 0, -1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0] +cHat: [2060547, 2894636, 7854481, 3440460, 7408659, 7382511, 5753344, 7781768, 2569291, 5243091, 2508709, 98183, 7503405, 5855988, 5869363, 5431530, 3037109, 7040069, 4007987, 2558559, 5084072, 1121500, 2697270, 18930, 3455081, 2104488, 5486704, 4241590, 37711, 293768, 4053025, 4046341, 151387, 4400314, 1520689, 6661986, 4837455, 1987406, 5471255, 2398824, 5127474, 7291398, 810761, 2961828, 2976666, 14098, 1052468, 530915, 8087371, 1987589, 7468860, 5562550, 6069977, 405104, 6642566, 1432384, 6609915, 1114816, 3960605, 3520057, 7340203, 2615446, 5576690, 3588022, 7789971, 2329418, 6933375, 3326484, 5851931, 3765238, 1896988, 1112603, 7933813, 3564497, 7408935, 1348227, 8303007, 8148475, 1245175, 3840545, 4658220, 3845842, 7700782, 1334559, 3941281, 10085, 1618946, 2955767, 4589793, 3357080, 1603372, 3813239, 1790598, 8203716, 5547118, 5891871, 4034933, 4087417, 327350, 7755857, 4588875, 1098896, 812366, 2605200, 4971038, 2468348, 4837595, 5246139, 8310537, 6150263, 2610782, 6959320, 3630409, 8218449, 746511, 4784359, 1511540, 6929872, 2227873, 8111629, 2418331, 3895825, 740820, 3528240, 5015989, 4267510, 964977, 2569987, 7256883, 104590, 6575926, 3440328, 3659561, 3064331, 5988045, 6876436, 487414, 6805382, 1486151, 2912397, 2922991, 4958233, 7191685, 5001155, 420676, 3144110, 5771745, 306900, 4834534, 4550188, 7184525, 147935, 1854366, 3928521, 6591880, 1819398, 4736605, 6598766, 1627967, 2866657, 230487, 2490315, 7728564, 7952, 5701309, 6971169, 6900309, 7788825, 8102722, 3361077, 2030792, 795592, 5034542, 5497978, 7031061, 2085726, 3127851, 7322167, 8315444, 698629, 126497, 3627660, 6749191, 3918046, 5309870, 63570, 1210389, 4109730, 1802042, 3398839, 4438183, 6666873, 5883393, 7748759, 2199185, 7382899, 437678, 7266699, 1283604, 1332716, 4242910, 7003425, 1256013, 7745076, 1378481, 7597851, 4030073, 3968181, 3247517, 6336187, 4030801, 8128186, 6121167, 2430798, 1927348, 4319467, 3590488, 2016726, 6831074, 7076816, 3415906, 6541545, 3640538, 7453750, 8069489, 2360352, 4528264, 7911306, 2522286, 4766400, 7451410, 5929412, 8355526, 2772155, 5076047, 7145703, 5192019, 609356, 7282120, 5783468, 76837, 5363984, 6043085, 130560, 5036927, 6288616, 1167524, 8298475, 4576907, 648583, 3224319, 2288040, 6811346, 1326194, 6580441, 3865432] +cs1: [[7, 6, 8380414, 8380407, 9, 8380413, 0, 4, 8380415, 4, 8380411, 0, 11, 8380409, 2, 8380412, 8380416, 8380414, 2, 8380409, 8, 14, 8380401, 5, 8380411, 8380400, 1, 8380415, 8380403, 8380414, 1, 6, 8380409, 1, 0, 8380413, 8380396, 6, 11, 0, 10, 8380415, 11, 8380416, 8380414, 12, 8380413, 8380409, 12, 1, 0, 8380412, 4, 3, 8380415, 8, 3, 16, 8, 8380414, 8380415, 8380411, 8380416, 6, 13, 13, 13, 5, 7, 7, 8380416, 7, 8, 2, 8380411, 8380408, 8380406, 8380414, 8380407, 17, 8380413, 3, 11, 8380411, 8380406, 5, 4, 8380406, 9, 8380407, 9, 8380400, 8380400, 8380414, 15, 8380398, 23, 4, 8380404, 1, 2, 8380415, 8380410, 8380408, 8380395, 0, 2, 8380413, 9, 6, 8380408, 9, 2, 8, 18, 10, 12, 8380412, 8, 8380412, 4, 1, 8380410, 9, 8380416, 3, 8380393, 8, 10, 3, 3, 3, 8380415, 6, 8380408, 8380414, 8380409, 8380413, 8380411, 8380413, 1, 8380400, 8380413, 8380407, 8380416, 14, 2, 0, 8380406, 0, 8380416, 1, 8380412, 8380405, 8380401, 8380410, 8380404, 5, 9, 6, 8380415, 8380409, 6, 8380401, 1, 8380405, 1, 18, 8380401, 11, 2, 8380416, 8380411, 3, 8380395, 19, 8380413, 1, 11, 1, 0, 8, 8380404, 8380408, 8380413, 8380398, 8, 8380409, 9, 5, 14, 8380412, 11, 8380416, 6, 10, 1, 8380405, 8380411, 8380412, 8380403, 6, 11, 21, 8380413, 2, 8380396, 7, 8380412, 8380397, 5, 8380412, 8380413, 1, 8380416, 8380410, 8380414, 8380415, 6, 15, 7, 12, 0, 13, 8380414, 11, 1, 1, 1, 1, 4, 8380400, 5, 8380412, 1, 8380412, 11, 8, 8380407, 9, 11, 8380412, 0, 8380407, 5, 8, 8380416, 14, 8380408, 8380414, 8380403, 1, 8380406, 8380416, 4, 8380404], +[3, 5, 8380411, 8380411, 1, 5, 8380402, 8380416, 0, 15, 8380416, 8380411, 14, 8380411, 4, 14, 8380414, 8, 8380413, 8380399, 7, 11, 8380406, 8380415, 8380413, 17, 8380410, 2, 8380408, 8, 2, 9, 8380415, 8380409, 8380415, 0, 3, 8380406, 9, 8380411, 8380414, 8380403, 6, 8380412, 8380412, 7, 1, 10, 1, 8380402, 8380413, 3, 0, 8380408, 8380398, 7, 8380416, 8, 9, 13, 25, 1, 12, 6, 4, 8380402, 8380404, 15, 0, 4, 1, 8380406, 0, 1, 8380401, 0, 5, 10, 14, 12, 4, 14, 8380412, 8380413, 6, 8380397, 20, 13, 8380394, 0, 8380415, 8380398, 8380411, 8380392, 8380415, 8380408, 8380404, 8380407, 3, 3, 8, 8380411, 5, 7, 2, 8380411, 8380412, 0, 10, 6, 8380405, 21, 0, 8380396, 7, 8380399, 8380412, 7, 8380406, 8380412, 8380413, 8380407, 8380407, 1, 6, 20, 8380415, 8380412, 15, 0, 8380416, 0, 8380409, 8380400, 1, 8380412, 8380408, 8380408, 12, 8380413, 0, 8380416, 8380408, 8380413, 8380416, 8380410, 8380412, 8380408, 8380409, 3, 4, 6, 8380416, 6, 12, 21, 2, 8380407, 5, 8380416, 7, 8380404, 8380413, 8380415, 8380407, 8380413, 8, 8380412, 11, 8380411, 8380416, 11, 8380411, 0, 8380414, 8, 8380409, 8380406, 8380412, 8380401, 6, 0, 9, 4, 8380408, 8380398, 11, 8380400, 1, 4, 4, 9, 8, 6, 2, 3, 5, 4, 9, 9, 9, 4, 8380404, 7, 8380411, 8, 4, 7, 9, 0, 14, 8, 8380414, 8380409, 8, 8380414, 6, 8, 10, 8380405, 8, 7, 8380416, 4, 1, 10, 8380416, 2, 10, 8380402, 0, 2, 11, 8380397, 8380414, 8380412, 5, 5, 5, 8380408, 7, 8380416, 3, 8380411, 1, 6, 8380405, 8380414, 19, 3, 4, 8380399, 5, 9, 7, 1], +[8380412, 8380411, 8380414, 3, 12, 8380406, 10, 3, 8380410, 8380403, 8380409, 8380410, 8380412, 8380402, 8380414, 8380414, 8380413, 13, 11, 0, 8380416, 8380416, 7, 0, 8380407, 5, 6, 8380402, 8380416, 8380411, 8380415, 3, 12, 8380397, 8380411, 8380415, 2, 8380414, 8, 1, 13, 8380416, 8380406, 10, 8380415, 3, 6, 8380404, 3, 10, 8380405, 8380416, 2, 8380407, 7, 2, 8, 4, 3, 8380408, 10, 0, 8380416, 17, 8380407, 8380409, 8380411, 1, 7, 9, 6, 8380412, 8380414, 3, 14, 8380413, 1, 14, 11, 8380412, 5, 8380402, 8380411, 10, 2, 8380409, 6, 2, 8380415, 8380416, 8380414, 8380415, 3, 8380404, 0, 0, 4, 8380411, 8, 6, 3, 0, 8380412, 8380402, 8380407, 8380397, 4, 4, 8380415, 6, 3, 13, 4, 5, 11, 0, 11, 2, 8380409, 10, 8380412, 3, 16, 8380408, 2, 8380414, 8380415, 5, 8380412, 19, 8, 8380413, 5, 3, 8380416, 15, 1, 8380411, 8380410, 8380404, 8380416, 8380412, 1, 4, 8380411, 2, 8380413, 8380398, 11, 1, 8380399, 18, 8380411, 8380416, 5, 8380410, 8380413, 12, 8380401, 9, 4, 8380399, 12, 0, 8380399, 13, 8380414, 0, 12, 8380416, 8380408, 8, 1, 2, 10, 3, 8380399, 7, 8380414, 8380414, 9, 4, 8380410, 3, 8380409, 8380402, 14, 8380416, 11, 8380406, 8380405, 8380416, 8380398, 4, 1, 8380400, 5, 2, 8380410, 5, 8380406, 15, 2, 8380407, 1, 14, 1, 8380408, 8380412, 4, 7, 8380412, 8380400, 14, 6, 8380408, 8380415, 5, 12, 2, 8380412, 4, 8380394, 14, 14, 1, 13, 11, 8380416, 8380411, 3, 8380407, 14, 8380411, 8380409, 8380410, 8, 0, 8380412, 8, 8380407, 1, 8380406, 8380400, 8380406, 16, 8380406, 3, 3, 4, 8380411, 8380406, 11, 3, 8380411, 8380412], +[17, 0, 2, 8380409, 8380415, 8380415, 8380404, 9, 8380416, 15, 8380406, 8380410, 8380406, 8380413, 8380412, 5, 8380412, 7, 2, 8380414, 12, 6, 8380413, 11, 8380412, 8380413, 28, 8380402, 8380416, 14, 8380401, 2, 2, 8380404, 10, 8380400, 8380416, 12, 8380415, 2, 8380411, 8380416, 8380407, 11, 8380414, 17, 14, 2, 9, 7, 8380409, 8380409, 4, 9, 8380401, 10, 18, 8380410, 8380414, 8380411, 2, 8380416, 8380401, 8380411, 13, 8380409, 8380410, 8380407, 8380416, 8380414, 8380416, 8380412, 1, 8380409, 13, 8380416, 8380411, 22, 8380406, 8380408, 1, 8380408, 3, 7, 8380406, 8380405, 0, 4, 8380396, 8380408, 2, 8380410, 8380409, 3, 6, 7, 9, 1, 8380412, 3, 2, 1, 6, 8380415, 8, 8, 7, 3, 8380414, 13, 8380394, 8380414, 8, 10, 2, 8380413, 1, 8380406, 4, 8380411, 0, 8380408, 0, 9, 8380407, 4, 2, 8380413, 6, 8380407, 3, 8380407, 8380410, 17, 8380407, 8380413, 1, 8380405, 7, 2, 7, 8380415, 8380402, 8380402, 8380416, 8380408, 8380410, 5, 8380404, 3, 4, 8380402, 1, 1, 8380409, 7, 12, 5, 2, 8380401, 3, 3, 8380402, 9, 13, 8380411, 15, 0, 8380406, 4, 3, 8380404, 21, 2, 8380412, 9, 8380407, 8380402, 7, 8380408, 8380416, 8380416, 8380408, 8380407, 11, 8380415, 8380411, 0, 8380415, 8380415, 8380412, 22, 1, 8380416, 6, 7, 8380416, 0, 8380404, 6, 9, 4, 0, 3, 7, 8380411, 0, 8380413, 8380412, 8380413, 8380403, 8380411, 8380406, 8380399, 8380414, 8380410, 4, 9, 13, 8380410, 6, 1, 8380416, 13, 8380410, 8380405, 8380409, 11, 8380404, 8380409, 16, 8380412, 8380411, 8380413, 8380411, 4, 3, 14, 8380411, 8, 5, 8380413, 0, 4, 8380411, 7, 8380416, 1, 3, 5, 0, 8380414, 9, 8380413, 1, 8380407]] +cs2: [[8380416, 4, 4, 8380413, 8380415, 3, 8380400, 4, 8380414, 8, 8380415, 8380410, 9, 1, 0, 6, 10, 8, 17, 8380410, 4, 8380401, 1, 8380414, 8380416, 8380401, 8380412, 8380401, 8380401, 8380399, 8380415, 13, 0, 15, 13, 5, 9, 8380416, 8380400, 8380415, 8380403, 8380411, 12, 8380407, 2, 8380412, 8380411, 11, 8380415, 1, 3, 8380412, 5, 8, 8380404, 1, 8380410, 3, 0, 8380406, 3, 8380400, 8380410, 8380416, 0, 11, 1, 8380415, 16, 4, 8380413, 1, 8380406, 1, 4, 1, 8380414, 2, 8380404, 6, 3, 8380411, 2, 8380416, 3, 4, 8380416, 8380413, 4, 5, 8380413, 3, 8380415, 8380402, 8380412, 14, 8380413, 2, 5, 8380401, 8380409, 0, 8380409, 4, 8380409, 9, 4, 8380411, 8, 11, 8380413, 8380410, 8380413, 8380406, 3, 0, 8380407, 9, 8380400, 5, 2, 8380410, 6, 8380415, 5, 7, 8, 17, 3, 8380412, 8380410, 8380414, 8380407, 8380409, 8380409, 8380408, 6, 0, 6, 23, 8380414, 13, 8380397, 2, 8380416, 8380408, 19, 15, 8380397, 1, 8380414, 8380405, 8380410, 8380412, 8380403, 5, 8380416, 8380411, 9, 4, 4, 8380413, 12, 8380407, 8380414, 2, 8380402, 2, 8380416, 8380410, 5, 8380413, 8, 8380409, 8380406, 1, 4, 8380413, 8380416, 1, 8380400, 4, 2, 5, 8380406, 4, 8380415, 15, 13, 6, 8380414, 3, 8380414, 8380406, 3, 8380410, 8380410, 6, 13, 8380414, 8380413, 8380412, 8380411, 9, 8380413, 5, 8380412, 1, 8380403, 8380415, 8380413, 8380410, 8380408, 15, 13, 8, 8380408, 8380415, 2, 1, 8380412, 8, 8380403, 8380411, 5, 8380403, 8380410, 8380402, 8380403, 8380415, 8380416, 6, 13, 11, 8380414, 8, 0, 8380411, 8380416, 4, 16, 8380415, 8380416, 17, 8380411, 8380410, 8380415, 8380402, 8380410, 5, 8380407, 8380416, 0, 6, 3, 6], +[8380406, 8380411, 3, 8380410, 12, 8380414, 8380415, 3, 1, 0, 8, 0, 8380414, 27, 8380408, 8380415, 8380416, 8380405, 8380408, 8380411, 8380412, 6, 8380415, 8380409, 8380414, 1, 6, 8380411, 4, 8380406, 6, 8380405, 8380415, 8380416, 8380409, 23, 8380406, 8380415, 8380411, 8380406, 8380409, 8380408, 8380412, 8380416, 8380413, 8380404, 3, 3, 2, 8380398, 8380416, 8380413, 10, 8380401, 3, 8380409, 6, 8380407, 8380415, 8, 8380404, 8380410, 4, 1, 16, 8380414, 8380408, 8, 8380416, 8380401, 1, 8380404, 8380408, 10, 8380404, 8380415, 15, 8380400, 16, 3, 8380405, 5, 8380398, 8380410, 2, 1, 8380414, 7, 5, 8380406, 1, 8380411, 8380405, 0, 1, 11, 8380408, 8380405, 3, 8380416, 8380406, 8380400, 8, 8380407, 8380411, 6, 8380410, 17, 2, 8380406, 8380415, 6, 8380410, 2, 0, 9, 8380413, 3, 8380414, 15, 8380414, 6, 8380416, 8380416, 8380408, 2, 8380406, 8380411, 8380415, 3, 1, 5, 9, 8380416, 16, 8380410, 1, 20, 11, 20, 3, 8380408, 16, 8380413, 8380396, 2, 1, 8380406, 8380408, 8, 15, 14, 8380414, 8380401, 13, 8380411, 8380407, 19, 0, 10, 5, 6, 8380416, 14, 1, 4, 6, 8380411, 8380415, 8380408, 8380410, 8380414, 8380413, 8380406, 8380416, 8380401, 8380414, 1, 8380406, 8380408, 3, 6, 12, 14, 9, 2, 3, 8, 8380412, 6, 10, 8380413, 8380411, 1, 8380405, 5, 8380401, 8380403, 9, 8380404, 8380414, 5, 11, 8380409, 4, 8380415, 14, 1, 8380408, 19, 8380401, 9, 1, 0, 8380412, 8380414, 8380397, 4, 8380412, 8380415, 8380404, 1, 8380412, 8380415, 8380413, 8380410, 0, 8380398, 10, 7, 8380401, 8380415, 3, 21, 3, 8380404, 8380411, 5, 8380406, 8380411, 8380404, 7, 3, 8380411, 8380412, 4, 1, 8380389, 8380411, 8380411, 4, 8380416, 8380398, 4, 3, 8380413], +[8380414, 8380404, 1, 2, 8380404, 8380415, 20, 7, 14, 8380403, 1, 8380415, 19, 0, 8380410, 8380408, 8380402, 8380413, 8380409, 8380415, 1, 8380402, 8380413, 1, 4, 9, 8380416, 8380407, 8380415, 10, 4, 8380402, 8380413, 4, 16, 1, 9, 8380416, 8380410, 8380412, 8380400, 8380409, 3, 8380411, 8380407, 8380412, 5, 8380413, 8380390, 9, 10, 8380400, 7, 8380410, 8, 11, 2, 4, 1, 8380413, 8380412, 13, 6, 3, 8380402, 8380406, 5, 8380413, 4, 8380406, 8380410, 8380416, 8, 21, 0, 8380410, 14, 10, 8, 1, 7, 7, 4, 0, 8380411, 15, 8380411, 6, 8380416, 7, 1, 8380415, 2, 12, 3, 6, 8380398, 15, 8380409, 8, 12, 8380409, 7, 3, 5, 22, 2, 8380412, 8380405, 8380409, 12, 13, 8380410, 8380415, 10, 3, 13, 8380410, 8380406, 11, 8380410, 3, 1, 1, 4, 9, 8380408, 19, 5, 7, 8, 4, 10, 12, 2, 8380395, 0, 6, 8380414, 8380411, 1, 12, 7, 11, 1, 8380410, 6, 8380412, 2, 22, 4, 8380406, 8380415, 8380414, 8380409, 8380409, 3, 8380412, 11, 8380409, 8380406, 4, 8380412, 11, 1, 8380406, 4, 8, 8380412, 1, 5, 0, 8380408, 5, 8380398, 8380414, 8380411, 5, 8380407, 11, 5, 8380416, 8380412, 9, 9, 14, 2, 14, 8380412, 8380414, 8380406, 8380412, 8380405, 3, 8380409, 18, 1, 16, 8380409, 6, 9, 4, 8, 8380402, 5, 8380416, 8380416, 5, 8380409, 9, 3, 8380402, 8380407, 8380416, 8380412, 8380413, 4, 8380412, 8380414, 2, 8380402, 12, 0, 8380411, 9, 8380407, 15, 4, 9, 8, 1, 8380404, 8380410, 8380414, 11, 3, 8380409, 8380413, 12, 8380408, 18, 13, 8380398, 19, 8380416, 4, 4, 8380407, 20, 8380413, 1, 6, 30, 12, 6, 1], +[8380413, 8380402, 2, 5, 12, 8380398, 1, 21, 3, 8380411, 11, 7, 8, 0, 8380407, 11, 8380414, 8380416, 2, 3, 8380409, 8380414, 8380407, 4, 23, 8380401, 8380412, 6, 12, 8380413, 13, 8380404, 5, 3, 8, 16, 0, 6, 8380410, 7, 5, 4, 8380413, 8380406, 2, 8380412, 11, 8380405, 11, 3, 8380414, 3, 8380400, 8380398, 27, 7, 8380415, 2, 8380410, 0, 8380413, 8380415, 8380416, 14, 8380407, 12, 9, 8380410, 0, 8380415, 8380406, 9, 8380411, 8380406, 13, 3, 5, 8380409, 8380412, 8380410, 8380411, 8380409, 8380410, 0, 8380409, 10, 8, 8380412, 5, 5, 8380412, 6, 7, 9, 5, 4, 6, 8380406, 12, 8380399, 6, 5, 7, 8380415, 8380407, 8380405, 15, 1, 8380401, 4, 8380406, 15, 0, 8380415, 8380408, 6, 8380414, 6, 8380414, 16, 18, 1, 5, 8380412, 8, 8380415, 8380408, 13, 14, 8380404, 1, 8380414, 8380416, 8, 8380410, 8380403, 8380402, 5, 8380412, 8380416, 0, 8, 8380415, 8380404, 20, 7, 2, 11, 18, 8380411, 0, 8380411, 8380413, 8380416, 8380416, 8380405, 8380390, 4, 8380416, 1, 8380393, 8380413, 5, 12, 8380408, 8, 8380412, 7, 21, 2, 14, 0, 0, 1, 8380413, 24, 15, 8380403, 4, 6, 8380411, 8380412, 8380412, 11, 8380415, 15, 8380393, 8380395, 8380408, 1, 8, 5, 12, 0, 8380415, 9, 0, 7, 11, 5, 14, 4, 8380410, 4, 8380412, 11, 8380411, 8380415, 8380378, 0, 8380405, 4, 8380415, 5, 6, 5, 8380397, 3, 6, 6, 8380416, 2, 4, 8380409, 9, 8380401, 9, 11, 8380405, 9, 4, 12, 8380408, 8380416, 8380408, 8380411, 8380409, 8380404, 8380411, 8380412, 8380403, 14, 3, 8, 16, 8380415, 8380413, 3, 1, 23, 7, 3, 4, 7, 8380386, 19]] +z: [[8364336, 8331574, 63047, 50114, 8262922, 29489, 110219, 8369413, 8286403, 29534, 41180, 8369367, 8276382, 8377025, 8335187, 8311830, 14327, 17025, 8311238, 8311109, 3301, 70666, 8378280, 8380044, 117455, 72966, 8262554, 67361, 8345188, 51091, 8357599, 51877, 86123, 101060, 30470, 8314136, 8364885, 34293, 8338079, 8344589, 8362741, 42513, 1538, 126596, 17080, 8279933, 8261434, 8294650, 8292458, 41954, 99297, 8313360, 8309204, 8303023, 8319565, 8370165, 10484, 8377219, 8340975, 8332160, 8290439, 8311936, 8374906, 89910, 8254952, 8251590, 48806, 128377, 8347529, 8350812, 8259583, 29172, 21321, 8269952, 108574, 59987, 115288, 50446, 29171, 8291994, 8346926, 117382, 61535, 124637, 8297633, 96065, 58746, 8376529, 109806, 8348472, 8320152, 64976, 8306174, 47445, 87525, 8315711, 34624, 52803, 8316474, 8298741, 112411, 30913, 8274340, 77529, 70540, 8326828, 91152, 107991, 8374914, 55213, 8319633, 80800, 1355, 81593, 82445, 33876, 8259686, 61864, 32371, 42320, 8334011, 8377641, 8374650, 8295968, 24695, 30012, 8270787, 110443, 8251835, 8377118, 8264453, 22287, 8305555, 65517, 49679, 8254929, 45749, 35097, 8291040, 40416, 8267022, 85829, 84162, 37358, 127855, 8255888, 63831, 8282890, 8273690, 8278560, 8324516, 8348044, 8347982, 14324, 7813, 114849, 8366230, 8329809, 103276, 8273674, 8313989, 83403, 8327270, 67835, 8298479, 13615, 8297358, 50553, 33185, 102491, 8327840, 8273999, 30101, 31622, 8297271, 19534, 8277667, 8319730, 21304, 8286459, 108080, 123569, 80722, 8377036, 8311269, 8339760, 8362525, 123051, 8325356, 32878, 8254748, 8289721, 41090, 8301515, 8287824, 4539, 54297, 8285015, 38958, 2296, 130731, 8316950, 82946, 66475, 8368766, 8340733, 19799, 8338660, 8374539, 8342911, 68567, 51804, 126577, 28065, 87228, 112461, 8334938, 8273634, 64632, 8374893, 18769, 8289306, 84360, 25690, 8294040, 46310, 27926, 8362332, 8264666, 8354315, 8364230, 28251, 92463, 51399, 25309, 4320, 106985, 128254, 8342615, 8355780, 8292097, 22648, 2459, 85279, 12366, 5364, 8309651, 8362620, 8358362, 14435, 91784, 8365695, 8317707, 4023, 8346800, 47919], +[8331043, 8306837, 8334968, 8352949, 26061, 118801, 8253463, 8298828, 97485, 8346394, 8279007, 8360013, 8374145, 130445, 108506, 15646, 33949, 113917, 107684, 84929, 121780, 8317438, 8372595, 8302315, 8295822, 6455, 34096, 112904, 8376622, 27509, 73555, 8313130, 8275836, 87542, 8256494, 12997, 8338447, 8270554, 8310065, 84453, 3592, 8309807, 8359853, 64066, 127673, 15901, 41891, 8369631, 54695, 8300009, 64506, 8250167, 8290098, 41574, 41385, 61943, 43700, 8318536, 8333015, 8304254, 8377597, 6937, 1051, 8379716, 130571, 104499, 94103, 114868, 107037, 122314, 28506, 66654, 18175, 85315, 8259011, 8376570, 40016, 63713, 39846, 8354612, 109729, 89347, 14218, 8277799, 8361726, 23904, 25231, 8302935, 117878, 8368867, 8347568, 8297795, 8259598, 8283402, 8379407, 23783, 8305470, 92958, 101372, 109096, 8341055, 8319146, 93400, 80416, 53525, 8263018, 8292171, 8368619, 119503, 81463, 8371742, 8273075, 73739, 65461, 8357163, 9023, 70704, 8340832, 8275322, 8264377, 8302525, 8316568, 14564, 8378789, 8306211, 83465, 77481, 103276, 17876, 8377361, 8292938, 37252, 102943, 8364395, 11804, 8305905, 8321637, 8338670, 125891, 8362217, 31660, 8276995, 126948, 8295400, 8285164, 8327702, 77366, 8336061, 94665, 8360872, 8317128, 15357, 93993, 8265351, 107493, 62071, 120494, 129783, 54135, 44803, 6450, 8337465, 8296419, 8335653, 92165, 4166, 8362416, 8279174, 8287716, 36725, 8253895, 8305442, 87448, 8254082, 8337446, 8314634, 8358462, 21873, 8340678, 124159, 8359267, 8283163, 95863, 8375681, 8304013, 8375075, 11575, 8350712, 8348366, 8305817, 54510, 8262237, 83404, 8298745, 8364004, 8306192, 8275179, 8288144, 8366943, 8298434, 41322, 97985, 8349657, 8279443, 8307933, 8355406, 8280714, 112048, 2305, 8290630, 21166, 42085, 46311, 60575, 38445, 8267040, 51402, 48730, 8296526, 100598, 40957, 110241, 8299433, 8256782, 8303093, 20007, 8366710, 117955, 8371426, 73413, 8370510, 30884, 8259979, 52389, 8254235, 88650, 8355346, 8366497, 57781, 8292471, 79419, 104938, 8274645, 48682, 8287691, 83626, 8265246, 50439, 33669, 36702, 40626, 64067, 8349545, 98319, 8322838, 8323937], +[106073, 8345595, 58144, 11662, 8337679, 62406, 8253665, 8259856, 8311260, 8379653, 119066, 72705, 8258467, 14148, 8307921, 8330622, 120015, 8356068, 8322227, 119464, 99308, 34090, 8341688, 8361338, 8353096, 50477, 8376529, 8288240, 33885, 2143, 48128, 67763, 119559, 8286230, 23901, 8253265, 8347944, 8302767, 66629, 2348, 71612, 60677, 8307699, 8288675, 41580, 103344, 88673, 28474, 115536, 119426, 107511, 8330185, 115543, 8364560, 50356, 8365136, 94176, 8339483, 8288326, 8359104, 8260060, 8249823, 103948, 8368544, 8280277, 8277879, 61809, 8353491, 43870, 8321221, 123129, 8263183, 8273606, 44618, 8380100, 120515, 8355091, 119268, 17997, 85394, 8354323, 21481, 8295942, 91345, 71580, 8351294, 8290117, 46192, 8273591, 34175, 93635, 105922, 8375487, 8349501, 8276035, 8354683, 92955, 8308893, 94605, 8339608, 127102, 8366391, 8357878, 58036, 8344099, 29850, 8372654, 8298816, 123750, 8305090, 98313, 8261025, 8261146, 8294708, 8301875, 42308, 124662, 8330809, 30776, 12899, 8615, 1893, 8263149, 5513, 8301039, 8262748, 8276016, 127070, 104075, 69279, 1777, 8332312, 8266563, 27527, 71853, 113347, 128814, 80299, 5831, 97064, 8328750, 55491, 73529, 68565, 8272214, 8346380, 8287459, 8251562, 8315717, 8370657, 31661, 8268320, 8326293, 74078, 8358674, 128808, 45467, 8270303, 37522, 8363980, 8375150, 8255745, 89981, 99201, 8332829, 125387, 113820, 92266, 8302562, 8292604, 8312193, 53440, 8272197, 8253117, 8275401, 61664, 67162, 98468, 126596, 87428, 8250156, 8380248, 44623, 11381, 32071, 35705, 29686, 76351, 8326797, 65153, 8324569, 11974, 80934, 8327129, 1031, 28985, 8298502, 129013, 95342, 8313425, 77516, 8361350, 8259057, 8317810, 8272419, 8371127, 8260786, 111068, 64847, 8339665, 8254965, 8370209, 36569, 8342477, 8257953, 1420, 10837, 90937, 8339734, 5751, 64047, 44528, 35277, 8370451, 126738, 8263323, 63095, 8288148, 8363503, 8358026, 102761, 411, 125543, 52185, 39065, 8299437, 8312084, 8358871, 25278, 8375597, 8276386, 8270646, 114689, 8289714, 10392, 8297562, 96818, 8267028, 8254845, 81968, 8336401, 8294083, 70453, 8285475, 8351614, 8261145], +[8281860, 8301654, 8292709, 8351447, 8300942, 8329564, 8317583, 8375213, 76004, 8369332, 72952, 78051, 8310465, 8325445, 8328702, 81374, 8258219, 8369357, 8347957, 20784, 104053, 37146, 8356986, 110176, 127714, 8299810, 6682, 117966, 19691, 76894, 8288474, 8333736, 8352444, 8264572, 50149, 44356, 2178, 2887, 8345115, 6862, 116561, 119653, 82401, 8320531, 11917, 111351, 34950, 8361184, 18021, 108194, 8339344, 8564, 8331083, 80792, 8347304, 173, 69142, 8323535, 87420, 8265696, 29115, 55758, 8367271, 8256104, 129351, 8342639, 771, 28624, 20945, 91572, 8271131, 46010, 44492, 99910, 8357051, 29550, 122946, 93691, 8309224, 42566, 122675, 101620, 8334155, 87628, 75047, 38480, 43221, 123142, 123009, 117261, 8307594, 8348694, 8360176, 8294929, 8316567, 40168, 28807, 8327424, 121508, 64820, 106287, 8250092, 8309204, 8357412, 8278320, 81992, 8330219, 8254625, 8342969, 83792, 8370632, 40535, 8356425, 8326480, 8262866, 130590, 8278192, 85684, 66417, 99519, 8289715, 8304490, 8340823, 8292046, 8309768, 8292049, 8338031, 8283593, 8305618, 8372035, 4907, 8365720, 83090, 8278400, 8339419, 88589, 8329121, 85886, 8255190, 63543, 41157, 37516, 8255726, 8351839, 8371029, 8325931, 18798, 8350446, 115333, 8302445, 8377704, 8324677, 69347, 127947, 69310, 73747, 15252, 55913, 8340545, 8349696, 8347127, 8258335, 8257345, 95557, 77202, 8362883, 93252, 12570, 8281356, 40464, 8354748, 8360832, 8303467, 82405, 8340590, 94407, 47397, 112093, 8325499, 30100, 8349847, 8361547, 8283315, 8260168, 15728, 8291049, 8309797, 49075, 96813, 8342620, 40936, 99384, 129507, 8300502, 47404, 8266115, 10388, 109649, 8342714, 8328521, 81863, 95901, 122787, 8260907, 8367842, 65348, 112057, 8352063, 8316074, 69648, 37917, 65655, 8270430, 8357467, 75156, 103350, 8296578, 8313121, 8370688, 42970, 8255414, 34601, 39431, 60535, 117672, 8307960, 95946, 8362764, 62899, 8282093, 48716, 8338520, 8285594, 8296991, 43889, 39725, 123337, 8338741, 112531, 8315640, 63204, 8379958, 8324676, 60816, 3093, 41214, 8333944, 8291341, 8310041, 52392, 8330814, 8251436, 50398, 115455, 35718, 8325553]] +||z||: 130731, ||z|| check passed +r0: [[90809, -85331, -6872, -87971, -61443, -72388, 57329, 19531, -81482, 32361, 39040, 64174, -48089, 80270, 5111, -24452, -72079, 45828, 9775, -51670, -32643, 57465, 4698, 13749, 4329, 46153, -95195, -42984, -43898, -2723, -56844, 25371, -82798, 14997, 21270, -75137, 16647, 14289, -23750, -22947, 58784, -60303, 84267, -85352, 5090, 79765, -23760, 12900, -66685, -66287, -71546, -84836, 50647, -14142, -27889, 43918, -91904, 39698, -57207, -67878, -75795, 63237, 82183, 70417, 15676, -41822, -74173, -50458, -45979, -29123, 29895, 93858, -3077, 86416, 93777, -17366, 54972, 14061, -40017, -7378, -16526, 55806, 54365, -59424, 67693, 16107, 3529, -14538, 31190, -40323, -6358, 26789, -28112, -63890, 20364, 80884, -38772, -63204, 45207, 55327, -75128, 10420, -23137, 49921, 39562, -29599, -13557, -30622, -87581, -1150, -58008, -30422, 15118, -48738, 10145, -7951, 57074, 68985, 62138, 86470, -15065, 75064, 23358, -8616, -64240, 46967, -4637, -1316, 54646, -33959, -10296, -24182, -88005, 34771, 89528, 94095, 91265, -69029, 92355, 60427, 44070, 67955, 92120, 10420, -17802, 80805, 871, 80801, -6774, -81434, 57673, 81694, -35005, -72126, 7913, -69640, 66033, -93392, -17977, 12423, -87825, -14943, -65375, -24148, 64445, -39053, -29215, 5661, -85276, -9997, -61391, -2224, 36533, 87974, -80798, 58181, -32141, 71734, -36991, 48374, -8842, 13619, 50530, 89421, -14404, -33822, -9410, -6158, -2572, -73817, -69708, -52130, -82879, 73165, 14602, 76507, 46892, 71597, 72648, -19197, -28411, -45431, 62478, -25899, -92552, -32587, 70105, -90729, -82397, -32971, -61284, -75949, -14606, -47608, -87935, -54322, -51577, 69185, -50864, 17831, -91587, 70217, 41611, -76634, -20650, 35088, -72192, 49229, -38195, -81158, -32426, -90626, 16696, -7009, 61868, 60737, -63529, 61179, -12683, -90109, -62708, -59248, -25508, -82668, -34136, -83279, -68162, -11871, 80756, 29729, -27573, 73028, 5900, -64377, -47664, 38369], +[-73371, 11675, 70702, -50969, -61559, 1422, -68908, 87971, -78240, 17339, 28993, 28098, -54793, 24310, -56147, 28808, -61154, 14521, 15338, 79186, 87744, -93914, -49686, 11636, 14180, -49660, -32966, 65089, -22433, -26693, 79714, 60007, -64033, 41727, -18355, -71109, -51609, 27704, 26427, 25219, 20621, -86605, -25285, 52034, 44375, 59649, -23440, 87633, 27716, -29529, -25542, -4381, -8526, 57010, -82854, 22571, 53412, 91355, 23688, -12610, -45215, 56017, 58736, -69686, -40632, 45734, 51826, 62016, -18803, -60032, -76552, -32759, -35567, 69870, 50008, 19222, 40810, -63717, 77872, 56562, 48626, 82170, -34730, 30193, -64227, -89627, -29054, 25634, 60098, -44040, 37174, -16261, 85982, 87436, 76754, 66569, -94898, 59335, -85091, -58956, 32497, 36293, -19117, 31502, 75156, -71063, 72123, 31830, -22161, 46463, 19155, -70604, -46106, 55648, -82704, 91530, 7518, -3086, 7279, -32373, -48933, 811, -90564, 65188, -12866, -20181, -29779, 49870, 7305, -63251, 15617, -63221, 20610, -83196, -62843, -63384, -69083, -43550, 24443, -62797, 92223, 15684, 83474, 18819, -70459, -19372, 49393, 44754, 55838, 82741, 50805, -43588, 40711, -46864, -39498, 82763, -85904, -68729, 26724, 80543, 12425, 87533, -43406, -46288, -64393, 59562, 39731, 15451, 94453, -82539, 67232, -87763, -62216, 3943, -79324, -78121, 44069, -46718, 40493, 49864, -73257, -51950, -33374, -89158, 82609, -73508, -47854, 38218, 79573, -94814, -23396, -83519, -53003, -13483, 64164, 17683, -92125, 10906, 12905, 45054, -87448, -78101, -8604, 9117, 68553, 64379, 90684, -71579, 76410, 22417, -48124, -53628, -66429, -67303, 25688, 43268, 58609, -35608, -31034, 42114, 77113, -59773, -61203, -4394, 90691, 24536, -35682, -42082, 54074, 85059, 53667, -63740, -3875, -77195, 80795, 54147, 60202, -63849, 32543, 41808, -68450, -88298, -71725, 1947, 88818, -85201, 7167, -78821, 69095, 23745, -94434, -43559, -81753, 28546, 86043, -6178], +[-3059, 63901, -83858, 39444, 17723, 73003, -17882, -84125, 57260, -7691, 62544, 67071, -35087, -69840, 76852, 16319, -87488, -38696, 8174, -76740, -70068, -18130, -54926, -73992, -47728, 76083, -78609, 73731, 25833, 62472, -81961, -42014, 41889, 83482, 39398, -10512, 22575, -52174, 57514, 54868, 35941, 41535, 59792, 34400, 20569, 20014, 81224, -81909, -46939, 68751, -35031, -86704, 29710, -1421, 30719, 49966, 63200, -65508, -23485, 4446, 77658, 55095, 70844, 39045, 91295, -92208, -75489, -7897, -75147, -7089, -19151, 26385, -81353, 90157, 76964, -21276, 63198, -33509, -44681, 41156, -92000, 72264, 80203, 85131, 85383, -40239, -24252, 58293, -5830, -23067, 31826, -45470, 79833, -67390, 39103, 91381, 65237, -27071, -92244, -45607, 37488, -26, 74883, 46462, 21458, 2857, -82235, -44065, -11311, -2978, -6315, -8703, -93928, 53941, -76615, -38684, 69559, 61859, 27071, 84924, -65001, -20966, 61415, -13820, 31438, -42059, 2032, -10591, 85157, 34944, -10322, -63941, -45088, 90708, -19039, -82005, 67255, -63931, -44383, 36556, 58659, 68432, 32300, 56607, -72014, 38002, 54501, -81180, -69329, 94696, -64238, -88065, -35436, 84605, -87103, 42830, -64512, 11456, 32164, 42385, -4621, -9738, -63895, -95021, 93495, 51699, 49211, -67895, 81120, -31064, -59181, 5746, 81546, -44536, 38591, 49384, -47415, 67225, -42770, 13339, -46474, -1289, -56329, -46383, -68933, -13938, -35865, -16256, -90973, -66224, 18758, 12158, 55140, -20409, 3448, 57707, -38181, 81919, 40058, -59001, 57761, 55315, -36723, 5704, 90448, -85932, 21155, 29723, 90929, 76984, -32853, 92781, 94186, -44053, -35357, -58275, -39875, -39811, 54703, 82980, 432, 61479, 88172, -26724, -73689, -43163, -47287, -79200, 84121, -10384, -6568, -45636, 36252, 24863, -81573, -17491, -92630, 78981, -91539, -94870, -47360, -10974, 16604, 70718, -80087, -59461, -90478, -48427, 49866, -7079, -26038, -33690, 82092, -89325, 58583, -52593], +[89082, -7965, 92264, 92890, -32346, -59378, -53541, -82570, 41482, -24946, 26701, 3413, -17012, 58036, 22444, -10328, -33533, 83279, 46884, -65545, 59776, 60336, 37624, -68585, -6468, 90707, -45421, -90357, -52079, 14090, -18404, -73818, 83812, -85750, 67951, 23135, 47536, -83659, -6185, 41242, 53511, 20401, -85785, 16762, -25579, -42005, 20389, 39374, 64116, 32654, 75787, -23624, 67351, -57296, -42865, -93200, 88283, 82798, -42564, -66096, 45236, 76893, 12508, -18443, 51623, -56362, 12319, 48348, -43884, -66914, -93054, -94466, 87658, 20794, -87866, 12482, -25231, 87715, 78271, -48394, -68524, 34493, 49728, -55032, 77228, 22307, 56894, 43677, -71160, 48872, -94353, 47391, -69604, -50847, -33734, 78806, -68221, -65154, 29907, -20226, -20849, -51757, 32044, -93392, 62549, -16508, 55363, -15293, 11842, 22842, 46901, 36402, 21586, -64514, -70800, -78631, -12748, 81020, -34286, 49950, 60669, -9633, -82379, -78753, 62297, -21660, 19751, -10496, 62146, -36005, -33639, 53850, -75054, -91726, 84438, -84943, -33277, 22109, -22571, -85644, -7714, 32315, -34670, 88875, 58314, 12798, -77361, 83575, -70761, -21919, -90299, -45261, -82246, -685, -21799, 73111, -59295, -39189, -81373, -38503, -70049, -68491, 80699, -26192, -91679, 53478, 4805, 85622, 54333, -5362, -22413, 15449, 41589, -89183, 79835, -87089, 31729, -78457, 53777, -38950, -22155, -94796, 13256, -64055, 1647, -91091, 36495, -71165, -16101, 17507, -2398, 15088, -26668, -53527, -34914, 30559, 79925, -83614, 6929, 26925, -41477, -43147, -16933, 28976, 80416, 10987, 36965, -70794, 15246, 80449, 76348, -3712, -57758, -55003, -25629, 2805, -24035, 30184, -54903, -4674, 75765, -52447, -39391, 29508, 38415, 23234, 39030, 41057, 34872, 94760, 33094, 87120, -66595, 35285, 59036, 68198, -45381, 14669, 23804, 6860, -76670, -24623, -89742, 40840, -85538, -64346, -94925, -50381, 28036, -2231, -91180, -88688, 32791, -63782, 83747, 94307]] +||r0||95195, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-35856, 100566, -14374, 35613, 78314, 74701, -68861, -11498, -81857, -114895, 8053, 102615, -47381, 126072, -39741, 25364, -50875, -4747, 52739, -5240, 40645, -125455, -112468, 10450, -16624, -112135, 108416, -87745, -105760, -32919, 93641, 70790, -95754, -20911, 65171, 21257, -14518, 95949, -72944, -21707, -93938, -98646, -37379, -68655, -2777, 121431, -92948, -20494, 106902, 53026, -26479, -38875, -126960, -69739, 55542, 33760, -106805, 75208, 57168, 119341, -111485, 48166, -21358, 47220, 85069, 18934, -1550, -72120, 63848, 94286, -40064, 11149, -18863, 85419, -78881, -48766, -88540, -109890, -96398, 90323, -109027, -17624, 28805, 49470, 107223, 196, -11912, 6174, -123298, 19269, 57662, -49388, -122990, -2894, -116444, -799, 31384, -122924, -111821, -103914, -99494, 109098, -7347, -115744, 33953, 91317, 49138, 77842, -54727, 100704, -45127, -95971, 53357, -83523, 73976, -124340, -11043, -30007, 35702, -85207, -110722, 17181, -35939, -17931, -27527, -53766, 27688, 106854, -99029, 77932, -104312, -33010, -66310, 81064, 130169, -114256, -50012, 120547, 84054, -24061, -14258, -68721, 83643, 98168, -49244, 17456, 81354, -39770, 100344, 9826, 2490, 37171, -14094, 96854, -29327, 19928, -17850, 67207, -81336, 40776, 40274, -41066, 27049, -98753, 19912, 7681, -13100, -110920, -95222, 19703, -45413, 1684, 84505, 75230, -30398, -81443, 55112, 130811, -110504, -59114, 21600, 93018, 2111, 116846, 8012, -22716, 11251, -98705, -32484, 88285, 68880, -101524, 32970, -123423, -81920, 87982, -65775, -27067, -29780, 130551, 42244, -9451, -35391, 54345, 127909, 99235, 46490, -58844, 66491, 96896, 6775, -43672, 116208, 100682, -36734, 20314, -43537, 88570, 39679, 66537, -61661, -34382, -123351, 89874, 130633, 47477, 41196, 123923, -110879, -90079, 46785, 98669, -17714, -7601, 12244, -108710, -18054, 20337, 112679, 48990, 64975, -63691, 63580, 94970, 6932, -13464, -43213, 130298, -115151, -29911, 83029, -81218, 30805, -47543, -123994, -38821], +[-111990, 94237, -64944, 77717, -26420, -60505, -89393, 62117, -73177, 101268, -67769, 82827, -98032, -32964, 63485, -30907, 119010, -17789, 99176, -100130, -101589, 86169, 124707, 118422, -105699, 102260, 88773, -52819, -72693, 52368, 90101, 34257, 36844, 128170, 73967, -1743, -11515, -128139, -75014, 62071, 34649, -30268, -115126, 31185, 120285, 84705, 11735, 34359, 26252, -38090, 28087, -54278, -119973, 100298, -84411, 34657, -15625, 71315, -51166, -121687, 31319, 113294, 53924, 31417, 54104, 123301, 53759, -127092, 121042, 41609, -116599, -73386, 129158, -37883, 29635, -125289, -99981, 11463, 12909, 23337, -51857, 28832, 46670, -76017, -80804, 105849, 77218, -84749, 82697, 50241, -100535, 34856, -53108, -102805, -92274, 59175, 28142, 94157, 93742, -40686, -64877, -115131, 108113, -4188, -46470, -126386, 127310, -122212, 106937, 23429, -19610, -49433, -79151, -123939, -79226, 126815, 57434, -8989, -34032, -54907, 77709, -107732, 90846, -57203, -16985, 129904, -67059, 96687, 41564, -21128, -77189, -99122, 41953, -64704, 66904, -64232, 98075, 52633, -16500, 97127, -8561, 84538, 74314, -71268, -72629, -37605, -90521, 73654, 125343, 97573, -92248, -44399, -114931, -33921, -23378, 34883, -67843, 59065, 105976, -92343, 68280, -71473, 93960, -130772, 13256, 79190, 120708, 13358, 100400, 56733, 116589, -87608, 55280, -2230, -16048, -83880, 15807, -14052, -37273, -1169, -77202, -29304, 123854, 118052, -83346, 100740, -64004, 53840, 128913, -83858, -101546, 115154, 128279, -31188, -40070, -88374, 86303, 763, -121842, -113404, -79128, -91044, -29685, -108822, 117168, 121605, -31651, 49165, -112320, 21595, -66156, 124643, -13115, -29972, 126021, 64819, 128619, 71581, -60995, 32877, 2486, 12613, -112590, -124249, 117223, 128706, 111247, 87723, 11776, -46749, -61485, 101660, 7285, 60612, -123243, 58668, 2606, 96657, 44036, -127226, -99674, -66596, -48226, -12563, 37339, 110603, -26485, -19032, -121046, 16221, -105986, -1928, -58282, -3757, -10092, 17798], +[10026, 90470, -68398, 21982, 17740, -25856, -122111, 4958, 16625, 6465, -72079, 38922, 99008, 73760, 9867, 71270, -105066, -72697, 29773, -112688, -81372, 67177, 51149, 50131, 102040, 8899, 58020, -118213, 10913, 8769, -97269, -14411, -116759, -62181, -101115, 25134, 9355, 45405, -20370, -119016, 27102, -17873, 107687, 72568, -77707, -7230, 124914, 37364, -128266, 17514, -86429, -31056, -114699, -67248, 68522, -76902, 43484, 86494, 91453, 38891, -80849, 43194, -31445, 88811, -111151, 81238, -37737, 112942, -53445, -125338, 72023, 88618, 25449, -72511, -31696, 127222, 102732, -56833, 96070, -57960, 89017, 96311, 107975, -77440, -119418, 82465, 47982, 42526, 65282, -128819, 29140, 130675, 109780, 74636, 118240, 50372, -19323, 79089, -108463, -79184, -60384, -51668, 87679, 57075, 53864, 64401, 93064, -30607, 62598, -58356, -19030, -68952, -42438, 18961, -3605, -11275, -20147, -82081, 21202, 50578, -127342, -117147, 118813, -129786, -21256, -102494, -109525, 3281, 80003, -22643, 99428, -96321, 79998, -71182, 122039, 13579, 40023, 46746, 92152, 86934, 56944, 5336, 119161, 45834, 90134, 114180, 23049, 35601, -37088, -38325, -81566, 17474, 108658, 31255, 23252, -121361, 37481, 27001, 71114, 80717, 124598, 37617, 17669, 25635, 65287, -51785, -32640, -99417, 103657, -74175, 2083, -63029, 1108, -103096, -24672, -67446, -94366, 56298, -18845, -112662, -113750, 72016, 44829, 34809, -76815, -24322, 4657, -39434, 57659, -74700, 35139, 35670, -82192, 5054, -113370, 30464, -90573, 86286, 84244, -92260, 55149, -111444, 17889, 56983, 57211, -105485, 3487, 94463, -38769, -33606, 62857, 45220, 23673, -86738, 72338, 10122, -9996, 67105, 77031, -9301, 99702, -40687, -108255, -94718, -47001, 110631, -93427, -3577, -84055, 77333, 1518, 86811, 43108, -86691, -5179, -29417, 21971, -10365, -103620, 32660, 110887, 5473, -10411, 129950, 111334, 114463, 104492, 92090, -44562, 33496, 41473, 124986, -75192, -86327, -84551, -95975], +[-89065, -109845, -4640, 57194, -11980, -1440, -131014, -52997, -96533, 83017, -126961, -52874, -71315, -66255, -79451, 95683, -61002, -5002, 113541, -14199, 74598, 61477, 27184, 73610, -64516, -83804, -108134, -71913, -62955, -104365, 120493, -75444, 51227, -58207, 73043, -121894, 83836, 100984, 72174, -56435, 42627, 14282, -43559, 50582, -44834, -120354, -110589, 94038, -52794, 107129, -126000, 1652, 96625, 56669, -87131, -40539, -15533, 10800, 99454, -13845, -85366, 35720, 70873, -1156, -48608, -98234, 93929, 76917, 93794, -37981, -24855, -109389, -104323, -98198, 81779, -82808, 61341, 118999, -109494, 124853, 7831, 111560, -124973, -11335, 56105, 9760, -96141, -78333, -105895, -97910, -126707, -81243, 33843, -5352, 60065, -108592, -102823, -15611, 16265, 83698, -71859, -117182, -95822, 32564, 106741, 97808, 18748, -31139, -60378, -6708, 23450, 69482, -39824, 36752, 121927, 23397, -101126, 74349, -50480, 34147, -50924, -58778, 102957, -13613, -108802, -49749, -72002, -29739, 111595, -58168, 116267, -16099, 123703, -112661, -30538, 20579, 117778, 125302, -12677, -33154, -87579, 32963, -112848, 63885, 13296, 59886, -49672, -66840, -37519, 125915, -70366, -6122, 20602, 76526, -99870, -49110, -37278, -120653, 36702, 100051, -9422, -116118, 7560, 59371, -85926, -12749, -31013, 11477, 56403, -101552, 86241, -47411, -1554, 7736, 80672, 112732, 95931, 130457, 16995, 57089, 2916, 120328, -71915, -123066, 47998, 61006, 3449, -56662, -104528, 49555, 51207, -80996, -88200, -121041, -73657, -120931, -74864, 3909, 80638, 65989, -38928, 116168, -83531, 41723, 112825, -53045, 36997, -71644, 74672, -28727, -82641, -76708, -69356, 123864, 123348, -48685, 56697, -83826, -96922, -35533, -111904, -5488, -68507, 6325, 6804, -127157, -77408, -118449, 86748, -31533, -26800, -64641, 111628, -73179, -106596, 23700, 99193, -22584, 36349, 53765, -103831, 118114, -119580, 40619, 75801, 64284, 57757, -75105, -122403, 101983, 77248, 107812, -28732, -48704, 43621, -122238]] +NTT(y): [[3119785, 3641509, 718111, 7355761, 4868534, 3413221, 796547, 1461664, 6885692, 4425989, 3241682, 5657911, 413453, 6636162, 397716, 6413695, 4561034, 6586013, 4943477, 8372576, 136880, 3959897, 5285385, 6315330, 5631314, 7800617, 6934428, 6128206, 4109390, 6096414, 1930864, 1466406, 5197056, 977017, 2633200, 3496669, 340444, 2249148, 7241240, 6280990, 3123654, 6306438, 6406577, 2666953, 2829338, 4414121, 5341592, 5057999, 967220, 7691079, 2117057, 6248415, 6789565, 2954195, 8272513, 107703, 2338524, 1414713, 7423581, 1410477, 3285472, 365429, 4750456, 5293660, 6030300, 7002826, 5975562, 4472526, 5976954, 6610167, 4787109, 3249526, 5628049, 1937085, 8240890, 2903905, 5658094, 3498116, 2881409, 4462440, 2361170, 2441875, 619736, 2147355, 7188360, 8040589, 6392968, 6759672, 1922776, 2196017, 3758207, 7616849, 4538699, 5650956, 7098671, 1396329, 859435, 1324837, 1694368, 7137300, 4321551, 2369413, 7585863, 5857050, 5689620, 7321706, 1070323, 7566855, 6189671, 7935646, 1665074, 1647785, 5621608, 2490510, 2309891, 844932, 4972432, 4384350, 7167911, 6391586, 3267362, 302532, 7939626, 3723379, 3699435, 6836779, 5804981, 1584198, 1126818, 7148103, 269203, 5585839, 6323498, 6962580, 7915272, 7676682, 8308273, 5415962, 926464, 7517087, 7895429, 1794500, 2589434, 7070717, 5156460, 3818637, 6510529, 7147720, 2641780, 227933, 1643319, 3579736, 2576426, 3138498, 5123947, 3476935, 16155, 7153434, 900062, 4742967, 5997769, 5152479, 7303586, 6158220, 1745666, 3549188, 7739598, 5611433, 7660052, 450870, 5278592, 3212589, 694934, 4729508, 5396174, 1522477, 5588451, 4491808, 6836454, 5566688, 888478, 3965303, 7596185, 7974786, 5444814, 5361203, 2084020, 6591770, 4849796, 5643858, 3189183, 5287804, 6103384, 2860886, 2917610, 4591218, 5831427, 1397666, 4931768, 1377377, 2705098, 7658249, 8181111, 5240497, 4960908, 2032563, 5846813, 3330151, 1927676, 1374230, 6957050, 472204, 384208, 5671976, 2809533, 3574682, 3934590, 4240195, 4575708, 6926210, 183343, 6869763, 4851143, 6358128, 2500056, 1261349, 1139950, 3095722, 1956343, 1151636, 4344379, 4423621, 4468392, 3835088, 1818193, 3847451, 983475, 3289111, 5941224, 4403596, 1564147, 3398308, 3763426, 2854224, 881246, 5791591, 4200813, 7341451, 3835238, 1802705, 5443656, 4711237, 2995108, 4457392, 3156219, 4256290], +[3588749, 4255217, 2625142, 7996295, 4175494, 7175465, 7333393, 766593, 5081127, 4091245, 7819354, 5424005, 7720647, 5365254, 1295765, 285673, 4360571, 1052544, 5713232, 3566090, 4790873, 1313667, 4901638, 1911530, 2690059, 807263, 6257578, 5686307, 8366908, 326642, 5525069, 1029265, 668511, 4165193, 5036804, 6113170, 5859574, 5299036, 5694378, 6557696, 6505828, 881444, 5311755, 3148090, 1320656, 3960958, 5658018, 1732199, 5461194, 5861165, 7108282, 6575069, 6017903, 2880712, 698486, 2865937, 8202170, 2247381, 1373491, 8248181, 158123, 7673233, 4374420, 3418116, 3949409, 3995570, 6979371, 3110271, 2185607, 4461078, 4297949, 1326640, 5965094, 3532044, 948471, 4883569, 7395508, 1491592, 6571230, 8214260, 734948, 826176, 1055212, 3333095, 1869473, 3945868, 2153432, 2391334, 4345569, 4812726, 3675290, 381019, 4283300, 5401117, 1369883, 2632125, 3018270, 199042, 7572218, 2111244, 7567627, 8104775, 7925065, 190471, 7773089, 139926, 5456489, 5236088, 3522971, 7103303, 182265, 4970697, 6015808, 583375, 771038, 6113889, 5963257, 2026457, 8308555, 5383154, 2610854, 2968965, 2215234, 5174395, 8075576, 1967251, 358598, 1823741, 1104771, 8324941, 4649328, 5144220, 6649494, 1019093, 2105654, 5992318, 1571462, 297756, 4451745, 2083851, 3469576, 4192, 8069680, 3964152, 7737297, 5627140, 7027478, 6004696, 172230, 3648905, 5884012, 1687659, 6863391, 1484508, 7503194, 5649363, 1831579, 7938317, 4575248, 179163, 3904124, 5571117, 6021301, 5135216, 484487, 7591321, 5460127, 901174, 4683570, 7551890, 5931068, 1619367, 3059280, 4979031, 6106919, 5045744, 4436704, 4231918, 2240388, 4949934, 5028524, 7336445, 958674, 7487420, 7743117, 740754, 6352697, 4626299, 2530595, 7864353, 184644, 5435213, 5690244, 3139198, 4848633, 5478745, 3297360, 8052739, 471158, 7042709, 7913273, 8013979, 4042050, 3905440, 7072486, 4813016, 4994696, 2254918, 656482, 7602894, 3234448, 6769776, 1012303, 7125117, 6647800, 3362671, 6137878, 6683313, 1432822, 5331159, 197786, 7317700, 2976394, 5950027, 3808158, 1936187, 4970856, 5143000, 3028280, 6933192, 2595097, 5701916, 3425095, 8149254, 7208210, 5800342, 5347379, 4255994, 2568855, 6389076, 1464928, 4734642, 3892899, 375115, 5536261, 3277568, 3089782, 7627215, 8151803, 5048821, 3666851, 3130165, 3501602, 3094483, 6536451, 3210175], +[7939053, 2381588, 1322720, 1589025, 1918749, 2664572, 632498, 152577, 665880, 5507589, 716575, 506728, 1100838, 2451796, 1928303, 8353662, 8215647, 4141926, 5715109, 4307318, 7289705, 5431097, 2681607, 101184, 99196, 5005929, 4683096, 2704018, 5974837, 8240424, 1364915, 4191803, 2905927, 7864316, 2602870, 8234095, 441656, 7413680, 1496309, 6049083, 7650221, 5561832, 1265155, 4080353, 2134673, 5760929, 6429585, 1924062, 2168403, 3473033, 5065505, 1283930, 569794, 6765619, 2242146, 671228, 7031527, 1441270, 3798825, 7527595, 4820457, 1568915, 2727255, 7364018, 6540111, 7832007, 6232903, 7419696, 5698620, 6060971, 6505216, 244630, 6015347, 4550372, 1768779, 5715119, 1113794, 3271892, 1834358, 456774, 7077153, 6462281, 1026878, 1940455, 5589424, 2023066, 7399285, 5674390, 8084980, 5810467, 2423003, 6424543, 4804561, 6488805, 3029067, 684900, 1988271, 1836124, 7191172, 4168376, 6619454, 753091, 2573565, 4110530, 1140297, 6727888, 2038003, 1898624, 4279966, 1448538, 1080016, 5682527, 4287461, 7850649, 5225932, 7704669, 7095852, 2000868, 6984486, 3145899, 4579522, 5529353, 376164, 71940, 6158887, 913350, 6025795, 75220, 4800983, 6272930, 8310163, 5091112, 1307049, 272107, 3556422, 6487399, 6427135, 897855, 637249, 4882040, 886458, 2529139, 1422742, 7131998, 5257278, 2439248, 420708, 7989679, 1131139, 1824186, 92154, 556069, 8259193, 7179610, 5787952, 725165, 1311914, 814201, 3999759, 1453510, 5631673, 2404120, 842082, 8189318, 2797763, 7661387, 5305947, 4774988, 7753611, 6380104, 6583933, 7296889, 5509219, 5368164, 7076032, 3343396, 5698153, 8034675, 1855601, 1369181, 5458292, 3235140, 2022097, 7554789, 7669998, 6113612, 4795394, 7761554, 7177681, 1323217, 3207429, 2957654, 2443618, 4975013, 2305155, 3340987, 3375871, 5607225, 6415356, 1866209, 6443274, 4731529, 1372532, 1847019, 5722303, 2631089, 8178199, 3352166, 6727066, 6110329, 8011283, 4170542, 5125964, 7630258, 360023, 2837692, 2166686, 7142785, 584599, 143590, 5740728, 3284866, 3903477, 2332134, 1782586, 8099224, 5517238, 4069923, 709784, 8005342, 4664366, 2830521, 6855393, 1250885, 7959099, 6019986, 5964405, 1867608, 5320344, 7983272, 1028996, 6630057, 1149090, 410783, 726826, 6389966, 7320215, 3904216, 8377942, 7294573, 139761, 8114431, 7363316, 5231923, 6687364, 4942408], +[4112827, 5745554, 2362536, 2114223, 2873321, 6664021, 3742890, 6355616, 681750, 8019167, 7249153, 4207884, 4751101, 8242103, 3496854, 6052560, 2156079, 981446, 1248617, 6172301, 1879973, 5939416, 7669575, 5842380, 2231117, 7366717, 350720, 3660588, 1173971, 2325973, 226240, 4629771, 3211422, 595796, 8157020, 6173770, 403188, 7820723, 8153222, 4040051, 4515427, 789703, 7906508, 4370259, 2764908, 2938877, 1780396, 4645726, 788103, 3583712, 3740408, 5820597, 3130646, 695963, 5171940, 7237608, 2368384, 6848697, 6133665, 6612361, 2296504, 3302228, 7192625, 1177597, 1937806, 642731, 597847, 2103132, 7915091, 3626490, 1565229, 5465786, 1215946, 1335132, 3341163, 4094988, 1726442, 7014021, 121098, 824153, 2610276, 47103, 342608, 7486550, 1962903, 7206604, 785005, 2258685, 4215366, 2559843, 1870947, 8018669, 113664, 2830768, 4374346, 5086943, 1184492, 5141399, 6854192, 2059951, 32318, 587754, 3504765, 7895132, 5815756, 3415947, 6078991, 2025284, 4546621, 983253, 7469995, 4972568, 5475705, 5465113, 68766, 6090992, 4268368, 2824525, 3455702, 6542707, 849327, 4149528, 916225, 5449846, 1212725, 2553874, 718030, 2320353, 25016, 1620373, 2524948, 4491368, 993873, 5964311, 1902849, 1268730, 7477357, 2243608, 561516, 6983458, 5054464, 7101057, 6980241, 2649537, 2344329, 5309887, 2861997, 2934404, 6687143, 4070204, 2157395, 4870518, 8265351, 7655026, 7386842, 233582, 984933, 1665758, 7152848, 3303242, 253436, 7986998, 7691272, 3661292, 4834259, 3226774, 2221446, 7941132, 3478987, 3600232, 1376940, 6048990, 5105731, 5462493, 4808469, 7599541, 3751765, 6678105, 5384398, 4343969, 4930646, 4834375, 1473688, 7131286, 5890796, 1294411, 5325699, 287181, 7773476, 4527177, 6711346, 2673043, 1520976, 6143119, 568097, 5730817, 6215844, 6127152, 1283990, 4115317, 427362, 4472695, 3814098, 845379, 6953416, 6249547, 2951013, 6198972, 6715366, 7555969, 7604146, 3426234, 649431, 1917934, 8208770, 6525800, 841301, 1006064, 7029270, 4214915, 8204752, 248586, 1985358, 6475951, 5138283, 6588099, 8270138, 4510382, 3497955, 1408758, 5345948, 7850408, 5956581, 5314652, 2681764, 4265122, 61180, 3780526, 8249303, 1851647, 7365197, 1989913, 8332639, 4278465, 5314674, 767464, 951826, 4810536, 558667, 1861325, 4055742, 8361788, 5983705, 4444348, 1176018, 4343256]] +aHat * NTT(y): [[4119157, 4505652, 6897916, 4806244, 6670663, 3722624, 6104592, 410456, 6916294, 1351624, 1471249, 7817884, 1022432, 2906279, 229580, 4350585, 1067397, 1948128, 2964589, 5087708, 3419462, 1322155, 2258645, 3016736, 743432, 5070822, 6864104, 3603348, 2828350, 2551459, 6506617, 342362, 1697036, 3656135, 3725520, 1936311, 1811542, 5025592, 6414861, 6641330, 2561047, 4460921, 7923163, 3940117, 96960, 6633996, 5044919, 910287, 4079595, 6024926, 999115, 3401211, 7454097, 419511, 8351401, 695330, 484307, 2986984, 1560856, 514990, 1019197, 1210749, 6190490, 6643871, 192851, 1090678, 2361826, 5617893, 466884, 7796394, 1634530, 8125279, 4664464, 3376259, 2872831, 2282116, 1286962, 3414088, 492311, 5610102, 300434, 292767, 5462202, 1855131, 7991776, 961117, 690518, 4861974, 5708212, 1995637, 2025076, 2592836, 1883793, 2316580, 6444558, 6824472, 3735581, 1148536, 2122728, 1920873, 7987369, 2834593, 5849081, 3521554, 577512, 3139555, 3323671, 1864187, 4031715, 4365034, 5080152, 2353044, 8072169, 5048399, 7712099, 857933, 6597723, 2133892, 7874803, 8183691, 3617268, 158021, 7965930, 282924, 2344956, 1661149, 427167, 5194716, 4274496, 2503434, 5563801, 4949620, 2336803, 5144226, 6003183, 1148224, 4348142, 5936750, 3982248, 4761760, 2594613, 8028987, 27396, 4700121, 5419741, 1259523, 2407545, 2710748, 2490245, 340966, 1760188, 3606892, 5125161, 7420018, 7858511, 5399261, 2081486, 3582517, 5635873, 8210355, 4630905, 7209680, 8209364, 2122756, 2950324, 7384872, 7508136, 3072473, 2654368, 3913844, 4926780, 411832, 1831493, 5436967, 7710061, 1773156, 5217831, 7057492, 222078, 5498717, 3073989, 6977501, 1376190, 3696526, 6565670, 4479326, 745986, 898781, 5645806, 4466322, 1543955, 3162952, 3491918, 2269407, 6546127, 1465149, 3843614, 6604748, 4517157, 3026459, 1396261, 7186079, 5187880, 3389548, 6347979, 6050083, 6537771, 7594187, 3478860, 2848109, 6367670, 2832544, 6083968, 1424056, 1963831, 1131804, 8046601, 5960408, 6077217, 4758134, 4639554, 5483511, 7919951, 5552396, 477197, 8362596, 4249042, 3932859, 1819050, 7173639, 5646100, 7127582, 7082270, 6113124, 3874179, 8194942, 7012009, 530398, 2714013, 657657, 1346900, 6937646, 2203649, 2150717, 1750135, 1974680, 1171662, 2920905, 2226089, 5558024, 2979495, 4108312, 481351, 3810077, 6065179, 2498009], +[8093950, 55583, 3701896, 4030076, 2848480, 5667392, 1783043, 7223515, 4740291, 536960, 6246059, 3982897, 8097265, 5767501, 1553492, 7079737, 86457, 7533717, 4615213, 701407, 6877196, 8323661, 2042187, 1332023, 2767871, 5620550, 807640, 4076948, 1352525, 7570008, 6365687, 262971, 1273019, 55139, 4496376, 5403770, 7938335, 6159130, 6960290, 1549448, 3368593, 8305935, 6561310, 6648430, 1298682, 1008126, 717713, 6937159, 312752, 257564, 2450524, 7730637, 1978178, 1797068, 6528814, 3776639, 3113990, 1294766, 7212306, 4775062, 356455, 3160033, 6627822, 597689, 7713273, 3266828, 699566, 5277008, 3528864, 6639141, 7868770, 6687472, 4496176, 1637492, 2248361, 2524234, 7985054, 6455786, 4793068, 7803234, 5741200, 6848052, 55710, 8255004, 6925964, 154648, 5450694, 1470438, 7850334, 6500696, 3158721, 7189407, 813219, 884160, 172658, 6603074, 3933422, 923554, 45455, 6049401, 4089100, 2505166, 493825, 864872, 6178222, 3538358, 5592773, 3785202, 8182024, 5606700, 3993002, 1263020, 6004717, 6960207, 6780548, 623772, 4193592, 3447583, 4345605, 2992323, 2566296, 1666173, 3752406, 4199237, 1660666, 5345507, 6022005, 3947946, 864103, 7882328, 2449768, 8179261, 4721956, 2535077, 7986272, 5427586, 5003747, 3806355, 6333167, 220924, 592341, 7997780, 7600128, 6166968, 5460919, 6359016, 3309030, 3324811, 2810549, 3345052, 5648826, 2183367, 6361590, 503856, 5077618, 5557523, 7263962, 1932261, 5556915, 8111321, 2729568, 4770392, 4854758, 5998735, 5389671, 3258737, 4535922, 6377487, 4160956, 469161, 2424907, 3516536, 584890, 946181, 5642569, 7257975, 7969720, 8192307, 6283858, 137671, 5303187, 5297556, 7559046, 8218264, 8276239, 1152339, 7953021, 448828, 2683868, 4145221, 7915445, 2538604, 5947785, 1167124, 2444873, 1555619, 5155461, 6770116, 2797215, 5516229, 645988, 4715069, 4331868, 3031399, 4295136, 939016, 4678205, 5344426, 6128748, 5383417, 2187649, 4745756, 8120723, 915458, 6607232, 6607372, 4648893, 2001844, 835300, 7794095, 1072914, 1386701, 147114, 265148, 8184958, 6075645, 1087709, 6591632, 1042494, 2934577, 775980, 4648571, 8178831, 4444300, 5221767, 5479900, 7608154, 6916313, 5990717, 6647236, 694144, 7900267, 6584614, 306055, 3714, 1969509, 232922, 1556862, 1018902, 6469446, 7124808, 7941335, 788578, 5209543, 7368821, 6383834], +[5843848, 8173586, 8049654, 7379430, 3524880, 745104, 6949026, 7737314, 5822018, 666963, 695446, 7070334, 8357504, 2922745, 688236, 1393645, 2766793, 1604984, 1750068, 3665309, 8063616, 2463098, 1339637, 3255525, 7243444, 4450350, 6639750, 3790783, 5875484, 1127476, 2194692, 8108576, 7648482, 5109149, 4431576, 6227957, 3501118, 6441757, 6820959, 1040368, 5810303, 4749173, 574688, 6565572, 5432404, 149275, 505353, 1460230, 3589799, 3566863, 4962102, 2392087, 3544225, 3346109, 7790921, 1955810, 2533717, 1632041, 7072116, 3297097, 5083693, 4057960, 775064, 5421331, 7488916, 591611, 3424186, 1072143, 1579748, 1746459, 2678535, 2365149, 1207547, 1809372, 2049, 5522671, 4937450, 1369992, 6252994, 878860, 6799850, 7144170, 1185332, 2809383, 2092037, 5242635, 6558751, 1795598, 4186664, 7386503, 624444, 3324751, 3400021, 1443172, 1352012, 439300, 3467587, 8029389, 7523237, 2305752, 7503656, 7411207, 295693, 2105145, 6574902, 471650, 8108221, 8144357, 4763339, 1555510, 1065468, 5968764, 4471719, 1944705, 4307884, 297551, 3984944, 4272429, 5749260, 1075534, 5437323, 2390126, 9517, 2398813, 3962399, 2266547, 3895475, 754707, 7530158, 1028336, 8341362, 99079, 2954705, 5717914, 1606768, 5489474, 805173, 6852282, 3810101, 2960605, 4855538, 7654697, 4407016, 4628249, 7317213, 5108215, 970312, 2957378, 3606355, 6389532, 4579431, 3050273, 353627, 7864347, 2521453, 6261648, 1896702, 7947422, 1359906, 4484826, 2684079, 191360, 7925495, 457142, 2000326, 7161754, 7080581, 2177020, 5688803, 4805961, 3390140, 5324233, 7841755, 3466126, 7193863, 870013, 5784347, 7478832, 1476126, 2406412, 4609954, 5247772, 4137878, 7027088, 4071255, 2362371, 5913749, 4528310, 8365140, 2290147, 3293888, 2582160, 3497534, 6185374, 7438768, 3126379, 1694461, 4978716, 6015648, 4210810, 3159161, 6667995, 4937785, 7862128, 7893021, 7114894, 4525067, 6466433, 6694928, 8252388, 1325012, 3145080, 6688334, 5302076, 5968078, 8152103, 7813760, 1934232, 2370893, 633067, 5461939, 6273, 5854591, 1441159, 7243199, 5935687, 658028, 5861398, 5160457, 292407, 5778600, 1694679, 4848572, 5452381, 2903333, 5409980, 6045787, 6745449, 2038449, 6761040, 4855961, 7179191, 7341334, 1601012, 3825293, 6438712, 2391247, 1387534, 7108002, 7677931, 6089893, 1618808, 6352228, 7849655, 4308769, 2192540], +[3853994, 1891534, 1851389, 2803407, 7224342, 3892763, 7035696, 5825004, 1815477, 6173056, 1687300, 613041, 4981670, 3098447, 5023136, 2680924, 5912718, 3990374, 4033059, 4006508, 7407211, 2828518, 6171748, 5602973, 2835257, 5463450, 1821068, 4127170, 8314534, 2728766, 4449073, 4151631, 5162517, 4843478, 45975, 7261313, 7087094, 5494539, 7255023, 5789440, 2075612, 1192118, 1232809, 1087441, 7014861, 4094517, 7136068, 1702724, 7734185, 2728813, 7761746, 7878659, 97988, 3300559, 2473680, 2082006, 5643760, 3973429, 2391976, 6437720, 7145209, 2699734, 2684124, 193147, 2196143, 760121, 362525, 5803529, 7206109, 965522, 2831573, 1611317, 6004621, 3008697, 3062789, 7509184, 7204067, 6481118, 609534, 752975, 3806627, 4574409, 867211, 518099, 5683407, 2658875, 4255630, 4133927, 7598717, 579392, 7168872, 5015534, 2637246, 7113845, 6205738, 7736963, 3853365, 3717931, 2209382, 1142156, 6806908, 1074701, 4063554, 2442919, 783297, 5367270, 4747400, 7512036, 1718486, 2727252, 5719219, 6070901, 372654, 4674898, 6377251, 6372839, 4700326, 3701634, 3592803, 2440560, 4819877, 1003959, 6768735, 380936, 7508250, 3915404, 3071916, 837545, 3942255, 1922330, 2723094, 7245027, 7862045, 5688101, 4645096, 7833172, 1606348, 8103698, 6872645, 5445098, 6528404, 5198218, 3857415, 8315376, 2238882, 5611012, 4496734, 1137267, 6175674, 1687276, 3550362, 3517442, 7421518, 7558893, 1860690, 1313358, 1032806, 5057838, 2521759, 2489897, 3902152, 244539, 4200717, 5201742, 4362264, 4576058, 5574510, 2965808, 2904569, 7198401, 5589760, 5275080, 1334813, 746894, 8115106, 8278923, 6729976, 7246243, 4139142, 6681620, 3751856, 7571110, 7202441, 8331261, 2475061, 8108548, 4080216, 2775204, 3706512, 1917907, 7389800, 4429693, 2456852, 663774, 7336810, 3328140, 8020273, 5315884, 4456661, 579548, 7377532, 4090256, 5574156, 6865634, 1977361, 3007714, 4145773, 3454226, 2620671, 2812326, 7608586, 6504916, 1732496, 634141, 4560199, 8273468, 3654075, 5901821, 1354416, 6548328, 7145845, 2783193, 7934948, 3303802, 5107499, 3282488, 6576581, 3650100, 3348129, 4388312, 6079732, 3355715, 6002015, 3898116, 6830335, 926288, 1803510, 6390867, 6611853, 6143582, 5537649, 8039652, 7278925, 5923462, 1749956, 3338926, 13982, 2654378, 2318832, 8349697, 4649451, 5404921, 2784429, 5882149, 559595, 2888311]] +w = NTTInverse(aHat * NTT(y)): [[5078642, 2908747, 5983117, 5702027, 7014885, 3882278, 8130884, 5111356, 7153298, 6965105, 3536162, 7516375, 6734081, 5132054, 5879000, 298690, 4318561, 8300441, 7316064, 6853806, 813190, 556351, 5616495, 1832475, 742705, 593306, 2248098, 604274, 35882, 4964163, 427852, 3496795, 5195401, 6836862, 486710, 8333642, 5734776, 5710443, 3050693, 583496, 320004, 2659988, 2871312, 4394287, 4144062, 6914101, 7729184, 7582019, 6468579, 650271, 3727687, 4968937, 7739869, 8217743, 7160675, 4796060, 2782841, 1539847, 8133708, 7962487, 3387429, 7262850, 2109712, 6219667, 2320322, 8045416, 6831805, 2823105, 4002186, 1305011, 5493376, 4014920, 3838240, 2553617, 4352803, 6911656, 15171, 5948050, 6395662, 6703949, 361289, 1846084, 3046953, 5360360, 3762914, 3371944, 5620433, 547591, 5283180, 7798896, 7203346, 3439985, 7615941, 5909004, 6818691, 3009435, 830188, 7523762, 7267372, 6276513, 385655, 1930344, 3184713, 5399939, 6662831, 7735333, 1771182, 2836759, 2999780, 3877333, 6867699, 4836826, 3307073, 677380, 177486, 2188234, 443022, 6446584, 5721130, 570766, 1430125, 4861342, 1091892, 1658013, 2527057, 723711, 4160092, 14020, 2444811, 2694966, 7121093, 3249298, 5309347, 860091, 6342579, 3386367, 4057667, 1822788, 2879193, 132195, 3916152, 7377292, 3490373, 3217777, 7613922, 347049, 3169825, 2559024, 7181042, 3869250, 2509875, 7599631, 603858, 5223679, 7107149, 3081018, 5657840, 5009001, 2414698, 3642032, 4414103, 1672424, 3638254, 6298014, 5024707, 2540182, 1664534, 4376282, 1412443, 6799459, 8256582, 2002544, 688379, 5512887, 1288812, 6604015, 6720858, 7453167, 5525606, 8199408, 1477293, 7230410, 1976704, 4331417, 4327270, 6619602, 534318, 954957, 3638641, 6718661, 4806332, 8067070, 8039826, 4878855, 8370793, 569313, 4648473, 3712524, 7846105, 3141332, 8324693, 2000502, 550140, 3094982, 5923140, 4058757, 5420419, 5829087, 7740297, 2340194, 2208284, 4284243, 7111864, 8307775, 5772478, 1267544, 3836435, 1700348, 6645871, 6164883, 122073, 7576509, 4017238, 6431527, 1012940, 3002219, 8069454, 3791742, 3850362, 2197003, 2830291, 6269368, 3237523, 6452242, 3472564, 3057873, 2680688, 3204419, 7117932, 7534801, 595170, 6593692, 6066886, 3755931, 635205, 8230087, 1210291, 201414, 5853041, 5763321, 6085956, 6232046, 5209152, 1690320, 7901696, 3448646], +[7233513, 4474629, 3056070, 5688568, 669762, 5043155, 4443737, 7067239, 729459, 8014349, 4568581, 750381, 938236, 3368436, 686215, 4334526, 8366428, 2227223, 6763476, 3992740, 419574, 6508919, 667760, 4793216, 7673319, 397353, 809529, 7703697, 1069004, 2716513, 3798789, 3921993, 2346519, 7643073, 3284231, 6150608, 529402, 2304023, 5552245, 5022466, 3202395, 1555475, 3417368, 3520651, 6939194, 815073, 8337739, 3605131, 7213038, 1403937, 880875, 6548969, 1473232, 6726741, 1173497, 6090176, 3504863, 7670499, 1101300, 7220722, 4921838, 790824, 1096836, 4305475, 3365971, 4194066, 1590789, 604759, 1838211, 7824297, 4471913, 8310535, 92930, 4723392, 6719253, 8319191, 1988505, 643029, 2788213, 5142972, 5926099, 1079013, 5209, 105839, 307299, 2787956, 786545, 6335724, 3298530, 3425867, 7388051, 7258413, 2597221, 5874656, 7466864, 6786776, 4180214, 3932089, 1427711, 7641080, 647077, 86445, 1319351, 3173646, 2242364, 5620760, 2367573, 3236978, 7223600, 1092281, 4463729, 2116591, 3254044, 4889817, 811804, 1288672, 7502501, 2111047, 5505092, 855661, 822042, 7370149, 4837368, 3638970, 8131280, 5668197, 6198940, 7236940, 2999601, 5361336, 8311265, 5220025, 594901, 2306797, 6269118, 2092010, 4376160, 449913, 6241680, 4892946, 2671774, 2384337, 3915300, 4359447, 8198098, 1711527, 4558082, 258213, 636293, 573354, 132351, 3264312, 5690094, 3594892, 982944, 3836384, 90628, 2605709, 3820901, 1162641, 6451015, 8243768, 1591618, 6856707, 311363, 3895309, 3247231, 2558624, 3371223, 1372266, 2985543, 6567925, 5389979, 95762, 642459, 2773365, 7602623, 4277893, 1616194, 5478902, 8004275, 3489801, 2937200, 3026783, 6222496, 4252105, 18911, 5082285, 3338856, 5408998, 706661, 4957684, 4730813, 4249637, 8303496, 4375835, 5197068, 7477832, 4466091, 5922631, 1522542, 2473332, 1264985, 4083921, 4103804, 837660, 949999, 6401232, 3341145, 8145146, 4783703, 6695080, 6515050, 2645016, 3247203, 2281677, 968636, 4223497, 7090894, 7955791, 1042668, 3263470, 973489, 7054303, 1585405, 3959696, 5681268, 3265334, 7644166, 5749794, 2333319, 5710386, 4020036, 480461, 862322, 5992105, 7514734, 1953788, 3486210, 2369345, 5953806, 3661350, 2633119, 3810804, 7420950, 5426255, 3913803, 2219572, 4302857, 657070, 1749345, 7156506, 7082369, 864042, 106474, 2723028], +[4188217, 7811554, 4241102, 6024428, 3274259, 964348, 1479304, 5879512, 2013388, 5889941, 2897597, 513724, 2598129, 5800713, 2438674, 6930245, 1344616, 3154690, 6285104, 2298751, 5622545, 4318483, 7854605, 5345652, 7009108, 3889320, 4933172, 3255269, 1905612, 4788962, 7346073, 6117506, 1705192, 7271808, 7906834, 6808392, 213984, 3171469, 4242930, 3434524, 441357, 4567621, 943125, 3397466, 3131981, 7845701, 5884658, 6465909, 1651079, 4131649, 4505883, 4811087, 1483482, 3468901, 5938702, 4578475, 1414157, 1879113, 3797130, 2929533, 5675539, 4382554, 7180442, 1898847, 1848910, 6602125, 72312, 8163291, 8150843, 3793713, 3682400, 5191435, 3790375, 4325155, 8287436, 212523, 5749477, 3294261, 759278, 1649819, 2480019, 8173339, 6791961, 7401505, 5650256, 5604403, 2727027, 6973322, 7810704, 3029615, 5576661, 6242438, 597967, 6566753, 7965210, 1914623, 5825008, 3041321, 4991489, 6055343, 1075120, 5794537, 6433926, 1762487, 4913357, 4362167, 8159080, 5117534, 1949577, 1473367, 584810, 4394190, 3580755, 4623534, 5615322, 441556, 4661710, 3086294, 7137947, 1065254, 2529042, 2564171, 5422193, 2715267, 5056209, 3452091, 7790284, 205476, 5800082, 6006941, 4727529, 7926434, 6135833, 929485, 3659735, 3534993, 4561264, 4902652, 5901718, 7330211, 3460998, 5232120, 8187524, 2836878, 5447229, 971524, 2420759, 1086619, 4837811, 482827, 6491790, 4579567, 5008847, 5095257, 37415, 2272253, 7792933, 6755373, 2669523, 8049335, 3900643, 2428996, 757959, 7545464, 7084626, 5115922, 7333992, 6837560, 826373, 5156392, 6064122, 2047328, 7872349, 4519298, 5060997, 1548854, 7484433, 5098363, 7730324, 5083026, 4630119, 7961695, 1491507, 2853882, 3984194, 6628537, 7090826, 3295608, 2689405, 7718761, 6465750, 6820891, 5753027, 1106729, 3988505, 6229951, 2174208, 2087304, 151580, 1678213, 5849038, 8090130, 876469, 6378612, 5846078, 4829078, 1695393, 4962074, 4791776, 627213, 2806125, 963007, 8055593, 4363493, 779883, 6195959, 4915484, 5183911, 748221, 4288982, 2108421, 178982, 425824, 3893206, 6629787, 3091177, 6490949, 8008263, 7516607, 2589070, 6176295, 153510, 5720966, 6473792, 4295214, 4732675, 4932801, 7811261, 5233290, 6100807, 660227, 5227326, 2145935, 999615, 6605008, 1841798, 4093815, 5908802, 2621030, 1143726, 3327702, 5208174, 6410, 6242837, 8338488, 4916093], +[4434378, 3276963, 2949043, 5298708, 2474214, 5316978, 90362, 6538041, 3696979, 6187561, 4829792, 8288193, 1107329, 7572178, 5575356, 3023378, 1070705, 97083, 163854, 7459026, 187528, 8065406, 2886513, 5586371, 7925368, 6322528, 4684169, 1384886, 3077581, 4356160, 4198725, 1354632, 950986, 6784841, 3193280, 953245, 1844098, 103368, 1782048, 846834, 3140776, 5045727, 4822128, 2966404, 3320979, 4449327, 95418, 4212781, 3691490, 2126630, 3065820, 6695922, 1255173, 2079483, 2756512, 1476731, 5095047, 5413530, 4381620, 7024651, 1252436, 5286554, 477995, 2593229, 7954226, 2313095, 555767, 5197329, 3381510, 831255, 3646298, 2076798, 7231281, 126588, 4723412, 630290, 8154892, 1032988, 5313158, 4201005, 496843, 6101845, 7787782, 5730245, 3668610, 1129645, 560383, 993546, 7232271, 4276531, 2049312, 6826182, 6043631, 53150, 5509906, 1246805, 3373995, 5217941, 6670811, 2341695, 4005142, 5359672, 271709, 7645656, 5687734, 2923194, 6654445, 1012219, 5734871, 3080978, 471501, 1243205, 7079284, 5987229, 4556375, 2894448, 8308784, 1338949, 5523666, 3420800, 7477580, 5202887, 7566615, 8202618, 3502782, 4252322, 6551312, 5656606, 2681056, 1305765, 3921276, 7339168, 7197745, 5645205, 7416609, 2845971, 1318962, 3508492, 5464493, 1377003, 7697623, 564824, 5021884, 818852, 7344939, 1371274, 6680079, 1292595, 294215, 4749573, 3748769, 5988946, 388246, 2834599, 5189494, 5954170, 5907619, 4058435, 6095346, 5035509, 6538851, 2834639, 7053959, 3939678, 3944172, 6380979, 1633933, 1074457, 7055173, 2845520, 3165846, 6786157, 4249235, 2447114, 381428, 3605345, 2253322, 6533313, 1595706, 7126253, 7478365, 7188523, 3446088, 3121959, 3469671, 3440332, 5014463, 3190237, 5061227, 5873789, 3805634, 2620541, 5028484, 4604322, 4598230, 482432, 4162265, 6139141, 3912733, 3053107, 6052547, 5257292, 3121101, 4741495, 2712129, 7732773, 2172730, 1585942, 681342, 8022415, 4564064, 7457457, 1262186, 6414433, 2999203, 7526218, 3616613, 3643090, 1847301, 7961767, 5713373, 6778869, 2374457, 667024, 6147715, 4551997, 8108255, 3407259, 1825534, 1972157, 1925856, 481264, 4628659, 2257595, 1858815, 6166219, 327325, 4430127, 7158365, 496925, 6438896, 7730658, 3302234, 3028553, 7663001, 5883881, 2325606, 7861612, 7830178, 7644069, 5418993, 5772127, 4279502, 6713004, 6045623, 1274930]] + +w1: [[27, 15, 31, 30, 37, 20, 43, 27, 38, 37, 19, 39, 35, 27, 31, 2, 23, 0, 38, 36, 4, 3, 29, 10, 4, 3, 12, 3, 0, 26, 2, 18, 27, 36, 3, 0, 30, 30, 16, 3, 2, 14, 15, 23, 22, 36, 41, 40, 34, 3, 20, 26, 41, 43, 38, 25, 15, 8, 43, 42, 18, 38, 11, 33, 12, 42, 36, 15, 21, 7, 29, 21, 20, 13, 23, 36, 0, 31, 34, 35, 2, 10, 16, 28, 20, 18, 30, 3, 28, 41, 38, 18, 40, 31, 36, 16, 4, 40, 38, 33, 2, 10, 17, 28, 35, 41, 9, 15, 16, 20, 36, 25, 17, 4, 1, 11, 2, 34, 30, 3, 8, 26, 6, 9, 13, 4, 22, 0, 13, 14, 37, 17, 28, 5, 33, 18, 21, 10, 15, 1, 21, 39, 18, 17, 40, 2, 17, 13, 38, 20, 13, 40, 3, 27, 37, 16, 30, 26, 13, 19, 23, 9, 19, 33, 26, 13, 9, 23, 7, 36, 43, 11, 4, 29, 7, 35, 35, 39, 29, 43, 8, 38, 10, 23, 23, 35, 3, 5, 19, 35, 25, 42, 42, 26, 0, 3, 24, 19, 41, 16, 0, 11, 3, 16, 31, 21, 28, 31, 41, 12, 12, 22, 37, 0, 30, 7, 20, 9, 35, 32, 1, 40, 21, 34, 5, 16, 42, 20, 20, 12, 15, 33, 17, 34, 18, 16, 14, 17, 37, 40, 3, 35, 32, 20, 3, 43, 6, 1, 31, 30, 32, 33, 27, 9, 41, 18], +[38, 23, 16, 30, 4, 26, 23, 37, 4, 42, 24, 4, 5, 18, 4, 23, 0, 12, 36, 21, 2, 34, 4, 25, 40, 2, 4, 40, 6, 14, 20, 21, 12, 40, 17, 32, 3, 12, 29, 26, 17, 8, 18, 18, 36, 4, 0, 19, 38, 7, 5, 34, 8, 35, 6, 32, 18, 40, 6, 38, 26, 4, 6, 23, 18, 22, 8, 3, 10, 41, 23, 0, 0, 25, 35, 0, 10, 3, 15, 27, 31, 6, 0, 1, 2, 15, 4, 33, 17, 18, 39, 38, 14, 31, 39, 36, 22, 21, 7, 40, 3, 0, 7, 17, 12, 30, 12, 17, 38, 6, 23, 11, 17, 26, 4, 7, 39, 11, 29, 4, 4, 39, 25, 19, 43, 30, 33, 38, 16, 28, 0, 27, 3, 12, 33, 11, 23, 2, 33, 26, 14, 13, 21, 23, 43, 9, 24, 1, 3, 3, 1, 17, 30, 19, 5, 20, 0, 14, 20, 6, 34, 43, 8, 36, 2, 20, 17, 13, 18, 7, 16, 34, 28, 1, 3, 15, 40, 22, 8, 29, 42, 18, 15, 16, 33, 22, 0, 27, 18, 28, 4, 26, 25, 22, 0, 23, 27, 39, 23, 31, 8, 13, 7, 21, 22, 4, 5, 34, 18, 43, 25, 35, 34, 14, 17, 12, 5, 22, 37, 42, 5, 17, 5, 37, 8, 21, 30, 17, 40, 30, 12, 30, 21, 3, 5, 31, 39, 10, 18, 12, 31, 19, 14, 20, 39, 28, 21, 12, 23, 3, 9, 38, 37, 5, 1, 14], +[22, 41, 22, 32, 17, 5, 8, 31, 11, 31, 15, 3, 14, 30, 13, 36, 7, 17, 33, 12, 30, 23, 41, 28, 37, 20, 26, 17, 10, 25, 39, 32, 9, 38, 42, 36, 1, 17, 22, 18, 2, 24, 5, 18, 16, 41, 31, 34, 9, 22, 24, 25, 8, 18, 31, 24, 7, 10, 20, 15, 30, 23, 38, 10, 10, 35, 0, 43, 43, 20, 19, 27, 20, 23, 0, 1, 30, 17, 4, 9, 13, 43, 36, 39, 30, 29, 14, 37, 41, 16, 29, 33, 3, 34, 42, 10, 31, 16, 26, 32, 6, 30, 34, 9, 26, 23, 43, 27, 10, 8, 3, 23, 19, 24, 29, 2, 24, 16, 37, 6, 13, 13, 28, 14, 27, 18, 41, 1, 30, 32, 25, 42, 32, 5, 19, 19, 24, 26, 31, 38, 18, 27, 43, 15, 29, 5, 13, 6, 25, 3, 34, 24, 26, 27, 0, 12, 41, 35, 14, 42, 20, 13, 4, 40, 37, 27, 39, 36, 4, 27, 32, 11, 41, 24, 27, 8, 39, 27, 41, 27, 24, 42, 8, 15, 21, 35, 37, 17, 14, 41, 34, 36, 30, 6, 21, 33, 11, 11, 1, 9, 31, 42, 5, 33, 31, 25, 9, 26, 25, 3, 15, 5, 42, 23, 4, 33, 26, 27, 4, 23, 11, 1, 2, 20, 35, 16, 34, 42, 39, 14, 32, 1, 30, 34, 23, 25, 26, 41, 27, 32, 3, 27, 11, 5, 35, 10, 21, 31, 14, 6, 17, 27, 0, 33, 0, 26], +[23, 17, 15, 28, 13, 28, 0, 34, 19, 32, 25, 0, 6, 40, 29, 16, 6, 1, 1, 39, 1, 42, 15, 29, 42, 33, 25, 7, 16, 23, 22, 7, 5, 36, 17, 5, 10, 1, 9, 4, 16, 26, 25, 16, 17, 23, 1, 22, 19, 11, 16, 35, 7, 11, 14, 8, 27, 28, 23, 37, 7, 28, 3, 14, 42, 12, 3, 27, 18, 4, 19, 11, 38, 1, 25, 3, 43, 5, 28, 22, 3, 32, 41, 30, 19, 6, 3, 5, 38, 22, 11, 36, 32, 0, 29, 7, 18, 27, 35, 12, 21, 28, 1, 40, 30, 15, 35, 5, 30, 16, 2, 7, 37, 31, 24, 15, 0, 7, 29, 18, 39, 27, 40, 43, 18, 22, 34, 30, 14, 7, 21, 39, 38, 30, 39, 15, 7, 18, 29, 7, 40, 3, 26, 4, 39, 7, 35, 7, 2, 25, 20, 31, 2, 15, 27, 31, 31, 21, 32, 26, 34, 15, 37, 21, 21, 34, 9, 6, 37, 15, 17, 36, 22, 13, 2, 19, 12, 34, 8, 37, 39, 38, 18, 16, 18, 18, 26, 17, 27, 31, 20, 14, 26, 24, 24, 3, 22, 32, 21, 16, 32, 28, 16, 25, 14, 41, 11, 8, 4, 42, 24, 39, 7, 34, 16, 40, 19, 19, 10, 42, 30, 36, 12, 4, 32, 24, 43, 18, 10, 10, 10, 3, 24, 12, 10, 32, 2, 23, 38, 3, 34, 41, 17, 16, 40, 31, 12, 41, 41, 40, 28, 30, 22, 35, 32, 7]] +w1Encode: DBF37925B56E66399DE3F609176092C4D029C4C00C8026481B39009E070D82F35C1699A2E24069E96A660FB2AA92B9848C4A3ED5D155547391C0278E82027194E40D5C6A4AE84742046A86821271639A3C10456611112C82E80D8866240D61018D53465C114A95F204D52945A8103526D5A0C356429ED64C5732855A935C07B92E44778CE3D9AD88A95CD73814D398A9AA060CD89442C032405FC57D29C35825E01D543282015A8905A45214F3849128414E54A2C30852C36A049F07865B924AE60579847695848A1185445C004356824864A840A08643550C1A8103D36911224924014CE65188C86880126A981A615C92850C4A7A01403602CAF06C9F0104C2438491749ACE77925675A00370448CC744A6712D91461CE7D211C4994DAB179A10076C03132E97106A4E535D6B8205C31044DE5450804319E28A90021535D201895C303CA88574AAF440A1056C12476899055CDB797D487354165188D29A8DA213318555AA45549448E545A8C778D5507CA72231DFE450275731D79098651138566A8151817CCBF70C8ED790471432DE957225A5454A768289A99241644902564850FA8989856588F46187423DDE652ACA08AC2B356DD405045E4424CD4A9E5EE79429D48583A82A1FA481862726DAB56E0A325C13D60918541A4DC3399B94061E98A960314D98F699D2B63E5DD118D92062DA0630E9E8A85443A0E57692C4062E29B621E7966E988A3CD558464E2A929E5185CB12249F5A845F9668D9F014EA4584DA465C4B20502324AAA703069E78655ABA81C3B614A3527D8E116D40086857F4700D078813980106DA4146109C81FA746A981DD0651D0519154A9010909641D11558D3028DC7E2201B77950737382A336C12312D66900D6BC15903987A933114A6B59020D01DD236321517A0DE33161E241CE5873DC0D149E786AE92257ACE519DA6773E87D41DE8A011E7311E42467DC2B37D5F056AE25356959818E5139156234C8C8894A7294192A445DB47391A860D1658412007654EBA20848A9D8708A1D3A4A81EC91020B64A8AA20C18A380C2650E621A41E8C7A429CA79D6081E + +cTilde: 082E83CF5781050B99CD3EE374AF5B0B24E49C82C438150D45051C9C1EB94F2B +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0] +cHat: [5123131, 1702613, 2818704, 7068434, 7339560, 7688271, 849899, 4328931, 2641106, 4279859, 4547491, 6809917, 1401253, 7381696, 1444065, 1617382, 8228511, 6305862, 5061444, 1216155, 7287689, 3355220, 4262694, 3474005, 2370790, 7020685, 7035874, 2868149, 7178942, 5936668, 7862291, 4338167, 3773203, 1741930, 1456442, 5753980, 8189085, 7721019, 1458685, 894023, 8320044, 4320364, 2243536, 2523578, 1993032, 4626255, 5188584, 6840600, 3780136, 3634171, 6516782, 827762, 6838926, 672876, 2923103, 2121334, 7245774, 6300150, 6219144, 6542516, 2959535, 4125590, 6498498, 8218480, 1173847, 4043944, 7319432, 235218, 5794487, 6375933, 6701212, 4502111, 5636083, 4681049, 839160, 6411618, 5319711, 3192194, 1164727, 7843842, 2267371, 7761101, 8288736, 2056109, 1642313, 3800210, 8127089, 3819828, 2871633, 2977490, 3529802, 3505785, 476325, 4593916, 2929146, 4207297, 2619436, 5937413, 3729705, 5068088, 4759586, 4761896, 5076178, 3537468, 2422779, 2383646, 7622050, 455813, 5045398, 7773550, 2129565, 7909950, 2938952, 4597105, 6635695, 3195347, 711436, 8067750, 830281, 6952784, 5149668, 728808, 8141009, 7745425, 5021545, 1602917, 7459672, 1454127, 4431378, 8367805, 5745293, 2758760, 6032446, 4992563, 366911, 7909354, 5502064, 2836064, 6650644, 104327, 1807186, 5017592, 7688929, 1021205, 6272391, 2570364, 2836020, 4822930, 6310377, 4047883, 8183670, 5114392, 6409168, 7409836, 6402876, 2286484, 6104688, 323999, 502376, 1635067, 4408802, 3923690, 7314853, 571010, 7838778, 4446862, 240510, 7106386, 6917681, 4412931, 7567865, 4649215, 1706849, 345444, 8054627, 1729065, 2624423, 3227385, 726587, 1839553, 3243687, 7667939, 4600951, 1519743, 4383349, 2716954, 5921263, 4583798, 6448247, 2877340, 5559824, 4913108, 94171, 1007330, 4055461, 5387053, 2396139, 746299, 4037225, 1007697, 4889522, 7456776, 3901082, 2903583, 2076633, 7384688, 1614197, 1325670, 1569110, 4620773, 6015922, 1613751, 7156792, 1379390, 5926085, 1375924, 5112326, 1413849, 5796595, 4903421, 4691344, 3464974, 6179427, 5824677, 75312, 6595593, 7732189, 1383143, 4067153, 1383548, 3894598, 4067049, 42213, 2493012, 4505834, 6627120, 5933201, 6423218, 5634981, 6184148, 385411, 6632115, 2519896, 6987855, 1226906, 7934816, 7242056, 5284672, 8373320, 3004614, 723339, 5406301, 2484643, 5021380, 6804742, 5390663] +cs1: [[8380416, 8380415, 8380409, 8380411, 8380416, 8380403, 11, 9, 8380410, 1, 5, 8, 3, 8380409, 8380401, 8380410, 8380406, 8380399, 8380410, 8380406, 8380410, 2, 8380407, 4, 8380413, 8380404, 8380399, 8380412, 8380413, 2, 8380411, 8380413, 7, 8380407, 1, 0, 8380416, 8380405, 8380409, 8380416, 8, 10, 23, 3, 7, 8380401, 8380411, 4, 8380402, 8380408, 8380409, 8380400, 8380411, 8380413, 1, 8, 3, 7, 17, 21, 8380414, 11, 8380413, 8380408, 5, 8380412, 8380415, 8380408, 8380415, 2, 8380415, 9, 16, 6, 3, 2, 11, 19, 8380408, 8380410, 8380408, 8380410, 8380414, 3, 19, 2, 8380415, 8380413, 0, 8380407, 10, 4, 20, 1, 4, 8380413, 8380407, 8380408, 8380407, 13, 2, 3, 10, 4, 8380411, 13, 9, 8, 8380409, 11, 8380411, 8, 8380413, 15, 8380407, 8380409, 8380412, 10, 9, 4, 5, 1, 3, 8380415, 8380410, 8380414, 8380412, 8380402, 4, 8380408, 8380404, 8380412, 8380412, 8380410, 3, 11, 5, 7, 8380397, 4, 7, 8380401, 8380416, 2, 8380410, 8380410, 8380403, 8380415, 0, 9, 8380416, 9, 8380403, 2, 12, 0, 11, 13, 8380415, 9, 8380407, 8380414, 8380413, 3, 6, 8, 0, 8380406, 8380405, 5, 5, 8380415, 12, 0, 8380405, 8380398, 1, 8380412, 10, 3, 17, 8380416, 8380411, 0, 4, 8380415, 8380400, 8380406, 8380406, 8380394, 8380401, 8380410, 5, 8380410, 16, 3, 14, 2, 8380416, 8, 8380413, 0, 8380411, 8380409, 8380416, 4, 2, 10, 8380396, 8, 8380408, 8380413, 8, 8380415, 8380413, 2, 8380413, 2, 5, 8380411, 6, 10, 8380409, 8380411, 15, 8380414, 8380404, 8380410, 6, 7, 14, 1, 12, 8380409, 1, 8380412, 2, 0, 0, 8380409, 5, 4, 8, 8380416, 8380414, 5, 8380410, 8380412, 8380402, 3, 8380398, 8380409, 8380400, 8380404, 8380415, 3], +[11, 13, 17, 0, 1, 4, 8380412, 8380416, 8380412, 8380404, 8380394, 8380415, 8380416, 8380411, 8380403, 8380405, 8380414, 8380404, 8380408, 8380410, 8, 8380415, 12, 8380414, 8380416, 8380410, 1, 8380397, 8380416, 0, 8380404, 8380405, 1, 8380405, 8380413, 8380410, 17, 14, 13, 4, 20, 8380409, 13, 8380410, 8380416, 8380407, 8380414, 8380410, 8380410, 8, 8380402, 0, 7, 8380415, 7, 0, 8380415, 7, 8380398, 7, 8380413, 8380410, 22, 8380409, 10, 15, 8380403, 14, 0, 4, 7, 8380405, 12, 2, 4, 8380415, 8380415, 16, 10, 8380415, 8, 8, 12, 8380414, 18, 4, 8380414, 19, 10, 2, 6, 8380409, 22, 8, 8380412, 8380411, 8380416, 6, 8380413, 8380411, 11, 14, 11, 4, 8380412, 9, 6, 3, 8380406, 8380415, 8380398, 8380406, 8380401, 0, 4, 4, 8380410, 8380415, 8380402, 8380409, 8380412, 13, 5, 8380409, 4, 8380409, 8380416, 1, 1, 8380414, 0, 13, 8380412, 8380407, 8380410, 8380400, 2, 8380411, 8380410, 8380415, 2, 7, 9, 8380415, 13, 10, 3, 5, 8380409, 2, 8380409, 6, 8380414, 8380402, 8380408, 8380406, 8380398, 8380414, 8380410, 8380414, 5, 8380406, 14, 8380411, 8380409, 4, 8380412, 4, 1, 14, 15, 4, 0, 8380414, 6, 8380414, 8380408, 8380405, 5, 8380404, 5, 8380409, 10, 1, 5, 12, 8, 9, 18, 8380406, 0, 4, 8380411, 3, 2, 8380407, 8380414, 8380404, 8380414, 8380414, 6, 8380414, 5, 6, 8380407, 6, 0, 8380409, 0, 3, 8380416, 8380414, 5, 8380397, 8380416, 8380409, 9, 8380415, 8380408, 8380416, 10, 8380414, 22, 12, 1, 7, 15, 8380403, 8380404, 8380414, 8380411, 4, 0, 8380407, 12, 16, 21, 14, 8380411, 5, 12, 2, 10, 8, 8380413, 5, 8380416, 8380408, 8380406, 8380396, 4, 8, 6, 1, 2, 8380407], +[10, 6, 7, 8380403, 8380414, 8, 8380414, 8, 13, 8380414, 5, 7, 8380407, 12, 2, 8380412, 3, 8380403, 8380405, 8380410, 11, 0, 1, 8380408, 8380409, 8380414, 3, 8380411, 8380406, 8380416, 8380414, 8380407, 2, 8, 8380412, 8380416, 14, 8380402, 4, 8380414, 8380416, 8380411, 1, 8380412, 4, 7, 8, 8380412, 12, 8380409, 8380409, 13, 8380411, 4, 8380409, 8380413, 8380416, 8380416, 1, 3, 6, 7, 8380413, 8380407, 8380411, 9, 21, 8380414, 8380405, 4, 1, 8380409, 6, 8380407, 2, 5, 8380402, 1, 8380416, 1, 8380406, 8380394, 8380416, 8, 8380409, 8380414, 8380416, 8380413, 2, 6, 12, 8380414, 8380414, 1, 8380405, 1, 8380403, 17, 12, 2, 5, 8, 8, 12, 8380415, 19, 3, 8380402, 9, 8380402, 0, 13, 0, 8, 8380404, 8380412, 8380407, 8380413, 5, 4, 8380413, 8380415, 8380407, 7, 6, 8380406, 8380411, 7, 8380415, 8380402, 14, 7, 8380400, 4, 8380409, 8380414, 8380413, 9, 4, 10, 5, 17, 2, 17, 8380406, 1, 9, 8380413, 1, 8, 2, 12, 8380406, 6, 5, 8380405, 12, 8380414, 5, 11, 8380410, 8, 11, 14, 12, 8380402, 8380403, 0, 8380406, 8380411, 8380413, 2, 8380409, 8380386, 5, 8380415, 3, 4, 8, 6, 12, 8380404, 14, 8380416, 8380400, 8, 8380403, 8380408, 8380409, 8380410, 8380415, 8380412, 8380412, 10, 9, 8380415, 8380412, 8380408, 15, 9, 7, 8380415, 8380415, 10, 8380405, 5, 8380395, 8380409, 12, 8380409, 8380414, 8380415, 8380407, 5, 9, 6, 2, 8380408, 4, 8380404, 8380405, 2, 16, 3, 8380402, 1, 8380409, 8380411, 13, 8380407, 2, 3, 8380410, 2, 16, 8380413, 3, 8380410, 8380410, 12, 2, 3, 8, 10, 8380412, 11, 0, 5, 8380416, 8380405, 8380405, 7, 8380404, 6, 8380407, 8380410], +[8380406, 5, 1, 8380414, 5, 8380414, 8380411, 8, 8380404, 3, 8380409, 9, 3, 8380413, 0, 8380407, 8380405, 5, 2, 8380416, 7, 8380410, 8380413, 8380410, 8380396, 8380410, 8380416, 8380406, 6, 8380408, 5, 8380407, 3, 11, 11, 3, 10, 23, 4, 27, 3, 8380403, 7, 3, 8380401, 7, 8380407, 0, 1, 1, 8380407, 8, 8380415, 6, 4, 8380414, 8380411, 8380415, 5, 8380403, 8380413, 8380406, 2, 8380416, 8380409, 8380409, 7, 8380401, 15, 1, 2, 8380416, 8380412, 8380415, 0, 8380409, 3, 8380416, 8380415, 2, 6, 8380413, 9, 2, 0, 3, 8380413, 0, 8380416, 3, 8380415, 7, 8380404, 8380413, 8380415, 8380406, 8380406, 4, 8380413, 11, 7, 8380402, 8380416, 2, 8380409, 8380401, 12, 8380394, 3, 13, 8380416, 5, 8380414, 8380410, 17, 11, 12, 22, 12, 8380414, 3, 8380406, 2, 8380415, 8380409, 3, 8380405, 8380409, 10, 8380413, 8380407, 19, 1, 8380415, 13, 8380412, 8380405, 11, 8380414, 8380411, 11, 8380406, 8380408, 8380416, 18, 1, 8380415, 0, 8380413, 8380410, 8380415, 8380414, 8380407, 2, 6, 8380412, 5, 8380412, 8380407, 8380411, 7, 12, 6, 0, 8380412, 8380411, 8380402, 8380413, 8380414, 3, 8380405, 8380406, 8380409, 8380413, 8380412, 9, 8380410, 4, 0, 8, 18, 4, 5, 12, 4, 12, 8380409, 8380408, 8380406, 8380401, 8380399, 5, 6, 8380411, 8380415, 7, 1, 8380411, 8, 8380415, 8380416, 14, 8380408, 8380402, 8380416, 7, 2, 3, 3, 8, 18, 1, 3, 2, 8, 8, 8380414, 3, 7, 2, 22, 12, 8380411, 8380409, 8380406, 4, 8380399, 8380400, 8380416, 6, 8380401, 8380416, 5, 8380413, 8380402, 0, 6, 9, 8, 6, 6, 8380410, 5, 2, 8, 3, 2, 8380406, 5, 8380414, 8380412, 15, 8380409, 8380397, 7, 8380406]] +cs2: [[8380414, 2, 8380406, 8380401, 8380409, 8380409, 4, 5, 1, 15, 10, 3, 11, 8380410, 8380407, 4, 8380408, 8380414, 8380397, 3, 2, 8380408, 3, 1, 10, 8380410, 8380410, 8380404, 3, 8380415, 8380410, 0, 8380411, 3, 7, 5, 8, 8380408, 0, 4, 8380405, 4, 8380399, 8380411, 8380404, 8380405, 8380415, 8380407, 8380411, 8380412, 2, 16, 14, 12, 8380416, 8380413, 8380411, 10, 8380411, 4, 10, 11, 6, 8380407, 8380415, 8380413, 8380394, 8380409, 8380409, 8380416, 3, 21, 3, 5, 8380416, 8380409, 9, 3, 8380409, 21, 8380413, 10, 8380413, 8380409, 5, 6, 15, 3, 8380402, 8380409, 8380401, 8380410, 0, 8380412, 8380415, 8380414, 10, 13, 0, 8380415, 12, 8380408, 18, 8380409, 8380408, 8380409, 8380395, 8380402, 8380404, 2, 8380407, 8380406, 4, 8380412, 17, 20, 8, 18, 8380412, 8380412, 1, 1, 8380415, 8380402, 8380404, 4, 8380408, 0, 3, 8380415, 8380409, 25, 5, 14, 2, 8380415, 4, 8380406, 6, 8380406, 8380410, 8380401, 8380394, 8380414, 8380414, 8380412, 8380412, 8380412, 3, 9, 9, 11, 8380407, 8380411, 6, 4, 17, 11, 2, 0, 8380416, 8380411, 13, 8380408, 8380413, 8380407, 19, 18, 3, 1, 8380402, 8380408, 3, 7, 14, 3, 6, 15, 8380413, 13, 11, 12, 8380399, 8380412, 8380401, 8380411, 8380408, 8380407, 8380415, 8380415, 8380415, 19, 11, 9, 4, 10, 18, 4, 8380413, 8380409, 8380409, 8380409, 8380414, 8380415, 8380411, 8380405, 8380415, 9, 11, 14, 10, 8380413, 8380414, 8380411, 8380410, 1, 8380407, 8380413, 8380403, 9, 8380414, 0, 8380413, 8380413, 8380413, 8380415, 1, 1, 8380416, 8, 3, 2, 4, 8380416, 8380411, 8380402, 8380407, 4, 12, 8380413, 8380416, 18, 8380403, 6, 8, 8380413, 8380415, 8380409, 1, 8380401, 8380412, 8380412, 0, 1, 8380413, 8380414], +[9, 12, 12, 11, 20, 5, 8380413, 8380400, 5, 6, 8380416, 9, 4, 8380413, 8380413, 8380416, 8380415, 8380416, 8380409, 8380410, 3, 12, 8380408, 10, 3, 8380415, 4, 0, 5, 4, 1, 8380409, 13, 2, 8380416, 10, 8380410, 3, 11, 8380405, 3, 8380414, 8380413, 8380410, 8380414, 8380414, 4, 8380406, 8380409, 9, 0, 10, 5, 8380407, 4, 5, 9, 8380411, 8380411, 8380401, 8380411, 5, 8380408, 8380414, 14, 8380412, 8380406, 6, 8380407, 8380415, 8380412, 4, 1, 9, 8380412, 29, 9, 8380407, 14, 3, 8380416, 4, 8380408, 7, 8380415, 8380410, 8380400, 8380412, 8380391, 8380413, 8380414, 8380404, 8380411, 2, 8380404, 8, 6, 1, 5, 0, 8380399, 1, 8380411, 8380397, 5, 8380414, 8380405, 5, 8380400, 8380408, 5, 8380415, 8380409, 2, 8380411, 8, 2, 8380395, 8380415, 7, 8380406, 0, 8380403, 8380415, 8380406, 8380409, 8380412, 16, 6, 8380400, 6, 8380394, 8380414, 7, 8380410, 6, 4, 8380405, 1, 3, 1, 8380414, 2, 5, 12, 8380411, 1, 9, 10, 8380416, 8380415, 8380412, 8, 8380412, 8380412, 13, 6, 7, 1, 23, 8380407, 3, 8380415, 5, 4, 8380416, 14, 8380415, 13, 8380402, 15, 16, 8380408, 8380412, 18, 1, 15, 9, 9, 14, 3, 1, 5, 8380413, 5, 4, 2, 12, 0, 8380416, 6, 8380409, 8380414, 2, 9, 1, 8380411, 9, 8380411, 29, 3, 8380414, 3, 10, 9, 8380411, 8380409, 8380412, 8380407, 4, 1, 12, 0, 8380408, 8380409, 8380407, 8380413, 2, 8, 7, 8, 12, 8380414, 7, 8380416, 8380407, 8, 8380413, 8380416, 8380409, 6, 8380416, 8380410, 0, 4, 1, 8380402, 2, 5, 8380414, 8, 8380406, 8380402, 16, 8380399, 0, 8380411, 8380416, 4, 16, 8380415, 1, 8380416, 8380413, 8380415, 8380407], +[11, 4, 8380416, 3, 13, 5, 16, 8380399, 8380393, 8380405, 7, 9, 8380414, 8380394, 11, 1, 12, 8380416, 14, 0, 0, 8380408, 8380409, 5, 3, 3, 8380410, 8380409, 8, 8380416, 8380405, 8380408, 8380396, 8380414, 9, 1, 8380410, 8380415, 8380406, 8380412, 13, 3, 8380411, 8380411, 8380413, 8380400, 2, 7, 8380409, 8380414, 8380402, 0, 2, 8380416, 8380415, 8380413, 8380412, 10, 1, 6, 8380410, 8380412, 2, 6, 8380414, 3, 8380413, 6, 8380409, 8380415, 1, 10, 8380414, 3, 2, 4, 7, 4, 6, 8380409, 2, 10, 4, 6, 8380403, 8380395, 8380416, 10, 8380409, 2, 8380415, 10, 7, 0, 11, 0, 8380409, 10, 8380413, 7, 8380415, 8380409, 3, 8380416, 8380414, 3, 0, 4, 8380411, 1, 8380413, 7, 2, 8380415, 0, 8380415, 5, 13, 3, 24, 6, 23, 4, 5, 8380416, 17, 15, 8380408, 8380405, 8380405, 8380414, 11, 0, 8380411, 6, 8380416, 1, 5, 4, 16, 8, 5, 3, 4, 14, 8380412, 8380405, 4, 16, 8380410, 8380413, 8380392, 3, 8380416, 6, 8380415, 8380409, 8380414, 8, 8, 5, 10, 3, 8380416, 8380408, 6, 2, 11, 5, 8380414, 8380410, 11, 9, 12, 8380415, 8380416, 8380411, 16, 16, 8380414, 8380400, 8380414, 8380411, 7, 5, 14, 4, 8380414, 5, 8380412, 3, 4, 2, 8380413, 8380416, 8380402, 5, 9, 1, 8380413, 8380416, 8380414, 0, 8380411, 3, 8380404, 8380408, 8380407, 8380414, 8380410, 8380414, 7, 8380415, 5, 6, 8380396, 6, 8380408, 5, 1, 8380398, 5, 8380406, 8380405, 8380412, 8380415, 8380410, 8380403, 8380415, 11, 11, 8380414, 8380410, 8380408, 1, 8380416, 8380413, 8380408, 8380412, 8380403, 9, 6, 4, 8380405, 8380400, 8380412, 7, 14, 8380414, 14, 1, 8380407, 8380407, 8380411, 4, 8380409], +[9, 9, 8380416, 8380402, 8380404, 6, 10, 9, 8380416, 8380415, 1, 9, 12, 11, 8380410, 9, 1, 10, 5, 6, 8380398, 4, 4, 8, 2, 8380411, 8380413, 8380404, 8380415, 8380412, 7, 8380416, 10, 8380407, 8380400, 3, 11, 8380410, 0, 8380415, 2, 12, 1, 8, 4, 10, 11, 8380414, 8380416, 5, 8380391, 6, 7, 7, 8380415, 8380415, 8380403, 6, 0, 6, 8380409, 10, 3, 7, 11, 1, 4, 8380408, 8380415, 6, 8380416, 1, 8380409, 8380393, 8380410, 8380405, 13, 8, 8380415, 8380402, 8380412, 8380408, 16, 1, 0, 8380399, 8380414, 8380409, 8380413, 11, 19, 3, 8, 8380413, 0, 17, 0, 8380416, 8380410, 8380411, 2, 8380406, 8380400, 7, 8380413, 9, 1, 1, 1, 10, 5, 2, 8380413, 8380411, 2, 5, 4, 10, 8380416, 8380413, 8380412, 0, 14, 3, 0, 5, 9, 8380416, 16, 8380416, 8380416, 8380412, 8380410, 8380413, 1, 8380412, 6, 0, 10, 3, 1, 8, 8380410, 9, 8380409, 9, 13, 8380408, 8380413, 8380403, 8380393, 2, 8380401, 1, 12, 4, 8380411, 7, 8380391, 13, 8380408, 0, 8380408, 8380409, 8380407, 8380409, 0, 4, 8380411, 8380414, 8380413, 2, 4, 7, 24, 10, 8380407, 8380414, 8380395, 2, 2, 8380411, 16, 8380410, 8380401, 8380413, 8380404, 13, 3, 10, 7, 6, 2, 8380410, 8380413, 16, 8380404, 4, 8380402, 8380408, 8380416, 8380415, 7, 6, 8380412, 10, 8380415, 9, 7, 12, 9, 23, 1, 2, 8380399, 8380415, 8380399, 3, 9, 6, 12, 8380403, 8380408, 8380412, 1, 4, 11, 8380408, 8380411, 8380416, 5, 11, 1, 6, 1, 3, 8380409, 8380410, 10, 4, 8380412, 8380408, 8380408, 2, 8380410, 8380407, 12, 14, 8380409, 2, 8380408, 8380415, 13, 8380415, 11, 3]] +z: [[8344560, 100564, 8366035, 35607, 78313, 74687, 8311567, 8368928, 8298553, 8265523, 8058, 102623, 8333039, 126064, 8340660, 25357, 8329531, 8375652, 52732, 8375166, 40638, 8254964, 8267939, 10454, 8363789, 8268269, 108398, 8292667, 8274653, 8347500, 93635, 70786, 8284670, 8359496, 65172, 21257, 8365898, 95937, 8307465, 8358709, 8286487, 8281781, 8343061, 8311765, 8377647, 121415, 8287463, 8359927, 106887, 53017, 8353930, 8341525, 8253451, 8310674, 55543, 33768, 8273615, 75215, 57185, 119362, 8268929, 48177, 8359055, 47211, 85074, 18929, 8378865, 8308288, 63846, 94288, 8340351, 11158, 8361570, 85425, 8301539, 8331653, 8291888, 8270546, 8284010, 90316, 8271381, 8362786, 28802, 49473, 107242, 198, 8368503, 6170, 8257119, 19259, 57672, 8331033, 8257447, 8377524, 8263977, 8379614, 31374, 8257484, 8268586, 8276516, 8280925, 109101, 8373080, 8264677, 33947, 91330, 49147, 77850, 8325682, 100715, 8335284, 8284454, 53353, 8296909, 73966, 8256069, 8369369, 8350420, 35711, 8295214, 8269700, 17182, 8344481, 8362484, 8352883, 8326648, 27683, 106839, 8281392, 77923, 8276092, 8347402, 8314102, 81057, 130172, 8266172, 8330410, 120554, 84034, 8356360, 8366166, 8311680, 83642, 98170, 8331166, 17449, 81340, 8340645, 100344, 9835, 2489, 37180, 8366309, 96856, 8351102, 19928, 8362578, 67220, 8299079, 40785, 40264, 8339348, 27045, 8281667, 19918, 7689, 8367317, 8269486, 8285183, 19708, 8335009, 1682, 84517, 75230, 8350007, 8298955, 55113, 130806, 8269923, 8321306, 21617, 93017, 2105, 116846, 8016, 8357699, 11234, 8281701, 8347922, 88262, 68864, 8278886, 32975, 8256987, 8298513, 87985, 8314656, 8353352, 8350636, 130559, 42240, 8370966, 8345020, 54337, 127908, 99239, 46492, 8321583, 66470, 96904, 6766, 8336741, 116216, 100680, 8343679, 20316, 8336876, 88572, 39684, 66531, 8318762, 8346045, 8257058, 89868, 130648, 47474, 41183, 123916, 8269544, 8290345, 46799, 98670, 8362715, 8372808, 12245, 8271702, 8362365, 20337, 112679, 48982, 64980, 8316730, 63588, 94969, 6929, 8366958, 8337197, 130293, 8265251, 8350509, 83010, 8299191, 30788, 8332861, 8256421, 8341599], +[8268438, 94250, 8315490, 77717, 8353998, 8319916, 8291019, 62116, 8307235, 101255, 8312625, 82825, 8282384, 8347447, 63471, 8349498, 119007, 8362615, 99167, 8280280, 8278836, 86167, 124719, 118419, 8274717, 102253, 88774, 8327578, 8307723, 52368, 90088, 34245, 36845, 128158, 73963, 8378667, 8368919, 8252292, 8305416, 62075, 34669, 8350141, 8265304, 31178, 120284, 84695, 11732, 34352, 26245, 8342335, 28072, 8326139, 8260451, 100296, 8296013, 34657, 8364790, 71322, 8329232, 8258737, 31315, 113287, 53946, 31409, 54114, 123316, 53745, 8253339, 121042, 41613, 8263825, 8307019, 129170, 8342536, 29639, 8255126, 8280434, 11479, 12919, 23335, 8328568, 28840, 46682, 8304397, 8299631, 105853, 77215, 8295687, 82707, 50243, 8279888, 34848, 8327331, 8277620, 8288138, 59169, 28141, 94163, 93738, 8339725, 8315551, 8265300, 108124, 8376233, 8333942, 8254040, 127316, 8258208, 106926, 23427, 8360788, 8330973, 8301250, 8256478, 8301195, 126819, 57427, 8371426, 8346370, 8325502, 77704, 8272698, 90851, 8323206, 8363436, 129896, 8313357, 96688, 41565, 8359286, 8303228, 8281308, 41948, 8315703, 66897, 8316168, 98077, 52627, 8363910, 97125, 8371858, 84545, 74323, 8309147, 8307801, 8342822, 8289899, 73659, 125335, 97575, 8288161, 8336024, 8265483, 8346481, 8357030, 34872, 8312555, 59062, 105969, 8288071, 68285, 8308933, 93974, 8249639, 13248, 79194, 120703, 13362, 100401, 56747, 116604, 8292813, 55280, 8378184, 8364375, 8296534, 15798, 8366353, 8343149, 8379235, 8303220, 8351105, 123864, 118053, 8297076, 100752, 8316421, 53849, 128931, 8296548, 8278871, 115158, 128273, 8349232, 8340349, 8292033, 86300, 750, 8258572, 8267010, 8301295, 8289370, 8350737, 8271601, 117158, 121611, 8348766, 49157, 8268097, 21598, 8314260, 124640, 8367307, 8350425, 126020, 64811, 128628, 71579, 8319413, 32876, 2496, 12610, 8267849, 8256180, 117224, 128713, 111262, 87709, 11763, 8333665, 8318926, 101664, 7285, 60602, 8257186, 58684, 2627, 96671, 44030, 8253196, 8280755, 8313823, 8332201, 8367862, 37335, 110608, 8353931, 8361376, 8259360, 16200, 8274435, 8378497, 8322141, 8376661, 8370327, 17788], +[10036, 90476, 8312026, 21968, 17737, 8354569, 8258303, 4966, 16638, 6462, 8308343, 38929, 98998, 73772, 9869, 71265, 8275354, 8307706, 29761, 8267722, 8299056, 67177, 51150, 50122, 102032, 8896, 58023, 8262198, 10902, 8768, 8283145, 8365996, 8263660, 8318244, 8279297, 25133, 9369, 45390, 8360051, 8261398, 27101, 8362538, 107688, 72563, 8302714, 8373194, 124922, 37359, 8252163, 17506, 8293980, 8349374, 8265712, 8313173, 68514, 8303511, 43483, 86493, 91454, 38894, 8299574, 43201, 8348968, 88801, 8269260, 81247, 8342701, 112939, 8326960, 8255083, 72024, 88610, 25455, 8307896, 8348723, 127227, 102717, 8323585, 96069, 8322458, 89006, 96288, 107974, 8302985, 8260991, 82462, 47981, 42522, 65284, 8251604, 29152, 130672, 109777, 74637, 118228, 50373, 8361080, 79106, 8271966, 8301235, 8320038, 8328757, 87687, 57087, 53862, 64420, 93067, 8349795, 62607, 8322046, 8361387, 8311478, 8337979, 18969, 8376799, 8369137, 8360260, 8298332, 21207, 50582, 8253071, 8263268, 118803, 8250638, 8359167, 8277912, 8270886, 3288, 80001, 8357759, 99442, 8284103, 79981, 8309239, 122031, 13576, 40019, 46755, 92156, 86944, 56949, 5353, 119163, 45851, 90123, 114181, 23058, 35597, 8343330, 8342100, 8298853, 17486, 108647, 31261, 23257, 8259044, 37493, 26998, 71119, 80728, 124591, 37625, 17680, 25649, 65299, 8328617, 8347763, 8281000, 103646, 8306236, 2079, 8317390, 1100, 8277290, 8355750, 8312969, 8286054, 56302, 8361580, 8267761, 8266679, 72003, 44843, 34808, 8303585, 8356103, 4643, 8340974, 57651, 8305710, 35137, 35665, 8298220, 5064, 8267056, 30462, 8289839, 86277, 84259, 8288166, 55156, 8268971, 17887, 56993, 57199, 8274937, 3465, 94455, 8341660, 8346803, 62854, 45218, 23663, 8293684, 72347, 10128, 8370423, 67096, 77035, 8371103, 99690, 8339732, 8272178, 8285702, 8333401, 110632, 8286982, 8376834, 8296375, 77323, 1520, 86814, 43101, 8293728, 8375254, 8350996, 21974, 8370045, 8276790, 32672, 110889, 5476, 8370014, 129960, 111329, 114474, 104492, 92095, 8335854, 33484, 41461, 124993, 8305212, 8294096, 8295856, 8284435], +[8291341, 8270577, 8375778, 57191, 8368442, 8378974, 8249397, 8327428, 8283871, 83020, 8253448, 8327552, 8309105, 8314158, 8300966, 95673, 8319403, 8375420, 113543, 8366217, 74605, 61470, 27180, 73603, 8315880, 8296606, 8272282, 8308493, 8317468, 8276043, 120498, 8304963, 51230, 8322221, 73054, 8258526, 83846, 101007, 72178, 8324009, 42630, 14268, 8336865, 50585, 8335567, 8260070, 8269818, 94038, 8327624, 107130, 8254407, 1660, 96623, 56675, 8293290, 8339875, 8364878, 10798, 99459, 8366558, 8295047, 35709, 70875, 8379260, 8331801, 8282175, 93936, 76901, 93809, 8342437, 8355564, 8271027, 8276089, 8282217, 81779, 8297601, 61344, 118998, 8270921, 124855, 7837, 111556, 8255453, 8369084, 56105, 9763, 8284272, 8302084, 8274521, 8282510, 8253708, 8299181, 33830, 8375061, 60063, 8271814, 8277583, 8364810, 16261, 83709, 8308565, 8263220, 8284594, 32566, 106733, 97792, 18760, 8349255, 8320042, 8373722, 23449, 69487, 8340590, 36745, 121944, 23408, 8279303, 74371, 8329949, 34144, 8329496, 8321628, 102959, 8366802, 8271607, 8330671, 8308403, 8350670, 111605, 8322245, 116257, 8364337, 123704, 8267754, 8349892, 20574, 117766, 125313, 8367737, 8347257, 8292849, 32952, 8267560, 63884, 13314, 59887, 8330743, 8313577, 8342894, 125908, 8310049, 8374292, 20592, 76528, 8280553, 8331302, 8343144, 8259759, 36692, 100045, 8371002, 8264311, 7566, 59371, 8294486, 8367662, 8349389, 11473, 56400, 8278868, 86229, 8332995, 8378855, 7732, 80667, 112741, 95924, 130461, 16995, 57097, 2934, 120332, 8308507, 8257363, 48002, 61018, 3441, 8323746, 8275878, 49539, 51189, 8299426, 8292223, 8259370, 8306758, 8259493, 8305554, 3903, 80646, 65987, 8341488, 116182, 8296877, 41708, 112824, 8327379, 36999, 8308776, 74675, 8351698, 8297794, 8303710, 8311064, 123866, 123356, 8331740, 56694, 8296594, 8283502, 8344886, 8268535, 8374941, 8311904, 6317, 6793, 8253264, 8302991, 8261951, 86747, 8348890, 8353601, 8315775, 111633, 8307234, 8273806, 23700, 99199, 8357842, 36357, 53771, 8276592, 118107, 8260842, 40621, 75809, 64287, 57759, 8305301, 8258019, 101980, 77243, 107827, 8351677, 8331693, 43628, 8258168]] +||z||: 131020, ||z|| too large +r0: [[-63883, 51785, 78744, -11877, -32275, 73006, -59072, -31177, -84335, -82078, -82664, 88276, 67830, -10467, -25374, -82242, -62102, -79973, 78452, -2901, 51332, -15032, 93036, -72166, -19161, 21921, -37463, 32895, 35879, 12101, 46931, 68443, 52879, -19845, -84689, -46780, 20848, -3468, 3269, 12100, -60912, -6512, 14370, 13621, -46133, 57409, -79838, -36531, -7191, 78884, -81595, 16857, -69169, 27779, -76956, 34464, -74113, 16125, -56238, -37005, -40933, 25207, 14602, -65635, 34756, 45932, -24876, -33847, 2450, -28236, -30083, 15155, 28957, 77580, -27868, 54960, 15162, 43663, -80106, 37688, -19635, -58566, -467, 27376, -46371, -56414, -93502, -23804, -49797, -10120, -34270, 11640, -2619, 4625, -38011, -37986, 68322, -94811, 29740, -8797, 4715, 25713, -53193, 66955, -3400, -73683, 57028, -20186, -47631, 68051, 11005, 75237, 69181, -84471, -12995, 93110, 62086, -29210, 7215, -621, -93588, -90723, -50890, -56148, 51038, -38149, -30107, 14020, -31224, 28472, 73933, 11385, -23650, -92243, 57265, -41983, 57919, -81841, 22227, -58258, -83585, -50788, 62044, -20108, -4635, -33874, -68058, 82997, -56593, 59961, 33834, -18940, 32476, 81157, 59975, 33590, -56097, 56926, -61336, 23216, 33432, -41746, 19425, 12711, 72647, 64160, -49661, -4408, 79192, -57246, 66645, -92551, -73480, -10576, -44450, -62228, 54612, 25056, 2154, 9443, -46430, -7234, 72082, -49250, -53386, -46632, -37065, 2647, 19827, 52423, 44734, 67563, 40327, -73218, -9628, -2089, 77319, 93704, 37085, 93916, -55716, -94594, -21249, 47560, 18762, 59025, 87429, -75306, -68738, 54612, -77294, 94039, 64699, -72636, 58565, -65705, 27165, -13824, -20355, 70026, -68388, -42051, 17498, -44245, 60624, -45203, 69965, -17539, 41083, -88573, -26672, -15946, -369, -23533, 44218, 10464, 14202, -33473, 70752, -83755, 23779, -72566, -27948, -53355, 63805, 40139, 67509, 10958, -51344, 49417, -8887, -53261, 66624, -23857, 92676, 20297], +[-4128, 93945, 8634, -25363, -92114, 91086, 63069, 20088, -32402, 14855, -2554, -11484, -14088, -59912, -75637, -46145, -13987, -58344, -93220, -6997, 38643, 33131, -94087, 31606, 54756, 16427, 47669, 85137, -73785, 50013, -10492, -77743, 60938, 24511, 46344, 55750, -41983, 18452, 28778, 70414, -35496, 31766, -10980, 92306, 82493, 53220, -42682, -13674, -24586, 70680, -71445, 73183, -50485, 60511, 30709, -4677, 76502, 51945, -41478, -16894, -30220, 28963, -45939, -75194, -62395, 3863, 67088, 33361, -66419, 15275, 91246, -69886, 92929, -38217, 53018, -61255, 83856, 71647, -68761, 441, 21716, -63775, 5218, -84632, -73627, -68997, 24706, 50417, 60668, -2481, -40042, 20794, -69269, -29730, 38781, -69936, -10000, -67656, 94458, 22520, 75703, 86444, -13891, -64222, -43209, -93157, 82017, -915, -14015, -50494, 83052, 21489, 16164, -62249, 49954, -44584, 74403, 15965, -18362, 93798, 60197, -57947, 75782, 20156, -58661, -45715, -86367, -708, -47829, 28361, -69158, 77520, 23512, 21222, -16187, -3100, -4516, 68997, -43633, -59121, 5277, -91692, -84446, -21230, 8134, -2643, -13055, 67740, 64891, 1963, -58111, 26429, -23834, -23919, 30629, 27091, 90622, -60794, 11620, 19834, -24751, 53813, 67908, -2, -69569, 86030, 9329, 82594, -57142, 39033, -61896, 92133, 56996, -94697, 71049, -83596, -15952, 87676, 92473, -44568, 4784, 61448, 80235, -20637, -62821, 61893, 18909, -60255, -89496, 76007, -55201, 5628, -30784, 59427, -76930, -4838, 54546, 49727, 85425, 18218, -1173, -2697, -68266, 84167, -86413, 75810, -2313, -74539, -87197, -44810, 22102, 28828, 39274, -21471, 9323, -3881, 16320, 33287, 43718, -43704, 90340, 25570, 21172, 7128, 61694, -40038, -32660, 27450, 25607, 35882, 47745, -3533, 20299, -90931, -90002, 87720, 86653, 49146, 57853, 83780, 49414, 42545, -33362, 1508, -7128, 93263, -85935, -65995, -77819, 85662, 35171, -81127, 35202, -88274, -83988, 56542], +[-2002, 2526, 50895, -70423, 36358, 12023, -44424, -24854, -81692, -14431, 40630, -57677, -68364, 86816, -37369, 73540, 11356, -83197, -222, 13183, -91375, -62180, 45589, 12655, -38063, 80037, -18885, 17389, 964, 27363, -82011, 22667, -8963, 34179, -92663, -48313, 23527, -66417, 52733, 6177, 60416, -3518, -9189, -30880, 84561, 36694, -19728, -9874, -63089, -58556, -65238, 49487, -40232, 40550, 34320, 7343, 80914, -25537, -12151, 72567, -38374, 1887, -57192, -5799, -55727, -64118, 72316, -26667, -39101, -15565, 63583, 48897, -18902, -55520, -92983, 22055, 35550, 56369, -2584, -64349, 3985, -16623, -64747, -26597, -63650, 80969, 60532, -73856, 1688, -17811, 53207, -42884, 26568, 90977, -34289, 9983, -79368, -6113, 39429, -39512, -67662, 80625, -41853, 48312, -38704, -18508, -30872, -24998, 44943, -50346, 13422, 13511, -38063, 52400, 91866, 60630, 90569, 38857, 90776, -77554, 53004, 88116, 89197, 48766, -86318, 23722, -18755, 15021, 86174, -87895, -34068, -73065, 40985, -22829, 40913, -83822, -9873, -49417, -2670, 92563, 32638, 89587, -2431, -20086, -76241, 19209, -55261, -56169, 76195, -88558, 16018, 8456, 56780, -47270, 37409, -13313, -16083, 89136, 3019, 49839, 91358, -47046, -3900, -73095, 37467, -26612, -94106, -19155, 64512, 13867, -30719, -47787, 63316, -51850, -81529, 25143, 56343, -44181, -78716, -59499, 59000, -37790, -32199, -3085, -15555, -37717, 43654, 57723, 22904, -90258, -10029, -35817, 39105, -36051, -11238, -55346, 79099, -7809, -38885, -35959, -55345, 90645, -75851, 93306, -58309, 67491, -18774, 10020, 30179, 55828, -50832, 10680, 56107, -17184, 18021, -89332, -36586, 41392, -13640, -91691, 13336, -11487, 44907, 83938, -36448, 43755, 15180, 8789, 88513, -77437, 81436, -36951, 7053, -1975, -85459, -28924, -19259, 2246, 90767, 5973, 88826, 84792, 50827, 47307, -61215, -62837, 94064, 4404, -45463, 928, 89813, 65656, 6420, -42469, -41933, -35963], +[53697, 39066, 92084, -34269, -1805, -16020, 90352, 62256, 78164, 92715, 68191, -92233, -35467, -46393, 51907, -24055, -72080, -93391, -26615, 30924, -2917, 65914, 29549, 62907, -74122, 37222, -77427, 51651, 30159, -24507, 8510, 21385, -1344, -71853, -44591, 922, -60553, -87089, 67872, 84980, 93350, 93651, 60527, -81028, 83087, 68645, -95057, 22576, 72675, 31521, 18422, 29676, -78082, -15628, 90018, -46979, -47467, 80532, 948, -22523, -80804, -46448, -93400, -73274, -45273, 27526, -15629, 54810, -46840, 69393, 27483, -18307, -6343, -63852, -38181, 58910, -35073, 80660, -19832, 10812, -74544, 7006, -21258, 16324, 49794, -13121, -11006, 41234, -5357, 86312, -45811, -30525, -51225, 53154, -13550, -86460, -54357, 75414, 4578, 56133, 5396, 26691, 81262, 27089, -26182, 66225, -11796, 59898, 20950, 33544, 90568, -90045, 32120, 82851, -14763, 37483, -71637, 5691, 211, -7548, 49489, 60359, -51959, 12663, 74430, 62109, 75527, -57313, 14544, -27482, -78467, -88923, -39880, -68711, -11488, -10984, -14292, 80140, -58973, 43752, 79062, -6576, 69827, 56987, -83149, 38017, 13826, -40644, -86709, -12013, -60487, 84560, 7334, -22362, 46954, 49782, 3241, 58684, 524, 83432, 63084, -22321, 6800, -60058, -55562, -94789, -80243, -68331, 8011, -11437, -72038, -70549, 59023, -28925, 476, -13481, -32236, 57540, 72016, 79083, 50267, -49103, 17720, 74542, 41335, 11984, 62412, -47664, -81304, -30605, -3653, -45961, 76418, 33193, 27098, -88976, -27930, 44289, -86996, 5692, -42300, -75698, 73670, -20111, 45638, -76261, 77628, 62221, -80521, 22915, -7081, 29338, -71063, -61345, -48203, -92340, -2185, 24271, -57348, -37727, -559, -77821, 88898, -94827, 52866, -19143, -81708, -21084, -79100, 67518, 21211, -90139, 57522, -27979, -45826, 71368, -53595, 49462, -79277, -74471, -36875, -78357, 64355, -18873, 44448, -20493, 40026, 52574, 21162, 25507, 86010, 58209, 89281, 46766, -49236, -58321]] +||r0||95057, ||r0|| check passed +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-84840, 117763, 52680, 75654, -50073, 98811, 99830, 96973, 1590, -16278, 61118, 130645, -60448, -126424, 60085, -12442, -73783, 41682, -91137, -65824, 48054, 17560, 124594, -111918, 26718, -65603, -110890, -53647, 106653, 51242, 67788, -27922, -75840, 3639, -37134, 99472, -52227, 111914, -49423, 119043, 80547, 44922, -49470, -88005, -126410, 114178, -118977, -89158, 61800, 32704, 81780, 26488, -23354, 122391, 118600, -105091, -20176, -31708, -86434, -82750, -69942, -2580, 14164, 101933, -64957, 8402, -65270, -24817, -92991, 114251, 69107, -94313, -15115, -97192, -54839, -117851, 124139, 67300, -30275, 37719, -79344, 115632, -64753, -130161, 35086, -54087, 29893, 22327, -123638, 11758, -92073, -4716, -98836, -94342, -30801, -58932, 74591, -27005, 79210, 72842, -19904, -13204, -109486, 55550, -103030, 109612, 90330, -128676, 3586, -78608, -102398, -103862, -12722, -59275, -5761, 57620, -65664, -128998, 32639, -47244, 117850, -59077, 81064, 3510, -46456, -115422, -52356, -18265, 65086, 51597, 122777, 92421, -109880, -105176, 66680, 13894, -88472, -69244, 32466, 52924, -72615, 8383, 77316, 60814, -115913, -8210, 70776, -49822, -113431, 53696, -129561, 52209, -18007, -10043, 53251, 90257, 26986, 31443, -103117, -54495, 128262, 112842, -61681, 30123, -101569, -108303, 75207, -120914, 73490, -58118, 120935, -53174, -44654, -34942, -93321, -80001, -38726, -84256, 35228, 62532, -120467, 9350, -76525, 90211, 14221, 26956, 9395, -73641, -22564, 79220, -31020, 95214, 110619, -63980, -23655, 72065, 36830, -25562, -25454, -124050, 2175, 119849, 39680, 102456, -122458, 110513, 26688, 112164, -18219, -60799, 67269, -52609, 103658, 120965, 21162, 7265, -120091, 122727, -118422, 42512, -19525, 80757, -122152, -96078, -110713, 54285, 4335, 119421, 26300, -102052, -45574, 63703, -4071, 16452, -18638, 58764, -107541, 80236, 82971, -39838, -83049, 11932, 44506, -38911, 114496, 88180, -1348, -117775, -32194, 87424, 11761, -106838, 20771, 49906, -86537, 9395], +[-70331, -88764, -7924, 130877, -17920, -7125, 7540, 123604, 56048, -432, -88120, -2205, 56606, 69074, -109169, -111451, -33195, -62317, 34152, -123674, -4281, -1530, -59829, -127601, 114737, -196, 42179, -6803, 59230, -33239, 122983, -96474, -90958, 118342, -10244, 44531, 9352, 118459, 1431, -8672, 100237, 88483, -81402, -1076, 52714, -121289, -82125, 106478, 67025, -36922, -43731, -88461, -99059, -83671, 110399, 53008, -13427, -66076, -106731, 113563, 27893, 128015, -51510, 100415, 122774, -100950, -97882, 107044, -76490, 14382, -8954, 27228, 52818, 34480, 89506, 21896, 47278, 64288, -46094, -30275, 82180, 29770, 107082, 127541, 117622, 129741, -77927, -29825, -34013, -70456, -73863, -20951, -126786, -26863, 58223, -92907, -76433, 90885, 65196, -61331, -11224, 105053, -79333, -11112, 33150, 48909, 20530, 97680, 66845, -6942, 51759, -41856, 66053, 54043, 50733, -5691, 62299, 37955, 111039, -62437, 22501, 81192, 58778, -35916, -74840, -103300, 116293, 75355, 83344, -115009, 86281, 95593, -102910, -19753, 97191, -124108, -109618, -87175, 8421, -119749, 11659, 102120, -14493, 121011, 128108, -30943, -58817, 116263, 52823, -30, -39155, -55503, 62494, -34177, -87962, 38307, -67734, 123513, 27029, 83825, -64219, -10187, 9878, 20576, -76360, -29956, 12969, -12887, 52950, 31018, -38286, 107020, -114703, -81115, 6248, 88964, 117225, 68492, 109917, 73795, 90310, -79724, -36119, -105477, -97247, 24614, -81050, 52420, 35620, 16954, -47005, 113206, 28433, 107629, -98675, -85398, -32499, 101749, -750, 126287, 66180, 85954, -123660, -118299, 104917, 60761, -77882, -54532, 22704, -99563, -93111, -62816, 1775, 37783, 97132, 98424, 127412, -48761, -45807, 74754, -10523, -608, 128880, -65393, 65423, 81321, -77978, 63720, -120508, 9218, -100983, -16076, 28321, -1522, -65005, 26529, -87050, 73186, -8108, 98458, 35629, 117772, -105804, 115578, 101329, 59786, 10998, -66131, -92408, -123201, -23824, -4550, -49860, -86624, -118614, -39897], +[74251, 86143, -113454, 129055, -99562, -40415, 97446, 81315, -43064, 124515, 129172, -41182, -38236, -95608, -7602, 2383, -116482, -9223, 11177, -52552, -66354, -53630, 111446, 77693, -34216, 13610, 19645, -82128, 80142, -114274, 88521, -49094, 114236, -75586, -89535, 92851, -43967, 88854, 102982, -127220, 3784, -63298, -8703, 107833, -66939, 123059, -130413, 93714, 20815, 96122, 20859, 109231, -93052, -52573, 3355, -31227, 36937, 97655, -129199, -69625, 37971, -126173, -8912, -73545, 24750, 56488, 20540, -91394, -26988, 105256, -75833, 56731, -67434, -12366, 74389, -71888, 95697, -57349, -124552, -6275, 126538, -130816, 39966, 94653, 78200, -101905, -112235, -102364, 33101, 72471, -71852, -10218, 26006, -9663, -16298, -56774, 98702, 107550, 12389, 3087, 49155, -31797, 77811, 113978, 62724, -75214, -68749, 56405, -60724, 34016, 48252, -118212, 40915, 89127, 114362, -84561, 43839, -101551, -101592, -66906, 27879, -15834, 116591, -105731, -88553, 14601, -15974, 98764, -30998, -116675, 85553, -76510, 112650, -54277, 107786, -6359, -100958, 48939, 93966, -83057, -1374, -49558, 113311, -63039, 75658, 81858, 126472, 26893, 49260, 33536, 15920, -51380, 9729, -109755, -33600, 20952, 30019, -50297, 89953, -25873, 6127, -24366, -81830, -22319, 68102, -70600, -26201, 61509, -87414, 17041, 68195, 130187, -16254, -34495, -54646, 39915, 100528, 34332, -3973, -125130, 102822, 61777, 48231, 90160, -24669, -30554, -105683, 56360, 81078, 126280, -42901, -7195, -71373, -44999, -109640, 97373, 71170, 23230, 118206, 123948, -17988, -3135, -109815, -85312, -29853, -20039, 130201, 79845, 40704, -49880, 31493, 27948, -6594, -80269, -88782, 19373, 69896, -35186, 497, 31595, 65833, 125783, -18886, -32823, 96035, -78871, -4953, -68731, 100040, -104899, -3127, -97503, 16960, 98021, 46266, 99643, 116101, -115158, -9482, 95299, -79261, 43966, -111887, -125224, 120101, -116288, -3523, -109762, 1425, -31705, 96170, -117573, 30020, -114674, 78881, 44999], +[44781, -129214, 115675, -78286, 22800, -112718, -92402, 91288, -50912, 83722, 97273, 22933, 57607, 104615, 102425, -79141, -99986, -125080, 96131, -40110, -63705, -34012, 117875, -68620, -43630, -106793, -17282, -8433, -8444, -124583, -28843, -6951, 101717, -33320, 122968, -77323, -18345, 75449, -97128, 103257, -76434, 107502, 68837, -20609, -89458, -93489, 77568, -117758, 37742, 60038, -100435, -56562, -105678, -4493, 51135, 84635, 113839, -49258, -110538, 123792, 47334, 129105, -17349, 86514, -5156, 29768, -63475, -6683, -50058, 35286, 97134, 129306, 91951, -81914, 65019, 40746, 104670, 85535, -99649, -57009, 92445, -103620, -53103, -103468, -13839, 33827, 101200, -26325, -80461, 121566, 61114, 113108, -20961, -103760, 106250, -46406, -127900, -48524, -79803, -83832, -20623, 37852, 122502, -14090, -43770, 104438, 51371, 49355, 15861, 26646, 91944, -89173, -30383, 8846, -23288, -63439, 129492, -130674, -23691, 126961, 93487, -97057, -95137, -1668, -98162, 90253, -2656, -85000, -36813, 19908, -83894, -71903, -112476, -93198, 22603, 3853, 103135, 130453, 94136, -101705, 81408, -38124, 88267, -47824, 20169, -109835, 83910, 3169, -33186, 4442, 25363, -76763, 71760, 84738, 72594, 65018, -129300, 120722, -35748, -2028, -47176, 35982, 127265, -99963, -24891, -57644, 32582, -47011, -16678, 30414, 33484, 70493, 21333, -82771, 115811, 73585, 129246, 81646, 7755, 13421, -61281, 89947, -10122, -28716, -93882, 114933, -103692, 91847, -4926, 128059, -21234, 9040, -130768, 18925, -125604, 102770, -6270, 121585, 41031, 24937, -32411, -105533, -109349, 37978, -29502, 97575, -1101, -36137, 24751, -126079, 32308, 71029, -82978, -43845, 4247, -110459, -49803, -107969, -63001, 49874, -62203, 70213, 67574, -52340, 24280, 34549, 60419, 72508, 98473, 38797, 58612, 129726, 89363, -81220, 124017, -93421, -103303, 43637, -77512, 3208, 41932, -63290, -41926, -112820, 12147, 103591, 89115, 92228, 86148, 7975, 111889, -45874, 14172, 51510, -16419, -48115]] +NTT(y): [[1088073, 4527624, 5847240, 7288007, 3888974, 4841681, 4121955, 6958614, 3686007, 5594017, 4666901, 5368437, 2829411, 5259323, 1090572, 2538987, 4231917, 7087065, 5086141, 581351, 1074355, 2723254, 191721, 7346466, 5380982, 3187324, 7278852, 6600466, 5104234, 3409911, 357114, 3107410, 5783227, 5212363, 6403992, 7994693, 25640, 1726502, 6486448, 4575134, 489588, 5982088, 787298, 4456751, 6409686, 5801476, 7815465, 2169308, 7890885, 3185460, 3850709, 2774188, 4739031, 6576931, 4246775, 4973092, 5824248, 1500778, 1047298, 5615479, 3752385, 304390, 4567297, 5953730, 2400437, 1143476, 3303589, 3930561, 7325936, 2675923, 2023936, 2265022, 2811809, 1961377, 1637751, 5567743, 3479684, 7773285, 377918, 821487, 1626514, 6517429, 8098310, 7469320, 3034086, 225260, 508852, 87370, 7172851, 4102689, 1039286, 8027536, 2950685, 4142338, 6105374, 4462559, 85236, 1605685, 7703145, 2441351, 7384749, 6583167, 3764081, 3667114, 6206986, 5301804, 7643702, 7304481, 4393275, 3356737, 8334304, 4778063, 4552672, 573549, 147163, 5618417, 339781, 7624736, 7881788, 6796155, 7434555, 682762, 1803364, 1999624, 548088, 6533079, 3612319, 2451892, 653573, 6620050, 7283812, 8349900, 3298229, 6149582, 4710420, 3540416, 3049602, 8059914, 317172, 7985659, 5920005, 3828043, 5034154, 480056, 6219550, 1974359, 6954136, 1880566, 7603742, 6705810, 3249300, 6240179, 2841966, 4507157, 7880340, 7419918, 1680674, 6827753, 2357927, 8169342, 5144167, 6387797, 2988640, 3627072, 6677480, 522441, 1819311, 1637787, 830078, 666550, 5702444, 7298811, 2225837, 3006668, 1521899, 1178439, 800444, 2038674, 1319431, 1559667, 5164880, 2649414, 6871402, 3774080, 5514641, 6652472, 7419594, 3249133, 279566, 7864802, 2105715, 202195, 6660660, 2271240, 1962326, 3571355, 5776709, 1293968, 7895853, 7325084, 8313715, 3207369, 1397791, 4152907, 3223486, 870276, 3934898, 5258275, 5218449, 7400913, 3131888, 174506, 6856941, 3506023, 1702007, 5792724, 1536190, 689291, 6695503, 6255504, 3118429, 65062, 2124902, 8278514, 2278682, 307492, 3134269, 478984, 5563549, 5563979, 6487182, 3704850, 1338802, 7567564, 5320956, 390938, 1821498, 1922711, 3364857, 5128696, 8030535, 5905957, 124338, 34065, 225899, 7187093, 3568273, 7827365, 5361176, 2628585, 216305, 6131641, 7715148, 7489343, 1823746, 2300908], +[417222, 5090758, 3206330, 1707897, 7938025, 8160683, 7906160, 5446606, 3324187, 6387319, 699421, 3552719, 4142247, 2194145, 6957297, 5781788, 4387966, 2583305, 8310507, 1767937, 6145971, 978034, 2246162, 6174055, 8187524, 4330677, 1647336, 4786988, 5907644, 775055, 364678, 6050629, 4641275, 2299747, 4636499, 61884, 4119825, 1016073, 3571207, 4022859, 1525329, 7404684, 123229, 6470934, 414747, 6786014, 5815996, 3610120, 7192502, 1371907, 3084104, 2766511, 648578, 6607166, 2050567, 1744910, 442775, 4530811, 1784496, 2936029, 3299778, 1786172, 706502, 6593944, 2385853, 4220727, 3228199, 251040, 1435545, 5799047, 4779107, 7538157, 7668210, 3050498, 1470782, 972734, 8321646, 712613, 6501564, 160600, 7147694, 5595086, 2318937, 5359267, 2263722, 7680740, 369119, 4346763, 6457828, 2092851, 3827383, 7689776, 7848814, 8098017, 2634993, 3656236, 3741231, 7827021, 5115979, 136635, 2677062, 3903882, 7696366, 1361214, 6205847, 8090127, 989955, 6062904, 3618960, 1896972, 5854328, 7500703, 2893955, 7143083, 7861913, 5790129, 5887012, 5100401, 3759028, 5019320, 6783949, 2645561, 1395028, 6583722, 3190357, 4417495, 7092783, 998214, 3483906, 812361, 4449410, 3704671, 5466108, 4867349, 681730, 5090394, 5573061, 358043, 2367495, 1435580, 5278391, 5385066, 6371119, 6267698, 1206626, 2430761, 3126098, 928293, 1155000, 3574546, 6331528, 5163341, 8012513, 4592233, 2025424, 1051372, 4131861, 1254042, 3134072, 8193319, 365541, 4568806, 6213314, 174760, 3226688, 6403902, 6351843, 3416970, 820115, 7811458, 135543, 5681239, 5916624, 274528, 8235583, 4500200, 5308730, 656805, 1515241, 2085708, 214920, 6806544, 4037101, 5089320, 5203483, 2137486, 1375094, 6014091, 3980515, 2652718, 5889908, 2249724, 777231, 4219310, 921219, 7856262, 2199179, 3156292, 4727119, 1157202, 7218523, 7402453, 3265331, 5997923, 6556296, 3059112, 773905, 1213621, 5731138, 4589517, 4938952, 5087185, 1929374, 7808540, 7203164, 1958753, 930657, 1571619, 3746445, 7991047, 414839, 6370207, 4191693, 6137031, 1381645, 5873247, 6849294, 586259, 2715543, 1730569, 2276762, 7622733, 6478988, 6555643, 2418404, 903937, 2421957, 4540450, 7463768, 1981215, 3010392, 3922621, 5105763, 242808, 2230135, 1033834, 2942929, 4753721, 4959828, 4911365, 990840, 7927670, 6683456, 6972683, 5237630, 3372701], +[7641296, 2266305, 7250344, 42935, 6407319, 7369220, 2074949, 6516823, 2076806, 5499623, 5838893, 6761683, 6144703, 5398726, 1137342, 4610894, 2582108, 4287943, 5878214, 4566624, 5996262, 2848104, 5162111, 5409966, 31855, 6767235, 954856, 4655071, 1606037, 3979460, 6242010, 3275183, 6627616, 955758, 8364203, 1810661, 3968005, 4272401, 3360288, 2285751, 6892742, 5245744, 3674537, 3651899, 6571536, 3009657, 5928581, 3951494, 1614954, 7289543, 572641, 1096276, 246099, 4623071, 5853694, 5760307, 22161, 2741381, 6410674, 6157401, 7725402, 5809636, 5302956, 1304353, 8034102, 1776781, 906984, 3507356, 889910, 5500602, 4038199, 1082694, 4349163, 2400912, 5203263, 2971152, 6360114, 2727069, 7324131, 7580095, 5575808, 8282205, 3266118, 6813370, 3286348, 7081515, 666637, 1493712, 546538, 7653953, 1193659, 7903247, 5411498, 6193527, 1400587, 7713327, 309853, 6821572, 1566275, 2940910, 6377139, 2738798, 396955, 2913869, 8069357, 7893552, 1884844, 8251158, 5596434, 196827, 6658580, 1278195, 6757367, 5969418, 5242679, 5297136, 5579972, 7360169, 964250, 5833380, 3671393, 7151819, 8297239, 8208138, 2340982, 3187863, 167901, 1979795, 2733961, 7242463, 3794943, 1918461, 170977, 1040030, 741149, 5901143, 4794794, 5641694, 6587013, 1390688, 8244702, 7450449, 4565869, 3889928, 6268099, 7600426, 8301431, 7800343, 8172405, 3607968, 7121578, 2619486, 7488304, 6052550, 4033609, 6471800, 2258174, 4407633, 216816, 3626951, 3116175, 8224159, 6462916, 2603772, 7293575, 7252076, 7347822, 3501786, 4104147, 403974, 7711102, 7957369, 2929668, 6548699, 6873553, 1748207, 2751933, 3149636, 4617870, 7686352, 5135544, 2392580, 4575902, 6115631, 8216208, 1197453, 113266, 6367617, 6691142, 933660, 4542919, 3381073, 7063828, 4907377, 3248401, 6640557, 6102946, 118232, 4500538, 3764684, 2576521, 7803641, 1407639, 7704761, 5327654, 4822388, 1979244, 2074324, 8101155, 3303727, 2136822, 7123014, 576673, 1195225, 6899810, 4913594, 6141505, 5876375, 7106928, 3363262, 6130121, 3740186, 4877788, 4296130, 962385, 7547980, 8235189, 6758322, 5845582, 6837339, 1223553, 6204123, 3938890, 2953945, 7741426, 954654, 3835786, 6989470, 7209550, 6815315, 1803126, 6340967, 1445658, 2886929, 8009271, 4527265, 4383767, 3601662, 7111936, 1522043, 4810318, 1952326, 5856796, 8101015, 3007669, 3981321], +[469495, 5197371, 4840897, 6605745, 7623389, 2016704, 7814431, 6648429, 6429309, 5256781, 7286040, 3799625, 5599407, 7826789, 5256180, 4777444, 4195439, 490680, 4156866, 2606492, 2726053, 5673009, 7973130, 1884457, 6629731, 6434595, 4212676, 3644517, 6688746, 1030024, 3333210, 5826368, 5131445, 1917382, 3199602, 7199586, 7048844, 4226741, 4831700, 372533, 2987287, 919294, 3433668, 5044716, 6412871, 281456, 4122529, 6893968, 6787477, 5928723, 906619, 5698340, 4133508, 57082, 7204708, 6425323, 6912973, 3832557, 1947374, 1407784, 6016101, 1141341, 3422037, 3460503, 6661797, 6025616, 3719643, 4543641, 7342924, 6051359, 2308367, 5659052, 6787362, 1274295, 2478398, 175290, 3335036, 8040773, 3440639, 2792251, 8141403, 2359541, 3817625, 7092836, 8017478, 3150002, 5917367, 6253019, 8100563, 3871428, 6643515, 5374832, 1654604, 1758679, 4404599, 2165294, 7779727, 8206940, 6802288, 881819, 4116476, 7483031, 2781367, 2974114, 6100252, 5313487, 1159686, 7676173, 2420193, 1292178, 4482569, 6046868, 4316125, 2834050, 7375358, 5593699, 4816844, 2452671, 3191334, 6721559, 6669911, 2177366, 5675657, 1421975, 2758352, 7149541, 7790847, 2068958, 2255858, 4097200, 1093465, 6012768, 1817467, 5380952, 7057794, 6131485, 457855, 5462138, 7930941, 7946123, 650473, 4493708, 2322273, 5209758, 742831, 3760705, 4168388, 7754035, 3066085, 2191629, 8068842, 7569716, 4423556, 4570300, 8213028, 2758280, 3022163, 1359800, 3315874, 3544904, 6585208, 2751893, 7034720, 2815563, 4637542, 4550438, 918541, 3934932, 2330700, 3029434, 6123006, 2188987, 7993287, 409982, 3525205, 3729751, 4350016, 4899129, 2941574, 201492, 6587571, 4111739, 5617045, 6616077, 2676911, 5248023, 4214105, 2686589, 869189, 5582620, 6383688, 4477680, 4380523, 6453880, 7718680, 2569899, 4259990, 590829, 1286324, 1380554, 2351860, 6204335, 4247612, 6580874, 4404700, 1086037, 1888220, 2854279, 2805852, 5148018, 1820747, 7067428, 2483195, 4786803, 1049566, 7821317, 2078392, 1506840, 295832, 4617829, 6731626, 3386983, 2167493, 3332761, 1139067, 3814674, 1773920, 1459017, 5604678, 6247741, 2394377, 8117179, 8168593, 6434555, 2457931, 4569432, 4016031, 1444110, 6310307, 5726615, 5247904, 5127971, 1306564, 6286304, 532594, 6274386, 7002744, 5450328, 5083577, 564925, 5706118, 3497028, 8138546, 7777153, 3159925, 4081216]] +aHat * NTT(y): [[270439, 1411037, 3377986, 78159, 2180123, 1422052, 1539112, 4901871, 3499164, 5202915, 5895461, 6245409, 5661, 5520541, 6963748, 7375972, 357689, 255839, 6953748, 1300170, 5686391, 5381591, 6025671, 692468, 3813346, 7064302, 8265258, 6333634, 641012, 7799324, 7631007, 6778528, 7015864, 6492383, 1546856, 5388201, 7343229, 5795471, 7794468, 5984449, 7704729, 2583493, 5903665, 5290330, 2723371, 4469623, 4634712, 3833999, 229613, 4840059, 5988016, 7869482, 6142921, 4134744, 6728559, 1448930, 2499244, 868269, 3675580, 4128116, 1633331, 5473768, 8039539, 221897, 5449129, 619008, 3186765, 7601650, 6469561, 2649495, 1944846, 2641664, 4413249, 5022101, 4948349, 3763931, 4332795, 2462908, 5609865, 6334703, 6439823, 5716034, 6368697, 3965070, 6553067, 434943, 5269846, 7068965, 2511877, 3869856, 6020334, 2454395, 694163, 6098709, 5894956, 6858074, 7911100, 451403, 2487949, 2857793, 1117452, 531522, 6586000, 7248477, 6161964, 2480315, 1212450, 1535116, 4690555, 5426276, 1978615, 4490013, 4119858, 3139696, 2287571, 265875, 5450308, 5558510, 571996, 7980836, 3117111, 3070862, 4613476, 6358709, 1116687, 3475251, 2324795, 289123, 1753647, 4551872, 7051247, 4271872, 3621759, 307571, 4463206, 5539950, 2758876, 1168112, 4260769, 2489571, 4997475, 1551997, 811992, 3864818, 8189661, 5708611, 5655256, 100693, 7514304, 4502295, 5959216, 4369905, 1689582, 2511305, 3382188, 3003285, 3971609, 7834992, 6441726, 5885280, 2251605, 5341337, 3087824, 6110659, 4923959, 7916180, 7411763, 4411104, 3797597, 1911050, 5999092, 2677961, 6388421, 6838456, 305566, 2188744, 500351, 7288058, 4568389, 1742411, 5735486, 1788148, 5489697, 1683021, 1357541, 1325630, 8040164, 2793414, 2772766, 7870602, 6168526, 1145799, 1403387, 3641817, 1124649, 1233705, 1356142, 5011012, 4678335, 1145790, 7648366, 4981430, 7138199, 6143835, 5431165, 3953282, 4555644, 7447701, 7430096, 5206325, 1649025, 3700212, 4106442, 4062045, 5080650, 1417100, 1759276, 784375, 4667173, 3661887, 4324724, 702200, 5636528, 740386, 6137036, 465242, 356675, 7676519, 1490083, 603059, 3084235, 2758380, 688895, 5368148, 3468603, 3643497, 4278023, 6221160, 1246505, 5649340, 4448393, 1534168, 6312053, 13446, 3798373, 392323, 8097640, 4820757, 501334, 3678061, 906673, 3652378, 5428514, 6829935, 7470838, 2307732], +[1441270, 8068310, 301738, 7196829, 766548, 6821201, 7558911, 2816785, 4112317, 5982287, 2118034, 2706917, 4752384, 30228, 8328555, 4851594, 5135697, 8070952, 7227189, 5209493, 190937, 169260, 3074693, 6872128, 6827410, 3429283, 7718955, 8096905, 3132988, 4130902, 1033341, 2825519, 7714377, 4501728, 7924100, 2405164, 4243971, 5679393, 6994804, 2157816, 2601145, 6835607, 6500566, 5340526, 4223098, 7953895, 370651, 4229396, 3780172, 7482911, 5386745, 6773588, 687356, 3751453, 4790327, 6635415, 646035, 7326654, 2143395, 4037002, 6541502, 3397121, 7114200, 6684448, 3537928, 2028419, 874764, 6419065, 3332758, 5519924, 7041646, 8275961, 3770481, 5073453, 2610203, 1530624, 4454491, 6493789, 5661679, 688206, 8151520, 7151858, 918092, 5781516, 6232786, 4442483, 4394134, 7314110, 651326, 4022981, 2837190, 2229720, 5092180, 1060549, 5141435, 7096555, 949540, 4235365, 8330517, 5247593, 7789544, 1371472, 4144797, 596779, 7087855, 149585, 1176960, 1681684, 137454, 6234722, 7170943, 4176676, 3807062, 3866746, 8346719, 1723236, 6153753, 4609744, 3863881, 553192, 4674724, 817934, 3909035, 2104089, 1490086, 1118742, 312912, 2043333, 4685437, 5807133, 5330244, 2800067, 2811984, 137393, 5665439, 2954357, 6501698, 1070751, 2492082, 3586571, 5234853, 2738282, 2773108, 2435738, 2675347, 787889, 2023693, 795073, 7674041, 1659350, 1237083, 8068188, 7151281, 6378375, 7460786, 2643496, 3011461, 1281648, 4518649, 3920261, 6537520, 5522485, 276304, 1553170, 3731016, 3177386, 4956975, 2703487, 6702981, 3558637, 4083543, 3179920, 7693289, 5558263, 1166759, 5047964, 6680810, 756394, 3060404, 2913261, 4978025, 1450487, 3382902, 3758840, 4023524, 4038176, 712681, 2666823, 1193871, 3448514, 5713024, 3086728, 4493939, 1509586, 4236197, 8095005, 7670130, 5640886, 763535, 5826894, 4512310, 5470813, 2350042, 6950934, 7470584, 186365, 6419973, 5983886, 8051793, 7279665, 3142429, 596146, 7192184, 2849051, 374003, 909904, 1870834, 14362, 7840049, 2453596, 7931184, 6283694, 5921383, 7353203, 2176675, 3260687, 1437674, 400096, 1076453, 429043, 938487, 4057156, 4932986, 1472643, 3902890, 2948250, 7940538, 3808769, 2015389, 1227040, 6794784, 8150400, 4834920, 2368384, 2879398, 6734867, 5035915, 4258681, 2788386, 573273, 1121245, 8035407, 6685620, 4801094, 6409635, 6250889], +[4972682, 1791296, 1391484, 2280859, 6338938, 2334721, 3576375, 2251461, 4504096, 3002649, 477709, 5935258, 2526801, 3257454, 5265805, 3370730, 1916006, 3417121, 2720550, 2122078, 4528257, 7082414, 6852245, 6862340, 4647656, 5208398, 1869742, 314056, 7893714, 2218993, 78036, 4548252, 1320217, 7871143, 3663151, 4903400, 7108280, 3290139, 2283018, 4823606, 358634, 4143505, 5944462, 2229452, 4992428, 1077170, 1714259, 1191478, 4921679, 2152002, 5104295, 2990978, 3330674, 4447721, 4724011, 2780333, 8350979, 6044926, 1210788, 7565931, 2595, 1494688, 5159434, 6975516, 3477118, 5660457, 4009737, 4778053, 5915711, 5081226, 3849254, 3317308, 6004436, 6546017, 50478, 8239127, 162752, 5282251, 7382552, 2766905, 3175764, 5905593, 4966284, 7568169, 2929867, 4823134, 7975152, 4511053, 3140291, 6294075, 1714307, 6717316, 3025246, 6777900, 5199260, 5280386, 1208427, 467993, 105344, 4052764, 2103431, 3864485, 4934893, 2804621, 4364161, 2585783, 7832628, 1610103, 199454, 2369320, 1997187, 6595117, 2561155, 2068302, 7474203, 5577634, 6446434, 1992091, 2896906, 5826731, 3735651, 4968075, 2380768, 3036065, 6436938, 5838947, 4802503, 4724616, 7113408, 3302927, 1361138, 5213889, 1666323, 7372067, 3094469, 2947377, 862888, 5983646, 85419, 3057068, 3999186, 7755723, 1335044, 5008335, 4837946, 4637128, 3060531, 7250144, 1981303, 1800950, 7629457, 102592, 2000223, 2932354, 528381, 3392273, 3335510, 5696104, 777076, 5778199, 4845375, 3835063, 8340729, 8002901, 4539655, 1969592, 5075552, 5498285, 2178086, 3942923, 1613838, 1414899, 5384003, 6025565, 1346961, 2480827, 6361148, 582527, 2140475, 1079974, 1833351, 2430323, 4708831, 811834, 8285109, 5096145, 2057685, 4431298, 1499358, 200306, 7966923, 3011895, 754467, 6372902, 1803897, 328195, 7260540, 2671591, 5116225, 7849147, 3681298, 1847983, 4010245, 2375487, 4234193, 581714, 2861195, 7246240, 2596294, 7432213, 8295317, 5506748, 673817, 3526111, 6158634, 6025539, 3132487, 977428, 5479947, 8000176, 95314, 6630237, 7453087, 697959, 3553495, 6610343, 6205630, 7028920, 8147264, 8074420, 1770955, 5446165, 2487223, 6626229, 1080392, 2740434, 6888644, 7640724, 830483, 2710953, 6804999, 4656069, 3631195, 2448187, 3865565, 8165282, 296746, 4390449, 7242080, 435448, 5281486, 4458418, 1382865, 6730646, 1692415, 7228314], +[4024774, 1857842, 5266907, 4774314, 522814, 6075117, 2546077, 3821746, 6656982, 3069486, 4109179, 3177705, 705894, 2666195, 6890609, 1975060, 7673256, 2109300, 3507816, 663850, 4949519, 4460373, 5886262, 4472670, 2912411, 7918080, 5934547, 7489490, 8195679, 1134344, 279990, 8318825, 1545390, 4776518, 6504330, 4790405, 6019086, 4517375, 1197543, 8173382, 6892281, 5394228, 2598642, 8298090, 8122596, 5509682, 6306700, 193777, 7081160, 7590798, 2548818, 3029662, 5869190, 6100251, 4481901, 8091858, 2426588, 175254, 1792245, 6878975, 8188162, 2178007, 1190468, 1020488, 3005014, 4489954, 2160471, 578508, 3090104, 8177165, 1842803, 4099334, 4467832, 5287289, 1345083, 951716, 1855239, 4021550, 2727182, 1112458, 5876551, 7893013, 6570530, 6582877, 5175811, 6199854, 2933513, 6295113, 5639992, 5999440, 4088946, 1329676, 103062, 1922531, 4824983, 930695, 5392185, 4764880, 2736735, 8197297, 1436483, 299300, 953214, 6841547, 7484104, 4682660, 1523413, 3228739, 1779979, 1976165, 3001808, 3451704, 7873046, 3008236, 5771214, 7683326, 6236777, 1570044, 2234648, 4523552, 7842516, 1740435, 1080676, 2035179, 2398624, 7773951, 2382299, 5751370, 5025388, 625977, 3401347, 5069435, 6377785, 5472123, 2219090, 5603090, 5594420, 3569997, 5154630, 8249961, 6216176, 1477467, 3332360, 2109516, 2246415, 5581141, 1423790, 252681, 2497444, 5468184, 5125122, 5635290, 7305262, 1232260, 983721, 4989322, 6107247, 2589314, 5937402, 921081, 3972998, 7630256, 2613488, 3915119, 8058168, 3670961, 5226082, 4209546, 7259307, 5578360, 8013599, 4415195, 5874263, 3275209, 2248204, 4310642, 7917312, 7891430, 3281603, 3412398, 4619623, 5059065, 3757670, 7599732, 4753099, 4790149, 7560941, 5660526, 1902811, 7843223, 4491580, 4235555, 6671727, 3652997, 7360645, 2178203, 5093195, 3176023, 1037830, 3449462, 3369243, 2931748, 1995847, 6034305, 7994772, 1166272, 4473061, 2368570, 7133439, 5292025, 4252587, 6907184, 372043, 3862890, 4477639, 3111520, 2525285, 6161537, 628214, 8018799, 6217732, 7262235, 283667, 7641661, 7739310, 7674065, 4924107, 752140, 343555, 7168660, 7574192, 5298099, 5371078, 574577, 735928, 8069735, 588272, 4554475, 1664055, 2747118, 8369383, 4099344, 4005756, 8325869, 7435823, 8236331, 366017, 7985056, 3338248, 8013835, 5382298, 3310744, 4405017, 99250, 7779408, 306435]] +w = NTTInverse(aHat * NTT(y)): [[6810060, 5257295, 3345583, 563675, 2836703, 547228, 5361665, 5992755, 5084814, 3315175, 8274605, 1850047, 2172053, 6165931, 1831180, 2584211, 6374627, 6752156, 7824113, 6345678, 6210108, 6552017, 6090444, 1977866, 2095932, 654181, 6135955, 1701793, 2492319, 273562, 2274683, 7605268, 3432616, 6241327, 6090594, 5037093, 2433492, 6492107, 769107, 2249870, 7747152, 862336, 6984462, 2882730, 1481930, 504950, 5428312, 3889903, 3470199, 6075553, 390654, 5432315, 6093208, 5047184, 2750411, 4691774, 6190863, 286665, 6847365, 3074794, 2414883, 3956958, 5826818, 4475784, 8069308, 5763459, 4096128, 3996498, 6622285, 2812756, 5181899, 5511536, 2267672, 4808858, 4539829, 5293998, 352697, 6116656, 3356186, 5077122, 1384863, 4168883, 8204574, 6762031, 7982928, 5971938, 1713792, 257917, 1971971, 7324845, 8318138, 3529583, 8080948, 5350186, 5957622, 6025144, 7982838, 5587477, 3291765, 1816959, 4882010, 5796387, 3951888, 7920334, 4025055, 1951560, 3572826, 4059910, 2681065, 8285583, 5739081, 7640414, 6913583, 2343183, 660858, 8211560, 4467485, 550045, 1176015, 2290350, 4336432, 5102418, 8236768, 6833365, 6682988, 2863085, 3216113, 5654687, 6346513, 2276840, 7087590, 6575819, 7523431, 4854376, 1160149, 617581, 1362257, 4179289, 8308324, 5648908, 7446702, 5451334, 7047349, 5148881, 7459033, 7830470, 2333917, 3138547, 5543837, 876323, 1158376, 735444, 1471120, 613167, 5970922, 6096918, 2754375, 2780955, 4754069, 7468161, 2144640, 2898340, 2251696, 229491, 5460893, 3829178, 5878117, 6319089, 74056, 3297315, 4042048, 4711962, 8204448, 4654703, 1285683, 7434843, 4118231, 3624810, 6890483, 7028958, 6676126, 5416594, 5183184, 1027346, 4484787, 3405892, 8105594, 1022268, 4835352, 6486881, 6076569, 4315027, 6952114, 6668703, 1241352, 2260652, 440881, 6260090, 2925987, 5062999, 1307248, 6426499, 4060110, 4688243, 5182302, 5094896, 7143829, 6201727, 5946744, 8278720, 233488, 2931900, 4836732, 5880504, 7792717, 5685863, 2257945, 4091436, 6640950, 2759011, 5782620, 5098681, 3582628, 4387985, 1511354, 1101721, 5044827, 5759042, 6195504, 1878917, 5374397, 3781938, 5400091, 2313818, 4471911, 3887175, 7337812, 8215304, 5189572, 589717, 315656, 1611167, 6553875, 6539852, 6037350, 905324, 6905269, 2860728, 217119, 4128930, 6671457, 6165801, 3488346, 7781498, 3904266, 102617], +[2827127, 2106670, 7547276, 7086876, 955315, 4132137, 7891601, 2699294, 4112040, 7211844, 5118940, 3418682, 7601125, 5209460, 1906739, 208283, 632454, 7229102, 4123864, 3123848, 5877208, 7002828, 344305, 1319415, 2928570, 2035239, 5138570, 1478134, 5679332, 3656637, 1514270, 2322316, 3526602, 3102462, 4172753, 3124100, 2796890, 751678, 8325236, 7885676, 1983794, 2688543, 2083074, 982625, 2945616, 6942820, 1435943, 5325330, 7641718, 6294104, 1108333, 4545500, 459025, 7698915, 3411777, 7151926, 1307347, 7851540, 5032934, 998499, 382213, 203399, 4056088, 2253908, 8356775, 7490626, 7824250, 4106739, 786533, 7192447, 2370858, 6825975, 3592305, 3453357, 3996934, 1543656, 7815557, 3254984, 3968690, 3167638, 2695807, 7726850, 4737546, 2938455, 5466176, 1629592, 3389220, 6847063, 527871, 6280958, 508697, 497015, 4878861, 2903859, 3900995, 411503, 8023419, 1593131, 6532090, 1764577, 4982743, 839637, 1666955, 6593725, 2066929, 1572879, 5837617, 7462285, 8131845, 6724405, 7940073, 3851287, 6331171, 8343802, 5598232, 3847365, 1911005, 2798516, 7684023, 2745095, 1854605, 7619684, 6344383, 5257091, 2769877, 4639513, 3789532, 656749, 4696923, 2440503, 2798077, 4887712, 4004822, 7341202, 6812494, 1246042, 5674339, 3757231, 34767, 5753673, 3241696, 3614406, 3721198, 1145774, 4298341, 7540717, 4423754, 2159293, 2711465, 7114290, 2780582, 5586394, 2530061, 7585773, 98175, 7044198, 3497871, 55250, 1933262, 7406885, 8047760, 4519464, 3922, 4506600, 7834501, 7371818, 4425937, 541922, 5533604, 2212861, 4719306, 272121, 3970118, 4694385, 8025750, 8356604, 7126351, 5974112, 3151072, 3759597, 2566268, 626504, 7861911, 5648674, 4665166, 7851932, 4561965, 3921885, 5205401, 6361151, 5403942, 5900889, 4409959, 4309039, 4025421, 259952, 3798210, 7710497, 5015574, 8144722, 5615224, 401839, 6987398, 3427167, 1399426, 2358536, 98373, 4900130, 1044911, 2229707, 6921291, 2154924, 3175404, 3999130, 4063058, 5644721, 613607, 5180666, 2509080, 7083141, 3043933, 3438656, 5460378, 413863, 1208255, 1219690, 6990977, 5853305, 3934034, 4275457, 992464, 6165038, 4343724, 2829689, 1700754, 4839106, 6816741, 619915, 8270159, 2803583, 1666385, 3294424, 2198874, 5251878, 7405026, 4605730, 4966073, 2017358, 2315375, 1172832, 1243848, 4055429, 3052807, 5275554, 3463890, 1435442], +[7270626, 5546619, 707307, 6352746, 244647, 4735554, 3957673, 4251809, 5416761, 7742090, 5690461, 7259411, 6714793, 4262639, 7107876, 6939250, 5562742, 6424063, 3494102, 1869921, 6883202, 1381391, 6471391, 8317663, 5553306, 3880351, 5736178, 6435344, 1507310, 2700383, 4941761, 2429493, 2889864, 4616878, 5242502, 3510002, 415114, 4577354, 1751347, 403974, 574798, 2272368, 1110317, 6570432, 7116000, 1149884, 3055510, 7053337, 7886957, 4434026, 3597485, 681079, 151846, 7716925, 4860687, 5168602, 5747907, 2349754, 2376200, 1706582, 959603, 7421511, 255848, 6542542, 3032169, 7218421, 2726231, 2045033, 5877566, 8283389, 3924701, 1616611, 1490249, 8291009, 6761522, 5628798, 3670863, 5972905, 6825509, 5028127, 6619637, 7542979, 3291394, 6600294, 6121593, 4210377, 2520266, 4886952, 319201, 5831233, 2910906, 5249938, 7679713, 5320697, 2051825, 417417, 6349486, 2487631, 6522376, 2027227, 7469725, 1225716, 1125935, 4316806, 2361128, 318533, 1957766, 6743678, 6708071, 6686649, 6034206, 1016248, 6631016, 3767993, 6069727, 1741069, 1411464, 3532755, 3513661, 2452347, 507719, 4859429, 2239801, 2438793, 3930637, 5939650, 966824, 6108056, 5704026, 5455241, 6518133, 5587325, 668379, 17312, 1223477, 1643021, 8088683, 412360, 1194588, 3504103, 2512654, 4699253, 2708658, 4714333, 7527638, 3914191, 415173, 4472643, 2643969, 2178054, 4400153, 1001270, 7380384, 1695585, 5924832, 3763045, 4398100, 6145768, 1206424, 882323, 911016, 5294308, 8030767, 3452502, 1135811, 941073, 4902663, 2555780, 4165031, 6349985, 4683725, 2227928, 8093771, 2776936, 3312105, 3545256, 3670784, 606150, 7788821, 4270616, 208858, 7028204, 114173, 4057724, 8349910, 8097269, 1169218, 3227183, 2649839, 5942980, 7443482, 7358461, 4691462, 3200575, 213357, 1707902, 8372500, 6235067, 4824153, 2621395, 6409764, 2531405, 2597236, 8097558, 241990, 7552478, 3075659, 4070633, 2283089, 96590, 2335348, 7813393, 8245749, 3936876, 1860172, 6310645, 339965, 7169930, 5021477, 7985934, 1945694, 7301940, 7719181, 2689293, 3525245, 2052693, 7755503, 6330167, 7823781, 4311673, 2515321, 4134507, 2366398, 7246642, 8050002, 6297851, 4750052, 7561780, 4974476, 1480744, 2620298, 6602747, 6807386, 5782584, 780233, 6744435, 4184838, 7680407, 814436, 6995671, 6444705, 1713223, 4119279, 3349620, 1983577, 5735156], +[3320920, 4698932, 7896500, 1152677, 4805885, 49015, 2064676, 4545670, 3360000, 2596083, 6462710, 2083215, 3887818, 28535, 6091762, 2429812, 5198131, 5256902, 1513471, 6043942, 6484423, 6213498, 603471, 3556011, 427518, 1861304, 1354951, 2171381, 4633496, 6922740, 8189051, 2773673, 4229859, 7738991, 840025, 7218388, 8148149, 6118771, 6011152, 3092077, 2469038, 6109935, 1013480, 1947579, 8094277, 5885674, 1800418, 2572803, 347895, 3127527, 4693650, 3178198, 3869305, 7424955, 2565388, 1639262, 5805816, 3072819, 6270613, 4235828, 6259204, 5164168, 474667, 6728655, 1749608, 7722992, 8248628, 1996477, 1261995, 3519444, 4822261, 3151335, 1976379, 1720166, 8240287, 1091208, 82662, 5675513, 7144527, 4683800, 7825574, 6279670, 5495077, 5433969, 6907037, 5023306, 3337457, 5417399, 3946705, 942493, 4630253, 8338708, 2186660, 2130907, 3428626, 2898999, 2770412, 6796703, 5183185, 1045771, 2061182, 3372856, 7969914, 3404465, 1584071, 2376828, 2338400, 1009776, 365393, 3441822, 6632466, 1632953, 531512, 8290879, 5958537, 3313246, 4393320, 3534667, 354767, 5589996, 48812, 1949756, 7466097, 8056996, 4873381, 256569, 2452857, 6813310, 4412932, 3130787, 541480, 219354, 3897337, 5961951, 5824682, 3703356, 5625732, 2011809, 7763145, 8250493, 7093179, 46990, 2031304, 5108723, 6301841, 4943520, 4382013, 6668389, 2809029, 7477075, 7427649, 2911059, 1814979, 2402708, 5679756, 4831190, 7505475, 5974462, 5866055, 5940306, 6438821, 8077111, 3340904, 8298066, 4468634, 5410021, 3258960, 4500158, 4076859, 5342502, 4708441, 7696595, 2733468, 181260, 3028379, 3901615, 7257540, 5866064, 1071336, 3773033, 4248963, 880643, 471461, 4015364, 6564888, 1851958, 6811540, 517319, 2456309, 7562223, 6008785, 2231028, 337017, 4017768, 2344222, 6918487, 5350010, 1755510, 2831109, 5146998, 7964914, 7360813, 1546751, 3007115, 2159387, 732818, 2920137, 1636439, 1945991, 6595402, 7613964, 4642656, 4222965, 6297098, 5870686, 3273455, 3686011, 1251547, 8163613, 5036266, 7824555, 3776379, 7963411, 6550031, 169115, 5147346, 7207004, 248190, 518744, 5192245, 3746995, 8195658, 3684981, 5550876, 1773365, 4497568, 3805300, 5570097, 1036807, 3224722, 8376223, 292464, 4683990, 3737259, 1291784, 7628773, 7163248, 7721566, 2421523, 674164, 4066268, 2336576, 4791278, 6096018, 6956403, 4509783]] + +w1: [[36, 28, 18, 3, 15, 3, 28, 31, 27, 17, 43, 10, 11, 32, 10, 14, 33, 35, 41, 33, 33, 34, 32, 10, 11, 3, 32, 9, 13, 1, 12, 40, 18, 33, 32, 26, 13, 34, 4, 12, 41, 5, 37, 15, 8, 3, 29, 20, 18, 32, 2, 29, 32, 26, 14, 25, 33, 2, 36, 16, 13, 21, 31, 23, 42, 30, 22, 21, 35, 15, 27, 29, 12, 25, 24, 28, 2, 32, 18, 27, 7, 22, 43, 36, 42, 31, 9, 1, 10, 38, 0, 19, 42, 28, 31, 32, 42, 29, 17, 10, 26, 30, 21, 42, 21, 10, 19, 21, 14, 0, 30, 40, 36, 12, 3, 43, 23, 3, 6, 12, 23, 27, 43, 36, 35, 15, 17, 30, 33, 12, 37, 35, 40, 25, 6, 3, 7, 22, 0, 30, 39, 29, 37, 27, 39, 41, 12, 16, 29, 5, 6, 4, 8, 3, 31, 32, 14, 15, 25, 39, 11, 15, 12, 1, 29, 20, 31, 33, 0, 17, 21, 25, 43, 24, 7, 39, 22, 19, 36, 37, 35, 28, 27, 5, 24, 18, 43, 5, 25, 34, 32, 23, 37, 35, 7, 12, 2, 33, 15, 27, 7, 34, 21, 25, 27, 27, 38, 33, 31, 43, 1, 15, 25, 31, 41, 30, 12, 21, 35, 14, 30, 27, 19, 23, 8, 6, 26, 30, 33, 10, 28, 20, 28, 12, 23, 20, 39, 43, 27, 3, 2, 8, 34, 34, 32, 5, 36, 15, 1, 22, 35, 32, 18, 41, 20, 1], +[15, 11, 40, 37, 5, 22, 41, 14, 22, 38, 27, 18, 40, 27, 10, 1, 3, 38, 22, 16, 31, 37, 2, 7, 15, 11, 27, 8, 30, 19, 8, 12, 19, 16, 22, 16, 15, 4, 0, 41, 10, 14, 11, 5, 15, 36, 8, 28, 40, 33, 6, 24, 2, 40, 18, 38, 7, 41, 26, 5, 2, 1, 21, 12, 0, 39, 41, 22, 4, 38, 12, 36, 19, 18, 21, 8, 41, 17, 21, 17, 14, 41, 25, 15, 29, 9, 18, 36, 3, 33, 3, 3, 26, 15, 20, 2, 42, 8, 34, 9, 26, 4, 9, 35, 11, 8, 31, 39, 43, 35, 42, 20, 33, 0, 29, 20, 10, 15, 40, 14, 10, 40, 33, 28, 15, 24, 20, 3, 25, 13, 15, 26, 21, 39, 36, 7, 30, 20, 0, 30, 17, 19, 20, 6, 23, 40, 23, 11, 14, 37, 15, 29, 13, 40, 1, 37, 18, 0, 10, 39, 42, 24, 0, 24, 41, 39, 23, 3, 29, 12, 25, 1, 21, 25, 42, 0, 37, 31, 17, 20, 13, 3, 41, 30, 24, 41, 24, 21, 27, 33, 28, 31, 23, 23, 21, 1, 20, 40, 26, 43, 29, 2, 37, 18, 7, 12, 1, 26, 5, 12, 36, 11, 17, 21, 21, 30, 3, 27, 13, 37, 16, 18, 29, 2, 6, 6, 37, 31, 21, 22, 5, 32, 23, 15, 9, 25, 36, 3, 43, 15, 9, 17, 12, 28, 39, 24, 26, 11, 12, 6, 7, 21, 16, 28, 18, 8], +[38, 29, 4, 33, 1, 25, 21, 22, 28, 41, 30, 38, 35, 22, 37, 36, 29, 34, 18, 10, 36, 7, 34, 0, 29, 20, 30, 34, 8, 14, 26, 13, 15, 24, 28, 18, 2, 24, 9, 2, 3, 12, 6, 34, 37, 6, 16, 37, 41, 23, 19, 4, 1, 41, 26, 27, 30, 12, 12, 9, 5, 39, 1, 34, 16, 38, 14, 11, 31, 43, 21, 8, 8, 0, 36, 30, 19, 31, 36, 26, 35, 40, 17, 35, 32, 22, 13, 26, 2, 31, 15, 28, 40, 28, 11, 2, 33, 13, 34, 11, 39, 6, 6, 23, 12, 2, 10, 35, 35, 35, 32, 5, 35, 20, 32, 9, 7, 19, 18, 13, 3, 26, 12, 13, 21, 31, 5, 32, 30, 29, 34, 29, 4, 0, 6, 9, 42, 2, 6, 18, 13, 25, 14, 25, 40, 21, 2, 23, 14, 11, 23, 5, 39, 9, 31, 20, 23, 32, 6, 5, 5, 28, 42, 18, 6, 5, 26, 13, 22, 33, 25, 12, 42, 15, 17, 19, 19, 3, 41, 22, 1, 37, 1, 21, 0, 43, 6, 17, 14, 31, 39, 39, 25, 17, 1, 9, 0, 33, 25, 14, 34, 13, 14, 43, 1, 40, 16, 21, 12, 1, 12, 41, 43, 21, 10, 33, 2, 38, 26, 42, 10, 38, 41, 14, 19, 11, 41, 33, 41, 23, 13, 22, 12, 38, 42, 33, 25, 40, 26, 8, 14, 35, 36, 30, 4, 35, 22, 40, 4, 37, 34, 9, 22, 18, 10, 30], +[17, 25, 41, 6, 25, 0, 11, 24, 18, 14, 34, 11, 20, 0, 32, 13, 27, 28, 8, 32, 34, 33, 3, 19, 2, 10, 7, 11, 24, 36, 43, 15, 22, 41, 4, 38, 43, 32, 32, 16, 13, 32, 5, 10, 42, 31, 9, 14, 2, 16, 25, 17, 20, 39, 13, 9, 30, 16, 33, 22, 33, 27, 2, 35, 9, 41, 43, 10, 7, 18, 25, 17, 10, 9, 43, 6, 0, 30, 38, 25, 41, 33, 29, 29, 36, 26, 18, 28, 21, 5, 24, 0, 11, 11, 18, 15, 15, 36, 27, 5, 11, 18, 42, 18, 8, 12, 12, 5, 2, 18, 35, 9, 3, 0, 31, 17, 23, 19, 2, 29, 0, 10, 39, 42, 26, 1, 13, 36, 23, 16, 3, 1, 20, 31, 31, 19, 30, 11, 41, 43, 37, 0, 11, 27, 33, 26, 23, 35, 15, 39, 39, 15, 10, 13, 30, 25, 39, 31, 31, 31, 34, 42, 18, 0, 23, 28, 17, 24, 21, 28, 25, 40, 14, 1, 16, 20, 38, 31, 6, 20, 22, 5, 2, 21, 34, 10, 36, 3, 13, 40, 32, 12, 2, 21, 12, 36, 28, 9, 15, 27, 42, 39, 8, 16, 11, 4, 15, 9, 10, 35, 40, 24, 22, 33, 31, 17, 19, 7, 43, 26, 41, 20, 42, 34, 1, 27, 38, 1, 3, 27, 20, 43, 19, 29, 9, 24, 20, 29, 5, 17, 0, 2, 25, 20, 7, 40, 38, 41, 13, 4, 21, 12, 25, 32, 37, 24]] +w1Encode: 24270DCFC07D5BB42A0BA838E19886A1082ACB00264DC0A052086A8D483069513EC8D051122874A0E664A140424DF55DAA6755E3B3754C867102286D87B592EA97048A094C2AF7816A17299A57A99532550EE0A12433ACD76030D7B692E3137921538E68660C87057867576E67CA405D6110C8F081CE939DCBC3041DF5854054652B769CD6449623B71598B41699085EE5783042F86C875865DB6686DF1A3CD9977A4C353ADE365D88A179A1C2511C7351E7BA0D02228A60413E813582524A05CF829685953A96B949E8A6048369415F291CCFB221DE84301364410F01A48AB3140F8970686860022A9947AA15425031C0995A84C9909354216954454E9A3D5D229143380CDA43092A22261A918C0BF29DEBA85221D051CA833A0A1A720F460D59F368D5491E1E0578D14419177A2D4EF9740D1A9412A09C2A0660E9790D1D930555A602E51751CD907A588A555BC87DD7550514AAAD9D504A07136805432E515579C3D69490D40986517E955580D79364E4B03E49C47027A62D8C71541027216647844156595CEA99A355929D2829E421021DE58988A3350FC649029608036388A50195E9351141AA6D1EC324C5198890E92CDF5A2108407AD3476A231A8DA0D568C2F77028B70861232EA7615C8CA08CE30816230526C7243583C634D557805E2776046024AA60484DE66468255CCE721567F25117681405A74A46A135569831EA134DD3905A411954C06A44CE779E59142440983962E3AC010A554CC0A46BA58482A9A98A993AD39286E9D5588CA98619AA21CE487AC468A144292696A47851961A19B06092232E1400361B878062384C82722C18B93E564A982B08420D5828EA9738029445D4D9241E145AE1268C49BA2A8794454AB21A80676669D875A42671558101CB223D0FB9158BA44A08C31482342603F045D724748072AA5AD090173404D4F74DDE92AE25B06CA1768DCF793E4AE365E7F77DA22A011717611597A14E0051E66750562154A2420E0D0A3242C5905CF26CEA89400BF124CA886256F845D3B16A29A58AC16606C346AD539760545744809051076AA60D5131195862 + +cTilde: 514431DDB2E1846A8D7E7CA6543AE52B63590653C400244B65C052909997240B +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0] +cHat: [2945008, 6068878, 2747561, 2088191, 588983, 4661831, 7359034, 8177761, 3501657, 4119133, 6954513, 4793340, 1681457, 8340679, 5593289, 3296261, 4370767, 3513394, 7942130, 517476, 2517834, 2381244, 4945113, 6935123, 7472201, 1187500, 4108850, 8158211, 6305182, 20842, 2956115, 879692, 7613476, 2451033, 185083, 7240468, 2988410, 5070386, 3100143, 1191126, 7982941, 2247548, 915220, 3293821, 985391, 1126920, 1929065, 2266839, 74029, 7047651, 5866591, 478442, 4160902, 3519812, 6411340, 2315003, 7315875, 2575378, 6066770, 6759180, 5666106, 7823905, 4651753, 7428226, 5167948, 5763142, 3686742, 5583258, 180630, 1183008, 6873002, 3731713, 2687846, 7633533, 2183320, 7966760, 2646227, 8077828, 653702, 6428797, 3765032, 6863623, 179696, 6196077, 3154281, 2659595, 6862797, 5524635, 61788, 7188082, 8058624, 5774882, 4501353, 379105, 4607631, 3199854, 2424697, 7479674, 507091, 6384829, 1382067, 3869830, 3180312, 8237014, 4097262, 8276947, 7797621, 6463606, 3952494, 1550478, 7133369, 129131, 5292534, 538686, 3803382, 3395671, 24440, 3997478, 7288963, 2440611, 4674635, 7734935, 3891558, 7101364, 1094782, 2829651, 900741, 3168241, 2700015, 3772934, 4095208, 2761251, 21861, 4108599, 1837118, 4686023, 1521157, 5515527, 3258926, 4513729, 6287487, 8105503, 4462799, 61812, 5086188, 6427409, 5686786, 3714344, 6369408, 5766777, 1488388, 6379589, 6362534, 7714651, 6471895, 6827910, 4407992, 3746614, 5999300, 5480941, 4938644, 203619, 6316204, 2850765, 4971156, 7994156, 1062516, 3528309, 1387604, 5455249, 1983623, 5235266, 7686217, 1433707, 4697070, 6624990, 613570, 8024814, 776804, 5660391, 534112, 675541, 7915922, 1979129, 16264, 7868408, 632222, 3997212, 2757728, 3446262, 1167472, 8064478, 7081785, 1683397, 7317182, 3397205, 5136729, 61194, 5283039, 2301243, 4377640, 582813, 4308444, 1138822, 8238335, 3719257, 1160431, 2257246, 1112449, 2189491, 7339931, 3811877, 8148436, 2661117, 2200998, 5430330, 111246, 1959338, 4670227, 3730157, 1138963, 2590107, 2236056, 6776767, 2889849, 2798679, 2769848, 100317, 6637252, 7813347, 6630403, 1373995, 6807657, 2035483, 2844459, 2429672, 2121528, 3532349, 4476485, 3617918, 3015142, 6833086, 6093540, 4160341, 5085400, 4662209, 8349237, 3517206, 1923395, 660356, 3168149, 7059752, 2276780, 2208328, 1277074, 3363433] +cs1: [[8380404, 9, 8380416, 9, 1, 2, 1, 8380406, 9, 8380401, 2, 12, 2, 10, 6, 8380394, 8380409, 8380412, 8380413, 1, 8380410, 5, 11, 1, 8380411, 9, 7, 8380407, 8380416, 8380416, 6, 8380411, 11, 8380407, 3, 8380412, 1, 3, 3, 6, 8, 9, 0, 9, 8380416, 4, 3, 4, 8380410, 8380405, 8380409, 4, 16, 8380408, 3, 0, 8380413, 8380410, 19, 0, 8380412, 8380406, 8380415, 8380416, 12, 8380416, 8380412, 1, 8380415, 0, 8380412, 6, 5, 20, 5, 7, 16, 8380411, 8380415, 9, 8380416, 8380403, 8380405, 8380410, 8380415, 8380407, 8380415, 8380416, 9, 8380406, 6, 5, 8380414, 8380393, 8380399, 7, 8380413, 7, 3, 6, 8380408, 6, 8380410, 3, 8380416, 8380398, 2, 1, 10, 11, 1, 8380412, 1, 3, 8380414, 7, 0, 8380416, 7, 0, 8380414, 17, 6, 4, 2, 7, 8380396, 8380405, 15, 8380414, 11, 8380416, 1, 8380402, 8380415, 8380415, 0, 8380415, 8380402, 6, 8380405, 8, 8380410, 20, 4, 3, 9, 8380414, 8380410, 0, 8380412, 8380407, 5, 8380415, 21, 8380412, 2, 1, 8, 0, 1, 4, 8380405, 1, 4, 4, 0, 8380402, 8380410, 8380414, 8380413, 8380415, 8380412, 6, 8380412, 8380408, 7, 7, 8380409, 0, 18, 10, 8380407, 4, 13, 5, 5, 22, 7, 3, 8, 4, 8380395, 8380414, 1, 0, 2, 7, 19, 8380403, 1, 9, 5, 7, 12, 5, 8380410, 8380401, 8380411, 8, 11, 8380409, 3, 8380415, 1, 8380409, 8, 7, 8380413, 8380412, 8380415, 8, 8380414, 7, 8380407, 8, 8380415, 8380414, 6, 5, 15, 17, 5, 8380407, 8380407, 8380404, 8380413, 8380415, 8380415, 6, 2, 5, 7, 16, 2, 8380405, 8380408, 8380409, 8380404, 0, 4, 8380413, 9, 8380415, 5, 8380411], +[2, 11, 2, 6, 19, 8380413, 0, 14, 15, 17, 14, 3, 8380406, 0, 8380411, 8380410, 8380405, 8380412, 15, 0, 8380412, 13, 10, 11, 8380413, 2, 0, 1, 8380408, 8380415, 8380414, 8380402, 8380412, 8380412, 8380416, 8380398, 17, 13, 8380411, 15, 17, 8380416, 6, 7, 8380408, 6, 1, 0, 8380412, 11, 10, 6, 8380406, 2, 15, 8380404, 8380407, 8380415, 8380416, 8380399, 19, 1, 8380413, 4, 19, 5, 8380411, 9, 8380414, 2, 5, 5, 8380413, 4, 8380407, 8380413, 4, 8380415, 8380416, 8380415, 8380411, 3, 8380409, 8380411, 8380407, 4, 1, 8380410, 5, 3, 8380411, 5, 8380401, 17, 8380414, 8380414, 8, 8380403, 8380411, 0, 4, 8380400, 4, 1, 8380407, 3, 7, 4, 4, 7, 3, 2, 8380416, 4, 8380411, 8380411, 8380412, 2, 10, 8380415, 8380412, 3, 8380416, 6, 8380408, 8380409, 8380415, 8380414, 8380406, 1, 8380408, 3, 4, 21, 8380408, 8380404, 4, 10, 1, 13, 8380415, 8380414, 8380410, 8380411, 8380408, 14, 8380415, 4, 1, 15, 11, 1, 11, 8380415, 12, 8380412, 2, 8380409, 8380407, 6, 2, 4, 10, 8380408, 8380410, 2, 8380404, 8380415, 4, 3, 8380394, 4, 2, 8380416, 8380408, 8380405, 4, 8380416, 8380410, 8380403, 4, 11, 6, 8380409, 19, 8380415, 1, 8380413, 0, 11, 8380413, 14, 1, 22, 9, 7, 8380410, 8380380, 0, 4, 8380416, 8, 16, 8380411, 15, 3, 14, 8380405, 8380411, 3, 8380397, 8380412, 8380402, 8380407, 3, 5, 11, 8380398, 9, 5, 8380412, 8380414, 23, 8380410, 8380410, 0, 17, 8380405, 8380400, 8380409, 8380414, 12, 8380415, 7, 8380415, 8380409, 2, 8380406, 8380402, 8380412, 7, 8380408, 3, 8380408, 8380402, 8380414, 17, 6, 8380412, 8380413, 3, 2, 8380414, 8380412, 4, 1], +[8380409, 8380413, 3, 8380406, 3, 5, 8380416, 8380410, 1, 8380413, 0, 8380409, 1, 3, 8380415, 2, 10, 13, 9, 8380416, 1, 8380407, 8380413, 8380408, 10, 9, 8380408, 8380415, 7, 8380404, 1, 6, 8380411, 8380409, 8380411, 8380413, 8380414, 3, 13, 8380413, 8380415, 5, 9, 8380400, 8380409, 8380416, 4, 1, 8380416, 8380405, 15, 11, 8380412, 9, 4, 8380414, 4, 14, 1, 8380408, 3, 8380413, 0, 8380408, 10, 8380400, 8380411, 15, 1, 5, 13, 0, 2, 8380416, 8380414, 0, 8, 5, 8380409, 5, 19, 8380406, 15, 8380414, 8380398, 8380415, 8380410, 8380403, 5, 8380414, 0, 8380411, 8380415, 2, 8380410, 8380414, 8380408, 8380414, 8380412, 4, 8380413, 11, 8380410, 0, 4, 8380400, 1, 9, 13, 4, 4, 5, 8, 11, 8380416, 8380416, 8380409, 8380404, 8380407, 16, 4, 0, 11, 2, 8380408, 8380414, 4, 8380415, 2, 8380409, 12, 8380397, 8380406, 11, 8380412, 8380410, 8380415, 5, 1, 7, 8380397, 7, 7, 8380411, 8380416, 1, 8380416, 1, 1, 8380414, 15, 8380415, 8380410, 8380408, 8, 8380404, 8380399, 5, 2, 2, 10, 10, 8380412, 0, 16, 6, 8380406, 5, 8380412, 8380403, 8, 8380406, 5, 8380407, 0, 8380413, 8380405, 9, 4, 4, 8380404, 8380416, 10, 8380412, 8380412, 3, 8380411, 7, 4, 8380407, 4, 1, 12, 8380416, 1, 8380415, 9, 8380410, 5, 2, 14, 8380403, 8380410, 10, 7, 8380413, 8380413, 3, 2, 5, 6, 9, 2, 8380407, 1, 10, 8380414, 2, 8380413, 0, 5, 8380407, 8380411, 12, 11, 8380408, 8380415, 7, 8380396, 6, 11, 6, 6, 7, 8380411, 8380408, 4, 8380395, 3, 6, 8380402, 8380396, 9, 7, 4, 11, 16, 1, 8380412, 6, 0, 8380409, 1, 0, 6, 5], +[8380412, 8380412, 12, 2, 1, 8380416, 2, 6, 8, 8380416, 8380408, 20, 8380395, 2, 5, 11, 1, 2, 18, 8380416, 8380406, 8380411, 3, 8, 8380408, 0, 8380397, 15, 6, 8380408, 8380408, 8380409, 5, 8380408, 11, 14, 8, 7, 22, 2, 8380413, 1, 5, 8380410, 8380408, 11, 9, 8, 3, 0, 2, 6, 8380400, 8380410, 4, 4, 0, 2, 9, 3, 8380408, 8380399, 8380412, 3, 7, 12, 8380399, 5, 8380411, 8380406, 4, 4, 8380410, 11, 18, 8380401, 8380413, 7, 0, 2, 8, 6, 8380402, 8380414, 17, 8380412, 10, 2, 8380405, 12, 5, 0, 3, 8380412, 8380406, 3, 18, 2, 8380415, 7, 8, 3, 1, 8380416, 11, 5, 8380416, 8380409, 8380411, 8380404, 3, 8380416, 8380415, 15, 19, 8380416, 1, 8380414, 8380412, 1, 8, 8380409, 6, 8, 18, 10, 8380400, 8380407, 1, 8380414, 8380415, 17, 8380416, 15, 10, 0, 8380406, 8380410, 8380405, 8380403, 15, 8380414, 8380416, 4, 8380412, 8380413, 14, 0, 8380408, 8380414, 4, 0, 8380404, 8380408, 16, 1, 0, 8, 8, 9, 1, 1, 11, 17, 13, 9, 8380405, 4, 7, 1, 0, 0, 8380405, 8380415, 8380409, 8380405, 8380403, 6, 3, 4, 8380416, 10, 8, 8380408, 2, 8, 8380412, 8380416, 10, 1, 11, 29, 8380415, 1, 4, 8380411, 8380414, 3, 6, 11, 18, 2, 8380413, 1, 8380405, 8380397, 1, 8380405, 8380401, 9, 8380408, 8380410, 8380405, 8380412, 8380402, 8380414, 8, 13, 8380413, 8380413, 13, 4, 0, 3, 4, 1, 8380415, 4, 10, 8380413, 21, 25, 3, 8380409, 8380400, 8380393, 14, 8380409, 8380412, 1, 8, 8380407, 9, 8380409, 8380398, 2, 5, 14, 8380408, 21, 4, 6, 8380412, 8380413, 6, 3]] +cs2: [[21, 3, 4, 8380412, 1, 0, 8380401, 8380409, 5, 3, 16, 8, 2, 8380409, 8380415, 7, 8380412, 8380403, 8380411, 8380414, 5, 16, 8380413, 8380406, 8380413, 8380406, 6, 8380405, 8380412, 8, 9, 15, 7, 9, 8380414, 2, 6, 0, 8380410, 8380410, 3, 9, 11, 3, 8380416, 8, 4, 5, 4, 8380409, 7, 8380414, 8380410, 8380414, 6, 8380412, 8380409, 7, 8380409, 1, 6, 2, 8380413, 8380408, 12, 8380416, 2, 10, 13, 8380416, 8, 9, 8380411, 8380415, 8380409, 4, 8380416, 8380412, 8, 0, 0, 10, 5, 21, 8380416, 0, 17, 7, 8380409, 8380410, 8380414, 8380404, 8380412, 2, 8380413, 4, 19, 6, 8380416, 12, 2, 8380400, 3, 8380416, 3, 3, 2, 9, 4, 8380410, 0, 8380416, 8380406, 8380415, 0, 5, 14, 18, 13, 8380410, 3, 8380408, 8380405, 13, 0, 8380413, 9, 8380416, 19, 8380416, 8380410, 8380411, 7, 4, 8380411, 8380415, 4, 4, 21, 9, 5, 2, 8380403, 8380405, 8380405, 1, 6, 8380415, 8380415, 10, 8380414, 8380408, 8380407, 15, 8380408, 10, 13, 1, 8380416, 8380413, 4, 8380415, 3, 8380403, 13, 12, 6, 8380412, 8380415, 8380410, 8380403, 0, 5, 4, 8380410, 8380407, 8380413, 21, 7, 4, 6, 8380416, 8, 8380407, 8380409, 8380405, 1, 8380411, 8380414, 4, 0, 8, 4, 8, 8380407, 8380415, 9, 1, 3, 8, 1, 3, 2, 8, 8380409, 8380416, 8380415, 8380413, 8380412, 8380413, 2, 5, 5, 9, 8380411, 8380414, 8380407, 6, 8380405, 2, 8380413, 8380415, 11, 6, 2, 4, 12, 8380411, 4, 8380401, 8380407, 8380414, 8380407, 4, 4, 8380407, 8380413, 8380412, 8380415, 12, 10, 26, 8380411, 10, 2, 0, 8380413, 8380410, 4, 8380413, 8380412, 3, 0, 8380405, 8380412, 6], +[8380412, 3, 8380414, 8380409, 23, 8380416, 2, 5, 8380400, 8380408, 8380414, 8380409, 8380412, 3, 9, 8380413, 3, 8380414, 8380408, 8380413, 18, 8380402, 3, 2, 0, 8380406, 3, 8380409, 8380411, 8380410, 7, 8380416, 8380414, 8380412, 14, 10, 8380416, 2, 8380412, 4, 8380406, 8380416, 8380412, 8380409, 13, 8380415, 16, 4, 8380415, 8380410, 8380401, 8380415, 8380412, 1, 8380406, 9, 10, 17, 8380415, 0, 9, 10, 8380416, 8, 1, 8380412, 15, 8380403, 2, 8380414, 8380412, 8380413, 9, 6, 2, 2, 4, 8380416, 6, 7, 4, 8380416, 5, 17, 8380404, 10, 3, 8380406, 0, 17, 3, 8380413, 1, 8380416, 8380410, 10, 1, 18, 8380410, 8380409, 6, 3, 1, 8380411, 15, 8380414, 10, 10, 8380416, 8380407, 8380416, 0, 0, 14, 3, 16, 17, 7, 1, 8380410, 8380416, 8380413, 9, 9, 6, 8380410, 5, 6, 8, 18, 2, 8380406, 8380410, 0, 8380407, 2, 1, 8380412, 5, 8, 5, 8380407, 11, 3, 10, 4, 12, 8380413, 5, 14, 3, 7, 4, 8380406, 8380405, 8380413, 8380414, 9, 8380413, 3, 8380414, 8380413, 8380399, 3, 1, 8380405, 10, 8380410, 12, 8380416, 2, 8380403, 1, 1, 8380401, 8380415, 8380404, 8380414, 8380408, 12, 8380413, 5, 7, 7, 8380410, 8380414, 8380407, 8380397, 12, 5, 17, 8380407, 17, 8380404, 8380401, 5, 10, 8380412, 8380413, 11, 8380416, 8, 1, 8380409, 8380404, 8380411, 8380403, 8380413, 8380414, 8380405, 6, 1, 11, 8380405, 8380416, 16, 8380406, 8380398, 1, 10, 8380412, 4, 7, 19, 2, 8380401, 8380410, 3, 8380411, 8380404, 3, 8380409, 5, 8380415, 4, 16, 8380415, 8380409, 8380414, 8380415, 8380413, 2, 8380416, 8380414, 8380413, 1, 8380397, 1, 1, 8380406, 8380414, 11, 3, 8380408, 4, 10], +[8380415, 8380415, 11, 8380410, 8380407, 8380412, 15, 2, 3, 8380389, 8380414, 8380412, 12, 16, 0, 8380408, 8380416, 15, 8380411, 0, 13, 8380414, 8380405, 1, 8380416, 8380414, 9, 5, 8380411, 8380409, 8380405, 1, 0, 8380409, 11, 5, 8, 8380408, 3, 22, 7, 3, 8380416, 8380412, 7, 5, 8380412, 8380399, 8380412, 8380404, 12, 14, 10, 8380406, 8380398, 4, 9, 8380413, 8380409, 3, 8380414, 0, 1, 6, 8380414, 8380414, 8380413, 6, 3, 8380407, 0, 14, 10, 8380416, 8380416, 8380403, 8380409, 8380409, 5, 8380408, 8380416, 14, 8380412, 16, 10, 8380403, 8380399, 8380410, 16, 0, 2, 8380410, 7, 10, 8380413, 5, 8380407, 8380411, 8380415, 8380410, 8380415, 8380411, 0, 8380409, 8, 3, 8380416, 8380416, 8380416, 8380410, 0, 12, 8380407, 8380412, 8380404, 8380401, 8380405, 8380413, 8380410, 8380408, 8380416, 1, 8380415, 10, 8380414, 8380415, 9, 8, 7, 8380403, 8380411, 8380410, 8380398, 8380408, 8380408, 8380413, 8380411, 15, 8380407, 8380411, 8380412, 8380414, 8380409, 8, 8380408, 8380405, 8380406, 4, 8380410, 1, 15, 8380408, 8380404, 8380411, 8380410, 8380410, 8380407, 8380414, 12, 4, 8380403, 8380413, 8380403, 0, 8380404, 8380414, 7, 8380408, 6, 8380415, 4, 8380406, 8380412, 8380394, 1, 8380400, 8380409, 8, 9, 9, 4, 3, 8380407, 6, 8380407, 8380413, 8380406, 8380407, 8380411, 1, 0, 8380406, 17, 1, 8380415, 8380407, 5, 6, 1, 5, 8380400, 8380413, 8380412, 3, 8380414, 8380411, 5, 8380412, 2, 1, 8380409, 6, 8380415, 8380414, 6, 8380408, 8, 8380409, 11, 1, 8380416, 8380411, 8380412, 8380415, 8380415, 11, 8380406, 1, 12, 8380410, 8380407, 1, 8380413, 0, 3, 19, 6, 7, 4, 0, 8380409, 8380400, 8380404, 3, 4, 11, 1, 17, 8380413, 3, 5, 8380414, 8380411, 0, 2, 8380413], +[8380411, 8380415, 3, 8380410, 0, 7, 8380404, 5, 8380415, 4, 8380405, 8380412, 7, 6, 0, 0, 13, 14, 13, 8380409, 8380408, 8380411, 6, 8380411, 8380416, 14, 0, 8380411, 8380414, 10, 8380412, 8380408, 8380410, 9, 8380412, 8380404, 8380408, 8380416, 8380415, 8380412, 2, 8380414, 13, 8380415, 1, 8380415, 13, 6, 8, 8380413, 8380416, 8380409, 8380411, 16, 2, 8380406, 8380416, 6, 8380402, 3, 8380407, 8380409, 2, 8380404, 8, 8380405, 8380416, 2, 7, 8380406, 8380411, 8380407, 2, 5, 12, 1, 8380406, 11, 8380404, 8380415, 8380416, 8380401, 8380407, 8380414, 4, 5, 3, 8380413, 13, 8380411, 8380413, 8380406, 9, 6, 9, 8380411, 4, 8380410, 1, 7, 13, 2, 0, 8380413, 8380410, 8380415, 6, 2, 1, 8380405, 1, 8380403, 4, 8380411, 7, 3, 0, 8380401, 8380400, 8380398, 8380416, 7, 6, 3, 14, 9, 20, 6, 8380409, 4, 8380413, 13, 8380411, 8380408, 8380409, 3, 3, 8380403, 2, 8380411, 4, 8380413, 2, 8380414, 8380408, 8380406, 8380415, 8380415, 8380403, 8380412, 1, 8380415, 6, 4, 5, 8380416, 14, 3, 5, 8, 8380415, 1, 11, 8380414, 8380411, 8380394, 0, 8380405, 8380416, 8380414, 24, 10, 8380408, 5, 8380403, 14, 8380410, 19, 8380414, 7, 8380416, 8380410, 7, 19, 8380416, 3, 8380404, 8380398, 8380411, 8, 3, 2, 6, 8380411, 8380412, 8380404, 8380416, 8380415, 8380413, 6, 8380412, 5, 8380409, 1, 8380410, 2, 2, 2, 18, 6, 20, 8380415, 1, 2, 8380412, 8380409, 8380411, 8380413, 8380409, 8380415, 8380411, 11, 8380405, 5, 8380401, 0, 8380416, 8380405, 9, 10, 8380397, 1, 0, 4, 10, 12, 8380410, 8380399, 9, 10, 8, 1, 11, 10, 8380413, 3, 8380413, 8380396, 10, 21, 8380406, 8380414, 8380415, 8380412, 0, 21]] +z: [[8295564, 117772, 52679, 75663, 8330345, 98813, 99831, 96962, 1599, 8364123, 61120, 130657, 8319971, 8254003, 60091, 8367952, 8306626, 41677, 8289276, 8314594, 48047, 17565, 124605, 8268500, 26712, 8314823, 8269534, 8326760, 106652, 51241, 67794, 8352489, 8304588, 3629, 8343286, 99467, 8328191, 111917, 8330997, 119049, 80555, 44931, 8330947, 8292421, 8254006, 114182, 8261443, 8291263, 61793, 32692, 81772, 26492, 8357079, 122382, 118603, 8275326, 8360237, 8348702, 8294002, 8297667, 8310470, 8377826, 14162, 101932, 8315472, 8401, 8315142, 8355601, 8287424, 114251, 69102, 8286110, 8365307, 8283245, 8325583, 8262573, 124155, 67294, 8350140, 37728, 8301072, 115618, 8315652, 8250249, 35084, 8326320, 29891, 22326, 8256788, 11747, 8288350, 8375706, 8281578, 8286051, 8349598, 8321492, 74587, 8353419, 79213, 72848, 8360504, 8367219, 8270924, 55553, 8277386, 109593, 90332, 8251742, 3596, 8301820, 8278020, 8276550, 8367696, 8321145, 8374653, 57627, 8314753, 8251418, 32646, 8333173, 117847, 8321357, 81070, 3514, 8333963, 8265002, 8328040, 8362140, 65101, 51594, 122788, 92420, 8270538, 8275226, 66678, 13892, 8291945, 8311171, 32451, 52930, 8307790, 8391, 77309, 60834, 8264508, 8372210, 70785, 8330592, 8266979, 53696, 8250851, 52199, 8362415, 8370372, 53272, 90252, 26988, 31444, 8277308, 8325922, 128263, 112846, 8318724, 30124, 8278852, 8272118, 75207, 8259488, 73483, 8322296, 120931, 8327241, 8335758, 8345481, 8287091, 8300407, 8341698, 8296168, 35220, 62532, 8259968, 9360, 8303882, 90215, 14234, 26961, 9400, 8306798, 8357860, 79223, 8349405, 95218, 110597, 8316434, 8356763, 72065, 36832, 8354862, 8354982, 8256353, 2176, 119858, 39685, 102463, 8257971, 110518, 26681, 112148, 8362192, 8319626, 67280, 8327800, 103661, 120963, 21163, 7257, 8260334, 122734, 8261991, 42507, 8360890, 80765, 8258262, 8284346, 8269694, 54293, 4333, 119418, 26306, 8278370, 8334858, 63720, 8376351, 16442, 8361769, 58751, 8272872, 80234, 82969, 8340585, 8297370, 11937, 44513, 8341522, 114498, 88168, 8379060, 8262634, 8348210, 87424, 11765, 8273575, 20780, 49904, 8293885, 9389], +[8310088, 8291664, 8372495, 130883, 8362516, 8373288, 7540, 123618, 56063, 8380002, 8292311, 8378215, 56595, 69074, 8271242, 8268959, 8347210, 8318095, 34167, 8256743, 8376131, 8378900, 8320598, 8252827, 114733, 8380223, 42179, 8373615, 59221, 8347176, 122980, 8283928, 8289454, 118337, 8370172, 44512, 9369, 118472, 1425, 8371760, 100254, 88482, 8299021, 8379348, 52705, 8259134, 8298293, 106478, 67020, 8343506, 8336696, 8291962, 8281347, 8296748, 110414, 52995, 8366980, 8314339, 8273685, 113545, 27912, 128016, 8328903, 100419, 122793, 8279472, 8282529, 107053, 8303924, 14384, 8371468, 27233, 52814, 34484, 89496, 21892, 47282, 64286, 8334322, 8350140, 82174, 29773, 107074, 127535, 117612, 129745, 8302491, 8350585, 8346409, 8309964, 8306548, 8359471, 8253615, 8353571, 58220, 8287507, 8303992, 90871, 65190, 8319086, 8369197, 105036, 8301088, 8369306, 33140, 48912, 20537, 97684, 66849, 8373482, 51762, 8338563, 66052, 54047, 50727, 8374720, 62294, 37957, 111049, 8317978, 22496, 81195, 58777, 8344507, 8305568, 8277109, 116291, 75352, 83333, 8265409, 86272, 95596, 8277511, 8360685, 97182, 8256296, 8270803, 8293252, 8422, 8260681, 11657, 102117, 8365917, 121005, 128099, 8349488, 8321598, 116267, 52824, 8380402, 8341273, 8324915, 62505, 8346238, 8292467, 38302, 8312685, 123505, 27019, 83831, 8316200, 8370234, 9888, 20567, 8304050, 8350463, 12956, 8367528, 52954, 31021, 8342108, 107024, 8265716, 8299301, 6239, 88952, 117229, 68491, 109910, 73781, 90314, 8300704, 8344304, 8274932, 8283189, 24612, 8299368, 52416, 35620, 16965, 8333408, 113220, 28434, 107651, 8281751, 8295026, 8347911, 101712, 8379667, 126291, 66179, 85962, 8256773, 8262112, 104932, 60764, 8302549, 8325873, 22698, 8280857, 8287286, 8317596, 1760, 37773, 97135, 98429, 127423, 8331637, 8334619, 74759, 8369889, 8379806, 128903, 8315017, 65416, 81321, 8302456, 63708, 8259892, 9210, 8279431, 8364353, 28319, 8378902, 8315410, 26521, 8293369, 73175, 8372294, 98453, 35636, 117763, 8274616, 115569, 101314, 59783, 11015, 8314292, 8288004, 8257212, 8356596, 8375869, 8330554, 8293788, 8261807, 8340521], +[74243, 86139, 8266966, 129044, 8280858, 8340007, 97445, 81308, 8337354, 124511, 129172, 8339227, 8342182, 8284812, 8372813, 2385, 8263945, 8371207, 11186, 8327864, 8314064, 8326777, 111442, 77684, 8346211, 13619, 19636, 8298287, 80149, 8266130, 88522, 8331329, 114230, 8304823, 8290876, 92847, 8336447, 88857, 102995, 8253193, 3782, 8317124, 8371723, 107816, 8313470, 123058, 8250008, 93715, 20814, 96110, 20874, 109242, 8287360, 8327853, 3359, 8349187, 36941, 97669, 8251219, 8310783, 37974, 8254240, 8371505, 8306863, 24760, 56471, 20534, 8289038, 8353430, 105261, 8304597, 56731, 8312985, 8368050, 74386, 8308529, 95705, 8323073, 8255857, 8374147, 126557, 8249590, 39981, 94650, 78181, 8278510, 8268175, 8278039, 33106, 72468, 8308565, 8370193, 26004, 8370756, 8364112, 8323640, 98693, 107547, 12384, 3091, 49151, 8348631, 77804, 113978, 62728, 8305186, 8311669, 56414, 8319706, 34020, 48256, 8262210, 40923, 89138, 114361, 8295855, 43831, 8278853, 8278815, 8313527, 27883, 8364583, 116602, 8274688, 8291855, 14598, 8364447, 98762, 8349421, 8263734, 85565, 8303887, 112639, 8326151, 107781, 8374051, 8279457, 48944, 93967, 8297367, 8379023, 8330866, 113318, 8317372, 75657, 81859, 126471, 26894, 49261, 33533, 15935, 8329035, 9722, 8270653, 8346825, 20939, 30001, 8330125, 89955, 8354546, 6137, 8356061, 8298582, 8358098, 68118, 8309823, 8354205, 61514, 8292998, 17027, 68203, 130176, 8364168, 8345912, 8325771, 39911, 100516, 34341, 8376448, 8255291, 102809, 61776, 48241, 90155, 8355743, 8349866, 8274728, 56367, 81082, 126270, 8337520, 8373223, 8309056, 8335417, 8270778, 97371, 71179, 23223, 118211, 123950, 8362443, 8377268, 8270595, 8295115, 8350571, 8360374, 130197, 79848, 40706, 8330542, 31499, 27957, 8373825, 8300138, 8291636, 19383, 69893, 8345233, 493, 31595, 65838, 125773, 8361525, 8347606, 96046, 8301537, 8375462, 8311693, 100019, 8275524, 8377301, 8282920, 16966, 98028, 46260, 99634, 116105, 8265237, 8370938, 95305, 8301141, 43945, 8268539, 8255200, 120105, 8264140, 8376910, 8270656, 1420, 8348718, 96170, 8262836, 30021, 8265743, 78887, 45004], +[44776, 8251198, 115687, 8302133, 22801, 8267698, 8288017, 91294, 8329513, 83721, 97264, 22953, 57585, 104617, 102430, 8301287, 8280432, 8255339, 96149, 8340306, 8316701, 8346399, 117878, 8311805, 8336778, 8273624, 8363115, 8371999, 8371979, 8255825, 8351565, 8373458, 101722, 8347088, 122979, 8303108, 8362080, 75456, 8283311, 103259, 8303979, 107503, 68842, 8359801, 8290950, 8286939, 77577, 8262667, 37745, 60038, 8279984, 8323861, 8274722, 8375917, 51139, 84639, 113839, 8331161, 8269888, 123795, 47325, 129087, 8363063, 86517, 8375268, 29780, 8316924, 8373739, 8330353, 35275, 97138, 129310, 91944, 8298514, 65037, 40730, 104666, 85542, 8280768, 8323410, 92453, 8276803, 8327299, 8276946, 8366595, 33822, 101210, 8354094, 8299944, 121578, 61119, 113108, 8359459, 8276652, 106239, 8334014, 8252535, 8331895, 8300612, 8296592, 8359802, 37855, 122503, 8366326, 8336658, 104443, 51370, 49347, 15855, 26633, 91947, 8291243, 8350032, 8861, 8357148, 8316977, 129493, 8249740, 8356721, 126962, 93495, 8283352, 8285286, 8378757, 8282273, 90263, 8377744, 8295407, 8343605, 19905, 8296521, 8308531, 8267940, 8287234, 22613, 3853, 103124, 130446, 94124, 8278698, 81423, 8342290, 88266, 8332597, 20164, 8270578, 83924, 3169, 8347222, 4439, 25367, 8303654, 71747, 84729, 72610, 65019, 8251117, 120730, 8344677, 8378398, 8333242, 35983, 127276, 8280471, 8355539, 8322782, 32570, 8333410, 8363746, 30415, 33484, 70493, 21321, 8297644, 115803, 73573, 129232, 81652, 7758, 13425, 8319135, 89957, 8370303, 8351692, 8286537, 114941, 8276720, 91846, 8375501, 128060, 8359194, 9069, 8249647, 18926, 8254817, 102764, 8374144, 121588, 41037, 24948, 8348024, 8274886, 8271064, 37979, 8350903, 97555, 8379317, 8344268, 24735, 8254347, 32299, 71022, 8297427, 8336567, 4232, 8269955, 8330622, 8272461, 8317412, 49870, 8318227, 70217, 67574, 8328080, 24284, 34550, 60417, 72512, 98483, 38793, 58633, 129751, 89366, 8299189, 124000, 8286972, 8277128, 43629, 8302900, 3209, 41940, 8317117, 8338500, 8267589, 12128, 103593, 89120, 92242, 86139, 7996, 111893, 8334549, 14167, 51506, 8364004, 8332305]] +||z||: 130883, ||z|| check passed +r0: [[-46665, -75700, -82773, -7712, -20258, -24164, 28689, 88379, -57719, 77284, 84637, -54601, 76947, 71091, -73458, -82292, 89320, 85930, 15095, 60369, -75209, 76225, -4400, 73237, 832, 82800, 41101, -12371, 16292, 83090, -10894, -13307, 4257, -43994, -4251, 85027, -42546, 16331, 7258, -35691, -61875, -89993, -62717, 25767, -41781, -66450, -95148, 80618, 41843, -19287, 9719, -91138, -1633, 95123, 83909, -69821, -94441, -94270, -9331, 27369, -61155, -42788, -77562, 95121, 69808, 49540, -94082, -3256, -43968, -44203, 39363, -11929, -17890, 47260, -31299, -38998, -28230, 21813, -72174, -65406, 51615, -21335, 14617, -94694, -16559, 67554, -401, 67446, 67339, 87220, -62276, -89220, 81465, 17192, 53242, -69708, -16669, 64015, 53878, -87693, -70056, 82484, -47859, -79153, 25308, 46917, -45992, 60157, 14565, -94827, 25161, 21855, 56890, 57617, 89466, 21603, 86799, -21365, 33218, 4789, -44243, -40101, 46828, -23352, 16748, 6129, -21784, -59232, 61182, -8727, 40429, -90415, -95136, 92772, 17371, 46191, 29005, -10923, -72114, -65021, 18601, -72124, 195, 6365, 30949, 21445, 48343, 91125, 20383, -76007, 15595, -26403, -52582, 41760, 66547, 2060, 87866, -76006, -7530, 40069, 49532, 41382, -33875, 39041, -62576, 19886, -26273, 33782, 74058, 59434, 42318, -49638, 14491, 83563, -47558, 6757, -71973, 5973, 33772, -18214, 9880, 83603, 40648, 75036, -86341, -22448, -84359, 69954, 73755, 11101, -18279, -65653, -95058, 2455, -91886, -24914, 59944, -25223, 69024, -79537, -26001, -49280, 60364, -73365, 39782, -47631, -93801, -83581, 42365, 88772, 43022, 74935, 75127, -23889, -16301, -28054, -27613, 91686, -25278, 92513, 68704, -43845, -36199, 7307, -12360, -41067, 92751, 45128, -89812, -25707, 41415, -27339, 67109, 28246, 91235, 77905, -90280, 25357, 47046, 18313, -65282, 87429, 78105, 64066, -57500, -46996, 48569, 3775, 26651, -61274, 5222, 70950, 59994, -27514, 94991, -87853], +[-29828, 11563, -71281, 39716, 2972, -58070, 82575, 32793, -78151, -25779, -23585, -9662, -17430, 66929, 2090, 17823, 61059, -8527, -66335, 76428, -27194, -44325, -36626, -13835, 71610, -59854, -3961, -45570, -34582, 37828, -9449, 36749, -92211, 55043, -17469, 76666, -60069, -10180, -55176, 76648, 79165, 22048, -12025, 30313, 88643, 86118, -87785, -7666, 23160, 8799, -34435, -25634, 78102, 80354, -16564, -85715, -25911, 42499, 80872, 46179, 1276, 12925, 56345, -31668, -23643, 62535, 15211, -83455, 24675, -45182, 85295, -30725, -26520, 24999, -2812, 19942, 6529, 17097, -31060, -70257, 29307, -82173, -24059, 81478, -57267, -84594, -39135, -9630, -43521, -4371, -62698, -74373, -73204, 46900, 91722, 30565, 23930, 69401, 56321, 50409, 30673, 77778, -47222, -72509, -28190, 49170, -66777, 34179, -58106, 58175, -59414, 42007, 45859, -36629, 74773, 38069, 6348, -58451, 65462, 78606, -50034, 1128, 59062, -75910, -87089, 68384, -19753, 85351, -64685, -35547, -58885, -64341, 5085, -86894, -44200, -87208, -39582, -52044, 34762, 39745, 3803, -4400, -88093, 2987, -82341, -77847, 43070, 64193, 44964, 67108, -76381, 62931, 54025, -32776, -92277, -2966, 69522, 55241, 28626, -21214, 48275, -51668, 3940, -64539, 25476, -56266, 45255, -29463, 10136, -72706, -42296, 81671, -29627, -67216, 26278, -23811, 79196, 69731, -86807, -49695, 90240, 55107, 52880, -65253, 94037, 42911, -9161, -77839, 62861, 75834, 70933, -3485, 29270, -71620, 25693, 69483, -11080, 91942, 63514, -45241, 91769, 20903, -59771, -1177, 66191, 72974, -92077, -51930, 92594, -55849, 64581, 59819, -62495, -602, 63315, -69215, 42226, 38157, 33047, 35963, -3486, 10300, -63085, 32916, 65469, 76922, -56184, -51082, -65704, 85262, 40141, 70198, -36953, -27269, -13426, 77490, -39961, 48531, 80210, -53375, -47787, 56534, -86693, -81111, -23066, 34593, 14029, -77747, 29806, 30059, -89397, 55674, 5380, -57429, 35534, -88280], +[32996, 23165, -54560, 67441, 54193, -26041, -42086, 61599, 83766, -66906, -23456, 21784, 48541, 72415, 60708, 82555, 39287, -51728, 65756, -34719, 26485, 48146, -4373, -62755, 29851, 71074, 22249, -40437, -16396, 33895, -10291, -46540, 32904, 45750, -90501, 81645, 34178, 6227, 37168, 23024, 3399, -13203, -32466, 94661, 68825, 7095, 8091, 6187, 77938, 53367, -21343, -80791, -38628, -92088, -91358, 26070, 33978, 64190, 90640, -7597, 7286, -6585, 65383, 66760, -15252, -19208, 59739, -50077, -26821, 93447, -75043, 92885, -33473, -89407, -95181, -85108, 52055, 68529, -31200, 76072, -46602, -75595, 53511, -65962, 26735, 20183, 44252, -65105, -61743, -73151, 53944, -83047, 61146, -12305, -43275, 36484, 64184, 11605, 46602, -67870, 41631, 82938, -16849, -63858, 75552, -62398, 53127, 77439, 41832, 20416, -60642, 63916, -35214, -41282, -25108, 26909, 78228, -86057, 85316, -23676, -63672, -92636, -45765, -37249, -69104, 35268, 14495, 13200, -9901, -68201, 42363, 63876, -93458, 17321, 80702, -71151, 89201, 31417, 51814, 75757, 36627, -62344, 42170, -47275, -90913, -85541, 34256, 91967, -22520, 82949, 19466, 48959, -47699, -18585, 20455, -46228, 17438, 50923, 63628, -70001, -41290, -38680, 31293, 24150, -6960, -11244, -49408, 79757, -25183, 64675, -77879, -57629, 94288, -80001, 74216, -73543, 51976, 34750, -20212, 80399, 18390, -18967, -76281, 57974, -30497, -92679, 26445, -10695, -16651, 38595, 15386, -69624, -70155, -37314, 22895, -6264, -7922, -50251, 62552, -45106, -65995, 55377, -69255, -92397, 51529, -66076, 28230, 70894, -2481, -93875, 49788, 4363, 55799, -62865, -44474, 25342, -40971, -67694, 69402, -13555, 41055, 64314, -89838, 22799, -93569, -42422, -53510, 44854, 14745, -68992, 39299, -55702, 80834, 9010, 50511, 12520, -11554, -56787, 22408, -42968, -46190, -63476, -49305, 68661, 18373, 78184, -5371, 61830, 52584, -51500, -31076, -950, -70923, -78732, 78935, 21240], +[83038, -62666, 87473, 9900, 44285, 49008, -30415, -25471, -68350, -70417, -13054, -11884, 78531, 28529, -3086, -46220, 55590, -76104, -10254, -50898, 8656, -71808, 32073, -62799, 46591, -43350, 21703, 76283, 62363, 66026, -896, -83278, 39658, -70042, 78174, -19231, -41794, 23924, -83694, 44658, -6996, 15090, 61147, 42941, 94788, -18708, 86229, -93699, -33041, 80107, -67949, -59682, 60031, -3157, 89354, -74903, 91897, 25389, -14684, 45617, -26098, 21648, 93737, 62428, 35424, -86020, 58677, 91835, -71260, 91103, 60667, -86543, 71737, 5985, 50323, -51577, 82673, -38418, -93092, -77798, 16551, -5626, -28369, -89484, 50329, 71237, -90898, 84411, -53052, -9821, 59121, -41698, 91547, 35797, 265, 42045, -86552, -59994, 40656, 93444, -33935, -55498, -29574, -23883, 60366, 91262, 52826, 57454, -15536, 13482, -33775, -81209, -39884, -89532, 54146, 75355, 12648, -84133, -26144, 66559, 48813, 45109, 37995, 57505, -78697, 66096, -23195, -43400, 32268, 83359, -29908, 28877, 88063, 57576, -79694, 84537, -88191, -83281, -45881, 60547, 46007, 46994, -63802, -33802, 16538, -8533, 1343, 2151, -47917, 48984, -448, 54101, -89667, -73328, -34169, 69591, 77365, 70075, -38334, 35914, -36953, 77622, -87459, -82348, 87968, 77052, 21072, -70966, 77116, 9513, -53183, 78025, 66981, -9209, -19031, 92321, 19915, -38339, -71445, -36254, 58756, -71670, 90526, 15601, 89113, -52685, -45151, -54054, -19717, -56345, -86066, -54542, -43917, 18030, 58659, 61796, 17019, 41336, -25847, 4464, -34569, -67288, 23047, -40310, 64290, -29040, 63175, -77739, 41333, -70844, -4616, 71522, 32756, 11784, -33693, 35575, 67201, -81697, -26331, 84204, 15537, -32912, -36065, 74250, -21333, 4818, -30627, 57738, -52657, 49707, -62265, 5705, 66165, 27416, 59179, -73580, -3973, 46659, 84478, -13176, -4202, -88465, -77621, -72031, -41460, 10210, -74380, -87437, -54519, -87713, 66535, 51011, 29680, 1175, -90765, -61374]] +||r0||95181, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[97107, 89549, -44861, -2395, 27444, 25623, -46215, 44495, -48082, -17558, 102546, -65057, 114460, -88007, 124788, 5386, 101439, -45335, 45473, 83719, 34885, 97084, 92895, -6977, -83444, -27051, 69976, 100708, -126080, -29987, 42382, -112320, 10325, 38857, 53702, -28193, 84983, -104857, 36895, 4844, 115880, 70792, -29600, -114291, 32852, -61118, -6031, 102061, -115438, 58575, 41246, -118729, -16346, 81089, 29788, 45769, 88287, -22015, 84592, -55924, 128289, 108854, -96486, 125816, 123128, -68143, -125312, 31596, 99628, 79227, -28843, 100277, 29574, -64933, -125958, -66164, -120774, 11210, 11844, 110031, 89657, 27452, -3097, -121658, -17549, 32875, 78162, 95814, -89300, -20260, 109963, -32089, 842, -11136, -69104, -109450, -78406, 7743, -56713, -75237, -87378, 64860, 5593, 28887, 47243, 6982, -84220, 39768, -46819, -19382, 26210, -117638, -129163, -126877, -41107, -51984, -17660, 79102, -78408, 55659, -35081, -53491, -79141, -1593, -90809, 101022, -24848, -35983, 39781, 63188, -68780, 65463, 72164, -47463, -35019, -70321, -69698, 80592, 20924, 130245, 128796, 64900, -39116, 15745, -100659, 63436, -23484, 458, -68364, 117367, 82380, -35023, -54232, -111027, 15740, -25184, 95434, -117371, -70441, -31595, -1315, 69113, 91192, 121598, -12911, -111722, 69455, 111101, 39935, -60150, -12091, -54159, 120387, 129265, 61005, 56751, 106809, -101296, 41560, -57017, 20873, -89370, -109480, 127973, -8046, 92377, -111291, 7870, 107909, 7449, -29439, 90109, 38725, 42661, 122141, 101707, -57150, -51, -74377, 72447, 18482, 107256, -61938, 828, -3830, -45986, 112856, -54698, -99839, -97249, -61983, 53383, -98105, -106781, 117403, 97661, 71389, -90012, -7077, 49552, -15521, 97000, 97141, -82741, -43529, 121364, 47575, 118444, -2200, 371, -71622, 114894, -53865, 119895, -59353, -29918, -81338, 35753, 12726, -33878, -27319, 50092, 43013, -44676, 115922, 98493, 103687, 27075, -8476, 60560, -6377, -123397, -66489, 51456, 21663, -63383], +[107075, 125330, 96677, 105024, 77134, 54029, 37194, -68692, 125586, -121396, 67591, 13815, 38050, 95115, 1028, -31030, -23633, 73287, -127676, 71586, -111408, 89761, -85513, -104182, -32028, -80017, 90342, 35844, -23074, -23484, -123668, -42834, -65831, 115370, 7734, -74607, 37979, -120961, 49770, 100857, -78557, -63080, -39593, -130657, 11777, -14906, -122822, 67496, -44929, 44794, -62842, -123152, 64385, -76911, -31236, -2257, -8384, 49244, -101800, -93360, -47387, -128169, -50191, -34136, 98139, 69796, -14635, -25692, -87153, 128604, -100914, 12396, -51596, -19715, 97888, -33947, -7106, -106483, -91056, -86065, 55335, -34397, -18260, -82082, -122600, -90378, -7133, -105867, 108123, -17202, -131021, 14310, -63805, -54715, 112322, -89281, -124758, -108067, 78134, -111112, 12342, -84546, -123959, 61225, 70787, -113357, 6798, -115278, 79016, -56348, -106309, -98813, 21635, 34055, 98693, -122331, 65210, 18545, -80768, -43434, 55459, -68678, 71175, 124564, -85375, 90100, -14468, 64953, -17202, -125157, 96515, -58919, -117888, 28044, -110655, 41237, -124424, -16624, 67587, 65510, 122333, 809, -56531, -124098, -127133, 28725, -42903, -44459, 52723, -118693, -781, 60416, -128553, 41075, -59895, 88473, 116472, 114864, 27518, -55550, -21597, -24248, 17494, 61528, -11612, 83616, -106559, 100130, 21472, 30190, 43214, -76894, 130770, 34135, 82100, 27403, 81855, -112413, -53843, 41625, -91082, -77382, -126774, 68075, 49061, 24513, -7113, 111266, 124701, -55196, -87643, -91399, 13978, 59736, 88856, -48668, 59396, -122296, 1300, 13632, 757, -60838, 18961, 104877, -91328, 4825, -87398, -102011, 33801, -46540, 109406, -60032, -70429, -9665, -11383, 34478, 13848, -124541, 53430, 114050, -71712, 59543, 64048, -106254, -104953, -129262, 5889, 86257, 61088, 81359, -16260, 78544, 94416, -53724, 44243, 17100, -29738, 129894, -115489, -26739, -25325, -75106, -42724, 45539, 87054, 78627, 31304, -31665, -124610, 79652, -58845, -47367, 61265, 97754, -16253, -115742], +[118604, 36709, 37210, 33694, 34107, 104257, -64278, 18644, -114645, -112013, -71412, 5455, -67113, -118112, -26569, 51773, 9003, 75556, 100522, -128920, -110525, -128954, -60995, 57664, -10418, -53894, -122556, 64093, 20544, 13629, -63153, 95271, -121277, 48096, -74803, -18796, 67544, -6070, 41768, -89975, 21295, -118613, 13311, 68659, -120228, 3901, 36402, 16893, 83694, -122727, 36280, -95566, 47831, -74779, 23392, 42479, 9110, 47538, -11168, 1062, 47538, 25238, 96194, 128226, -116901, -126602, 127405, -50726, -74532, -72764, 72690, 48111, -34163, 84267, 33402, 16096, -45827, -9309, -52995, -24450, 8332, 84270, 87827, 76424, -57941, 40489, -100930, -85898, 106466, -5843, -119638, 109107, 7457, -77359, -17221, 66963, -9547, -63131, -103598, 83037, -17095, 9706, -1579, -57013, 65978, 94725, 119910, 92552, 5382, -93400, -92363, -116497, -4040, -40815, -76805, -22796, 57406, -127274, 30651, 44139, 9989, 129970, -67622, 87664, -57379, 1530, 38952, 118036, -106340, 22982, -72680, 87875, -37737, -34782, -117562, 67015, -91654, 56292, 66817, 114513, 61794, -116000, 94768, 65482, -105059, 17458, -81295, 109598, 36354, 44425, -930, 28250, -55151, 35979, 63706, -93620, 70365, 39812, -3998, -114163, 2084, 48195, -70495, -32322, -35127, -85269, 126180, -113394, 15764, 51126, 17150, -43654, 44978, 70807, -47977, 35162, 114301, -130848, -126464, -47406, 36760, 92615, 96093, 115048, -119906, 39365, 74017, -38248, 79710, -122381, 80789, 56868, 113486, 13515, 13908, -88674, -18216, 121216, -82712, -23445, -93916, 16895, 53068, -41283, -61768, -9740, 120743, 8774, -16032, 53824, -62338, 71290, -14387, 121301, 117421, -12988, 101971, -108780, -123265, 56253, -76158, 14661, -83597, 117469, 106656, 99565, 24440, 105297, 118664, 41720, 10479, 121469, -26661, 31420, 125493, 6116, 110036, 72513, -127414, -33083, 62400, 32149, 80627, -86126, 16125, 18930, -68326, -130382, -113911, -49354, -130196, -72808, 114210, -51778, -121610, -72526], +[90399, -100349, -126756, -9096, -19780, 59139, 48247, 96008, 50372, -38623, 128829, -92641, 41090, -85128, -25460, 78299, 77773, -57629, -9158, -118108, -63544, -78902, 108077, -121272, -42417, 63975, 71812, 44068, 66851, 94271, 69896, 59679, -3467, -45927, 17681, 77275, -20094, -101716, 20857, -95339, 48743, -27117, 59379, 59307, 71867, 73115, 114906, -17720, 37786, 52211, 79841, 116215, 23445, 81295, -128671, 24624, 3433, -10580, -65742, -13758, 68167, 39565, 121990, -126995, -81050, -81974, -100124, 57317, -105967, 29520, -5623, 80281, -108741, -38072, 69124, 70160, -95388, -12869, -98520, 24266, 86184, -125997, 30348, 95016, -42723, -2977, -39321, 100001, -19007, -56334, -69788, 9557, -19358, -98007, 55823, 51630, 106451, -46934, -98332, 52097, 26883, -112151, 34476, 87491, 82529, -85435, -58178, -18210, -125882, 86856, -2287, -88885, 81452, 64044, 24466, -49161, 32654, -71917, -43040, 34057, -49303, -38440, 22394, 3484, -70685, 61988, -129854, -91688, -32586, 73318, 104584, -122849, 40333, 58113, 14373, 96019, 38329, 32766, 114195, -41745, 60480, 46625, 90633, -109716, -129142, -25964, 124690, 86758, -3284, -91570, -30563, 534, -100938, -107761, 16286, -72851, -117765, -68142, -59575, -2020, -53894, -31394, 60276, -67778, 112570, 58439, 76957, -5894, 23714, -101472, 100202, 43611, 23067, -11262, -46269, 126236, -13013, 66977, 36933, 62292, 53287, -50785, -31994, 116453, 61716, -80305, 87817, 18405, -38236, 57457, 94048, 130611, -3125, -20350, -94328, -17549, -113918, -86797, -121374, 99182, -38146, -112263, -4955, 6642, -205, 70255, 2752, 88904, -61212, -91271, 60163, 81675, 44001, -7321, -44361, 122695, 102378, -7706, -116955, -99756, 35316, 46229, 126799, 3666, -8310, -92609, -19430, 67368, -49928, 58458, 48523, 130607, 13417, 109076, -117757, -23040, -12079, 90768, -41110, 73082, -45107, 125396, -113157, -81385, 9924, 122258, -47949, -93931, 98397, -45246, 7432, -40233, 88742, 41856, 24848, -46528]] +NTT(y): [[5843, 4599570, 7088519, 8026103, 1852481, 3661398, 8191076, 3008569, 3799278, 6020499, 6822463, 6858400, 1755416, 5661033, 2815278, 68944, 4937286, 1777829, 7805811, 7894388, 7714177, 1902851, 5430661, 7449896, 5082834, 7913201, 4723604, 1241589, 3079470, 3459197, 6900625, 6721090, 1108201, 4631021, 999197, 6874828, 2245952, 7169580, 1064999, 3732194, 1077241, 2545523, 5140633, 5917133, 5274937, 5692104, 2778845, 4291400, 829625, 4831573, 5999340, 1671984, 5851905, 2122306, 7904674, 7893278, 2277788, 7435197, 5080427, 6211388, 6840727, 2776248, 6411311, 7911230, 8271984, 2692685, 4021795, 930238, 1791815, 2590039, 5984020, 4709841, 4958325, 434301, 7408443, 6111468, 2139284, 6430632, 814532, 5538383, 3075719, 4966757, 3401118, 8184884, 300982, 5464397, 8241746, 1777046, 2726594, 1324589, 2606494, 3868096, 5704100, 7368068, 1797753, 960796, 5355826, 2032280, 135779, 2161369, 1885254, 7891530, 5747639, 3562686, 1052933, 6485351, 3880193, 5853441, 4535169, 2357561, 2779110, 2819157, 5793787, 3995257, 6026220, 7370399, 6941872, 7690882, 1290118, 4368235, 2603425, 4007945, 1917984, 4788256, 7486973, 2788875, 1151249, 6552088, 285837, 5426312, 3670288, 5971094, 1372115, 4152521, 1095048, 4792974, 956345, 362422, 1284999, 3287661, 6078537, 8603, 3308587, 5851638, 3194481, 6440632, 4046653, 5356672, 2729966, 4855796, 776851, 1540869, 1693825, 6694398, 841697, 3558441, 6175937, 1455442, 1722800, 4921877, 6852026, 1875832, 4964122, 4094442, 7453403, 83739, 4491975, 1949041, 2413598, 806643, 4485709, 2494022, 386422, 4860131, 499905, 7222241, 5451802, 6160140, 454616, 7613123, 4485164, 3535745, 4442802, 3336798, 5726261, 2338032, 2370916, 1853431, 7369518, 3910888, 2597632, 2319859, 3052418, 4702940, 4436586, 3101213, 204867, 5971699, 3351374, 4333788, 4687327, 8337999, 1556870, 1685075, 2691930, 2205826, 4760088, 7153717, 1055251, 3317753, 5119666, 2275560, 1213735, 656284, 1233277, 1890744, 8327533, 8229183, 5870671, 5963318, 7841409, 6718235, 7070250, 866818, 5857100, 1574568, 8250116, 6077839, 4370951, 3095219, 3106747, 3451945, 6939369, 3862660, 6407959, 5467724, 8351, 4401855, 5968675, 5909118, 7886178, 1380318, 7728422, 2096074, 7326236, 1336256, 5507377, 6608347, 513002, 8150753, 6238032, 1279408, 52253, 5877467, 5646004, 3811725], +[86422, 4319701, 1273953, 6086381, 1200864, 3127589, 8301271, 103977, 2398092, 4218276, 4960439, 6051759, 8125359, 6245240, 120950, 1989522, 5180837, 6075914, 1568536, 6537394, 5465224, 1946938, 7407373, 6856847, 4511341, 2347683, 4497551, 7026669, 2958953, 3837673, 2362422, 4388106, 6193414, 5387376, 60763, 1004250, 6279008, 7271719, 2297029, 3379284, 5999006, 1679236, 1217669, 559118, 4507124, 7306976, 5663025, 4389784, 5952382, 4618543, 4073784, 8327714, 2930813, 1655206, 3672967, 4100839, 3108095, 185504, 7110558, 880386, 7612409, 4592444, 8246341, 5593039, 468036, 6986581, 3984379, 7926968, 6813642, 58641, 6550561, 5631784, 3431182, 2087022, 1645552, 7395091, 8187768, 1772521, 3693025, 7013893, 2305392, 7225239, 2476198, 2510041, 7145373, 3764119, 1645729, 7786729, 1134580, 5388190, 5644416, 3427686, 4626073, 8200164, 3789059, 795439, 4578418, 7438039, 1693895, 4525507, 2772093, 373313, 1403278, 120454, 6188907, 622829, 8006075, 6258700, 6031591, 3072049, 7208799, 3301459, 2896685, 5104449, 5748095, 6730171, 7928074, 7837007, 1599742, 3324183, 2344362, 8214254, 8199334, 5908652, 1529412, 1963081, 18058, 4631557, 4475500, 4244160, 6492483, 7380704, 2825664, 2006130, 8311045, 2959949, 93298, 1135216, 4324905, 8370648, 2428054, 5294130, 5784502, 5521531, 6481661, 836976, 1938659, 1097493, 3955951, 3821728, 2284316, 534190, 7948707, 5450189, 128859, 7799322, 5566184, 6683073, 2285493, 5435102, 4898377, 2047131, 215504, 7803618, 3719719, 3044236, 3643478, 1290960, 1834648, 533357, 6342509, 823274, 141405, 4765653, 8285273, 6649099, 1635479, 2585302, 6215650, 3721180, 8266503, 7337608, 6107689, 3674311, 108362, 1489286, 2145206, 6057372, 5683294, 4804847, 125576, 1664682, 6491892, 5193438, 7800796, 5553882, 5841353, 1114311, 2804335, 1328656, 3487054, 1120496, 1365684, 3214305, 4702529, 4110786, 8165326, 3867579, 5348904, 4611278, 5548162, 6717564, 5368009, 917703, 7744663, 449363, 1257091, 3538502, 7385252, 3003646, 6254939, 210720, 1734291, 4710890, 7017828, 3977436, 5693617, 2774720, 4158403, 5176566, 1040964, 872184, 5904717, 4397333, 5699405, 3511925, 4516286, 2141682, 1673790, 1565072, 6352923, 3110230, 7509007, 1244992, 7614631, 6426623, 2998299, 1128619, 7316046, 4548941, 2188535, 8201912, 3316999, 4941469, 5995486, 4527803], +[835873, 7812070, 1969768, 6070802, 7455762, 3510048, 4036666, 4996159, 4281095, 7160490, 4294568, 7029865, 6858825, 5247936, 4041547, 4463356, 3796755, 6940744, 2780739, 1818401, 5777105, 5657353, 4857586, 2815100, 2277617, 699154, 6606997, 3708975, 1120302, 6941215, 3852023, 1107770, 6371374, 2668083, 1378618, 4038351, 3740143, 2588342, 2169911, 5821715, 6119069, 8270621, 4191205, 8039737, 4524800, 5350533, 5811381, 5749121, 4943149, 6213371, 6439337, 6335143, 4195890, 399379, 6741257, 3428459, 4134133, 7118180, 7191844, 917999, 5311250, 4021969, 1218907, 3119095, 6752760, 8002802, 610931, 6867327, 3333635, 7617620, 8274747, 3445717, 944722, 5978530, 6794401, 2183978, 6373404, 6577504, 2525078, 1723725, 228422, 5253924, 6832609, 6773564, 4199398, 79718, 966133, 4075272, 4348280, 2809420, 4470131, 5887640, 4600944, 5420658, 4581719, 645476, 1184335, 1380505, 150605, 312097, 5347125, 1826393, 4627636, 1332994, 7734066, 7947022, 445763, 7970566, 1202924, 4919523, 2265075, 1646263, 4035572, 2259568, 7363413, 2526092, 4861363, 637800, 192671, 2623694, 289250, 6088838, 674918, 2472954, 3586977, 677379, 3532799, 1569883, 542972, 163962, 7535572, 4351934, 7013511, 2994362, 7351423, 2786619, 4500734, 3737034, 1903708, 4720034, 871063, 7175636, 4846921, 6837206, 7055873, 1652010, 6415336, 3791157, 7155264, 8295673, 2186219, 3164147, 87376, 2742152, 8056795, 2119776, 8311972, 4005148, 6171948, 4887256, 8103610, 2389717, 1383856, 6358586, 6486141, 5604022, 285688, 3347670, 4357173, 7341173, 1567798, 2429538, 6113502, 4951433, 3155733, 1929610, 5623314, 3306480, 6165109, 4112568, 8168340, 686471, 369853, 8175181, 7694550, 2418636, 8078459, 3410733, 1968151, 579140, 5194100, 2509076, 3405191, 314041, 2149075, 714188, 5452479, 1816541, 5928804, 2182734, 6582485, 3225490, 6060585, 222966, 2630928, 995190, 5103560, 62826, 4223504, 483293, 5884938, 6968099, 1099848, 1676243, 911537, 7223142, 962973, 2430073, 6552501, 2570608, 7585670, 4894811, 5774148, 3523012, 2315038, 8173419, 5291341, 954832, 2771795, 1556118, 3280489, 2624175, 5801436, 3092797, 1505446, 6823222, 6491708, 212362, 4036492, 6845778, 4316626, 6731375, 4309777, 3361505, 4896858, 2528519, 1378613, 6576194, 4735490, 4561679, 3830983, 1384762, 4014730, 8117499, 370552, 3562083], +[1478978, 6820865, 7335961, 2530722, 7985107, 6369229, 4331347, 3666406, 6966558, 6127326, 5938101, 5416577, 5982901, 3364499, 1055286, 7544712, 4391714, 724727, 7278553, 1461933, 5110743, 6059907, 3729963, 4439737, 8131624, 928468, 5560572, 8307808, 5239582, 7334211, 4975598, 2667345, 3051249, 2514513, 3939570, 5512793, 1100107, 2062910, 7228339, 287161, 6050788, 6970151, 778589, 4258838, 5873847, 4719723, 6434069, 6202730, 4142089, 606498, 6205926, 6464799, 5086498, 672265, 7017529, 4327909, 3563809, 1487139, 4759581, 4693614, 4604754, 3593858, 6535563, 6474302, 7427883, 1692464, 1945432, 7857435, 2336715, 5455037, 4221505, 619654, 5324892, 1152662, 8312960, 7848950, 761760, 3140046, 7193026, 243146, 1275009, 4723662, 7380218, 5891742, 4301273, 2520968, 6699156, 3358218, 1945928, 7939961, 1210512, 1983536, 4416010, 2236593, 5823954, 1930635, 7583673, 7783446, 7469367, 8082253, 4534000, 7481580, 7228569, 838391, 4740194, 6151573, 435708, 1281645, 6894067, 2147086, 3961460, 4610754, 5659403, 2629044, 6434503, 1150226, 1745339, 3460410, 7286278, 4005985, 3755498, 7177069, 5702016, 2887004, 3758162, 7033976, 7956548, 4979914, 4034367, 4812607, 7003726, 8200824, 3456872, 7829941, 4761555, 5776291, 4585968, 1717669, 2752355, 1810951, 7756062, 408940, 2451956, 905989, 4090866, 6260569, 6106627, 8039288, 2583155, 3676843, 2125258, 2271724, 4021050, 4309755, 137908, 4195283, 6947052, 7403334, 378320, 4529055, 3336457, 1079917, 6940937, 949355, 7471432, 1153282, 5265442, 2987119, 5588748, 2545338, 6245752, 9759, 1742359, 880130, 6288229, 1228474, 6833602, 4216552, 3335436, 4096267, 6359683, 1767549, 5117759, 1234585, 2615818, 1288726, 658180, 3753997, 5261265, 2513282, 2403747, 7530493, 1213454, 8345936, 4617790, 5850756, 6542731, 7142220, 6709761, 2130296, 4154138, 7329926, 1985151, 3282440, 6398316, 7372680, 6507513, 2215324, 5667579, 5060593, 3995550, 2704699, 664959, 462996, 7437148, 7325068, 7737942, 4225635, 687608, 5046390, 4830344, 7334678, 7010250, 2985838, 1908064, 2903922, 7612351, 3711923, 7337575, 3246095, 4995316, 2227719, 3576890, 4092758, 1336822, 4689123, 3604519, 5218548, 7551181, 2796811, 6428169, 3419394, 3672818, 3945061, 5092616, 5070394, 781029, 7864262, 8055098, 1323545, 2026071, 4674021, 1279717, 3463328, 6986797, 4572641]] +aHat * NTT(y): [[4946737, 845782, 1559526, 8335667, 3407129, 4933664, 2761395, 6672771, 874466, 5867726, 2523764, 2765908, 3497667, 1539861, 7683077, 4722136, 6858841, 7211166, 3562719, 2882723, 6248910, 472321, 6670792, 1913046, 3856250, 5929995, 150807, 4736183, 5352223, 6723871, 2280633, 1561864, 2100896, 519135, 915066, 6843621, 2357894, 2929465, 4320527, 5276221, 6656497, 1873276, 3201035, 6849237, 7994573, 5745780, 4114676, 7622475, 1777318, 4368203, 5465261, 5613018, 5497636, 7136683, 795994, 2777378, 4588710, 5493003, 2996020, 1789223, 5955445, 2576807, 3938630, 7010195, 5076035, 3997168, 4983322, 7905237, 6417185, 7999271, 8006, 6761598, 5505574, 4260583, 6600774, 7830212, 5882870, 4771662, 4790878, 5254779, 4755870, 4467430, 6282857, 1779331, 7325943, 4266007, 3824501, 5168151, 7252459, 408600, 6553433, 7033739, 7107435, 2774113, 2090424, 8346081, 4070443, 6590615, 5388604, 2972163, 3176509, 3575050, 871073, 5171238, 6034564, 3173694, 3054140, 5619210, 1171631, 4896615, 4342768, 220191, 3792269, 2156196, 2842568, 1935021, 5328539, 3866114, 1769682, 5588814, 7732816, 2231250, 1632133, 6950883, 1902644, 5930521, 1293356, 2097873, 3530525, 5401087, 1729109, 4613127, 7076361, 5684740, 7253529, 5680583, 3066257, 8344958, 922463, 1131181, 2999254, 1907012, 7416375, 3620789, 7163258, 623893, 4532111, 2647565, 4104861, 1740964, 1784912, 4987996, 6356033, 6193247, 5443522, 7079401, 5526497, 4705707, 7620683, 2526306, 6322050, 1663724, 4054203, 2120567, 6810554, 6942048, 522200, 3996688, 1460005, 15384, 2205386, 7786965, 5460260, 6981979, 1671354, 963357, 4074913, 8373224, 6492471, 6133984, 2739653, 6573893, 8075045, 7403250, 4169618, 2401844, 1217765, 8330038, 8378862, 2693721, 170122, 7696923, 7185482, 8119334, 4096712, 7291634, 1565455, 8216957, 5353402, 568336, 5869384, 6848083, 3374591, 2570617, 3629696, 2411900, 4859814, 4266005, 8278792, 7909137, 846162, 7877092, 2068332, 3047397, 5423389, 2102968, 7912992, 3718370, 5170029, 3274728, 4049041, 4062950, 7705442, 7734371, 3297273, 2155931, 6230075, 7956930, 2222954, 3044967, 89727, 4209169, 3349491, 7699952, 6359710, 7499918, 4995913, 7890109, 1591660, 2518401, 3943964, 6759184, 4756583, 3933237, 5566099, 5661894, 3326897, 3931476, 4373550, 6670646, 4977688, 1364389, 904723, 4386915, 5404205, 4442927], +[4605573, 2679427, 404012, 940066, 7637740, 1676227, 8084888, 3114169, 3976338, 1837544, 6231970, 6809652, 5463009, 6552581, 7829199, 7872777, 2983464, 3745627, 4392380, 3260364, 5984447, 6310103, 25878, 5878602, 1611835, 302380, 6910738, 8291423, 5789053, 5567456, 2665928, 6285164, 3472623, 4047396, 5817581, 8208680, 2081328, 405923, 7293143, 5609163, 4480725, 348652, 6935773, 3050572, 3257350, 846460, 706464, 5856077, 7629322, 3931963, 4815280, 8246688, 3747869, 8174101, 5205605, 3762498, 1307410, 1669129, 8038819, 2242360, 6815286, 3363459, 7314151, 7895811, 7761114, 1556415, 5243600, 5916542, 5435897, 576686, 8377882, 1543223, 6324508, 1832615, 2861404, 2014642, 3729254, 4139714, 4762771, 512045, 1038650, 744704, 6999505, 2668091, 1154531, 4583498, 2668264, 5438274, 1850982, 3240209, 3137392, 2052939, 1068718, 4867194, 3935809, 4869932, 470012, 7971616, 861606, 8141753, 2288658, 6826841, 6047961, 5365742, 1289312, 2537382, 5578627, 2932958, 7859280, 7243814, 3535084, 6739933, 7408914, 2233174, 517600, 7763076, 5161271, 4336390, 3736060, 1492836, 1304989, 8018531, 379168, 1539566, 2173612, 7475695, 6449565, 6599613, 7289685, 6125742, 3019422, 8038365, 5965519, 7697724, 3855485, 1500066, 40604, 5096865, 350563, 6359868, 4645571, 3937179, 6293248, 5732, 98370, 6588688, 2238215, 65125, 2470729, 8047910, 1695641, 5214471, 477813, 8006061, 4310506, 3277061, 2986716, 45492, 1637634, 5108691, 4760999, 7477987, 7791377, 5020050, 8281116, 1814548, 7799067, 1704337, 965011, 4272536, 4789569, 4390419, 2262768, 1061807, 7109018, 7278124, 6150614, 6480795, 4806144, 6730121, 236271, 6518161, 3997046, 1747996, 478128, 5956741, 7983358, 6912763, 5285898, 2920856, 991038, 4499848, 2376557, 3201092, 3029652, 3630729, 8187225, 7092757, 4433094, 831351, 5498766, 5866574, 3226576, 1925554, 5488555, 3193472, 1765031, 2659775, 2282062, 1260713, 1121511, 1365608, 3703262, 7744698, 5723891, 8077107, 7038760, 5571545, 3069108, 4850788, 318259, 1733410, 2406975, 8147430, 3096957, 8264233, 7216013, 6232052, 7041771, 4181490, 4852431, 1534923, 6604805, 3643599, 7725204, 3168227, 2591147, 2330103, 5823858, 3905266, 8135540, 2578399, 3567196, 799464, 4537184, 2492132, 4915372, 5418210, 50258, 5740322, 624675, 8030501, 4943890, 7613123, 7663494, 4451057], +[4292202, 7593859, 3868132, 380359, 7822885, 4608081, 7271579, 1375398, 836745, 4768796, 1978798, 7726269, 7608348, 314974, 2620810, 5013315, 1286845, 6194002, 2854092, 7765993, 809776, 3399176, 4237226, 6944250, 351271, 1329803, 807268, 7791231, 58545, 8041121, 6750574, 5781911, 5444423, 2101838, 4372463, 1777129, 3925462, 17424, 4668402, 1421752, 1021449, 6844194, 79079, 4649894, 6458774, 3696156, 6922562, 7111504, 3943902, 2310979, 5660779, 3448602, 6375417, 1594768, 2660191, 4418677, 4282990, 3376601, 5187418, 5823797, 2528814, 5588709, 5836485, 1464396, 4925654, 5023658, 4753890, 6590526, 7753374, 4215882, 7875656, 8179046, 4576755, 2302608, 1286914, 2167290, 2533904, 4685867, 4330099, 4021864, 3882933, 4010918, 7733958, 2827138, 1724888, 6132262, 3139321, 7580636, 787952, 2877526, 4827230, 5730584, 91364, 4446852, 4692501, 4392020, 6520186, 8326580, 2868, 3194118, 4247924, 5309565, 6185391, 2760744, 6677923, 2995590, 1551156, 4325302, 4336376, 7419080, 7885904, 3595355, 2905007, 3375623, 6376573, 1478234, 381943, 694281, 8010319, 6398546, 215234, 1055561, 3118602, 3062797, 151838, 4868577, 2371589, 1774965, 4698953, 7521752, 8066722, 4665959, 7023672, 6660962, 6505657, 6369767, 3988318, 632119, 5936041, 2883484, 2795090, 762373, 4316812, 4337691, 655846, 5686431, 7190697, 2613088, 5268816, 4589451, 1712184, 7732705, 471524, 2112644, 5544741, 598453, 2143891, 3968274, 1730932, 2435258, 2923592, 2435438, 7376510, 4217051, 6323223, 3779551, 721124, 5322193, 5899451, 766975, 6224397, 1438153, 4830321, 5040374, 1777152, 5118493, 4465519, 2307415, 2385551, 5800857, 90523, 4958736, 7377765, 2636478, 1722496, 7891837, 5533398, 5180269, 4662317, 2567031, 674980, 4317868, 6901778, 6654970, 3035201, 2169447, 3305997, 404079, 2362294, 3384682, 1468511, 4909800, 7696188, 6765414, 7301388, 3578462, 2533558, 2103976, 6836696, 6660432, 3115074, 967760, 6529589, 4106369, 3126983, 1570339, 7927499, 73241, 4161622, 3719494, 7417306, 3368542, 5037501, 2029119, 370672, 1592487, 7402769, 7055305, 3235499, 6555422, 1898657, 7396884, 3392703, 3968549, 3354854, 6687486, 7690991, 1592373, 8185725, 6616707, 8267547, 5356409, 3548333, 5447068, 2522019, 5053453, 2922624, 4603880, 6165346, 1682944, 4266643, 3221254, 6365164, 4211064, 6602062, 3627170], +[7097686, 5772172, 6321052, 3182582, 2110808, 860712, 6342209, 3216935, 4552338, 7648132, 3722804, 7803937, 3322249, 7607882, 3558076, 6326921, 6987016, 6254754, 7647570, 916542, 1222659, 5180066, 1462187, 7802405, 6562971, 5766078, 6590127, 2071076, 5644663, 3976799, 7395324, 4975070, 749347, 8013155, 5923698, 670011, 2984406, 163922, 4014024, 7416564, 1642509, 969215, 2360124, 6241495, 4298391, 4676157, 3686862, 6143857, 139607, 4065974, 1763406, 1639291, 5773961, 3241857, 331897, 4105943, 2642046, 5906633, 3972259, 4596620, 3703035, 6150575, 6665667, 1662674, 5611311, 4524744, 6261287, 7921600, 7407567, 614634, 268561, 4132726, 678656, 7726286, 840390, 1119872, 8270596, 1605901, 2591106, 3133776, 1658405, 3603409, 4346562, 6627060, 730596, 1775419, 7925123, 2719727, 7952386, 3534818, 373762, 4502967, 4443246, 5725809, 6730197, 7116943, 1189537, 6988535, 1216383, 4152184, 3378886, 445729, 1143909, 6507746, 3684813, 7585845, 3787975, 7432763, 1690595, 3406820, 1661260, 284538, 8373747, 1750689, 6071302, 6466070, 3481084, 7368442, 3766632, 7276783, 487766, 7562205, 3393553, 5721166, 5245866, 7380968, 5100882, 2583462, 4704416, 7676351, 554762, 7270111, 4784457, 7296183, 6898730, 6152438, 8129585, 4549616, 3443063, 4848414, 2382626, 1686907, 6234975, 5675689, 7668559, 5253337, 5775762, 6906616, 5621416, 2132091, 3133851, 6724597, 639065, 969465, 3571989, 81365, 4431021, 1767884, 6133972, 3148582, 6534699, 4529774, 5700901, 8281647, 7284504, 6672633, 4878359, 3249799, 4208108, 7924092, 4839897, 4878603, 2395663, 8285216, 6120886, 7184255, 2622658, 4663163, 3668667, 7395543, 181839, 3093999, 1090102, 1067559, 615631, 2953908, 5749199, 4059681, 5980055, 1543050, 1348013, 8076693, 4656592, 2938118, 560919, 6025345, 4173652, 2586383, 7496295, 4217735, 2636436, 7579416, 2621009, 377195, 8276265, 7436874, 7268540, 2647872, 6205091, 2800853, 1267723, 1627731, 4379255, 5581422, 7673834, 7526041, 3289133, 4255595, 4974322, 6069461, 1545651, 4944323, 6109316, 719196, 6369233, 1965310, 782848, 8133183, 1128949, 3440341, 2512558, 3179363, 5268201, 1250567, 5839351, 3523752, 7467749, 6933734, 5189916, 4681164, 4334883, 1566399, 603815, 4473908, 3253517, 6088136, 5518546, 3511593, 3149194, 3994414, 1082328, 1734872, 5536317, 6734692, 6277384, 2439371]] +w = NTTInverse(aHat * NTT(y)): [[384297, 6873945, 1386044, 2707825, 4559028, 2345590, 1683029, 1381050, 5089217, 3858970, 8019333, 3719928, 7464499, 7143460, 8105520, 1063256, 2548649, 1476973, 4350521, 2814281, 1508160, 4620286, 5180416, 7961135, 8225186, 3436312, 3714798, 7248949, 8298613, 8234534, 6859250, 4834875, 6723519, 2908776, 1765330, 6519002, 1012802, 7740560, 6984048, 7534774, 5825376, 2377367, 7942804, 4052306, 5218815, 1712928, 957401, 1780227, 7353810, 2118962, 7115201, 1880031, 6924059, 258994, 700325, 4238821, 2032152, 853084, 2577443, 8132969, 806977, 7437962, 1360762, 6068262, 5545002, 579247, 4573212, 6229825, 4742393, 3472733, 6512657, 5314650, 3505281, 1607405, 6208821, 5900245, 2082369, 5242485, 7341542, 2511261, 6318313, 2429960, 6747446, 3759011, 7754808, 4159981, 4276212, 1893140, 2578155, 3038470, 7861094, 1026404, 6559112, 2466912, 6577860, 1735792, 6954936, 7205356, 6971862, 1538204, 381363, 282689, 6010091, 5355177, 352437, 632023, 5694484, 3224744, 7926001, 1201795, 1133243, 6852869, 247980, 4419696, 1140960, 5448889, 3507329, 7238974, 4716909, 5819154, 4245481, 2047430, 1128026, 6358186, 3084430, 4292302, 1714621, 983565, 5290978, 7373954, 4630718, 4210511, 4017742, 4145022, 7587880, 1701233, 2900207, 5885413, 4970306, 4139781, 4769134, 1820499, 39552, 7446936, 2681521, 5467058, 2152606, 4386839, 943603, 1817360, 3637246, 2928438, 7963438, 1668737, 6793018, 2043501, 1957277, 2300163, 6189583, 114118, 916470, 5995015, 446183, 3129002, 6671328, 3739236, 4155878, 1055199, 5628665, 7249467, 5718543, 676044, 649659, 174601, 2359910, 796011, 4966122, 2256388, 5138789, 5032867, 5860372, 2961710, 338446, 8330407, 1937794, 4670589, 8181875, 2284908, 3484818, 1858094, 1810442, 2548024, 3420709, 3671454, 6324763, 452103, 7981056, 6500201, 7612513, 994103, 2026537, 3222001, 1420137, 8365497, 2643148, 3934467, 6763875, 5772453, 1272716, 2659307, 7484352, 1717158, 6652654, 5404123, 6214385, 8244224, 3289993, 4910941, 2557381, 5130820, 6678523, 4624846, 5941665, 655869, 344273, 5330639, 1185874, 6020131, 5949271, 8013347, 2593802, 7982732, 3743065, 6183643, 4322109, 2229748, 1460397, 5093994, 4556072, 2474659, 4354542, 4329187, 7590766, 7717689, 6825646, 7994716, 731457, 7260114, 5070493, 827616, 8187697, 5118243, 767756, 4731125, 4455502, 2724432], +[4375729, 7439167, 3741004, 1886693, 1886038, 6148879, 6420327, 5823617, 7588734, 5491129, 3941447, 7459102, 907971, 2932636, 7320602, 6151556, 2754533, 1452757, 7298727, 7811343, 7260762, 7372124, 1890897, 1512935, 4035424, 636215, 6782330, 14391, 4120340, 2807533, 1457370, 3581269, 5932781, 2582216, 5164738, 2447197, 7344078, 2081348, 2726366, 5258483, 2859472, 4778139, 244017, 6685948, 3096389, 666480, 3635688, 3913782, 1736555, 7672690, 8093754, 6075357, 1483173, 2094734, 7847997, 4424416, 4182903, 7629224, 2125874, 5034461, 6591862, 5255473, 2361374, 7857033, 7100619, 2955316, 1052630, 6398258, 7788249, 4058764, 8353847, 7457019, 4501579, 85371, 4239007, 6273003, 4123117, 5494390, 5451685, 5442571, 6261606, 3444287, 6983137, 5877098, 5505478, 8376825, 3031523, 792884, 3704347, 4121210, 1326477, 7033669, 7985759, 1707321, 6240665, 4531312, 1318788, 3169358, 6904979, 3779020, 7918033, 2057591, 191038, 3671904, 119722, 6809443, 985984, 2073322, 672727, 1588064, 5399652, 7204125, 6344018, 2266204, 143620, 4448025, 5188449, 3484541, 3974293, 1149989, 1324847, 420651, 5323245, 5743237, 4367141, 5025479, 6559694, 1900564, 5163359, 6193757, 6462432, 1542127, 774384, 2776429, 7345824, 5336336, 1994516, 8180, 5123510, 6904565, 4555318, 5566633, 2094622, 7943374, 6462657, 883830, 5482738, 5168862, 4754679, 4404613, 1747656, 2894766, 7733580, 3352159, 228494, 1622701, 4610268, 6352877, 3869070, 8211685, 3424230, 7191166, 1119509, 5831158, 5693105, 6105977, 1035656, 7031435, 5208705, 8213334, 336187, 6658784, 1079468, 5880972, 3138948, 7387614, 7385423, 800600, 7492640, 6044164, 4476929, 4264435, 7249733, 2976509, 6843294, 4563508, 7010334, 7496154, 5492750, 1683508, 1752661, 7924888, 5099963, 5859409, 8286133, 7002010, 2684969, 5169840, 6364688, 3507776, 1725102, 6279639, 5612464, 5320778, 338898, 5764610, 5049720, 4028314, 3183583, 7054350, 5158382, 7772870, 1236534, 480286, 610818, 6956002, 6348261, 1287288, 5521480, 469818, 1748412, 3991863, 8236167, 6895599, 4377997, 2046976, 1437917, 1416662, 2576018, 6885479, 2580688, 1455324, 3379450, 4889103, 2846401, 435823, 785363, 429797, 3954826, 7832774, 3534951, 7075297, 7919714, 7040635, 5104371, 8065211, 7036750, 7003062, 6979021, 5305892, 8320476, 3650734, 7609893, 5198060, 1536363, 745792], +[2698851, 3049565, 3397006, 276070, 1551113, 2337230, 3645300, 7221632, 57076, 3887966, 673162, 2123583, 1551611, 430202, 5028689, 5335813, 3189903, 1735532, 1040457, 4890447, 248923, 6001602, 4857081, 7224303, 6041259, 881857, 5553458, 7992637, 7118844, 4554387, 3685812, 1263871, 3719174, 4603451, 6019870, 6668906, 7564461, 675574, 2792297, 2756285, 7454723, 2997504, 2911741, 1445641, 7918905, 5346763, 2907758, 8068939, 4532213, 1033567, 27982, 6640797, 165694, 900523, 3124851, 6842326, 4698887, 5223919, 1958530, 6246649, 6694076, 1839754, 4513234, 1676482, 4551691, 6114252, 1891664, 8039721, 3251649, 5856305, 8013236, 5957477, 4335416, 7769169, 6239469, 4127012, 2910897, 2493887, 7307418, 8279530, 3816111, 457321, 5991611, 1787520, 6743233, 7760393, 5813997, 4437600, 1531092, 4476649, 333348, 3744481, 2174724, 8128846, 275206, 4895288, 1287483, 1002060, 4673268, 5166890, 2604888, 1231927, 205155, 4271359, 7940156, 7227319, 1424681, 5392224, 1400684, 2815822, 1880876, 1122856, 401054, 2302333, 3522513, 2701678, 2893700, 7663131, 7588481, 503177, 12726, 8343029, 5476189, 2842697, 6080438, 786883, 7239249, 4728193, 2143258, 6252050, 2449419, 3881814, 4944795, 1047613, 2805341, 553833, 5912935, 5617249, 2236798, 1277788, 5208866, 6588991, 7774048, 4467143, 5095140, 6054774, 4608055, 7261922, 7891823, 5840415, 7690960, 246219, 281146, 7085566, 4161289, 3391594, 2733122, 362986, 6124446, 3349913, 5271461, 4333323, 3832228, 4328236, 1598000, 8130543, 2342520, 7891685, 6230627, 2739793, 3815291, 5741109, 1911137, 643138, 5600719, 4338235, 7432247, 5227793, 1921737, 1656025, 4497609, 2208142, 2613052, 2336020, 7672741, 7616590, 2386804, 7482310, 4536213, 7265065, 1921708, 4325422, 2461667, 3786595, 4807016, 4269271, 3992526, 3375866, 93439, 6654297, 5424135, 7839836, 4421951, 7239601, 7623418, 420956, 2903112, 7173899, 8340209, 6338780, 7158233, 5584874, 3139912, 1349237, 4274920, 3503073, 1305554, 7371672, 2257655, 4333468, 6904726, 2957070, 4020698, 4145057, 1249615, 2956358, 1757400, 1495154, 4557162, 8014319, 3924221, 5902852, 4006547, 2948087, 2318767, 2917988, 437731, 4849575, 2158238, 2119441, 962036, 84805, 7759415, 7115567, 6135739, 5851086, 5467291, 941372, 2299584, 5548452, 2405087, 3880197, 5425856, 3573878, 5759010, 1388987], +[6910521, 3304264, 4498304, 2636842, 8219646, 5469904, 1708789, 5737812, 7852341, 7913499, 6084464, 292920, 6903633, 7479994, 4666719, 18111, 5379474, 1822434, 7701540, 2198050, 8238025, 4602932, 5669157, 5952239, 7937722, 2966990, 1000966, 5600939, 3872117, 7624329, 5835600, 5913897, 8346319, 1585668, 815309, 5702218, 5076816, 1542970, 4741766, 6014714, 737601, 4708826, 5206921, 5542655, 8314407, 8269713, 2250607, 3175601, 4195956, 5553725, 7563566, 6924573, 3301750, 8281445, 3266351, 5099462, 766629, 7685247, 5767859, 2255869, 1174906, 6738377, 2345832, 1361506, 2470640, 4262228, 2004274, 6220669, 1873097, 121019, 4500990, 6679878, 6357694, 2634822, 4456971, 8330009, 7396496, 2151699, 8157788, 3209467, 4807321, 684468, 6587124, 1885011, 886955, 1924390, 1150962, 7827322, 317405, 574941, 5345346, 4079391, 8293267, 6150241, 1989052, 5843251, 4144785, 2230573, 4981528, 3315095, 1012749, 1758352, 7227190, 6599828, 208034, 7575539, 7637830, 776299, 7401256, 3111108, 1342280, 947573, 974323, 6694529, 5132227, 6003543, 2666366, 6771352, 2620000, 8157533, 7417467, 3021897, 4942349, 432947, 2776763, 2558584, 4157921, 4944725, 3815014, 1826985, 399065, 689783, 568678, 1134545, 6114713, 7728280, 1861155, 5416297, 1268717, 4615996, 5856978, 4677177, 2475343, 313433, 7588761, 6439705, 4003738, 299284, 1770798, 2582766, 3590658, 709025, 7067457, 5939784, 6554114, 6715, 5996795, 3645441, 4004447, 2490598, 688808, 4733881, 8346294, 6851529, 6133482, 2405464, 182731, 1265544, 6528802, 1663204, 6709191, 7173655, 5094267, 5974513, 4929092, 3523487, 4613010, 1443970, 4419207, 6565394, 5153562, 1807705, 1459972, 6590553, 2285927, 5409126, 6911612, 3300307, 4965001, 162216, 4105495, 898212, 5888028, 2468647, 4387552, 1580214, 3092354, 6508643, 196376, 4172334, 4151091, 5695676, 1128201, 3865323, 536847, 5457188, 2674436, 4160791, 2223348, 4667696, 4891967, 112250, 3132052, 2705330, 7035745, 6457101, 7907302, 1187386, 5222609, 3056857, 2509782, 2735008, 3822237, 3385407, 7378607, 7073565, 4779633, 7224561, 4351890, 7318310, 3608529, 7791680, 1437883, 6015727, 3725065, 3745276, 3245117, 4886571, 5306739, 6240148, 3612694, 5047105, 7702361, 4202267, 1676310, 5706632, 2944779, 6805427, 7856852, 1294182, 453318, 1387262, 5566150, 3807069, 5555579, 2723152]] + +w1: [[2, 36, 7, 14, 24, 12, 9, 7, 27, 20, 42, 20, 39, 38, 43, 6, 13, 8, 23, 15, 8, 24, 27, 42, 43, 18, 20, 38, 0, 43, 36, 25, 35, 15, 9, 34, 5, 41, 37, 40, 31, 12, 42, 21, 27, 9, 5, 9, 39, 11, 37, 10, 36, 1, 4, 22, 11, 4, 14, 43, 4, 39, 7, 32, 29, 3, 24, 33, 25, 18, 34, 28, 18, 8, 33, 31, 11, 28, 39, 13, 33, 13, 35, 20, 41, 22, 22, 10, 14, 16, 41, 5, 34, 13, 35, 9, 37, 38, 37, 8, 2, 1, 32, 28, 2, 3, 30, 17, 42, 6, 6, 36, 1, 23, 6, 29, 18, 38, 25, 31, 22, 11, 6, 33, 16, 23, 9, 5, 28, 39, 24, 22, 21, 22, 40, 9, 15, 31, 26, 22, 25, 10, 0, 39, 14, 29, 11, 23, 5, 10, 19, 15, 42, 9, 36, 11, 10, 12, 32, 1, 5, 31, 2, 16, 35, 20, 22, 6, 30, 38, 30, 4, 3, 1, 12, 4, 26, 12, 27, 26, 31, 16, 2, 0, 10, 25, 43, 12, 18, 10, 10, 13, 18, 19, 33, 2, 42, 34, 40, 5, 11, 17, 7, 0, 14, 21, 36, 30, 7, 14, 39, 9, 35, 28, 33, 43, 17, 26, 13, 27, 35, 24, 31, 3, 2, 28, 6, 32, 31, 42, 14, 42, 20, 32, 23, 12, 8, 27, 24, 13, 23, 23, 40, 41, 36, 42, 4, 38, 27, 4, 43, 27, 4, 25, 23, 14], +[23, 39, 20, 10, 10, 32, 34, 31, 40, 29, 21, 39, 5, 15, 38, 32, 14, 8, 38, 41, 38, 39, 10, 8, 21, 3, 36, 0, 22, 15, 8, 19, 31, 14, 27, 13, 39, 11, 14, 28, 15, 25, 1, 35, 16, 3, 19, 21, 9, 40, 42, 32, 8, 11, 41, 23, 22, 40, 11, 26, 35, 28, 12, 41, 37, 16, 6, 34, 41, 21, 0, 39, 24, 0, 22, 33, 22, 29, 29, 29, 33, 18, 37, 31, 29, 0, 16, 4, 19, 22, 7, 37, 42, 9, 33, 24, 7, 17, 36, 20, 42, 11, 1, 19, 1, 36, 5, 11, 4, 8, 28, 38, 33, 12, 1, 23, 27, 18, 21, 6, 7, 2, 28, 30, 23, 26, 34, 10, 27, 33, 34, 8, 4, 15, 39, 28, 10, 0, 27, 36, 24, 29, 11, 42, 34, 5, 29, 27, 25, 23, 9, 15, 41, 18, 1, 9, 24, 33, 20, 43, 18, 38, 6, 31, 30, 32, 5, 37, 27, 43, 2, 35, 6, 31, 16, 39, 39, 4, 39, 32, 24, 22, 38, 16, 36, 24, 37, 39, 29, 9, 9, 42, 27, 31, 0, 37, 14, 27, 33, 18, 9, 33, 29, 28, 2, 30, 27, 21, 17, 37, 27, 41, 6, 3, 3, 37, 33, 7, 29, 2, 9, 21, 43, 36, 23, 11, 8, 7, 14, 36, 14, 8, 18, 26, 15, 2, 4, 2, 21, 41, 19, 37, 42, 37, 27, 42, 37, 37, 37, 28, 0, 19, 40, 27, 8, 4], +[14, 16, 18, 1, 8, 12, 19, 38, 0, 20, 4, 11, 8, 2, 26, 28, 17, 9, 5, 26, 1, 32, 26, 38, 32, 5, 29, 42, 37, 24, 19, 7, 20, 24, 32, 35, 40, 4, 15, 14, 39, 16, 15, 8, 42, 28, 15, 42, 24, 5, 0, 35, 1, 5, 16, 36, 25, 27, 10, 33, 35, 10, 24, 9, 24, 32, 10, 42, 17, 31, 42, 31, 23, 41, 33, 22, 15, 13, 38, 43, 20, 2, 31, 9, 35, 41, 31, 23, 8, 24, 2, 20, 11, 43, 1, 26, 7, 5, 25, 27, 14, 6, 1, 22, 42, 38, 7, 28, 7, 15, 10, 6, 2, 12, 18, 14, 15, 40, 40, 3, 0, 0, 29, 15, 32, 4, 38, 25, 11, 33, 13, 20, 26, 6, 15, 3, 31, 29, 12, 7, 27, 35, 41, 23, 27, 32, 24, 38, 41, 31, 40, 1, 1, 37, 22, 18, 14, 2, 32, 18, 28, 23, 20, 23, 8, 43, 12, 41, 33, 14, 20, 30, 10, 3, 29, 23, 39, 27, 10, 9, 24, 12, 14, 12, 40, 40, 13, 39, 24, 38, 10, 23, 13, 20, 25, 22, 21, 18, 0, 35, 28, 41, 23, 38, 40, 2, 15, 38, 0, 33, 38, 29, 16, 7, 22, 18, 7, 39, 12, 23, 36, 16, 21, 22, 7, 16, 9, 8, 24, 42, 21, 31, 21, 15, 12, 15, 2, 25, 11, 11, 5, 0, 41, 37, 32, 31, 29, 5, 12, 29, 13, 20, 28, 19, 30, 7], +[36, 17, 24, 14, 43, 29, 9, 30, 41, 42, 32, 2, 36, 39, 25, 0, 28, 10, 40, 12, 43, 24, 30, 31, 42, 16, 5, 29, 20, 40, 31, 31, 0, 8, 4, 30, 27, 8, 25, 32, 4, 25, 27, 29, 0, 43, 12, 17, 22, 29, 40, 36, 17, 43, 17, 27, 4, 40, 30, 12, 6, 35, 12, 7, 13, 22, 11, 33, 10, 1, 24, 35, 33, 14, 23, 0, 39, 11, 43, 17, 25, 4, 35, 10, 5, 10, 6, 41, 2, 3, 28, 21, 0, 32, 10, 31, 22, 12, 26, 17, 5, 9, 38, 35, 1, 40, 40, 4, 39, 16, 7, 5, 5, 35, 27, 32, 14, 36, 14, 43, 39, 16, 26, 2, 15, 13, 22, 26, 20, 10, 2, 4, 3, 6, 32, 41, 10, 28, 7, 24, 31, 25, 13, 2, 40, 34, 21, 2, 9, 14, 19, 4, 37, 31, 34, 0, 31, 19, 21, 13, 4, 25, 0, 36, 32, 13, 1, 7, 34, 9, 35, 38, 27, 31, 26, 18, 24, 8, 23, 34, 27, 9, 8, 35, 12, 28, 36, 17, 26, 1, 22, 5, 31, 13, 23, 8, 16, 34, 1, 22, 22, 30, 6, 20, 3, 29, 14, 22, 12, 25, 26, 1, 16, 14, 37, 34, 42, 6, 27, 16, 13, 14, 20, 18, 39, 37, 25, 38, 23, 38, 19, 41, 8, 32, 20, 20, 17, 26, 28, 33, 19, 26, 40, 22, 9, 30, 15, 36, 41, 7, 2, 7, 29, 20, 29, 14]] +w1Encode: 02793818931C1BA552A7B91A0D723D08B6A9AB4499C04A66E39388455AA21FA3565B5224E7522A6440580BE1ACC47980DD808599247212127E0B7736613352A965290E9416623326A55922420072C2E045AA6190C1657492997DD66284D09514DC8959958526CFA75999029C4EB75C85323D6A422E0A0306C527402365199EE91143C0101AB3691F24004AB63292A234D2140AAA88164B74004E457A8773262317AE91D66C23F60D0267809FEAA8147831C88635D785A6A44A981BB16E447639D749290A287E68579DC563820E62A6E6A920D54002D6834C9FB335E7E2704F168CD0305509AA82C8925E16BA6823C7A425648869059C18608556D775A1547E1D00119375946A1262474452EA124C01592C04C29921135C9B541987C07997262A5B2822C473720AB09158B7A862D16DD9953CA914245848AD92697C1E5894DB2A8CC6079D27718298654224569E5D92A8DB0794CE164A49D87182B75551B9A5C63094E1D10949B592D7821C0EE92092F6088450A553A9969B5A9625074CE886100E240508339900452C88A07151526801A89960D1A925361D14068E28F13827F4202AF7A858018C410191D9A684A3822518A8A8D1A77E571A5A4F63AE94F02563FA5D082650CB1A6847916D8E1158AA7970C7A3180223390F8A0E00D03D2061664BD8509AF10C5FC71CDB985E1B8899E987064169498E004ADC455DC8CAA4A14379CAD05DE7A62418E33028DA9C98A95C0D955995048C5C7A99A8F098406876D06149C7C95C245459079420985A7DD5C33C42B62C059096E0D7154CD750DCE41D6484396B9778A90A0AE499019C82322BE67D2A547414FA7D0042781B928144B675C0CA44568792D11A6D04EA31C6C81C8DB5844A808DA17301E7B24619312A8562A4C2C05500A87C16A34545628E018A12277414C5B8810EE9AC27A4094F63699422108301A60A77605FD608A85809893311E52702DF543544069060131C62329ADBA7491872895B828C0C47465A60155F732190185896675043E7584CA60590538AAAB1418D43496799999739A508485191C68593865A89F790E9211C1DD539 + +cTilde: 57784A952DCB8E648F8610F9EF0BF01F0AED20707F445BB525753E5D7096C63F +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -1, 0] +cHat: [6650003, 5680140, 2216812, 1477582, 7668486, 4300053, 570741, 3379226, 1553795, 7094397, 6902915, 496978, 7445833, 7628371, 3727881, 1190485, 5678449, 4844396, 3993990, 1277305, 1223642, 5853017, 2263596, 6618335, 2121280, 3640231, 3692137, 7810648, 7829899, 5679632, 7927586, 5909972, 4827460, 4017130, 6707323, 36319, 7594177, 6591822, 5272639, 4733559, 2230761, 5715869, 3847228, 813326, 2405814, 4683512, 4518762, 2107241, 5756895, 4292283, 2098246, 2952367, 1821790, 5944650, 7231815, 4990466, 5465110, 4019243, 3698148, 1301860, 4677708, 322629, 390482, 2758833, 1275403, 6570430, 8062996, 1399841, 3346596, 3545425, 3636162, 1457175, 6106071, 2300875, 7223852, 5288274, 5722334, 2738687, 7114537, 1303008, 988829, 2692851, 5495393, 647595, 5475962, 5928683, 2353182, 5978397, 1255040, 1119337, 7833651, 1056964, 7894426, 1181934, 5292493, 3516512, 6145537, 3931135, 1180516, 3268381, 2541536, 4158485, 210737, 5172648, 6107669, 1069253, 2933674, 6747513, 868439, 964771, 4065460, 868386, 6772406, 519456, 5417869, 8061959, 2575422, 2294815, 6873138, 873336, 6377653, 1986360, 3051252, 6452819, 5869462, 3034275, 4231002, 2603750, 5704362, 3039080, 4428880, 5976213, 5684542, 3373817, 215069, 758260, 8373615, 7985135, 5029391, 871231, 3657572, 5878393, 7713039, 2592252, 7104134, 6564462, 2367500, 2096320, 7326337, 1971710, 961791, 2823757, 4621632, 6316868, 2227391, 807665, 2423125, 2575107, 8187494, 4525141, 5641055, 3735098, 7649635, 1385767, 6264642, 6234395, 4006739, 245437, 840144, 7124440, 6002786, 421655, 5960693, 7165196, 7951070, 557454, 4570277, 6768782, 3157813, 6865956, 3767128, 3703659, 8059094, 6253538, 663185, 2935094, 2812058, 3081568, 949433, 7202620, 4292560, 6103441, 250671, 3304549, 1241459, 3578820, 4593823, 2683604, 3553800, 5716030, 5560661, 305380, 7620994, 4638425, 5633904, 2156200, 5535912, 3230073, 5066959, 2720189, 3054550, 2958065, 2170035, 4007563, 3099722, 3896861, 153165, 2717003, 3033761, 2533320, 6287159, 4981316, 4629478, 8295159, 7651144, 3754686, 1680249, 5004679, 2132372, 4839907, 2484811, 1343984, 6342113, 6301078, 6602981, 5752221, 4794087, 6465319, 2164807, 7167897, 603677, 3874028, 7399301, 7675513, 3574909, 3626254, 5880641, 6702503, 183014, 1962782, 3570859, 3016068, 4055169, 4078926, 591975, 925882] +cs1: [[8380400, 2, 8380409, 8380407, 8380408, 12, 5, 9, 8, 4, 8380412, 8380413, 7, 8380415, 0, 8380415, 8380401, 3, 8380413, 1, 8380415, 7, 7, 7, 7, 6, 9, 8380410, 10, 6, 6, 0, 9, 8380406, 2, 8380407, 5, 1, 10, 15, 6, 1, 8380412, 6, 8380397, 8380415, 8380410, 1, 7, 8380409, 8380405, 8380413, 8380395, 8380405, 5, 8380410, 8, 6, 9, 8380416, 2, 5, 8380416, 2, 8380407, 8380416, 8380413, 8, 12, 14, 15, 8380407, 0, 8380408, 7, 8380416, 21, 8380409, 8380411, 8380412, 8380413, 18, 13, 8380416, 5, 8380416, 8380412, 8, 8380414, 8380416, 8380415, 8380415, 8380411, 8, 8, 11, 8380412, 8380398, 8380404, 0, 8380403, 3, 1, 6, 14, 8380408, 4, 18, 8380416, 7, 8380413, 0, 0, 3, 8380413, 8380409, 8380408, 8380406, 2, 1, 9, 2, 8380408, 8, 8380414, 8380396, 8, 7, 8380411, 11, 8380414, 8380410, 8380414, 1, 8380414, 17, 8380415, 10, 11, 8380409, 8380408, 16, 8380405, 7, 18, 5, 8380416, 14, 1, 8380416, 9, 10, 13, 8380415, 21, 8380416, 10, 8380401, 8380405, 8380404, 8380412, 8380402, 1, 2, 8380411, 15, 5, 1, 11, 13, 2, 8380410, 8380400, 8380390, 8380402, 8380409, 8380414, 8380415, 8380416, 8380408, 8380409, 1, 0, 3, 8380416, 8380415, 8380411, 8380415, 5, 10, 8380404, 4, 8380405, 12, 14, 8380413, 12, 6, 8380402, 8380409, 8380414, 8380414, 8380413, 8380408, 8380402, 8380402, 8380409, 8380411, 5, 9, 2, 17, 8380410, 14, 0, 8380409, 8380413, 8380407, 8380408, 0, 8380410, 8380401, 11, 2, 8380413, 8380414, 12, 15, 17, 0, 10, 14, 8380415, 8380416, 5, 3, 8380404, 8380404, 1, 3, 11, 0, 3, 8380401, 2, 2, 2, 4, 8380413, 8380412, 8380405, 8380406, 8380416, 2, 10, 4], +[5, 8380410, 8380407, 5, 12, 8380412, 8380414, 8380410, 8380415, 2, 15, 4, 9, 8380404, 8380407, 1, 8380407, 8380407, 12, 8380408, 9, 8380415, 8380408, 3, 0, 8380414, 13, 8380416, 19, 8380415, 7, 4, 9, 5, 8380413, 13, 4, 8380413, 8380410, 8380406, 8380411, 8380405, 8380409, 4, 8380411, 8380411, 16, 0, 8380414, 8380413, 5, 24, 8380408, 9, 5, 8380406, 11, 8380405, 8380411, 6, 8380410, 8380397, 8380409, 8380409, 8380401, 8380414, 6, 8380408, 1, 8380413, 8380413, 6, 5, 10, 16, 0, 8380415, 11, 11, 8380412, 8380410, 8380407, 8380410, 8380401, 3, 8380408, 8, 8380411, 8380406, 9, 4, 8380412, 8380416, 8380409, 11, 8380414, 8380415, 5, 24, 7, 2, 8380406, 8380408, 8380412, 11, 8380405, 12, 8380403, 8380416, 8380411, 8380404, 8, 8380413, 8380416, 8380413, 8, 8, 8, 8380409, 14, 8380413, 8380393, 2, 8380404, 3, 8380412, 8380415, 8380405, 13, 1, 8380397, 8, 8380413, 9, 8380411, 6, 8380413, 3, 8380410, 5, 8380412, 12, 8, 0, 9, 8380409, 4, 6, 8380402, 6, 8380413, 8380411, 8380413, 1, 8380412, 7, 3, 8380404, 7, 14, 8380408, 8380408, 7, 8380404, 4, 8380409, 4, 1, 8380400, 10, 8380405, 8380408, 20, 8380416, 3, 8380415, 2, 8380414, 8380407, 2, 8380414, 0, 8380405, 8380400, 8380415, 8380410, 8380414, 8380409, 8380404, 20, 11, 8380416, 8380412, 0, 4, 8380408, 8380403, 16, 2, 8380410, 8380412, 5, 8380406, 8380395, 3, 8380404, 8380414, 8380411, 8380405, 7, 0, 8380411, 4, 8380403, 8380411, 1, 6, 0, 0, 19, 0, 7, 13, 8380410, 12, 8380408, 5, 1, 5, 2, 8380414, 6, 8380416, 13, 0, 13, 14, 26, 14, 8380415, 15, 8380410, 0, 8380406, 8380414, 8380401, 8380406, 8380411, 9, 8380404, 12, 3, 3, 6, 10, 6], +[8380416, 9, 4, 10, 8380404, 19, 8380415, 8380413, 8, 8380410, 8380413, 10, 8380413, 8380409, 4, 8380413, 9, 6, 8380404, 1, 5, 0, 6, 5, 9, 10, 0, 8380402, 3, 8380412, 9, 8380410, 8380411, 8380412, 2, 8380407, 4, 5, 8380410, 8380415, 8380409, 0, 8380413, 12, 8380400, 8380416, 8380416, 8380416, 5, 8380402, 6, 3, 8380414, 8380415, 8380409, 7, 8380409, 8380403, 10, 10, 8380413, 11, 2, 1, 12, 8380403, 8380410, 8, 9, 8380404, 8380416, 8380411, 0, 3, 7, 8380411, 15, 5, 8380405, 8380410, 8380408, 5, 6, 5, 2, 2, 4, 17, 8380412, 7, 10, 8380403, 8380407, 3, 8380416, 5, 4, 14, 3, 8380407, 2, 8380411, 1, 8380412, 6, 17, 8380413, 8380411, 0, 5, 4, 0, 8380411, 8380404, 4, 8380414, 8380412, 21, 8380410, 8380407, 2, 8, 8380402, 8380412, 8380413, 5, 8380407, 7, 1, 15, 8380409, 8380405, 8380415, 7, 8380410, 22, 8380411, 3, 8380415, 8380412, 3, 8380411, 6, 13, 8380406, 8380414, 5, 4, 16, 17, 3, 8380415, 6, 2, 8380407, 8380416, 11, 3, 2, 8380405, 8380414, 8380415, 8380413, 6, 8380404, 8380415, 8380414, 1, 13, 8380413, 8380415, 7, 3, 1, 8380415, 0, 8380415, 3, 3, 8380415, 4, 5, 1, 8380402, 8380410, 8380416, 8380416, 1, 8380404, 9, 8, 8380403, 11, 6, 8, 10, 8380416, 0, 0, 5, 1, 2, 8380403, 8380413, 8380412, 8380416, 8380410, 7, 8380411, 9, 3, 8380405, 7, 10, 8380415, 11, 8380414, 8380407, 8, 8380402, 8380402, 5, 8380404, 8380408, 5, 3, 5, 8380409, 3, 13, 8380409, 4, 31, 8380408, 8380416, 8380415, 8380408, 17, 4, 8380410, 13, 8380408, 8380404, 10, 5, 8380406, 4, 6, 8380401, 8380406, 5, 3, 9, 0, 8380412, 7], +[8380406, 4, 8380416, 5, 8380411, 4, 13, 5, 8380403, 3, 8380412, 8380402, 2, 8380410, 8380411, 8380408, 8380409, 8380412, 4, 8380416, 6, 9, 8380415, 4, 8, 8380416, 4, 8380414, 8, 0, 8380404, 8380407, 0, 8380401, 8380412, 12, 8380412, 25, 8380414, 8380412, 8380414, 1, 8380411, 6, 20, 6, 4, 6, 8380414, 8380412, 0, 8, 8380408, 4, 9, 8380414, 13, 8380405, 8380412, 8380403, 8380408, 8380408, 2, 5, 22, 0, 8380416, 14, 6, 1, 5, 6, 9, 17, 8380407, 20, 8380399, 8380402, 8380402, 3, 11, 18, 14, 4, 5, 6, 8380402, 12, 8380409, 8380412, 0, 8380406, 8380412, 8380401, 8380416, 8380414, 8380411, 8380400, 1, 8380400, 8380410, 7, 8380416, 8, 12, 8380397, 5, 3, 8380415, 3, 12, 8380414, 5, 10, 8, 0, 8380405, 1, 8380411, 8380414, 1, 12, 8380401, 8380405, 3, 8380407, 8380416, 0, 19, 4, 1, 8380414, 4, 4, 8380414, 8380408, 8380416, 8380407, 8, 8380415, 5, 8380413, 12, 8380412, 8, 8380411, 18, 8380407, 5, 1, 8380408, 6, 8380408, 8380414, 8380408, 9, 8380401, 8380401, 8380403, 5, 6, 8380408, 8380403, 15, 8380413, 8380414, 1, 8, 8380415, 17, 8380414, 2, 7, 8380404, 8380412, 8380413, 8380402, 8380413, 3, 8380416, 8380408, 8380409, 5, 8380408, 8380412, 8380411, 5, 8380412, 3, 6, 11, 17, 8380408, 3, 1, 2, 0, 9, 8380408, 4, 8380410, 8380410, 9, 0, 8380406, 1, 1, 6, 4, 8380413, 10, 3, 8380416, 8380410, 7, 8380416, 8380413, 8380412, 8380398, 8380416, 8380404, 8380408, 12, 8380399, 8380401, 8380409, 11, 8380412, 10, 14, 8380411, 8380406, 0, 6, 8380406, 32, 6, 8380415, 12, 8380405, 8380404, 8380413, 8380399, 8380406, 8380414, 8380409, 0, 7, 8380407, 8380402, 0, 8380404, 8380405, 6, 8380408, 9]] +cs2: [[8380415, 8380415, 8380409, 8380416, 4, 2, 13, 9, 16, 4, 11, 8380404, 8380411, 8380401, 8380406, 1, 8380414, 12, 7, 0, 10, 7, 3, 8380403, 6, 3, 0, 1, 4, 0, 8380416, 4, 4, 6, 8380414, 2, 4, 8380416, 11, 3, 2, 8380416, 8380408, 21, 8380414, 2, 5, 8380407, 8380407, 0, 21, 10, 8380407, 1, 8380406, 10, 8380407, 8380416, 8380410, 8380412, 8380404, 0, 8380411, 9, 8380407, 8380410, 0, 1, 6, 16, 8380415, 5, 8380409, 8380407, 8380415, 8380415, 8380406, 2, 7, 1, 8380408, 6, 8380409, 5, 6, 8380415, 18, 8380410, 13, 8380413, 2, 8380408, 8380403, 8380410, 8380399, 8380413, 8380416, 8380408, 8380416, 8380415, 8380413, 8380414, 0, 13, 20, 8380405, 12, 4, 8380403, 8380407, 8380401, 2, 6, 13, 13, 5, 8380415, 8380408, 8380401, 7, 8380406, 7, 4, 8380416, 1, 10, 8380415, 8380409, 8380413, 8380410, 13, 9, 1, 13, 8380407, 8380413, 8380416, 8380410, 8380408, 8380409, 8380405, 8380407, 8380409, 4, 6, 11, 12, 12, 1, 10, 8380415, 8380416, 5, 8380404, 0, 8380411, 0, 8380405, 8380413, 0, 8380411, 15, 6, 11, 18, 8380411, 19, 8380415, 8380408, 8380401, 8380409, 8380398, 8380412, 8380415, 8380408, 8380410, 8380409, 4, 4, 8380401, 8380409, 8380408, 8380416, 2, 8380414, 12, 0, 4, 6, 8380405, 8380408, 8380416, 8380414, 8380415, 9, 8380415, 8380412, 2, 8380398, 8380402, 8380406, 8380412, 8380414, 0, 6, 12, 15, 2, 13, 21, 8380401, 11, 8380412, 8380409, 8380404, 8380397, 8380401, 8380400, 8380407, 7, 8380415, 8380410, 13, 2, 9, 5, 6, 11, 5, 11, 13, 8380408, 3, 8380410, 4, 8380406, 8380412, 8380407, 0, 8380406, 1, 5, 2, 8380416, 8380412, 1, 8380412, 8380412, 10, 8380413, 8, 14, 8380403, 8380409, 1, 8380408], +[8380408, 20, 18, 8380415, 4, 2, 8380412, 6, 1, 8380411, 15, 8380416, 1, 8380415, 2, 8380409, 8380416, 8380410, 10, 5, 8, 9, 7, 8380413, 8, 8380411, 14, 8, 6, 12, 21, 8380416, 3, 10, 8380408, 8380412, 8380413, 8380416, 8380409, 9, 11, 8380405, 5, 8, 8380405, 8380403, 11, 8380410, 6, 8380416, 8380406, 4, 0, 8380410, 9, 8380413, 8380408, 1, 8380398, 8380409, 0, 6, 14, 5, 8380411, 2, 8380410, 8380410, 4, 0, 8380412, 5, 8380401, 7, 14, 8380408, 8380403, 4, 8380404, 10, 8380400, 1, 5, 11, 8380393, 8, 15, 8380408, 8380405, 8380414, 8380410, 8380414, 8380413, 4, 7, 8380409, 8380411, 8380406, 8380406, 2, 8380416, 3, 2, 14, 8380399, 15, 10, 8380408, 7, 8380410, 8380414, 0, 16, 8380416, 2, 8380409, 8380405, 8380412, 8380403, 8380398, 8380410, 8380411, 8380407, 8380414, 1, 9, 8380414, 8380411, 4, 7, 13, 8380403, 13, 2, 3, 8380405, 8380412, 6, 8380415, 8380403, 8380416, 8380407, 8380410, 8380407, 8380414, 15, 8380415, 8, 1, 15, 0, 3, 8380415, 7, 8380409, 6, 1, 7, 8, 8380416, 8380408, 6, 8380414, 8380416, 8380402, 8380413, 8380415, 8380410, 0, 8380412, 8380415, 8380413, 1, 4, 7, 8, 3, 0, 0, 8380412, 8380415, 9, 8380406, 8380406, 1, 9, 8380410, 10, 8380413, 8380416, 0, 8380405, 8380409, 9, 8380410, 8380406, 4, 8380407, 10, 8380409, 8380402, 10, 4, 8380415, 1, 4, 6, 1, 8380415, 8380407, 7, 8380400, 0, 8380403, 0, 8380405, 10, 8380413, 13, 8, 5, 13, 5, 0, 8380409, 8, 8380406, 5, 19, 8380414, 8380414, 6, 12, 8380411, 1, 8380406, 0, 13, 8380409, 4, 4, 8380406, 8380399, 8380400, 8380414, 13, 0, 10, 13, 5, 0, 8380406, 8380413, 1, 5, 8380398], +[8380415, 0, 8, 0, 8380415, 8380410, 8, 8380401, 8380413, 8380404, 5, 8380413, 8380400, 8380415, 8380405, 3, 3, 8380411, 8380414, 8380397, 8380415, 16, 8380415, 3, 8380408, 7, 8380393, 1, 8380415, 1, 16, 8380415, 8380413, 8, 8380410, 8380415, 8380406, 8380414, 8380394, 8380416, 8380407, 18, 8380415, 8380411, 8, 1, 8380412, 7, 8380416, 13, 2, 3, 8380410, 0, 8380405, 4, 8380413, 8380411, 8380408, 8380407, 8380409, 4, 8380411, 6, 8380406, 8380401, 8380416, 8380414, 3, 8380407, 8380413, 0, 14, 8380412, 6, 8380411, 17, 8380402, 6, 8380407, 8380416, 8380406, 8380395, 8380402, 8380414, 8380411, 8380408, 8380408, 14, 15, 2, 7, 8380414, 1, 12, 8380407, 8380415, 8380412, 3, 8380400, 8380411, 2, 8380405, 11, 8380404, 6, 1, 5, 3, 10, 4, 0, 8380415, 8380412, 8380413, 4, 8, 3, 4, 8, 8380403, 7, 8380415, 2, 3, 1, 8380405, 8380415, 3, 6, 0, 17, 7, 3, 8380406, 0, 11, 3, 6, 8380410, 8380413, 13, 8380416, 8380410, 5, 8380415, 2, 4, 3, 17, 5, 4, 8, 2, 8380413, 8380407, 8380414, 18, 3, 8380414, 8, 8380416, 8380412, 2, 8, 8380411, 3, 11, 8380409, 24, 8380412, 9, 0, 8380399, 8380416, 22, 15, 0, 8380416, 8380402, 8380400, 8380405, 8380416, 13, 8380414, 2, 8380404, 8380416, 17, 2, 8380410, 8380405, 8380415, 3, 25, 3, 9, 8380412, 8380411, 8380416, 15, 8380405, 1, 4, 1, 6, 2, 3, 8380410, 8380407, 1, 8380408, 5, 0, 29, 8380415, 8, 8380407, 9, 0, 0, 0, 17, 8380415, 5, 8380413, 5, 6, 11, 8380403, 8380410, 0, 15, 8380412, 8380403, 12, 11, 8380410, 8380412, 4, 8380415, 8380414, 8380412, 2, 1, 11, 5, 8, 8380416, 14, 8380404, 24, 8380412, 7, 8380406, 8380414], +[8380412, 8380406, 8380414, 17, 8380412, 8380416, 8380413, 8380416, 8380412, 8380406, 3, 10, 7, 1, 8380415, 8380411, 8380416, 9, 2, 8380408, 1, 8380409, 8380409, 8380403, 8380402, 8380416, 8380403, 8380412, 8380415, 8380416, 8380410, 8380403, 8380411, 6, 7, 17, 8380404, 4, 6, 1, 7, 8380415, 2, 0, 8380409, 13, 8380411, 17, 8380411, 19, 8380413, 8380416, 8380405, 13, 6, 4, 2, 8380409, 8380411, 6, 3, 8380411, 14, 22, 7, 8380413, 8380412, 8380415, 5, 8380405, 8380415, 8380410, 4, 7, 3, 4, 6, 8380415, 8380396, 5, 2, 16, 1, 8380415, 8380415, 2, 8380414, 0, 8380407, 8380411, 10, 3, 15, 29, 1, 3, 3, 8380411, 8380406, 8380410, 8380408, 11, 8380406, 8380400, 8380404, 8380409, 6, 0, 8380403, 8380415, 14, 8380408, 13, 8380411, 6, 1, 8380403, 8380414, 14, 6, 8380415, 21, 8380414, 12, 8380413, 8380406, 8380408, 8, 8380414, 0, 5, 8380414, 8380415, 1, 8380400, 4, 8, 8380416, 19, 7, 2, 8380416, 2, 17, 8380413, 2, 0, 8380406, 1, 8380416, 8380409, 8380398, 0, 1, 8380410, 8380412, 9, 0, 12, 0, 8380416, 6, 8380409, 8380414, 9, 10, 22, 8380416, 2, 2, 8380408, 14, 8380412, 4, 7, 8380415, 8380408, 8380411, 8380414, 5, 8380413, 11, 8380401, 8380416, 3, 8380406, 1, 8380405, 6, 16, 8380416, 0, 7, 12, 8380411, 4, 8380415, 3, 0, 12, 3, 9, 8380416, 8380416, 2, 13, 11, 8380410, 8380413, 10, 4, 8380411, 0, 1, 8380409, 8380405, 5, 17, 14, 7, 8380402, 8380408, 8380409, 5, 3, 8380416, 8380411, 6, 8380404, 8380416, 4, 8380409, 8380416, 8380404, 8380416, 8380399, 8, 3, 8380403, 17, 8380416, 5, 8380416, 8380411, 3, 6, 8380409, 7, 11, 5, 8380413, 5, 8380412, 8380407, 6, 8380405]] +z: [[97090, 89551, 8335548, 8378012, 27435, 25635, 8334207, 44504, 8332343, 8362863, 102541, 8315356, 114467, 8292408, 124788, 5384, 101423, 8335085, 45469, 83720, 34883, 97091, 92902, 8373447, 8296980, 8353372, 69985, 100701, 8254347, 8350436, 42388, 8268097, 10334, 38846, 53704, 8352214, 84988, 8275561, 36905, 4859, 115886, 70793, 8350812, 8266132, 32832, 8319297, 8374379, 102062, 8264986, 58567, 41234, 8261684, 8364049, 81077, 29793, 45762, 88295, 8358408, 84601, 8324492, 128291, 108859, 8283930, 125818, 123118, 8312273, 8255101, 31604, 99640, 79241, 8351589, 100267, 29574, 8315475, 8254466, 8314252, 8259664, 11202, 11838, 110026, 89653, 27470, 8377333, 8258758, 8362873, 32874, 78157, 95822, 8291114, 8360156, 109961, 8348326, 836, 8369289, 8311321, 8270978, 8302006, 7724, 8323691, 8305180, 8293025, 64863, 5594, 28893, 47257, 6973, 8296201, 39786, 8333597, 8361042, 26206, 8262779, 8251254, 8253543, 8339306, 8328425, 8362748, 79091, 8302011, 55660, 8345345, 8326928, 8301267, 8378832, 8289605, 101001, 8355577, 8344441, 39775, 63199, 8311634, 65456, 72161, 8332955, 8345395, 8310113, 8310717, 80602, 20935, 130237, 128787, 64916, 8341289, 15752, 8279776, 63441, 8356932, 472, 8312054, 117366, 82389, 8345404, 8326198, 8269388, 15761, 8355232, 95444, 8263030, 8309964, 8348809, 8379097, 69098, 91193, 121600, 8367500, 8268710, 69460, 111102, 39946, 8320280, 8368328, 8326251, 120370, 129238, 60990, 56743, 106806, 8279119, 41559, 8323391, 20865, 8291048, 8270937, 127976, 8372370, 92375, 8269120, 7868, 107914, 7459, 8350965, 90113, 38713, 42673, 122155, 101703, 8323279, 8380372, 8306025, 72439, 18479, 107253, 8318475, 819, 8376572, 8334416, 112848, 8325713, 8280583, 8283177, 8318436, 53400, 8282305, 8273650, 117403, 97653, 71385, 8290395, 8373331, 49552, 8364889, 96984, 97152, 8297678, 8336884, 121361, 47587, 118459, 8378234, 371, 8308805, 114908, 8326550, 119894, 8321069, 8350502, 8299066, 35740, 12727, 8346542, 8353109, 50092, 43016, 8335725, 115924, 98495, 103689, 27079, 8371937, 60555, 8374028, 8257009, 8313927, 51458, 21673, 8317038], +[107080, 125323, 96667, 105029, 77146, 54024, 37191, 8311718, 125584, 8259023, 67606, 13819, 38059, 95102, 1018, 8349388, 8356774, 73277, 8252753, 71577, 8269018, 89759, 8294895, 8276238, 8348389, 8300397, 90355, 35843, 8357362, 8356931, 8256756, 8337587, 8314595, 115375, 7730, 8305823, 37983, 8259452, 49763, 100846, 8301854, 8317325, 8340816, 8249764, 11771, 8365505, 8257611, 67496, 8335485, 44790, 8317580, 8257289, 64376, 8303515, 8349186, 8378149, 8372044, 49232, 8278611, 8287063, 8333023, 8252228, 8330218, 8346273, 98123, 69793, 8365788, 8354716, 8293265, 128600, 8279499, 12402, 8328826, 8360712, 97904, 8346470, 8373309, 8273945, 8289372, 8294347, 55328, 8346010, 8362150, 8298319, 8257820, 8290030, 8373292, 8274544, 108112, 8363224, 8249400, 14305, 8316611, 8325694, 112333, 8291133, 8255657, 8272355, 78158, 8269312, 12344, 8295860, 8256449, 61220, 70798, 8267048, 6810, 8265125, 79015, 8324063, 8274095, 8281612, 21631, 34054, 98689, 8258094, 65218, 18553, 8299641, 8336997, 55455, 8311715, 71177, 124551, 8295045, 90095, 8365947, 64941, 8363228, 8255261, 96495, 8321506, 8262525, 28053, 8269756, 41243, 8255989, 8363796, 67580, 65515, 122328, 821, 8323894, 8256319, 8253293, 28717, 8337518, 8335964, 52708, 8261730, 8379632, 60410, 8251860, 41076, 8320517, 88480, 116475, 114851, 27525, 8324881, 8358811, 8356160, 17501, 61515, 8368809, 83608, 8273862, 100131, 21455, 30200, 43202, 8303514, 130790, 34134, 82103, 27401, 81857, 8268001, 8326564, 41627, 8289332, 8303035, 8253631, 68058, 49059, 24506, 8373301, 111258, 124688, 8325241, 8292785, 8289017, 13973, 59736, 88860, 8331740, 59382, 8258137, 1302, 13625, 752, 8319584, 18950, 104855, 8289092, 4812, 8293016, 8278400, 33789, 8333884, 109406, 8320379, 8309992, 8370738, 8369028, 34479, 13854, 8255876, 53430, 114069, 8308705, 59550, 64061, 8274156, 8275476, 8251146, 5894, 86258, 61093, 81361, 8364154, 78550, 94415, 8326706, 44243, 17113, 8350693, 129920, 8264942, 8353676, 8355107, 8305304, 8337693, 45528, 87051, 78611, 31293, 8348746, 8255816, 79639, 8321584, 8333053, 61268, 97760, 8364174, 8264681], +[118603, 36718, 37214, 33704, 34094, 104276, 8316137, 18640, 8265780, 8268397, 8309001, 5465, 8313300, 8262297, 8353852, 51769, 9012, 75562, 100509, 8251498, 8269897, 8251463, 8319428, 57669, 8370008, 8326533, 8257861, 64078, 20547, 13624, 8317273, 95264, 8259134, 48091, 8305616, 8361611, 67548, 8374352, 41761, 8290440, 21287, 8261804, 13307, 68671, 8260172, 3900, 36401, 16892, 83699, 8257675, 36286, 8284854, 47828, 8305636, 23384, 42486, 9102, 47524, 8369259, 1072, 47534, 25249, 96196, 128227, 8263528, 8253801, 127398, 8329699, 8305894, 8307640, 72689, 48105, 8346254, 84270, 33409, 16090, 8334605, 8371113, 8327410, 8355960, 8323, 84275, 87833, 76429, 8322478, 40491, 8279491, 8294536, 106461, 8374581, 8260789, 109093, 7447, 8303061, 8363195, 66968, 8370874, 8317300, 8276822, 83027, 8363324, 9700, 8378839, 8323399, 65984, 94742, 119906, 92546, 5382, 8287022, 8288058, 8263920, 8376371, 8339589, 8303616, 8357618, 57401, 8253164, 30644, 44129, 9991, 129978, 8312780, 87659, 8323034, 1535, 38942, 118043, 8274078, 22997, 8307729, 87863, 8342678, 8345642, 8262848, 67037, 8288757, 56295, 66815, 114508, 61797, 8264411, 94774, 65495, 8275347, 17455, 8299127, 109602, 36370, 44442, 8379490, 28248, 8325272, 35981, 63696, 8286796, 70376, 39815, 8376421, 8266242, 2081, 48193, 8309918, 8348101, 8345277, 8295146, 126177, 8267024, 15777, 51122, 17148, 8336770, 44981, 70808, 8332438, 35162, 114299, 8249572, 8253956, 8333009, 36764, 92620, 96094, 115033, 8260504, 39364, 74016, 8342170, 79697, 8258045, 80797, 56854, 113497, 13521, 13916, 8291753, 8362200, 121216, 8297705, 8356977, 8286502, 16897, 53054, 8339130, 8318644, 8370676, 120736, 8781, 8364379, 53833, 8318082, 71278, 8366037, 121311, 117419, 8367440, 101968, 8271627, 8257160, 56238, 8304244, 14666, 8296807, 117460, 106661, 99568, 24445, 105289, 118667, 41733, 10471, 121473, 8353787, 31411, 125492, 6114, 110027, 72530, 8253007, 8347327, 62413, 32140, 80614, 8294301, 16130, 18919, 8312095, 8250041, 8266490, 8331052, 8250226, 8307612, 114219, 8328639, 8258802, 8307898], +[90388, 8280072, 8253660, 8371326, 8360631, 59143, 48260, 96013, 50358, 8341797, 128824, 8287761, 41092, 8295282, 8354951, 78290, 77765, 8322783, 8371263, 8262308, 8316879, 8301524, 108075, 8259149, 8338008, 63974, 71816, 44065, 66859, 94271, 69883, 59669, 8376950, 8334474, 17676, 77287, 8360318, 8278726, 20854, 8285073, 48740, 8353301, 59373, 59313, 71887, 73121, 114910, 8362703, 37783, 52206, 79841, 116223, 23436, 81299, 8251755, 24621, 3446, 8369825, 8314670, 8366645, 68158, 39556, 121992, 8253427, 8299389, 8298443, 8280292, 57331, 8274456, 29521, 8374799, 80287, 8271685, 8342362, 69114, 70180, 8285011, 8367533, 8281882, 24269, 86195, 8254438, 30362, 95020, 8337699, 8377446, 8341081, 100013, 8361402, 8324078, 8310629, 9546, 8361054, 8282394, 55822, 51627, 106445, 8333466, 8282086, 52080, 26876, 8268273, 34475, 87499, 82541, 8294962, 8322244, 8362210, 8254533, 86859, 8378142, 8291529, 81457, 64054, 24474, 8331256, 32642, 8308501, 8337371, 34054, 8331115, 8341989, 22378, 3472, 8309735, 61978, 8250562, 8288729, 8347850, 73322, 104585, 8257565, 40337, 58117, 14370, 96010, 38328, 32756, 114203, 8338670, 60485, 46621, 90645, 8270696, 8251283, 8354447, 124708, 86748, 8377138, 8288848, 8349845, 540, 8279470, 8272653, 16277, 8307575, 8262636, 8312259, 8320828, 8378402, 8326529, 8349014, 60262, 8312654, 112566, 58436, 76958, 8374531, 23712, 8278962, 100199, 43613, 23074, 8369142, 8334143, 126232, 8367389, 66973, 36936, 62291, 53278, 8329624, 8348428, 116444, 61711, 8300106, 87822, 18400, 8342184, 57463, 94059, 130628, 8377283, 8360070, 8286090, 8362870, 8266499, 8293629, 8259034, 99186, 8342264, 8268147, 8375471, 6642, 8380201, 70256, 2753, 88910, 8319209, 8289142, 60173, 81678, 44000, 8373089, 8336063, 122694, 102374, 8372706, 8263443, 8280660, 35303, 46220, 126811, 3648, 8372091, 8287800, 8360998, 67363, 8330499, 58472, 48517, 130596, 13417, 109082, 8262649, 8357409, 8368344, 90766, 8339319, 73070, 8335297, 125392, 8267242, 8299021, 9921, 122250, 8332468, 8286493, 98387, 8335156, 7432, 8340171, 88730, 41862, 24839, 8333898]] +||z||: 131017, ||z|| too large +r0: [[3371, 17243, 52804, 41330, -12112, 60020, -31160, 47793, -53327, 49686, 19834, -89339, 36409, -94156, -84421, -79529, 72620, -46751, -30158, -42679, -15562, 49143, 37885, -38339, 35228, 7957, -94482, 11316, -81808, 44582, 2547, 73271, 57275, 51810, 51157, 43224, 60478, -68463, -63131, -83789, -79010, 91800, -56675, 52541, 76290, -1250, 5076, 66061, -74276, 23858, 68012, -24619, 67365, 68529, -61520, 48603, -62942, 91229, -89046, -56978, 45134, 9866, 27520, -26595, 21556, 7862, 2076, -55488, -19213, 44365, 36883, -18347, 76937, 83703, -76489, -4137, -12724, -90509, -86561, 35228, 33010, -46078, 81214, -50274, -54222, -30225, 85986, -11493, -88354, -8950, 52068, 74093, 83350, -9113, -88362, 21620, -92231, -32267, -75305, 14494, 439, 92228, -84757, 22172, -28511, 60643, -19448, -13148, -73473, 59021, -9525, -3837, 57510, 39011, -1837, -74572, 78979, 1351, -44675, -85237, 55284, -47681, -14762, 72875, 37005, -88380, 447, 31253, -42010, -54135, 59569, 20294, 17997, -45199, -30670, -12939, 43248, -18964, 18251, -50419, 7546, -84131, 39560, 18836, 15019, -56409, 57490, 6155, -8718, -87290, 18432, 71479, -36055, -45426, -63686, -51597, 52637, 14607, 94739, -76346, -35844, 90616, 65249, 81567, 5070, -70038, -34349, -87583, -85246, 11851, 4631, -85793, 78272, -15861, 74351, 34162, 14066, -29184, -3743, 80819, -44004, -85705, -42481, -50012, 33157, -91023, -8077, -664, 56460, -46534, -94189, 71993, -7640, 52640, 39442, 71177, -18427, 24423, -6028, 41798, -68556, -15882, 86892, -14920, -23354, -65289, -92844, 58531, -60545, -7210, 56272, 2971, -13581, 71139, -70914, 54292, 52121, -41106, 81359, -11715, 12285, 53717, 37268, 84475, -36664, -2358, 43084, -74728, 44882, 13848, -72707, -16747, -66218, 88802, -58567, -55809, -63310, -48524, -15064, -1362, -26131, -51490, -27796, -91334, -31053, -4773, -30394, 22487, -72045, 65764, -2263, -24299, 5914, -30467, 74829, 57945], +[-4934, 11051, -68294, -17945, -18606, 54029, -55444, -80773, -29827, -32321, -58312, 31007, -44350, 75678, 82968, 56716, 88038, -70948, 61085, 2314, 23122, -55981, -13750, -10773, 35672, 64829, -74388, 14383, -69874, -49439, -66363, -37546, 28394, -84290, 22219, -28830, -84014, -13755, 59878, -74518, 2501, 16551, 53548, 19700, 48977, 95102, 16861, -85955, 22373, 54131, 94277, -19495, -40539, -363, 38964, 43748, -7296, 10663, 30789, 82405, -74378, -77525, 75792, 48004, 53457, -92110, -90147, -77511, -20779, 59020, -26565, 28918, -69541, 85364, 48785, -12300, -67077, -29070, -71758, -80895, -23689, 15934, -64036, -27297, -17954, -3600, -15916, 31037, 85543, -68995, -6764, -13496, -13725, -6859, -44654, -39816, -14454, -68519, 48286, -30262, -81454, -37516, 572, 53074, -70724, -47276, 33654, -21773, -89136, 64359, 66663, -33507, 58690, -19363, -46846, 67361, 45933, 56194, -25437, 7224, -8394, 39729, -9737, 29320, -13532, 73406, 83921, -4070, 20827, -91562, -13357, 18429, 12515, -80533, -82275, 3356, 89881, 8174, -19016, 47875, -15817, 43187, -475, -56104, -13116, -68505, -40716, 26326, -6922, 23926, 33480, 37803, -75442, -76200, 38038, -91481, 39131, 67558, 59782, 21734, -4113, -46472, -23272, -73225, -20800, 11133, 83338, -15726, 66177, 23387, -44739, -7452, -63317, -23416, 91517, -40490, -42676, 38744, 64544, -50679, -94205, 74218, 12112, -70904, -13411, -7637, -36827, 68048, -30702, -30667, 38485, -74588, -42557, -44984, -94277, -45147, 18469, 27322, 79366, 79432, 10941, -5683, 89004, -12212, -42031, 50686, -92814, 28569, -54303, 7192, 15847, -36137, 93750, -91092, 39426, -91154, 62939, -45956, -1989, 88882, 34231, -7894, 46210, 38895, -2667, -48136, -85784, 83409, -90497, 28778, -85805, -68394, -48914, -62955, -10560, 54906, 23507, 48856, -44910, 23746, -83869, 28140, -79756, -6516, -38154, 65710, -10418, -44116, -68160, -27105, -59941, 31929, -8663, 55531, 12646, -16045], +[32357, 2141, -31354, 85606, 27403, 51669, 26476, -15984, 57080, 78699, -88699, 28483, 27916, 49276, 76637, 2818, -47988, 21362, 88140, -61597, 58461, -93262, -94981, -13332, -53580, -70470, 30026, -6852, 71678, -16750, 66980, -69375, -90102, 32307, -74971, 2668, -54088, -86279, -64640, 89790, 26637, -49938, 54783, -78065, -80591, 13770, 50803, 69444, -38922, 81234, 27980, -25446, -24763, -51797, 77439, -14382, -62709, 81397, 53899, -38653, 27844, -64890, -57896, -37700, -19434, 19420, -12975, 40236, 13758, -48069, 13752, 53093, -45270, -39850, -45849, -63190, 53920, 17870, 69780, 89588, 6832, 76404, 87249, 73359, 76996, -48625, -90378, 56937, 7366, -94502, -47582, -64806, 79623, -61107, 84730, -56766, -45763, 49745, -88335, 24379, -61602, 89141, 14703, 81140, -59319, -10319, 91432, 59227, 67433, -41148, -23768, -19928, 20128, 16770, 94165, 35178, 36732, 44568, -30083, -68223, 12740, -37395, -47265, -14265, -14413, 25026, 1629, -33405, 48151, -33268, -26613, 72517, -7276, -95174, -51608, -17559, 8540, 93790, -48776, -55453, 66342, -77262, -34975, 86478, -47393, -40072, 36917, 24286, 82796, -63986, 72395, 55751, 90674, 38396, -28915, -36748, 66629, -17960, 29595, -78436, -61539, -47348, 22953, -52438, 74280, -59403, 56949, 82650, -54677, 73273, 6016, 27180, 6497, 71764, 77264, -42459, 4136, 85265, 17098, -58136, -73510, -77414, -53443, 50439, 54184, -1972, -89215, 54215, -34940, 27431, 17075, -55238, -14363, -22688, 45391, 79060, -7227, -52481, 93445, -11942, 91128, 30824, 41278, 1965, 4857, 40022, 46150, -63736, -40201, 53478, -79400, 61427, 92483, 15989, 84683, 74723, -27702, -56414, -27922, -47204, 48022, -90354, 20937, -45149, -83638, -91062, 43219, -28564, -13985, 14845, -75516, -1532, 6788, 91132, 33213, 61016, 56792, 87982, 63139, 24333, 9718, 84808, -49604, 68397, 40890, -53309, -56170, -10956, 14017, 24982, -70932, 70893, 92869, -44945, 45101, 55742], +[53822, 66387, -72829, -29671, 29699, -53551, -5383, 23893, 43322, -85978, -10387, -88018, 46922, 51897, -94879, 18117, 46483, -82215, 82978, -87509, 48072, 31804, -44755, 47869, -61751, -80433, 48660, 77488, 62839, 5770, -68777, 9527, -34092, 61950, 53446, -11719, -65699, 19254, -19840, -80135, -24262, -52772, 64391, 19199, -66002, 79748, -34955, -62304, 5754, 30250, -54990, 67870, 63874, 91480, 28457, -43070, 4771, 66695, 53945, -29705, 32119, 72143, 60250, 28236, -5399, 72024, -90825, -64641, -31548, -69433, -70144, 13645, 72378, -31681, 76296, -50412, -31606, 56597, -32143, -28426, 45719, -77404, -79117, -19627, -65363, 19748, 8181, 18298, -63513, 3555, 12344, 79644, -87165, 55364, 84411, -61136, -45426, -54989, 29475, 77214, 60438, 44165, -10431, -66395, 17583, -43013, 19264, 14443, -26826, 63686, 9018, -4738, 21990, 28295, -10307, -91306, -116, -85349, -46510, -32425, -10627, -25548, -9712, 52007, -80193, 82563, -32278, -7347, 5737, -77655, 18132, -72070, -2712, -8240, 19882, -80748, -43493, 83306, -64550, 44853, -47408, -84422, -691, -67512, -29795, -36073, 3994, -81633, 56621, -83729, -28150, -52812, 20289, 35399, 78345, 6720, 92402, 26625, 4691, 14566, -73047, -27725, -34115, -5172, 38625, -70578, -7755, -67703, 53024, -50974, 42960, -63991, -48256, 70125, -22979, 95137, 41883, -79736, 38538, 89613, 11038, 93518, -63724, -75686, 356, 76145, 54907, 62431, 12931, -28264, -84712, -54108, -16363, -7397, 6886, 56498, 44932, 32864, 5912, -17886, -39120, -18253, -14582, 56044, -34547, -66281, 7929, -29410, -62216, -93914, -60101, -78208, 84628, 38833, -11415, -18663, -92191, 44585, 80067, 9426, 33765, 68521, 12965, -42950, -49492, 26398, 18039, -13077, -28769, 80679, -10291, -17336, -85828, -79108, -84214, -63986, 7221, -65496, -26239, -45181, -6121, 95036, 83802, 12065, -37869, -7294, 87827, -51284, 47817, -39071, 72394, 54009, 42699, -2201, 32117, 56668]] +||r0||95174, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-30934, -73939, 10117, 113716, 128867, 2954, 37123, -54489, -55691, -23532, -55759, -54298, 104141, 63192, -94715, 122164, -64091, -527, -43484, 117828, -77254, 85589, 56958, -73712, 63207, -83102, 58446, -107246, 102229, 20590, -118173, -42248, -67302, 50633, -62448, 129846, 114943, -120346, 26168, -49765, -7621, 30294, -94552, 2490, 95068, 86399, 65942, 34249, 40922, -116497, -106573, 17210, 33018, 6240, -87093, -129093, -86366, -113135, -43890, 17105, 19007, 118237, 22646, -72055, 17759, 38430, 40913, 124879, -33958, 125427, 127813, 59983, -102278, 115947, 92460, 8419, 58352, 27895, 55880, 115653, 67784, 115140, -56885, 86723, 42699, 115347, 118322, -11583, -41920, -127553, 22859, -105771, 84567, -8912, 14579, 97501, 116597, 2834, -84039, -100059, 13455, -50684, -98679, 113651, -860, -108658, -8569, -37605, -6267, -119419, -82681, 111551, 95612, -13180, 19723, -31726, 69797, -49341, -110931, 65383, -41132, 62557, 82142, 96800, 79418, -47169, -70907, 22628, -5742, 80481, 25412, 18326, -88363, -63266, -118455, 13396, 88233, 103284, -124131, 64215, 33074, 3376, -26811, -3464, -109360, -87047, -55494, -113465, 78346, 126456, 42065, 48997, -52505, -66422, -110467, 72376, -128208, 38325, -83785, -70130, 91712, 118754, 35616, -35479, 115082, 26080, 48439, -92341, 67151, 35288, 66122, -17670, 40647, 20394, -20199, -99928, -36290, -62485, 110436, 24472, 83194, 66670, -58613, 29052, -75277, -85749, -27823, -100933, -122222, 115643, 49570, 54229, -4353, -54083, -30367, 14845, 52326, 49453, -86288, 27514, 80249, -23630, 27905, -17257, -94847, 40898, 30657, -82668, -13650, 79318, -20152, 115005, -20640, -38465, -1832, 125228, -22254, -7378, -63882, -8548, 103023, 121400, -28296, -41240, -62822, -122246, -130281, -13809, 33289, -44592, 79349, 30751, 118537, 101787, -42915, 73887, -91607, 117442, -140, -130297, 32121, -37501, 47628, 116213, 130011, 30945, -60621, 51249, -40249, -64984, -73984, -39271, -55618, 33107, -18359, 19318], +[86577, 108999, 16222, 71673, -127580, -97698, 24527, -59801, 74621, 49489, 20500, 8100, -522, 105561, 77773, -113463, -119880, -54943, -45637, -90309, 18470, -86105, 104438, -130679, 73105, -83404, -13002, -74561, 110770, 87360, 58658, -76737, 203, 2927, 54476, -87326, -130631, 65499, -58266, -52989, -7306, 20723, 86535, -88796, -40129, 31494, -21420, 14340, 64443, -13493, -28125, -119947, -11015, -71201, -84264, 89516, 40821, 36236, -53380, -106363, 88732, 97602, -95952, -47712, -73102, -28240, -90964, -20169, -54215, 55974, -50822, 65728, -123147, -128660, 51003, -40235, -93159, 20347, -38860, 52383, -25928, -86183, 40869, 19393, -116874, 310, -51693, -47225, 28141, -100196, 107412, -27745, -45489, 19595, 10979, 21935, -50395, -78201, -107599, 40859, -16948, 51721, -112139, 74671, 69038, -124204, -83990, -49871, -35072, -73716, 86916, 53719, 72034, 84076, -3810, 40065, -86937, 25587, 91003, 26798, -97219, 81956, 31628, 73844, 79683, -306, 90702, 107716, -61004, -126656, 26348, 96941, 39514, -108150, 65492, -78364, -93849, -66820, 115471, -92814, -83068, 118891, 31578, -74892, -54809, 33279, -63281, -47647, -47412, 114172, 122755, -68997, -104419, -91664, 128754, -57252, 28309, 89235, 29224, 75797, -40158, 88889, -3716, 76164, -68710, 35812, 11684, -16026, 51895, -11082, 80421, -61197, 121333, -60107, -127376, 84399, -47503, 90039, -71728, -86594, -108134, 5210, 46574, -33856, -14877, 98108, -47327, -8221, 80556, 124050, 20790, 58100, -31646, -119675, -83480, 61216, 82580, -51631, -120542, 87385, -94002, -7991, 103168, -29812, 52523, -90776, 91128, 63864, 39135, 17513, 34005, -28366, 49127, 25140, -44781, -75878, 9770, -28897, 22079, 92773, -118840, 96654, 66978, 63754, -75131, 19758, -56684, 42113, 121894, -90386, 56455, 62841, -99146, -118973, -114779, -88362, -49634, 110456, 10676, 58199, -72269, 58384, 13577, 66930, 34417, -63091, 13692, 2476, -47828, 101976, -124925, -49396, -76234, 29332, 76040, 2503], +[-19533, 2019, -87932, 44741, 25991, -70772, -23076, 112153, -7838, -63413, 6057, -81829, -29066, -37200, 89505, 37520, 23869, -95301, 122012, 119090, 98476, 121074, -1719, 109670, -51339, -20389, 52278, 19203, 93774, 76204, -59447, -92013, -110706, 68504, 59080, -65195, -2542, -77205, -121714, -98202, -10049, -14692, 86978, 107750, -40245, 38973, 58537, -114241, 44055, 127191, 56111, -21574, 58246, -85945, 124687, -5192, -68759, -98379, -126487, -55738, 31086, -75568, 77869, -14223, -87507, -18041, 22835, -129959, 109218, -21103, 84297, 37058, 112127, 111074, 70548, -116933, 30704, -129646, -36923, 34980, -100625, -63407, 55535, -8531, -57910, 117889, -32418, -20613, 110301, -123271, -15373, 130319, -124413, -41593, 48459, -89401, 50387, -41874, -82722, -24696, 83124, 81170, -33331, 25941, -81536, 21507, 118827, -127053, 18417, 6676, 3869, -17030, 74549, 48622, 39440, -75, 2278, -15437, -58265, -104781, 129969, 33641, 5521, 36027, 19957, -112852, -73912, -27471, -12942, 120304, -43571, -23947, -117404, -57758, 7867, 33996, 5211, 38646, 40885, -127637, -12755, 89164, 21749, 23561, 106192, 63237, 20883, -32984, 94587, -11385, -82321, 18889, 14468, -102725, -33456, 46943, -116258, 97263, -5889, -5908, 102468, -27837, -9916, 62479, -62461, 92440, -41283, 129764, 130004, 59577, -21020, -92822, -128624, 54422, 122569, 14682, -39429, 37637, 43573, -105622, 103333, 106770, 38732, 51654, 25062, 22930, 94484, 121148, 66986, 114888, 31682, 72143, -3346, 106332, -5907, -47876, -62296, -3080, -33113, -44041, 63993, 49168, 38737, 10593, 93463, 22336, 57525, -79224, 73478, -58193, -59763, 109958, -94159, 71875, -121353, 113454, -101429, 17662, -107673, -128740, -116689, -22839, 92960, 63015, -74644, 110515, 86426, -53014, 64612, 17918, -101708, 126894, -105958, -72566, -97280, -97092, -88434, -88136, -58738, 117304, 120189, 68661, 2922, 93072, -127476, -114279, -124644, -38301, 30522, 46259, -78257, -76203, 100272, -99075, 48994, -46207], +[65906, -23452, 97072, 90565, -109303, 10812, -60348, 79474, -113709, -22277, -54355, -106394, -14884, 113845, 11651, 20755, 93144, -10467, -71452, 16222, -117984, -117462, -129594, 120014, -29694, -12463, 9384, 36180, 113639, -116102, -13627, 96407, 82965, 125892, -50621, -33074, -28860, -89709, 70662, 101177, 93240, -41676, -88018, -26388, -21048, -30756, 39529, -112952, -87621, -40597, 96216, 85594, 40581, 60992, 31870, -36952, -6344, -91870, -37385, 118216, 34011, -610, 83277, 31295, -45527, 36680, -69161, -32895, 122565, -24081, 21517, -93408, -64084, 98551, -27427, 34618, 38327, 100738, -21196, 38661, -110813, -60388, 90040, -13136, 79955, -71914, 50274, -73036, -122431, -111191, 97773, -53735, 40000, -32359, 20671, -8880, 96055, 3990, -13525, 126823, 117983, 117977, 86350, -96799, -53538, -18335, 45232, 118712, -81792, -119885, 127607, -111024, 59137, 100768, -123674, 118776, 120736, -45822, 22190, -52218, -95923, -85344, -4214, -123675, -59879, 45232, -33082, -107377, 26507, -48656, -114224, -76534, 116414, 50359, 80625, 91904, -22365, 87761, 94195, -62645, 92330, -50964, -39941, 8188, -118233, -93309, 122724, -8821, 20268, 20704, -95375, -28224, -88492, 16729, 46504, -118640, -125225, -68843, 106027, 30794, 97693, -22526, 67985, -6135, -20289, -104935, -48710, 53460, -101857, -16160, -53016, 62382, -70843, 89239, -111243, -91998, -27635, 58807, -18486, -108294, -14726, -49249, 94675, 95042, 124761, 108224, -103556, -89496, -83132, 51768, 63995, -107009, -101499, -72700, -117208, 118553, -114347, 41629, 12130, -60330, -78634, -30012, -36942, 128427, -127299, -95292, -2698, -23625, 97098, -13816, 150, -103914, -21139, 126524, 107303, 111485, -25461, -32000, 9356, -116383, -66691, -127507, 1921, 113462, -60617, -103759, -100247, 103205, -66997, 47803, -119068, 18776, 109033, 12218, -3590, 108343, 19374, -48743, 81402, -43906, 72953, -77627, -23917, 77358, -4482, 49684, -1993, -81455, 117638, 110370, -68138, -110814, 7900, 63796, 86350, 72295]] +NTT(y): [[4952836, 4758985, 4880291, 6215354, 7502055, 3359535, 2100082, 3751831, 6321015, 3500034, 6093736, 283428, 5114270, 2411694, 7905101, 3328331, 384489, 7771348, 7440665, 3826594, 3558279, 2012264, 1060375, 7532245, 4026935, 8335495, 3475989, 1271330, 2820397, 1079968, 4363706, 4924470, 5169959, 4765924, 2624748, 3739441, 2799010, 8278423, 3626210, 1894585, 4721756, 3413145, 5100704, 557563, 6930831, 4873779, 5765257, 2652106, 3558047, 2511702, 545068, 6391573, 7902520, 907582, 452365, 5838117, 1967221, 4366540, 6722876, 3964261, 4807854, 2040708, 2096986, 3760989, 7066200, 1743616, 6876666, 8143113, 4620929, 3174216, 1023483, 6179448, 6857507, 8036015, 241664, 8199268, 2116273, 8123757, 2039888, 7744353, 4227623, 5290763, 7510214, 1828122, 4175591, 2664662, 6120220, 4793455, 2115737, 758086, 8064372, 6442303, 2071763, 2792639, 4615795, 6223465, 3776615, 8286707, 2083958, 7259678, 1107122, 1342560, 5815825, 425736, 2753357, 2978427, 7466361, 7018813, 8056383, 4365093, 6262971, 1310584, 4653478, 7568133, 4784278, 1122282, 5967839, 6330915, 7472297, 7205878, 848360, 2670112, 2497737, 7849124, 5733767, 4677785, 3077701, 7476463, 5055688, 332827, 4406022, 8129692, 6922478, 4553144, 1132235, 2731648, 4250795, 2095408, 5911184, 1573771, 4049764, 2317346, 675512, 7763594, 5448966, 3496787, 7477472, 703127, 3552250, 2856446, 5091424, 3232487, 4294995, 4960895, 5485690, 1110034, 3025121, 4148853, 5394069, 6395429, 4343784, 527655, 3750336, 7128672, 3250730, 2260989, 3541647, 2426348, 5966983, 4558590, 7537411, 3539826, 7960721, 3693579, 5851144, 6523189, 3243237, 4692339, 3350561, 6333775, 7422663, 6735151, 3587669, 1957153, 6251861, 7717375, 290094, 2904894, 308952, 2947174, 4368670, 5783706, 7242988, 6141739, 1254743, 8090906, 6421959, 2357957, 580598, 2502770, 5411964, 3251752, 6614347, 6714865, 1451922, 5718026, 2479672, 388466, 1080782, 1561901, 3188758, 6416158, 2437968, 173426, 4753047, 4735723, 1663710, 3722901, 2060105, 1365734, 6828049, 7274125, 3261049, 4623858, 356782, 6851189, 1962658, 1452481, 425394, 4461238, 6987419, 1860442, 6217566, 4292840, 7904225, 8170255, 6562720, 2089033, 497219, 4611602, 1772992, 4456523, 3989498, 3637175, 3635620, 5278222, 1955618, 338315, 8377232, 5277553, 6004361, 2133264, 7769120, 563656, 3179762, 4120611], +[839695, 7867049, 3876023, 922579, 2503610, 5982783, 3325003, 1778322, 3845694, 6805159, 2763914, 335335, 1431194, 2032329, 4409590, 2682770, 5044719, 3629277, 5290959, 2990040, 7224181, 2234431, 7055956, 1303414, 630067, 6264661, 6468361, 3360586, 3267063, 3036501, 3534669, 7491813, 647527, 7819455, 5356515, 3088213, 6537100, 4993463, 4536996, 6540646, 7855374, 116548, 4175082, 6913228, 3932139, 5385021, 7294846, 3811509, 4936378, 7200615, 6558240, 3877189, 4746811, 4622950, 1123058, 2291340, 1631659, 5716370, 2457028, 3321727, 3756687, 3004426, 1628131, 1545479, 4126706, 6370966, 6399024, 6097717, 3684604, 3820185, 7172136, 1229742, 4110892, 1702534, 5538189, 2055363, 6923885, 728777, 7200705, 1695007, 1474917, 7344989, 527770, 685109, 2981957, 4423471, 7572169, 7210612, 7209549, 7587204, 3263244, 7915149, 1386126, 1780792, 6732197, 7458363, 6562166, 1826371, 7896216, 1279645, 6626695, 3469575, 4967433, 6206886, 4076050, 1403497, 958333, 8369950, 2250497, 4097720, 2616899, 7366985, 484173, 2157886, 4267398, 1202297, 6250823, 7115820, 2309248, 7681012, 1547534, 6028164, 4075723, 8159376, 1457825, 6830602, 2095548, 2831261, 3422024, 7439969, 1029533, 3998666, 4793280, 6783278, 4889004, 1716483, 5316507, 6025195, 6411242, 5915333, 2278728, 3143991, 421275, 4621405, 6082544, 8048537, 4279798, 7118714, 5838696, 6582187, 6247359, 4493448, 7325401, 7496280, 1894959, 6402959, 8281510, 6155379, 4937986, 6366360, 52798, 7868584, 8080913, 7850915, 7914785, 7904585, 8228602, 3187177, 8263716, 1234061, 4641758, 2622139, 5948559, 4993848, 4045115, 117150, 1890444, 1694952, 2594030, 1061237, 7337737, 347006, 1437503, 5301545, 6782001, 7538791, 7169568, 1095559, 7405808, 6776601, 4246760, 173558, 4624590, 7183427, 1876481, 3695073, 1651111, 7671467, 2452202, 2157225, 1782401, 3363787, 5054300, 201555, 5234375, 3433779, 2883279, 3238510, 5530951, 4965642, 7866708, 1315181, 909086, 7246417, 403840, 5403978, 1238034, 655271, 7948507, 7463222, 6520934, 6496508, 484593, 5644460, 5416074, 740362, 1335185, 3773694, 6657633, 3503547, 5157033, 3280377, 4714836, 4696526, 167422, 7196424, 6316585, 198975, 4258632, 1024650, 6049740, 3935164, 2250816, 2889300, 8332581, 6895970, 6264532, 6638210, 6793233, 3326281, 1877631, 6858083, 2350289, 3702560, 4346826, 5976867], +[8031885, 6166237, 4608356, 3476158, 4753718, 1135219, 734875, 805332, 8075847, 6586331, 3455563, 1804858, 6011497, 2311424, 8027603, 2428354, 3946427, 1945150, 5528804, 6663870, 5429612, 4740547, 1284857, 1877833, 7277337, 3716130, 1317179, 6850960, 7396384, 6731738, 1360345, 4753344, 8195424, 1192434, 7467949, 6494997, 3006304, 5752025, 7371870, 8077358, 83102, 5190838, 516889, 6008650, 8154948, 1159001, 4570243, 4776954, 457568, 2437622, 2015152, 262002, 3280955, 8119588, 6028113, 6571056, 6476612, 647056, 3893345, 1083139, 3031594, 3818232, 7512602, 1950594, 1729079, 8240750, 8360014, 4750747, 7459229, 7358514, 5500759, 6624639, 83631, 5284887, 4357472, 4870416, 76170, 1879442, 5739246, 127928, 4089742, 2390110, 1825420, 867953, 4112618, 667396, 503999, 8010357, 5432922, 1282819, 5820751, 7972708, 1957088, 7505920, 1397402, 6404610, 343603, 973404, 8068202, 582253, 2652862, 8246025, 3747227, 5531177, 4620135, 2527193, 2146298, 439230, 4546251, 3237954, 5909117, 7998754, 7697045, 4699800, 477259, 5908682, 5149015, 1719216, 3135625, 1125063, 1309764, 5974984, 860432, 7039862, 1915892, 5980484, 1921431, 4871735, 8362282, 1085384, 774768, 6296499, 627610, 1398100, 956818, 4704993, 592416, 4609203, 4237512, 3418754, 5572214, 4997475, 6070648, 3362627, 2061469, 2308202, 2439081, 7391325, 8192696, 8344767, 329692, 7357639, 7698380, 2284855, 6245727, 7621433, 7509627, 2716665, 7334200, 6478407, 1199555, 6321656, 192318, 1764734, 562576, 7572876, 375342, 4878479, 2568311, 1592007, 1397856, 6471821, 6893285, 4089122, 8064236, 2287902, 4748577, 118671, 3446719, 3328072, 6393190, 965533, 5975854, 6160564, 1523202, 1491564, 7904579, 5545537, 3181509, 8147880, 7020487, 130885, 909161, 1743899, 2566756, 4807318, 3311421, 3045763, 6669473, 3826586, 8302417, 3480454, 2716903, 3782684, 1646547, 2231413, 4440602, 5211872, 3968887, 7244111, 2777899, 2164929, 2571569, 7979116, 3501807, 4846957, 8214223, 425567, 3843056, 7497219, 2513606, 7686409, 6768940, 7390327, 2162652, 5242529, 1129108, 3291060, 6264645, 7105454, 1905940, 4247225, 3341444, 7792791, 4319758, 3403465, 6096396, 8293241, 6882923, 2700360, 5724543, 1588401, 2313458, 4135277, 917315, 1819548, 969019, 4858375, 1515308, 1099178, 436000, 846369, 758745, 4396205, 7940289, 4772113], +[6730386, 780226, 683581, 7188491, 2915393, 4800626, 1763926, 3610822, 7307737, 6814873, 5045310, 6324143, 6150199, 4904627, 2010115, 5148474, 2648585, 2395318, 7067012, 201257, 4436815, 251101, 1387994, 6085721, 2294319, 5997015, 7749864, 3636740, 2857492, 5796364, 6577028, 275761, 4900332, 5345009, 6254093, 1469944, 1584681, 71389, 7489872, 5269968, 3201287, 7605560, 8077197, 5062024, 50666, 100439, 1020878, 6712034, 4240159, 1520641, 4049, 862850, 2099357, 813954, 3615471, 14779, 6491150, 4584489, 7781500, 2465192, 2529253, 780153, 732715, 8083887, 4659650, 1672666, 8302551, 3505745, 8192349, 2670825, 3122753, 1714534, 8237058, 2667977, 874597, 7310010, 839424, 3092419, 5891979, 2914202, 2129932, 3368071, 1401327, 7837635, 6301483, 1389177, 3586605, 5785863, 7316376, 308764, 6649115, 8249731, 41934, 7640121, 2947011, 4204431, 4308205, 892991, 8173913, 350678, 2771795, 6029159, 7941030, 1208928, 4635209, 606261, 782907, 2385264, 1957103, 5007317, 4652008, 453275, 3625797, 5384989, 4977147, 1657802, 5980006, 1311057, 7006512, 5656673, 1389217, 3537483, 7077424, 538579, 2914184, 2164093, 1238647, 7344341, 1910445, 3315244, 4680306, 2195202, 6452652, 5434217, 8177754, 2409850, 442776, 2577860, 6563956, 5656955, 1859557, 5082769, 3410489, 7041370, 3647164, 4864139, 2721008, 4482142, 1726764, 5945138, 5483190, 6303610, 3510026, 7133760, 5983970, 3242689, 7423420, 2668553, 3785521, 1670720, 5231230, 7195900, 3338376, 5444058, 3543692, 4377174, 4112413, 3419530, 1222008, 3709602, 1767047, 5779650, 7705468, 1431984, 2362733, 2284688, 4723265, 1131429, 3826304, 5378024, 4364846, 8027451, 2304353, 4688839, 3744749, 5562633, 3269286, 8130160, 6258074, 7158387, 1587311, 141414, 3065179, 6386113, 845859, 876991, 5097576, 3749194, 6643011, 2637172, 2978400, 7115291, 1444159, 4027562, 410081, 2422211, 2276037, 2823179, 3593237, 2556049, 1899411, 2819316, 4915160, 687208, 2440626, 8324387, 7220542, 2012079, 4153788, 7536563, 5758195, 1254376, 7763564, 1225011, 2750564, 4437945, 6179335, 5241762, 1047797, 5818903, 1936751, 6216630, 3661633, 6197642, 3551532, 921744, 5366452, 5971446, 593391, 2182359, 6352401, 2795295, 272162, 2775597, 619762, 6599369, 3242167, 5909938, 2984154, 816330, 5458418, 2104496, 3162019, 59786, 7418875, 5292653]] +aHat * NTT(y): [[6533041, 4978568, 3370532, 6220292, 3901369, 6214572, 6998023, 716133, 6077287, 3371588, 1641879, 3983513, 3955445, 986729, 6954844, 7808485, 7615992, 4784384, 2273506, 5251509, 1650658, 2689858, 7923026, 6986888, 539118, 5074688, 3073707, 1735510, 3510830, 1438052, 3826115, 966673, 6964892, 111884, 3213582, 3893747, 2527836, 3551616, 7673060, 1003320, 8234706, 4233522, 332909, 2565736, 7983619, 8267085, 5619020, 884872, 5837840, 507974, 4325726, 150971, 654692, 6563968, 6251928, 8234231, 4748927, 3323408, 2142394, 1586430, 3130892, 6631469, 1859370, 7796618, 237977, 443393, 2544291, 888629, 7309188, 6366079, 4932192, 6709741, 5112339, 5976309, 360744, 3395692, 8128798, 2942396, 1283671, 5350247, 4686769, 2885742, 251649, 7979569, 5047314, 5108623, 3840666, 8071260, 7010538, 3035792, 6936554, 7240073, 1612734, 5576337, 805551, 4008321, 8038060, 93604, 1453154, 4673060, 1516622, 1054031, 7381111, 3435904, 4220341, 1896686, 735951, 4793369, 2992738, 4778101, 4073536, 5058825, 3282291, 7912741, 7833204, 6439701, 104308, 1762208, 7998391, 202249, 1975504, 6324511, 5992913, 2437577, 7526985, 5016077, 7878786, 5363826, 4552235, 4256743, 2190020, 5788940, 3017025, 7415010, 8032817, 2659571, 2870194, 7550703, 1012315, 4181781, 4636527, 1916780, 4563021, 3587252, 1896096, 2245647, 8157996, 2362183, 5706924, 2926869, 1877585, 5995487, 8289226, 8263843, 448340, 3130955, 7851088, 6175721, 1467954, 3017018, 7990704, 2753527, 490463, 2827201, 3333923, 6431425, 7167706, 7327028, 6199863, 698983, 5231059, 8002549, 5705935, 1774098, 2722494, 7728766, 7628580, 6086759, 5320544, 6573614, 4662815, 1998081, 1797426, 5137509, 4444260, 871225, 1629143, 6334782, 2681479, 7046293, 1463326, 4576918, 65603, 859158, 3145799, 8362192, 2951433, 3016486, 6616137, 3138220, 2620797, 6281896, 4238003, 4098585, 2369621, 8174965, 1902641, 1700464, 6419015, 4674669, 2181507, 491553, 4239209, 1145563, 4723270, 7774326, 7969732, 1614053, 5659464, 8172280, 6885516, 3244039, 2887656, 8326545, 3807638, 7999758, 4758900, 8216958, 2247160, 7397121, 6447949, 2827955, 4315566, 1258054, 6415657, 1723761, 2204062, 5017345, 6113323, 940113, 6059584, 6765072, 2655110, 242943, 2739807, 6769400, 4867737, 7905510, 7167983, 1433446, 3958473, 7460339, 6248184, 1648762, 4815250, 7661469], +[5997947, 1515225, 4316827, 7998978, 6878297, 2033169, 1118401, 799329, 3581586, 2700736, 1916404, 353780, 2589643, 2689272, 8316178, 7990969, 3515067, 7681249, 2239858, 7340218, 4815326, 5210440, 3007449, 3970808, 7770864, 3080751, 823925, 1750964, 3313110, 8021041, 4595997, 4564024, 2735356, 3993565, 5620570, 6514062, 4285326, 7610177, 1924336, 1701602, 4197192, 2074836, 3966348, 5770209, 34550, 639900, 7000511, 2907050, 8371624, 6917289, 5164827, 1752995, 7568956, 7430518, 7938167, 1238921, 1132712, 7990362, 8080384, 3232477, 7250037, 2461144, 5558690, 955943, 1081804, 3951480, 4718168, 7906118, 8206144, 5950656, 1056402, 4206314, 7872406, 470787, 3374422, 5668139, 7457583, 6123905, 845040, 7244628, 5967207, 3678274, 5026659, 4158636, 186940, 26847, 5081811, 1679161, 1524858, 5159942, 995987, 5799698, 1427642, 6209266, 5259501, 4452578, 1406637, 3450498, 785633, 7088968, 4804329, 7401936, 296325, 695062, 1265672, 7659218, 65723, 5709213, 3085512, 2365205, 7906275, 4347379, 5144491, 4840460, 5199763, 6705552, 2584648, 3672828, 7779005, 5447869, 2114769, 724552, 5848133, 6471327, 1715765, 3540192, 3204057, 6713779, 7885466, 4896144, 2925892, 3116577, 5570919, 4708773, 476331, 1826519, 7254410, 7084002, 3029855, 636994, 2048768, 2058908, 575515, 3818957, 3928357, 5414612, 610676, 3262262, 4131644, 2674051, 6054718, 2094251, 2964272, 7183574, 3893914, 3894991, 6474238, 4897982, 2297344, 8065480, 548199, 6221116, 6045456, 6729663, 117524, 7912726, 67182, 2709431, 5108122, 4565463, 1509894, 6830438, 841070, 937932, 4374317, 7079414, 7647498, 7507689, 1786520, 5533149, 4944611, 117844, 5959493, 4685906, 2653944, 5889876, 7054884, 74492, 6863076, 4829711, 1393017, 1808638, 1723044, 7539161, 6672272, 7621987, 6367885, 4987070, 1410344, 4067048, 5641007, 2507830, 4352403, 3944536, 3895246, 71638, 3080825, 6917472, 4833779, 861545, 3246835, 1582210, 7884942, 6489140, 7160292, 6941374, 5648570, 2707145, 5795504, 3404822, 1339737, 6107571, 6322978, 1340323, 1474437, 6645698, 2916533, 6805724, 2379277, 3062784, 3127748, 2616749, 2813634, 6314822, 8306245, 795843, 7324700, 5763497, 6301867, 1102199, 3154780, 3446743, 1120414, 5416612, 5943094, 6154020, 3613443, 3027822, 2624536, 2175560, 8137076, 1972249, 7181160, 4676384, 848497, 2072540], +[3617509, 1744543, 6429518, 5013462, 4049370, 6049662, 3223344, 6512319, 1960294, 2949491, 2624002, 3293926, 5534886, 3963970, 1618976, 5980423, 7970662, 3850580, 2315007, 3655678, 5123054, 2675918, 851659, 6668653, 6215848, 2728889, 481431, 3814810, 2359857, 7256020, 4970857, 3662691, 717487, 8243713, 601654, 2221267, 7546744, 5362799, 2948092, 1785061, 793984, 3373613, 1942921, 1339477, 3995712, 2574425, 6453580, 3028165, 6733287, 1712346, 3683495, 8258116, 6556403, 3047564, 703896, 3733726, 5019127, 6440936, 3854897, 717452, 6612034, 5159229, 2317009, 7418531, 7043722, 5296376, 1716591, 1366681, 7837744, 7027295, 1119571, 5364443, 2227752, 7377368, 8219643, 3302394, 4559446, 4347118, 5207121, 6033589, 3601493, 4044182, 3566321, 2878746, 2795584, 3862808, 7468422, 6662527, 168638, 6140206, 2866359, 5545890, 4722524, 4835586, 7348289, 8187676, 2172239, 5623094, 3698, 912089, 2796065, 2904162, 7389849, 4614595, 6250389, 2643671, 2427528, 5762748, 501448, 6150838, 4346574, 6666637, 7837385, 4589684, 1280560, 2975825, 4700203, 4110306, 4652121, 1229617, 7950204, 3299922, 2172101, 5110425, 7277322, 3529596, 6572812, 6703930, 4745614, 3876953, 531025, 5392764, 6452704, 1251769, 5768138, 518846, 3280792, 6576540, 5298599, 1574062, 4488975, 5236707, 6746187, 5392132, 1099925, 8005034, 4243387, 1885308, 3500307, 2718258, 7829418, 3860909, 2605961, 2874577, 917822, 5941469, 7536353, 4050247, 475758, 362498, 4136480, 3187160, 4934280, 8277653, 2765703, 4704117, 5386494, 3289580, 2732057, 3589983, 4647685, 1248959, 3504729, 5368827, 6468103, 3224728, 23724, 8139348, 2196077, 3014817, 6444477, 3172156, 7165588, 5473715, 831227, 556567, 2691642, 8209694, 2962474, 1082680, 6062054, 2656769, 8337293, 4838176, 5070631, 4498830, 4278272, 481009, 2961420, 1998678, 7210269, 1167563, 579271, 7821192, 1678175, 6127707, 5810055, 1814677, 169516, 6209804, 2607202, 2837644, 7692468, 6263949, 6590959, 2981974, 4358539, 2516657, 8047161, 7537265, 8096042, 6421227, 7971913, 4415092, 7346681, 6603430, 4130516, 81986, 2047131, 5930216, 4146769, 79330, 8159559, 5217431, 7670846, 158816, 3421109, 3025356, 2561693, 3835154, 6794382, 8224428, 7933056, 2027043, 3930869, 7527392, 7870119, 250227, 5216501, 3377538, 7451131, 3509093, 1864055, 926141, 2393693, 7221180], +[2736242, 1084111, 4997493, 6756170, 2756099, 2198779, 6811484, 8881, 1932126, 339333, 6842975, 3191711, 4641640, 6603589, 5994019, 2990644, 2825937, 3818297, 5574037, 3499781, 70605, 5169803, 7020232, 2637640, 8214696, 2480401, 457198, 8248975, 1143833, 2067843, 4244693, 3505871, 3438373, 6480402, 395411, 4754012, 7419863, 1995519, 2959797, 4174731, 7530785, 8214544, 3744636, 3269562, 1128985, 4275090, 4314988, 2011182, 6713200, 2748011, 5482600, 4547970, 312153, 5490519, 5232676, 1994287, 738455, 1549503, 5319790, 4876027, 6562727, 6593877, 3179311, 233391, 6148351, 6547336, 3297768, 5161188, 2859137, 8278004, 6559937, 4388055, 7608265, 2715925, 1883709, 1087711, 4989029, 215468, 7927437, 4071021, 1485402, 6117668, 861043, 6902985, 822840, 1757803, 6325885, 4881632, 8119243, 8361943, 1651287, 8022245, 685594, 6513409, 5243195, 6772497, 4795201, 1922133, 5395737, 6462710, 4807543, 2857744, 6329398, 7220915, 642665, 3554931, 3482343, 6349378, 2518633, 1884732, 1967909, 6657859, 5199749, 326816, 7928814, 4491839, 328846, 1635904, 3298336, 6067348, 1802088, 3691528, 7479392, 7111413, 3484280, 7607027, 7591951, 3455732, 727199, 5614847, 2567837, 4536582, 5430746, 5119460, 1472267, 1790589, 3208129, 5538387, 1615321, 8189125, 5235068, 1700688, 3461910, 855543, 5826332, 2503847, 1041239, 4066912, 8058283, 728216, 6811300, 1415703, 2425816, 2717949, 893420, 8364841, 6171865, 1004444, 2700755, 4807224, 5027894, 7025361, 1769791, 971385, 7922513, 7355489, 7130822, 3409395, 7557483, 5994738, 4401296, 8020074, 7086426, 3435750, 3003106, 4718048, 4273773, 7465540, 1006263, 4031456, 5817888, 6258636, 7410159, 4892332, 1127594, 7934906, 7691305, 7972729, 1610540, 4405371, 2753329, 6330892, 2371164, 3717015, 5578021, 6775955, 168965, 6102074, 984731, 5109024, 7506252, 2924601, 604747, 7863375, 4675744, 4536907, 7322760, 3613984, 2346417, 5416129, 2288322, 1599774, 530946, 3707368, 7285673, 3532114, 6053470, 1314873, 544698, 3344238, 8245115, 8187403, 1849353, 3161496, 792525, 6566350, 3985157, 303694, 6864284, 5406918, 7019725, 3041689, 1810915, 1477047, 975616, 6608494, 4834862, 7156978, 1959300, 8202179, 2031509, 5412877, 7018347, 827428, 1943304, 3174221, 1942727, 7077316, 105653, 6975485, 4782676, 1140243, 4881573, 7653966, 6326425, 7882916]] +w = NTTInverse(aHat * NTT(y)): [[3162481, 1697673, 4795824, 611569, 5434330, 1733082, 7251102, 4971247, 3910715, 2491782, 6324776, 81764, 2665637, 5536158, 273698, 1225182, 6230352, 7073809, 3597226, 7105208, 1714198, 8268058, 4370687, 4216584, 4389790, 930140, 434608, 7635755, 6653037, 4988225, 1234291, 778829, 7794607, 1618222, 1726968, 8330580, 8181288, 6394094, 273133, 7297185, 4150606, 3325362, 4174099, 2994253, 2846796, 884598, 1933530, 5047139, 4475193, 4730936, 8050743, 5261280, 8308984, 3839276, 5709353, 5743170, 4958291, 5166310, 6277131, 5757650, 2681421, 6960950, 2720794, 2111752, 7558120, 6242284, 5081355, 192063, 4958582, 4402889, 166667, 3428552, 5463493, 5364845, 2201207, 661550, 6637816, 5842826, 3744334, 2840855, 5316258, 8320816, 7934531, 596600, 1541260, 6202393, 203019, 4655597, 2866581, 7949499, 2482488, 6898190, 7232233, 983996, 7867320, 4350042, 3991883, 2151726, 6456207, 494293, 7168151, 5392469, 2838659, 582866, 369227, 4684167, 2925490, 292945, 8048522, 7535096, 6109971, 412070, 153460, 735813, 1787653, 6286676, 2215016, 6076533, 6034893, 4735293, 7938870, 6296716, 6598983, 890835, 1734070, 7033988, 4387759, 4020565, 7398045, 7761130, 4987117, 7903294, 4867071, 1835433, 1202809, 7827136, 3809059, 1867093, 1405503, 4748091, 192410, 2236245, 4469273, 6371849, 9000, 6450797, 637714, 2226263, 2194286, 245901, 4838381, 5383015, 7053864, 7212387, 469359, 1299197, 5481911, 1934165, 8204820, 1886399, 4482493, 7100018, 3790136, 8222512, 2735141, 1055554, 6696326, 4073299, 1855494, 5230127, 7539718, 3450311, 6043137, 2479912, 3379061, 5568654, 8350447, 7017046, 2960387, 1368758, 5033258, 4274834, 4722768, 514652, 2138907, 3335856, 6460563, 5711458, 5130436, 4041780, 6374381, 8118926, 6620680, 4794823, 3732926, 1541850, 6321160, 5960349, 2389128, 304966, 7685913, 5390282, 6614147, 3567881, 2359284, 4042383, 6742777, 7097351, 3331485, 4160548, 2296016, 871313, 764148, 7649489, 6620606, 1911616, 2168461, 686787, 4506565, 1166064, 4429880, 1273926, 1902954, 1986103, 1501688, 4079071, 293800, 6639059, 4142270, 5394062, 157287, 8158977, 6678748, 6410626, 7246992, 6005168, 3389693, 6609025, 7019943, 4503360, 1791885, 3431554, 1815826, 6083919, 1795930, 6629347, 4766500, 7849685, 5763989, 7396105, 2537326, 6773887, 806389, 7377076, 8295050, 523136], +[3153997, 4031653, 7038865, 7254512, 4452631, 3125965, 7383348, 386324, 5578751, 2810907, 6458952, 5201403, 4442585, 2650791, 6851838, 3656515, 2973259, 4153908, 3688927, 4691852, 4773510, 7852874, 6814033, 1149661, 7737247, 5417444, 3941860, 6902492, 5867201, 655142, 2297998, 2668573, 2554486, 2790748, 1813434, 2501316, 2007964, 2079832, 4135629, 2009677, 7599120, 6601328, 4497571, 4078206, 2145832, 7267927, 5618661, 2567328, 3398577, 3537722, 5304652, 1212097, 5813863, 4899397, 7942572, 3406070, 3957094, 5087295, 1827172, 5424807, 8172909, 6773862, 5318285, 5122072, 4801368, 3864005, 1666953, 3485774, 1306173, 3830450, 2354203, 5941708, 6852671, 4530605, 2569131, 2066322, 3700906, 7465179, 1351579, 4222549, 7360666, 4074141, 6811611, 3170457, 2812850, 4697757, 3407930, 439231, 7024648, 8049021, 1650435, 5851821, 1625169, 7074702, 8346385, 7102435, 7196343, 7983186, 553051, 7586606, 5297068, 6769353, 4784380, 5551123, 6064428, 6614331, 4537264, 814915, 5703812, 6749827, 3630454, 4946534, 1393641, 6723099, 3948272, 4457464, 7460994, 7939093, 2598812, 3214560, 2873441, 6757692, 6245347, 7680847, 1800565, 4916421, 6683406, 3692984, 6509441, 6558159, 4393804, 2735324, 656082, 3937778, 603603, 3596881, 4390372, 6352581, 1498026, 5898459, 7858050, 7545835, 7475425, 4903585, 6274035, 5783069, 128349, 2835300, 1546513, 6486974, 4725916, 1071631, 194596, 3712301, 7511426, 2788651, 7163357, 6081381, 5006107, 4140670, 6646324, 5361365, 8191218, 1978101, 3640585, 6766953, 7038694, 5476564, 6540134, 6759076, 6699923, 4962697, 2737528, 5595255, 652948, 2481541, 481017, 1798472, 541300, 2988939, 5620735, 3229075, 6692667, 2560429, 5609134, 5894448, 723654, 1920541, 2923100, 7723984, 610588, 8060276, 6954068, 4648608, 7656760, 3797691, 2458947, 776717, 3304111, 793135, 1213650, 3757370, 4587863, 1211598, 7519996, 260469, 6989509, 3581775, 5635603, 6401717, 1666984, 7310025, 3749345, 7065536, 272473, 1597130, 1565574, 5605123, 2024013, 2664993, 3977152, 3855560, 2948923, 6223197, 4444481, 1429422, 7818183, 5090356, 5014173, 6314566, 7102944, 5922485, 2251416, 4182924, 3268953, 7820354, 4624676, 7209753, 3025021, 4319597, 7580523, 1373988, 5455804, 3955557, 5100970, 1658122, 7849222, 1107830, 3929049, 1090857, 2382084, 1095599, 6329630, 7872638, 6414400, 2232569], +[2963436, 2979903, 3088068, 7043746, 858518, 4524786, 5048396, 4086214, 230804, 7183444, 170630, 3434048, 6601706, 1795329, 55983, 1255877, 5574913, 1999547, 1665830, 4345344, 1010305, 3450932, 4962191, 733985, 3284891, 6592992, 7235943, 985371, 864727, 868805, 4048414, 2813565, 6931467, 217331, 6684304, 4872820, 7300873, 6751150, 3612192, 5250822, 1219400, 4572513, 3017958, 7918548, 3574210, 5254816, 4308171, 2014335, 5548434, 2318191, 1753661, 1957667, 1362582, 160813, 997530, 4951280, 2054281, 6996670, 50185, 686570, 5189538, 5249109, 2505227, 6592106, 2891005, 3172465, 5642, 3403698, 6068547, 4798359, 6581691, 7126364, 5805992, 267785, 3249177, 5496441, 830371, 4842286, 2552877, 6855143, 7537784, 7889500, 4248149, 6841177, 7453694, 46965, 273431, 5196506, 228261, 2349364, 2220978, 6713385, 5470458, 4235833, 7819322, 2879488, 5365463, 4841326, 3403823, 3116431, 1789415, 7240642, 6463952, 2733250, 288192, 2956035, 2126700, 843084, 7160787, 5664888, 4150383, 7861800, 6026947, 3924449, 4058679, 4369170, 5871303, 1549545, 5547814, 4211418, 7541979, 2260456, 715217, 4658117, 2936856, 1606960, 963154, 4764716, 8057289, 1870055, 1875130, 5556883, 250151, 1442676, 2555607, 4685091, 2455952, 313259, 4244514, 3579582, 5073648, 7181649, 957188, 4078761, 3353303, 4781681, 2343266, 8346273, 516210, 2188682, 31163, 2999630, 5695869, 4592789, 270320, 864111, 3362371, 4354169, 6838693, 7763460, 6292976, 6444330, 6837140, 6734347, 1824392, 6424347, 5871839, 3967047, 4811849, 7203411, 6252062, 3021003, 295745, 5465888, 6462849, 4241317, 6571093, 5357391, 3470778, 1209148, 2700068, 5072185, 3992351, 5790131, 4279430, 1045168, 2683510, 7808388, 6937135, 2255934, 5572784, 5510642, 7155299, 1720444, 991691, 8025973, 1776995, 6636620, 234148, 7377310, 4269337, 7475262, 3471634, 4054346, 5339163, 2729100, 6967731, 12988, 6453319, 5722679, 4451074, 6641419, 8083483, 1168562, 4703592, 7745457, 2762398, 3679652, 4737698, 2243756, 3635730, 7749367, 1233127, 2430869, 777900, 8235053, 3142685, 6701803, 2909804, 3969820, 7466783, 3879914, 7129233, 2252841, 1772856, 2433688, 1385158, 4135693, 7493734, 3155134, 6902337, 7993462, 992731, 7388141, 7741518, 3897347, 1713145, 912824, 5833041, 4947070, 6043831, 4714895, 5637804, 3376120, 1972094, 6295298], +[564117, 2182653, 597265, 4126023, 7419452, 6841768, 5621151, 6584236, 1222045, 7948157, 1529042, 1406178, 61895, 1219153, 8095372, 3009116, 2719092, 7653102, 5025797, 6708738, 2496294, 2536696, 1803752, 3614852, 1763041, 6575385, 245002, 4021524, 928127, 3334913, 1641629, 599069, 138828, 4122487, 6255406, 4337906, 194142, 7091076, 4605722, 2296246, 7019235, 8146285, 4420512, 5670937, 2751071, 1085496, 5238345, 4474171, 4102490, 7946402, 860952, 6473783, 3881633, 2454540, 4183932, 8170357, 6172640, 3825425, 1963523, 342234, 179139, 5333874, 6327986, 7438331, 499089, 3539706, 4109204, 2557944, 2464045, 6154431, 4569934, 6177270, 4228500, 6480553, 7610018, 1086139, 4004129, 3777213, 4081863, 2342444, 2562664, 6145977, 5486758, 4608318, 7492624, 7734771, 2067002, 4985989, 7535362, 7646898, 2410385, 6860194, 2764850, 7552233, 902766, 232547, 7054234, 6437846, 5005449, 748563, 5318023, 1533330, 7967926, 5664103, 218361, 6191563, 8145259, 3870396, 2032739, 4332666, 7093594, 465056, 4659524, 4956470, 5122082, 5096617, 4823880, 1527384, 2454247, 5224144, 5217035, 7025589, 7741687, 4664510, 1265760, 743016, 68202, 7324610, 3284588, 4778742, 659942, 3220432, 5065790, 7544252, 504434, 3739831, 4886617, 410155, 354020, 4062136, 1471261, 2046530, 3048508, 2165892, 3666984, 6373277, 1089626, 2527809, 7128059, 923179, 7168452, 599150, 3403495, 1197486, 3503915, 6078943, 4448956, 5232530, 7359573, 3881643, 5152836, 3583441, 2682710, 5543775, 8355621, 8106138, 5449988, 2012580, 1070099, 5130775, 6903194, 7263829, 466339, 5292695, 7358722, 2185122, 3517624, 1489106, 4913853, 327537, 2829981, 7493266, 594293, 7469633, 4337828, 2298362, 6169957, 7129888, 753113, 3479672, 3588978, 1882706, 2001372, 513211, 6268032, 7715072, 2434641, 3516290, 2362936, 5448571, 7382685, 3458298, 8110154, 5180750, 4669744, 6210250, 3581748, 1547409, 7424554, 4485990, 3331978, 187238, 6061964, 3991332, 7195061, 2232864, 1670717, 7536081, 7342468, 6149621, 2808863, 2666936, 6781201, 1575054, 5427499, 2631577, 6423734, 6851997, 4531228, 2829130, 3192171, 4142677, 1114463, 4330958, 7435601, 5104190, 3818715, 6705984, 7794589, 4174938, 6996997, 462232, 2006658, 7989477, 977045, 7407323, 3765873, 6844914, 4626857, 1886400, 6156078, 5645030, 77571, 687104, 5994677, 7191420]] + +w1: [[17, 9, 25, 3, 29, 9, 38, 26, 21, 13, 33, 0, 14, 29, 1, 6, 33, 37, 19, 37, 9, 43, 23, 22, 23, 5, 2, 40, 35, 26, 6, 4, 41, 8, 9, 0, 43, 34, 1, 38, 22, 17, 22, 16, 15, 5, 10, 26, 23, 25, 42, 28, 0, 20, 30, 30, 26, 27, 33, 30, 14, 37, 14, 11, 40, 33, 27, 1, 26, 23, 1, 18, 29, 28, 12, 3, 35, 31, 20, 15, 28, 0, 42, 3, 8, 33, 1, 24, 15, 42, 13, 36, 38, 5, 41, 23, 21, 11, 34, 3, 38, 28, 15, 3, 2, 25, 15, 2, 42, 40, 32, 2, 1, 4, 9, 33, 12, 32, 32, 25, 42, 33, 35, 5, 9, 37, 23, 21, 39, 41, 26, 41, 26, 10, 6, 41, 20, 10, 7, 25, 1, 12, 23, 33, 0, 34, 3, 12, 12, 1, 25, 28, 37, 38, 2, 7, 29, 10, 43, 10, 24, 37, 20, 43, 14, 6, 35, 21, 10, 27, 40, 18, 32, 13, 18, 29, 0, 37, 16, 7, 26, 22, 25, 3, 11, 18, 34, 30, 27, 21, 33, 43, 35, 25, 20, 8, 33, 31, 13, 2, 40, 28, 35, 19, 12, 21, 35, 37, 17, 22, 12, 5, 4, 40, 35, 10, 11, 4, 24, 6, 23, 7, 10, 10, 8, 21, 2, 35, 22, 28, 1, 43, 35, 34, 38, 32, 18, 35, 37, 24, 9, 18, 10, 32, 9, 35, 25, 41, 30, 39, 13, 36, 4, 39, 0, 3], +[17, 21, 37, 38, 23, 16, 39, 2, 29, 15, 34, 27, 23, 14, 36, 19, 16, 22, 19, 25, 25, 41, 36, 6, 41, 28, 21, 36, 31, 3, 12, 14, 13, 15, 10, 13, 11, 11, 22, 11, 40, 35, 24, 21, 11, 38, 29, 13, 18, 19, 28, 6, 31, 26, 42, 18, 21, 27, 10, 28, 43, 36, 28, 27, 25, 20, 9, 18, 7, 20, 12, 31, 36, 24, 13, 11, 19, 39, 7, 22, 39, 21, 36, 17, 15, 25, 18, 2, 37, 42, 9, 31, 9, 37, 0, 37, 38, 42, 3, 40, 28, 36, 25, 29, 32, 35, 24, 4, 30, 35, 19, 26, 7, 35, 21, 23, 39, 42, 14, 17, 15, 35, 33, 40, 9, 26, 35, 19, 34, 34, 23, 14, 3, 21, 3, 19, 23, 33, 8, 31, 41, 40, 39, 26, 33, 30, 1, 15, 8, 34, 25, 6, 1, 19, 39, 15, 38, 32, 26, 22, 35, 28, 43, 10, 19, 36, 37, 29, 34, 35, 35, 26, 14, 29, 3, 13, 3, 9, 3, 16, 30, 17, 35, 13, 29, 31, 4, 10, 15, 41, 3, 42, 37, 24, 40, 20, 13, 4, 17, 4, 6, 20, 24, 6, 39, 1, 37, 19, 30, 34, 9, 38, 20, 37, 1, 8, 8, 29, 11, 14, 21, 20, 15, 33, 23, 8, 41, 27, 26, 33, 37, 31, 12, 22, 17, 41, 24, 38, 16, 23, 40, 7, 29, 21, 27, 9, 41, 6, 21, 6, 13, 6, 33, 41, 34, 12], +[16, 16, 16, 37, 5, 24, 27, 21, 1, 38, 1, 18, 35, 9, 0, 7, 29, 10, 9, 23, 5, 18, 26, 4, 17, 35, 38, 5, 5, 5, 21, 15, 36, 1, 35, 26, 38, 35, 19, 28, 6, 24, 16, 42, 19, 28, 23, 11, 29, 12, 9, 10, 7, 1, 5, 26, 11, 37, 0, 4, 27, 28, 13, 35, 15, 17, 0, 18, 32, 25, 35, 37, 30, 1, 17, 29, 4, 25, 13, 36, 40, 41, 22, 36, 39, 0, 1, 27, 1, 12, 12, 35, 29, 22, 41, 15, 28, 25, 18, 16, 9, 38, 34, 14, 2, 16, 11, 4, 38, 30, 22, 41, 32, 21, 21, 23, 31, 8, 29, 22, 40, 12, 4, 24, 15, 8, 5, 25, 42, 10, 10, 29, 1, 8, 13, 25, 13, 2, 22, 19, 27, 38, 5, 21, 18, 25, 12, 0, 3, 11, 0, 16, 30, 24, 1, 5, 18, 23, 36, 41, 33, 34, 36, 35, 10, 34, 31, 21, 25, 38, 33, 16, 2, 29, 34, 22, 35, 28, 18, 6, 14, 27, 21, 30, 22, 5, 14, 41, 36, 12, 29, 29, 38, 9, 5, 42, 9, 35, 1, 39, 22, 39, 18, 21, 28, 14, 37, 0, 34, 30, 23, 35, 42, 6, 25, 41, 15, 19, 25, 12, 19, 41, 6, 13, 4, 43, 17, 35, 15, 21, 39, 20, 37, 12, 9, 13, 7, 22, 39, 17, 36, 42, 5, 39, 41, 20, 9, 5, 31, 26, 32, 25, 30, 18, 10, 33], +[3, 11, 3, 22, 39, 36, 30, 35, 6, 42, 8, 7, 0, 6, 43, 16, 14, 40, 26, 35, 13, 13, 9, 19, 9, 35, 1, 21, 5, 18, 9, 3, 1, 22, 33, 23, 1, 37, 24, 12, 37, 43, 23, 30, 14, 6, 28, 23, 22, 42, 5, 34, 20, 13, 22, 43, 32, 20, 10, 2, 1, 28, 33, 39, 3, 19, 22, 13, 13, 32, 24, 32, 22, 34, 40, 6, 21, 20, 21, 12, 13, 32, 29, 24, 39, 41, 11, 26, 40, 40, 13, 36, 15, 40, 5, 1, 37, 34, 26, 4, 28, 8, 42, 30, 1, 33, 43, 20, 11, 23, 37, 2, 24, 26, 27, 27, 25, 8, 13, 27, 27, 37, 41, 24, 7, 4, 0, 38, 17, 25, 3, 17, 27, 40, 3, 20, 26, 2, 2, 21, 8, 11, 16, 11, 19, 33, 6, 13, 37, 5, 38, 3, 18, 6, 18, 32, 23, 27, 39, 20, 27, 19, 14, 29, 0, 43, 29, 11, 6, 27, 36, 38, 2, 28, 39, 11, 18, 8, 26, 2, 15, 39, 3, 39, 23, 12, 32, 37, 4, 18, 19, 10, 11, 3, 33, 41, 13, 18, 12, 29, 39, 18, 43, 27, 25, 33, 19, 8, 39, 24, 17, 1, 32, 21, 38, 12, 9, 40, 39, 32, 15, 14, 36, 8, 28, 14, 34, 36, 24, 15, 17, 22, 6, 23, 39, 27, 20, 35, 41, 22, 37, 2, 11, 42, 5, 39, 20, 36, 24, 10, 32, 30, 0, 4, 31, 38]] +w1Encode: 51920D5D626A5513024E1718613995C97A595721A0A36610299200AB18985664414FA16857A67200E579DA167A4EE92C68B805DA15481DC70CE3473D1CA00E4818608FDA9066915ED5220E26F70C42F6082A0A0A0191840C08666A381649795567AAA59A62A49472640173858038304C9071A5291C9DB22A5849AD8E3156CA864A60237540091D9A950D8B247A5B15AE634621E1D70828374E4C359691C514043A2A0B8119D7A12848258C1617ACA36882D2586289A480C998A5DED990C4090C51559A17740ADD236E97434E903565594A1A295791DFC038CDA334CB622DE888558BD935D2C4199FA64AD5A6702BC96D19954807C57C24D62CD379586745464F2609A59A7C490994A63AA01C9975E08811DE3869C7585DA7EA44CF18A289364EA2783943354C57887C297A6AA1173C889819C1743E26A85923B72A135976E2386A4E37344332405E3436DD47284F3AA82586520D111106851967504E9E989854192048B73815F58417926E5A587E8C15A598095DE8D1555B921A95D118612A3210049505B65581194863021C9D925C85A411D1681645513D64306AE638710606A913772D1D93284750684B09101BD78C4F04486036965E107544D690686A9127106C01C38C9D953E5C264189293A02B410A667A560555D1FD2592843600F5264AAA27401D2648D604D9B595452C600C302401E1614D245A6A1488E8AF85599194242275A232719CE567956E1A424D3756652A8C9189CD629559C5302A2778DAA91A5CF9431536A34C41A8D4F7552259334877546A45A9C2995149F06669EA484C3325827E98D868A1C80B1420EAA8D4D934CC9185485940C81155E418931E57A798EC15D965A885463AD20A50801179EC364350D888196881A1555310DD86167BA6828DA900F5A04A5A8111CA27A41B852CB550A98B66D19D26C5B99620701985136441B3A509A2054C8022D53683465610E922181D77652DBE474C0DA2DC6469A02772E12A209CF399C170396843429CB10A68DC474A7B46E593821271605606532097A828F43229C2392D81359C6756ED4985AA5B0A8C5499198027A00F199 + +cTilde: 6E7A396AD957637BEA3AB6D8BAF6CF363FF45829990B947C35890A827B9F8C76 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +cHat: [4727311, 2069090, 853580, 713432, 3478861, 307464, 1500763, 3557257, 2728112, 6077055, 3738440, 8166180, 2709211, 4558794, 5948939, 984609, 7211344, 1719758, 1618269, 7307419, 1876773, 2167854, 8231313, 6466789, 6090350, 4639663, 914085, 670846, 7523622, 7378803, 5743394, 2144071, 3959259, 6130390, 1102409, 5201091, 5633803, 979747, 1325945, 608332, 1243083, 6016569, 8257218, 5767370, 3405338, 7579247, 480096, 1375513, 6709870, 1102314, 2356812, 6088339, 1018992, 4613884, 3093941, 6696985, 8200798, 1775457, 1968303, 5402679, 4063213, 6344446, 7005693, 2081923, 8171425, 1653157, 2996776, 1558648, 1927609, 3598539, 1297386, 2766743, 2203928, 6897002, 7191175, 8197650, 7806547, 6065354, 8330501, 8227189, 3158195, 4281944, 1690525, 3958078, 4887514, 1065861, 7272490, 2565074, 5156202, 6212965, 1581303, 2573971, 6531454, 3961223, 5150430, 3435586, 3613789, 1144624, 2378516, 5329547, 3297445, 5385939, 4077045, 1447781, 778076, 1028377, 5078702, 483147, 3227452, 5802796, 7833656, 2038188, 6257550, 3642549, 6819631, 2106321, 3454881, 7284279, 6933948, 4220050, 1597360, 4123424, 3248773, 3468880, 4272748, 8333391, 772744, 6319291, 1940952, 6000138, 8228978, 4086383, 4350921, 4894968, 2784936, 8228557, 1162166, 978325, 3293304, 5114370, 1396565, 7279181, 6962951, 8116108, 3427283, 2827341, 2061549, 4896973, 1051322, 3666428, 4216129, 4884788, 4074818, 1750, 4842316, 5545246, 1371320, 5944769, 7700716, 2658429, 2415456, 2380864, 1338576, 2386729, 6220558, 4934825, 6202157, 593646, 1302835, 2693876, 4741615, 4786309, 2125987, 728483, 1841801, 4622608, 3971185, 5512259, 6083584, 543879, 7705704, 4882815, 3914829, 5722349, 3905097, 6806336, 8364992, 5303496, 1319409, 6241658, 3498363, 2710667, 5498157, 7369943, 3866553, 410328, 5132348, 599658, 600863, 7956203, 7309200, 4338613, 3571457, 2850753, 8098280, 1580094, 7691605, 1212062, 5118839, 6330076, 610952, 2752474, 2902029, 3856615, 4371629, 443166, 7646269, 2728263, 7760535, 5416579, 6032490, 5661190, 8361418, 2507692, 3293082, 7752685, 5255930, 493875, 3838109, 5302388, 8063125, 7491374, 5243880, 1939248, 680233, 1935425, 5386812, 4219583, 5516715, 2817761, 4964208, 94838, 1943562, 1888423, 1732799, 5851379, 4102445, 7609353, 4542855, 6420751, 429298, 7220879, 5454672, 5939291, 7208716, 1333734] +cs1: [[3, 8380407, 8380403, 8380411, 3, 7, 17, 8, 15, 6, 17, 8380408, 5, 8380408, 8380397, 0, 8380415, 8380409, 5, 9, 10, 24, 8380416, 4, 8380411, 8380409, 8380398, 8380409, 8380400, 8380411, 1, 8380409, 6, 7, 2, 8380415, 1, 0, 8380405, 8380400, 8380415, 8380402, 1, 8380412, 8380410, 8380399, 8, 8380414, 8380416, 11, 8380410, 8380407, 9, 1, 10, 6, 8380409, 9, 8380415, 8380402, 5, 10, 8380416, 8380415, 8380412, 8380410, 8380410, 8380414, 8380413, 8380402, 11, 0, 8380412, 4, 8380411, 8380394, 8380412, 8380395, 8380408, 8, 8380407, 8380409, 9, 2, 8380405, 0, 8380413, 8380408, 0, 8380410, 3, 11, 8380416, 4, 14, 23, 8380415, 17, 13, 18, 8380409, 8380410, 8380401, 8380407, 8380416, 14, 11, 17, 23, 2, 19, 8380411, 7, 8380408, 8380407, 8380415, 13, 8380412, 8380412, 6, 9, 3, 21, 18, 1, 7, 8380407, 8, 8380410, 8380405, 1, 14, 11, 3, 8380415, 8380415, 8380405, 2, 7, 8380413, 5, 8380413, 8380414, 8380402, 8380416, 8380405, 8380412, 8380402, 8380413, 5, 8380414, 3, 8, 8380409, 8380398, 3, 10, 8, 9, 8380409, 0, 5, 8380413, 10, 3, 0, 0, 8380416, 5, 3, 8380412, 11, 19, 16, 9, 20, 8380412, 1, 8380413, 3, 3, 8380410, 12, 9, 7, 7, 8380415, 0, 8380397, 8380398, 8380410, 8380400, 8380409, 2, 8, 3, 8380414, 6, 8380412, 8380410, 9, 8380411, 8380393, 8380409, 8380402, 4, 10, 8380413, 9, 8380414, 8380405, 8380411, 8380416, 8380399, 8380412, 8380413, 8380413, 20, 8, 16, 5, 1, 1, 8380409, 0, 8380409, 8380416, 5, 8380413, 8380402, 0, 8380414, 8380416, 9, 8380416, 8380414, 8380416, 3, 4, 5, 8380415, 8380407, 3, 8380400, 7, 10, 0, 8380410, 8380404, 0, 8380407, 13, 6, 7, 8380397, 8380409], +[7, 8380415, 8380415, 9, 8380411, 8380409, 8380408, 4, 8380411, 8380406, 8380403, 8380405, 6, 8380416, 14, 3, 8380412, 2, 9, 0, 0, 1, 8380404, 5, 8380409, 8380415, 8380402, 1, 4, 8380416, 8380400, 8380408, 4, 8380410, 8380411, 0, 8380400, 24, 0, 14, 0, 2, 3, 8380412, 8380408, 12, 8380393, 8380397, 8380404, 8380406, 8, 8380412, 8380413, 3, 8380408, 8380412, 8380411, 8, 4, 8380415, 6, 6, 8, 8380414, 3, 8380413, 8380416, 3, 8380406, 8380406, 8380413, 8380410, 3, 2, 8380408, 2, 8380412, 8380416, 8380408, 8380413, 8380416, 8380414, 1, 5, 7, 0, 7, 2, 8, 2, 8380414, 15, 7, 4, 5, 6, 8380416, 3, 6, 13, 1, 17, 19, 25, 8380413, 7, 8380405, 1, 3, 1, 8380410, 8380412, 2, 7, 5, 20, 8380413, 9, 8380416, 12, 5, 8380409, 8380415, 11, 8380416, 8380415, 9, 14, 16, 7, 12, 8380398, 8380410, 18, 8380411, 8380413, 7, 2, 13, 8380415, 6, 8380408, 8380415, 8380403, 8380408, 8380410, 8380413, 8380411, 5, 8380406, 8380416, 9, 8380395, 4, 8380413, 8380407, 8380411, 9, 8380411, 8380405, 8380410, 8380409, 1, 2, 1, 8, 10, 0, 13, 6, 8380406, 8380415, 8380398, 8380408, 8380395, 8380408, 10, 8380408, 0, 8380409, 18, 11, 8, 3, 8380413, 8380405, 8380415, 22, 3, 8380410, 1, 8380409, 8380413, 7, 8380411, 8380410, 8380414, 8380411, 5, 8380403, 1, 3, 8, 5, 1, 8380411, 8380409, 8380406, 7, 8380410, 8380406, 8380413, 13, 8380402, 0, 8380414, 8380410, 2, 8, 8380412, 8380416, 8380414, 1, 13, 8380412, 0, 8380409, 8380385, 8380410, 8380407, 5, 8380408, 8380415, 11, 5, 8380409, 4, 7, 8380405, 8380406, 0, 8380404, 23, 6, 8380399, 8380414, 8380415, 2, 12, 15, 11, 8380413, 8380411, 4, 8380415, 8380409], +[3, 5, 8, 0, 4, 8380413, 8380415, 8380410, 8380409, 8380412, 8380413, 11, 6, 6, 11, 6, 6, 8380413, 8380411, 6, 2, 8380411, 0, 7, 8380404, 8380416, 0, 8380407, 13, 8380409, 8380409, 6, 8380414, 8380416, 29, 8380407, 5, 6, 0, 8380408, 8380406, 8380416, 2, 2, 10, 6, 8380412, 4, 5, 8380413, 13, 8380409, 8380409, 8380412, 14, 5, 3, 5, 8380402, 8380416, 2, 8380413, 8380416, 8380407, 8380414, 8380413, 8, 8380406, 6, 8380414, 8380412, 8380412, 10, 8380415, 3, 8380413, 8380416, 8380412, 8380411, 8380404, 8380402, 7, 8380414, 8380399, 8380414, 8380415, 8380412, 8380412, 8380416, 4, 7, 8380410, 8380414, 10, 8380406, 8380415, 16, 8380414, 8380410, 7, 1, 2, 4, 8380416, 8380416, 8380409, 10, 7, 5, 8380411, 6, 10, 8380414, 8380408, 6, 1, 8380416, 8380403, 8380412, 8380413, 8380411, 5, 8380414, 8380413, 7, 3, 11, 1, 8380412, 20, 8380405, 8380406, 0, 8380412, 8380410, 6, 8380416, 8380405, 14, 17, 2, 8380406, 5, 8380403, 3, 8380413, 8380415, 8380404, 3, 8380409, 8380415, 0, 2, 8380408, 10, 8380411, 1, 13, 7, 8380405, 21, 17, 8380412, 11, 2, 6, 15, 0, 1, 5, 8380412, 3, 8380407, 12, 2, 8380408, 11, 15, 4, 11, 8380414, 9, 3, 8380383, 2, 11, 2, 8380413, 4, 8380407, 8380415, 22, 8380409, 5, 9, 8380400, 8380414, 1, 5, 11, 10, 8380414, 8380406, 3, 8380412, 8380409, 8380416, 8380413, 8380408, 8380413, 1, 10, 2, 8380414, 8380411, 8380401, 8380412, 0, 3, 7, 8380412, 8380408, 12, 0, 11, 8380412, 0, 0, 8380411, 0, 22, 8380411, 8380410, 8380413, 8380409, 8380416, 8380415, 8380409, 8380413, 11, 8380416, 15, 8380411, 8, 8380410, 8380412, 8380409, 8380412, 8380413, 1, 8380415, 10, 8380411, 2, 0, 4], +[8380408, 5, 8380407, 1, 8380407, 5, 8380415, 17, 8380416, 16, 6, 6, 8380416, 1, 9, 8380411, 8, 8380404, 2, 8380404, 10, 8380409, 8380400, 8380414, 5, 8380411, 8380415, 8380412, 8380412, 8380411, 2, 4, 18, 8380416, 15, 18, 8380413, 6, 8380411, 5, 8380401, 12, 8380412, 8380414, 8380401, 0, 8380411, 8380411, 7, 8380408, 8380415, 10, 8380406, 8380406, 6, 8380402, 8380405, 23, 6, 11, 8, 8380402, 2, 8380410, 8380406, 11, 20, 11, 18, 8380412, 8380416, 8380414, 0, 8380415, 8380412, 14, 8, 12, 8380415, 8380411, 8380405, 8380413, 8380411, 8380408, 8380413, 8380409, 8380416, 8380415, 8380413, 12, 8380398, 3, 8380416, 4, 17, 8380414, 16, 2, 13, 15, 16, 8380410, 8380414, 8380415, 8380399, 3, 8, 4, 19, 8380402, 8380416, 0, 3, 8380415, 8380408, 8380415, 8380407, 8380406, 8380404, 8380408, 8380410, 2, 8380403, 8380413, 3, 5, 8380414, 8, 0, 8380405, 7, 14, 18, 9, 4, 3, 4, 1, 8380414, 5, 8380415, 8380411, 11, 6, 8380411, 3, 6, 8380393, 8380406, 11, 8380413, 7, 11, 8380409, 1, 22, 8380412, 12, 6, 1, 8380413, 14, 8380409, 9, 14, 8380415, 8380415, 8380416, 8380414, 8380411, 8380407, 8380414, 8380414, 3, 3, 0, 0, 6, 5, 8380404, 2, 8380407, 20, 8380415, 7, 8380411, 8380411, 8380401, 8380409, 8380408, 8380414, 8380408, 8380403, 2, 7, 6, 8380398, 5, 6, 8380406, 10, 5, 8380394, 8380415, 8380402, 8380410, 8380406, 6, 1, 5, 8380414, 10, 4, 8380414, 7, 8380413, 17, 8, 9, 21, 7, 8380406, 10, 8380410, 3, 1, 0, 8380415, 11, 8380399, 8380413, 14, 2, 9, 11, 8380412, 8380399, 8380414, 8380398, 2, 8380410, 0, 13, 19, 5, 8380412, 1, 6, 8380413, 0, 15, 3, 8380415, 8380409, 8380403, 8380407]] +cs2: [[5, 8380410, 8380406, 8380409, 0, 0, 7, 22, 6, 8380402, 20, 1, 10, 8380415, 2, 8380412, 6, 12, 11, 8380414, 8380394, 6, 4, 3, 9, 8380412, 8380409, 8380409, 12, 25, 13, 17, 0, 8380416, 8380402, 8380412, 8380408, 8380408, 8380412, 8380404, 8380411, 8380413, 8, 8380412, 8380404, 8380411, 8380415, 15, 19, 8, 10, 8380403, 8380414, 8380407, 8380405, 8380403, 8380409, 1, 8380411, 26, 18, 4, 13, 8380406, 3, 8380412, 8380409, 4, 8380405, 8380409, 2, 8380416, 17, 7, 14, 8380415, 8380406, 8380410, 11, 8380405, 11, 8380411, 8380411, 5, 5, 0, 1, 8380394, 8380416, 8380416, 8, 6, 5, 0, 8380415, 7, 8380408, 11, 8380413, 12, 1, 12, 10, 8380413, 8380405, 8380403, 8380405, 6, 1, 2, 2, 9, 8380415, 8380415, 5, 8380413, 8380413, 8, 8380407, 3, 9, 8380409, 5, 4, 0, 1, 12, 8380416, 8380407, 8380397, 8380412, 8380416, 8380412, 10, 11, 11, 8380414, 8380416, 8380413, 8380413, 8380416, 8380401, 3, 8380404, 5, 8380416, 8380415, 8380416, 2, 8380408, 0, 0, 12, 0, 8380413, 4, 2, 8380413, 6, 0, 8380409, 8380408, 8380403, 0, 8380410, 0, 8380403, 8380416, 8380416, 7, 8380405, 5, 2, 15, 11, 16, 7, 11, 8380406, 2, 8, 2, 8380409, 8380412, 0, 8380416, 3, 17, 7, 10, 7, 0, 4, 0, 2, 14, 4, 10, 2, 8380408, 8380404, 0, 8380404, 8380411, 0, 8380416, 2, 8380413, 9, 8380415, 8380413, 8380409, 0, 6, 10, 1, 13, 9, 9, 8380415, 1, 8380413, 5, 8380415, 8380406, 8380415, 9, 3, 8380406, 12, 8380401, 2, 8380401, 4, 8380414, 3, 3, 15, 8380410, 8380410, 4, 8380411, 8380416, 5, 8380408, 8380411, 1, 15, 8380403, 0, 8380415, 8380410, 8380414, 8380414, 3, 4], +[13, 3, 8380411, 8380414, 8380415, 8380401, 4, 8380415, 13, 5, 8380415, 5, 3, 8380414, 4, 4, 4, 0, 12, 8380408, 1, 8380414, 15, 8, 10, 9, 20, 8380416, 8380416, 5, 3, 8380412, 4, 6, 0, 9, 8380409, 3, 0, 3, 9, 24, 3, 8380410, 2, 8380408, 10, 7, 8380416, 6, 18, 10, 4, 5, 2, 0, 1, 8380412, 21, 1, 1, 12, 8380416, 2, 8380415, 8380406, 7, 2, 8380407, 7, 8380414, 7, 2, 10, 0, 16, 8380409, 7, 14, 8380412, 8380410, 8380405, 8380416, 8380414, 8380416, 2, 8380409, 8380415, 3, 8380413, 14, 12, 25, 8380410, 8380414, 8380409, 8, 8380412, 3, 8380413, 13, 0, 6, 8380413, 9, 8380405, 8380403, 8380411, 8380398, 8380407, 8, 8380413, 8380411, 9, 0, 3, 10, 1, 8380403, 8380412, 8380405, 8380414, 8380411, 8380408, 11, 6, 8380407, 8380411, 8380401, 8380403, 8380416, 8380413, 8380413, 4, 3, 8380414, 8380415, 8380408, 8380408, 8380403, 8380399, 3, 8380413, 8380414, 4, 5, 8380416, 8380412, 8380402, 8380401, 8380405, 8380406, 8380400, 8380400, 4, 8380403, 8380413, 3, 8380406, 8380416, 8380409, 8380410, 6, 8380416, 8380413, 16, 18, 1, 8380408, 8380409, 12, 8380409, 8380409, 6, 0, 8, 23, 14, 3, 3, 8380415, 8380400, 8, 8380414, 9, 2, 8380416, 6, 6, 20, 8380411, 4, 3, 8, 1, 8380413, 11, 8380415, 12, 20, 11, 22, 8380411, 8380413, 8380412, 8380414, 1, 15, 1, 14, 4, 8380413, 2, 8380415, 6, 6, 18, 6, 15, 8380412, 12, 8380415, 8380405, 8380414, 8380401, 3, 14, 8380409, 8380409, 4, 8380413, 13, 9, 1, 8380415, 4, 8380411, 13, 8380410, 17, 3, 0, 7, 7, 3, 4, 8380409, 8380408, 3, 5, 19, 10, 8380412, 8380408, 3, 8380409], +[11, 9, 11, 2, 8, 13, 11, 4, 8380408, 8380416, 8380410, 5, 5, 21, 5, 9, 10, 26, 7, 8, 8380416, 8380399, 1, 4, 8380416, 0, 0, 10, 0, 2, 0, 8380402, 8, 8380410, 16, 8380416, 7, 3, 3, 8380412, 8380407, 8380413, 8380413, 8380411, 8380412, 8380408, 8380415, 8380405, 0, 8380405, 8380412, 8380407, 8380408, 8380414, 8380415, 8, 8380411, 8380401, 6, 8380416, 3, 3, 6, 8380395, 1, 0, 8380416, 8380414, 8380411, 8380412, 19, 8380414, 8380413, 8380404, 8380413, 14, 8380406, 1, 8380410, 8380414, 4, 8380402, 8380409, 1, 8380408, 0, 8380416, 8380416, 8380416, 13, 8380405, 6, 4, 8380409, 8380405, 8380407, 8380398, 8380414, 8380413, 8380412, 8380412, 4, 8380412, 8380416, 12, 8380414, 8380402, 8380415, 8380400, 8380405, 8380402, 0, 4, 8380416, 13, 8380403, 4, 1, 8380414, 8380414, 13, 8380415, 4, 3, 8380416, 8, 8380406, 8380406, 16, 8380404, 3, 4, 8, 0, 8380406, 1, 5, 9, 5, 7, 8380412, 8380414, 8380416, 20, 16, 5, 8380408, 4, 8380400, 5, 3, 8380393, 8380404, 1, 6, 17, 5, 6, 8380404, 8380415, 6, 26, 9, 8380409, 8380407, 8380415, 1, 4, 2, 8380414, 8380404, 10, 8380405, 1, 8, 6, 8380413, 8380416, 7, 12, 30, 13, 3, 8380401, 8380411, 7, 20, 1, 8380408, 8, 2, 5, 27, 3, 1, 8380400, 8380413, 8380411, 26, 18, 6, 8380398, 8380412, 8380408, 3, 8380416, 8380405, 1, 6, 9, 2, 13, 8380411, 9, 8380409, 8380416, 8380409, 8380416, 8380411, 0, 8380403, 11, 8380410, 15, 8380403, 8380415, 8380400, 5, 9, 8380409, 8380399, 1, 0, 8380416, 8, 9, 8380412, 4, 8380406, 4, 8380413, 2, 8380408, 8380407, 8380401, 2, 5, 7, 8380411, 8380411, 8380407, 8380410, 7, 0, 0, 1], +[8380413, 8380409, 2, 5, 8, 8380411, 8380413, 12, 13, 3, 12, 8380415, 8380416, 8380406, 8380404, 3, 8380410, 8380416, 8380414, 8380416, 5, 10, 8, 8380408, 11, 8380407, 3, 8380404, 4, 7, 8380409, 12, 2, 8380411, 10, 11, 2, 8380409, 8380415, 4, 9, 1, 8380412, 8380409, 8380414, 8380406, 8, 8380411, 8380413, 6, 8380406, 8380400, 3, 8380414, 8380416, 8380400, 6, 8380406, 8, 5, 16, 8, 0, 8380408, 8380407, 8380413, 11, 14, 15, 8380414, 4, 8380409, 7, 3, 8, 8380403, 3, 5, 10, 8380412, 0, 8380407, 9, 8380413, 8380415, 14, 8380412, 4, 2, 0, 8380414, 3, 8380414, 8380406, 5, 8380410, 8380411, 8380410, 8380411, 8380403, 8380406, 8380416, 6, 14, 9, 9, 2, 8380406, 3, 1, 5, 8380407, 8380410, 8380403, 8380416, 8380414, 10, 1, 14, 8380410, 8380405, 6, 7, 3, 10, 8380408, 8, 8380416, 8380413, 8380402, 8380404, 8380415, 10, 6, 0, 5, 8380413, 8380415, 8380410, 8380414, 8, 8380408, 12, 7, 10, 12, 0, 1, 8380406, 8380407, 16, 8380414, 24, 12, 8380408, 3, 11, 16, 8380415, 8380413, 8380406, 0, 8380409, 6, 8380407, 8380414, 8380407, 8380409, 0, 8380416, 6, 2, 8380408, 3, 8380416, 8380406, 8380407, 20, 3, 8380410, 2, 8380402, 8380414, 4, 8380407, 0, 11, 8380408, 8, 8380410, 8380415, 8380416, 8380414, 8380404, 7, 0, 8380412, 4, 8380409, 8380408, 8380409, 8380416, 8380409, 7, 0, 3, 8380415, 6, 8380401, 19, 5, 4, 8380412, 8380402, 8380403, 8380415, 8380413, 8380415, 8380412, 4, 10, 1, 2, 0, 3, 1, 14, 11, 8, 4, 7, 4, 7, 8, 8380412, 10, 4, 8, 8380410, 8380410, 8, 9, 6, 4, 8380408, 0, 8380415, 8380413, 2, 8380411, 8380409, 12, 8380409, 11, 8380413, 4]] +z: [[8349486, 8306468, 10103, 113710, 128870, 2961, 37140, 8325936, 8324741, 8356891, 8324675, 8326110, 104146, 63183, 8285682, 122164, 8316324, 8379882, 8336938, 117837, 8303173, 85613, 56957, 8306709, 63201, 8297307, 58427, 8273163, 102212, 20584, 8262245, 8338161, 8313121, 50640, 8317971, 129844, 114944, 8260071, 26156, 8330635, 8372794, 30279, 8285866, 2485, 95061, 86381, 65950, 34246, 40921, 8263931, 8273837, 17200, 33027, 6241, 8293334, 8251330, 8294043, 8267291, 8336525, 17090, 19012, 118247, 22645, 8308360, 17754, 38423, 40906, 124876, 8346455, 125412, 127824, 59983, 8278134, 115951, 92454, 8396, 58347, 27873, 55871, 115661, 67774, 115132, 8323541, 86725, 42687, 115347, 118318, 8368825, 8338497, 8252857, 22862, 8274657, 84566, 8371509, 14593, 97524, 116595, 2851, 8296391, 8280376, 13447, 8329726, 8281722, 113641, 8379556, 8271773, 8371859, 8342829, 8374173, 8261000, 8297755, 111545, 95619, 8367228, 19713, 8348689, 69810, 8331071, 8269481, 65389, 8339294, 62560, 82163, 96818, 79419, 8333255, 8309500, 22636, 8374668, 80469, 25413, 18340, 8292065, 8317154, 8261960, 13394, 88221, 103286, 8256293, 64211, 33079, 3372, 8353603, 8376938, 8271056, 8293358, 8324918, 8266937, 78342, 126461, 42062, 49000, 8327920, 8313987, 8269931, 72379, 8252219, 38333, 8296641, 8310279, 91712, 118759, 35612, 8344948, 115085, 26080, 48439, 8288075, 67156, 35291, 66117, 8362758, 40666, 20410, 8360227, 8280509, 8344122, 8317933, 110432, 24475, 83197, 66663, 8321816, 29061, 8305147, 8294675, 8352592, 8279484, 8258175, 115624, 49563, 54212, 8376056, 8326336, 8350058, 14848, 52323, 49459, 8294124, 27507, 80258, 8356781, 27881, 8363152, 8285555, 40902, 30667, 8297745, 8366776, 79315, 8360253, 114999, 8359776, 8341934, 8378580, 125224, 8358159, 8373059, 8316543, 8371885, 103028, 121401, 8352122, 8339169, 8317595, 8258163, 8250135, 8366613, 33285, 8335810, 79349, 30748, 118536, 101796, 8337501, 73884, 8288809, 117445, 8380281, 8250125, 32119, 8342906, 47631, 116196, 130018, 30955, 8319796, 51242, 8340155, 8315433, 8306423, 8341159, 8324805, 33114, 8362038, 19310], +[86584, 108997, 16220, 71682, 8252831, 8282711, 24518, 8320620, 74615, 49478, 20486, 8088, 8379901, 105560, 77787, 8266957, 8260532, 8325476, 8334789, 8290108, 18470, 8294313, 104425, 8249743, 73097, 8297011, 8367400, 8305857, 110774, 87359, 58641, 8303671, 207, 2920, 54470, 8293091, 8249769, 65523, 8322151, 8327442, 8373111, 20725, 86538, 8291616, 8340279, 31506, 8358973, 14320, 64430, 8366913, 8352300, 8260465, 8369398, 8309219, 8296144, 89511, 40815, 36244, 8327041, 8274052, 88738, 97608, 8284473, 8332702, 8307318, 8352173, 8289452, 8360251, 8326191, 55963, 8329591, 65721, 8257273, 8251759, 50994, 8340184, 8287253, 20346, 8341548, 52379, 8354488, 8294231, 40870, 19398, 8263550, 310, 8328731, 8333194, 28149, 8280223, 107409, 8352687, 8334935, 19599, 10984, 21941, 8330021, 8302219, 8272824, 40872, 8363470, 51738, 8268297, 74696, 69034, 8256220, 8296415, 8330547, 8345348, 8306702, 86909, 53714, 72036, 84083, 8376612, 40085, 8293476, 25596, 91002, 26810, 8283203, 81948, 31626, 73855, 79682, 8380109, 90711, 107730, 8319429, 8253768, 26360, 96922, 39507, 8272285, 65486, 8302049, 8286575, 8313599, 115484, 8287601, 8297355, 118882, 31576, 8305511, 8325599, 33272, 8317132, 8332764, 8333010, 114161, 122754, 8311429, 8275976, 8288757, 128750, 8323155, 28303, 89244, 29218, 75785, 8340252, 88881, 8376702, 76166, 8311708, 35820, 11694, 8364391, 51908, 8369341, 80410, 8319218, 121314, 8320301, 8253019, 84390, 8332924, 90030, 8308689, 8293815, 8272301, 5221, 46582, 8346564, 8365536, 98096, 8333088, 8372218, 80559, 124043, 20791, 58092, 8348767, 8260749, 8296931, 61209, 82577, 8328780, 8259880, 87371, 8286416, 8372429, 103176, 8350610, 52524, 8289635, 91120, 63853, 39142, 17506, 33994, 8352047, 49140, 25125, 8335636, 8304536, 9763, 8351522, 22087, 92768, 8261576, 96651, 66979, 63767, 8305281, 19758, 8323725, 42081, 121887, 8290021, 56460, 62832, 8281269, 8261455, 8265643, 8292047, 8330787, 110463, 10664, 58188, 8308148, 58371, 13600, 66936, 34399, 8317323, 13690, 2478, 8332601, 101991, 8255503, 8331017, 8304177, 29336, 76038, 2495], +[8360887, 2024, 8292493, 44741, 25995, 8309641, 8357339, 112146, 8372571, 8316999, 6053, 8298599, 8351357, 8343223, 89516, 37526, 23875, 8285112, 122006, 119096, 98478, 121068, 8378698, 109677, 8329065, 8360027, 52278, 19193, 93787, 76196, 8320962, 8288410, 8269708, 68503, 59109, 8315212, 8377880, 8303218, 8258703, 8282206, 8370357, 8365724, 86980, 107752, 8340182, 38979, 58532, 8266180, 44060, 127187, 56124, 8358835, 58238, 8294467, 124701, 8375230, 8311661, 8282043, 8253915, 8324678, 31088, 8304845, 77868, 8366184, 8292907, 8362372, 22843, 8250447, 109224, 8359311, 84292, 37053, 112137, 111072, 70551, 8263480, 30703, 8250766, 8343488, 34967, 8279777, 8317017, 55532, 8371868, 8322504, 117887, 8347994, 8359799, 110300, 8257150, 8365051, 130312, 8256001, 8338834, 48448, 8291014, 50403, 8338540, 8297688, 8355728, 83125, 81172, 8347090, 25940, 8298880, 21499, 118837, 8253371, 18422, 6670, 3875, 8363397, 74546, 48613, 39446, 8380343, 2277, 8364966, 8322147, 8275632, 129963, 33646, 5518, 36023, 19964, 8267568, 8306516, 8352947, 8367470, 120324, 8336834, 8356459, 8263013, 8322654, 7860, 34002, 5210, 38634, 40899, 8252797, 8367664, 89153, 21754, 23547, 106195, 63233, 20881, 8347420, 94590, 8369024, 8298094, 18889, 14470, 8277683, 8346971, 46937, 8264160, 97276, 8374535, 8374497, 102489, 8352597, 8370496, 62490, 8317958, 92446, 8339149, 129764, 130005, 59582, 8359392, 8287598, 8251783, 54434, 122571, 14673, 8340999, 37652, 43577, 8274806, 103330, 106779, 38735, 51620, 25064, 22941, 94486, 121144, 66990, 114878, 31680, 72165, 8377063, 106337, 8374519, 8332524, 8318118, 8377338, 8347309, 8336387, 64003, 49165, 38726, 10596, 93458, 22328, 57524, 8301189, 73469, 8322220, 8320655, 109968, 8286260, 71872, 8259058, 113438, 8278983, 17662, 8272747, 8251684, 8263723, 8357569, 92972, 63015, 8305784, 110510, 86426, 8327403, 64606, 17918, 8278731, 126888, 8274452, 8307847, 8283129, 8283324, 8291981, 8292273, 8321675, 117315, 120188, 68676, 2916, 93080, 8252934, 8266133, 8255765, 8342111, 30518, 46260, 8302158, 8304224, 100266, 8281344, 48994, 8334214], +[65897, 8356970, 97062, 90566, 8271104, 10817, 8320067, 79491, 8266707, 8358156, 8326068, 8274029, 8365532, 113846, 11660, 20749, 93152, 8369937, 8308967, 16209, 8262443, 8262947, 8250806, 120011, 8350728, 8367948, 9382, 36175, 113634, 8264309, 8366792, 96411, 82983, 125891, 8329811, 8347361, 8351553, 8290714, 70656, 101182, 93224, 8338753, 8292394, 8354026, 8359353, 8349661, 39523, 8267459, 8292803, 8339811, 96214, 85604, 40570, 60981, 31876, 8343450, 8374061, 8288570, 8343038, 118227, 34019, 8379792, 83279, 31288, 8334879, 36691, 8311276, 8347533, 122583, 8356331, 21516, 8287006, 8316333, 98549, 8352985, 34632, 38335, 100750, 8359219, 38655, 8269592, 8320025, 90034, 8367272, 79951, 8308495, 50273, 8307379, 8257982, 8269238, 97754, 8326685, 39999, 8348062, 20688, 8371534, 96071, 3992, 8366905, 126838, 117999, 117970, 86347, 8283616, 8326861, 8362085, 45240, 118716, 8298644, 8260517, 127606, 8269393, 59140, 100766, 8256734, 118774, 120726, 8334584, 22177, 8328190, 8284487, 8295075, 8376189, 8256738, 8320541, 45237, 8347332, 8273048, 26507, 8331749, 8266200, 8303897, 116432, 50368, 80629, 91907, 8358056, 87762, 94192, 8317777, 92328, 8329447, 8340487, 8194, 8262178, 8287111, 122730, 8371572, 20257, 20715, 8285038, 8352200, 8291936, 16721, 46505, 8261799, 8255187, 8311586, 106033, 30795, 97689, 8357905, 67977, 8374291, 8360142, 8275480, 8331705, 53459, 8278557, 8364251, 8327391, 62379, 8309571, 89242, 8269177, 8288419, 8352782, 58813, 8361936, 8272110, 8365693, 8331158, 94695, 95040, 124768, 108218, 8276855, 8290905, 8297277, 51759, 63992, 8273399, 8278904, 8307719, 8263216, 118559, 8266051, 41634, 12136, 8320076, 8301793, 8350410, 8343452, 128425, 8253103, 8285118, 8377708, 8356798, 97099, 8366606, 147, 8276513, 8359282, 126521, 107310, 111481, 8354973, 8348425, 9365, 8264055, 8313733, 8252899, 1931, 113455, 8319803, 8276659, 8280170, 103203, 8313431, 47785, 8261345, 18790, 109035, 12227, 8376838, 108338, 19356, 8331671, 81383, 8336513, 72946, 8302790, 8356513, 77377, 8375940, 49679, 8378425, 8298968, 117634, 110370, 8312294, 8269606, 7898, 63788, 86336, 72285]] +||z||: 130674, ||z|| check passed +r0: [[-75412, -16496, 34235, 40185, -89126, 18906, 13463, 19161, -89035, 15765, 39444, 81763, -869, 12704, 83232, 82403, -54966, 26629, -21601, 58043, 45, 78100, -9989, 26373, 9109, -22175, 53688, 17203, -13215, 36136, 91494, 16956, -14417, 94511, 12807, -49832, -8655, -81673, 82674, 59566, -39596, 87478, -16117, -53166, -10151, -67716, 28892, 95060, 94502, -30672, 51245, -71698, -71430, 30006, -4555, 29264, 6235, 23781, -8175, 43704, 14907, -86222, 54285, 16659, -60443, -43023, -61165, 1595, 6530, 22225, -23799, 201, -59980, 31846, -84375, 90160, -28413, -61551, -64957, -16093, -16745, -59595, -64951, 25203, 17543, -82919, 12554, 84484, 9622, -49988, 6448, 41480, -5404, 31676, 58298, -30637, -7852, 56611, -19565, -77111, -69482, 59465, -18311, 11478, -11689, -77419, 68542, -87989, 49033, -83466, 15121, 31133, -37002, -26041, 73472, 1368, -70548, -18323, -59945, -26310, -60627, 11412, -67262, -61489, 19894, -13181, 7075, 20822, -30041, -47874, 35058, 94271, -84988, -69217, 60014, 18101, -218, -37546, 72259, -13505, 1947, -49307, 88598, 86550, 8995, -24978, 66324, -59304, -91284, 55446, 76781, 50023, 6684, -25245, 88435, -34055, -41547, 29529, 14862, -18241, -88635, 52859, -19130, 32560, 68652, -87230, 30100, 73556, -49145, 87592, -78830, 21954, -51713, 3865, -49302, 45182, -29977, -30133, -87026, 35508, 81186, 84624, -38824, -56735, 43803, -92495, -15216, -2479, -12099, 42026, 89062, -71026, -45564, 33223, -76356, 18124, 35844, 55955, -86906, -75953, 67366, 57290, -52080, -50929, 73716, 42640, 76535, 50187, 93588, -29658, 10452, -80999, 2292, 30923, -45644, 6975, 73344, -75078, -64580, 23282, 49207, -59318, -1691, 81465, -22013, 79329, -87137, -27184, -47927, 61058, -33161, -30977, 12524, -65154, 9363, -89683, -38662, -57230, -27218, -67769, 77705, 3208, -88813, -10934, 81763, -36887, 4899, 40646, 50083, -31991, 61296, -82810, 44536, -51017, -85370, -48260], +[-83904, 31906, -8297, 16883, 71961, 78557, -44752, 5398, 55282, -46058, -16822, 58870, 61910, -15702, -4870, 37695, -74169, -36300, 70099, -69739, 11909, 43853, -42686, 6869, -71787, 84443, -57904, 45789, -37182, 83745, 12427, 2082, 78450, -66218, -91206, 25275, -87132, -15275, -54579, -85430, -19449, -64936, -73568, 78469, 50726, 30304, 95195, 91289, -29774, -81100, -28358, 69303, -90525, -52672, -56918, -22282, -42651, -55228, -77489, 91814, -17044, -82854, -14706, -20458, 39770, 54736, -47230, 57420, -27065, 21163, 68638, 37317, -4035, -40541, 93099, -28798, 82098, 37076, 18317, 32346, -67423, 74409, -45092, -67428, -44109, -63845, -20414, 58305, -22523, 49537, -63755, -52575, -89032, 27541, -34029, 55275, -41297, -16297, -18344, -31950, -35937, -87351, 22774, 27671, -30429, -51897, -33858, 53065, -10089, 83597, 11630, -5526, 60399, 56850, -51472, 76789, 32888, -60396, -67670, -23323, 16493, 91455, -39959, 62296, 86378, -35649, 17176, 74174, 33681, 82397, 13133, 68832, 84694, -61970, 32208, -21932, 9702, 67278, -25677, -5911, 49044, -72728, 47333, -48476, -11281, 69144, -62114, -21655, 22816, 11214, -35672, -71142, 4149, 93502, 83326, -68295, -74271, -13470, 54054, -49537, -19908, 28380, 1260, 73462, 21773, -89767, -8492, -46893, 64367, 92844, 33671, 10641, 71040, 71793, 81556, 5501, -90398, 84282, -30095, -58488, -93183, -8796, 26419, 84400, 85669, -9938, -38201, 15895, 66134, -85060, 39202, 60784, -93103, 77464, 38199, -11585, -17096, 14863, 66211, 31259, 70855, -51932, 16733, 68818, 91905, 70008, -57660, -37056, -78318, -74073, -47196, 72397, -59937, 18370, 82003, 73412, 41844, 81661, -71106, -1498, -22604, 46282, 91975, -62112, 63825, -94293, 9145, -52164, 62117, 29250, 55780, 18088, -34161, -7285, 31067, 11326, 53546, -27892, -22396, -61092, -38040, 40740, -67659, -44194, -41561, -56058, 40206, -34945, -70698, -51932, -93967, -47195, 44323, 63623, -61379, -52991], +[-83999, -67530, 40633, -3424, -93810, -46363, -94143, 86466, 40349, -54187, -19827, 5691, -64539, 81132, 55978, -77380, 51447, 94881, -48353, -35336, 57986, 22598, 10126, -27875, 47004, -73248, -1689, 33041, -87593, -83517, 48670, -43380, 74755, 26874, 18048, -79243, 63234, 84907, -6627, -82165, 76626, 1381, -29462, -80934, -44601, -78167, -72499, -80757, 24978, 32635, 39490, 53037, 29343, -29648, 45212, -792, -40817, -50482, 50179, -75285, 47007, -83886, 29189, -74112, 34044, -65423, 5643, -24651, -26295, 36764, -84568, 79199, 92076, 77334, 11293, -27029, 68526, 80685, 76852, -1558, -80780, 80491, 57949, -15528, 25607, 46965, 82968, 53979, 37798, 63783, -64578, 47139, -53002, 45633, 10310, 22538, 32490, 79729, -24525, 69012, 75244, 3006, -11819, 66755, -92748, -91386, 31611, 81230, -76828, -49020, -39810, 52776, -67905, -75294, 58922, -11488, -33085, 25832, 24361, 21213, -76594, -25110, -46643, 86978, 79897, 83240, 10845, 3127, 57785, -34572, -29513, 33423, 59679, -81036, 79586, -76510, -20085, -67678, 54301, -39241, -68875, -55980, 4869, 78997, -75065, 20076, 57707, -34148, -55165, 93573, 31160, -47770, -18038, 21652, 79850, -88226, -65986, -26509, -17998, -45562, 7658, -31472, -19573, 68115, -80238, -51427, -32546, -32701, 50247, -34218, -33237, -26431, -85171, -57569, -12935, 51103, -95143, 24400, 42419, 66352, 33542, -70356, -7396, 76227, 89228, 92841, 16994, -637, 80440, -29642, 49326, -12819, -82360, 6265, 39370, 26502, 62823, -29614, 43658, -50804, 79123, 47185, 43287, 54611, 6168, 62605, -79425, 12987, -22463, 8750, 70400, -24834, 84001, 25769, -58000, -63566, -94554, 60837, -23896, -41812, 16928, -59668, 90350, -45178, 16058, 45103, -95186, 35558, 52835, -29916, 38705, 70633, 82065, -32726, 58672, -42353, 51915, -54519, 65649, -82758, 45637, -6028, 40420, -39945, -67490, 88065, -1036, -39503, -71337, -4988, -51007, -46698, -76123, -52232, 67454, 9985], +[-7271, 87557, 25871, -64190, -8652, -14930, -92765, -82016, 79248, -51334, 5318, 72932, 61896, 76380, -94567, -38311, 52603, 34543, 73736, 42499, 20257, 60654, 89568, -3955, 48854, -90845, 54535, 21793, -24197, -93446, -72539, 27665, -51638, -67715, -29916, -42777, 3676, 43916, 34588, 10674, -27942, -43668, 39845, -42975, 84578, -57277, -94655, 93505, -87714, -53092, -91357, -1976, 72350, -21489, -6275, -19578, 77786, 16156, 58875, -38699, -11341, 874, 42674, 10244, -72293, -79106, -81015, 81898, -12002, 59586, -1206, 82430, 38285, 4774, -8550, -56631, 4382, -32072, 82109, 56881, 86632, 51139, -36707, 37186, 64530, -74267, -28097, 33921, -83200, 28338, -65644, 3487, -92107, -66316, -49559, 42090, 7072, -37923, 53391, -13279, -14958, 9619, -31568, -49831, 27888, -93758, -44695, 61127, -62368, -48007, 46421, 84138, 88395, 4420, -20445, -45908, 62270, 3671, -21799, 81623, 74519, -21585, -67344, 93371, -67498, -18831, 68194, 86979, 46704, 17157, 88563, -17454, -76748, -74314, -66958, -69454, -65443, 29229, -26901, 62395, -52459, -48565, 1072, 70781, 48158, 87953, -53158, 51776, 80902, -29131, -69196, 27761, -24881, 54690, 75572, -15908, 68273, 89986, -68521, 72367, 10319, -35375, 16222, 20313, -24786, -83811, -73458, -82516, -72685, -11752, 46484, 26195, 85420, -40300, -69373, 90029, 89282, -34626, -38214, -53384, -26981, 65185, 22904, 41533, -42834, 12794, 75098, 82729, -8751, 51327, -29836, -21933, -93729, -58168, -17287, -93952, -41386, 87934, 77376, -74876, -45403, 29947, -79790, 38215, -91856, -75065, -37066, 23691, -3526, -85165, 94085, -3230, -32879, -8397, -42557, -52702, -43455, -82477, -85623, 54769, -48107, 439, -75505, 51342, 94504, -34920, -52056, -4718, -39916, -27834, -45724, -47535, -28328, -49722, 7510, -38348, 9431, 39736, -14428, -15263, -50179, 81295, -88452, -10015, 24734, -20773, -43405, -11786, 55719, -18234, 61238, -68902, 77579, -74763, 90297, -46216]] +||r0||95195, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-113939, 127795, -22587, 26948, 25132, 96985, 23860, 127785, -19457, -26979, -3245, -4287, -76300, 69784, 31002, 12703, -63276, 120266, -89891, 71585, -41612, 97828, -118088, -59301, 60368, 1887, 53357, -129188, -54076, 32167, 84435, -92103, 66801, -19161, 97296, -49291, -13853, -8441, -117459, 93093, 76615, -67894, 53694, -122394, 38057, -126420, 64170, -33892, -1154, -114660, 6684, -69633, 35250, 17597, -18714, 110417, 74831, 55610, -45597, 79001, -54285, 17095, 55738, -19650, 98933, 44502, 94440, 52119, 50584, 123105, -128419, 118217, -42727, -64311, 119897, 49850, 66823, -128815, 26553, 83435, -97884, -104012, 79437, -49850, -118212, -99007, -86567, 84251, -50532, 84371, -30475, -50305, -125352, -66058, 44508, 76806, -122102, 127104, 91160, 107617, 6271, 89984, 102586, 98269, -115166, 2344, 82597, 112014, -119919, -8377, -41470, 83496, -68697, 61645, -118362, 75844, -74618, 33539, -111894, -8723, -83422, -50701, -60180, 77510, 108234, 73472, -21838, 29114, -109155, 83522, 4794, 31893, 129287, 77467, -8602, 81486, -20981, 72057, -114934, 52921, 23714, -58710, 110572, -66049, 85260, 30778, -20666, -26288, 42515, 113576, -58373, 130552, 78818, -93456, 40342, 37734, 15195, -76091, 117670, 126306, -127206, -15617, -76755, 16373, 71123, 58572, -43275, 96468, -22454, 106808, -72697, 121583, 57298, 54101, -46708, 65789, 2725, 68565, 92064, -51400, -73251, 22160, 75985, -46028, 516, -27357, -92875, 114324, -45301, -38565, 26573, 3769, -79496, 45651, 29189, 116954, 52049, -39434, -90229, 25527, 9439, 47031, -36778, -59257, 62500, 265, -50878, -102289, 105837, 11056, 42464, -13617, -77862, -101752, -23428, -120530, -3146, -126402, -128206, 19827, -11653, -14250, 78157, -119708, -96709, 27047, 15095, -74107, -98604, 1262, -109818, 90743, 91534, 93998, 5086, -106148, -18236, -15599, -90588, 96383, -112003, -112152, 39828, 102872, -50930, -17242, 39625, -110168, 58286, 86626, -99355, 96463, -2615, 99793, 6567, -77389], +[-42385, 8211, -72350, 98575, -11114, -126553, -105622, -127179, 128760, 124872, 91859, 5441, 5486, -42939, 98653, -31742, -58221, 91955, -3038, -100453, 9675, 67354, 51540, 16371, 1465, -6762, -66168, -20052, -26899, 64974, 73227, 88293, 12832, 25490, 118808, -58534, -121436, 25878, 39260, 1353, -74993, -5386, -50134, 80760, 105043, -18000, -54704, -14241, 18977, 29764, -98336, 44735, -94673, -7437, -7676, -103312, -94752, 101072, -106175, 85670, -129222, 77611, 105709, -96821, -69909, -70607, 74290, 82727, 13372, -45091, -16373, -4716, 123109, -20260, -64526, -86053, -64534, -18677, 82263, 43865, 51645, 32496, 46771, -99479, -124025, -10499, -15414, -116068, 94684, -117020, 59114, 25926, -127709, -55440, -126893, 58627, 53318, 62691, -73264, -27516, 4971, 104166, 91938, 77602, 116393, -62652, -51324, 123090, 10505, -15803, 91234, -78537, -54533, 10148, -76434, 50457, -125498, -52716, -88105, 48737, -104710, -91384, -8550, 105903, -70706, -115649, 50254, -33542, -7803, 4233, -22985, 119421, -19558, 102704, -7299, -73186, 51612, -88017, 47456, -39906, 77321, 99250, -12575, -53434, 59074, 45571, -110721, -89846, -89803, 124729, -29541, 74040, 103538, 59589, -14185, -57867, -128133, 107944, 76410, 53931, -16747, 100205, -14015, -101227, 13469, -44273, -51434, 95879, 71987, -93964, -108332, 14892, 8668, -13405, 21758, -91898, 34533, -44223, -97731, 96125, 1124, -53350, -83780, 109252, 50898, -52105, 120217, 50342, 88222, 84045, 77456, 109144, 102141, -20104, -118371, -33218, 12055, 96716, 56319, 18839, -39008, 40564, -39470, 20677, 86868, -116366, 163, -21201, 121021, 98888, -124733, -10029, -84744, -128824, 18055, -14600, -37571, -16296, -43808, 30897, 55917, 81928, 831, -15090, 5296, 47823, -93575, -116929, -47271, -81397, 49601, 99827, -127227, -66440, 42960, 103253, 98967, -44412, -87271, 66816, -3397, -99390, 60774, 50911, -3358, 103972, -9623, -84672, 124924, 88910, -17283, -32083, -102195, -39719, -40038, 124607], +[-89183, 92869, 5951, 95199, -92898, 774, 128681, -26373, -60550, -65939, -118452, 44179, -48290, -22359, 16701, -32089, -19206, 47278, -3245, 29254, -101045, 128198, -42703, -114030, 18707, -89711, -104219, -120355, -76219, -100708, 80679, -118057, -117669, -35403, -26374, 72290, 10452, -16704, 66450, 61618, 93215, 51094, -47113, 34222, -13372, 90090, 109909, -60646, 74902, -116100, 123371, -130448, -75964, 47645, -85282, -90427, -85846, -8253, -94970, 125806, -79503, -76682, 19211, -66702, 29720, 67281, 101285, -6803, 68614, -32158, -100834, -122649, 22379, 117683, -108281, 47807, -66743, -86676, -24507, 50958, -120188, 84049, -26158, -33520, 105843, -76067, 74539, -122870, 111800, 20490, -120333, 5980, -99686, 24675, -106650, 104256, -96808, 46607, 14858, -80785, -61428, 90939, -6860, -43772, 90473, 128220, -98415, 55869, -45373, 71936, -115232, 94201, -109933, -67088, -113972, 78896, -47778, 44794, -16242, -11646, 24007, 102870, 111735, 68367, -3713, 100096, 21179, 42561, -56015, 54119, -40894, -84815, 26937, 72085, -41113, 59589, -100360, -4726, -84055, -106998, -104928, 107934, -82491, -27746, 48697, -81956, -100881, 18248, 97848, 62767, 88442, 57779, 73864, 81163, 61707, -42081, -88619, -48273, 21611, -78353, -127540, 77296, 81146, -70324, -104943, -24768, -86025, 16017, -38732, -103207, 18908, 81217, 45961, 29706, 109707, 115234, 57573, -2238, -78343, 28409, -67954, -57448, 83785, -127279, 104059, 26969, 124799, 50421, 62234, -59111, 57059, 69761, 54010, 113851, 5687, 91268, 77180, 83819, 37381, 6546, 114897, 69963, 129071, 17092, -10361, 2418, 117263, -130450, -62897, -119792, 40593, -28063, 9571, 55208, -53454, 93548, -106093, 112092, -75839, -20354, 11774, -124994, 92941, -3779, -58261, -130379, 56210, 28976, -39261, 110330, -119778, 78538, 69999, -120264, -118681, 122702, 22662, -96855, 98151, 86028, 121784, -93793, 103372, -46261, 76047, 5580, -116936, -120322, -28862, -31182, 40620, -14106, -98271, -121785, 60839, 82283], +[-129938, 21584, 125499, 95013, 18237, 115395, 36756, -116940, -746, -15276, 77928, -32654, 69113, 52056, -56367, -20084, 65070, -32895, 77132, 83693, -108199, 122632, 50329, 37666, -70837, -30137, -66008, 47090, 64279, -18174, -45138, 77706, 3316, 85527, -117385, -43535, -131040, -109835, 45943, 52773, 36461, 106578, 118443, 7889, 36696, 27620, -117563, -107797, 21452, 121992, -26043, -42647, 38742, -30949, -29526, -5795, 93918, -75089, -124276, 45556, 80547, -69820, -24248, 3914, -113414, 94358, 71957, -109552, 112029, 51507, 62714, -89154, 101954, 87795, -125850, -108882, 90711, 50113, 116519, -15453, 96647, 22939, -12583, 75588, 4034, 40781, 38189, 118963, 108818, -60880, 99208, -110955, 58823, -33596, -127742, -794, 8114, 62881, 42868, -27481, -86367, 68030, -92876, -60006, -37517, 80869, -75144, -73269, 43173, -113199, -94527, -31812, -35461, 104994, 85004, 33685, 27189, 85954, -58534, 96550, 82839, 71253, 51231, -88344, 76800, -5292, 123697, 111802, 91236, -116644, -122081, 59023, -51868, -105766, 79363, 121805, -43720, -50789, 65210, 130415, -66605, 4369, -63339, 88095, -130424, 41236, -29613, 96117, 114583, 45022, 91428, 54425, 34738, 9535, -108192, -39087, 99154, -17181, 3196, 71678, -58000, -125547, 86093, -29924, 108925, 123207, -43792, -116504, 48289, -3546, -121965, 39723, 39028, 46993, 80501, -67241, -10012, -20560, -10258, -4235, 104480, 73619, 42602, 25904, -90133, 72610, -73609, -64274, 100768, -85909, 23786, 22352, 11631, -111450, 116613, -101486, -108522, -30537, -52131, 102254, 109692, -29165, -28104, 108242, 112165, -73699, -97508, 61928, 7378, 74602, -60162, 108891, 18434, -17357, -50076, -105716, -14040, -74420, 64461, 51757, -116974, 5056, -80240, -82917, -107866, 89405, -55341, -8735, 9394, 77190, -115469, 3210, 92700, 8059, -88210, -123341, -2818, -69248, 41340, 21938, 7807, -31313, -897, 71066, -32240, 119855, -26824, 3760, 80618, 101645, -124543, -104383, -82765, 56291, -74421, -112641]] +NTT(y): [[1214221, 8100728, 6338283, 6057688, 1028491, 5765377, 5727417, 3420399, 49501, 6352687, 4583654, 3654219, 6456827, 5432026, 7191403, 5922143, 3683305, 7356858, 5387239, 6078765, 4475275, 2885782, 4527603, 1569202, 4013712, 6215282, 6712211, 5481689, 5178549, 909992, 3572790, 1372708, 650366, 5380505, 4301694, 6962541, 7536696, 2002037, 3301300, 4410783, 6083029, 2765557, 987881, 832532, 991458, 3595385, 3599789, 6061628, 6306499, 485942, 4458062, 4351568, 4850628, 6470795, 6089503, 1003576, 7914342, 8047266, 7727710, 8342043, 7565601, 815665, 3287724, 7572207, 3727614, 4454489, 1697313, 5316871, 3354495, 2884464, 7411843, 4515763, 1542494, 2936524, 6359058, 6053836, 8293535, 8065832, 7244229, 1002029, 2559642, 4549247, 4036813, 8112665, 422691, 3175448, 6963726, 5971574, 7297848, 6065314, 6400061, 281776, 5692444, 2999498, 8009570, 329469, 2728711, 4676657, 4116550, 5911640, 467154, 7076995, 628888, 7014193, 4959860, 7328949, 1470835, 3555478, 4754199, 1693198, 7711175, 5699913, 3137326, 6963121, 7949098, 6859897, 4420914, 6007296, 4764526, 1021365, 4561152, 477850, 3699383, 1676550, 7576058, 3067061, 3766431, 4875761, 5025588, 4210098, 5980934, 1626626, 1530764, 5780030, 2457642, 4594904, 7610092, 8234307, 4160976, 8142885, 5395414, 260746, 159518, 4116376, 7640429, 511448, 4663257, 400798, 6463034, 2481125, 8071223, 6490873, 6788255, 62226, 2670826, 6259843, 5988424, 1019502, 6854932, 1311669, 7215293, 86761, 3679400, 7381851, 4042068, 5004208, 2946304, 2154941, 5828049, 6941868, 660294, 6704846, 7576651, 689707, 8034260, 7913967, 549505, 4920854, 5222413, 2519753, 5522458, 1740743, 4713910, 3680369, 3969459, 835168, 4943199, 8019986, 6088220, 3985484, 6802801, 1072247, 2558654, 3745870, 1509290, 2554773, 4001572, 5180811, 1152751, 7337017, 5892846, 6327960, 4142634, 4926001, 6242434, 5411792, 6987778, 2243486, 2046750, 3741787, 6945137, 311867, 1365417, 1527129, 673415, 6650097, 8154148, 4660583, 4657502, 3256791, 4630039, 6007756, 7098397, 5309976, 86584, 43287, 3866078, 5970225, 7696354, 6794110, 1522692, 7464723, 4411871, 6421408, 5768012, 610349, 1626353, 4924708, 4622592, 2741030, 7517346, 709470, 4340953, 1983696, 528704, 6124951, 7994473, 7199130, 7170230, 5841084, 5284857, 8208474, 5920060, 2093485, 2430175, 2313157], +[1450294, 7600335, 4969116, 640451, 5892376, 6733426, 4601938, 8377860, 6246432, 5409696, 1238813, 676860, 6419778, 429241, 85876, 2858934, 7829108, 6457799, 6712300, 4018771, 4710396, 5769143, 4535750, 8285250, 7078627, 4421203, 2117335, 3566136, 4795521, 3832217, 3052582, 6386610, 6459982, 7000881, 7220645, 831610, 4857509, 7959532, 6371064, 5838148, 1238444, 3001201, 8288065, 877459, 7639876, 5878440, 7717020, 6130367, 7819327, 5383181, 4579673, 3266758, 1633350, 62582, 626663, 7779807, 7227172, 287206, 7233778, 6164375, 2459087, 5952058, 2798544, 5203762, 609992, 2565686, 1930329, 5910152, 7928492, 8230797, 5007212, 6926363, 5524635, 8127809, 4469328, 2982846, 3137133, 2783827, 3528764, 7030262, 6853738, 3381157, 1174948, 7981468, 2887749, 5331850, 276081, 2028320, 3938458, 2357421, 3379591, 4445826, 5854896, 7895491, 6120656, 798033, 3438893, 2563395, 2992660, 5309288, 343092, 5780320, 6450758, 3788311, 7733789, 3230137, 7422135, 30993, 1849765, 5886407, 345125, 6799736, 7163422, 8147327, 2850507, 740038, 1825750, 3282952, 8289303, 5964182, 1411626, 3084420, 4658070, 7126747, 7988424, 2256593, 600124, 7905823, 4521652, 2249896, 3173042, 2318433, 3286481, 5511667, 5717025, 2383657, 7723080, 5023729, 5567598, 3963980, 2375425, 345397, 4121538, 6892843, 4422930, 586649, 7443271, 3317360, 3387363, 4102713, 5724656, 2292149, 889169, 913790, 7911091, 4447392, 5151084, 7800654, 7530021, 4450617, 2474829, 7506827, 6048347, 1907629, 3007232, 4117399, 7168452, 5988523, 7358370, 7798271, 8194360, 370202, 5827203, 6302895, 1715083, 2144303, 5989779, 7936983, 6558497, 3000978, 6294814, 6574192, 3535674, 8274971, 5731891, 5718458, 5551280, 1131387, 6343886, 7561450, 880696, 1192615, 2608113, 7273921, 7768336, 424203, 196828, 2416737, 7235486, 1927037, 3210382, 7674752, 4208181, 4980223, 1347686, 1559574, 3489116, 2168654, 2894937, 3625482, 3415697, 4006145, 8342323, 422714, 4048810, 7682033, 5291569, 6537823, 302165, 6176936, 8143509, 5340600, 6976485, 6142122, 6873427, 101931, 4630772, 871834, 5175983, 4335932, 6275119, 668296, 2152648, 5990254, 2435687, 1899989, 1593546, 1155976, 8100643, 2177257, 5330743, 4166419, 7994906, 4975180, 1551983, 6143258, 1761673, 5723383, 6535933, 6262999, 5823504, 6893429, 668523, 8278975, 3920904, 8316728], +[6792338, 8017915, 1323692, 7375684, 3355744, 5738116, 3521259, 5017319, 631657, 7094642, 4183379, 6548795, 2251912, 7895582, 4192978, 372639, 4769559, 7161503, 4679566, 6857082, 3774673, 7963502, 6546950, 3834522, 4414716, 6570064, 1228789, 3748636, 699934, 1306952, 5999144, 3007111, 7757451, 5833970, 1656962, 4315003, 4348791, 1287339, 2919988, 790738, 5630851, 4101964, 4922800, 3599341, 6702383, 639047, 211283, 2588773, 787044, 4644016, 2772192, 7342919, 4524242, 7872277, 2094574, 5289933, 1299867, 7694433, 4356097, 7213062, 60271, 5906270, 1463291, 4690221, 7466600, 3023983, 240254, 5576739, 3996289, 2302798, 3510162, 182795, 4884880, 8246434, 6255658, 6106148, 1773076, 6426100, 7171378, 469721, 7191359, 2453977, 2397661, 3177428, 541871, 5848992, 29088, 3609181, 4429119, 1341080, 5352094, 2009884, 2657019, 2616827, 1143376, 4786771, 4936599, 107644, 1462511, 4525974, 3220035, 3020095, 2345414, 3087150, 3867745, 3943787, 8245118, 7043288, 1563978, 4638156, 5792544, 1042737, 6321829, 4062512, 3054084, 2612302, 2878821, 7217808, 2815318, 4372925, 2988383, 577493, 5661676, 4119329, 6599303, 7043874, 8173230, 4037610, 5292258, 136309, 689721, 2063228, 1536564, 7436941, 6594623, 6095640, 982019, 5811976, 6709749, 740120, 3901333, 4702738, 696644, 4053805, 7848686, 4534540, 2858957, 5080877, 5381283, 6217059, 467913, 528254, 3926522, 757295, 1069890, 2341681, 1329209, 3207598, 6480383, 2655709, 2506601, 399729, 2827647, 2282081, 5310004, 4627543, 33355, 4121096, 4594474, 1629724, 2642687, 6238346, 2305421, 2689699, 4674290, 1933747, 5996811, 8044099, 5553334, 5333060, 6802808, 3369573, 8038312, 25306, 6946061, 1209123, 7070509, 6136031, 8029209, 6591490, 6596492, 8135950, 3311806, 6950767, 4183793, 1760760, 2691758, 6884374, 3944263, 8039169, 1420348, 2587695, 6444888, 4447749, 6830087, 3902879, 2066142, 2414675, 95397, 2527788, 7341181, 1376319, 3676487, 1642800, 4183850, 4393310, 3773089, 2862882, 1719060, 2077584, 3913029, 1722557, 4872784, 225597, 3990287, 3071375, 2866778, 7541207, 6552634, 5734495, 5892697, 4991323, 845649, 4016383, 1650686, 3041056, 6885310, 8333488, 1912811, 6766309, 6938368, 4926584, 3251078, 4663678, 3208508, 7244430, 4753846, 2984214, 1337911, 2263810, 3544897, 7508067, 2573675, 5150369, 3060357, 5698650], +[75531, 7144838, 3145086, 1275301, 1405848, 5563101, 2736491, 5008805, 2922303, 2642105, 206378, 5398703, 5192313, 2359343, 3801539, 6475596, 5782186, 510172, 4191245, 3999524, 6310287, 485773, 2124794, 429374, 3804973, 3000733, 2946475, 1782222, 7328156, 2999389, 4386848, 2550297, 5154009, 4757724, 1019441, 5190613, 3748187, 896151, 1706156, 3205839, 6890011, 5390811, 440181, 3302175, 727920, 4840156, 1453708, 7616661, 6816798, 7417902, 61893, 5157830, 6340579, 665145, 5076767, 1732769, 7178469, 800108, 2936131, 5485060, 4609253, 6558981, 473108, 7172555, 1281994, 245795, 5584019, 66018, 6981650, 5367788, 2853158, 6144544, 5685772, 246160, 7316595, 1176399, 159408, 3191813, 1363085, 3806192, 3497713, 5004638, 1522687, 5616622, 470730, 3974082, 190681, 3279896, 7033589, 6150650, 689093, 2088393, 4340605, 5514092, 7433773, 4474534, 407723, 4593155, 1846529, 8376990, 8041615, 4842570, 5549686, 3477467, 5010373, 3676078, 7010570, 2652258, 3879769, 3409568, 8242236, 4620263, 4392816, 933109, 1787640, 3731720, 5423774, 5818919, 8359963, 5056676, 6812515, 7704991, 6508530, 719577, 5376876, 5417416, 3074882, 1758225, 1513312, 5759543, 2559776, 7518946, 2995364, 8337365, 1432008, 3664551, 6628931, 5338849, 4598690, 8229160, 8331487, 3500632, 4419148, 4366767, 3488895, 346732, 3848414, 6004091, 4125467, 496236, 636059, 1587834, 6454098, 5670633, 557342, 5363837, 525956, 677544, 1439099, 5863531, 8194201, 2740396, 5979941, 1432733, 5634306, 1838542, 7338582, 1882372, 908499, 7811373, 3845515, 5848479, 868615, 2614833, 5080326, 1367001, 3716682, 3776475, 371710, 650219, 947867, 5325942, 6490006, 4514763, 3799343, 7607113, 7316826, 4826560, 7716632, 4888465, 5425846, 6148184, 4171867, 6299850, 3151590, 7355127, 312358, 2697461, 5027388, 927664, 6515648, 6793741, 5604708, 3028471, 2189060, 2205381, 7410957, 8148090, 5384505, 453607, 1451864, 105364, 6665090, 3435708, 4810287, 3443261, 230586, 17478, 1128420, 1382851, 183569, 2885316, 994323, 1599001, 600981, 1911590, 18633, 1510443, 1124329, 5203306, 2692118, 4792953, 7420566, 2668417, 1438461, 8357324, 1895277, 222575, 7864330, 1493559, 4099445, 7244308, 1886893, 7203743, 1505290, 2850621, 2381978, 39519, 7499402, 1858615, 6681129, 1649513, 1804081, 1315678, 301241, 3194475]] +aHat * NTT(y): [[4144274, 3882210, 6189089, 2800333, 7170079, 1955717, 2067521, 6335262, 3712617, 3998888, 6100077, 4572472, 1409300, 7600513, 2539865, 7696729, 7168397, 4059264, 1483606, 1202122, 7497155, 5306702, 8108071, 5084950, 2451769, 6850864, 825665, 2706020, 337052, 8085330, 8071026, 686285, 5128845, 7834920, 3786674, 5786834, 886303, 4349147, 6403963, 7738178, 8043410, 664146, 2224473, 3785684, 5453763, 7410122, 6576050, 4888548, 7204709, 1050302, 3890917, 2689953, 1023061, 8319709, 4721202, 7386291, 5379876, 2194838, 1297802, 675432, 3735745, 3523094, 4865252, 3471405, 5727577, 7174662, 4897457, 5057175, 1876580, 7432031, 3924620, 1701595, 649297, 1857091, 323528, 3165593, 2681704, 6047248, 3965532, 7814313, 2119878, 8067580, 4000374, 4554383, 6403311, 5948918, 3685423, 1908012, 420264, 5349926, 4654511, 3221351, 7681492, 3981112, 6388845, 3904716, 4797659, 4518555, 6706259, 564103, 6112714, 4361351, 5984502, 2272797, 4740989, 11816, 143248, 7463577, 347639, 6679251, 6705835, 6845785, 4054627, 6614122, 795643, 5774979, 4200013, 8078417, 1464582, 1441055, 298495, 3941806, 7202076, 1185948, 5540222, 4457463, 8132816, 6387087, 3492343, 3625822, 501026, 7976862, 4361016, 7427868, 3105685, 867213, 131258, 2905951, 6210916, 3101158, 763342, 8176843, 4032839, 5591695, 5314452, 6533064, 5579623, 4920002, 3933866, 5583038, 350131, 4389643, 8279051, 4437228, 6803463, 696486, 771147, 8311848, 1236218, 7099074, 7671952, 2779216, 5722795, 4182132, 7396608, 7972044, 8218885, 1088582, 5107062, 683038, 110671, 7822081, 1506962, 7239329, 6738873, 6300221, 341687, 1207159, 5115690, 6285552, 7140798, 7908220, 6844030, 3462309, 427478, 8220817, 7812996, 3017072, 8075507, 5014500, 5293767, 5196505, 330973, 277826, 5782650, 4815922, 603819, 8095184, 5815112, 3890090, 3599719, 6947198, 5529166, 5403879, 5967639, 1827159, 449565, 3226207, 7096242, 3148589, 288262, 4637948, 3903066, 1966570, 7544432, 1266919, 1871975, 2814281, 4832984, 7587970, 6539739, 3078897, 5852852, 5615308, 2280117, 1046783, 6464821, 1765079, 1102385, 6747240, 8308562, 4496111, 3375685, 2923931, 2633909, 158531, 6378761, 8118144, 8092436, 6889707, 7173652, 6524258, 2527895, 5395555, 5041932, 7972812, 4069069, 188182, 3275869, 790387, 485455, 6812533, 996658, 939364, 2552181, 1907716], +[3310673, 6584723, 4256821, 4423043, 5740081, 7152419, 1107188, 2857595, 3501440, 7926395, 238828, 6471303, 6091950, 2530605, 7739399, 32332, 6084313, 4682895, 4264754, 3328161, 4107367, 617806, 6862784, 1602423, 6148799, 199772, 4518004, 3273533, 4065189, 1376919, 746451, 7067797, 4841202, 6098944, 5202174, 596572, 7843656, 2518681, 2824115, 5421574, 6674394, 5108430, 3466094, 1465585, 7621319, 614772, 1475818, 1257007, 3537333, 4196340, 4074835, 2341140, 5248957, 3622460, 3645651, 872662, 6415900, 531990, 6874385, 6691947, 1949091, 7705466, 8283039, 5073405, 7626706, 7149173, 5016725, 503084, 618275, 6972755, 7476410, 2246886, 1862074, 2879809, 6450141, 4934657, 7640140, 1929716, 6089702, 6406014, 3912126, 1596082, 5730190, 4572350, 6465763, 522098, 6452647, 5470610, 5716945, 3752330, 7634172, 4912428, 6237447, 4397056, 37478, 7553062, 3406767, 4365124, 2825195, 3809909, 5793781, 7739563, 8270188, 1514790, 4597110, 6874705, 5100592, 1679612, 6818076, 2122654, 4351637, 1207094, 3295383, 738372, 6121733, 7855408, 3688859, 1862294, 7153220, 8042167, 4462015, 4495780, 4412720, 1814850, 92074, 6360041, 3673307, 2322117, 476052, 7906465, 7623357, 8207198, 423149, 3667806, 534277, 1207814, 5535931, 7188756, 406098, 5249190, 1505526, 7906197, 6470709, 4728109, 228471, 2570782, 6410928, 219006, 5172495, 766605, 754842, 2178103, 2248660, 8376797, 6741810, 2181779, 1110677, 8229268, 1090553, 124028, 5324052, 1524586, 4946426, 662925, 7164404, 7622807, 5730833, 4233721, 8254985, 719775, 3751417, 5608725, 3038436, 4972086, 5254433, 3438390, 861972, 1403151, 7515739, 4444154, 7309743, 4465965, 7481136, 7634920, 4196761, 2513661, 7218961, 7748591, 5102932, 3371344, 779501, 8013332, 444990, 617866, 47945, 1952276, 4620586, 1567141, 6884371, 4426593, 5288319, 2002666, 6635384, 2336825, 7314293, 5552410, 7161424, 2326526, 7385512, 5203089, 1278344, 2597734, 6669418, 716918, 7267912, 3972873, 3266810, 7514690, 8170177, 4168202, 7669663, 7116283, 3377758, 6841918, 4229241, 5648224, 3848207, 5908751, 5152678, 5100878, 2252324, 4689949, 1895267, 5205668, 6482314, 2675218, 3598946, 5241833, 7226258, 2702358, 4866154, 2472614, 1294442, 3355639, 6391995, 3867390, 499557, 8291174, 2832166, 414677, 7160097, 1563257, 8076795, 1899047, 5024272, 746138], +[1863462, 8228515, 4510511, 4521813, 291945, 2732465, 1561462, 4159181, 6089267, 7917695, 4066511, 1527438, 8077015, 2407716, 7251305, 6955545, 3737560, 3824978, 5354649, 6765640, 832991, 3310249, 3301881, 3842493, 6920664, 4096078, 2288058, 663410, 1940270, 5144295, 3144197, 1908700, 6111344, 4984527, 4583056, 232774, 4172557, 5953582, 2900140, 1321567, 781413, 1475216, 35758, 8269624, 200628, 7375241, 7751897, 8000001, 6376844, 7643741, 1782649, 2871982, 5685188, 6816062, 6265747, 3333818, 5339377, 6062400, 8231353, 5151547, 1303032, 7605467, 4219679, 3032562, 3051528, 6133923, 2938662, 2619875, 4687130, 3210914, 2820886, 3422846, 1113189, 3119335, 6497951, 3927393, 79714, 5741686, 36594, 4895530, 4190231, 2558019, 4043456, 1540910, 1587164, 6399679, 1677417, 6753898, 1686789, 3985346, 3554817, 7801860, 4532268, 5919789, 6821591, 7734612, 6888264, 2034397, 2471044, 1882894, 8231596, 5645462, 8232577, 1296774, 1103312, 1160597, 1381391, 3612644, 5779139, 2345767, 5201181, 6945911, 4684891, 5788782, 5808285, 8193565, 8152741, 3611692, 4142311, 5065162, 6998906, 3908297, 4175995, 3179810, 4281508, 2731089, 5994007, 191394, 3228014, 2884452, 5929987, 2942005, 3710162, 3020925, 3385861, 8032500, 3842892, 7907684, 401459, 5165860, 1932631, 7834403, 7088028, 4403901, 6819251, 716477, 1286410, 5810459, 5949895, 7032372, 8127872, 4674850, 3437902, 5245959, 4975012, 8131826, 2001019, 6819916, 6914547, 5772646, 2463634, 8181397, 4652644, 2755504, 2929339, 77362, 5370152, 185408, 4498664, 1879417, 6903199, 7299061, 257387, 7847557, 4306113, 5224341, 4322346, 4487204, 3603019, 1801132, 8257892, 4366050, 6605828, 1730509, 7430147, 4894290, 4095832, 3257758, 6023227, 621909, 1007919, 6655508, 1591725, 703111, 1079906, 3575857, 3294936, 638211, 781677, 6421764, 5395440, 3829719, 665702, 8965, 7054306, 6879192, 6166146, 3103988, 3627697, 5677764, 6529684, 3703970, 495370, 4853262, 3971411, 7673028, 6565599, 4298940, 5944960, 5391356, 3518962, 8361170, 7485150, 4149503, 7343899, 4288844, 2972189, 7742445, 7891923, 322846, 7892745, 7513844, 3160236, 2337094, 8342188, 4527148, 6736737, 4076970, 6181368, 3526924, 3071723, 7395158, 431786, 643529, 6405, 4968036, 2043582, 2502842, 6020143, 2084658, 3470467, 2138911, 1631425, 7017406, 4017458, 6873776], +[2893199, 4157094, 5114382, 624703, 3252593, 7160788, 794359, 3458378, 5232909, 4068826, 1104109, 6294713, 5605266, 3178350, 214573, 5987820, 1478815, 4367625, 7198071, 3046495, 2215954, 6460587, 5393865, 7750735, 6411944, 7321206, 1012716, 1449409, 55254, 2174016, 2865714, 6535046, 8319332, 7494330, 2848521, 4282859, 1310301, 5911919, 113557, 167062, 2009906, 3196461, 3058256, 1276542, 4260348, 7489333, 6611486, 5757423, 156404, 3696955, 4669080, 3420771, 2851837, 6670984, 6421205, 2418186, 1618023, 6202753, 3912907, 2281466, 7383963, 4032687, 1893353, 698123, 1241904, 6036994, 7621466, 444040, 7206733, 7475738, 4296405, 5394445, 5548077, 2270635, 2896415, 3971895, 4957889, 1044531, 3509764, 1057374, 142908, 189532, 4348456, 3855838, 2201429, 927945, 4730167, 2686192, 432497, 8152866, 7811321, 5283853, 1120740, 5684551, 2103035, 8096754, 1999760, 2703355, 5833296, 1743509, 5769198, 6154688, 5702154, 2879151, 1998827, 5354998, 1153545, 3236196, 2311514, 1091594, 6803587, 3035718, 7830864, 7365957, 118029, 5796654, 2898869, 5791908, 4248808, 3571860, 5786550, 1694033, 7880676, 6300836, 6752109, 2980795, 6555008, 7185482, 7096997, 666958, 8341240, 487708, 1203927, 1285412, 4247534, 6080137, 6420107, 7894228, 7575048, 3765019, 4733118, 3555864, 2527610, 2030926, 3834391, 4206352, 1648992, 5309696, 6173724, 7612515, 4009315, 2889966, 1950353, 3261490, 1559693, 3940970, 5809863, 194098, 2742500, 5909317, 399034, 3710235, 4527618, 3733296, 8232010, 2135703, 1212383, 7473109, 4716837, 2675752, 3595095, 5751270, 1509654, 6773794, 3140435, 7536971, 6242543, 5085144, 3373029, 8297294, 903555, 6141296, 7663413, 3595264, 6804962, 2418131, 8117535, 1168082, 3559354, 4288728, 6444103, 3261400, 1312794, 4148734, 6597991, 1210027, 2597178, 78583, 4420719, 7204203, 5577092, 4655560, 1010485, 7515016, 2217964, 4385486, 4383892, 1874480, 1610375, 3646462, 5189649, 5858396, 2556796, 6181906, 4213927, 7599387, 3776794, 5875577, 2817437, 1585748, 4632038, 3820162, 5878402, 2442252, 506218, 2501130, 2225710, 1968322, 4319111, 6905736, 2400751, 1605052, 6875547, 277138, 2544234, 1359483, 1109025, 974980, 1952090, 5985380, 571094, 4703785, 2144204, 1480602, 6507379, 7135800, 3706793, 6318609, 2826810, 456600, 6403527, 6126876, 4414789, 7990540, 4777506, 1969069]] +w = NTTInverse(aHat * NTT(y)): [[5240747, 5672693, 3227538, 5608643, 7376451, 6268395, 7842310, 742097, 1523549, 832881, 501924, 8067281, 6329495, 5504776, 3971888, 3801791, 4117407, 6478341, 2044156, 4245917, 6845811, 5187328, 7202402, 132576, 2973864, 3083763, 302412, 1720639, 7057094, 2524533, 5042064, 3599604, 6848856, 2731174, 7342942, 6450165, 1980970, 5897922, 4130069, 7389301, 7300570, 4744648, 2426563, 3852275, 3488525, 2280443, 7124268, 7590420, 2647237, 7998436, 5393177, 5633010, 6830940, 4848716, 4394142, 2495788, 6551700, 1688296, 548462, 3988400, 6527720, 4933464, 7665692, 1326029, 1516316, 3770183, 7816033, 5773859, 5063489, 8331669, 249865, 2543470, 4343337, 3966017, 1354714, 7497374, 757590, 8350046, 5989356, 1766692, 3196249, 3257950, 1102775, 6794739, 6709857, 7652958, 4962759, 4217553, 279543, 3996828, 5422508, 996570, 4230292, 1848464, 4362788, 5392107, 5452405, 5070186, 4205000, 5815772, 2596502, 784391, 4842747, 750757, 735549, 1580091, 7884651, 7809786, 1830210, 7939330, 7195384, 5256472, 4187312, 8089158, 2473883, 371460, 8367488, 1553296, 8135784, 31569, 929530, 3904674, 3604817, 3641032, 5216924, 1999566, 3020352, 230736, 6684437, 131984, 7940540, 3017812, 3704888, 7936164, 6134995, 3451266, 5394412, 193176, 6421784, 4609355, 2581791, 6067133, 2566648, 3216610, 166624, 2000942, 5056112, 8323814, 3908194, 8004673, 2632282, 2754041, 6884513, 2991808, 864632, 3663442, 4878602, 1016755, 4680101, 8213279, 1551614, 7035006, 4825567, 6221821, 460349, 4390147, 6216168, 4067523, 5040720, 3454257, 6810282, 4250322, 4437033, 8182814, 5415801, 6751259, 3754036, 5740963, 1658612, 3221233, 2787967, 7245169, 2938437, 6782459, 7376991, 3686538, 415207, 7442012, 5599946, 803012, 2662455, 4225029, 1532350, 839362, 4384986, 2927226, 4545225, 8052407, 2750653, 6448225, 5601627, 3556228, 5844593, 1394193, 5775775, 3999132, 2465249, 7126096, 5045765, 7056753, 5456519, 7031953, 8251598, 7902156, 2794665, 1770555, 5712115, 1588768, 2397968, 5079326, 831379, 5482259, 463048, 6307231, 5288168, 626211, 2831874, 1998765, 7987835, 5145889, 1892307, 3756507, 6304023, 8113079, 2862649, 705318, 3296139, 7281485, 7935359, 7029680, 1031804, 5814077, 1065813, 5413058, 5261434, 7031552, 524666, 5598565, 3519255, 7258729, 6343450, 5852651, 7410679, 6370965, 5275666, 2377834], +[2372408, 5148935, 2871099, 2339952, 942158, 6919222, 6738035, 4755467, 3688906, 3143494, 7888297, 6002947, 5360600, 133898, 7624213, 4333442, 2758162, 3938280, 4684260, 3361731, 6744937, 1025626, 4106406, 3133840, 2587414, 2317745, 2248246, 1491727, 7768858, 518974, 4890218, 1170283, 4044416, 8243589, 4880109, 3982734, 163778, 6180136, 642041, 3958715, 640528, 4500758, 936883, 3420855, 903676, 4279283, 2640041, 7037250, 2639949, 1021221, 8287786, 2236790, 5146386, 7814187, 2519268, 3027913, 2698240, 1436239, 5753935, 8331629, 8190721, 2884215, 4592001, 7115430, 1658135, 8055933, 3395864, 1055723, 1286332, 2266150, 4925780, 1342753, 7221629, 3275889, 420036, 4383787, 6596804, 4886364, 403728, 7403839, 4590800, 6241413, 979285, 5805919, 595049, 222061, 8296360, 2297330, 762009, 3711511, 4123904, 2236314, 1346340, 2496854, 6082325, 6285886, 639722, 7091728, 7790192, 3021490, 3162602, 1554899, 7959942, 264931, 2266931, 7907517, 2882008, 3835841, 7204516, 4131753, 4204147, 1688229, 2472738, 7043048, 2723839, 6618718, 6159021, 1917291, 2799286, 813030, 6562778, 2283152, 7531518, 3048208, 7886025, 5373703, 4602442, 5956585, 779518, 5276990, 359411, 6385168, 4082249, 8027961, 732873, 3848337, 6976544, 3318429, 1899046, 6614440, 3442407, 5616118, 2521541, 7103084, 7143073, 3338908, 7157962, 3655372, 2579438, 5406730, 7075296, 2214366, 7671568, 3623416, 2421205, 380746, 448692, 2157547, 6866378, 7334276, 7638301, 1761595, 1814677, 1102698, 1455103, 7151160, 6252901, 5405069, 3398018, 893065, 887005, 3177102, 8059571, 3308680, 4888893, 227522, 7390213, 2003790, 1200007, 3803506, 7589557, 8084676, 7091448, 5277859, 664533, 7286025, 4425325, 6503114, 6216497, 3216404, 8371159, 8144692, 4600578, 906457, 7670130, 8017550, 5357653, 5096774, 5100613, 7061785, 2503106, 7871969, 3504264, 350901, 5773984, 4568479, 5154200, 456180, 6150492, 1894436, 5146415, 5942729, 1197350, 1963713, 4963992, 189838, 7231182, 3010, 5231405, 7331436, 5306107, 11532, 7777916, 3846343, 5028605, 1720909, 3503617, 386350, 2110826, 2216524, 7217965, 5166180, 5935291, 7206917, 3388964, 3890310, 7959534, 2412120, 2421416, 894625, 4708212, 4941244, 3274949, 4808792, 7715243, 4972535, 1887560, 5520257, 6912844, 869584, 2380688, 4562925, 7629920, 3259665, 1755072, 3470501], +[3622494, 6849580, 8092213, 2176282, 6904567, 3383684, 1516101, 4569658, 4392041, 4746397, 384707, 1416563, 2912589, 3089735, 7588573, 6817864, 4989858, 921962, 6837918, 7653782, 370780, 7331204, 3899889, 852672, 7500533, 7847951, 3843392, 293214, 2311605, 645246, 2891830, 599168, 4129941, 1769792, 4637871, 8210557, 6621796, 3344046, 2692818, 5086533, 1167581, 479620, 4077095, 8133417, 7377655, 1500449, 6555264, 2770166, 250407, 1822035, 5862085, 3588964, 7176297, 4900688, 6225743, 5094498, 4432985, 1275089, 6057134, 4094413, 8262040, 5346419, 3865417, 3458155, 6437287, 4032994, 8180652, 2417033, 8015675, 1205608, 6349312, 435739, 6895282, 7722035, 3206064, 3440389, 4166859, 7992685, 4593815, 7432299, 4786788, 6757075, 1471102, 7515584, 2860714, 5557268, 3028178, 7457854, 2690909, 3929688, 2556162, 8264578, 3097217, 8196621, 4597343, 5600906, 66060, 242843, 3839856, 3736533, 8109556, 5776139, 7848546, 5273387, 7544859, 8155973, 3067151, 385241, 5448210, 2681498, 6324306, 1699867, 2061127, 5875578, 5481315, 761470, 4182775, 306710, 3919797, 6137526, 4685491, 2459267, 2541842, 1309515, 54707, 4115861, 6384958, 4810291, 174287, 4563127, 2374644, 985515, 7720036, 6044326, 7119367, 5875106, 1349751, 6703156, 7718450, 5136671, 3614071, 2694005, 8190231, 2113041, 3358374, 2319291, 5921987, 4609745, 3894305, 6133312, 5492359, 4291965, 7299498, 2132622, 3284134, 3667456, 4248642, 6794917, 6340304, 3815553, 1392962, 1358167, 3995327, 1753113, 7969634, 6981901, 8062522, 1575657, 2742903, 1783441, 5014424, 5600572, 6144808, 4913785, 5774805, 3057978, 1382027, 6998770, 7512962, 1634783, 7737997, 5834171, 3535265, 495038, 4368444, 3491532, 7256577, 2168522, 4410372, 7488221, 7502775, 2079786, 1689590, 8217265, 389526, 7692057, 664208, 4538111, 7640137, 1407809, 466377, 6923395, 4180491, 4355239, 6915708, 3376592, 4819809, 5850008, 435191, 788446, 4526079, 406052, 1297933, 1748696, 7312568, 6854101, 2960580, 2777276, 782110, 6657166, 89213, 1777360, 837904, 5691196, 6123731, 2450395, 2140829, 835885, 7372722, 4845784, 4459638, 6960650, 6482154, 5732863, 7671172, 834450, 8185890, 7854399, 4675607, 5371078, 932390, 3911429, 5507192, 5705134, 3050038, 2762170, 4515537, 8334988, 7161755, 7069872, 7340379, 4728511, 6659351, 6996066, 242550, 2250930], +[882108, 511705, 845173, 1559300, 1522215, 5680306, 2929296, 355960, 1660697, 8044881, 1202084, 3487501, 3016183, 3704534, 3797478, 2093828, 3145046, 7780597, 341953, 2356399, 2659543, 2459566, 263214, 8178617, 2516685, 2079118, 2710125, 3967245, 225744, 5173194, 6894647, 2194676, 6824368, 6360608, 2473485, 6679687, 7384007, 2616069, 5371742, 118010, 938139, 1938537, 509060, 3839143, 4652224, 2839677, 7990397, 5329606, 2600008, 6261443, 2978851, 3480065, 6089332, 5264862, 1723491, 1436502, 2352586, 7519934, 831696, 2364121, 4206141, 1977072, 666415, 4810798, 2987887, 6243866, 1205281, 4591008, 2945634, 1312375, 3265493, 6591275, 4583142, 624725, 2215596, 4731326, 1380294, 6064913, 6069760, 4934519, 5669881, 4949154, 2147281, 2659524, 7237966, 3502709, 8345051, 3215216, 5999220, 6508105, 8231826, 5836690, 4274766, 6144633, 607249, 363036, 73549, 2806452, 4770069, 3815458, 4763934, 7805658, 1142346, 7321343, 5990111, 7534253, 2257202, 2004873, 6363291, 5007230, 7648911, 3737281, 2336716, 6995648, 6498869, 5071227, 1735654, 3267753, 6569470, 4207762, 1850981, 67973, 7259357, 1094882, 7123714, 6354580, 1385379, 1400880, 4693889, 3935715, 5072713, 7413756, 4214246, 6182859, 4775054, 2703730, 602984, 151265, 7062311, 3709874, 3035746, 3680113, 7722638, 6841570, 2739151, 2719607, 1736021, 3417108, 6934077, 265492, 3084409, 6258644, 6473107, 6948633, 2896707, 4443152, 7948315, 6292580, 2358615, 1340536, 8052109, 4997192, 3525338, 6226753, 3870815, 2555135, 4601312, 5001999, 6588357, 136836, 3329409, 3022544, 4179507, 2195831, 342767, 7953085, 6790691, 4948438, 6050240, 1274475, 1008380, 6777100, 3834396, 103282, 2175452, 4517483, 2882968, 2036959, 6167178, 4123601, 6814078, 3042355, 4928589, 7659749, 6811725, 7924782, 4350315, 4277532, 8121446, 3906134, 7678818, 3039607, 329100, 3250147, 4536479, 8102324, 3122349, 3258331, 5543485, 1623554, 2961601, 531164, 6989857, 3155291, 3992890, 3249006, 6998705, 3427240, 5841005, 4726045, 5077683, 3684412, 7907166, 7851733, 6230450, 5620145, 1891732, 7588632, 5013068, 2240931, 3948644, 7779383, 1869245, 8353876, 8096887, 3859237, 6343444, 8023541, 4925356, 312282, 7807601, 1224819, 5099734, 5354219, 7401201, 8089955, 6744198, 1766930, 7923437, 2036298, 2238041, 3017653, 2149442, 221260, 5037404, 7018813]] + +w1: [[28, 30, 17, 29, 39, 33, 41, 4, 8, 4, 3, 42, 33, 29, 21, 20, 22, 34, 11, 22, 36, 27, 38, 1, 16, 16, 2, 9, 37, 13, 26, 19, 36, 14, 39, 34, 10, 31, 22, 39, 38, 25, 13, 20, 18, 12, 37, 40, 14, 42, 28, 30, 36, 25, 23, 13, 34, 9, 3, 21, 34, 26, 40, 7, 8, 20, 41, 30, 27, 0, 1, 13, 23, 21, 7, 39, 4, 0, 31, 9, 17, 17, 6, 36, 35, 40, 26, 22, 1, 21, 28, 5, 22, 10, 23, 28, 29, 27, 22, 31, 14, 4, 25, 4, 4, 8, 41, 41, 10, 42, 38, 28, 22, 42, 13, 2, 0, 8, 43, 0, 5, 21, 19, 19, 27, 10, 16, 1, 35, 1, 42, 16, 19, 42, 32, 18, 28, 1, 34, 24, 14, 32, 13, 17, 1, 11, 27, 0, 21, 42, 14, 14, 36, 16, 5, 19, 26, 5, 25, 43, 8, 37, 25, 33, 2, 23, 33, 21, 26, 18, 36, 22, 23, 43, 28, 35, 20, 30, 9, 17, 15, 38, 15, 36, 39, 19, 2, 39, 29, 4, 14, 22, 8, 4, 23, 15, 24, 42, 14, 34, 29, 19, 31, 7, 30, 21, 13, 37, 26, 37, 29, 37, 43, 41, 15, 9, 30, 8, 13, 27, 4, 29, 2, 33, 28, 3, 15, 10, 42, 27, 10, 20, 33, 43, 15, 4, 17, 38, 42, 37, 5, 31, 6, 28, 28, 37, 3, 29, 18, 38, 33, 31, 39, 33, 28, 12], +[12, 27, 15, 12, 5, 36, 35, 25, 19, 17, 41, 32, 28, 1, 40, 23, 14, 21, 25, 18, 35, 5, 22, 16, 14, 12, 12, 8, 41, 3, 26, 6, 21, 43, 26, 21, 1, 32, 3, 21, 3, 24, 5, 18, 5, 22, 14, 37, 14, 5, 0, 12, 27, 41, 13, 16, 14, 8, 30, 0, 43, 15, 24, 37, 9, 42, 18, 6, 7, 12, 26, 7, 38, 17, 2, 23, 35, 26, 2, 39, 24, 33, 5, 30, 3, 1, 0, 12, 4, 19, 22, 12, 7, 13, 32, 33, 3, 37, 41, 16, 17, 8, 42, 1, 12, 42, 15, 20, 38, 22, 22, 9, 13, 37, 14, 35, 32, 10, 15, 4, 34, 12, 40, 16, 41, 28, 24, 31, 4, 28, 2, 34, 21, 42, 4, 20, 37, 17, 10, 35, 18, 29, 13, 37, 38, 18, 38, 19, 14, 28, 37, 12, 40, 19, 13, 2, 2, 11, 36, 39, 40, 9, 10, 6, 8, 38, 33, 28, 18, 5, 5, 17, 42, 17, 26, 1, 39, 11, 6, 20, 40, 42, 37, 28, 3, 38, 23, 34, 33, 17, 0, 43, 24, 5, 40, 42, 28, 27, 27, 37, 13, 41, 18, 2, 30, 24, 27, 2, 32, 10, 27, 31, 6, 10, 26, 1, 38, 0, 27, 38, 28, 0, 41, 20, 26, 9, 18, 2, 11, 12, 38, 27, 31, 38, 18, 20, 42, 13, 13, 5, 25, 26, 17, 25, 41, 26, 10, 29, 36, 5, 12, 24, 40, 17, 9, 18], +[19, 36, 42, 11, 36, 18, 8, 24, 23, 25, 2, 7, 15, 16, 40, 36, 26, 5, 36, 40, 2, 38, 20, 4, 39, 41, 20, 2, 12, 3, 15, 3, 22, 9, 24, 43, 35, 18, 14, 27, 6, 3, 21, 43, 39, 8, 34, 15, 1, 10, 31, 19, 38, 26, 33, 27, 23, 7, 32, 21, 43, 28, 20, 18, 34, 21, 43, 13, 42, 6, 33, 2, 36, 41, 17, 18, 22, 42, 24, 39, 25, 35, 8, 39, 15, 29, 16, 39, 14, 21, 13, 43, 16, 43, 24, 29, 0, 1, 20, 20, 43, 30, 41, 28, 40, 43, 16, 2, 29, 14, 33, 9, 11, 31, 29, 4, 22, 2, 21, 32, 25, 13, 13, 7, 0, 22, 34, 25, 1, 24, 12, 5, 41, 32, 37, 31, 7, 35, 41, 27, 19, 14, 43, 11, 18, 12, 31, 24, 20, 32, 29, 23, 38, 11, 17, 19, 22, 36, 33, 20, 7, 7, 21, 9, 42, 37, 42, 8, 14, 9, 26, 29, 32, 26, 30, 16, 7, 37, 39, 9, 41, 31, 19, 3, 23, 18, 38, 11, 23, 39, 39, 11, 9, 43, 2, 40, 3, 24, 40, 7, 2, 36, 22, 23, 36, 18, 25, 31, 2, 4, 24, 2, 7, 9, 38, 36, 16, 15, 4, 35, 0, 9, 4, 30, 32, 13, 11, 4, 39, 25, 23, 37, 34, 30, 40, 4, 43, 41, 25, 28, 5, 21, 29, 30, 16, 15, 24, 0, 38, 37, 39, 25, 35, 37, 1, 12], +[5, 3, 4, 8, 8, 30, 15, 2, 9, 42, 6, 18, 16, 19, 20, 11, 17, 41, 2, 12, 14, 13, 1, 43, 13, 11, 14, 21, 1, 27, 36, 12, 36, 33, 13, 35, 39, 14, 28, 1, 5, 10, 3, 20, 24, 15, 42, 28, 14, 33, 16, 18, 32, 28, 9, 8, 12, 39, 4, 12, 22, 10, 3, 25, 16, 33, 6, 24, 15, 7, 17, 35, 24, 3, 12, 25, 7, 32, 32, 26, 30, 26, 11, 14, 38, 18, 0, 17, 31, 34, 43, 31, 22, 32, 3, 2, 0, 15, 25, 20, 25, 41, 6, 38, 31, 40, 12, 11, 33, 26, 40, 20, 12, 37, 34, 27, 9, 17, 34, 22, 10, 0, 38, 6, 37, 33, 7, 7, 25, 21, 27, 39, 22, 32, 25, 14, 3, 1, 37, 19, 16, 19, 41, 36, 14, 14, 9, 18, 36, 1, 16, 33, 34, 36, 15, 23, 42, 33, 12, 7, 42, 26, 19, 33, 20, 13, 24, 26, 35, 1, 17, 16, 22, 12, 2, 42, 36, 26, 32, 7, 5, 36, 20, 1, 11, 24, 15, 11, 32, 22, 36, 16, 26, 40, 36, 42, 23, 22, 43, 21, 40, 16, 2, 17, 24, 43, 16, 17, 29, 9, 16, 3, 37, 17, 21, 17, 37, 18, 31, 25, 27, 19, 42, 41, 33, 30, 10, 40, 26, 12, 21, 41, 10, 0, 43, 20, 33, 42, 26, 2, 41, 6, 27, 28, 39, 42, 35, 9, 42, 11, 12, 16, 11, 1, 26, 37]] +w1Encode: 9C17756798120831A861575196B858E4660610242465A34DA4738ACA679D66D6501253A28ECA79647635623254A2861E08957A1B103457759C04F02551649023AA5941C515967271DD667D0E91110492A68A6A7296DA0800B20245354D9B020563A042930A4A5C20620ED844C1B20195EA3824544C5A91AD489985C215569A445AD7CA8D9497448FF990E7249C1DE15808713D98EA88DDF41D5ED5945AD9956BFA241ED26C442784DCF028EAA650E1FA1091A996C567705C397492197E67C831CCF6300539665394825C805E4E95496361410EC320E9A019D5AA5501385403564885E5944E01305BDA400EE201EB8395892A1907A31D66245CA3269C585878430030C4643147038643994211A2068CFA50A665254DE98CA0F21022834229877D042788954A5065A48C52D794A6644E0E5732E8D408C2429E68A2188819725251446AA405E76250A85A728379896104AC5881AADCB6954D2A091EB609A0B27D86A20526B0991C90525A22090B636E9F29516AD314991665A9A67464C16068944813A92EA4846057261C0F84925A41A2824911674A09CCF00C5682ADA3E46CC650AD27223E81F24DA6166ED701562B474962B536AA110A641A49968A9DD9889C4F079D4ED5ACD08A75404051AB9772E80A099D1326CBD71196508159D31C80256601C61429587EC7986E93B32E12F36114D85DE6124D161952C751256AA9224EA275A0E641477926E9370D97642ED7792EC92AA003861E02695DA4947D028109476292D0438C40427860B310677695A287126B9A7145D579D08301667966631930C5402088F708896A48D0442D512A304E13ACCDE254C1463264D88CA7C305853250D8A3724E0849209720CC4930963264506860CF118DD8C06407086A9EB638A604449FB87E163808C09351596A981FCA2CA186524C296E49245A0A601A65781C59B59D16983943504ED094928E934864008522F95C6AC81CAA36855483696310411623A8A4061E0549050BF62CA045421A4AAA97B556282444D80A455D020D655445A5F465DBA4A6A1A7A01A53A50AB052A1AA09A9B171A73A26EAC2404BA095 + +cTilde: 46BAEB4009DF2B220F63EA24CA5D78B6DBE55E79A43FD7C75E388A7D452FB673 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, -1, -1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0] +cHat: [8110504, 2195769, 7566973, 2910762, 3505275, 6397897, 920962, 28410, 6598986, 3325059, 1145153, 4452863, 1584934, 7058133, 1066261, 1746632, 3585289, 3166284, 7781596, 3970761, 7075247, 5330288, 4962103, 3633816, 217062, 8117932, 4997044, 6343477, 7817485, 5434992, 4512542, 6809906, 5839438, 94740, 2636891, 6562079, 6671614, 5069468, 6885243, 350327, 6443213, 1886744, 1090774, 8175847, 7074731, 6608162, 316384, 1386027, 6276796, 149594, 7478900, 1214048, 1468380, 7916914, 1548103, 7155476, 3437696, 2842516, 3835414, 8345777, 6168324, 2945192, 1541311, 4767241, 3567756, 1196448, 6971448, 5171065, 2574561, 5635049, 4679109, 7233581, 1119849, 4837544, 4443136, 6980511, 6975530, 2639231, 2414260, 1544636, 466364, 2890317, 6721280, 7792751, 4080147, 3196631, 655656, 5788347, 5436759, 5534645, 3517194, 4251468, 3800478, 8063788, 6510714, 7657592, 4570077, 7159631, 4583726, 1654455, 5039134, 557175, 2332128, 2598376, 5210004, 6901770, 366465, 2344615, 6978013, 8090561, 7408721, 308107, 3364662, 2182763, 7639217, 8254501, 2053304, 2887774, 2490119, 5596991, 7159367, 310130, 1447993, 6519709, 3789856, 1627245, 3421697, 7357630, 2357534, 1879348, 2216282, 2857379, 5055550, 5387204, 3997724, 6733875, 2314522, 4118492, 5242252, 649327, 1559620, 7753949, 1759098, 5722165, 2094882, 6967191, 1094089, 121266, 1912749, 150960, 4487173, 7565554, 3650848, 4880874, 1188432, 299210, 487917, 6385094, 114848, 1442400, 2885870, 3347390, 2440064, 7030575, 1452060, 5410390, 1901664, 2424686, 4217219, 2659041, 8122400, 990061, 7286790, 1969977, 3085123, 2498207, 976008, 2275948, 5142636, 6686882, 2229822, 5654527, 6570724, 1796428, 4401718, 6514587, 7775605, 7208957, 4009802, 2822399, 6901678, 3514630, 7858984, 5911282, 3032251, 5300824, 1889584, 129942, 366928, 443241, 8114435, 374552, 6003794, 2436631, 6238948, 384228, 8304433, 6015748, 7291874, 484730, 2698073, 2215891, 3269857, 3640389, 4184859, 7652681, 5968899, 6497699, 1677880, 115890, 2043367, 659406, 6193083, 8211227, 3892219, 4816700, 7523799, 6657420, 2209508, 8123618, 6753311, 5466465, 5728007, 1391988, 938504, 7799864, 2102793, 8115356, 6735407, 1406325, 3622418, 6136133, 1529033, 7082590, 4364744, 6433168, 5911726, 4847497, 6324685, 3290444, 2433772, 7237518, 3320052, 5914698, 1053773, 1778616] +cs1: [[6, 4, 15, 8380412, 9, 3, 8380412, 13, 6, 15, 8, 3, 13, 3, 8380416, 25, 7, 8380416, 3, 16, 14, 8380413, 14, 8, 8380412, 8380404, 8380415, 2, 8380411, 1, 8380413, 8380413, 8380401, 8380398, 3, 2, 2, 6, 8380416, 8380390, 8380391, 8380403, 8380402, 8380412, 8380408, 8380405, 8380414, 1, 8380416, 5, 5, 8380411, 8380416, 2, 8380405, 8380414, 10, 8380402, 1, 8380413, 8380416, 8380407, 0, 13, 17, 15, 15, 6, 8, 6, 4, 6, 8380415, 8380404, 10, 8380415, 8380400, 15, 8, 1, 8380416, 7, 8380416, 8380416, 8380416, 9, 13, 10, 8380408, 8380412, 7, 7, 8380412, 5, 8380399, 8380411, 4, 0, 8380414, 8380415, 3, 8380406, 0, 8380393, 1, 8380404, 8380396, 8380413, 8, 8380414, 12, 8380416, 4, 8380405, 0, 2, 8380403, 8380412, 8380407, 2, 8380410, 10, 3, 3, 7, 15, 13, 12, 9, 5, 2, 8, 10, 3, 8380411, 2, 2, 11, 3, 8380414, 2, 0, 3, 8380411, 8380407, 8380404, 8380399, 8380413, 18, 8380415, 8380409, 8380413, 1, 8380398, 8380408, 12, 8380414, 8380399, 8380414, 8380408, 13, 8380409, 8380411, 1, 8380395, 8380407, 8380411, 10, 8380408, 8, 7, 8380415, 13, 20, 11, 6, 2, 2, 8380415, 8380404, 8380410, 8380414, 8380414, 2, 10, 13, 5, 13, 4, 8, 8380412, 8380413, 8380413, 8380414, 8380411, 8380408, 15, 8380414, 8380413, 6, 5, 8380412, 11, 3, 8380410, 8380397, 8380409, 8380409, 8380411, 8380413, 9, 5, 8380403, 8380402, 8380409, 8380415, 8380401, 8380415, 8380414, 3, 8380406, 0, 11, 8380399, 8380409, 8380409, 4, 11, 4, 9, 8380407, 2, 2, 17, 0, 8380405, 9, 23, 8380416, 8380414, 4, 8380401, 8380416, 5, 7, 9, 8380412, 8380410, 8, 0, 0, 11, 6, 8380414, 4, 11], +[6, 8380406, 8380413, 8380387, 8380405, 0, 8380406, 8380414, 8380416, 8380400, 10, 8380414, 8380405, 8380416, 0, 8, 8380416, 11, 8380414, 11, 3, 8380413, 8380411, 8380408, 8380412, 8380415, 8380405, 8380416, 0, 19, 3, 8380410, 8, 8380416, 8380413, 8, 8380399, 15, 8380405, 2, 4, 8380403, 8380410, 8380409, 8380411, 8380399, 8380415, 1, 8380406, 7, 8380413, 8380405, 13, 8380407, 0, 8380410, 8380413, 3, 8380406, 8380409, 19, 2, 8380404, 8380394, 8380406, 14, 8380409, 8380414, 2, 8380409, 2, 1, 8380413, 8380411, 1, 4, 8380411, 16, 11, 13, 8380406, 8380408, 9, 10, 1, 6, 8380403, 15, 10, 0, 10, 8380415, 3, 14, 8380413, 7, 8, 0, 1, 8380411, 8380412, 6, 8380414, 11, 8380403, 8380409, 8380416, 8380405, 5, 2, 8380408, 8380401, 1, 8380413, 0, 12, 8380412, 2, 0, 8, 11, 8380411, 8380412, 6, 1, 8380412, 2, 8380403, 8380415, 4, 2, 8380411, 5, 18, 0, 8380408, 8380413, 16, 11, 6, 8380415, 8380409, 8380411, 8380411, 8380401, 8380415, 0, 8380405, 8380413, 8380407, 2, 11, 5, 1, 8380397, 8380415, 4, 8380414, 8380412, 8380405, 8, 9, 8380415, 19, 5, 8380412, 2, 5, 14, 3, 7, 5, 8380406, 23, 8380414, 8380403, 5, 7, 28, 8380411, 0, 13, 8380403, 8380410, 8380407, 8380398, 8380411, 8380415, 0, 8380413, 8380413, 7, 8380416, 0, 16, 8380413, 2, 11, 16, 8380410, 8380409, 5, 8380407, 8380403, 8380414, 8380411, 4, 0, 0, 8380414, 8380409, 2, 0, 8380409, 2, 13, 9, 14, 13, 14, 8380414, 8380409, 8380414, 8380409, 3, 2, 8380413, 0, 2, 9, 1, 8380401, 24, 5, 8380416, 2, 8380401, 11, 8380416, 8380399, 5, 1, 6, 8380405, 8380413, 11, 1, 4, 2, 8380403, 8380411, 8380410, 6, 8380403, 8380409, 6], +[8380415, 8380405, 10, 12, 8380415, 4, 8380415, 9, 4, 8380411, 7, 10, 8380406, 12, 0, 8380410, 8380412, 5, 15, 8380402, 12, 7, 8380406, 8380415, 8380410, 1, 17, 8380405, 8, 7, 6, 4, 8380393, 5, 0, 8380407, 4, 8380412, 8380409, 8380416, 8380407, 8380415, 5, 8380409, 6, 8380412, 8380410, 4, 14, 2, 8380416, 6, 8380409, 8380413, 12, 8380405, 7, 18, 8380412, 3, 7, 8380411, 8380405, 8380410, 6, 7, 12, 8380405, 1, 12, 8380416, 4, 7, 8380402, 8380407, 8380412, 4, 6, 8380412, 3, 8380412, 14, 8380416, 0, 7, 8380415, 8380409, 8380410, 5, 3, 7, 8380409, 16, 5, 8, 12, 8380414, 8380413, 8380414, 8380405, 8380410, 8380415, 8380414, 8380412, 8380407, 8380412, 4, 8380413, 3, 8380416, 8380411, 8380407, 2, 8380413, 1, 10, 2, 8380401, 8380415, 5, 8380401, 11, 8380414, 8380413, 2, 21, 1, 8380410, 6, 0, 8, 9, 3, 7, 6, 8380409, 18, 8380415, 3, 5, 10, 8380403, 8380406, 3, 8380416, 8380406, 13, 8380413, 8380405, 2, 8380416, 4, 2, 8380414, 13, 1, 8380412, 8380410, 8380410, 8380407, 2, 2, 8380407, 8380411, 8380406, 2, 4, 10, 7, 5, 8380409, 7, 8380413, 8, 8380416, 2, 16, 8, 6, 8380405, 11, 8380406, 8380411, 11, 8380411, 8380412, 24, 7, 8380416, 12, 8380411, 13, 8380412, 8380405, 7, 8380409, 8380412, 8380407, 10, 8380412, 8380411, 8380410, 0, 8380413, 8380415, 2, 4, 8380410, 8380408, 8380416, 8380414, 0, 8380397, 8380413, 8380413, 8380403, 11, 8380413, 8380410, 8380412, 8380413, 9, 8380415, 8380413, 14, 8380411, 8, 9, 8380415, 14, 8380415, 4, 0, 8380416, 6, 18, 8380413, 13, 11, 10, 8380416, 8380414, 9, 6, 8380409, 8380407, 6, 8380410, 8380409, 8380414, 12, 8380405, 8380409, 8380411, 8380392, 2], +[8380409, 8380413, 10, 4, 8380408, 4, 8380414, 8380415, 8380410, 8380416, 1, 11, 16, 8380394, 8380413, 8380416, 8380416, 4, 0, 8380404, 8380412, 5, 8380396, 3, 15, 8380413, 8, 16, 8380412, 5, 5, 8380412, 8380409, 8380412, 5, 11, 8380402, 8380411, 8380400, 8380402, 8380411, 8380416, 7, 8380410, 8380415, 8380415, 18, 8380416, 8380411, 8380412, 8380401, 5, 16, 0, 8380414, 8380414, 8380416, 8380415, 8380413, 8380414, 14, 20, 4, 7, 6, 8380412, 2, 6, 8380412, 6, 4, 10, 8380413, 8380397, 8380414, 16, 8380412, 8380409, 8380409, 6, 8380407, 8380406, 4, 8380402, 8380405, 2, 0, 8380411, 9, 8380407, 3, 8380410, 8380408, 3, 8380404, 8380403, 8380413, 8380411, 8380414, 8380406, 8380416, 0, 8380410, 6, 8380406, 8380414, 6, 8, 0, 9, 21, 0, 9, 8380414, 8380403, 25, 8380415, 8380403, 8380410, 8380414, 8380409, 8380406, 8380413, 5, 8380408, 0, 13, 8380398, 11, 16, 8380416, 2, 8380408, 8380410, 13, 0, 11, 19, 21, 2, 8380399, 8380408, 8380412, 4, 8380409, 8380411, 5, 10, 8380408, 8380400, 8380406, 8380404, 8380415, 8, 8380397, 8380409, 8380414, 1, 8380410, 8380414, 8380404, 8380411, 8380408, 8380416, 10, 2, 5, 8380411, 8380416, 12, 12, 3, 7, 2, 23, 8380404, 8380416, 10, 8380414, 8380403, 3, 8380394, 8380404, 2, 8380408, 8380404, 8380414, 11, 8380416, 13, 8380398, 8380392, 10, 7, 8380402, 4, 8380414, 3, 8380413, 1, 8380414, 4, 3, 4, 8380407, 8380411, 3, 23, 1, 8380410, 11, 5, 7, 8380406, 7, 4, 1, 8380416, 8380410, 8380411, 8380416, 8380406, 8380409, 8380414, 8380415, 8380410, 8, 8380416, 5, 3, 5, 8380416, 8380416, 24, 2, 8380407, 1, 3, 8380416, 8380406, 8380406, 0, 5, 15, 1, 8380410, 8380415, 8380415, 5, 8380400, 8380411, 8380416, 8380406, 8380411, 8380414, 9]] +cs2: [[8380409, 8380410, 8380416, 8380415, 11, 14, 11, 1, 8380407, 8380396, 8380416, 0, 10, 8380408, 8380414, 16, 12, 14, 8380414, 8380398, 8380398, 8380415, 8, 14, 3, 12, 2, 8, 4, 5, 3, 8380396, 3, 8380412, 1, 8380414, 8380401, 8380401, 8380414, 8380414, 8380415, 8380408, 2, 1, 8380413, 6, 0, 16, 0, 8380406, 8380415, 8380404, 8380409, 8380413, 3, 8380408, 8380406, 8380414, 9, 2, 8380416, 12, 8380407, 8380409, 9, 0, 8380415, 8380405, 8380410, 0, 8380412, 8380409, 8380416, 8380406, 16, 2, 18, 5, 8380410, 2, 3, 8380400, 4, 2, 0, 8, 8380413, 19, 4, 2, 8380411, 8380405, 8380413, 7, 3, 4, 8380407, 8380413, 8380405, 8380416, 8380415, 8380405, 8380413, 5, 8380415, 8380412, 14, 2, 8380416, 24, 4, 0, 2, 8380404, 8380391, 8380394, 8380394, 8380411, 6, 8380400, 6, 8380412, 8380415, 4, 10, 6, 8380410, 8380408, 14, 8380415, 8380410, 8380408, 8380413, 8380408, 8380412, 0, 8380411, 8380411, 3, 6, 8380416, 8380414, 11, 8380407, 11, 8380411, 8380410, 15, 8380415, 7, 2, 8, 8380413, 8380414, 8380415, 8380416, 8380414, 8380415, 8380404, 8380413, 8380412, 7, 8380410, 8380416, 8380407, 8380415, 8380415, 2, 6, 8380407, 3, 2, 8380416, 5, 8380410, 8380407, 8380405, 8380408, 2, 6, 0, 8380413, 3, 2, 8, 4, 1, 8380416, 0, 4, 6, 1, 11, 8380411, 8380408, 6, 4, 3, 8380415, 8380411, 8380406, 10, 5, 12, 8380416, 2, 15, 8380389, 8380411, 8380411, 8380412, 17, 2, 7, 3, 8380416, 18, 8380415, 8380407, 2, 8380409, 1, 8380413, 8380413, 8380408, 2, 8380408, 8380413, 8380416, 14, 0, 8380410, 8380411, 8380411, 10, 8380410, 8380409, 4, 8380415, 8380415, 8380415, 3, 8380400, 8380398, 8380411, 8380415, 9, 13, 8380412, 5, 8380415, 19, 24, 0, 8, 0], +[8380416, 0, 5, 5, 8380407, 16, 5, 1, 4, 8380402, 7, 8380410, 8380412, 6, 7, 8380394, 14, 0, 8380411, 8380411, 8380410, 0, 2, 8380409, 8380411, 9, 8, 12, 11, 10, 6, 8380416, 8380402, 8, 8380411, 5, 11, 8380408, 8380415, 8380395, 8380413, 8380412, 8380404, 5, 1, 8380410, 5, 8380411, 10, 5, 8380410, 1, 8380409, 7, 8380414, 8380407, 8380411, 8, 11, 8380399, 3, 8, 1, 8380403, 8380398, 7, 0, 8380413, 0, 9, 2, 0, 6, 6, 8380416, 8380413, 8380416, 2, 8380414, 4, 1, 8380405, 8380411, 8380408, 18, 8380414, 4, 5, 5, 7, 3, 11, 2, 8380407, 8380413, 8380416, 1, 8380411, 8380413, 3, 8, 8380410, 10, 4, 1, 2, 8380400, 1, 8380407, 8380403, 8380413, 8380414, 0, 8380413, 8380407, 8380395, 8380410, 7, 8380406, 1, 4, 6, 8380415, 8380399, 8380408, 8380413, 8380403, 1, 0, 6, 7, 8380414, 8380412, 8380403, 8, 4, 8380414, 8380405, 8380406, 5, 2, 0, 8380415, 8380414, 8380405, 8380411, 10, 8380415, 8380416, 8380407, 8380413, 8380403, 2, 7, 3, 8380414, 0, 8380416, 0, 8380411, 8380410, 7, 6, 8380411, 9, 6, 8380414, 8380415, 5, 6, 8380410, 8, 11, 8380407, 8380414, 7, 5, 8380416, 8380408, 0, 8380412, 6, 8380415, 8380415, 8380407, 8380409, 8380413, 8380408, 8380409, 5, 4, 12, 8380414, 5, 19, 2, 4, 8380401, 3, 0, 8380407, 4, 10, 6, 8380416, 8, 8380414, 0, 6, 8380412, 5, 8380412, 11, 7, 8380407, 10, 13, 8380406, 8380411, 8380410, 8380415, 5, 8380410, 8380415, 13, 5, 8380411, 19, 8380404, 6, 8380414, 3, 8380408, 8380414, 8380415, 8380415, 14, 8380411, 8380416, 8380410, 8380416, 2, 7, 8380416, 10, 7, 9, 3, 4, 0, 8380403, 9, 6, 8, 10, 8380411], +[8380398, 8380397, 8380412, 8, 8380416, 8380409, 8380408, 8380416, 8380414, 17, 8380412, 8380411, 5, 8380416, 0, 2, 6, 0, 0, 8380416, 8, 8380406, 5, 8380407, 0, 5, 9, 14, 8, 2, 1, 4, 10, 8380410, 18, 8, 8380400, 8380412, 0, 12, 4, 8380408, 2, 8380405, 1, 9, 10, 8380414, 8380405, 1, 11, 3, 4, 2, 8380391, 8380416, 8380407, 8380411, 5, 8380405, 8380412, 8380397, 3, 0, 13, 4, 8380405, 2, 3, 9, 4, 8380410, 3, 0, 8380414, 8, 2, 9, 8380413, 8380411, 8380415, 10, 4, 8380416, 10, 8, 4, 8380414, 8380413, 11, 9, 5, 8380408, 9, 3, 16, 15, 8380409, 4, 4, 8, 8380413, 8380409, 7, 8380414, 8380416, 1, 8380413, 5, 8380404, 8380401, 8380409, 17, 0, 15, 8380415, 8380414, 8380416, 8380416, 8, 9, 8380402, 8380413, 4, 8380416, 8380415, 2, 8380407, 8380412, 4, 8, 2, 2, 8380416, 8380411, 5, 17, 24, 8380413, 9, 0, 1, 3, 14, 11, 4, 8380411, 8, 8, 28, 11, 8380413, 8380405, 8380413, 14, 16, 10, 8380411, 8380404, 6, 0, 1, 8380415, 8380414, 2, 8380416, 18, 18, 1, 8380406, 8380407, 0, 11, 8380415, 8380408, 1, 9, 8380405, 5, 8380415, 8380415, 5, 8380416, 3, 4, 8380412, 12, 8380411, 8380406, 5, 5, 18, 15, 16, 14, 4, 8, 6, 7, 8380408, 1, 6, 11, 25, 8380411, 6, 1, 12, 9, 14, 3, 10, 8380405, 8380416, 6, 6, 8380414, 8380405, 8380416, 12, 4, 8380412, 12, 8380415, 8, 0, 8380404, 8380412, 8380398, 8380406, 8380412, 2, 8380414, 0, 8380407, 8380416, 8, 5, 8380409, 8380415, 8380416, 2, 5, 8380409, 8380412, 8380410, 3, 8380407, 8380408, 9, 8, 8, 8380410, 6, 2, 4], +[0, 8380406, 8380392, 8380412, 12, 7, 8380408, 0, 15, 8380408, 3, 8380405, 8380415, 13, 6, 8380411, 0, 8380409, 8, 9, 8380415, 14, 8380416, 8380416, 6, 8380413, 8380411, 8380413, 8380409, 8380411, 8380412, 9, 8380405, 10, 5, 2, 21, 8380415, 7, 13, 8380416, 6, 10, 2, 3, 8380406, 19, 3, 8380416, 8380408, 8380397, 8380410, 8380415, 8380406, 21, 8380413, 8380412, 8380406, 8380411, 2, 11, 2, 3, 8380416, 9, 8380400, 8380414, 9, 16, 20, 8380415, 8380416, 10, 9, 7, 8380406, 8380400, 16, 8380411, 8380409, 8380410, 8, 11, 8380413, 8380412, 8380415, 8380410, 8380414, 8380406, 11, 15, 8380416, 0, 8380403, 8380413, 8380406, 0, 13, 15, 8380411, 8, 4, 6, 8380414, 3, 8380413, 8380412, 8380409, 8380414, 8380406, 16, 8380416, 0, 8380411, 8380407, 8380416, 6, 8, 20, 0, 9, 2, 8380408, 8380413, 8380404, 21, 8, 14, 8380412, 8380410, 8380408, 8380413, 24, 2, 8380401, 8380415, 1, 4, 25, 8380416, 4, 5, 8380411, 8380411, 2, 11, 6, 9, 7, 5, 4, 8380402, 10, 7, 7, 10, 8380409, 8380412, 8380399, 8380403, 7, 8380412, 0, 8380415, 0, 8380414, 8380411, 8, 8380408, 8380401, 8380407, 8380414, 2, 11, 8380406, 8380408, 8380416, 8380407, 8380414, 5, 15, 8380415, 1, 1, 7, 12, 8380416, 8380409, 1, 8380408, 10, 8380409, 8380406, 8380414, 8380412, 9, 2, 10, 8380412, 3, 7, 8, 6, 20, 8380412, 8380405, 7, 8380408, 15, 5, 8380414, 8, 8380400, 8380410, 11, 5, 8380407, 8380409, 8380410, 8380408, 8380415, 7, 11, 9, 3, 8380408, 8380414, 10, 8380416, 1, 8380410, 7, 6, 8380400, 10, 10, 4, 5, 10, 8380409, 8380401, 5, 8380409, 8380403, 7, 8380410, 8380404, 0, 8380401, 5, 8380411, 8380411, 4, 2, 1, 6]] +z: [[8266484, 127799, 8357845, 26943, 25141, 96988, 23855, 127798, 8360966, 8353453, 8377180, 8376133, 8304130, 69787, 31001, 12728, 8317148, 120265, 8290529, 71601, 8338819, 97824, 8262343, 8321124, 60363, 1874, 53355, 8251231, 8326335, 32168, 84431, 8288310, 66785, 8361237, 97299, 8331128, 8366566, 8371982, 8262957, 93066, 76589, 8312509, 53679, 8258018, 38048, 8253985, 64167, 8346526, 8379262, 8265762, 6689, 8310778, 35249, 17599, 8361691, 110414, 74841, 55595, 8334821, 78997, 8326131, 17085, 55738, 8360780, 98950, 44517, 94455, 52125, 50592, 123111, 8252002, 118223, 8337688, 8316093, 119907, 49848, 66806, 8251617, 26561, 83436, 8282532, 8276412, 79436, 8330566, 8262204, 8281419, 8293863, 84261, 8329876, 84366, 8349949, 8330119, 8255060, 8314364, 44490, 76800, 8258319, 127104, 91157, 107615, 6274, 89973, 102586, 98245, 8265252, 2331, 82576, 112010, 8260506, 8372037, 8338959, 83495, 8311724, 61633, 8262055, 75846, 8305785, 33534, 8268513, 8371696, 8296988, 8329726, 8320240, 77513, 108241, 73487, 8358592, 29126, 8271271, 83527, 4796, 31901, 129297, 77470, 8371809, 81488, 8359438, 72068, 8265486, 52918, 23716, 8321707, 110575, 8314362, 85250, 30765, 8359733, 8354125, 42533, 113574, 8322036, 130548, 78819, 8286942, 40333, 37746, 15192, 8304308, 117667, 126297, 8253224, 8364792, 8303656, 16374, 71101, 58562, 8337136, 96478, 8357954, 106816, 8307727, 121581, 57311, 54121, 8333720, 65795, 2727, 68567, 92062, 8329004, 8307159, 22157, 75982, 8334391, 526, 8353073, 8287547, 114337, 8335120, 8341860, 26568, 3765, 8300917, 45648, 29183, 116945, 52064, 8340980, 8290184, 25533, 9444, 47026, 8343650, 8321163, 62493, 245, 8329531, 8278120, 105831, 11052, 42473, 8366805, 8302541, 8278650, 8356981, 8259885, 8377255, 8254013, 8252208, 19830, 8368753, 8366167, 78168, 8260691, 8283700, 27039, 15099, 8306321, 8281817, 1271, 8270589, 90745, 91536, 94015, 5086, 8274257, 8362190, 8364841, 8289828, 96380, 8268418, 8268249, 39827, 102877, 8329494, 8363184, 39620, 8270242, 58294, 86626, 8281062, 96474, 8377808, 99790, 6571, 8303039], +[8338038, 8200, 8308063, 98545, 8369291, 8253864, 8274784, 8253235, 128759, 124855, 91869, 5438, 5474, 8337477, 98653, 8348683, 8322195, 91966, 8377376, 8279975, 9678, 67350, 51534, 16362, 1460, 8373653, 8314237, 8360364, 8353518, 64993, 73230, 88286, 12840, 25489, 118804, 8321891, 8258963, 25893, 39248, 1355, 8305428, 8375017, 8330276, 80752, 105037, 8362399, 8325711, 8366177, 18966, 29771, 8282077, 44723, 8285757, 8372970, 8372741, 8277098, 8285661, 101075, 8274231, 85662, 8251214, 77613, 105696, 8283573, 8310497, 8309824, 74282, 82724, 13374, 8335318, 8364046, 8375702, 123105, 8360151, 8315892, 8294368, 8315877, 8361756, 82274, 43878, 51634, 32487, 46780, 8280948, 8256393, 8369924, 8364989, 8264364, 94694, 8263397, 59124, 25924, 8252711, 8324991, 8253520, 58634, 53326, 62691, 8307154, 8352895, 4966, 104172, 91935, 77613, 116379, 8317757, 8329092, 123078, 10510, 8364616, 91225, 8301864, 8325885, 10144, 8303983, 50469, 8254914, 8327703, 8292312, 48745, 8275718, 8289027, 8371862, 105909, 8309712, 8264763, 50256, 8346861, 8372612, 4237, 8357434, 119415, 8360864, 102722, 8373118, 8307222, 51608, 8292416, 47467, 8340517, 77319, 99242, 8367836, 8326977, 59058, 45569, 8269696, 8290559, 8290610, 124719, 8350878, 74051, 103543, 59590, 8366212, 8322548, 8252288, 107941, 76405, 53919, 8363678, 100214, 8366400, 8279209, 13474, 8336139, 8328985, 95884, 72001, 8286456, 8272092, 14897, 8657, 8367035, 21755, 8288505, 34538, 8336201, 8282714, 96119, 1124, 8327080, 8296623, 109245, 50888, 8328293, 120211, 50340, 88222, 84041, 77452, 109151, 102140, 8360313, 8262062, 8347195, 12057, 96727, 56335, 18832, 8341401, 40569, 8340937, 20663, 86865, 8264045, 167, 8359216, 121021, 98885, 8255676, 8370390, 8295673, 8251585, 18057, 8365830, 8342855, 8364135, 8336622, 30911, 55914, 81920, 828, 8365319, 5299, 47825, 8286838, 8263488, 8333148, 8299029, 49602, 99811, 8253214, 8313982, 42959, 103255, 98951, 8336016, 8293145, 66798, 8377025, 8281028, 60780, 50899, 8377055, 103983, 8370795, 8295749, 124926, 88896, 8363128, 8348327, 8278228, 8340684, 8340371, 124613], +[8291232, 92857, 5961, 95211, 8287517, 778, 128679, 8354053, 8319871, 8314472, 8261972, 44189, 8332116, 8358070, 16701, 8348321, 8361206, 47283, 8377187, 29239, 8279384, 128205, 8337703, 8266385, 18700, 8290707, 8276215, 8260050, 8304206, 8279716, 80685, 8262364, 8262724, 8345019, 8354043, 72280, 10456, 8363708, 66442, 61617, 93205, 51092, 8333309, 34214, 8367051, 90085, 109902, 8319775, 74916, 8264319, 123370, 8249975, 8304445, 47641, 8295147, 8289978, 8294578, 8372182, 8285442, 125809, 8300921, 8303729, 19199, 8313708, 29726, 67288, 101297, 8373602, 68615, 8348271, 8279582, 8257772, 22386, 117668, 8272126, 47802, 8313678, 8293747, 8355905, 50961, 8260224, 84063, 8354258, 8346897, 105850, 8304348, 74531, 8257540, 111805, 20493, 8260091, 5972, 8280747, 24680, 8273775, 104268, 8283606, 46603, 14855, 8299620, 8318982, 90937, 8373554, 8336640, 90463, 128215, 8282006, 55865, 8335047, 71935, 8265179, 94191, 8270486, 8313325, 8266446, 78906, 8332641, 44778, 8364173, 8368776, 23991, 102881, 111732, 68363, 8376706, 100117, 21180, 42554, 8324408, 54119, 8339531, 8295611, 26940, 72092, 8339310, 59581, 8280075, 8375689, 8296365, 8273424, 8275499, 107920, 8297915, 8352674, 48696, 8298450, 8279549, 18244, 97836, 62769, 88441, 57783, 73866, 81160, 61720, 8338337, 8291793, 8332137, 21604, 8302054, 8252879, 77298, 81136, 8310087, 8275463, 8355651, 8294396, 16027, 8341692, 8277215, 18900, 81224, 45957, 29714, 109706, 115236, 57589, 8378187, 8302080, 28397, 8312474, 8322958, 83779, 8253149, 104053, 26964, 124823, 50428, 62233, 8321318, 57053, 69774, 54005, 113839, 5694, 91260, 77175, 83809, 37391, 6541, 114891, 69956, 129071, 17088, 8370054, 2420, 117267, 8249960, 8317511, 8260624, 40590, 8352354, 9551, 55204, 8326959, 93534, 8274335, 112088, 8304571, 8360058, 11770, 8255432, 92939, 8376634, 8322170, 8250032, 56218, 28985, 8341154, 110344, 8260637, 78542, 69999, 8260152, 8261742, 122720, 22658, 8283575, 98162, 86038, 121783, 8286621, 103381, 8334162, 76039, 5570, 8263487, 8260088, 8351547, 8349232, 40632, 8366299, 8282138, 8258626, 60814, 82285], +[8250471, 21580, 125509, 95017, 18228, 115399, 36753, 8263475, 8379664, 8365140, 77929, 8347774, 69129, 52033, 8324046, 8360332, 65069, 8347526, 77132, 83680, 8272213, 122637, 50308, 37669, 8309595, 8350276, 8314417, 47106, 64274, 8362248, 8335284, 77701, 3308, 85522, 8263037, 8336893, 8249362, 8270576, 45926, 52758, 36455, 106577, 118450, 7882, 36694, 27618, 8262872, 8272619, 21446, 121987, 8354358, 8337775, 38758, 8349468, 8350888, 8374619, 93917, 8305326, 8256137, 45553, 80561, 8310617, 8356173, 3921, 8267009, 94353, 71959, 8270871, 112024, 51513, 62718, 8291273, 101950, 87775, 8254564, 8271551, 90706, 50105, 116511, 8364970, 96637, 22928, 8367838, 75573, 4022, 40783, 38189, 118957, 108827, 8319527, 99211, 8269455, 58814, 8346824, 8252662, 8379609, 8110, 62875, 42865, 8352925, 8294049, 68030, 8287534, 8320417, 8342889, 80866, 8305279, 8307156, 43173, 8267227, 8285911, 8348605, 8344965, 104991, 84990, 33710, 27187, 85940, 8321876, 96547, 82831, 71242, 51227, 8292078, 76791, 8375125, 123710, 111783, 91247, 8263789, 8258335, 59025, 8328540, 8274644, 79376, 121805, 8336708, 8329647, 65231, 130417, 8313794, 4360, 8317073, 88099, 8249985, 41230, 8350809, 96127, 114574, 45005, 91417, 54412, 34736, 9543, 8272205, 8341322, 99151, 8363237, 3189, 71675, 8322404, 8254864, 86084, 8350492, 108935, 123209, 8336630, 8263907, 48288, 8376883, 8258464, 39726, 39035, 46995, 80524, 8313163, 8370404, 8359867, 8370156, 8376168, 104483, 73596, 42589, 25906, 8290275, 72597, 8306805, 8316154, 100767, 8294521, 23767, 22327, 11641, 8268974, 116598, 8278935, 8271892, 8349883, 8328282, 102255, 109689, 8351256, 8352316, 108246, 112155, 8306712, 8282912, 61951, 7379, 74595, 8320266, 108896, 18441, 8363049, 8330348, 8274705, 8366378, 8305996, 64454, 51751, 8263442, 5045, 8300169, 8297497, 8272549, 89398, 8325084, 8371681, 9399, 77193, 8264953, 3209, 92699, 8083, 8292209, 8257066, 8377600, 8311172, 41339, 21927, 7796, 8349104, 8379525, 71081, 8348178, 119848, 8353591, 3758, 80623, 101628, 8255868, 8276033, 8297641, 56285, 8305993, 8267785]] +||z||: 131055, ||z|| too large +r0: [[-92237, -41220, -10349, 85189, -51656, -16931, 33275, -19760, -153, 71046, -69467, 67793, 44173, -18671, -27853, -7505, -72813, 2551, -50945, 55728, -10874, 44802, -35238, -57902, -73563, 36327, -78518, 6455, 9922, 48496, 89997, -19191, -7851, 64683, -85155, -25608, 76346, -6446, -60136, -38792, 62940, -16943, -49471, 42994, 60177, -5131, 77100, -28156, -19259, -1041, 60187, -80897, -25756, 87120, 13467, 19765, 75935, -25877, -22939, -11346, 51945, -18612, 47142, -7211, -7405, -39097, 7011, 59951, -79032, -48748, 59406, 67446, -37334, -33716, 21450, 69276, -4284, -30376, 84979, 52514, -41642, 20079, -40013, -61967, 43617, 34390, 10699, 27326, 89075, -2918, 89522, 44262, 40088, -56183, -17887, 59111, -71041, -72338, 14804, -88611, -69992, 22547, 81151, -11104, -26305, 56384, 75613, 760, -74429, -60182, -42252, -76520, -2898, 89683, -2123, -9445, -12906, 29590, -54174, 31586, -22796, -95065, -13997, 22212, 74386, 94920, -27065, 40281, 18183, -58478, -58941, -29603, 86076, -63315, 40152, 22914, 61426, 2718, -53995, 38213, -84704, -27712, 90605, -21268, -23851, -94156, -86409, -56618, -91548, 5178, -34216, 87537, 27813, -55613, -87686, 44627, -73459, 64437, -81486, 23331, 27907, -12169, 63974, -63490, 79431, 9477, -69142, 67777, 88650, 25915, -46425, 60112, 56362, -7143, 82816, 85029, -55232, 27052, -55566, -16661, -68993, 7541, 81474, -74247, -51113, 67718, 34278, 13917, 76490, 41152, -4047, 34820, 8627, 77512, 4323, 70260, -25915, 52916, 84159, -27545, 78182, -62598, -59796, 60933, 61856, -614, -10798, 78956, 93707, 9591, -66932, -15232, 61644, 93125, -62298, 56380, -1823, 65058, -78054, -63204, 69531, -41198, 82124, 21923, -44815, 54817, -25077, 94129, -11652, 3347, -12333, -52766, 18717, -76867, 5679, -56531, 58259, 43849, -64127, -17486, 79486, -90310, -76954, 80085, -71552, -15614, -46735, 75096, 90908, 21092, 58140, -51752, -17441, 85653, -57334, 92266], +[86841, 6407, 14134, 54379, -10152, 62502, 71790, -6134, 70086, -94379, 79266, -91894, 27613, -56572, 5646, -47207, 91652, -61464, -77334, -66615, 78704, 73306, -83804, 86424, -79076, 32168, -37330, -31997, -40177, -52428, -61852, 27500, 44687, 53629, -71949, -17015, -26697, 85297, 70651, -41007, 69140, -70373, -15424, -7502, -48645, 89082, -26460, -9912, -26557, 68896, -92624, -48779, 3866, 5156, 43239, -19501, 31750, -87481, 40004, -48770, 766, 27247, 20864, 68276, -56022, 56438, -32488, -87057, -46916, -19427, -26286, 9505, -16009, 37995, 39109, 3119, -69435, -65702, 22803, -24261, 19663, -43887, 26971, 92008, 23639, 31600, -84061, 11757, 148, 92688, -66307, -49265, 13090, 20832, -12519, 575, 68329, 44566, -18828, -25937, -75294, 31194, -39556, 74463, -18638, -91973, 25065, 26560, -33106, -58441, 13943, -25944, -3294, -4116, 57353, -47500, 64180, 12644, -57663, 51173, 86998, -2422, -87040, 802, 77010, 40715, 31320, 52200, 17662, -56008, -21524, -90605, 82510, 28487, -28991, 39053, -70621, 80553, -5583, -51805, 14053, 92662, 45511, 55919, -94547, -89438, -79680, 36558, -87057, 73748, 28132, -71188, 53006, 4593, -54830, -179, 67764, 62444, 9674, -93814, 19748, 47412, -89969, -40080, -68618, -86478, -32408, 72079, -30339, -59261, -65308, -60794, 60072, 70802, -63168, 37051, -37888, -91313, 57232, -5774, -28998, 85182, 44282, -55131, 93151, 48401, 44657, 27347, -68807, -21489, -9262, -45272, 29445, -45868, 51551, 18060, 24657, -45738, -41918, 14617, 27084, 62941, 75902, -30033, 60065, -2665, 11675, 75252, 55638, -10199, 3882, 38350, 54555, 59066, 11938, -636, -6463, 3021, 88883, 93811, -26883, 11527, -31101, 37065, 76528, 6728, 75271, 5403, 15735, -69050, -19664, 23649, 30916, -30712, -39386, 81032, -39968, -63906, -54615, -57688, -53387, -10822, 37054, 47193, -93791, 20464, -17089, -3202, 56136, -82736, 95134, -8220, 11354, 21769, 40886, 42155], +[3697, -7104, 92730, 81170, 47864, -44660, -7602, -1477, 11372, -15220, 3784, 83321, 55624, 42312, -29987, -38842, 37788, -30358, -18786, 35223, -10156, 93583, 90604, 90826, 72437, 38922, 34103, -87728, 26029, 73852, 34869, 27772, -60277, 55623, 66717, 20597, -44427, -84301, 26322, -56007, 24793, -91763, 77349, -56523, -50442, -23272, 79478, -86791, 59955, -82606, -42310, -29855, -61339, -51378, -59543, -48029, 52323, -58153, -37719, 94681, 72093, 13447, 56134, 29803, -38502, 33246, -9288, -59001, 16184, 62815, 63996, 54818, 38575, -86989, -31821, 12029, -23351, -6812, 22683, 4209, 25190, 90825, -52614, 87489, 3744, 33804, -19250, 29761, 24417, -70067, 80121, 74621, 49802, 6660, 26204, 77434, 66045, 52387, 30572, -72751, -80404, 62223, 39530, -59612, -73698, -33978, 19726, 4317, -75251, 15015, 39010, -14301, -33994, -28806, -42156, -384, -7430, -74217, -79946, 42670, -76118, -16750, 65814, -23737, 54708, -74345, -90820, 48701, -16172, -8013, 89068, 33193, -88990, -50521, 72205, -29283, 16486, 36892, -90570, -5866, -4745, 27508, 276, 17923, -69989, 33719, 17609, 38601, 85017, 38436, -31108, -88703, 61878, 37522, 46232, 48624, 58424, -61781, 55005, 6267, 59714, 24918, -4415, 38940, -29856, -65266, 63016, 51927, 76406, 69276, 62370, 77116, 49949, -38277, 60894, 10553, 48770, -48386, 84861, -79391, -71025, -70218, -83550, -76357, -12232, 63185, 18933, 73424, 29711, 60120, 74674, -15336, -24601, 27297, 8584, 73493, 92808, -33031, 21570, 74570, 85448, 66685, -9728, -25458, 59010, -51766, 58208, -54388, 54254, 26576, -45060, 25114, -35303, 34521, 74930, -2609, -86841, -79672, 20255, -9086, 89209, 63189, 76036, -22722, 28875, -25637, 45738, 74034, -55355, 84195, 78971, -86520, 6381, 18943, 52622, 72595, -4070, 45370, -85985, 38088, -19929, -88317, -16269, -8778, 2619, -94783, -55602, -45419, -75868, 22695, -87725, -33097, -6882, -51108, 52084, -34642], +[-70212, -59676, 83342, 35593, -1509, -33621, 72345, -24968, -53494, 45402, 59297, 59161, -31239, 85705, -11808, -1270, -92842, -28419, -38983, 70822, -6951, -16480, 72751, -11334, 40647, -15982, 43635, -32495, 35288, 30672, 37948, -90901, -32324, 75286, -2552, 13445, -44110, -50425, 38743, -72467, -14180, 33891, -62342, 29861, 81085, -17272, -9110, -3389, -66487, -23860, -68553, 51720, -5514, -68119, 9294, -87206, 67023, 91849, 69846, 78551, 15922, 72430, 95020, 49199, -59546, -41429, 62500, 19863, 88658, -20893, 27607, -74964, 11996, 53324, -69979, -30263, 47063, -29951, -25082, -17537, -44032, -2918, 52166, -6968, 339, 74359, -35359, -22669, 94847, 32318, 41859, -67693, 84558, 49799, 35861, -17881, 73549, -50521, 8454, 6184, 2326, -3370, -444, 83714, 85724, -84303, -28361, -90223, 77982, 55177, 30335, -71998, 51148, -51514, 23103, -71300, 21472, 29857, 93674, 17554, -53668, 67971, 21734, -47898, 76559, 69247, 52123, 67618, -67706, -64022, -69806, -14336, 24014, 88009, 13470, 37236, 31591, -39203, 15118, 91059, -11682, 61292, -86380, -15128, 72653, 53100, 21839, -11253, 77366, 75023, 36981, -26653, -2679, 91922, 39740, 62470, -51165, 7273, 73065, 7302, 52614, 45133, -93478, -58557, 61535, 79106, 30182, 49927, -77874, -53612, 91531, -24877, -10703, -89748, -38150, -46394, -66012, -3616, -44605, -58778, 56045, -79602, 25115, -87183, 80341, -53665, 26009, -58137, 72329, -66598, -42636, -5061, -23464, 41192, -44974, -74715, -30359, 87314, -68501, -93613, 60251, -7825, -51834, 12239, -34652, -87616, 74918, 20452, 20014, -90627, -85820, -40236, -57294, -82590, -6865, 11113, -48453, -1104, -63372, -35546, -64843, 65589, -92333, 42700, -54865, -93766, -12905, -29938, 61005, -44638, -51093, -29648, -35401, -26524, -93075, 49947, 58128, 24048, -26718, -68638, -1407, 82030, -42786, 21241, -26902, 90474, 77971, 52754, -76035, -58811, -47521, -29765, 54334, 30794, 85339, -28361]] +||r0||95134, ||r0|| check passed +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-53328, 94588, -79612, -107803, 61859, 6717, -36418, 109110, 53373, 7453, -111650, -99536, -117962, -22677, -112889, -5564, 94842, -70020, 23022, -105459, -128679, 99451, 127564, -31220, -94366, 125737, -54784, 73374, 15597, 116126, -39225, 17378, 45490, -24292, -100175, -57249, 44650, 129408, -93323, 106461, 124396, -77790, 69566, 16771, -95527, 90503, -96334, 111072, -124517, 116595, 54322, 82992, -33315, 3289, 118459, 126632, 31253, 66518, -46014, 7888, -57099, -99667, -118845, -53823, -55611, -62720, -60055, 111061, -122577, -53812, -71534, -30081, -122483, 80307, 33621, -85460, 102640, -69322, -90363, 122327, 36441, -122407, 87930, 5279, 74408, -112972, -57228, 46139, 66243, 129909, 42487, -42721, -87531, -76091, 77818, -43188, 18100, -33989, -39333, -104731, 64185, -108301, 23499, -47842, -81970, -78812, -46329, 1527, -16674, 74642, 17120, 54402, -8479, 100225, 25713, -109078, -80689, 77855, 46236, 69830, 62030, 62160, 66187, 18951, 43892, 65636, -30875, 125276, -95414, 104851, 71425, -106875, -65734, -130007, 72316, -76243, -20046, -34503, 115439, -20213, -28687, 54946, 4315, 70510, -92095, 46677, 7304, -3571, -24383, -29549, -35723, 71410, 14133, -92464, 33142, -122672, -76965, -97740, -51533, -41604, 89557, -47956, 50684, -51803, -21884, 57251, 113271, -55413, -50650, 7207, -79463, -110227, -37734, 37304, 70349, -81378, 91462, -120570, 86268, 62485, -98878, 105860, 123522, 19055, 97090, 56869, 116418, -4988, -127020, 85673, 45431, 110135, 4883, 64913, 47563, 23885, 128654, -78968, 110437, 7352, 70522, -47592, 107276, 106222, -98161, -62747, 50839, 18698, 73316, -65556, -10610, -27717, -82908, 61905, 43683, 121993, 110720, 107537, 34524, 25669, -4278, -112804, -72124, 110012, 126120, 4600, 77096, 40500, -63530, 110631, 54302, 66646, 3047, -19010, 92753, 101624, -58665, -122697, 55572, 129151, -110862, 8208, 95595, -55263, -104375, 41751, -87185, 8606, 76757, -8704, 63798, 12678, -59852, 240, -119461, 49939], +[5932, 8987, 114757, -79537, 122023, -92973, -72327, 107817, -113144, -63470, -41304, -22268, 27500, 113204, 122726, 69457, -42663, -33653, 100054, 2466, 95950, -105283, -32730, -86377, -77115, 6033, -56117, 42868, -21242, 10551, -120402, 76106, -18764, -121066, -45699, -106949, 122322, 16696, 101530, 98272, -124429, 67613, 63741, -108624, -83824, 96765, -71351, 582, -40499, 100463, -15814, 70395, 57694, 28946, -84937, 68782, 123245, 16550, 41754, -128733, -11624, -130763, -57207, -109552, -63370, -125000, -68879, -45422, -22889, -89652, 18490, -92651, 87215, 49926, 120187, 40440, 87743, -42550, -27586, 9068, -74626, 72738, -123359, 130407, -117150, 95086, -17133, -2915, 121182, 97899, 2137, 8726, -19172, 79503, -9211, 36088, 59184, -60012, 60235, -116234, -112092, -1779, -53020, -114945, -36717, 89947, -53800, -40726, -124530, 16551, 49478, -32735, -103392, -43533, 103270, 119984, -23148, 44827, 109127, -27883, 54448, 120828, -7405, 22315, -28844, -43376, 127551, -128418, 73494, 67050, -66031, 101773, -106181, -53107, -21214, -117315, -95347, -47869, 83616, 55658, 60469, 33056, 63486, -106123, -126218, 34627, -51551, 113063, -77723, 53144, 19993, 27240, 28995, -41765, 26356, -50217, -28791, -54682, -30815, -46670, 16743, -76243, -57963, 121205, 106093, -58568, -64738, 48379, 9422, -19966, -52251, 124857, -113682, 54579, -101125, 52625, -34818, 82515, -47948, 86978, -89834, -119710, 16561, -34381, -15027, 35171, 118631, -94640, -87543, 48209, -101744, -94561, -129824, -38285, -53802, 89541, 2524, 71369, -73628, 115937, 20243, 27854, -78004, -91051, 128234, 113213, 48212, 97834, 81797, -18731, -95857, -121632, -40627, 42698, 22735, 111444, -43990, -82268, -18601, 119386, -129015, -57496, 113756, -13063, -86433, 102129, -27002, -50717, -50568, -98936, -85623, -35153, -57051, 76994, 33884, -36322, 21640, -71017, -26887, 64652, -8173, -107491, 122401, 1358, -122601, 72346, -63416, 55562, 16191, -17611, 54865, 126915, -42199, -86336, -89311, -87695], +[9185, -128272, -107018, -90100, -90259, 55876, 113557, 33061, -105518, 81669, -28023, 92319, 28456, 17299, -68951, -54919, -108067, 2538, -107610, -11484, -38948, -78013, 36444, 15330, -65128, -35892, -16576, -73412, 113383, 5659, -27463, -118512, -10609, -72711, 65448, -103129, -6060, -45179, 43780, 102667, 58412, 103256, -39372, -83256, -20688, -126290, -118467, -127293, -124720, -69071, -12094, 101886, 85536, 70299, -124961, -99002, 99204, 16171, -96619, -73273, 24815, -109044, 41634, -57906, -61194, 125107, -23912, 74851, 66657, -128358, -109076, -1573, -31701, -37886, -100006, -61530, -69092, -23550, 59217, 111994, 54333, -87588, 114345, 126229, 35818, -83501, 116140, -60563, -92426, 129382, -36684, 128253, 1546, -84285, 24295, 118704, 18720, 98088, 68409, 130987, -31932, -122281, -119468, 26895, 43841, -31963, -62347, 92428, -74519, 119297, 19670, 31961, -127823, -57540, 51939, -25463, -126137, -37987, 97215, -17936, -56720, 12225, -59760, -26521, 60287, 51444, -4890, 54204, 38790, -69052, -126952, -20739, 92319, 24801, 66402, 128731, -73949, 13892, -76285, -4679, -84971, -110399, -70081, -86618, -115923, 131054, -113848, -32619, -127586, 56895, -77878, 118412, -27185, 39822, 26652, -5221, 44734, -73559, -50948, 128701, 69737, -79147, 53471, -78785, 77350, 13297, -84236, -38747, -34435, -46110, 10299, -59787, -109822, -84029, 56544, -6506, -17438, 39072, -16328, 108964, 25925, -90851, -38655, -44171, -96148, -112027, 127132, -5217, -10274, 85134, -96975, -45372, -2164, 12892, 111797, -39844, 112636, -117438, 39952, -14177, 50572, 58512, -11956, 1013, 51728, 42607, -126801, 82457, 70779, -10261, -44566, -24820, 26624, -63213, 90627, 2766, 3057, -116903, 104987, -49026, -8186, 37974, 95852, -27322, -67320, -47580, -71202, -112089, 5450, 89252, 80904, 91236, -56106, 97763, 123132, -72128, 66540, -10898, -106619, -16733, 71704, 42857, 59089, -20566, -59898, -78097, 50207, 100027, 89528, 51091, -59337, 18256, -52685, 39363, -61955, 72978], +[-69238, -108157, -57485, 128567, 101451, 98950, 63872, -68191, 12785, -66804, -24455, 93650, 130655, 108612, -29131, 8137, -124552, -124738, -66741, 38129, -43731, 45558, -118863, -72592, -74287, 734, -51542, 419, 21266, -54913, 36345, 99690, 112620, 92097, 78364, -24631, -44793, 115581, -63723, -91562, 15953, 103647, 79668, 109107, 40000, 100640, -36241, 104069, 3279, -59193, -75414, 82421, -47417, 126209, -42688, -70722, -92105, 29541, -117796, 67213, 112145, 59598, 124345, 89982, -18828, -95654, -71883, 105690, 47773, 112441, -5482, 43631, -71919, 14012, 53061, -127279, -86935, -448, 84540, 69816, 7979, 23816, 92368, 8061, -123554, -37285, 34651, -69523, 29849, 26527, -89544, -63094, -32050, -73971, -74045, -120102, -56087, -113637, 62294, 71979, -120583, 122196, -41428, -92448, 128262, 90191, -69292, -64435, -23560, 110717, 63702, -79337, 31135, 81033, 107155, -90911, 69518, -63569, 25213, -107849, 20087, -73995, -105389, 98175, 110963, -77998, 49299, -27735, 102444, -116069, -80064, 112981, -127556, -103680, -48796, -37719, 52689, -84018, 53803, -58785, -97947, 118627, -82522, 122984, 10268, 79709, -48406, 115386, 4800, -114954, 107582, -102104, 128066, -88382, -46067, -31816, 100303, -12110, -97698, 118138, 52505, -129378, 6289, 2733, 36230, -56757, 101328, -48984, 55991, -23433, 120950, -59746, 59706, -130920, 34241, 37222, 128538, -120734, -115731, -103921, 85728, 129643, 26758, 130338, 98146, 79653, -106382, 65829, -54643, 86203, 46117, 66710, 111432, 103554, 36020, 52780, -26547, -22041, 37643, 59278, 96088, 50969, 110324, 75808, -104438, 113512, 31204, -46330, -59085, -12158, -105100, -31487, 48376, -28986, 58623, 82760, 10357, 130970, -40147, -39560, 88724, -85411, -30872, 105505, 32208, -117581, 96897, 111635, -24319, -109623, 41358, -51124, -26977, 63705, 91976, 109116, -127304, 66405, 34707, 39440, 79625, -59331, 81960, -94224, -24892, 118153, -64825, 51137, -48020, -46620, 106111, 26420, 68884, -109468, -103293, 4919]] +NTT(y): [[1605782, 3847675, 7153476, 4260583, 5906183, 5888340, 2002662, 4322855, 2822963, 205760, 4300789, 5663800, 5796082, 2872414, 5583829, 2419146, 6409324, 7304337, 3560207, 7171691, 2805227, 6728429, 2224949, 3623097, 6548408, 7205382, 1096179, 7744420, 1387039, 4846807, 5458641, 5715707, 4268640, 5110553, 3798122, 5472303, 991834, 2622018, 7141805, 6541270, 8236512, 138726, 1092447, 6537502, 1286804, 1825567, 7724614, 352964, 617053, 2678831, 766924, 6701640, 6138489, 3067836, 6527526, 6108958, 8083146, 1835333, 4903354, 3485784, 4766516, 1604904, 3329925, 4892826, 544657, 4002289, 4937840, 56974, 708534, 8221036, 4536674, 3327184, 8088360, 2547248, 2316541, 4783348, 6730405, 3642549, 5214172, 546985, 4719257, 4696994, 3122082, 3947255, 6655643, 1702593, 614814, 382595, 2225733, 3392812, 1290625, 6392025, 3579567, 7373639, 4604536, 7213366, 426213, 3850293, 6346768, 4633078, 4246107, 3900430, 2957836, 4545745, 3043782, 7845947, 8368165, 7345511, 7425129, 6140329, 7322384, 1337431, 3936234, 5016015, 2983306, 6369770, 4000524, 1079299, 4565341, 3234569, 1098056, 3406348, 6660186, 3170759, 3937728, 1143697, 3835554, 1962015, 2796366, 3062499, 2434819, 3483752, 2079773, 2669884, 4598668, 6672084, 6433910, 1109233, 1311095, 1004831, 7883369, 2197, 4847698, 8040986, 1861391, 4806084, 1692336, 3819836, 4132827, 4644250, 4357748, 1501845, 8100507, 7585284, 5795555, 3816518, 3267261, 4087993, 7292867, 2700647, 6496785, 7073038, 2251955, 7381762, 6541081, 5887338, 1284918, 2866440, 5572519, 818989, 2244270, 1407929, 3742409, 6053232, 5475433, 4222200, 6374221, 7070499, 6296074, 3891754, 1025161, 4368185, 387771, 4646406, 7828611, 5922257, 7922094, 1151213, 1599395, 864603, 4263440, 5088668, 5064179, 4182620, 8270502, 1289144, 1109159, 8159117, 886101, 92489, 7338320, 6875286, 57445, 1455193, 6838320, 6980966, 8278139, 3730840, 5422959, 2849333, 1326091, 5078531, 6571726, 2428550, 7523063, 3261989, 7111223, 2311653, 8293640, 6493190, 6751904, 3842853, 1970631, 3994127, 6258689, 7370978, 6027345, 3794842, 1458539, 7721742, 8041014, 3838251, 2714638, 5830955, 1168374, 2429543, 5668651, 5012058, 5313060, 7198836, 5862028, 1889672, 6868979, 2615196, 7494310, 519884, 1886191, 973016, 728302, 7099807, 582954, 7068111, 464393, 3563512, 5162366, 36170], +[2058395, 4905409, 5455448, 5854323, 8112605, 2932455, 3988197, 4612598, 8323332, 6732340, 4253552, 5090807, 5952539, 169264, 6551269, 791711, 515978, 6052368, 6765923, 6968498, 7652185, 1717898, 1306429, 8272952, 3377058, 5334328, 3011782, 6289331, 5431611, 6044783, 1061819, 6138864, 6540175, 7063879, 2999753, 3448563, 5322653, 4039553, 3201430, 543638, 5523460, 3682515, 6255328, 1198742, 8159715, 6721995, 4525566, 346628, 363285, 5519039, 5845613, 3711888, 2081718, 7256262, 767598, 1632529, 8293545, 181182, 6988096, 7604179, 1184921, 6563848, 675042, 2734791, 1506403, 5303104, 6594968, 1318270, 5395955, 6871808, 8305648, 2050452, 7655725, 5637812, 2539070, 2022342, 425404, 4825938, 5113904, 2658633, 1917507, 1203444, 587633, 2199374, 3690739, 5715769, 2588885, 322203, 7637857, 6419256, 4323883, 2378640, 5936743, 6887182, 3107711, 6144815, 8050596, 6362561, 965074, 3151486, 6464147, 8187104, 5341364, 2056166, 8200874, 3057654, 2668668, 1904912, 987874, 1070238, 105329, 5871212, 5375332, 4655092, 3050731, 4460573, 3925184, 844441, 3687475, 138754, 8042975, 8298265, 455037, 5973414, 4050767, 6795919, 8087904, 5385590, 2483922, 6669501, 7287206, 8151246, 2375805, 2257014, 2549916, 7299582, 2872105, 4662138, 3423395, 5390627, 1336152, 4820473, 3128702, 5795500, 3382328, 1665226, 4698338, 2438513, 2014484, 7246798, 4224603, 4350712, 6736252, 2348804, 1104038, 5432198, 5251227, 7207293, 2576352, 8011105, 7441068, 8066419, 4012470, 1056763, 1770158, 3636815, 574030, 557884, 5078988, 265893, 1339100, 1842633, 4313619, 7508980, 3449262, 1680646, 2258780, 8199180, 5673067, 4842343, 385402, 8065277, 6845068, 4542262, 7741753, 5534494, 2664836, 6075197, 4557325, 345876, 2512213, 2231684, 303777, 924291, 525844, 6653320, 3977858, 5364002, 5908126, 435018, 2806044, 409843, 3625336, 3820331, 3362253, 4195248, 2883462, 5806504, 7729534, 4033275, 2144572, 927392, 830149, 75962, 5578682, 7007393, 7691120, 4254917, 7269497, 6849440, 5182288, 571127, 2323850, 5288523, 954085, 8108692, 596696, 7832874, 7197421, 4329811, 5191278, 1672460, 6666002, 543358, 1585580, 1968960, 2276611, 5979815, 5454096, 6402122, 3926806, 3021516, 7007982, 6610388, 3575261, 6936123, 2543000, 4813573, 6025630, 2305533, 4489054, 673527, 2813501, 3752569, 5566642, 2327598], +[4544985, 7788989, 422543, 8283851, 2193981, 3218209, 6553852, 2218460, 2396719, 5834222, 3004086, 1540449, 750728, 3961140, 2144365, 5496590, 7478133, 801881, 370192, 3030236, 5234991, 7647117, 8139926, 2794730, 4578403, 7199620, 7716888, 2136221, 5987133, 2546274, 423430, 6257892, 8120451, 2725576, 3752060, 2341453, 1296550, 468359, 512849, 8162625, 3772304, 7818866, 2008018, 5832088, 1762645, 3788968, 924499, 735873, 5249955, 4324809, 5449834, 1748387, 185379, 6096783, 4421534, 4109637, 8059211, 571530, 7470956, 4793271, 4863722, 1695986, 7126966, 3097765, 690704, 8014798, 3470651, 6959570, 1839386, 3052155, 3552164, 8128090, 5954934, 6869881, 1150813, 5332740, 5175940, 347992, 2858993, 1207131, 8285733, 3225437, 7407818, 475046, 7506625, 7313204, 1133137, 1510724, 2899415, 2553288, 1655718, 4995381, 6772551, 2473815, 7267121, 910663, 5463510, 1949090, 5722162, 4567375, 1595503, 8009933, 6411886, 737175, 7530648, 7650019, 2319795, 8331784, 6470261, 6083938, 4365061, 2563199, 7817810, 3177974, 2523283, 5238128, 3930038, 6719767, 80474, 1142991, 6091213, 7196597, 1059883, 1069100, 4051870, 239421, 7413853, 4448495, 5983989, 5974757, 1095158, 6132067, 1976946, 4384114, 5130467, 1520614, 3693719, 4404389, 2372046, 3001699, 2985551, 132484, 5835305, 2895408, 2875585, 4048852, 4616478, 5718776, 7902324, 4540037, 1533454, 76586, 7192299, 4343785, 5517472, 5028108, 8227370, 2749644, 4757301, 4120539, 5799389, 137632, 2343348, 949384, 7213472, 5587204, 2136416, 843616, 4991103, 5591516, 6615247, 5029657, 139487, 5428799, 8162494, 346625, 4753161, 6547374, 5954793, 2357439, 2100122, 3548842, 3714045, 4623665, 5683321, 5515535, 1584064, 1437392, 6118961, 5721463, 3338741, 6031582, 6604969, 3929015, 4970691, 7833164, 5879125, 7604939, 4560482, 4342862, 4277751, 6367998, 593782, 2134932, 7890205, 1457229, 7608100, 2080370, 2415240, 6317801, 5392079, 2642265, 237026, 7262429, 2515480, 2747895, 2651322, 1901898, 136859, 7412963, 5990830, 6206755, 4084564, 6095401, 7764193, 4350171, 1770120, 6660963, 8363524, 3228286, 157969, 6086500, 8189617, 8040474, 132260, 1357843, 5372741, 4821053, 4342750, 5799478, 8019356, 5357872, 2915271, 220551, 8239036, 5840429, 3644512, 3916531, 1785432, 7970752, 758398, 1175866, 2314117, 6221377, 7083005, 935657], +[8029781, 3447488, 624981, 644054, 7932657, 158822, 3674902, 189573, 3083821, 7289480, 4113798, 4113600, 3492885, 76526, 6079520, 6886585, 4584468, 8081226, 3523769, 6937493, 3477263, 6561382, 2390565, 6166291, 5045585, 403605, 4203906, 7381896, 6631011, 8281740, 7355440, 4364553, 1675690, 4345869, 3948778, 3937767, 5159292, 2155101, 3833771, 1694535, 7484001, 2087123, 5255778, 5986788, 2961728, 2001225, 149104, 3687133, 5463257, 5573910, 1510438, 6135678, 1925652, 58737, 723582, 2598461, 4295490, 1205819, 5232451, 5573898, 367403, 7753009, 1507755, 6467289, 1140080, 5137006, 3103406, 849960, 4802982, 5489644, 4012434, 4325176, 2408138, 5291252, 5403513, 4670279, 4582228, 1490472, 2112496, 4403799, 2418516, 7520495, 2411266, 4510720, 2818077, 6478595, 191324, 4894134, 7275720, 623498, 134662, 2449174, 3976041, 7869690, 8284981, 6719546, 8162874, 4207716, 7111200, 6689557, 7728660, 3180333, 5171813, 842481, 5791756, 327827, 3427571, 1303113, 7425486, 7027273, 402742, 6882444, 3625946, 7951891, 5635699, 5120961, 3866715, 3404631, 5348204, 2495215, 5639403, 660233, 4864043, 6143820, 680479, 6162116, 4709787, 3344952, 744873, 3369160, 2689673, 2046329, 4020086, 3006656, 2386670, 7325522, 3512823, 3422311, 4976265, 4230329, 2865794, 6929489, 8266433, 5576788, 2486698, 5123903, 6295109, 7178026, 5498381, 5417464, 5934423, 1726322, 3881220, 4207535, 5677942, 5132654, 1246458, 77744, 924104, 1680874, 6520340, 3550573, 7025231, 6135203, 1900822, 7098673, 4775647, 1660285, 2271190, 5957212, 3298960, 5111597, 827814, 2929841, 6051760, 1278296, 7623519, 5238249, 7348742, 1726025, 1596466, 3252182, 6659402, 2976199, 1180663, 2641880, 7800277, 8111300, 8311921, 8122607, 1959521, 7454494, 8030184, 5886552, 4310039, 8058615, 6198130, 3093356, 7689772, 949865, 5298816, 2284612, 4373852, 3403758, 432281, 6199326, 5897790, 3130504, 2191957, 5947605, 4448929, 5345527, 6866521, 3464927, 178790, 2454718, 3417454, 5889345, 24272, 7070784, 2971596, 8008972, 1953104, 5619033, 4899078, 3799771, 6304372, 1813411, 3665745, 2294798, 4524785, 5400411, 1177684, 8085857, 1432248, 3648655, 3040518, 3853536, 2352663, 8016374, 8073683, 5424203, 7771419, 581494, 5913701, 5377096, 5015620, 5248855, 2691550, 4095029, 3825884, 1269718, 2503310, 5900315, 4370327, 7650648]] +aHat * NTT(y): [[890294, 2651520, 2688558, 387763, 2565296, 5517659, 523118, 6761937, 2699953, 6032617, 8351690, 7867921, 393475, 568812, 1446196, 5126390, 6988889, 5957197, 5855493, 5147597, 8166286, 3340190, 7321532, 403956, 3414109, 6191583, 2170064, 5895694, 4323695, 6769409, 2842479, 7423236, 1947672, 755642, 2623763, 7319359, 7283103, 4426245, 6115135, 6299944, 6344921, 3868329, 7849104, 7229146, 5986891, 5711199, 1208591, 2047997, 2633294, 7269318, 2592383, 2027824, 3734050, 3048838, 5484766, 2514494, 8030737, 7830600, 1446477, 5952047, 1071680, 383222, 5868099, 5871466, 960369, 714096, 5668986, 2013601, 2278618, 6778793, 3481509, 3297387, 1466487, 3558549, 1377572, 4031239, 3219136, 2847821, 1732277, 6710881, 832688, 3434098, 280725, 2828707, 8118553, 5042136, 7508725, 4518935, 1362531, 7195134, 6907737, 6033398, 1922437, 1837756, 6409319, 96986, 4771972, 4535942, 6194379, 7271698, 6029738, 594235, 8277108, 5638964, 7041126, 1523334, 1023926, 1638459, 6800518, 4318786, 7967306, 5677239, 2854982, 5406599, 1298997, 3964146, 2582515, 4061381, 2656381, 6806615, 2623706, 6252147, 2108757, 1712897, 1524211, 4664514, 4191526, 5604560, 7541555, 4313027, 2832422, 5543053, 1117871, 6134538, 852813, 2916525, 3479985, 5597661, 172981, 5346328, 7375386, 2647410, 1284525, 2340499, 5868367, 3444933, 4035072, 4168098, 6012657, 1990704, 804991, 7647327, 2324897, 6483554, 2360032, 2237996, 6111322, 342921, 4583467, 1047388, 5808981, 830471, 3293096, 6130438, 2791695, 4666794, 6213476, 5700024, 3195401, 1626564, 5000794, 6608156, 1697562, 7619996, 1092916, 5059756, 6033575, 7320364, 6380138, 1237120, 6758769, 8231223, 1081584, 3593918, 7217392, 8157915, 3879657, 6692399, 3203197, 2973059, 2152783, 1325226, 1524163, 1747596, 4937355, 1543934, 6787929, 7977554, 6802240, 6281156, 4722904, 3817259, 4865951, 2798518, 609140, 4923137, 7475480, 3637557, 2917269, 6693645, 7126995, 862322, 5611775, 3624547, 3972090, 2678014, 2667504, 307573, 3502753, 2552501, 1792377, 1171165, 6680757, 2335828, 1268549, 7194055, 8170340, 4764767, 94084, 198721, 4914224, 2297696, 8355441, 7346458, 47210, 2703528, 3069564, 1787844, 8029397, 7275989, 3181284, 4660125, 2318191, 2158331, 5236544, 7040114, 6319317, 1797415, 3782036, 4403737, 1170407, 726178, 573260, 6800791, 2136897, 7985912], +[680870, 3359763, 3056088, 2628723, 6784235, 1459663, 7578978, 8219844, 1400952, 6040450, 3161583, 3569554, 2131232, 5238433, 1300522, 719198, 7966490, 6738980, 4062912, 8035390, 2537562, 7626336, 1066379, 5425234, 1261999, 4019656, 2941961, 774199, 7638130, 1139041, 7029376, 5276688, 1570956, 2958716, 795138, 4159589, 1859322, 4710439, 3956063, 7133145, 279425, 6902661, 3132881, 3758259, 2274416, 1409771, 5121601, 4308928, 2599653, 6358630, 4048079, 4569326, 2845508, 1874780, 810551, 5282846, 717377, 5576662, 4265680, 3934626, 6145499, 3214883, 2483835, 1115074, 7113523, 6486719, 4703654, 6799736, 2933196, 743776, 8296502, 6147436, 7477211, 3567546, 5370628, 4753977, 6694849, 7598861, 7490741, 691393, 7250620, 2812165, 241634, 783271, 6153632, 5055310, 6096686, 5094352, 4851352, 6134452, 5231890, 6740359, 533303, 8363723, 7575286, 2625927, 5018696, 4229911, 4764537, 8215154, 7661651, 8322132, 7648754, 2138093, 4753661, 3645215, 5456858, 6336406, 480824, 6568241, 6238523, 8170280, 7207499, 5649146, 66227, 5797267, 2758278, 3490823, 1998504, 658612, 1383008, 4844626, 3932008, 5027738, 6385827, 6674895, 2340551, 6795203, 4888256, 3851274, 7467932, 6196403, 1107747, 4343860, 2157290, 5380900, 2353854, 2445596, 3526770, 3670617, 2934584, 7062990, 4801852, 2731257, 3082706, 7037999, 5202246, 2514471, 18570, 2830156, 2043303, 7208758, 2029522, 6777728, 352229, 1020430, 7050457, 7200429, 5891100, 6191111, 6586289, 3646212, 5055345, 7279497, 868308, 1320072, 3843313, 8331154, 4093899, 8201292, 8283835, 1988118, 3581956, 7636841, 4403358, 1173063, 876528, 5010148, 6591381, 1194954, 4879584, 3012122, 6411735, 7122278, 5562128, 1841129, 4275793, 7983122, 5712344, 5144476, 6504082, 1848021, 2556791, 4829830, 5040579, 5123989, 1622697, 5124467, 8039504, 6253462, 2787705, 8155617, 4296069, 399772, 7766740, 3160314, 3965434, 8146919, 7430269, 4160116, 3327075, 5915766, 186946, 6065621, 2575931, 2671676, 5933109, 6796772, 5536478, 6243885, 4402816, 800277, 1052819, 6585725, 6357635, 1641978, 662807, 856, 5918005, 4146696, 1676689, 4386682, 3646372, 5695857, 6578639, 6157049, 877822, 27676, 3002648, 3394563, 1254688, 6417385, 4257316, 3926961, 5101145, 456433, 2279782, 2116751, 3907006, 7431827, 5807803, 1110416, 4583117, 1210903, 8157377, 1911189], +[4422313, 375249, 8166979, 2482523, 1876203, 2569376, 1931688, 7061248, 7893603, 8027686, 6364007, 7537674, 6925837, 5864421, 4468757, 1998228, 5126868, 5745683, 5428125, 4278218, 1368916, 5024216, 6738141, 5753603, 540735, 6725110, 8237073, 402865, 2459405, 3053771, 4801222, 7305162, 7216850, 5517778, 6829921, 3692535, 617445, 5413038, 2318945, 1016161, 4226690, 8018313, 1159510, 4695563, 2452820, 865486, 2805567, 1946061, 7460939, 4655075, 8148555, 3428374, 1051306, 2083350, 4811328, 4247271, 235602, 6614120, 4671614, 4683239, 2657991, 1922058, 3664944, 4414903, 7683346, 4157480, 6987417, 4861928, 4739562, 2905116, 1511385, 5062274, 3529256, 6398452, 37451, 4438341, 4451627, 8189378, 7008546, 6233925, 1047205, 8353209, 797188, 7427845, 4919543, 6552512, 5773806, 3398009, 2183188, 8353689, 1851909, 1471440, 5446260, 4152368, 3283043, 3115657, 4776535, 6649177, 7252591, 7347172, 2623316, 6790642, 1848951, 3837668, 6679421, 5668108, 8055595, 3540357, 5726620, 3479669, 1758459, 876223, 2705620, 7332230, 7468180, 1225878, 105413, 684219, 5156194, 8041091, 4243184, 577545, 3661144, 2138316, 1806723, 2834393, 6600281, 1000339, 3577528, 7255194, 4148766, 7080628, 3346666, 5977398, 2691708, 7436165, 8244543, 5313710, 3745059, 8026047, 2308563, 2505689, 1256135, 8304535, 7171661, 4312584, 864514, 5085007, 6450478, 475145, 3056904, 3649472, 3487377, 7504224, 811988, 7097478, 6696323, 1168512, 3823087, 7343355, 7258656, 7344379, 2952111, 3358950, 2021867, 1894391, 6367412, 7437082, 6114520, 2570870, 4171727, 5991866, 4786507, 7835355, 8256044, 5380585, 3477183, 1557118, 1110038, 5454870, 830455, 8062672, 2143376, 7410434, 1508483, 5512567, 2405432, 993047, 7055933, 7128747, 1680892, 4999174, 6273988, 281526, 482638, 1985857, 4302324, 1608459, 3240476, 2249904, 5137322, 3817948, 6137297, 3978397, 8003501, 6702502, 3772212, 1576596, 3866333, 7062582, 4717397, 2786929, 8077201, 7140330, 682426, 3273204, 5600467, 7345580, 1379796, 6032882, 368660, 1894964, 6557598, 6169070, 2045903, 275715, 337714, 3255855, 157286, 3778803, 3723853, 3523842, 3255213, 2838019, 7112882, 5712607, 6287464, 5140560, 3630876, 2248561, 6871061, 418533, 7586509, 3459948, 6772162, 7577801, 2772203, 1713590, 6399654, 7692375, 1273751, 4393480, 4215842, 1728040, 4766630, 6761510], +[856731, 7411031, 1143034, 5424068, 2884189, 2462709, 5406124, 8195021, 1492401, 3633914, 3270390, 8205558, 5860125, 2432618, 3515642, 6118183, 7317662, 7497881, 5370987, 5011720, 571559, 6686375, 3657269, 1881818, 646146, 5280616, 3174217, 8033223, 8243000, 4271820, 1724622, 8313680, 4216850, 4955489, 4194192, 7779123, 2204625, 5790972, 4799103, 3766979, 1546175, 7230694, 7381771, 4113690, 2196021, 74146, 5871598, 7576029, 3948844, 2398480, 1384794, 1333311, 6914079, 4008942, 4380840, 2965748, 6194771, 3333293, 4634272, 6979816, 6284227, 4881612, 1581822, 1210672, 5985624, 6632242, 3752197, 7852454, 776732, 980165, 5639197, 7931373, 574937, 3226350, 531619, 6994454, 3556186, 4838480, 4742604, 178041, 6091733, 3530717, 6920874, 578526, 1486006, 4223938, 7512455, 4408449, 4347989, 4964516, 5074066, 5280787, 2987969, 3895087, 1543675, 6288114, 5873182, 1807441, 1529561, 201663, 1010057, 4113929, 5222396, 4487437, 1477005, 4652940, 8241782, 3135535, 7187213, 2681680, 4188250, 2871853, 8144498, 2644732, 5294724, 8350129, 1016932, 3691811, 3563313, 6272525, 7558992, 6381918, 2247063, 6962710, 7933574, 6246792, 3437037, 4347262, 5133426, 2505098, 3529912, 3206617, 5169320, 4014036, 4620077, 2022443, 356403, 7748986, 8077327, 5872251, 4626188, 879890, 5231109, 5070478, 4605038, 2790316, 8277556, 43219, 7183474, 2264516, 2509870, 3578689, 2253349, 8020712, 992136, 3793512, 8069406, 2602745, 4987010, 118391, 3889335, 2511678, 6924974, 4671333, 4252092, 6552979, 2980548, 3651857, 3972072, 6415710, 3972584, 4970913, 3700971, 6555306, 3688674, 4969620, 5276364, 1168083, 6219836, 1575199, 1054606, 2891453, 1962623, 4369941, 386619, 1112363, 1740723, 4711665, 8267849, 2513152, 953147, 3250790, 1837070, 6223789, 6251304, 7474003, 7516422, 8233260, 2625653, 1336883, 1238525, 4451554, 5426778, 6644579, 7627974, 2790754, 3486691, 6821850, 4398485, 4960747, 7220122, 6620928, 5227873, 2475610, 5863352, 6523628, 1532503, 5349569, 4558111, 4920649, 5581410, 5517414, 5974322, 2328240, 1579674, 1123515, 4927078, 7166419, 2212758, 549940, 8031113, 6442331, 3085499, 5504072, 7602678, 781602, 4465057, 8136539, 936848, 1916298, 6793598, 1607786, 8226388, 8328829, 3659614, 668103, 5394174, 1491841, 7499904, 2582761, 56126, 4184726, 5202333, 6070222, 4231930, 7161690]] +w = NTTInverse(aHat * NTT(y)): [[7624703, 240004, 2962974, 4152364, 6463756, 2415566, 3786264, 6154666, 3889519, 1100982, 7580840, 4326198, 4924153, 2874925, 7907723, 5555767, 6391451, 4049873, 8074931, 1893800, 950453, 2959143, 8019761, 4148133, 3883490, 3708927, 5271804, 7515854, 1051073, 7247763, 1518251, 408661, 5334341, 55737, 2018703, 5144345, 6612492, 7651462, 5931065, 8192531, 7758789, 2536827, 684454, 7236206, 4487486, 7831429, 7990553, 709177, 2987503, 751576, 2729366, 7972189, 2747989, 2522381, 4416254, 240891, 7576318, 7917005, 3022012, 3097114, 7206265, 5725099, 745443, 3752366, 3465657, 4814055, 6974705, 7666570, 3728792, 5220210, 5663196, 5871436, 583085, 6968732, 2416160, 4663658, 5193451, 6765677, 811614, 7963349, 3969626, 5799839, 7549898, 7902910, 6730593, 7387568, 8084618, 200118, 6497554, 1801143, 4562267, 1277537, 2661944, 2623191, 2033609, 8185038, 701178, 3928782, 8059066, 7938559, 5021973, 4757037, 1053131, 1156675, 2105683, 7212892, 6869130, 5409001, 5929304, 8346957, 4989430, 7363630, 2144236, 5532431, 5270856, 3738502, 2612255, 85507, 5909215, 145407, 1717007, 5712300, 5751460, 5887573, 1460586, 792283, 849969, 7643752, 7705537, 6321600, 163323, 7592530, 1428631, 1732255, 6705417, 1198038, 1719272, 1416901, 563851, 3191560, 6454580, 683784, 3049884, 3633252, 6140333, 4696610, 6526693, 6379638, 1034000, 3794140, 1030894, 5418727, 8340105, 3976177, 6141946, 5588294, 7528683, 6786432, 802743, 2646789, 8060558, 7768921, 7447134, 5587228, 6381403, 7394543, 4384605, 749440, 1602782, 6708673, 1241371, 436991, 4817036, 7911228, 4660309, 3695823, 1982806, 4475766, 7667611, 152376, 1005616, 8139280, 3862468, 2644328, 784232, 2261513, 1599481, 7408718, 1093615, 5067180, 5304027, 4080504, 3830757, 2672714, 249847, 2681896, 4020508, 1388114, 3064553, 2532220, 1252292, 2096422, 6283428, 6593878, 4521977, 4994046, 919551, 2667672, 2419080, 5287667, 1945394, 7206577, 3595768, 6313912, 6896908, 7363857, 6547309, 7430755, 7167386, 6687182, 2726835, 4750409, 3087703, 4664321, 3767946, 4493683, 6277434, 856225, 7383241, 7025367, 1526268, 1273430, 7129566, 7801230, 4723349, 3269582, 3896577, 1681312, 8305875, 3291839, 1663673, 206881, 8238073, 8249897, 258576, 4083472, 6336002, 2937834, 3966306, 2354150, 1907072, 2842675, 2290177, 2544452, 6202865, 1879107], +[7999206, 7767594, 5804783, 5621026, 7468503, 7601690, 2889310, 2111660, 6486008, 3674014, 954663, 6401907, 3343557, 1950187, 3388091, 7516222, 4646223, 4714332, 2260654, 3473899, 5781882, 8326388, 7559184, 8241477, 4748595, 6342608, 7712696, 2189541, 7028645, 1482987, 8146292, 2919300, 8041727, 5876120, 5113865, 515010, 45253, 3392840, 968326, 993968, 7108656, 7503227, 4862663, 3401959, 1903451, 5019759, 7007145, 6995864, 5207881, 822740, 7531812, 3476652, 5555632, 3132509, 5102257, 4410958, 6168196, 3502794, 5651370, 2841466, 7835890, 3753997, 5969676, 788835, 5254048, 4551773, 1767990, 6139884, 1890806, 2898909, 6393423, 7991042, 5653727, 4844667, 7423662, 7860577, 7874296, 7213402, 7668455, 3403384, 2583229, 2234189, 5139923, 1581860, 6827813, 1391326, 2227606, 5839537, 2580221, 5586963, 5748437, 5613338, 59817, 3335540, 7686002, 1654886, 445215, 2647817, 1415140, 206604, 3880977, 7284847, 532648, 7321673, 3350077, 2875224, 3239674, 2355424, 7719196, 1383667, 159904, 7205688, 330035, 3660690, 4784504, 7035365, 4049788, 3195766, 3272593, 3835044, 2758243, 4191336, 2012183, 5402613, 7135106, 7616231, 2407267, 6084962, 7339910, 7411384, 2144265, 273720, 4068409, 4660653, 754262, 3091598, 7625468, 2005595, 3337235, 5470168, 4744756, 5196434, 5723167, 2461893, 3502543, 6684132, 6962811, 6812215, 668598, 7491266, 4321757, 6700956, 1609211, 7857910, 1902696, 4117092, 3418675, 3003709, 1863373, 5503462, 6095149, 6246220, 1958265, 4153054, 4759159, 6722737, 7423007, 6699338, 1824802, 8143047, 542186, 7672094, 5572003, 8159978, 6345865, 5234454, 1072827, 782539, 5418797, 6678242, 7365089, 5670150, 5176020, 1012163, 491699, 3086875, 2741220, 5532586, 4079213, 5736399, 4976224, 7827337, 5115788, 3489836, 1225600, 5166442, 5152337, 7681816, 5104564, 4021773, 7290938, 3107132, 7809308, 6873873, 713473, 5335999, 5510116, 4236751, 1671936, 4996582, 6804633, 3560604, 947093, 2086246, 2901347, 4817061, 6184769, 5576869, 889223, 5409769, 2901988, 3589318, 7504909, 4678847, 4566482, 1962467, 1178890, 4753561, 4537599, 4752814, 1521620, 7127524, 3177361, 8337289, 6346550, 1735552, 4243794, 2554660, 4561061, 727636, 6246204, 1141969, 7324844, 2134982, 7293540, 1941430, 5461870, 5199008, 5385431, 3269938, 7030830, 4209717, 7181219, 998361, 5944831, 2671135], +[1843453, 1651637, 8292642, 8162068, 5735633, 3917334, 1637744, 8041465, 653957, 670249, 2526811, 4484870, 4766636, 1054872, 5656595, 1159967, 359223, 3093807, 2175155, 1505961, 7495806, 5685732, 1747799, 2082096, 6102940, 5365187, 4725544, 4813437, 1972038, 7421994, 1096349, 518861, 4921294, 2567203, 8238511, 1813802, 7886774, 1042649, 92163, 900853, 7974435, 5457650, 3902638, 4869951, 1819987, 7971515, 5407666, 1090268, 5490023, 7116213, 1560463, 4596713, 1525703, 7626827, 7093022, 5943795, 6821582, 7255377, 4004000, 5890962, 1022326, 4952398, 5958548, 2698572, 5888995, 7654819, 2998476, 3013645, 6827506, 5249965, 440516, 3846063, 5080584, 7071041, 5489535, 2009738, 6967830, 2651959, 8220776, 4769476, 2733390, 7455789, 2314602, 538231, 1004413, 7196220, 7140425, 7093311, 2124414, 855861, 8252938, 7856024, 6554555, 5336826, 1549482, 3889898, 1066587, 5488839, 8333880, 6289231, 3173128, 1413610, 7897558, 4396294, 4400585, 5250798, 5773253, 266702, 3128159, 7430696, 3622397, 7612000, 1147220, 1379492, 314898, 5981228, 7630327, 1870381, 1085858, 2104756, 4125178, 3476440, 3419246, 3950178, 3085306, 7749627, 5958453, 1411769, 5340788, 469789, 2218152, 3118327, 859682, 4920167, 3048300, 5758269, 3378085, 5415716, 4589674, 6044408, 5256937, 4987254, 4752911, 1248623, 5202860, 751399, 7359216, 3476893, 4204044, 3698083, 6725490, 7246132, 8315075, 8277795, 7496303, 5833778, 5158172, 4143976, 6911398, 4976247, 3612282, 3615886, 88355, 1785067, 233351, 2618364, 6620232, 1771456, 7315904, 2386995, 3419605, 200817, 5547982, 1289957, 2546806, 8336092, 4503662, 7091553, 3724884, 2017462, 6365803, 7128937, 4537172, 1936866, 7060306, 8088304, 7014796, 2798695, 5960959, 976813, 6464611, 809839, 3433534, 4235995, 7793879, 2241442, 3055972, 2971354, 5229900, 6717861, 8319508, 5877193, 172722, 7944353, 5082997, 5416807, 8220837, 3256025, 96997, 6282915, 4210859, 3973878, 1166414, 2931398, 7209591, 936897, 4348352, 2870763, 7146718, 7619774, 280906, 2069172, 180178, 4299059, 4438598, 5010649, 1303723, 2122592, 4892848, 6951752, 7993411, 2496720, 1815793, 2299579, 5317818, 5922401, 465153, 4363824, 1619525, 5904907, 6488511, 909925, 1383578, 6555276, 5306541, 6929713, 7542463, 6292210, 6099203, 8292056, 477133, 6961080, 7668156, 7228767, 6978685, 5824410], +[4386491, 1825204, 4474271, 4293312, 2026760, 3812337, 4512926, 737301, 2884739, 4899754, 7000258, 198158, 2399458, 5791564, 947946, 5705740, 7823337, 4440994, 7444362, 4052287, 2711554, 6268915, 3719582, 1680093, 1471428, 6288420, 1063531, 3491798, 1341374, 7979638, 7534703, 4905584, 4840233, 790992, 4910244, 2640317, 453856, 7124545, 3422239, 3779724, 7937816, 3059721, 358662, 2015546, 324411, 3470359, 2193271, 7072358, 5894398, 7317965, 2641833, 2305891, 6595902, 2484579, 1544377, 3693482, 7587563, 7731827, 1676404, 5392431, 7611699, 5976727, 5759282, 2514315, 7682044, 3573290, 8297207, 571753, 1755311, 2678557, 825219, 5259932, 1753014, 1976512, 2764657, 642266, 7745634, 8075565, 6309160, 196671, 6256156, 1310933, 3827265, 5400634, 2742904, 7911484, 257511, 5500185, 221297, 1070322, 4768589, 4360508, 56432, 2458252, 3581841, 7267388, 7949562, 6065672, 5918499, 256847, 4206595, 3275273, 6024973, 3652007, 6281534, 7094568, 1634936, 3288937, 3846071, 4827979, 4720706, 1405585, 4656403, 4359916, 4463516, 1223141, 4446800, 2500792, 2425945, 6985040, 576235, 2377258, 7100129, 7802023, 169988, 5754115, 6303457, 4166612, 2979611, 7705387, 4792512, 3543335, 7314616, 7957209, 237547, 1313229, 6172303, 8008999, 2675645, 2824579, 15099, 5286026, 6186222, 2366798, 7294448, 7356759, 5803023, 1893418, 7670462, 2569006, 7044483, 3331591, 8143457, 972771, 6591578, 5240598, 5999711, 4581707, 1982331, 6780711, 6332320, 5319909, 203961, 6109104, 3470339, 730302, 2817043, 6569814, 4486322, 535440, 1629657, 6300407, 3310888, 201462, 2104146, 2139650, 5083693, 8053814, 2183208, 7848316, 94266, 3427160, 3160240, 170055, 5300665, 5399352, 8354611, 6985811, 2808927, 1839130, 6184297, 3065617, 5444959, 2909870, 3490388, 5202071, 2269576, 3803002, 2769037, 7498114, 8330144, 6828329, 3705194, 2911479, 737178, 5787980, 1363059, 3922285, 1495739, 5707605, 3610028, 7227156, 3932974, 3095588, 6062955, 1028605, 6677154, 6282034, 3295822, 8319831, 8248323, 6167189, 2397537, 5775294, 285173, 1310789, 6945536, 3745837, 5191614, 3066113, 6368472, 1140242, 49155, 6751583, 521417, 458372, 6786223, 4649460, 2942491, 2445962, 6317948, 2448344, 6598652, 2009395, 6843236, 7239832, 5547738, 1442708, 3407243, 6671150, 7394562, 4355086, 7755340, 5486873, 7860391, 4022967]] + +w1: [[40, 1, 16, 22, 34, 13, 20, 32, 20, 6, 40, 23, 26, 15, 42, 29, 34, 21, 42, 10, 5, 16, 42, 22, 20, 19, 28, 39, 6, 38, 8, 2, 28, 0, 11, 27, 35, 40, 31, 43, 41, 13, 4, 38, 24, 41, 42, 4, 16, 4, 14, 42, 14, 13, 23, 1, 40, 42, 16, 16, 38, 30, 4, 20, 18, 25, 37, 40, 20, 27, 30, 31, 3, 37, 13, 24, 27, 36, 4, 42, 21, 30, 40, 41, 35, 39, 42, 1, 34, 9, 24, 7, 14, 14, 11, 43, 4, 21, 42, 42, 26, 25, 6, 6, 11, 38, 36, 28, 31, 0, 26, 39, 11, 29, 28, 20, 14, 0, 31, 1, 9, 30, 30, 31, 8, 4, 4, 40, 40, 33, 1, 40, 8, 9, 35, 6, 9, 7, 3, 17, 34, 4, 16, 19, 32, 25, 34, 33, 5, 20, 5, 28, 0, 21, 32, 29, 40, 36, 4, 14, 42, 41, 39, 29, 34, 39, 23, 4, 8, 35, 7, 2, 25, 42, 24, 19, 10, 23, 40, 1, 5, 43, 20, 14, 4, 12, 8, 39, 6, 27, 28, 21, 20, 14, 1, 14, 21, 7, 16, 13, 7, 11, 33, 35, 24, 26, 5, 14, 13, 28, 10, 38, 19, 33, 36, 39, 34, 39, 38, 35, 14, 25, 16, 24, 20, 24, 33, 4, 39, 37, 8, 7, 37, 41, 25, 17, 20, 9, 0, 17, 9, 1, 43, 43, 1, 21, 33, 15, 21, 12, 10, 15, 12, 13, 33, 10], +[42, 41, 30, 30, 39, 40, 15, 11, 34, 19, 5, 34, 18, 10, 18, 39, 24, 25, 12, 18, 30, 0, 40, 43, 25, 33, 40, 11, 37, 8, 43, 15, 42, 31, 27, 3, 0, 18, 5, 5, 37, 39, 26, 18, 10, 26, 37, 37, 27, 4, 40, 18, 29, 16, 27, 23, 32, 18, 30, 15, 41, 20, 31, 4, 28, 24, 9, 32, 10, 15, 34, 42, 30, 25, 39, 41, 41, 38, 40, 18, 14, 12, 27, 8, 36, 7, 12, 31, 14, 29, 30, 29, 0, 18, 40, 9, 2, 14, 7, 1, 20, 38, 3, 38, 18, 15, 17, 12, 41, 7, 1, 38, 2, 19, 25, 37, 21, 17, 17, 20, 14, 22, 11, 28, 37, 40, 13, 32, 39, 39, 11, 1, 21, 24, 4, 16, 40, 11, 18, 29, 25, 27, 30, 13, 18, 35, 37, 36, 4, 39, 23, 35, 8, 41, 10, 22, 18, 16, 10, 29, 32, 33, 10, 22, 25, 35, 39, 35, 10, 43, 3, 40, 29, 43, 33, 27, 6, 4, 28, 35, 39, 30, 27, 5, 3, 16, 14, 29, 21, 30, 26, 41, 27, 18, 6, 27, 27, 40, 27, 21, 38, 16, 41, 36, 4, 28, 29, 22, 9, 26, 36, 19, 5, 11, 15, 25, 32, 29, 5, 28, 15, 19, 39, 25, 24, 10, 6, 25, 24, 25, 8, 37, 17, 0, 33, 9, 22, 13, 24, 4, 33, 6, 38, 11, 38, 10, 29, 27, 28, 17, 37, 22, 38, 5, 31, 14], +[10, 9, 0, 43, 30, 21, 9, 42, 3, 4, 13, 24, 25, 6, 30, 6, 2, 16, 11, 8, 39, 30, 9, 11, 32, 28, 25, 25, 10, 39, 6, 3, 26, 13, 43, 10, 41, 5, 0, 5, 42, 29, 20, 26, 10, 42, 28, 6, 29, 37, 8, 24, 8, 40, 37, 31, 36, 38, 21, 31, 5, 26, 31, 14, 31, 40, 16, 16, 36, 28, 2, 20, 27, 37, 29, 11, 37, 14, 43, 25, 14, 39, 12, 3, 5, 38, 37, 37, 11, 4, 43, 41, 34, 28, 8, 20, 6, 29, 0, 33, 17, 7, 41, 23, 23, 28, 30, 1, 16, 39, 19, 40, 6, 7, 2, 31, 40, 10, 6, 11, 22, 18, 18, 21, 16, 41, 31, 7, 28, 2, 12, 16, 5, 26, 16, 30, 18, 28, 24, 32, 28, 26, 25, 7, 27, 4, 39, 18, 22, 19, 35, 38, 0, 43, 39, 31, 27, 22, 36, 26, 19, 19, 0, 9, 1, 14, 35, 9, 38, 13, 18, 1, 29, 7, 13, 0, 24, 37, 20, 11, 33, 37, 24, 10, 37, 42, 37, 15, 31, 5, 34, 4, 18, 22, 41, 12, 16, 16, 27, 35, 0, 31, 1, 42, 27, 28, 43, 17, 1, 33, 22, 21, 6, 15, 38, 5, 23, 15, 38, 40, 1, 11, 1, 23, 23, 26, 7, 11, 26, 36, 42, 13, 10, 12, 28, 31, 2, 23, 9, 31, 34, 5, 7, 34, 28, 36, 40, 33, 32, 0, 3, 37, 40, 38, 37, 31], +[23, 10, 23, 23, 11, 20, 24, 4, 15, 26, 37, 1, 13, 30, 5, 30, 41, 23, 39, 21, 14, 33, 20, 9, 8, 33, 6, 18, 7, 42, 40, 26, 25, 4, 26, 14, 2, 37, 18, 20, 42, 16, 2, 11, 2, 18, 12, 37, 31, 38, 14, 12, 35, 13, 8, 19, 40, 41, 9, 28, 40, 31, 30, 13, 40, 19, 0, 3, 9, 14, 4, 28, 9, 10, 15, 3, 41, 42, 33, 1, 33, 7, 20, 28, 14, 42, 1, 29, 1, 6, 25, 23, 0, 13, 19, 38, 42, 32, 31, 1, 22, 17, 32, 19, 33, 37, 9, 17, 20, 25, 25, 7, 24, 23, 23, 6, 23, 13, 13, 37, 3, 12, 37, 41, 1, 30, 33, 22, 16, 40, 25, 19, 38, 42, 1, 7, 32, 42, 14, 15, 0, 28, 32, 12, 38, 39, 30, 10, 40, 13, 37, 17, 43, 5, 35, 28, 32, 24, 10, 36, 33, 28, 1, 32, 18, 4, 15, 34, 24, 3, 9, 33, 17, 1, 11, 11, 27, 42, 11, 41, 0, 18, 17, 1, 28, 28, 0, 37, 15, 10, 32, 16, 29, 15, 18, 27, 12, 20, 15, 39, 0, 36, 19, 15, 4, 30, 7, 21, 8, 30, 19, 38, 21, 16, 32, 5, 35, 33, 17, 0, 43, 32, 13, 30, 1, 7, 36, 20, 27, 16, 33, 6, 0, 35, 3, 2, 36, 24, 15, 13, 33, 13, 35, 11, 36, 38, 29, 8, 18, 35, 39, 23, 41, 29, 41, 21]] +w1Encode: 68005962438194815EDAA37662A52A05A45AD4C49D8689081CB06C23FAAD69439858AA1210E1A84E7305A80A41A647505256A2D4E67D43D9601B49A89587A6E3A90662821D8EB3AC44A5AA5A66188B49721FA09D4BC7510EF00589E77D0841A06818A048321AC9314422014D6026860555704005762849386A7A76E27911C87808998A4DCA8506C54A3904839CC6C655941338D50135C7128E9856380DA79853489EE2698E4E066114161267891C659A4554024449B0AE41153E15A33C4C132A6AEA7927FA2CE2548892229D58C6481E80AE59882E25B23EEAB70D805414E5A9498A56961B814A1DB45DA0E43D29F5111C9680CA23AA5E76A6A9894A0EB321E4C17C4EE775808426827304943998D21331E91198C294955514518EB57025DA80E7B904154640E82275D9E635D25892C4798D48AA5812A47460A858D9788ECA3AA0DD1A6E06C18DA7B71503E47495A7A59B646C1BBA5526949204D75989464EC5F264605770CF7466986264588694111026568311A1612EA6D26D5C545A66F1394A02AC5E95A803D16099E11902B420A7972C209765CA690C5AB32A6901146A47698ACA195D8960085A7EA4597D85F6391F0A412427505BD92DA5B366CEC90C8559960BB1A6228750460784D1915E17E705D039A1C6217CA8622C96245550FA1D9CC0408506791287819C961D1B714AD6349AC07A7E9B456AD30424813326662305DDD10058492D618929A55A3E5F211292953210B48DC017A81BB746416855C66316D763A2C1125C97762C1AA9360AC37DC2957C6271881C8986203094A8597E97725D0B85118F56068D5778E975564E4825486848878A6A19A1394229512A242C82C4949FE93063834C689A70E8E735E8040C89437089F20CA91A06E141718E1A7481915D4033992AF80556044E61994454961DD8751957D3940353A681175A109A4DA61A1CA0EA3C000732E6E9296853466B317220A69021178012F188D8908451B02C9BBAA48014051C07948F0242DD236D0CF59C00393D8477548837991504166318012BD878C141521B141AC0380824F63461332EA4D921D2785E699756 + +cTilde: AD259CA6B31AF6C5932C3F672E3C5842F6BBCF530A9926AE0A733A08B67164D3 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] +cHat: [2351294, 5154594, 7619067, 780238, 4898984, 2160977, 4115292, 3545139, 2454475, 2601249, 423314, 8379775, 7676007, 2968393, 4757578, 3832556, 7026830, 3117567, 2003652, 3819097, 2017920, 191430, 1719161, 6391986, 215607, 3517295, 2623535, 3571947, 798448, 6542326, 8236818, 7151126, 4510222, 5029254, 4760646, 968159, 2959686, 3136122, 7176060, 8196795, 2796543, 4064055, 4164872, 3696373, 6704757, 5892744, 2179106, 6698434, 1403326, 1444986, 7824822, 5904499, 577770, 6026943, 1545210, 8088838, 431396, 3968599, 7421446, 5144732, 7997460, 3501350, 4062069, 1147237, 477237, 6344962, 5701392, 4601691, 7407865, 3205222, 4615600, 6687820, 3589180, 544027, 1898516, 6417966, 1605526, 1821517, 7893719, 8013419, 7670571, 94430, 3033416, 3686433, 1544858, 6558468, 3768692, 3369417, 4023882, 138178, 203460, 6804947, 5058007, 1810723, 3746727, 6410965, 6195760, 524269, 8049564, 5667085, 6064573, 2651677, 152795, 7372801, 6968536, 4105844, 6210108, 1209115, 7437496, 725989, 357689, 7411087, 919781, 3096921, 1791722, 7064242, 7098506, 7512747, 5740942, 3101016, 4514311, 4982256, 4812897, 523852, 7052250, 2329605, 1143020, 4340794, 3405069, 1891791, 5050834, 4467892, 3830798, 2503312, 8195380, 6348189, 2971968, 738591, 2812994, 4852282, 7730883, 5189063, 3217590, 3285949, 2948918, 142849, 6777106, 5831545, 6851410, 5742697, 5645835, 2113954, 8051228, 4366601, 1901297, 4020643, 6732445, 4441688, 5974940, 1257762, 97113, 3928529, 3571180, 3919398, 6579860, 2611966, 5764854, 8106418, 7173943, 6402582, 7642060, 2040252, 8358644, 189461, 3919578, 6986130, 772836, 111667, 7454225, 7154781, 8068544, 558943, 4218020, 2441411, 1794044, 7298924, 8159567, 7348614, 5790294, 2426200, 4223771, 2560111, 491067, 2852209, 3299639, 4453343, 1360684, 470444, 7694391, 4236357, 2088703, 2179263, 4067535, 5700090, 5262486, 5083018, 5106668, 7119736, 5010382, 5102988, 7279286, 916385, 8180800, 2581553, 5704551, 302104, 1029774, 2871666, 3049066, 738594, 5240661, 5746994, 6658287, 7001117, 3652423, 8002288, 3822883, 6066580, 4736500, 5536418, 6796558, 4885896, 1368717, 7854830, 505076, 6549079, 6119612, 5125463, 8005075, 2010614, 4437222, 2665472, 283992, 133844, 7641711, 1725074, 6097266, 3776282, 7302918, 6249998, 4292012, 4106090, 4402972, 5650080, 2347233, 3490497] +cs1: [[1, 3, 8380410, 8380400, 0, 10, 2, 7, 22, 8380406, 8380407, 8380408, 8380412, 10, 8380411, 9, 4, 6, 8380406, 13, 8380414, 8380411, 6, 8380416, 6, 8380414, 16, 6, 3, 3, 8380416, 17, 8380416, 16, 0, 14, 8380402, 8380408, 8380404, 24, 8380411, 4, 8380412, 8380410, 3, 3, 7, 3, 8380414, 8380410, 10, 1, 8380415, 11, 8380404, 8380381, 3, 0, 8380414, 8380410, 19, 8380416, 8380409, 8380413, 8380415, 8380413, 8380416, 9, 8380413, 8380408, 1, 0, 7, 8380414, 11, 9, 5, 8380415, 15, 0, 8380414, 1, 8380413, 20, 8380410, 12, 0, 18, 8380409, 8380409, 8380415, 8380411, 7, 5, 21, 1, 0, 8380412, 8380408, 8380403, 8380416, 0, 2, 8380404, 2, 8380414, 7, 2, 13, 13, 1, 8380414, 8380403, 5, 8380409, 5, 11, 8380402, 8380410, 1, 5, 8380409, 6, 3, 0, 8380412, 8380407, 19, 3, 8380415, 8380406, 8380413, 8380402, 8380412, 4, 13, 8380415, 3, 8380416, 0, 7, 6, 8380408, 8380404, 8380404, 8380403, 12, 8380406, 6, 8380410, 12, 6, 18, 6, 2, 8380411, 8380413, 7, 11, 20, 2, 4, 8380407, 8380416, 8380413, 2, 8380404, 8380410, 8380410, 8380413, 8380409, 6, 18, 0, 8380402, 8380410, 8380408, 8380407, 8380414, 6, 0, 6, 8380409, 8380410, 8380411, 13, 2, 8380411, 8380411, 8380416, 8380413, 8380406, 12, 8380410, 3, 8380408, 15, 18, 10, 8, 7, 8380397, 8380400, 8380407, 8380401, 8380406, 8380416, 8380416, 8380403, 5, 8380410, 8380407, 8380413, 2, 2, 8380412, 8380414, 8380405, 3, 8380405, 8380407, 16, 9, 3, 11, 3, 8380414, 8380404, 0, 7, 9, 8380414, 8380409, 14, 8380413, 11, 8380401, 0, 8380409, 2, 14, 4, 12, 5, 6, 8380411, 24, 8380414, 5, 8380413, 8380403, 2, 8380416, 8380406, 3, 7], +[8380397, 8380398, 8380412, 8380402, 8380414, 8380411, 8380415, 8380407, 8380404, 8380415, 8380414, 8380407, 2, 1, 8, 2, 13, 18, 8380415, 6, 2, 7, 7, 10, 6, 8380415, 8380405, 4, 8380408, 3, 8380409, 2, 6, 8380398, 3, 16, 8380413, 16, 5, 10, 8380414, 12, 8, 8380410, 11, 8380401, 8380416, 8380407, 8380408, 8380410, 8380411, 8380404, 7, 8380406, 8380403, 8380415, 2, 8, 9, 8380403, 8380414, 0, 7, 8380415, 8380414, 8380416, 4, 8380408, 2, 8380415, 8380415, 8380416, 2, 0, 7, 8380409, 8380416, 8380412, 25, 8380407, 8380415, 5, 0, 8380414, 8380386, 7, 8380415, 8380416, 12, 5, 3, 1, 8380408, 8380395, 8380415, 8380398, 8380413, 8380400, 7, 1, 8380411, 1, 6, 8380415, 8380415, 10, 9, 8380416, 8380409, 17, 8380413, 3, 4, 8380413, 8380412, 8380409, 14, 8380414, 6, 8380416, 8380406, 14, 7, 8380406, 5, 8, 2, 8380416, 8380415, 8380408, 9, 8380407, 0, 0, 8380405, 2, 8380404, 8380406, 8380416, 8380411, 8380408, 8380400, 1, 7, 8380414, 8380396, 8380416, 8380404, 1, 8380411, 8380411, 8380413, 4, 8380415, 8380415, 9, 4, 11, 2, 2, 17, 8, 8380408, 16, 1, 12, 8380415, 8380408, 8380414, 8380416, 8380415, 4, 8380398, 6, 6, 8380416, 0, 8, 8380406, 2, 8380399, 16, 8380406, 8380407, 8380399, 8380413, 8380412, 9, 5, 8380410, 16, 6, 8380406, 3, 2, 8380415, 9, 8380409, 8380408, 8380404, 8380414, 18, 2, 8380413, 8380413, 5, 8380401, 6, 8380413, 5, 8, 8380411, 10, 8380411, 8380405, 8380409, 8380402, 20, 9, 8380416, 7, 17, 8380416, 8380408, 3, 8380411, 12, 10, 8380411, 6, 8380416, 8380411, 8380413, 8380416, 8380411, 9, 8380411, 8, 13, 8380414, 5, 8380408, 3, 2, 21, 5, 2, 8380415, 2, 8380416, 8380415, 2, 8380402, 9, 8380414, 22], +[9, 8380416, 8380402, 8380412, 8380405, 8380416, 2, 8380408, 8380416, 8, 8380408, 8380408, 1, 8, 5, 0, 8380411, 9, 3, 8380403, 3, 12, 8380416, 4, 8380408, 1, 14, 13, 8380401, 22, 6, 8380412, 8380409, 13, 12, 8380411, 8380413, 15, 8380401, 1, 8380409, 6, 8380405, 8380411, 9, 7, 8380410, 1, 17, 8380412, 1, 5, 8380413, 8380401, 8380416, 8380416, 8380403, 2, 8380413, 8380411, 1, 8380401, 4, 8380413, 8380404, 8380405, 7, 11, 8380412, 7, 7, 8380412, 8380408, 8380416, 5, 3, 8380408, 2, 4, 11, 12, 8, 3, 3, 3, 10, 8380416, 6, 10, 6, 8380415, 8380412, 11, 3, 4, 3, 5, 8380402, 5, 8380405, 6, 8380415, 8380404, 6, 8380404, 5, 9, 8380415, 8380416, 8380416, 8380405, 1, 8380407, 14, 4, 8380408, 13, 7, 3, 6, 8380412, 14, 1, 8380401, 8380408, 14, 0, 8380415, 8380408, 9, 8380414, 2, 14, 8380412, 5, 4, 3, 8380411, 4, 12, 1, 8380415, 2, 8380408, 3, 8380406, 8380408, 8380414, 8380412, 2, 8380411, 8380414, 14, 8, 8380401, 3, 8380416, 8380411, 8380404, 3, 8380404, 2, 7, 15, 19, 11, 8380405, 8380413, 8380412, 1, 9, 8380414, 2, 11, 8380412, 18, 8380415, 8380416, 8, 1, 8380409, 3, 8380414, 12, 4, 8380408, 5, 4, 1, 8380409, 0, 8380413, 8380412, 8380410, 8380409, 8, 8380411, 9, 8380414, 8380408, 8, 8, 8380411, 8380412, 2, 8380407, 3, 8380408, 8380413, 2, 8380407, 8380408, 8380410, 8380405, 6, 8380414, 2, 8380414, 6, 8, 8380415, 8380413, 3, 9, 2, 8380413, 13, 16, 11, 8380413, 8380411, 8380414, 6, 8380413, 8380416, 0, 8380416, 6, 8380412, 8380413, 7, 8380415, 8380405, 8380413, 1, 8380416, 8380409, 8380413, 0, 8380412, 7, 8380401, 8380416, 2, 1, 5], +[8380413, 8380404, 4, 8380415, 3, 8380415, 3, 16, 6, 0, 5, 8380410, 6, 25, 8380408, 3, 3, 8380398, 4, 1, 20, 12, 8380414, 8380413, 8380401, 8380405, 8380405, 10, 8380404, 8380411, 18, 8380405, 8380412, 8380415, 11, 8380405, 8380408, 0, 8380407, 5, 4, 9, 8380415, 8380409, 3, 8380399, 8380415, 8380416, 10, 8380406, 1, 13, 5, 2, 1, 4, 8380413, 8380414, 8380414, 8380412, 8380413, 6, 8380401, 8380415, 15, 8380411, 8, 19, 8380408, 12, 8380411, 19, 5, 18, 8380412, 10, 5, 8380409, 18, 8380409, 8380411, 8380396, 0, 14, 8380414, 2, 1, 0, 8380409, 8380402, 8, 8380416, 0, 8380397, 8380406, 8380412, 4, 8380413, 0, 9, 6, 2, 8380414, 4, 8380415, 1, 8380399, 11, 8380409, 12, 8380409, 8380410, 1, 8380414, 8380403, 8380405, 1, 8380409, 4, 8380416, 8380408, 8380415, 8380404, 8380415, 8380411, 8380403, 13, 5, 5, 8380408, 8, 8380404, 16, 8380414, 16, 21, 8380408, 8380412, 11, 4, 8380408, 2, 8380408, 8380401, 8380399, 8380408, 8380413, 8380413, 8380412, 10, 8380410, 8380412, 8380415, 13, 8380410, 5, 14, 8380415, 2, 10, 12, 8380410, 5, 8380400, 8380408, 11, 8, 1, 9, 0, 8380409, 8380399, 6, 8380401, 8, 8380416, 8380416, 8380403, 8380408, 8380411, 8380407, 8380393, 8380406, 8380411, 8380415, 8380412, 4, 9, 8380398, 8380404, 8380409, 8380414, 8380402, 8, 3, 21, 15, 8, 15, 8380409, 8380409, 17, 1, 12, 10, 6, 8380410, 8380414, 8380407, 8380406, 3, 8380404, 8380412, 1, 8380415, 8380407, 8380400, 8380409, 6, 2, 8380399, 8, 8380416, 2, 2, 4, 7, 1, 8380408, 8, 8, 3, 8380416, 8380414, 11, 2, 8380411, 3, 8380407, 8380415, 8380412, 8380415, 8380408, 8380416, 3, 8380410, 8380415, 8380402, 6, 8380409, 8380400, 5, 8380415, 8380413, 2, 8380416]] +cs2: [[6, 11, 14, 10, 1, 8380412, 8380404, 14, 11, 2, 8380416, 8380412, 10, 15, 8380411, 8, 8380411, 2, 0, 8380411, 2, 8380407, 8380411, 8380415, 2, 7, 4, 1, 8380413, 1, 8380406, 4, 8380401, 8380410, 4, 8, 10, 6, 6, 8380416, 8380407, 0, 5, 8, 10, 11, 9, 8380413, 8380406, 6, 8380401, 8380411, 4, 6, 4, 8380412, 10, 8380409, 8380412, 8380402, 8380408, 1, 8, 8380413, 8380412, 2, 8380406, 8380415, 8380396, 8380406, 3, 8380413, 14, 2, 12, 2, 2, 8380407, 8380411, 4, 8380410, 8380398, 7, 2, 8380413, 4, 8380416, 6, 8380413, 8380411, 3, 8380410, 8380398, 1, 8380410, 9, 8380414, 8, 10, 4, 8380405, 5, 8380405, 2, 8380412, 3, 8380413, 8380406, 8380410, 12, 4, 8380415, 8380409, 8380413, 8380411, 3, 8380414, 0, 8380414, 8380415, 9, 9, 8380411, 8380413, 1, 8380405, 1, 8380410, 1, 8380403, 1, 7, 10, 8380416, 8380413, 5, 8, 8380406, 8380409, 8380402, 8380408, 8380411, 8380415, 8380414, 8380409, 8380416, 5, 9, 12, 9, 11, 1, 10, 8380405, 2, 8380406, 8380404, 3, 8380416, 6, 0, 8380415, 8380408, 8380404, 8380410, 0, 11, 4, 6, 11, 8380408, 8380412, 8380410, 8380412, 8380415, 8380404, 8380416, 2, 3, 8380413, 8380414, 11, 8380401, 8380416, 8380409, 8380407, 8380395, 8380403, 5, 8380408, 16, 6, 8, 8380412, 8380409, 12, 1, 8380412, 11, 8380414, 0, 2, 2, 8380402, 8380407, 8380404, 8380407, 8380407, 8380416, 8380416, 5, 8380408, 0, 8, 11, 8380410, 8, 9, 3, 8380411, 0, 8380409, 8380414, 8380398, 5, 8380405, 4, 8380404, 2, 4, 8380407, 8380416, 3, 5, 2, 8, 2, 3, 8380413, 8380411, 4, 2, 8380416, 10, 8380414, 1, 8380411, 0, 8380414, 0, 7, 4, 8380410, 16, 18, 1], +[3, 13, 7, 3, 8380402, 0, 7, 8380405, 8380398, 5, 1, 4, 2, 8380412, 25, 8380414, 8380412, 8380411, 12, 5, 8380407, 8380414, 9, 20, 8380408, 17, 9, 8380415, 8380411, 8380415, 7, 6, 12, 10, 8380411, 8380412, 10, 8380411, 8380415, 4, 8380413, 8380411, 8380410, 8380412, 1, 9, 4, 8380404, 5, 8380411, 6, 8380411, 8380409, 8, 8380415, 0, 8380411, 2, 1, 8380400, 8380405, 8380405, 1, 8380394, 8380413, 10, 1, 0, 8380405, 11, 1, 8380410, 2, 0, 8380414, 8, 8380405, 1, 8380414, 8380407, 8380404, 8380404, 8380404, 8380403, 1, 8380414, 6, 8380409, 2, 0, 8380411, 8380410, 4, 8380402, 4, 5, 8380403, 18, 4, 18, 8380412, 3, 3, 8380409, 8380398, 8380407, 3, 8380406, 10, 8380410, 8380412, 8380412, 8380399, 5, 5, 0, 7, 13, 8380412, 5, 8, 6, 8380410, 8380412, 8380410, 14, 8380398, 8380410, 2, 8380413, 8380412, 8380411, 8380408, 8380412, 8380414, 8380405, 8380408, 8380416, 8380412, 0, 0, 18, 8380412, 8380409, 16, 1, 8380403, 8380415, 8380411, 5, 8380409, 10, 5, 8380411, 0, 8380404, 10, 8380416, 7, 8380415, 15, 6, 2, 8380409, 4, 8380415, 0, 8380404, 11, 6, 8380410, 12, 8380414, 8380416, 8380406, 8380406, 8380409, 17, 2, 4, 3, 8380398, 8380412, 8380411, 0, 16, 8380415, 8380410, 1, 0, 2, 15, 1, 6, 5, 1, 8380411, 8380413, 8380403, 8380407, 7, 8380400, 5, 2, 3, 8380414, 4, 8380410, 8380411, 8380413, 8380407, 8380415, 8380416, 14, 2, 8380408, 8380415, 1, 8380407, 8380411, 8380405, 11, 8380406, 1, 8380414, 8380416, 8380409, 8380414, 19, 8380403, 4, 8380411, 12, 8, 5, 8380416, 4, 8380410, 5, 9, 10, 8380404, 8380413, 8380411, 12, 8380405, 2, 0, 8380409, 8380408, 9, 8380413, 10, 8380413, 8380413, 3], +[8380411, 18, 8380399, 8380399, 8380408, 8380415, 8380410, 12, 8380401, 5, 8380413, 8, 2, 11, 8380409, 8380410, 5, 8380407, 8380414, 8380408, 3, 8380416, 8380408, 8380410, 8380392, 8380408, 1, 8380415, 4, 8380416, 5, 8380407, 2, 1, 1, 8380407, 8380405, 6, 9, 8380413, 3, 8380402, 8380414, 2, 3, 8380413, 8380414, 5, 8, 8380409, 8380412, 8380409, 3, 8380408, 2, 4, 4, 12, 8380397, 4, 8380407, 8380415, 8, 8380413, 14, 0, 2, 8380401, 12, 8380414, 8380411, 8380404, 8380395, 3, 8380405, 18, 22, 8380416, 8380407, 1, 8380410, 13, 8380407, 2, 0, 0, 8380405, 16, 8380413, 8380410, 8380416, 1, 8380416, 8380414, 8380410, 11, 1, 8380410, 5, 10, 9, 9, 1, 8380416, 3, 8380407, 5, 10, 4, 0, 8380414, 8380399, 13, 8380412, 12, 0, 11, 8380412, 3, 8380407, 17, 7, 4, 0, 3, 8380415, 8380413, 8380415, 2, 8380413, 8380410, 8380406, 18, 14, 23, 2, 3, 2, 0, 5, 8, 9, 8380412, 3, 8, 9, 9, 8380414, 8380409, 8380405, 8380414, 18, 8380416, 22, 8380407, 18, 2, 11, 8380413, 7, 10, 8380416, 12, 14, 8, 8380413, 8380407, 9, 12, 1, 8380402, 4, 1, 4, 8380406, 8380406, 10, 4, 4, 8380413, 8380408, 7, 8380413, 8380411, 5, 8380411, 16, 0, 5, 14, 11, 8380414, 8380413, 1, 11, 6, 8380408, 8380400, 4, 8380415, 7, 8380412, 8380406, 2, 9, 10, 18, 4, 5, 8380409, 6, 8, 12, 8380402, 5, 13, 4, 8380410, 2, 1, 8, 3, 11, 9, 8380403, 8380415, 8380411, 3, 2, 8380407, 5, 4, 11, 3, 13, 5, 8380406, 15, 8380415, 6, 8380416, 8380416, 17, 0, 8380415, 8380401, 8380413, 7, 16, 8380414, 8380409, 6, 8, 8, 13, 8380407], +[10, 8, 8380416, 2, 4, 8380407, 16, 8380410, 15, 9, 1, 3, 8380413, 2, 8380414, 8380394, 5, 1, 2, 8380413, 8380399, 12, 8380404, 9, 8380405, 11, 8380409, 8380413, 1, 8380414, 7, 9, 8380411, 6, 1, 8380416, 8380411, 1, 8380404, 8380416, 8380401, 8380412, 1, 8380413, 4, 9, 8380416, 3, 8380398, 11, 0, 8380416, 1, 8380410, 2, 5, 17, 8380414, 21, 7, 3, 8380415, 12, 8380416, 10, 13, 8380409, 3, 8380396, 13, 8380411, 4, 8380397, 2, 8380401, 4, 3, 13, 8380413, 17, 13, 15, 2, 4, 1, 12, 5, 4, 0, 8380397, 3, 2, 2, 17, 8380395, 10, 8380411, 7, 7, 8380408, 8380412, 0, 4, 8380405, 8380416, 9, 5, 8380405, 9, 8380408, 8380414, 13, 3, 1, 8380411, 8380412, 8380394, 5, 8380414, 8, 8380392, 4, 8380416, 8380405, 8380410, 8380416, 5, 1, 18, 21, 6, 8380416, 8380415, 7, 10, 8380411, 8, 8380401, 15, 11, 6, 8, 13, 8380404, 8380400, 8380414, 8380412, 11, 8380408, 15, 12, 8380405, 4, 8380392, 8380408, 11, 12, 0, 8, 8380412, 5, 8380414, 4, 17, 11, 4, 8380404, 19, 8380413, 9, 0, 8380405, 8380415, 8380411, 8380407, 8, 15, 15, 8380413, 8380396, 3, 8380405, 7, 8380407, 16, 1, 8380414, 8380408, 4, 6, 8380412, 0, 8380404, 7, 8, 8380416, 14, 8380408, 15, 8380403, 8380398, 0, 8380412, 6, 12, 4, 7, 8380407, 2, 8380409, 15, 17, 11, 5, 8380414, 10, 8380413, 8380416, 8380401, 17, 15, 5, 8380411, 5, 11, 0, 7, 8380410, 8380405, 8380405, 8380410, 8380405, 16, 3, 2, 8380408, 8380405, 8380414, 8380407, 8380416, 7, 10, 8380407, 8380409, 4, 9, 3, 12, 8380413, 8380410, 8380416, 8380415, 13, 8380411, 14, 8380406]] +z: [[8327090, 94591, 8300798, 8272597, 61859, 6727, 8344001, 109117, 53395, 7442, 8268757, 8280872, 8262450, 8357750, 8267522, 8374862, 94846, 8310403, 23011, 8274971, 8251735, 99445, 127570, 8349196, 8286057, 125734, 8325649, 73380, 15600, 116129, 8341191, 17395, 45489, 8356141, 8280242, 8323182, 44635, 129399, 8287081, 106485, 124390, 8302631, 69561, 16764, 8284893, 90506, 8284090, 111075, 8255897, 116588, 54332, 82993, 8347100, 3300, 118446, 126596, 31256, 66518, 8334400, 7881, 8323337, 8280749, 8261564, 8326590, 8324804, 8317693, 8320361, 111070, 8257836, 8326596, 8308884, 8350336, 8257941, 80304, 33632, 8294966, 102645, 8311093, 8290069, 122327, 36438, 8258011, 87926, 5299, 74401, 8267457, 8323189, 46157, 66235, 129901, 42485, 8337690, 8292893, 8304331, 77839, 8337230, 18100, 8346423, 8341075, 8275672, 64184, 8272116, 23501, 8332562, 8298449, 8301602, 8334095, 1529, 8363756, 74655, 17121, 54399, 8371924, 100230, 25705, 8271344, 8299739, 77840, 46229, 69831, 62035, 62152, 66193, 18954, 43892, 65631, 8349532, 125295, 8285006, 104849, 71414, 8273538, 8314668, 8250405, 72320, 8304187, 8360369, 8345917, 115438, 8360204, 8351737, 54952, 4306, 70497, 8288309, 46663, 7316, 8376835, 8356040, 8350861, 8344706, 71416, 14151, 8287959, 33144, 8257739, 8303448, 8282684, 8328895, 8338833, 89559, 8332465, 50674, 8328613, 8358529, 57253, 113258, 8324997, 8329760, 7203, 8300946, 8270196, 8342701, 37304, 70334, 8299032, 91453, 8259837, 86265, 62491, 8281539, 105866, 123514, 19048, 97084, 56882, 116420, 8375423, 8253391, 85672, 45427, 110124, 4895, 64906, 47566, 23876, 128669, 8301467, 110447, 7360, 70529, 8332805, 107259, 106212, 8282240, 8317659, 50838, 18697, 73302, 8314866, 8369800, 8352690, 8297505, 61907, 43685, 121988, 110717, 107525, 34527, 25657, 8376129, 8267629, 8308302, 110015, 126131, 4603, 77093, 40487, 8316887, 110638, 54311, 66643, 3039, 8361421, 92749, 101635, 8321736, 8257720, 55564, 129153, 8269569, 8212, 95607, 8325159, 8276048, 41745, 8293256, 8603, 76762, 8371709, 63784, 12680, 8320564, 229, 8260959, 49946], +[5912, 8968, 114752, 8300865, 122020, 8287438, 8308088, 107807, 8267260, 8316945, 8339110, 8358139, 27502, 113205, 122734, 69459, 8337767, 8346782, 100052, 2472, 95952, 8275141, 8347694, 8294050, 8303308, 6031, 8324288, 42872, 8359166, 10554, 8260007, 76108, 8361659, 8259332, 8334721, 8273484, 122318, 16712, 101535, 98282, 8255985, 67625, 63749, 8271786, 8296604, 96749, 8309065, 572, 8339909, 100456, 8364597, 70382, 57701, 28935, 8295466, 68780, 123247, 16558, 41763, 8251670, 8368790, 8249654, 8323217, 8270863, 8317044, 8255416, 8311542, 8334986, 8357530, 8290763, 18488, 8287765, 87217, 49926, 120194, 40432, 87742, 8337862, 8352856, 9058, 8305789, 72743, 8257058, 130404, 8263236, 95093, 8363282, 8377501, 121194, 97904, 2140, 8727, 8361236, 79481, 8371204, 36069, 59180, 8320388, 60242, 8264184, 8268319, 8378639, 8327403, 8265470, 8343698, 89957, 8326626, 8339690, 8255879, 16568, 49474, 8347685, 8277029, 8336880, 103265, 119976, 8357283, 44824, 109133, 8352533, 54437, 120842, 8373019, 22304, 8351578, 8337049, 127553, 8251998, 73492, 67041, 8314395, 101763, 8274236, 8327310, 8359191, 8263104, 8285057, 8332537, 83615, 55652, 60460, 33039, 63487, 8274301, 8254196, 34606, 8328865, 113050, 8302695, 53138, 19987, 27236, 28999, 8338650, 26354, 8330209, 8351630, 8325746, 8349604, 8333749, 16760, 8304182, 8322445, 121221, 106094, 8321861, 8315677, 48370, 9419, 8360450, 8328164, 124861, 8266716, 54585, 8279298, 52624, 8345599, 82523, 8332458, 86980, 8290565, 8260723, 16550, 8346026, 8365372, 35167, 118626, 8285786, 8292879, 48202, 8278689, 8285862, 8250582, 8342135, 8326617, 89539, 2533, 71361, 8306780, 115924, 20240, 27872, 8302415, 8289362, 128230, 113218, 48196, 97840, 81793, 8361691, 8284568, 8258779, 8339800, 42692, 22723, 111436, 8336412, 8298169, 8361825, 119385, 8251409, 8322938, 113755, 8367345, 8293987, 102123, 8353427, 8329710, 8329843, 8281487, 8294793, 8345258, 8323362, 76993, 33878, 8344104, 21634, 8309408, 8353543, 64649, 8372249, 8272917, 122404, 1360, 8257837, 72351, 8317003, 55560, 16193, 8362805, 54863, 126917, 8338203, 8294090, 8291103, 8292744], +[9194, 8252144, 8273384, 8290312, 8290146, 55875, 113559, 33052, 8274898, 81677, 8352385, 92310, 28457, 17307, 8311471, 8325498, 8272344, 2547, 8272810, 8368919, 8341472, 8302416, 36443, 15334, 8315280, 8344526, 8363855, 8307018, 113367, 5681, 8352960, 8261900, 8369800, 8307719, 65460, 8277282, 8374353, 8335253, 43764, 102668, 58404, 103262, 8341033, 8297155, 8359738, 8254134, 8261943, 8253125, 8255714, 8311341, 8368324, 101891, 85532, 70283, 8255455, 8281414, 99190, 16173, 8283794, 8307138, 24816, 8271357, 41638, 8322507, 8319210, 125095, 8356512, 74862, 66652, 8252066, 8271348, 8378839, 8348707, 8342530, 8280416, 8318890, 8311316, 8356869, 59221, 112005, 54345, 8292837, 114348, 126232, 35821, 8296926, 116139, 8319860, 8288001, 129388, 8343731, 128248, 1557, 8296135, 24299, 118707, 18725, 98073, 68414, 130975, 8348491, 8258134, 8260936, 26901, 43828, 8348459, 8318079, 92426, 8305897, 119296, 19658, 31962, 8252584, 8322891, 51943, 8354945, 8254293, 8342437, 97218, 8362487, 8323692, 12239, 8320658, 8353880, 60278, 51458, 8375527, 54202, 38781, 8311374, 8253462, 8359680, 92333, 24796, 66407, 128735, 8306471, 13886, 8304136, 8375750, 8295447, 8270016, 8310338, 8293790, 8264497, 131043, 8266560, 8347795, 8252826, 56897, 8302533, 118409, 8353246, 39830, 26636, 8375199, 44733, 8306852, 8329456, 128704, 69724, 8301272, 53478, 8301647, 77369, 13308, 8296169, 8341666, 8345977, 8334308, 10308, 8320627, 8270597, 8296399, 56539, 8373929, 8362977, 39071, 8364097, 108965, 25917, 8289569, 8341759, 8336258, 8284273, 8268381, 127137, 8375204, 8370144, 85126, 8283442, 8335041, 8378248, 12885, 111789, 8340581, 112630, 8262988, 39949, 8366231, 50580, 58520, 8368455, 1008, 51730, 42597, 8253619, 82448, 70775, 8370158, 8335841, 8355588, 26617, 8317192, 90633, 2763, 3059, 8263511, 104993, 8331399, 8372229, 37970, 95855, 8353104, 8313099, 8332833, 8309228, 8268344, 5461, 89248, 80898, 91233, 8324317, 97759, 123131, 8308289, 66539, 8369525, 8273793, 8363680, 71711, 42855, 59077, 8359847, 8320520, 8302319, 50199, 100023, 89528, 51086, 8321087, 18240, 8327731, 39365, 8318463, 72983], +[8311175, 8272247, 8322936, 128565, 101454, 98948, 63875, 8312242, 12791, 8313613, 8355967, 93643, 130661, 108637, 8351277, 8140, 8255868, 8255660, 8313680, 38130, 8336706, 45570, 8261551, 8307821, 8306114, 722, 8328863, 429, 21253, 8325498, 36363, 99678, 112615, 92095, 78375, 8355774, 8335615, 115581, 8316684, 8288860, 15957, 103656, 79666, 109099, 40003, 100622, 8344174, 104068, 3289, 8321213, 8305004, 82434, 8333005, 126211, 8337730, 8309699, 8288308, 29538, 8262618, 67208, 112141, 59604, 124329, 89980, 8361604, 8284757, 8308542, 105709, 47764, 112453, 8374929, 43650, 8308503, 14030, 53056, 8253148, 8293487, 8379961, 84558, 69808, 7973, 23795, 92368, 8075, 8256860, 8343134, 34652, 8310894, 29841, 26512, 8290881, 8317322, 8348367, 8306426, 8306361, 8260310, 8324334, 8266776, 62294, 71988, 8259840, 122198, 8338986, 8287973, 128260, 90192, 8311107, 8315993, 8356849, 110729, 63694, 8301073, 31136, 81030, 107141, 8289494, 69519, 8316840, 25217, 8272567, 20078, 8306420, 8275015, 98173, 110957, 8302405, 49312, 8352687, 102449, 8264339, 8300361, 112968, 8252877, 8276734, 8331637, 8342719, 52680, 8296394, 53814, 8321636, 8282461, 118629, 8297886, 122968, 10250, 79700, 8332007, 115382, 4795, 8265473, 107575, 8278308, 128064, 8292048, 8334343, 8348606, 100317, 8368305, 8282721, 118148, 52517, 8251032, 6294, 2716, 36221, 8323671, 101336, 8331434, 56000, 8356984, 120942, 8320653, 59712, 8249481, 34249, 37221, 128537, 8259669, 8264677, 8276490, 85718, 129619, 26747, 130332, 98144, 79648, 8274039, 65838, 8325755, 86190, 46109, 66707, 111417, 103562, 36023, 52801, 8353885, 8358384, 37658, 59270, 96080, 50986, 110325, 75820, 8275989, 113518, 31197, 8334084, 8321322, 8368248, 8275320, 8348917, 48371, 8351432, 58621, 82750, 10340, 130962, 8340276, 8340859, 88706, 8295014, 8349544, 105507, 32210, 8262840, 96904, 111636, 8356089, 8270802, 41366, 8329296, 8353439, 63702, 91987, 109118, 8253107, 66408, 34697, 39438, 79620, 8321084, 81951, 8286192, 8355528, 118146, 8315590, 51122, 8332403, 8333789, 106094, 26425, 68882, 8270945, 8277126, 4918]] +||z||: 131043, ||z|| too large +r0: [[6137, 49529, -84464, -37854, -12021, -60461, -23003, 59804, 80228, -41804, -37719, -54469, -27921, 17950, -91759, 32303, -84319, 50127, 75443, -10834, -1869, -88271, 20279, -42073, 74208, 90104, -61192, 87757, -91707, 10130, -5450, 27729, 1365, 55744, -76405, 1809, -53758, 32896, 26675, 2580, -50225, 60795, -77407, -1434, -83660, 22394, -8944, -52675, -59910, -10286, 62886, -27293, 81489, 46343, 35578, 50432, -42252, -82475, -25407, 49705, -31358, 11178, -16421, -56910, 37310, 52453, -72452, 48012, -80467, 77693, -50727, -32944, 11679, -78438, -59884, 92520, 50921, -91017, 49764, -36143, -30111, 85938, -68669, 93884, 64357, -40532, 85131, 9648, 21782, 86973, -8872, -55704, -4533, -43306, -61488, -4923, -60675, -70970, 59568, -60933, 69921, -4568, -89641, 13889, 10584, -24743, 12430, 76020, 24927, -33472, 37362, -64464, 49140, 8979, -62130, -70781, -54238, 85507, 4834, -45055, 2822, -1629, 37546, -16807, -63127, 30439, 88112, 25199, 86976, 36302, -27142, -26037, -95091, 18080, 39181, 55249, 5088, 83664, -7533, -46313, -21187, -78066, 2462, 14439, 45493, -64989, 50912, 94317, 81668, -15149, 78563, 85734, -40322, -23555, 47096, 64849, -89864, -70275, 40888, -19713, 61070, -40101, 19047, 63785, -94366, -33553, 3922, -12420, 79064, 42422, -91868, 56068, 55443, -88255, 89175, 77020, 78167, 95092, 49048, -38084, 53299, -50683, 53204, -22167, 22384, -24045, 75791, -19364, -49174, -75339, -28981, 80754, 21469, 6223, 59391, 15388, 20763, 54871, 17118, 56191, -80956, 1316, -1886, -72347, -49149, 41995, -32759, 1186, -56951, -45324, 40749, -31046, -23048, 28592, 40193, -64232, 71525, 2650, -70249, 20948, 60339, -11183, 40282, 93204, -41339, -77441, -7882, 94382, -44857, -21805, 2566, -59817, 82395, -7799, -38253, 31686, 87295, -32867, -74538, 53957, -50507, 16415, 48122, 59935, 68115, 83727, 50696, 80874, -33435, 68582, 2425, -14289, 4616, 68404, -82465, -25534], +[-285, -41443, 90856, -92897, 40422, -16870, 32343, 16568, 10251, 55193, 2342, -73873, -84797, 45552, -40286, 88129, 75092, -47262, -24926, 45542, 67972, -54026, -59385, 51505, -12996, 57279, 94127, 94439, -18517, -40723, -43667, 62334, 42227, -28274, -28657, -56377, 45243, -35506, 16008, 41644, 61492, 75137, -89394, -26388, -1190, 67686, -40027, -51291, 65348, 60890, -86754, 48306, 32184, 85077, -40269, 30286, 73354, 74440, -62551, -15477, 26878, -55271, 65291, 27002, -78940, -19373, 53813, 45036, -13822, 41938, -82354, -8439, -60195, 83067, -4431, 51545, 65284, -24231, 49898, -24958, -83254, -51366, -2592, 58162, -28892, 58081, -57968, -64839, -86277, 63507, 34523, 89889, 59813, -92797, 67438, -59295, 64301, -18697, 81888, 16122, 71702, 47212, -38747, 84049, -78256, 18274, 1783, 69867, -89838, 50426, -30555, -31939, -50875, 41869, 22899, -11803, 50037, -42135, 34710, 25759, 91739, 1122, -82914, 69626, 87945, -2343, -68746, -9879, -88188, -16708, 49166, 83262, 68674, 89522, -7591, 44186, 6917, -89508, -91112, -53288, -16844, 53888, 9252, -14131, 74175, 17891, -84343, -44487, -93252, 63165, -58907, 34706, 85494, 48892, -1944, -73103, -9687, -43714, -41274, -19992, 286, -39098, 53623, -37146, -2445, 56499, -5089, 33111, -79849, -46911, -29199, 53522, 48550, -29973, 60564, 91937, -69949, 20666, 85803, 11998, -63010, -43751, 33497, 59849, -79693, 39435, 74726, 9137, 79468, 22479, 24158, 18298, -26741, 61478, 82811, 23913, 9815, 63260, -37950, 22039, 53299, 59725, 279, 17167, -48386, 3010, -13344, 46550, -42234, 44522, -52061, -58210, -5226, -8872, 44385, 55470, 89923, 53412, -63087, 76783, 45040, -29509, 76824, -82754, -4651, 57828, 36114, -8036, -33556, -8772, -2096, 80362, -60539, -43136, 61233, 21377, 53582, 78635, -10080, -34229, -39118, -802, 87216, 39884, 55896, 36802, -61588, 56480, 52447, 32059, -16347, 19513, -56423, 46045, 40451, 4636], +[-61181, -62557, -87757, -27866, 21722, -82408, -76425, 41965, 82581, -91612, 50783, -86274, 5034, -87923, -57317, 17190, -21710, 46393, 80054, -17742, 67707, -28187, 33632, -13001, 8117, 32204, -36057, 51839, 67394, -6101, -46440, -52521, -30772, 91170, 48558, -90828, 77762, 90323, 92154, -51463, -25056, -65791, 93361, -82115, -84656, -27969, 74677, -52521, -33441, 69053, 36756, 25585, 1988, 8276, 45852, 39407, -35126, 17733, 4276, -13426, 70016, 336, 54156, 32080, -15403, 36259, -48950, -33763, -29210, -83024, 59594, 36796, -61922, 23870, -33909, -85384, -79360, -14536, 30834, 7875, 66901, 27680, 29044, -33163, 52093, -41412, 93269, 46127, 29314, 94012, 62987, 46999, 78780, 3837, 25777, 80607, -76198, -34610, -46542, 3909, -64769, 80353, 88533, 15623, 19910, -82184, 59328, 76228, 80731, 2600, 3584, -6542, 4423, 46249, -66042, 76844, 11756, -34254, -56929, 9662, -65047, 48081, -9110, -49566, 37879, -59395, 54073, 78523, 7794, 88865, -67409, 70914, -92656, -31911, 853, 44347, -50270, 82722, 18538, -50445, -76063, 35181, -8684, -84628, 60324, -10466, -68889, 48544, 13844, 79279, 59253, 8482, -65341, 87821, 68217, -70624, 15642, -46243, 54698, 24176, -6544, -2929, 88343, 70877, 42879, -48128, -45998, 57271, 78260, -89038, -8732, 10349, 24525, -43295, 70785, -44314, -67484, 44381, -84400, -77638, 80500, 81762, -33960, 32232, 13133, 88822, -32388, -58265, 56570, 24479, -11176, 47986, 5186, 45786, -15156, -44132, 8557, -76053, 87368, 51623, -60916, -27186, -17731, -55137, -59540, 83805, 30867, 18133, -93472, -2389, 20645, -25874, 23618, 74453, -28046, -15436, -32324, 13810, -90916, 1213, 90434, -25935, -10297, -81622, 57940, 58587, -29519, 27485, -59218, 95058, -6082, 20684, -88858, 14008, -15187, 18012, 84236, -16863, -94649, 517, 12736, -42394, 50313, 79500, -26449, 73025, -76093, 6891, 4339, -88358, -94251, -86094, 49588, -8873, -68496, -79964], +[5809, -79444, 93600, -87362, -68348, 3067, -58226, -24548, 27764, -52319, -46911, 7691, -76570, 77642, -4371, -8157, 14308, 60321, 16264, 52547, 45076, -16409, -89685, -34092, -52272, 3097, -79245, 63450, 8125, -19847, -83864, -46489, 78639, 29130, -41821, -26178, 72934, 77376, -6100, -29555, -61656, 12302, -22267, -79554, -56521, 41998, -92296, 25187, -9967, 80322, -24663, 20324, -70339, 8554, 20663, 74661, -31014, -77194, -37793, 59432, -6864, 72345, 45350, 38284, 63474, -45539, -83202, 358, 41156, 12048, 63369, -73064, 38858, 71870, -92287, 70870, -63393, 76064, 23852, 6190, -29169, -22330, 17983, 67638, 76407, -88016, 67042, -23275, 30833, -72442, 6986, -20166, 56430, -17797, -36953, 29746, -49920, -29183, 14108, 66392, 16392, 37385, -69879, 33203, -3777, 47391, -79245, 51061, 36782, 66388, -40891, 72324, 85264, -20757, 82850, 80362, 66151, 24755, -50084, -62136, 4868, 91686, 52962, -6989, -20469, 40196, 18140, -23597, -67831, 86806, 30906, -75480, 76986, -42286, 47073, -20013, 77447, 9527, 9134, -32392, 15093, -46974, 91361, 81243, 56833, -71334, 89108, -11233, 51911, 92959, -2697, 93715, -46499, 20476, -74653, -92405, -95149, 10571, 77683, -75988, 47003, -13080, 13493, 14239, 41976, -31558, -39904, 94019, -84810, -35961, -84519, 15107, 73002, 11004, 9052, 44538, -58850, 54311, 88108, 39313, 94263, -1180, -77655, -20399, -32343, 66359, -25803, -61348, -48037, -65516, 89454, 18193, -78484, 52903, 62028, 59544, -16006, -6269, -87938, 70032, -50254, -28375, 86383, 54513, -24690, 74056, 29804, -77449, -27975, -6307, -8803, -10493, -66781, 48159, -31890, 76275, 10918, -3277, 57950, -60603, 58356, 72336, -78489, 61369, 94698, -22459, 88825, -63436, 49098, 18701, 83167, -2530, 49139, 85340, -49977, 77453, -70469, 78327, 85541, -30069, 32629, -27698, -67578, -85701, -13472, 2191, 24279, -81016, -21105, 4917, -33533, -25584, -53697, -36577, 51353, 23234]] +||r0||95149, ||r0|| check passed +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[117652, -88500, 99229, 103745, 129782, 115311, 112350, -110374, 28110, 108233, -9323, 27872, -111444, 26883, -106147, -95173, 3177, -61361, 99918, -129464, 102617, 87660, -18701, -15969, 51387, 74837, -112376, -70190, 30302, 69400, -32560, 80676, -4724, -74901, -4812, -109182, 7318, 94512, -79924, 121527, -93451, -7898, 45462, 4204, -116288, 20933, -119091, -65312, 51224, 15198, 94286, 68768, -82469, -65566, -7167, -120832, 89641, 74686, 127419, -17720, 78289, -16698, -106550, 103935, 79505, 37320, 94846, -28005, -12253, 96371, 21551, -7986, -123850, -96787, -25178, -60279, -127469, -40298, 46, 68926, -69363, 103362, 60917, -100334, -45583, 73662, -59555, 127677, -106814, -17769, 114757, -63912, -102271, -73582, 52605, -77545, 45466, 103673, 54271, 38675, 6886, 87737, -67713, -108070, 96654, 62012, 37108, -31672, -123176, 88597, -89573, -53018, -18842, 114162, 92829, -9850, -126040, 23352, 18867, 22545, -72364, 104917, 67410, 93109, 45481, 78530, 84571, -106966, 106891, 119018, -125338, -127117, 65690, -106530, -30317, 58156, 125920, 100792, 118920, 26863, 34338, -6821, 113955, -45820, 17580, -115868, 78689, -17656, 76507, 81617, -13810, -67132, 69398, 6280, 36656, -26748, -74806, 34913, 85681, 106227, 87890, 32514, -92123, 19053, -84235, 18999, 105298, -11192, 105051, -20164, -77178, -33084, -28552, 82610, -72090, 15844, -101166, -95396, 114977, 97273, 111897, 6154, 7879, 275, 48082, -119267, 104302, 4007, -14922, -107101, 95207, -87265, 31962, -129628, -123646, -2205, -67454, 92247, -8229, 116560, -59498, 23552, -85498, -98033, -124457, 122600, -55815, -34971, -31585, -93490, 108378, -41866, -27252, 3517, -15234, -12874, -83167, 44614, -73211, -110223, -53185, -12026, -92142, -8911, -113959, -57989, -13625, -68748, -51153, 68412, -18129, 10966, 109791, -106641, 32815, -116037, 44195, 111881, 17049, 13825, -12909, -15967, 124696, -78238, 62561, -7565, -50887, 126273, -108077, 63416, -44582, -29442, 25577, -6253, -35305, 116408], +[-51527, 7529, -68067, -88153, -53466, -50969, -99076, 13866, -75340, -44939, -10117, -52928, 57773, 103566, -28885, 76530, -51204, 59470, 30336, -58224, -10649, -2577, 71618, -4813, 11097, -77088, -127626, -4233, -98579, -113205, -46640, 82315, -118542, -113320, 21208, 90324, -128251, -19671, 21928, -40073, 22784, -52235, 124466, 84171, -123166, -3687, 42300, 120964, -91961, 52796, -96234, 52667, 6194, -109214, 34134, -66092, -27479, -91826, -92885, -126861, -14011, 9143, 15610, -63768, -102328, 65621, -119690, 57863, 16857, 45170, -38569, 23011, -120444, 57469, 106560, 104108, -93076, -84060, 72279, 45141, 4651, -114914, 105535, 122421, 125102, 80249, -44576, 33901, -116802, -11500, 105132, -70079, 118692, -55167, -65847, 108285, 102957, 4498, -29368, 90102, -49183, 57717, -36507, -58049, -6743, 129169, 15797, 3128, 12499, 14807, -27508, 87881, -101626, -128683, 21500, 118432, 1648, -6016, -21732, 60018, 9518, 35537, 45629, 16666, -3519, -56541, 111794, 6882, -38451, 49162, 40861, 111904, -86999, 31854, 18661, -316, 99694, 89965, 9673, 18303, 4650, 97464, -15688, -1807, -2858, -40301, -103024, 17182, 9328, -126621, -18374, -108950, 34084, 109566, -111501, 30215, -128404, 32384, 64232, -64652, -50901, 62038, -82534, 128097, -56494, 77429, 32103, -23760, -121312, 35943, 118311, -61232, -58056, -57887, 46317, 15545, -100804, -102314, 93500, 10671, 78871, -13603, -10400, -34633, 102403, 118966, -111173, -92272, 76784, -46365, -36552, -65089, 41131, -39437, 111957, 109590, -73871, -103558, 53545, -128108, 49517, -26193, 80905, -125589, -71987, -42107, -53396, -109891, 2243, -24744, 60275, 45176, 92618, 21981, -42399, -18077, 68506, 55495, 41261, -28763, 63048, -8336, 107262, -59752, 10172, 15279, -52046, 67501, -3283, 107844, -78588, 107440, -27792, -63222, 3688, -71739, 51548, 41550, -24348, -124116, -96747, 79432, -1470, -72162, -92709, -19029, 7422, 106047, -106205, -45038, -57278, 28846, 23473, -12579, -77890, -79440], +[110184, 102236, 25926, -109551, -25723, -86016, -3800, 67891, -117550, -27105, 128237, 89837, 89022, 118420, 95928, 16410, -79474, -113637, -14062, -96582, 56252, -100595, -59552, -95532, -38407, -129255, -86047, -114757, -49613, 41083, -130054, -120581, -47368, 33510, -123696, -130772, 126817, 32153, 65999, 17979, 29879, 117941, -20933, -87501, 41201, -3719, -86356, -123945, -76854, 51926, 80608, -53752, -89565, -39238, 16365, 116808, 127632, -61081, -8485, 24427, -98976, 111879, 76835, -94505, 86496, -32582, -81060, -79499, 44557, -110886, 126622, -30754, 17922, 16595, -111680, 8327, 124628, -40862, 121416, 64044, -32925, 44462, -39181, -58686, 108730, 99089, 124609, 56012, 87358, 75475, 3337, -123704, 14434, -59577, -43900, -86710, -63402, -13027, -15156, -33368, 34025, 62227, -34547, 35621, -17164, -79005, 92055, 121858, -20094, 6411, 121775, 47659, 39033, -106403, 70796, -65540, -43035, -35177, 77329, -126587, 29810, -26516, 33598, 5692, 79632, -19389, -97754, 31140, 122928, 116165, -34216, -30169, 23363, -47276, -54397, -115734, -26990, -6969, -89363, 27318, -77055, 129367, 111873, 108544, -63913, -77898, -22473, -33712, 17987, 96979, 105947, 31286, 101742, -126715, -105439, -56265, -129350, -60978, -41041, 110059, 101602, -78117, -26590, 6265, 31944, 48973, -39655, -56983, -16205, -60035, 56876, -112536, 41550, -80269, -26625, 26712, 40417, 76549, 77888, -98115, 110914, 49308, -40960, -5590, -10514, -70514, 15891, 60399, 112391, -62592, -108702, 77619, -130615, -118070, 75993, -5246, -43754, -3775, -6658, -104013, -30347, -20206, -3538, -129990, 49151, 70182, -130168, -54250, -12109, 126899, 102877, -74834, 54838, -56112, 5566, -62106, -34056, 54163, 126762, -37854, -119919, -44964, -70148, 115356, 12787, -125859, 9561, -58199, 9518, 124202, 19947, -114225, -64707, -104376, -13429, -115179, -5706, 60211, 33319, -74779, -42397, 101529, 36992, -13990, 89556, 15510, -58572, 54995, -69090, 97927, 57319, -80248, 56952, 108143, -72264, 41385], +[-16882, 41597, -29584, -9412, -15129, 533, 19572, 105022, 130325, 65557, -11222, 18061, -67242, -90943, -21315, -19770, -63292, -53278, 115872, -55281, 29563, 127892, -25706, 19889, 54930, 125187, -5631, -111739, 64301, 131047, 81614, -80531, -18326, 114022, -37320, -21292, -36571, -27771, -95074, -16715, 31553, -54361, 88446, 39737, -47903, 39922, -111522, -112964, -22849, 37069, 127691, 115841, 59558, 78860, 110605, -98997, 114732, 123019, -53151, 89274, -91525, 34945, -91135, -29459, -45201, 50747, 113651, -26727, 35486, 118761, 72000, 14728, -73225, -113128, 45205, 50886, 109355, -111405, -2907, 44191, 37677, 123285, -73577, 73691, 10166, 86194, 29627, 36643, -102185, 75315, -118453, -64281, 126519, -45831, -99263, -107435, -79735, -118553, -68753, 120694, 56332, 67333, 117128, 87435, -43743, 120626, -65103, -127639, -65412, 110904, -101587, -81146, 113836, 106003, 55033, -83189, 25543, -130872, 76263, -55798, -64759, 5807, -129806, 83987, -87658, -38370, -83868, -120350, 69220, 37433, 91677, 107118, 34259, -8552, -281, 74592, -117170, -737, -52315, 26898, -91260, 29073, -72006, -5898, -108020, 88287, 76429, -49937, -46773, 2076, 40128, -39287, 107097, -30948, 22457, -23169, 25029, 12014, -45124, 125116, -12139, -4075, 100748, -3909, 54856, -41607, -78, -35852, -83291, 14145, -33134, 20578, -130429, 69999, 20845, 104329, 49910, -48303, 13323, -76505, -59679, 117968, 68890, 100179, 67281, 44097, -14217, 11398, 102605, -110190, 101369, 126207, 78254, 93917, 110058, -60230, -110977, 68099, 82674, -116314, 110458, 104996, -75340, 41690, 59474, -15779, -28699, -23505, 473, -24111, -80508, -18893, -15453, -8900, 38483, 100551, -7762, 55607, -75502, 49205, -95344, -53611, 81598, 20093, 32578, -62966, -8768, 5129, -126034, -108862, -45768, -43005, 55368, -65085, 12676, 66109, 29646, -87857, -32522, -26957, 69906, -81017, -46429, -19650, -110943, -21980, 19295, 29128, -43611, 78926, 123631, -91729, -110997, 92109, -100009, 66177]] +NTT(y): [[6683481, 993445, 7236874, 409897, 1707198, 5818025, 3745001, 132698, 7312186, 2948753, 2551081, 5504579, 2802304, 2336958, 7750858, 7118507, 2445347, 1405287, 5295069, 1380482, 6361137, 2083734, 1465030, 4499791, 3424471, 4317842, 4622111, 7992940, 2742323, 6241994, 7542350, 3392381, 5584516, 322171, 4146227, 1957534, 2207044, 3306059, 4326644, 4293622, 4298059, 2399041, 7633491, 7814886, 2003016, 451260, 362854, 6919657, 6338947, 5757865, 5332386, 5239106, 7207839, 1852653, 15955, 1702462, 3627781, 286599, 7262026, 7414449, 4892981, 7770700, 3198105, 1944289, 3943464, 1604635, 6969188, 3092288, 6839523, 5172418, 5838075, 9300, 1877396, 1910511, 3749643, 323134, 4134012, 8009431, 617308, 3307263, 5370565, 2784298, 4805622, 7793962, 1294588, 4458665, 2707626, 5836650, 2316128, 6376043, 1801179, 5161989, 1234856, 1208301, 1244501, 978517, 3681310, 4641945, 7662618, 471374, 4603166, 4994935, 951120, 5061899, 1821827, 6297305, 3586838, 7352304, 988666, 7184892, 5876196, 2069263, 4600335, 3075217, 2947592, 2010016, 5059349, 7377890, 5549765, 6441661, 8337891, 2380931, 2091227, 6316845, 3263538, 2107664, 4527594, 8133441, 7842099, 3394343, 4459931, 3392585, 4850798, 3640850, 3538304, 1236943, 2060238, 4310050, 5399116, 3153480, 5218380, 1410897, 2828268, 5599762, 7870218, 4113448, 6176218, 1175441, 2194513, 4752428, 3464997, 2577540, 5242808, 5388695, 2860687, 2758207, 2494053, 2281341, 3295887, 4597035, 2704008, 6453642, 3668939, 5309515, 239135, 5754681, 4043482, 7425469, 4608875, 295340, 8021611, 5732398, 4677475, 1218989, 6283561, 2238181, 5072537, 4248302, 7147849, 7726824, 7704722, 5826947, 8253165, 555044, 3704340, 1441616, 3766600, 5392990, 4876405, 1377805, 5942637, 3007530, 1605991, 3423269, 7928080, 7008505, 1034470, 5884996, 6048908, 2983275, 3596996, 924384, 4922592, 3373786, 6963806, 3508190, 3926442, 7389513, 5895731, 3265902, 3035782, 5793891, 2750530, 273210, 3962589, 8038395, 3396855, 3743090, 3506661, 4244574, 3686349, 1111917, 6511523, 5980005, 1899860, 396139, 5915919, 7043285, 5444680, 4400629, 2527802, 4300209, 484121, 1934387, 5759562, 870821, 5573170, 2746554, 6664752, 4336800, 6046526, 2689659, 7005551, 1745751, 3231237, 5980769, 4198412, 511625, 445950, 2734935, 4242759, 5447102, 957392, 7208642, 8162984, 6848953], +[1015544, 7750779, 5626317, 7217650, 5908681, 2367728, 6183856, 5429519, 3332947, 2824974, 4893877, 5341776, 344341, 2673102, 6871665, 4312918, 7229037, 3298031, 2715617, 2542831, 3905274, 3882022, 1419076, 1936956, 7864815, 4708692, 5048892, 4821359, 5139649, 3628881, 7935292, 1357393, 2688850, 4711893, 295342, 2607319, 3672066, 2757448, 4294343, 6599043, 2192027, 7239823, 5914369, 2940086, 7292666, 7858858, 2916241, 3938916, 2841899, 331784, 99618, 212438, 5291709, 2949901, 5233659, 2147022, 3278047, 1327801, 8311096, 7449794, 5269957, 3461673, 8025424, 5116929, 5673099, 786011, 701668, 7599152, 2515102, 3193285, 7886446, 1251776, 4414640, 6143649, 7665684, 3845698, 4852200, 3670563, 7279789, 4805843, 7365973, 5942255, 1587944, 812548, 5451716, 6997326, 595506, 6976085, 6833059, 5443514, 7908038, 970486, 6010015, 3320708, 4123966, 8146731, 6401981, 3611269, 4881810, 6640891, 3093455, 6897524, 845992, 6048370, 97552, 619037, 511341, 5400061, 6551212, 1056144, 6256868, 88424, 2117259, 4225022, 4741905, 4598630, 8104106, 5980489, 601881, 4585102, 1451450, 6518561, 4972843, 1262150, 339465, 6323667, 4421727, 6183239, 7885777, 428878, 122517, 4816425, 1488542, 2675515, 8155513, 4098146, 2041960, 3530980, 2301286, 1911223, 246179, 345621, 2299703, 5507607, 5734658, 145629, 1948622, 2009706, 7886040, 2324849, 6291154, 3726950, 5946104, 3819848, 5036927, 4842162, 7633418, 2738746, 3106331, 589232, 7352964, 3686918, 292197, 5196222, 2012719, 5934977, 3065385, 7414555, 3183159, 2443970, 4688201, 3607350, 3740730, 6980141, 6057879, 1330294, 6178343, 205496, 8262884, 997366, 5025886, 4312721, 4822089, 3205045, 2902907, 7404801, 209247, 31552, 2967081, 1288008, 3652868, 702975, 1171747, 1876552, 3898890, 6261259, 7856877, 3836104, 2356709, 6898798, 2545098, 6258998, 1066666, 47529, 6832473, 2753442, 1693361, 4315219, 4862541, 7033941, 6984824, 5956837, 2520596, 6908685, 6279248, 415089, 4341972, 4625066, 5187224, 224732, 2888790, 5667484, 3307392, 4410226, 4411012, 3168594, 5736834, 7969872, 3519656, 7972612, 1696788, 7287975, 6490506, 6567940, 3235807, 3230774, 5554357, 742311, 4744597, 941101, 2064555, 7705705, 2756129, 6450956, 5406063, 1659160, 1427273, 7673546, 7195868, 3449402, 1187333, 2412775, 5330272, 5568447, 2430330, 8058516], +[460815, 824890, 5360372, 9075, 5588222, 201931, 7724273, 4253273, 1082878, 337968, 925327, 3227906, 4652474, 7786945, 4866469, 6457444, 4628194, 1616249, 476303, 6338937, 5535379, 764481, 5999161, 4625346, 3151566, 4891103, 2542054, 3766239, 6833040, 1934048, 2113223, 2777856, 941496, 3208472, 1544313, 1955019, 6181048, 1250296, 8264268, 2061778, 3352731, 2739640, 2002886, 3106193, 5227382, 6687342, 1448216, 1393896, 4536305, 8036939, 3039702, 645377, 7745129, 7604093, 8243428, 8144537, 95321, 687612, 5904840, 7228713, 5972137, 952266, 5688038, 4144595, 5568508, 4456806, 1473912, 6321813, 1873877, 4889551, 4614439, 2573606, 5274478, 1846028, 6911916, 4438774, 5668144, 1774988, 1959257, 2788442, 1992851, 3620109, 3343359, 2145430, 427080, 6474013, 1077955, 2942732, 7778956, 2723499, 5403096, 6089960, 6308224, 5556375, 1965188, 8108275, 7735847, 7223764, 6867140, 2644996, 2763278, 4592642, 6629962, 8235243, 2844033, 5703264, 4208924, 4926238, 2058658, 1464468, 4206261, 131662, 1353229, 3916882, 4879748, 7133686, 2752230, 2376061, 1049410, 7972504, 4145630, 5472755, 6646468, 5796185, 6709401, 5188955, 2989463, 1219274, 6009430, 1744868, 4054989, 6218690, 4677172, 4190914, 7640065, 8213652, 4277488, 2388299, 1444506, 5705262, 4115760, 3407455, 6693262, 5913869, 3902748, 3159790, 2612725, 5851693, 492735, 3254909, 6742253, 7444059, 3689518, 2145198, 4270944, 2265384, 5214907, 2207039, 5993222, 401399, 6291376, 801741, 4647938, 3662881, 6134077, 988682, 2529826, 7400153, 4943685, 3918001, 353079, 3893731, 6242086, 4631316, 3120929, 6033550, 4260634, 5670162, 7981279, 4298957, 8188822, 6938280, 2522294, 6043678, 4726380, 296219, 387621, 3866876, 2367161, 2790769, 6968773, 2309581, 4936923, 304791, 1764432, 2316973, 4022062, 6305561, 4025077, 3270065, 307381, 4418003, 608486, 1897504, 1520922, 6115271, 6252638, 8023506, 3964670, 2068056, 4630199, 7194167, 2636362, 2517702, 3045169, 5065576, 8116796, 6039004, 161965, 3397944, 6211415, 2310693, 1119629, 5585816, 681613, 1609750, 4959795, 5546608, 2250102, 4033925, 4069829, 1781605, 4979008, 7894562, 3188093, 1692664, 5173999, 7857306, 3834025, 3896871, 444172, 2338456, 7611987, 4371224, 3734289, 80777, 2520775, 937292, 5934715, 7752239, 7606468, 6493196, 2878016, 6095612, 3907015, 3974306], +[1445813, 6264146, 6459182, 4786729, 2376648, 6266816, 4155440, 2131077, 3465846, 4662079, 3256973, 1883223, 4460822, 1801170, 3577321, 2816824, 11651, 3373721, 2976188, 3552896, 3952875, 2277484, 3004494, 4230362, 3335966, 6772568, 4224233, 5045887, 1776465, 2223701, 6237943, 6057179, 10528, 5958073, 2945366, 2176695, 5638170, 2779159, 6126247, 724655, 4226605, 4851834, 278351, 2528254, 7576971, 6835789, 2288304, 1968867, 7022769, 503805, 3993284, 3064553, 34396, 2604162, 5966027, 2037300, 2407507, 4714626, 3360486, 170312, 7922508, 8112105, 5942162, 2932772, 1074393, 1746546, 5926282, 5531698, 6720511, 571010, 6625478, 4435024, 4685308, 19340, 2754122, 1118629, 2227805, 2239405, 6484651, 5574264, 2760057, 2487238, 1004407, 982460, 7533159, 5234330, 758017, 6547230, 2338173, 57549, 1220162, 6695046, 4604479, 3834190, 6567444, 2991810, 8195750, 3941366, 3645406, 6187277, 1522024, 2093959, 2534408, 2591117, 6030573, 2765561, 7798796, 6077174, 3714084, 1643649, 1810747, 1162050, 2952019, 597871, 7134460, 7916204, 4350860, 3072430, 384698, 1991324, 5980657, 2058878, 517822, 6961175, 5126189, 7378466, 3886786, 7978238, 1147968, 5263301, 195607, 5948363, 5355293, 6784846, 291529, 937580, 1554652, 4442117, 2627657, 3267921, 5282635, 5531962, 5716031, 7006501, 1864878, 2722724, 1094584, 3988823, 4981339, 7679497, 109446, 3395457, 4992890, 6984266, 7692851, 4207204, 7256443, 6004594, 8069313, 3365984, 1552383, 6532931, 667678, 4489817, 3474407, 5038086, 1620875, 3292726, 4308456, 1180987, 5769469, 6772146, 3539638, 8301559, 2924831, 1865316, 810513, 3031870, 6562418, 4652883, 4860620, 3855732, 4228130, 5208071, 94000, 6479624, 2549052, 4422931, 3978932, 3105052, 4480365, 671795, 320063, 4092852, 6942929, 6343704, 6073508, 2617845, 2320515, 5719010, 129968, 7137364, 2742164, 537344, 5959076, 919346, 3856319, 3472500, 1836242, 7601502, 3165499, 3050916, 1168035, 972169, 3839548, 643367, 2306123, 5977403, 8357648, 2767856, 3899058, 7724796, 7315276, 5462917, 4371062, 2308591, 4112988, 806055, 3443159, 632245, 766991, 3167391, 7091372, 836238, 1769416, 4133373, 5059471, 4675899, 1078945, 308116, 5359593, 1046446, 3605010, 5242261, 2554553, 4728511, 2803144, 1414849, 5911280, 6963879, 3907743, 1672156, 5458876, 6650577, 6351741, 6676056]] +aHat * NTT(y): [[328045, 4651046, 8207998, 398219, 1575939, 1224829, 6212378, 3091497, 161251, 532798, 2379498, 7450219, 3318485, 766241, 5920353, 1067651, 3200679, 7559325, 7710382, 3100021, 5892180, 3181805, 2385350, 462378, 1901399, 3627680, 480145, 91026, 689996, 7661746, 3594749, 4651390, 3416785, 7322146, 7372404, 2139715, 1351446, 2040859, 8159918, 2050230, 1607379, 6815058, 2682735, 6449057, 5427178, 1783289, 291987, 3829816, 53503, 59536, 4079875, 546162, 5753643, 2125114, 1348388, 4223405, 2207224, 3099968, 6835296, 7901157, 5729257, 6637005, 3043786, 617353, 5623668, 20881, 5171888, 3730385, 4728793, 7121754, 7932005, 2548428, 5262412, 1922241, 1296221, 1068520, 958705, 6531467, 1129871, 3314492, 5891765, 1228574, 4344938, 70083, 3458995, 3192681, 3933429, 8272769, 4580055, 3784423, 7015086, 6024757, 2483967, 4636992, 6099497, 4626335, 179470, 4722867, 6026489, 6635068, 1811781, 8244393, 4408277, 2628093, 7675603, 2812331, 8126035, 4271631, 4281260, 1742604, 5611707, 5809721, 7920454, 2874945, 3667977, 6936197, 8071199, 6136755, 4490147, 3026111, 8076429, 3518853, 7141297, 689665, 4811296, 3718147, 7923866, 5856300, 7934379, 1075813, 645446, 498940, 7452840, 49988, 8235221, 719087, 6241272, 4318742, 6295964, 6419844, 5670640, 4119276, 7179633, 1365020, 6636685, 7130126, 3794633, 3199491, 7253697, 2469505, 5116320, 7890224, 3017692, 1424390, 3226919, 2593279, 8109268, 4375045, 6350287, 4467294, 7658658, 8227658, 7048095, 7208166, 5315901, 8177317, 6502372, 2966247, 1618236, 2827076, 722675, 7648815, 8373780, 7318606, 8034246, 1352238, 3776847, 8249957, 750062, 548563, 2058987, 99140, 6795936, 3917453, 1823513, 598456, 1243526, 7007669, 1082411, 1098938, 5164443, 2561390, 32598, 2270429, 430474, 1568532, 348774, 5067425, 7027250, 6951505, 3271134, 7127820, 3742884, 236875, 5769554, 7724347, 1093052, 1395552, 2450542, 4507976, 2585414, 1487152, 5497449, 5494631, 7973376, 7197661, 3109390, 3178976, 5818549, 2663439, 1225682, 5636066, 7449409, 3624910, 5847996, 6692969, 5417547, 8379132, 6743486, 5301805, 185139, 8287890, 5705608, 103265, 4239931, 6998701, 2070720, 2470064, 5584042, 1785299, 4452002, 1332443, 1954644, 2744128, 3431789, 6122989, 7274603, 5012114, 4930350, 3032981, 5332426, 4287192, 7314728, 4299849, 4206291, 7596894], +[7736985, 5872658, 1317772, 3950066, 433846, 679465, 2360851, 2616283, 5637005, 5106948, 8241184, 2613146, 1391984, 8328939, 4742774, 7908826, 4389356, 2322929, 1223512, 5786799, 5706257, 3538547, 2076175, 4626715, 7336777, 4331503, 2937648, 3772165, 4845686, 5698427, 576305, 8303834, 2778036, 8086546, 3026641, 4871321, 1979610, 7499166, 7432581, 5949741, 8065117, 1080123, 6477925, 4048267, 2125555, 5088836, 577460, 1037549, 6954338, 5029149, 2260802, 4828127, 6764049, 2946315, 4978328, 5294927, 5795300, 6469527, 6800525, 925856, 5451408, 4315964, 6677794, 4390286, 5565587, 180834, 1126718, 7587643, 2100467, 3193310, 1659871, 1756068, 1886722, 2075711, 4194997, 2792271, 8233653, 4739418, 6892105, 1219674, 6209421, 4506220, 7817427, 6879139, 5212572, 7015555, 8146450, 7249467, 1347195, 1229434, 1795442, 1648432, 4449253, 6159469, 367827, 3965577, 4758630, 1895283, 4209190, 6567591, 8214267, 5978805, 6526821, 6376119, 2262991, 3393018, 2052936, 4916085, 5335606, 7674023, 2394825, 8140030, 4044292, 1520781, 1138818, 3800522, 3275257, 4659506, 979214, 6943546, 6370522, 4568907, 5933929, 211203, 317754, 6555366, 718473, 6508758, 5340265, 4498147, 8040934, 2723591, 1272289, 4451984, 2450298, 30431, 5533518, 506314, 969208, 7592332, 8288258, 3008360, 4310876, 4185824, 684796, 867166, 959369, 1093180, 5846196, 2269009, 2793181, 7118677, 172357, 1319745, 3718718, 7716142, 1954477, 2586030, 7520603, 7339302, 7987234, 8309093, 2869510, 226750, 7087568, 6972335, 4132194, 4662119, 604304, 6118329, 1557026, 8291869, 3312822, 6816756, 4795709, 5903006, 7468467, 3027636, 464216, 479843, 2367341, 3980874, 2726742, 4530369, 7507703, 3392347, 5114644, 8257637, 5697274, 4994252, 4780954, 4955045, 4854710, 2149320, 6731954, 5274035, 4421778, 194326, 3128342, 528278, 4765725, 3190492, 1043243, 76710, 1464122, 4741549, 6658895, 8007133, 8094033, 6462536, 3543429, 5325443, 8160606, 7021215, 7590303, 4160142, 1249093, 4173890, 5907932, 6446232, 436627, 7492036, 3053103, 5847181, 4606367, 5987568, 4443960, 4994671, 4385695, 3902381, 4691547, 3104849, 3476079, 6455482, 4396522, 7895298, 6018751, 4766298, 42193, 3706662, 4790313, 963788, 6364176, 7770834, 2045407, 2124484, 4888166, 7242918, 2552881, 4856684, 1047928, 6202422, 549056, 8056376, 5800752, 7051276], +[386500, 4262126, 541591, 7295369, 2770793, 4577893, 6122185, 5950702, 4346568, 1058900, 2995549, 360333, 586898, 7551934, 1138077, 7198003, 6650149, 7613422, 6798495, 3064766, 5401551, 2028051, 7003697, 8210690, 3665127, 7814543, 2828010, 3834015, 3265361, 2840782, 4066145, 1510257, 1954154, 622288, 8129638, 6629627, 795153, 6581753, 7545885, 1450259, 2311017, 520841, 1225038, 1478228, 517832, 6623112, 5650585, 289607, 4480900, 6072887, 1728089, 7329427, 7318115, 6910104, 4587392, 6500196, 7015177, 1735326, 4763202, 17129, 1939178, 2202515, 2484909, 2758320, 924229, 3197124, 5192192, 3701228, 6928744, 1125705, 313518, 7679122, 7129819, 3505740, 834054, 1468174, 5686688, 6786152, 4913392, 4372855, 648711, 6391684, 3821101, 999223, 4830114, 374112, 6472599, 3077894, 5759048, 2746263, 6475188, 2831876, 3732483, 3522275, 6508614, 4466359, 3292714, 4156853, 1748327, 3397679, 1145269, 2508148, 6062411, 5694888, 5755574, 6373347, 5660896, 8223427, 3075640, 2774926, 4051446, 8129537, 1816029, 6646551, 6662797, 2127010, 2200240, 7130915, 5116657, 502902, 8035980, 6516164, 4421742, 15504, 7013980, 7260064, 2469452, 541716, 6092116, 2382897, 1867020, 1118280, 4231018, 4137796, 7910679, 2586674, 548474, 874214, 1540074, 2745150, 5277369, 2237022, 3344833, 7052207, 326710, 2480515, 722184, 5767772, 5168737, 3324536, 12821, 4957194, 4834300, 4014352, 4501285, 75132, 8018132, 2867515, 4804863, 926485, 1668696, 639264, 489364, 7879818, 2997944, 1367662, 3446404, 1591885, 5232686, 2220198, 5176056, 6119492, 1367197, 4969204, 1436059, 6109850, 1220567, 1784920, 1539931, 2862903, 2655592, 189569, 6496119, 1241404, 6963193, 6551654, 3348318, 710729, 8074871, 93088, 431339, 5012392, 5339554, 625423, 4110891, 7810275, 4743227, 1752585, 3730869, 8353738, 8115852, 7386898, 8208666, 7232485, 4735746, 6911756, 5575841, 4333832, 4951329, 3760158, 2212068, 5539626, 6851793, 6802718, 5203133, 3032879, 351023, 3559477, 5366969, 4392425, 4355124, 2422406, 6779715, 5671690, 2066711, 3513648, 4606881, 4813386, 6517851, 7203611, 248962, 3406301, 6310370, 4742685, 6655172, 6198776, 7116196, 4387680, 1858149, 2358787, 1618811, 7717316, 780150, 2992123, 7631157, 3569122, 3907958, 7918406, 5410206, 2157765, 7038437, 1747757, 1527560, 2780782, 571497, 1369836], +[7996233, 8041750, 4344739, 7225364, 3577292, 3092452, 4408414, 3088128, 1483115, 3303674, 747912, 493701, 2484152, 3084643, 692941, 6815903, 2741903, 7591204, 2427207, 4313499, 6373246, 3698900, 7515747, 3354152, 6343110, 4821616, 4834556, 4395010, 619184, 3243961, 2875977, 4571724, 6101133, 1279232, 6501881, 6420720, 4091631, 4253255, 5343401, 7784801, 4779604, 7428256, 3070771, 2484172, 6509422, 3063683, 1297938, 3498108, 830473, 1270188, 7450979, 4578912, 858404, 6189970, 4398023, 7346824, 966978, 7060773, 4580606, 2155702, 8310141, 7189239, 7906766, 8307117, 3757837, 5540918, 739884, 5837061, 1743229, 6425755, 855096, 2781999, 295478, 4327361, 1685855, 1389067, 7857270, 7471785, 5382652, 3965192, 1259473, 1046935, 6466117, 3856855, 1208756, 3914099, 4356731, 1724220, 7301307, 3025982, 4274887, 5915847, 353210, 2549739, 2703727, 5530995, 4225069, 2713792, 869512, 2636671, 3931002, 6283862, 353186, 6893975, 7763337, 180462, 3478074, 1809491, 3263441, 5801826, 5198978, 7213138, 6205396, 4814923, 592775, 3997327, 5760141, 3694684, 2291749, 6606126, 6458268, 589861, 6476843, 3798943, 3074181, 7410757, 4214580, 820994, 3939137, 6761719, 1708000, 2594224, 4739827, 287918, 2414980, 2776943, 146116, 5716893, 4647003, 7047385, 4836924, 4108770, 5101373, 7720485, 6228210, 4209616, 6386721, 7797853, 7309310, 7526139, 5636573, 4964961, 4523426, 6298551, 154756, 7590936, 7102067, 4116488, 1387748, 6088797, 6497280, 5001047, 5015832, 5038053, 83579, 7252682, 1336557, 3714421, 5688166, 335652, 2551434, 6393124, 2735701, 2946667, 6245446, 6603973, 6710597, 4460719, 5486170, 132104, 2753643, 3406272, 4379116, 5532133, 4071929, 8122231, 7408593, 7153939, 6760301, 1783348, 1118910, 5057638, 5901770, 5348822, 8355526, 5961567, 4450814, 2749183, 4860444, 1365909, 3711430, 6843662, 5931597, 7260669, 1984402, 3035929, 5692960, 6351530, 8311971, 6953221, 3697473, 3769328, 5063944, 1358794, 7284336, 4005237, 8018046, 4500062, 7885605, 4912240, 7732545, 1511642, 7177288, 2011807, 4879331, 2758898, 6311214, 3985346, 8312431, 576083, 1811194, 2495207, 7120859, 1235898, 3614190, 2491057, 4641419, 2575179, 1085227, 4005839, 707228, 4622057, 6586148, 709127, 8001420, 7517935, 5225831, 3358016, 5758373, 899717, 5362925, 2909751, 6730688, 4609942, 3670761, 3805830]] +w = NTTInverse(aHat * NTT(y)): [[2914167, 7412710, 2516425, 5105571, 7653783, 5981531, 4720398, 5955779, 1632128, 3840053, 373831, 324036, 157512, 5578275, 7626230, 6579438, 5943553, 1170107, 1441779, 7269464, 3183179, 3574906, 3259883, 6086023, 1700055, 1942326, 8232690, 2896121, 6640707, 8161679, 3981478, 7852625, 8211569, 6743609, 3144731, 2071760, 5817433, 2527603, 2737149, 3548727, 1551088, 3456340, 534070, 4838785, 1963603, 8041274, 1068901, 1858667, 247192, 3924202, 373543, 5504466, 4485326, 1030581, 7125755, 6402242, 2527137, 7093859, 1474778, 6850523, 7934427, 2951053, 7242525, 2127112, 4789995, 1125680, 5355564, 829814, 5989152, 6965957, 5418497, 2454949, 4162481, 3533497, 6436173, 2120982, 399220, 5635447, 7148398, 5555980, 7306578, 2221290, 853887, 6163597, 6722104, 922798, 8179041, 565681, 7938467, 5187911, 3267885, 5535546, 4975445, 1447127, 3004757, 6855982, 7415057, 3502053, 826857, 5290859, 135584, 4334497, 6682018, 7568569, 3201825, 411330, 2067326, 2319054, 3125636, 5363770, 6122634, 1364271, 3076517, 4361845, 2150695, 3002902, 4974636, 156527, 1893824, 7168514, 6231279, 3706706, 3309057, 51484, 3755217, 1949025, 7920037, 3921138, 4720567, 5153154, 4164629, 4923096, 7040477, 5963637, 7188229, 5175240, 3917880, 2250351, 1627834, 2231045, 1290471, 728365, 2163955, 7716835, 6971971, 770738, 7785303, 2669491, 6971638, 714250, 673426, 2813389, 7222281, 2339984, 8224998, 1119976, 1283003, 5695544, 2553923, 83431, 7847940, 6065108, 6256129, 7102546, 5878002, 5980630, 3731596, 5657340, 4311498, 7426206, 2170348, 4503339, 4770566, 536216, 8317875, 3281052, 1430660, 6648496, 6784083, 3450666, 7065877, 643171, 6479721, 5920022, 5945975, 1036452, 5288663, 371311, 4900447, 3882412, 1398523, 6210154, 5781818, 5475239, 8073881, 5900808, 4370773, 3977402, 5754706, 4377952, 4819061, 6556576, 3578911, 873369, 3211315, 4636676, 6048813, 4121618, 1558561, 5777254, 7094946, 6674304, 7706422, 345284, 6332340, 6593524, 6147601, 4599304, 858498, 4931335, 6789890, 7678258, 6326718, 6340837, 6742375, 7621580, 5507587, 1055211, 5756440, 493306, 672063, 490753, 5368326, 6329957, 1818349, 407554, 4603551, 5414927, 2967857, 4476888, 7701170, 7856747, 1014362, 5622866, 5420390, 7405500, 5251110, 578247, 3253807, 2063851, 6905173, 1789719, 52263, 3954017, 1248277, 7981534], +[1872125, 6629093, 4899459, 5998232, 4122790, 941821, 7072293, 2640509, 7001782, 4479871, 2245278, 3892444, 2067122, 7903467, 5220193, 8124481, 6002226, 1019501, 5791699, 3102237, 5140989, 1471598, 3463235, 3954596, 3291550, 3430733, 7431003, 4112773, 3995632, 6364454, 1208018, 6810156, 4189218, 193305, 4448834, 5328808, 5671287, 5305871, 5616358, 8343469, 2436041, 6752451, 5639669, 5066176, 1361335, 1348223, 8250853, 2354159, 5963274, 6367751, 794440, 1311912, 7824289, 7051879, 6960063, 4325188, 4482857, 603685, 1816255, 7927179, 5734430, 4822867, 3618495, 165495, 5864273, 2999073, 5771140, 5170658, 2831908, 4583269, 7355354, 2177792, 8304412, 5584197, 4855449, 4246459, 4175971, 3202080, 6584535, 1292064, 365391, 767848, 5945858, 6870235, 6840782, 128664, 4575559, 1053894, 2715647, 7547105, 4197381, 126285, 4776797, 841580, 1761983, 3528173, 6291449, 8029728, 6005935, 6793949, 4141493, 3097535, 2103612, 1625441, 2874354, 5675978, 1145647, 8220244, 3614836, 6125768, 3452624, 8368240, 8016818, 3179482, 3091188, 1729983, 2284446, 2655906, 3801854, 1340317, 7492879, 2877122, 6122064, 1287404, 491524, 5065916, 1133123, 4225696, 2271076, 3128089, 2967251, 4914286, 2857926, 1621077, 4950472, 5976098, 6492766, 2138434, 2805043, 4923920, 5575033, 2962057, 6902190, 3575933, 341115, 6549494, 1677536, 4999709, 5993783, 626400, 7110926, 7709924, 6781687, 668329, 4218694, 4179384, 3906642, 3980381, 5744057, 7395601, 7557152, 848832, 5342271, 8339532, 1180057, 4290447, 2941095, 2943845, 1643877, 5820047, 1708149, 2075961, 106195, 4276388, 182822, 3230275, 1742298, 5543776, 7458012, 2929031, 1763778, 502921, 3731686, 5216335, 4213495, 3085058, 1939164, 7064209, 5423268, 7529396, 1933958, 4520321, 5397721, 3555309, 3274959, 730055, 8051031, 621093, 5335054, 1033096, 4933856, 3934047, 2519362, 1925500, 5936786, 4417163, 8320567, 6719907, 6671985, 1636443, 5804396, 2521380, 5644819, 5573374, 5865855, 5117781, 7788181, 3886943, 1856027, 7612607, 1866291, 2971246, 5455808, 927064, 2334341, 2314587, 943460, 2586035, 8078755, 2447794, 7532802, 377623, 661423, 6954274, 1978093, 5947575, 2966266, 6986507, 5684694, 5080857, 4194193, 6607653, 5443465, 5074496, 7659104, 2387213, 3131355, 1375856, 728353, 6981277, 7055232, 1544236, 6328529, 5603102, 4222526, 5846379], +[3265950, 2428271, 5435746, 7952416, 3470762, 5206195, 6998949, 6636840, 7342615, 2976694, 6426753, 3610797, 421980, 8221951, 5380600, 1512229, 3040553, 6349936, 6395355, 6220837, 2757509, 6758178, 4230512, 1190559, 2514389, 7328809, 4437720, 458062, 8333856, 2223507, 6923949, 2589391, 1162558, 5855103, 5251923, 6681911, 99181, 837789, 459003, 6840879, 5797147, 3484063, 2548263, 2746221, 6514743, 6643156, 7049988, 5064815, 6977044, 472606, 5280213, 2043395, 3787449, 3245150, 4862572, 3388109, 1324801, 2386755, 5944272, 7249288, 6325758, 1552147, 2456520, 4593222, 1463411, 544903, 4999167, 8069770, 8123843, 5259499, 8089695, 4434282, 3185191, 1933149, 5157309, 7581279, 2456412, 4739720, 192620, 3767104, 6726512, 2306029, 3670708, 2097057, 5706647, 6788362, 6077269, 4668665, 931360, 6891193, 1324328, 5886980, 7918104, 7858364, 7439518, 5660501, 2353663, 122963, 1196156, 8112257, 8187728, 6874716, 1518928, 7488167, 5712681, 1350083, 4048779, 3806236, 7493399, 7257688, 230910, 689037, 5738346, 4343720, 6655329, 7147720, 7668966, 6229581, 4165311, 5104728, 2645282, 3799451, 4230576, 6102079, 7993009, 6775012, 6177975, 5300977, 2481459, 2318396, 7497020, 3936785, 2453450, 162369, 3321127, 1491027, 7537011, 1917051, 7301219, 393527, 3317193, 6679552, 3612259, 5157603, 1603012, 8296179, 6487752, 2802907, 2319101, 1017819, 7483611, 1625485, 6010859, 1718279, 4137357, 5281251, 3794082, 5401533, 1199597, 28335, 5434361, 2726795, 3473857, 1141385, 1412799, 1299408, 2695925, 6422865, 6208794, 52656, 7756815, 6881804, 5842014, 8178668, 2299506, 2295804, 3005245, 6638054, 5574469, 5508377, 334795, 8357183, 8081740, 2156490, 2363210, 467708, 4061886, 1481707, 915500, 3108783, 7370033, 7898635, 1956030, 5503070, 7357147, 2736467, 8109245, 2601263, 7319010, 5537699, 969499, 2068676, 2010257, 7561854, 348943, 2686229, 4522970, 4799273, 7325484, 7112770, 2714850, 4678994, 2308114, 499130, 7780931, 4975077, 632254, 1791711, 1909045, 8131706, 7213296, 190862, 642740, 1067491, 5934076, 2215984, 6929923, 6970756, 3423286, 1115308, 4241846, 662427, 2013631, 7392806, 5165207, 5938919, 7583581, 6368301, 5078956, 2616819, 5460315, 5654686, 7861394, 3037140, 6389981, 1951859, 5170493, 6064378, 5666675, 6439843, 4806371, 3404417, 4712186, 5577025, 5394764, 1000078], +[6744811, 1875863, 3922689, 8286082, 2237596, 4147669, 4253272, 5487113, 5598453, 882780, 4500653, 1571044, 3539965, 8170446, 2203705, 2040110, 5664230, 477347, 8127165, 2288234, 5842064, 4127289, 7087384, 3902945, 3107861, 7785651, 883886, 2196183, 228912, 2003025, 767505, 7718544, 7029144, 4325383, 705131, 4578329, 2318555, 8322777, 8088602, 6783743, 5833374, 6590968, 360121, 8283228, 6243395, 1600272, 8299328, 1324592, 1413507, 2404809, 8214110, 1656507, 8063993, 7709600, 8366850, 5824711, 2620363, 6381021, 5281451, 7225076, 8165941, 7777236, 3226702, 2220702, 2375808, 8019808, 7676152, 3679214, 3513873, 3276419, 7009446, 6109842, 4926785, 5590826, 2110497, 4163592, 3342281, 5167017, 522569, 5602220, 8080357, 1504247, 1141198, 5246630, 5781555, 5161657, 634362, 2563104, 4243169, 3286596, 5453327, 1315307, 6004808, 5219325, 1179153, 95575, 1272056, 5143270, 1587457, 2110360, 7730719, 3551538, 5774111, 3481782, 5185520, 1136328, 4657281, 5028364, 3654624, 1179456, 1448510, 5919486, 2288930, 5444469, 6001978, 3876094, 2664392, 4134241, 3968351, 4506438, 5616566, 440734, 233102, 4162655, 1797434, 4801311, 7929903, 2180918, 1304887, 1432741, 3310889, 1682671, 4419298, 795160, 8005534, 1788040, 284129, 7016493, 7562716, 7486261, 7967539, 866012, 544246, 3784311, 3928479, 6061914, 8334101, 562636, 1692844, 5147680, 3851686, 6417900, 4300783, 4921390, 1709386, 7946288, 7733376, 7386796, 4036248, 5504228, 6722421, 3577671, 880721, 4608668, 6468146, 98830, 6619228, 7868216, 6940383, 7649326, 7743123, 7367549, 3333651, 1291205, 1615863, 2768003, 1655221, 1876293, 2412779, 8015934, 7007262, 5692226, 6760812, 6619700, 7219713, 334870, 3073922, 2714341, 1904313, 2495406, 4926270, 4188706, 5638094, 1293897, 923172, 1323720, 5177791, 743192, 274013, 4710570, 520274, 6474184, 4544243, 1347083, 4155561, 5676384, 6469319, 1950678, 4962887, 1126696, 6731045, 1260689, 311721, 7240342, 2131064, 7998177, 6552644, 7515088, 5363676, 1721860, 797027, 5956830, 3800360, 2081817, 1395335, 6482577, 5426750, 3741601, 3172917, 2613621, 6550694, 5491038, 5625756, 2124641, 4885272, 2345482, 7078866, 5865680, 5807578, 2608541, 1967522, 726347, 862044, 2006118, 902570, 8373123, 253388, 77421, 43995, 7817315, 497317, 2277168, 3873647, 2795719, 2873204, 2321696]] + +w1: [[15, 39, 13, 27, 40, 31, 25, 31, 9, 20, 2, 2, 1, 29, 40, 35, 31, 6, 8, 38, 17, 19, 17, 32, 9, 10, 43, 15, 35, 43, 21, 41, 43, 35, 17, 11, 31, 13, 14, 19, 8, 18, 3, 25, 10, 42, 6, 10, 1, 21, 2, 29, 24, 5, 37, 34, 13, 37, 8, 36, 42, 15, 38, 11, 25, 6, 28, 4, 31, 37, 28, 13, 22, 19, 34, 11, 2, 30, 38, 29, 38, 12, 4, 32, 35, 5, 43, 3, 42, 27, 17, 29, 26, 8, 16, 36, 39, 18, 4, 28, 1, 23, 35, 40, 17, 2, 11, 12, 16, 28, 32, 7, 16, 23, 11, 16, 26, 1, 10, 38, 33, 19, 17, 0, 20, 10, 42, 21, 25, 27, 22, 26, 37, 31, 38, 27, 21, 12, 9, 12, 7, 4, 11, 41, 37, 4, 41, 14, 37, 4, 4, 15, 38, 12, 43, 6, 7, 30, 13, 0, 41, 32, 33, 37, 31, 31, 20, 30, 23, 39, 11, 24, 25, 3, 0, 17, 8, 35, 36, 18, 37, 3, 34, 31, 31, 5, 28, 2, 26, 20, 7, 33, 30, 29, 42, 31, 23, 21, 30, 23, 25, 34, 19, 5, 17, 24, 32, 22, 8, 30, 37, 35, 40, 2, 33, 35, 32, 24, 5, 26, 36, 40, 33, 33, 35, 40, 29, 6, 30, 3, 4, 3, 28, 33, 10, 2, 24, 28, 16, 24, 40, 41, 5, 30, 28, 39, 28, 3, 17, 11, 36, 9, 0, 21, 7, 42], +[10, 35, 26, 31, 22, 5, 37, 14, 37, 24, 12, 20, 11, 41, 27, 43, 32, 5, 30, 16, 27, 8, 18, 21, 17, 18, 39, 22, 21, 33, 6, 36, 22, 1, 23, 28, 30, 28, 29, 0, 13, 35, 30, 27, 7, 7, 43, 12, 31, 33, 4, 7, 41, 37, 37, 23, 24, 3, 10, 42, 30, 25, 19, 1, 31, 16, 30, 27, 15, 24, 39, 11, 0, 29, 25, 22, 22, 17, 35, 7, 2, 4, 31, 36, 36, 1, 24, 6, 14, 40, 22, 1, 25, 4, 9, 19, 33, 42, 32, 36, 22, 16, 11, 9, 15, 30, 6, 43, 19, 32, 18, 0, 42, 17, 16, 9, 12, 14, 20, 7, 39, 15, 32, 7, 3, 27, 6, 22, 12, 16, 16, 26, 15, 9, 26, 31, 34, 11, 15, 26, 29, 16, 36, 19, 2, 34, 9, 26, 31, 3, 37, 40, 36, 4, 22, 22, 21, 21, 30, 39, 40, 4, 28, 0, 6, 23, 15, 15, 9, 31, 9, 11, 1, 22, 1, 17, 9, 29, 39, 15, 9, 3, 20, 27, 22, 16, 10, 37, 28, 40, 10, 24, 28, 19, 17, 4, 42, 3, 28, 5, 26, 21, 13, 10, 31, 23, 0, 35, 35, 9, 30, 13, 30, 29, 31, 27, 41, 20, 10, 40, 10, 16, 29, 5, 12, 12, 5, 14, 42, 13, 40, 2, 3, 37, 10, 31, 16, 37, 30, 27, 22, 35, 29, 27, 40, 13, 16, 7, 4, 37, 37, 8, 33, 29, 22, 31], +[17, 13, 29, 42, 18, 27, 37, 35, 39, 16, 34, 19, 2, 43, 28, 8, 16, 33, 34, 33, 14, 35, 22, 6, 13, 38, 23, 2, 0, 12, 36, 14, 6, 31, 28, 35, 1, 4, 2, 36, 30, 18, 13, 14, 34, 35, 37, 27, 37, 2, 28, 11, 20, 17, 26, 18, 7, 13, 31, 38, 33, 8, 13, 24, 8, 3, 26, 42, 43, 28, 42, 23, 17, 10, 27, 40, 13, 25, 1, 20, 35, 12, 19, 11, 30, 36, 32, 25, 5, 36, 7, 31, 42, 41, 39, 30, 12, 1, 6, 43, 43, 36, 8, 39, 30, 7, 21, 20, 39, 38, 1, 4, 30, 23, 35, 38, 40, 33, 22, 27, 14, 20, 22, 32, 42, 36, 32, 28, 13, 12, 39, 21, 13, 1, 17, 8, 40, 10, 38, 2, 17, 35, 19, 27, 8, 0, 34, 15, 12, 5, 39, 9, 32, 9, 22, 28, 20, 28, 6, 0, 29, 14, 18, 6, 7, 7, 14, 34, 33, 0, 41, 36, 31, 43, 12, 12, 16, 35, 29, 29, 2, 0, 42, 11, 12, 2, 21, 8, 5, 16, 39, 41, 10, 29, 39, 14, 43, 14, 38, 29, 5, 11, 11, 40, 2, 14, 24, 25, 38, 37, 14, 25, 12, 3, 41, 26, 3, 9, 10, 43, 38, 1, 3, 6, 31, 12, 36, 37, 18, 6, 22, 3, 11, 39, 27, 31, 40, 33, 27, 14, 29, 30, 41, 16, 34, 10, 27, 32, 30, 34, 25, 18, 25, 29, 28, 5], +[35, 10, 21, 0, 12, 22, 22, 29, 29, 5, 24, 8, 19, 43, 12, 11, 30, 3, 43, 12, 31, 22, 37, 20, 16, 41, 5, 12, 1, 11, 4, 41, 37, 23, 4, 24, 12, 0, 42, 36, 31, 35, 2, 43, 33, 8, 0, 7, 7, 13, 43, 9, 42, 40, 0, 31, 14, 34, 28, 38, 43, 41, 17, 12, 12, 42, 40, 19, 18, 17, 37, 32, 26, 29, 11, 22, 18, 27, 3, 29, 42, 8, 6, 28, 30, 27, 3, 13, 22, 17, 29, 7, 32, 27, 6, 1, 7, 27, 8, 11, 41, 19, 30, 18, 27, 6, 24, 26, 19, 6, 8, 31, 12, 29, 32, 20, 14, 22, 21, 24, 29, 2, 1, 22, 9, 25, 42, 11, 7, 8, 17, 9, 23, 4, 42, 9, 1, 37, 40, 39, 42, 5, 3, 20, 21, 32, 0, 3, 9, 27, 20, 34, 23, 26, 9, 42, 41, 39, 21, 29, 35, 19, 5, 24, 34, 1, 35, 41, 36, 40, 41, 39, 18, 7, 8, 15, 9, 10, 13, 42, 37, 30, 35, 35, 38, 2, 16, 14, 10, 13, 26, 22, 30, 7, 5, 7, 27, 4, 1, 25, 3, 34, 24, 7, 22, 30, 34, 10, 26, 6, 35, 7, 2, 38, 11, 42, 34, 39, 28, 9, 4, 31, 20, 11, 7, 34, 28, 20, 17, 14, 34, 29, 30, 11, 26, 12, 37, 31, 30, 14, 10, 4, 5, 11, 5, 0, 1, 0, 0, 41, 3, 12, 20, 15, 15, 12]] +w1Encode: CFD96CE8977D09250841878E9F8198D1148189B23EE35AA5EB182D5FE34C8834648A6A2841257458518A4D8990EA632E99C1115FC935D6242E82677626438063B10EEA16751A0291A74470C135A291B03010071ED0B5405AA098E1140194A256D96669E5676E15933007B1A425913A25413C26B31A87D700291896DF4779D7B960D90044C8484AE5207E5FC1091A75845EA77E57E55D99381511065A88578EA8108E205668241A8623DA19DE400C5CA808180761685A78DCC90DD142264075A8CAA87D56513A25C6504BBAAD60E1411B225591745A5568905670711ED701CDE86DC7B1325F481C69595ED8A0A85E36051FE46D0F762E40975956341E02F1916480190E6A0519914CA10A9216B4248F67AC1328016A04258C431DE7031EC366580C04694FA27DE2F2681D444E829868DF50A224615955E59D28C101C6F53CC9972C81154449773EC9406D16A4941CAA60DC1411EAC0155AD528DF058C63E2355EF76D29A5A00AD4150C53386A830A43A97C50E96DD6D86D68031D44592261677D51D3A9D2568E27244EC2CA21502886CE68198D790900433AC6C78D0121909ED438E2586EA5C02D54A44947F39921D260C8A0A92BA75E91B2A14D165023332D1E096605797C6A7A7A4C60AC2B899CDE5151A71910DE359A68686D0E65812A09720D73564D1021A8620AD1386D08203E4C71266062711467009D2319C7E188219092DFCA30D0D87502A02E8C50210574A64A773AAB6376C5B2A082836566E964CC906A43A2AC6630181F439692610DCBB97D68B8399D9742A2B2819E984959C715A352018C65755D8121D3CA2CDEB0329F5552505A30C142A4E545600CA092DF28AC21021C47B3262A0A7C8EC8996B1A318C8A4E5254825AB758D236742A6270DE363456D41DE06604C7862CE9E4499B816993817C4C07528E55619D105849A62E07122517A12641899E6A315015080CC946899796A8E95975E354606230A6249A9ED2813C89D2A8A5378EA600394AA359DE511C1B116483881D96272A9A311E82B9A8E2C925C4472D87C851912376DEA231E5E7390A512C051000403A30D4F330 + +cTilde: 809AE94EE60181B39FF0495A0F2D956F90BF26840547C60DC054F343C3EC669F +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [-1, 1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] +cHat: [5151879, 3761338, 141333, 6782963, 5719991, 5067911, 7109550, 1122805, 4607435, 2431174, 7933133, 4683687, 1075479, 7833426, 7487302, 3905555, 5828401, 1263737, 5038397, 4223207, 2978095, 7294102, 5660061, 5343746, 2154592, 483674, 6251767, 3473426, 5624496, 7264532, 7810266, 5243322, 5930385, 372090, 4012389, 6217832, 6172529, 5875277, 4642794, 6033621, 1246184, 6302483, 146863, 52657, 6542880, 1828932, 50954, 4516993, 3769929, 524248, 547349, 1422545, 6748682, 3839052, 1244701, 8061585, 5633126, 6150571, 7795478, 7559755, 8044968, 420930, 4436955, 8038595, 4175971, 402538, 6640334, 7482029, 2553781, 4237889, 8325486, 6824395, 3019358, 5670974, 7788320, 2052085, 121880, 6758884, 5587932, 1102999, 5948652, 2061167, 1786694, 2371275, 7356729, 2763648, 7804238, 2411560, 6431423, 1285315, 2461946, 4803362, 6130134, 7217111, 4952986, 5816718, 1058829, 742554, 146346, 4742833, 1586091, 3461282, 1674230, 2302260, 5012843, 6618174, 4883875, 4820287, 8053875, 3516899, 1990516, 5326209, 96414, 5898486, 5387046, 1725058, 7358341, 4475679, 5048725, 4459217, 7349154, 6867950, 1103818, 7788216, 7501570, 3691593, 5378926, 2138588, 6876200, 4206879, 5245966, 2458077, 2523124, 1458756, 2423534, 6753368, 3889324, 1727789, 4891145, 5441445, 4559799, 210266, 1684704, 4459090, 1105230, 7286980, 1943285, 8137912, 6117361, 875916, 244290, 6825902, 4882028, 5395479, 2668985, 1834973, 2832483, 8006307, 5065115, 5557315, 8264739, 8025322, 5402011, 3279853, 553392, 3225843, 6841055, 2974222, 1609205, 1926853, 2920403, 6733409, 4627278, 6308403, 6550447, 5947500, 33181, 6762441, 1398345, 2293050, 3112508, 924101, 1099686, 2018114, 4070336, 6640640, 1916240, 7113591, 1693625, 8063507, 2464182, 7410354, 5485110, 2999371, 2307771, 806328, 7305849, 3295383, 7871339, 4792789, 7803459, 4998639, 4565504, 2011426, 5164811, 7517703, 1825839, 5024361, 7596117, 7801562, 5757998, 923360, 5226167, 4889898, 7226090, 3302021, 5377995, 2905347, 6640984, 3379973, 1889970, 2765963, 619451, 2293834, 5236524, 3188114, 6643915, 1169963, 1958794, 1770200, 4881923, 2427308, 5962530, 3420322, 2203688, 7978241, 2587458, 566912, 3431863, 1212668, 3126517, 67558, 2058146, 4223270, 4249382, 3951962, 5458075, 1639706, 2733423, 6808014, 1810578, 2872028, 1612798, 5916502, 1855305, 6016347] +cs1: [[0, 2, 8, 8, 4, 8380408, 7, 8380413, 8380397, 8, 8380412, 8380416, 8380411, 8380414, 8380401, 12, 2, 12, 8, 8380414, 8380414, 8380408, 8380402, 8380406, 8380415, 15, 8380400, 8, 7, 8380415, 8380404, 7, 8380409, 8380413, 8380415, 8380416, 2, 8380415, 8380393, 12, 3, 8380409, 17, 17, 18, 7, 6, 1, 8380405, 8380400, 1, 5, 1, 4, 8380410, 9, 8380415, 1, 8380407, 8380413, 8380407, 10, 8380406, 8380412, 8380414, 4, 13, 0, 7, 11, 8380411, 8380407, 8380411, 8380415, 8380404, 8380413, 8380415, 24, 7, 22, 3, 8380402, 8380413, 8380407, 0, 6, 8380409, 8380415, 8380414, 8380410, 6, 5, 9, 8380408, 8380415, 8380416, 0, 8380402, 4, 4, 8380415, 5, 13, 1, 1, 9, 6, 6, 8380390, 2, 2, 8380415, 9, 5, 6, 8380410, 1, 5, 3, 3, 2, 8380415, 8380405, 4, 0, 13, 10, 7, 13, 8380397, 8380414, 4, 5, 8380408, 0, 8380402, 8380413, 8380405, 8380392, 8380415, 6, 8380406, 8, 0, 1, 8380412, 0, 10, 3, 12, 4, 15, 8380414, 0, 1, 8, 8380407, 7, 10, 8380407, 8380407, 8380411, 8380411, 5, 22, 5, 9, 4, 19, 8380416, 8380402, 8380401, 12, 8380408, 8380413, 12, 2, 2, 11, 1, 13, 4, 8380413, 8380410, 11, 4, 0, 8380410, 8380415, 1, 0, 14, 10, 1, 8380407, 8380412, 8380404, 1, 8380412, 3, 8380415, 8, 2, 2, 2, 8380413, 3, 14, 8380416, 12, 8380406, 8380403, 8380410, 2, 8380412, 11, 2, 8380406, 10, 8380402, 8380414, 8380407, 8380408, 8380405, 9, 3, 2, 16, 8380416, 15, 11, 13, 0, 4, 2, 8380409, 4, 8380409, 8380410, 8380406, 8380414, 8380402, 25, 2, 8380416, 8, 8380399, 8380409, 4, 8380413, 4, 11, 11, 5, 6, 8380409], +[8380408, 8380405, 8380415, 8380412, 8380402, 8380404, 15, 15, 14, 1, 1, 2, 11, 1, 10, 8380413, 8380408, 8380410, 8380403, 8380402, 1, 1, 8380415, 8380416, 16, 8380413, 1, 8380411, 14, 8380411, 7, 12, 8, 8380407, 6, 7, 8380410, 8380415, 8380411, 8380407, 12, 2, 8, 8380408, 11, 8380415, 4, 15, 15, 13, 2, 8380412, 0, 8380411, 8380401, 6, 0, 7, 8380406, 5, 3, 0, 2, 0, 3, 8380415, 9, 8380410, 4, 1, 13, 8380403, 8380416, 7, 12, 5, 6, 6, 1, 8380404, 8380414, 8380413, 1, 8380408, 17, 8380415, 6, 9, 3, 8380416, 16, 8380413, 5, 1, 3, 10, 8380416, 3, 2, 8380399, 4, 8380393, 4, 8380401, 8380401, 8380412, 0, 4, 0, 0, 15, 5, 8, 1, 28, 13, 9, 3, 8380412, 8380399, 10, 8380402, 6, 8380404, 8380415, 3, 8380413, 8, 3, 8380412, 6, 8380414, 8380416, 8380415, 2, 8380406, 8, 3, 8, 8380405, 8380416, 8380414, 10, 1, 8380415, 11, 8380406, 5, 8380411, 8380410, 0, 7, 0, 8380412, 8380416, 2, 8380411, 5, 8380407, 5, 6, 8380414, 6, 5, 8380410, 2, 8380416, 8380406, 8380407, 8, 11, 8380416, 11, 11, 8380405, 5, 8380415, 3, 8380416, 7, 8380409, 3, 8380416, 1, 8380410, 8380405, 16, 2, 8380411, 8380415, 8380410, 8380416, 8380415, 14, 12, 5, 1, 24, 8380404, 4, 8380406, 8380400, 8380400, 7, 8380394, 6, 2, 8380416, 8380405, 7, 8380412, 9, 8380398, 17, 0, 8380416, 8380400, 7, 8380413, 0, 8380414, 8380416, 8380407, 0, 0, 8380412, 8380407, 6, 8380407, 11, 8380416, 8380410, 8380404, 8, 8380412, 15, 5, 8380410, 3, 8380410, 8380411, 3, 8380391, 8380413, 8380415, 10, 8380408, 8380416, 8380400, 2, 3, 8380416, 8380405, 6, 12, 8380414], +[8380410, 16, 8380407, 2, 3, 9, 2, 8380414, 5, 4, 8380402, 8380404, 8380414, 5, 8380406, 6, 8380391, 7, 0, 14, 8380414, 15, 0, 12, 8380406, 8380413, 6, 8380412, 8380408, 4, 3, 8380416, 8380398, 14, 8380416, 4, 8380406, 2, 0, 11, 8380400, 4, 4, 8380407, 13, 9, 8, 8380409, 0, 5, 8380410, 8, 8380409, 9, 8380411, 1, 8380412, 17, 8380409, 10, 6, 8380412, 8380404, 8380416, 8380393, 10, 2, 8380412, 8380410, 8380412, 8380404, 19, 1, 8380412, 8380415, 5, 8380395, 8380413, 8380416, 3, 2, 0, 8380407, 7, 9, 5, 7, 8380408, 8380413, 3, 11, 8380409, 8380405, 12, 8380416, 8380402, 2, 6, 1, 8380410, 8380409, 10, 8380415, 4, 8380411, 9, 4, 4, 8380410, 2, 8380413, 5, 3, 8380415, 6, 8380409, 8380410, 8380416, 15, 8380411, 8380411, 6, 8380409, 4, 12, 13, 8380406, 1, 8380402, 8380409, 9, 8380414, 8380416, 9, 8380414, 8380416, 8380415, 8380405, 9, 8380416, 8380403, 11, 8380416, 0, 8380396, 14, 8380415, 5, 9, 4, 8380402, 10, 8380415, 0, 0, 2, 10, 8380413, 8380411, 4, 8380412, 8380414, 5, 8380410, 4, 3, 8380403, 8380410, 8, 3, 7, 1, 8380407, 0, 8380415, 8, 1, 1, 0, 8380410, 8380416, 6, 8380413, 2, 0, 3, 7, 7, 1, 4, 8380408, 18, 8380408, 12, 8380415, 8380406, 8380415, 8, 8380405, 0, 1, 8380408, 4, 8380414, 8380411, 8380412, 2, 8380411, 2, 6, 8380414, 8380415, 5, 16, 0, 12, 8380415, 8380415, 8380414, 8380407, 8380408, 2, 5, 8380414, 8380414, 8380400, 13, 10, 8380414, 6, 8380411, 7, 8380412, 8380415, 17, 15, 0, 8, 8380416, 8380393, 4, 8380407, 8380412, 1, 3, 2, 9, 8380407, 8, 1, 3, 8380416, 8380415, 5, 2, 8380409], +[8380413, 8380408, 11, 8380415, 3, 13, 29, 8380407, 7, 8380414, 8380411, 8380410, 3, 8380404, 8380407, 1, 8, 3, 8380411, 8380416, 8380416, 0, 9, 8380414, 2, 23, 16, 8380406, 11, 8380410, 8380409, 8380415, 8380415, 8380416, 0, 0, 8380416, 1, 8380409, 8380410, 8, 8380410, 18, 8380410, 8, 8380413, 8380408, 5, 8380404, 8380407, 8380409, 12, 5, 0, 8380414, 2, 3, 6, 7, 8380415, 10, 13, 8380413, 10, 8380408, 8380408, 10, 8380406, 8380409, 10, 1, 8380401, 8, 8380394, 8380409, 1, 6, 3, 3, 7, 8380409, 0, 8, 8, 17, 21, 0, 7, 17, 8380411, 0, 17, 3, 10, 8380414, 9, 8380392, 8380399, 8380395, 8380416, 8380412, 17, 8380415, 12, 9, 8380416, 3, 8380413, 8380414, 9, 5, 10, 17, 8380403, 8380411, 8, 8380409, 5, 10, 8380403, 9, 8380410, 2, 7, 12, 8380415, 5, 5, 13, 8380412, 8380409, 6, 8380403, 8380413, 8380413, 1, 6, 8380412, 8380415, 26, 8380400, 8380414, 7, 2, 10, 4, 3, 3, 8380409, 8380411, 1, 8380413, 23, 8380413, 0, 5, 8380412, 8380401, 20, 8380407, 8380414, 11, 14, 5, 1, 5, 5, 8380416, 23, 16, 8380410, 8380416, 5, 2, 8380404, 0, 8380408, 9, 8380406, 8380415, 6, 8380403, 8380412, 8380416, 2, 8380411, 8380411, 9, 6, 8380416, 8380413, 12, 12, 8380415, 5, 8380412, 2, 8380411, 11, 8380407, 8380412, 3, 5, 8, 13, 8380411, 16, 8, 8380410, 0, 2, 8380414, 8380414, 11, 8380408, 8380411, 8380401, 8380405, 3, 17, 6, 8380409, 7, 3, 8380409, 16, 0, 2, 8, 12, 8, 12, 8380415, 7, 1, 8380415, 1, 8380406, 0, 8380411, 8380413, 8380414, 7, 8380411, 8380413, 8380415, 8380412, 4, 8380411, 0, 2, 12, 3, 6, 8380416, 0]] +cs2: [[2, 13, 3, 9, 1, 10, 8380410, 8, 8380415, 8380403, 8380405, 2, 1, 1, 8380412, 8380409, 8380415, 2, 2, 7, 8, 6, 8380412, 3, 9, 8380413, 8380407, 8380407, 7, 9, 8380416, 4, 8380406, 8380402, 16, 5, 8380414, 8380413, 8380412, 10, 2, 9, 0, 8380412, 8380416, 2, 7, 22, 8380410, 8380415, 2, 8380402, 10, 16, 8380409, 9, 2, 4, 8380415, 5, 8380409, 8380415, 8380413, 2, 7, 9, 8380416, 8380415, 8380412, 10, 8380416, 18, 8380409, 1, 13, 8380415, 3, 8380409, 8380406, 7, 2, 6, 12, 3, 13, 12, 8380413, 11, 8, 8380406, 8380401, 4, 8380410, 8380411, 0, 1, 8380402, 8380415, 9, 8380414, 9, 8380416, 13, 2, 6, 3, 4, 3, 0, 15, 8, 8380409, 8380403, 8380398, 3, 8380415, 8380414, 18, 8380410, 5, 12, 5, 2, 1, 8380411, 2, 8, 8, 6, 1, 8380404, 8380414, 8380407, 13, 8380413, 4, 5, 6, 6, 8380406, 8380408, 0, 3, 14, 22, 8380409, 8380416, 8380413, 8380413, 7, 6, 8380412, 14, 8380408, 8380412, 13, 8380397, 8380416, 8380412, 9, 8, 8380404, 12, 6, 1, 1, 13, 12, 10, 7, 15, 0, 8380410, 8380411, 4, 8380412, 4, 8380408, 8380416, 8380409, 2, 11, 8380413, 8380413, 21, 2, 11, 1, 8380415, 8380412, 5, 3, 7, 8380412, 0, 8380415, 8380414, 8380400, 8380412, 8380399, 15, 8, 8, 8, 19, 9, 0, 4, 3, 8380404, 8380415, 8380414, 8380413, 8380403, 1, 8380401, 13, 8380411, 8380414, 4, 8380412, 4, 11, 8380410, 8380412, 11, 0, 8380416, 8380416, 11, 8, 8380410, 3, 8380402, 8380413, 8380390, 8380415, 8380406, 7, 8380412, 15, 11, 2, 7, 13, 7, 23, 8380412, 8380413, 8380409, 4, 8380408, 10, 8380414, 10, 8380403], +[8380408, 0, 8380416, 1, 12, 3, 8380399, 13, 1, 12, 8380409, 6, 8380400, 8380413, 8380397, 10, 8380411, 8380413, 10, 7, 8380403, 5, 8380414, 15, 10, 5, 7, 16, 8380402, 8380414, 8380415, 8380413, 8380416, 8380416, 5, 7, 4, 8380415, 13, 8380416, 0, 8380416, 4, 9, 1, 6, 4, 8380411, 8380411, 20, 2, 4, 8380410, 0, 11, 8380400, 8380416, 1, 7, 10, 1, 18, 8380414, 0, 8380411, 10, 2, 7, 8380415, 8380413, 20, 0, 8380403, 8, 3, 5, 8380410, 3, 7, 8380405, 8380407, 6, 7, 2, 16, 8380414, 6, 5, 8380408, 0, 6, 0, 8380409, 15, 1, 10, 8380411, 0, 8380410, 11, 8380403, 8380407, 7, 8380415, 4, 8380409, 2, 3, 1, 8380414, 16, 13, 8380410, 1, 8380414, 8380415, 4, 8380407, 11, 12, 5, 11, 8380410, 8380416, 8380414, 5, 7, 3, 7, 8380416, 1, 8380410, 8380401, 4, 8, 8380408, 8380406, 19, 8380405, 8380404, 4, 8380415, 11, 2, 8380413, 15, 4, 5, 12, 1, 8380415, 8380416, 8380414, 5, 5, 8380394, 11, 8380413, 8380403, 9, 8380413, 2, 1, 10, 8380409, 12, 8380408, 10, 2, 16, 12, 18, 8380410, 0, 1, 8380395, 8380409, 1, 8, 8380409, 6, 8380414, 8380407, 13, 8380401, 9, 2, 4, 2, 15, 5, 8380410, 6, 0, 24, 1, 1, 6, 8380413, 8380412, 2, 0, 8380413, 7, 8380410, 8380413, 4, 8380405, 8380405, 8380414, 8380415, 8380413, 11, 8380406, 8380413, 8380416, 8380409, 7, 12, 8380412, 1, 6, 11, 8380414, 13, 8380412, 3, 8380399, 0, 8380415, 4, 8380402, 9, 8380415, 8380416, 2, 4, 8380410, 8380412, 8380407, 5, 8380416, 8380415, 8380413, 20, 4, 8380416, 1, 8380416, 8, 8380414, 8380414, 8, 8380416, 8380409, 8380411], +[8380411, 2, 8380416, 8380406, 7, 7, 0, 2, 8380410, 1, 0, 16, 9, 8380412, 8380415, 8380413, 18, 0, 7, 10, 8380410, 8380414, 7, 5, 8380411, 7, 8380407, 8380412, 8380416, 5, 8380399, 1, 8380402, 12, 4, 8380415, 8380396, 17, 1, 12, 0, 6, 8380413, 8380415, 8380412, 2, 8380413, 10, 8380403, 11, 8380413, 8380414, 2, 0, 8380407, 10, 8380401, 8380400, 4, 0, 8380416, 11, 8380416, 8380410, 5, 13, 3, 8380407, 8380413, 15, 0, 5, 6, 1, 8, 8380415, 8380414, 8380408, 8380401, 8380412, 8380413, 8380415, 0, 8380404, 2, 8380413, 12, 8380412, 8, 8380404, 5, 1, 21, 2, 8380416, 8380411, 8380408, 8380407, 8380411, 8380408, 8380405, 8380413, 8380416, 8380408, 8380416, 8380407, 8380410, 4, 9, 8380409, 4, 8380413, 8380413, 7, 0, 8380416, 8380407, 8380405, 8380416, 11, 8380409, 8380408, 8380414, 8380397, 8380412, 15, 8380414, 8380415, 3, 3, 0, 8380415, 10, 8380402, 8380404, 8380410, 8380414, 8380410, 2, 8380408, 16, 8380410, 8380402, 8380403, 8, 6, 8380414, 2, 8380415, 15, 8380405, 8380404, 8380414, 8380404, 1, 8380410, 14, 8380407, 8380409, 8380407, 4, 5, 1, 8380413, 8380399, 8380413, 8380412, 6, 8, 8380409, 8380404, 2, 23, 7, 8380414, 8380403, 8380412, 8380411, 8380413, 8380416, 3, 8380410, 8380409, 4, 8380416, 9, 8380415, 8380400, 8380408, 10, 1, 8380414, 1, 8380402, 8380413, 2, 5, 4, 0, 8380405, 8380410, 8380412, 0, 8380405, 0, 8380411, 5, 0, 0, 8380407, 0, 0, 4, 3, 8380403, 8380406, 17, 8380411, 8380409, 8380405, 8380402, 8380407, 8380412, 8380413, 9, 8380405, 10, 8380409, 1, 8380403, 4, 4, 15, 8380411, 4, 10, 8380412, 8380402, 0, 8380405, 6, 8380402, 8, 8380411, 8380416, 8380401, 1, 8380411, 10, 5, 8380412, 8380413, 5, 8380404, 5, 8380411], +[14, 8380407, 8380407, 8380407, 8380404, 8380409, 8380415, 8380416, 8380404, 6, 5, 1, 8380415, 14, 2, 19, 23, 11, 12, 7, 8380407, 10, 8380401, 2, 3, 8380414, 8380404, 8380409, 8380397, 8380412, 0, 3, 8380406, 8380412, 8380410, 0, 8, 7, 1, 8380411, 8380402, 0, 8380405, 16, 8380410, 14, 8380413, 11, 8380409, 8380407, 8380415, 11, 9, 8380415, 5, 8380407, 8380402, 0, 8380393, 10, 8380391, 1, 8380408, 12, 8380410, 12, 8380402, 17, 8380410, 1, 8, 6, 2, 8, 8380406, 8380412, 9, 8, 8380407, 5, 8380408, 4, 0, 8380411, 8380406, 8380414, 8380406, 8380405, 8380411, 14, 8380407, 15, 8380409, 7, 8380413, 4, 8380414, 24, 4, 10, 8380409, 15, 0, 16, 8380414, 3, 8380403, 8380411, 8380401, 2, 8380406, 8380414, 8380390, 6, 7, 2, 8380398, 10, 8380409, 5, 8380412, 8380412, 3, 8380412, 8380416, 8380411, 13, 16, 0, 5, 16, 2, 8380408, 8380412, 5, 5, 8380405, 5, 8380403, 8380409, 8380415, 6, 8380395, 8380411, 8380406, 8380414, 7, 8380411, 8380403, 13, 8, 9, 2, 0, 4, 12, 8380416, 1, 8380413, 8380411, 3, 3, 1, 8380402, 0, 8380411, 8380410, 1, 8380414, 8380398, 8380412, 8380397, 8380416, 11, 11, 8380410, 17, 8380404, 23, 6, 20, 16, 3, 8380402, 2, 8380416, 8380407, 8, 8380411, 8380410, 8380414, 8380396, 8380409, 8380399, 4, 8380412, 8380410, 2, 8380411, 8380405, 5, 6, 18, 15, 3, 1, 12, 8380403, 7, 6, 4, 1, 6, 8, 7, 8380410, 8380414, 8380404, 8380405, 8380413, 10, 8380400, 3, 8380413, 8380409, 8380410, 10, 8380412, 6, 1, 25, 5, 19, 4, 8380412, 8380414, 8380414, 15, 13, 8380408, 6, 8380402, 8380399, 5, 5, 8380391, 6, 5, 6, 8380408, 8380415, 8380393, 5, 2, 5, 6]] +z: [[117652, 8291919, 99237, 103753, 129786, 115302, 112357, 8270039, 28090, 108241, 8371089, 27871, 8268967, 26880, 8274254, 8285256, 3179, 8319068, 99926, 8250950, 102614, 87651, 8361701, 8364437, 51385, 74852, 8268024, 8310235, 30309, 69398, 8347844, 80683, 8375685, 8305512, 8375603, 8271234, 7320, 94510, 8300469, 121539, 8286969, 8372511, 45479, 4221, 8264147, 20940, 8261332, 8315106, 51212, 15181, 94287, 68773, 8297949, 8314855, 8373243, 8259594, 89639, 74687, 127409, 8362693, 78279, 8363729, 8273856, 103930, 79502, 37324, 94859, 8352412, 8368171, 96382, 21545, 8372421, 8256561, 8283628, 8355226, 8320134, 8252946, 8340143, 53, 68948, 8311057, 103347, 60913, 8280073, 8334834, 73668, 8320854, 127675, 8273600, 8362641, 114763, 8316510, 8278155, 8306826, 52603, 8302871, 45466, 103658, 54275, 38679, 6884, 87742, 8312717, 8272348, 96655, 62021, 37114, 8348751, 8257214, 88599, 8290846, 8327397, 8361584, 114167, 92835, 8370560, 8254378, 23357, 18870, 22548, 8308055, 104915, 67398, 93113, 45481, 78543, 84581, 8273458, 106904, 118998, 8255076, 8253304, 65695, 8273878, 8350100, 58141, 125916, 100780, 118895, 26861, 34344, 8373585, 113963, 8334597, 17581, 8264544, 78689, 8362771, 76510, 81629, 8366611, 8313300, 69395, 6280, 36657, 8353677, 8305601, 34920, 85691, 106217, 87880, 32508, 8288288, 19058, 8296204, 19004, 105307, 8369229, 105070, 8360252, 8303224, 8347317, 8351877, 82601, 8308323, 15856, 8279253, 8285023, 114988, 97274, 111910, 6158, 7875, 268, 48093, 8261154, 104302, 4000, 8365493, 8273317, 95207, 8293166, 31972, 8250790, 8256761, 8378207, 8312950, 92248, 8372183, 116563, 8320917, 23560, 8294921, 8282386, 8255962, 122596, 8324605, 8345460, 8348831, 8286939, 108367, 8338537, 8353158, 3519, 8365178, 8367554, 8297252, 44603, 8307216, 8270179, 8327229, 8368381, 8288266, 8371494, 8266467, 8322431, 8366794, 8311685, 8329263, 68427, 8362299, 10979, 109791, 8273780, 32817, 8264372, 44199, 111873, 17042, 13814, 8367505, 8364435, 124721, 8302181, 62560, 8372860, 8329512, 126265, 8272344, 63412, 8335839, 8350986, 25588, 8374169, 8345118, 116400], +[8328881, 7517, 8312348, 8292259, 8326936, 8329435, 8281356, 13881, 8305091, 8335479, 8370301, 8327491, 57784, 103567, 8351542, 76526, 8329204, 59463, 30322, 8322178, 8369769, 8377841, 71616, 8375603, 11113, 8303325, 8252792, 8376178, 8281852, 8267206, 8333784, 82327, 8261883, 8267087, 21214, 90331, 8252159, 8360744, 21922, 8340334, 22796, 8328184, 124474, 84162, 8257262, 8376728, 42304, 120979, 8288471, 52809, 8284185, 52662, 6194, 8271197, 34118, 8314331, 8352938, 8288598, 8287521, 8253561, 8366409, 9143, 15612, 8316649, 8278092, 65619, 8260736, 57856, 16861, 45171, 8341861, 22997, 8259972, 57476, 106572, 104113, 8287347, 8296363, 72280, 45128, 4648, 8265499, 105536, 122412, 125119, 80247, 8335847, 33910, 8263618, 8368916, 105148, 8310334, 118697, 8325251, 8314573, 108295, 102956, 4501, 8351051, 90084, 8331238, 57693, 8343914, 8322352, 8373658, 129164, 15797, 3132, 12499, 14807, 8352924, 87886, 8278799, 8251735, 21528, 118445, 1657, 8374404, 8358680, 60000, 9528, 35522, 45635, 16653, 8376896, 8323879, 111790, 6890, 8341969, 49157, 40867, 111901, 8293417, 31852, 18663, 8380090, 99702, 89968, 9681, 18291, 4649, 97461, 8364739, 8378611, 8377557, 8340127, 8277382, 17187, 9322, 8253789, 8362043, 8271474, 34084, 109561, 8268915, 30217, 8252007, 32389, 64222, 8315770, 8329522, 62035, 8297889, 128102, 8323916, 77431, 32102, 8356646, 8259095, 35951, 118322, 8319184, 8322372, 8322541, 46305, 15550, 8279611, 8278106, 93499, 10678, 78863, 8366817, 8370016, 8345785, 102396, 118954, 8269260, 8288147, 76778, 8334050, 8343858, 8315327, 41129, 8340994, 111969, 109595, 8306547, 8276883, 53532, 8252313, 49506, 8354207, 80888, 8254835, 8308407, 8338316, 8327023, 8270525, 2231, 8355680, 60270, 45185, 92599, 21998, 8338018, 8362339, 68489, 55502, 41257, 8351654, 63045, 8372080, 107252, 8320665, 10172, 15274, 8328361, 67507, 8377124, 107855, 8301828, 107433, 8352612, 8317203, 3683, 8308693, 51553, 41543, 8356072, 8256294, 8283664, 79435, 8378921, 8308251, 8287706, 8361398, 7413, 106046, 8274195, 8335381, 8323142, 28845, 23461, 8367844, 8302539, 8300974], +[110177, 102252, 25916, 8270868, 8354697, 8294410, 8376619, 67888, 8262872, 8353316, 128222, 89824, 89019, 118425, 95917, 16416, 8300917, 8266787, 8366355, 8283849, 56249, 8279837, 8320865, 8284897, 8341999, 8251158, 8294376, 8265655, 8330795, 41087, 8250366, 8259835, 8333030, 33524, 8256720, 8249649, 126806, 32155, 65999, 17990, 29862, 117945, 8359488, 8292906, 41214, 8376707, 8294069, 8256464, 8303563, 51931, 80601, 8326673, 8290844, 8341188, 16359, 116809, 127627, 8319353, 8371924, 24437, 8281447, 111874, 76822, 8285911, 86472, 8347845, 8299359, 8300913, 44550, 8269526, 126609, 8349682, 17923, 16590, 8268735, 8332, 124606, 8339551, 121415, 64047, 8347494, 44462, 8341226, 8321738, 108739, 99094, 124616, 56003, 87354, 75478, 3348, 8256705, 14422, 8320852, 8336516, 8293692, 8317017, 8367396, 8365262, 8347042, 34017, 62237, 8345868, 35625, 8363247, 8301421, 92059, 121862, 8360316, 6413, 121771, 47664, 39036, 8274012, 70802, 8314869, 8337375, 8345239, 77344, 8253824, 29804, 8353907, 33590, 5696, 79644, 8361041, 8282652, 31141, 122913, 116157, 8346210, 8350245, 23362, 8333150, 8326017, 8264682, 8353425, 8373436, 8291063, 27317, 8303348, 129378, 111872, 108544, 8316483, 8302533, 8357942, 8346710, 17996, 96983, 105932, 31296, 101740, 8253702, 8274978, 8324154, 8251077, 8319435, 8339370, 110063, 101597, 8302297, 8353832, 6258, 31948, 48976, 8340748, 8323427, 8364220, 8320385, 56883, 8267882, 41540, 8300148, 8353790, 26720, 40418, 76550, 77888, 8282295, 110913, 49314, 8339453, 8374829, 8369903, 8309906, 15898, 60406, 112392, 8317829, 8271706, 77637, 8249793, 8262359, 75991, 8375160, 8336661, 8376650, 8373747, 8276404, 8350071, 8360202, 8376883, 8250424, 49145, 70177, 8250251, 8326161, 8368310, 126905, 102874, 8305581, 54843, 8324321, 5566, 8318323, 8346359, 54161, 126759, 8342553, 8260489, 8335455, 8310274, 115353, 12784, 8254541, 9574, 8322228, 9515, 124208, 19941, 8266199, 8315705, 8276039, 8367005, 8265253, 8374711, 60219, 33318, 8305614, 8338024, 101519, 36987, 8366428, 89559, 15512, 8321854, 54985, 8311335, 97928, 57322, 8300168, 56950, 108148, 8308155, 41377], +[8363531, 41588, 8350844, 8371003, 8365291, 546, 19601, 105012, 130332, 65554, 8369189, 18054, 8313178, 8289461, 8359092, 8360648, 8317133, 8327142, 115866, 8325135, 29562, 127892, 8354720, 19886, 54932, 125210, 8374802, 8268667, 64312, 131040, 81606, 8299884, 8362089, 114021, 8343097, 8359125, 8343845, 8352647, 8285335, 8363695, 31561, 8326049, 88464, 39730, 8332522, 39918, 8268886, 8267458, 8357555, 37059, 127683, 115853, 59563, 78860, 110602, 8281422, 114735, 123025, 8327273, 89272, 8288902, 34958, 8289278, 8350968, 8335207, 50738, 113661, 8353679, 35478, 118771, 72001, 14712, 8307200, 8267266, 45197, 50887, 109361, 8269015, 8377513, 44198, 37669, 123285, 8306848, 73699, 10183, 86215, 29627, 36650, 8278249, 75309, 8261964, 8316153, 126522, 8334596, 8281151, 8272991, 8300657, 8261846, 8311642, 120693, 56327, 67350, 117126, 87447, 8336683, 120625, 8315317, 8252774, 8315002, 110913, 8278835, 8299281, 113853, 105989, 55027, 8297236, 25535, 8249550, 76273, 8324605, 8315667, 5800, 8250613, 83994, 8292771, 8342045, 8296554, 8260072, 69233, 37428, 91669, 107124, 34245, 8371861, 8380132, 74593, 8263253, 8379675, 8328100, 26924, 8289140, 29070, 8308418, 8374521, 8272407, 88291, 76432, 8330483, 8333636, 2070, 40129, 8341126, 107120, 8349465, 22457, 8357253, 25024, 11998, 8335313, 125106, 8368275, 8376353, 100762, 8376513, 54857, 8338815, 8380344, 8344564, 8297149, 14161, 8347276, 20577, 8249993, 70001, 20832, 104329, 49901, 8332123, 13312, 8303910, 8320744, 117954, 68885, 100178, 67283, 44091, 8366194, 11407, 102611, 8270226, 101365, 126219, 78266, 93915, 110063, 8320182, 8269442, 68093, 82685, 8264093, 110453, 104999, 8305082, 41698, 59487, 8364632, 8351734, 8356920, 466, 8356306, 8299911, 8361521, 8364961, 8371528, 38474, 100545, 8372639, 55595, 8304918, 49222, 8285079, 8326798, 81605, 20096, 32570, 8317467, 8371649, 5131, 8254391, 8271567, 8334657, 8337424, 55366, 8315339, 12677, 66107, 29647, 8292549, 8347895, 8353454, 69902, 8299397, 8333995, 8360761, 8269470, 8358435, 19290, 29132, 8336800, 78926, 123633, 8288700, 8269423, 92115, 8280407, 66177]] +||z||: 131040, ||z|| too large +r0: [[57205, -15399, 40390, -36966, 35222, 77137, -41195, 51387, -82046, 30787, -7085, -56894, -32953, 54818, 7675, -86794, 39171, 27321, -81935, 31825, -54717, -43916, 22000, -8828, -14130, 37690, 42748, 39171, -25540, -28282, -18265, 43597, 21628, 77384, -93173, -23349, -86948, 51575, 70658, -70099, 27374, 27979, -37322, 77190, 58964, 41784, -73890, -45995, 56735, -75540, -7387, -18975, -85820, 78245, 78595, -73543, 51103, 46687, -48932, -6186, -65053, 94095, 4897, 32006, 28388, -17113, 22573, 67960, 84773, -81221, 85506, -21101, -27719, -85320, -39616, 25880, 18289, -78465, -89223, 32517, 68944, -64284, 92019, 68746, 55851, -29534, -10907, -5722, -61029, 45394, 30013, 12086, 23388, -76579, -42667, -723, -13024, 73703, 64992, -42130, -54889, -46174, 15765, -49993, -36069, 30399, -27782, 33483, 78212, 30763, 27778, 31031, 29107, -18808, 55588, -44520, 22575, -33955, -10809, -69123, -54045, 87885, 71167, 51483, -54057, 44383, -79459, -78614, -41039, 10625, -25566, -28965, -6681, 59240, -49399, 32708, -81869, -35223, -86348, -54512, -42768, -33491, 68848, -92203, -75219, 8890, -23720, 2999, -75526, -47613, -88436, -43566, -15365, 54425, 35051, -22821, -50225, -18375, 77896, 83422, 38908, -29727, -29195, 55372, -26383, 76245, -77697, -56592, -69184, -1897, 75229, -67797, 8973, -35170, -62546, 43169, -93056, -17735, -72620, 22322, 18707, 71768, 3949, 15642, 41570, 84130, -44340, -9618, -51615, 73137, 65270, -75161, 67891, -48212, 74393, -3574, -9896, -22325, 40791, -2702, 57446, 80792, -39913, -78959, -26592, 65531, -46035, -68594, 34846, 63347, 47780, 8067, 87866, -35630, 47027, -72700, 52740, 28174, -93819, -20733, -66809, 59694, 41395, 55532, 76140, 3009, -15869, -87572, 42521, -78097, -89801, -80632, 35331, 44660, -86287, 26653, 32417, 81946, -79574, -94243, 82595, 47712, 62040, -91061, 87385, -22603, -81905, 6860, 15923, -31245, 48465, 75552, 52253, -45724, -84981, -17940], +[-32506, -37147, -52604, 93847, -67430, -10502, 25143, -26000, -45387, -91277, -40282, 83158, -27965, 94447, 77685, -65481, -92616, 67185, 77769, 54806, -1525, -52119, 34886, -45163, 53652, 2376, 2900, -77451, -4097, 79145, 65236, -46544, -989, 2842, 68157, -4191, -42637, -27119, 92889, -36947, -39991, 86212, -74255, -76361, 28086, 14969, 60897, 68597, 58896, 82419, 32582, -21340, 15272, 4711, -87116, -55467, -88278, 32292, -88392, -72319, 20509, 61249, -318, -24969, -40105, -48361, 57218, 28123, -25050, 12137, -72762, 82688, -75991, 60733, 93846, 56246, -14230, -35811, -81712, -41172, -15527, 5986, 41467, 13529, -15938, -61797, 4417, -88895, 49160, -71455, 7167, -64179, 15205, 79709, 47806, -90653, 6143, 30240, -88906, -62766, -48701, 50121, 8501, -88733, 17390, -37934, 2861, 30289, -3981, 30923, 24256, -12190, 17337, -58407, 43767, 15809, -1126, -10580, -7437, 7057, 64778, 20151, 27223, -45843, -79865, -76617, -9668, 35485, -14499, 80666, -80174, -37771, 982, -93103, -1600, 71723, 17001, 43311, -51905, -28131, 51573, -85365, 45475, -42885, -39809, 73703, -36644, 47640, 89387, 55007, 63760, 91365, -75014, -93532, 28481, -10801, -93113, -19359, 30151, -32504, -61404, 86974, 9278, -40895, 37281, -90237, 84144, 86875, -70301, -84353, -6039, -19161, -84262, 86180, -7643, -7591, 28130, 20319, 29908, 72079, 49596, -68468, -77584, 73794, 23303, 37625, 34522, 17037, 90274, -89179, 29313, -50808, 64723, -63507, 37047, -31802, 51542, 49695, 2066, 80781, -18210, -65697, 43334, 20853, 32409, 36495, -59854, 53679, 5757, -77730, 90478, 45352, -69112, 49929, -38525, -24746, -20835, 77656, -48625, -5948, -38350, -76184, -67659, -25253, 48760, 29024, -8863, -80443, 79267, -28236, -85762, -3290, 90022, -92892, 73454, 43189, -81162, -60654, -29221, -61661, 3980, -58586, -79989, -68028, 40524, -88823, 83932, 42607, -33502, -65899, 8067, 20527, 43209, 79647, 32326, -57999], +[28068, -47763, -87709, -47061, 42403, 63660, -48219, -29402, -85474, -70731, -49023, -8035, 41043, 32004, 47610, -11479, -6889, 64624, -80428, -64485, 91020, 91941, 40297, 47770, 38363, 91170, 57058, 77139, -46560, -62066, 67263, -77106, 19789, -49293, -81073, 15673, -91262, 75916, 78074, -15837, 83227, 55705, 72235, 79727, 38972, -23086, 2824, -77723, -70110, 91667, -52775, -51706, -21833, 7262, -89482, -40253, -8431, -89260, 39884, 11656, 40447, 28424, -19511, 22093, -60306, -26502, 47100, 70292, -66105, -73508, 90207, 53605, -52703, 28508, 14773, -37279, -19617, -21871, 2172, -42171, 60276, 20463, 51892, 1966, -7275, -68338, -17591, -92930, -20968, 34502, -8925, -17405, -81405, 49338, 11423, -53413, 68104, -67491, 53378, -77686, -2212, 18016, -4783, 60080, -1238, 16845, 49042, -3048, 65294, 20064, 40442, -72815, 24430, -36959, -10911, -89911, 50416, -55719, -24896, -37811, -21206, -9820, 40371, 7251, -6474, -81707, 83130, -32013, 5424, 32825, 68924, -62957, -22592, -28080, 83252, -32678, -81546, 12418, 63585, 12608, 79289, 13319, -6542, 15089, 79292, -84244, 11979, -54055, 33535, 65484, 55527, -88678, -83986, 4116, -52852, -51734, -15212, 68551, 56821, 28345, -89099, 60294, 45504, -1395, 79569, -33836, 29434, -52917, -76526, 52664, -52196, 25098, -62393, -11291, 13941, 10250, -42174, -28180, 51017, -15078, -46136, -23227, 82260, 61382, 77643, 86771, 62144, -41988, -36811, 61349, -58064, 89614, 51389, -20371, -70945, 69969, -80712, -65237, 81378, 14255, 17186, -26423, -84847, -56694, -31985, 19739, -48171, 37673, 87852, 65612, 48354, -82606, 22542, -72265, -28079, 23024, 60845, 77541, 4413, -58234, -24321, 408, 71353, -75289, 29683, -69572, 73209, -76404, -5067, -27462, 51634, 91031, -81488, -35284, 22675, 34525, -34974, 83004, -63572, -49665, -63147, -59219, 52362, -10278, -85794, 47235, 27964, -30464, -47255, -35938, 44776, -23931, -49419, 53582, 61767, 47764], +[78557, -28767, -77045, -94325, -47959, -42531, 63066, -36342, 75010, -69546, -70488, 47331, -78849, -19520, -81865, -55013, -49713, -94056, -62799, 2659, -62310, -62929, 40232, 93663, 60434, -23370, -68421, -89377, 38468, -92074, 5649, -90483, -18013, -55284, -56718, 7193, 32979, -57647, 89113, -72955, -70995, -75272, -20795, 93260, -41910, 76546, -81085, -8667, 80267, -71213, 24160, -57680, 64496, 91042, -13572, -79663, -46118, -94755, -51517, -12566, -23985, -31789, -11177, -64878, 90247, 20308, 57607, 60381, 85528, 38530, -37730, 14988, -25281, 67362, 15404, -26611, -86080, 24481, -48813, 78759, 80878, -19469, -1586, -86356, 67646, 19132, 62981, 87084, 52967, 48694, -70119, -17956, -90032, 76790, 36373, -94893, -61189, 718, 63741, 15246, -78297, -67293, 60191, 53414, 42995, -6459, 86159, 76306, 35824, 36670, -75191, 15105, 3389, -78993, -92877, 66812, -2085, -55977, -31385, -64703, 93115, 59811, 42635, -27548, 83259, 39717, -69598, 85798, -28361, -90976, 72985, -31507, 38635, 33309, 6041, 73859, 93677, -30680, -55830, 58173, -31947, -86314, -27124, -24963, -71254, -32931, -46323, -8750, -21318, 5139, 42398, -57885, -79891, -30674, -4794, -53212, -75647, -41301, 36508, -19222, 56178, -41148, -71600, 37547, -7630, -91628, -47005, 59191, 83682, 30785, -65896, -60527, -94700, -42054, 92140, -88950, -58972, -28334, -63276, 16440, -39926, -21710, 94569, -46525, -17921, -46057, 26508, 47837, -321, 19381, -25791, -1481, -75818, -39333, -29152, -9523, 35270, -18666, 83555, -51018, -51123, -1598, -26911, 13820, -34650, -37537, -6469, 46052, 10816, -16094, 64801, -72560, -69213, 2702, 35953, -1304, 76871, 87005, 30696, 7688, 35161, 52463, -8923, -13283, 62095, 6808, 93748, -67674, -64977, -52876, 74893, -32423, -88183, 29533, -66787, 59917, 31701, -38719, 93645, -57946, 62876, -35494, -90258, -88991, -49755, -7268, 62918, 77416, 43989, 8300, -74073, -8376, 64362, -61243, 16239, 36122]] +||r0||94893, ||r0|| check passed +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-54016, 57151, 7319, -1221, -121367, -8268, 75887, -124779, 12220, -96893, 110461, -24630, 87493, -2004, 23040, 73278, 103663, -34055, -40061, 11565, 13203, 99130, -22237, -93773, -23441, 58906, 188, -97644, -9009, 86888, -40911, -25602, -45558, -15216, 106671, 104047, -45734, 46102, -34630, 31591, -18861, -44758, -50554, -130870, 104191, 22949, 67711, 90559, -9436, -15081, -124317, -79589, 100138, 125058, -82911, -90906, -17425, 13974, -64167, 104588, 35954, 110689, 39463, -5381, -78500, -119048, -57811, 10733, -34211, -35278, 37839, 130164, 121134, 33538, -76522, -54407, -101848, 14022, -39189, 52188, 73035, -1750, 27433, -66336, 2075, 68103, -88149, 70158, -89739, 28084, 32716, 108305, -72814, 84624, -92877, 67215, -77180, -34413, -86, 127658, -126173, -122688, 62197, -88801, -6159, 56024, -3105, 51796, -11348, -59744, 36625, 93288, 67127, -13952, -55595, -12722, 44016, 38545, -80961, -11744, -49044, -44880, 2194, -32350, 23867, -53195, 121576, -12378, 87836, 58880, 5831, 59269, 15004, -48703, 106085, 48679, 129139, 74620, 117227, 37337, 71558, -63225, -26216, -73269, -84920, 103642, -71735, 4443, -20929, -86051, 64464, -74428, 53003, 18505, 122899, 18343, 7869, -27767, 88139, -1429, -63489, -59708, 6293, 107235, 86314, 17554, -98205, -45141, -106577, 59325, 85740, 85307, -51775, 32649, 108558, 58971, -9527, -62284, 78550, 24445, 54781, -70095, 127448, -74737, 93753, 1666, -23660, -38550, -21850, 55902, -130655, -74315, 126237, -35922, 33137, 42427, -111284, 29533, -127453, 59437, -116348, -47532, -53403, 124489, -129637, 97261, 84693, 3897, -65220, 99882, -6668, 73946, -113484, 7945, -64255, 29779, 117248, 35214, 35642, 123370, 33121, 97410, 100355, 102110, 127752, -69882, -116387, 75179, 34293, -59785, 44949, 111938, -73053, -113958, -15383, 50591, 95674, -48045, -45336, 58580, 18560, -17198, -27510, -90542, 114634, -59525, -91195, -106962, -78333, -113276, -77350, -81452, -50823, 75875, 76998, 114670], +[-29248, 56187, -92953, -5383, 29593, 10080, -55123, 90644, -91145, -64817, 2370, -92112, 22362, 55467, 61858, 104855, -3696, -32105, -94001, 98242, -33037, -85356, 113680, 204, 102373, -54146, 65621, -89257, -18571, -90636, -3750, -62334, -130932, -50938, -65751, 45881, 12567, 102826, -118700, 63915, 108405, -82061, 24613, 99928, 16833, 107805, -42855, -120820, -34969, -81354, 12450, -66772, 71202, 94360, -9732, 24469, 48483, -87376, 114191, 95492, 21140, -47378, 119498, 101682, 128043, 123761, 113116, -36047, 5741, -34920, -101333, -121373, -85521, 53910, 86199, 130420, 128613, -107044, -107262, -123068, -60505, 75461, -117925, 60586, 37306, 11230, 87892, 127320, -18090, 15936, -41898, 86035, 87007, -129029, -8217, 79272, -114792, 65422, 67859, 57087, 58638, -86021, 41345, 38610, -128921, 82969, 43651, 56906, -1548, 47909, 80392, 101645, 15205, 12291, -79016, 35138, 59939, 53305, -74227, 15634, -110804, 67998, 40486, -98211, 39804, -76980, -124289, 11308, -55170, 62172, 110594, 51193, -30028, -25813, 107122, -13144, -39433, -88780, 32641, -110171, -104293, 115934, -96060, 68025, -34712, -33062, 26866, -72703, 86745, 39050, 73437, 67579, 38460, 16741, -109544, -60487, 74819, -68457, 6598, 129759, 100489, 113351, -53772, -110679, -89568, 87067, 39695, -39231, -49838, 51388, -6168, -102409, 80622, 111430, -90568, -38061, -94414, 114092, -28207, 64682, -99087, 91076, -91101, 97435, -107177, 121921, 122485, -63510, 55935, -101487, -87551, -43812, 70884, -48365, 63481, 63009, 104348, -28473, 117932, 6113, -130108, -79033, 81678, -60097, -1530, 57977, -20183, -54626, -74213, 55755, 81438, -77155, 97845, 56188, -93609, 52393, -91126, 56342, 60850, -36112, -31015, -130066, -85761, -103263, 128532, -113182, 93053, -41989, -8677, 2662, -75551, 27312, 33384, -18709, 14411, -71684, -8868, -107703, 122102, -109609, 101427, -61454, -31755, -124219, 124330, -1599, -27521, 23662, 27479, -76319, -36396, -99388, 61858, -9551, 37660, -20705], +[-13691, 89927, -101188, -38894, -4441, -25708, 23843, -97024, 13762, 25626, 127025, 116145, 89972, -76945, -127740, 72856, -24798, -101731, 120929, -4575, 97409, -31376, -123143, 14880, -26677, 19932, -18509, -17397, -2543, -126268, 31778, -34628, -75282, 23698, 80655, -42512, -63486, -69233, 116319, 113676, 120420, 38416, 104935, 5233, 46024, -117716, 41460, 68683, 117243, -94340, -109392, 101765, -108659, 119995, -95495, -94792, -90396, -96645, -45429, 91732, 45573, -7154, -18721, 122994, 65350, 24828, -43513, -8374, -65704, 126051, 110375, 87058, -21475, 33578, 17787, -116732, 126394, 41158, -52557, 29324, -35943, -91617, -5337, -128547, -118211, 5981, 66063, 59974, -27578, -121645, -18116, -22404, 12222, 51433, -70999, -47063, -122994, 36034, -94642, -13978, -115516, -35308, 84670, 68819, 56897, -78933, -44640, 91004, -10113, -23215, -66833, -32834, 2930, -114273, -91857, 105783, 36130, -47369, 31978, 62767, -75927, 19855, 120696, -22091, 129082, 9273, -121590, 59407, 16572, -25639, 6418, -114312, -78327, 74111, 115069, 107989, -112832, -86839, 71106, 30038, -123579, -26815, -57433, 10781, 26526, 64693, -129351, -97011, -61409, 33332, 59453, -31235, 12645, 101880, 57839, 93024, 79274, -52737, -104914, 52395, -6965, -81631, -26841, 122842, -87988, -7747, -28304, 126940, -31595, -109863, -78774, 40710, -46736, -90080, 115433, 37367, 15359, -23165, -73994, 34121, 69190, -72191, -22690, -88871, -94127, -32951, -85166, -84153, -35761, 22452, 89238, -37848, -48306, -44839, 14710, -61062, -106478, -25499, 103586, 94419, 65810, 89058, 72910, -52029, -58108, -37128, 130162, 19905, -112155, -12259, 57534, -130978, -71832, -40452, 27722, 48704, 114066, -26256, 85781, -127438, -78180, -2392, 123275, 7102, 7022, 92128, 35298, -52899, -98708, -83319, -51002, -127379, 106842, 42879, 62731, 66444, 117612, 97183, -41063, 82675, 38398, 24610, -25191, -29382, -60726, 125619, 81021, 115096, -84592, 73600, 59558, -38156, 20844, -119581, 340, -57750], +[122411, -114569, 126096, -15602, 60730, -85979, -92801, -96588, -90323, 39522, 9459, 48319, -114916, 32791, 59968, -89000, 124900, 35073, -80370, -73021, 24611, -74589, 116890, -33323, -14809, -58861, -125643, -44731, -129438, -7366, 119668, 101643, 64609, -120990, -33614, 79023, -91323, -90462, -100252, -57813, 6004, 112588, 20037, 54577, 62678, 93511, -21762, -124725, 61395, -122196, 94969, 37688, 27282, -14783, -57852, -71925, -44117, 124094, -105847, 75316, -3937, 35078, -44595, -5747, 76258, 87882, 5521, 7663, 6797, 21124, 93119, -10423, -32264, -20185, -116578, -119739, 63057, 122912, 40144, 59456, 56594, -12373, -40130, -82372, 87051, 111501, -63061, 118157, 16472, -24594, 59752, -53475, 56851, 95985, 121059, 124008, -116081, 18883, 104459, 70625, -61607, 6464, 99142, -68596, 45740, 108031, -65081, -91226, 3004, -30272, -53579, 110013, -10063, -128425, -38586, 42192, 39545, 27012, -34420, -130914, 48699, -87204, 105143, 8338, 125621, 121403, -62760, 52997, -41503, 17569, 45632, 130993, 3132, 94170, 89822, 12702, -72600, 21138, -24659, 73305, -28141, 9448, 68852, 47693, 80768, 22248, 10554, 106646, -39000, -48603, 116701, 3750, -28211, 93785, -116828, -23498, -54883, 54990, -63985, 101640, -66816, -37313, 23240, -37830, -78828, -26075, 76827, 86266, 93699, -40739, 57936, 109060, -73308, -9497, -93448, -56881, -78452, 56550, 74770, 23872, 54166, -52888, -99928, -101675, -30155, 53924, -107863, -91500, 5396, 34511, -87918, 116189, -112315, 56800, -130865, 81138, 126533, -108972, -64582, -63615, 39657, 52832, 96420, 40772, 43033, 77095, 54316, -96895, -43870, -85837, 99480, 42305, 38763, -27318, -30415, 111819, 114338, 92318, 71168, 84657, 53016, -31403, -74248, 111599, -100057, 88605, -126472, -49012, -36676, -97133, 7588, -44240, -47052, 8465, -31708, -21488, 12844, 82893, 43298, -89192, -13858, 66269, -129843, 42600, -72772, -65450, -79470, -85562, -57290, 104702, -79639, 65521, 37485, 65186, 121394, -83867]] +NTT(y): [[3035491, 2809772, 6725498, 567655, 5447090, 6430497, 588219, 6597274, 7259775, 1642189, 5313552, 2601666, 2944974, 6295297, 3581905, 6874192, 210561, 5960622, 8253565, 1195910, 881601, 4493663, 2179253, 4108348, 2194037, 3996638, 1092261, 6030678, 7838006, 7178403, 7282500, 584553, 1196877, 6707165, 3199084, 341095, 2044660, 7260281, 7420712, 3935267, 5121238, 5061590, 4626576, 6810977, 4897094, 4376922, 2750335, 2672078, 4726553, 3835189, 7154356, 6007954, 348031, 8134029, 1086976, 1982084, 7887771, 7603668, 1137358, 2661850, 7083102, 5369091, 5136523, 2967271, 1090697, 1184083, 854006, 3047869, 4419322, 7632282, 1167593, 1602068, 5018103, 4849750, 1454288, 2691760, 1839621, 3047899, 6110858, 2913054, 1579439, 5043108, 2139766, 3158238, 875297, 4132116, 866980, 6627278, 4157724, 5458883, 2927175, 599965, 5480327, 1909569, 3517404, 1026413, 6227609, 4232653, 2602036, 6395209, 3269477, 3530197, 4957058, 1966457, 2010565, 8082568, 8356231, 5794772, 211493, 3943577, 3005661, 2208475, 2128484, 7280590, 4006397, 945258, 4386251, 4270003, 4562849, 4419605, 4085646, 1669095, 5338362, 6956914, 8088896, 2570387, 5809058, 3752494, 1528102, 8106951, 5281806, 1355547, 5718434, 647305, 3174723, 6294224, 6933676, 1820988, 5246163, 2993621, 7329355, 7635290, 4674588, 6794689, 1558704, 13104, 4121732, 70093, 3501674, 1710767, 904290, 5208425, 2010454, 4145847, 2139346, 3989361, 4896166, 5247669, 4844193, 4114924, 5978018, 2410798, 1287242, 1207752, 5599430, 1089814, 1328558, 2940340, 1825295, 6570469, 6499124, 4467027, 2388572, 1411007, 6084438, 4491391, 5830304, 1062451, 8160682, 5678304, 1537916, 6474149, 4327172, 2051369, 6153936, 3901731, 2262951, 4390798, 2300164, 1383317, 7253257, 2623464, 2264376, 3077163, 8031165, 213399, 7916711, 7842821, 4759366, 1218096, 3085194, 7688597, 2187444, 5973181, 426078, 4729405, 8226232, 7314396, 6955759, 3279731, 1027695, 812647, 8082499, 4609741, 6331955, 3230751, 1167788, 3865767, 563670, 3659339, 3426433, 2023447, 935587, 4310876, 3726513, 5038520, 598057, 3073178, 4581131, 6079904, 1641703, 8243976, 5950162, 2792072, 3029808, 5979230, 3124170, 680394, 6496266, 6795290, 8212648, 4230877, 7439539, 6670916, 7370223, 6232007, 81198, 7359779, 497921, 914519, 8230522, 2866914, 5483100, 2743711, 4173558, 1558382], +[1186428, 6627972, 5529664, 451697, 4448725, 4380951, 4173214, 3118588, 751528, 5748926, 6051368, 6781590, 953583, 8107394, 4197755, 1182276, 4062055, 2844100, 4363510, 3537638, 7543431, 1154558, 7117352, 2928636, 340752, 5847159, 709604, 1958223, 6502642, 5101909, 4425065, 6701502, 1079336, 2780009, 6486851, 5758804, 1345857, 4680259, 7377673, 7079910, 8193795, 727997, 6958211, 2862172, 2062715, 4429197, 5325071, 1733463, 1108995, 4943919, 7747091, 990058, 902401, 3260334, 3363612, 7694830, 679499, 5310055, 5904218, 4806363, 7333096, 221478, 2806330, 8190863, 5710816, 4335744, 6500470, 2115308, 1393603, 6701043, 1588719, 3521351, 6458609, 4530635, 6516460, 3383605, 7559248, 1774539, 7728592, 6132157, 2956918, 6536279, 2734523, 4997618, 985787, 4231548, 1738454, 747701, 1155399, 4629772, 1475765, 4213724, 4845566, 5354329, 8032064, 4632720, 4441462, 6863017, 4787851, 964021, 4504684, 6866409, 4983737, 8359426, 5860364, 7478991, 8341865, 4810079, 8141702, 7412131, 4356415, 6547825, 2080710, 2368070, 3289870, 5107999, 7890593, 3122266, 4937805, 1076767, 7040752, 5079734, 7470440, 1419176, 345820, 3859741, 2540625, 2166710, 3228053, 3871975, 6755666, 5932198, 7224849, 2006338, 3210489, 1573913, 2568058, 4548329, 214869, 1103487, 3332879, 2468670, 1901605, 7174020, 393843, 3095332, 3535521, 2438148, 1423335, 6601750, 6941722, 3660793, 2626552, 5520040, 3660544, 5647052, 1341814, 7573841, 5066044, 5372362, 7617898, 148220, 2108992, 2004430, 4405087, 7886688, 1627991, 4277625, 2953282, 519976, 3551293, 8177786, 1276523, 4597072, 6010558, 6015388, 5347706, 7523477, 3537809, 717282, 5879927, 2788403, 455822, 5881677, 2561966, 753112, 8076977, 1988529, 1109214, 8196384, 1096562, 991709, 463804, 1927501, 3735951, 1026548, 7611719, 2136647, 2348029, 3172069, 5809044, 7262133, 898002, 5921424, 8106193, 8226403, 2477200, 2896605, 6584820, 6593986, 1301298, 2355873, 3066108, 4424181, 297139, 7566634, 7822153, 6650268, 3841265, 7366836, 7367794, 3760305, 2834009, 944853, 3901382, 1446180, 7497169, 5460515, 2640353, 2878491, 6846218, 1567819, 7676730, 5476190, 1555358, 2662344, 4619935, 6022235, 6505176, 3325224, 4623238, 4399675, 7218765, 2349030, 5720788, 4763781, 1489403, 1162115, 1227458, 813570, 2238408, 2521134, 3086205, 6252868, 1662500, 5608584], +[3532585, 4924697, 1037304, 5507705, 7307075, 5989549, 8042933, 4279280, 4889520, 6020792, 857658, 7123262, 1696421, 841316, 2868754, 3895707, 5482347, 5322601, 7095490, 3804561, 4044827, 6035382, 2571766, 454103, 5899706, 5248583, 3497922, 3638435, 143152, 6312332, 5499213, 2025225, 5230663, 1961606, 38840, 4242261, 4004302, 5511156, 378626, 5745487, 2961599, 2248011, 4901933, 6029015, 4937870, 2215203, 3126148, 2769955, 1264534, 7905685, 327699, 7246859, 103040, 6637822, 4085095, 5350814, 531307, 4824778, 4238336, 4244879, 3633694, 5752997, 460370, 2218437, 1004732, 1657055, 4011241, 1164249, 215033, 2650120, 5194959, 8265348, 6396364, 2031504, 2681719, 2182102, 2174199, 7488410, 4532501, 2055341, 4249520, 6076267, 5165307, 3662882, 4132357, 4863570, 3076958, 2984697, 2801869, 3069179, 3667363, 3329341, 8283693, 7055793, 1891849, 4324657, 4897215, 7468131, 299786, 2005399, 6115735, 4712155, 839472, 7825892, 4196326, 2747995, 4858737, 5601880, 2293286, 8313998, 5199306, 2077038, 6124206, 2987288, 2966861, 1501015, 8119888, 1136756, 4819387, 4355689, 3761462, 499210, 4378829, 7588660, 7290266, 714165, 5849734, 3690213, 6880398, 237848, 5727381, 4117525, 773171, 2413313, 5020905, 6703198, 6318945, 664006, 2872545, 714742, 4794129, 3633410, 5118658, 2498733, 3651486, 6990869, 8230526, 5174087, 7356770, 2865328, 2795458, 3475629, 6253142, 6964594, 8278271, 5788631, 7917145, 3087008, 6142460, 5409656, 5825662, 7201245, 6364687, 28816, 1655525, 5270058, 4642936, 1678684, 6145296, 767970, 1634478, 1552348, 5566381, 6169119, 7038360, 3221426, 7094291, 1471319, 963147, 2063646, 152148, 308353, 8088201, 1079218, 1057501, 2747600, 403988, 6802177, 8228760, 1289765, 3542201, 5643496, 7980412, 4970687, 6018355, 4573903, 2169739, 2946451, 3946746, 4368230, 4666137, 481624, 2556853, 6576219, 46909, 4431750, 4002959, 410576, 1788765, 5597858, 5423557, 1403200, 7349202, 2275788, 1276147, 773033, 2513159, 2004915, 214260, 4374722, 526123, 4188339, 3114883, 1328813, 5047910, 5572936, 4643247, 2066107, 6131640, 4237385, 6458333, 1997664, 4912938, 4626838, 1443165, 4584426, 292127, 176806, 5956217, 7141764, 6176493, 2415920, 6221542, 5649897, 6181328, 2925818, 3137989, 840758, 5847081, 6738030, 8197003, 4190326, 1423942, 1024945, 3301171, 3499349], +[5891005, 3311385, 5414291, 4580860, 8340878, 5520282, 6364105, 7045576, 7815361, 810465, 7786775, 3706582, 6136129, 7748501, 1457512, 4498603, 7106653, 243797, 2818566, 816755, 8302875, 4810815, 6125676, 5567150, 5964403, 3625608, 2019205, 6298905, 5032809, 2019195, 976665, 5330626, 2420594, 3758067, 6733315, 1608452, 975406, 5510281, 7380414, 4431628, 2148731, 1707207, 5734022, 682449, 952513, 3945624, 6716646, 7348349, 1201981, 6902469, 5666693, 7113213, 3340395, 4285601, 4876080, 5080783, 103190, 4144036, 3201701, 3200875, 7533310, 715350, 3016238, 6491432, 1123396, 5079984, 7895729, 851142, 5176317, 1574433, 481528, 5147083, 1791107, 3814674, 3579569, 5443528, 3396608, 2664502, 3433834, 734274, 4217783, 4702440, 2718732, 5636240, 237289, 5783614, 7422803, 7097033, 1568524, 5418410, 6937331, 6610899, 4685873, 4744237, 7101943, 1955636, 5861030, 7253191, 3572227, 866250, 5922315, 8195855, 7242390, 7289975, 1243704, 5654169, 2499933, 2356997, 3942148, 287943, 7859341, 4643101, 7674222, 5335087, 7583992, 3996034, 6226290, 291681, 2466232, 7646282, 6047382, 2908814, 6063989, 5526057, 6115355, 6047948, 8266395, 2243064, 2566782, 971652, 7737369, 4844537, 3502238, 1111823, 7918408, 4148491, 6769860, 2554509, 2859262, 4120331, 1989962, 5699314, 6989194, 5485555, 1065194, 7698853, 1261568, 7397883, 8018059, 5945222, 7227970, 6638104, 3321887, 1077587, 4406450, 8029576, 7566551, 7724532, 2538758, 8306253, 2759844, 7930605, 4047373, 7129444, 3676126, 598887, 5695342, 4493941, 2678329, 5287927, 3471328, 6963634, 7465123, 3080530, 6424299, 7240826, 7557922, 2368265, 6160843, 6727952, 5882428, 5080113, 8145844, 440735, 1586851, 3706333, 2003924, 1692805, 6845500, 6129838, 2619952, 4170360, 7265826, 6552758, 8033101, 5121074, 1473226, 7057214, 5708279, 4037448, 3845540, 235103, 6494050, 540806, 2758593, 4402960, 6687811, 2634722, 1760459, 7525752, 8220701, 7299236, 4529060, 904271, 7627019, 5535973, 2361150, 2385128, 6689069, 2127271, 7002540, 4581157, 338422, 6185989, 4147871, 7566363, 4221355, 6669416, 7969626, 5422290, 2427966, 2275389, 255698, 3474631, 2289293, 2835534, 496895, 500128, 7194693, 6004505, 6634286, 7464498, 5705044, 2788095, 5336596, 6815260, 370576, 7973586, 4358652, 44895, 6918964, 5226649, 5701209, 7848187, 6306965, 1779202]] +aHat * NTT(y): [[6144420, 4965121, 7555555, 3905658, 6043149, 7189003, 8075652, 2203037, 2783350, 3674236, 2430017, 5393384, 4941164, 4296081, 6148283, 7660585, 2308491, 1400256, 5671721, 3907686, 5929147, 1265500, 3022283, 1128849, 15574, 1164226, 7675964, 7558208, 3796492, 1639674, 6566290, 314927, 4898735, 581906, 7454937, 3852529, 3924068, 348752, 4848573, 3055577, 7606360, 5403547, 300170, 4424597, 6359459, 5663745, 4166932, 7643757, 2658231, 7396270, 3515068, 6668595, 6816951, 1341650, 4326698, 5564663, 1551431, 540782, 7485380, 4301755, 7992433, 1982296, 5421315, 4601611, 1833982, 1233808, 451588, 6988939, 2623962, 725611, 1854355, 2299692, 8157936, 4660457, 1970445, 4882334, 1443783, 3442510, 5224830, 5740279, 2946669, 4274368, 1147247, 6032402, 344604, 6479211, 6386428, 6248897, 1114601, 1819988, 6627179, 7751680, 3368594, 3215054, 2934481, 8152614, 2127743, 6144216, 99341, 628249, 8185372, 4886275, 796140, 5659210, 7415036, 2166062, 6183401, 7168789, 1359981, 4034680, 3106993, 2687128, 4003063, 2830728, 2350180, 571473, 8076459, 7748540, 7779703, 4991982, 3704813, 4850252, 4730293, 2369138, 2195049, 3209146, 855317, 2293644, 1338310, 7730177, 5464760, 7470852, 6016224, 7824305, 8366169, 6185769, 2722279, 4360138, 3451312, 3121272, 1268389, 5342663, 7216470, 6790051, 5017975, 2871315, 486414, 3953334, 3338544, 380084, 881141, 1851686, 4299945, 2134416, 3936945, 2503968, 6908224, 1663979, 1675835, 7517557, 6186323, 565056, 4401910, 2164127, 393499, 4404266, 7991691, 4656990, 1120793, 7509848, 4117686, 271242, 1180957, 7773347, 4448666, 4650398, 8309537, 7543726, 7829590, 3909950, 5371264, 7541323, 3986488, 5523577, 7213719, 741439, 5468872, 5309732, 8039561, 448734, 2777779, 5602961, 3737664, 1512454, 157720, 8295211, 405669, 3071257, 650, 7329231, 7954557, 5088275, 8032917, 4428814, 2085589, 2088772, 6167589, 825826, 7315436, 6584515, 7778454, 6768870, 5115996, 4782261, 3478380, 2784376, 1299269, 5001761, 8371846, 2777149, 2884961, 824294, 204593, 5179108, 3273007, 1261457, 7006787, 7575163, 14721, 7531729, 859014, 2436426, 2605367, 980875, 71276, 557077, 120143, 6055730, 3055587, 1793017, 2909122, 6325769, 2611222, 3649877, 2495215, 3770115, 6269765, 3606572, 8207745, 8138614, 8063635, 5091973, 2111348, 7874593, 7039022, 6481524], +[3947975, 3650816, 8224516, 4685363, 3926342, 144489, 3132631, 907258, 6824604, 5556910, 2181192, 7208281, 4569563, 3179171, 1144616, 5741696, 1144035, 2523799, 8272894, 2323568, 5864400, 3244188, 3562273, 4572556, 1022028, 1467052, 41081, 894542, 6469379, 7086834, 2176087, 6344160, 4022893, 1913962, 2696802, 1459627, 132084, 7007601, 55223, 7554631, 988780, 7357688, 5628763, 6642524, 5826819, 6545530, 2200921, 2490576, 7048699, 3376723, 5881507, 7298653, 1255811, 2738046, 8129762, 7867716, 283783, 5514833, 3805389, 1996005, 7690544, 3508467, 620365, 5637038, 5458888, 185771, 8060501, 6291936, 3242249, 4459777, 557195, 2157124, 5718782, 6428901, 4469254, 3293491, 985541, 61658, 4127942, 4052645, 4142148, 866955, 6777963, 3153490, 7436271, 510136, 839901, 2183176, 1153488, 6176648, 451796, 7624929, 1094930, 1603053, 4172505, 1063600, 8259582, 8076657, 1486014, 7647992, 510183, 6499016, 1846712, 7804670, 3384284, 8275666, 6045428, 4313344, 7500522, 1205838, 2268614, 3188138, 2612853, 4757274, 1641117, 6273478, 995035, 4619824, 3062443, 3695369, 7267191, 3531437, 4710051, 1653184, 7346596, 1126347, 6607472, 6508013, 1720404, 100952, 7677762, 1901980, 2760797, 5846552, 3393042, 8189903, 7206498, 3475375, 3385805, 3506385, 1699627, 3871056, 2608573, 1190124, 7647731, 6894498, 2378975, 3357422, 3938034, 2069827, 4380269, 5925381, 5598651, 4885937, 5999117, 5223472, 2935863, 4995790, 3880280, 3546077, 2923648, 6569017, 1401455, 2973515, 1615696, 6653790, 7527312, 3223135, 7106953, 2442200, 7042884, 4367635, 1244854, 666729, 6524190, 8028384, 3714276, 6497549, 6415516, 7569317, 5664663, 7745839, 8324536, 2825480, 3517759, 1668621, 2004808, 2622296, 2228499, 1929246, 4188292, 3552273, 3354408, 3827261, 3774273, 2836523, 536696, 1873342, 7988891, 6841248, 5463779, 686049, 5943232, 3597105, 1883062, 6805400, 6700947, 92882, 31170, 6125691, 6873468, 8278182, 873415, 1025455, 8273319, 600210, 1587489, 2887871, 4728168, 7036479, 3831053, 4423762, 1565569, 7320093, 1275642, 3740975, 2163037, 1303858, 851893, 1301074, 296537, 4468289, 5094679, 6475677, 3811666, 1782112, 4215996, 6790489, 4130640, 2021317, 4720185, 8275286, 5753530, 6899040, 6636577, 4649704, 7886024, 6139880, 3571420, 8282842, 3952531, 5715365, 1523969, 4505545, 2890084, 4222129], +[4570944, 627762, 5756578, 4675500, 836083, 5598067, 5641604, 5537951, 5805924, 1180617, 3380506, 4345096, 5582818, 5533245, 1968659, 8240317, 2532568, 7335666, 7945304, 7978282, 4616187, 3061046, 2712855, 4608004, 2681085, 2056060, 1801107, 5128910, 8000612, 5688850, 6552442, 7247218, 4353989, 6051239, 2692834, 4802529, 3164722, 1973968, 6366851, 3731886, 7145245, 4516578, 7260135, 1690730, 1700738, 7993719, 804203, 8029909, 200474, 7965198, 4221508, 6821145, 1323870, 113300, 4733572, 1026605, 5321971, 499110, 3312489, 7139535, 4958106, 4625429, 7070047, 8319687, 1647355, 766455, 1846406, 4205959, 8075298, 2436673, 1418847, 7050505, 172174, 2365149, 2954817, 6471927, 3596052, 7555999, 3804777, 3125547, 915858, 6699085, 5984823, 1858429, 4189270, 4404735, 5948771, 5290284, 7926977, 5679163, 6744374, 350144, 3562322, 5537559, 8223626, 6595059, 7967900, 7929629, 2087354, 4138378, 7636601, 6259389, 1369221, 6355274, 756706, 2064399, 967974, 6447546, 3898200, 4651793, 884980, 7429573, 7340202, 4820978, 5097385, 4183687, 7485604, 2829566, 3093243, 3572296, 5594967, 6531945, 3392829, 991867, 11573, 3021116, 2919034, 6791926, 7503706, 6269270, 1393283, 5779945, 164587, 3505816, 6896881, 8293297, 6812157, 4206214, 7871361, 4480185, 3455661, 5654216, 4831123, 991252, 7004055, 7210886, 2095980, 4210739, 2348701, 7656589, 123266, 4266129, 3314451, 7286551, 3706932, 7867497, 2772532, 1305616, 2012689, 3273243, 4984569, 6444891, 3546365, 5506524, 3646517, 3865927, 3905141, 4579125, 241007, 1570397, 7169116, 581826, 7019705, 2850948, 8242711, 3010541, 4704324, 3963785, 8326805, 3933513, 1130326, 7867965, 5042410, 23871, 2995453, 6739510, 6881295, 4147580, 3726590, 386182, 2537051, 5698969, 6851252, 3767974, 4070165, 2197919, 5549993, 4415628, 6423687, 5429488, 4395092, 2065201, 1794319, 5622673, 7330693, 4833506, 7807042, 1870577, 7095671, 1625448, 3472119, 5038899, 6363099, 688035, 7241718, 5281658, 4545501, 1049449, 6682919, 4591705, 126023, 5903644, 7648773, 6187702, 4688194, 6035745, 1561501, 4609456, 6335178, 6617021, 4019700, 7393149, 7194227, 313757, 3848218, 8213043, 5002759, 6378495, 2811995, 3827767, 1025553, 608629, 8056934, 7048341, 2639595, 5618354, 7503502, 246109, 8071170, 4008640, 1510836, 7345818, 3702509, 1178137, 5020726, 1820487], +[2205174, 538673, 4505981, 4879551, 3213359, 1731252, 2120126, 3363074, 3771584, 5588762, 3902236, 1437007, 3268368, 897382, 6649813, 3210041, 351148, 6592297, 4212276, 1005098, 3459024, 7855081, 7032803, 4750968, 6430120, 3682124, 3727167, 890141, 6624637, 400159, 4228128, 3871817, 8011526, 2433991, 3037410, 7233474, 3962901, 6502125, 7957349, 4705974, 4740839, 4068487, 7914692, 3699814, 4066579, 3173264, 4017653, 4810135, 2094032, 225324, 6149661, 7165303, 734629, 8041992, 6489448, 7061802, 2799764, 7762477, 2894929, 2191960, 3222249, 7304958, 4351445, 5432323, 3997703, 80702, 1075732, 496345, 2645373, 6820097, 6913852, 3993012, 8007951, 2563581, 1693771, 8200416, 458651, 5419813, 3597061, 6790550, 7339074, 234504, 5560353, 3050910, 1185979, 2605314, 1180746, 1798391, 3593636, 5173162, 6281181, 1182754, 5016379, 450691, 8024469, 7762498, 2205599, 3483821, 6930547, 7326380, 6810970, 8067605, 2478599, 4534959, 5891850, 600441, 2268927, 5145227, 545218, 6450654, 7213028, 3352652, 5707265, 588505, 3354456, 1758005, 5279556, 6200112, 4039927, 5907345, 3069003, 5155988, 2257290, 7191346, 513589, 3455145, 885448, 3870692, 7412993, 5483216, 8031921, 4014093, 4841709, 3396175, 6809928, 540164, 2445690, 2318892, 985485, 475894, 3815467, 536926, 4242755, 2784068, 6555693, 4576224, 4016466, 2817427, 3562332, 6022546, 7216865, 7155797, 4896800, 6751918, 2912303, 3277582, 1310533, 4193506, 3583491, 3998810, 7111218, 149592, 2446193, 581958, 1398532, 561090, 917554, 4385178, 1776428, 2519051, 1907924, 7377719, 401818, 4440775, 5710435, 6409701, 6651631, 101552, 6674846, 1362754, 1570673, 6435295, 3840327, 3862566, 4191641, 4597739, 4225687, 8295919, 8013003, 3891838, 1808926, 7787062, 3219884, 6688174, 5463439, 5768522, 3286331, 1820458, 2314900, 4683951, 3937807, 4511389, 873091, 1005883, 4751537, 3020090, 3003985, 4038293, 6762138, 7761381, 4402757, 4194383, 4840763, 6658645, 6212284, 7662689, 6725697, 6222829, 3097939, 6066291, 867603, 6686851, 970079, 5381986, 2679161, 1475933, 1590741, 6334900, 8324748, 1230532, 6273253, 5160248, 4864214, 6451636, 2048475, 1048874, 4796820, 4319916, 121111, 5257718, 1031109, 3053068, 8199966, 8059189, 6438752, 5710720, 2328081, 7570864, 4501089, 2671987, 7129359, 6561998, 3371191, 3745249, 8026340, 1698312]] +w = NTTInverse(aHat * NTT(y)): [[4968407, 4718179, 462388, 1119871, 7817329, 3820487, 6327751, 947481, 6639094, 4489022, 8186388, 1912045, 4956263, 7739800, 7404478, 8379826, 6526201, 7074363, 147018, 6952946, 3810768, 902435, 2775266, 8296885, 8051764, 3503130, 5595609, 6009587, 5926137, 4615793, 1905308, 7592716, 3334031, 2416622, 3332599, 6060453, 2063166, 4166850, 7668372, 8279294, 4129102, 2637835, 4581014, 2641700, 4802458, 6272159, 7471382, 1331727, 7108704, 896577, 8144022, 1637019, 6049888, 5089185, 7135655, 6202969, 6642720, 7096641, 6949927, 4687866, 4885849, 205023, 2397822, 3773483, 6111363, 6802280, 7348888, 4460760, 109243, 3411852, 3890924, 2509281, 3441374, 6262583, 2222397, 2289879, 2075549, 1068443, 4816229, 884304, 2750057, 8127817, 4331398, 7959205, 4598115, 6521412, 7951783, 5153698, 7702003, 1185204, 8293833, 6757742, 5016210, 3526979, 2234260, 2757883, 4335009, 736029, 5229885, 6576540, 3778864, 6555783, 2588363, 27210, 7556893, 1316724, 5398479, 6786820, 5230203, 1126613, 8001284, 4382863, 744569, 5163386, 1971936, 807725, 1485084, 2918309, 3900433, 5996273, 1708259, 7456238, 5598718, 2190102, 6309214, 2442543, 2677703, 2729639, 379218, 488601, 2602470, 2504541, 8024695, 6578005, 415191, 7767667, 6168890, 7277026, 5630201, 6681978, 5813748, 5757346, 2291932, 6661532, 794880, 3078399, 121392, 6534939, 2918276, 441979, 3305227, 279035, 4535496, 6579245, 15012, 7428585, 7857467, 478553, 7630954, 4951768, 7436814, 7352666, 2788218, 507218, 3683945, 2257427, 39409, 2043676, 1652461, 4980483, 6269058, 4864680, 7684174, 5956878, 6745341, 7101225, 2356962, 5965385, 3499547, 3793402, 6779465, 5642537, 4772159, 5557066, 568502, 6249119, 407401, 7422643, 7296053, 2649263, 4894235, 5091122, 8241978, 2447280, 3659063, 2327933, 7017258, 3390164, 3554977, 5046435, 7855288, 2716298, 7470131, 8008490, 5971511, 3326059, 6615790, 6674938, 3971260, 2014564, 4457632, 6131577, 7567201, 2605656, 190061, 7420735, 3082400, 2204091, 7861956, 7179538, 5237500, 5034335, 5932748, 327340, 7214685, 1756388, 16316, 700202, 3071802, 4442605, 5333405, 2181761, 23180, 2749222, 4096557, 2656849, 4543861, 1336518, 4808334, 987034, 5117638, 6094840, 7172274, 6111208, 765447, 6263622, 879114, 113155, 144961, 2726877, 5166020, 5132711, 5782039, 7523653, 1503501, 4256400], +[3630454, 5624929, 2246792, 132343, 4322521, 4071699, 2673323, 4672357, 5664089, 578958, 6719380, 5325833, 3539196, 1512492, 8373427, 51420, 3989611, 8346944, 3406196, 6155063, 2144545, 944604, 7793352, 789926, 4642606, 574413, 4946472, 3383709, 3644025, 486333, 7438080, 7269381, 321699, 2588519, 2309143, 3556680, 4428265, 7422358, 7664689, 6491501, 5397625, 2136041, 1486729, 1024553, 3950595, 6681802, 7706605, 7765879, 4204000, 5078361, 3816485, 5457372, 3298466, 3317377, 3335756, 5715900, 6708640, 5571500, 7508550, 8354784, 1732969, 7025820, 4728402, 2838541, 29951, 429152, 6404211, 7902778, 1669851, 3363533, 2004848, 8044611, 6403488, 3016324, 819416, 1405027, 6511692, 444103, 5325225, 3079964, 2594167, 4071130, 356962, 5234311, 506202, 2553068, 1040589, 106871, 2831009, 6962910, 3332245, 7212619, 3152689, 5308286, 2627332, 863217, 4644074, 5028687, 8325780, 5051073, 1857897, 6272733, 5688634, 262357, 6332957, 5908514, 916233, 1189291, 3256723, 1370162, 4954320, 2415413, 7875540, 2284601, 6697891, 8194218, 7294765, 8168715, 3315323, 6399350, 2069260, 5396844, 7336286, 533705, 7585070, 4837931, 6966559, 5958739, 1807459, 1249264, 5341091, 4288214, 1234974, 7962245, 2009060, 1776184, 4555331, 1907546, 8334724, 4425483, 5564729, 3327608, 3084261, 5937768, 5564071, 584252, 5269487, 1750351, 5598541, 6822441, 1740984, 1697629, 3624617, 5623581, 3555451, 8340627, 8278479, 4394781, 2597538, 4472313, 2783339, 5392662, 6699440, 8099727, 3135730, 2398074, 637582, 7991479, 6427221, 6186397, 2035827, 7937249, 1643380, 5458435, 6168496, 7421666, 2823784, 4285013, 4669894, 6371450, 6050362, 5649400, 558957, 3746448, 1235144, 4424498, 4919285, 534884, 7981366, 2627223, 3495882, 6891545, 2207363, 7943290, 2359980, 7584958, 2698527, 7026683, 5585435, 3142264, 5433972, 6819046, 3242318, 3956818, 3661236, 2834572, 5221600, 111497, 345606, 192549, 1643098, 7870009, 759212, 4199263, 6129962, 6656772, 6398707, 3690547, 2409225, 1438328, 317304, 1884264, 4214305, 2612252, 2597576, 7643526, 6697677, 7943004, 3581394, 7291811, 4310811, 8093282, 163985, 1438926, 5377877, 4268579, 3106997, 4926758, 7481124, 3224126, 1528600, 3682459, 1710650, 6644715, 1143466, 3530902, 7193072, 8174802, 7643783, 588600, 3876542, 5660563, 5676603, 7004470, 2280079, 6024116], +[4180087, 6172391, 4813829, 1863491, 1606438, 784736, 7811099, 2734334, 1234685, 3971486, 6958897, 3641168, 448494, 7052068, 206469, 5585204, 2415087, 2675390, 323449, 4812098, 1859679, 5585323, 8067457, 2959351, 4066618, 6715414, 8071856, 4011977, 7844390, 3177058, 5053684, 1933299, 2403140, 7725993, 499498, 6226332, 580758, 7903604, 3159787, 5055403, 2143472, 1951472, 2575429, 5016299, 6210534, 6502559, 6939489, 7100917, 2683687, 3396853, 5091342, 260862, 3952244, 1505965, 1803657, 3797827, 3725486, 5669827, 5110704, 3726284, 698539, 4377123, 3888079, 3205234, 5644526, 7186943, 7085661, 6204976, 6618073, 6955049, 2122710, 5153575, 6497066, 8143271, 73518, 558108, 8306592, 4304165, 952478, 2645198, 3658648, 6013900, 2902512, 4724108, 960088, 5017625, 6351715, 2284771, 3633997, 2413145, 6398754, 1940314, 6473421, 4895173, 4254736, 5444428, 6564640, 6812551, 4429448, 5198720, 6874410, 4307863, 361940, 467150, 4277413, 885912, 3584721, 6307686, 3884466, 2049991, 4389540, 5758628, 2513921, 4258715, 2869576, 3990815, 7974986, 7048958, 6768331, 5054584, 4113099, 3072206, 4396882, 6990763, 7124166, 4083231, 7560468, 3607783, 448388, 6219800, 7317615, 1495118, 3898044, 110256, 2181675, 1255423, 7438811, 7809168, 6669353, 848130, 8115304, 2631358, 30825, 7690712, 2128623, 3022619, 3361293, 7796729, 24269, 5836051, 2734689, 1073196, 4624444, 7761512, 1075386, 6572825, 1706321, 4382934, 4724836, 7417054, 2876166, 3224712, 448617, 5527061, 2628729, 4493272, 3566878, 7746119, 214331, 5019567, 7950591, 1496469, 2013536, 4303698, 5415443, 2174532, 7007146, 6484046, 6318994, 6795487, 3326071, 3198765, 8298074, 7198711, 403536, 3203384, 4506023, 1724541, 2417442, 4068779, 5951630, 5654448, 2783699, 7267888, 3221889, 4322694, 1057056, 4371565, 862689, 2550451, 3724192, 7319727, 6406340, 3230227, 1588857, 861310, 3727911, 8303618, 4908298, 425696, 1026890, 1429452, 7864873, 6143945, 2328414, 1756984, 6167048, 4221885, 4552975, 2637999, 8201361, 3665288, 6356199, 3941571, 2778702, 7058689, 2364639, 33650, 3407044, 1008590, 2307268, 4375186, 5268232, 7670393, 7788582, 472781, 5618276, 5887344, 598201, 3934827, 1290555, 1986890, 7463628, 925557, 4874502, 3754096, 66648, 4238371, 6266958, 4361685, 6193969, 7732858, 651418, 2940170, 1231832, 7801741], +[3075011, 1782742, 3609275, 2285451, 5721724, 1975868, 4541321, 7349816, 1822499, 3892614, 2365141, 6626613, 7806763, 5523919, 1101957, 5963548, 2099901, 3623760, 7831180, 4648423, 4211469, 2294986, 3122816, 886992, 4573745, 8301168, 1003444, 8051681, 314657, 3898698, 434286, 1884814, 6119560, 972263, 5709488, 3888085, 385449, 380739, 3755972, 768755, 1875541, 7052100, 2709322, 4480669, 1157820, 1215448, 5020129, 6855192, 5212720, 2897196, 3366899, 2993743, 2453776, 2594240, 1668921, 5645045, 598284, 8175729, 1253407, 5978821, 3862284, 7975744, 6884593, 8293934, 6244988, 5853009, 3167933, 3611929, 1133566, 2786599, 1676146, 8059644, 437216, 7308278, 4819552, 8148630, 5416032, 2338597, 2986314, 905216, 5673752, 7127159, 4822579, 7085650, 6280528, 1207743, 4528461, 5726786, 8153370, 3421914, 3327357, 3569859, 273847, 3866036, 1201903, 5577110, 7884111, 7433383, 653228, 6567466, 728280, 3392644, 5883727, 4378605, 5002448, 521376, 7912530, 275877, 6926988, 3091461, 1364420, 236271, 259347, 2723176, 2283990, 5631848, 6042967, 8026943, 5275287, 7766801, 5298299, 450130, 6426796, 5651571, 7464239, 6776815, 4554714, 3456485, 2085743, 5021084, 3438590, 5557582, 1973615, 4914588, 7595663, 1913661, 858364, 6708223, 7830146, 5310470, 3604404, 1134161, 6075319, 3447750, 5596936, 6539051, 560681, 6482693, 3659898, 5149231, 5284969, 2482926, 7539867, 492230, 5606235, 4580197, 5597209, 6143315, 4469448, 4155788, 981312, 5910089, 6340518, 6109119, 94297, 6849152, 6450933, 4586280, 7996231, 2307069, 7209930, 7334461, 7926304, 3257024, 2349204, 831739, 7783733, 1230612, 6489055, 5840195, 702176, 369699, 6947689, 1184325, 1615942, 7042308, 5262490, 1266210, 6018643, 2418399, 6633493, 8261126, 3566734, 5718528, 7818325, 3380321, 7355400, 2484649, 2374021, 3519122, 1304322, 1725684, 3816436, 1824747, 1471619, 5297331, 5038676, 500326, 1885922, 3258971, 7033368, 5936768, 7694128, 5019629, 3438879, 6484238, 4208724, 1894219, 2850965, 6446660, 6774972, 1697917, 6097365, 7291355, 6460296, 3933178, 1111045, 2272538, 1903315, 7731366, 295356, 3729627, 4550147, 5161957, 5989917, 2251158, 6100444, 623567, 831761, 5018555, 209505, 8106791, 958822, 7285090, 1308955, 1165959, 7517911, 3985143, 3892213, 6305801, 1009611, 7764362, 4032278, 2720543, 452246, 5532705]] + +w1: [[26, 25, 2, 6, 41, 20, 33, 5, 35, 24, 43, 10, 26, 41, 39, 0, 34, 37, 1, 37, 20, 5, 15, 0, 42, 18, 29, 32, 31, 24, 10, 40, 18, 13, 17, 32, 11, 22, 40, 43, 22, 14, 24, 14, 25, 33, 39, 7, 37, 5, 43, 9, 32, 27, 37, 33, 35, 37, 36, 25, 26, 1, 13, 20, 32, 36, 39, 23, 1, 18, 20, 13, 18, 33, 12, 12, 11, 6, 25, 5, 14, 43, 23, 42, 24, 34, 42, 27, 40, 6, 0, 35, 26, 19, 12, 14, 23, 4, 27, 35, 20, 34, 14, 0, 40, 7, 28, 36, 27, 6, 42, 23, 4, 27, 10, 4, 8, 15, 20, 31, 9, 39, 29, 11, 33, 13, 14, 14, 2, 3, 14, 13, 42, 35, 2, 41, 32, 38, 30, 35, 31, 30, 12, 35, 4, 16, 1, 34, 15, 2, 17, 1, 24, 35, 0, 39, 41, 3, 40, 26, 39, 39, 15, 3, 19, 12, 0, 11, 9, 26, 33, 26, 40, 31, 35, 37, 12, 31, 18, 20, 36, 30, 25, 29, 3, 33, 2, 39, 38, 14, 26, 27, 43, 13, 19, 12, 37, 18, 19, 26, 41, 14, 39, 42, 31, 17, 35, 35, 21, 11, 23, 32, 40, 14, 1, 39, 16, 12, 41, 38, 27, 26, 31, 2, 38, 9, 0, 4, 16, 23, 28, 11, 0, 14, 22, 14, 24, 7, 25, 5, 27, 32, 38, 32, 4, 33, 5, 1, 1, 14, 27, 27, 30, 40, 8, 22], +[19, 30, 12, 1, 23, 21, 14, 25, 30, 3, 35, 28, 19, 8, 0, 0, 21, 0, 18, 32, 11, 5, 41, 4, 24, 3, 26, 18, 19, 3, 39, 38, 2, 14, 12, 19, 23, 39, 40, 34, 28, 11, 8, 5, 21, 35, 40, 41, 22, 27, 20, 29, 17, 17, 18, 30, 35, 29, 39, 0, 9, 37, 25, 15, 0, 2, 34, 41, 9, 18, 11, 42, 34, 16, 4, 7, 34, 2, 28, 16, 14, 21, 2, 27, 3, 13, 5, 1, 15, 37, 17, 38, 17, 28, 14, 5, 24, 26, 0, 27, 10, 33, 30, 1, 33, 31, 5, 6, 17, 7, 26, 13, 41, 12, 35, 43, 38, 43, 17, 34, 11, 28, 39, 3, 40, 25, 37, 31, 9, 7, 28, 23, 6, 42, 11, 9, 24, 10, 0, 23, 29, 17, 16, 31, 29, 3, 28, 9, 29, 36, 9, 9, 19, 30, 19, 0, 43, 23, 14, 23, 15, 28, 35, 43, 16, 13, 3, 42, 34, 32, 11, 42, 9, 29, 32, 39, 15, 22, 25, 33, 32, 30, 3, 20, 6, 23, 26, 3, 42, 14, 18, 36, 12, 42, 12, 40, 14, 37, 29, 16, 29, 36, 17, 21, 19, 15, 27, 1, 2, 1, 9, 41, 4, 22, 32, 35, 34, 19, 13, 8, 2, 10, 22, 14, 14, 40, 35, 42, 19, 38, 23, 42, 1, 8, 28, 22, 16, 26, 39, 17, 8, 19, 9, 35, 6, 19, 38, 43, 40, 3, 20, 30, 30, 37, 12, 32], +[22, 32, 25, 10, 8, 4, 41, 14, 6, 21, 37, 19, 2, 37, 1, 29, 13, 14, 2, 25, 10, 29, 42, 16, 21, 35, 42, 21, 41, 17, 27, 10, 13, 41, 3, 33, 3, 41, 17, 27, 11, 10, 14, 26, 33, 34, 36, 37, 14, 18, 27, 1, 21, 8, 9, 20, 20, 30, 27, 20, 4, 23, 20, 17, 30, 38, 37, 33, 35, 37, 11, 27, 34, 43, 0, 3, 0, 23, 5, 14, 19, 32, 15, 25, 5, 26, 33, 12, 19, 13, 34, 10, 34, 26, 22, 29, 34, 36, 23, 27, 36, 23, 2, 2, 22, 5, 19, 33, 20, 11, 23, 30, 13, 22, 15, 21, 42, 37, 36, 27, 22, 16, 23, 37, 37, 21, 40, 19, 2, 33, 38, 8, 20, 1, 11, 7, 39, 41, 35, 4, 43, 14, 0, 40, 11, 16, 18, 41, 0, 31, 14, 6, 24, 41, 6, 35, 9, 23, 25, 39, 15, 17, 2, 29, 14, 24, 19, 41, 1, 26, 42, 8, 11, 23, 28, 11, 37, 34, 33, 36, 17, 17, 0, 38, 2, 17, 24, 9, 13, 21, 31, 30, 15, 38, 17, 23, 6, 23, 5, 13, 20, 38, 34, 17, 8, 5, 20, 0, 26, 2, 5, 8, 41, 32, 12, 9, 32, 22, 24, 14, 43, 19, 33, 21, 15, 37, 12, 0, 18, 5, 12, 23, 28, 40, 41, 2, 29, 31, 3, 21, 7, 10, 39, 5, 26, 20, 0, 22, 33, 23, 33, 41, 3, 15, 6, 41], +[16, 9, 19, 12, 30, 10, 24, 39, 10, 20, 12, 35, 41, 29, 6, 31, 11, 19, 41, 24, 22, 12, 16, 5, 24, 0, 5, 42, 2, 20, 2, 10, 32, 5, 30, 20, 2, 2, 20, 4, 10, 37, 14, 24, 6, 6, 26, 36, 27, 15, 18, 16, 13, 14, 9, 30, 3, 43, 7, 31, 20, 42, 36, 0, 33, 31, 17, 19, 6, 15, 9, 42, 2, 38, 25, 43, 28, 12, 16, 5, 30, 37, 25, 37, 33, 6, 24, 30, 43, 18, 17, 19, 1, 20, 6, 29, 41, 39, 3, 34, 4, 18, 31, 23, 26, 3, 42, 1, 36, 16, 7, 1, 1, 14, 12, 30, 32, 42, 28, 41, 28, 2, 34, 30, 39, 36, 24, 18, 11, 26, 18, 29, 10, 26, 40, 10, 5, 35, 41, 28, 19, 6, 32, 18, 29, 34, 3, 34, 19, 27, 28, 13, 40, 3, 29, 24, 29, 32, 23, 22, 5, 31, 33, 32, 0, 36, 34, 24, 42, 12, 38, 39, 42, 17, 12, 4, 41, 6, 34, 31, 4, 2, 36, 6, 8, 37, 28, 7, 32, 13, 35, 43, 19, 30, 41, 18, 39, 13, 12, 18, 7, 9, 20, 10, 8, 28, 26, 3, 10, 17, 37, 31, 40, 26, 18, 34, 22, 10, 15, 34, 36, 9, 32, 38, 34, 21, 6, 12, 10, 41, 2, 20, 24, 27, 31, 12, 32, 3, 4, 26, 1, 43, 5, 38, 7, 6, 39, 21, 20, 33, 5, 41, 21, 14, 2, 29]] +w1Encode: 5A261829151623B62A5A7A0262199454F100AAD4811FA6A05213818B85AE96833959781E65B126E056866349665AD05020795E81443552C8308B9115CE7AA998A86EA8018CDAC43817B18D94E800E8C1919BA15EC4A610C8437DC9D92D61E338C2E034EA28A4A0E98D9FC78C0414888F1005D8089CE9806AE7F90C13032C89166AE83796CC2751A4977543289CA6A36D6B3331A53469A973AA5F348ED57281A8139C10939A9BF609660210D0C52D806339D891151B688244580481B36D1E8A5893C70457E564DE30721302001520814B9112D8A049D3709A82C34CD7898ADC8214D588A6D6467551247963770249993D8020A689B4A822441CA2C0414E256C4353044F199911E71498066C4AE805E15718D1A1352933AEE61A890B770E68567EC9C15D86BA2498025C5D047DDDC0251D9924933701EBE55C0F37AE5033A822B8A849079E8F9585A03750C6A50DAA23918CCAA04ED9411D1955D3B3054290A484058EE2D4208262390E3AAA9379A901C259907646C8948CC664AEE840795EC98016982908913A46554E4219748D23644AA742D5A85669B4294D3A84431A6D8BE268A148968EB40515925094B751C445459E598663B96CE20A0CC0553813F86485163253232AA2667522796DE42508563185D472798DF5546A496E16749565854E42682254B01C673A12AB03A00B24A5C0E718586A8CC9959D4F24740E36A581A622CBC52DA518925104984284254DF5798F195DC655349429464841019A502029C824A08539EB14564FC90052C15C1C9A0ADD37548772161A0558E115A6C363A45032319E829D0AC58C69677CCB94621603151850A802252860E1518240114AE96086A191DB23418D9378C37A7C944A02E1174DC693A88299AD1C03155E9995A18179AB144D016574E9398884F45DDAA00624740481C378A0CAA59C207A2789498B26758A862AC5987293014A9D3888D3C635E8D0611D7859C517820029622A639E6AC410A9217E84401A48C91D6033AE93974A67C34847422908A70D4A547EA8268996F28864029A6265304A2A50D8F631E04068C15A988771565458A4952374 + +cTilde: 3202542EF1E239D32BE1BCE5AE4AC8052D578899D653E368E11BC11C5480BA06 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, -1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +cHat: [3919627, 1297980, 1398134, 6081972, 7171056, 414117, 5281780, 4348975, 7918931, 7431142, 1215943, 8115251, 2501891, 2979933, 1056051, 4629893, 4230848, 5517032, 5010294, 1242908, 5704558, 7057835, 5167595, 3777103, 8332766, 3764182, 871542, 3030236, 4134337, 1499599, 629903, 3298916, 7043202, 5792054, 3761978, 5168375, 4405577, 1463501, 6362953, 3665400, 4924397, 1770910, 5888927, 6855914, 6623049, 4617569, 893857, 7522834, 4128327, 6149725, 5470819, 6466910, 859471, 7503366, 8189191, 7145621, 3367182, 5055752, 854574, 688683, 1350696, 7633586, 7780514, 149762, 3827204, 5243543, 7007255, 7896765, 4031704, 3198989, 6511362, 2625684, 707409, 4044804, 4380212, 6873917, 3249697, 6196180, 8144309, 2008643, 1114648, 8375160, 6021177, 1414223, 184153, 1233760, 7440749, 1651110, 5145946, 3429713, 711316, 4656673, 4762729, 2402979, 5522336, 7149217, 6635899, 3916596, 4977936, 3852446, 4974614, 8334524, 6947770, 2445586, 3965586, 5519074, 4007453, 844610, 4907943, 7013082, 1680850, 6478319, 5952188, 4840027, 4010586, 7362287, 906915, 7539708, 807586, 4024537, 7960143, 8176348, 3320526, 6332214, 4792130, 1852683, 3275370, 6462248, 7769861, 8215834, 906817, 3856094, 3635994, 4689596, 3290668, 6821150, 2541025, 3309849, 2872565, 6842164, 6780671, 3170069, 7933475, 3834565, 1969708, 787644, 8047519, 7450286, 5797943, 2767495, 765149, 3193315, 6533871, 3848948, 1152331, 5790716, 954647, 3094725, 5326363, 5378809, 6200227, 1107740, 6063450, 1702536, 6629231, 3690552, 6959494, 7952332, 175194, 1503127, 5354255, 5360654, 984093, 2124869, 6081779, 7193035, 2683375, 4570964, 25881, 89200, 2514996, 4845659, 6569486, 7047346, 4486053, 2436373, 4570647, 1958715, 4000349, 6684928, 7232339, 2339860, 8253972, 1575249, 5717662, 1879230, 5700637, 5242556, 4570431, 3907746, 822927, 1275549, 7424736, 3433068, 3382346, 1929665, 4595276, 7373262, 7737352, 1010544, 5750124, 1401902, 6707993, 3540847, 3101636, 1959639, 1207699, 5199160, 6959323, 7085234, 4460274, 8254126, 3614235, 172046, 4319194, 6411114, 956605, 1619461, 1563488, 4328722, 3707987, 8363476, 1363057, 7438031, 1713753, 4994919, 5105715, 5836002, 1636184, 4545900, 5938112, 2172036, 8199449, 2932876, 7570340, 1689477, 1601356, 4404103, 7173100, 4609631, 1471711, 6745208, 533902, 2577624, 5891929, 3217175] +cs1: [[2, 8380399, 8380416, 8380402, 8380407, 0, 1, 8380415, 6, 8380415, 9, 8380408, 0, 24, 7, 4, 5, 2, 8380406, 8380412, 6, 8, 3, 8380414, 8, 8380408, 8380414, 13, 8380402, 8380403, 8380404, 4, 8380414, 8, 12, 5, 8380407, 8380406, 8, 8380403, 8380413, 0, 8, 8380415, 8380416, 1, 7, 8380412, 8380412, 3, 1, 5, 8380405, 8380412, 10, 8380416, 5, 6, 9, 8380416, 8380406, 10, 8380414, 8380412, 16, 7, 8380413, 8380415, 0, 6, 1, 3, 17, 8380412, 8380400, 8, 8380398, 5, 7, 4, 0, 8380412, 8380410, 12, 11, 12, 13, 8380413, 8380411, 8380416, 8380403, 8380398, 8380413, 8380413, 8380411, 3, 8380414, 9, 16, 7, 10, 5, 8380407, 8380406, 8380404, 8380415, 5, 8380412, 0, 0, 8380411, 8380406, 13, 0, 8380414, 1, 8380413, 0, 8380406, 8380415, 8380415, 17, 8380413, 8380411, 8380405, 8380412, 8380413, 5, 1, 12, 3, 8380416, 9, 9, 12, 8380416, 8380396, 8380404, 8380410, 8380412, 8380416, 8380415, 12, 13, 9, 18, 20, 8380404, 11, 8380410, 8380407, 0, 8380400, 3, 8380400, 8380410, 8380410, 8380416, 8380415, 11, 9, 8380402, 8380405, 8380395, 8380413, 8380410, 2, 5, 8380412, 8380402, 8380411, 6, 8380403, 17, 8380412, 18, 8380401, 9, 2, 8380416, 8380416, 8380408, 1, 8380412, 8, 8380416, 16, 8380411, 8380406, 8380405, 8380412, 9, 5, 11, 19, 9, 4, 8380412, 8380392, 0, 1, 8380415, 3, 8380408, 9, 8380413, 8380410, 2, 21, 3, 16, 8380408, 8380414, 8380406, 8380407, 3, 8380415, 18, 8, 14, 3, 8380413, 8380416, 11, 8380406, 0, 11, 4, 8380411, 1, 3, 2, 8380402, 8380413, 6, 8380407, 8380415, 8380408, 8380411, 8380403, 8380412, 1, 10, 8380414, 5, 2, 8380404, 8380415, 4, 8380412, 10, 14, 2, 8, 8380412, 8380407], +[8380407, 12, 8380404, 0, 8380416, 8380413, 1, 8380403, 20, 8380416, 9, 1, 4, 8380414, 20, 8, 8380406, 13, 8380413, 8, 8380402, 8380410, 3, 8380414, 8380403, 5, 8380410, 6, 17, 8380414, 8380416, 8380414, 8380411, 8380404, 8380408, 8380415, 11, 8380415, 8380405, 3, 8380409, 8380414, 6, 0, 0, 8380415, 13, 8380408, 4, 9, 8, 5, 7, 8380408, 5, 8380413, 0, 8380416, 1, 6, 0, 8380405, 14, 8380414, 4, 1, 8380414, 8380410, 8380412, 8380406, 8380415, 8380406, 8380413, 1, 1, 23, 20, 10, 8380399, 8, 11, 8380414, 8380415, 6, 5, 8, 8380414, 8380411, 8380412, 8380406, 8, 8380411, 9, 14, 2, 8380416, 7, 8380408, 8380390, 8380406, 10, 8380414, 8380412, 2, 8380411, 8380412, 8380416, 13, 2, 1, 24, 8380403, 8380408, 1, 8380415, 8380411, 8380413, 3, 8380410, 8380409, 8380415, 8380413, 8380398, 20, 16, 8380401, 8380413, 7, 8380412, 8380409, 2, 8, 4, 8380387, 0, 8380414, 2, 11, 9, 4, 4, 4, 10, 6, 1, 8, 8380416, 8380413, 6, 8380407, 3, 8380411, 8380409, 8380406, 8380413, 8380414, 6, 8380411, 8, 13, 8380404, 1, 8380415, 8380411, 6, 8380405, 7, 8380414, 4, 8380414, 8380416, 8, 1, 3, 0, 12, 8380415, 8380405, 4, 8380405, 2, 4, 8380410, 8380409, 12, 8380414, 9, 0, 9, 5, 7, 8380412, 16, 4, 8380412, 15, 8380412, 8380412, 3, 8380402, 8380416, 8380409, 8380409, 5, 2, 3, 7, 8380408, 4, 12, 8380416, 8380416, 5, 11, 16, 13, 17, 8380403, 8380415, 8380410, 12, 8380397, 8380411, 24, 7, 20, 6, 5, 6, 8380413, 11, 9, 0, 8380409, 8380414, 8380409, 2, 8380406, 12, 8380414, 8380411, 4, 8380413, 8380406, 8380407, 4, 8380411, 13, 8380396, 8380413, 8380411, 6, 16, 8380410, 8380416, 17], +[8, 8380413, 8380415, 3, 2, 2, 8380413, 8380403, 19, 8380400, 1, 10, 8380403, 8380410, 9, 6, 7, 8380408, 4, 27, 8380399, 5, 1, 8380406, 21, 8380410, 8380406, 9, 9, 8380404, 8380404, 8380402, 11, 8380410, 8380405, 2, 8380408, 2, 9, 8380405, 2, 3, 2, 8380403, 8380412, 7, 0, 9, 2, 8380412, 4, 11, 4, 5, 9, 7, 7, 8380399, 8380415, 11, 8380403, 8380416, 16, 2, 0, 8380414, 2, 13, 8380407, 2, 8380407, 8380413, 8380412, 8380415, 8380415, 8380410, 11, 0, 0, 8380414, 13, 8380415, 5, 11, 8380413, 7, 4, 5, 8380414, 7, 8380415, 4, 3, 1, 8380411, 8380401, 8380404, 8380409, 8380416, 16, 6, 3, 8380412, 8380413, 0, 4, 8380402, 6, 8380414, 8380400, 8380411, 2, 17, 17, 8380409, 13, 8380416, 8380405, 0, 1, 7, 8380414, 8380406, 12, 2, 8380411, 4, 2, 8380413, 4, 8380410, 8380412, 8380415, 9, 3, 8380415, 2, 4, 4, 8380411, 8380415, 8380414, 8380413, 5, 14, 8380408, 12, 5, 8380416, 6, 7, 14, 8380415, 8380410, 8380412, 7, 8380406, 1, 3, 3, 8380404, 8380410, 8380406, 8380411, 2, 8380404, 7, 8380414, 8380405, 6, 8380410, 4, 8380413, 5, 0, 12, 8380394, 9, 8380414, 8380414, 1, 8380411, 2, 1, 10, 8380409, 17, 8380409, 2, 6, 8380405, 3, 8380408, 8380415, 3, 8380416, 8380415, 6, 8380411, 8380409, 1, 8380416, 18, 5, 8380413, 8380405, 1, 10, 1, 4, 8380407, 3, 8380408, 8380408, 7, 7, 8380405, 17, 8380409, 8380398, 17, 11, 8380408, 8380415, 5, 12, 8380404, 8380392, 6, 7, 8380413, 7, 8380410, 11, 8, 8380411, 6, 8380410, 8380414, 0, 1, 7, 8380414, 4, 8380411, 8380415, 0, 4, 8380412, 0, 8380407, 8380409, 3, 8380414, 8, 13], +[8380411, 18, 8380409, 8380408, 8380405, 8380410, 8380402, 8380402, 8380406, 3, 8380408, 8380407, 0, 8380410, 3, 22, 8380407, 8, 10, 2, 4, 5, 9, 6, 13, 16, 0, 2, 10, 8380409, 8380393, 8380410, 21, 8380411, 3, 8380414, 8380408, 8380406, 8380414, 1, 8380402, 2, 1, 8380411, 1, 1, 8380412, 0, 8380415, 11, 12, 8380414, 9, 8, 8380415, 8380415, 8380407, 4, 21, 13, 4, 9, 8380400, 8380406, 8380403, 8380410, 1, 8380407, 0, 8380416, 8380407, 8380403, 8, 8380396, 1, 4, 3, 1, 8380416, 1, 8380416, 8380414, 8380406, 19, 10, 0, 7, 8380411, 8380414, 8380410, 2, 8380402, 8380415, 1, 8380415, 8380408, 8380407, 8380408, 3, 8380403, 8380406, 19, 1, 7, 8380407, 12, 17, 8380401, 8, 4, 16, 6, 2, 8380405, 8380414, 8380409, 8380416, 3, 8380404, 7, 9, 3, 4, 8380405, 5, 8380413, 8380416, 8380415, 8380407, 10, 8380406, 8380409, 4, 10, 3, 5, 4, 12, 8380404, 8380403, 6, 8380415, 0, 11, 8380413, 14, 8380415, 8380396, 8380410, 8380401, 8380416, 8380410, 8380401, 2, 14, 8380412, 6, 0, 8380398, 14, 8380413, 8380415, 8380415, 8380409, 7, 8380411, 8380406, 13, 6, 8380413, 17, 11, 6, 0, 8380407, 8380413, 8380415, 8380415, 10, 8380402, 8380414, 8380411, 8380404, 8380412, 6, 7, 14, 8380415, 3, 1, 8380413, 11, 4, 15, 17, 8380415, 8380392, 3, 8380409, 5, 21, 6, 4, 8380413, 8380416, 6, 8380402, 1, 8380416, 0, 8380409, 8380405, 8380413, 8380402, 8380393, 8380406, 1, 8380407, 14, 1, 15, 9, 8380411, 3, 7, 8380416, 5, 2, 18, 0, 8380413, 3, 3, 0, 4, 2, 12, 7, 8380408, 8380410, 8380401, 3, 8380413, 8380407, 8380406, 8380414, 8380408, 8380416, 8380406, 8380406, 8380415, 13, 11, 10, 5, 12]] +cs2: [[7, 13, 8380415, 8380414, 8380406, 8380415, 5, 8380415, 8380415, 18, 8380405, 8380409, 8380415, 8380392, 5, 0, 2, 8380410, 8380407, 8, 4, 1, 11, 12, 8380406, 10, 8380404, 8380407, 8380404, 8380407, 8380409, 1, 3, 21, 8380414, 9, 8, 8380413, 8380413, 8380406, 6, 2, 8380405, 8380410, 8380409, 8380414, 3, 5, 8380407, 8380416, 5, 9, 2, 8380406, 3, 8380410, 8380404, 7, 8380412, 8380411, 8380406, 8, 8380407, 8380408, 7, 8380408, 8, 4, 4, 0, 3, 0, 4, 8, 3, 8380412, 8380413, 1, 4, 8380414, 10, 15, 8380416, 8380411, 8380416, 8380410, 8380400, 8380415, 8380397, 0, 8380409, 8380406, 3, 0, 8380415, 15, 8380414, 19, 8380402, 0, 6, 0, 3, 10, 8380409, 8380413, 6, 6, 16, 8380411, 8380416, 5, 8380403, 8380412, 8380409, 5, 14, 1, 6, 8380412, 8380401, 8380410, 8380408, 8380413, 11, 2, 8380411, 8380414, 3, 9, 8380412, 8380399, 10, 8380400, 8380410, 14, 8380402, 14, 8380415, 4, 14, 8380411, 19, 11, 8380416, 3, 8380412, 8380412, 8380414, 8380408, 8380407, 9, 8380410, 16, 1, 8380412, 8380410, 8380402, 8380412, 7, 3, 6, 8380411, 0, 3, 2, 8380413, 8380412, 8380408, 10, 12, 4, 8380408, 8380411, 8380415, 8380411, 8380414, 4, 2, 8380407, 5, 8380413, 3, 3, 8380413, 2, 4, 12, 7, 8, 8380405, 3, 8380399, 8380414, 8380415, 8380413, 12, 8380407, 8380416, 10, 8380407, 8380414, 20, 16, 2, 8380409, 8380407, 2, 8380404, 4, 4, 8380415, 10, 2, 8380412, 8380415, 0, 8380415, 9, 2, 8, 8380412, 8, 4, 8380411, 6, 8380411, 2, 8380412, 8380401, 8380403, 16, 8380409, 10, 11, 5, 11, 1, 0, 8380407, 8380407, 8380405, 8380412, 8380402, 8380416, 12, 8380408, 8, 6, 4, 5, 4, 10, 3, 8380405, 2], +[4, 0, 8380413, 1, 7, 1, 8380414, 1, 8380413, 8380404, 8380414, 3, 8380412, 1, 0, 8380407, 8, 2, 6, 4, 4, 8380407, 8380410, 8380411, 9, 6, 11, 0, 8380415, 8380405, 8380401, 0, 8380399, 11, 8380414, 8380412, 2, 8380405, 8380392, 8380415, 8380412, 0, 8380406, 7, 9, 8380411, 8380403, 8380415, 8, 8380412, 1, 10, 4, 8380409, 8380405, 8380416, 8380412, 8380415, 8380411, 11, 17, 8380402, 8380406, 9, 8380404, 4, 8380412, 1, 17, 8380413, 8380414, 8, 8380406, 8380402, 8380407, 8380404, 7, 18, 8380408, 8380411, 8380415, 8380397, 8, 8380416, 1, 5, 8380410, 3, 3, 8380416, 8380413, 17, 3, 11, 3, 8380409, 8380414, 8380407, 8380409, 8380412, 5, 8380411, 5, 8380408, 11, 8380413, 8380405, 3, 8380412, 2, 8380413, 7, 8380406, 8380416, 8380410, 11, 8380406, 8380412, 12, 8380415, 6, 1, 4, 8380415, 8380410, 4, 7, 19, 8380405, 2, 8380392, 5, 3, 8380416, 2, 10, 21, 8380411, 11, 11, 7, 8380399, 1, 20, 8380410, 8380403, 8380411, 4, 8380414, 0, 3, 8, 10, 5, 6, 2, 8380414, 8380404, 9, 12, 3, 8380411, 8380414, 7, 8380407, 10, 3, 7, 8380408, 6, 9, 8380410, 8380395, 4, 5, 8380408, 10, 8380412, 3, 5, 8380409, 8380412, 9, 8380409, 15, 8380409, 8380411, 23, 8380408, 5, 8380415, 8380409, 13, 0, 8380408, 8380414, 8380415, 8380412, 12, 8380409, 8380416, 8, 1, 3, 8380404, 8380411, 0, 8380404, 8380406, 10, 11, 13, 8380413, 10, 3, 0, 8380403, 1, 8380414, 10, 3, 10, 12, 8380405, 14, 8380416, 2, 8, 8380402, 8380411, 8380416, 8380407, 8380407, 8380415, 8380401, 16, 8380404, 8380415, 0, 8380415, 8380400, 8380410, 9, 1, 10, 8380408, 9, 8380412, 8380415, 3, 8380410, 8, 8380414, 2, 8380407, 8380411], +[8380401, 8380402, 8380411, 4, 4, 8380413, 5, 9, 0, 2, 8380413, 8380412, 8380415, 9, 3, 8380415, 8380394, 7, 3, 8380413, 8380406, 8380416, 6, 8380409, 8380414, 9, 13, 12, 8380415, 8380397, 8380411, 7, 5, 8380416, 8380405, 8380415, 12, 8380413, 5, 11, 8380413, 3, 2, 5, 4, 8380415, 4, 8380409, 2, 5, 9, 0, 0, 8380411, 8380409, 10, 8380412, 8380406, 8380412, 8380411, 8, 7, 12, 8380415, 8380413, 8380415, 6, 3, 8380407, 13, 11, 4, 8380413, 4, 8380413, 9, 8380399, 8380411, 2, 3, 5, 16, 8, 10, 8380412, 8380399, 2, 13, 2, 16, 8380403, 4, 5, 12, 7, 3, 8380401, 27, 8, 8380410, 8380416, 8380410, 8, 0, 0, 19, 4, 8380413, 9, 4, 8380413, 1, 1, 19, 10, 4, 1, 8380409, 7, 3, 5, 6, 8380416, 8380406, 8380416, 8380413, 7, 8, 8380405, 2, 8380412, 1, 8380412, 0, 13, 17, 8380412, 14, 8380411, 8380412, 13, 1, 8, 8380412, 8380394, 3, 8380413, 25, 1, 8380413, 8380403, 2, 3, 0, 8, 8380415, 8380416, 8380412, 6, 8380416, 8380415, 8380416, 4, 2, 9, 0, 10, 8380402, 0, 10, 4, 1, 8380411, 8380410, 1, 8380414, 8380407, 8380413, 8380412, 12, 11, 8380403, 0, 5, 8380411, 4, 8380416, 8380407, 4, 8380415, 10, 7, 8380409, 6, 8380411, 8380404, 8380414, 8380416, 6, 5, 8380416, 11, 0, 2, 8380416, 8380409, 9, 8380411, 8, 8380414, 8380408, 0, 8380413, 19, 8380413, 6, 8380401, 5, 8380409, 8380412, 8380407, 8380413, 23, 8380413, 2, 12, 8380414, 5, 5, 5, 7, 8380402, 8380411, 8, 8380411, 8380414, 8380411, 8380410, 8380408, 10, 8380408, 15, 8380415, 8380408, 10, 8380413, 3, 8380405, 0, 5, 9, 8380409, 8380414, 0, 4, 1], +[8380416, 8380411, 8380408, 8, 10, 9, 8380413, 8380407, 8380406, 8380411, 0, 26, 9, 5, 8380414, 0, 11, 1, 8380406, 3, 8380406, 8380411, 8380413, 8380402, 8380415, 8380415, 8380416, 15, 8380407, 7, 3, 9, 11, 10, 8380415, 8380408, 8380416, 0, 22, 15, 5, 3, 8380415, 6, 17, 0, 8380415, 2, 1, 8380397, 7, 0, 9, 8380408, 3, 8380409, 8380404, 8380408, 2, 4, 8380410, 20, 8380407, 1, 8380412, 8380416, 2, 10, 5, 6, 1, 0, 8380412, 8380402, 8380411, 7, 2, 8380410, 12, 15, 8380402, 8380405, 8380411, 1, 2, 8380414, 8380413, 6, 8380409, 11, 8380411, 8380405, 8380415, 8380416, 6, 11, 11, 8380413, 6, 1, 5, 8380400, 1, 11, 9, 8380402, 8380404, 8380407, 8380408, 22, 8380414, 2, 3, 10, 8380409, 1, 12, 14, 2, 8380407, 12, 8380415, 8380411, 12, 0, 14, 8, 8380409, 8380396, 8380416, 8, 11, 8380412, 6, 8380401, 6, 8380414, 1, 8380414, 8380400, 0, 8380410, 8380391, 5, 11, 8380416, 18, 12, 8380414, 8380415, 8380408, 6, 9, 8380413, 13, 8380414, 8380401, 3, 8380405, 1, 7, 14, 8380409, 6, 8380409, 8380413, 8380401, 13, 6, 6, 8380415, 1, 8380414, 8380407, 0, 4, 8380408, 0, 8380412, 5, 8380411, 16, 12, 12, 8380411, 8380407, 8380404, 4, 8380413, 8380408, 0, 8380416, 8380416, 8380413, 3, 13, 19, 5, 8380414, 12, 5, 4, 8380415, 9, 8380408, 2, 8380407, 4, 8380412, 8380416, 8380412, 8380408, 2, 0, 8380408, 8380413, 8380399, 8380416, 8380411, 4, 11, 8380411, 8380413, 8380408, 8380394, 0, 11, 2, 23, 6, 7, 12, 8380409, 6, 9, 3, 8380398, 0, 8380404, 2, 8380412, 8380398, 14, 8380401, 4, 9, 4, 8380416, 3, 4, 8380412, 8380413, 8380394, 16, 0, 22]] +z: [[8326403, 57133, 7318, 8379181, 8259040, 8372149, 75888, 8255636, 12226, 8283522, 110470, 8355778, 87493, 8378437, 23047, 73282, 103668, 8346364, 8340345, 11560, 13209, 99138, 8358183, 8286641, 8356984, 58897, 185, 8282786, 8371393, 86874, 8339493, 8354819, 8334856, 8365209, 106683, 104052, 8334673, 46091, 8345795, 31577, 8361552, 8335659, 8329871, 8249545, 104190, 22950, 67718, 90554, 8370976, 8365339, 8256101, 8300833, 100126, 125053, 8297516, 8289510, 8362997, 13980, 8316259, 104587, 35943, 110699, 39460, 8375031, 8301933, 8261376, 8322602, 10731, 8346206, 8345145, 37840, 130167, 121151, 33533, 8303878, 8326018, 8278550, 14027, 8341235, 52192, 73035, 8378662, 27426, 8314093, 2086, 68115, 8292281, 70154, 8290672, 28083, 32702, 108286, 8307599, 84620, 8287534, 67218, 8303234, 8346013, 8380347, 127665, 8254254, 8257734, 62187, 8291605, 8374245, 56022, 8377317, 51791, 8369069, 8320673, 36619, 93277, 67140, 8366465, 8324819, 8367696, 44012, 38545, 8299445, 8368671, 8331371, 8335554, 2190, 8348061, 23855, 8327217, 121572, 8368044, 87837, 58892, 5834, 59268, 15013, 8331723, 106097, 48678, 129118, 74607, 117220, 37332, 71557, 8317190, 8354213, 8307161, 8295506, 103660, 8308702, 4430, 8359499, 8294359, 64454, 8305989, 52986, 18508, 122882, 18336, 7862, 8352649, 88137, 8378999, 8316937, 8320694, 6281, 107213, 86310, 17547, 8282214, 8335281, 8273835, 59310, 85734, 85313, 8328628, 32666, 108553, 58989, 8370874, 8318142, 78552, 24444, 54780, 8310313, 127449, 8305675, 93761, 1665, 8356773, 8341861, 8358556, 55890, 8249757, 8306111, 126242, 8344506, 33156, 42436, 8269137, 29528, 8252939, 59437, 8264070, 8332883, 8327017, 124480, 8250789, 97257, 84686, 3899, 8315218, 99885, 8373765, 73937, 8266930, 7934, 8316152, 29782, 117246, 35232, 35650, 123384, 33124, 97406, 100354, 102121, 127741, 8310535, 8264041, 75183, 34287, 8320633, 44952, 111940, 8307349, 8266455, 8365040, 50581, 95672, 8332363, 8335075, 58566, 18555, 8363220, 8352917, 8289872, 114639, 8320894, 8289209, 8273453, 8302088, 8267136, 8303077, 8298979, 8329596, 75883, 76993, 114660], +[8351159, 56199, 8287451, 8375034, 29592, 10076, 8325295, 90630, 8289292, 8315599, 2379, 8288306, 22366, 55464, 61878, 104863, 8376710, 8348325, 8286412, 98250, 8347365, 8295054, 113683, 201, 102359, 8326276, 65614, 8291166, 8361863, 8289778, 8376666, 8318080, 8249479, 8329466, 8314657, 45879, 12578, 102824, 8261705, 63918, 108397, 8298353, 24619, 99928, 16833, 107803, 8337575, 8259588, 8345452, 8299072, 12458, 8313650, 71209, 94351, 8370690, 24465, 48483, 8293040, 114192, 95498, 21140, 8333027, 119512, 101679, 128047, 123762, 113113, 8344363, 5736, 8345486, 8279082, 8259033, 8294892, 53911, 86200, 130443, 128633, 8273383, 8273137, 8257357, 8319923, 75458, 8262490, 60592, 37311, 11238, 87889, 127314, 8362322, 15925, 8338527, 86029, 87016, 8251402, 8372202, 79271, 8265632, 65413, 67832, 57076, 58648, 8294393, 41340, 38612, 8251490, 82964, 43650, 56919, 8378871, 47910, 80416, 101631, 15196, 12292, 8301399, 35132, 59935, 53308, 8306183, 15626, 8269611, 67994, 40467, 8282226, 39820, 8303421, 8256124, 11315, 8325242, 62164, 110596, 51201, 8350393, 8354574, 107122, 8367270, 8340986, 8291648, 32650, 8270250, 8276128, 115938, 8284367, 68031, 8345706, 8347363, 26865, 8307710, 86751, 39040, 73440, 67573, 38452, 16730, 8270869, 8319927, 74825, 8311954, 6606, 129772, 100476, 113352, 8326643, 8269732, 8290855, 87055, 39702, 8341183, 8330583, 51385, 8374248, 8278016, 80623, 111433, 8289849, 8342368, 8286001, 114080, 8352214, 64670, 8281332, 91080, 8289309, 97427, 8273252, 121918, 122494, 8316907, 55944, 8278935, 8292873, 8336600, 70900, 8332056, 63476, 63024, 104343, 8351939, 117935, 6098, 8250308, 8301376, 81670, 8320325, 8378889, 57980, 8360241, 8325782, 8306208, 55767, 81437, 8303261, 97850, 56199, 8286824, 52406, 8289308, 56328, 60848, 8344298, 8349414, 8250331, 8294650, 8277178, 128539, 8267255, 93059, 8338433, 8371746, 2658, 8304877, 27321, 33384, 8361700, 14408, 8308725, 8371551, 8272703, 122114, 8270805, 101421, 8318967, 8348658, 8256187, 124320, 8378822, 8352890, 23675, 27458, 8304094, 8344015, 8281035, 61874, 8370859, 37659, 8359729], +[8366734, 89923, 8279227, 8341526, 8375978, 8354711, 23839, 8283379, 13781, 25609, 127026, 116155, 89958, 8303465, 8252686, 72862, 8355626, 8278677, 120933, 8375869, 97391, 8349046, 8257275, 14869, 8353761, 19925, 8361897, 8363029, 8377883, 8254136, 31765, 8345774, 8305146, 23691, 80643, 8337907, 8316922, 8311186, 116328, 113664, 120422, 38419, 104937, 5219, 46019, 8262708, 41460, 68692, 117245, 8286072, 8271029, 101776, 8271762, 120000, 8284931, 8285632, 8290028, 8283754, 8334986, 91743, 45559, 8373262, 8361712, 122996, 65350, 24825, 8336906, 8372056, 8314703, 126053, 110365, 87054, 8358937, 33576, 17785, 8263678, 126405, 41158, 8327860, 29321, 8344487, 8288798, 8375085, 8251881, 8262202, 5988, 66067, 59979, 8352836, 8258779, 8362299, 8358017, 12225, 51434, 8309412, 8333338, 8257410, 36026, 8285774, 8366455, 8264907, 8345112, 84665, 68815, 56897, 8301488, 8335762, 91010, 8370301, 8357185, 8313578, 8347585, 2947, 8266161, 8288552, 105796, 36129, 8333036, 31978, 62768, 8304497, 19852, 120685, 8358338, 129084, 9267, 8258831, 59409, 16568, 8354782, 6411, 8266100, 8302088, 74120, 115072, 107987, 8267587, 8293582, 71110, 30032, 8256836, 8353599, 8322980, 10786, 26540, 64684, 8251078, 8283411, 8319007, 33338, 59460, 8349196, 12643, 101873, 57834, 93031, 79263, 8327681, 8275506, 52398, 8373439, 8298779, 8353565, 122836, 8292431, 8372657, 8352120, 126937, 8348810, 8270560, 8301636, 40714, 8333677, 8290342, 115433, 37379, 15336, 8357261, 8306420, 34118, 69191, 8308220, 8357729, 8291547, 8286300, 8347458, 8295268, 8296256, 8344658, 22458, 89226, 8342572, 8332102, 8335576, 14713, 8319354, 8273937, 8354924, 103580, 94411, 65811, 89057, 72928, 8328393, 8322305, 8343277, 130163, 19915, 8268263, 8368162, 57524, 8249442, 8308576, 8339956, 27729, 48711, 114054, 8354178, 85773, 8252960, 8302254, 8378036, 123266, 7100, 7027, 92140, 35285, 8327493, 8281715, 8297105, 8329411, 8253045, 106835, 42890, 62739, 66438, 117618, 97176, 8339351, 82675, 38399, 24617, 8355223, 8351039, 8319685, 125617, 81021, 115100, 8295820, 73600, 59548, 8342253, 20847, 8260833, 348, 8322680], +[122405, 8265866, 126088, 8364806, 60718, 8294431, 8287601, 8283814, 8290083, 39525, 9450, 48309, 8265501, 32784, 59971, 8291439, 124890, 35081, 8300057, 8307398, 24615, 8305833, 116899, 8347100, 8365621, 8321572, 8254774, 8335688, 8250989, 8373043, 119644, 101636, 64630, 8259421, 8346806, 79020, 8289085, 8289944, 8280162, 8322605, 5989, 112590, 20038, 54571, 62679, 93512, 8358650, 8255692, 61393, 8258232, 94981, 37685, 27291, 8365642, 8322563, 8308490, 8336290, 124098, 8274591, 75329, 8376484, 35087, 8335805, 8374659, 76244, 87875, 5522, 7653, 6797, 21123, 93109, 8369980, 8348161, 8360211, 8263840, 8260682, 63060, 122913, 40143, 59457, 56593, 8368041, 8340276, 8298064, 87061, 111501, 8317363, 118151, 16469, 8355816, 59754, 8326927, 56849, 95986, 121057, 123999, 8264326, 18874, 104462, 70611, 8318799, 6483, 99143, 8311828, 45730, 108043, 8315353, 8289175, 3012, 8350149, 8326854, 110019, 8370356, 8251980, 8341828, 42184, 39544, 27015, 8345984, 8249510, 48708, 8293216, 105147, 8326, 125626, 121399, 8317656, 52995, 8338904, 17579, 45621, 130985, 3136, 94180, 89825, 12707, 8307821, 21150, 8355745, 73291, 8352282, 9446, 68852, 47704, 80764, 22262, 10552, 106625, 8341410, 8331798, 116700, 3743, 8352190, 93787, 8263603, 8356914, 8325540, 54990, 8316413, 101654, 8313597, 8343102, 23238, 8342579, 8301596, 8354336, 76816, 86279, 93705, 8339674, 57953, 109071, 8307115, 8370920, 8286959, 8323532, 8301963, 56548, 74780, 23857, 54163, 8327523, 8280476, 8278737, 8350268, 53931, 8272568, 8288915, 5399, 34512, 8292495, 116200, 8268106, 56815, 8249569, 81136, 126508, 8271448, 8315827, 8316807, 39678, 52838, 96424, 40768, 43032, 77101, 54301, 8283523, 8336546, 8294580, 99472, 42293, 38759, 8353084, 8349978, 111808, 114339, 92308, 71182, 84658, 53031, 8349023, 8306163, 111602, 8280367, 88604, 8253950, 8331407, 8343759, 8283284, 7584, 8336180, 8333368, 8465, 8348713, 8358931, 12856, 82900, 43289, 8291218, 8366543, 66272, 8250570, 42590, 8307634, 8314964, 8300938, 8294854, 8323116, 104691, 8300776, 65534, 37496, 65196, 121399, 8296562]] +||z||: 130985, ||z|| check passed +r0: [[16336, -43434, 81462, -22910, 8316, 11209, 42434, -4837, -27144, -82132, -3552, 7413, 4201, -69199, -23623, -591, 50423, 27202, -43436, -94230, 1484, -49886, -81705, -83544, 52287, 74768, 72166, -85251, 21766, 44667, 676, -25845, -94324, -59431, 94714, -34404, -31946, -23354, 49816, 89353, -61112, -28663, 9890, -24789, 40866, -13150, 43283, -1526, 61546, -55742, -45935, -77166, -44962, -53332, 88484, -82336, -23507, 49466, 93228, -73728, -66204, 14551, -78200, -35788, 16508, -54415, -79216, 80084, -81225, -16500, 81641, 33249, 13018, -22737, -63174, 4316, -19551, -74342, 54625, -68013, 83551, -62150, -49273, -40277, 26980, 45643, -47688, 11172, 83463, 42420, -86576, 91513, 64143, -91837, -51306, 91372, -45660, -25846, 87372, -89700, -30422, 80007, -78136, 27200, -61659, -16520, 65481, -69890, 87659, -16165, 1797, 2186, -17273, 20863, 67304, 45864, -38642, 61348, 91147, 91894, -5901, 28149, 75271, 95002, 23891, -33491, 11213, 63146, -1713, -82800, -64021, 28527, 25197, -88218, 34270, -41371, 74057, 39380, -83717, 15734, -90650, 43432, 6345, -4719, 33025, 30972, -69067, 59168, 61319, 61060, 67349, 88562, -35633, -87011, 15011, 494, 48450, -92824, 12399, -303, 8715, -75436, -68736, -64174, 65126, -28143, 39413, -51423, -61706, 28409, -16266, -87388, 65623, 52500, 79103, 54063, 71397, 60997, 71193, -15868, -77244, -71379, 10556, 33607, -2886, -36195, 26469, -5465, 58414, -17241, -57817, -51409, 52044, -28749, 40249, 42369, -29922, -38178, -63838, 94361, 46274, 49805, 42015, 8986, 67125, 88179, -50440, 8696, -28471, -80544, 76956, 36731, -51369, -60842, -398, -7359, 34976, -81475, 52923, -58096, 94964, 82276, 28356, -53592, -22941, 42206, 16322, -61656, 24383, 61949, 427, 86641, 23188, 82716, -93662, -9652, -27286, 3269, 46734, 34724, -24880, 4, -65353, 16375, 3592, -21702, -73197, -77317, -45509, 60377, 23487, -9821, 68109, -94910, -20199, 66190], +[11634, -88991, -38772, -58122, -58158, 71954, 6830, -89244, -49827, 7579, 53143, -7162, -79615, -11221, -6990, 51430, -10141, -33475, -22162, 60211, 49437, -7706, -15665, 28076, 71461, 3015, -5603, -44643, 25211, -85047, 10000, 31749, -59211, -77988, 23578, -62131, 47591, -5726, 46154, 15727, 64638, 40937, -36972, 72226, -49158, 15568, 88059, -43143, 13784, -64162, 7204, -66094, 60574, 79497, -92584, 1981, 42405, 48046, 80460, -25644, 18776, -21333, -33187, -18428, 29964, 48220, -71560, 93753, -44342, -64815, -90253, 45115, -72277, -31085, 57570, 71792, 35909, 63157, -7758, 32546, -72327, 71406, -23974, 91784, -65191, 77031, 88276, -83596, -25954, -84257, 94361, -25030, -85202, -24717, -39167, -89095, 72941, 76633, -54629, -91450, -46748, -12573, -25291, 71902, 47634, 4134, -36075, 46504, 18840, 36912, 2260, -60626, 66527, -966, 31658, 4255, 57144, -21232, 77423, -76424, -25850, 63851, -91814, -37685, -33483, 76327, -80616, 54336, 93295, -83986, 8124, -92463, 92187, -37242, -86046, 61998, -15826, 2912, -45704, 44800, 41266, 89738, 36836, 33364, 40622, 12874, -63499, 36171, 75088, -34263, 26805, -16555, 5791, -90344, -63371, -39792, 88530, 14122, -68967, 91629, -73624, 59676, 33203, -90232, 88316, -77968, 66187, -8016, -48546, 91543, -59286, -62232, -70774, -65025, 73643, -6421, -33186, 94810, -91709, 86133, -44478, -64515, -12444, -62824, 92345, 43834, -32773, -36531, -18113, -39278, 67532, 34849, -78218, -56198, 74421, -33599, 32033, -20480, 61967, 94848, -89483, -37666, 4429, -42929, 42433, -22382, 79072, -78954, -35311, 2075, -71089, 60972, -2640, 9045, 35111, -9468, -77055, 71730, -66804, -85394, -63627, -20386, 24085, -54232, -68934, 24967, 31435, -56492, -37407, 54185, -69860, 93804, -26469, -84784, 44901, 78355, 59586, -25304, 53028, -13760, 4905, 63650, -3535, -21526, 672, -87905, -44569, -15145, 25225, 17205, 67269, -53365, -37314, -42700, -5479, -70726], +[-10105, 77558, 52235, -41153, 82722, 22884, 2070, 67829, 91901, -28260, -88267, 22357, 67568, 4891, 16002, 61750, -60922, 8887, -57482, 50502, -44950, 61868, 67963, -88065, 66877, 49165, 72355, 12221, 35368, -60810, -88838, 28652, -72897, -83030, -71882, -58978, 9354, 94584, -78106, -87136, 48372, 46829, -91069, 64230, -74782, 26785, 82781, 53757, 17189, -31504, -51195, 70398, -47500, -17741, 89489, -11463, -83789, -44082, -31819, -82990, -63325, -3556, 78787, -32652, -69390, -50687, 38487, -80339, -48157, -92132, 27595, 11043, 21294, -46685, 73522, -13293, -73807, -76501, 156, -21301, 39827, -80964, 45544, -37502, 7773, 65579, 66401, -810, 15179, -62903, -77008, 35670, -2360, -56903, 64521, -79031, 88880, -44180, 48768, 56199, 17707, -72802, -18996, 86222, 87205, -66427, -34099, 22378, 75177, -45117, 8872, 44707, 37888, 68488, 12606, -8933, -24503, 1798, -88380, -87947, -77114, 24776, 16211, -56394, 76999, 83491, -58099, -11041, 67472, -65514, 79988, -28595, 88769, -80208, 86558, -77842, 10720, 130, 3119, 86279, -74661, -35139, 30817, 72157, 33542, -24808, -67055, -12320, 24268, -68329, 68207, -69590, 53305, -47512, -67406, -93413, -7854, 2267, -36770, -11041, 19208, -13175, 67685, 3603, -37776, -77864, -51948, -62890, 23867, 67493, -48901, -27244, -81562, -76967, 82450, 79431, -40012, 8274, 33687, -61229, 88172, -39109, -82343, -38926, 22614, -34508, -65112, 10375, -58594, 69037, 47236, -59479, -73253, 30250, -15993, -57965, -85725, -9106, -89637, 74414, -85087, 82084, -69436, -7663, 65146, -91002, -81378, -76793, -43774, 44771, 74579, -94260, 55853, 49078, 42850, 42802, 72216, 31672, -18153, -28492, 11419, 46476, 70864, -58169, -78260, 11509, 79074, 33645, -21313, 56265, 21693, -5471, -64754, 51825, -20436, 91856, 94826, -17033, 26818, -64927, -42684, 82235, 35534, -26754, -77572, -55180, 66645, 48175, -18354, -18992, -91352, -76158, 80029, 83210, 89044, -7284], +[27588, 68572, -9532, -125, 7794, 71219, -29811, -78270, -82130, 83340, 79573, -39653, -2270, 458, -40824, 59164, 4786, 4943, 22167, 77284, 21272, 9424, 75396, -65313, 2611, -79247, 51125, 52178, -66261, 89411, 53355, -19835, 24701, 19933, -4430, 78814, 4522, -189, -53330, 6884, -29104, 4929, 42828, -90473, 15019, 72664, 68067, -1514, 70191, 40256, -61460, -53681, -22265, -72247, -45258, -68867, 26905, -14214, -79843, 74433, 53011, -23764, 27899, -86484, -40319, -51374, -69957, -6897, -9223, -70367, -38031, 60156, 56293, 70661, 57958, -41329, 83038, 53036, -61122, -47119, -40153, 80003, 60985, 38481, -4786, 64962, -42671, 12860, -36574, -6449, 89475, -48945, 83385, 56757, 59113, 53643, 75076, 5291, 81830, 91689, -33581, -35691, -20658, -2078, 50375, -50001, -86945, 85423, 70293, 44015, 31175, 45805, 68880, 56670, -1570, -82073, -51893, 27441, -57707, -42213, -34705, 69204, -48974, -62361, 36143, -79903, -16430, 28141, -9340, 69021, 10230, 34115, 68980, -37482, -22881, 9015, -93953, 41982, 21125, -22505, -14412, -8616, -19503, 19393, 73469, 63276, -10729, 6905, 41085, 6705, -48014, 6888, -78702, -79158, 82766, 9064, 73769, 48464, 88788, -34421, 28985, 5691, 55214, 14265, 94305, -7548, -24827, 15131, -3263, 21495, -27700, -93636, -73181, 19146, 63636, 69879, -25282, 87828, 13284, -64194, -59674, -11245, 90973, 41529, 92236, -4850, -70489, -67042, -76201, -57624, -32747, 71175, -52081, 4612, 9298, -48044, -72715, 8612, 88456, 90758, -28931, 11504, 7158, -79902, -52084, -35663, 86622, -71070, -18713, 21084, -13795, 32393, 75566, 67565, 10536, 8466, 18534, -10420, -5989, -29120, -81743, -16253, 2521, 53732, -15457, -66566, -31750, -13032, -1348, -77664, -85579, -79665, -20981, 19423, 85524, -34413, 5615, 52175, 69918, 66489, 19046, -83142, 6488, 47474, -24297, 23166, 89811, -14600, 82930, 20485, 57296, -44658, 32557, 54031, 71318, 9227]] +||r0||95002, ||r0|| check passed +cHat * t0Hat: [[6685568, 3625903, 5012222, 7942920, 1902157, 4674810, 4210018, 6254152, 5621555, 4432127, 3161400, 2991916, 3326774, 463020, 6499212, 7545109, 1598396, 893422, 3163648, 5135103, 6373010, 3604652, 4524410, 4739349, 5400888, 8201760, 4132841, 7133472, 8207611, 5865764, 8187623, 6619652, 5873078, 816586, 5607839, 5521262, 1486689, 4790054, 7495330, 6792367, 4284229, 6447705, 4677784, 5727378, 3637327, 6239992, 6416001, 8244177, 3521273, 7866351, 1162684, 796876, 7193167, 5621796, 7872890, 4085570, 1937406, 7367082, 7419925, 4465483, 5833208, 2028702, 3579262, 8343516, 5972819, 3635698, 6909496, 3510491, 6188849, 7150162, 4334377, 7559412, 7575912, 2828153, 815803, 912994, 4845107, 7582661, 6018602, 2963398, 8101329, 8148423, 3077187, 3613418, 4894986, 7174916, 2122661, 4202334, 1638438, 1153711, 3636526, 6757059, 4768277, 1669914, 6919913, 7654547, 2822931, 4844561, 291170, 1609726, 3209356, 6825065, 3478963, 4226210, 6984364, 1708011, 1015730, 8012597, 1075022, 5394660, 3075880, 3295663, 5189888, 6648212, 7885222, 4462030, 7938940, 1685976, 5087381, 7424844, 6998526, 4048553, 4531914, 4457455, 3184986, 6704822, 1444012, 5604810, 3364295, 4042205, 646751, 2296249, 5532886, 5491991, 8221389, 1607092, 10719, 2437729, 5667453, 7496711, 3045522, 7811675, 295426, 6539280, 5360181, 3649788, 6749425, 251671, 4583273, 7325646, 8142349, 3008227, 8159953, 8325364, 5225204, 6512180, 1515680, 5407684, 3337980, 7760263, 5531107, 1017737, 2370678, 4199679, 6594891, 6155518, 8290083, 2408535, 7828841, 2063891, 5117968, 1748001, 7713528, 6737926, 7231922, 2244033, 5400646, 534305, 1931038, 3622972, 7672285, 7057117, 2954284, 1706675, 4874896, 4020626, 6185699, 6254840, 673693, 1842486, 1030324, 523369, 981961, 3259213, 7139107, 3515467, 5870652, 5372536, 4271429, 7708552, 790667, 4931534, 3287042, 4199681, 833310, 1429251, 5744840, 391512, 5766115, 4344744, 527685, 3247692, 6409157, 1837796, 4163043, 1870759, 3538947, 4953798, 5453154, 475685, 7386870, 697005, 7222579, 7789105, 6776799, 6584776, 2488765, 8202851, 19099, 6997181, 5751379, 5175618, 7556663, 7776793, 3358382, 1375303, 3765405, 5084620, 7354498, 1188967, 6718785, 2590437, 6515971, 4536811, 4751488, 486634, 8274819, 7051410, 7480138, 3756206, 5528785, 4337911, 1774785, 6940669, 4842811, 7522923], +[4777632, 90958, 8065217, 584878, 6688472, 5835341, 8057752, 7925126, 4307379, 1526365, 6347656, 5095628, 5273048, 3594180, 237683, 4235200, 2183933, 4287717, 2230703, 5797096, 5969514, 5009083, 4184842, 7150673, 1846937, 329124, 7836484, 6566958, 7698903, 6228067, 7026266, 7966099, 6455411, 6746516, 5854365, 7488526, 405408, 1690367, 1112905, 6257108, 6814315, 3092429, 2388725, 7409143, 1980823, 1356970, 5491680, 5331359, 400255, 5556751, 4963758, 8180156, 2648809, 4876436, 7591510, 6671759, 1472349, 1698645, 5766877, 2682509, 3994719, 4740754, 7394025, 1346248, 4156446, 554443, 7132228, 3104211, 5448113, 7475313, 5122591, 4778194, 1602838, 897997, 8066280, 7959512, 5781856, 4672166, 1251226, 2741628, 7392765, 3539539, 1414309, 3659044, 6436845, 839651, 7774321, 4133689, 3480116, 4175498, 7490220, 4262421, 824976, 7653312, 2140452, 3347915, 6591431, 7778504, 6849694, 7156045, 1907079, 5125734, 5171870, 3149764, 260707, 5540041, 836441, 2284900, 6416551, 2120903, 7473851, 518907, 7287610, 7250106, 3460051, 7976026, 7741345, 6014641, 6041382, 7521296, 4684126, 6159923, 8321636, 2189133, 7358395, 4934821, 1312244, 6482982, 519950, 6313820, 1673019, 4856593, 3370058, 5453333, 3096125, 190418, 6934446, 2798240, 6253558, 5575369, 7510445, 6769503, 4799043, 6814139, 2508501, 6256292, 5103841, 7495729, 4102569, 5958596, 3256313, 5121975, 496217, 2384396, 3794502, 1967788, 4032826, 3923388, 4821238, 8376512, 4470271, 3227481, 8087294, 1672895, 2515867, 7198770, 6965743, 6093207, 6201998, 2804490, 5987257, 3474132, 5818263, 1213221, 3992831, 6107321, 1681018, 1506046, 6950433, 2573581, 7107012, 633100, 437009, 440695, 7808299, 3847524, 2871743, 1131391, 1136901, 6588403, 5618339, 2118648, 3850726, 174386, 1787494, 5498702, 2117448, 6035646, 1781570, 2452991, 4203583, 4872548, 1741208, 4395634, 2332049, 5352181, 5729824, 2563876, 2666362, 7904344, 8161966, 276990, 7780010, 5811155, 7297876, 5577247, 7015500, 5171524, 5950108, 3925618, 1891888, 884027, 3917088, 6302190, 6686183, 3426558, 4314909, 5072645, 2569603, 1658980, 2702729, 5299574, 2191357, 5547989, 3909308, 6002106, 5468592, 2116062, 2901876, 285824, 7300454, 1399895, 6536839, 7372521, 6684107, 3150034, 8192747, 956305, 5597780, 605553, 704411, 3120592, 273238, 356569, 8379572, 7024314], +[6626149, 6184842, 4559639, 3664809, 1188987, 6544145, 2698182, 8118771, 4144600, 140242, 1139078, 2045111, 6709581, 8048885, 8220443, 5311540, 2355211, 658576, 853096, 375812, 3940529, 4646013, 7519588, 2887320, 6921424, 2238493, 3577417, 746623, 6541856, 4156930, 4692206, 1500810, 658764, 1428054, 2565263, 4024975, 5569604, 8101088, 3646769, 6054368, 224793, 561663, 71854, 1596386, 1138682, 5140215, 4210574, 6109889, 5343235, 1394516, 440936, 5431025, 1123755, 3137786, 2662307, 6823315, 4296587, 4047109, 4495054, 2927075, 688667, 842189, 6859979, 4361088, 4767130, 1245178, 4814003, 6190357, 8353255, 6603724, 772986, 5115712, 856662, 2150540, 793810, 2237476, 5928899, 6653313, 7657516, 2782105, 686286, 2359207, 3301788, 3746464, 1051369, 447586, 1253449, 3987005, 3452763, 2330946, 4806, 6798325, 5614695, 8128093, 6752975, 3131978, 515815, 649235, 7086866, 1422756, 1857907, 2924238, 6362976, 5887214, 366680, 4666326, 855542, 1173140, 4018289, 1590071, 4109395, 3054615, 5126555, 3404998, 5478808, 1895573, 3575087, 7215808, 3681348, 4420836, 4232529, 2540140, 4376506, 5177001, 1718798, 6650961, 147943, 2491141, 2092304, 7430238, 3899431, 7659853, 7911378, 491458, 2512576, 2778365, 8287290, 3110753, 6619471, 4761790, 1814791, 5177889, 3414072, 6842552, 7507014, 7453053, 2066170, 969144, 3829595, 1122217, 6025527, 4662191, 6980182, 2769374, 5371004, 4033030, 8322985, 4212617, 6233537, 2558895, 1342314, 5887145, 224970, 6614366, 841896, 7912198, 5672957, 1605759, 6510974, 6581695, 6426644, 6083466, 3416363, 1576642, 2670183, 6514419, 1156408, 7259730, 5391201, 6603898, 7871533, 291692, 6819461, 4559221, 7471441, 400585, 4825159, 4355524, 5202799, 3370376, 5873891, 8289272, 6603383, 690207, 681601, 4800681, 3136478, 3580323, 1931518, 6133002, 2038596, 2159437, 1977880, 6432249, 4752041, 2192026, 288762, 3078068, 436432, 2280837, 2347979, 2784279, 492756, 3566762, 2713446, 2637033, 170433, 7722196, 1887036, 1966639, 876086, 6638310, 2669262, 5781417, 5529962, 2374151, 6050285, 7512950, 2251075, 7164284, 3152770, 1461044, 3598619, 4892098, 6769977, 3144734, 5284387, 2781969, 7487799, 8182969, 8005301, 501576, 4358214, 1354692, 4903222, 266272, 3558940, 5645481, 398886, 4190637, 4838149, 821895, 1519097, 6665848, 6801050, 1133685], +[6774059, 2102179, 2377584, 6403672, 5836339, 2437038, 3875612, 1383305, 5749753, 439798, 4497464, 2573238, 8325184, 5985321, 5879206, 7991253, 3954615, 4532081, 7378153, 2897353, 7607669, 7871557, 2052344, 3770882, 8109866, 379854, 3495435, 6418489, 4172775, 6017183, 5594945, 3014871, 1577489, 5744290, 1439450, 8240558, 7802307, 4844235, 1595073, 5747436, 1684631, 1012762, 199424, 6714455, 4648534, 3259430, 1717246, 2588137, 5904817, 1475608, 1683897, 33138, 8167545, 5010214, 1388883, 7682189, 8205879, 4369014, 1199064, 2707376, 3803449, 3958018, 2558975, 6116094, 1517011, 2496041, 2102656, 5665246, 1795286, 4305313, 7471634, 4038680, 3469101, 4191788, 4017111, 961110, 1538375, 2787213, 2895046, 6533616, 3839690, 4580654, 598350, 6869323, 4675920, 184069, 6196217, 6474898, 7884053, 2174497, 4680432, 7921244, 4686801, 5798428, 6676079, 4881357, 6011674, 5515877, 6040897, 3569047, 1687014, 5947981, 8063414, 5100851, 1113929, 7799540, 6306723, 7360386, 5555529, 1599010, 3193158, 6961655, 7342684, 4348279, 2804512, 4791630, 4604154, 7336638, 4465571, 1839495, 593541, 3773884, 5861736, 3533220, 4204044, 6111158, 8134914, 682140, 3714906, 1563735, 444959, 6349686, 8227695, 713745, 7060829, 2352291, 3980655, 5676051, 8327641, 5255103, 5485292, 4369112, 2090874, 4811390, 345563, 1494132, 7908940, 3143429, 3356413, 2253455, 4516289, 3803896, 4430722, 276037, 7070464, 5016076, 1170365, 5810533, 1468888, 1805911, 371939, 7091434, 2495127, 3653956, 7694087, 4603531, 3559766, 5790063, 7130400, 5681892, 5177130, 1088404, 8031013, 1360481, 1343760, 4438259, 6508023, 2689194, 6219683, 6121896, 3240410, 2023915, 5793528, 7489391, 5695883, 3500173, 2483629, 2088389, 854427, 2295117, 4400093, 4979605, 1825057, 1637819, 4867287, 2066572, 197344, 3748422, 5962671, 6832411, 5366526, 221300, 1086318, 4293529, 3800139, 6844685, 6173862, 2216196, 2485989, 4437816, 1562014, 3073611, 1306858, 6646895, 11537, 5338420, 2292763, 1278488, 4367567, 3220101, 4021396, 6394718, 371771, 3458726, 4055644, 1430384, 3041433, 6757771, 5550262, 63244, 3341132, 5324686, 403668, 1003946, 4864365, 5212294, 633338, 6718525, 2024173, 3233684, 7506929, 7416754, 1752488, 4394426, 857108, 1666296, 7646414, 7564059, 821297, 4062920, 6489464, 5233336, 7451138, 5559688, 3935773, 911345]] +ct0: [[8373033, 8364566, 3534, 8346680, 8373079, 8358277, 11564, 24947, 21052, 4504, 8380387, 8379636, 8372277, 8368576, 8371438, 8379841, 13012, 8369219, 8377262, 18148, 14402, 14008, 1570, 8358254, 24215, 8361215, 8378023, 19158, 7485, 10057, 8353390, 8371328, 8362178, 8377995, 8375273, 15204, 12033, 3031, 1237, 8352033, 22929, 8376043, 24947, 43356, 41536, 8370519, 8341895, 8350821, 8359706, 8373709, 8428, 21087, 8344914, 8372783, 8374932, 3655, 16482, 13133, 6028, 11680, 8379205, 8345685, 8365730, 8359398, 11165, 9036, 8360553, 7294, 10200, 8468, 9238, 8377810, 83, 8376470, 8362395, 833, 3583, 8371307, 7415, 5166, 871, 8365664, 4021, 11776, 20300, 11126, 11823, 24035, 8357262, 8367754, 13005, 8360546, 8377143, 6652, 11964, 11867, 8341845, 8362226, 8810, 8352043, 3706, 20835, 20640, 8363521, 6124, 8377923, 11315, 8357859, 19554, 8373686, 8352240, 24214, 16232, 8369301, 8379044, 17703, 13019, 9847, 8373512, 8372273, 8373964, 8375599, 3003, 8365893, 510, 8359269, 8366825, 8387, 15478, 6580, 8380299, 8367944, 846, 8361221, 8350276, 16461, 5274, 8376061, 8349827, 4213, 8377575, 8376065, 6512, 8375008, 869, 965, 17201, 4277, 22, 8373354, 7935, 8358158, 30057, 18346, 8360907, 8369656, 4903, 8591, 8371169, 11892, 7944, 8376495, 8377815, 17283, 8379420, 8347089, 8076, 2921, 8379403, 8371720, 15132, 8380279, 8374923, 7337, 8373599, 8376300, 8351520, 20027, 3597, 16135, 8379562, 8368867, 357, 4506, 8373062, 3802, 27056, 6219, 14986, 3208, 8349811, 8376869, 8371054, 32537, 27945, 22487, 4340, 24274, 8371840, 8361054, 8380384, 8365921, 3141, 1108, 8374864, 8372238, 8354770, 8376796, 4032, 8367720, 1362, 7197, 9519, 8361049, 8380368, 5972, 8356804, 17954, 8367227, 13718, 551, 11006, 9747, 28301, 8378772, 6336, 12399, 6292, 12733, 8366357, 10851, 2293, 8369244, 8371470, 8358869, 4193, 20991, 25172, 8363144, 8363897, 8366419, 8375057, 8378349, 19085, 29589, 10748, 22264, 8358286, 8358376, 8359514, 8365319, 11552, 12840, 553, 4769, 8324], +[8350538, 8376421, 8363, 14916, 8356087, 15252, 8372461, 8363779, 32127, 8368940, 29451, 8372748, 4924, 18150, 5450, 8368354, 8373227, 8369870, 21516, 31989, 8354226, 24283, 5733, 8363948, 8361732, 8346530, 7251, 8372702, 8362560, 17729, 28436, 8370865, 31542, 8356455, 11884, 4477, 8375716, 8368284, 8379031, 8371883, 8363543, 11279, 2284, 8343820, 8352653, 34470, 19952, 8374265, 8358928, 20284, 2825, 8361776, 5511, 15846, 2476, 6202, 14441, 13885, 8361460, 8376552, 8369782, 5094, 8339670, 20434, 9930, 22023, 24905, 6779, 8374433, 5659, 8361257, 8355073, 8364937, 8368429, 4645, 8344934, 17644, 11796, 10412, 2577, 19920, 5109, 8372787, 6808, 8368535, 29299, 8334154, 8366352, 8379572, 8373201, 8378063, 8351629, 23284, 8719, 4075, 8368274, 8374685, 10259, 8358952, 28654, 18440, 16809, 8356790, 8366507, 8363894, 8372637, 8359933, 8377660, 8376371, 8365762, 8374105, 8377818, 34021, 8376080, 8380092, 8376669, 1781, 8356852, 8367328, 3374, 8374831, 6132, 811, 18337, 8360939, 8376580, 2049, 2012, 25145, 10923, 1023, 8345699, 17632, 8372893, 11657, 5567, 8370549, 6053, 8358776, 9921, 14139, 8377113, 8379356, 17351, 5902, 4109, 8376906, 1418, 21309, 8378050, 3058, 14711, 8353682, 8366335, 27209, 8374712, 8376129, 8371680, 8360869, 5045, 8372911, 37816, 585, 15459, 14977, 8376463, 8356622, 8374679, 8363398, 1289, 8375650, 17877, 13495, 14849, 8374124, 6803, 8375888, 15828, 4102, 8378155, 17044, 8376041, 8363550, 8363803, 5452, 20963, 8372680, 7904, 8379891, 3797, 8353824, 16310, 8350493, 8379608, 8380197, 8367171, 10178, 6856, 6646, 8366445, 8367599, 8372758, 8361649, 8369276, 6624, 35364, 8378480, 13004, 15584, 23118, 8364530, 16428, 8375527, 7008, 8366751, 3368, 11336, 8366193, 13734, 8369106, 18154, 17646, 17407, 10008, 8368500, 3381, 8350928, 8377487, 12412, 18564, 1139, 8373232, 29538, 1138, 8362341, 7711, 20643, 8370617, 8376, 8353649, 8368161, 5130, 8361239, 21734, 97, 13506, 13268, 5409, 8362467, 24679, 8371758, 8372656, 28815, 8363425, 14536, 3179], +[8352700, 9310, 7029, 3298, 8354288, 8368751, 8376483, 8376560, 8375645, 8161, 14353, 8378176, 17744, 2312, 8356471, 8370054, 8378039, 8380024, 19885, 8342, 18543, 2468, 8371682, 8373492, 11123, 24666, 14001, 9416, 8374681, 8366253, 3880, 8368687, 8379155, 8379559, 8369838, 8792, 8351226, 5256, 8366488, 8368839, 553, 15485, 335, 9454, 15894, 13095, 8370830, 8367130, 2256, 8368726, 8379032, 18600, 3944, 15361, 5210, 8378840, 15724, 1465, 16789, 12981, 10450, 11605, 8374786, 8371986, 8360241, 8358501, 8368684, 6151, 18250, 213, 11146, 8369515, 8378214, 8377086, 8370198, 31238, 30356, 12794, 16555, 26085, 8364778, 8370152, 8367759, 9674, 18227, 8373307, 5880, 25331, 8380340, 12431, 12227, 8379882, 2531, 5426, 8366160, 8370227, 8367991, 8350702, 1155, 8352565, 8361609, 9091, 20164, 13525, 3865, 20760, 39207, 10439, 27218, 17026, 8380015, 12179, 8368901, 8364608, 8369696, 11499, 11147, 20186, 8362765, 8555, 14054, 4488, 10131, 8367320, 8374254, 8374813, 8361647, 22828, 8361051, 8351477, 8370694, 8355570, 5047, 8350, 26736, 11095, 8380030, 13813, 13917, 8368859, 2419, 30836, 8335, 6643, 8667, 8359489, 8374148, 8354661, 8373216, 8366125, 986, 14027, 15228, 26476, 34871, 8378793, 8345391, 8371660, 8349408, 8356972, 7645, 74, 5254, 8377626, 8376242, 8356302, 8364923, 20218, 21623, 26645, 9109, 20276, 5157, 8365730, 8364542, 1371, 8377645, 5697, 11340, 8378115, 8356729, 8377130, 8359082, 17014, 8369150, 8363692, 30155, 8345100, 34783, 8369701, 8351899, 7155, 8369623, 8377737, 16293, 4455, 8378087, 8899, 8378240, 20598, 8351211, 8372015, 3177, 4102, 8378321, 4835, 8357809, 4383, 8356807, 8734, 8360705, 8361391, 20022, 8350166, 8368167, 8369260, 7549, 8365164, 13911, 1238, 8370884, 1769, 8364278, 21833, 8347177, 8376502, 13713, 8368256, 2178, 13092, 8363996, 2006, 8363697, 8362831, 11083, 8363490, 15598, 7851, 8364661, 8379653, 9797, 8367319, 32562, 8355549, 1835, 8289, 8368908, 9505, 8350105, 8361217, 8373930, 8355059, 218, 10508, 1503, 8374872], +[23885, 9067, 13870, 8374717, 8375006, 8363100, 8354061, 3065, 8372238, 8374739, 8353195, 8372532, 8367737, 8369738, 4557, 8378531, 22363, 8375058, 8369175, 8359640, 8369253, 8373150, 12381, 8378538, 26264, 3728, 24786, 13586, 14372, 19031, 8367998, 8362302, 8358739, 8355097, 4704, 8374171, 20998, 8377750, 144, 8371905, 8377346, 8358984, 8379752, 8375900, 8361520, 8349650, 8357126, 6235, 7080, 8380056, 23213, 7050, 8354402, 9573, 8363069, 8368231, 20014, 8375034, 32980, 8371673, 19552, 8368065, 16305, 11513, 8553, 8373670, 6739, 1242, 8353359, 8368636, 8369567, 16492, 8367002, 8351441, 17150, 8375226, 8344798, 8367286, 3416, 2259, 1411, 8353278, 8309, 8362033, 8373533, 11240, 5644, 2018, 15941, 9656, 16066, 12486, 8360459, 8378338, 12407, 38279, 4506, 8362739, 12067, 8379224, 3294, 8366880, 16283, 8379311, 8365794, 8369693, 8357296, 8365315, 8376306, 17136, 11091, 4079, 8794, 32301, 8364501, 8374779, 2086, 8380405, 8363403, 8359629, 12272, 29086, 22684, 19099, 8182, 8373860, 9198, 19700, 862, 8373808, 8373664, 9971, 1662, 12264, 127, 8376849, 23112, 1926, 872, 8368141, 8344572, 8378128, 8357565, 8372154, 29083, 18247, 8559, 16092, 8354085, 1488, 8364149, 8352749, 16948, 13686, 8379657, 8379916, 8337168, 8859, 16573, 3857, 22630, 8375377, 8358811, 8364063, 8347661, 8379052, 7868, 2935, 13979, 7715, 8365052, 8364807, 8369757, 8377062, 15795, 8369413, 20091, 478, 10561, 12384, 9255, 25700, 25153, 8359568, 1300, 8352617, 8371964, 19152, 8374831, 8364155, 8365743, 2727, 8379817, 8374036, 8360656, 1600, 10827, 8371125, 8374686, 8368125, 120, 480, 6734, 5323, 6816, 8375346, 1128, 8379032, 3866, 41101, 2834, 13960, 5794, 12285, 8359391, 19843, 8364600, 28343, 8367689, 11025, 10822, 8344191, 8378590, 10920, 28808, 8368097, 8376801, 8367728, 8372509, 8369839, 2540, 122, 8380250, 245, 8364368, 8373723, 8373715, 9119, 8365748, 8372717, 8364754, 11067, 9834, 8379580, 14533, 3097, 10255, 8357597, 8361963, 8362666, 8365855, 23344, 10598, 38560, 8368476, 9914]] +-ct0: [[7384, 15851, 8376883, 33737, 7338, 22140, 8368853, 8355470, 8359365, 8375913, 30, 781, 8140, 11841, 8979, 576, 8367405, 11198, 3155, 8362269, 8366015, 8366409, 8378847, 22163, 8356202, 19202, 2394, 8361259, 8372932, 8370360, 27027, 9089, 18239, 2422, 5144, 8365213, 8368384, 8377386, 8379180, 28384, 8357488, 4374, 8355470, 8337061, 8338881, 9898, 38522, 29596, 20711, 6708, 8371989, 8359330, 35503, 7634, 5485, 8376762, 8363935, 8367284, 8374389, 8368737, 1212, 34732, 14687, 21019, 8369252, 8371381, 19864, 8373123, 8370217, 8371949, 8371179, 2607, 8380334, 3947, 18022, 8379584, 8376834, 9110, 8373002, 8375251, 8379546, 14753, 8376396, 8368641, 8360117, 8369291, 8368594, 8356382, 23155, 12663, 8367412, 19871, 3274, 8373765, 8368453, 8368550, 38572, 18191, 8371607, 28374, 8376711, 8359582, 8359777, 16896, 8374293, 2494, 8369102, 22558, 8360863, 6731, 28177, 8356203, 8364185, 11116, 1373, 8362714, 8367398, 8370570, 6905, 8144, 6453, 4818, 8377414, 14524, 8379907, 21148, 13592, 8372030, 8364939, 8373837, 118, 12473, 8379571, 19196, 30141, 8363956, 8375143, 4356, 30590, 8376204, 2842, 4352, 8373905, 5409, 8379548, 8379452, 8363216, 8376140, 8380395, 7063, 8372482, 22259, 8350360, 8362071, 19510, 10761, 8375514, 8371826, 9248, 8368525, 8372473, 3922, 2602, 8363134, 997, 33328, 8372341, 8377496, 1014, 8697, 8365285, 138, 5494, 8373080, 6818, 4117, 28897, 8360390, 8376820, 8364282, 855, 11550, 8380060, 8375911, 7355, 8376615, 8353361, 8374198, 8365431, 8377209, 30606, 3548, 9363, 8347880, 8352472, 8357930, 8376077, 8356143, 8577, 19363, 33, 14496, 8377276, 8379309, 5553, 8179, 25647, 3621, 8376385, 12697, 8379055, 8373220, 8370898, 19368, 49, 8374445, 23613, 8362463, 13190, 8366699, 8379866, 8369411, 8370670, 8352116, 1645, 8374081, 8368018, 8374125, 8367684, 14060, 8369566, 8378124, 11173, 8947, 21548, 8376224, 8359426, 8355245, 17273, 16520, 13998, 5360, 2068, 8361332, 8350828, 8369669, 8358153, 22131, 22041, 20903, 15098, 8368865, 8367577, 8379864, 8375648, 8372093], +[29879, 3996, 8372054, 8365501, 24330, 8365165, 7956, 16638, 8348290, 11477, 8350966, 7669, 8375493, 8362267, 8374967, 12063, 7190, 10547, 8358901, 8348428, 26191, 8356134, 8374684, 16469, 18685, 33887, 8373166, 7715, 17857, 8362688, 8351981, 9552, 8348875, 23962, 8368533, 8375940, 4701, 12133, 1386, 8534, 16874, 8369138, 8378133, 36597, 27764, 8345947, 8360465, 6152, 21489, 8360133, 8377592, 18641, 8374906, 8364571, 8377941, 8374215, 8365976, 8366532, 18957, 3865, 10635, 8375323, 40747, 8359983, 8370487, 8358394, 8355512, 8373638, 5984, 8374758, 19160, 25344, 15480, 11988, 8375772, 35483, 8362773, 8368621, 8370005, 8377840, 8360497, 8375308, 7630, 8373609, 11882, 8351118, 46263, 14065, 845, 7216, 2354, 28788, 8357133, 8371698, 8376342, 12143, 5732, 8370158, 21465, 8351763, 8361977, 8363608, 23627, 13910, 16523, 7780, 20484, 2757, 4046, 14655, 6312, 2599, 8346396, 4337, 325, 3748, 8378636, 23565, 13089, 8377043, 5586, 8374285, 8379606, 8362080, 19478, 3837, 8378368, 8378405, 8355272, 8369494, 8379394, 34718, 8362785, 7524, 8368760, 8374850, 9868, 8374364, 21641, 8370496, 8366278, 3304, 1061, 8363066, 8374515, 8376308, 3511, 8378999, 8359108, 2367, 8377359, 8365706, 26735, 14082, 8353208, 5705, 4288, 8737, 19548, 8375372, 7506, 8342601, 8379832, 8364958, 8365440, 3954, 23795, 5738, 17019, 8379128, 4767, 8362540, 8366922, 8365568, 6293, 8373614, 4529, 8364589, 8376315, 2262, 8363373, 4376, 16867, 16614, 8374965, 8359454, 7737, 8372513, 526, 8376620, 26593, 8364107, 29924, 809, 220, 13246, 8370239, 8373561, 8373771, 13972, 12818, 7659, 18768, 11141, 8373793, 8345053, 1937, 8367413, 8364833, 8357299, 15887, 8363989, 4890, 8373409, 13666, 8377049, 8369081, 14224, 8366683, 11311, 8362263, 8362771, 8363010, 8370409, 11917, 8377036, 29489, 2930, 8368005, 8361853, 8379278, 7185, 8350879, 8379279, 18076, 8372706, 8359774, 9800, 8372041, 26768, 12256, 8375287, 19178, 8358683, 8380320, 8366911, 8367149, 8375008, 17950, 8355738, 8659, 7761, 8351602, 16992, 8365881, 8377238], +[27717, 8371107, 8373388, 8377119, 26129, 11666, 3934, 3857, 4772, 8372256, 8366064, 2241, 8362673, 8378105, 23946, 10363, 2378, 393, 8360532, 8372075, 8361874, 8377949, 8735, 6925, 8369294, 8355751, 8366416, 8371001, 5736, 14164, 8376537, 11730, 1262, 858, 10579, 8371625, 29191, 8375161, 13929, 11578, 8379864, 8364932, 8380082, 8370963, 8364523, 8367322, 9587, 13287, 8378161, 11691, 1385, 8361817, 8376473, 8365056, 8375207, 1577, 8364693, 8378952, 8363628, 8367436, 8369967, 8368812, 5631, 8431, 20176, 21916, 11733, 8374266, 8362167, 8380204, 8369271, 10902, 2203, 3331, 10219, 8349179, 8350061, 8367623, 8363862, 8354332, 15639, 10265, 12658, 8370743, 8362190, 7110, 8374537, 8355086, 77, 8367986, 8368190, 535, 8377886, 8374991, 14257, 10190, 12426, 29715, 8379262, 27852, 18808, 8371326, 8360253, 8366892, 8376552, 8359657, 8341210, 8369978, 8353199, 8363391, 402, 8368238, 11516, 15809, 10721, 8368918, 8369270, 8360231, 17652, 8371862, 8366363, 8375929, 8370286, 13097, 6163, 5604, 18770, 8357589, 19366, 28940, 9723, 24847, 8375370, 8372067, 8353681, 8369322, 387, 8366604, 8366500, 11558, 8377998, 8349581, 8372082, 8373774, 8371750, 20928, 6269, 25756, 7201, 14292, 8379431, 8366390, 8365189, 8353941, 8345546, 1624, 35026, 8757, 31009, 23445, 8372772, 8380343, 8375163, 2791, 4175, 24115, 15494, 8360199, 8358794, 8353772, 8371308, 8360141, 8375260, 14687, 15875, 8379046, 2772, 8374720, 8369077, 2302, 23688, 3287, 21335, 8363403, 11267, 16725, 8350262, 35317, 8345634, 10716, 28518, 8373262, 10794, 2680, 8364124, 8375962, 2330, 8371518, 2177, 8359819, 29206, 8402, 8377240, 8376315, 2096, 8375582, 22608, 8376034, 23610, 8371683, 19712, 19026, 8360395, 30251, 12250, 11157, 8372868, 15253, 8366506, 8379179, 9533, 8378648, 16139, 8358584, 33240, 3915, 8366704, 12161, 8378239, 8367325, 16421, 8378411, 16720, 17586, 8369334, 16927, 8364819, 8372566, 15756, 764, 8370620, 13098, 8347855, 24868, 8378582, 8372128, 11509, 8370912, 30312, 19200, 6487, 25358, 8380199, 8369909, 8378914, 5545], +[8356532, 8371350, 8366547, 5700, 5411, 17317, 26356, 8377352, 8179, 5678, 27222, 7885, 12680, 10679, 8375860, 1886, 8358054, 5359, 11242, 20777, 11164, 7267, 8368036, 1879, 8354153, 8376689, 8355631, 8366831, 8366045, 8361386, 12419, 18115, 21678, 25320, 8375713, 6246, 8359419, 2667, 8380273, 8512, 3071, 21433, 665, 4517, 18897, 30767, 23291, 8374182, 8373337, 361, 8357204, 8373367, 26015, 8370844, 17348, 12186, 8360403, 5383, 8347437, 8744, 8360865, 12352, 8364112, 8368904, 8371864, 6747, 8373678, 8379175, 27058, 11781, 10850, 8363925, 13415, 28976, 8363267, 5191, 35619, 13131, 8377001, 8378158, 8379006, 27139, 8372108, 18384, 6884, 8369177, 8374773, 8378399, 8364476, 8370761, 8364351, 8367931, 19958, 2079, 8368010, 8342138, 8375911, 17678, 8368350, 1193, 8377123, 13537, 8364134, 1106, 14623, 10724, 23121, 15102, 4111, 8363281, 8369326, 8376338, 8371623, 8348116, 15916, 5638, 8378331, 12, 17014, 20788, 8368145, 8351331, 8357733, 8361318, 8372235, 6557, 8371219, 8360717, 8379555, 6609, 6753, 8370446, 8378755, 8368153, 8380290, 3568, 8357305, 8378491, 8379545, 12276, 35845, 2289, 22852, 8263, 8351334, 8362170, 8371858, 8364325, 26332, 8378929, 16268, 27668, 8363469, 8366731, 760, 501, 43249, 8371558, 8363844, 8376560, 8357787, 5040, 21606, 16354, 32756, 1365, 8372549, 8377482, 8366438, 8372702, 15365, 15610, 10660, 3355, 8364622, 11004, 8360326, 8379939, 8369856, 8368033, 8371162, 8354717, 8355264, 20849, 8379117, 27800, 8453, 8361265, 5586, 16262, 14674, 8377690, 600, 6381, 19761, 8378817, 8369590, 9292, 5731, 12292, 8380297, 8379937, 8373683, 8375094, 8373601, 5071, 8379289, 1385, 8376551, 8339316, 8377583, 8366457, 8374623, 8368132, 21026, 8360574, 15817, 8352074, 12728, 8369392, 8369595, 36226, 1827, 8369497, 8351609, 12320, 3616, 12689, 7908, 10578, 8377877, 8380295, 167, 8380172, 16049, 6694, 6702, 8371298, 14669, 7700, 15663, 8369350, 8370583, 837, 8365884, 8377320, 8370162, 22820, 18454, 17751, 14562, 8357073, 8369819, 8341857, 11941, 8370503]] +w - cs2 + ct0: [[4961016, 4702315, 465924, 1086137, 7810002, 3798349, 6339310, 972430, 6660148, 4493508, 8186370, 1911272, 4948125, 7727984, 7395494, 8379250, 6539211, 7063172, 143873, 6971086, 3825166, 916442, 2776825, 8274710, 8075990, 3483918, 5593228, 6028755, 5933635, 4625860, 1878289, 7583626, 3315789, 2414179, 3327458, 6075648, 2075191, 4169885, 7669613, 8250921, 4152025, 2633459, 4605973, 2685063, 4844002, 6262264, 7432857, 1302126, 7088003, 889870, 8152445, 1658097, 6014383, 5081562, 7130167, 6206631, 6659215, 7109767, 6955960, 4699552, 4884648, 170283, 2383145, 3752473, 6122521, 6811325, 7329016, 4468050, 119439, 3420320, 3900159, 2506674, 3441453, 6258628, 2204372, 2290717, 2079136, 1059332, 4823640, 889473, 2750918, 8113049, 4335420, 7970987, 4618416, 6532545, 7963623, 5177735, 7678868, 1172541, 8306846, 6737882, 5012933, 3533631, 2246226, 2769735, 4296440, 717819, 5238710, 6548166, 3782564, 6576618, 2609000, 10304, 7563025, 1314234, 5409788, 6764256, 5249741, 1119888, 7973108, 4407072, 760815, 5152275, 1970571, 825423, 1498089, 2928155, 3893522, 5988134, 1701822, 7451427, 5601730, 2175582, 6309713, 2421393, 2664117, 2738029, 394693, 495172, 2602357, 2492086, 8025531, 6558826, 385057, 7784114, 6174179, 7272656, 5599613, 6686187, 5810892, 5753000, 2298425, 6656112, 795750, 3079361, 138598, 6539221, 2918301, 434925, 3313172, 256767, 4565560, 6597575, 8375918, 7417829, 7862377, 487159, 7621711, 4963653, 7444755, 7348738, 2785622, 524501, 3682945, 2224097, 47489, 2046602, 1651456, 4971776, 6284178, 4864538, 7678689, 5964221, 6738525, 7097114, 2328068, 5985408, 3503142, 3809547, 6778605, 5630991, 4772513, 5561569, 561151, 6252919, 434453, 7428850, 7311032, 2652463, 4863641, 5087571, 8232633, 2479820, 3687010, 2350424, 7021586, 3414448, 3546401, 5027062, 7855265, 2701805, 7473252, 8009582, 5965956, 3317888, 6590153, 6671315, 3975305, 2001863, 4458990, 6138776, 7576710, 2586286, 190017, 7426709, 3058787, 2222047, 7848757, 7193254, 5238043, 5045346, 5942487, 355637, 7213046, 1762718, 28721, 706492, 3084540, 4428561, 5344270, 2184038, 12015, 2740265, 4074998, 2661037, 4564841, 1361689, 4791061, 970524, 5103650, 6089492, 7170211, 6130308, 795037, 6274358, 901387, 91016, 122914, 2705970, 5150917, 5144259, 5794869, 7524203, 1508282, 4264722], +[3600571, 5620933, 2255159, 147258, 4298184, 4086950, 2665370, 4655718, 5696220, 567494, 6748834, 5318161, 3544125, 1530641, 8378877, 39367, 3982413, 8336395, 3427706, 6187048, 2118350, 968897, 7799092, 773463, 4623912, 540520, 4953712, 3375994, 3626170, 504074, 7466532, 7259829, 353259, 2564546, 2321030, 3561162, 4423562, 7410237, 7663328, 6482969, 5380756, 2147320, 1489024, 987949, 3922822, 6716278, 7726571, 7759729, 4182503, 5098650, 3819309, 5438721, 3303973, 3333231, 3338244, 5722103, 6723086, 5585387, 7489599, 8350908, 1722317, 7030929, 4687666, 2858966, 39894, 451171, 6429121, 7909556, 1663850, 3369196, 1985691, 8019259, 6388019, 3004351, 824071, 1369557, 6529329, 455881, 5335646, 3082547, 2614089, 4076259, 349324, 5241120, 494319, 2582362, 994333, 92803, 2830161, 6955695, 3329895, 7183814, 3175970, 5316994, 2631404, 851082, 4638345, 5038956, 8304323, 5079732, 1876332, 6289548, 5665002, 248456, 6316423, 5900738, 895761, 1186531, 3252682, 1355505, 4948012, 2412807, 7909572, 2280265, 6697573, 8190459, 7296557, 8145155, 3302222, 6402726, 2063668, 5402975, 7337093, 552044, 7565599, 4834090, 6968601, 5960732, 1832616, 1260185, 5342139, 4253491, 1252603, 7954722, 2020715, 1781741, 4545442, 1913605, 8313072, 4435393, 5578861, 3324322, 3083199, 5955099, 5569980, 588375, 5265982, 1751765, 5619853, 6820074, 1744039, 1712332, 3597872, 5609494, 3582654, 8334920, 8274194, 4386057, 2577981, 4477346, 2775830, 5430484, 6700028, 8115179, 3150717, 2394110, 613784, 7985734, 6410211, 6187680, 2031051, 7955133, 1656897, 5473280, 6162198, 7428478, 2819245, 4300846, 4673993, 6369183, 6067414, 5645029, 542081, 3729842, 1240581, 4445469, 4911554, 542765, 7980849, 2631015, 3469291, 6907863, 2177426, 7942481, 2359769, 7571715, 2708707, 7033544, 5592069, 3128300, 5421155, 6811379, 3223549, 3945674, 3667873, 2869942, 5219663, 124514, 361201, 215657, 1627200, 7886424, 754326, 4206261, 6116293, 6660140, 6410057, 3676322, 2422962, 1427007, 335455, 1901900, 4231700, 2622272, 2585645, 7646908, 6668186, 7940066, 3593821, 7310381, 4311951, 8086107, 193533, 1440066, 5359817, 4276274, 3127653, 4916960, 7489500, 3197360, 1516361, 3687596, 1691463, 6666448, 1143553, 3544417, 7206331, 8180216, 7625835, 613276, 3867890, 5652794, 5705421, 6987476, 2294625, 6027301], +[4152386, 6181716, 4820864, 1866785, 1580305, 773074, 7807160, 2730468, 1229913, 3979645, 6973254, 3638932, 466240, 7054371, 182520, 5574843, 2412732, 2674990, 343331, 4820444, 1878233, 5587792, 8058716, 2952434, 4077744, 6740071, 8085844, 4021381, 7838656, 3162914, 5057570, 1921562, 2401873, 7725136, 488931, 6235126, 551555, 7908864, 3145853, 5043814, 2144029, 1966954, 2575762, 5025748, 6226424, 6515656, 6929898, 7087638, 2685941, 3385157, 5089948, 279462, 3956188, 1521332, 1808875, 3796240, 3741215, 5671303, 5127498, 3739271, 708981, 4388721, 3882436, 3196805, 5624354, 7165029, 7073922, 6211124, 6636333, 6955249, 2133845, 5142669, 6494867, 8139936, 63303, 589337, 8336966, 4316965, 969031, 2671280, 3643004, 6003619, 2889846, 4733772, 978320, 5010533, 6357593, 2310089, 3633918, 2425560, 6410995, 1939775, 6475947, 4900587, 4240472, 5434235, 6552230, 6782809, 4430595, 5170875, 6855603, 4316961, 382096, 480675, 4281278, 906653, 3623924, 6318129, 3911675, 2067013, 4389142, 5770806, 2502404, 4242887, 2858845, 4002310, 7986132, 7069152, 6750672, 5063136, 4127148, 3076688, 4407014, 6977677, 7118004, 4077631, 7541691, 3630603, 429034, 6190858, 7307897, 1470270, 3903096, 118606, 2208398, 1266501, 7438429, 7822967, 6683276, 836577, 8117710, 2662193, 39152, 7697360, 2137313, 3001688, 3355028, 7770948, 17067, 5821763, 2735689, 1087221, 4639669, 7787988, 1110249, 6571203, 1671296, 4374182, 4693821, 7393610, 2883813, 3224787, 453867, 5524268, 2624545, 4469157, 3551374, 7766352, 235954, 5046202, 7959696, 1516744, 2018699, 4289018, 5399567, 2175906, 7004384, 6489747, 6330339, 6793173, 3302372, 3195492, 8276739, 7215720, 392275, 3186655, 4536179, 1689234, 2452221, 4058065, 5923102, 5661596, 2772913, 7265202, 3238188, 4327162, 1054729, 4380465, 860506, 2571044, 3694987, 7311314, 6409517, 3234327, 1586762, 866153, 3705294, 8308007, 4884680, 434433, 1007187, 1410426, 7884899, 6113675, 2316168, 1745821, 6174613, 4206627, 4566894, 2639242, 8191838, 3667061, 6340037, 3963408, 2745460, 7054762, 2378355, 21484, 3409217, 1021677, 2290840, 4377207, 5251518, 7652799, 7799671, 455857, 5633880, 5895202, 582454, 3934053, 1300361, 1973777, 7496192, 900698, 4876327, 3762389, 55136, 4247888, 6236646, 4342480, 6187473, 7707508, 651639, 2950678, 1233331, 7796195], +[3098897, 1791815, 3623154, 2279743, 5716303, 1958542, 4514969, 7352891, 1814331, 3886942, 2337919, 6618702, 7794074, 5513235, 1106517, 5961662, 2122253, 3618400, 7819949, 4627643, 4200316, 2287725, 3135201, 885128, 4600011, 8304898, 1028231, 8065252, 329039, 3917722, 421864, 1866690, 6097871, 946933, 5714194, 3881848, 406448, 378072, 3756094, 760228, 1872465, 7030664, 2708659, 4476146, 1138906, 1184681, 4996840, 6861425, 5219799, 2896855, 3390105, 3000793, 2427752, 2603822, 1651570, 5632867, 618311, 8170355, 1286385, 5970073, 3881843, 7963372, 6900908, 8305446, 6253546, 5846263, 3174670, 3613161, 1106503, 2774812, 1665295, 8076136, 423806, 7279317, 4836708, 8143432, 5380411, 2325473, 2989718, 907460, 5675178, 7100032, 4830894, 7067265, 6273642, 1218986, 4534109, 5728798, 8169319, 3431559, 3343429, 3582357, 253891, 3863958, 1214304, 5615378, 7888606, 7415709, 665289, 6566272, 731569, 3379124, 5900009, 4377488, 4987816, 510667, 7889422, 260785, 6922886, 3108575, 1375514, 240348, 268138, 2755467, 2268082, 5626209, 6045041, 8026917, 5258271, 7746023, 5310559, 479218, 6449486, 5670658, 7472421, 6770244, 4563904, 3476193, 2086626, 5014476, 3431829, 5567542, 1975282, 4926846, 7595806, 1910087, 881479, 6710148, 7831021, 5298211, 3568559, 1131879, 6052493, 3439482, 5626008, 6557299, 569222, 6498773, 3633569, 5150721, 5268710, 2455252, 7556806, 505920, 5605462, 4579699, 5553976, 6152171, 4486033, 4159644, 1003935, 5905035, 6318920, 6092759, 61549, 6847791, 6458817, 4589202, 8010204, 2314778, 7194567, 7318850, 7915647, 3253679, 2364999, 820731, 7803833, 1231090, 6499621, 5852574, 711437, 395383, 6972830, 1163464, 1617248, 7014518, 5254050, 1285358, 6013061, 2402146, 6618819, 8263854, 3566135, 5712151, 7798561, 3381908, 7366208, 2475352, 2368293, 3506818, 1304437, 1726160, 3823172, 1830061, 1478444, 5292258, 5039814, 498937, 1889793, 3300073, 7036207, 5950737, 7699920, 5031914, 3417862, 6504085, 4192925, 1922563, 2838243, 6457681, 6785783, 1661697, 6095542, 7302284, 6489127, 3920858, 1107418, 2259847, 1895384, 7720782, 297889, 3729737, 4549988, 5162196, 5973859, 2244461, 6093761, 632686, 817105, 5010853, 193847, 8117877, 968642, 7284269, 1323484, 1169047, 7528162, 3962324, 3873756, 6288046, 995054, 7787710, 4042899, 2759087, 440305, 5542597]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] +||h||: 62, Hint check passed +||ct0||: 46263, ||ct0|| check passed + +signature: 3202542EF1E239D32BE1BCE5AE4AC8052D578899D653E368E11BC11C5480BA06FED24E83A4361E358121DA338108794DDBF93ED0FDE9AD07C50F983BAAF01E985F9A6F380C6B14148AC829B67467CCF9F2A16D2594DB895BBE6774F4DF57DF40239AB2C2FDA9FF98F9B1A2ED58F405631AB0B2D62FE573E82961B1495ABB2A572CCEFF02696899A6778F9127E1249AEBC8593EB8CDE2780C5E503DF4C6D80C449225E7A96FDD199973553EC15D964285943207447F1D6E8575A38522270AC356E200C1260CF4B5AFF21FB5EB8DD724E79029084DB5E26C1BE84D19C5C0DAF7B5D78384B57D3B915E37492604984016721CD3D532ADB65B3E7F2D93196A04E05303D3ECEF7C5FD110BBD61C18AA94C4C1606C4D542C82A55B0FD7E824BCF900DAE8926D6C8C1454BDA5C5C4B3788B96BFFEBC2A771F999FD1A2413FCB5142158CE3A8D06764931E1F465BC5D9F8FA18867650A2074472C361038B5B7BE8ECDBCB65268AC7AF4B53AC3182B1AC7BB651AA40AD4310AFC80631D1DEE6FF01186E4AE1E1B1797B8A6281F8F72EA57B77DE4C17DAAED4EDB6F93714AC56A04B61A411CBAF2C4DCA9A01767FC5644647250ECD8BD20C2168042A61477CE280FDC8BF91FCE5C7C525A7A56555BA9644E6BF90C8DE121C31CAE7178F56B0B2A332661FFFF4457BC6BBE68A092D70065CFA5F1022534B317CAFFE4EE7C19FE1CB374FBB0B8497B0AFEA62023680D9E54B1782079C7E090EE27FC7451C030DE8438C697C9436117A21A68B0615AF126C1DABF41EC1E39A4E488AD8EEEA11ABCE4685B7B50CC9B6666CD831400CA28B443675E8F93107EACEE1B287CF85C6565EF3330D07104A72E69164B2F64185688C91622775AD7E27F563CBF45B6BDFF3D9A2A8619DA4E45098197B0E72F559F3B60D201C81CE35DD3EC4CD7F2970F44D2BFBCF28D77A483E887DEA60E0BC7AFF1F1C0B0E703253DECE61B981FBBC9441935840025DFD196A1E3FBE956BA1756AFFF5958806F76CF5DC33C1D7E9C43DF25FE21B689D4245550D1F84BD226CAD79E48AD242B41CD10B387270628435A398E9CD217ABD388AF6154EA7B584F44A9D00870968880E313A2DF84EECFA6473CA3CD444416E6950F78A8AAB03AF462E07273AEAFC2B18ACDCDF7F0162963261C0EF0184700F4348E81A21404DE8154B5A9FF7B3EFE257556A480A066A13055E4CC01CA4C4F13FA74A33B15DE11511BFA41FB2BD70D6B09BD9D31ED6E3DF746411B35C587EF37487D7B234C4FFC4FF4D4875CE93E9D8C5D68C079A066B6D07D895EB61977BEC207377903D97877A04FA70D900C721AD009E0512CE023ECC6999FAC6BEBA12BBB7DBBC2D2C631E45018477E014E1206D17ECDA5DC7AFA24E9650A6AAC21EDD94816100E411C5DC32811C7628A5D0708309B1E2A6D8400D83E370423E76DB209DA20B8F20188205BE7825A9318E5F75CAAA0CEBA4F3CA801074426968F8BC1935830B7A3DFC07D3AC0F0CAFBAF805127604EDE45AB5E121A798341E0C59CBC681E49194D9B6D24CE563E38F0425D145A31B799AF07FF0F4D1E4E50928E8DE470900A9DF217AD64771F25165987D7524897B1C03C6A2220A93EE2F020BEBD37328C0FBC0A751F9601AEC1878B866E168BE948DA82CE3A80DE14E0E599558CE1634947335F68262B4F8FAA55711AA91192E9AC3DE2BCADD6FE6FC40910E9AA060B23C2FBFD838D760B235BE7902718491832CEA6910FE7A712068AEC8868524FB90E60926B5BF3ED8D4A10726D78DD64F8C83A907F8BE398C990300119A29B4A7756146E77A3D4C352FCFE015EB3C033624C2CDB43A9C1C6FA803ADE04F7790DC15615FE67D176B6826094ECD6F189124E307BA001D7C769F6A2A88B2006F4E300E85FC2AE85362F375A8DB00F23B12E87CD5D4EC5D635A8C8E974D4D2186FDC7CD73A2D7DE4F6D45BD6B9A6C6F6C24E0953FD059DCD455F1F9AD7FE01BCD351BB7A28D36C3A7277A544BCC3CBF2145D1FCE6AA1F278427026B79513010A07DF441F99E6D36AF18DF7255E46A3118B4429028D3C93689C28F95C407346F27AFFDFB4548BF8D90596F5EA3EFF931E37903E8438B16BEB8CF4CADA30EAC62BDE20BA3D905AE77755498510DB493BFBBDEE2EF1AF7C57B517D9E9DCE3DC861E151262561CA0038FB9CB9D44C421B9AFB4C8E260B08B257437998E8E60904777B86B4DE3BB33D5894B66E7F7DD1437F5B18C4D169D910B2AE5EB9F114680C8AA5C9D6A56FFF02DAC97430D2AF8B1AA166374AF5A4BBBCA6BC7A68DCA1BBF09F578E49B646CD23EDFE7C9002320ECEB200E35244DA38408D6C1AB67FBFC8F4D1E7FFA1183778FA3A596E507A42FC99390F4B78FC53313725E8E70111798DE45160B26217AFB38E81C315ED732C63FCAD5ED861D5AE901E3F8E34A011A2066A432F016A5D7FA626A6B09C3CED3E5530380C990F754A038243761145A591AE814C4FEA5F62B8DB21DCFD8E37C13E8FD212893F0DA9F656DEDE606F9665B1DDD250E4C0C3FFD55B91E4D62618DCDB859EF34EC7D99F618DDC754389A0CC397697BBAC7EAEAB94F93B7348CA02BF1C8A039162BF3428D532C464A785FD793875B89BE8C920A11B5BB54A290BE14A725065CDF92F102575BFCFC8325B6595DDE6E81FEE3DC65FACFA6C20D6F96F365D0FC6DB45E4AA9F852CD6F4A2E2A6DE867873E5F5B5B64449318A007EBA3B1976FCEDF4AC097D7F1033D6EF45EF2261C1D8CC696CD0EBABCC31E1646F9E0CABBF65806969913CB4EF213924F27142E8067BC51BD9267F460B3BB2F0B69A97CB47FBC25E4DD56781E2AF1AD93CF4F1D8B9136D8F144D27D6D6DF6B29CE568865E5591668E8D6FFBC4185525D5486DE774615249790526F3F4C29A256EDB6DCD41500C0F37140F2114A9773941B8BB50606666D38E76D6A6CC7300F6A5184C428A4866CDDDF175F98AEF74A8243587C436E9646E284FCF3965DD6CAA444A0AFBA1C04050F47AA539AF3A4E5338797093F4DBE2BF7919C7CFAD9517C15561E679428D1768DB77632738C44BECDB3686D2C793A5B66384CE3C57556B59454BA5BD9E9EAC1E4257735860EB7B6478804F23FC430D411A4A6EEC4AF1EBE026569C68475083058E8574D4B33BE929FDE5FAB363D0DB7C7B256996815AB796E27D0125D41B05D229F8E532DD93089EAE920B20313D286939732E0BEDCAF328FB6ED0D265E33ABC9B7BE7B87BDA7FB94C8CDB1F0726ED51BD7323682F473B3BF68564F1CB7FE7B67F38ED3D5DF369C9171B30040886D5105945CC2E3D117203A425F6263656C858ADCEAF707212E3543465355575F7080838494999FA1A4B1B8C0C8DB2527676C7686A5B6C8CED3E0ECFAFB1D5A6A79909EABB6F60000000000000000000000000000000000000E26353E diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt new file mode 100644 index 000000000..8bd9cd4f8 --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt @@ -0,0 +1,273 @@ +Signature Generation -- ML-DSA-65 +message: 4D3C4D952A1DAC151736AE9D0AD81CD37F7C492539FCC916A4B2251309E06CED54D7145868D145BC8D16F8B364E5D6026E113BEC4824F6BFAE3C9F6C8B888EC6B8254CE59E9E8E158EB04077841243EE3A89D25C0B30B4A64B723697330AA87663B20EA4513189558466D264C79088415EFA09DE9B64AB01B640B288D1D5562ED744E80CAF0B6E2C29FFA1C321129EBC70CAA73DCA7DCE899571260B2E7DA1B47CEC5BB00FD66AF8B89BB84392897BDD1A5EC7186670DB81604E0B949B5AB1D19522A3F0828D0E77B300A63EDCB74C48F9A01CA91816FBEE011A5B0145C6A0B4EFD5A3008A91E0B1AC96DD8CB9410D56A952E74B7FB684A0B166E5F0DF9AD100EE1C9E3B7B851B4CBF337A3328DB13977451E992C4A0B454BAC5E3A2D0E64D106DC47C216E0C0AC11B0F7C48589E573051133D01F29579C7E659F8FB8E6539B0F618D053F4323AD0237A58949F689458ACC109BEB7C81952A879A10BF8BC01CE057E936B62017E226DD66AB2470852C000A618B9B130050F6B047746D068FE7D3CC1277E4FF4400F372D50A85F469B4C7A35AA7FE88DD923ACEF5FFF47A95F971EFEA6B65D33E65F20173C5BA5A320DD16CAAB59AA7A7BB99956EB5ED54EB93E89C887A30D6D384345E21291B8E9C6CDCBE2671F810A058B858220146A2161B7412CE2DB817CC8C99528195F567A92E198330AAA418A5FAB754E27221A2165EC4D50B391BB8AB2BECCAA449CA1D4D3D5C17E28573048452EE4120693505515CF8D1E2F8984D363464DB786E9B8B7BDEDFA2301A21F3C469F013E27742405CFD0D15E70BE0560E8B18C82327861A8DF64200A51E69D2791D41E1E12BF371664270AFBBE1C84FF19D11D4C233ECDB8033BC79BC7967C410C13E8E3F9340F848510760DABCCAB6EF7BB87398B1421E5804F6D41ABC09E6542D72B87115F1281450C66AF3BF4FDC21CB9B8C27D0FC6DDFA73732A877CB7D7C09B8E9F4603D9865E4AF91C58E9EF6FD9A32C91EEAAEF170BF4F44BF586D789EF4571DEBE6FFF0C43E842617FA50FA6EAC8C7F70EB680BE717688188A430484F3388F6219A70EA38BF3C6DBBC7FF3A749D8C8E51A1365AE372988D248F9FC0F2B67E896CBC86D2AED35F7AD8D4E93C21DA09E0204C7DB92FAFA7119A63BD0CC00A029CE7DB93DF34C33ECF673D48CE3F40948DE86CA5467CC159960B329F560B20E5C8AC37AC4C8960B49B455075489E7217D6BC53AEE7C19B3FDE9FFF667EAE89AA6CE8C415E807B348A14598329A32D9E508C3409DF18EB426BDBFDDD88AEB3A9BCB9D84C2388AD79AABFA3445F80A9A68EF74096E34516CB5316DF599E5836F123271CF729472952E06C817A67C219382F22C4B0A16F7B7DDE9ECF4AF6927BBF4424F43FCEB1A48F1F2CBD98E7593464EBDE45D604B6AF95E32AE728D921B390F712ADC280257F4420741C0D29E0E6B98EC1708569381BC845420DB0C1BDC9A23DAEC209378A01703B9C16C10FC29763A52FEE64F0A728198513361CD981DAC739937FC472CCCF666E61DA3D90C3656F0BBDE6B942D8A0496C9BC703F7424BF00848800AAD519347A4747676C81088109A2B67848EE0A08BD1409E774434EFFE754BDECAFF2328EDC30FDB85B45488DE0A5D9052397F9DDB0F13865DCA85A36F6B43B84ED044E5F40BB960E56DD0CD6EC08C37B017FEEDBA4A7F20A174E1146C441DB99A2BF34BB8D8FCAEB874B2313AF2E20B01D38B56B42451047EAFF592236CB241857754F6E2DA3E4FAD070FD195B641567375B6F2744FE16996D7A73D095F5CFFDD50A96508FBECF802625E5F168DA08C8D5198BB2702F1CBDEA8221BCFC301195B717A0D174EEC9BB96E7C49E15CD2A26B933E0C6BB11D702F1A21D33BE48039E89E38C2A5E96F55A557359BBC8E191719EC5E5669B2F168912C9177B320A5762474CB2303F54E78F4DBB914EA354F8C9A3E81342A10ACF5FD4A3D8CD6F85A204E165D59E4FD12D5E5E900AC94DB984DD8A5A72372D8B5D8958EC7F9E64CEA4E560A8D9525CB24D3B2F36ED7D46F897229A776E7E422838D4E2B551B28D0127F2B7644F35FBC35BEF9D856EF447F699151F73AA70CEEA55F6193060762B28FA150A83344A2E23B9E5E1B103805DE85C520EACCFD67A5C390334B036028D4B696AE3D6F6DD80304F7CF915F564409AE65AB7504D8FED434966AA4D4DB3A3C90B160332FB8E6A33A392122E3C02F27C38E37B8B217958912D0AB987D232B65D7FDF3F28CD507D53F5CAACE75224AA3F63A4D4570627561AA146A32645C89BA18CD4C7D2AC0D9123C89AA7D4AEE9CF811DC877D7D0321AB5C7EAE86F2EBD61AAE681EB53EEA73D0D7532937AAF8F8A23E0AE64FCBAF782169422ADB6CE8F3F003CD2EE9EFC37E5EA1A8902D3D1246A89736C6C7C9A46FE2D2DB3BEC00E69166ABD213A6D30494244FEE28050BFAE566DCC91C9528883011F215995DC92E577421C9645478FD3C3D7D8FE06BD1824AA20B4A67CF9E8C2A69C031E4E1FCBCBB6170D60838C61AF3731C7FD4DE4D6277FD6652B63318CF093F7DF46D800368A71333BA657171ADCE4D360E249B32F49F93E38C22ECF79C89647564B7F83E26A59D403B239A25F7629CEC50EDE1EFB58D9017ED44CE34A3136518FA009C8BEC057BA054C794EA0F49F3C581FD91009835946742B806D115D4E2DD109E1797F7DB5575CF233980B2D072D247E704EF40A6DD6651369C67B576FA7DE4C794E469EB2DB8C0E424D07CA01753671116FDCB9B37C0517686D85111B8E12A530C25F0D01ECB20E259CCCDB0A081ACA5CD06E9FE50D79B9A7412E02F41B53CE3555E986833D253532CA5D27A4F0C72FB698CADE01B36CF94C5A05907AB3AC631455B4AE91803F2A3A83E9EE23EB0538840E1C9408F73205D7930AF7CAA7B4EEC2D47A71B99C07B09FB4BA1ECC036BAAF5230D600550CEBFCAF49A19D63B3B50016CC8077D97C27376E2AAA370BB3CA213968D242C11AC0A341 +deterministic: true +sk: D26EE59A89F67C98B20F890B03422C8027B776FC305BEF422CDED403AA705DA5DC380AD909E3C13A76F7F59BDD27A843F5F9A1B8E5B7B524EC445A916B7A44A15167716BC609B3EC0C653B210C6569BA2F8233E7F6E404B92EB21F39729FEBC06A644087C75FA7DA3DDC5B85A89F55C9F87A15014E27AB325EBEE0FE472B2F56205844860382534018828866441476575685641203648087665585183625516555420058871751602717711246115635711801273601127806468005021161768110481565564313804086156224775253365085726676702542128777015217656384221466167018541712560775653305356788352067346543727338426471425281415038533202656128851671300117755513452307351315370854301872372157587303156081110321112258736404438264705244308745330557358455160473004531650442427724303753273643545546151241081547412433078243311343703723518581388573234883002524138203118818106712726275005164485846703435423180316086652647174338637385102777331112452328027048826136833604027623520567678561007443300118026417762172470414100567684236755276750265038807023654313530500201746332586762137686700431224203777868426234607501375807606118643643343182854487118067375717216763686234631445727470521225615865012624304163885146650645168324156757125027631761181378335367286426405258178463767046744346405385558607416365312311607655783032614171118036426333182624236747864807656353823246577001576547601536137245648167881548355703441616635365661535127864121615460226475308628856173321321610874562553506784723735385386463056370235073236822680783606365575167372423481370273787321706274756640515832755317524417643527131782776733023626563226284344414664814180751873017473606630568447604505822478245472545717704487614714872060204431705604477512622755208754111644114533555057070674013756756613028602834613507528705643218236456378337317881601264762752721064334675027466164547381066466654324575825520882682277558861126808652842067242706502602822135413806761150412241623142132062854561462005282463527054222067084232463834703022563303120640700613028248186135862267807514517034808871887028651376603357053471356848232460123720236623604868157088117331708032612544633466027487881011822577840213584603838688167482874577534023608684717551178060878605807013607371146861810111452118252851727546664116442725718666627745565706128063346337837125850568444871521347471236266350161674306083251415448031242478881077307231468143328543380706263487802348512856658522881606460085147711847660265787214085344812640116713686701544018882508606025375436400485704788868344567583740386811256420867877166077712432136288331062381178450376522316153520153726880635206125157517874821078632831518110002578434628677277256811181641133083303108474041885821315177237034415740262877735530252155663683621050363812382062703541636072037888130651437727453164255777504346625374221717666355341021461642300018161635551232553767782843483040236111880701245700154018276321853454261144802277261072016656336147062500850107086111551067005227866654812551566680414042612307370316834001206560231706668641615317857425305313402768758031066346812502214187812016774121074448086641371280564240151566227543442570306101083513862873685631407576010245281712830883456301434255351012FADA607976F6837B0DBB68127C5D2CCA1E3BFE9CE0441DAA2FC7F0145F96BFA473054009EFB11184E4718B045758DAB9E41CC03A8A581F86F05C9D76F3BBEFCEE4A67DCD2CE920CD15B7241D7BF641B462A72E287C3DB90AFF454ED1C8B0794AC1055BC6B4BE81669FE7154ED8FAB43BB21E2D787FED316B81CE03DA5019A0948BF4F19CE09D317736CF91FDDD4B42B29B9AA0C87D58C81D2A74F22F44AFEFDF6DD0BB2689BC4E54C42DE56F5FC6796941631931525D7B51FED90894F88B20BC819BE6F19D080EFC03E23CB034D06EAA41D552CCB07B42AE79486825EBEAEE22CE193D5B9174E20491E23F376E3EA9731981FDEE6E0C837A07C9A6575A038522C8F36FF0E481625E1D693C69E2B4B4910B35CFCD7AFF76301F15E580C5F2E4118CB9754D90ADC4140E4AA8DA02FF7502514652F07D14B0AFDD6DE58EB896CF51E562E0B7972E85D334EE77E09E7882EF080275786B91E1BDB949E94BCFBE45333D0CFD6305746A24B4B2AF2311F964151D4F89D12D1D88A6149351CB3294926A3B05051FA1F613F4854A1727E3FC195F4F5F99D7A6F6766A250839C090B4D81E71C242A58DEBE5DDCA556B97DE9790DB89ED15CEDCF7EBC6D44DC61881BE060F905CBB77025694FB382A66A2809A759AE66DE102CF059E9339C26112F76C50B39EF61ADF393B92B69BD88F6AC5E7EED1FA1A8BA7201696DBECC8FB9AFC1946C744D92F3ED30F8834C398F42C53720510D16817A8074A2F12D27FF98CFCFFDFF7D94FF793993991FD44C799D8BAA5E0BCC789D3F3EF467104BDBF2092509E530F920DA1F663A5E58AECA50EC6F1DC82986D37EE6C195D64E2D4960BEFB09D3EEAADBF9873340A5B86D29DE380DFC41A99D7350D9A5055706E3C2037245DF35B9DF14B810772C3A40887CA02CF5CD42993E360852219A9A384647CE912D95DFF0E80706A2696296C7290214CEC72EEB016D34E03FBF5E65F4795E714B35DE183FEE6CC6C35E349289CC8DBB37AE9F968CF0BC3654D3B82175B0C5AFFD9B1D421B7DCE8015AFD77520A983E1C1E9EB0708118FA4BBEE072157E7CD8CE9381091D3F1D4FC3980E5F8C95D54F4E6BB7AF368AF6BC9B332B80D7F8E76C2E203049C3380C5E0F5299DD6E57CD59AED1CCDC998F2FAE72C29A0C1D4025C34E506AF77760228DC3B8B680AC8A2FAD784EA6B86EF34F1842E66F46FB0F68F0101425D16341825DD6605DF6310E7C9811F4CB81EC3C7AE7CC6F528C782C6D33D6883E895B3A06E3D3EA84B03E3603394B44A1A3C289871A59269F4B80F4C7CF404A4B99A529A574BE46AA6B52B4E544FB7022C90904BE1C767FB8DB744B9C69FBC503C234F6618794F71AD8C95E5087F54B4F82154454C0E7386F21EECC0DDBAF454382A973BE4ECEFE846E0C21B60B56448E6E5EDDBAE084132A1397F16314047144ACADD6CC342447DB6A65365747A63C404AE623BC3EF1703C18B14FDA178AB7392E9EB6D2C9045EEFC8A7368DBCBA7F09CC88D6EA54505BFB82373819FB990F0F64C6FBE421E35CEBD9B79CE77BDF3C8946C58C6071757284E5B53B56DFEDB2EEF928DC9AE02BA21A2B5E284E285C9A6CB05710E2634CB3627C52E577F7E5CA7475607A7D2CCF1452F9BA703D322F69A47F16BD9851C7528D89B59C03B426AEBB3B372328CA9102F624E901DC8A315524B941706ECFE0AA8AEB0AF8EC33D2E1CA203B489AE23C03D880B83D738CC277EB6FF1C7DD31886C639C6C658396F60920D8A0A4E58278D63E5B393295FE8887E8F9F6A64C10CA241F699B99D72D13722E42D4615D9F3D0545E320D38EF809076F4216428C29D130F2F83052B9D0BA4A8A1872A242BDC59722281DDECE5407CBBDDBDB0B8C04E9385AD9660D252DD28AA881166694207BB04F9A24FA92216ACAF264C9F1CC200A5E2CBD2694C91238A8972496097B3BD3785345EE7171A9EB96619722C64571DE6327CD0345B788871D7D5D0D84EF2A47DDE6680B7743AD61B164E558B672E4CC4B46D6E6C236C2133965C8B3C7D0F240AB0EDEC78E8EAB4C80040A037F0080FA3B15ACC3EEA34208065EB6E6E21DA65601454E6DB037C08B051A1942DAB90C92B0BDC8C572C52F0AEF84B85F0444A6C15E84801448DE8147804F796A1A05341E75DF015FEEA7E191C461D3D3D7B2D74A9C4C7E18EAFE0966C26731F0A960461DE0387A917A6BBD645C4668030642D70DE30D9954556CDACDE00F82219E7A3EECC8354FC5A4388195CE568016C7C63661559EF65E2FF09F1C98A6668C23AE4863B04287A3BB6210B3F5689A3E7978517B95B0D06A831F28A3FF55B6053E38535B2AA97FD66B42980CDAF9E5DB6F1212BC23CC740BB7DDF8CD40391C0190F62A0A2A287DCC2AB8FA65C71675619C451EC07F3D67EE81A6370EA2144D82CE63CAEB4FD76E6FE4979FBC149BC54A9236D4CF23CD5C09E83DE5BD888F2EB03008BB9FBA0CD5CB79DDB62E2F9F8F2E11B2210DDD11590E21214015085A3CD8DD1665AD81D28D552B214D91550FFB3010102098E6F7649A5E06057998E25B4F789B2FF356299C589B1CE03D4AADDC9177B47974FBE205516B3A9E88F0B3955F133C29C1EDB94969E89B2DA7B64EE423A51672521CB4E1008D0AFCF68D6172A174F0ECABB5FB7648444032E6443CF9C7FA4ED4E1728427C2804699A143EDF11CD6CF9F5AFF6341A69DE7B7710C223C799861242C0D68841F36D9200122381EBF94D22258B38375C0D25DC1E3EEE00E312433CF8032F46EA0A0BCA36C679F5FFC82898372D631FA7368595ED7CB6571E8C00C16AFA4F4791E63813141D800111C1EDCEFD8872BEA41B2DD159676F23BF85C7DE07A30D2459EB16B24BDAD322C177B174BA83EAEB352B2C0D8140B33D50B0C9F2DDD39F305F9AB4565D3ADF35550F023F346900C59903CB972579395840D6A89169DA96D7012A821632E66821591FD3731EB068CBAF5F18589E7541CB4AEB0C4859020D0A3B99887D12E78F690073D29A242682D4677E2F904DFD7266E0514F6E460AD2F1FC5CE875D106432C5F91D6246D80AE5C7D8C4E4EE122F5FC58380391ED536CA4F073E2B55F5ED19751479CB3A71E72E8F330E086981169140A8AD069A49B1FD4EB950F9FB9084D1E702B957D081709FC510D31CE2EB1E42AB474D73A793231EC274EE399257DEC4B9D0704265A77E745F4CD8F9E4909FB9299304CE6AC7FA95C3F47B210DA388EE748ABD41CDEB3CBB187A40BB3C3F4150ADA3472DDB398DF8D8D5865EF27F54CBD4164DB0465DF7443E1D7782A2403387EF0118E8EB10283A39072C36A46E724165F49ED170A8FCC00FADF037EBFC652810697CD7108A56989491BA2232BED54BA167DB9D526FAD348B7787AE71557C59B38D1054CBE9BCB45E17BB146ADFC04F6816334D3D815BF73FBECF1C9D437D3A47A7862C286884B638DD7FB64BE01B7981D7CC82A90938EBDD9664DEBAF0E03A595368B89338AB076BD22AD579D04F1C7EA075D220F8CCDC0B9E372F5194AFE834D28 +rho: D26EE59A89F67C98B20F890B03422C8027B776FC305BEF422CDED403AA705DA5 +k: DC380AD909E3C13A76F7F59BDD27A843F5F9A1B8E5B7B524EC445A916B7A44A1 +tr: 5167716BC609B3EC0C653B210C6569BA2F8233E7F6E404B92EB21F39729FEBC06A644087C75FA7DA3DDC5B85A89F55C9F87A15014E27AB325EBEE0FE472B2F56 +mu: FF253A11B6FB8185B2DD5713A30839ED8873037BD15F87FD4245F35C2602ED0062EDFF95E13CAFE61688DD4E3BC421904BC64F6F6CB0B0ACB706891C5AB1E749 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +aHat: [[[7070134, 1577377, 714885, 1093856, 3397558, 4823510, 416386, 2677182, 7683695, 4668145, 6900630, 2283364, 8186656, 2610993, 1791271, 4932385, 7777769, 7324490, 3763859, 4967778, 6252771, 5338587, 6369292, 6119713, 6927608, 5381550, 5204823, 5161654, 3364233, 6116458, 1093263, 7050711, 3072891, 754596, 6240735, 7976285, 7643032, 7677715, 5293315, 2705353, 157961, 2258470, 4131420, 7412157, 6010274, 2475260, 1247368, 4132148, 4425701, 1540943, 6581395, 6344713, 1635346, 1321960, 4017656, 720947, 5034045, 7076039, 6642482, 7345401, 4167553, 3924386, 2785696, 2280678, 6156209, 5174009, 8206167, 4544999, 6089892, 6114584, 7929603, 4787978, 3718623, 5961932, 7617187, 8334252, 1370275, 1201882, 5406198, 6585656, 7158507, 5499382, 4823835, 5949947, 684288, 4364299, 3229100, 6006999, 5487612, 4751791, 7820482, 7526494, 5941348, 6467601, 7071296, 5637739, 7831005, 7086466, 4396619, 955011, 7220606, 2368761, 4106716, 5252040, 7228202, 4432070, 2968966, 49471, 590903, 3285939, 281189, 7796736, 4141657, 5809408, 5847018, 568073, 2340243, 5192244, 4035953, 7165659, 2931115, 6169975, 5362495, 7918998, 5551360, 7306991, 1130479, 6520478, 1351430, 3661016, 5421526, 6653420, 1667517, 1576391, 4922551, 2112917, 5936905, 6156332, 6211337, 4631507, 3448511, 1580616, 5395030, 2097399, 5840546, 4846106, 7002268, 3392589, 7288967, 6920293, 6918964, 8202945, 2039960, 2555344, 476217, 5578231, 5557118, 3225898, 5104752, 775860, 3066826, 4131891, 7817361, 6358154, 3560607, 7559476, 4697643, 964817, 278186, 3789239, 2700828, 704179, 4735330, 4249857, 6391167, 7146078, 1900987, 2889062, 7922178, 5639842, 7781413, 258423, 4570650, 5372710, 6419056, 667146, 7043726, 4002367, 3929153, 2817541, 1116994, 7528299, 4579621, 3845190, 1340471, 6911382, 3893913, 4115090, 1848100, 4504340, 2088719, 8266421, 1051011, 469824, 5732015, 5353865, 5653453, 3856040, 5537923, 6728347, 3558197, 3446316, 7224753, 794316, 8046514, 5970859, 1414508, 5193651, 7534889, 139698, 2042677, 5956781, 8377287, 934274, 418688, 5939563, 6451912, 3662414, 5509430, 2412997, 5367001, 2811603, 7462125, 1396765, 6898485, 943966, 733426, 118871, 264329, 1758982, 6206336, 302489, 975495, 3287914, 4597453, 4120568, 1707565, 6067201, 4498297, 8182557, 2437779, 1715287, 7428063, 1044776, 7816011, 3165829], +[4600394, 5576201, 8016384, 4754202, 6787727, 592189, 4612121, 3394665, 7038485, 7473009, 6692465, 2051536, 6601222, 5197463, 4672049, 2025038, 1667946, 6052692, 7774795, 5688604, 7247763, 1428635, 5894966, 2914513, 5839959, 5734553, 7987834, 4799326, 2181784, 6550378, 4408623, 2258770, 8257748, 6166677, 142717, 6376651, 7744502, 5077355, 6520509, 75739, 1104942, 126571, 851844, 4102336, 3474371, 5027025, 2831056, 1366990, 289071, 3615416, 5434462, 5230839, 3292325, 6850488, 1257315, 999277, 4313023, 644692, 398461, 6615602, 1155298, 2696723, 2214961, 4945053, 6549262, 3714122, 5466750, 555748, 2274370, 1495559, 1805069, 1070000, 898692, 5133909, 6644258, 2345553, 3619006, 2122416, 3941136, 421279, 481001, 6853366, 4103202, 4978981, 4869144, 957457, 6743727, 5347573, 6414133, 2337889, 2326507, 8140605, 1035708, 7150185, 8339688, 5888756, 7466030, 5742694, 7887802, 2881573, 3225573, 6555422, 2383886, 105590, 301105, 2063062, 6488306, 7497115, 1254033, 2950238, 1736235, 24507, 7528756, 3912071, 5943519, 5057415, 3411750, 6030677, 5478015, 4981357, 5773280, 4666014, 47353, 2559833, 7917687, 6247301, 2978601, 4542059, 1142989, 3048192, 1745363, 1285088, 3637252, 197293, 6672651, 5870503, 2766404, 1188833, 587821, 7472671, 6203360, 7884389, 2546006, 5641590, 3377197, 5284348, 7247894, 4104048, 2718786, 5436886, 8102324, 1940845, 3771197, 7861884, 458464, 7801351, 5333681, 2598325, 870342, 3714639, 3234684, 5287739, 3012712, 3588566, 114530, 4169227, 1711214, 7681620, 5963941, 6222200, 2692964, 7118922, 971100, 4272009, 2156224, 1924359, 1050377, 971584, 2702083, 2355646, 3568399, 5737001, 3231290, 4899957, 5260201, 1488835, 5212057, 7268836, 7505957, 4191343, 6342250, 4487820, 3950755, 4353290, 2052974, 3253587, 4647627, 5519799, 2603523, 8349708, 8140359, 5702291, 6561273, 5125649, 2869237, 1904717, 2780151, 7997958, 4535572, 885804, 3658629, 2850997, 1018603, 3007571, 6521179, 1955586, 5331638, 971437, 6384475, 8205407, 4213799, 7957788, 8216007, 3679583, 5158657, 280069, 3822385, 5709964, 1538812, 5487960, 3720142, 1835618, 4655936, 58286, 5753407, 2542709, 290268, 5858428, 5458318, 852718, 5131948, 7555432, 8301049, 206141, 5130126, 7020904, 6707586, 5810176, 2445485, 6336048, 1032164, 1942014, 338743, 1029077, 6934368, 6468588], +[972540, 2699299, 6992252, 7518599, 1768119, 6369335, 4945635, 3994220, 7122543, 5589687, 909577, 6363532, 5980765, 39013, 7035863, 3743860, 5069334, 1839988, 3370968, 666144, 5511617, 7247538, 6108702, 5585177, 4071779, 1323965, 6689080, 8282554, 4778273, 1434908, 7977692, 510312, 2869585, 3776894, 6963287, 3762680, 4776150, 3713918, 3104329, 6672515, 3858734, 3131698, 11023, 5482889, 895810, 1326966, 5857099, 6776288, 1952598, 3324104, 3662162, 3611927, 6558610, 2167449, 4414099, 7901313, 3060391, 7021464, 7786345, 2691755, 3299926, 574058, 1697320, 3118193, 7221249, 7837166, 8379668, 2020127, 898776, 5960914, 7817860, 4495562, 6040508, 3382501, 3511900, 6405114, 26972, 7216770, 6173849, 4978644, 5320165, 7246859, 4216018, 4363277, 1138023, 3079114, 5248423, 5991608, 3932860, 2942558, 628487, 2413652, 4366476, 4673681, 2108140, 1057253, 2796924, 5112625, 7111647, 5093079, 3099365, 277612, 4311450, 2252487, 7864524, 3458, 1992314, 7582634, 994063, 5791621, 6399375, 7550203, 6336015, 8066386, 2745678, 6258621, 59068, 6258315, 4091618, 8048424, 8115559, 3539115, 2594410, 7626762, 2646855, 7750777, 2675159, 6518092, 7235079, 7980835, 3105870, 6887931, 3758908, 1235908, 2803632, 5491370, 384493, 6614281, 5069201, 7798449, 488482, 6647091, 4010539, 7971097, 6156655, 7108425, 2999824, 6879384, 1412221, 5925375, 6601723, 2670373, 5096232, 6033913, 1612790, 3671140, 5796874, 1395395, 6211142, 3787161, 2845271, 4479026, 8331376, 933790, 2768055, 532980, 6795975, 1422505, 2251528, 3955130, 3980811, 6000004, 654701, 2113823, 5309851, 1513651, 7654387, 1785155, 391208, 123272, 6765587, 3388981, 3520682, 5350176, 7739840, 5455245, 5380840, 4902637, 7910214, 7264112, 5808181, 2940726, 8024631, 6836332, 1858963, 4510273, 543016, 1372456, 7764804, 4273830, 6477514, 2082118, 1926085, 1609241, 4102493, 5181582, 5524896, 7564320, 6383955, 3488872, 1246262, 3428532, 3086341, 3294851, 7434087, 5494033, 4238181, 4119946, 7419729, 5732801, 3231033, 1626418, 8235140, 3737584, 7920005, 8137782, 521475, 2661358, 529050, 6854728, 2470389, 1974704, 34401, 8040544, 2967343, 2884554, 6051195, 8129410, 956705, 1322481, 5753314, 5814463, 6305566, 7043432, 5496717, 8097945, 2275989, 623632, 1271572, 7623544, 3977927, 1776856, 5375710, 4823342, 3075045, 1698896], +[5972107, 6909829, 3379538, 2413367, 1416819, 3881522, 4977221, 8163627, 8339231, 5841330, 3164909, 3818264, 699509, 5511477, 7897434, 6683877, 2033144, 6516310, 6501137, 1254724, 1179888, 3518485, 8047610, 7600957, 760188, 4137871, 5521751, 4476208, 8252960, 3932053, 2701612, 7545290, 7685184, 699340, 7071309, 1231863, 1098042, 2840983, 2362385, 398264, 6639042, 4124261, 6225453, 4327735, 6589835, 7294301, 993524, 8043353, 1248813, 1351244, 6606855, 5806755, 4162670, 6964316, 6283991, 3653272, 7316880, 1297541, 6687278, 7342668, 5390711, 1401619, 4597994, 1304472, 632345, 6993215, 3874486, 1754586, 7513700, 3224999, 608932, 5547340, 2747808, 8221735, 5502647, 5429395, 1736984, 3342902, 2240155, 505124, 1302903, 8248493, 6639528, 1835605, 7595258, 8169316, 2761999, 5195289, 3109234, 5596197, 2174190, 1946475, 900022, 6630572, 2209807, 1631072, 3632200, 6940815, 3444295, 6438226, 5845475, 6749119, 8102302, 7276799, 3071894, 5896879, 4437197, 7501455, 314375, 2423700, 6357442, 5877061, 5123980, 434290, 4045474, 1958302, 5628855, 8328222, 6732673, 6638496, 2082097, 6570351, 4526383, 5335945, 6813750, 7230688, 7455062, 2496154, 6270656, 3397844, 1511847, 5873485, 2949318, 3713761, 4709614, 1390335, 8322655, 25743, 7547783, 1259460, 4797995, 2993411, 8177022, 4129870, 792213, 7787284, 7838862, 2044096, 327915, 1884285, 6897191, 1550108, 3233028, 1723004, 4015377, 6814205, 5660776, 4038870, 2581711, 4282120, 6468791, 4542684, 7873460, 6647012, 3729263, 2907561, 8254443, 3508149, 8109887, 1152510, 4166692, 2435502, 262525, 4551375, 3725404, 3017465, 1097588, 1996871, 7389719, 2656686, 5442968, 3383783, 2176426, 5391279, 357399, 4044777, 4180211, 7839123, 1743844, 1279514, 2805428, 4538935, 750725, 3775534, 2915480, 3980704, 7562812, 4896244, 5586323, 2307723, 2544668, 476916, 8372877, 2996417, 5419712, 3528821, 3783845, 6019238, 5662568, 68720, 1247622, 3664839, 3472102, 4410524, 920010, 5253309, 2993530, 4744286, 7729440, 1339673, 1299214, 4549516, 5646506, 4126299, 2476700, 2386859, 1729965, 6897592, 2326252, 2707976, 7576752, 3554161, 4430940, 1366487, 5031951, 7046344, 5313068, 4511100, 1058298, 2945648, 5723150, 4867027, 5851263, 6624668, 3082492, 6658073, 252986, 2194080, 6240219, 2388749, 2457475, 2089692, 8030147, 3710718, 4418705, 7953275], +[5540048, 6431928, 4520140, 3607688, 7260986, 1555656, 1420144, 4740689, 7805648, 1053681, 6928727, 7387257, 7640489, 6578385, 2695980, 1776648, 5453283, 974087, 1164288, 305868, 7071233, 3675766, 6567652, 2789594, 5569208, 3228753, 1300411, 8333345, 2200068, 2329529, 958591, 2041262, 1973720, 4804504, 1915416, 3204916, 5510016, 5227687, 6433749, 6428626, 3877348, 2583885, 8102628, 992619, 3664149, 3092480, 1619666, 7792408, 2406676, 3896333, 7417072, 1205393, 1310661, 3436947, 2034307, 5059359, 3168707, 2913575, 6819048, 5073492, 4945171, 3479865, 2731087, 2678979, 6534408, 6373038, 2568611, 811564, 4881793, 152098, 7208050, 8227260, 6909975, 1976562, 768020, 2622494, 314269, 6253519, 7430809, 7266905, 2780613, 8313386, 2137963, 5439099, 1979073, 3109773, 2347208, 6970792, 3322457, 6471883, 6254123, 1759988, 3966716, 3262914, 6532485, 6534469, 2739252, 2127976, 6512270, 8314243, 2476408, 5881110, 6580132, 3293943, 5610536, 7378443, 12628, 3273903, 2263840, 6212143, 3949279, 1722468, 6389743, 3856924, 5759351, 5982056, 1747094, 8273559, 680513, 8019696, 2188548, 4893553, 1815112, 79638, 1929058, 5853563, 6390713, 7253270, 1196522, 4202311, 6334634, 3077922, 6681668, 6576554, 4206801, 629913, 7561973, 6362547, 7296816, 6101986, 8236614, 3356536, 6994571, 929090, 7964160, 7973755, 5424610, 6433301, 8007614, 3950770, 749601, 7759101, 5471056, 4387926, 2698040, 8232396, 3905290, 3344668, 918898, 5432028, 631641, 5565334, 5345041, 1622467, 4826500, 2324025, 1322489, 981037, 7690071, 1692104, 3619263, 5680974, 4288873, 3412683, 6846496, 4610307, 2041768, 151633, 2903726, 7425339, 3365295, 856787, 6160756, 7801828, 6932746, 510465, 3630964, 6803192, 4515031, 1968691, 1058129, 5282979, 6408800, 6173469, 2131889, 7679147, 5546028, 2355640, 5095342, 6146034, 2756280, 454153, 4517755, 4844354, 4623589, 6859868, 4225446, 7507287, 659357, 2542537, 6957926, 5921372, 8145409, 5369426, 3848963, 7479403, 13807, 4290493, 4820978, 3154197, 5886875, 3937350, 7541699, 790295, 2139682, 3865273, 6864811, 1625381, 6308908, 770500, 3590623, 3469918, 2289088, 725804, 7626622, 1334992, 4652194, 7116728, 7155231, 1364062, 2123876, 872174, 1285717, 7679430, 5516989, 6092067, 1148254, 6560247, 3228256, 6660234, 7692679, 6062510, 6462493, 8252954, 1158600, 5929690]], +[[7693815, 1882484, 167998, 7297973, 6736964, 4929570, 6173364, 3586617, 5884687, 1748356, 3958478, 585800, 8272285, 7394928, 4253234, 8081619, 8001842, 4862556, 2452673, 8219333, 1600163, 359825, 7082101, 5796579, 1825863, 4610247, 4508878, 2799529, 2082327, 2627255, 5184417, 2071591, 8173573, 26307, 6560694, 8257511, 2205991, 3633725, 195183, 7544409, 3636038, 488902, 5677811, 3494617, 2226346, 2631124, 2860900, 7541544, 5369562, 6077539, 7099136, 5837822, 1812140, 6457498, 5005971, 7289942, 8242991, 2004849, 299815, 1928652, 7809896, 2023930, 4304933, 3206119, 2046977, 7160694, 1666931, 6829733, 665196, 5688120, 7796254, 4728752, 3500865, 3953888, 7135376, 5060938, 7640093, 1189947, 5318512, 3986017, 549805, 1541556, 5801279, 8033885, 3854316, 5428577, 6405091, 1680009, 186189, 7488252, 3225890, 2000284, 1937243, 6629532, 1870652, 1293543, 7471158, 365231, 3283680, 896598, 1289920, 7599035, 3466017, 7568415, 2312291, 5605697, 6734233, 2982547, 2239497, 7374565, 7293493, 6010640, 4126370, 3171305, 1787695, 7907523, 7088243, 6066451, 219035, 485205, 4812440, 4425528, 4754285, 1459621, 4847568, 45111, 7219282, 5766748, 6780103, 817056, 1204877, 5091332, 2114728, 6073904, 6360684, 2099669, 8139714, 4000574, 5446966, 2673438, 2875704, 2989869, 7749150, 6399027, 5325314, 2120088, 2408395, 6286621, 5208901, 6476228, 660533, 5599865, 6734800, 4361538, 7039821, 5520358, 7188623, 5341164, 7191702, 3411656, 4351247, 4923980, 966671, 4747179, 561961, 1000559, 4382588, 7315692, 5100494, 4153344, 832702, 6291469, 2167824, 6794097, 2735430, 5163643, 1458049, 7933491, 6416720, 2780890, 1844064, 4606962, 4739506, 3642544, 6776759, 240495, 4435920, 1502123, 5998081, 6140373, 6545443, 2764530, 2950920, 1762135, 6356507, 7524461, 1651034, 3907084, 4327558, 4750211, 2007666, 4073125, 197162, 1726879, 6090561, 5473656, 6659062, 176763, 588658, 2642573, 1369347, 3752909, 4922845, 2973784, 3700489, 5370132, 1633652, 7736880, 4551565, 6852385, 5027866, 3670823, 7228556, 1743029, 1996195, 6144078, 6617034, 5700657, 5522881, 4933902, 2311223, 1405833, 2485769, 4596471, 1660051, 179276, 4415913, 7422425, 7832333, 6675773, 153330, 7674919, 6408569, 6567276, 4468493, 564681, 5337224, 5481650, 7889117, 5871641, 4584925, 643903, 2905210, 4384661, 1795662, 2959446], +[6322209, 3641383, 4061442, 4222050, 7955807, 6955885, 7866524, 6921045, 6540249, 2599322, 1359674, 779263, 520439, 1298739, 2483885, 406247, 3920846, 4870383, 7326149, 6104691, 6847808, 684952, 6955550, 3490063, 7218064, 8174201, 940272, 6862253, 128026, 4697463, 6802409, 116586, 4282723, 5284544, 7006832, 7832897, 4513465, 1816085, 41318, 92329, 1958176, 647713, 7696556, 4460996, 3869482, 6131656, 7036177, 3882551, 4251946, 6494439, 7340950, 260910, 5617524, 5011928, 4663769, 568818, 3858984, 4746144, 5040757, 2546151, 821229, 4999014, 2753041, 1231045, 4843429, 6701924, 7163628, 662706, 1357579, 4693787, 3858070, 6823788, 5927383, 5141298, 4048818, 1293972, 1254295, 4458189, 5381838, 6148908, 4038380, 3788600, 1170743, 1297459, 2373572, 6096908, 193087, 3420598, 4090697, 8174988, 1632445, 7600867, 4692251, 7568828, 4609312, 4535614, 2938424, 390705, 7244184, 2303642, 2018130, 1455422, 2150911, 6037543, 5098665, 955929, 6876240, 4048623, 2370806, 66087, 3903081, 4687271, 8085662, 1067769, 7574807, 2976993, 3744389, 4347833, 2387972, 4592672, 2152791, 247113, 6586150, 2120348, 7007578, 7756302, 7840423, 6376820, 1933533, 3775630, 4245076, 5515219, 1520554, 3566619, 1508089, 531643, 6350022, 5067717, 2676135, 6997572, 7207946, 864374, 7104084, 1623619, 3619163, 2120277, 938296, 5620579, 2991261, 2202835, 6361727, 4911816, 7873258, 5904408, 3619574, 2151546, 7047743, 5559566, 7990319, 2773318, 5317338, 5585690, 3899005, 7148722, 5273289, 6712889, 1870740, 1683743, 2936021, 5882527, 851580, 152857, 2646147, 934611, 2911380, 7068350, 3535600, 5032133, 5357603, 2412716, 2150167, 3740630, 4877645, 595288, 6652777, 7381927, 6565684, 713365, 1231386, 5419868, 6761803, 1782060, 5427622, 4107038, 2402049, 625204, 7349870, 4314120, 8114372, 4774291, 2084084, 2593208, 5576343, 5471719, 159188, 5881562, 5895398, 1676480, 2962096, 3071171, 3125356, 2190975, 3837693, 6701217, 317334, 5534985, 4107636, 7672832, 192002, 3681401, 1186509, 3932293, 3263250, 8106241, 4229724, 5596370, 3343337, 4595443, 457224, 1317477, 8366823, 3015643, 6133711, 4430180, 1681046, 412290, 6679244, 4091999, 3569755, 1288557, 7562480, 3644450, 3798596, 5572772, 3213447, 4622547, 6798378, 1333303, 2144264, 3555217, 3219746, 30188, 6053984, 3166014, 7723531, 5124311], +[3756672, 7736103, 2825780, 2943756, 2727290, 2561738, 1484911, 561739, 3096000, 7207241, 8069616, 2741085, 1636416, 4637829, 3443392, 3478709, 1819290, 4719933, 3770168, 7092075, 1019321, 5180817, 5455123, 4622116, 719498, 1736653, 2936988, 9387, 6455606, 5256153, 195582, 6320087, 5030526, 3989229, 4165343, 2017455, 761018, 6897417, 8363952, 2761283, 1782585, 5262849, 3497566, 7731736, 6835996, 2062971, 3495079, 1774629, 780273, 1215276, 7911639, 310156, 2001586, 5364660, 5821516, 6499960, 8366932, 1373905, 6073141, 4450215, 1056303, 207754, 8021044, 2598291, 461653, 2428221, 6629739, 3644919, 524949, 1745299, 4648795, 2160481, 3092495, 3595379, 6280876, 4619932, 26747, 1122340, 1272013, 6691410, 3877943, 6518188, 3679354, 5324912, 2421265, 7278907, 4777431, 479393, 6748856, 3380229, 5087260, 1166559, 5211690, 4239131, 4661653, 1563707, 3940838, 445288, 3416981, 4767077, 2218621, 3804273, 3736829, 2018266, 1569575, 7361787, 780888, 4876754, 4703319, 6124290, 7340628, 3649094, 6590588, 7720530, 6238131, 4136708, 2816946, 1983424, 4412260, 4194338, 1110737, 4061073, 7565434, 3100356, 4426980, 390680, 1190121, 7980855, 6514996, 7523964, 3699173, 748578, 4124545, 4875977, 2835927, 2702043, 7114400, 4742082, 2460943, 3448368, 2352829, 7519293, 6260861, 5490490, 1104243, 1510509, 7193332, 6203351, 3705552, 3704991, 7648980, 5791073, 621125, 3072467, 3588489, 5223225, 960313, 6319739, 5958466, 3784189, 8043021, 1622929, 1899237, 3702089, 6476633, 1167024, 6793044, 3679107, 2587333, 5698562, 5415190, 5682952, 1305364, 7304625, 8245036, 6455824, 3767514, 2021300, 7714850, 5276933, 1744660, 6046758, 2254730, 2283801, 2308265, 7790653, 8320823, 3354773, 6863690, 4564693, 5178961, 4822319, 6318902, 1506412, 3190632, 5259097, 3853857, 5530324, 7723450, 530507, 4369102, 7220371, 6368518, 5759618, 7341620, 1740302, 4523473, 3977819, 6526553, 4162646, 6961077, 3502207, 5360855, 5945530, 5363357, 7195389, 3586887, 2597499, 1878458, 3360362, 1736137, 3139438, 1172375, 1996672, 8136034, 2568680, 1065260, 392823, 5774940, 3668862, 2166047, 2447344, 7238524, 5568342, 7377980, 3528786, 5382220, 8068273, 782950, 339002, 2302524, 7875602, 2849279, 4714021, 5168868, 2521974, 3176807, 5656280, 2276804, 6779758, 494143, 6538752, 8172021, 5389904, 3071338, 229213], +[2358292, 7885884, 2619080, 6346122, 6834595, 3600178, 5974397, 3369626, 78273, 2728173, 149354, 1700462, 3882482, 5793306, 5220481, 5999073, 6077871, 6408969, 2313920, 706918, 1997558, 3595359, 5040032, 4145802, 1002088, 3662841, 1044884, 7240852, 7627909, 8335737, 5271511, 2809065, 4615252, 5491072, 7348200, 7134316, 892056, 4315106, 2095030, 116453, 2839605, 8168939, 1267469, 6080844, 614486, 4676441, 4895193, 1353833, 5420760, 5663510, 7565030, 7890505, 4793806, 7085374, 8035075, 2285947, 6850412, 1478307, 6806441, 1618642, 3675249, 1451767, 6723492, 4674510, 6366901, 7276568, 8321434, 422434, 3001747, 2161632, 6413809, 1403104, 1490244, 4289684, 7132551, 5008327, 6726388, 887250, 2540975, 1533585, 5649064, 2218456, 6103991, 1277866, 3015715, 533086, 2250567, 5948382, 990238, 481535, 6209169, 3550878, 3704493, 3182391, 3081558, 251514, 1771009, 6663074, 635375, 5710734, 1719980, 7112636, 7635906, 3235044, 890243, 3767858, 3871471, 848957, 6783749, 6393788, 3780983, 2983612, 1398257, 379364, 6304952, 1816175, 7890478, 3206007, 4102895, 3152700, 5729135, 2380559, 4607316, 7201524, 7000430, 3737477, 1898272, 461163, 2853736, 4034706, 6536824, 5938428, 6717627, 7345531, 7727663, 2455232, 683189, 1493814, 2325099, 5761267, 3620763, 2797755, 4905629, 6190654, 104046, 3729698, 5663825, 7476279, 4578690, 2770512, 5443005, 5074678, 6784027, 5158665, 4078965, 228749, 2694194, 5036274, 6313353, 7130628, 7462409, 6386713, 1700581, 4225626, 5598787, 5487370, 649719, 6927919, 7180844, 1793853, 3910772, 6448610, 2097613, 6162784, 448266, 4606395, 7819312, 5120210, 5811342, 7741218, 5602768, 8202048, 4836554, 4287499, 6761865, 5783623, 3799589, 856169, 5486457, 86375, 6377651, 5114007, 5307960, 201225, 8216304, 822361, 8270022, 3526704, 1761244, 138335, 5699744, 3913726, 5205161, 4234110, 8260224, 1376922, 5688707, 1512298, 6496912, 2995942, 1129037, 5094785, 2625858, 6891134, 5730945, 7664399, 1212625, 3731224, 6881542, 1595079, 7812953, 6600900, 6827071, 3541951, 4501427, 1036484, 4836218, 6226888, 233745, 3899899, 6504428, 6755630, 7058058, 2272315, 5686767, 649087, 7723701, 551380, 6742764, 7447128, 1200591, 6421714, 3944399, 1954637, 5505146, 6007249, 2932714, 4364963, 4077051, 4021706, 5064969, 6455512, 1822156, 2259294, 828607, 406191], +[4035469, 2801957, 171288, 4726722, 3288158, 8059965, 7103846, 983085, 3664218, 6895647, 4725799, 933159, 7665089, 7873980, 7188661, 1754032, 6765385, 2744063, 6473697, 6603300, 4019825, 7049088, 27735, 2603903, 5007594, 6698919, 4749724, 2970941, 764834, 1090298, 5632050, 2934895, 2154901, 8237956, 5297025, 8318516, 3302349, 4600209, 919622, 577203, 5388082, 1468723, 2752849, 1658076, 2430310, 1150554, 582769, 4226013, 1452138, 7856144, 4866856, 5268123, 7085876, 2650151, 7597544, 1238691, 6581657, 8144596, 1427984, 1989195, 8162508, 1142916, 8284421, 1858024, 3554196, 7142255, 7299230, 7425229, 3997055, 859566, 4709804, 7513118, 1747877, 709700, 4349065, 4002938, 7083359, 3562856, 6460455, 7208699, 7558680, 3769811, 6454770, 8229541, 6137983, 4047144, 7804011, 6284572, 1301356, 7100947, 1283269, 4390448, 8258350, 2366803, 249945, 5228757, 4821903, 4689548, 4972443, 1682084, 4970859, 24328, 161901, 1949687, 806110, 7608261, 6864235, 8360641, 1711159, 3806282, 2346341, 1749729, 7469462, 4661825, 271775, 1384486, 2063630, 3243088, 2272574, 7343921, 7167659, 4060211, 3915126, 6781780, 2329066, 4796015, 2610612, 3022006, 749208, 7094228, 5747174, 1260351, 8272435, 916440, 558066, 1327994, 2783898, 4064862, 2421588, 3470645, 1987582, 648294, 1406680, 6585273, 1854876, 7543310, 2879653, 7901754, 3848674, 7039494, 470087, 5480039, 8018121, 6424366, 8094720, 1473130, 4459546, 4007847, 412662, 8061230, 1132637, 1643113, 2118756, 4422556, 2981527, 4186777, 961917, 1161367, 6138904, 2507834, 5230225, 3343960, 4586757, 6485721, 3011705, 6364321, 6320810, 5702120, 3929687, 2592402, 3215581, 5788247, 3583302, 6787465, 7098911, 2405636, 1870338, 3287625, 5154229, 4985532, 7403400, 1468403, 8280488, 6963349, 7562028, 936845, 1326398, 8099005, 2254121, 2716850, 2186346, 4123578, 7115115, 7814420, 549474, 1974772, 5649664, 4536299, 6247305, 7893691, 2955440, 698400, 1436850, 2885211, 3126869, 6771994, 8320740, 4437202, 4006735, 5721579, 6944843, 8346331, 5532188, 6527433, 811661, 7401089, 1861972, 2202096, 7849519, 246527, 4568089, 436208, 8219038, 2756585, 206974, 445236, 3841676, 1957571, 3808239, 5188818, 2020073, 4497323, 6775618, 2840919, 1314046, 6936276, 3540045, 2390515, 4452041, 1490301, 667947, 2896248, 1053604, 6052970, 2458066, 2596887]], +[[3910367, 2228457, 6884424, 3462238, 1063668, 3561936, 5476453, 2654213, 2909876, 7106050, 957368, 6179922, 7084838, 7718859, 4539874, 603612, 2971058, 3232649, 3882157, 242143, 5966074, 2539005, 5131158, 223274, 4975229, 1619020, 5604115, 3884179, 8261362, 6165885, 8072385, 8146835, 5160565, 3102719, 7533302, 6729761, 3722903, 6858607, 2503266, 2382025, 8073865, 8168522, 1432024, 6407140, 7233118, 1705485, 6228732, 3090297, 3560107, 3583390, 6931711, 2844972, 3767623, 3067011, 4433148, 5497539, 3723625, 7081532, 7527914, 3461095, 7825067, 4532647, 4274854, 7163005, 3683963, 3003250, 7500148, 2146357, 6047390, 2064036, 5356383, 4795924, 2817643, 1935428, 7879908, 2101294, 3086759, 7718228, 167413, 1053616, 3315442, 1996249, 8256765, 3991153, 4735369, 6398679, 1026625, 2015589, 3683442, 486537, 5253956, 7459072, 1934341, 4411978, 637811, 1439557, 8156704, 5359234, 91909, 1557739, 3704089, 3789081, 4119816, 3860121, 575308, 7685137, 2564828, 1516816, 2532876, 7368096, 2227404, 5367387, 3853872, 7732649, 4195742, 2967018, 6582053, 4511117, 1792550, 4755844, 3445894, 4754027, 1866524, 346768, 6981533, 1016621, 6298342, 806420, 6968086, 306544, 2656678, 201127, 648044, 3115900, 6826525, 55627, 8191798, 893032, 596016, 6363503, 6779602, 6289454, 733550, 3318134, 356577, 2177969, 1107500, 4873590, 3733588, 5084957, 438461, 6513759, 3539737, 4989516, 1254692, 2238854, 5487899, 6805766, 1958863, 6677839, 106418, 7083910, 3790469, 6396790, 7451796, 1950029, 1103797, 1609133, 2052066, 7701577, 2159490, 3265741, 4844327, 1672224, 4132356, 6460005, 2716063, 3768134, 2393795, 5863915, 1583049, 1908150, 1031469, 2054794, 1838255, 3434711, 3432765, 6558554, 4308405, 1803407, 5309833, 6250761, 2296040, 4949718, 3201439, 4744356, 1072930, 7731718, 5348914, 6067356, 2648243, 6083542, 8140313, 3712827, 4493962, 7778298, 4998847, 36742, 5417447, 4244218, 7211730, 6586563, 6831326, 763957, 3627303, 6524902, 1152088, 2808044, 7096088, 4799186, 5349583, 7213968, 3753195, 1563369, 7616695, 633486, 7215467, 8301978, 4774382, 2001320, 1516480, 1004405, 2950346, 5647137, 5453897, 5628666, 4315157, 4376363, 600417, 6940487, 4730649, 5151519, 652210, 732903, 4250606, 6892214, 4303095, 5921039, 3746161, 3353434, 5721771, 4065668, 6478833, 6660046, 7936996, 4261083], +[5378232, 5519568, 2355810, 3621403, 5539526, 6187133, 2653144, 6109264, 1730233, 8189627, 499940, 7783460, 833940, 4477684, 2045325, 5885297, 6984345, 4388026, 1079881, 5874265, 122313, 1943074, 7594897, 1305742, 1862534, 6248389, 2691285, 4923809, 8130997, 7008875, 5698602, 7086629, 6178518, 6579692, 4606344, 2901588, 5303340, 6761970, 2984821, 4702431, 1728972, 7714698, 4341053, 2995356, 6957019, 4958529, 3863814, 977827, 5297520, 4642633, 549572, 5420178, 2908131, 6762098, 7215334, 3869182, 4217291, 8220278, 3463118, 2765199, 600163, 6813710, 1173334, 5683258, 381988, 7820562, 6506503, 7166247, 3342831, 3698129, 4310784, 2284071, 186716, 6566115, 6278221, 6856302, 5881026, 7406499, 3288717, 1050314, 6507863, 2287516, 3204019, 7633001, 7754103, 1463830, 7771401, 6410495, 891372, 4782273, 7479723, 2006984, 4929558, 388890, 4134533, 5335354, 954387, 7928970, 4459966, 5177744, 6408930, 3022173, 7553307, 7866347, 6207115, 3832721, 4238462, 6641491, 6067244, 6160973, 2899785, 6131915, 2781095, 4308389, 2977666, 7350224, 4806890, 635528, 2824939, 6976672, 1158457, 7259189, 3845871, 3083866, 785129, 8176387, 5636564, 2395814, 7344953, 3593714, 8358884, 2601000, 540222, 2639816, 3742184, 636046, 142634, 898643, 2537432, 5072039, 5986331, 6541054, 7837094, 4558652, 3250767, 7584036, 6294681, 6189173, 1582821, 2780369, 6062455, 4522430, 3841559, 2638465, 5228066, 3730307, 6638190, 6311935, 4636091, 2138840, 7866730, 7748280, 439873, 6098115, 7033343, 8266676, 3387673, 7843800, 5801100, 4818283, 7661043, 338985, 5618912, 5790698, 7332316, 4988265, 7270926, 1366668, 2972283, 6567252, 5181152, 7926761, 2122551, 8071258, 4143213, 2878259, 1309688, 914364, 5467523, 2912492, 200102, 2531388, 1235659, 2519176, 1477947, 4606921, 7296170, 8076122, 742207, 3818833, 5051033, 588625, 547456, 8258174, 7944609, 4277846, 5896672, 1771745, 6627981, 1767923, 8099791, 3091208, 7095235, 1772442, 2528699, 8303486, 4964405, 3916502, 5768158, 5575577, 2709084, 5233488, 4461827, 5341935, 1552101, 4093582, 3202478, 7261692, 7417357, 3549472, 7975921, 1546998, 4412096, 4174489, 3784283, 1949058, 1690762, 5073231, 7162061, 846725, 2034908, 8052784, 2453721, 5602524, 2245985, 6412959, 5795220, 4250156, 4940466, 3055634, 6639046, 5186132, 1434572, 37074, 614382, 3802312], +[5436353, 5274401, 4212034, 936401, 3815775, 5644067, 1365496, 7212505, 7623262, 7348927, 4429029, 6758201, 4210369, 1383162, 49214, 4227716, 6344440, 5701425, 733605, 6793090, 3206873, 6655299, 3234008, 2989593, 6230709, 7978148, 8291411, 6342949, 2040880, 4519697, 464252, 6067351, 221790, 4964161, 740625, 4177070, 168342, 898238, 4371996, 677710, 6635182, 7908077, 7615091, 6780788, 5873272, 7246868, 2207487, 1651751, 8326726, 4668667, 3230869, 4164443, 4774338, 4338492, 4876751, 1098402, 1078522, 5119349, 3057530, 8066207, 5095839, 528216, 8276836, 4360736, 4156767, 5986862, 8255635, 3780563, 2069353, 17919, 7120858, 6195475, 597983, 215615, 2665097, 7600860, 5851044, 3237114, 3349394, 3786690, 6622086, 3145294, 2788299, 7494984, 5527854, 1053149, 3487085, 939407, 8331201, 1807550, 2886683, 2972286, 2529737, 2557773, 5989245, 3172412, 1767779, 1563470, 5057859, 937549, 6585369, 7362223, 5853469, 1469596, 5050573, 36104, 3701261, 330682, 3116096, 4630492, 813079, 2130234, 3205887, 3596534, 7598404, 7629766, 3653200, 4274662, 4262627, 436270, 7684970, 1699282, 8263952, 1733120, 6364734, 2624342, 7422938, 4282363, 8270185, 2817614, 54422, 8125817, 17461, 6388071, 4506669, 2887562, 4916951, 4395622, 7244707, 3272383, 7348019, 985071, 5091114, 7225084, 6583593, 7400179, 727486, 6564146, 308586, 1048188, 8250425, 4735141, 4398457, 6775980, 5762240, 6935921, 1625074, 1507334, 3326439, 2174796, 3800220, 6354817, 3469442, 4740236, 7134547, 2600800, 3036585, 3332703, 2378565, 3025430, 1226150, 4584968, 1584386, 4183116, 552722, 1121406, 8039922, 6987828, 8324164, 6382626, 3027994, 7453037, 3769251, 1739495, 69340, 4751084, 7306130, 7014399, 4700566, 8062945, 7826860, 7394745, 591395, 2592720, 6421885, 6808176, 4661651, 7187771, 5441974, 164194, 309966, 425154, 3794776, 3854098, 8312524, 6630102, 6172682, 3364239, 6413624, 1067524, 4404191, 4274687, 1646184, 1274730, 7477107, 6946766, 7880989, 1961387, 8215781, 7546117, 4620949, 8057551, 655965, 7274095, 4283198, 2222040, 5407101, 4925800, 3906733, 1951352, 1867810, 2643711, 6675346, 7018179, 5682890, 7515128, 4953882, 5879585, 1772086, 3864228, 7407145, 8258523, 6131764, 5330660, 2475741, 6790557, 5268386, 6966218, 285605, 7352203, 3935001, 3690979, 239344, 5714330, 7402683, 3635018], +[4868571, 2112075, 3888661, 2844204, 7580130, 1181296, 3470083, 700792, 6026967, 5505833, 5544653, 1434462, 432836, 4320907, 4843976, 59541, 5586428, 3183362, 6455239, 5366173, 1084079, 7848185, 3896816, 2557875, 6198548, 4590575, 7060133, 162686, 2615161, 1918971, 7205994, 5178573, 5520375, 3978845, 5884665, 4162504, 745613, 501213, 4878715, 3242085, 8056748, 620794, 2320079, 8151017, 8197215, 3666991, 2050124, 7868455, 6526057, 4445020, 1609241, 6110839, 8085596, 4549261, 5621436, 7857957, 4187534, 6031927, 5702355, 1192339, 1959694, 6887757, 6855844, 294554, 938996, 7762509, 2020608, 596913, 3758436, 3991460, 577373, 5271042, 2194983, 7528222, 4153479, 6092217, 1598135, 2735556, 21180, 6224817, 7920225, 1959518, 3296883, 4548943, 578306, 3895072, 1921527, 6462541, 671817, 6803640, 1200407, 4174657, 7377920, 1786222, 2060466, 1760498, 5274434, 2551822, 8156246, 4718344, 7014539, 864132, 2413743, 832648, 5971725, 4692096, 203643, 414796, 1059343, 3344095, 8113893, 3739307, 6160714, 420883, 5661995, 5822678, 7262718, 4280344, 7384945, 6489499, 2087483, 2375128, 2195168, 3861342, 7840279, 5428816, 3612009, 8210268, 3847915, 2246453, 1486951, 2543940, 7988280, 4654624, 2710480, 8146317, 1277963, 3875790, 6469274, 2323723, 4371796, 6725450, 2775285, 1726688, 6173723, 4014490, 2250509, 4567166, 5015390, 4328935, 2307669, 7892718, 4503923, 4141122, 2379652, 6265269, 2495940, 2701991, 4424169, 5053846, 3255440, 7512386, 5392875, 5246897, 5926299, 7959528, 8228585, 2699079, 3295782, 2630977, 2502580, 2440697, 7480612, 6001043, 7083205, 4323683, 1934558, 4111227, 6769488, 3130183, 6197469, 2282524, 650130, 6039456, 813118, 1042901, 2239326, 713988, 5511280, 769356, 6447023, 2338001, 1940520, 3615476, 7780851, 6895020, 3730210, 7276099, 5465437, 3416882, 4158471, 8013608, 5154275, 2371114, 6451181, 7621580, 1170278, 7056972, 7990183, 2952654, 4133994, 7876696, 6311839, 864745, 6454862, 168047, 2306325, 1912511, 6632572, 4069327, 5873730, 804704, 8249667, 3945970, 2007521, 6114710, 1922092, 3094844, 6316281, 3785849, 461318, 2005180, 3984409, 6315913, 4719925, 5908530, 970374, 2711592, 158663, 3251054, 2233548, 1200644, 2493559, 5973230, 8369965, 1587871, 8117328, 7767154, 5252999, 2119863, 5178068, 3797695, 292757, 1385933, 2815883, 3820572], +[1455975, 7617044, 6476902, 6055551, 1343603, 4515127, 3948099, 4839790, 5385735, 2746859, 3925963, 98578, 7421098, 817772, 2516427, 1652567, 8218176, 1758473, 625106, 6937317, 6905812, 6869640, 1443970, 1467285, 1346589, 2014111, 7805292, 6259857, 7246507, 4564981, 7045751, 5796313, 7656873, 539995, 5378074, 1931521, 2106800, 3555888, 2466776, 4882888, 3865168, 829888, 6598063, 139406, 2316106, 8345094, 314666, 5545676, 8050720, 2101, 8277504, 4867492, 4273751, 5098854, 5692628, 3051206, 7441864, 8159258, 5869938, 6253981, 5650668, 4807537, 2830829, 2383669, 3968995, 745577, 5492235, 6095574, 121392, 6781178, 3309785, 2738250, 7590504, 4196881, 1027472, 2615057, 243908, 624530, 3598563, 7079612, 5947285, 526998, 4472426, 282327, 4050210, 4764226, 6172677, 6576325, 1010130, 6708952, 451403, 1421242, 7881636, 6171108, 7314482, 809506, 6463549, 489448, 672619, 2858380, 4321538, 2954945, 2806419, 7684200, 2676223, 6914942, 7814081, 6566590, 5012038, 8112003, 7025175, 4890020, 7833243, 4634271, 431983, 6524294, 5091213, 6709805, 2421300, 2321144, 7049893, 2086597, 3656856, 3380998, 967639, 175204, 1607906, 4186122, 6804190, 6617915, 379354, 4661933, 5327410, 3198556, 8279090, 3238863, 228733, 2057470, 4478494, 6260126, 5680331, 4958456, 1913878, 1683389, 2618488, 1650427, 5335236, 7914171, 2086005, 319422, 4201269, 8203991, 4322050, 5943000, 3895173, 4146035, 1653430, 2996318, 3774196, 5327031, 7024970, 2706738, 4345649, 488193, 222406, 4502510, 8112207, 491368, 5171991, 6565230, 4208345, 3270968, 2514842, 597645, 1589217, 332312, 4184298, 3271587, 4112324, 3156618, 5609699, 2697281, 4511068, 127519, 3190572, 2363768, 3398631, 8030276, 5261264, 7701974, 3084902, 1534471, 4564576, 2827373, 3296043, 2407668, 7851695, 5815286, 6705916, 2463877, 7007480, 7230111, 2942615, 5998681, 7854906, 5338053, 2399716, 7694259, 984730, 3847526, 5401956, 4651057, 5465961, 2569872, 5785033, 8209083, 7272007, 101195, 5958569, 1339422, 3916462, 421926, 4700976, 4482072, 4759531, 3501830, 4581476, 3672715, 3592595, 6254976, 574072, 242336, 4970725, 1045214, 6972040, 3659484, 6727442, 1999563, 5713105, 5979935, 3471699, 647430, 7824348, 8317082, 6249166, 216838, 5533718, 1333364, 2144559, 8075253, 3592196, 8184470, 3699292, 146503, 6489090, 7968488]], +[[211455, 5110739, 4010153, 1816649, 8238857, 64, 290833, 2776837, 1384620, 1232467, 2532554, 7695847, 1084507, 4063883, 5429493, 7859004, 6434758, 3592383, 109901, 4007253, 5323915, 5151790, 1840389, 202415, 157989, 7585285, 6592821, 3705493, 2585464, 1520219, 3816927, 8053479, 6806044, 903742, 4986828, 7463859, 4985825, 2452049, 2033248, 92232, 8220226, 2566188, 7492261, 7433593, 2303502, 3762015, 6691216, 3678125, 3947320, 2073553, 154768, 1583379, 2445923, 3888124, 1888684, 5149761, 2170266, 6943702, 3731815, 7227612, 965427, 5877129, 2189291, 3807866, 5010281, 779179, 5864549, 7045922, 1108785, 6438704, 130268, 3626884, 6501514, 1253173, 4376520, 934191, 8368094, 1206714, 1816947, 1412891, 7329113, 6062172, 4197377, 5931821, 4568950, 347147, 6788905, 3820907, 6571254, 1501583, 91246, 6426659, 6607828, 5787161, 7895756, 7487909, 4787802, 8343736, 2517461, 7795424, 5102461, 3213526, 143098, 2510703, 4067150, 5984942, 8359640, 6181802, 4135644, 2379441, 4640385, 8075595, 166923, 2223553, 2382291, 3265566, 2567207, 3408633, 1727100, 154784, 3723481, 1114749, 3038482, 2410835, 4401472, 1590922, 124248, 4258784, 6861877, 7655957, 3143406, 2441884, 5353512, 1889851, 4680168, 7408350, 7535522, 6694286, 4408842, 2228309, 5642791, 2244144, 3209022, 5852834, 4663288, 3224664, 6966917, 2307867, 1519912, 5431268, 2932763, 6333388, 6166831, 5842485, 2829454, 4052657, 1486725, 5377268, 677989, 1774381, 4011353, 4105984, 587010, 1584571, 1959905, 1020061, 3611119, 4638622, 7810086, 7539039, 4489990, 7344330, 1757066, 1024612, 5945592, 2562876, 7714648, 4047999, 723100, 5244614, 2633572, 6502064, 3934460, 3143179, 1696079, 3131920, 7506584, 6399455, 4223208, 1769592, 7381558, 1282280, 4284521, 2209873, 7622483, 2002686, 3451416, 2430236, 4778443, 8268653, 1250343, 514343, 1896423, 2261542, 6017733, 6971890, 337147, 8051217, 8136682, 1760774, 7958861, 1717732, 6303548, 7082373, 3863359, 6561436, 7613045, 2630273, 3239782, 7406239, 3547589, 2812086, 3940837, 4194550, 4916477, 5179760, 4131967, 7392612, 8353290, 4478699, 957910, 7592263, 8146789, 4684695, 5646212, 6281157, 3130395, 8075967, 6043183, 423745, 4535138, 1658381, 4443719, 2204637, 1548109, 1430750, 32905, 6364664, 7646520, 2919121, 3181257, 635085, 1071546, 5099860, 2534083, 2304975], +[2247242, 4979366, 1683095, 8098528, 4971454, 6741551, 2121295, 7003273, 8331843, 5522362, 2035899, 2167623, 549411, 3728812, 6480582, 8337303, 7874247, 200635, 6451686, 977534, 2503681, 2019608, 1938821, 5522510, 3558508, 5087213, 5715405, 630911, 1863937, 5839077, 1744417, 2815452, 2472926, 4601112, 4577894, 7662551, 4452700, 1397541, 5686523, 3782405, 3391582, 3330770, 3820268, 8313216, 7288365, 2810699, 7580267, 2272426, 5591991, 286930, 6431173, 1757181, 7602624, 7897941, 6936488, 7686464, 3989362, 4317259, 8004431, 383821, 1743192, 713246, 5936887, 4414066, 7139384, 4322596, 7266041, 1087730, 7262206, 1531610, 1783481, 1934616, 315536, 3316192, 332329, 7839907, 3874876, 2101050, 5453877, 7243570, 3387996, 5285306, 1715391, 2596433, 1242317, 7235138, 7534674, 8077609, 5566433, 6491416, 5628451, 6138334, 3347187, 3459850, 1815251, 174698, 6339315, 3575735, 6547746, 2634118, 3993082, 2543690, 7612339, 1487842, 1556105, 1188637, 337706, 2535754, 5210747, 5320900, 5395651, 488266, 4507838, 1220843, 2728288, 5370929, 5035483, 1851390, 3465354, 1546559, 2212736, 327060, 4392314, 5440996, 5335943, 2715353, 1068813, 2991090, 3752829, 2302112, 4206799, 8377732, 3541425, 5967333, 2024171, 423385, 6388068, 4570083, 1076313, 1042826, 76293, 251354, 2273277, 1036606, 3562410, 2996125, 8378846, 4450004, 7733315, 3123971, 7246223, 7673089, 2115748, 2853166, 8329895, 175729, 2236466, 2434050, 1368508, 1975084, 4393336, 4967847, 1137861, 3990219, 5484252, 3444076, 4311716, 5862762, 2486904, 554649, 3601440, 2314300, 7260555, 8368707, 1354939, 1335747, 3285744, 8043060, 6231519, 8192534, 8272985, 5165903, 3510357, 3704761, 1538679, 1903391, 3410398, 3314999, 1839507, 7673733, 1820058, 7237445, 2896179, 2668167, 6462756, 612124, 2345465, 6703244, 4487818, 5908110, 5817089, 16790, 3503689, 7344990, 8325039, 4804471, 3244319, 4123956, 2617552, 2550107, 8000910, 7714723, 6876053, 2325545, 4551463, 6754130, 7653668, 6254934, 1821010, 2735524, 1176303, 827506, 5354927, 4677520, 3565402, 2776524, 7288687, 4323423, 841826, 7411216, 4499836, 1314582, 6685565, 4813622, 4352880, 6777043, 7710397, 8174566, 2368505, 3959920, 1744817, 98403, 5372429, 4925764, 2181956, 337196, 133122, 1730692, 3985860, 2607309, 5432592, 1617941, 1946597, 1854545, 1789039, 1953223], +[813421, 1050099, 8332070, 3981790, 3797141, 2562948, 1862474, 4785049, 564305, 1425435, 4948651, 5186467, 54722, 4398015, 2889240, 3211316, 3594218, 2199024, 5814016, 3765930, 8089282, 5517716, 3090636, 3829674, 7778905, 1063267, 2960003, 8334303, 1059815, 2027010, 508643, 5665691, 65144, 1975858, 1878080, 5375826, 1105246, 2223170, 6934419, 6058819, 7058454, 4090997, 7641318, 5552662, 7542809, 3631663, 1758192, 2535846, 4549505, 2861784, 3924769, 5711664, 2052230, 7131330, 3558287, 1786119, 7111727, 7897869, 1894174, 4058832, 4819720, 6019633, 2791457, 6238083, 3124589, 4551405, 7144655, 6369695, 4723819, 4154603, 7798666, 4772806, 7205103, 904634, 3657439, 2142679, 3971677, 2537418, 5401822, 6304800, 5591858, 8307472, 1430067, 5283681, 3631874, 7965752, 5043976, 7957851, 3947426, 7059741, 4893851, 2846403, 1715617, 6866801, 2296048, 137729, 4389323, 2115288, 3703417, 8053325, 29744, 6703982, 4961918, 6284349, 1637714, 3488355, 7891208, 7450271, 3986982, 5586093, 2059196, 6519785, 2611506, 7897290, 3698472, 6007278, 4284393, 5274503, 5589053, 7599888, 2837675, 3131731, 5825031, 4663097, 2773722, 3758681, 145245, 4610108, 4043821, 4676720, 7934300, 7738816, 7355133, 400234, 502909, 6513530, 6073998, 1447953, 6018153, 3955103, 4157034, 7812563, 2345639, 1463144, 6244457, 2764801, 4458453, 7083288, 4133864, 3938357, 7197908, 6126720, 7312909, 5252537, 496253, 1252332, 615691, 8303558, 6193924, 5696773, 7341664, 7706105, 5849752, 7889195, 4027783, 1712369, 3790686, 3330592, 6363685, 4700691, 7545492, 2019756, 6780531, 7017426, 3619119, 2320334, 5966321, 8311298, 7687022, 2603392, 5316484, 2125259, 7695319, 4789840, 3294378, 1947272, 8044406, 1620276, 6993427, 5996335, 2285412, 733047, 8173669, 2752853, 6188289, 4501539, 4075745, 6407696, 6561051, 7745742, 5325351, 5365375, 2058100, 8089646, 6516059, 229377, 2581954, 569291, 6431279, 6590668, 5386247, 4910571, 6288046, 746989, 7680993, 3471913, 8229825, 2881113, 763817, 7721775, 6536664, 7887304, 6509682, 5517202, 4978401, 7462736, 6134, 5105597, 2516386, 3300946, 6416677, 492932, 1989438, 6178016, 7430928, 4697786, 6620976, 1757057, 535288, 1996103, 3700533, 4754028, 5354745, 8226008, 5497326, 1688654, 2511330, 8347714, 3381556, 2378793, 6611153, 7090836, 4569739, 8162115, 3982805, 2211832], +[4860380, 6528639, 7841259, 7146628, 2792115, 446910, 7578172, 7175575, 3954830, 3894110, 2538321, 1234155, 441437, 1625348, 5895167, 5025129, 6767204, 292851, 4154032, 5640025, 1197172, 1220708, 2529639, 1749550, 7122346, 4340406, 6360461, 6948095, 7130215, 4652884, 4966301, 6164386, 5803146, 7416270, 1200349, 7559267, 63180, 2484041, 2700910, 7844998, 4187182, 7382001, 3154531, 6370920, 2770036, 1195194, 6425620, 2289257, 7275828, 856739, 5125879, 723268, 8025344, 4184323, 5456825, 8201820, 4534009, 1686863, 3677307, 3128625, 4409319, 2897470, 798982, 7026121, 6443475, 105885, 7431729, 2643066, 79440, 2190167, 6960535, 5520082, 4127142, 6818715, 6277520, 7725658, 430115, 3678170, 2952319, 1065923, 398401, 7574999, 3501483, 3146897, 1173248, 7587193, 5547248, 545979, 2066924, 2388741, 3719816, 7640190, 2152915, 1115996, 3229074, 2358973, 5988169, 291122, 6969157, 3121707, 2714845, 2069024, 66472, 5135719, 3336192, 784746, 7320753, 7163246, 1276303, 3604612, 2669830, 4157783, 4273250, 4106187, 2744547, 4999139, 3804474, 3596899, 7538407, 1163874, 972183, 1319115, 8028051, 6010427, 7312919, 98785, 2168988, 3326354, 7790343, 5745705, 3085073, 5439533, 3521301, 8315006, 5511878, 7638633, 7169504, 5386075, 4620508, 5035583, 2153517, 4280216, 1807595, 4756436, 4908047, 8128617, 3958237, 4307172, 5162909, 5874223, 3841434, 4220729, 4495472, 1526808, 6344713, 2338014, 1770484, 369736, 4576203, 257422, 4283075, 6223474, 7230653, 3653112, 996583, 1463780, 7584491, 4271801, 2370222, 3926308, 3903696, 2076095, 1605055, 1290747, 7880434, 1280914, 1083462, 3973146, 5947907, 5856846, 7833157, 7976157, 7328159, 961861, 28357, 5787846, 6008929, 2526438, 2039903, 6146445, 1204339, 3350286, 3126006, 2520150, 4668957, 3643269, 8098116, 6365506, 2353184, 670351, 2486008, 3294858, 4991574, 8169349, 7878560, 8024566, 6059201, 1151958, 1798919, 6079075, 1203593, 2576546, 5553451, 4669787, 28031, 2303524, 130575, 7906165, 3176770, 2507171, 7183703, 3073924, 3420227, 1287440, 5681570, 7414411, 8339990, 103808, 5015564, 5251854, 3505679, 5271535, 6181121, 5535987, 3754380, 1317900, 2395383, 2708748, 3700589, 3444775, 5853171, 4338276, 7133605, 2409621, 3554000, 4795815, 5229021, 4612874, 5419447, 7641882, 6924517, 2383938, 3772614, 5981729, 7917706, 4961400], +[7269680, 247417, 4929082, 4703750, 4319874, 6022760, 7373390, 4352006, 4629384, 7301321, 6061868, 2272287, 995548, 8359395, 8029510, 159928, 5748511, 4800278, 5259862, 7630098, 8305185, 3222119, 7547448, 3620201, 5255968, 8245500, 1326024, 5976386, 61302, 6452906, 3769651, 1877396, 2588689, 7733319, 76155, 6939691, 7431806, 4430637, 6247037, 6142920, 661801, 3574349, 7963097, 338885, 1037896, 6901675, 7131345, 6389870, 700232, 373055, 8046235, 5970302, 7201278, 7076866, 2826110, 5091047, 7490100, 2860682, 52391, 7176464, 4171403, 2364082, 6834659, 1062875, 1473283, 5580683, 7466334, 6231786, 4516166, 7326354, 4385973, 3398233, 3418379, 6040177, 4383401, 7503783, 5040815, 7085882, 1223084, 4154483, 989671, 2416830, 3582649, 8049895, 6395684, 2350423, 2704187, 6380161, 1879394, 7407921, 7238859, 5016287, 87627, 1067356, 6814027, 4814818, 578014, 780327, 7077669, 2200180, 127318, 4541885, 378543, 1116298, 3420887, 8014537, 1721503, 2095828, 2381094, 2167113, 5911586, 6592880, 3689476, 1969777, 4445823, 4222844, 447652, 823265, 2988116, 102522, 1052431, 2788107, 4494377, 4973998, 8359119, 349931, 6867376, 8049072, 7388266, 1871559, 4608857, 7066415, 7887125, 3756424, 7063252, 6349679, 7506873, 7977509, 3249874, 4276752, 8020506, 3951026, 2025372, 1795489, 2930945, 6629604, 7074915, 2466133, 7543170, 7488653, 1318215, 4325519, 6564118, 5768732, 4778567, 2815070, 3742021, 1850809, 7625962, 4328407, 1190848, 225055, 3254216, 8141182, 5949499, 4115428, 2433771, 982126, 1798560, 6308044, 1658372, 6039434, 3901871, 4067067, 7504486, 6024995, 812274, 554802, 1248268, 3899937, 6908773, 4292449, 3709863, 2521645, 3602871, 1354587, 4128366, 4356734, 6388022, 5144742, 1392062, 4297363, 5160654, 7801466, 1331170, 5283162, 5869237, 6560708, 3425315, 3141984, 1603869, 6746917, 2348495, 1031109, 7479190, 6171523, 1087428, 7767256, 3884072, 2881270, 831831, 1622429, 6916271, 2754036, 7017604, 4132668, 8134368, 4628378, 1366821, 7888456, 1054264, 4419625, 4611609, 5213163, 483726, 916162, 735794, 183887, 2981611, 1200655, 1300642, 3997767, 5690112, 4196021, 6264999, 4205103, 2031842, 3236938, 1102795, 3721712, 7497206, 4510625, 6979898, 1037866, 2351170, 5075971, 5389091, 443033, 241708, 287793, 2564548, 2410503, 8254433, 1474945, 4297208, 1488956]], +[[2106789, 541302, 6506183, 4859176, 2110201, 6324623, 2431823, 4690463, 571522, 7280423, 951381, 1144531, 1314344, 4398443, 451207, 8106292, 7401324, 3972323, 11817, 8249077, 1511506, 4011918, 6785183, 8359245, 5352277, 7675231, 2446039, 3866758, 4036466, 2800613, 55354, 4980237, 7294364, 5915405, 6601106, 6789890, 2215404, 4009122, 370919, 7605395, 3321924, 3928533, 7240817, 6226172, 2542573, 2051529, 6184775, 8280198, 7853107, 7123206, 3869096, 5432064, 8374824, 6098701, 2749540, 7766372, 921541, 1925371, 5242034, 3059149, 8005775, 109578, 4472059, 4735543, 796485, 377484, 2977513, 8179994, 2550962, 2929097, 333351, 6892610, 7513912, 3538391, 963412, 6658944, 6388016, 3857242, 4060093, 6344507, 6087151, 733469, 1516250, 7577153, 7269303, 2663174, 6487629, 6132007, 1751555, 1932295, 4748508, 8219387, 3171557, 4442084, 5034898, 80015, 1941736, 3246713, 1596603, 7814663, 2874289, 1960519, 4088777, 2958403, 4208325, 3497358, 4406477, 7610650, 3693144, 242924, 3663905, 3820612, 2332435, 6625583, 8279182, 7344620, 7398313, 4558970, 765535, 6467962, 2158811, 4348748, 4178254, 4478928, 5509843, 4232792, 8088070, 3344778, 1099222, 7956912, 6724195, 6276453, 961347, 5685449, 6920970, 5182264, 2087883, 6950004, 4022256, 4836594, 5955756, 1638453, 5219858, 8082820, 4374352, 5680622, 2706476, 5874140, 6428834, 5835992, 4783247, 1139712, 3736002, 7697399, 7643540, 350976, 1633567, 3355863, 1131156, 109225, 2774053, 6894011, 2121580, 3210401, 4527713, 7035112, 759440, 2734141, 1736060, 7344472, 4044675, 7540230, 1521530, 8244467, 2072575, 2553724, 587371, 2073304, 4696332, 5473706, 6771601, 1734979, 6087167, 8194771, 7896554, 2628525, 6602843, 4808297, 1822775, 4311762, 7937262, 6132101, 3689858, 7585762, 1158245, 4164486, 1937767, 2566854, 3373100, 2127573, 158137, 2189317, 6389847, 3135445, 4433727, 5513298, 3266567, 7465438, 1202417, 1900029, 2260502, 6390157, 6433418, 7425334, 7726858, 4519798, 4921389, 3075201, 7225189, 3478080, 3456930, 1722789, 1164554, 6821480, 5547422, 3197972, 2115659, 6844335, 1961639, 7440813, 7963044, 1339878, 5331249, 2097517, 7276165, 4532010, 4499541, 5539143, 3611974, 3967476, 7666860, 7851423, 2925931, 7223037, 6301919, 5514525, 4551398, 5291117, 7524184, 7266223, 4975729, 6115672, 52755, 8144658, 643673, 7184751], +[1072825, 2185568, 6392306, 5265996, 8366217, 6120648, 2612265, 6945041, 2817725, 1117102, 5329626, 4190083, 429888, 387801, 3292810, 6945115, 1640401, 4495324, 4417586, 4712585, 7602615, 3462181, 4476951, 7447163, 4451691, 144285, 1987394, 1571724, 7521890, 7714151, 42423, 985708, 3932234, 5471747, 2116201, 5399709, 6188828, 2480136, 786315, 3414741, 3086884, 3008249, 7850025, 2809512, 7890347, 4328378, 7694704, 79364, 6010132, 4388099, 7794717, 6487720, 1395306, 7539365, 5988480, 5013934, 2066479, 900734, 1517696, 2580085, 7199347, 8361087, 311819, 4352404, 6155541, 1425215, 8161787, 7216107, 1116464, 932958, 4307574, 7956833, 1240884, 5504732, 4612051, 7693793, 4022002, 3112515, 4711500, 5930953, 3747057, 2275191, 2879701, 8293857, 6106871, 2572267, 4218754, 6802311, 315439, 2302677, 3294502, 6778447, 156698, 4291348, 1951377, 2592507, 4718846, 1468657, 2175634, 476128, 1887365, 6452413, 1688363, 302829, 6053470, 3599191, 2162390, 4037953, 3921530, 4353623, 6378645, 1628651, 2919517, 791848, 1772985, 3601029, 5093593, 8277068, 8131818, 3118364, 801723, 2834606, 3649396, 5804364, 5124791, 6487635, 4124870, 5265731, 305398, 7790818, 618430, 7397046, 695117, 2202755, 1453858, 4706111, 2850852, 6028033, 8232726, 7110078, 3889748, 8200561, 6064313, 5177596, 8331267, 2589241, 625866, 4439443, 389852, 3742845, 655862, 1341458, 7187689, 2918896, 8236363, 4724550, 5844329, 3530837, 1381176, 2203672, 6478995, 2358848, 4130720, 5294419, 6737635, 7468665, 7864301, 4974842, 5326688, 4378389, 5801750, 2588421, 6128624, 1761858, 6598969, 1889401, 3355253, 5989526, 2071384, 6036699, 1153712, 9679, 651367, 8017534, 7663959, 5412294, 7342116, 6384818, 6246131, 2065391, 1492396, 6703932, 3613240, 4712717, 7492491, 88145, 7591277, 1108840, 3862966, 2472869, 2500542, 2436392, 6157203, 5044955, 4404562, 2179770, 6483146, 2514842, 5469125, 6709762, 3180932, 4182367, 5937515, 1580713, 1100045, 113578, 1241056, 6407697, 4100952, 7219481, 5675287, 1522494, 664245, 5119892, 7840559, 4389436, 4882657, 4992049, 1769515, 3489560, 4526318, 7882646, 3352375, 6186495, 3824282, 4064712, 3362059, 3126551, 1564641, 7960916, 5074099, 7613161, 8194708, 3439511, 542154, 6583634, 2429101, 5738196, 5388586, 4857903, 5998402, 1366375, 2729841, 2021571, 6222365, 6619093], +[5796085, 5196732, 3553791, 3086621, 688862, 1478847, 98300, 5851938, 6404694, 7475276, 851592, 4458081, 3011638, 3879232, 120785, 2324718, 7935961, 2082185, 7942477, 911446, 1945689, 2381043, 5413220, 5157344, 4658679, 138732, 2458783, 7327808, 6386977, 4261653, 2028380, 7638758, 5329384, 1194987, 1020898, 6447312, 905871, 747470, 3337264, 2140625, 2336862, 3506937, 2845061, 1621936, 4153181, 1830916, 771504, 7355028, 3935553, 2403256, 2619796, 6692604, 2893124, 6563316, 1126208, 2373738, 7146679, 6406320, 4869563, 4548218, 5258986, 8313847, 6674292, 2990606, 1288533, 5285848, 5195654, 1823229, 483634, 766163, 810261, 7636418, 6338329, 7263549, 2736679, 5069429, 4733641, 1684760, 1667457, 7485615, 5431328, 7356629, 1530556, 2663945, 6940201, 6848050, 4646221, 56183, 1962036, 1318037, 6008568, 7447711, 1459203, 2705069, 3901025, 4291348, 1066941, 5716142, 3372573, 645825, 4619556, 3347172, 1004521, 6320980, 3527317, 4034194, 5425278, 1442777, 6054999, 6176377, 3108384, 1304530, 1361832, 5133243, 1652692, 1020866, 2786006, 7249364, 3781394, 1433587, 8349440, 2284581, 2715735, 240977, 296867, 6874433, 2527851, 3983255, 1815360, 6210203, 4357376, 5259594, 419193, 949806, 7553387, 3149622, 3008528, 1176044, 748508, 409708, 6528627, 6046615, 1252029, 1966745, 3028458, 1036604, 7232997, 1036064, 6409157, 1092054, 863024, 3418679, 5030402, 4342587, 106165, 2173632, 2673150, 165466, 6632859, 3821640, 3224460, 2544776, 5216632, 3448448, 3811914, 6981733, 828589, 8047373, 4853892, 3474037, 4295930, 502659, 6984976, 3768545, 439721, 507973, 263005, 3077483, 5889353, 7879839, 927337, 1385853, 3591502, 6627504, 7662900, 3370230, 4772300, 3124671, 1961633, 4024473, 5623175, 3889884, 5329214, 7559838, 7188984, 7092361, 6578873, 4452662, 2660290, 953405, 3756264, 2011766, 6195229, 903108, 3419366, 302008, 3687537, 6101837, 1207053, 1312575, 797960, 1400735, 4142579, 1931881, 1008564, 4587634, 4742131, 5813350, 5941320, 7582442, 2656529, 4102263, 6525500, 4263699, 758355, 6489233, 4182777, 6624923, 7546454, 2836965, 947600, 3907377, 333108, 4330459, 7948826, 7094838, 6428002, 6502794, 6568640, 1838174, 2129731, 6048020, 4037828, 4580987, 7911145, 7720137, 4677001, 2184294, 2359243, 7992275, 4870996, 7169241, 4731873, 6385417, 4925021, 7112804], +[5580830, 6593831, 6708724, 4246361, 5193168, 3971457, 7977360, 6997450, 1471475, 3710267, 5213820, 1104636, 709871, 1995369, 4848445, 6517980, 5261396, 1220887, 7941445, 4067179, 4484441, 208854, 6112432, 5062241, 5601054, 2748725, 6801198, 3519204, 1897507, 450193, 2971968, 2578914, 7807194, 4124986, 5981690, 5143700, 3372534, 3344946, 3356302, 4785714, 2713036, 6242376, 1619257, 3693297, 4202465, 4099685, 788629, 1747035, 1130576, 4864594, 8210937, 5750444, 4169753, 4447389, 506691, 5682718, 8118172, 1283387, 7365541, 3283191, 2199925, 5916461, 2879232, 3163038, 6535718, 3585851, 6137305, 1331361, 4489860, 6400385, 837122, 541458, 2945114, 4778836, 4785272, 1433751, 2156728, 8209047, 8355485, 1071056, 3454583, 1758281, 17092, 3335030, 5665435, 5201289, 3871351, 5182, 7547974, 6444960, 6001912, 4578951, 3346611, 843903, 4486425, 7649838, 2228948, 2288995, 5847232, 2954286, 2404146, 825471, 3501817, 6021855, 1822258, 3103793, 8117183, 930227, 998397, 6338944, 2116555, 2336713, 3348185, 1926884, 7610514, 4875543, 5966713, 2772765, 3191058, 5129090, 1007406, 3089031, 3763165, 5868776, 3507982, 3770478, 5245456, 146092, 7759745, 3965277, 7256470, 7237319, 4869243, 5293916, 1236049, 1040323, 2332870, 7053412, 2337104, 5909179, 1834768, 5299009, 3196456, 6463755, 5442246, 1553087, 7180081, 1901752, 3771539, 2276024, 2773288, 5065890, 5494597, 982233, 2663835, 1123650, 5992210, 4623727, 6153609, 5091795, 6546630, 2476035, 7872318, 1671050, 1661479, 6827363, 6502531, 2776756, 3955373, 2226073, 1457875, 6104034, 2867894, 138885, 2685853, 7206269, 1021439, 1764317, 8341230, 7258632, 2722199, 2443588, 5573436, 3311945, 2991961, 2390167, 5345970, 6463156, 420278, 5582951, 2661741, 7629580, 3269115, 5611463, 5293972, 682928, 7715981, 7616107, 4224309, 6053464, 3498882, 4859058, 6116457, 7598242, 4058132, 5248529, 8058947, 3100949, 6163812, 1070381, 6577374, 7327242, 7669032, 4001446, 4797739, 5805213, 7603669, 3200594, 4365493, 5607944, 6880757, 6615151, 2295418, 2500229, 4713825, 4537098, 157486, 971636, 20892, 7821409, 1390120, 1166426, 5738743, 5970753, 5045936, 6961792, 7338757, 2673340, 5607643, 3386331, 4267658, 7795004, 645395, 3543160, 6479384, 1890138, 2195171, 7067951, 3676274, 5242555, 6262342, 4672033, 1627809, 7545177, 617741, 5235341], +[1915730, 333195, 4073768, 1498602, 5468671, 979416, 7084808, 4741565, 5591581, 4769214, 6087932, 4847641, 8209736, 3131512, 4055782, 1668154, 4243336, 7129589, 6671773, 695251, 240270, 5148320, 2665048, 7229436, 3232022, 2688833, 8145814, 1476256, 3424206, 4277726, 3987817, 6630944, 5026080, 3101450, 4257662, 1110369, 977866, 6374346, 5525143, 1514789, 3828035, 5916702, 1907561, 6512026, 3837267, 5438338, 4777946, 7591612, 8086497, 875551, 2808449, 370353, 4272757, 4485057, 6803168, 1862133, 7831663, 6729411, 6806573, 8220846, 3806368, 6405154, 6006303, 1604828, 6362775, 7794975, 2416527, 5764266, 6720865, 7075456, 1140974, 1174731, 4308420, 4121550, 7347076, 198931, 3908163, 5041271, 1722121, 6801252, 3971623, 7681206, 2711039, 6060600, 6924609, 6492632, 786746, 4688854, 1386460, 3965926, 7264463, 5730035, 808705, 5408326, 5182188, 1548651, 5772603, 623014, 4678391, 2530847, 4800099, 6679649, 7313425, 2160474, 584417, 3342298, 3042912, 349820, 5146538, 1120439, 2624303, 83274, 3635364, 8290404, 7493296, 5536412, 2241071, 726486, 6642249, 1810047, 6460157, 2219494, 1193399, 8173054, 4819662, 6144152, 2804522, 2090285, 4449822, 2314221, 1085945, 8164908, 7972411, 252911, 2509679, 7904788, 1396504, 4534596, 1817773, 7130296, 953681, 5160085, 5708464, 9234, 2285536, 6596751, 6140245, 6374052, 7884619, 2156770, 4238557, 903126, 1193110, 6817505, 1351105, 7708801, 7135592, 4963558, 2544565, 2980261, 655882, 1328011, 3713801, 5555447, 6261019, 2274001, 2762465, 7214038, 4915228, 1058161, 7654861, 2549948, 6707301, 5157385, 3011314, 3522174, 5856095, 7263357, 5174442, 6689299, 6906020, 1826047, 212026, 7892293, 2741670, 4844882, 10179, 6428001, 4032630, 560575, 7420663, 3412518, 6416819, 6644072, 3885637, 4176132, 3777549, 1017880, 556078, 4281329, 8044808, 8036499, 981370, 4297713, 4511946, 3550342, 920613, 2315223, 6574932, 5211512, 1249973, 3949490, 800545, 7537526, 8117825, 5372524, 4473195, 6653625, 4904300, 4081150, 332691, 6866330, 5380797, 4323948, 2849402, 5738016, 3978837, 6705177, 1086631, 2959454, 3806017, 2390823, 7939129, 7366800, 73678, 2823467, 2219578, 556975, 1455561, 6129142, 6369091, 1535192, 5950588, 1475849, 5334305, 3766570, 3414397, 6054381, 2039782, 5964731, 926337, 2832036, 8365121, 1689074, 285733, 2926636]], +[[3738138, 763645, 7645767, 1997766, 7585129, 5796037, 2787182, 4058367, 8015229, 5565595, 3882391, 7084366, 3775399, 3504647, 66712, 6851599, 5770108, 3980154, 2191635, 4954880, 1214666, 8109610, 2835374, 5961451, 3567275, 1814192, 2004227, 6988545, 7246857, 4951513, 6550317, 3535726, 4350934, 5923044, 6256492, 6494779, 3826120, 6364355, 4357307, 6671945, 5522084, 6207890, 8139211, 5569595, 2508322, 6505650, 2512711, 284668, 7584709, 3304142, 7906955, 5652234, 4259472, 1801236, 495947, 5260134, 6061380, 433147, 4323715, 6917953, 5403232, 5069612, 7421292, 7251318, 2167729, 3668353, 7111019, 6275326, 57163, 6072358, 2939741, 1440392, 6893193, 5757369, 7074276, 6323089, 47789, 6118259, 7361266, 3414795, 8181884, 2460980, 7437212, 1393360, 3947641, 7289315, 5072326, 7266074, 4015977, 6820304, 4516817, 7656483, 3131696, 7222432, 1418720, 1213791, 292009, 4534999, 3540859, 6529441, 668558, 5738483, 4274511, 4608042, 7398542, 6750212, 4891138, 5515885, 2003502, 4241925, 1712409, 1166863, 4345740, 559747, 644229, 5278384, 6030062, 6994255, 7483260, 7668519, 739067, 516687, 7234734, 7843628, 6474112, 5089913, 6896416, 5163628, 2530151, 250255, 3439663, 2646847, 6396016, 6588941, 7418043, 5808705, 4233457, 7489792, 4184431, 5957390, 5709115, 5195522, 1518704, 4984691, 8310991, 6552070, 548811, 2863269, 6039370, 4120544, 7973473, 8058295, 7149611, 1565150, 1189897, 2781605, 2812832, 3104812, 4211668, 3407249, 7479001, 4274701, 3407414, 601245, 2533767, 1541431, 7792808, 4389664, 5406924, 1626965, 4089549, 1711279, 4449867, 4661788, 5141243, 2820020, 2662337, 3210595, 1822991, 1803113, 8119575, 2360211, 6115400, 123549, 5314945, 5430250, 7737803, 243246, 6833208, 8345919, 5677766, 1947154, 2923400, 7028148, 8233170, 6829912, 1732460, 1310162, 4813822, 1953103, 343586, 5269932, 5615860, 4401625, 7377116, 7706580, 8207628, 2291283, 6237818, 403976, 6454316, 7748902, 6473630, 3035645, 3946174, 6534803, 423599, 5933188, 2807168, 5812921, 2717109, 348061, 2589160, 5914090, 5932696, 550652, 4437666, 505977, 3447475, 880430, 2148810, 7319890, 4336472, 32618, 6996365, 762065, 644040, 6342019, 3121916, 8003553, 3096151, 3791855, 3003766, 8020176, 2944703, 8060735, 745653, 4129274, 7741709, 2389009, 5771322, 5829258, 6808603, 3641885, 7202891, 4791571], +[114065, 6246542, 2886221, 3670967, 5280732, 6632102, 1196119, 1032280, 4551989, 4149476, 1968925, 3348514, 7014795, 986849, 6237572, 4324883, 4073710, 6273104, 1074136, 866145, 3569676, 7357687, 3895925, 3803014, 2877118, 7916681, 321891, 3300885, 6082113, 1696059, 3592106, 6708192, 2469151, 4380593, 2500293, 2135876, 7702633, 4802352, 2798711, 7887244, 393736, 7732939, 3463248, 6321323, 6527941, 2124554, 5570464, 1602665, 1575471, 1650022, 4829838, 4054534, 4863757, 289752, 6610370, 2970512, 2959757, 6607289, 8237086, 1625913, 8239705, 1473831, 5171338, 3361000, 5114471, 4497351, 5815756, 7788498, 7517516, 413572, 4205074, 4960129, 2143884, 753828, 7198193, 1612757, 4925114, 472564, 6820282, 2783707, 3029089, 826781, 6873793, 1442383, 8101320, 5416551, 6441481, 2843356, 8364515, 8066042, 4594990, 1490274, 7793694, 4671455, 7357126, 8322324, 4041580, 1453251, 3376934, 903667, 1416013, 4074084, 7797876, 2321151, 7486968, 1940916, 1787527, 8375134, 4007395, 7505576, 1190255, 7816391, 1191893, 7784808, 4911339, 4106761, 6846508, 7842873, 7768217, 3942795, 3281766, 4873784, 4327222, 5263924, 7266856, 5421894, 5252575, 3669447, 5233253, 7617365, 3974678, 5539819, 7593323, 4677242, 4584643, 4334284, 4823444, 2592903, 7918368, 962735, 291018, 1969632, 7124828, 8095930, 6376147, 3164915, 5051597, 4238930, 7603519, 528437, 4960611, 4799375, 5278206, 2596389, 788558, 6098640, 2287251, 266024, 6359624, 3491156, 5067559, 1744306, 3373330, 5760485, 4198627, 3023406, 2774448, 3489338, 4258818, 1825699, 4393870, 6344312, 4022357, 6505584, 6038267, 1986641, 6074865, 4381131, 7794437, 7214049, 7525340, 5899746, 6195921, 4106463, 5111883, 2734273, 1933500, 568268, 132917, 3398585, 3305882, 5414699, 38219, 5526774, 3442953, 7261371, 7622444, 361498, 6267039, 5922660, 7728632, 1337556, 5973126, 2369856, 7649717, 7963924, 4380624, 7329875, 8233857, 6671906, 3747317, 6949035, 3244650, 3741505, 7703038, 6140513, 7789494, 723805, 3823695, 1218477, 853145, 6815464, 1951662, 1633168, 2000875, 5602631, 1821676, 4159657, 2753056, 4645782, 2692374, 3588104, 3624145, 4549284, 6131873, 6241172, 7720329, 6260051, 7643964, 4926049, 5187032, 944728, 971906, 5485429, 7968202, 3594155, 4278368, 2045923, 5298324, 218171, 5445922, 4135741, 7337105, 1918378, 8074571, 3303054], +[8051140, 3063488, 1777148, 3074988, 600192, 2998849, 7574065, 2536382, 8261201, 7458049, 7622427, 7309785, 6615147, 2191608, 1933387, 4452574, 131770, 6236847, 7699593, 5183216, 400620, 6194811, 5277337, 4549230, 4358084, 421975, 4572030, 3314740, 2927130, 6783471, 2722614, 1705449, 3436661, 4692686, 4740453, 4256132, 6692398, 1138780, 7016969, 6154818, 4498493, 3139481, 4131806, 3585792, 4319033, 6258215, 793309, 1223526, 744962, 5735472, 7223573, 2227068, 2635144, 11547, 4073333, 7179416, 6882911, 2288061, 2648146, 3396909, 2072397, 7467102, 3247621, 5404842, 3826496, 581510, 2721551, 762537, 3223624, 6487973, 8376293, 5767273, 1046934, 1835264, 6991913, 2998906, 7140297, 5843023, 4434623, 3744291, 4377514, 8200841, 3810344, 343873, 3241798, 4170273, 7725037, 7378396, 2748616, 4887019, 5729921, 97063, 4504987, 7607515, 4125379, 4256304, 6602017, 7703296, 7017309, 8274706, 649693, 3243364, 2793602, 2266427, 5110955, 5038697, 6451321, 2474210, 3360624, 1778141, 1069370, 2173120, 3258187, 8264498, 5943250, 7269428, 5575079, 7607203, 4998587, 4599935, 2862564, 7721940, 3774273, 4148699, 6498182, 5255214, 5319792, 6970847, 6527934, 7892497, 718511, 7071694, 7652356, 7212992, 6979264, 2073366, 2446321, 3638166, 4521535, 4194212, 7603856, 2641963, 6479831, 2271266, 4926918, 1300411, 4931715, 2938798, 5288392, 7742280, 6379382, 476754, 3669283, 3634978, 4463157, 7568660, 1245988, 4120907, 2334708, 5523996, 3430583, 4748919, 5520426, 5586466, 3310254, 6037035, 6980580, 5648396, 3412475, 7553569, 1134746, 3194278, 4008235, 7005529, 4382648, 2229702, 4832345, 6965645, 7151063, 3715372, 5398122, 4129271, 8294187, 5759952, 5985685, 2898302, 3432791, 6894701, 7793793, 2937963, 2748184, 6955670, 616472, 7628592, 3022213, 2103610, 4100573, 2261354, 4161746, 3893109, 6112480, 6491302, 3268934, 3245150, 609699, 5170802, 6168376, 7115404, 296407, 3050398, 6357168, 212949, 7642885, 2105316, 8102278, 8237237, 4481859, 6320713, 5293278, 4072925, 4091680, 2313799, 6123181, 3153477, 8217599, 3690532, 1129087, 1063209, 4182484, 2576150, 1524725, 4352432, 3438812, 7765782, 2249896, 4432984, 633967, 5402405, 8003867, 2382422, 6372362, 1933380, 4310167, 4480609, 3245177, 2860030, 4926348, 2366948, 7916974, 1562421, 1841930, 6673944, 401315, 6418994, 290594, 8070741], +[6567201, 4801411, 6261153, 4839058, 6079347, 8060730, 4944077, 7741807, 1125460, 6839567, 8100720, 8152952, 6283324, 3521255, 5623660, 1004288, 7749396, 6097191, 2725133, 2643395, 4238523, 3012124, 3844422, 5701859, 58458, 2661932, 5831016, 6372070, 2723433, 1324729, 5419547, 7935907, 3422202, 3943536, 4183506, 3867510, 8007046, 556719, 2699749, 1820463, 4687964, 5036446, 1672014, 7376223, 2007377, 5345035, 3192683, 2491702, 3904182, 7130809, 4106560, 4878309, 5885089, 545484, 8168079, 2903833, 361772, 173154, 7860145, 1907567, 554571, 6564193, 6384805, 3588490, 7703455, 688935, 748668, 4854187, 4174192, 4954209, 7618948, 3831502, 4760106, 1535370, 4764863, 4070847, 2175391, 1455070, 5772591, 5748897, 4677710, 2508333, 6857323, 6080141, 274956, 3345677, 4179601, 8195736, 2217472, 68896, 7720014, 2785883, 7259099, 7394889, 5356197, 8083127, 3484776, 2317639, 3921048, 3950923, 1139050, 8093164, 2872947, 5208059, 7821873, 3410006, 7379602, 1767702, 8364750, 2273399, 7503140, 6996265, 4002549, 1883981, 1389455, 5404804, 4779958, 1880326, 6157684, 4732061, 2245500, 2898135, 4120150, 1834833, 7349790, 6287947, 984464, 6043170, 2589276, 7180968, 170526, 666011, 935163, 4188400, 2741774, 1459371, 1855913, 4775333, 5037771, 7851195, 8032073, 2820517, 7451737, 1352211, 1287881, 7692642, 5092425, 7170805, 4024478, 3817283, 3317659, 7276484, 2519427, 5240595, 20400, 5432969, 1498021, 205081, 7806521, 4046612, 2884425, 4415502, 3304429, 8334797, 6023207, 1966858, 7882905, 2385647, 7105759, 4339091, 747894, 8247688, 3875369, 6926614, 474903, 5012736, 4887648, 7703360, 6409889, 3611214, 733355, 1268647, 5145501, 5741137, 3508795, 5428402, 7983428, 3165354, 3115466, 179817, 4097204, 3869460, 5316436, 3813784, 2735262, 5374011, 987500, 6593252, 7908823, 2505242, 2455123, 7746216, 5046493, 6347076, 5744157, 4002028, 7228607, 3561325, 523644, 3574645, 3027315, 552063, 5199505, 6779222, 6007256, 2184898, 3314796, 3149110, 3620194, 3711226, 5992850, 3799939, 4841803, 1328515, 4490254, 6470526, 1141096, 2596280, 6294285, 6503127, 4632979, 6337868, 5985080, 6762032, 6195504, 7231176, 4284860, 1998855, 1624470, 691712, 7543441, 1174363, 6136357, 5045021, 2713997, 8316761, 7292452, 4158814, 3020972, 3089997, 520082, 828659, 6370759, 8056821, 558210, 3557361], +[3346451, 2733440, 2513636, 5934841, 530835, 5040354, 6075253, 7765896, 1084896, 3674313, 5142814, 8369461, 7404264, 4702357, 7770367, 8133137, 2969050, 7387720, 143289, 2006448, 5137146, 7838645, 3968795, 5682810, 4250081, 4992163, 5933619, 8128534, 2379825, 4163649, 6050981, 5793528, 704545, 263011, 2960625, 7447161, 5424304, 5053717, 338422, 3126684, 6630993, 6958919, 2821662, 2135812, 6386798, 526619, 45393, 417005, 8261214, 2616572, 7150773, 119778, 2950618, 3831915, 5241111, 7274643, 898952, 6457563, 3699096, 1324304, 3776067, 8304973, 3545004, 3691388, 4712345, 6102559, 4100002, 6943502, 1362733, 8148730, 1165336, 2402399, 4437949, 5310832, 5195131, 7185250, 3625627, 5085497, 3579991, 2102547, 6828769, 8321889, 7388420, 4263820, 1543847, 2678869, 5642032, 68448, 5662032, 1393570, 7747763, 5015146, 8007064, 4355820, 4215729, 6657476, 5463456, 8107195, 850073, 3844932, 7947378, 2381686, 1796318, 5381348, 72063, 2469408, 3655645, 5640337, 306803, 1773691, 2197481, 2436365, 340894, 4503663, 6975548, 7359288, 6491799, 6628785, 7418281, 1530720, 3831786, 1724780, 3153222, 5645483, 7315731, 2210079, 2836882, 2480926, 4892474, 6789374, 1570926, 2247975, 2008501, 1046819, 7578597, 5813907, 994139, 7373314, 202298, 3921049, 7435793, 6613992, 3772486, 2729992, 3711359, 7828309, 1303379, 6780255, 3903279, 3298256, 4503440, 6764755, 4939607, 6317822, 6857604, 2553301, 7582281, 3568855, 7379506, 3912786, 2545263, 1779329, 5967901, 6227022, 5779265, 7534498, 3354517, 4681031, 6015976, 916540, 5767059, 7229460, 5525125, 6831440, 4986302, 2141869, 5920195, 3423325, 7067616, 8339472, 2484779, 3457826, 3618920, 8331028, 3569103, 7258085, 1163999, 6478726, 3719181, 871024, 7710644, 7625131, 3411550, 7046028, 6900129, 4999115, 1555891, 138753, 2027583, 1586058, 3083301, 1137769, 6516740, 5184777, 7808076, 5816845, 2358726, 7303180, 6328150, 576299, 6860216, 7887588, 7414874, 6019409, 1934235, 4690682, 5630582, 3686713, 7870315, 4219014, 4462127, 2962036, 3894867, 6100835, 6997508, 2237891, 2228672, 8378529, 4359467, 8029496, 7027042, 8151875, 7695969, 6661854, 41191, 2018282, 8182243, 7390051, 2804348, 2779065, 751047, 7532507, 2555291, 5126788, 3548454, 6238161, 6201602, 2442666, 7856417, 1812876, 5854465, 2779579, 5132733, 2763704, 501283, 4605035]]] +s1Hat: [[2499317, 1795259, 4800980, 869430, 521202, 2485579, 6071362, 6893228, 5482588, 4624568, 7180362, 1042863, 4704703, 5961819, 3878803, 1464267, 5349558, 125687, 1911866, 4959252, 6586021, 2789240, 5672943, 2562685, 3301923, 5245791, 3281478, 4876663, 7560914, 6846013, 5814281, 2873811, 2836529, 5104012, 4153621, 7766640, 2329649, 4447214, 7186740, 5909473, 3012478, 5201314, 2536809, 5094038, 4886166, 255364, 5813136, 6513945, 5249622, 6832201, 3852181, 1337700, 56921, 7405816, 4004806, 4503705, 3961845, 2970737, 3208991, 5161320, 6039814, 4982733, 8068997, 3110511, 4696081, 7546144, 8058120, 2376964, 18807, 3353850, 5647725, 6125614, 3829972, 1707112, 5566655, 4606649, 7610912, 3624329, 3666151, 1816760, 7365954, 3138467, 3627495, 1904802, 4077804, 1246870, 4707885, 7050957, 2348360, 892896, 6692625, 6593299, 5890947, 3690999, 439172, 1903112, 2112324, 437167, 5841490, 6341646, 250122, 2479284, 1532667, 1513791, 5697986, 6795323, 2466295, 2173840, 2881886, 5268264, 996653, 7376568, 6236322, 979786, 216770, 8087598, 3023587, 6248177, 450772, 7155218, 1700825, 2771430, 7382363, 7601624, 7601532, 5079850, 8241489, 6406334, 5909888, 4755139, 3588220, 8061308, 256344, 1158999, 8016107, 4478765, 733955, 5800847, 3285, 5491638, 3013839, 5944015, 5115729, 1121305, 4239374, 7936183, 5748161, 5758104, 7874012, 532783, 4668698, 533622, 3018336, 996369, 7873561, 2755532, 3594125, 6351864, 2831338, 6673409, 2337032, 3842692, 166620, 3066927, 5276706, 5492054, 6344323, 1289575, 8171484, 7093920, 3682812, 1822905, 3039183, 3855049, 1770740, 1493816, 2923344, 6157697, 4020314, 3806934, 8031275, 2873980, 5715708, 6292382, 4659042, 794757, 480131, 7247601, 7018713, 1064798, 3596127, 4530816, 3631153, 1020033, 2279949, 6404559, 5739349, 4203650, 6642603, 4429043, 5903089, 592672, 4357901, 3020178, 687323, 5127407, 625770, 5062114, 1351148, 7301194, 7559720, 2629945, 4502206, 3307209, 2112358, 6727192, 774171, 7566672, 859795, 2196300, 2059420, 100532, 763073, 6458377, 6368686, 3388729, 504051, 5473018, 7588962, 4976083, 7102547, 2159122, 807104, 1650415, 747698, 4936520, 4128700, 778229, 316121, 8159159, 2493094, 4404023, 184401, 2703402, 6234733, 3911324, 1134659, 4517577, 3561981, 1173750, 842181, 3548586, 6603552, 3224308, 1014501, 8362727], +[2379854, 6041593, 4102404, 3336186, 748390, 2744743, 5663207, 2128166, 8271852, 4550614, 6234160, 1847437, 5654729, 1744925, 1611310, 2002109, 6706628, 7877036, 8099159, 5595873, 1458176, 3763567, 5257320, 4613025, 1620503, 4045832, 4654547, 5843988, 161498, 1383498, 22784, 894335, 6691247, 8018554, 4030574, 1580416, 877654, 414157, 2268099, 5111387, 7999790, 3115400, 3173574, 861109, 4296754, 4206607, 7357709, 1318292, 1818823, 8237739, 533254, 6464491, 457166, 4669446, 68488, 6094033, 2023251, 4473214, 2920903, 433313, 1192534, 1678030, 4030753, 6983974, 1252438, 8165669, 478596, 3141768, 3037197, 6511582, 3864498, 3549256, 3773317, 3378469, 3928915, 6965296, 8379232, 1250335, 5477073, 1779140, 450628, 6359178, 5966209, 4033813, 1862142, 4610037, 4965188, 4199603, 8044885, 171528, 6424235, 5415578, 2091309, 1663691, 2342520, 3543799, 5818336, 7320640, 2638950, 1066189, 4778634, 8327997, 6594521, 2892385, 6569448, 8070309, 2100392, 220559, 6741328, 233657, 1376902, 2322014, 6204011, 6245602, 7398943, 3266657, 7421220, 6884863, 7093511, 2193024, 1948774, 3900796, 949272, 7172278, 2565999, 577217, 2747172, 3968106, 5554287, 6200681, 1222560, 5474201, 3289023, 6710851, 3690610, 2815315, 678846, 2313075, 1002268, 3098223, 6055798, 4784288, 3382091, 4766285, 1151589, 3940849, 2798410, 523666, 1306475, 3601697, 3619357, 5278495, 909354, 7780751, 2213132, 563341, 7288574, 2669395, 7986885, 1779475, 1465021, 4796946, 8265051, 6012186, 5092355, 5776451, 2819681, 3184873, 3829422, 1160989, 1861002, 16005, 6253324, 5279702, 2523364, 2047878, 1850929, 3438433, 3582509, 8007045, 7302057, 3441471, 5555231, 6528229, 6848948, 7877425, 3137167, 2243845, 548859, 5450611, 3641746, 3540469, 6025558, 6078671, 5186874, 4073755, 5740501, 4221206, 3801206, 940870, 3933451, 94306, 8002498, 2685670, 4993584, 5601642, 8350466, 3434558, 5222137, 6301215, 6144389, 927490, 304221, 2705345, 2764164, 5461827, 4961806, 509923, 3372141, 7135750, 2861840, 6222640, 6690758, 2610562, 479212, 1187011, 7304848, 4201165, 3332027, 4736157, 7688755, 6502048, 2708108, 2868784, 87571, 491298, 6348483, 5397539, 3290008, 3556374, 3512850, 5110262, 5809579, 4807149, 4670533, 7904502, 5460412, 8213669, 6507408, 4762901, 473103, 2392156, 5447729, 2667316, 7154735, 3000842], +[6349296, 6112582, 1734815, 1227186, 2003385, 1242596, 1101137, 6399070, 6957717, 1642627, 4892050, 3630307, 395737, 4027591, 4190884, 6310909, 5003944, 3949568, 1390219, 6128796, 4035941, 6561136, 2815808, 4290631, 6788139, 5305542, 2815103, 1425933, 1886367, 4249111, 5334874, 3003057, 6531276, 710563, 7871775, 3100442, 4413052, 8260360, 6468435, 1263959, 3796215, 923752, 7848772, 394311, 2719155, 3495480, 815819, 609250, 105839, 3426950, 4031928, 7282093, 1705440, 6762835, 2343609, 7684277, 636745, 3956282, 309989, 432980, 5587366, 7146766, 7096228, 6315222, 5369645, 7949523, 7958654, 4481475, 7135461, 5880522, 4458049, 2049329, 2398744, 1460667, 1651251, 7684145, 5411052, 627727, 2151041, 3365857, 4111095, 7613985, 6667212, 2687444, 3502968, 1310438, 2522894, 2337, 6032782, 7388343, 3437508, 5301387, 3020918, 6772298, 4405529, 1037684, 5355194, 5005615, 1393473, 7931028, 5981268, 6547137, 2013445, 6252648, 5997165, 6157891, 4104953, 4383323, 2627753, 744767, 1249514, 535699, 4926652, 7455887, 4132403, 2192215, 4174967, 4984539, 7204947, 7418832, 5630263, 178157, 206165, 5508309, 8276270, 2745384, 4411396, 8118446, 2649468, 7403526, 5491388, 3986329, 3521700, 2246803, 85393, 1279136, 2264366, 8064206, 6954323, 8063214, 1951292, 798097, 6826957, 6859012, 7433372, 1852525, 1391138, 1836879, 5106524, 5996580, 922887, 5436351, 3042958, 3656972, 367136, 1586846, 4377641, 4653933, 5604283, 2354514, 8110366, 6340960, 6174554, 8175794, 818650, 1791133, 5994765, 6542070, 3606413, 1038552, 3561934, 2030477, 3686271, 3797402, 3950179, 5367692, 1112158, 154784, 4496927, 973559, 733650, 7393293, 572839, 7156975, 4760671, 5418515, 7556806, 2007007, 2361174, 5367750, 4164617, 6845557, 3970145, 4364613, 5353011, 2567547, 333373, 3703862, 3915924, 6701381, 5159674, 3003079, 1799843, 7867899, 7752817, 1068394, 2278186, 3235867, 1787870, 8110699, 7762857, 5168041, 5119677, 2626959, 4847331, 7706462, 3444540, 951173, 2936445, 8069792, 2803161, 1850337, 2581475, 7157282, 6375649, 6042017, 4189124, 1924550, 6256620, 6367826, 408931, 2595224, 2876562, 3930579, 3671458, 1747034, 3784099, 5967342, 64864, 1123174, 1695110, 659263, 1294710, 6665312, 625600, 3478455, 687206, 5082876, 3016379, 7445229, 245409, 2523419, 5476789, 5527240, 4947175, 5024727], +[4363745, 2812325, 885232, 7413585, 5145924, 5080865, 3694601, 2091302, 2004338, 275662, 7876289, 7552250, 2477475, 5486858, 8281007, 6775861, 2220956, 5103349, 1729575, 7975334, 4912182, 3346608, 7373639, 8069830, 1218723, 3832441, 923853, 7954358, 8253476, 589791, 774392, 3085997, 3116048, 5233360, 5991045, 1818325, 2436869, 7600424, 4771187, 3950081, 1405748, 3236847, 4984153, 4964243, 7391651, 1505919, 7002442, 8201629, 5150794, 1416392, 5150808, 6013752, 6272945, 216440, 3789560, 8244012, 3208123, 7433430, 2286147, 4502390, 713133, 7883178, 6041397, 5176469, 1621345, 5398173, 3576345, 3253701, 3654581, 7719452, 1010073, 41073, 8145824, 7649499, 1475422, 651793, 539302, 3742700, 7956860, 6659589, 2244802, 5583808, 6098953, 1477195, 4837767, 600774, 3714844, 7926694, 2440096, 7012447, 4679197, 7776053, 3569290, 6745582, 4382797, 826852, 102251, 3731865, 1203922, 678789, 6615793, 6849042, 4821152, 5377986, 2917182, 3239138, 2603740, 6596065, 687874, 7823763, 5304649, 1769099, 491395, 4344863, 3548508, 371936, 2901391, 5842450, 4414012, 2635472, 6652924, 2641414, 5619641, 2321021, 7881947, 4374201, 540069, 1739359, 3297365, 7855301, 108419, 5718129, 7236556, 7879256, 1184308, 8095084, 4284900, 4412881, 4300555, 1628161, 5509820, 4591570, 1146897, 3663040, 7134371, 2321936, 1404024, 6757781, 125647, 5002556, 808542, 1765828, 1357222, 7192593, 222326, 2864273, 2809217, 6689014, 7361713, 1799029, 3686605, 3991337, 6236483, 6141671, 7356092, 1376879, 6924660, 250626, 2414768, 557940, 939073, 5982631, 1380139, 3064350, 658880, 5993262, 6257166, 4281291, 2596369, 5912859, 7311869, 4810822, 5615576, 7790050, 7415807, 1183696, 712907, 1029368, 2512402, 3914639, 5105102, 3497479, 2823791, 6332647, 3260691, 4051304, 6720525, 6445152, 1622534, 7680286, 1669072, 2719574, 2118864, 3939195, 4204579, 7184988, 1615037, 2880554, 1763729, 6982042, 154953, 4451744, 4840785, 3407982, 2124241, 3259613, 4100353, 6704846, 2413235, 501098, 1437064, 7185139, 2508065, 3829647, 2341997, 4147450, 6763225, 2054152, 1648756, 8357070, 3307066, 8290442, 7205153, 3121433, 1004756, 3124824, 1405794, 790057, 5523720, 5706831, 6274551, 3399650, 919808, 4125582, 1576794, 523616, 4445073, 3251671, 4300421, 967284, 2795083, 5372831, 2808743, 3005894, 2827701, 312189], +[7119500, 2742251, 7078689, 976113, 3930636, 5568082, 5778734, 403706, 1742113, 7211512, 2759301, 4499632, 6309005, 3830906, 8370273, 3428549, 1890009, 1171349, 7433909, 7500574, 302820, 2133009, 2744969, 401362, 6107026, 6751658, 3446390, 839841, 6179705, 6568193, 3677904, 3318013, 6205786, 2656937, 5887087, 4532708, 2049682, 29554, 2522821, 6900390, 8312884, 6254921, 989832, 7561197, 5475415, 2341362, 1170009, 1907051, 3272725, 1447039, 1756087, 3447206, 3702536, 2612978, 1690556, 3589999, 6346907, 6088517, 8012514, 7380338, 2287515, 2660501, 3937897, 7574327, 7062533, 5014845, 7424821, 3430314, 521210, 4843683, 5796707, 2610629, 6226510, 3034953, 7338881, 3833258, 2808696, 7017033, 1284099, 2763491, 6163967, 7316035, 5558332, 4563277, 2333607, 4615181, 2654409, 1551302, 30435, 50113, 1653402, 3755880, 5680755, 1364247, 6635458, 7272699, 8118201, 5128680, 802285, 2553088, 5802496, 292556, 1752086, 1094660, 2102089, 8242599, 592916, 5987322, 7070021, 2477434, 3762045, 7392504, 3636095, 3669967, 4766046, 558651, 5553927, 2972317, 3076390, 2613508, 2305945, 1894319, 7454248, 8099551, 2104808, 5020743, 2719096, 2889834, 713936, 7280006, 3602017, 6611346, 7772343, 2911062, 2518367, 618420, 2058499, 7471680, 1829360, 3787086, 7463442, 911726, 2614372, 3537329, 5781867, 378349, 7295132, 8347424, 2519795, 1265686, 870445, 1908375, 5443483, 6005773, 1634803, 5044468, 1671756, 701916, 3651794, 6303419, 5453441, 1861448, 7488088, 7883969, 5772066, 4941255, 7057661, 3984537, 1061386, 8177099, 6538435, 4372562, 2327837, 8069079, 7043438, 2103745, 6271736, 2696943, 4401612, 4455441, 1390731, 3135085, 6189984, 7707856, 8068411, 6486531, 776396, 1800534, 3502402, 7776165, 6505561, 5802205, 4315704, 6138960, 816478, 91615, 4828128, 3947881, 1716179, 2063571, 5962040, 207414, 3212494, 5376152, 6970096, 5855420, 1302778, 6642105, 4210127, 317575, 19513, 6854289, 6629966, 7486098, 6618456, 3298944, 5140371, 1934097, 1601962, 1701286, 4415776, 4896563, 4254020, 1989172, 7557889, 2643847, 4290545, 5161561, 7078367, 1365991, 6988264, 196704, 7252599, 427388, 3562626, 5533061, 4782814, 5305054, 6775289, 3189679, 6206080, 2568655, 2465859, 4005346, 6772850, 3628739, 3579737, 465398, 7937103, 532301, 3025586, 2540198, 4244935, 2985680, 682263, 3816404]] +s2Hat: [[5227188, 8196134, 7938228, 6128519, 7544880, 7734355, 4170169, 4191494, 6104760, 482583, 1223376, 7248944, 5636976, 3691739, 5815638, 380889, 7273457, 8249072, 1258447, 4480737, 3653833, 6607083, 3443966, 2075348, 1856333, 2468622, 7766355, 5824412, 7368459, 4619943, 161873, 3311293, 163775, 8296254, 7146990, 7052922, 2175191, 5767795, 6779110, 831316, 921939, 6041190, 3003390, 6214487, 6903694, 465811, 7630692, 1741209, 6699540, 7904398, 4073420, 5848868, 7522564, 5839311, 4401204, 7246313, 3737833, 7136519, 1379124, 5180393, 7459433, 5651301, 4597959, 5374880, 6761033, 236004, 1738855, 6864262, 1694822, 7677673, 3140568, 7952764, 4224527, 5496877, 2991606, 7314342, 3542706, 2368815, 1333084, 1602396, 3554924, 6991914, 6084398, 6886286, 6069039, 1780279, 7218380, 3250398, 5738770, 5508111, 6043049, 4272298, 6560204, 635797, 2775732, 3495714, 1348969, 4096311, 6411991, 1340585, 5031581, 701039, 6559698, 111270, 4613027, 5687602, 134838, 6250259, 5432759, 7739732, 8042972, 11590, 7075711, 3849565, 4858749, 1750994, 3966822, 2102418, 7308345, 4065141, 7191003, 5427509, 6840080, 3714051, 5705671, 5604789, 3013296, 1236799, 4309865, 4608643, 2244801, 666212, 2438467, 1262588, 3081714, 4094335, 3225383, 4504229, 623584, 1570371, 8215625, 7269790, 8301280, 5453909, 1913553, 370792, 435450, 1333180, 5118797, 7957299, 2094316, 6026008, 1705131, 5221128, 7370631, 2401088, 2077041, 866206, 835709, 6070217, 6818305, 792353, 4058830, 2488828, 7896329, 5759153, 902282, 8147719, 7614535, 5988831, 3579356, 129131, 8035615, 7005292, 7637878, 3340771, 5152929, 6050962, 4368555, 6512013, 4654063, 7571535, 3655776, 6076476, 6291776, 4649690, 3908453, 108921, 2766413, 2184279, 3223231, 3610498, 524549, 2536569, 5728394, 3121267, 8186775, 4835327, 4249365, 3165422, 7273748, 4781304, 615959, 48211, 6475075, 2827769, 6722026, 4281555, 295403, 4463816, 7352198, 7495023, 3783090, 5435406, 3887699, 7507451, 7176804, 3090244, 7272515, 1067798, 3872792, 2996101, 1811524, 8144880, 902149, 3986864, 5380212, 8251180, 8033495, 837815, 2153576, 516780, 7278307, 2677169, 3345689, 8099446, 6146772, 8375824, 7786353, 8253829, 1995661, 7489899, 2171448, 7747413, 7314206, 4571643, 4094113, 6814720, 6482851, 4588681, 6611959, 3244484, 1374742, 3890160, 136213, 7914735], +[1529957, 8373383, 8180333, 3335667, 7490716, 52263, 4946305, 1691137, 67053, 3629948, 2869925, 4697872, 1492533, 4592677, 7883419, 994710, 890373, 112535, 7710890, 4780442, 5907679, 2018475, 1873631, 5530463, 4526777, 7311615, 3875146, 6770369, 2226435, 6659813, 4390884, 2890707, 6782545, 7294514, 8123914, 4695585, 4792386, 604529, 1138486, 2034072, 6493553, 1375247, 4367210, 3666796, 2091346, 5093443, 4214980, 851877, 7301345, 1792589, 7129682, 7268402, 4464707, 5753532, 1310146, 6508591, 1102826, 4880633, 1264523, 2779131, 7226807, 1194588, 4315547, 4125905, 1658049, 3102336, 5135414, 2882912, 3069271, 4384176, 6070558, 8318144, 5071405, 8243061, 3921405, 3837170, 4911430, 1370612, 1706562, 316586, 1141008, 3502884, 1418366, 7702757, 934008, 3270281, 333936, 534618, 7832624, 8032689, 7884647, 3299111, 3153481, 5661661, 5836919, 573287, 5786014, 2418939, 2150812, 6235841, 7563159, 5593619, 1441954, 2869971, 7600741, 3881376, 4125588, 5926050, 7753333, 864485, 1939479, 5336733, 5419245, 2025151, 5490938, 6536126, 7611735, 6552739, 6799682, 4575867, 3315017, 5947900, 7183670, 92968, 6650295, 1932206, 825991, 3766248, 448374, 2661264, 1715067, 414227, 6152404, 1201665, 3387060, 1912259, 6539237, 5290564, 6644062, 708779, 5868967, 7462311, 5493221, 5817903, 1894527, 471991, 4810117, 280710, 7134504, 2400923, 7151878, 3631554, 6164195, 2941806, 6025183, 3521182, 5512130, 6586179, 3810193, 6813840, 1939341, 1243207, 2765604, 1546921, 4754431, 193795, 6507691, 5148358, 259209, 5027096, 5531337, 6540592, 3632852, 6616107, 3120896, 1236907, 5912495, 4888627, 29803, 172620, 5890409, 3594265, 5527886, 3195423, 1120151, 3929580, 781085, 2101727, 3398777, 876186, 7391904, 5185215, 7609414, 2151825, 4465093, 8244245, 2528651, 7746829, 3391816, 5880565, 7104812, 271312, 1816020, 7141340, 4345785, 6461571, 5365421, 7746669, 7945276, 2305358, 634268, 3695920, 7483847, 315699, 4278743, 946056, 2893639, 6062691, 4400568, 5813468, 5934629, 6542883, 4017733, 6845198, 1434184, 7679362, 2493729, 6846302, 268259, 7225745, 1125435, 6471581, 7866643, 3581550, 3534194, 7324725, 2045420, 3385094, 5589430, 7846244, 3209660, 1781774, 7342534, 272495, 517747, 8078721, 2707399, 4403644, 96947, 5898630, 2423779, 8189234, 5700649, 5384131, 1265898, 6337918], +[7845161, 3683011, 4412858, 7596066, 7056705, 2257634, 7398448, 1769649, 3335523, 3939644, 1702266, 2828940, 2208856, 2540533, 6462873, 4306577, 6744592, 5612676, 5314342, 891272, 7587812, 7766337, 7841571, 7008970, 5722716, 745319, 656165, 4403989, 4684511, 304332, 5404659, 745210, 7439433, 7028359, 792631, 4052830, 1175058, 856302, 3804213, 745416, 1563371, 6543465, 3444996, 1057012, 7349463, 1301886, 4302850, 3762058, 5127988, 7358615, 1834852, 3028198, 2364079, 7127446, 5337599, 7820725, 6511933, 8010162, 7858510, 1156518, 906916, 4411576, 1843817, 2723111, 1822036, 654967, 3594533, 1563219, 5701267, 5023689, 4794855, 6019881, 1643795, 4847856, 4442373, 2397980, 4107651, 1792148, 5224051, 4912364, 6660005, 4468636, 5958072, 2525112, 5868716, 5162223, 7244730, 8005230, 7593425, 5138644, 5652431, 8139449, 6940282, 1831607, 4687521, 1721912, 2606570, 2025878, 4191047, 328815, 634661, 3132976, 522137, 8149439, 4804957, 4968832, 5750216, 4521371, 1366526, 7588797, 5689049, 1544126, 1181152, 4314145, 7254689, 7478066, 8092288, 4315289, 5713790, 7587935, 2144640, 693295, 4533299, 4692905, 5292461, 6546365, 5869177, 4011492, 4718399, 1480039, 361680, 350194, 8219746, 2340277, 884062, 3278515, 30292, 7785152, 7010475, 2748868, 3669018, 8064865, 3669436, 5572519, 3792697, 4985402, 6858056, 6907648, 3729425, 224783, 2587977, 4387544, 7938651, 1875811, 1706706, 4292359, 2377559, 7354499, 5272727, 7046177, 3474161, 6726072, 5491120, 3026776, 1276594, 5596322, 89861, 3929654, 7835789, 2323801, 2878959, 5932909, 592918, 5716860, 8103710, 2518618, 4350761, 2807545, 5130168, 1387893, 4401331, 5086658, 3237998, 4044078, 3165456, 1202896, 7363313, 6481111, 6343381, 7002900, 4418330, 7795216, 4886251, 557561, 7473909, 1984748, 7976018, 3459861, 3036546, 5426269, 951899, 5138772, 1916580, 4038166, 861134, 7427872, 5834267, 1194869, 4219517, 1808688, 383359, 474010, 347458, 7863538, 3831810, 7627416, 6807161, 2434727, 7435935, 3038848, 3078250, 1184650, 4551213, 4608976, 6540176, 6206960, 3362462, 4942649, 2733538, 2582344, 121509, 6784762, 7635025, 3621450, 4143848, 3851794, 2763566, 1000144, 6810175, 5096725, 2106281, 2187550, 2507358, 2015740, 5330928, 6107150, 7911260, 4273814, 6819951, 1656491, 7032809, 1527183, 4922038, 1498872, 18571, 2357864], +[3175675, 1571759, 4112062, 2895282, 172355, 7715225, 4530213, 6243862, 29078, 1797132, 6654058, 4657907, 686772, 8287004, 3918555, 3480944, 7862445, 833601, 7662734, 953416, 3433751, 2838576, 4863191, 1274524, 2141465, 1576248, 4373154, 713207, 516442, 616883, 3260766, 114520, 5411773, 3903425, 7371374, 1892975, 6695912, 931270, 4670924, 1510851, 7040102, 3825988, 5369586, 727299, 1777934, 7978741, 4768800, 5815863, 3009603, 5225932, 7490589, 147819, 5664546, 3709020, 7783574, 4439345, 7764912, 6082760, 1046651, 4871319, 7891425, 2226598, 8000738, 4617248, 8305258, 898679, 1686328, 614756, 3981369, 6708331, 4637844, 8333019, 4758255, 6938403, 5467889, 778310, 3888758, 2505372, 3247711, 7747062, 6718652, 3664084, 366339, 3311489, 7015665, 4330464, 6962852, 7800854, 1490169, 2008195, 757553, 4303224, 8310028, 4872378, 4761621, 5340573, 708075, 3671199, 1193976, 1734284, 4903885, 2977634, 5141484, 4041834, 4356331, 7841181, 1351779, 572868, 6348829, 7906999, 2577736, 4420482, 3798607, 7258256, 935204, 3727640, 1977413, 2285432, 5136641, 5050287, 131507, 597593, 4956981, 5043568, 6447701, 210324, 5032854, 1072655, 2500995, 4645090, 1818728, 2298654, 5768773, 4080664, 1229340, 7516764, 5165910, 339895, 6836727, 1387070, 5011731, 8101350, 5006494, 2825372, 4320835, 6385878, 2441802, 7722176, 2846764, 2810130, 1074076, 2164669, 5931055, 7008336, 1157032, 8304552, 216227, 2874981, 6431699, 2737820, 4868746, 1498582, 2014000, 6302622, 3375215, 4920245, 8219340, 7184402, 7340564, 7993595, 6277808, 3815441, 4028574, 6410493, 534909, 2671323, 1133120, 3099408, 7403109, 4328346, 6871701, 1886032, 1743033, 3855183, 4929829, 7470280, 2890327, 1783059, 7470269, 8352204, 254715, 845149, 4186768, 1197392, 8109095, 764969, 6172208, 2526576, 1752136, 7081757, 5240613, 6028746, 2158962, 8043362, 7045484, 7447612, 164476, 6302282, 6922088, 2747495, 2482847, 7862924, 7484793, 3400534, 5030939, 3253748, 7768498, 7588851, 6511080, 8289929, 5782709, 4416241, 7331102, 8341457, 197572, 2764787, 2659314, 5787471, 7601864, 7818168, 7490768, 2010550, 887567, 5123940, 5310659, 4665240, 4899865, 1431857, 3003777, 1872387, 2301589, 416522, 4074528, 8320635, 7773473, 5792858, 804749, 5780622, 1258777, 2009950, 7123275, 4491497, 1072556, 3807313, 1548927, 3868497], +[3099830, 6814088, 588739, 5605532, 2409666, 5731691, 1212247, 4523953, 295554, 6455530, 6507052, 2789259, 8227335, 3680685, 6330435, 3330023, 3765960, 5424381, 5260527, 5549291, 6148041, 7834238, 6864361, 6581748, 6318225, 2186329, 7969809, 2864864, 7696792, 5186985, 5740470, 89938, 1505555, 6270466, 2751594, 656053, 3746873, 1368558, 4334890, 2796081, 8033063, 1414938, 1922892, 1097935, 4347860, 6753500, 6128804, 906232, 1502613, 2430439, 192950, 8306370, 4562165, 8270979, 2674762, 3453157, 3693896, 1831998, 2850248, 406345, 723085, 2778004, 4885213, 7251867, 5763810, 1452703, 8336580, 3342177, 7038939, 661077, 5700477, 2291981, 5082835, 8074557, 3426942, 3071158, 1884756, 3239267, 1521295, 1632494, 2443766, 5565329, 1407425, 3840759, 4555714, 5742910, 3614497, 6404821, 4130027, 4807350, 3280383, 3456080, 2650220, 185317, 1600021, 6613782, 5418821, 2137343, 5384418, 5769396, 5929483, 6903185, 2765344, 996773, 5150927, 819638, 8153019, 6421602, 6716716, 4697850, 346635, 6638824, 4754810, 5542591, 5971936, 354824, 1330503, 3650358, 2831480, 2402995, 5797860, 4813866, 5555322, 6061211, 126130, 2956079, 5225741, 1184639, 6048214, 2515291, 2987416, 7962073, 8242756, 8028289, 3849965, 1913529, 1959976, 7459363, 6958282, 7052325, 5346443, 5954952, 4662122, 7132608, 5414260, 6100279, 4032183, 3397105, 8031618, 1472435, 2509355, 4311848, 4522811, 2023000, 3864119, 7922002, 3758782, 7328567, 5094173, 2902215, 8051360, 7804174, 4711360, 164288, 50830, 7969449, 942867, 5481979, 1700655, 7918672, 3457599, 4085968, 858520, 3057606, 1963953, 5650270, 7355829, 3632843, 5962375, 2417197, 5829999, 3454025, 3903318, 7128875, 7471715, 8258241, 8275054, 3263819, 230724, 4829934, 6182329, 3558532, 2868920, 5390144, 4901467, 6866, 2399183, 3698355, 3386870, 1210399, 5488249, 2818256, 1532791, 6166909, 1743844, 314071, 800666, 4502995, 1872554, 5555334, 4551729, 922692, 1095984, 3579595, 6968999, 4455790, 2832277, 6887810, 1445066, 625105, 1315267, 5993266, 3407820, 651819, 4961247, 5875811, 6417613, 3047501, 8019168, 2337348, 8104900, 4282416, 2067885, 3346873, 1392716, 5225410, 4755348, 7732449, 2426609, 429539, 5347663, 3265495, 5927670, 4515565, 6766405, 2684384, 8124794, 4134012, 4227375, 4129525, 2437864, 99425, 908250, 3842192, 6899851, 6244142], +[5461891, 2165040, 2772851, 8358963, 4454998, 4414892, 1894519, 3049575, 5138620, 5376063, 7807073, 2917980, 1229493, 1246057, 1898158, 741979, 3093340, 3057411, 1266245, 4075299, 5882333, 3508108, 2943050, 8224154, 4290209, 978042, 3028140, 7266497, 1846773, 8321238, 6778775, 5956513, 6860021, 3189414, 7943188, 7770105, 40936, 4715774, 7206195, 5954336, 1963157, 6170248, 7734574, 559076, 6297933, 7747057, 321123, 2798709, 4410958, 7163709, 3151308, 5338961, 6824930, 1722960, 5611226, 5903724, 7970328, 8218772, 1080973, 4410490, 3776853, 2843198, 7958918, 5150323, 7954160, 7623593, 7506859, 7588978, 1812082, 7118595, 6195256, 5789254, 2067044, 2090755, 2948568, 2459255, 3539608, 5634265, 6770154, 3751556, 804126, 511098, 8158251, 5770010, 1079790, 6285424, 2571179, 2345450, 1038341, 7866538, 6511057, 262783, 8036279, 4970092, 697017, 6741974, 6426124, 4188494, 4405547, 7577942, 1124971, 291194, 1509928, 7851076, 3792736, 1096334, 7969303, 5232203, 2894535, 8377802, 3592317, 8254590, 7920781, 920393, 5449847, 40046, 1864654, 4842214, 5323568, 7367614, 7172323, 7143889, 6551924, 8178743, 771242, 7515990, 7526797, 7034325, 1580375, 3182843, 6420773, 4559057, 7303755, 2119440, 2697801, 8091913, 624201, 6975828, 6709697, 2916127, 4109331, 2381316, 4514526, 1532624, 7054672, 7297936, 3064607, 6760638, 1505555, 6608880, 1377293, 1244792, 2495709, 4388789, 3785253, 5676680, 1102651, 6443526, 5041913, 3792647, 7299277, 1294248, 6569763, 2679119, 1312518, 1541749, 5569723, 2566782, 2465795, 1289377, 3820379, 6916779, 5582339, 6355462, 1290517, 475460, 4594379, 2222916, 1766351, 1512525, 1216227, 6619972, 6237491, 6608884, 3538227, 6976397, 7969915, 1665385, 1670505, 3164717, 3637712, 7511352, 1350901, 6460174, 1407286, 2970903, 399941, 682826, 2161217, 3470482, 4073122, 2247201, 7560186, 476456, 768918, 498216, 7289255, 6386660, 3611874, 4650222, 4851550, 274320, 961515, 2847617, 2056524, 8301315, 7735624, 2293322, 2496367, 6707192, 7248300, 2686339, 7263377, 5282958, 1920660, 7161801, 321685, 3742937, 2385259, 5480811, 5943665, 380510, 2135050, 4358217, 1481295, 6751629, 7481820, 5961980, 7694274, 2216073, 837031, 3383190, 5991354, 7539125, 1066883, 8353084, 2409046, 7716285, 3428994, 6302885, 6383632, 3631782, 1343150, 6090903, 2129890, 6452513]] +t0Hat: [[144788, 8221339, 3635367, 6392957, 8097917, 58500, 1015198, 6109618, 3428568, 2306691, 2202273, 3726539, 3534818, 7177558, 7198145, 1437441, 8348522, 5803442, 1891479, 3154328, 4488877, 7070851, 7032272, 4554528, 912833, 4586437, 3065337, 5304808, 3034444, 5902813, 4463609, 2315636, 8162873, 4252834, 2277030, 1560408, 2204225, 2237446, 2376229, 267480, 5769547, 2778585, 5282982, 532912, 1760516, 6580330, 5979389, 4980838, 3779358, 5707355, 1363253, 4635541, 5229771, 2673700, 6418282, 2194351, 8346956, 6637313, 6365030, 3008305, 1363924, 777406, 5421138, 7590173, 644655, 7972466, 2003972, 7215300, 6768904, 2911400, 280140, 6580674, 4085738, 1627581, 3385996, 1728944, 6203652, 2111243, 4610117, 3223729, 3413566, 4674752, 3580959, 4680630, 7009729, 2645299, 5296138, 6216787, 6429026, 7077595, 85303, 8142746, 531777, 4102533, 5597415, 5030522, 466975, 1166425, 1687943, 5011902, 2025343, 4012320, 2419499, 4954401, 5802188, 1935869, 1998030, 2038253, 1333831, 2882727, 6806832, 1365918, 1830820, 2917905, 2144953, 4406583, 1851668, 7661001, 302765, 2862027, 3219835, 5065735, 2742327, 6507653, 6469275, 425567, 4225033, 5610893, 755132, 3129088, 6515113, 3473976, 1266233, 7680948, 2709453, 748540, 2961127, 3136866, 441771, 5389930, 2301871, 1678360, 93881, 2357064, 5386406, 288283, 2153501, 5528664, 6183013, 633388, 266700, 1180185, 4489959, 3621512, 3434583, 336176, 5741174, 6344563, 108352, 6050513, 3598246, 7580682, 820224, 6757350, 3819433, 156523, 8306011, 2996579, 4165062, 829632, 4764402, 704831, 5061867, 459202, 1042690, 7770621, 1653492, 4570532, 213354, 351615, 6953854, 4067030, 4927708, 857271, 8335740, 8053464, 7015414, 288282, 8202687, 4103038, 6880844, 2685231, 4767851, 1707745, 7107822, 6942373, 4892738, 7414765, 587872, 343431, 3607272, 7131629, 6692132, 1527766, 6268252, 6633174, 2198844, 363590, 5539035, 5512194, 701612, 1552477, 5831048, 159615, 1836031, 6586578, 5076740, 2709328, 3016449, 6206603, 3384898, 7775233, 7476523, 5757766, 6778743, 2059617, 1083708, 5569785, 6295999, 6668136, 6121158, 4249024, 7408070, 6347583, 3630563, 6628430, 6927604, 3963283, 7070639, 713350, 1715496, 5201935, 942064, 6170332, 1415480, 85292, 7383698, 5031683, 6080567, 4275012, 7578780, 8063256, 5911122, 8120525, 7050665, 7590449], +[4059942, 3950847, 6162127, 7515512, 7338337, 2854549, 3291766, 3909857, 3291400, 4976426, 5833013, 5471045, 3304570, 4820910, 2125034, 3595928, 6877900, 4685977, 7132438, 6086142, 8318247, 1980335, 2862991, 1375838, 7825946, 1699491, 5421183, 2061015, 131195, 2467589, 2401427, 2438235, 7274277, 2283868, 630870, 1115653, 1754991, 3617819, 486854, 3607658, 1348564, 5792475, 3634882, 3490537, 7115267, 2733861, 4194691, 1438526, 3959966, 2425357, 5828770, 7426165, 326004, 7250749, 1453533, 3919302, 595878, 4997191, 7659298, 5514096, 2755591, 4018786, 5477513, 8138878, 8371060, 1209630, 6549511, 5718084, 985851, 5182995, 8304778, 5058982, 5015224, 2467957, 1199585, 8182715, 3359627, 920478, 1869264, 2865121, 4558061, 601178, 4845680, 5792581, 905306, 4608963, 3314171, 1163806, 8115005, 1754524, 1547528, 2562450, 6811052, 793817, 464749, 8228330, 833292, 8301930, 3196919, 7603973, 569916, 6453979, 7703274, 5731199, 5049608, 2024583, 3302260, 7457108, 2088418, 2838176, 7834322, 3773420, 2747332, 179209, 3947078, 4857233, 1319207, 8213869, 1387417, 361140, 6674967, 5539964, 6325827, 959123, 367444, 4051216, 6665072, 498660, 7013214, 7758201, 6882027, 4407909, 5041344, 1421058, 3160325, 572842, 6748975, 3118787, 2760656, 1592498, 6621196, 7959017, 6105311, 1831029, 5362524, 3338455, 196112, 2427818, 4254964, 2109670, 3399467, 4330510, 551432, 3555154, 125669, 8376905, 4642351, 6907683, 6311551, 5144004, 6545639, 3128982, 2517863, 5477364, 1164406, 4088323, 2588493, 7227667, 5785230, 5800120, 6084928, 1184363, 3461606, 150710, 688626, 7152141, 3763413, 2697791, 3610593, 6496675, 6395850, 2917431, 1396728, 4233930, 7231195, 5047136, 7863516, 7851479, 3914555, 7863681, 4221473, 2372575, 737811, 3515881, 4569288, 500859, 3915882, 2325753, 189064, 7061470, 6014684, 1367216, 6811939, 5606008, 6970295, 452070, 6028626, 1022464, 8333135, 2580494, 2695227, 115365, 1558770, 6641895, 2959869, 1458862, 7348647, 1462335, 6990944, 5347935, 1263265, 198647, 6832993, 5694220, 3932951, 7635539, 2321375, 3119071, 1146818, 1271796, 7453657, 1552548, 4979482, 6879313, 8299313, 1698625, 2549009, 4944908, 5298919, 909675, 1844161, 934055, 7047637, 280216, 2637037, 5552340, 1708430, 3508873, 3414500, 603389, 377268, 7441647, 1834147, 6010895, 1246801, 505161], +[6334957, 7219104, 4183977, 5357028, 2775572, 6613045, 5995856, 727098, 5899235, 7309716, 5657994, 105394, 6763807, 5169981, 2266768, 818511, 813323, 7449575, 4949544, 2526679, 717587, 7725244, 6642750, 6843059, 7051109, 8376491, 2176880, 1402457, 7833907, 4275860, 1969775, 2719521, 3739151, 4563498, 8214421, 5539720, 908678, 1609537, 1211222, 2726927, 6995881, 3971268, 7130512, 7839671, 4258476, 7153669, 1753101, 2055394, 5195730, 7446830, 2945677, 8000719, 7888567, 87415, 1655980, 4921588, 663953, 5473602, 2999935, 2747701, 8204466, 3150194, 7942905, 6384145, 8237061, 443637, 964917, 3986799, 1142016, 3790195, 2769947, 8078434, 7379762, 4653343, 8192792, 2006650, 6388717, 2954313, 3050532, 3654643, 2884747, 5077756, 4972605, 4632366, 5827590, 8202506, 6349771, 3704421, 2534287, 1243178, 7210560, 2840642, 4555673, 7077559, 198273, 2345885, 910172, 469454, 7104165, 1090759, 3455757, 2686352, 3359937, 3770021, 2748066, 4285067, 8098068, 2464351, 7874524, 1100432, 4759256, 6558012, 7562524, 4184839, 7317856, 1630381, 3406918, 2708585, 1667934, 396911, 4515547, 5418029, 4231722, 7667456, 6397061, 287016, 2967894, 1632214, 7425981, 3540777, 2305497, 110318, 6936238, 2443175, 7420172, 2229503, 7370948, 8358202, 459764, 4033137, 7468211, 5759849, 647329, 2158719, 1548604, 3486701, 4240045, 1452530, 5465334, 6220700, 6949201, 8089880, 6784411, 2774812, 2581050, 4497113, 696274, 6805746, 593410, 6616569, 251563, 3976625, 7932341, 7805846, 4067521, 745823, 1186734, 225634, 7436721, 3729038, 3808013, 7294606, 5708952, 1232113, 7140685, 2283451, 7082953, 6778182, 240455, 1881448, 249353, 6246273, 2424902, 6370889, 3110529, 1878450, 715981, 835035, 1486712, 3656617, 2142266, 1274053, 7297572, 3299074, 3228942, 4564360, 488653, 3702914, 1386499, 834836, 6053879, 2633268, 2169257, 3768168, 7676540, 2569456, 5875939, 8005791, 4003507, 813984, 3727570, 2622322, 173733, 4710636, 7520013, 6806416, 2799431, 6123368, 3755091, 4945418, 3729225, 6779583, 3519373, 2807123, 1048091, 6090994, 544485, 3358218, 6365703, 439375, 8069688, 4783879, 832376, 6049947, 8051380, 1611544, 7274069, 1132136, 4265542, 6022512, 5970163, 7732672, 2766222, 7942423, 3588554, 7114007, 537724, 1519759, 6987047, 403964, 8090920, 6589492, 2015695, 6794086, 4867618, 5163768], +[4943662, 2075083, 4328044, 4778930, 1567165, 7377916, 674011, 6078949, 4360103, 6645200, 7186689, 251935, 1470885, 1755247, 7234625, 2131833, 8241176, 6935658, 5589259, 923283, 8232353, 3396697, 1281836, 3377654, 1401117, 7720604, 69554, 6800091, 221630, 2095525, 7990484, 7115256, 2062416, 2509807, 8376939, 3138137, 8105883, 1126016, 126407, 6026585, 5038087, 1083643, 5511979, 5105691, 555036, 5458127, 7737726, 7003597, 5665697, 976337, 4772860, 27710, 791450, 4134745, 6409940, 6739383, 6176144, 1933093, 7564879, 4506230, 1442504, 3715522, 5180031, 4523771, 8047664, 1149005, 395344, 4372633, 1303755, 4886859, 5182447, 8342151, 3109557, 3698646, 7814095, 588948, 1614266, 3701749, 5346388, 415076, 1355180, 8265382, 1519627, 1131909, 4533228, 2986263, 3462201, 4335590, 2627208, 6735851, 8096210, 4570933, 6975828, 2921506, 1419126, 1569601, 2035044, 7483741, 1422990, 7101943, 5671902, 650053, 7523327, 2989818, 8085977, 1072866, 828869, 5349124, 7199677, 5610840, 7382470, 8274305, 5739300, 4831205, 6674946, 3172221, 6941721, 4090819, 7085995, 6788789, 6959676, 1266514, 4880610, 6519284, 2497064, 4069039, 57506, 424120, 2034627, 4721508, 3276253, 3333602, 1295970, 5326519, 5383215, 7844622, 2648763, 6123135, 7171575, 4333651, 5757909, 1695896, 4631190, 5323298, 1089598, 4444641, 1648454, 582379, 2187024, 5982511, 8081838, 5692872, 4155401, 1153155, 1891999, 2479480, 2447434, 6984201, 7020569, 5040173, 3498307, 4668123, 7955317, 1858422, 2242877, 4330036, 5598451, 619134, 4194558, 3457163, 7049150, 4126446, 2596861, 6739035, 6275499, 2246045, 5434687, 5082014, 1753108, 6662440, 3466016, 4046906, 8146228, 2381127, 3623159, 7294889, 3781551, 1131898, 1610141, 2451591, 8331127, 6830276, 5333359, 2912569, 1230990, 8211398, 7876720, 7989320, 7958421, 1217440, 6432883, 3610760, 3204817, 3543539, 2578529, 191116, 64162, 6819133, 4472850, 6456173, 5513519, 2607742, 1282957, 4270727, 5256677, 6925350, 190895, 8285930, 3443522, 4536021, 3176666, 5187269, 6461517, 2800942, 72766, 3340213, 3139813, 8315942, 4430567, 3773230, 642236, 7745444, 7771796, 4768529, 4077431, 4828125, 4407086, 6640068, 6794814, 2866283, 5088592, 6638268, 3019323, 7428823, 6818844, 3319139, 5112533, 7681728, 6167691, 2755139, 980196, 5025564, 912377, 469314, 4863994, 5149739], +[3492587, 3434810, 5096509, 1590334, 3517835, 355808, 1116128, 7788352, 6606156, 2528461, 1068520, 4221610, 1123249, 1677736, 5237078, 5139998, 3005667, 3045252, 2466892, 5083666, 6877238, 6432592, 3747700, 4339077, 236033, 3892287, 3451079, 978072, 3735139, 1926212, 7376597, 4888305, 6535037, 7722734, 5365667, 2879236, 4492930, 5591887, 3455302, 5876222, 5388001, 7269463, 3623475, 8266599, 4757887, 1426159, 5760484, 2668807, 8357905, 2609862, 4476220, 392667, 1223367, 3246401, 4461290, 174539, 4444834, 1938957, 1676196, 739664, 1422086, 1060154, 3290663, 1610786, 716341, 4798154, 5782520, 4636996, 1287807, 5798376, 1107742, 7389726, 2533621, 3675871, 1209088, 2928601, 1209488, 8267215, 6774659, 1870572, 7440298, 5417360, 6444943, 8054302, 1811037, 6976067, 8107107, 4185268, 7236733, 4159763, 4901497, 3450727, 5259935, 2251815, 2769807, 1249726, 3592364, 5293425, 142743, 3268866, 7954621, 890564, 7719278, 5449748, 4453862, 6355695, 8023023, 4724279, 4602066, 2662088, 3913877, 2647997, 3375067, 8286636, 327925, 3541517, 6410166, 1310960, 1414438, 3946606, 2233366, 6451924, 2281764, 3112229, 6771541, 6682234, 1852451, 5051240, 2507331, 4832135, 185259, 1011391, 6108667, 7220979, 5309646, 1893298, 23575, 2431644, 4225630, 7975982, 5831263, 3390478, 4291858, 1970821, 6705703, 1470020, 1271442, 3077013, 2923557, 6554078, 1524224, 5907516, 2757583, 7687937, 1731402, 2475920, 6836218, 5028399, 598519, 2464010, 7024629, 1231523, 727324, 3237579, 7650488, 308034, 4013088, 489219, 1002104, 6657016, 331289, 1007860, 6944278, 1068362, 71503, 1163413, 2415383, 178345, 5252245, 870744, 7593142, 2548158, 1781397, 4647937, 6873620, 3839623, 2990355, 996025, 5598024, 4689691, 3437572, 570736, 744469, 3234271, 4130001, 7764000, 3000672, 7414480, 1830553, 6279749, 6641042, 3839894, 4871149, 4665947, 5221856, 3126192, 8317005, 4481011, 5126373, 7203116, 5289698, 8149367, 205394, 7225484, 7277121, 1941395, 7146290, 981406, 4533184, 6396231, 159141, 7867938, 6433659, 5056865, 2425350, 8118428, 5038407, 2510313, 7578144, 929563, 7179666, 289833, 255980, 1957272, 5451452, 8136206, 4858880, 6375154, 533336, 4366274, 2035809, 5527408, 2324594, 1262669, 7779552, 5989519, 3332743, 6517535, 1622396, 2150680, 481132, 7683911, 1413725, 8339128, 877864, 7489539], +[5304873, 4632900, 2299246, 3405659, 7320134, 6805607, 466102, 3416434, 637094, 4925133, 1792465, 4583252, 3576770, 6090238, 6039997, 6820178, 5244509, 2569427, 6855268, 4675498, 2869787, 3405120, 8069147, 2988548, 2292857, 341277, 3480605, 7057299, 2297402, 2600184, 1965412, 3221495, 1592844, 6018160, 4573560, 7568869, 8269147, 7588831, 2123918, 7845098, 2552619, 4083901, 3807141, 5479612, 5819874, 7635398, 1088659, 526719, 1808886, 7186299, 3174161, 6919114, 1805044, 3798000, 6102057, 6785483, 6834855, 7318267, 2620122, 7932309, 5489847, 1153618, 2228819, 1172324, 3217243, 2379154, 922109, 954867, 6684237, 2349774, 3564187, 2109242, 2708038, 5219681, 7285586, 6272451, 2142888, 1742923, 4530044, 6734652, 5654207, 5328747, 788112, 5060062, 6137433, 448114, 1691492, 7854578, 4066717, 2244499, 6051572, 4197248, 390761, 4958463, 1086206, 5351554, 3262351, 6675036, 2090202, 4864040, 5867914, 4557962, 4376621, 7587079, 5411109, 2181817, 3397771, 7847432, 4223933, 3789154, 7323366, 7519365, 5941166, 744704, 956953, 4691335, 4098343, 4453794, 7104156, 4005597, 7182128, 2322251, 3477547, 3862896, 2688330, 24065, 2353014, 675525, 5199110, 5535515, 4878658, 437597, 1716118, 3281681, 5582870, 4090382, 6753597, 2923839, 5973502, 5159054, 4197937, 5119801, 1984329, 7236853, 1012436, 4228339, 8025256, 4502354, 2517673, 3219636, 5886237, 5916180, 6029970, 1813508, 4554602, 5419717, 4165194, 4300945, 4679217, 4028006, 5963979, 1376037, 8212231, 6424160, 2836729, 1113678, 4065422, 7814388, 944827, 5602718, 2547118, 5772901, 7533755, 323036, 4442824, 2301597, 7644398, 6417045, 2132060, 5321551, 4234937, 6906554, 1635864, 7388064, 5097572, 7094150, 538568, 7347475, 1729328, 5868808, 6543302, 8010900, 6496537, 5603516, 8306973, 3486371, 5658120, 4091052, 5925283, 2766596, 1753098, 4010597, 5897730, 2271632, 5065704, 2410695, 180491, 2402833, 665806, 282295, 1835801, 8030085, 2551766, 5686863, 4693637, 1652731, 3208836, 2625650, 5325690, 8047746, 131943, 34086, 1657802, 7730283, 5576227, 6118126, 5474507, 4975484, 3338047, 5784070, 7632751, 7291807, 6106427, 7340785, 7029574, 1284002, 5298303, 2334085, 6693735, 6989442, 3565156, 4399390, 6335593, 7937856, 1097849, 828829, 847313, 2297582, 4329111, 7664653, 4207787, 5962989, 541268, 2586556, 878354, 1916402]] + +rhoPrime: 426BF2D193968547C76767C38B01FF4C7425BCE393D3AB9837C6EA5DBB0EBECFF4240FBBF3445DB2B1100B7544944E96C6DE50B91D6D9275EFE585A3EFF12B04 +y: [[143810, 123640, 293464, -417597, 162667, 130587, -125858, 454704, 117407, -351414, -443185, 24595, 281098, 332541, -422883, -320096, 55485, -394129, -420057, 405393, 400218, 387810, -356510, 310112, -54216, 151872, 519707, -273847, 441489, -388012, 29308, 398280, 380783, -69999, 243004, -349780, 12511, -49301, -255749, -79257, 259685, -104213, 162456, -133635, 11592, 182695, 470519, -379762, -499828, 110141, -363359, -405216, -134250, -324885, -414281, 59403, 38551, -430782, -447035, -190705, 159859, 284510, -8624, 286443, -309660, -375181, 284292, -492795, -10870, -353905, -161234, -375798, 517815, -428872, -445997, 109504, -464489, 482694, -199832, 22890, -169909, 23524, -22352, 69427, 389005, 249419, -40417, 147070, 107700, -498596, 136439, 518192, 92206, -453039, 74777, -108669, 445936, -425518, 113190, 309537, -424768, -191671, -344710, 296007, 441413, 103021, -28866, -296167, 412061, -377633, -2072, -37188, 516366, -381799, 150128, 439378, -455409, 500944, -369023, -208198, 18835, -454365, -134092, -109582, 198239, 383054, -111120, -352085, -133036, -384325, 433850, -411801, -365017, 456365, -513773, 268731, 6919, -98040, -486131, -52041, -152612, -410880, -350203, -225771, -37508, 60347, -126602, -1666, -219581, 189523, -112078, 451542, -522420, 15694, -28827, 297114, -508305, -374711, -43552, 169605, -19913, 473773, -229303, -55733, 306800, 418163, -114474, 136791, -181826, -524250, 205472, -513161, -478307, -190169, -225067, -473284, 169104, -193794, 228607, 63966, -278999, -126863, -209669, -326841, -350715, -329880, -505037, 519013, -187178, 390980, -391985, 406169, -423722, -218317, -33201, 443323, 393362, -265971, -293940, 363255, 210517, 303156, 441749, 396335, 215232, 164832, 72878, 363567, -336681, 402839, 148222, -316753, 306618, -466559, -27255, -496864, -45660, -197394, 260735, -205247, -349115, 40451, 443221, 64869, 469314, 441143, -481048, 291788, -343808, 226726, -477791, -106488, 440071, 122128, -428444, 20947, -358820, -409323, 344582, -349917, -268674, -168138, 51167, -121857, 196568, 293196, 448319, 379849, -517222, 491399, -239937, -418099, 150908, -168912, 518926, -427774], +[-321069, -326077, 478479, 190613, 96855, 440687, 411255, -242139, 306728, 161830, -172463, 277448, -842, -251970, -74016, -334819, 293700, -141163, -328948, -259848, 40022, 91633, -216281, -260190, 355601, -70258, 14066, 280732, -454074, -36617, 399189, -466513, -99537, 200252, 458878, 30003, 162644, -65978, -6116, -149861, 460376, -303281, 441363, 292260, 122053, 488687, -423874, 96799, -321218, 300364, -251995, 277775, 324181, 426098, 448921, -463641, -475041, 147033, 303280, -391735, 97575, 66749, -338124, -160967, -523476, 264042, 198035, 419624, -161134, -359179, 234477, -231429, 488098, 28132, 21724, -285108, -317166, 299509, -284572, -45758, -381871, 245167, -178956, 44509, -28034, -450511, 55717, -77158, -369056, -438860, -166468, 171030, -312474, -489965, -102294, -240830, 163401, -461713, 230586, 358213, -189741, -297554, -501264, 515308, -291624, 499136, 2347, -94354, -438759, 191369, -167424, -511444, -381544, -150296, 271669, -226781, -385963, -212481, -501533, -384457, -64755, 360360, -513289, 124833, 275888, -224637, 333863, -260164, 336857, 476698, -134172, 120736, 122309, 314256, -75328, 437461, -520253, -354996, -346086, 7324, -94229, 22319, 33716, -295518, -342321, 65876, 225034, 52701, 316982, -463212, 241497, -353454, 258279, -89827, 262195, 259575, -476200, -253947, -337824, 309613, -238157, 154308, -391172, -359271, -280217, 459488, 44344, -347845, 209884, -388816, -143552, -249604, 250020, -243883, 490756, 201421, -34895, -495058, -54803, 428106, 126976, 189035, -457855, 344735, -146993, 173358, -231139, -22864, 126559, 331842, -361319, 505916, 25849, 268425, -179748, 226301, -281133, -470550, -363151, -343, 6683, 107972, -282603, -455304, 124563, 148798, -341013, 484596, 398464, 446631, -185960, 53877, 465116, -78342, -164484, -418888, 127084, -371631, -52543, 63399, -299334, 227884, 373350, 79887, -43217, 109771, -307561, 287312, -129800, 237107, -149052, 482157, -416605, -901, -9833, 496811, -488452, 307745, 204193, -220602, -264008, 210733, -256666, 278582, -203321, 244972, -350578, -406711, -230555, 90675, -309502, 112450, 148360, 301540, -89544, 513847], +[134788, -275508, 229083, -466357, -491032, -258321, 306775, 85980, -225820, -289652, -312231, 155232, -394790, 481788, -140402, -26739, -321845, -15373, -343480, 268410, 477062, -405004, 514116, 475127, -517492, 332270, -49406, 11071, -109119, 167134, 291280, 93826, -486666, 197906, -140700, 427961, 278502, -256988, -81090, 237088, 30729, 122237, 366724, 433505, 269468, -429723, 101561, -462275, 473736, 308548, 448190, 219677, 14298, 338350, -256577, -53290, 403749, 222115, 451086, 65255, 443139, 65674, -416411, -444340, -366054, 53436, 104662, -320389, -211819, -303082, 499378, -456011, 476675, -205606, -65142, 375678, 349200, 368886, 398465, -458993, -317167, 343682, -469030, -386367, -147869, -482699, 309247, -4985, 366158, 271775, -355814, 429361, 183619, 482793, -15201, -505283, -411391, -437173, 43301, -252206, 344485, -354241, 246488, -375010, 291073, -120083, -352485, -54658, -165575, -248976, 342733, 82348, -274728, 162823, 111170, -54661, 345851, -52094, 293405, 163501, 85436, 170219, 429436, -387899, -524238, 233115, 346506, 212499, -372709, 499346, -248402, -51589, -413024, -246921, 50536, -238952, 381720, 297839, 389042, 267192, -443827, 230698, -43783, 266560, -442247, -283300, 133754, 241312, -269951, -512641, 410361, 221444, 76159, -107723, 155413, -85212, 237217, -50319, -146039, 459262, 287839, -151958, -218590, -142232, -483620, 306494, 165912, -224166, -308655, -1892, 132350, 130889, 105729, -120327, -154361, 257847, -317335, -516068, 405679, -449629, -71025, 122966, 195731, 18297, -441019, -321710, 310958, 329700, -265278, -132146, 44462, -314637, -65864, -87739, 73407, -389958, -504070, 131810, 426753, 252529, -302441, -235213, -455901, 103576, -43339, 284913, -220938, 367938, -409704, 57083, -111410, -499998, -299214, -38809, 6054, -53691, 258606, -288381, -207975, 96086, -288646, 359434, 314544, -208342, -236322, -490289, -389749, -214252, 356320, -209439, -140098, -138648, -263509, -227043, -71246, -63514, -180773, 146430, -179542, 125443, -398713, -508150, -20647, 521367, 66222, 342208, 176500, -176229, 475076, 342261, -76540, -174769, -99106, 335606, -70531, 263830], +[105084, 443910, -336307, -363732, -472944, -413077, 232065, -387908, 372505, -217659, 13520, 147668, -376021, 96113, 10472, -111190, -77391, -403916, 464756, -391804, -428088, -52129, -487538, -54461, -142409, -477947, -103250, 29780, -261761, 260422, -474460, 112110, -51646, -360415, -67528, -115982, -211417, -377299, -434437, -93567, 485446, 288996, -199408, 291721, 353085, 211524, -404090, 55955, 267451, 205655, -520588, -461635, 504153, 358621, 308647, 291091, -227961, 327213, -393861, 116378, -114786, -156053, -6142, -64473, -136391, -229682, 485891, 459333, -494684, -274463, -307968, 313289, 427917, -189491, 514829, 181537, -502782, 22630, 286244, -292396, -10147, -64843, 322460, 196891, -117696, 33494, -521687, 473803, 189571, -295414, 477702, 509578, -461783, -499182, -162313, -415614, -509561, -404225, 458575, -4831, -108704, 31092, -224901, 318087, -295845, 339693, 43355, -2618, 79988, -284270, 208881, -334301, 145468, -125660, 238740, 479006, -86896, -400290, 453187, -461181, 518998, 104073, -24457, -357716, -219049, -323717, 454387, -183088, -307935, 219622, 269073, -260548, -77685, -282207, 246924, -110172, 522510, -197, 300763, 33173, 358678, -255370, -409624, -321530, 80369, -98740, 267746, 115501, -294561, -127980, 420656, -53451, -197870, -273082, -264622, -64264, -139017, 136862, -301632, -346671, -212888, 14262, 193116, 9038, -389026, 349718, -88651, -202534, -279131, -45240, -95338, 142317, -325928, 389720, 19304, 379373, -258832, -318029, 270362, 159718, 202231, 385894, -444708, -477632, -436371, 318761, -27107, -78403, -352766, 326168, 162148, 508200, 103548, -156814, -463063, -421262, -326927, 138404, 465619, 185879, -70918, 162097, 252094, -473888, -66987, -509214, -300271, -248813, 307501, 268696, -74995, 32474, -346580, 185234, -21214, 513138, -144302, 190049, 47161, 217268, -35099, -388394, -220280, -505047, 277155, -221030, -57612, 269809, -246395, 222871, 124446, 303441, -17771, -249463, -495460, 356159, -360569, -262655, -483658, 110536, -33061, -17952, 318637, 300939, -342440, 95187, -371739, 283533, 249856, -277106, -500881, 11514, -467857, 182535, 343425, 509671], +[-100251, -197048, -399141, 140584, -248501, -43489, 169335, -120893, 6955, -6051, 396766, 323459, -145488, 140925, 1551, -353587, -23247, 381443, 211085, -215691, -313120, -223490, 251987, -341621, -252565, -271672, -516881, 213142, -293221, -146078, -259820, 476934, 469656, -260532, -128137, 242776, 455397, -53182, 315527, 500149, 238257, 362223, -236380, 397360, -259955, 361804, 215359, 117248, 326190, 121256, 329876, 422701, -282104, 349670, -172473, 521470, -462763, -158516, -362021, 329237, 418901, 273613, 222834, -434929, -394672, 500306, 341198, -375099, -338394, -175618, 4351, 251494, -330727, -47920, -171615, 80168, -267427, 336584, 486696, -107528, -421011, 275434, -243605, 122938, -34152, 209218, 325984, -198607, -473439, -488311, -184770, -70349, 401496, -403389, -370601, 352675, 484916, -261158, 9217, -193874, -323167, -45230, -497252, -45823, -380585, 471688, 67207, -100629, -441866, 264934, 346766, -339249, 273484, 445513, -499769, 232598, -443116, 122407, 206317, 497544, -308985, 254605, -297628, -78685, -391184, 173417, -395495, -362769, -200729, -181987, 2366, 138913, 22800, 382462, -226570, 74160, 373818, 429910, -41392, -341573, -132017, -116121, 306699, -192072, -378108, -311366, -523057, 476847, 184572, 120352, -410325, 316222, 101432, -135207, 52416, 39598, 478117, -310861, -465229, -216909, -37757, -108528, -267949, 25116, 489480, -156932, -518450, -132963, -520558, 113283, 103869, 483631, 103631, -376488, 201831, 442783, 470327, -285160, -284154, -447858, -12588, -119755, -102407, -251841, 338071, 370260, -377812, 202988, -274138, -516916, -30222, -25404, 329319, -239747, 374507, -122349, -337765, -172116, -33635, 389537, 75301, -122609, -189681, -439233, 323037, -295011, 101573, -117467, 126072, -184995, -498740, -95770, 124093, -352595, 382400, -369537, 170048, -154608, 144009, 224040, 515413, 213456, -336154, -127874, -1103, -478824, -28133, 300400, -254614, 139978, -465591, 348758, -66486, -95479, 151571, 17574, 128718, -218274, 283251, -153338, 234094, -391161, 256039, 91777, -393708, 505136, 433880, 363672, 236662, 266960, -511178, 464056, -87257, -430688, 122916, 351204]] +NTT(y): [[6647644, 3736536, 335764, 2137570, 2150431, 1873619, 5642660, 6512628, 6274882, 6704330, 1276914, 2654339, 5909824, 2882865, 3444360, 4761229, 7644160, 5673490, 4958112, 8163347, 6087001, 4455475, 2067215, 2988452, 1421840, 950378, 8288363, 4083514, 3632303, 2342387, 871251, 6101202, 5514150, 5568514, 3434462, 3339661, 6109743, 196298, 249549, 2116065, 8348724, 2322536, 1031772, 5060403, 2258042, 6532900, 5707188, 8199104, 7418648, 3032440, 681377, 7243063, 2268159, 7361912, 1703976, 7013230, 5370613, 1642650, 4770815, 7699101, 5405424, 4627585, 2292508, 4730763, 7967688, 7953819, 2477572, 5489843, 2113968, 2907325, 1144712, 4250388, 2318976, 3400101, 7098749, 2677751, 7734096, 482301, 4841160, 2716998, 6076729, 3235390, 2462679, 7769991, 2955221, 6956126, 3361302, 6782000, 8293161, 1971873, 6431832, 1291943, 6266730, 4390792, 1672228, 2142732, 3767782, 6090002, 7059823, 1113119, 3597009, 495379, 7457818, 143025, 2685266, 5999258, 594597, 853424, 3106543, 1973316, 2884557, 6458706, 7198978, 1160916, 6666186, 1353041, 3687675, 6642418, 319220, 1882809, 3740165, 4390773, 6881805, 6209002, 7446148, 3024387, 2368483, 2064656, 2859966, 5138226, 580742, 4061336, 3543054, 2901161, 1656665, 8327452, 5665897, 4417713, 2641378, 7186625, 4294509, 765361, 2552041, 2438431, 5399693, 3378497, 1638900, 1498735, 5675658, 339779, 6685023, 6024451, 4650832, 2645334, 1428536, 1600118, 1865804, 254589, 4615875, 4220444, 5648860, 3930921, 2055773, 7025359, 3161027, 6898753, 76084, 1046966, 1497015, 8282104, 945879, 930095, 6558266, 4975311, 2774339, 27147, 7981224, 3025792, 1762031, 6619717, 2144690, 6377124, 722206, 7635418, 7824359, 4419755, 7137018, 5251118, 230764, 1616670, 1108975, 6993432, 1218961, 5580547, 6565558, 1055682, 299272, 6657807, 6283095, 7918535, 950800, 6802273, 857245, 4841984, 1726801, 7496980, 2539323, 6596945, 3565352, 7027386, 2190004, 7372490, 7468674, 1692266, 3134102, 3853672, 7014636, 1728704, 4179764, 372338, 6577308, 3115736, 5163700, 8311905, 1425820, 7408293, 124144, 3995855, 1817358, 6780405, 6739484, 1927581, 7865613, 2347131, 1747023, 4409445, 1451139, 6277596, 1532860, 6540080, 3603924, 998824, 5476998, 2746594, 8248063, 2055457, 2641432, 3708760, 3884622, 4596541, 3089267, 3961020, 5325775, 7644350, 860713, 6178032], +[4542528, 8160725, 3765878, 2286588, 4474350, 8253963, 4169791, 2737175, 6209736, 5941507, 4776690, 3740617, 1897694, 6000633, 100469, 1705025, 2151690, 3146984, 2965526, 900959, 7868566, 2586654, 1998007, 8345369, 1599371, 2919031, 2651818, 2252244, 3415109, 572479, 7260274, 6648506, 661629, 7514366, 6572509, 7680820, 2245879, 4851576, 6136099, 5265523, 6893611, 637768, 3046882, 4041692, 7003973, 33364, 1053635, 1895353, 1497549, 2001037, 4543964, 2194666, 7890026, 7930137, 3706801, 6190015, 4202659, 3430133, 5271182, 7226543, 7980186, 1124815, 2216412, 2868667, 1091659, 5316493, 7632496, 1301403, 6888953, 8197884, 4890659, 2579775, 523780, 5328176, 3205255, 6925944, 2118068, 7285816, 7414385, 1657846, 7397485, 1773008, 4344052, 2229636, 5832615, 2324852, 5987191, 6653059, 2616796, 3836776, 1632306, 6404722, 2346042, 2839332, 2570860, 5881570, 8296043, 7131423, 5116890, 4681899, 5017151, 3279137, 7864539, 8088722, 3922814, 7509611, 4592404, 3548843, 353249, 1548926, 3537184, 1027643, 1002965, 4334978, 6527500, 6813212, 7128567, 8129338, 1100517, 6422873, 909690, 5452581, 5977891, 1638506, 7743850, 901172, 7751199, 4498272, 822792, 3179953, 5061479, 3490262, 3096015, 2664310, 2172062, 4725284, 1185888, 3774879, 1278333, 6303642, 3637886, 6981372, 4840557, 149496, 5755037, 654215, 7829263, 2850106, 2538855, 3401286, 3467638, 1366955, 2984858, 5260930, 7944596, 7642552, 7790668, 2388996, 4369273, 3707093, 7916184, 4187905, 192789, 971160, 1203935, 3043795, 4903920, 6404874, 1532994, 2899849, 7282738, 6468051, 3865020, 847164, 698133, 3436366, 7666393, 135771, 1776030, 1059700, 7302786, 118126, 5181349, 3603005, 5539933, 324544, 684881, 7743179, 7295883, 6912702, 409471, 3245105, 6113066, 91850, 6106742, 3599814, 1119575, 8145408, 7492085, 6730203, 1152035, 2666243, 2285435, 2574812, 3747282, 2129432, 2825793, 5244407, 3644502, 2943560, 997154, 7637690, 8082476, 4091675, 7931259, 2338196, 5282976, 5479386, 5723000, 2179939, 6552437, 5816947, 7939486, 6034277, 2791567, 1748964, 7957120, 505518, 6542313, 666523, 3139262, 7647295, 3074677, 1281636, 5347387, 7628596, 3606520, 2111698, 3786747, 7552849, 438711, 180128, 7064223, 4809077, 1982406, 2701510, 7005882, 4881982, 6636159, 5746176, 4221220, 809520, 6644759, 8133026, 2970399, 2706297], +[1983762, 3468525, 4074895, 2623883, 501889, 1526860, 3676148, 8075100, 1026694, 4037145, 6151506, 4189919, 4958148, 4200951, 3285564, 2103979, 7654297, 7855638, 4530778, 7741169, 2139143, 8320971, 3246931, 749652, 3988601, 487285, 403451, 7562654, 1437392, 3617613, 689148, 3134085, 4865320, 4162608, 1237304, 1535573, 6759847, 589844, 5439681, 6569535, 2505997, 3614415, 1593272, 5458736, 3284031, 2542034, 7067564, 6443098, 6678661, 3406216, 4169417, 8320858, 4639882, 262447, 6267757, 5271968, 8291063, 2879878, 5017783, 4716315, 2842308, 7789692, 5665891, 1368569, 5974573, 1050176, 1971699, 291689, 6528686, 676244, 624454, 6016026, 3287294, 1778348, 156058, 6813041, 5968930, 4475468, 3871853, 8284688, 414759, 5336928, 4544972, 2942199, 5989404, 2720298, 5734200, 3703472, 7171039, 5213756, 8067463, 3333312, 8152085, 6612425, 7371696, 1358317, 8264023, 2727283, 3868649, 6425905, 424920, 3952841, 695862, 7027741, 6565451, 7117760, 7065280, 1036136, 8161346, 6350133, 6127616, 5366036, 3228937, 474542, 700758, 3462845, 2603516, 6103555, 2067439, 6767028, 746112, 6622087, 7737338, 4124924, 958741, 6618648, 2077795, 3977224, 4188396, 4739722, 4268727, 5879584, 7749935, 2648738, 7892146, 4260421, 1807258, 6689826, 3375585, 660411, 3183625, 6281524, 7136127, 3190605, 5091751, 2427928, 381451, 3233175, 5459922, 3793609, 6569024, 5889130, 4190037, 1130915, 7852795, 3425508, 6861033, 1655096, 2598951, 3109887, 2235413, 3900478, 4405155, 6692971, 1677396, 285624, 5227561, 7349422, 7056235, 1040706, 6502638, 234303, 380383, 8176405, 3542711, 8005432, 4712424, 6462678, 7579477, 4014973, 4154059, 966496, 2142475, 6925836, 3424030, 1465169, 488381, 3677635, 696485, 2540915, 4670389, 7067093, 6727648, 5486985, 5697518, 7605710, 3598366, 2924764, 1730035, 2686113, 6541076, 6184164, 4391611, 1805135, 313705, 6161372, 1122576, 8193154, 1006871, 4993559, 7853212, 8233864, 3375358, 7330317, 4289960, 5757814, 8271863, 2035361, 4501928, 2989040, 747486, 5931390, 1310260, 6358297, 4729112, 6307753, 5484609, 1024159, 5661796, 3053583, 2375404, 826233, 5339435, 361749, 83179, 589614, 6827108, 189089, 3851646, 7393238, 2072648, 5284568, 4375003, 3689298, 3848129, 3302209, 2914409, 826678, 4321060, 2185568, 3571433, 1100697, 260778, 3525419, 7909026, 5565907], +[8048190, 68021, 5370941, 5846834, 5841984, 2365888, 6445319, 5052494, 1771742, 1276962, 3195414, 7458010, 4851066, 1470042, 6402258, 563278, 6391186, 1962130, 4396625, 2093018, 5569984, 1364861, 546743, 4467413, 4749534, 1987558, 7138435, 6721397, 8349878, 144379, 6552624, 6685207, 1269148, 5440603, 5242593, 188996, 7053941, 6884352, 2869260, 6429968, 2828836, 3909188, 7490475, 7050197, 6713074, 2384795, 3098938, 7080621, 5350016, 2073237, 5822440, 4833581, 3538733, 2384197, 6436895, 5753898, 5603397, 7193553, 1323402, 4434899, 6910958, 7349875, 8286653, 2264136, 2159551, 7049833, 563491, 5322833, 8276525, 7964494, 5626836, 3781339, 2870873, 6102346, 2325583, 8049873, 2737294, 6320917, 4505967, 2819524, 4805474, 2104945, 8258263, 6346063, 5949021, 7570263, 2904307, 241645, 2593019, 6841124, 5835090, 5861241, 5189521, 2339646, 151778, 7153875, 3814324, 7512499, 1492021, 8073055, 1940487, 2358618, 6470779, 6680092, 541041, 4838726, 8008313, 4888375, 6160089, 5042068, 176059, 6575678, 1439877, 4170782, 5575449, 7276733, 6598030, 6165923, 2422153, 3908602, 8271847, 6282428, 8117471, 1704849, 4259787, 7887122, 8014906, 2354487, 2854000, 930303, 5088064, 7576112, 3486561, 6223909, 3269611, 7800997, 3164579, 7845214, 4249481, 114871, 1374511, 7952475, 4921128, 3526690, 8306779, 3136965, 5921336, 3235145, 701593, 2534676, 5859745, 5001261, 1873122, 3930617, 7349568, 72871, 2443080, 727198, 8214213, 360561, 4280959, 4233957, 4252803, 3988864, 5406669, 6099986, 4555504, 8073746, 3377281, 8052522, 3047912, 5283352, 6323350, 3496080, 7010447, 7773357, 7308321, 1844496, 294506, 3055804, 4162153, 7711148, 4470366, 5048033, 3366332, 5966133, 294985, 2632573, 1831722, 499008, 1192035, 6660934, 6927290, 3723759, 7994598, 7446102, 3201296, 3308584, 5169902, 7518646, 3852198, 4622163, 5348834, 2276024, 3307425, 6218651, 6764656, 5844797, 3868605, 45020, 947985, 552028, 1491435, 5132855, 3212176, 6035816, 5919751, 1343185, 3188354, 4603233, 2585764, 2865343, 7122668, 6270933, 1059199, 8306104, 2926550, 7103625, 1793279, 7372984, 5665330, 5785405, 6104513, 4235884, 2361352, 1522858, 3800481, 3730149, 700382, 212339, 7906900, 6096411, 509082, 2503278, 1579323, 475525, 7478535, 5891178, 2691536, 5053434, 1123314, 3859810, 4634897, 4811317, 432282, 4747148], +[658397, 6875506, 192705, 6382226, 7722261, 8282313, 4607845, 3500461, 2531245, 2097569, 4335520, 4797631, 5455576, 8250533, 7102917, 1965533, 594004, 6656324, 5635228, 7381175, 4404732, 7310491, 1811496, 1956396, 4603034, 32226, 4773985, 7054348, 5319598, 810452, 5454530, 5057900, 6482017, 2495714, 5010033, 3755837, 4053231, 242949, 4156322, 983049, 2203988, 3660789, 2052964, 3988402, 5259861, 5933290, 2696710, 638651, 7631942, 2067046, 4702453, 2582864, 656735, 8339013, 3011483, 2734553, 4197057, 1496888, 1681443, 4997174, 1679313, 3205814, 7839642, 2847130, 3722522, 391223, 2859220, 3973303, 3907740, 6967824, 1519505, 594647, 7607559, 5401449, 4706574, 6704546, 6352874, 7190426, 2479233, 2719985, 4824234, 5112891, 5968983, 2585888, 5565965, 4977616, 8217851, 8377647, 3837027, 2550127, 8172942, 1161637, 7064868, 6557734, 5198356, 1551174, 2908101, 7052291, 489672, 5305025, 6992308, 369889, 4421323, 1573266, 7491644, 36599, 5499931, 5887550, 4325155, 3951169, 486464, 2359017, 5502082, 7471623, 771288, 7652279, 5770370, 5170016, 3956394, 4629286, 5661638, 5436771, 8192301, 7754195, 2577364, 632217, 2980661, 6518584, 5824295, 785873, 5123691, 3649848, 2078006, 7923119, 7790733, 2178278, 8223447, 6113891, 837389, 7948699, 8121968, 6737134, 5326341, 4916884, 49119, 1974068, 6029451, 770353, 5239484, 2737375, 93418, 766801, 2130942, 5079976, 1862557, 4350723, 1614932, 8236270, 5394401, 5680707, 7946919, 1086013, 1561597, 2950282, 3476870, 460136, 3839514, 2263795, 4516599, 2340804, 6093115, 4725345, 7438269, 313510, 4161280, 4227325, 5950029, 2830910, 7964857, 7130316, 3946871, 2194079, 2720004, 3559006, 5671148, 2334942, 7175689, 1612249, 3559015, 124304, 4594610, 3752837, 8142756, 138382, 5869190, 3237136, 7030705, 7906004, 7880232, 2414110, 836606, 4112530, 3291079, 759493, 6402483, 5323344, 5446099, 3219357, 4916824, 8238366, 411227, 7150123, 6721039, 4366983, 1095844, 5426516, 1533465, 4857477, 451193, 5230177, 7850733, 2952537, 645393, 4766513, 4116616, 2838455, 8143626, 3698772, 4649491, 7783759, 1038895, 3072, 8156282, 2965986, 7404197, 7904615, 5618961, 1973433, 7191053, 7327233, 3890208, 7825997, 6224119, 993940, 7460564, 2187662, 43902, 7790633, 3379652, 5456179, 6347256, 8133601, 598532, 3739093, 1493550, 266986]] +aHat * NTT(y): [[3030962, 8163160, 7615388, 8261104, 7974524, 2409962, 3629073, 6437734, 7307917, 3213063, 2293346, 70396, 3137848, 5209543, 5325091, 7138614, 4939934, 3670474, 4202986, 4662214, 4721740, 4445580, 7864969, 1076743, 7686369, 4501100, 5799899, 293292, 1053624, 3103024, 1519801, 3898029, 7699386, 7663597, 4275215, 2777998, 6140433, 6105163, 4925372, 6572594, 1171262, 8092114, 7661899, 7707877, 7726869, 1333347, 1420525, 7368945, 1176052, 3218251, 6099701, 2864543, 5954696, 5251601, 6659643, 2847757, 3303038, 7200575, 7801771, 1346663, 6016570, 2675096, 8344045, 95790, 5374594, 3898271, 6672564, 2135665, 5168766, 46261, 1464361, 6019049, 4844021, 1431199, 115585, 7286950, 4924150, 3601252, 1537190, 14109, 7308161, 2996320, 324302, 8370075, 7475094, 7007850, 843492, 553125, 4840607, 6043487, 3862902, 7328126, 6500889, 5157829, 5447907, 4424908, 7091305, 5745548, 1721312, 403708, 5954378, 7107480, 3111264, 153283, 3560733, 3239737, 5138969, 2586553, 6120107, 5223098, 6493454, 1946788, 7462675, 1668162, 1343275, 1266822, 2607493, 2408477, 1971912, 4269453, 6059056, 4054487, 4037053, 8076535, 6829055, 1958033, 1438537, 1575748, 97535, 7619686, 5977397, 6523685, 4285621, 4151438, 5383397, 4661993, 1210540, 800115, 5344539, 6065637, 545398, 4132071, 270952, 6863740, 7939381, 6112945, 71128, 6133789, 7777995, 5044893, 964387, 3693579, 1465636, 1426737, 834189, 6281488, 995728, 6017032, 4533737, 2076225, 264512, 2082531, 2942921, 621766, 6260115, 3772835, 4403858, 8134407, 304345, 6818090, 4527925, 625552, 5990065, 7190845, 1272898, 82753, 7454674, 6536513, 4526862, 4919559, 4764103, 3237803, 1812896, 7151103, 461700, 8031408, 3867252, 4110719, 7070780, 7525441, 1498561, 4610857, 5707009, 7654727, 2359121, 3844323, 645428, 1959214, 6002443, 2722841, 7557877, 6155879, 3498826, 1491714, 5198278, 5412084, 1910113, 4021798, 277796, 3809033, 4456542, 5093347, 2434636, 6802808, 5587053, 1078506, 2306715, 3588354, 2520850, 7198826, 6155522, 4981982, 1786696, 527385, 8246570, 3678366, 3591608, 1351781, 6812123, 5218997, 5900160, 7101052, 2474073, 1927984, 5141014, 5929704, 6892206, 2086828, 2734038, 931257, 5620262, 3542791, 5061767, 7220507, 3257745, 2784415, 5464079, 7273449, 5258527, 8237054, 7243169, 2655642, 8060812, 7438108, 6524376, 5487731], +[2283115, 2242425, 7717285, 1739848, 7631041, 1255290, 6551101, 6606948, 1222761, 7355026, 3906252, 7517176, 2262854, 3070470, 4517247, 392023, 23334, 6654188, 6997159, 2412888, 6152372, 6346775, 5526210, 8146769, 3212430, 6075101, 4402551, 7092918, 2881113, 6713862, 2415568, 2479780, 2039773, 1079634, 1827815, 111623, 2728106, 3266834, 5338865, 3052624, 7126541, 4154709, 8165321, 1911126, 2124864, 359287, 953281, 3599221, 1547224, 2005633, 925473, 5790045, 6768232, 2073172, 2138083, 7748239, 1203389, 3677135, 1338126, 5502778, 3992231, 7352771, 7724192, 7613048, 3977688, 7743138, 4280930, 4344774, 3501967, 4138846, 6588358, 1088062, 5402613, 4942348, 3348838, 1035803, 6294089, 5030750, 556568, 6004995, 3299244, 7135256, 2112285, 6820293, 8292545, 5874770, 6828581, 2096171, 527515, 1569079, 1743184, 7428129, 275538, 4493114, 1231703, 631658, 460846, 5151438, 8236504, 3257412, 5087941, 4528498, 1768057, 5098065, 7049578, 6846941, 7756584, 6329001, 3584897, 5123111, 6711221, 4817965, 443700, 1402960, 153110, 5582268, 5105838, 2810925, 7930654, 3245224, 4033440, 2692211, 4837942, 5902983, 5834802, 3815181, 3942413, 998936, 7089893, 1724397, 7307588, 1465588, 2204951, 5659262, 4732040, 8065579, 6496795, 7128070, 5871199, 7964831, 6500212, 900136, 4852965, 869934, 6837036, 4902021, 5489717, 6075177, 469366, 5774769, 611437, 2010937, 6198207, 4858872, 7613258, 4823001, 7483359, 7572830, 4931521, 2632040, 5415839, 4531590, 5402586, 4378224, 5417345, 4948355, 7946674, 4086802, 3972333, 1002874, 3950127, 2261108, 1283152, 2742628, 4977451, 1989561, 7434286, 1031567, 5110542, 5341270, 8046931, 7417845, 1163381, 444576, 1921903, 3685436, 4393622, 6857008, 5336355, 4475807, 5234626, 8169715, 6065054, 3756516, 6380649, 1062519, 5293422, 8037003, 4234448, 5257707, 3817669, 2204217, 3966050, 7342516, 2669286, 7541465, 1750968, 105914, 3507487, 4144134, 8296572, 1005515, 3521582, 98842, 6665436, 5919734, 6122568, 7470943, 7960274, 5398434, 6128852, 387833, 5648740, 6588328, 7458310, 577489, 5473254, 111864, 1796143, 6308161, 6303952, 3807229, 476372, 2177983, 2946120, 6537697, 3266146, 7953254, 1249328, 3757003, 2439580, 3311980, 3889910, 2811318, 4041100, 3883550, 4905475, 5432031, 3951425, 3547143, 5726106, 8363061, 2363045, 401235, 4490175, 2815662], +[6038520, 6549261, 7274156, 663731, 8329793, 5983116, 5175477, 7660958, 4708220, 3624908, 8299198, 7618214, 2805475, 6011274, 5072841, 7593957, 6353852, 2342824, 3882638, 6338748, 3266859, 2219384, 5989675, 5552964, 969863, 213522, 4688543, 301382, 7884137, 2239714, 6539163, 7965048, 1569881, 3828853, 4471499, 354644, 8091253, 1473475, 545987, 2129136, 3072245, 1794811, 3206483, 656616, 4809443, 1832682, 1165041, 5307903, 7530955, 8003082, 2530098, 6499550, 577959, 250880, 5914505, 3699777, 4066642, 2504623, 5390222, 4284947, 2101270, 2021702, 7322621, 1913924, 4613745, 868774, 380590, 9642, 8012710, 6048020, 2336229, 3953477, 2699748, 539956, 7813996, 3519677, 5651965, 2213153, 7672692, 3248266, 8115624, 1662674, 7872227, 2490906, 7801722, 5137464, 5275851, 7524375, 7290659, 927065, 1753407, 1596912, 5433332, 1618723, 7403553, 2143183, 169142, 7127496, 1228856, 3407087, 2543716, 5582550, 6859547, 522315, 1439284, 3345620, 6894248, 3952220, 715740, 1259, 8167061, 3110708, 1641560, 8151396, 3783414, 7233114, 7023962, 4429087, 3736045, 4118876, 6267967, 3731681, 3264627, 5271397, 1771122, 5670915, 3721598, 234072, 5522185, 565542, 233780, 7405065, 3305330, 3093775, 314617, 5993008, 3911238, 7611626, 4920649, 7629631, 4294498, 711449, 2171707, 1331618, 5968957, 4643167, 7184308, 5301969, 6011939, 2978012, 1989340, 2612444, 3512674, 5504276, 7530859, 2371685, 3106934, 7206819, 4117724, 6474355, 7442576, 4697391, 1070627, 2321212, 712359, 6251932, 4027985, 3704496, 7729905, 4411514, 6272478, 467794, 5671377, 8244588, 4326979, 2974618, 6748479, 8056830, 5483421, 6283614, 842955, 7088187, 2119738, 2682123, 5505226, 2767573, 3696751, 2569995, 79034, 3396438, 1416979, 6442508, 6110568, 165520, 3621268, 763770, 4943122, 3809936, 632685, 6243151, 3979092, 2716172, 3111816, 1588436, 3949294, 7637536, 1013743, 3114598, 3426140, 6554634, 8198013, 1427735, 734953, 1747495, 1146283, 2453244, 5225233, 2405080, 219070, 5500844, 4974549, 6843424, 5898186, 7547882, 8262076, 3556353, 6656424, 6315649, 8146509, 5903564, 6757747, 2740238, 6934013, 4547277, 7793994, 4857209, 7840482, 5302703, 6388141, 5674142, 6183398, 2094785, 4908307, 7460408, 2699770, 7758191, 5030519, 5530444, 3729840, 4377291, 4869679, 4391888, 6381782, 8303425, 2180012, 6931496], +[5578188, 3555640, 6998607, 530305, 4289043, 965980, 5701026, 4696390, 5655315, 6253867, 646017, 5890928, 3440616, 6235954, 4894939, 960093, 3802923, 670783, 2307471, 4322870, 4937296, 593064, 3585771, 8189482, 3164500, 675361, 5953791, 957055, 6821369, 1651646, 753178, 77625, 1852149, 2895876, 7624815, 8126568, 8315427, 5522307, 7236443, 7509982, 317607, 1179043, 7052382, 4917032, 7562400, 6711575, 5104127, 1057663, 5624003, 610261, 6761773, 2112370, 4953457, 4670379, 5654974, 7402890, 4226249, 7152637, 7145453, 3309509, 22056, 3801037, 497536, 4398191, 400931, 8293825, 1209921, 5559725, 6724770, 7950747, 5185053, 1449691, 7862351, 3620825, 4997682, 529079, 3209284, 2052005, 6867464, 2345305, 7750265, 229142, 4242384, 6645649, 6801237, 6465520, 1543887, 3813449, 3820033, 878553, 713698, 367440, 5062885, 7588117, 2757979, 4305588, 7517144, 6282771, 2346313, 3931595, 7588644, 5340542, 6151651, 774379, 4673031, 266579, 6156103, 5380007, 7535674, 872186, 3957088, 6677601, 6444240, 863416, 2130308, 5282025, 7442743, 1441448, 5363710, 5869382, 5000550, 3890682, 982448, 6793663, 8020652, 780526, 5697478, 8351754, 2202741, 3397087, 7255701, 3804458, 1667277, 5693210, 7732000, 4492357, 2814870, 6148178, 7457253, 2687217, 1918273, 8028129, 7777402, 1362653, 5822564, 7657187, 721265, 8101858, 5423782, 2201209, 8038368, 112986, 8230088, 4698491, 3474424, 2429818, 661572, 2590144, 7038448, 7581403, 1116510, 8042810, 160994, 4042710, 1629497, 2933680, 4667054, 1335598, 481500, 3093087, 4774430, 3057726, 1106953, 23746, 7283301, 1687855, 5496906, 6679959, 2302148, 2134316, 3744554, 2973159, 5015560, 6848965, 806823, 5846573, 3367159, 8013469, 304667, 3352768, 3370357, 3262752, 6035170, 6216021, 6374477, 1428962, 4570768, 832949, 5248054, 1270148, 7025838, 525047, 5623466, 1355616, 3686171, 2803396, 5147057, 2560275, 7011366, 5568697, 1628537, 6851434, 2338434, 2837799, 3331499, 4389380, 1986071, 7061550, 444426, 3941774, 2445480, 5816892, 7768894, 5668695, 4198240, 3307273, 4446357, 1458809, 2973741, 679809, 4213425, 6121419, 6994884, 3542131, 448659, 7510036, 3375262, 1754605, 5144744, 7787543, 4091440, 1577251, 6154408, 3475063, 6880374, 6589009, 4122509, 2803850, 1858227, 2592776, 874127, 2601120, 3754534, 4413971, 3577524, 5838008], +[6758145, 5922560, 2048600, 7571929, 3261726, 3044315, 7782520, 3651866, 1744036, 3922529, 835135, 7478696, 3024280, 7427146, 1711790, 1875610, 268315, 7894585, 1126935, 5958887, 2195252, 6069918, 7697858, 6618605, 3737868, 3476589, 5095915, 710859, 1177224, 6571115, 7824583, 3518847, 1767527, 2582854, 6841285, 7907162, 4707658, 6251580, 1952456, 2004724, 5598384, 3786963, 3134407, 5974879, 1683357, 7378244, 7720711, 2852021, 394392, 6656972, 6931090, 4342998, 6002128, 5948366, 553549, 6380641, 6530598, 2095902, 7787444, 6583736, 1403127, 2578087, 6500521, 1100987, 2558206, 7836377, 7768318, 8275435, 4844309, 219877, 8250893, 6533248, 3319737, 3015897, 310872, 4508045, 474136, 5363047, 6701232, 1461617, 4740239, 3697607, 1429953, 5500961, 5514545, 5386011, 7353319, 2179171, 6033060, 8019796, 3272599, 6995700, 6273262, 6512899, 2427604, 8292690, 3763758, 6097906, 5932976, 5294265, 781982, 7621206, 8299564, 5234238, 1175538, 4553761, 6995258, 5033115, 6623689, 1613989, 8103229, 1595831, 4392675, 5501327, 5739269, 2916783, 8239916, 2558459, 2325386, 1788006, 6116327, 1747451, 7875616, 7401527, 3955211, 449606, 5158104, 3520960, 7785684, 2547328, 5881470, 248889, 8256233, 5474898, 477526, 8210713, 7331926, 767443, 6181754, 7614880, 4025941, 4465288, 3108505, 7606480, 3995817, 4860131, 5655800, 3613499, 3453982, 1359577, 3404574, 1111617, 7853579, 2997156, 398181, 4361720, 8148580, 7233032, 4815786, 5462271, 6309879, 589910, 2382160, 1189322, 5619663, 7452693, 1995360, 2213823, 870698, 2099002, 7559846, 2059713, 8003742, 2348113, 287963, 6651794, 1205923, 4215059, 790071, 4579742, 3012418, 8094284, 6861422, 1372357, 655027, 3853052, 6701464, 433831, 3756371, 1027923, 4379552, 745074, 781506, 3381493, 5792387, 491947, 8262485, 7065658, 175997, 2566791, 4826104, 3507857, 4322769, 3885084, 508461, 6466889, 6571989, 7804531, 6007038, 7032582, 342039, 8215371, 2118152, 3404932, 6030803, 1593492, 152296, 3828787, 5944129, 1235534, 7137582, 1261219, 8260098, 3589276, 2915823, 6587619, 1358783, 4151648, 873194, 2677994, 6142149, 3864, 875369, 2874234, 394800, 5959067, 1245216, 1147201, 7624684, 3535448, 2016766, 6616128, 2013931, 2045121, 6913794, 1802232, 3864737, 4602785, 2471337, 5438200, 1400612, 8217320, 2670614, 8061685, 7598350, 6761546], +[4888731, 810472, 5895608, 3680701, 6133197, 2833490, 6754027, 4464140, 5704350, 7728508, 8357456, 7712443, 7295341, 659194, 4449085, 3870874, 3643523, 7327077, 7140369, 3434712, 4553581, 5573554, 1639043, 712979, 6250321, 3165607, 4475886, 5806768, 7674070, 602962, 839570, 1390748, 2372040, 3833492, 8061795, 3618772, 7055406, 687554, 7580845, 5171459, 2969319, 4533779, 4682951, 3122800, 1910969, 6310945, 5918757, 7356487, 1435969, 4768211, 6328588, 7217697, 767299, 2148911, 4199002, 3207214, 4190743, 1544358, 3849531, 2038747, 4344367, 2108713, 2350930, 1106857, 345784, 90248, 5954006, 98034, 3650481, 7232181, 723651, 5351799, 4766199, 7870087, 4267522, 1712965, 1536814, 1080872, 1419116, 5017850, 5628454, 6033331, 2319907, 5757390, 4886243, 7797718, 482795, 5587362, 1197686, 2026402, 5201533, 2166011, 4384874, 4472222, 6455470, 2371383, 8042944, 5319003, 4920931, 7883548, 6467778, 2309628, 983099, 7766063, 4683456, 3685612, 5202154, 7723734, 3695381, 7987601, 6818635, 6403168, 7593095, 2120483, 1944382, 6218629, 4931018, 1899402, 838461, 8131354, 6324225, 1865637, 2300287, 3656444, 4838607, 2656646, 4795961, 5226735, 5610745, 3581967, 8225771, 7553342, 2202496, 3948581, 5585489, 755660, 3073984, 1177524, 2330310, 2021395, 3387606, 2070192, 4915323, 2354287, 7891168, 2493128, 2520502, 3264126, 1601408, 4687615, 2950665, 5134626, 6087898, 1267492, 6683789, 8208395, 5138952, 2279538, 5532182, 6829204, 4751857, 7904465, 638734, 2196264, 1548798, 6150416, 5562831, 1111581, 7238043, 4911114, 7075957, 8287660, 7942807, 4735890, 8252586, 1120994, 3069873, 3303289, 7960406, 1958484, 3296983, 1237829, 8371690, 1811514, 1309629, 4503582, 8325469, 2464880, 2971885, 8072530, 7308458, 7880149, 2737073, 1079697, 2232407, 8205077, 7247408, 538191, 4429783, 6194127, 8357272, 1075210, 5635120, 2058478, 7516867, 6734978, 6665286, 4092516, 766396, 5947060, 2814049, 64961, 5768210, 7961527, 2821939, 6177222, 1483809, 3992047, 3914519, 3985173, 5890344, 8144479, 6216926, 5818061, 7334512, 948381, 1782388, 260024, 1489974, 2698786, 2041539, 20700, 489920, 5643562, 2907311, 7083022, 1382614, 5100647, 6409034, 6132724, 2002985, 8168005, 5489639, 3342669, 4729422, 5105581, 6202407, 2080249, 7489315, 7323518, 6256079, 3404167, 6372233, 7327484, 4606710, 5946574]] +w = NTTInverse(aHat * NTT(y)): [[1398502, 2912460, 1321383, 4677021, 5037058, 770457, 1975114, 1929754, 7527149, 6975674, 7408973, 3608183, 7516655, 2019037, 2575360, 1872448, 7669162, 752181, 5764812, 6035002, 2277848, 7687903, 5737979, 6804860, 1238237, 5565, 5784306, 8332228, 268170, 2868211, 3452699, 5632804, 3994348, 3863645, 6025339, 2672916, 876342, 4737290, 707832, 1806450, 1259726, 4014079, 4910408, 6085648, 6339010, 6307471, 7058887, 6518711, 415698, 3513779, 3277027, 3932836, 5788579, 4542047, 5141400, 2890456, 4742223, 7784002, 4903903, 1361795, 3030918, 5409401, 5294076, 7190464, 893437, 8306029, 8314424, 4908347, 1559527, 7347799, 19753, 7300999, 7872955, 1402006, 3591098, 945510, 6640529, 83131, 1394419, 856988, 6889187, 4414911, 5432132, 4716266, 1555042, 5752847, 7990724, 7019160, 6124647, 573749, 6351585, 2847186, 5603594, 7413897, 6382408, 7260047, 2707020, 4068074, 4108924, 511946, 7882619, 1973529, 7034447, 6347735, 3968544, 6148313, 4153262, 3697959, 7861276, 7300841, 7628281, 2396581, 6360633, 4462568, 3524058, 4375369, 2300928, 3723128, 2847051, 3045693, 7480174, 6960467, 6436219, 6058765, 4490192, 7219978, 4918766, 473314, 4009340, 3181010, 5228911, 4508560, 625940, 5331929, 7016399, 6756661, 1695450, 3561478, 2788678, 8319759, 1510251, 2337707, 528800, 3685714, 3879827, 1200795, 1104858, 5053594, 3931505, 4914525, 2717995, 2529614, 315125, 5641426, 6028516, 570013, 1696373, 4484677, 1285991, 1637224, 4500393, 3762399, 1410197, 3001875, 7307829, 3347405, 6823890, 5826209, 3000752, 2089494, 1896508, 1401788, 7960903, 5556290, 2020378, 5635088, 3432287, 5595321, 5577518, 2944611, 1623173, 1793647, 3498838, 7469718, 4045380, 4629346, 2683517, 790724, 4659817, 5778432, 4661588, 2254904, 6462906, 5233226, 3337730, 6527731, 2781262, 5731186, 6350654, 2485933, 5376945, 4419057, 846702, 6533115, 3579420, 2342898, 587953, 8138041, 8032078, 3078068, 1067586, 4406355, 6949698, 6967603, 308195, 5177076, 3933068, 5077730, 7685517, 3714665, 2986435, 1315337, 2699819, 5310962, 189758, 6744849, 6773281, 1115597, 3819264, 3077323, 7354116, 2283575, 1170076, 3869631, 5677829, 4399059, 2031922, 1218108, 5821288, 3926416, 4764401, 7018327, 5785718, 7819319, 6777266, 4102382, 5242905, 2055587, 8136576, 2720927, 2926958, 4395652, 4549232, 888111, 5671653, 257320], +[7491859, 8088505, 1665651, 3891088, 4063580, 4132058, 6543527, 2638803, 1773535, 1148810, 699174, 1076699, 709915, 6277404, 36639, 7449039, 2273951, 1929814, 6213553, 4332948, 3506625, 6810896, 326774, 6265881, 7116137, 3892893, 7474035, 1538437, 7450570, 1523099, 2455904, 3502584, 6394681, 7377197, 3012741, 6434932, 7725116, 3253611, 4736759, 6173971, 3349133, 1025992, 7224926, 5806128, 2376108, 8301402, 3920784, 6436236, 3304777, 3688454, 3250348, 3356623, 3822065, 1126519, 7309887, 1359258, 6496710, 7909561, 19274, 1556592, 7112048, 3215440, 7275370, 8129218, 6664220, 4701960, 2075196, 1046788, 6544078, 2995295, 5090244, 2634948, 4370079, 1148536, 1389915, 3021780, 7196594, 2179952, 6861706, 4028513, 7485354, 4266242, 5791389, 697462, 1951250, 4237964, 6410808, 5455525, 6717162, 2192273, 1836977, 5130763, 6717728, 5049768, 5942723, 1306317, 4544924, 5030292, 5345258, 7121075, 4721625, 1565965, 4117014, 2830749, 7107187, 4848216, 6918495, 3751237, 5091367, 4698270, 2254704, 6292895, 7583140, 4004953, 2481785, 3379541, 2433271, 6865801, 3105539, 2221740, 1999730, 4322106, 7399281, 2641175, 1639393, 1516896, 3729957, 1943686, 1540973, 2831577, 2001623, 2612206, 2939829, 7976849, 3358274, 303588, 3941997, 5836041, 6210767, 3142928, 1080540, 2486699, 7163866, 411210, 3826143, 3146979, 5194887, 7557465, 864196, 80923, 3195099, 4006305, 1113924, 1590136, 4393074, 7093319, 3611143, 2794130, 2586998, 7416999, 3936166, 2619601, 2740687, 1139634, 4634100, 7161687, 614731, 7057330, 4670493, 3583923, 233790, 329505, 5482756, 2169254, 4895047, 7761774, 7526046, 5921397, 6229959, 1526016, 5452387, 2940702, 551851, 3611522, 1800813, 2670204, 883166, 1222575, 800075, 2481457, 311472, 4177981, 7225104, 3776588, 2453912, 885446, 1032344, 184908, 8241345, 8220674, 3474149, 1505366, 7653176, 1049546, 6340670, 443723, 6026904, 268467, 6885125, 6578472, 2853006, 1906590, 1252177, 2478651, 8242234, 5532950, 7538236, 4926338, 1058326, 4791909, 4500516, 1731481, 4130254, 1589872, 5725072, 6659309, 4260306, 5650064, 6885632, 1752696, 5341951, 5701597, 5049760, 2798248, 6884609, 5795927, 2400998, 2509239, 7532867, 2006346, 2018049, 6193174, 5385053, 2620480, 1338235, 446838, 2128030, 4510721, 4134538, 4947976, 43716, 3104359, 5991899, 3931231, 3897220, 6338002], +[6216886, 2405060, 3403288, 8161322, 4098055, 917281, 2735971, 7054374, 627751, 8086504, 5581260, 631281, 1546330, 8146555, 4331626, 2747973, 2956509, 255375, 952974, 950284, 3308606, 666252, 1538727, 3839996, 356688, 5199160, 2855363, 4501670, 6809875, 5820687, 3432443, 1931376, 3270153, 40897, 8264005, 3324511, 7487743, 6567200, 3407654, 7382051, 7281015, 6490602, 2096442, 4738540, 263919, 373226, 739345, 1141887, 1690499, 5239053, 2929435, 981145, 7384833, 63523, 6921288, 6819043, 8240992, 5329917, 4310078, 2252434, 4892231, 6309731, 1770582, 3647778, 7618314, 7967251, 5044061, 2697238, 5595495, 5111358, 7683864, 6877814, 394790, 7224055, 3877093, 1417556, 5707694, 2959097, 808178, 3111775, 1767872, 4147781, 7451209, 4137490, 5297085, 6472378, 260958, 6353923, 4664515, 5588480, 6780489, 5952138, 554320, 2065970, 3611974, 5341100, 4927619, 6395411, 6343293, 2888666, 3511757, 1706305, 2920293, 5626485, 851558, 1650525, 7664558, 3569024, 2403856, 1984553, 143758, 1834270, 101220, 5021450, 116692, 5705920, 6931456, 5708000, 5047495, 2600641, 8272944, 4941936, 1479127, 7781944, 4743936, 3619484, 7077123, 5002063, 7474362, 5910614, 6740512, 2447311, 5093217, 2965187, 6895676, 1497105, 4456170, 160222, 3465211, 7751382, 6708867, 7024336, 7386154, 6033897, 2441325, 3005181, 1266164, 801797, 3293259, 2632243, 2068250, 6749229, 3570484, 7078932, 3675227, 7848328, 1951637, 4916159, 698185, 14792, 2234800, 4951038, 5888981, 634394, 5369336, 7205485, 7208516, 4398094, 315549, 5704115, 6293437, 1506657, 919383, 3715574, 7828323, 625261, 7717275, 2878366, 3230016, 562150, 1135564, 6871077, 420001, 6464379, 5472866, 7344337, 7347705, 6852384, 2606061, 6778269, 4306415, 2768960, 4223981, 2641863, 1108574, 3376710, 6493425, 8177430, 6112303, 6271170, 6829167, 1064530, 3246044, 1672185, 5868703, 4844165, 5090898, 8309740, 6836468, 2844247, 8378903, 4357096, 7630425, 5318459, 2371386, 5891188, 7240927, 2970862, 6701416, 426792, 3556170, 4997684, 4718174, 2289876, 146122, 2919148, 1506694, 5886202, 6414814, 5705196, 5632004, 7661726, 406106, 5966867, 1726047, 1478895, 7970822, 4160507, 3262281, 62706, 836973, 1330813, 710347, 4605368, 2844889, 1016221, 1932543, 6596460, 446484, 6078550, 7653721, 4072152, 3677183, 243049, 3223499, 5197311], +[6269526, 8057920, 5786623, 2493366, 548545, 8304627, 7127876, 6076101, 4425259, 2552036, 7516157, 5957264, 8251829, 2587065, 601141, 3261735, 4861825, 3552203, 6776872, 4460376, 7148219, 4676869, 5963663, 449276, 113158, 8268909, 5414068, 6004263, 130218, 71136, 1569921, 1967970, 3357208, 926224, 5704413, 5404187, 350783, 8065613, 4595441, 4227610, 1964413, 6235882, 5259539, 4620135, 5718800, 6097934, 2646342, 5526429, 6351173, 2121552, 407958, 7045206, 1311448, 7119674, 1485370, 8196225, 5630666, 4880780, 7775827, 2174636, 7722471, 4782481, 6568445, 5993144, 90000, 2266106, 3297701, 2876647, 3398479, 8070401, 2646103, 1329937, 2036019, 2029452, 7614420, 6021323, 488671, 2935075, 8264371, 6449573, 6838862, 1097062, 4871385, 7861921, 6585189, 87675, 7690677, 391684, 1012071, 4643995, 3834147, 4716172, 2120970, 1345976, 4894499, 169279, 7945921, 3936360, 5045247, 3908256, 7436570, 4443121, 7803787, 2471444, 3965338, 3758546, 1549270, 528494, 4222452, 1513227, 8365822, 4448104, 7834879, 6328623, 7202213, 109166, 1403598, 7691254, 6666294, 517392, 6260255, 7552206, 7607830, 3483251, 5451265, 1847388, 5542268, 2703943, 2896114, 1416565, 2531075, 6005139, 2647318, 363965, 3244583, 729433, 6038514, 3745866, 2137177, 8082086, 4675045, 3059706, 7152838, 5052067, 4054544, 2227679, 2167726, 6543090, 3886645, 2529097, 2189737, 4413902, 2702970, 5385810, 921969, 3020916, 6656460, 3738753, 6690408, 113526, 3299888, 982656, 3306363, 6841889, 3422719, 1824469, 856298, 3583562, 4466135, 1105878, 4153378, 5805380, 881284, 7124752, 1546339, 4253648, 2571147, 1173174, 4598963, 8341517, 4156159, 1026146, 5833095, 2103501, 982329, 1204193, 6347094, 2554560, 1582809, 5416617, 2687340, 5571444, 6120480, 6682352, 699160, 5486787, 6327175, 6432833, 3034600, 5935394, 3886622, 6733964, 813956, 2822441, 3229144, 6939406, 5308497, 3877092, 4474784, 5302205, 8309034, 3806299, 2080168, 7791564, 5869887, 266961, 1801378, 5942700, 5513187, 4060683, 4969341, 2775197, 7768188, 4937000, 1392562, 4993304, 7840416, 6802924, 146389, 1213093, 6155095, 6195530, 4922817, 8299183, 3334645, 4952149, 1069038, 2370588, 3256058, 6599755, 6942030, 74733, 1170868, 4593152, 3710091, 8145951, 701253, 698090, 6518555, 4729617, 4656656, 7932868, 5100815, 739066, 4940511, 1423593], +[6314287, 3841955, 4102893, 5821702, 3799001, 3674829, 7100631, 689339, 505173, 6775021, 1425053, 6867604, 8046729, 3317650, 1510462, 5218978, 5680810, 2061345, 1675624, 5278206, 215174, 4606925, 2203207, 3226035, 2467730, 1593062, 204839, 7863754, 5070198, 3054846, 1793988, 3378866, 2844145, 1094007, 3758107, 3155169, 924828, 8075598, 1773896, 929549, 1679324, 612338, 3780972, 3860253, 5505689, 7136419, 4929172, 841778, 5518366, 3805596, 8092731, 5169669, 6566867, 6449998, 6892744, 4547184, 2295004, 3483812, 171722, 3676128, 4893598, 3101880, 5856315, 4110195, 4493837, 4475529, 5311845, 6562685, 5726126, 2900517, 4481003, 6925068, 500005, 3009299, 1892731, 5437822, 6381495, 36580, 1423067, 7269813, 5465176, 6113280, 6089313, 4604890, 2240224, 6250063, 6846960, 1643923, 2176837, 1110858, 6555038, 1910395, 5638029, 2790732, 5455550, 7619386, 7499475, 1977925, 4316647, 2936273, 7743936, 6401909, 2826670, 4415503, 4189398, 4451701, 6295100, 4591718, 6996702, 3869546, 7825290, 6338387, 3217992, 3990904, 4255212, 3783358, 3931445, 4763593, 3517987, 3462722, 3857288, 2418742, 8024390, 628340, 1387100, 5757946, 4883838, 7079907, 4438949, 4379095, 1897461, 1914349, 7170333, 2259893, 1011705, 656999, 7214264, 3011852, 3201616, 5011651, 6115934, 6784933, 6010770, 314194, 1679979, 1312000, 7322972, 4234380, 870070, 4078977, 2485820, 4369716, 5566593, 5308917, 3237015, 7034399, 5838560, 3299714, 5710835, 4981705, 3026384, 7258302, 6261156, 1707229, 2966021, 8236532, 752990, 4462980, 4426856, 6067850, 4473994, 4086147, 3788809, 7118454, 7452765, 2778045, 252265, 5903488, 6965884, 5416466, 2638527, 5827343, 3458086, 1454216, 2751283, 2562038, 3712350, 3610472, 6065020, 4643890, 6165431, 3664724, 867243, 3308507, 3093833, 53242, 2880667, 3127687, 1370437, 3587554, 553964, 2972771, 6134809, 3737362, 8073405, 4383860, 3988139, 8185052, 3319285, 83478, 5077822, 1199785, 2179322, 4043456, 6160350, 5220915, 3826891, 2145632, 6121010, 1417933, 1571153, 6757924, 2975544, 3206630, 520072, 355744, 5835031, 5613524, 4770650, 5054086, 2595791, 2226896, 2212099, 4735366, 3417204, 6156485, 7881255, 5271940, 1589593, 5900149, 2511519, 8340583, 3678092, 7220426, 4583947, 8377720, 6730428, 3471863, 4247049, 8335553, 405145, 5179220, 6420846, 2802060, 7733815, 752622], +[2158890, 3906430, 4560810, 2532163, 8255397, 940635, 5450255, 4222428, 8306388, 516275, 2439887, 5598621, 7434351, 2953931, 7666484, 1791634, 2046337, 5397626, 5809988, 1115784, 4715891, 3020655, 7119158, 1914008, 4850218, 3424580, 1649813, 3800900, 6149572, 7295344, 2038866, 7228073, 8278933, 283807, 418024, 763921, 1901720, 15545, 3853288, 1245376, 52641, 3360248, 3431269, 2579689, 8039825, 5203766, 2551547, 4626119, 4686654, 5139942, 2890940, 3896588, 6039751, 6714698, 4097540, 2885195, 2114873, 728045, 5268965, 4385543, 1149574, 1887609, 5669685, 7533183, 2159858, 3741115, 5997454, 7032585, 7100032, 3197835, 2004060, 52420, 6400200, 4884930, 3101496, 6299012, 330766, 780038, 242503, 8296008, 8341381, 6787038, 5823993, 496014, 6338310, 5017516, 4104677, 6152969, 4645602, 6482986, 5027856, 6510252, 3064093, 5292560, 4913587, 1666974, 7684462, 7272151, 171699, 145186, 5569024, 7157817, 355412, 1617166, 158170, 5297423, 5649104, 349745, 3820939, 2310697, 3257777, 6796548, 5481732, 6346081, 350866, 4176191, 130824, 6480210, 7043701, 6942140, 7972996, 7576396, 1969887, 2192495, 2257476, 4102319, 4135970, 859439, 6146991, 2398496, 3923173, 457578, 7795525, 8182119, 6423270, 52570, 5590315, 6316566, 351218, 1696691, 5683987, 139461, 2880332, 8117175, 5444730, 3754643, 3520906, 2385541, 1128974, 2129195, 4033619, 2183503, 5286422, 5948611, 4536111, 8049146, 3480453, 3753440, 4084792, 1530235, 5166916, 3210201, 5301482, 4770470, 5877448, 509329, 1903416, 5549442, 6264411, 6476580, 6414661, 809266, 2108102, 2070477, 7029147, 5641472, 6057109, 932436, 839408, 1435622, 2658311, 4592974, 5604019, 3317839, 8220375, 6913903, 2281646, 6315005, 3488809, 8380077, 5758692, 2683089, 3043125, 2710173, 6197364, 590857, 4243376, 2713454, 8165514, 2592653, 3464149, 1931517, 1302033, 8038188, 3612111, 5783089, 3080353, 7565420, 1206069, 129611, 262305, 1686993, 3890910, 4568917, 7838469, 7925989, 4699117, 1535742, 8202194, 7444390, 1336009, 3074702, 2564883, 883678, 2648394, 1631900, 7002464, 4093586, 4977640, 5061051, 8235391, 1708016, 4445472, 1198984, 5418024, 998737, 6691385, 1584140, 4575229, 3418445, 6639511, 5325450, 490270, 4395632, 5797171, 5399003, 988824, 770592, 7427422, 7101561, 5986873, 7627960, 485417, 7763432, 106250, 3988890]] + +w1: [[3, 6, 3, 9, 10, 1, 4, 4, 14, 13, 14, 7, 14, 4, 5, 4, 15, 1, 11, 12, 4, 15, 11, 13, 2, 0, 11, 0, 1, 5, 7, 11, 8, 7, 12, 5, 2, 9, 1, 3, 2, 8, 9, 12, 12, 12, 13, 12, 1, 7, 6, 8, 11, 9, 10, 6, 9, 15, 9, 3, 6, 10, 10, 14, 2, 0, 0, 9, 3, 14, 0, 14, 15, 3, 7, 2, 13, 0, 3, 2, 13, 8, 10, 9, 3, 11, 15, 13, 12, 1, 12, 5, 11, 14, 12, 14, 5, 8, 8, 1, 15, 4, 13, 12, 8, 12, 8, 7, 15, 14, 15, 5, 12, 9, 7, 8, 4, 7, 5, 6, 14, 13, 12, 12, 9, 14, 9, 1, 8, 6, 10, 9, 1, 10, 13, 13, 3, 7, 5, 0, 3, 4, 1, 7, 7, 2, 2, 10, 8, 9, 5, 5, 1, 11, 12, 1, 3, 9, 2, 3, 9, 7, 3, 6, 14, 6, 13, 11, 6, 4, 4, 3, 15, 11, 4, 11, 7, 11, 11, 6, 3, 3, 7, 14, 8, 9, 5, 2, 9, 11, 9, 4, 12, 10, 6, 12, 5, 11, 12, 5, 10, 8, 2, 12, 7, 4, 1, 0, 15, 6, 2, 8, 13, 13, 1, 10, 8, 10, 15, 7, 6, 3, 5, 10, 0, 13, 13, 2, 7, 6, 14, 4, 2, 7, 11, 8, 4, 2, 11, 7, 9, 13, 11, 15, 13, 8, 10, 4, 0, 5, 6, 8, 9, 2, 11, 0], +[14, 15, 3, 7, 8, 8, 12, 5, 3, 2, 1, 2, 1, 12, 0, 14, 4, 4, 12, 8, 7, 13, 1, 12, 14, 7, 14, 3, 14, 3, 5, 7, 12, 14, 6, 12, 15, 6, 9, 12, 6, 2, 14, 11, 5, 0, 7, 12, 6, 7, 6, 6, 7, 2, 14, 3, 12, 15, 0, 3, 14, 6, 14, 0, 13, 9, 4, 2, 12, 6, 10, 5, 8, 2, 3, 6, 14, 4, 13, 8, 14, 8, 11, 1, 4, 8, 12, 10, 13, 4, 4, 10, 13, 10, 11, 2, 9, 10, 10, 14, 9, 3, 8, 5, 14, 9, 13, 7, 10, 9, 4, 12, 14, 8, 5, 6, 5, 13, 6, 4, 4, 8, 14, 5, 3, 3, 7, 4, 3, 5, 4, 5, 6, 15, 6, 1, 8, 11, 12, 6, 2, 5, 14, 1, 7, 6, 10, 14, 2, 0, 6, 8, 2, 3, 8, 14, 7, 5, 5, 14, 8, 5, 5, 2, 9, 14, 1, 13, 9, 7, 0, 1, 10, 4, 9, 15, 14, 11, 12, 3, 10, 6, 1, 7, 3, 5, 2, 2, 2, 5, 1, 8, 14, 7, 5, 2, 2, 0, 0, 0, 7, 3, 15, 2, 12, 1, 12, 1, 13, 13, 5, 4, 2, 5, 0, 11, 14, 9, 2, 9, 9, 3, 8, 3, 11, 13, 8, 11, 13, 3, 10, 11, 10, 5, 13, 11, 5, 5, 14, 4, 4, 12, 10, 5, 3, 1, 4, 9, 8, 9, 0, 6, 11, 8, 7, 12], +[12, 5, 6, 0, 8, 2, 5, 13, 1, 15, 11, 1, 3, 0, 8, 5, 6, 0, 2, 2, 6, 1, 3, 7, 1, 10, 5, 9, 13, 11, 7, 4, 6, 0, 0, 6, 14, 13, 7, 14, 14, 12, 4, 9, 1, 1, 1, 2, 3, 10, 6, 2, 14, 0, 13, 13, 0, 10, 8, 4, 9, 12, 3, 7, 15, 15, 10, 5, 11, 10, 15, 13, 1, 14, 7, 3, 11, 6, 2, 6, 3, 8, 14, 8, 10, 12, 0, 12, 9, 11, 13, 11, 1, 4, 7, 10, 9, 12, 12, 6, 7, 3, 6, 11, 2, 3, 15, 7, 5, 4, 0, 4, 0, 10, 0, 11, 13, 11, 10, 5, 0, 9, 3, 15, 9, 7, 14, 10, 14, 11, 13, 5, 10, 6, 13, 3, 9, 0, 7, 15, 13, 13, 14, 12, 5, 6, 2, 2, 6, 5, 4, 13, 7, 14, 7, 15, 4, 9, 1, 0, 4, 9, 11, 1, 10, 14, 14, 8, 1, 11, 12, 3, 2, 7, 15, 1, 15, 5, 6, 1, 2, 13, 1, 12, 10, 14, 14, 13, 5, 13, 8, 5, 8, 5, 2, 6, 12, 0, 12, 12, 13, 2, 6, 3, 11, 9, 10, 0, 13, 5, 0, 8, 15, 10, 5, 11, 14, 6, 13, 1, 7, 10, 9, 4, 0, 6, 3, 11, 12, 11, 11, 15, 1, 11, 3, 3, 15, 8, 6, 0, 2, 3, 1, 9, 5, 2, 4, 13, 1, 12, 15, 8, 7, 0, 6, 10], +[12, 15, 11, 5, 1, 0, 14, 12, 8, 5, 14, 11, 0, 5, 1, 6, 9, 7, 13, 9, 14, 9, 11, 1, 0, 0, 10, 11, 0, 0, 3, 4, 6, 2, 11, 10, 1, 15, 9, 8, 4, 12, 10, 9, 11, 12, 5, 11, 12, 4, 1, 13, 3, 14, 3, 0, 11, 9, 15, 4, 15, 9, 13, 11, 0, 4, 6, 5, 6, 15, 5, 3, 4, 4, 15, 11, 1, 6, 0, 12, 13, 2, 9, 15, 13, 0, 15, 1, 2, 9, 7, 9, 4, 3, 9, 0, 15, 8, 10, 7, 14, 8, 15, 5, 8, 7, 3, 1, 8, 3, 0, 8, 15, 12, 14, 0, 3, 15, 13, 1, 12, 14, 15, 7, 10, 4, 11, 5, 6, 3, 5, 11, 5, 1, 6, 1, 12, 7, 4, 15, 9, 6, 14, 10, 8, 4, 4, 12, 7, 5, 4, 8, 5, 10, 2, 6, 13, 7, 13, 0, 6, 2, 6, 13, 7, 3, 2, 7, 9, 2, 8, 11, 2, 14, 3, 8, 5, 2, 9, 0, 8, 2, 11, 4, 2, 2, 12, 5, 3, 10, 5, 11, 12, 13, 1, 10, 12, 12, 6, 11, 7, 13, 2, 5, 6, 13, 10, 7, 9, 10, 0, 7, 4, 15, 11, 1, 3, 11, 11, 8, 9, 5, 15, 9, 3, 10, 15, 13, 0, 2, 12, 12, 9, 0, 6, 9, 2, 5, 6, 13, 13, 0, 2, 9, 7, 0, 1, 1, 12, 9, 9, 15, 10, 1, 9, 3], +[12, 7, 8, 11, 7, 7, 14, 1, 1, 13, 3, 13, 15, 6, 3, 10, 11, 4, 3, 10, 0, 9, 4, 6, 5, 3, 0, 15, 10, 6, 3, 6, 5, 2, 7, 6, 2, 15, 3, 2, 3, 1, 7, 7, 11, 14, 9, 2, 11, 7, 15, 10, 13, 12, 13, 9, 4, 7, 0, 7, 9, 6, 11, 8, 9, 9, 10, 13, 11, 6, 9, 13, 1, 6, 4, 10, 12, 0, 3, 14, 10, 12, 12, 9, 4, 12, 13, 3, 4, 2, 13, 4, 11, 5, 10, 15, 14, 4, 8, 6, 15, 12, 5, 8, 8, 8, 12, 9, 13, 7, 15, 12, 6, 8, 8, 7, 8, 9, 7, 7, 7, 5, 15, 1, 3, 11, 9, 14, 8, 8, 4, 4, 14, 4, 2, 1, 14, 6, 6, 10, 12, 13, 11, 1, 3, 3, 14, 8, 2, 8, 5, 8, 11, 10, 6, 13, 11, 6, 11, 10, 6, 14, 12, 3, 6, 0, 1, 9, 8, 12, 9, 8, 7, 14, 14, 5, 0, 11, 13, 10, 5, 11, 7, 3, 5, 5, 7, 7, 12, 9, 12, 7, 2, 6, 6, 0, 5, 6, 3, 7, 1, 6, 12, 7, 15, 8, 8, 0, 6, 0, 10, 2, 4, 8, 12, 10, 7, 4, 12, 3, 3, 13, 6, 6, 1, 1, 11, 11, 9, 10, 5, 4, 4, 9, 7, 12, 15, 10, 3, 11, 5, 0, 7, 14, 9, 0, 13, 7, 8, 0, 1, 10, 12, 5, 15, 1], +[4, 7, 9, 5, 0, 2, 10, 8, 0, 1, 5, 11, 14, 6, 15, 3, 4, 10, 11, 2, 9, 6, 14, 4, 9, 7, 3, 7, 12, 14, 4, 14, 0, 1, 1, 1, 4, 0, 7, 2, 0, 6, 7, 5, 15, 10, 5, 9, 9, 10, 6, 7, 12, 13, 8, 6, 4, 1, 10, 8, 2, 4, 11, 14, 4, 7, 11, 13, 14, 6, 4, 0, 12, 9, 6, 12, 1, 1, 0, 0, 0, 13, 11, 1, 12, 10, 8, 12, 9, 12, 10, 12, 6, 10, 9, 3, 15, 14, 0, 0, 11, 14, 1, 3, 0, 10, 11, 1, 7, 4, 6, 13, 10, 12, 1, 8, 0, 12, 13, 13, 15, 14, 4, 4, 4, 8, 8, 2, 12, 5, 7, 1, 15, 0, 12, 0, 11, 12, 1, 3, 11, 0, 5, 15, 10, 7, 7, 5, 2, 4, 8, 4, 10, 11, 9, 15, 7, 7, 8, 3, 10, 6, 10, 9, 11, 1, 4, 11, 12, 12, 12, 2, 4, 4, 13, 11, 12, 2, 2, 3, 5, 9, 11, 6, 0, 13, 4, 12, 7, 0, 11, 5, 6, 5, 12, 1, 8, 5, 0, 5, 7, 4, 2, 15, 7, 11, 6, 14, 2, 0, 1, 3, 7, 9, 15, 15, 9, 3, 0, 14, 3, 6, 5, 2, 5, 3, 13, 8, 10, 10, 0, 3, 8, 2, 10, 2, 13, 3, 9, 7, 13, 10, 1, 8, 11, 10, 2, 1, 14, 14, 11, 15, 1, 15, 0, 8]] +w1Encode: 63931A44DE7E4E451FCBF4DB020B51B7785C923182C9CCCD71869B6AF939A6EA0290E3E03F270D238D9AB3DF1C5CEBEC85184FCDC878EF5F9C877465DECCE919689AA1DD7305437127A29855B11C933279636EBD4634BFB4B76B33E79825B949ACC6B55C8AC247016F82DDA1A87F36A5D02D674E728B247BD9FB8D4A5086290BFE73885C2321C1E0448CD7C17E3E3E75ECC66FC926BE05C77666273EFC306E0E9D246C5A28634E8D8E1B84AC4DA4AD2BA9EA39589E7D9AC48E65D546845E33475354F616B86C521E67EA028632E857E55825E9D179104AF9BE3C6A71532252817E250200372F1C1CDD4552B09E923938DBB83DBA5ABD554EC45A139498608BC75C0628D5F11B035806221673A195BD470660DEE7CE941121A3260EDDA048C973FF5AABDFE1376B62838ECAC0B9BD41A7C96C37B6327F4540A0B0BD5A90F379AEBE5D6A3D09F7DDCE652256D4E7F79401941BEA8EB13C721F5F16D2C1EADED55858620CCC2D369B0A5D80AFB56E1DA74960B3BCFBB1338F06329125D4C18F07A6FC5B01CE58BE5061799D9E1B00BA004326ABF189C49ACBB54CD1E3039B4F9FBD4056F63544BF61C02DF90D1F929734098F7A8E5F78133880CF0EF31DEC7F4A5B36B515167CF469AE48C45784A5627D0D26D6377229B8E2832509284B225CA3B5DCA1CCB6D752D67AA970F41BB38B599FA3DF20CC099652D60D9207119CF91A397CB8771ED1D36FA34BA3906435F06A632567F2231377EB297BAFCD9D7470698B99DA6BD961A40CE3CA9CC43D244D5BFA4E68CF85889C7DCF86789877571FB3E988444E126EA6DC1B338E8285ABD66BABE63C0691C889E75EB0ADB53755779C7C62066573617C8F08062A84AC473CD36611BBA94594C7AFB305E7097D08A15C1F7459208A10B56E3FA42B694E7973ECE4101104276057AF95A976DC68148A42EB74DB6E049CC61100D01BACC8C9CAA639EF00EB31A01B47D6CA81C0DDEF4484285C170F0CCB310BF57A574248BAF977386A9A1BB4CC2C44BD2C32956BD0C4075B561C585047F2B7E6023197FF39E06325358DAA30282A3D79AD81AB12EEFBF180 + +cTilde: 4C5CB1C3B116E450C025233F1B6BE3BB79385FBF9626D6F27958FC529590ADC03C1B9F58675DCE1F24CBFC85443F31DE +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [-1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 1, -1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, -1, 0, 0] +cHat: [5998204, 1033172, 4358473, 231018, 7119592, 4447599, 4459583, 3619279, 2165424, 6960342, 3508718, 4945897, 3751115, 556163, 3118658, 167655, 1690162, 5421749, 6704858, 4505899, 5648135, 6100757, 7158964, 6449354, 7456006, 6276301, 5592689, 8124092, 7473854, 5928963, 6428402, 3416474, 3586758, 2906690, 2563163, 4908248, 6508015, 7274901, 5033057, 887041, 7502267, 3833384, 4017436, 4173610, 635289, 5579380, 7267277, 3297587, 4607311, 295869, 3450093, 4154344, 3595004, 3183328, 4095403, 5356675, 4342996, 1701231, 2992268, 1410821, 298057, 2247920, 1433694, 4160860, 1227715, 1322180, 5546585, 18493, 2808790, 2799639, 5434285, 5710032, 4454142, 7567190, 8010268, 5843171, 1592022, 1699734, 3237332, 3862337, 4982052, 2121501, 538464, 1333840, 7502060, 6213805, 3386337, 3471433, 3723987, 3854106, 4649157, 7902552, 4692979, 3476667, 8271805, 4506795, 1503777, 3059605, 2096843, 7514191, 3377083, 7746890, 2988833, 7907207, 7449115, 3822676, 2348932, 1766084, 3817239, 6257654, 5936999, 3494379, 4052208, 48111, 2580456, 8323362, 5327957, 1532194, 1980559, 1353151, 409062, 2984494, 3675856, 4259398, 6524755, 751008, 6116518, 2378538, 6607598, 5696424, 1933202, 8176839, 5452864, 8283513, 3675093, 4232403, 1541223, 6333345, 5232171, 5323950, 5895466, 5261828, 5162143, 2579982, 7626622, 519163, 5505938, 6432582, 4951035, 1710770, 6735491, 2701184, 8255361, 102117, 2123535, 213845, 1040804, 151410, 5134042, 1688874, 5646642, 4874510, 5316025, 3618141, 2867587, 1428371, 1571326, 656545, 6734720, 242064, 4528668, 791863, 1245688, 6719045, 6715944, 1035643, 6530456, 6811242, 6182126, 2726193, 960793, 6387292, 7868790, 1306410, 8375319, 3880501, 452780, 2856450, 1737896, 3557991, 2597973, 3290893, 4206444, 1628906, 5011895, 2282119, 1943375, 5972552, 324958, 7571617, 6267101, 8346624, 1325184, 3583804, 5535809, 834705, 691330, 4629156, 4656748, 7525698, 5642234, 8378672, 1434589, 3399999, 2369752, 165304, 969968, 4815075, 219511, 5537548, 1647845, 2960053, 3471556, 4136606, 1958105, 816707, 730074, 8032673, 2772018, 4895806, 41885, 1685487, 2165109, 7418246, 8240552, 7885508, 7761781, 2216858, 5651524, 120286, 5702522, 7365345, 7279963, 2847086, 2835528, 825200, 7190002, 4847480, 2860462, 26486, 1936002, 2345379, 363091, 7930352, 7572394, 1543149] +cs1: [[8380379, 16, 8380416, 8380412, 8380388, 28, 8380406, 8380405, 11, 13, 8380398, 47, 3, 8380415, 8380406, 8380409, 8380403, 8380398, 8380385, 8380415, 7, 5, 9, 8380401, 8380397, 8380407, 8380412, 8380399, 2, 30, 8380406, 8380410, 17, 8380399, 8380396, 0, 4, 44, 8380405, 21, 8380404, 8380411, 8380396, 10, 8380408, 11, 32, 8380415, 8380407, 8380395, 8380414, 9, 8380406, 15, 14, 8380394, 29, 8380394, 16, 8380410, 11, 0, 8380400, 8380412, 8380416, 8380410, 4, 7, 8380410, 5, 25, 8380403, 8380406, 10, 8, 8380386, 24, 28, 8380412, 6, 18, 3, 22, 5, 12, 8380397, 2, 2, 8380412, 8380413, 8380398, 8380410, 19, 8, 3, 9, 24, 8380413, 6, 8380380, 12, 8380415, 18, 8380393, 42, 31, 8380416, 8380394, 8380414, 8380385, 19, 8380414, 8380403, 11, 5, 8380415, 8380415, 27, 1, 8380409, 8380402, 8380410, 13, 9, 8380406, 8380414, 8380384, 2, 21, 8380412, 8380406, 8380414, 6, 8380393, 8380405, 8380412, 8380411, 8380414, 8380412, 2, 42, 2, 8380395, 8380395, 17, 36, 8380402, 8380406, 8380414, 5, 8380415, 18, 8380409, 8380390, 8380396, 7, 8380403, 23, 8380383, 16, 17, 5, 7, 8, 8380409, 8380411, 8380398, 19, 5, 16, 8380415, 3, 8380416, 12, 8380396, 8380416, 8380408, 8380377, 8380392, 17, 4, 8, 4, 12, 29, 8380411, 8380396, 8380415, 8380392, 10, 8380412, 8380411, 3, 8380388, 2, 28, 9, 42, 8380410, 2, 8380379, 8380376, 8380403, 5, 8380383, 21, 19, 13, 35, 8380409, 8380416, 3, 31, 8380391, 8380414, 2, 8380402, 8380395, 5, 8380372, 8380414, 34, 5, 6, 26, 3, 7, 8380394, 8380387, 14, 4, 20, 2, 8380409, 3, 12, 12, 12, 8380397, 8380404, 8380412, 8380396, 8380411, 8380402, 6, 8380413, 4, 10, 24, 16, 8380400, 8380411, 8380402, 40, 11, 8380408], +[8380407, 8380402, 6, 3, 8380403, 29, 9, 3, 8380395, 16, 2, 21, 12, 8380381, 5, 9, 1, 8380406, 2, 8380407, 8380412, 1, 1, 8380411, 8380416, 8380407, 15, 28, 2, 3, 16, 0, 2, 26, 4, 8380411, 3, 14, 13, 19, 47, 8380388, 0, 16, 20, 8380409, 8380413, 8380405, 17, 8380400, 8380411, 8380412, 8380409, 8380401, 16, 8380400, 11, 8380401, 8380413, 8380394, 8380408, 12, 8380407, 2, 6, 8380392, 29, 2, 8380399, 8380402, 8380411, 7, 8380403, 21, 10, 6, 0, 8380407, 8380411, 18, 8380412, 27, 1, 13, 14, 16, 35, 11, 22, 14, 8380400, 18, 3, 8380405, 15, 15, 8380407, 9, 20, 21, 8380410, 8380385, 1, 8380387, 8380407, 8380409, 8380384, 13, 2, 8380392, 8, 1, 8380386, 16, 8380369, 12, 8380372, 8380382, 32, 3, 8380412, 3, 8380409, 8380416, 7, 8380410, 32, 8380394, 10, 5, 33, 38, 8380406, 7, 38, 7, 23, 17, 8380405, 35, 8380399, 12, 23, 8380412, 8380387, 31, 5, 9, 8380402, 14, 8380411, 8380399, 8380405, 1, 13, 17, 8380414, 8380405, 2, 8380412, 8380405, 9, 8380402, 8380406, 1, 8380410, 8380406, 8380397, 8380381, 8380414, 4, 8380391, 21, 33, 8380401, 9, 6, 8380407, 3, 8380396, 8, 8380413, 8380416, 27, 27, 13, 6, 20, 23, 22, 8380390, 8380410, 8380408, 8380414, 21, 8380413, 11, 11, 8380406, 30, 20, 8380416, 6, 8380393, 8380403, 11, 14, 3, 8380406, 8380397, 9, 8380398, 7, 8380415, 8380387, 8380402, 8380411, 24, 20, 4, 8380381, 26, 8380414, 8380405, 8380409, 8380402, 8380404, 3, 8380410, 22, 8380416, 8380401, 18, 2, 8, 8380393, 8380388, 4, 1, 8380399, 39, 8380386, 4, 4, 1, 27, 11, 8380395, 18, 8380411, 15, 12, 8380405, 2, 10, 8380399], +[36, 8380401, 10, 8380395, 8380415, 9, 15, 8380397, 4, 13, 8380411, 16, 38, 8380415, 21, 21, 8380414, 18, 8380385, 15, 8380403, 21, 11, 30, 8380409, 8380414, 8380395, 11, 8380381, 8380380, 8380404, 8380393, 3, 12, 8380399, 9, 8380410, 8380408, 23, 8380412, 15, 8380375, 10, 33, 8380391, 8380400, 8380393, 8380404, 8380402, 8380411, 8380397, 8380412, 8380397, 9, 8380416, 8380401, 5, 22, 14, 25, 23, 11, 10, 38, 49, 35, 12, 7, 26, 34, 8380395, 1, 5, 8380407, 24, 8380404, 8380408, 14, 8380374, 5, 8380387, 9, 36, 8380394, 15, 8380411, 8380383, 2, 8380409, 8380399, 46, 8380400, 8380388, 8380410, 8380354, 8380403, 8380403, 8380410, 11, 8380398, 8380407, 24, 8, 8, 1, 8380411, 8, 27, 32, 17, 8380408, 9, 8380413, 15, 28, 8380413, 6, 8380389, 8380415, 8380415, 1, 8380409, 8380409, 8380397, 18, 8380415, 45, 8380410, 27, 28, 34, 26, 19, 14, 2, 8380408, 8380399, 8380386, 8380390, 8380402, 8380389, 11, 8380416, 8380409, 8380412, 8380410, 8380413, 8380405, 8380411, 8380383, 8380411, 8380410, 25, 11, 8380416, 10, 30, 8380404, 18, 8380405, 8380382, 0, 0, 8380400, 8380402, 8380408, 15, 3, 8380403, 4, 4, 42, 15, 1, 36, 6, 15, 37, 1, 8380406, 0, 8380404, 6, 43, 8380391, 8380412, 8380377, 13, 8380414, 12, 7, 8380401, 8380415, 14, 8380413, 11, 8380409, 8380387, 30, 8, 13, 8380411, 8380392, 5, 8380391, 8380384, 8380412, 8380406, 8380412, 8380404, 8380410, 11, 8380398, 8380416, 8380391, 16, 11, 32, 8380414, 12, 8380403, 8, 9, 8380395, 3, 8380413, 6, 17, 11, 15, 8380376, 8380388, 8380411, 14, 8380410, 20, 8380415, 17, 3, 8380413, 34, 28, 33, 7, 8380411, 2, 21, 8380410, 11, 0, 3, 8380410, 8380406, 8380399, 8380408, 1], +[8380409, 9, 8380402, 8380414, 21, 4, 8380365, 23, 8380409, 7, 8380400, 0, 8380396, 8380409, 8380416, 17, 8380407, 8380403, 8380406, 8380400, 8380408, 8380413, 1, 31, 8380409, 14, 8, 10, 8380401, 0, 8380404, 8380410, 3, 1, 8380394, 24, 8380397, 16, 4, 8380409, 8380411, 8, 8380412, 8380413, 20, 13, 23, 8380390, 8380407, 15, 25, 8380402, 8380415, 16, 8380410, 16, 1, 3, 8380393, 13, 8380408, 9, 8380413, 12, 7, 8380414, 2, 8380412, 8380405, 7, 8380405, 8380402, 12, 4, 22, 8380370, 8380409, 8380392, 8380414, 8380397, 32, 0, 8380416, 8380399, 19, 8380404, 22, 8380411, 8, 8380399, 7, 0, 21, 8380405, 8380371, 20, 8380407, 17, 0, 8380392, 1, 20, 8380409, 8380397, 11, 8380380, 8380415, 8380402, 22, 7, 8380402, 6, 9, 8380406, 9, 8380404, 8380408, 8380399, 22, 8380397, 0, 1, 8, 8380416, 17, 8, 0, 8380411, 3, 13, 8380399, 8380405, 8380413, 8380413, 3, 8380403, 43, 15, 18, 18, 8380410, 8380404, 8380409, 8380395, 8380386, 8380411, 8380397, 18, 8, 17, 8380404, 4, 9, 11, 8380414, 8380393, 2, 8380396, 8380413, 0, 34, 17, 8380405, 36, 19, 11, 1, 8380386, 8380393, 7, 8380411, 8380397, 17, 22, 8380415, 22, 10, 8380411, 8380394, 8380415, 8380387, 4, 8380407, 18, 24, 15, 8380387, 15, 5, 5, 8380393, 8380405, 8380404, 1, 8380414, 8380408, 8380409, 9, 0, 8380409, 15, 8380414, 21, 8380395, 8380409, 8380412, 8380411, 8380403, 8380413, 8380376, 22, 31, 8380395, 2, 8380404, 24, 8380410, 3, 8380413, 8380402, 1, 20, 8380412, 15, 8380408, 23, 28, 8380416, 11, 12, 48, 8380407, 8380416, 8380409, 8380385, 8380410, 9, 8380413, 2, 8, 11, 8380414, 8380415, 8380398, 16, 8380410, 8380402, 3, 5, 10, 8380402, 17, 8380393, 12, 8380397, 8380390], +[1, 13, 8380413, 3, 8380406, 8380395, 33, 8380396, 4, 14, 2, 7, 8380411, 19, 40, 8380400, 15, 8380407, 17, 8380402, 8380404, 1, 8380376, 8380412, 4, 13, 5, 2, 8380401, 6, 12, 8380415, 8380404, 8380385, 2, 3, 25, 13, 2, 8380394, 17, 7, 1, 8380409, 8380416, 8380384, 3, 8380403, 12, 9, 4, 24, 8380412, 28, 8380385, 8380398, 8380413, 8380410, 3, 4, 8380403, 23, 8, 8380395, 0, 16, 3, 6, 8380411, 8380414, 4, 8380404, 8380395, 8380412, 8, 20, 11, 8380397, 10, 8380408, 3, 1, 10, 8380394, 8380410, 2, 8380416, 8380411, 8, 4, 8380410, 8380402, 8380403, 8380400, 8380398, 27, 8380385, 10, 3, 6, 8380407, 22, 8380389, 2, 8380415, 8380409, 11, 16, 8380387, 6, 4, 9, 20, 1, 8380408, 26, 8380416, 13, 6, 8380394, 8380415, 7, 9, 3, 8380399, 8380405, 0, 8380404, 8380396, 4, 8380380, 8380402, 8380416, 30, 8380401, 4, 8380375, 6, 8380403, 8380414, 3, 4, 8380398, 26, 16, 32, 28, 8380403, 4, 13, 8380402, 8380405, 29, 8380380, 16, 8380411, 13, 20, 8380404, 9, 11, 8380395, 3, 8380401, 8380407, 8, 8380410, 8380395, 10, 1, 16, 8380409, 8380410, 8380397, 6, 8380404, 8380414, 8380412, 8380397, 21, 1, 16, 8380396, 19, 8380415, 15, 8380406, 10, 8380391, 9, 0, 8380408, 12, 8380404, 16, 8380400, 14, 8380414, 8380408, 8380414, 8380402, 8380411, 17, 8380414, 21, 8380410, 8380393, 7, 20, 7, 12, 8380404, 8380416, 39, 2, 8380399, 8380412, 18, 8380410, 8380412, 8380408, 5, 11, 8380392, 8380413, 8380414, 12, 8380407, 8380407, 8380386, 46, 8380407, 19, 8380405, 11, 12, 34, 8380404, 8380413, 8380397, 23, 8380413, 13, 8380394, 8380412, 8380399, 8, 8380413, 8380415, 11, 8380407, 19, 11, 8380412, 11, 28]] +cs2: [[4, 3, 8380406, 31, 8380397, 22, 5, 8380403, 8380412, 8380397, 12, 19, 8380401, 8380405, 13, 8380396, 0, 9, 14, 8380401, 24, 15, 2, 8380412, 8380392, 16, 0, 8380400, 8380394, 34, 20, 8380406, 4, 8380402, 8380415, 8380402, 6, 3, 8380397, 8380415, 20, 8380407, 22, 8380402, 8380414, 34, 8380395, 8380408, 23, 13, 6, 8380408, 5, 2, 20, 8380408, 3, 0, 8380412, 1, 8380411, 5, 33, 8380400, 8380403, 28, 21, 8380396, 10, 8380411, 8380401, 8380414, 8380400, 8380415, 7, 6, 2, 24, 8380411, 12, 8380414, 8380411, 8380389, 8380392, 8380416, 22, 8380414, 7, 13, 14, 8380409, 3, 8380411, 6, 18, 8380412, 8380407, 8380407, 8380384, 48, 24, 8380410, 8380397, 8380398, 0, 8380407, 8380415, 2, 8380395, 8380391, 6, 9, 8380412, 3, 10, 8380406, 6, 15, 8380381, 17, 18, 8380385, 3, 20, 22, 8380413, 8380400, 8380394, 13, 8380413, 8380410, 20, 8, 0, 8380410, 4, 1, 8380380, 5, 12, 16, 8380413, 8380400, 8380416, 11, 8380410, 3, 8380397, 8380391, 15, 4, 6, 8380380, 8380412, 2, 30, 8, 8380407, 9, 11, 8380405, 8380407, 7, 4, 8380403, 9, 8380379, 4, 49, 8380397, 8380407, 1, 8380405, 0, 13, 8380390, 8380407, 8380414, 1, 22, 30, 20, 8380385, 8, 8380412, 8380381, 16, 7, 8380405, 8380416, 8380389, 8380410, 18, 8380371, 35, 8380403, 15, 8380390, 16, 8380379, 8380410, 8380401, 8380388, 10, 11, 19, 8380406, 8, 11, 8380415, 1, 8380380, 8380406, 8, 21, 16, 8380394, 8, 5, 0, 31, 8380400, 8380410, 31, 8380411, 8380413, 6, 8380390, 12, 8380411, 8380401, 10, 13, 8380413, 8380415, 8, 8380405, 8380411, 8380408, 11, 8380401, 8380397, 6, 27, 8380412, 19, 8, 8380398, 16, 8380416, 8380390, 20, 32, 8380403, 16, 9], +[8380408, 27, 8380398, 1, 8380411, 6, 8380406, 4, 1, 2, 8380399, 8380415, 8380410, 8380401, 38, 8380401, 8380411, 2, 5, 18, 12, 8380395, 24, 18, 8380403, 10, 8380403, 24, 8380395, 7, 8380415, 16, 12, 8380399, 8380416, 20, 8380397, 8380401, 38, 0, 8380409, 18, 23, 10, 0, 6, 33, 8380402, 8380390, 5, 8380402, 34, 8380397, 12, 11, 2, 13, 8380412, 8380413, 12, 8380406, 12, 8380413, 8380396, 8380414, 8380403, 8380412, 12, 14, 35, 24, 8380406, 28, 8380408, 8380401, 8380376, 8380407, 34, 8380406, 11, 20, 8380415, 24, 8380411, 8380415, 8380410, 8380400, 8380415, 8380412, 8380394, 8380412, 2, 2, 16, 8380410, 8380406, 25, 8380388, 1, 8380411, 9, 8, 24, 7, 14, 15, 27, 8380412, 10, 8380375, 13, 8, 8380409, 1, 8380411, 8380407, 8380415, 0, 8380395, 8380396, 8380409, 8380392, 8380400, 8380402, 8380414, 8380401, 17, 9, 27, 8380412, 2, 23, 8380391, 8380415, 9, 8380414, 15, 8380416, 8380407, 3, 8380409, 8380407, 8380414, 1, 12, 12, 4, 8380393, 8380406, 8380416, 8380388, 23, 12, 8380403, 18, 8, 8380411, 8380413, 28, 8380399, 19, 1, 22, 8380386, 8380416, 8380390, 8380410, 20, 3, 6, 37, 8380382, 8380408, 12, 6, 43, 8380410, 8380384, 13, 9, 1, 8380403, 13, 8380406, 8380376, 30, 8380416, 8380413, 8380412, 8380394, 16, 8380406, 8380411, 13, 8380409, 8380404, 20, 9, 0, 8380406, 8380405, 19, 8, 9, 8380398, 13, 8380407, 30, 8380397, 19, 8380389, 6, 8380414, 13, 8380400, 0, 7, 8380406, 8380402, 13, 9, 10, 6, 8380407, 28, 8380405, 1, 8380410, 8380400, 8380395, 8380407, 8380410, 8380404, 8380412, 16, 14, 8380413, 8380415, 8380391, 8380403, 8380400, 8380400, 8380396, 0, 5, 20, 8380402, 8380416, 8380405, 8380386, 8380416, 8380393, 8380414, 8380409, 5, 10], +[8380406, 8380385, 4, 20, 8380412, 8380411, 4, 8380411, 8380400, 4, 8, 8380374, 8380409, 8380415, 8380400, 8380392, 30, 16, 8380399, 42, 3, 2, 14, 8380387, 8380411, 17, 8380412, 13, 9, 16, 5, 19, 8380403, 9, 8380390, 8380402, 8380406, 8380409, 21, 8380383, 8380406, 14, 8380402, 7, 5, 19, 8380410, 23, 8, 8380403, 8380384, 27, 8380349, 25, 17, 13, 8380407, 8380399, 6, 12, 8380403, 38, 8380384, 8380388, 41, 8380388, 23, 1, 2, 37, 15, 0, 39, 8, 7, 8380407, 8380405, 8380414, 3, 8380390, 14, 8380405, 8380392, 8380411, 8380416, 8380398, 8380399, 8380401, 8380402, 8380413, 8380405, 8380414, 11, 15, 8380402, 1, 14, 8380402, 8380404, 15, 16, 8380400, 8380411, 8380391, 13, 8380395, 25, 8380384, 8380405, 8380409, 13, 8380412, 4, 8380412, 11, 29, 8380400, 8380410, 25, 3, 4, 8380396, 19, 10, 8380414, 16, 8380405, 1, 10, 8380406, 22, 8380407, 19, 8380402, 8380390, 14, 8380400, 8380386, 38, 8380403, 8380413, 24, 8380395, 8380388, 2, 8380396, 1, 8380391, 55, 8380380, 8380407, 8380409, 5, 8380406, 27, 8380414, 14, 26, 8380406, 8380409, 22, 8380407, 33, 8380411, 30, 25, 6, 23, 5, 8380406, 6, 8380400, 12, 8380412, 8380378, 9, 8380410, 13, 3, 35, 8380403, 6, 8380398, 20, 8380400, 8380390, 1, 8380410, 8380416, 6, 26, 8380381, 8, 0, 8380388, 17, 8380390, 8380412, 8380400, 19, 8380414, 8380379, 1, 33, 8380392, 8, 27, 30, 8380378, 40, 8380373, 25, 8380412, 9, 8380400, 8380411, 5, 8380400, 8380373, 4, 8380412, 17, 11, 7, 34, 5, 5, 8380402, 8380411, 13, 8380409, 8380411, 10, 1, 28, 8380414, 8380389, 28, 8380415, 22, 1, 8380409, 8380377, 12, 8380410, 17, 8380399, 14, 8380407, 1, 8380410, 26, 8380390, 1, 14, 8380415], +[8380411, 8380409, 32, 20, 6, 8380409, 8380409, 8380397, 25, 8380415, 8380400, 8380415, 42, 7, 8380396, 8, 33, 8380399, 8380411, 8380416, 1, 8380412, 8380413, 0, 8380386, 26, 13, 9, 8380391, 8380384, 8380411, 8380414, 32, 1, 6, 8380396, 8380399, 8380406, 8380407, 16, 19, 8380404, 15, 8380399, 8380414, 8380406, 8380400, 18, 8380415, 23, 27, 1, 0, 4, 4, 8380409, 8380399, 3, 5, 8380388, 8380398, 18, 8380380, 20, 8380406, 8380382, 19, 18, 8380391, 1, 8380395, 8380413, 7, 8380407, 13, 3, 12, 23, 8380403, 10, 8380409, 15, 8380405, 8380409, 8380403, 8380407, 8380400, 8380396, 19, 8380395, 12, 8380406, 8380403, 8380414, 8380390, 8380406, 16, 8380399, 8380377, 17, 8380405, 8380403, 6, 25, 8380406, 0, 21, 55, 19, 19, 8380405, 3, 14, 8380409, 8380414, 12, 8380409, 8380384, 5, 49, 8380415, 21, 4, 8380406, 8380389, 8380396, 8380397, 8380400, 8380390, 8380383, 8380413, 51, 8380387, 20, 18, 8380414, 8380396, 13, 8380409, 8380398, 22, 22, 25, 0, 8380403, 18, 4, 14, 12, 8380399, 8380411, 17, 8380402, 8380413, 28, 8380413, 8380407, 8380412, 8380414, 8380411, 34, 10, 8380406, 8380406, 30, 8380409, 8380398, 8380399, 8380414, 8380407, 19, 15, 8380412, 8, 8380408, 8380389, 30, 16, 18, 8380407, 8380395, 8380408, 8, 5, 8380398, 10, 32, 13, 8380414, 5, 8380386, 8380393, 9, 8380380, 8380405, 8380400, 22, 8380397, 8380413, 20, 8380414, 1, 8380393, 8380392, 8380412, 33, 8380414, 8380396, 4, 34, 44, 28, 28, 8380392, 8380405, 32, 8380403, 8380414, 10, 7, 8380388, 8380410, 18, 3, 8380408, 8380411, 8380414, 19, 8, 8380399, 8380397, 8380390, 8380389, 5, 8, 25, 8380402, 17, 8380411, 20, 8380416, 8380406, 16, 16, 8380406, 5, 6, 8380415, 8380413, 8380409, 30, 19, 14, 20, 8380411, 8380408], +[8380408, 8380404, 1, 18, 8380385, 19, 8380392, 8, 8380406, 9, 14, 2, 8380414, 19, 8380406, 8380407, 8380412, 1, 8380412, 14, 8380413, 5, 38, 8380412, 8380397, 13, 16, 0, 11, 8380402, 8380415, 39, 8380391, 2, 24, 21, 8380406, 15, 8380415, 12, 8380412, 8380399, 8380377, 27, 8380411, 8380416, 27, 8380400, 38, 8380410, 8380416, 18, 8380388, 0, 3, 2, 8380413, 8380394, 8380400, 8380415, 8380415, 8380411, 5, 8380416, 21, 8380392, 8380416, 8380402, 8380382, 7, 0, 8380407, 8380412, 8380411, 18, 8380406, 8380409, 9, 19, 8380413, 16, 8380403, 6, 8380410, 17, 8380390, 8380414, 8380414, 13, 17, 33, 8380404, 33, 26, 8380414, 11, 8, 13, 8380389, 14, 8380409, 8380409, 30, 8380413, 1, 18, 1, 8380399, 10, 8380371, 8380403, 8380399, 4, 8380399, 20, 2, 8380412, 8380389, 9, 8380410, 8380394, 8380411, 8380391, 23, 1, 24, 8380407, 8380402, 37, 2, 8, 8380416, 8380401, 8380400, 8, 8380406, 14, 32, 13, 8380405, 15, 30, 6, 8380411, 8380390, 3, 21, 43, 8380412, 27, 11, 8380415, 10, 8380405, 32, 8380406, 8380396, 23, 8380395, 5, 12, 8380409, 17, 25, 8380398, 23, 8380414, 8380362, 8380413, 9, 8380397, 3, 8380383, 10, 8380413, 8380401, 8380409, 8380400, 8380405, 7, 8380396, 11, 8380406, 8380410, 3, 5, 13, 13, 21, 22, 8380416, 19, 30, 8380404, 20, 1, 8380408, 25, 15, 31, 24, 8380399, 11, 15, 18, 8, 8380393, 0, 8380396, 9, 8380397, 8380410, 9, 24, 8380408, 17, 6, 8380405, 8380404, 8380364, 8380388, 8380402, 12, 8380401, 8380415, 8380392, 2, 8380412, 23, 5, 14, 17, 0, 8380408, 16, 8380384, 13, 1, 8, 21, 13, 8380398, 3, 8380408, 3, 8380403, 7, 16, 19, 12, 9, 8380391, 3, 8380410, 8380401, 30], +[8380400, 3, 8380411, 12, 6, 12, 5, 8, 6, 14, 19, 16, 21, 7, 13, 8380408, 6, 7, 8380398, 18, 8380399, 10, 12, 34, 16, 10, 24, 5, 8380401, 1, 8380387, 8380411, 8380403, 8380379, 8, 8380413, 5, 8380403, 8380391, 8380405, 8380394, 8380395, 8380414, 5, 4, 8380393, 8380394, 5, 25, 8380404, 12, 10, 3, 48, 34, 8380416, 23, 8380398, 0, 2, 8380394, 26, 5, 24, 1, 25, 6, 1, 8380402, 10, 8380407, 4, 8380409, 21, 23, 8380414, 8, 19, 6, 8380404, 8380415, 8380407, 8380414, 8380387, 8380410, 18, 30, 0, 8380387, 11, 8380414, 8380415, 8380406, 8380410, 8380407, 8380400, 8380400, 10, 15, 8380414, 15, 8380399, 4, 8380403, 8380400, 8380395, 8380391, 8380391, 18, 8380383, 25, 29, 6, 24, 8380397, 18, 22, 8380406, 8, 5, 7, 42, 0, 23, 42, 8380390, 8380415, 11, 8380407, 8380413, 11, 3, 8, 8380386, 8380413, 6, 18, 31, 8380414, 8380403, 7, 8380402, 34, 25, 8380387, 49, 8380413, 3, 8380405, 8380416, 2, 8380406, 8380376, 8380406, 8380408, 1, 8380406, 8380391, 8380411, 8380402, 8380387, 0, 8380416, 8380398, 3, 8380414, 8380409, 13, 11, 9, 8380414, 18, 12, 2, 8380392, 10, 22, 7, 23, 32, 7, 8380409, 21, 7, 12, 5, 8380396, 36, 26, 8380400, 25, 27, 33, 4, 7, 8380408, 8380408, 8380400, 8380399, 8380414, 8380407, 8380395, 8380403, 0, 8380377, 23, 8380406, 8380394, 9, 8380403, 2, 8380398, 8380381, 8380410, 8380399, 8380400, 8380413, 8380416, 8380403, 11, 2, 24, 6, 8380409, 0, 8380412, 2, 8380415, 8380384, 31, 11, 18, 29, 2, 5, 16, 7, 20, 29, 17, 13, 8380401, 8380401, 5, 38, 7, 31, 8380414, 8380409, 8380411, 7, 8380387, 8380398, 8380402, 8380413, 8380396]] +z: [[143772, 123656, 293463, 7962815, 162638, 130615, 8254548, 454692, 117418, 8029016, 7937213, 24642, 281101, 332539, 7957523, 8060313, 55471, 7986269, 7960328, 405391, 400225, 387815, 8023916, 310096, 8326181, 151862, 519702, 8106552, 441491, 7992435, 29297, 398273, 380800, 8310400, 242983, 8030637, 12515, 8331160, 8124656, 8301181, 259672, 8276198, 162435, 8246792, 11583, 182706, 470551, 8000653, 7880579, 110119, 8017055, 7975210, 8246156, 8055547, 7966150, 59380, 38580, 7949612, 7933398, 8189705, 159870, 284510, 8371776, 286438, 8070756, 8005229, 284296, 7887629, 8369540, 8026517, 8219208, 8004605, 517804, 7951555, 7934428, 109473, 7915952, 482722, 8180580, 22896, 8210526, 23527, 8358087, 69432, 389017, 249399, 8340002, 147072, 107695, 7881817, 136420, 518185, 92225, 7927386, 74780, 8271757, 445960, 7954895, 113196, 309500, 7955661, 8188744, 8035725, 295983, 441455, 103052, 8351550, 8084227, 412058, 8002752, 8378364, 8343226, 516352, 7998629, 150133, 439376, 7925006, 500971, 8011395, 8172211, 18820, 7926045, 8246338, 8270844, 198228, 383051, 8269264, 8028334, 8247402, 7996087, 433839, 7968613, 8015406, 456341, 7866632, 268726, 6913, 8282374, 7894281, 8328378, 8227847, 7969539, 8030192, 8154624, 8342926, 60383, 8253800, 8378740, 8160833, 189528, 8268337, 451560, 7857989, 15667, 8351569, 297121, 7872098, 8005729, 8336831, 169621, 8360521, 473778, 8151121, 8324692, 306792, 418157, 8265924, 136810, 8198596, 7856183, 205470, 7867259, 7902109, 8190260, 8155329, 7907132, 169095, 8186583, 228582, 63983, 8101422, 8253562, 8170752, 8053588, 8029731, 8050531, 7875359, 519011, 8193214, 390990, 7988427, 406163, 7956698, 8162071, 8347218, 443351, 393371, 8114488, 8086470, 363257, 210479, 303115, 441735, 396340, 215198, 164853, 72897, 363580, 8043771, 402831, 148221, 8063667, 306649, 7913832, 8353159, 7883555, 8334742, 8183001, 260740, 8175125, 8031299, 40485, 443226, 64875, 469340, 441146, 7899376, 291765, 8036579, 226740, 7902630, 8273949, 440073, 122120, 7951976, 20959, 8021609, 7971106, 344562, 8030487, 8111738, 8212258, 51161, 8258545, 196574, 293192, 448323, 379859, 7863219, 491415, 8140463, 7962312, 150893, 8211545, 518937, 7952634], +[8059338, 8054325, 478485, 190616, 96841, 440716, 411264, 8138281, 306706, 161846, 8207956, 277469, 8379587, 8128411, 8306406, 8045607, 293701, 8239243, 8051471, 8120559, 40017, 91634, 8164137, 8120221, 355600, 8310149, 14081, 280760, 7926345, 8343803, 399205, 7913904, 8280882, 200278, 458882, 29997, 162647, 8314453, 8374314, 8230575, 460423, 8077107, 441363, 292276, 122073, 488679, 7956539, 96787, 8059216, 300347, 8128416, 277770, 324173, 426082, 448937, 7916759, 7905387, 147017, 303276, 7988659, 97566, 66761, 8042283, 8219452, 7856947, 264017, 198064, 419626, 8219265, 8021223, 234471, 8148995, 488084, 28153, 21734, 8095315, 8063251, 299499, 8095839, 8334677, 7998541, 245194, 8201462, 44522, 8352397, 7929922, 55752, 8303270, 8011383, 7941571, 8213932, 171048, 8067946, 7890440, 8278138, 8139602, 163391, 7918713, 230606, 358234, 8190669, 8082831, 7879154, 515278, 8088783, 499128, 2314, 8286076, 7941660, 191344, 8213001, 7868974, 7998842, 8230137, 271621, 8153648, 7994409, 8167901, 7878916, 7995963, 8315657, 360363, 7867120, 124832, 275895, 8155773, 333895, 8120230, 336867, 476703, 8246278, 120774, 122298, 314263, 8305127, 437468, 7860187, 8025438, 8034319, 7359, 8286170, 22331, 33739, 8084894, 8038066, 65907, 225039, 52710, 316967, 7917219, 241491, 8026945, 258267, 8290591, 262208, 259592, 7904214, 8126458, 8042595, 309608, 8142248, 154317, 7989230, 8021135, 8100201, 459481, 44333, 8032552, 209848, 7991598, 8236869, 8130787, 250041, 8136567, 490740, 201430, 8345528, 7885349, 8325617, 428085, 126984, 189031, 7922561, 344762, 8233451, 173371, 8149284, 8357573, 126582, 331864, 8019071, 505909, 25840, 268422, 8200690, 226297, 8099295, 7909878, 8017255, 8380104, 6703, 107971, 8097820, 7925089, 124549, 148809, 8039418, 484599, 398453, 446611, 8194466, 53858, 465123, 8302073, 8215903, 7961514, 127078, 8008810, 8327894, 63403, 8081047, 227910, 373347, 79875, 8337192, 109756, 8072843, 287315, 8250610, 237129, 8231364, 482141, 7963830, 8379518, 8370592, 496787, 7891936, 307749, 204194, 8159797, 8116448, 210702, 8123755, 278586, 8177097, 244999, 8029850, 7973684, 8149880, 90669, 8070930, 112462, 148348, 301542, 8290883, 513829], +[134824, 8104893, 229093, 7914038, 7889383, 8122105, 306790, 85960, 8154601, 8090778, 8068180, 155248, 7985665, 481786, 8240036, 8353699, 8058569, 8365062, 8036905, 268425, 477048, 7975434, 514127, 475157, 7862917, 332267, 8330989, 11082, 8271262, 167097, 291267, 93802, 7893754, 197918, 8239699, 427970, 278495, 8123420, 8299350, 237083, 30744, 122195, 366734, 433538, 269442, 7950677, 101537, 7918129, 473721, 308542, 448170, 219672, 14278, 338359, 8123839, 8327111, 403754, 222137, 451100, 65280, 443162, 65685, 7964016, 7936115, 8014412, 53471, 104674, 8060035, 8168624, 8077369, 499356, 7924407, 476680, 8174801, 8315299, 375665, 349191, 368900, 398422, 7921429, 8063220, 343691, 7911423, 7994027, 8232563, 7897712, 309213, 8375434, 366150, 271757, 8024649, 429344, 183590, 482786, 8365153, 7875120, 7969012, 7943237, 43312, 8128192, 344475, 8026200, 246496, 8005415, 291074, 8260328, 8027940, 8325786, 8214874, 8131458, 342724, 82357, 8105685, 162838, 111198, 8325752, 345857, 8328295, 293403, 163499, 85437, 170211, 429428, 7992498, 7856197, 233113, 346551, 212492, 8007735, 499374, 8132049, 8328854, 7967412, 8133510, 50538, 8141456, 381702, 297808, 389015, 267177, 7936562, 230709, 8336633, 266552, 7938165, 8097110, 133750, 241300, 8110460, 7867742, 410355, 221437, 76184, 8272705, 155412, 8295215, 237247, 8330085, 8234396, 459250, 287804, 8228459, 8161827, 8238168, 7896782, 306485, 165927, 8156254, 8071748, 8378529, 132354, 130931, 105744, 8260091, 8226092, 257853, 8063097, 7864386, 405680, 7930777, 8309392, 122953, 195737, 18340, 7939372, 8058702, 310918, 329713, 8115136, 8248283, 44469, 8065764, 8314551, 8292692, 73403, 7990470, 7876339, 131780, 426783, 252537, 8077989, 8145198, 7924491, 103581, 8337052, 284880, 8159474, 367927, 7970708, 57070, 8269000, 7880430, 8081184, 8341607, 6028, 8326742, 258617, 8092068, 8172439, 96098, 8091757, 359442, 314553, 8172053, 8144098, 7890124, 7990674, 8166182, 356331, 8170993, 8240278, 8241740, 8116902, 8153388, 8309164, 8316923, 8199642, 146447, 8200878, 125439, 7981738, 7872295, 8359803, 521374, 66216, 342210, 176521, 8204181, 475087, 342261, 8303880, 8205641, 8281300, 335588, 8309877, 263831], +[105076, 443919, 8044095, 8016682, 7907494, 7967344, 232013, 7992532, 372497, 8162765, 13503, 147668, 8004375, 96105, 10471, 8269244, 8303016, 7976487, 464745, 7988596, 7952320, 8328284, 7892880, 8325987, 8238000, 7902484, 8277175, 29790, 8118640, 260422, 7905944, 112103, 8328774, 8020003, 8312866, 8264459, 8168980, 8003134, 7945984, 8286842, 485440, 289004, 8181004, 291717, 353105, 211537, 7976350, 55928, 267441, 205670, 7859854, 7918767, 504151, 358637, 308640, 291107, 8152457, 327216, 7986532, 116391, 8265622, 8224373, 8374271, 8315956, 8244033, 8150732, 485893, 459328, 7885721, 8105961, 8072437, 313274, 427929, 8190930, 514851, 181490, 7877627, 22605, 286241, 8088001, 8370302, 8315574, 322459, 196873, 8262740, 33481, 7858752, 473797, 189579, 8084985, 477709, 509578, 7918655, 7881223, 8218058, 7964823, 7870846, 7976209, 458575, 8375561, 8271714, 31112, 8155508, 318067, 8084583, 339656, 43353, 8377784, 80010, 8096154, 208866, 8046122, 145477, 8254746, 238749, 478993, 8293512, 7980109, 453209, 7919216, 518998, 104074, 8355968, 8022700, 8161385, 8056708, 454387, 8197323, 8072485, 219635, 269055, 8119857, 8302728, 8098206, 246927, 8270231, 522553, 8380235, 300781, 33191, 358671, 8125034, 7970785, 8058865, 80338, 8281671, 267726, 115519, 8085864, 8252454, 420643, 8326970, 8182556, 8107346, 8115792, 8316129, 8241402, 136841, 8078781, 8033746, 8167563, 14279, 193104, 9074, 7991410, 349729, 8291767, 8177852, 8101262, 8335184, 8285073, 142297, 8054506, 389742, 19302, 379395, 8121595, 8062382, 270339, 159716, 202201, 385898, 7935699, 7902803, 7944070, 318776, 8353280, 8302029, 8027656, 326173, 162124, 508188, 103535, 8223604, 7917351, 7959146, 8053482, 138413, 465619, 185871, 8309514, 162094, 252115, 7906507, 8313422, 7871198, 8080140, 8131590, 307497, 268655, 8305444, 32505, 8033815, 185236, 8359190, 513162, 8236108, 190052, 47157, 217253, 8345319, 7992043, 8160132, 7875385, 277146, 8159410, 8322833, 269808, 8134033, 222883, 124494, 303431, 8362645, 8130946, 7884925, 356152, 8019857, 8117758, 7896761, 110544, 8347367, 8362462, 318635, 300920, 8037993, 95180, 8008663, 283536, 249861, 8103321, 7879521, 11531, 7912536, 182547, 343405, 509644], +[8280167, 8183382, 7981272, 140587, 8131905, 8336906, 169368, 8259503, 6959, 8374380, 396768, 323466, 8234923, 140944, 1591, 8026813, 8357185, 381433, 211102, 8164711, 8067284, 8156928, 251946, 8038791, 8127856, 8108758, 7863541, 213144, 8087180, 8234345, 8120609, 476932, 469643, 8119853, 8252282, 242779, 455422, 8327248, 315529, 500126, 238274, 362230, 8144038, 397352, 8120461, 361771, 215362, 117234, 326202, 121265, 329880, 422725, 8098308, 349698, 8207912, 521451, 7917650, 8221894, 8018399, 329241, 418887, 273636, 222842, 7945466, 7985745, 500322, 341201, 8005324, 8042017, 8204796, 4355, 251481, 8049668, 8332492, 8208810, 80188, 8113001, 336564, 486706, 8272880, 7959409, 275435, 8136822, 122915, 8346258, 209220, 325983, 8181804, 7906986, 7892110, 8195640, 8310053, 401482, 7977011, 8009797, 352702, 484884, 8119269, 9220, 8186549, 8057240, 8335209, 7883137, 8334596, 7999830, 471680, 67218, 8279804, 7938521, 264940, 346770, 8041177, 273504, 445514, 7880639, 232624, 7937300, 122420, 206323, 497521, 8071430, 254612, 8082798, 8301735, 7989215, 173405, 7984922, 8017635, 8179667, 8198434, 2329, 138898, 22799, 382492, 8153831, 74164, 373776, 429916, 8339011, 8038841, 8248403, 8264300, 306680, 8188371, 8002325, 8069083, 7857388, 476833, 184576, 120365, 7970077, 316210, 101461, 8245173, 52432, 39592, 478130, 8069576, 7915175, 8163517, 8342671, 8271867, 8112471, 25100, 489470, 8223493, 7861960, 8247432, 7859869, 113284, 103885, 483623, 103624, 8003909, 201837, 442770, 470324, 8095252, 8096243, 7932580, 8367830, 8260678, 8277989, 8128595, 338069, 370275, 8002594, 202998, 8106253, 7863510, 8350195, 8355004, 329331, 8140657, 374523, 8258051, 8042666, 8208298, 8346773, 389534, 75286, 8257802, 8190753, 7941181, 323058, 8085399, 101549, 8262957, 126092, 8195429, 7881689, 8284634, 124092, 8027861, 382402, 8010862, 170043, 8225827, 144002, 224035, 515404, 213461, 8044274, 8252518, 8379310, 7901590, 8352296, 300390, 8125793, 139947, 7914872, 348748, 8313950, 8284926, 151582, 17586, 128752, 8162130, 283247, 8227059, 234117, 7989252, 256052, 91754, 7986704, 505118, 433888, 363668, 236660, 266971, 7869229, 464075, 8293171, 7949724, 122927, 351232]] +||z||: 524234, ||z|| too large +r0: [[-172830, -230199, -249934, -36994, -200682, 246659, -119995, -165336, 194290, 166606, 76097, -58268, 183807, -76055, -43533, -222635, -187478, 228396, 3262, -250294, 182720, -168752, -23559, -4223, 190710, 5549, 22770, -48172, -255583, 249297, -213753, -128721, -195864, 197228, -259971, 54051, -171216, 23303, 184076, 235124, 212154, -176119, 196402, -199649, 53701, 22125, 249821, 233408, -108101, -152666, 134365, -257363, 27038, -171939, -96380, -252191, 28236, -72638, 189924, -209534, -111732, 171636, 56283, -142383, -154101, -74416, -66014, 194384, -11811, 14941, 19769, -31862, 16332, -169320, -75341, -102048, -168561, 83107, -176903, -190576, 80102, 224709, 194400, 2307, -16285, -8711, 134087, 210065, -160678, 49959, 66281, 228303, -157936, 81027, 97078, -72812, 88150, -122124, -81251, -11878, 25955, -121568, 225379, 62442, -221664, -136989, -36944, 31525, 4658, -31997, -228365, -222308, 75326, -251419, -142384, 185172, 205818, 56681, 228207, -96980, 147292, 151411, 150904, -226567, -223814, -112882, 204799, -50439, -180881, 38358, -8842, -205444, 102156, 94169, 207318, -52431, 124121, -104917, 169793, -60670, -61093, 242607, 5041, 19283, 213384, 153250, 57303, -184146, -258677, 200526, 99111, -89272, -208614, -120105, -256798, 46207, 125037, -229297, 238430, 65885, -213579, 95977, -161138, -140785, -25021, 204740, 14840, 64669, -141953, -5590, -198586, -169541, 104275, -205246, -74739, -126421, -234135, -166212, -184019, -198067, 51815, 222299, -167562, 136846, -144823, -84602, 64621, -256835, -54155, 16897, -52368, 159807, 177576, -4488, 195039, 242433, 162367, -30323, 65326, -132909, 139192, 228865, -200821, 247793, -87023, 247775, 64188, -242384, 175427, -64586, 20033, 216184, 140621, 158507, -215602, -60700, -257117, -160038, -171128, 48233, -156252, -255974, 80946, 73171, 189764, -64235, -35813, 68072, 152820, -65327, 21268, 188461, 122511, 203203, -83705, 208843, -63170, 170562, 59761, 259973, 50433, 209259, 24176, -37348, -31817, -87845, 5137, -39498, -243857, 102048, -215671, 205424, -164784, -159427, -89899, 257311], +[159004, 231838, 94342, 224655, -126622, -58156, 258226, 19919, 202206, 101256, 175416, 29149, 186146, -7892, 36601, 116191, 178853, -165292, -71764, 142722, -159819, 1830, -197026, -19449, -216713, 226451, 141185, -32915, 117728, -48236, -162974, -163864, 109357, 44351, -129914, 149600, -131504, 110971, 22737, -111341, 206485, -21578, -107961, 44582, -242772, -79021, 254319, 150939, 162148, 22017, 107707, 213933, 155653, 78955, -22988, -212072, 211385, 52926, 19278, -14748, -220805, 72772, -57490, -251178, -144865, -12010, -19903, -776, 258752, -147396, -147540, 16079, 179843, 100993, -181397, -120835, -136260, 84814, 52629, -161706, 152470, 76036, 29829, 173692, -143852, 47763, 125513, 217767, -91921, 97192, -258122, -106999, -91362, -188008, 181194, 258776, -169085, -207439, 107497, -211783, 7632, -5371, -73218, 211862, -225691, 134217, 109380, 84810, -146403, -15672, 159587, 7575, 250284, -185256, -137089, 236895, -185607, 56713, -37095, 126657, -95366, 131923, 66434, 22310, 68068, -54416, 63508, -151427, -30382, 212702, -93483, -6697, -202801, 120211, 215609, -220185, -248226, 74506, -74535, 269, 32996, -132171, -168995, -112567, 159699, 4311, -42877, 224625, -183345, 80924, 52472, -183926, 66360, 18822, 202848, -239553, -55283, 175254, -31910, 84153, -254061, 720, 121785, 92113, -79883, -171150, 90962, 248222, -43494, -82515, 233753, -194236, 245005, 74138, 181057, -94909, 193189, 159894, -55366, -45321, 214626, -201940, 28062, -54899, 229526, 51294, -164385, 175027, -247472, -137400, -212320, -12216, -107754, 110143, -164960, -162093, -15228, 184899, -139072, -159732, -192271, -65981, -203472, 1985, 55377, -80066, -258398, -255339, 76057, -230635, 234154, -188520, 204628, -140242, -138166, -228586, 205365, 212365, 10789, 77912, -213477, 160143, -59960, 18554, -36492, -149767, 70097, -111465, 76561, 181390, 104201, -59932, -187987, 179373, 75505, 34377, -217878, -109639, 200029, -88744, -77038, -92121, 147314, 1600, -233098, -76958, 32941, -203262, -55658, 234023, 43717, -38273, 230366, -258969, 230783, 52680], +[-68415, -213788, 260628, -219115, -92148, -130265, 117087, 245292, 103992, 229860, -180284, 107548, -24990, -233860, 141435, 129118, -186177, 255359, -94560, -97310, 165947, 142474, -32615, 173594, -167082, -38617, 236488, -212327, 778, 59135, -233994, -163747, 127511, 40888, -116385, 181870, 154890, -241880, -258799, 49221, -51838, 205276, 1353, 24549, -259862, -150569, 215576, 94312, 119163, 1307, -213188, -66434, 52037, 63498, 112183, 9942, -139415, 92175, 119864, 157318, 178261, 24381, 199287, -18625, -238367, 110640, -193722, 78357, -166043, -126439, -172791, 68726, -129025, -108817, 210654, -153762, -53830, -183556, -239377, -30854, 196530, -42415, 118370, -52712, 59326, 187085, 260976, 68627, -49454, -173052, -28587, 190605, 30533, -29149, -54443, 103339, 213621, 110114, 57994, -254005, -154691, 134994, -222357, -135025, -196007, 79219, -192107, -97375, -215012, -110543, 143745, -260829, 101216, -216305, 116681, -55645, 122385, -53529, -190290, -18242, -107477, 227973, -92220, -74706, 29955, -46964, -255729, -235698, 141488, 149089, -68598, -171559, -144562, -177454, 86615, -74237, -257797, 160253, -201259, -105244, -100217, 215224, 53312, -251386, -177557, -137454, 218611, -245729, 150548, 13400, -26844, -59851, -95953, -253921, 8768, -8309, -143481, 202149, 174420, 14800, 139674, 237064, 127412, 110624, 131546, -127404, -124354, 207863, -208232, -57410, 8119, -64654, -128181, 49147, -28278, 101476, -139358, 259473, 87357, 38339, 88026, 61983, -103756, 179047, 235123, 11500, 14840, 43303, -12818, -30825, 116181, 150116, 33765, 22983, 61051, 234037, 208140, -202982, -172992, -14161, 20082, 17016, 103387, 100824, 107192, 130173, -146889, -70707, 27419, 225327, -1470, 166863, -226210, 80690, -247477, 129658, -91942, -171777, -107628, -96988, -110257, -240093, 4179, 194765, 146088, -223513, -64639, 124681, 129508, -56353, -129524, -194908, -117680, 205330, 154691, -92430, 114210, -29729, 119627, 62684, -210580, -240507, 186611, -108628, 226016, -31348, -162543, -212642, -77282, -206763, -202912, -118082, 10778, 243048, 80829, -40447], +[-15780, 201288, 25055, -125534, 24763, -75782, -204980, -209191, 235026, -66842, 183310, 195730, -128630, -31822, 77386, 119071, 147808, -114211, -32210, -253607, -184646, -37110, 202131, -74500, 113189, -111534, 176295, 242718, 130244, 71169, -1401, -127131, 214520, -121329, -57129, 166448, -172975, 208984, -118533, 37386, -130710, -49417, 21764, -93831, -42733, -187367, 27479, -235125, 65863, 26425, -115845, 236117, -259880, -213194, -85962, -184184, -130852, 166793, -80818, 79561, -134150, 68479, -240606, 231588, 90011, 171037, 155026, 257749, 255849, 213760, 27245, -241387, -59092, -65642, -242233, 259784, -35117, -207604, -116032, 164251, 29782, 49495, 157413, 5289, -223885, 87685, -165946, -132071, -35500, -69967, 167703, 2199, 25880, -225349, 180542, 169290, 89265, -253830, -192473, 241807, 103718, 252927, -52859, -147461, -224859, 92114, -22079, 4663, 32225, -58120, -14583, 257893, -21775, 43319, -130648, 109154, -167722, -165353, -142799, -6433, -25055, 219321, -248814, -183170, 213533, -247695, -219248, 85080, -246515, -154729, -87801, 243552, 28468, -159831, 101909, 205660, -246777, 79421, 42081, 225465, -38961, -82972, -180051, -185693, -135650, 132557, 72618, 257764, 220201, -89765, 94639, 223677, 84105, 148054, -125611, -121736, -152618, 72326, -118677, 113532, 157198, -64906, 163718, 32812, -243743, 253149, -191235, -82852, -247846, 58336, -36849, 43829, -166263, -208120, -24980, 63468, -47763, 125606, -115039, -38890, -34027, -21397, 71551, 8392, -65204, 156631, 61750, -64333, 11484, 178852, 68491, -190068, -164841, -126699, 175396, 249044, 41841, 147541, -108052, 173838, 220193, -75125, -233572, 203586, 86493, 130285, 70740, 210681, -239204, 64411, -71427, 139839, -14964, -65051, 108363, -256847, 230064, 181167, -248359, -129532, 255386, 156324, -88470, 223013, -178757, -244450, -16221, -6183, 146381, 165559, -130197, -89755, 208861, -81239, 191981, 238140, 21501, -248309, 113408, -209353, 132943, 74744, 123300, -120848, 43670, -234471, 177471, 174316, 233247, 15641, -57358, 76209, -136959, 215270, 226533, -147726], +[28984, 175536, -87316, 60148, 132601, 8378, -232208, 165555, -18592, -34076, -146289, 58514, 190092, 174975, -60855, -18772, -80721, -33760, 104301, 40432, 215178, -107064, 108065, 83384, -151130, 21721, 204823, 7114, -167573, -87795, 222662, 236171, 225291, 46453, 91651, 12492, -122713, 218943, 202570, -118015, 108001, 88580, 114580, 193794, -255841, -196444, 215161, -205757, -243208, 139171, 236092, -68109, -242192, 164686, 83653, -166802, 199904, -182597, 171739, 9698, 179616, -40770, 94774, -80012, -220168, -238430, 74086, -246388, -35375, -242146, -232981, 115990, -23766, -133351, -202391, 200073, 96191, 36571, -148280, -63047, 227400, -172018, -196005, -109087, 145103, -35222, 37875, 72598, 81720, 63289, -254083, -184696, -123540, 171826, 217793, -237265, 166603, -117192, 126467, -206397, -112696, 116605, 207760, 225299, -811, 261475, 9787, -122248, 187604, 203160, -31336, 53093, 75332, -199286, 64984, 116924, -258758, 49637, -148454, -203703, 190879, -200132, 167776, 104541, -184229, -3614, 169864, -252942, 248704, 188885, -197651, -180754, -162515, 164806, -35855, 133234, -118614, -130836, 58947, -226097, -169393, -24185, 249228, -209576, 108678, -259331, -9913, 44129, -177477, -111258, -133071, 179510, -194953, 71169, 94327, 225322, 77045, 157035, -50679, -256060, -116284, -74554, -24173, 135876, -176616, -143908, 229217, -250949, 236652, -217471, -239970, -104064, 122411, -214420, 119905, 159181, 252273, 141969, 156808, 178699, 19668, 65796, -208335, -117105, 132400, -56847, 45905, -55973, -220313, -70116, -119880, -1727, -180339, 165864, -48843, 53241, 261796, -14994, -200906, -78909, 30164, -169867, -150514, 70915, 216747, 193644, -202045, -195365, 176650, 83469, -159918, 152240, 84209, -146776, -124953, -16862, 160453, 50540, -164289, -153342, -146, -51149, -167124, 63990, -3702, -168007, 73493, -148007, 56643, -183679, -23103, 131775, 116995, 21391, -249244, -128794, 24602, 34179, 18257, 138592, -107374, -39815, 11657, -112429, -130040, -2683, -78667, -194585, 56822, -44876, -118640, -58514, 135531, 183187, -122809, 228816], +[63803, 239995, -153168, -86729, -125026, -106929, 212490, 32212, -74035, -7515, -179012, -162931, 101466, -188732, -190169, 220315, -48773, 159859, 48471, 68214, 1925, -122011, -213718, -181130, 136218, -241862, 78461, 134463, -135724, -37521, -56208, -104785, -101470, -239931, -105760, 240149, -193389, 15559, 186882, 197836, 52664, 217614, -235160, -39196, 183181, -33970, -67310, -87870, -27355, -97805, -251728, 230146, -245564, -94438, -92702, -257460, 19746, 204288, 31205, 195333, 102045, -207521, -91856, 200295, 64753, 74658, 235912, 223496, -232817, 55169, -91034, 52416, 114896, 170925, -41183, 13703, -193018, 256243, 242497, -84396, -39034, -22040, 62460, -27732, 53005, -220262, -85561, -132343, -68352, 197663, -209901, 224942, -78552, 54807, 199613, 95663, -172161, -60723, 171684, 145189, -192527, -175029, -168368, 45852, 158187, 59685, -112406, -174005, 154489, 215627, 115096, -12569, 243966, 60745, -172890, -14035, 130802, 194909, 234605, 133047, 116349, 243490, -125217, 97368, 162330, -87862, -54236, -188124, -138311, -220380, 256730, -66201, -61123, -198267, 137962, 52564, -171239, 31223, -172555, 125377, -77556, 139476, 261418, 260510, 207000, 88162, -145522, -233342, 81434, 34092, -156591, 88410, 48703, 187086, -177864, 192505, -185968, 87034, -105410, -41078, -70814, 67545, 63723, 56505, 115909, -14444, -191680, -212107, -20912, 191259, 129352, -238304, 12986, -24629, 220084, -120074, -228225, -115123, -208167, -135738, 39424, -121002, -157538, 175176, -160054, 104810, 186563, 29657, -177649, -323, -2869, 64182, -99564, 91289, -87955, 67090, 53177, 94591, -214885, -26224, -202273, -163565, 254495, 181548, -54281, 21530, -62292, 232579, 158508, 129625, -261473, 115684, 224514, -145060, -18153, 69366, -14863, -35585, -178209, 111515, -235321, -67978, -54003, -163866, 29514, 60577, 193374, -96620, -260087, -176740, -145037, 136670, 255235, 151430, 180259, -48831, -117710, 12792, -138784, -248004, -169590, 87706, -33490, 205419, 35597, 161236, -58759, 246819, 94566, -231297, 225330, -228650, -38340, -93193, 106254, -201297]] +||r0||261796, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-201659, 229740, -289229, 503274, 84816, 517884, 16167, 90087, -109900, 112949, 202968, -117516, -224481, 279096, -288761, -86933, 204501, 292285, -312247, 520445, 439706, 218627, -35448, 265158, 467161, -91174, 368895, 37966, 223046, 320840, 164436, -488084, 183244, 469942, 311465, -448812, -33067, -184833, -348036, -213874, 167541, -257506, 331600, 72590, 227101, -512223, 521095, 278087, 138476, 317084, 217401, -111427, 234829, -151377, -154908, -342852, 467432, 96856, -455255, -509601, -225181, -143053, 460649, -349841, -419978, -437576, -404490, 251362, -160128, -163652, -34510, 64654, 425122, 184046, 316785, 512956, 104531, -133267, -349173, -255563, 222630, 75631, -144475, -7100, -312909, -298932, 121645, -1739, 332421, 18841, 128410, -238160, 208459, -332647, 50428, 501935, 479505, 252718, -465651, 257395, 407311, 440348, -264081, -435714, -105048, 179561, -505697, 466770, 149208, -137405, -42308, -376585, 379015, 455655, 384850, 363184, 473646, 314608, -158284, 3898, 88338, 121357, 254585, -287009, -241031, 94707, -117977, -272274, 493095, 240769, -41707, 196490, 131270, -414862, 42571, -420711, -509561, 333979, -260690, -92932, 84010, -529, 513238, 253566, -401496, -315195, 131243, 348264, 387908, 297975, -176215, -77614, 103126, 84924, -217242, -447481, 473872, -243177, 394754, 492932, 248866, 95102, -24539, -483413, 13330, 408361, 417259, -6440, -161307, -17907, -491832, 237860, 16252, 14044, 384936, 141369, -181430, -334826, -492896, 273887, 451194, 134742, 411814, 125843, -251462, -40951, 406062, 463936, 86861, -240993, -61697, -345288, -18419, -1356, -57365, 358931, -137431, -317374, 343952, 61304, 516496, -89316, 85725, 65555, 82526, 210827, 291987, -4362, 46314, 385956, 269467, -399359, 265438, -412133, -36691, 230109, 167614, 369617, 71190, -323474, 519336, -285657, -493682, 362212, 347740, -102580, 370409, -135199, 345549, -58068, 222377, -77605, 27025, -198951, 445486, 7312, -268982, -315259, -350608, 272588, -306991, 135089, -392227, -264903, -146270, -422824, -354573, 167892, -144700, 102116, 75942, 293773, 442686, 53561, 9858, -240860], +[-515501, 346309, -172582, 194577, 173809, -327457, -370432, 35015, -389206, 4372, -110715, -273189, -519288, -237620, -411200, -262495, 439556, -207719, -142128, -112968, 103289, 246777, 478068, 345610, -83834, 429054, -396320, 513815, -336022, -62017, -135023, 519757, -202461, -56804, 3201, -414599, -90561, 492805, 259405, 492812, -404228, -517464, -376268, -323569, 71086, 295900, -250796, -411894, -469900, 473416, -2972, 402420, 126054, -88501, -326112, -174759, -48805, -170192, -521660, -19306, -490578, -225049, -456096, -500584, -1025, -485877, -385770, -139582, -267609, 440521, 16771, -518999, 214224, 432368, 233216, -410260, 508371, 183945, -512666, -45493, -168624, 117459, 261109, 346821, 15821, -316780, -402643, -293594, -481379, 417518, -442395, 246667, 374132, -305, 188858, 42550, 515750, -469240, -113643, -490026, 465250, -114127, -178884, -94953, -72637, 468932, -387715, -9853, 288555, 155239, -44306, 405220, 201583, 355048, 464307, -1308, -473833, 498969, 252050, -286784, -321173, -153244, 390653, -273595, -41230, 140620, -209204, 296590, -110146, -302107, -86322, 481385, 346588, -314756, -281504, 407780, -240305, -423112, 3924, 23429, 175075, 509423, -350998, -245191, -197130, 203387, -420308, -280923, 234920, 148185, 314523, -435385, 251111, -230943, 146154, 484950, 356547, -404636, -207193, 459093, -294950, -70761, 508483, 458106, 39679, -246582, -104681, 131801, -239237, -406584, 17529, 344756, 191711, 342453, -138799, 84022, 196017, -308863, 189816, 322569, -141330, -357580, -132626, 497499, 460937, 290752, -403319, 65490, 112896, -423594, 239250, -66309, -7802, -444124, 496133, 103565, -56859, -68234, 121156, -264502, -50995, -471, 26229, -149371, -121463, -395296, -513981, -149695, 162498, -305135, 448968, -474374, 5446, -201329, 306442, 56524, -451887, -301860, -26297, 65968, -489049, -365359, -460769, -454171, 300486, 60393, 448526, -346039, 51113, 435078, -207628, 289580, -160294, -25377, -448152, -58935, 340437, -39091, -127360, -226652, -233595, 521881, 520688, -54787, -230059, -351823, 384575, 376230, 66157, -132946, -507678, 182809, 419984, -188165, 130212, -458252], +[411033, 118432, -57884, 34774, 246514, -227729, 15408, 145618, 364149, 247840, 153092, 178403, 186981, -232581, 418980, 82216, -142006, -212994, 509863, -244214, -190796, 418035, 198565, 5382, 516419, 484689, -384467, -463227, 253180, -419693, 68434, -388968, -484828, 59019, 326624, 481660, 326047, -154838, 417907, 524126, -411030, 189968, -100540, -295221, 38880, -45614, -412923, -512812, -479096, -470766, 13637, -329463, -192134, 259632, 432612, 495344, 402214, -339079, 254688, 82490, 420949, -166964, -323505, -137427, -315502, -453798, 370987, 119337, 594, 431664, 523413, -273301, -256719, 350034, -264028, 442233, -138445, -3467, -198372, -296872, -367313, -255379, 121809, -477573, 102594, 223984, 269461, 72352, 337886, 16840, 462659, -115651, -170604, -32826, -380343, -98747, -38764, 13525, -493252, 178582, 355518, 346687, 332743, 415898, -285329, 144269, -54341, -56600, 222251, 124168, -420683, 324252, -25364, -7908, 509748, -153549, 388914, -51504, 372196, -198463, -514683, 411517, -85189, -179306, -37210, -7697, -348356, -129239, -266376, -88512, -452412, -335642, 217222, -122377, -261918, 103750, 70901, 82064, -380226, 31158, 134305, -130158, -454350, 196976, -423143, 96116, -68269, 504546, -181863, 521129, -158347, -46320, 176450, 410792, -259645, -37442, -478990, 167910, 105075, -50124, 213123, -230739, -493927, 203075, -62435, 491585, 52739, 446730, -510208, 51132, -401865, 205905, -168189, -287107, 17643, -108250, -42578, 237207, -108563, 150092, 340306, 112137, 416998, -169624, -201434, -512323, -331413, 421710, 23687, 296282, 160085, -250348, -10720, 339738, 154740, 264835, -82649, -507130, -424360, 476617, 62667, -433281, -425284, 391562, -371709, -57226, 307686, 132939, -326852, -36645, -34853, -145380, -332928, -416376, 462910, 20607, -127756, 72365, -66925, 62221, 204066, 451869, -111511, -226332, 296991, 153791, -348427, 307526, 318900, 198342, -81985, 276858, 33739, 385273, -465589, -209783, -148987, -422391, 90747, -310702, -335003, 472884, 344746, 454425, 205883, 226155, 59846, 23937, 227478, -64000, 112712, -139939, -423364, -278396, 93196, 95316], +[-425071, -8091, 334999, -479272, 420084, -283704, 150359, -269268, 265777, 221248, 418196, 261692, 391693, 74221, 182521, 124165, -366079, 225185, -388335, -396847, 234570, -357224, 202095, -64214, -124896, -517184, -362505, 57939, -361678, -489006, 263464, -122222, -493340, 322832, 135060, -370434, -515933, 414386, -241514, 147337, -262802, -80027, -38328, -297533, 182202, 221540, -332121, -443994, 275349, 241654, -32329, 503036, -87898, -287606, 448590, 20338, -142985, 140057, 501440, 231800, 89043, -56305, -309722, -273893, 64633, -97184, -242992, -329749, -356018, 394235, 124576, 33692, 389391, 267974, 4024, 440845, -332911, 17955, -252793, -216550, -162012, -83071, -115328, 459881, -160733, 216041, 379620, -45847, -190146, -326771, -215241, 200239, -57787, -224485, -168802, -223049, 217635, 497, 18775, 494926, 308847, -32661, 190271, 82666, 495047, -638, -74378, -485104, 269862, 495772, -341072, 315986, 84735, -59161, -285336, -505850, 292053, 447796, 84345, -142942, 394751, -313697, 409367, -89913, 71078, -113094, 36622, -468109, 314310, -111276, -184116, 441546, -486093, -75852, 286491, 43088, 168440, -333203, -439207, -458230, 265818, -322330, 421142, -424598, -385458, -237753, -192738, 223487, 169610, -52345, 78504, 445920, 300053, 121483, 262218, 415396, 13156, -76841, 513353, -40808, 304180, -518324, 142037, -339943, -73758, 517122, 107363, 437957, -96907, 100991, 385583, -159327, 43247, 158418, 505838, 437484, -252596, 28232, 500990, -321787, 86851, -73153, -253122, 435633, 402902, 265616, 409928, -72071, 335293, 155156, 106505, -10697, 312157, -198576, -445426, -210563, -247360, 108330, -128463, -224643, 177232, 198164, -381344, -255563, -141387, -415297, -63248, 438630, -79275, -268761, -459932, 519093, 310487, 373144, 438663, 16412, -22831, 447620, 155966, -128876, 303517, -343536, 218905, 95404, 403651, -50822, 342365, -368772, 168362, 51085, -173147, 37026, 379257, -193014, -187572, -147009, 381901, 235964, -281709, 456298, -416998, -29703, 402527, 164121, -198608, -141667, -376664, 385219, -396954, -334223, 265089, -30869, 197358, -83261, 483978, -471398], +[303224, -11846, -510477, -160274, 273368, -108071, -132161, -384581, 78928, 461825, -21469, 293493, 397455, -329275, 480596, -204583, -212077, 441036, 234681, 44858, -517993, -506701, -69149, 328241, -355204, 332661, 438134, 267291, 243178, 270003, 500558, -104068, -301510, -277056, -289963, -279456, -119438, -521855, 481448, 124944, 76312, 181477, -152807, -338064, 111796, 222159, 27095, 487843, -200572, -432043, -193271, 502598, -404451, -483015, 46206, 151805, 66390, 192104, 104579, 160330, -405093, -201744, -95001, 370515, 427500, -88233, 171615, 471014, 407619, 299505, -279593, -147844, -275594, 137893, -384383, 111392, 448054, 310464, -173102, -129940, 518630, -14594, 262644, -150986, 314484, -352108, 460227, -397517, 12792, 275860, 6134, 420029, -260968, -63378, 196191, -179423, 263757, -354945, -111969, 125171, -380705, 498352, -337991, -138556, 50141, 394826, -98621, -491095, 211042, -256989, -448812, -28188, -395830, 223650, 473431, -245284, -331218, 153049, 133138, 298992, -295320, -12070, -34584, 109623, 10213, 7583, -152235, -188333, 471646, 349392, -517510, -503746, -430786, 339513, 301593, -167466, 277483, 305255, 59338, -232125, 176824, 138790, 424600, -172424, -312713, -313529, -269850, 417658, 19770, 303356, 20500, 145603, -280293, -160031, -286632, -337408, 257558, -329590, -197557, -409330, -420878, -384710, -250806, -42913, 374915, 281594, -284199, -64458, 506084, 373239, 22005, 350796, -230311, -494470, 99493, 426748, 509137, -201552, -214414, 468608, 89778, -115848, -507684, 186442, 263324, -342686, -456805, -427199, -193895, -92805, 351209, -199074, 488975, -454915, 470212, -493062, 328933, 72208, 283579, -215771, -118915, -231259, 207755, 325586, 127630, -204627, -496230, -518914, -387379, 362419, 349829, -467391, -132512, -351724, 36185, 74521, -119374, 220487, 185920, 340677, 336479, 28521, 408982, -161480, -343248, 410824, -132082, -314457, 483277, 20392, 468983, -164621, -327367, -84924, 216648, 274337, -120834, -29557, 264169, -469414, 3111, 73204, -331130, 23389, -451608, -178575, -269680, 62829, 77172, 61557, 228320, -123969, 313320, -368695, -327547, -220570]] +NTT(y): [[7201786, 3449281, 6254867, 7825074, 1977123, 4799821, 5280827, 1894196, 8075650, 1657711, 5385752, 464853, 3813041, 1386845, 5691517, 2429777, 338890, 1263423, 5595470, 989811, 1408917, 4020424, 5403566, 683218, 5069632, 3181584, 840539, 2848374, 3031638, 4932898, 5523990, 572309, 8116844, 2751207, 1155868, 6295581, 7962798, 7552812, 2175641, 3270519, 3080919, 2651632, 4850794, 5629766, 7808423, 7907419, 3559437, 5411863, 6218969, 2341330, 4938141, 7332802, 5063123, 6308688, 5856207, 5983098, 6594913, 3054589, 408386, 4197788, 7469829, 724600, 1556506, 2000487, 5592277, 1201186, 4718137, 6029983, 8078956, 199587, 5122732, 1620705, 5242017, 5917, 4778240, 426494, 8366706, 1587007, 7837995, 1745822, 7702228, 4858631, 7952457, 6136782, 2253819, 2288240, 7062780, 4985033, 7716891, 3979764, 1661825, 3337126, 3836662, 3820071, 2923422, 3103472, 4042682, 7840413, 5753568, 4981119, 1606332, 5118455, 1687028, 4496189, 7400673, 1265544, 7805232, 6367198, 2540037, 4038887, 7827248, 4235184, 7783000, 694763, 4943664, 8238988, 1692300, 1717700, 8263657, 1327159, 2035981, 2672379, 5718135, 4607729, 8224545, 1379294, 7332671, 6519504, 435524, 1270912, 3738351, 5618172, 4077808, 6533147, 6710266, 5381879, 168720, 5385305, 2779134, 4583664, 1977865, 449081, 5694377, 3858033, 4698470, 8148545, 8119587, 2707017, 2803461, 122710, 8269457, 7762215, 7255170, 6129851, 6793552, 4710461, 7057695, 4756773, 6151506, 2598785, 3026059, 5338152, 3723084, 4761812, 3397330, 3035310, 8012796, 1682940, 2575908, 7636556, 164653, 717407, 1062269, 1748354, 7862856, 5434719, 2115309, 7415000, 3617008, 3713693, 767985, 5829947, 4801830, 5866644, 155647, 1983136, 6188716, 4382035, 1664617, 2563901, 1794840, 5065702, 2288878, 2432434, 2091993, 2336768, 3752205, 3705917, 453081, 8216529, 1702698, 5771096, 2935085, 1199278, 2067156, 8274276, 6402682, 3208619, 2625573, 5655829, 515148, 6689934, 6794230, 6373879, 2370446, 3285489, 4510339, 3406489, 3306611, 5418705, 6376114, 1622818, 888784, 2697530, 5937866, 2075805, 137942, 5172873, 4045317, 6612000, 2645903, 5678287, 2200378, 4377519, 6281484, 2681103, 4896601, 782622, 482355, 4321008, 4546069, 5192301, 7095978, 2402448, 7835100, 698915, 5753881, 5556028, 1308253, 2935783, 3813333, 5233827, 3368811, 5346022, 541146, 549056], +[6864270, 3414693, 8331767, 5615313, 7552214, 4809747, 1656411, 1300679, 6283763, 2203957, 7074871, 1676236, 301189, 2528813, 1633515, 1126621, 2613931, 8241862, 4804203, 7282380, 6151261, 5277303, 5515764, 2487850, 4888420, 5677478, 3371228, 4962627, 5113784, 3474961, 7099541, 4137740, 319294, 2051532, 4554803, 1785013, 359976, 3078960, 6516509, 2919388, 6845220, 6993135, 7022434, 6401006, 8190537, 458086, 7863814, 1133414, 4918678, 2716050, 6526422, 2306407, 626937, 7480737, 8064153, 3136431, 16971, 3420629, 4966268, 4287154, 5273403, 622838, 7845071, 727786, 96951, 7435128, 1218311, 5365163, 4715228, 6641653, 1462574, 7543400, 4652219, 4120798, 7421376, 1496821, 6543187, 3921637, 3726581, 6741272, 4953647, 7537687, 603506, 4744983, 6921533, 5208620, 3117085, 7361010, 1382490, 5180546, 2959796, 1652715, 8266681, 2088017, 1028350, 4370407, 2349226, 2050778, 4668658, 3383802, 2286225, 188036, 4772094, 8128911, 5816663, 5348967, 7625840, 1983213, 4855394, 2579518, 7363338, 2248636, 1814008, 978191, 8111079, 4179578, 2355142, 3390578, 7124314, 7421634, 2275415, 581064, 5897167, 1942433, 5575191, 108743, 2643397, 3561039, 7199158, 5399256, 4558366, 295499, 2208035, 1920857, 4671950, 5722669, 3510996, 10010, 4890474, 7522381, 1545259, 3641956, 213304, 6186841, 6317254, 7400069, 2653880, 3534443, 1002978, 8078666, 4413140, 783329, 2655104, 6912459, 5488857, 6051380, 5588021, 6897370, 4723543, 4931993, 7303180, 725425, 7081262, 5271010, 6691976, 6553641, 1099861, 6703825, 6113940, 1896282, 1635285, 7755885, 7617091, 6858199, 522467, 7033647, 370051, 6321469, 4000388, 109160, 2443332, 8163639, 3421161, 6450237, 5059172, 643704, 1926585, 941005, 5316184, 6255637, 5145989, 8304455, 874182, 3500745, 4485724, 3889902, 1751629, 4814079, 4007110, 2697585, 3666546, 2203132, 5665126, 6559981, 7091863, 2987883, 7595314, 5938965, 7970128, 4924444, 2752390, 815046, 552517, 5095443, 3068787, 8208054, 2100035, 3369128, 5590526, 1637343, 629381, 4068849, 662948, 3791456, 6577310, 3118335, 4172676, 6042490, 747083, 6641445, 1355208, 917017, 5609143, 127909, 1668513, 3865340, 2633474, 617031, 2639242, 2511919, 6833086, 3817741, 16493, 6016056, 4231696, 2778162, 1490399, 5441461, 1075825, 5267768, 4763173, 320874, 7916691, 3608943, 888693, 3337371], +[7247850, 2613821, 2753489, 2343097, 1207791, 3685947, 4828903, 7068786, 7658406, 2863104, 2567811, 5124603, 5176069, 7541964, 7457003, 879645, 425622, 7292789, 7893679, 5803915, 3370732, 6813799, 3653211, 3158167, 8076440, 3299003, 110438, 6814221, 1112684, 1997974, 1383670, 7836223, 5252264, 4965890, 7723591, 6507585, 6557865, 553622, 5342562, 1665156, 2497566, 4822774, 1367078, 698932, 5511982, 633196, 2698847, 4289686, 3489438, 2608624, 413481, 2327085, 3199655, 6128510, 241606, 1755723, 5933057, 2407993, 315171, 7277939, 7409161, 3646630, 2607946, 680711, 7738547, 907360, 2052037, 2957383, 3456957, 2164678, 2326591, 7239266, 2921858, 430009, 6000572, 6824523, 5023819, 5082664, 3606696, 7224344, 8186304, 1149529, 5524234, 1155209, 2338712, 3342099, 8355078, 2263193, 574521, 3331738, 2373094, 4840479, 8075946, 4801261, 3859240, 2420920, 6164906, 322966, 6246488, 2294947, 987465, 5000303, 2769479, 3819213, 636831, 8233358, 5312923, 4422607, 4616278, 1288490, 1382599, 566121, 6160127, 5297727, 2505857, 4712532, 1891141, 6653871, 1892775, 5333375, 7568530, 869859, 2216609, 3638869, 6489286, 1707300, 3118816, 5786258, 8076658, 5388235, 4133674, 2700677, 6693302, 2090269, 805356, 2499184, 6555591, 7325813, 5523402, 2690449, 117031, 3942522, 5402337, 203511, 8031678, 331126, 2165888, 7116626, 762212, 6329854, 4771340, 3445735, 2786013, 2941216, 6337539, 4449199, 8310004, 6046744, 2937380, 1397275, 4069817, 4666879, 1402663, 5648913, 4064332, 1513262, 5575158, 6998542, 5532954, 6631341, 1527544, 7816041, 2084402, 1768701, 1980766, 2027818, 2623653, 8238148, 713743, 7897386, 5669796, 7355960, 3509944, 1874023, 7838819, 2966097, 4322347, 7259048, 5423024, 7124972, 5167326, 624469, 1543660, 6200163, 4017861, 8226815, 1714147, 7909922, 4538588, 3110782, 813087, 278574, 2466134, 3259785, 5022099, 6195271, 7292277, 6667135, 5109944, 8266969, 1483473, 3444729, 2699417, 5072380, 1077581, 7886265, 6906584, 146520, 2415592, 2238455, 6842506, 1690613, 1181482, 5840650, 7229107, 3227835, 4826826, 6862353, 6104021, 8274708, 737353, 4827480, 7173943, 6581144, 4716537, 1934884, 4463675, 7737257, 617928, 10302, 1502478, 1920135, 5813403, 4770348, 1320439, 4111106, 8011522, 3877058, 2345418, 5588053, 3761994, 3852565, 4865217, 3354733, 6976999, 600194], +[973664, 3620268, 6465262, 4088998, 1225087, 7325921, 4883140, 1708371, 1129342, 5289567, 6585594, 8168700, 113682, 553667, 2224050, 7132790, 3174308, 6076626, 828372, 5077069, 2962260, 2417472, 1333796, 3297368, 3203725, 6329502, 5572764, 6567498, 633125, 2929555, 6484640, 465396, 4684113, 1027408, 6488665, 664505, 6347721, 3348625, 6651416, 7841774, 5549182, 7468420, 8137284, 2838361, 5842407, 6744813, 965575, 925640, 4078958, 8051261, 5520185, 4282074, 593245, 5881326, 717367, 2006993, 2156776, 7438868, 266290, 981094, 3549547, 3897443, 4962319, 5909675, 6907269, 4479713, 5561761, 1189819, 1632626, 4493705, 6223927, 5670737, 4657054, 2401868, 5762700, 7992676, 4496072, 6802854, 471145, 5974944, 7741281, 4685111, 1465478, 4833873, 2772420, 4566317, 7168217, 374281, 6615326, 3143718, 7506070, 5232536, 3945832, 1948181, 6003675, 3270537, 7255204, 6875089, 7972342, 1292542, 8130857, 5274548, 5965615, 736192, 1809441, 8008221, 5001018, 1558062, 4905031, 5659808, 5256396, 1454565, 3613820, 2830673, 4712145, 4282008, 4185050, 1671280, 1740807, 3284055, 4876607, 2982906, 1139307, 28814, 3729592, 3930989, 818185, 3332191, 4255281, 6821443, 5829999, 683249, 3335215, 2084887, 4784892, 2997012, 898200, 5222563, 6984547, 7857117, 7840140, 1254055, 2173892, 500873, 7957720, 2560602, 2021414, 3418837, 6168430, 5684938, 4644674, 4433757, 8374308, 5913765, 4048379, 4460942, 5198871, 4605212, 4463852, 7682295, 7139172, 6900251, 623009, 4096935, 1831640, 4320466, 737495, 5555839, 7743801, 7604291, 4115958, 7877210, 1048159, 4453758, 7357041, 2121758, 101317, 5871063, 4698497, 8193706, 5973795, 3072249, 4995669, 2206539, 4228577, 8027258, 6558097, 345323, 8314399, 1854727, 3606869, 7901679, 1636061, 5827231, 6240644, 3107656, 4148449, 87376, 7087876, 6376117, 8371120, 4947737, 3150067, 6395321, 101883, 6047948, 2444680, 2056021, 7337094, 5195116, 820213, 72394, 6591380, 3733809, 1115485, 2508284, 8127255, 833590, 2949183, 6589553, 5948247, 6583239, 4811577, 742610, 6843953, 2599306, 644696, 7611650, 4542889, 7487460, 6562135, 3146338, 238506, 5435648, 3810551, 6261260, 2123905, 6468092, 6372456, 6573557, 2331788, 1148312, 3143103, 7229221, 4162104, 7377989, 5096822, 1711004, 4857064, 5206965, 8245772, 4087905, 7390784, 2752971, 4941804, 8347163], +[2697336, 359868, 6682304, 4510575, 4939464, 5462763, 5009474, 471435, 2074562, 4335775, 5089740, 5577805, 3208610, 2696263, 2270204, 8194282, 376678, 3743581, 2411201, 8368713, 3457901, 5677672, 950168, 363705, 3527302, 5490583, 6516924, 2686920, 1396030, 6850570, 3879675, 5188354, 883124, 1078353, 2347819, 7289875, 1549916, 2556252, 7264835, 7899605, 6463501, 2080521, 6680465, 422772, 4210112, 6972914, 7138639, 109710, 5354813, 5881572, 4304970, 276344, 4901196, 4732868, 2743601, 1657321, 5020124, 2698173, 7208824, 2783711, 6719731, 7729534, 2631960, 2187699, 1820692, 5798321, 3628326, 5762166, 4275750, 1896030, 3051139, 6822845, 5290575, 1677111, 1610501, 4145977, 7903517, 1892930, 2125869, 7018820, 1066118, 8226501, 5531389, 811674, 3238555, 5936560, 7373992, 984250, 6295523, 3522836, 4239298, 3318262, 7696235, 8106159, 4565067, 4313073, 809795, 4994216, 3286428, 5632584, 186388, 4323813, 1909662, 4294970, 7444269, 3079308, 3480055, 623216, 3133238, 3539921, 8372888, 3392465, 2009332, 643450, 1845411, 6843560, 6527956, 5726715, 7109520, 2871265, 5301709, 7920140, 130307, 7450234, 2136713, 490955, 6960933, 7447170, 81731, 5804, 7829310, 7502714, 4536939, 948680, 5845455, 7432556, 6868247, 5340443, 7796841, 2813647, 4074138, 5779761, 6208549, 6664429, 563015, 6833301, 851779, 1858289, 7042569, 1713615, 1338367, 7754589, 1265735, 8120700, 8037838, 365979, 5652751, 1794454, 3292831, 5790592, 2920917, 6422130, 1352463, 6740790, 1547226, 2931642, 1681875, 348899, 2501497, 7726804, 7403302, 3524164, 55324, 4855468, 5997955, 1989604, 7250289, 7955284, 8297523, 7927323, 5725667, 7531042, 8219932, 7387402, 3564230, 8047569, 6825125, 4110484, 2349538, 5814220, 4399418, 1775668, 5787711, 8214704, 7399080, 1810681, 529070, 4634290, 830235, 3814861, 378669, 1213845, 4763240, 2292847, 7246455, 1150105, 4942002, 2436542, 2166874, 2451277, 7221312, 540629, 3579154, 2417257, 326285, 186876, 204943, 8067931, 1217454, 5435570, 1938599, 1339109, 539608, 5516089, 8166843, 6869267, 2049403, 3476348, 2124999, 4967753, 4318342, 3685562, 7353847, 2174134, 3496902, 7337134, 1690838, 7409778, 3984049, 2663719, 1095943, 8113763, 4059906, 3030030, 6343658, 1479749, 46810, 3953454, 4179560, 7327242, 7102775, 8027995, 6529160, 8248223, 5381176, 4314941]] +aHat * NTT(y): [[2753467, 534002, 434232, 4629917, 6092653, 6639983, 1250047, 5198985, 4438424, 6857051, 3668735, 105930, 2942107, 6104815, 3974798, 4011330, 4681128, 2559533, 4685866, 6153268, 2161780, 2860413, 1851559, 7948271, 8117305, 6195637, 3308465, 4779338, 5355243, 3844524, 2532208, 7500516, 4907650, 5977554, 7375693, 7127481, 6236002, 274693, 2294707, 2436618, 4507698, 7410294, 7847962, 2330093, 4002324, 3757820, 4377057, 4136729, 2249176, 1135239, 8282179, 6514350, 1286807, 2627793, 3386333, 5575744, 1436715, 5530259, 6849224, 7634436, 4658570, 5718651, 6546431, 7876447, 5648046, 2689976, 6565108, 3154699, 7372778, 2888577, 950962, 6596899, 4336771, 2778015, 1480608, 6227488, 5530148, 4215808, 6986830, 50306, 2430487, 2856715, 7120910, 1871196, 2933258, 7446308, 6732965, 5199214, 4490028, 1244830, 41126, 7437890, 2519834, 6202734, 3325133, 566399, 4499969, 8237112, 2731190, 2530918, 3036669, 5311151, 1542648, 6249693, 2861495, 4916165, 6300228, 7497608, 8309932, 6156321, 6487400, 8327638, 7371298, 5424612, 6663867, 5772210, 6629827, 7539007, 2514193, 5562023, 7068332, 5303117, 7707994, 8223, 3795723, 5478086, 2137588, 93822, 1638104, 1465221, 7329361, 1972062, 5138414, 4211961, 4468265, 4725477, 2651418, 6637244, 7985113, 4812949, 1271749, 929771, 559301, 4279472, 5629917, 1447503, 5998389, 2770958, 4641474, 6539054, 2659349, 1682418, 4441221, 616937, 707497, 5214798, 378973, 8098583, 7106900, 6398910, 6623818, 8358923, 6151615, 5488269, 4136087, 6478273, 3235936, 7798343, 673073, 7892010, 6327852, 4935689, 8115877, 2303200, 5632340, 3259233, 2615181, 1081444, 5918146, 3063766, 4188473, 5842080, 5811085, 327900, 6022066, 1763251, 3531723, 8358090, 3722438, 8351298, 6372689, 5875442, 1306913, 304229, 6166906, 7533690, 5513354, 5582126, 4376451, 3772240, 628409, 2377193, 8217663, 471967, 6283520, 4328352, 3835854, 813033, 1971779, 6443521, 848918, 1080191, 6969128, 1551203, 8259411, 1348926, 8327031, 3032129, 4785903, 6622204, 2691066, 1681069, 2286357, 2743601, 7624918, 7086407, 5473655, 290366, 6986130, 7944357, 6743012, 1051970, 4921902, 5626124, 1390814, 5606460, 6807058, 697693, 5992676, 4782714, 8221901, 4362453, 5408031, 2774289, 673142, 4562880, 8052447, 7726373, 8120915, 295912, 1051978, 4915487, 7957334, 4960889, 7380012, 7136705], +[7846773, 8162709, 8347187, 2063015, 1196673, 927161, 457152, 7553436, 5829571, 6986333, 6930569, 6731329, 5459988, 3942283, 5056821, 2774786, 6382794, 4548843, 5579897, 1056468, 846550, 195332, 7255290, 4221574, 5879568, 1693398, 963332, 4557934, 319504, 5698569, 1305516, 5230156, 6319514, 579159, 1528273, 5039317, 3287243, 1242787, 3397751, 4338213, 5640747, 6094696, 4381940, 6979513, 2743137, 4413422, 5378724, 5102355, 4353759, 4533942, 6754445, 7040408, 2241045, 4343392, 1647365, 4924843, 7820145, 4489397, 425347, 1823287, 745703, 1678346, 6811372, 7120690, 2369501, 2388826, 2260003, 4327180, 300116, 6108021, 6150586, 5484511, 3094553, 2645319, 162483, 4857690, 2006187, 2696197, 4983778, 5066142, 3089771, 1723080, 4299276, 3158842, 1208044, 58855, 131303, 7443525, 8180941, 223760, 1546883, 4695417, 3386409, 4610295, 102481, 869404, 2543051, 6350514, 3719013, 432148, 3876593, 700388, 7670197, 6314661, 7895188, 2192888, 2695537, 944940, 5469811, 5468504, 2766551, 4485943, 5911751, 765811, 2128993, 6050795, 63061, 3918430, 527273, 5626711, 5811825, 4094318, 4326925, 2047481, 7870587, 6089178, 6489393, 3785683, 3747740, 4210189, 7462417, 6370575, 7977048, 5247498, 147425, 15388, 7484408, 5897489, 5020674, 7632660, 2222486, 137875, 133331, 4536602, 660079, 82485, 1596064, 1003485, 4884695, 1967000, 2662850, 5230528, 4177034, 2183479, 7184697, 4101751, 353670, 4804217, 5688201, 3753395, 7349253, 3732339, 2770808, 3167477, 5428350, 5954990, 4134012, 7257936, 6945066, 447801, 7984599, 5041851, 2733024, 4272310, 2524029, 7560293, 7791760, 5658663, 7991654, 4370799, 3264101, 6411492, 4976112, 2471521, 606635, 5897965, 1291437, 4374075, 4693067, 6551526, 2566106, 7564658, 8304978, 5766003, 3057545, 3557167, 559327, 6611804, 6473956, 6270029, 1478165, 7574026, 8122177, 8005961, 3184129, 6882752, 933227, 8245873, 6190415, 2027754, 3216766, 6806951, 835660, 8129354, 1861489, 4096193, 1238455, 7670979, 762879, 185135, 4680821, 5893022, 3220010, 8229022, 4045031, 4072110, 6693702, 6059839, 5381035, 7590539, 97574, 8194802, 49736, 6411776, 6409640, 5531343, 355885, 5453374, 4955492, 5853115, 4819192, 2653370, 3398700, 3061506, 5571809, 2379084, 5884486, 6254662, 1362666, 8308299, 1978282, 449217, 3020366, 7641244, 6805872, 1712259], +[3601708, 1994715, 7241695, 6829094, 5880280, 6560843, 7196209, 2401869, 8152980, 214553, 2673432, 5451308, 399926, 2011330, 7562730, 5079233, 2925733, 3174912, 3328379, 6740019, 7730307, 7161628, 6032272, 3100783, 3446394, 4875725, 108911, 8273002, 4416413, 7879767, 3553955, 7454951, 993064, 7307133, 2907518, 6040241, 2279431, 6874393, 6764189, 7249798, 3349815, 589720, 4581831, 7121860, 8010918, 1127888, 6557982, 2506266, 7285941, 7644821, 5600421, 5739867, 8310486, 1891023, 3951662, 5642047, 6950383, 2851922, 6068222, 6489472, 6789928, 6421432, 7213874, 4358981, 8240568, 5611936, 3288902, 2679347, 4901585, 8175885, 4543325, 7242096, 1648109, 3963145, 106460, 1354320, 5440525, 2030561, 7507826, 3890832, 1579421, 8259196, 6166691, 5375662, 4421256, 2067801, 6818147, 1158340, 6937941, 7440494, 4451668, 4880725, 7079745, 5809160, 6083203, 2637931, 2086, 7858550, 7999020, 5805350, 540099, 8174679, 2224986, 2051663, 4747334, 1962946, 3939689, 7113804, 5976736, 1739661, 899549, 4470963, 2110255, 5334579, 8152121, 5060715, 819385, 3971676, 7780412, 4953980, 839552, 7651423, 1149519, 6675888, 1681861, 5526789, 2527593, 4678796, 6484160, 6435191, 2840097, 5114589, 3968689, 1292601, 2193905, 3138113, 3510916, 6593313, 382748, 2638276, 4831607, 520664, 411293, 7864577, 3972692, 5958299, 5212908, 5392628, 3850844, 7649981, 2081119, 2028025, 2213167, 6904375, 1165860, 1302905, 6712478, 4417226, 6689060, 5105791, 2130981, 1951822, 4115427, 8371045, 3466713, 5634739, 5676818, 2681761, 2283829, 5763899, 5071196, 6564657, 4892674, 4081600, 2127310, 6714530, 3256318, 4902023, 3911117, 1779208, 400663, 3827454, 3992220, 2101359, 1506073, 7201125, 5417283, 2203803, 1262258, 4139778, 271047, 4367666, 2260375, 6080926, 5823981, 2556633, 3105432, 4791828, 2707050, 5958155, 3956308, 6571850, 5165587, 6425200, 3325748, 4825662, 4335842, 7887365, 629137, 7542913, 7453015, 4589811, 8283281, 3036367, 341702, 1505867, 7450041, 7390832, 2645941, 798216, 2384848, 3483028, 5424462, 7569725, 5178226, 7886996, 3542793, 7565015, 6481139, 2372983, 1361670, 7047947, 1362557, 660472, 2152899, 6904483, 3838188, 2482476, 5680270, 305637, 6048625, 2347105, 1152057, 8013717, 3060628, 1643826, 2535233, 4259430, 350377, 2444443, 6199556, 5131144, 4828476, 6495968, 1306105, 3155761], +[3918565, 5971241, 1764749, 5338358, 7441993, 5773952, 562790, 6160104, 23542, 944781, 4941628, 5549968, 265384, 7329394, 7277009, 694316, 4622898, 6191746, 5927354, 4701758, 9898, 2798613, 904240, 3592583, 4508025, 6424837, 7091428, 5809992, 6321607, 6294948, 1588464, 1767958, 2266526, 5066598, 628971, 1528704, 3988719, 7675621, 1924701, 956201, 5894487, 2202967, 3721426, 31576, 2296753, 7289878, 2654334, 3097573, 5849876, 7334873, 5787258, 4144285, 4635310, 685606, 3994332, 3133928, 7795521, 2341525, 4188412, 6988048, 7440887, 1888581, 5958595, 4682223, 493188, 6388696, 5161371, 7322606, 961411, 3335760, 7344158, 456305, 3132338, 805085, 6995013, 1779019, 7439219, 2654111, 3469301, 8289304, 2526903, 4056502, 1127740, 547309, 2251974, 6459039, 5192796, 2672142, 4123288, 3696083, 5178942, 217058, 3797925, 6344251, 1059981, 382460, 4562194, 1740332, 6303302, 6927475, 1248196, 5864828, 7647620, 7778894, 7329507, 1546238, 4120725, 3440344, 3896109, 4878183, 1901393, 7694957, 1457839, 2856499, 611040, 7902178, 5054629, 4289935, 7234474, 2048466, 105819, 1692072, 2959026, 6726637, 1418817, 5930067, 6081567, 4439374, 3446020, 1262056, 3279150, 1800391, 5777498, 3878162, 4428744, 179549, 7786437, 6389493, 870072, 5606518, 786622, 8015378, 7441545, 7219377, 5979660, 8060688, 3474734, 4856331, 2679898, 2834090, 4559070, 6116854, 4429284, 5949379, 3874383, 2424550, 3642093, 7653803, 6286715, 6098774, 698753, 7633276, 3185280, 2161997, 591713, 2021545, 755085, 649866, 1800676, 4899097, 4402762, 5443452, 1354860, 575710, 3393616, 8364316, 8361077, 4234546, 5741955, 7346402, 677564, 1302157, 2331467, 390808, 145557, 2806951, 4000148, 1347837, 472240, 5544948, 3369463, 2311339, 6885342, 5225310, 8192012, 990075, 5504802, 679594, 507874, 3147003, 1605285, 2016347, 4297712, 4516778, 4242052, 4660532, 6727803, 2141884, 5051360, 3057100, 2333068, 1993445, 7200243, 6475497, 3022085, 3666859, 848320, 3714868, 4586616, 3412026, 7519501, 6304544, 2766331, 7674588, 4728228, 2213779, 2181478, 6894996, 3700707, 4019940, 796095, 877920, 5496885, 7225827, 2126049, 7381438, 6832817, 5357018, 3411344, 4023104, 4405132, 3487865, 307767, 5686616, 6801866, 5452247, 4019848, 2197126, 6833383, 6797733, 2505526, 376757, 8059039, 7537424, 1570598, 2774082], +[5313805, 6822608, 8178325, 8034389, 3619975, 3670940, 2019863, 6550148, 3338996, 3894367, 3954028, 6345117, 5594869, 4486438, 7509837, 233303, 6112001, 7487466, 6054465, 2324758, 5118687, 6594390, 7418722, 471263, 3568574, 4561619, 2946107, 6993778, 2905263, 4126487, 7380271, 7937898, 7151324, 7950776, 5772581, 6979591, 2242764, 1889425, 3132571, 6695929, 5881206, 7562073, 1708107, 2452154, 2270707, 1014804, 4715276, 8154933, 6179635, 35768, 5470564, 6277, 2603976, 4626394, 182189, 2353100, 2864784, 6832482, 1939959, 39187, 1813889, 7079187, 5948543, 2876855, 4973083, 5401420, 6874509, 3229038, 1427112, 6264609, 3268939, 1687110, 83363, 5056097, 594655, 5400137, 2579969, 227825, 7344207, 6101056, 2782584, 5295431, 941043, 1399534, 8067032, 1089869, 4524627, 3009288, 299253, 6740780, 7306854, 1642220, 6590008, 6697552, 7917390, 5883032, 2615357, 97764, 6494361, 1438782, 5114663, 6292478, 280152, 5505944, 3388533, 7208824, 899489, 6658094, 4313967, 146484, 837014, 5698872, 4021318, 6773239, 7407583, 1404110, 6159646, 5825141, 7151249, 3713650, 1226736, 3127097, 7186887, 2173051, 2274377, 3226325, 1404888, 5423625, 3412216, 7810852, 944445, 2117817, 4473804, 4809851, 7658186, 4345369, 3644011, 238677, 8148623, 285020, 288146, 6700579, 8364128, 837471, 7084057, 7494910, 1793216, 7083452, 1648275, 7075901, 952969, 5023765, 2341214, 1935999, 6698159, 3352076, 593306, 4588916, 2225660, 7787512, 5801919, 121120, 1215148, 6519921, 5443459, 7847105, 1949394, 2641467, 2038364, 2095834, 7246308, 2102112, 5471439, 650334, 3295265, 1492593, 6734014, 2275086, 6041039, 1838152, 6893049, 6981554, 4288393, 3305466, 2803013, 3070142, 4301483, 7446775, 205654, 373023, 3407593, 2415327, 3570856, 8088841, 3771630, 6540484, 6380957, 4377683, 4008627, 7015929, 6683886, 4365240, 5277719, 2391502, 8379439, 6541023, 6547643, 4312595, 6721430, 5918142, 6332259, 64892, 7820318, 2585617, 8056638, 337412, 3080249, 8340895, 87239, 7074083, 7306537, 4129560, 6405060, 2023986, 2072428, 2889357, 5586547, 2765648, 6109333, 661627, 1912217, 4787080, 1753005, 6758217, 6835396, 1689453, 3341813, 1891417, 1989092, 4388218, 759619, 2452756, 5033847, 283431, 3783385, 6312271, 4540195, 7407893, 6815253, 1960079, 775825, 7384698, 528780, 320928, 7882984, 6442086], +[3558269, 3064545, 2536539, 2805485, 375953, 5108601, 3767194, 2161469, 7331407, 1787268, 623534, 8231484, 5203509, 1689160, 2422170, 6606545, 2030389, 5919526, 7307161, 466138, 1273813, 7327236, 186379, 2613136, 1788182, 6905676, 2078758, 184401, 6957156, 4346068, 2277856, 3887952, 7138746, 5677913, 7520643, 4727485, 3106842, 4740340, 3220910, 252650, 2938082, 2364823, 3396909, 2304607, 4507699, 5864867, 6215542, 5829195, 843714, 7789555, 1796582, 2391027, 714333, 7877918, 5745327, 6591453, 3281473, 1515008, 6916463, 62, 4303544, 4292481, 60268, 7941737, 7454982, 954237, 2420168, 3398549, 2787902, 6793894, 486470, 2356617, 5833546, 455166, 3801788, 2624646, 7983274, 4136223, 5849463, 2803846, 4623708, 1941782, 4032108, 350346, 2989170, 5295300, 4529997, 2332389, 7026766, 7086595, 1112353, 4503311, 2559076, 7392965, 7515957, 5032507, 7412182, 6351541, 3095208, 1200745, 7552729, 1126408, 4194346, 3998557, 209639, 331986, 5863698, 6583447, 2053286, 7848961, 7185068, 6683897, 1922171, 1533091, 439055, 5276802, 5568476, 104172, 3243166, 2029203, 3744605, 1488583, 6403256, 6489833, 3030370, 6888676, 4215839, 2141182, 7466347, 5272667, 1701983, 3893082, 8189825, 7798055, 8221606, 3519664, 1967881, 2053295, 38548, 1856047, 6819604, 5099061, 7135475, 83029, 4425764, 7793424, 1464499, 3603555, 824315, 112290, 3570167, 6297149, 997267, 4286260, 118184, 682768, 3833045, 7402206, 4302894, 7778932, 1509986, 1075214, 4309, 8089324, 4644856, 3312074, 5506995, 2157592, 7490873, 6982737, 5393612, 1566314, 6746469, 2515528, 2646930, 7339250, 1567709, 4643119, 4431063, 6925757, 582390, 7633636, 7446123, 6920390, 6339387, 7155054, 2326703, 5253143, 6002605, 4979960, 3602950, 3730409, 5634398, 323045, 2645199, 4904277, 179534, 3184357, 1972184, 6067731, 4007171, 2968924, 6655352, 8173534, 5330878, 3962795, 4820596, 2005378, 476017, 843332, 4265525, 2591730, 3364100, 7499411, 6606275, 8306732, 3575165, 4591531, 1840818, 5242527, 6466207, 625948, 2862251, 3803846, 5469627, 1632030, 558531, 6392861, 3229655, 2511183, 3390691, 3629089, 4530469, 402537, 6399754, 1792047, 4364122, 8126214, 5965718, 131287, 2694135, 5616886, 3160660, 4829126, 7561966, 8224386, 5847075, 3814198, 2289612, 138266, 2313612, 1207398, 7008730, 3052060, 1262727, 6184747]] +w = NTTInverse(aHat * NTT(y)): [[7176087, 2453101, 5436844, 1773792, 493702, 1886538, 7305009, 3449455, 764704, 787763, 5933737, 1006010, 6146373, 4926946, 7666382, 1234820, 2375419, 5648044, 4132594, 717266, 6470094, 5005570, 1965663, 3489637, 7833836, 6813616, 2661938, 2741072, 6700763, 1048459, 1945196, 665206, 5577744, 7815672, 2448359, 1675067, 2794452, 5109846, 768073, 7483535, 1574531, 1552938, 8160946, 7212069, 1884280, 3440988, 3632538, 345082, 2478239, 5934944, 2622312, 3687127, 1885569, 2679541, 7200289, 6478821, 1543852, 1482036, 4019148, 7342209, 8055406, 5970613, 7146141, 1281083, 5163093, 3670561, 629689, 1209455, 2324529, 797997, 7037088, 3133583, 6438700, 5524943, 4842146, 19437, 7823774, 6138299, 4151114, 7074923, 4771609, 5670916, 6515954, 1528361, 3500001, 8028303, 1158123, 4226485, 7046893, 7667994, 6723813, 1562456, 5528398, 5427140, 4456183, 5184947, 4072329, 1643984, 7088264, 2676550, 1396467, 7725634, 4014071, 5039271, 4478659, 3194992, 7792468, 5686508, 5519398, 6339694, 3630933, 1077624, 2637947, 7925664, 5094737, 1484727, 5624143, 2602333, 7873128, 4500854, 5072396, 1468171, 7377284, 3113000, 6994116, 2992110, 2391631, 7681205, 4950169, 6383294, 2739315, 8191179, 3419122, 3620572, 1143545, 4022400, 2795366, 6938193, 8319723, 1448750, 6115511, 5378533, 4332279, 1443284, 8315182, 4589887, 4748955, 6813117, 5123771, 4228504, 3910640, 4297274, 480403, 480382, 4159005, 6374306, 5030816, 4738855, 5558835, 1305591, 1670801, 2892743, 6139922, 7387772, 2503570, 5838861, 475350, 5695459, 4572301, 2632371, 3353925, 3937693, 858117, 4058667, 5172007, 7539807, 1230123, 3689545, 1840361, 47995, 152057, 3941989, 4480510, 1604200, 5674458, 2685694, 687831, 3606883, 993428, 2435498, 3497605, 2232102, 4375300, 1322056, 6783200, 318814, 4807389, 3366101, 6578095, 5547656, 3538625, 4693856, 3526402, 7908033, 5997190, 1462844, 3392868, 1041757, 3279496, 4714710, 7809, 1667026, 421907, 3515396, 3450901, 3248073, 7151944, 461200, 5214070, 2319016, 2233993, 8207799, 368889, 6465439, 4849080, 7204912, 2742594, 51758, 8029524, 2952314, 269834, 2255974, 7886895, 517529, 8331980, 5782392, 2065141, 5581895, 5495316, 5607784, 4771909, 3624870, 1216713, 7008424, 3057071, 2728274, 1210611, 5508004, 7142777, 6772707, 7498684, 2017129, 2420765, 677233, 2505831, 7198796], +[6377515, 3958736, 4607720, 1254925, 2363935, 5704429, 4135435, 4815556, 3206264, 5003461, 5213844, 6327296, 6078449, 1970178, 2848291, 226503, 7403749, 5980877, 2423655, 4532136, 463449, 6769279, 5101808, 1132450, 7682951, 3152443, 6977898, 284693, 6027908, 3168441, 3506979, 430361, 8284816, 3995412, 7135979, 3372648, 3790561, 2687358, 1824742, 585805, 1685190, 7892142, 3193055, 4053255, 976132, 5171258, 7406956, 3035861, 677208, 4143736, 956647, 4839238, 930729, 6193047, 7454134, 453512, 4169507, 3541439, 4596238, 178082, 6497432, 1995468, 482855, 4891607, 6273288, 5820776, 4761364, 4391310, 6642786, 8191496, 7019176, 3133610, 856128, 4002086, 6998071, 7169546, 115478, 6533104, 5931622, 7633618, 8206996, 4168140, 6830497, 4236540, 2767875, 2370790, 367334, 6578828, 6920584, 5643082, 315642, 5474798, 3939551, 2182409, 5508002, 1618509, 1613156, 4212699, 1050887, 1035992, 1878838, 3791486, 4350337, 4536824, 2472150, 458603, 2534079, 5690371, 4558128, 7395710, 6077322, 579251, 5053545, 5479280, 3891665, 51998, 6472664, 2396080, 3100661, 2662095, 877425, 7036058, 6511610, 4044433, 649814, 4305592, 1754691, 83045, 1559649, 2603889, 222869, 3183707, 5117223, 426830, 2652743, 2583326, 8260091, 2589805, 3375832, 2656264, 8000770, 5751891, 2282085, 3241533, 1353201, 3606605, 5891162, 3268271, 3373652, 6176612, 3978840, 860104, 6634859, 2086019, 6696882, 5402580, 7216430, 432304, 1080296, 8131409, 7675526, 6770989, 6067548, 2757478, 6759027, 7502529, 5138945, 998661, 7517548, 3111672, 6554503, 3582922, 2074795, 7158441, 4282844, 2763850, 8109464, 7391453, 3485872, 2831409, 5101932, 6798391, 8043402, 7149016, 6428394, 238246, 6321798, 6675654, 5490213, 1647602, 1841786, 5835129, 381555, 3728654, 2802517, 729474, 3206965, 7368197, 5223221, 5732234, 6377443, 419957, 5431252, 2975167, 1984155, 2297920, 4609864, 4325573, 4772137, 6373118, 3323922, 6560030, 1747007, 1580559, 263031, 1937519, 3233458, 4550761, 2209916, 1355684, 3521474, 7542169, 8271309, 1774375, 6158684, 5174610, 5436139, 2051628, 756046, 3968454, 5791599, 764164, 7955428, 3011535, 3574811, 3174409, 8058391, 968090, 184228, 4295777, 642131, 6993285, 6850467, 335434, 1667574, 3078127, 1666854, 5917978, 849710, 1334194, 813377, 6927512, 7783049, 4131608, 2552119, 7710802], +[282263, 1389765, 709183, 6136513, 1851211, 3570839, 1288402, 2498300, 1707845, 6987998, 4507974, 6245672, 5311409, 3558059, 1897591, 7637943, 7438234, 950822, 3849800, 6773437, 4262807, 5947579, 2478475, 5146894, 5289065, 4972547, 964686, 7445431, 3728859, 6563081, 6776978, 8304349, 899925, 3189889, 2952473, 232843, 2119889, 7203095, 6053978, 1605855, 1258392, 8216036, 6420995, 1833484, 4663562, 5654968, 5943830, 6818824, 7970535, 4900100, 6431613, 2393829, 7350070, 8109667, 7448650, 7573984, 3174055, 1624964, 781737, 5130191, 6291693, 3202208, 1963630, 3006212, 3290694, 2133002, 6993631, 5164189, 2735846, 1469986, 4954265, 6849429, 4899232, 3655875, 6361182, 2414026, 6061635, 1606191, 777499, 6440339, 5490841, 6621891, 1527671, 5401681, 3927852, 3708282, 5653730, 2587534, 2625259, 7079239, 5022565, 7166640, 3425073, 6061523, 737801, 4046193, 962522, 5918418, 5613878, 5970694, 2158525, 2188257, 6412161, 352457, 5003480, 7573204, 3071268, 1705624, 6443224, 5082912, 8160703, 6395479, 7612815, 313407, 1319495, 6303972, 2461728, 5233484, 5656266, 2430686, 2802599, 4081404, 6833779, 5347309, 4033063, 7715077, 8327641, 679277, 4065761, 6729446, 5662796, 7002807, 765693, 4904289, 4239108, 8181561, 2356172, 1208373, 3145942, 6854198, 4489910, 7659120, 4309437, 224111, 61490, 200749, 4790357, 6841087, 6811635, 1801444, 1814974, 8371955, 1916399, 1171915, 4271051, 178740, 6767398, 8059756, 3036776, 4802708, 2578426, 6670691, 6044490, 1292338, 7027463, 1788702, 5235813, 7370008, 495359, 3461442, 2492638, 2615729, 2822886, 5352688, 7392691, 5189971, 4755135, 2297201, 1123597, 709186, 6336535, 4907706, 8317748, 1626501, 493480, 1987279, 2716966, 3850857, 7929426, 823607, 1085890, 3723172, 4451368, 3745556, 3481156, 3204498, 1475634, 3180581, 5364750, 5468619, 7886262, 7846947, 6069330, 5854616, 3772634, 254975, 8199123, 5673367, 3452052, 6589640, 2733895, 3975158, 3806013, 3333090, 4539876, 6943304, 2261177, 3817733, 4452145, 476428, 1225274, 7239138, 1989125, 3482705, 8079831, 2742937, 3290721, 6812125, 293541, 2195356, 833600, 2465489, 4370990, 6908032, 6843618, 7176723, 5611574, 1032161, 4112196, 3493516, 3322601, 6422249, 4484605, 765289, 2204722, 3402790, 7250870, 7009320, 4175337, 402585, 1723875, 7731025, 4828924, 4371877, 1695224, 1940803], +[5875287, 6632421, 2890532, 7079728, 5304461, 6335027, 1521557, 6903226, 2033895, 739559, 7545997, 2208961, 3106698, 5907509, 7332867, 5171025, 1750982, 2372551, 1855645, 1057883, 4158850, 3930316, 3349187, 6790809, 5642959, 1632828, 2161428, 818833, 4698797, 501585, 2560105, 6726317, 2882979, 697071, 2100206, 6301205, 112743, 945770, 5818529, 3463043, 5266162, 2751596, 7136182, 318285, 7441441, 3901923, 5660833, 8089413, 2910244, 998927, 7614477, 2991084, 4075245, 171800, 195550, 4516930, 2211323, 4714769, 6469176, 1676113, 464321, 7447405, 7093915, 160127, 6404386, 5524355, 2342460, 5564022, 1200700, 3502461, 4511815, 625812, 3567187, 1428322, 5212307, 5875686, 4607563, 7639855, 4426071, 544974, 836215, 3134583, 1179854, 1236007, 5239635, 8194401, 1675163, 5789095, 4470949, 5040026, 2780624, 8239614, 2969036, 6992234, 2990258, 2522551, 5451240, 3984997, 60886, 6139183, 4459006, 4311577, 4760882, 1479177, 2272060, 3792713, 5690789, 6300667, 2198868, 8024944, 4622500, 195666, 3383997, 5709021, 5036274, 742858, 346659, 4893511, 8280630, 2625779, 3858733, 3797288, 7807815, 4767127, 83134, 5533123, 59272, 2593912, 3792245, 2710874, 1990765, 5831517, 152145, 4891471, 2525978, 837873, 4431013, 3539938, 3606861, 4042614, 992279, 7644228, 867087, 467601, 7842585, 5699266, 8214904, 6112450, 7249856, 116973, 2065561, 6881607, 7725578, 1858494, 4578002, 2581426, 1403458, 1346799, 4052915, 6042884, 6578509, 2464386, 7423731, 3418538, 1624680, 1841758, 2664368, 183573, 3962821, 7816009, 2446019, 6452774, 5854843, 7835015, 839790, 1229682, 7823812, 5458833, 1891723, 1938073, 5973536, 5508114, 5325164, 6045257, 6558552, 53996, 2345343, 3989507, 4711289, 7108192, 2446219, 4159458, 1183474, 35264, 2812862, 14846, 4324006, 3859727, 2096085, 4930909, 1482643, 5880719, 3527377, 3323983, 4583217, 3648018, 3654069, 4979168, 4123344, 1542152, 6449444, 2615632, 5953026, 1205702, 5910009, 6934356, 2299154, 6965014, 6877408, 4993085, 6144236, 5020160, 5606844, 268231, 3035297, 6656338, 1547531, 5086352, 8268611, 298404, 4411647, 7569412, 7123552, 3362985, 6122328, 4852737, 1266578, 5155740, 8180530, 6190975, 3045121, 2525104, 2252904, 1273587, 3743130, 53546, 4173548, 1026578, 3139916, 2132116, 3309956, 6242873, 4647202, 3259576, 6518298, 7334298], +[6661874, 418668, 1739485, 2853440, 5701355, 2208473, 1260024, 8333215, 1767406, 33103, 2786797, 3238808, 3724250, 1888342, 4565153, 5041520, 6600542, 3229968, 6968313, 4219596, 7340820, 6578268, 6016955, 2214049, 912213, 2282835, 1561761, 3648099, 7780218, 3377776, 7323979, 7456984, 3574212, 2205252, 1682988, 1488939, 7084873, 6632791, 4057469, 6261115, 5200090, 1502407, 5416109, 4004784, 2147191, 995228, 2545399, 3605031, 1617922, 6963812, 5269957, 1945925, 5230130, 4916142, 3928800, 6151980, 5525877, 7592713, 7895814, 5966463, 4104914, 6803559, 5408359, 5249108, 76066, 2995704, 451753, 2767103, 3726137, 5666105, 2290001, 2367140, 6842449, 6600967, 3788867, 5368637, 1234117, 1256343, 201840, 1074249, 507261, 2457613, 6014024, 117389, 3845080, 6240686, 8261055, 808060, 5477419, 2943632, 3829619, 4642745, 6501280, 3105866, 5559994, 931155, 328597, 6116052, 7752377, 2817218, 6710976, 2979545, 5889695, 7464494, 7971605, 1136386, 1358218, 5516145, 1022818, 7946598, 2793272, 1606731, 5649054, 5448360, 3435619, 4085643, 4397308, 5372992, 7270778, 5101506, 7531031, 3342870, 5909817, 6011810, 8212831, 4612082, 5370560, 7209563, 7658778, 6761641, 3003613, 2257511, 3019570, 6460280, 8200331, 3563076, 5252803, 4995245, 8210020, 3844880, 1158155, 3995384, 8227214, 787033, 8215365, 1627477, 5297977, 1187880, 2316633, 1569381, 1136040, 6750701, 334135, 4491860, 2239683, 4606187, 841337, 3684570, 5682745, 1410481, 4532455, 1238752, 2700494, 4336909, 2055979, 755257, 4792744, 6987910, 1424901, 4872184, 4037194, 1226260, 4766612, 2401893, 2027177, 3394235, 7652085, 8173831, 5817641, 2247881, 5158731, 4370046, 3537235, 6729646, 6240829, 1532792, 6690949, 7360963, 5263752, 2585052, 6187699, 4650736, 5654961, 2651488, 6904953, 3052903, 5097928, 3668232, 3417467, 5785059, 7806639, 634494, 5590426, 5777171, 2988007, 1808913, 8159836, 6412506, 3068567, 2634245, 5532616, 6122439, 1333717, 8264011, 6735866, 2048416, 3456794, 7683767, 6613642, 5196208, 7068567, 6320096, 2342140, 5008828, 4963417, 6839520, 3522657, 6928741, 7589762, 8295245, 1583773, 4233034, 5173292, 1434332, 7233094, 4150187, 2496848, 4088799, 2556107, 1653179, 3496936, 945800, 6894421, 1219054, 107967, 1595686, 6654027, 1892916, 3943011, 6500852, 4284810, 6860888, 3553895, 3777658, 3231224, 1621951], +[857445, 871618, 6472249, 6675283, 8161359, 4388115, 1704194, 2307391, 6863427, 5622255, 1146191, 250180, 880790, 4924912, 6283047, 4010770, 6841398, 8268097, 3805646, 4330563, 51961, 6082612, 1851032, 1609934, 3792730, 494544, 204471, 127992, 3558413, 4165858, 1335542, 1023303, 6331839, 2312851, 1190669, 826057, 448978, 7385698, 1985891, 2637921, 438417, 2859213, 6565950, 8173013, 2936538, 2933508, 6652005, 6198364, 1932225, 4142005, 8173930, 2820559, 5463914, 6854585, 5158443, 3313969, 2380477, 2005106, 6273920, 1847834, 5034534, 1553021, 7062390, 728814, 3487472, 3716198, 2668981, 3122880, 1568838, 2310641, 8354522, 6869259, 3664673, 145224, 6475282, 8076008, 588270, 2111630, 4472590, 6441994, 3160899, 5889429, 6518742, 8226449, 1713959, 4151238, 3259081, 7288531, 5293303, 2600706, 468825, 7598393, 2416518, 8248771, 4604332, 3078967, 7907375, 4057723, 4221117, 2649395, 668505, 3556842, 20862, 630087, 3987812, 7170626, 773032, 6537727, 7299358, 2121511, 2986090, 5005226, 2398431, 4767648, 901234, 5716713, 2781612, 3249264, 5681029, 6609866, 6781270, 4985807, 4310612, 6411386, 2695497, 4640263, 4868381, 6937539, 936772, 1693862, 3161698, 3929397, 4090036, 3471933, 5857005, 4612527, 5636321, 5536094, 1874394, 4776833, 2104835, 967126, 4132323, 3994956, 7587631, 3877694, 6790304, 2357593, 5107419, 781201, 4792739, 2192528, 455595, 5760663, 2434968, 7987233, 2289581, 1095464, 1943812, 6552879, 7854472, 4879915, 4467248, 3358609, 6026078, 5890453, 8066632, 4236922, 4182713, 966484, 5255267, 1576411, 4215775, 1921845, 3123789, 296862, 5628749, 6118279, 5216610, 7259005, 6498344, 1662899, 2915894, 1389776, 1828729, 7575774, 1708037, 3718103, 3662039, 7652845, 5603433, 7749290, 1166626, 5954997, 805739, 1678187, 1014585, 4688167, 2481287, 761240, 8177842, 3182138, 2414811, 8225196, 7080213, 2251882, 7201385, 1859024, 3509042, 336666, 4503412, 8281871, 6421984, 2294112, 7414833, 8571, 626249, 4656341, 872386, 6621926, 3120540, 4822259, 8129814, 3518472, 4607726, 47868, 3524739, 6894346, 7020948, 580843, 8086402, 8165096, 2684300, 3342028, 3817344, 670178, 6138986, 892443, 8336433, 7119514, 4104217, 1003818, 748618, 2534025, 565538, 692984, 276395, 7516959, 4651712, 1964401, 7060298, 4292819, 3909497, 1286170, 5921717, 4228798]] + +w1: [[14, 5, 10, 3, 1, 4, 14, 7, 1, 2, 11, 2, 12, 9, 15, 2, 5, 11, 8, 1, 12, 10, 4, 7, 15, 13, 5, 5, 13, 2, 4, 1, 11, 15, 5, 3, 5, 10, 1, 14, 3, 3, 0, 14, 4, 7, 7, 1, 5, 11, 5, 7, 4, 5, 14, 12, 3, 3, 8, 14, 15, 11, 14, 2, 10, 7, 1, 2, 4, 2, 13, 6, 12, 11, 9, 0, 15, 12, 8, 14, 9, 11, 12, 3, 7, 15, 2, 8, 13, 15, 13, 3, 11, 10, 9, 10, 8, 3, 14, 5, 3, 15, 8, 10, 9, 6, 15, 11, 11, 12, 7, 2, 5, 15, 10, 3, 11, 5, 15, 9, 10, 3, 14, 6, 13, 6, 5, 15, 9, 12, 5, 0, 7, 7, 2, 8, 5, 13, 0, 3, 12, 10, 8, 3, 0, 9, 9, 13, 10, 8, 7, 8, 1, 1, 8, 12, 10, 9, 11, 2, 3, 6, 12, 14, 5, 11, 1, 11, 9, 5, 6, 8, 2, 8, 10, 14, 2, 7, 4, 0, 0, 8, 9, 3, 11, 5, 1, 7, 2, 5, 7, 4, 8, 3, 13, 1, 9, 6, 13, 11, 7, 9, 7, 15, 11, 3, 6, 2, 6, 9, 0, 3, 1, 7, 7, 6, 14, 1, 10, 4, 4, 0, 1, 12, 9, 14, 5, 0, 15, 6, 1, 4, 15, 1, 0, 11, 4, 11, 10, 11, 9, 7, 2, 13, 6, 5, 2, 11, 14, 13, 14, 4, 5, 1, 5, 14], +[12, 8, 9, 2, 5, 11, 8, 9, 6, 10, 10, 12, 12, 4, 5, 0, 14, 11, 5, 9, 1, 13, 10, 2, 15, 6, 13, 1, 12, 6, 7, 1, 0, 8, 14, 6, 7, 5, 3, 1, 3, 15, 6, 8, 2, 10, 14, 6, 1, 8, 2, 9, 2, 12, 14, 1, 8, 7, 9, 0, 12, 4, 1, 9, 12, 11, 9, 8, 13, 0, 13, 6, 2, 8, 13, 14, 0, 12, 11, 15, 0, 8, 13, 8, 5, 5, 1, 13, 13, 11, 1, 10, 8, 4, 11, 3, 3, 8, 2, 2, 4, 7, 8, 9, 5, 1, 5, 11, 9, 14, 12, 1, 10, 10, 7, 0, 12, 5, 6, 5, 2, 13, 12, 8, 1, 8, 3, 0, 3, 5, 0, 6, 10, 1, 5, 5, 0, 5, 6, 5, 15, 11, 4, 6, 3, 7, 11, 6, 6, 12, 8, 2, 13, 4, 13, 10, 14, 1, 2, 0, 15, 13, 12, 5, 13, 14, 10, 2, 14, 6, 13, 7, 4, 14, 8, 5, 15, 14, 7, 5, 10, 13, 15, 14, 12, 0, 12, 13, 10, 3, 4, 11, 1, 7, 5, 1, 6, 14, 10, 11, 12, 1, 10, 6, 4, 4, 9, 8, 9, 12, 6, 13, 3, 3, 1, 4, 6, 9, 4, 3, 7, 14, 0, 3, 12, 10, 10, 4, 1, 8, 11, 1, 15, 6, 7, 6, 15, 2, 0, 8, 1, 13, 13, 1, 3, 6, 3, 11, 2, 3, 2, 13, 15, 8, 5, 15], +[1, 3, 1, 12, 4, 7, 2, 5, 3, 13, 9, 12, 10, 7, 4, 15, 14, 2, 7, 13, 8, 11, 5, 10, 10, 9, 2, 14, 7, 13, 13, 0, 2, 6, 6, 0, 4, 14, 12, 3, 2, 0, 12, 4, 9, 11, 11, 13, 15, 9, 12, 5, 14, 15, 14, 14, 6, 3, 1, 10, 12, 6, 4, 6, 6, 4, 13, 10, 5, 3, 9, 13, 9, 7, 12, 5, 12, 3, 1, 12, 10, 13, 3, 10, 7, 7, 11, 5, 5, 14, 10, 14, 7, 12, 1, 8, 2, 11, 11, 11, 4, 4, 12, 1, 10, 14, 6, 3, 12, 10, 0, 12, 15, 1, 3, 12, 5, 10, 11, 5, 5, 8, 13, 10, 8, 15, 0, 1, 8, 13, 11, 13, 1, 9, 8, 0, 4, 2, 6, 13, 9, 15, 8, 0, 0, 0, 9, 13, 13, 3, 3, 0, 4, 2, 8, 0, 13, 15, 6, 9, 5, 13, 12, 2, 13, 3, 10, 14, 1, 7, 5, 5, 5, 10, 14, 10, 9, 4, 2, 1, 12, 9, 0, 3, 1, 4, 5, 7, 15, 2, 2, 7, 8, 7, 7, 6, 3, 6, 10, 10, 15, 15, 12, 11, 7, 0, 0, 11, 7, 13, 5, 8, 7, 6, 9, 13, 4, 7, 9, 1, 2, 14, 4, 7, 15, 5, 6, 13, 1, 4, 2, 5, 8, 13, 13, 14, 11, 2, 8, 7, 6, 12, 9, 1, 4, 6, 14, 13, 8, 1, 3, 15, 9, 8, 3, 4], +[11, 13, 6, 14, 10, 12, 3, 13, 4, 1, 14, 4, 6, 11, 14, 10, 3, 5, 4, 2, 8, 8, 6, 13, 11, 3, 4, 2, 9, 1, 5, 13, 6, 1, 4, 12, 0, 2, 11, 7, 10, 5, 14, 1, 14, 7, 11, 15, 6, 2, 15, 6, 8, 0, 0, 9, 4, 9, 12, 3, 1, 14, 14, 0, 12, 11, 4, 11, 2, 7, 9, 1, 7, 3, 10, 11, 9, 15, 8, 1, 2, 6, 2, 2, 10, 0, 3, 11, 9, 10, 5, 0, 6, 13, 6, 5, 10, 8, 0, 12, 9, 8, 9, 3, 4, 7, 11, 12, 4, 15, 9, 0, 6, 11, 10, 1, 1, 9, 0, 5, 7, 7, 15, 9, 0, 11, 0, 5, 7, 5, 4, 11, 0, 9, 5, 2, 8, 7, 7, 8, 2, 15, 2, 1, 15, 11, 0, 12, 14, 0, 4, 13, 15, 4, 9, 5, 3, 3, 8, 12, 13, 5, 14, 7, 3, 4, 5, 0, 8, 15, 5, 12, 11, 15, 2, 2, 15, 10, 4, 4, 11, 11, 10, 12, 13, 0, 4, 8, 9, 14, 5, 8, 2, 0, 5, 0, 8, 7, 4, 9, 3, 11, 7, 6, 9, 7, 7, 10, 8, 3, 12, 5, 11, 2, 11, 13, 4, 13, 13, 10, 12, 10, 11, 1, 6, 13, 3, 10, 0, 1, 8, 14, 14, 6, 12, 9, 2, 10, 0, 12, 6, 5, 4, 2, 7, 0, 8, 2, 6, 4, 6, 12, 9, 6, 12, 14], +[13, 1, 3, 5, 11, 4, 2, 0, 3, 0, 5, 6, 7, 4, 9, 10, 13, 6, 13, 8, 14, 13, 11, 4, 2, 4, 3, 7, 15, 6, 14, 14, 7, 4, 3, 3, 14, 13, 8, 12, 10, 3, 10, 8, 4, 2, 5, 7, 3, 13, 10, 4, 10, 9, 8, 12, 11, 14, 15, 11, 8, 13, 10, 10, 0, 6, 1, 5, 7, 11, 4, 5, 13, 13, 7, 10, 2, 2, 0, 2, 1, 5, 11, 0, 7, 12, 0, 2, 10, 6, 7, 9, 12, 6, 11, 2, 1, 12, 15, 5, 13, 6, 11, 14, 15, 2, 3, 11, 2, 15, 5, 3, 11, 10, 7, 8, 8, 10, 14, 10, 14, 6, 11, 11, 0, 9, 10, 14, 15, 13, 6, 4, 6, 12, 0, 7, 10, 10, 0, 7, 2, 8, 0, 2, 0, 3, 10, 2, 4, 3, 2, 13, 1, 9, 4, 9, 2, 7, 11, 3, 9, 2, 5, 8, 4, 1, 9, 13, 3, 9, 8, 2, 9, 5, 4, 6, 15, 0, 11, 4, 10, 8, 7, 13, 12, 3, 13, 14, 10, 5, 12, 9, 11, 5, 13, 6, 10, 7, 7, 11, 15, 1, 11, 11, 6, 3, 0, 12, 6, 5, 11, 12, 3, 0, 13, 4, 7, 15, 13, 10, 13, 12, 4, 10, 9, 13, 7, 13, 14, 0, 3, 8, 10, 3, 14, 8, 5, 8, 5, 3, 7, 2, 13, 2, 0, 3, 13, 4, 8, 12, 8, 13, 7, 7, 6, 3], +[2, 2, 12, 13, 0, 8, 3, 4, 13, 11, 2, 0, 2, 9, 12, 8, 13, 0, 7, 8, 0, 12, 4, 3, 7, 1, 0, 0, 7, 8, 3, 2, 12, 4, 2, 2, 1, 14, 4, 5, 1, 5, 13, 0, 6, 6, 13, 12, 4, 8, 0, 5, 10, 13, 10, 6, 5, 4, 12, 4, 10, 3, 13, 1, 7, 7, 5, 6, 3, 4, 0, 13, 7, 0, 12, 15, 1, 4, 9, 12, 6, 11, 12, 0, 3, 8, 6, 14, 10, 5, 1, 15, 5, 0, 9, 6, 15, 8, 8, 5, 1, 7, 0, 1, 8, 14, 1, 12, 14, 4, 6, 10, 5, 9, 2, 11, 5, 6, 11, 13, 13, 10, 8, 12, 5, 9, 9, 13, 2, 3, 6, 8, 8, 7, 11, 9, 11, 11, 4, 9, 4, 2, 8, 8, 14, 7, 13, 5, 10, 1, 9, 4, 1, 11, 5, 15, 4, 2, 4, 13, 15, 9, 9, 6, 12, 11, 15, 8, 8, 2, 10, 3, 8, 4, 6, 1, 11, 12, 10, 14, 12, 3, 6, 3, 3, 14, 3, 7, 7, 15, 11, 15, 2, 11, 2, 3, 2, 9, 5, 1, 0, 6, 5, 0, 14, 4, 14, 4, 7, 1, 9, 0, 12, 4, 14, 0, 1, 9, 2, 13, 6, 9, 0, 7, 9, 0, 7, 13, 13, 1, 15, 0, 5, 6, 7, 1, 12, 2, 0, 14, 8, 2, 1, 5, 1, 1, 1, 14, 9, 4, 13, 8, 7, 2, 11, 8]] +w1Encode: 5E3A417E212B9C2FB518AC74DF552D14FB35A5E133E07417B57554CE33E8BF2E7A21246DBC09CFE8B93CF782FD3DABA9385EF3A869BFCB27F53A5B9F3A6E6DF5C9057782D530AC3890D98A8711C89A2B63ECB5B1598682EA720480395B715247381D69BD97F73B26963071671E4A04C1E9056F411FB0B4BA79D256B2DE4E15E58C29B598A6CA4C05BE95D12A6F1D6C17806E5713F386A26E8192C21E78094C91BC890D6D82EDC0FB808D55D1BDA1483B8322749815B5E91CAA075C56D28C810353601A555056BF64736BC6284DAD1E02DF5CED2A6E7DE458EF57DAEF0CDC3AB47115E6BA1C6A4489C9D633419634E730AC4A811B6F672F80D11D63B332D28FF531C17452D3C97AF42ED7B8A59AE2D70D6206E43C024CB9DB9F5CFEEE36A16C6446AD35D9795C3CC1DAA3775BE5EAC781B2BB441CEA36ACC01FC3A55B85ADF810D8DB910824D6F90800D93D032408FD96D52C3DEA7155A5AE49129C3041752F72786763AAFFBC07B0D78567D97419E2745FD64152D8ED2B78C61964DE18F38943DBE6CAD3144EB6AE532488D63B2419D516C4207B5A1E7EFB266F0890943CE10EBCB4721937BAF91862220AB3A905D6568AC0893974CBF409B61A9150779FB05057B490257887F212BFC00ED44F5933C85D7E4305F8C5FB22AF44BBCA0D84E98502057894B36779A7385C2BDBD4ADAC1BD6A310E86E9CA2C05624072846C669EC1D534B02036547A96D8DDE4B42736FEE4733DEC83A8A2475D34A9AC8EBBFD8AA6051B754DDA72220510BC7206A976C2BC15F6DEB2FB3F235AB87A8AE6EBB90EADF46C670AA708220302A34D29194723B298514D9932859640F4B8AD73CED5A9C5B6D7AB71FBB36C056CB034DF7ADCDA4D9D70E833A8E8535272D304DC8D8773622DC8043BD02928C0D87C034170087234C22E154510D66CD8450DA6A454C3A1D776543D007FC41C9B60C83E65AF105698F587110E8C14EA695B265DBADC895D93286789BBB9424887E5D1A49B1F524D49F69BC8F283A4816CBEA3C36E373F7FBB232921560054E4E17094C0E91D2967009D71D0F65172CE0285111E1498D278B + +cTilde: 10B3206713C7850609621506110EDE8FF646EF118B2C6CB23A36A0771122EFBAD5FAB4B2425B0A8FF4EEB0F85084F578 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +cHat: [3645810, 7764467, 4545647, 6700250, 5211569, 7064580, 136201, 3754197, 6978672, 6615361, 964808, 4351899, 5876446, 3300010, 5854002, 4246643, 5286352, 5246453, 8233698, 3716177, 7557141, 5586754, 5482020, 549156, 8117854, 7477472, 6859174, 4665935, 4056248, 2138621, 2731257, 7686667, 1978666, 2154318, 5993959, 2476593, 6821691, 3548550, 647676, 5453922, 5206739, 8060447, 7770684, 5961383, 5099293, 6633544, 5646002, 3557095, 3512742, 206086, 5864240, 3588624, 6770431, 1781556, 5083792, 5605476, 7493036, 7805388, 6780731, 2910179, 3555113, 3024175, 8329352, 4699641, 7819072, 1611894, 1934923, 371131, 3264437, 2434068, 5958269, 579961, 1058992, 2334850, 4534149, 5143224, 871204, 2880275, 1533377, 6365899, 5212163, 6565294, 4980877, 4249337, 52601, 4516756, 3041068, 2716556, 3951992, 3200041, 7452226, 15289, 1175782, 7536250, 3218686, 7571641, 8320733, 3981485, 2395934, 3484697, 897601, 7095301, 7856197, 3371788, 7046495, 4864491, 2124696, 2456667, 5341980, 4099087, 4137909, 6361915, 837104, 2525714, 7936321, 6265789, 5284994, 2625186, 8032175, 5079229, 6182535, 5757387, 8125949, 4334955, 494803, 6803551, 1215230, 2336054, 2364952, 1212032, 3420765, 1736177, 386786, 7096632, 6970127, 6411757, 5188045, 3323532, 1970554, 2197874, 1207488, 6424620, 1708146, 184320, 3511793, 6255970, 5770042, 1780920, 4024826, 4624911, 3914672, 7348532, 6377081, 958746, 2692441, 2676610, 2302812, 4526757, 2048022, 1370089, 7840855, 7517013, 2810239, 1839442, 7738712, 1833397, 5925135, 938506, 2841593, 5644478, 554666, 6333849, 2593908, 4923561, 3983588, 5245699, 2601236, 6060554, 6278809, 7532190, 1606630, 4245840, 7597062, 1410424, 913214, 3877251, 6691546, 6216983, 7053344, 6136777, 1580377, 7142821, 457513, 8000803, 765682, 3268699, 5064478, 785242, 6506218, 3284042, 335399, 7519479, 6028018, 6971447, 372257, 1948709, 4810373, 1023287, 1059412, 7013597, 2278332, 7432780, 6779669, 5793474, 5632093, 2925853, 1368737, 3794375, 1622649, 7088496, 2377873, 4157614, 3267565, 2929544, 4655990, 1459002, 820207, 449629, 2614533, 152508, 7382441, 3888558, 2711356, 6244788, 2383798, 6898506, 1858282, 2678309, 4281789, 281533, 3116115, 5702026, 6125206, 4295173, 6357843, 6629311, 6499532, 6878147, 8032386, 4063742, 6763354, 2758753, 5373537, 1627092, 5905120, 2155560] +cs1: [[8380398, 8380390, 8380415, 8380413, 8380377, 8380406, 8380384, 0, 40, 6, 8380408, 8380396, 8380402, 8380408, 8380402, 50, 8, 8380408, 8380400, 8380395, 8380407, 8380413, 8380411, 8380404, 8380407, 11, 8, 5, 1, 8380404, 8380393, 8380399, 15, 8380414, 26, 8380393, 8380414, 0, 3, 9, 20, 16, 8380415, 8380383, 8380412, 8380396, 20, 2, 8380412, 8380395, 8380407, 22, 8380413, 4, 14, 20, 8380403, 8380411, 21, 8380405, 9, 34, 11, 8380408, 8380392, 8380406, 5, 8380393, 8380393, 11, 8380399, 10, 12, 8, 10, 8380402, 8380398, 8380404, 8380396, 27, 10, 24, 1, 7, 2, 8380416, 8380401, 8380403, 3, 18, 8380384, 8380403, 8380400, 45, 8380413, 8380405, 17, 1, 6, 8380414, 8380409, 8380414, 8380409, 36, 8380382, 3, 5, 7, 22, 8380414, 10, 3, 4, 8380395, 8380406, 8380403, 18, 8380408, 8380412, 41, 29, 7, 2, 14, 25, 8380397, 1, 10, 2, 7, 8380411, 7, 0, 33, 19, 8380395, 8380408, 8380416, 17, 7, 7, 5, 8380389, 8380408, 29, 10, 45, 11, 8, 8380391, 8380394, 8380402, 5, 8380406, 14, 31, 22, 19, 8380400, 8380377, 7, 2, 16, 8380410, 6, 10, 6, 8380401, 3, 2, 7, 8380414, 8380398, 8380407, 8380394, 8380393, 8380403, 8380412, 21, 17, 12, 8380405, 8380405, 14, 6, 10, 8380385, 2, 8380415, 8380378, 8380384, 8380414, 13, 3, 32, 35, 8380415, 8380414, 8380408, 8380385, 21, 5, 8380410, 8380397, 8380384, 19, 1, 2, 8380398, 8380403, 8380406, 8380416, 8380414, 2, 2, 31, 8380397, 8380412, 8380411, 30, 33, 8380395, 9, 7, 8380407, 8380390, 8380383, 8, 14, 2, 3, 8380392, 1, 8380392, 8380407, 0, 8380376, 5, 21, 24, 15, 4, 27, 10, 12, 8380415, 8380408, 22, 17, 8380379, 8380385, 8380410, 10, 8380385, 8380375, 27], +[7, 8380401, 18, 8380411, 16, 10, 8380395, 8380392, 2, 32, 27, 8380385, 6, 14, 6, 13, 9, 3, 8380404, 16, 0, 6, 56, 17, 10, 8380403, 14, 8380413, 8380402, 9, 23, 8, 32, 8380413, 8380405, 9, 8380407, 17, 8380379, 8380389, 8380412, 8380412, 5, 36, 8380402, 8, 8, 21, 8380387, 8380411, 8380410, 49, 2, 8380395, 8380405, 4, 4, 8380413, 10, 34, 8380386, 8380393, 15, 7, 8380386, 8380397, 8380402, 8380410, 21, 18, 28, 4, 8380387, 8, 8380414, 17, 10, 8380415, 2, 8380411, 3, 8380396, 22, 10, 4, 8380411, 11, 15, 4, 20, 12, 8380356, 18, 8380407, 23, 10, 9, 16, 15, 8380395, 8380411, 8380376, 8380408, 8380415, 24, 2, 8380416, 8380388, 5, 8380408, 1, 8380397, 8380413, 8380415, 8380415, 8380406, 12, 3, 8380413, 8380412, 8380393, 13, 4, 8380406, 8380404, 8380408, 8380401, 8380414, 8380408, 1, 21, 35, 8380397, 8380392, 9, 8380409, 8380407, 8380404, 8380415, 8380407, 8380406, 43, 5, 11, 16, 8380411, 2, 8380407, 8380396, 18, 2, 19, 8380384, 8380384, 8380396, 8380414, 8380409, 19, 17, 8380415, 8380385, 8380412, 11, 8380416, 8380400, 8380398, 8380414, 8380406, 16, 3, 9, 8380403, 8380402, 13, 8380406, 8380410, 3, 8380408, 1, 8380391, 8380416, 8380406, 8380409, 8380409, 8380415, 8380411, 37, 8380398, 19, 5, 1, 22, 8380403, 8380385, 17, 8380401, 8380404, 8380390, 8380413, 17, 8380401, 23, 9, 8380403, 18, 7, 8380416, 8380398, 8380403, 5, 8380414, 8380406, 8380390, 25, 8380414, 8380406, 11, 8380414, 8380397, 8380406, 1, 12, 21, 8380402, 8380389, 8380399, 8380407, 8380401, 8380401, 8380413, 0, 8380401, 3, 16, 14, 8380414, 8380410, 25, 10, 8380413, 2, 8380404, 8380408, 5, 8380416, 19, 8380406, 12, 13, 16, 3, 8380415, 10, 8380386, 8380376, 13], +[37, 23, 8380400, 0, 18, 12, 9, 8380403, 14, 8380414, 8380397, 8380414, 8380414, 8, 8380414, 8380390, 1, 8380402, 4, 30, 8380396, 11, 13, 20, 19, 16, 42, 1, 4, 8380412, 4, 8380398, 8, 8380415, 8380365, 8380404, 8380370, 8380400, 8380401, 8380415, 42, 6, 26, 14, 8380415, 18, 1, 28, 1, 8380402, 3, 8380401, 5, 8380406, 15, 8380413, 8380407, 7, 22, 8380412, 8380400, 8380402, 8380416, 8380395, 11, 32, 16, 10, 8380409, 19, 2, 8380413, 5, 3, 8380414, 20, 8380416, 8380397, 6, 8380407, 8380405, 8380375, 8380396, 8380409, 8380405, 34, 24, 28, 8380404, 8380403, 0, 8380407, 1, 8380402, 8380401, 5, 8380413, 8380401, 20, 2, 11, 8380376, 8380404, 34, 26, 8380408, 8380402, 8380395, 8380409, 8380413, 8380411, 10, 20, 27, 47, 40, 1, 24, 8380410, 1, 1, 11, 8380416, 8380410, 8380414, 8380399, 8380411, 3, 9, 8380401, 1, 1, 8380410, 8380410, 13, 8380408, 8380404, 9, 8380388, 25, 31, 16, 7, 8380374, 8380407, 15, 8380404, 35, 8380391, 8380383, 5, 0, 7, 8380405, 8380369, 8380389, 8380405, 20, 13, 24, 24, 16, 8380380, 8380407, 6, 8380408, 8380411, 8380400, 0, 11, 8380395, 8380413, 8380409, 8380410, 15, 9, 48, 11, 24, 8380390, 2, 8380415, 27, 11, 6, 21, 16, 8380393, 8380398, 8380398, 6, 1, 8380404, 8, 8380407, 8380377, 8380394, 10, 8, 15, 8380396, 8380393, 8380404, 8380408, 17, 8380392, 17, 9, 9, 8380400, 8380407, 8380407, 8380400, 8380409, 8380416, 8380410, 8380414, 8380392, 8380397, 8380410, 8380403, 31, 22, 12, 17, 8380403, 6, 8380400, 8380403, 38, 15, 2, 6, 3, 8380399, 8380397, 8380393, 8380397, 8380412, 11, 19, 4, 8380386, 14, 8380414, 39, 39, 8380400, 16, 8380403, 8380409, 17, 8380414, 4, 8380410, 8380395], +[8380394, 11, 2, 8380413, 8380390, 8380377, 8380401, 8380414, 11, 8380404, 7, 7, 14, 39, 20, 7, 8380393, 8380392, 14, 8380385, 0, 25, 13, 8380392, 3, 8380408, 8380410, 3, 0, 8, 5, 17, 12, 8380400, 1, 20, 22, 2, 8380414, 21, 7, 8380398, 6, 8380411, 8380401, 8380398, 8380415, 8380408, 8380416, 29, 26, 6, 8380397, 8380405, 8380416, 8380408, 7, 8380399, 3, 1, 29, 8380416, 2, 8380398, 8380392, 8380409, 8380381, 3, 8380396, 8380414, 8380412, 8380414, 9, 11, 6, 30, 0, 4, 8380407, 8380409, 8380391, 8, 8380409, 8380409, 8380375, 25, 8380412, 18, 8380411, 8380400, 8380397, 8380388, 8380396, 28, 5, 38, 19, 34, 21, 0, 8380416, 14, 8380411, 9, 7, 0, 0, 3, 3, 4, 8380414, 12, 7, 8380415, 5, 0, 8380415, 5, 21, 24, 8380390, 0, 2, 17, 31, 14, 0, 8380399, 8380384, 8380399, 8380400, 8380398, 17, 21, 16, 8380409, 18, 7, 8380386, 5, 14, 11, 16, 8380391, 18, 8380369, 8380412, 25, 8380405, 8380412, 8380385, 1, 8380410, 8380407, 16, 16, 8380398, 8380402, 9, 17, 24, 10, 8380416, 8380415, 16, 8380401, 8380407, 8380403, 12, 8380412, 5, 12, 12, 10, 8380408, 8380413, 8380409, 14, 8380406, 34, 5, 8380408, 8380413, 6, 28, 10, 3, 33, 8380408, 0, 8380411, 8380416, 8380386, 8380386, 8380400, 8380404, 13, 19, 22, 31, 6, 19, 13, 8380398, 4, 5, 0, 8380406, 5, 8, 8380404, 8380396, 7, 12, 5, 22, 14, 8380383, 5, 32, 8, 8380399, 8380397, 8380415, 11, 9, 10, 10, 8380391, 10, 1, 0, 8380416, 16, 8380408, 8380407, 31, 31, 8380407, 8380413, 16, 8, 8380407, 29, 19, 8380397, 8, 31, 22, 8380376, 8380401, 21, 8380416, 8380377, 0, 8380395], +[22, 8380408, 11, 8380397, 8380416, 8380393, 8380400, 8380388, 24, 1, 26, 8380399, 8380380, 10, 4, 8380405, 8380397, 8380388, 14, 22, 4, 8380409, 9, 27, 8380411, 8380402, 8380396, 16, 8380408, 2, 8380416, 8380415, 16, 34, 8380370, 18, 8380405, 24, 8380407, 16, 8380373, 2, 8380411, 8380416, 6, 8380404, 35, 20, 8380386, 8380401, 15, 8380410, 1, 8380413, 8380412, 21, 25, 8380404, 3, 8380396, 0, 8380407, 0, 8380411, 8, 8380411, 12, 8380405, 8380404, 17, 8380416, 8380405, 16, 8380393, 19, 8380404, 8380409, 8380394, 8380391, 8380411, 30, 27, 13, 8380415, 7, 8380401, 5, 8380404, 16, 21, 8380397, 8380416, 32, 8380415, 8380411, 8380386, 12, 8380406, 4, 8380392, 10, 18, 8380407, 12, 8380415, 28, 10, 8380388, 16, 1, 8380413, 14, 1, 23, 7, 3, 8380400, 5, 16, 11, 8380410, 1, 8380389, 8380405, 8380399, 18, 26, 29, 47, 8380399, 7, 7, 8380405, 2, 4, 8380402, 8380415, 8380389, 8380410, 8380402, 8380390, 9, 8380416, 8380395, 4, 17, 11, 14, 6, 5, 2, 19, 8380414, 27, 8380395, 8380397, 8380413, 8380393, 8380416, 17, 8380395, 5, 8380412, 7, 21, 14, 15, 6, 8380416, 20, 8380411, 8380415, 8380402, 7, 8380405, 12, 11, 1, 16, 8380393, 8380396, 8380398, 8380408, 9, 12, 0, 8380414, 25, 8380409, 24, 26, 11, 35, 0, 8380393, 9, 3, 15, 15, 17, 27, 8, 8380388, 8380389, 2, 8380413, 4, 3, 8380413, 9, 8, 8380392, 36, 8380399, 8380407, 4, 8380405, 17, 8380401, 6, 18, 8380399, 22, 21, 28, 38, 8380394, 8380416, 8380399, 32, 4, 8380399, 0, 8380400, 8380410, 17, 8380412, 38, 8380384, 13, 8380398, 8380393, 8380411, 23, 13, 11, 9, 33, 8380407, 6, 8380398, 26, 8, 6, 5, 8380395]] +cs2: [[8380391, 8380400, 8380408, 7, 8380383, 14, 3, 0, 0, 8380412, 3, 8, 5, 8380403, 8380403, 0, 8380412, 4, 8380413, 8380400, 12, 0, 8380386, 7, 1, 8380404, 13, 8380387, 23, 10, 8380400, 8380411, 8380413, 19, 14, 8380412, 11, 7, 8380404, 8380384, 8380390, 8380395, 8380398, 15, 18, 8380396, 8380405, 8380405, 25, 8380414, 8380408, 16, 9, 8, 8380403, 6, 8380415, 17, 8380402, 8380393, 8380410, 8, 8380399, 8380411, 8380416, 12, 8380406, 8380396, 13, 12, 8380382, 12, 20, 8380404, 8380405, 8380412, 8380390, 8380406, 8380406, 8380397, 8380415, 12, 24, 8380408, 8380401, 13, 8380378, 8380379, 8380413, 30, 13, 8380412, 16, 0, 21, 8380408, 15, 8380412, 8380402, 8380384, 18, 7, 18, 8, 8380395, 10, 8380410, 15, 15, 8380402, 8380410, 7, 24, 8380412, 8380413, 3, 8380400, 17, 8, 8380404, 14, 18, 8380399, 8380406, 8380411, 7, 8380403, 10, 28, 23, 2, 2, 18, 8380391, 8380379, 8380412, 10, 24, 19, 21, 8380390, 8380391, 8380395, 23, 26, 31, 8380405, 8380385, 8380385, 12, 8380408, 8380412, 2, 8380401, 8380416, 10, 7, 22, 8380368, 8380373, 8380412, 8380405, 23, 7, 8380413, 8, 8, 1, 8380403, 15, 8380400, 8380408, 8380408, 8380386, 18, 12, 8380412, 32, 8380410, 1, 3, 8380403, 2, 8380395, 24, 8380395, 8380413, 8380408, 8380405, 0, 8380411, 24, 8380414, 8380410, 26, 8380415, 8380414, 8380396, 8380412, 4, 5, 9, 0, 22, 8380392, 8380406, 19, 1, 8380404, 11, 8380407, 24, 8380413, 8380416, 8380407, 8380414, 8380402, 33, 12, 15, 8380391, 8380399, 8380405, 24, 16, 8380409, 4, 12, 2, 8380407, 8380392, 24, 8380416, 1, 2, 8380411, 11, 8380409, 32, 16, 15, 12, 8380404, 8380404, 8380395, 8380391, 8380403, 8380405, 20, 30, 11, 6, 1, 8380396, 0, 23], +[8380407, 8380407, 11, 27, 16, 8380410, 8380402, 8380397, 13, 1, 9, 2, 21, 8380393, 5, 8380411, 21, 8380416, 8380415, 11, 8380415, 8380413, 0, 8380373, 5, 39, 35, 26, 8380398, 8380399, 1, 10, 8380414, 8380411, 8380402, 10, 8380408, 21, 5, 38, 15, 12, 10, 1, 8380391, 7, 9, 8380413, 8380403, 0, 8380401, 8380391, 8380399, 36, 8380404, 7, 8380411, 8380412, 8380401, 8380394, 9, 8380403, 8380390, 4, 3, 20, 8380403, 4, 6, 8380408, 5, 9, 12, 8, 8380408, 8380415, 8380396, 7, 8380391, 8380396, 8380386, 8380380, 8380398, 0, 42, 20, 8380392, 8380414, 8380402, 15, 8380405, 7, 13, 3, 10, 0, 4, 8380400, 8380410, 0, 8380395, 8, 30, 10, 8380370, 8380391, 8380411, 8380403, 8380389, 26, 1, 8380398, 8380385, 8380408, 12, 8380408, 17, 13, 8380400, 25, 8380388, 8380403, 12, 8380397, 8380406, 8380395, 3, 8380372, 8380359, 4, 8380416, 14, 8380413, 8380415, 8380401, 8380371, 8380402, 15, 3, 8380388, 8380391, 8380409, 8380405, 24, 8380406, 20, 0, 7, 22, 8380402, 8380407, 8380410, 0, 8380399, 8380366, 14, 44, 13, 2, 8380416, 8380411, 8380374, 2, 8380410, 7, 8380403, 8380400, 5, 8380406, 11, 8380407, 2, 8380405, 8380413, 8380401, 11, 8380408, 10, 0, 33, 11, 3, 8380393, 8380411, 5, 8380399, 8380398, 8380389, 5, 14, 8380416, 16, 8380393, 8380404, 19, 8380415, 8380405, 8380398, 8380384, 8380391, 8380379, 24, 25, 8380390, 8380412, 8, 25, 8380406, 6, 8, 8380407, 8380395, 8380407, 8380415, 8380409, 8380388, 8380410, 8, 26, 11, 32, 8380401, 8380409, 8380396, 0, 5, 10, 8380403, 24, 8380411, 33, 8380413, 0, 3, 8380398, 8380415, 8380395, 6, 46, 8380384, 10, 8380414, 28, 16, 8380396, 6, 8380411, 5, 15, 8380389, 1, 14, 11, 35, 8380410, 24], +[8380397, 8380412, 35, 2, 10, 23, 16, 8380409, 10, 7, 8380413, 8380409, 25, 30, 8380387, 5, 8380408, 8380415, 8380392, 8380401, 2, 8380394, 8380399, 15, 2, 8380403, 8380398, 9, 8380399, 16, 3, 14, 1, 8380416, 8380400, 22, 25, 19, 8380406, 8380415, 30, 11, 32, 12, 8380404, 8380393, 8380385, 8380386, 1, 4, 8380414, 8380394, 11, 8380414, 12, 11, 8380409, 6, 13, 14, 8380406, 8380410, 14, 29, 8, 8380402, 9, 8380399, 8380391, 19, 8380412, 8380400, 8380401, 8380412, 18, 8380398, 20, 31, 8380369, 8, 16, 20, 2, 8380411, 8380390, 8380397, 8380405, 9, 4, 8380405, 2, 8380403, 8380398, 3, 5, 8380410, 21, 24, 8380380, 29, 8380394, 10, 8380387, 8380415, 50, 8380414, 6, 8380411, 8380390, 10, 8380397, 36, 8380412, 19, 8380416, 8380406, 13, 8380410, 23, 29, 0, 20, 15, 3, 32, 8380411, 2, 8380409, 8380415, 8380401, 13, 8380398, 8380412, 8380392, 2, 27, 44, 17, 5, 8380396, 8380412, 11, 8380416, 9, 9, 3, 2, 11, 17, 14, 0, 8380402, 8380397, 1, 8380407, 15, 1, 8380399, 8380416, 8380370, 19, 8380413, 8380402, 2, 8, 12, 8380402, 11, 8, 8380416, 5, 1, 2, 8380412, 8380407, 8380412, 1, 11, 27, 29, 8380409, 11, 8380405, 21, 8380389, 8380383, 9, 8380381, 2, 8380388, 20, 7, 9, 37, 5, 11, 7, 8380406, 10, 8380395, 18, 8380408, 19, 14, 2, 8380392, 36, 8380398, 28, 24, 23, 14, 8380413, 8380385, 20, 8380373, 21, 14, 6, 13, 8380400, 8380414, 39, 8380408, 2, 9, 8380400, 1, 54, 8380412, 31, 8380400, 22, 8380407, 8380382, 29, 3, 8380386, 8380407, 24, 34, 8380395, 30, 8380397, 8380400, 8380411, 8380399, 13, 8380400, 4, 17, 8380384, 31, 6, 8380416, 30], +[8380397, 8380412, 1, 8380412, 8380394, 9, 8380407, 2, 3, 8380413, 25, 8380405, 11, 8380403, 8380405, 2, 17, 5, 13, 15, 29, 0, 8, 8380415, 8380414, 2, 8380399, 8380389, 14, 8380411, 8380413, 8380397, 8380403, 8380390, 5, 32, 6, 8, 8380402, 8380406, 8380408, 8380387, 5, 18, 46, 8380403, 8380411, 8380413, 21, 2, 8380403, 14, 14, 16, 8380407, 8380414, 10, 8380407, 5, 8380402, 8380393, 8380404, 3, 35, 23, 8380413, 8380408, 8380406, 8380414, 8380408, 8380405, 19, 2, 8380399, 8380401, 13, 21, 9, 8380411, 8380409, 8380416, 8380382, 16, 5, 8380410, 27, 8380402, 8380397, 8380403, 8, 16, 0, 15, 1, 3, 9, 18, 8380405, 10, 8380404, 7, 8380403, 27, 11, 8380408, 0, 8380382, 14, 8380415, 0, 36, 8380382, 8380411, 8380416, 5, 8380404, 8380407, 8380413, 6, 9, 28, 21, 19, 20, 4, 4, 33, 20, 19, 8380398, 1, 8380398, 8380393, 8380415, 25, 8380410, 8380409, 8, 8380414, 8380389, 4, 8380412, 8380399, 8380413, 24, 3, 8380399, 8380404, 7, 10, 29, 13, 31, 6, 13, 8380400, 7, 17, 25, 27, 8380391, 8380397, 8380392, 8380408, 8380416, 8380405, 23, 19, 8380412, 8380398, 8380403, 38, 8380411, 8380416, 2, 18, 11, 8380402, 8380392, 8380416, 7, 8380415, 1, 34, 21, 12, 22, 17, 8380379, 14, 12, 29, 8380413, 8380414, 28, 8380404, 8380408, 33, 9, 31, 8380406, 8380413, 8380396, 9, 8380405, 8380407, 37, 8380399, 15, 10, 19, 22, 8380398, 20, 32, 8380386, 7, 8380398, 9, 8380405, 8380415, 12, 36, 8380411, 22, 29, 8380415, 8380412, 28, 8380398, 8380404, 11, 22, 8380407, 8380398, 8380414, 8380414, 8380398, 18, 8380397, 8380410, 12, 8380414, 8380401, 8380402, 8380397, 8380377, 8380391, 8, 40, 5, 0, 0, 8380388, 8380410, 39], +[19, 8380416, 17, 19, 12, 22, 8380409, 8380395, 6, 8380409, 8380408, 8380397, 1, 20, 31, 1, 25, 16, 1, 8380394, 1, 18, 8380409, 8380416, 8380405, 1, 3, 8380415, 17, 1, 8380394, 0, 8380411, 26, 23, 8380407, 1, 5, 17, 12, 14, 19, 8380407, 8380401, 8380388, 10, 8380414, 17, 13, 1, 7, 8380403, 7, 8380402, 8380383, 8380396, 8380400, 8, 15, 18, 1, 8, 31, 41, 5, 1, 37, 8380415, 8380373, 4, 8380406, 1, 13, 8380413, 0, 6, 22, 17, 8, 10, 13, 14, 8380406, 8, 8380407, 25, 26, 8380414, 11, 3, 8380414, 8380398, 8380382, 8380400, 10, 18, 8380404, 10, 4, 14, 2, 2, 8380405, 6, 8380403, 13, 8380390, 8380392, 8380405, 29, 8380404, 12, 8380409, 27, 8380412, 8380382, 8380399, 8380382, 8380411, 13, 9, 8380414, 8380415, 6, 8380388, 23, 48, 11, 16, 8380409, 8380416, 8380396, 8380405, 8380406, 0, 21, 8380389, 15, 23, 8380412, 10, 8380412, 23, 7, 9, 36, 0, 9, 5, 8380407, 8380402, 9, 6, 8380406, 8380400, 8380412, 8380408, 14, 11, 8380402, 8380405, 15, 2, 10, 8380413, 8380393, 8380414, 8380396, 10, 8380396, 2, 36, 8380402, 30, 8380407, 8380400, 8380406, 8380372, 8380399, 8380408, 21, 29, 8380378, 8380415, 8380413, 8380408, 16, 3, 7, 8380415, 8380391, 8380415, 2, 8380405, 8380409, 8380408, 23, 6, 18, 29, 8380415, 18, 8380409, 10, 20, 11, 21, 8380412, 8380397, 18, 8380404, 13, 18, 8380414, 21, 8380416, 8380386, 23, 8380389, 8380400, 12, 8380414, 8380391, 8380399, 8380416, 46, 8380414, 8380394, 8380405, 15, 9, 8380398, 12, 8380404, 3, 8380393, 8380388, 19, 8380400, 6, 8380393, 8, 3, 5, 4, 5, 2, 7, 8380397, 14, 2, 8380391, 15, 4, 8380407, 8380391], +[4, 17, 0, 8380391, 8380365, 3, 29, 19, 55, 17, 19, 6, 18, 0, 5, 8380393, 2, 8380414, 0, 13, 8380412, 11, 10, 8380400, 24, 18, 8380413, 8380408, 8380414, 8380400, 6, 8380396, 8380411, 8380403, 8380415, 7, 17, 8380413, 12, 8380408, 1, 8380413, 11, 0, 8380397, 8380401, 8380403, 21, 5, 4, 8380409, 3, 8380393, 8380372, 8380406, 45, 14, 29, 11, 35, 27, 3, 8380416, 8380401, 2, 2, 8380409, 8380413, 8, 46, 5, 2, 8380413, 6, 13, 8380402, 8380405, 8380411, 9, 22, 20, 8380415, 8380411, 8380390, 8380411, 8380385, 14, 19, 1, 8, 8380400, 8380378, 8380399, 8380403, 23, 8380380, 8380411, 8380407, 8380391, 8380411, 8, 9, 3, 19, 12, 12, 26, 8, 8380402, 8380391, 8380412, 14, 16, 2, 8380410, 8380392, 8380410, 8380410, 8380402, 45, 8380406, 8380404, 8380394, 8380403, 11, 13, 12, 5, 8380401, 14, 8380411, 36, 32, 10, 22, 8380411, 9, 8380416, 8380374, 8380388, 8380381, 16, 26, 8380411, 8380397, 8380387, 8380397, 8380403, 8380416, 7, 8380415, 8380408, 8380400, 7, 15, 8380405, 8380412, 8380399, 8380388, 8380404, 13, 31, 11, 8380396, 1, 8380415, 8380411, 8380404, 2, 8380399, 8380377, 8380398, 6, 49, 10, 8380409, 17, 8380384, 15, 8380397, 11, 16, 8380414, 8380399, 8380399, 8380407, 9, 42, 20, 8380415, 8380404, 8380411, 8380409, 2, 12, 29, 8380385, 0, 0, 8380392, 8380405, 8380402, 0, 8, 8380393, 25, 8380412, 7, 8380409, 8380396, 11, 5, 8380381, 8380408, 22, 21, 8380369, 8380411, 8380416, 8380401, 8380412, 8380384, 17, 3, 10, 10, 8380414, 18, 13, 9, 8380413, 8380401, 11, 10, 2, 8380409, 10, 37, 8380394, 8380412, 8380409, 8380411, 2, 8380400, 8380392, 8380410, 6, 12, 6, 8380404, 8380405, 8380394, 8380409, 2, 8380411, 9]] +z: [[8178739, 229713, 8091186, 503270, 84776, 517873, 16134, 90087, 8270557, 112955, 202959, 8262880, 8155921, 279087, 8091641, 8293534, 204509, 292276, 8068153, 520423, 439696, 218623, 8344963, 265145, 467151, 8289254, 368903, 37971, 223047, 320827, 164412, 7892315, 183259, 469939, 311491, 7931581, 8347347, 8195584, 8032384, 8166552, 167561, 8122927, 331598, 72556, 227096, 7868173, 521115, 278089, 138471, 317062, 217391, 8269012, 234825, 8229044, 8225523, 8037585, 467418, 96850, 7925183, 7870804, 8155245, 8237398, 460660, 8030567, 7960414, 7942830, 7975932, 251338, 8220265, 8216776, 8345889, 64664, 425134, 184054, 316795, 512941, 104512, 8247137, 8031223, 8124881, 222640, 75655, 8235943, 8373324, 8067510, 8081484, 121629, 8378664, 332424, 18859, 128377, 8142243, 208442, 8047815, 50424, 501923, 479522, 252719, 7914772, 257392, 407303, 440345, 8116328, 7944739, 8275334, 179564, 7874725, 466777, 149230, 8243009, 8338119, 8003835, 379019, 455633, 384839, 363170, 473664, 314599, 8222128, 3939, 88367, 121364, 254587, 8093422, 8139411, 94687, 8262441, 8108153, 493097, 240776, 8338704, 196497, 131270, 7965588, 42590, 7959684, 7870847, 333978, 8119744, 8287492, 84017, 8379893, 513210, 253557, 7978950, 8065232, 131288, 348275, 387916, 297949, 8204179, 8302788, 103131, 84913, 8163189, 7932967, 473894, 8137259, 394737, 492892, 248873, 95104, 8355894, 7896997, 13336, 408371, 417265, 8373961, 8219113, 8362512, 7888592, 237857, 16233, 14034, 384913, 141345, 8198973, 8045586, 7887542, 273904, 451206, 134730, 411802, 125857, 8128961, 8339476, 406030, 463938, 86859, 8139385, 8318687, 8035126, 8362011, 8379064, 8323084, 358966, 8242984, 8063040, 343943, 61272, 516517, 8291106, 85718, 65535, 82493, 210846, 291988, 8376057, 46295, 385942, 269456, 7981057, 265435, 7968286, 8343728, 230140, 167594, 369612, 71184, 8056973, 519369, 8094738, 7886744, 362219, 347730, 8277810, 370375, 8245226, 345563, 8322351, 222380, 8302787, 27026, 8181441, 445476, 7312, 8111394, 8065163, 8029830, 272612, 8073441, 135093, 7988217, 8115524, 8234159, 7957591, 8025835, 167914, 8235734, 102078, 75910, 293766, 442696, 53529, 9816, 8139584], +[7864923, 346293, 8207853, 194571, 173825, 8052970, 8009963, 34990, 7991213, 4404, 8269729, 8107196, 7861135, 8142811, 7969223, 8117935, 439565, 8172701, 8238276, 8267465, 103289, 246783, 478124, 345627, 8296593, 429040, 7984111, 513811, 8044380, 8318409, 8245417, 519765, 8177988, 8323609, 3189, 7965827, 8289846, 492822, 259367, 492784, 7976184, 7862948, 8004154, 8056884, 71071, 295908, 8129629, 7968544, 7910487, 473410, 8377438, 402469, 126056, 8291894, 8054293, 8205662, 8331616, 8210221, 7858767, 8361145, 7889808, 8155344, 7924336, 7879840, 8379361, 7894520, 7994632, 8240828, 8112829, 440539, 16799, 7861422, 214194, 432376, 233213, 7970174, 508381, 183943, 7867753, 8334918, 8211796, 117438, 261131, 346831, 15825, 8063631, 7977785, 8086838, 7899042, 417538, 7938034, 246606, 374150, 8380102, 188881, 42560, 515759, 7911193, 8266789, 7890369, 465244, 8266249, 8201524, 8285462, 8307804, 468934, 7992701, 8370535, 288560, 155230, 8336112, 405200, 201579, 355046, 464305, 8379098, 7906596, 498972, 252046, 8093628, 8059220, 8227186, 390657, 8106811, 8339174, 140611, 8171197, 296587, 8270262, 8078311, 8294116, 481420, 346568, 8065636, 8098922, 407772, 8140102, 7957292, 3922, 23419, 175064, 509466, 8029424, 8135237, 8183303, 203381, 7960111, 8099484, 234899, 148203, 314525, 7945051, 251078, 8149441, 146133, 484947, 356539, 7975800, 8173241, 459091, 8085435, 8309651, 508494, 458105, 39662, 8133816, 8275733, 131790, 8141196, 7973836, 17538, 344742, 191696, 342466, 8241607, 84015, 196020, 8071545, 189817, 322543, 8239086, 8022826, 8247783, 497491, 460935, 290746, 7977135, 65471, 112915, 7956828, 239251, 8314130, 8372601, 7936261, 496150, 103549, 8323545, 8312156, 121152, 8115932, 8329406, 8379969, 26238, 8231032, 8258972, 7985128, 7866435, 8230703, 162484, 8075287, 448965, 7906032, 5419, 8179113, 306439, 56513, 7928541, 8078554, 8354100, 65957, 7891369, 8015070, 7919669, 7926231, 300458, 60375, 448516, 8034362, 51097, 435074, 8172789, 289564, 8220126, 8355056, 7932279, 8321479, 340430, 8341351, 8253067, 8153761, 8146824, 521868, 520679, 8325635, 8150357, 8028613, 384564, 376242, 66170, 8247487, 7872742, 182807, 419994, 8192221, 130171, 7922178], +[411070, 118455, 8322516, 34774, 246532, 8152700, 15417, 145604, 364163, 247837, 153072, 178400, 186978, 8147844, 418977, 82189, 8238412, 8167408, 509867, 8136233, 8189600, 418046, 198578, 5402, 516438, 484705, 7995992, 7917191, 253184, 7960719, 68438, 7991430, 7895597, 59017, 326572, 481647, 326000, 8225562, 417891, 524124, 7969429, 189974, 8279903, 8085210, 38878, 8334821, 7967495, 7867633, 7901322, 7909636, 13640, 8050938, 8188288, 259621, 432627, 495340, 402204, 8041345, 254710, 82485, 420932, 8213438, 8056911, 8242968, 8064926, 7926651, 371003, 119347, 586, 431683, 523415, 8107112, 8123703, 350037, 8116386, 442253, 8241971, 8376930, 8182051, 8083535, 8013092, 8124996, 121788, 7902836, 102582, 224018, 269485, 72380, 337873, 16826, 462659, 8264756, 8209814, 8347576, 8000058, 8281675, 8341649, 13509, 7887185, 178584, 355529, 346646, 332730, 415932, 8095114, 144260, 8326061, 8323795, 222243, 124164, 7959728, 324262, 8355073, 8372536, 509795, 8226908, 388915, 8328937, 372189, 8181955, 7865735, 411528, 8295227, 8201104, 8343204, 8372702, 8032055, 8251181, 8114050, 8291889, 7928006, 8044776, 217215, 8258033, 8118512, 103741, 70888, 82073, 8000162, 31183, 134336, 8250275, 7926074, 196933, 7957264, 96131, 8312135, 504581, 8198528, 521095, 8222075, 8334097, 176457, 410780, 8120724, 8342947, 7901415, 167930, 105088, 8330317, 213147, 8149694, 7886453, 203065, 8317988, 491576, 52733, 446713, 7870209, 51143, 7978530, 205901, 8212220, 8093303, 17658, 8272176, 8337887, 237218, 8271878, 150065, 340308, 112135, 417025, 8210804, 8178989, 7868115, 8049020, 421686, 23668, 296263, 160091, 8130070, 8369684, 339746, 154730, 264795, 8297745, 7873297, 7956065, 476632, 62646, 7947112, 7955120, 391553, 8008725, 8323166, 307703, 132948, 8053574, 8343755, 8345554, 8235027, 8047472, 7964033, 462909, 20600, 8252658, 72340, 8313472, 62214, 204052, 451900, 8268928, 8154097, 297008, 153777, 8031996, 307509, 318886, 198380, 8298447, 276860, 33745, 385276, 7914810, 8170614, 8231406, 7958006, 90742, 8069726, 8045433, 472888, 344715, 454439, 205880, 226194, 59885, 23920, 227494, 8316403, 112704, 8240495, 7957050, 8102025, 93189, 95294], +[7955323, 8372337, 335001, 7901141, 420057, 8096673, 150343, 8111146, 265788, 221235, 418203, 261699, 391707, 74260, 182541, 124172, 8014314, 225160, 7992096, 7983538, 234570, 8023218, 202108, 8316178, 8255524, 7863224, 8017905, 57942, 8018739, 7891419, 263469, 8258212, 7887089, 322815, 135061, 8010003, 7864506, 414388, 8138900, 147358, 8117622, 8300371, 8342095, 8082878, 182186, 221521, 8048294, 7936414, 275348, 241683, 8348114, 503042, 8292499, 8092799, 448589, 20329, 8237439, 140039, 501443, 231801, 89072, 8324111, 8070697, 8106505, 64608, 8283225, 8137389, 8050671, 8024378, 394232, 124571, 33689, 389400, 267985, 4030, 440875, 8047506, 17959, 8127614, 8163859, 8218379, 8297354, 8265081, 459873, 8219642, 216066, 379615, 8334588, 8190265, 8053629, 8165156, 200210, 8322609, 8155960, 8211620, 8157406, 217654, 531, 18796, 494926, 308846, 8347770, 190265, 82675, 495054, 8379779, 8306039, 7895316, 269865, 495776, 8039342, 315998, 84742, 8321254, 8095086, 7874567, 292051, 447801, 84366, 8237499, 394724, 8066720, 409369, 8290521, 71109, 8267337, 36622, 7912290, 314277, 8269123, 8196284, 441527, 7894341, 8304586, 286507, 43080, 168458, 8047221, 7941179, 7922192, 265832, 8058098, 421158, 7955793, 7994977, 8142616, 8187674, 223512, 169598, 8328067, 78472, 445921, 300046, 121473, 262234, 415412, 13137, 8303561, 513362, 8339626, 304204, 7862103, 142036, 8040472, 8306675, 517106, 107353, 437943, 8283522, 100986, 385588, 8221102, 43259, 158428, 505829, 437480, 8127813, 28246, 500979, 8058664, 86856, 8307255, 8127291, 435639, 402930, 265626, 409931, 8308379, 335284, 155156, 106499, 8369719, 312126, 8181810, 7934974, 8169841, 8133070, 108349, 8251976, 8155805, 177238, 198183, 7999086, 8124835, 8239034, 7965125, 8317169, 438619, 8301147, 8111664, 7920472, 519072, 310494, 373156, 438668, 16434, 8357600, 447586, 155971, 8251573, 303525, 8036863, 218885, 95402, 403662, 8329604, 342375, 8011655, 168336, 51095, 8207271, 37026, 379256, 8187419, 8192836, 8233398, 381932, 235995, 8098698, 456294, 7963435, 8350722, 402517, 164150, 8181828, 8238730, 8003761, 385250, 7983485, 8046153, 265073, 8349569, 197357, 8297116, 483978, 7908997], +[303246, 8368562, 7869951, 8220123, 273367, 8272322, 8248239, 7995807, 78952, 461826, 8358974, 293475, 397418, 8051152, 480600, 8175822, 8168320, 441007, 234695, 44880, 7862428, 7873708, 8311277, 328268, 8025207, 332646, 438113, 267307, 243169, 270005, 500557, 8276347, 8078923, 8103395, 8090407, 8100979, 8260967, 7858586, 481438, 124960, 76268, 181479, 8227604, 8042352, 111802, 222146, 27130, 487863, 8179814, 7948358, 8187161, 502591, 7975967, 7897398, 46201, 151826, 66415, 192091, 104582, 160309, 7975324, 8178663, 8285416, 370509, 427508, 8292178, 171627, 471002, 407606, 299522, 8100823, 8232561, 8104839, 137869, 7996053, 111379, 448046, 310441, 8207289, 8250471, 518660, 8365850, 262657, 8229429, 314491, 8028293, 460232, 7982887, 12808, 275881, 6114, 420028, 8119481, 8317037, 196185, 8200963, 263769, 8025461, 8268452, 125146, 7999722, 498370, 8042416, 8241873, 50139, 394854, 8281806, 7889293, 211058, 8123429, 7931601, 8352243, 7984588, 223673, 473438, 8135136, 8049182, 153054, 133154, 299003, 8085090, 8368348, 8345805, 109611, 10195, 7601, 8228208, 8192113, 471693, 349374, 7862914, 7876678, 7949619, 339515, 301597, 8212936, 277481, 305227, 59331, 8148277, 176797, 138799, 424599, 8207971, 8067708, 8066905, 8110578, 417672, 19776, 303361, 20502, 145622, 8100121, 8220413, 8093763, 8042989, 257554, 8050803, 8182859, 7971104, 7959517, 7995712, 8129606, 8337511, 374936, 281608, 8096233, 8315965, 506083, 373259, 21999, 350794, 8150091, 7885954, 99481, 426760, 509148, 8178866, 8166019, 468584, 89757, 8264550, 7872724, 186451, 263336, 8037731, 7923609, 7953243, 8186514, 8287636, 351235, 8181354, 489010, 7925502, 470188, 7887364, 328936, 72223, 283594, 8164663, 8261529, 8149166, 207726, 325558, 127632, 8175786, 7884191, 7861506, 7993034, 362428, 349837, 7913001, 8247941, 8028675, 36175, 74525, 8261031, 220504, 185904, 340683, 336497, 28503, 409004, 8218958, 8037197, 410862, 8248312, 8065959, 483259, 20424, 468987, 8215778, 8053050, 8295476, 216641, 274354, 8259578, 8350898, 264136, 7911016, 3092, 73180, 8049281, 23412, 7928822, 8201853, 8110746, 62862, 77162, 61563, 228301, 8256474, 313328, 8011728, 8052875, 8159825]] +||z||: 524124, ||z|| too large +r0: [[-156751, -165762, 199093, 202457, -30040, -208580, -27858, -216977, 240928, -259784, 172198, -41550, -138944, 212976, -190244, 187268, -243456, -113496, -57610, 193507, 184770, -232190, -129410, -176802, -22805, 4541, 43045, 122222, -108348, 897, -149891, 141436, -183788, -40987, -170535, 103744, 175561, -127921, 244310, 150704, 3230, -18368, -219452, -120810, -210842, -225423, -33882, -178682, -140666, 173411, 3441, 20679, -209544, 60653, -132561, 193503, -27474, -89309, -171045, 9369, 198773, 209069, -186705, 233537, -74666, 4117, 105924, 161924, 229412, -249567, 228035, -9085, 153368, -236580, 128174, 19442, -32839, -147002, -39083, -257921, 57627, -90632, 230618, -42958, -166415, 171650, 110610, 36315, 237809, -188676, -85288, -8867, -233154, 189380, -257822, -52804, -117894, 72661, -244585, 57703, -174879, -131013, -176155, -198497, -235303, 52326, -64165, -75043, -242153, 54397, -35492, 30065, 19043, 69029, -143019, -86604, -137376, -16564, 16480, -213117, -165378, -103175, 44438, -29645, 185034, -150553, -227235, -175445, 236157, 97959, 120433, -189240, -247328, -45834, 96031, -167803, 176476, 129081, -60713, -122599, -169774, 140799, 142093, -128067, -65261, -124128, 34983, 4061, -113957, 38284, 244217, 107071, -43375, -43378, -31202, 88984, -206951, 24849, -202652, 258083, 99478, -249901, -145413, 54901, -115306, 77317, -48434, -66078, -141669, 13476, 211286, -252506, -189426, -131510, -65771, 206931, 182576, 23081, -254736, 47994, 152054, -248205, -233476, 32894, -87102, 66836, 164059, -59540, -54112, -183382, -168821, 136974, 185095, -249265, -25914, -204960, 93408, 223466, -230988, -213884, -127812, -20137, -140030, 51371, 235679, -108473, 250193, -5796, 136853, 715, 7819, 95674, -101865, -151035, -215521, 105420, -180905, -62609, -23702, 223897, 138915, -172600, -154875, 180103, 135080, -127944, 123710, 51746, 172882, -190332, -253917, 160846, 30256, -6248, -48439, 20862, -29974, -179633, 257524, -153768, 57910, -41574, 169174, 199349, -85563, 109420, 163073, -253520, -190107, -36411, 165809, -77981, -198116, 153478, -113049, -134091], +[92213, -231462, -106275, 207346, -254961, -57100, -54758, 101592, 63595, -234300, -23925, 41982, -206884, -124902, 229406, 226509, 70864, 219342, -195223, -181859, -60325, -39805, -135952, 84942, -173694, 9748, 168775, -239109, -257385, 25803, -159454, -93425, -95598, -194790, -196870, 229982, 124138, 68457, 253409, 61991, 113847, 35490, 50389, -136954, -71394, -66509, 74083, -106791, 153446, -46472, -90889, 125280, -116805, -92301, 121283, -70271, -20695, -124988, -117730, 178105, 212111, -99622, -40894, 177619, -12027, 59220, 47394, 201098, -166308, -188912, 210083, -9055, -191436, -188130, 188992, -163316, 115499, 247785, 170112, -223001, -173390, -22031, 21428, 46332, 148953, -248110, -156417, -230257, 111511, -118469, -208122, 237031, -250670, 87302, -253544, 47181, 41824, 22508, 3342, -11560, -216244, 125046, 160099, -177170, -146683, -65147, -84795, -71151, -155828, 62820, -207991, 55494, -184183, 241529, 225221, 52007, 187335, -222813, -41978, 43190, -170098, 226984, 226286, -145755, 126049, 115406, 183360, 83090, -11621, -14995, 222870, 41037, -120533, -96944, 33879, -35508, -120311, -29090, 233173, 37413, 144156, -9637, 186993, 98853, -218116, -59847, 129626, 125608, 230974, -108685, -211358, -187441, -174229, -9067, -112155, 164806, -116478, -91485, 32742, -249007, -181108, -38056, -217766, 138605, -50068, 169679, -98798, -48896, 184695, -30995, -254575, -83512, -20297, -174419, 92652, 144959, 252833, 58579, -180560, 212496, -135839, -10700, 186786, -183842, 143077, 238264, 36505, -133406, 252448, 76260, -253317, 73577, -142197, 62235, 183618, 205700, 64321, 35352, -14506, -29276, 92169, -103843, 193467, -167462, -110944, 202808, -104145, 135376, 58147, 87798, 181276, -249036, 175689, 9233, -260737, -157556, 90809, -163231, 114786, -215655, -144990, 209321, -109100, 203068, -126628, -63155, 198369, -43462, 232246, -221748, 30030, 240392, 98788, -131124, -91602, 31755, 201773, -79468, 184182, 105602, 118345, 184200, 41351, -188358, 96267, -64535, 95532, 156437, -197857, -237106, -234176, 118410, -73602, -58635, -66754, -145862], +[-241493, -181558, 185372, -148801, -243903, -95616, 240834, -120572, 136507, 178903, -206006, -39632, 73624, -108403, -197483, -218702, 105379, -96728, 183393, -35635, 72597, 186066, -140387, -90881, 51303, 258577, -82847, 112558, 62445, -246023, -32113, -76082, -147628, 47234, -190166, 232821, 24760, -129788, -231323, 34529, 210810, -164392, 135651, -261632, -50409, -106544, 182326, 9767, 113894, 186112, 146304, -225028, 17195, 253030, 115774, 241109, 31407, 53630, 257948, -107583, 6392, 59559, -131488, -136473, 148030, 37913, 184534, -73553, 116992, -101361, 240286, 40358, 185264, -10552, 75852, -204835, -223697, 34832, 253771, 155019, 253065, -187217, -43659, 163927, 261447, 41870, -107794, -31355, 6375, -253613, -215197, -166210, -241340, -223792, 214020, -144008, -85051, 156858, -147621, 209129, 63444, 93143, 126879, -171317, -234330, 240343, -71394, 134302, 157939, -154858, -219694, 110131, -243820, -210388, -251832, 18671, -157165, -4269, -105293, -188223, 183719, -108824, 24676, 109546, -157177, -141557, -52778, 155509, -124445, -79626, -98753, 193738, 241922, 190330, 48898, -198883, 261024, 160804, 3281, 45131, -224069, -197531, 119230, 224102, 61481, 200746, 76371, 31988, 2530, 230102, 243646, -8447, -178685, 124362, 80853, 178725, -41691, 203134, -105879, 88771, -40473, -138393, -240807, 244784, 218367, 217362, -1932, 37133, -28425, -204989, -126247, -3152, 204004, 114933, 59837, -47784, 41150, 202086, 76018, 185381, 51231, 193711, -62657, 55152, -30268, -107791, 98077, 184461, 72784, -223916, 38318, 56733, 261151, 79087, -185281, 61831, -95701, 37936, 126980, 230881, 29604, -9684, -216001, 93066, 106200, 255000, -181330, -88150, -214408, -219472, 114992, -215064, 139585, 190466, -174128, 134260, 166052, 151287, -261845, -47361, 177739, -93723, -106018, -183718, 223189, 124048, 148082, 3036, -230289, 100257, -213983, -153374, 180760, 98954, 34565, -156170, -149965, -15360, -78002, -172940, 179911, 136959, -229409, 241533, 109635, 260140, -81976, 200219, -14854, -121195, 152530, -125582, 114909, 181663, 123897, -154331], +[113771, -176662, -252125, -253131, 66724, 49706, -49761, 94136, -61212, 215787, 213108, 113869, -35969, 145987, 15, -66737, 179637, -246334, -239472, 10316, -31387, -259892, 206523, -18277, -118574, 61498, 66342, -228691, -15201, -22185, -58771, -82751, -259663, 173322, 5097, 15861, 112737, -101790, 57008, -203378, 28411, 132746, -196687, -205509, 108531, 235505, -100697, 232777, -232433, -48627, -242149, -151586, -114977, 171784, 195560, -197051, 116209, 795, 183859, 104800, -59431, 114554, -238952, 160092, 119051, -237177, 247365, -197503, 153151, -163962, -202157, 102017, -99247, -142988, -25437, 114137, -106442, -216794, 235869, 21206, -211336, -8038, 132286, 188450, 1882, -186043, 103850, 27579, -243021, -197742, 161728, -140803, -173635, 183145, -152401, -96338, 213462, -205199, 60876, -146116, -254985, 121383, 46871, -92162, 176965, 126281, -70712, 15341, 103766, 168304, -91520, 195701, 241347, -52514, -201491, 219095, -177107, 179531, -99793, 6890, 192273, 130835, -48844, 53123, 83130, -228417, 59239, -24988, 125794, 92013, -104340, 70000, 152169, 177489, -92927, -209672, 240813, -126502, -59568, -147566, -55277, -212407, -180447, -56171, -14079, -62273, -165495, -172849, -83015, 116963, -29572, 72506, -131093, -236616, -135995, -37437, -167877, -224546, -137318, -242455, -230553, -154474, 90892, -247885, 53353, -253334, 45465, 183554, -227382, -40612, -172847, 167424, 93313, -21624, -207764, 182112, -32839, 221088, -203356, -157030, 211993, -253420, 87403, -240089, -250557, 53984, 250217, -200718, -2657, -224686, -172673, -30779, 135926, 35267, 193954, 14859, 133807, 193262, 972, 216894, -88674, 119187, -139034, 181318, -130755, -18404, -12400, -258574, -66879, -29186, 164113, -3270, 191509, 158130, 148441, 125299, 204043, 155945, 68311, -244663, -141074, -217612, -154728, -255539, -107381, -152779, -23795, -151403, -111834, -225353, 221452, 236537, -209334, 220339, -162965, 138756, 219029, -82001, -199905, -94317, -97528, -93788, 157803, 226051, 76713, 53566, -16620, -20948, -2748, 36972, 167295, -42439, -66782, 116949, 232993, 1395], +[-147233, -105107, 168140, 234541, -60193, 113347, 212480, -47180, 196072, 33111, 167926, 96172, 57817, -206782, -148862, -196241, -208571, 87296, 159224, 29411, 7955, -230838, 255427, 118946, -135327, 187730, -9570, -18331, -76439, 235119, -8862, 124120, -92214, 110122, 111637, -82379, -247992, -176302, -132756, -24209, -37684, -68940, 178359, -185408, 52116, -52334, -73478, -61418, 46581, 154723, 32190, -149165, -7637, 202173, -261374, -133311, -235642, 259841, 39159, 204909, -85295, -5537, 170568, 11307, 76061, -146953, -72060, 148225, 59749, -95435, 194908, -251741, 33348, -208117, 122435, 130871, 186543, 208774, 201832, 26687, -16528, -161281, 252499, 117381, 178658, -44651, -119388, -239489, 239648, -199027, 163190, -71220, 216003, -36773, -201552, -116415, -195166, -169270, -104267, 198324, -98114, -163113, 128171, 131624, 114979, 88821, -213083, -245366, -24722, 89929, 174405, 35391, -112474, 210573, -230808, -104530, 207118, 135267, -62080, -136267, 198158, 200217, 148283, 250268, -167557, -101925, 132752, -123312, -197878, -47439, -139042, 162428, -123074, 174979, -180086, -103377, 15071, -242530, -170420, 178453, 110593, -194819, -153226, -260526, -165061, 56113, 60217, 140319, 221524, -1937, 88503, -58396, -189647, -222113, 144596, -107792, -206206, 18124, -78802, -160832, -181517, 191185, 81612, 146691, -39121, 231505, 78763, 178843, -146437, 158221, -153016, 178672, 52643, -217017, -67917, 251596, -204544, -206541, 56123, 152786, -79050, 179809, -129158, -79440, -44479, -38527, -118155, 28096, 25985, -33826, -97587, -63246, -106577, 32620, 95873, -89744, -139855, 1794, -248983, 23494, -49999, 110700, -171102, 15625, -154669, 237574, -220602, 127199, -74069, 15347, -228907, -162886, -237629, -116403, -73243, -46687, -209607, -172896, -195418, -41535, 259467, 34787, 247062, -228914, 249434, 30386, -143772, 119676, 256910, -85187, 12436, 42845, -64480, -136983, -99773, -39997, -122003, -101428, -62756, 81845, -169472, -101760, 85330, 171497, 107963, 24353, -155063, -202195, -247177, 215526, 94600, 51826, -112552, 111222, 88578, 50649], +[-190111, -175951, 186937, -133779, -219006, 197904, 132837, 212268, 54284, -139298, 98620, 250174, -166780, 210928, -2270, -179414, 32308, -112317, 139214, 140342, 51966, -202711, -244082, 38623, 126274, -29250, 204475, 128001, -108016, -24333, -235792, -24228, 46533, 217761, 143119, -221502, -74815, 52838, -109225, 19050, -85360, 240337, -243149, -207404, -206098, -209132, -157069, -86969, -162884, -48207, -206479, 201676, 226178, 45542, -79306, 171268, -238417, -90027, -11403, -247305, -203253, -18310, 253303, 205054, -178962, 49764, 50109, -19772, -2498, 215491, -25900, 60169, -1755, 145218, 189957, 219383, 64506, 16532, -241403, 156660, 18223, 127895, 233436, -153941, 142637, -38938, 116411, -44352, 55542, -18182, -54934, -258208, -202344, -131632, -109675, -63652, 50741, -132475, 30935, 30521, 144721, -109599, 20859, 106292, -202408, -162250, 249230, 252407, -33491, 26433, -156561, -232548, -220465, 53662, -146311, -44798, 162739, 106615, -80492, -199267, -27807, -251940, 120427, 126088, 76606, -73734, 154385, 128446, -110764, 122520, 19048, -260847, -100204, -194509, 95447, -101451, -125224, -225441, -220667, 62878, 9767, -80442, -57911, -195246, 254787, 211292, -18764, -261273, -130340, 257418, 78757, 97433, -68164, -880, -183927, 130605, 194482, 47930, -151263, -256196, -2181, 165900, -246747, 215974, -259235, 128919, 209998, 46727, -7497, -81050, 17547, 5102, 25561, -173308, -18877, -226906, -132804, -167000, -21165, -73839, 213021, 91555, -226759, -181534, 257419, 242920, 136700, 51629, -4413, -203793, -158090, -107344, 119082, 193459, -241825, 106830, -32935, -25817, -137593, 237489, -202563, 39497, -204069, -155229, -252627, 156753, -131474, -236087, -157382, -187089, -210583, -98551, 136708, 199017, 81947, 8550, 102521, -57637, -175165, -187146, -22111, 108308, -250620, -147963, -106268, 47858, -141690, 85240, 211847, 57058, 229766, -215305, 65409, 199362, 150910, 146410, -146336, -155146, -43961, -213345, -85983, -43728, 224840, -84838, 41787, 169215, -247387, 184083, -62278, -130690, 251222, 102634, 243073, 238616, 160187, 38581]] +||r0||261845, ||r0|| too large +Need new candidate round. ||z|| too large or ||r0|| too large. + +y: [[-341989, 66464, -128125, 119754, 9605, -224492, -271124, 454096, -374398, 307617, 449750, 105469, 466088, 129670, -139977, -204735, -501883, 162902, 421503, -297264, 65203, -518147, 222648, -179778, 37599, 425303, -211775, -331067, -220570, 274800, -370693, 400479, -328150, 110109, 158543, -279494, -389551, -76521, 245788, -431616, 182234, -156980, -41850, -245934, -8079, 470432, -235575, -101881, 101241, -125632, 491712, -243509, 123798, 380236, -56071, -296255, -115620, -181972, 51438, 159330, 277312, 429108, 287413, 395763, 345972, -165267, -293566, -443148, 76179, -387295, -446237, 98940, -212198, -91319, 159428, 315082, -10095, 385722, 410023, 432312, 389029, 405, 57416, -212533, 301027, 67323, -73642, 434438, 359528, 82130, -242127, 37398, -40065, 244967, -334641, 281404, -476106, 37699, 210800, 248885, 176486, 336180, 340398, -145235, 192079, 88414, -40905, 211399, -155957, -124943, 102567, 504593, -440798, 445337, -71618, -35431, -375812, -226307, 519313, -196194, 348191, 314479, -299101, 198298, 32761, 366353, -80897, -398634, -413167, 434265, 334341, -264377, 243348, -388504, -376176, -290760, -88046, -283248, 92136, 75263, 248989, 507739, 52837, 413151, -488820, 292773, 203218, -49813, -238294, 406263, 522793, 96724, -472402, -232368, 485981, -99494, 266256, 61913, -476273, 94603, -30971, 136967, 419707, 31273, 123783, -174657, -1882, 428823, 256787, 40892, -347766, 123053, 315108, 463410, -8298, 483446, -324626, -279306, -399029, -343879, 184426, -321375, -357183, 415784, 215883, 101518, -182789, -270770, -133189, 105517, -92633, 479101, -211577, 38974, 66155, 82904, -55619, -492062, -490549, 501607, -226023, -34105, -270971, -376431, -283438, 309691, 303532, 393849, 201824, -349511, -254313, 458279, 329331, 254193, 417654, -86525, 284505, -91365, 410178, -479387, -306679, -348816, -202677, -352920, -161103, -44442, -10077, 363468, 366011, 79782, -170688, 116693, 14263, -298064, -231147, 260346, -155584, 7054, 450937, 31742, 413488, 58064, 249549, 93808, -340566, 241423, -13854, 287089, -304350, -196874, 152370, -302019, -516612, -135720, -111066, 198382], +[476062, -440388, -274398, -386415, -152513, -399396, -353322, -164772, -329340, 352094, 507669, -247894, 446554, 431522, -508106, -283785, -493657, -403733, -180282, 137613, 330062, 481795, -498614, -373084, 370932, -228028, 103828, 446272, 216387, 61135, -397942, 385553, -77912, -154174, -159577, -431479, 102362, -419892, -416991, 16229, -260692, 56130, 490912, 462975, -136335, 399915, 191394, 389672, -124709, -150167, 339960, 364828, -201143, 290277, 507481, -175093, 362562, 264735, 343715, -77663, 403360, 314441, 283333, -221491, 505927, -85583, 94173, 421520, 37913, 199793, -326225, -118427, -96960, 153050, 441827, -416564, -63979, -431871, -219594, 83525, 306836, -434447, 89303, 25085, -472737, 184745, -436058, 371057, -343660, 164751, 372512, -87782, 92739, -506008, -351094, 88010, -171039, -335355, 332127, 416623, 356974, 303429, 57865, 227642, 54487, -161576, -452030, -510143, 488609, -82973, -520221, -418740, -480411, -208967, 508859, 93064, -366045, 205288, -374422, -368939, -145858, 433261, -328629, 65217, 211501, -405001, -43403, -414397, -504424, -203176, -139774, 111078, -123422, -280754, -283654, 29768, 381259, -124897, 510340, -234631, -114995, -276975, -313627, -430859, 346668, -255292, -20716, 243633, -392616, -70290, 92225, -322592, 255671, 205957, -392242, 374124, -85313, -31682, 61981, 258180, -523453, -196079, 72453, 355839, 283674, -332157, -315774, 74590, -90498, 307462, 464624, 186335, -388968, 417497, 436082, 56816, -113409, 416982, -172742, 319980, 63131, 10919, 339462, -347545, 237912, 432039, 496541, -283563, 485896, -12068, 420296, -495516, -122208, 158931, 87411, 307747, 243289, 405473, -144681, 113932, -149255, -193185, 350428, 469404, 274722, 357757, 78966, 242087, 404154, -234280, -202454, -171890, 92188, 340707, 4317, -160792, -491378, -387996, -316392, -480842, 180469, 422781, 43727, -446077, -169658, -130977, -523828, 215349, 510933, 441989, 287622, -459885, 184165, -447682, -276428, 448727, -191983, -68149, 410545, -64907, 53662, -164580, -347433, 503560, 132377, -366737, 452712, 159404, -50129, 420248, -50996, 163877, -262689, 441319, 151827, -365304], +[-435352, -47839, 103490, -156704, -42967, -130203, -298743, -310624, 424095, -10020, 161760, 259650, 201015, 86289, -401264, -482165, 421874, 467622, 318524, 104215, -465236, -342717, 194702, -142682, 156020, 317445, 389067, 29639, -406564, 119810, 126788, -228757, -517465, 451918, -152878, 479357, 54881, -35270, 285085, -290941, 496083, -514905, -199901, -249886, -467587, 258912, 93198, 448233, 493335, 237635, -211595, -133705, -245236, -218002, 280702, -18604, -34179, 184142, -125303, -489863, -57035, -140992, 257401, -413445, -25429, -420215, -130261, 327862, 238740, -379504, 193279, -361578, -120974, -80034, 522480, -103959, -113996, 458650, -186115, -399297, 105558, 235842, -118609, 342531, 231583, 359962, -459140, -327025, -360085, 513168, 102706, 150343, 498551, 523546, -39154, -108380, 455300, 92504, 330429, -100609, 142335, 95141, -207513, 300610, 65717, 506940, -488095, -349260, -112407, -332345, 144813, 136871, -262845, -81149, 470470, 169890, -355172, 66125, -219913, -37241, 315895, 413367, -48267, -158604, -298415, 260022, 361142, -144472, 160235, -451026, -104026, 222321, -256284, -22967, 193980, -172112, 171226, -523320, 163050, -489922, -19167, -348948, 465235, -142409, -421751, -308950, 468309, -115252, -492206, 370043, 52621, 512055, -205851, -328369, -465570, 458497, -384944, 364446, -384760, -252863, -204856, -337408, 40244, 472136, 376044, 134816, 448693, 299475, -105891, 27981, 374492, -31176, 62323, -140832, -53056, 195703, -314844, -54085, 490589, -229282, 463185, -251015, 229666, -356361, 42729, -418111, -83453, 458641, -446963, -507029, 321384, 329319, -389043, 123957, 477968, 451734, 269541, 460437, 108733, -416705, -372440, 335945, -372622, 58126, 50324, -393233, -118208, -18327, 43917, 345448, 457222, 242781, -288756, -233661, -55437, 279852, 383713, -304791, 427041, 401646, 82997, -61675, 226387, 301570, -306324, 428020, -43609, -412529, 438571, 319375, -141872, -319691, 260721, -271652, -254042, 71766, -76581, -463367, -155230, 40039, -188191, -140853, -201458, -431194, 155129, -396435, 265806, 408127, 188592, -202395, -484332, 435971, 213644, -51132, 366518, -484572], +[-519015, -322411, -357569, 286649, -82536, 73412, -254009, 68522, -263163, 482653, 131287, -12184, 197431, -409188, 129129, -113796, -495595, 141406, -52579, -386393, -238008, -127531, 356845, 457589, 208353, -135585, -239776, 494370, 64358, -225169, -504856, 251559, -270250, -393365, 399223, 261545, 151786, -306076, 252460, -14137, -145105, -473465, 345168, -376087, -58201, 449656, 310614, -488988, 189287, -266637, -396501, 114220, 385074, 394145, 258363, -304863, 289671, -71634, 227577, -374888, -473421, -264375, -198861, 187732, -223469, -320180, 479231, -105110, -508728, 255183, 518977, -62508, -473503, 69378, 115081, 498401, -134626, 287146, -37384, 441631, -449404, -81481, -471452, -452857, 336216, -329222, 292433, -154940, 445689, -214922, 198718, -238255, -86433, -384152, 429342, -114591, -24823, 43336, 56829, 461446, 255848, 194060, -12287, -176503, -270745, 142934, -159183, 337805, -117218, 155121, 40088, -347200, 25279, 129532, -401755, 151952, -341443, 513925, -493895, -460087, -458078, -218316, -246211, -194254, 199828, -18797, 375886, 520428, 356851, 147698, 237470, 179949, 450269, 304845, 295312, 69013, 107141, -401983, 186110, 324632, 379941, -89959, -374722, 414209, -469034, -524032, -204538, 268832, 245091, 446258, 449110, 102003, 207479, -8364, 414098, 199357, -17298, 68200, -478041, 193524, -272745, -411323, 481633, -269803, -282203, 324129, -342397, 192104, 81565, 500887, -519706, -523904, 140755, 276720, -394307, 5472, 397830, 391226, -243931, 520688, 28156, -278258, 244430, -403093, -63728, 208726, 165090, -498903, -367541, 306555, -165615, -480755, -158655, -18211, 495968, 136046, -152994, -251891, 171453, 292664, -519891, 225988, 319643, -44700, -107785, -383902, 455008, 66559, -423407, -304011, -395415, -18161, 274745, -418580, -30900, 21918, 347126, 104935, 203404, 123816, 373890, 292676, 187415, -270497, 320137, -438885, 71212, 278349, -64973, -465187, -492572, 520733, -391570, -97147, -205685, -477802, 471490, 275416, -376573, 15946, 73325, -222079, -161401, -294979, 453237, -79612, -403830, -462335, -495749, 208036, 446684, -238800, 11145, 215720, -77983, 460549], +[-229453, -96359, -32206, 256599, 198168, -501142, 381592, 329973, 180899, -24984, 179002, -428940, 280137, 471222, 155012, 110538, -309558, -507948, -357972, 254923, -191957, -284410, 283431, 452495, 364536, -346800, -320578, -117766, 257817, -198913, 230650, 231072, -143126, 495112, 297076, -449637, -139480, 51305, -271700, -276418, 261803, 275773, -341898, -202651, 488675, -260173, -424384, -461256, 6894, -327911, 313014, 209377, 398468, 233011, 85824, 215610, -425669, -7344, 104369, -315587, 406359, -296726, -1121, 361959, -104802, -451054, -25335, -468816, -83466, 431902, 500654, 90661, -4289, 112776, 170133, 24728, 100654, -327649, 130524, 343618, -235105, 323999, -66876, 92352, -137059, -268234, -155389, 479650, -77903, -180225, 12705, 144798, -304922, 331552, -371278, -41306, 283117, 432149, -99319, -387404, 46093, -152710, -153619, -283283, 315474, -367903, -419337, -121320, -395789, -88181, 282831, -55984, -149042, 269978, -294159, -322044, 37731, -297134, -330138, -414374, -80431, 385243, 267376, 272267, 39881, 228910, -457570, 361322, -6165, 84550, -33179, 296694, 510810, -93907, -363106, -298251, -498298, -438985, -307627, 243044, 66867, 283277, -401105, 415320, -448306, -328031, 443573, 7494, 60689, -35503, -347647, -384073, -284627, 134550, -371038, 420229, -410298, 168524, 391337, 494837, -331753, 440487, -86262, 205201, -50784, 351886, 107827, -94570, -489081, -488287, 424123, 267610, 44858, 209874, -285913, -239490, -272084, 246224, 49954, 359242, 61094, -91558, -196970, 255224, 221907, 475479, 168073, 463307, -518842, -85657, 306228, -402572, -452460, 211256, 483755, -151443, 136440, 328717, -203357, -403536, 372005, -152629, -207389, 249182, -403944, 24962, 146631, 5137, 362565, 110547, -186953, 425379, -204576, 521376, -296707, 239662, -501694, 54612, 208455, -80118, 48878, -295081, -369500, 465276, 433838, -504286, 471630, 354404, 205500, 200409, 295206, 234963, 318207, -286572, -289921, 161552, 372872, -160163, 344987, -111831, -51003, -68187, -485702, 90042, -116782, -166260, 89878, -145975, -334232, -416287, -131852, -516520, -26184, 246740, -91613, 100419]] +NTT(y): [[1160348, 1930630, 2168100, 5297506, 4565745, 445884, 1255355, 5644455, 4697489, 2006528, 783229, 6489857, 1973321, 4466817, 7236069, 1024033, 6099408, 2108572, 7577793, 3619421, 7239187, 5810589, 7065917, 5133517, 6048576, 2704419, 4384313, 7487926, 4332443, 7717418, 2018067, 1497461, 6534780, 7585636, 5193025, 1428990, 1409316, 5696708, 464625, 5315753, 2155090, 1055636, 1432464, 4731792, 2032007, 5523717, 7440289, 8321320, 3451952, 4306699, 7476008, 8230828, 816251, 6186301, 1570913, 8089116, 6663330, 250262, 2726494, 3888810, 4503896, 3378936, 3908943, 5297258, 6467405, 517899, 6435343, 6943425, 1422757, 5017573, 3241682, 6356087, 4895036, 2806698, 6571734, 3471769, 3736465, 8251275, 4125633, 5074400, 6580470, 2315559, 3977454, 925589, 2194253, 657919, 7073620, 8232268, 1446766, 2607061, 888403, 1717321, 1043731, 5600106, 546395, 7676672, 7523513, 5076714, 1544614, 480998, 2889874, 3978981, 2607444, 7574645, 2054581, 3792179, 2410492, 3740221, 6393926, 6448821, 5952769, 4906393, 1645679, 1186631, 228285, 7685683, 7783443, 3693749, 2414518, 6285128, 6733687, 1203592, 3154723, 1863687, 7169426, 214441, 6993006, 1434268, 6817436, 2790092, 8101324, 3443936, 1099407, 225349, 2032441, 554060, 657263, 2824334, 1092013, 5018900, 4818598, 7841114, 2910217, 1623682, 7566639, 2549198, 7378232, 6218689, 6752964, 5639819, 2848745, 6118499, 4339010, 1117655, 356076, 625116, 488992, 1875646, 7101154, 6905602, 2584573, 1211610, 1636833, 1641630, 7361328, 3087828, 4444202, 5726592, 6315272, 4917919, 6882725, 8134165, 5510556, 3438519, 1392645, 1701461, 405810, 5459327, 2545016, 3599582, 5471481, 1923370, 7373081, 1744633, 7547401, 5193430, 1683136, 8110212, 6557040, 2553173, 3577420, 4654239, 974951, 6914365, 7971, 2233862, 3465958, 6160709, 859314, 1230387, 2453529, 5304122, 808344, 3303511, 3325299, 8321660, 3649507, 627032, 1248017, 459613, 3837208, 2394758, 6053234, 2036199, 2790468, 6346731, 6326880, 6478737, 5968763, 3857155, 1506612, 6338907, 3045221, 4313648, 2258800, 48542, 6674581, 4602563, 3272476, 6828767, 4587616, 1737425, 1268488, 2654207, 7717249, 5524136, 324681, 8101939, 1700561, 2337680, 6678032, 3073948, 8376095, 3315014, 5996447, 5710853, 2956642, 8361140, 7335385, 6705413, 1552442, 5123869, 2885368, 1929504, 4842051, 860863], +[3060042, 1885637, 134490, 149529, 7075888, 3343833, 1434, 4188038, 1867630, 5199970, 5504915, 2905030, 2262972, 6183564, 2921497, 5313000, 1651530, 6974193, 4390297, 7677740, 6791341, 2513938, 495122, 2966283, 6987744, 6499211, 7703189, 2550513, 1937368, 103711, 4189119, 3611363, 5584007, 3316243, 4975955, 7222053, 2333120, 3992023, 7109988, 3551679, 2837642, 3437687, 3756978, 8283947, 2923012, 4958225, 7345762, 2765653, 2590992, 2509576, 1243406, 5959441, 7457239, 4718194, 6217477, 4024101, 7397652, 46155, 6283569, 1172362, 2448240, 6781638, 5165530, 6443491, 1338531, 2096210, 280759, 2793041, 1195776, 2003646, 4863065, 2058286, 3721125, 5068106, 2666963, 5101462, 1083870, 896423, 6735550, 1870914, 3639395, 1224807, 8320390, 6956943, 6076549, 1950506, 4233936, 4506291, 5885153, 5168582, 943453, 302754, 599363, 6732844, 317918, 7739887, 1839520, 6543296, 4499825, 7963610, 4965121, 7102726, 358727, 1742312, 5286969, 4276000, 7796754, 315486, 127232, 2110699, 690987, 4133565, 4160720, 4414282, 3213253, 4796022, 2206945, 7747966, 8284933, 2161242, 5423436, 7058518, 3914460, 4143117, 360169, 4170696, 1291206, 7256678, 2698637, 4519557, 7256582, 34103, 3645439, 7398048, 5507110, 2651165, 1359951, 3354059, 2335742, 7465799, 281236, 3987603, 4766523, 692102, 6222967, 627313, 4403719, 2592524, 6720112, 6930783, 6597269, 6125608, 5139060, 1606554, 4025931, 7481974, 7384249, 669685, 8072345, 4787405, 384628, 5835300, 5918420, 2020862, 748111, 2362374, 4234841, 2366947, 6724571, 6809263, 5505506, 7368080, 5702459, 2721853, 2320947, 2545486, 1329699, 6608796, 6949342, 4312991, 3749431, 6417803, 6229789, 5887677, 3007234, 114734, 1180733, 299491, 6544370, 6100629, 1678017, 6636832, 467065, 863810, 2470619, 911606, 416913, 6111997, 1597748, 4292206, 1570646, 1073737, 5838297, 6297722, 5341229, 1347526, 8111913, 1357011, 543839, 1002980, 5870602, 8089278, 7195546, 2887850, 2163003, 4434451, 6113137, 8182776, 996580, 4739634, 2101124, 7020662, 67800, 1624253, 7983021, 735882, 4299942, 677395, 7531277, 3637419, 1558671, 4236385, 4269542, 3204972, 7510626, 2213355, 7769931, 3221697, 2008656, 1004473, 5409487, 3839903, 433619, 8313890, 5979475, 305346, 7341880, 4920014, 7559211, 4298724, 5770084, 4173952, 4260018, 6285880, 247670, 5890026], +[5774149, 1066056, 4140412, 3289608, 8079364, 930707, 7562508, 4639369, 7172420, 3645866, 5601960, 4767320, 7171540, 846555, 5605802, 966835, 6319912, 7657299, 6724271, 4204592, 6199311, 1496140, 2600247, 6460036, 575333, 3140761, 2904946, 4189420, 128810, 6277829, 8287700, 2632100, 2328978, 2270411, 2002140, 8196219, 4838449, 7476699, 4839058, 7534547, 7603728, 2229654, 1538848, 5448552, 1222259, 2290175, 4588603, 5418479, 6888593, 67305, 3077630, 6559304, 8061856, 2653731, 2454480, 3716828, 4708789, 6096144, 5396258, 3681897, 7467156, 4935992, 2496386, 6248758, 7495139, 1666863, 7602076, 5390064, 5447301, 6336485, 3699481, 2211020, 2419868, 1453591, 2615131, 3925369, 825927, 5736430, 5423621, 6254954, 6821239, 2329018, 3028946, 3711979, 4371555, 6982840, 3047527, 3472949, 474076, 7036304, 281011, 7723295, 888135, 8070854, 4187236, 7339035, 4154604, 1910138, 5246081, 4995817, 615533, 7088701, 5231837, 5236370, 1829183, 7160374, 3121699, 1033463, 3826144, 7695547, 3099322, 2968862, 24303, 3138159, 6760871, 7837143, 1526795, 8145496, 7287541, 1340234, 7079702, 2083330, 2020024, 1214786, 4387985, 3409602, 8149466, 6633728, 3642563, 6694772, 3887305, 3810114, 7136633, 6632348, 1772669, 1943660, 4172689, 3520596, 3640142, 209007, 5509852, 7180105, 6866326, 8261673, 2898176, 6112304, 6078359, 69387, 5697492, 3110395, 1934616, 6024109, 3122875, 6622067, 4826977, 6924294, 5161335, 2584102, 6170187, 866542, 7774132, 3950266, 4999375, 443161, 6510817, 497947, 2674616, 1546069, 1046341, 5372414, 210093, 7364185, 3155144, 1456933, 7766600, 2333304, 31877, 1872636, 6110672, 492198, 1805611, 7741508, 4697577, 6993366, 6420912, 7252901, 7693800, 2056764, 6111668, 3968137, 5531450, 71296, 5998240, 5071713, 6417306, 4363567, 6115877, 4643270, 2301731, 7891196, 8014678, 331171, 7505871, 7066445, 6019200, 7083623, 5718159, 1343372, 2561800, 3683200, 7545830, 36815, 5741841, 7899689, 1260479, 4245183, 5225179, 1579746, 1870472, 5243726, 2235202, 6758748, 7246537, 4745341, 2341749, 1647664, 5213512, 5845293, 71654, 5892405, 540594, 8183201, 1385311, 8013194, 3128688, 8015745, 6146353, 3289, 278563, 6359999, 7882191, 6044578, 1717058, 6360372, 7548843, 3673434, 5081116, 6476909, 2737732, 6472586, 2037464, 1780154, 6277377, 2811130, 3371746, 4409392], +[4884018, 1834104, 1716750, 2134675, 738715, 6500881, 3749506, 7756242, 4798984, 839580, 4374288, 6594349, 4957820, 3833268, 4854717, 5026124, 4887971, 8266063, 2374510, 4534390, 4244940, 6700412, 5064932, 1740653, 3176286, 5407052, 2804426, 1549771, 4399965, 4171397, 6389351, 3622456, 6890740, 6265030, 7612059, 7563094, 2935736, 612148, 1658284, 7056162, 3627422, 46727, 4290518, 3832242, 764848, 69260, 6348056, 4659881, 7937436, 4467591, 2648158, 6169157, 190998, 7454502, 5029339, 4254842, 4537968, 7951857, 3783101, 2126483, 4547054, 7915148, 2423385, 7618507, 7677942, 5702247, 8177294, 7132576, 3483220, 6490409, 650210, 5023470, 7178639, 7851519, 3348538, 8262357, 5524369, 3337396, 5153700, 1261737, 618698, 548658, 284206, 4462996, 1314300, 7247478, 7985859, 4376482, 992439, 7046636, 2983925, 169681, 3196057, 3405797, 1124945, 1956314, 1077179, 5158564, 6840842, 3763672, 6245051, 3941601, 4456194, 1878173, 5185875, 4110884, 784991, 3986669, 6137913, 2215286, 6736283, 8224310, 7259680, 3256347, 5004191, 3055523, 148234, 3300753, 335896, 4456298, 2197933, 8149121, 3756425, 4384875, 1988363, 6597655, 2767942, 2778572, 6178698, 5954103, 2098717, 1929657, 1080781, 2430868, 4762626, 1921557, 5515714, 2614585, 1548034, 6946369, 4789019, 2479307, 7325766, 5050663, 8065239, 771043, 7696791, 1647168, 2463096, 8021411, 5972364, 1970237, 2621257, 3058563, 4687385, 4527811, 729552, 3593186, 1765160, 1390247, 5020568, 5849086, 2284479, 7126032, 4486257, 2506657, 5437624, 1458586, 2124866, 5632939, 2064428, 1403507, 7299445, 3619294, 7728761, 1801451, 5119570, 4028255, 4703594, 4642233, 6210484, 4454894, 8176971, 3046636, 1162585, 5164136, 1852596, 3782889, 2022539, 2789384, 6704683, 8311660, 3611938, 1901375, 161779, 6623672, 4972046, 7432013, 3888990, 3912506, 6401667, 586786, 4911268, 6063911, 4636930, 7467328, 5724121, 3194433, 679305, 6852234, 2698033, 4610376, 2397698, 1107943, 1720503, 7888978, 4155617, 6314998, 2903304, 725006, 984046, 7468695, 104672, 3636843, 1843773, 159582, 7714271, 989419, 7772945, 7420366, 4422276, 7245700, 7539715, 8108492, 404083, 4889689, 331663, 7651071, 3472997, 6204687, 3424557, 1293236, 3499656, 86280, 4174855, 2586568, 3291416, 8007273, 8297728, 2172045, 6273072, 4529772, 2253785, 1737799, 6210496, 4791729], +[6300625, 312709, 7578314, 4765512, 5751332, 4473565, 3955687, 3515825, 4594367, 5238976, 5518107, 5471968, 3280055, 7655980, 4331616, 3305848, 5170484, 6039557, 3529582, 3872605, 6968974, 878158, 4276178, 5398104, 2703136, 511500, 1843188, 5528909, 808888, 2649800, 736520, 1262056, 3168021, 5960115, 5966518, 1308195, 5139002, 8091225, 7510786, 2751482, 3943316, 1067330, 1092904, 324466, 1906433, 7580573, 2685963, 980522, 4633648, 3198832, 3494682, 5539354, 5443297, 228931, 7074133, 2117040, 4114490, 3068429, 1800101, 3026425, 1490119, 2663247, 2915700, 5884700, 1414492, 17814, 4345193, 6718994, 2454231, 101225, 8171875, 3159896, 2912813, 3356721, 5585506, 5406749, 4413548, 6033024, 3840004, 7309261, 3002178, 6415963, 2662900, 2358526, 6978814, 1116450, 832446, 4943467, 1834107, 4196476, 2082330, 2554159, 7311437, 7655818, 6660009, 7612985, 6127265, 99726, 7850133, 2440820, 4505669, 7136745, 8231094, 2055540, 5283729, 5215513, 305318, 7104242, 6418317, 4616753, 387723, 3533863, 3310249, 1381530, 443639, 2930808, 6782267, 6562021, 1978114, 856783, 3258832, 469270, 831083, 2220615, 5175299, 3121028, 4997764, 5234907, 2898491, 2300691, 7599061, 461501, 8284733, 4499695, 3896556, 4681300, 2143461, 7581633, 4784895, 4772926, 414363, 6311651, 6045824, 1820495, 3220247, 5435900, 1465383, 7601787, 5335546, 5813372, 2461461, 6024770, 7968758, 2526943, 2031286, 7289566, 3110973, 2249455, 695280, 4078542, 6641982, 5351834, 2393854, 3964745, 5790908, 4343694, 8374311, 7710563, 2451668, 2718810, 5978852, 1599885, 6005592, 6116176, 7043536, 4721455, 2413116, 7950752, 6405175, 4483383, 313775, 3941148, 7287860, 7553938, 6005005, 5332276, 1180785, 7515906, 4537302, 5123954, 7486283, 3181913, 4018585, 4247209, 5482573, 1987034, 2183623, 3837230, 2552000, 5388682, 3862657, 4306902, 3965088, 349803, 1666953, 3928016, 1930270, 2911743, 6529876, 1631003, 1988573, 2120731, 6820531, 445217, 5478013, 8374074, 8010527, 8105859, 8202009, 6634652, 2579927, 2676622, 3322662, 3405046, 2362947, 111194, 698365, 4050605, 2845439, 2125681, 2387255, 7967629, 7229835, 7998874, 5497650, 2981832, 1095984, 6617355, 4573597, 7222248, 2031925, 407883, 4419308, 3536144, 6549188, 6625328, 391764, 4067977, 4021279, 6441201, 3821424, 7964685, 6794320, 4969648, 7769158, 3263343]] +aHat * NTT(y): [[6383167, 5388895, 2753697, 7297636, 8193380, 949578, 3459689, 6103335, 829318, 4258269, 1698316, 3262886, 3590053, 1723822, 6050049, 2340081, 2218936, 259632, 1286750, 5466208, 988301, 8096862, 5400869, 7843951, 544667, 3729221, 3181090, 7477757, 7234999, 3144824, 3422397, 7496682, 7205760, 2031660, 1902463, 2490207, 3379182, 2377919, 8354703, 61079, 940468, 3886339, 171178, 7302, 5372084, 7149079, 6905624, 3290960, 7716549, 3730890, 7596310, 4278976, 2654522, 3090463, 5676014, 1642393, 1367713, 2171794, 3419248, 7527308, 2567194, 5900759, 6534760, 3978735, 784637, 7783178, 7573035, 316463, 8008707, 6597969, 3184917, 6689194, 3852923, 3158655, 4104357, 4568209, 509166, 5726701, 7643893, 6642698, 6182097, 2108793, 7581757, 1388000, 2917137, 5479500, 2989279, 2529343, 2061120, 4046367, 1750307, 4350690, 7714129, 3363587, 3034005, 663129, 5918737, 5246228, 6253675, 7806540, 971594, 3130342, 4162808, 6120696, 7032106, 3826217, 5802039, 7649684, 3156467, 5240308, 3459432, 7134258, 8286546, 2631657, 4038870, 5630242, 6224126, 2130379, 7616416, 5588551, 4354877, 6023940, 2240747, 6522625, 7826219, 4996770, 2114352, 1915659, 7529728, 3256594, 1309651, 2864241, 589743, 6127320, 722138, 2289674, 5630098, 2628131, 2152628, 194322, 2784820, 6400690, 4590700, 1982280, 6608424, 6401463, 7598923, 6983302, 4513353, 7887498, 5882936, 3943037, 986851, 5298858, 956212, 3992880, 2809729, 1813991, 4836414, 185443, 1434314, 3434373, 4825956, 1214105, 3520492, 7549833, 6070798, 4243209, 2655259, 1043873, 4111640, 1506852, 248628, 2643368, 1286258, 4940456, 4950386, 3640142, 8250262, 7317648, 8065174, 2681034, 532707, 5070762, 803901, 7375392, 2009538, 1621746, 5057476, 4018633, 3544149, 3073713, 4857797, 3511131, 4811242, 2201335, 7982771, 4773407, 8042258, 3042893, 3111363, 1317773, 716108, 5913349, 920281, 7604962, 683475, 5685011, 7155386, 7760488, 7158805, 5817109, 3937982, 4008700, 6587600, 2570949, 4897663, 6447709, 3875971, 3923382, 4189429, 1199558, 4864103, 7769414, 2984751, 1879171, 4396923, 885658, 6021467, 2225556, 3348034, 192503, 4392196, 7620587, 41616, 4239951, 1608337, 3876200, 5068357, 3186542, 1116787, 1312402, 2852819, 4374178, 3999669, 1030743, 218940, 4851045, 6836136, 306443, 7964414, 1089812, 6995773, 4833481, 4088502, 110861], +[5793986, 6902600, 4839869, 1261213, 2711946, 506657, 3827849, 5672508, 3750631, 7084312, 1015653, 8270028, 8068153, 7227542, 6804588, 3544048, 6854119, 4293689, 7138567, 1977861, 3526826, 4145215, 1047497, 2124417, 7562477, 1288891, 958637, 4349398, 7848641, 2646240, 2145125, 1186676, 3811205, 6464815, 1771375, 808596, 6886051, 7233550, 502795, 8024157, 712890, 3249628, 7960960, 6143486, 1754222, 74487, 108063, 5783563, 3430513, 8157026, 2638585, 75730, 7799412, 5909299, 639594, 7011278, 478257, 2643538, 4433917, 487377, 7814650, 2250363, 5720640, 836424, 4371993, 7969718, 1013177, 4287138, 176937, 7651853, 1513838, 656301, 8132741, 7548005, 3512998, 2917901, 6979858, 5859132, 1934510, 3705832, 6535028, 11512, 181023, 292694, 1629752, 7034193, 2131041, 5100432, 3347647, 8278231, 616283, 1826243, 4399060, 8149267, 5103285, 3209413, 3350252, 7064339, 7218063, 5966979, 6087801, 2253443, 4442952, 2614934, 4625841, 8346675, 2562989, 5206532, 5404807, 5763019, 3725826, 7928415, 1779421, 7865657, 1659185, 1310146, 8185468, 2689562, 6344988, 4007332, 6387721, 4118892, 6298201, 2999166, 4209452, 6743782, 1718916, 862703, 5666252, 1624297, 2587554, 6522551, 752, 4001327, 2927532, 5226134, 7591106, 6815112, 5462522, 1250844, 3652852, 3292605, 1928510, 8339124, 6107431, 2387249, 1154116, 2858652, 1970860, 1599260, 4235014, 884032, 4555033, 7601326, 2761366, 2484567, 6574928, 5775877, 3320815, 4710681, 8046937, 2099353, 4617623, 667310, 3249792, 8199409, 7958315, 4756773, 253126, 3521574, 7821009, 7021709, 4091628, 8357027, 4708139, 27197, 1737578, 2205643, 2756687, 5652735, 2094240, 7738568, 3858293, 7861911, 5598764, 47404, 2159839, 6618611, 7886497, 3817029, 3780821, 6800744, 544239, 993109, 3341063, 6061360, 7257567, 2793495, 5169212, 1331937, 7104982, 3442302, 4169922, 7161824, 7401011, 3714816, 136756, 5504753, 6882836, 6331987, 5798500, 1238678, 6356290, 4472767, 6870401, 354034, 751974, 4469861, 4149625, 2447129, 3845554, 3478916, 8149174, 6953642, 5330169, 1610268, 7578438, 5123733, 5335317, 3893807, 5299948, 1847630, 1098431, 5781978, 8258102, 7326373, 5662517, 7977819, 4567952, 718042, 7150706, 5331435, 8133645, 5238144, 7169390, 1415687, 131939, 3784623, 7816882, 8378356, 7703997, 6435528, 3664500, 5431220, 544829, 3250088], +[6620406, 1208938, 2483134, 4159659, 4242017, 2153241, 4688238, 85178, 4434058, 7370349, 107259, 2984188, 4557561, 7355519, 7582650, 4222455, 531967, 2338919, 3773193, 6326513, 45444, 6930578, 2776498, 2108715, 2675689, 4374398, 4089536, 1020221, 3814410, 3454860, 1430833, 4392253, 2927573, 2920781, 5873486, 6671816, 6152611, 5409260, 1927145, 1691262, 2242207, 78590, 4687686, 7248034, 6185562, 6890480, 3857614, 8167119, 1456238, 2790686, 5403540, 4141184, 4779354, 5848791, 3501984, 286755, 7404398, 7542145, 3084471, 428227, 7354232, 4295890, 6777404, 3293599, 2826983, 4232595, 7494886, 582273, 2670748, 1533550, 5618948, 6123072, 3401165, 1351274, 391116, 4952047, 2887173, 7379326, 3815131, 4265378, 5345258, 2818808, 2503356, 5931100, 4307332, 7690422, 2796910, 5105521, 2440158, 8211370, 5898216, 1983418, 5353500, 3139189, 722112, 3268746, 1233076, 6659561, 5246850, 2414724, 640747, 4260240, 3373968, 7357419, 6090269, 5366655, 3984808, 482294, 4706322, 7705587, 2011809, 3105124, 3979429, 6008877, 7522102, 703470, 1386029, 8004138, 8239622, 7798330, 6970283, 6586951, 2379280, 217546, 2246680, 3316593, 159975, 7296769, 7226031, 1377459, 4967249, 1334910, 5497582, 4214349, 98489, 4680946, 6767066, 7546405, 5627336, 7714574, 4962570, 6303796, 5366617, 496578, 1025896, 3908096, 3870619, 3787218, 4437520, 7037379, 4433508, 2651258, 4087734, 5560235, 1109368, 7777054, 3715094, 2244756, 1368685, 7247961, 753070, 6447420, 4642588, 4460071, 5932529, 1887745, 5027593, 81854, 6867933, 1576963, 7951284, 6362119, 329829, 1769716, 802392, 918154, 6248965, 2123985, 1835338, 6026940, 6668779, 6473678, 7824360, 3872735, 6654676, 4552204, 5045179, 3834912, 7278423, 4452364, 6594753, 251463, 3112166, 6532689, 2462479, 2664036, 2835749, 592268, 752290, 6949532, 1736710, 2261030, 421663, 4653007, 1261821, 2138407, 3245533, 8178667, 693264, 6101230, 1689913, 7673514, 6506189, 7008588, 7078334, 4838916, 7075484, 1836249, 7289778, 6098669, 2465569, 3724275, 6109653, 6988669, 2893268, 4288653, 7842298, 4540321, 3744338, 3863786, 6649425, 4965334, 4330105, 4533788, 4618018, 1063504, 3594989, 8077891, 242302, 2254372, 4869909, 6896494, 2501350, 5640858, 2602676, 6474793, 5662286, 4886610, 1330610, 7002374, 4695611, 1179242, 2121193, 5138098, 3401215, 2603542], +[333269, 6985229, 7829399, 2044999, 7494349, 2575821, 4228064, 3486301, 7088336, 7938171, 5932947, 3900646, 1235313, 420100, 6028493, 3184812, 1774290, 3861296, 4760124, 5856533, 1782609, 7506087, 4676519, 2018507, 758832, 4378820, 3152403, 3243819, 2247988, 2270578, 3696063, 966665, 1044500, 2387649, 4798962, 2503731, 2989366, 2575889, 8379453, 6597217, 2002454, 797454, 3292808, 2654019, 6020701, 1491569, 1714154, 6135966, 5874237, 2739563, 2247865, 6426262, 1211267, 848667, 4793729, 4382223, 5674089, 1555448, 5319165, 7580784, 3093352, 4265289, 7701453, 2080728, 2531871, 4332135, 7191074, 1654746, 6779582, 5096278, 4932905, 4202631, 8133658, 1344809, 6905317, 6344315, 5240022, 5384524, 7884117, 5630446, 3644020, 6903321, 8124046, 5346511, 3096251, 4099574, 5005381, 1671681, 567112, 1708632, 6116799, 7098378, 4577204, 6108672, 5034371, 4450274, 8089595, 69771, 250783, 7242483, 5826638, 2189811, 2259622, 6471961, 6807324, 2311094, 7601816, 4473107, 301870, 1155847, 3369821, 279831, 5202662, 7503844, 2500147, 6678856, 3914391, 1313764, 3567858, 118113, 2214764, 546045, 3828404, 7375457, 6259262, 2839116, 7511620, 4061989, 6520612, 3066830, 99, 2380562, 4573427, 41227, 6437796, 3727253, 7631734, 3364833, 4212888, 4882589, 7661673, 6649688, 6752186, 1403848, 3759092, 7181794, 453273, 1912763, 7515759, 2486028, 4701083, 4152407, 5785245, 258702, 3917604, 5102171, 445303, 7657292, 4550905, 6330029, 1844585, 7182890, 1943102, 1268355, 6182948, 3517994, 6501331, 4219213, 2314346, 3517583, 1945324, 6004228, 7623995, 2941871, 4394556, 1947980, 2207700, 3455089, 3069141, 1740526, 5446583, 5514836, 3245962, 3396104, 3133486, 8245093, 1738626, 920729, 7646709, 1769950, 8333748, 7881342, 424613, 2689209, 891151, 1872610, 797548, 6231512, 1817422, 257148, 7128854, 2386366, 7493453, 4270980, 665666, 4597083, 4162080, 877071, 1584948, 401058, 5863515, 6953058, 6521964, 5705932, 6277122, 6099733, 5870028, 8194636, 472218, 1928227, 6410077, 1465318, 3950810, 7599153, 5172774, 3105375, 2454814, 2108655, 6931233, 2704750, 2287054, 1680701, 4098766, 506508, 5501385, 3116557, 5689431, 6803397, 8007114, 8106903, 909301, 5800427, 2466851, 5560967, 5726254, 715695, 3327159, 5802348, 7591122, 7897997, 3420132, 3661269, 5962014, 5818429, 4824912, 7888478], +[8002922, 6356476, 3200704, 495403, 5361520, 5766923, 5502000, 2114204, 6581657, 3282423, 6757782, 38825, 6257035, 8056386, 7712436, 5855541, 3748426, 6506943, 8329139, 4464736, 6507534, 2755142, 5613066, 750993, 86661, 643315, 2372501, 6971248, 7225574, 2103651, 4958557, 4296738, 2358267, 3953711, 7408981, 7420558, 1405987, 4816642, 7917780, 1637588, 163113, 2746611, 7050095, 4273868, 6469559, 4756221, 7595366, 7836711, 4324483, 8032092, 5084901, 1803445, 3802007, 5106146, 8193263, 1297966, 371192, 4009023, 751843, 5168520, 960959, 2012265, 1545558, 3153065, 2155998, 6139555, 6175634, 4953204, 2037103, 4700911, 5542920, 8327103, 5556920, 5076642, 4337003, 3241027, 3250913, 6240628, 471278, 342677, 5597821, 5335341, 6363946, 2333691, 7875492, 7414343, 403850, 4101607, 4996111, 1526654, 1777407, 510032, 1084541, 6675366, 7589179, 5146888, 6618169, 6568566, 7851947, 6749223, 311456, 92078, 7456259, 6918398, 986611, 6764198, 3821153, 6775638, 5062655, 5313616, 1365167, 1058491, 2329189, 7096056, 531201, 7714036, 2964619, 366539, 4946754, 4880287, 7101834, 3658654, 4560025, 3268280, 7257937, 3519829, 197800, 7796453, 2513366, 5326129, 7361208, 7467539, 1021952, 271166, 3926680, 5693804, 4953979, 4785847, 8181723, 88166, 6396951, 3621240, 2958356, 7917715, 940434, 6199043, 1869959, 4560213, 4220883, 4993433, 3456257, 655933, 4942873, 7729710, 2889092, 99109, 4254805, 4397892, 566716, 7638269, 712702, 3021649, 7459784, 1474592, 6663551, 5497495, 1612528, 3951166, 3464720, 3082792, 8328908, 4906116, 4892144, 1064079, 292156, 4406608, 1372725, 4643784, 6815209, 2576189, 5219012, 4551660, 5759911, 4191285, 4924128, 6663549, 7369862, 2619701, 6693097, 3172635, 1825821, 2593380, 6689077, 1954577, 3525818, 3567008, 7020430, 5176667, 7753976, 7608986, 4888751, 5172767, 4266370, 2213132, 4133048, 1947774, 3093950, 2160885, 2160568, 5344784, 3190244, 1327760, 7765530, 7592291, 5390090, 5593052, 7258840, 7873222, 3441562, 4200566, 6601638, 6047736, 8140218, 3940247, 8160023, 5354035, 525909, 6019834, 6014077, 8130485, 2528636, 3101749, 5707436, 1271089, 1909479, 489462, 3962750, 4410120, 5522107, 738910, 8368031, 6637792, 4290537, 2657149, 4414023, 269274, 6354856, 326716, 8339688, 540728, 4790387, 4361147, 97487, 6036048, 945225, 5138131], +[5661106, 6573239, 2821408, 1276722, 389504, 2855086, 2901224, 6027529, 2089902, 5734306, 3917272, 4420067, 2741469, 7123306, 5328861, 7184809, 5922403, 3792987, 7131702, 6508181, 2565521, 7491204, 7133083, 547108, 1852366, 4524962, 1432494, 8290920, 4589713, 4495051, 221710, 5784450, 1736795, 1104784, 1835790, 1071539, 4068236, 523615, 7163351, 7839177, 7889739, 1951983, 6200379, 1539219, 3736368, 3682694, 4625534, 6025719, 6753962, 5822712, 5298992, 4395515, 2647628, 2291255, 336547, 571109, 8185190, 5155211, 1415484, 7409345, 1242353, 4197744, 1472701, 4417687, 2597418, 5229397, 733629, 8233169, 4858942, 1384871, 2892543, 225120, 5172733, 307803, 1338300, 6026762, 781775, 824139, 4026478, 7005871, 7689104, 6388512, 6823305, 4643865, 6944299, 2813514, 1473472, 4646648, 1987275, 6076897, 3062119, 3824871, 2109975, 395803, 7261372, 1730157, 3812823, 8349213, 1970837, 5109369, 4705527, 1617612, 295474, 1034626, 5947989, 2527807, 5567015, 738044, 5948512, 6398457, 3511141, 7698933, 8020920, 5436925, 2216585, 1675400, 6119146, 3032202, 593676, 4425066, 3989838, 2929091, 6032384, 713368, 6836074, 4577996, 1867829, 8309037, 2612140, 1009446, 2930066, 1556459, 7943715, 2546794, 7244935, 405521, 7302373, 4109582, 3144291, 5621685, 4226472, 5292180, 838588, 6774508, 5653012, 5209670, 6552046, 6066805, 1836991, 948331, 7986259, 1007182, 7359344, 3613107, 4180413, 6459660, 1341670, 6212693, 2871479, 4430008, 5649720, 2772868, 1029216, 4856589, 3699559, 7100015, 2238327, 3261094, 2419540, 5746032, 2752415, 6333743, 5167956, 4502061, 5055476, 5632396, 280655, 2089899, 3876685, 2717944, 8017917, 2162935, 7173919, 7752411, 5891939, 5432384, 3156272, 85495, 4537958, 5934925, 1102270, 7273041, 2908968, 6232318, 945818, 4273456, 347409, 298043, 4136190, 7843207, 2453465, 5912303, 720358, 4294949, 3462945, 549110, 2612011, 4542721, 1249730, 1633754, 905703, 5755286, 3826540, 5637689, 5822804, 6245349, 622956, 3114559, 4005669, 2168127, 3601606, 1668296, 6514298, 4874225, 5385419, 4731276, 3169463, 5791864, 139722, 1598059, 7784919, 2471949, 3648693, 1692137, 7220683, 4748937, 5943103, 6749762, 4239522, 748420, 7642073, 1720391, 2545623, 7905944, 2836641, 523160, 4322759, 2806726, 3140490, 5332117, 6124119, 6427564, 7998811, 3289837, 6726546, 5368865]] +w = NTTInverse(aHat * NTT(y)): [[3560581, 47893, 5288591, 8200619, 834849, 7173375, 1229664, 1212957, 5814018, 7972724, 865753, 2705887, 6967047, 1169987, 6299165, 2230927, 5747033, 968539, 7018837, 3963319, 2940446, 3297448, 471067, 6816052, 6537345, 2510066, 803714, 5477691, 4353991, 1779710, 3416902, 7795092, 352184, 5298713, 1075954, 2871019, 8292845, 7057442, 4601559, 2188293, 5575364, 7510678, 7555217, 1332707, 4508805, 8098440, 1394701, 1975635, 6945976, 1602371, 7817644, 2955713, 269908, 1914372, 4589100, 5937317, 1665225, 873525, 5321045, 4613091, 6430865, 2885704, 7140271, 7589428, 3646, 6681174, 6702006, 6113787, 1966082, 6076989, 3708196, 277882, 4253560, 2816010, 605068, 917566, 4857420, 3253206, 8215493, 6525914, 1667093, 6822873, 4342734, 2270832, 5890261, 6961974, 6619113, 6499398, 4720204, 1529218, 7927435, 203781, 3762654, 4114760, 3435889, 1711170, 6593691, 7410879, 167293, 2246084, 283037, 4536424, 6355651, 4549400, 6495131, 4078178, 2101613, 1417406, 439205, 7210791, 3215811, 6024296, 7379998, 1165848, 1601525, 3794345, 5657793, 2967781, 1982254, 5119236, 6609683, 5828617, 3427811, 6013991, 6638842, 5222433, 5300374, 3908028, 2166583, 6214637, 8324449, 647385, 4104189, 7168943, 5847217, 2795008, 2006675, 1619465, 4193706, 5402444, 6316706, 4028331, 211220, 809342, 6517500, 4166658, 19994, 4348610, 1677739, 7598879, 5980119, 4459704, 6001555, 3529244, 8089376, 5135326, 6438497, 1967075, 5287711, 5292117, 5052047, 1103132, 6140519, 5948513, 5995476, 6354, 1076114, 5085041, 478804, 4184563, 3752466, 2195167, 395822, 4019811, 5060103, 4648674, 2077720, 6682998, 6246277, 5968220, 6499937, 6008370, 1495549, 596465, 1140002, 5195674, 1596165, 7690383, 7132355, 8115414, 7240498, 8096549, 4024327, 8284365, 4749927, 1417427, 2608184, 7253097, 2985448, 221501, 5312702, 7829279, 4642597, 2920620, 1444049, 5767437, 5568386, 4488731, 5351482, 3188181, 5603141, 7893555, 474242, 359226, 1212081, 7973926, 7576472, 3913522, 1823000, 2702354, 3036837, 6110663, 1402859, 6688171, 3725517, 3381884, 2539286, 3221850, 4687665, 1135633, 4830850, 2518811, 8168301, 2930008, 344314, 7425812, 5972476, 3264369, 7274883, 6060673, 1825258, 2485475, 935043, 3201054, 7080142, 1311164, 5343774, 4198060, 7668976, 5190034, 3274382, 3364560, 937807, 4630638, 4105309, 1965713], +[6961642, 3484739, 2479972, 1449358, 8013470, 4837783, 7805497, 2836973, 1408896, 7993132, 3700401, 1086372, 2082514, 4723986, 3024999, 1584431, 5086733, 6534440, 6662558, 6686379, 3870275, 4677946, 4136813, 8270140, 879277, 3670254, 8345816, 336602, 7967744, 7726550, 3616238, 4050373, 1776309, 5580633, 4430706, 3399863, 278515, 347199, 7471497, 4590175, 2252110, 3611252, 2809445, 3175375, 6479949, 3987081, 1675252, 5670162, 1790023, 7067593, 3151621, 5531241, 2155057, 5858397, 2893870, 5917925, 6395490, 3991043, 8323549, 3426396, 3986170, 4252519, 4490997, 2592727, 7113470, 2982476, 5647700, 5145743, 8261597, 6921792, 7511841, 2447065, 873877, 3723981, 2712988, 2953526, 7638227, 7064500, 3521836, 3657185, 328989, 5486054, 1214093, 6384798, 1049971, 6339330, 7014976, 1320357, 231029, 4576685, 41902, 5588335, 7893691, 2948868, 7480709, 5660302, 2284937, 3446783, 6265836, 649368, 1278124, 173855, 3041040, 19969, 4413062, 6923047, 6589253, 3279261, 4182101, 8043041, 5823495, 3337812, 2393085, 5526652, 4779217, 1634990, 7682900, 7312253, 2261502, 3600536, 881105, 5057144, 5248203, 3430020, 4965277, 1489581, 4381682, 5689774, 4412375, 4980102, 6194320, 2563916, 1641029, 6195354, 8165958, 7866565, 2239219, 3295823, 6505220, 5601528, 3775603, 518322, 1056137, 2875427, 5891809, 6798457, 7792185, 5887914, 964893, 3253677, 4986017, 7808080, 7467912, 5625014, 6234290, 1823425, 2340269, 5836329, 2140921, 4347475, 5148510, 3487715, 590995, 4601511, 1614104, 239228, 3482779, 5563011, 510939, 1283481, 8347221, 2493439, 7070049, 6442850, 4901772, 5940119, 5395991, 2336639, 2848985, 3652179, 2065301, 2794226, 5191502, 4545973, 3651233, 531349, 2338577, 894736, 6920476, 4903608, 1405740, 6724784, 5187308, 5784424, 4172409, 4948190, 3354463, 7612631, 2506172, 5603382, 6713447, 2735253, 4879748, 7639983, 2424189, 5164997, 2726431, 2894678, 3483015, 1231417, 3943949, 7402314, 6951291, 7268549, 5582547, 4314671, 3415701, 1888974, 8172665, 6681366, 8333275, 4986530, 8063276, 3438475, 2851017, 7696109, 6696056, 7111145, 5786721, 2020099, 3988339, 6996409, 6653730, 4743711, 1944706, 6257845, 3208406, 5762026, 409630, 5814578, 4840761, 4971672, 2827966, 1128233, 5857920, 7301381, 6449539, 5458030, 897079, 4575349, 1215354, 2185679, 2751570, 153840, 1127663, 31614], +[5096358, 422070, 3170040, 6476022, 5911345, 7986735, 2113252, 7663839, 2065385, 7854462, 7812243, 3611040, 2679424, 4523455, 3713978, 4505890, 926983, 147714, 2925664, 1660502, 1015544, 654887, 204317, 2974297, 189811, 2540669, 5860645, 1293791, 2309477, 5948909, 6658992, 1289208, 3600121, 1839961, 744193, 1945126, 4048464, 3662296, 8102655, 1125312, 4664713, 6465638, 8306464, 1418408, 3866891, 2250370, 7509810, 4038944, 2889596, 2150982, 1857313, 4802959, 3318030, 4129799, 3784580, 2916867, 5238015, 479458, 5917104, 2225189, 3327893, 2318020, 6644540, 5216054, 945640, 1384138, 623374, 3547217, 2200796, 5782269, 5887322, 5793678, 576357, 1960632, 4159218, 5833760, 3695305, 3515657, 5769278, 5672041, 6366965, 5444125, 4361363, 8121299, 269831, 5878556, 2179526, 4806772, 4726746, 3887114, 6252576, 2763463, 7287204, 8239720, 5332741, 7467010, 1531080, 309107, 2825868, 4862944, 6866240, 4270958, 2185881, 1114348, 6903714, 8189693, 8061318, 2556445, 7376134, 3701575, 6684008, 6058225, 3672822, 4115488, 4752006, 145903, 6313143, 2532818, 7544706, 6287779, 6778084, 7076655, 7957409, 8017176, 2387687, 1162073, 6473806, 564878, 2147155, 7247584, 4324527, 3486663, 8349401, 42332, 6531065, 3817554, 1594275, 6232985, 4672619, 4737752, 6537235, 5965074, 3108576, 8134567, 3987056, 5016888, 4912676, 6629206, 1647598, 4206028, 1203621, 7867596, 7595540, 7533561, 7090887, 1595691, 3325617, 2435049, 5377599, 3424203, 6626239, 5097768, 5884191, 5151559, 3243445, 6762359, 4072641, 7768207, 3327939, 2841264, 5011722, 1530358, 2253580, 4293661, 2984613, 7183142, 2300536, 6773074, 7429307, 4740280, 4451160, 2600791, 4853681, 8338857, 4609106, 8228015, 695592, 1012199, 6337226, 169199, 7826370, 17044, 7329286, 6908146, 5156911, 2668033, 6825389, 4418449, 1387011, 4278996, 3577606, 2710166, 7054483, 3027135, 5144246, 354693, 5693778, 837278, 6042024, 6619496, 739186, 6228943, 7256241, 3595784, 5548110, 7320505, 4893032, 224626, 4144287, 8270774, 5585253, 2142355, 6958797, 8014502, 7734836, 905113, 7603650, 5216809, 7811624, 4062677, 289663, 6159566, 6060985, 2251615, 3930569, 5928478, 719498, 2079625, 468508, 2479217, 1673009, 6305862, 8029123, 7790039, 4855199, 1494007, 5943930, 4746973, 5289579, 5837713, 5570777, 660330, 5063442, 6816136, 7401711, 5839623], +[704273, 5776085, 2600625, 1078246, 3077689, 4016262, 6143076, 2814363, 2007902, 718889, 6315143, 5611001, 770448, 1006217, 2380057, 5993455, 1499884, 2510093, 3055077, 6383997, 7335234, 1897201, 7126676, 1060138, 3570341, 5621485, 4109110, 6774372, 5313807, 2322296, 179011, 8298742, 5857566, 6374357, 1146815, 6922826, 3110595, 2933514, 7831594, 4020690, 39560, 3620157, 7418598, 3864034, 1018115, 7206187, 4645005, 1376609, 2305551, 2753562, 4840839, 5201172, 1271620, 6623737, 5144377, 6150656, 5714850, 7852361, 3269106, 5460272, 6291934, 1883313, 7601969, 6166014, 7218828, 3016717, 2582125, 322787, 5354252, 352696, 6607577, 7704960, 4176995, 6368893, 725937, 6213310, 2060432, 3668989, 3976494, 1838006, 3970154, 6895099, 5596020, 7404413, 3642522, 4373247, 2334782, 2239907, 7344370, 931268, 3890890, 6849156, 3367981, 3199985, 8097010, 7198090, 6593243, 6086047, 1629682, 2605764, 231285, 7331630, 1856787, 4405266, 8180110, 232993, 3066755, 1110723, 1137087, 844480, 360130, 3130612, 3970194, 6295411, 7707905, 1586503, 3784741, 4916926, 7927390, 6043553, 1809522, 45024, 3981154, 684652, 5281117, 781944, 4482335, 5123982, 5675172, 3336658, 1018129, 5465053, 5502181, 1897364, 8075790, 2162090, 1317013, 7149635, 4400947, 6386109, 4466326, 2545059, 1517489, 5437827, 8267557, 5950926, 2827346, 6391776, 2817502, 323230, 4294534, 398434, 6767654, 7012504, 7811744, 5331354, 5006953, 3331026, 5195867, 1981906, 7708855, 6165657, 2974611, 7269533, 942973, 2073723, 3901212, 1691482, 37414, 3901020, 360184, 4107696, 6579878, 5701040, 5978545, 7461908, 6083150, 2627786, 641211, 2922861, 3126498, 7721401, 7632081, 2549884, 1726727, 3973143, 1909862, 6699946, 4005440, 1459097, 341886, 940931, 7155103, 7931745, 8135242, 4566384, 791477, 5707083, 4333437, 408252, 393997, 4752773, 7564053, 5308611, 6278397, 3456360, 1356824, 5091302, 1386904, 5952371, 6803713, 3292952, 5381139, 2616410, 1087287, 6702625, 5863702, 2295817, 969269, 2144980, 7800354, 3842637, 1098122, 2064427, 2846131, 2107047, 4760328, 4690298, 112343, 7952602, 1140400, 2440225, 5234035, 3413665, 7863268, 6616032, 3611122, 2385948, 7209573, 5463402, 4759871, 1880773, 236638, 4450394, 1593713, 3048047, 73828, 8184230, 6533947, 2234954, 1953596, 8062595, 1907606, 2189734, 395202, 4604308], +[3613665, 3422873, 1730137, 4425630, 1807693, 2072178, 5552526, 8069541, 1839440, 3881383, 3529565, 5943798, 4459292, 8360561, 4002504, 4938829, 6556823, 5231116, 1092411, 564561, 4387299, 7491967, 5300401, 5641994, 359422, 5732668, 1230552, 3361077, 1326898, 2974415, 6289856, 6206119, 6592133, 5498431, 7174769, 3616225, 788790, 5956531, 2192787, 439069, 6065035, 2716272, 7214867, 6273613, 7384407, 7434380, 7686243, 104554, 4765126, 5968179, 6057059, 6588805, 8117286, 6049247, 1771492, 4191016, 3611300, 3011553, 4420930, 4447018, 7124454, 6867246, 1749149, 2203846, 6703127, 1447917, 6436318, 1692011, 2291578, 2876848, 4130676, 4015780, 2326462, 1124561, 1900747, 920906, 3555623, 8309887, 5502508, 6813400, 5708917, 1316140, 1940846, 7912974, 5596430, 1671495, 6143436, 6713727, 6140098, 5898400, 532019, 3866667, 4946911, 6200001, 8352985, 1328075, 4774734, 2549466, 1075390, 6190731, 6158586, 4144719, 2738197, 6898525, 8188803, 6242611, 435252, 305708, 6722922, 5636074, 4610338, 6973490, 1478679, 2173633, 3567260, 4089162, 7936307, 3235472, 6685602, 3465068, 1069452, 3231388, 1473631, 279144, 2943212, 5576138, 5991558, 5827368, 8087992, 1265812, 1747692, 2087966, 8371997, 4766254, 3796463, 891130, 5865960, 1277452, 5879363, 8254700, 3980450, 6244336, 4083854, 4141485, 2488231, 4466629, 3263556, 2398503, 2796671, 862841, 165730, 3280413, 3685203, 3528368, 3894637, 229385, 4527799, 6132368, 67987, 5674424, 1528089, 3498247, 6661515, 4112767, 3384026, 5433189, 1062052, 7786653, 198027, 6546258, 415637, 6671155, 6288900, 6365882, 2436805, 1774041, 137863, 5362215, 1864283, 6028153, 8147904, 7896054, 1511383, 1405614, 1449602, 2930764, 2821658, 5379695, 4210407, 6220193, 3821030, 8040041, 3497992, 3570805, 8193286, 3181360, 5030155, 702118, 5610832, 4656790, 6269843, 3886761, 5643012, 6398921, 8012343, 1197002, 5905263, 559546, 5107350, 6662446, 1242427, 3849841, 1287793, 6947627, 6488924, 1535700, 1192573, 4695166, 2222302, 8029771, 8270055, 7640146, 2728890, 7303873, 722843, 5352439, 6497969, 7859722, 1472723, 694897, 3414080, 5286740, 6587156, 4921312, 8191030, 3323565, 355314, 6739809, 2462264, 1993441, 3945428, 4570654, 6680459, 8281205, 6795615, 6440093, 7756294, 7669209, 4775686, 7193631, 3709886, 3348792, 1587237, 6015981, 7366448, 6551765], +[3091295, 302460, 2319179, 3122367, 195581, 1653957, 2849648, 5808127, 3114670, 3607370, 3964281, 7728063, 3014534, 2250510, 4249954, 803192, 1090359, 5150345, 6966784, 2402593, 6287862, 1057218, 4314541, 4762512, 7170223, 3871709, 4099455, 1177180, 6473978, 4123591, 5947177, 8123569, 3262501, 966252, 4921457, 4179500, 121687, 5417066, 1344204, 2075093, 986674, 139857, 4024509, 667631, 7134233, 2658370, 6661809, 2911611, 346059, 7490518, 1357325, 188991, 5173577, 124296, 62955, 3575803, 1147827, 2808550, 3879413, 1316239, 1551728, 1612884, 1503550, 1581638, 4325252, 8267491, 2079654, 3775032, 4394182, 1705982, 663087, 6890226, 4288042, 7654884, 872629, 925007, 6379675, 261703, 1115376, 2328826, 576687, 2639328, 2090639, 3279025, 22171, 5945590, 2241826, 364298, 463703, 5489614, 627217, 652356, 1481830, 673709, 5795042, 6521338, 6707501, 7491103, 817257, 503570, 8044756, 7191420, 8102199, 3301042, 1175039, 3579581, 48366, 1665725, 1762058, 6266878, 7649525, 1732491, 7743552, 7280460, 8130751, 4654330, 6520048, 6919414, 2690958, 6181350, 1646868, 1384884, 1248670, 1050673, 7372059, 6209385, 4725695, 5354441, 6726069, 482663, 5094710, 7778712, 5245259, 600121, 7724059, 1081459, 4936424, 707986, 4658852, 8339672, 5060099, 5170933, 8315859, 8209185, 6963764, 3972477, 3142098, 6040064, 2134207, 352545, 1328796, 3131583, 5793515, 3859730, 2001804, 1120625, 516475, 3887911, 5708153, 4343385, 5923057, 2384733, 254505, 5936727, 6977748, 3095137, 4951127, 5678529, 5807105, 7959348, 2513922, 1603202, 1784340, 7169513, 818905, 2165469, 1171097, 1844403, 1474606, 3463776, 314806, 6200799, 5984361, 5175056, 2905720, 4769158, 8343819, 2676529, 4191877, 1468760, 5698425, 620062, 3423297, 1898007, 7420177, 3514014, 8038510, 5191428, 2158712, 4136628, 2327661, 1582861, 6981377, 829241, 3585017, 3070000, 3888781, 2598875, 7741465, 3741547, 1694808, 4155121, 6529649, 7651713, 4533788, 6355492, 1565749, 7811549, 5149638, 3506758, 1040557, 7489820, 3864747, 2044442, 3027174, 7559442, 1091508, 4726288, 5328101, 1693165, 8195524, 1792806, 5585489, 5905929, 3794503, 7180440, 5667120, 6919859, 791559, 5772061, 7755425, 4168604, 7309471, 12123, 8328017, 1651763, 5164827, 997835, 6895367, 249889, 4656083, 5246296, 1173750, 3712555, 6889404, 5969362]] + +w1: [[7, 0, 10, 0, 2, 14, 2, 2, 11, 15, 2, 5, 13, 2, 12, 4, 11, 2, 13, 8, 6, 6, 1, 13, 12, 5, 2, 10, 8, 3, 7, 15, 1, 10, 2, 5, 0, 13, 9, 4, 11, 14, 14, 3, 9, 15, 3, 4, 13, 3, 15, 6, 1, 4, 9, 11, 3, 2, 10, 9, 12, 6, 14, 14, 0, 13, 13, 12, 4, 12, 7, 1, 8, 5, 1, 2, 9, 6, 0, 12, 3, 13, 8, 4, 11, 13, 13, 12, 9, 3, 15, 0, 7, 8, 7, 3, 13, 14, 0, 4, 1, 9, 12, 9, 12, 8, 4, 3, 1, 14, 6, 12, 14, 2, 3, 7, 11, 6, 4, 10, 13, 11, 7, 11, 13, 10, 10, 7, 4, 12, 0, 1, 8, 14, 11, 5, 4, 3, 8, 10, 12, 8, 0, 2, 12, 8, 0, 8, 3, 15, 11, 9, 11, 7, 15, 10, 12, 4, 10, 10, 10, 2, 12, 11, 11, 0, 2, 10, 1, 8, 7, 4, 1, 8, 10, 9, 4, 13, 12, 11, 12, 11, 3, 1, 2, 10, 3, 15, 14, 15, 14, 15, 8, 0, 9, 3, 5, 14, 6, 0, 10, 15, 9, 6, 3, 11, 11, 9, 10, 6, 11, 15, 1, 1, 2, 15, 14, 7, 3, 5, 6, 12, 3, 13, 7, 6, 5, 6, 9, 2, 9, 5, 0, 6, 1, 14, 11, 6, 14, 12, 3, 5, 2, 6, 14, 3, 10, 8, 15, 10, 6, 6, 2, 9, 8, 4], +[13, 7, 5, 3, 15, 9, 15, 5, 3, 15, 7, 2, 4, 9, 6, 3, 10, 12, 13, 13, 7, 9, 8, 0, 2, 7, 0, 1, 15, 15, 7, 8, 3, 11, 8, 6, 1, 1, 14, 9, 4, 7, 5, 6, 12, 8, 3, 11, 3, 13, 6, 11, 4, 11, 6, 11, 12, 8, 0, 7, 8, 8, 9, 5, 14, 6, 11, 10, 0, 13, 14, 5, 2, 7, 5, 6, 15, 13, 7, 7, 1, 10, 2, 12, 2, 12, 13, 3, 0, 9, 0, 11, 15, 6, 14, 11, 4, 7, 12, 1, 2, 0, 6, 0, 8, 13, 13, 6, 8, 15, 11, 6, 5, 11, 9, 3, 15, 14, 4, 7, 2, 10, 10, 7, 9, 3, 8, 11, 8, 10, 12, 5, 3, 12, 0, 15, 4, 6, 12, 11, 7, 1, 2, 5, 11, 13, 15, 11, 2, 6, 10, 15, 14, 11, 12, 3, 4, 11, 4, 8, 10, 7, 1, 9, 3, 0, 7, 11, 1, 2, 0, 5, 13, 12, 9, 11, 10, 4, 5, 7, 4, 5, 10, 9, 7, 1, 4, 2, 13, 9, 3, 13, 10, 11, 8, 9, 6, 15, 5, 11, 13, 5, 9, 15, 5, 10, 5, 6, 7, 2, 8, 14, 13, 14, 11, 8, 7, 4, 0, 13, 0, 10, 15, 7, 5, 15, 13, 14, 11, 4, 8, 13, 13, 9, 4, 12, 6, 11, 1, 11, 9, 9, 5, 2, 11, 14, 12, 10, 2, 9, 2, 4, 5, 0, 2, 0], +[10, 1, 6, 12, 11, 15, 4, 15, 4, 15, 15, 7, 5, 9, 7, 9, 2, 0, 6, 3, 2, 1, 0, 6, 0, 5, 11, 2, 4, 11, 13, 2, 7, 4, 1, 4, 8, 7, 15, 2, 9, 12, 0, 3, 7, 4, 14, 8, 6, 4, 4, 9, 6, 8, 7, 6, 10, 1, 11, 4, 6, 4, 13, 10, 2, 3, 1, 7, 4, 11, 11, 11, 1, 4, 8, 11, 7, 7, 11, 11, 12, 10, 8, 0, 1, 11, 4, 9, 9, 7, 12, 5, 14, 0, 10, 14, 3, 1, 5, 9, 13, 8, 4, 2, 13, 0, 15, 5, 14, 7, 13, 12, 7, 8, 9, 0, 12, 5, 14, 12, 13, 14, 15, 15, 5, 2, 12, 1, 4, 14, 8, 7, 0, 0, 12, 7, 3, 12, 9, 9, 12, 11, 6, 0, 8, 10, 9, 13, 3, 8, 2, 15, 15, 14, 14, 3, 6, 5, 10, 7, 13, 10, 11, 10, 6, 13, 8, 15, 6, 5, 10, 3, 4, 8, 6, 14, 4, 13, 14, 9, 8, 5, 9, 0, 9, 0, 1, 2, 12, 0, 15, 0, 14, 13, 10, 5, 13, 8, 3, 8, 7, 5, 13, 6, 10, 1, 11, 2, 12, 13, 1, 12, 14, 7, 11, 14, 9, 0, 8, 0, 11, 4, 13, 15, 15, 2, 15, 10, 15, 8, 1, 12, 12, 4, 8, 11, 1, 4, 1, 5, 3, 12, 15, 15, 9, 3, 11, 9, 10, 11, 11, 1, 10, 13, 14, 11], +[1, 11, 5, 2, 6, 8, 12, 5, 4, 1, 12, 11, 1, 2, 5, 11, 3, 5, 6, 12, 14, 4, 14, 2, 7, 11, 8, 13, 10, 4, 0, 0, 11, 12, 2, 13, 6, 6, 15, 8, 0, 7, 14, 7, 2, 14, 9, 3, 4, 5, 9, 10, 2, 13, 10, 12, 11, 15, 6, 10, 12, 4, 15, 12, 14, 6, 5, 1, 10, 1, 13, 15, 8, 12, 1, 12, 4, 7, 8, 4, 8, 13, 11, 14, 7, 8, 4, 4, 14, 2, 7, 13, 6, 6, 15, 14, 13, 12, 3, 5, 0, 14, 4, 8, 0, 0, 6, 2, 2, 2, 1, 6, 8, 12, 15, 3, 7, 9, 15, 12, 3, 0, 8, 1, 10, 1, 9, 10, 11, 6, 2, 10, 11, 4, 15, 4, 3, 14, 8, 12, 9, 5, 3, 10, 0, 11, 5, 12, 5, 1, 8, 1, 13, 13, 15, 10, 10, 6, 10, 4, 15, 12, 6, 14, 2, 4, 7, 3, 0, 7, 1, 8, 13, 11, 11, 14, 12, 5, 1, 6, 6, 15, 15, 5, 3, 8, 4, 13, 8, 3, 1, 2, 14, 15, 0, 9, 2, 11, 8, 1, 1, 9, 14, 10, 12, 7, 3, 10, 3, 11, 13, 6, 10, 5, 2, 13, 11, 4, 2, 4, 15, 7, 2, 4, 5, 4, 9, 9, 0, 15, 2, 5, 10, 7, 15, 13, 7, 5, 14, 10, 9, 4, 0, 8, 3, 6, 0, 0, 12, 4, 4, 15, 4, 4, 1, 9], +[7, 7, 3, 8, 3, 4, 11, 15, 4, 7, 7, 11, 9, 0, 8, 9, 13, 10, 2, 1, 8, 14, 10, 11, 1, 11, 2, 6, 3, 6, 12, 12, 13, 10, 14, 7, 2, 11, 4, 1, 12, 5, 14, 12, 14, 14, 15, 0, 9, 11, 12, 13, 15, 12, 3, 8, 7, 6, 8, 8, 14, 13, 3, 4, 13, 3, 12, 3, 4, 5, 8, 8, 4, 2, 4, 2, 7, 0, 11, 13, 11, 3, 4, 15, 11, 3, 12, 13, 12, 11, 1, 7, 9, 12, 0, 3, 9, 5, 2, 12, 12, 8, 5, 13, 0, 12, 1, 1, 13, 11, 9, 13, 3, 4, 7, 8, 15, 6, 13, 7, 2, 6, 3, 1, 6, 11, 11, 11, 15, 2, 3, 4, 0, 9, 7, 2, 11, 2, 11, 0, 8, 12, 8, 8, 5, 9, 6, 5, 5, 2, 0, 6, 7, 7, 7, 0, 9, 12, 0, 11, 3, 7, 13, 8, 6, 10, 2, 15, 0, 12, 1, 13, 12, 12, 5, 3, 0, 10, 4, 12, 0, 15, 3, 3, 3, 6, 5, 10, 8, 12, 7, 15, 7, 7, 0, 6, 10, 1, 11, 9, 12, 7, 11, 12, 15, 2, 11, 1, 10, 13, 2, 7, 2, 13, 12, 3, 2, 9, 4, 15, 0, 15, 5, 14, 1, 10, 12, 15, 3, 1, 7, 10, 13, 9, 0, 6, 1, 13, 5, 4, 8, 9, 13, 0, 13, 12, 15, 15, 9, 14, 7, 6, 3, 11, 14, 13], +[6, 1, 4, 6, 0, 3, 5, 11, 6, 7, 8, 15, 6, 4, 8, 2, 2, 10, 13, 5, 12, 2, 8, 9, 14, 7, 8, 2, 12, 8, 11, 0, 6, 2, 9, 8, 0, 10, 3, 4, 2, 0, 8, 1, 14, 5, 13, 6, 1, 14, 3, 0, 10, 0, 0, 7, 2, 5, 7, 3, 3, 3, 3, 3, 8, 0, 4, 7, 8, 3, 1, 13, 8, 15, 2, 2, 12, 0, 2, 4, 1, 5, 4, 6, 0, 11, 4, 1, 1, 10, 1, 1, 3, 1, 11, 12, 13, 14, 2, 1, 15, 14, 15, 6, 2, 7, 0, 3, 3, 12, 15, 3, 15, 14, 0, 9, 12, 13, 5, 12, 3, 3, 2, 2, 14, 12, 9, 10, 13, 1, 10, 15, 10, 1, 15, 2, 9, 1, 9, 0, 10, 10, 0, 0, 13, 8, 6, 12, 4, 1, 3, 6, 11, 7, 4, 2, 1, 7, 11, 8, 11, 5, 0, 11, 13, 6, 9, 11, 11, 15, 5, 3, 3, 14, 2, 4, 2, 4, 3, 7, 1, 12, 11, 10, 6, 9, 0, 5, 8, 3, 11, 1, 7, 4, 14, 7, 15, 10, 4, 8, 4, 3, 13, 2, 7, 6, 7, 5, 15, 7, 3, 8, 12, 15, 9, 12, 3, 15, 10, 7, 2, 14, 7, 4, 6, 14, 2, 9, 10, 3, 0, 3, 11, 11, 7, 14, 11, 13, 2, 11, 15, 8, 14, 0, 0, 3, 10, 2, 13, 0, 9, 10, 2, 7, 13, 11]] +w1Encode: 070AE222FB522D4C2B8D66D15CA238F7A152D049EB3EF9433D6F41B9239A6CEED0CDC417582169C0D348DBCD390F8737ED40919C8C34E1C62E736BA4BDB7AD7AC410E85B34A88C208C80F39B7BAF4CAA2ABC0BA28147819AD4BCBC13A2F3FEFE0839E506FA69B39B6AFB11F27E53C6D36765295960E16BCE53623E8AAF6692487D359F5FF3279436CADD97087210FF87B368119E74658CB3D3B6B4B68C7088596EABD05E7265DF77A1C2C23D90B06FBE741C0206D86DF86BB539EF74A27A39B8A85CC3F064BC1752DBBF62FABE3CB4847A9103B72150CDB94A75549A17249DD3BA98F6B55DF9A56527E8ED8B47D0A07FF5ED4BD89DC4B6B19925EBAC924205021AC6FBF4F47F959702361260502BB42D4741782FC930478E469486671A4B46AD3271B4BB41B877BBAC08B194795C0EEA13958D240D5F7ECD87095CCEEDFF251CE478007CC399BC06A8D983F2EF3E567AADABD6F8563A84E6D49E580909210C0FDE5A8D83576D1A2BDCC17EEB09084BFD2FAF8FC14CB84151C3FF399BBA1BDABEB125865C14BC21B553C64E2EB7D84A00CBD2668F707EE23954A9D2CAFBA64CCF6E151AFDC8C17448D8EB87442ED766EFCD53E08400262261C83F97CF03181AA96BA24B4FE3C859A3B0C51518DDAF6A4ACFE642377081BDEB5C61F65F83D43821FE90B21891AE7CA3B36D5AD24B427F424599F0527ADF57AE498063004CF44491778343FB74B70998AD12E8BAB16263CCAD7EB2145CCEEE0FB9DCCF836788DE433D3C5488242407DB3BF43BDCBC71C93059C28CD5C011BDD943876F7D6213B6BB2F4390272B0BC888955625607707C9B0738DA6F2C0D1CC35A0C4F03363A5C8F777601A9B7CCB2F1BDA72D23C92F4F0E5A1FC13A79D60D145980DCDFFE967B3DE166430B576F84628A25D2C987E288C0B2689A04302185E6DE1030A7052373333087438D1F8220C425164B014A11113CBED12EF6F7230C33FEF90DCC53322CEA91DFA1A2F1909AA008DC614637B24718B5BB06DB9FB35E3424273C1AB9650381B477EAF84342D67577F83FCC9F37AE247E6923A30BBE7DBB28F0E302A0DA972BD + +cTilde: 765AB68AC204B255699618463D65D693A1845D574181D1403972888A76B3A553F79FEFD05FF22F37A99C525FCE21F283 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1] +cHat: [7697636, 1304167, 3143043, 85116, 8042507, 4596675, 4883028, 3726575, 8346936, 3126137, 5967592, 3809195, 8123177, 5908107, 706054, 5801063, 2838270, 8239964, 4241496, 60602, 50092, 69397, 1948883, 1880956, 2845997, 8026707, 6877645, 8268845, 8275650, 6073602, 1340711, 7321070, 1760166, 2415040, 6907118, 4882128, 4911996, 1503219, 5765478, 1264484, 4741842, 2748186, 3716580, 984221, 4296663, 1349212, 7532645, 1195901, 2982898, 7128083, 6630759, 683299, 7245579, 794503, 6121664, 5644943, 418808, 3438417, 6712607, 7386647, 8083030, 5245429, 1864829, 4275295, 851434, 3629055, 6123265, 5826055, 138135, 4513773, 2021722, 4337747, 3674854, 4886678, 8312413, 5637757, 3145972, 2947478, 3479015, 1301260, 2861478, 117338, 4515896, 6037872, 1869025, 3820331, 873222, 1712911, 5809085, 1177662, 4860561, 6967091, 2583834, 4712152, 1802060, 3641516, 1682099, 6783366, 4392824, 3527811, 3887959, 8302943, 315084, 7170207, 4018559, 5033985, 212217, 5899680, 3089349, 7519477, 2985200, 3367707, 999188, 4834843, 3467509, 6670077, 6275668, 1400365, 3248508, 2861002, 2775686, 5405093, 7522027, 5767165, 4069683, 5528306, 628368, 1496816, 6461093, 2024183, 4059993, 892265, 8046234, 4593705, 4811641, 5312964, 3398982, 6055791, 7739228, 2597791, 5142163, 5638808, 3798159, 4137253, 2778395, 6380083, 3448622, 8298681, 101913, 7383430, 962108, 83596, 2604891, 70272, 5934110, 3519532, 1441675, 8361631, 2764042, 8320364, 6850205, 5741156, 2022274, 48444, 2215734, 3752657, 1502099, 2857379, 8125333, 2082959, 1427368, 185150, 4288283, 1078563, 7882134, 2755862, 555240, 5250242, 6047762, 2363257, 229707, 2536807, 4657452, 45750, 6715136, 7849401, 3335201, 6872402, 5262666, 7814443, 5715872, 2529210, 1833890, 8149650, 2602783, 3507212, 1495787, 175709, 1037870, 8055259, 3812733, 2826283, 7916225, 2095505, 7761282, 6552140, 5280086, 3652854, 1477474, 1737168, 1896077, 2102498, 6823468, 3934389, 1849891, 564637, 488022, 3976904, 8155982, 5076302, 6095157, 1362531, 2330093, 6026084, 6409827, 2879815, 1626977, 7393474, 7738584, 7828981, 5589091, 3432961, 2764021, 2144367, 1752218, 6173004, 4071607, 7921448, 3180477, 7187411, 3163155, 18859, 4489661, 4080780, 5664455, 1417835, 3490159, 1398652, 3588983, 1169145, 7827560, 4425621, 5129479, 584985, 382330, 7867952] +cs1: [[1, 33, 8380400, 8380409, 8380401, 2, 41, 8380409, 8380415, 8380408, 9, 8380396, 14, 8380411, 37, 30, 8380399, 7, 29, 5, 8380412, 8380397, 4, 8380398, 11, 0, 18, 7, 8380401, 48, 6, 8380394, 15, 15, 8380407, 5, 5, 13, 7, 8380408, 20, 22, 8380414, 8380390, 8380411, 11, 5, 5, 4, 24, 35, 21, 8380408, 8380395, 8380402, 16, 8380409, 14, 8380387, 6, 9, 8380391, 4, 8380409, 2, 35, 8380397, 8380394, 11, 17, 7, 0, 19, 9, 0, 8380414, 8380394, 8380415, 8380408, 16, 8380402, 7, 8380401, 8380403, 8380385, 8380408, 8380406, 10, 8380393, 8380416, 17, 6, 39, 13, 8380374, 8380413, 14, 5, 8380389, 8380401, 8380402, 4, 8380399, 8380404, 8380404, 5, 7, 11, 5, 22, 8380393, 8380400, 8380387, 12, 22, 6, 6, 8380406, 8380408, 8380415, 19, 8380397, 8380387, 8380410, 8380403, 3, 8380409, 8380414, 8380407, 8380382, 11, 30, 8380413, 2, 0, 8380401, 8380407, 19, 8380405, 8380402, 33, 8380406, 8380415, 19, 34, 8380406, 8380409, 8380405, 16, 8380400, 8380388, 8380398, 29, 21, 8380416, 8380403, 10, 8380403, 12, 8380406, 0, 11, 8380413, 8380386, 8380396, 6, 35, 8380410, 42, 8, 18, 17, 8380413, 8380399, 5, 8380408, 8380400, 8380409, 21, 8380399, 8380407, 3, 0, 39, 24, 8380399, 8380414, 14, 12, 8380387, 8380408, 9, 8380416, 4, 8380406, 1, 36, 8380398, 8380393, 0, 3, 20, 8380390, 8380415, 11, 37, 21, 8380366, 16, 38, 27, 8380400, 8380400, 9, 8380399, 12, 8380391, 8380406, 31, 31, 8, 8380385, 8380410, 4, 8380407, 8380412, 8380413, 18, 16, 8380407, 17, 12, 8, 2, 7, 8380405, 10, 21, 8380397, 6, 8380387, 8380412, 18, 13, 8380398, 10, 8, 8380413, 8380409, 1, 8380399, 23, 0, 4, 8380393, 32], +[9, 8380392, 8380375, 29, 8380405, 8380374, 2, 8380398, 47, 4, 8380386, 0, 8380405, 12, 16, 8380409, 21, 8380411, 8380402, 35, 7, 8, 8380414, 1, 8380376, 4, 10, 3, 8380369, 8380404, 26, 8380407, 4, 9, 8380406, 30, 1, 8380411, 8380401, 4, 7, 25, 4, 21, 8380412, 8380413, 8380401, 8380393, 8380379, 3, 5, 8380411, 0, 8380377, 23, 12, 8380401, 8380403, 8380412, 8380398, 1, 14, 10, 8380416, 8380407, 8380407, 26, 25, 8380414, 8380415, 0, 20, 9, 9, 5, 8380399, 8380410, 8380395, 0, 29, 8380378, 8380392, 10, 24, 17, 8380405, 1, 18, 8380415, 8380394, 8380414, 8380415, 8380413, 5, 12, 12, 1, 21, 8380404, 0, 8380412, 8380398, 8380411, 10, 8380408, 0, 7, 10, 5, 16, 12, 8380406, 8, 8380415, 8380416, 11, 8380415, 12, 24, 8380401, 7, 8380410, 16, 8380385, 8380415, 12, 8380408, 8380416, 8380404, 1, 19, 15, 23, 8380397, 41, 5, 8380397, 8380416, 8380412, 8380407, 5, 22, 16, 8380414, 25, 8380390, 5, 0, 10, 3, 8380394, 8380401, 31, 14, 12, 8380409, 8380398, 12, 14, 27, 8380393, 10, 53, 4, 8380374, 7, 8380405, 0, 24, 23, 8380401, 8380404, 8380394, 17, 6, 8380397, 8380411, 8380404, 6, 4, 8380393, 29, 8380412, 8380386, 8380407, 27, 8380405, 8380414, 23, 8380415, 34, 6, 8380416, 8380409, 15, 13, 8380406, 8380414, 12, 8380393, 6, 8380403, 9, 12, 0, 12, 11, 8380409, 8380409, 21, 8380414, 9, 4, 8380407, 30, 12, 3, 8380395, 8380382, 16, 0, 9, 9, 8380408, 13, 20, 8380397, 10, 8380415, 8380382, 20, 12, 8380398, 35, 8380390, 8380405, 8380397, 17, 8, 8380409, 8380391, 16, 7, 25, 8380411, 8380405, 8380398, 8380413, 9, 37, 1, 8380405, 8380416, 8380415, 0, 3], +[8380400, 8380396, 8380409, 8380389, 11, 8380396, 8380413, 8380402, 5, 37, 3, 5, 31, 18, 3, 5, 1, 12, 1, 8380414, 8380398, 8380409, 25, 8380391, 3, 8380391, 21, 8380391, 8380410, 8380396, 8380406, 15, 7, 21, 8380388, 9, 19, 5, 17, 8380414, 8380412, 10, 8380412, 36, 6, 6, 8380394, 8380386, 8380415, 8380383, 7, 8380404, 26, 8380396, 8380414, 9, 8380408, 8380405, 9, 8380371, 17, 75, 8380413, 10, 8380402, 8380415, 31, 3, 8380405, 8380406, 5, 0, 2, 8380388, 1, 8380406, 8380414, 8, 29, 0, 8380401, 8380405, 12, 4, 8380395, 8, 14, 1, 13, 7, 8380406, 1, 8380395, 5, 1, 8380391, 4, 8380404, 8380415, 25, 8380411, 8380395, 23, 27, 15, 8380387, 8380390, 45, 15, 8380405, 8380376, 6, 8380397, 8380416, 8380396, 8380413, 8380400, 11, 12, 8380408, 2, 8, 8380399, 8380414, 17, 16, 12, 4, 4, 22, 9, 9, 8380412, 8380410, 8380416, 12, 8380384, 29, 15, 13, 15, 8380402, 8380397, 0, 8380413, 6, 8380408, 8380397, 5, 8380385, 29, 35, 8380389, 8380382, 8380405, 8380408, 5, 15, 8380402, 39, 8380414, 8380395, 26, 8380414, 5, 9, 8380382, 30, 31, 9, 2, 8380395, 31, 8380392, 8380413, 8380405, 6, 8380408, 8380416, 12, 8380386, 27, 8380387, 8380396, 15, 15, 12, 3, 8, 10, 3, 8380398, 10, 8380414, 18, 8380414, 26, 52, 22, 8380379, 8380408, 1, 0, 8380400, 8380408, 6, 8380409, 8380415, 8380388, 8380408, 2, 7, 8380411, 8380403, 44, 0, 24, 8380412, 8380409, 12, 24, 8380411, 11, 8380399, 8380375, 8380403, 14, 0, 8380408, 8380400, 13, 14, 15, 25, 17, 21, 8380405, 17, 40, 0, 26, 8380407, 8380413, 8380399, 21, 8380409, 8380407, 8380400, 8380412, 13, 8380411, 8380410, 8380387, 7, 8380395, 8380410], +[7, 8380413, 6, 13, 7, 8380408, 9, 4, 1, 8380412, 1, 10, 10, 8380395, 44, 8380363, 8380415, 37, 24, 11, 8380415, 19, 8380415, 8380399, 8380408, 23, 16, 8380386, 10, 8380412, 6, 8380396, 0, 8380415, 8380412, 12, 8380412, 8380402, 18, 8380410, 8380397, 8380392, 20, 8380406, 8380407, 0, 8380403, 23, 8380415, 10, 4, 1, 8380403, 3, 3, 8380413, 8380408, 4, 8380402, 23, 6, 2, 8380407, 8380415, 8380416, 9, 8380406, 8380384, 0, 8380415, 7, 20, 18, 18, 8380390, 8380405, 8380395, 3, 8380406, 8380395, 8380399, 19, 8, 8380413, 23, 16, 2, 7, 8380411, 8380403, 8380402, 0, 2, 32, 8380415, 20, 8380414, 3, 8380409, 8380410, 8380404, 15, 8380374, 8380375, 8380407, 3, 6, 17, 10, 18, 19, 26, 8380414, 4, 8380403, 15, 5, 8380416, 8380393, 8380413, 8380411, 8380416, 15, 15, 8380416, 8380413, 8380414, 8380413, 8380406, 24, 12, 8380404, 4, 8380404, 11, 6, 8380406, 7, 8380395, 8380405, 10, 8380413, 8380402, 8380395, 8380408, 17, 8380407, 28, 7, 8380399, 2, 14, 31, 8380400, 8380405, 8380385, 1, 10, 32, 8380414, 8380407, 14, 9, 8380382, 8380406, 8380399, 1, 4, 4, 8380381, 37, 8380398, 13, 3, 0, 3, 8380414, 0, 8380413, 8380383, 8380387, 0, 8380413, 8380412, 5, 8380400, 9, 25, 10, 6, 8380394, 8380409, 2, 8380408, 18, 8380416, 8380416, 1, 8380414, 21, 14, 8380385, 8380380, 1, 11, 7, 8380405, 8380393, 33, 12, 8380393, 8380409, 15, 8380415, 8380416, 0, 8380409, 8380413, 31, 15, 8380412, 8380395, 22, 5, 7, 8380406, 8380413, 12, 5, 8380411, 16, 8380393, 8380402, 25, 6, 8380405, 14, 13, 8380374, 1, 1, 9, 8380385, 3, 4, 8380395, 8380415, 13, 0, 8380413, 7, 19, 8380393, 8380406, 25, 8380412], +[1, 8380412, 8380404, 12, 0, 8380408, 8380413, 17, 8380390, 8380415, 19, 0, 15, 1, 8380415, 8380398, 1, 2, 8380415, 28, 8380406, 7, 16, 3, 4, 8380397, 8, 8380407, 8380407, 8380415, 8380407, 8380398, 8380412, 8380414, 1, 8380413, 15, 26, 8380416, 1, 8380412, 17, 4, 8380411, 1, 14, 8, 8380411, 8380388, 18, 8380411, 8380408, 8380411, 8380396, 5, 18, 8380402, 14, 4, 8380411, 8380412, 8380402, 8380387, 17, 8380415, 8380410, 8380385, 23, 8380410, 17, 6, 8380410, 8380401, 10, 43, 4, 8380397, 15, 2, 23, 5, 8380372, 8380414, 8380407, 8380401, 10, 8380398, 5, 8380413, 8380395, 8380410, 0, 33, 6, 14, 10, 21, 4, 8380391, 8380406, 11, 8380411, 38, 8380390, 35, 8380403, 8380386, 8380387, 6, 4, 8380403, 8380406, 8380406, 14, 23, 8380386, 35, 12, 10, 8380399, 4, 22, 9, 8380400, 8380390, 1, 3, 8380390, 8380391, 8380408, 13, 19, 8380401, 5, 8380401, 16, 4, 8380405, 32, 13, 8380404, 4, 8380401, 0, 23, 31, 8380404, 8380416, 8380388, 19, 8380411, 8380396, 8380409, 15, 8380401, 27, 5, 8380390, 4, 8380388, 8380390, 8380416, 8380412, 8380402, 15, 3, 8380412, 13, 9, 8380414, 0, 8380393, 39, 31, 8380403, 8380408, 9, 1, 8380414, 8380393, 8380404, 17, 25, 2, 8380393, 8380411, 8, 2, 8380410, 8380404, 17, 15, 0, 8380382, 8380416, 8380414, 8380385, 8380399, 8380409, 16, 5, 11, 8380365, 6, 8380409, 3, 8380416, 8380408, 27, 30, 8380412, 45, 8380407, 6, 8380404, 24, 8380384, 8380404, 8380416, 8380404, 38, 8380402, 8380368, 24, 8380389, 39, 8380392, 8380408, 8380414, 11, 8380409, 8380405, 8380394, 8380409, 17, 11, 8380409, 8380416, 8380401, 8380416, 20, 8380407, 4, 8380416, 23, 8380410, 8380398, 14, 37, 8380395, 13, 8380410, 8380408, 8380414, 8380383, 8380362]] +cs2: [[8, 30, 8380413, 8380401, 11, 2, 18, 8380403, 8380410, 27, 14, 12, 4, 7, 8380415, 17, 2, 8380395, 16, 1, 8380413, 23, 1, 25, 8380413, 9, 8380389, 8380404, 8380407, 50, 2, 8380402, 0, 10, 8, 8380416, 8380410, 18, 8380407, 31, 12, 11, 8380408, 8380408, 8380401, 8380408, 14, 17, 17, 25, 8380391, 1, 8380412, 8380397, 23, 8380414, 8380398, 8380415, 16, 8380408, 4, 8380402, 8380388, 0, 28, 2, 8380397, 8380397, 19, 18, 4, 8380414, 10, 8380407, 8380403, 20, 30, 8380387, 8380415, 10, 16, 8380398, 8380402, 8380411, 0, 6, 8380409, 8380407, 24, 19, 8380409, 8380403, 27, 13, 8380360, 8380413, 4, 8380415, 8380413, 8380409, 1, 7, 8380405, 5, 1, 16, 10, 8380390, 15, 12, 2, 8380415, 8380399, 29, 7, 8380413, 8380381, 40, 23, 8380411, 0, 8380374, 8380410, 9, 6, 8380409, 6, 17, 20, 11, 8380376, 0, 24, 8380400, 8380412, 1, 22, 8380400, 8380409, 8380391, 8380401, 8380408, 20, 14, 4, 8380410, 8380412, 8380404, 28, 8, 10, 8380399, 4, 29, 12, 9, 8380412, 8380401, 8380401, 8380408, 30, 8380390, 8380416, 8380408, 8380416, 24, 3, 30, 8380403, 4, 8380398, 7, 8380381, 3, 8380413, 2, 8380404, 24, 8380390, 0, 23, 8, 8380397, 6, 17, 9, 8380408, 6, 15, 2, 8380402, 8380412, 19, 18, 7, 8380410, 8380406, 8380412, 8380393, 7, 8380392, 18, 26, 8380414, 7, 8380413, 10, 7, 4, 8380389, 10, 0, 5, 8380404, 5, 8380409, 4, 9, 8380410, 4, 8, 8380408, 8380410, 12, 33, 8380401, 8380415, 20, 13, 11, 8380392, 8, 8380411, 8380375, 8380400, 3, 8380410, 15, 5, 6, 8380416, 2, 8380403, 13, 26, 8380387, 8380401, 35, 2, 3, 8, 8380396, 8380393, 1, 8380403, 8380414], +[8380416, 38, 8380403, 4, 8380403, 8380389, 8380416, 8380415, 10, 8380385, 10, 2, 8380415, 1, 8380413, 27, 8380414, 28, 8380405, 8380386, 15, 8380408, 8380406, 8380409, 21, 0, 8380396, 12, 8380412, 29, 31, 8380374, 16, 8380386, 8380390, 0, 29, 8380398, 8380410, 8380415, 28, 19, 11, 8380416, 8380400, 8380399, 8380411, 16, 10, 8380395, 29, 8380415, 8380415, 25, 8380398, 8380390, 16, 22, 19, 21, 8, 8380406, 8380414, 4, 8380413, 8380403, 5, 5, 8380404, 10, 13, 8380412, 8380368, 8380406, 15, 0, 0, 27, 15, 11, 8380408, 8, 8380402, 23, 8380416, 0, 1, 8380412, 21, 17, 3, 12, 8380402, 8380408, 8380392, 11, 8380394, 5, 8380400, 29, 19, 8380404, 8380413, 8380410, 3, 52, 24, 8380402, 0, 2, 21, 8380393, 32, 8380416, 8380403, 26, 8380414, 8380416, 8380399, 10, 36, 8380396, 8380404, 8380413, 8, 8380411, 18, 13, 8380416, 8, 33, 7, 8380416, 14, 27, 7, 8380405, 42, 20, 5, 8380392, 16, 4, 11, 8380392, 8380396, 32, 26, 0, 21, 8380381, 8380410, 8380401, 8380414, 17, 21, 27, 10, 12, 17, 8380392, 8380415, 8380408, 9, 15, 22, 27, 6, 5, 8380412, 6, 11, 8380394, 8380413, 8380414, 8380411, 3, 8380408, 4, 8380396, 10, 8380401, 6, 8380414, 14, 8380399, 8380402, 8380405, 26, 8380395, 14, 8380393, 12, 8380399, 9, 16, 8380416, 3, 8380393, 13, 24, 9, 8380408, 8380380, 14, 18, 9, 8380380, 3, 25, 3, 8380402, 13, 8380402, 7, 8380408, 6, 8380414, 6, 1, 8380382, 8380414, 4, 8380406, 8380402, 8, 8380394, 8380403, 19, 8, 13, 48, 2, 8380415, 8380404, 8380388, 18, 14, 8380399, 8380411, 11, 38, 8380411, 1, 8380399, 8380402, 28, 8380370, 11, 8380398, 8380392, 7, 10, 9, 4, 8380416], +[8380408, 36, 1, 8380412, 8380413, 15, 38, 8380380, 8380404, 4, 21, 8380392, 8380415, 8380407, 19, 10, 8380416, 8380414, 12, 8380409, 15, 8380393, 29, 46, 8380403, 8380406, 18, 0, 25, 8380407, 23, 8380403, 28, 8380389, 19, 8380375, 8380389, 8380404, 8380380, 8380385, 33, 0, 8380400, 8380413, 25, 11, 3, 8380415, 23, 15, 2, 10, 22, 8380412, 2, 8380389, 6, 3, 8380412, 8380398, 8380412, 8380402, 6, 19, 8380390, 8, 8380396, 10, 4, 8380394, 8380413, 8380407, 8380416, 0, 6, 8380397, 1, 10, 8380399, 5, 8380413, 4, 8380410, 8380389, 12, 8380399, 7, 31, 8380415, 8380408, 6, 8380415, 8380403, 12, 20, 8380396, 8380403, 3, 16, 8380398, 21, 7, 15, 17, 32, 7, 8380357, 31, 8380412, 8380398, 8380407, 8380414, 28, 8380380, 10, 8380404, 8380410, 30, 8380388, 1, 8380395, 27, 6, 12, 32, 10, 8380390, 21, 8380415, 8380411, 8380414, 8380406, 8380393, 40, 8380410, 32, 8, 8380390, 8380407, 12, 8380411, 6, 8380384, 6, 8380390, 10, 8380410, 5, 8380390, 5, 8380403, 8380411, 12, 8380411, 30, 8380400, 8, 7, 16, 8380409, 8380415, 13, 8380392, 6, 8380394, 8380399, 20, 8380383, 25, 8380411, 8380404, 8380406, 8380388, 8380398, 8380416, 15, 23, 8380393, 8380415, 14, 21, 8380392, 4, 8380391, 10, 1, 11, 8380390, 17, 8380402, 8380401, 1, 14, 17, 8380406, 8380397, 37, 8380398, 11, 20, 8380404, 6, 13, 8380405, 10, 8380401, 8380375, 5, 8380405, 8380408, 8380415, 8380398, 8, 8380403, 30, 8380407, 0, 5, 16, 8380412, 8380414, 17, 8380408, 8380412, 5, 8380402, 19, 4, 20, 8380412, 7, 8380416, 3, 2, 1, 0, 10, 8380372, 28, 8380415, 2, 8380386, 51, 26, 8380383, 0, 2, 8380400, 0, 8380404, 29, 8380389, 19, 8, 8380404, 8], +[1, 32, 14, 21, 8380409, 24, 18, 8380409, 1, 8380399, 8380389, 41, 14, 8380382, 8380375, 22, 8380397, 8380372, 8380411, 5, 8, 12, 8380389, 8380410, 13, 3, 2, 8380394, 8380413, 16, 1, 21, 8380414, 1, 8380408, 8380406, 8380416, 8380416, 35, 8380408, 9, 8380407, 24, 14, 8380411, 8380412, 8380412, 8380412, 8380395, 8380395, 8380400, 6, 24, 8380389, 19, 3, 1, 8380378, 8380385, 17, 8380415, 9, 3, 8380397, 24, 8380402, 3, 24, 8380414, 8380403, 8380410, 23, 8380411, 8380408, 8380388, 13, 57, 8380415, 6, 8380415, 8380409, 17, 9, 8380412, 8380400, 4, 8380407, 8380397, 0, 1, 15, 8380394, 8380408, 3, 11, 27, 8380415, 8, 8380404, 8380404, 25, 8380412, 4, 8380387, 1, 3, 24, 9, 35, 8380408, 23, 16, 8380408, 4, 8380397, 8380391, 22, 13, 10, 6, 15, 8380384, 8380379, 8380408, 10, 8380376, 8380384, 32, 8380405, 8380394, 3, 8380390, 6, 18, 20, 10, 8380409, 12, 6, 8380407, 8380416, 1, 12, 12, 8380396, 7, 34, 8, 8380387, 10, 8380368, 5, 8380404, 8380360, 8380405, 5, 8380389, 14, 8380415, 8380398, 8380406, 8380401, 13, 8380410, 8380403, 24, 8380406, 8, 8380415, 18, 8380403, 8380416, 8380399, 5, 31, 19, 4, 8380395, 8380406, 5, 8380408, 0, 9, 8380414, 8380410, 6, 8380409, 8380414, 8380410, 8380404, 8380414, 8380394, 8380383, 8380401, 1, 25, 8380412, 16, 4, 4, 8380397, 8380409, 8380410, 20, 5, 8380372, 8380411, 46, 30, 8380405, 8380415, 8380415, 8, 7, 1, 8, 12, 12, 8380391, 8380388, 8380409, 10, 3, 8380401, 8380405, 25, 8380414, 8380390, 8380391, 8380402, 8380411, 5, 0, 8380390, 30, 26, 8380410, 7, 25, 37, 8380413, 8380394, 9, 2, 0, 8380410, 25, 8380414, 31, 5, 8380408, 1, 8380390, 8380415, 8380397, 4], +[8380402, 8380381, 5, 26, 8380400, 8380404, 8380407, 9, 8380404, 8380397, 8380413, 8380403, 33, 8380385, 18, 8380414, 7, 8380377, 8380392, 29, 12, 5, 8380389, 14, 43, 8380412, 8, 0, 8380404, 9, 8380405, 8380414, 8380412, 0, 8380411, 8380388, 6, 29, 23, 8380388, 2, 8380403, 8380389, 8380402, 8380400, 8380402, 26, 7, 8380407, 39, 8380395, 8380415, 17, 16, 8380382, 0, 25, 8380403, 8380412, 11, 8380373, 6, 6, 8380407, 8380385, 22, 11, 8380394, 8380381, 4, 8380408, 19, 8380406, 18, 10, 8380414, 8380398, 0, 4, 8380402, 8380411, 2, 36, 15, 0, 8380411, 8380381, 33, 8380398, 4, 8380416, 5, 8380416, 8380414, 18, 1, 8380396, 29, 10, 25, 7, 8380416, 1, 8380399, 8380410, 8380399, 8380407, 8380408, 8380407, 28, 8380409, 4, 8380407, 10, 8, 8380412, 12, 21, 8380408, 8380415, 8380406, 1, 5, 9, 8380408, 24, 14, 8380407, 8380412, 8380388, 8, 8380409, 0, 23, 5, 7, 8380415, 8380410, 9, 10, 8380402, 8380406, 4, 8380407, 8380411, 8380409, 8380403, 8380407, 19, 8380415, 23, 15, 7, 8380400, 8380411, 8380402, 8380397, 8380414, 39, 8380405, 28, 20, 8380405, 24, 8380388, 8380380, 8380416, 4, 3, 8, 8380405, 8380401, 27, 8380397, 2, 8380408, 3, 6, 19, 4, 8380408, 8380401, 8380404, 8380406, 40, 7, 21, 8380392, 0, 17, 8380400, 8380405, 17, 18, 1, 8380415, 8380416, 8380415, 7, 8380394, 8380401, 14, 29, 8380403, 4, 8380410, 8380387, 26, 8380409, 8380411, 18, 1, 8, 8380404, 8380389, 7, 8380414, 0, 8380415, 27, 34, 27, 8380410, 8380406, 0, 19, 8380400, 8380396, 20, 3, 8380388, 7, 8380406, 6, 8380413, 5, 8380403, 15, 15, 8380388, 2, 8380399, 8380403, 29, 8380392, 19, 8380398, 8380399, 27, 8380399, 3, 8380412, 8380411, 29, 15, 19], +[5, 8380402, 12, 8380409, 17, 2, 6, 5, 13, 8380412, 8380414, 23, 11, 8380409, 8380393, 8380405, 8380397, 21, 8380374, 8380405, 0, 13, 8, 6, 5, 8380415, 3, 19, 8380405, 9, 9, 8380395, 25, 32, 8380416, 8380408, 8380406, 8380405, 8380408, 8380391, 8380392, 0, 8380415, 8380394, 8380387, 6, 44, 8380414, 8380408, 8380394, 17, 8380408, 1, 8380414, 7, 14, 8380404, 8380405, 27, 18, 21, 8380384, 0, 8380415, 8380390, 3, 8380389, 8380404, 9, 8380412, 8380404, 0, 35, 5, 8380414, 3, 8380403, 16, 3, 21, 28, 3, 2, 30, 8380392, 8380395, 8380402, 40, 8380406, 11, 2, 1, 19, 8380401, 8380393, 8380413, 8380381, 8380414, 8380408, 29, 41, 9, 8380413, 8380387, 2, 8380411, 8380410, 8380391, 8380404, 42, 8380412, 22, 8380384, 5, 8380411, 8380415, 8380410, 11, 22, 13, 11, 16, 35, 8380413, 39, 9, 8380379, 8380407, 40, 5, 21, 8380404, 8380402, 8380406, 8380404, 9, 8380409, 8380381, 8380405, 18, 18, 30, 8380411, 8380400, 16, 8380386, 5, 7, 2, 8380405, 28, 23, 8380413, 8380415, 18, 24, 8380394, 8380410, 4, 4, 8380409, 8380404, 8380391, 10, 8380391, 8380407, 8380403, 6, 3, 19, 8380410, 26, 2, 8380409, 9, 8380379, 33, 38, 8380413, 24, 23, 24, 8380415, 8380389, 2, 31, 9, 8380377, 8380399, 8380409, 8380409, 8380414, 8380406, 13, 15, 8380412, 10, 1, 31, 8380400, 16, 3, 8380398, 8380409, 15, 4, 52, 8380392, 8380402, 8380415, 8380406, 8380416, 8380402, 8380411, 10, 17, 8380403, 12, 23, 5, 8380388, 8380387, 18, 13, 8380410, 8380416, 16, 10, 16, 8380399, 8380405, 10, 8380400, 9, 8380395, 24, 15, 8380415, 8380374, 8380414, 8380402, 4, 5, 8380413, 3, 33, 20, 33, 29, 25, 6, 8380415, 4, 3, 8380387, 8380397]] +z: [[8038429, 66497, 8252275, 119746, 9589, 8155927, 8109334, 454088, 8006017, 307608, 449759, 105448, 466102, 129664, 8240477, 8175712, 7878516, 162909, 421532, 8083158, 65198, 7862250, 222652, 8200620, 37610, 425303, 8168660, 8049357, 8159831, 274848, 8009730, 400456, 8052282, 110124, 158533, 8100928, 7990871, 8303909, 245795, 7948792, 182254, 8223459, 8338564, 8134456, 8372332, 470443, 8144847, 8278541, 101245, 8254809, 491747, 8136929, 123789, 380214, 8324331, 8084178, 8264789, 8198459, 51408, 159336, 277321, 429082, 287417, 395755, 345974, 8215185, 8086831, 7937246, 76190, 7993139, 7934187, 98940, 8168238, 8289107, 159428, 315079, 8370299, 385720, 410014, 432328, 389014, 412, 57400, 8167870, 300995, 67314, 8306764, 434448, 359504, 82129, 8138307, 37404, 8340391, 244980, 8045733, 281400, 7904325, 37704, 210772, 248869, 176471, 336184, 340380, 8235169, 192066, 88419, 8339519, 211410, 8224465, 8255496, 102543, 504576, 7939589, 445349, 8308821, 8344992, 8004611, 8154099, 519304, 8184221, 348210, 314459, 8081286, 198291, 32747, 366356, 8299512, 7981780, 7967240, 434230, 334352, 8116070, 243344, 7991915, 8004241, 8089641, 8292361, 8097188, 92124, 75248, 249022, 507728, 52835, 413170, 7891631, 292762, 203210, 8330592, 8142139, 406246, 522764, 96705, 7908044, 8148070, 485980, 8280909, 266266, 61899, 7904156, 94592, 8349446, 136978, 419703, 31242, 123762, 8205766, 8378570, 428816, 256829, 40900, 8032669, 123070, 315104, 463392, 8372124, 483437, 8055774, 8101103, 7981409, 8036520, 184416, 8059045, 8023234, 415823, 215907, 101500, 8197625, 8109661, 8247240, 105487, 8287775, 479110, 8168839, 38978, 66144, 82905, 8324834, 7888336, 7889844, 501607, 8154397, 8346332, 8109419, 8003984, 8096990, 309728, 303553, 393798, 201840, 8030944, 8126131, 458262, 329314, 254202, 417636, 8293904, 284479, 8289041, 410209, 7901061, 8073746, 8031569, 8177733, 8027501, 8219304, 8335970, 8370336, 363486, 366027, 79772, 8209746, 116705, 14271, 8082355, 8149277, 260334, 8224843, 7075, 450917, 31748, 413458, 58059, 249567, 93821, 8039832, 241433, 8366571, 287085, 8076059, 8183544, 152352, 8078421, 7863805, 8244701, 8269327, 198414], +[476071, 7940004, 8105977, 7994031, 8227892, 7980978, 8027097, 8215626, 8051124, 352098, 507638, 8132523, 446542, 431534, 7872327, 8096624, 7886781, 7976678, 8200120, 137648, 330069, 481803, 7881800, 8007334, 370891, 8152393, 103838, 446275, 216339, 61122, 7982501, 385543, 8302509, 8226252, 8220829, 7948968, 102363, 7960519, 7963410, 16233, 8119732, 56155, 490916, 462996, 8244077, 399911, 191378, 389648, 8255670, 8230253, 339965, 364822, 8179274, 290237, 507504, 8205336, 362546, 264721, 343710, 8302735, 403361, 314455, 283343, 8158925, 505917, 8294824, 94199, 421545, 37910, 199791, 8054192, 8262010, 8283466, 153059, 441832, 7963835, 8316431, 7948524, 8160823, 83554, 306797, 7945945, 89313, 25109, 7907697, 184733, 7944360, 371075, 8036755, 164728, 372509, 8292633, 92735, 7874414, 8029335, 88022, 8209379, 8045083, 332114, 416623, 356969, 303410, 57859, 227652, 54478, 8218841, 7928394, 7870284, 488614, 8297460, 7860208, 7961666, 7900014, 8171448, 508858, 93075, 8014370, 205300, 8006019, 8011462, 8234566, 433254, 8051804, 65185, 211499, 7975428, 8337005, 7966019, 7875980, 8177242, 8240662, 111093, 8257018, 8099643, 8096804, 29773, 381239, 8255519, 510335, 8145776, 8265427, 8103464, 8066806, 7949555, 346693, 8125098, 8359706, 243633, 7987811, 8310130, 92202, 8057809, 255702, 205971, 7988187, 374116, 8295085, 8348747, 61995, 258207, 7856940, 8184348, 72506, 355843, 283631, 8048267, 8064631, 74590, 8289943, 307485, 464608, 186322, 7991426, 417514, 436088, 56796, 8267002, 416969, 8207681, 319984, 63107, 10948, 339457, 8032841, 237902, 432066, 496529, 8096851, 485919, 8368347, 420330, 7884907, 8258208, 158923, 87426, 307760, 243278, 405470, 8235748, 113908, 8231168, 8187218, 350437, 469416, 274722, 357769, 78977, 242079, 404146, 8146158, 8177960, 8208536, 92192, 340697, 4347, 8219637, 7889042, 7992399, 8063990, 7899591, 180469, 422790, 43736, 7934331, 8210772, 8249460, 7856569, 215359, 510931, 441954, 287642, 7920544, 184146, 7932770, 8103962, 448715, 8188414, 8312285, 410553, 8315502, 53636, 8215853, 8032991, 503585, 132371, 8013668, 452693, 159400, 8330297, 420285, 8329422, 163865, 8117727, 441317, 151827, 8015116], +[7945048, 8332557, 103482, 8223685, 8337461, 8250193, 8081670, 8069778, 424100, 8370434, 161763, 259655, 201046, 86307, 7979156, 7898257, 421875, 467634, 318525, 104212, 7915162, 8037692, 194727, 8237709, 156023, 317419, 389088, 29613, 7973846, 119789, 126777, 8151675, 7862959, 451939, 8227510, 479366, 54900, 8345152, 285102, 8089473, 496078, 7865522, 8180511, 8130567, 7912836, 258918, 93175, 448202, 493333, 237601, 8168829, 8246699, 8135207, 8162394, 280699, 8361822, 8346229, 184130, 8255123, 7890508, 8323399, 8239500, 257397, 7966982, 8354973, 7960200, 8250187, 327865, 238728, 8000902, 193284, 8018839, 8259445, 8300354, 522481, 8276447, 8266418, 458658, 8194331, 7981120, 105542, 235830, 8261820, 342535, 231561, 359970, 7921291, 8053393, 8020345, 513175, 102695, 150344, 498529, 523551, 8341264, 8272011, 455304, 92491, 330427, 8279833, 142329, 95119, 8172927, 300637, 65732, 506910, 7892295, 8031202, 8268025, 8048060, 144772, 136877, 8117552, 8299267, 470449, 169886, 8025228, 66136, 8160516, 8343167, 315897, 413375, 8332132, 8221810, 8082019, 260038, 361154, 8235949, 160239, 7929413, 8276400, 222330, 8124128, 8357443, 193979, 8208317, 171193, 7857126, 163065, 7890508, 8361265, 8031454, 465215, 8238008, 7958662, 8071473, 468300, 8265145, 7888216, 370011, 52650, 512090, 8174538, 8052013, 7914835, 458488, 7995478, 364461, 7995642, 8127593, 8175558, 8042987, 40270, 472133, 376049, 134825, 448658, 299505, 8274557, 27990, 374494, 8349219, 62354, 8239560, 8327357, 195691, 8065579, 8326323, 490588, 8151147, 463154, 8129429, 229636, 8024035, 42744, 7962321, 8296976, 458644, 7933462, 7873398, 321387, 329300, 7991384, 123954, 477986, 451731, 269567, 460489, 108755, 7963674, 8007968, 335946, 8007795, 58109, 50315, 7987190, 8262201, 8362088, 43888, 345439, 457224, 242788, 8091655, 8146742, 8325024, 279852, 383737, 8075621, 427033, 401658, 83021, 8318736, 226398, 301552, 8074051, 428006, 8336822, 7967888, 438562, 319358, 8238558, 8060740, 260736, 8108790, 8126392, 71787, 8303824, 7917067, 8225227, 40039, 8192252, 8239554, 8178955, 7949205, 155150, 7983974, 265796, 408110, 188587, 8178035, 7896079, 435964, 213614, 8329292, 366496, 7895838], +[7861409, 8058002, 8022854, 286662, 8297888, 73403, 8126417, 68526, 8117255, 482648, 131288, 8368243, 197441, 7971207, 129173, 8266567, 7884820, 141443, 8327862, 7994035, 8142407, 8252905, 356843, 457571, 208344, 8244855, 8140657, 494339, 64368, 8155243, 7875567, 251538, 8110167, 7987050, 399218, 261557, 151781, 8074326, 252478, 8366273, 8235292, 7906927, 345188, 8004319, 8322206, 449656, 310600, 7891452, 189285, 8113790, 7983920, 114221, 385060, 394148, 258366, 8075550, 289662, 8308787, 227562, 8005552, 7907002, 8116044, 8181546, 187730, 8156947, 8060246, 479220, 8275274, 7871689, 255181, 518984, 8317929, 7906932, 69396, 115054, 498389, 8245769, 287149, 8343022, 441609, 7930995, 8298955, 7908973, 7927556, 336239, 8051211, 292435, 8225484, 445683, 8165481, 198703, 8142162, 8293986, 7996297, 429340, 8265846, 8355591, 43339, 56821, 461439, 255835, 194075, 8368087, 8203872, 8109662, 142937, 8221240, 337822, 8263209, 155139, 40107, 8033243, 25276, 129536, 7978648, 151967, 8038979, 513924, 7886498, 7920326, 7922333, 8162100, 8134221, 8186178, 199827, 8361616, 375883, 520424, 356840, 147722, 237482, 179936, 450273, 304832, 295323, 69019, 107130, 7978441, 186088, 324620, 379951, 8290454, 8005680, 414187, 7911374, 7856402, 8175869, 268860, 245098, 446240, 449112, 102017, 207510, 8372036, 414086, 199325, 8363120, 68210, 7902408, 193521, 8107662, 7969108, 481642, 8110579, 8098203, 324111, 8038021, 192108, 81569, 500851, 7860748, 7856494, 140768, 276723, 7986110, 5475, 397827, 391226, 8136482, 520654, 28126, 8102159, 244426, 7977319, 8316694, 208709, 165099, 7881539, 8012886, 306561, 8214779, 7899654, 8221764, 8362197, 495986, 136045, 8227422, 8128527, 171450, 292685, 7860540, 225956, 319606, 8335718, 8272643, 7996522, 454996, 66535, 7957043, 8076418, 7984978, 8362248, 274760, 7961835, 8349516, 21918, 347118, 104931, 203435, 123831, 373885, 292654, 187437, 8109925, 320144, 7941521, 71208, 278361, 8315449, 7915224, 7887861, 520709, 7988832, 8283295, 8174738, 7902603, 471504, 275429, 8003801, 15947, 73326, 8158347, 8218984, 8085441, 453241, 8300783, 7976585, 7918095, 7884668, 208032, 446691, 8141636, 11121, 215709, 8302459, 460544], +[8150965, 8284053, 8348198, 256611, 198168, 7879266, 381588, 329990, 180872, 8355431, 179021, 7951477, 280152, 471223, 155010, 110519, 8070860, 7872471, 8022443, 254951, 8188449, 8096014, 283447, 452498, 364540, 8033597, 8059847, 8262641, 257807, 8181502, 230640, 231053, 8237286, 495109, 297077, 7930776, 8240952, 51331, 8108716, 8104000, 261798, 275790, 8038523, 8177760, 488676, 8120258, 7956041, 7919155, 6865, 8052524, 313008, 209368, 398462, 232990, 85829, 215628, 7954733, 8373087, 104373, 8064824, 406354, 8083676, 8379266, 361976, 8275613, 7929356, 8355050, 7911624, 8296944, 431919, 500660, 90654, 8376112, 112786, 170176, 24732, 100634, 8052783, 130526, 343641, 8145317, 323954, 8313538, 92342, 8243342, 8112193, 8225009, 479655, 8302510, 8200170, 12698, 144798, 8075528, 331558, 8009153, 8339121, 283138, 432153, 8281072, 7993002, 46104, 8227701, 8226836, 8097107, 315509, 8012500, 7961049, 8259067, 7984634, 8292240, 282817, 8324422, 8231364, 269992, 8086281, 8058342, 37766, 8083295, 8050289, 7966025, 8299990, 385265, 267385, 272250, 39854, 228911, 7922850, 361295, 8374226, 84541, 8347251, 296713, 510794, 8286515, 8017295, 8082182, 7882123, 7941420, 8072822, 243057, 66854, 283281, 7979296, 415320, 7932134, 8052417, 443560, 7493, 60660, 8344933, 8032764, 7996323, 8095782, 134565, 8009363, 420256, 7970124, 168497, 391341, 494808, 8048637, 440486, 8294150, 205186, 8329648, 351889, 107822, 8285860, 7891345, 7892127, 424123, 267586, 44897, 209905, 8094490, 8140918, 8108342, 246225, 49951, 359218, 61081, 8288876, 8183472, 255226, 221883, 475473, 168081, 463309, 7861568, 8294747, 306245, 7977860, 7927957, 211221, 483754, 8228971, 136408, 328699, 8177052, 7976897, 372010, 8227799, 8172976, 249188, 7976465, 24965, 146630, 5128, 362592, 110577, 8193459, 425424, 8175831, 521382, 8083697, 239686, 7878690, 54599, 208454, 8300286, 48916, 8085321, 8010868, 465300, 433810, 7876170, 471605, 354395, 205497, 200420, 295198, 234951, 318184, 8093837, 8090513, 161563, 372864, 8220253, 344971, 8268585, 8329434, 8312220, 7894719, 90041, 8263658, 8214150, 89859, 8234456, 8046222, 7964108, 8248578, 7863890, 8354224, 246737, 8288770, 100364]] +||z||: 524015, ||z|| check passed +r0: [[-105859, 47863, 50835, -179782, -212714, -159491, 182094, 165419, 52489, 116057, -181813, 86995, 157955, 122428, 13855, 135806, -14505, -78991, 209733, -226890, -202206, 154769, -52710, 6939, 252037, -108823, -243810, 239944, 163793, 208332, -249532, -61533, -171592, 60943, 28394, 252140, -87565, 248336, -112415, 93158, -186184, 177803, 222362, -238612, -205163, 241809, -176641, -119486, 136871, 31018, -38970, -186944, -253863, -180712, -124907, 175784, 93916, -174025, 83269, -100884, 145549, -256937, -192564, 256564, 3618, -127916, -107062, -171505, -129041, -208341, 41760, -245891, 63342, 197140, 81306, -130006, 143406, 110580, -164922, 240592, 95749, 13804, 152541, 175734, 128725, 152880, -189967, 214096, 6196, -42129, 70803, 203795, 96195, -75461, -230486, 139846, -215401, 78017, 167297, 150988, -240740, -177567, 70351, -164589, 209818, -112046, 6499, -153895, -84586, -122085, 73153, -261014, 47152, 118267, 30190, 127917, -103707, -174915, -112873, -118518, -199405, 67124, -238614, 252446, -170252, -15319, 62608, 241579, 71459, -70686, -55927, 123609, -86043, -163904, 85686, 176127, -88451, 48154, 3506, 164710, 31410, -161868, 211200, -238224, 232184, -23543, 19999, 158415, 106383, -257769, 218573, -254262, 240015, -137217, 232724, -102443, 153190, -128013, 49967, 54366, -185743, 55607, -144792, 186986, 233941, 6330, 28559, -152749, -44958, -5649, 86053, 100056, -127918, -170400, -177653, -65312, -17371, -126114, -39008, 206684, 214602, 246826, -75759, 72683, 92433, -42095, 24846, -166263, -200524, 258772, -92351, 239914, -165900, -96070, 35936, -153894, -10685, -79762, -157184, 221494, 74967, -27379, -71413, -222033, -127286, 5905, -193160, -225260, 113718, 45553, -158405, 36915, -49539, -164537, 164524, 117294, 243604, 247081, 251679, 83470, -105827, -174640, -168462, -120929, 59052, 239244, -79592, 79174, -26332, 88070, 116891, -100077, -212110, -212606, -179445, 92945, 210947, 121698, -57986, -224645, 253931, -133407, -112495, 58385, -252748, -260134, 106030, 7817, -187666, -47729, 131718, 221925, -109721, -83347, -84885, -129388], +[152555, -181731, -138894, -121974, 156844, 123827, -51142, 218095, -162442, 136524, 33959, 38818, -12588, 10001, -117653, 13076, -151024, 249100, -146518, -122678, 203828, -36029, -53384, -110269, -168296, 3822, -34580, -187186, 111109, -130119, -50225, -139792, 204965, -180872, 240525, 257207, -245290, -176558, 138640, -123807, 156978, -55199, 190554, 32720, 194654, -203109, 103930, -91390, 218685, 258527, 8936, -230293, 59955, 96836, -248767, 156416, 110162, -199187, -56887, -240057, -204046, 62322, -222984, -26157, -219390, -160166, -113841, -92022, -118807, 112694, 178964, -171810, -173626, 57560, 94093, -189130, -218413, 255385, -144611, -9258, -194778, 248286, 166556, 99463, 2420, 54018, 205887, -250966, 231008, -137316, 41899, -173213, 37066, -193779, 147870, -101245, 189856, -219654, -19459, 125563, 230553, 173868, -101612, 19976, 222851, 113907, -219859, 136620, -8107, 186399, 61938, 195180, -225827, -234883, 65247, 63636, -173737, -20610, 166416, -65906, -166483, -180595, 10456, -236408, 251285, -81741, 191456, -71775, 222168, -257666, -91025, -54971, 69702, -89972, -214486, 9918, 144127, 153125, 219888, -160013, 109196, -5470, 8581, 256536, 130298, -10610, -64487, 126352, -82659, 111000, -251707, -48553, 135064, -136519, -51039, 252076, 245138, 74783, 45805, 157250, -89225, -178715, 67228, -112482, 42761, 239206, -183680, -198531, -12842, 235934, -33202, -125452, 260984, 157542, 187791, 178589, 158228, 241544, 230101, -14232, -29813, 175362, -46264, -168008, -15213, 7591, 243488, -152804, 111362, 189646, -165602, -84280, -50464, 22906, -17808, 234190, 211808, -244012, -112684, -158167, -95665, 116364, 165773, -216620, -194705, -72781, 107542, -247941, -183420, 183840, -246262, 69465, 142190, -64300, -178996, 124472, -250737, -206127, -207758, -127723, -47107, -251227, 206632, -227946, 232152, -160539, -113009, -221705, 25166, -75013, -201882, 187273, -155360, 29729, -150385, -27438, 65732, 476, -114128, 53048, 126766, 257650, 209092, 80680, 96402, -31468, 164199, 220317, -150484, -138616, 167827, 90568, 132680, 153831, 80107, 31615], +[-141393, -101742, 27383, 190715, 149813, 130080, 18110, -192764, -29706, -2182, -44418, -55367, 60546, -190519, 47527, -208104, -120568, 147717, -217004, 89182, -32023, 131135, 204288, -168405, 189825, -78200, 99091, 246239, 214348, 187383, -150119, 241670, -66339, -255115, 220398, -149936, -141716, -4123, 246052, 77792, -49304, 180326, -73936, -152916, 200434, 155255, 176943, -151262, -253083, 55863, -237793, 88965, 175352, -60404, 118146, -225761, 249, -44321, 155573, 130104, 185242, 222931, -164554, -21725, -101885, -187198, 99619, -119225, 105688, 20756, 125790, 32152, 52582, -134472, -30996, 72244, 28872, -150785, 7760, -89500, 81657, 206361, 171162, -259090, -253957, 117038, 84415, 92757, 12764, 220691, -32742, 144585, -45646, -140709, 94961, 134167, -40234, -214672, 206972, 148979, 57131, 80743, 90762, 66779, 94594, -190731, 204738, -62466, 43275, 35162, -125070, -227084, 6362, -74683, 38012, 145916, 27838, -86092, 211871, 2466, -30982, -256236, 100763, 160524, -231225, 114511, 188521, 41081, 52053, -85274, 134322, -179758, -30992, 42292, 245760, 151090, 22939, -52300, -41355, 23756, 251929, 203532, -34047, -245856, -203125, -220882, 198699, -179887, 76297, 15815, 156083, 10962, -261112, 200703, -242007, 24380, 182953, -183838, 139823, -242221, -182847, -140005, 122680, -86207, 100812, -46711, -117587, -88399, 185258, 222390, -226025, -40959, 158505, 103472, -158042, -149737, 205409, -35990, 96445, 26282, 260931, -18064, 139693, -41534, -104888, -152403, 171805, -35326, 51897, 169214, -30254, 17043, -3592, 99041, -80838, 49173, 16264, 228260, -184328, 88768, -88813, 91280, 245382, -115509, -93524, -169067, -67716, -210279, -243276, -189583, 215412, -56350, -76631, -70634, -213456, -12349, 179048, 224621, -45937, -109638, -176280, 47234, 149718, 157867, -121809, -142424, -253009, -20955, -45036, -127526, -234120, -125745, -224330, 156509, -259640, 166942, 195712, -15434, -55296, -139661, 101679, 20581, 172432, -66627, 141249, -77321, 182392, 33006, 51819, 76190, -190788, 136582, -174337, 7040, 68860, 78079], +[180496, 14517, -18269, 30673, -64959, -173970, -142254, 195491, -87203, 195131, 29859, -150576, 246658, -41300, -238781, 231897, -71424, -108742, -87573, 98680, 2362, -197915, -206160, 12593, -96104, -140054, -81100, -34693, 76051, 227176, 179010, -81696, 96033, 89044, 99272, 113749, -32060, -209141, -25081, -169509, 39551, -46265, 85710, 197588, -29431, -126672, -68974, -194714, 210469, 134704, 126872, -36594, 224044, -185323, -93402, -134659, -46687, -4240, 126482, 222495, 6624, -211800, -254674, -119278, -114060, -125924, -36758, -201013, 116495, -171066, -201504, -151703, -13207, 83590, 202190, -72015, -34729, 2559, -213720, -257096, -220046, 85994, -165525, 71554, -23893, 183035, 239688, 144823, 11506, -116285, 224443, 40091, 225334, 57326, 240359, -134801, -215843, -199273, 58367, -13103, 231260, -1229, -238321, 215088, -200308, 232990, -75925, 63162, 89500, -203063, -163669, -12060, -220005, 10095, -148715, 15201, 118287, 202929, 70740, -241765, 238179, 45057, -209016, 160885, 43347, 258209, -231616, -113810, -86352, 194025, -29426, 227320, -259361, -197758, 219130, 66976, -254307, -183241, 210733, 100807, -247657, -73822, -53851, 200055, -112839, 189383, 208432, 106456, 198652, -200556, 104375, -125347, -41421, 203473, -44884, 93589, -230779, 188356, -41891, -113179, -147774, -119639, -168058, -63324, -104565, -21405, 234791, 120146, 37416, 234570, -163578, -82511, -229192, -60501, 216978, 129025, -202166, 8928, 117446, -219800, -16149, -135239, -224568, -68993, 155406, -217071, -185234, -109139, -184761, -112218, -181887, -106598, -177727, 75121, -245176, -147625, -256070, -54469, 143225, -115528, -129759, 38797, 231196, 70831, -6920, -210027, -214498, -146504, -184454, 190847, -5373, 150298, 143371, -2477, 39734, -106471, 102154, 200701, -78257, 49905, -56278, 176195, 50567, -30661, 227263, 11918, 46347, -23659, 112369, 95977, 92854, -178660, -3725, -252740, 6598, -193082, -55303, -232939, -123316, 225605, 45891, -214308, 236629, 260184, 22385, -94602, 73803, -196184, 248604, 139845, -141499, 205954, -187471, 94632, -128554, -109680], +[-52752, -243523, 158804, 235396, 236382, -22913, -209000, 212892, -255651, 214971, -136863, 182276, -254725, -19824, -187722, 224848, -252272, -6604, 44884, 40756, 197079, 159098, 62669, -119556, -164397, -28863, 182992, 218421, -244417, -168250, 4556, -79190, -216950, 260671, -158089, -50178, -258768, 194966, 97660, -84678, -220279, 97406, -117969, -11684, 51560, 101531, -170423, 104547, 51152, 206604, -228231, -220281, 260629, -236081, 200199, 808, -55157, -131089, 230727, 256799, -208366, 58152, 177815, 108752, -105929, -123433, 150995, 120706, 196510, 257964, -59523, -174447, 231369, 76991, -194367, -126643, -110790, -70530, -259032, 4327, -52613, -255190, -154294, 56319, -165106, 100173, -141840, -95394, -145195, 136860, 8244, 200230, 232928, -85308, -27450, -243254, 60771, -69443, 27828, -94606, -126733, -45488, 119316, 89455, -191607, -42683, -88514, -218059, -86156, -125490, -103638, 164398, -92639, 78519, -99180, -101041, 79655, 92795, -123477, -201362, 21911, 88731, -97702, -244641, -199435, -185422, 230008, 65842, 231357, 218289, 176356, -7130, -8420, 52247, 130026, -156429, 104426, 229907, 117818, -125727, -209743, -40965, -106358, -48713, -130643, -247347, 120914, -220367, 177772, -184709, 165707, 137742, 18764, -138047, 228211, 229400, -186165, -152941, 67948, -87100, -43267, -168205, -147561, -77465, 241399, 195466, 14501, -69991, 198024, 260938, -108127, -137917, 3561, 80590, -182077, 202722, 137860, 124449, -230840, -257163, -232504, 39430, -59932, -165703, -121766, -211899, 202757, 141960, 20199, -65136, 154615, 183413, -168457, -95645, -187132, 38706, -207604, 178344, -150711, -57171, -15453, 220315, -118553, 113623, 155699, 149457, 143757, 35744, -130402, -146636, 194857, 183408, 240233, 138552, 203640, -35635, 145024, -18818, 127200, 173104, -110396, -216521, 110017, -28980, 199067, 114660, 212674, 3103, -98625, 171118, -252323, 48973, -221921, 207322, -189383, 180904, -168448, -69294, -156631, -101634, -244782, -143312, -128615, -99241, -13448, 154762, -100327, -187413, 61675, -139215, 43451, 206141, 15915, 254416, 33569, -257342], +[-51366, -221301, 224063, -20281, 195564, 82627, 230762, 46586, -27999, -59057, -225924, -128600, -128133, 155414, 59770, -244348, 42827, -87436, 157739, -216275, 2550, 9653, 124325, 48522, -162646, 205279, -90756, 129609, 188678, -66626, 185632, -256826, 119820, -81332, 207474, -10699, 121698, 179318, -227115, -19985, -60853, 139857, -165697, 143878, -198601, 39484, -147323, -231042, -177708, 157677, -214020, 189000, -64184, 124299, 62948, -90643, 100288, 189682, 212954, -255107, -19621, 41589, -67778, 10312, 135071, -112929, -15422, 108613, 203965, 134659, 139324, 81138, 97799, -201761, -174920, -122548, 94377, 261687, 67821, 233701, 52883, 20445, -4467, 136339, 22196, 184076, 146737, -159518, -60062, 251843, 103439, 128579, -89517, 149949, 33530, 236030, -101551, 158242, -230286, -20235, 188075, -141453, 245563, 158416, 127485, -86845, 48373, 94423, 190743, -18476, -207110, 161141, -113055, -52409, -249660, -59652, 234743, 110315, 72056, -103975, 75529, -186460, 201083, 3125, 39156, -75936, 11749, 116691, -83059, -41118, -143071, -77915, 7514, 76356, -132568, 33898, 222448, 184246, -55120, -40763, -177679, -66857, -64552, -171215, 154660, -217700, -563, -245255, 39101, -171219, -242560, -11096, 31983, 193300, -93318, 73049, -7278, 221486, -53387, 153173, 161529, -234134, 254531, 175181, 168686, -47509, 237157, -83013, 45566, 102689, -104951, 31848, 213010, -163343, -228656, 70403, 123512, -250739, -96718, -202680, -208993, -84537, 222827, -62676, -236938, 55143, -36607, 57689, 1687, -102560, -63103, 96289, -243124, -197110, 87298, -152413, 181860, -46333, 63577, -53563, 232541, 11530, 172308, -218303, -81430, -72660, 222297, -19980, -115160, 75117, 123491, -35086, 244352, -204921, -180206, 70163, -5565, -45103, -88145, -159679, -6966, 156986, 198297, -50675, -115475, 226579, 43940, 12294, 90325, 121855, -184881, 221468, -176030, 144384, 128093, -152448, -94431, 110773, -255950, 10528, -101200, -21608, -23398, 12127, -52403, 80402, -72953, -49750, 86250, 249864, -57907, 8538, 126194, 46120, 80346, 207846]] +||r0||261687, ||r0|| check passed +cHat * t0Hat: [[5283921, 1325226, 2851471, 2452202, 6625370, 3047221, 5713202, 7651499, 3066858, 1710013, 4612629, 3053574, 3803431, 7459755, 321431, 3276443, 7023201, 2039862, 1712229, 1273686, 1858157, 5670663, 1183303, 2251352, 7470335, 4111173, 3100311, 7292866, 1524347, 5101013, 4188801, 3332046, 4461260, 1701921, 1946466, 2459795, 5977031, 8301562, 8201704, 7311034, 6729058, 34750, 3785171, 6403190, 3585151, 4528075, 4824486, 6632280, 1906080, 475641, 7769066, 6500856, 1413966, 2950357, 3167622, 894714, 6703153, 4964526, 6279191, 8037811, 7296629, 869144, 5578711, 5369902, 5773855, 7850915, 2005087, 1481561, 2668516, 8151581, 8239803, 6320248, 1448380, 4370817, 7445925, 2560904, 7630553, 5553889, 6249313, 8065020, 7074113, 2616275, 281882, 7602353, 1435615, 6435337, 4616854, 8085065, 9066, 2782196, 7684325, 2729552, 3843366, 5895007, 6643692, 6352720, 1695115, 780170, 2787355, 5698254, 1221312, 4328101, 4029677, 4273444, 2848008, 1121183, 353978, 5246991, 1666285, 5511170, 818593, 718726, 5668898, 1825281, 6983743, 5252390, 8174101, 6842815, 405083, 2552447, 5504662, 2192611, 6018434, 8348868, 5583876, 4993841, 1332629, 5998470, 8247297, 2990257, 1867101, 457765, 7233359, 6580576, 3240493, 5663542, 3599050, 3601677, 7769298, 3105617, 2731586, 3539699, 4982563, 6808563, 7569361, 2587665, 2706060, 6345187, 5849639, 1579828, 2595894, 4476336, 1357180, 2768225, 2421296, 1395904, 4937234, 5710473, 6896872, 6663097, 5608354, 809381, 6873817, 5594963, 777210, 2084498, 4443335, 6053371, 3450801, 5553603, 5786359, 7986543, 5123054, 4022443, 6011479, 3016441, 1835313, 5215531, 6549509, 4742837, 7938910, 4717838, 3766318, 8177107, 6797528, 175259, 1599643, 551645, 4713190, 721688, 5859106, 6399876, 6193440, 6299427, 4144029, 2526863, 1434961, 4555731, 6833372, 8099844, 1732741, 1085380, 2075382, 4671992, 1486927, 5218668, 6556290, 4319283, 1302078, 95303, 2981544, 7931050, 3850637, 952340, 8299193, 6088011, 7848068, 1701944, 6875613, 2870173, 4300030, 789594, 937881, 3116187, 1736703, 375352, 3677669, 7170559, 6868731, 182543, 5932015, 6121123, 3824196, 7180225, 5196119, 5944556, 237291, 4137542, 2117420, 516250, 1079461, 2130763, 1822906, 22428, 700735, 565510, 3308379, 989728, 1563260, 3064689, 654281, 1661349, 7308580, 4603594, 2295562, 6527518], +[6315724, 7354088, 7631684, 4709365, 891294, 5617250, 3274359, 6364818, 3120150, 2348412, 7576824, 7110681, 11595, 4283223, 798241, 6091744, 2253617, 4901931, 8092292, 1844897, 3295484, 7230029, 3132955, 1210694, 1338096, 349800, 2476432, 7076900, 7357732, 1221960, 5850286, 8151859, 7121119, 2463251, 3528923, 905021, 1205403, 3212215, 775815, 4487441, 223038, 3859259, 5354973, 52114, 770932, 1329152, 4571328, 2680166, 2041219, 7782574, 1657899, 7287754, 161530, 1284862, 7182907, 2553122, 6415998, 7229045, 7455303, 1983955, 2135628, 4859888, 2982321, 1264569, 2908629, 527544, 6484919, 4698552, 7132052, 6988765, 4819058, 1156119, 2910896, 3919652, 6781155, 8007003, 2736631, 4074487, 2283377, 4198334, 4699961, 3054275, 2416811, 5178581, 8213099, 5284733, 6006769, 4405391, 3110389, 2529453, 2584441, 3237016, 3445878, 3997068, 229628, 993970, 4614156, 1844768, 1960672, 8373200, 2645393, 2011259, 111391, 5603673, 7081080, 2024960, 99629, 1506795, 3663258, 4080501, 6203342, 1923735, 3393479, 4445974, 182650, 4243714, 146397, 7395507, 5059151, 650350, 2179588, 2936454, 5893701, 1779198, 4132023, 7363025, 4566746, 426455, 4218481, 5440985, 734451, 1041198, 528392, 3798157, 7273072, 6403466, 4513103, 2723876, 1038339, 880702, 6473959, 6505814, 1247186, 2558689, 1701360, 2427067, 8125347, 8142512, 8229301, 3494370, 3912595, 4440811, 19278, 7551118, 2262845, 518691, 1133802, 3024407, 3686497, 6059242, 390013, 5216587, 1597934, 4658562, 2025550, 2620226, 2855904, 3835847, 4781044, 1877872, 852372, 2818228, 4584977, 3661598, 5544907, 217809, 7498506, 2768293, 988083, 3227293, 611680, 3619692, 3866227, 5719379, 394011, 6049343, 370637, 6728427, 3021720, 7728815, 8248453, 1485819, 3988055, 761128, 5853379, 7868155, 535324, 1459706, 4770042, 6709068, 1582147, 4483181, 1071650, 655950, 802244, 1062818, 7394890, 2887449, 1230444, 7884773, 4779130, 272539, 1468385, 7479006, 5773159, 7895747, 2516088, 674941, 2675768, 796145, 5454677, 367708, 7442567, 4356721, 871761, 7741086, 4443151, 8145406, 3148550, 1097589, 5403366, 468049, 7706763, 288532, 3222814, 7647432, 3062153, 8291254, 4374027, 7888033, 1846348, 8087128, 4676258, 329247, 4833197, 6427444, 503619, 2718158, 7619821, 2490179, 4944037, 1784082, 2037282, 2905464, 2926953, 2129682], +[4731210, 4771054, 3352283, 7067112, 834035, 214619, 7335764, 3663659, 5761238, 5679014, 202452, 2421445, 3704026, 7901873, 2096480, 6930831, 2506475, 5046226, 6906970, 3201751, 1759491, 5101961, 72905, 2033687, 6968319, 5896655, 127509, 4213820, 1204226, 7116845, 3342066, 2778469, 7870201, 2476139, 4411910, 5165080, 4226671, 1548784, 6394688, 7844767, 1244156, 7962833, 2163621, 1573553, 3656144, 5995758, 3492310, 4390558, 66173, 2385971, 3985283, 2066201, 776432, 2964066, 6867921, 4104861, 6591964, 3560276, 5247492, 67923, 6596706, 6602225, 7192421, 6874645, 2601101, 4402331, 5476912, 4023656, 7790969, 3277340, 8356407, 368135, 7287311, 7278839, 4255826, 3621989, 4228492, 8104177, 3823018, 5515190, 4754819, 7986913, 3895896, 7988486, 750688, 6431827, 7671618, 1802560, 1673078, 1400770, 1907225, 2894396, 2593750, 2292525, 763585, 8073127, 6170549, 3646334, 6090263, 5807161, 5018049, 5221347, 6212183, 8171649, 4376812, 4295671, 723817, 6929809, 693507, 215770, 1690683, 5271279, 4253705, 6032586, 2123084, 2493457, 4932885, 5758074, 5374458, 8280905, 5685876, 2436047, 7140236, 4071315, 1959070, 6022201, 1900314, 6203865, 4949651, 4959698, 4423796, 4892605, 236144, 3158635, 4331731, 2289910, 2030501, 1437036, 2309413, 7764882, 202913, 7798144, 3347434, 5414501, 1816525, 1968448, 1658467, 1375559, 928871, 4091618, 1953942, 7097831, 2643350, 4426525, 137126, 8261564, 2851107, 7277813, 3328397, 4273481, 1353122, 6422914, 143301, 5227750, 1101521, 1655804, 1835013, 7993059, 2652556, 1864907, 6379005, 8297180, 6953154, 3628678, 82252, 3953628, 1875211, 7007058, 2751785, 5971365, 6359793, 5552132, 4080071, 5648907, 5762800, 508642, 7766367, 4533312, 2437571, 2208609, 6033074, 1827877, 4995270, 1572607, 1200472, 6175924, 5975422, 4881397, 4314060, 4863376, 2056138, 5559739, 5639708, 1618266, 4821978, 7344123, 3019208, 970160, 3193961, 7577319, 979268, 698558, 1298892, 6277147, 5463178, 4020213, 8336142, 4702813, 2787020, 7836534, 6834225, 1942570, 2085930, 3477662, 4506377, 2389248, 4212443, 1371756, 3207245, 7423804, 6298822, 1492495, 3723635, 2161699, 2994283, 1373739, 2343353, 4047884, 4532258, 7281376, 1950627, 2825031, 6535924, 1421606, 6769967, 2582819, 6533885, 4996988, 6330781, 5710328, 1239063, 77082, 8373317, 495209, 5567167, 386302], +[733987, 230719, 1436820, 3105951, 6205497, 2133283, 6938566, 1069453, 6255597, 531533, 8003704, 2850404, 5370150, 7679119, 4149910, 8356166, 151816, 5699006, 2767269, 5132474, 8227574, 4592750, 4744407, 7668690, 4761709, 4603614, 5137553, 4539209, 2625297, 3631065, 8091348, 6321142, 7387081, 5234941, 3699135, 1470731, 8130857, 5541512, 2193558, 5999032, 826447, 4297312, 7826579, 3997252, 4140012, 4713429, 2623197, 2015255, 4295613, 2819742, 3348195, 2853287, 3656875, 2505654, 6507732, 1952398, 2809302, 2937737, 3991846, 3441020, 3228765, 693321, 5475, 3478590, 7920134, 155670, 3682289, 6496199, 7416012, 1199554, 1606990, 2692817, 96826, 4792003, 4145173, 7733402, 3499556, 6869208, 4505077, 3920110, 6060549, 2874957, 5422002, 7789978, 5930279, 38443, 1127204, 5669600, 5001393, 5005676, 5717319, 1980049, 6952211, 2291676, 7289091, 6207355, 4925783, 25933, 8344294, 82731, 2079639, 4100048, 3592265, 4441306, 6564270, 6474109, 3520160, 344254, 1028079, 1475455, 7631177, 3616530, 4139470, 1522573, 5779315, 6065664, 6273111, 4578577, 1050710, 7913617, 22279, 6905599, 4205404, 1006898, 6028589, 1417777, 6952521, 4633753, 6661929, 1072824, 7155906, 3363137, 427633, 2600489, 5707219, 500180, 7395749, 5365318, 8185642, 2583821, 1171580, 5136604, 3521230, 2559807, 178547, 1124372, 5336770, 7819033, 606380, 7932049, 7069811, 2587533, 2178249, 4256187, 1726820, 5557507, 5822857, 6988983, 7082220, 6392037, 7616006, 8032111, 2878877, 6955954, 6404467, 5787255, 6025412, 2841503, 5107603, 4065557, 1356992, 2380678, 781306, 4055933, 2146576, 5689173, 2099856, 5431529, 4322167, 5931233, 3381061, 7514134, 4006956, 7900084, 3941475, 2513937, 6786763, 4172090, 1917615, 497639, 5908243, 3507751, 675393, 1393811, 7198147, 3331467, 1205012, 156627, 364734, 5402309, 7810760, 3074589, 7691308, 1687677, 3505668, 119266, 2520707, 7817725, 7668878, 3729883, 5943317, 1843104, 7295425, 7147888, 3943338, 6275750, 4244318, 3789615, 3576087, 2736385, 3341839, 5771715, 5185144, 7206023, 5363347, 2020489, 3027113, 643644, 889214, 3454897, 6857619, 1101234, 1781454, 1478172, 7847782, 3722870, 7978478, 3554660, 720038, 2253480, 6469204, 4427066, 1581570, 4822804, 3112449, 1799383, 2708015, 898308, 6379465, 1245116, 3064916, 356426, 8309601, 7569787, 2772052, 7740418], +[754154, 6695511, 8372662, 2373360, 244098, 3176263, 5785889, 4799551, 3636845, 6735761, 8097297, 4935160, 3824983, 3903990, 1998970, 3955627, 7088855, 4943690, 1568001, 7817595, 804277, 2914685, 2089005, 225065, 124432, 2450407, 2647794, 4340990, 4264202, 8064875, 3791261, 7655388, 7452784, 1301273, 7150250, 6804262, 4267553, 4359909, 1294891, 911819, 7346622, 3389911, 6856516, 7348678, 7029204, 5191423, 2019681, 5808576, 1281645, 2375011, 5911671, 1537761, 1661925, 871945, 4826527, 2220838, 6770496, 2531723, 4954185, 7242624, 7854623, 2749044, 5345462, 2803371, 7094568, 1365206, 3591108, 4935819, 108286, 7916628, 5634729, 1979002, 2077249, 2638313, 5831252, 3572488, 4369324, 5898299, 5227583, 22653, 781952, 7558230, 6897948, 5390206, 6241791, 2460631, 5590923, 5774583, 2376784, 5295922, 8103877, 6626399, 88129, 4430079, 7178471, 3957353, 3833769, 1665330, 5315458, 1576140, 6944650, 417825, 6085110, 6749835, 355456, 2206153, 6071769, 1005031, 2174117, 3539691, 4792761, 879426, 4742711, 6050402, 2769014, 7993897, 2077889, 8352380, 6506161, 1759683, 2577921, 4356006, 2520029, 5192286, 4495792, 3072082, 6149919, 6536525, 6854670, 5623325, 7817437, 346804, 6634637, 7604058, 6904570, 1209755, 5833713, 3825109, 3244115, 6895788, 5207529, 787707, 7722706, 8092061, 24795, 6491114, 4874354, 1960019, 7879357, 6278169, 4074613, 3494560, 4130656, 3126959, 5723556, 4747002, 7921891, 556810, 3816330, 1830439, 3795370, 587279, 1427106, 1772921, 8173944, 1507860, 4762778, 5400150, 7163015, 3139642, 6288127, 6914078, 5244372, 5147140, 4803735, 599895, 7504827, 2037663, 8029339, 5600109, 6820435, 681058, 7342938, 6797209, 1098068, 3926630, 1279659, 1498535, 4269767, 2498206, 4225001, 1131144, 3760106, 5302580, 2550219, 7834920, 7573255, 4761168, 1986542, 3117959, 3487739, 3879836, 5435830, 7330582, 5357785, 27820, 1986969, 7698917, 4404291, 4101946, 29563, 5469339, 349397, 6971467, 6176278, 8144181, 2682162, 4500533, 2614011, 3647541, 6394889, 4580925, 8164432, 3080418, 6499851, 710058, 373753, 356219, 7324678, 2083754, 6750012, 3616354, 629521, 3903633, 7317681, 4212618, 538268, 7778490, 7817553, 7954212, 8331676, 5760826, 2907514, 150621, 7904720, 4951921, 2070979, 6673155, 4410000, 4832337, 5621873, 5020297, 5684588, 7296546, 6422687, 3817361], +[18089, 4147725, 2716887, 5827831, 640946, 5502429, 1946328, 983814, 5997468, 4302149, 2578816, 5267307, 6048047, 4827448, 4482214, 6755951, 2362362, 2166840, 5923149, 2631026, 4077603, 2494491, 4433969, 3361215, 2163877, 6819215, 6109737, 1876041, 2041323, 5927118, 3351039, 727392, 1344754, 6966636, 2631908, 3954699, 4621403, 8294496, 4225740, 731528, 3157337, 5314259, 6132895, 7265655, 4308757, 542037, 706462, 6495848, 7707012, 7820681, 6158962, 3046119, 1184855, 2405644, 6013720, 5116014, 1298567, 4068714, 2206826, 6069031, 5047232, 7130600, 6311214, 5222892, 5073757, 5257714, 3431718, 2485911, 6254603, 6877932, 2657985, 4376356, 8034373, 3335591, 1262696, 2232102, 6799826, 6435943, 4522715, 5498365, 5030240, 1603116, 2815124, 6475350, 1488229, 601391, 7911391, 3431414, 3645548, 2235785, 3103191, 6827019, 5678348, 1345109, 2766087, 6486983, 8118562, 3569350, 2950236, 7183920, 7098835, 2083141, 5633814, 3107375, 32440, 1997634, 5309210, 459021, 5596415, 2300413, 3289478, 4281742, 6347922, 6463677, 268093, 2070248, 5028444, 4632151, 7449235, 1910702, 4560625, 3552168, 4585653, 2784145, 8125473, 7944432, 1729842, 5795682, 3811102, 1276484, 619886, 478758, 7995384, 3199740, 1549113, 5230350, 1326032, 4483632, 109717, 5194557, 5459540, 2020163, 3108033, 1110160, 1491251, 4819947, 7047659, 4845177, 381160, 7506361, 3213591, 7054442, 7380587, 6213274, 2396277, 7529153, 2345272, 6427944, 4476512, 6892387, 4553614, 8342046, 1048981, 5221745, 6818248, 4627882, 7300384, 2440090, 2162035, 6765459, 6798731, 5855553, 5599734, 7220910, 4044362, 5877241, 3845445, 2947320, 6429767, 2554719, 4248516, 308275, 2507982, 4949556, 3319916, 7610938, 7474056, 7161506, 2599375, 2299792, 6974639, 6392687, 6595467, 146745, 6897535, 3164219, 1114225, 4387693, 6146772, 6660280, 8084306, 6640512, 2019732, 5271488, 8035793, 2305708, 3741820, 1912100, 945750, 5359388, 5471310, 7662045, 1808592, 610512, 1441543, 119029, 1080938, 307685, 2500309, 7747445, 3343480, 7341069, 5325691, 7428491, 4269389, 6902137, 5418565, 2996572, 1646733, 383595, 4299606, 7482770, 6918712, 5977396, 1938123, 1365910, 6314865, 4427162, 2461892, 1629012, 7749879, 1967710, 4270079, 2546754, 2681194, 7171807, 683058, 4858729, 5415704, 3018172, 7077154, 4588586, 7448106, 3791893, 1014796, 3736883]] +ct0: [[8352065, 11234, 8375999, 8341752, 8378553, 6922, 8379575, 8373695, 4764, 8371266, 8377810, 9960, 16746, 8365463, 8368640, 15037, 36637, 8377991, 8360965, 8356500, 7581, 7529, 13984, 8375264, 3125, 8379745, 2832, 8369650, 8358958, 9725, 13820, 8355623, 8379132, 8370404, 13139, 8374929, 8378505, 8360003, 16882, 11155, 8365535, 242, 7155, 20646, 13401, 6710, 17491, 8376426, 8366915, 8369454, 8366295, 8376160, 22347, 8357602, 8379278, 14047, 8376623, 18350, 8375016, 8380052, 1455, 8368844, 38432, 8370335, 18010, 8372216, 8368077, 11820, 15611, 15095, 8354547, 34675, 8376987, 8374369, 8373625, 8367085, 8371827, 7776, 8367794, 8360528, 9663, 21524, 15612, 8375139, 8378343, 38945, 14643, 4197, 8352459, 8369565, 13403, 45233, 8364796, 7519, 8365771, 5594, 229, 8369366, 8611, 8365163, 8362156, 8369178, 8364279, 12917, 11799, 15657, 8366972, 4796, 8352244, 6650, 184, 8370071, 8357121, 24182, 875, 9950, 8361968, 8363903, 8372643, 8374906, 2915, 6762, 13556, 8379180, 7582, 1169, 20101, 13195, 8375088, 8364953, 4404, 14294, 13897, 14672, 8364376, 25323, 8377072, 2755, 8378658, 8379730, 10123, 8366406, 8359002, 15703, 8369218, 8355975, 5717, 8380231, 8366493, 8373777, 9685, 8339385, 3911, 8373686, 8333833, 3359, 20411, 12242, 16852, 8331865, 8376417, 37632, 16791, 9985, 8365558, 6098, 10124, 4143, 8368939, 8356810, 8377959, 4404, 8364450, 827, 8358546, 8371535, 8360949, 8344534, 2458, 1755, 11366, 7940, 8377129, 247, 11259, 8375765, 16699, 8367513, 21275, 8361232, 8359466, 22734, 14923, 8376558, 8379009, 13445, 11483, 8348349, 8376539, 29906, 21612, 8346217, 17326, 14818, 3903, 8362834, 8364172, 8353979, 8046, 8377067, 8373251, 8373446, 8309, 2421, 3030, 8352032, 8375417, 67653, 8364590, 8360159, 12464, 19148, 23077, 8347573, 8364201, 5018, 8370911, 7787, 8374243, 2249, 7000, 29255, 8364894, 7902, 7399, 8375431, 8365702, 23701, 8378811, 8379531, 8358226, 27854, 19701, 8365407, 8373434, 29835, 4180, 8377606, 8350572, 11691, 8372008, 28216, 20654, 8375863, 2083, 13350], +[4997, 24605, 8354528, 8332814, 17430, 3943, 2613, 8356685, 8354655, 8364104, 8372115, 8367986, 8372874, 15704, 8352296, 8376312, 13198, 18760, 21827, 19209, 3527, 13291, 7348, 10497, 579, 8368809, 16720, 8913, 8365267, 12808, 508, 4857, 8356488, 8369081, 8370110, 24727, 8367654, 8366360, 8357604, 14041, 21434, 8375517, 8378190, 12896, 8356321, 13902, 14107, 8370502, 8673, 8355709, 8346069, 2204, 19914, 141, 8368404, 1803, 1910, 26788, 8353542, 11387, 8379667, 8356096, 4438, 15724, 7694, 8357408, 8360856, 7175, 8367885, 7544, 8357418, 5048, 4401, 17425, 8361291, 8365401, 26912, 9355, 8359137, 8373815, 8374770, 12053, 2811, 8364028, 8369279, 8373259, 22932, 7241, 8371452, 8369655, 8369096, 8365141, 8370388, 11544, 13282, 8575, 17666, 34739, 8375543, 8354, 8368912, 8379336, 8364300, 309, 8366029, 8374970, 13603, 6042, 8363122, 8364120, 8379646, 4967, 8373317, 2306, 10558, 13037, 8374498, 8369521, 55, 37548, 8374616, 8363967, 3261, 29273, 23871, 8358483, 8347210, 8368951, 8372629, 8349864, 8364003, 8373703, 40424, 8365423, 5545, 5789, 4972, 8351741, 8354309, 10974, 13306, 8363069, 12589, 8367628, 13033, 17624, 8379590, 8371013, 10719, 8509, 4951, 8364499, 13270, 14423, 12961, 8349161, 8371654, 27715, 8367529, 8364386, 22914, 8365575, 31662, 11673, 8376495, 8375569, 11438, 8378842, 8366475, 956, 8371728, 23220, 8372160, 8361457, 21049, 36239, 8348115, 8373619, 1934, 8348811, 8371667, 8371799, 8363513, 8379456, 16260, 2002, 9278, 8359813, 24591, 8356024, 8363683, 40540, 13410, 8374160, 8368093, 41942, 7326, 8358375, 4321, 32171, 8369282, 8371881, 22497, 8373903, 913, 10449, 8371367, 9462, 4859, 8368460, 29423, 8371319, 8378374, 23228, 8367045, 8366640, 16632, 8375881, 8376939, 733, 3919, 10842, 8378332, 8354339, 5434, 14850, 9409, 14673, 1050, 8374359, 18335, 8563, 8374771, 8364962, 14599, 8375530, 8352151, 2423, 15723, 4403, 8349587, 27021, 25846, 24645, 8335621, 8377760, 5742, 8376192, 6348, 3887, 8375624, 9239, 3183, 8373354, 8365815, 3928], +[8378221, 8369934, 3947, 8338150, 8368919, 8373174, 753, 30720, 3301, 12286, 28622, 540, 8368428, 9709, 4007, 8364672, 8355187, 9361, 8374787, 27624, 2115, 8371053, 8347408, 8379122, 8379282, 8344759, 14339, 8378841, 8347580, 8374916, 7467, 8360502, 6938, 22291, 528, 11792, 25825, 8353617, 166, 432, 7273, 8368237, 8362781, 10431, 22633, 8367796, 8375992, 422, 34695, 9219, 4285, 8359127, 8378946, 8377054, 8359543, 8371138, 20859, 6833, 8363754, 8366494, 17375, 8360334, 8376525, 8336301, 8344705, 6980, 8379735, 8370194, 8357382, 4417, 10577, 15931, 8357083, 6432, 31194, 8365812, 5918, 11378, 8344, 14908, 8358581, 8367498, 8376464, 17438, 5231, 8366321, 8356562, 18159, 8376240, 8371978, 8359619, 11368, 8375903, 18809, 8357371, 7289, 2932, 1231, 5831, 8371717, 8365420, 8369352, 8353751, 14382, 4600, 5209, 8374138, 8376372, 8059, 4998, 8362997, 4973, 21988, 16446, 8351507, 13437, 21390, 8376564, 16743, 8368297, 1020, 8344974, 3460, 8367782, 3359, 32654, 8367483, 8361110, 23224, 8352669, 8378304, 8369669, 8378169, 5329, 2249, 8370483, 8354193, 8365187, 17311, 8379162, 8371728, 48968, 11997, 8335432, 24405, 26946, 8435, 12647, 8373474, 8378410, 16690, 4869, 60, 481, 5345, 30012, 221, 8366780, 8365955, 8378580, 2923, 16495, 4986, 15200, 8361548, 8378877, 39104, 10704, 8368036, 18284, 8357085, 8369870, 25564, 8363409, 8373015, 5472, 11784, 8369257, 8375073, 8374152, 4551, 2229, 12708, 35949, 8379085, 9755, 649, 8369497, 22583, 8366051, 20942, 31320, 18486, 8371011, 8368727, 8365104, 8374837, 8369516, 8376410, 8335284, 26666, 8377898, 35868, 3285, 8369606, 13227, 8377369, 4979, 14443, 6745, 8363818, 8373239, 13411, 8362857, 14884, 4101, 12427, 6547, 30518, 18054, 13209, 8370525, 8362327, 2947, 1384, 8363712, 2362, 8367299, 8363577, 4050, 8374488, 11570, 8346975, 8377500, 8363343, 17886, 8355848, 6703, 8355460, 8366698, 8376957, 15980, 14059, 20642, 20362, 806, 8374079, 7906, 8376262, 12498, 8375456, 10896, 8375264, 56, 8369542, 8369440], +[8358998, 8374460, 23095, 8372778, 8350324, 8372276, 8372678, 11765, 8356729, 8354456, 8342075, 11969, 8367207, 8832, 8360949, 8374756, 18837, 8379872, 15031, 34746, 4576, 18157, 8363297, 8375243, 8372433, 19965, 8378276, 2251, 8370904, 8376615, 15752, 8358161, 8369143, 8352893, 8376176, 10700, 8355785, 8365839, 5268, 8366916, 8372403, 8379046, 1374, 4661, 8358843, 17303, 8373411, 8372100, 8369812, 8362224, 18577, 6178, 8363718, 3701, 15421, 13086, 8375992, 8913, 8367971, 32062, 109, 8334959, 12053, 8182, 4582, 8377389, 8379982, 8376363, 1989, 7200, 2642, 8365592, 8369464, 14975, 8375214, 8356925, 8380391, 19008, 31289, 8356940, 8379084, 15572, 1554, 16461, 8379370, 8363752, 8697, 8761, 17698, 27099, 4512, 8376613, 8358447, 18709, 8379567, 13330, 2094, 8366889, 8369832, 8376969, 6865, 11757, 8360924, 8359458, 4118, 6268, 26872, 8347816, 8372661, 17222, 11529, 8370051, 8363617, 15177, 20180, 13778, 32566, 8359095, 18942, 8279, 19873, 8373706, 8353196, 8380163, 11801, 12082, 12094, 8366544, 8377106, 1604, 11304, 8373096, 8376716, 6299, 26078, 8370546, 13983, 8379683, 15357, 23070, 8372249, 140, 15481, 8372980, 8366391, 5696, 8371511, 17729, 8363581, 8376744, 8366427, 16275, 14190, 8377465, 8367668, 8376667, 8372268, 13853, 2752, 8376706, 8350194, 31012, 8369507, 10054, 18610, 28325, 10832, 8355152, 6350, 15435, 8362795, 17075, 15483, 8360983, 3268, 8378550, 6808, 22044, 8378556, 8360248, 8351601, 2624, 8367045, 12124, 8360779, 35242, 4692, 12041, 8371852, 15468, 42283, 23984, 8375998, 20443, 8852, 8364965, 17692, 8373115, 8379272, 18266, 8361758, 1984, 8362275, 8367351, 21234, 11162, 8366978, 1880, 13120, 8371984, 5986, 8356582, 8380054, 26582, 8262, 15025, 8341687, 12438, 34901, 668, 8375947, 3785, 8373960, 5501, 8378704, 8379916, 8363552, 18482, 34044, 5696, 8350048, 8375873, 25069, 8368825, 8376938, 17709, 8358515, 26400, 8359738, 7334, 19264, 11677, 946, 6095, 8374787, 8378572, 14569, 8348360, 8374688, 2393, 8370786, 8376759, 32568, 12523, 16797, 8357256], +[3392, 25473, 8347605, 11687, 8356349, 29438, 8364685, 8360038, 22734, 18260, 8361007, 2048, 4038, 24733, 6710, 8375744, 8348524, 21335, 8475, 8354011, 8375271, 10066, 14311, 8350506, 8361823, 8362858, 27432, 8370112, 8373269, 26108, 8360560, 38546, 27288, 8374042, 12764, 22258, 5388, 8367023, 1433, 1850, 8375699, 8352629, 8358835, 8338838, 8377351, 8360303, 8364034, 8374148, 2736, 8376987, 1406, 28931, 32691, 8368160, 8363045, 8373898, 16612, 1800, 8355501, 40646, 8379886, 2428, 20200, 8346916, 20635, 29526, 8364737, 8352461, 8380265, 8363832, 22740, 5942, 8376988, 12704, 16220, 8373186, 106, 8371067, 3407, 8354161, 8377083, 8369114, 2298, 16369, 8369180, 6573, 8378274, 8372810, 12251, 8372563, 28452, 8367116, 17438, 604, 8377176, 8362937, 4463, 5181, 8380382, 8371087, 2429, 1807, 16950, 4024, 8368196, 8350724, 19081, 13135, 8360038, 8369598, 26876, 29136, 8380245, 8358333, 8369920, 14049, 22763, 8346337, 8376055, 8374857, 8371687, 8379956, 8359391, 31574, 14047, 8375608, 27180, 5081, 16901, 20620, 2078, 8370809, 4386, 8369109, 8374208, 8357862, 8365917, 15488, 8328437, 31101, 30665, 8373735, 8325800, 15577, 9993, 4532, 2943, 8373943, 19426, 8369017, 8354304, 24469, 8359412, 14306, 8373288, 8368881, 8359525, 14957, 8378292, 8374360, 8368206, 4528, 8366671, 40, 8379564, 36416, 8367732, 8363842, 8343985, 3582, 1408, 8371646, 6571, 8375526, 8375632, 15831, 8354114, 1924, 37767, 15635, 8342224, 5299, 26765, 30363, 8369394, 8360415, 8376308, 46882, 3389, 8362820, 6810, 174, 8378756, 3285, 8366646, 8360492, 6861, 1812, 8367480, 25181, 16489, 8355816, 8361466, 8369642, 30627, 10283, 8371002, 8378407, 7938, 8373168, 8365484, 5167, 8345247, 3777, 4445, 8361207, 8376957, 5657, 1539, 25282, 8377046, 392, 7803, 8371827, 10468, 23611, 8340852, 8361131, 23160, 8848, 32214, 8361859, 8377182, 14916, 21140, 8379066, 8373546, 8374001, 14191, 20040, 8376694, 7066, 34733, 8366980, 8376900, 8376268, 7110, 6581, 8358354, 8361587, 21591, 8356320, 16157, 8361125, 12101, 185], +[2134, 8355348, 17721, 9694, 29213, 43685, 4838, 8354709, 8375621, 8370910, 8376779, 8342477, 8379591, 8352488, 22678, 8371153, 615, 4605, 17846, 2630, 8354023, 9940, 8369561, 8347402, 18207, 5514, 762, 8378465, 1173, 13213, 15970, 14051, 8370083, 20364, 8358438, 14423, 5200, 8339761, 8504, 8866, 8365984, 8367316, 3891, 22518, 8344687, 8350353, 8371493, 6268, 8361035, 8360972, 5115, 6115, 21494, 12338, 2433, 27128, 8366655, 8373688, 8358970, 22418, 579, 8368562, 8357982, 18029, 9807, 8363079, 8367759, 8369616, 16411, 9645, 8377343, 8366326, 8363358, 7112, 8372155, 8357804, 2574, 18335, 16132, 18299, 8376394, 8367124, 8245, 3267, 8352832, 15251, 4152, 8377313, 8365645, 3867, 8364968, 8368253, 8373858, 8370778, 2718, 8369098, 13561, 6208, 7047, 25042, 8367510, 8369345, 7878, 12886, 8375217, 9985, 970, 106, 8355993, 27543, 8378228, 6311, 8376772, 1193, 3547, 8362300, 8379877, 8378800, 8370206, 8364831, 16693, 27259, 8353191, 8376478, 8374636, 678, 11380, 19647, 8368043, 34162, 63, 26742, 3051, 8372579, 8368545, 8362209, 6645, 16103, 21846, 8372112, 14652, 8366152, 8363118, 18561, 6190, 8366038, 4105, 8362960, 27201, 7024, 2126, 8354017, 8379806, 8364439, 9911, 563, 6996, 8375455, 8366268, 8375851, 8366945, 8358564, 39819, 8350012, 8346310, 8379714, 13269, 5045, 8360503, 8366440, 8373865, 18670, 5456, 29092, 16876, 8362253, 8376417, 31071, 5310, 8363344, 8371911, 8368572, 6359, 8368441, 389, 2290, 8370738, 8348395, 8369469, 30924, 32631, 1759, 8355913, 8377316, 3707, 4873, 8362742, 14461, 1748, 8378620, 8377462, 17298, 8367015, 8359786, 8374293, 8373300, 7628, 14253, 23611, 8353087, 8361123, 6501, 7268, 8374545, 8371333, 3919, 20316, 8359831, 8377830, 31027, 8365783, 8358202, 8370706, 126, 8370745, 30898, 8370982, 8369208, 12798, 8378118, 8374149, 8380246, 5131, 8110, 8377766, 11483, 3334, 18393, 8377118, 8341040, 8380331, 7690, 8374703, 8371916, 8377366, 3513, 8354384, 10827, 8373879, 18188, 4823, 8353098, 8377649, 6348, 2677, 6506]] +-ct0: [[28352, 8369183, 4418, 38665, 1864, 8373495, 842, 6722, 8375653, 9151, 2607, 8370457, 8363671, 14954, 11777, 8365380, 8343780, 2426, 19452, 23917, 8372836, 8372888, 8366433, 5153, 8377292, 672, 8377585, 10767, 21459, 8370692, 8366597, 24794, 1285, 10013, 8367278, 5488, 1912, 20414, 8363535, 8369262, 14882, 8380175, 8373262, 8359771, 8367016, 8373707, 8362926, 3991, 13502, 10963, 14122, 4257, 8358070, 22815, 1139, 8366370, 3794, 8362067, 5401, 365, 8378962, 11573, 8341985, 10082, 8362407, 8201, 12340, 8368597, 8364806, 8365322, 25870, 8345742, 3430, 6048, 6792, 13332, 8590, 8372641, 12623, 19889, 8370754, 8358893, 8364805, 5278, 2074, 8341472, 8365774, 8376220, 27958, 10852, 8367014, 8335184, 15621, 8372898, 14646, 8374823, 8380188, 11051, 8371806, 15254, 18261, 11239, 16138, 8367500, 8368618, 8364760, 13445, 8375621, 28173, 8373767, 8380233, 10346, 23296, 8356235, 8379542, 8370467, 18449, 16514, 7774, 5511, 8377502, 8373655, 8366861, 1237, 8372835, 8379248, 8360316, 8367222, 5329, 15464, 8376013, 8366123, 8366520, 8365745, 16041, 8355094, 3345, 8377662, 1759, 687, 8370294, 14011, 21415, 8364714, 11199, 24442, 8374700, 186, 13924, 6640, 8370732, 41032, 8376506, 6731, 46584, 8377058, 8360006, 8368175, 8363565, 48552, 4000, 8342785, 8363626, 8370432, 14859, 8374319, 8370293, 8376274, 11478, 23607, 2458, 8376013, 15967, 8379590, 21871, 8882, 19468, 35883, 8377959, 8378662, 8369051, 8372477, 3288, 8380170, 8369158, 4652, 8363718, 12904, 8359142, 19185, 20951, 8357683, 8365494, 3859, 1408, 8366972, 8368934, 32068, 3878, 8350511, 8358805, 34200, 8363091, 8365599, 8376514, 17583, 16245, 26438, 8372371, 3350, 7166, 6971, 8372108, 8377996, 8377387, 28385, 5000, 8312764, 15827, 20258, 8367953, 8361269, 8357340, 32844, 16216, 8375399, 9506, 8372630, 6174, 8378168, 8373417, 8351162, 15523, 8372515, 8373018, 4986, 14715, 8356716, 1606, 886, 22191, 8352563, 8360716, 15010, 6983, 8350582, 8376237, 2811, 29845, 8368726, 8409, 8352201, 8359763, 4554, 8378334, 8367067], +[8375420, 8355812, 25889, 47603, 8362987, 8376474, 8377804, 23732, 25762, 16313, 8302, 12431, 7543, 8364713, 28121, 4105, 8367219, 8361657, 8358590, 8361208, 8376890, 8367126, 8373069, 8369920, 8379838, 11608, 8363697, 8371504, 15150, 8367609, 8379909, 8375560, 23929, 11336, 10307, 8355690, 12763, 14057, 22813, 8366376, 8358983, 4900, 2227, 8367521, 24096, 8366515, 8366310, 9915, 8371744, 24708, 34348, 8378213, 8360503, 8380276, 12013, 8378614, 8378507, 8353629, 26875, 8369030, 750, 24321, 8375979, 8364693, 8372723, 23009, 19561, 8373242, 12532, 8372873, 22999, 8375369, 8376016, 8362992, 19126, 15016, 8353505, 8371062, 21280, 6602, 5647, 8368364, 8377606, 16389, 11138, 7158, 8357485, 8373176, 8965, 10762, 11321, 15276, 10029, 8368873, 8367135, 8371842, 8362751, 8345678, 4874, 8372063, 11505, 1081, 16117, 8380108, 14388, 5447, 8366814, 8374375, 17295, 16297, 771, 8375450, 7100, 8378111, 8369859, 8367380, 5919, 10896, 8380362, 8342869, 5801, 16450, 8377156, 8351144, 8356546, 21934, 33207, 11466, 7788, 30553, 16414, 6714, 8339993, 14994, 8374872, 8374628, 8375445, 28676, 26108, 8369443, 8367111, 17348, 8367828, 12789, 8367384, 8362793, 827, 9404, 8369698, 8371908, 8375466, 15918, 8367147, 8365994, 8367456, 31256, 8763, 8352702, 12888, 16031, 8357503, 14842, 8348755, 8368744, 3922, 4848, 8368979, 1575, 13942, 8379461, 8689, 8357197, 8257, 18960, 8359368, 8344178, 32302, 6798, 8378483, 31606, 8750, 8618, 16904, 961, 8364157, 8378415, 8371139, 20604, 8355826, 24393, 16734, 8339877, 8367007, 6257, 12324, 8338475, 8373091, 22042, 8376096, 8348246, 11135, 8536, 8357920, 6514, 8379504, 8369968, 9050, 8370955, 8375558, 11957, 8350994, 9098, 2043, 8357189, 13372, 13777, 8363785, 4536, 3478, 8379684, 8376498, 8369575, 2085, 26078, 8374983, 8365567, 8371008, 8365744, 8379367, 6058, 8362082, 8371854, 5646, 15455, 8365818, 4887, 28266, 8377994, 8364694, 8376014, 30830, 8353396, 8354571, 8355772, 44796, 2657, 8374675, 4225, 8374069, 8376530, 4793, 8371178, 8377234, 7063, 14602, 8376489], +[2196, 10483, 8376470, 42267, 11498, 7243, 8379664, 8349697, 8377116, 8368131, 8351795, 8379877, 11989, 8370708, 8376410, 15745, 25230, 8371056, 5630, 8352793, 8378302, 9364, 33009, 1295, 1135, 35658, 8366078, 1576, 32837, 5501, 8372950, 19915, 8373479, 8358126, 8379889, 8368625, 8354592, 26800, 8380251, 8379985, 8373144, 12180, 17636, 8369986, 8357784, 12621, 4425, 8379995, 8345722, 8371198, 8376132, 21290, 1471, 3363, 20874, 9279, 8359558, 8373584, 16663, 13923, 8363042, 20083, 3892, 44116, 35712, 8373437, 682, 10223, 23035, 8376000, 8369840, 8364486, 23334, 8373985, 8349223, 14605, 8374499, 8369039, 8372073, 8365509, 21836, 12919, 3953, 8362979, 8375186, 14096, 23855, 8362258, 4177, 8439, 20798, 8369049, 4514, 8361608, 23046, 8373128, 8377485, 8379186, 8374586, 8700, 14997, 11065, 26666, 8366035, 8375817, 8375208, 6279, 4045, 8372358, 8375419, 17420, 8375444, 8358429, 8363971, 28910, 8366980, 8359027, 3853, 8363674, 12120, 8379397, 35443, 8376957, 12635, 8377058, 8347763, 12934, 19307, 8357193, 27748, 2113, 10748, 2248, 8375088, 8378168, 9934, 26224, 15230, 8363106, 1255, 8689, 8331449, 8368420, 44985, 8356012, 8353471, 8371982, 8367770, 6943, 2007, 8363727, 8375548, 8380357, 8379936, 8375072, 8350405, 8380196, 13637, 14462, 1837, 8377494, 8363922, 8375431, 8365217, 18869, 1540, 8341313, 8369713, 12381, 8362133, 23332, 10547, 8354853, 17008, 7402, 8374945, 8368633, 11160, 5344, 6265, 8375866, 8378188, 8367709, 8344468, 1332, 8370662, 8379768, 10920, 8357834, 14366, 8359475, 8349097, 8361931, 9406, 11690, 15313, 5580, 10901, 4007, 45133, 8353751, 2519, 8344549, 8377132, 10811, 8367190, 3048, 8375438, 8365974, 8373672, 16599, 7178, 8367006, 17560, 8365533, 8376316, 8367990, 8373870, 8349899, 8362363, 8367208, 9892, 18090, 8377470, 8379033, 16705, 8378055, 13118, 16840, 8376367, 5929, 8368847, 33442, 2917, 17074, 8362531, 24569, 8373714, 24957, 13719, 3460, 8364437, 8366358, 8359775, 8360055, 8379611, 6338, 8372511, 4155, 8367919, 4961, 8369521, 5153, 8380361, 10875, 10977], +[21419, 5957, 8357322, 7639, 30093, 8141, 7739, 8368652, 23688, 25961, 38342, 8368448, 13210, 8371585, 19468, 5661, 8361580, 545, 8365386, 8345671, 8375841, 8362260, 17120, 5174, 7984, 8360452, 2141, 8378166, 9513, 3802, 8364665, 22256, 11274, 27524, 4241, 8369717, 24632, 14578, 8375149, 13501, 8014, 1371, 8379043, 8375756, 21574, 8363114, 7006, 8317, 10605, 18193, 8361840, 8374239, 16699, 8376716, 8364996, 8367331, 4425, 8371504, 12446, 8348355, 8380308, 45458, 8368364, 8372235, 8375835, 3028, 435, 4054, 8378428, 8373217, 8377775, 14825, 10953, 8365442, 5203, 23492, 26, 8361409, 8349128, 23477, 1333, 8364845, 8378863, 8363956, 1047, 16665, 8371720, 8371656, 8362719, 8353318, 8375905, 3804, 21970, 8361708, 850, 8367087, 8378323, 13528, 10585, 3448, 8373552, 8368660, 19493, 20959, 8376299, 8374149, 8353545, 32601, 7756, 8363195, 8368888, 10366, 16800, 8365240, 8360237, 8366639, 8347851, 21322, 8361475, 8372138, 8360544, 6711, 27221, 254, 8368616, 8368335, 8368323, 13873, 3311, 8378813, 8369113, 7321, 3701, 8374118, 8354339, 9871, 8366434, 734, 8365060, 8357347, 8168, 8380277, 8364936, 7437, 14026, 8374721, 8906, 8362688, 16836, 3673, 13990, 8364142, 8366227, 2952, 12749, 3750, 8149, 8366564, 8377665, 3711, 30223, 8349405, 10910, 8370363, 8361807, 8352092, 8369585, 25265, 8374067, 8364982, 17622, 8363342, 8364934, 19434, 8377149, 1867, 8373609, 8358373, 1861, 20169, 28816, 8377793, 13372, 8368293, 19638, 8345175, 8375725, 8368376, 8565, 8364949, 8338134, 8356433, 4419, 8359974, 8371565, 15452, 8362725, 7302, 1145, 8362151, 18659, 8378433, 18142, 13066, 8359183, 8369255, 13439, 8378537, 8367297, 8433, 8374431, 23835, 363, 8353835, 8372155, 8365392, 38730, 8367979, 8345516, 8379749, 4470, 8376632, 6457, 8374916, 1713, 501, 16865, 8361935, 8346373, 8374721, 30369, 4544, 8355348, 11592, 3479, 8362708, 21902, 8354017, 20679, 8373083, 8361153, 8368740, 8379471, 8374322, 5630, 1845, 8365848, 32057, 5729, 8378024, 9631, 3658, 8347849, 8367894, 8363620, 23161], +[8377025, 8354944, 32812, 8368730, 24068, 8350979, 15732, 20379, 8357683, 8362157, 19410, 8378369, 8376379, 8355684, 8373707, 4673, 31893, 8359082, 8371942, 26406, 5146, 8370351, 8366106, 29911, 18594, 17559, 8352985, 10305, 7148, 8354309, 19857, 8341871, 8353129, 6375, 8367653, 8358159, 8375029, 13394, 8378984, 8378567, 4718, 27788, 21582, 41579, 3066, 20114, 16383, 6269, 8377681, 3430, 8379011, 8351486, 8347726, 12257, 17372, 6519, 8363805, 8378617, 24916, 8339771, 531, 8377989, 8360217, 33501, 8359782, 8350891, 15680, 27956, 152, 16585, 8357677, 8374475, 3429, 8367713, 8364197, 7231, 8380311, 9350, 8377010, 26256, 3334, 11303, 8378119, 8364048, 11237, 8373844, 2143, 7607, 8368166, 7854, 8351965, 13301, 8362979, 8379813, 3241, 17480, 8375954, 8375236, 35, 9330, 8377988, 8378610, 8363467, 8376393, 12221, 29693, 8361336, 8367282, 20379, 10819, 8353541, 8351281, 172, 22084, 10497, 8366368, 8357654, 34080, 4362, 5560, 8730, 461, 21026, 8348843, 8366370, 4809, 8353237, 8375336, 8363516, 8359797, 8378339, 9608, 8376031, 11308, 6209, 22555, 14500, 8364929, 51980, 8349316, 8349752, 6682, 54617, 8364840, 8370424, 8375885, 8377474, 6474, 8360991, 11400, 26113, 8355948, 21005, 8366111, 7129, 11536, 20892, 8365460, 2125, 6057, 12211, 8375889, 13746, 8380377, 853, 8344001, 12685, 16575, 36432, 8376835, 8379009, 8771, 8373846, 4891, 4785, 8364586, 26303, 8378493, 8342650, 8364782, 38193, 8375118, 8353652, 8350054, 11023, 20002, 4109, 8333535, 8377028, 17597, 8373607, 8380243, 1661, 8377132, 13771, 19925, 8373556, 8378605, 12937, 8355236, 8363928, 24601, 18951, 10775, 8349790, 8370134, 9415, 2010, 8372479, 7249, 14933, 8375250, 35170, 8376640, 8375972, 19210, 3460, 8374760, 8378878, 8355135, 3371, 8380025, 8372614, 8590, 8369949, 8356806, 39565, 19286, 8357257, 8371569, 8348203, 18558, 3235, 8365501, 8359277, 1351, 6871, 6416, 8366226, 8360377, 3723, 8373351, 8345684, 13437, 3517, 4149, 8373307, 8373836, 22063, 18830, 8358826, 24097, 8364260, 19292, 8368316, 8380232], +[8378283, 25069, 8362696, 8370723, 8351204, 8336732, 8375579, 25708, 4796, 9507, 3638, 37940, 826, 27929, 8357739, 9264, 8379802, 8375812, 8362571, 8377787, 26394, 8370477, 10856, 33015, 8362210, 8374903, 8379655, 1952, 8379244, 8367204, 8364447, 8366366, 10334, 8360053, 21979, 8365994, 8375217, 40656, 8371913, 8371551, 14433, 13101, 8376526, 8357899, 35730, 30064, 8924, 8374149, 19382, 19445, 8375302, 8374302, 8358923, 8368079, 8377984, 8353289, 13762, 6729, 21447, 8357999, 8379838, 11855, 22435, 8362388, 8370610, 17338, 12658, 10801, 8364006, 8370772, 3074, 14091, 17059, 8373305, 8262, 22613, 8377843, 8362082, 8364285, 8362118, 4023, 13293, 8372172, 8377150, 27585, 8365166, 8376265, 3104, 14772, 8376550, 15449, 12164, 6559, 9639, 8377699, 11319, 8366856, 8374209, 8373370, 8355375, 12907, 11072, 8372539, 8367531, 5200, 8370432, 8379447, 8380311, 24424, 8352874, 2189, 8374106, 3645, 8379224, 8376870, 18117, 540, 1617, 10211, 15586, 8363724, 8353158, 27226, 3939, 5781, 8379739, 8369037, 8360770, 12374, 8346255, 8380354, 8353675, 8377366, 7838, 11872, 18208, 8373772, 8364314, 8358571, 8305, 8365765, 14265, 17299, 8361856, 8374227, 14379, 8376312, 17457, 8353216, 8373393, 8378291, 26400, 611, 15978, 8370506, 8379854, 8373421, 4962, 14149, 4566, 13472, 21853, 8340598, 30405, 34107, 703, 8367148, 8375372, 19914, 13977, 6552, 8361747, 8374961, 8351325, 8363541, 18164, 4000, 8349346, 8375107, 17073, 8506, 11845, 8374058, 11976, 8380028, 8378127, 9679, 32022, 10948, 8349493, 8347786, 8378658, 24504, 3101, 8376710, 8375544, 17675, 8365956, 8378669, 1797, 2955, 8363119, 13402, 20631, 6124, 7117, 8372789, 8366164, 8356806, 27330, 19294, 8373916, 8373149, 5872, 9084, 8376498, 8360101, 20586, 2587, 8349390, 14634, 22215, 9711, 8380291, 9672, 8349519, 9435, 11209, 8367619, 2299, 6268, 171, 8375286, 8372307, 2651, 8368934, 8377083, 8362024, 3299, 39377, 86, 8372727, 5714, 8501, 3051, 8376904, 26033, 8369590, 6538, 8362229, 8375594, 27319, 2768, 8374069, 8377740, 8373911]] +w - cs2 + ct0: [[3532221, 59097, 5284177, 8161970, 832974, 7180295, 1228804, 1206249, 5818789, 7963546, 863132, 2715835, 6983789, 1155026, 6287390, 2245947, 5783668, 966135, 6999369, 3939401, 2948031, 3304954, 485050, 6810874, 6540474, 2509385, 806574, 5466937, 4332542, 1789385, 3430720, 7770313, 350899, 5288690, 1089085, 2865532, 8290940, 7037010, 4618451, 2199417, 5560470, 7510909, 7562381, 1353362, 4522222, 8105159, 1412178, 1971627, 6932457, 1591383, 7803548, 2951455, 292260, 1891577, 4587938, 5951367, 1661450, 891877, 5315628, 4612735, 6432316, 2874146, 7178732, 7579346, 21628, 6672971, 6689686, 6125627, 1981674, 6092066, 3682322, 312560, 4250120, 2809972, 598290, 904214, 4848800, 3261012, 8202872, 6506015, 1676740, 6844416, 4358361, 2265560, 5888187, 7000913, 6633764, 6503605, 4692222, 1518347, 7940846, 249028, 3747006, 4122266, 3421300, 1716768, 6593916, 7399830, 175908, 2230838, 264775, 4525178, 6339525, 4562312, 6506929, 4093819, 2088158, 1422229, 411017, 7217429, 3215993, 6013952, 7356720, 1190001, 1602393, 3804299, 5639380, 2951227, 1974457, 5113731, 6612598, 5835422, 3441374, 6012745, 6646418, 5223610, 5320469, 3921206, 2161234, 6199162, 8328894, 661679, 4118062, 7183632, 5831181, 2820330, 2003308, 1622237, 4191955, 5401783, 6326845, 4014329, 189785, 825031, 6506297, 4142223, 25716, 4348437, 1663787, 7592231, 5989794, 4418690, 6005462, 3522484, 8042780, 5138676, 6458913, 1979333, 5304579, 5243574, 5048017, 1140791, 6157311, 5958507, 5980618, 12428, 1086235, 5089154, 467340, 4160952, 3750027, 2199564, 379891, 4020635, 5038236, 4639790, 2058265, 6647091, 6248762, 5969975, 6511280, 6016302, 1492281, 596706, 1151244, 5191013, 1612873, 7677473, 7153615, 8096227, 7219562, 8119288, 4039231, 8280488, 4748512, 1430879, 2619678, 7221034, 2981594, 251400, 5334339, 7795061, 4659897, 2935441, 1447945, 5749858, 5552131, 4462286, 5359524, 3184859, 5595965, 7886584, 482546, 361660, 1215106, 7945549, 7571468, 3981166, 1807180, 2682092, 3049293, 6129820, 1425943, 6655315, 3709268, 3386918, 2529782, 3229617, 4681478, 1137871, 4837875, 2548058, 8152784, 2937952, 351730, 7420823, 5957768, 3288055, 7273272, 6059781, 1803068, 2513327, 954758, 3186031, 7073133, 1341029, 5347970, 4195214, 7639129, 5201722, 3265965, 3392797, 958485, 4626083, 4107406, 1979066], +[6966640, 3509306, 2454097, 1401751, 8030914, 4841754, 7808111, 2813243, 1383124, 7976851, 3692089, 1073939, 2074973, 4739689, 2996882, 1580299, 5099934, 6553172, 6684397, 6705619, 3873787, 4691246, 4144172, 8280645, 879835, 3658646, 8362557, 345503, 7952599, 7739329, 3616715, 4055273, 1752364, 5569328, 4420426, 3424590, 265723, 333161, 7448691, 4604218, 2273516, 3606333, 2807207, 3188272, 6455870, 4001001, 1689365, 5660231, 1798686, 7042907, 3117244, 5533447, 2174973, 5858513, 2881876, 5919755, 6397384, 4017809, 8296655, 3437762, 3985412, 4228209, 4495438, 2608447, 7121168, 2959481, 5628134, 5152913, 8249078, 6929326, 7488829, 2452118, 878327, 3741417, 2693847, 2938510, 7665139, 7073828, 3500541, 3650572, 323351, 5498099, 1216919, 6368386, 1038834, 6332172, 7037907, 1327603, 222043, 4565906, 30578, 5573047, 7883677, 2960421, 7494016, 5668866, 2302626, 3481517, 6260979, 657693, 1266600, 172787, 3024927, 20285, 4398671, 6917548, 6602832, 3285318, 4164806, 8026742, 5822703, 3342803, 2385953, 5528959, 4789789, 1648001, 7676984, 7301358, 2261575, 3638074, 875268, 5040715, 5251477, 3459297, 4989140, 1467653, 4348457, 5678295, 4404588, 4949541, 6177873, 2557195, 1681454, 6180346, 8171476, 7872347, 2244203, 3267105, 6479092, 5612497, 3788934, 500958, 1068722, 2862627, 5904867, 6816102, 7791326, 5878484, 975612, 3262165, 4991004, 7792169, 7481198, 5639440, 6247234, 1792148, 2331479, 5864034, 2128021, 4331427, 5171449, 3472875, 622666, 4613175, 1610167, 234358, 3494190, 5561430, 496992, 1284442, 8338526, 2516648, 7061815, 6423894, 4922824, 5976364, 5363686, 2329850, 2850915, 3620594, 2056541, 2785624, 5174592, 4545015, 3667479, 533369, 2347870, 874144, 6945041, 4879237, 1388992, 6765348, 5200706, 5778185, 4160076, 4990116, 3361790, 7590586, 2510517, 5635540, 6702288, 2726708, 4902254, 7633506, 2425088, 5175428, 2717372, 2904177, 3487871, 1219435, 3973369, 7393231, 6949235, 7291792, 5569168, 4300903, 3432327, 1884441, 8169181, 6682098, 8337229, 4997375, 8061187, 3412408, 2856466, 7710951, 6705488, 7125832, 5787752, 2014033, 4006661, 7004924, 6648082, 4728258, 1959318, 6252987, 3180122, 5764435, 425371, 5818987, 4809920, 4998655, 2853818, 1152877, 5813142, 7298739, 6455253, 5453852, 903416, 4579255, 1210586, 2194911, 2754743, 146768, 1113057, 35543], +[5094171, 411551, 3173986, 6433760, 5899851, 7979477, 2113967, 7694596, 2068699, 7866744, 7840844, 3611605, 2667437, 4533174, 3717966, 4490135, 901754, 157078, 2920022, 1688134, 1017644, 645547, 171279, 2972956, 188690, 2505022, 5874966, 1292215, 2276615, 5943418, 6666436, 1269307, 3607031, 1862280, 744702, 1956960, 4074317, 3635509, 8102858, 1125776, 4671953, 6453458, 8288845, 1428843, 3889499, 2237738, 7505382, 4039368, 2924268, 2160186, 1861596, 4781659, 3316537, 4126441, 3763704, 2907616, 5258868, 486288, 5900446, 2211285, 3345273, 2297952, 6640642, 5171919, 909955, 1391110, 622713, 3536984, 2177757, 5786709, 5897903, 5809619, 553024, 1967064, 4190406, 5819175, 3701222, 3527025, 5777640, 5686944, 6345133, 5431202, 4357417, 8138765, 275050, 5864478, 2155664, 4824900, 4722571, 3878684, 6231772, 2774833, 7282704, 8258517, 5309675, 7474320, 1534026, 310335, 2831683, 4854263, 6851222, 4259886, 2159200, 1128713, 6908282, 8194895, 8055099, 2552369, 7384198, 3706592, 6666598, 6063201, 3694782, 4131971, 4723086, 159353, 6334540, 2528935, 7561478, 6275658, 6779126, 7041185, 7960863, 8004529, 2391014, 1194717, 6460899, 545550, 2170381, 7219842, 4322417, 3475926, 8347177, 47621, 6533321, 3807588, 1568043, 6217782, 4689940, 4736485, 6528552, 6014036, 3120606, 8089576, 4011488, 5043824, 4921118, 6641848, 1640682, 4204016, 1220325, 7872471, 7595588, 7534048, 7096202, 1625720, 3325830, 2421405, 5363121, 3422374, 6629164, 5114250, 5889202, 5166753, 3224599, 6760837, 4111725, 7778945, 3315533, 2859554, 4988403, 1519822, 2279173, 4276672, 2977212, 7188599, 2312297, 6761938, 7423965, 4734001, 4455690, 2603045, 4866385, 8374832, 4607764, 8237769, 696230, 1001306, 6359792, 154848, 7847328, 48363, 7347758, 6898723, 5145232, 2652740, 6819772, 4407567, 1382993, 4233843, 3604285, 2707641, 7090338, 3030432, 5133425, 367936, 5690772, 842252, 6056479, 6626250, 722589, 6221784, 7269644, 3578238, 5562964, 7324616, 4905459, 231168, 4174789, 8288833, 5598465, 2132446, 6940716, 8017454, 7736215, 888423, 7605993, 5203687, 7794764, 4066732, 283727, 6171137, 6027540, 2248696, 3913494, 5946364, 694919, 2086373, 443523, 2465500, 1669547, 6321873, 8043131, 7810655, 4875595, 1494813, 5937590, 4754896, 5285424, 5850224, 5565787, 671254, 5058270, 6816184, 7390849, 5828638], +[682853, 5770096, 2623706, 1070586, 3047604, 4008097, 6135319, 2826136, 1984213, 692946, 6276829, 5622929, 757224, 1015084, 2360631, 5987772, 1518741, 2509593, 3070114, 6418738, 7339802, 1915346, 7109584, 1054971, 3562344, 5641447, 4106967, 6776646, 5304298, 2318478, 194762, 8276465, 5846295, 6346832, 1142583, 6933537, 3085964, 2918937, 7836827, 4007198, 31537, 3618796, 7419948, 3868681, 996547, 7223495, 4638004, 1368297, 2294968, 2735391, 4859433, 5207344, 1254897, 6627466, 5159779, 6163739, 5710424, 7861313, 3256692, 5492317, 6292045, 1837846, 7614019, 6174216, 7223386, 3013704, 2581687, 318709, 5356244, 359910, 6610226, 7690112, 4166048, 6383877, 720763, 6189805, 2060349, 3687999, 4007777, 1814531, 3968829, 6910654, 5597565, 7420879, 3641492, 4356578, 2343489, 2248688, 7362068, 958366, 3895387, 6845375, 3346020, 3218691, 8096149, 7211393, 6595339, 6072511, 1619110, 2602329, 238125, 7343392, 1837290, 4384337, 8184227, 239258, 3093603, 1078113, 1129296, 861711, 371636, 3120230, 3953403, 6310584, 7728105, 1600307, 3817285, 4895591, 7946322, 6051826, 1829380, 38346, 3953971, 684407, 5292908, 794067, 4494462, 5110077, 5671873, 3338285, 1029430, 5457759, 5498474, 1903645, 8101848, 2152209, 1331004, 7148889, 4416298, 6409189, 4458159, 2545198, 1532958, 5430378, 8253552, 5956615, 2818406, 6409497, 2800696, 319547, 4280593, 414704, 6781857, 7009609, 7799007, 5327599, 4998832, 3344865, 5198621, 1978214, 7678643, 6196685, 2963688, 7279594, 961597, 2102024, 3912055, 1666209, 43766, 3916437, 342576, 4124772, 6595379, 5681601, 5981782, 7460022, 6089954, 2649852, 639361, 2902687, 3097691, 7724025, 7618700, 2562011, 1707096, 4008379, 1914562, 6711990, 3996882, 1474578, 384172, 964938, 7150718, 7952204, 8144093, 4550907, 809174, 5699765, 4332288, 426514, 375358, 4754765, 7545918, 5295525, 6299626, 3467567, 1343391, 5093136, 1399994, 5943950, 6809701, 3269119, 5380768, 2642985, 1095548, 6717642, 5824960, 2308243, 1004196, 2145677, 7795892, 3846412, 1091662, 2069944, 2844430, 2106521, 4743466, 4708807, 146413, 7958313, 1110037, 2435676, 5259104, 3402100, 7859759, 6633715, 3589227, 2412341, 7188869, 5470699, 4779139, 1892473, 237575, 4456487, 1588083, 3046209, 88372, 8152176, 6528187, 2237342, 1943974, 8058936, 1940201, 2202259, 412019, 4581143], +[3617072, 3448382, 1697320, 4437291, 1783642, 2101629, 5536804, 8049153, 1862187, 3899663, 3510159, 5945860, 4463297, 4909, 4009196, 4934159, 6524923, 5252491, 1100911, 538126, 4382141, 7502028, 5314740, 5612069, 340785, 5715114, 1257976, 3350772, 1319763, 3000514, 6270011, 6244668, 6619426, 5492056, 7187539, 3638512, 794172, 5943108, 2194197, 440948, 6060315, 2688498, 7193313, 6232049, 7381358, 7414281, 7669834, 98278, 4767872, 5964710, 6058487, 6617738, 8149960, 6036974, 1754155, 4184497, 3627887, 3013367, 4396019, 4487653, 7123967, 6869668, 1769343, 2170355, 6723794, 1477421, 6420627, 1664078, 2291462, 2860259, 4153425, 4021703, 2323044, 1137247, 1916957, 913678, 3555748, 8300537, 5505911, 6787159, 5705589, 1304835, 1943108, 7929328, 5585193, 1678074, 6141329, 6706087, 6152368, 5890542, 560472, 3853361, 4964350, 6200608, 8349726, 1310594, 4779218, 2554618, 1075345, 6181376, 6161008, 4146527, 2755146, 6902567, 8176589, 6212936, 454343, 318852, 6702553, 5625227, 4637222, 7002622, 1478517, 2151539, 3556755, 4103216, 7959058, 3201371, 6681249, 3459510, 1060733, 3230926, 1452600, 310709, 2957268, 5571305, 6018724, 5832459, 8104898, 1286461, 1749762, 2078366, 8376383, 4754923, 3790249, 868568, 5851462, 1292947, 5827374, 8285791, 4011130, 6237665, 4029233, 4157072, 2498230, 4471169, 3266513, 2392039, 2816078, 851443, 139594, 3304867, 3664191, 3542691, 3887514, 217864, 4506927, 6147328, 65823, 5668379, 1515850, 3502755, 6647781, 4112783, 3383202, 5469642, 1049368, 7770074, 161592, 6549832, 417057, 6662400, 6295444, 6361011, 2432018, 1789881, 111557, 5364133, 1902031, 6043784, 8109720, 7901369, 1538161, 1435988, 1438539, 2910755, 2817528, 5426602, 4213796, 6202579, 3827857, 8040227, 3496314, 3574072, 8179514, 3161437, 5037017, 703932, 5597888, 4681994, 6286348, 3862146, 5624032, 6388160, 8042966, 1207292, 5895878, 557510, 5115296, 6655203, 1227476, 3855007, 1252615, 6951417, 6493397, 1516483, 1189116, 4700823, 2223843, 8055026, 8266650, 7640511, 2736700, 7295294, 733311, 5376031, 6458421, 7840457, 1495863, 703742, 3446323, 5268175, 6583932, 4936222, 8212174, 3322209, 348457, 6733378, 2476440, 2013510, 3941703, 4577738, 6715206, 8267739, 6792123, 6435925, 7763423, 7675808, 4753596, 7174819, 3731474, 3324700, 1603400, 5996660, 7378534, 6551931], +[3093424, 277406, 2336888, 3132069, 224777, 1697640, 2854480, 5782414, 3109861, 3597868, 3960646, 7690100, 3013697, 2222589, 4272656, 793940, 1090994, 5154929, 6984673, 2405235, 6261468, 1067145, 4303677, 4729491, 7188425, 3877225, 4100214, 1175209, 6475163, 4136795, 5963138, 8137642, 3252142, 986584, 4899479, 4193932, 126898, 5376422, 1352717, 2083985, 972266, 126756, 4028402, 690172, 7098533, 2628300, 6652841, 2917882, 326686, 7471096, 1362423, 195115, 5195070, 136637, 65381, 3602917, 1134078, 2801833, 3857939, 1338639, 1552286, 1601062, 1481115, 1599669, 4335086, 8250150, 2067024, 3764244, 4410584, 1715632, 660026, 6876135, 4270948, 7661991, 864370, 902391, 6382263, 280022, 1131505, 2347104, 572636, 2626032, 2098882, 3282262, 8375028, 5960863, 2245993, 361154, 448942, 5493470, 611766, 640191, 1475252, 664086, 5797784, 6510023, 6721098, 7497314, 824313, 528583, 8031808, 7180339, 8110081, 3313958, 1169837, 3589572, 49343, 1665857, 1737647, 6294379, 7647341, 1738780, 7739940, 7281648, 8134304, 4636215, 6519515, 6917786, 2680725, 6165751, 1663550, 1412127, 1221409, 1046738, 7366239, 6210054, 4737113, 5374098, 6713655, 516820, 5094752, 7805467, 5248325, 592294, 7712200, 1063242, 4943077, 724125, 4680710, 8331349, 5074733, 5156638, 8298566, 8227763, 6969938, 3958129, 3146198, 6022600, 2161406, 359581, 1330894, 3105160, 5792908, 3843754, 2011697, 1121164, 523494, 3882956, 5694000, 4338815, 5909593, 2362893, 294350, 5906312, 6943667, 3094444, 4964410, 5683568, 5787188, 7945352, 2507377, 1621846, 1789794, 7198613, 835772, 2147343, 1167064, 1875436, 1479920, 3446679, 306277, 6188930, 5990722, 5163108, 2906107, 4771417, 8334131, 2644547, 4180947, 1499692, 5731064, 621824, 3398804, 1894893, 7423869, 3518892, 8020825, 5205888, 2160429, 4134848, 2324690, 1600156, 6967994, 808618, 3578878, 3062879, 3896357, 2613153, 7765091, 3714219, 1675525, 4161623, 6536932, 7645847, 4524694, 6359394, 1586079, 7790951, 5147028, 3537780, 1025952, 7467635, 3855018, 2044555, 3017509, 7590341, 1082057, 4715069, 5340883, 1690884, 8189268, 1792625, 5590637, 5914030, 3791874, 7191899, 5670439, 6938254, 788303, 5732687, 7755354, 4176290, 7303752, 3626, 8324963, 1655243, 5138774, 1008629, 6888800, 268052, 4660900, 5218979, 1170978, 3718900, 6892111, 5975888]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]] +||h||: 35, Hint check passed +||ct0||: 67653, ||ct0|| check passed + +signature: 765AB68AC204B255699618463D65D693A1845D574181D1403972888A76B3A553F79FEFD05FF22F37A99C525FCE21F283E437FDC36F8EF4E9C3628BDAA7CEB6EB228C231180B68DE63421238141664AE3005860A4221AFAB18DA83F3A586491B192C852017781FE449A54E5AB166D972A182D3B4BD3D0AA5D0BE63CFFA78D3B1EC7014D1D65BB94153CC4AAF1CDAD92DD3F9460E91238E551A67DA3980CBC951F58250D32984BDF98837486AA9E1D7F0072BB731CA62C2316DBF852C8ACC3696CAC3037871959B7C4633E17479D53611F8AB80257A8D27A3C32EC62D6E68CDE16CF4ED867D33CEB4A963C91951333862788D42162BE8173166A1042E67FC81F37E4B33D68E3906FB51F09EF15B083F2F26BBEB14BDE765A9CC830445C1B8D4C3BBC438FCB76ACC8B43D43A94E85EC2D64CE0276A3BE11D5696AC29FE8624C30619A7F9E716F06D004FCB9BE4513AC1719A688FEBBED40B7781340E6AFCEAF523A337B90DC964F1580C78E26093CD952E1F94DAEFC15F0E5B289C0704964D9DE70BD8DFDC6F857D925C5249806A16D4233040B049D31E7201B52756F863836E6142A8CC6A2ABD11CF405F063683535BFB9B8A495404B98E6EF53E37065440FE868FB78E88E5E8998615F788E1CB6A3AA3707084F17C314C40376644E2DF461203103DE0E652038F90923F42C31C4A0169EF5D3A02FC575CE3F731D7B1A9DB444386708CA4A1AC239081A3F66E269A9070B7A3AEB7B76A0FD76C26B1FD91823F84D7C9F8905E4725B528896221CE7DB23530C62343F5EA3DB1F90EB1452D54EE1AB1E109EF962F0419CA0111F95C1A8034F969FBDC107F5EFAD0C2BD5BC174B29D65975FAD98A6127284227356A42866CAF9AFA816341C8E7C4C8E4862B7140B65FDA457E9B1EC13F78EEB051D371213134186969327D0E45163638E939E6A49C10B0E0ACC5BAC904E24F22A1F2B1298F4F59BCD085EB08302C55DECD53FA84E128647D3BA84D06ED092A0A416085BCB22F21A516BAC01F49C54488BF91E249C00A655EABF6525F0AB99BBF15DB355782ABB7626AD60B13EDB2E413715C129EDF21543059A3A5646F9A55E92570A683E6EF5C7E097C4DFA5B4A725C82C0F60E94149A5D1E6E1405DF204BE749A9A403D0A2EE26B7113B2439904190BEAACE77F25E3F62C122F7925FD8913A3331AD4313B6C34790E5940990761519EA6B17394F51FA7CE89CB77AD9A15A184261B4E5F2F95871E9CA59EB996B93518312EA1FA3B6DE7990363FE65259A7DE67256E3E8DC857E350826E95C1953689FB6A5BAD826A1E9C6ADED1AEEE12491A978DE2EC35FD1DC76B48322B8772A7B7E55E8BFC5A8BD0409411F0FF3BE693549F04B3463CD04669DF95CDE04D7EB6BD13DABB39AA3916A503FD1570D5C5D4DFE294A9E82BE575B27F9AB1EB21BAE06407E2698CC4DD533CBB78C92E227E9E81361049B92EC1999DC30BC9EC30E9BBB57255BEE750F884449EFDFD2891D69706C3CE2A19D4B64D26FCCDA924544D69BB87D50D17F640D5FC5FDEAFC6E4D61F2911AC6317D18AD12CCA6D6A6139EE3420E9E082527FEF6D111A885841227207BB79331AC0A20AE1317D09C7537DFFD182DBD4B25EE483166F6CE03AC5E19560F282169661F9F861DD5933597EAA06DD34B24924021D1D35CA30640147FA2AAF1BA782650DDECE73A7287FCB16E6444ED53131B9D9169BF6A9E09776D22C05EFC740A76F7F2FBBDE0BD4AC63F50B3FA5C718285567E8ECAD96DAF89F48FE1F6C4B2D34E01914669C1346F0AE30F549EDE7375C731203EE4AA29047BC31D98F7C2E472DA8224DFD0D05EDFAD589D9AB17811559C8C338641933C778FE572202BC4114EDAE552FD9A9A44EAF8BC66BC643A6CCA708CB9FFB8EFCD6CB5C87F16F821D88959B40AAEED4ED6A6D1F0EB7F50D90E1D40DC323C38E6667195FACD3590745D7A2899E558132201032C5782B343EC162C71066D8B752E5DFA9114B55AAF70A8C29179C8852A60308C7326EF0B4FDE20CABFFBC7D22AFC9400994669312EB78F0FD45843A6BA5A0DABD7B3AB585B7338A848C85E80B536EE9599BF7BADE5867A28B12B4EFE464639897E6B6FC79F42F785BB4A7DCFC0CA546D88CD8F98B930F072062994FBDE90510E6D61A7CE1BA63A66C4645CF995F2C7777E41D2876010FD7CF887E9DB602D96E864B5B9F64102E00F19868779A780D516B6945F5828E9807D415C768822A3B9A363CFF263E04BA72FF41D508B75924D17CCA35955ED102ECCF934FD2208656756B8DDA6FFD5A2B1889072E13141B9DBCF8B8A69E8DAC83403E7D4245A3118EC51BEE519669B84921E9EB9B85450A4504AA4763B5C1FF0783559BF7D04A3832D5C1E690C4A27B6F0E6DCBB4DA80249CA9825FAA25563267FA0237244B2DD0AE1A8F1010ABDF3D052707DF8DB9BD3B206B61D2B262B7BB0C0F4372155F6E27F1E036849DA92A792249E29D876E0C9763A244CF583950D6CDEC348DA48360F9B7CEEEC046BDFC7EE401D708590713E6F145C90610EBD1BEC8FB9518C39A2FA9EFEDBC61DEB4D0B61101E373930F2D5776BEE5E1AE6DFB2D8EAF3DD071753BB700E0C8CD997984905417AA2BF805C1B944FA67BC0CB961D848AD3B0725C269CAE77B61F01DB3BB160F8FA28B046136BEACAC81174BAA18B7E4DE4E210832232ADA0BCE8005B450C249E05B796E312B691FF1365E9A397605DFFA63A2F612CB46E9F2A1B5C9E0BCF1235D1C551FE568B1F2634F901592BD547B8C6068324EF660EBFFB6CEBB74AD033A614259146E30E02B456FFA038C2A0A28FFE5F882BFFCA4E7E36B07A6CB9BED8FDF775D4BCDE854DEBAA18B219F158ED2491028D2A418A190A8DB4F07900467F9B612B4EF9642AA1F7C09E08EE8B124401BAFB5BACAC225047483E5362A99F39CBB22D2DB63E3883812B8425360F79B1C3518C1D10C3E1D64DC1FC2C51FC20E346ECA8294E37C9116871485DB47395F8BC0D708EB2A52EE68BB2ACE0CB070AB9938C33FB341B81480418F8D39CF0E6F923EB65206F80D3AE5391392782F148EDB6EE3939431DF8FEE91DE625FD0AD8953D3A50D338179B4D1F7F42ABA9F5189C7DDE472B1F89BFA60586B750B2217580FA518549E502A30181AABA3217C1A5DC96D2A862DD8C9D91F5A556367C2D4449D07606069211EE65ABE35CD87025F89BF53F064FDDE4CB5B4C1FB6BAF6DF3149784B54382F100188E62EF5B56600412541F21019435657E53266F865D8623E2182945BF30D133B2F695D1B75DE11A3328FFEEFF041F4B5C3E9642040E13A825F117676AD5D40B827AAE31564F9143E8586F394BFFC0507329DC6AE496A6E0E0C1664E1CDF307C394D19515FC1D6B805F5ED3FE9FF20DAD5703C4304DEA97EFDED617C20DFB82BE300229227EFC33645A469E2EBF8B80B4D157BE5CBF9AB9BFD27350687BA5FF5BD6BCA72848E6E30C95EA3552A7FBD4662358B38C5EECFD5488A1FB3E98AFEA479B9DDAC0E91C16FCE75FE37CAAF089E6F84B8CE6331E6B57828A67A12B4D2616655E594C461834B228D38D323C509C2701D0327EBD8E9760A3CC8FD9892F10C84BFDF00A1F92DB6976F236BA7F430CEB0C13C28BF5D1B7C92E16637B699760A04C8871521719378292EDFF085900F364D1D2FD14BBA8FD437564B863009900F4C80CB8697DB7DD85941E8F9F459FA6C2DA26F2F783DA51986B344C5B8E8A8B993F40C7EA295046535B9AC02FC56769DC141E0ED3A6FC5C9ACE38611047042ACD43AE40CC19CF1103490B0107B3497471B2FBA1F078B7793C6EDC920DA777355251C7CC35A0124AB3C86371D7AB11C8BF083BFB879EE9CF02FE5570DD0503983E24C82EB211E47BBB0465B4BD47E2ECA814B68960CCDAECC5172C87F0488A0276499591FEE17639873F21146198D164C5C20DE69D110E87664406745F679E67626FDCF2202761A2C5C96EBE8303F05A9746973170A7CC1105F9AE50A53307901AC66CE27A65CF9A6AC0D2F40AA0D158AFEAD737E1611847995DEE84BC748A5ED57EA2AC58B2FD3D2D928666EA09D070A1E87953FAFB3AB8D3D468A153EF87CBCA1CE7A6C278AC890098D2BE52B3AF9F02187EB63883D5264171D485FFB1ECB272F18385C6B8E81788F37B634E0EC96728ABDCFC8769A5F2DEB8BB1FCA844DAFAF6D63AE11E8E9A1A1BD70E14D0583BB12B7E0C13C7A988054EEDC5DDDB57BC255F6EA90D6619B542FEDC5653078232070410AD7514FB50E9E74D51C6F8162AD25AD6159770762F36F74587E1AB3E9F50F7C04CE75CBC78BACB26FCE243E13CE74C28671157599651016BB041459DF4EA0B6F6F35E30EC1EA6FEA94BB53D347E26CE7BE6E4C569E60F9A428EB55C02F651A0B84E2D652A242A5512ACB2943F029BEE7793AC385BF7EA077F200654EDA0A23182A1FABB5001087AC7B45DFA79FAB72BAD1349093EC40870BC88DA3CD660E6E61711BFBCBCD507A2947DDC4114FE27E93A346182543F7C5706C5C8E58804F421AA775BC824D9B27C758A69042697F046A17C8B997A8FDA096A2A373195DA3E5FF02FA1AFE5166F8C243FF65497F673D6F9597BFD911234D7C81C3C5F1798FB4CAEA4F7D84E9F310343B51A9B44D93A2C0F90000000000000000000000000000000000000000060E13181E23 diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt new file mode 100644 index 000000000..074ebb7a2 --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt @@ -0,0 +1,211 @@ +Signature Generation -- ML-DSA-87 +message: 802CFBC8E848587F98DBEC233DBB54909D07F8618BCF2FE7E858FF059742251554A5CD255AA87FF73D8327DD46633397926362B78C66B289E30E7EC19DB39261FC7F6AE86D8CAEAD185A27363A580F75B3D2E9ECA8332FAC06D08F7A7FFE386AF28FF78FB32352071DCB8AABEB29C56FE0DEA9D939BD8E10EEE39C37BBE4580C8C5369591ACA24C1F8AE9DDAAC5696CF05E1D89D71698816923A912498B8869CBDCA80B1F1B1B32FA4BEA289471C2573EAC36CBA4390F7FBA389266EBFEF3934F1BF6BA92536C65DE59D1CAEBEEC5BE972CFB0C7E4FF45B51B805D64B72A7FB9E693C76C2A7279AA0A27FDDF344F6636187418F0C7B857BB0953B67F919C79AE9088A47E2CD97CF2ACD2D665236CAFA82DC16966D98ABF04CB20CCCA0859A90C007957EBA715AA56C682F1EE2026687A024F1A713E688093571F830D60346776733F14B344B5544487C1C74140EEC00301CAED1A4478B235A03FA1919EEE7A6B65502ECAE4037C12B93B8C1CC6C5E4A5FC1BC0592D3116E16E4AA4FD19A2E1AD1901F5D891A279F158B0F3A61D1FBF9F8DBA0F1BB032BA0105B0E21BDF8F0A2A413B4EDAF7DBA61351E1E97A1396EFCE7B0A6B453DD189881ABA27A5A7746A77946E5A075092C9B283BB8800F506C73326B8FD8C58CD143B483225FA630969408FF62EA5DE9E2F1D2CE20E8003F43A99A197EC9AD2E2AD99F443B20D03888D1ABC89ABA4B11CE70B4FD83FD76D16E217E3CA687897270FFEE03CDA625809F31336D6EA0578AACB860CB674052E5B28922AC92B8C89B1CB17572A74D6265A14483280F3446520EAD954BD327DF6D275E59AD9CA389C6390260B0D9E1EDA0DF517122CB77A818F802ABD3B61A37B6B4E03CD732B1DD9274A5FF55C918BF8F582B95C4ECA7C2B441CB1FF501A5831A90F7B8C1E2C2440B4BF286CF806CAC55E1A464763FD0743B32305991770796C5C0D1CDE024CB1708C5FCC49442B5CE1D599E615781B47DBF1695259E03CC2DC0A424627F369748A3F3246D9A1824EDEFCC2919838C1C5845A0921956768B9DFEC8BB320F8BEB2E72B03969F1362DF33F53E920E12B62AAE258679526EC39BCC2608068FD6A4A7F9E406D439EEF46969BBDBEF6AD5AD85CD648F0BE4FFE62990C8589523D64816682BF3C7E0983321D2272C9D76A218C468149092FBAE8757E5D1E152A7CF9396B7714E013A8234B22026299945245D89803F13A94DCE5DFB832FC9CC646E42473177E7B61B585A7D11A195CCEC39ACDFA40016ED9C3E161A61BFFB3739E05A371068B8CADE321A2AC1ACDE72C816F1B6373C68AA457686BE571745BD30EAA42264AD560F69176D58769CF5420A25DF869D4A1F1B3EE800DBB86B5D2AAEFC9A24001105758D02F8885C94502259B9F3072A65394B73F40F1C483AF92E1A69143B1C305B5A555DD5668504645B470487BA105CD91B3687990D2A413A78BD905DB5EF7A09C679A6C8AAE2D7A4A8B2FC9EF49903C748ABC3F1B72A45A88401AF8349EC12C4D8407B3A76F935F2FB09C49CCAF2D7A66808B103D0D5AA05AB431E805113A944451C3FCCD785AF6539F859A27B1B41D49C5E057835CCD21BDDA0C1A4A748C39F8E37ADF41DB811CB2A027FC39DB2ED4E3A98C1A0D9252FBC103426EBCFFBE25752D5674C28AB7FE18E9586F1FA782422784AD31CAFF5EFED0B0D694BA7F98E492B9F9364E603994AF55AED1486931FA4631E38EA7C20798182FBBDBF08287D8EE51B2D4724DF6D625580340A1E40FBF35F344C48924178F615C48BD529EE0302043559952A01F6AEED6DEDE1479C06B638E73F0A3A5538598BC958E46E68D4BADC6A0EF2743B1DCB874082D03346D2EA9FA445D006621B23998BE5213D5E2DB4E3A51039EC1EDC16F5C7098AE20FEC3495C3B35FB9FB4F06B267F01FD79085036D5477D0CBD6C7CA513C4B68195F7D63A81F71083CFA2DE23270D588F8641D443C9A23642833EDDDD4600D5EB138CAC283CDE3964C2C49932ED6019EA56976DEA8E39AFFCA7CBB9524C54A1D010F0BD58F69AE6D77DEFA0B96A7BF532CA9236B514CF12DC859F14B4ECCE46222763743CFD8966B0A77C0585D79CA6178985DAB8B61355DDCF9971F204E1C01460DDBA43BBBA92B1F20E9992DA2734F632DB4CE9FCF279B1ADB3F47381EA6454ED9E04F6EB28D28F7F12B99D0517129FE641356A7F7B3AB15125038C792F94C495A7FE6E52BEE569CF7DDFFEB4A4CDDBFB56B19A195A307FA91238C7F9C781E1FAEE386E60BE80807D98618782DFACD3F5E42B9E6F8C564BBA44DFCF63DF93B4FBAC416C2DE588DCFC079AFD0F0BF37801304A37B280D084A04E2CBD8618B2E61F91304AB8E7AC10263AE11D6532D6D1A82F26C2C7205AAC631E9EC522C1B15EBE6438D854A3E23AF3CDC5BA37F31597F43CA2EE94C25E75C59EBDF2128FA21D279DD891FB7D9103126872F110DAEEDB92DE68DA7859681062C9098186A9F18324E9C35AF960C539224F63C1C6CB412B63ADFF779CB487D02E7CCEAC3B7A90148D7CDECC185F5E6D587E351ABB460DD2E3E4F4BC0A77AC488BBC0C634394F32E926FBAF33B6086DD64302388B492E55F6C08388963C81B5F045202A5BC783F5EDAF7D7EB6351633D4838AD6F797B6CF8C66E12F804AC4179D31BD5D24ADF2DDD1A1DB43C22CF98020853FB34E314527E1249A22B8CC5FC471D2DC13DED0CD1D9740EFD671065723A05C46B33AA8B5DE6BC4DBD4F31432780DD6323C209F977B1412100B95CFAE7EA901160A1EB67A9BA88970517CC1D95D1003322C44DC73873677B63D7F41E2AB9B43F64DC87D70C110510D80198FA4B067A696D99D3A2EAA0B0B37482508C4387CB5ACDAF36C06799A4C184474BD2B100ED665DB48C1789DC5129795DF1A161978889D7B2B0B0858600D94CA1565487BC8317A2FFF9AB4FD649E9ECB24EB4FB7829E04A3E0F2087C518C30596E390D62530ED44CE64A754F57016C1BB3C91FEBD66D4770C8C7406B4A33D58DEB3EA43E70D3D217AE3FB841CC981289575ADCE06027DA7A86CB73E42628D1C33583BD907B1723D025 +deterministic: true +sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 +rho: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4 +k: 292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5 +tr: DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E049 +mu: A73192754E30CBC88BC183A2C9378DF6470EFFD7AC7412A38D925E6B3FFA621BDBCFD9047F92DA946434F7ACF1CE1BDB5E494F1DAE1E0185B1BFFB68DD0B5D83 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +aHat: [[[4942817, 8033578, 6193969, 328164, 3123076, 5608360, 1966694, 6159093, 6759326, 6515321, 4110789, 2846010, 10361, 7650249, 7781336, 6041326, 3536117, 2317544, 2721408, 3046749, 6270459, 1299626, 1215811, 3133880, 2370213, 920527, 1371791, 6811904, 2145793, 6207375, 8116305, 6492100, 252579, 5753948, 2401968, 7443724, 6047272, 2583106, 4272483, 5642404, 7540939, 2340897, 8148728, 6414703, 3554582, 4848846, 6304416, 4682923, 4866938, 1589246, 5949669, 1816143, 4144854, 739672, 1612639, 3960420, 4823091, 5152652, 162563, 7250025, 7861187, 1075468, 2760719, 5325368, 2853995, 2491970, 184325, 8285647, 1101892, 8236541, 2352450, 4836362, 4400092, 1730566, 5875078, 1163328, 3799181, 1078400, 6473097, 176770, 4389290, 3930702, 2247381, 5252155, 5094297, 5798128, 1548908, 786346, 2167616, 3408943, 6482932, 8268308, 6846461, 311108, 3509443, 292335, 2139945, 5315971, 4034246, 3368750, 3185661, 850239, 4727176, 2835091, 1966568, 628972, 3540979, 5585861, 4851680, 6954667, 5585688, 7575029, 1022666, 1224100, 2117265, 8081556, 5564272, 6094337, 3512192, 4447560, 2593735, 7029115, 1615057, 6182604, 6007387, 440008, 6161124, 285274, 3999454, 1761041, 2682656, 403435, 2315983, 5882539, 1551338, 4646148, 4502297, 4745509, 3584078, 3034937, 318029, 2307385, 5511360, 5629585, 4943712, 1674374, 6932098, 404086, 3453431, 4041486, 4634031, 2114236, 2992967, 5097826, 427152, 1671710, 8117492, 8244909, 4947244, 7239291, 3863419, 784527, 7897835, 6455885, 132223, 5997318, 2639167, 475440, 4874364, 8341775, 5628523, 1704181, 1098470, 7942278, 3058693, 3581325, 7088671, 5471389, 5666382, 5936984, 738801, 4232882, 424231, 5718096, 2810555, 6995518, 7506366, 6192412, 1757809, 1852167, 8088408, 7915331, 3188672, 3633386, 2245020, 2109698, 8282768, 4928891, 4784934, 8234992, 313604, 3282379, 1182558, 1215938, 2941269, 6527348, 3668135, 7140353, 6666194, 2123640, 3890789, 4426242, 4754497, 7088400, 6357265, 1544629, 186145, 4633732, 5978430, 1508484, 6936717, 3072796, 3033893, 8284754, 7504959, 6804803, 7393696, 2806493, 5282554, 7253014, 7185358, 2664060, 5981318, 5057868, 2331017, 7531460, 2845195, 6326162, 4354426, 5894280, 1602267, 6299024, 6615246, 1498629, 5102463, 7208301, 2184276, 4872292, 6275357, 1334360, 2731352, 1632393, 2666965, 4482704, 3506670, 5714329], +[1550168, 7424210, 292109, 7423684, 1750345, 6974931, 5688264, 8172582, 770260, 1381627, 1430742, 693826, 1001472, 6715016, 1188195, 1888150, 3818556, 4676105, 6034536, 676245, 8304778, 2161621, 1600065, 4407112, 2158044, 835278, 6792695, 6929321, 6760175, 1439959, 1023596, 1154979, 1529259, 5763706, 8334783, 5823503, 4999957, 7234018, 6957958, 1228673, 2899197, 6071344, 501162, 6338780, 348247, 6966377, 8354104, 5109858, 8248876, 7506290, 2141176, 5088302, 2589322, 3257874, 35325, 3628863, 7891066, 3961938, 7778545, 4186932, 4544233, 7669253, 7142240, 4164782, 2509776, 5557977, 1239692, 629677, 6586379, 3360713, 1958463, 3764734, 1682603, 2598256, 1418342, 2138070, 3711210, 4332406, 5252160, 1253277, 6428406, 3393451, 4341410, 6485247, 2227999, 2690968, 875285, 1447394, 7206506, 1558323, 965728, 652347, 3011978, 2437239, 1823421, 144, 729592, 3499376, 2958953, 6006172, 771666, 6233402, 791991, 3989110, 7045738, 6702703, 4506662, 4675489, 5488081, 5637200, 3266530, 2294293, 5597871, 5543096, 7933404, 5422472, 6442413, 3556798, 6221072, 1330862, 3079373, 1215107, 4472703, 700557, 6503776, 3711232, 8016347, 2297024, 5321936, 7719190, 2619287, 6428343, 7931800, 339829, 1210465, 1083452, 7581552, 4333105, 7219062, 8349424, 2110987, 5827470, 1903192, 6042708, 1260469, 404345, 1308913, 3877033, 2156613, 3818187, 682298, 5693335, 8221670, 7241503, 4244003, 7377251, 7599163, 3143159, 6714452, 5889779, 4242052, 3780681, 1681893, 4207853, 3939263, 1254054, 4637554, 5677431, 7446000, 2908649, 5745245, 1125336, 2914898, 2246931, 6519697, 747492, 3807501, 4510429, 7516883, 7420863, 46634, 7519094, 5632365, 7495346, 4046425, 4648072, 7600501, 7802465, 3036604, 7028666, 5613020, 369226, 3095310, 4874432, 1079495, 6601707, 2555469, 4647714, 4287202, 6893076, 1130447, 7845836, 2725068, 1644341, 1445534, 2873352, 6836269, 1098473, 7034864, 186560, 5900811, 3032385, 1546486, 3120856, 5387893, 5268223, 3833296, 502334, 2324504, 1602597, 2153345, 2891768, 4175188, 5234338, 5254478, 5533199, 5364139, 3814120, 1196947, 706277, 7598811, 6387988, 5315995, 1287836, 1107367, 7834361, 2430011, 5174785, 6101375, 229022, 6316026, 4036416, 426020, 4898874, 7591, 507098, 5712767, 7951861, 3393251, 3246455, 4503296, 3783317, 7261701, 2807309, 6255617, 7918489], +[124268, 3454508, 4540277, 2184358, 7715163, 1896113, 7392215, 2245934, 1933423, 544210, 2362289, 1133934, 5522240, 7079493, 6220452, 6725585, 4287242, 7872520, 6621741, 3618444, 3504714, 4508259, 80298, 6477825, 450462, 2979288, 2311097, 8017037, 1898478, 1693384, 4568288, 825712, 659735, 2197465, 6608878, 5097441, 329414, 1492926, 7771628, 2764980, 8267025, 1045780, 6086304, 5728373, 1185312, 4403074, 1113298, 2528623, 636481, 6048978, 5522881, 5237844, 7252175, 6302111, 1737301, 7430134, 6042491, 6280648, 592171, 6568069, 7386665, 260177, 8162793, 5396531, 2080605, 2879094, 6550355, 4316630, 4693187, 7227018, 1878178, 4062968, 660982, 4107999, 7342087, 143367, 5924700, 5292073, 5963544, 6392840, 1479198, 1674589, 6104642, 4482736, 8249291, 6361729, 1378596, 4908681, 4536361, 4362312, 7063547, 6487585, 6293197, 5083317, 1023209, 7483314, 7347362, 8016708, 6258737, 841418, 5986694, 8187776, 7314254, 4069187, 4777966, 1282229, 6849823, 3651546, 5167237, 448982, 1617535, 6148062, 2563831, 341348, 462953, 2726092, 470426, 4389745, 1897006, 4198701, 922933, 4832433, 3998732, 1019961, 4704547, 3686639, 1630795, 7480248, 4423139, 6066099, 1658452, 6587344, 2406221, 2616268, 3370493, 945748, 7548847, 3540138, 5497123, 1777802, 2285179, 6059608, 1116857, 276355, 847199, 470378, 380991, 2090624, 5511114, 5338633, 3294702, 2758899, 6750230, 7849133, 2519388, 5952859, 2024128, 2765296, 4432592, 4002463, 5501721, 8048477, 3042065, 1048052, 3038342, 317406, 5628826, 5089941, 2414816, 97410, 2666506, 5195965, 4308509, 5255146, 3067360, 3058663, 3154174, 4210082, 1201494, 335802, 4732686, 5599873, 1517675, 5649550, 82666, 8196174, 3041934, 1141908, 2422690, 6366263, 2276637, 4975039, 4811690, 4288619, 546780, 4828023, 849944, 2754180, 5503830, 1260152, 6280854, 4347769, 1714217, 7055213, 1845288, 6519162, 162994, 3813822, 2123297, 4083321, 94343, 2805404, 8015229, 1940844, 970280, 5414903, 3027911, 5144950, 5266658, 8296429, 7608062, 2147950, 3858856, 6791048, 4115046, 2360009, 1007126, 1420551, 6999770, 5397107, 3240435, 3315224, 5647378, 6172666, 4887504, 4141035, 2861062, 3122658, 4093908, 715621, 1714512, 4633066, 767499, 4331334, 2272858, 7241032, 3107744, 7800848, 6296453, 3911231, 3540601, 2068866, 3927560, 1040826, 2201935, 664526], +[7090291, 1989201, 6118115, 1476146, 7536419, 8322799, 5950956, 8267461, 7609389, 1431325, 112675, 8267806, 2877813, 4587228, 577546, 6811694, 2846461, 6055685, 1172044, 7701176, 350602, 3345503, 1484354, 4957584, 6104233, 8114112, 6390720, 8160489, 5543073, 6161915, 6908779, 3470522, 5663216, 1025863, 5518546, 179031, 5319046, 6492566, 4387380, 328865, 2385300, 7509164, 4523830, 1769437, 7305191, 1799542, 2579784, 3379695, 5023935, 5119468, 6440062, 2478574, 5947135, 958864, 180362, 983875, 3631642, 3133879, 7769249, 5795411, 418829, 3861659, 7308043, 2791794, 5470605, 828605, 2531813, 1043049, 4853410, 7922908, 2008161, 392887, 6419330, 6961948, 6912016, 224530, 7823713, 3084620, 5966231, 5456628, 939767, 226305, 243958, 3042851, 4844383, 1859447, 4688504, 5537197, 5850555, 5348179, 4615676, 1784321, 8078674, 4808530, 743138, 4156228, 6846512, 6273431, 5871168, 7755251, 5252026, 1891973, 7255979, 3093452, 6088132, 4544061, 6903402, 7069266, 2713182, 1732214, 3097381, 7338844, 3829305, 8201661, 1264893, 7370864, 1319291, 7615276, 7261221, 5162860, 3374788, 487509, 2734496, 4436233, 6454810, 3515043, 901118, 8015800, 1048476, 3640805, 1445919, 2573951, 41572, 4724743, 310668, 2494134, 1127574, 3700120, 1140349, 6456036, 363970, 3869283, 3279457, 7762368, 2866833, 6299927, 1719650, 4131478, 3913974, 116163, 5214814, 723937, 6021159, 7621537, 3356650, 4600497, 1298750, 2427630, 1482432, 6759971, 6863640, 6354088, 7045221, 662877, 6594395, 978353, 3130181, 1412508, 2686843, 6669197, 3433059, 6682135, 2522990, 8345241, 4097226, 2199179, 5021392, 1997087, 4416448, 1851497, 3676944, 4864657, 1591364, 2453500, 6349615, 4985104, 273089, 6509201, 142979, 5212001, 6724389, 6847978, 192405, 6975782, 4255889, 2256402, 7721989, 1586571, 6669505, 6615576, 2454479, 6254706, 6553216, 678558, 6052126, 197972, 5932736, 6717340, 4478648, 610318, 6591033, 7963332, 58445, 7514386, 7185820, 1503190, 3721213, 7131565, 7114576, 5410511, 4436485, 4755765, 3078576, 5879490, 397700, 1948141, 196872, 2587143, 3256582, 536885, 8291646, 4951029, 497181, 3717800, 1439253, 1539922, 2107716, 4688967, 7120882, 7560935, 928356, 5989369, 917995, 2455435, 2352765, 2883184, 2695744, 7213419, 4429725, 4589005, 8187736, 7721735, 7801436, 7824046, 6971001, 1076175], +[6562658, 4589386, 6234799, 7747056, 5404545, 2851093, 6252981, 7600008, 5648332, 7563286, 6404145, 7446438, 1037168, 5590589, 304912, 6960005, 5744852, 2746386, 2898502, 3422249, 8167784, 1309529, 2758962, 2671454, 4194029, 1085914, 797984, 1647852, 206216, 4073375, 5435427, 1499910, 6729526, 2635710, 5632714, 7529680, 1428005, 4103599, 3821554, 7098260, 465711, 2757861, 5446148, 3440599, 4530016, 7700119, 6190804, 861232, 3944011, 6180181, 7139693, 6235623, 2983564, 1706716, 6738505, 5250519, 1738465, 1270613, 363412, 6579829, 4925248, 3329734, 6411381, 1783469, 6605643, 1721359, 7398433, 6872567, 160503, 171249, 2336352, 7364444, 4603427, 1956714, 2766079, 3050834, 2233409, 1364666, 8266683, 7161440, 8350339, 3670932, 1703959, 22757, 5317210, 6512134, 5242806, 4243750, 6531552, 7312805, 7511890, 3287607, 767868, 4987844, 1938322, 277307, 3685347, 7676723, 6628398, 6580532, 1230075, 3836024, 701948, 149399, 3755502, 3370574, 3267189, 200216, 1632788, 796172, 6374951, 6761509, 8073339, 5555301, 1367489, 3701593, 6876839, 7391291, 2042009, 6628353, 6453810, 7228110, 7245753, 8098564, 7201603, 1493223, 1693809, 623301, 3445276, 1016451, 1475111, 3382255, 1203580, 5943013, 3043118, 1644084, 5771140, 3522427, 131065, 1126935, 4217440, 4984877, 4872483, 7793824, 1260334, 5232320, 5184612, 6915124, 2335251, 7318959, 6655725, 494764, 2819970, 2159975, 4308005, 4871776, 5668657, 4555501, 3923486, 8042080, 3351893, 8165657, 5047625, 2086590, 7434653, 290308, 6596745, 5204995, 1611056, 8223486, 3545529, 6785072, 6380045, 1672801, 1761495, 7561702, 6328723, 3819929, 7100920, 7760954, 998438, 7106637, 640831, 6285002, 1555626, 5308276, 1431966, 7121865, 6685259, 6267600, 424532, 4442371, 3188000, 1131698, 3361174, 473970, 2028693, 4594364, 101879, 7911894, 7849749, 3702466, 1929498, 7602101, 6438906, 8290092, 4622910, 5379401, 8277555, 6076121, 687759, 6303932, 8014870, 4304568, 6836794, 1534152, 6135528, 3561472, 8091493, 7321206, 5416391, 1911962, 7726862, 2606264, 6310349, 4307424, 179712, 5888195, 730849, 175061, 4954712, 2800340, 7000348, 7002065, 3643029, 7336409, 8327667, 2405013, 4737561, 7978872, 7558159, 2966653, 7609329, 2694919, 5579629, 4894203, 2124591, 1588521, 6168078, 1981865, 2604210, 817321, 4997594, 6341282, 7888693, 2178309], +[3291489, 355298, 6318436, 2743739, 2683026, 2452262, 4419231, 4318992, 3175689, 6158679, 6560796, 5470575, 7202885, 2142351, 1162017, 833132, 7115046, 1024202, 4011955, 1243334, 1566406, 7291028, 1800528, 7434535, 4753067, 6669087, 5157910, 1225615, 733758, 5059269, 1405834, 5737760, 1827199, 7429041, 4945180, 7288049, 4592238, 4669567, 1540085, 6732701, 5121778, 1176156, 6513025, 634514, 7058789, 3658132, 7299854, 3960003, 6337720, 6944448, 1572149, 6614321, 2327214, 6448700, 8211235, 1310972, 2861913, 240787, 2120767, 5811986, 3496974, 7830062, 1777202, 8295596, 5670692, 4565177, 7762600, 7384213, 6073137, 758809, 1562827, 3650471, 3230719, 6276997, 6364453, 7790129, 2165338, 7405311, 2523061, 5370921, 7308988, 6428925, 7636941, 3852314, 404904, 5787905, 2404242, 7669057, 6630597, 2045477, 1538028, 7178786, 4031242, 6868106, 1006508, 2894804, 5252844, 1540351, 6641674, 4819286, 3346530, 2127824, 292560, 8241122, 7089843, 3993080, 5335622, 6190000, 7762219, 4082211, 7182135, 4871977, 6074725, 5973764, 3437891, 510067, 2579299, 1383156, 1804347, 1625094, 3296368, 1998359, 1111718, 5523524, 3928799, 6662714, 7046742, 4716316, 6110031, 7745795, 6745752, 2759022, 4656918, 3932306, 2031488, 3772845, 3911021, 3007748, 7322319, 2757657, 566202, 7266127, 6770431, 866924, 5989071, 2932644, 8066863, 144656, 5453890, 1244952, 3957526, 5526654, 1226544, 2137720, 1884574, 8012225, 7355529, 5641775, 3474075, 5009081, 1422018, 3757299, 3895970, 5861437, 8267021, 2572551, 5122437, 8305441, 2795997, 6490598, 7850818, 7333662, 3652637, 4191273, 7561082, 5225217, 3614063, 6607886, 3498001, 966846, 5942594, 7337788, 3191805, 4224922, 5202069, 1688596, 1981936, 3862115, 6326591, 7265125, 4742705, 2774314, 5329378, 7112644, 2536312, 6976007, 8356455, 4102683, 7647006, 5160465, 4374949, 4683296, 4124670, 2441640, 2545570, 5622816, 5459400, 2598296, 1708806, 7250218, 360980, 4055939, 6637525, 498900, 7474442, 6365726, 3736619, 6265007, 1782616, 2229228, 7113972, 1439365, 4304835, 2717545, 3850714, 2426070, 635255, 7178569, 3647900, 1304479, 3620126, 4314908, 380949, 5261176, 2220297, 6801588, 319274, 5555023, 762561, 4283760, 7707711, 4155486, 7717787, 6062317, 5256117, 1494618, 3461102, 2150123, 2693569, 6246660, 5150462, 1052373, 6150796, 6409892, 6156663, 4125505], +[2318043, 7634396, 4128865, 1470370, 8206572, 4934646, 1248748, 7691275, 6739257, 2035651, 1186985, 64591, 6787706, 2783456, 2005998, 7121044, 2615939, 7792539, 2107293, 6455128, 2905042, 4871871, 119937, 255218, 2463182, 1894493, 1153410, 3578021, 5361819, 7504103, 2063679, 6813131, 1375990, 1337553, 4671486, 7911246, 5814813, 7039830, 5267927, 4867866, 4627304, 1274635, 29492, 6802158, 857730, 4742465, 8139844, 3784980, 8178018, 5230085, 678155, 1866601, 5002198, 292759, 119103, 4862978, 914208, 4463045, 1980598, 3763875, 8289289, 537456, 1396433, 7223993, 6028806, 7404699, 5722404, 1571479, 4536443, 5470083, 7393180, 782089, 7410085, 2580657, 3277785, 7604831, 967464, 6362582, 5870678, 5918271, 7761026, 2469347, 3696925, 4597721, 2199906, 146141, 7742163, 4407167, 1837463, 192411, 6087419, 4704629, 3296522, 3746844, 7564947, 2349514, 7338993, 2606699, 6572041, 7386240, 3431541, 5693487, 2761404, 3718757, 6438353, 4047003, 1448719, 7618901, 6713099, 1916112, 6713348, 6394728, 6287415, 4908384, 5238618, 5035257, 682648, 7642357, 6338709, 4266467, 464443, 1948226, 7034213, 3799, 4819257, 603692, 286512, 4613495, 6413019, 8093545, 6472938, 2713773, 7684995, 2988502, 992015, 7651302, 7549382, 6820837, 1077546, 3172635, 5812266, 4075566, 7605044, 3121055, 4797932, 4550027, 7869895, 2597491, 4130894, 5780693, 7380796, 1634434, 93222, 7331275, 2519148, 6961480, 7254808, 4925813, 28176, 1339337, 761837, 3735627, 1138328, 6127790, 2607131, 1351154, 789103, 2268991, 1650990, 1953390, 8129282, 140889, 3695278, 2577608, 85218, 6634886, 5256301, 4190229, 2427849, 1201555, 2142420, 6071051, 8096546, 924908, 4372138, 787581, 4282091, 2832449, 8024845, 3929088, 1779977, 5160502, 2968631, 5928748, 2422370, 890621, 54158, 1544166, 7992931, 562184, 5369427, 782984, 2939808, 6263502, 1767407, 3093903, 5483480, 4159618, 2831389, 2815050, 545622, 8152053, 3137421, 8337969, 1329605, 2005251, 1800340, 5750814, 4246108, 3440553, 7525381, 3794399, 661566, 3212729, 4884181, 8271048, 667405, 2531805, 8157274, 1036172, 7043646, 1070459, 6789345, 4781654, 1824175, 7878106, 3336934, 4519946, 3671062, 1902593, 4200439, 1713694, 3405389, 6746655, 7336880, 7879513, 6707627, 1062511, 2028245, 1188314, 1792884, 752605, 7901641, 7147858, 6152594, 8343818]], +[[6751095, 4795203, 885047, 7940309, 3478932, 3238845, 863413, 7851412, 6543404, 1357512, 4757923, 3430655, 3676858, 1096643, 2035346, 1725087, 3507397, 879250, 2288486, 280410, 3000791, 1984678, 1373405, 7853247, 4736334, 2332728, 2350953, 2186166, 6808659, 7979162, 5080950, 8143904, 7268047, 5605829, 7908376, 7948657, 6561944, 3135604, 2691985, 3994273, 1821263, 6695907, 3712683, 7708795, 3716683, 433189, 4666287, 1892953, 1205689, 1884751, 7742487, 4865850, 7322163, 4706767, 6052298, 4627777, 3847127, 3228439, 7721549, 8117503, 2882600, 4816017, 1510540, 2317754, 291126, 5849360, 7724084, 7403677, 104336, 3619157, 1202556, 1110298, 7841957, 4238043, 7393146, 1968558, 3168770, 2877227, 2714562, 944233, 5588351, 2384955, 6110746, 1965275, 491269, 295712, 6818342, 291487, 5020579, 1971892, 2059733, 6497678, 4047600, 7556301, 6539029, 2338681, 4043349, 4364643, 347335, 3195915, 239945, 8332701, 517255, 5605823, 7357017, 2734022, 8202537, 6301241, 8111641, 3110622, 2239943, 2802622, 2202877, 1688656, 5280977, 6759869, 5804947, 787123, 5042862, 4689223, 3934824, 2819262, 1273265, 5904214, 489859, 4147976, 3948606, 431460, 2439562, 1903663, 2840047, 8287966, 5297735, 402689, 1502823, 3587927, 6606677, 4816862, 8047747, 5965768, 2650493, 4630375, 6813294, 7124647, 1033707, 2825313, 8177791, 235634, 3212471, 3215376, 3035029, 6311988, 1086544, 5212123, 217492, 4333461, 5296456, 238495, 6728832, 1018752, 7972486, 4044650, 4886825, 5510336, 2219791, 729333, 6868987, 536484, 5733946, 3233489, 774738, 1349325, 400438, 3636645, 7554378, 6015410, 3532873, 5538835, 401019, 2883838, 2723643, 6607023, 5519380, 3094919, 6027316, 2685918, 2909373, 1415425, 5240992, 278754, 2345667, 6235146, 7620696, 4121899, 4502119, 2555363, 664532, 5547725, 2628573, 7180606, 3391994, 5424680, 3210167, 2042474, 3769922, 5621045, 4201283, 6594107, 2133648, 6931021, 473998, 4046819, 1403445, 6255888, 2137075, 3652598, 824511, 5254020, 6063424, 6057342, 280780, 5740573, 3672971, 7403778, 119374, 848070, 3299338, 6886103, 1900989, 3833782, 1207252, 1822715, 4606129, 8294995, 933298, 5445054, 8026640, 5049098, 1682529, 5876662, 4810134, 1592882, 1511200, 7136876, 1331216, 3121004, 5162348, 2518345, 5177633, 1545182, 4734107, 4125372, 7565800, 2987938, 223471, 7434975], +[6476891, 1272736, 6895586, 5995035, 3702657, 1401339, 2764560, 2935833, 6056732, 5204200, 7883077, 6613066, 5655867, 3999117, 7461239, 25070, 661785, 6153359, 8246781, 7146281, 7007317, 1650728, 5956800, 2758622, 5034532, 7065320, 2124924, 3964137, 965414, 1625485, 1733553, 7504007, 6551472, 7900070, 7482544, 793905, 1026118, 1571976, 3913244, 2822754, 777321, 1024911, 483321, 6691468, 6102271, 3558611, 6695078, 2093271, 8278712, 5208811, 4569412, 3656736, 4554180, 377091, 7861784, 6083642, 6561199, 7078199, 7223561, 944610, 1137887, 4395992, 7543311, 4133130, 3287430, 7753270, 734286, 602206, 4091314, 4514852, 3320601, 4331908, 4309428, 4333282, 6969814, 2354487, 2453465, 728783, 4025949, 5329756, 1281858, 3912836, 5407965, 6967513, 2082577, 5564225, 86243, 8065043, 6542808, 6112996, 3334872, 8273080, 2332332, 2278327, 2140087, 461490, 5681877, 8086723, 7178764, 7215555, 1999691, 5462873, 4779520, 5038401, 2072430, 54234, 3458740, 6841286, 195726, 4711342, 2673222, 6133969, 8157160, 4522306, 3172419, 6118689, 3671789, 6016236, 6690747, 4767189, 7629121, 6638934, 3448050, 116322, 672154, 7126721, 4383307, 4043477, 3840265, 3429511, 1204334, 6102473, 5091034, 1963914, 8272802, 5960368, 1792045, 5960367, 7552500, 1008550, 5659021, 4128869, 3311842, 3127272, 3788843, 7450387, 3411140, 4866745, 3947284, 1004443, 7011341, 1282024, 1380404, 4314417, 2976249, 920749, 2695644, 4653367, 2153892, 680205, 3949025, 4846090, 3013192, 3437938, 5853869, 2110353, 2018090, 5642105, 2061456, 295805, 7281932, 2190730, 5469153, 2801403, 2644754, 659541, 6421762, 6108961, 3861817, 4543297, 6832299, 5496097, 2903780, 6527846, 5006095, 6477294, 5075665, 5529606, 1913399, 313944, 2485155, 8043278, 3403779, 2005266, 3388133, 3669212, 3135482, 341739, 292356, 6260799, 3101772, 6218234, 267767, 1689670, 963126, 1799986, 7748068, 2475689, 4814367, 4782406, 7834185, 3228347, 71406, 5096387, 1015713, 4204839, 4380399, 3017429, 5278885, 1329709, 2741256, 8352956, 1789673, 1705272, 1296461, 4014281, 2025872, 4521377, 4560695, 2745517, 3802749, 4941885, 4810271, 3945148, 7710417, 3894015, 4735556, 616183, 3133252, 1730823, 5185677, 6729885, 3704649, 6951087, 951499, 1629073, 3551815, 4971465, 5156933, 6963295, 3240860, 2262626, 7106398, 8294249, 3311636, 6982187], +[111619, 1676994, 1098033, 7710340, 4760347, 6602290, 7315031, 583574, 1626727, 114820, 4149543, 3038751, 7361786, 5735246, 3890677, 8012447, 2604931, 2684764, 6581247, 4394982, 7701225, 7909965, 7526721, 5118485, 5320434, 5698954, 5349329, 1473466, 3400943, 412228, 4770835, 3459174, 2095715, 27144, 4941901, 8140658, 7117633, 7432500, 8265263, 2725505, 7151706, 1165339, 2214439, 4267376, 4437403, 2692371, 4311270, 7136977, 2521293, 8227583, 401703, 8360516, 8261995, 5781447, 7086980, 24140, 4828655, 6050732, 7958, 5310267, 6805324, 3332368, 7096315, 2010763, 1779478, 5507514, 817253, 8003762, 3812905, 7138960, 6221024, 2603806, 5800256, 2699033, 1168661, 865306, 1017725, 1362241, 4594286, 2153557, 2753094, 636703, 1917776, 5222181, 3814607, 6597777, 8336267, 7372776, 4797723, 5145069, 4398226, 4477675, 7138360, 5104574, 92449, 1541680, 5146709, 4714944, 1340886, 2521418, 6210599, 6763988, 648010, 1210506, 4522327, 7220120, 2539632, 5502013, 5429101, 7297533, 2330200, 801829, 4307704, 1564563, 7660938, 1486554, 7085516, 2067582, 4177849, 7771615, 6902300, 3782060, 1780540, 3387065, 5338543, 3783816, 1808309, 5025146, 5497441, 6669583, 6440450, 1387637, 5308114, 5958104, 7962645, 5297694, 217910, 5818179, 8107471, 1742062, 3323546, 3205566, 5438963, 865402, 5244058, 2129686, 7648350, 7525973, 378679, 1639334, 8106734, 6638892, 5592849, 2137207, 2385452, 6482525, 4479444, 2617984, 2137320, 2658402, 4812798, 2509087, 5945382, 3670439, 4705473, 1142377, 8201723, 1045729, 2362050, 6678922, 207442, 4363495, 5593076, 3950996, 1424564, 1439296, 2428094, 575177, 1048, 2632687, 7183292, 517156, 2866908, 4019740, 5485492, 1630403, 3854222, 7494081, 2613643, 39814, 5570057, 2565918, 5594189, 8256879, 1437564, 4428191, 4695604, 3325202, 7999642, 7620225, 5072968, 1209312, 7771244, 6978854, 443972, 4372896, 4087611, 1887400, 229728, 7586330, 1123133, 5814707, 6081995, 3186047, 3477409, 3860170, 6503187, 4480135, 95838, 6350297, 1229136, 3623912, 3682561, 6224580, 5762404, 2480050, 247450, 1613365, 2351719, 6229159, 2065951, 8148746, 4567389, 4524949, 2421069, 7709944, 5273185, 978712, 3282297, 2052230, 96588, 7056422, 6939803, 3227456, 5376329, 656857, 1707491, 2361931, 4749949, 6452618, 309084, 6722262, 3919921, 2719174, 368589, 3099014], +[1440271, 5728915, 6744425, 5387316, 2224474, 3278861, 7884805, 2439391, 4207727, 7990031, 6602542, 6027830, 1622622, 420242, 3955074, 7508794, 3594656, 6506828, 5210271, 1641300, 2002611, 1890290, 7165934, 4864127, 7528599, 5159198, 7411610, 1600681, 8097738, 2775133, 5582741, 6756740, 1472117, 44100, 5121027, 4737891, 6721415, 8107516, 7749325, 4166297, 623411, 4332720, 6327763, 3851672, 1830623, 2567124, 2086122, 1655603, 4987454, 7553431, 7074153, 5497490, 4315022, 1170125, 2999857, 3513096, 3077743, 4365435, 2656943, 4567950, 8261950, 1428889, 1945783, 3505370, 827025, 5490949, 1463425, 6913993, 4490590, 3262197, 6723810, 5270961, 1693688, 3194706, 7870375, 282821, 8154936, 5439411, 7346416, 2322829, 4498397, 4448288, 4926603, 412709, 1467492, 1744393, 6324381, 6807702, 6698955, 2836148, 1098737, 7787632, 5600183, 371117, 4441500, 2874651, 6341038, 3413325, 2812055, 5535489, 624307, 6650283, 5199110, 2376768, 5823438, 6852952, 1630717, 6391776, 6510242, 1486924, 5867609, 4047369, 5837502, 4363815, 5387744, 8289435, 7811456, 1511827, 5326328, 142721, 6737079, 2641974, 4083182, 7422018, 7730845, 3724776, 4416264, 3890631, 6679547, 1921729, 4035936, 7817015, 5181126, 5020502, 7595951, 7975474, 4893442, 1576956, 7209064, 4364720, 2438984, 2032332, 4744565, 4688186, 5703513, 8100558, 7230920, 3311055, 4439061, 5635770, 3899831, 1885655, 617854, 1255288, 2395895, 3631106, 1570697, 4396400, 1695570, 4407054, 5299201, 7882535, 4034632, 2725065, 821406, 5826558, 7013710, 5380165, 2386136, 5192039, 5084403, 2421784, 2808044, 6011123, 3873461, 1249881, 6209740, 8219344, 6974819, 7235173, 8339928, 2076486, 1733701, 8084269, 6959599, 5771827, 5707238, 93481, 41310, 8061116, 2085879, 7141713, 7677783, 5843820, 5992287, 7737448, 802522, 7052498, 992924, 841287, 5500278, 1329849, 3629010, 5377923, 4811434, 5232705, 925726, 2674185, 4741592, 5814553, 6329610, 4618171, 3774201, 568387, 8148374, 3064425, 208034, 7527510, 5217180, 3572150, 5711951, 7035536, 6239242, 8294020, 8074928, 2103706, 6772843, 1083972, 5009329, 3177257, 6149619, 835559, 1011387, 7414590, 3597950, 2542614, 2691486, 7159129, 2652292, 849763, 6607563, 1830791, 728450, 4795880, 7201012, 6741918, 2307056, 6694005, 2205922, 6343351, 1940664, 8125548, 2213634, 519296, 6398731, 1742236], +[6370436, 182888, 7464879, 2196521, 3016161, 5710855, 2178731, 5242891, 7175646, 3376572, 692652, 115256, 4681265, 2327364, 2866131, 711001, 2543099, 3952645, 6873295, 5874177, 7842267, 7460562, 2103889, 5307755, 2748798, 5682641, 2064938, 994731, 7316148, 7724024, 6661771, 7891061, 3333696, 3505649, 6523273, 887444, 6717279, 2121048, 2210738, 4195354, 6759001, 1863853, 376520, 1308760, 7186525, 4452157, 783534, 134073, 2252782, 1339413, 1861831, 3241553, 5573493, 3828234, 2542644, 6324500, 1571161, 2652195, 2037112, 6669366, 4686981, 2056409, 1564989, 7246088, 3488787, 2424423, 623278, 140110, 3051064, 7864232, 768386, 1315674, 1511982, 7121946, 1538112, 7211115, 6300123, 3663354, 1726877, 28613, 4445831, 5273734, 3002191, 385451, 5009543, 4747052, 499099, 4633017, 3164423, 6692198, 1151832, 7368178, 1730215, 7593663, 4420845, 6559731, 1778274, 7733518, 3493353, 7115783, 1328832, 2776578, 4566058, 239026, 8259472, 6553016, 6416483, 2929324, 5498164, 6281446, 1943822, 4238161, 963731, 8064601, 2622570, 6355087, 4337091, 1503751, 4093881, 291377, 5411105, 6900748, 1285139, 2996804, 1639018, 4451582, 4467082, 8097000, 4047496, 2908878, 8338836, 2089162, 3783940, 1771450, 6799800, 4997128, 5100179, 1796653, 550299, 1219994, 4008138, 383514, 6311848, 7640655, 537625, 4510206, 1034153, 5330904, 4657692, 3396866, 6742694, 4497646, 4217863, 2007116, 3072597, 8067082, 1109224, 5139740, 7294832, 3383664, 2509457, 3744060, 6408599, 1302642, 8329512, 4588043, 1102524, 4964929, 2821649, 1823572, 6767145, 2586648, 308995, 4776529, 8157535, 4316630, 4735203, 1011890, 2695909, 5143059, 7353613, 724804, 3130264, 5338244, 8139815, 4239395, 6222159, 4321803, 8322735, 6234963, 6507140, 1842719, 5625545, 4511207, 3406794, 8020465, 3309806, 98342, 105605, 361485, 7289774, 7343717, 5474574, 3382938, 81991, 1648491, 6095443, 1708831, 5419209, 297297, 877589, 1901449, 7055875, 4390177, 7180193, 3813482, 623224, 2133247, 5237295, 2580078, 8297584, 8140553, 2207391, 1791402, 469374, 1258826, 4457375, 7059905, 3903672, 7032837, 2336308, 7562556, 549571, 3207520, 6897500, 2374073, 2525078, 2405454, 866625, 6922550, 4767212, 3713596, 6227576, 6905221, 1758141, 3361235, 6912194, 4383639, 5525742, 3496007, 5593733, 4665592, 7956024, 1706800, 7680460, 1302122], +[5188684, 5135238, 2297957, 6853152, 915652, 396775, 2807763, 1583950, 4150010, 3415769, 7391999, 6813601, 7072294, 5490506, 2824855, 49545, 8264355, 4098461, 4777510, 6500465, 1428602, 1855085, 5447637, 1145048, 4935218, 5419327, 1677402, 2990969, 1051297, 6256614, 5530434, 5012074, 8075416, 1304490, 7707684, 5299912, 5734297, 7846005, 5107826, 213311, 2703934, 8005644, 5214795, 7613563, 1212925, 8125766, 1361743, 4455087, 1496409, 4410391, 4436496, 8283312, 7151812, 5539885, 6707432, 7994726, 7095397, 6192040, 5077777, 5577855, 2869095, 4047545, 8189070, 6220763, 75955, 4385765, 636052, 4572864, 2066601, 4508464, 5945656, 3324303, 6189266, 1287276, 6926910, 8210694, 3218693, 929109, 2972097, 5072056, 769760, 5472836, 2286651, 6514537, 3099230, 1663793, 1719663, 8192586, 338385, 6428412, 7306278, 7668214, 2508447, 5775485, 2913751, 227433, 159552, 6590226, 5599974, 5442169, 4795632, 7948716, 2136690, 1391615, 5475437, 1731855, 1108447, 2259297, 1328225, 5226910, 860282, 8323024, 7020816, 714547, 5708399, 6831589, 2230688, 7522236, 7411356, 4143192, 1206109, 3603321, 5592645, 6391587, 4782316, 4232161, 5108558, 6948077, 2233238, 8371438, 4040646, 6319502, 6702108, 6942376, 2186013, 7048495, 6011145, 7920113, 6182143, 1142088, 3001344, 888009, 2366964, 3813796, 404752, 186801, 6710043, 989313, 2939002, 1540143, 203997, 3992775, 1019585, 7467304, 6273972, 8226276, 6835853, 5683825, 783467, 4779036, 6538227, 6581944, 1311199, 78493, 6255063, 2786811, 4880643, 1671827, 3209645, 3753049, 7382031, 3385531, 4736602, 4517108, 678625, 7688556, 7048041, 8268232, 4313694, 1346460, 509573, 4695861, 904968, 5515360, 4197105, 1429467, 4196332, 4508373, 5323233, 2096377, 1723206, 6385954, 7562597, 7740186, 5645050, 7979631, 1712487, 7263435, 4077406, 6099701, 3720423, 5030308, 5225176, 3492173, 6042577, 6819292, 4602024, 1753319, 6095055, 5107877, 7544405, 793939, 2432377, 5345564, 1069504, 3431216, 3026505, 5635957, 6427472, 4422110, 1516109, 3010762, 4798740, 1636871, 2261079, 666510, 4979533, 2771542, 1603972, 7448104, 4134703, 7842028, 3607408, 4855718, 6830817, 7330854, 1180320, 8342148, 8202896, 2103302, 4726766, 207074, 4336685, 5301805, 8017531, 3207765, 4800668, 4566823, 5510486, 477610, 1241002, 2889600, 7107733, 3843327, 808457, 6037945], +[7393218, 1010544, 3183488, 218660, 1441560, 7836839, 4983576, 4533836, 4969688, 3733928, 6869004, 5587507, 3764032, 4131977, 3851001, 1453460, 5118791, 3854553, 2073971, 2228573, 6929473, 4323941, 7733547, 1524685, 2865938, 399231, 5733417, 5736532, 417290, 2588427, 6919824, 71817, 6867722, 4383823, 6190831, 7968742, 2026367, 6042561, 2146353, 5878182, 4203143, 4541042, 6083522, 4939206, 3988980, 7283451, 2999672, 6853643, 8182666, 1151008, 6527229, 6864305, 2819138, 6714176, 1288565, 3207889, 2065181, 916640, 3059622, 1598106, 6112770, 429106, 969034, 5076607, 7130262, 2339937, 6908584, 749908, 6922910, 4837313, 6383853, 4326285, 750885, 6416544, 5486858, 2293387, 7413210, 6218001, 1596253, 1976809, 2120109, 4792013, 2612340, 5217977, 7350753, 5974215, 4446632, 140160, 2585069, 3101378, 2755997, 4206147, 4253155, 5845946, 8107194, 1963949, 3871759, 4881533, 1652782, 7983440, 7685161, 4284228, 5654027, 7044660, 1583462, 5104430, 7834647, 2532939, 2841082, 5057887, 1823885, 6823299, 2144802, 228342, 2805703, 573965, 3727947, 4627422, 1117472, 8300813, 2533346, 3635354, 4840010, 5144115, 8284731, 5033354, 2163030, 5590009, 7644617, 4960397, 3407240, 631099, 7524712, 96012, 3605586, 3082542, 7905016, 6199246, 718259, 7694530, 3956311, 6266425, 1150139, 8084362, 1915011, 2644793, 5243211, 3139878, 2689012, 1286078, 4451144, 481318, 4632259, 8335499, 6855889, 6500657, 8194073, 3641807, 3933466, 6943907, 4783841, 689874, 7223634, 2127663, 1553196, 3446462, 2093820, 6158213, 2446582, 2581522, 7758883, 8305768, 3764022, 8326987, 2982826, 6419194, 4128593, 658068, 7600883, 2259852, 2916371, 6336323, 4427505, 6009050, 6598145, 5442426, 8356766, 6331308, 1923665, 2062793, 8133521, 1321759, 1984376, 1476431, 832971, 4118161, 1757245, 6384005, 314822, 4708615, 3648245, 605737, 5968656, 2276625, 7434635, 1038395, 695736, 2330549, 3838059, 3828632, 3673039, 878015, 1331304, 8266234, 656965, 4365274, 1078122, 3717961, 2481642, 3895505, 8269144, 4792734, 6966191, 4643038, 4611752, 2812883, 1283788, 7402851, 2675286, 7957640, 3306450, 6993067, 5590700, 1584176, 5971990, 2948979, 2207517, 5592115, 3090390, 8238826, 3141801, 3497152, 5500832, 2763996, 2426928, 3522197, 6429592, 7644530, 6766918, 7615983, 7988132, 4084939, 3031288, 5365043, 4759102, 3014436]], +[[3370263, 1299342, 5032432, 7061446, 6126697, 6765940, 6437056, 7315301, 4981667, 2489899, 3182661, 1225959, 100414, 134135, 2004517, 3625453, 578729, 6939089, 4536144, 2456983, 3387733, 6724231, 5731499, 5173368, 4730278, 3814469, 8167680, 2279258, 8049541, 742775, 7581054, 7256159, 7971096, 5079182, 6344532, 508911, 7301600, 2795538, 5234115, 7367426, 6346625, 7453439, 2412006, 521226, 7980331, 392874, 7570550, 4793369, 3728966, 3234210, 3425449, 1022433, 2375398, 3377419, 4509020, 6722704, 7724484, 2351714, 1528176, 1073572, 7674001, 8110410, 500114, 303841, 8214655, 7101694, 826539, 2394823, 825759, 1586550, 5547245, 6992106, 1243916, 1890801, 1241774, 5360335, 7989979, 6152430, 7841138, 1770796, 3144485, 7808898, 664244, 4726379, 7416723, 1199638, 4059396, 573458, 4297269, 6586347, 5159968, 7751445, 13923, 7178485, 6174051, 3787674, 240725, 4186665, 4402460, 1591098, 288813, 2807572, 8290861, 5059356, 5063924, 5776449, 4436483, 5864031, 5409614, 1281189, 1295414, 2173938, 551794, 2051025, 776118, 4472346, 805703, 580048, 3225194, 7595431, 7108433, 272339, 6702207, 1142788, 63817, 6823331, 1916328, 2663113, 2711045, 1259772, 8131532, 8088118, 2963971, 3078835, 7413207, 8010696, 220298, 2297499, 4892617, 1879194, 2218141, 5853492, 7734517, 4957669, 6045751, 7552485, 1197893, 5406474, 6568777, 4209272, 5539442, 3502497, 4800896, 6527371, 7003313, 3254711, 3623152, 3820113, 378599, 3456670, 5306285, 5213009, 757733, 6552657, 7765895, 2487483, 7938810, 2860798, 3368951, 4464133, 627361, 6560682, 1662374, 1223048, 564743, 4435405, 3081744, 1490237, 4258025, 5994084, 8067940, 8074694, 5688845, 6084869, 652500, 1382884, 5414137, 2001653, 1272341, 6870987, 8271120, 5730142, 4481312, 1275364, 5380118, 7671022, 5982366, 4186302, 1357454, 5900277, 7381177, 1159252, 4699439, 3786881, 5363490, 6406565, 4617969, 8248384, 4929029, 5919827, 7562778, 165143, 2202408, 989063, 3686245, 5442312, 3393707, 5488221, 3934599, 3037552, 219778, 3432133, 7156069, 4045239, 6166246, 5141467, 6450221, 6664669, 4545185, 5563393, 6940125, 7815759, 5068078, 3999753, 6394938, 2149591, 1848783, 2658595, 4988305, 6439136, 6660796, 747320, 7512029, 2274920, 6997800, 1067768, 5919123, 4928164, 584410, 742930, 6419491, 8189549, 5784638, 6364383, 1279991, 5426589], +[6486891, 4134635, 6662125, 2267307, 1485590, 4866120, 1942594, 2315799, 4549479, 1310108, 2865296, 7414502, 4158063, 5585248, 6904333, 4709561, 6522755, 7391681, 662500, 6919424, 1242586, 7982493, 7840114, 2124013, 3424444, 6579333, 5367006, 4153374, 7163413, 6726895, 84724, 919943, 5497524, 7270822, 670241, 3864373, 3346706, 5996766, 2412285, 3829599, 4858004, 5057848, 780037, 5046363, 5183361, 3135466, 5577767, 818796, 5038430, 6809301, 7318763, 8125019, 4066804, 3466827, 4310899, 4287981, 3521391, 7907687, 6770724, 986189, 164639, 1475778, 5264157, 7908300, 5086771, 882803, 3612346, 2065187, 4710360, 3274338, 1295124, 2161795, 849661, 3174432, 5999437, 7487091, 900155, 1450944, 533484, 5211631, 666194, 5789488, 7530482, 4301058, 4783584, 7920266, 6702854, 5599039, 7273077, 1782238, 250705, 2442885, 1709783, 201696, 5569405, 2242299, 5760132, 7265903, 1737699, 6441095, 6089094, 5569757, 5917349, 5450989, 1063932, 3251013, 443637, 6124621, 7959269, 4991146, 5731727, 2615447, 2156300, 3178573, 285810, 7293436, 1844124, 5593131, 772619, 3425537, 8365223, 8149101, 6293446, 5880537, 460898, 1857027, 5221106, 1586575, 7251322, 3417109, 8059674, 5951072, 6849694, 1783382, 1403634, 7651653, 3478968, 249491, 4472553, 1726046, 7217115, 6111415, 5832718, 4082258, 4822680, 205835, 2593960, 4825894, 2836919, 8198750, 5698654, 4516557, 5665758, 4116568, 2599079, 6496023, 3940040, 2766724, 6274875, 7061605, 28616, 2509242, 5249922, 8297378, 2361152, 5057827, 6142467, 301752, 7061292, 5817479, 1253298, 6303816, 7775455, 5316596, 5341496, 8124618, 984136, 7503890, 1462637, 4485311, 4279213, 6224857, 934511, 1243241, 5967475, 5025962, 5379516, 3603492, 242553, 4151226, 41772, 890208, 1813771, 2011794, 5554248, 5881586, 7663788, 4130647, 4671251, 3634669, 521215, 5300628, 4615848, 4755718, 1176214, 4367269, 2461989, 696253, 3868849, 7148228, 3388382, 1505924, 6867076, 4168625, 5713705, 2486287, 2849323, 2640768, 4010455, 8239474, 326057, 6881231, 3209082, 6201440, 561880, 6246623, 4351250, 8192610, 7738037, 524215, 5374035, 185308, 4055774, 7980145, 7933828, 8001448, 3512516, 446900, 2421450, 1951241, 1269221, 4824212, 1632840, 4115509, 4040146, 3952078, 2277565, 5557504, 2420974, 5088619, 6694090, 6620405, 7294355, 687112, 2660872, 648892], +[3441553, 3979285, 133147, 5349434, 1017619, 2776213, 4142221, 3803179, 4540498, 5675471, 6470991, 4841527, 3357281, 7357435, 2894473, 7900698, 3169619, 5713251, 3118857, 1277342, 415609, 7220625, 6026701, 643116, 6097489, 7727734, 4065351, 6375860, 8117575, 4545678, 4333574, 5110984, 3598055, 7581953, 2439618, 1863069, 1449982, 1349515, 530357, 5619299, 5469847, 479772, 3081697, 7956057, 6309245, 1706839, 5622278, 2183376, 4213386, 2181687, 1396500, 5887806, 6740532, 5931761, 5967880, 1770294, 6007649, 7580694, 3430048, 4800265, 4891315, 5685215, 4919189, 5798984, 3538331, 8313848, 7969850, 7988911, 1608787, 3293872, 772400, 623896, 3728568, 5454949, 2814662, 5165114, 1742262, 2374598, 1642942, 7894219, 7322533, 1949042, 2448548, 4638378, 7962919, 6629587, 4951618, 4277901, 4652755, 2201231, 7749850, 8293548, 266824, 1888667, 3087474, 7102866, 2916373, 6522551, 6817945, 5223176, 1638848, 456022, 5003183, 6602242, 7404340, 4592256, 2167063, 6541547, 7976695, 386098, 5949474, 6177768, 2993831, 4216730, 3627729, 7464546, 872995, 6822210, 4862710, 3810456, 4994117, 3955423, 1509830, 2545105, 372891, 2509240, 2575381, 3430551, 1832096, 3427950, 771891, 7635736, 4430734, 7375712, 7150891, 3871714, 2369104, 5171594, 1359332, 4437796, 6942610, 3366405, 5931856, 4753520, 4961026, 5091945, 1885608, 6671291, 4423946, 5776029, 3298572, 8233382, 4931343, 5362711, 8111959, 2776709, 5390292, 717530, 6588152, 3095563, 3804043, 7346099, 2478173, 4461446, 2083375, 157666, 4793003, 3148614, 213230, 4593374, 10063, 3749586, 3835925, 3801118, 1127922, 2864566, 6785763, 7113581, 787089, 6465796, 7798302, 3835108, 3347848, 1305703, 6241286, 4328459, 8284094, 1327814, 1711177, 1795444, 665896, 1351202, 5885776, 5854065, 2797435, 1496487, 5102304, 668646, 6868654, 6333796, 3047870, 556935, 2479556, 8220176, 6155594, 7741281, 482135, 6960884, 1194451, 5715420, 3695884, 6075020, 8092721, 3222329, 3025710, 7599302, 1521787, 4912624, 6041466, 236583, 7253076, 4410617, 4101159, 2014830, 3109051, 2771533, 2807780, 3405961, 1293401, 7737756, 5592598, 3152558, 1464853, 5780958, 577125, 1681876, 3673899, 1739891, 8118368, 4230372, 2945845, 8260598, 6813870, 1723907, 7390798, 6010412, 754533, 425234, 6806744, 5113717, 361194, 7065522, 120535, 7426601, 1508200, 1582144], +[487068, 4872182, 3989539, 6199493, 95514, 2737219, 5857363, 6680601, 622058, 1133125, 5273818, 1409124, 1358525, 399396, 4353870, 3231532, 3310152, 6974637, 6200098, 5546740, 691227, 6643278, 354333, 7205498, 5548124, 1903322, 4247416, 2874696, 1186573, 7174683, 6107693, 4908518, 7164153, 5974054, 7028793, 3174692, 4392813, 5213258, 3705591, 2106541, 1319290, 5737421, 5688327, 5577885, 5337155, 2730292, 4246605, 2538795, 772522, 7508220, 5255561, 3312279, 4583530, 7160014, 6336223, 4594751, 3723083, 436532, 2369653, 1912121, 2535519, 1619808, 4779908, 6759677, 6276297, 2386901, 6087741, 1450686, 5165245, 1738944, 2672610, 4238194, 3590303, 4365412, 7218300, 2493194, 3879852, 2407856, 2644048, 1974150, 5152025, 7010351, 2354088, 4007288, 1047338, 983944, 513507, 1849449, 529633, 5994969, 4647398, 5379193, 7552795, 6049401, 8336049, 6279915, 4519899, 8310840, 1158628, 4696338, 4907405, 7236116, 7211083, 4811923, 5276319, 7742602, 3461985, 366427, 4378192, 1671837, 393983, 7094048, 3666886, 5354669, 1491114, 2712512, 328250, 6009111, 8104441, 6232089, 2698106, 3628631, 5255690, 6883789, 7316359, 3587755, 5963485, 4919045, 6687792, 4109601, 4412564, 1912747, 7262334, 5347955, 4426786, 311241, 332959, 3580117, 7276386, 6903712, 4781318, 2246500, 5811249, 1577361, 4858340, 3682371, 7810555, 1286787, 7171507, 4554132, 3627523, 6865068, 3273788, 6163772, 5856193, 1217427, 659399, 2272128, 437058, 2563401, 6672872, 3627954, 7473688, 5415216, 5271923, 5463356, 2128542, 8358876, 4291261, 5793229, 6260387, 3070863, 5090012, 3185548, 1932542, 4399391, 7598852, 4844478, 3259610, 2736770, 6860609, 3091564, 8240410, 7664840, 3747418, 6745269, 4081088, 2266090, 3306751, 6007412, 1039428, 1696325, 2427732, 8171600, 1787865, 1031445, 2893969, 5429540, 5990122, 3075135, 8014552, 2115921, 5038113, 5064367, 1414699, 5405798, 7454758, 3962826, 2159435, 3276562, 4616159, 4853070, 6260083, 5432963, 2240173, 4307068, 296823, 4571915, 620118, 5217500, 7037946, 7320181, 3770120, 7678233, 5514933, 4895649, 4257799, 3313641, 2227804, 5403601, 343819, 7346391, 7109382, 6279623, 2104229, 6555309, 937478, 8252972, 7190254, 2664726, 6348362, 4726872, 7110892, 7536209, 484507, 4761687, 3384015, 364756, 1971456, 7569751, 7382717, 3201109, 357990, 2987105, 8288771, 3630083], +[866447, 3947679, 1769457, 544454, 319297, 5389592, 3919245, 1952922, 3937569, 3387302, 4847677, 5140047, 1861483, 3601976, 414205, 4130652, 3626428, 6927278, 5260596, 7361355, 3627341, 5708923, 421046, 3703726, 1306583, 1837160, 3945516, 5411417, 4409756, 4215664, 2431852, 4063280, 921951, 47571, 947720, 8270019, 7197412, 3049706, 1270261, 4652623, 6912549, 5555621, 6696417, 2154647, 6040628, 7598532, 444172, 3049526, 5794903, 5920103, 6354485, 2717719, 2207372, 7556334, 7868006, 1461599, 3013143, 1801908, 4849285, 463172, 1739405, 5179098, 4289047, 7100056, 5813131, 6637292, 6170526, 446737, 5332989, 2674163, 3925636, 6804718, 2638722, 3748940, 6367884, 7322326, 1516153, 852415, 3451688, 1318027, 2645531, 2519773, 7598657, 184929, 4488231, 6768979, 1011689, 7290243, 2378310, 7475067, 7873783, 3656638, 8186730, 6743149, 4188385, 4051391, 7858336, 1381129, 7660103, 4685916, 1504622, 4384716, 2975229, 1474990, 4694943, 4094186, 8072676, 3294041, 8025753, 18461, 5690362, 45376, 4607830, 7530916, 3347828, 3690910, 2351029, 3669517, 2181843, 1110894, 8195706, 6841683, 32192, 2254708, 224086, 5930798, 3526744, 6536872, 5667114, 3226430, 3006410, 664562, 7917881, 693785, 6967946, 3552647, 5908198, 700826, 3161048, 5312239, 1797094, 6314893, 4667552, 7420950, 5090698, 3189713, 7192755, 919644, 3597773, 3931684, 6175687, 3920149, 325368, 8256184, 1287962, 4160480, 3325302, 6884333, 4452767, 6947824, 1330966, 1927529, 4150262, 2848542, 7887260, 7374041, 8268955, 6012176, 215748, 5791198, 5782089, 6301537, 6017312, 4065444, 2385270, 357938, 5847966, 882968, 4176509, 6192628, 3615277, 4844233, 4905553, 7067094, 5843983, 3494509, 4799205, 6141654, 5851709, 3640179, 6424051, 2432810, 2548809, 5307795, 6785641, 3191344, 725500, 2132647, 2069807, 7959108, 492023, 2928847, 2597774, 4648793, 8086471, 2731366, 4111957, 5296417, 2359449, 5718971, 95783, 7734177, 331516, 1420844, 3176128, 4010975, 139119, 40913, 350585, 2518210, 4472044, 4533156, 429368, 552783, 8018912, 4968601, 2911681, 1367732, 3751855, 2708915, 4003099, 6744823, 838092, 7668051, 4879005, 1670642, 6539701, 8318157, 4590938, 5320069, 4237749, 589813, 1786385, 1538608, 7363186, 4914439, 7984182, 5300400, 3960278, 3835028, 1758814, 7874135, 2523781, 359969, 2299194, 426777], +[1073395, 5657154, 6544594, 5142518, 3127479, 163603, 2031343, 5765489, 904245, 1034349, 7163678, 2500418, 2804720, 7733422, 6024520, 6211821, 6894846, 8358426, 7020469, 1159448, 2137158, 7325056, 3982222, 3726458, 4159121, 581021, 5855839, 4842745, 5493257, 2017884, 4938904, 1247342, 5084380, 4201598, 7289364, 3930204, 8111510, 3233383, 8123729, 5529036, 6108560, 7969165, 3802419, 1248697, 2669809, 582053, 7602678, 359827, 7102416, 7049899, 615644, 6710279, 2326573, 5676793, 709910, 4546315, 4440134, 2983390, 5603906, 6352893, 4012150, 88873, 7356523, 7922013, 5316083, 3218471, 1229305, 2331183, 1774526, 2468353, 6082168, 4467890, 2051974, 5311193, 2185199, 3983995, 636449, 7683173, 6976708, 2359199, 7630490, 5444850, 7099528, 4589720, 6207511, 6070601, 5252204, 7785845, 1598687, 417694, 3119547, 1302914, 1164756, 4471488, 2182031, 4990793, 7392796, 6221607, 2415649, 7043957, 1686557, 5308191, 1043068, 6913747, 2711492, 6832940, 7470813, 4105624, 7218337, 3729370, 3649877, 7898397, 7303069, 7999998, 7539544, 5504971, 5298476, 5315978, 335654, 6585163, 3847871, 104077, 2251840, 3784865, 2689769, 3322006, 7915242, 5033344, 7403842, 207817, 4047109, 5895551, 5314554, 805738, 2090200, 6101253, 1932159, 3213089, 5423322, 5555222, 2765815, 1003830, 6642836, 4989331, 1854998, 2726512, 1063926, 2314196, 4357559, 4941745, 1034470, 2172177, 236885, 6670628, 3538854, 564881, 5663550, 1498214, 4980961, 4150543, 3196640, 3326073, 2866721, 1275750, 5655474, 3177899, 3448846, 7446357, 6448869, 374180, 2296737, 8235941, 6957014, 5670644, 7680933, 7183947, 5354752, 5648560, 84742, 230321, 4951775, 4182627, 1014047, 5036690, 6523130, 2667668, 4074835, 3430880, 2069902, 6214553, 2211210, 2402142, 1799331, 7641195, 248846, 2870575, 4179921, 3999181, 2766387, 5361256, 2020385, 3936778, 3110820, 6843107, 541994, 6960644, 475677, 4049315, 1303632, 2209309, 8237298, 6784317, 2912388, 3576854, 5166596, 3875597, 7668509, 7551469, 5188298, 3340684, 3365695, 2934298, 5669260, 408513, 497445, 7710719, 2799603, 2127868, 2633101, 4208433, 2653519, 6011240, 3210626, 4527122, 2769037, 846747, 6850903, 6695043, 4534988, 4376037, 5658002, 4321125, 3444444, 7785273, 4819806, 3518442, 7660022, 1360830, 6388208, 3071767, 5747428, 6500875, 3906812, 5681769, 6368480, 7412897], +[1091497, 5888885, 5945547, 2880565, 1447085, 2690723, 108740, 983805, 1260361, 8032161, 2936029, 1785380, 6112095, 1994872, 79532, 3077177, 2964652, 5359618, 5359651, 2986548, 4032941, 59371, 3803946, 6243804, 8142756, 266347, 7430749, 4628145, 3684061, 7568280, 1727752, 3293707, 1176920, 1416086, 381956, 759510, 4638303, 307382, 7466831, 6420465, 3868486, 7212259, 3336735, 7785055, 3392653, 3319832, 1452478, 2634977, 6248949, 5163732, 1080444, 6039360, 5314580, 4252618, 5750481, 5223530, 1176312, 2877927, 914338, 24183, 7982210, 6586021, 8312315, 185610, 7660912, 6901543, 3734474, 108177, 1389719, 7074642, 6539600, 1569442, 1114271, 171575, 7945294, 742430, 3785546, 2458678, 4479547, 1723972, 8097353, 3521327, 2485040, 6424723, 2779848, 3405193, 813098, 2950085, 7206715, 6422772, 5244855, 6466051, 5512150, 6091835, 6251868, 997002, 5051077, 129099, 3966085, 6322269, 7136957, 1861223, 7216215, 7934179, 5763921, 2505075, 5045266, 541109, 8253516, 7957826, 5174331, 6109912, 5522359, 430725, 4348935, 7848288, 847964, 7579877, 1186688, 2795794, 8203186, 3717882, 273977, 6806558, 1931939, 5339534, 6657207, 2097390, 7787353, 2211503, 4033233, 3829874, 498898, 284839, 6528472, 5444690, 1190447, 6514354, 4106148, 1195303, 8323366, 8157369, 6721871, 3185748, 2359412, 479260, 6776310, 1504006, 3397140, 6280421, 5448049, 6321251, 4294833, 760819, 5665060, 5666810, 2139339, 593614, 3365896, 4223012, 706215, 5614132, 1015453, 5208741, 7125391, 2500415, 2190623, 7241064, 6774419, 985451, 2693600, 2585293, 3912648, 2763566, 4452648, 6897261, 2851520, 5564469, 6063664, 342509, 535117, 7457880, 610637, 2289616, 7072403, 1166571, 597267, 4342576, 6433689, 2053020, 4854467, 7122474, 3236606, 2852219, 1411019, 1067602, 4034975, 3307185, 6987468, 8188574, 2536672, 8317394, 3481082, 418944, 3168953, 6826194, 3305744, 8156918, 2727679, 5319840, 6903436, 99739, 5492437, 688023, 2023161, 5058813, 6477746, 6265546, 4248552, 3361626, 6360121, 3043848, 494761, 434014, 7762789, 6140129, 2452502, 7796445, 5206461, 5601787, 4843562, 5108236, 5611560, 5135291, 49356, 3082726, 222102, 2068422, 2887627, 2451878, 4084165, 5152179, 1751777, 7818436, 6248250, 532717, 688194, 3898514, 7879288, 6366190, 3584176, 7651835, 4213487, 1989911, 5042449, 4539840]], +[[7811034, 4101752, 4245472, 6073675, 1840404, 6250945, 1555058, 2120393, 1371489, 1671518, 4281717, 3309207, 6016120, 2526947, 2597507, 3488163, 1473549, 3896396, 7464922, 5062365, 720334, 2654250, 2806963, 2343272, 7959183, 5625930, 4238586, 2828879, 3218093, 8275971, 255241, 95652, 7358277, 2955752, 6588258, 5436651, 4310701, 4115484, 3997590, 1681180, 6377377, 4984026, 7728084, 1124172, 5151515, 7392587, 7212320, 1988786, 1469334, 6576597, 7671570, 2457976, 2032623, 7915765, 25792, 1993849, 5812670, 4145655, 7681746, 5613768, 5907693, 4310916, 2356521, 4579667, 5528002, 1081873, 3731128, 6821365, 5640258, 6908964, 6689436, 6691586, 1960130, 7978197, 1361321, 2204205, 4792675, 6751253, 6224912, 2714525, 7157068, 7773271, 3449774, 3704355, 1948548, 7333442, 4142247, 7190427, 2644876, 5893841, 4040484, 6436308, 6162570, 4586169, 1124328, 8122457, 7688341, 2198877, 3049460, 7538209, 7955893, 6706569, 3936421, 1182256, 1275366, 7542693, 8240356, 6695277, 8349688, 3857760, 48323, 3991311, 6045712, 1178717, 5180071, 4071305, 7031633, 3814811, 1042233, 3301709, 7651908, 2429255, 1194267, 6145474, 7142062, 168019, 2603243, 1929145, 712081, 8342879, 5792855, 6278775, 2615169, 7076719, 4476696, 4287465, 3661903, 5285781, 7800841, 7584498, 4088201, 1348969, 5369736, 2441916, 948390, 1353929, 7715351, 3431405, 3430793, 7588591, 619170, 1658274, 6969721, 4132746, 911100, 129925, 4738018, 4278712, 5533966, 6258744, 1520978, 6743151, 6468528, 5029792, 4775056, 5178178, 1137833, 8128756, 3935124, 1658609, 4297552, 302874, 5179623, 5821844, 251791, 2181799, 5885328, 4114299, 7910280, 2640821, 2630708, 5646095, 1572538, 6120953, 3006955, 2127227, 4920357, 1404365, 4804281, 5524336, 7553822, 7094073, 5635183, 3997367, 931747, 5483244, 4680653, 4228086, 8236395, 118522, 7617447, 7319084, 2974225, 1215473, 3555039, 6662272, 7110713, 5436233, 3979616, 6272857, 2003140, 1237529, 7266963, 5765861, 785352, 7206448, 8224950, 5224884, 3735985, 4149803, 2557395, 5401731, 797413, 944538, 691439, 7879378, 4427982, 1758520, 5266671, 2666997, 4760746, 4165771, 6017287, 2755530, 2999992, 642462, 1354184, 4126885, 7111344, 3700, 5555924, 6694733, 6452652, 1535625, 4307722, 3570299, 4056305, 7861196, 322078, 158368, 5079383, 3448260, 1313471, 6011413, 2035183, 6251261], +[1256704, 1488355, 7581873, 7558212, 7859489, 7092691, 7575430, 4205350, 1319598, 1739683, 623414, 6513847, 4614254, 5691051, 3896457, 3201893, 5354838, 1747765, 6887182, 5075088, 6633310, 674619, 5762972, 3983920, 7317707, 1288197, 2318301, 7236862, 1999326, 605736, 4887038, 1937153, 3701597, 926606, 4575448, 5383892, 2688188, 4901594, 4137514, 3877928, 5436773, 2536088, 4110745, 57030, 7657193, 6898520, 5187922, 7337738, 4067762, 5516933, 1579484, 3933838, 5110111, 959253, 8009430, 388313, 2920587, 449655, 6870454, 7317543, 7938387, 5961729, 6016667, 869106, 77445, 7966818, 595236, 7006559, 1386164, 296446, 5173226, 2273891, 5119728, 5299221, 2329867, 3571905, 1341274, 6108746, 3521510, 7151103, 6333391, 7746300, 690008, 2058189, 1538670, 518253, 2864732, 6847196, 436780, 781503, 7820175, 3555789, 2895884, 4329272, 4007871, 387699, 2146874, 4880718, 4813518, 169614, 2416606, 4371208, 1581503, 5450949, 7338913, 2413508, 974281, 6182988, 2007399, 2378714, 5566680, 2332982, 284428, 4079364, 2479613, 412453, 2958177, 2323915, 3073554, 6925681, 2838387, 7256803, 7963195, 5427935, 5753546, 1897883, 2599545, 1047633, 4656600, 1308018, 6616741, 1785945, 6386465, 5871322, 2717040, 1840926, 7406815, 4247873, 3539674, 4505060, 6457339, 2309193, 568925, 3979458, 690765, 7486625, 104640, 1028101, 7581807, 4692806, 7417001, 1989144, 979611, 4032945, 7204189, 5262250, 3927790, 599505, 6301276, 824057, 5381724, 2081592, 3943831, 1363517, 6158597, 4940388, 80763, 4144015, 292403, 936608, 78183, 5200365, 5380622, 6275487, 7205203, 7792195, 7862887, 5956808, 6917451, 3837513, 2652991, 6788080, 4547298, 6258780, 3013551, 1909177, 2751272, 8069917, 8350637, 6115312, 6420050, 1859334, 1134198, 477566, 5139461, 5246866, 6997939, 8226041, 2729740, 7422743, 2194665, 6475007, 8047526, 4429272, 6910083, 3942719, 6830983, 5712321, 3380462, 4901570, 4242386, 5844186, 1716794, 2789389, 4481338, 3741804, 751713, 72888, 2380303, 3100852, 1052470, 4755402, 7379879, 137045, 3045108, 1350904, 4366777, 5732703, 261014, 6270944, 7390063, 4739261, 3026858, 841503, 2073893, 5688322, 3191351, 3636487, 7246195, 7470765, 6000780, 809318, 5205086, 3461811, 3761188, 4553585, 1289828, 6146932, 7809159, 6804052, 7695660, 2315687, 4127215, 1115226, 6150121, 5731701], +[109922, 4185020, 646071, 4045549, 7361432, 7699670, 2954929, 5255748, 3714642, 6832145, 8037086, 8211787, 3834552, 7989652, 6418615, 3353711, 3600625, 2807706, 3532517, 7351418, 7076621, 7762202, 8151520, 2144508, 4589692, 4743880, 3194433, 680377, 2458095, 1483222, 8284513, 693750, 3318666, 5831973, 4370188, 145627, 4375869, 8144341, 2213926, 592792, 7681198, 7023921, 6950836, 7102755, 2199059, 8006675, 6526003, 6399429, 4991621, 3425378, 3868271, 7347478, 2631896, 6315997, 7252311, 3819053, 5724728, 3597198, 5190987, 4203206, 8215746, 2536959, 1303784, 6765998, 3614651, 2662547, 3633239, 7718348, 4512462, 497572, 2961067, 1090436, 6431850, 6685021, 4475041, 5640488, 6397796, 7208426, 2192549, 1406456, 6105572, 6592591, 6848068, 3269128, 7029944, 7391674, 2306085, 4668390, 7384417, 4973328, 6802039, 7503461, 6366739, 3548138, 520290, 2728819, 7686180, 848848, 4634200, 6976636, 2698139, 1500942, 531637, 1365438, 7378624, 2832560, 1547201, 3607022, 5182797, 1274524, 1120935, 4537781, 7285878, 7815823, 5448805, 3115927, 717397, 1342678, 8165940, 7751375, 6165536, 7606850, 8175106, 4819176, 2616014, 7209646, 6324214, 2618433, 590915, 3205647, 6405045, 5355917, 196609, 6788593, 5193005, 2954403, 7698605, 2330814, 2758946, 3834615, 2724704, 1919839, 6181472, 645634, 3209922, 5732551, 7457721, 4206286, 268221, 2018033, 5536207, 6243472, 4728415, 596017, 6162972, 2917444, 686065, 7448051, 7188144, 3698257, 6687114, 7277146, 2524804, 1089670, 5061967, 3331757, 2496812, 6140951, 3507352, 4342099, 8139096, 6780893, 4723825, 4489752, 622398, 259375, 7725254, 8087603, 3364148, 2642604, 4571747, 3475495, 8237459, 2653030, 3877743, 2267222, 2376385, 387997, 7879722, 6818908, 2888989, 2068812, 951382, 5258253, 3002237, 4330703, 2166667, 6671132, 6254560, 656374, 3715709, 4866989, 2312321, 2182911, 1999505, 763684, 7615860, 5723638, 2153463, 7622031, 4255488, 8341721, 3141229, 211020, 4644884, 6258259, 8092958, 7053192, 3382074, 748840, 4580928, 2958149, 6435024, 4649496, 7847275, 1158032, 6255740, 4134874, 5882852, 19161, 3701972, 7237434, 5767498, 389894, 2626734, 6917378, 8331028, 4312429, 1642940, 4871803, 2684100, 4110681, 6904038, 4254741, 454595, 7622610, 5514822, 6565493, 639234, 2697405, 8332752, 2268418, 1165456, 3930460, 4035883, 5306127], +[4483816, 3379592, 1203546, 2692844, 3427347, 3560702, 327826, 7632973, 8024956, 4331491, 6748621, 1459765, 2904956, 1951615, 4513228, 6971204, 5846516, 6030800, 3877016, 6434794, 2339897, 5552229, 4219454, 5405387, 3114314, 2225157, 396615, 92872, 1079978, 6884247, 1168789, 3510860, 1717039, 6275755, 2663979, 660714, 7922203, 3546608, 1205723, 4966453, 5866114, 5571988, 7879994, 7043226, 3062032, 3622844, 2092782, 2942763, 4795751, 4904374, 7744555, 1725917, 5860205, 475395, 1034126, 5066202, 4405744, 7050318, 530491, 8359120, 3358424, 1717516, 690729, 4676559, 1094250, 1695506, 4465868, 4740971, 2239327, 4966152, 4689145, 3284467, 1580817, 852538, 3741767, 6451186, 3778806, 6159023, 214477, 1237453, 3995042, 5226216, 4053200, 6275128, 6391361, 1609377, 3137151, 6800822, 1902869, 411819, 331183, 7567583, 3515536, 3968800, 3586825, 6690600, 2997817, 7192003, 7456641, 2132739, 2180485, 4079933, 1988700, 1026873, 3874858, 370845, 201437, 635322, 5198928, 3008997, 6276376, 5390774, 274788, 1442311, 839132, 4746707, 2263155, 8024317, 2668925, 4276631, 3075967, 7655496, 2396561, 1006296, 480569, 2741029, 6989234, 1040298, 2787738, 2908218, 7805540, 6996655, 430918, 4700629, 3018146, 6141364, 4086145, 8341757, 3506329, 6410534, 2202976, 88672, 7219552, 5657181, 7868798, 6668100, 8293960, 6093194, 5781844, 1915347, 2855028, 518222, 4840426, 6328358, 4896957, 2068139, 3181328, 2680058, 6603632, 4317271, 1837761, 6639253, 2201105, 2625448, 5508122, 5367425, 1595870, 7476458, 8106677, 5948865, 4695503, 7802511, 2242096, 7632432, 345069, 817086, 5464529, 4361594, 2017789, 5126058, 3597053, 7863302, 7637726, 8357340, 6803380, 6282652, 3199666, 7418499, 7010635, 7938770, 6626909, 2009459, 3142533, 5305210, 4370962, 1720330, 1495234, 4844605, 8096759, 7718297, 2066004, 1708289, 3218672, 4579767, 3994046, 4948983, 5809873, 1814558, 8140746, 4034502, 2227392, 6289371, 3407837, 2303869, 4896085, 3215749, 5993081, 4652499, 6402551, 3507036, 4284634, 2779926, 5053256, 4700734, 4624439, 5819197, 7579824, 6497464, 8301976, 759075, 6134726, 6616248, 2925808, 1628154, 5139381, 4649740, 2611764, 45664, 2438990, 1116980, 3415587, 4806248, 7230362, 3984018, 268676, 2174811, 4506765, 7764197, 3315762, 2609243, 5712324, 3243764, 2883906, 3038378, 2058201, 5999244], +[8051145, 5145816, 1776929, 1565352, 3826835, 255606, 7531483, 5409777, 78830, 80006, 5094255, 6403281, 6227379, 7122081, 4312321, 7267994, 6284531, 5630679, 1535142, 5621959, 6872447, 2949585, 6621261, 380618, 4972084, 536535, 8250887, 6369664, 6306588, 2816537, 3802017, 8282333, 5606907, 8254701, 2463360, 203279, 3885991, 6000707, 1186711, 3653237, 6599927, 4155527, 2283701, 6112953, 144165, 2849003, 3131070, 5774682, 7944174, 913848, 6412105, 2067794, 1806582, 3181323, 2808803, 1483852, 7356835, 1701030, 76715, 4976722, 1946731, 5556745, 735141, 2472958, 3034498, 5964770, 6461590, 3663453, 3579686, 7806684, 431355, 7447767, 1639772, 3948854, 3579701, 5996845, 4835117, 3761968, 1114643, 7803303, 5558087, 6130280, 6837251, 3240831, 2661974, 7265694, 6123, 7130221, 4047124, 2737230, 7687334, 3565149, 6329857, 2127526, 1939858, 2246148, 5026402, 1366582, 4408979, 5044312, 3056539, 7647688, 5601482, 3945656, 782895, 2563355, 4084915, 7886949, 1663457, 792218, 116788, 2650204, 6220050, 4767858, 2135096, 4383604, 6068199, 6980386, 8100125, 3717870, 1751799, 1169428, 6601735, 346037, 7721802, 6474309, 5035155, 7207522, 3305271, 2411038, 4694592, 4948476, 7531435, 4968575, 3436510, 665667, 7184482, 7646505, 4231544, 3857385, 3948538, 6813903, 7841245, 2820874, 2097148, 6662407, 3014948, 1351909, 7298755, 172484, 5062326, 7124626, 7917513, 4738864, 6039188, 2000501, 589729, 2022173, 5710600, 3707244, 5385622, 4067453, 5891045, 4453487, 5495426, 2090686, 7100792, 540553, 7258372, 4744151, 6477215, 4359700, 7198626, 5126790, 7102482, 6021695, 5631416, 2110081, 5606040, 7127673, 2732845, 1269337, 5385847, 6071973, 1648112, 4012618, 2554936, 7453012, 5869976, 5190781, 4984310, 8269436, 1053969, 6646070, 5448377, 1068431, 2780819, 2889768, 527531, 7713764, 1639612, 6918726, 4056204, 3420246, 3370180, 5077292, 1850388, 3456363, 3324234, 3869511, 6983293, 3264994, 6952813, 6629000, 1530196, 1269398, 2145320, 7586100, 9091, 5363502, 3434928, 1088026, 7444489, 884347, 7474044, 4081981, 2761150, 7607852, 5437025, 5566456, 4311956, 4521115, 4108533, 5923142, 6105850, 191156, 2785562, 5087888, 1896068, 4129716, 750810, 4120008, 6890438, 4691909, 2069278, 578527, 5023581, 2123017, 2309955, 5129166, 5187886, 4325504, 3130060, 2110730, 6731086, 6879866], +[1630276, 523180, 2797640, 2762571, 75733, 4223242, 6272299, 6599994, 3270576, 8299462, 2868060, 7091997, 1433287, 5825090, 6838783, 2199558, 3354990, 7115668, 4667311, 1661288, 400830, 18133, 5073934, 662345, 6174430, 5559616, 1296802, 6195848, 2709860, 4645106, 6870301, 6480242, 1783682, 5878939, 4848048, 6383603, 7796085, 3362918, 2320705, 7477367, 3790148, 2166149, 5184348, 3493576, 6660923, 8155232, 1437872, 1124258, 8037137, 3556598, 3888628, 3677225, 4839596, 880652, 5139752, 477012, 7226642, 2780778, 4436703, 6316265, 5409256, 206849, 3267902, 7318947, 4974291, 6870905, 6153128, 1679853, 3948769, 5540510, 6962514, 4275622, 4985516, 4799772, 1835328, 5465327, 2145165, 877519, 8254963, 2690654, 1903699, 4717278, 1455748, 1920264, 4614067, 2737606, 3001127, 1968039, 5874809, 5861629, 2233521, 3884365, 5162206, 3018088, 5278649, 8062625, 4241874, 7589272, 1096604, 7300491, 4527378, 1273497, 1433633, 7723238, 248133, 5997038, 5111139, 576518, 2608269, 582230, 4158483, 5220008, 1660209, 3555975, 2059227, 3055112, 1145482, 3179263, 3903974, 5007914, 1560801, 120909, 7016349, 5390387, 2466294, 4745506, 4701950, 4615508, 6395300, 4771558, 3646858, 2905980, 2936907, 222613, 2290260, 6649832, 2487272, 7606870, 3226133, 6286485, 752564, 5291910, 1717460, 7766798, 4391771, 7204765, 3937422, 6590678, 5714907, 755546, 5551649, 2544917, 3436186, 6901681, 1758541, 5006312, 5649748, 4660045, 4382653, 869434, 5972359, 5392261, 2784078, 6677345, 987288, 3999373, 6220372, 5220792, 7936016, 6864280, 6043212, 8139255, 3321310, 6230630, 6681532, 293740, 5880645, 1003359, 5025143, 1166524, 7521743, 1243824, 3397665, 7374145, 6787561, 6778317, 6162283, 2699401, 483819, 6707997, 2302692, 999784, 3257905, 2346885, 2655946, 2558008, 5397536, 4643384, 3325909, 7231049, 2569893, 5578458, 2336952, 3650104, 5078456, 4588238, 535103, 1428479, 5267909, 7110638, 648978, 3753595, 6739991, 3454160, 2467079, 4844239, 1259945, 2457759, 4223943, 6631487, 8356361, 1579483, 5126787, 2826789, 4443343, 601641, 2864994, 3274408, 2627862, 5822624, 7146096, 4050572, 3903430, 194490, 5498980, 5022682, 4621536, 2840691, 195461, 4834166, 6786792, 4525861, 565141, 1540056, 701331, 5619166, 6085163, 1491014, 7828941, 4586411, 3526621, 7966877, 515244, 5826290, 5540034, 1605806], +[751530, 5905843, 3672147, 4127071, 6938257, 7569913, 5720039, 5698380, 1076489, 6078155, 6140224, 976796, 4359689, 1431756, 2263584, 4458374, 5660321, 7100983, 5830682, 5039840, 3545504, 5360258, 5548835, 1822537, 894864, 1328328, 5334186, 8126709, 5662139, 6165209, 3552847, 6794949, 1284556, 646401, 1957098, 7612063, 2075893, 6426311, 7418949, 8250033, 5534641, 4933989, 836951, 4254844, 451369, 8213836, 6666052, 6881094, 6017598, 2906435, 7140232, 658296, 5831168, 2715854, 5569452, 4864739, 4223620, 5446283, 1444386, 4750472, 6430572, 5678195, 3742508, 1773619, 2419742, 6328743, 3495481, 5498585, 1168765, 7778401, 7783292, 2585518, 189877, 1519462, 2278452, 4308869, 1603426, 5967464, 6474730, 2177500, 2324828, 8014510, 3370896, 5440640, 4081174, 3287298, 76333, 7801033, 3380507, 5616079, 6779437, 6196679, 5020492, 5202345, 3224340, 6431670, 7397932, 5909088, 5461769, 779990, 4839690, 1857373, 3623298, 1369497, 1460706, 2943193, 5202106, 3483202, 4095858, 7951836, 1072067, 5593151, 6579328, 4484671, 3564098, 4039949, 406144, 5514184, 8237154, 2186454, 7515983, 898844, 1743549, 2529736, 5644280, 5375228, 2476243, 7091064, 3297269, 4770674, 6979279, 7559932, 2012394, 313989, 1485807, 1157859, 6874030, 173990, 5380925, 1777874, 2068217, 1978150, 1057131, 8134735, 3336236, 7358905, 1466324, 2290795, 8178763, 7489415, 1173640, 8268809, 6066941, 5011141, 6448773, 3367821, 4318769, 5476441, 543744, 313760, 5879783, 5781450, 4946107, 4357621, 1353832, 2580726, 5125600, 7950855, 8054853, 1423231, 6145445, 7360399, 8128706, 6444457, 1155444, 2560997, 7923929, 2347011, 6296431, 7347275, 2881346, 7477119, 3896982, 6639865, 536591, 3703725, 727079, 3641942, 2649035, 6752022, 6416050, 3646962, 3474762, 6224146, 7292612, 4317752, 6631707, 626905, 3832919, 1455118, 3531308, 1241716, 3039723, 2637620, 2201581, 3870412, 718136, 4144478, 2188112, 4102630, 4473449, 4332451, 4299788, 434455, 5464736, 2349781, 4800943, 4828454, 7697639, 1199874, 7104871, 5215017, 2710162, 372782, 1837242, 8097956, 7683642, 3840989, 7886703, 4614107, 1663442, 5735352, 6620824, 8158491, 3557378, 3695912, 7026647, 3973571, 7707159, 7523748, 7017564, 8230503, 2903301, 1683179, 2722733, 5797940, 4694416, 5042813, 720723, 4461916, 947782, 1117287, 6737929, 3069419, 7988813, 6706592]], +[[6065439, 8098530, 5023810, 3381156, 6754733, 8094528, 2177707, 3111036, 7726676, 629546, 484643, 3088074, 8083517, 3432654, 5947760, 7464840, 2809352, 1293705, 2161515, 5167235, 7588976, 5272972, 2507932, 4740874, 6713670, 2677670, 5944836, 6280256, 3504771, 5665806, 4261247, 5346554, 6855031, 2342557, 5386712, 374061, 5834168, 4738021, 924002, 1651429, 2817473, 3775056, 8191761, 3019257, 4873383, 6864721, 6005610, 1554003, 890595, 5017759, 129837, 1797130, 6927116, 7222023, 5456406, 2989326, 5239270, 4960563, 2804667, 5558044, 8248954, 7231731, 6851615, 2736490, 4381530, 1851355, 7327469, 2633801, 1188268, 6666886, 6009233, 7138474, 5855102, 6936599, 2208617, 7506787, 6935467, 3083477, 268341, 5051249, 685554, 1631620, 5502636, 5703894, 476211, 841551, 5578983, 5496622, 267959, 5083084, 1086771, 1813620, 1877396, 3046376, 3953948, 2812225, 1752363, 6287571, 2783914, 6861632, 907280, 1692098, 712059, 5579485, 4443683, 8225659, 8094792, 6219611, 3934896, 3058583, 682062, 4094924, 4572655, 4595098, 348239, 8194569, 7069956, 1158279, 4203848, 8159248, 7301504, 1376237, 3003634, 3139321, 3393982, 7678646, 5361024, 5600871, 5115313, 6164519, 5052485, 2125740, 187821, 7855321, 6141126, 6321742, 6663527, 3085067, 7177000, 1123310, 3035694, 1060155, 7565014, 5349429, 1442616, 807345, 5422688, 1909112, 4792902, 8077562, 8068234, 3876796, 3664755, 7997599, 7742808, 1596915, 6646805, 7029787, 6356840, 4550401, 1342566, 7172620, 1281840, 3033542, 1221120, 642163, 3649099, 8000533, 3943967, 7447439, 4935652, 5839684, 4628894, 1927890, 4487704, 2170724, 5682155, 178968, 4409051, 5818012, 8198602, 3963301, 5548696, 3533619, 1479720, 7758344, 7216034, 6520999, 5008243, 426108, 7910967, 1519116, 6430637, 7696642, 3230976, 5997069, 5676833, 3780721, 3757373, 4468243, 4757017, 7609122, 4958938, 4423267, 1159821, 4754098, 1880200, 3249813, 4596375, 3205560, 1475629, 892832, 2266101, 1369551, 5856215, 5169258, 808305, 8135676, 1723528, 8242694, 7000718, 5239617, 1439637, 3866441, 1672738, 1640374, 3451118, 3979491, 2727658, 3960102, 6885664, 5084531, 3139692, 2309980, 6745314, 3779889, 4473594, 787503, 962662, 7848557, 5524131, 5105164, 1112207, 129779, 7662914, 6864707, 1046269, 3598044, 7924894, 4919929, 5504571, 7644181, 6175045, 8347723, 6810483, 2845860], +[4007120, 5423943, 4306969, 4494957, 2761168, 800537, 6538318, 897473, 5377893, 2096060, 1890988, 3770397, 2216755, 4691747, 7702645, 6363843, 2625662, 7527301, 1503125, 5164199, 5842069, 2036053, 1992862, 5119892, 841022, 8308219, 5278310, 4113988, 3996346, 7495801, 2924478, 6829166, 3053315, 6290721, 3999812, 2369223, 1006380, 648489, 3345382, 2843439, 1332072, 3127630, 6085969, 1168473, 3281009, 1579820, 4532577, 3911106, 5704565, 4311750, 4973522, 7249092, 2690177, 6076057, 7146221, 6810693, 7229874, 4067772, 7589685, 5523885, 2285367, 7505433, 3337642, 2997313, 8242998, 5172400, 917219, 3211637, 8024970, 1373899, 6398327, 8334626, 2376275, 1040964, 6855672, 2097302, 19747, 1290176, 102349, 5686201, 7291506, 5016938, 6334176, 4196839, 1014297, 1042425, 3899853, 4340175, 5817727, 1299889, 1520217, 7379288, 3902502, 6287771, 3292794, 4996075, 6704117, 3732567, 5266808, 4248435, 7865397, 4312725, 1846977, 4708806, 5750892, 2099692, 8244241, 3643726, 881312, 465703, 7355745, 6934849, 4731372, 6529701, 7866754, 2146466, 4752091, 1196952, 3864527, 3888854, 6318296, 4503032, 989019, 988975, 7964009, 6765922, 6670523, 6000973, 7367533, 3028000, 380308, 7263464, 1053469, 904372, 2771224, 7045432, 841953, 8283212, 543359, 7116833, 7788957, 3377047, 1410397, 6638640, 5930780, 2848485, 805857, 1406190, 2988106, 5204346, 3666932, 7926941, 2488280, 4985040, 2865110, 3035363, 1497202, 2817796, 1993263, 1590887, 1844254, 7001652, 4194258, 6393088, 8003079, 3852112, 1727679, 3541710, 7503319, 7555829, 4955325, 2643206, 1369803, 6691658, 4943062, 3026882, 1142921, 7661220, 1678271, 3149574, 8167950, 7623039, 4896419, 6722398, 2939096, 5729350, 3568411, 1422175, 4604617, 784613, 6608734, 4650598, 5974213, 2397461, 5545194, 5198203, 2996451, 4597343, 4153035, 6772858, 2639233, 6847483, 2664030, 8190252, 6634332, 7274845, 4795777, 5385361, 5996962, 1739905, 8319401, 6223355, 3877982, 6956879, 2427708, 6002480, 5433573, 6775158, 5207754, 7121567, 6044217, 7430943, 3353263, 5479123, 2057020, 3965090, 5103532, 9620, 7894203, 195375, 3553067, 4562964, 3521892, 2639695, 7326355, 7694597, 4188489, 4077371, 3229382, 3455191, 2777309, 1065956, 4343354, 2983455, 7148309, 4548468, 3024992, 2040118, 7211470, 1920227, 7706345, 1668559, 3029285, 4463782, 3510335, 6700969], +[6323841, 5209833, 5157296, 466039, 2749828, 6970345, 1962517, 7353185, 3694630, 3683167, 5208263, 4427881, 5780948, 5375250, 5100008, 7179708, 5070481, 3838328, 4793520, 226234, 3680194, 7823751, 4272524, 2530644, 3256965, 7689738, 2369891, 6122504, 4686244, 3569148, 8317704, 7020426, 4220274, 887330, 692608, 5378003, 8285122, 134049, 2624513, 1868211, 987881, 665778, 1815333, 5586872, 2203713, 3377406, 3404010, 7127424, 8022483, 2303055, 954376, 7697690, 6403982, 986782, 104867, 2254228, 8306009, 4319806, 6171726, 4755601, 2243642, 5767709, 2867879, 7167377, 7719897, 7484176, 1566245, 3924729, 3445057, 5308767, 4588273, 2681809, 4248141, 7167510, 860789, 828580, 5868201, 4841612, 5615046, 2241199, 68068, 2089044, 2264942, 663786, 3776796, 7030236, 7492646, 1268409, 5505005, 4935375, 1030628, 4907225, 3986279, 7918597, 264305, 2122525, 2107495, 1543964, 7223646, 2459152, 4141351, 4836274, 435860, 1306531, 4277859, 6035603, 5067301, 624480, 2331879, 4749864, 6551227, 3908396, 3851233, 919087, 6562890, 3314476, 3067031, 6914429, 5470171, 6572362, 5474978, 3727388, 6693137, 1506493, 1633673, 787017, 591648, 2557564, 2570816, 6445452, 2016023, 5199010, 8051130, 3678378, 1172422, 6755164, 1114389, 3000723, 8190855, 1841795, 1330841, 4639722, 1099629, 7637507, 2118361, 928782, 6790090, 8362917, 3103942, 2233548, 374401, 2849666, 3590394, 6351470, 8073256, 752145, 7439588, 3757919, 7696535, 5786268, 4201353, 3897052, 275547, 2911786, 6912150, 8197144, 3021691, 279320, 7192665, 1805177, 8140386, 5870875, 2156492, 4339064, 8123514, 5483203, 2694781, 6821387, 793256, 3383296, 8000491, 5694434, 2650030, 4527299, 2052913, 7457517, 7866862, 5867514, 7431849, 7973790, 3977604, 6589365, 4253888, 1628453, 1537005, 7135886, 6545013, 3739472, 4760670, 2483672, 7276474, 2652710, 76150, 964432, 1590418, 7444807, 6778848, 3767619, 4630593, 9830, 1803185, 4072069, 6194467, 1422413, 5033131, 682879, 4652767, 2402001, 7809203, 208637, 8375957, 8070047, 2260867, 1706434, 2610320, 3542000, 3597433, 2890298, 6751982, 5330380, 779100, 1675140, 1353843, 3088832, 2629579, 6467217, 7778088, 564663, 5091190, 4345288, 2792860, 7793481, 6583310, 6796384, 39045, 7562747, 5550914, 4199782, 1017567, 6255493, 4139212, 8219736, 7585519, 7835405, 6977604, 7231492], +[8154847, 7566155, 6146913, 2462188, 5971340, 1798655, 6204442, 7607641, 3936291, 1606870, 7125553, 73749, 2568183, 5390254, 7182909, 4042384, 2765143, 6809397, 4729520, 4658091, 1692613, 4815224, 857808, 1850571, 4415706, 5828583, 1510374, 4333325, 840381, 4465684, 6648950, 7710895, 6094197, 1167586, 2150385, 868522, 8090466, 3543213, 6862447, 5414557, 6745364, 7873095, 7615115, 7248369, 5926609, 3836333, 6017410, 7145166, 3554046, 2304324, 1386528, 3258835, 4181051, 963172, 5627171, 7476731, 4313342, 4743085, 4092880, 661108, 4592973, 3021186, 6417065, 5896927, 6197897, 4550478, 6995515, 3522238, 1082938, 1235805, 7622564, 6515645, 2822702, 2913189, 2553916, 306480, 2596679, 3147894, 2003502, 5242706, 2518437, 5697984, 8258205, 6636021, 259943, 6890034, 7901191, 4552161, 6291357, 3503629, 2759818, 1969485, 3098650, 4051220, 5117605, 8225404, 4357592, 6705720, 8105378, 8250338, 3223284, 1310449, 492274, 2307000, 3961233, 7363485, 5577650, 8068442, 6695612, 3403410, 6060904, 1628342, 2009841, 7466363, 913053, 5191025, 489039, 6433274, 6416666, 7516965, 1234497, 866504, 537164, 6815340, 7380410, 2381525, 3432042, 5257016, 5940752, 6773508, 4181364, 804323, 4917649, 7679849, 2532945, 1833247, 6750930, 741532, 5705471, 594678, 8020641, 6827685, 2622621, 7709457, 2623542, 7924848, 1291259, 3755298, 1469448, 7537353, 6065121, 4824131, 1883842, 2475181, 1898269, 4502642, 2190114, 6648633, 3894977, 3072148, 970904, 231839, 3682422, 3654869, 1513149, 4386838, 7302344, 683068, 1458725, 5573891, 5293368, 6804543, 1242510, 2198628, 3617190, 3267290, 7987379, 6459326, 1908387, 6613312, 2029049, 6191882, 3892387, 3698734, 6964746, 3397539, 5716224, 6282650, 5956617, 2023007, 3861456, 2267203, 1979851, 6934881, 5854970, 3931281, 392332, 1392461, 4171168, 4721159, 6239800, 7787564, 1248320, 744301, 7498446, 2866748, 5909376, 5807494, 1193609, 965605, 3452681, 2631568, 2666659, 2645873, 960192, 810012, 3076060, 3026031, 7542342, 5816586, 708606, 4670334, 238456, 3303528, 125255, 3843602, 2607509, 966211, 2899406, 4887532, 7242203, 1821906, 992231, 1025328, 4068852, 4791641, 4188290, 2755045, 573124, 1751171, 2643011, 5419168, 3374866, 5916663, 1220910, 7534329, 2150395, 3468485, 3439803, 4644089, 7920444, 3154676, 8168607, 4522101, 6287873, 5750589], +[3012424, 4406492, 2546740, 5034037, 7784928, 8376615, 4586774, 4380561, 6402916, 8140939, 6443466, 3744222, 7553967, 7410966, 2482042, 6520029, 3303186, 1286771, 2292328, 3841531, 1636778, 4411532, 5693288, 1363128, 1736141, 3222265, 8005379, 1699184, 1257265, 8043985, 8082978, 2026893, 4852547, 3005247, 1525389, 1668353, 3874912, 6022074, 3273505, 654468, 642093, 2223334, 7502337, 5380851, 657264, 4037865, 7251145, 4212111, 6679634, 1943579, 6078682, 401147, 6533959, 4141494, 7135384, 5400916, 1652938, 3389236, 3727774, 6267994, 7519709, 4834477, 553194, 4007619, 5609838, 1786393, 1638799, 5160205, 8061976, 5625006, 4825203, 1419534, 2702679, 4650093, 7300915, 4485580, 4388954, 6367834, 3923510, 6017306, 3426495, 8009268, 7308311, 2499285, 790514, 6808118, 608123, 6295758, 6423865, 4759630, 3917677, 3419702, 7178834, 823783, 1485586, 5935385, 487631, 840516, 6722655, 2117490, 6275340, 6191135, 4893139, 4155211, 5333992, 1103425, 16580, 2547910, 4129018, 2986445, 5482707, 6868553, 4824018, 7833849, 7028073, 8252119, 7757600, 1261160, 7964682, 6386172, 5694990, 6535857, 3284294, 1570198, 2622184, 1429615, 6670897, 7364735, 4015211, 731626, 764562, 216213, 1513319, 8088547, 3053229, 2434054, 1518110, 3132242, 1310597, 6880613, 7369064, 5312815, 7839808, 4085736, 6663264, 3425227, 3688897, 7327407, 4412355, 3322230, 8079276, 4380264, 2845840, 8324985, 5412228, 8049379, 6978279, 2984319, 2931, 3879882, 7421619, 4462199, 6205925, 2307212, 2433541, 734802, 7411708, 739470, 2116407, 1654059, 490509, 5584903, 2741517, 2364361, 2738670, 2975393, 700217, 6075957, 4088927, 5813673, 3436721, 4332931, 5583951, 6551375, 3912310, 2259905, 2350513, 590624, 788849, 250945, 3698979, 7470226, 5796027, 6924870, 1122159, 6904221, 5444170, 6831056, 5300518, 1184024, 3304848, 4173966, 600504, 5244215, 268278, 2338377, 1086791, 4268868, 516080, 2306418, 4563883, 2097104, 3770710, 6574383, 7667401, 5084888, 2591342, 5437156, 2099151, 7804463, 4660469, 5073141, 6907634, 4255955, 5023475, 4058249, 5825964, 8185866, 2927171, 5565488, 97410, 6596410, 7440701, 4199496, 5769811, 7438274, 4671802, 4760803, 1987269, 8044167, 3095292, 5294419, 3640742, 7029844, 4929730, 3660095, 6309054, 6442179, 6520550, 3987381, 5989950, 7984765, 4911458, 4731245, 5836420, 7253460], +[1200975, 8294972, 6178632, 667223, 6306105, 1602816, 7266288, 1198660, 1611996, 1835252, 3104937, 7478491, 119976, 2811530, 1092120, 2344890, 3262023, 781322, 6636599, 5679588, 784842, 8285318, 4904312, 5156472, 1028975, 3590408, 8003281, 7434876, 4024121, 542526, 2123272, 8055066, 4864331, 3628644, 4653774, 1510572, 740902, 1024777, 5377874, 2742709, 956080, 1897066, 5580186, 725884, 791497, 5923539, 7165898, 4891983, 3566451, 1503607, 1230301, 4660205, 6707890, 4534136, 7925405, 3352078, 7415718, 4706861, 7555575, 8178537, 252523, 6739908, 5613889, 3779526, 3558819, 6210177, 3105543, 2795679, 1045114, 7844101, 7717405, 4860246, 4793041, 5995040, 5555415, 4694463, 2600659, 4220265, 2100962, 6636830, 3496220, 6946030, 6747615, 4990114, 7783185, 8017266, 3338364, 6024643, 6525385, 401113, 2128518, 4179736, 735853, 7754507, 232607, 8353222, 5831300, 8107928, 5742849, 1089107, 1150253, 5096851, 377956, 4785616, 3480720, 1957601, 4855281, 6376587, 5810343, 6607052, 4761022, 5139937, 5234553, 5061764, 4958843, 730534, 985272, 5921641, 2114478, 723322, 1020823, 8296367, 2913968, 882051, 6279296, 855590, 1921432, 5731488, 7594353, 6785515, 2181488, 5458463, 8048273, 3979383, 6783908, 6803903, 2872969, 7984094, 2995606, 7659849, 6818495, 4447457, 1150577, 4021049, 8093162, 7616850, 8016521, 1719806, 2512302, 258798, 7380299, 2471186, 3357367, 3535392, 4491835, 4560765, 4017763, 5807016, 6429446, 1117538, 5967637, 7897423, 4662486, 6120042, 5253149, 6542425, 1675433, 5314423, 1856179, 8052899, 979398, 5240186, 3593021, 5408479, 2452698, 6569240, 5750344, 7162286, 1901408, 7610249, 8047499, 878623, 6958425, 2368784, 4640386, 2628599, 5563328, 4184264, 1182730, 1148992, 7530228, 4193800, 1686875, 6526257, 1626523, 2557530, 719981, 4143524, 98280, 5445546, 908860, 7320267, 5614781, 2680102, 4051477, 7656240, 7565619, 4577163, 2241199, 4223826, 5520324, 6266248, 6669455, 5104042, 7979000, 5687279, 5984952, 4341664, 5622583, 4165678, 5034494, 3124982, 6987063, 6611500, 1504848, 6880616, 877733, 5201510, 3786331, 6399382, 5865555, 3183897, 6227623, 1432560, 909739, 5871071, 4236552, 7544582, 1543963, 7372744, 3788089, 6125649, 7908285, 2123918, 3700116, 5922065, 1970857, 6546629, 8153448, 5679421, 662072, 2701253, 6739043, 3667053, 2115351, 4952822], +[1110207, 247437, 6926931, 759266, 179, 2872777, 1627927, 1633244, 6758329, 2523719, 5435926, 868629, 7097254, 3694812, 961799, 3632419, 2482338, 3122158, 3041753, 4798795, 6062680, 4523031, 1221940, 1569028, 6139793, 646517, 4719057, 8047080, 660144, 5017165, 4177372, 3390288, 6900732, 5231594, 3099315, 589575, 1569259, 6932308, 226200, 2528806, 3470878, 4474637, 1100913, 3311646, 5058737, 3494823, 5271311, 4468048, 4262916, 1884375, 1306141, 2847164, 1372685, 6749769, 2369220, 6198477, 4672905, 1137811, 1219967, 4151529, 5411818, 1793961, 2693006, 5257651, 5397635, 5965885, 6101327, 181089, 1512830, 7749924, 2657493, 1916973, 7707444, 1140328, 6155562, 2912351, 226138, 6541107, 6501552, 638964, 5077425, 8290197, 8326432, 2693488, 2527993, 6106005, 3159702, 3379969, 5963216, 636009, 7893901, 8270926, 3597573, 3400254, 833667, 6987033, 7141436, 2726879, 5604107, 1931341, 1532279, 1607073, 2071695, 8278730, 3031706, 8305383, 7033001, 6509108, 1137086, 587822, 3174792, 5748092, 5604087, 5574221, 7815185, 4376829, 2230471, 3470758, 5401246, 1654278, 4725924, 1514222, 6382160, 5113718, 7937878, 1580311, 2879779, 6978018, 1503597, 4234207, 4489347, 3539647, 7964368, 1790915, 5684583, 1349298, 4870522, 5486435, 2746351, 6543101, 2925633, 7387373, 8113499, 4063237, 2754031, 1461855, 7429663, 7618697, 3314698, 7611427, 1636009, 2028195, 6861402, 111020, 1449528, 7229952, 2439655, 681019, 6482518, 6089687, 6352678, 1749691, 537978, 48724, 3888754, 954122, 3014340, 4089798, 6385135, 6495002, 4007464, 1776101, 112874, 6703560, 3936519, 2713100, 5845341, 2950865, 2959950, 7575819, 5894951, 2010816, 1963700, 307910, 1401599, 533523, 2992814, 5172325, 5904526, 6899275, 3739698, 4513442, 4504301, 4274890, 5525610, 6136740, 5711774, 6970910, 6514393, 2405723, 3663240, 2819312, 5610046, 578112, 6318028, 8235168, 2818108, 3189030, 3291646, 4309501, 858403, 539869, 7644290, 5427619, 5191510, 4261061, 1912718, 3888893, 3130066, 4954991, 5716329, 4184973, 7166603, 4897517, 6289440, 4058463, 3569250, 884235, 7776646, 2577166, 5582048, 5034505, 6450335, 8354142, 413939, 5786370, 5755357, 5216239, 5164226, 6001083, 2781595, 7334875, 3783840, 4533314, 5651216, 6990931, 5827191, 602334, 2667688, 6600632, 6019790, 6179058, 6921172, 4377416, 7570949, 423032]], +[[4388288, 497144, 2983146, 1570740, 4073113, 1504059, 1003568, 5651483, 5095800, 2831436, 7119888, 4974541, 2920629, 2654728, 7179884, 6671636, 6362431, 789803, 4618871, 6684088, 8277939, 1487583, 7556318, 7699884, 5776907, 5937795, 7322064, 2894382, 4841218, 7777089, 1437842, 4935259, 2248004, 5941399, 6733840, 2352903, 7256419, 832888, 1962971, 3747072, 6363768, 1561960, 2256890, 578707, 2019367, 5741516, 2026676, 3956084, 6409717, 7146411, 4892640, 4712965, 2172806, 2934575, 7727325, 7443271, 2314514, 827320, 2240087, 2201837, 1731606, 7840791, 2278291, 7456278, 4921109, 2984550, 6012301, 6324136, 6176775, 4761686, 5434479, 7406592, 5923578, 2352329, 2081716, 7511585, 6462049, 2628954, 3626780, 1573688, 5089133, 7853394, 1017126, 6616383, 6811389, 3762499, 4321213, 8258037, 384583, 5634400, 3491937, 2630391, 591453, 1974490, 4246951, 6529752, 4881550, 3884232, 6516929, 4745055, 4206681, 5169934, 6804510, 3385123, 6481489, 8122200, 1739482, 406587, 4059056, 8165991, 2283511, 7944880, 5223218, 2537541, 5998303, 7006843, 3268667, 6202276, 5132869, 2037770, 5008874, 2432729, 6689564, 5088550, 5244148, 4012711, 4513502, 7233819, 3321544, 6591286, 448686, 3314683, 2699086, 5376627, 5533349, 3690750, 7748559, 1416287, 2399111, 1945648, 6977420, 5303151, 6167988, 6565001, 1031107, 1708121, 2408401, 5079705, 7714974, 4077452, 7824356, 7716840, 3710457, 188952, 1824516, 6831727, 139480, 4850196, 7507467, 7208788, 4142273, 907916, 8033143, 4256614, 5892773, 1961945, 5286387, 8246953, 4316592, 1185705, 455270, 6781497, 494963, 1221179, 6863836, 3042112, 3051826, 5935136, 7263756, 8104497, 2008778, 7599509, 3014968, 8121844, 2410262, 2679694, 1677585, 3523574, 6897082, 2036337, 394569, 2782900, 7169456, 3090219, 6854123, 5170978, 1059557, 8280866, 3408289, 2164135, 4456763, 6510425, 4141118, 8176954, 810380, 8158406, 6994641, 2122221, 5562599, 4397184, 4495968, 3590537, 4946971, 2034930, 5536086, 1385996, 8034252, 1619980, 4887531, 1596246, 3159985, 2624227, 2817104, 838003, 5995979, 8336089, 6047556, 6924634, 6732327, 2802547, 2371319, 2756821, 3450215, 6481992, 6170484, 8327859, 1081603, 3790908, 6227758, 7849985, 1358497, 3722530, 1109346, 7345538, 6912963, 2746798, 4417344, 6903947, 5871831, 7933057, 7657550, 3576049, 78103, 4918836, 5572644, 1430029], +[1750910, 6951273, 8232392, 7393526, 636560, 7364581, 6958310, 7378466, 6633679, 5193564, 3168714, 200963, 265328, 515516, 5254982, 3614670, 2292436, 8047878, 4096052, 3217799, 4465900, 4027920, 6407331, 2845717, 2508952, 1459636, 6550777, 2553901, 419091, 1188539, 5300457, 4013389, 1418700, 7373795, 7048944, 1132807, 2191804, 3411503, 325832, 4101088, 4858390, 3868377, 5759145, 3046463, 3926241, 7726677, 5661229, 7159769, 2615255, 337690, 1138933, 4474394, 7076269, 5278210, 2086735, 3131557, 8271983, 4237277, 4207062, 311409, 5550960, 1224347, 4117558, 950597, 5417669, 7384514, 2623227, 7259247, 4739970, 5825506, 6668690, 3292970, 3220133, 3890839, 6922670, 7419166, 2122972, 3904503, 3423359, 8356437, 2079151, 1245806, 254939, 7189517, 7126374, 5232343, 6928761, 448424, 7889648, 6201813, 5932872, 6761070, 8053705, 3329052, 7350640, 2857512, 513075, 3247585, 5201098, 5205125, 6478236, 2346887, 3471787, 2704436, 200167, 5222735, 5167112, 3468804, 7460050, 4734734, 7107221, 716666, 1163790, 6384809, 227019, 6428189, 4165678, 916629, 3463413, 1987749, 7599401, 438125, 7899608, 5638627, 1119557, 4237370, 2141109, 1350612, 5018742, 4348999, 992843, 5771306, 1361967, 1370081, 126407, 5807955, 4964482, 7467516, 1454580, 8132157, 6155283, 7124004, 624270, 5824280, 4048721, 7364402, 3711001, 6938613, 2439112, 3901012, 5417732, 6690740, 4935835, 7993677, 887046, 6953436, 4145173, 3393255, 8332615, 120143, 7944423, 7202280, 6216415, 4896072, 3377205, 4633190, 3992741, 2666755, 3738850, 616582, 7481242, 2265791, 4246091, 846419, 3091519, 5727512, 4601564, 3219023, 2665042, 7782713, 6223576, 7320769, 2673377, 6901189, 2884698, 4420420, 3044829, 6097144, 1290116, 440763, 2481254, 1085366, 1937349, 46980, 4931638, 2197994, 168396, 4609138, 3118019, 1166656, 977282, 4823643, 188352, 1217000, 3198373, 135109, 652454, 2288221, 6685141, 7761935, 6279890, 6128261, 7740931, 1446550, 143615, 1697942, 4509352, 6214681, 4559273, 4743760, 4568772, 2848212, 247661, 5649908, 5069503, 233466, 6752497, 5878304, 1103412, 4273029, 5565128, 319492, 3595728, 5742835, 3973341, 1589084, 5308989, 3731961, 5641556, 1353323, 4128893, 6683095, 5209641, 7070660, 493748, 2298416, 6047563, 2425129, 391941, 2680536, 8241086, 2745936, 8282743, 2132676, 6113173, 1527866], +[68549, 1468933, 6381093, 2184999, 7461915, 3762500, 6017944, 6263114, 6054502, 5026470, 3489242, 2290266, 948767, 8297397, 7239339, 3168740, 6301781, 4129359, 7879401, 3999213, 5540787, 8241709, 5072866, 2841696, 2183988, 902985, 3924715, 5926149, 6681924, 5825783, 1833574, 4877516, 148387, 118220, 1952290, 4984706, 5498500, 5351671, 4023111, 4957255, 709634, 5997724, 227832, 640693, 7524742, 6073279, 1435369, 3138860, 715847, 3773392, 3270528, 3446566, 7468118, 5725515, 7495194, 7460807, 225616, 7602703, 3734373, 2243470, 3667699, 7618156, 915670, 2388810, 336754, 3183048, 6731736, 5072254, 3372722, 7879870, 1767187, 6907509, 5450430, 3966274, 1866890, 6481799, 8329982, 519548, 5692812, 3211030, 1467604, 6253800, 5503980, 5982830, 4179073, 7990800, 4295551, 8250912, 3607765, 73477, 1311827, 977238, 239676, 8100081, 577083, 2360024, 5792013, 2707035, 2031027, 5593208, 2622624, 535256, 4447976, 6035836, 1723062, 8355725, 5355326, 200865, 5997835, 1884944, 4826194, 5149592, 2463189, 5853701, 1753623, 2398150, 6288718, 3586003, 2940577, 3050408, 6762530, 862058, 2899737, 4327364, 7375183, 5833873, 569948, 6702133, 4314842, 2360071, 7290293, 1908892, 543441, 5411054, 6469658, 4735636, 854645, 3381997, 5311635, 7807019, 1019160, 1365310, 3504526, 3722874, 8219202, 8055219, 6728223, 5329803, 3215479, 3579077, 246425, 356737, 4992355, 8176147, 8183096, 7992820, 3277092, 5620023, 8133065, 3970990, 6932683, 5379523, 614387, 2170200, 1147671, 3694432, 2236786, 6457150, 3684798, 2884192, 4589407, 7944361, 4590692, 956261, 3358316, 3586828, 4363068, 1710504, 7502608, 2602531, 5132769, 7453275, 7117295, 1734959, 5292059, 4766078, 3793389, 8140885, 5846209, 4690408, 5459738, 1121280, 6434759, 487204, 7478247, 5849513, 5199191, 5181923, 1839284, 1239229, 2856552, 5744499, 2881097, 3892786, 4000423, 2753744, 5145955, 2928746, 1775469, 7719021, 5141358, 1070919, 1761094, 6347761, 2811869, 4328064, 8280718, 6880716, 5617548, 855542, 2923389, 2028182, 42349, 8341736, 6062979, 2366338, 4112637, 3395662, 258109, 374495, 453344, 4763043, 2618033, 925044, 4376153, 73930, 3169161, 2865844, 4581751, 6868307, 3032531, 891082, 701598, 5526005, 4296721, 3251571, 4630245, 4084525, 4640947, 3923723, 6532392, 2397905, 1629993, 3122931, 4923232, 498035], +[1013954, 3233436, 1912641, 2522565, 8174999, 493675, 4399449, 3766932, 3809737, 1507590, 8330073, 6585932, 1911700, 5908661, 2302698, 1937726, 2263048, 6269694, 6961156, 5356016, 6862280, 4469937, 3393050, 4772966, 5031906, 6102619, 2100545, 1826658, 3614014, 3630218, 5679021, 5449786, 2428031, 7870161, 1948904, 3849415, 4575028, 6342375, 4731316, 1651071, 2917738, 651139, 206169, 133239, 2797793, 2786796, 8377905, 2965827, 3852276, 4580204, 1667067, 4766596, 8145707, 5075894, 2736882, 7387464, 2647996, 4494544, 2218930, 4375199, 2155463, 7594721, 2024665, 2224481, 3434277, 6033659, 1016134, 2232946, 1529502, 1594817, 5965829, 400898, 4092621, 3399888, 58480, 7805510, 4299595, 1709481, 4031727, 6744054, 4307843, 1553668, 4425055, 412210, 4817030, 3816602, 619205, 1053470, 878182, 1099129, 1123043, 1238183, 8365733, 7802804, 2926473, 7947354, 5728898, 6037691, 7418090, 4001492, 6461185, 5692095, 6885865, 1607588, 7570125, 506017, 1836049, 1246379, 2498637, 3426812, 6318561, 3889305, 3511277, 5217940, 6074695, 7476544, 2378357, 4028078, 3942589, 6249310, 7383987, 3307549, 1538465, 1400401, 2967319, 1634879, 1689846, 131038, 1863605, 5499496, 3006157, 932748, 2074161, 7080595, 8003388, 3215935, 5153168, 3874737, 5170783, 2238204, 6997047, 6091899, 8343249, 5488701, 397808, 1256767, 1352603, 2587664, 2060077, 465278, 1665944, 7956370, 1898969, 4364106, 7794671, 3060346, 5466773, 3573196, 6407047, 7860187, 7442171, 1329410, 6435913, 4860460, 697593, 5117436, 52177, 2964431, 7384476, 2423436, 2739580, 956611, 1214725, 7319672, 5450380, 7790833, 721179, 3841071, 1932896, 2713944, 2515587, 2560788, 3800683, 8151942, 1652547, 4300571, 5702188, 6479999, 7915551, 1564437, 2817301, 6037461, 7951831, 5777006, 1181957, 5506392, 5763434, 4800686, 5704968, 3204301, 5503790, 1384828, 6218571, 2014758, 4259621, 4761796, 6611945, 2318983, 4554697, 3810678, 7168304, 3462584, 3458490, 8299110, 5169127, 8260870, 7496389, 6578045, 4826837, 8178737, 8072823, 5623390, 2232570, 3525911, 4996764, 2928741, 3543331, 2245710, 4591456, 4334082, 7616920, 6772356, 6214777, 1489097, 3849439, 1232786, 1587687, 4558593, 8376404, 3327296, 4746468, 6458494, 251244, 7741495, 6379952, 6968511, 353484, 4180329, 8008034, 3747904, 1112714, 3439194, 1762647, 4023730, 7522344, 7958134], +[5648881, 3781786, 3517480, 5728285, 1650729, 6213397, 3656094, 5452810, 2200149, 1099769, 31270, 1894560, 5327906, 2048487, 8192367, 883697, 832879, 2837250, 223884, 4312798, 2218625, 1813087, 5872070, 6660335, 2970713, 5257118, 6949191, 1951313, 1382289, 6231699, 5710347, 3984693, 1234513, 6856681, 8010440, 7366840, 868895, 93541, 1464609, 1106158, 4349789, 353290, 7720134, 3672417, 3170447, 741700, 4831358, 6546793, 7881942, 6261297, 6593493, 4325802, 3264171, 3297808, 7440009, 3946617, 6194846, 5206975, 3454237, 773208, 5165172, 3137150, 2130511, 192649, 494753, 7482632, 1524593, 4347465, 2751033, 6479011, 6148361, 4864402, 6355813, 4005090, 3747527, 5598436, 4768672, 334170, 3137115, 7387733, 6937122, 6504560, 4813170, 4111934, 4038848, 6576662, 2054875, 6932854, 2601973, 984992, 4466337, 1773640, 6138559, 5865861, 8092369, 2455254, 3026557, 7901906, 5906429, 1632268, 6739444, 795953, 2384382, 7554215, 7769022, 7088494, 2504817, 7937202, 5648077, 1166172, 1083104, 5513913, 8211921, 2543688, 8116413, 4719702, 6649444, 8160086, 916517, 4297516, 5824953, 1069705, 3885920, 3039646, 5448725, 6103888, 3631180, 3264789, 1046670, 2873130, 6674383, 5002328, 5677500, 7016677, 4733154, 7724558, 4670630, 5322897, 3100250, 24935, 2680488, 7271714, 6107847, 2930977, 2391299, 3650750, 5127422, 1657995, 4338777, 7095139, 723428, 5202319, 6511846, 7983709, 3017155, 3946856, 3040867, 8352471, 7387387, 3629103, 2759615, 7393440, 2358844, 8191782, 1456277, 6543875, 6275693, 2427920, 2876351, 7376096, 5219847, 5143526, 4466408, 8064012, 2784469, 3539129, 2838447, 5987963, 2330338, 2798880, 8076354, 7195860, 4160379, 6176190, 3421773, 6239816, 343464, 6357642, 4687988, 6730105, 328960, 7745247, 4720406, 6930127, 1866770, 666367, 323398, 2910821, 263571, 5681164, 1554271, 4021738, 5089858, 4179337, 1937642, 1028263, 3857335, 5797292, 2245354, 7730652, 1032088, 748909, 1697606, 1415513, 18819, 7163165, 5632886, 1706799, 8217135, 566844, 1633836, 7799239, 6604838, 899047, 314425, 2451697, 8066214, 5820318, 1400877, 1655029, 1788268, 7120600, 3171645, 5438772, 2530575, 2119142, 4056569, 6977459, 2505551, 98471, 7013420, 7870721, 3112903, 91085, 902130, 1146652, 1897864, 7246455, 1880281, 357582, 8219545, 2499442, 6792958, 2005935, 5081598, 3784585], +[6128253, 7915070, 2598082, 1643279, 6376975, 4206287, 2056122, 120138, 2512862, 2897316, 4643110, 75314, 986492, 7497241, 3445832, 1299098, 943893, 3118881, 275456, 1808617, 863429, 5065896, 7295041, 4854915, 5183173, 4800806, 2581027, 4895786, 7636878, 5582083, 6426355, 4552370, 8064347, 4307036, 172146, 1926291, 3183437, 2583157, 1981112, 3636139, 971442, 1796370, 7790843, 135702, 3763407, 1277277, 3803580, 1715528, 7873011, 7015998, 5243222, 7808672, 5603992, 6107520, 8179912, 4619831, 5497215, 1010662, 1970681, 2802202, 766787, 527571, 1379360, 1143208, 5283728, 917366, 8014933, 1759527, 960233, 3763166, 4096961, 6974227, 5860053, 5339025, 2310403, 6463909, 5932724, 2191500, 2353174, 1387328, 6925553, 3021390, 4405017, 5201159, 2940328, 291307, 1210912, 7808597, 436863, 5121959, 7266786, 4799888, 7807263, 2082986, 1213569, 7310657, 2997878, 3849605, 6532198, 5042995, 7071263, 1398088, 6516888, 2378817, 3785885, 6036533, 7312211, 1238009, 3093264, 1493503, 716565, 5150916, 7337371, 5196598, 2715288, 6699467, 30902, 4136569, 3355768, 349116, 3795679, 4541644, 1067333, 3140688, 4385781, 7632915, 353336, 4395983, 6469507, 2302264, 2784608, 392989, 2102863, 4719605, 6662527, 4994209, 440529, 7016041, 433514, 1418774, 2105224, 3865879, 92803, 3937115, 762019, 5276383, 5296168, 8288056, 1083769, 2201648, 6149320, 1400986, 3634019, 6558902, 4941783, 3656972, 1238307, 6871140, 2512946, 3721684, 5843749, 524120, 848060, 6004089, 5101416, 576610, 290617, 6854404, 5806583, 4890734, 216650, 3516954, 3406903, 618771, 765218, 7500844, 4511685, 7452585, 8192609, 3328167, 2884677, 1439478, 6346323, 1997887, 3711555, 4050657, 3775598, 7185691, 2317440, 3880325, 592817, 6738999, 4180615, 5533687, 8101325, 6639241, 978824, 3863338, 1652785, 3337898, 4641320, 7314497, 1697337, 5276793, 6837750, 3688788, 3083183, 650199, 5477877, 5739888, 2360861, 842418, 4233010, 5776965, 6934508, 3281500, 3197329, 3764944, 5618065, 7878879, 8105516, 4868332, 3781972, 908211, 8004603, 5632102, 7323156, 1865565, 80203, 5985627, 2686529, 3981144, 1863459, 4397308, 1919687, 5806665, 1237169, 7033650, 4093302, 6208367, 1520480, 6024587, 4174979, 718411, 1859488, 3153337, 5738138, 2052412, 5103675, 5451372, 3340224, 6088800, 2301536, 2880489, 5756886, 7294370], +[4811026, 2543527, 523859, 952036, 6081653, 7574093, 8220092, 73168, 295029, 1353722, 2484995, 10567, 51992, 3388257, 2111470, 2186645, 105565, 3407063, 7010059, 4684642, 6938576, 1591386, 3587272, 7223976, 6023349, 7448215, 3157205, 3497083, 7261541, 3374507, 1262644, 7436014, 5332801, 684969, 4620023, 7949677, 2605237, 833277, 628161, 6655422, 4008693, 1985280, 2622001, 3617288, 2147230, 6558266, 6827074, 5644960, 2803565, 8209731, 3591817, 5139823, 139398, 5205422, 2760195, 4593220, 3632612, 4241148, 2800975, 6857396, 6384876, 5469107, 7740838, 8147235, 5312906, 1986923, 1687889, 4409056, 1664789, 6936530, 4118246, 953892, 7263138, 6041387, 6205446, 4848152, 6807239, 319761, 2185413, 600141, 6448937, 3230682, 7975858, 7065145, 1542190, 4962614, 6267289, 8111822, 538336, 23458, 3540312, 6157754, 3318792, 2206119, 3445825, 4837399, 3045613, 2543093, 7024353, 4774664, 8205629, 1172146, 3330254, 7494359, 4964695, 3483179, 2385497, 7069758, 296966, 680993, 3426095, 1062070, 7379100, 3096237, 817370, 5965020, 7406395, 3652113, 370165, 5821054, 2264370, 6959640, 7648294, 556882, 7726437, 3107257, 8169520, 3572411, 3051063, 3820034, 6831913, 5653824, 1383155, 5913899, 6280358, 7787329, 1854646, 5989040, 4869405, 5612375, 2452709, 84341, 5610719, 4960952, 7042537, 7458704, 2875010, 1024429, 1412095, 213209, 5507069, 4332023, 8278424, 6124721, 6681806, 1030779, 6003120, 4219895, 2252407, 4562541, 8149541, 3974428, 1248299, 6578176, 5108529, 1872535, 5073630, 3490444, 9404, 7332060, 1865302, 1855165, 3364203, 7124500, 4107085, 7339141, 1847817, 7562332, 3945207, 5161534, 3784020, 7709475, 3792133, 2562723, 4285367, 4048580, 7384350, 5636154, 493219, 3503220, 564250, 5933649, 4830850, 6658194, 1691293, 5027947, 3465019, 8037576, 4192178, 2189905, 6862370, 6747669, 7757641, 5508590, 4852443, 946201, 5174684, 4384642, 8025731, 2983563, 7691614, 4054211, 6793529, 2732277, 1998925, 1355297, 260495, 7455108, 3107341, 1747359, 4431630, 5424534, 6812500, 1816766, 1625193, 3683346, 6464886, 3712843, 3030033, 2856032, 8018305, 4755437, 4911969, 225283, 156811, 5569275, 3478201, 2839459, 6438380, 1808839, 4903764, 4455862, 6045039, 6936245, 3350208, 3978082, 4632385, 1824829, 4322134, 5772210, 7794457, 1470465, 3404405, 584840, 130285, 1961599]], +[[7484207, 1398862, 3230161, 6236595, 5855087, 8324820, 3582388, 2987610, 878980, 3744099, 5495501, 4295584, 1630699, 975433, 3403837, 567054, 6178913, 2635493, 182352, 1182883, 1317627, 1981981, 6217975, 318145, 278352, 3761501, 5977213, 7802388, 4605824, 404040, 6026529, 5650251, 7582537, 1898589, 4866091, 1213926, 5834115, 2121386, 897884, 4310058, 592313, 5259203, 5118194, 5520969, 7532186, 3649534, 8108429, 2632133, 1791021, 3212587, 1225674, 6238574, 812108, 2651895, 8072686, 6434983, 3541236, 5017328, 836417, 7841899, 5492124, 6574288, 7681128, 3562937, 7879632, 6346353, 4287972, 2994701, 3865600, 3304091, 5799313, 3499595, 7929033, 2564463, 8097434, 585417, 1099562, 4800743, 907428, 956029, 2543491, 4218929, 7604487, 3530826, 2011780, 5186247, 7918053, 6536848, 5249085, 5570967, 4983205, 4556045, 5039343, 2739394, 5419798, 5908096, 1345135, 5441517, 8050114, 1418837, 4626884, 4850609, 7742925, 6615924, 7317040, 6011167, 1580549, 278825, 6695698, 5580034, 3722718, 3644219, 6232399, 1910876, 131721, 4967489, 6791751, 7666156, 5294938, 5779819, 1326103, 4414195, 8209884, 777715, 6988519, 6985284, 5226578, 2682348, 8318827, 5170013, 624072, 8271021, 2712893, 7978523, 5684887, 2830664, 1123957, 5339800, 7821894, 7819124, 1599392, 963017, 4441170, 994371, 1273152, 7278833, 446368, 7885392, 2730838, 8098316, 8353277, 679567, 7426641, 509902, 4429732, 4075644, 4722133, 5149737, 2882910, 38621, 3899091, 8046371, 4697469, 4864854, 4016787, 7339346, 4348201, 5890273, 7449167, 2115155, 7787532, 78333, 4169887, 5805246, 156531, 8345100, 3769431, 2509242, 1824424, 4627997, 7550733, 2361964, 3541547, 1649216, 7811161, 250431, 3642759, 3795799, 3343568, 1791532, 3652729, 4380298, 3753806, 3926810, 1312420, 2323382, 2990996, 2078773, 7463896, 7071316, 5217026, 140741, 3516754, 5247685, 6060717, 2111695, 27063, 2777134, 4776862, 1849426, 2457884, 5803292, 3191419, 5464522, 3604752, 4082224, 6048545, 822343, 5193295, 1404464, 7580984, 4164456, 6787285, 316202, 3416965, 1237421, 1112952, 1371158, 2950656, 2015113, 5729522, 504732, 2956961, 2140070, 1942284, 5023358, 292386, 990886, 2107381, 2593502, 2534615, 2327755, 1716549, 7007086, 3989533, 7964308, 4973205, 1713189, 6842091, 786515, 6150566, 4719827, 2513031, 3593021, 5850873, 5482748], +[2877996, 4124424, 1198751, 7004319, 9754, 6985264, 5563151, 461591, 4151903, 318273, 3142549, 2101869, 6318229, 4660153, 4796887, 5002479, 4145043, 3688597, 5270624, 8110572, 3912515, 1987450, 475904, 2492428, 7070600, 3709352, 3361941, 3527147, 54723, 3527445, 7219088, 6755642, 2677862, 7594805, 2266404, 3849156, 7884279, 3070867, 4362632, 1582761, 7081804, 1312980, 500997, 7098631, 2960254, 8320016, 1592378, 6070242, 7488822, 1474864, 2643899, 7142717, 6058441, 5425626, 3143584, 5003211, 2482339, 5825915, 6885694, 6491216, 888863, 356634, 1960766, 5568046, 4223430, 2184898, 862876, 2966036, 1476832, 4240072, 1077906, 6513602, 3158485, 972240, 2526847, 5933226, 2184223, 2742163, 8009622, 3706049, 4967759, 3887322, 2122217, 4872678, 828666, 1007206, 7507097, 3415482, 3633473, 220708, 444245, 4017084, 8355373, 3753870, 3055035, 2987874, 409766, 7256420, 7057501, 7940759, 2690686, 2555288, 8241921, 2689466, 4581371, 4092655, 1808073, 5362139, 4066252, 142254, 7923596, 1221139, 8292676, 7368029, 3456454, 7328921, 5870604, 6751249, 414935, 1543175, 1171538, 3142976, 6066702, 325271, 2153610, 4750561, 7587867, 7211362, 8055239, 1730914, 1432370, 3997397, 2552338, 6745947, 2797470, 6423769, 2630307, 5358144, 1600099, 3489502, 3889650, 7740521, 7452003, 761023, 5793556, 3414934, 6602437, 3469542, 2226750, 6733361, 3183289, 2681287, 4034796, 5332033, 878464, 2835838, 3708467, 7041138, 6052732, 1182108, 1533514, 2336008, 5312662, 6519757, 2396904, 278876, 6956104, 3108921, 7225567, 6188202, 6002441, 5952684, 1329229, 5540422, 7744193, 1875019, 2001280, 6183985, 6485066, 5598816, 1946068, 6334175, 8179784, 5355482, 4538998, 3304989, 7874706, 5772949, 6706700, 3715649, 6879477, 8022587, 1491951, 7600851, 2306834, 6484219, 707645, 4306917, 3142086, 3955916, 199527, 7182617, 6439526, 6621210, 2501404, 7069402, 1511317, 5200509, 1471358, 4015139, 3666356, 2135186, 7742381, 2476913, 380661, 1383781, 8344370, 4135237, 4537328, 3457866, 5818782, 4039639, 3803276, 2958981, 4633936, 7670898, 1499387, 6673606, 4117197, 6917479, 4071318, 59441, 8371370, 7115133, 8028244, 5139268, 6950913, 205569, 7373668, 2851878, 2348800, 1506044, 2473374, 8125477, 726436, 1638471, 1561341, 4804185, 3479065, 678630, 8030068, 3963928, 2344574, 2877594, 6549948, 3040866], +[1332294, 1431905, 6583020, 4445281, 3578159, 5090392, 884824, 5451892, 1176416, 3119898, 1022452, 2512096, 4130058, 1059205, 251496, 6591216, 3980721, 415723, 5957345, 1294891, 6345505, 2596805, 7904305, 7931242, 2571402, 6618399, 2554628, 1082870, 8146583, 1782641, 1931623, 7605154, 7465876, 4440983, 4270607, 3293215, 6386138, 2184084, 2394602, 7546735, 2978572, 6657218, 5718061, 4245378, 3585896, 6820466, 2038090, 306700, 4524788, 2973327, 5456369, 132840, 6038410, 5712542, 230369, 5012177, 5378128, 4891105, 5814072, 7164391, 1340347, 2987256, 1576420, 3945810, 1421929, 5635544, 7228704, 6667267, 3541133, 2931264, 280305, 6185265, 6292095, 7063421, 55808, 5576887, 265508, 8332387, 6599337, 6289587, 1491900, 4330973, 1063976, 282164, 1555035, 7231885, 6244819, 5702463, 4018324, 3343603, 531787, 2584725, 5520646, 426359, 6220922, 8341337, 2958022, 7166271, 283265, 3649084, 3745942, 5533797, 7217096, 1889512, 4432744, 918297, 633676, 7160965, 5577127, 4084535, 6818226, 3176622, 2348590, 6695795, 7907577, 1976928, 5282974, 6432613, 5043994, 1553265, 2692934, 327159, 3649826, 3379284, 4555753, 2156975, 3856993, 4700880, 4964085, 6963602, 1521740, 4764558, 2187255, 7586448, 5284316, 6682397, 5887195, 7648885, 6917702, 7349628, 8230586, 297712, 533435, 3933697, 6566398, 2154850, 8117744, 1865317, 5517779, 6482795, 4119335, 6480799, 7265454, 2560307, 4370374, 8046636, 7166055, 6077238, 7833474, 7718756, 4913452, 1894873, 2824449, 7545217, 1805908, 6548972, 5462165, 2429162, 7679812, 6946691, 1833962, 606919, 4215456, 2721033, 4491799, 5705027, 5658636, 2393764, 1467734, 79343, 2163936, 7489916, 6313348, 6955507, 4059353, 2194415, 8141719, 3742259, 1455297, 3717120, 6872234, 4883661, 5700475, 3002092, 3695588, 2651519, 770245, 4081512, 7250887, 293878, 895721, 945158, 6729347, 7855167, 4716394, 7881865, 8261158, 2270059, 5472597, 433292, 7643946, 4566741, 8104685, 8285640, 2543629, 3987008, 211691, 4193827, 6401168, 6244893, 8352337, 3028498, 6907330, 3151958, 7017104, 6486576, 209986, 3838610, 3440694, 5071909, 1731300, 3572011, 8213370, 6502601, 7684204, 273794, 1483125, 3316948, 6494624, 6371712, 8076921, 3001774, 5767612, 2810732, 8007981, 3067462, 3881865, 1964512, 2324657, 5683830, 911383, 2774338, 7041162, 6016112, 5488486, 3811906], +[7265270, 4634067, 6250786, 2524054, 6384266, 2802831, 4889491, 6532268, 2792783, 6546221, 3467516, 5768646, 6249036, 2363514, 5234784, 7244796, 5654292, 7691109, 3195777, 6203918, 4759157, 6429929, 1395667, 8350366, 6819675, 533977, 7609630, 1366958, 3794326, 2802526, 2807249, 4588340, 3958086, 1923206, 3982390, 1714889, 2381393, 3716510, 4560259, 7154489, 6404120, 2536620, 228135, 3547727, 7084963, 1832254, 2975548, 3743838, 5783634, 4203353, 4654283, 7636373, 4142420, 421285, 383645, 313612, 7172355, 6058592, 4389846, 4864869, 6367300, 2859845, 6908472, 3278018, 5994591, 5679912, 5659444, 568562, 8156651, 4168252, 8102567, 7484767, 5506082, 1345818, 7979888, 54441, 4523085, 2684838, 6708566, 3804048, 7901003, 4817162, 7740258, 6976533, 2453655, 2643600, 1051174, 6283829, 6976661, 6267874, 1004129, 4455265, 6985890, 6813555, 3957163, 4675037, 6560910, 2130707, 7939605, 1078726, 3886, 7819311, 1188382, 5505051, 3288712, 2176973, 1932854, 2402391, 6523184, 4330352, 6489598, 7346659, 118983, 3481388, 4228051, 4774911, 3031121, 6983129, 1722490, 4840118, 3655661, 4993731, 2356401, 6417051, 5000334, 2120005, 6275218, 2408072, 236114, 2518313, 8017520, 2371461, 6695011, 3662735, 2021718, 8122943, 4145453, 6873269, 2250544, 1993275, 2126658, 1706834, 7266911, 2235057, 932682, 2600429, 1434018, 7528685, 7823248, 943883, 8016206, 7500018, 5874570, 3513683, 7510666, 1674179, 704355, 5146378, 1633470, 3371650, 2788195, 7538775, 2502432, 1371893, 482977, 5181607, 5185165, 4206654, 3913603, 1958739, 8132496, 321943, 7662774, 1807112, 5736899, 390841, 4293434, 1861152, 1509708, 4684561, 5947058, 2240089, 45839, 7610075, 4561912, 3683030, 4275915, 1970359, 8260606, 85804, 8062366, 1847917, 2412330, 877897, 3008764, 4577642, 1005689, 7322501, 7826265, 7469509, 4662849, 4989945, 8016270, 3098903, 3244186, 1650960, 1396886, 6976436, 355995, 6364497, 367517, 2539474, 1002502, 350022, 4639391, 5787651, 4423980, 5311845, 7055269, 1438164, 7624894, 4795378, 1522004, 1171912, 3329714, 2755679, 2618705, 6809795, 4879321, 670061, 4933027, 3310811, 321465, 6137756, 3613010, 1127913, 496769, 8063181, 7159849, 6265544, 6799870, 1795581, 4869113, 3001644, 8090942, 678836, 5460105, 6894469, 6965185, 2383060, 2953086, 6090371, 3625443, 4668028, 5969818, 1742173], +[6892481, 5688825, 6408196, 6053802, 6888138, 5752874, 5091096, 6608290, 1333452, 3648184, 5767894, 4715836, 7108134, 1834216, 7743815, 6143360, 793608, 5524615, 4546628, 3046169, 1739769, 5245132, 6547813, 6820778, 7478310, 4415716, 1896850, 1341790, 7600673, 1044159, 6591195, 792179, 1027538, 1955082, 1849376, 396093, 7059280, 3866917, 2854651, 2281945, 1629317, 17372, 1550266, 2361983, 5225620, 6385609, 7534129, 4027952, 5305941, 8331529, 6981043, 2718245, 972460, 3804836, 2388676, 5180308, 6239950, 4144115, 222874, 32999, 6120759, 1264301, 1190914, 4955489, 2929740, 1677540, 3800173, 5797709, 7329819, 4182640, 4463307, 5412392, 6135130, 4631608, 1231335, 67938, 6961783, 4003520, 7948146, 1356864, 3400550, 4437243, 7489668, 4138868, 4510315, 4908919, 1325525, 1464288, 8287356, 7682976, 3162050, 8357323, 2341254, 5680266, 2371993, 7474532, 6855298, 904910, 2869944, 36775, 996194, 1069682, 3113290, 6899662, 496836, 5081132, 6871386, 7847766, 5055044, 4995816, 7103152, 1903773, 7332664, 549637, 7866981, 3814771, 5214528, 1941670, 83015, 8046463, 8080239, 4517507, 4920554, 1234036, 3470737, 4299252, 6089733, 2323130, 153798, 579035, 4232594, 1410715, 7789418, 7597450, 7471978, 1093754, 632816, 7561661, 1592964, 2249967, 5066137, 3945095, 1958855, 8351384, 934439, 3314682, 5836350, 5017833, 6679528, 5320586, 6825376, 8340941, 3466296, 2362265, 6787107, 4807170, 4333957, 1394245, 3599035, 4768545, 1575915, 6437081, 7040097, 55247, 1654745, 1390792, 7201639, 2418910, 5186367, 7332502, 4387306, 6839560, 543808, 5894877, 2483726, 7219110, 7935831, 1139525, 6992558, 846376, 5859530, 6317565, 7942679, 37947, 5183688, 1592401, 6529717, 4035494, 8108698, 4684617, 6844543, 3158350, 5395608, 6636334, 1662557, 746988, 1376241, 3236495, 5008172, 4505726, 3259166, 6684669, 942470, 331687, 3749291, 5126514, 5820265, 8159827, 126021, 6809820, 3343410, 5159888, 3598046, 501519, 5921345, 5314976, 1058325, 7434392, 3877895, 588078, 674273, 7305442, 3188365, 7685511, 5559671, 4192277, 861624, 7536334, 2319533, 3728647, 7756385, 8364501, 6598826, 1534742, 163375, 342504, 1646182, 767209, 7034769, 3821040, 4885333, 5246133, 3588668, 3401465, 417621, 6967607, 4812638, 3425124, 605222, 3003235, 5222469, 4520441, 4659020, 2592686, 7675923, 4624315], +[4189740, 5020560, 532067, 3830956, 3826880, 431460, 666573, 3263671, 5580150, 3275760, 5874585, 4959570, 1748071, 5176862, 1881136, 6465617, 691141, 2891199, 1100770, 8261023, 4113747, 3617881, 2975674, 7685858, 4041173, 1449957, 5553501, 4773514, 3810312, 3957007, 7853804, 3006438, 203971, 8113036, 4739447, 4336414, 2169449, 4501124, 424473, 781311, 7012922, 6565664, 8207031, 911624, 2316314, 1673663, 117393, 465249, 5395315, 2520947, 5119540, 8014618, 6861865, 1031718, 681877, 454634, 4121090, 4254389, 4620463, 883283, 3562913, 4115613, 5796672, 3179571, 7351785, 6654764, 4338181, 5416077, 3156093, 2808821, 4345210, 1283437, 7891884, 1125541, 2045285, 2075229, 1387447, 2007199, 7006868, 6657652, 7140287, 3205808, 8158172, 6508025, 8377681, 4862900, 1731077, 101048, 1465923, 847195, 6012757, 763714, 6294017, 3739163, 4307627, 706993, 981201, 8355418, 7260845, 2564600, 2166057, 4731318, 8189949, 4253209, 7924705, 7636080, 4365555, 772888, 1768142, 1306685, 7521374, 3213880, 2012313, 6641607, 6602243, 2760716, 5932003, 6531755, 6530631, 6410078, 5981003, 2578512, 7649702, 6414865, 4233752, 6116349, 1917413, 1478043, 8003833, 3265784, 1521867, 3984151, 389497, 2942633, 2792220, 3084710, 6454102, 6570969, 4802088, 5191150, 802476, 2588110, 5082202, 8252585, 7194656, 7888857, 7088224, 7126635, 7254545, 1107774, 5916083, 1094568, 1312316, 6718825, 7375921, 4613162, 7896364, 3346862, 6821061, 259908, 7109047, 4855916, 5786122, 4583498, 7768313, 4133565, 6996650, 1853155, 1863196, 5516844, 906200, 4477562, 6322379, 3956106, 6863253, 6383739, 7788789, 7908501, 714241, 8207061, 4733014, 437107, 8119278, 4488504, 5822922, 7767337, 5964811, 3773354, 747621, 2751000, 1831426, 2652748, 7277669, 4223765, 5506370, 5752223, 7270315, 7466047, 511634, 3237018, 7748887, 1268046, 3211163, 7700460, 762594, 5349376, 5317352, 5256109, 3452792, 4737441, 463937, 2840918, 5960491, 281990, 2809923, 5789978, 120369, 3752813, 2357812, 7567491, 3929786, 3282410, 1705967, 3403927, 672563, 2782935, 2302183, 5357036, 5538409, 8353718, 1317636, 7952312, 4629337, 4262269, 8192576, 4293275, 4646192, 1242987, 5504492, 6146023, 2349451, 6652976, 543701, 7479620, 5436338, 4190154, 3600015, 5926659, 3954491, 5714014, 3699285, 1770495, 7958478, 5087283, 1891295, 3569946], +[2064287, 7538397, 1701410, 6692398, 3431600, 5966918, 1719034, 2860070, 7963510, 8158351, 5253319, 566275, 2866288, 1676583, 1237647, 1522936, 7931959, 3295878, 7864774, 7501524, 1044599, 2132524, 4810773, 2340734, 679501, 1481389, 3545268, 2973722, 7366213, 2698372, 3459652, 3709749, 7456968, 5715018, 6636305, 3729062, 2833227, 5879416, 5406117, 781615, 175863, 3865580, 758176, 7744206, 1914882, 3120618, 2651096, 4603140, 7295198, 3506041, 8027845, 6210098, 1990501, 481437, 738205, 7897895, 6898338, 3479403, 6065228, 1841662, 4888726, 5598386, 4785758, 6837766, 2940975, 5510652, 5643773, 136423, 1407522, 6755845, 7179057, 2688261, 5710611, 590548, 4470456, 7024065, 4153270, 4541349, 1255524, 1645470, 2763645, 5237491, 4706300, 4660171, 6594112, 6630581, 2713007, 2041515, 1356921, 4779328, 4645766, 4886815, 2588029, 8021517, 6658728, 547034, 6488812, 695550, 7160167, 5918762, 2473293, 2593517, 8295315, 4903675, 6734028, 3719147, 6278945, 7178693, 5185274, 4658151, 6935036, 5215940, 7608510, 4824835, 8273998, 1182395, 1045103, 2682146, 4546469, 4300336, 4286538, 4879969, 5527623, 7244471, 7970328, 8244494, 3035012, 5959435, 406435, 7789343, 2657498, 4989012, 4216523, 1517667, 1305321, 2069601, 4984735, 2441342, 7585824, 808842, 5170240, 3292273, 8316001, 7809544, 2347137, 3664902, 6421568, 159731, 7118092, 6828866, 5760482, 7265976, 4698602, 3411936, 630024, 6698406, 3395223, 5958735, 6984905, 3132440, 5621114, 3995504, 665568, 860449, 6580675, 3448746, 2229821, 7529207, 2649775, 1186071, 6234692, 7451976, 5762821, 94247, 7157366, 2833082, 956459, 4569649, 7715883, 8347776, 3006275, 7370970, 3734708, 1919084, 1977095, 7337386, 3680085, 5355607, 3207798, 3311878, 5514375, 584253, 2992778, 8006776, 3190562, 2915892, 3330467, 4622787, 1403118, 1990601, 4541749, 1470908, 2429084, 8328944, 3586219, 4686514, 395647, 5842073, 7234799, 2799072, 8083849, 5322562, 6654064, 1847701, 3797747, 18947, 7948329, 4491608, 8137493, 1173344, 2517742, 7933058, 4604314, 721883, 8211781, 5384837, 5009467, 3658001, 426518, 1734177, 7951028, 3635905, 1247086, 3633795, 5283865, 6420083, 3145285, 7214906, 2035587, 5784531, 3303010, 6178688, 4631632, 6579312, 4227601, 4462950, 3101417, 2149614, 3336063, 2110448, 5784497, 1220553, 4096902, 1750082, 3145805, 3217584]], +[[5683391, 3710350, 92719, 1308362, 7290103, 3944071, 753228, 2477620, 5628327, 2844743, 646481, 1331593, 1103650, 3107746, 7647179, 4318608, 7294668, 2756838, 4884808, 8285339, 1269566, 1770852, 6974741, 7195195, 1683878, 104725, 7371601, 2657716, 4117127, 3054077, 230785, 1503264, 6762082, 7512641, 5998732, 3430376, 1376117, 5125504, 4495264, 4616177, 8234425, 5948466, 7945236, 2826866, 1747539, 5382666, 8271396, 2763986, 1798221, 5617535, 4514790, 3912812, 910278, 4430894, 4472792, 920498, 7831594, 3391036, 8159560, 4482961, 5644483, 3970881, 8317951, 3361483, 4832442, 5727054, 7668045, 6812533, 6952711, 746664, 5874158, 239779, 1366675, 3864332, 1890651, 1171664, 3421772, 6882534, 333444, 4431937, 3877383, 3518335, 3967629, 2426444, 3732139, 2315628, 2950494, 3869759, 966542, 6758356, 5071254, 7497892, 3562349, 2725540, 2100949, 4875092, 7950602, 7973212, 1293637, 7783907, 8184304, 6914214, 6956953, 678440, 3964167, 5019123, 2953816, 33134, 7103616, 4771436, 374294, 4967828, 2195906, 8286830, 1905910, 417751, 7106533, 6082346, 1943376, 1115236, 2587573, 2862562, 6824032, 3597436, 5275150, 7812016, 6019254, 5462659, 3384997, 5497100, 4397929, 687520, 6166316, 2144845, 2358303, 6942245, 8138531, 815541, 7603570, 5018190, 7009997, 710061, 1576455, 212713, 7094710, 2670726, 1384932, 2476995, 3000927, 627627, 2155112, 7340356, 1188666, 4001321, 764087, 7106602, 6550930, 5399850, 3375346, 3708768, 8144182, 4709848, 7340111, 6745872, 2635217, 1414146, 8165502, 3657014, 2963298, 6118933, 2423496, 1794421, 3722883, 2062261, 4583571, 6265227, 1970404, 8088295, 8002594, 8368139, 6288791, 7387656, 5171444, 7477085, 6576009, 5466034, 2704096, 8268019, 1925743, 174523, 2530070, 2560462, 518848, 5671761, 6596698, 5486552, 584502, 2382640, 7166679, 3495914, 4669506, 132828, 706321, 34309, 2170945, 1739874, 4124945, 8312651, 123306, 2794030, 5326396, 1432097, 3395293, 74078, 4861039, 6015628, 6213190, 4649215, 1570113, 5446964, 3260667, 7749376, 6487671, 3664254, 2236782, 7021557, 696484, 7911555, 1086990, 3198664, 17850, 3683312, 3288003, 4217996, 555822, 4614956, 6176937, 6459481, 7876317, 4893512, 7383955, 7940986, 1675795, 7770017, 4412811, 7626775, 7813763, 4350655, 2087956, 2026481, 5154897, 3610764, 6676835, 331133, 3184716, 637448], +[3845441, 5948345, 2526079, 3527655, 8340658, 3871182, 5148928, 5273305, 4432905, 1891173, 5260826, 6465732, 4540806, 2818528, 4544029, 4430633, 3482639, 2702517, 5146042, 6419635, 1109684, 2372543, 8311838, 2085052, 3507878, 26762, 7716435, 8042736, 2138382, 7979425, 76163, 4807471, 3606062, 7946765, 330929, 734329, 4104102, 1808857, 477449, 8163261, 6971057, 7843251, 4927691, 6677920, 7665717, 3750609, 4701258, 3058870, 1251659, 6129335, 3556202, 1283857, 7630073, 1124997, 3130214, 1734737, 6007745, 4348698, 1397023, 7082059, 1163772, 6078529, 3517091, 4020385, 897223, 3798751, 7959469, 5063932, 1267106, 52148, 5430708, 2714705, 2666072, 4875376, 1226832, 6721928, 5063888, 6380967, 933788, 2481579, 2263113, 7780343, 2048034, 987223, 2698835, 4314650, 4962142, 1974605, 4487825, 898178, 7427615, 2636860, 2146730, 384510, 5570125, 4600025, 2744349, 970545, 341361, 4100257, 2926654, 6861050, 4939857, 5174127, 2490985, 4322473, 6611647, 6683729, 4435760, 3273613, 4556997, 904654, 536191, 1109818, 6632377, 767075, 5487421, 1211712, 3135240, 4474932, 7124961, 2680467, 6172472, 637392, 1445508, 1741521, 1569219, 3534604, 7302355, 6016112, 545828, 4227739, 5696466, 5642100, 6919350, 8144659, 1677477, 5773615, 874454, 1757969, 5750019, 1593476, 6362379, 1713607, 2706621, 3233779, 6479540, 892299, 4636373, 6377149, 5664978, 13120, 8281728, 5159402, 5696454, 5605574, 4653622, 1817441, 171885, 4374113, 3492702, 4162724, 7346068, 4733212, 2311547, 2477432, 6274796, 5416878, 1617111, 222937, 725686, 7257772, 6728147, 6471494, 763061, 719071, 6524550, 5519922, 971694, 2743166, 1508664, 3216851, 1060612, 6929127, 574077, 3871271, 3989461, 1099586, 4101828, 2818783, 4684972, 4972365, 2089600, 43683, 4556841, 7602949, 3615224, 3810031, 3427704, 1895016, 3547470, 3704258, 7424605, 6413426, 3248473, 2785536, 1654293, 3783061, 3425238, 3710350, 7102589, 7479478, 822457, 5167322, 6826453, 87829, 5699697, 2120761, 6801762, 7653895, 4940055, 7463717, 6572931, 7651737, 1239232, 3285823, 5308731, 6587411, 635269, 8068897, 7814186, 7007527, 6594288, 4494652, 4786689, 6077348, 4353010, 3982747, 2629676, 6452340, 2511502, 5592118, 7629882, 7821505, 4997854, 4071122, 177996, 6561917, 3801074, 10598, 6352643, 3098145, 4116065, 1527167, 7537296, 1578787], +[3891096, 6185093, 4971478, 4257325, 1020462, 675281, 134694, 4822802, 5810277, 3955271, 1491528, 3794827, 253530, 6428696, 4818163, 2884145, 2903266, 298298, 4603064, 8160714, 5792499, 865799, 1619577, 533766, 6972000, 6098559, 2326570, 969769, 6130060, 4397918, 6968167, 3637012, 7283379, 6301530, 6195231, 7955036, 6469135, 4020548, 7853350, 7961177, 3028661, 5220419, 6277568, 4695048, 4029424, 8010317, 4689206, 7720318, 4002318, 1113351, 2234670, 7906967, 439390, 5063227, 7370501, 7895781, 4524, 795561, 3628925, 4723394, 5398137, 4562159, 807714, 5878753, 4272113, 1357717, 825704, 5887330, 4319744, 4196390, 6727146, 7306212, 7203743, 2697266, 4687508, 4697954, 2530266, 3688268, 7307078, 2964441, 3293843, 5911467, 8214149, 5127001, 671444, 6351888, 6998433, 3710780, 643318, 5062735, 8069513, 7433864, 1807428, 5642159, 2721109, 2096781, 5836671, 1518576, 5844253, 2863227, 2592012, 479290, 549486, 433947, 5491622, 2252945, 3090577, 4722684, 7096096, 5137542, 6307772, 5188696, 4497272, 7105336, 1756597, 5072162, 3158415, 4870493, 107132, 5609711, 1827485, 1840804, 3017463, 7261892, 5897131, 3893754, 2336067, 3534738, 3862427, 1668761, 2059021, 1408013, 2645537, 6802499, 7345627, 6877105, 4304158, 1135307, 3684153, 6344078, 5869579, 5248261, 6501, 4693562, 4705703, 41217, 7487942, 77835, 1222738, 2992465, 322889, 3158864, 6610809, 4150224, 1441527, 2152252, 7620592, 7839794, 7057093, 7546652, 3054583, 1998065, 5085277, 2923084, 5624592, 6130206, 3219899, 2027486, 7892198, 7381486, 5754551, 7300624, 4279935, 3771460, 2850110, 1323702, 3628136, 7404930, 5343431, 6826326, 7577609, 119856, 2490216, 3433424, 8281375, 7149694, 7470393, 7906970, 5758272, 1139062, 5235439, 5968308, 434025, 6653678, 8324197, 3846059, 3352235, 2432978, 461841, 718037, 1241021, 6979115, 218058, 3620647, 5247186, 1630029, 1422383, 405956, 4371450, 1083953, 3691402, 7412225, 2952833, 1155508, 4630029, 6642268, 2222359, 3074423, 4496171, 722030, 1933910, 7783306, 5363795, 4241947, 4478330, 6369040, 2701766, 2893780, 1619372, 6732951, 384933, 587101, 376500, 7168867, 4352422, 7298991, 5641566, 3365784, 7788116, 280828, 3611013, 127448, 6495127, 3602655, 4039854, 7342936, 6614505, 4220213, 2049870, 1984412, 1135319, 1485097, 1820592, 1367085, 5005544, 5806867], +[5490328, 6103382, 7375552, 1282221, 3029624, 3110897, 151679, 1735155, 5636900, 8126990, 1822332, 320718, 5264538, 6595771, 7535240, 1176690, 4927375, 5026013, 3009081, 6115026, 4933795, 3745120, 6615052, 4593525, 514722, 4739787, 5181504, 8049019, 4876778, 680977, 7823729, 7102549, 1731093, 2650587, 7288671, 7007274, 2329313, 5913831, 2625239, 1421543, 4096507, 5287827, 7741390, 4467290, 4934718, 5941948, 753373, 1958841, 6845215, 5533006, 5176679, 339157, 5901403, 4314943, 2052431, 4561751, 8256012, 311349, 8016485, 4340808, 5194472, 3475832, 5959032, 7415319, 7054535, 5058689, 5662985, 4728338, 1899776, 2812415, 7321986, 706825, 5980822, 8303324, 2917536, 7593600, 634645, 190380, 3762069, 3640030, 1337266, 2747661, 2134756, 6449709, 2186332, 8114154, 4930325, 1403549, 7856665, 6036945, 2567732, 557921, 6034843, 7263045, 2796676, 5289811, 2167016, 4190744, 2692845, 5648414, 3505129, 1677213, 3177843, 4018468, 6093027, 5311844, 7524766, 6330320, 4846043, 6672832, 6410792, 1134778, 1435678, 6954372, 8332817, 5592628, 6524481, 6584781, 2969407, 6682130, 7722806, 2292745, 6806724, 7580684, 1286847, 2361421, 4195108, 1821989, 2594429, 3725881, 8082694, 3927265, 6173582, 7435094, 7974320, 2663486, 7826202, 174879, 1787137, 7009547, 4990512, 5055362, 3292997, 7550092, 6894673, 2323713, 7943700, 5251060, 6784237, 6975398, 2847573, 631158, 2767586, 7384238, 3609378, 6410445, 7439884, 8325182, 5570429, 1838353, 6650691, 1047299, 3756663, 1947278, 367966, 1371153, 1193339, 3048657, 7415152, 8245192, 7239919, 5509247, 3838864, 7020648, 4552428, 7039101, 6660695, 8364395, 7548446, 1795311, 2262848, 7388484, 968001, 7165526, 6934633, 3201576, 3398382, 4326142, 4988619, 58103, 8206263, 7471474, 5800029, 4648766, 7643818, 2706946, 7690640, 4191529, 1932311, 7548429, 1618612, 3822340, 5674483, 398672, 2183801, 1417526, 7678333, 509238, 8288451, 3993762, 7699208, 4897923, 4062488, 5912152, 7263613, 2633162, 876336, 1318836, 7965983, 2964620, 3043715, 6108188, 712841, 4418616, 5403849, 2627894, 2517626, 5918639, 4777756, 150791, 81461, 6759800, 2272791, 3839455, 5446312, 6664687, 7620308, 2740215, 2187833, 6951716, 3506031, 4437310, 3800782, 5251191, 7359081, 5375135, 3263448, 1005779, 8174544, 1089636, 1270856, 6781891, 4956628, 6664988, 7957389, 5791918], +[1960391, 6492981, 2680159, 5794776, 2695689, 2994834, 4319039, 2802253, 5456051, 5880760, 380440, 994922, 1273115, 973634, 1330084, 551564, 4507054, 2810921, 583228, 2882919, 917977, 245061, 2491996, 3112425, 3368498, 1925914, 5961626, 6760898, 1678195, 1608615, 3952754, 2755186, 7601800, 950361, 3833227, 7413328, 3301678, 5924922, 6817243, 1431720, 91360, 2995101, 4507620, 2729246, 3477020, 4551907, 817811, 3127024, 2405339, 4054149, 5605307, 5248727, 6087820, 5749850, 7714642, 6728393, 3591532, 577585, 6473552, 7522817, 1392819, 6880935, 5312690, 506945, 8091145, 742929, 6799260, 2652586, 7452729, 4541860, 3381481, 3061014, 3376644, 5481519, 5731437, 1932141, 3621310, 5147332, 806862, 7357747, 4986069, 4576253, 5069876, 2652690, 8064760, 3839600, 4424535, 780086, 4691504, 1699483, 5974470, 8020211, 1201612, 809656, 4464587, 7252763, 6052120, 6076335, 3083068, 3168047, 4957750, 3478661, 835216, 584933, 4127478, 4942548, 2728615, 1054891, 4836533, 3177007, 2577866, 8073339, 3264847, 6210100, 1043897, 6918130, 2532474, 6341590, 413784, 6546039, 900589, 4908413, 3854232, 1298302, 8293745, 6435805, 5588713, 8162310, 5733943, 564722, 2568541, 5535776, 1334324, 1698880, 506678, 7038492, 6452016, 3572627, 148130, 3717450, 6821979, 2914494, 3924012, 1545574, 8276309, 2424409, 4448223, 7133022, 869513, 5849107, 8117963, 3771355, 8324513, 562863, 8346779, 7642036, 7777906, 6411315, 4438572, 2928891, 4155741, 5247557, 948670, 5148880, 2836540, 6068476, 2790331, 3860362, 6130088, 3493728, 318684, 1574949, 6425420, 6630654, 3591850, 5439494, 6254389, 5600976, 2534116, 4057493, 3751239, 4348479, 6989249, 2345693, 654691, 3403550, 691586, 1979429, 8064223, 4606604, 739758, 548107, 5179586, 2730203, 7257148, 2610058, 365507, 1384500, 1967234, 1705797, 6700681, 7225578, 7389586, 6165942, 922604, 5114800, 7891846, 1154582, 3049978, 3867059, 6029908, 4114632, 3496583, 6250390, 697990, 5041106, 4313626, 3439979, 4213705, 3476530, 7441723, 4038065, 5458545, 6069422, 5275723, 538502, 8104834, 1741116, 5251792, 1927295, 1078520, 2405168, 3132377, 6658912, 2024428, 135843, 894294, 978881, 156397, 5845025, 903581, 7596297, 5894171, 741065, 1568180, 1979423, 4668001, 5184514, 7454511, 6928227, 2360543, 2878160, 3997382, 7975802, 2949452, 5117284], +[24448, 911491, 7427273, 3055044, 6727997, 1380282, 1024871, 7315650, 1758021, 5081711, 3522078, 3823749, 641736, 4837778, 247446, 6899785, 7829133, 4293145, 5196979, 7771104, 7351477, 1468067, 3457945, 7194757, 7472864, 7116529, 1379297, 7875722, 4722927, 8125863, 2373250, 4752283, 7397445, 3101527, 8218504, 1096673, 2314375, 3296859, 7363912, 1815690, 2998871, 1200499, 8260569, 634424, 8258449, 6894614, 8285099, 141189, 1949477, 8040110, 1786560, 7358607, 5017383, 5295747, 5585198, 4398961, 3653257, 4645692, 6961420, 7294531, 5967803, 1051854, 2995747, 5678452, 7377075, 1447653, 6063890, 1270842, 3865195, 4744815, 7998826, 1064391, 3606436, 966076, 724279, 8196623, 985045, 3944293, 3044492, 7283955, 988148, 681120, 434246, 345234, 5945994, 3692422, 7323481, 3316639, 4844627, 5288159, 559594, 2447028, 1454464, 1765968, 3869036, 2189817, 407292, 8179694, 5477854, 227526, 925453, 7975518, 824609, 5699764, 7844466, 2053154, 3982992, 1350080, 4486299, 1319191, 3664229, 6996815, 7497336, 659671, 5732007, 6343583, 4360474, 4174342, 8106737, 7085598, 7445358, 4795540, 6007096, 7363100, 7571393, 2467383, 3261958, 750473, 2092204, 4523560, 5954472, 7733481, 767316, 1731503, 4690616, 7602015, 8267516, 173659, 6240898, 4452819, 948704, 1582705, 3485660, 5320108, 3364478, 5560344, 1652741, 805836, 2119977, 856448, 3545859, 6269842, 977818, 5482292, 8286115, 5928481, 5545946, 945323, 8064057, 5062629, 8101232, 2361444, 1342352, 5074037, 6451710, 3642825, 967000, 3068060, 5679383, 4875558, 1902169, 7646938, 7956660, 3764508, 7530686, 1489544, 4359946, 3577810, 2163531, 3112585, 6344303, 7437705, 3104641, 2903089, 7703074, 1986921, 6498273, 650936, 7190182, 4977232, 3735528, 1191251, 1268285, 3421582, 7161511, 1539658, 2827847, 5057412, 4975728, 5574462, 6753096, 5757133, 2298886, 7952150, 1147000, 172458, 7337009, 1366819, 1902206, 3817146, 3153154, 6804049, 7253881, 2060635, 1315198, 1301267, 1231714, 1867468, 184067, 3629133, 1075220, 8184728, 7934963, 6465061, 6187164, 3396129, 549001, 3820231, 7577133, 332606, 7740569, 6964709, 517732, 4604688, 5573216, 521069, 7563427, 4203692, 1143995, 1523296, 6740048, 6728098, 1281990, 1608403, 856636, 1488357, 2426433, 7966635, 8157559, 5277437, 4963441, 2998979, 151003, 5975265, 2337800, 4791086], +[853006, 3965114, 5798521, 2355536, 473987, 2094950, 1746940, 3439199, 2184668, 1528327, 2814729, 7208660, 739852, 2295255, 1239273, 770499, 1130010, 7149225, 965208, 2409132, 5887529, 4581272, 7786968, 6556903, 6112103, 5435067, 1716408, 2924294, 2646088, 3190283, 3499688, 1778366, 7772718, 4874214, 2787961, 457558, 254830, 942496, 767122, 5419708, 2192423, 7273882, 7413199, 3336916, 233451, 2108313, 5041745, 3389504, 6217239, 1702498, 4738958, 300807, 3472322, 3902738, 5011384, 3733792, 5222317, 6948108, 1111755, 6517087, 2914158, 7000117, 4428692, 4450110, 5443175, 877295, 3646490, 543826, 3563968, 5868858, 1436491, 3674677, 6746738, 6136970, 2441634, 3309425, 5499044, 4424694, 1161656, 2693751, 6636057, 1239961, 4920262, 5871366, 3502632, 5116544, 4911027, 1612766, 1034534, 509103, 3278852, 5908563, 623688, 8056947, 7735596, 1914792, 5900891, 7691411, 1316995, 6751492, 810226, 3353662, 2661343, 4458342, 5917673, 3109593, 2208143, 1009948, 4987592, 4786600, 6984048, 1898867, 6400767, 2620334, 3692795, 4464587, 5231992, 6303993, 1797052, 2853704, 6417686, 6782822, 3650870, 4488170, 4025408, 5710940, 616570, 4476180, 3569417, 2565452, 3734889, 911583, 5755623, 4754613, 5320042, 5568908, 4826025, 7685369, 984166, 2446207, 722936, 4592228, 3614133, 44202, 289014, 1906484, 8058444, 2875352, 7368410, 926432, 3777554, 7015834, 3606747, 3836257, 63917, 2656071, 2646224, 53954, 6673012, 2562718, 1420073, 1635984, 6575278, 2069706, 6629513, 2293698, 527493, 3846643, 2241747, 3736104, 3223765, 1533664, 1474159, 7819457, 7650427, 7950472, 3346343, 690335, 491626, 8119383, 3341691, 4319927, 8162307, 7444286, 3747712, 3440703, 3469757, 5985746, 4225955, 705945, 6439342, 8093677, 61798, 6626687, 4309974, 8262902, 844978, 452, 8044627, 4068662, 4044885, 7791150, 5185798, 2216436, 7238558, 8025482, 5205687, 5421381, 7276796, 3546405, 189627, 316710, 5752157, 2501730, 4811974, 4010658, 2011957, 6306560, 3965919, 3731480, 1399952, 7493624, 1997305, 6885143, 5167542, 5304802, 7896963, 4466286, 5230402, 7533362, 7552379, 2209957, 5255290, 2160918, 7922991, 1650354, 7646074, 2821172, 6992810, 1060641, 6475595, 3694520, 6826389, 684812, 6687845, 7118866, 6151799, 6938089, 5613508, 1617252, 3806555, 6052647, 3375998, 460657, 3113800, 6571280]]] +s1Hat: [[5795647, 3150302, 5761214, 72796, 2266350, 6924562, 6191710, 4214634, 1336751, 4238696, 7592796, 2159125, 5848504, 4844318, 6573695, 6686111, 8357433, 835445, 157395, 7303916, 6588758, 837730, 843272, 3312442, 5643095, 4080364, 4048366, 40873, 6396702, 4747670, 1570463, 2326475, 6561750, 8025716, 5633476, 4483686, 1462341, 8359766, 6737641, 1956744, 3404848, 488982, 5751175, 6906454, 594413, 8363428, 4389333, 69269, 3815336, 1348627, 8373909, 8365022, 3482251, 7041865, 7306425, 1550567, 1882569, 1912996, 4143590, 5074495, 1167162, 3102841, 7989002, 8149533, 965003, 3366442, 3684153, 1175633, 4883063, 3718574, 6246334, 419135, 6753720, 8152352, 8291950, 6602975, 17937, 4220092, 3027474, 5379264, 2275, 4097168, 2107701, 3391767, 5314207, 901476, 6010766, 5729071, 3941058, 3815443, 8116932, 1738505, 7047820, 1162479, 8072637, 6611116, 119081, 1003931, 164033, 8007953, 5333731, 1003603, 4807358, 1249177, 7575880, 450378, 6591435, 7369346, 3775550, 6506459, 5340081, 6999878, 7190151, 5226240, 6058982, 4368572, 4138180, 7381248, 8267598, 7793721, 5114279, 3283739, 2251895, 31698, 3922389, 6263873, 4184574, 2427319, 7835643, 4506324, 127266, 3526243, 341269, 650594, 5224491, 7269124, 6417481, 334377, 616254, 7992832, 6154385, 3077993, 4950088, 2362844, 1886191, 3040677, 2510860, 4119625, 2085030, 4844539, 2904940, 5945485, 4467886, 4119194, 2582006, 7176134, 1280915, 31882, 6730022, 744177, 2428141, 2200455, 6888105, 2288192, 3562211, 1551121, 5633473, 6685202, 2707345, 2233115, 5824472, 77656, 523169, 1414621, 3560903, 2469298, 5009442, 7898198, 429315, 7750314, 6367769, 4612983, 3327000, 2340908, 6568536, 6827196, 3399524, 7024260, 1375254, 5830403, 2319527, 3958281, 180585, 4394514, 2005930, 3666266, 5734950, 1688091, 4629570, 1305699, 4499339, 6296001, 4961620, 1882644, 2512083, 6741794, 827858, 1385426, 7712054, 712049, 328281, 6091668, 1355595, 2707459, 5816135, 36351, 5821274, 1804511, 6819135, 6253963, 7284305, 3071199, 2912600, 200908, 4689401, 1908853, 2322028, 4586006, 7818432, 6550217, 8120410, 2352478, 7213643, 1872281, 5294908, 7478978, 2193154, 2795257, 1499615, 1611547, 5515853, 6449513, 2335204, 3381388, 7342801, 164336, 6575088, 4012267, 8253357, 1915394, 6062895, 2950942, 5508741, 4385532, 3180426, 818743], +[7151875, 1460286, 3779147, 2797845, 4811306, 5419464, 6753226, 5694248, 2370198, 1786178, 931182, 7859667, 4212058, 1252827, 7958658, 1353091, 4208922, 4421226, 2746249, 4722939, 7755899, 4959990, 965729, 6519033, 3659620, 5159830, 6887304, 4009839, 1618838, 3429110, 4010083, 2883381, 5682293, 7114304, 8187150, 6030738, 6272538, 1801148, 7770281, 6220736, 6067318, 688099, 677184, 7548805, 2791915, 5556038, 7971323, 3794919, 7032458, 5825575, 4548090, 4995366, 2994003, 213799, 5634793, 2760494, 4801623, 4185089, 7725355, 4477619, 4494551, 2172618, 7718530, 6066283, 2144979, 7244906, 4148645, 713253, 6202226, 6222332, 6029876, 7831357, 6023837, 1308989, 7736208, 6539395, 1099109, 4187155, 364971, 3117229, 7409649, 4102620, 7357000, 3265697, 8089895, 4385210, 6246408, 7538926, 3462686, 2208874, 1368532, 5892036, 3946331, 3694260, 7208729, 817649, 1924077, 4256761, 2689823, 4165659, 900897, 6815584, 5327960, 4232581, 2277362, 3516382, 2494122, 546984, 1506704, 4063012, 2418940, 7495887, 871147, 5007958, 5369712, 6956562, 5521691, 1918109, 8366343, 1195651, 3514248, 846301, 5116585, 2975539, 2144316, 7622382, 6159253, 6692053, 1086452, 2052779, 8299643, 1160535, 1328966, 7427487, 4180778, 7718281, 185624, 2672762, 900197, 4636933, 4743192, 5325988, 5083166, 3213145, 2489648, 3807530, 3198620, 1029556, 1187414, 7984371, 8106531, 6186659, 296074, 3776452, 5632802, 5457021, 917438, 1935963, 1106681, 5121716, 5208847, 8188872, 7691062, 1216545, 8312888, 5129642, 4664147, 2989029, 88805, 3960967, 558279, 7079551, 8034422, 8306258, 6492685, 779099, 5719596, 1258639, 6852737, 4645572, 1550886, 1772755, 7676385, 295344, 1434580, 4308662, 1117011, 5379707, 2183429, 6827463, 3081078, 4353259, 6870390, 3228048, 2506658, 1359078, 789929, 3937603, 2346512, 5293653, 3775686, 6009227, 6089431, 2388938, 96981, 7919616, 5647575, 1362269, 4205221, 925980, 4139068, 2840967, 1148588, 6517475, 6164119, 2794406, 6208963, 7039692, 7639253, 4342331, 429917, 5224776, 5446088, 291586, 641054, 1881035, 446264, 3898200, 6589430, 6061339, 3754558, 6745543, 7046183, 5474018, 7447495, 5101052, 2821590, 5992416, 3866877, 5765950, 1596148, 7417539, 1430171, 5847174, 8349914, 697355, 3460737, 2294578, 3626548, 7912444, 5221528, 6085186, 3238008, 4173425, 4917828, 3073901], +[5165910, 7508523, 6136157, 7092897, 1989069, 5382216, 4537391, 7269969, 61242, 7729887, 2235094, 4825796, 1463414, 5391268, 7043218, 2056267, 4616504, 1333028, 2880498, 5343036, 4323425, 1190874, 6144562, 6417547, 1067841, 3085417, 3815701, 5988306, 8041686, 4181803, 6164865, 3594826, 4882806, 6916121, 3501199, 3563633, 7510370, 8108, 1777842, 2982607, 5095312, 4167266, 4465534, 7963731, 4141136, 3860294, 5313402, 4505358, 4987184, 5383760, 8027012, 5017245, 778248, 170575, 3380103, 2499811, 7443783, 6401947, 6404624, 924632, 2848401, 734228, 8195474, 324676, 2133477, 7902597, 6332337, 6059523, 4501988, 95105, 1553797, 337931, 5253085, 1645715, 5995282, 1238538, 1998690, 2765405, 1094983, 6263371, 4035926, 6292372, 8320046, 8012173, 1119137, 1898875, 5529768, 390697, 1266807, 6756123, 544335, 6591132, 1689751, 2141708, 5458817, 407063, 6093385, 7091704, 5794026, 1624416, 6634659, 6014887, 2068641, 5014960, 4902572, 384896, 7398651, 7470390, 4215288, 1418897, 7743411, 7483555, 5712419, 6342296, 3514360, 5654700, 2168407, 806193, 8046287, 6786917, 3470178, 7919698, 3117736, 8249459, 1106705, 134851, 8315549, 1824190, 5341004, 5384861, 2377042, 3764106, 3781293, 7232654, 5804693, 2570019, 5187771, 3291296, 1053566, 5390852, 1806844, 4176210, 1031824, 8037171, 1102287, 4549996, 1682869, 4086803, 2207521, 1476853, 6155709, 6021544, 527068, 6021873, 3420479, 3791561, 4564909, 6884226, 2297416, 1001014, 3456304, 7978168, 7864081, 6474704, 7294567, 189002, 6730217, 3844279, 5216942, 5246428, 1344024, 139635, 6787779, 5089428, 512388, 7568327, 2201671, 2612616, 3792887, 7967057, 4251140, 7612127, 3697913, 5951767, 5829773, 6842557, 7771544, 7174683, 4272439, 2821249, 740958, 3276280, 4691924, 4523318, 8291494, 1114377, 942976, 5930280, 6392889, 129435, 7493961, 7394628, 5811217, 8048889, 3454984, 5598482, 1823487, 6356935, 2428931, 2982560, 7522215, 4855245, 6180155, 7365317, 3477330, 4305342, 2715920, 5428577, 6688879, 6910687, 6007482, 6538858, 3581829, 4143429, 866402, 3662964, 3341130, 2942034, 4964150, 2376352, 7649915, 8237162, 3944038, 4736098, 6277242, 7393356, 2299012, 1211658, 6331808, 7544530, 3486398, 2180438, 1240594, 119391, 8373658, 2098556, 6702493, 2279223, 2636458, 1633123, 1366292, 624488, 4723119, 2743833, 4712575, 5402758], +[7026961, 2185768, 771806, 2120769, 3125969, 4544875, 5402957, 8030344, 7563176, 7342287, 2150838, 601073, 2617396, 4125810, 7853309, 6589193, 8959, 3712147, 3358323, 4776550, 7016772, 2964318, 7010311, 1660424, 7734119, 3365715, 5173906, 486936, 5594242, 969764, 2021290, 6996729, 5060171, 6697597, 6758739, 4889942, 6986108, 6361676, 6904128, 4594704, 7799568, 1539724, 2911783, 1103743, 2880017, 2045171, 1348006, 1504456, 7285949, 340418, 741003, 5908881, 1095654, 1463671, 7603542, 4091705, 1585982, 71557, 3623030, 3216250, 4259381, 5235021, 520420, 675712, 6629205, 1949355, 3470421, 6290423, 7451369, 4690422, 5284380, 4515335, 5935319, 153859, 4893579, 5340490, 4700627, 3909859, 7278600, 2837372, 2912009, 6293666, 8295140, 7236660, 2423974, 2085137, 2593864, 279419, 5167864, 6303428, 7487194, 761023, 6199022, 4479322, 5657905, 3128634, 1937528, 460640, 1248529, 1302242, 6746045, 6566765, 8285194, 2194889, 6972238, 6175678, 7870543, 6145773, 5043305, 5400229, 4630279, 6540563, 5930843, 7020425, 5595285, 5047063, 1781759, 6928296, 1338247, 5591596, 2741032, 2636007, 2345111, 190488, 2601299, 5756273, 5213801, 4168872, 4267666, 6921630, 6784253, 2751398, 6484197, 5662911, 2528542, 1508946, 329989, 6175241, 7748090, 3001740, 9818, 6329820, 775880, 2877728, 3084025, 7647566, 3684286, 7604994, 7996268, 2241346, 749932, 4171599, 5592726, 816871, 7574647, 2406175, 7382081, 1709372, 4000657, 3201538, 2550042, 5568818, 3842756, 7659492, 1716586, 5342806, 5887976, 2797303, 3126430, 7135256, 8309606, 8149823, 5957802, 6431071, 2712321, 8349006, 1919608, 1644339, 5554624, 5584696, 3485605, 2877607, 2967940, 2309440, 4109165, 2604769, 8195600, 6453514, 1424412, 2981345, 5812857, 3079824, 4769177, 2392579, 6894709, 211496, 1737234, 7559766, 3944753, 3951976, 7904260, 4422540, 685409, 1764823, 4526123, 6230055, 1443615, 6542238, 2207956, 2487931, 1534268, 984098, 2352007, 624699, 2864845, 1598074, 5669258, 4207264, 3516109, 867375, 2270006, 7192518, 8327083, 6000744, 775704, 4197481, 4063685, 7415846, 5358554, 3110982, 1431613, 2740900, 8056811, 7823520, 1825369, 3186987, 7456629, 4327904, 7223114, 1310325, 7467346, 4488442, 4311034, 8358601, 7543833, 2927441, 1133996, 2729071, 2477822, 944967, 5969230, 503031, 3554560, 7330726, 3495026, 8234914], +[6566183, 901367, 2269152, 8292510, 1269082, 7261436, 5166259, 1844722, 3308544, 2302256, 1847468, 3412069, 4618800, 3783586, 589875, 3149388, 1493546, 3054257, 3587331, 4242579, 5566465, 4004656, 3907398, 3386721, 7951057, 3703483, 5433244, 729306, 4447645, 938700, 8181275, 3941198, 2772777, 4605282, 264408, 7611068, 2332180, 7379542, 2644429, 553541, 4829457, 3074836, 5249797, 4422426, 7568354, 2154788, 1431233, 4658516, 4330003, 7852314, 210629, 6169362, 3661390, 6549808, 625479, 6925257, 1058095, 6186815, 2920319, 5391179, 2377458, 4425075, 4006271, 6336568, 3181977, 1064531, 1109405, 4701303, 3674475, 6826404, 1070590, 5406092, 7557045, 1687647, 2182774, 5416564, 5715716, 1950187, 3372938, 5526493, 513838, 6454315, 2690288, 3817220, 2739903, 6356034, 5738195, 2804915, 1740419, 962179, 5224932, 2467224, 7933513, 2189779, 4019734, 5493399, 6497170, 7177221, 2081757, 3905860, 5965021, 1660417, 7859251, 2179465, 7837722, 3253249, 4927275, 707373, 1730562, 479222, 7603177, 2079727, 6099948, 5658629, 5679252, 8242212, 7953675, 8009643, 6832543, 7249526, 724568, 3871205, 2124720, 2877659, 3617522, 592087, 3959253, 3150182, 6948062, 8347087, 1965646, 6855942, 2541747, 8214023, 7012450, 4844515, 6545379, 988839, 5348637, 5031618, 7026672, 4898913, 5268636, 57317, 1834392, 3575704, 6358870, 2722534, 5033800, 2466890, 1694408, 3502678, 2822948, 6723141, 6884537, 113724, 7482520, 2363175, 6769809, 8353865, 3631863, 5416185, 5865219, 6645725, 3066837, 5758482, 5052706, 4060678, 3902119, 2067721, 2334366, 73892, 4741400, 7103102, 6763010, 6798453, 6691505, 7372247, 2323302, 7330471, 8283747, 4232468, 6900784, 7280079, 3656169, 3088254, 8326620, 2954741, 8259674, 2307723, 3115399, 7806089, 5029624, 2946674, 7252704, 79025, 1346054, 1761752, 7400208, 467759, 6512935, 4410084, 3894827, 4689142, 5825154, 2713021, 7233580, 716227, 2605578, 6738749, 1384755, 2238191, 4384765, 8220875, 1866511, 6521235, 1375746, 2204286, 2984798, 3870519, 4402200, 6386181, 3729308, 8154795, 5591355, 6797872, 995958, 8338378, 5071538, 828690, 4608292, 372849, 432738, 7243132, 349202, 3505243, 528166, 2451964, 6504081, 3021087, 2919609, 788626, 6206825, 6360312, 4725916, 7957732, 5773545, 158962, 1084093, 4301838, 6472987, 6597182, 7933776, 2686475, 3254157, 6527269], +[4754400, 7297762, 1784184, 6577486, 901234, 3072649, 703734, 7142635, 6446904, 3978792, 1105978, 3460331, 328804, 4577883, 3789043, 1898530, 3246250, 1042023, 3543636, 3957541, 7246236, 706371, 6892937, 3442473, 6470, 6476042, 5211050, 6068272, 2098371, 6194879, 5422825, 2785782, 6132251, 4025838, 1498267, 5174312, 4850092, 4513768, 7723416, 6320191, 6828666, 1053379, 5740083, 2732436, 4328266, 1090238, 8347562, 7680568, 4570507, 2508104, 2502792, 7564902, 7639953, 3814116, 1041569, 7883164, 756249, 980071, 5594204, 693709, 3013934, 1961412, 7118020, 7384486, 1501117, 841099, 6818372, 2566942, 7220439, 5917103, 284079, 2459215, 7228428, 5176490, 6975454, 6079804, 2360216, 8058737, 5998455, 5059168, 5996385, 334917, 7250820, 391852, 3588934, 6138841, 4844744, 2541107, 1888105, 1780039, 7591768, 5703902, 4101594, 8282029, 843955, 7076446, 3675124, 1680432, 3253870, 5992913, 2951215, 2309858, 1197461, 3677159, 2375261, 4249435, 7993489, 4225831, 4322946, 2778853, 8072543, 5906409, 2418286, 2337160, 3531001, 1809944, 5086548, 1472920, 6120185, 2055130, 1870572, 6705124, 4261897, 6391245, 1167475, 142302, 1191884, 7589704, 293598, 1616521, 1863033, 1721361, 6362952, 1225806, 98811, 771108, 4943597, 4839603, 1438462, 5587494, 1719379, 515749, 2907436, 7695303, 8374642, 6807899, 2486959, 1391218, 6684534, 7536216, 7483032, 7411894, 2146027, 2062870, 8162450, 4435464, 6817738, 7580243, 6840705, 2917539, 7330450, 2707496, 6303219, 4107425, 943576, 8197060, 4434915, 1484207, 7482421, 3340948, 1746452, 1869957, 6757580, 2692360, 2707082, 6113317, 6755377, 6570807, 2336775, 1121018, 6868684, 7396036, 2105089, 6474261, 1200049, 194792, 2771268, 5929346, 5332695, 5391695, 167409, 4940274, 687476, 1353871, 1388817, 2898827, 4701431, 1067596, 4214096, 3066917, 5649900, 1590503, 6469683, 1398442, 2626668, 3558511, 2698313, 129431, 548579, 2463421, 5218934, 1869677, 4868108, 3343788, 7233175, 1311666, 7751777, 8297024, 7018583, 4902429, 8271601, 19671, 4844348, 5130145, 7805231, 8158353, 723817, 6111363, 1934882, 8172456, 5308646, 2439491, 1179394, 7556971, 7103189, 6605937, 7402526, 8206821, 7077839, 5352934, 420546, 5344376, 4141843, 5792143, 5997639, 5607885, 1679502, 8258754, 7857810, 4211555, 1728944, 6051236, 6515486, 1446972, 2348475, 4100761], +[4180256, 4430151, 2666320, 2063999, 3793431, 5042253, 4874051, 2908133, 3076555, 4839220, 7731176, 1748073, 3869518, 7461708, 444401, 8003022, 7652106, 7110979, 7306248, 309481, 7532431, 904459, 6853198, 1746848, 7971138, 1030445, 6348084, 2817255, 2569892, 6887987, 3075307, 6905165, 1829540, 7788168, 2361658, 2627737, 7452687, 2582402, 6369817, 7012970, 4231620, 4879563, 2196506, 115709, 750309, 6683681, 81279, 2467820, 6788999, 7276340, 6228591, 2371105, 3647487, 7098409, 3099116, 1532937, 900184, 1400246, 4075463, 6691598, 388408, 2802168, 4116545, 8315613, 3360274, 5403976, 6061133, 7856581, 2490199, 4081204, 8352901, 1247142, 5861748, 6847822, 1497612, 7288780, 1985562, 3204272, 7223782, 7139080, 6921679, 789868, 2353548, 3804159, 3404916, 5032412, 640182, 4019974, 1948087, 2245937, 7282954, 5498097, 3512955, 3974950, 1272959, 5346825, 688356, 2174310, 4639633, 3243152, 5999016, 5585961, 1568902, 3038709, 1170324, 4843198, 7062800, 471085, 5065362, 8140006, 4764303, 2980249, 2928108, 2714172, 3496555, 62834, 8000094, 4248362, 5657930, 3146768, 7963983, 4630848, 3303687, 5208522, 2678793, 3361654, 4023423, 6239433, 5049228, 6236682, 2044478, 3317147, 1971873, 684430, 3054978, 2258802, 4597204, 1510693, 4025531, 5081994, 3237172, 7438322, 2338501, 2243880, 4784011, 6754986, 3565544, 4757548, 185560, 1342875, 153027, 7969158, 7190555, 2217310, 706039, 5807232, 6723928, 7993995, 688043, 6774150, 313778, 4136987, 234085, 1068687, 3998044, 6265263, 3266286, 190253, 1557745, 6495130, 1859939, 6627746, 4847265, 937921, 1643988, 7479434, 7636005, 7690048, 678976, 5100305, 1272390, 2886631, 7860728, 4794748, 4287807, 6849071, 4622017, 6233667, 877935, 8223736, 6053379, 4624674, 7702858, 848981, 4836966, 3056477, 7559380, 100050, 5351493, 1462561, 5335426, 7528987, 6458902, 6557191, 4134163, 1061770, 5244219, 8366185, 6442328, 1136862, 4806844, 7219692, 637760, 2577205, 612586, 2119869, 3128725, 5394960, 6063875, 4317098, 7877548, 5463281, 7284286, 935179, 7618540, 2359366, 1144281, 5719589, 3272742, 5723623, 5763522, 886167, 3620419, 5644406, 2737553, 6451695, 7239177, 5588810, 83997, 4391023, 3648013, 2068894, 1402083, 4561848, 1244021, 5015440, 6895509, 8009243, 6745434, 3144483, 4597973, 2344958, 4901968, 7038808, 980775, 1154769]] +s2Hat: [[3209508, 7036837, 1019481, 8003814, 1430084, 2199474, 139020, 5901025, 742390, 7272417, 1353902, 7019145, 1838288, 5031980, 3807665, 3831085, 4252440, 5334906, 2792408, 7955961, 4013657, 2296986, 1197985, 6301629, 5250160, 2822912, 5997947, 6438894, 4331141, 6058012, 5119507, 3453772, 697252, 3546702, 6215960, 5834936, 6204667, 8308593, 923595, 4658536, 3635700, 4331008, 126464, 4756379, 2212579, 5925122, 2597882, 7487764, 2310893, 7046850, 1492034, 802987, 6350072, 3590050, 2797275, 440107, 8130253, 2913279, 1947061, 2629887, 1693333, 5203558, 1228369, 6509325, 3981760, 6169783, 5719282, 4779565, 3972073, 4757264, 492383, 5851811, 3605874, 4918368, 6761054, 6951712, 4033210, 2943796, 3428005, 2226090, 498275, 248783, 7215965, 6584312, 1027594, 1574669, 2157209, 1432094, 2628553, 1300526, 2998761, 6477673, 605871, 4186169, 929673, 239433, 2288836, 5764873, 6075498, 5067040, 5327677, 3259367, 3933144, 6603926, 731559, 3165408, 144130, 6868182, 4283923, 1168423, 6758550, 2778116, 2742141, 1136489, 4196713, 6189706, 1180509, 3445298, 5012921, 6714601, 4699306, 2848232, 4294096, 7777406, 587429, 4730081, 2587284, 5382989, 5322073, 6683548, 2311229, 6643831, 1713828, 5748350, 2197060, 2589284, 3717953, 3602858, 302512, 2558099, 5846624, 4499588, 3880649, 2331779, 831119, 5727833, 1754485, 5827428, 3612340, 1615856, 5635047, 377937, 2995426, 549246, 4864504, 1609006, 4441084, 5380887, 7583171, 2277605, 961697, 996465, 7563301, 7548585, 2071769, 330091, 7241601, 2518374, 3859089, 6101093, 5459019, 4605445, 8069406, 1083607, 7137176, 737996, 4313747, 3308720, 510782, 1417080, 6675933, 2565320, 6922732, 5169623, 2155814, 6608424, 7951224, 5624139, 5642099, 6975682, 5589524, 2731076, 3998758, 2150601, 244700, 1160160, 1157136, 4118443, 1534595, 3374801, 2375048, 3900613, 4103984, 7619186, 6090784, 5406031, 1865955, 5959790, 3597795, 1424423, 1618308, 7172343, 4247391, 7015810, 4360754, 662332, 4210265, 1294501, 4834461, 5414849, 547324, 1938305, 535442, 51833, 3779257, 4838499, 2482829, 7549512, 5480083, 4280709, 1824867, 155267, 3420916, 5649345, 1998397, 6321076, 7018184, 3525535, 6373299, 5890995, 6959323, 2683414, 586252, 6919875, 5021462, 7465560, 7088058, 3041656, 4537404, 2025897, 5567000, 282396, 5631388, 6256411, 4094897, 4609408], +[502979, 7136196, 2995446, 5524494, 3650260, 1096346, 2472865, 1099924, 2961830, 3911172, 5139786, 4353933, 3546805, 3342105, 6055513, 1826107, 4198443, 7705882, 5736653, 216435, 6982640, 4154192, 7319879, 846790, 857725, 7130536, 4839705, 6651809, 1918860, 5465019, 6203847, 2330896, 2827586, 1664610, 8244475, 4955111, 7683953, 2507839, 6907578, 1092359, 30387, 5870744, 3141642, 7265962, 5294301, 423766, 3970481, 5846785, 3703351, 5941829, 1206145, 4406585, 3515497, 5696455, 3029448, 3240901, 4352688, 4100689, 4783892, 7138516, 4419043, 5771858, 1982142, 6106737, 3932769, 4881039, 5541803, 1499834, 8089525, 3689223, 4349332, 424146, 3629370, 6447543, 4837033, 4633646, 3415298, 4972861, 3164796, 1952998, 2186311, 2271464, 4190594, 5387389, 6513, 1143786, 8172469, 3621508, 2447248, 1806380, 2844301, 3686883, 2464952, 1434602, 3882685, 6854124, 7682009, 3488313, 1415535, 7467525, 8016600, 5375799, 1724035, 2420023, 1600623, 8299591, 2214653, 4545011, 1754054, 8093238, 8246662, 4143922, 7040809, 1702698, 5097966, 4861408, 2424307, 7680756, 7841188, 6238676, 2889774, 4523497, 5781576, 4458286, 2248470, 6610452, 7711043, 3265984, 7693666, 1545999, 7000471, 1825508, 607713, 4574607, 791637, 7302802, 6580327, 5246908, 2401967, 1420993, 1357032, 2657700, 4505504, 816401, 6385211, 8130033, 3305506, 1687087, 5307814, 1025224, 5887296, 941706, 6932149, 2040230, 6605708, 6276570, 5616116, 4075033, 5302953, 2756220, 3264513, 3188348, 1052162, 5882647, 1928973, 2910350, 3119696, 4772514, 5636506, 4026615, 5098556, 8229892, 6386098, 3169690, 5629368, 2500799, 4207140, 8272165, 2736943, 3425940, 4321739, 5807688, 962603, 2756363, 4548392, 2448403, 8328248, 7297544, 1288128, 7117570, 4460745, 7668088, 1591239, 4515964, 2339338, 414118, 5721716, 4668398, 7308275, 1034848, 491462, 7704559, 2285929, 1288626, 341406, 8081418, 174006, 7230972, 6934642, 1235041, 585260, 4233864, 4515325, 5384799, 5150074, 5732220, 5169802, 3889685, 5533866, 6758455, 2874241, 4792843, 1494362, 2662770, 2746427, 8064095, 3143675, 7390554, 4228580, 564190, 633898, 3977448, 247325, 3389997, 3507490, 5759506, 4394248, 3898716, 686438, 5399825, 4791301, 2581808, 4940019, 4749775, 510770, 5303051, 4388493, 1157318, 5028404, 6919088, 6741052, 7553825, 7688935, 6406713, 6982223, 5705326], +[8098167, 2380968, 4358214, 2085500, 5703794, 3789915, 8029159, 7982287, 1429252, 6952001, 1338910, 2659359, 2042784, 4676641, 2556047, 1113111, 4597455, 7496797, 833088, 4567810, 5683500, 6434870, 7006155, 6589134, 6519177, 3595328, 6223949, 1229118, 5017526, 5516671, 1712988, 345023, 1627167, 5853448, 2759823, 1554328, 2732007, 4964979, 32157, 7877536, 3493476, 2159497, 2584086, 3143439, 1527673, 1511843, 2908426, 301255, 2409548, 2240196, 7648118, 3697066, 7499120, 6161730, 2456416, 3248927, 6327807, 1421089, 4892933, 6971293, 1220807, 1359701, 3303730, 5201669, 5366937, 4477056, 270518, 4461059, 6917349, 8301719, 2819834, 5413621, 469469, 4607401, 3204715, 5559228, 7133439, 4437889, 8152470, 2448206, 6924056, 1022750, 3692897, 1220724, 981281, 6351845, 6586745, 3388027, 2822054, 2293712, 1637578, 5277044, 4547385, 6891968, 2413424, 2424589, 4444441, 3098386, 4016024, 8170154, 2982924, 5517944, 3111698, 5208429, 772539, 973015, 7803086, 6685397, 1933739, 2867979, 6145691, 3353444, 7346809, 6911601, 4719940, 5983937, 117751, 370087, 4896045, 997062, 404559, 55830, 3962548, 4559036, 6875789, 7632940, 1820513, 5293379, 4709000, 8122714, 2983995, 7247718, 5898721, 3613915, 6193347, 4830044, 742730, 7867794, 1182447, 5970909, 5849906, 4553548, 5323973, 238554, 8052367, 7764601, 3856833, 8215043, 4551264, 6205609, 1094507, 5061411, 7238909, 2428368, 6640415, 2446257, 3455482, 1596597, 3184673, 268515, 263082, 6144897, 4765647, 1752135, 6350501, 5202164, 2413152, 7640916, 7693417, 2781785, 2843888, 3197790, 3837776, 6409944, 3191409, 7862834, 4032689, 6863375, 4946373, 3371273, 7867062, 4816021, 5333060, 4601279, 1990122, 2663159, 3283848, 736782, 1004885, 5152521, 1639349, 4872339, 413247, 3422527, 29485, 6316834, 6847244, 5671968, 1118585, 1230841, 5301377, 964045, 5531252, 2464680, 4808483, 7274421, 6296240, 6249144, 1547320, 983890, 322785, 1569861, 8000199, 3252318, 7392253, 3251055, 5166973, 7686284, 1508934, 2822755, 3628769, 7520266, 4443712, 657870, 7915514, 6376849, 160589, 1396248, 5608643, 4472148, 1381934, 3020675, 4312915, 5638256, 2371388, 5091233, 4808950, 3365501, 5530834, 2803606, 3646208, 326197, 2494953, 7646456, 7568920, 92702, 1303189, 5502244, 4485930, 764302, 1289507, 4651298, 5388640, 6019489, 2667874, 3252078], +[1694002, 880498, 1119878, 4927285, 4938206, 3457564, 5773796, 2095306, 3876182, 2817843, 2270980, 4743236, 334974, 5824594, 7598934, 7072245, 1741514, 4491226, 680218, 3225168, 6234183, 5099462, 124427, 4002647, 3665725, 3744712, 2882801, 5435372, 3349111, 7727366, 6417864, 764346, 4053126, 899, 7080556, 4690070, 7747619, 6326251, 7164209, 3191085, 874256, 5564614, 2514894, 5557274, 6021624, 7198034, 6643375, 8258910, 4709353, 5776967, 6057128, 560840, 5620758, 5128234, 4153273, 2452849, 8122837, 4263082, 5605247, 7193446, 1206973, 7631994, 8096847, 4548727, 5474534, 1079558, 2617089, 392109, 7167485, 7570139, 3310020, 1976901, 5202659, 2973169, 158282, 3329467, 608604, 6583065, 7910373, 7301293, 316459, 926430, 912326, 757680, 2794082, 2840439, 5441947, 8153729, 5831857, 6365607, 8371172, 4194593, 3933079, 1159942, 583558, 8340620, 6863952, 6115410, 5867789, 695623, 2297091, 1303596, 3733108, 2609331, 614610, 1032195, 2933837, 5581673, 4826407, 1552349, 6836893, 3173519, 6784362, 4576558, 5392247, 4288899, 546366, 1127955, 4379828, 179966, 3819458, 3654559, 151870, 4815470, 5073268, 6477318, 6618148, 7460968, 5642735, 234724, 328135, 643627, 4735870, 4055438, 1146013, 4977295, 3365044, 2059984, 144725, 2763123, 5613898, 4834681, 542553, 1351468, 123221, 4586596, 4773293, 3907179, 33010, 3140833, 3145330, 6469958, 6928332, 7809503, 5385025, 4650450, 157872, 1822796, 5162197, 4740657, 6864592, 4844461, 2252837, 6230547, 3348014, 8022090, 498403, 28762, 4051817, 1055912, 3813507, 4247464, 8189700, 8161140, 3516666, 6913101, 6689624, 3448422, 7249813, 2188735, 5971387, 87689, 7197796, 2171015, 2104936, 4465838, 3332024, 1632605, 6802123, 1496819, 4387317, 4346623, 110572, 8247529, 5538144, 4472180, 7962451, 6519538, 3633525, 1567756, 6017329, 1792056, 6870018, 7374805, 4867440, 4196033, 3695383, 418400, 862091, 6204332, 1828224, 4173141, 2594716, 3504973, 4665117, 2380166, 8179035, 1468751, 4987872, 4552991, 2491092, 7051067, 297353, 382141, 389018, 5863764, 2030483, 1487755, 4419747, 748749, 6219311, 339420, 2297662, 2244051, 3428107, 7064592, 1275370, 2916391, 5548997, 7726067, 603486, 7179915, 4601730, 1693714, 5892289, 2773919, 6227311, 1209518, 619702, 2710244, 6974413, 6253098, 4540240, 159659, 5028294, 4779970], +[6626760, 7560853, 7651761, 730691, 1985062, 4814045, 1231959, 77104, 4835176, 5868120, 3976174, 8186975, 1304673, 6844391, 8169325, 121550, 4204446, 4225076, 4444870, 4346099, 4983664, 5418535, 5761744, 6863993, 5118948, 6688814, 972446, 5231937, 2399462, 2012381, 4520750, 2433518, 4223012, 2654750, 4945725, 6600938, 7921619, 5094067, 7696453, 5790283, 2630594, 2526818, 3148378, 7226711, 4742848, 5027015, 1538729, 5464161, 8206142, 3268467, 3322940, 468597, 4668265, 1403244, 351181, 4872478, 3003616, 864993, 6939699, 1479327, 3223788, 6840358, 2608312, 2477379, 2389020, 3992330, 3304223, 1832450, 739125, 5304623, 2990174, 372812, 2129121, 3626376, 1072326, 4613660, 5239252, 1257074, 3519657, 432585, 4524807, 6084386, 698451, 4395001, 4700393, 7751379, 5061202, 1068222, 7575514, 1712100, 6190272, 99516, 6898760, 1782990, 7888228, 7261363, 6109888, 3652691, 808817, 1482771, 3551519, 5541786, 5658828, 2319117, 5891865, 7447039, 8023998, 3585649, 5743527, 2877538, 94421, 7272728, 4277277, 4372203, 1439863, 399212, 2802262, 6086930, 7014529, 612357, 7853916, 4503203, 3847267, 1039842, 1663305, 5551477, 1632531, 1721263, 403078, 2474180, 6890682, 638957, 3088303, 8022779, 5799435, 4736081, 6376336, 2118082, 102719, 1856772, 774787, 6755226, 1311830, 7283792, 6195711, 364641, 2127583, 2060274, 230174, 3507386, 6655673, 4987766, 1223093, 2819726, 1020771, 292285, 6787076, 1048828, 6691082, 4987815, 6275375, 6421459, 4961444, 5167898, 5784904, 6661036, 4267762, 1034687, 7589529, 6903417, 5922012, 750455, 7911288, 2555160, 1217795, 5195752, 3065193, 6873559, 7478374, 1440082, 6908665, 4692907, 4574178, 5371239, 728377, 4585956, 1625542, 6406953, 7584259, 3938375, 1642202, 6007364, 2648464, 2642610, 4578193, 3899989, 2815555, 1100482, 5776764, 3382859, 4524973, 3188117, 7236392, 3845796, 4795242, 1989680, 2612626, 2911101, 951032, 349954, 681058, 2594002, 136187, 1852500, 3219067, 6151995, 1478590, 3082473, 2878671, 1856362, 7141034, 2548889, 5657142, 5024064, 3132478, 6061717, 8271340, 4080986, 3029833, 3642783, 2415046, 2401308, 6853888, 2825465, 5344369, 1692253, 7317009, 2185448, 2137844, 3247689, 3849888, 5189358, 91514, 897106, 5181395, 595351, 838917, 5750388, 6777693, 538927, 7747057, 5057617, 3187628, 809255, 3828723, 5332422], +[5632872, 197214, 1468251, 2366152, 1487121, 1204162, 1410440, 2112217, 8003521, 756050, 5686711, 4549249, 6582846, 7818530, 3762898, 4823413, 3536939, 6476091, 7788128, 4909476, 819970, 5022762, 2665868, 2570431, 167574, 958009, 6350337, 6646318, 3728548, 1363153, 66419, 3165180, 5982062, 3360789, 4313367, 5023596, 2466855, 2951838, 7550964, 1743166, 1257309, 6001028, 6669592, 3412432, 762962, 5229258, 6323153, 1902272, 8370187, 6643542, 3260299, 1378225, 5778917, 4142516, 2089875, 3835810, 5644492, 2504300, 8227214, 1183607, 8340028, 7595451, 3534900, 430081, 5317004, 7016881, 553766, 6901781, 2749664, 6357288, 3434881, 4250107, 1674389, 4263782, 414294, 862027, 6349167, 1729561, 335658, 4272621, 7778956, 4442894, 134157, 1408966, 1566960, 7501475, 817031, 3010498, 8322634, 3705174, 297864, 7379488, 6588311, 2719157, 1517647, 4898344, 3909289, 778721, 3093342, 7936867, 5007097, 8224844, 3505096, 5059051, 2109519, 4046295, 5178034, 349628, 877262, 6490727, 2720925, 3744253, 7894835, 4686600, 6581584, 8133086, 3401855, 3829234, 6989602, 5772474, 8006740, 4929817, 3567748, 8315126, 7067391, 1223038, 7015210, 3263354, 7481406, 1272759, 24802, 6340371, 4107342, 6475453, 7014319, 8041331, 2543197, 3753479, 6511884, 6837778, 5459375, 3306548, 1436599, 420092, 2102581, 1770850, 1404657, 2979577, 7963618, 6259968, 5866947, 4075719, 7538869, 6396578, 5347071, 1938823, 8271842, 3427065, 452337, 2647674, 6905691, 875983, 5915229, 2424163, 1294861, 5390959, 3781199, 2812155, 2064563, 3503888, 3157845, 25817, 5853559, 5928976, 3375876, 7439211, 6068909, 2863074, 5625474, 1765903, 2930929, 4660207, 969833, 8322357, 635186, 823893, 5987472, 2881415, 901564, 1214587, 1993721, 7557902, 6372560, 615112, 483811, 4551315, 658582, 1944438, 4045388, 7001992, 3059003, 7922944, 4856366, 7766051, 8184934, 7581830, 1985291, 6117629, 4292987, 6552668, 809559, 508828, 7987527, 1490021, 2614772, 6768883, 2776370, 2136332, 3981882, 8214631, 6392973, 3226672, 4766767, 3102534, 6833882, 8173199, 3471542, 6267574, 5686284, 1447452, 8371564, 6477483, 7004690, 1550228, 7882212, 1135164, 1206524, 22542, 8244955, 3667063, 7417768, 4381796, 6596779, 7247774, 8104172, 699413, 5388015, 6229752, 2312245, 7796297, 1487787, 7526833, 4308764, 2040506, 1416750, 3814651], +[347032, 6094344, 4738108, 1644411, 1240303, 6695329, 7864269, 7537460, 8064562, 5570696, 7616149, 235154, 7265767, 8066590, 8251459, 2842161, 6891938, 3037221, 8185158, 1097189, 8015259, 5379628, 4140724, 3597776, 3703149, 2094079, 1108639, 3175954, 2234640, 2531914, 6706777, 4184150, 5501965, 6992324, 5580362, 1358700, 354191, 2361050, 5118680, 1719257, 5311476, 4746898, 1303004, 124397, 6924861, 5255599, 4508497, 5472808, 5463278, 5364524, 1196062, 861233, 157828, 6333391, 4876191, 7125553, 3751705, 5714945, 7823916, 2269820, 7798405, 5028534, 1762493, 5231112, 8180808, 6500707, 5603825, 4846035, 1456591, 4470498, 7102577, 5230444, 4342256, 2176, 4241625, 2900109, 5712345, 3092280, 4661711, 5715342, 2779045, 6859476, 7888119, 5603638, 2322467, 4493102, 643956, 3739697, 1603485, 4827817, 5151917, 6860213, 1890253, 4244208, 2328783, 4182711, 5040887, 3832847, 6539666, 1616224, 6104450, 2750898, 3335316, 7187032, 1599945, 4877928, 2768386, 8074195, 5670797, 3807617, 2449527, 6672875, 543935, 7628495, 2029424, 2044852, 4218157, 611659, 2754050, 4498300, 4981655, 3517062, 217977, 7200131, 4141370, 3685138, 4506273, 6194825, 5090859, 2894215, 3141069, 5970802, 5887916, 5491024, 3059928, 7078939, 5282737, 2452053, 2180287, 4177995, 1572986, 2604970, 2527361, 1801398, 3838957, 2212824, 488734, 3233859, 2363435, 1834866, 1280297, 8366593, 5042520, 6267281, 8261064, 2937021, 648984, 3029361, 1148863, 8014505, 6436416, 7691422, 5372021, 2098940, 7928311, 6074591, 4705175, 2089743, 5451196, 4427747, 5382160, 7578989, 5626535, 2640345, 686777, 6816074, 7336673, 8282838, 5356132, 4558973, 3536646, 8236909, 192734, 639193, 6625447, 3150847, 6002121, 597007, 3747076, 24492, 6373534, 8034213, 2679819, 5555893, 6091291, 998160, 8373544, 5895856, 7471790, 6660367, 2129561, 327327, 732082, 272951, 8253904, 6604677, 6892873, 7643692, 6927409, 4189155, 8126430, 4133131, 3421534, 2589792, 4976030, 6160089, 4066640, 177900, 6771346, 451090, 3201084, 7576250, 660041, 3275906, 4620936, 3935750, 2454612, 2252474, 7870550, 4145258, 4072683, 4927500, 5176748, 7406700, 6064418, 336751, 6510871, 58654, 3542249, 2846831, 8254430, 363385, 727566, 2796970, 1914591, 507347, 895605, 5399734, 1177477, 5588647, 8108610, 6173767, 2455862, 6619409, 4535009, 4789482], +[2354935, 2919514, 5890581, 3969390, 2843120, 218223, 1576194, 6654815, 3534384, 7286788, 8246086, 5465592, 3471194, 971373, 2937097, 7290145, 352918, 5116531, 7386223, 5563022, 531804, 3720093, 244896, 5981780, 123273, 8119759, 8117906, 46874, 5827183, 2728880, 7781107, 7317640, 3102020, 5706350, 1077330, 96494, 5199429, 4905969, 756266, 1490926, 6320629, 4931634, 7201749, 3153322, 1945523, 1789477, 1425225, 2134485, 3318494, 2229839, 4960913, 3261670, 7086748, 8106249, 2675821, 5293240, 1495313, 5528913, 8112029, 1597954, 1992867, 1144311, 8073186, 6143728, 2425580, 7367242, 1690898, 4424462, 1666938, 6847028, 7873609, 4435765, 3486369, 5369509, 5673016, 6995181, 7966578, 7320354, 7731353, 3347257, 5952746, 1791712, 1580799, 4416620, 995940, 4882345, 3754679, 2145776, 2424709, 8063364, 5172054, 1690179, 6953761, 1031101, 2418199, 7940964, 4371848, 7529869, 4466809, 898118, 6832215, 1134609, 1325162, 7210541, 2522730, 7243531, 1349757, 4374732, 6819151, 6955482, 542285, 6665137, 2380152, 7064748, 1018743, 7384006, 1714565, 1056498, 2600958, 3493358, 1374211, 2182464, 3102688, 3760725, 7540432, 65232, 7320824, 1957290, 6227825, 5170259, 1049797, 2182419, 2155551, 905123, 8004777, 7265388, 1572363, 314149, 3293445, 6516482, 7326881, 2367843, 3499353, 4104360, 6443139, 1141960, 2998561, 1062788, 6615347, 2957080, 1965988, 6046949, 8324992, 459922, 3173057, 946026, 3288334, 5153958, 6452873, 8289342, 6838064, 4177887, 7406649, 6117508, 5130684, 4872189, 687134, 7582697, 6401353, 2525443, 78737, 4165885, 3327277, 256707, 5931083, 7612940, 2359107, 4961421, 1498823, 5353760, 2045207, 789978, 7847961, 7743442, 1839522, 740048, 1149832, 3029226, 3445481, 3626094, 5259118, 6055486, 2595403, 5431664, 3685428, 5367065, 5471444, 6009220, 3800563, 7754246, 2706380, 8313181, 2150052, 1150468, 7813961, 1499320, 5301140, 6419480, 6258969, 3772950, 3460038, 5437043, 5556870, 5549042, 7641800, 8251033, 4308734, 7575468, 2417928, 6840008, 7036816, 910278, 6452972, 5610072, 6658892, 5884837, 2725479, 357265, 2908318, 1003088, 3376051, 5648804, 100921, 3225586, 5769727, 3070456, 6242565, 3005655, 989394, 356046, 6436654, 2469528, 4493579, 4569852, 247660, 2662977, 524656, 6258141, 4432705, 6928952, 875071, 8237883, 1726578, 3358619, 2482319, 1279282]] +t0Hat: [[4112057, 8121209, 1403003, 6071226, 5185576, 8278904, 6294117, 8314657, 6850720, 1215093, 2571757, 8276849, 4922022, 2083536, 7287377, 6065668, 4096450, 6759016, 7750402, 3961978, 729343, 686730, 5457200, 3104503, 7434497, 5640261, 7099088, 2789024, 573494, 8311672, 6798639, 6000461, 7958640, 6326276, 3087027, 3421620, 3860082, 2207494, 2223440, 2368372, 4752727, 5227439, 6730917, 3270023, 5468194, 3365637, 7847501, 1068476, 7938809, 1863782, 2631131, 1341586, 527733, 3946174, 1771084, 4298397, 8370351, 6271468, 1436437, 4582306, 6158533, 556897, 4991055, 7659172, 7072513, 4818545, 1190255, 715082, 1937175, 5874642, 6423957, 6871110, 2239756, 1752893, 3590051, 6569131, 6968211, 5306013, 7717380, 707518, 5828480, 2438251, 9269, 5582080, 3151090, 8290532, 4350910, 3999609, 673653, 6138554, 6230261, 4829833, 8048867, 569425, 5581649, 1034355, 4740774, 1743362, 2303207, 8076720, 3981354, 4050536, 6601070, 1260017, 6587418, 4149828, 2504835, 2563759, 985242, 6209990, 2355018, 3390359, 420533, 924485, 2187771, 5092972, 3231763, 963638, 6142644, 595984, 3953266, 891057, 6897300, 7006845, 2440937, 4216796, 7666953, 416418, 5908160, 1285559, 2690086, 8033570, 8064285, 6422849, 4715940, 5134701, 8231943, 7757133, 2517699, 7716564, 6333204, 3132857, 5851304, 6337326, 1498315, 3709093, 7264117, 8174787, 7390909, 3334248, 2852134, 1622372, 3800561, 7022915, 6965582, 1836348, 5395395, 5374013, 5040488, 6026306, 1556993, 5124668, 1227382, 6320593, 812427, 3851183, 3738093, 4249742, 67818, 1442492, 4402601, 1023550, 2987992, 5934952, 636819, 5333639, 3263228, 7482120, 3947439, 776745, 5676244, 8297958, 5781256, 5490345, 7787306, 3236645, 8134446, 2856352, 1539628, 1231473, 667129, 2886745, 3772023, 7530041, 1457716, 2986739, 2105232, 1355249, 2471849, 6031842, 3074203, 2624066, 3236455, 6155544, 7239029, 2298554, 5192754, 1354289, 5987176, 5974291, 1738259, 4008408, 5567211, 1778871, 3648330, 4502851, 2778635, 7574789, 6178352, 5304682, 1833260, 3269688, 7574684, 2691170, 6896796, 5774907, 3201738, 2288031, 2181497, 18071, 1947237, 6884517, 8261397, 1685638, 6588636, 5794397, 2474594, 312671, 55393, 8337882, 5688415, 1417484, 538198, 105536, 1910149, 5129904, 2763252, 8028189, 7838256, 4810021, 3846185, 3757900, 2364293, 6225791, 528841, 7870448], +[1298738, 3173550, 1130304, 7546795, 3522297, 6136909, 694842, 138805, 1005738, 3624058, 7232255, 1883576, 2034273, 414420, 2857625, 3854648, 2908001, 1090784, 6831334, 1685620, 4533707, 667909, 826884, 6255209, 2781144, 2410253, 582739, 6709320, 1488808, 4286307, 7633955, 3357879, 4697376, 7472574, 6264837, 2739415, 6552961, 4931575, 1147651, 4870726, 3737161, 5138153, 7024978, 2340854, 5296671, 3120351, 1332648, 754264, 6446783, 5870829, 5197422, 5237340, 4260668, 837133, 2034729, 3639118, 1739982, 3574160, 4038222, 7666871, 8265903, 1919554, 5987329, 4481626, 3196627, 5052383, 3417589, 1493460, 4866993, 7912666, 3358428, 1601079, 7325886, 991653, 2564454, 4711612, 1415043, 5698607, 1638362, 1383261, 5572281, 1140439, 6861098, 5026566, 7302759, 3192159, 959865, 1210525, 6640129, 2114053, 3513257, 7450331, 4141720, 2612928, 1248233, 7092833, 1196892, 6325050, 1314672, 5275644, 5345611, 5371238, 6597488, 3313708, 4656956, 5015228, 4258798, 289506, 1520505, 4879055, 6457832, 4545259, 3050785, 1125525, 6986183, 8361764, 1988393, 3357455, 1614771, 1826514, 8123765, 3261533, 6994470, 5950865, 672785, 6337490, 7430016, 8210716, 2877882, 2495724, 7126478, 7299867, 3554688, 1887852, 6376774, 2981140, 7888721, 3218179, 4958169, 5537126, 6963973, 4479476, 1018567, 6992613, 6739593, 5293930, 1706257, 8349094, 4389359, 8288324, 6744811, 3583680, 2886499, 7349006, 6927579, 6103128, 6551754, 1252284, 1979333, 2823127, 2835573, 879550, 4313185, 6364444, 5930773, 2484428, 5017501, 4738346, 1717709, 294286, 1647657, 284348, 140410, 4223054, 1509494, 8234198, 112104, 2602856, 7675394, 4561777, 676781, 4199678, 7601984, 672210, 3759237, 2926752, 33123, 8243469, 553776, 6801837, 3235043, 3684878, 5354954, 1886560, 7851108, 140550, 4625202, 5419541, 5783818, 5742538, 7676404, 4238086, 3952047, 4653950, 3935957, 5726551, 1300403, 1446537, 68408, 7833556, 7474512, 1438462, 3055628, 5181429, 951732, 1546126, 962790, 1310073, 4045289, 1181919, 8100038, 54197, 2894782, 3594545, 2872435, 1244110, 838815, 2616310, 3526273, 5039654, 1741468, 62170, 6124846, 8192198, 6884341, 2373517, 1426378, 5414203, 3998622, 4101029, 5464324, 4851193, 846636, 2745412, 2391595, 8292309, 8217346, 4633923, 6883884, 2185242, 5573684, 2146847, 6887937, 473593, 8062925, 7666692], +[7439273, 3858496, 4198292, 1416765, 8377589, 3968741, 119736, 4810206, 6185738, 4661978, 1405929, 6028679, 6247327, 5267471, 8126767, 1423839, 481420, 5780944, 107351, 1136343, 4824713, 158071, 1776400, 5517336, 5250374, 4931722, 293428, 6919645, 5549890, 6005109, 5443531, 4903503, 3956690, 1976424, 5595977, 6561451, 7433385, 6788449, 7470814, 292859, 6765821, 4828051, 3439165, 2890859, 6910538, 5282402, 5768078, 7950746, 3632114, 3748371, 6462903, 2971128, 1904989, 4861662, 64990, 1244401, 1558424, 6751610, 3666641, 2221653, 4030388, 1816618, 7737748, 8185845, 1519953, 2050888, 7861660, 5674920, 1575254, 1395007, 697868, 21282, 6883604, 1227680, 4156297, 1608186, 5465916, 4380847, 4279864, 3239089, 5034701, 7859113, 777673, 4994792, 3523135, 4010452, 5084738, 936924, 2188734, 2793823, 8101050, 2915084, 4923357, 3540247, 1787632, 83416, 8348961, 7798402, 3984348, 6902933, 1626966, 5651456, 3772061, 4512355, 6759348, 4361632, 1556784, 6820985, 4646193, 3085389, 8108852, 2092564, 3314214, 2136658, 6320052, 4171429, 448708, 8067727, 8015390, 1760066, 819394, 1949483, 3248740, 7696780, 2501880, 3875063, 186272, 2703204, 4084594, 5616482, 4484558, 117220, 2442893, 7985911, 3933858, 4703223, 3794823, 3538663, 2486793, 7095440, 1641599, 6126683, 1816591, 61673, 5606743, 4922652, 422079, 3302108, 7911892, 4976046, 7173130, 2537801, 3587047, 961611, 1460894, 7461341, 6534459, 7718003, 667927, 470577, 5789786, 4932013, 4193224, 324504, 6250387, 1111227, 3684232, 3091928, 311401, 5710041, 221171, 4719931, 2785153, 7172230, 2353766, 4656006, 4968289, 6725513, 6306869, 5069550, 6593780, 2485380, 1394604, 7527921, 6389792, 7888386, 6147726, 6035872, 7027959, 3078834, 5720666, 764782, 1919932, 3433869, 1879674, 12321, 667726, 2890273, 5981717, 4678296, 6230905, 3271835, 4738821, 5361957, 6763694, 3637993, 5327607, 1796000, 3949688, 7387729, 2233933, 5414843, 5411932, 4818001, 7213241, 8289651, 1633941, 768040, 6121018, 1403045, 379908, 4605594, 1539744, 4403829, 4192340, 2409317, 607082, 7321976, 5179790, 3513927, 8346587, 6889238, 2413015, 4335351, 4712666, 3788734, 1667023, 3023375, 6927870, 734210, 612412, 6358980, 7471613, 7378533, 8042311, 6741466, 1051497, 3945358, 1010569, 1101953, 3254288, 4007859, 3952070, 7664175, 4604492, 5262932], +[3983885, 5163953, 5698332, 591588, 7895003, 5636915, 3653185, 2709356, 7409590, 2779037, 2911711, 4252413, 390784, 4420555, 5815840, 2499872, 2154612, 2960344, 2272784, 2853801, 7214321, 5209808, 3633300, 6776510, 7112571, 3972161, 7214241, 3851902, 2158271, 538252, 233583, 5405993, 34236, 155065, 1494876, 4679343, 3399811, 3518375, 3175027, 5463568, 7271791, 7841627, 5707944, 6841866, 1615010, 1969803, 5218813, 3216343, 3705553, 3130510, 8115054, 4983992, 7811863, 5038159, 6918877, 7696128, 4769375, 5430011, 1187556, 1505193, 4440624, 1659363, 8338404, 5334214, 4709416, 5340991, 3914651, 699122, 2817286, 4985711, 7789286, 655074, 7621800, 3729247, 5899386, 3254390, 127813, 3513645, 1153005, 3630258, 5161126, 3483399, 5987435, 5475318, 69323, 7051276, 2126087, 3489884, 786183, 3359383, 7528920, 321855, 5298441, 7321929, 4735950, 2956033, 27251, 5900373, 3316792, 3577876, 6606717, 544229, 3435702, 6796424, 2304127, 938414, 5857386, 2979624, 4078774, 717940, 6519588, 7745117, 7673321, 7141478, 4746942, 792773, 3145674, 3565040, 1871690, 3171602, 7887671, 8201466, 739034, 4199623, 6932640, 6645707, 8014361, 4633898, 4875487, 4916157, 2415299, 7212228, 2655449, 1987661, 2677131, 4126823, 3038339, 4825846, 4587140, 7124976, 689134, 7151805, 5114034, 4644116, 313609, 7467782, 2023461, 4884733, 530071, 1391258, 5924424, 2036687, 3999687, 1604690, 1107312, 7357370, 1967413, 8110123, 4818428, 5984463, 5437755, 4934266, 2233589, 2682115, 603786, 1624135, 7123285, 7864056, 2352749, 8056032, 5211548, 3398279, 278292, 3415470, 6237786, 6186123, 2761656, 670841, 1578351, 3285669, 5224707, 3256051, 7017774, 8201157, 1087852, 8297855, 2659819, 3273532, 3954870, 4513977, 729243, 3175438, 4179546, 6830691, 3928778, 5117598, 4861653, 862344, 8285510, 5492639, 8176216, 279384, 7437010, 60895, 4292467, 5273213, 6429251, 5950288, 4339900, 7509678, 14686, 4154537, 4975254, 513746, 90209, 3002738, 1087780, 4854871, 8129057, 2742660, 558651, 7307598, 418630, 38535, 3943533, 7995949, 7891335, 4314531, 5174368, 2817465, 931473, 7273474, 4724450, 1218781, 6608883, 944415, 6171555, 5184407, 2067349, 6805394, 6074608, 8221012, 3326548, 6926488, 1121699, 2770644, 7634201, 8302934, 3767303, 7575927, 6270812, 8354002, 6082324, 8071388, 489126, 2785892], +[4513134, 4481748, 5120924, 79673, 1430522, 324408, 4852163, 4944123, 3133481, 1965478, 2008780, 3379666, 4209109, 8180169, 841299, 98091, 3513452, 4326944, 2923042, 7096549, 1541479, 7632124, 4275004, 7788376, 7225523, 1814238, 1520600, 3990318, 6003060, 391910, 7111597, 2405279, 2029662, 5176363, 2964538, 2322199, 3239474, 6769543, 6478256, 167998, 2507454, 767701, 460591, 7298955, 4696570, 2741847, 3579267, 1000890, 4621448, 6851099, 7456439, 4794073, 8330907, 968728, 6587186, 709315, 3226514, 286469, 4448126, 689954, 7231377, 2138691, 897100, 6069301, 7968897, 1896963, 6459600, 4603142, 5366426, 5825108, 4579987, 437881, 1006686, 3864430, 6537771, 3968538, 7765138, 265608, 3872457, 7826882, 4250521, 5862723, 3835039, 5803610, 5112818, 1582069, 5466327, 1862129, 6324183, 2443478, 7352872, 3938240, 1542297, 1504506, 2169964, 2264369, 5125113, 8102389, 3131894, 7861564, 5414008, 3944669, 6008936, 990956, 7540177, 2960203, 5802278, 6368428, 6841589, 1295930, 6869962, 3703052, 3894921, 4654516, 3940194, 7950629, 7287312, 8371148, 2470868, 7780888, 596962, 2516886, 5263310, 6946022, 203541, 7091200, 1288167, 5366632, 8083018, 2040647, 4497218, 4621424, 3892345, 7555924, 3380027, 5143907, 3325726, 6016680, 657783, 6901426, 1795083, 6137775, 2791071, 7505621, 5930261, 5519347, 5910705, 4272020, 2923621, 1753370, 4889920, 1709456, 3119093, 7899211, 3271181, 182276, 905833, 2149825, 6136025, 7279655, 2694729, 4714142, 2587070, 576594, 3724800, 1451874, 570416, 3474613, 3023135, 5707450, 93537, 2395976, 4206710, 3597179, 7011242, 4204619, 2354536, 5138823, 1534830, 6660557, 86662, 904150, 1415034, 3957311, 677226, 1635564, 2942814, 2867600, 8283005, 8047521, 7035648, 6879291, 1761964, 6784209, 6225668, 3787522, 7111363, 3006656, 2193318, 4067847, 7174307, 4831706, 5576257, 4081846, 5376073, 4362458, 5733666, 867532, 2719018, 5347737, 2494362, 3618486, 3779222, 4628033, 1368278, 6495741, 3949411, 6055372, 7473183, 1697661, 7775258, 1565260, 1242646, 2423073, 1838530, 3694775, 5108154, 3768907, 5542913, 2873878, 6105290, 7299848, 381013, 5540587, 1308953, 5987792, 5315964, 5659021, 6497793, 5749864, 287934, 5245196, 2391769, 4161645, 607439, 3218610, 7084342, 5838076, 6889328, 4364479, 6436346, 7618959, 5243642, 5747379, 5757057, 575949], +[7290979, 2979494, 256546, 6552502, 735623, 6754944, 6499340, 422544, 7351065, 5391670, 7491446, 1694601, 1833880, 4183312, 1108433, 1184957, 4534492, 2325636, 6707246, 7292507, 1249364, 5259479, 8259874, 5612377, 6573984, 3424233, 5761722, 3844349, 5827434, 7393118, 4210425, 6849610, 1205298, 5968736, 7968034, 2105828, 2466358, 4012958, 6062645, 3619756, 4366503, 5301665, 3763810, 6694660, 3547956, 5290548, 4588413, 1865269, 3957623, 1312172, 5647140, 3356186, 8239732, 2742991, 6749890, 1484293, 22663, 7120711, 7830653, 1232391, 8329459, 2736584, 2457319, 1610005, 5395393, 8139250, 456785, 8133969, 1071561, 5667671, 1744309, 3863801, 3186103, 5693755, 5659948, 4906980, 7512208, 4613552, 322209, 4956228, 2855653, 1580663, 1770126, 43555, 4806805, 3175833, 4234252, 3756528, 6539529, 5584778, 3953535, 3368197, 6109740, 8046777, 2719345, 5757702, 1875590, 4214140, 2623461, 449500, 8193138, 2642297, 1841672, 4496949, 873892, 968072, 1862499, 8284613, 3885220, 3893655, 3472658, 1833224, 5687141, 6815395, 8172190, 5178868, 980944, 6806933, 7456418, 2001344, 2964770, 5154551, 3528623, 6509199, 5402642, 71298, 4500483, 2415897, 4747996, 6242323, 1787407, 6121017, 1072251, 472681, 329241, 1820346, 1623226, 1039432, 816576, 6041676, 118533, 7565852, 1757758, 6634714, 7201257, 1914729, 8177638, 6307472, 1060488, 2288012, 716268, 3033703, 1295785, 6590291, 3330373, 6816617, 4606915, 7392195, 5865586, 3173767, 764120, 3565903, 2212501, 1084652, 1872309, 2494916, 8268946, 3091125, 556074, 4567018, 6158558, 5739265, 7748378, 2378895, 4110563, 6153235, 6133777, 2881993, 4284253, 7175165, 1888352, 4920944, 2766747, 5450152, 2788023, 7191290, 5170718, 5967175, 1292407, 6586715, 17592, 4637386, 6799919, 1393022, 2247982, 6016016, 1298976, 6069119, 3187375, 3787984, 2187212, 1903920, 5648508, 940870, 5664614, 8219507, 5786802, 8340033, 3682286, 8168536, 6343096, 3140169, 5520058, 7650895, 2346295, 5448410, 4399709, 5643972, 7670836, 1156496, 527236, 7185167, 5845215, 4563424, 3187466, 3833298, 948384, 7997060, 2446782, 6274653, 2580136, 7173802, 4403359, 2778110, 4527152, 984552, 2930676, 3031299, 3120875, 2227002, 4045379, 3270233, 2319960, 6571669, 7703199, 7670631, 3531463, 2018900, 7502821, 735501, 3274286, 4177821, 5387538, 1079222, 287528, 359467], +[2784403, 8098329, 2566647, 6953719, 7442982, 1766800, 4485932, 5465699, 4023652, 6588739, 8136927, 5170357, 5540125, 5615279, 2716227, 5127815, 1005293, 7988820, 4669643, 5780151, 4980678, 980623, 7918734, 96306, 35466, 7114540, 6262398, 6611397, 1297886, 5580098, 5799291, 4804508, 6436695, 1780794, 7892905, 5519673, 1082821, 3564079, 6620619, 2675434, 1220940, 5436571, 1535847, 886090, 6000469, 5336163, 2248271, 7064034, 1071171, 6128352, 819992, 5623370, 8022212, 1102692, 2539798, 4179543, 2409777, 3319042, 6262695, 1698649, 1956645, 5861115, 2772400, 5092737, 7342462, 7635679, 1572205, 4313170, 7383858, 7800588, 1842816, 1918422, 5936960, 1105336, 7880804, 7112602, 4880165, 52081, 4648239, 6075243, 1438089, 4952107, 2334235, 6541395, 3265178, 4948595, 1604445, 6397998, 8279554, 3209085, 3172018, 1819507, 7399987, 5183629, 5797494, 4441732, 8272249, 245000, 4714367, 1582080, 1014303, 4763159, 276768, 6922939, 2338585, 4249503, 4074170, 2229982, 2659904, 1948639, 744241, 4598096, 6666137, 7874912, 7968070, 6777223, 3392392, 4288146, 1836280, 3912336, 1549631, 1149388, 965468, 54109, 8324054, 7625454, 6792719, 5915509, 3939086, 2708874, 5027899, 7278079, 2161463, 2314995, 7312299, 3754037, 7343051, 1890174, 3344655, 7283361, 3858142, 1656384, 5784749, 6420086, 4668603, 6105758, 3181844, 2361478, 1746966, 1845504, 940540, 5931202, 1118593, 5672697, 4167083, 676541, 2961519, 2664350, 2725940, 3692848, 4494122, 1926084, 4488075, 544893, 1104060, 455034, 1359328, 2122285, 3132473, 3512532, 5608673, 317284, 5839771, 6238294, 5761293, 6026294, 1300805, 1497387, 4932953, 6993668, 3731076, 6029264, 1399839, 5587317, 790323, 1825165, 1671559, 5228657, 3290486, 5329060, 4487740, 2726841, 4681033, 3157379, 102955, 763530, 1042526, 4327244, 4240525, 6409888, 5860758, 4741148, 5471220, 3402690, 3083741, 847723, 1416555, 3316377, 6681189, 6737461, 8145846, 2237215, 6908614, 200361, 1816395, 8332998, 3872758, 7199639, 4824988, 7042489, 1110213, 3260203, 2351841, 4513665, 5800644, 728948, 5635100, 1571244, 2013980, 5084908, 2777896, 2572277, 3132346, 250800, 652671, 603971, 4625969, 5132235, 729743, 1271213, 3303588, 1489008, 7076891, 6150554, 5631416, 613061, 2942499, 5636777, 5139915, 1925801, 3109511, 1421017, 7652479, 4505273, 2225676, 1462742], +[7395922, 4571097, 2085889, 2277520, 351058, 1086227, 5619444, 1723829, 64871, 1896475, 691726, 7693895, 6052135, 1821130, 1695270, 2327018, 6601325, 711033, 2154544, 7664441, 3001197, 7888265, 6163356, 5656655, 4670306, 7946384, 8004258, 1616721, 1097474, 5360664, 8208452, 8338799, 509959, 5625899, 8290307, 7631273, 6101699, 4886341, 3750009, 708095, 7730403, 6953658, 5409945, 1288362, 1414813, 2689094, 2305733, 2831784, 5721206, 1016559, 7370, 6895818, 625316, 1565042, 3152863, 2637517, 4818508, 4547632, 3109038, 3997765, 5275964, 7943934, 2503660, 2860974, 2647284, 5822432, 808367, 1757350, 994048, 3377903, 2257443, 7873456, 8068532, 4865269, 2705746, 5972156, 3672806, 1711804, 3165080, 7227300, 5209427, 5912837, 7545113, 6785267, 1539398, 7364405, 960855, 1934300, 3794855, 1972703, 3070181, 1780028, 2449280, 135590, 8367342, 6116597, 3258361, 3853199, 62614, 4859398, 5670539, 4977542, 6085745, 5806517, 7741622, 2007381, 5591518, 490739, 4814031, 5032687, 2212338, 4987868, 7447044, 6839776, 7843577, 240616, 8279447, 5881691, 4167622, 4517217, 2983675, 848129, 998780, 5178472, 5786494, 5516914, 5306892, 5665085, 1356090, 4001804, 3955740, 416942, 4296968, 372945, 5982379, 348652, 8198908, 5123593, 322409, 1745251, 2572269, 5882480, 3707252, 5935735, 236967, 1137150, 3101890, 6983517, 3128627, 6924523, 6537496, 4701666, 6725131, 4482092, 1651544, 7586363, 5832959, 2619795, 1028973, 5777022, 6756714, 1620841, 7690496, 5930494, 5247338, 539614, 427522, 5131667, 2034438, 4317237, 4826606, 2553389, 2381729, 5344792, 6125691, 3691601, 5637465, 463050, 5912229, 2135950, 2668678, 1399829, 7271403, 5942073, 3040482, 5827147, 1947121, 3564976, 64384, 5852214, 799257, 6389153, 4494795, 4930572, 3052650, 7764978, 3158997, 5565870, 3859029, 6091022, 5274341, 4061300, 238381, 7824038, 2405492, 7269632, 1818743, 2160808, 2504800, 5715272, 7240827, 8154924, 5299324, 1955687, 1913264, 1615039, 8357743, 7542925, 5178040, 701298, 4010291, 2647124, 1595453, 7899739, 2277829, 4544139, 724313, 3570885, 5567960, 2513920, 3231674, 4250002, 2674426, 1845839, 2385941, 6321385, 2999267, 6958280, 6052958, 6403556, 6235636, 5423264, 3841129, 6902749, 4612504, 7537803, 2746649, 3878708, 4957794, 1124877, 1683493, 6598870, 3549804, 1537380, 2097556, 3517245]] + +rhoPrime: 7097E5DF24D66FB91F54751AA2FEBA9103BBCA43B407E93538D4D064913CAFAF2C2E974F22A855716B73399499CBE0285C00C6B916DA0A513EFF7DA22CA7513C +y: [[423557, -508962, 216023, 437402, -328094, 85853, 74363, 484136, 134091, 515679, -135046, 86516, 488540, -26857, 86096, 378295, 20005, -212135, -399187, -291913, 303910, 53618, 101916, -490827, -213698, -81729, 162375, -228574, 41755, 339753, 436742, 174521, -173795, 465077, 484411, 89695, -133316, -139953, 129839, -521364, 335126, 380065, 125875, 42873, -310600, -449779, -165313, 410418, 248780, 99883, 155439, 457059, -375166, -305210, -311159, 450277, 314628, 87325, -65185, 422264, -162406, 200653, 36964, -518831, -234657, -153285, 1009, 383431, -198014, 254011, 24888, -157225, -382269, 301691, -13746, 22633, 105168, -185413, -515858, 500263, 264289, 256359, -180906, -457490, -102657, 476589, 9170, -436929, -120882, -430556, -291530, 330220, -120000, 335209, -173041, -356047, 351487, 10246, -296249, 403769, 282548, -168155, 427543, -186668, -285250, 405627, -426490, -341015, -55313, -328781, -468462, -138691, 221412, -27183, -80382, 134387, 245228, 227825, 485924, -68900, -75431, -219923, -171852, 92762, 433531, -269075, -23051, -24120, -289253, 228297, -19014, -395510, 407572, -273040, 246323, 403388, -169722, 234148, -419128, 501246, -290978, -476433, 197933, -114969, 241055, -349284, 506205, 342902, 73853, 511023, 361610, -356550, 122541, 358627, 466920, -476792, 277796, -391146, 231554, 75517, 70970, 24831, -490374, -278009, 490169, -514935, 112105, -349291, -305136, 305834, -54324, 63128, 101908, -502338, -442355, 250317, 377752, 30998, 13518, -15110, -230213, -123223, 190753, -315671, -86362, 319161, -411573, -333867, 101317, 369049, -439679, 246616, 222793, -386306, -59267, 135104, 90688, 168459, 193215, -193572, -235784, 154608, 295018, 77769, 347011, 205720, 214019, 15671, 75288, 249031, 499499, -386544, -519305, 106432, -461096, -160822, -49854, 12797, 14372, 139032, -41224, 456083, -304643, -212461, 472887, -471689, 405038, -343918, 23202, 327952, -494684, -334416, -388570, -516849, -69136, -230476, 195894, -376647, -316708, -12138, -420741, 219887, 490593, 211795, -522152, -396692, -346948, -364941, -267286, -42442, -486941, -34824, 493548, 295333, 208002, 136865], +[110329, -289102, -392914, -180910, -369475, -207513, -2826, -182493, -67549, 90035, 72766, 354229, -95722, -332117, 389091, 341465, 297076, -363646, 495967, -452643, 369288, -420245, -167592, -404683, 124612, 51618, 473968, -146933, 447021, -84554, 116620, 477248, 339467, -214100, -346055, 382087, -242447, 23867, 132111, -29806, -56681, -513167, -265702, -6649, -501256, 505520, 148028, 28018, -515238, 206462, 431652, 5527, -335220, -38390, 400580, -357756, 523227, 465609, 53702, -305420, 8750, -521491, 89801, 520779, -153017, 167355, 14844, 261014, -112506, -189682, 171287, 146205, -126978, 233428, 19079, 150561, -352676, -101020, -493422, 487380, -299907, 151225, -267795, 421325, 181755, 375022, 432363, -521342, -258170, 165432, 217309, -336054, -7257, 178105, 102241, 89231, 244667, 214741, 9418, -442433, 2011, 492464, -390799, 456369, -359261, -248688, 153973, -301438, -431329, 243416, -228916, -174167, 498090, 211479, 167335, -211094, 185254, 201304, -272586, 141793, -62241, -250583, 367772, -289727, 229895, -120888, 198738, -159674, 206631, -7918, -383541, -106550, -174840, 230405, -326516, -72776, 515876, -251159, 484143, 257517, -409828, 203356, -410168, 266865, 461154, 341522, 54540, 348650, 272301, -224373, -8489, -469738, 98977, 301604, -492310, 178763, 132800, 294104, 301829, -132706, 286476, -500973, 60309, 199355, -412072, -76767, 191815, -310497, 275992, 223444, -317752, 417564, 231118, 260712, -347800, 456312, -12262, 142985, -413453, 462928, 493153, 375634, -123817, -460688, -147129, 45644, 503474, -444920, 188015, 267549, 138064, -58402, 439049, 393198, -368369, -211271, -244689, -21618, 75123, -317516, -112088, 393214, 125374, 388142, 150020, -31028, 167219, -267739, 46699, -53242, 197373, -232396, -152776, 159019, -198074, -348707, 427273, 99830, 407286, 248889, -382943, 490134, 333958, -214126, 406893, 409563, 236547, 325857, -204860, 253685, -488373, -313850, -262281, 502137, -100370, -131473, -81561, -198306, -205321, -394799, -127647, -76798, -417255, 63867, -105443, -174323, -377362, 67437, -117089, 309108, 409679, -295152, 107786, -110205, 467963, 392866], +[-204958, -52948, -36732, -142286, -515695, -327036, -470613, 458938, 204398, -25752, 352039, -400342, 308243, -493493, 109879, -40579, -102675, -114201, 73373, 408287, 441170, 88093, 155529, 132502, 498094, -356598, -4231, -12191, 345562, 501189, -99189, -320217, -482200, 265183, -516722, -495116, -290957, -421603, -389035, -149809, -193339, -192140, -167895, 158123, 341800, 158785, -476994, -452060, -123977, -222086, -446932, 425939, 499703, 155448, -56604, 424961, 93067, 98061, 410671, 299646, 108198, -308400, 159039, -141434, -19214, 102223, -469991, 142322, 465711, 27561, 190781, -101286, 219840, -439810, 335822, -239306, -370578, -212347, -254429, -225825, -504182, 18729, 249219, -313449, -82994, 504729, -356107, 33393, -118890, -226372, 95276, -32300, 446629, 138040, 434794, -130841, -380388, -247705, -71098, 522148, 100553, -430534, -425801, 495598, 122281, 257137, -135279, -303273, 509172, 105897, 306110, -411096, -237734, 469089, -53575, -84416, 121623, 406913, 153632, 227108, 48452, -408182, 87900, 47335, -83139, 331276, 482242, -170005, -432798, -270552, -40084, 318136, 122780, -514826, -302519, 520958, -227485, -107628, -197811, 931, 373337, 269743, -415835, -61016, -415133, -350771, 318020, -194440, -469497, -28289, 87748, 297572, -13433, 193736, 300710, 377374, 240861, -16044, 291107, -393572, 15346, 4777, -265681, 460715, 347515, 19398, -157143, -463131, 111407, -147316, 206474, 360076, 326275, 506798, -44619, 315538, -504467, -6393, -496590, -330559, 430704, -459958, 297965, -258162, -501038, 214487, 159399, 164705, -504393, 103448, -370346, 32923, -132135, -153847, -208199, 230780, 117640, -206259, 305657, 151527, 164157, -454985, -455704, 241540, 114277, 210798, 380403, 260270, -60363, 70541, 303223, -263149, 246351, -222437, 98053, -413322, -358814, 423025, 76505, 454160, 178667, -38882, -466607, -145555, 512855, 413455, 67675, -74708, -106486, -96593, 349523, 455582, 277102, -74060, 438664, -89389, -177128, -84060, 350401, -305462, 520823, 115008, -408225, 375786, -128917, -384175, 24145, -495877, -147830, -293369, -319636, -181569, 332697, -231529, -372626, 256284], +[99631, -389908, -426382, -181598, 438380, -427232, -212168, -78705, -6865, -23509, 300603, -475377, 476642, -515236, -317241, -425548, -91037, 459546, -285305, -212320, -361888, 392076, 417559, 40900, -173020, -470243, 257267, -455641, -61374, 385064, 93192, -750, -338298, 48441, 329324, -477879, 517502, -364948, 450326, 283676, 424225, -9513, -366790, -159568, 235763, -30697, 345522, 16609, -369849, 324230, 419809, -175959, 214712, 450822, -267274, 136331, -508984, 296387, -34422, -72374, 297861, -300172, -97953, -69852, 522046, -29749, 215364, 456095, -339512, 110965, 312964, -347905, 5709, -511916, 61368, 184617, 183897, -103509, -162122, -447454, 196275, -506517, -182290, 140326, -67934, 124152, -342977, 120448, -86920, -351336, 316855, 266656, 380304, -15131, 5502, -410666, 499388, 135015, 95039, -445470, 305820, -430281, 218058, -188112, 388253, 407603, 330589, -22174, -65809, 480841, 107736, -329866, -70568, 444542, 174443, 148191, -115587, 287294, 334987, 186858, -256037, -510871, -143648, 8621, -381205, 315832, -324553, -504230, 161086, -10630, -273173, 160245, -15627, 354254, 175726, 249471, -134206, -480335, 270816, 246679, -83956, -28784, -287847, -139277, -440162, 482869, 209989, -86377, -348944, 15095, 16695, 181083, 8681, 429938, -296438, -437591, 221446, -520410, 343023, 293393, 343885, 271353, -209328, -47467, -460034, -342659, 306544, -31377, -162020, -55994, 92784, 20510, -79299, -269135, 428670, -274358, 290267, 93024, 414768, 392807, -491552, 69185, 460478, -110405, 192874, -73829, -28158, 232302, 235036, -470739, -7198, 410209, 25096, 96029, -328747, 274138, -30635, -39695, 369026, -12391, -457455, 436286, 274626, -53820, -121095, -205437, 62768, 506758, 363097, -217904, -181313, 342186, 413595, -67182, -72411, -254226, -254529, 146758, 106867, -442798, -208824, 198170, 179936, 303061, 74443, -203086, 88029, 18484, 149661, -63340, 209300, -301539, 245442, -428478, 519596, -288001, -181698, -458545, -45669, -489770, 261645, -77599, -159360, -454173, -454918, -92325, -430507, -281105, 130543, 440810, -495310, -428190, -105587, 459770, -190074, 275270], +[228560, -471858, 380005, 521487, -111342, 243552, -208292, 107647, -286683, 191670, -237964, -261148, -215544, -463865, -69448, 217335, -34436, 486811, -111131, 343267, -303119, 429445, 365721, -487363, -194050, 11838, 387308, 296055, 286079, 203353, -131648, 156186, -445164, -470836, 135348, -21567, 163943, -260879, 241148, 434052, -64516, 445596, 352635, 485858, -52961, -85644, 472024, 477244, -379215, 162541, 111301, -17637, -275767, -256350, -431188, -479510, -485658, -19173, 477595, -316644, 60771, 474301, -353950, -123267, 111208, 115753, -450416, -504284, -115411, 222113, 243340, -287669, -40756, -310442, -4115, 456333, -33348, -250973, -60210, 50030, 473274, -382504, -439943, -356876, 125116, -101523, 510904, 274084, 126848, 290974, -336140, -281325, -199643, 90630, -91536, 467184, -289587, -412382, -311748, 146128, -511262, -379692, -50462, -152371, 463894, -41801, -365187, -345998, 249216, -117893, -513377, -118064, -433994, -331865, 450857, 394747, -324317, 424315, -361865, -153452, -14696, -240170, 382418, -288980, 244240, 449409, -158016, -241074, -38591, -392245, 384733, -511248, -429370, 499507, 291932, 52768, -101725, -240011, 84714, 229970, -274163, 59638, -423792, -49292, -33372, -374144, -170665, 100770, -199016, 244157, 286620, -310427, -280645, 57466, 344151, 46975, -239039, -7948, 252224, -193576, 100567, -288474, -214990, -121665, 415702, -352511, 178714, -288806, -58368, 170883, 171748, -410637, 369585, 419899, 406161, -128043, 73294, -284835, -247348, -457144, 343961, -511200, -107300, -195967, -67529, -350320, -276787, 155820, 119131, -36727, -177793, 343284, 474114, 518277, -352959, 228644, 105365, -209073, 3547, -129330, 116859, 508792, 208030, -168036, 475259, 400452, -485782, -516473, -159072, 329955, 147361, -413408, -183834, 440178, -313151, 164939, 263622, -510573, -441654, -287347, 225339, 231146, -240519, 373750, 521978, -511621, 523318, -233436, -479725, 166071, 303782, 297176, 237823, -218851, -23235, -41088, -316109, -108777, -178449, 364048, -248860, -347360, -91676, -146980, -201185, -85159, -303644, -415255, -144661, -452410, -308424, -323783, 217738, 208703, 226166, 470230], +[-165361, 197905, -362330, -262203, 204627, -88732, -495247, 285634, -48018, 80805, 413291, -142536, 27427, 383002, -468675, 231895, 349317, -360973, 310639, -356657, 241761, 105589, 100694, 183000, 499398, 394085, 184520, -435583, 295740, 214040, 276620, 411590, -306728, 275714, 133674, 459557, -305522, 130490, 488699, 30448, 178654, 416991, 430283, 375118, -202028, 21420, -248339, -441628, 4304, -115934, -56720, 414692, 255094, 512837, -361320, -488766, -109488, -6989, -96048, -99445, 136753, 356821, 174703, 505757, -403302, -51169, 225484, -197682, 353675, 465892, 476688, 516148, -193676, 393044, -383075, -31928, -140919, -520909, -145590, 196494, 173877, 391393, -482252, 383141, -414699, -482157, 405517, -385307, -102688, -300789, -13879, 210015, -14489, 137202, 12488, -326568, 108629, -497573, 423846, -209291, 64571, 481592, 238685, -186811, -113912, -388990, -58786, -138065, -398009, 320302, 135699, -138988, -150030, -210945, 224374, -404964, 305246, -41541, 211013, -235866, -365830, 188579, 30419, 371419, -251433, -321315, 357, 74468, 507190, -416082, -6164, 252074, 143593, 376847, 310118, 117460, -289536, -231237, 400221, 322790, 211276, 198022, 523203, 157160, 120761, -252523, 168342, 426978, 188363, -94807, 89742, 386844, 487897, -210733, 42803, -394499, -261521, 177935, -322819, 356439, -316471, -349620, 214436, -279467, 338614, 497010, -126958, -60019, -204070, 99551, -61199, 230215, 304456, 52737, 435580, -197677, 222597, -302221, -10613, -319385, 47237, 485029, 453282, 423709, -209462, -44959, -57667, -63064, -434895, -306333, -44152, -128947, -220706, -469752, -151007, -161249, -314604, 389119, -495206, 489673, 328956, 382350, 313932, 252508, -54658, 76122, -254921, 112056, 325691, -94666, -492600, 254686, -492894, -251, -22023, 507727, -447758, 464047, -22002, -209717, -178366, 132626, -295325, -274455, -108658, 520215, 42871, 495491, 478316, 247600, -253011, 131360, 85198, 350768, 137362, -209674, 152862, -85222, -333394, -426909, 393336, 365902, 142005, -70684, 261680, -98401, 251845, -507134, -43095, 371009, 393774, 464051, 370493, -134917, 410309, -58913], +[-113973, -13784, -261798, -77945, -443646, -239139, 381373, -102581, -200649, 176036, -62367, 235849, 371074, -37175, -228141, 435247, 422997, 25045, 159947, -296516, -178603, 421066, 341689, 164773, -156404, -449835, 408978, -312934, 82282, -86048, -485252, 496005, -469179, 65542, 100713, 168061, 520361, -273389, 39832, -166607, 294973, -475911, 189851, 68890, -160534, -186110, -135919, -153089, -325974, -259719, 373089, -498939, 42662, -322376, -166316, 298617, 406197, 247877, -381309, -214168, -466616, -500116, 182689, 154049, -201363, 499072, 75159, 208252, 282374, -68628, 74233, -9041, -223912, -517835, 376721, -236709, -100612, 267165, -423687, -88711, -340364, 69365, 415073, 423962, -58527, 54117, 132375, -477501, 38656, 269155, 33066, 512639, 521408, 481698, 140025, 369252, -44082, -520813, 394766, -209640, -347692, -491473, 236264, -134160, 353028, 21123, 343687, 398126, 409349, 223590, 450096, 426607, -520189, -53152, -315552, 485738, 326236, -488925, 92633, -212812, 214745, -451554, -296196, -294914, 239141, -290478, -505419, 62480, 78535, 21890, 75721, 126586, 185039, -252383, -248375, 336117, -214515, -86716, 152587, 185413, -110362, -448338, -406864, -237554, 379910, -20478, 193688, 257709, -236771, -160838, -501461, -331697, 260240, 279554, 474095, 409606, 346548, 120896, -499838, -137167, -495911, 494015, -276581, -81992, 57182, 189697, 461628, 94256, -276856, -310002, 133286, -361835, 520018, 465962, -32804, -318339, -269425, -5574, 50452, 426765, -244578, 273518, -395524, 418588, 349970, -8415, 132527, -67429, 52354, -368069, -216844, -181801, 22187, -427785, -445826, 429049, -188787, -73116, 508881, -362969, 300926, -269012, -239698, -76564, -504189, -391736, 85500, -57003, 242493, -328263, -435689, -268700, -60201, 195852, -185171, 181096, -306685, 7323, 487047, -123271, -18008, 99696, -133766, -111505, 43857, 381182, -167011, 177028, 268876, -336461, -49480, 428705, -28011, 339705, 54730, 198199, -508847, -515768, -358616, 196423, -290447, -340139, -115659, -92817, 85386, -381474, 242708, 513947, 381846, -144127, -310882, 312404, -298040, 186914, 416892, -29274]] +NTT(y): [[2276095, 3384441, 2676375, 7129156, 6375394, 4730470, 507736, 1343784, 3046856, 615748, 6453820, 2309566, 4121735, 7429936, 7192885, 5856786, 7216703, 3466174, 1144450, 5811370, 8201916, 1355431, 534186, 7699987, 6779777, 5536436, 5994726, 772709, 4019313, 1887803, 2933334, 5483503, 2202235, 1184990, 2203611, 2650155, 8199322, 8180784, 7464170, 3404936, 7076047, 5072853, 5253282, 5469606, 7722537, 4365977, 5332584, 8327696, 7360583, 2039599, 3753338, 927499, 2323220, 7807466, 7769501, 3590272, 3658200, 7331829, 4836950, 2157078, 643910, 7778854, 1136642, 3483926, 1361052, 1740622, 1429225, 2269513, 3681874, 1841384, 8143137, 4211076, 8241739, 1577431, 904779, 5608707, 752889, 2266805, 4313095, 5043737, 1233630, 1736552, 6598776, 1416806, 4118207, 4220485, 7151276, 6620011, 6735957, 4222454, 3684892, 7505130, 4846980, 5417160, 2982709, 1513885, 3683491, 7226003, 4149165, 4501163, 4871193, 1082385, 4239662, 963346, 2974007, 1849196, 868182, 6951485, 4037918, 1305251, 499397, 4781651, 7048460, 5362165, 1092234, 5230212, 3120495, 1677160, 8330646, 4655772, 5842416, 2491369, 6092565, 6474651, 7501318, 7168416, 540638, 5768056, 1955022, 6129910, 3441373, 1332033, 6603655, 1320824, 4986048, 3279690, 3609584, 4147477, 7336598, 1023620, 5326132, 7045264, 3462580, 1078665, 5067843, 2511308, 6010530, 2056255, 734261, 4759552, 6211342, 5041772, 6873794, 210973, 7341012, 7626579, 3071717, 734984, 5372155, 826548, 4295117, 5299169, 2147339, 4089160, 1720785, 4036046, 164900, 7376607, 3549294, 2449382, 7966106, 6548066, 2732991, 6792356, 3114885, 7447904, 31589, 5278098, 7953939, 1399518, 8100233, 3824570, 444227, 4222621, 5560176, 7900713, 2615324, 4301288, 3856018, 431797, 1206264, 95455, 2842445, 4592811, 748012, 2057164, 7699117, 2565722, 8252349, 7538308, 1057896, 7836139, 1672935, 7864690, 1847243, 7289778, 3119551, 3798591, 7671249, 6020495, 797207, 414614, 3307458, 2514295, 6484165, 770548, 2126447, 5856111, 6472338, 3382634, 4539169, 5882728, 6358430, 5613744, 6745158, 420552, 2806401, 3375630, 3681256, 5853632, 1368676, 4885792, 6074891, 7154671, 8077905, 3596344, 4218096, 5191461, 1075834, 438583, 8058676, 865938, 7063671, 6758507, 7125124, 5320939, 1802020, 2326594, 3854664, 8089946, 2442946, 2045558, 3729854, 3233726, 2796215, 73154], +[6140097, 2198057, 7678143, 7553696, 1259106, 7948034, 2652342, 6663838, 5220898, 5903918, 1233231, 5916909, 1149386, 8186519, 7048664, 5676677, 6256897, 5805460, 2170518, 6886180, 446081, 5099607, 561650, 1541090, 5967621, 8238175, 5244769, 1866459, 617105, 4663399, 8292385, 4265820, 1570691, 3562789, 5031332, 8247316, 4388496, 6997954, 3890026, 7102017, 7222279, 2895601, 6602449, 7579524, 2074891, 534525, 1715969, 6874483, 6425587, 2443854, 179, 508168, 565535, 4432513, 598264, 534179, 6862626, 1213876, 7141897, 2514837, 4116820, 6072065, 895557, 2516490, 3211034, 2590211, 8116998, 7287392, 2630419, 3446979, 3123402, 1868776, 6188181, 5585067, 2439861, 5800056, 3533347, 5329277, 1109972, 1659693, 8212750, 346845, 4874442, 1772160, 4729674, 3926957, 4250160, 8199876, 7418587, 6307907, 7309024, 7414644, 2686130, 5722639, 4018583, 2021421, 167721, 5412515, 7344324, 5986649, 4052103, 4766112, 5004674, 7520121, 2642151, 5878058, 645558, 4454784, 6824919, 812337, 5934375, 6839103, 984152, 29531, 704193, 5932111, 3156352, 7396872, 2427627, 1165109, 5554847, 2150834, 1425377, 4492418, 8194926, 32002, 4848630, 2000403, 6190595, 6319330, 1485359, 225048, 8142505, 7412563, 2454309, 815767, 6757859, 6333318, 3396810, 2653148, 5821255, 4119232, 8084147, 4116399, 2095658, 5877573, 5809210, 6476210, 1758142, 2828489, 5998262, 4680168, 4713617, 6298527, 1166958, 6069995, 1814852, 5306525, 1297846, 3909883, 4882513, 79176, 1428775, 940386, 2395542, 2427846, 2903001, 4148427, 7130420, 2085831, 8367224, 7175045, 791874, 6195652, 2830548, 978776, 7302450, 3892836, 7104771, 1136076, 4312411, 3300647, 205222, 4506232, 2143640, 3230678, 7241162, 7490488, 4020934, 2101832, 3175059, 1925133, 2712096, 1675951, 4546710, 4974088, 1612619, 6517227, 2302098, 885964, 1239223, 6450896, 662265, 4867639, 185664, 8254308, 1745565, 2008299, 4246614, 2209574, 7225933, 878355, 6881006, 6782799, 196930, 6708519, 74952, 5474690, 308496, 5948931, 2532473, 5963940, 1066961, 1035336, 5519299, 676710, 6462528, 381679, 1212218, 7467068, 6545534, 5520108, 7415893, 5606425, 7845630, 2182839, 5299472, 2916839, 5633381, 2581644, 6839718, 4573399, 5122295, 4608751, 7225721, 7320898, 4876460, 922725, 2325436, 5011680, 1448458, 5846508, 106888, 1250956, 1693423, 1978939], +[7334523, 648677, 1426429, 2293845, 504237, 1996863, 5081912, 5275653, 7081438, 5998148, 5012382, 6638808, 6354580, 159293, 3254434, 2122287, 6162340, 5567982, 6103123, 1564491, 5513935, 4683249, 2345582, 5012583, 954665, 4291193, 2026128, 5581072, 4471332, 2698064, 7212842, 7943121, 2761922, 2575225, 538695, 4664094, 2461091, 5261418, 6941400, 3852325, 7060540, 1651744, 7508075, 1859471, 6852893, 7459721, 570420, 3662819, 1344013, 636647, 2962339, 7820190, 942337, 7831405, 3473286, 1736759, 1814670, 7053508, 3539302, 4863817, 7851445, 7460926, 727503, 4061938, 1046596, 6705907, 1091698, 4795896, 5192988, 4609729, 6956095, 459131, 7954721, 864572, 1432276, 3306129, 4240428, 6059014, 6066757, 1418886, 6033319, 5352533, 5386373, 7482265, 961695, 3157760, 708631, 3510834, 7028104, 4432028, 1022752, 4048839, 5583810, 3771327, 5809509, 2868626, 2355983, 2652205, 7526228, 2991227, 3600411, 8032715, 2918618, 1028629, 7517190, 453762, 2975056, 6351283, 7693378, 3721171, 5221207, 75714, 4226874, 343249, 6716109, 6242318, 7604316, 6660874, 5131976, 6588043, 7230365, 1827682, 3215016, 4825265, 6219176, 8322223, 4416135, 500761, 65974, 5797520, 3894685, 3301633, 5944870, 5316855, 5463515, 7529104, 5948296, 674170, 515402, 5455285, 6329883, 2423619, 2208644, 6251952, 2554150, 2087208, 8230189, 6322488, 185472, 5621823, 766242, 3906619, 1707762, 6412923, 7969928, 2800717, 2761021, 4891196, 2602530, 1445140, 2368289, 7675666, 7519791, 5572523, 5736043, 3477853, 6601824, 2035888, 3304888, 300402, 3698790, 3086360, 4374638, 5146052, 1468504, 4730324, 6063841, 1542384, 1680924, 3209920, 4866373, 2061964, 1607892, 5888111, 27631, 5063625, 1225115, 2729470, 3057896, 1141818, 7325534, 6114637, 843940, 1289265, 4747542, 6405294, 8030838, 6665941, 7191721, 8109552, 7596732, 6273944, 5601710, 1411844, 4565298, 4270826, 6460080, 8194794, 8317914, 8079450, 58694, 6051439, 6900901, 3822208, 256087, 392972, 4443063, 7144525, 4329327, 8261559, 3487413, 6296753, 7173511, 8001047, 4545566, 8316437, 7234949, 6575833, 7904569, 4634248, 7166840, 6236435, 8117842, 5971560, 1185146, 1672447, 5121900, 6875708, 5417228, 1727679, 4827919, 843581, 4501520, 182415, 3124373, 5303453, 2633084, 7572651, 119695, 8044648, 7105618, 3063693, 2055320, 6633944, 218555, 2663937], +[267097, 1125583, 6771506, 6103680, 1707714, 5852757, 7529081, 1434367, 1502882, 7159019, 4692126, 5573074, 5841659, 2850359, 839925, 2946159, 2823010, 4750224, 3796031, 4068252, 3374671, 3400889, 3421204, 776538, 594694, 2415182, 4348822, 3067464, 4542492, 3765080, 7916243, 6838540, 5073124, 7948134, 1827281, 432449, 1131914, 3464543, 6681826, 4597737, 5172132, 6602953, 5482297, 1971949, 1723790, 2518648, 1735478, 1526315, 1937148, 1832482, 564174, 1967440, 7026693, 1712994, 1745719, 5176322, 151546, 7933192, 6598677, 7229966, 4043413, 2419825, 7573090, 3446115, 8153825, 365240, 270854, 5526706, 1097559, 1654713, 3263432, 7530369, 2514009, 7035814, 5304709, 4407669, 619449, 860984, 4182838, 2092919, 6671955, 4119625, 1433447, 5697672, 7932809, 12977, 4395117, 2509646, 1239393, 7698195, 6341340, 946624, 3459640, 590647, 1325681, 1398560, 7131039, 206338, 6515478, 6663196, 3844758, 3251951, 2776067, 7832901, 538371, 7492275, 1470791, 2739033, 7658900, 7854113, 5889314, 2627279, 4173619, 3933848, 2378878, 2975014, 6925018, 3433953, 5625453, 2916817, 5412346, 1006476, 1223255, 7602295, 2438049, 473566, 6709005, 6625675, 1361183, 821213, 4396722, 279732, 8188004, 1632752, 8342467, 2380439, 4549488, 1257136, 5324702, 3087644, 501350, 5825652, 4969656, 422701, 7254241, 2438567, 1776520, 6349773, 2471384, 5045529, 2479627, 5532677, 1537096, 4215897, 4119936, 6315585, 5046840, 6662874, 220238, 6143279, 6383691, 2948259, 7756943, 2766712, 1434818, 7970131, 2094307, 1089911, 5900605, 4100479, 5722760, 1224737, 7226527, 2421183, 8248832, 7317634, 378950, 4960982, 5970694, 3960214, 5589414, 6446446, 559215, 2501340, 6347712, 2211233, 6029955, 4623378, 2441317, 2018614, 682115, 5605600, 6722097, 5300377, 1893090, 8315199, 2385641, 649082, 5130488, 112776, 2946180, 6289745, 6988947, 2602944, 7708960, 6422575, 6560311, 4518683, 5917251, 4664066, 3550739, 4597839, 7398898, 5031595, 4077021, 7035645, 4177584, 4197849, 1913645, 6134572, 7225119, 7148936, 6080927, 7935269, 4334629, 3656086, 7274616, 6386201, 1249904, 7530675, 1316713, 6882890, 6077837, 2374958, 1747126, 421068, 6991797, 6189930, 8330808, 2143953, 5998821, 3436951, 1221867, 2312329, 7704431, 1820234, 2788986, 6900017, 6747194, 1148104, 7354651, 1256075, 6365607, 5719686, 5395708, 971718], +[1406111, 97529, 4076473, 6557308, 7323676, 7089273, 6942833, 3410742, 1353741, 2925202, 7938616, 4145744, 6623974, 6937238, 3787423, 7645706, 8031069, 4549713, 2485748, 1078033, 5843276, 2648406, 5822254, 3964661, 782447, 6941289, 3130339, 4573857, 7583987, 800162, 3469957, 4546451, 6247697, 940644, 992262, 2761931, 7405325, 6170005, 4668813, 5071706, 323641, 8078742, 7141958, 5328242, 2019653, 6087867, 7150558, 2095811, 3255646, 4956462, 3343696, 4892756, 7464195, 3766390, 1016741, 7597786, 3332037, 1457489, 2213848, 3455842, 1922813, 5074154, 6065155, 4991969, 1029623, 8032010, 3193782, 4669204, 3433619, 7234870, 2333715, 1553217, 5485978, 5039820, 3992927, 5635864, 4881958, 7813400, 597527, 4579134, 6833611, 6008213, 6141239, 6859859, 3983657, 3876177, 6243340, 4991559, 56723, 5993832, 3942527, 5275488, 7895859, 5313199, 5344411, 5147111, 2987980, 8036733, 973346, 1558375, 797069, 491153, 1823930, 11036, 8198459, 1389728, 5020517, 8274114, 6296547, 251550, 1997519, 7392840, 7141225, 1809862, 5441136, 4435870, 3187497, 4340870, 1585769, 1492795, 5666419, 5487425, 7445413, 3313843, 7801465, 7459899, 7403844, 3966097, 1837880, 3083227, 3320538, 4920132, 8312671, 6808659, 11679, 781346, 8060254, 3987245, 2684677, 7948347, 6429071, 3145672, 5643573, 7986268, 7379137, 7029529, 4473719, 6125235, 3557928, 2695913, 8090644, 5801476, 8149640, 2386399, 5398415, 7342332, 6994609, 3008459, 340900, 4514794, 7474489, 8199619, 1696816, 3885417, 6420147, 3642753, 2618632, 5035440, 4795593, 2765916, 7608687, 5252140, 3208726, 3132370, 2093303, 3990228, 8092341, 3614966, 6243418, 3713669, 7507439, 3167711, 8276344, 3834058, 5259326, 7891319, 2900522, 5790232, 6849799, 119244, 6730927, 5135513, 7979483, 2199998, 4313303, 3885086, 628657, 7795117, 3795802, 3093416, 8314477, 5623300, 7803580, 2018459, 5762786, 3784730, 2512815, 5740356, 5735659, 7100868, 4438845, 1552877, 1716734, 8196497, 5678861, 582507, 368654, 6533737, 8345348, 477533, 7448945, 786937, 7410577, 5346189, 122764, 486200, 5016587, 4679992, 4917897, 7706384, 3329695, 44801, 8319923, 6502038, 6494024, 2029222, 6883053, 6562549, 6134764, 1513471, 5067632, 3117181, 4561272, 501878, 2938467, 7724259, 4368100, 2410832, 364510, 6693210, 662718, 7538268, 5286544, 1764601, 3395839, 6719274], +[328115, 7569555, 2257151, 6523541, 151269, 1714574, 924246, 4582464, 7399633, 2719937, 3412904, 3393003, 3528962, 7599458, 5853955, 1240384, 463340, 5231620, 4286803, 3159072, 1135501, 6418298, 7124959, 2860070, 7528484, 2572169, 3779151, 5680020, 1690208, 4703066, 8041717, 7386880, 178197, 284284, 8195803, 2233011, 4502219, 807760, 8058586, 5503089, 4471321, 3520397, 7244979, 4267438, 7732816, 6505755, 790059, 8326686, 6282377, 1113817, 3567765, 5387287, 8329861, 140650, 2110746, 262944, 8092463, 2487631, 6434813, 5899440, 2563633, 99546, 5389914, 4434060, 1486864, 5525201, 2782702, 5412577, 6394423, 5491577, 3059221, 8023993, 2291360, 7780527, 438473, 3182696, 6115037, 4047239, 6932895, 174807, 4189485, 2987543, 4330531, 3396359, 3381346, 6034390, 2740979, 3768719, 7763822, 4186036, 3068737, 8360107, 294793, 3623494, 2529812, 8110180, 5418252, 4857500, 3182282, 4018768, 3204751, 288882, 7359550, 7434171, 3020761, 7697257, 8109614, 5506969, 3850893, 3765234, 623318, 7372268, 5780215, 6669995, 3510870, 4121956, 6392166, 7632156, 1411494, 1944426, 4628411, 513953, 3235340, 4477478, 3855036, 1923549, 7889731, 7698288, 5125896, 1160477, 1822966, 4109591, 3671367, 6848429, 6079490, 889614, 609756, 6400914, 4667345, 6642988, 2288078, 2481983, 2226084, 5307161, 5577394, 465102, 5426881, 3617746, 3828209, 8206725, 3586958, 1691173, 1180217, 3389527, 85178, 2964218, 117471, 7083894, 4746382, 3952848, 5219943, 3209999, 7924199, 796292, 783743, 6840241, 3296106, 4905308, 2902161, 8078283, 695434, 4077453, 3975083, 3858636, 5438893, 8048603, 6294604, 7271581, 6451954, 6413277, 706116, 5755948, 3182590, 6713651, 5730198, 6809004, 4869989, 1170579, 4396526, 2118364, 7303734, 1183018, 1313151, 850611, 3845663, 3902719, 7971403, 1771309, 5233206, 4339688, 5304186, 5365752, 7909472, 4434052, 1944175, 4438883, 366926, 1532030, 638720, 2872435, 1609805, 4440573, 7103732, 4826154, 3222796, 8359755, 7971371, 7938608, 7163137, 3529244, 2806335, 3292256, 7199922, 5416413, 1457378, 4871761, 993593, 3000450, 714684, 5635380, 826386, 341195, 1075113, 242256, 4402283, 1472855, 2685517, 5989526, 5558591, 364169, 6141282, 1550440, 6082124, 919529, 3441723, 8023530, 2433523, 182727, 3129400, 6685740, 72020, 6801790, 1665222, 5252469, 4798667, 5321519], +[7938504, 4075497, 7702455, 1563438, 199654, 3671120, 5112756, 2542838, 828502, 1734876, 242142, 6753918, 3378961, 6691248, 6421903, 7715597, 5096467, 1927583, 5615148, 5704610, 5205928, 6679053, 3041968, 7601180, 7803559, 3066243, 6103479, 8296621, 5885657, 1103736, 5595363, 3677091, 4459376, 1874241, 7653309, 1154527, 4111095, 6395274, 5437584, 7744809, 3958990, 109813, 4775361, 1050875, 6017863, 3237576, 4677654, 1493594, 7488430, 394120, 5247414, 7977296, 5581596, 8218295, 407141, 7930772, 5551333, 2184124, 3652222, 1252207, 582084, 2398670, 6883511, 5562163, 2641354, 3633451, 1489699, 4643682, 189283, 4867777, 1295280, 4560242, 6953602, 3786040, 7164755, 255410, 7167733, 810159, 4055319, 1966373, 398054, 3106923, 1077865, 6749576, 3745002, 3845340, 6259262, 363312, 6391489, 7087999, 4303830, 3283801, 1949902, 4118164, 163368, 907521, 2529195, 2571743, 6763834, 387978, 2037220, 2035065, 1684494, 6105088, 3902660, 2598413, 1521199, 5531332, 2983489, 2455153, 3856901, 1129230, 7557649, 2069630, 4205237, 63273, 5826260, 5247789, 3008648, 7151702, 2024882, 3000913, 577942, 592933, 6838047, 6120302, 1940863, 8089043, 3014966, 8281531, 5917753, 994134, 4894683, 4470659, 1169861, 4273216, 665041, 5825278, 7221468, 3082328, 6226721, 3992633, 655403, 5512215, 365509, 7559115, 7621784, 7258824, 1148947, 1366489, 228107, 2603832, 7056733, 158649, 2343651, 2314667, 813631, 7208449, 5117003, 7379908, 4442377, 2212881, 5663762, 2685413, 2569245, 4615690, 7183199, 1543868, 1829650, 5143202, 5536848, 632252, 1391637, 7359109, 7619758, 7557946, 6911183, 4522236, 5241822, 7690758, 6166096, 6734028, 4115969, 6794400, 4049757, 6265983, 7535712, 4832298, 1650777, 6323578, 8203367, 4532034, 7604642, 2763384, 6086932, 1403018, 448200, 4331556, 180982, 5272283, 2947085, 5783816, 7969712, 3813548, 3214465, 2779697, 7397182, 4783529, 4776227, 6149973, 7600048, 3030805, 155918, 6520732, 5735560, 2537705, 4997628, 1626079, 7541071, 3701463, 6051263, 2713334, 2881030, 3618808, 1266191, 5011231, 448493, 7987547, 1877926, 8251540, 1170770, 4843168, 6716942, 2847797, 7505338, 5708701, 3855824, 6974196, 589702, 1042118, 1801489, 3849915, 5051789, 3245868, 752873, 2385050, 7018216, 3253886, 7660618, 1286409, 1447502, 7688206, 1313081, 4610616, 6149059, 7867275]] +aHat * NTT(y): [[7729663, 6496623, 3202078, 7312259, 6566051, 6661652, 2360294, 3382531, 1302526, 4617712, 3014697, 4914671, 6579891, 4607037, 6660750, 2245445, 399551, 2376592, 3270819, 2570876, 7068776, 5172292, 1296870, 2912042, 5136116, 5893045, 7610679, 1247525, 5609243, 2103561, 4721428, 1865956, 4528001, 1629347, 1234834, 2058120, 4767707, 1405038, 6162708, 3298484, 3635538, 877634, 401712, 5038764, 8206260, 7709039, 2988614, 2236935, 7993206, 1030262, 7408435, 8215621, 6730383, 4361146, 2350287, 2093889, 3937711, 3246824, 1364665, 1914179, 6570093, 3215218, 2494493, 744636, 3766454, 31063, 4670167, 2011999, 2989325, 5700418, 2902156, 212355, 7598023, 7859597, 3623423, 1130645, 6081133, 5571311, 8309812, 4515293, 7071611, 2774601, 3668013, 4214053, 4207265, 1618927, 6957215, 7951242, 5760728, 4687719, 2446152, 6822868, 1578405, 7846476, 4700732, 6420866, 523075, 982025, 5266053, 803213, 5518833, 4818762, 7489612, 4259777, 3758944, 6397539, 640770, 4055793, 8018969, 1670030, 5492805, 6542472, 2186971, 3295506, 4196561, 1445182, 5155744, 4599021, 1080496, 487401, 414854, 466628, 3863862, 5430475, 5940234, 3699295, 7503643, 5478726, 1697118, 320038, 4480869, 7355949, 4307218, 87411, 4424401, 4483516, 2124410, 7378784, 5859499, 7959083, 3698483, 306137, 4082972, 8302427, 4161717, 7893541, 1742708, 4190575, 3592299, 7154, 910898, 4148322, 4943718, 7744964, 1204741, 3836257, 1348285, 3011687, 7427581, 8295473, 4740677, 4200779, 4108213, 5041317, 5730733, 3340200, 850215, 537159, 3134866, 6256322, 4569923, 2998531, 1439775, 2458807, 5824868, 1074926, 721479, 6362943, 5067648, 4018338, 2418440, 2203112, 957016, 1091780, 708656, 3955966, 2041870, 207788, 997748, 6037158, 6374917, 5288965, 6851280, 5124532, 6053058, 4459750, 1407776, 4862581, 4422415, 5831459, 3979920, 1365077, 4070354, 2335413, 4165605, 3732232, 2293510, 2070464, 4759510, 6570208, 5781618, 613061, 7971060, 656368, 3367600, 1505674, 4116592, 4580613, 154028, 1105512, 6834318, 4668486, 4493513, 6906046, 7984178, 2101262, 6866461, 3915098, 6214731, 854141, 7598191, 2045891, 8033208, 3140189, 4631674, 919971, 4925520, 1605330, 4941298, 1460230, 5182198, 7616759, 5573043, 5928490, 769357, 3363605, 6427145, 1201745, 5651340, 7356140, 2676153, 8038493, 7509800, 7387890, 2291077, 6924266], +[910493, 3869629, 351482, 4804624, 1493051, 7655411, 2966127, 2270061, 4287885, 1834898, 7968340, 6334783, 2162931, 3776334, 2367899, 6796636, 6128676, 4200348, 7270349, 8126200, 6161473, 6189497, 6665864, 1117609, 5923381, 4994817, 7685613, 2533866, 1465754, 1520173, 7132677, 6608226, 386180, 4496594, 598853, 3636227, 7687838, 4213868, 1255467, 3019610, 2216826, 5549638, 5173535, 4207148, 3392579, 5047216, 5533352, 281005, 6980974, 6904404, 6340306, 7566245, 1995522, 379294, 7376157, 3757073, 2795538, 3518971, 7122488, 1735104, 1850777, 4163588, 5624466, 6980970, 3147446, 7403990, 6089470, 8175782, 1047258, 1929865, 721619, 2615209, 546021, 7933794, 7986304, 2113631, 1956336, 3197654, 4739043, 4832473, 5785820, 4670904, 1058149, 4569099, 1683053, 5316554, 4822915, 2810449, 1086278, 4538571, 3046488, 1084367, 3339274, 2689326, 1400276, 7846761, 109342, 1267542, 6603402, 5486037, 7594170, 4307114, 3944029, 6928137, 8177798, 4557854, 4114887, 3162051, 4237395, 7984796, 1301466, 7722048, 8135853, 3525430, 3337025, 3400756, 1968677, 7808600, 1103063, 8300747, 1023124, 8332798, 62306, 102146, 5343592, 5004575, 388713, 4855567, 7431853, 330489, 1696838, 5741800, 6765773, 3611101, 1949399, 1277281, 7770444, 6018589, 3309468, 3777173, 5643132, 7764825, 6344813, 1714003, 5464646, 1406305, 2082513, 7284640, 480237, 5067330, 3172990, 3963704, 5541220, 2245487, 4577293, 102574, 3055864, 8054472, 5954110, 7214910, 3498617, 7256942, 2107760, 4273364, 8300553, 1857270, 1608998, 846424, 4406809, 8302606, 7312982, 6184179, 7860314, 3531758, 1455016, 3499757, 7106806, 2953094, 5125499, 15584, 1230069, 1136031, 1760680, 4378918, 6339029, 588589, 734521, 2056309, 1785778, 1780269, 843533, 1968493, 7270303, 1317020, 4784100, 4137122, 7545670, 7739908, 2958682, 7154037, 7595531, 2061215, 5507123, 5368473, 3574599, 5121977, 5322688, 1194532, 5297542, 6088945, 368706, 3013167, 6838881, 1458830, 6339911, 6920317, 4237442, 2839877, 6727844, 5063934, 3831295, 5444668, 3249600, 7045719, 1755217, 4380380, 5307234, 2875683, 5118896, 2678721, 3315023, 2927050, 6607024, 3206846, 4318742, 5344647, 7970947, 2904511, 2138845, 5511719, 2694983, 6341757, 3713384, 7650582, 7180623, 8279797, 6482569, 2040900, 7764133, 4034670, 8156253, 3140293, 8020340, 8142383, 2883348, 5163435], +[5587166, 6520522, 4331996, 4744688, 1904409, 1860230, 110786, 3259112, 8179795, 4690452, 3979060, 7335677, 4528564, 5334725, 458499, 6670952, 6219040, 554853, 1488354, 3212499, 5042470, 6699808, 7505078, 3649792, 2746425, 7891846, 3776496, 5217568, 415698, 5989483, 6510867, 6595391, 4997821, 1433651, 3573285, 5789622, 3286501, 5828791, 3160486, 3459963, 3505894, 6167154, 5219628, 219169, 3796071, 177987, 7927995, 6662216, 5151685, 7232531, 1319573, 3719072, 2769593, 2158725, 4431545, 2845528, 979609, 5879956, 4134839, 5146779, 1519252, 2097097, 4876890, 6978696, 3620872, 4072593, 3649349, 4487600, 7555782, 7237110, 7929651, 4174952, 6289750, 3414782, 4827763, 1217440, 6035428, 3057050, 3631126, 1865377, 6233403, 3343921, 6655403, 7712319, 5868559, 3480509, 5743789, 4534978, 3743514, 8038274, 1160674, 4131408, 3807293, 6028872, 6866103, 613803, 4937426, 3892508, 6698203, 5570262, 2581014, 8151908, 7382926, 4901325, 2630200, 3734534, 6620275, 6388040, 2844034, 1696120, 3146615, 2092444, 3891870, 2420481, 32238, 4738069, 943084, 8126372, 19492, 4921260, 6968506, 7226026, 1966262, 6783426, 8061460, 2721388, 2303731, 8062507, 2835129, 1555322, 6892843, 7714724, 8082206, 3736727, 5585259, 5049033, 1224018, 3672628, 3865507, 4295007, 1638426, 7817054, 871750, 8029700, 561787, 3997496, 341066, 8300351, 7699344, 2481057, 4499167, 4587050, 3251064, 1808000, 2895207, 1304194, 180394, 5944195, 3948631, 5576358, 2724434, 8233362, 8226598, 8172205, 2877841, 4921929, 7531253, 7043947, 43065, 111218, 7716871, 2027261, 3081321, 156466, 7314871, 5621386, 2521254, 1766388, 1248195, 6579235, 173171, 7483576, 6282695, 2912625, 6317152, 8325787, 6670299, 5358330, 4884545, 35398, 4956320, 808073, 8011816, 4658490, 4988766, 3376771, 4149916, 7019586, 6664769, 3505100, 2481621, 7330037, 4881686, 7482648, 745899, 2531452, 6225980, 4830202, 7223741, 7683488, 521685, 7919058, 6407119, 4422566, 645681, 4969338, 6000663, 7334978, 5720782, 5524801, 1925439, 4925866, 3174376, 3313847, 1840371, 68703, 5432058, 2558035, 6181138, 1039959, 1703779, 7219201, 999516, 2609787, 7144972, 5139765, 603984, 5211827, 5788810, 2765730, 6755294, 1807743, 2445628, 5092661, 2625995, 8251280, 3206012, 6094518, 513891, 5470618, 3020665, 1512068, 2698508, 1455745, 2145562, 2580381], +[462195, 3192828, 4817021, 4435354, 5915799, 6824611, 6837308, 2829160, 6382694, 38479, 3967710, 3257209, 5678744, 3628034, 8253959, 3910238, 5108258, 3669528, 3123571, 516197, 1010895, 1942993, 5839451, 7452235, 6918160, 7016967, 5502123, 314930, 3031480, 3544080, 4748042, 4262650, 7856508, 3955788, 5808094, 4946339, 7491006, 3264069, 217354, 4848883, 7599079, 4239577, 1723827, 5688715, 791072, 8063970, 915186, 7388638, 5706154, 7510129, 8300580, 248125, 7938220, 4887990, 4513772, 2965032, 3443648, 2594935, 12234, 1458652, 2033804, 928393, 4658157, 3845840, 6752468, 5387803, 2724300, 5023604, 3602839, 4234670, 445799, 3913288, 7022733, 3829121, 7556180, 3394936, 5349439, 2402051, 3232239, 6109098, 2528891, 2809407, 6045666, 856545, 3812352, 1288659, 1638576, 7517898, 6758836, 913387, 6613192, 8216577, 2629724, 7141715, 3248686, 2040797, 5239232, 1623580, 910632, 6473947, 7940322, 1448641, 2932172, 94205, 7493708, 2260164, 1037335, 5032582, 477273, 288657, 5071811, 2631384, 5758634, 3533643, 6865833, 1398638, 4382113, 5470624, 7477147, 7936037, 3549929, 8006913, 4950040, 5646452, 6901556, 4072528, 3066133, 122771, 541035, 6819951, 4934516, 4551459, 720574, 3482922, 2309430, 8106825, 3597871, 3464823, 3719163, 1407583, 4285426, 6109346, 6386191, 8368359, 7608393, 1924720, 2375443, 692907, 7648058, 6331195, 7317307, 6310988, 4772310, 4018901, 1751447, 6729623, 5198018, 3467388, 4228679, 6589605, 4090885, 6299261, 4762524, 4929066, 4285843, 1881583, 2389425, 2429488, 3670158, 742214, 5785674, 224406, 5985872, 4051015, 5993823, 639603, 7557326, 2536152, 2646570, 6493977, 4372872, 6333943, 6832967, 6400284, 4828497, 6649248, 2652596, 8007723, 2404308, 577339, 3856360, 2845390, 3011523, 1639412, 1417702, 2934398, 5759393, 1105794, 2886195, 5635581, 4145214, 3315458, 6106268, 6717985, 7152069, 5963543, 1376444, 2265304, 4679100, 2818521, 6778761, 5607306, 2316390, 7749805, 869818, 6038158, 4062834, 3024923, 6205854, 7915890, 2677444, 1307516, 5833645, 6459749, 5019895, 802410, 5068440, 1150573, 7552588, 4979563, 1745931, 1910432, 6135083, 2716081, 583381, 1335479, 4785572, 2232106, 253235, 7701844, 4663751, 2472920, 808656, 1780139, 220881, 5679187, 3035313, 4716622, 5305164, 5711581, 7813096, 8243194, 6953912, 902893, 7401379, 7440812], +[4474896, 4722391, 6180897, 6280287, 2037038, 5107162, 6278816, 7589399, 6930077, 957143, 8355161, 5158778, 3521387, 5025420, 4261006, 6021016, 3710339, 191230, 4898440, 5863299, 6029252, 4198404, 7162157, 8316873, 6364484, 2702177, 5794409, 699899, 1216845, 7316031, 7442084, 8226279, 2009873, 5775912, 7311486, 8245002, 7734193, 725131, 2813960, 6044444, 1406757, 6774733, 7621783, 2208254, 3341288, 3990773, 226334, 4287753, 822114, 7576357, 1235942, 7225231, 6610407, 6099109, 4933308, 672769, 3331531, 534512, 1856972, 4369990, 1684471, 2937947, 4681177, 5827230, 5641934, 2759667, 4007077, 6357919, 867075, 186756, 1810596, 834236, 1126347, 432642, 3953168, 2003186, 1084847, 6606669, 7149238, 8341823, 4096944, 7900409, 7582853, 595491, 2913651, 5436769, 156269, 2525123, 6431742, 2252920, 7971854, 1639009, 3023811, 4725594, 7753850, 8334896, 3469142, 2137344, 7793830, 325075, 6664010, 5611838, 2014087, 6975196, 1170777, 887415, 5600757, 7623390, 7423082, 1686049, 2702235, 1306864, 2164242, 1792406, 144913, 8042231, 4043231, 380825, 5671743, 7082612, 3439337, 3081256, 6021914, 8366160, 470155, 1280676, 5512989, 5812505, 5927020, 7777265, 875627, 1258126, 1440059, 1879492, 4412110, 6609646, 5613935, 7170969, 3208758, 2135231, 1567351, 1568241, 5709423, 456809, 2339887, 4222682, 3885204, 6726206, 40294, 5788877, 1100038, 1873152, 5968505, 523868, 7173357, 5025070, 2249816, 6879492, 6337810, 5845489, 7051575, 3068352, 263407, 5847025, 2776530, 4425938, 2878976, 1724871, 139262, 4085457, 3338581, 2067505, 2861155, 5414965, 2808111, 4047635, 1613724, 5430023, 6908650, 4309313, 369754, 2807382, 973808, 6445580, 2653023, 5167561, 258758, 1034227, 794379, 3056509, 5951245, 1964801, 3394881, 3772938, 2697805, 452025, 507397, 316371, 4813406, 3841479, 7086520, 7737719, 5027912, 1368092, 994441, 2916937, 4237297, 2001662, 4423336, 6612780, 4667391, 115888, 4324195, 7821555, 4345692, 2167803, 4355099, 3589783, 2255557, 6114647, 8290377, 1743903, 6381871, 5101549, 3974661, 562582, 5077717, 4177983, 8246594, 3641036, 7397265, 2746167, 707052, 7464696, 2300622, 2321935, 6221014, 121263, 3506671, 1630329, 2903387, 3702138, 1724206, 5613111, 8290876, 4491886, 5330095, 4232934, 4195684, 1378505, 7026438, 771172, 96567, 5206398, 7408765, 5863762], +[2900346, 1633235, 3549223, 1453425, 7152029, 3804074, 2641893, 1738267, 3003324, 3959952, 2038930, 4924861, 7707748, 3334695, 1624148, 8071190, 206406, 4264411, 2725737, 3526139, 7671056, 8291972, 1367245, 5440578, 7068627, 611340, 5590983, 6445950, 6237562, 5671559, 174985, 810924, 5782940, 6482026, 6681171, 3927085, 4536013, 7414191, 7331708, 5294732, 7950249, 3346725, 3230662, 1141861, 3127161, 2145579, 3367218, 4124045, 3806570, 5063323, 5196163, 719210, 6475916, 7920760, 5386774, 7128733, 6963558, 7007070, 6619222, 2050017, 3143947, 5252839, 5672248, 8223042, 1595892, 1373203, 687353, 8198722, 5177036, 7663100, 7502427, 7693444, 2331752, 6917651, 4750306, 1074759, 3540794, 7716060, 2912831, 6617879, 6698260, 8340294, 3806887, 3990880, 3513081, 3054668, 6908366, 100317, 7674350, 5521087, 1654445, 5949840, 3754156, 7084693, 7778178, 4045773, 1752409, 7537371, 3420884, 470364, 4970759, 7050067, 5892269, 3539613, 5575127, 6037929, 2579871, 7294548, 869774, 7741291, 2916527, 5155070, 5076028, 4573817, 7014440, 7686481, 886577, 3266774, 6763784, 2500065, 4014184, 4240638, 4618358, 6079617, 276556, 6091646, 6589848, 1406571, 5805712, 901059, 3247186, 6308016, 498688, 858533, 6247468, 621655, 11987, 4121898, 5007556, 693399, 3559818, 3453484, 2532024, 8148944, 7436349, 6433048, 4395331, 4783050, 970083, 2229570, 199362, 1899566, 5789648, 3008149, 6076592, 4467526, 8024006, 1126493, 2632488, 2849370, 4729786, 761609, 5475335, 1423608, 17016, 6250641, 2006105, 2800120, 3010277, 4237980, 4536118, 2503426, 1224575, 1377103, 1199373, 2314509, 7923636, 6675662, 4318114, 2097232, 5961135, 1713808, 6649241, 5546966, 1290306, 4959612, 7849408, 1795558, 4302087, 1922087, 7675471, 6859063, 1500216, 5156113, 4257846, 3061451, 5253593, 5764390, 2204334, 3052425, 150429, 5499614, 6662618, 2199360, 1384739, 4786820, 2006645, 4024810, 1564422, 839737, 7361476, 4888576, 5404267, 5203458, 376589, 2307744, 1248037, 1663590, 5011151, 2081223, 6530154, 7840266, 3475918, 2645298, 275416, 5294279, 3994751, 7855559, 5831998, 5450169, 3283224, 5729510, 5223164, 6721684, 1705346, 1546404, 8224316, 3976916, 1419779, 8330295, 7180711, 4300111, 2800026, 514484, 158457, 3678386, 7455508, 6488634, 4138533, 8032821, 2796605, 5151620, 8353961, 7597488, 6600225, 5699150], +[6662428, 3109606, 5726169, 5583854, 5346348, 1681286, 1767476, 2330215, 494461, 7924711, 6890475, 4336201, 6272576, 5438380, 3506851, 3030972, 5207405, 3326210, 7687219, 3933649, 7142457, 6048280, 5374569, 2940732, 5967072, 5040558, 3527081, 1908928, 3888962, 2791235, 7590695, 7372060, 4602116, 4973994, 2566856, 4196271, 2293795, 706732, 4820249, 4137586, 6948830, 3985494, 6923268, 5712050, 3633543, 7079513, 5038591, 985134, 3172222, 6408138, 8044558, 2479179, 2350875, 1351036, 1721074, 5145959, 487414, 2818036, 2149850, 5101843, 5751351, 4338407, 1178839, 3958902, 6113551, 5174935, 320829, 7329614, 638754, 7788144, 4990071, 3836363, 3131237, 1049347, 7557993, 3950793, 7428125, 1060415, 598281, 6220651, 6092599, 5590344, 8370192, 7406563, 3887265, 3517549, 1393070, 1640268, 6701423, 7001744, 5513137, 7889576, 5172993, 577931, 7055308, 281744, 6897147, 6867988, 2328953, 1219470, 1074806, 7734103, 2013284, 4502289, 4913368, 802696, 7521020, 1326243, 5694671, 6040038, 4340641, 3890965, 4504650, 2709814, 7611025, 1219391, 1373418, 1114293, 6045175, 1336789, 5030784, 4843569, 2119899, 3292633, 4877527, 6877052, 6869348, 463449, 5918460, 5936224, 6970743, 3426879, 6879659, 936302, 6835210, 5149656, 449795, 324396, 4858729, 6168812, 5460323, 5324217, 1590601, 1850558, 1035984, 6331114, 7672570, 2576774, 3102747, 6976930, 4086246, 5217042, 5456186, 3419824, 4570539, 2409418, 4133690, 2980277, 5057067, 2489185, 3418353, 2004521, 4650427, 5473820, 107071, 1810064, 7167391, 7401995, 8366485, 603617, 1611752, 7198869, 1641536, 1422659, 4741905, 3289259, 1072565, 7444295, 207736, 1597160, 2163120, 3605486, 8077958, 6043999, 5392701, 2616382, 2740919, 5946397, 6679695, 1616105, 3573331, 6143356, 7181589, 3876913, 7078646, 3305353, 7790595, 4858875, 1359807, 5159939, 671924, 6622757, 3853580, 6750703, 7190616, 2242413, 4949692, 995145, 3998447, 3705987, 6155058, 2305455, 6224955, 311752, 4392372, 5307845, 1493036, 8007973, 4217956, 7608910, 3489175, 1798314, 7046382, 7216759, 7964664, 2511691, 214299, 4033357, 8007375, 8372012, 2725310, 6471794, 5788177, 6213912, 2506293, 5697471, 6063502, 1917566, 2987276, 1680129, 1564352, 673379, 4131801, 3773193, 3570842, 6337699, 4565425, 214279, 3858912, 4239692, 868492, 6231548, 4328780, 466063, 8252955, 2189867], +[564921, 4529382, 117171, 1981, 1063286, 4786542, 4951541, 2584846, 2850869, 4156202, 502826, 6939001, 6483421, 117982, 7974683, 2075047, 2822159, 4196778, 1204541, 5550076, 8144561, 1177996, 1675552, 4402322, 749199, 3110311, 2126819, 6581, 3620819, 1559842, 4332940, 6641446, 2995763, 346906, 2697032, 6008288, 1935848, 5634090, 2951390, 3737766, 2439566, 1052877, 1556865, 3203974, 6180913, 6032070, 3069766, 6699812, 1790525, 3115783, 2752761, 7672068, 641231, 2191429, 2444582, 3685512, 2381656, 1091475, 6715531, 1404036, 2747766, 2548424, 1148512, 5478627, 4885724, 4550609, 5500126, 5279604, 1138397, 7753110, 4881841, 4018601, 1696529, 2492336, 5612503, 7112741, 4950362, 7569069, 2307263, 6386480, 2022739, 1937255, 2921267, 8145334, 5456586, 6640345, 5140239, 1649799, 2746792, 3791243, 6236244, 449369, 6944455, 4224132, 5130813, 4387788, 135488, 1696925, 2357707, 8215208, 1040301, 982624, 6581198, 39683, 5902478, 1489911, 6149474, 2339135, 5586020, 1689366, 8247267, 1269121, 7004054, 5093369, 999860, 6202677, 8173739, 7824350, 1732414, 1477122, 1217211, 7866960, 1582247, 1242107, 6344016, 167300, 5365465, 3441025, 4368913, 7575348, 1949485, 8242618, 8231606, 4707662, 7310572, 2371908, 5597614, 6838706, 3283765, 694612, 1080879, 6542247, 7967752, 2566178, 8306585, 8093129, 791135, 1956786, 5089416, 6992529, 4980871, 5344310, 4767941, 5058590, 1439488, 4271284, 5619432, 3366618, 4391745, 6165091, 4012684, 3462434, 4598806, 2817460, 979801, 820896, 2112612, 1069, 6790718, 3846635, 3475495, 7905854, 2618418, 2496054, 6513734, 2621178, 5661386, 4241941, 1716011, 6955991, 2051821, 7312506, 7160183, 1457211, 7283511, 1366154, 3404263, 5254324, 2221809, 6927115, 5586205, 3832291, 351131, 1096646, 1910566, 3147125, 3297425, 927817, 2756632, 6464315, 6704177, 5842806, 6234176, 7511538, 3833717, 7928712, 2850316, 5945246, 3630051, 2248269, 4735099, 5535957, 3898089, 6729253, 5800210, 3935446, 6111021, 6450172, 7722748, 57338, 3031184, 7531094, 7334669, 3059576, 493330, 2145848, 2683003, 6579559, 6496812, 3305570, 8009841, 1942880, 3397164, 1822560, 2994181, 8180296, 4553365, 7410334, 395623, 5025768, 7846910, 3096411, 2367022, 4301761, 3194944, 8014143, 2839264, 6558644, 1635516, 8114441, 6756209, 4199646, 4104937, 6425572, 4994654, 6432772]] +w = NTTInverse(aHat * NTT(y)): [[8082295, 4558021, 1491014, 332890, 2387320, 441072, 4232300, 1897976, 3860210, 1332958, 8166527, 5311251, 855473, 2494006, 5425522, 6176811, 7338411, 2004829, 7287722, 1284308, 6105170, 3562828, 1400725, 4619518, 775275, 2127563, 5808395, 604951, 1919156, 7422382, 6838134, 2435521, 3816290, 900395, 1307905, 5674484, 7057861, 5901164, 3196470, 3739859, 5810287, 7982922, 1204054, 188698, 7973240, 2853174, 8157609, 746989, 1223242, 5151698, 5811167, 5665380, 7488194, 5252884, 4003030, 6408385, 6207408, 5104704, 6416462, 2591570, 191450, 2735460, 8118246, 835904, 8070287, 3104410, 442681, 6679198, 4298676, 1144923, 4687638, 315512, 5497582, 1939451, 2524110, 4481611, 3875834, 7532641, 1178411, 4346268, 3194161, 6346568, 2820541, 7609199, 8119369, 7429367, 4945172, 8028520, 5678854, 3294584, 1975236, 4954019, 4537150, 1291753, 6158495, 261771, 7154056, 6673933, 2020316, 4119083, 7480019, 4298371, 1396660, 6901523, 4976814, 3271815, 5673605, 4423950, 2132792, 5484829, 6192031, 992775, 8100587, 6439524, 8057073, 7260410, 1710374, 2140123, 5190044, 977980, 6900632, 4041371, 1521224, 1851343, 1479136, 866082, 8277514, 2919052, 7595323, 2117261, 7054237, 578501, 8309380, 989284, 7164674, 4684811, 858345, 1247954, 1730521, 7797587, 5463225, 5879390, 3222418, 5298701, 4862976, 7378648, 8025199, 4528951, 3770479, 3374426, 7946224, 6191138, 2789750, 4699581, 2389211, 5700380, 2147305, 3035395, 6033363, 43694, 8228183, 849944, 7007308, 2929161, 4865754, 7611869, 1107701, 6128731, 3582588, 529562, 5165776, 5602602, 5370407, 3523446, 747820, 3523891, 2893108, 6352839, 749386, 6838313, 5917051, 7718115, 7089887, 347801, 6443933, 1617754, 13345, 3150650, 1370084, 3941894, 7408817, 407067, 1027092, 5441536, 4014492, 3466498, 1035461, 4766446, 2893010, 7379741, 4393507, 2106889, 2254185, 2896935, 1843885, 3201391, 6861496, 3647816, 6423683, 967471, 7028575, 315150, 1737067, 2976401, 209111, 2206534, 192611, 278728, 6003015, 5905015, 7553585, 6419486, 1129295, 1336909, 3401300, 2803853, 8354119, 5141839, 5560603, 1368959, 1985482, 7246537, 203280, 7732305, 4436369, 1766398, 971892, 715237, 7429180, 6417055, 5416729, 2688517, 7897161, 4899085, 2561129, 5281357, 4360904, 2057909, 1527030, 4019252, 481930, 664649, 609762, 5414998, 4900435, 416798], +[4314496, 280514, 1030516, 5936513, 8288859, 2417243, 76298, 5920524, 2863139, 4578535, 3034225, 2466980, 2055103, 7800993, 3587966, 506406, 2684454, 379143, 4755626, 4472209, 5021460, 5911630, 7476473, 4878114, 6201670, 1665473, 5625466, 6340073, 3475053, 925174, 4994590, 6527114, 1102880, 6538078, 157739, 4088396, 6648821, 4026046, 6590814, 4713999, 1127476, 3175062, 3425985, 6866629, 5161212, 2331666, 1632106, 2899213, 737837, 6371941, 7664834, 1234202, 7720941, 1605780, 2063070, 268100, 3403560, 6353768, 4555374, 1267812, 7577157, 7059192, 272114, 7734971, 4071919, 3986496, 3520001, 5265368, 5808484, 7148085, 6537231, 8358392, 1466666, 5941626, 4994019, 5901653, 3364035, 6249234, 6800916, 748173, 255632, 3313412, 531870, 2466683, 2306435, 3904842, 6307614, 4139816, 6563392, 5648102, 367898, 2932262, 6340794, 6044376, 2220886, 6501724, 7079195, 7471050, 5633892, 7886035, 5306592, 4496320, 5784808, 5828813, 6130598, 7628360, 8042357, 3288812, 5094881, 1180797, 913763, 7396474, 1920444, 7452550, 1203906, 6974465, 1906363, 4376657, 1327934, 1429115, 7763223, 2411820, 5405453, 2746269, 6477570, 616598, 7123510, 2752670, 557979, 5546297, 7302955, 2585132, 213981, 3762894, 2122613, 6473112, 5342010, 77782, 639338, 7601681, 2307698, 7945631, 7754362, 3683224, 2173214, 283569, 1930096, 3660078, 1090883, 6809063, 4025406, 1858741, 4216321, 4244295, 2038442, 6105539, 2579817, 3619368, 4762354, 7024189, 8132719, 6951082, 5873492, 4228334, 5666442, 3141181, 2730108, 7164098, 7447735, 3568063, 4811060, 5214397, 5693963, 2315467, 7763112, 2052612, 3746666, 6944991, 7088036, 6243405, 709419, 6421737, 1565982, 7689714, 6428925, 622739, 2572701, 1072011, 7063150, 3769594, 7727205, 3394607, 7342157, 1227828, 7246436, 3675272, 7609953, 6130876, 1626574, 1195122, 2480804, 2401179, 2159363, 3940674, 6035213, 5654742, 5361668, 6087921, 6318034, 7470375, 6368333, 1572923, 279057, 3393595, 3669278, 3974120, 2995823, 3519032, 1655918, 3411804, 2457206, 2279502, 2571413, 3890401, 1258973, 4432999, 4709439, 7179277, 4911719, 5617255, 4081672, 444039, 1172598, 2017445, 897648, 872598, 1052354, 2003406, 709365, 469997, 8011150, 8007354, 3868693, 3114326, 7777812, 7323175, 3416044, 3657506, 2557722, 2730418, 6144152, 99630, 5358436, 5127038, 2119768, 5339421], +[4639444, 2685286, 7297708, 1314538, 6455447, 4717314, 6617269, 4058553, 6856689, 3687912, 1246819, 7038456, 3167092, 268301, 754409, 315022, 2329937, 4212220, 8291930, 168029, 5105105, 3921988, 1273994, 7492220, 210356, 777683, 3744129, 4302348, 561139, 1656186, 7675043, 5195531, 7536904, 8336423, 4007393, 2660406, 6157245, 7395227, 6468202, 2628411, 3439270, 5093536, 3903436, 5257634, 8249262, 6093718, 2726731, 6761028, 5589171, 1711624, 3479091, 3268393, 2883026, 5033365, 6904904, 8013652, 8277540, 556839, 3740892, 3219109, 8244145, 127494, 3861172, 3559434, 5447881, 7438323, 6359885, 6733145, 7128181, 5791053, 4255231, 6003001, 1681079, 3002655, 3647522, 2087393, 2253013, 8072814, 5082030, 3861739, 2455564, 6186370, 7938979, 5307290, 2255898, 2466706, 2664579, 5017556, 8207442, 4524437, 1657703, 3661955, 2945749, 1397870, 1182813, 1176784, 1784894, 3230125, 3454841, 1083185, 1757034, 5536021, 7272580, 3388615, 8122415, 7474464, 3688051, 4375341, 6352828, 500133, 4590284, 5000277, 1880794, 969217, 3392779, 6087396, 5737542, 5992848, 4714644, 5219364, 3156771, 2024990, 540458, 438197, 193562, 3852122, 1844685, 5762375, 2659753, 5727507, 6902931, 4373427, 3603998, 8298133, 5045744, 5734361, 2251642, 4562777, 4595494, 1659114, 1983725, 1366684, 7239767, 6692107, 2730923, 5759602, 67944, 4785047, 4491703, 4033354, 5854424, 1311835, 2744297, 2972529, 1221261, 3819000, 6756784, 5216512, 6970174, 3477135, 36722, 2149410, 6245463, 5297839, 5900045, 6934651, 3585179, 2536415, 6202206, 613107, 1606566, 139610, 1615903, 171949, 6760205, 2219874, 2881937, 3198245, 2042395, 74167, 4447203, 3113778, 3318777, 2409140, 5018961, 676699, 516149, 1873999, 6886580, 3828860, 5528688, 7209391, 642890, 4874190, 4003064, 181596, 1951915, 5840336, 6388217, 3978807, 1058770, 8158765, 4858112, 4807667, 1420074, 4597970, 3790515, 459682, 1460365, 6764839, 2858493, 5054511, 413069, 6049396, 4742309, 6249575, 1050836, 5719901, 2780850, 883542, 4132677, 108715, 7435998, 7968434, 5631402, 6348922, 2694025, 8190344, 5142380, 1128925, 3883455, 4886041, 6205089, 4972192, 680910, 4183768, 7917029, 5409992, 2951215, 7580637, 4676006, 2553926, 8331073, 3548897, 5351047, 1377514, 1004527, 2346578, 5904110, 3298229, 8231524, 1280789, 4174361, 4710398, 5783581, 2250509], +[6335808, 7332057, 3366781, 1622278, 3046777, 5149424, 7948782, 1642067, 8177351, 4061088, 1459014, 6142844, 1124292, 1179424, 6285796, 7284029, 2200527, 6317695, 1898394, 750242, 2448935, 7828297, 2192975, 7748585, 902461, 1504507, 3504143, 7709124, 6907353, 5665008, 4542466, 4166470, 40651, 4726253, 4076098, 1452656, 2639751, 975782, 3299426, 3618422, 2044109, 9154, 1405347, 1437670, 3797292, 3470952, 3672277, 1941604, 4227891, 2404432, 2380069, 6639538, 1500744, 7428106, 4969979, 6216150, 836577, 4114118, 178286, 3391793, 5062471, 3142898, 1637821, 7503829, 6853270, 7903135, 1972663, 4308711, 5819142, 5379612, 7784858, 1450762, 2952306, 2582508, 2051220, 610535, 6805882, 4955670, 7940127, 1446379, 3357819, 4645761, 4812986, 7083586, 6248722, 1087620, 5120630, 3300939, 6073420, 2226045, 5298110, 2574085, 6474141, 1737275, 3246187, 446937, 7493220, 3120194, 7391582, 1665655, 1437966, 8136113, 2478011, 6738892, 5284979, 8067090, 1017243, 3688689, 6813611, 5832012, 5144368, 5903062, 4594871, 2480202, 2414292, 7015822, 4650376, 121816, 2198670, 7311786, 7985000, 7716369, 5600507, 4804597, 7814945, 4710547, 3341775, 3218805, 4844542, 7599280, 4585188, 1843007, 5138641, 6802571, 390800, 1655965, 4748926, 8262464, 4749357, 5480917, 3071400, 3457965, 2818627, 7693707, 534132, 2396544, 2440197, 3677352, 7106066, 5581041, 1144399, 275987, 7278775, 6675288, 5358679, 7454780, 3618093, 1581161, 11599, 5915478, 2210842, 2723050, 2051713, 2584908, 4743200, 7693970, 7101835, 1083614, 7677217, 6759639, 2883229, 6209471, 1799610, 6534369, 3868614, 206754, 3620843, 2883038, 7406667, 4737833, 1106784, 5198611, 4464087, 1833853, 7064084, 5210112, 5470029, 3727, 231763, 5092063, 7412545, 2671580, 7118873, 6932674, 1907619, 1405042, 7096473, 4560043, 6452272, 7504558, 5727050, 4468124, 6394349, 1112074, 917521, 6211870, 6743358, 8145231, 2889924, 6573712, 7159715, 5113027, 4860150, 5031012, 6607750, 4286717, 5410888, 171086, 915741, 4255326, 958569, 3108442, 1413842, 6793265, 5225922, 5303680, 1312540, 2840465, 2173377, 3645741, 640245, 5040598, 5970927, 7593419, 4778645, 5840646, 4910298, 6955973, 1164114, 7377937, 3923648, 2701314, 3934325, 1704788, 1226611, 8177364, 5798785, 1758250, 4383714, 4372156, 6764627, 6769427, 6718647, 2425634, 4558137, 3869929], +[1254442, 5747442, 2605370, 1066467, 1489044, 120592, 6777424, 4180104, 6599296, 3073144, 6957554, 3285562, 1972365, 746921, 1863121, 8124751, 5355671, 5295709, 7285801, 6213069, 7821876, 6749814, 1978675, 6726327, 624144, 3717095, 2632719, 6072384, 2965530, 3347510, 1243126, 4656494, 6194945, 2994869, 3972941, 450179, 6148349, 2933789, 3065127, 1557166, 5599606, 1092736, 7199548, 5169317, 7852837, 7922748, 2465981, 2476022, 7951800, 6930930, 3316727, 3689559, 1081846, 2997150, 4431228, 7970963, 2362177, 5328318, 3466066, 4989704, 2037492, 1245239, 3944741, 2785748, 2574552, 7482269, 3779874, 5333498, 5898005, 7109922, 7792708, 3485963, 2348588, 3438828, 5310600, 6073897, 1419109, 5970968, 2508943, 5065228, 1050018, 3846883, 6058513, 6493125, 2318972, 927275, 4911093, 770282, 5886727, 3336372, 384465, 8088992, 398256, 3910905, 4192366, 1520367, 5122053, 5966806, 7255443, 3251276, 7115682, 2697764, 2830659, 1985087, 7140272, 2328185, 7697743, 4366936, 1097326, 5519351, 2840189, 6092025, 2253520, 5227658, 6095728, 4216350, 3192621, 4579117, 7061244, 5697088, 7861795, 5807009, 2046944, 3066098, 1765894, 2169003, 8376789, 2897130, 4686698, 3476541, 8151649, 4225731, 2005133, 5398155, 465475, 3563660, 3977631, 4390829, 1080854, 5604740, 5759716, 3902778, 258282, 7687795, 5846803, 1554687, 1584301, 4438582, 4797000, 20132, 2894771, 4422000, 3319977, 5945686, 1516582, 7063001, 7653382, 876606, 1732063, 7719946, 1732515, 1383617, 3958855, 3090206, 4682318, 1939547, 7020798, 6009736, 7330097, 8001354, 2796786, 6242539, 3596721, 4403085, 589440, 7328003, 5259185, 1875255, 3420954, 7677387, 8311156, 6940483, 8359095, 743479, 8175338, 5195736, 3065162, 1306193, 7334486, 899281, 7335388, 6940242, 5032744, 8275559, 1422044, 2295451, 572135, 4378259, 2859798, 8294650, 6929929, 5703103, 6028962, 3228459, 3100809, 5881776, 1507734, 2662233, 159820, 4106398, 4809534, 2234295, 6634241, 2475386, 7036562, 6753424, 5771049, 5945717, 6272871, 784745, 1767969, 8343272, 430980, 6705887, 7865030, 7690438, 4202179, 2825939, 4980224, 5738064, 1469679, 969685, 4164585, 7837454, 3177552, 4593786, 8273943, 968028, 3448143, 7687640, 444586, 7513885, 2469989, 4962644, 6947943, 7139034, 6755704, 1939267, 1934192, 4042999, 3113375, 488624, 4888487, 7943412, 5573809, 1236035], +[7123951, 6597879, 6624195, 2988091, 1983435, 3685791, 34358, 4888657, 2634193, 6746086, 7121192, 1694288, 1907580, 2402712, 1808802, 6784903, 6807856, 137240, 6595055, 4778537, 1745095, 6006395, 5820922, 7468522, 4936081, 3084949, 6005318, 6967762, 7838538, 3276166, 7416359, 7907532, 7469911, 3512701, 7942109, 6076947, 8087350, 5265535, 195492, 2969004, 8114887, 563155, 1053014, 8070043, 4699892, 7902121, 1838386, 5971021, 583640, 1762506, 2961384, 3046135, 1824090, 6795420, 1602642, 1373898, 490108, 5772839, 5035656, 2910327, 7019831, 6263207, 2365922, 863571, 4688693, 7793006, 233546, 3753106, 7416461, 7403946, 5214336, 959404, 1057219, 5569323, 4956940, 5477363, 1798314, 7011669, 1411367, 4946478, 1558068, 246426, 4625373, 5156494, 1434841, 6729558, 266576, 3169576, 2874437, 6624672, 8200449, 2440039, 4437214, 511423, 7778632, 8283177, 2010035, 656728, 4460365, 97634, 2814805, 2566633, 4839539, 5018315, 4923926, 1676866, 5284254, 4456380, 5029457, 5467065, 4144411, 1391421, 7354283, 582307, 1576025, 789457, 8375347, 4371791, 6863029, 3919302, 1229491, 7065540, 5288302, 5467257, 4973745, 7921558, 7729805, 4695066, 3821837, 3247831, 6383686, 246021, 2950528, 5561044, 1823227, 1479493, 1961945, 5933871, 1020716, 2742337, 4299517, 7359308, 3971956, 7613265, 7078407, 5267323, 6050630, 6460904, 6645603, 6327907, 622816, 3957889, 5363871, 110077, 7489773, 871116, 5338979, 5890410, 2929799, 2500982, 7059678, 8161214, 7818056, 7672997, 6944946, 5048940, 1153582, 970124, 5301011, 7631051, 6317436, 7407661, 5526495, 3515243, 7547201, 3407038, 7666475, 7424177, 2303565, 7789589, 6327894, 2393870, 7005387, 8174221, 7343947, 6204709, 79264, 1457393, 2840799, 3403868, 900749, 8263796, 7960984, 8171228, 1020617, 2956889, 1498340, 1672914, 7990555, 2606445, 8378439, 7378435, 400057, 7693869, 5715631, 4902343, 4697756, 15043, 6371444, 3612939, 4712107, 4980513, 3713326, 1086023, 4100187, 1761461, 2389464, 6958369, 4201145, 2725522, 7774889, 8111670, 1619666, 4990963, 2270146, 7918043, 7350783, 8080064, 4618065, 4981138, 5365894, 7810251, 5799341, 899698, 7084870, 7760859, 1315509, 1516055, 3696027, 1483184, 3514948, 3144433, 1397066, 4205653, 317007, 52345, 6525451, 4004505, 4621598, 4920577, 2086096, 4947577, 7037846, 8077416, 5037895, 2724109], +[8132562, 4491608, 5536398, 1050896, 842724, 863206, 6063034, 6584002, 8230116, 5461772, 5109965, 6350075, 5989249, 7936185, 3610723, 4716122, 656763, 4278824, 7955464, 2006949, 6461064, 6802097, 3886603, 6968610, 5479552, 2985816, 1864138, 2015942, 1771464, 6465898, 3119424, 4224330, 5883206, 7037700, 4607843, 570739, 7200475, 1034557, 5616984, 7627635, 7384664, 2912934, 4686101, 5505111, 3140951, 3763168, 1672044, 7413632, 5290517, 4426618, 7544283, 5382571, 5210986, 5301770, 3702243, 1261232, 1552584, 6894492, 3690887, 8309157, 3782066, 6200131, 2070481, 5015503, 7838528, 5414799, 7906715, 8222477, 893046, 8359279, 3526653, 4657435, 3134628, 5203699, 99824, 1554231, 991703, 6118348, 90676, 3973954, 6454381, 3825234, 583729, 5069514, 5910108, 1597056, 4967436, 3274333, 1414465, 108713, 826258, 5231110, 7065864, 8241636, 8005985, 5796634, 7043914, 967271, 5214626, 3594158, 193542, 3243789, 300424, 6076524, 5760547, 980522, 2896402, 719116, 7904037, 7181778, 4509891, 6051705, 70950, 3550108, 6879472, 2120766, 4275524, 3255835, 1430400, 1051472, 6825533, 2226138, 7111492, 1861319, 315749, 5533375, 2386657, 3501782, 2057739, 2397760, 320241, 6476765, 1490431, 7134764, 1102264, 8027750, 614821, 3352252, 1454059, 4916669, 2674398, 1364612, 2725667, 6631485, 7224374, 8229622, 5405987, 4850166, 617044, 1897288, 5672061, 5408836, 4827180, 3558431, 6760464, 4760374, 7033440, 2523616, 4013519, 1929356, 7449993, 7764578, 5341774, 1934280, 3600313, 2332901, 4697088, 553570, 6266479, 1796248, 7235559, 4626745, 6725039, 7813237, 1618103, 1566984, 4839009, 988560, 2546919, 5912461, 1790013, 5314076, 1440757, 6062267, 6109558, 2986233, 7731074, 4678425, 3859303, 4350102, 6934034, 1516843, 2758723, 3485250, 2301739, 4352764, 7567243, 6110483, 1399925, 1734440, 3128474, 8040659, 7991008, 8228644, 7690226, 3565283, 2988889, 1274302, 4054440, 5562012, 32888, 1149842, 5561076, 4205760, 3316046, 6129649, 523241, 1299594, 3190569, 3075710, 6966994, 7106665, 7343854, 2561621, 5171900, 8367846, 5668844, 7068577, 1079146, 2862475, 7105568, 1523260, 3792547, 5833824, 1670496, 4723873, 4058194, 401378, 8146110, 1905754, 451689, 2631760, 7372889, 2226820, 8237199, 2722399, 194536, 717877, 1550699, 5879921, 1251050, 5907794, 241654, 4746318, 3386424, 5170646], +[2176284, 1773997, 7612141, 7136419, 2811950, 5686109, 756371, 1528655, 1853576, 1360817, 3154900, 1743676, 8104988, 2074105, 4476636, 3781430, 4214477, 8129143, 4247057, 5841221, 7756192, 3542437, 5036228, 7641835, 6769136, 3130833, 8177354, 6351279, 4568216, 1369382, 1615512, 7217581, 1671996, 892967, 3696805, 1389161, 6946845, 914804, 2691076, 3156142, 6197421, 3442987, 6196463, 7094793, 3636910, 5048746, 3610443, 4919791, 7759982, 597844, 1570332, 6048486, 3659398, 2375710, 823916, 1010124, 5394992, 5924144, 3045646, 652503, 8201605, 7699117, 3689166, 3995062, 2791511, 4234248, 860096, 6331010, 6500045, 698691, 1414007, 8335740, 4537936, 593047, 4434402, 4498155, 2816221, 2197830, 7055294, 1733162, 3126586, 1804407, 4476539, 5019262, 2401792, 7559250, 3337006, 5812675, 1192935, 3000922, 7476698, 7468044, 2757837, 7942249, 2863087, 428655, 3625465, 1581312, 4616253, 1953776, 7243334, 5226453, 720852, 6881329, 4094656, 6293263, 1930407, 4758510, 6899854, 4888400, 6779213, 3670391, 5793527, 6602267, 3221237, 1584538, 7475278, 473532, 3020467, 5179289, 4508194, 5685429, 5065372, 2176776, 7151328, 68732, 1403708, 439829, 5423888, 1468817, 2510296, 1677555, 6059525, 2092942, 3087899, 5744266, 6472954, 5502190, 5977, 6207749, 5751152, 595141, 3426013, 4344973, 6110109, 7338778, 3164429, 761097, 456506, 759757, 7207388, 6803045, 7414043, 6865136, 8324982, 4125097, 1139844, 572963, 8168936, 1445822, 3632395, 1823721, 6356495, 5262178, 2747180, 5758033, 1379452, 7654630, 388389, 6366780, 2240602, 3036901, 3734498, 3926868, 664091, 3177317, 6470605, 3726083, 1959366, 6269388, 6639790, 5689555, 6725064, 4096447, 4839441, 359052, 2469621, 192568, 2360784, 1284321, 7601334, 3101155, 2064123, 1267757, 898228, 6139365, 5222083, 1050985, 7173431, 2741712, 7583633, 5942287, 1639208, 6312963, 7271690, 5663205, 1658562, 7311792, 6415669, 7265483, 555361, 1362612, 4207151, 4819029, 495397, 7848118, 2260059, 7768915, 1855136, 5698552, 2669035, 2295409, 6515418, 1936661, 4025757, 8052114, 4314097, 2453619, 6504955, 2763190, 1964990, 6302335, 6954887, 7501978, 3955968, 938842, 3826417, 5364808, 5435712, 3107097, 3045901, 6871384, 1376666, 1526018, 8122125, 4806916, 811801, 5666954, 7162153, 7831041, 3427407, 2761985, 1234915, 3169799, 5129680, 5045920]] + +w1: [[15, 9, 3, 1, 5, 1, 8, 4, 7, 3, 0, 10, 2, 5, 10, 12, 14, 4, 14, 2, 12, 7, 3, 9, 1, 4, 11, 1, 4, 14, 13, 5, 7, 2, 2, 11, 13, 11, 6, 7, 11, 15, 2, 0, 15, 5, 0, 1, 2, 10, 11, 11, 14, 10, 8, 12, 12, 10, 12, 5, 0, 5, 15, 2, 15, 6, 1, 13, 8, 2, 9, 1, 10, 4, 5, 9, 7, 14, 2, 8, 6, 12, 5, 15, 0, 14, 9, 15, 11, 6, 4, 9, 9, 2, 12, 0, 14, 13, 4, 8, 14, 8, 3, 13, 10, 6, 11, 8, 4, 10, 12, 2, 15, 12, 15, 14, 3, 4, 10, 2, 13, 8, 3, 4, 3, 2, 0, 6, 15, 4, 13, 1, 0, 2, 14, 9, 2, 2, 3, 15, 10, 11, 6, 10, 9, 14, 15, 9, 7, 6, 15, 12, 5, 9, 5, 11, 4, 6, 12, 0, 0, 2, 13, 6, 9, 15, 2, 12, 7, 1, 10, 11, 10, 7, 1, 7, 6, 12, 1, 13, 11, 15, 14, 1, 12, 3, 0, 6, 3, 8, 14, 1, 2, 10, 8, 7, 2, 9, 6, 14, 8, 4, 4, 6, 4, 6, 13, 7, 12, 2, 13, 1, 3, 6, 0, 4, 0, 1, 11, 11, 14, 12, 2, 3, 6, 5, 0, 10, 11, 3, 4, 14, 0, 15, 8, 3, 2, 1, 14, 12, 10, 5, 15, 9, 5, 10, 8, 4, 3, 8, 1, 1, 1, 10, 9, 1], +[8, 1, 2, 11, 0, 5, 0, 11, 5, 9, 6, 5, 4, 15, 7, 1, 5, 1, 9, 9, 10, 11, 14, 9, 12, 3, 11, 12, 7, 2, 10, 12, 2, 12, 0, 8, 13, 8, 13, 9, 2, 6, 7, 13, 10, 4, 3, 6, 1, 12, 15, 2, 15, 3, 4, 1, 6, 12, 9, 2, 14, 13, 1, 15, 8, 8, 7, 10, 11, 14, 12, 0, 3, 11, 10, 11, 6, 12, 13, 1, 0, 6, 1, 5, 4, 7, 12, 8, 13, 11, 1, 6, 12, 12, 4, 12, 14, 14, 11, 15, 10, 9, 11, 11, 12, 15, 15, 6, 10, 2, 2, 14, 4, 14, 2, 13, 4, 8, 3, 3, 15, 5, 10, 5, 12, 1, 14, 5, 1, 11, 14, 5, 0, 7, 4, 12, 10, 0, 1, 15, 4, 15, 15, 7, 4, 1, 4, 7, 2, 13, 8, 4, 8, 8, 4, 12, 5, 7, 9, 13, 0, 13, 11, 8, 11, 6, 5, 14, 14, 7, 9, 10, 11, 4, 15, 4, 7, 13, 14, 12, 1, 12, 3, 15, 12, 1, 5, 2, 13, 7, 15, 6, 14, 2, 14, 7, 15, 12, 3, 2, 5, 5, 4, 8, 12, 11, 10, 12, 12, 14, 12, 3, 1, 6, 7, 8, 6, 7, 3, 7, 5, 4, 5, 7, 2, 8, 9, 14, 9, 11, 8, 1, 2, 4, 2, 2, 2, 4, 1, 1, 15, 15, 7, 6, 15, 14, 7, 7, 5, 5, 12, 0, 10, 10, 4, 10], +[9, 5, 14, 3, 12, 9, 13, 8, 13, 7, 2, 13, 6, 1, 1, 1, 4, 8, 0, 0, 10, 7, 2, 14, 0, 1, 7, 8, 1, 3, 15, 10, 14, 0, 8, 5, 12, 14, 12, 5, 7, 10, 7, 10, 0, 12, 5, 13, 11, 3, 7, 6, 6, 10, 13, 15, 0, 1, 7, 6, 0, 0, 7, 7, 10, 14, 12, 13, 14, 11, 8, 11, 3, 6, 7, 4, 4, 15, 10, 7, 5, 12, 15, 10, 4, 5, 5, 10, 0, 9, 3, 7, 6, 3, 2, 2, 3, 6, 7, 2, 3, 11, 14, 6, 0, 14, 7, 8, 12, 1, 9, 10, 4, 2, 6, 12, 11, 11, 9, 10, 6, 4, 1, 1, 0, 7, 4, 11, 5, 11, 13, 8, 7, 0, 10, 11, 4, 9, 9, 3, 4, 3, 14, 13, 5, 11, 0, 9, 9, 8, 11, 3, 5, 6, 2, 7, 13, 10, 13, 7, 0, 4, 12, 10, 11, 13, 7, 5, 12, 1, 3, 0, 3, 0, 13, 4, 6, 6, 4, 0, 8, 6, 6, 5, 10, 1, 1, 4, 13, 7, 11, 14, 1, 9, 8, 0, 4, 11, 12, 8, 2, 0, 9, 9, 3, 9, 7, 1, 3, 13, 5, 10, 1, 12, 9, 12, 2, 11, 5, 2, 8, 0, 14, 15, 11, 12, 5, 0, 10, 2, 7, 9, 12, 9, 1, 8, 15, 10, 6, 14, 9, 5, 0, 7, 10, 3, 2, 4, 11, 6, 0, 2, 8, 9, 11, 4], +[12, 14, 6, 3, 6, 10, 15, 3, 0, 8, 3, 12, 2, 2, 12, 14, 4, 12, 4, 1, 5, 15, 4, 15, 2, 3, 7, 15, 13, 11, 9, 8, 0, 9, 8, 3, 5, 2, 6, 7, 4, 0, 3, 3, 7, 7, 7, 4, 8, 5, 5, 13, 3, 14, 9, 12, 2, 8, 0, 6, 10, 6, 3, 14, 13, 15, 4, 8, 11, 10, 15, 3, 6, 5, 4, 1, 13, 9, 15, 3, 6, 9, 9, 14, 12, 2, 10, 6, 12, 4, 10, 5, 12, 3, 6, 1, 14, 6, 14, 3, 3, 0, 5, 13, 10, 15, 2, 7, 13, 11, 10, 11, 9, 5, 5, 13, 9, 0, 4, 14, 15, 15, 11, 9, 15, 9, 6, 6, 9, 15, 9, 4, 10, 13, 1, 3, 9, 0, 9, 10, 6, 7, 5, 15, 1, 5, 5, 7, 14, 11, 2, 1, 14, 13, 10, 14, 7, 3, 0, 11, 4, 5, 4, 5, 9, 15, 14, 2, 15, 13, 6, 12, 3, 12, 7, 0, 7, 6, 14, 9, 2, 10, 9, 4, 13, 10, 10, 0, 0, 10, 14, 5, 14, 13, 4, 3, 14, 9, 12, 14, 11, 9, 12, 2, 2, 12, 13, 0, 6, 13, 14, 10, 9, 10, 13, 8, 10, 0, 2, 8, 2, 6, 3, 13, 10, 10, 3, 5, 4, 7, 1, 10, 11, 14, 9, 11, 9, 13, 2, 14, 7, 5, 8, 3, 2, 0, 11, 3, 8, 8, 13, 13, 13, 5, 9, 7], +[2, 11, 5, 2, 3, 0, 13, 8, 13, 6, 13, 6, 4, 1, 4, 0, 10, 10, 14, 12, 15, 13, 4, 13, 1, 7, 5, 12, 6, 6, 2, 9, 12, 6, 8, 1, 12, 6, 6, 3, 11, 2, 14, 10, 15, 15, 5, 5, 15, 13, 6, 7, 2, 6, 8, 15, 5, 10, 7, 10, 4, 2, 8, 5, 5, 14, 7, 10, 11, 14, 15, 7, 4, 7, 10, 12, 3, 11, 5, 10, 2, 7, 12, 12, 4, 2, 9, 1, 11, 6, 1, 15, 1, 7, 8, 3, 10, 11, 14, 6, 14, 5, 5, 4, 14, 4, 15, 8, 2, 11, 5, 12, 4, 10, 12, 8, 6, 9, 13, 11, 15, 11, 4, 6, 3, 4, 0, 6, 9, 7, 0, 8, 4, 10, 1, 7, 8, 8, 2, 11, 11, 7, 0, 15, 11, 3, 3, 8, 9, 0, 6, 8, 6, 11, 3, 13, 15, 2, 3, 15, 3, 3, 8, 6, 9, 4, 13, 11, 14, 15, 5, 12, 7, 8, 1, 14, 10, 4, 7, 15, 0, 13, 0, 1, 0, 10, 6, 2, 14, 2, 14, 13, 10, 0, 3, 4, 1, 8, 5, 0, 13, 11, 12, 6, 6, 11, 3, 5, 0, 8, 9, 4, 13, 5, 13, 13, 11, 11, 12, 1, 3, 0, 1, 13, 15, 15, 8, 5, 10, 11, 3, 2, 8, 15, 6, 9, 0, 2, 7, 15, 1, 14, 5, 9, 13, 14, 13, 4, 4, 8, 6, 1, 9, 15, 11, 2], +[14, 13, 13, 6, 4, 7, 0, 9, 5, 13, 14, 3, 4, 5, 3, 13, 13, 0, 13, 9, 3, 11, 11, 14, 9, 6, 11, 13, 15, 6, 14, 15, 14, 7, 15, 12, 15, 10, 0, 6, 15, 1, 2, 15, 9, 15, 4, 11, 1, 3, 6, 6, 3, 13, 3, 3, 1, 11, 10, 6, 13, 12, 5, 2, 9, 15, 0, 7, 14, 14, 10, 2, 2, 11, 9, 10, 3, 13, 3, 9, 3, 0, 9, 10, 3, 13, 1, 6, 5, 13, 0, 5, 8, 1, 15, 0, 4, 1, 9, 0, 5, 5, 9, 10, 9, 3, 10, 9, 10, 10, 8, 3, 14, 1, 3, 2, 0, 8, 13, 7, 2, 13, 10, 10, 9, 15, 15, 9, 7, 6, 12, 0, 6, 11, 3, 3, 4, 11, 2, 5, 8, 14, 8, 15, 14, 10, 12, 12, 13, 12, 1, 8, 10, 0, 14, 2, 10, 11, 6, 5, 13, 0, 15, 15, 13, 10, 2, 2, 10, 15, 12, 14, 11, 7, 14, 7, 15, 14, 4, 15, 12, 5, 13, 0, 14, 12, 0, 3, 5, 6, 2, 0, 15, 0, 2, 6, 3, 3, 15, 5, 0, 14, 1, 15, 11, 9, 9, 0, 12, 7, 9, 10, 7, 2, 8, 3, 5, 13, 8, 5, 15, 15, 3, 10, 4, 15, 14, 15, 9, 10, 10, 15, 11, 2, 14, 15, 3, 3, 7, 3, 7, 6, 3, 8, 1, 0, 12, 8, 9, 9, 4, 9, 13, 15, 10, 5], +[0, 9, 11, 2, 2, 2, 12, 13, 0, 10, 10, 12, 11, 15, 7, 9, 1, 8, 15, 4, 12, 13, 7, 13, 10, 6, 4, 4, 3, 12, 6, 8, 11, 13, 9, 1, 14, 2, 11, 15, 14, 6, 9, 11, 6, 7, 3, 14, 10, 8, 14, 10, 10, 10, 7, 2, 3, 13, 7, 0, 7, 12, 4, 10, 15, 10, 15, 0, 2, 0, 7, 9, 6, 10, 0, 3, 2, 12, 0, 8, 12, 7, 1, 10, 11, 3, 9, 6, 3, 0, 2, 10, 13, 0, 15, 11, 13, 2, 10, 7, 0, 6, 1, 12, 11, 2, 6, 1, 15, 14, 9, 12, 0, 7, 13, 4, 8, 6, 3, 2, 13, 4, 14, 4, 1, 11, 5, 7, 4, 5, 1, 12, 3, 14, 2, 15, 1, 6, 3, 9, 5, 3, 5, 13, 14, 0, 10, 9, 1, 4, 11, 10, 9, 7, 13, 9, 13, 5, 8, 4, 14, 15, 10, 4, 7, 4, 9, 1, 12, 3, 14, 9, 13, 15, 3, 3, 9, 2, 5, 11, 3, 10, 3, 12, 12, 6, 15, 9, 7, 8, 13, 3, 5, 7, 4, 8, 14, 12, 3, 3, 6, 15, 15, 0, 15, 7, 6, 2, 8, 11, 0, 2, 11, 8, 6, 12, 1, 2, 6, 6, 13, 14, 14, 5, 10, 0, 11, 13, 2, 5, 14, 3, 7, 11, 3, 9, 8, 1, 0, 4, 1, 5, 14, 4, 0, 5, 0, 1, 3, 11, 2, 11, 0, 9, 6, 10], +[4, 3, 15, 14, 5, 11, 1, 3, 4, 3, 6, 3, 15, 4, 9, 7, 8, 0, 8, 11, 15, 7, 10, 15, 13, 6, 0, 12, 9, 3, 3, 14, 3, 2, 7, 3, 13, 2, 5, 6, 12, 7, 12, 14, 7, 10, 7, 9, 15, 1, 3, 12, 7, 5, 2, 2, 10, 11, 6, 1, 0, 15, 7, 8, 5, 8, 2, 12, 12, 1, 3, 0, 9, 1, 8, 9, 5, 4, 13, 3, 6, 3, 9, 10, 5, 14, 6, 11, 2, 6, 14, 14, 5, 15, 5, 1, 7, 3, 9, 4, 14, 10, 1, 13, 8, 12, 4, 9, 13, 9, 13, 7, 11, 13, 6, 3, 14, 1, 6, 10, 9, 11, 10, 4, 14, 0, 3, 1, 10, 3, 5, 3, 12, 4, 6, 11, 12, 11, 0, 12, 11, 1, 7, 8, 12, 14, 6, 1, 1, 1, 14, 13, 14, 13, 0, 8, 2, 1, 0, 3, 7, 3, 12, 10, 5, 11, 3, 15, 1, 12, 4, 6, 7, 7, 1, 6, 12, 7, 4, 12, 13, 11, 13, 8, 9, 1, 5, 0, 5, 2, 15, 6, 4, 2, 2, 12, 10, 2, 14, 5, 14, 11, 3, 12, 14, 11, 3, 14, 12, 14, 1, 3, 8, 9, 1, 15, 4, 15, 4, 11, 5, 4, 12, 4, 8, 15, 8, 5, 12, 5, 4, 12, 13, 14, 8, 2, 7, 10, 10, 6, 6, 13, 3, 3, 0, 9, 2, 11, 14, 15, 7, 5, 2, 6, 10, 10]] +w1Encode: 9F13154837A052CA4E2E7C93411BE45D27B2BD76FB025F10A2BBAEC8AC5C502F6FD128194A95E782C6F5E0F96B94290CDE848ED36A8BA42CCFEF432A8D4323604F1D209E22F3BAA6E99F67CF95B5640C206DF9C217BA7A71C6D1FB1E3C60831EA27892E64864647D2C1D634010BBCE3256A03BE4F03812CE5A9FA5488311A11918B250B09556F4171599BA9E3CCB27CAC2808D9D62D74A63C12F3F14C629DEF188A7EB0CB3BAC61D6051748CBD61CCC4EEFB9ABBFC6F2AE2E4D284335F5A1C5EB15E70C40AF1F47F1474D24888C475D9D08B6BE57EA94B4FD7CEC1F31C257D6F2E7ECF235584BCCAEC3C61877673457582E9B91842224211FF67EF77550CAAA4593E9C8D7DD2161184007AE2108731AF0E58EC5CA7A7C0D53B67A6FD10670077EADCBEB86347F47AC5AF54A5907336226327B36EE0871CA924C6BBA9461170B4B58D07BA943934DEB590893B6572AD7D40ACDB571C03034D660468561A417DEB9108B48C02999317D3A5C1C9B22508FECB052A979C81AFE659703A426B20984BEC36A63F80C322ECC414F5F432F7BD89903825760433774758D5E3C982606AE3FD84AB3F56149D3F96E92C6A4C5A3C166E3E03D5FA72BDBA59D509E4FF9B9F66F949DA3109A976F55175BE12DEEA37B05454F92EDFC6C307679EA249AD0AA05EDE349EEC9B2CC20DD6AEA98D0A8262D3AA5374A1EBB9D9E25738023B88DD5D79B225038D6D6D1404AACEDFD471C566926C186C362BAEFF55DF7662F8A5A72458E5A7EB7F74CAB3A572CC24196BF17138BA6E5E454E8FB2C5A48C96BDBF6443607980A47188B27BF03B830986B6D32FF3336849BDFEC587E14AF7D010A0262EDE0A438105BD6CB65380495DDDBB1C03D1FF58BA23F89620F7E195ED4D8416F92BDE6D7490D53E54D30D9DB3EB69DB6FFE7ECFAF601FF2F9B43166D333B16ACD25F970EE2AB2A9D39303A9D361D550180F140955A9399AAA381E23807DD2AAF99F670CB633B452E8F8AECCCD810A2EBA560DFFAD22FAEC7B7EEFF45C0DCE3065020F62335FE0F19B097CA92738D558FFA3F4FEA9FA2BFE33376783018C9994FD5A902B22DCA0CAFB97814FDCD76A44C386DB192EFB6EB976E38AAEAA27D307C7A4AF0F0297A630C2807CA13B6903A20DBF2D7A60C12B16EFC9704D68234D4EB17554C1E3F2619335D50E9A41AB799D5D48FE4A47193C9EFD3329B5A3C36C9F873D7584CE33F60F7F26B8208BC62166ED5E0ADB523EB7931840514E5010B3B290A634EFB53134364F7908B87FFA6DC039E323372D657CECA7971FC35722BA16F08785C21C031998453D36A9E5B662EEF5153749AED1C8949D7DDB361EA6B94A0E133A354CB6BCC01B87EC1611DEDE80123037ACB5F3C16477617CC4BD8D1905256F24C22A5EBEC3BEE3EC3198F1F4B4454CF8585CC4ED28A76AD63390B2FE5762AA + +cTilde: 1C3B7FB47134FC1211A4F8FA16D8F84D642DB8182BBF70D549362A3182E2D313885BE701B5FBA7B2A7EE0B19B04A8F4E1D4B689028B10EB196297F56E75A5D03 +c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 +c: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, -1, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0] +cHat: [481415, 7228810, 4226144, 714643, 2802019, 3283882, 2771710, 848672, 4311443, 2880514, 1990277, 1615416, 2479302, 3394055, 4332660, 8299628, 7867971, 2610466, 6188012, 1504376, 4831960, 6413365, 3516579, 5120860, 5853811, 2337192, 639406, 6012297, 4961085, 3189659, 2777741, 6173828, 370774, 527919, 655976, 4362908, 4779984, 563323, 508075, 737255, 7772764, 4512695, 3112458, 271454, 299548, 7503418, 1209213, 8351773, 6371006, 4193536, 5088060, 6162656, 7879985, 4369449, 5479155, 1621299, 5721799, 3820304, 6223510, 3838421, 1923321, 3039565, 7283719, 6869484, 4006025, 1530901, 358773, 7455420, 5270191, 1719215, 991785, 6092458, 5739978, 3563394, 4329488, 4323887, 2094183, 5973931, 356665, 1755205, 5303219, 7755175, 3169545, 1095075, 4476478, 5972965, 1421691, 3549120, 5096024, 7445834, 6081560, 3622834, 1268971, 7405926, 3835894, 4714053, 2575169, 137677, 4406770, 135280, 2181701, 4703003, 5819202, 3220835, 3315375, 2696603, 3575442, 673585, 3030320, 7502329, 2969923, 5761989, 5187529, 6224274, 2533042, 2326581, 6158095, 827577, 1339001, 6475000, 6139255, 4117414, 1700606, 2632815, 2081715, 629955, 6324234, 3802023, 5808932, 2387448, 1389325, 1180387, 5247230, 2032533, 8131248, 6494425, 2596578, 411602, 1829148, 7459530, 8007517, 2430018, 5090362, 7864833, 264516, 6398040, 734474, 1456073, 3052966, 917562, 8352401, 3749926, 7940025, 842058, 5861456, 6877817, 5446186, 1553878, 7946997, 2070236, 5824696, 4285094, 2220173, 1134747, 2795230, 2932048, 1432113, 123811, 5105362, 5470143, 6235837, 2963484, 5290026, 6342813, 686838, 3512612, 1653884, 2688011, 1769907, 7497892, 6575050, 2703084, 5665698, 4437632, 2820649, 1877743, 240723, 6168524, 7293771, 6415623, 6884662, 2590814, 909158, 2009686, 3340447, 4975243, 5394744, 1073173, 2001903, 1761630, 3512482, 3861913, 7862351, 307011, 850611, 6385889, 431321, 4347354, 3515795, 5425715, 3042565, 2308993, 5935125, 2866509, 4524175, 3164881, 2101288, 4057144, 2920703, 1621705, 5361632, 3274465, 1487710, 215180, 8297367, 5134669, 7396293, 877472, 806388, 2683687, 6593683, 8075585, 3963878, 5662935, 5401698, 5474685, 4608121, 3426028, 1625772, 7932264, 6120712, 5379693, 1727295, 2572078, 4701261, 3094765, 6896524, 2464280, 7192610, 2310724, 7719658, 7799363, 3966002, 3289155, 7479004, 4218866] +cs1: [[8380416, 7, 13, 5, 0, 15, 8380411, 0, 8380400, 8380405, 8380402, 2, 2, 8380404, 13, 8380412, 1, 8380416, 8380402, 3, 11, 11, 14, 9, 8380415, 8380404, 3, 8380403, 7, 8380408, 8380405, 8380410, 17, 8380403, 3, 12, 8380411, 8380405, 8380414, 8380413, 8380406, 8380407, 8380408, 8380403, 5, 2, 2, 8380411, 8380402, 9, 8380408, 8380394, 8380406, 5, 8380396, 14, 15, 8380415, 10, 8380414, 9, 8380415, 1, 8380415, 8380409, 11, 8380407, 8380411, 8380411, 8380416, 18, 8380403, 8380410, 8380405, 0, 8380411, 8380409, 8380415, 6, 8, 8380416, 10, 8380416, 8380408, 1, 8380409, 11, 8380399, 8380411, 8380406, 6, 8380413, 19, 8380408, 8380404, 7, 3, 2, 7, 8380402, 9, 8380415, 14, 8380414, 3, 11, 8380414, 3, 8380397, 16, 8380407, 1, 8380406, 3, 8380409, 7, 1, 8380406, 9, 8380413, 8380406, 3, 3, 5, 8380407, 7, 3, 24, 3, 8380410, 8380414, 5, 8380406, 10, 8380411, 13, 2, 3, 8380398, 10, 6, 4, 8380411, 8380416, 8380409, 8380415, 9, 0, 25, 8380399, 8380399, 3, 3, 10, 18, 6, 8, 4, 8380400, 18, 15, 4, 9, 8380413, 4, 0, 3, 7, 8380404, 6, 5, 1, 8380408, 13, 8380414, 21, 5, 4, 8380408, 13, 8380406, 4, 16, 8380406, 2, 8, 8380414, 4, 8380411, 8, 8380411, 10, 9, 18, 16, 3, 8380416, 16, 8380396, 7, 5, 8380408, 4, 8380412, 8380414, 8380412, 8380411, 11, 0, 8380402, 5, 8380401, 12, 8380402, 2, 8380402, 8380416, 14, 12, 8380404, 2, 8, 8380408, 8380414, 3, 8380406, 3, 8380405, 9, 8380414, 2, 8380411, 2, 8380411, 0, 14, 8380393, 6, 1, 8380399, 12, 8380391, 5, 8380405, 8380409, 8380401, 0, 8380408, 5, 8380412, 5, 8380410, 5, 7, 8380407, 8380413], +[12, 8380411, 8380394, 8380387, 8380404, 8380416, 8380406, 16, 5, 8380393, 6, 8380404, 8380407, 8380412, 8380394, 8380402, 8380400, 8380414, 8380395, 10, 7, 7, 6, 8380413, 1, 8380414, 8380411, 8380411, 8380403, 8380410, 8380410, 3, 6, 16, 8380416, 8380411, 8380394, 8380409, 8380415, 2, 1, 8380409, 8380405, 11, 7, 24, 8380411, 20, 8, 8380403, 8380407, 14, 6, 8380399, 8380414, 5, 8380411, 4, 4, 8380414, 8380409, 14, 8380416, 1, 2, 18, 7, 12, 18, 8380413, 8380413, 8380416, 8, 6, 8380407, 14, 8380398, 16, 4, 8, 8380407, 9, 16, 15, 10, 8380405, 13, 5, 9, 2, 3, 9, 3, 11, 6, 11, 8380416, 6, 8380398, 9, 1, 0, 0, 8380408, 5, 14, 9, 1, 8380416, 7, 8380395, 4, 15, 3, 28, 0, 8380413, 8380412, 6, 7, 5, 8380403, 6, 3, 8380395, 8380406, 8380402, 7, 5, 8380400, 20, 8380392, 7, 17, 11, 8380400, 10, 1, 6, 2, 8380416, 8380410, 8380407, 8380401, 8, 8380397, 4, 6, 8380410, 8380407, 8380409, 1, 15, 12, 2, 8380406, 8380416, 8380413, 17, 8380410, 6, 8380398, 8380408, 8380410, 8380412, 8, 8380389, 3, 8380401, 7, 3, 8380414, 2, 8380396, 8380404, 8380396, 1, 8380416, 8380416, 2, 8380409, 10, 8380416, 8380415, 10, 8380410, 8380404, 8380414, 8380411, 8380416, 12, 8380411, 12, 8380413, 8380416, 8380415, 8380398, 9, 11, 8380400, 8380404, 8380409, 8380407, 10, 27, 8380405, 8380407, 18, 8380399, 9, 8380415, 13, 8380413, 8380410, 8380414, 8380402, 10, 8380413, 8380401, 0, 14, 12, 8380415, 25, 8380414, 19, 8380406, 6, 8380409, 8380399, 8380404, 8380408, 8380412, 13, 8380415, 15, 8380385, 12, 11, 8380412, 8380414, 8380405, 5, 0, 22, 6, 20, 5, 8380414, 5, 8380392, 22, 2, 8380406, 8380410, 8380412], +[8380409, 2, 17, 8380413, 15, 20, 5, 8380408, 10, 25, 23, 0, 9, 3, 10, 19, 14, 15, 8380410, 8, 10, 8380413, 1, 26, 8380411, 8380392, 8380407, 5, 15, 15, 29, 8380407, 8380411, 8380413, 4, 8380405, 10, 6, 8380409, 8380403, 20, 11, 10, 8380411, 8380397, 8380402, 8380402, 2, 8380410, 8380411, 1, 4, 8380408, 8380401, 10, 7, 9, 8380404, 8380399, 6, 8380409, 10, 8380404, 3, 8380416, 4, 8380401, 1, 8380413, 8380393, 8380395, 8380410, 8380405, 8380402, 8380416, 4, 3, 12, 2, 12, 0, 15, 8380412, 1, 12, 8380410, 0, 8380408, 8380409, 8380415, 8380411, 8380405, 8380400, 8380410, 8380414, 3, 8380409, 8380411, 8380415, 8380404, 8380412, 8380398, 1, 21, 8380411, 8380404, 8380404, 8380413, 8380392, 8380415, 4, 7, 8380408, 8380403, 8380398, 8380400, 10, 2, 11, 4, 8380411, 8380413, 8380407, 8380413, 15, 13, 8380412, 8380412, 8380416, 10, 15, 8380409, 8380407, 8380408, 8380416, 10, 8380399, 21, 13, 8380405, 8380403, 9, 12, 8380413, 11, 8380407, 8380411, 4, 14, 17, 12, 12, 8380403, 8380416, 8, 8380415, 4, 4, 8380405, 8380403, 8380412, 8380416, 12, 4, 2, 3, 8380405, 8380416, 8, 17, 9, 8380396, 0, 11, 4, 13, 25, 8380414, 8380416, 5, 8380402, 8380415, 12, 2, 12, 5, 28, 10, 20, 22, 8380405, 2, 14, 25, 8380413, 0, 3, 3, 8380413, 4, 13, 8380412, 10, 8380415, 16, 9, 8380413, 8380410, 8, 8380413, 16, 9, 8380414, 8380401, 9, 8380411, 2, 8380401, 13, 9, 2, 8380413, 8380402, 1, 18, 8380400, 4, 5, 8380412, 8380416, 3, 8380406, 7, 8380416, 8380412, 8380402, 8380408, 1, 8380397, 8, 8380411, 8380412, 8380413, 13, 9, 8380393, 8380415, 8380415, 8380407, 26, 1, 3, 8380412, 5, 1, 9], +[8380412, 10, 8380411, 8380407, 1, 8380406, 4, 8380400, 1, 5, 8380410, 8380416, 8, 8380416, 8380411, 17, 8380413, 15, 8380412, 18, 5, 8380415, 1, 8, 2, 8380415, 8380372, 9, 8380394, 29, 8380400, 3, 8380403, 3, 8380414, 8380404, 3, 3, 8380410, 8380401, 15, 8, 5, 8380408, 11, 3, 7, 8380406, 8380402, 2, 6, 4, 8380392, 8380406, 8380404, 4, 1, 8380416, 8380413, 8380412, 19, 8380414, 9, 7, 9, 8380408, 5, 8380413, 8380412, 5, 8380414, 8380413, 8380411, 5, 9, 8380400, 9, 8380410, 8380414, 8380416, 8380410, 13, 8380407, 3, 7, 3, 8380416, 8380414, 8380415, 8380411, 3, 5, 8380410, 8380396, 18, 8, 8380404, 8380406, 6, 6, 5, 8380415, 19, 8380404, 26, 8380409, 6, 8380411, 0, 8380416, 3, 4, 1, 8380415, 8380410, 8380407, 8380408, 8380395, 3, 14, 6, 2, 17, 8380411, 8380414, 8380413, 2, 8380403, 8380416, 8380416, 2, 8380412, 9, 8380409, 18, 3, 5, 8380404, 8380412, 8380412, 8380396, 4, 1, 8380416, 9, 8380412, 2, 8380413, 10, 8380415, 9, 8380414, 8380414, 8380414, 2, 17, 12, 8380411, 8380403, 8380411, 8380398, 4, 8380409, 8380402, 8, 8380412, 1, 0, 8380416, 10, 8380409, 17, 1, 5, 8, 3, 1, 16, 8380415, 14, 8380408, 8380412, 2, 10, 8380415, 8380416, 8380405, 4, 8380401, 3, 8380405, 8380409, 20, 9, 12, 8380414, 8380409, 8380407, 8380399, 13, 11, 5, 0, 14, 8380410, 11, 8380396, 16, 8380415, 7, 8380412, 8380410, 8380416, 8380409, 17, 20, 1, 5, 8380403, 8380413, 13, 8380416, 11, 8380413, 4, 4, 8380407, 8380408, 1, 7, 8380407, 12, 8380394, 1, 8380415, 0, 7, 8380409, 30, 8380412, 8380407, 1, 11, 8, 5, 8380415, 8380410, 8380413, 5, 8380403, 8380412, 8380408, 8380416, 8380411, 8380413, 8380398], +[10, 8380386, 10, 10, 4, 8380414, 3, 8380408, 15, 4, 8380413, 8380400, 16, 2, 2, 5, 8380405, 11, 8380395, 8380411, 8380408, 8380404, 13, 0, 0, 0, 8380402, 8380414, 8380416, 14, 8380407, 8380410, 8380400, 4, 8380407, 8380414, 4, 1, 0, 17, 8, 8380414, 8380410, 8380416, 8, 8380413, 7, 8, 8380409, 3, 8380416, 7, 8380405, 8380406, 8380409, 8380411, 8380389, 1, 2, 7, 8380405, 8, 8380411, 15, 22, 10, 8380410, 8380402, 22, 0, 8380410, 2, 8380402, 18, 15, 0, 8380398, 7, 8380410, 22, 8380397, 8380413, 9, 5, 11, 1, 8380405, 5, 8380413, 16, 7, 8380392, 2, 8380407, 8380412, 10, 8380403, 8380406, 5, 21, 8380415, 5, 1, 11, 24, 4, 8380414, 7, 8380411, 24, 9, 8380409, 6, 8380409, 3, 8380412, 8380414, 8380414, 8380414, 0, 8380411, 8380409, 0, 4, 8380413, 19, 3, 6, 19, 8380413, 4, 0, 9, 8380408, 7, 8380405, 5, 8380409, 18, 4, 8380414, 3, 8380408, 8380396, 19, 8380407, 8380416, 10, 10, 8380412, 8380413, 17, 3, 8380409, 6, 8380410, 1, 8380408, 5, 8380388, 13, 8380410, 3, 2, 9, 14, 0, 8380415, 4, 9, 3, 5, 8380413, 8380409, 16, 8380410, 4, 8380402, 6, 11, 8380414, 8380409, 9, 8380408, 10, 8380416, 8380410, 8380411, 6, 7, 3, 8380410, 26, 8380415, 8380406, 8380415, 8380413, 8380410, 8380410, 16, 8380399, 8380412, 14, 8380402, 8380409, 8380410, 15, 8380402, 8380415, 21, 8380406, 7, 2, 8, 8380406, 1, 8380411, 8, 8380409, 0, 8380416, 6, 8380415, 8380406, 8380401, 8380391, 12, 6, 8380389, 1, 8380409, 7, 8380414, 7, 8380410, 8380415, 3, 13, 8380404, 0, 8380415, 4, 3, 19, 8380409, 8380413, 8380397, 13, 8380397, 8380410, 8380402, 8380410, 7, 23, 8380410, 8380406], +[8380406, 0, 8380414, 25, 8380411, 5, 1, 3, 7, 8380412, 5, 8380412, 8380413, 8380405, 8380401, 4, 8380406, 17, 8380415, 8380416, 8380404, 8380414, 4, 0, 0, 8380408, 0, 17, 5, 3, 2, 11, 2, 24, 8380410, 2, 8380412, 13, 12, 8380392, 21, 14, 13, 7, 3, 8380416, 16, 8380414, 13, 8380410, 8380414, 1, 9, 1, 19, 1, 8380409, 0, 8380416, 8380414, 6, 8380413, 8380410, 8380406, 8380416, 6, 8380413, 8380413, 2, 0, 8380409, 4, 8380395, 2, 8380415, 15, 8380412, 10, 23, 8380415, 8380414, 8, 8380409, 1, 0, 8380412, 8380407, 8, 8380415, 18, 8380408, 0, 0, 8380406, 2, 8380393, 3, 8380414, 17, 3, 8380416, 8380415, 1, 8380409, 8380416, 12, 5, 8380401, 4, 8380401, 2, 8380416, 8380416, 8380409, 8380407, 8380414, 21, 8380397, 8380411, 7, 8380401, 8380404, 2, 2, 8380410, 8380388, 8380396, 3, 8380405, 4, 8380406, 8380411, 9, 8380411, 8380406, 8380409, 8380413, 3, 5, 8380400, 4, 3, 12, 8380411, 14, 8380409, 1, 7, 8380407, 8380411, 8, 8380408, 8380416, 8380415, 19, 14, 7, 1, 8380413, 8380403, 6, 0, 2, 10, 4, 8380402, 8380415, 11, 3, 8380410, 5, 8, 8380405, 8380410, 19, 8380408, 6, 8380412, 8380412, 12, 18, 8, 8380414, 2, 8380400, 6, 8380407, 2, 4, 1, 8380398, 8380416, 13, 13, 5, 2, 8380390, 8380405, 7, 8380411, 12, 1, 30, 13, 1, 20, 0, 2, 8380405, 8380411, 8380411, 5, 10, 16, 8380414, 1, 3, 9, 5, 2, 0, 3, 8380415, 2, 8380411, 11, 8380405, 8380415, 9, 2, 3, 0, 8380393, 8380411, 8380414, 8380411, 7, 0, 8380407, 8380411, 8380412, 8380410, 5, 9, 20, 2, 8380407, 1, 8380399, 19, 8380405, 5, 8380413, 2, 12, 8380406], +[8380411, 8380411, 1, 8380404, 4, 8380412, 9, 8380413, 12, 29, 8380413, 8380410, 17, 8380407, 8380415, 11, 8380413, 4, 14, 6, 8380405, 8380413, 22, 8380413, 18, 8380396, 8380416, 5, 6, 8380410, 8380413, 4, 15, 8380411, 8380406, 8380404, 4, 9, 6, 8380400, 8380410, 4, 8, 8380412, 0, 15, 8380408, 6, 8380412, 10, 8380408, 9, 8380410, 8380392, 3, 8380405, 8380411, 2, 8380403, 13, 8380415, 8380396, 8380412, 16, 10, 8380415, 8380412, 8380408, 8380404, 8380403, 8380401, 5, 17, 8380416, 8380413, 8380411, 8380412, 2, 8380404, 8380410, 8380414, 3, 8, 7, 8380413, 8380399, 8380397, 5, 11, 8380413, 8380414, 4, 3, 8380407, 8380410, 8380398, 8380415, 21, 5, 4, 8380399, 1, 0, 4, 8380409, 3, 8380410, 22, 8380405, 18, 8380416, 14, 8380404, 8380393, 0, 8380408, 17, 8380416, 2, 8380413, 8, 8380407, 11, 8, 8380415, 10, 8, 1, 8380393, 16, 8380413, 11, 22, 8380409, 3, 8380403, 8380406, 8380416, 2, 5, 8380405, 8380412, 5, 0, 18, 8380415, 2, 8380411, 8380401, 9, 14, 8380408, 16, 8, 14, 10, 8380408, 3, 17, 8380394, 8380408, 1, 0, 8380396, 7, 2, 8380409, 2, 8380405, 5, 8380416, 5, 24, 8380409, 17, 8380396, 2, 14, 8380415, 8380406, 17, 0, 8, 8380415, 8380404, 8380407, 1, 9, 13, 8380409, 4, 8380408, 8380412, 8380411, 8380414, 1, 16, 16, 0, 2, 8380413, 8380416, 9, 8380400, 14, 8380402, 11, 8380399, 8380412, 2, 8380406, 8, 11, 8380403, 8380406, 13, 22, 8380398, 8380406, 6, 1, 2, 8, 8380410, 8380413, 10, 8380415, 8380400, 8380408, 8380409, 8380412, 12, 4, 8380410, 11, 8380413, 12, 8380415, 8380397, 26, 8380393, 8380410, 8, 8380396, 8380409, 8380405, 8380404, 18, 7, 8380412, 8380406, 0, 8380415, 8380405, 1, 8380415]] +cs2: [[17, 8380415, 8380414, 8380400, 14, 14, 8380416, 8380416, 8380403, 19, 8380413, 8380412, 8380407, 18, 6, 6, 8380402, 8380407, 13, 8380415, 8380407, 8380406, 8380415, 8380412, 14, 8380406, 17, 1, 8380390, 8380416, 23, 8380413, 18, 8380405, 5, 8380396, 8380394, 8380416, 8380389, 23, 11, 8380393, 6, 8380411, 7, 11, 0, 8380414, 8380412, 5, 8380407, 9, 0, 16, 8380403, 0, 12, 6, 8380406, 8380389, 8380406, 14, 2, 8380404, 8380415, 21, 8380409, 14, 8380403, 29, 10, 8380411, 8380400, 8, 11, 17, 8380404, 8380409, 8380406, 8380407, 8380414, 8380408, 12, 8380413, 8380414, 3, 10, 8380410, 11, 4, 8380413, 8380404, 8380395, 7, 5, 20, 1, 14, 8380400, 19, 7, 12, 14, 8380404, 6, 8380403, 10, 3, 8380392, 8, 8380394, 8380410, 8380415, 16, 7, 8380411, 8380415, 8380416, 0, 7, 25, 8380411, 8380415, 8380404, 6, 11, 8380413, 8380415, 8380415, 8380410, 8380411, 4, 10, 8380404, 9, 8380416, 8380396, 2, 12, 5, 4, 8380412, 8380416, 8380399, 8380412, 10, 9, 8380401, 1, 8380401, 8380409, 1, 20, 8380411, 5, 4, 5, 8380401, 0, 17, 3, 8380415, 8380409, 3, 8380407, 8380407, 8380413, 3, 19, 8380415, 8380412, 4, 27, 8380403, 0, 8380414, 23, 9, 8380415, 3, 6, 8380407, 9, 6, 8380413, 2, 8380404, 8380405, 8380410, 12, 3, 8380404, 1, 8380407, 15, 1, 8380411, 8380412, 7, 0, 8380397, 4, 12, 3, 6, 1, 7, 1, 14, 8380412, 8380414, 14, 8380410, 8380406, 7, 5, 8380409, 8380399, 8380405, 3, 8380404, 16, 9, 8380407, 9, 2, 8380409, 17, 8380410, 21, 8380406, 8380396, 17, 14, 0, 8380402, 8380409, 8380409, 1, 4, 8380416, 19, 1, 7, 8380400, 13, 1, 8380408, 8380387, 6, 12, 8380410, 1, 11, 11, 8380395], +[8380412, 8380412, 0, 24, 8380408, 6, 8380412, 8380401, 8380409, 2, 16, 11, 13, 1, 17, 8380413, 8, 8380415, 3, 8380411, 8380408, 6, 9, 7, 10, 8380404, 3, 13, 2, 8380403, 8380406, 8380415, 5, 8380412, 7, 25, 4, 9, 8380415, 8380390, 17, 13, 11, 2, 4, 12, 8380404, 8380412, 4, 8380411, 8380411, 8380408, 4, 4, 8380404, 3, 8380415, 8380409, 11, 8380416, 19, 14, 21, 8380402, 8380415, 6, 4, 8380412, 8380409, 8380410, 0, 8380414, 15, 4, 8380409, 5, 3, 8380412, 8380416, 8380406, 8, 0, 8380398, 8380411, 8380411, 8380406, 11, 8380403, 22, 6, 8380395, 3, 19, 13, 8380407, 14, 8380404, 9, 20, 8380396, 8380399, 8380409, 6, 8380410, 3, 8380411, 8380412, 8380409, 8380412, 8380415, 6, 15, 8380407, 3, 10, 8380409, 4, 9, 8, 10, 0, 0, 3, 8380401, 8380403, 6, 8380411, 8380407, 8380404, 8380395, 8380413, 8380409, 4, 8380409, 8380410, 18, 8380412, 14, 4, 8380404, 8380416, 3, 15, 8380410, 8380400, 8380404, 8380407, 2, 8380413, 15, 8380416, 8380413, 8380397, 8380402, 8380408, 8380414, 8380413, 8380410, 8380405, 7, 10, 2, 8380415, 8380409, 8380395, 8, 0, 17, 3, 8380413, 13, 1, 8380410, 8380407, 21, 8380403, 2, 8380393, 8380413, 6, 8380416, 24, 5, 7, 10, 7, 8380402, 19, 3, 8380400, 8380416, 0, 4, 8380406, 8380409, 3, 7, 4, 13, 1, 17, 8380412, 12, 5, 8380415, 21, 8380413, 18, 8380414, 1, 8380411, 11, 25, 8380416, 8380415, 8380408, 8380416, 2, 8, 6, 14, 8380415, 2, 0, 7, 23, 12, 8380408, 4, 8380410, 28, 8380406, 8, 8380412, 1, 5, 17, 8380414, 8380412, 8380392, 13, 5, 11, 6, 13, 8380415, 8380409, 1, 5, 4, 7, 1, 8380408, 8380407, 8380413, 8380403], +[8380414, 8380415, 0, 3, 5, 13, 8380412, 8380412, 10, 18, 8380405, 8380408, 8380412, 8380416, 23, 8380408, 11, 8380390, 13, 8, 8380408, 0, 8380411, 8380415, 13, 8380402, 8380404, 8380405, 8, 2, 10, 8380402, 8380402, 8380404, 8, 2, 21, 8380392, 8380408, 8380409, 8380413, 7, 8380405, 9, 9, 8380406, 8380410, 8380396, 3, 8380413, 3, 4, 8380407, 8380415, 8380406, 8380415, 20, 8380408, 8380409, 8380402, 8380408, 10, 2, 9, 3, 8380414, 16, 8, 8380409, 7, 8380406, 8380414, 8380402, 0, 8380411, 7, 8380414, 8380398, 2, 11, 2, 4, 8380415, 1, 8380404, 16, 8380411, 8380409, 4, 8380412, 8380413, 3, 8380393, 8380412, 5, 12, 8380411, 6, 8380403, 8380414, 11, 8380416, 8380408, 7, 8380415, 8380405, 2, 8380414, 8380415, 2, 9, 15, 8380400, 8380416, 0, 8380408, 25, 18, 0, 8380414, 8380406, 14, 7, 17, 8380406, 14, 8380414, 8380410, 22, 1, 6, 27, 8380402, 11, 8380416, 8380412, 10, 8380407, 3, 8380403, 1, 11, 8380410, 9, 8380412, 6, 4, 8380416, 8380401, 2, 24, 20, 3, 8380406, 8380399, 8, 14, 8380414, 8380409, 8380409, 2, 3, 8380408, 6, 3, 8380402, 9, 5, 12, 8380397, 8380416, 2, 14, 6, 10, 10, 14, 21, 0, 8380399, 8380414, 8380409, 8380411, 8380407, 8380414, 8380398, 8380414, 8380413, 5, 8, 1, 8380402, 11, 8380403, 16, 8380414, 6, 8380397, 13, 8380415, 8380406, 13, 8380407, 9, 8380397, 8380403, 6, 8380405, 8380409, 8380393, 8380411, 23, 3, 8380391, 8380391, 1, 8, 8380412, 3, 8380408, 8380416, 10, 12, 16, 8380396, 8380416, 8380409, 8380403, 0, 8380411, 8380411, 3, 13, 17, 8380407, 8380402, 9, 4, 12, 5, 8380413, 11, 3, 6, 8380404, 8380412, 4, 8380416, 8380409, 8380402, 14, 8380408, 8380410, 13, 8380414, 14], +[8380413, 8380410, 1, 8380411, 1, 23, 9, 8380411, 8380394, 9, 8380406, 8380413, 0, 8380408, 1, 8380398, 3, 8380408, 10, 9, 7, 8380406, 8380393, 8380411, 2, 8380413, 26, 8380415, 10, 8380395, 5, 5, 14, 1, 16, 8380399, 6, 8380400, 18, 8380392, 20, 8380391, 8380411, 8380414, 8380412, 8, 2, 8380409, 8380416, 8380416, 11, 2, 6, 5, 8380412, 8380404, 8380403, 8380403, 8380413, 8, 8380406, 8380407, 8, 8380414, 2, 8380410, 6, 5, 14, 8380416, 20, 15, 8380390, 20, 0, 12, 9, 3, 8380409, 8, 10, 3, 8380416, 8380395, 3, 8380408, 6, 14, 5, 11, 8380403, 15, 5, 8380407, 8380415, 8380408, 12, 20, 7, 4, 8380410, 8380413, 8380401, 1, 8380412, 22, 8380402, 11, 8380406, 4, 8380415, 8380413, 0, 14, 8380412, 6, 8380399, 8380394, 15, 21, 9, 8380412, 8380394, 7, 13, 12, 13, 1, 8380411, 8380415, 8380403, 0, 8380407, 14, 8380407, 1, 8380402, 10, 8380415, 8380415, 17, 22, 8380408, 15, 8380411, 9, 1, 8380411, 0, 8380416, 8380409, 17, 8380415, 8380414, 8380412, 8380407, 8380412, 8380411, 8, 1, 3, 8380402, 8380414, 3, 9, 9, 5, 8380397, 8380402, 3, 8380413, 6, 8380415, 8380408, 8380415, 8380406, 11, 8380408, 14, 8380407, 2, 8380410, 8380403, 8380404, 23, 19, 21, 8380396, 8380414, 8380415, 16, 6, 8380407, 0, 8380415, 4, 8380412, 8380416, 8, 8380411, 8380410, 8380405, 9, 8380408, 12, 16, 8380415, 1, 7, 8380388, 8380409, 8380415, 21, 5, 8380411, 8380400, 8380407, 8380400, 18, 8380400, 16, 8380384, 8380405, 8380414, 7, 16, 11, 8380404, 8380411, 0, 5, 0, 6, 7, 8380408, 6, 0, 8380402, 8, 1, 8380412, 4, 8380416, 8380396, 8380415, 8380412, 30, 8380416, 8380411, 8380415, 9, 14, 1, 14, 8380403, 10], +[8380406, 8380406, 11, 3, 8380415, 8380404, 22, 0, 4, 8380416, 8380414, 8380412, 8380399, 8380413, 21, 6, 5, 0, 2, 8380411, 16, 8380411, 7, 5, 8380397, 1, 8380406, 22, 8380408, 8380416, 8380411, 8380415, 7, 8380400, 5, 8380411, 21, 8380408, 8380413, 4, 37, 20, 8380413, 8380409, 2, 8380409, 0, 8380408, 8380415, 8380414, 18, 8380399, 1, 8, 1, 0, 8380398, 20, 8380404, 8380410, 5, 8380399, 20, 8380416, 8, 0, 4, 7, 8380415, 8380412, 2, 8380415, 8380405, 18, 8380404, 1, 17, 8380397, 8380411, 5, 14, 11, 8380401, 10, 17, 8380411, 8380409, 15, 0, 19, 8380413, 8380412, 12, 10, 8380404, 8380407, 8380414, 1, 4, 8380385, 8380409, 3, 6, 5, 7, 13, 6, 8380416, 8380416, 8380415, 6, 2, 8380397, 8380400, 3, 15, 8380414, 8380412, 3, 13, 8380409, 7, 8380415, 8380399, 22, 7, 8380411, 8, 7, 11, 7, 8380403, 8380415, 4, 8380397, 3, 8380398, 8380415, 8380405, 3, 8, 11, 14, 8, 8380403, 8380415, 23, 2, 8380414, 0, 8380406, 15, 3, 2, 6, 0, 8380416, 8380408, 8380409, 8380414, 1, 8380407, 31, 2, 8380410, 8380416, 8380413, 8380416, 8380409, 1, 5, 8380393, 8380407, 8380412, 8380416, 9, 1, 8380410, 8380408, 16, 8380413, 8380408, 15, 8380394, 8, 8380411, 8, 8380407, 8380406, 10, 2, 8380416, 3, 8380405, 17, 4, 8380404, 8380413, 8380413, 17, 24, 8380390, 1, 8380415, 0, 15, 8380399, 8380416, 8380415, 5, 10, 8380408, 21, 8, 8380416, 0, 8380411, 0, 8380411, 1, 1, 8380405, 15, 8380401, 15, 8380401, 3, 6, 2, 9, 6, 13, 8380412, 10, 8380416, 14, 12, 1, 8380413, 8380390, 22, 7, 8380411, 2, 8380412, 8380414, 8380405, 18, 8380415, 8380406, 8, 3, 14, 8380407, 19, 4], +[3, 8380406, 8380408, 8380404, 8380407, 16, 8380388, 6, 8380406, 9, 12, 8380404, 10, 8380402, 11, 6, 1, 31, 8380413, 8380404, 8380404, 4, 8380403, 8380415, 8380413, 5, 8380409, 24, 8380416, 8380415, 1, 8380412, 2, 11, 8380402, 28, 14, 8380398, 10, 5, 2, 8380416, 29, 8380402, 5, 10, 9, 8380405, 12, 12, 8, 12, 21, 8380401, 22, 8380410, 8380411, 8380412, 8380407, 8380408, 5, 2, 24, 14, 6, 8380398, 20, 0, 6, 8380404, 3, 8380403, 3, 11, 9, 14, 11, 8380411, 8380398, 3, 8380413, 8380404, 1, 8380416, 8380413, 8380395, 8380410, 30, 8380405, 3, 8380414, 8380414, 8380416, 6, 1, 8380403, 4, 13, 8380399, 3, 10, 8380398, 13, 8380399, 8380406, 8380408, 4, 8380405, 8380401, 1, 8380410, 8380414, 4, 8380408, 5, 8380415, 8380416, 4, 8380393, 8380416, 8380398, 3, 11, 8380409, 10, 8, 8380403, 12, 8380411, 0, 8380401, 8380401, 10, 8380407, 8380415, 8380416, 8380398, 9, 8380408, 8380416, 8380413, 6, 8380392, 17, 0, 8380415, 8380406, 10, 8380416, 16, 4, 8380406, 8380413, 10, 8380409, 16, 8380405, 1, 8380384, 8380410, 5, 8380416, 28, 4, 8380412, 0, 8380412, 8380412, 8380412, 8380412, 7, 5, 8380406, 9, 12, 8380414, 8380416, 1, 8380414, 8, 8380403, 8380412, 8380410, 20, 8380406, 2, 3, 17, 15, 13, 8380413, 8380398, 13, 8380390, 8380412, 11, 3, 8, 8, 0, 8380412, 8380413, 8380416, 8380409, 27, 2, 12, 8380416, 8380409, 8380413, 6, 13, 8380412, 8380416, 3, 8380405, 4, 8380413, 8380406, 6, 8380415, 8380414, 19, 8380416, 8, 0, 13, 8380410, 8380407, 8380414, 0, 8380407, 23, 8380416, 15, 14, 8380409, 10, 8380412, 22, 8380411, 8380410, 8380412, 8380406, 8380415, 8380409, 1, 8380414, 1, 21, 8380416, 10, 5, 11, 8380414, 15], +[8380414, 10, 8380409, 7, 6, 8380414, 8380406, 1, 8380401, 6, 8380406, 14, 8380402, 8380411, 12, 8, 2, 13, 2, 8380400, 8380411, 8380413, 8380412, 18, 1, 8380408, 8380413, 13, 6, 8380414, 12, 8, 8380414, 8380407, 8380411, 8380409, 20, 6, 5, 6, 8380393, 9, 4, 0, 0, 8380412, 8380410, 11, 8380403, 0, 8380406, 6, 8380413, 8380406, 1, 8380416, 8380413, 16, 11, 8380414, 8380403, 7, 8380405, 19, 6, 8380415, 13, 8380408, 8380411, 3, 8380415, 8380416, 8380412, 8380399, 20, 8380414, 11, 10, 10, 6, 8380409, 16, 14, 8380398, 11, 8380399, 8380389, 2, 8380410, 8380404, 13, 4, 8380416, 8380416, 0, 8380402, 18, 14, 8380412, 8380409, 15, 2, 8, 16, 8, 8380412, 8380415, 8380413, 13, 8380415, 8380412, 8380394, 8380411, 2, 8380408, 0, 8380414, 12, 8, 8380399, 8380414, 8380414, 8380409, 8380412, 8380414, 8380416, 2, 8380412, 10, 2, 3, 15, 6, 3, 8380409, 8380399, 13, 0, 4, 4, 8380411, 13, 5, 5, 1, 8380407, 8380407, 3, 5, 8380403, 3, 13, 8, 16, 5, 7, 8380411, 8380407, 8380410, 8380415, 8380410, 28, 2, 3, 3, 8380412, 6, 8380410, 10, 10, 8380414, 18, 8380406, 11, 2, 8380414, 8380409, 8380407, 0, 20, 8380411, 8380413, 9, 18, 6, 8380416, 5, 8380410, 8380400, 22, 8380412, 8380412, 8380411, 8380414, 8380402, 13, 2, 0, 7, 8380404, 8380402, 8380412, 20, 12, 8380411, 8380410, 12, 11, 8380413, 8380416, 8380408, 8380411, 2, 8380410, 8380414, 8380403, 17, 5, 1, 2, 3, 8380404, 8380415, 16, 8380406, 8380415, 8380414, 8380402, 8380399, 11, 18, 5, 8380400, 8380401, 24, 0, 11, 15, 8380404, 8380412, 16, 14, 8380413, 7, 8380416, 8380400, 5, 8380406, 9, 8380395, 0, 8380401, 8380397, 20, 2, 10], +[7, 15, 8380412, 8380413, 1, 8380413, 1, 5, 11, 8380402, 8380414, 13, 8380405, 8380405, 9, 9, 8380407, 8380384, 11, 9, 8380410, 8380403, 7, 8380395, 7, 8380412, 2, 13, 15, 11, 8380398, 0, 17, 4, 7, 8380408, 8380411, 8380411, 8380415, 18, 8380416, 8380406, 6, 0, 8380389, 7, 8380412, 1, 8380411, 9, 8380403, 1, 7, 8380415, 10, 14, 5, 8380411, 4, 0, 8380414, 8380403, 8, 2, 8380388, 8380394, 7, 8380408, 6, 8380399, 8380407, 8380394, 8380411, 8380415, 0, 8380409, 8380411, 8380402, 4, 0, 2, 8380415, 8380413, 8380395, 19, 8380407, 8380416, 2, 8380409, 8380406, 8380416, 2, 1, 10, 5, 8380396, 1, 0, 8380409, 10, 8380416, 8380410, 8380413, 8380413, 8380416, 9, 15, 8380409, 9, 10, 8380400, 8380412, 11, 3, 0, 6, 8380406, 22, 0, 8380413, 8380413, 2, 8380416, 8380408, 8380404, 8380411, 8380416, 1, 8380409, 25, 9, 1, 8380410, 8, 8380416, 7, 17, 8380414, 6, 18, 2, 11, 8380412, 1, 3, 2, 0, 12, 0, 7, 5, 3, 3, 8380409, 9, 8380413, 9, 5, 1, 8380415, 19, 11, 8380415, 25, 13, 22, 7, 3, 12, 8380394, 13, 8380407, 0, 5, 1, 8380403, 8380403, 8380415, 8380398, 1, 8380411, 12, 3, 8, 8380416, 8380405, 13, 5, 6, 8380407, 8380403, 5, 8, 8380401, 8, 8380411, 8380408, 8380397, 3, 1, 13, 18, 8380404, 8380396, 8380412, 8380406, 3, 12, 1, 8380405, 8380409, 0, 14, 8380405, 8380415, 8380410, 18, 2, 8380410, 8, 8380409, 4, 9, 8380400, 8380414, 17, 8380411, 8380413, 4, 8380394, 2, 8380408, 8380399, 8380394, 3, 8380403, 8380408, 8380413, 16, 3, 8380414, 8380413, 6, 8380409, 17, 8380408, 16, 8380407, 8380388, 8380405, 8380410, 12, 22, 8380406, 8380401, 7]] +z: [[423556, 7871462, 216036, 437407, 8052323, 85868, 74357, 484136, 134074, 515667, 8245356, 86518, 488542, 8353547, 86109, 378290, 20006, 8168281, 7981215, 8088507, 303921, 53629, 101930, 7889599, 8166717, 8298675, 162378, 8151829, 41762, 339744, 436730, 174514, 8206639, 465063, 484414, 89707, 8247095, 8240452, 129836, 7859049, 335115, 380055, 125866, 42859, 8069822, 7930640, 8215106, 410412, 248765, 99892, 155430, 457036, 8005240, 8075212, 8069237, 450291, 314643, 87323, 8315242, 422261, 8218020, 200651, 36965, 7861584, 8145752, 8227143, 999, 383425, 8182397, 254010, 24906, 8223178, 7998141, 301679, 8366671, 22627, 105160, 8195002, 7864565, 500271, 264288, 256369, 8199510, 7922918, 8277761, 476581, 9181, 7943470, 8259529, 7949850, 8088893, 330216, 8260436, 335200, 8207363, 8024377, 351490, 10248, 8084175, 403754, 282557, 8212260, 427557, 8193746, 8095170, 405638, 7953924, 8039405, 8325084, 8051652, 7911945, 8241727, 221401, 8353237, 8300027, 134394, 245229, 227814, 485933, 8311513, 8304975, 8160497, 8208568, 92767, 433521, 8111349, 8357369, 8356321, 8091167, 228290, 8361400, 7984912, 407561, 8107387, 246317, 403401, 8210697, 234151, 7961270, 501256, 8089445, 7903988, 197927, 8265447, 241047, 8031131, 506214, 342902, 73878, 511005, 361592, 8023870, 122544, 358637, 466938, 7903631, 277804, 7989275, 231537, 75535, 70985, 24835, 7890052, 8102404, 490173, 7865482, 112108, 8031133, 8075268, 305840, 8326098, 63129, 101899, 7878092, 7938059, 250338, 377757, 31002, 13509, 8365320, 8150193, 8257198, 190769, 8064735, 8294057, 319169, 7968841, 8046554, 101311, 369057, 7940732, 246626, 222802, 7994129, 8321166, 135107, 90687, 168475, 193194, 8186852, 8144638, 154599, 295022, 77764, 347008, 205715, 214013, 15682, 75288, 249016, 499504, 7993857, 7861124, 106417, 7919323, 8219580, 8330562, 12811, 14384, 139019, 8339195, 456091, 8075765, 8167953, 472890, 7908717, 405041, 8036487, 23211, 327949, 7885735, 8045995, 7991849, 7863562, 8311281, 8149955, 195870, 8003776, 8063710, 8368261, 7959688, 219861, 490598, 211783, 7858257, 7983709, 8033469, 8015467, 8113136, 8337970, 7893481, 8345586, 493553, 295340, 207992, 136861], +[110341, 8091309, 7987480, 8199477, 8010929, 8172903, 8377580, 8197940, 8312873, 90011, 72772, 354216, 8284685, 8048295, 389068, 341450, 297059, 8016768, 495945, 7927784, 369295, 7960179, 8212831, 7975730, 124613, 51615, 473962, 8233478, 447007, 8295856, 116613, 477251, 339473, 8166333, 8034361, 382081, 8137947, 23859, 132109, 8350613, 8323737, 7867242, 8114703, 8373779, 7879168, 505544, 148022, 28038, 7865187, 206448, 431642, 5541, 8045203, 8342009, 400577, 8022666, 523221, 465613, 53706, 8074994, 8742, 7858940, 89800, 520780, 8227402, 167373, 14851, 261026, 8267929, 8190731, 171283, 146204, 8253447, 233434, 19069, 150575, 8027722, 8279413, 7886999, 487388, 8080500, 151234, 8112638, 421340, 181765, 375010, 432376, 7859080, 8122256, 165434, 217312, 8044372, 8373163, 178116, 102247, 89242, 244666, 214747, 9399, 7937993, 2012, 492464, 7989618, 456360, 8021161, 8131743, 153982, 8078980, 7949087, 243423, 8151479, 8206254, 498105, 211482, 167363, 8169323, 185250, 201299, 8107837, 141800, 8318181, 8129820, 367778, 8090693, 229873, 8259518, 198723, 8220750, 206636, 8372482, 7996896, 8273842, 8205584, 230422, 8053912, 8307624, 515886, 8129259, 484149, 257519, 7970588, 203349, 7970239, 266849, 461162, 341502, 54544, 348656, 272294, 8156034, 8371920, 7910680, 98992, 301616, 7888109, 178752, 132799, 294100, 301846, 8247704, 286482, 7879425, 60300, 199348, 7968340, 8303658, 191787, 8069923, 275976, 223451, 8062668, 417561, 231120, 260691, 8032604, 456291, 8368156, 142984, 7966963, 462930, 493145, 375644, 8256599, 7919727, 8233298, 45637, 503461, 7935494, 188009, 267548, 138076, 8322009, 439061, 393194, 8012047, 8169144, 8135709, 8358808, 75134, 8062884, 8268316, 393206, 125364, 388152, 150047, 8349377, 167209, 8112696, 46681, 8327184, 197371, 8148034, 8227637, 159012, 8182340, 8031695, 427283, 99826, 407270, 248889, 7997488, 490146, 333956, 8166316, 406890, 409582, 236536, 325863, 8175549, 253667, 7892031, 8066558, 8118131, 502150, 8280045, 8248959, 8298824, 8182123, 8175107, 7985613, 8252767, 8303607, 7963167, 63867, 8274996, 8206100, 8003075, 67442, 8263325, 309113, 409654, 8085287, 107788, 8270201, 467956, 392861], +[8175451, 8327471, 8343702, 8238127, 7864737, 8053401, 7909809, 458929, 204408, 8354690, 352062, 7980075, 308252, 7886927, 109889, 8339857, 8277756, 8266231, 73366, 408295, 441180, 88089, 155530, 132528, 498088, 8023794, 8376176, 8368231, 345577, 501204, 8281257, 8060190, 7898211, 265179, 7863699, 7885289, 8089470, 7958820, 7991374, 8230594, 8187098, 8188288, 8212532, 158117, 341780, 158770, 7903408, 7928359, 8256433, 8158325, 7933486, 425943, 499694, 155432, 8323823, 424968, 93076, 98048, 410653, 299652, 108190, 8072027, 159026, 8238986, 8361202, 102227, 7910410, 142323, 465707, 27537, 190759, 8279124, 219828, 7940592, 335821, 8141115, 8009842, 8168082, 8125990, 8154604, 7876235, 18744, 249214, 8066969, 8297435, 504722, 8024310, 33384, 8261519, 8154043, 95270, 8348105, 446612, 138033, 434791, 8249579, 8000021, 8132706, 8309317, 522135, 100548, 7949864, 7954617, 495619, 122275, 257124, 8245125, 8077140, 509147, 105895, 306114, 7969328, 8142674, 469075, 8326823, 8295984, 121633, 406915, 153643, 227112, 48446, 7972231, 87890, 47331, 8297293, 331289, 482237, 8210407, 7947618, 8109875, 8340348, 318128, 122770, 7865582, 8077897, 520968, 8152914, 8272810, 8182619, 919, 373323, 269752, 7964594, 8319397, 7965295, 8029636, 318014, 8185981, 7910934, 8352145, 87760, 297584, 8366970, 193735, 300718, 377372, 240865, 8364377, 291095, 7986831, 15341, 4776, 8114748, 460719, 347517, 19401, 8223262, 7917285, 111415, 8233118, 206483, 360055, 326275, 506809, 8335802, 315551, 7875975, 8374021, 7883826, 8049863, 430689, 7920457, 297977, 8122257, 7879391, 214492, 159427, 164715, 7876044, 103470, 8010059, 32925, 8248296, 8226595, 8172214, 230780, 117643, 8174161, 305653, 151531, 164170, 7925427, 7924723, 241538, 114293, 210807, 380399, 260263, 8320062, 70537, 303239, 8117277, 246348, 8157964, 98062, 7967089, 8021605, 423009, 76518, 454169, 178669, 8341531, 7913795, 8234863, 512873, 413438, 67679, 8305714, 8273926, 8283823, 349526, 455571, 277109, 8306356, 438659, 8291013, 8203280, 8296358, 350381, 8074963, 520817, 115003, 7972188, 375799, 8251509, 7996218, 24143, 7884538, 8232577, 8087074, 8060782, 8198851, 332692, 8148893, 8007792, 256293], +[99626, 7990519, 7954029, 8198809, 438381, 7953174, 8168253, 8301695, 8373553, 8356913, 300596, 7905039, 476650, 7865180, 8063170, 7954886, 8289376, 459561, 8095107, 8168115, 8018534, 392074, 417560, 40908, 8207399, 7910172, 257222, 7924785, 8319020, 385093, 93175, 8379670, 8042105, 48444, 329321, 7902525, 517505, 8015472, 450319, 283660, 424240, 8370912, 8013632, 8220840, 235774, 8349723, 345529, 16598, 8010553, 324232, 419815, 8204462, 214687, 450811, 8113130, 136335, 7871434, 296386, 8345991, 8308038, 297880, 8080242, 8282473, 8310572, 522055, 8350659, 215369, 456091, 8040900, 110970, 312961, 8032508, 5703, 7868506, 61377, 184600, 183906, 8276901, 8218292, 7932962, 196268, 7873913, 8198117, 140329, 8312490, 124155, 8037439, 120445, 8293495, 8029075, 316858, 266661, 380297, 8365265, 5520, 7969759, 499375, 135004, 95045, 7934953, 305825, 7950134, 218077, 8192292, 388279, 407595, 330595, 8358237, 8314608, 480840, 107739, 8050555, 8309850, 444540, 174436, 148181, 8264821, 287272, 334990, 186872, 8124386, 7869548, 8236786, 8615, 7999209, 315828, 8055866, 7876173, 161085, 8369786, 8107246, 160240, 8364799, 354246, 175744, 249474, 8246216, 7900069, 270811, 246674, 8296440, 8351637, 8092571, 8241139, 7940264, 482864, 209991, 8294036, 8031483, 15093, 16704, 181080, 8678, 429935, 8083981, 7942843, 221458, 7860001, 343009, 293387, 343866, 271357, 8171081, 8332935, 7920391, 8037753, 306545, 8349040, 8218396, 8324433, 92776, 20527, 8301119, 8111287, 428678, 8106062, 290268, 93040, 414766, 392821, 7888856, 69180, 460480, 8270022, 192872, 8306587, 8352247, 232306, 235020, 7909681, 8373207, 410201, 25116, 96038, 8051682, 274135, 8349774, 8340712, 369008, 8368039, 7922973, 436291, 274626, 8326611, 8259315, 8174991, 62747, 506774, 363095, 8162520, 8199099, 342179, 413594, 8313227, 8308023, 8126211, 8125889, 146763, 106853, 7937615, 8171606, 198169, 179947, 303057, 74447, 8177335, 88019, 18475, 149662, 8317084, 209290, 8078890, 245419, 7951940, 519594, 8092416, 8198726, 7921864, 8334778, 7890642, 261635, 8302819, 8221068, 7926252, 7925504, 8288090, 7949903, 8099308, 130548, 440796, 7885102, 7952218, 8274829, 459764, 8190339, 275251], +[228570, 7908528, 380015, 521497, 8269079, 243549, 8172128, 107638, 8093749, 191674, 8142449, 8119252, 8164889, 7916554, 8310971, 217340, 8345969, 486822, 8269264, 343261, 8077289, 429432, 365734, 7893054, 8186367, 11838, 387293, 296052, 286078, 203367, 8248759, 156179, 7935236, 7909585, 135338, 8358847, 163947, 8119539, 241148, 434069, 8315909, 445593, 352628, 485857, 8327464, 8294769, 472031, 477252, 8001194, 162544, 111300, 8362787, 8104638, 8124056, 7949221, 7900901, 7894731, 8361245, 477597, 8063780, 60759, 474309, 8026461, 8257165, 111230, 115763, 7929994, 7876118, 8265028, 222113, 243333, 8092750, 8339646, 8069993, 8376317, 456333, 8347050, 8129451, 8320200, 50052, 473254, 7997909, 7940483, 8023546, 125127, 8278895, 510892, 274089, 126844, 290990, 8044284, 8099067, 8180776, 90620, 8288876, 467194, 8090816, 7968024, 8068674, 146149, 7869153, 8000730, 8329956, 8228057, 463918, 8338620, 8015227, 8034426, 249210, 8262548, 7867049, 8262345, 7946429, 8048544, 450860, 394742, 8056097, 424312, 8018549, 8226965, 8365715, 8140239, 382418, 8091441, 244236, 449428, 8222404, 8139349, 8341845, 7988168, 384737, 7869169, 7951056, 499498, 291939, 52756, 8278697, 8140398, 84732, 229974, 8106251, 59641, 7956616, 8331104, 8347064, 8006263, 8209751, 100780, 8181411, 244152, 286616, 8070007, 8099775, 57458, 344157, 46968, 8141379, 8372460, 252229, 8186812, 100580, 8091936, 8165430, 8258754, 415711, 8027920, 178714, 8091609, 8322053, 170892, 171751, 7969785, 369581, 419891, 406177, 8252367, 73298, 8095567, 8133075, 7923284, 343958, 7869209, 8273126, 8184441, 8312898, 8030096, 8103623, 155814, 119137, 8343697, 8202627, 343277, 474140, 518275, 8027447, 228642, 105361, 8171337, 3540, 8251103, 116841, 508787, 208044, 8212366, 475251, 400445, 7894650, 7863929, 8221343, 329976, 147350, 7967016, 8196585, 440186, 8067255, 164940, 263616, 7869852, 7938755, 8093070, 225338, 231152, 8139896, 373739, 521962, 7868770, 523330, 8146987, 7900664, 166072, 303774, 297183, 237820, 8161573, 8357175, 8339327, 8064311, 8271653, 8201955, 364048, 8131555, 8033061, 8288744, 8233456, 8179224, 8295254, 8076753, 7965175, 8235736, 7928000, 8071978, 8056627, 217745, 208726, 226159, 470219], +[8215045, 197905, 8018084, 8118239, 204621, 8291690, 7885171, 285637, 8332406, 80800, 413296, 8237876, 27423, 382990, 7911726, 231899, 349306, 8019461, 310637, 8023759, 241748, 105586, 100698, 183000, 499398, 394076, 184520, 7944851, 295745, 214043, 276622, 411601, 8073691, 275738, 133667, 459559, 8074890, 130503, 488711, 30423, 178675, 417005, 430296, 375125, 8178392, 21419, 8132094, 7938786, 4317, 8264476, 8323694, 414693, 255103, 512838, 8019116, 7891652, 8270921, 8373428, 8284368, 8280969, 136759, 356817, 174696, 505746, 7977114, 8329254, 225480, 8182731, 353677, 465892, 476680, 516152, 8186719, 393046, 7997340, 8348504, 8239493, 7859518, 8234850, 196492, 173874, 391401, 7898157, 383142, 7965718, 7898255, 405507, 7995118, 8277727, 8079646, 8366529, 210015, 8365928, 137191, 12490, 8053825, 108632, 7882841, 423863, 8171129, 64570, 481590, 238686, 8193598, 8266504, 7991439, 8321636, 8242336, 7982412, 320286, 135701, 8241428, 8230386, 8169464, 224364, 7975450, 305267, 8338856, 211007, 8144558, 8014571, 188566, 30421, 371421, 8128977, 8059073, 336, 74471, 507178, 7964339, 8374242, 252068, 143602, 376841, 310107, 117452, 8090877, 8149183, 400226, 322773, 211280, 198025, 523215, 157154, 120775, 8127886, 168343, 426985, 188353, 8285604, 89750, 386835, 487896, 8169682, 42822, 7985932, 8118903, 177936, 8057594, 356425, 8063952, 8030797, 214438, 8100960, 338618, 496995, 8253457, 8320409, 8176350, 99544, 8319223, 230223, 304444, 52730, 435599, 8182731, 222603, 8078191, 8369799, 8061044, 47255, 485037, 453279, 423711, 8170938, 8335464, 8322740, 8317355, 7945526, 8074085, 8336246, 8251469, 8159724, 7910678, 8229415, 8219170, 8065786, 389107, 7885218, 489667, 328968, 382351, 313962, 252521, 8325760, 76142, 8125496, 112058, 325679, 8285745, 7887811, 254691, 7887533, 8380182, 8358391, 507728, 7932662, 464056, 8358420, 8170702, 8202051, 132629, 8085090, 8105964, 8271753, 520226, 42859, 495489, 478325, 247602, 8127409, 131360, 85174, 350762, 137359, 8170737, 152869, 8295195, 8047013, 7953502, 393331, 365895, 142010, 8309742, 261700, 8282018, 251835, 7873284, 8337304, 371028, 393762, 464056, 370489, 8245502, 410321, 8321493], +[8266438, 8366627, 8118620, 8302459, 7936775, 8141273, 381382, 8277832, 8179780, 176065, 8318046, 235842, 371091, 8343232, 8152274, 435258, 422993, 25049, 159961, 8083907, 8201802, 421062, 341711, 164769, 8224031, 7930561, 408977, 8067488, 82288, 8294362, 7895161, 496009, 7911253, 65536, 100702, 168048, 520365, 8107037, 39838, 8213793, 294966, 7904510, 189859, 68885, 8219883, 8194322, 8244489, 8227334, 8054438, 8120708, 373080, 7881487, 42655, 8058016, 8214104, 298605, 406191, 247879, 7999094, 8166262, 7913799, 7880280, 182684, 154065, 8179064, 499070, 75154, 208243, 282361, 8311775, 74217, 8371381, 8156522, 7862581, 376717, 8143702, 8279800, 267167, 7956717, 8291699, 8040050, 69368, 415081, 423969, 8321886, 54099, 132355, 7902921, 38667, 269151, 33063, 512643, 521411, 481688, 140018, 369233, 8336333, 7859625, 394771, 8170781, 8032707, 7888945, 236264, 8246261, 353020, 21126, 343680, 398148, 409337, 223608, 450095, 426621, 7860215, 8327241, 8064865, 485729, 326253, 7891491, 92635, 8167601, 214753, 7928853, 8084232, 8085511, 239139, 8089949, 7875006, 62481, 78511, 21906, 75717, 126597, 185061, 8128026, 8132045, 336103, 8165891, 8293700, 152589, 185418, 8270043, 7932074, 7973558, 8142863, 379928, 8359937, 193690, 257703, 8143630, 8219588, 7878970, 8048711, 260256, 279562, 474109, 409616, 346539, 120899, 7880596, 8243227, 7884497, 494016, 8103836, 8298404, 57189, 189699, 461620, 94258, 8103549, 8070420, 133285, 8018587, 520042, 465954, 8347630, 8062057, 8110994, 8374857, 50450, 426754, 8135856, 273518, 7984901, 418586, 349957, 8371992, 132528, 8312997, 52367, 8012340, 8163577, 8198607, 22182, 7952626, 7934588, 429050, 8191646, 8307317, 508881, 8017450, 300922, 8111404, 8140728, 8303836, 7876242, 7988666, 85511, 8323396, 242488, 8052156, 7944717, 8111725, 8320227, 195838, 8195235, 181109, 8073754, 7304, 487036, 8257152, 8362410, 99698, 8246659, 8268905, 43853, 381192, 8213404, 177011, 268867, 8043948, 8330932, 428717, 8352410, 339698, 54741, 198195, 7871582, 7864647, 8021781, 196449, 8089946, 8040271, 8264766, 8287579, 85378, 7998931, 242695, 513965, 381853, 8236285, 8069524, 312404, 8082375, 186902, 416893, 8351141]] +||z||: 523330, ||z|| check passed +r0: [[225638, -155961, -80311, -190869, -231574, -82718, 42093, -197127, 193792, -238389, -213886, 73496, -192069, -124892, 187756, -108507, 5562, -90265, -45155, 236758, -180132, -103593, -170601, -94461, 251485, 32470, 46842, 81174, -175921, 89519, 29023, -183355, 149840, -147145, 260348, -87031, 248796, 139629, 53842, 73404, 48740, 126306, 156496, 188704, 116593, 234283, -222808, 223216, 175695, -86067, 49641, -96165, 155330, 15108, -187164, 123073, -77916, -133062, 131161, -27282, 191461, 116566, 261604, -211635, 213649, -38267, -81087, -129904, 108482, 97342, -26356, -208258, 259839, -155661, -94781, -232390, 209415, 199785, 130870, 156070, 51508, 61265, 201649, -247437, -261045, 96500, 231178, 171887, -82693, 151924, -119864, 240048, -176812, 244194, -126822, 261751, -178809, -135169, -74771, -71144, 147148, 108151, -174682, 92448, -260952, 129173, -87941, 233739, 37713, 247061, -93258, -54770, 243949, 154196, 200426, -72448, 139048, 45020, -47716, -69579, 91519, -148831, -50102, -243748, -92198, -181481, -102899, -223602, -261315, 22164, 245155, 54721, -71047, -58255, -168199, -29172, -189186, 200400, 159181, -59058, 225461, 117859, 79763, 60959, 148997, 45774, 168550, -185017, 104046, 231786, 89592, -94175, 170850, -14397, -229674, -61160, 52196, -107245, -251949, 43677, -152237, -197606, 198228, -213498, 151780, -244761, 60153, -156584, -83863, 5788, -71979, -158938, 132620, -142972, 224044, -142538, -249571, 67518, 225612, 29222, 155509, -138515, -242986, -175981, 158625, 46424, 13358, 8006, -201237, -248326, 75950, -116696, -20461, 203786, -175731, -199935, -12085, 52467, -249653, 46877, 203319, 11781, 159069, -245724, -251225, 58734, 52401, -18617, 138357, -80076, 219490, -208640, 165746, -166244, 209104, 111425, 192619, -245030, 241491, 143476, 220734, 134158, 81734, -234409, 258635, 184971, -26290, -95938, -200926, -202390, -109611, -86306, 203263, -124349, 246161, 195085, -75652, 191469, 96315, 131739, 178970, 69618, 40520, 185094, -57734, 43584, 170695, -37186, -44268, -170962, -41858, 140880, 85985, 177227, 186440, -106956], +[124293, -243257, -17036, 174953, -91549, -201643, 76303, 159004, 244267, -135451, -108447, -151911, -40014, -55648, -78483, -17366, 65566, -144631, 41639, -241769, -216291, 150088, 143600, 164123, -83652, 94158, -136073, 54748, -191381, -122364, -243159, 241804, 55323, 252771, 157732, -101837, -160271, -164171, -218272, 42, 79907, 32393, -240458, 57539, -76552, 236550, 60791, -243438, 214057, 86635, -191800, 186659, -135703, 34448, -32021, -255679, 260906, 68464, -158621, 220261, 244274, 250090, -251683, -121654, -118287, -203718, -146435, 27613, 46956, -184772, 251919, -22022, -104677, 180086, -243733, 140112, 221376, -36073, -8171, 224408, 255624, 170756, 8113, -152191, 211337, 238421, 22291, -50378, -245718, -113440, -155856, -210397, 55463, -240949, 125792, 216398, -253656, 138177, -127664, 29416, 68850, -217656, 23266, 67284, -154717, -228274, 185722, 146164, -142874, 133247, -133795, 63595, -174650, 119683, 156344, 165385, -188745, 186440, -243402, -142223, -93417, -207060, 167690, 127405, 192272, 92816, -209348, 133800, 34216, -215217, -29905, -33740, 213977, 96470, 27516, 187782, 104255, 77768, 115558, -254946, 212595, 88988, -102293, 16799, 78127, -240194, -164998, -6356, 43335, -40, -164801, -236359, 26133, 54102, -56653, -179770, -39059, -47057, 48382, 215094, -247708, 141992, 111958, 38134, -95072, -1483, 111228, -168783, 114868, -98365, 97063, -23364, -67566, 220373, -93549, -42478, 80232, 135927, -244824, -41913, 185644, 136401, -5351, -166933, 143603, 98956, -46164, 24440, 254059, 103179, -129434, 251951, 9289, 180287, -86420, 8837, -246694, -154440, 55233, 147569, -138093, -217696, 64247, -249539, -250097, -106815, 123912, -197409, 32725, 137510, 83027, 1584, -244744, 250940, 2848, -216079, -146832, -147402, 84582, -254634, -161688, 184400, -47469, 223969, 211414, 242768, -4557, -153578, 197731, -144274, -108564, -79726, 125038, -77654, -149905, -174959, 4785, -91695, 185594, -53754, 154497, 150709, 202250, -28336, -78841, -9687, -250380, -8927, -61163, 111534, -141167, 99629, 120685, -110712, 24668, 101675], +[-74537, 66408, -35156, -256793, 170130, 3317, -191814, -131650, 47591, 21462, 199279, 229377, 24441, -255474, 230610, -208745, 234822, 22039, -88500, 168021, -132646, 255556, 226448, 159358, 210343, 253922, 77710, 112152, 37355, 84856, -181607, -42214, 204055, -43981, -182823, 41524, -128088, 62388, 182899, 9539, -227158, -144231, 237016, 19865, -131164, -191583, 107858, -48039, -172368, 140300, -187344, 125733, -259620, -204393, 95827, 157014, -102897, 33072, 74468, 76468, -136263, 127484, 194738, -107007, 210118, 105462, 74557, -75951, -204675, 29510, 65034, 241468, 109766, -140001, -18904, -7718, 157912, 216193, -155732, 195296, -163318, -98946, 82341, 69529, 160807, -152190, 45705, -220196, -172979, -189542, 86379, -4480, -196883, -173453, 135256, 129220, 213572, 87463, -211577, 35636, 185695, -225514, -60275, 245952, -258000, 141612, 21617, 185136, 67518, -23645, -123709, -237498, -214293, -78334, 250123, -197907, -24019, 231294, 660, -18393, 14126, -70128, 16675, -85596, 193573, 185676, -250416, 846, 40851, -34030, 93837, 183192, -62419, -82295, -192015, -27170, 156528, -151197, -118493, 87800, -111380, -204655, -93090, -116990, 112048, -1940, 67940, 71064, -222265, -156856, 92864, -259513, 125414, -170116, 173727, 152560, -52318, -21245, 161094, -189289, 36720, 54303, -39840, 60073, 138506, 125578, -81262, -82470, -83118, 89351, 35239, 139608, 44561, 171943, -48893, 124760, -260733, 55568, -52709, 74185, 256998, -28870, 176127, -209730, -218796, 152942, -7624, -221101, 77487, 162420, -232849, -123458, 119103, 160220, -187160, 181599, -143195, 78820, 102892, -211399, 11229, -221665, 144138, 93674, -151234, -116000, 124077, -64082, -110955, -44225, 239619, -183272, -110710, -235890, 28351, -35738, 3276, -41630, 161967, -164001, -57530, 108705, 103122, 111778, -130113, 63611, 75153, -190059, -95380, 81379, 217029, 172054, -80236, 258191, 157144, -6425, 60380, 172228, -191453, 247768, -37974, -64965, -49347, -117541, 113300, -193809, -43029, 251475, 142582, 155588, -148907, 233246, -15840, -3599, 22048, 155391], +[50500, -800, 224124, 50956, -95880, -88359, 92133, 70745, -203043, -129129, -112303, -142464, 76740, 131881, 483, -48816, 105420, 32392, -196720, 226457, -169952, -28332, 97895, -108049, -145093, -66817, -162315, -147514, 98255, -96506, -171523, -23743, 40637, 12268, -114126, -118654, 20865, -71753, 156752, -47985, -51015, 9180, -165975, -133655, 130865, -195488, 5843, -153492, 37684, -214447, -238822, -169552, -70590, 95237, 256000, -69149, -210961, -76076, 178290, 249129, -175278, 252, 66485, 170968, 44180, 46502, -122447, 118498, 57592, 141853, -71802, -120581, -190323, -36392, -43884, 86747, -3215, 241683, 83495, -124957, 215153, -68226, 99003, -249256, -36593, 40077, -117136, 158269, -211897, 130930, 60364, -44810, 188824, 165957, 103533, -76830, 160344, -22482, 58711, 94323, -133355, -244300, -140853, -70197, 47224, 210428, -30294, 22246, 4534, 70472, -93390, 141530, -119113, -138692, -204583, 206728, -63590, 121839, 103551, -21099, 128351, -140266, -161006, 90606, -41708, -3449, 199106, 76148, 130564, -257358, -128782, -252097, -99109, -6531, -132966, 84636, 34957, -117963, 35375, 243159, -71273, -208489, 199756, -162948, 10362, -222345, -178684, 10926, -226798, -180494, 96855, -247806, -54087, -133797, 120924, 121926, -48334, 9839, 11591, 153941, 115735, 104185, -43388, -33975, 29207, -162679, -231034, 36082, -179408, -49452, -259423, -75847, 228284, 249066, 202184, 206765, -45600, -259609, 73789, 23859, 59230, -39142, -249883, -261238, 254973, -27667, 232248, 3748, 231766, -145695, 79665, 52694, -213981, 123586, -187483, -166290, -236386, -153940, 166952, 171700, -34479, -245848, 109028, 64531, -130043, -73458, -65728, -235187, -252739, -235347, -173141, -124731, 146145, -206753, -201332, 96526, 173138, 171103, -131829, 65135, -88999, -34181, -157474, -15820, -11845, 65904, -258799, 221598, 78279, -20691, 116464, -197162, 209385, 260548, 64670, 79104, 196314, 146900, 116554, 45072, 257221, 82430, -255882, 133481, 179061, -203048, 37219, 186923, 193512, 181950, -44470, -39675, -90442, -193260, -155833, 203487], +[206901, -14083, -13521, 18912, -82282, 120605, -31686, -10104, -209796, -69511, 148469, 142911, -122721, 223149, -232004, -255672, 117906, 57949, -47065, -72237, -34780, -59268, -116436, -82766, 100388, 50662, 13850, -212950, -177117, 204855, 195580, -57488, -90374, -147770, -217272, -73591, -136984, -208858, -77525, -14166, -161967, 45164, -133312, -68435, -3805, 66116, -152899, -142849, 95162, 121845, 174053, 23145, 34293, -145514, 241019, 114323, -256684, 90538, -200353, -248049, -57617, 197705, -245487, 166869, -44336, 149405, 113438, 95731, 136471, -222937, -63934, -180467, 253496, -227622, 72853, -211416, -152236, 209452, -109931, -172537, 2452, 180440, -226783, 207803, 223851, -120271, 197117, 246491, 125191, 193697, -139307, 232357, -125532, 244463, 2171, -50951, -115704, 205269, -77425, 108652, -217174, 78881, 211773, -110022, -192599, 233068, -158903, 176729, 49775, -242183, 221303, -193289, 158436, -10085, -189587, 26127, 49968, -134862, 252153, -64461, 5163, 45466, -48158, -76540, 194544, 73892, -3622, -245534, -27293, -189902, -228775, 35537, -89969, 160391, -58281, -102775, -212558, 200623, 33314, -156799, -1828, 236335, 258268, -168853, 85281, -16639, 12950, 248372, 83019, 20132, -247874, 231777, 177318, 184148, -54752, 253913, -203257, -170937, 160743, -136691, 161186, -187701, -231384, -52452, -31659, -155556, 211714, 248201, -2759, 144713, 177901, -42749, -69701, 212882, 65665, -4870, 21424, -219842, -245469, -179269, -69257, 131404, -21337, 219726, -205087, -42018, -77502, 258651, 1633, -148281, 2522, 131155, -205019, -104846, -149301, 200343, 48372, 188055, 240922, -85784, 120817, -58406, -256351, 85805, -41847, 120225, -63576, 43354, 159822, -83815, 95540, 139200, -174868, -143502, 227475, -55664, 9519, 184181, -12435, 260968, 196640, -37133, -92811, -103185, 8375, -166186, 11968, 207053, -257538, -23481, -101655, -77880, -25618, -19196, 34897, -120212, -106486, -79525, -218285, -168973, -79212, 181014, -148885, 248658, 138860, -193827, -53372, -155855, -160910, -147198, -29289, -35155, 174489, 86782, -187746, 188479], +[-208916, -211198, -184884, -154552, -111659, 19343, 34387, 174667, 15324, -63011, -211684, 122973, -187534, -216153, 237463, -24191, -1233, 137209, -214029, 64566, 173780, 244855, 59400, 135660, 222101, -57712, 243790, 158650, -18101, 133512, 83494, 50897, 137045, -153742, 85484, -208393, 230696, 27794, 195482, -173657, 258245, 39380, 5433, 213418, -14097, 45471, -256727, 209497, 59852, 191166, -181280, -96533, 252741, -13652, 31292, -197423, -33662, 11308, -202094, -232320, 210738, -22107, -252982, -183995, -25297, -63615, 233526, 86674, 83591, 71095, -23427, -88134, 9664, -192224, 242947, 239589, 226975, 202587, -159942, 232491, -13256, 246439, -88612, -81265, -136483, -79508, -257193, 26890, 255569, -184419, -179965, -178838, 247007, -12359, -78009, -97226, -85073, 132939, -253601, 97631, 195915, -52228, 125542, -219427, 209953, 105547, 46490, -257592, -208287, 229304, -45790, -179904, 21415, 58540, 4692, -258093, -5069, 181579, 53965, 252871, 181958, 256449, 50531, 229505, 259751, 64910, -126821, -18930, 155411, 105175, 98390, 246037, -192138, -200482, 251901, -91834, -133140, 172326, -26827, 123458, 109313, 26438, -218227, -243392, -254457, 29565, -234671, 175582, -163484, 42579, 99036, -232308, 126115, 110067, 156917, -176452, 101231, 128873, -212824, -117891, 250585, -219202, -38612, -183647, 135863, -188820, 106035, -77423, 63256, -225584, 32117, 74792, -235030, -151198, 214325, -259391, -190164, 91312, 208464, -67059, 42596, -225005, 196306, -206216, 11094, -80605, 79261, -113952, 221904, 261199, -146799, -116602, 104331, -209162, -26930, -185778, -72991, 101578, 133907, -12435, -1973, 45575, -123718, -162763, -45932, 188357, -16240, 15044, 86140, -53489, -1883, -257260, 46899, 38472, -90024, 190145, -229420, 149285, 10948, 106636, -81749, 255033, 48319, -246796, 175034, 61403, 17906, 223431, -95909, -256619, 128134, -46379, 37782, -147853, -248009, -95795, -255811, -55283, 29600, -88166, -151478, 1784, -174257, 15456, -206767, 52353, 240138, -185700, -92387, 206572, -9007, 233583, 228753, 220765, -199862, 105214], +[-247852, -222386, -225130, 3337, -204834, -184343, -222267, -225087, -150285, 224006, -127784, 64749, 227728, 79551, -55721, 2130, 132985, 88603, 98822, -88138, 175758, -6987, 220176, 159504, 241791, -156831, -230962, -79175, 200130, 180589, -23244, 34114, 121673, 228622, -106135, 46971, -132409, -13001, -144557, -229011, 51824, -229731, -27887, -256425, -1705, 96741, 100723, 80757, 52771, 236410, 211430, 144805, -26770, 64021, 35810, 213681, -18740, 85388, 24444, -71257, 115648, -85188, -24611, -222276, -18118, 177041, 50062, -157931, -154500, -21141, -139777, -56548, -8023, -34043, 99804, -17094, -55860, -166974, 90666, -216260, 169077, 158786, 59939, -168227, 148561, 25746, 253480, 131675, -156856, 108726, -221307, -6654, 256777, -138780, 149345, 35113, 234808, -80295, -23129, -72266, 193527, 101131, -223360, -208804, -997, -67025, -246252, 195344, 47384, -151084, -204088, -233584, 70956, -116326, 70393, 25662, 85319, 113167, -140936, 3938, 16448, 131037, -221364, -233780, -208024, -228160, -232225, -164645, -37375, -221122, -203538, 191438, -80903, -198103, 54720, 171128, 91032, 209596, -117273, 202681, 55524, -206729, 106782, -177608, -108491, -150785, 168237, 136179, 93263, -197802, -89478, 171063, 113188, -108017, -48629, 46383, 224358, -95254, -176682, -165746, 117136, -92090, 104012, -160827, -66122, 237802, -16902, 29801, -18843, 224910, -97302, -87257, -84038, -43414, 46773, -4341, 125033, -58982, -71961, 150905, 218691, 76320, -130580, -223063, -175760, -156422, -125571, -35552, 192888, 159872, 124951, -54480, 139849, -181179, 206650, 162543, 234377, -174829, -171410, 163125, -14167, 184024, 134348, -151785, -166408, -101142, -153779, 226739, -135764, -199523, 32897, 102296, -200462, 15559, 173393, -155649, -552, 252037, 47912, -66948, 157903, -226186, 10992, -57275, -65849, -12569, -92689, 259504, 31612, 243584, -227314, -48073, 126132, 72304, 99144, 9889, -132025, -122413, -234294, -189345, -72103, 12866, 40029, 131709, -143217, 103536, 194531, 194112, -20638, 118407, 203498, 146274, 241674, 32314, 243766, -67124], +[81173, 202654, -244494, -196441, 193069, -75423, 232594, -42678, -241539, -210496, 12247, 172335, 248360, -20987, -237357, 114989, 24279, -251241, 56838, 79676, -100441, -123981, -201539, -214783, -39959, -11818, -203065, 65954, -145783, -201957, 44203, -115283, 100651, -154589, 30366, -182158, 137763, -132742, 72198, 13468, -87890, -223434, -88855, -238071, -29494, -189021, -55984, 205806, -96652, 74059, -982, -236827, -7041, -243168, -223646, -37442, 157227, 162614, -97014, 128727, -178809, -157509, 22726, -195148, 172660, 44063, -187463, 45707, 214727, 174933, -157311, -44654, -176042, 69273, 244194, -215821, 197347, 102741, 246202, 161834, -16072, 233081, -237441, -218476, -217107, 226396, 194351, 51137, 145391, -141723, 143835, 135178, 138956, 85599, 244202, -95100, -40968, 9984, -97723, -141338, -89529, -11300, 197080, 72245, -95551, 7942, -164712, 44534, 90757, 174406, -29858, 3964, 31980, -206824, 78581, 13204, 142425, -50266, -122189, -58467, -205786, -76109, -172387, 81681, -181523, 68738, -167619, -83948, 186136, -102536, -108593, 106226, -225780, -2170, -54756, -17277, 187625, -259343, 5971, -77581, -10386, 71354, -240414, 154764, -175206, 5912, 21773, 237309, -67270, 235974, -125481, -6046, 81176, 56056, -55444, -65107, 92283, 49182, -211482, -125504, -34056, 252382, 71185, 24393, 128287, -3525, -191883, -202013, -135399, 81491, 145485, -105745, 68066, 260431, 140314, 34675, 185307, 59653, -135719, -15925, -169292, -71993, -84027, -93769, 125458, -164712, -149272, 192563, -258102, 236779, -255292, -41506, -30989, 220221, -149332, -145941, -15668, 3453, -159436, 122831, 250756, 180733, 67893, 27672, -61169, -98320, 87231, -21084, 130356, -67369, 31593, -208716, 16929, 105057, -28377, -8515, 164937, -87727, -239961, -62992, 50163, 200301, 230097, -158426, -164448, 195457, 123895, -165257, 219639, 144333, -130116, 17032, 145817, 169137, -234243, -108696, 159994, 127052, 197936, -35562, -96752, 62300, -194668, -45302, -258309, 92941, -235767, -94572, -170682, -25587, -239018, 143093, 187341, 27154, -108064, -191847]] +||r0||261751, ||r0|| check passed +cHat * t0Hat: [[577749, 3674133, 5215843, 7770993, 6537923, 7894377, 3243672, 4906500, 2387055, 2857335, 1515599, 1240700, 1252426, 5262204, 2960300, 5632023, 1237630, 1227154, 4466969, 1197822, 6484606, 5796270, 6052986, 7140244, 6305792, 2087363, 5256597, 5589909, 909490, 502850, 7605849, 4797451, 3016239, 5897221, 5181140, 480103, 7991873, 3966017, 2446817, 695242, 204307, 3154813, 3211123, 7054802, 551994, 6388207, 3210107, 8236757, 3138426, 226025, 4976708, 7479815, 5980682, 7006047, 6932206, 7969260, 2977307, 6038300, 4285792, 379226, 4742795, 6102060, 6087994, 5346990, 7630136, 4142301, 7208880, 848222, 6848515, 4153059, 5690663, 6285810, 3858178, 5152896, 7118158, 5392830, 6220351, 1502983, 4895718, 3798879, 4345595, 1485562, 5151020, 2770362, 1253292, 3075663, 5138191, 6762800, 6216209, 2233125, 5518837, 1041997, 3120018, 1393563, 6101760, 1126454, 4450218, 5707194, 4493933, 5054391, 6151828, 6229402, 2701171, 6117775, 370151, 770848, 407097, 7357327, 7937854, 1751938, 1519167, 6694533, 4022853, 2224180, 5860209, 6205760, 7735731, 4163406, 4291909, 7121091, 1403980, 4569002, 6153086, 6861162, 3405677, 665188, 3791228, 2433974, 4216279, 3243437, 5923294, 3202329, 2426620, 7682265, 2496212, 2616792, 1279, 4764653, 3818944, 7318712, 21502, 2392371, 4831915, 134912, 1609776, 6374233, 4770995, 3247586, 4917764, 7472522, 1889951, 2842905, 223328, 1840101, 7770513, 6074952, 1543034, 2998185, 696685, 7503235, 175489, 8130340, 7224532, 3000942, 3304967, 4123231, 3102994, 325417, 6892178, 5607504, 8097551, 7256301, 7831999, 2263081, 764258, 3902795, 3649135, 572109, 5493196, 4468641, 4392724, 347393, 7473022, 4111867, 7935837, 138414, 5149489, 1099462, 2320524, 3234678, 3095212, 12950, 6065647, 4555623, 6882453, 7518610, 4680123, 3645144, 341823, 7891480, 7581933, 4286429, 6254828, 2163816, 2501799, 1948589, 1981031, 3922543, 3436830, 1009591, 2151473, 3195842, 2929617, 1203519, 7934149, 4663061, 434227, 6573159, 6696623, 5566055, 87275, 1754817, 4284582, 7526317, 5833316, 7609691, 3878233, 3397776, 8050783, 7815015, 2606928, 2938996, 3195872, 3106599, 1075000, 5304841, 3546391, 1178180, 427314, 5119597, 3569952, 2389934, 3817434, 5117178, 6118203, 2148594, 129724, 4894518, 6247396, 2353950, 2002920, 8344418, 848205, 755020, 7488295, 5200839], +[2563568, 698016, 6538610, 4956750, 1440496, 1796235, 5269467, 4775608, 3456628, 7946009, 3306269, 5383673, 7515170, 3464237, 6782538, 3138448, 3890077, 6739586, 3042863, 1034341, 4283959, 2999656, 7721261, 681490, 7211398, 8287180, 5092797, 7994402, 5752896, 3503428, 4671798, 3021649, 4725999, 99096, 2207869, 110100, 8273825, 3290310, 127799, 314715, 3164276, 4737986, 5241240, 5823525, 1517017, 5040948, 1661928, 7957427, 2413362, 4621679, 3638638, 5762090, 4606232, 961310, 1132640, 8252521, 817039, 5098617, 8164175, 6313491, 6938600, 3610687, 8011951, 7362278, 4437489, 697350, 8227444, 7059911, 6872095, 3519021, 8255662, 2869194, 6089608, 5620147, 2498353, 2604690, 1641584, 4229211, 5046571, 7634018, 47139, 5799624, 5276685, 7746842, 7674190, 6906804, 6229520, 2289197, 1734087, 736604, 588995, 601134, 2711489, 5940381, 5265688, 4065557, 7508403, 4778380, 7814004, 4428183, 1350431, 8312120, 416686, 1494579, 3183971, 4947977, 1636388, 2975837, 4782081, 5512317, 668659, 7389281, 3654947, 8304785, 5291478, 4464250, 1908465, 138934, 7256520, 7408341, 408412, 8120267, 595283, 1836795, 2956818, 3419154, 2460821, 1199707, 5782501, 1828688, 665202, 7153299, 4919008, 5098577, 7521143, 7194003, 4372411, 201738, 4675948, 5753305, 7805758, 995106, 2937941, 1153659, 5975663, 4866231, 2226055, 6035152, 452033, 7087762, 7397957, 8181909, 865454, 5012374, 6342005, 4484045, 6831397, 5632037, 4018596, 2810504, 6996366, 4349039, 7689700, 8255910, 1876734, 2562136, 7461303, 5025355, 6494348, 581785, 3535654, 1438665, 7811533, 8268397, 2931234, 2651, 7046645, 5481545, 2187605, 3036539, 1573722, 3060420, 4143773, 2795153, 6247640, 3361727, 3691362, 4150099, 5747806, 561237, 4272501, 4931381, 4958003, 384773, 5239205, 28753, 2586241, 3491006, 7065944, 7965398, 1795175, 5789595, 6876585, 3027452, 108644, 4581376, 6573387, 2159217, 7297294, 8229903, 2402890, 4779990, 1670071, 8192678, 2529419, 4455957, 7746801, 1035517, 7093219, 5258157, 6943766, 2469213, 397924, 3606085, 1223572, 2865502, 6623108, 7335340, 1700488, 623010, 8181584, 5097814, 7220452, 8134214, 2701890, 2337795, 2134715, 4468301, 7371778, 4041999, 4806299, 3140697, 7363120, 7398600, 1256998, 73309, 3754945, 1859985, 5362427, 4958530, 4569081, 7794546, 2046727, 2393623, 175646, 7213918], +[6406345, 2079085, 3455332, 1110040, 3764750, 4591676, 574943, 1656558, 3238316, 3750471, 437701, 582683, 5170508, 231716, 3535129, 7455188, 962326, 5651324, 7142290, 7775223, 228123, 4735259, 4299630, 2006836, 3792000, 5945326, 7228389, 6478963, 1476332, 2394299, 8274124, 7650769, 3880125, 4723905, 2832544, 5412528, 1760900, 4613923, 8312074, 7078874, 1924164, 4545424, 265972, 1371523, 7794488, 8104751, 6583105, 5043968, 3155859, 6834215, 4906058, 1909348, 5261004, 2587634, 6365120, 2606234, 7305934, 5529342, 4263930, 3744474, 3381471, 5816542, 3976428, 227316, 1756718, 21872, 4675992, 8103552, 5341221, 842028, 4754767, 6259749, 5242039, 4165665, 5473528, 5435317, 1155502, 286520, 1497844, 7076279, 4495098, 1597187, 4559911, 8325176, 3859975, 7172392, 3689009, 6806284, 411219, 1902630, 8287558, 6391745, 4762564, 2285862, 7978596, 1518574, 594658, 3468199, 264665, 7290347, 2587565, 3551022, 2829323, 5483766, 1970812, 1512859, 1731298, 8223894, 7414663, 3292779, 4192585, 5791046, 4914200, 1306065, 5791007, 7656557, 3778437, 3844413, 7923081, 7217121, 6081382, 6531443, 3307522, 5932603, 6610376, 405069, 878375, 937896, 6119022, 6018754, 3720530, 4279470, 3766534, 215279, 3249569, 3041017, 2074183, 4293526, 6463938, 3734199, 3673082, 5083122, 2830636, 6070483, 7595732, 7711012, 6046199, 5276057, 3819661, 3549495, 8369997, 7439619, 1802076, 7964481, 6658570, 3060587, 2551190, 5796116, 204508, 7111173, 6740352, 1463606, 3168707, 2797925, 2163669, 7240385, 1422769, 5629465, 7825177, 4800993, 4318603, 4440750, 4460448, 507279, 6449272, 6794658, 8337644, 611409, 6994689, 6707955, 5162066, 4482619, 4348895, 7551834, 8213541, 8066966, 1207868, 5210332, 2868246, 3734999, 1059599, 779987, 6382411, 1609395, 7741198, 5599065, 5910532, 3006189, 5834483, 7178842, 4976941, 1910273, 4359130, 6088800, 7301113, 4592142, 6817864, 6014691, 1015879, 1551478, 7813214, 6656629, 5492649, 8197096, 652317, 345080, 7575278, 326735, 222898, 8354557, 7875087, 2651115, 6124294, 271945, 7348099, 7822345, 4342179, 7372873, 3339882, 6469174, 5643816, 5258848, 313807, 2194920, 1925583, 6494600, 1494069, 5514168, 7465146, 1898541, 4561584, 3554537, 5205175, 4150046, 5901558, 3773982, 7281741, 1453443, 8096812, 3342692, 5972187, 1294242, 6848206, 4828194, 3419560, 109041], +[1664740, 45733, 5300608, 7326685, 2428234, 5319835, 5979853, 2802108, 1040625, 5242865, 2795945, 4944742, 3162981, 3778336, 3867974, 5890692, 6019215, 1530009, 7236425, 2669080, 2239705, 4541183, 2722500, 3708753, 8336179, 2665567, 4431953, 7664831, 397730, 2968197, 4431029, 6576178, 5867326, 1846479, 1805389, 775327, 5709968, 4559208, 5374695, 3775207, 94233, 7064743, 6163882, 638458, 5063738, 7138349, 1393161, 5375606, 4784383, 8294111, 2877924, 6018153, 7458178, 6114196, 3830654, 4433134, 1816015, 3511151, 1465507, 4375449, 2634677, 4486479, 40408, 8197246, 1578915, 7008501, 5378610, 5886005, 240224, 1868431, 2353651, 4843982, 3021940, 7810337, 5547622, 6146728, 1673216, 1556518, 1085718, 6437365, 5455922, 2455738, 7131409, 5570779, 4423301, 7198541, 6710391, 3808173, 6622453, 421757, 5557737, 1156941, 1317196, 163997, 3520052, 5887485, 6698878, 6692460, 3909638, 4081445, 8007718, 5561632, 438742, 8265020, 1642530, 4431573, 6407859, 3964710, 6708975, 2370105, 5807402, 8055568, 2373865, 4690191, 6287215, 4621583, 294279, 2542396, 5936589, 3276087, 2541094, 7670760, 2897531, 1553540, 7028989, 377916, 7732227, 2594886, 4610894, 1874241, 7370954, 7084454, 1048718, 5430455, 6378227, 6277828, 1542227, 1427952, 652150, 7249349, 7418705, 7802902, 2263617, 4080662, 5230778, 5450601, 4724151, 882273, 5076635, 1692637, 3876318, 7925965, 7789841, 375774, 3588529, 2151473, 6036047, 5839074, 5233057, 2608399, 3331834, 1540004, 1459070, 5908015, 5321984, 3904902, 1523777, 3029522, 414872, 3636857, 3424295, 6715553, 822036, 7877098, 2736507, 730648, 5700649, 5280944, 6280577, 6291111, 6088962, 5634957, 1354764, 4410571, 873483, 7496934, 7369920, 2913175, 1214916, 2287447, 1072004, 6042219, 2245294, 2006176, 7575094, 2881501, 3547798, 3228619, 6206203, 1695038, 2412897, 3154093, 1171422, 7104935, 6047109, 3204042, 7746105, 7575712, 7010268, 3006612, 7106563, 1684685, 3119736, 374972, 3375092, 7750765, 5465141, 6032891, 1764371, 4818805, 2716794, 3311642, 967528, 3728887, 4661127, 248679, 4844607, 1624631, 5681820, 4857290, 6054516, 2538488, 3795973, 792711, 4812556, 942372, 272392, 6832661, 4837242, 2280277, 7660765, 1348111, 5757031, 8205116, 5604355, 1381774, 200678, 7994105, 3728050, 6509014, 589334, 3997883, 6780419, 8117018, 5964166, 4847648], +[254024, 1527086, 5767916, 1198641, 4753235, 7363233, 4452551, 6429845, 5889893, 3441751, 8235121, 1409317, 5136004, 7473477, 151190, 3200683, 2745105, 4652879, 4603473, 6119205, 1086746, 3180773, 2267109, 7621996, 1475368, 8091457, 1544094, 5217032, 1897192, 2737302, 6457483, 6750275, 1212622, 5622820, 6775072, 1940874, 3310844, 5939292, 5999199, 3182647, 6810559, 3119731, 7630241, 7202179, 2407319, 4353074, 4685970, 8293814, 1913074, 6487891, 7586814, 1211092, 3875668, 1431261, 3040586, 596943, 937293, 10546, 589913, 4824796, 1863979, 842515, 4799583, 6036502, 2702572, 5031070, 1173203, 4587535, 1182855, 6354803, 404038, 8316637, 7688906, 3351862, 7457068, 2669682, 7432944, 851519, 1730552, 7864803, 7590924, 7263502, 3132107, 6804213, 4023401, 1881223, 7421930, 5104442, 4190674, 5491575, 7637109, 5253413, 1101875, 1256453, 3267570, 453815, 6700392, 3683900, 3753837, 3938952, 1448626, 2365188, 6260742, 7192976, 6964136, 2630820, 2934210, 1905007, 7688018, 2720922, 1610131, 948412, 6241966, 7058639, 2503164, 6381195, 8194437, 5650759, 6656272, 1346489, 3122121, 5598944, 3243589, 4162453, 469295, 5896652, 7510459, 5614126, 2114180, 8317157, 2079747, 3973278, 6238229, 5995887, 439269, 4398464, 6832982, 5634941, 5990194, 6594594, 7737592, 7421706, 6165926, 5158341, 2464616, 3985296, 2008162, 78793, 1536530, 3510782, 7058396, 1689450, 2165597, 6560836, 608973, 870794, 1405880, 5848895, 7477365, 7772893, 913489, 7343783, 6281318, 4015277, 1851123, 5736547, 2261099, 3364282, 1321804, 2945627, 4462269, 2530879, 2940567, 3714922, 7075005, 776546, 1050434, 6061629, 2570677, 221545, 5670436, 4008473, 4239431, 1527805, 1349528, 5814479, 6365512, 3185071, 7693442, 5657825, 2408506, 3762711, 3717596, 4289823, 6383076, 5389994, 988051, 364480, 7722842, 5396829, 3595569, 1231803, 3048027, 5966211, 4686213, 7124596, 6256920, 4506567, 1739078, 5349114, 3165832, 986440, 2393918, 5951210, 16928, 3297028, 7920446, 5286222, 1083643, 4260833, 6190402, 1472453, 2031711, 824068, 1281240, 1116964, 3233690, 5065313, 1219209, 7458916, 8173530, 8099640, 3818342, 4489857, 2598877, 126636, 1160535, 3755760, 3652263, 198385, 1295993, 1352051, 4846782, 3565886, 1622825, 3636705, 6342228, 441797, 242626, 3609575, 3711712, 4101217, 4939606, 3672416, 3401539, 27186], +[8222758, 4746286, 650083, 7601364, 7398768, 3179879, 1081127, 3218138, 8194920, 7764806, 243324, 5595132, 5771329, 3594582, 6697011, 6392735, 6216660, 1740734, 717432, 2702604, 1585405, 6383094, 7650714, 944821, 1749858, 1249161, 6401847, 1884896, 1577638, 4057134, 3216818, 728801, 7424127, 5870052, 6509952, 7246971, 163522, 7575352, 5807523, 6459466, 5178911, 5566810, 554858, 7189607, 3781199, 4186181, 4628698, 4773556, 4957093, 55073, 6748038, 8166927, 7773120, 5344405, 8236914, 4112972, 2938496, 2972043, 2716533, 173540, 385297, 150525, 4144530, 7479593, 3291036, 4849885, 3070370, 7937839, 2773527, 630697, 1639838, 7067380, 4507901, 2282466, 2421944, 5726506, 1602822, 3567081, 14664, 4864894, 2251311, 5681364, 5961178, 3038478, 6524007, 6812426, 1961943, 5152145, 5349245, 2455864, 909507, 3492027, 7133326, 2519308, 5749113, 3305788, 71347, 5503453, 2849462, 54248, 449256, 5358198, 8137387, 5748813, 1924260, 5963916, 1812601, 5453977, 4776691, 3752684, 7456361, 3719056, 6748631, 2803428, 7329029, 2403137, 7681408, 3546860, 7278796, 4929981, 1081548, 6018197, 8233105, 8162286, 6625354, 3876887, 7423351, 6950117, 3891989, 7554758, 4064835, 757446, 3814274, 345676, 7631701, 5537073, 2755482, 3621797, 5015755, 7677186, 5743975, 4981145, 4145002, 8130169, 4053763, 2399726, 867678, 7165488, 2166547, 6223657, 4134427, 5471405, 2767478, 4066899, 2648725, 5898621, 2280724, 903662, 4256166, 7021421, 2662573, 5723357, 3840625, 7279922, 5771655, 6131587, 7875627, 6774236, 625451, 575732, 115526, 4469837, 7086225, 3986054, 3806247, 1995537, 2198449, 4932791, 2366616, 5734826, 2011250, 292633, 8087157, 2783902, 1821633, 3405119, 933772, 1902709, 1383938, 4644710, 1187420, 2979320, 658970, 8229740, 455521, 4492619, 5330080, 4834689, 7972910, 1891832, 5005859, 5033585, 7584200, 1226414, 3562085, 3051048, 4489081, 6192214, 2341183, 2923311, 2811106, 396838, 8006207, 836146, 2368992, 6509176, 5962051, 7137678, 1768657, 8303582, 5048797, 1295256, 3205515, 7355596, 1560896, 8119227, 7966091, 4904876, 3786604, 5406244, 393374, 6741967, 5696533, 1213762, 8066003, 3840477, 1710968, 808960, 8282854, 2994058, 4090822, 7778709, 8072144, 5092117, 509321, 3751248, 3426726, 8155363, 8123010, 8005958, 8031314, 7408639, 7126532, 1687052, 8059912, 6083268], +[5671095, 4411245, 3063975, 6934657, 5321130, 7278909, 4717083, 8131394, 6506075, 540703, 1827129, 1863798, 5443078, 5794119, 2567392, 6487943, 2617146, 991875, 3397461, 8141993, 7870798, 908328, 1823370, 7143961, 3190585, 8059462, 1330486, 6890355, 5353117, 3628221, 7020061, 4979302, 759504, 8189043, 541008, 1664973, 4189826, 6032576, 5701297, 3485631, 2082773, 8185932, 2381790, 6326543, 5030269, 7987554, 6104672, 2978569, 3511999, 2536719, 3033321, 1742729, 124930, 3310898, 4689263, 1025995, 1440808, 2519011, 8261255, 6339306, 5022944, 7089286, 5176153, 5550358, 4302347, 2062244, 3977446, 4191117, 1343633, 8268332, 503447, 6044720, 1043501, 1962886, 943726, 1755722, 6527027, 5319286, 8169910, 4016513, 2982645, 5482011, 4474216, 5851369, 2682959, 3692673, 1215350, 3214406, 4227566, 2208154, 2939116, 3983982, 2709456, 5484332, 4583841, 4381126, 5800271, 8066992, 1897837, 4693054, 6478051, 3110882, 3599242, 2808837, 989736, 7940849, 377902, 1623641, 8175344, 3499160, 3479693, 1432881, 2285430, 793029, 1003221, 3679063, 2237308, 7999839, 8310565, 809898, 4780250, 958562, 6135802, 278252, 2515872, 4328502, 6194384, 7433459, 519769, 2308397, 6513663, 699, 5868038, 1281847, 4991273, 2607325, 6757341, 3386553, 5366017, 5339322, 6936675, 4073565, 2526647, 3486436, 7083279, 5850504, 1844602, 7641211, 4716101, 521394, 6242825, 535971, 6644055, 2765430, 4144247, 7597168, 7617083, 6384211, 2654277, 6322627, 8264886, 5689863, 3884809, 150394, 4693133, 2382398, 7474300, 2633517, 196207, 2102832, 5349837, 30890, 1986537, 665931, 1282057, 4362964, 1826465, 4148412, 7147682, 6464630, 8189283, 599851, 5982162, 4129638, 7716376, 2509611, 5355319, 5435226, 3647681, 4646994, 3625794, 4405489, 4956772, 7076440, 168039, 4826694, 4371725, 7431334, 330168, 1707887, 8195467, 5676593, 5098888, 2378455, 1875168, 532925, 7237353, 4920083, 2180113, 5027692, 3938356, 7974861, 1259992, 1491488, 2786431, 1015497, 1125705, 3576265, 6927287, 7336145, 2015435, 1279694, 8135359, 2006485, 4787045, 2955587, 3232346, 1551579, 8293810, 7571761, 7779922, 1374141, 4320179, 1307342, 7529296, 7164283, 1203442, 1633621, 5243157, 2828071, 7055388, 1085928, 1073637, 8221146, 5082119, 3599367, 2816316, 5365558, 7333099, 1543341, 6217875, 1353424, 8190539, 2940737, 1788778, 8063448], +[3823010, 1353169, 7204720, 2657288, 2979893, 601334, 3211805, 4389815, 7962312, 6064615, 8204176, 3860543, 814606, 5302132, 3658133, 437359, 8154853, 7572967, 5764564, 4364366, 5910146, 7945315, 7769538, 1821549, 6234580, 5881263, 8026763, 4171930, 5439394, 8042638, 1157518, 1211516, 569912, 7569798, 5464158, 83418, 1904813, 6785825, 6398142, 5263044, 5523515, 3708506, 7824232, 7836521, 6716834, 399064, 7864731, 435247, 1770934, 1101813, 5016542, 4292713, 5014685, 1212360, 2205313, 3715746, 1497600, 3182849, 3292930, 114126, 3094913, 2126209, 911200, 4766113, 3389280, 4602526, 7542989, 6007540, 6265626, 5839740, 2660869, 5987297, 3260593, 20074, 4358351, 5191175, 6306149, 3517691, 5947049, 6166102, 410819, 8265077, 7721960, 5233230, 6848233, 7811634, 5793554, 1198357, 5126486, 3530483, 4690530, 6697435, 3277256, 2800149, 2481695, 6392846, 4760095, 8102206, 267055, 2691126, 5999346, 7414178, 3806465, 2419908, 3728613, 5536852, 1494513, 5641584, 2755093, 2669150, 310715, 3837976, 3742271, 4236786, 1716808, 758296, 2187165, 4869099, 5769075, 639114, 3302290, 3595757, 5103954, 808469, 4330584, 6726885, 7112873, 5561911, 1843803, 4555342, 6430653, 4547812, 2676820, 5921618, 1378739, 6156704, 3995461, 7850855, 3833242, 653789, 6658886, 4725238, 5433365, 7446654, 4424229, 5124114, 7672742, 5875536, 3201515, 7361457, 7906016, 2303359, 4139367, 1966467, 6540105, 430859, 1095818, 3974758, 3173829, 5251488, 768973, 1086130, 3501676, 1337346, 1818919, 1702374, 3308800, 3888499, 4474262, 5974729, 4220819, 5905883, 4482976, 223974, 2521876, 280623, 4806957, 7199876, 5131491, 3063311, 440559, 4912549, 4950233, 2613146, 7634617, 1413588, 85673, 6786574, 5485469, 6473436, 7352683, 6817138, 3134236, 5405013, 7933120, 2763030, 8262669, 7569177, 6505324, 386983, 1450401, 1069716, 5114183, 3566542, 482143, 2844275, 4735801, 3517558, 3241558, 145238, 3559562, 5169244, 1192399, 6619120, 1187491, 5547885, 6446950, 6049385, 6933495, 462437, 1614676, 7683475, 2636554, 7194991, 5834908, 1589012, 7702374, 5871007, 2014475, 3521360, 7402369, 434783, 4965700, 5675033, 6749356, 5964699, 1530907, 1077377, 8210492, 404578, 1209748, 3818739, 3537989, 983319, 4767534, 140095, 7159640, 4984226, 8227725, 1763811, 8260142, 761447, 7452381, 4539436, 295661, 8363537]] +ct0: [[32904, 26231, 8345994, 8366484, 5562, 8376985, 16091, 8219, 8374510, 8358317, 2995, 18298, 8336349, 14169, 8365961, 33437, 8368687, 8360809, 8359499, 8351167, 21877, 49414, 8359609, 8368196, 11252, 8348723, 1769, 8366251, 6328, 11824, 2161, 6431, 8378082, 8351322, 40151, 927, 3105, 8348322, 8368733, 20370, 8348046, 8366512, 6631, 8364194, 8362873, 8376327, 25464, 8371382, 27688, 8374744, 9305, 20936, 8377301, 774, 6225, 23481, 8353514, 8360576, 8362699, 8373639, 8378665, 13519, 8368787, 8374592, 8927, 8352075, 25687, 904, 8373930, 8364558, 8370866, 12499, 10431, 8361509, 27307, 5716, 8358360, 13886, 8366951, 8349242, 8365247, 8366677, 8366061, 8342334, 5044, 20763, 28932, 24485, 28341, 8365955, 26670, 5343, 8362812, 8380275, 19818, 18253, 26806, 8380092, 8374086, 42098, 8369114, 16319, 8371556, 1908, 8377276, 9883, 8355917, 8366790, 15893, 34061, 8359260, 11570, 39848, 2082, 8377863, 3726, 8361328, 8348755, 8379790, 4058, 2782, 35082, 23781, 13093, 8333278, 10038, 2304, 8358171, 23844, 20342, 4979, 4434, 16176, 3443, 8364583, 8349752, 31931, 5603, 8379211, 5262, 1668, 2458, 7112, 8372838, 8379867, 8376829, 10485, 9465, 5323, 8370388, 8245, 8367787, 8365315, 30798, 6678, 8376108, 8380297, 8362683, 27684, 13966, 13375, 20890, 8357565, 29041, 8377153, 2664, 22767, 8379383, 17385, 8366151, 8355011, 8359874, 8351283, 33812, 9633, 19634, 4483, 8354821, 8347091, 40403, 8378868, 8374079, 14973, 8350764, 8374766, 8366282, 23725, 8365420, 8366701, 14590, 8340357, 8358376, 8374323, 17108, 8361609, 8348310, 8355194, 8351299, 26067, 8378966, 26725, 8375389, 9982, 17288, 24196, 8348923, 8376633, 443, 8374121, 8373123, 16296, 8373018, 8375795, 8364532, 1720, 8345406, 8362813, 8347882, 1538, 21375, 6291, 21842, 8372787, 11633, 8377144, 8775, 8376296, 5172, 12963, 8344004, 8369176, 8354970, 2081, 4969, 8376251, 8374026, 8348144, 5043, 5204, 1895, 8359703, 8375676, 3224, 8374385, 8364331, 5877, 21933, 9661, 9679, 8372977, 8376599, 8372810, 8370336, 8346775, 10459, 15734], +[8361286, 1411, 16866, 8364867, 8338399, 8360548, 8360469, 8370777, 29947, 17287, 8363688, 8347575, 8377030, 3105, 8358036, 6639, 8329352, 8376085, 3039, 25747, 15497, 8376591, 27477, 8351416, 40544, 8353761, 8349702, 8353686, 8353167, 8377112, 5508, 8343874, 8350445, 8376873, 8380136, 10199, 8374824, 8349561, 8373706, 8358548, 862, 10137, 19365, 12727, 8373170, 8376749, 8359489, 8357201, 8365314, 10960, 2144, 8362169, 8366142, 8345269, 32466, 8369872, 4190, 11501, 8355127, 17740, 8321729, 22632, 1524, 21927, 8353251, 8363594, 13543, 22738, 29081, 4763, 8371572, 8358348, 8342082, 8367978, 3037, 48372, 26465, 8374520, 4560, 8376125, 14525, 4078, 38458, 8365142, 17793, 9417, 8360855, 6359, 8657, 28311, 8369849, 19976, 8365856, 8342403, 8372061, 11615, 20749, 8361429, 7942, 8379600, 24838, 31944, 3096, 3539, 2571, 27884, 8371831, 12425, 13331, 18885, 18186, 8359047, 8373464, 10731, 23669, 8378471, 8379079, 38944, 8327541, 32262, 8358587, 3721, 15277, 19474, 14502, 8378365, 2728, 6421, 12800, 30531, 8204, 7106, 15150, 20380, 10245, 18322, 169, 8356090, 8345786, 8370479, 12426, 10610, 8370921, 8366281, 8373801, 20999, 22535, 28618, 8345371, 8363457, 8363469, 12631, 10496, 8349815, 5281, 14583, 29690, 5639, 8365923, 8350876, 8378807, 9790, 16145, 8362496, 8365410, 8369632, 8359059, 7459, 8367413, 4868, 7559, 8373009, 8359311, 8369767, 8368755, 8368457, 8374725, 21667, 8378087, 1277, 29943, 23120, 8373971, 8376762, 8368605, 8328082, 8366471, 4305, 8361187, 16106, 24733, 8373301, 8369182, 8364733, 1522, 8355188, 8358858, 2349, 8350987, 8354486, 3799, 13137, 8372496, 10058, 8372363, 8369050, 337, 8369877, 8373494, 8350314, 8349655, 10819, 16378, 8364396, 38019, 8374623, 3585, 8345481, 8366110, 8347218, 8353106, 37850, 14979, 8362491, 8363557, 3493, 8375832, 8377888, 2119, 8357972, 8353262, 8371194, 1944, 10000, 8378773, 28035, 11881, 8369223, 14534, 17039, 8368897, 15535, 21685, 8364342, 16646, 428, 10543, 37280, 8358605, 9733, 8352216, 12963, 7561, 8332166, 20995, 8365777], +[11583, 5902, 30109, 8350695, 8375446, 8371773, 8344663, 8375347, 8341616, 10319, 8380152, 8379031, 8368092, 8340640, 742, 8361422, 12218, 5477, 6941, 19861, 191, 496, 8358344, 7771, 8350015, 8345724, 34990, 8342637, 8366469, 10864, 8359352, 8362183, 8368601, 8376852, 8370390, 8376200, 25347, 8373295, 8354615, 36898, 8357106, 8375780, 8365902, 22421, 14011, 25578, 8361860, 5998, 31249, 8354430, 15546, 8351703, 8370164, 28355, 8366651, 15891, 14218, 4898, 38509, 8350647, 14608, 26710, 8367095, 8376151, 8358753, 8361912, 17189, 8375272, 39137, 8377006, 8370701, 8377226, 5263, 8370324, 45868, 16640, 42565, 8364212, 18661, 20843, 18404, 33837, 8373316, 24276, 8378585, 167, 8367542, 8351460, 8001, 8363779, 30498, 8372163, 30319, 42441, 8380191, 8372286, 41871, 800, 8367455, 18491, 8365374, 50621, 20675, 28295, 2337, 8369230, 49293, 8357491, 8369141, 15829, 8379859, 16586, 8378573, 8369859, 8365363, 8364928, 8378505, 2034, 19837, 15142, 8375778, 8347141, 10274, 35648, 20275, 8344060, 8372068, 18673, 23951, 7009, 8348981, 7900, 8351025, 8368550, 7174, 8323498, 5563, 8370898, 19049, 8357210, 8345280, 14597, 8345554, 17186, 8371876, 175, 8372772, 8368796, 10916, 8352331, 8405, 8339093, 8362335, 8373181, 8376193, 24300, 8359330, 7510, 8378400, 17301, 8376253, 8349135, 8379763, 14306, 810, 8366522, 8348194, 8360419, 8365364, 13122, 8362973, 8378541, 8360063, 38838, 8364926, 8357090, 8373637, 8346089, 15106, 8357814, 14810, 10302, 13481, 17358, 8376867, 13805, 8359885, 8374458, 8366994, 41531, 8363430, 5437, 8357160, 8367998, 10190, 8363197, 8375054, 8366811, 8378828, 8379792, 8357751, 27634, 8360692, 16649, 9617, 8360203, 2376, 15008, 52423, 8345537, 11555, 17015, 8362165, 38850, 8378860, 5005, 11317, 8194, 14823, 8349472, 8367850, 17290, 8343647, 8357420, 9973, 8368950, 8949, 8376599, 12869, 33579, 8359100, 13740, 19421, 17360, 5354, 7852, 22814, 8369489, 39860, 7444, 8379692, 8331996, 8372298, 25720, 8365915, 14667, 8374448, 8362903, 19044, 31247, 5670, 9511, 8376440, 28367, 8376607, 12439], +[4641, 8363428, 8373020, 8374949, 7253, 4521, 8353858, 1923, 8356593, 8376460, 8369010, 8373505, 8363779, 16280, 8364919, 8376457, 7788, 8375090, 8363251, 7366, 8370897, 2849, 8362959, 42015, 3969, 7677, 8359907, 8364576, 8373881, 8193, 16448, 8368284, 8367322, 8371621, 8358321, 8370409, 2219, 8376575, 8355575, 8361081, 8349774, 8371716, 8355664, 8376163, 7438, 8317466, 8374182, 27675, 22707, 15164, 8353459, 2546, 1381, 5876, 9154, 8370625, 7516, 8370948, 32302, 8346351, 17571, 8349206, 8360068, 9155, 8366701, 8357127, 8365933, 8372424, 35698, 8365473, 3105, 26612, 8352888, 3636, 8378033, 8378037, 8373022, 8361943, 13626, 372, 8372454, 20119, 8371552, 8364050, 2294, 8379949, 9936, 8365273, 14590, 8376634, 30298, 8357813, 8371829, 8365023, 12128, 19516, 6375, 8341568, 15987, 9580, 14254, 8359009, 17232, 14120, 18135, 8363945, 22131, 8365156, 13055, 16784, 8347854, 8363, 32399, 8369123, 36775, 8340583, 23525, 10342, 40604, 3347, 16834, 8379201, 764, 1006, 21558, 16712, 8370763, 8372359, 23216, 12791, 14870, 7229, 8372343, 27706, 8361249, 19890, 8148, 19348, 9750, 10227, 8348947, 42086, 8366160, 8365097, 8377497, 1180, 368, 4258, 8379392, 18069, 8363840, 17161, 8359648, 2974, 5548, 17368, 8372883, 8375733, 1416, 6204, 9442, 8376968, 10381, 24265, 8354216, 7857, 8351955, 8369387, 11108, 30343, 8357876, 8317258, 8356513, 19445, 24367, 8379421, 11990, 8372645, 8371570, 8379151, 8373891, 8368026, 10130, 38173, 8357865, 13564, 8352993, 20067, 8366549, 17893, 8375442, 8376164, 8360184, 9529, 8370825, 12410, 8369262, 8366383, 8357459, 8352448, 8372336, 10713, 8355260, 8379860, 8337506, 8370546, 7616, 8137, 8374107, 8364612, 8378652, 4436, 1528, 8378612, 6541, 8338674, 16092, 8378155, 8359049, 4881, 994, 8373082, 8370501, 8379865, 31013, 6407, 8358, 8350054, 32832, 8347838, 19514, 2592, 8374456, 8370630, 22268, 5513, 8369110, 738, 9251, 8363755, 17682, 12239, 3927, 8363108, 33375, 8368350, 8379563, 3173, 24986, 13090, 8378503, 8368097, 61, 8374014, 8370692, 28738], +[8357374, 51949, 8363063, 10705, 5643, 3911, 11236, 8378571, 19082, 8356102, 22566, 8337203, 8374172, 8368626, 8363601, 2650, 8330988, 17448, 8367498, 8365639, 8362276, 8376427, 8379838, 1342, 19652, 11746, 12041, 29042, 8379465, 21902, 8348706, 3065, 18, 8370846, 8377590, 1485, 18462, 8367075, 1952, 8375513, 638, 16385, 8378182, 4586, 7965, 8367662, 12835, 7440, 31159, 8368020, 13386, 10765, 14399, 8372967, 7510, 8378968, 8373056, 27593, 20072, 27086, 4146, 8376047, 7070, 8344023, 8371461, 6483, 8368311, 11992, 8366434, 22809, 8372369, 3274, 3519, 8379443, 64344, 14717, 8375279, 8349417, 11646, 8350490, 8363300, 6504, 6404, 20471, 8367752, 19488, 8344651, 25385, 8367312, 8368607, 8379793, 1966, 10230, 8373767, 8359272, 8363874, 11402, 8364909, 16373, 1174, 8373095, 25118, 31024, 8371930, 8350411, 56, 15526, 923, 50498, 8377557, 8377038, 8354806, 8374564, 8370505, 8373459, 28876, 8373770, 8378316, 8356138, 8352468, 7731, 3779, 14587, 8338797, 4474, 1980, 8355424, 22860, 8345641, 14472, 9868, 199, 1362, 8366289, 13683, 3960, 2692, 8375159, 8358126, 23274, 8377527, 11235, 8364665, 6558, 8359545, 8364403, 8376916, 8372418, 12365, 8375020, 8356561, 17222, 19415, 26310, 8362078, 8352451, 8377494, 8371190, 8361705, 27377, 34818, 8359773, 33144, 21596, 33695, 8379589, 26671, 8376570, 8364188, 8359743, 8368859, 8366806, 9684, 26641, 8372508, 8321, 15140, 21874, 8363214, 8360026, 16863, 18700, 14015, 8344698, 8375389, 8379288, 8377713, 8380026, 3607, 8373733, 17461, 7349, 8326653, 8356662, 22594, 8379680, 22661, 18309, 18609, 8359863, 1063, 85, 8353405, 7183, 8371700, 8373896, 8362942, 8204, 8377357, 8349875, 1931, 8362901, 21020, 560, 27271, 9058, 4222, 2075, 8369306, 8369315, 8365834, 16412, 5968, 8367512, 8368476, 8357846, 4981, 2207, 8376263, 8376238, 1180, 8380110, 8378015, 2751, 8372095, 7289, 8365710, 7500, 8349907, 8380375, 20192, 2655, 6917, 4513, 8354590, 9887, 11210, 18921, 8367785, 710, 8356472, 1242, 8375741, 4019, 20221, 5477], +[8376757, 32629, 14147, 8377833, 8369181, 18072, 21035, 32201, 9370, 8378537, 14404, 8367186, 3401, 11856, 8362655, 638, 8365125, 8363189, 8359537, 8367356, 19339, 3051, 8376812, 27533, 8371534, 8367752, 3999, 31601, 8356363, 41032, 8376570, 8359795, 13804, 7107, 15619, 18047, 36458, 8367714, 8357956, 8770, 8360588, 8377276, 8372611, 8379832, 8364963, 8373361, 4613, 15187, 9927, 8369087, 8373485, 793, 8346424, 2729, 22012, 13025, 19176, 22007, 8050, 8375416, 5586, 47878, 6825, 8558, 14818, 11108, 8356945, 8365439, 21448, 8353493, 8355247, 17345, 8367976, 8377106, 8354308, 8375555, 8352660, 8193, 2782, 8360891, 8, 21974, 7218, 8374637, 8371477, 8358213, 13176, 1225, 8370545, 8362648, 8359844, 8373304, 8374119, 8373768, 8351314, 28959, 9670, 10138, 8352830, 15617, 18089, 8364939, 8347820, 8345844, 1438, 8375740, 8266, 8358761, 20142, 7432, 19063, 8374845, 8371608, 25341, 7959, 8373575, 22453, 8369631, 6328, 20196, 8376196, 8358029, 12155, 8346878, 8349092, 8353436, 8377574, 13375, 8378206, 8358173, 8368083, 8372398, 8379627, 8375878, 15571, 8380032, 6312, 23179, 9988, 8353897, 20080, 841, 8374997, 7078, 8373618, 8362921, 44421, 8358973, 14329, 8331763, 8367608, 8374340, 8372703, 8369134, 8374429, 1298, 5884, 2052, 8352813, 37094, 8363509, 28300, 18296, 8364555, 8362112, 22830, 45343, 8375810, 19968, 12099, 66991, 8380148, 8362119, 26122, 8363464, 15321, 8340149, 8371927, 22014, 16049, 23174, 8370822, 12356, 8369514, 8369060, 10471, 3873, 4143, 5958, 8374584, 8368165, 12114, 29932, 6031, 34396, 8374981, 8365259, 8366434, 5707, 8375927, 15349, 1115, 8353691, 10474, 8369730, 8368607, 8372296, 3441, 31319, 8346760, 884, 8362769, 2872, 3139, 8378804, 9886, 18579, 21853, 8367305, 23838, 2208, 73117, 8355950, 20041, 14289, 8367638, 30577, 8347920, 8336563, 6130, 8365302, 8379303, 8361023, 5203, 8366155, 39759, 15290, 8378878, 8365238, 9837, 8375754, 8368355, 8377147, 37516, 8362579, 12447, 6416, 8352414, 23136, 8376547, 8358718, 22517, 8362459, 8367323, 8359512, 8357798], +[16134, 8364707, 8366184, 34713, 8362963, 8342067, 8374259, 8358068, 2225, 8948, 17044, 8378036, 8335776, 19674, 3364, 8356976, 10461, 8371402, 22856, 8374564, 15911, 8374326, 8373275, 10427, 8376343, 8380088, 8343379, 15087, 8374143, 12471, 4872, 8380191, 8371279, 12396, 4280, 12416, 8365219, 8366379, 13310, 8359817, 8356377, 12873, 8379668, 8377006, 24877, 27792, 8370507, 8372638, 3454, 13717, 5259, 8373049, 8370326, 8374274, 13035, 25405, 8367045, 43309, 8356859, 8379849, 8357431, 8347348, 8357132, 8357640, 8362525, 15464, 1002, 8329, 9848, 8371228, 8371932, 6688, 8374569, 20777, 12573, 6240, 20558, 8369319, 5646, 27741, 8379453, 8380177, 8379644, 8375752, 8365127, 3242, 8364850, 2699, 8379131, 2026, 20906, 8359647, 25886, 14216, 5679, 8369561, 8366306, 8376393, 28090, 28070, 20499, 8364537, 8355504, 3227, 19492, 8376347, 12385, 8348297, 12719, 8376519, 16061, 8369811, 8379190, 8344997, 208, 8374395, 8363341, 1406, 8374233, 8373352, 25622, 8364175, 14007, 37655, 13339, 22566, 8351689, 8378545, 3485, 8365936, 20788, 8376673, 26781, 8354275, 8377901, 8372257, 575, 755, 8362973, 8375857, 7634, 8368020, 2165, 9893, 6644, 29496, 12249, 8346531, 5095, 11770, 9726, 8364033, 8367309, 8373055, 8372698, 32338, 12834, 27223, 713, 6329, 20562, 8377503, 8365060, 5320, 8370541, 8378373, 24591, 8362087, 21001, 13440, 7657, 33125, 8361834, 8374522, 8361750, 8356116, 3682, 8354210, 3076, 16155, 8377238, 8051, 18999, 14857, 8363845, 7482, 8328898, 20975, 8372558, 24561, 8364198, 8380364, 8375377, 34568, 8376102, 670, 8801, 8357401, 8377327, 8366574, 8369471, 12749, 6078, 8378245, 8368825, 50, 31019, 8370925, 8346817, 11602, 8376588, 8361850, 2924, 27420, 43, 44437, 8376884, 8378674, 8339720, 5123, 8369659, 8342518, 17181, 8351670, 8379348, 8355404, 15529, 8341267, 8376197, 3435, 25170, 8358849, 8374948, 27136, 8356812, 6719, 14664, 17181, 10804, 10510, 5095, 15385, 8366954, 5092, 8377090, 8370222, 8374921, 32713, 8341568, 8952, 27331, 8366722, 8362852, 8359334, 8369469, 8377715], +[8367437, 8371445, 1072, 8377901, 8330984, 19212, 8363036, 8369508, 11222, 3901, 8379028, 16620, 8378944, 46830, 8371263, 6701, 7581, 8346352, 8362810, 8338688, 8374209, 29683, 8371881, 8374694, 8380002, 2992, 4542, 8360048, 28932, 8362445, 9738, 8369348, 8368442, 8370889, 30734, 8372136, 8264, 8375373, 2818, 8371188, 152, 8377324, 8366811, 8368805, 7785, 8368294, 7854, 10326, 7720, 1487, 5542, 8375812, 8378705, 19340, 8351144, 8371546, 8371946, 8375905, 8350360, 19286, 20163, 14029, 8373279, 8352633, 21171, 8367916, 21758, 8368504, 8360663, 9087, 8362692, 8370253, 8373041, 20731, 8371429, 8358965, 8370110, 8374697, 21345, 8369134, 24497, 8352046, 11060, 15952, 20118, 8372067, 2837, 41282, 8372840, 8343792, 8372620, 4456, 8364331, 8370318, 8368638, 15944, 8376385, 31641, 8370341, 8342403, 18999, 8371659, 8364241, 25802, 8356366, 21352, 8352960, 10652, 23432, 8370280, 16771, 8352423, 580, 2516, 16218, 8359251, 8358033, 9384, 18802, 32607, 4471, 7607, 14254, 33479, 8354163, 8355301, 8371726, 8358388, 8377978, 15651, 23534, 8369282, 8370708, 22884, 1001, 17839, 697, 8378415, 8357060, 13499, 8352, 8367139, 8376875, 15677, 29592, 31289, 8368404, 22942, 21624, 18376, 12624, 10073, 8349507, 8402, 12662, 8368356, 8377844, 13849, 28336, 8373005, 8364923, 11436, 8345333, 20337, 8365353, 29019, 8379092, 8380016, 29417, 8368136, 9285, 8380017, 8371319, 3069, 9430, 8374728, 4565, 8345931, 8350768, 8379041, 7753, 9402, 8364262, 8350806, 4941, 20625, 14953, 8368960, 8362815, 13423, 8183, 8340047, 8374303, 26071, 8371941, 8375527, 8364049, 8354878, 19940, 13279, 8372135, 8350193, 14039, 8372204, 8366790, 8375551, 8358699, 8357979, 8364939, 8362380, 5968, 576, 33678, 8356816, 8373200, 370, 8377618, 8366548, 5546, 8379515, 1484, 26471, 8379011, 31696, 31538, 8181, 8340978, 8355255, 8373534, 7097, 8354478, 8363977, 8371315, 8363908, 8480, 27691, 8343358, 17882, 19098, 8377730, 16546, 8376778, 8366652, 6006, 8367964, 8960, 15157, 8362727, 2859, 8361242, 26554, 8364298, 15656, 8373179, 8359147, 33027]] +-ct0: [[8347513, 8354186, 34423, 13933, 8374855, 3432, 8364326, 8372198, 5907, 22100, 8377422, 8362119, 44068, 8366248, 14456, 8346980, 11730, 19608, 20918, 29250, 8358540, 8331003, 20808, 12221, 8369165, 31694, 8378648, 14166, 8374089, 8368593, 8378256, 8373986, 2335, 29095, 8340266, 8379490, 8377312, 32095, 11684, 8360047, 32371, 13905, 8373786, 16223, 17544, 4090, 8354953, 9035, 8352729, 5673, 8371112, 8359481, 3116, 8379643, 8374192, 8356936, 26903, 19841, 17718, 6778, 1752, 8366898, 11630, 5825, 8371490, 28342, 8354730, 8379513, 6487, 15859, 9551, 8367918, 8369986, 18908, 8353110, 8374701, 22057, 8366531, 13466, 31175, 15170, 13740, 14356, 38083, 8375373, 8359654, 8351485, 8355932, 8352076, 14462, 8353747, 8375074, 17605, 142, 8360599, 8362164, 8353611, 325, 6331, 8338319, 11303, 8364098, 8861, 8378509, 3141, 8370534, 24500, 13627, 8364524, 8346356, 21157, 8368847, 8340569, 8378335, 2554, 8376691, 19089, 31662, 627, 8376359, 8377635, 8345335, 8356636, 8367324, 47139, 8370379, 8378113, 22246, 8356573, 8360075, 8375438, 8375983, 8364241, 8376974, 15834, 30665, 8348486, 8374814, 1206, 8375155, 8378749, 8377959, 8373305, 7579, 550, 3588, 8369932, 8370952, 8375094, 10029, 8372172, 12630, 15102, 8349619, 8373739, 4309, 120, 17734, 8352733, 8366451, 8367042, 8359527, 22852, 8351376, 3264, 8377753, 8357650, 1034, 8363032, 14266, 25406, 20543, 29134, 8346605, 8370784, 8360783, 8375934, 25596, 33326, 8340014, 1549, 6338, 8365444, 29653, 5651, 14135, 8356692, 14997, 13716, 8365827, 40060, 22041, 6094, 8363309, 18808, 32107, 25223, 29118, 8354350, 1451, 8353692, 5028, 8370435, 8363129, 8356221, 31494, 3784, 8379974, 6296, 7294, 8364121, 7399, 4622, 15885, 8378697, 35011, 17604, 32535, 8378879, 8359042, 8374126, 8358575, 7630, 8368784, 3273, 8371642, 4121, 8375245, 8367454, 36413, 11241, 25447, 8378336, 8375448, 4166, 6391, 32273, 8375374, 8375213, 8378522, 20714, 4741, 8377193, 6032, 16086, 8374540, 8358484, 8370756, 8370738, 7440, 3818, 7607, 10081, 33642, 8369958, 8364683], +[19131, 8379006, 8363551, 15550, 42018, 19869, 19948, 9640, 8350470, 8363130, 16729, 32842, 3387, 8377312, 22381, 8373778, 51065, 4332, 8377378, 8354670, 8364920, 3826, 8352940, 29001, 8339873, 26656, 30715, 26731, 27250, 3305, 8374909, 36543, 29972, 3544, 281, 8370218, 5593, 30856, 6711, 21869, 8379555, 8370280, 8361052, 8367690, 7247, 3668, 20928, 23216, 15103, 8369457, 8378273, 18248, 14275, 35148, 8347951, 10545, 8376227, 8368916, 25290, 8362677, 58688, 8357785, 8378893, 8358490, 27166, 16823, 8366874, 8357679, 8351336, 8375654, 8845, 22069, 38335, 12439, 8377380, 8332045, 8353952, 5897, 8375857, 4292, 8365892, 8376339, 8341959, 15275, 8362624, 8371000, 19562, 8374058, 8371760, 8352106, 10568, 8360441, 14561, 38014, 8356, 8368802, 8359668, 18988, 8372475, 817, 8355579, 8348473, 8377321, 8376878, 8377846, 8352533, 8586, 8367992, 8367086, 8361532, 8362231, 21370, 6953, 8369686, 8356748, 1946, 1338, 8341473, 52876, 8348155, 21830, 8376696, 8365140, 8360943, 8365915, 2052, 8377689, 8373996, 8367617, 8349886, 8372213, 8373311, 8365267, 8360037, 8370172, 8362095, 8380248, 24327, 34631, 9938, 8367991, 8369807, 9496, 14136, 6616, 8359418, 8357882, 8351799, 35046, 16960, 16948, 8367786, 8369921, 30602, 8375136, 8365834, 8350727, 8374778, 14494, 29541, 1610, 8370627, 8364272, 17921, 15007, 10785, 21358, 8372958, 13004, 8375549, 8372858, 7408, 21106, 10650, 11662, 11960, 5692, 8358750, 2330, 8379140, 8350474, 8357297, 6446, 3655, 11812, 52335, 13946, 8376112, 19230, 8364311, 8355684, 7116, 11235, 15684, 8378895, 25229, 21559, 8378068, 29430, 25931, 8376618, 8367280, 7921, 8370359, 8054, 11367, 8380080, 10540, 6923, 30103, 30762, 8369598, 8364039, 16021, 8342398, 5794, 8376832, 34936, 14307, 33199, 27311, 8342567, 8365438, 17926, 16860, 8376924, 4585, 2529, 8378298, 22445, 27155, 9223, 8378473, 8370417, 1644, 8352382, 8368536, 11194, 8365883, 8363378, 11520, 8364882, 8358732, 16075, 8363771, 8379989, 8369874, 8343137, 21812, 8370684, 28201, 8367454, 8372856, 48251, 8359422, 14640], +[8368834, 8374515, 8350308, 29722, 4971, 8644, 35754, 5070, 38801, 8370098, 265, 1386, 12325, 39777, 8379675, 18995, 8368199, 8374940, 8373476, 8360556, 8380226, 8379921, 22073, 8372646, 30402, 34693, 8345427, 37780, 13948, 8369553, 21065, 18234, 11816, 3565, 10027, 4217, 8355070, 7122, 25802, 8343519, 23311, 4637, 14515, 8357996, 8366406, 8354839, 18557, 8374419, 8349168, 25987, 8364871, 28714, 10253, 8352062, 13766, 8364526, 8366199, 8375519, 8341908, 29770, 8365809, 8353707, 13322, 4266, 21664, 18505, 8363228, 5145, 8341280, 3411, 9716, 3191, 8375154, 10093, 8334549, 8363777, 8337852, 16205, 8361756, 8359574, 8362013, 8346580, 7101, 8356141, 1832, 8380250, 12875, 28957, 8372416, 16638, 8349919, 8254, 8350098, 8337976, 226, 8131, 8338546, 8379617, 12962, 8361926, 15043, 8329796, 8359742, 8352122, 8378080, 11187, 8331124, 22926, 11276, 8364588, 558, 8363831, 1844, 10558, 15054, 15489, 1912, 8378383, 8360580, 8365275, 4639, 33276, 8370143, 8344769, 8360142, 36357, 8349, 8361744, 8356466, 8373408, 31436, 8372517, 29392, 11867, 8373243, 56919, 8374854, 9519, 8361368, 23207, 35137, 8365820, 34863, 8363231, 8541, 8380242, 7645, 11621, 8369501, 28086, 8372012, 41324, 18082, 7236, 4224, 8356117, 21087, 8372907, 2017, 8363116, 4164, 31282, 654, 8366111, 8379607, 13895, 32223, 19998, 15053, 8367295, 17444, 1876, 20354, 8341579, 15491, 23327, 6780, 34328, 8365311, 22603, 8365607, 8370115, 8366936, 8363059, 3550, 8366612, 20532, 5959, 13423, 8338886, 16987, 8374980, 23257, 12419, 8370227, 17220, 5363, 13606, 1589, 625, 22666, 8352783, 19725, 8363768, 8370800, 20214, 8378041, 8365409, 8327994, 34880, 8368862, 8363402, 18252, 8341567, 1557, 8375412, 8369100, 8372223, 8365594, 30945, 12567, 8363127, 36770, 22997, 8370444, 11467, 8371468, 3818, 8367548, 8346838, 21317, 8366677, 8360996, 8363057, 8375063, 8372565, 8357603, 10928, 8340557, 8372973, 725, 48421, 8119, 8354697, 14502, 8365750, 5969, 17514, 8361373, 8349170, 8374747, 8370906, 3977, 8352050, 3810, 8367978], +[8375776, 16989, 7397, 5468, 8373164, 8375896, 26559, 8378494, 23824, 3957, 11407, 6912, 16638, 8364137, 15498, 3960, 8372629, 5327, 17166, 8373051, 9520, 8377568, 17458, 8338402, 8376448, 8372740, 20510, 15841, 6536, 8372224, 8363969, 12133, 13095, 8796, 22096, 10008, 8378198, 3842, 24842, 19336, 30643, 8701, 24753, 4254, 8372979, 62951, 6235, 8352742, 8357710, 8365253, 26958, 8377871, 8379036, 8374541, 8371263, 9792, 8372901, 9469, 8348115, 34066, 8362846, 31211, 20349, 8371262, 13716, 23290, 14484, 7993, 8344719, 14944, 8377312, 8353805, 27529, 8376781, 2384, 2380, 7395, 18474, 8366791, 8380045, 7963, 8360298, 8865, 16367, 8378123, 468, 8370481, 15144, 8365827, 3783, 8350119, 22604, 8588, 15394, 8368289, 8360901, 8374042, 38849, 8364430, 8370837, 8366163, 21408, 8363185, 8366297, 8362282, 16472, 8358286, 15261, 8367362, 8363633, 32563, 8372054, 8348018, 11294, 8343642, 39834, 8356892, 8370075, 8339813, 8377070, 8363583, 1216, 8379653, 8379411, 8358859, 8363705, 9654, 8058, 8357201, 8367626, 8365547, 8373188, 8074, 8352711, 19168, 8360527, 8372269, 8361069, 8370667, 8370190, 31470, 8338331, 14257, 15320, 2920, 8379237, 8380049, 8376159, 1025, 8362348, 16577, 8363256, 20769, 8377443, 8374869, 8363049, 7534, 4684, 8379001, 8374213, 8370975, 3449, 8370036, 8356152, 26201, 8372560, 28462, 11030, 8369309, 8350074, 22541, 63159, 23904, 8360972, 8356050, 996, 8368427, 7772, 8847, 1266, 6526, 12391, 8370287, 8342244, 22552, 8366853, 27424, 8360350, 13868, 8362524, 4975, 4253, 20233, 8370888, 9592, 8368007, 11155, 14034, 22958, 27969, 8081, 8369704, 25157, 557, 42911, 9871, 8372801, 8372280, 6310, 15805, 1765, 8375981, 8378889, 1805, 8373876, 41743, 8364325, 2262, 21368, 8375536, 8379423, 7335, 9916, 552, 8349404, 8374010, 8372059, 30363, 8347585, 32579, 8360903, 8377825, 5961, 9787, 8358149, 8374904, 11307, 8379679, 8371166, 16662, 8362735, 8368178, 8376490, 17309, 8347042, 12067, 854, 8377244, 8355431, 8367327, 1914, 12320, 8380356, 6403, 9725, 8351679], +[23043, 8328468, 17354, 8369712, 8374774, 8376506, 8369181, 1846, 8361335, 24315, 8357851, 43214, 6245, 11791, 16816, 8377767, 49429, 8362969, 12919, 14778, 18141, 3990, 579, 8379075, 8360765, 8368671, 8368376, 8351375, 952, 8358515, 31711, 8377352, 8380399, 9571, 2827, 8378932, 8361955, 13342, 8378465, 4904, 8379779, 8364032, 2235, 8375831, 8372452, 12755, 8367582, 8372977, 8349258, 12397, 8367031, 8369652, 8366018, 7450, 8372907, 1449, 7361, 8352824, 8360345, 8353331, 8376271, 4370, 8373347, 36394, 8956, 8373934, 12106, 8368425, 13983, 8357608, 8048, 8377143, 8376898, 974, 8316073, 8365700, 5138, 31000, 8368771, 29927, 17117, 8373913, 8374013, 8359946, 12665, 8360929, 35766, 8355032, 13105, 11810, 624, 8378451, 8370187, 6650, 21145, 16543, 8369015, 15508, 8364044, 8379243, 7322, 8355299, 8349393, 8487, 30006, 8380361, 8364891, 8379494, 8329919, 2860, 3379, 25611, 5853, 9912, 6958, 8351541, 6647, 2101, 24279, 27949, 8372686, 8376638, 8365830, 41620, 8375943, 8378437, 24993, 8357557, 34776, 8365945, 8370549, 8380218, 8379055, 14128, 8366734, 8376457, 8377725, 5258, 22291, 8357143, 2890, 8369182, 15752, 8373859, 20872, 16014, 3501, 7999, 8368052, 5397, 23856, 8363195, 8361002, 8354107, 18339, 27966, 2923, 9227, 18712, 8353040, 8345599, 20644, 8347273, 8358821, 8346722, 828, 8353746, 3847, 16229, 20674, 11558, 13611, 8370733, 8353776, 7909, 8372096, 8365277, 8358543, 17203, 20391, 8363554, 8361717, 8366402, 35719, 5028, 1129, 2704, 391, 8376810, 6684, 8362956, 8373068, 53764, 23755, 8357823, 737, 8357756, 8362108, 8361808, 20554, 8379354, 8380332, 27012, 8373234, 8717, 6521, 17475, 8372213, 3060, 30542, 8378486, 17516, 8359397, 8379857, 8353146, 8371359, 8376195, 8378342, 11111, 11102, 14583, 8364005, 8374449, 12905, 11941, 22571, 8375436, 8378210, 4154, 4179, 8379237, 307, 2402, 8377666, 8322, 8373128, 14707, 8372917, 30510, 42, 8360225, 8377762, 8373500, 8375904, 25827, 8370530, 8369207, 8361496, 12632, 8379707, 23945, 8379175, 4676, 8376398, 8360196, 8374940], +[3660, 8347788, 8366270, 2584, 11236, 8362345, 8359382, 8348216, 8371047, 1880, 8366013, 13231, 8377016, 8368561, 17762, 8379779, 15292, 17228, 20880, 13061, 8361078, 8377366, 3605, 8352884, 8883, 12665, 8376418, 8348816, 24054, 8339385, 3847, 20622, 8366613, 8373310, 8364798, 8362370, 8343959, 12703, 22461, 8371647, 19829, 3141, 7806, 585, 15454, 7056, 8375804, 8365230, 8370490, 11330, 6932, 8379624, 33993, 8377688, 8358405, 8367392, 8361241, 8358410, 8372367, 5001, 8374831, 8332539, 8373592, 8371859, 8365599, 8369309, 23472, 14978, 8358969, 26924, 25170, 8363072, 12441, 3311, 26109, 4862, 27757, 8372224, 8377635, 19526, 8380409, 8358443, 8373199, 5780, 8940, 22204, 8367241, 8379192, 9872, 17769, 20573, 7113, 6298, 6649, 29103, 8351458, 8370747, 8370279, 27587, 8364800, 8362328, 15478, 32597, 34573, 8378979, 4677, 8372151, 21656, 8360275, 8372985, 8361354, 5572, 8809, 8355076, 8372458, 6842, 8357964, 10786, 8374089, 8360221, 4221, 22388, 8368262, 33539, 31325, 26981, 2843, 8367042, 2211, 22244, 12334, 8019, 790, 4539, 8364846, 385, 8374105, 8357238, 8370429, 26520, 8360337, 8379576, 5420, 8373339, 6799, 17496, 8335996, 21444, 8366088, 48654, 12809, 6077, 7714, 11283, 5988, 8379119, 8374533, 8378365, 27604, 8343323, 16908, 8352117, 8362121, 15862, 18305, 8357587, 8335074, 4607, 8360449, 8368318, 8313426, 269, 18298, 8354295, 16953, 8365096, 40268, 8490, 8358403, 8364368, 8357243, 9595, 8368061, 10903, 11357, 8369946, 8376544, 8376274, 8374459, 5833, 12252, 8368303, 8350485, 8374386, 8346021, 5436, 15158, 13983, 8374710, 4490, 8365068, 8379302, 26726, 8369943, 10687, 11810, 8121, 8376976, 8349098, 33657, 8379533, 17648, 8377545, 8377278, 1613, 8370531, 8361838, 8358564, 13112, 8356579, 8378209, 8307300, 24467, 8360376, 8366128, 12779, 8349840, 32497, 43854, 8374287, 15115, 1114, 19394, 8375214, 14262, 8340658, 8365127, 1539, 15179, 8370580, 4663, 12062, 3270, 8342901, 17838, 8367970, 8374001, 28003, 8357281, 3870, 21699, 8357900, 17958, 13094, 20905, 22619], +[8364283, 15710, 14233, 8345704, 17454, 38350, 6158, 22349, 8378192, 8371469, 8363373, 2381, 44641, 8360743, 8377053, 23441, 8369956, 9015, 8357561, 5853, 8364506, 6091, 7142, 8369990, 4074, 329, 37038, 8365330, 6274, 8367946, 8375545, 226, 9138, 8368021, 8376137, 8368001, 15198, 14038, 8367107, 20600, 24040, 8367544, 749, 3411, 8355540, 8352625, 9910, 7779, 8376963, 8366700, 8375158, 7368, 10091, 6143, 8367382, 8355012, 13372, 8337108, 23558, 568, 22986, 33069, 23285, 22777, 17892, 8364953, 8379415, 8372088, 8370569, 9189, 8485, 8373729, 5848, 8359640, 8367844, 8374177, 8359859, 11098, 8374771, 8352676, 964, 240, 773, 4665, 15290, 8377175, 15567, 8377718, 1286, 8378391, 8359511, 20770, 8354531, 8366201, 8374738, 10856, 14111, 4024, 8352327, 8352347, 8359918, 15880, 24913, 8377190, 8360925, 4070, 8368032, 32120, 8367698, 3898, 8364356, 10606, 1227, 35420, 8380209, 6022, 17076, 8379011, 6184, 7065, 8354795, 16242, 8366410, 8342762, 8367078, 8357851, 28728, 1872, 8376932, 14481, 8359629, 3744, 8353636, 26142, 2516, 8160, 8379842, 8379662, 17444, 4560, 8372783, 12397, 8378252, 8370524, 8373773, 8350921, 8368168, 33886, 8375322, 8368647, 8370691, 16384, 13108, 7362, 7719, 8348079, 8367583, 8353194, 8379704, 8374088, 8359855, 2914, 15357, 8375097, 9876, 2044, 8355826, 18330, 8359416, 8366977, 8372760, 8347292, 18583, 5895, 18667, 24301, 8376735, 26207, 8377341, 8364262, 3179, 8372366, 8361418, 8365560, 16572, 8372935, 51519, 8359442, 7859, 8355856, 16219, 53, 5040, 8345849, 4315, 8379747, 8371616, 23016, 3090, 13843, 10946, 8367668, 8374339, 2172, 11592, 8380367, 8349398, 9492, 33600, 8368815, 3829, 18567, 8377493, 8352997, 8380374, 8335980, 3533, 1743, 40697, 8375294, 10758, 37899, 8363236, 28747, 1069, 25013, 8364888, 39150, 4220, 8376982, 8355247, 21568, 5469, 8353281, 23605, 8373698, 8365753, 8363236, 8369613, 8369907, 8375322, 8365032, 13463, 8375325, 3327, 10195, 5496, 8347704, 38849, 8371465, 8353086, 13695, 17565, 21083, 10948, 2702], +[12980, 8972, 8379345, 2516, 49433, 8361205, 17381, 10909, 8369195, 8376516, 1389, 8363797, 1473, 8333587, 9154, 8373716, 8372836, 34065, 17607, 41729, 6208, 8350734, 8536, 5723, 415, 8377425, 8375875, 20369, 8351485, 17972, 8370679, 11069, 11975, 9528, 8349683, 8281, 8372153, 5044, 8377599, 9229, 8380265, 3093, 13606, 11612, 8372632, 12123, 8372563, 8370091, 8372697, 8378930, 8374875, 4605, 1712, 8361077, 29273, 8871, 8471, 4512, 30057, 8361131, 8360254, 8366388, 7138, 27784, 8359246, 12501, 8358659, 11913, 19754, 8371330, 17725, 10164, 7376, 8359686, 8988, 21452, 10307, 5720, 8359072, 11283, 8355920, 28371, 8369357, 8364465, 8360299, 8350, 8377580, 8339135, 7577, 36625, 7797, 8375961, 16086, 10099, 11779, 8364473, 4032, 8348776, 10076, 38014, 8361418, 8758, 16176, 8354615, 24051, 8359065, 27457, 8369765, 8356985, 10137, 8363646, 27994, 8379837, 8377901, 8364199, 21166, 22384, 8371033, 8361615, 8347810, 8375946, 8372810, 8366163, 8346938, 26254, 25116, 8691, 22029, 2439, 8364766, 8356883, 11135, 9709, 8357533, 8379416, 8362578, 8379720, 2002, 23357, 8366918, 8372065, 13278, 3542, 8364740, 8350825, 8349128, 12013, 8357475, 8358793, 8362041, 8367793, 8370344, 30910, 8372015, 8367755, 12061, 2573, 8366568, 8352081, 7412, 15494, 8368981, 35084, 8360080, 15064, 8351398, 1325, 401, 8351000, 12281, 8371132, 400, 9098, 8377348, 8370987, 5689, 8375852, 34486, 29649, 1376, 8372664, 8371015, 16155, 29611, 8375476, 8359792, 8365464, 11457, 17602, 8366994, 8372234, 40370, 6114, 8354346, 8476, 4890, 16368, 25539, 8360477, 8367138, 8282, 30224, 8366378, 8213, 13627, 4866, 21718, 22438, 15478, 18037, 8374449, 8379841, 8346739, 23601, 7217, 8380047, 2799, 13869, 8374871, 902, 8378933, 8353946, 1406, 8348721, 8348879, 8372236, 39439, 25162, 6883, 8373320, 25939, 16440, 9102, 16509, 8371937, 8352726, 37059, 8362535, 8361319, 2687, 8363871, 3639, 13765, 8374411, 12453, 8371457, 8365260, 17690, 8377558, 19175, 8353863, 16119, 8364761, 7238, 21270, 8347390]] +w - cs2 + ct0: [[8115182, 4584254, 1456594, 318974, 2392868, 437626, 4248392, 1906196, 3854317, 1310839, 8169526, 5329554, 811415, 2508157, 5411060, 6210242, 7326696, 1985231, 7266791, 1255060, 6127057, 3612253, 1379919, 4607302, 786513, 2095880, 5810147, 590784, 1925511, 7434207, 6840272, 2441956, 3813937, 871312, 1348051, 5675432, 7060989, 5869070, 3184814, 3760206, 5777905, 7969041, 1210679, 172481, 7955689, 2849073, 8183073, 737957, 1250935, 5146020, 5820482, 5686307, 7485078, 5253642, 4009269, 6431866, 6180493, 5084857, 6398755, 2584820, 189709, 2748965, 8106614, 830092, 8079216, 3076047, 468376, 6680088, 4292203, 1129035, 4678077, 328017, 5508030, 1920535, 2551406, 4487310, 3853790, 7546535, 1164956, 4315103, 3178994, 6332837, 2806173, 7571120, 8124416, 7450127, 4974094, 8053012, 5707184, 3280118, 2001910, 4959375, 4519567, 1291604, 6178308, 280004, 7180861, 6673594, 2014002, 4161162, 7468709, 4314678, 1387785, 6903444, 4973667, 3281712, 5649095, 4410320, 2148710, 5518882, 6170897, 1004352, 8140437, 6441590, 8054512, 7264142, 1691287, 2108462, 5189417, 982031, 6903389, 4076459, 1545007, 1864449, 1431991, 876109, 8279822, 2896808, 7619169, 2137610, 7059222, 582931, 8325546, 992740, 7148831, 4654147, 890297, 1253555, 1729303, 7802844, 5464889, 5881853, 3229531, 5291140, 4862431, 7375050, 8035675, 4538432, 3775801, 3364413, 7954477, 6178507, 2774628, 4730385, 2395884, 5696067, 2147180, 3017677, 6061047, 57643, 8241555, 870836, 6984464, 2958199, 4862500, 7614543, 1130472, 6127694, 3599954, 515298, 5140375, 5582055, 5341246, 3557272, 757453, 3543528, 2897568, 6327234, 716062, 6878713, 5915496, 7711787, 7104851, 318142, 6438286, 1603617, 37083, 3135665, 1356375, 3956472, 7368754, 385039, 1020997, 5458654, 3995669, 3434390, 1010244, 4737333, 2919070, 7378290, 4420252, 2101857, 2264155, 2914220, 1868075, 3169896, 6857705, 3648258, 6417373, 960182, 7044874, 307737, 1732452, 2960527, 210824, 2171518, 175015, 246211, 6004565, 5926387, 7559889, 6441312, 1121656, 1348552, 3398018, 2812626, 8350006, 5146994, 5573573, 1332525, 1974252, 7221111, 205344, 7737260, 4432203, 1760022, 939627, 720288, 7434383, 6418946, 5396016, 2683757, 7900384, 4893046, 2545060, 5287221, 4382836, 2067579, 1536739, 4011806, 478100, 657049, 599680, 5381345, 4910883, 432554], +[4295370, 281930, 1047382, 5920939, 8246850, 2397368, 56355, 5910900, 2893094, 4595820, 3017480, 2434127, 2051703, 7804097, 3565568, 513049, 2633381, 374813, 4758662, 4497962, 5036966, 5907798, 7503941, 4849106, 6242204, 1638830, 5594748, 6313329, 3447801, 921883, 5000109, 6490573, 1072903, 6534539, 157451, 4098570, 6643224, 3995181, 6584105, 4692157, 1128321, 3185186, 3445339, 6879354, 5153961, 2327986, 1611191, 2876002, 722730, 6382907, 7666984, 1215963, 7706662, 1570628, 2095549, 257552, 3407752, 6365277, 4530073, 1285553, 7518450, 7081810, 273617, 7756913, 4044755, 3969667, 3533540, 5288111, 5837573, 7152855, 6528386, 8336326, 1428316, 5929183, 4997064, 5950020, 3390497, 6243342, 6805477, 743892, 270149, 3317490, 570347, 2451414, 2324234, 3914270, 6288041, 4146189, 6572027, 5676407, 357352, 2952235, 6326214, 6006349, 2212540, 6513325, 7099957, 7452053, 5641814, 7885239, 5331448, 4528272, 5787898, 5832359, 6133166, 7656250, 8033776, 3301245, 5108217, 1199684, 931943, 7375089, 1913501, 7463278, 1227565, 6972527, 1905021, 4415592, 1275050, 1461367, 7741393, 2415541, 5420727, 2765759, 6492086, 614540, 7126244, 2759101, 570792, 5576850, 7311163, 2592246, 229127, 3783282, 2132865, 6491416, 5342184, 53441, 604703, 7591756, 2320125, 7956238, 7744851, 3669095, 2166615, 304581, 1952641, 3688694, 1055841, 6792088, 4008459, 1871376, 4226837, 4213708, 2043732, 6120125, 2609511, 3625014, 4747872, 6994641, 8131099, 6960870, 5889639, 4210421, 5651457, 3130388, 2708750, 7171540, 7434728, 3572935, 4818606, 5206988, 5672864, 2304827, 7751429, 2040666, 3740972, 6966682, 7085710, 6244676, 739363, 6444833, 1559531, 7686052, 6417103, 570397, 2558770, 1076297, 7043917, 3785717, 7751939, 3387491, 7330918, 1212155, 7247966, 3650040, 7588387, 6133221, 1597131, 1169190, 2484586, 2414321, 2151430, 3950727, 6027161, 5643354, 5362009, 6077363, 6311114, 7440271, 6337577, 1583731, 295410, 3377575, 3707299, 3968335, 2999409, 3484094, 1641603, 3378599, 2429881, 2317354, 2586390, 3872475, 1242106, 4436469, 4704842, 7176757, 4913834, 5594817, 4054489, 434827, 1174534, 2027450, 896003, 900628, 1064218, 1992215, 723904, 487061, 7999617, 8022884, 3890367, 3098245, 7794445, 7323605, 3426595, 3694785, 2535905, 2740147, 6115944, 112592, 5366006, 5078797, 2140767, 5324795], +[4651030, 2691190, 7327817, 1284813, 6450471, 4708657, 6581520, 4053488, 6817878, 3698213, 1246566, 7037079, 3154772, 228525, 755128, 296036, 2342144, 4217724, 8298858, 187882, 5105305, 3922484, 1251927, 7499993, 179941, 743005, 3779132, 4264580, 547183, 1667048, 7653968, 5177312, 7525103, 8332871, 3997358, 2656187, 6182571, 7388130, 6442409, 2665317, 3415963, 5088892, 3888933, 5280046, 8263264, 6119307, 2708181, 6767047, 5620417, 1685641, 3494634, 3239675, 2872783, 5061722, 6891149, 8029545, 8291738, 561746, 3779409, 3189354, 8258762, 154194, 3847848, 3555159, 5426214, 7419821, 6377058, 6727992, 7167326, 5787635, 4245526, 5999813, 1686357, 2992562, 3693396, 2104026, 2295581, 8056628, 5100689, 3882571, 2473966, 6220203, 7931880, 5331565, 2254079, 2466857, 2651710, 4988607, 8215439, 4507804, 1688205, 3653698, 2976092, 1440316, 1182582, 1168641, 1826771, 3230919, 3441893, 1101679, 1741980, 5586643, 7293264, 3416903, 8124754, 7463289, 3737342, 4352418, 6341554, 515960, 4589717, 5016848, 1878967, 958660, 3377725, 6071916, 5735605, 5994864, 4734481, 5234509, 3152143, 1991700, 550725, 473828, 213848, 3815751, 1836339, 5781055, 2683682, 5734515, 6871489, 4381300, 3574621, 8286255, 5052919, 5677447, 2257195, 4553268, 4614540, 1635921, 1948587, 1381270, 7204911, 6709284, 2722387, 5759771, 60295, 4773427, 4502635, 4005266, 5862805, 1270491, 2726212, 2965304, 1217055, 3843292, 6735683, 5224025, 6968165, 3494444, 32556, 2118125, 6244818, 5312139, 5900852, 6920771, 3552947, 2516412, 6187141, 626249, 1589123, 137732, 1595535, 210781, 6744704, 2196537, 2875143, 3163896, 2057501, 51582, 4462016, 3124088, 3332264, 2426508, 5015414, 690523, 495620, 1868044, 6873152, 3870383, 5511700, 7214843, 619622, 4861785, 4013238, 164379, 1946546, 5826750, 6386615, 3978184, 1036115, 8186386, 4838397, 4824307, 1429711, 4577770, 3792885, 474702, 1512796, 6729983, 2870054, 5071503, 394814, 6088272, 4740778, 6254579, 1062145, 5728100, 2795670, 852606, 4120111, 125995, 7399216, 7945421, 5641396, 6337456, 2702982, 8186540, 5155249, 1162510, 3862144, 4899778, 6224497, 4989535, 686274, 4191635, 7939834, 5399060, 2991063, 7588076, 4675285, 2505494, 8322951, 3574611, 5336558, 1392186, 998554, 2329065, 5923162, 3329491, 8237180, 1290309, 4170391, 4738752, 5779774, 2262934], +[6340453, 7315075, 3359383, 1616816, 3054029, 5153922, 7922214, 1643996, 8153550, 4057122, 1447618, 6135936, 1107654, 1195713, 6270297, 7280088, 2208312, 6312377, 1881218, 757599, 2439408, 7831157, 2175541, 7790606, 906428, 1512188, 3483607, 7693285, 6900807, 5673223, 4558909, 4154332, 27542, 4717456, 4053986, 1442666, 2641964, 971957, 3274566, 3599111, 2013446, 479, 1380600, 1433419, 3804735, 3407993, 3666040, 1969287, 4250599, 2419597, 2353100, 6642082, 1502119, 7433977, 4979138, 6206371, 844107, 4104663, 210592, 3357719, 5080053, 3111697, 1617464, 7512987, 6839552, 7879852, 1958173, 4300713, 5854826, 5364669, 7787943, 1477359, 2924804, 2586124, 2048836, 608143, 6798478, 4937193, 7953761, 1446743, 3349846, 4665877, 4804122, 7067241, 6251013, 1087161, 5130560, 3285781, 6088005, 2222251, 5328422, 2551466, 6465548, 1721891, 3258317, 466462, 7499583, 3081325, 7407562, 1675231, 1452227, 8114709, 2495259, 6753011, 5303119, 8050596, 1039389, 3673417, 6826677, 5848792, 5111807, 5911429, 4627270, 2468894, 2451072, 6975982, 4673919, 132181, 2239259, 7315112, 8001825, 7715158, 5601294, 4805596, 7836490, 4727247, 3332108, 3210746, 4867764, 7612073, 4600072, 1850236, 5130577, 6830263, 371642, 1675854, 4757089, 8281802, 4759109, 5491146, 3039913, 3500029, 2804379, 7678372, 531218, 2397715, 2440564, 3681616, 7105041, 5599111, 1127830, 293131, 7258008, 6678265, 5364232, 7472158, 3610564, 1576483, 13007, 5921681, 2220281, 2719616, 2062097, 2609170, 4716990, 7701818, 7073368, 1072604, 7688340, 6789979, 2860692, 6146306, 1775708, 6553823, 3892983, 205769, 3632822, 2875275, 7397806, 4736577, 1100256, 5186227, 4474231, 1872039, 7041509, 5223657, 5442584, 23815, 217898, 5109958, 7407554, 2667321, 7098650, 6942203, 1898029, 1417448, 7085323, 4546010, 6429306, 7476595, 5718976, 4478849, 6369183, 1111526, 874598, 6201983, 6750976, 8153367, 2883607, 6557936, 7157958, 5117465, 4861657, 5029202, 6614297, 4244991, 5426990, 168841, 894355, 4260224, 959547, 3101140, 1403938, 6792716, 5256928, 5310071, 1320887, 2810115, 2206215, 3613162, 659754, 5043190, 5964960, 7583625, 4800922, 5846153, 4898991, 6956726, 1173357, 7361274, 3941335, 2713549, 3938253, 1687500, 1259988, 8165302, 5797901, 1761424, 4408706, 4385248, 6762704, 6757093, 6718707, 2419217, 4548426, 3898657], +[1231410, 5799402, 2588005, 1077169, 1494689, 124516, 6788638, 4178258, 6618374, 3048830, 6980123, 3242353, 1966138, 735134, 1846284, 8127395, 5306237, 5313157, 7272880, 6198297, 7803719, 6745830, 1978089, 6727664, 643816, 3728840, 2644771, 6101404, 2964587, 3369413, 1211421, 4659561, 6194956, 2985315, 3970109, 451670, 6166790, 2920456, 3067083, 1552258, 5600207, 1109101, 7197317, 5173911, 7860800, 7910001, 2478816, 2483471, 7982961, 6918536, 3330095, 3700342, 1096244, 2989692, 4438737, 7969514, 2354835, 5355891, 3486151, 5016797, 2041633, 1240887, 3951791, 2749355, 2565588, 7488752, 3767764, 5345483, 5884024, 7132736, 7784658, 3489239, 2352119, 3437836, 5374957, 6088613, 1413954, 5939988, 2520595, 5035296, 1032887, 3853376, 6064933, 6513586, 2306290, 946769, 4875335, 795652, 5873622, 3324543, 383845, 8090963, 408474, 3904245, 4171234, 1503834, 5133458, 5951297, 7271812, 3252482, 7108368, 2722879, 2861677, 1976595, 7110259, 2328228, 7713263, 4367860, 1147825, 5516493, 2836804, 6066412, 2247687, 5217763, 6088767, 4245211, 3185977, 4577021, 7036962, 5669126, 7869534, 5810781, 2061533, 3024496, 1770346, 2170976, 8351802, 2919982, 4651915, 3491002, 8161510, 4225944, 2006497, 5384023, 479178, 3567617, 3980342, 4385573, 1058575, 5628011, 5756818, 3914002, 242516, 7694345, 5825945, 1538675, 1580777, 4430581, 4809368, 14735, 2870926, 4439207, 3339389, 5971994, 1498237, 7035035, 7650460, 867388, 1713359, 7747326, 1767332, 1362983, 3991968, 3111800, 4716020, 1938720, 7047473, 6005890, 7313876, 7980679, 2785223, 6228952, 3606415, 4429731, 581532, 7336315, 5274324, 1897136, 3403760, 7656980, 8328023, 6959192, 8373095, 707783, 8170302, 5194613, 3062450, 1305812, 7338104, 892587, 7352847, 6947592, 4978977, 8251816, 1444621, 2294710, 594809, 4396572, 2878411, 8274079, 6930968, 5703215, 6001949, 3235644, 3092092, 5875240, 1490277, 2670438, 156762, 4075851, 4811455, 2216788, 6655240, 2475938, 7063834, 6762482, 5775277, 5947792, 6261766, 773642, 1753385, 8359696, 436933, 6692998, 7853074, 7667883, 4207157, 2828140, 4976068, 5733876, 1470853, 969365, 4162188, 7840195, 3169231, 4601061, 8259224, 975527, 3417637, 7687625, 464756, 7516533, 2476912, 4967155, 6922121, 7148924, 6766926, 1958170, 1921562, 4043720, 3089422, 489863, 4883797, 7947441, 5594011, 1241508], +[7120288, 6630519, 6638351, 2985520, 1972209, 3703847, 55422, 4920852, 2643574, 6744197, 7135584, 1681070, 1910971, 2414583, 1791029, 6785535, 6792563, 119981, 6574179, 4765489, 1764447, 6009442, 5817331, 7496057, 4927202, 3072279, 6009325, 6999339, 7814485, 3317200, 7412511, 7886915, 7483713, 3519797, 7957743, 6094966, 8123794, 5252851, 173021, 2977769, 8095056, 560015, 1045179, 8069473, 4684433, 7895055, 1842990, 5986220, 593555, 1751164, 2954444, 3046916, 1790076, 6798165, 1624632, 1386930, 509290, 5794851, 5043716, 2905335, 7025412, 6311083, 2372723, 872115, 4703505, 7804133, 210054, 3738128, 7437903, 7377035, 5189163, 976763, 1044775, 5566001, 4930822, 5472487, 1770546, 7019868, 1414168, 4926949, 1558080, 268413, 4632590, 5150715, 1425905, 6707376, 279759, 3170771, 2864577, 6606900, 8179879, 2432929, 4430917, 504768, 7749528, 8312150, 2019701, 666853, 4432796, 113248, 2832884, 2551174, 4806929, 4983760, 4925375, 1672198, 5292516, 4434736, 5049615, 5474496, 4163481, 1385852, 7345470, 607657, 1583979, 782617, 17384, 4361001, 6869381, 3939499, 1225289, 7043149, 5300446, 5433726, 4942410, 7894569, 7726976, 4708429, 3819632, 3225587, 6371368, 238018, 2949728, 5556515, 1838800, 1479109, 1968276, 5957041, 1030713, 2715818, 4319601, 7360143, 3966561, 7620326, 7071608, 5249829, 6095062, 6439450, 6659933, 6279237, 610003, 3951823, 5356161, 98784, 7483793, 872398, 5344875, 5892461, 2902228, 2538083, 7042765, 8189515, 7836324, 7657131, 6926646, 5071770, 1198930, 965522, 5320984, 7643155, 6384420, 7407387, 5508208, 3541356, 7530236, 3422362, 7626208, 7415686, 2325582, 7805630, 6351082, 2384280, 7017750, 8163298, 7332601, 6215178, 83134, 1461519, 2846742, 3398022, 888501, 8275929, 7990903, 8177286, 1055018, 2951442, 1483179, 1658923, 7996254, 2601955, 13376, 7379554, 373332, 7704351, 5704917, 4890531, 4689623, 18485, 6402771, 3579286, 4712985, 4962852, 3716203, 1089163, 4098571, 1771359, 2408039, 6980226, 4188044, 2749354, 7777099, 8184790, 1595180, 5011005, 2284427, 7905264, 7381347, 8047574, 4574221, 4987271, 5350779, 7809147, 5779924, 904902, 7070593, 7800604, 1330807, 1514506, 3680853, 1492999, 3510291, 3132378, 1393801, 4243180, 299171, 64800, 6531866, 3976505, 4644733, 4916686, 2064398, 4970084, 7019883, 8064311, 5016993, 2701475], +[8148699, 4475888, 5522173, 1085602, 825264, 824859, 6056887, 6561652, 8232357, 5470714, 5127020, 6347680, 5944623, 7955865, 3614075, 4692673, 667222, 4269796, 7978318, 2001113, 6476981, 6796010, 3879466, 6979019, 5475477, 2985496, 1827104, 2031016, 1765184, 6478372, 3124284, 4224096, 5874071, 7050106, 4612129, 583163, 7185257, 1020513, 5630289, 7607029, 7360648, 2925798, 4685348, 5501700, 3165828, 3790965, 1662141, 7405842, 5293985, 4440335, 7549553, 5375197, 5200899, 5295638, 3715277, 1286638, 1539216, 6937785, 3667318, 8308592, 3759094, 6167055, 2047208, 4992707, 7820630, 5430265, 7907704, 8230815, 902900, 8350087, 3518170, 4664124, 3128785, 5224494, 112377, 1560474, 1012250, 6107240, 96312, 4001689, 6453425, 3824978, 582942, 5064868, 5894807, 1600316, 4951897, 3277030, 1413186, 110752, 847151, 5210336, 7091751, 8255853, 8011664, 5785793, 7029785, 963233, 5242721, 3622236, 214026, 3227907, 275503, 6079735, 5780031, 976457, 2908789, 687000, 7916743, 7177882, 4525957, 6041122, 69729, 3514686, 6879689, 2114744, 4258451, 3257229, 1424208, 1044425, 6851158, 2209899, 7125507, 1898979, 329091, 5555942, 2357927, 3499915, 2061214, 2383277, 341026, 6473006, 1517206, 7108619, 1099756, 8019608, 615383, 3353007, 1436611, 4912105, 2682038, 1352202, 2727827, 6641373, 7231017, 8259128, 5418246, 4816277, 622134, 1909072, 5681784, 5392439, 4814064, 3551053, 6752740, 4792705, 7046280, 2550849, 4014239, 1935687, 7470562, 7761636, 5326415, 1939597, 3590434, 2330862, 4721673, 535247, 6287470, 1809678, 7243219, 4659852, 6706467, 7807331, 1599434, 1542686, 4842699, 962363, 2549995, 5928596, 1786840, 5322131, 1459747, 6077106, 6092980, 2993716, 7679550, 4699407, 3851461, 4374641, 6917820, 1516795, 2753689, 3519821, 2297439, 4353421, 7576042, 6087467, 1396828, 1720610, 3117543, 8053413, 7997066, 8226460, 7678640, 3565340, 3019896, 1264799, 4020844, 5573615, 29068, 1131281, 5563998, 4233187, 3316092, 6174100, 519691, 1297846, 3149871, 3080831, 6956233, 7068779, 7361037, 2532858, 5170842, 8342835, 5684376, 7029442, 1074944, 2865899, 7130720, 1501687, 3787095, 5860976, 1646867, 4730592, 4072847, 418544, 8156927, 1916269, 456768, 2647131, 7359430, 2231905, 8233873, 2712221, 189035, 750601, 1511841, 5888895, 1278381, 5894115, 224109, 4725215, 3375474, 5167934], +[2163297, 1765010, 7613218, 7133907, 2762516, 5705325, 738989, 1517741, 1864787, 1364733, 3153514, 1760283, 8103527, 2120947, 4467473, 3788122, 4222068, 8095111, 4229439, 5799483, 7749991, 3572134, 5027685, 7636134, 6768714, 3133830, 8181894, 6330897, 4597133, 1351399, 1625269, 7206512, 1660004, 883435, 3727532, 1380889, 6955115, 909766, 2693896, 3146895, 6197574, 3439905, 6182851, 7083181, 3644723, 5036616, 3618302, 4930116, 7767708, 599322, 1575888, 6043880, 3657679, 2395052, 794633, 1001239, 5386516, 5919638, 3015585, 671789, 8221771, 7713160, 3682020, 3967276, 2812711, 4221770, 881847, 6319106, 6480285, 707796, 1396292, 8325599, 4530566, 613780, 4425414, 4476711, 2805920, 2192125, 7076635, 1721879, 3151081, 1776038, 4487603, 5035236, 2421891, 7550910, 3339844, 5853955, 1185366, 2964308, 7468902, 7472498, 2741750, 7932140, 2851303, 444620, 3621432, 1612953, 4606185, 1915752, 7262334, 5217702, 704680, 6907135, 4070606, 6314606, 1902935, 4769170, 6923277, 4878253, 6796001, 3642402, 5794096, 6604780, 3237455, 1563366, 7452905, 482894, 3039269, 5211900, 4512669, 5693034, 5079627, 2210264, 7125087, 43622, 1395018, 417799, 5421457, 1484443, 2533821, 1666419, 6049823, 2115818, 3088901, 5762098, 6473634, 5500191, 8363031, 6221230, 5759502, 581852, 3422476, 4360649, 6139698, 7370065, 3152416, 784027, 478130, 778126, 7220007, 6813115, 7383130, 6873546, 8337635, 4113040, 1137262, 586807, 8197271, 1438412, 3616882, 1835146, 6321413, 5282490, 2732103, 5787030, 1378120, 7654226, 417794, 6354522, 2249874, 3036511, 3725400, 3929932, 673520, 3171642, 6475184, 3691599, 1929736, 6268011, 6647549, 5698945, 6708906, 4066828, 4844383, 379689, 2484561, 181106, 2343176, 1297754, 7609531, 3060780, 2058001, 1293844, 889744, 6134481, 5205724, 1025466, 7193368, 2754990, 7575338, 5912045, 1653260, 6304771, 7258068, 5658350, 1636841, 7289342, 6400190, 7247458, 561337, 1363188, 4240815, 4795440, 488182, 7848495, 2257242, 7755044, 1860689, 5697642, 2670527, 2321876, 6514003, 1968374, 4057298, 8060278, 4274664, 2428461, 6498068, 2770310, 1939049, 6285904, 6945803, 7485492, 3964445, 966547, 3789367, 5382694, 5454794, 3104407, 3062450, 6867749, 1362895, 1532032, 8109655, 4815885, 826942, 5649274, 7165041, 7811878, 3453968, 2745854, 1250549, 3162572, 5108426, 5078940]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] +||h||: 60, Hint check passed +||ct0||: 73117, ||ct0|| check passed + +signature: 1C3B7FB47134FC1211A4F8FA16D8F84D642DB8182BBF70D549362A3182E2D313885BE701B5FBA7B2A7EE0B19B04A8F4E1D4B689028B10EB196297F56E75A5D037C89B141FC1CB41436159E014D096B8BDD86CD0946F4D51A02950FAAE06AA28B608F86A3AFE6A423DAB187CAB362176E44C7CF5C33E872D67126D4F7C442EBF493B685C5CEB7DE5C070E2D0656E16455D2A69A750EC29B50196ACA08DA2BA2D4048649FFF5E2923623561456897543BD1CCFEDBF854ACD1B4334C49C67DAA0456B1089B95D83CA8CBFDC1012ED3253AE6A97FEB8E8185D7A5A034F9B6F17ABFEA994AB6BA519FCF7632284056BFC41B69E7763A644D51D5936B235D8797A38657644AD0CDF1FDD05A0F7F36841ABC2BAB1EF0091B9A50B23DC37ADEA38D8791EE9C4728C612FADD4092A2EFEA38AECD6FEA2827F7D32856C6D1D43B0D30DA9DB79F192AD3F5AACF71CFD814E41D325D8D843D0F8252FDCA1279FC4A286063A69305F1342A46148D39580D290B22609B1B5499F1A5A698F62C1B0C1085A08E285E269EC4348494A188FE0F7C761A8C2D33D74831DF8969AD5464B658E9F059C70DC50F4D9FAA4119C69526446D59A46A0482C6ADF363E03887B320CD7502136712806E02067F4D4C2637EDF8F77148F6DB7EAD6EF797D7BDFDFC3438570B7FD144A4646D5FDA70C55352FD4789670F57156A3FAF6BFEEE142633C626E783BCB97AF8350833B159ECF162512CD5851F91332B8477E82D14174F6E52585B5EEC943AE99044FDE73E7D8035FC19D56DE56560DD541AF03999B415A927FC3036D80B4D2C64D03BCE42B7CE8D9863443D0600060DE7DECFF046626095F44A7BFC258DF7CD0C7570F5E06A158A6100CA60CDFB3C6C84029F3CFD1A1F7D355A537EF2F5A8C6FA5D1D8ED7D2FFE100EE943B8E20215F4DB23D5CCF782796BBE524A9A83904B4CB0F74FDAE0444B6D19D91114FC5C8A186EFF80880F7840E53788D334965EFB504695C6E9FECD2CAC50A3ADA9B2150BD88CACD80759066ABCE3868529F475A915D1341062A32C9D7713C8D8B76E9081EE715DE298E6A28EFACCE23B1916667396C4B0DFA3E12D11A5947B38D67B0BEFD14244B4C847FDB72226B3DB2C7AF3FBC5468768DD7849FDF20DEC9E8101A68F9304CABDA527799EDC0F994DE669B1A57E6E1D8D60893FE37157D72B0430530E362EF790CADADD5750FF38A146DB00B7553A2357FDC5E7454068B7694FAEED62454E5CFAEF69024783B5173D5BB761CDA8986A874F02098D93EC135B03164C2219FB39E5712408679147FF71F06B9C5720AFD40AD2561CC88354997066366A464454924B49DB8703EC24F807C5078FF68D9510587B2DB6BC82A6D597C9E2941E92444A7E3B85AA4766605E4C3D726589B35E2CD5DA4EC4288C615D1CF3582EBD5E63C2BBC60F7E34849DBDF734FBA6D4D8F4EF8121DAFD049AF1AAAABE4769FB9CC591D2206051BDCB9C102141E540BE5A4E4242FED93E96F620A02CF02A07E12A5AD8F3C7B6312198AEF2507D065D3614830F5C5441F9C53238EA649366A0EEA00350FA7414C7544FAD497EBD92D512E5CDCBF8C953724935D97C0E1A3079D45A40A54EDD9910E52F88175D0E4FEEFA0EA779404A24AAE32979F0AF3EBADB745B51B09FEC972145AE3EA4E485428EEB4C610120F29E9D94B3E4BB9B468582DAD685CDE5B5A900204C16863C21E1B5059487D772955CC1A74917FF8C05FDF4BBB8CC54CA2D59BD052B23D5ED7AE1A0671AC9713C43D1D7ED55087CE75245B496CA21011C08649471304420DB1142C2733FA0CC8E00AC670514882918A0B93E6969B0FE214B63E0A2F2A9C092E25D5E6870CD9BD98EAAFEC1ED886F64C9798834CABFA10DC8F45A86E89A0CDC301620A6202BED8C6B8F28BDA260DE8FD6CF502EFFF40F88E1F44786C2A062BDE1E44B237BF8BF5206E7890591A9E09B6AE196511CA444717E6A76A005A55F5866F010D79110A8F98217BAC2A2055883392ECE9E5B5F423F6EE28FE1F88370DCEDE6B3EFFD93A427F31AE8AECD8FBA6559ECC8E23C595147AF5DEE50E4C938B6D3D19E02181260800D5A12DD883F186C94061068E3BBC1D7366259664ACBCE927587A20F4BD80A67F72BDF405DD5E4F04679D916D5BA984CA51461EB33E0626CBA8FA7FDD6B3DBE15B21B776B18F6C7B82328486CC2644E9C6040B6F8DD97772D06944B7DA8B86E3876C2FF14C5E995D61F19FECCDFD79BCBC159986003C77961DE9487FDEFF065D22C639417C10DA0ACA253B9025663E54135DE4AFA0DB7A0D5AD1189D94DF24D6A71CD5A7858D48C242A7A7E3AEA8D67174B444791E2F43A4A081A99F9AEE0CC2859C0855326E2036B1FDB89D8CCF00AF787B459AA6049BC67FB54D82243E4F58CEE58E9255DEA3D5C2254378AFEB290FE78630A9065937873498B350526943DE231F5384EA83E98E2317E013C487D57EC50D1C850F83B272437BE365CA11F1C94C36F6A36DD99418287D0573440447AE18F6327AB2CF8F81CF93AFB3D09F6D814BF007740307BF22A54FA24B3D9155C95735B22FBD66B6A63DF6771904EA8DA54B2D4BA8477534065BB20B5653015BB67EE514EF0EF4EE07458B4196884C1132927540C3EB78C76E795F433EC0B43D544FB6F28006E9E49C79FDB9181AD5761E111346657E89BE1E2F89A3972C20101BA1F7F63C92FB9F299597AAAAD2C6108BC5D314927D4EC1D395F1B3BA859453A7E292CA8F0D50EC63A53A9E40248CF779CCDDB1A17710F98041FA9DC793E0EC53AC6CEC4286B891AFBD6D41D67AA630DF94818E56AC934FB14EE8C43C2B3893D01A08BD85CC69230FF416BA50CAFD3FD7BCE3E7A16379CD0F7E5AECD4B39B856D4720E8A0410376DAA35ACEF23A13043DEFD5EFB8FB210994B62E8088294D2C7497F942ACF47F1A1019D9F12041BF3AD086115282C1989DF5A60267647E8747BAA2F27BC8A48DD730199831F5AA61B954F01117141CB75E37C4EFA3377A86B8AB916874F348C9987E590D91B908E04387B7B654A6103D2E6DE8647F3953F0D4B9E977FAFC3F1087EE529E31C545994D79FA3DED540185A8FB1CC87ABD5D570959B061C23B3D98628A53E9C6D5462AB3E53E773202B38370EA2742E45161400A5FBB8C86C1EC5F55B30CE923ACD4EDAD4913527D1C9DF4426A851101899B0A255B6688D0A7134978139C56B5D25B8CC389DD3972E38260521FE85BB9FC0F319AE57D18D1CDE432C7F34C1BFBC38A759882132B0CE158023DA883298051E51743390CCA45F525DEE3C6430948C906876664EC00A259B70E1D0AB9CBD416950653BD507CC0BE87CA531ADE170917F4856CD4EAEE9E040EFF1FC4525F38C6C032C03DB831AB978BFA048FA8D38F5213A987E5780AAB8D989516FD7AC235A9B4C17A7531FBC22492034969D2ABB1182029804F1C6F40F9B0F39A980E6506920A6EE84847F46904EDF22A1C78DA1BE49DA78D681F049D123DB37798B189905EA20583E4FADE7B153ECFE3228D0ED92927B2E50AA74604A9759232B546C4DA752C66B0616790CA1AE90FBE40E25B2B5C9B5E261BECAB2F7B9E4F1541F5023631DDA694B12DA8567D7B62B755768F76CE749DC95541D49BE856121050C6BBC59AF3EF47B2F892F7FD01E4F192756E5AE1EE01F17E8A96B2915EA1C40C02466214D38E7F8AE8749CC9C00F7EE6DACC3C26831435F3913372AE00EAB2398A44A12DABB865CC5F6C345190A1DBC2BFE8497B3FF1460F49F04A9086A8250931B239322C18A08C28175A6B32FCF602F62A1C7D2317C2B83782A293594E4A02DADE59FDCA0EF3F256EF254485957FE5B0BF0452B40616FCFB7836138C9EF26109D9CE08E99421CCC07B0B57C90D51583C4DE64D8443359C96BE5C94CE11F536694FAE8463B6D04DCDA912B7330CA4664D179E824DD6BC6377DFBE1EFBBDC2F9C5497B49343BC6439F88C9CB041038971057826845BD39EBC8C7735AC7C062DD7EB67E20D7391726C998543470153D841026F53805216DB0C4D90B4BE069956569F00D416B9CAEE4BFC1BC515C20CD7FB2DC1DC58832A5D2EB50348A86927D78D48632D4C69C58D58FD39C449F1E06D1D41EA1A01FE0F28C68188C85CD76A56E3928A3BA2E2A028DC6F445C446123D69CADABAAC9698C3DF1F2102D1FC318D6E0D069D8BC31E73588D3999BA04B5A6DA47F62E7C707179771E0A8C4982A858DBAA9A4A65675E098B644468A0A3C8CB4248ECF871A3BF828874BEA55BF181BB265444AF1C77166EC6CB47FBB39D21A8110FD6E6458582C6FCE348475619618540E4535CD27C195FCD21439FAEE1268BC52EC6DB9AEF6AC082CEFC1BA389D8AFBF071987D53A39ACF5599F2E06F7887EB63A312CE4C3D07701CA62ED2D486F64860BB32CF227929F9737D6C80354D33407A98DBF303C1E87698F18FE626D8A702F6AC095EDE418CE6A88144AC74CBB5740FA53A6FC3EBD3E27C6C68F04914789AB5BC1241609F0E9FCBE0360FDB809528F7457625D137237045FC46DB5CA5A28088ACAD2CC8D9A1EB90A1F271ECCCBCDD4196619E1A3E911BBCA9430A2AC60E529351A74EED7B4EC0CCF6FADA40A4D918C54330DFC85FAAE4F5D872D02C0B3E074A9958E8EBF433A8BBB08466C90B1D1CCA2E194277F22D3265F624786ABC21FD893422313D7AC4FE43866A6768652533A6140CA1F382FE556EABF7C53BE4B72C7F3821B26AE6CAE3CDDF595CD0F77A99C2360F98A9092780D4635311A286FB16A2429155BC57A03CAFBD1EB23EF574E9C93DDB8C11A811BA4CB025583DD53F7B8ABD9B4813177894798C9E9F5E2289855E586046727BE7D8C388F6443B0739AC2410EF8B980FC01A2F4AA0A2065D89DCA877C263A2CFF9F384A0750CE58757120D45BAF7522EB532EB7F5FDCF3111DE2291396EC9403618BA4C993898815E36CF07BCCFA857867AF949888118B3C603A76C0AA25B349CADF9BC29F7DE9DE518B6A1B5122ECE31EBEDD5EEA10F4A9A80B3949374DEE28D5793258AC1C73495B91695ADF6512B8937522530D60B74CEB0FE97D16DD642E094E51F18C875420ECF75FF23A544435363046B2C74B89EE4B13231B0C674A74F3104E0A159392836A7BD696E75C1173F20D525976AA1D68E21288EF072B3BA58574FE08AFD0B8F5407ED7CFB2831D44C5BD55ABA143AC446D5D2A906F0EF89A68E231D8BB2670AEF18CB47C45A632073715A6143B0759A24C9C97A29D8F8CD69473795096115118E1847329BF98A4DE168658FCBA2CEC9CA8BAC487B9F155EBBAEF2DA4DFA5DA707CDDC00215F8EDF7308F8FA12A722963573594281D528696DC9E36BA464D107031D973E84DFD1415485BF0E800A56080B040BD58EB40EED553833B3BEB8BA9E5F9F815C01C378A8E9FD009558F707078BB3E08C4350DC0BEE5F4AB3665D2A71E70531B3DBAA65CE945C163D3AE88DFF91AB2646D5354191BC01F405984528D4CFFB69A8C86A25DEFD81B40EC75832F0A02FBDC1628E3BBDE95D83A5FE6B0893FAC48E62BA3A2E920B99BD0FFB0355A3F3E86B466D561214892F7B6BBC15AF8B71E279278FE563C8B7B9AA331931C9F2C557E2620AD4ED6FC21166CC90BE76029588677FE706AC280F0070A27606F956530F40BEC2626407AEA8CA7F3330F45D1AB52E6F1673FA6EADF812BA5FA55BF9DC67BFA84E22CFF9615917B6CEA9893A193751CD917B438BD1BD48B4BA1E9F1AFA6436F5625A89122B28066EDAD6284D07B123C29017DEC63482976ACB6CFE7340B2CAB9098919C63E1477EEA8958F318D106F97AAF17D18A3E4D8CA72FDFA8593F4F568174A3ED97ED7D7023D0B80660A0EDDF5DA2534AC8825FFEDF9412EB33E4E0DFDF71865C4C0A0049DA2D77A80C1C2CB1E07C1816849D12131D8170AF08FFB8CA0D0FC69099305E35DF7259606F5B31FB9C43EEEF984ACFFC7DD5944EAC643B6FFBE7051CDE6A67A3BD8B617611B2D759EBD34CA9BF12DFE45DB2B95F3AB65BB5226AF7975ED4B352EFFB9E833020085660B951541F39CDB43A7C7A6AFFBD0600764BF3B03C400FF1B55B6D27B626DA06F7EA130910F64076538DC05949B20D7AF51CCF4E0FC688439DCAECB5BF76556D89610E03D0E138088B9CD6F1C8C5B81EE3AE7CF1751BB2B393DFC086ECE19FBA8920E8250FAC575907133D7DCD9084F2B63AC5AA9F770E885CD6E401763E1CAD8912F3C709DD8866853ADC149A85BB2926FB17FA4DFF9B1D6EB8DC84C5424D0F4A54E99C11EEB2830505ED3BAC853E7AD8C377E849110189E5746E8A8677E0A8A399BB35487EF22658CDAC854BDE55325D24DC1385517676DE8102D2B2AD79C4FA3C3AFEBFDEC78FD0950A76E2C0BD3C3C369AA967EB2E622DDF94B348502632C4230A36DBECCBA333A8CAC5E5283A3C12587182248535F686D70D9082F37383D505D768BC4DB030D346797B0B4E932365365AAADB1F0385796B2CA2451626B737786D3DDEA1A5CDD114EA1ADBCF400000000000000000000000000000009141C242933363C diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt new file mode 100644 index 000000000..a635a5a77 --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt @@ -0,0 +1,75 @@ +Signature Verification -- ML-DSA-44 +pk: 5B003CBFAF3E5166A85F8A45B9C1A4533FF216FB226CFEB83A81A20EE6E97E540FE2E3C6E44262A8C344330126E881551371383EA34EA2ADEDAD1185908B34905B09FC1E1304BD96225F36056C1B2099C624E770227D1E7CC310EC1D24A8F034FD91CD01FFDE608FAFAE157C6589DBD5F63DC8F57E857844AAA44E0B644E5F6BD684239D145F3D45A8454BE4BB588AEF4245DB3A0BB949322987B9C40A7DBD37A4526363FDE5EC3778C1F72E85230187A9E7B35028C3EE5CF8AEBE8748C45D50E8E22A81E70494C11C276375A8AD230411DB26C8100F07C471D69095575F09A1EEBCEC4C9C0E050B84DF0D4F95E558B921DDFC8F26B2067680998E9C99488EFC128D5BF927ABA361FB5E9CE7CE32C0524EE88FBA0F3BE5A1A7C55AE6C518AD4C7A33C05E2956CFC8DF6EB2A81FD1EDDA40F67AECFD715E4E3DC042AA939ADD3D275AE72CA7EB85F0F0B38884D0D7DE81CFC8487411F8A84247B82B2BC28F76BBA2D80BB7009697A7FE729DC123D11E695E60C024FD31D5F94F5C3CA6B76A13B7537FE6402DDF86EA6D8D77718D03B32505444ABF4BE76C01FD43CC86CDD5736E469DAF3B9A239DE67FD4C4D99319B0BA690C424DA2F3E68831E5CDBA77B49F20D138A3CAED4EAEC8968F33169C3A2A7A28B39B875A6C18F5A3A7F49E6AAD46D475C99FA980BCA322FC69633B576B30E1E98F771412A1267F0C82653562F755BF39DB93090235870598E405BE0F8A58F033F19BBDF126639FB85D6030CCBF4666384943E7F4DF69EA767982D82147D8F52955EBB3D3A8D90664AE9B9610CE8A8F66454B2C518BE42853BA93C434C8D9E072726BBC8EACE2A218F6DA2639737541FEB2016E3478E3443442381A4AF18004C49198D2A87154DC6D8975BBE20C22DBDC1B95DEB7EB74E61E5AFF999833B746221FA13BC442F9F25C6035861B7A5E75615CA6749716E8CEF56CAFEAF04CCF6B824FBE295C55C2D796AAA7992C49C4903D362AB50AFABC4AEAF6644106ED2F749CAE8C970D4D49B79A98ABF6CC3933563E499C07B52B80F963DE9A5C54FDC1EC4898B7713630D0C6F4CBC84DC245EFCF821FE382E0FA855AD32E3B70D38772341C0C3000D2595F749E26C5EA692A0BD42251A5A9C5653B995EB6B83A2FB8635C0EC0E29F9760A4684591D0CEF71D46F529204BC56087EDAD2D37939040F834610B9BD3B616C87E43B49E8B38D21B9E8B936B4DCD90D73C12F3F6F66A111738B16A2EAEEF8DF66C61E78D29AAA2D1378DA0039ECD56CE7231A5ECE7EC2ACAC469A42B9E323AC420D86A100DCFB78B1716A0365DA724EE0EDC9C4E1115E3BE71F4FF0794A10AB766D49E11EC1DB556816627DD54BFCC22CBAFB4F2A2568192638B9789E3020A2802A4B90F9DDAA36F650546D41600B2F33A86B1B10E802EF9B7C4DD1975970A930B0CB383E3916728CE1E2C698DB19AA027CFB620D88840C51DF17657BEFD3240510D95A0B6C480FDC1A1346E00C195CFFA6BA7822625F9A47CA029C29858F07AC0A86F4A1D0792635F82C15D5DFB19CCC415A2B9556AD67B1806E8AF681827B1C465D8646B481A00B7AB68C7CAFC623656D2FDD9431EAE0171B96885140196EB7F1ED76BE72AB001CDE7CBDB220DA5EECFE8D341EACBE12878011CF85681AE8F4BF0A9E8C40087FF51692207C57E0BD3C1F45E90F22B5D139008CCCDF10795EF0858C5DC3F6FD9F78858DFCA5D81510A9682EB45D0E094DEED0454101B0B28EAD2BFB7CF1230994E03BC98CE986F4CE7720577DA9C8406BAEFCB3F2A8B9EAC2D1A5C598A076E52BCAF2951CF1D4339757F5C6C522C3BC4B93C71E47B639A6FB8FFADB117C191B4B9D0D9 +signature: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A1523FA43A15CC894A81285C4BD0E5063267D317BD1EA3E3A2F0AEA6BFAADF074926F5E522140F00CA40BE0C60D492C7BF420EEA18F2C922A0570FBEFBF07CC3D084793D4D07F9FAADF386C6D1C24AC98F153313FD1C5957D02C884B21CED24B3BC5148F9F837EE94E9FD03371342353D627FB43FEF9472C832A1DCFAD355DABD974AC185C2FF7A7CEED63124BA86696F095D419810E381FA62B66C12D2B75E8CF59B0CB76E9D0546D71D9BF154D0D056603666212ABE8910E60C08DF738EF0EE8BB794B35C6E47E7BFEC734A6451909972093BC17E080518053EDE94905978F397DACABE24A6C4194F0305C0F6839F8D9993A6F6948B9EF3984A90B1C3B2E9991449D1B1BAC5DD54A2134608851662F6F25E8ED9BCC65D199A770F20D2A28C35BC56500E4BBF0823615FCD07452B8A558F8146081861DCA6A6EE9E24C688DC7367BEA1E00181D8F0FCFECD8D46A607C08CCADC32499BB73A9C664CF07817C7D496CBB428AF3A06ABB3C4A140C681CF8A6B7216A64AC4BD3505E4AC5C08C076C9F34F7DF9157BA1141628837B0F3BE1064D3F4908FF0DFBD83426C90ACA12D8FB9C9F9955B5959EF6DAEC31140CE117D9448C813F2A940D54DEBF844E28CEC621CEE34A9F336C0294572CD03AE5EA6A9B7199C6FCD9E20BE47214FC0F7E0125A6D8B8C397CA9D497671BC41CA08CCC153AEE53ED7F52D678E2C1873D70ECA96AB6A43ACF1786BB018057F98A4311751CE6C3D8B0C4601A370AC792B081CAE7581AC836F0C0BD3F11D2A78EBC5E268F8D19355F3B4995B57736C042F1B7B90EA55899011DE84A2CD0F6BD440D51DB2A6BFD93E5ABE620BD0CF9452ED0C5F4EEE9B724B06FE1981A16CD14D554859ED4A1B205E4527B66085587769ADFEFC289D07B09CABECDB95CE52587B7BE95D6D5068C05AAC009CDDC7AB550CD49C66EF55A86EA04765C46E74CC3ECB02650797966A6F125DB780C3C507C2E2B4EEB148B243673FB5FD2865533CEDA9938821221A01A8585EF76086E429A80A99AE31A2A6D4541AA3393FAF0A092B3744D8C742239C18F7AA3FA258FEE01736D446785BB9C0086B6BEB05AE13BFE5E5C462A87C35CC5731218EF2AC902B4505A593457F553F8F4DA1533B2B144DB83963663C3EC991C6F834DD9C75B21E40D0060646E323468C1D44F6071B6135CA41EADD17F4C36FF21C5DEA01775FB519597D4F9DDDAB30CD63DB37E8F5C0620EDCBCF2C84595C8DE1E10EA2D8D7A8A2B7D45BF84C0784392E0C7FC74FC8787C118782E57802DE412A1E99D002C2793AA614DAA5685C5D4253FADF0A630D1150DAA8D8D54F4EE0F6081E59434C6664A933167C61262FE7A16E3CFC18BF9AC42C49C5E0F9928F2DEAE020F5E105BF247E4432F4263E6BE8ACE9D8D8269B215E31782DC83B0805538BD75503C2DB6E90E99741D120951598493176499DFABDE262A16F28EA1FD183485478BD4E906DDA0FA037A7061BB28C7031BA4DE21CE4B1F736B1DCB12ECBB755A1DBD11469A924F417383E0B0AE22739C8888477FBE24336C2551040B3F044B02F28D4D5C3CB4852871DDA6584303882AAD3DEC7D6436E0089F2E2E4F6E2B5FF628DC565CAAD8775C1DB24CE7FEF3FCD524821CD58E43443D1669F3E4DEB508C7A2EAF0AE8742C06C537520EFFC894EE1F58EA2D335E9B8986783CFD4E3687D966A03BE25A8DA8F8565FDCA33EF9F5E8444F0966F73952354A985B61C2A4520F7758721FE9E667EA36A746F999B6E1906747555A361CAB9603A68795B065CEAFE7625F3EC8CCD9589C9E4800AE2ABCA461734BEDF46582E2820F129E4030D6A2E967BE349BA20DDBC5DD04EF8006351EB39AAB145E0E5FF648491C016AB7CA26E5789BB184DA0824F699AF597ED6A252C7AAE5F60B0119F74C439AF414545B2C1299DC546EC0C66589AD70C2DB8EB517E3CE2485C0F13D96E699B0C7C3AE607619637FE5732A31DBDE4565A894478A00DFE78BF559E0E9BB65125B1CB5F1A1A221C9C8BCFA3D294646AA9E21F4EDA1825880FCB7E1A4B7F42522442697A677ED9F3777F8CB8BE61DA12BB182C3148E9FA395E95311C0C374698C462407FE98E188FAB09057099915732CFE16DD35909F912A42E2C5EF0059139DF8AE6D85FAB29B33973E40EA0C592B066859611BDE45C96F2397FC0FB5F07A2E8F2177FC2C8EA2E3F357B5617892B071F6366488D0FA27FDA31D674997BBE9B0234459EEE7E5FB606B405448DF0322782B55D5DD83459B55F6041E62D47E2EA4389A2A29F2C4FC27CCB0AB9907952C9678650C57C0B909EFA205CA27F25C13FCA3E572E484F0F7EC947CD0955C1020FFC6F1612BDA856C8E540E6A41EA9D0A84C7E9DC6255BAF32C3D135A299F00354463C3E1CC0B3EDCC309F8F046BD329A19F9B747828807B958FFBB7D6F05D77B3D354948CFA9215EA79DD62E0EA95BFED33F9BAB1B92623AE9DBD4512B4A4F6B8C08A70CDFFB6A91609309752707C04D183651191B1C3964D6AE450334E0BFF52F7E1B64273955056E944D47041CAEF51385F01F0ECA4973BF2A56FFD8ABD679BA6983161B7EAB18758A5BD62C61693BA3C724395F5FD69D94E242C6F174FB26E7BF0B089BDF92FA03C4C1E663C99F2E22A23ABC3810B0EEB6953B1EAF7F2207616400CF79E530AF203873BCC0DDDA656BCAE9FBED9B20F870877002DCB79FFCD2CA91266FC8F8EABEBDBF71F7032EDEF77C3FDBBA35161A45C22F1248106A4AD3B2FF1132A24891FBD3E79DFD2E0F44F4CD5EFD5D07BAA5ED8E13A406FC9E813460FAAA196E4DFAAAB4A8F686A59ED6753DE8A7DFF287BF24BFD60FD7A84A431F80D84062F4157A4B0712B89A3743C80FC0B5D8BA8D4A6A6D113C029F5579CAF30A9E458BEF1903A989753237CBC69109DC435121FDDD10892547F41EF4DA88F35CACD6F5199E9973682440ED4AAA0F98106CF86B30766B31C55DA18EA8C0FB67B0C937FF4727CD8FE157F6E96E73138F1BF394E7AEA8162CBFDD548F3F4633CBE99CF91A9364D4C93E6ED58167670DAED4358D517D9CD0C9B5F771EB2F9198F91D833CD92ACBE244C6888F9577BC8CB4B514E89C03DF1AF38CD355426A21EDA4EEDB8791B41BB13ACA2A5B6637B9985C1B19AC3D5004B177B8DB3844D3A7D0573CC2F4237A712D2D4F42D3429C13E189913EFD4DC4B382B8E14873C8FB7D3B885F208DAABDF186601DAFE85E02D2B47DA258B5D554C2ACFF9D12C2260AC96D5E150C98A226E212151A49788186899AB4BEC6F707203D48526F75848C9AA0A6ABB2D1E200181D2C5758606873777C85CDD2DBDEE8EDFF09162527435861626AA1A4A7A9BFD5F900000000000000000000000000000000000C1C2F3F +message: DBAEDE95F7793725C9DB980AE6544EB2E2C4FC165C28A12B6EE675764F020C01C048BD0DC8064612E4B6858FB6871F71D104ECC4AA0FB27B9B79D1D95EF34E1072743826CA9E4AC0F1DC608D75695F1D39B5BC2B52758ABC11FE8BFCDAB36DA01B713B1434B9FA141ABA354EF1C50220757425B486682DF64FD3C584DFE147180657C15E6E21A9888219BDAEE8FD883A41177A6F6537F4DBE6809A0334D54582325C80119B6D4B37D45CDFCE93683FEFDD684F180119B88558D4737FCF1815063A06C0D0CC2F653DA98C272883B71BF463AC57A104F02C1944999E3788DB99F3F26D752F8D286049D0FBEFCA4BF5E1E5765FD0E3DDB9B72550A725DD96F2E017CC99937812D037FE476C613541DE88498A2CB72DB2120EA3232629709F551C4134372E58BD6EDF8366FC5F00DB38DF6E281962CB5C68FDA2CC4EBC135D438AE84E908E6DAFF39AA1A7E09785F8375D3E9950041679E86DEDC7398798EE624067A7D31E313A509E16BC25564DBD96F7FA811A6B5128819CB35396FD2BFDE8200EC146192AB727516FAD0FB85613B1C922203B4CC0617E076BDEFEA2A178DA9CFADC2044A89FF9034C23201F11D3C8B3EB98BADCB3E767812D8F71733885B6B6E13BBDE5811CA2DA120D8529FE5EBB21910E25ED49364F8E17EBD49901C0F235049258C97BD24186E5BC3ABE0D1FE6C448739760CC586BE39DBBF9043FAC6DCD5AAD1F5CCEA91994E75125F24DE6CC0495C2017EE37D35263294D1DCA2903A571D3511A1E38E575B0C1469E0B02ADA0EBE331CE290DB49F353C1C7ACFBD25C715D7B8154310B1042D73CC78145752A93B07BE7D1125F8B122A38849CE7AD7B69D0729822333DF209EDE90783CE95039E856002834F09BE1F41C213012B9569AB2F0AB29FFB084BE293B387B823F62E14F0F38DE03E4DE40F5A753C71A00DEC36750855A1771A06FCBD8B8448C67F08806812B72FD7C56EE3FCE1EBE2E2DABAA9196A2FCD9B4D479D553229D7C69B359ED53BD7132A2129130953F5EC0753703C202649F6D218776E6FB023A1188ACE6FDC49FD56BAD40D7936ED945FF0C5403F24377EABB1A3D97ADC8916EB8BF67B7C8DD0A48F8C3E62BF1A12A009FE4A3B3C6D7FDB87F64FA200285C6DE922BEE5C5CD28C0CEA9ECD6740C5966EE76C948195B626830725AE7D048955339A095DEEEF7C9DCDE9EE169B2FF233AD7213959231E74BF2132CC60566AB84806910894A0BD2ADFC562DBB4F64722280FFF3DCDAB54D5F96826DB5AF6BEF32068343A5F22F55FEA30A417C76B620BADA6A44B09228136516CBA30E70ABD4CDAA603A0FB5EC5E1268E47665D5AE9FF70468A3D19283A5276ECA45A847FDE13E3446F1F17CF057E581E071FBA06AC4321880B820C4E01329EED052A67ABA632B73896D0BE7C6DAFB5BC674CA11FAE0F1AF7A69CAE1C43A81733186902192F06ED2C73864D68B0584076353DFD8FA10F0556F8652C04520EF5712EBE2E4B9B4E62E308DB848D58106B1EB82FFA1DD6DF689B1C92C62C237200A38BAD10F5E622C9026329D48C0BEAE51BAE803DB0FCD68FAB0E0C1E00C8F0990D09D44DA36DE0C5B8BFF16D18E1AFCC465EDC575C9381334103B0098D209141F870E51D80813220A6408B4287C12228BC4403846E2A687A0DB1390BA6CBA6F0A16ADCE5E2EA6BF3FCEF7DE0DA0915638916AA437661F278A2652DC20FE96F84C8FB76612FA8B11D6E2FF0EACA6F1B1A4F680B4537471C24CD878EA34D725E6CB37A75F97DB8A4AB052518D798B0A8EC06A7094ECC524251CD06F5FAED9439299B0E988371E0AF0BBE7E97B1B601068BA3950E9F000D50CDADE4018A160A96ED4DB2FE500ADDEF749E1056FE8C6C9CA82E8D0FD9FA7F5EFAE2F196475BA73D4031E5BAECB0A83575D203D8CB9D6F49DB3B6FFFFA0864FEF2847BC36C3DAA3F19987B54784B84BCB8D5982FA6BB7145FA5BB9726813E24647D70C23401FB7FD4E1CA26D7E43E5FBA1E27FADBAC64D1B8004C201C7D29336DA4BAC7A18A850E42FFDA6E7C586B94021E3FC989864E2A40EF0233CFA7DAFCCCFA519FA6D8690D6DFA6948BD88D904BB9E6E9B9949A65F13D8F32F910C40A5410F8D71BCBF7B71716A73271D8355132776E6C56748CEE9ED6226FE340C704D1FBA5F58204AE56673C148B2C6C7D94020BE854D49F0E3FC5CCBA6981CFE3180521469E42FA3B458922F9BE4E23EC93324FD73BBCAB4C43C70E8FEA1D232A92FCCF4D7BEBA195D024C67A66E93F68618FAF32C943DB3622FBD22CF777084F54B638C774D6D3D8C91763C20693A92712456D42DF9D2FEAF0ADB1A6D9B4D500AB899A1AD2213A7008AA21E2FD7D00879FBBF765EBDC7526B8FA2D13BE83FD2717945670B5D73E96445A948AE028165CB3A73D3F2541238CF40C1B6EB26F33FC8F69D22BB899CEBCBB739BFD073EFC6993E221BA2EDEEBF35922FABE93B254C438A12A22E0BCF74D149043BDFECBCBB6EB1A55D928150F601EFC4DF082322B83C8395555135CA1936D690CF3ACFDC19E5164280905E3F3C5F62155184714EB9F61EEEFCCE338BC0217045AB2910F4E9DA330283CF93DB2D0B4EC2D81877266785BBB52AB0F81E0A06A7C5B736C1F58D234094F74DF7EE550C03404E9A192EE63163C079DF3C5ECA1214F20A2BC0683C66F22AF3F1AF532F5FD828EF3F2F9FF1724FC2BDEB2E7F706B2A219A2188D828D57255300CF6E29A7B992BED0D3BC532719B475A08D759CA7A888E0895683027D9A3AD3FDDA5F021E5193844382B1A963945AA49BCE0CF4231133C585807E0CA86D4779564801C05F2E474DF49A9C0AE7000D65B35B0896916CF18D584B24FC41A29AC67103A240025D316BBA272ADF68F06CFB19012F846DF8F5AA45EFC76B89FE08EC9CF0DFC7CDC63A392B83ABDD51DE93728996C99812052E83DA07DD3026A15E4186A19D2A7CA6232C9F54C886423B7ED35F9E8A97B804F401AAE8B3B7DDADF5D6851C4C4DD4FBC15D55520837123C11499A6F6B4C024F457C3D9AF50D7D82E31F433101834930C183DF8427922887CC36D9DFEC570C204E77E8C54119EA5D9210F82100E1C1E846F763397ED5DB39B7C086F3730617D91413CBEDB2AADC91C95B7997D45C8977D8D17E9BF86B97E3E388BBBFCD1264216C3BA773030FF49ACC1E79B2BFDF73C890E68A1EC42A638D2E5F57 +rho: 5B003CBFAF3E5166A85F8A45B9C1A4533FF216FB226CFEB83A81A20EE6E97E54 +t1: [[527, 248, 110, 915, 578, 536, 58, 275, 307, 384, 642, 519, 853, 68, 903, 248, 675, 147, 730, 950, 429, 324, 264, 558, 52, 740, 149, 1008, 798, 260, 976, 602, 802, 407, 83, 432, 27, 584, 105, 147, 231, 156, 978, 121, 892, 48, 705, 119, 36, 42, 847, 1012, 401, 115, 1008, 891, 864, 995, 746, 86, 380, 601, 440, 855, 502, 527, 860, 507, 133, 286, 676, 658, 846, 258, 230, 381, 619, 309, 568, 628, 788, 855, 83, 673, 837, 274, 958, 354, 906, 187, 84, 877, 826, 578, 155, 201, 809, 609, 75, 43, 381, 495, 579, 330, 867, 856, 607, 947, 55, 94, 892, 187, 901, 72, 112, 678, 999, 44, 645, 780, 238, 535, 751, 762, 135, 274, 476, 321, 744, 696, 18, 926, 4, 101, 460, 156, 355, 541, 730, 142, 260, 708, 621, 800, 784, 451, 64, 455, 214, 356, 377, 381, 265, 936, 974, 946, 76, 935, 80, 44, 900, 887, 240, 597, 229, 598, 539, 884, 1020, 419, 802, 26, 118, 608, 233, 626, 153, 914, 968, 75, 909, 598, 639, 684, 419, 728, 495, 625, 743, 179, 3, 331, 78, 1018, 936, 62, 315, 121, 634, 790, 602, 377, 396, 692, 588, 222, 3, 379, 553, 981, 140, 895, 622, 556, 506, 836, 749, 54, 868, 491, 492, 127, 487, 313, 61, 176, 676, 590, 410, 887, 627, 360, 231, 459, 698, 535, 240, 252, 139, 530, 976, 949, 29, 830, 200, 274, 279, 992, 680, 464, 900, 174, 555, 1008, 872, 749], +[162, 758, 880, 2, 918, 485, 1002, 459, 413, 240, 274, 123, 617, 23, 6, 147, 509, 332, 925, 319, 92, 399, 890, 426, 787, 237, 1013, 921, 320, 971, 109, 938, 365, 483, 791, 565, 771, 364, 82, 272, 842, 751, 628, 435, 257, 255, 196, 539, 461, 245, 743, 281, 925, 747, 419, 142, 669, 1017, 327, 787, 985, 612, 769, 746, 105, 131, 212, 649, 755, 569, 792, 916, 717, 494, 839, 638, 288, 564, 563, 810, 749, 915, 138, 603, 911, 396, 449, 234, 554, 542, 818, 622, 647, 790, 390, 980, 931, 297, 495, 426, 685, 273, 861, 805, 415, 42, 968, 654, 34, 639, 566, 237, 855, 26, 531, 935, 911, 285, 289, 644, 806, 799, 32, 406, 565, 472, 351, 765, 825, 246, 153, 8, 821, 353, 384, 914, 517, 1007, 160, 354, 1008, 76, 447, 758, 753, 201, 502, 738, 93, 24, 195, 767, 582, 537, 147, 269, 231, 1021, 669, 937, 374, 158, 392, 135, 71, 374, 671, 340, 1003, 236, 653, 870, 6, 921, 442, 602, 528, 691, 248, 410, 837, 786, 274, 557, 228, 202, 933, 590, 196, 525, 412, 899, 626, 732, 966, 570, 684, 184, 394, 984, 730, 585, 819, 469, 577, 191, 27, 440, 52, 222, 78, 209, 66, 654, 161, 965, 128, 257, 284, 610, 210, 106, 327, 881, 365, 354, 951, 906, 524, 712, 461, 111, 661, 503, 699, 467, 742, 647, 1013, 615, 920, 460, 107, 137, 287, 744, 67, 267, 761, 828, 517, 213, 902, 646, 487, 469], +[97, 407, 842, 605, 22, 954, 860, 435, 687, 58, 207, 829, 619, 992, 996, 166, 348, 149, 380, 603, 938, 617, 713, 292, 196, 868, 867, 168, 693, 642, 975, 298, 746, 317, 22, 25, 1005, 267, 455, 698, 908, 869, 208, 293, 695, 550, 697, 986, 460, 206, 355, 249, 73, 487, 848, 174, 384, 254, 486, 619, 92, 853, 31, 947, 72, 486, 795, 217, 48, 436, 844, 815, 456, 147, 92, 957, 719, 992, 561, 523, 736, 382, 424, 845, 814, 14, 311, 543, 114, 781, 193, 192, 512, 628, 501, 465, 670, 329, 684, 423, 810, 258, 557, 324, 421, 362, 604, 237, 665, 407, 907, 234, 47, 238, 454, 57, 704, 1016, 377, 386, 164, 346, 276, 834, 974, 893, 97, 981, 41, 712, 84, 387, 391, 891, 730, 220, 147, 36, 900, 211, 865, 706, 313, 731, 22, 946, 55, 721, 926, 546, 291, 111, 926, 226, 697, 309, 205, 484, 973, 72, 755, 445, 687, 69, 23, 78, 683, 185, 942, 891, 872, 435, 865, 889, 664, 680, 418, 500, 211, 642, 515, 871, 364, 825, 370, 332, 714, 927, 748, 650, 76, 423, 932, 906, 809, 232, 196, 520, 685, 65, 781, 499, 187, 94, 22, 424, 467, 669, 548, 955, 448, 627, 334, 324, 561, 763, 113, 1021, 127, 592, 673, 450, 619, 849, 414, 772, 478, 724, 342, 416, 630, 884, 852, 815, 556, 812, 175, 173, 559, 346, 641, 228, 182, 606, 905, 184, 160, 160, 2, 617, 251, 628, 986, 1000, 598, 21], +[70, 437, 1, 712, 755, 398, 792, 710, 14, 928, 914, 735, 452, 631, 849, 605, 778, 740, 192, 716, 899, 120, 633, 161, 718, 775, 658, 565, 689, 38, 634, 828, 182, 520, 141, 258, 453, 71, 879, 349, 446, 191, 3, 325, 269, 37, 874, 786, 384, 127, 540, 210, 110, 64, 348, 830, 1018, 474, 42, 154, 293, 318, 970, 641, 553, 560, 393, 961, 122, 560, 762, 297, 797, 129, 569, 381, 386, 880, 469, 1005, 25, 307, 348, 648, 441, 661, 358, 495, 536, 513, 766, 418, 792, 73, 75, 407, 216, 729, 134, 105, 768, 749, 650, 797, 202, 191, 870, 344, 466, 639, 61, 121, 430, 64, 919, 418, 133, 69, 352, 942, 639, 455, 701, 925, 42, 108, 208, 927, 971, 182, 210, 660, 1006, 563, 318, 263, 1002, 114, 654, 480, 1, 519, 367, 517, 942, 739, 772, 679, 232, 49, 112, 1022, 337, 154, 114, 788, 894, 194, 29, 979, 94, 164, 703, 372, 19, 548, 192, 823, 1009, 321, 761, 35, 344, 817, 1021, 444, 985, 573, 392, 893, 458, 87, 280, 41, 662, 736, 94, 833, 224, 933, 733, 19, 84, 708, 177, 160, 746, 1012, 891, 830, 18, 588, 233, 13, 188, 934, 396, 446, 844, 185, 87, 476, 218, 295, 104, 744, 1007, 1010, 675, 556, 158, 875, 418, 368, 601, 482, 736, 329, 956, 619, 274, 829, 797, 592, 851, 509, 92, 155, 709, 236, 452, 814, 787, 913, 891, 664, 761, 737, 511, 107, 379, 772, 145, 621, 267, 871]] +cTilde: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 +z: [[-42047, -66894, 87908, 89595, 111780, 18060, -29472, 106675, -73405, 83736, -61194, -65178, -122794, 28095, -24402, 110453, -15, -102450, -203, -19281, -49095, -33680, -74126, 95449, -87968, -61315, -118543, -82701, 34428, 11441, -110480, -118455, 14714, -45236, 66412, 78762, 66285, 10681, -52485, 53728, -52769, -54004, 45997, -32316, 33149, -119738, -81161, 77372, -21283, -51701, -123967, 57369, -33580, -116554, -88796, -44404, 101159, -67115, -94965, -80543, -25581, -4804, 39318, -22466, 58924, -928, -25075, 26450, -77249, -7498, 25346, -77505, 71306, -87348, 26858, 108801, 62131, 75391, -9824, -44105, -37352, 124925, -96476, -113891, -124942, -56942, 105644, 1133, -130683, 29391, 27558, -23588, 93408, 129553, 59378, 45567, 5651, 16046, -104697, -45556, -58027, 107758, -67908, 36669, 38897, -32270, -108957, 23108, -112968, 61829, 83304, 70544, 26322, -86308, 20039, 35152, 46379, 127736, 59258, 82535, 121489, -64378, -23753, -26437, -28839, -33660, 118142, -71023, 130971, 119047, -92207, -127060, -29904, 37356, -99722, 32685, 31103, -45703, -38630, 52341, -101736, -52657, 4441, 106496, -102173, -78787, 45682, 32341, 128900, 70797, 28084, 12562, 80215, 3111, -116752, 55819, -47980, 73072, -43535, 68883, 125878, -72195, -28545, 96546, 105366, 77077, 6899, -70953, -101568, -121601, -95049, -18303, 17833, 94140, -96390, -118464, 126786, 52007, 67313, -98242, -33725, 124144, -6857, -15542, 13895, -58750, 27243, 18499, 15442, -102404, -119068, 56751, -5064, 120196, 74412, -123821, 73148, 83165, -57798, -42195, 117005, 46480, 75996, -47119, 22946, -28138, -63937, -31541, -114208, -116817, -97284, 111741, -93530, -25378, -38851, -24402, 124057, 129231, 79670, 71593, 44050, 90117, -101733, -67465, 115321, -31516, -91818, 71022, -6095, 102687, 34816, -11237, 61117, 30947, 29634, -70339, -72288, 15731, -67884, -76294, -22759, 19962, 127229, 65801, -119313, -74665, -26091, -13884, -79129, -20183, -88404, 75298, 48448, -28156, -20715, -25954], +[123647, -70330, -93442, 60681, -86285, -51894, 49194, -44950, 57114, -17199, -58463, -71488, 4364, 53766, -64258, -25477, 59878, 47821, 109235, -86650, 19807, 83711, -26549, 43999, -30343, -128998, 91090, 4286, -51721, -29551, -21963, -7319, 16713, 35419, 81811, -43030, 63040, -46899, 62633, 55499, 37178, 26947, 110936, 36392, 71866, -78035, -27406, 6848, -26233, 33687, -101810, 69583, -31824, -101067, 45388, 93652, -95030, 92162, 42899, -80077, 91686, 89970, -529, -5226, -61317, -98845, 23514, -42498, -58266, -84614, 125866, 78167, 66925, 88004, -84793, -12597, 56716, -127054, -14248, 92182, 4465, -89280, -29766, -60949, -156, -109985, 21749, 69755, 106754, -37271, 116622, -71027, 126349, -48070, 119662, 48432, 108198, 43571, -99647, -93139, -13077, 54164, 115276, 75174, 81053, -75387, 117007, -91446, 42041, -96520, 0, 18031, 117710, 53158, -1277, -55749, 107501, -83881, -130330, 75471, 56833, 116815, -86394, 47123, 92267, -97909, -81325, -88114, -45885, -74719, -101, -77748, 119601, -71265, -6357, 115833, -120994, 87499, 46214, -123247, 129204, -101985, -127170, 49379, 100152, 15265, -22568, 128541, -16862, -18314, 119543, 6392, 88518, 35195, 14710, 63115, -129619, 81225, 61226, -92480, 10072, -103413, -93700, 100317, 113831, 58989, -80534, 4008, -75361, 99893, -116458, 105488, 91457, -19249, -3156, -19431, -11663, 116678, -8018, -64535, 98780, 62319, -123503, -106924, 71252, 18890, -6578, 80520, 119432, -3826, 53168, -89645, -853, -112368, -39174, 63905, 57135, -1381, -70809, 55848, 1379, 83793, -64022, -108705, -119071, 60896, -120709, -16698, -121453, 6141, 103821, -51308, 36724, -93836, 12764, -51088, 51465, 100564, 85269, 43297, 9311, -17716, -19094, 106544, -81464, 97662, -103038, -8992, -96132, 67394, 122012, 114345, 85184, 126660, -33531, -87888, 78909, 11118, 24104, -4503, -14384, 71008, 98835, 61605, 65426, 82782, -93774, -55179, 40193, 36509, -56486, 10722, 74815, -127881, -130807, 46284], +[57016, 59853, 117938, 25787, 49505, 116013, -108741, -48313, 71670, 29923, -97360, 116408, 79617, -129957, -42369, 78665, 25762, -8610, -119751, 75461, -55687, -59417, 20957, -41525, -87800, 67817, -103402, -107479, 45244, 9854, 56417, 55083, 42088, 53096, 68310, 40484, 57486, 1606, -93862, 58724, -39417, 116627, 100743, 38571, -72758, 72278, 99744, -49750, -118373, 83477, -124406, -78624, 108327, -10151, -57348, -61610, -90532, -86748, -24398, -100873, -3970, 120956, 40188, -108171, 82329, 88371, 20262, -96023, 69884, 48736, -78307, -44650, -24084, 26685, 93041, 129935, -46954, 46670, 18546, -4806, 128806, -32137, 25863, -88569, -86690, 38223, 82066, 105468, -85239, 55664, 48817, 85651, 91886, -103735, 103418, -9623, -28845, -112368, 33960, -80780, 96988, -97392, -26979, -49767, -50119, 26581, -12695, -103933, 54669, -112332, -21597, -21153, 95673, 2112, -88254, -98663, 17431, -50329, -86469, -34758, 56926, -78386, -122795, 59228, -43590, 63385, -7903, 40438, -130176, 51091, -84858, 96105, -75332, 5723, 297, 8994, -117752, -96674, -47633, -2756, -5315, 71709, -39258, 113329, 80960, -72285, -17512, -129052, 73320, 115038, 34549, -25637, 101611, 16501, -89553, -32320, -10897, 34672, 127236, 111260, -63645, 42133, -77736, 78226, 115049, -80528, -46480, 24552, -90457, 34938, -64660, -23693, 61444, -48173, 68889, 9082, -11516, 71517, 32962, 31019, 93576, 25492, -17263, -82465, 55302, -92415, 92559, -61021, -110825, -20744, -32485, -126871, 103584, -5392, 115212, 8056, 43733, 67723, 19368, -121174, -7684, -111896, -17127, -26850, -10538, -78140, 81281, -44739, 63591, 29915, -22409, 41935, 17984, 83006, 90022, -116895, 126116, 38657, -18222, -115219, 70409, 123099, 13987, 98239, 14593, -55420, 107102, -14770, -3668, -36954, 87586, -73232, -56553, -38232, -53051, 111372, -76122, 49113, -13379, -100109, -3020, 67825, -98460, 58429, -12989, -18022, 99457, -8713, 83705, -65494, -63451, -89109, 49797, -4685, -40180, 34682], +[-40359, -101301, 17776, -86009, -105279, 96534, -108073, -94116, -86484, -119434, 80204, -39970, -122636, 107842, 51703, 11226, 129241, -4976, 60575, 103323, 116452, -112025, 117670, -98512, -128447, -57227, -30273, 43804, 102907, 11419, 16316, -120504, 97005, -100348, 90976, -64973, -87594, -63039, -105834, 22807, -71299, -57222, -86410, 37335, 54058, -55896, 99789, 72557, -24415, 55435, 119255, -116505, -64372, -129481, 98117, -97900, -129682, 102144, -15980, -32549, -8750, -69288, 64629, -113344, -103862, -116622, -10234, 31716, -65636, 41357, -62222, 73598, 82829, -46960, -46685, -108329, -126459, -2086, 100593, 128574, -112604, 82137, 58195, 17254, -63688, -94138, -72699, 127011, -122414, -122685, -110003, 108330, -17690, 95248, 64383, 54872, -111315, 97153, 95709, -126533, 6189, -114535, 114446, -79825, 674, -33239, -55899, 111045, 129372, 104513, -840, -44009, 37351, -48787, -35658, -7130, -40613, -89461, -32387, -117630, 82041, 20535, 36611, 54621, 123069, 117216, -83492, 6057, -1867, -44548, 117895, 114911, 84544, -93878, -42152, 113227, -66108, -21863, -81063, -30763, -101189, 80261, 91504, 79402, -52023, -25713, 115264, 96955, 74243, 40380, -83058, -118907, -100570, -71484, -89450, -30823, 101479, 128742, 86316, 115031, 126824, -65051, -90886, 80467, 41531, -9128, -113674, -49567, -79817, 11777, 66350, 41082, -59894, 74533, 18191, -21452, 86297, -66986, 9230, -15699, -83519, -29388, -104910, -19563, 11164, -102322, 123562, 25186, 86515, -85365, -120088, -82545, -112073, -56445, 60674, -124514, 97507, -46671, -11442, -71955, 28792, -73189, -84171, 109866, -105704, -47040, 78031, 43186, 38334, 50360, 16662, -17951, 58444, -36524, 19796, 74343, 91975, -18135, -121537, 126656, 100431, -14062, 52157, -82591, -15447, 66256, -71586, 84811, -82511, -69812, -4409, -17959, 706, 69357, -100395, 56442, -116851, -57214, 1917, -13441, 16982, 122436, -61910, 33886, 77310, 90259, -87434, 44202, -109762, 88193, -27681, -74792, 41363, -773, -27177, 111736]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]] + +Proper number of hints provided. Provided: 63, expected: <=80 +||z||: 130971, ||z|| check passed +aHat: [[[2758750, 2429991, 2498833, 2173545, 8204600, 6778139, 1183134, 8086046, 462450, 3640781, 4260818, 97547, 7105425, 8135912, 7715776, 7341256, 5370857, 7268194, 2756124, 959600, 5974150, 3568867, 6051263, 4299302, 4130534, 1876032, 4389527, 3964037, 3540313, 5266374, 1853949, 2528120, 8275644, 3255053, 3416987, 63182, 8242380, 6226280, 89317, 5813171, 1543341, 347654, 7769082, 6800155, 3153960, 7336645, 7705276, 5336226, 546872, 8319903, 5271538, 837050, 973642, 1526705, 1106150, 5947350, 2372740, 3158098, 6041551, 3933020, 7312752, 7762674, 2427028, 6894184, 1581524, 5384269, 869952, 3887229, 2822574, 6564770, 4615359, 7851055, 711363, 6924745, 5378534, 7445664, 7649576, 3168669, 4191865, 1351115, 6762427, 7273784, 3666634, 5889459, 3488454, 4984480, 852534, 825044, 5268648, 5520260, 4706334, 1857555, 5807488, 4539623, 1868680, 7232201, 4041581, 6627808, 4509124, 3379237, 1066111, 2890841, 3275172, 2107872, 1802154, 4040522, 5662130, 402083, 7613422, 6162320, 444345, 5703066, 1089449, 7177863, 2152982, 2233733, 2444113, 5316132, 7358533, 2261562, 5676146, 679739, 4680871, 3680133, 6369442, 4329311, 7011394, 565722, 4271213, 6313901, 2564483, 6986300, 3134732, 7419790, 164438, 3844362, 7643986, 6940572, 8204297, 6154809, 2857827, 6612356, 7464984, 4835730, 5431671, 679204, 5644865, 5385559, 2279013, 3685635, 3503344, 315916, 5165382, 6999525, 6189281, 282578, 2510517, 2001560, 3588305, 6550861, 4041972, 5113727, 1536858, 6860596, 4159157, 4672751, 1540754, 3396681, 3260980, 2450833, 6728190, 824659, 7647312, 4509259, 7082814, 1923083, 964895, 4060075, 2590164, 6091039, 3687894, 5428017, 7220216, 6779158, 3101354, 3563794, 2677963, 6666150, 4809025, 3793669, 8118535, 2977776, 1660765, 6720029, 4517788, 538301, 7809312, 3029818, 1610581, 6003940, 8358747, 5122920, 6543204, 1623576, 3317583, 4512775, 40709, 6505326, 2865904, 7639949, 1749987, 6440360, 6655564, 4080760, 3425693, 7074229, 3259442, 3763743, 3046897, 2472077, 3801041, 6475709, 8111422, 652527, 333607, 869877, 6375008, 1062655, 7215029, 2854326, 5912774, 5457105, 3707255, 468265, 2131747, 3180871, 66852, 5764466, 3242789, 5947411, 1638616, 1883445, 2288666, 4663843, 8055913, 8105094, 528651, 3343559, 1905217, 4737428, 6596551, 1139271, 2946150, 147553, 5610898, 1784555], +[8332077, 8005590, 7055174, 5233073, 1846710, 2730459, 2948961, 2191187, 6818952, 2605391, 5681870, 2710406, 112916, 7898262, 2127584, 3443826, 658735, 8338831, 6225691, 3432324, 6909487, 2389878, 4906309, 4730256, 326811, 2037, 3800160, 609896, 2054032, 4042055, 2072321, 5713236, 4676811, 5542123, 7134144, 7140512, 6830606, 5049575, 5345057, 1086386, 4261015, 4390863, 6473579, 7446918, 687, 2548680, 2319369, 7084307, 6801752, 8076616, 2273541, 4634526, 7533806, 5248332, 3367485, 1135125, 6029570, 5120233, 4389674, 2354502, 6868803, 6701340, 4598223, 1411766, 3346003, 1318110, 7885753, 5611140, 7656895, 6368661, 4717844, 1275436, 5080805, 890855, 7097023, 661138, 6535000, 1494965, 6317661, 8118114, 368838, 4066514, 4820982, 5630347, 672317, 5494455, 6077469, 5277211, 897068, 8162125, 1188555, 791002, 4958364, 8252514, 2864381, 1350769, 5252978, 7334808, 5492015, 6632221, 3677163, 411310, 4364765, 1286649, 523205, 4478071, 4015272, 6056756, 8036612, 7015760, 1002553, 7193884, 1900693, 7853979, 3752907, 290835, 5833625, 440005, 8167066, 5665372, 1062034, 3650030, 750530, 5916203, 5425182, 1281390, 5396800, 4168286, 8375064, 42721, 3094559, 3043262, 20538, 1069875, 1177019, 7240011, 878701, 4695667, 1883130, 2803466, 3440568, 7182227, 7094877, 3680486, 7051228, 7192705, 6730974, 7104634, 1045795, 3996380, 8371770, 1635636, 4187913, 6168385, 5463873, 4256193, 2931856, 1925385, 7394441, 6189344, 4342698, 7291831, 1319257, 2349436, 6342367, 1923033, 6130085, 4639060, 6142811, 419990, 4059244, 1836562, 378089, 8282291, 4638485, 2781013, 12208, 2663288, 5549141, 6203998, 5947755, 2930425, 7761695, 2724214, 4126426, 7167660, 2686212, 31185, 6725467, 886287, 7036365, 6213778, 787444, 1401123, 4831343, 5264093, 1039183, 8123192, 8307321, 756596, 1356594, 5696147, 3229549, 2175396, 6854699, 466898, 505789, 5957993, 2955236, 7582595, 3361414, 7559551, 7218182, 1404584, 3523732, 6580258, 3029271, 7709898, 6373438, 1355861, 1599223, 7236143, 3544812, 2582265, 1881526, 60726, 5794292, 409411, 5369438, 5312126, 7520406, 4647016, 6126785, 2147215, 4040677, 954231, 3739005, 7270131, 384056, 7798804, 2918160, 1781242, 5457055, 4845593, 949754, 4804382, 4562121, 2698998, 5588074, 886252, 6380129, 848076, 5521194, 6943321, 802976, 5961475], +[7009549, 7600667, 4775169, 2160667, 3600757, 7091565, 7827571, 8288451, 1920413, 3246206, 4121206, 3881033, 1984606, 2323597, 6349627, 7370082, 4190371, 6857049, 4568562, 2367569, 3671337, 2950649, 1688891, 997916, 4581184, 4803258, 7093129, 1126477, 2729149, 1016683, 3503520, 6990058, 7724231, 4260180, 3499348, 792234, 4969643, 3850360, 261634, 3949323, 1762606, 4826118, 6372038, 7864740, 6859283, 1430905, 609035, 8160861, 7358624, 7487966, 3775504, 4914742, 2275759, 6036655, 233524, 8350452, 2161423, 2355706, 1315913, 1262384, 1172703, 1306247, 2964228, 4374431, 4517848, 4092371, 1820431, 5529460, 7247202, 7125767, 7230671, 7566177, 7798600, 2918849, 7024169, 6349208, 4782516, 1765277, 4945000, 8039248, 1299614, 4168236, 659000, 7634682, 3720599, 8194784, 3273552, 3385223, 5592061, 1793390, 4872903, 1894765, 2870309, 909276, 6755623, 6983389, 7975677, 4755702, 8336466, 2082688, 2503387, 6510481, 3664103, 1582149, 3604982, 5486628, 1694787, 452403, 689652, 7677975, 7074279, 3938307, 5125337, 2981649, 4405421, 4398290, 7703334, 5743258, 2896800, 3826212, 7713959, 3441829, 6881580, 5918855, 4999480, 4121658, 144778, 5124020, 6186641, 5738743, 4694797, 139828, 7969588, 6215363, 5652957, 7577360, 7306322, 34015, 8283967, 3798531, 6769433, 4238797, 689761, 5095212, 1211199, 2911343, 1723078, 8055894, 5121585, 1438800, 5361795, 8368278, 7675668, 1228040, 2751571, 6743692, 4899262, 1109411, 7555235, 876686, 2443643, 3689070, 6015109, 3969099, 2915356, 7151545, 3803865, 6935305, 6347223, 6537975, 6420359, 3977102, 2900049, 923812, 4846417, 1015491, 1554035, 5990007, 1118216, 1414567, 3667421, 7299591, 7664736, 1107338, 2144318, 5354332, 4162504, 3576484, 2573057, 6689353, 4015372, 4295948, 1909768, 1319740, 5030932, 6482166, 850501, 2885832, 6617129, 286229, 4668399, 5648799, 3672531, 5077161, 4981956, 2833012, 4769940, 7479357, 7513876, 3384858, 8015176, 586928, 6665471, 538191, 993026, 7344896, 8154181, 2176665, 4812838, 5742362, 6734117, 5989267, 1080308, 2281606, 5393073, 4319268, 6485634, 4202452, 3114603, 207434, 5239888, 7955427, 6428842, 7360147, 2503470, 2634955, 5707356, 5193260, 216854, 6894525, 2951499, 135147, 6700697, 3796934, 1606755, 1852241, 1709682, 1573705, 1713490, 1199502, 4306506, 6294358, 32998, 4168158, 1636532, 3982067], +[872863, 5061949, 3640109, 7504018, 2680244, 1574485, 3742144, 7401748, 3343495, 4529782, 1796863, 2509379, 5903433, 5714205, 6234191, 3890754, 2361813, 1152933, 73849, 1713342, 6696293, 3214551, 6063809, 1697771, 6220265, 890354, 965783, 7575700, 2947386, 269689, 739388, 7936098, 2013826, 5041395, 3916487, 1902445, 3416189, 7651885, 4126956, 5601464, 1468529, 4771678, 2380590, 1390619, 4653944, 1542749, 7115094, 1369464, 8085456, 2499902, 7122737, 7599748, 369166, 3676088, 4821464, 2401156, 271731, 1249207, 7940403, 3185603, 2941088, 290314, 2985905, 2599763, 8043076, 6949003, 7633037, 6167248, 6746752, 7180288, 8374494, 7222743, 3530565, 1796133, 2338417, 1679546, 250890, 7597893, 1369267, 5066173, 4418739, 1949683, 3654752, 3090983, 3978965, 4440039, 7818969, 2095689, 7742570, 1224457, 2089499, 2260732, 575838, 2298536, 1740390, 4646055, 1157008, 4930689, 320675, 1292701, 4066284, 4573270, 5057337, 8362003, 3454852, 5015848, 6362085, 3774429, 231890, 8263217, 7226138, 2506411, 2561077, 5207634, 678039, 3520283, 1864425, 7692111, 5829764, 2900934, 8020970, 6066588, 6536243, 6579473, 7535723, 3386663, 5871549, 1804065, 2397156, 1080768, 250561, 7460367, 1170418, 2206341, 7289109, 2757604, 8146574, 3825685, 8331811, 7906025, 3419700, 1380321, 7042839, 8103320, 4567908, 3227217, 213727, 1969814, 5043017, 1501879, 5636399, 5107521, 1026298, 1745207, 5650203, 4652808, 7640825, 4393965, 4778356, 7436455, 4976669, 4274418, 1078205, 6874667, 4505549, 1595632, 7483165, 4617680, 1367137, 1255524, 523805, 5737973, 756342, 3279600, 4000426, 4206352, 5107196, 3905694, 6289603, 1767684, 3676764, 4625147, 579788, 2209405, 1959139, 420562, 8269, 2242745, 805053, 6210068, 6597249, 6914581, 3976169, 907035, 8356333, 714991, 3823742, 5237929, 7969622, 7413108, 5758646, 3331206, 987990, 7908010, 2687761, 5563244, 5749205, 6652430, 4372896, 4439423, 5949673, 7762542, 2211194, 3875670, 3920909, 6000157, 7441231, 2325059, 8296594, 88663, 1830314, 6229058, 5324269, 8128486, 4262656, 5748900, 5829902, 2962594, 1509122, 7786461, 5731344, 7696008, 5960576, 2129840, 6184882, 537219, 2970449, 2425483, 3288608, 7846097, 7930627, 1300378, 6820733, 63401, 4758084, 747479, 1267856, 1786685, 6410647, 2843905, 4067597, 1062798, 7801065, 8332985, 2666354, 7596892]], +[[2718495, 8283619, 1425067, 6373195, 4688230, 1587563, 766062, 2029025, 2510679, 6479173, 2954143, 1256883, 2265905, 910481, 2381083, 7433215, 5978644, 486739, 7878474, 3959824, 6025164, 4184772, 1806234, 5639051, 7693356, 1340108, 5786178, 2279144, 3762395, 8115724, 1831568, 8185014, 1304707, 2768112, 757696, 2908249, 4979068, 2055928, 547339, 5581530, 1570005, 833495, 490452, 7707757, 6865582, 6644324, 2614931, 3380446, 2499151, 4038391, 5719646, 6746837, 3801945, 6255089, 3862584, 2873178, 3402917, 1671754, 2657017, 3183394, 1739831, 6994460, 46695, 1921195, 2214453, 4170376, 8103830, 5773941, 787175, 7223893, 7004740, 2682536, 7162044, 2673371, 3462308, 6811309, 2444641, 4837065, 5054337, 78353, 4008723, 1812722, 606689, 7871870, 1173348, 6177905, 3884180, 2574922, 3052405, 5866982, 3263924, 8322781, 7957830, 4039258, 4193429, 2454474, 8368082, 1717287, 3247049, 3392622, 2418342, 3607532, 4385582, 83211, 877243, 1206512, 6149962, 7309673, 3266660, 827295, 1902156, 2557530, 329751, 894355, 1704075, 5705583, 3178884, 1108279, 7720093, 252464, 2392301, 5041984, 4467069, 1730076, 1961828, 5086096, 6105986, 2144100, 494050, 1488412, 2707162, 2365633, 930254, 3935004, 6875462, 4253631, 3681925, 329002, 5948655, 5929739, 5445151, 3372180, 7586344, 1748520, 4580591, 3487539, 5214317, 854821, 5544, 7164239, 2250604, 213862, 8224587, 1207190, 388985, 258322, 5868226, 8302702, 3793475, 6022656, 3237076, 7510704, 2171441, 6613427, 4442840, 2358248, 2071564, 916375, 612612, 7145446, 4196923, 7186937, 3992297, 7896893, 7679195, 3833065, 938641, 5450858, 7778457, 5902297, 1959850, 7565422, 736268, 3940485, 5089228, 7210452, 5906958, 1061876, 1787249, 482197, 3422745, 5694968, 5964158, 7095570, 1921339, 4045668, 2503178, 490534, 4725395, 1347477, 8200051, 4266327, 7440904, 3988187, 3299258, 2353063, 1454990, 1474045, 7466713, 884710, 1558693, 108728, 4639728, 4293601, 7741326, 5873341, 5706309, 7412822, 3597921, 7121272, 493697, 5917200, 7024239, 4652791, 3555372, 7371496, 4992704, 5757682, 6946045, 2258796, 3214981, 7502921, 1813164, 6178750, 2288751, 3791730, 5414105, 7978348, 7921460, 1517317, 4528209, 4256836, 5366304, 6133327, 7184993, 3382106, 4213930, 6061103, 1355144, 2767485, 4043649, 4030942, 6150926, 4155854, 1083034, 3024703], +[6654982, 539205, 6901414, 4306406, 4323334, 3921318, 7110591, 5152702, 3609791, 3010945, 4371365, 2139674, 5260311, 1197618, 6908818, 4549945, 7765268, 6757965, 6592512, 7874641, 3563365, 8312473, 4016648, 4861898, 7381749, 5735335, 2484010, 6311382, 4053141, 1896647, 3894312, 3766752, 1949982, 2020464, 1795443, 92857, 305618, 6331650, 2818262, 3260344, 1398512, 7809670, 4251594, 2236967, 6334238, 1540198, 3637566, 5531525, 5196269, 2320271, 4170663, 1907662, 2844257, 8306707, 1422412, 6391288, 5457153, 3946427, 6249111, 7214125, 4747359, 604283, 1835975, 7147849, 3983093, 6073723, 723934, 7773302, 1731225, 652719, 4246550, 3551658, 3376431, 6095023, 6843957, 6106842, 4399843, 8378566, 2193484, 1053979, 1498116, 4321558, 4380495, 2103368, 5086802, 6687468, 3216952, 5122881, 3824484, 6882557, 6836883, 1956787, 1685902, 7849858, 2502209, 5462683, 4097280, 491504, 2806368, 920795, 47717, 5905963, 2930183, 6438020, 1194362, 2031576, 2133726, 779815, 5124076, 2387360, 5054418, 4877365, 7712456, 425830, 6533701, 3362174, 4758355, 2951183, 3615750, 7549961, 717891, 4730267, 1919873, 4745214, 2595334, 7064525, 6167385, 2013834, 1599040, 592100, 7887009, 7119364, 1223384, 1195974, 1502239, 796684, 2433962, 3793870, 1244591, 3526526, 6902238, 8028112, 7310430, 2821925, 5324348, 5889802, 2203792, 26213, 4216334, 1497964, 3627844, 770315, 4526582, 5829384, 3456788, 150102, 573607, 6495271, 803933, 1614554, 7016002, 4171166, 5073545, 7514170, 8115585, 8135467, 5936948, 74211, 2386698, 7553412, 7841748, 5457611, 2982658, 1640158, 3826896, 5750430, 8067886, 2733821, 1623614, 6425489, 4134574, 7293905, 5232540, 2338984, 1593276, 7862875, 1303498, 3254058, 157705, 3456210, 2524485, 1427859, 931988, 6398331, 7803551, 3135309, 7747422, 1576299, 4022062, 8005053, 4750684, 3815199, 6326549, 5908997, 7754029, 5022233, 162665, 3270598, 7516607, 5985944, 6965144, 7481194, 4745697, 7308152, 1958084, 4084268, 1295658, 139611, 126325, 5535060, 5590818, 6334339, 5520800, 2938221, 7656010, 7775216, 7697938, 3606671, 8194295, 3410617, 6860231, 7501326, 2616072, 1798433, 4168686, 6140427, 3086882, 6739997, 1803202, 868877, 4341394, 1188918, 2872873, 1625621, 5097603, 731894, 5982912, 6565414, 2583586, 493007, 3837323, 7397870, 5375472, 4099217, 4700104, 3802870], +[1486140, 8149136, 3503405, 4506612, 3862405, 4828041, 3654089, 486418, 3552090, 4332863, 6321532, 5126500, 7984196, 3193681, 7249164, 2182493, 8140482, 5327361, 125662, 6332292, 5142976, 316959, 2505584, 2182319, 7688548, 8195824, 2173806, 1111327, 5327936, 4242533, 7586660, 3489452, 1774243, 7862472, 1287643, 7764336, 5468369, 6785951, 1149385, 579886, 6727150, 7882027, 2848261, 3490760, 5210597, 7341045, 5030595, 1348456, 1642473, 6275795, 4819552, 4477833, 6010112, 3488714, 2799195, 3302697, 3569888, 1013682, 938087, 3092100, 5748548, 820308, 5002497, 7937141, 5597558, 943901, 3113018, 3197801, 7454318, 1067792, 4430927, 4719421, 2234870, 3833377, 4013506, 3437639, 1019552, 4365707, 1882491, 6028337, 7052842, 4436572, 2853066, 8075538, 1143158, 698825, 5673115, 6470867, 8293733, 6442882, 1144946, 4593443, 5263370, 5137426, 673691, 2150569, 3963177, 3305814, 1784887, 1254857, 6249154, 2928189, 6343534, 5627999, 2231202, 3230991, 2930745, 2704483, 4643592, 4543152, 7437608, 2978153, 5988198, 2889300, 1003796, 6633300, 8349655, 2897223, 3052365, 7116061, 2864847, 1279330, 3301933, 1744839, 4227622, 7216516, 1158810, 1484625, 105676, 6640355, 5112487, 2257069, 2958342, 609261, 2791503, 7703000, 6751742, 2238713, 4307051, 3109553, 4308909, 2870178, 2514200, 6340007, 2184998, 5306384, 1770202, 7239710, 1359319, 4351366, 2087646, 5009894, 2104964, 7152075, 3835520, 4125107, 7393443, 5064970, 4767380, 7955897, 3695642, 747189, 4831258, 2483219, 3014038, 2148196, 352634, 3617528, 4056563, 7872963, 6286847, 4727711, 603826, 2973886, 1432856, 7679968, 3991877, 6191910, 6210952, 1994620, 3662080, 557896, 4252282, 4646788, 4394854, 6168614, 4039207, 3875850, 8329670, 1644724, 6869178, 1153666, 5209575, 128130, 1846551, 1154763, 3256140, 7700699, 6599515, 3718797, 5528452, 7095760, 5680912, 4360389, 7454723, 5767061, 8312998, 2472645, 8003296, 6465243, 4409776, 68763, 699266, 4421054, 4011911, 1320409, 1542216, 8077566, 6482377, 1788415, 5952358, 2661309, 3716929, 3994122, 6931633, 1445719, 873561, 7293600, 1451425, 5277451, 1466740, 4294208, 5329495, 7578754, 520047, 2654889, 6248303, 8158014, 2971676, 7675799, 5119166, 990639, 5158003, 6850996, 1676706, 160974, 903236, 4015339, 6800849, 1440331, 6121157, 1230497, 2484963, 5821247, 6685986, 8066427], +[1115279, 4220009, 8014196, 7256285, 6397743, 1824649, 2765309, 6428064, 6452502, 7926922, 5878030, 3571021, 5157849, 5077780, 4627997, 5592870, 3854561, 454813, 7267527, 6132526, 701335, 4827958, 2485285, 2193855, 602176, 7781465, 117904, 4001660, 856409, 4192087, 6944747, 3695752, 3085879, 5883957, 6732592, 113772, 1235657, 4083377, 5315873, 5308291, 3039730, 903599, 5577640, 5487912, 2316590, 8161042, 7354739, 2285649, 5395756, 5805866, 8351169, 4966337, 1730209, 3362031, 629727, 4768603, 1577817, 4654378, 4142301, 5054253, 1355936, 4001219, 3949048, 4753482, 244090, 1076204, 7134919, 7054525, 522635, 6885318, 3555936, 5923167, 4950716, 3726545, 4722630, 2180072, 2234259, 1536266, 1297199, 8356212, 3185555, 2957570, 1244246, 7380522, 7045433, 2652480, 7355997, 7027968, 5121277, 4999341, 2163660, 7119927, 7323164, 1265660, 243032, 804345, 1743226, 1777876, 5552182, 380764, 6514087, 2408134, 6098052, 1673296, 8018816, 594214, 2335351, 6042104, 6527242, 3497219, 7969035, 4329000, 4826071, 3438745, 2740441, 6850212, 6472432, 5695583, 5767722, 3837496, 8124677, 6147027, 7334812, 2532889, 345627, 6715891, 4033489, 291275, 2910897, 768374, 8350890, 6911968, 777267, 1090688, 114594, 3574675, 1369255, 3942757, 17905, 2947101, 7288889, 338604, 6731305, 8377500, 2393302, 5915241, 7412156, 1796, 4001908, 4164638, 6094278, 1008565, 4346780, 2129108, 4639089, 4935627, 5740275, 3375681, 5699358, 1752881, 4891070, 3151005, 6842688, 5770570, 6200544, 8244458, 7762839, 3526971, 4576311, 5602354, 7461454, 1961495, 4164208, 2147585, 3798330, 4270559, 1807282, 7788409, 2237439, 3121497, 4504072, 7407097, 7952917, 5224831, 6208891, 5596979, 7957844, 507696, 6797097, 1076502, 8046459, 5124087, 5813864, 8286866, 1341719, 3242397, 4859160, 4282778, 6502531, 2963066, 8182175, 8147860, 7221283, 5501561, 6403067, 5090058, 5010493, 2179760, 8239227, 6663299, 3983947, 6455816, 1678150, 2060495, 6862793, 7411013, 2800887, 7039577, 4631398, 3962052, 7404665, 4306541, 7281928, 2872345, 1907989, 1691832, 347389, 4802469, 673962, 6449261, 4124133, 3179202, 6926036, 1997263, 1747417, 7195528, 5537723, 5235246, 4726176, 5583354, 7349260, 5985056, 6744411, 6375131, 6070733, 7116186, 7538856, 6988788, 106604, 508412, 4679619, 2244078, 7293023, 6794698, 2062934, 6666072]], +[[6950338, 2115386, 6928349, 327570, 3902349, 298487, 5782285, 8201882, 4150826, 2132911, 5243966, 927144, 8320127, 425757, 1624704, 3722774, 1209442, 1612492, 8342370, 2664514, 3834878, 189590, 675970, 8210480, 3703414, 1805216, 1781034, 527214, 5665219, 3275816, 4982239, 7360325, 2573398, 1705658, 7341358, 7729418, 2237508, 4500299, 1716518, 3308974, 3635234, 7643415, 8117797, 4945591, 3872538, 2326919, 6236007, 438304, 7896750, 2477868, 6668954, 2398930, 7139209, 2194809, 4837301, 2631761, 614331, 5073659, 5474528, 6310440, 8191910, 6890851, 5247790, 3636483, 7820803, 5841983, 146876, 1890746, 5044783, 1900967, 7005922, 2317751, 3210910, 4862815, 3708879, 5504197, 2795624, 5412449, 2984260, 4301670, 6771281, 6505847, 3908709, 3530868, 3305993, 591169, 796803, 3811288, 2736515, 4248720, 4109287, 7772888, 3078967, 3872677, 7505885, 6301343, 3331451, 7225591, 733064, 6423636, 5347672, 5218852, 7165588, 4369412, 580601, 142508, 2577898, 6559819, 8153692, 2879671, 5316370, 7920599, 7763271, 969058, 8163504, 979222, 4563547, 4714951, 3236434, 5888763, 6017843, 3644506, 7576382, 6609166, 3283032, 4191922, 2170772, 5810880, 7344287, 6301697, 6165698, 7087778, 7648687, 7681586, 4803714, 5060275, 1197589, 5055449, 5780261, 2686700, 4416773, 698260, 7089839, 4314105, 45909, 1329101, 1205466, 5644146, 7595315, 200616, 1692297, 736346, 2208144, 7827334, 2822959, 175112, 5598154, 5894280, 2615820, 7912719, 758946, 1694631, 5876887, 8080359, 6489003, 4333934, 6690525, 1015963, 559097, 8278060, 1376143, 2018104, 5597018, 6717466, 4107900, 5404675, 1042433, 7617789, 3242033, 3618173, 3196846, 922182, 5793301, 6282997, 5087550, 4378846, 846902, 3167545, 6471354, 2246584, 4942287, 906664, 2654731, 3374137, 4428998, 4920225, 7072967, 3200836, 7057084, 1554487, 5044343, 106917, 941319, 3130697, 1314615, 5433453, 5829860, 3356098, 2828209, 1453235, 3785304, 3078020, 346295, 1802710, 6447235, 2058816, 2001343, 2422933, 6980316, 3882780, 5956017, 6365096, 1046516, 4439500, 605888, 971147, 4679540, 8370061, 5773730, 3567459, 5543221, 935437, 5319128, 1982054, 3367432, 7261030, 5363679, 1241367, 3571010, 2599550, 3711734, 118118, 2719447, 4890859, 1675276, 1678935, 5835180, 6345851, 2031418, 751519, 7078194, 3913712, 3882941, 6981448, 4676499, 4877466], +[5852529, 919415, 5479291, 3781435, 6097879, 4997421, 7817984, 7656906, 5267745, 7345667, 6158925, 3188692, 2897107, 6262476, 2670056, 358741, 1579438, 854392, 5075932, 4042102, 5910638, 7702596, 754412, 7188851, 1413184, 6751323, 2133594, 4674258, 2255176, 6296540, 2695937, 2863911, 1079993, 7929477, 2335371, 7101945, 4889286, 3006208, 165296, 4673246, 2756378, 7293589, 2485405, 4711611, 1934111, 676908, 1817304, 6301562, 5301581, 6466342, 3553698, 5476227, 8227094, 2574853, 6787722, 3753939, 2436729, 6167624, 1541477, 4981049, 1627595, 3602581, 4887600, 5423862, 4311489, 8109057, 153332, 8289862, 1033337, 318092, 5625810, 2450130, 7239217, 924738, 1612167, 4546862, 2738330, 1385213, 5367156, 7901441, 422327, 228546, 4984232, 3290176, 4016637, 7148658, 3755959, 7709556, 8152385, 990025, 7099455, 3443675, 3951605, 7527162, 5563113, 5694999, 8331771, 4835524, 1353478, 1249311, 3399190, 6740852, 1394757, 2867286, 2325698, 6590132, 4102038, 3004556, 7132360, 8278500, 136908, 3358265, 6882202, 3544391, 3550670, 177957, 7835740, 1056825, 3906101, 703631, 963470, 7315146, 6558500, 7452788, 7924451, 1498128, 8023581, 221396, 4551551, 1149506, 5375661, 2538133, 5961278, 1691456, 7106247, 8215499, 1339335, 7437330, 1376801, 2470836, 7169017, 2120361, 3482432, 2267560, 7222572, 2479603, 1681579, 4220203, 5656987, 6653026, 7479982, 335810, 5566065, 3453683, 5310715, 8021657, 5846601, 3282800, 5260207, 5015458, 1843263, 2126453, 6359744, 1046125, 5201234, 1768474, 1942171, 3038886, 503461, 6558789, 3375465, 960573, 4042826, 5773858, 2996012, 6466482, 2030896, 7278042, 4905381, 393623, 7170821, 3770373, 4919466, 401710, 2350469, 7327663, 3973267, 5418632, 3200826, 1574217, 3293310, 1163805, 673566, 5275016, 3876271, 3371710, 5261461, 6158893, 4120037, 394604, 564095, 5493705, 6478720, 8271251, 7923538, 5027993, 5401209, 1615421, 7022725, 6790559, 5364742, 6510183, 6419924, 5481222, 8070218, 6973304, 3307638, 2696373, 8029003, 3576574, 8068819, 7386039, 3276176, 8375631, 730487, 6232511, 6819755, 2877500, 1390917, 2594864, 1167548, 1877499, 8084268, 4350464, 930167, 5663941, 6653229, 2181457, 82891, 1038371, 274122, 3437196, 4725870, 401847, 359828, 6196393, 985113, 328721, 3622734, 1090952, 414265, 2764881, 826030, 6215815, 5881649, 4911845], +[2689114, 309431, 5207970, 6047783, 4509433, 4055700, 7448908, 5426334, 5933344, 3849382, 6877084, 7636054, 4124963, 7221349, 5703021, 7101008, 5309984, 225313, 4813692, 2651654, 2969225, 5700160, 2964263, 486626, 823441, 289198, 5863788, 2584683, 1940871, 7087898, 4252313, 7364554, 6146874, 7212740, 7134075, 2797209, 3545881, 6245615, 6451226, 4428077, 131209, 3973489, 3789401, 1828397, 2734801, 7203742, 6166986, 1143787, 76629, 1967437, 4039978, 3779891, 2309218, 4554896, 7528417, 7769692, 6046951, 136389, 7500394, 1596821, 7778539, 2328807, 8156114, 7858684, 1434214, 1554934, 6224859, 198166, 110173, 1705130, 832603, 7596196, 787449, 4669586, 7445245, 4863899, 7338848, 3798871, 5408114, 3803637, 3667703, 2885832, 5630468, 1224092, 6381988, 5237848, 7916264, 7652661, 2008138, 888710, 5698621, 2323203, 6092936, 3830015, 6139733, 314303, 6048173, 8293436, 2025224, 1651107, 6170593, 5456943, 5879758, 7740893, 8340258, 4684260, 4913471, 7296614, 5087850, 7424377, 3654744, 2588663, 3233811, 6670840, 1286489, 904731, 3690185, 600174, 3964276, 1248077, 4523364, 6892727, 5049615, 2677776, 2539786, 1700726, 3855021, 3277095, 3044879, 6449013, 1263501, 608396, 3857792, 5544415, 1708141, 4749128, 3792454, 2150647, 4818885, 2656489, 912089, 6928154, 6032035, 6074957, 2259952, 6557696, 3824452, 1261555, 4082815, 2265011, 7407651, 2104875, 5150935, 5324245, 5698511, 3207878, 3007813, 8009167, 5459225, 3587819, 3941736, 4061266, 111690, 4300259, 2085047, 1900936, 3733077, 1049194, 6281739, 3699110, 8102098, 2390265, 2129309, 875916, 5909182, 5902829, 4170532, 3173924, 269495, 2787219, 1801429, 4659366, 7914442, 2973743, 7081798, 705548, 5344147, 763783, 5235514, 4887159, 2826814, 264600, 5671988, 4354379, 4635058, 3102126, 7563283, 7940454, 3695485, 3543738, 6087623, 7087421, 3818189, 4552980, 7143374, 1384887, 4082778, 634385, 6786575, 6721508, 593419, 1480203, 7273268, 4911757, 2231638, 3863107, 14878, 4280618, 7514362, 331265, 3004919, 745432, 854665, 5692830, 8111603, 602436, 4403085, 6108008, 3929829, 6398694, 6816228, 6128674, 2140034, 7424515, 939780, 7308423, 6455363, 3540116, 4830084, 1509063, 6378858, 3559999, 2157944, 3927138, 2259924, 6766492, 5843144, 7039175, 2330844, 4490355, 8120943, 3986952, 679820, 1169881, 799969, 252337], +[552833, 4429991, 8205740, 6871326, 6292004, 8174831, 1618170, 2844306, 3473762, 4973316, 3529343, 8149057, 5022386, 3969157, 20732, 4153278, 742133, 5162184, 4443546, 1427969, 4004863, 7667860, 7043901, 7203088, 7740452, 3055156, 3909777, 5604121, 4714695, 7860623, 2012052, 5768688, 2964364, 4519770, 6413904, 866486, 7180574, 1366494, 4086023, 4836166, 2429382, 6745427, 839726, 2389846, 4513204, 2729730, 5858052, 7283046, 5989639, 395378, 5944805, 128730, 2838265, 7824436, 4118321, 4084599, 5099811, 488812, 6215977, 4872039, 5298779, 3705172, 7504055, 2600287, 5049394, 5357980, 7170657, 6716870, 7490499, 6472915, 3844609, 2938393, 6974190, 6241921, 1410650, 3944213, 1641970, 705766, 5734493, 7830954, 673344, 1238288, 5584219, 5918354, 5503318, 5314116, 7236513, 5048247, 1122901, 4401727, 8127401, 410785, 5009016, 3316217, 4836382, 5593270, 1606900, 1093083, 1895810, 1351322, 4395875, 7669739, 1853325, 1575939, 3654092, 6218435, 7880041, 1406515, 1278854, 337219, 4159229, 7110354, 8261591, 845352, 6347667, 4418805, 7736784, 8301084, 7067920, 8028826, 6201026, 4662565, 1865897, 2626718, 8138363, 2845101, 5047547, 7688023, 4845167, 343361, 2875551, 7179701, 7394683, 5737008, 3557744, 4254753, 2930543, 1462815, 836198, 2218802, 3636145, 8293019, 2400959, 4643609, 3643496, 1971265, 1812884, 1882748, 2672874, 6707351, 387811, 4127622, 7962002, 3502121, 5082843, 279256, 4862926, 744185, 806399, 6883033, 342462, 8129277, 5229117, 4284976, 4181657, 5762070, 4282534, 6326846, 2814878, 4307137, 2787832, 3535314, 6784738, 8211271, 7272418, 6740448, 2734959, 3292318, 265220, 3709843, 6216091, 5652669, 1785603, 7501907, 1325156, 1005630, 5662933, 1745883, 968364, 4986345, 402011, 8090856, 4326188, 3506722, 1357337, 6657228, 1798907, 1484102, 4596541, 6582888, 845855, 5544885, 7306639, 5819104, 4452747, 7744455, 6286851, 6773348, 5767414, 2147926, 3834470, 1861007, 8051679, 7139366, 1114724, 668613, 777828, 7938984, 5600202, 1745155, 7333497, 668119, 5610198, 1592603, 8340841, 1614477, 859915, 3805409, 5422124, 3459213, 5247894, 7545134, 2665814, 4864510, 5938999, 6661078, 1869357, 6267135, 1794994, 2454956, 1234011, 3099003, 7633771, 1943096, 1631792, 3005519, 1978614, 387990, 7438975, 183749, 5058158, 811281, 7866722, 1291764, 5235971, 4714260]], +[[4472096, 7236352, 4221145, 8347497, 4249314, 5913183, 8153235, 479277, 224134, 6261561, 3243881, 154304, 5821916, 6075114, 1111272, 7489574, 5320869, 5511034, 1234444, 4494265, 6532931, 3955449, 2173200, 4623260, 5057417, 861988, 3821669, 6632699, 5414039, 5230746, 7480640, 2347261, 822865, 1019224, 5111704, 6250051, 693355, 3990877, 2360966, 6010851, 263695, 7851242, 3432207, 1116638, 6003050, 7991566, 3560057, 1802619, 2131976, 7556408, 960639, 3268946, 2667737, 4816040, 238298, 6591229, 1625633, 5415945, 288855, 7356728, 2580790, 1459768, 2758575, 905708, 5452507, 8270487, 8017868, 2569493, 1125841, 4890286, 4370548, 1210237, 7811933, 138884, 7117739, 3398172, 547290, 4873197, 7107319, 4660711, 6546620, 1227354, 7430958, 6819018, 1791015, 1463085, 6925275, 550396, 5706731, 1180018, 3704658, 696703, 7184938, 6342057, 7367912, 7027244, 1436161, 6198923, 7737335, 2012167, 7216437, 7526914, 4276117, 7476537, 4224221, 2212924, 4061481, 5194910, 4512487, 5703922, 4652037, 6508131, 7405575, 3985531, 2601038, 987642, 7109820, 6069146, 2296389, 2510508, 2523803, 2811594, 4528424, 2014903, 4187880, 3573241, 5539719, 5917448, 2386327, 1827886, 8362883, 4318839, 5244193, 4653422, 8228032, 4707811, 6832298, 8225009, 237016, 1976561, 3953997, 1857068, 1963442, 3491900, 466728, 7463505, 4131855, 5414287, 1337817, 1115808, 3215107, 8350568, 7427748, 125597, 5085225, 3351131, 6444526, 2755543, 1456775, 2915721, 1718986, 5043016, 2883781, 5218792, 6904498, 8361295, 6510504, 408047, 198085, 8038101, 5933607, 1598272, 3178578, 3979115, 1952108, 4791769, 2185352, 516218, 1164292, 7917038, 3485269, 763467, 1674443, 1790072, 1389074, 1491312, 6867030, 6292584, 3633493, 7678148, 3673158, 4655649, 2143767, 2641487, 7869916, 4708545, 71659, 7487010, 17778, 6143394, 3066283, 7207273, 5246473, 3636987, 4974840, 6784308, 3578703, 3406307, 3434797, 7982791, 6880131, 6219325, 5254906, 1068095, 6776483, 4742406, 6080901, 7224895, 232025, 3165221, 1066028, 1092753, 7639298, 61036, 1640076, 4743107, 1428415, 4664948, 5208326, 6271117, 6526776, 6493110, 3794907, 5850050, 3501654, 979899, 539313, 5364089, 7834583, 3102525, 5842243, 6319093, 8107103, 4499638, 6558396, 3140899, 4698380, 6281695, 8204816, 124858, 3203623, 4159110, 3325925, 5921770, 7919546, 7727102], +[7352069, 7918539, 188906, 427145, 441022, 2537168, 6789776, 6358894, 2292569, 3987766, 7604470, 6499864, 8032114, 3174361, 2240912, 6694442, 222061, 2750671, 6652327, 8183149, 6220640, 4706703, 8148644, 6151282, 5907906, 6773680, 2723700, 5198332, 5998200, 114194, 3041895, 7311218, 6838691, 818598, 6849413, 2817835, 2354668, 3805581, 1480936, 802277, 767834, 1863703, 2674017, 7855497, 5321363, 4777124, 6203233, 1023724, 2777924, 4681702, 5449264, 7003886, 4086427, 2035595, 273527, 2940313, 2374640, 3856139, 6489901, 6506489, 2040704, 5701943, 5993642, 4753990, 6425056, 8172319, 1842261, 6348190, 3221913, 6527505, 4683013, 4740369, 3742789, 697616, 216788, 521168, 4782966, 4427348, 2846895, 6139322, 3870296, 7014960, 2072428, 4507799, 8373690, 5947970, 2062290, 7886327, 782147, 2852196, 3281753, 3914060, 4211988, 8221474, 7917073, 8234207, 2793624, 5301730, 5896527, 7314077, 2143512, 5503399, 5108992, 7635386, 245446, 829228, 7159331, 5324733, 3676799, 4583021, 1822025, 1630264, 8058967, 932404, 2364840, 4148599, 2638803, 6393100, 2057158, 7048780, 7705368, 7412795, 7417484, 613516, 844219, 3784678, 8141878, 7494764, 5450756, 5049052, 3354330, 6014154, 64026, 4612914, 6289406, 7223380, 3635451, 2153539, 4864140, 3114019, 1065066, 7181239, 5691908, 4716812, 6496142, 3174721, 7691795, 6393463, 5306900, 1375277, 7047559, 1462207, 1134771, 4692125, 5270075, 5103486, 845921, 2086876, 3547037, 7465718, 3028643, 7488240, 2176874, 4517209, 1966509, 2169554, 3645940, 4735141, 6910902, 6060768, 7958768, 5848029, 6874962, 3929957, 3353591, 7331405, 1205679, 7000877, 4328649, 2330047, 4718867, 4353123, 5507526, 6407662, 3875157, 2862171, 1003442, 4709918, 3184005, 753014, 7057631, 1750794, 1944985, 7608844, 2394719, 7460898, 2688083, 5762596, 4520238, 3429841, 1237011, 8195295, 6409716, 2101667, 2696957, 3676844, 5167930, 923735, 6170869, 7046004, 7448468, 6328421, 1190191, 8278349, 4822387, 5178922, 7900530, 325292, 6534144, 5058750, 5968542, 6395401, 5046600, 6414563, 4340014, 5564435, 7458764, 6191628, 409391, 1451389, 7246495, 1365264, 1504644, 3289898, 2249598, 5235260, 4493671, 4031135, 7531814, 7155128, 6305604, 6133950, 4253586, 4428621, 7551636, 6765745, 6139967, 1788510, 3297658, 5823080, 4464221, 1930481, 38497, 4551868, 7978899, 2279575], +[8217507, 6872628, 6383570, 1673212, 8052859, 3354171, 2792420, 2904433, 2750832, 2213338, 6161318, 6768156, 4669374, 6370607, 7989007, 2396125, 3604793, 3874993, 4938805, 4608610, 4268184, 4742548, 63132, 1633585, 7072077, 3035511, 2178048, 5411378, 2563240, 1126030, 4683165, 1286038, 7507225, 4040027, 2692383, 1999321, 4043465, 1499150, 1191909, 3458112, 1227895, 4405661, 6807561, 3354607, 6411908, 4039737, 1730405, 7368645, 7115551, 868723, 694753, 565335, 905675, 157891, 4066211, 1157055, 2874871, 5298424, 7722175, 4766913, 7760534, 2614063, 6861204, 3276758, 7257285, 2899562, 6097815, 3770000, 4645753, 277811, 2178091, 7892900, 4718461, 2978042, 1724454, 5186795, 5467588, 4072570, 7363417, 5452756, 4418042, 4781251, 2506461, 3054386, 4136609, 3736932, 2121550, 6454655, 2698794, 1441331, 3517005, 3577438, 4559960, 4026104, 3233379, 3027871, 3414050, 6063041, 1336038, 6877434, 1035391, 4608091, 7983499, 5562805, 3936642, 4696008, 4580216, 927943, 3702195, 8087670, 768811, 4735088, 1587353, 7569615, 5550712, 1022145, 4654355, 7546612, 434123, 7974227, 3244350, 6615621, 3548743, 4839624, 496054, 4414619, 7622979, 862834, 1972400, 4735278, 5102283, 2780086, 6539343, 192406, 1313615, 7422333, 3927645, 5437931, 6183063, 1636954, 3595974, 1320927, 2809923, 7009550, 5600783, 3685535, 4815296, 2580849, 5781919, 4226063, 8006951, 1405697, 4206742, 271993, 4427393, 223778, 5279345, 2231181, 696944, 2588106, 7184089, 1025537, 1156831, 8154096, 1856590, 7103397, 925467, 5762090, 3829867, 2738590, 7144026, 1865713, 3666878, 5694294, 1359714, 3963338, 582994, 3456788, 2717775, 3551021, 2110123, 296341, 2761886, 7164644, 5311792, 1017952, 2816598, 476353, 1176382, 2286785, 2098978, 978461, 7966283, 490900, 280558, 1010298, 826879, 7162751, 235863, 7041347, 1342361, 7930374, 5146316, 3022161, 6989373, 873426, 284681, 4657955, 5814501, 1851110, 6445248, 3490532, 4973379, 5080677, 4467568, 6140122, 7622911, 2139361, 7523899, 6170252, 5084307, 4689494, 3436040, 3509020, 2422278, 6383265, 4504653, 1699044, 3083935, 1279986, 1026884, 4096864, 15324, 4379226, 7161346, 5188643, 1149743, 1475915, 5786490, 5364580, 4691151, 711497, 3584484, 6410119, 2742658, 3895767, 4465620, 6304976, 777554, 6505589, 7284366, 6503610, 7334026, 10415, 2416561, 4292463], +[4663440, 1941853, 5367071, 5014854, 4576328, 1084628, 472335, 5208558, 1100699, 6255907, 5606440, 1861394, 4814860, 2651636, 2945762, 7614198, 506607, 3481866, 333773, 5085976, 8238014, 751028, 2049396, 4761733, 3623400, 1805985, 2003467, 7132739, 8345198, 5057418, 398723, 3906649, 1257617, 4001215, 6301402, 5370674, 2870062, 5561142, 7441576, 4040708, 3206727, 5634539, 7408041, 8204061, 7569518, 1280993, 6280213, 4948884, 1444757, 6656650, 8079749, 2423338, 5836506, 822889, 4601101, 6028429, 1103479, 3773379, 919880, 752259, 181966, 4348875, 2038076, 4508586, 2507061, 7305442, 4753603, 7231406, 5577511, 7203409, 3341402, 2748091, 7904555, 7255031, 7607998, 1081870, 1091198, 185020, 4273869, 2394768, 543621, 2777774, 6346747, 7118120, 3348302, 6233275, 1901355, 2276261, 6879834, 1884974, 5523805, 2476181, 5927129, 6523996, 2661792, 218645, 2831509, 5467048, 7924252, 5660897, 154385, 6308910, 4234578, 7089378, 4934881, 4365111, 1885865, 3080120, 2701542, 3712611, 6996603, 5058483, 284530, 1079297, 622094, 2826027, 5472938, 725956, 6701063, 5448833, 4298965, 1148000, 5261050, 1592379, 3190383, 2947355, 2352626, 2486480, 5025205, 4805146, 6358006, 7397359, 376494, 1279959, 1311458, 1818960, 1268663, 261324, 542798, 6758274, 2534380, 4215919, 1174626, 3381182, 3866496, 1207435, 5211375, 1752155, 507262, 2609398, 195909, 1119599, 4152611, 8010027, 4260767, 7463141, 3344543, 92157, 6452483, 4620570, 6945583, 1997623, 954402, 6706345, 61993, 7591455, 194625, 4115328, 1009715, 5964421, 6810821, 334341, 8032601, 6664614, 964119, 2685716, 1529173, 7006221, 1841297, 743334, 5350015, 3867905, 3026787, 6615150, 8062339, 6437584, 1083260, 2583729, 2643875, 6166028, 2050780, 7744068, 7250569, 2796373, 5459371, 2860966, 181299, 6116776, 8296094, 5214800, 5826703, 3539222, 5196634, 828233, 22487, 7428456, 4468391, 505189, 3984935, 863867, 4818783, 5023402, 6607284, 6559028, 1416455, 7337370, 6241263, 5133417, 5510429, 3614428, 2816617, 6807628, 7585656, 5754419, 3791384, 3399504, 4586159, 5104113, 7330375, 4628494, 3901491, 7172552, 1692551, 1786009, 6014604, 6326089, 3899800, 1930325, 3226105, 1776481, 6100076, 1432963, 5451293, 4841960, 4617661, 7590352, 6734361, 4149386, 2512935, 6266894, 1101680, 6661884, 7398933, 7630093, 7080485, 6569653]]] +trCandidate: A9CBDF7C927F677A561B66AB5BCD6E1F267279AFCCA1576595E6BA6E4D1B225C95123962C9523C7276AF324071DFC205F88140E81C44199FE92964744959CE99 +muCandidate: BA55E8D45110BBFC1C9A23DDB43B93AC4DC6EB68780D5A1CE0FDF50895E1AB0E9F1EBCD34FE2E952B9C1BB8DE721E892A741C1C055190AB43563BF73479AB937 + +c: [0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 1, 0, 0, 0] + +NTT(z): [[6959427, 6929453, 6113881, 4981143, 3545954, 6943164, 1647500, 2087619, 7374489, 5817057, 7760820, 6107494, 6733654, 3414907, 3084396, 6976092, 4524195, 1134448, 5455403, 7615404, 5437795, 2388161, 6067566, 8106135, 5149580, 1197549, 715482, 1487487, 816214, 4654614, 4530571, 821539, 2286874, 6215522, 187743, 4607626, 8233428, 4965811, 312425, 4395327, 4126877, 1251027, 8215260, 8099878, 6689499, 3007890, 1351214, 4648513, 8322275, 4701207, 3680576, 579589, 7911362, 5888358, 7470897, 3336213, 3033214, 398788, 2394650, 7097412, 1273943, 6761361, 4471955, 5961848, 1867684, 5678828, 5092966, 2490753, 4030038, 8281514, 1590874, 3539002, 7467865, 7902152, 4568002, 1968104, 167503, 4305271, 882438, 7856953, 512003, 7490931, 2264092, 4685771, 1220359, 7936191, 5501422, 2310695, 4576202, 8211066, 5196061, 1215466, 126890, 2682026, 4055496, 7978979, 7664157, 4733521, 7620692, 2430348, 1824001, 1348423, 757005, 1205861, 2705179, 942779, 1553770, 6779698, 6092485, 5192092, 7511954, 3526928, 5193445, 3341250, 1845434, 5155232, 804251, 3216005, 5592583, 1631689, 102210, 1239036, 5457414, 3773927, 487202, 3023050, 7925802, 4071896, 6759401, 3472389, 5181442, 2528890, 3953392, 7182345, 1498246, 3190030, 4815814, 3543809, 6149794, 2491832, 755633, 263965, 8164688, 110699, 8171467, 1499998, 2479632, 1104838, 8380069, 7603633, 1738053, 1715766, 51128, 333608, 2165322, 7827135, 452579, 1687120, 1161120, 1493909, 8072589, 6419730, 8074608, 6349630, 7419021, 937495, 719739, 585924, 8252699, 4722738, 2131266, 6586423, 4047185, 5072429, 399897, 8073343, 6473068, 5420569, 6091475, 6334801, 585138, 80095, 6183567, 5180643, 2170908, 6380189, 4136323, 1117869, 1513395, 1426697, 7796431, 5691067, 4775042, 3237265, 2549690, 2233088, 7239136, 1476201, 2637861, 3898301, 2728371, 6396647, 73661, 831887, 1788640, 6126136, 69311, 2974319, 1968649, 1821869, 3896956, 1994098, 2678717, 4007338, 5630415, 5422460, 2514601, 7630006, 1538712, 5417019, 2450091, 4794665, 1959170, 7000235, 7260013, 7434864, 2786333, 8029627, 2329946, 399921, 7397779, 228492, 5501356, 6038344, 3695073, 2966569, 1596732, 3620179, 5369560, 4811951, 5028487, 894833, 1148098, 1990919, 5096888, 2902066, 5903058, 2299980, 2536359, 353393, 6160211, 3799526, 2932452, 13889, 4785163, 5719273], +[1231705, 7495344, 2673873, 4296704, 5139723, 2188749, 3314440, 134207, 4164366, 1010512, 4356688, 247311, 5471383, 5312157, 3555880, 5253388, 8256502, 5169005, 4910956, 8234515, 6504957, 3522977, 2362539, 1216721, 2475404, 4477561, 5934325, 5464874, 4368486, 510732, 5083311, 7273881, 5355731, 5668339, 4729119, 284431, 233571, 711975, 7678548, 6406475, 2568475, 8151453, 6432796, 7220478, 7511354, 5567326, 328409, 4266434, 7505748, 3049120, 4687583, 5939594, 3828249, 6235373, 3186880, 1302544, 2403825, 5667017, 5072834, 217060, 3045176, 3293858, 3744492, 1162784, 7902866, 3246314, 3413377, 728785, 729567, 6687362, 6866287, 8359379, 2238439, 846111, 1541812, 139009, 7956955, 1906305, 4238829, 3671276, 6111678, 5312249, 7731927, 2980138, 159752, 8024507, 7886403, 6361205, 6823416, 7629025, 95523, 8123413, 6066076, 5520818, 5687608, 7151664, 4832493, 2684260, 1276506, 797551, 1480893, 2388536, 1584078, 161984, 476679, 7188564, 7463456, 3300096, 2119061, 6092629, 60687, 5663713, 6664878, 6553835, 5375327, 4890442, 1722546, 4940790, 457142, 2272351, 2892939, 2090706, 4807212, 962402, 4871114, 4391886, 6963093, 1023447, 7423773, 2447767, 1762930, 233934, 7544529, 2819369, 7249681, 1944981, 6084499, 992925, 5041687, 6175388, 5319270, 3065612, 5062878, 140024, 907100, 6739202, 4233225, 6624452, 4741186, 229657, 7576115, 1655190, 6408094, 4029052, 197705, 2073317, 5105982, 6568106, 8222460, 7261074, 5395364, 23519, 7856675, 3237091, 2822996, 2499841, 5076379, 2927224, 2063892, 2279649, 6218793, 581339, 6421934, 4842269, 1598969, 1652057, 639280, 1279223, 3836532, 1965868, 662611, 1774345, 3890913, 1236973, 3525856, 7778253, 3737447, 77027, 6338940, 3280504, 5970625, 7475373, 3912353, 3549065, 2292974, 8357691, 4847861, 4471793, 7608309, 5184614, 576052, 786776, 1574410, 1085725, 1396864, 6697937, 3495738, 2019313, 5710621, 5405275, 1774891, 6719169, 6438077, 1002015, 760265, 4576261, 2569300, 4246295, 1883563, 7823183, 56531, 521551, 4532527, 3508206, 4109058, 6959738, 5365087, 8140707, 1826358, 6801611, 4023434, 1858566, 4135209, 7200393, 3574708, 7862995, 6133600, 7736710, 6392927, 5829141, 7695631, 8337322, 237940, 4183511, 1759233, 6501546, 6962283, 553456, 2825965, 747814, 5061920, 7424057, 7817300, 4043540, 3259620, 4428981], +[4766893, 1072408, 4924305, 4440602, 5910429, 173222, 5081017, 3446850, 3377581, 738231, 972604, 7542340, 1934563, 6243789, 1833524, 7196375, 2121851, 3643719, 1938134, 563507, 6624407, 8360400, 3833896, 5866989, 1151395, 5009863, 5555783, 6533639, 5044655, 1452008, 1241470, 5537308, 1464591, 1699846, 7916714, 222183, 8105753, 5493439, 6567168, 4800150, 2830473, 6600616, 582393, 6080945, 4518347, 3981231, 5654117, 1597165, 1434488, 3865426, 5835267, 5666221, 5437543, 6033223, 2088661, 7116645, 5745258, 2305179, 4493344, 3397803, 971849, 5853624, 1142563, 6362253, 2497712, 2120576, 703726, 8147382, 999620, 8239716, 613409, 8246689, 3126885, 512544, 599270, 4466115, 4058179, 6294401, 2263860, 2781162, 7398265, 7492135, 2738197, 3655614, 2813712, 3186440, 4302184, 1464199, 4839442, 4039979, 1956182, 2821563, 613888, 3290841, 4371929, 1953796, 2436540, 7614468, 3095936, 388977, 5873844, 2462362, 3704464, 5701976, 5879484, 5192769, 5721437, 5183438, 2002723, 4921215, 771135, 4024003, 3725898, 5419330, 6720479, 7183607, 8047245, 7536252, 71159, 4062166, 1034098, 3161703, 5291107, 7712399, 2990500, 3561192, 1048930, 7014115, 6351316, 2234522, 6265952, 3291054, 6612680, 4935522, 6433279, 7833928, 2343335, 1867033, 5906844, 5747626, 7586471, 4026477, 1709316, 3833447, 3861580, 493224, 1480770, 6802232, 7673676, 8241265, 2171029, 3962278, 4451470, 6953512, 2736854, 4866441, 6942787, 3701695, 79444, 8135089, 1187838, 6351736, 7852948, 2937560, 1643817, 2200354, 6034134, 4396467, 6867365, 7138273, 4538169, 3331096, 2581124, 1664269, 3457223, 7674766, 969369, 2371708, 4832573, 1231107, 2069034, 2726362, 4122229, 2528758, 4081575, 8180164, 4090351, 1141548, 4962493, 3286333, 7764331, 5525309, 6903596, 5803028, 939498, 5916650, 6026676, 5697931, 1635266, 7858243, 622735, 5804096, 7962138, 297088, 5659734, 4501472, 3494656, 1647711, 77902, 1022524, 6821524, 2064429, 6038221, 8208656, 7653794, 90724, 2374730, 6348190, 240912, 8235817, 2867026, 5205078, 2164223, 5336131, 4172560, 2653428, 6149085, 5363978, 3452385, 6715760, 4200603, 697513, 5233086, 6443433, 8362070, 5340106, 3469610, 6274880, 163018, 192168, 995461, 6826300, 946597, 3128830, 3100059, 5037389, 7082680, 3333487, 4117801, 182393, 986359, 6072176, 1500535, 2874817, 3798545, 7944964], +[4026856, 2807882, 1088349, 8124353, 276002, 2293700, 5377309, 2376131, 1418632, 5987554, 6752925, 7556578, 4355976, 3355939, 2487045, 6128779, 2551426, 3447835, 3449874, 5669560, 8108096, 4491083, 4700226, 7891834, 5248113, 4487846, 408703, 7485234, 1154141, 514783, 1611723, 4339788, 7099351, 4874302, 5151668, 1689653, 5139967, 6043105, 7362587, 1222376, 6055719, 969243, 8195899, 7804753, 7392940, 4824722, 2977085, 5824853, 1756585, 5428380, 7252596, 7729487, 2679236, 6564084, 6362055, 5975713, 7424502, 365009, 4973493, 4562482, 3711737, 5336047, 6337026, 6704314, 6536443, 7298324, 8109969, 1150288, 8240285, 7150442, 2484856, 2522069, 5247508, 2399998, 5900217, 1208457, 3211579, 4325516, 479883, 1467074, 6965389, 4666939, 7258359, 5850908, 4254297, 929750, 698875, 3015722, 2497057, 6334707, 3587127, 5490103, 3556935, 8049966, 393812, 3330246, 7526214, 272185, 3532845, 1018943, 3514065, 90912, 7680985, 2406674, 6345517, 7269883, 3814604, 2342597, 3172635, 2647291, 4517340, 7196830, 5129007, 7855783, 1147398, 984805, 3601847, 7545372, 2617212, 7768651, 7462170, 2227764, 603562, 8005508, 7968700, 6251380, 4566284, 1625040, 8218832, 1084600, 2698164, 1577652, 6005410, 7664872, 3603239, 4860897, 7150344, 7020091, 8117305, 7355015, 3085545, 1290893, 336598, 6308883, 2135782, 7729554, 2261222, 6054018, 5174759, 6645090, 4574208, 8312400, 985727, 8289013, 6386436, 6771766, 7970451, 4157736, 1487386, 4892779, 5297094, 3295584, 871725, 1151778, 6272289, 505133, 1706989, 4028424, 7347880, 5208452, 4159876, 683534, 7003455, 45093, 5658348, 3990036, 8091158, 7484305, 7785090, 1967522, 2900477, 4963897, 1544087, 6717334, 4155762, 6572196, 1616258, 3114121, 5442563, 4391765, 2356540, 7197662, 4109211, 2941308, 1920787, 7675350, 8166907, 2199984, 5461652, 7172509, 643274, 1592924, 4583187, 4216028, 2807455, 4325584, 2692784, 556039, 6906507, 5601088, 2815666, 5729146, 2227256, 453791, 3697738, 5415649, 7362598, 3904632, 5226411, 2528927, 3044317, 3684974, 3431607, 7482762, 6578998, 724875, 5988988, 4241604, 1666816, 2584692, 7980793, 7008403, 8338180, 75076, 1766232, 2969878, 5921914, 7778740, 1080256, 225978, 1770852, 3783349, 7647539, 2412872, 655070, 7225669, 6062735, 1375195, 5239746, 3941838, 2702402, 5087171, 3147857, 1193949, 75093, 1991721]] +aHat * NTT(z): [[8205148, 3682531, 6246060, 749942, 3179582, 6639911, 7079666, 4195088, 375904, 7358218, 7510083, 2890955, 2299967, 775515, 1123241, 4864387, 280980, 4284786, 5276268, 6092218, 2368962, 8257738, 7843599, 5429360, 2176683, 2458918, 6176321, 2979301, 326467, 6544070, 4426555, 5565838, 6861970, 6195233, 1082871, 8151208, 2158289, 5250476, 5201485, 6844098, 6126112, 6740678, 1710605, 2176198, 279888, 6912941, 2331073, 5737299, 6110144, 47639, 6244629, 2943723, 1731234, 3634703, 6494858, 4093016, 6975600, 1811896, 6672715, 3285103, 3321945, 1638046, 1853883, 1434631, 3395331, 6807804, 559718, 6285981, 2297818, 7357477, 3394232, 498557, 676323, 1307854, 7675005, 858948, 345405, 4901608, 4788313, 6491567, 2028266, 1140705, 203441, 5616498, 3987329, 8017384, 7786403, 7227827, 1145671, 8341405, 3720052, 1280588, 8180188, 5157924, 3633332, 7550204, 246437, 6685090, 5014940, 1231296, 7076501, 7585961, 3853999, 5705174, 5392746, 7172194, 6821750, 6545972, 5309344, 4377545, 4045993, 1940775, 2864877, 8363328, 4868314, 7241921, 4808661, 4868043, 1379402, 6533329, 8247864, 2906877, 2837650, 497706, 2653477, 5880621, 2957676, 2552364, 2564580, 2257177, 1108697, 2560451, 766181, 6945552, 15106, 4974383, 7615508, 552948, 5607119, 7322344, 3148564, 6899358, 1121988, 415891, 3050142, 4750775, 4959488, 3935466, 3461475, 3901617, 645458, 4630902, 7203359, 1274198, 4612419, 6942362, 4654875, 619745, 2836738, 7679402, 7679176, 7540638, 5269595, 7179282, 4682761, 2972404, 8026033, 335301, 4170618, 4980411, 1668531, 2818108, 7021901, 4660950, 1911829, 4994893, 1121019, 6485553, 3910961, 3587424, 8169754, 96829, 3891217, 5047221, 6703485, 6151051, 7370289, 1107370, 7157358, 3292390, 1039250, 5472165, 7727742, 4293032, 7316198, 6586981, 7800199, 4189193, 6614612, 5194276, 3538879, 4435297, 3714244, 3496842, 4110062, 5517404, 4206484, 7179608, 8173290, 7913226, 1959596, 2832537, 2853043, 7864057, 3434576, 3958180, 3707679, 8107789, 6472597, 5258825, 5446472, 2982864, 5855164, 5572520, 1461433, 7822388, 503843, 473872, 1827910, 1915065, 6602821, 399220, 6498754, 7783536, 205707, 3410635, 8012041, 3593088, 1865824, 2988308, 3075087, 7317604, 8105798, 579384, 116787, 4906619, 2954373, 2192972, 5712935, 3115715, 7727112, 2302792, 1101049, 2989417, 4439262, 1698749], +[198555, 3875383, 5473293, 1983473, 2018570, 7978287, 665150, 363524, 8164354, 6028711, 1364403, 4740059, 1911360, 7290277, 4965247, 4023333, 1408979, 7088204, 4279402, 8206536, 2953965, 4576707, 1625727, 3010528, 3026672, 2305168, 575959, 79113, 647349, 3750937, 7653527, 7084349, 2766418, 4870101, 4682485, 689205, 3546819, 3625707, 2526258, 1997128, 4549200, 587130, 1861002, 3515820, 6889638, 3736509, 4513429, 7640298, 4343031, 7286025, 628988, 929740, 978997, 566061, 7469705, 7060969, 2789224, 280137, 1643869, 3079172, 8192248, 1073830, 6925838, 3057661, 6169031, 409644, 4493873, 6131077, 6450758, 1345864, 469980, 4615800, 5281999, 289914, 65586, 8230015, 7856485, 6218748, 5395323, 7576525, 5576621, 3063639, 2974473, 4653416, 67053, 1067341, 589839, 524780, 964075, 2686868, 6974574, 2439360, 4118462, 2919751, 32987, 7032553, 3367078, 6362639, 1198434, 6400145, 3591320, 7775669, 6047444, 5410730, 5242292, 3996129, 1260994, 5183540, 65581, 2467478, 8299434, 5010055, 838698, 8127643, 8037082, 3474907, 7100881, 2838817, 4795038, 6677531, 8033971, 1722209, 3149810, 7157397, 7341620, 7839587, 1966793, 7021681, 6675606, 6194458, 2170348, 2425152, 5799898, 62653, 2428406, 2955855, 4696388, 328987, 3006934, 1992981, 4432703, 4765231, 3847238, 6203880, 3805734, 5243301, 3105703, 6403804, 6324240, 5433173, 6242584, 6995176, 1964295, 6629259, 2113946, 8149095, 5612100, 4945964, 6250469, 166881, 2905240, 5457384, 1321264, 7719968, 6630922, 5737455, 8054472, 854482, 6895513, 1743068, 6405584, 635832, 6397879, 6807721, 4146771, 4847489, 4352639, 5240747, 8047726, 7370547, 3783664, 5726431, 7611291, 8222543, 359337, 1911245, 6409680, 7874855, 3999133, 2304061, 6705207, 4963370, 277269, 5151916, 8358844, 1761465, 5291577, 2456813, 3174388, 6753713, 2519886, 2290778, 712547, 2175305, 5257352, 4386707, 1198979, 6666760, 1867330, 6960904, 265397, 6942283, 1196279, 2515326, 2064004, 5750094, 3453325, 3550306, 1711229, 161720, 3685474, 8181097, 4539453, 3231066, 1918339, 4770769, 6692429, 3808181, 2691821, 1753520, 7893637, 7630492, 7965827, 3325846, 7626041, 4194058, 2496335, 164516, 6953471, 933516, 3939531, 1068820, 951663, 2829780, 7077343, 8022308, 816008, 217040, 2555263, 3194582, 3677416, 4234811, 5094007, 2595768, 2315155, 1400150], +[4351705, 4966420, 3517333, 2886633, 3386198, 103045, 7302249, 56215, 7750504, 1780529, 6679151, 179266, 5238553, 5902511, 6542327, 5102217, 4161061, 6982302, 1335822, 3096365, 780578, 5464803, 5763422, 4345109, 851454, 398775, 3999021, 4462207, 7235918, 5176184, 4431370, 558144, 2908482, 1515274, 7223911, 822951, 4525676, 3564567, 3446878, 1986912, 3152873, 5881728, 4756471, 458025, 836178, 3477083, 6332545, 4655428, 8280090, 2198167, 4861686, 4654918, 5610130, 717489, 7470217, 7069594, 7739929, 627616, 4984842, 2089124, 4649129, 2446071, 2109511, 6304412, 6461359, 2192405, 2196087, 4205641, 5921868, 6113681, 3588157, 3414504, 1794487, 8224549, 6192711, 2314757, 2704982, 3215443, 1858645, 6586233, 3940260, 7147436, 5424436, 4776376, 6266755, 4122750, 1234875, 3450003, 1329119, 6997713, 2889906, 2004738, 300982, 7810009, 4383514, 3908512, 7627354, 4258303, 4020975, 2973638, 4850680, 5071056, 3408696, 4035673, 6546430, 1536447, 7402045, 6712924, 6461534, 502862, 6271512, 1756659, 3345825, 8101232, 1687814, 8338487, 5173630, 3269484, 3811004, 3983182, 617378, 2327643, 595077, 6065462, 1809548, 7677605, 8181000, 1610576, 51366, 1517685, 3145483, 6038010, 5212219, 7927230, 2123861, 5068582, 746843, 6463766, 2256853, 2376721, 4935406, 1557912, 7198673, 273610, 3677251, 1420565, 3650654, 18373, 126333, 6529613, 3396731, 2457939, 5798653, 3564636, 6364099, 4376916, 4404511, 8038987, 2084997, 4457581, 4541810, 5790253, 865588, 7955284, 6296105, 4636694, 3548051, 1355429, 2926399, 1781242, 7201991, 4431465, 6562324, 3253089, 1260596, 516086, 8236798, 5508071, 7113972, 4081228, 8371677, 6896860, 3016738, 5804259, 8165740, 8266006, 1568328, 441054, 1737899, 8222119, 8314822, 7232409, 5151995, 132067, 7033992, 7758810, 322979, 2365942, 4967080, 3408029, 7825260, 4355478, 6616391, 682537, 4431579, 3448715, 5108723, 8374923, 1014252, 1869136, 4918159, 7117093, 1876865, 2051720, 2446688, 7685454, 7112324, 158859, 4841004, 7001893, 1052214, 4047988, 3203773, 872315, 672637, 4195720, 4706803, 5469378, 3617979, 4847454, 1331664, 513084, 3572759, 1410161, 5825245, 5974554, 3317075, 2938641, 4293163, 4872932, 2590906, 4489, 713519, 5770519, 4945482, 7523309, 4752509, 2533379, 453818, 7379923, 3433500, 2140899, 2775583, 7768837, 117301, 3368520], +[3210973, 8123259, 4756226, 3262637, 1745097, 1913357, 5436248, 5333631, 41958, 3876465, 1247662, 6621239, 7970832, 4908562, 3270501, 595571, 8048017, 361522, 2507026, 106505, 7410625, 4008480, 477772, 5965628, 6656837, 5253843, 7757554, 4993275, 512329, 6902934, 3845079, 6077018, 5886221, 1899322, 192807, 6934574, 4021447, 1769919, 7114981, 6293034, 4560681, 1022484, 656381, 2275068, 6836549, 3453938, 2159295, 1173690, 6995374, 8370993, 7949901, 5532149, 8364652, 3518813, 6312063, 5749191, 2912298, 8195881, 50112, 7993007, 5636382, 68847, 1040018, 438672, 2503565, 3200524, 3052134, 6010730, 2219279, 6838040, 8263928, 5741528, 6562398, 4863535, 6569202, 3515046, 1602444, 3380186, 7875054, 7667961, 4521132, 5117901, 33107, 3377949, 7022551, 8054753, 4124468, 7189033, 224565, 3820736, 6551777, 331209, 7893571, 4415059, 2445581, 7457955, 7677389, 141933, 2258764, 102813, 7428722, 1795417, 3125030, 2292152, 4098602, 7096568, 6944779, 2168090, 3534347, 2172353, 678295, 2257640, 3623797, 6725194, 3042782, 6303617, 4288218, 7736421, 8013096, 709281, 6418965, 5752112, 2797657, 4478834, 6508801, 7325781, 6015008, 189098, 6460999, 3985556, 2252526, 7973345, 8208175, 565688, 6595211, 3164383, 3549065, 5321349, 7360519, 4822715, 1540621, 2255817, 6123380, 6674576, 384141, 6849650, 217769, 4077970, 8203489, 7556790, 5598713, 2482341, 8267746, 4795851, 4987987, 5332851, 3997283, 4038341, 8328399, 4148468, 3495644, 1639385, 7963812, 3989756, 4134540, 345021, 7621952, 7683594, 4339317, 1039644, 2814891, 7437541, 7649929, 5474324, 4106472, 22361, 3100418, 3244711, 5993395, 947235, 3540423, 8043057, 1344267, 5415118, 6226125, 4916216, 7651317, 5879302, 4727662, 1127547, 8191143, 6965590, 5689432, 7910728, 6693180, 7053654, 6960748, 3072312, 5369048, 7501361, 6261337, 3210173, 2982046, 6437615, 8286435, 5214786, 5126738, 5821910, 7024938, 7881582, 2683679, 1577222, 3671130, 556351, 4136703, 2549316, 7126433, 3238685, 5316314, 8104473, 5027672, 5323816, 2448182, 3981881, 2288968, 4570162, 1461279, 2250907, 3223291, 313318, 7292104, 6795536, 5402043, 2223376, 7508789, 1334106, 4275342, 3672475, 759818, 7887773, 6747962, 1309688, 3757351, 976944, 6569675, 5281881, 4048318, 4625011, 3762026, 7222069, 7971203, 5818097, 80999, 3155326, 5209731, 5040669]] +NTT(t1): [[5436534, 311483, 2358223, 1202317, 7183104, 878370, 7569206, 7369810, 3782687, 2912922, 4980011, 6733999, 6136647, 8007920, 4194504, 7002838, 4687700, 7823600, 1197438, 5076793, 5535813, 3986020, 6872559, 337892, 7206039, 993697, 7023044, 7534054, 6875265, 4309263, 6249472, 4882014, 6965417, 2534458, 4035958, 6796262, 3886091, 2304257, 2852356, 345898, 324723, 183298, 7959853, 2945518, 3043511, 130617, 3367019, 4835768, 3115514, 1006398, 3276232, 7774422, 4826938, 7593828, 1959519, 6267311, 3730701, 3354940, 5632392, 433286, 5520046, 1987516, 5865866, 6114102, 5776854, 7106180, 8328218, 3992540, 6967198, 3477515, 3774549, 836116, 1875719, 2109767, 2285100, 4852228, 5654177, 4202097, 6138278, 8180496, 2416447, 7838862, 4585998, 3358410, 4390153, 7896142, 5352107, 4554119, 918921, 3044328, 668535, 3717080, 3463463, 7994834, 5731073, 2808792, 7522013, 7376206, 254560, 1262775, 3790771, 5316077, 1091895, 4255387, 6087823, 1186409, 5750314, 4406918, 7813028, 6231454, 7710894, 2813585, 5704936, 7185707, 5203187, 4526248, 6116695, 4810521, 138425, 2303842, 290135, 4532878, 4889743, 777775, 2357718, 2651525, 2061755, 1162775, 5559768, 787392, 37040, 2519618, 3845321, 2743867, 6768359, 6339080, 5647839, 1439488, 1877674, 7381031, 7999578, 2168478, 323734, 1681028, 7993694, 2752880, 3640679, 306391, 2727085, 90416, 5079254, 330990, 6239548, 3575697, 482195, 7261279, 3212644, 4570554, 6068130, 5443448, 4624458, 1922495, 1232792, 4829358, 4722517, 7277310, 1898081, 246702, 1856541, 8196157, 1043409, 7812574, 1277435, 7132187, 8233461, 8179603, 2747462, 4478876, 4635182, 6600672, 2562886, 988959, 1514637, 5304575, 1063657, 2270096, 7781256, 300383, 968047, 879324, 3781339, 3986650, 7914775, 4093746, 398632, 5779994, 3380737, 1072920, 2175282, 3928748, 5164705, 1888599, 620714, 7180474, 6531097, 4648200, 3538600, 6579809, 2304931, 2957035, 3353512, 1223866, 3427099, 5917536, 7277850, 7072814, 745668, 1630204, 3298913, 4474933, 3475395, 5070284, 3863742, 7701173, 7197477, 2394362, 4713233, 2135762, 1049038, 6890651, 4805383, 3452718, 2452451, 6645029, 6848906, 6401786, 5207989, 5374682, 5507162, 5731392, 6658422, 3608503, 8363659, 3726461, 6951637, 7818421, 6015610, 1537100, 6816698, 2317720, 7013243, 1377602, 241563, 6689258, 738103, 2329080], +[3763656, 1959721, 2047761, 7444383, 545239, 5638797, 7894902, 3442018, 1074138, 4235419, 2951792, 7501614, 3471012, 6896109, 3721834, 4434209, 1391206, 854334, 840506, 294779, 2292542, 957810, 4607243, 7963872, 1518841, 5306972, 3466182, 1393327, 1413403, 6211406, 1782092, 1065567, 6414702, 6676033, 2406618, 4164506, 4668003, 1509968, 77342, 5217496, 5269288, 2504699, 5838701, 4820315, 2845047, 499516, 4881325, 212996, 3181187, 7721882, 7413135, 6094541, 970432, 4176621, 2799029, 553839, 7286015, 2810624, 2478720, 4693742, 292922, 7399991, 4161213, 3147550, 2379444, 6931224, 8036603, 4524558, 1625514, 3761924, 5523616, 2376145, 7822531, 4352947, 5118488, 3667879, 5808897, 5621755, 4193180, 4204896, 973840, 4799514, 3570973, 5039070, 4554259, 1543094, 7667065, 6705911, 6060130, 1428014, 4168460, 3012823, 6867896, 1592847, 544311, 2726429, 713413, 1211306, 605359, 2415130, 900474, 6724261, 2028811, 4283407, 6934488, 1598694, 3332512, 1437753, 6899997, 7646411, 4657556, 2581660, 4611058, 7583554, 1705728, 7088525, 1910759, 3980654, 5979407, 6710736, 6431978, 6944430, 3700637, 6768210, 5289024, 2637537, 7228860, 2490127, 8376392, 3243479, 8151713, 3802275, 2163874, 2985546, 6178478, 2784566, 7865377, 5222501, 1426617, 2456955, 3604027, 1717673, 7941262, 7024899, 4904682, 3252621, 3457484, 7236606, 6926573, 8111898, 7305827, 1346502, 7562404, 5476454, 5184053, 7152608, 6612823, 7652, 423984, 2356853, 238593, 3059563, 7922653, 8076648, 3616662, 3967209, 6265241, 5018600, 2552423, 5604838, 7711683, 7628338, 4720539, 4203467, 6136742, 7811940, 7652527, 6570958, 4849171, 7855713, 2818239, 3812062, 319891, 5558055, 5522790, 4319274, 7721840, 3624586, 4778172, 3119040, 4235515, 7279267, 296648, 1169111, 5903054, 5346312, 6342094, 3662237, 7007149, 4262747, 2389586, 5247649, 4279994, 1859511, 4223815, 3030688, 3834571, 6274124, 1257165, 3782570, 5450378, 5031428, 1103887, 6862047, 6218533, 5951578, 5809627, 1465301, 6053567, 5964267, 2124442, 7949688, 6902125, 7868168, 3544692, 2356109, 1819071, 3385628, 7879361, 7319958, 1362317, 5545158, 712446, 1834410, 2931786, 6195971, 2620416, 6965795, 6679694, 7872655, 2130813, 4672889, 3169050, 1541474, 2768776, 212532, 650823, 4347084, 405884, 1170644, 6016800, 5711613, 4911218, 8016391, 7260638, 1915251], +[4795173, 1191984, 4600702, 2008942, 4768908, 709219, 6925263, 1124933, 1206531, 5896368, 4542004, 4450041, 6083689, 1515801, 7670763, 6133828, 3670136, 6276840, 101311, 7817819, 2832949, 1985439, 6444928, 6709977, 3950556, 7087551, 6568058, 2613209, 8367843, 7195703, 1456796, 2541848, 8000698, 7636733, 4165868, 1953052, 8111316, 6783825, 1953274, 5863177, 8121187, 3292491, 4505093, 6320556, 3040204, 515726, 7338721, 3989970, 6916380, 7074335, 6629886, 7069006, 840174, 6444033, 6811181, 2774344, 1973095, 7515444, 3571853, 5978110, 277290, 4152173, 2430548, 95951, 679963, 7627651, 4281529, 2453691, 5348544, 214282, 1046033, 2466655, 7969868, 5472899, 3951651, 6249461, 66792, 8000229, 3346454, 3254353, 6718119, 4944219, 5674232, 7056210, 2685072, 1815607, 6084629, 6607531, 7227987, 2541585, 1252916, 55484, 1853343, 1081901, 483859, 6344734, 3985489, 3996040, 5618026, 7906609, 1908465, 8186898, 3423819, 2626339, 5435361, 1971543, 7202405, 6661046, 3842935, 827134, 6245313, 6826826, 5711565, 7037999, 6719560, 2605810, 1541639, 6525648, 2668926, 2817660, 6003060, 3016035, 4712826, 6436272, 382271, 7619137, 3893121, 862814, 7965110, 4568583, 4188320, 2522349, 4605791, 7007316, 766285, 6857459, 2935916, 3264133, 451351, 1864749, 4718332, 6959716, 7388075, 3079612, 3490407, 2380363, 5356258, 6180824, 7258207, 4022993, 7439003, 3292832, 7504605, 879373, 4405118, 3754121, 7178023, 7292943, 6572800, 4819020, 6539669, 3910479, 8230912, 4633390, 1363454, 6384514, 1841567, 719228, 266407, 2574309, 1794715, 8046434, 6311913, 1822679, 6532550, 233493, 2097699, 6293801, 4550518, 1938774, 5045209, 5336987, 4679964, 4018177, 5409185, 2273967, 5734507, 5731099, 1831315, 6032467, 1401651, 7555345, 1747087, 1496697, 2067212, 2841582, 1949677, 382009, 4256127, 4428097, 7123397, 7044411, 7396483, 4872867, 5997136, 2546212, 1062291, 2020220, 4374269, 3471004, 310629, 7401354, 6072701, 7695709, 5859564, 6931717, 6175070, 222354, 2337637, 3665626, 7871383, 7631303, 4222961, 6484805, 4875697, 1580148, 1602327, 2380491, 5164551, 2088167, 3613083, 2308479, 4186722, 2873243, 4171200, 2705067, 5928151, 445213, 69110, 3204218, 623202, 3753664, 6377328, 4658403, 3844813, 268119, 181215, 3332254, 6193544, 6713925, 4701253, 3606354, 6617926, 4510872, 946107, 4421360], +[3242704, 3240698, 3667167, 7522279, 6853824, 2381178, 703273, 198737, 2468163, 5161041, 6060504, 5781074, 254902, 5675382, 5133585, 8276894, 5890375, 4732925, 534433, 8056301, 8177611, 5595494, 3869224, 5804348, 3082845, 1634309, 7462246, 6523643, 1425592, 5276454, 6213007, 656613, 6086090, 3403372, 7892730, 7640658, 2380370, 456948, 3078661, 503476, 6614239, 846539, 6571047, 7660964, 7415698, 2259640, 3475308, 4596255, 1215062, 5640912, 7082945, 1173157, 7299108, 6407149, 4580255, 1529461, 671427, 6534465, 1205348, 5145167, 5547056, 6194310, 4890917, 2561960, 22905, 2004339, 2376232, 377289, 2687690, 3746291, 2247828, 6244003, 8316591, 661664, 1265216, 4723336, 8194941, 97299, 3939526, 1839146, 2109363, 3548490, 4249948, 4206182, 503686, 1426189, 1278179, 5778854, 3550339, 2955355, 7700607, 5577729, 6941331, 4456450, 392930, 5452465, 1804952, 5524437, 382213, 3621808, 6256000, 3350315, 1796521, 4277486, 7740897, 474177, 4503803, 6261671, 7447398, 1783313, 6489377, 5070415, 301191, 5037822, 1155644, 8194063, 2474806, 4561366, 5765547, 4849887, 4167992, 4495043, 8139978, 4730328, 1745898, 3456912, 6936702, 7847376, 7336497, 739094, 5509020, 7715190, 1873292, 2111471, 7882093, 4785460, 874374, 1692506, 807409, 401555, 3380125, 4735219, 3569473, 6871629, 6430863, 5917805, 4705609, 3414558, 6967536, 7019548, 767330, 7156019, 4526635, 7119154, 7940839, 8147137, 7261296, 2048997, 5537844, 5755876, 1733494, 4648173, 742957, 2642831, 4340279, 5753120, 7120210, 1002850, 2805705, 1797649, 6015590, 8125865, 4247679, 8084784, 8093240, 4305410, 1150742, 3815595, 3829021, 3254812, 4843178, 4605676, 3447269, 5224583, 8263219, 1151558, 5547813, 5383175, 2816694, 4964804, 8292873, 606367, 5643568, 2324205, 4629543, 1301438, 1048257, 2026759, 5803387, 4906193, 2374793, 844073, 1669237, 3375656, 8058354, 1464452, 8245924, 5787799, 5501887, 496010, 4881331, 5952039, 7881861, 7877269, 4231698, 5049459, 2739210, 7006015, 2495626, 8370910, 6851542, 6033338, 271991, 5025178, 2793282, 5026759, 115624, 4218270, 6281639, 2816981, 7020918, 8123280, 1931776, 1623881, 7289431, 7569885, 455713, 6735619, 5862612, 6141838, 2118531, 2115932, 383099, 7426898, 5219187, 4720284, 8274242, 1764856, 252747, 3960609, 2327009, 5155710, 500520, 2600826, 654075, 146760]] +NTT(t1) * 2^d: [[2550590, 4021968, 1701631, 2390889, 5080211, 5209254, 230169, 959452, 5370255, 3609825, 380156, 5015114, 5671058, 7356781, 1667068, 3294531, 2567706, 5882401, 4324206, 5459102, 2943709, 3371208, 361922, 2473654, 214140, 2980917, 1213743, 5579580, 5768640, 3166092, 8087588, 2108764, 6817128, 3987027, 1822871, 3868173, 6033706, 3774260, 1897756, 1015470, 3538627, 1482573, 7471516, 2462913, 701537, 5701505, 2667301, 380297, 3920923, 6462505, 4797310, 5276241, 3468690, 803585, 3881093, 3377170, 6902210, 4281137, 6359679, 4562521, 7867117, 6961258, 8243611, 5351592, 8153586, 3450078, 8167476, 6500546, 4646246, 2765497, 5747095, 2661583, 4585687, 2791410, 6068039, 1133945, 453225, 5206005, 2271376, 4808900, 988870, 5202450, 7466622, 7566126, 3764029, 5136858, 6499217, 6106781, 2186366, 7394401, 4226419, 4264399, 4977351, 721273, 1853982, 5379399, 7504712, 3072982, 7012104, 3218222, 4551047, 4656052, 2898901, 5976001, 7964866, 6159225, 248331, 7016237, 3080747, 2951221, 4440719, 2741570, 5630520, 1262736, 1707042, 4058808, 1452197, 3067298, 2621305, 374580, 5127909, 8089266, 6761813, 2415880, 5945088, 7632353, 3356705, 5299088, 6433478, 5774591, 1736668, 8124002, 7262546, 1480070, 1558056, 4679628, 7195248, 1038977, 3840213, 697297, 6062453, 6068153, 3817156, 1956245, 8143227, 8271230, 6918682, 4210389, 6469015, 3211176, 478363, 4595389, 2213933, 2552409, 2965033, 197702, 3470268, 6655629, 5867733, 527159, 4075096, 2275497, 629579, 6532496, 2854392, 5817399, 3406017, 1302287, 6707434, 7397557, 7961605, 7741996, 5987104, 6988997, 2916496, 5873861, 5789059, 1486566, 8121934, 2254540, 2217527, 6069306, 4889144, 2616255, 6224881, 481109, 2597450, 5275355, 2366542, 4644005, 2707856, 151751, 6930888, 5918815, 5611131, 354798, 6099736, 6683624, 3143602, 3502336, 4918344, 1153226, 6356386, 296085, 2164496, 5819969, 348797, 7333601, 915251, 4625590, 963378, 2931540, 398058, 4122984, 1860662, 6669567, 7568680, 4626887, 6230888, 2707178, 2159291, 2419876, 7319872, 230040, 5497989, 4437724, 2223617, 6232025, 3791871, 6104497, 2878887, 758481, 2619043, 5269153, 7726554, 7161743, 7523358, 7064443, 2886393, 4467230, 6039188, 3125817, 5185553, 5689798, 2876789, 5358118, 3025160, 4536866, 3671545, 5117735, 4728121, 5274302, 1105684, 7235190, 4259119, 5994268], +[315809, 5535877, 6043695, 91027, 8216044, 166520, 3359195, 5288668, 8281063, 1626068, 3577019, 8004444, 8155840, 533931, 1307082, 4312850, 7772849, 1055933, 5102795, 1269472, 8369984, 2309208, 5516905, 6873496, 5806644, 5491645, 2110148, 6830, 5241499, 6326345, 211250, 5110767, 4024194, 7841411, 4273872, 7335962, 437805, 162364, 5054389, 1600532, 6859746, 3233392, 3598773, 7875993, 685347, 2391576, 4844893, 1736496, 5567451, 2269828, 3900338, 4335803, 5143628, 6017038, 824656, 3243491, 1705006, 3626309, 8304266, 1781268, 2817762, 5170111, 5500957, 6566908, 7935723, 3261833, 7676241, 6975162, 8108492, 2888099, 3590889, 6051566, 5505570, 667489, 3427445, 3469823, 2476498, 3025545, 7581694, 2994162, 7920713, 5082541, 5755486, 6507715, 7253661, 3357212, 5751482, 1189477, 7375069, 7608973, 6205462, 717951, 4064711, 293355, 613868, 1095063, 3128647, 605024, 6274481, 6960840, 1916048, 665171, 1652801, 864165, 4859270, 6289894, 4920135, 3586691, 7243176, 4162254, 7040568, 5166629, 3247717, 443147, 3168637, 1287407, 6699189, 1315021, 8145196, 7194209, 3082097, 2499964, 3650015, 337448, 928718, 1988078, 2794598, 1185406, 548868, 4658078, 3670240, 6607228, 1873853, 3536026, 4753513, 8050015, 4522488, 699407, 4545166, 5994143, 8360510, 457073, 6021550, 8029486, 3435846, 4125589, 6279885, 7586911, 7062926, 4342023, 4776987, 1915612, 3171104, 2738967, 4189237, 6669489, 1230528, 4022265, 3784290, 7239425, 1916695, 6493266, 4424128, 508201, 2921009, 119002, 3180564, 6425815, 308801, 6908570, 2523790, 6955744, 3411450, 8048628, 6449298, 2548268, 3982024, 1869545, 1232252, 778753, 7345470, 2978162, 5856968, 780999, 5204714, 1372034, 1925764, 791081, 6237634, 7664664, 2412500, 5088309, 8199903, 6921098, 2812278, 928662, 4229065, 7533061, 5088575, 7606202, 7214817, 5581815, 6426537, 5896423, 7131104, 4600942, 3002716, 526347, 7543604, 4411791, 7015217, 2567370, 572361, 6432205, 6047810, 6441287, 76241, 2988648, 3893475, 1444154, 5683172, 8004006, 7914918, 2245109, 8352376, 1144577, 1448206, 4264723, 1753578, 3212301, 5765837, 4074196, 3587400, 1399039, 7296207, 5589080, 4199935, 1533287, 4310655, 5480945, 7591902, 6942249, 6706151, 6847006, 4404590, 6315825, 1596804, 2920295, 6356596, 2718600, 4393223, 1665585, 6696256, 1327460, 3327047, 1595568], +[3042737, 1547123, 2215535, 6494293, 5770699, 2293067, 4711823, 5372853, 3390309, 6703485, 7425705, 8302339, 7620806, 6044215, 2523830, 7719061, 5198333, 6014985, 278429, 426534, 2143535, 6707308, 223076, 976481, 6164715, 1688816, 3253996, 3823110, 5939213, 7726215, 359024, 5862988, 6857076, 303831, 1732632, 1185931, 7954696, 2549273, 3004555, 2976157, 5013758, 3904366, 6745805, 3778526, 7132261, 1097224, 6071291, 2207940, 7366040, 2368765, 6923952, 615682, 2383051, 1271653, 378366, 8115561, 6150264, 3973966, 4584029, 5900589, 466673, 6869030, 7558841, 6651811, 5660008, 1327840, 2240423, 4396706, 2452372, 3890991, 4316162, 1652373, 5710226, 7138075, 6754538, 7997476, 2432959, 3015028, 1807161, 1553299, 632409, 486687, 5515862, 4736271, 5895616, 6592786, 6940869, 8160966, 4023399, 3708492, 6257464, 1982410, 5650669, 4832223, 8216104, 714694, 7401673, 1650878, 5999245, 7078352, 4667575, 6971582, 7049966, 2438649, 1321791, 1816697, 3966080, 2393745, 4477268, 4504792, 7538728, 2835951, 1272369, 6399265, 4056664, 1873421, 8198686, 7808790, 7714256, 2602302, 780564, 1889404, 7269890, 4736877, 5668491, 7004905, 4960547, 3480757, 254358, 7270031, 1290242, 5355103, 2002538, 6456639, 474387, 2368977, 7607499, 6247306, 1703495, 6904034, 2092540, 2016621, 8119243, 3126334, 7811757, 7083754, 6982541, 7211111, 173129, 4559012, 6300569, 6697838, 7365465, 5045413, 651054, 6009259, 5358744, 8176680, 198375, 5647770, 5342984, 4690194, 7176339, 1822287, 6699724, 8136608, 1366264, 482625, 3497724, 3610156, 3053862, 4407623, 18406, 5863691, 5687055, 2039580, 4495358, 2492408, 1748640, 1546393, 6515901, 8342432, 6237730, 7008425, 4778841, 7051090, 4844059, 2066974, 1186050, 7031032, 1153702, 4006695, 6764885, 391753, 6158364, 5821735, 7059599, 3522187, 3657664, 4525848, 2024653, 263450, 1573826, 2600293, 2533658, 8091208, 3415026, 6699082, 7728973, 8090304, 5406417, 7955390, 1411280, 5751454, 6900129, 7300489, 1976428, 2973479, 669459, 1774081, 3441138, 6103773, 135136, 59197, 642402, 5208568, 2529762, 8132330, 3656776, 1832967, 7123509, 4839216, 4960260, 5395720, 3510291, 2086316, 7276894, 1703501, 4661181, 1487812, 1596831, 2265515, 7931815, 5598775, 3101010, 761594, 1179471, 2806599, 2467930, 8177246, 4648461, 2282043, 1132219, 3804871, 7003236, 7999263], +[6689695, 7017377, 6017536, 1303367, 6112725, 5379817, 3865937, 2252606, 5625492, 44107, 2058460, 821741, 1433351, 6556245, 1395814, 6742118, 7891331, 4312558, 3497462, 1433917, 6316231, 5786275, 1945914, 7113175, 4469819, 4733379, 3957634, 8144664, 4528783, 6900699, 2680903, 7126399, 2148547, 7156482, 2327005, 7316180, 7141098, 5652034, 3716159, 1310228, 4449983, 4242629, 2598633, 6054592, 8135600, 7010144, 1446587, 7687796, 6232925, 731766, 5858549, 6544262, 17441, 812937, 2322051, 621097, 2776432, 4613901, 2079590, 4090971, 2861778, 362585, 7998804, 3012152, 3268586, 2308185, 6764270, 6758032, 2201021, 528818, 2430827, 5187625, 5103679, 6602106, 6454060, 1183223, 5816502, 933793, 7991542, 6674683, 7862259, 5943924, 3321798, 5148657, 3030548, 1038990, 3701535, 7776752, 4330098, 7623864, 3973785, 2722484, 2254207, 2141948, 802432, 7351087, 3111196, 1936104, 5193355, 3174956, 2902045, 8295222, 1087780, 2641835, 7193202, 4324913, 4558542, 7456792, 8029073, 1833265, 3991353, 3493028, 3514074, 4664516, 5544855, 7004343, 1382029, 6811286, 7711229, 7097724, 2371606, 8220375, 8102124, 8179185, 5405014, 1594061, 6235524, 7905802, 4613117, 3996974, 1346295, 6111883, 1464537, 8370161, 7373288, 7278011, 5995690, 3799434, 2145515, 4415096, 1086232, 6344172, 1847903, 1123779, 2328434, 6326632, 6811145, 6607607, 7415142, 6096179, 654610, 1090733, 7229112, 787665, 2556334, 8085733, 336966, 7788590, 2820827, 3910150, 4356450, 5598785, 2121002, 3454441, 5836654, 6474249, 1058000, 2538540, 5231946, 1947939, 2861320, 1433849, 1494984, 114977, 2343193, 5123984, 7289756, 6779247, 7819618, 5313427, 2420098, 1060458, 6402775, 994317, 3661939, 5594011, 682705, 1215346, 3069247, 1510667, 3555414, 6151600, 5728884, 7960353, 3829331, 1489672, 5774336, 1603651, 7621080, 7433541, 3356399, 801991, 5929377, 6378269, 1491259, 4414057, 4448388, 5630439, 1575678, 7192092, 4894045, 1837382, 5472744, 1376748, 4665304, 7810233, 5232011, 4179264, 4331129, 5922826, 4179415, 5785847, 7339767, 1649872, 4027734, 6221007, 204687, 3608549, 3426308, 5420351, 558385, 5398780, 2881696, 3111373, 4547627, 5792537, 3915331, 1525320, 6728094, 6293645, 7542762, 3012588, 4071050, 7701413, 7072787, 1322490, 1777768, 1481027, 540425, 4714721, 5789470, 6655057, 2235927, 2946578, 3095937, 3858289]] +NTT(c): [6740534, 4045296, 2602173, 4057786, 3828614, 2205945, 8167143, 6593076, 3152783, 8270939, 5589630, 286975, 2981496, 6078868, 5695322, 4821040, 3400817, 1314165, 6916919, 7557989, 1846599, 4105184, 5776369, 4840805, 7760990, 7747766, 912494, 7667549, 6289738, 5097966, 2067219, 4308073, 5212698, 7306521, 4512398, 3281175, 5818272, 4994761, 5980882, 4218491, 8361027, 6294504, 7452914, 3906401, 375630, 1922874, 1461297, 1400371, 2857978, 3557489, 2019286, 6586919, 7656425, 3132691, 2829832, 6721617, 8046840, 2715316, 7328591, 2873021, 4584642, 7110958, 6529875, 1915054, 8366937, 6813065, 1697637, 7686310, 6760467, 7867530, 7591153, 2456768, 4196834, 3444292, 5335229, 2646134, 3005076, 4166756, 185197, 4267237, 3739858, 5271252, 7881540, 1372338, 4921204, 7485778, 8327496, 8118769, 5377216, 6659216, 5442299, 7921455, 4181906, 4037289, 7903765, 2577029, 1264520, 7646150, 7788316, 431555, 4032549, 3004849, 5584448, 7262803, 8107325, 7148810, 5927230, 3947731, 3637913, 6505681, 5789489, 6233059, 8133424, 7547652, 3807226, 6771971, 5052513, 1126737, 6428787, 6270833, 8347135, 5080926, 5443004, 1554467, 2620784, 4162411, 2677195, 8174155, 8167614, 8083736, 4103884, 6138475, 3868441, 3058591, 3287132, 3554264, 6051153, 4447803, 85723, 7811203, 1880235, 7257594, 1416016, 3643956, 6510808, 5622948, 2312829, 5667263, 6435933, 1460290, 715812, 1110571, 4478725, 2606905, 3308123, 855461, 7736072, 2691346, 1349031, 82963, 1226437, 3636801, 7629644, 4107021, 4662108, 3328979, 1921218, 7597867, 1231090, 2616761, 382219, 6863112, 2658847, 4571491, 1523666, 1145137, 4111354, 4594549, 4892337, 7318873, 4212052, 5245483, 6606989, 5636142, 5258319, 261093, 2462993, 1319192, 8218231, 81833, 1131088, 778267, 6573469, 7790901, 139901, 216918, 3161787, 496529, 317439, 6467255, 1573077, 2978028, 1854261, 4876274, 3929997, 5622067, 6534990, 7610339, 7840598, 7028975, 5470236, 1412610, 3491051, 2609731, 1019356, 3714433, 1692545, 4407518, 7468941, 8128921, 6829928, 6323993, 3439418, 4947990, 747233, 4254147, 4768115, 4953593, 6361340, 1205148, 5524342, 880353, 4969290, 4239383, 4135673, 2451652, 2297363, 4151280, 164558, 3840049, 8091764, 4638140, 3444910, 7491500, 2326591, 4783310, 2552869, 3417953, 5697174, 3354837, 8255872, 2914938, 4159237, 670649, 2634557, 4445631] +NTT(c) * (NTT(t1) * 2^d): [[5324147, 7803716, 2455124, 465449, 6859752, 7840043, 3419480, 72744, 7270387, 7283536, 1228177, 1426655, 7968572, 3683039, 4561167, 4989237, 4266806, 5272268, 5064962, 6263924, 1554062, 128055, 7815981, 495182, 1142496, 7018628, 2435573, 1100683, 923978, 4889791, 988610, 2007092, 4819155, 3263112, 6082486, 2616358, 8254692, 4881619, 2285166, 341216, 4876866, 6426357, 5497339, 4830097, 4511162, 5825553, 3763531, 6531088, 3560476, 7559667, 7399935, 4543706, 5469408, 6795439, 2992864, 7755990, 500576, 4145669, 6647214, 6156225, 8159170, 781240, 1231699, 8108328, 7210092, 2557045, 1147295, 693297, 951676, 6497828, 936923, 4536158, 7647802, 6108887, 5494065, 4013865, 6960094, 4653219, 5370174, 7922250, 5640862, 2049126, 1764666, 4222507, 419970, 2809364, 4011657, 30966, 2064019, 5098129, 7052393, 7394427, 3569758, 2151822, 2363969, 6565422, 8294112, 4481388, 2682138, 3568302, 2938418, 4133413, 297319, 3131123, 4427095, 7713817, 3652501, 7896960, 5929397, 7811578, 247489, 1725019, 6033539, 3999703, 5878239, 4872300, 4768387, 4458328, 8080500, 6685461, 124867, 2903431, 4552757, 6791588, 4026762, 2494463, 6422116, 7017752, 3404371, 5595256, 282947, 4473398, 2869144, 3506727, 3113765, 2953058, 3462897, 1953723, 3418822, 2095396, 2623480, 1634255, 2896338, 4200850, 2793155, 4906561, 923655, 4840381, 808319, 2629524, 2517553, 7792876, 5006863, 4294485, 2393749, 1155145, 4649063, 3876239, 5698122, 5676211, 2465828, 2064269, 1365067, 6129365, 1733194, 3535750, 3401762, 4297852, 3781701, 6739172, 4821706, 3735209, 7048414, 6582452, 7778001, 1467247, 531700, 1810815, 2219695, 2837934, 3930973, 8260162, 2170908, 6325034, 1327682, 121724, 8155888, 7271356, 3117788, 6091466, 7285087, 5959153, 7998312, 756912, 797224, 4703253, 2835707, 1530764, 3721003, 1124667, 7143833, 2529643, 4203189, 4966113, 4314832, 6933633, 3667617, 899584, 5985083, 4612864, 5493013, 6702186, 32018, 1978077, 4237398, 7371799, 923149, 5019909, 3165208, 5780043, 2887367, 531176, 2740610, 7382660, 5651446, 5637605, 2145656, 6834593, 1274789, 6243770, 3244770, 4538484, 4968887, 6421601, 4261510, 4958558, 3338733, 7785155, 2164985, 3711950, 5947657, 6297886, 7845111, 7859908, 7555079, 3414075, 6364779, 6355178, 2066417, 5296287, 2931394, 2837594, 6072273, 3114893, 7856886, 2253998], +[3199419, 1831771, 7504950, 1206947, 6645593, 3523456, 4514483, 4681694, 1624444, 6525827, 4323945, 3017200, 3130274, 2468093, 3873057, 4396976, 6130379, 7222417, 1778879, 8173095, 1011316, 5534297, 3638733, 6505411, 7479659, 8296463, 4398775, 133837, 44298, 1616875, 4864297, 6193737, 3548550, 985186, 1985057, 6191270, 7304142, 4802331, 6455787, 4414073, 3503684, 1955538, 5435196, 5031186, 7244204, 4143593, 1042119, 1419543, 6128688, 4384878, 7163319, 1968742, 1716395, 1938680, 1878721, 266953, 2974077, 3894494, 5956457, 1403740, 444870, 5339856, 7604542, 2846569, 2476965, 7773383, 6111687, 597655, 5044979, 3794605, 5429117, 6539421, 5579251, 2085927, 8359650, 6607831, 2995338, 4586835, 1637036, 6731777, 6485101, 7684449, 2122484, 462029, 7338830, 6764247, 2566518, 7648450, 7384273, 153930, 5342182, 5769578, 4866390, 4862487, 849619, 4248081, 1066663, 5128179, 4566106, 8071716, 5721943, 579262, 7845890, 6635272, 2888693, 4006385, 1689843, 6858265, 1783608, 4560011, 7014711, 5678859, 1769842, 2731557, 6334458, 977425, 6247321, 8330043, 1877804, 4520855, 6332143, 1083100, 2303593, 4719352, 2863517, 5251910, 7852941, 2834020, 5495142, 1045850, 6792639, 2002416, 5056930, 2324603, 3111544, 3519665, 6734747, 5382004, 2917854, 2581276, 5484594, 4660001, 6150652, 7467828, 1591290, 6032000, 6692374, 8372292, 5355663, 6025304, 4972019, 3996500, 562075, 2537714, 48425, 7651242, 3449044, 3723944, 757849, 5071136, 7077632, 140701, 3764087, 7423286, 7508227, 4466951, 892653, 5225511, 966719, 217293, 4210808, 1944451, 4399451, 1245431, 807280, 4490814, 5333065, 6576047, 4997302, 5660333, 7690480, 4714631, 4054755, 7236608, 1393028, 7548497, 3218409, 7919210, 1891065, 6899581, 2220630, 5872574, 5201215, 192469, 5067579, 3420287, 3253554, 2008161, 3543509, 1915165, 6405898, 1209227, 1633926, 352594, 5044061, 1824505, 6149008, 7383973, 6319713, 1543696, 7770674, 35614, 6996518, 5938758, 2013484, 7198619, 8042796, 4426307, 4265805, 8318396, 2728963, 3398059, 7887017, 6181139, 6262364, 545062, 556200, 3229042, 8229573, 6394483, 7342731, 4379775, 7903600, 6390361, 4092520, 2920557, 7299706, 957103, 748942, 6907068, 3474992, 1905298, 607935, 280837, 4980086, 398284, 3852285, 2431621, 2260924, 1764598, 3467395, 8126035, 5467212, 8023630, 7312454, 4288770], +[1123697, 8024472, 6427826, 3687539, 7960317, 1884200, 3224802, 7766844, 5152293, 5746694, 3481117, 2801008, 5394943, 7829698, 328196, 6482414, 5772391, 5274781, 731149, 2370651, 2649608, 1867804, 4753541, 5039606, 4750664, 4992948, 3039588, 5872256, 7799929, 4717856, 3124319, 5724140, 5077243, 259902, 7880977, 1644983, 5756910, 4898961, 3776503, 4442213, 4449997, 5248612, 6294366, 902409, 5971202, 3239524, 5726126, 5434841, 4024772, 2540488, 4157990, 4449535, 109866, 6024354, 4997341, 8151992, 6510608, 7196975, 4990660, 5211745, 8175966, 6020402, 2402886, 8206114, 6788945, 78100, 6246669, 3101927, 8277033, 6760027, 6323647, 6354830, 3900025, 2025834, 7139154, 4921461, 61578, 4014476, 462405, 5268721, 6952599, 3048416, 6756644, 5430985, 5801810, 7532014, 4329178, 4678381, 2079992, 1794996, 712273, 2634853, 3085202, 6334135, 5123211, 6159202, 3760931, 180539, 6487960, 2679192, 1066266, 6065384, 254059, 2572837, 7534086, 5651500, 2533785, 2568391, 1153828, 2453502, 3485652, 3934349, 7781500, 6491741, 5806833, 8124839, 2148602, 3657436, 3801135, 1862656, 561652, 3387098, 7509818, 8049598, 724797, 4332466, 5370769, 2424056, 967929, 4617013, 4626818, 5346676, 1856381, 8307242, 3355643, 5480105, 6990327, 5330158, 8316077, 6417036, 3632489, 4808564, 1239426, 1993342, 7012069, 3112897, 7781975, 8211187, 3160871, 944927, 923474, 37966, 6512523, 7123188, 7923059, 4838927, 2748826, 3924308, 2168564, 6828040, 846534, 2597602, 2050921, 6053509, 288318, 8345439, 1918063, 2059189, 3937054, 6557296, 2839184, 6817074, 5483019, 7687073, 5534804, 1445811, 4051272, 2831006, 5368072, 251585, 1271374, 3122837, 2162394, 3117708, 6814613, 5376061, 2181533, 7666135, 3386518, 4532104, 6995872, 755618, 6521475, 2870138, 4131862, 2455417, 978508, 667278, 3568397, 8335109, 7868933, 3597894, 5082344, 2618942, 456723, 7750920, 1343319, 1428464, 2790482, 1464018, 2637250, 824661, 3300980, 1931024, 3908824, 8298311, 7416621, 5752591, 7491537, 7506321, 4529487, 262755, 2883611, 2209463, 2068323, 7014322, 2157603, 7463540, 2669588, 2397086, 4850814, 8200047, 1870814, 7830920, 2580909, 321418, 558489, 3691251, 196239, 5497208, 1256774, 6647484, 5661482, 6825864, 5537857, 6447908, 1406701, 3164040, 7149321, 7248151, 1772366, 7582082, 1334178, 4900200, 6174665, 8377141], +[724829, 3485727, 3008317, 3761766, 3053529, 4855029, 3478807, 3537413, 1363367, 6754463, 2162978, 2569512, 3667282, 8314185, 5278827, 3359864, 2900396, 4940314, 3790265, 7170181, 8304032, 1431456, 7581263, 2214607, 3975164, 5829298, 2844305, 8267503, 5515028, 4885209, 1954572, 1210068, 3284334, 2678897, 3521585, 4317085, 119206, 1353496, 3416530, 6699853, 7983479, 7268808, 1547469, 7223891, 6086448, 7823534, 98425, 6340355, 5683361, 7041196, 4404636, 5177538, 2143947, 5783839, 4679485, 4381963, 7927491, 3758987, 5809830, 2935478, 5986199, 7612210, 6665324, 8345934, 3693306, 3838610, 255323, 7011654, 5008704, 8318639, 6524567, 3769906, 3632828, 6543646, 3308873, 916597, 3207669, 2439497, 2820323, 6426724, 3014, 5952446, 177985, 469026, 3999086, 1357362, 3313640, 2020721, 6588546, 5445442, 5260681, 3473092, 2107752, 2981259, 1414216, 6610772, 7946521, 3142444, 2199287, 3478748, 6473063, 6867961, 5017986, 3214082, 5726301, 8300426, 6558118, 4207238, 5534934, 4922830, 626161, 1670405, 8109208, 3319015, 2667137, 5547968, 5196971, 1858109, 3191160, 4164999, 3356831, 7063452, 2080161, 7322015, 5638378, 544240, 6815350, 3388153, 5290846, 2762206, 5570437, 5803651, 3009388, 7371952, 445984, 5248332, 1037490, 6302168, 3350863, 1756250, 5138701, 5734112, 712453, 2647261, 5111263, 5693658, 247208, 8107675, 8178027, 7469490, 3437599, 5824112, 8289805, 6433902, 5267216, 654453, 5866783, 4347546, 3317277, 212797, 1751551, 2353561, 5521292, 2378451, 6253053, 8227426, 3641901, 1470765, 644531, 2730333, 6450580, 3517923, 1375344, 4946884, 1494364, 5757837, 7878779, 2856533, 5122282, 3110562, 8120644, 3682043, 1182276, 1250859, 1181726, 1278429, 486683, 383328, 7875858, 2881444, 545893, 5892606, 5667797, 1507091, 699089, 4552210, 4380163, 2286541, 2756228, 7862775, 1849298, 8232501, 8246417, 4340525, 8277698, 8234168, 4617763, 8084469, 6261967, 4624523, 3821440, 5237950, 4019846, 5754378, 3910902, 5479402, 3402852, 7979918, 997701, 1791552, 3700481, 1067541, 3856915, 1588406, 4983229, 6314207, 4552019, 4453063, 4273282, 8006290, 3916225, 4374045, 4230009, 3128628, 7138648, 6261681, 354377, 5215242, 8041748, 6101487, 8217848, 1555548, 7657676, 3805494, 5833346, 5673620, 2370459, 7114719, 5476903, 5213847, 1537530, 5465696, 1562799, 499688, 5660902, 2875196]] +wPrimeApprox: [[7922246, 5265226, 5506507, 4646550, 2602037, 8056124, 4540058, 3683346, 947069, 5492323, 5072451, 2036902, 3275644, 360403, 1342966, 5373180, 7674721, 1297549, 2199143, 6894242, 343750, 2205389, 2116220, 6594064, 1118119, 1295454, 8091477, 4263775, 2523493, 1196616, 3661568, 952793, 6553128, 409094, 5843568, 7588096, 7206890, 1387541, 3910260, 1615866, 3204319, 6008770, 3207733, 2822546, 7390952, 217966, 3013480, 8147607, 377067, 6505514, 4938257, 6747540, 8350324, 241057, 5708389, 1401833, 3154492, 4642862, 1007346, 7096032, 2699631, 7095420, 1032206, 6518894, 2549201, 5311426, 2169241, 3587873, 8190761, 3055915, 2480486, 6320344, 5043359, 1812196, 4076521, 6763189, 3796329, 1151663, 2932163, 5249902, 3389035, 3598376, 1697664, 5135427, 143201, 2097652, 6227765, 3495314, 230338, 6131540, 2965605, 6401148, 5796656, 8011592, 3697362, 4055182, 1652999, 5859724, 4583350, 4118738, 6900549, 1979736, 3749765, 4896511, 2784731, 2974587, 7029353, 4644697, 811913, 529529, 5279632, 7193704, 8200892, 455819, 8084352, 5651871, 2324574, 4435168, 3984154, 7783985, 4083681, 5250368, 7193306, 2835143, 2541641, 7015314, 1496169, 3070010, 4736328, 4094833, 1649735, 8316439, 2107201, 5479837, 5420028, 5331640, 4812159, 2979855, 43743, 3851683, 1003852, 4274128, 4223552, 7053633, 735719, 6475447, 5182951, 6486366, 6291990, 5768144, 4814576, 5074815, 6039719, 8189702, 2552747, 6880843, 4440237, 6054553, 4148682, 3374626, 2351101, 6930949, 6718152, 2038927, 1131767, 5949083, 2712530, 4731930, 4889762, 2646679, 8309083, 1295165, 5096741, 4064525, 5698306, 5552877, 438386, 6662316, 1493238, 2760265, 4669231, 6667396, 348494, 5017208, 2859845, 3121936, 1626834, 8317021, 1376896, 7301378, 3722083, 1454327, 8332394, 6435160, 3463564, 4589233, 1762634, 7107619, 6973980, 567330, 405166, 3340814, 4132934, 5055395, 3052776, 5645452, 1330250, 753174, 162386, 7567049, 5282371, 1490773, 373754, 5518187, 5163937, 7090619, 2025712, 5860195, 2905493, 2939529, 4180014, 5893834, 2867324, 5959307, 7285421, 899898, 1473854, 7100562, 1991199, 4036436, 5760422, 1832317, 2640425, 2626744, 5032742, 7426912, 7427851, 1439988, 6723198, 1421273, 5180931, 6349612, 5179903, 4643329, 3669151, 2546371, 6082638, 2187263, 4253789, 3524114, 6182567, 384197, 5078545, 2991234, 585998, 4359249], +[4250175, 1134865, 2368947, 127674, 6593998, 5500651, 3684706, 2949331, 3638645, 5847886, 6124713, 2457891, 7691497, 4701413, 5167273, 4131020, 6801764, 7802904, 716220, 5713791, 2466728, 5659642, 4772272, 3462102, 4752824, 7742640, 1729950, 2548809, 7596257, 2615007, 1686890, 1802644, 2002399, 5430242, 7788354, 6946842, 4520011, 5490982, 2151624, 1839994, 5826039, 7555691, 6003838, 1397643, 3696625, 4056904, 6786392, 499922, 7431081, 2539513, 398455, 3130836, 5150657, 4342980, 6406120, 3978495, 7640192, 4621209, 6127092, 6937490, 1055422, 6196673, 837583, 7794063, 4904884, 1306941, 2952451, 1364857, 6529541, 8010590, 5911593, 4340153, 7345466, 2560340, 3637977, 2333908, 4495066, 2134147, 847560, 2909365, 1116617, 65429, 6567931, 8298561, 3742304, 2756102, 5248346, 2238325, 200210, 5386039, 5355741, 5784107, 127700, 2067447, 1522518, 5615600, 7973707, 7692132, 5685145, 3946398, 5760414, 194220, 5651709, 156854, 677688, 5670335, 2427385, 2331747, 2351624, 6238218, 6771950, 5821192, 7939226, 6574119, 2168982, 4499327, 3877359, 6606051, 5570479, 105072, 4600999, 4567489, 5572965, 7850403, 7885000, 739553, 2989443, 6895264, 7284183, 7152163, 1556271, 1819578, 7876803, 2607772, 1743106, 7339162, 7033333, 2835615, 4756406, 3213557, 6592112, 3165988, 3010340, 3993787, 2690531, 1083903, 1606711, 1894012, 7096965, 3959426, 1362560, 4116477, 8132554, 7996740, 2009071, 3716057, 2894675, 1073608, 834815, 3573039, 5636036, 3381914, 1129034, 6114337, 4196217, 5039286, 1618302, 6967855, 367992, 2488161, 6747488, 5618541, 1355099, 1223500, 6357329, 3191995, 2524377, 3630072, 460189, 2431536, 1560240, 5367443, 7585542, 3840813, 355853, 3040003, 5097722, 1033293, 2339731, 441261, 7825807, 5877407, 716303, 5991637, 8190737, 1100519, 1719353, 5209725, 8188956, 265084, 1912142, 3618487, 628501, 1490858, 3262085, 4515269, 3306940, 1979044, 3698701, 1812023, 7971469, 8231761, 928191, 231869, 7374374, 7999108, 148473, 3425421, 4163380, 3423346, 88998, 4032606, 483386, 7944809, 7991543, 6500721, 279847, 6629454, 7277543, 4435320, 6847114, 2229531, 2629956, 3049987, 5655558, 7952266, 5313137, 60231, 2305554, 5323929, 5477965, 3473216, 5705231, 2836719, 4383663, 1243216, 8030302, 1313877, 3999865, 4976917, 3564016, 4673321, 1482607, 1422978, 3558144, 4672729], +[5225532, 3184459, 3593619, 145438, 169419, 1461937, 7782223, 5828487, 8182468, 623885, 3445292, 1969565, 3946194, 4361076, 3330933, 8225361, 6162009, 8031970, 1515448, 7917196, 1629096, 4146211, 5095044, 7024770, 4106906, 58627, 8061693, 4962435, 79767, 6379739, 1676654, 7967481, 4184076, 6868553, 3428473, 7302339, 4470248, 6135830, 6649671, 3692979, 3924612, 1650718, 2465915, 4437858, 1205867, 5149844, 3058169, 4042689, 5903287, 6865102, 1552554, 2704783, 3098542, 2681987, 2950834, 3157693, 5314496, 5301502, 2880183, 4266988, 4388502, 1464677, 77614, 1951390, 1138936, 1519552, 7116725, 5355429, 3785847, 6811809, 3039379, 326095, 356582, 4314152, 2860911, 1888125, 1410076, 2325397, 6216984, 3437701, 3026021, 3315680, 4597860, 1490419, 3403931, 5888856, 2900334, 3534805, 1238541, 1003508, 4900784, 921650, 6632272, 2112543, 3856446, 1382173, 2002313, 8335869, 2537253, 1157355, 4894497, 7517278, 8169117, 8043424, 6960943, 6368445, 1091617, 4931351, 4632350, 7764669, 5591791, 3145850, 6898258, 7813079, 4282170, 1626231, 1510519, 3146973, 3268626, 669247, 1592887, 8063270, 1225386, 5903075, 1438636, 3331798, 5705594, 7240691, 6137987, 4808705, 995695, 3402199, 1343014, 5794021, 5264200, 2374205, 6724645, 3940597, 5519893, 5519823, 7919790, 5759031, 4685267, 2728913, 7828321, 6644277, 3810611, 5451993, 8038227, 5460011, 8178764, 4173049, 1335434, 4742163, 1691671, 4782863, 7681415, 3932659, 2980263, 1284903, 7338842, 4526188, 6719020, 7797131, 3118132, 8315974, 602168, 2144820, 6308352, 6486955, 779646, 1309173, 8316663, 4792060, 6821718, 7878200, 8061381, 491864, 6475844, 5136316, 288550, 4538470, 7083308, 3260084, 7527166, 2472861, 6369146, 5153064, 2871258, 4843150, 3489317, 165882, 5566564, 7771860, 3258140, 610094, 1669100, 5905293, 6238203, 5893438, 3220174, 1593511, 6868215, 1286724, 3878339, 5050797, 6272059, 5375083, 5770379, 8355698, 488195, 3047829, 4530771, 5559714, 231751, 2788769, 7610806, 1560806, 6233976, 3127845, 4108553, 6832372, 5811033, 1208553, 6247893, 1595634, 3947728, 7281141, 8250268, 1728148, 173541, 1095765, 6595535, 6562224, 1766119, 2447610, 6866931, 2956454, 5312432, 6638401, 7847708, 3658649, 1729535, 4443722, 3773751, 7300420, 3443234, 1911221, 698234, 3195516, 4180748, 1908994, 2643475, 7873994, 1631646, 3731121], +[2027829, 2889169, 1412751, 1398701, 4746044, 3334015, 7728514, 1145068, 2677181, 5837222, 1559867, 4891268, 1196552, 1846487, 7882602, 128082, 3264772, 4133859, 6369277, 2622526, 748189, 7798985, 2188359, 5054794, 1070758, 467471, 4725659, 3050707, 3829017, 93760, 2418606, 2617065, 2310841, 3364942, 4187970, 5678453, 198595, 1807016, 1276360, 4471779, 1925284, 5571289, 3722563, 1301216, 2447026, 3611377, 5636075, 3550431, 7199892, 5976070, 8208038, 3106023, 6424786, 5466424, 4607409, 214818, 3787055, 3985275, 808852, 2413504, 5890338, 1841358, 5081663, 7031867, 1148546, 7480381, 5269338, 3714231, 7769620, 4744384, 2109933, 2877723, 6909098, 6874262, 2816808, 3253074, 2689330, 2839225, 806732, 8291404, 2037996, 4040094, 674937, 6646757, 7633939, 7377452, 5262254, 3900905, 638668, 5157126, 5737431, 6278056, 840978, 4255799, 2084507, 1106041, 2387820, 471202, 3719951, 7039392, 2833568, 5131978, 4853535, 5314788, 3391190, 3840252, 853525, 4210266, 6064536, 5404724, 2084993, 8263555, 5781373, 7140883, 1348663, 962460, 2694212, 5945369, 6468937, 3108202, 1008147, 2917494, 7403501, 3311474, 2257193, 2050613, 3990629, 8121343, 6152274, 6424519, 8092882, 8173862, 459270, 268373, 3517398, 3476538, 7008309, 5041771, 3798871, 258672, 6070815, 7394723, 1616324, 748586, 4567820, 2890796, 4837255, 1683257, 3175257, 2286996, 6413861, 8033407, 354015, 7051243, 4189277, 7528333, 3861590, 1823025, 3268909, 1940090, 5895516, 6385981, 2210931, 3370085, 4448677, 1468955, 508508, 95040, 2737827, 6184872, 5172979, 7420249, 1781659, 138711, 4980486, 4534693, 570192, 227872, 3134992, 1219369, 2483902, 4683399, 2778948, 3245054, 2920026, 4055933, 7788988, 5661955, 3117113, 3893516, 1120668, 5239151, 6239356, 2443276, 5093983, 47133, 3352237, 5884388, 3937475, 2879705, 6884866, 3250804, 2336405, 5958187, 440043, 4943250, 2658728, 5532786, 5220409, 2845187, 1837264, 4990054, 8274221, 3723759, 6551066, 5798448, 5030815, 2310297, 4054429, 2563913, 1051590, 6902894, 4041225, 496160, 2639627, 2873759, 579420, 4797738, 5044611, 1483404, 6865609, 3994215, 5134669, 7944447, 8050685, 830030, 6417703, 4996646, 7055516, 6238859, 6100270, 2723230, 5637367, 2011319, 7872310, 376034, 2905457, 6619696, 6852110, 6960754, 3746979, 6137567, 4324172, 1768052, 5663591, 3431984]] +w1Prime: [[42, 28, 29, 24, 14, 42, 24, 19, 5, 29, 27, 11, 17, 2, 7, 28, 40, 7, 12, 36, 2, 11, 11, 35, 6, 7, 43, 22, 13, 6, 19, 5, 34, 2, 31, 40, 38, 7, 21, 8, 17, 32, 17, 15, 39, 1, 16, 43, 2, 34, 26, 35, 0, 1, 30, 7, 17, 24, 5, 37, 14, 37, 5, 34, 13, 28, 11, 19, 43, 16, 13, 33, 26, 9, 21, 36, 20, 6, 15, 28, 18, 19, 9, 27, 1, 11, 33, 18, 1, 32, 16, 34, 30, 42, 19, 21, 9, 31, 24, 22, 36, 10, 20, 26, 15, 16, 37, 24, 4, 3, 28, 38, 43, 2, 42, 30, 12, 23, 21, 41, 22, 28, 38, 15, 13, 37, 8, 16, 25, 22, 9, 0, 11, 29, 29, 28, 25, 15, 0, 20, 5, 22, 22, 37, 4, 34, 27, 34, 33, 30, 25, 27, 32, 43, 14, 36, 23, 32, 22, 18, 12, 36, 35, 11, 6, 31, 14, 25, 26, 14, 0, 7, 27, 21, 30, 29, 2, 35, 8, 14, 24, 35, 2, 26, 15, 16, 9, 0, 7, 38, 19, 8, 0, 34, 18, 24, 9, 37, 36, 3, 2, 18, 22, 27, 16, 30, 7, 4, 1, 40, 28, 8, 2, 29, 27, 37, 11, 31, 15, 15, 22, 31, 15, 31, 38, 5, 8, 37, 10, 21, 30, 10, 14, 14, 26, 39, 39, 8, 35, 7, 27, 33, 27, 24, 19, 13, 32, 12, 22, 19, 32, 2, 27, 16, 3, 23], +[22, 6, 12, 1, 35, 29, 19, 16, 19, 31, 32, 13, 40, 25, 27, 22, 36, 41, 4, 30, 13, 30, 25, 18, 25, 41, 9, 13, 40, 14, 9, 9, 10, 29, 41, 36, 24, 29, 11, 10, 31, 40, 32, 7, 19, 21, 36, 3, 39, 13, 2, 16, 27, 23, 34, 21, 40, 24, 32, 36, 6, 32, 4, 41, 26, 7, 16, 7, 34, 42, 31, 23, 38, 13, 19, 12, 24, 11, 4, 15, 6, 0, 35, 0, 20, 14, 28, 12, 1, 28, 28, 30, 1, 11, 8, 29, 42, 40, 30, 21, 30, 1, 30, 1, 4, 30, 13, 12, 12, 33, 36, 30, 42, 35, 11, 24, 20, 34, 29, 1, 24, 24, 29, 41, 41, 4, 16, 36, 38, 38, 8, 10, 42, 14, 9, 39, 37, 15, 25, 17, 34, 17, 16, 21, 14, 6, 8, 10, 37, 21, 7, 22, 43, 42, 10, 20, 15, 6, 4, 19, 29, 18, 6, 32, 22, 26, 9, 37, 2, 13, 35, 30, 7, 6, 33, 17, 13, 19, 3, 13, 8, 28, 40, 20, 2, 16, 27, 5, 12, 2, 41, 31, 4, 31, 43, 6, 9, 27, 43, 1, 10, 19, 3, 8, 17, 24, 17, 10, 19, 9, 42, 43, 5, 1, 39, 42, 1, 18, 22, 18, 0, 21, 3, 42, 42, 34, 2, 35, 38, 23, 36, 12, 14, 16, 30, 42, 28, 0, 12, 28, 29, 18, 30, 15, 23, 7, 42, 7, 21, 26, 19, 25, 8, 7, 19, 25], +[28, 17, 19, 1, 1, 8, 41, 31, 43, 3, 18, 10, 21, 23, 17, 43, 32, 42, 8, 42, 9, 22, 27, 37, 21, 0, 42, 26, 0, 34, 9, 42, 22, 36, 18, 38, 23, 32, 35, 19, 21, 9, 13, 23, 7, 27, 16, 21, 31, 36, 8, 14, 16, 14, 15, 17, 28, 28, 15, 22, 23, 8, 0, 10, 6, 8, 37, 28, 20, 36, 16, 2, 2, 23, 15, 10, 7, 12, 33, 18, 16, 17, 24, 8, 18, 31, 15, 18, 6, 5, 26, 5, 35, 11, 20, 7, 10, 0, 13, 6, 26, 39, 43, 42, 36, 33, 6, 26, 24, 41, 29, 17, 36, 41, 22, 8, 8, 17, 17, 3, 8, 42, 6, 31, 7, 17, 30, 38, 32, 25, 5, 18, 7, 31, 28, 12, 35, 21, 29, 29, 42, 30, 25, 14, 41, 35, 20, 29, 42, 29, 43, 22, 7, 25, 9, 25, 40, 21, 16, 7, 39, 24, 35, 41, 16, 0, 3, 11, 33, 34, 4, 7, 0, 25, 36, 41, 42, 3, 34, 27, 2, 24, 37, 17, 40, 13, 33, 27, 15, 25, 18, 1, 29, 41, 17, 3, 9, 31, 33, 31, 17, 8, 36, 7, 20, 26, 33, 28, 30, 0, 2, 16, 24, 29, 1, 15, 40, 8, 33, 17, 22, 36, 30, 6, 33, 8, 21, 38, 43, 9, 1, 6, 34, 34, 9, 13, 36, 15, 28, 35, 41, 19, 9, 23, 20, 38, 18, 10, 4, 17, 22, 10, 14, 41, 9, 19], +[11, 15, 7, 7, 25, 18, 41, 6, 14, 30, 8, 26, 6, 10, 41, 1, 17, 22, 33, 14, 4, 41, 12, 27, 6, 2, 25, 16, 20, 0, 13, 14, 12, 18, 22, 30, 1, 10, 7, 24, 10, 29, 20, 7, 13, 19, 30, 19, 38, 31, 43, 16, 34, 29, 24, 1, 20, 21, 4, 13, 31, 10, 27, 37, 6, 39, 28, 19, 41, 25, 11, 15, 36, 36, 15, 17, 14, 15, 4, 0, 11, 21, 4, 35, 40, 39, 28, 20, 4, 27, 30, 33, 4, 22, 11, 6, 13, 3, 19, 37, 15, 27, 25, 28, 18, 20, 5, 22, 32, 28, 11, 43, 30, 37, 7, 5, 14, 31, 34, 16, 5, 15, 39, 17, 12, 11, 21, 43, 32, 34, 42, 43, 2, 1, 18, 18, 37, 26, 20, 1, 32, 39, 8, 4, 24, 15, 25, 9, 17, 12, 34, 42, 2, 37, 22, 40, 20, 10, 17, 10, 31, 33, 12, 18, 24, 8, 3, 1, 14, 33, 27, 39, 9, 1, 26, 24, 3, 1, 16, 6, 13, 25, 15, 17, 15, 21, 41, 30, 16, 20, 6, 27, 33, 13, 27, 0, 18, 31, 21, 15, 36, 17, 12, 31, 2, 26, 14, 29, 27, 15, 10, 26, 43, 19, 34, 30, 26, 12, 21, 13, 6, 36, 21, 3, 14, 15, 3, 25, 26, 8, 36, 21, 27, 42, 42, 4, 34, 26, 37, 33, 32, 14, 30, 11, 41, 2, 15, 35, 36, 36, 20, 32, 23, 9, 30, 18]] +w1EncodeTemp: 2AD7618E8A4D45B72D917070E8C190C2B28CC6B15A8D3115A2F0A1E6512111183D6700AD82A88D40E01D1156944E59880DB74C2BD4845A529194F170D2946CC1124A0108899E3A55C98759A442690F5462C4C099ABA07ACC55A516673E4D89409995004BD771D9035085659584B889A1976DE0EA901768490C392EC6E7649A031C5BE575C28838D828680F940087392180286149490E82646D90771001CA2142B795CBF73CD6F77C6681944AE5298EA39D27321E5BB861530332D6040A1B345C96C104633741D3073668B659644A788D9749599A34A893244A979258B7281F0A1E53450E672340DB25562806920648A4DA011DA2FA5D663331D8423C06300294C33101C779C182742AEA555EE00584D7304C487AEAB86094D80518D6A5290191A68928AA939CE593456204558E8128657558ABAA508F414C9D648096969442337A871146CD343408875202B4158C907EC4B71AC9B606CA342011162953A2AE4570AA8164494035A8AA288CE645320EE4A91CC0709DE43DD7A11E953665C831655C340501927EEB2029D515ADA08AA889B59515A06A8098A816299917384E55D25CC706551F893890F3441CF758170228065272140909C2F52807134A508421D2F74846A115E3421D0AD018DAB9AA64686858DA45646A2148140D886A7C47E499605648C7C73163D575AA9739E948756AB75A47966468051D2736A610302CA1481C4046A6EA206E02564668136E4F26055D1A0DC9177E11421E9416721E204058173C28124616E9192152996B1218A29834E4C38DE9945C9429294464294E9A4CCB731C99941A8E876886920691153A44CA6C86904114D0388C64798172604A471DCDE44DE6B7426287055445349FB295C6C94D69B63C24F944CE43004B458CE8C951C4E68584B518CD3095CF967112555820B7AC5E7914CE2742C57346CC52ADA0A8AE422049A54605E08910D893251123AA4269A19412295FC8481832044EB89D49A0614300194DF6444F957A10656C61B301D2573D64C47C82E674DBA368EB247A1A533506590DCE33641A42569BAA12A25686A0E32DA9F08C24498157E249 +cTilde: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 +cTildePrime: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 +cTilde == cTildePrime, signature verified diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt new file mode 100644 index 000000000..1028db71d --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt @@ -0,0 +1,107 @@ +Signature Verification -- ML-DSA-65 +pk: 6C8414380856CB52D79C4B29139FB1839B8606F5948B9D72A956DCF10116DA9E2D79770186FC74D942C0F4A3B595FF6C19804B49901C6AD5FAF71601C2B600315E1F40C2054767B00925DF3AA490E8C76F05FBFB74911075E6518C5F1D91B8A0E5B59830D3DF3994760411EBB911ED4CC2C160E3849A93762DFCA7B9812BC7AEB2DDB2767BEF36505605AE069260BCC8DC4787C428CB3C076EF2A6B93561D8943F45CABE8F0553FF2EA1AC95C1CE21593A175459D7DF12C4070ADB0EEE55B4ABAE59BE69C3FF0DE5A9B027FC7D8E6E057B7152EE6AB480D105D30B0F5051B60C7901C525C4635FE668CC00E9D3097DB99D66323715CE4F0B79B426B4545E09F4DE39323DD14CCB0D17108CD46DEC6138CDFA2872C1C4C8AEAD5C8CE04157E553A37558C2346A06194CB50B4981BF4D090CE4E860126A8254A4D4C084C3E2020BC0753521049B0FD88997E027AC51E75CF1350C3F303A0ECE426487153DAF1FAAD6808B9D9907DA9F35185BD3BE8D9CEBE916CED1FA2928D885A9CBA88149703F5E4772E48523125DDD026E714C49F4FB4E544BBF617A40B00B68DF8F155F5880D411877E25B42B2448B36BEC2F1F8F9A770C545150A0278E9B724500AEAAEA471C11CFF04E30EAB2F473BC048E32CD31AEF21579B699225BF9E1B6700C57E509FCA1F236294A5974DAA15FBCAD62D4BDDC4532B2614144DBE28807368C281A770EA22B1E5A3FA5BA14926DC55A54F84A2A77C5A70841F07BC1DEEF7403B247AB42B84ADF141E030C98468424DAAEB99D2577F950C2373CCA1E2DC2761B8EDD6D08FF79E528880FFB51C36ED420AC5D50F2582AA664E54EA5F4189EA0176DAA6122F6235A70B15CEB4DDD65D3BE6EBF3DC43189EE0A2E3105638F23873695280F1B74274352D60A48E5D3DD02FB7A5ED83FE27A698251421C8E9C98806102396E537390ACFD8C1D0B4F99B702A9EA659878583D92758941B30ECE507C104B2CE487679ECF68B4D8B980698ACF6AA6A57E8ED6AF3FF18D2668950428B57D182F73BB49B9B038CCC82D561278A386D56645EC3FAFFB4125E0E7F36B48B14B452547A0B481AA6B334229249153E42EDF7E49DD6E7636BFC615A23A401EFD4034C81B4DCEF027D344DDCCE0A71618EB5910CEC62228819385033E8D0ABD493D983E4FC087D72B455E4DB63A2F82CEFF65C1E628EAE630596DEC27FB98B84DBFDCDFAB40E472244914AFF179326D542D401A3CBB86E5FF8351EFE53A73C51ABB63FF553E7D7957EF89135E0F5BB1BD0C24F9E45E3236413C60E1396A47567C9439510F00D4A43C149A5CCC04F3D47E67A8E294A461A5F693DB0CAE22CFAC61E853477D339A4E45F7B17C3C116D56F3A068FC5ADFEF38FF85332BD5153C4D8FB8F148F117659C2EA94DB42AA0B0BEBB475A110412F3CD3349FC1AD041B7D5304A8593144EFA3A361D1B0C7613B82C086EA7126E43C616CEE8F1444E9956E87F5CAB95C7C7FB1758EC7D97019E5BA93543EF3BAC1A174299CA48BF7859DBFBDFF243B114F6BF423CE98B4D4D091DA44F3274D573FDC904BD885E35C9152A65354888F11ED4F3D63F26A7BE2F5726EADAF48586592BBDF6CEE246769E0EDA2A80771FED347D67AFEEC68B89463FA0496DBC15C89E8D569983D1D674733F2BF9DF4A980EA8C5E3AF15560A0E28D672B580AB6552ED76AACB5F80260B9703769D33F4138ABC10BF5B0582DCC62DBE58C890F51B4100127734FB7DB7447A720AAE009D00BE8C610792C64F131F2D72115C7E058E48B9DE64F55B4D610C36D112716A31A3DFE26699E9C2ABA05658CEF1B2B0867CF8D5233DB74FA8DC3AD145F5D28574360A85E3B0B10AC0A6467A7B05984628ECA10463F348A3111E00578D3CE5480F5375A1EE23EE82087BAC41233A14AAA724734B1874A4ACE1133706258F5FEA3A0C1609E30C7FD210DA0C4FDE9162DF66FBAF792FA2AEAA512F0FF7837B9CC02EE9BD95539F001BBD60DD8B42D616B2CA95F3835F5E47D43B1434C4563FD81C15BEFA202CF3D9540873F684AFE19AB5C01FA92E95A8CD6F360730856E59C9C6AB770D6575962AF75878572A2A26413D01AB318C100DFC34DC1DEFA5927C4B459925D73E1EB91470E37A58455C22A961FD53F7D99026FF884BF4A2579F706335EFB6FB2250D52AE561898BA1606E51E96D37C9ED3EC6CFCB33BFBE9C3143FD3B6B334D5F61922B369AFBB31C3E6E9B5F3AEBF95CB708346FECF7159CAD94A93D8CD4B8C4894192DFE53EA436FBF3AF4E864E8C3991EA020A811F0AF50B4257436A3FF522BE7367391D0F950BA6452FBFD8FD8728F40BD2FCB894529985B432DFEF6230EB4DEE737A8D10A3BCDFB763E0869B225C1A8D0E1FBF2D161C2C65D6DFB958E982D11777ACBEAD8DFB6B1F5EB21EA942F7C40DC20D2E4EB3E729B4E29F7501DA34234561F6288812D612D41DFA83C5B8D90FF38BA548201B575B5293AD78120D91CEC059CAE2E76A9AB43EF1281E2BEF3E348D28F21947C88848960459489775176F8E40EE06427953687FB63E470F7D59FB60DF569F8A11E28E0937162C46AFC7D2210A885FFA21B3DBF5354B2941F4ED5D50790890840CC3B973D2C3D02602B29BACCB6CE17CEDB97B085A2AB310572BA7371D1F8120FFE37D0B0FCA35AFC5B562AA8499715A299CE059CCE3B0D11CEF0D9238961AD4BE11E9A6D1A4692177C8B0C53F11A8ED2650212E7A2F80EBFF6DCFE4672103658434D0327ADDCD66BCB6 +signature: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F46373045B9E540C73DFE91B61F0588D613593FCE1B00EEF1B227034C6FD3B18B3F221110FB345AA78631B8B59FBDFDCCDAE6A24D259D34AABAD218B3AE4E77186653B8563AA6120A0A531A4E913730DC914FE5E008BECE6869B02B07FDC16214540D316C43FA0C211B41AC7E52656729C773E4C4B88ED311886DD4D275417D70196644EED15FA315066003E309F832AF91262C949011FCB0AD2CCE65DD9EFF567EE29CC40A6FE0664E7D9F236568FC94295DBB34288233E8C511D28815EC721032296E1EDECA7F726A6EB0F76CC5828011C0E4013CC7EE4329B81ECC0D52ED1E491DD6D55C5265665ED8AD219B894F31C68C619AFCDB7358E5554C495B8B6E3325688FB8C1A25331D57BD348A27D390929BC46A1496AB35B46BA61B6B9D23CD06315FB72C24776016130ADB1CF2DC72959EA9CAD96AF5DA996126CDD85B134CC927A51FD23F84791A3FCDA077E15991748A0394F334EB8BC48A99AB9DFBB0F2AAD6FBE484961D3A4E8F8B21A6AC092B226D6E119FAD44D8E576FE96C6CDB6840EA614BAFC70786C519E1D5DC0F984443C8B1E54F8EE176D98B2C7027F57D7E3DE9B2A0A36911B8E47121DE0C07EBBA5D7B594EF244C68327EC6C6D1DD501F483FE9B9570597E70DF413E7AF03847F409ED61E2846E6C641E6A7FFA79DE6BFA373A0644B00BF41A034992A794DA17C88885239032C851764E3E4DBDE7F12A16C5A263E964C1E7FDD3CCE576DD6D56B18182848B7563645D4E42FF22742A996785169D7F503B48A7158B3CBD29935ED32049BEA1AD953EF707327B778BFDDDFC60511DA113A34F655712E4E59D6CCE404E94ABA61E8135388FC21C8E41344F324B01AC8C069F92575D34F88BCA22CB307E37070063320256B8BAD6EB7A81AFE9A254016E1C8A125089AAA3EDE84E5B6C2ECFAEFAA52B9F5709602C06AEA4A0384E9B09E5B88164B274EA3265FB5152397DFF5A3A0861E2BC12D2109289729747E83FDF243A1D17B98348379845A9E955E2D6F938DAA5918E2A14F97BA2BE501CCCAFD681910F4A4F06715CE84096F37A91DCCA2A8A4BE8DA7921DBF8D3F4EFB98C6B4F940ECEF832B549D068947C3DFB5809CB7B060A3A0EF3B21C0164501DDEA7C9E5E7897C6B1C46348B2C3E805F6F2287BA158CF925A7BA7F08254989C87D24979AD986AA97C51B01F45D4A1F24752991F04205EB551FD02D415F2DD1EFF142B0D70416C6D815EB91732B268FB20D0867442D71DEC057B286CD93811FF3F646EBD565D51D09A42D3ABAAC0F34CC817B18938ECCBB1FEF05BD3C2B494FA529ED4C634C9325A48173F20FFAC32DC101E6EE03B2FCBEC2468DBC8F76758C3215474F7EF24065F79060ACA3C8D5D74AF70F48301DDB30C05DB3EFA726CF88555901841282AA08F666A65351A6A24EED6BE211773107E185E1B488A2E491B6C141528462A86494B54FDCCECCB6AA21253686693AE798C9CE9E0BDDC6AE53D9B706DC4F4D81B9C73C461ECD7035C5172EFAE5602CAF88C64E79E5324030555DE211F89FD424C338C3883C83CA9405C2B5D1445F7C98C43ED3D2BECBE25F5F3F544CCC5B5AEAE47DDF3FB5649FF5D61EAA02EDEBC75CE478BA00426CAF474FA79E5B089EB1A882F15354592695952BA0A8EE91E649E3F2C382264DAA30F6A6D217F6129C1939B6DCACCDA5B637326E8A8361C3B56FCFFC485036865822B9BB87B43510BCDD55BC350DE7B2AE90A21E9E19978EDA10DF667614A44FE2A84D16BE043EA8773633EA6BADF65710052F341F65CBE928D3962A5A2FE64E46D6BFB8FD0D9978F0423CBD195F72F3CB19D7EFD9EBE33CD2F5709A57807DF944ECE568AACA4336422083B0697B6AA00586E4BF7DD673A3D596B8618AC3B4061750C6BE97CB53753D02395556075A26F140B93F577DAD505E1CF2B551A04C98C7F0901831B3CA61D75DA793AC72A44C7A07F7DBBAD60A55F49CBD79DEE4739FFD36778EBD08EBDB79EC07A16239C5B921599FEBFEA46DDF966AA4A01512E610943F5DC54B4C76B764B380BF2F84EDE32124912F54F7B6E207B7381F670F7AA0F3C3ED1015740384DD61A9765EE4696EACF82EA410691805CB688903535D7046100DCC2BA7D8302ACB0430D506CCC1C0DDEA7111A76F45B454E25CDDFB639B3D664C36D8843513A3FCAF9E6057E9BC068237FE2419A2D2D90B4A1FC2A71A146D2BD04364C79B8EBA8E3E88CE11E916E4A7528421328CF54FAAB2B19F44468781F8AB84B7DD972FF5615071430A4374DAFCAE1E6044AA98E985941BA6B9DB8C02F589603EEB8BE90A70EFC088D795E6DA1F1F2E6ECEDD031D8199E65912D434D09BFBE594406DC1150E99358CEA7FAD2E7C44C38B6E0CEEAB9BDE0DB97BCF5AC99410C9470E266B8BE45F6690831F4145E26379DB807C26DDF91E309D4F4A3E7ECAB7362F15D20EA433B7E70A7DDE7416CEA871498B2CE3F58D29D8628C531840F022DD3BD2F3809B1168D38E63C7F69308A31A2D4D5EEB974239B34A62BC85E4ECF90C336A0C37BD9E0EF4266B835AC8906A83CF0B35138A65E5D9A61FCC9B2D5A337B8ABEF88A7FB3C0945D7CAF35611AE0E44693A5BCE0A6E2FECAE9BDF4E356D6536B581A18F03A59164ED5447C7EC8BD997BE953DED932535B5F438A04319F5E0D8B0FEBC8DE8146658E52B9759C73935B120DC9B854F3C8F94EC9339057D7D7CD91F7E0B98D84EC7B2F92328D736018B03165A8745F8E77EB8029F9782670CBD86B4316C7BE4A880338BACFB015699BF30D3A4B05325435BA5FA3B9D2B2FE0B519C2CB246E53D1A343D661A66143C6F468C5538645CC26D4E2A8703EC9B10FC89BE6F859997708F31194F0DFEE92998B25E93B97070DE14409D5BA43DF88D15C2FBA97BDDE618CC3FC042F7748184BA9EC9CBA1B2006881D0514264198FB691C5C038E04950CF69099377FE66BA64E21952A44581719664F5D92397D22AA7032BF589AF8ACA48DF6D14EB43CEF0A9C8A8F9AD329525EF0AAA4F9E09C3513CF029F3DEFCBB4114FA0F668DB4722FCCD9C207B66F109ED95B454BB6195D59C4A678BA6F5A9B234121AD0516A1D4123D3826D92A61B35DEB295BAA2FE1B5EE25021DAEF857B5DF192E175E3A2A0D3F082F211CB5BDC236274F86C5DC74C39BE97CCF5F5794EB64EC645545210FC667D1E0740E66CBEDC20648CA1FA73414596BA08917A19A463AD3027C81836B8F4F02B99FC5083F06F34BD2309C2342AD88A84FA96E207C0108F6825414944F264ED6C4667C788D61A6BC2C456AF66C2F769E16901706912CC90D4B6C90DCA16CAC8FFED8397020E2975E24FF4C807C8AB731C81D36CA84C9121A8513E0C9D0F41BC68F88EACAA35599FAE3BBA6FCC6528D47E40C0764CF9C8383B3A44515E61D92CDAEC9CB9082B5A0C0379460D9179A7D9DF29E0B4B6A4118285215E87B6F118E9731E466FB3FEBD195E144FD2037D116627579AC55FED5E32585EC6638A0DFBE6ED6C5876CF8114C902AEFA363F4C9B72E7D5C852DCC1AF2B8852A9D0F995938865084CE5213B308A9CB37F681960D84EFE1DF5134A5915AE5878B10DA0FD4D9AC2AEF0C7E01C2E9E7C017E7BA740CEE1A899459BB75033EEAF3190D6779ED9EDD846A74E321528C03084A5D30874839718A53549B2EC6B2B730AA935CA6E1C4FD8BE0357D93F62174EEEDF8DAB7755B46657E59D7AA00B9F2F85E4C0F77FA11A5D69A23B1EF3A09F219D83B1F391F841318EEF35A326367BFA2B15FD714032092B9D02BF613AFF7696FADF1DE2C817077CB7C996776D69EC241A24254DA2D13987691EAC7EBA8CD8DCFB3947B1D99EDF962D215B318BB5F9AA04D1C82626A4173D02D410C586BCA4E51CA4F3E151B54F17A6BC9677609BBAF6C3038A67CADA66B4FDFB51029E07807D705969D96C9ABFB7162E45810A1DC4B56DA1477ED900A89CCAC298E17884269C39E8D7AB966F33DDADBE56A384CA20A7B1899EC18E2AE547000B904E34E46801D8574DB008417BCFDD1A74DC018E507B76B0FA08626235B1CE24BCFC320FAE3551C1C929B94C7C4965341829D8A1347D6A7385803B08BCDA84A27EA5E49CA1E6006EA232A53EE417EC881D3328A156382A6B293894DDF9B369CDE6B2FF59CB6A564E21C9279ECA0311F5D80CE39B98BF90DB327F74D3F762D117DF5F9132084FFB555A5D147221AF863ABF78715B72194529A0E334D4A191D42A99BEA52ADA2C7CC4A9774D5CB28D4ED82B61F94E89F60F0C8EA52DC079D4658BF8C856D6152D92251948B3BA014D8BAF3DCD36BC71F8E5B2CE6F535B7B9AE13DA4A1EAFFC253BE43A9F608EACE733CFCE52EA5CDA8359DB53FF3AF2CEFE8779BCC53C24A4B18D5E0D781BECF75B5477473A2024AD56C54A7F990EF6B1DFAC501088509D3A37F1C8D5C26487E420B7F4358E9269761FF1FA3AFCBECAEB68F5DDDE3AA8FD078CC4224CEA67132D7EBF5D232E43BADD218C0B4DBE1E16529866B9AB935885ACB415FBB1EEE69408A521B462EC59CD0D3C5496D985AEB0CE374F6772A4E6393A4EF007438090A8A9E52D2F55666D70F0000000000000000000000000000000000000000000000004080E121920 +message: DB8494BA19C4118FB15D0ACF4254FD37483FCF4748FD1844F717CE6F69589E61772CFEFA7F9758653409D4EE5A264B834E60D6BB96499EBEB2B06B0BA874BF31E641394CFAA6A2D30DDB8F045876208D2F51DE15E205E8C91B87ECEB05FF3183271B2649665DD3CC49BFDB998D539DA809305516BBBE9C906021191C5223E525A8FC3616A1765EC3F9C5DB53CC337E039F186ACFEA91148EE2A79CCA3689EDB62AAF28B5D752FDE265EE5280B519726C1CA9803295C674B7EFAFA4D61B306A79E3F6E7A887C2FB535B3B0FB3D9EBC87603EAFEF170C1F1D28E99BB +rho: 6C8414380856CB52D79C4B29139FB1839B8606F5948B9D72A956DCF10116DA9E +t1: [[301, 478, 23, 536, 252, 605, 45, 769, 1012, 360, 347, 1022, 364, 6, 184, 293, 144, 647, 342, 1003, 759, 69, 32, 731, 256, 908, 501, 256, 450, 449, 628, 705, 265, 969, 941, 656, 144, 506, 764, 21, 1019, 318, 279, 66, 629, 121, 197, 382, 285, 548, 523, 918, 181, 38, 307, 895, 57, 421, 71, 68, 491, 110, 721, 307, 450, 48, 566, 531, 922, 420, 727, 1008, 423, 110, 696, 796, 686, 876, 813, 474, 891, 443, 259, 345, 517, 427, 288, 386, 188, 818, 125, 541, 196, 714, 972, 28, 622, 444, 922, 214, 97, 310, 1017, 276, 714, 1007, 88, 332, 767, 75, 714, 598, 705, 115, 402, 233, 23, 597, 373, 895, 18, 497, 160, 876, 526, 379, 837, 686, 430, 918, 667, 781, 511, 323, 670, 706, 39, 895, 231, 442, 773, 94, 295, 953, 106, 45, 280, 23, 979, 962, 256, 325, 182, 579, 23, 788, 37, 241, 502, 921, 104, 51, 656, 847, 265, 607, 475, 410, 818, 333, 225, 319, 267, 286, 619, 720, 596, 599, 832, 891, 569, 844, 275, 307, 459, 451, 257, 560, 468, 795, 542, 225, 717, 574, 802, 773, 196, 946, 730, 370, 140, 120, 372, 917, 851, 360, 391, 777, 564, 410, 400, 304, 949, 578, 20, 766, 333, 770, 576, 931, 608, 644, 38, 338, 164, 53, 76, 782, 738, 704, 0, 471, 309, 264, 432, 62, 472, 482, 521, 159, 428, 468, 462, 965, 53, 963, 771, 232, 526, 179, 580, 541, 277, 975, 506, 680], +[214, 736, 472, 614, 519, 1014, 857, 96, 859, 948, 219, 626, 491, 442, 225, 839, 506, 522, 386, 535, 937, 562, 26, 294, 880, 911, 117, 457, 484, 225, 290, 372, 733, 896, 790, 305, 73, 765, 239, 337, 843, 111, 934, 257, 944, 514, 502, 575, 789, 535, 5, 850, 785, 929, 599, 720, 43, 521, 820, 430, 1004, 971, 241, 618, 119, 259, 277, 321, 928, 905, 440, 458, 69, 896, 682, 938, 71, 71, 241, 963, 78, 652, 814, 978, 115, 303, 224, 202, 461, 908, 810, 87, 633, 621, 553, 364, 505, 440, 779, 49, 343, 633, 960, 647, 754, 589, 162, 357, 628, 118, 506, 753, 685, 280, 989, 882, 581, 140, 539, 261, 836, 182, 142, 30, 54, 547, 418, 476, 526, 744, 482, 360, 319, 681, 331, 584, 365, 689, 325, 993, 586, 458, 87, 671, 264, 16, 959, 773, 990, 315, 55, 712, 839, 170, 900, 298, 223, 901, 49, 48, 664, 273, 584, 872, 430, 878, 601, 476, 249, 148, 892, 240, 714, 839, 34, 475, 539, 867, 733, 33, 511, 350, 654, 544, 783, 126, 53, 443, 212, 776, 474, 321, 242, 662, 610, 402, 741, 339, 842, 99, 158, 488, 721, 681, 609, 392, 575, 360, 368, 812, 693, 311, 477, 217, 1005, 442, 447, 271, 796, 548, 750, 898, 786, 20, 867, 227, 114, 218, 149, 970, 432, 464, 807, 144, 357, 43, 328, 249, 477, 11, 763, 926, 389, 255, 738, 606, 38, 326, 66, 903, 456, 610, 384, 152, 912, 440], +[851, 28, 713, 1014, 396, 711, 240, 613, 695, 576, 682, 407, 152, 542, 981, 584, 373, 98, 820, 58, 206, 788, 263, 300, 44, 505, 632, 633, 207, 282, 395, 743, 384, 666, 248, 427, 422, 937, 231, 858, 943, 79, 223, 154, 360, 293, 640, 724, 125, 966, 818, 749, 329, 46, 907, 816, 456, 395, 293, 480, 675, 353, 621, 277, 1004, 975, 954, 263, 37, 504, 830, 431, 328, 748, 84, 149, 71, 296, 27, 682, 875, 140, 660, 144, 913, 276, 750, 892, 382, 850, 749, 473, 822, 431, 348, 648, 58, 912, 977, 259, 52, 754, 209, 825, 1008, 201, 77, 885, 204, 504, 362, 96, 491, 22, 225, 795, 34, 74, 312, 534, 515, 847, 168, 756, 329, 527, 1001, 316, 960, 481, 701, 276, 350, 403, 939, 188, 642, 1011, 607, 773, 230, 650, 622, 195, 345, 795, 638, 1004, 152, 878, 1012, 882, 991, 42, 580, 459, 292, 274, 753, 966, 633, 844, 326, 181, 576, 774, 947, 538, 997, 255, 280, 957, 741, 206, 87, 107, 955, 984, 351, 249, 381, 478, 757, 551, 531, 983, 432, 709, 189, 259, 914, 915, 606, 396, 19, 241, 352, 632, 675, 285, 86, 287, 921, 324, 15, 256, 589, 242, 532, 806, 197, 19, 243, 949, 631, 673, 226, 293, 538, 661, 1014, 740, 205, 696, 802, 819, 538, 929, 851, 849, 823, 616, 334, 465, 799, 498, 316, 836, 358, 973, 160, 794, 431, 893, 239, 974, 95, 206, 299, 373, 961, 308, 143, 110, 143, 965], +[279, 793, 745, 676, 77, 685, 514, 706, 958, 494, 420, 69, 516, 196, 223, 207, 73, 703, 257, 263, 439, 53, 163, 533, 147, 901, 932, 235, 310, 711, 193, 472, 19, 814, 130, 440, 679, 900, 54, 793, 534, 563, 798, 275, 334, 422, 645, 511, 860, 362, 121, 799, 1019, 517, 709, 503, 407, 896, 441, 677, 821, 976, 958, 688, 794, 133, 404, 810, 840, 559, 407, 877, 1019, 183, 63, 709, 532, 1021, 43, 241, 1001, 866, 212, 37, 29, 1001, 804, 464, 981, 860, 159, 19, 189, 930, 853, 804, 533, 330, 854, 288, 392, 956, 321, 975, 982, 399, 626, 762, 815, 405, 674, 875, 500, 417, 408, 173, 701, 957, 556, 283, 630, 935, 416, 171, 896, 989, 721, 211, 893, 985, 746, 795, 395, 418, 1012, 640, 329, 795, 347, 800, 414, 419, 405, 526, 721, 309, 823, 253, 299, 1022, 173, 609, 14, 362, 572, 703, 533, 661, 224, 160, 726, 348, 11, 686, 613, 852, 878, 681, 971, 23, 616, 44, 919, 384, 471, 206, 1012, 644, 968, 66, 959, 342, 32, 882, 454, 907, 395, 801, 400, 765, 17, 1, 786, 285, 947, 503, 183, 657, 807, 41, 174, 832, 9, 760, 396, 472, 288, 794, 847, 964, 721, 456, 17, 919, 87, 568, 328, 942, 589, 981, 347, 83, 198, 216, 721, 68, 679, 197, 931, 183, 622, 613, 745, 752, 522, 346, 600, 115, 815, 706, 134, 543, 351, 143, 829, 1005, 644, 882, 314, 372, 852, 843, 133, 413, 163, 532], +[227, 108, 171, 768, 678, 657, 951, 21, 664, 529, 706, 647, 772, 216, 143, 653, 529, 7, 368, 565, 316, 569, 244, 332, 373, 936, 574, 952, 130, 706, 711, 262, 547, 270, 673, 670, 804, 732, 388, 464, 164, 107, 318, 220, 262, 969, 504, 937, 58, 387, 145, 908, 780, 159, 269, 872, 780, 915, 285, 394, 735, 729, 767, 486, 559, 936, 682, 326, 815, 451, 63, 494, 156, 944, 658, 759, 917, 980, 9, 108, 189, 856, 189, 266, 726, 133, 171, 599, 1011, 992, 485, 285, 980, 270, 833, 784, 854, 527, 461, 84, 702, 62, 706, 972, 217, 533, 816, 985, 900, 107, 430, 726, 960, 583, 746, 596, 424, 1011, 870, 28, 304, 929, 406, 805, 966, 490, 215, 404, 629, 677, 882, 355, 888, 661, 674, 152, 321, 79, 688, 198, 140, 836, 960, 211, 476, 967, 606, 586, 892, 338, 404, 150, 727, 911, 913, 82, 880, 696, 391, 277, 604, 584, 538, 1013, 851, 637, 269, 154, 255, 738, 836, 651, 855, 39, 567, 213, 751, 749, 559, 320, 725, 330, 542, 549, 395, 40, 742, 325, 489, 475, 147, 951, 574, 1009, 188, 207, 703, 815, 793, 268, 1021, 718, 822, 308, 351, 152, 697, 216, 922, 254, 459, 248, 878, 998, 933, 940, 249, 471, 139, 208, 111, 507, 351, 624, 173, 613, 986, 560, 212, 302, 156, 262, 914, 375, 1006, 656, 822, 254, 767, 314, 646, 787, 920, 580, 746, 640, 16, 126, 266, 765, 32, 349, 579, 986, 851, 139], +[958, 476, 918, 116, 271, 741, 608, 278, 815, 559, 989, 543, 40, 765, 288, 1011, 184, 165, 405, 534, 692, 972, 765, 395, 816, 890, 740, 463, 378, 35, 561, 754, 991, 237, 518, 539, 667, 776, 421, 564, 782, 967, 731, 88, 28, 331, 358, 895, 185, 598, 46, 838, 791, 797, 1002, 694, 909, 766, 502, 376, 690, 583, 42, 989, 452, 131, 220, 184, 846, 492, 670, 720, 994, 359, 23, 872, 820, 328, 532, 985, 40, 162, 353, 75, 468, 647, 63, 790, 440, 1014, 816, 559, 165, 18, 434, 348, 603, 212, 729, 482, 274, 67, 233, 771, 601, 178, 638, 427, 154, 941, 787, 163, 798, 970, 1006, 208, 141, 138, 415, 284, 200, 546, 356, 18, 89, 466, 857, 93, 623, 35, 740, 27, 322, 222, 645, 509, 694, 463, 244, 500, 857, 62, 502, 347, 671, 98, 545, 571, 777, 397, 705, 280, 943, 177, 541, 40, 904, 663, 543, 716, 475, 381, 179, 165, 65, 893, 478, 321, 121, 2, 73, 50, 451, 238, 295, 783, 720, 137, 800, 622, 940, 818, 534, 499, 493, 750, 135, 360, 810, 44, 369, 173, 935, 845, 497, 516, 800, 255, 990, 45, 527, 370, 755, 790, 693, 664, 74, 614, 625, 598, 450, 898, 89, 243, 782, 838, 796, 891, 288, 226, 662, 262, 1005, 70, 745, 105, 589, 422, 801, 541, 780, 790, 319, 516, 730, 155, 336, 904, 930, 189, 896, 1018, 735, 829, 996, 89, 50, 404, 132, 13, 813, 488, 477, 435, 966, 730]] +cTilde: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F +z: [[510138, -234579, 48923, -517084, -505489, -32849, -70614, -320501, -393243, -208670, -262951, -341748, -494513, 454109, 197872, -161187, -12678, -129883, -327101, -421292, 176734, 308782, 345430, -209293, 45394, 106105, 83885, -156581, -133650, 416464, 28338, -377603, 176239, 487922, -52926, -198294, -329515, 119777, -349204, 81136, -326211, 413168, -437313, 109273, 54937, -411452, -440516, 451272, 234104, 41683, 492223, 106089, 397756, -144893, 522731, -405558, 329719, -72435, 250842, 452343, -372988, -320202, -449893, 167943, -320126, 480183, 73617, 11034, 187489, -509574, -338324, 308299, 294360, -286339, -53777, -442712, 389006, 73069, -187934, 55300, 496022, 77957, 490811, -262424, -262628, -453747, -10563, -311787, -348685, 224786, 141795, 186931, -419429, -187781, -105249, 322312, 422714, -510374, -29659, 172459, -215372, 71499, -9523, -231670, 286015, -348949, -54139, 9692, -67897, 234558, -149921, 148682, 411066, -236390, 508718, 436675, 363781, 39812, 499455, -203475, 53809, 159076, -367850, -194922, 87715, 81623, 424483, -312139, 427374, 376875, 440328, -510521, -395226, -102743, 505833, 199782, -20019, 226357, -105129, -245243, -338447, -255738, 439992, -150838, 329496, 89685, 355648, -352875, -137697, 205489, -481166, 78186, -56172, -435206, -478049, 492422, -116102, -351761, -4060, 248759, 151096, -58622, -95969, 341827, 186512, 6177, 333507, -145931, -4457, 57781, -319009, -438384, -220602, 203369, 113422, 362436, -355564, -348630, 265215, -114664, -94357, 63515, -410079, -460707, 243912, -446623, 204191, 80152, -138852, -501750, -253561, 295002, 260550, 476412, 320780, -74896, -169127, -295293, 293496, 317182, 110136, 269081, 17075, 348386, 342762, -431674, 16028, -344030, 72244, 74281, 413354, -18472, 297589, 141754, -475726, 48593, 26326, 432042, 491619, 228427, -202151, -250824, -430889, 389835, 410039, -88794, 2242, 19680, -363383, -511455, -348512, 443887, 176221, 449162, -386532, -321225, 242112, -158393, 163554, -62339, -400578, 310248, -209487, -180244, -460428, 165591, -13405, -305343, 472286, 296989, 327673, 515290, -178262, -441707, -491898, -143002], +[-393556, -41414, -86034, -146088, -452845, 80460, -446254, -155562, 24789, 130923, -394796, -133706, -216632, -413849, 228936, 46298, 183574, 188490, -342354, 151561, 456646, -249382, 470510, -39201, 26766, 262524, -140511, 429613, -33721, -99188, -108869, -402782, -63958, -155043, -167569, -495938, -434811, 408309, 86068, -71709, -477711, 61340, 464804, -473444, -299386, 349011, -19338, 25170, -56097, -478527, -309743, 198984, -396948, 315508, 505419, -83597, -212348, 486001, 99381, 286560, 330994, 519733, -348260, -163297, 6711, 14178, 123797, -45892, 508372, 68104, -165666, -49499, 55815, 1110, -75016, -297108, 56195, -367017, 21882, 410535, -390145, 396123, -95524, -461074, -197954, 395938, 447024, 338444, 397359, -197679, 129833, -363617, 398571, 346311, 356570, 491301, -345191, -386834, 370752, -317547, -491923, -487217, 136378, -349789, 259811, 285990, -502970, -312128, -31617, -59697, -506828, 499983, -212157, 199534, -338341, 117554, 158900, -6722, -520819, -278432, 409299, -454240, -307715, -273391, -298310, 38661, 357259, 233133, 360881, 109553, 487177, -146118, 10808, -488621, 505841, -373203, -376880, -457525, -468647, 173940, 261799, -8488, 128854, -157295, 110253, 202198, 365587, 36578, 456911, -399454, 358220, -73290, 409162, -17700, 219038, -219462, -449615, -224460, 187990, -25442, 50583, -301454, -237262, -290256, -86958, 496771, -348124, -235540, 115513, -315876, 182928, 335492, 465414, -193222, -444040, -415636, 507854, 141997, -4578, -346623, -49956, -35891, -164668, 501428, 412222, 134067, 223108, -340972, -245458, 131540, 245921, -312517, -154203, 8626, 180257, -128587, -448245, 513375, 5139, -411084, 476552, 80864, -477103, -125556, -395355, -166681, 265854, 158395, 158426, -131769, 397656, 221591, 265501, 366548, 480691, -159587, 124974, -114991, 116455, -183755, 88627, 318597, 292242, -275992, -487349, 225332, 117168, 383608, 17479, 304312, -375824, -247133, 62155, -191278, -434832, 419359, -167575, -389389, 231834, 198079, -370914, -254308, -15876, 301190, -256563, -486102, 192425, 310544, -222495, 356708, -169683, 330334, 110874, -261476, -392632, 30320], +[-279280, 418861, 298401, 418625, -126935, -409277, 142788, -108303, -360535, 241769, -58860, -305830, 379325, -12804, -223664, -132775, 227835, 9218, 298026, -93530, -156088, -216120, 518394, -257125, 275561, 272555, 182014, 494235, 448934, -234511, -350015, 193833, 385954, 189601, -19616, -461945, 452464, -305971, -382817, -80501, 232788, 23350, -259847, -355245, 240374, -252367, 205191, -128830, 51459, -252135, -256776, -444317, 351993, -283542, -74169, -440821, -369918, -93686, 482198, 450214, 257818, 142343, -281541, -227172, 478364, 328712, 266876, 376290, 249967, -225141, 63518, 396405, -135015, -473607, 463421, 48815, -361475, -169501, 237962, 72034, -456876, 456126, 190359, 95056, 326775, 64043, -331846, 344896, 468825, -307875, 184316, -311405, -377025, 57683, -501521, -214102, -320084, -507349, -367459, 211357, 206794, 445608, -523427, 128534, -321879, -8299, 197065, -139666, -252370, 396128, -174018, 77503, 274389, -292420, -167579, 268053, 405880, 430447, 350236, 387003, 160718, -173311, -504242, 236471, -33159, -19135, 8777, -479993, 438175, 482249, -160835, -192461, 237538, -101028, 227863, -156089, -318393, -479272, -417929, -48819, 521495, -265975, 141432, -372329, -401183, -321250, -328669, -104465, 370202, 307903, -236496, -85599, 430784, 466596, -275865, 344, -274093, -275527, -290443, -179936, -384667, 17520, -88783, 456372, -411593, 85408, -517259, -67173, 450685, -402516, -227683, 14323, -122150, 327185, -151453, 7196, 84022, 437517, 258350, -226106, -330471, 45593, -52758, 223462, 316277, -57182, 337879, 182074, 507880, -381487, 273861, -112655, 301039, 116499, 264505, -143497, -339226, -439780, -82583, 218317, 148382, -446024, 324359, 473437, -441655, -475369, 300250, -296360, 300400, 475912, -135989, -415320, -501465, -113857, 304595, -42931, -194750, -210936, -365760, -194501, -155957, -413185, 158906, -396234, -451238, -433327, 265027, -353646, -27475, 425563, -80624, 204443, -279765, -296935, -235965, 180585, 337442, 150221, -148319, 323512, -351903, 460624, -444651, 235491, 356763, 42091, 298084, 449095, -51469, -472395, -457160, 312172, 43120, -318845, 460911, -56222], +[-257156, -74487, 291534, 424441, 183888, 46458, 29089, -3767, -63785, 64921, -252107, 433098, -179911, 509820, -506424, 435444, 287895, 286497, 391861, 305853, 303174, -338842, -261810, -115984, 85460, 270764, -341018, 416157, -267366, 235789, -21900, 145853, -421314, -29348, -257027, -508169, -507529, -104534, -487575, 421096, -396623, 352609, -438936, -235829, -422000, 261811, 238691, -492506, 387699, -171964, 74373, -311694, 344001, 45196, -164993, -301547, 351797, 98293, 405375, 113627, 94439, -284955, 509760, 195426, -92623, 34512, -157438, -403019, 241127, -5210, 223631, -368470, 354525, -160429, 185597, -194719, -51850, 74252, 267500, -462052, -51369, -188314, 158414, 479502, -413610, -274585, 508847, -471711, -261342, 441317, 126982, -215254, -274290, -273820, -505351, -123142, 173095, -222388, -89369, -158789, -506488, -112038, 442077, 501038, 220906, 274131, -75320, 126291, -220595, 150882, 446550, -453470, -328229, -494305, -505175, 335459, -155159, 470365, -460863, 409070, 344651, 363668, 162225, 45620, -105411, -325582, 239777, 110919, 170772, 388011, 14833, -396566, 127372, -449718, -1730, 394076, 248665, 84591, 30304, -109073, 312762, 16339, -230273, 198410, -506114, 488359, 326081, -337087, 287696, -185378, -501896, 71020, 426976, -483456, 240510, 198335, 111066, 103347, -358524, -157208, 185156, -485028, 118932, 431641, 125040, 341744, -200137, -67268, -303580, -64198, -121086, 391421, -432098, -520773, -294988, -227495, -378929, -303969, 341628, -20897, -122899, -478476, -509467, -436360, 154678, -502165, 82973, -290762, 29358, 471484, -484359, -14796, 216189, 437158, 385562, -191705, 472119, -219177, 16224, 128701, -137177, -120793, -237298, 88912, -6209, 436958, -490472, -57622, 249449, -505454, 398529, -399709, 459452, -332658, 171498, -182167, 131499, 369091, 70523, -131974, -442079, -286054, -27783, 212705, -469648, 116162, 13836, 11541, -361820, 414526, 149262, -119464, -104719, -25477, -427088, 445140, -67763, 295750, 97802, -16601, -516591, 309987, -168357, -32341, -135307, -344317, -175321, 471310, 392834, -425628, 59456, 46162, -192012, -84113, 148647, 270281], +[-127978, 102191, -454009, -19929, 297878, 187874, -908, 142176, -34608, 60524, 240758, 333387, 19770, -172811, 107373, -282138, 488451, 11426, 395629, -452418, -194797, 42115, 178597, 157722, 480553, -469904, -286456, 36620, 192006, -109930, -504099, 486482, -6642, 396355, 254151, 425672, -193518, 117979, 344217, 132326, 322345, -74240, -250041, 442526, -128943, -186102, -319217, 63470, -314231, 99945, -448118, 254935, 245086, 336475, 92141, -436503, -60359, -56538, 216113, 403527, -126361, -337455, -45845, 132175, -368794, -8644, 431518, -329524, -278829, 84608, 438582, 197467, -202046, -464193, -93050, 39300, -506633, 325942, -304696, -158423, -479083, 455843, -57385, -356471, -366085, -301417, 394325, -411175, 454568, 213558, 206250, -448369, -68240, -183496, 29143, 251775, -443241, 22311, 301383, -369631, -189915, 212090, -199330, -102791, 386836, 177426, -65648, -405579, 506290, -20952, 468108, 427968, 393796, 206211, 190272, -225406, 520341, 366486, -285475, 213471, 474161, -409506, -269397, -112929, 211052, 181908, -361025, 444247, 10681, 162934, -241667, -167128, -141130, 223762, 516406, -434278, 316893, 254235, 407426, 316104, 322166, -157734, -103346, -390360, -276123, 82455, -324911, -154473, -320100, 26335, 417556, 142861, -118400, -48019, 324103, -488059, 114867, 453929, -128381, 392897, 131196, -152923, 374831, -491938, 21661, 436097, 253513, -107817, -340750, 420700, -82461, -436666, 348846, -314490, 223414, -310615, -381992, -223278, -37919, 128514, -182512, -378158, 90873, -259460, -361868, 186858, 449831, -47429, 221125, -241025, 271117, -292541, -232991, -418501, 51723, -191387, -186899, -192996, -206332, 283069, -417951, -424648, -446259, -435500, 271780, -374168, -196435, -323363, -100350, -285639, 252868, -56090, -3422, -442807, 238601, 231563, 253894, 169262, -477893, 464489, -504310, 193843, 489456, 284203, -61751, -273756, 227484, -225806, -407028, 91864, 450698, 282705, -179964, 94532, -450037, -164781, -264189, 381880, 5556, 339658, -376702, 335307, -375363, -49693, -412939, 433685, 92078, -179094, 173933, -215752, 394475, -421611, 194412, -213530, -126050, 467755]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] + +Proper number of hints provided. Provided: 32, expected: <=55 +||z||: 523427, ||z|| check passed +aHat: [[[7362588, 5894154, 5880011, 8096833, 132283, 2283759, 7503937, 2007765, 6714067, 1163014, 3501190, 2442769, 8314130, 413036, 6424373, 2894874, 1160728, 2574248, 7858974, 2221584, 788444, 1217899, 6574777, 1365724, 8131316, 2407711, 749969, 6116699, 3722572, 4990263, 7895726, 4936703, 4443443, 3083631, 1401460, 6829426, 6635222, 1002550, 6868719, 590467, 3062155, 1034810, 2791300, 6684181, 864545, 4268112, 6668335, 4959758, 6103038, 7923878, 3789931, 5845212, 7743477, 279588, 2220977, 3677481, 6465489, 6272993, 7205613, 4566541, 4730453, 5990791, 2366814, 82511, 2928011, 1927602, 2156905, 6817467, 3985005, 6199611, 4281037, 385889, 8628, 1405045, 4379228, 4571305, 4558323, 6828423, 1861327, 1089384, 8003355, 2192764, 5182493, 7397374, 4412405, 5362547, 1275580, 6720126, 4347740, 1674157, 5130420, 7644083, 238361, 4338101, 5039806, 6496887, 5977108, 8024923, 3538949, 1018072, 4443580, 5642240, 5955981, 5772264, 5672318, 5847198, 4377188, 644312, 83535, 1043146, 7391445, 3104582, 3667978, 4731339, 7243530, 3768184, 4953869, 5393736, 6761022, 3212393, 5728202, 1328754, 4337985, 7470928, 5016408, 6307694, 4589681, 4145735, 5363868, 6646807, 5212200, 5502628, 2695363, 2216489, 2712097, 2058591, 7014228, 3272176, 752420, 1380621, 2346735, 3538273, 3898878, 7293582, 7376394, 2478102, 8029360, 5255727, 240535, 5559974, 3757353, 4635218, 1103238, 293420, 3825591, 1119631, 1378076, 731944, 2652510, 8337704, 5222020, 5366576, 2409169, 8059973, 5839850, 3501388, 7922628, 5421756, 2627560, 5865313, 2040681, 7354278, 4738951, 209133, 4056371, 4604652, 6516621, 3421599, 7053857, 5368637, 3752760, 2846019, 2382761, 5481618, 2348337, 2996413, 2126240, 8255689, 204169, 2247633, 1740745, 7498380, 1256707, 2351219, 5885287, 5113736, 2548338, 7145749, 3461299, 4160225, 5771799, 5799718, 7004055, 4114934, 4684975, 6956176, 5212552, 1920834, 2197509, 5279373, 996767, 8243318, 6434224, 8208305, 71818, 2638264, 7537229, 1662416, 6005920, 7377864, 456812, 2670945, 6816367, 8315745, 1958716, 93034, 744698, 7725220, 5902797, 3691912, 2657976, 3471679, 5882891, 310372, 4202355, 5624133, 3893956, 6965316, 5246078, 5629663, 4805644, 5970337, 2035740, 6463727, 2312018, 1363607, 3713025, 7622047, 3603965, 7773586, 3571800, 627625, 3130715, 549897, 7298176, 8359776], +[1165602, 3634040, 7110348, 6039535, 8209112, 8342684, 3376761, 2760752, 201874, 5788205, 6315920, 5758613, 4180208, 3498018, 4506185, 6197602, 4825715, 1413018, 4001908, 5200822, 2321616, 43264, 357657, 3357947, 5478400, 1625148, 7950715, 241908, 5817357, 6314876, 3963827, 2765806, 7187638, 5098494, 4495365, 4124864, 1563629, 6643348, 2155850, 813048, 5462957, 5416878, 5407763, 685417, 1482758, 2211367, 7400454, 5644271, 599228, 1192002, 3950753, 1943948, 4147278, 7709236, 4455786, 5969957, 4873849, 2497883, 7702897, 1951031, 2746827, 541648, 6820767, 4343169, 7809196, 3075663, 2498997, 7516711, 6073110, 3812366, 6180662, 2140253, 955825, 1183827, 3824805, 961270, 2848570, 553317, 945650, 846350, 7115358, 7684494, 3452277, 2829465, 7560733, 7765663, 8046459, 6122871, 2186559, 1063033, 8249483, 1394306, 664161, 7734307, 4722290, 3791427, 2435952, 263490, 1006165, 3331598, 1364040, 995391, 2074495, 1907554, 2358279, 2270487, 634762, 7962901, 5614697, 5786521, 5116667, 1430717, 7455972, 2533159, 7947550, 7739229, 4927600, 241260, 7369022, 6744571, 6680687, 1961030, 2093028, 4786791, 6246262, 4051533, 3634060, 2403470, 2802259, 3645990, 6976210, 4921899, 5421392, 2002756, 6710071, 2947573, 1575303, 4408913, 1184854, 3248924, 8314261, 5273575, 2035537, 3057717, 4276424, 5822730, 2723413, 7019988, 818534, 2429970, 1355058, 7224104, 2099984, 7006142, 1252024, 1322417, 4242718, 1761064, 2157891, 4952775, 2413792, 4326818, 7109905, 5383105, 6756494, 6255540, 2899390, 3086583, 7685346, 4041101, 5334956, 4513393, 6517963, 4356627, 2904889, 2415412, 7209635, 6858378, 3366617, 2446291, 206235, 1998054, 4488129, 4659437, 1338118, 4922652, 6007451, 5557143, 4798024, 86509, 3799432, 5945739, 1001428, 7172374, 2827278, 7428682, 963842, 7199121, 6413373, 6585976, 4442989, 8150284, 459638, 1681794, 4346128, 7943864, 6962572, 7466591, 3401623, 6306091, 4245753, 5519446, 1599041, 2410812, 1955008, 5812175, 7440355, 253888, 4607519, 700571, 7817367, 5129683, 8046724, 1180791, 5121466, 8184965, 6029940, 3191617, 5335654, 7208397, 7752286, 4052684, 1826096, 1681526, 5923139, 4148306, 4764105, 1496019, 8215829, 7787085, 2322997, 4716898, 7780010, 6832169, 5960634, 644622, 2145941, 7046161, 5644191, 5390778, 1364486, 3472707, 4379141, 897129, 6882711, 5430079], +[505114, 5838411, 458830, 7979075, 5670264, 428930, 2058328, 2485778, 858513, 4171598, 771049, 4557941, 7078960, 246752, 7657596, 7311947, 7436757, 1653825, 4568902, 3837170, 6749455, 5267730, 383035, 3909375, 5270349, 145041, 3920578, 5361952, 4096288, 6984536, 259924, 3272990, 884519, 98442, 2659246, 3976976, 6318032, 7515034, 4097893, 7421103, 6440169, 5112475, 827215, 2064256, 4377010, 3093679, 2450524, 3787473, 5776436, 276928, 3714652, 2110852, 5493568, 6075210, 4651349, 3731505, 726674, 1143540, 6882240, 7156679, 4538267, 4665241, 2801764, 7280180, 252381, 6983846, 682666, 745105, 2200604, 853536, 7165497, 7160843, 3730324, 4436126, 5617625, 5189944, 2914093, 4496979, 3516525, 13047, 2428412, 5364195, 1016854, 498020, 4142253, 2140607, 3152766, 1112431, 1234741, 6955238, 5169676, 4631628, 3054791, 2087732, 2465428, 463256, 7167142, 3603646, 2464664, 7639896, 3371774, 6442849, 8136564, 6870187, 7619253, 5091511, 5544448, 7282816, 2676623, 4346091, 7355838, 5624071, 8357150, 7743875, 3316444, 1125481, 2162453, 5269410, 2538916, 7800595, 6026549, 1027938, 4350245, 6420015, 6184288, 6310221, 513821, 7559827, 3953617, 7806425, 5631665, 8280539, 7310264, 2319526, 3949448, 7788157, 7304291, 4928684, 1680833, 823594, 4935571, 1167600, 3779509, 740800, 4440378, 8349898, 2763210, 4889870, 2000015, 7944716, 6271045, 1226933, 5970183, 5409407, 7578268, 8035409, 287674, 5050922, 5844110, 3363, 611252, 2169335, 4209434, 2939101, 1571908, 4275336, 2598254, 6241832, 1325770, 385487, 4351117, 1453115, 25983, 316062, 5096263, 630583, 4570252, 4936580, 777653, 1704006, 707311, 7275667, 5596671, 5821069, 4340668, 8138438, 1949494, 2708823, 5573315, 3015582, 3160028, 2104984, 2106968, 997833, 7668145, 3397302, 4011508, 8157055, 4272834, 6214778, 2211064, 5927928, 1509789, 2125254, 4311991, 5758295, 2999602, 436929, 7424939, 5140240, 7850182, 8208723, 3265879, 2990560, 3494414, 6411512, 1900577, 459225, 2630952, 6593861, 49107, 5564964, 5578656, 810329, 966231, 475707, 703117, 3318228, 3963650, 7675122, 7329663, 3802392, 5855827, 3823188, 2190891, 5445224, 3779374, 3656226, 685799, 5635990, 2857226, 6878675, 3196110, 1046190, 3346555, 3616861, 4973370, 4549612, 7920465, 6300767, 6214323, 5943331, 3155418, 6850125, 4388611, 8062733], +[4737550, 8048528, 4107210, 984588, 7828055, 3274280, 3026894, 5446031, 1903226, 4956883, 8190333, 4285655, 2638668, 2865996, 4366557, 3105262, 3050745, 4540210, 4219641, 5892592, 709806, 6565870, 4668530, 5135327, 275888, 7605568, 6673552, 1174721, 7568946, 4591818, 1071126, 8224313, 74878, 74221, 2650921, 4930059, 5880414, 4860806, 2147990, 5198647, 4458108, 2010112, 3173104, 1823603, 3789165, 5433558, 3378967, 6728625, 7750219, 7182116, 1083409, 4622439, 2706515, 3724290, 4638369, 3629000, 6883744, 5463586, 4104599, 7196998, 4588331, 7691203, 3385192, 5993936, 3219116, 6254121, 4654236, 1134965, 781900, 6078201, 2502042, 2931972, 1709475, 3753804, 4495032, 6564477, 2889019, 1836204, 4419335, 5745087, 1956861, 3165674, 4437600, 3788057, 1494209, 6957226, 3888012, 2305134, 7808636, 6002347, 703111, 6146887, 1123396, 5867795, 5863886, 6860181, 3344048, 6844232, 2344697, 4691877, 1789836, 5604384, 1562372, 7671115, 6494182, 1077688, 5226722, 2222305, 3448059, 6964631, 735555, 1806530, 5128669, 1247084, 6891051, 3774502, 7071578, 3121229, 1390498, 2776435, 6047796, 1999364, 1255580, 7607344, 7487697, 5815697, 863222, 1565596, 6748431, 1788600, 72186, 7635313, 5640986, 7492486, 3364616, 7606064, 409134, 6373849, 5230143, 7269209, 2543774, 7937739, 6835221, 6297779, 3076839, 8243484, 7723477, 1793471, 8167778, 8014589, 2403828, 5272056, 5922292, 5848470, 8119959, 450362, 308340, 6325036, 2715525, 6139470, 702951, 6830200, 1533969, 3208189, 1386152, 2695572, 57146, 3124851, 1632590, 4710462, 2775192, 3937636, 6035512, 2449625, 2783071, 6480750, 3948025, 263952, 5958995, 726354, 7321928, 114339, 2951138, 501832, 4168598, 5687147, 4092669, 716281, 6468313, 1362399, 417794, 6906556, 556054, 7136725, 52745, 7134021, 1704569, 3708079, 98924, 4655931, 3221713, 7343215, 5560813, 4012560, 4777943, 6446589, 6919466, 270230, 2721190, 366025, 2143534, 7839290, 6596444, 1110038, 6822107, 1065872, 3706207, 3491453, 3803748, 796242, 2519451, 6221889, 1420897, 4848962, 8184104, 8263501, 2413988, 6794431, 4461693, 974563, 7867085, 7222624, 1972281, 836427, 7662464, 3687427, 6341463, 6338951, 2921150, 666362, 2709451, 190938, 950143, 1638819, 6705582, 2585679, 1043943, 1029106, 4998840, 2916442, 1752930, 3870477, 6481668, 7946008, 4607663, 6870304], +[3182745, 7923767, 1881512, 5666672, 3725183, 7462747, 7512841, 3948754, 5560866, 7478113, 6686399, 7110333, 797427, 1413528, 4434905, 7426521, 1283785, 1070493, 1926052, 8278452, 8265172, 1683308, 542918, 7668523, 7927651, 5086113, 4245564, 317320, 5063224, 1953522, 4149499, 2179866, 1171448, 1348595, 2384817, 3328575, 5991176, 5141331, 796992, 8111744, 3228087, 3301218, 5012175, 1234729, 5215828, 1741330, 7922946, 6785795, 7014834, 6806591, 7910423, 7715642, 5790481, 4022203, 516672, 4836282, 2151373, 4058635, 6913047, 4275635, 7705427, 6604590, 7387829, 4974745, 7088812, 726735, 3962405, 8008208, 3429879, 1001561, 7385419, 7303017, 6466025, 6802630, 1311406, 7894483, 801809, 3657355, 2115056, 1344905, 3633466, 7685224, 96567, 264529, 1075988, 471700, 183406, 5781459, 8045067, 1116420, 3171056, 6637936, 5732809, 1887054, 93787, 3230012, 2221408, 6731629, 1491280, 6268918, 8069406, 5352542, 2545514, 7361499, 451578, 7885786, 877656, 4628491, 377192, 6953835, 315440, 4907243, 828374, 2615419, 1854080, 5685022, 2738003, 5161035, 877231, 1098777, 7032050, 2523581, 3054229, 7813041, 1301105, 6898779, 3840160, 2323483, 1844776, 3404360, 7510288, 6357935, 7146518, 6628141, 6328184, 2520575, 5841325, 866922, 7180389, 177690, 1900266, 3452835, 2801045, 565750, 7754166, 1207281, 6471304, 5121119, 1736165, 4541924, 2636272, 1752922, 1904579, 6224522, 1807637, 82904, 3077493, 8006917, 6490757, 5522252, 4050886, 3566680, 6799970, 491862, 1829545, 408681, 5167759, 1959073, 4349577, 5517453, 6466427, 6302192, 2422246, 2450064, 6908661, 8272082, 2438312, 577615, 1999103, 6918755, 332211, 711329, 167323, 3256704, 3837251, 7547988, 2158614, 7326568, 5929825, 794757, 7416099, 7528374, 7899484, 4632900, 39588, 3289222, 1066677, 1527274, 6664095, 6906679, 3396863, 2394333, 8096684, 5608590, 4118079, 586518, 4624671, 674078, 617689, 1932984, 6883298, 1980929, 3092564, 5677999, 5254077, 3137360, 965539, 7824182, 5587505, 8242425, 2839164, 360951, 6365190, 12294, 4257900, 1861151, 8334802, 1955050, 4610407, 3205026, 6050521, 3482675, 4673330, 3462746, 7699439, 5489040, 7570779, 6320951, 5133500, 1169752, 5126912, 1454446, 7050478, 4473394, 7308745, 4509160, 3086393, 7483219, 6966811, 4270475, 3829510, 3489376, 3900039, 1472046, 1058760, 4635091]], +[[4783728, 6971984, 6014887, 8177505, 2661206, 5057619, 7104070, 3267204, 2545438, 7808587, 3806208, 1770766, 2076486, 759003, 7539833, 5957880, 2470481, 7257792, 4742953, 4277194, 6602243, 1059796, 4449907, 8068219, 3526629, 1643952, 6556480, 827697, 3586264, 2296454, 7709521, 3871087, 2601231, 4725657, 3978602, 6732125, 4229320, 2053968, 8041951, 7480195, 8281206, 2895434, 4591112, 7379399, 779364, 5507469, 1000837, 7390737, 1666993, 2419123, 4704287, 3243057, 2378154, 4722433, 353944, 2499271, 5904704, 4714191, 2445013, 2827027, 4037839, 4250606, 6845118, 7338574, 2680409, 3271621, 4144600, 5730330, 6299637, 4456499, 1946830, 7962633, 6358559, 1840663, 661337, 3143481, 6856208, 1699830, 7503606, 503423, 4630460, 152989, 5237847, 1852456, 6345160, 818405, 3829701, 23091, 4606903, 783136, 1293595, 6016578, 5807955, 5188939, 5040811, 4049759, 6672616, 4135481, 771424, 4304911, 3339854, 2623875, 1065712, 2875069, 5038555, 2139921, 1368674, 1012534, 1936027, 7272741, 7757387, 4745078, 3661691, 1153798, 1255846, 199994, 1731000, 7662338, 3467728, 5538529, 2194099, 1523320, 5721876, 6925561, 2897407, 5464133, 1065994, 4422408, 5924958, 3441380, 2933156, 850645, 2104296, 6790780, 6426416, 7457680, 7263847, 6124308, 7207235, 8156450, 960128, 5440223, 8154437, 528374, 7583538, 1116435, 6455056, 2760370, 7118778, 1668287, 8090940, 5227125, 4035129, 39516, 3467642, 7472954, 5705942, 2431326, 2631238, 7663266, 563127, 6309747, 5962833, 7973041, 6713059, 1486236, 7200264, 4726754, 4356790, 1700066, 4037329, 5613675, 5401752, 7917892, 3807897, 3206110, 2577303, 2406821, 4512060, 6574960, 96202, 2439024, 210204, 924092, 6263422, 7741747, 4336261, 603309, 1378288, 994890, 546283, 7232013, 5160810, 1430806, 6877074, 6483400, 111382, 4582588, 1773061, 5139852, 4690217, 7689478, 719824, 7076728, 6832204, 8326250, 857254, 5440343, 2746930, 6003197, 5905397, 5111132, 6264746, 3532368, 5919685, 2442829, 6063805, 368540, 8273404, 2175101, 2550107, 6515260, 7028186, 4199062, 7775558, 5884433, 1631362, 2852704, 4100370, 6890550, 1329759, 8008976, 4332620, 6850824, 8324088, 4462596, 1489470, 5336156, 6394613, 2701408, 2903586, 3809008, 333561, 6178734, 5968284, 1644749, 4620162, 1735123, 551435, 5368725, 5238528, 6456315, 4157935, 1173210, 665836, 5654516], +[8066863, 2276547, 6953891, 1462440, 1176768, 1864632, 2710075, 5604281, 2414955, 6704923, 6283663, 639890, 2039091, 4836437, 5210445, 3247845, 6357339, 1958002, 1255963, 1428875, 2984969, 3889466, 6545848, 4486978, 3679093, 7966850, 1439790, 1277904, 3514871, 3145422, 6610604, 6005866, 3156548, 3352067, 4849802, 4988199, 4784287, 5210118, 2020445, 4169917, 1534423, 7100134, 3318134, 5572433, 7518875, 7198171, 2956025, 3171352, 1241811, 2463028, 3136555, 314147, 1805312, 770262, 1806058, 1398905, 708495, 5610281, 4607891, 2953617, 6605103, 5923007, 8038834, 6563577, 4189426, 325266, 8004516, 3649422, 875634, 4463363, 4581655, 8291003, 6045720, 1404232, 1398626, 5310796, 3879650, 2730511, 7226217, 7237437, 7890020, 5175883, 2383216, 5258581, 7548550, 7944568, 8058776, 1966785, 2059705, 8002221, 6688122, 5546498, 7386599, 5543666, 8166202, 634868, 7785138, 5112402, 4391601, 1405198, 3876236, 700375, 774524, 1067817, 3530973, 7103543, 1658058, 7099410, 3876423, 5221750, 2506199, 1724209, 2505794, 3098281, 3698308, 6709122, 8358058, 1385435, 7997912, 8253954, 2920582, 4834713, 6910866, 2306372, 1793155, 7657132, 5049787, 6595121, 3127920, 5591306, 2295253, 5963191, 73680, 3367601, 4053080, 4681502, 7238248, 562430, 4492708, 3607751, 8081555, 5924787, 4950987, 11133, 5363299, 6000270, 6084419, 2714066, 4947097, 164583, 4554139, 8268073, 107772, 5060501, 1275028, 6853258, 4992988, 3350803, 1354897, 6790678, 3139078, 1803038, 5791372, 6623993, 5723158, 3833357, 6459385, 3472174, 2658743, 1093908, 496510, 6388363, 4438387, 6808811, 6472602, 4250950, 1210704, 473341, 990, 4054888, 5717684, 7198170, 1266928, 8059271, 7621431, 1386190, 189584, 1723579, 7635318, 2899180, 260145, 7512010, 1228060, 6001604, 285320, 1334911, 6642978, 1488782, 2552255, 7007241, 3169970, 7348415, 8042986, 6565085, 1293318, 3652276, 2853254, 5192005, 5855669, 4877132, 2615501, 3590133, 2666689, 8148427, 4477653, 127761, 8318770, 1015078, 3768226, 2872895, 5412207, 7111904, 2186685, 7252906, 1955024, 7155630, 1064021, 6217860, 4795666, 6325131, 1605563, 7661337, 764032, 7809716, 4454657, 2572843, 601248, 4524304, 4625812, 2128539, 7750618, 4626730, 1457655, 2810869, 2557993, 4701640, 5409177, 3199315, 6993950, 736152, 1566925, 2974952, 2932134, 753397, 1063094, 2739865], +[6069280, 786561, 5788053, 7004517, 5662557, 6086849, 5955012, 6661186, 4502014, 6473239, 6286892, 7779376, 3960194, 5199936, 5904044, 3537710, 6432962, 7310589, 2630838, 6895247, 867362, 7735717, 3243253, 1043486, 5029787, 6048398, 6849665, 1503762, 5282307, 2131544, 5988162, 6409504, 5291448, 5925297, 6789632, 954809, 1203466, 4849304, 7822917, 471221, 4834366, 7157450, 6259952, 7654366, 430249, 2204218, 8005943, 5964295, 3259679, 4184293, 2663704, 3904292, 7661201, 6897985, 2044288, 8020374, 4594341, 3392810, 1160388, 5795120, 3554426, 4788605, 5800154, 5862918, 4672815, 7452081, 2218410, 5849841, 2197862, 2132099, 6402181, 8374792, 2125942, 921718, 4165551, 8260450, 7796138, 796494, 2886414, 5321119, 4947345, 3236877, 6951953, 6526592, 1628982, 6262455, 2660342, 7346294, 8229148, 6408207, 6282327, 4081341, 8072854, 5375475, 3615723, 5189720, 7467751, 4107131, 1373551, 5614974, 1914531, 6283994, 297571, 4145939, 7401335, 99382, 2214250, 1240172, 4665635, 783655, 7194557, 3989406, 2787997, 1351695, 5266414, 5529245, 5509100, 5094490, 18513, 4629590, 2975864, 4277507, 6727672, 4032433, 7425174, 2685773, 4580873, 2305987, 3801267, 5461311, 1286936, 887206, 4667145, 5849405, 3898691, 75545, 8152764, 7039378, 6765387, 2385854, 2354367, 3159157, 3957469, 1137864, 1644241, 2531833, 3795721, 5778535, 7174456, 363838, 3130965, 4897176, 1535548, 6912009, 3363853, 1977335, 6497406, 5744455, 1828820, 6428542, 3601627, 2055614, 5604306, 4380000, 8258168, 25927, 7036092, 6507512, 2017607, 358102, 5434520, 3438661, 113207, 6073558, 6639252, 4912358, 7591987, 113731, 4703841, 3520752, 5768651, 7245068, 3843634, 528159, 4613596, 5114216, 3970761, 6394271, 1340462, 5187874, 2379454, 1797350, 1236708, 2448333, 7898900, 2276396, 4830019, 5117577, 860621, 4367704, 2524593, 5376756, 3500069, 1565198, 3348738, 2240329, 5081492, 1979726, 5590062, 8046913, 1670529, 584010, 127627, 5686031, 5440992, 5305550, 4014619, 6275190, 5341203, 6330134, 554771, 4177209, 2776280, 5563010, 4266615, 7284994, 3612073, 1981711, 7714091, 5178552, 6367281, 8134955, 3320308, 5043133, 3278310, 2943552, 6868195, 523399, 4054288, 5040244, 7036937, 7942539, 1977036, 5206411, 8292922, 7705689, 4654827, 5197558, 4973709, 2810963, 7244980, 6707947, 7041430, 1906648, 6566226, 3336865], +[5498961, 3744343, 1744591, 5771093, 1864086, 4169853, 5658067, 4505424, 8150478, 7052887, 7870657, 1455412, 8302721, 7510991, 6598293, 2502409, 1335072, 7513612, 4113743, 7983594, 6490596, 3082834, 6248491, 2816095, 5491352, 6351453, 3296646, 7066756, 4723574, 4757057, 2113200, 5156556, 7460681, 6526525, 3419436, 6777718, 6280905, 5940362, 1094782, 5222245, 7930128, 3012655, 6716714, 6599948, 1583851, 3724142, 2818617, 2850875, 4138492, 8027402, 1516295, 2512587, 3812883, 8218814, 8162204, 5342183, 6750511, 4696407, 6803811, 1988193, 6091411, 7837713, 211996, 3448033, 1374581, 976456, 2812510, 1908666, 553685, 2500778, 817995, 1068761, 6448402, 6380704, 8275844, 3864181, 4302496, 6281736, 6763764, 5508602, 264175, 5574015, 5532235, 7389155, 2748919, 107113, 4663132, 6341737, 6870072, 5019670, 2096477, 3078101, 7832196, 8212188, 6002403, 3961224, 1022779, 3006576, 1456670, 807086, 4074388, 329339, 320394, 3570120, 700366, 20195, 3039428, 2769464, 5951510, 6652555, 3042228, 6138697, 3578518, 4472499, 1534404, 2329442, 7208779, 7899268, 8104804, 2483795, 126283, 4975627, 684731, 4440872, 7127495, 33891, 3289351, 655367, 6101208, 206382, 6542372, 5039864, 4823641, 4274797, 2726829, 663536, 7979752, 1555695, 6783797, 1229642, 7519661, 1286734, 2195679, 3117595, 4168892, 6606401, 1061616, 7993894, 869368, 903121, 2991582, 5284940, 6716780, 6641056, 5780271, 2915600, 1839726, 3001351, 4647152, 2946995, 6677256, 1172372, 6765190, 4063711, 7901806, 6386293, 8294540, 6018028, 1247505, 3323246, 8367651, 3268039, 4310569, 2209106, 1733101, 756094, 8028059, 6778338, 6874701, 5488160, 8300304, 2770662, 2311524, 6479013, 4057369, 4642291, 4362855, 7828383, 3687462, 4062397, 6279028, 5364579, 2024472, 3751830, 2711820, 3441194, 6676558, 6812744, 7244993, 209736, 6694137, 3154568, 3435127, 6042054, 1194914, 2951767, 403232, 5587109, 33729, 2708887, 1030025, 8132680, 2646203, 3914926, 836118, 910415, 1821453, 7722119, 6593151, 1205785, 7922844, 5807142, 4283310, 7294327, 1829714, 50252, 1990379, 5640297, 4490746, 4368218, 3251255, 1662411, 3745168, 3500747, 8336978, 5128531, 7320958, 7862469, 4072320, 5691883, 2571366, 3219349, 1510569, 2516773, 5940350, 3387660, 6337468, 6934862, 312194, 828437, 791029, 2742082, 1546571, 5373646, 6816652, 6956156], +[2706883, 6107658, 2033281, 149036, 7821344, 7618267, 686404, 3122621, 3424931, 8027036, 3253496, 4006038, 5827876, 2757145, 2872066, 3593383, 709073, 4114020, 5456743, 6845074, 3783977, 6261953, 7970062, 4667178, 8136437, 5750337, 4656847, 6952418, 2587384, 6887713, 7810529, 1780929, 753606, 2275676, 612064, 6448104, 808719, 801756, 2829692, 7711220, 1621088, 5280589, 5208048, 6393153, 2166081, 883875, 2952260, 7639185, 3355900, 6046584, 3780765, 3564901, 2865078, 303996, 1271372, 4155238, 7585920, 4988568, 798245, 7457732, 3762200, 1400054, 7181915, 523096, 1931365, 1351934, 1737272, 865423, 3172989, 6053719, 7636159, 467009, 4509368, 6447320, 1550112, 5947812, 499992, 692865, 4783736, 3650377, 5519076, 5961849, 358983, 7701352, 797875, 1095094, 3352836, 6015037, 7100354, 3647501, 665289, 4871147, 3042964, 3079407, 1312918, 475735, 6751692, 1882853, 7471407, 593463, 11529, 8074676, 4723326, 6864326, 6013734, 6886115, 8056384, 4349000, 6693745, 3658231, 4727183, 1971070, 792094, 733930, 4348085, 4274492, 316772, 6716258, 6008478, 5862368, 7049821, 5308795, 377484, 5088101, 7636168, 7977524, 7301851, 3156726, 5177329, 2376995, 6419290, 3736612, 7377811, 1306488, 3038888, 4000595, 2855928, 4837253, 4395901, 4576679, 7217788, 6185416, 1001037, 5191043, 3798707, 4149318, 364114, 5980282, 4587427, 3182283, 5645971, 5140737, 4236253, 2139408, 8186791, 5299901, 5312470, 8129822, 5039512, 6575348, 6478803, 6403735, 4002444, 1936281, 5000116, 6164144, 5136625, 7688293, 3440341, 2121264, 3082570, 3421380, 5767638, 6039803, 5869953, 7633856, 5134523, 1968935, 3550880, 7743494, 5236382, 7963736, 538658, 2280489, 2013995, 3077635, 4470065, 285895, 7145945, 8326914, 4326691, 690634, 813715, 5964350, 2949462, 2680371, 2410776, 4746615, 1998581, 5688363, 2363801, 1221648, 2275376, 356199, 857919, 467255, 5163249, 7059089, 576882, 2054238, 511790, 6716965, 6085599, 1217785, 2654120, 2123398, 2388468, 4442586, 6724623, 8134692, 5922416, 243561, 3617046, 2128155, 5505463, 4605385, 8074696, 5203530, 4218433, 2923506, 5188224, 3391883, 115376, 4208181, 1542787, 5187153, 6897608, 417467, 7675178, 5615279, 3425487, 6183386, 6412622, 3607594, 7309397, 6388238, 6805714, 3802317, 6495527, 2776801, 5618297, 7142175, 2039870, 7099895, 98307, 3001133]], +[[6330270, 1454956, 423737, 2159708, 1513591, 7712820, 115013, 5887469, 7164689, 3696178, 3506877, 2991733, 7361799, 3734448, 3001686, 552496, 4833882, 5442740, 3186992, 2546018, 3145068, 1456267, 3641653, 4939672, 2437722, 4892978, 7660632, 3404679, 3831172, 5633959, 4637762, 6548006, 6404029, 5138119, 1325226, 1743657, 5530757, 1548832, 3889476, 7964715, 1939371, 6307460, 2189375, 324282, 5822982, 5586623, 5720658, 7195023, 5866904, 4218349, 4549351, 2999240, 5235855, 3489149, 1408098, 4258620, 5301432, 2741642, 3654318, 4047127, 7720661, 4669693, 361599, 4426208, 5187429, 4952014, 3466344, 7144652, 8359724, 1624306, 4807431, 5234298, 1347029, 2531667, 8106340, 1956221, 4789762, 7496255, 7429973, 234768, 1472055, 1355311, 4997676, 5045709, 908721, 6825370, 4642962, 294904, 6254821, 5917487, 6000892, 2347302, 6904351, 641935, 4308009, 4449497, 6411961, 5002678, 8083598, 5077603, 3872456, 1225553, 7013437, 4638647, 3400976, 5650904, 305831, 4664881, 4290336, 90854, 158438, 876490, 2019619, 2501688, 909885, 1174293, 5979252, 7918656, 2240271, 3486929, 7005313, 2080094, 8313834, 7652267, 216296, 6093751, 2249792, 2176829, 7091446, 8087299, 3970149, 5606280, 1935193, 4466000, 6319863, 2903164, 1099999, 5289087, 6008611, 1341323, 4574467, 3698977, 6779774, 139285, 7075654, 2657246, 168183, 8096963, 5921968, 5559722, 2976993, 6413315, 7304274, 3245566, 1563612, 4510037, 1115062, 7623236, 4566826, 4406596, 5688285, 3420670, 7675720, 4912627, 7553466, 8284383, 3187125, 5780671, 6192043, 195955, 7542069, 2810170, 406156, 785539, 3673950, 1804554, 3016856, 7492345, 7336667, 2860266, 1126645, 5167401, 4448004, 6073815, 3561815, 2695219, 4958808, 2687906, 7488828, 2685417, 1336244, 6869406, 3120405, 3695941, 5604386, 6330750, 831509, 25129, 6871162, 5861696, 152639, 2359904, 4722231, 7073822, 8308080, 4967281, 5766956, 5240112, 3153127, 6616375, 1026933, 3708584, 2358726, 4465843, 1652766, 1096144, 4531127, 4429608, 6375569, 661834, 4918162, 1282278, 2461399, 6192681, 1939023, 5458632, 2632001, 3213576, 1034747, 1547586, 6460208, 6815552, 7071815, 1920284, 7359009, 1805220, 5795512, 3119817, 5260222, 798702, 5058639, 4104107, 3428298, 1875929, 4235280, 6510990, 7413056, 6698208, 4122961, 5356759, 4118102, 1537891, 6915895, 1690716, 7979033, 6968560], +[7778909, 2376505, 5705894, 7001665, 7006783, 3119948, 7174790, 3324582, 4879255, 2202767, 3223028, 3489505, 1002176, 802077, 987670, 8334799, 7671516, 1219791, 4902528, 7323348, 1408958, 8188387, 2694154, 6539988, 6877294, 987408, 7749589, 8117883, 3187316, 7247024, 7949907, 5066592, 4464910, 4039277, 6654077, 8355179, 4486096, 2573916, 1840967, 7879578, 7336711, 4887639, 1028949, 4553191, 417631, 4345900, 1474218, 8073757, 1065141, 3102695, 1238196, 6898487, 1286262, 7510350, 65158, 3485092, 2265654, 247118, 5459601, 4851987, 1923012, 8254284, 1736083, 392521, 1112755, 744483, 4433242, 3594617, 5950574, 1476868, 2905011, 5369434, 4323951, 1054651, 5022564, 2735151, 2473985, 8028893, 713727, 7661374, 7190702, 1511366, 7302453, 5915234, 7156667, 5524142, 5730767, 8164864, 4075995, 5937771, 8086714, 6277311, 6873804, 4717641, 3450221, 1101239, 6311607, 5437737, 1690483, 7446255, 7969006, 301218, 2534440, 7544895, 5450227, 5190944, 179586, 4976218, 6495715, 8194838, 3089964, 6251122, 2602138, 7870696, 432603, 5413960, 2382594, 1839889, 6628828, 4789381, 5421227, 6032337, 2660524, 3725236, 2375595, 5342963, 6521205, 4213417, 127186, 2786044, 1087252, 7334616, 7556590, 1969610, 2263517, 3983278, 6974102, 8101879, 1006484, 1624818, 304226, 6189820, 2594714, 4055729, 4082174, 1361946, 1073827, 7194312, 4055353, 7017060, 401660, 4980368, 225508, 1306914, 2052827, 5120555, 1981558, 2600708, 1507442, 329580, 6497387, 4717951, 3984310, 7735049, 6846575, 3205084, 8216244, 1404151, 7467268, 2807166, 4926364, 8002996, 558406, 5302746, 5815973, 4147201, 3938592, 4937725, 4803551, 3011727, 3016473, 3271680, 5659332, 2463357, 3468841, 1749698, 2471092, 7144971, 6853372, 5237373, 3246937, 5183478, 24281, 8304938, 7954491, 845176, 94984, 3175923, 4768148, 3926602, 3569357, 7750878, 6064424, 5417549, 6455730, 2846210, 2299373, 7714729, 3515480, 7849802, 6254766, 3362353, 89459, 5677227, 1734621, 3648915, 5402276, 5404272, 3154996, 6872897, 3034685, 6813239, 1078226, 6101522, 344678, 495751, 7995446, 5479386, 5961278, 4759670, 3566164, 4377043, 8007414, 5747008, 7561578, 4193586, 2449295, 6707004, 5073914, 6095819, 4994453, 5698380, 950247, 2371787, 5277843, 5637896, 7072035, 4519320, 4177253, 6456011, 3230181, 4709766, 6500089, 4159676, 4767674, 2090556], +[6733706, 926973, 7440093, 2663003, 2885064, 3493636, 6427357, 1756830, 5039307, 998353, 2988787, 4628476, 1053438, 5718420, 7992678, 6883699, 1556450, 85406, 1688332, 6903853, 4145683, 2748859, 3164167, 4643069, 3914397, 1302155, 3083963, 5254494, 4953560, 682047, 7131136, 4537490, 5718550, 5842111, 4523338, 6988827, 7811873, 5245118, 8017416, 2192129, 1374183, 4889032, 3431171, 2293299, 1457480, 4736841, 5354507, 5872480, 2154252, 6007014, 2564441, 8153442, 6260937, 2992747, 7203359, 2057538, 8221249, 2804693, 7060929, 7049215, 1431195, 64820, 564084, 2731283, 2704390, 7718181, 201478, 46170, 8230, 494290, 1373451, 4571303, 5528220, 2690226, 1371996, 5353841, 3331078, 5262318, 4885107, 3612338, 1976181, 5089590, 2018946, 5519631, 4993232, 3416794, 6128090, 6870638, 4208731, 2149022, 6410518, 5195682, 344330, 2950226, 1627439, 7488365, 3211341, 8035303, 4118832, 2398972, 148735, 5651689, 8214119, 6198613, 1023321, 2786768, 7540783, 311160, 4101310, 5528337, 5886986, 6638311, 6679982, 584065, 5181991, 7410612, 3364920, 1932601, 4777158, 5574736, 3285345, 7214832, 2647965, 4451462, 1406879, 6169307, 2147640, 3341243, 8051930, 3006111, 4535721, 3397273, 1314487, 8027588, 4079841, 6951762, 4256579, 1192584, 3907184, 7633046, 1081349, 2095698, 2277431, 6105975, 405985, 999111, 4841303, 7722159, 4455440, 5708294, 1801884, 6383790, 1053072, 5988091, 7074310, 5373736, 7547283, 5752115, 3756446, 3040104, 4813460, 1546330, 1375397, 4908092, 2348872, 6850981, 3424298, 3675312, 1972150, 1397566, 7689066, 799810, 2986955, 2074782, 169276, 1482743, 2854135, 2665423, 4381323, 7419214, 4860664, 1431499, 2906360, 7471026, 6768512, 5686479, 3720092, 7277753, 8079727, 1567202, 5577755, 4341379, 3009512, 4145172, 7165286, 2593006, 5273725, 5740670, 1150052, 161472, 2053638, 692045, 5807281, 6280107, 7369698, 6775551, 1292501, 7991234, 3077, 4142691, 7415860, 257257, 518440, 7681279, 6646880, 2017019, 2086642, 2028074, 3190464, 526045, 7157190, 5524062, 8047701, 2870297, 3035812, 4195318, 402281, 2105737, 5011264, 7881005, 4057032, 7532788, 5987844, 7312500, 4426194, 5359613, 7990876, 2687749, 7594478, 5199859, 461856, 1849978, 7894395, 6001856, 1454774, 539525, 3536419, 3571220, 4662650, 5395103, 5349732, 2861267, 583853, 6626729, 8053319, 748134], +[2454817, 2654111, 1548093, 3331115, 7110631, 5228083, 5381632, 5276749, 7956392, 5670417, 2663957, 4750473, 1362459, 2962448, 2393072, 4967961, 711658, 4644350, 273514, 7185683, 5437856, 7132513, 4912223, 1665383, 1243171, 127474, 364390, 5642901, 1395282, 5399613, 300887, 6316927, 5005855, 5514589, 5325362, 4103884, 4941082, 850095, 2775084, 7950590, 5585182, 4738665, 421994, 736676, 4446109, 5809950, 7893522, 259465, 1752710, 2093770, 7535098, 2037803, 1229871, 4952152, 2545739, 6405886, 3500575, 470314, 1963958, 5930725, 5966233, 8199, 7628113, 4324801, 3199543, 1244885, 5236963, 2677588, 8257582, 2439038, 3455394, 4600568, 1785185, 137921, 2315132, 1389906, 5354063, 3810729, 3558803, 4680613, 8149292, 7670013, 6686411, 4932944, 4808847, 4242739, 8277304, 3574825, 164905, 6305371, 6374874, 4645793, 4562891, 6434869, 5941350, 6659054, 7369577, 4392348, 6958802, 2476646, 4302330, 476360, 7681944, 2619043, 4023422, 7774336, 8304281, 2132253, 8284264, 6230539, 2565910, 6543489, 568236, 6630336, 7319376, 5644330, 5769111, 1578097, 7964882, 4528012, 1480245, 4916577, 2050127, 7847391, 959289, 4045223, 1659784, 2836440, 3510958, 4299979, 5824689, 92769, 3804707, 2052141, 4500964, 3000909, 4085247, 2933600, 4640594, 3129846, 1784480, 8053068, 4863506, 5708248, 5753904, 1396609, 2722747, 7356071, 4497561, 3470858, 5544708, 3158970, 1161014, 5441616, 6391013, 6773387, 4575582, 457951, 421591, 1860963, 2657400, 8225709, 6901474, 6964849, 1908143, 85442, 8075706, 2544810, 90829, 6855527, 2426331, 8030955, 6844494, 8197106, 2242622, 3011343, 4298175, 2837158, 1885921, 4204906, 8350276, 7177152, 5806262, 7932705, 7333929, 5915054, 5201159, 7628727, 6943460, 3144752, 5210493, 4176720, 3242375, 462009, 6638935, 6270784, 25279, 5262985, 2488123, 7622880, 145165, 1768500, 7938981, 5219326, 7274813, 748642, 8300935, 7756637, 5049200, 8258472, 2273281, 5898329, 4697463, 4665382, 2246597, 6733589, 1052983, 5997546, 4177345, 5110113, 6574075, 7632371, 7659434, 1935810, 7710511, 183803, 5249303, 3186020, 6405053, 7344182, 4538540, 4833452, 4057120, 3242452, 7895519, 7226931, 7934277, 2708217, 1044453, 2548320, 3340485, 988372, 6634324, 6532876, 2289995, 6862004, 3015559, 8236461, 919825, 6016163, 6328129, 3268893, 2154208, 988763, 931812, 7739737], +[3190135, 7552130, 1601955, 3921408, 4234491, 319172, 3982766, 1796468, 3882553, 4458250, 2867390, 2203516, 5759453, 8197200, 7887673, 2995827, 6663882, 5237458, 4968465, 5859994, 199073, 558308, 6772185, 7988335, 8347660, 7068531, 4107666, 3093546, 2781610, 4557541, 2273987, 8292276, 8207247, 7464896, 3838579, 4530350, 1966513, 7879485, 1533195, 5490519, 7850269, 5842343, 587729, 5174182, 729989, 7903980, 6828155, 373454, 5837869, 2493876, 7565005, 1469823, 2210100, 3701870, 3685948, 1476975, 6110433, 5220459, 512844, 6963587, 3105061, 8323615, 5371811, 6631756, 5736247, 6728753, 1995154, 3474744, 3568715, 4514388, 4215669, 5585756, 2751338, 7963133, 3331921, 5831353, 6329828, 6461770, 4426838, 4565127, 5472199, 5955742, 3211470, 5789758, 7541722, 6133672, 4331942, 2437080, 2695559, 6580250, 5177788, 3281125, 6108251, 3106393, 4706627, 7317195, 5181191, 5205190, 69069, 5518694, 6864461, 7399356, 5390356, 5802377, 4067571, 6270057, 2561689, 1280023, 7486364, 1575229, 1952027, 301150, 3288738, 7877139, 2896035, 4187940, 6321221, 2727052, 6338338, 6301255, 10521, 4998555, 1610093, 5493676, 8145784, 3688299, 4895726, 3785847, 1825123, 2029034, 5334857, 7969574, 1383624, 894253, 2053112, 4734139, 3085259, 2788864, 746607, 6480155, 3183676, 4143229, 2500876, 468320, 670146, 3176229, 7553264, 7981919, 3799821, 2056514, 38792, 718605, 3106793, 4429386, 5595766, 7113154, 2643131, 7788183, 2888436, 1095296, 3222375, 4745399, 2108271, 5043623, 8170855, 4821877, 6174654, 7041470, 5245348, 3074535, 3638435, 8050301, 2355645, 6124164, 4523011, 483255, 2364747, 6353621, 1835924, 6048351, 8306765, 2395107, 7009493, 7122411, 8112570, 6353850, 1007383, 6877894, 2097261, 5683910, 6913026, 5886720, 2951936, 1901371, 6639915, 6737895, 7557221, 4611566, 205354, 1985892, 3400026, 2648465, 7953012, 4661420, 2221717, 5558519, 872439, 2075264, 5157945, 846054, 8113103, 3945662, 2604934, 5636527, 3662793, 1066640, 5939313, 1320035, 6721312, 8313620, 7009337, 4040364, 6232471, 956787, 6278890, 4662552, 5360931, 7814362, 3791671, 6823707, 1707885, 1394806, 7447106, 3848695, 2319877, 7476950, 1976209, 8075311, 3456759, 5367907, 4541907, 7662872, 6910127, 1477730, 2782471, 2641709, 2838545, 6481096, 7078058, 4583203, 480204, 8036316, 1056789, 6111504, 4385333, 6740885]], +[[8296797, 52465, 3796610, 4724918, 6338244, 4474014, 6861150, 7123395, 6462707, 2156116, 302252, 5143124, 4672729, 2723696, 1513205, 4809722, 392635, 6260953, 4376325, 1621199, 7566820, 2402256, 2350919, 6901866, 6214530, 6146902, 4707007, 2846800, 6062097, 2556226, 2334820, 355844, 7943967, 2308723, 5828215, 3483839, 8369163, 2265685, 719419, 5479314, 8376888, 410826, 1954881, 5514184, 3014741, 4230103, 7882638, 2224932, 2579948, 1057999, 3106999, 678900, 1122746, 6061650, 915320, 1899937, 5306433, 6294680, 3708804, 1359341, 1920866, 4218462, 5174855, 539290, 8034540, 7952545, 3396743, 315786, 715585, 422636, 4708313, 5944192, 1504691, 4540995, 3976253, 8183573, 1883727, 7188374, 7480187, 6458377, 1833832, 1904657, 6573810, 6527718, 6797684, 2792119, 3372688, 197475, 3081304, 3326069, 933016, 6915525, 87157, 3566955, 5561823, 4391334, 6850825, 302461, 1819859, 3276938, 2205410, 591220, 2383039, 3145220, 6524616, 5501109, 2349847, 3308330, 3230333, 3744287, 67539, 1549072, 2517458, 1612670, 4082395, 7179385, 3980495, 7661295, 5737954, 7603431, 4616988, 6760561, 1078454, 1625653, 7391031, 7729592, 8203515, 1156572, 6693505, 3561135, 6317175, 2115265, 610583, 8049463, 2766019, 2759847, 6240704, 3597542, 6057458, 931019, 7686156, 5436057, 4355110, 868582, 4203800, 6900925, 6055936, 7268890, 7881802, 8236246, 3676117, 1630731, 676124, 3731037, 2070280, 3746310, 7057476, 127640, 7318853, 8288568, 6129911, 6297875, 3774744, 2915647, 3077752, 846593, 1269166, 7148232, 1961624, 4790554, 1262381, 6184733, 1233086, 5578104, 151828, 7150665, 261584, 4415038, 653358, 3204417, 6246525, 866475, 3141111, 5168344, 7938220, 7816082, 6287233, 4206433, 3692248, 7240662, 1025229, 1615594, 10434, 2016576, 7843666, 4803863, 3467860, 167290, 8228782, 6659193, 704168, 6980769, 7430686, 3259450, 1511381, 2139726, 8137077, 5040272, 7823792, 1678237, 8082110, 2973174, 7715844, 940139, 4645847, 5631332, 3489271, 2128100, 5168980, 2547952, 3215021, 5987665, 8242221, 7329471, 1078367, 4571157, 1239460, 4671571, 3275366, 996845, 7358108, 2252044, 2333546, 2414264, 3572730, 5520266, 136949, 7591197, 6978547, 1363458, 3528761, 2706727, 3638751, 8035696, 212784, 7175946, 913736, 8211430, 5698258, 75940, 7653532, 6994542, 136049, 1034039, 1189888, 7177394], +[4011397, 1880785, 7891850, 698409, 4245392, 1421663, 5599164, 1277510, 5558267, 1751136, 6596381, 2929773, 1809160, 7116539, 4458697, 5959246, 5808887, 2050918, 2856065, 6097737, 1710102, 3609626, 2001421, 6742971, 3495131, 4711150, 7094094, 3229215, 36568, 2512614, 2564507, 4854921, 802426, 4393624, 340352, 1622241, 7126958, 1563992, 8277097, 6809281, 3195081, 3580472, 2461629, 218079, 4034645, 1968235, 2147423, 8019177, 7320106, 8005276, 6123014, 7385593, 277936, 8194003, 5760304, 2107052, 2615622, 516367, 2312003, 5955034, 1787182, 8095172, 3887855, 4187687, 640638, 7978725, 8185562, 2516729, 540955, 6472775, 5193904, 2752296, 6582205, 942413, 2818961, 4866506, 2221951, 4277193, 2111115, 3432837, 6076292, 1741550, 7499069, 1426486, 4152569, 4014945, 6994698, 5650348, 6347341, 4425495, 5145315, 2069669, 8101131, 2357863, 5093044, 6421504, 3915715, 1648145, 573737, 7216611, 3304610, 543295, 1997414, 5258427, 3953101, 3737285, 485362, 8334765, 5846273, 4889181, 6509973, 2091367, 8316002, 2398968, 7094082, 4345092, 2023715, 5016001, 2066741, 7352303, 6327254, 8156523, 941660, 5927950, 2601983, 1781232, 4427151, 4959084, 2072580, 577716, 2082049, 3436341, 3014571, 6891829, 5585665, 5096306, 5294262, 2386899, 6163089, 908847, 1805291, 4173772, 3376741, 3427672, 482237, 1855052, 7040587, 4810549, 2986725, 473711, 97968, 5676435, 366074, 1089416, 1817365, 6764007, 3675336, 7204269, 7929132, 1899448, 4211272, 5632165, 3712828, 1730038, 7516713, 2693532, 8010246, 3973107, 7427354, 3072003, 1606352, 3225664, 5871929, 7627270, 5640982, 3307312, 1570649, 6117143, 6013270, 7594597, 4143351, 6339687, 4205094, 2251964, 1979594, 7168646, 6736897, 1969715, 6162236, 5064239, 2812894, 290395, 8374033, 2809324, 7309529, 3515116, 5566499, 6848541, 2722726, 6893953, 5697013, 1265653, 2070705, 7760124, 8051512, 5119045, 5477675, 7049558, 6093180, 414377, 4970539, 7689238, 715700, 5033886, 1760833, 1508880, 5611590, 4087846, 2404992, 3799644, 601293, 8142275, 1135114, 7300495, 4312734, 1279811, 5680751, 228961, 8206888, 2110767, 7133363, 615, 2784171, 1723225, 545532, 5256952, 2451367, 1057001, 3959077, 8367089, 3105540, 4260192, 7412107, 6198174, 190267, 6919189, 1641513, 39767, 401407, 1876430, 6020400, 349752, 1626705, 6360185, 3565951, 6461574], +[7242661, 2470069, 5236550, 4898683, 3901521, 1706173, 3238195, 2576925, 7946331, 3899093, 3958814, 5092598, 3460889, 5188442, 3344886, 7933696, 5618187, 3486648, 5401507, 7183732, 3072386, 3855609, 2166946, 8211287, 7847588, 346129, 7253175, 992541, 1885800, 6454056, 7212910, 411178, 6258102, 1472940, 6379857, 7894984, 7319067, 8251981, 4929366, 183176, 5274985, 6699842, 8130315, 224760, 7022522, 7131064, 2655671, 6171539, 1576773, 3208983, 7675099, 3808447, 2441782, 2540789, 3740587, 4814679, 127501, 1673257, 7808213, 1475951, 6173640, 1528466, 1715297, 4712258, 4570829, 5136737, 1440039, 1359130, 8279151, 4227998, 4933202, 5760163, 1501029, 6801753, 864623, 6596439, 4089098, 494110, 5677163, 5995642, 6273835, 7721657, 788909, 6528368, 7239432, 3569719, 4209787, 6636688, 5618759, 5585614, 6246865, 2579793, 1459357, 1104675, 7513439, 7183329, 3257485, 6997450, 2418496, 2061767, 5847786, 3386722, 4660701, 226639, 4955406, 3541723, 1691260, 5469643, 3834908, 5113344, 5645888, 2808875, 6367876, 6813493, 730558, 1491334, 6735300, 7895160, 3637955, 7564996, 2770288, 4197825, 6061488, 749232, 5913589, 6649071, 2325959, 5657166, 249478, 4609038, 1628047, 1253103, 4680937, 5959026, 7301248, 587358, 5777103, 4086938, 2839845, 1816696, 7298252, 5550779, 6727325, 7284704, 2002453, 6198037, 670468, 2048427, 4248366, 160229, 3324773, 2815931, 929610, 1902728, 4616306, 3534661, 7529627, 7067655, 1937002, 7794332, 6057953, 4337721, 4260293, 2380514, 6070674, 5401157, 7540558, 1674327, 6132784, 1526173, 5739052, 3910408, 7565682, 2283318, 3531899, 1053398, 3518631, 3714422, 5604765, 331482, 3558143, 1755623, 734583, 2760929, 6654248, 796839, 5883980, 6079034, 5440610, 1743370, 7927045, 4531030, 3033343, 1621609, 819428, 2825498, 6145759, 7378651, 1477412, 7963541, 4054114, 5301054, 1275412, 4163248, 908511, 8309056, 2220445, 1389824, 4032863, 5070161, 8308890, 14937, 5734199, 5918711, 2894529, 193871, 8134464, 2607961, 2564911, 5599637, 1550808, 5871491, 6401393, 1954686, 5952315, 1202311, 7031484, 7767178, 4034081, 8038307, 2844571, 525567, 6901753, 7960575, 4798256, 3736634, 2590754, 4860805, 7607562, 3860677, 2193824, 8267083, 7310705, 3283120, 2192055, 930838, 578606, 5876306, 3515389, 6906960, 2454694, 6012371, 4677636, 2412259, 4340453, 3332958], +[3505911, 7184931, 2529447, 2892114, 1629562, 2459739, 1895704, 5706753, 4492655, 4927066, 5213721, 3656744, 5019226, 7516993, 5454049, 8191433, 3813948, 3426775, 6513531, 2469736, 1562984, 5186466, 4665817, 4786742, 3415785, 6255127, 2554169, 5215110, 780494, 7871130, 375895, 3468077, 5318796, 7351551, 3124946, 6443316, 212321, 5503110, 5412495, 2536204, 7721384, 5019708, 8171830, 4245583, 5759120, 7682441, 1172316, 1697669, 2425142, 5543896, 4877947, 642232, 663137, 4874412, 4231703, 221093, 4555336, 4115713, 7251552, 1337221, 8289251, 2053093, 2885732, 2855875, 3149639, 6749170, 1659392, 4676314, 5772553, 5262624, 4724607, 5057009, 2758231, 5071162, 2535347, 5574263, 5300143, 5624747, 1889117, 20117, 6675353, 1986014, 181803, 6871879, 4557264, 3106176, 6816943, 5279412, 6076439, 2269644, 1066493, 8249304, 1109166, 4219414, 5919627, 6247029, 4202595, 7625770, 2281377, 2877828, 4319436, 962359, 5273366, 5981703, 7131647, 2099996, 6956147, 8350397, 5325773, 7155791, 2146080, 1575396, 1532020, 8363456, 3828239, 1174091, 732626, 7349323, 1781030, 7942615, 4726752, 2211115, 5830344, 8252253, 5426832, 5915924, 7428462, 1602400, 2117181, 102055, 6018886, 5100684, 5021393, 1672998, 2544832, 5906552, 241343, 1998955, 6472823, 6124461, 7347687, 6240982, 5908472, 2034293, 2608000, 841505, 6324289, 438669, 2700780, 4954901, 8163992, 5288267, 4322150, 7044808, 755691, 8176374, 951090, 2944246, 3035712, 4673144, 2270481, 1217372, 6335909, 6312263, 7106218, 3693369, 3000919, 1976092, 2394222, 2143225, 2088860, 2987214, 2091579, 6857401, 494799, 8105391, 4200858, 2005140, 1812145, 6624852, 4620221, 4570722, 6672221, 6834175, 4429758, 3007773, 2548817, 2107748, 3818931, 2955771, 4902632, 3354318, 4378419, 3964580, 6507955, 4631892, 2089157, 2334593, 867370, 3846517, 2526916, 5130749, 6834631, 7571674, 4948011, 7347184, 1796869, 4557037, 4454829, 4027642, 4159612, 4589377, 6151231, 1254383, 8355010, 405625, 6009586, 3936181, 7967204, 7934991, 8201408, 1069585, 641244, 6734521, 5111796, 1060467, 112613, 4731453, 6751114, 6588525, 7191414, 2645584, 2313006, 3744987, 5823595, 3596146, 7079604, 6295484, 2730757, 7238267, 5104939, 4322241, 3874663, 5944759, 5959364, 1158814, 4586884, 2865506, 2314004, 2562587, 327609, 7558572, 2587727, 4516592, 782658, 2374714], +[6154240, 8161227, 1989284, 1032823, 3770282, 4313432, 894454, 5407426, 4425522, 8204067, 4913215, 7547069, 7304786, 2301992, 348095, 7527717, 3808113, 3920770, 2083501, 3724409, 4100485, 7239949, 490753, 1167139, 5077771, 726561, 5503420, 4233409, 6525054, 3906085, 713267, 2698615, 7441514, 4884795, 2281440, 4460298, 7687557, 6561047, 2553713, 3410646, 1408349, 8281991, 2394833, 6759649, 4222522, 6188806, 7175228, 1190286, 638154, 7049699, 3773145, 7661603, 2227353, 704261, 2515917, 2452610, 1459786, 6963825, 2905124, 461491, 7136043, 1131818, 3683261, 2970970, 4905391, 5977164, 3701882, 2978278, 3805595, 4134999, 4583937, 2513828, 4820174, 7050428, 8069545, 102197, 1968458, 7818406, 4299114, 7515, 4818964, 7094493, 4127825, 5055201, 8250897, 7569772, 4840709, 3132201, 331053, 4505244, 6706392, 5770305, 7788677, 8027447, 5502719, 811225, 3836400, 3269461, 2804851, 1459783, 1673839, 7689794, 4083429, 7063986, 4371419, 3289764, 3461882, 2155159, 1422073, 5699703, 1926725, 4624875, 182223, 2349464, 6745080, 8216642, 421826, 4804320, 1367180, 6839134, 573159, 1194852, 1767000, 2822989, 6797943, 5938358, 7792049, 772187, 8010036, 4298904, 1080631, 6563672, 6369503, 1645315, 1260527, 1667032, 8185233, 2428027, 267963, 3900128, 3687897, 2608044, 2170066, 7732369, 2335704, 4991888, 4827652, 5408511, 4243649, 6743838, 1021939, 8127823, 498709, 812812, 3649154, 4785820, 53465, 139224, 407056, 2015216, 6972916, 7393262, 868994, 1983513, 4958237, 3552805, 2618798, 5861970, 7018071, 3387644, 5619011, 5221105, 4839035, 3234713, 7421800, 143374, 5228816, 6551470, 7020970, 2187954, 90063, 2619584, 7851879, 7038980, 7912038, 4921891, 360632, 256778, 1711198, 2778635, 1920775, 8161303, 1738076, 1638269, 5224387, 6961619, 6985735, 444258, 1404680, 1404545, 3753465, 7544669, 5222208, 2451112, 5407583, 5615888, 4023470, 5925234, 7943785, 5126170, 5062475, 7387155, 6819251, 1869650, 4425621, 583749, 794838, 643852, 5701412, 4006240, 6738597, 3202611, 31685, 1513662, 4337275, 3330330, 7422396, 2846327, 8283705, 6612658, 5772528, 5026842, 3774040, 3435572, 6045175, 1420524, 6300166, 7056615, 4088882, 2310628, 1775221, 1739665, 2050395, 1665453, 8314231, 4758613, 1509778, 1375601, 8359013, 977695, 6619493, 2405705, 3461656, 2849045, 5373646, 5108244]], +[[4123598, 3448406, 409178, 5239529, 209278, 3671193, 3643642, 2596393, 5298400, 2983678, 5157812, 1444846, 283343, 1520174, 6834720, 4262079, 5110560, 2426763, 3948636, 634725, 97289, 5146003, 2166085, 5365165, 1330288, 2617602, 3550644, 1472027, 8295525, 7645260, 3450572, 7176247, 1012166, 5910995, 1004783, 449953, 1943922, 5607533, 3686994, 7024177, 5022701, 1971203, 5892232, 80008, 8101920, 829482, 2475390, 1018230, 4077099, 641636, 5352337, 6250566, 3441343, 1156448, 518794, 7745530, 2028058, 4792750, 5850713, 594571, 7580202, 5616200, 4066597, 2016088, 1728687, 8064358, 3805310, 5760607, 3247037, 2013056, 2209595, 837861, 8129218, 6979696, 2988400, 5025307, 2546927, 6054250, 2881425, 3674257, 6523852, 2406871, 1516120, 3550300, 5871896, 1937255, 5240881, 8232859, 5354836, 2816386, 4413999, 4468819, 927849, 3855341, 4568972, 7715582, 6387547, 6125511, 8278269, 6145994, 5320938, 4659835, 6863759, 3231568, 1250250, 725286, 3314146, 958310, 8369979, 7565120, 1929370, 6508263, 8332666, 1655602, 3306590, 6912767, 7439730, 3466723, 2745751, 330516, 6490851, 7690926, 2005103, 223431, 7006174, 1155333, 3557365, 106083, 3757385, 6165340, 7397247, 437478, 5388882, 239171, 5194521, 1606449, 5823022, 4088534, 5931866, 8238717, 6869604, 6185814, 7088650, 5630624, 3004552, 1858827, 5036901, 4067288, 1207436, 5134367, 3484254, 879519, 2434205, 2749688, 2775397, 3050206, 6064647, 1878545, 3669867, 1964839, 5136285, 5351679, 16043, 7275296, 3061054, 1164118, 2104438, 6263990, 5634773, 759721, 6335552, 1213862, 7871378, 7678032, 8097538, 554176, 5283848, 4202148, 523569, 4044848, 7708947, 4274339, 492753, 5734967, 2630844, 5186067, 4263924, 1585355, 1064721, 7552641, 2260202, 6418520, 2777062, 3445214, 416070, 422444, 306004, 4703356, 1134153, 3356631, 2258779, 4108818, 576709, 2585881, 6171747, 7862623, 5896126, 5426582, 2469836, 1003451, 1334491, 4535612, 7997213, 5950880, 837686, 2383589, 738657, 402666, 5177602, 8010990, 1367751, 1392328, 5425255, 6109262, 3730113, 3425498, 1903454, 3874746, 1352306, 3628758, 5391774, 4461202, 7662152, 4462161, 3999953, 419736, 4132698, 1096386, 3740208, 2258929, 2116021, 2996533, 5964414, 5034264, 5157879, 5639518, 6308734, 1463336, 6155318, 5584067, 673956, 7785186, 1730492, 3623038, 6746927, 8327857], +[3185588, 488481, 3568944, 6712693, 3038580, 3399302, 2356845, 2988312, 1720275, 7843921, 3783605, 7793814, 2228015, 715506, 179352, 4579525, 3468987, 2958017, 1203831, 4818099, 5526682, 4801360, 2465844, 4609521, 936908, 3841796, 1400246, 4369381, 2970689, 4041005, 3723904, 4439576, 3487682, 1074105, 3808925, 7458931, 5218679, 7988633, 1572490, 7530654, 7826675, 1495455, 4745515, 3639789, 2964750, 7408789, 6467417, 1756164, 3833194, 7492869, 5750017, 321987, 1403817, 7844579, 4270895, 6196241, 6065428, 5424081, 1609779, 5555268, 821876, 3880951, 4303389, 6784567, 7508172, 2626536, 5910970, 6491338, 3755930, 434111, 4742022, 330526, 2600020, 740244, 2113852, 3987855, 447467, 2355259, 3617094, 959743, 3684343, 7681647, 3815841, 2953820, 5316435, 3472828, 1758947, 3804955, 1077119, 7391176, 7715164, 8286929, 5098629, 457848, 4386222, 1950300, 1735047, 4621724, 5957584, 6511521, 1660171, 1233346, 5307183, 2152001, 449989, 7485850, 8349334, 5730599, 1420643, 1737255, 8163645, 231902, 6367878, 7704868, 190373, 7273546, 1976464, 2306090, 315701, 7847998, 6671723, 6936917, 4520790, 2662017, 2219284, 1690757, 5984140, 7489744, 6783790, 5856912, 4219307, 4673108, 1437098, 4372043, 5021396, 1089645, 492102, 3860922, 1125168, 3283472, 5289231, 3485031, 4041006, 1309175, 2042426, 2700451, 4995969, 8345305, 1838285, 1947156, 5317271, 3136672, 4823237, 3021237, 5905597, 2803517, 4259469, 4651749, 4787257, 2206562, 1884876, 3978686, 502751, 6722374, 2782515, 2101518, 1304797, 2634176, 3956146, 3583849, 1539269, 6015308, 5343563, 1766547, 7613644, 1083113, 6832353, 6757958, 7359307, 2971553, 112489, 5476402, 2078742, 2814554, 1284809, 544592, 1405558, 6644712, 2136272, 6189329, 6595619, 7450101, 274601, 5455850, 2076841, 3547529, 6076927, 6040531, 2637603, 6948156, 6799036, 1780484, 4969497, 5849043, 2003889, 1660066, 2286193, 4820813, 4541356, 4547855, 8068842, 8051337, 7797428, 3941367, 6427095, 5779887, 6550171, 7212201, 6889058, 6629268, 6417638, 6968902, 4826353, 1643325, 7157630, 5390900, 7744198, 5306165, 4287474, 5764530, 2893992, 937735, 2736253, 4435118, 2089203, 997671, 1718857, 5449334, 5006265, 180474, 2429545, 1572388, 7854684, 4144968, 1381792, 7581323, 1236058, 6264179, 1576597, 338181, 3819790, 4637370, 3478861, 3842218, 3021586, 6921086], +[6552663, 1280010, 1169216, 5565237, 7336378, 7138113, 3680077, 1791355, 2777797, 2140176, 6059983, 4083330, 1628809, 7309540, 5678342, 3533241, 1447593, 948139, 6446717, 4748463, 903758, 4427875, 6622757, 6033037, 505563, 2982629, 5255780, 6558809, 6551671, 2903617, 7390305, 185073, 2978483, 1036594, 1895800, 552509, 3419732, 4541321, 2030304, 5208061, 3794427, 2798339, 4730715, 4029486, 567153, 835820, 3372801, 2146619, 7359721, 6324549, 5223353, 7138870, 2333131, 4502548, 7503677, 8102162, 1236299, 903173, 7312172, 7757503, 6851285, 2232335, 1167418, 1174598, 962181, 6918235, 6997289, 5032467, 1025834, 1629012, 2061567, 6999689, 3658364, 1344117, 5900806, 185798, 5302778, 4708164, 4121075, 293801, 4150892, 2602470, 4906926, 3629131, 4298552, 1831020, 2819659, 311999, 5054183, 2581534, 3746286, 3461614, 4883183, 3471737, 6673642, 2597790, 4817763, 3419693, 6593184, 1061106, 1588959, 1426272, 5149212, 3672802, 7609448, 1968781, 310953, 6189308, 1867278, 2811822, 8287296, 10195, 2982587, 7955958, 5011419, 7318909, 5406970, 6746527, 7043486, 8222975, 5981853, 1416455, 1445363, 8097299, 4991252, 5483231, 4573877, 7352686, 3191603, 2684578, 1766089, 4370575, 3793458, 6261541, 5776024, 5443223, 3862534, 7619607, 1873612, 5774996, 6993231, 8268105, 28072, 2825736, 7626778, 2252302, 6196282, 3858562, 2812735, 1281733, 800694, 1597656, 3804882, 6537303, 1231529, 4244657, 886175, 1527195, 8306011, 2051575, 6606310, 3131689, 1322514, 2004521, 5106163, 5845943, 977121, 3592983, 5166274, 4875953, 7122315, 6735578, 5171051, 409943, 568887, 4877752, 2951778, 363983, 2005203, 4952471, 6440868, 2149243, 726413, 4841599, 316288, 5756468, 5337985, 4895400, 7637215, 4928236, 7425657, 3713805, 5070325, 219511, 2125536, 6040392, 7089746, 1814703, 4773438, 5552985, 6421542, 245585, 3516448, 7474753, 5764155, 2399523, 4546609, 6103743, 6856673, 7824930, 778655, 5287374, 6048985, 1401386, 2697217, 8323030, 7127082, 1927224, 6662013, 6739578, 1507953, 1837563, 5753198, 8340383, 2338114, 6070860, 1729497, 3142242, 6179970, 2007187, 2198796, 6701707, 8173811, 5228840, 2693762, 7784040, 4166460, 1710578, 6138273, 1955424, 7260184, 235902, 3543881, 4994822, 3324208, 3215092, 4884428, 2569959, 5156810, 5343511, 5527783, 6759878, 4053003, 4195847, 211091, 3277845], +[2965831, 6464184, 6220847, 4639673, 4071494, 6052078, 1999211, 778783, 4861874, 6630001, 3070811, 3753690, 1741434, 3094164, 7569147, 4398394, 42081, 6317064, 8060020, 3967826, 6187996, 6394524, 4072532, 5978637, 1205528, 3832132, 3812774, 593054, 7328783, 8352738, 4342430, 5084221, 8213842, 1554792, 8176326, 3297673, 7948630, 5363361, 7440298, 7569979, 3401706, 5043617, 5206776, 2032918, 3422241, 6908037, 1199797, 8268800, 673784, 6373893, 8049886, 4994978, 3071116, 327989, 4640320, 489372, 1177168, 2829593, 8315926, 5949626, 1470636, 3427683, 4604436, 4425048, 2307002, 6867978, 475502, 3024359, 2021056, 981093, 987776, 7137459, 7501086, 4051622, 2132174, 6453532, 7561898, 7737305, 7755764, 1334781, 7713050, 2692930, 2841067, 503817, 7855654, 3345424, 3535557, 7678360, 6290046, 1918547, 8124207, 1523664, 8100762, 7195977, 3231302, 8310873, 5645080, 3559684, 1128187, 3891897, 3015627, 7478597, 8298570, 1251562, 6210145, 3007629, 3552333, 1668968, 4981441, 3372264, 6299985, 3194639, 7038928, 5624467, 2525976, 763101, 580453, 7174653, 7967082, 3604333, 7983896, 3677884, 1559651, 8307424, 4213601, 4045827, 1955831, 2391845, 4186029, 7245229, 6894608, 4808076, 6231238, 7560744, 1805759, 6689618, 5090615, 6860441, 6873901, 6754048, 5441655, 488540, 202765, 1612042, 8013229, 5596096, 6596955, 6213129, 8232359, 5682369, 2937800, 5729939, 4457651, 5558770, 933226, 6432813, 992336, 2124073, 2022624, 6571915, 7137115, 2069643, 2380853, 1372342, 7200675, 2361893, 1488869, 2248504, 85594, 3917010, 5863792, 3355277, 2811831, 2084618, 8372073, 6765822, 1787230, 4287599, 1706747, 1803615, 4247632, 6028413, 2136468, 2473945, 3430566, 6815475, 3144360, 7895, 6995547, 4465295, 4803469, 7810195, 1668094, 2883785, 3694501, 1038120, 2799891, 2102185, 7297303, 4577109, 3343111, 1729277, 5694159, 4048848, 360468, 6077984, 6308176, 909212, 1031483, 1433454, 3106136, 398199, 6405713, 7488648, 488550, 8226186, 4184984, 543623, 4183547, 3512018, 739176, 6989059, 400730, 591652, 2764072, 4574056, 4857244, 2428413, 6584201, 5272703, 5622580, 7435132, 5069049, 4104612, 7221237, 2306544, 7594042, 887902, 1797558, 3173212, 6271783, 1434674, 8303947, 8111691, 3412665, 3931247, 2819462, 2144686, 4865606, 5838132, 6120503, 2237882, 1202307, 4339660, 7090192, 2610504], +[5171774, 5528645, 7147189, 694376, 6300248, 1055924, 5096868, 1609486, 6983216, 5950987, 7490641, 6305492, 4152301, 4540158, 2393363, 5959418, 5698612, 5993755, 2462200, 5724300, 1193239, 2820171, 6276093, 1922836, 6103783, 1894028, 2497604, 3335189, 6065851, 2661408, 31243, 7108049, 6295766, 804279, 4812724, 4923796, 2085790, 2431822, 4151446, 3049153, 471097, 5714320, 6798582, 721542, 136747, 5295584, 5919325, 3868866, 2171645, 2432543, 3902147, 3957795, 7369654, 7192073, 3042823, 4476731, 6915565, 868694, 4045156, 3479017, 5777630, 42697, 2572683, 7249586, 2907578, 4179591, 520530, 7527254, 5554232, 7242836, 6345720, 4499015, 1230206, 738646, 8174481, 3436983, 6029173, 5264076, 7757728, 1647592, 7969805, 3068809, 1761444, 8180574, 1034042, 1429457, 4232485, 4937818, 3850132, 3028583, 617738, 2617117, 3484013, 1560101, 6387824, 6844402, 6535791, 7026894, 7467033, 1155954, 5402841, 1959569, 7569183, 747946, 1552365, 1229873, 3438493, 8161870, 592679, 5434633, 3047597, 4900112, 7448584, 4062938, 6316564, 4814622, 1430005, 2860760, 5152027, 6563896, 2362767, 5060318, 1069988, 6730612, 815508, 5998345, 4834409, 8065744, 1942659, 4829435, 3782488, 6569463, 2213526, 7331561, 5047502, 642400, 6009838, 4996498, 542568, 6252927, 5433748, 6741178, 2781026, 1282900, 1725100, 5374492, 4698334, 3245752, 6845253, 1195724, 5141169, 889262, 7934799, 7382205, 2219138, 4173949, 2979485, 4326332, 2803356, 2601740, 2215595, 7465296, 6052308, 2140978, 5849680, 4258951, 973630, 5934160, 3176647, 4351827, 1572722, 4701843, 1906531, 1591742, 4456761, 3299111, 456517, 6479359, 6843770, 5375150, 2214876, 4591930, 3993471, 1298360, 5138523, 2997131, 6185221, 319961, 2982420, 4401772, 4174447, 1527432, 288681, 4814121, 2978539, 2502590, 1828779, 7343302, 3825663, 4315460, 1536937, 4757983, 2178102, 4188256, 376383, 6160630, 1062086, 2318881, 1212361, 6889464, 6954949, 7129856, 2345292, 1166356, 5898347, 4974479, 888653, 4854837, 915893, 692280, 2723128, 684561, 2393399, 2514570, 6611440, 6419424, 1002208, 1004612, 8034182, 1175085, 2129937, 3071873, 2712968, 4035060, 4314614, 7482215, 3285279, 928303, 2413892, 7711025, 5714494, 4419320, 3722286, 557272, 6182142, 194323, 4331269, 6720331, 6174196, 6728339, 2147690, 2647344, 1625912, 267573, 3096528, 4250855]], +[[2941963, 4906494, 3816182, 2633411, 6817580, 1066628, 4034403, 3079405, 5757861, 5898895, 8114637, 1821109, 9226, 389653, 1921682, 6772061, 5467254, 2714212, 1361565, 8296248, 5058256, 835776, 1296532, 8333089, 4277294, 3009471, 8166104, 4537965, 1941493, 6542327, 5433245, 1874484, 8279042, 2272526, 7185446, 4313653, 3149739, 224625, 5501545, 5987940, 1156907, 585055, 7703853, 2462403, 4226775, 7883605, 1689972, 972813, 2715652, 4485448, 1497910, 4815474, 330097, 2674130, 5734767, 1710006, 7409709, 625496, 4839243, 5229172, 3201132, 6046052, 7193568, 6992064, 7384407, 2456603, 5870424, 2997216, 5533461, 6486557, 7901117, 5925707, 7665481, 5405023, 7000918, 1179971, 8254369, 4084681, 1739177, 2994980, 2574061, 2594944, 1998671, 1389416, 3942671, 7152749, 1659002, 7995826, 1181482, 6888231, 18391, 3655369, 3574704, 7194385, 8114959, 4068521, 3672314, 1958334, 1404388, 7227453, 6723366, 5143257, 8111799, 4193128, 7393542, 5548729, 6948619, 6064275, 1542342, 8374313, 1770054, 1811317, 3559694, 3725247, 7759082, 394878, 3789982, 2100146, 4883090, 2618941, 4533357, 1837690, 4588701, 2977315, 6797076, 1739422, 5031485, 6549877, 6700914, 4912553, 3007084, 6157040, 5104250, 3737932, 2779705, 1333558, 7038269, 555558, 4363657, 6039756, 7652300, 888829, 7155964, 2858345, 2505358, 6175130, 1278923, 5312413, 6372954, 6777569, 2691976, 7451595, 6159782, 403127, 5441604, 4525536, 1048516, 4353001, 5264453, 5203949, 3183905, 383849, 3088550, 5823423, 1686275, 1109303, 8365683, 8200435, 3078238, 5677043, 2218107, 3161278, 7413823, 423620, 3546765, 6508302, 8145474, 5483606, 8182398, 3932545, 5682246, 8206759, 2107610, 6823670, 3458918, 2021413, 1280965, 8302393, 1791190, 7253326, 5902115, 1225989, 1323834, 8011522, 7989784, 6159945, 4593282, 1883923, 1453887, 6735114, 956408, 735855, 4386316, 8274603, 6111581, 7572133, 3107685, 1024936, 4769201, 2107145, 2049843, 4127798, 6922073, 3094822, 1045263, 1361090, 3864671, 3360729, 5130963, 5009258, 1381583, 7663068, 3385089, 8239781, 5917865, 7140706, 3177511, 8224080, 6782166, 7221038, 3011399, 7063681, 518007, 7925332, 5188734, 7322190, 7029820, 6021497, 4613917, 7342742, 2039704, 4703136, 6056974, 1425963, 7059621, 3902133, 6649936, 2444131, 3991344, 3112611, 4285077, 5280722, 5086047, 5728445, 1556325, 7357531], +[3318031, 7263249, 6067456, 5572440, 5286758, 4756364, 5941133, 3853290, 1286825, 5275955, 2063909, 794596, 6100290, 3387868, 3523726, 488671, 3348517, 5522265, 62638, 5081048, 7185718, 7047547, 3108847, 318636, 3798230, 1722664, 1956836, 7394631, 1977483, 624227, 7875007, 4555688, 7578771, 3830913, 2144420, 4920123, 1249479, 5829104, 4595863, 1923232, 2844209, 2508850, 2485585, 2396989, 215600, 6995502, 6415924, 7710747, 4319506, 4476671, 1698979, 52777, 5555598, 6767068, 11263, 6905133, 810033, 5597588, 5841687, 4010359, 2159922, 612059, 4850787, 5526881, 3620600, 4802139, 1539207, 7295260, 2081086, 6067254, 6699221, 6599650, 7331679, 135097, 3432330, 7190985, 175510, 5615961, 1543660, 7791779, 6955941, 4350891, 7759036, 5443616, 7392223, 3608551, 5939286, 6825171, 6983724, 4833643, 7023295, 3642829, 1718665, 1732540, 4353546, 821223, 74564, 7624158, 3124516, 7621103, 6441342, 7851511, 1347050, 4169873, 7086617, 4408310, 6358477, 7090930, 2232973, 7578943, 5552474, 363405, 386622, 3820948, 7098886, 4612146, 3618811, 3731621, 5025968, 7886334, 5323745, 3860679, 547742, 2993614, 571164, 5283779, 6206835, 2494589, 1384221, 4741850, 2643711, 2650516, 4456474, 964124, 3467237, 4555051, 2737378, 7248509, 8244478, 2707521, 5868042, 3840342, 4097636, 544759, 4899486, 7648712, 3812582, 520357, 1274483, 3374597, 3498217, 7001293, 2072520, 445502, 1012694, 6024331, 1792373, 4257420, 4662905, 5135470, 1040504, 1551190, 2348171, 6845850, 7706501, 3794097, 6329511, 5679447, 2719495, 2781028, 2453345, 5242841, 6410101, 4103910, 6008180, 4950142, 5950641, 5907023, 4117529, 3063420, 6988757, 4233342, 1907404, 6691705, 2713388, 5404111, 5912961, 4619316, 6182250, 91567, 6423979, 6900112, 135229, 7030752, 6890571, 416188, 6664784, 4316783, 2480741, 7528309, 1683324, 4872621, 7664388, 2956869, 6406936, 2741828, 1561814, 447098, 1443814, 5479710, 3699067, 406794, 883298, 1417795, 5030668, 7768289, 4354493, 1764965, 8181010, 5507409, 6555513, 213248, 7316779, 5538503, 6672891, 7041123, 1941917, 4864348, 5619531, 3694604, 1940353, 3253664, 1164658, 2687764, 8207744, 7726475, 4222250, 516025, 2814668, 2606556, 4225241, 6605085, 6786768, 4931400, 7423443, 4113197, 2886338, 4422718, 4347952, 3854055, 1646715, 1039161, 6618308, 3987990, 277844, 5025591], +[506881, 4970359, 6738252, 6423443, 3871730, 3346046, 5480162, 8126568, 6397770, 2033150, 7120010, 3780202, 6352270, 2845839, 4280367, 4264186, 535564, 1446787, 958333, 5237752, 4009418, 5512419, 5073745, 201691, 8254374, 2207277, 325061, 4564040, 5216272, 8371667, 2330852, 3107288, 5389605, 3881694, 6722905, 1621308, 7413829, 8365669, 2462605, 183492, 3338213, 1938152, 1048959, 5495755, 5234219, 5326320, 2671357, 8198635, 3807741, 5615696, 7398160, 7166552, 8240671, 3879479, 1460940, 162244, 1639767, 2801666, 5646136, 6706561, 4183259, 3122812, 7606594, 7375062, 2876129, 366006, 229698, 1080556, 1900869, 350651, 2365328, 7459179, 4456307, 6200668, 803092, 4488424, 1409082, 3516159, 4012453, 5366198, 3538649, 5123232, 6579140, 5940190, 7838406, 5099518, 1217372, 7567847, 269993, 7573849, 7149458, 5845634, 85043, 7240572, 8028786, 93109, 6626471, 3610836, 7030114, 2594356, 8299226, 683463, 6988529, 464138, 5062242, 5797064, 5613439, 6488687, 6536306, 5881629, 6172075, 1567211, 3168812, 3844569, 4513626, 1048432, 3357271, 6237599, 1821115, 1632714, 7423810, 7867217, 4675698, 2544302, 5477623, 8062272, 8122415, 5472546, 3299238, 7462564, 8068696, 4481649, 5342038, 5033188, 389893, 3796944, 6944625, 1928162, 7206151, 5313900, 7619354, 6139312, 7873033, 8074724, 1231786, 7271668, 1206237, 4199249, 2405000, 4020298, 4541084, 6134245, 4782152, 1039258, 5683958, 360752, 1072139, 7654236, 3482850, 4562501, 7737412, 6790930, 7223341, 8145896, 2433887, 2792976, 6017162, 7467671, 5305901, 5185366, 838081, 2657613, 3980371, 571892, 3884058, 130063, 6540574, 2866810, 6599140, 4367637, 5653590, 4351071, 963540, 2448266, 3016290, 1675696, 7631763, 6489165, 8057500, 921581, 2794620, 2605132, 4120794, 5915418, 2576792, 629531, 6569735, 3898715, 3618462, 5989681, 6017584, 1265443, 2150403, 3605948, 6401763, 3461887, 6621831, 6709195, 5002772, 6806554, 282130, 7762381, 5255550, 6671316, 4059370, 649951, 5159215, 5730512, 561758, 6246360, 3977255, 640143, 1268152, 774605, 5084123, 5972801, 5937807, 8123409, 7182819, 8081083, 383099, 131835, 6777922, 1745461, 8262027, 6029722, 5079903, 4548819, 3542779, 8181959, 4338235, 2021363, 3037183, 758874, 5802859, 6258826, 8283821, 5299605, 7551387, 675025, 3481063, 4317285, 5529292, 6375260, 4150728, 4078723], +[7621243, 6577159, 7557357, 6085108, 5145785, 3459585, 4648298, 3165694, 4371587, 6494215, 843885, 6494893, 708085, 2263116, 5198727, 681907, 2140515, 7934983, 2818308, 7374287, 3158131, 7626845, 6044614, 7655853, 6677786, 1224760, 2586900, 5483256, 3316094, 4341995, 3981251, 7390940, 7749842, 4624324, 1910366, 753429, 4502234, 8098000, 8150364, 5879299, 696575, 4462259, 758980, 8340498, 4223945, 3368154, 715936, 7220902, 6547269, 7137505, 2863711, 936445, 5585682, 6058285, 4732606, 7916727, 5396972, 879133, 2896943, 8378787, 5770043, 3372853, 1857873, 287575, 4120615, 5077612, 6255748, 8098148, 2623475, 6432000, 5215998, 209862, 1061516, 5231530, 4831446, 1589722, 5643248, 2116923, 4723429, 2406537, 544032, 885854, 7531295, 3159680, 2850208, 7676088, 7811173, 2177616, 5614018, 4836909, 3990738, 1128189, 6624474, 6835563, 4549655, 6187966, 3431822, 1996432, 5993673, 5297409, 7107228, 192697, 3342873, 6889101, 5075392, 280343, 6750337, 3831151, 1833245, 5995214, 3038925, 4609911, 4570779, 1060211, 1199186, 6757682, 3251307, 2416742, 3757176, 2854319, 258741, 7850418, 7186071, 4568324, 8014605, 5221229, 5695542, 7308848, 1785078, 4556882, 3250917, 7720926, 4588619, 801807, 2171205, 2709127, 7994835, 3404424, 238604, 5866514, 7422482, 1644486, 2723401, 7879034, 4495024, 7643517, 1051301, 5702770, 86624, 2661618, 672899, 2888358, 6221138, 5887165, 7516703, 2055291, 7050682, 6178117, 3979861, 663400, 2800383, 5829403, 870758, 1718351, 7092888, 7899747, 2716600, 5076512, 7100674, 500421, 1461965, 4359331, 8357709, 1611169, 2168144, 2315299, 1647538, 906195, 5594423, 5012987, 6561962, 6448297, 4775887, 7656975, 3663632, 2613656, 1894207, 5086980, 4854532, 3999538, 4666441, 2806561, 8100506, 3649642, 533881, 3268912, 6078585, 3064439, 6114264, 127088, 5819265, 18776, 1582697, 1117502, 7811452, 7808618, 1279691, 6438230, 5862731, 7448229, 7153089, 385289, 7318227, 1929658, 5260475, 7932418, 6737967, 6667591, 269489, 6887105, 1058540, 5441073, 6428826, 7527141, 7026552, 2154562, 6470606, 6650124, 1948395, 8007155, 2996866, 4527087, 1856838, 6080714, 2128791, 3118479, 4536152, 5961313, 7927575, 954594, 7260493, 6122119, 3519256, 642811, 1985012, 2565446, 1010485, 4727514, 5947186, 1629822, 6322202, 4605249, 492560, 1393608, 7947862, 765160], +[2764987, 8265754, 4085653, 2571110, 5874556, 4816797, 4307803, 2903115, 2213523, 7564542, 609540, 3218825, 2966901, 6953123, 5040158, 3634905, 5146721, 1037657, 3730957, 838667, 230042, 6642499, 165410, 8179222, 698780, 5242489, 3420628, 178230, 3898587, 464125, 6347376, 8144542, 4076293, 1048449, 6149946, 4939334, 2693087, 6308445, 1085833, 6960106, 7244803, 4420512, 7956846, 5059881, 7078820, 8039565, 699220, 5893296, 896122, 5868065, 7640105, 6537027, 4880568, 5529625, 2061696, 2626772, 5799951, 7806434, 14084, 7932250, 4442369, 3943994, 4831760, 602700, 8152073, 7816638, 1359389, 6882576, 2763304, 2910766, 4646339, 1130064, 3414945, 5228190, 5002151, 3800008, 5298575, 2038122, 6276288, 7664888, 5574450, 6534336, 4785282, 6753578, 6591880, 4644286, 3504227, 2470756, 1796982, 6302889, 379217, 2708101, 1597582, 111366, 590930, 3766372, 6343003, 4151100, 6938387, 3575052, 7482105, 8325644, 8346687, 5084652, 2807324, 8089836, 3985020, 8067932, 5224509, 6791771, 5535586, 874381, 7177934, 6534199, 6713887, 1943324, 3857854, 4152662, 8317549, 6030090, 6712551, 5286076, 7572436, 478595, 6885836, 5641452, 3173931, 5623281, 3985962, 3694513, 981855, 1135237, 3919842, 6293519, 4793791, 7486070, 3367029, 6723767, 5026578, 6856587, 5147259, 4576874, 7795001, 5439877, 5628512, 92895, 2752363, 5546504, 1471928, 5915958, 5667211, 5663425, 735546, 5982127, 7345069, 4160592, 6146734, 4627332, 8196929, 7017553, 2694026, 2574703, 7543660, 4006984, 4331236, 5470194, 824121, 6676793, 4390051, 5928793, 211188, 4476257, 8111375, 750049, 1091232, 3613381, 5633748, 6176660, 2886483, 8178155, 8228572, 7440866, 4993137, 4500499, 2283872, 6101876, 2270564, 7809342, 5787031, 2520603, 4515582, 5945459, 7068686, 5924947, 1217119, 5165408, 1692462, 2473134, 4471647, 5336995, 2478154, 6241745, 5766193, 6354325, 4469677, 1533044, 4932803, 5106364, 1331374, 7358345, 5101658, 5502078, 4178800, 1485314, 6035300, 1437937, 4120042, 3713826, 3814953, 3584189, 4015595, 7139275, 1843053, 3775132, 7286957, 4877081, 5352435, 2182792, 1905248, 6759565, 2123526, 6755218, 5856818, 4176312, 7940722, 1916122, 1566401, 1234815, 7823963, 1280422, 6814404, 2758353, 7564833, 977365, 2282376, 5029440, 2756237, 1645766, 502738, 975553, 3676720, 483054, 3944675, 5879715, 6035883, 1178946]]] +trCandidate: D26AF4F24DE50EBEDA020DFC6F841B0A2D83D2781C06D8B3DF8EDA97A7EA4F9913ABEE9858F88F8A2F52C13DF2DE4BA023BAA5B3CB0ED941E077A08AE3F14035 +muCandidate: 6306E6ADBAAF5509B5C86CED5FAF3F5D168FB8BFD7C4704E751F7D7AEC3ECF2D988D9A64516854341789E6D53E8CB9C713E68B25F35C2BB99B34208CE29D1F43 + +c: [0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, -1] + +NTT(z): [[5355856, 836771, 5926131, 1698606, 3996443, 1349399, 2432415, 2945189, 991111, 7368239, 1969006, 5103307, 4606079, 1179943, 1117008, 1133122, 3831074, 7860746, 7310157, 6461064, 2724959, 5189982, 4947289, 1730930, 3216955, 4029963, 3892870, 3745414, 5021041, 3665806, 1088554, 6102570, 5661184, 2027827, 2673779, 3098961, 4914648, 2555543, 2027364, 5511540, 2618482, 2753042, 8220303, 5106732, 1696202, 2832871, 2865549, 4434898, 7410634, 94929, 8369290, 7396882, 6835275, 5998172, 7490361, 6380251, 1072478, 7538910, 6575077, 2299691, 357672, 6059918, 7761728, 2719, 2916725, 3903916, 711006, 1142325, 5487980, 1402978, 4348296, 7498675, 1361252, 6788577, 2013663, 5554585, 2426910, 2087852, 562976, 4283167, 1370205, 3799675, 2456657, 5508792, 6844323, 3160206, 8290459, 1849124, 7783578, 1705642, 7100589, 6784085, 4247287, 1934806, 6630959, 7844971, 3763131, 7277827, 6602672, 4177087, 2143611, 3493464, 793674, 3265316, 110118, 3241791, 5962332, 821315, 641226, 677919, 3160611, 4721079, 8059565, 7002344, 818282, 2829945, 1394081, 7785497, 1822035, 3095172, 6681800, 8070375, 8116877, 4318675, 2268327, 6683145, 363463, 8176146, 517683, 674472, 4465338, 8112234, 368252, 6441190, 5476993, 117273, 833422, 4145821, 2981377, 3646429, 4942671, 2953581, 819001, 8127360, 7464380, 3849563, 5124381, 6326402, 1816121, 1128029, 6312634, 1155416, 2183361, 3524156, 1124628, 7581748, 6929294, 4411460, 4726995, 3765962, 4322374, 8120351, 3695552, 8105266, 8083610, 5517226, 1578032, 4914359, 5527258, 4049156, 4801084, 1714222, 5864758, 6995161, 1654058, 5165759, 7535712, 259080, 563467, 1939936, 7994774, 7193002, 2856710, 6590944, 2338788, 6916463, 2369019, 4076049, 6422223, 1552037, 4796880, 2450700, 3103836, 3939607, 1742095, 1033026, 8005856, 4436813, 2921898, 7169992, 4681291, 7643996, 4674053, 2336273, 6315155, 7272719, 4456335, 7433433, 5860050, 5476622, 6451614, 1854352, 4427131, 6631114, 5225425, 3615943, 1288279, 759227, 91777, 1735378, 33874, 4961088, 32095, 7027260, 7847899, 4606074, 6480389, 4497425, 4440158, 5333828, 1231298, 5800474, 6925753, 7283067, 1214900, 3998968, 3800968, 4144474, 4684301, 6653901, 5732652, 3235856, 4183720, 8242042, 360930, 5704421, 5689570, 2278355, 5318049, 196867, 7131360, 1766897, 2038927, 8243437, 5117414, 6756360], +[6236195, 7431543, 1457893, 8100690, 3729271, 8106701, 5881850, 2312717, 568412, 6973925, 4003919, 3185729, 597396, 3897471, 7735953, 1930914, 4391910, 5951459, 4361046, 313392, 908233, 7667635, 3784333, 3603053, 553364, 6733734, 5636749, 1309855, 1843546, 4300530, 1286211, 5472645, 1552989, 5044949, 5786552, 535108, 7163675, 2900245, 3382266, 5157932, 4669105, 2557890, 8424, 6710468, 5270281, 3691475, 3082562, 3284881, 2178271, 1451547, 5375897, 5658364, 7648359, 218322, 991839, 3673381, 2100265, 1501528, 4736926, 7549873, 6751285, 30365, 4462361, 7657648, 633890, 3147264, 1388580, 7544591, 4244653, 6519485, 2657071, 170273, 5359892, 2707189, 4135658, 2693496, 6174855, 3060675, 6425192, 4024365, 3495922, 4739059, 3068639, 4928352, 4706142, 7253038, 3392229, 6855607, 6515226, 8010373, 4665336, 6579153, 4768005, 392895, 6333513, 5918832, 1113124, 901024, 3314774, 40077, 2038944, 1119757, 4877430, 1853578, 3233818, 555, 73873, 318065, 1960896, 1080021, 2622472, 2313294, 2003931, 7451336, 5311495, 2830497, 2398035, 8116945, 3872691, 2246729, 2437436, 2909235, 3659712, 4290499, 6398513, 1089317, 1554909, 1965035, 439147, 6900082, 3041317, 851387, 3980021, 2017247, 2363513, 874987, 6239323, 277719, 2066158, 3292405, 5212611, 1882004, 8086983, 8142073, 5319210, 489706, 6892263, 1573817, 2619385, 2845722, 5024413, 3711832, 6981549, 908923, 6032731, 4950531, 2118422, 4237040, 7644079, 1633789, 5954192, 8370633, 2907017, 5566607, 4659395, 6118732, 6840812, 1868534, 8238730, 6804768, 4032658, 5024393, 7857475, 5080550, 2895416, 7421612, 1695749, 253389, 4139639, 2438614, 2872645, 2669373, 1290961, 7888303, 2116931, 4518818, 1573158, 599, 3142471, 4619457, 1570462, 436457, 6905198, 2229516, 1946146, 5698275, 2136326, 6886720, 1110048, 3354710, 3539350, 1503417, 3012098, 7404425, 108397, 6011659, 2896412, 8183674, 5520462, 3657990, 2114073, 2713659, 6222415, 8054620, 3841470, 3244809, 1589834, 2459431, 3556047, 5194939, 1693985, 4474140, 7512620, 6369307, 6331202, 6236032, 3306436, 4878875, 994236, 4824136, 6685968, 6500460, 6067862, 909883, 7409715, 3766879, 3201989, 1703167, 7535423, 5119796, 1378583, 5068609, 7426595, 3828924, 6654022, 8307091, 1558886, 5625783, 7220155, 7563745, 6835869, 5545399, 48390, 6524038, 7414573, 4126936], +[6741552, 5514206, 3147992, 2211582, 6634065, 416486, 5799592, 4424550, 298775, 35766, 3342080, 4386467, 1431022, 5947835, 4595354, 3617540, 496744, 7819525, 7997227, 2788981, 1505392, 4281905, 6913620, 771438, 8138929, 2676344, 4845439, 7489097, 656773, 7596304, 7016403, 6835373, 1787639, 169249, 2897003, 3303288, 7276276, 640984, 3603968, 3515383, 2516757, 307909, 553655, 8159148, 7403267, 2844338, 1321477, 3704776, 5837883, 3580977, 7410828, 2934814, 4649644, 7910796, 3395283, 7434293, 3886747, 2341467, 3212262, 6392344, 2810572, 5659501, 1103997, 5288302, 3352415, 5886168, 1414923, 1168750, 1305812, 637664, 3913686, 5493274, 2698136, 4638453, 6971904, 7034786, 2353784, 168770, 155684, 1423764, 2925873, 4662644, 831119, 2431934, 482955, 3453844, 8171049, 809306, 406678, 7641180, 3608438, 3242264, 1761423, 135855, 4634575, 7752859, 160873, 2303417, 2594529, 7450278, 3825887, 3133939, 5976641, 143382, 7327504, 5028123, 6768980, 4239332, 5767570, 8259802, 7637946, 58598, 7577549, 6410440, 6693129, 988002, 584659, 4338536, 1138597, 4518317, 5297890, 7350655, 3404583, 4057226, 7268066, 4511484, 6611193, 4269050, 2287173, 3358585, 1040123, 2629126, 7785456, 4614760, 3783414, 1857004, 2988627, 2326977, 4457784, 4252697, 6896791, 6873893, 1685832, 612505, 6607773, 7798773, 3563997, 5142693, 869498, 7644349, 564065, 4422102, 609652, 8062989, 6097415, 4337738, 4713792, 4397661, 624298, 411636, 1513854, 1327928, 1388733, 3573211, 3488663, 7204030, 7461586, 4965381, 5162634, 4162725, 6380292, 5453737, 2864204, 3248690, 1585301, 2741652, 3045072, 2364450, 1446037, 320009, 3722270, 8004097, 6691002, 4149824, 339468, 1277144, 5469765, 7095671, 7903732, 7394246, 76790, 7235974, 7666900, 1504095, 6114532, 6257083, 1827174, 2776241, 2353419, 8322837, 5285458, 4260523, 4679271, 6291339, 7912946, 4193237, 131299, 8196707, 1313633, 631285, 2152850, 2452937, 1811793, 8131913, 4896793, 648310, 3680312, 2115260, 6152936, 7368743, 6179432, 4565948, 3399981, 5106380, 36510, 668989, 2535270, 4135684, 467277, 6106767, 6190890, 7792816, 62288, 2885981, 7888965, 5214484, 5650871, 831202, 6410542, 5554335, 1696037, 7744392, 5347427, 5909749, 2179597, 6960489, 5045896, 3451923, 1249141, 6723107, 3153271, 1853685, 7642491, 3599058, 1508352, 1587213], +[152114, 2214903, 5194789, 3784620, 4050224, 3256336, 221853, 5478604, 3871087, 1509069, 4981976, 6860938, 5289137, 6198347, 7403770, 2868886, 748029, 3147553, 8170854, 3261341, 4793607, 1666562, 5262650, 1820034, 2469365, 7719751, 6534725, 489374, 44543, 7764881, 4401149, 1363680, 3361706, 6351951, 2342251, 3023993, 6512508, 426293, 5517042, 6892908, 5128878, 7439047, 8125554, 5841619, 5444227, 5517379, 5060757, 2859386, 4917218, 6498532, 986589, 7007622, 5603099, 5471979, 7361654, 5451143, 2848603, 7213621, 4535555, 6941945, 5725748, 4722374, 1133101, 2634647, 6781148, 8262970, 7982575, 3516164, 2822127, 882625, 7367141, 5008526, 857092, 5284495, 7087232, 1642890, 5314218, 2990821, 2360176, 3059904, 5601185, 6724041, 2575920, 3580505, 4838672, 4236692, 1052119, 1186453, 7500538, 7958698, 2781722, 2915679, 3980853, 1247201, 5188414, 3382391, 5615055, 6499582, 4150090, 2943721, 1824963, 2523885, 2132891, 5965980, 1388904, 2958176, 5554774, 7828135, 2960772, 5067646, 4974938, 5434267, 5443125, 7897712, 5436036, 5898899, 5671323, 3505247, 362933, 6485536, 5100697, 1851743, 3610262, 1457633, 795503, 2991930, 2910238, 3876542, 4549047, 1448955, 6478023, 4563962, 4452252, 7179898, 5783900, 5138646, 6099473, 6237592, 520890, 1347313, 6437475, 6352020, 3216475, 3682880, 4683300, 7117026, 2923373, 4430939, 7496944, 5622976, 3213314, 3475950, 5854609, 2378194, 5485904, 4942298, 114678, 2734358, 2826801, 7202857, 4815575, 3273014, 7520420, 3126772, 680976, 48440, 3379477, 1320632, 4171609, 3991226, 8117536, 7470841, 5431565, 7290051, 6308529, 7622332, 1560656, 1765154, 1671309, 2335241, 1747154, 2603083, 2914077, 182952, 8247319, 2230828, 4827005, 5496887, 6119273, 5437829, 6536314, 6764939, 4871053, 4502090, 1497575, 2764538, 3351376, 6212496, 8244516, 4227050, 6760098, 1039645, 1963268, 3758501, 7798756, 4469859, 3038854, 3716108, 7926555, 4034396, 4118631, 2567202, 1538231, 8377310, 7559099, 3763652, 196914, 4665246, 5898591, 1349899, 1366657, 2030500, 2478115, 2937510, 8213891, 1192721, 8294702, 7629827, 2253835, 8280176, 114583, 5548057, 7305486, 5318127, 7060099, 4411343, 1269190, 3820424, 4246291, 7785200, 3386118, 3377071, 2622697, 8376151, 2060001, 77343, 7972656, 4059936, 2115502, 300263, 7897894, 7403934, 2654499, 2107787, 198425, 4682165], +[847441, 1112508, 5214273, 5712697, 1098878, 5421537, 5446584, 3698521, 7690566, 3829976, 4034642, 2760430, 7884336, 8168784, 7271536, 2201634, 8053845, 6251401, 2196870, 1159864, 5380695, 4258164, 7759252, 5990234, 8362466, 3000640, 2946643, 1351999, 7727481, 6609715, 4824329, 7825333, 7120516, 1282728, 5745334, 5563203, 3068049, 3091175, 5326475, 6343761, 3762198, 6997353, 908179, 1793342, 7977714, 2306172, 5511183, 6757789, 3892404, 1694081, 1058257, 7493238, 4785775, 6333345, 4859416, 6925434, 3402860, 7314839, 6976465, 2498707, 273459, 1692319, 1441275, 6124665, 7118845, 7601741, 2194861, 1864507, 8125645, 8379083, 5609959, 2128857, 3305123, 2175987, 3988656, 647978, 2875466, 3562303, 4941983, 733873, 6577817, 1977419, 1110825, 3856486, 1991089, 2248055, 7492661, 497254, 3302301, 244249, 799684, 3563120, 1909559, 5984676, 1599326, 4609508, 846504, 1399565, 5942152, 4990231, 338200, 6660654, 317501, 4464900, 7633013, 1478918, 259970, 6005231, 962514, 4221805, 6292404, 502072, 5485715, 5699212, 2803861, 1790766, 1739682, 6696008, 5940002, 1826330, 6601902, 2536308, 2300424, 5831673, 1226909, 2781640, 2869174, 3585759, 4403722, 2637476, 5481787, 4666610, 5183636, 989550, 3701937, 5950044, 4430445, 8052666, 7470833, 4380609, 5792855, 645783, 7998577, 7892458, 1097511, 1382569, 3916596, 5131467, 54853, 364241, 1230870, 1298065, 5289466, 3189726, 5741559, 5865735, 3985450, 5916671, 2668466, 5361938, 3101333, 3573081, 1625894, 1008380, 3346722, 6733010, 6175633, 1562486, 658709, 888902, 1482942, 7308668, 8226852, 6819912, 4277543, 6728011, 6797029, 1976522, 6856406, 2251021, 2692727, 7553549, 2492860, 4906022, 2011698, 6355644, 7473386, 4104674, 796180, 4121308, 4163803, 457129, 417543, 4661054, 4789029, 6764971, 4662554, 2717942, 6898760, 5824081, 2236949, 1276861, 5437542, 2895319, 5870740, 6664779, 4639537, 1910826, 5518169, 4867461, 5045440, 7819462, 847119, 4013479, 1990026, 3466835, 8179487, 799826, 8177691, 794895, 497262, 6503506, 5718439, 6163811, 3069409, 2676560, 1824232, 730342, 6550671, 126684, 2682296, 2996403, 5928466, 1019407, 381692, 5231174, 5018052, 667841, 4223090, 7522191, 3157450, 1749409, 4393306, 7207703, 650104, 4513150, 2288258, 2537867, 1683861, 7432701, 2540434, 4830782, 3979641, 64946, 5028240, 225331]] +aHat * NTT(z): [[1921421, 4549867, 4572561, 1346644, 5539201, 4193813, 6396665, 2367024, 7514888, 6357899, 2904798, 3076149, 1746584, 5854014, 20922, 3451673, 7051577, 7528886, 140308, 6142706, 2559681, 6072444, 402296, 4328574, 3098081, 835552, 4278663, 6567497, 5463153, 2979081, 5608742, 7160450, 8082368, 5969425, 5861442, 1060519, 4072784, 4987523, 2098217, 6814527, 5364818, 4690732, 345736, 1485338, 5431692, 7337934, 261324, 2378855, 958943, 982476, 157792, 8220009, 2135934, 3233003, 8312124, 5157883, 5026173, 250914, 61524, 701048, 3472724, 355382, 5762276, 2102143, 3348110, 1964196, 4646438, 8013904, 7332791, 3149513, 1194180, 7238024, 6435771, 5936372, 2467354, 2885402, 3121654, 7600901, 1211138, 6282126, 2977398, 7028639, 812232, 6983869, 2077797, 5519453, 7911481, 3350687, 3931163, 6702852, 6186519, 4006207, 2719557, 4217212, 2179661, 6265630, 581499, 502606, 2723894, 6873920, 6704712, 5739576, 6936288, 1945832, 4843596, 6807347, 7949910, 672272, 2691597, 8039211, 1983677, 2714692, 7474629, 7643401, 3731149, 4804731, 5145765, 2493782, 4902767, 7988645, 5639750, 5847499, 4498778, 3761819, 6053686, 5210491, 3843329, 6595276, 8346016, 2010365, 8054459, 6791174, 640683, 4188545, 3274702, 1956999, 2238420, 815950, 4841979, 4339070, 2617016, 8195438, 4819118, 3459402, 2780389, 3354566, 6311927, 4351921, 5743035, 5876728, 808506, 6800473, 5989957, 4474308, 1274414, 2052273, 2706261, 466481, 6524309, 7657751, 7241934, 3917377, 1339186, 4588548, 75003, 7817269, 390402, 6280184, 2067334, 8102458, 5682956, 3944665, 1386554, 2933703, 1418026, 3589197, 3004327, 7282757, 7735695, 2643135, 1949212, 3303199, 4221695, 5081073, 5160256, 6417424, 3413253, 4828093, 4307068, 7734289, 1871072, 7551456, 4888520, 7476328, 2757796, 3464752, 4254833, 2158926, 4960445, 7244685, 7798142, 4424226, 8301193, 3110785, 2937711, 7385119, 6226017, 3230458, 826209, 3399266, 6882732, 7859507, 1815255, 5419863, 413752, 7891538, 1778916, 1503379, 1384527, 1531093, 2766579, 147639, 690471, 2921473, 484696, 1780583, 1844929, 8044053, 5125259, 6433353, 1555732, 7016271, 7554443, 4208778, 881301, 5781032, 1333252, 3564186, 1549393, 2186853, 4431253, 440113, 6574103, 7865002, 1343267, 4767437, 5070957, 5260964, 194139, 7789439, 2147022, 594415, 5949982, 4798585, 4584341, 7671333], +[5808379, 3769867, 4323172, 1981885, 6898546, 5213668, 5250477, 4775505, 8037473, 1269239, 3951516, 1847605, 507604, 4153686, 6830046, 6086641, 3180929, 4126299, 3379266, 7698286, 2581846, 2508116, 4193265, 2465000, 3512669, 6092642, 8132748, 5155130, 7606584, 5418202, 1982434, 3320163, 5428999, 6829137, 6767206, 6772045, 1502137, 8215207, 3578444, 6602755, 3408242, 4513700, 5461165, 1589883, 4828323, 7610603, 2391924, 4024924, 7083823, 4487656, 4479740, 1769157, 4012812, 3138769, 7893197, 1626519, 1103297, 1965576, 3966775, 1711388, 5348371, 7564610, 6987936, 4975077, 3085161, 6219776, 3602596, 7982094, 5362917, 1946014, 149056, 3758596, 1643747, 4695343, 7466598, 2571402, 7772819, 7036861, 5893632, 4207625, 6725486, 4977803, 3786221, 8190818, 7865542, 5898130, 7017325, 2457270, 4591368, 2006720, 3861677, 8327692, 3158154, 936274, 7788066, 1299880, 1668230, 4313349, 2735729, 4090121, 1026473, 7725053, 7625378, 8261376, 734187, 6729344, 169941, 6652808, 1667931, 6830489, 3997963, 396643, 7053660, 6992819, 4287583, 4531107, 1287760, 6128455, 1378633, 7772725, 8353157, 3366419, 6558142, 814434, 2187714, 2074950, 6734156, 1178083, 4969220, 6480704, 5584255, 2155125, 313605, 2448143, 1298607, 1101597, 3582896, 1274298, 4688794, 134791, 2702410, 1121717, 2428476, 4597045, 1610746, 3298865, 6482154, 8084265, 6566162, 1799393, 5993849, 3817047, 726963, 8136955, 7625081, 473129, 740643, 3719077, 8152480, 8122354, 5893170, 7420445, 99075, 1332450, 4284957, 3370117, 7541101, 1518361, 1531494, 5238898, 2376098, 92618, 7543847, 5921384, 6451536, 3753247, 4471702, 6053271, 4947246, 8048290, 4884038, 2730378, 553689, 1433596, 8162377, 5746937, 7450264, 2289873, 3616092, 7545668, 4205676, 144993, 4178853, 4018803, 5441570, 6665618, 7716199, 2883514, 7857690, 7139766, 3699135, 6507479, 881352, 4347041, 4748682, 5397901, 6083263, 7579522, 6427267, 502787, 7371269, 2341979, 6727649, 3231640, 5958324, 4563487, 1157247, 2716422, 1418882, 466010, 308875, 3234765, 4426652, 8158647, 179324, 6398246, 1854468, 5627192, 2067898, 6182705, 490788, 1824714, 6229145, 4877837, 3824451, 6756532, 7709338, 5049605, 4822849, 7988818, 5995907, 5163229, 5457858, 6361441, 6776739, 4466338, 6179884, 3332377, 1404879, 7432434, 1038712, 6817581, 3634732, 6843366, 6834093, 7522635], +[3389016, 6045450, 1174858, 5715429, 6336124, 3043074, 70683, 3127896, 2617947, 449219, 2735576, 1171378, 6906726, 5207722, 1485521, 1350590, 5272361, 3986744, 930754, 761569, 3251968, 2042939, 2845622, 4290837, 1747377, 7039167, 3898995, 4748521, 7304312, 6250523, 5947442, 6608058, 1392946, 905762, 8088318, 7849817, 3848715, 6441054, 7984769, 1561740, 6491356, 2972610, 2294052, 2853926, 2060967, 3239627, 8107771, 4111573, 792919, 207748, 6907108, 1983220, 5980006, 1203356, 6956714, 1786435, 4343846, 7761917, 655011, 6887035, 1407582, 5511406, 3268265, 8272795, 3876196, 2889687, 7106753, 3021460, 406477, 3560677, 1480955, 6968628, 7956680, 5464746, 4435297, 7603207, 1510975, 4423194, 5055457, 7651339, 4198597, 5063919, 3369930, 8002095, 4789203, 1207850, 7643769, 2959548, 1409443, 6482317, 4340320, 2028403, 845953, 535715, 5610552, 2556836, 4394994, 4808034, 1139262, 2275041, 6396066, 7039924, 6998427, 6386842, 5451323, 2862983, 7413054, 3662384, 5199793, 7699607, 4493117, 1170878, 1389041, 3524798, 4717846, 1311715, 1279707, 2973960, 6144492, 4044054, 2212940, 1578237, 3298010, 1106008, 5683368, 6980110, 7531215, 1289564, 8099225, 1004693, 5407146, 4217338, 474252, 7534601, 2779335, 4379626, 1063611, 7680387, 83168, 6878731, 7747468, 7158197, 3136229, 2815127, 5976889, 1207219, 3399228, 2085545, 2821732, 3365143, 4867036, 4234306, 1804407, 6623665, 3332279, 5810121, 4618834, 2437669, 616116, 7925618, 3770047, 8228945, 5529956, 2437872, 4108753, 6139847, 724393, 4241267, 1829639, 3104872, 1366978, 3208525, 641241, 7370180, 7936078, 1964182, 6256501, 7547542, 1000016, 232455, 95455, 4570142, 6403173, 5373047, 5213003, 3076541, 1373370, 6402280, 1305747, 2247743, 7473048, 1120922, 425836, 5302859, 189672, 1998319, 4413126, 2601206, 2751528, 2465558, 5405832, 1651407, 3837840, 3505231, 7758552, 7600947, 1508687, 1670360, 7048261, 4304021, 1455088, 6158031, 687080, 5197178, 7974405, 1522969, 1564508, 4572070, 3045720, 7475468, 7977127, 7415060, 3013489, 145860, 3086, 2859455, 5729385, 4018951, 6987498, 2329719, 1650899, 2955697, 4195588, 3733840, 6808867, 4639171, 168098, 652891, 3181467, 6889732, 5891396, 207236, 3929324, 411061, 3752133, 339326, 4113747, 5851446, 8258915, 2416163, 5026933, 7180493, 3448147, 5384861, 3689756, 4582595], +[204560, 735344, 5587246, 959362, 6153771, 728074, 3987579, 1606941, 1203415, 722729, 3021020, 7979599, 7564868, 6483012, 2452714, 1626101, 3750880, 7874765, 996270, 4915085, 4176017, 174107, 6955473, 4495288, 5492007, 362584, 1747426, 2930146, 3402238, 4392158, 6055083, 4758642, 7084099, 2497044, 542545, 3202328, 3035242, 1208391, 7086738, 5020480, 1209855, 2719423, 4456733, 7939386, 4686699, 6418029, 1162726, 1656754, 134800, 6917287, 3394865, 782276, 4256424, 6201573, 658524, 4682891, 1532821, 6864898, 2334798, 4395362, 5754960, 5589367, 977796, 7738649, 5337641, 4535351, 6433880, 3393575, 7390215, 1596802, 861503, 5704381, 6028645, 1275000, 3449903, 5682417, 6502929, 2323109, 7889810, 3233590, 3081223, 4818255, 4578652, 3986825, 6341476, 1650066, 1808173, 2388342, 7892657, 8228497, 5491085, 6924243, 4062396, 2363203, 5061724, 2271216, 7692462, 4379988, 5218502, 3822440, 3145127, 4900134, 2578641, 5493328, 2132113, 2545040, 6030090, 1404515, 3872195, 3168449, 3199662, 3180156, 8181500, 4077736, 8020281, 6951563, 3056939, 6525093, 2524477, 4771061, 7828962, 1363298, 6630208, 6052866, 595407, 4152359, 3459101, 2874698, 5305281, 5274321, 1719917, 4946019, 7226328, 2457861, 1023305, 87038, 4272913, 7848704, 3113356, 7254427, 5861590, 4265193, 5311670, 268404, 4859147, 7738273, 3379532, 4466086, 4936863, 5278959, 1872536, 377035, 1836522, 2003548, 924952, 931240, 1162866, 2943468, 618817, 5110318, 5061440, 400501, 2277191, 4518723, 389235, 7561666, 6136162, 329901, 5047090, 2854993, 5131074, 7141930, 1937239, 5690544, 280290, 2571998, 2836354, 3426321, 4549828, 8244368, 7010141, 3591776, 6990602, 7816134, 6961131, 1072244, 224720, 4145935, 2484797, 7903533, 7036457, 2847231, 689482, 131087, 5543193, 8066198, 8289741, 4632489, 4787781, 6689016, 7336357, 8236356, 2833775, 238664, 3050326, 23136, 5075656, 6506092, 8200135, 3176608, 4661735, 191101, 1181674, 6494521, 4035079, 3968203, 4479067, 4500000, 7497362, 4419644, 1955199, 2035620, 4070831, 5411456, 2477735, 1475305, 5965975, 7821059, 120352, 3608944, 1275507, 6845385, 3585518, 7579652, 2049148, 242146, 472127, 5880369, 4466793, 7434346, 3925162, 6557602, 7313686, 4815212, 4461651, 2632665, 1641302, 1236710, 6759439, 482012, 1037645, 5201043, 3901415, 3953324, 3701452, 5456205], +[5462952, 1043296, 3578626, 1294625, 4856419, 4673395, 5969503, 2503087, 4228667, 743672, 4642468, 4397787, 1467341, 7803633, 7944641, 4211995, 7233503, 4597278, 5164442, 844881, 7138253, 5530576, 3787643, 7666584, 5356114, 2000792, 168153, 5404250, 1182624, 1084782, 5445085, 2322344, 5024620, 465588, 3213403, 6162283, 5448238, 283059, 7643310, 6848381, 4468879, 7775955, 6478347, 2465540, 3714266, 7408531, 2519460, 1279775, 1479813, 5595651, 5938654, 95109, 4241943, 3754453, 7438494, 6390217, 2045216, 2708896, 2517733, 8179307, 7689847, 5654306, 3885027, 5003725, 1316612, 603597, 7137466, 7335154, 5031917, 733439, 1472463, 3709367, 1895188, 1511819, 2851571, 663467, 3330009, 1634454, 4221035, 8068895, 1881401, 5842158, 4967268, 2573389, 1019079, 2920245, 3651959, 4004951, 6435769, 69266, 6099829, 3922770, 5080277, 5773136, 3930303, 7470548, 7126833, 382244, 6925695, 702507, 2349480, 1433943, 7341397, 3481782, 4877417, 8112161, 7406565, 8177507, 5159073, 2668163, 3038294, 5062380, 6973198, 5103666, 1696121, 4860897, 8160649, 1749202, 2275101, 3154765, 4293224, 7859915, 1930311, 3919091, 2986908, 1415439, 772064, 5270487, 11244, 1874643, 807847, 565045, 4650160, 2988834, 1941205, 4904363, 2264453, 4746482, 6129116, 5506223, 7323146, 129901, 4559894, 142521, 4410058, 3189062, 2886103, 6705600, 6638760, 2649688, 4956242, 497939, 1668070, 379980, 563635, 8361395, 2906224, 3728504, 2391793, 669507, 7017441, 3869488, 1439170, 7126426, 7372362, 6396906, 249232, 5174404, 7664934, 709336, 240686, 2504498, 4478867, 750483, 4351548, 8177436, 4235011, 2890185, 3624008, 373791, 631416, 1909231, 1794456, 7763859, 6011846, 2054820, 6833400, 4659406, 5573474, 6861181, 3541292, 4107783, 1155052, 1398827, 3540318, 2301571, 6083803, 4718217, 6910989, 5240607, 8074459, 1517792, 4888111, 1892227, 3371594, 6729967, 972437, 6798502, 4981093, 1742252, 6018024, 159481, 6074633, 4432553, 2373258, 634302, 1971470, 6093679, 7838557, 4448807, 6292068, 1322868, 1183313, 172349, 5979068, 381150, 388750, 3037499, 4246853, 5230697, 7822686, 7733158, 1996539, 6976532, 4291133, 631695, 7893526, 6333903, 4522824, 8244799, 3030729, 6268294, 5780837, 205735, 2558739, 2330047, 685774, 4968184, 5322104, 357030, 5627468, 6296906, 7984327, 3905848, 5491718, 357874], +[5288504, 499627, 4343506, 337774, 1471678, 4252574, 4690653, 1736836, 3682737, 7583299, 2601701, 1037933, 638666, 7767567, 3901022, 1638857, 3805095, 4120147, 4999127, 1632669, 7548907, 2918776, 7500139, 4653899, 6696914, 5334016, 1473696, 2282168, 7471659, 7320070, 1651110, 4503451, 3597806, 2381006, 2029865, 8049697, 958330, 1567194, 7648863, 5035382, 6008679, 6430754, 5360952, 7807464, 2960220, 4562532, 3927026, 7293206, 3265316, 3602315, 1007088, 1986200, 3178257, 5206512, 1473860, 4670922, 5833464, 4025411, 192774, 4211421, 6819128, 204240, 7414369, 4153818, 6890613, 5569303, 4755080, 5814864, 1146508, 611844, 2369514, 5903071, 2131628, 5197798, 5522951, 1101933, 3557879, 2563703, 1418496, 2419862, 3582744, 971238, 7060746, 5299502, 6730900, 480716, 7145298, 2844197, 1634317, 186432, 7314816, 6958047, 3702081, 431530, 3977163, 4405541, 3681903, 549803, 3029689, 6046676, 3191866, 1739820, 5691486, 3708426, 3679526, 414144, 1082904, 6352483, 5483823, 3402661, 6908486, 3500929, 6193276, 2580558, 5275721, 382226, 7060916, 3113322, 2589816, 5163902, 4359874, 6668719, 3099066, 3134180, 5141909, 4070787, 3287983, 4850742, 1529519, 5218251, 8166425, 126464, 1895644, 4048407, 8131220, 4887208, 8223539, 563052, 3585453, 3601668, 577797, 3160863, 7853123, 1647684, 3632294, 4237247, 6409516, 7727688, 6648916, 6210131, 2518766, 5328280, 3249229, 892768, 7585860, 1759442, 4224808, 1965660, 4926164, 485768, 1733379, 2552699, 7016291, 417084, 7195476, 3722244, 5790036, 1150563, 7614775, 4427998, 2844795, 3700917, 2038195, 7762549, 7352049, 437527, 772720, 6502775, 1398878, 6267402, 5257388, 4845156, 588533, 3272451, 5488234, 4519808, 3719919, 6149973, 5461667, 4018273, 1143312, 7703674, 8122159, 414070, 5080192, 2883456, 4455077, 7750240, 2976425, 1865193, 6950372, 2232608, 2816905, 5123792, 1767750, 6654925, 4422394, 7216114, 2108025, 3181187, 2424144, 2802905, 3911366, 4794831, 766799, 5952775, 3325506, 3710751, 4765842, 2980050, 7480002, 2956099, 7545562, 4731180, 2454499, 1324438, 6892522, 2242579, 5462283, 6350207, 6738995, 3840795, 7740498, 973926, 4828353, 3303128, 1847785, 1512419, 3750079, 5591017, 7495234, 3920840, 2631635, 5301978, 4175650, 6793844, 7986988, 2592077, 5378051, 3423808, 7642970, 105629, 5430412, 3579749, 7337121, 2461364]] +NTT(t1): [[2465103, 2822635, 2594302, 2910374, 1036426, 2094292, 618434, 5132084, 8210004, 1708789, 4084084, 5389518, 3845241, 4241152, 1096633, 4931405, 6811198, 1187541, 2493940, 4907330, 2540541, 4855926, 7450141, 5677353, 2141331, 4290553, 1194864, 3258203, 2624409, 7772397, 7291668, 5648877, 4641288, 2097607, 1482031, 5822315, 3562054, 3840902, 1928868, 4883382, 4601327, 7000987, 7247339, 2926730, 551439, 3022367, 1058829, 2715079, 1613054, 4976717, 5451463, 3084519, 7103168, 4027847, 4684692, 6882045, 3432886, 7139447, 6920229, 7077008, 1775903, 1636444, 6746543, 5010599, 578493, 1042930, 1814232, 3764155, 6351121, 7793658, 6953696, 6455464, 7544831, 4182288, 2342867, 2239519, 5820499, 6336676, 7214586, 6797948, 7162193, 6786824, 7471125, 4745380, 7166676, 3190191, 2974815, 7318032, 5364419, 7830175, 728984, 2223545, 6479411, 2551613, 7366355, 2917229, 1787355, 4257600, 7911122, 6458846, 272496, 2895842, 1563332, 4738741, 630128, 2677028, 7360090, 4960604, 6642604, 3348584, 7552848, 7556226, 6995055, 2001871, 6315219, 2760311, 525390, 2124427, 8002195, 3208106, 2030864, 676695, 6078178, 6270505, 3098120, 7411852, 1703069, 3358278, 4683254, 2798507, 7797677, 1424293, 6700691, 6759264, 5298931, 4869753, 6543357, 5742714, 507500, 6193230, 959556, 3048974, 6023896, 2669711, 2715833, 7153611, 5689153, 8308062, 1707578, 5024144, 7718170, 8309608, 3206757, 1432072, 781830, 7384796, 3479713, 5099252, 309708, 5369434, 6341509, 1525091, 8220284, 2521393, 3252951, 63123, 7184341, 5858651, 149170, 5732571, 61842, 5262372, 2384977, 7092043, 230620, 7841635, 2920731, 477260, 1439478, 7355284, 7828553, 8348717, 5617493, 638472, 2371278, 2922110, 2840881, 5546630, 3401537, 345345, 8068376, 2202145, 4857942, 7226326, 1629087, 5185240, 7577959, 5300769, 1445524, 4758323, 6212623, 6966642, 8065316, 3681542, 6635706, 8317961, 6738386, 6613130, 7513372, 7280664, 6453542, 4372651, 7484064, 7477587, 3337036, 3031044, 1026276, 143691, 3639865, 507770, 6422807, 7965295, 4342288, 4368466, 1345950, 1272043, 7384097, 2914668, 548728, 5625749, 4253044, 7000388, 7854240, 3897427, 1817094, 4072302, 5197687, 3906854, 3849422, 7128041, 4458333, 2737935, 1040230, 5657125, 4094833, 2760480, 389530, 3264779, 4762029, 3518246, 6780235, 5851286, 5539344, 2216881, 2376246, 1865118], +[699794, 2800210, 4919939, 160664, 8024568, 4992139, 2026687, 7911503, 6609409, 1101580, 2007299, 380412, 2584548, 5562993, 4010124, 3832417, 7356837, 1326544, 538047, 1177982, 3025914, 751210, 7345704, 5117511, 7977244, 6557990, 1187616, 3765792, 3442206, 1340189, 6766282, 6741937, 1865471, 2593384, 7701675, 8305332, 7041711, 3911985, 7955326, 6727556, 4150463, 3703120, 1169487, 3012574, 3965759, 5397844, 7774176, 1912508, 6599124, 7901817, 2332577, 7119441, 3730492, 8231196, 2562612, 1237719, 1636078, 1212542, 5358500, 4008275, 5229403, 915481, 4865886, 32994, 3163507, 2692844, 8220750, 870059, 3861268, 2529185, 3990492, 5034747, 4153075, 5002347, 4913556, 3139196, 5676684, 1765869, 5829928, 1531962, 2269834, 7196450, 8169017, 4237164, 6809485, 2816776, 6662070, 7716803, 4839372, 1393335, 2820615, 7234857, 5155583, 4365765, 5396960, 7418811, 5605680, 1644277, 6093278, 7794335, 4318830, 3515740, 1402645, 357941, 6209337, 5789189, 5369249, 1272472, 7686903, 114359, 3236731, 3404118, 7494734, 6543368, 7600940, 1792954, 2465533, 6834721, 7410763, 1783369, 4595619, 4715966, 154707, 279632, 1207935, 923641, 3216153, 5412135, 6496107, 210760, 7472789, 2327345, 19370, 3935543, 7701290, 5719550, 3533865, 3648027, 4677564, 456288, 7218379, 4101710, 4345314, 4101258, 3558641, 4885660, 6783341, 1507504, 7160785, 8055370, 2634956, 7484111, 2663268, 3328283, 536778, 2056373, 6190636, 4499415, 5314140, 236765, 2622774, 1869198, 3002023, 5896728, 7169178, 6457327, 2203851, 6151335, 7027042, 2636431, 8217935, 5997336, 5543393, 1462476, 6049623, 1000700, 6107159, 4733671, 5812596, 4505599, 7080256, 3892821, 1368318, 7438106, 8101011, 5909278, 2720225, 2385049, 6401827, 4921896, 7351395, 2198269, 3645059, 5049551, 3240737, 1910347, 8249516, 7444432, 2689084, 6950479, 872966, 4651351, 929574, 796564, 6478958, 4897355, 4354015, 2667439, 8248742, 8319386, 3919612, 5565317, 4864837, 7446783, 4476646, 4887045, 2259065, 1675416, 5195741, 6096177, 3036614, 6357472, 322624, 7333407, 1984147, 7878535, 1551387, 5956261, 8340173, 7755338, 5727584, 7242914, 3441516, 8124994, 7016615, 7957935, 5970699, 5536639, 7791305, 4629267, 2921358, 6546085, 7704635, 611706, 7788768, 5896766, 2308591, 155015, 5591056, 4871223, 7048725, 2615093, 3356678, 1077673, 3584664, 5167993], +[2521997, 3370917, 912088, 4127513, 3520874, 7108176, 400276, 3811249, 383955, 6199522, 3470112, 6573522, 2653874, 7252874, 3635003, 7409391, 4857696, 2490455, 5009560, 3437342, 2807372, 810599, 1089762, 5755749, 467317, 352658, 4539930, 1527038, 7765722, 2450047, 7686613, 7009123, 4492308, 7299073, 8248872, 2208718, 5308280, 8274760, 5680062, 3621075, 1958356, 4032393, 2254756, 1062333, 6067216, 7361232, 5165506, 6639480, 4689286, 1450462, 4248848, 3051201, 303527, 3791284, 6343150, 2604962, 3463190, 6341295, 6907115, 8269373, 3836158, 1023583, 5856370, 5989775, 2199604, 6919058, 8021925, 625411, 213237, 6846480, 5840865, 5860840, 5135369, 1266066, 873248, 4256729, 4731525, 5032743, 2416493, 4597357, 6427220, 6985242, 6606419, 2871154, 120267, 7053593, 295089, 1187510, 4189326, 5635230, 6630033, 6063448, 3695125, 4074593, 4119865, 1349385, 563649, 7603784, 8010493, 7179172, 816828, 3361887, 5383924, 860510, 2817656, 1117889, 1057760, 1989738, 2704211, 5284512, 6984540, 7802507, 7338603, 3948037, 7522807, 3554865, 5766672, 1924643, 8264061, 4347882, 1721126, 308039, 7352717, 3636277, 6561553, 6661432, 6411264, 7684024, 3217052, 756320, 5457372, 7447943, 7174845, 7572015, 5821166, 6176937, 4667965, 3591259, 67838, 7056554, 6015078, 3533644, 3012317, 4499950, 5279248, 3425248, 4825004, 3438211, 5639975, 5336286, 6198919, 702397, 6969478, 538324, 6225786, 4147883, 5313334, 3152940, 6744803, 639270, 2360233, 6700339, 4990079, 6401868, 7327506, 6455453, 3626918, 3428701, 1370394, 6506983, 7691033, 7933859, 3200930, 5185183, 6974711, 5821962, 1017258, 2145232, 3487507, 5752804, 401015, 3148439, 7619793, 2695454, 5643727, 7976781, 1412145, 3367460, 1463186, 6676787, 6353275, 6174450, 557009, 1945305, 4729179, 3124796, 3453114, 7882385, 717654, 1257513, 4336970, 7760808, 6714873, 5113048, 1556272, 3414761, 11836, 1476304, 1474532, 39627, 3555123, 2350732, 1530232, 3521549, 96451, 2879468, 7511453, 5996353, 7465007, 6417949, 2910590, 5589094, 2042198, 4396800, 1127649, 6639449, 4325621, 818654, 5146310, 7163005, 7604302, 4395746, 6878633, 2757996, 7616266, 3336779, 4288607, 7847490, 2312470, 6263, 8316010, 4226096, 537350, 4614512, 6348076, 5479712, 5006039, 2364876, 1917667, 1625224, 4871504, 236610, 1412405, 2862770, 333247, 3152664], +[5656882, 1546516, 6684076, 6736632, 2388573, 4302206, 6273344, 484690, 4004921, 1850729, 7854628, 2634196, 5752042, 1993361, 2803706, 1867998, 268288, 3288181, 4222426, 2361560, 4057123, 2562782, 3262591, 3951155, 1345207, 7269799, 825737, 5712882, 7340660, 8374864, 7677583, 7552123, 5455298, 619173, 8157193, 630442, 2276833, 915093, 8355742, 8362957, 7848712, 1347960, 2435688, 3620434, 5239527, 5132313, 771334, 4562045, 1940551, 2703796, 3475373, 4724177, 8257320, 1535055, 896792, 6619367, 8371623, 3015442, 1967302, 736885, 5127196, 1088021, 825578, 6276201, 4842227, 7043053, 840150, 1707067, 7167603, 969631, 2120190, 5892610, 7765107, 3345992, 636045, 463148, 6822698, 240903, 652014, 3538190, 822057, 3211335, 6880908, 4335711, 2699422, 1553692, 2233019, 3591311, 1060889, 2503231, 7960536, 7274138, 4920652, 2958390, 3275982, 2883454, 2321943, 6665265, 803914, 609652, 6004694, 2634190, 4767898, 5802020, 8296899, 6989028, 6888021, 2820324, 3060705, 2673532, 1329748, 4296433, 5615976, 2983663, 7996727, 6332142, 5758112, 1985095, 4318242, 3819420, 2663796, 7563912, 1454724, 813333, 4044355, 1672926, 427008, 2336078, 178592, 5484674, 601489, 3399933, 2506331, 574269, 2664357, 8133627, 768599, 5635506, 5002954, 5944846, 522795, 1887209, 56080, 2334943, 6658685, 8264071, 6662523, 3940415, 4123067, 6956355, 4478172, 529700, 3886328, 5736414, 2476510, 2400611, 3243593, 6953665, 3938466, 1349061, 6199103, 3887870, 7605763, 8365003, 899546, 5375249, 5722618, 6600156, 6765287, 3854154, 5044594, 6895789, 3968152, 3423979, 4735633, 3904425, 4762046, 3467728, 3341925, 5263470, 6652830, 4779801, 8077841, 3203536, 4799440, 7765892, 4004306, 7498229, 7519690, 3649357, 5433454, 7184019, 8373920, 287002, 2058366, 7110738, 4856755, 5048610, 6340885, 7054226, 5381519, 3303112, 2618690, 4644214, 8020545, 2808404, 282802, 5177082, 5080139, 8035367, 4671059, 2829418, 6052399, 8300342, 8193220, 7980694, 7905382, 4364061, 1865535, 8203074, 4584814, 6757245, 367074, 2319215, 3241074, 8267549, 6186874, 3650486, 4162839, 4715732, 8116511, 1023418, 1808378, 4171468, 638638, 1102695, 2358653, 5488846, 5000238, 5700038, 5172551, 3380099, 2233556, 5478157, 3865393, 7018839, 2575466, 22162, 6700855, 3549806, 5782172, 5802877, 611904, 4093417, 2808869, 5054593], +[5530332, 6656075, 2985085, 6425099, 5562827, 211989, 8111958, 4437937, 3433823, 6261319, 1485321, 6383811, 6089975, 7117748, 7060790, 5508289, 7190185, 6565558, 3076403, 954382, 5753268, 6339866, 4096172, 2781053, 2950010, 2377265, 569998, 1339333, 7497980, 5094837, 7655047, 3032659, 27582, 5297451, 455522, 4801861, 7379179, 7552979, 7586379, 7113717, 6325753, 3503450, 4011703, 5957161, 4686526, 7363743, 4048920, 557922, 4616548, 6808382, 498089, 657577, 5220151, 1641977, 31368, 5620335, 6558771, 589338, 2943246, 4537587, 4170530, 1998200, 6128707, 3286285, 6213454, 6560935, 7636692, 327437, 7591440, 7010590, 1994352, 5801622, 8041609, 7902493, 2866872, 1667388, 1706525, 571872, 197825, 5214079, 1423781, 7464114, 1806487, 5861013, 3013439, 8374536, 4705605, 4099992, 7026676, 91148, 4768456, 3672408, 3155411, 8314476, 7101633, 3391789, 1481008, 7291972, 6290285, 4266778, 4089707, 8334508, 4046751, 7449522, 2074752, 3911418, 5872688, 1388108, 4347790, 3753980, 1047109, 157563, 1676714, 1011117, 1151246, 4114859, 4106847, 6637911, 5438811, 1684428, 4635569, 2736476, 1469526, 3984852, 2318252, 8040253, 6712530, 4236613, 551295, 7832067, 1313966, 4989957, 6904024, 4557819, 7596729, 5250121, 6583940, 5041638, 6319648, 5312781, 2766288, 8136138, 5605528, 4716037, 1169400, 4443127, 3558772, 303423, 6830943, 3301198, 8189444, 7243342, 718820, 6298501, 6380511, 7380609, 4554794, 2828292, 3520237, 2320499, 57763, 1423211, 5846926, 3935371, 6597374, 6475312, 6550063, 6801386, 6333221, 6325267, 1567836, 7005641, 2376287, 5931706, 5355363, 6275036, 6488488, 1450773, 4762546, 3569674, 3285451, 313352, 8054832, 2702227, 2156289, 2333003, 200670, 5527117, 4056455, 1054116, 6267802, 2130280, 8157391, 7650345, 5397182, 5706547, 6069758, 5355618, 6482889, 162634, 1207038, 7135331, 6398446, 2959151, 5453548, 2319493, 3686911, 3003519, 7686791, 70578, 4207897, 207047, 4256553, 2291852, 6786142, 5768767, 7115064, 1613051, 3691659, 5311885, 3597109, 1694367, 7191422, 5267947, 7431104, 3506698, 3232692, 3440571, 8141132, 3367600, 8211231, 6515795, 7668910, 6027174, 7770237, 6996794, 2000179, 2524778, 1547181, 6473957, 1616269, 7002238, 6460041, 7159237, 1696155, 5205285, 876136, 1779666, 282086, 1013538, 5831896, 6145377, 8215099, 4246741, 8195369, 5729575], +[5963162, 5701763, 6163110, 8064739, 4804876, 4204734, 134920, 4002931, 549865, 2435200, 3578943, 5852619, 5102513, 2525367, 1952080, 7897081, 2828708, 6576433, 7794187, 2339082, 1615166, 3674745, 4360228, 3875937, 7986986, 1742553, 7131935, 581941, 1724125, 1288386, 659, 8130506, 3501623, 119775, 1633477, 7998280, 2926304, 6815464, 302222, 3585489, 5703237, 8308945, 3933285, 5787325, 5073992, 2281678, 7772495, 7348805, 1180249, 906476, 6534810, 6941758, 1338331, 1799462, 2886590, 6119686, 7403327, 3835762, 6508316, 6494400, 2625208, 3825097, 4737063, 5448968, 1948111, 4020652, 5445346, 216707, 6626092, 3622381, 664390, 5517270, 6492651, 454421, 1334328, 6784239, 997773, 1590507, 6927179, 1360413, 1793334, 3605038, 2224576, 6812092, 494591, 4409534, 3227074, 8096208, 7187822, 5455571, 7736845, 2717984, 453302, 4783573, 6915021, 3655651, 5708719, 2280412, 6426420, 7502522, 4192688, 4876799, 7315808, 1497718, 4195508, 1253808, 3574820, 6354055, 7470243, 4269035, 3607547, 8277164, 5598432, 6944489, 2777815, 6414652, 6311422, 2821703, 7883247, 4204426, 1561122, 1660760, 6598198, 1943695, 3760224, 42203, 875511, 6217844, 8329208, 722523, 3278755, 3099237, 6791053, 5801059, 1463478, 4994371, 6787400, 7111166, 2925247, 3988852, 6981638, 598465, 3448954, 600750, 5507658, 2565371, 5602143, 1966699, 5443082, 3338927, 7615728, 4206790, 5723474, 7881573, 1613901, 1753109, 4507331, 2361806, 4839642, 4719201, 5726954, 4625065, 8080577, 6186843, 871259, 7063791, 3927879, 6453773, 4103056, 2508618, 2448705, 6662443, 1717628, 7726937, 3141825, 3936773, 4319693, 4615508, 3842488, 4282003, 3931231, 5168789, 7641387, 623956, 1799841, 4901016, 3405720, 5463139, 1023159, 6256328, 3018211, 5664331, 7452483, 1503011, 4160288, 1255744, 8144043, 6568356, 2850367, 3805916, 1162447, 1660212, 2307528, 1040250, 2963164, 6054424, 2473204, 2717764, 8074390, 7884116, 2149769, 5803428, 8258696, 7239487, 1009747, 2125599, 3819518, 3629786, 4029308, 3444918, 6787020, 7416657, 162834, 3134579, 4569636, 6054726, 3737448, 4107907, 903076, 3955876, 5302491, 5535040, 640808, 7729042, 859112, 7861201, 6070387, 556930, 8334558, 5633950, 5126928, 4094150, 4459226, 6723073, 1063250, 719137, 586238, 5918024, 7324066, 2219801, 8220967, 926795, 7764031, 6695111, 2951606, 4005233]] +NTT(t1) * 2^d: [[5699223, 1455417, 8164889, 7877860, 1039371, 1726465, 4439460, 5860456, 3506343, 3103098, 2191464, 2894700, 6607186, 6688719, 8190929, 4459820, 517630, 7052152, 7280251, 8367428, 3536461, 6286710, 5358478, 5941843, 1570771, 741278, 8379249, 7951248, 3388923, 5448275, 6112297, 7318127, 7859784, 3741694, 5954136, 3451333, 8114791, 4583766, 4200611, 4935003, 7335535, 4891973, 3327060, 7779540, 343525, 3478646, 195573, 300450, 6601176, 6917376, 7523120, 1422393, 3917025, 2420895, 3067421, 2647481, 5903077, 7799998, 5375380, 7505147, 8173881, 5462465, 7210558, 7924959, 4079051, 4037637, 3709203, 4403617, 2754496, 3629630, 2983283, 2729818, 1680177, 2158600, 1611534, 1406835, 5335495, 1746894, 3187828, 919051, 1385639, 1975830, 1270649, 5778914, 4588707, 3904466, 7812261, 4195343, 6794117, 1081882, 4980024, 4634499, 6154051, 2053698, 6177760, 5371101, 1423661, 7344063, 2146763, 5293911, 3096310, 6157554, 1538568, 1674728, 8052121, 7042504, 5137382, 625935, 2164387, 2495287, 312105, 2843430, 6579531, 7231580, 1959907, 2102646, 4840959, 5560292, 2359666, 8197057, 1710143, 4029803, 4376779, 4401167, 3896364, 1770419, 6527360, 6484782, 8048159, 4928849, 3031610, 2267792, 329322, 2475569, 6663109, 2231656, 2033412, 5032467, 753168, 8276059, 8232023, 3552348, 3860736, 5764559, 6477218, 6505648, 2042439, 2277447, 1563003, 1559761, 5382792, 6561862, 5526466, 7330441, 2112772, 6398926, 4010679, 5074056, 6242002, 5974912, 7817162, 6724142, 3915933, 5903968, 6828949, 5898179, 6833298, 7801250, 6840175, 5745181, 3784644, 486376, 2979557, 4965612, 3645215, 2777615, 537817, 4439598, 957057, 7668715, 4555292, 106527, 1632909, 982416, 8083187, 3454168, 79143, 7752403, 504579, 4865711, 8167730, 5314456, 6040948, 7177321, 3856840, 5532724, 4891409, 4959171, 203387, 2862549, 7915592, 91494, 8241461, 6451698, 4318890, 7946302, 7431750, 3745472, 3760976, 8152116, 3745628, 2854734, 6701933, 3924851, 78658, 7517294, 1694741, 3858292, 250394, 2965008, 3377018, 1769878, 5533548, 2092882, 5774045, 3717925, 672718, 1152223, 3276264, 2222725, 3542979, 8365382, 5472771, 6713631, 2013456, 6238324, 6933544, 135445, 7336270, 6546633, 806650, 3167628, 7060488, 7842407, 6443102, 3487094, 6471300, 3158921, 8080850, 1217169, 6661661, 6130089, 6728410, 325513, 6878958, 1546465], +[507220, 2118991, 2714935, 434019, 1270108, 7548145, 1013827, 5267915, 6784708, 6814668, 1415254, 7200397, 3683874, 7711427, 8081585, 2117982, 3630057, 6028016, 7962099, 4168577, 7394419, 2686242, 4613108, 3804278, 7471499, 4581110, 7666552, 1053087, 6828764, 482018, 1304106, 2999874, 4438241, 644633, 4342424, 5054538, 3286301, 266512, 3908000, 2516560, 1241127, 7229917, 1620873, 7058560, 5001436, 4057956, 3261009, 4266163, 6334158, 1343956, 1120024, 3138769, 5190082, 1122450, 8353336, 7469895, 2464193, 2349919, 207754, 1314994, 6958089, 7527554, 4074860, 2113504, 3199980, 2520504, 7733405, 4168878, 3813698, 2692696, 6484164, 4615367, 5877797, 7367911, 707901, 5174276, 461395, 1399106, 7154110, 4348455, 6715222, 5465222, 2957519, 7540691, 3245568, 3740991, 2401936, 2564745, 4763014, 72366, 1668411, 1639520, 5614673, 5107541, 5196645, 115628, 5425817, 2587065, 2369724, 795197, 6115203, 5829268, 916133, 7487139, 6137931, 256485, 4459392, 7232293, 656038, 6602641, 8041381, 4887297, 1925986, 2123524, 402170, 5388584, 841366, 468455, 1229748, 2292017, 2477684, 7851519, 1916777, 2891503, 6511460, 7330938, 7074745, 3803990, 460594, 180018, 6521720, 161565, 7831534, 504057, 1188504, 8022570, 3461762, 70162, 3337764, 245314, 738416, 4116567, 5181289, 413783, 5296746, 6835545, 6964762, 5118527, 6612137, 2187582, 5985777, 7086957, 3266005, 3797835, 5946868, 1169446, 3786845, 2133714, 5548982, 3702553, 6755837, 1448157, 4428938, 1272188, 8324257, 1230680, 2529174, 288899, 443691, 1308143, 1433759, 4172058, 6376150, 4987499, 5105895, 1686574, 7137455, 2043373, 7637455, 2510540, 591095, 2502947, 4643527, 7332762, 7340306, 3516784, 554397, 3569381, 7497615, 1985845, 951278, 7083932, 897557, 183480, 7336865, 3324085, 352384, 492435, 5240252, 1770870, 2841771, 6491710, 5651572, 5487862, 2443075, 2075981, 1036128, 3913169, 2392193, 2859068, 4083977, 1608384, 3861869, 2990993, 8359657, 1420631, 2299744, 6265243, 7752746, 977081, 2864232, 4499386, 3104453, 4441088, 4503661, 3367403, 4250132, 2902338, 5537832, 8168036, 6793762, 599128, 1176284, 2679034, 7210294, 139677, 3852596, 1329884, 1114688, 1568339, 5674201, 7620354, 3449493, 7986603, 5472835, 1583484, 5756720, 4439913, 2951847, 5893479, 2082070, 2496004, 1757999, 3718115, 586320, 6712389], +[2471519, 1078049, 4873349, 5984318, 5984911, 3040476, 2317945, 4698483, 2702985, 1157204, 783040, 6112999, 1734110, 6767695, 2322975, 6751158, 4025716, 3872382, 7793888, 504544, 2127176, 3136744, 2186199, 2869766, 6790712, 6110888, 7196331, 5913132, 1049177, 8066726, 6660775, 4498749, 2576089, 8111138, 3457153, 497553, 7826364, 6021224, 2992720, 5550637, 2734214, 6140059, 522084, 3759090, 6760662, 6112229, 3099719, 1713830, 7179801, 7133815, 2691015, 5035098, 5889752, 373126, 4499400, 3307022, 2740935, 6064074, 6890913, 3793005, 7623003, 4774936, 5876132, 895265, 1259418, 4162965, 4759903, 2932125, 3710768, 4613596, 4565427, 592287, 7629925, 5036843, 5151915, 208831, 1224175, 4959433, 1365702, 8334963, 6006646, 1615188, 7431879, 5043466, 4718475, 58641, 3808992, 6798200, 1150977, 4467324, 8128176, 1034457, 397796, 8245362, 1994821, 391897, 8183258, 6939384, 3293546, 6390935, 3882210, 2528042, 7351154, 1367223, 2569534, 6331324, 8199159, 22631, 3454381, 5868499, 4244821, 696885, 5104635, 2289901, 5628743, 7885422, 166395, 3111079, 2179186, 1077094, 3602798, 949971, 3400685, 4379166, 247538, 5555857, 1001349, 2212521, 6058936, 2645277, 5647146, 4113296, 4465819, 6480663, 2419142, 510058, 126509, 4330058, 2621374, 7554319, 7047433, 1651330, 4953216, 6516434, 4647896, 1995500, 4386196, 7623392, 1436279, 2599840, 4597845, 5070162, 6563172, 1850866, 6801467, 5247018, 7326647, 439286, 1336895, 7519632, 1406717, 5826155, 7433459, 7833487, 6382598, 2639706, 3133991, 5141225, 4889285, 5752616, 967330, 4039093, 8074184, 5065780, 7529823, 559557, 3243038, 6095, 815791, 3885577, 8371833, 5469179, 3998440, 7140790, 7031412, 3678603, 3316380, 6279973, 2423402, 5637762, 3639230, 5277805, 4070880, 4765843, 7146994, 4535314, 4002513, 1384935, 4349251, 2014003, 3870577, 2695774, 7562845, 765050, 2365967, 8270583, 4775925, 940637, 3185247, 6168538, 1618541, 7378695, 6937129, 3134094, 2367394, 6108418, 4801362, 4499739, 1434495, 5482367, 1266915, 3639977, 2373684, 7933751, 2481074, 1459878, 3084156, 2079968, 5074010, 8037543, 2802423, 7679800, 8218045, 8279417, 246507, 6353731, 1560480, 459273, 4011820, 1023994, 344127, 675805, 2252275, 6401634, 2951107, 4287252, 4091107, 5920505, 4626606, 5732812, 8195431, 2432793, 5446300, 3405074, 6323899, 6558711], +[5851751, 6248985, 6686331, 1443399, 7296738, 4018067, 2517004, 6643239, 7360694, 997615, 270850, 8140274, 6023690, 4560996, 5616972, 8378591, 2146042, 2118514, 4132833, 3897084, 7598211, 1365559, 1995659, 2691306, 8067806, 2950206, 1440985, 3680816, 5194745, 4792326, 8110768, 2753322, 5417772, 2112931, 6660315, 2243992, 5388111, 4349058, 7372825, 7815186, 2089480, 5479131, 7763636, 299565, 6089727, 7736424, 8314127, 3993237, 7723160, 54701, 1979067, 8072695, 5619833, 4545060, 5274772, 4556474, 3383305, 5411965, 596093, 2661680, 7720045, 4684761, 138457, 780297, 3009923, 5899548, 2186443, 5757308, 3802274, 6962253, 4372456, 1059200, 4391514, 6402874, 6241683, 6159932, 2541043, 4079381, 2973059, 5370494, 4816093, 1127357, 1713594, 1937266, 6124978, 6371858, 6821754, 4756042, 310259, 7968370, 4686235, 4973626, 175414, 7345333, 2749310, 5240062, 6190883, 3434125, 7036143, 7921069, 5785875, 8091122, 5877196, 4803033, 3014738, 7488849, 1320371, 7664956, 7468113, 3544523, 7133933, 7008153, 5966479, 4871324, 7848312, 6506451, 5466628, 3889260, 1298307, 4591979, 7591381, 7144223, 146034, 392421, 3567759, 2627997, 3415647, 4658965, 4833106, 3033871, 8093109, 4125445, 8222319, 2997711, 3806676, 6357234, 2669841, 6728316, 3960038, 1575245, 343553, 6527180, 6864842, 3741462, 8193684, 2261106, 6112912, 6893813, 3084354, 8004977, 4099815, 6626811, 7975210, 3705369, 6960780, 5347030, 5591966, 2729331, 7688439, 6118106, 6105173, 3846440, 6390518, 7815184, 2694289, 3328890, 8014375, 6407885, 1533483, 4198729, 1477821, 6292908, 7844058, 8360686, 1355243, 5378328, 8220114, 6394563, 6607678, 1100775, 2131609, 2821568, 1900840, 4281285, 4476333, 2441817, 2322614, 5415775, 5235530, 2585105, 2460481, 4195474, 5439495, 4603624, 735268, 7267546, 4697461, 855225, 2705354, 5244177, 4410228, 7107428, 6821377, 6688325, 1835360, 2200903, 3718892, 5745724, 7728283, 5931346, 331306, 6739251, 2705636, 6078543, 98487, 2212231, 5407185, 7909207, 4962529, 5398702, 6147711, 2696755, 6880922, 603941, 1717152, 5611631, 6490209, 3453456, 2060315, 5934591, 229634, 3423256, 6035737, 5705747, 2342288, 7568331, 5224191, 3689227, 6851817, 7408189, 2149440, 873240, 2840441, 8309526, 4084030, 288051, 4707883, 5562347, 1672810, 8344179, 1436140, 3443160, 1228202, 3223647, 6010183, 7965876], +[8325859, 3573398, 8139931, 5392248, 6351555, 1867569, 4833543, 1330958, 5198564, 4573208, 7764565, 2377632, 452799, 6030547, 353546, 3738360, 4424844, 7915247, 1979457, 7748700, 7686665, 2738123, 651356, 4412770, 5739709, 6846189, 1531347, 1850083, 3375967, 2428044, 7865030, 3986540, 8060902, 2919366, 2350659, 7548331, 2286547, 1385257, 6824713, 6530263, 4450265, 5714592, 4255919, 1894721, 1330715, 1541090, 7442571, 3169759, 6319712, 2590209, 7462426, 6643070, 6589458, 506299, 5554146, 8153739, 2598645, 736704, 611523, 4763309, 6402068, 2299999, 7669914, 3347316, 6342727, 3565299, 8348376, 630464, 6382340, 8135996, 4298851, 1542617, 6783308, 6881748, 3486990, 7543203, 1317244, 122321, 3161919, 7130136, 6453905, 2499456, 7305499, 2009503, 5764223, 2105350, 6778377, 6803545, 5825836, 827303, 2067915, 7049723, 3920884, 4538433, 8103139, 4453133, 5954137, 222248, 7211004, 7106486, 6352995, 1032237, 6434957, 287630, 882708, 4002065, 5466516, 7535284, 323430, 4854187, 4750337, 171878, 137625, 3218468, 3038107, 2887754, 4296786, 5621416, 4442940, 4667794, 2911821, 7976334, 4078180, 2183369, 1095462, 4055373, 5129823, 3026899, 7544294, 8200729, 3554044, 6434035, 6710692, 2895513, 7807743, 691188, 7653085, 2403520, 4720607, 2796471, 783728, 1786095, 4180633, 52734, 908169, 1945353, 6369898, 5037784, 3040747, 8188774, 2687163, 4105304, 5520706, 7473140, 485283, 5620690, 3255964, 5895476, 766607, 2742052, 3891144, 1784465, 3934637, 7475450, 378575, 6096711, 6686462, 3941896, 6965202, 468953, 4913668, 1115456, 7214830, 2877786, 8031118, 7997451, 5089082, 1301110, 3935697, 3494495, 4895605, 2571982, 6160703, 3962287, 6780869, 4609816, 1326908, 7129830, 2125955, 3488762, 7399442, 3225566, 8282331, 2867914, 7015269, 2066998, 2443475, 1739661, 1124159, 8191842, 7543653, 7603394, 4941714, 5199028, 7842606, 2881317, 152044, 8303753, 8118951, 8306620, 2437103, 3284790, 7147456, 2717504, 4769303, 567801, 804053, 6576600, 5525992, 3836856, 1970756, 2283912, 6177931, 4254691, 254880, 7180957, 95144, 1815261, 794858, 7426853, 5177510, 2516767, 4104888, 5572861, 4514389, 4064585, 1751133, 112220, 3316248, 3376968, 7797205, 6759748, 6702934, 2311338, 170374, 2133024, 3669160, 5478709, 6233837, 6290466, 6515132, 1763465, 3342498, 2191305, 942261, 6343200], +[772411, 4778555, 4565112, 3514677, 7105960, 1667058, 7430013, 7819448, 4210151, 3765940, 4002390, 289191, 6646917, 4937308, 1603724, 4448729, 922931, 4818660, 7963198, 4126482, 7141846, 1053176, 1650522, 6656308, 3473793, 3144025, 4924613, 7183816, 3029355, 3513109, 5398528, 5931253, 7508642, 688011, 6298052, 3809654, 4289748, 1943034, 3579609, 7344720, 92729, 1130566, 7147772, 1747431, 7654561, 3176266, 6251091, 4875249, 5979007, 801930, 7440141, 5752191, 2022116, 39201, 5788923, 813218, 7357372, 4378971, 8292135, 3237684, 1553914, 815461, 4689386, 3844914, 2611344, 2142374, 7695158, 6995757, 984755, 7868972, 3792247, 1886959, 5670710, 1711684, 2751208, 5940761, 2849841, 6265326, 3646861, 6929103, 121127, 8262205, 4700034, 7841278, 3948061, 3305258, 4354990, 1515798, 1827982, 7654188, 7520886, 7337376, 925253, 200124, 4613529, 3863051, 3099188, 1185611, 7833463, 7062363, 3551230, 1289569, 2737169, 375368, 1511419, 5184311, 3748442, 1648573, 2425722, 454579, 3674682, 573541, 4713120, 2983292, 3028325, 3614594, 4376551, 2200890, 66022, 7524339, 195082, 3529129, 7128783, 8337557, 5722533, 2129879, 6929577, 403522, 7897139, 2334014, 324475, 4666411, 3098130, 5310938, 4815466, 691438, 6694422, 2393305, 4011221, 1429701, 5612888, 81335, 3445461, 2039221, 6949625, 5813813, 1591964, 4036734, 5909304, 7189313, 4219628, 1748976, 6646310, 3113448, 5159383, 5814607, 8318667, 5912316, 6974854, 830971, 1632802, 667223, 7553318, 6236257, 5618861, 8176904, 4763905, 5637980, 6762582, 1816172, 5453479, 5457552, 88433, 1778303, 1569793, 2199800, 4804482, 6180449, 815444, 6123431, 7082238, 4852804, 4907731, 7773599, 3143969, 6925642, 1250047, 2607908, 1301528, 5589021, 2954362, 8211040, 7783308, 1833539, 6303774, 4283189, 7880936, 5695212, 2364702, 2912632, 2612112, 7420330, 5429041, 7224328, 4551856, 2533602, 5019279, 5535136, 7151916, 7184870, 3651531, 7956952, 131191, 6046812, 375845, 6780899, 5394795, 1487396, 6008990, 3904217, 3581462, 7611311, 1449825, 873480, 7515790, 5007586, 3510715, 4599889, 6470798, 7844070, 2304961, 4991710, 3358094, 2261629, 6675641, 3834364, 7596243, 3423712, 1441837, 2361981, 5524589, 847966, 8122106, 7693909, 2890737, 8117570, 482755, 8120680, 3343369, 7485319, 1130652, 8027255, 3957339, 4900464, 2053307, 1536181]] +NTT(c): [2690945, 121052, 7150318, 8287206, 2288451, 4023453, 386463, 4521262, 5904397, 5688061, 1610498, 2897472, 5173858, 8251051, 8034129, 7307004, 6477731, 2295177, 528991, 4283125, 470886, 3547028, 2050126, 7303776, 5180635, 769698, 7387421, 2869360, 5073979, 3058669, 6532114, 2177912, 6060654, 3407581, 1478148, 5785466, 117003, 773842, 8241771, 6381157, 1795475, 5643469, 4726601, 4005097, 2571179, 5789247, 1044612, 4900179, 7487018, 7703584, 4283361, 330233, 3726039, 431351, 3077645, 1613222, 2973554, 5349121, 2336354, 1505297, 3779321, 15000, 3830462, 6224987, 2818120, 2170426, 7175285, 7794091, 8005785, 5475062, 709647, 7834526, 6619698, 5130004, 6829708, 369152, 6387976, 3150488, 3277421, 4986217, 3130106, 1250471, 948833, 5817332, 2511825, 740837, 1596072, 775148, 5088015, 88353, 7540862, 813331, 3153995, 3975035, 2679818, 7173989, 3351079, 6264111, 6604952, 6952938, 3139300, 6973618, 3349753, 775931, 3575628, 5517357, 8116002, 4032702, 2506165, 7738504, 7317489, 509466, 84119, 6325618, 2082735, 5475407, 3827229, 8013830, 4599652, 3848224, 6744686, 1575503, 7160724, 1515678, 2119631, 2311035, 5615841, 134650, 1247324, 1340879, 4982117, 1471381, 6021607, 4191164, 2735447, 779278, 7132637, 8113556, 842804, 4248715, 511975, 6538824, 2975967, 1497099, 7209604, 4670012, 379903, 5795198, 3691658, 3108828, 1317681, 2245383, 7237183, 7668045, 522328, 7316344, 7458823, 4165622, 7067295, 5396050, 5275326, 205471, 5327072, 5003556, 3028175, 6840495, 3822188, 7103192, 7395788, 4827882, 6435889, 3219844, 7235969, 791555, 1080428, 880785, 3100269, 7379364, 1530478, 1139597, 6950901, 4803728, 4529523, 2135258, 3640627, 3760935, 7250092, 1969467, 1098969, 731816, 5978393, 792890, 3431781, 4972484, 4418752, 6878239, 261186, 1188342, 695676, 7978030, 7724988, 6231179, 7222462, 5897322, 2494301, 3919195, 6645882, 7884412, 2018759, 7087781, 7488498, 2347667, 798029, 7441875, 8087807, 4318891, 8366135, 1123836, 3515485, 7836306, 2153853, 7144330, 7935307, 3785902, 3939509, 1899969, 7418347, 3990633, 2129103, 6268676, 3761213, 3695313, 7668190, 3939129, 336075, 3155205, 521333, 2933008, 6947827, 5156973, 4925548, 848825, 6994707, 6023374, 7366844, 4854418, 236585, 6158594, 4342136, 4993509, 3905646, 2503545, 6571886, 3694025, 7822459, 7341964] +NTT(c) * (NTT(t1) * 2^d): [[6819480, 8012510, 6285477, 5689914, 2890547, 7501519, 6159655, 7652394, 1400460, 2698837, 2812858, 6495626, 7735135, 1993930, 7135851, 641420, 4392911, 8057521, 146059, 4077838, 5692793, 3258426, 1639608, 1429672, 5182577, 4643850, 3321782, 3253391, 7415252, 2261058, 3482782, 7582710, 1374024, 8110908, 5427979, 2682796, 3927775, 6969135, 7547126, 3020907, 5781921, 6447067, 230900, 158153, 1835843, 3858955, 97050, 3882824, 8155267, 4356433, 1825009, 7115136, 5644289, 5238443, 2098466, 4015153, 7982895, 3526376, 6593741, 2714299, 2958158, 1637991, 709629, 648309, 4813560, 7027296, 1676336, 1054056, 301823, 8357045, 127727, 5912268, 1155405, 3403527, 3310960, 1512430, 536209, 6273283, 5318522, 8096127, 4313971, 3575990, 1771746, 2911122, 5678491, 4907156, 1899087, 7679748, 2755281, 484044, 2752814, 4226241, 4172130, 6382224, 1696273, 732593, 5070876, 3255254, 3266392, 2064794, 1434708, 2363655, 405376, 5911748, 5780553, 4191420, 6071251, 2584719, 2238435, 317596, 2043922, 406177, 4068675, 8116952, 8252034, 1741079, 7627760, 4541838, 5151609, 3997926, 7372982, 4698794, 7300570, 7107562, 3250686, 4705508, 1518400, 3488236, 3384309, 522480, 2908861, 5706364, 6346578, 6318794, 4211006, 1429779, 4225560, 1028580, 6697824, 3702666, 2842372, 571095, 5311384, 3989826, 4293823, 3901429, 2654221, 4609542, 4576968, 2068070, 3295734, 5701685, 2827758, 4524988, 1521405, 5198979, 7117609, 5990035, 6979108, 1506042, 6905390, 3873428, 6845946, 7052297, 3822219, 2244647, 1786751, 3923819, 4777813, 4292560, 764688, 6320554, 1725679, 5346988, 7002453, 3253799, 1226036, 4705495, 258735, 3293166, 6144506, 1709802, 2621134, 1063641, 1021081, 6294947, 3640000, 4516075, 1246995, 7879961, 677751, 4785236, 3167132, 1825820, 3452480, 8200206, 6501092, 6526329, 4874401, 2290519, 6485724, 4103333, 788580, 2080647, 4613240, 2541498, 1236895, 6381617, 5574707, 2087198, 6174416, 2863589, 5043159, 8306776, 4888119, 1031262, 6733751, 1029393, 2490661, 3847948, 1784378, 1431298, 527688, 4908157, 3424141, 4950855, 1037816, 7351352, 4758323, 1764973, 4852236, 3133755, 2381938, 2911758, 3834952, 5103516, 1931627, 4361509, 5539983, 6422814, 4072832, 5607654, 4423923, 4764824, 3049642, 6452984, 2509187, 2382849, 5769543, 5024686, 3987713, 4958826, 3407047, 5787414, 2675317, 8091065], +[7747361, 294996, 7628437, 5308267, 8275015, 6227976, 5368317, 1110961, 1140611, 2833636, 8203334, 1139888, 7170282, 8374398, 546500, 3632862, 4504537, 7547277, 6834164, 7662123, 7588823, 1817707, 1219602, 3334382, 7920613, 2371613, 7517595, 658715, 3437116, 272900, 885839, 4685718, 1863880, 6160818, 7981695, 4393649, 5163526, 4497151, 7293135, 1024103, 957106, 790420, 1949196, 3706698, 4934884, 5078878, 470514, 3756260, 4819127, 1831083, 5224427, 1606949, 7186423, 8098609, 5923237, 3467791, 1728389, 4102474, 1516693, 2027818, 36188, 3951759, 2679484, 950310, 3935993, 7185861, 4107070, 3044579, 2083109, 7188675, 6826667, 1259883, 4086014, 5865742, 2371021, 4550061, 4288454, 1973404, 6353115, 5796481, 5394565, 5642734, 612460, 5279519, 5172757, 1984648, 7517074, 4154018, 6307035, 7875444, 5241526, 5629331, 8166769, 4602225, 5425864, 3564598, 4314169, 5809214, 1191939, 464287, 8154733, 6760133, 2744336, 5437418, 3450222, 2095525, 2916637, 4354780, 2223874, 7762181, 4545991, 5958532, 1794890, 8347297, 7616634, 7834298, 546317, 1992079, 111044, 7065316, 3797115, 1237450, 5441029, 6511799, 7725203, 2163622, 7884415, 4546877, 7223855, 1204971, 5918030, 4762643, 3326066, 8132903, 7491142, 4461626, 945950, 6730513, 1134615, 5189637, 1540313, 1572807, 6332738, 2071294, 1125085, 4510581, 1679510, 5962664, 7292242, 7213392, 6218166, 4220340, 3030010, 3846741, 5727237, 7065521, 7224550, 851159, 5685935, 3955557, 2429885, 7561362, 955274, 842340, 1494181, 4673837, 8275289, 735235, 112571, 2368173, 4226391, 3249636, 563797, 7789334, 8346138, 4743587, 309830, 1031259, 1504392, 4912333, 925256, 131929, 1271446, 4511488, 1710185, 2902790, 5272567, 7756566, 3703701, 8271716, 3532131, 5479238, 5171084, 506781, 1260891, 3547316, 4027930, 1814911, 2633684, 3410403, 2075159, 7990474, 1580040, 2185373, 2856944, 4608760, 5286421, 3469857, 3950152, 4532501, 5088855, 2313272, 1865285, 7349867, 7161692, 4122428, 6290832, 4975003, 4191082, 4754072, 8037184, 6058217, 7123466, 2259697, 7070498, 7375610, 6667315, 2104687, 4917388, 7269149, 6196104, 1782753, 682605, 3653302, 1980500, 199589, 1170580, 4263843, 5957847, 94066, 1159237, 5926770, 162179, 4784248, 5929100, 6021564, 1752028, 5355139, 1289963, 7167676, 8057108, 398130, 433659, 1874486, 4403869, 3530120], +[6003421, 134024, 3298140, 4670839, 1396842, 7513299, 444571, 6134764, 6379002, 7636717, 7584177, 5837769, 6358265, 913037, 1100196, 469322, 2523573, 1134766, 7996769, 409878, 4816845, 633871, 2312802, 1164388, 5835735, 4089323, 3395722, 4361907, 1393956, 5385468, 3853187, 7081125, 187870, 6994482, 6636052, 3290202, 5042753, 6072693, 2549384, 5674023, 6505135, 1738909, 1927498, 376226, 1708673, 7214524, 3284819, 7617368, 2801120, 987906, 3931692, 5361281, 8012359, 2364741, 6274710, 3943518, 2342559, 5647912, 1432919, 4184551, 5159630, 4996318, 365627, 2159887, 650490, 2221621, 210134, 2761881, 4656252, 7568240, 5883737, 725560, 6512439, 3457118, 5992118, 7305746, 7145841, 329330, 8075259, 4870247, 6666644, 6593629, 2347144, 3071975, 3865876, 7721206, 2814280, 4924000, 3123557, 597506, 5435582, 3981552, 5985533, 1161095, 6544116, 2471973, 8311302, 7896547, 2779949, 4823752, 7681159, 887234, 2155514, 2102000, 3528159, 7185815, 8109664, 1337832, 1444104, 7066666, 1993159, 2847205, 985319, 7785172, 7460396, 3193588, 3881625, 1451740, 7305835, 3395775, 1424066, 6727549, 3519858, 6355127, 8070942, 629206, 6115003, 508717, 4617081, 1644067, 6135682, 5750214, 6425687, 3335542, 6050764, 2180231, 6515009, 1809690, 300237, 6142619, 4774995, 7952270, 6964394, 2830262, 6719502, 2002834, 424376, 5011882, 2926767, 4113955, 4613967, 2664643, 5754779, 2653292, 3802204, 7990260, 246169, 1852274, 6756136, 7223000, 6369991, 5227640, 3142421, 5147019, 2058222, 5064169, 2905852, 8161393, 7125802, 6269219, 1086244, 7055455, 7085861, 6702991, 7714822, 5468892, 2207310, 7905958, 2131770, 5820928, 2034856, 232235, 6200416, 6099433, 2030877, 7761015, 6822268, 3057026, 5812857, 7820854, 2986593, 7860002, 3987855, 1914748, 5467437, 2705841, 2002587, 4996059, 3784996, 2839990, 6280456, 35657, 1018021, 6237061, 2865586, 7635992, 7993374, 2300456, 2366875, 7555154, 3162241, 2935966, 2072294, 5613967, 2110880, 5286770, 3900227, 7170162, 4584074, 1620830, 1094125, 311463, 2207618, 361196, 7299311, 6046790, 4860517, 4922094, 3303751, 1435251, 6815681, 5017774, 4348261, 8268075, 4417980, 347884, 739565, 8295855, 5145217, 7528454, 7675010, 635475, 1387222, 5819821, 1201580, 1332362, 6668597, 7363435, 1207190, 5898251, 2679448, 4609763, 3409812, 814623, 3974604, 2629323], +[3595031, 2172132, 2242460, 6930746, 3468245, 518574, 5535245, 7259602, 2508700, 5678394, 2678450, 1644180, 1805562, 2211183, 4785764, 7414977, 5169017, 4761493, 6937462, 2347750, 6233468, 4493077, 7682383, 696689, 477682, 1487051, 5198771, 6445587, 6535291, 1881896, 1276240, 2965152, 5118941, 6927280, 2904202, 8044305, 8282508, 458223, 5429459, 3159529, 6487529, 5916786, 1209575, 4483000, 8185341, 3469604, 56191, 6349451, 2068604, 1240373, 6815760, 977316, 4755271, 1423080, 2292900, 6261856, 919980, 1810884, 1426611, 214179, 5838941, 1618455, 7967706, 7085854, 1334040, 1048561, 1526830, 6118860, 7866407, 4328502, 606280, 7504132, 3128152, 1353757, 4034656, 488467, 8207498, 985068, 4872437, 7596495, 3127084, 7009075, 4692381, 2886056, 2771246, 3638220, 5175548, 7201746, 56429, 7323274, 2343565, 2063557, 4889841, 4684882, 6820030, 1664997, 5088824, 5888490, 2197478, 656361, 7287955, 1725934, 5022443, 476321, 2065870, 4703216, 2274255, 2480806, 2913865, 7823001, 3958703, 6056784, 7833705, 3522175, 1017322, 4608128, 7717466, 8188590, 941219, 8128679, 7764397, 6696469, 735356, 540697, 3504052, 4281991, 3503252, 5142298, 4519811, 6751218, 6674232, 6128522, 2967297, 2400455, 7387494, 2609170, 782443, 4347425, 1274634, 6816052, 2355179, 224125, 5721707, 2382610, 1105233, 8070353, 7872249, 4713412, 8106036, 4193355, 5259556, 5065518, 2108929, 3958473, 8282475, 2456450, 6739929, 1492496, 4822091, 661925, 5669115, 8267638, 3935070, 6258527, 6861391, 3088984, 4137003, 4323075, 4658917, 4881945, 5817063, 1463335, 2961250, 2925583, 7645347, 2592392, 1447844, 1246441, 5203674, 408196, 732458, 2911805, 540609, 4248752, 7698004, 2657785, 7803206, 6024758, 931799, 725849, 3828200, 1514629, 2994354, 2429836, 4980891, 4749878, 1239112, 6617360, 940695, 350101, 7245079, 1594392, 5493894, 2556786, 3410438, 5944993, 1096769, 3815736, 3466075, 4536904, 3767623, 2216862, 3453479, 968444, 1972993, 5220793, 126485, 4169087, 6203908, 2242501, 5790475, 4389903, 7048736, 7128421, 4493049, 6454525, 3823645, 5427403, 2514216, 7861379, 8229605, 5969721, 3848021, 6850804, 3490373, 6309703, 8206607, 6047760, 3829398, 6913163, 4727846, 5200601, 2954280, 4381167, 2535875, 5480783, 6797753, 168817, 1315333, 3565139, 7826672, 695583, 4895422, 3649272, 2556653, 4465034], +[3948113, 3370824, 1248431, 7061664, 875246, 1463966, 7339943, 1119644, 2208364, 5788360, 2318071, 351454, 5677860, 2036162, 774705, 7610264, 3893471, 879876, 6974988, 3698246, 7311222, 7980889, 1084825, 6617568, 398734, 716743, 5219038, 4149481, 4934276, 8215542, 6098705, 3401638, 1473797, 2113796, 446328, 7957736, 4806750, 5767673, 5344455, 7191414, 5820974, 7090641, 4870782, 6756101, 92727, 623115, 2322382, 4293223, 5018901, 2406218, 4808649, 2416386, 508610, 7293346, 2263764, 5939696, 5837395, 3731691, 7195314, 2147160, 7757197, 6188628, 2439198, 5179845, 7915608, 382501, 5053293, 2758606, 4736224, 6759543, 2178006, 5465498, 2856604, 8210707, 6445834, 2176015, 6141371, 5747320, 1002877, 3068489, 944997, 3962792, 4219457, 1867692, 7072747, 8248412, 2985241, 8164062, 3766524, 704885, 709980, 2652168, 3511368, 6909259, 3478318, 7685181, 7856446, 6128237, 3540295, 1163034, 6175224, 297980, 2917828, 2148403, 2790084, 6446018, 354769, 3587445, 6633293, 7387541, 2079100, 7400332, 3521498, 682614, 4970131, 2397383, 652315, 6513108, 4166117, 5393801, 3843297, 1159490, 1868274, 152971, 4695915, 3675777, 259453, 7130389, 1469547, 5503415, 6788111, 3929536, 2688926, 5315270, 6833281, 1440840, 1444362, 6225209, 2154197, 5039679, 3157257, 3340663, 1236000, 4490526, 2857146, 5664135, 5766557, 4873745, 5405783, 3861377, 5261916, 7175618, 847836, 4211170, 2806242, 2588769, 6843987, 6952175, 7172986, 3330242, 1050225, 4183848, 1242504, 3568286, 587527, 4442720, 3516073, 6622073, 7893560, 4671243, 8205923, 7375591, 835001, 2850375, 2898789, 1075940, 5391753, 4341310, 5911080, 523034, 6472848, 4013302, 451405, 4750194, 1387113, 4397951, 5945390, 6348754, 7326216, 4291074, 3645510, 126514, 6538473, 2564488, 7222972, 4239775, 7565549, 5825251, 6682878, 3833007, 8142442, 8141216, 379402, 8359743, 7594913, 7261072, 6083450, 3775391, 3724051, 6752598, 5710386, 404866, 6126101, 4470612, 3190095, 1386568, 6066761, 3249037, 6283841, 3645522, 3990700, 5522863, 7362800, 2878505, 2391065, 260572, 4106811, 7995413, 1523811, 76496, 469641, 7003985, 5350295, 980747, 7730746, 4877740, 2694394, 1280085, 1153312, 7251014, 639084, 6227876, 3563389, 1668992, 386400, 6647759, 7864906, 1634333, 7775022, 2824960, 3881492, 1362404, 1422504, 6868155, 3397457, 1637821], +[4494055, 3736852, 1736855, 703517, 3567399, 4102405, 935224, 3480087, 7768531, 5863235, 1452585, 6831407, 7038740, 2075344, 3097244, 5672863, 1446348, 7766252, 1566083, 5806586, 996792, 6839842, 332848, 833203, 2535658, 3780696, 3156458, 2940791, 475914, 8251602, 2861815, 4711596, 7821804, 6414390, 8080327, 1272509, 1830697, 3659322, 6586160, 2532277, 7237153, 1016342, 4036678, 1952018, 4781259, 3136557, 2408211, 7331023, 5399339, 1780149, 3058394, 7690781, 2131338, 6089462, 2970189, 5549965, 3438653, 3100726, 819376, 2603713, 3371721, 4886597, 4502285, 1670782, 1933904, 6619708, 4497174, 881868, 1982014, 5930122, 3678101, 5020086, 2538314, 3497055, 4821139, 6001610, 3106052, 2437304, 5632992, 7344532, 1903965, 1497611, 638359, 3744268, 5951047, 138550, 511557, 8183453, 3538705, 4342132, 2601669, 3652922, 6147578, 5581449, 6748464, 7849378, 7687428, 6318085, 102901, 6985196, 8168904, 3151278, 1818314, 6655190, 965759, 7259141, 7627160, 2067312, 4519326, 5950313, 5605630, 8019984, 2173844, 106767, 4450088, 4513801, 6123441, 6984245, 5433932, 3919313, 7843584, 6440314, 7326391, 3033504, 2007446, 3750649, 6063470, 3993889, 7527155, 5531741, 6735109, 1215908, 7967874, 4448974, 3637281, 3510749, 6381173, 194382, 4505467, 6049688, 4964083, 5606803, 3949615, 5230532, 3178515, 3174168, 2345853, 6921176, 7230413, 67840, 1897346, 7289106, 1875684, 2843313, 7889351, 3372202, 5398070, 3555948, 6179274, 2187866, 2642512, 8115747, 5074456, 841266, 8067320, 71854, 6248224, 4866754, 834021, 1408944, 2972216, 5436272, 3326125, 7889760, 2758110, 6813017, 1038198, 3163291, 7402592, 4448079, 8110884, 4277339, 4198955, 44160, 2987878, 251748, 4072176, 7154493, 2872740, 5431950, 4882742, 7233312, 7102460, 3317402, 706282, 3148610, 506973, 2457644, 7332286, 4445283, 6574133, 4048715, 1402229, 493773, 2205643, 740851, 6806440, 2999188, 2874219, 7914590, 3200304, 5682138, 6053375, 6223045, 206841, 1446902, 1091708, 6054985, 5458667, 7728409, 3476262, 7423742, 2405335, 5511177, 6261090, 4266402, 5883460, 3442937, 526627, 4212160, 75780, 4506955, 3894377, 4187206, 2994422, 8212161, 6098569, 7058782, 2012245, 4307357, 3660339, 5865071, 8145323, 4439816, 5179073, 7943123, 4268799, 5745514, 48752, 7107651, 8190131, 2175461, 6423995, 6711321, 2599713, 2510042]] +wPrimeApprox: [[4758519, 960760, 4935710, 3304526, 5646329, 3801955, 7832341, 837485, 3649919, 4113435, 3451213, 365211, 7283435, 4186002, 642582, 595189, 7466745, 3706267, 7975728, 7353938, 2276138, 5658000, 8233178, 2183980, 4608632, 5474365, 2425574, 6559285, 2804609, 5597201, 2641918, 5544548, 1014922, 1578291, 3510017, 8336297, 1770798, 6225246, 3175092, 363064, 5775612, 8357939, 7012368, 1857795, 4816431, 2981862, 6365635, 345219, 861927, 3327281, 6291776, 7273761, 125994, 2939614, 515722, 1185805, 8103298, 4642804, 1191088, 7255921, 3401689, 4681503, 2685603, 8064073, 4874160, 1040989, 5526614, 1774182, 3827569, 2475072, 1808512, 5873015, 5537521, 5308641, 3446953, 3251726, 577868, 3998185, 8001698, 1193419, 3653031, 306323, 3670718, 2687952, 4437003, 3514480, 294569, 4598149, 1540863, 904047, 4382683, 5315922, 4359326, 7510500, 2976706, 207667, 820857, 1419026, 4693582, 1067202, 6825895, 2913886, 2198084, 6312548, 4847365, 4885859, 5385714, 7127874, 1706984, 4170363, 5404789, 2580613, 6077839, 695831, 4627762, 6339919, 634344, 2564633, 1572647, 6253418, 6289916, 4440931, 6240918, 1500492, 1427383, 7483141, 941869, 1048032, 7519468, 5821506, 2914323, 5818567, 399727, 6020921, 7171577, 5042607, 4988125, 6897478, 1043154, 4093185, 6875213, 7985618, 7812975, 523656, 4673218, 6904002, 1478383, 7540191, 6008615, 6877268, 4976149, 4639864, 5437728, 2316032, 7920620, 3135552, 1859893, 2962102, 4942708, 2604530, 6267321, 1608507, 5873358, 4484699, 861117, 2549994, 3381865, 1967159, 7158810, 4583027, 5345549, 6940002, 63549, 2154488, 2470260, 6776477, 7522593, 8356707, 1673423, 5906136, 6653428, 5031579, 7811789, 4336365, 5782332, 665530, 4911530, 1190227, 1171577, 8295892, 8181078, 5220968, 5641229, 1541547, 4536269, 6770939, 5465591, 2954758, 2469404, 2153593, 6164668, 5415927, 293027, 7504671, 1184865, 5613926, 3056131, 2035570, 6610621, 3963412, 7716911, 431402, 579731, 4547383, 501607, 1013302, 2661948, 1291077, 1087192, 5989300, 1325579, 7460582, 3655582, 1991023, 7458991, 7892419, 3281032, 6199113, 397945, 7238619, 1901786, 5106678, 7010865, 5619314, 7930764, 2074435, 5099130, 7326247, 4602993, 2668726, 6155015, 4849298, 3590550, 1361121, 3948653, 5236722, 3584499, 7789496, 1741671, 4857887, 726649, 8266945, 94022, 5081514, 607476, 2940254], +[4575140, 3628620, 6991943, 2364461, 7491971, 7649378, 7959176, 1450077, 4923388, 5154437, 7829539, 5750299, 2310686, 2331453, 2939618, 6441119, 976930, 7833676, 6325703, 1699575, 7766339, 4775427, 4339967, 3672552, 3269056, 581036, 4950590, 644466, 645566, 2656323, 1381262, 8032694, 1437953, 1274493, 4434493, 2171996, 6811451, 154955, 6020193, 3302501, 8142298, 615458, 4698720, 6964032, 188769, 6346477, 2745558, 2131857, 6872845, 2142070, 3276001, 5976172, 6154364, 325907, 1172807, 974710, 7286124, 3210797, 3421332, 6758637, 2493168, 5768980, 7000039, 3717756, 3110317, 2393031, 3152865, 6480557, 2770809, 5221236, 8334899, 6135994, 2638588, 3730399, 3780066, 1346048, 6978182, 468888, 6909885, 6712967, 688959, 1621861, 989666, 3335439, 1419116, 3325788, 6950816, 2580969, 7954552, 6055510, 5768186, 56088, 5610046, 3762737, 6282085, 5158209, 3423314, 4478078, 4170019, 5111643, 6479548, 2801004, 2998930, 5231146, 7362542, 5834718, 1985022, 6510420, 3693928, 5248807, 3060673, 339139, 3552956, 7133988, 889992, 4296378, 5225499, 2396168, 4334119, 3710497, 8373796, 3457465, 3174302, 2779972, 2508176, 6367593, 5551025, 2735778, 446010, 7617069, 1092561, 2043448, 5717631, 3918093, 1109893, 4242492, 7284596, 2923966, 2945424, 5845761, 132532, 4419447, 2375873, 2986980, 4695923, 7861533, 4320792, 5017218, 1378500, 6321453, 4174471, 5196148, 5907311, 5837953, 275047, 5614837, 2724517, 8197766, 2117779, 5833020, 2654519, 901838, 7965826, 3314227, 4431082, 3530244, 5986887, 8006689, 3766829, 1414188, 6485099, 1264890, 6664133, 3719186, 8100718, 1177022, 3926748, 5097633, 5986277, 3279856, 252700, 2582825, 2685313, 7440094, 6199053, 4256995, 2164369, 2765054, 5335974, 2057638, 5731022, 4769963, 2230308, 2869238, 2032353, 5874109, 1267053, 3663833, 4142814, 6548603, 6671404, 2253628, 1394559, 5382044, 3738664, 1910681, 4456506, 3814281, 4404803, 1176542, 3160494, 6254241, 4324302, 6214651, 2845493, 7674127, 7097689, 5875942, 1516393, 3361161, 8030700, 2642557, 4441611, 4434832, 1132361, 4971966, 6712095, 5071841, 92740, 2494787, 6813986, 1341916, 7826440, 2701870, 7296026, 2640458, 6866308, 1045578, 2940585, 6424459, 1608703, 4544318, 1319058, 591221, 3677992, 5418122, 357418, 1680200, 34536, 4332638, 4103914, 8246604, 1678954, 6082241, 6267539, 2321786], +[4548405, 5564275, 2079952, 1909722, 7280465, 7340170, 2314051, 2714236, 1984491, 6644267, 2288612, 5829011, 3844828, 5706010, 682088, 5701977, 6286406, 1988161, 2683955, 2440550, 5351718, 4745349, 2469601, 915940, 2590497, 6672625, 4593521, 5879633, 3831704, 4976839, 517099, 6628684, 3420840, 5894536, 793683, 3132360, 4996134, 585495, 246768, 2733469, 4175012, 465828, 248283, 5571594, 3153122, 1929677, 3556034, 4458578, 1421962, 4634619, 4835145, 6670113, 923385, 2251231, 6664664, 5478553, 3773103, 2208639, 2937788, 3177849, 6760501, 7457609, 6047263, 6364257, 440795, 7849198, 6942487, 292611, 6702626, 5238094, 1770177, 4263623, 3289565, 2854983, 3672481, 4302929, 756165, 8109786, 828601, 4961755, 7203092, 3463418, 5592321, 6241279, 5329421, 4631509, 7087090, 4675813, 2782001, 2293158, 7728285, 2677295, 162854, 4565924, 2385436, 7951733, 3847240, 2969685, 3306249, 3367877, 6914026, 7979751, 7730740, 798034, 6448415, 2569394, 2835250, 3376042, 6306021, 5746067, 2662061, 8277779, 6941554, 3416146, 5504092, 2721403, 7589771, 3329588, 5800190, 221448, 3367598, 716473, 3547654, 544366, 3266793, 3546665, 6091639, 1091948, 6830061, 2195976, 5928001, 7738239, 5268762, 1894003, 85106, 50767, 7983151, 19774, 5837497, 4551157, 5188730, 6840380, 3764680, 143572, 214983, 5657387, 4943420, 4787718, 2646515, 6882304, 1810767, 4880128, 3328311, 3031091, 2017318, 1228014, 5568480, 7887074, 5817102, 7944919, 3435329, 6742604, 3701232, 2370525, 2874795, 7045926, 7915303, 4177124, 2040448, 6823274, 7300343, 6246984, 326915, 1660874, 4573514, 3766576, 5461083, 6678563, 1062657, 3351990, 6232995, 2493311, 1823116, 6843536, 2524849, 3958210, 8064106, 5823985, 80225, 4087350, 1324262, 4500953, 2021524, 4527884, 307539, 577796, 1413302, 6237390, 4904401, 7674515, 1017140, 5218079, 358364, 5845446, 2957813, 2537260, 1923236, 6435967, 2994933, 7042132, 1911604, 1241748, 4216622, 926004, 7809410, 4363198, 1636668, 8193903, 3057821, 4311624, 4331550, 4127970, 7149448, 6214337, 7216301, 5629714, 7124219, 3597959, 7868871, 5064550, 5525976, 7248357, 56131, 1326101, 7507053, 591493, 6263002, 8089313, 6480900, 7698643, 1686827, 3881673, 5646022, 6637277, 2138980, 6888268, 3473801, 5127837, 2840172, 1058295, 1587850, 1163863, 3404555, 6843575, 3285438, 3631634], +[6871063, 8017117, 6397070, 4291496, 7466141, 1610329, 7200177, 7817341, 4014633, 7836615, 6607332, 644578, 7182533, 6896730, 6024781, 2218410, 8072750, 4958074, 1650185, 2301367, 2996096, 2962850, 3370355, 2776701, 6288756, 3841608, 8208305, 3526834, 7628209, 5527351, 7424063, 443024, 8347843, 2590508, 2664694, 2721036, 4982334, 1061568, 2236078, 6798443, 2117123, 3659513, 8050265, 7659195, 4192474, 627917, 7652308, 5027929, 4905425, 1059791, 5512850, 6491468, 7996584, 6913464, 1110277, 8272241, 2375853, 2900462, 278852, 1241652, 6354537, 4109934, 71271, 3686656, 2792870, 697762, 4105656, 1537319, 7509321, 3675418, 2049995, 3134492, 3433985, 7838424, 6004746, 5928560, 7179645, 2057730, 2339822, 8000943, 3806963, 2832508, 697191, 1057733, 1998333, 8222800, 1690808, 77452, 3246345, 3378035, 4316422, 2278748, 3541094, 1798932, 5751579, 7347445, 8186431, 6949022, 2180526, 323692, 6650386, 5919442, 374395, 7103097, 4821502, 6181196, 1163059, 3667160, 3079140, 2958979, 7977509, 5151244, 5103552, 7436689, 4497555, 3495681, 3857440, 1050012, 6043673, 6892241, 6412403, 2189577, 3510557, 2013400, 4298095, 2164814, 446299, 1557800, 7037144, 6003928, 8360683, 3050157, 4311852, 349423, 1962420, 2628809, 3142370, 4974505, 6705303, 2019688, 4803009, 2205196, 1186457, 4126247, 7735462, 4868648, 2370388, 8142950, 8235998, 3117085, 4642303, 6562549, 2167037, 614491, 1844066, 1430185, 3778739, 5307641, 3567876, 7122860, 4241183, 3167461, 4237069, 3320888, 2849070, 5528613, 225099, 4619911, 5016914, 3446506, 8124166, 7083113, 7275991, 1471163, 4815496, 3019710, 8246118, 6209151, 6396903, 1404838, 236016, 1290559, 6744425, 6082287, 5937807, 7637590, 2556007, 7493690, 5902339, 3534722, 5910366, 4084848, 2456266, 2372159, 5412490, 3451482, 2255954, 7707092, 2931015, 1394087, 5895301, 103837, 2861253, 7725436, 1706204, 5172440, 6892077, 5668352, 2652730, 3453482, 1575161, 466915, 7759592, 2147913, 1778708, 1787727, 7273918, 8079309, 563991, 6697606, 5385187, 4509798, 1355181, 5920781, 3169715, 4977809, 1178150, 7946938, 7752477, 7556116, 1569747, 4006177, 2512976, 2845782, 4009733, 5144659, 1410342, 7445250, 4636962, 6277633, 6549700, 3943432, 1994544, 4528971, 1664313, 3286177, 2842497, 4320750, 3389961, 6606944, 6172154, 4334749, 4533715, 5469776, 5083346, 7596029], +[5595749, 6889593, 1954500, 5039824, 3952028, 4107402, 3616353, 2872817, 5679256, 2187198, 5362646, 729712, 6646792, 2885262, 327434, 5146146, 2055155, 2922099, 2415462, 2253774, 310773, 3242220, 5760359, 1495077, 1907676, 8032998, 3256938, 7034984, 2819134, 5739344, 5457888, 7128617, 1533074, 5439388, 4550077, 5054309, 4317530, 2427727, 4327122, 6698375, 590002, 7370133, 800983, 5469617, 2705699, 3499459, 3470134, 1238656, 686528, 4727740, 1480521, 2493681, 2420683, 6426462, 6026502, 5309234, 5773111, 3527761, 5133064, 1803160, 2443838, 7688202, 4071495, 348119, 7230509, 7375103, 5847529, 2346907, 1423898, 2819880, 4794680, 7122970, 241845, 5237190, 2911427, 7100340, 6868090, 4286108, 5328458, 6858852, 527949, 8181432, 869391, 4179049, 4762437, 2696808, 7608662, 7847802, 7465995, 5606983, 1191813, 6583894, 959335, 5605194, 2802994, 3437820, 5210073, 8333482, 7265661, 2001854, 2672171, 2187756, 6134559, 5973878, 4271720, 4434483, 8297673, 5490451, 7181818, 5224902, 1946257, 6418621, 3019975, 4286695, 3382228, 6054776, 6508409, 7594881, 7469243, 3328290, 4231894, 288092, 1219249, 921919, 2247668, 714850, 693379, 1736487, 2888614, 2638598, 1203099, 1337671, 4857879, 1498076, 4862390, 6700417, 7015071, 7900226, 8128933, 5729602, 7791169, 2895633, 6701556, 1420248, 4467089, 3957447, 5055396, 6782655, 4631215, 2523314, 4441651, 227245, 7586887, 1524343, 3818312, 2153795, 4115858, 2655560, 1609285, 5124048, 5458508, 1060497, 5635191, 4998887, 5300886, 6707322, 3394923, 2906108, 5522677, 4948203, 7208401, 3111515, 2635734, 3046167, 4687513, 3938154, 7783176, 7535898, 3295728, 3524483, 4953164, 2506024, 5589487, 4529991, 4255640, 3099909, 6823488, 2878159, 2999026, 8037695, 3546625, 3616618, 5811028, 2071120, 3132746, 8056666, 5862287, 6795586, 5192206, 6116176, 2543113, 6119873, 3814202, 6296188, 5025406, 4086351, 4194741, 3644479, 1414235, 3240889, 3934948, 7070573, 2331064, 4827710, 7329446, 4638840, 4351624, 89560, 3551935, 1360140, 3821502, 5695459, 2363868, 56759, 6639094, 5539764, 2906067, 6250770, 7863087, 261721, 6766409, 6155631, 2020537, 5965648, 2638334, 597138, 7847056, 5743761, 1704402, 1740406, 1746353, 1660851, 6301629, 6099802, 2589232, 5031781, 4047070, 969482, 6654606, 3358191, 4799160, 6695746, 4135535, 7977457, 2451601, 7477406], +[5592471, 4577459, 5553834, 2487682, 2314501, 4003068, 8204143, 420861, 4049730, 773376, 7737452, 3744586, 6108957, 6800947, 34541, 2791688, 5275372, 4711732, 4101739, 4540077, 7985514, 2854015, 131009, 7987112, 3269031, 5210578, 6674670, 5937407, 6826525, 6869927, 828092, 3254539, 8360277, 983379, 67137, 7484747, 24602, 2625350, 8376909, 5603595, 6070602, 3578388, 8078665, 6668833, 2216855, 779249, 93681, 2882639, 2851381, 8035713, 8008242, 7699273, 1636399, 6010282, 803065, 4710233, 5615995, 1670338, 2958802, 4334172, 6369826, 6990186, 6118205, 1973157, 7310570, 3697010, 6991036, 5915009, 1273355, 7261235, 631715, 5641499, 7780677, 4846475, 7764632, 1966790, 5374581, 1759064, 4219636, 487538, 5019276, 8268702, 4284171, 3528279, 4248113, 274554, 8131791, 992479, 3720489, 7374753, 5156747, 3900712, 1301413, 4484049, 7591657, 3518277, 6508608, 4395082, 5307095, 5265026, 5011818, 7166097, 247687, 6464908, 706809, 3729653, 6702663, 1498758, 5718860, 7076924, 5357536, 7251849, 1301496, 1235625, 8196838, 4835876, 2657271, 4627595, 2065508, 1586472, 824787, 7253236, 7004603, 6393627, 7921756, 404141, 597838, 4837897, 1848399, 5994751, 1165818, 6130451, 2739319, 3690755, 1394985, 3583281, 8198761, 3442245, 4380828, 2442569, 7218461, 8019747, 3134434, 3220564, 5453283, 8375015, 1293851, 7229420, 2943425, 8229254, 544243, 8122979, 8075664, 546447, 1894926, 1722068, 1641632, 353997, 164819, 5250033, 6896600, 6391498, 3062108, 1493390, 1240031, 3004493, 3113425, 6198033, 3074022, 5279526, 6983053, 5753547, 4428246, 4857968, 7189447, 1663391, 7804732, 6716177, 742994, 4658459, 8178270, 2567062, 6890982, 5896432, 4182217, 2073209, 2399275, 323935, 8373194, 5251819, 55529, 4680175, 688911, 168988, 7004624, 2667940, 4612355, 6807498, 7725712, 6903394, 77210, 7900720, 6796518, 7875182, 3640661, 914135, 3376847, 636225, 7461816, 1770055, 5433771, 3515052, 4582278, 3171556, 1003805, 5570692, 3049189, 268819, 7446459, 619248, 6358697, 640267, 190378, 3955620, 6050848, 6085402, 6615842, 6047539, 4888294, 7949350, 3801226, 3205817, 3903714, 7009880, 822889, 5040977, 265282, 3580521, 346678, 6200910, 7066637, 5669763, 1784368, 3604964, 5570528, 626724, 7528016, 7869621, 6763999, 5204377, 6649831, 6767439, 7263780, 2720937, 8347901, 3210724]] +w1Prime: [[9, 2, 9, 6, 11, 7, 15, 2, 7, 8, 7, 1, 14, 8, 1, 1, 14, 7, 15, 14, 4, 11, 0, 4, 9, 10, 5, 13, 5, 11, 5, 11, 2, 3, 7, 0, 3, 12, 6, 1, 11, 0, 13, 4, 9, 6, 12, 1, 2, 6, 12, 14, 0, 6, 1, 2, 15, 9, 2, 14, 7, 9, 5, 15, 9, 2, 11, 3, 7, 5, 3, 11, 11, 10, 7, 6, 1, 8, 15, 2, 7, 1, 7, 5, 9, 7, 1, 9, 3, 2, 8, 10, 8, 14, 6, 0, 2, 3, 9, 2, 13, 6, 4, 12, 9, 9, 10, 14, 3, 8, 10, 5, 12, 1, 9, 12, 1, 5, 3, 12, 12, 8, 12, 3, 3, 14, 2, 2, 14, 11, 6, 11, 1, 11, 14, 10, 10, 13, 2, 8, 13, 15, 15, 1, 9, 13, 3, 14, 11, 13, 9, 9, 10, 4, 15, 6, 4, 6, 9, 5, 12, 3, 11, 9, 2, 5, 6, 4, 14, 9, 10, 13, 0, 4, 5, 13, 14, 0, 3, 11, 13, 10, 15, 8, 11, 1, 9, 2, 2, 0, 0, 10, 11, 3, 9, 13, 10, 6, 5, 4, 12, 10, 1, 14, 2, 11, 6, 4, 13, 8, 15, 1, 1, 9, 1, 2, 5, 3, 2, 11, 3, 14, 7, 4, 14, 15, 6, 12, 1, 14, 4, 10, 13, 11, 15, 4, 10, 14, 9, 5, 12, 9, 7, 3, 8, 10, 7, 15, 3, 9, 1, 0, 0, 10, 1, 6], +[9, 7, 13, 5, 14, 15, 15, 3, 9, 10, 15, 11, 4, 4, 6, 12, 2, 15, 12, 3, 15, 9, 8, 7, 6, 1, 9, 1, 1, 5, 3, 15, 3, 2, 8, 4, 13, 0, 11, 6, 0, 1, 9, 13, 0, 12, 5, 4, 13, 4, 6, 11, 12, 1, 2, 2, 14, 6, 7, 13, 5, 11, 13, 7, 6, 5, 6, 12, 5, 10, 0, 12, 5, 7, 7, 3, 13, 1, 13, 13, 1, 3, 2, 6, 3, 6, 13, 5, 15, 12, 11, 0, 11, 7, 12, 10, 7, 9, 8, 10, 12, 5, 6, 10, 14, 11, 4, 12, 7, 10, 6, 1, 7, 14, 2, 8, 10, 5, 8, 7, 0, 7, 6, 5, 5, 12, 11, 5, 1, 15, 2, 4, 11, 8, 2, 8, 14, 6, 6, 11, 0, 8, 5, 6, 9, 15, 8, 10, 3, 12, 8, 10, 11, 11, 1, 11, 5, 0, 4, 11, 5, 2, 15, 6, 8, 7, 11, 15, 7, 3, 12, 2, 13, 7, 0, 2, 8, 10, 11, 6, 0, 5, 5, 14, 12, 8, 4, 5, 10, 4, 11, 9, 4, 5, 4, 11, 2, 7, 8, 13, 13, 4, 3, 10, 7, 4, 8, 7, 8, 2, 6, 12, 8, 12, 5, 15, 14, 11, 3, 6, 15, 5, 8, 8, 2, 9, 13, 10, 0, 5, 13, 3, 15, 5, 14, 5, 13, 2, 6, 12, 3, 9, 3, 1, 7, 10, 1, 3, 0, 8, 8, 0, 3, 12, 12, 4], +[9, 11, 4, 4, 14, 14, 4, 5, 4, 13, 4, 11, 7, 11, 1, 11, 12, 4, 5, 5, 10, 9, 5, 2, 5, 13, 9, 11, 7, 10, 1, 13, 7, 11, 2, 6, 10, 1, 0, 5, 8, 1, 0, 11, 6, 4, 7, 9, 3, 9, 9, 13, 2, 4, 13, 11, 7, 4, 6, 6, 13, 14, 12, 12, 1, 15, 13, 1, 13, 10, 3, 8, 6, 5, 7, 8, 1, 15, 2, 10, 14, 7, 11, 12, 10, 9, 14, 9, 5, 4, 15, 5, 0, 9, 5, 15, 7, 6, 6, 6, 13, 15, 15, 1, 12, 5, 5, 6, 12, 11, 5, 0, 13, 7, 10, 5, 14, 6, 11, 0, 6, 1, 7, 1, 6, 7, 12, 2, 13, 4, 11, 15, 10, 4, 0, 0, 15, 0, 11, 9, 10, 13, 7, 0, 0, 11, 9, 9, 5, 13, 3, 9, 6, 6, 4, 2, 11, 15, 11, 15, 7, 13, 7, 5, 6, 13, 15, 8, 4, 13, 14, 12, 1, 3, 9, 7, 10, 13, 2, 6, 12, 5, 3, 13, 5, 8, 15, 11, 0, 8, 3, 9, 4, 9, 1, 1, 3, 12, 9, 15, 2, 10, 1, 11, 6, 5, 4, 12, 6, 13, 4, 2, 8, 2, 15, 8, 3, 0, 6, 8, 8, 8, 14, 12, 14, 11, 14, 7, 15, 10, 10, 14, 0, 3, 14, 1, 12, 15, 12, 15, 3, 7, 11, 13, 4, 13, 7, 10, 5, 2, 3, 2, 7, 13, 6, 7], +[13, 15, 12, 8, 14, 3, 14, 15, 8, 15, 13, 1, 14, 13, 12, 4, 15, 9, 3, 4, 6, 6, 6, 5, 12, 7, 0, 7, 15, 11, 14, 1, 0, 5, 5, 5, 10, 2, 4, 13, 4, 7, 15, 15, 8, 1, 15, 10, 9, 2, 11, 12, 15, 13, 2, 0, 5, 5, 0, 2, 12, 8, 0, 7, 5, 1, 8, 3, 14, 7, 4, 6, 7, 15, 11, 11, 14, 4, 5, 15, 7, 5, 1, 2, 4, 0, 3, 0, 6, 6, 8, 4, 7, 3, 11, 14, 0, 13, 4, 1, 13, 11, 1, 14, 9, 12, 2, 7, 6, 6, 15, 10, 10, 14, 9, 7, 7, 2, 12, 13, 12, 4, 7, 4, 8, 4, 1, 3, 13, 11, 0, 6, 8, 1, 4, 5, 6, 9, 13, 4, 9, 4, 2, 8, 15, 9, 5, 0, 0, 6, 9, 13, 4, 1, 4, 3, 7, 10, 7, 14, 8, 6, 8, 6, 5, 11, 0, 9, 10, 7, 0, 14, 14, 3, 9, 6, 0, 12, 12, 3, 0, 2, 13, 12, 11, 15, 5, 14, 11, 7, 11, 8, 5, 5, 10, 7, 4, 15, 6, 3, 11, 0, 5, 15, 3, 10, 13, 11, 5, 7, 3, 1, 15, 4, 3, 3, 14, 15, 1, 13, 10, 9, 3, 11, 6, 10, 2, 15, 15, 14, 3, 8, 5, 5, 8, 10, 3, 14, 9, 12, 12, 8, 4, 9, 3, 6, 5, 8, 6, 13, 12, 8, 9, 10, 10, 15], +[11, 13, 4, 10, 8, 8, 7, 6, 11, 4, 10, 1, 13, 6, 1, 10, 4, 6, 5, 4, 1, 6, 11, 3, 4, 15, 6, 13, 5, 11, 10, 14, 3, 10, 9, 10, 8, 5, 8, 13, 1, 14, 2, 10, 5, 7, 7, 2, 1, 9, 3, 5, 5, 12, 12, 10, 11, 7, 10, 3, 5, 15, 8, 1, 14, 14, 11, 5, 3, 5, 9, 14, 0, 10, 6, 14, 13, 8, 10, 13, 1, 0, 2, 8, 9, 5, 15, 15, 14, 11, 2, 13, 2, 11, 5, 7, 10, 0, 14, 4, 5, 4, 12, 11, 8, 8, 0, 10, 14, 10, 4, 12, 6, 8, 6, 12, 12, 15, 14, 6, 8, 1, 2, 2, 4, 1, 1, 3, 5, 5, 2, 3, 9, 3, 9, 13, 13, 15, 0, 11, 15, 6, 13, 3, 8, 8, 10, 13, 9, 5, 8, 0, 14, 3, 7, 4, 8, 5, 3, 10, 10, 2, 11, 10, 10, 13, 6, 6, 10, 10, 14, 6, 5, 6, 9, 8, 15, 14, 6, 7, 9, 5, 11, 9, 8, 6, 13, 5, 6, 15, 7, 7, 11, 4, 6, 15, 11, 13, 10, 12, 5, 12, 7, 12, 10, 8, 8, 7, 3, 6, 8, 13, 4, 9, 14, 9, 8, 0, 7, 3, 7, 11, 5, 0, 13, 11, 6, 12, 15, 1, 13, 12, 4, 11, 5, 1, 15, 11, 3, 3, 3, 3, 12, 12, 5, 10, 8, 2, 13, 6, 9, 13, 8, 15, 5, 14], +[11, 9, 11, 5, 4, 8, 0, 1, 8, 1, 15, 7, 12, 13, 0, 5, 10, 9, 8, 9, 15, 5, 0, 15, 6, 10, 13, 11, 13, 13, 2, 6, 0, 2, 0, 14, 0, 5, 0, 11, 12, 7, 15, 13, 4, 2, 0, 5, 5, 15, 15, 15, 3, 11, 2, 9, 11, 3, 6, 8, 12, 13, 12, 4, 14, 7, 13, 11, 2, 14, 1, 11, 15, 9, 15, 4, 10, 3, 8, 1, 10, 0, 8, 7, 8, 0, 0, 2, 7, 14, 10, 7, 2, 9, 14, 7, 12, 8, 10, 10, 10, 14, 1, 12, 1, 7, 13, 3, 11, 13, 10, 14, 3, 2, 0, 9, 5, 9, 4, 3, 2, 14, 13, 12, 15, 1, 1, 9, 4, 11, 2, 12, 5, 7, 3, 7, 0, 7, 8, 5, 14, 15, 6, 6, 10, 0, 2, 14, 6, 0, 1, 0, 15, 1, 4, 3, 3, 1, 0, 10, 13, 12, 6, 3, 2, 6, 6, 12, 6, 10, 13, 11, 8, 9, 14, 3, 15, 13, 1, 9, 0, 5, 13, 11, 8, 4, 5, 1, 0, 10, 0, 9, 1, 0, 13, 5, 9, 13, 15, 13, 0, 15, 13, 15, 7, 2, 6, 1, 14, 3, 10, 7, 9, 6, 2, 11, 6, 1, 14, 1, 12, 1, 0, 8, 12, 12, 13, 12, 9, 15, 7, 6, 7, 13, 2, 10, 1, 7, 1, 12, 14, 11, 3, 7, 11, 1, 14, 15, 13, 10, 13, 13, 14, 5, 0, 6]] +w1EncodeTemp: 29697B2F87178E117EEFB440A9D5B5B53207C3160B4D691C62EC60219FE297F5293B57B3AB67812F1757799123A8E80632296DC499EA835A1CC951C38C3CE322BEB6B1AEDA82FD1FD9E3DB994A6F64593C9B52469EDA40D50EB3AD8F1B2902A03BD96A45ACE1B2468D1F912135B2E347FEC6E1A4BD4FEA599C37A8F79301A061795DFE3FA9BF44C6F23C9F78161951F323480D6B10D9C0454DB61C226ED7B57D56C6A5C075371DDD3162635DCF0B7BAC97A85CA6BEC4A716E7825A787056C55BF1428B826EB68065F9A8C3A8BBB105B4256F78FB372C7D20A86B50E58C544A9B54B472D84DA3477828C6C8F5BE635F8892AD503D5F5E2DC69313A7318008C34CB944EE54D4B4B7B14C559A25D5B9A7D1B7621A5018B0469793D942BD4766EDCCF11DAD835687F1A27ECB9A9E455F90F56766FD1F5C65BC057D5A6E0B1617762C4DFB4A000F9BDA07B099D5936624FBFBD757D68FD4CE3179DA625CD385BF80939411C3F9A2B156C4D624288F038688CEBE7EAFEA301EFCFC73DBD4A72523D776FD8C3EFEF81DDE4C9F4366567C70BF1E50552AD474FF18AF29CBDF0255208C7015387E64F7BB4EF557210403664837EBD014BDE1C97266AFEA7927DC4C474831BD601854964D49829F0560D91434A7E76868B5907AE03E69C03C20CDFBE57B8B557AF4360BF5A3BD75134F33FED19AB3A6F2EF8355A8E3C98C946385D68CA9FADBA488674B1A6DA16445613BF4D6B5EAA3A958D8E1A275279153C5AC7B3AF518EE5B53E9A0E68DDA018259FFBED2B2750A4E45BC88A0AEC486C6FC6E18221431553239D9FDB06F3D88DA59083E4758A32AABDA66AA6E6589EF76599B685DF6774BF6DBCAC5C78A7863D8949E0837B705BDC61FCDB415BF3333CCA5286DD9F8E59B5B8410187FDC509A985FF0A6BDDD6220E050B07CDF2450F5FFB3923B86DC4C7EBDE2B19F4F3A180A780820E77A927E8CAAEAC1713DDBEA23909534E2CD1F91B4C275737058FE660AE206011F3413A0CD3662C6A6BD983EDF9150BD4815A090015DD9DFF0FD27163E7A69B2161E1C80CCCDF967D7A271C1BE731BFEADDD5E60 +cTilde: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F +cTildePrime: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F +cTilde == cTildePrime, signature verified diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt new file mode 100644 index 000000000..66805a563 --- /dev/null +++ b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt @@ -0,0 +1,153 @@ +Signature Verification -- ML-DSA-87 +pk: 2D1E6BED8452EBF126EDE70CA0A2B50D03342D5B13B2AE210F4562A3BF670CB15CE925FD22F26242BAE310B3AA413B6E78D442D935D1728A3248CC205CCD8D3FD834955520CDFB2C73E90E608B2C3FA8B7D179FDDCC88111C9E84171E9709B535933E492B6819C6A92EDA25AC407771A8FEDB4E711FB89EB7BDFCCEAC53B4EF46B6FBEE132A9D7ADB436E74A6D671183AF311A7A31429B012117527585F7920F348A6911885A0208B66DE30793B13FE1D57BD951F7AAC0349A785D26DBF1F0A91E5C9F4FA7435C44A943F1381145EDEB1C8A05EEFFAB202CF62CEE7742363EE69D8E450FF67C3962D6FF97BC3D02D6DF4A35DA3F89A48833CDF290F0E9372F65A58865FD4044AD090992AA159EEEF72B0DA7CB3A5E0AEDD67D828BBACFE59EE462AB696BBAD0E5A9BB1F5A51E0FA5DD44D8EC0DC4306DF2367B24AA2FB752F82D844E4C0CE159E3FD6B4705F3BD0563E0A7A4B94BFBA012B9C8B9135F2DB4C8C8DD6EEC8658DF30559BE3A17A772105614EFB8C1BE18110BE670F839A5727DF947FBACFD1FC37133584415D37C932E7092FABBF2D09D25C4CF4AB8ECBE5D8B7FA47CABADE71E938392861E8D15A41C5B4225DA3D16D393F28550860A86356B14AB5F22D0CF037CEBB40EAC87A24142A0219300B6476F96D041D1C30E3C52D245AB6AE7A1E5FD73C5829D60628B6D87FC889C3EEFAEAAB61C18EED7511A96C4932505D3833DD83316144488E2AFC4EC591812B999C1C95F31790003F6C95514AA29087824AF1D991236D94AD950EF66FC7FF4BC3BA0F6FDF262CAA59D2B55B833BCA67AA51EE1145F94E2DCF05BBD4307D8B1E0813F845490BF2359923CA598AB7D99D2F0ED8E0BC99FAFB013EDC7DDB86172073DCC3573A0CF0CD97E93DC63B882ECF430CE4392EA5ED8C8A1EC79DCAE64D433EB538CFC4979BF7A28651E8CD521B08ECAADF8969A981000356D589AEF84848672BACD3866969BC283B065C1ABCF638C2DC342B27DF6B8F03D26218FAE4E96F25566BC6FEDE719D38DC0CD55205F10CADA09ED914A4333D382115C2F5DECCD54F96CE4E5F268BCE927B21DCAB5CD04011E92F5F601862B20209BB0F956D933D50AEC1BF4CED2B2C2D43F9A25768E29875264864AA57B5A91726EBE6D730A8D89538233704420BEE0B01B763043A55B8FAB7EB8615F43701B1A716156F913312A643314009872EC328809FB64463D5602D976D3AA900FBDF0F996437B621926226A9391EC0734F52232B36566E06B117F979F1A8946CE8FBDFD2FCC3DBFF283A430E10272F874E6219677E1578AF79EB331AFD8C5D720DCFDCF79060F1FE5843D0B9CB3C7ABB8F1C0D0B5C701E20E3BAF7EAC445A75500A761C13DB25D40D19754C02D9F3DF6DBBCF47A6AEF6D1FBF4B455D3A587A155FBBFCDF6A1645712759A11A3CE427084549312E13A0FFACAF22591F14D8F84B1B535ACE98177344D6F5D149DB9E1F03F3CE7AD48E68C5186F44AB4D098EC3A4EAB582F089E5A9D4530B085DF4AE792C6C8189308CE9A8CE2918D91577B37C880A231100D4EEF5107948EF83C3C2ED50326B8727FB9BCD795C43108EC6FEE11AFC0A2ECD7C80BBE15AEC917BE37E2408365DEB34EB415B35C14F65FA91F70B5239378B947F91D2B1E8DB1257EE5853C169FD0C2678B0DD2724E7430E1AFB866CB53DFC4FBA56D03F2AEEE90FED730AF339809EB75C73EC82FE7225F2F0ABDA42288281935831286EE72B426892FC7116EDD149822E7733EFA4675F940C18422BC7536C782D3AE6E0DBF6FC34B674919F34B12F283FD395644053A246A356912CFE493FE26CCD601A04A84A81D85E6830F3CE66DD2CBB1148CEC10B3634B9CF511E0F9866FA7C03B9D25D754CA404D26BA718E25F5A7E39B25207F2905B6271417672610ADA30603FE82855D01044DE06438385E831E219A3902F8F9698552E5EC6AAC9686A78869B5B57E031DA968CA450FF914D67BCF9C036FD1D96F013DF8F311F3291790E89BED589BF0BCC7BAF460C8AA30B42F228FD3AC18C2B7C47B319E0F7E9DBFD463C28B1B585033536D79BBF80D9133D907E7B081D4B4476193F0FB68BC1B41C2F543307E76F9B1A3D6D426EA7775127AC8309BCF45BE747D8A8BECED11E6A1D1B8F190AD6D6AC654E9DBAD4C9739C8D844A91A37167E68450CBB10F4AE8E2B69FA953EA5C991D3F1A3893F9086931BF1A089C7F22357D48E2FD571CD36F190B3983E19EAC80F129DBF58EDDC6B9A7984FCF04CC3B40DB87A8DAD7540D5D5DEC8CA393E45E4BCF433EA64E15E944291ABBC422AB3D06023CE578EFFADA22B64D994A0800F8E5017081D16CF51D0B928B659EF78CCC996F9CA877AEED9155EDF5DBCC258E604EE17DCB3F990F988329EA1DB1C3856539030692E52002CF30FD5802E025B99BFCD1112645B56C60AE638E74D21E598789DE6CB60B42EE49856CBADE6DD53F4C567A29FA05C7CFB245AA772D0E763F25DBFD8E9F16BB429A628E693D387B6D93C398DEA28C0963DF5C23C29F280218A039D64F8BA81C1DDA2882A842E3CB50395EDAA6EE26F5E993C63EEB84F6632774223362989B0ED5FF25A65663FD28B486865DCE0B0C27273F1A4C6562C5DD8C65C41CE308959A9D64596D08E7B25E013FBFE7CEAF3670DB29A213CCE9975A913CEF4236E64003087709CAD6181710E951926CA55297199A608AE545875CDC38FE383C14562B48DCA6602EA34055D983F38E61CCE531AD93F58EC162845F538CE4843871D3C4ADF05F35E297EA62EFCDD5EF9401BA042A235150A09D9474A3FB03AAA19E7E37A228D5F5B07414C3DA2AD2E5C75ECF04C112B90769E19960E975E8D1917B3BFDA84FDC6D2326FB8A3B00F95D9C52650111572BEC21B12127CA570D8A98AB977EBD8D79A59375EE14F64B5B04FD969FEB03D0AF73489E3BAEFE7C7BC8DC7E85483EE62F02398580F83B96DD84477B9C48F0BB39F5406A37036D6F36E2B1B6B53FE6FF61C327B29D4E05DD2B81174C60B59C79CB1976BC06E7AC34DF3E38F7D2C1C0E3151B7147AB831774770143B927B5FEC5DF776C1D72DB6BC9981D65867713CF297C8B0F1E98D0E16F0CC227A39E47E50BA0116156D5B5467536604BE05CC2EF40ABCE852F15DFA2CACF86A789E5B7B0E5BB4B777CD7CC9F654779B102F78B5AA4B94C3B4FDE55FA7F7BF54AC225E1F26165B65F16D0321669FD9F6E47FCA1DD347096DF5DDA86466A57C5B068D9C67B7320366EA19C8993FF90BD8FB0693FBA370E66D2B203B997011B0D15B94E28BAA2EBF01774F7AE78F84EDBDAD9F65A450427A4774C60CC89A020B37DA21C791DAC8F7A7457E30D08B01375160039C301B6051A965E8A7CCA2AEF93BD52F82C020BECE90A129024EFEA4B2FA21270F8EB5ED6AAAE55929AAC599A577972957660CC47AC4E3CE772BBF10052DE7EDB1B8A44941F884C9F8BE13174669945629F46DE2467444F3106A73FA279CF02A800A047E20BD4D820B389C3BB6A868A5384CF5724C204CEFB1A6A1BEB9723E36DDDDD9C707C8F63E8BC26683CC8B43C7DFDAA408AC4DD2BA9AECBC3B6DDAEDCE094AAB58FF732B196638D8B8EFC428BBA9615793C4DD9F00F90D62C676D127A0E18C14C6EE9C990510B054ADB4B4170AC7127F93175C1EB22512 +signature: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBEB11EE5E070E6DA52E548DC04FDEF5472E7E5F18210AACBA04F4F18AE6686B9AF9657E38E3B9BDDB4AA84E67B4D8192D003873DD3EEE74700FBD81E381C2198B7CCC137C171B22F9353419C48C14B8D630F996340275F6E604B95C435208AED2BCA1B419F8363F0950E240D6F9EAB118E4BD3DA0EC3A2BE26A8A09857713C36DD69C34EDD2C619E88267071CF9EE5A60CA3142DF163F01D8D796AC850CFF3666078B318FB5BD17360C876C9C90D8A7F412C8A31616BE7A3745871548486715C94263A17B36CA49925450C578AD9D4B1C20043F45E8431994FA6D26A141BAD9E496E009E914616CA570C09F638D062BEC687333AC7283834537EFB6042F37D83F7295DEA30D50090B6384C1729EF17A0D58750C0037514E5E1227853BC5AA31E95BEEC37B1518269262EA35ADA4FDA77627EEDDAAF57971BA36D467B19A90B991CD255DB79B0154886523031D6C5B1AE8FCF9A4310BBC8197484B2923BFE0B1215A1C4D8C68390898AD53E3369B7053FB18B0D874070902A5D3B3D91D81D4DF1087EF7DC0584EBDC63D7BA3C0D31F86DA6C0FD08115C53F6AEFEC0829A68D2A3442EEE4736702D66810D62308A8CC82AA62182F598F44E253711B5D60788BD0D690EF98F9AD593E03CEF38B9C977983F6911BA1AB9F735E928CDA38C03E6AD8362F460AE4CD0F46E00EEEC74B6123498AB31E7A79D334D72A7A7EEF3B551E78D31BC2CAFFB139CACA4D79C8BBD52BD78F4906509BE42E7763AE6ACB898285EC9323E68676A8CC74A58C8DA8BE911ED6F513B6608707310FB45CBD97D5FF0D2ABA36FCEF73D46CB7F01C2CFE38E68E84F4A301916D2F510D82B4969BE7A0E9CC60EFF5C0A8717B822838C77AF4206B12545089BB2DD6A3FF012C86415BBA04FD7D4EC707AF3B17F25574766F1E92738E06210F48A5EF2550EBDF85A5CA34497CF1D4D3A758648EC41172443835E5091BE8F047823D9620C2AD51C9611AAEE39B21E6D6AEC870C8915E266476A50EECA599622F7091A34C23F14B40429D95E3EF98FED3E749437F04BB4A337522E6809FC104503E253B41C4F0301AF467F74D33125FA83EF712445A171FA40EBF4E6553E454AFE2568021D2B2A198DEC9BF720F9D72F81520BE87466AF70D00E0E860FF9ABD03978C3E429B5AA17B97F9AE93448853D6EFD168A30C6CBE8DE2D288D9A24EA5D2A5823332B84FD2CE793A22BEC439848D4E60F3BB9C75D7EB0871E803D61B07E749ED76072B27C87B69D6C014261F647AFA88C4F1EC55A75A50FB4C79D2C94C0503DB20DFDF71F628874188CDD7385C03381DABB854D4AA9F47B66438C43FF53EF5E78AB450B450191278AF6E26A7B5E6461F577F9852F81C90203C713F5B1F6C3EF558C9032516D8D62FD5E24E4F0F50718F56B5A59A009D5938DAD5591F61F4C659A760526EF41202FA7E5F6C7D5E0B0C0C43B524B66712C5A7C53C84C50B83EB9C98D2FD084C9C5F21FEE7742E6EFC8CBBE5718B70C062D82E2F986F38DF1E71589DC7987243562A2319D7C00B26E531E93C38444618CE758734FDECFD0C6853728C61000784EDFFED7B33086E168D6CB63E3DACAF3552F885B478262DE5E1E63CE7A4C6695D1193835E45A67918C42D39BF880385330310F2C7BF91E6C3E29B781D09870C26D76BD8AE209C42BC7432DBB4C16526357A5634EECDE93C51DD4D6F0065B2EC57AD3B58266539597C8F42B55271D6F90E986F6828D959EE800DBEBCF48236BA3DE2527E0ECA4A3C2A34BBCDD6CBB3A9C96DC3BE110D3499466E2857FBA98123A6DBA9014877E24EADCCA40F8AE94B2FED236CBE5BCA9DFE0CBA9A0F86241331859F9D6C087B276DEC9356F1FEF69B359F9FB384A84022DECB70108DAC8E93BB6C300C0345FC640C006EAEBC15113812FB37DD96E2A06A463AFCE66C59F8D714AA1FF494F086FB9EADA184563CA9D8808B16C19A824AD857DDE51E508B7041235F300ED2C799C182305389576CF393CAEB0D3BA3E4EE4B577A3E37B275FD8051942AE9154E5BD7C35E0F895523A29B0E6B7AE20BE21DFF567EC8252FF5BD0AA145015E11C6A1B941BCC7601BF039442F200619658D9D04021FACE6BAB5D49D8D7BC9A66C2BA3FDC490DA55CB4670838EB2D07245BB1227B024A8A5338E9428EA55741D671A79D6A14D27D13FB59D0DAE5239E1BC42187BB78E038011DA0D1363FD0A78F86261EB026DE7E173A90FCC017DD78F5A32D3E29CE384576A95511B6B4E56EDD014B160799BD1977F5D79E399EAA8E2B75C5EB33566CD8B63F3F4E817E290A68ED1E9FDC6BFA18E3E57D057F22FAA2F60FB634567255165EF418D182FADDF7B89F7D301069C485D8E83489D493BE56EEDC43D48200FD1E2B0669071BBF33613928CA31910BF2EA328EA864139AEF791A9ABE52133249937DA88C48D4C01D108A4685AD29DF2ECD4183820128440EE5378D6BCA6198DE89A97BBB4448A28D823A5740607C6E69989893FA7E299A7453D8DCB34BDB7EFE95B0C72314EFCB493C09D77BD0119BACF2C22E7CCBCD597F6A09FEFEDFA0A7AC3C90BA7519F4016056D5FB412BA02D0D45CFF3A63D36EEE1E468E6EA2F673A7A02926BB318BA73EE1B2C137DEF4A39E803FF573553E9A5C6AA1A1721CA54387CB1DFB8FA7DA726B2AE7A05453B400A19E53252789DC3206324B2584B861F00A250F99FD9DC7D513DD7A65A04034EB33D2D56A496B36ABA0A3008E30FC13824885D9E6F681A7DB62DDDE3501BD40775E2E2CC09CC8E4E67027202A81170A57F4AC198C17FBF95BBCED36D4930B9508CFA3E8BF6E554E91BD7D6E53233BB91ADC815761A0435DECCE167264C2F4E34343D1E5AF7BCE60C9B7B7EE5DF729A0DDD4BE66F82FB5E2CC07B038576110EFDC7D55026BE755EC1F02E4762D6F1DADFF41CEE6352C44537E685A50A075463217B92F7330CD929CFE3ABB5FCAA262093558A0733B27D95027A769E7DBBC1F36E8410304B5D597368EC2A632D46E8C2F8EA2BC44FA76EF474EB96A364409B2363424B8F85004304AD617693BDC388C3FC2961BDB15A1F5B20EF95ED998496B2938182FFE3B927EA9A23F6428DD35C8611C839E316E9A5327CC9EA82509B215CC966BE1C7848EF392DA1C6F369A336253AA1152B6DCFDAA7CADD4D9A1D589F73D3EF0FBF03882FDEB944B5B6CFE26F6AB5123829558C4C736F0B687AC7068380FE7F61BE6B40E3F04D7B36820FD86329B3109D02EC6390EAFC8CA730562B68082424FDA98D0B64BC9734B40B63F7E37AF6890AF7C2D92F79EEA3CCEAC60A6F380692F802B1556A78FE5583FF20A9C6A7BFCC863A9E7B62014D1605DE894FB585E2D4F94115E029E5857E6A0A7389275F530D3D80CFAB1F225D38335D24679197D48A018A34187DE3BCCEDE94FF8EC534C02DA724D4598D669E85A9C60E45214FAA6544D6A47D1C4ED7409D55B1A7F115AE15443A1C310640D116238493EF3EE2879BB8461F7D68736470D4B573AE454993F532301E35CB9EEEDFFEA82FAC497753F75019F2B3B02C70B64A579531C326072ACF1BD0AAA09F0A978B78AB22BD6119F88DD2D572F8919D474F591DAE9FCE4753C985FB250425F26561FFA9443F2376689FEB48C4CE514604526A100AF33F0D4337D1604222C4D9F93A8E69E4CCD36669090C5DFB0E95494229FF9B20CCB1AC81B81A36D63A850DDB33334DAA5146BF36FE18801E3BEBD0E91B5E1CFE7A9826850AF4397D1B07D3B719E57BB832AF4234C0CD9FD40B882FCEDA937EF9A2DA24592BCB5D1BE83EC5F03DBDFBCB335D90D5C8A02EE53D508EB5DE4A961B958F751E5F89A1D28895A3DB7B62EF4AE16D28FB789B3203AD2463D6EAB83A6D20CEA1314AE02A3FF6F653154AE144238186214741C236148183BC39AEDF44DA97F731CE3DCB61A4CFE14F9E84AA05AB1C1B951D20155233FAFAF16CF1BD0BAFE199E65D563453BFE55D5F474AB10594D738A8C106288D69D07A1688601463F3BD2146819C83726D14C6A80839B8790B5716E772F6C24C2BEB7E2CF37B3F42ACDD473E8CCDBE484D6E07B073DECB174AC3B8BB2EF54E6DF9E02071FA600AE55967EB6F702F719159F0EB065CC46048E875E7CF4271AD2EDAF910829AF613BA89FC612A00FDAE537B093AE8CBE6B70D0301FA2E13A916381C92ECB451A36E3FA8B7373620C071A30534EDCB4A3F113117A502D6A72DE6C77BBBF6AE99859AACE64A928C374BD2C4652AC97EB744D29A70CEA9A19D7013497BCAB69631433F9ED1FE20F80B5983E1288BB6A2BE91543ED47928BB5E462D01E9C0B7FFFAC06C10F152F43C329E89DF8A79996A09798A367640BE9FB53DCE27BD0BAA9BF021BF10D2FCFE5B13FD7D84D1C1EBC0BCEC26D08780D13B9947672661E0FA5FAE6F315B6DE40168C2351DE31F41FF6C533226E1BCE3F8E216AF3BE64C693372A066B175F726CFCD642BAE980292C1CB65E01F0729640AB009CB98892D6CFE40033455DEE73033B6D5E19C599F8A400EB141527DF2BBDDEF50BBD5FB55AA5EFDB35D08569B0297E2481469F17B87B508936A9C5C11089AE9E4B0CAC5749393C803E47039F51B5CBD42A6C9E19EC3F63C2332E87768A960FA02186B7A2B029265091146730463DF8B375F24AA83BDD41D1304FC2FB52DA10F1FED652908CF8C528FB2625F393FC8C7B33FAD45BAD47D383D2C04CF32E807425F93D2350721B7B2F596648EB5E1386B43D12EFDDB8FE2436AEC278EE76875B523C5431D99485773D9ADBCD014DD87BC68FB82EE474B22A5433AF9F991FC34B25834DF13099A46F568AFD1155F321B9DA9E9C06347AB3C1F59F7EA0ED6CF47B3E9AF657AA7AE9BF8260B969DE4AD24D3A8CE95E577D0441305064E07B9A2C75C3C43801FCEB736FE3D271BE1F36BFFC8E43DB14A162476BAEA9D346B5211ABD00608B15AF3B5E63A00FF928D1EA1A18D75FA7C6C1B0FB6272E55C3FE7E4D4205E5CF0A1F8718304E14F2B4CC543D0437341A4A311601A92E92566B7DFB4264E870E1B3A875EDBC003A561970CF8A669F3D1B69288CC6E359CE28CA65F9DAE8CECA743C1C8D9FFB5508824A8361E33B431A2E9E9A997847D2E6E43C83F02262E2946DF7726D54E3E6C9CCDB6D3F136346C11E5942E7A1BF850C2E99B4FACE75FD40886933907CCDFC0DE117702031941D001E2A683C5578FD3354212CEAD969BF1C81239EECC774FD0B883D0EEE824B10B879CF707CB268474522061E927B1243244115C669E9EB272B60A644F519EFEC063408B658472E9161A1F744FD66169F0CAE36B42E2379CBE81E6E51A0F53415184EA006B2270B33E2CA364CDB33AAAE77FFD953DB39704D490CE9AC6F2DD1C7A18E617419A9AAFB37E7239B236A4B74CE63E4A0ADFF855DCD78F6458E760BFD1D2AB95E83C03B6FAE0CD3C5CEEEEE1C69515965A335FCF78E80AA739339542127170B2C3EE10B0EAA099AC7AD4CD76E7FE4C1164E62F4E5807DC0061F77E4A8A528D710375930CB755B28BFFD928CB07BB4A107CDCABB308A48650DA4E574D9BF5607F583DAC340D72093EFB12BBF93410F1EF5C9516C744D2315EC9E000A8DC5D17A7B6F0D079D784B6D90193F6E3EE7EA0EABFC6F68C52B37CBCE8218AFA3670A80BC17B95D7B40536226358F04ACD92A1BE15B26A4E5817E628BA679B3527203CD3632628EC83AA4F2186D2F005D5DFE6F7FDB4FEDAC9E89D666E303BB568306156C56F09534E25C619AB3B95018F4896BACAA4834F6D2D8FE14A938AA10E53054F0008444AC2EEA2538C1230E6A18C92B01D9147FDCEFC9C8DAC1D4ECC8CF1F962EFA1B8CD3C969000B7EBAC598DCA45EB40BCFB19851483851CF340F3E8C237A9EFF1C9F21E4975541C61A8FEF2AC6057F59DCB23A80E80610CD85DB203C35D24BC82B9CD78246F59FEBB24832D7CD664C995188E0281CD7867900DC0DF44D409080268B79E95682885F228770734FA53518EC80CE2306CE1448524EF0184303D450C76EA63B733EB0C8DC48BF12423AD23889CFCDD891E5950047240DC0C38AB2DBC165B81E631002EA6F74119E27F9F86073BF2DF710818676980C4CB6BD53F9A5721778B89F59C68C8935F5031C8A93367D717057FD4D5EFABEDE702CC645EFB6D7F44C860FFF7637AAD972248C844D15133920073891C3135D297868B7DA86F097D8FB39C13BA14C4F247516ABA4C5F8CE3818482C8FF60CCA51FDB2CEE96BC1138DC04A86F857727591AAE6F87C30059B3E81B68055B24EA2FA983686498BFC9D9E7D595079EB646E85B212CEDD21D0087E0F2AF663EB772A9847B1DF2197AF13626B897C24637AF5BFE81816A8C90D3048375B699497143E577185A70E115058A3A9112B2C4351B6CAD009282B4F7CB8BDFC285777D7DFE8F5000000000000000000000000000000000000000000000000000000000003060B11171F272E +message: 14426334940960773BFF65F08D1DE489C4C3ED36 +rho: 2D1E6BED8452EBF126EDE70CA0A2B50D03342D5B13B2AE210F4562A3BF670CB1 +t1: [[348, 378, 978, 139, 754, 152, 932, 910, 784, 684, 26, 237, 110, 286, 45, 869, 309, 180, 167, 202, 72, 51, 450, 821, 909, 527, 845, 596, 85, 840, 956, 179, 371, 954, 512, 557, 812, 527, 890, 838, 377, 831, 141, 519, 273, 562, 30, 453, 233, 732, 313, 357, 51, 185, 873, 518, 668, 154, 729, 651, 90, 497, 880, 105, 399, 315, 635, 71, 507, 738, 958, 893, 716, 378, 956, 312, 1012, 986, 998, 902, 306, 490, 733, 722, 822, 697, 724, 413, 785, 992, 794, 104, 378, 140, 436, 6, 801, 133, 853, 533, 759, 996, 832, 552, 361, 516, 424, 9, 520, 877, 566, 31, 403, 1004, 531, 855, 379, 118, 885, 683, 192, 653, 905, 373, 806, 118, 783, 679, 30, 983, 249, 669, 67, 279, 660, 270, 241, 78, 81, 949, 235, 647, 88, 952, 1023, 42, 706, 984, 556, 507, 39, 217, 574, 889, 233, 278, 527, 829, 919, 392, 982, 511, 969, 246, 514, 1013, 173, 213, 986, 591, 584, 546, 307, 179, 271, 962, 1001, 973, 594, 661, 392, 857, 15, 273, 429, 578, 288, 682, 533, 935, 894, 175, 781, 745, 940, 376, 266, 443, 989, 521, 651, 1006, 604, 635, 740, 728, 666, 429, 186, 372, 670, 750, 543, 86, 517, 1003, 93, 885, 228, 770, 988, 400, 496, 143, 615, 684, 548, 1006, 885, 139, 392, 275, 228, 944, 348, 632, 575, 309, 779, 381, 59, 436, 997, 40, 890, 274, 1017, 746, 769, 778, 185, 582, 565, 764, 205, 561], +[653, 949, 142, 407, 909, 380, 400, 761, 826, 453, 810, 65, 86, 965, 910, 774, 190, 70, 177, 920, 112, 638, 595, 458, 381, 510, 948, 691, 1021, 199, 796, 205, 88, 337, 305, 499, 659, 11, 295, 1002, 699, 60, 477, 150, 964, 691, 900, 946, 446, 727, 1016, 657, 892, 874, 634, 123, 915, 160, 105, 122, 397, 261, 458, 364, 322, 649, 989, 88, 979, 164, 95, 322, 646, 386, 856, 428, 788, 1002, 549, 832, 975, 768, 695, 723, 14, 491, 552, 262, 66, 104, 306, 2, 950, 977, 358, 834, 321, 244, 236, 240, 594, 372, 692, 426, 487, 360, 990, 463, 709, 864, 521, 393, 395, 475, 968, 547, 668, 975, 750, 682, 182, 519, 737, 863, 593, 390, 73, 591, 293, 193, 61, 246, 984, 396, 321, 272, 648, 1016, 74, 947, 89, 134, 913, 614, 449, 1010, 789, 484, 768, 384, 159, 343, 532, 618, 130, 480, 804, 875, 401, 74, 310, 694, 404, 323, 751, 793, 1023, 977, 956, 14, 874, 1015, 754, 664, 604, 630, 299, 533, 827, 752, 678, 350, 490, 900, 788, 279, 553, 883, 1008, 854, 59, 29, 472, 44, 30, 254, 132, 21, 1017, 142, 601, 804, 595, 610, 427, 607, 297, 963, 749, 739, 144, 639, 175, 236, 721, 799, 221, 110, 806, 29, 61, 371, 819, 641, 207, 579, 1005, 589, 988, 536, 43, 946, 244, 908, 60, 585, 746, 535, 141, 647, 492, 798, 749, 402, 980, 716, 318, 561, 508, 594, 1015, 490, 296, 921, 193, 854], +[33, 940, 168, 695, 760, 677, 393, 66, 256, 845, 390, 617, 239, 289, 104, 458, 442, 563, 611, 601, 667, 240, 776, 406, 961, 1002, 572, 561, 813, 176, 804, 502, 246, 46, 991, 152, 801, 931, 234, 601, 498, 405, 966, 446, 1005, 633, 305, 567, 448, 371, 517, 380, 528, 690, 157, 948, 657, 210, 820, 844, 386, 772, 757, 372, 492, 307, 917, 435, 484, 185, 655, 753, 1001, 137, 475, 808, 437, 307, 16, 120, 402, 445, 31, 536, 43, 8, 434, 706, 761, 597, 829, 852, 10, 763, 833, 827, 722, 172, 332, 255, 410, 393, 231, 166, 647, 276, 102, 298, 933, 670, 277, 458, 622, 879, 822, 41, 397, 226, 37, 206, 112, 17, 994, 898, 944, 390, 775, 268, 933, 982, 696, 506, 440, 984, 53, 449, 539, 70, 535, 345, 1017, 68, 675, 400, 51, 5, 384, 458, 748, 524, 152, 1004, 612, 849, 355, 9, 729, 221, 685, 578, 271, 47, 927, 603, 835, 158, 406, 152, 546, 218, 281, 946, 7, 333, 559, 200, 435, 409, 518, 431, 785, 479, 505, 106, 649, 913, 252, 758, 1021, 779, 988, 764, 1010, 288, 778, 900, 514, 540, 847, 921, 545, 485, 535, 351, 906, 957, 825, 198, 175, 374, 380, 131, 476, 1023, 924, 25, 783, 327, 78, 246, 11, 231, 123, 687, 440, 60, 268, 727, 455, 128, 238, 236, 687, 799, 74, 361, 117, 660, 864, 113, 787, 374, 322, 55, 281, 797, 36, 868, 1011, 887, 950, 830, 583, 937, 874, 839], +[251, 317, 347, 845, 933, 97, 346, 1005, 447, 435, 543, 402, 599, 324, 423, 70, 675, 179, 772, 529, 852, 164, 529, 235, 527, 702, 812, 151, 401, 892, 244, 530, 433, 365, 707, 934, 897, 285, 211, 445, 93, 837, 921, 902, 1008, 783, 627, 695, 584, 825, 280, 537, 756, 274, 267, 611, 748, 910, 692, 354, 47, 898, 425, 629, 69, 12, 91, 894, 842, 185, 105, 803, 792, 548, 224, 619, 652, 120, 217, 582, 855, 478, 131, 515, 418, 12, 209, 312, 495, 468, 320, 570, 248, 783, 739, 852, 515, 521, 811, 509, 185, 495, 349, 786, 49, 770, 766, 953, 785, 43, 556, 946, 215, 754, 992, 86, 430, 498, 993, 222, 226, 208, 600, 889, 691, 275, 347, 716, 92, 389, 511, 677, 31, 348, 571, 588, 376, 494, 916, 119, 555, 839, 792, 150, 382, 377, 968, 88, 159, 180, 636, 557, 525, 180, 231, 465, 304, 1016, 906, 410, 971, 980, 77, 1007, 421, 219, 800, 699, 238, 932, 383, 195, 943, 524, 153, 940, 885, 945, 131, 191, 743, 968, 757, 40, 189, 169, 130, 162, 281, 205, 296, 536, 750, 284, 619, 548, 815, 113, 737, 885, 20, 166, 626, 463, 574, 446, 852, 997, 320, 304, 552, 752, 629, 461, 44, 846, 686, 859, 1008, 446, 963, 466, 150, 101, 1011, 146, 801, 527, 509, 398, 69, 21, 58, 649, 854, 420, 786, 307, 318, 1018, 38, 435, 29, 640, 74, 545, 474, 532, 998, 992, 960, 920, 621, 756, 796, 82], +[140, 59, 817, 398, 75, 359, 287, 896, 761, 993, 630, 770, 315, 359, 370, 339, 202, 848, 612, 744, 625, 355, 850, 671, 995, 358, 514, 508, 297, 385, 635, 80, 791, 409, 258, 692, 675, 193, 992, 523, 389, 87, 64, 308, 224, 537, 899, 376, 643, 71, 418, 230, 2, 638, 671, 533, 338, 825, 686, 689, 662, 481, 138, 422, 437, 941, 55, 116, 169, 666, 92, 61, 249, 389, 957, 829, 924, 960, 278, 871, 367, 832, 899, 975, 785, 636, 370, 576, 1000, 870, 398, 621, 240, 495, 940, 978, 96, 690, 778, 720, 559, 968, 312, 691, 536, 496, 75, 495, 561, 999, 992, 629, 191, 245, 38, 559, 27, 22, 821, 332, 365, 734, 907, 55, 913, 588, 125, 924, 432, 288, 845, 286, 865, 36, 959, 419, 956, 70, 36, 983, 67, 908, 871, 997, 945, 424, 333, 155, 1002, 349, 295, 488, 200, 716, 249, 279, 190, 861, 167, 558, 492, 123, 609, 647, 209, 110, 271, 694, 621, 410, 332, 933, 475, 811, 372, 230, 200, 310, 660, 106, 567, 901, 647, 277, 780, 46, 833, 699, 910, 586, 934, 599, 318, 617, 284, 846, 1009, 616, 1016, 576, 902, 740, 785, 643, 905, 177, 575, 348, 724, 995, 338, 455, 717, 77, 271, 718, 664, 591, 673, 803, 527, 836, 1017, 354, 237, 759, 422, 486, 132, 63, 207, 781, 436, 515, 939, 565, 429, 29, 340, 855, 222, 690, 924, 248, 69, 825, 843, 207, 234, 89, 494, 593, 322, 740, 970, 266], +[810, 44, 525, 141, 974, 917, 1016, 695, 930, 266, 406, 595, 160, 992, 224, 322, 23, 834, 353, 828, 81, 628, 651, 728, 857, 571, 199, 807, 406, 702, 124, 490, 494, 374, 481, 893, 93, 175, 396, 921, 516, 507, 449, 719, 249, 612, 143, 202, 414, 744, 461, 224, 854, 20, 777, 420, 558, 20, 704, 972, 271, 53, 744, 8, 347, 998, 219, 71, 18, 729, 357, 793, 522, 569, 627, 311, 289, 569, 905, 629, 998, 50, 838, 186, 228, 422, 181, 695, 486, 247, 837, 791, 615, 1000, 521, 370, 892, 318, 418, 669, 114, 500, 574, 969, 861, 559, 669, 967, 107, 621, 610, 162, 998, 228, 125, 730, 217, 591, 211, 938, 40, 432, 985, 980, 194, 591, 802, 515, 545, 226, 464, 402, 760, 110, 24, 887, 162, 674, 66, 186, 316, 237, 336, 950, 682, 155, 766, 377, 153, 207, 742, 739, 591, 153, 883, 265, 547, 589, 146, 706, 1005, 151, 431, 405, 870, 143, 189, 290, 360, 793, 525, 707, 706, 220, 791, 659, 710, 789, 466, 865, 198, 87, 228, 195, 393, 598, 362, 279, 150, 948, 952, 149, 992, 708, 1007, 499, 1002, 508, 214, 712, 410, 776, 227, 615, 373, 234, 225, 979, 547, 283, 6, 192, 135, 796, 729, 390, 385, 924, 336, 102, 550, 370, 661, 452, 665, 553, 736, 338, 344, 861, 60, 575, 995, 96, 92, 393, 436, 675, 620, 9, 234, 333, 464, 609, 63, 398, 462, 824, 595, 582, 1021, 352, 748, 517, 82, 981], +[568, 563, 52, 541, 29, 655, 500, 23, 755, 599, 994, 665, 46, 895, 493, 997, 832, 6, 42, 649, 309, 645, 144, 868, 583, 978, 771, 234, 426, 454, 574, 491, 290, 995, 437, 29, 65, 851, 547, 694, 46, 343, 711, 963, 332, 708, 258, 474, 414, 390, 233, 604, 350, 611, 369, 716, 703, 310, 984, 795, 722, 972, 902, 654, 944, 323, 409, 791, 38, 84, 337, 456, 702, 752, 289, 72, 380, 41, 391, 679, 394, 494, 695, 867, 727, 614, 885, 376, 993, 275, 854, 706, 335, 630, 998, 707, 573, 450, 847, 548, 739, 1006, 638, 799, 444, 483, 652, 339, 643, 187, 774, 143, 152, 982, 48, 742, 109, 310, 884, 741, 964, 739, 816, 638, 596, 193, 778, 217, 982, 956, 694, 108, 875, 916, 767, 985, 540, 716, 663, 848, 480, 151, 909, 70, 628, 753, 400, 797, 412, 492, 697, 769, 622, 222, 220, 973, 995, 867, 711, 112, 270, 76, 885, 82, 122, 110, 883, 285, 112, 709, 291, 494, 95, 891, 885, 475, 961, 885, 866, 754, 409, 416, 397, 413, 113, 143, 383, 802, 432, 636, 222, 58, 22, 828, 556, 488, 57, 953, 263, 745, 513, 325, 721, 365, 852, 217, 613, 17, 446, 769, 748, 976, 10, 559, 302, 965, 605, 830, 706, 994, 106, 926, 441, 493, 782, 278, 891, 478, 205, 607, 876, 339, 887, 38, 753, 480, 693, 746, 324, 782, 436, 383, 510, 669, 1015, 303, 709, 138, 862, 391, 354, 364, 357, 892, 54, 132], +[870, 615, 877, 915, 639, 882, 305, 287, 265, 347, 479, 675, 612, 345, 970, 365, 262, 803, 633, 733, 818, 384, 678, 103, 456, 998, 915, 47, 984, 446, 304, 1006, 163, 412, 734, 173, 800, 590, 777, 69, 432, 756, 325, 906, 651, 938, 1010, 6, 887, 659, 631, 575, 388, 891, 731, 638, 101, 41, 37, 489, 71, 413, 204, 800, 666, 704, 880, 872, 801, 113, 425, 803, 1015, 361, 996, 193, 976, 98, 880, 324, 864, 768, 777, 108, 352, 596, 602, 929, 167, 179, 746, 998, 315, 1013, 34, 770, 544, 943, 268, 646, 553, 896, 996, 659, 690, 126, 626, 60, 398, 877, 686, 681, 485, 598, 674, 790, 409, 489, 375, 166, 599, 793, 64, 491, 964, 952, 892, 173, 191, 324, 720, 924, 493, 556, 587, 294, 65, 318, 152, 995, 958, 452, 97, 421, 660, 597, 834, 439, 738, 273, 71, 973, 528, 218, 935, 159, 156, 700, 2, 42, 516, 31, 978, 310, 898, 514, 451, 238, 182, 554, 598, 226, 332, 189, 199, 129, 844, 123, 619, 646, 446, 174, 999, 216, 477, 631, 125, 31, 712, 957, 179, 778, 870, 800, 188, 270, 967, 695, 589, 34, 428, 147, 941, 618, 236, 751, 723, 873, 749, 627, 160, 685, 856, 255, 695, 100, 102, 526, 909, 958, 196, 714, 667, 390, 855, 292, 476, 639, 256, 894, 544, 793, 374, 500, 514, 902, 140, 389, 748, 627, 409, 1, 769, 338, 173, 301, 379, 40, 711, 964, 311, 94, 604, 135, 603, 72]] +cTilde: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE +z: [[188751, 61938, 337178, 225707, -328924, 176385, 137358, -12062, -240144, 198132, -399439, -26218, 86087, -406905, -211854, -216537, 97110, 206914, 486783, -28733, -447293, 229762, -64256, 294419, -8476, -314233, 444479, -206620, 290001, -115733, -246088, 116524, 288497, 363514, 496033, -87222, 510524, -448674, -248363, -128017, 498813, 464545, -462116, -178662, -232977, -372020, 343282, 365590, -41128, 60039, -341564, -276125, -318798, -124434, 514424, -325399, 72290, -143562, 447212, -460351, -101661, -296615, 274608, 129425, -45944, 147535, 494639, 37754, -379337, 1888, -142401, 126184, 268437, 161974, 240527, 59288, 93092, 429150, 234317, 370278, 62395, -366757, 347692, 249844, 237836, -103192, 350641, 440659, -437531, 72551, 418304, 433047, -284618, -483472, 339912, -289766, -144263, 357261, 314312, -505829, 310688, -14303, -338423, 323931, 524075, 291991, -71500, 426254, 10848, -263432, 232189, -400977, 296926, 152635, 188765, -445417, 413385, 92123, 315866, -370090, 9649, 6617, -514797, -95610, -369435, 19354, -239897, 407152, -218578, -198557, 112619, 326360, 141775, -191260, -184207, 457671, -116923, -18241, -234162, 475165, 453358, -363594, 490554, -43161, 311595, -226963, 442619, 468805, 507769, 349945, -342877, -362771, 439011, 8049, 140041, -440384, 39972, 275539, -12557, -157407, -64960, 147184, -456275, -266218, -39554, -146726, -405060, 301954, 119440, 468970, -143458, -297160, 416214, -481314, -455832, 298412, 84719, -32893, -69053, -495846, 157041, -395581, -61244, -301971, -497783, 452973, -72378, 303237, -338153, -51772, -386563, 120774, -418036, -328906, 495884, -446176, 346508, -99137, 52821, -121470, 373453, -162423, 134162, -423195, -274829, -193227, -267259, -150217, -236759, 185384, 231235, 108273, 344567, 37260, -321082, -101258, -89640, 269524, -157544, -293062, -22602, -48556, -332265, 190722, -26171, 51456, 132336, -367796, 499843, -179503, -421795, 270468, -510790, -270359, -451535, -427656, 505265, 433773, 461358, 344703, -420169, 464981, -444060, 143376, 30966, 382079, 29565, 251145, 151290, 490414, -373403, 264531, -4848, 436660, -499899, -347508], +[-159980, -204599, 55937, 105355, 5647, -394114, 257950, 137041, -415218, -494544, 304038, -95306, -335311, 44124, -280710, 429026, 310492, 195096, -507537, 32696, 337629, 352058, 123691, -172313, 378386, 77333, 5014, -37064, 73195, 88970, -192080, -91548, -128802, 310880, 245822, 505023, -448809, -496613, -454031, -83779, -258103, -146244, -414263, 485758, 192260, -401460, -308307, 510735, 86271, 47116, 183853, -16290, 232977, -136274, 460175, -478900, -415206, 220077, -9726, 405466, -76331, -444625, 460901, -360338, 360145, -426165, -484980, -329482, 127474, -495864, -118955, -276355, 185884, 427349, -163769, 307559, -361800, -513763, 488938, -310371, -384744, -53890, -140442, 350754, 318632, -17075, 54019, -141630, 267221, 226940, -517844, -234416, -417223, -31495, -360478, -198163, -423038, 127623, -307826, -223351, 430947, 125920, -477174, -51850, 188849, 43604, 258139, -121979, 486356, 273140, -331186, 393345, 227230, -49543, 166947, 312312, -252545, 206757, 218806, 104513, 291773, 180236, -24303, 238921, 441077, 362224, 330102, 18770, 433058, 32938, -493049, -301074, 64766, -479548, 264527, 172292, 356212, 76525, -352909, 375313, 134940, 425857, -158709, -132501, 273143, -186585, 93867, 212481, 91547, 368553, 507409, -160498, 2331, -396636, 212816, 187460, 432565, 154937, -21372, 195380, -81592, -56475, 208849, -285848, -401394, 252034, -61414, -257212, 59305, 499509, 359891, -28574, 422413, 434561, -121993, 374665, 368075, -119578, 393092, 182549, 290018, 243636, 29599, 51826, -515663, -290060, -14213, 455582, -423936, -519668, 478249, -399459, -251496, -407100, 275750, 330401, 42104, 120796, -417502, -321073, 111494, -334166, 182247, 151997, -299367, -341032, 460645, 183416, -471344, 19776, -270073, 355354, 491081, 63091, 102974, -43991, 259614, -291516, -208195, 432949, 40110, 116139, -453710, -284989, 76771, 495859, 184741, -341932, 97611, -87350, 210793, 175425, -466215, -432390, 330106, -88280, 464738, -441776, 309041, -145074, 55842, -445954, 351324, 214468, -318908, 283722, -300700, -398269, -119568, 104124, -493026, -101287, -342546, -68518, -427796, -434759], +[472356, -192388, -438932, 299729, -320971, -391835, -117728, -494090, 310942, 159357, 469255, -206972, -122486, 68772, -126751, 156874, -64505, -17571, -273666, 517250, -55816, 278884, 474186, 308224, 473505, 496636, 398358, 445156, 315519, -366555, 120210, 116160, 78161, -130134, -160141, -522772, -20297, -235248, -56042, 117679, -40394, -200840, -6508, -184906, -425349, -415005, 215288, 306912, -327923, 27954, 321380, 294830, -489109, 277604, 282450, 267347, 138162, -145275, 33821, -361970, 386811, -72420, -386388, 305205, 132896, 285399, 85975, -191358, 410080, -482802, 332697, -521512, -184411, 196278, -319765, 411999, -269204, 518292, 261185, -468009, 106240, -365961, 442160, -323490, -371563, -361621, -179415, -271977, -278458, 469859, 238427, 489861, -387896, 376718, 347813, 514126, 292278, -430981, 160190, 256646, 36394, 87590, -381460, -504119, -184409, 377251, 255074, -29212, 493381, 519282, 417763, 265363, -501712, 366488, 85986, 4638, 509417, -266185, -56599, -147287, -81453, 291614, -95813, 453286, 150346, -382702, 111871, -102513, 58947, -360279, -407966, -60073, 166613, 311620, -27734, 263315, 438721, 354328, -354314, -127470, -158684, -405903, 164379, 382992, 89350, -221439, 371148, 432809, -62558, -11537, 8710, -129935, 511875, -280209, -55429, -37710, -431060, -451947, 244772, 522195, -204541, 94110, -465671, 126149, -141369, -70428, -193035, -58158, 301912, -457121, -137849, 185367, -78355, 9932, -36008, -265540, -135197, -21608, -469421, -316141, 359615, 360424, 192956, -54142, 406933, -387462, -240009, 242761, -369224, 284632, 507817, 71738, -39017, -502073, -141694, 182455, 271144, -373947, 131458, -293641, -463907, 222018, 63172, -329661, -301841, -274218, -228398, 156452, -92799, -520160, 24353, 275766, 148848, -475543, 106495, -507221, 513215, 470310, 274619, 271761, 397770, 94642, -518886, 285070, 392582, -210617, 280040, 409881, -332588, 217353, 268231, 163856, -86837, -289374, 58710, -303633, -276564, -391959, -391864, 365961, -175794, 241577, -147515, -414096, -21042, -276951, 236768, 160990, -493131, -139265, -522576, -380313, -348541, -159091, 326566, -210144], +[119491, -92741, -158387, 327509, -516872, 291824, -362532, 67099, -334440, 337049, 465955, -344501, 363257, -314926, -445449, 101144, 364030, 451968, -501104, -267431, -508312, -89079, 274757, 223523, 476880, -501957, 95426, 176545, 58391, -417133, -209714, -186651, 125496, 507481, -319029, 98788, -478246, 310046, -408884, -488865, -321212, 18000, -517502, -108333, -253197, 65948, -457602, -262853, 195717, 452760, 754, 193188, 147930, -267751, 53520, -353828, -514801, 405683, 367634, 238523, 137673, 480680, 306169, 19946, 264302, -364739, 274647, -219838, 87300, -78338, 30123, -205616, 354947, 39008, -228766, -474139, 490386, 216319, 304803, -444039, -353066, -427106, -194754, -279230, -436047, 45242, 289045, 260534, 318565, 216026, 490097, 506832, 106067, -252215, 292669, 352308, 410271, 395861, -467035, -448862, 97127, -80681, -492161, -237119, -191015, -483897, 291518, -26061, -116753, 430541, 350743, -300995, 490774, 386635, 79524, 406554, -477304, 339042, 276831, -145055, -140598, 435693, -486699, -163244, -384458, 403036, 286888, -458039, 278769, 329600, 214562, -224084, -516815, -218790, -79890, -50514, -488268, 98122, 80006, -2096, 425986, 82970, 466112, 19233, -492086, 115328, 478423, 513583, 498708, -511657, 481396, 346781, 259992, -512578, -232873, -247360, 248681, 118597, -189431, -40807, 329974, 328292, 266631, -437450, -461510, 498810, 329582, 173296, -424042, -13663, -73983, -162922, 78657, -123816, 433541, 432944, -122373, -218360, 204155, 254051, -122901, -24146, -158334, -38704, 303321, 274219, -249728, 384518, 313251, 375341, 28313, -44361, 226815, 11901, -441571, -85484, 160001, -262988, 219347, 156350, -419469, -170073, 192826, 200172, 236118, -150884, -400509, 258700, 436835, -465531, 152043, 285631, 118500, -332800, 253162, -457016, 7618, -231864, -335686, 51577, 233372, 50339, -83374, -481588, -405554, -308049, -519838, -167917, -109615, 182412, -86263, -212769, 512848, 218265, 420521, 365517, -469511, -328124, -499882, -94377, -227467, -250410, -6497, -338143, -29397, -121119, -85831, -188885, 12641, -300340, 132219, 372670, 432654, -172022, 311484, 96414], +[-60319, -322628, 244143, 88800, 325104, 470017, 444605, 252403, -115746, 282723, 235122, -343246, -92518, 143168, 192773, 252775, -261929, -311817, 414543, 414840, -185910, 468909, 314405, -173267, -476753, -516971, -426008, -439217, -256464, 408095, -31486, -21097, -128010, 411693, 11513, -414107, 345989, 251149, -376884, -346620, -493579, -371938, -97939, -371247, -219428, 140110, -452635, -461907, -245053, 312129, 159651, -134285, -386350, -58627, -188085, 411292, 159851, 134681, 351863, -88205, -252835, -456231, -385354, -504454, 353416, -184371, 105692, -233133, 496326, -138466, 505295, 265554, 264458, 220843, 310047, -26642, 440543, 299996, 294636, 287800, 204882, -97700, -406007, -308188, -500833, 197092, -165022, -176218, 189668, 392743, 306667, -503715, 430863, 476193, -123311, 139671, 314282, -416757, 41123, -201892, 27643, -164749, -1729, 91950, 99632, 128895, 302316, 386081, -295238, 55239, 125843, 488820, -112697, 167753, 334058, -274279, -207692, 342034, -490483, -181283, -411613, -317635, -346302, 493852, -422832, 426819, -49994, 332869, -347893, -397206, -160032, 481777, 42523, 65866, 446608, 157417, 70672, -280000, -18528, -423774, 441649, 333097, 460326, -108577, -136182, -510107, 513439, -192464, -97107, -426912, 6453, 511781, -457217, -168242, -276502, -444705, 306764, 264470, 18520, 392349, 298560, 311206, -183277, 453644, 190671, -352298, 119385, 17282, -456379, -22938, 86886, -74926, -210828, -281892, -76389, -227308, -184900, -321289, -369065, 444663, -162633, -93036, -475953, -334307, -8446, 159553, -57731, -223410, 409950, 268983, -31188, 136270, 447162, -265872, -196535, 78833, 331504, 274619, -106034, -44536, -170361, 28522, 117110, -254983, -374175, 361245, -134077, -461242, 475359, -511265, 304130, 8239, 405116, -265916, 70468, -32002, -250240, 231021, 448921, -503302, -503391, 150762, 400275, -272000, 320203, 257538, 299777, 367835, 279327, -405390, -241430, 209309, 380055, 103929, 35407, -324207, -222413, -101090, 421374, 107332, 57376, 114032, -110602, -101552, -273801, 258074, 183293, -425445, 117968, -400731, -481692, 259927, 413426, 10972, -375794, 192771], +[-251323, -173407, 262818, 490021, 353450, -403824, -70728, 16618, -46471, 87760, 435044, -106625, 465687, -285867, 289932, 508791, -94436, 409773, 344740, -301668, 287007, 274580, -12835, 96386, -155817, 425937, -227947, -73762, 456347, 52127, -484100, 296771, -140383, -251962, 320044, -507969, -374063, 460270, 135905, 490858, 357169, -207093, -89954, -295923, -504775, 238893, -382138, 273529, -459820, -426796, -475655, -338229, 456907, -207730, 223499, -219366, -211169, -332854, -261422, -403709, -289347, -57982, 169753, 378025, -345029, 226927, -95063, -248541, -333008, -247933, 328856, 229656, 187829, 285638, 394759, 307255, 239438, 442893, 91639, 94380, 142929, 317967, -105755, -265882, -214883, 396342, -194393, -352494, 309297, -196251, 34203, -113386, -206584, -121184, 217628, -167218, 158258, -329598, 191676, 204704, 345849, 144262, 507076, -319992, -407223, 363553, 270053, -521919, -386248, 218349, 121834, -437159, -210077, 453338, 77653, -200832, 134310, 283029, 327936, 399143, -369057, -501592, -224380, -221425, 184793, -519221, 373378, -413780, -461519, 423823, 242128, -216865, -349388, 298941, -137780, 433388, -436481, 169694, -228715, 113617, 429848, -166718, -322933, 286709, 517802, -44279, -368486, 93773, 95192, 156100, -141518, -497244, -452826, 45908, -334908, -506360, 391083, -13480, -254817, 416717, -171566, 30311, 77241, 274866, 331645, -402978, 37484, 75985, 72876, -314526, -486875, 118477, -442694, 252527, -500199, 472997, 222930, -323499, 459403, 92028, -299059, -511191, 7923, 391423, -365617, 401407, -288810, 31405, 248835, 343531, -121322, 406538, -402305, -294601, -261492, 272256, 332274, 457544, -489912, 14580, 38734, 383916, 385530, 448583, 449469, -287060, -256361, 347522, 219552, 417964, 70417, 490688, 42826, -70372, 24223, -513103, -464486, -188617, -439350, 28110, -452811, 190751, 199264, 425645, 90034, 361696, 380149, 299858, 271540, -191139, -130935, -374077, -356409, 473964, -503017, -332502, -434631, 47592, -174361, 294982, -205799, 89543, -422987, -411196, -503200, 141217, 100147, -58463, -330614, 351777, 303431, 279544, -306799, -286000, -454350, 93746], +[173743, 304586, -456700, -174088, -103283, 387773, -202535, 269632, -396257, 484704, -378778, -357578, 229522, 431074, 236978, -3679, 81795, 36368, 153372, -357002, -79632, -307973, -23413, -515058, 488302, -214971, -329633, -244908, -35376, 469420, 203356, -261527, 194730, -370751, 48957, -78349, -242159, -80882, -397121, -302929, 234415, 379689, -453653, 483319, 408179, 18515, 62097, 30256, 496309, 265831, 49554, 463186, -523435, -284294, -210731, -11500, 282856, 481670, 17280, 140399, 311173, 367067, 225483, -367296, 451798, 367170, 399964, 120856, -108171, 185545, -328562, 318612, -36450, -148396, -334066, 523530, -417117, 2305, -348123, -125646, 76151, 508362, 305477, 438168, 502164, 308897, 434974, -211366, -20665, -40769, -175211, 310134, -54006, 438291, -145577, -413962, 502736, -16399, -437316, 368990, 278216, 89886, -248088, -364562, -294676, -302845, 402744, -445772, -511944, 333471, -269306, -302392, -196713, -239584, -301253, 136627, -461748, -101148, -18513, -324883, -397108, 378685, -499322, -127439, 7135, 256679, -465606, 348424, -460230, -378263, 509262, 495992, 144112, 389704, 379588, -296125, 25557, 235475, -237557, 226514, -382770, 211348, -20889, 356856, 76004, 522344, 258596, 260897, 98160, 26446, 370967, 132984, 489694, 198857, -13733, -3777, 121906, 439072, -414280, 422140, 261309, -292109, -239214, 268493, -313520, -259213, -147986, 291549, -380809, -73100, 485915, 375696, 278515, -207020, 146981, 398458, 389021, 65888, -397684, -496249, 302856, 336905, 454409, 38808, -265368, -252772, 132781, 428246, -505976, -288153, 161396, 508077, 292324, 11415, 36751, 204843, -457310, 61973, 145876, -225012, -324823, 460700, 35073, -367267, -271474, 206776, -70421, 495101, 290504, 143044, -30761, -371574, 3962, -507273, -246073, 210413, 187313, -176487, -50596, 291601, -280600, -485618, 407028, -208853, -256462, 443370, -180365, -493668, 167337, -174359, -325862, 503033, 442725, -2920, -438869, -502308, 117096, -46232, -433660, 157735, -227664, 72114, 347515, -384225, -53281, 460832, 264662, 33098, 26582, -391956, -497441, 122566, -297323, 118201, -521594, 422261]] +h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], +[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] + +Proper number of hints provided. Provided: 46, expected: <=75 +||z||: 524075, ||z|| check passed +aHat: [[[6280731, 6739178, 1147796, 1070275, 2318684, 8332619, 369570, 1541265, 252050, 1572241, 7588397, 5443222, 7402198, 4049585, 2006554, 1498712, 8038694, 6002385, 6437014, 1552956, 595143, 931734, 816621, 3217424, 4044351, 3618795, 6599232, 6896932, 2083659, 1659028, 1262265, 7507458, 7675420, 434998, 6607470, 5575522, 2400889, 2730184, 8326754, 5525230, 5235746, 7779704, 749859, 7097752, 1937920, 3391441, 5941586, 6463690, 5428352, 6198831, 3090339, 278211, 3374725, 4257852, 7844464, 3419492, 7551627, 6083042, 5034903, 3160, 4577274, 3131542, 3034352, 7688245, 2991971, 3985474, 2672551, 2089580, 6992066, 3194074, 1998734, 1407270, 5942949, 3013678, 1596853, 1413765, 600890, 7466466, 5297315, 1932678, 651008, 5861578, 7407516, 5912615, 5367487, 2634045, 4315958, 3938521, 244716, 2273963, 8079820, 5341809, 6090711, 5228215, 1011427, 3299247, 7116577, 294374, 4074242, 4660818, 2607199, 6198431, 5916523, 5433191, 196273, 4318190, 5480767, 4619094, 3262223, 8190474, 6615132, 3198853, 3611727, 5907696, 4852227, 3414154, 2233121, 5866172, 2082338, 4767901, 731574, 2221999, 161939, 1186007, 5166042, 5865429, 8153579, 3932836, 2158462, 4205928, 1231221, 1302194, 4488613, 4139700, 3129980, 7451095, 3274107, 960945, 2769158, 1238142, 5636500, 1021077, 1291908, 3003308, 4244937, 6203226, 3389472, 4815508, 772312, 1113040, 4332147, 985311, 7566764, 2439545, 7941797, 6979091, 6256269, 7561130, 6021529, 3746076, 2192559, 219883, 2758409, 3326660, 4524781, 1746724, 7897868, 7510548, 2624256, 3404175, 102052, 4576400, 6498163, 143615, 2787695, 5835460, 759025, 1526712, 897465, 6008965, 7500786, 5287321, 7430364, 5781555, 4452568, 2317844, 7170911, 3124300, 3651318, 1499591, 7338407, 4048259, 81619, 2709957, 2064961, 2357869, 2854349, 2754839, 5813517, 7202624, 6213307, 7084194, 4703155, 6318247, 1927224, 2665178, 6381990, 7916962, 1501229, 679226, 5568947, 4751975, 5143972, 6249259, 4688093, 1463452, 1562804, 7923687, 6513949, 5485162, 8242725, 1388102, 5200849, 1620703, 7899432, 4375901, 6314621, 210581, 886021, 2399785, 6839765, 7217273, 8214070, 6432190, 1097681, 4463688, 4981226, 7950086, 2383576, 5127117, 2080303, 6394615, 3373883, 3314611, 2145532, 3474673, 5366669, 2103489, 6295818, 424747, 3465410, 1263184, 7811788, 2165577, 4771092, 5799399], +[3513950, 7886931, 2583784, 2934523, 7407054, 2649787, 314197, 2515218, 3532081, 4066319, 6686305, 5891566, 5963499, 139438, 7455907, 3949103, 1828671, 4337405, 7066663, 7043340, 4818884, 6034821, 5173665, 2186779, 2350974, 594438, 6195380, 8241088, 807406, 5843013, 8192760, 2845268, 1073211, 735641, 3979851, 5486481, 4578786, 6997516, 2084655, 6871391, 5237102, 3790032, 2186638, 6294104, 3246391, 1496716, 5847415, 2000372, 409964, 2059709, 471482, 2087474, 1987355, 1990371, 5923450, 2103662, 4603503, 4394075, 3187714, 1775971, 3076945, 245259, 2720069, 3561945, 8373226, 3830548, 4319488, 1849242, 1745672, 1087211, 4109887, 2791981, 1773272, 1525046, 7947705, 6201278, 3228305, 1545049, 1332479, 2144938, 644389, 2563663, 8006624, 1037931, 8142744, 737191, 7501529, 915249, 838643, 5867698, 2042908, 395960, 4066102, 5415545, 2729821, 4546112, 7891620, 5028591, 6622194, 1837295, 6287784, 1324106, 866961, 1979925, 6381017, 5214627, 7525442, 898366, 1733121, 4692528, 4355628, 1532039, 6093390, 6044858, 1764302, 904866, 711095, 345567, 5395855, 4664554, 2280668, 2303090, 3188584, 2593957, 968210, 616222, 7976615, 7194377, 8090477, 6906209, 8127633, 1134633, 8189847, 1960320, 6865240, 7853224, 1743830, 2366492, 8047435, 3171930, 6642750, 7523211, 5209695, 4582882, 5262419, 6222357, 6562848, 5545946, 4632594, 4878424, 3001136, 7600978, 4421646, 5233757, 2619150, 7295442, 4269427, 7628778, 5900659, 3095391, 4313103, 4289081, 2534015, 4508639, 3873314, 4223049, 8362964, 4358368, 4526961, 2738927, 4976774, 8287777, 3955855, 7884531, 7344120, 2350511, 1369943, 3245056, 601466, 8294724, 4368635, 6956037, 7996428, 6878504, 1076730, 7957356, 4264938, 2699594, 1040583, 6250550, 5272496, 800812, 3271409, 1963117, 3394363, 6359215, 725398, 4014821, 8139106, 6852668, 4802563, 2061878, 5300048, 7684291, 3150725, 3725430, 5547036, 6576304, 7453731, 3300635, 939782, 878573, 8219073, 1536899, 4860139, 6022749, 7686552, 4470367, 4735269, 326834, 1597920, 6768475, 4009653, 5188054, 7860124, 2362287, 1834544, 5698832, 3633538, 7890570, 6950925, 1459665, 3847838, 1277725, 2617584, 3872883, 4689947, 3792789, 7020465, 671274, 3860998, 1208957, 4737965, 4887544, 952593, 6948709, 2219462, 205518, 5812603, 3665338, 3239935, 390532, 1078943, 5294829, 3992367, 2382919], +[455776, 6057809, 3723508, 3042149, 3358531, 4779026, 6010920, 6575380, 1259053, 3523529, 7636547, 2720618, 5620207, 3257490, 2344424, 3810490, 5135070, 1493103, 7705221, 7421244, 141224, 1430215, 4641631, 5729368, 3345767, 7550147, 6338433, 6091081, 2903491, 7050077, 8305638, 7674967, 5045586, 5137001, 5165125, 3943371, 1287988, 5230690, 3558787, 2100012, 6754799, 2590571, 5302927, 2213508, 3813517, 6946998, 4998019, 4891567, 4788820, 7739302, 4323517, 1032960, 5429410, 2404107, 8080564, 7693428, 3161623, 2993427, 8254404, 1674609, 1703895, 7883925, 8193319, 1013557, 963636, 3056808, 5436634, 3824563, 1306876, 5917884, 2929560, 1745078, 2550205, 3544384, 4799655, 6217993, 7601962, 6985419, 3148204, 2104793, 3595964, 6467088, 1339322, 1568373, 2659222, 5514911, 5185961, 6078411, 2424652, 4723584, 1522088, 2811067, 39533, 472766, 2111933, 6202498, 5828756, 6339979, 4388060, 280194, 2787811, 4349103, 7429301, 4972442, 7895049, 7082973, 3823365, 1500772, 4126412, 6185056, 7918439, 932736, 3779770, 8212195, 5709950, 3706459, 3422268, 5088147, 2060752, 4660758, 6486427, 7328973, 920468, 8252681, 2861073, 1919256, 7513213, 800452, 8159178, 1837068, 2949311, 3271242, 8093123, 7483480, 2584723, 7199937, 1062639, 6768699, 8303079, 1274340, 7652902, 1646222, 815021, 120160, 1906918, 5979565, 4893995, 7396692, 237168, 3921541, 3952673, 1495973, 7377483, 5045369, 6566836, 323787, 2771699, 5984516, 7663675, 1860457, 6955367, 2535610, 3995464, 2303442, 6578213, 3794266, 1033825, 1293170, 7631788, 6402194, 299809, 2425489, 2713955, 3264066, 201713, 558303, 2213831, 4725675, 1516523, 7468593, 3095528, 4995154, 7508362, 4203250, 8369665, 8020792, 6924203, 2753033, 3386152, 1042065, 6005230, 5663289, 8212076, 6124672, 4756444, 1088514, 8147228, 6256015, 1871704, 4425974, 4938245, 5899705, 8054910, 4170126, 455273, 3886845, 4560751, 5344568, 871903, 2331493, 6047983, 1114413, 2169122, 2992397, 8077209, 802686, 7370380, 6193414, 1179713, 2461540, 7391613, 3978066, 4020663, 5445077, 2587024, 5049934, 4966534, 1848315, 1481061, 6364773, 6106895, 7650490, 8230294, 1166089, 6635410, 212467, 1366857, 444766, 8303513, 6503909, 2884754, 5441167, 2604410, 5613682, 1795725, 2764550, 4170371, 867886, 6768480, 7568319, 8206074, 6997746, 5735711, 7740739, 3618124, 1059614], +[1915102, 7204631, 518239, 8247096, 6543809, 4642834, 6904527, 6747313, 4588033, 6681363, 5379676, 6424469, 6532687, 4959092, 4410044, 6637917, 3371321, 6879346, 1328883, 3561235, 2518489, 3939169, 7682181, 3245144, 258492, 2669587, 4386448, 2875753, 5065071, 5310716, 7117817, 1601285, 116039, 3480991, 6614750, 4240888, 4660876, 1840215, 3546146, 3420187, 5155302, 6236830, 7635453, 4577972, 6442593, 2620922, 826138, 2652767, 3709864, 7878013, 1028220, 5816009, 1149118, 6050548, 3401190, 3801816, 5296634, 6002828, 6688321, 4058003, 7392635, 4524012, 4145243, 4195705, 6556757, 2917359, 4185746, 3317276, 3217756, 4796884, 3904401, 7988501, 5947902, 2511120, 4872472, 6773587, 5874761, 1177852, 880596, 6517628, 6543265, 4412238, 3850439, 8083528, 3033865, 1470521, 4840919, 7373934, 6549616, 2066311, 5166382, 7666366, 7703522, 4092340, 2582513, 2021715, 4012931, 1385862, 109669, 647920, 2156904, 2674553, 5461853, 188440, 1221743, 3528253, 1401688, 2424631, 7148308, 4309444, 5843836, 5926348, 1402364, 2898234, 5028022, 7899653, 5102060, 932142, 4077661, 3838324, 4723411, 68838, 7040767, 8058883, 8367079, 4550088, 7677784, 3013363, 1367115, 1535400, 2297477, 971908, 1924328, 8095631, 6576206, 4040159, 1355390, 4535002, 5218062, 2871807, 6314543, 494594, 8099559, 2295935, 2263183, 1968633, 664683, 4942638, 2842860, 5816325, 5891391, 7956930, 169844, 8263258, 225123, 1799831, 7506791, 178208, 4991265, 1114900, 8128705, 6339094, 1952843, 3230172, 7775735, 5503163, 4643362, 6492857, 3435042, 2866187, 3651406, 1962590, 2745983, 6096415, 306452, 1783430, 817918, 4204707, 7202967, 4926793, 686116, 4258615, 5242968, 789921, 7312880, 2228666, 526216, 3687032, 7142924, 1301683, 7492884, 2603622, 4163712, 3212073, 8021128, 4240365, 1131204, 1107016, 1583998, 5594656, 5423442, 5341490, 349785, 919519, 7512201, 6642775, 551816, 6361354, 6433803, 4173903, 4411641, 4826904, 7700716, 1175705, 4207430, 6650210, 2705542, 5102267, 904497, 175840, 8109293, 4702746, 4646844, 3109671, 5849785, 6536224, 2917818, 8064535, 4226251, 7128330, 4930342, 7469330, 1687198, 3933768, 6160217, 3040179, 14175, 7455009, 1098722, 680009, 245120, 1642883, 3829677, 112119, 2294604, 6254052, 3192069, 3224704, 6118592, 7878203, 3761539, 7963279, 141294, 3501050, 843884, 5575061], +[7826136, 7012328, 3927775, 2718959, 1776601, 7317192, 6996735, 149932, 1663366, 2332323, 6474879, 474046, 6503782, 316866, 4106761, 6046909, 2976698, 3804013, 5610415, 3640207, 7784316, 6553121, 2605950, 247124, 6302893, 4995563, 2302229, 4350978, 649619, 6433203, 2573781, 3206431, 8366386, 2628378, 7298554, 4450846, 3666790, 7992801, 2499017, 7375497, 1525838, 7997069, 1227857, 5123950, 6369366, 8266762, 8123062, 1402234, 4090518, 3224828, 1024361, 926572, 3863456, 6905463, 7001193, 4153821, 459083, 891252, 8218223, 1115612, 2207693, 8085980, 2866748, 430824, 4287153, 2802551, 7900929, 4716533, 2415042, 4987167, 7719079, 2047431, 861671, 1964040, 7170496, 7292865, 5094174, 343595, 6984986, 4633992, 4675797, 1218588, 66785, 6985058, 4392287, 466864, 8058686, 7997724, 1307799, 7721194, 6326600, 7095826, 6350227, 5147686, 6031395, 1642719, 7738377, 7598657, 7558807, 766766, 7667507, 5541433, 1491080, 6062448, 6183075, 7200159, 2274979, 902760, 2949546, 2250640, 6821937, 3104574, 4598030, 5767340, 1850047, 220957, 3822214, 4931762, 3151268, 5117409, 6460907, 4348913, 2834162, 8347726, 8099817, 711853, 7533142, 1384342, 8352020, 1466406, 1800862, 1899522, 8300036, 7479342, 6974912, 5423321, 2921809, 6917531, 7633600, 3510858, 5402325, 6120771, 3048614, 2955702, 3508548, 5090489, 3389260, 8169581, 3763090, 2922847, 3568078, 1326144, 3319068, 300518, 8335062, 2421776, 2842463, 4894258, 5595032, 4726815, 6513316, 4385333, 117246, 3569372, 3328974, 3340898, 2847369, 2271569, 4981560, 6480193, 5308871, 3596978, 8176985, 1279865, 2642689, 1957347, 2689138, 6487054, 3409256, 2523759, 2768419, 5002872, 6275948, 3529826, 2966821, 4527692, 2925119, 8357939, 2933022, 756868, 1578522, 2173622, 7979163, 4193895, 1858010, 6700278, 5965824, 6077935, 1671019, 4802, 1808944, 4502039, 1991811, 2853147, 4773535, 4359939, 6958043, 3826321, 963083, 4504741, 775053, 1084161, 4063396, 4187179, 5591422, 985325, 2844935, 51151, 4518170, 252250, 2232443, 2311072, 5081437, 799809, 4554902, 7726922, 378984, 8215778, 5168450, 4058721, 563510, 8228041, 6389229, 529215, 8350003, 1009528, 7256744, 1968066, 5628255, 6292858, 6554487, 7036165, 6480303, 7183891, 6539388, 6651315, 3566107, 1654989, 7125843, 8046154, 7064687, 8280083, 4420247, 7728504, 745904, 4630215], +[7919036, 2725142, 2480486, 454626, 1996021, 6200582, 5395444, 6287611, 3369232, 7592586, 1098739, 4310018, 2106178, 542292, 3677742, 616107, 128340, 2535615, 8326631, 1929063, 6449807, 6838800, 4521177, 5439350, 4276052, 7675885, 8155538, 3890783, 5169929, 7086859, 7682003, 4023565, 319644, 3846355, 7424202, 2799172, 1108697, 4764723, 7029828, 1310973, 1711866, 4703384, 6117551, 7189400, 2299206, 2870494, 4649513, 1925999, 7685823, 7025661, 1657504, 3147332, 528435, 7083591, 6845642, 4035667, 7816860, 1876407, 3923715, 8210682, 1604240, 1960858, 580038, 1323672, 4762871, 1790314, 5701129, 5877064, 7321528, 1109582, 2824182, 7003485, 269515, 721686, 2107910, 5218888, 5434569, 285706, 527987, 774847, 7893807, 2839886, 6162359, 891485, 2541179, 5340160, 7073992, 3891726, 3314077, 7800624, 175327, 1156896, 3989067, 8220553, 5997619, 2378056, 2190673, 4978284, 5997007, 5857673, 2043797, 8376464, 1272937, 5090733, 277952, 5619108, 5028550, 7800003, 2940031, 7364383, 6490369, 463794, 5940856, 4656127, 111764, 1189647, 3241718, 6083306, 1933363, 6653437, 6505117, 6438398, 4321033, 2628116, 635711, 1652935, 3992070, 4305815, 7388302, 2491021, 1945483, 1538687, 6410646, 8077916, 1619033, 5639514, 5430090, 3820222, 5313405, 3216769, 5771381, 522731, 4057043, 7655872, 243411, 2236847, 6173770, 1007579, 8175485, 6026180, 2171199, 796841, 7996562, 2100022, 2807651, 1103135, 7816934, 1247312, 155662, 3979717, 1142376, 7012991, 1349089, 5837712, 7635456, 434378, 837937, 5735577, 3450109, 720214, 7057737, 7609086, 6036235, 6082608, 5427480, 7944508, 6674465, 3050030, 8003835, 8165253, 4975137, 3670203, 2522390, 4235529, 8329391, 3831180, 587018, 2127482, 2617413, 47337, 189020, 5139565, 5457876, 3992001, 4255661, 3021656, 1038418, 3063478, 2893568, 2554388, 613480, 2081311, 471778, 5549395, 7693117, 7561715, 6908389, 2951698, 4542644, 1733462, 357549, 2021297, 3965622, 3718549, 4121861, 3702277, 1604591, 3042425, 6998966, 3321032, 3615801, 7560144, 5193757, 6396850, 992287, 7504429, 662415, 3496178, 5605242, 6153308, 4571130, 4526410, 6677376, 2255033, 5293606, 1071966, 1233557, 7932766, 5340055, 5947470, 6334732, 7865220, 7670806, 6719529, 1372177, 2786022, 1782169, 6143672, 1638700, 7575411, 5856160, 8287578, 3998256, 170171, 7543216, 6354969], +[664685, 7817131, 2261666, 5070694, 5212316, 65997, 6893508, 5533424, 4105224, 3841943, 4110784, 5814690, 7507392, 2938044, 8051297, 7816928, 925309, 4324496, 8155207, 6552242, 625780, 2628698, 434412, 6026688, 2588877, 4470814, 2208957, 7423381, 104879, 4736379, 4302849, 4974224, 6016789, 3252122, 7087571, 312073, 278013, 5743860, 6103696, 5172983, 6397371, 5702596, 3469235, 1995158, 4165061, 7264120, 2138647, 551024, 1081619, 5794581, 3023873, 1179944, 7512523, 7446049, 7948160, 3242128, 4094225, 6244153, 4847283, 832275, 2002965, 3505863, 2696628, 7102077, 113094, 6274630, 6359100, 4599242, 5736841, 4882819, 4537170, 207912, 2103616, 3213657, 3568538, 6084950, 7628491, 6771399, 6119076, 2920940, 5535493, 5509577, 4240784, 4362409, 2957781, 5338254, 7271795, 6447914, 5699551, 384220, 3468515, 4970389, 6383773, 6322374, 1462825, 6759749, 7160375, 4929309, 2285760, 224552, 1432886, 345544, 610540, 6779064, 4369322, 4834664, 3909086, 5333403, 6562315, 6248400, 4726420, 7449265, 2026986, 2224413, 1832321, 359164, 2609732, 508661, 2603729, 6517669, 4605043, 952212, 4760670, 3658407, 5459127, 6433496, 7126491, 6375591, 7632658, 8280819, 1137918, 3159853, 4900133, 6592235, 4424188, 3042589, 8004486, 2948651, 1089412, 6095336, 866471, 6093608, 7266831, 6358342, 4930021, 1188435, 2490955, 6656976, 3764198, 7496285, 7729861, 4070032, 3771291, 8352475, 7998883, 3980322, 2179778, 4635384, 5289060, 915983, 6909527, 6533186, 1288321, 1387066, 5715561, 2524521, 7891499, 5117686, 6946754, 7561893, 2285392, 4111081, 8096379, 7700627, 7391771, 2908452, 930350, 1044405, 1091540, 4720104, 7026078, 4935934, 4148249, 3509717, 3054330, 44616, 8131690, 5538941, 6451863, 7390340, 8215567, 323518, 4011830, 7030758, 467018, 2097600, 5665187, 1819482, 6973947, 1746158, 3110647, 7909297, 2334720, 1453339, 4444825, 2430367, 4146147, 287599, 7032690, 8269065, 4706016, 3663350, 3568734, 4895657, 5266428, 7010484, 3925683, 3564348, 5989859, 8207941, 6720104, 2555575, 924067, 660360, 5384975, 2075071, 6128688, 3771966, 816378, 3641219, 2533842, 1051177, 1908730, 7182955, 1884510, 3543431, 6966528, 1579714, 1531104, 6091577, 7369834, 946580, 6798238, 1490220, 6719369, 6318214, 7408054, 1571040, 5716645, 4732327, 8259992, 7256596, 822268, 2510757, 2645605, 655776]], +[[7731085, 492799, 6581182, 4578159, 6749254, 269089, 4033112, 7306361, 3169322, 6292337, 1513926, 1921998, 4495534, 3256221, 7731716, 1835920, 3048458, 5066241, 3817379, 4638599, 1345232, 2866585, 3056546, 2498938, 8122983, 3017199, 3704102, 2238229, 1733462, 218824, 789955, 4666510, 2547847, 3633301, 1333042, 4437013, 3959974, 5336280, 4278381, 739923, 4698970, 850049, 8088549, 2372897, 179891, 5566246, 2979491, 1065690, 5655584, 6892567, 2911558, 6244494, 5528913, 6332506, 2157098, 2590706, 5502878, 8347257, 6657460, 2575144, 1833123, 1934710, 6878769, 6242880, 6795485, 873966, 2745862, 6438182, 5276805, 8225888, 7797093, 1416802, 1710001, 4652861, 6323532, 5784929, 1868191, 4762951, 6549777, 1965739, 2976535, 4606047, 2332783, 3571999, 6267623, 3392944, 7726546, 1937741, 5009197, 155831, 6603492, 1575556, 9821, 4285053, 471044, 4936970, 133873, 1834064, 1993787, 644232, 3610198, 964635, 2281670, 6411830, 1272902, 7802843, 538751, 1446119, 2806597, 904952, 2270623, 5435772, 5420090, 5940607, 1999960, 2299166, 572634, 2299578, 1590895, 5757133, 2436409, 870560, 6531621, 4756505, 480336, 3448642, 404729, 1912150, 7706313, 48446, 1484808, 6708430, 6566235, 3700424, 3058464, 378193, 7318144, 1960021, 1186949, 7342665, 5976505, 2864671, 4244099, 3458202, 6708742, 2644474, 228322, 2131953, 7484770, 3771970, 5062071, 2132898, 4582300, 5972184, 7367291, 7062911, 3531173, 6077606, 5440153, 1436016, 4499979, 7709548, 5304298, 8245472, 4824616, 2844928, 812246, 710909, 3576965, 801273, 4674245, 759730, 7306808, 1862564, 1629008, 2520146, 3821669, 2184055, 2123830, 8074468, 5787611, 1440519, 8317792, 2096063, 1166448, 5686651, 3952315, 2637258, 42830, 4207538, 37773, 7081610, 2059818, 5192458, 135868, 5466353, 3863721, 2770679, 4925264, 8042640, 2411435, 3178118, 614635, 6532633, 3542984, 4037620, 8214685, 6310478, 7235459, 6134464, 1694134, 3660573, 3568925, 1473294, 142113, 1178198, 929009, 701075, 6304086, 4126523, 2360288, 1637634, 3991574, 7778761, 7632398, 4453433, 437400, 529188, 3833863, 3028554, 8297452, 1495997, 4562293, 2833396, 5299248, 3101828, 6347313, 352398, 1218651, 8253240, 5229810, 6965863, 5721595, 3985714, 6316532, 4725043, 4202295, 3174630, 667333, 565748, 6356928, 991967, 2561875, 2651371, 1155534, 5853536], +[7082314, 1395431, 4202401, 1595317, 8320514, 7083132, 4991996, 1585634, 920551, 1199507, 7966839, 944839, 2979983, 8336617, 5825381, 4084279, 2640364, 1278658, 5200252, 3321266, 894658, 7296765, 1074305, 2355198, 367238, 6483468, 6348770, 6323288, 7826766, 1429103, 2693683, 814067, 3474598, 136021, 7002205, 6958516, 6310564, 2253532, 3121217, 73857, 4008765, 5375582, 6612704, 4563423, 1190396, 4344991, 8214078, 4298487, 843838, 6028933, 3682911, 4209658, 3350493, 7526861, 7845009, 2566830, 2865234, 2604204, 5514762, 2525966, 1831095, 8013464, 5204939, 6859440, 3615773, 3366860, 2750908, 1226284, 7456726, 1695186, 5230540, 2787985, 1809998, 3387219, 3714028, 4408404, 6410962, 2878977, 515484, 6263512, 1651623, 878090, 4141215, 24800, 4932846, 659091, 536285, 8102784, 4020011, 1453464, 4848184, 4526000, 5954127, 4100713, 1620801, 5045662, 2469182, 3736537, 6822280, 4379960, 8070186, 1877811, 7164831, 6092783, 2805337, 4465534, 2877760, 6245734, 6292417, 3562885, 3389242, 7469307, 2684631, 3980128, 5696463, 8189926, 4995987, 5257658, 4826258, 6502305, 4962669, 4819966, 787317, 7135964, 4973123, 5123013, 4635906, 5009890, 6737981, 706032, 7488180, 4518910, 2580548, 5419292, 4181654, 1034904, 5404974, 5512238, 4425026, 4529519, 3099834, 3540354, 6967428, 3602146, 1507982, 7224532, 3268211, 5851523, 7443987, 7328808, 4912488, 102478, 7243910, 4420344, 1238248, 2675918, 817613, 794866, 1094634, 3358087, 6671304, 5534520, 4014255, 8050457, 294256, 1998875, 4099387, 2681096, 2101618, 40495, 2767805, 3383728, 1099474, 5003767, 1727708, 3109506, 4205989, 855836, 7664738, 1573675, 4408171, 3984292, 5638528, 1692122, 1014166, 6359926, 1787427, 167432, 2070835, 5480347, 3922586, 7709072, 5125299, 6163140, 7883284, 3305011, 1125039, 5952059, 6415, 4856086, 2022407, 6388227, 3835416, 7076154, 1651842, 6713286, 4287880, 3504734, 6074949, 1900974, 3505909, 7630458, 7783519, 6810028, 5581684, 6326010, 8052138, 3022923, 8049592, 7385314, 2765338, 7683092, 2560566, 2205482, 1237053, 7617287, 1865208, 4948678, 2157502, 5471062, 4914550, 3244557, 7021120, 1398684, 920329, 2873919, 2862285, 7848280, 250384, 8044696, 384807, 7991318, 5698568, 5578249, 2093223, 1548844, 1183358, 2183221, 4643666, 7800717, 402289, 5133528, 5571070, 1941324, 7353813, 4336980], +[3092337, 1202480, 4091546, 5403966, 8046764, 4619737, 3070309, 3138851, 3079890, 7178169, 1662558, 453023, 197152, 4320618, 6507114, 4654099, 5445090, 7579405, 6080135, 7841632, 1984864, 7202654, 1825315, 8356618, 2124338, 1485263, 1628609, 6747852, 6547628, 7434932, 6864120, 3885755, 222618, 4594139, 7035343, 5440663, 3974746, 508997, 7616092, 7818682, 1388711, 3883446, 4811960, 1667025, 4869720, 6994549, 2722376, 701454, 7220758, 1665115, 5664786, 4042623, 45351, 7676002, 8246133, 6365711, 4518697, 849889, 1095810, 7361954, 1729391, 1132323, 3588350, 5767406, 6465256, 857424, 1322368, 1055872, 4390734, 3454720, 2271844, 3504401, 1927920, 7319862, 1138169, 1812301, 1948101, 564884, 2455345, 7246659, 3235902, 5549945, 6503383, 2278752, 4583985, 7256418, 8050098, 6683542, 895784, 4855950, 1362976, 2269494, 4910792, 4142227, 2390894, 8015674, 1829559, 5149393, 439777, 6764069, 4170954, 1270246, 8048941, 6260661, 713357, 456554, 7896475, 3098558, 5380293, 4222779, 663239, 476953, 1265064, 5542380, 7118751, 2157825, 1113386, 2070679, 2774250, 2206513, 6845279, 7543105, 7078036, 4331414, 1342902, 715204, 6519894, 3862988, 2076822, 4863428, 2935, 204830, 113191, 2994430, 3475634, 3608172, 2703533, 7131946, 7797478, 2129250, 6492139, 266102, 5324666, 389212, 1093628, 2766361, 21454, 1484271, 758550, 1621234, 5081983, 337492, 1572426, 2091654, 4121915, 7443401, 6683472, 132919, 7489748, 6914965, 2037944, 3296045, 1826449, 5670086, 2169141, 5220192, 1034658, 1521552, 4789416, 4217338, 1064271, 4762297, 532736, 3917321, 6119616, 7913005, 1204315, 5544157, 3853055, 193021, 5025144, 5210102, 1256730, 7724581, 5026270, 4338438, 6740524, 1804049, 489750, 3953080, 4625799, 7630764, 2631620, 7083357, 7958185, 3027420, 6516195, 7787010, 6571757, 6882862, 6660214, 3835637, 3534664, 3944920, 1379264, 3432924, 5101240, 6280962, 1582541, 3054926, 3322246, 5404220, 6560476, 5562481, 5225793, 2499290, 230107, 862178, 6037909, 2834454, 4870182, 35923, 633069, 1487261, 977250, 2659072, 5300139, 3087252, 8212200, 6268252, 3449158, 3488881, 2937579, 1799185, 7766537, 6810614, 590420, 5514566, 7851117, 5811234, 4474840, 5220607, 197750, 5489622, 3529682, 7287661, 7155153, 1099115, 7447003, 752770, 915958, 1900065, 427231, 1632331, 7345902, 8334791], +[1834985, 7161747, 3917653, 3244045, 3320503, 3766488, 3664456, 1313583, 4800383, 5698539, 1587028, 2289912, 176122, 6902829, 6179477, 2034567, 4274196, 4161323, 7179282, 8054327, 3819413, 918000, 2330012, 3231577, 306932, 1303663, 399867, 6776949, 2388660, 3102130, 4841675, 3986797, 6695875, 1565056, 6042622, 2398786, 2653599, 8244065, 4238526, 4388386, 7405627, 6130658, 4756967, 4121184, 3148701, 6014287, 5050629, 80943, 6655052, 7333739, 7113360, 5103619, 980320, 7964501, 3510831, 4897497, 6894685, 5473874, 2235842, 6367384, 1742918, 5585318, 3223845, 3775698, 2364427, 7400357, 2607362, 7466748, 3601886, 5349429, 5769941, 7389134, 861901, 1040352, 8374905, 128575, 3328181, 358233, 7397252, 5057663, 7202762, 5283006, 8133657, 2310972, 21919, 6121146, 4964549, 7629379, 1097040, 3015660, 197209, 2514173, 3503331, 5056861, 7369897, 8051873, 6672483, 7840901, 4320303, 6438235, 5745910, 1389982, 1151981, 1173054, 5506831, 132757, 6585541, 1677750, 3635981, 1151384, 7153355, 2234107, 7052341, 1509859, 5166838, 3578870, 432927, 1256399, 3073427, 6829163, 5557078, 7829222, 6533082, 5195810, 701344, 992848, 2590964, 1171316, 7085933, 4008906, 6310891, 5488130, 2396344, 1382833, 3499903, 1921710, 8315746, 5142954, 4760296, 4018283, 5040892, 2486405, 5160218, 1983590, 8113733, 650614, 4169026, 75689, 3077495, 4509159, 5063968, 6616668, 3273926, 2605688, 4316022, 8341798, 1692623, 402652, 6315256, 4871090, 7748774, 7139998, 5419819, 3440102, 4507509, 1463157, 7017314, 710011, 5744304, 4262156, 1516680, 3980629, 2871330, 6883964, 3727417, 988300, 1574952, 2110460, 7427236, 5350536, 3312961, 7097006, 7515, 6088953, 5397091, 4027731, 2597297, 2203374, 2540196, 3338374, 6294882, 8039138, 2081489, 4075073, 3294546, 6450536, 4028930, 4348601, 3947521, 4112052, 3726430, 4981009, 5737790, 5267328, 3152683, 4350436, 7158832, 2521289, 2742063, 5824752, 3566685, 4146639, 2817121, 3659069, 8114909, 7320319, 355997, 3739659, 4984198, 2685972, 5090825, 6791195, 5604571, 3684974, 6098697, 2623328, 7562649, 871488, 3185625, 7458016, 7509129, 1356348, 1239715, 1697889, 1707605, 3345819, 6020314, 7323939, 4280054, 8110387, 6892556, 7828890, 7456729, 1370120, 683749, 7206507, 352761, 7070610, 4544122, 775934, 3366246, 6337961, 1707864, 2206883, 1228565, 6958655], +[6213084, 7962578, 5539844, 1356485, 5980456, 5737275, 6764543, 7209759, 7212958, 5837922, 7148887, 7952631, 7452147, 2859867, 7342066, 651369, 8247869, 7023732, 5995045, 4973861, 4933215, 1772939, 3352846, 6865051, 8343098, 3033929, 7007587, 4524845, 7785846, 6396341, 4856884, 4890826, 5534887, 6432153, 1635866, 606955, 7655914, 6587011, 7307522, 3032689, 7327299, 2683784, 1036670, 3321234, 5501393, 3603010, 2688040, 4096246, 7701731, 7192045, 4559776, 5327777, 4458482, 6471105, 1609904, 7582122, 657260, 6237156, 2263921, 2959674, 4438004, 1820196, 7873419, 4274656, 3117354, 8002160, 3299471, 3883217, 7745572, 4660711, 8121992, 5741530, 3386692, 5027528, 2154121, 2410752, 1071595, 4702828, 4059865, 3477852, 4786456, 6182987, 2314652, 7046734, 3780490, 3640775, 3016835, 6338898, 5586010, 1915499, 2140922, 3778658, 7393898, 6388921, 6744990, 2578311, 8340883, 291956, 3368873, 2061292, 3901062, 7578316, 5806181, 7190289, 3744674, 1968872, 5699978, 3967675, 6832993, 660214, 7416338, 7251178, 1857264, 2733718, 6148799, 5475824, 4790706, 1440783, 4241040, 6093610, 7675582, 2997395, 2395232, 3040185, 426195, 5037680, 4610114, 66635, 107788, 1040813, 8100547, 1574304, 8231222, 681822, 497137, 4778614, 751604, 7769698, 5637818, 1554793, 3159693, 8061542, 4446717, 4499966, 3845997, 6937454, 1694190, 1056455, 6994475, 4426486, 5610610, 6371881, 1416434, 1984424, 4345142, 6388627, 2847714, 890258, 4908427, 1666746, 6880202, 4441528, 3320647, 4882907, 1351558, 1543382, 1493208, 4422037, 1673357, 4726263, 6719335, 5941442, 6079320, 1258317, 488241, 4697206, 242419, 78378, 3244048, 604611, 5402225, 2586869, 4239537, 2494932, 3804677, 5708852, 317765, 7057356, 3762835, 688832, 7034428, 687450, 6052242, 7043382, 1845789, 3006795, 1730167, 991000, 713094, 5255359, 7525285, 4011987, 1919754, 8023354, 6411320, 7390730, 5988421, 466668, 5894121, 5984554, 1683230, 3235038, 1836829, 4317158, 8122497, 3225662, 2102128, 6752074, 3419472, 7184810, 4043449, 3612014, 64431, 7623715, 5444517, 6132428, 193511, 4540203, 6872123, 7149727, 3298862, 6575287, 21456, 1196428, 5727748, 174269, 1442861, 7141857, 2999260, 4211378, 3149521, 4887778, 3105810, 7014397, 590439, 2046580, 4718576, 3320074, 5283429, 1379971, 3742234, 3147235, 689153, 4526825, 3976879, 2266612], +[7686236, 5403954, 5775520, 4050072, 5064229, 4638616, 2719640, 936693, 4520890, 1640853, 2487849, 3291721, 1820912, 784134, 5149904, 4436976, 7997142, 3305960, 8371373, 3554596, 2041778, 1158518, 8196141, 2914418, 608335, 1579472, 3774621, 1992526, 2252362, 7191741, 7858893, 7364067, 503862, 1710099, 7835493, 6450015, 5319007, 1647394, 3484911, 3465609, 2747468, 2621007, 5066653, 2422066, 8209367, 6662632, 3047227, 1417880, 2793914, 1908545, 1956470, 1403160, 6093556, 8191450, 14127, 5636080, 415376, 3948750, 1854473, 7569706, 7568207, 5735675, 7326011, 2014763, 1447268, 17219, 5904070, 969207, 1985261, 1321598, 977534, 8133894, 7734727, 136030, 2916856, 4060134, 5044324, 6976047, 3295657, 4093734, 6473049, 3854402, 2585434, 1913825, 2702795, 6767563, 5915283, 1716126, 6445231, 2474787, 1363522, 4747036, 8113539, 7987112, 3961422, 4820043, 4765976, 3002209, 8291517, 7542771, 2931638, 5934612, 8131590, 2798706, 3121982, 3195985, 6747200, 6797876, 4402477, 4376356, 5928779, 5602946, 6031264, 6082038, 7730713, 330061, 2872730, 2862911, 5299205, 6122297, 4373159, 6261565, 1924852, 5752441, 6023985, 5624616, 550521, 2434961, 5898866, 3469324, 33975, 380735, 8263625, 8217824, 2244146, 2432773, 1479006, 6242077, 3785916, 8347895, 7754243, 4170225, 8110379, 5169290, 5607708, 3102544, 2506719, 1982733, 6074447, 6968649, 4848666, 2228231, 1160029, 6126660, 1304746, 5908327, 7062021, 5865093, 2578266, 110137, 7198425, 7870778, 3298495, 599229, 3046573, 1287146, 5515050, 4089508, 4706060, 2389420, 2133641, 6332301, 7537325, 2044845, 767599, 2176521, 3000388, 6812339, 2277827, 7873654, 7608227, 8055901, 7480189, 6643409, 7196285, 1562498, 1870572, 8241392, 1964031, 709621, 479864, 6656955, 179553, 5179335, 1118782, 2452037, 4148060, 2435541, 5111595, 3795167, 3336737, 1548703, 7923527, 7107767, 7142192, 3011389, 2292557, 7202561, 4537126, 5238090, 800110, 2625661, 3854533, 3560638, 193221, 2544272, 1156656, 6232509, 61108, 1696959, 6157505, 376717, 1097304, 6935561, 1045372, 2473091, 6173885, 368092, 4071827, 6644703, 2586403, 2732943, 7973941, 5389274, 8177058, 286115, 8019060, 2148626, 5147712, 6174215, 749880, 1564454, 7860001, 711998, 7716865, 3290701, 1396315, 1544479, 7445150, 997527, 6290112, 6572359, 1454132, 5443910, 1032611, 2133260], +[7600514, 4481790, 387179, 3987949, 285924, 8328483, 6053469, 3540376, 4165083, 1120241, 5585685, 6257349, 2491195, 6097006, 5077677, 6772352, 8343991, 1385565, 5747953, 6317470, 7612165, 3855461, 5957642, 1132203, 5509945, 1769513, 4129279, 120504, 5372210, 1633589, 6509271, 217962, 1233202, 639796, 7564982, 7876814, 5395493, 4747171, 2242777, 3465921, 7634304, 4404545, 103666, 8373929, 7666705, 7797370, 1221478, 2443528, 5796365, 7743680, 2245340, 861838, 1473164, 5499458, 4645082, 5480929, 2049463, 7592348, 1782247, 4123301, 4342884, 5702275, 3549622, 2128291, 1085192, 4250255, 6833351, 361024, 3454973, 5250962, 7621594, 3180127, 6780036, 6746928, 3416000, 3654436, 3968463, 592332, 5625419, 3665709, 6918283, 3576429, 2547181, 7089923, 6019352, 5137084, 5917453, 2606591, 4638613, 4279538, 3534616, 6386366, 1292093, 6908801, 1161260, 6236020, 297353, 932403, 7783145, 1077831, 1616677, 6101402, 6341998, 5197921, 89871, 3003922, 1702507, 4823155, 4825894, 4026656, 2098128, 3726246, 6176039, 8302835, 875025, 3407776, 3801372, 8358671, 1846566, 3927389, 2660990, 6368005, 3502263, 7713849, 55184, 2308629, 5083005, 7469275, 1426221, 4037761, 3526049, 6961779, 3886000, 3176591, 3182725, 1812660, 1583262, 7929452, 6446798, 2690860, 180866, 6515474, 6696931, 4185756, 5829731, 4246871, 812019, 3995874, 7886944, 5617065, 1649329, 768595, 746298, 4657727, 2683575, 6263345, 8003877, 3799011, 5777544, 7370251, 6353281, 5162359, 250429, 3290984, 1276699, 1055723, 5413670, 1005487, 2327076, 1997383, 2367486, 1411752, 6412077, 7786959, 6096922, 12474, 5477821, 3668203, 7864164, 2376991, 3107437, 4210473, 2931707, 7909772, 157576, 5401383, 5119246, 670375, 2128301, 1022541, 351417, 5786388, 4243196, 450992, 7935947, 153825, 5558880, 4521091, 7402620, 5781546, 1934309, 3372766, 8299935, 6043841, 4458252, 6806169, 3131967, 8088755, 5006801, 7404877, 1617157, 2958162, 5769463, 845289, 377907, 6125113, 5397484, 596963, 2169154, 5254424, 8374105, 2220571, 6771702, 5636311, 8109851, 3871527, 1385922, 3494167, 6309766, 8144159, 1916798, 183683, 2429610, 5597402, 8308548, 5808147, 4689430, 6884914, 1057700, 5401263, 8204109, 2064512, 863933, 3667666, 3222369, 3560580, 3105569, 2197702, 5627686, 5649219, 126964, 2179767, 4756703, 2285151, 3271579, 1129570]], +[[6961917, 8119250, 1707386, 5846099, 4143377, 992899, 7884436, 226428, 3660218, 1572339, 4183605, 7905649, 222277, 907880, 2744599, 6475735, 7547810, 1474254, 2482641, 2623663, 2834163, 4953137, 4124054, 4143523, 3886281, 7504970, 2125690, 7922157, 4129862, 6501267, 1728295, 4299491, 2292905, 3639488, 1835015, 4518837, 6156549, 1840942, 157054, 7910343, 5223943, 6701180, 2368055, 4287747, 2897289, 7917372, 2411289, 7173075, 1559300, 7352603, 8096165, 6040076, 3899807, 7000051, 1605, 3113574, 4247082, 708704, 4884285, 7805742, 7248713, 661004, 1572069, 3873421, 5009193, 3637673, 6358140, 26426, 3625820, 3219799, 4589471, 4858286, 6055795, 2359295, 252997, 3068099, 3193007, 2727509, 2393185, 4200587, 1673942, 1525617, 6223331, 5902894, 2678352, 1520714, 8032631, 3337429, 1619411, 13974, 2085277, 8187767, 1074780, 4716423, 5303244, 3463087, 2910096, 4077562, 5017562, 135572, 2502203, 44246, 5189001, 7555436, 791733, 2844847, 5823090, 2621654, 3188663, 3037360, 5485347, 8321905, 2977449, 2060984, 2637872, 3256248, 6660023, 1711878, 76206, 6071242, 5468848, 7063115, 1240662, 8319212, 2367738, 2628974, 5731332, 2448542, 8031278, 1901972, 7814299, 480954, 271261, 7035667, 1854866, 5037556, 7941084, 3659013, 5723544, 591277, 7807067, 7844057, 2238000, 2231585, 8229760, 7885670, 5302472, 3383861, 5015260, 446931, 3416371, 3904068, 4056079, 6853387, 4257125, 3580798, 6560294, 1660962, 2592513, 758845, 6892743, 4422072, 3173745, 4312408, 7155274, 2417665, 3370464, 312961, 1038163, 7044873, 673129, 1780739, 542733, 7739208, 5592731, 1296005, 1292211, 6846065, 8170452, 2050740, 5670177, 1699833, 955053, 2267620, 3165695, 7644669, 3442550, 1180335, 7103060, 6362067, 3264885, 936874, 778812, 449434, 3348189, 477257, 4394723, 5401671, 1850196, 5410333, 6054869, 1357922, 4838965, 4529277, 1522041, 8348526, 2362125, 2653874, 1350724, 5812239, 5372467, 2509240, 7502611, 6970816, 122990, 1582307, 872502, 7046102, 6513752, 7926573, 7883374, 7789304, 5131704, 5859978, 5300734, 6903170, 6086078, 366524, 5695790, 1582119, 210388, 4096545, 60916, 2731918, 903055, 7277540, 608767, 6739154, 5049217, 3198458, 5379735, 2916313, 2447990, 1908805, 7454634, 612238, 6218236, 1051439, 269647, 2638481, 2706862, 533723, 7661088, 5330324, 5670439, 3975210], +[3319743, 2076702, 6669108, 6444893, 7203367, 6661499, 7394894, 6166300, 5386398, 574570, 2675280, 4871331, 5003378, 7306347, 3780873, 2354657, 8200723, 1085156, 7067013, 7492785, 4307683, 5554133, 3383328, 1358258, 4043329, 8318054, 4821458, 3324465, 1549697, 619385, 2183059, 5100905, 5973229, 7259038, 4882792, 7617391, 5156808, 3172352, 1862277, 3797254, 6846948, 934021, 835774, 3037225, 7075811, 8211815, 1922274, 2593991, 4143127, 1768609, 6265647, 750083, 2163050, 7660698, 2760772, 3842153, 5919855, 2323601, 4952545, 1965041, 1148951, 5307511, 2565293, 1466790, 7729717, 1324130, 5424138, 5058836, 5084149, 1175118, 3639858, 4361167, 5279668, 1943345, 1873302, 4127080, 7049743, 4684616, 2979979, 4759746, 2931438, 2300809, 7240751, 7061377, 6653286, 7879184, 1835620, 274716, 6928226, 7499367, 4590420, 6704470, 8213619, 2625470, 7736001, 3107418, 7869566, 3982181, 6047255, 6756501, 5692321, 3069884, 3453994, 3340892, 5977637, 1127650, 5031167, 5911118, 6274455, 6100543, 1854937, 7100868, 7470982, 6623783, 4581446, 1424765, 2335681, 1655357, 1887125, 2816396, 2833050, 2090735, 7681795, 4172062, 5932977, 6012149, 1190300, 3588211, 3495402, 5245260, 303238, 1076199, 5462829, 2831833, 1886728, 6731482, 2090146, 6818486, 1152535, 25796, 34742, 711387, 2540102, 8320578, 597366, 1406706, 7796111, 8067162, 1186064, 7834090, 1118581, 6933734, 981125, 8330348, 5034471, 2216285, 5060792, 5414440, 8316839, 8297828, 3018132, 596421, 864246, 1305717, 8233704, 2358629, 4224747, 1361966, 1854168, 7595948, 785587, 7278542, 2691765, 7880605, 3942960, 7051650, 7383357, 2681619, 7692438, 2298214, 965886, 5193824, 5096623, 6867940, 6129850, 3828958, 8276728, 6800792, 4265379, 1047453, 3979160, 6381535, 4566659, 5526943, 1206675, 4884640, 1750862, 3009919, 4031511, 4003141, 1780454, 4380638, 4071003, 3375514, 1454968, 3725029, 6388730, 4504711, 7467906, 5334872, 3592616, 7920156, 6163288, 902215, 5288206, 1947024, 1119521, 3063581, 2743555, 6485865, 1374903, 1773201, 3009979, 6796944, 5740470, 1060049, 204371, 3317772, 2524231, 6646132, 6417959, 4914148, 5737382, 1884428, 4544810, 26918, 1173230, 1945683, 7763928, 6864543, 7338483, 791669, 4938223, 1820720, 5941005, 5985530, 2820638, 5000909, 2717250, 6242225, 1218052, 5407084, 1691368, 2557367, 4877323, 5502925], +[1656378, 6675234, 3297347, 3091414, 2129305, 2762022, 1853722, 627344, 1775484, 6598734, 544641, 1884030, 7407297, 2813538, 8063288, 7596782, 3949977, 7975913, 7198441, 3501683, 7926639, 8010249, 8042724, 3289666, 6592706, 5332489, 6994437, 7001506, 521717, 5982101, 3371228, 7166438, 1870958, 8046542, 4379240, 4368261, 3495977, 2838221, 4620246, 237866, 5003996, 6067165, 5513870, 4833082, 4597694, 6657645, 3366798, 5564322, 7009126, 4700670, 4599142, 143202, 619585, 3739796, 6816490, 5636006, 1223584, 829992, 5197674, 6170003, 7273700, 6398332, 7167912, 976150, 5867070, 1184732, 105830, 8321871, 2975979, 1547275, 6046845, 3031316, 1106557, 2497867, 1376787, 1689759, 533830, 6180130, 4442544, 555852, 6224167, 8249684, 5091525, 4542482, 6619171, 1042806, 7498053, 630567, 871049, 7008041, 3635905, 47031, 5144841, 953047, 6874029, 8074960, 4192596, 1378198, 4434958, 948662, 2333749, 516501, 7348206, 449969, 4184430, 3446065, 2950515, 8001122, 6094765, 2740135, 7645454, 4086481, 5973694, 3929976, 5914679, 4473048, 2289211, 6144459, 5363505, 3092517, 3788884, 2720585, 1626828, 1377583, 3703936, 3641374, 3772668, 6371196, 7601320, 6771616, 8085985, 5911921, 2679466, 6806159, 4499519, 107666, 5806409, 1167893, 339237, 453546, 7427405, 6068848, 6760255, 7215314, 4604619, 6500922, 8359422, 8068303, 6148402, 7793634, 412351, 3464746, 1820373, 5815303, 61510, 4775278, 5251296, 1726029, 5104181, 1218228, 252773, 451430, 2963528, 335702, 302107, 5242905, 7215707, 4012330, 7005860, 2284998, 1348433, 6126416, 2344607, 1353623, 941706, 4361310, 473014, 314002, 1135707, 2735434, 4041713, 1593565, 7388327, 922960, 2572606, 4436896, 4804450, 3703866, 4166387, 5061782, 2710676, 1529860, 4597949, 770903, 8332686, 3145587, 7377239, 5649201, 1793074, 3281786, 7470793, 7582571, 5520434, 7950305, 2158053, 1805774, 8011400, 7302537, 7023601, 2206837, 6278386, 499059, 1693311, 2047638, 652153, 7446185, 7249988, 146339, 5065081, 6176472, 1353785, 5820601, 5915249, 761849, 5098667, 7183494, 6067399, 4016164, 3829753, 6879867, 5447927, 6743681, 2166266, 3414656, 3371417, 1588640, 7575245, 2720171, 7056300, 6598673, 744175, 6155960, 5936178, 855201, 3596523, 696615, 1886016, 7681870, 4182761, 1279716, 2063131, 5667257, 4045010, 1153757, 601171, 8183801], +[2096411, 7904417, 6359118, 489486, 1613011, 758991, 6613453, 6565088, 1581044, 3446116, 2218451, 1213917, 8273790, 6679265, 4236199, 6910685, 4573839, 7318945, 2512876, 392110, 2267989, 2395209, 4710805, 7042308, 4773061, 1789589, 3832075, 1432709, 8117622, 5532892, 6650892, 8187489, 3660139, 5117381, 4375192, 2271396, 1402893, 422677, 8105651, 2953222, 8028218, 2334490, 372636, 8096609, 3032409, 2649388, 2572846, 6136554, 7166424, 1997130, 2952856, 1316699, 2838737, 1336651, 4709830, 4142474, 3484970, 8051029, 3181070, 333274, 8288063, 5156757, 8261945, 6236621, 5146915, 7143988, 426047, 368635, 2536724, 8204803, 3539919, 5863232, 1086404, 3407558, 6508069, 5801527, 4567185, 7432510, 8124542, 587215, 1537173, 3086350, 7779670, 1312505, 1849906, 1590463, 5111827, 4602691, 5797837, 1127870, 1474899, 666043, 19116, 880350, 1463244, 6649592, 6048875, 1680573, 7210943, 8173357, 645575, 7715754, 4034894, 7844141, 7009049, 7226079, 7743342, 532282, 908697, 6418014, 7667106, 7172659, 5329901, 7053810, 6417197, 4914444, 6031332, 5888649, 5507642, 7642167, 2121106, 5688961, 4676115, 8211963, 4679296, 2170954, 7191317, 2393473, 1042353, 4404370, 2667598, 1929293, 7703416, 2821085, 6763165, 6990497, 1782299, 3137310, 806905, 5115690, 3989103, 2253916, 2406426, 5348097, 6609363, 6348629, 7595337, 7391703, 5971744, 2446392, 2045017, 5373377, 1281781, 7937509, 4477987, 1229150, 4731326, 7925188, 282345, 8280237, 2202279, 4262243, 3261530, 1688225, 895985, 4890325, 6536682, 6262804, 1008868, 7388102, 1834037, 4793066, 2295995, 6188302, 7862293, 7745022, 6272317, 7711415, 1985817, 2105245, 6866288, 5149104, 6365005, 590960, 2014076, 7855268, 7373936, 8371569, 6138947, 1695602, 7031135, 5972791, 5510382, 3929071, 6444062, 5411931, 875398, 7487510, 4541311, 7936592, 397994, 7145966, 15357, 1310732, 604231, 3516316, 101941, 3192721, 4046739, 7366982, 798258, 6010488, 851161, 4512780, 7741112, 6835574, 2673356, 3481768, 3929655, 2888179, 7303301, 7190978, 7536875, 1346948, 5502271, 2845375, 7537689, 2445213, 1408004, 6687478, 5917364, 4208480, 97723, 888380, 6676910, 3652027, 3118368, 3650673, 5507737, 1241115, 1182651, 8313497, 4468450, 7673337, 6410288, 5746228, 4242656, 8177604, 4725682, 4107459, 1717620, 2306829, 2842622, 1655879, 6895219, 6834768], +[7769167, 3270836, 730073, 3013160, 1636480, 374114, 4791720, 7499929, 2422820, 6345273, 4101440, 5552993, 1537723, 37097, 736641, 7434569, 1754851, 3079873, 6642946, 5227626, 1858534, 7336752, 5123382, 7961379, 5058828, 4429557, 1605065, 4967370, 3712193, 2009516, 2035738, 7714949, 5471892, 6485789, 5271750, 6094456, 1780211, 2034746, 8102465, 7845765, 4563867, 8057662, 61950, 3473357, 1150237, 2624985, 771792, 7275686, 93228, 1904741, 7306037, 5691205, 1353325, 4893514, 2218731, 504220, 3818444, 6680519, 7994047, 3233396, 4536606, 5080446, 6735913, 1133126, 1874063, 838594, 7972188, 4074640, 8148813, 2381688, 8259188, 1562812, 7216267, 7403407, 3633946, 2844391, 3988496, 4699872, 7501850, 7369161, 5469948, 6340414, 3694217, 3618513, 1693412, 6075304, 1535524, 4162381, 2073218, 4696262, 3731404, 4621419, 2474394, 3158450, 2445975, 4217056, 2514198, 866473, 20629, 4029, 7452534, 6234977, 2694052, 384039, 4227488, 2880379, 5530686, 3400098, 7830945, 505751, 2771685, 865242, 6692131, 1795028, 6053800, 7531833, 8019244, 4998967, 3319886, 7161409, 8338908, 2430111, 4612401, 5131452, 7434615, 1963757, 4567736, 5933868, 3119786, 113333, 4551201, 1761089, 3862026, 2233921, 816785, 5341270, 3390806, 5951749, 7746301, 343341, 4795179, 671539, 7034508, 5805507, 7720119, 2380557, 1980622, 158129, 3320239, 388949, 4490164, 4880544, 4558431, 1330932, 8086381, 8021842, 7713457, 2327131, 3338515, 5673291, 4481631, 3689776, 7064593, 5554362, 6561039, 4373698, 1705514, 4528535, 3596326, 5301253, 6883767, 2719633, 6858994, 6190461, 4492854, 643406, 5524851, 7260896, 1538554, 2638546, 1411916, 2422135, 4885570, 2709470, 4766149, 4602792, 3462782, 6274901, 1195593, 1147516, 1167642, 986218, 6132731, 7227629, 1327469, 5731763, 8215221, 471134, 7908733, 4996979, 3925467, 363697, 3374099, 5822890, 6548511, 1346830, 980560, 7078505, 2783544, 3071246, 7486690, 8349675, 2565067, 4029663, 6816360, 2455439, 1216313, 4497087, 2519103, 5759575, 3885622, 2162141, 6042768, 3296942, 4333548, 6230868, 7050909, 6885906, 1576248, 5123469, 2785574, 1235698, 803341, 5653097, 1889301, 1820531, 7892978, 8282129, 1564585, 3766947, 1446803, 590320, 6883511, 1667056, 6750130, 5276987, 3529373, 2615894, 4683348, 4406005, 1415466, 2935962, 1795859, 308060, 2258812, 240179], +[4924361, 7607454, 5815450, 7993017, 1513360, 7871355, 111386, 7029837, 4378693, 8349636, 91181, 5137281, 8005607, 6900879, 8288989, 3083468, 6312306, 7801285, 915281, 5728000, 5379478, 702333, 3779207, 7264261, 8060340, 1611840, 1149460, 833726, 7881009, 4159984, 1123745, 2345529, 7021219, 6539493, 5671229, 4597256, 2197960, 7546252, 6527188, 211502, 1897650, 7058692, 970802, 6027116, 3420086, 4922403, 5023047, 1586528, 5436450, 412793, 4386508, 7476312, 6444472, 2098569, 7858057, 1250698, 6965543, 1457831, 7444710, 3561673, 4809367, 698847, 666427, 1488605, 432729, 2104970, 7404211, 4746445, 3097530, 7164186, 2557844, 1643946, 177184, 1720744, 1313197, 1697015, 8024494, 5908093, 6607592, 318517, 6819631, 8086832, 7499036, 7290602, 422217, 7631275, 5197883, 6775512, 6719549, 4120289, 2408868, 2494980, 373890, 5500967, 1309022, 7665556, 496769, 3936083, 3143068, 2394670, 1033269, 2408178, 7838349, 7864811, 7963747, 6020214, 7454699, 5191514, 2232666, 3624816, 3869594, 445795, 6621215, 2914650, 8271936, 5208051, 5616488, 5244241, 7429993, 8354183, 3808133, 2539327, 4517478, 6435170, 308273, 1920546, 114214, 3101334, 7656832, 3061826, 3808666, 6111743, 3868310, 83924, 5679085, 5767811, 8047634, 698804, 5738014, 6924211, 3599173, 8116933, 7688437, 1366740, 762408, 2341213, 81846, 7755407, 6198462, 5437279, 1052866, 5287390, 482643, 2250639, 5265228, 5947148, 6028405, 7747705, 4433449, 1551691, 6055671, 1504868, 7075270, 5993323, 4181979, 8027459, 1771408, 3300979, 460277, 6963257, 5865673, 1721630, 6722371, 5421453, 8008690, 2464703, 3921101, 521027, 2363865, 5164891, 4351054, 1068287, 1199795, 4855563, 7993897, 825135, 4618929, 7024957, 7554496, 1423196, 7446075, 354897, 4145709, 4339126, 1019937, 5311502, 1866237, 4095733, 1825288, 749614, 5039688, 5222701, 3813736, 4625876, 7983951, 3891735, 18620, 7438703, 7441581, 3810424, 4056537, 4954622, 350772, 3876380, 6922579, 6983976, 5753996, 7076878, 8248789, 4490902, 3410439, 1647876, 53872, 5879725, 4072600, 3726354, 3941161, 552859, 4351594, 5748751, 2731307, 4887890, 3115204, 8254925, 7826833, 6476019, 1252515, 1002310, 5353086, 2490466, 2700916, 2207940, 6841394, 3783622, 2462209, 2992219, 7846532, 7065885, 5344450, 2365493, 5100206, 6076937, 6840381, 671462, 3189204, 2544061], +[4948185, 7532904, 5924440, 7570418, 996127, 3577656, 5989264, 849648, 2972447, 539044, 6515327, 5912160, 2173419, 2167011, 2270754, 622751, 4909951, 493693, 5340513, 321594, 1653276, 4086796, 2793526, 4142048, 2927067, 4286271, 5557803, 4801459, 1128716, 8298927, 2544885, 6654872, 1979659, 531198, 1905487, 4840688, 1621782, 5022044, 2502748, 7682200, 2265884, 7283164, 3860785, 7459088, 4558723, 464557, 1717569, 3172108, 7189478, 1599111, 6385031, 1073627, 3442312, 5993510, 4913746, 6131814, 5423110, 5842912, 6900394, 944959, 6115424, 1860812, 5315882, 1342529, 3264941, 1850752, 6768875, 1953097, 3850094, 3771892, 525662, 3148924, 8228550, 809103, 3526153, 632012, 7618414, 7813637, 5439154, 4707421, 1410220, 4593074, 4761664, 5407779, 2531959, 7297426, 2533416, 6675728, 5446851, 5181635, 54496, 3997480, 6314003, 2051374, 7542734, 76490, 6272163, 4899443, 1930438, 5358321, 6526861, 5805541, 4689824, 5656301, 4610931, 4071710, 8214322, 5174261, 6836769, 7271327, 7060281, 8008249, 1664852, 5659179, 3390061, 1200824, 1404247, 423059, 2846032, 3821844, 6457179, 5605363, 4470847, 1958988, 1322552, 3475239, 4336796, 1435692, 7665258, 3444937, 737905, 6393106, 4325725, 6578027, 2787658, 1965289, 8344387, 8342201, 469186, 5793939, 5175905, 6030547, 638911, 6177715, 3662391, 3591735, 7522514, 2356960, 3376219, 6512848, 1222451, 6691600, 1249631, 1482796, 7962979, 4394519, 828770, 6589823, 8224506, 2404967, 5111433, 584353, 2002606, 7028156, 3981653, 7511150, 1694047, 8024435, 6684296, 2271925, 4544709, 6067561, 7150066, 4440749, 6790477, 5937314, 1166164, 6941254, 4386953, 4053207, 4465724, 6174364, 5174685, 5862103, 5856730, 6405673, 5505062, 4701968, 6497188, 541420, 4196271, 47692, 3199938, 6779800, 5329690, 2312742, 3700250, 1874298, 5889572, 3453122, 5368093, 7376643, 1710309, 974669, 989929, 1131971, 3444725, 3157053, 502551, 4353781, 4845810, 5028557, 2540126, 815276, 721777, 2423304, 328955, 8235514, 3594842, 5534614, 4319091, 3374408, 8231260, 1329567, 3265926, 4872447, 6292875, 6390521, 7988163, 4226127, 3539201, 5472984, 3051579, 2495323, 5277744, 3961655, 4631975, 4440058, 5314399, 5104697, 323736, 6245688, 5715299, 1525174, 877150, 2267935, 3473711, 5330639, 7529669, 6923676, 7663857, 280097, 4322476, 8350199, 448740, 3794499]], +[[7186428, 4190251, 4081845, 3351668, 1606185, 2592683, 7406197, 5550488, 3154181, 4326625, 6792866, 117440, 748927, 5426584, 6035964, 2867441, 4455743, 4138144, 7118483, 7321563, 214051, 4204525, 3012636, 5726764, 5201255, 6469705, 5062255, 2464099, 4102705, 2099084, 6995528, 6145807, 2970693, 3969885, 5272589, 3833222, 1827623, 4595614, 6342804, 4273663, 5259445, 576432, 3596807, 2329012, 2915403, 3260224, 2866853, 8241027, 5288606, 4671755, 5776793, 3850906, 386568, 1799914, 7235065, 1722795, 4737334, 3891876, 1595698, 7164309, 7651931, 2136000, 4546810, 2435238, 5974695, 5994505, 2629466, 7489398, 498940, 890033, 6653238, 4510050, 4223565, 6410856, 4940203, 1854025, 4038082, 5487282, 5814418, 7015656, 5432491, 4861716, 801406, 5372814, 5984778, 4160105, 1748019, 1609874, 6016005, 9010, 8371546, 2509799, 270164, 5768846, 6702588, 960610, 7147557, 1699819, 1192205, 7750695, 8055836, 4264112, 6617516, 6827455, 3328631, 2964146, 6199507, 4945484, 5609596, 2662201, 3004694, 7672469, 7704427, 6397001, 2901731, 2747879, 7725381, 7465516, 6979685, 3166427, 3027239, 1865917, 133462, 7343744, 1831809, 5469474, 735144, 6505049, 6720311, 2756868, 108877, 470452, 3540782, 3909217, 7158256, 8155174, 6706215, 971735, 5586801, 1081538, 5244617, 5998480, 3055471, 7533018, 344717, 1216295, 5920026, 3708589, 4976839, 5032515, 727720, 4122722, 1053929, 1424056, 2479514, 7527704, 5976676, 4617726, 5439923, 8318939, 6573777, 4121250, 4540343, 3970926, 3620463, 6268814, 3216618, 5051767, 1893736, 5875150, 4656997, 7618164, 3329310, 4980382, 1941728, 5622998, 4780035, 2863317, 7464037, 1641091, 698474, 5666930, 4917349, 4502826, 8111186, 666160, 5854537, 6992461, 1252832, 189442, 8292956, 3201455, 2543053, 6509757, 2789750, 5193054, 7215042, 1725423, 1082955, 5165203, 5115308, 2102531, 4026266, 1196090, 7626327, 3262355, 3034021, 1125866, 4655643, 940610, 3967025, 375868, 417452, 6867368, 1981342, 1422638, 7455639, 3958579, 7693723, 941913, 6106468, 3960507, 4454680, 908773, 3427404, 7701475, 1733810, 4449375, 6101735, 4699088, 5703752, 5124162, 5601362, 4310080, 8365156, 6019017, 5043194, 4904531, 8239818, 1073389, 6007626, 3511319, 6839682, 1652500, 5848620, 2070002, 8351411, 3555297, 326917, 6388871, 4444451, 1415673, 2766019, 6077481, 7810962, 6606172], +[6347156, 2715979, 244833, 7263725, 6015462, 3928578, 3650289, 8106037, 7996692, 5441158, 755139, 1141572, 4689104, 5488716, 4156905, 5310817, 7766222, 1267955, 5628911, 6548704, 2745772, 3066277, 3505003, 616580, 7841657, 2708162, 5738253, 4913530, 8098194, 6422503, 8365904, 2303056, 6624562, 8300563, 1043925, 145824, 996859, 1333338, 2095872, 2452215, 2222044, 480268, 4708503, 659783, 902053, 7913845, 3812581, 7825280, 8182744, 5578935, 755695, 2234638, 332208, 4561943, 6875997, 3800490, 6491174, 7349785, 2571882, 4498306, 3097198, 7808667, 653880, 3976057, 3765350, 4653150, 1149260, 5241151, 5179806, 2772000, 4358760, 6867261, 2514593, 4251951, 1264018, 6118224, 5949099, 5567979, 1151896, 5821711, 3463710, 7817733, 973944, 8053777, 819933, 7907716, 302949, 4854757, 4853241, 6569308, 4309209, 1430319, 1645141, 2053269, 3229107, 5780624, 6158286, 7873257, 7672559, 2829862, 3070530, 856797, 7483728, 6534482, 1497119, 4144244, 2342446, 1975405, 1280534, 1668345, 2253766, 8105108, 3906554, 238572, 7403996, 4359677, 965896, 4288638, 7222289, 2991975, 5163261, 3358949, 7478094, 7832848, 5056306, 3760318, 4706948, 4069374, 5658268, 4421054, 8155914, 2225305, 5405741, 4453279, 6009188, 3873045, 1742299, 742606, 2346101, 6214387, 6771577, 4798796, 4599810, 477382, 1737410, 1589110, 8141721, 2811962, 1966090, 5858889, 6142317, 2466769, 2530631, 293622, 3509284, 7108975, 1450872, 4303913, 6395565, 5752332, 5498054, 6389329, 1439240, 5377600, 1234669, 5502363, 4143623, 4958006, 6156895, 4583151, 2505667, 4333616, 1504630, 6763747, 929121, 1937710, 4912588, 994682, 1967547, 7153624, 1547520, 898633, 1981698, 3609109, 192635, 152584, 4354658, 5912447, 3337362, 575106, 6402652, 7386761, 5602291, 5935434, 6559165, 8081611, 977546, 7095886, 4793053, 214543, 8262616, 1613846, 1343907, 5884725, 2440607, 5387336, 391437, 348550, 3651404, 602769, 6612202, 2243527, 2140324, 3622288, 815005, 4080104, 1174991, 3241575, 6587319, 4828706, 7172618, 2144656, 2227874, 2948037, 1708528, 8055881, 568525, 6795038, 400512, 5204289, 4159163, 6766172, 3287854, 757676, 3012056, 3640504, 7637313, 5003240, 8071190, 1265312, 6396094, 5196418, 7424172, 6786128, 2617288, 2531101, 3175060, 7307343, 3183301, 3689740, 3533134, 2061342, 7732554, 6693431, 7136445, 476373], +[1565007, 6668810, 5441073, 6409040, 325933, 4621379, 3192264, 641692, 6198008, 6005869, 1195508, 4454881, 6100329, 2696015, 963870, 1441880, 1298299, 375054, 7439657, 1505439, 4016898, 7594997, 3752423, 4184494, 7240577, 5234262, 5758346, 1757703, 6464400, 3511533, 103723, 7631220, 5066165, 4389789, 1747369, 993312, 6199503, 3639391, 7272143, 3230860, 2534319, 4535898, 7327518, 1899469, 7732443, 3850075, 519833, 7055444, 7721082, 2293211, 48765, 7403189, 6698203, 1162781, 325293, 682049, 2420562, 4287678, 6898622, 1818217, 3650301, 2671732, 1673384, 5610241, 6312520, 3118138, 1453299, 278863, 3299340, 5251235, 8268967, 8210968, 7600275, 5455879, 5638182, 4576229, 394477, 6501620, 2451431, 7606775, 1437135, 4882152, 8144093, 4336924, 3785082, 6410110, 5506689, 1501952, 1632560, 6040110, 5923551, 4730730, 2570028, 709138, 673599, 4543757, 3591851, 7032681, 5593949, 4394161, 5840022, 1098043, 7623411, 4972452, 7194226, 7982095, 6210346, 8344733, 66143, 4963879, 2629392, 719, 4455244, 1269882, 4392082, 4161802, 6976914, 499715, 3653004, 5586976, 1928401, 4334495, 7770001, 1059166, 7452097, 6019246, 451657, 6310259, 808474, 8239871, 3286525, 3316044, 947420, 4233781, 7482963, 6926605, 7333681, 7173155, 1746026, 6755249, 1679379, 5688708, 1483234, 5945893, 2082314, 8137048, 5987051, 3917197, 3106969, 5289875, 5450428, 1425716, 175394, 3208243, 3682698, 6823123, 3604778, 1583316, 1098685, 1005655, 5191828, 2030019, 4205334, 547257, 4076152, 3344631, 1601515, 3664213, 4073343, 1125711, 1046047, 5535287, 646549, 29302, 1341662, 7093800, 7318937, 8373490, 8202518, 7470713, 3636963, 6755546, 6357336, 8056186, 243462, 2248657, 7095980, 5134315, 873136, 1972413, 5647472, 1781715, 1739674, 2279597, 6308672, 6665879, 8148673, 2556266, 5252265, 1984710, 25463, 2854631, 7302170, 1155000, 1276613, 3726146, 5013688, 1485015, 276161, 2025807, 5303579, 477467, 6125667, 5216603, 3543378, 2423360, 6097313, 4891596, 2832668, 8002147, 5337724, 1176463, 3769937, 573114, 4816849, 3127488, 4239716, 421379, 4340883, 6723561, 5339891, 5377934, 4471980, 18453, 2708638, 6671334, 2938485, 6067829, 3932351, 1883246, 2294771, 4288615, 2721121, 132466, 5704402, 4617239, 7692360, 3129997, 7849583, 2725886, 7215860, 2987628, 5283119, 150034, 8321482, 3767701], +[4873371, 1170100, 4615477, 3737294, 6926224, 3946234, 2118527, 1802892, 5157292, 7532281, 20072, 3711735, 3723340, 3952101, 323853, 4415462, 4786654, 5340095, 5411444, 5852424, 448256, 5436054, 2729131, 3779138, 1788556, 245503, 7068100, 5533479, 731241, 3264287, 4160335, 1591576, 5473437, 2387577, 4172119, 58961, 2439387, 6206953, 6362490, 7507464, 1940917, 7776583, 5942014, 4765341, 3308896, 1555727, 8037309, 6216684, 1393100, 7973894, 3221414, 3296996, 3752357, 3010260, 304114, 5935077, 6629820, 6273192, 5384934, 4672397, 2661279, 640775, 7928668, 1342858, 4309781, 365409, 5823579, 732438, 856230, 3288536, 942885, 1703031, 7771788, 5153971, 2994668, 3295454, 7386052, 263047, 2840644, 4140297, 2464184, 4094219, 2768189, 4474396, 7008868, 3183516, 6512192, 7877745, 4187094, 4632354, 976365, 5893047, 7091073, 3976664, 3211393, 2528068, 3139227, 3634528, 323729, 5284474, 1626491, 4944522, 1619431, 5526686, 439163, 8105554, 1816739, 360187, 5496385, 5749944, 433306, 4145854, 7755265, 3092614, 1122938, 2245980, 2524054, 7202645, 188972, 6669080, 7761544, 3033778, 4585338, 6526540, 6551983, 4186014, 6497629, 3675363, 4942873, 1678152, 2691984, 1921204, 2722940, 234574, 3323627, 5802773, 2936071, 7293563, 2821322, 2366313, 7928234, 3185173, 7617899, 73943, 893780, 7005097, 1235663, 2659632, 1757513, 4307375, 3444283, 1288938, 6099337, 2636044, 1241280, 2153433, 2779013, 6733795, 2449043, 2100030, 3055002, 6197413, 8305666, 2166540, 5778227, 5318380, 7642804, 633268, 4730370, 2665392, 5040554, 2747829, 6756182, 945685, 2213951, 5638932, 4130472, 6971083, 1386166, 1441324, 7742352, 1394833, 4232204, 1253473, 5808231, 3389509, 7097242, 5467207, 485414, 2870554, 6548278, 123166, 7524928, 6282891, 1503129, 3390240, 7739754, 4079071, 2771736, 5834707, 4394703, 5643516, 1959593, 8018437, 1608248, 3390424, 6860055, 4101475, 4187592, 6116675, 6590174, 7059673, 7355085, 1710334, 6743781, 3659905, 1705796, 2027012, 6600689, 6636894, 6050101, 1140931, 6713177, 8157907, 2183790, 5246975, 311834, 3059954, 6731489, 3547788, 8336430, 3907844, 4513008, 8207221, 2990809, 1263479, 7543395, 8021721, 2362446, 5177494, 4582068, 3982165, 7855826, 1441127, 4101113, 1238106, 7580991, 6451472, 903210, 8000952, 1839, 8335586, 6121511, 5151743, 7979879, 5845031], +[35273, 757065, 1776844, 5415327, 5266318, 7260902, 2361911, 8309708, 4481189, 1680992, 2311583, 3550812, 4636157, 4055655, 1196240, 7999744, 7105925, 4769802, 5763435, 6342156, 7696949, 6519041, 997589, 2847680, 3365308, 5206007, 1902351, 6370122, 5792534, 5155212, 3727037, 3477272, 838947, 5550580, 7058719, 2383735, 1649909, 2860962, 7847752, 3342752, 4529903, 4133915, 4046762, 915509, 3986948, 5966130, 7350138, 1552279, 7711001, 456756, 3363060, 7425187, 6023442, 2928168, 5155786, 6310757, 6203055, 5241162, 7524929, 4323714, 5687592, 6410589, 1175202, 5335732, 3519399, 7317472, 2737222, 3045269, 7314476, 7028921, 6561020, 2506976, 334488, 4722105, 1727449, 3013463, 3267694, 4686536, 776566, 2825390, 6417416, 5304903, 7013281, 4492947, 4608206, 460695, 5312731, 2578164, 7328557, 6032063, 3755521, 2183158, 2826251, 6020694, 6394872, 5682829, 1578495, 2604740, 3048952, 4003069, 7254435, 7356757, 777644, 3607294, 6805404, 6823227, 3853934, 6187573, 3059030, 2330781, 4243473, 90571, 5795693, 2824489, 7962860, 4791826, 4344340, 4213034, 4110141, 6210128, 5477104, 171949, 1413741, 323701, 5503605, 5635526, 5631646, 1424194, 5355840, 698813, 6698488, 5120974, 3189673, 4004360, 6888293, 4120395, 4281225, 6590335, 6971791, 8287830, 3482947, 7769409, 5623457, 6305728, 8266213, 783656, 1790663, 5796700, 7264871, 55733, 7952443, 3152071, 2503003, 8232698, 4587675, 5461573, 547105, 7277377, 1810310, 4239327, 3903149, 1835028, 2909349, 943400, 6099616, 6011334, 4047689, 88213, 8373027, 1298950, 7391375, 6095611, 8183475, 4175202, 3721527, 3781816, 794711, 1169216, 5453330, 5662363, 7355848, 6410260, 1496000, 735212, 8049992, 5274321, 5403569, 322150, 3143637, 478273, 546598, 359772, 6732301, 7637046, 7674937, 5312574, 635532, 1901291, 3483414, 7223205, 5458257, 3499678, 2479509, 5743522, 805911, 154460, 6660932, 805030, 5191848, 5954390, 2771096, 2661266, 3279704, 6940364, 1508107, 7506263, 526816, 372253, 3447184, 5368163, 2781716, 186834, 1839703, 6912981, 2473496, 6559299, 2140429, 819845, 3467407, 157520, 4166342, 7040736, 1111104, 5972858, 4026188, 7558574, 7773225, 8252234, 3071585, 191241, 7481358, 56506, 6011071, 5069599, 1021226, 5584543, 3079169, 2521665, 4547884, 60109, 3941206, 5343677, 4770353, 6684406, 2461665, 8346813], +[1171468, 2690084, 5464632, 6333015, 590286, 2992251, 7261509, 1593245, 6148131, 1446778, 7381562, 5068302, 4253181, 2876064, 8111237, 5878858, 4622692, 1383168, 8172734, 880188, 61631, 5334477, 6152544, 7260615, 584804, 1733705, 4767486, 6530910, 6324551, 7515879, 6188887, 2388444, 8314133, 8256351, 8278900, 8025312, 6111338, 4354154, 8185878, 4145910, 1206664, 6575152, 8310947, 6501455, 6494709, 5894054, 2793199, 1788438, 6994619, 228556, 6765537, 2510163, 2312924, 3078746, 2393785, 4577596, 3451129, 2727933, 6924829, 4935844, 7061602, 4299009, 2963158, 192991, 6852757, 5693357, 8333800, 379559, 3286551, 1847933, 3984012, 6922730, 414132, 4297974, 816064, 6883124, 361621, 312156, 8242630, 4045983, 1460531, 2131981, 1725953, 3195606, 2586248, 1796190, 5530168, 3436868, 310572, 2511016, 7333394, 3323451, 7803311, 4190592, 2752182, 3860391, 4549102, 1290084, 4314224, 922945, 4091531, 4915001, 6436971, 5932454, 2544184, 7396457, 835840, 3382244, 7389879, 635017, 2760648, 6791714, 2537546, 5277626, 5776895, 8119096, 2905620, 5878144, 2162821, 4086718, 5232551, 3791036, 575572, 79652, 3061560, 10169, 5045285, 6889515, 1314313, 5727032, 4377203, 3658512, 7751939, 4298046, 6035101, 8280926, 824643, 6109221, 1467980, 6715773, 2775400, 7850822, 2336102, 4546756, 6531103, 4659829, 121669, 6385455, 5578285, 7267435, 2991636, 3910849, 1731402, 190145, 6768672, 3048706, 1035097, 3847060, 5157411, 5388569, 1053009, 7967447, 5794735, 6732198, 7000054, 1591767, 393872, 6981365, 8181315, 6268675, 7043146, 3368442, 6026469, 7394554, 2367358, 921191, 5165479, 2595740, 1800975, 743306, 7937038, 4757766, 1131609, 6944602, 5117214, 582236, 7902839, 8360969, 6692182, 3401117, 6254941, 571817, 511880, 7144077, 3920437, 7877137, 3239495, 578250, 4599243, 7831383, 3816253, 2780086, 6829963, 415086, 5822003, 4533962, 7456875, 116881, 2762430, 7834877, 7704653, 6818103, 103596, 5190014, 6148083, 6658739, 3215439, 5164694, 3554522, 4797486, 3321309, 7519455, 5640373, 780600, 8000203, 5282971, 7531284, 7552476, 201957, 294272, 6036208, 786761, 3712035, 1594931, 8240861, 6084702, 5792498, 4484461, 4662068, 574513, 2610169, 656695, 6174535, 8068033, 4497724, 2614837, 7393824, 6241256, 5962774, 769542, 6982963, 3759844, 1148852, 3360040, 4321594, 4234060], +[4755044, 6675360, 1494904, 1904965, 8157688, 867275, 3276476, 2997980, 4898555, 5056777, 4051377, 1769575, 2186352, 3761653, 6278792, 1157643, 3469586, 1107451, 7414619, 7314829, 3792074, 271094, 5717886, 7322613, 5136910, 806282, 5725234, 1019742, 2977625, 1600557, 3630010, 801060, 4250613, 5480033, 7810245, 4616050, 6638059, 2351463, 1409205, 3762634, 1549903, 6974169, 2649679, 8128674, 4328261, 5218975, 2321504, 5018209, 6435642, 1104256, 6395020, 1486237, 3209737, 507266, 2404431, 4753634, 7185357, 8012385, 4533324, 5984263, 2168555, 4928921, 1007553, 5815535, 955558, 4701064, 7441599, 3255929, 147844, 5809197, 41406, 1856476, 2772956, 6284336, 295847, 3092608, 5572286, 2792956, 5788440, 3788234, 7557303, 465738, 4806169, 5568, 6576260, 5389550, 3511165, 6186233, 4271184, 7687124, 3541595, 1969282, 2989015, 6872929, 2997260, 7804010, 917436, 5542211, 4378312, 907764, 7136179, 1785919, 4926918, 7434781, 2114271, 4597382, 157503, 5459059, 3559167, 5884903, 3134001, 5663735, 6435653, 281641, 3551478, 3119733, 6939856, 3966313, 5097819, 2868637, 2322371, 2512514, 4972668, 7514111, 6392992, 6188345, 3736878, 208545, 1413456, 2061460, 1830499, 1157829, 5336461, 6177668, 6154387, 1311819, 8257554, 5973913, 3028451, 6343325, 3442706, 511233, 7706890, 6409733, 5887777, 1236588, 4520766, 6926744, 8261428, 2633607, 7401423, 6302918, 8279339, 6794742, 5188074, 6118317, 2042050, 1145177, 5540023, 651677, 5057957, 3716215, 5864835, 8134076, 6037833, 2106319, 541984, 7373906, 2602536, 410794, 6638745, 2203565, 5621249, 4281423, 367312, 6724086, 4235616, 3425776, 3908198, 5655780, 5452033, 1071150, 3752662, 7355598, 710931, 6208742, 7527552, 7708297, 6859659, 3028897, 8073572, 5170357, 8334676, 4423363, 536577, 2737969, 2564938, 7502348, 6999103, 4115790, 5821048, 8200651, 4118093, 3220367, 1038132, 44575, 6432576, 3727437, 6589918, 2318186, 2521457, 2481342, 1152536, 1702922, 3608924, 5464428, 5656499, 237340, 5993764, 812679, 1361983, 1832031, 3869884, 777995, 1657475, 3825481, 1897940, 1481589, 4730321, 7994656, 7933153, 3980415, 6770064, 7185850, 6995215, 6686307, 2705536, 7856472, 7704707, 7106489, 208737, 5343917, 2262330, 7955168, 8010568, 669616, 7861519, 562467, 6085618, 2926411, 1952808, 2859925, 3554261, 7436358, 4285336, 4458805]], +[[6523172, 1873180, 1689838, 900545, 3463637, 7117162, 1381380, 6971617, 3893897, 4149288, 7746586, 2740825, 4617499, 3621245, 2116001, 7353587, 6604683, 4428943, 7230155, 5625154, 7369059, 544887, 4588282, 621992, 7189186, 2757940, 5171285, 1404120, 8372463, 68879, 1022528, 121488, 5006207, 7066843, 3361552, 7272187, 2744977, 6148117, 8207472, 701748, 2341919, 7881734, 7211732, 1374144, 6510897, 2256331, 681387, 4340418, 6138902, 505185, 7996157, 4581893, 8084525, 5170653, 3862479, 6773158, 6520204, 2464381, 7477050, 4190468, 5231983, 2014650, 6935308, 2771662, 5377375, 5021327, 6888985, 5140899, 6959774, 2645158, 4450539, 3891501, 6417219, 4692755, 1811697, 1709236, 4785453, 440108, 3025779, 3374437, 5671096, 6576765, 7979103, 217306, 586416, 2110724, 7239820, 5709166, 1153503, 7525741, 6993922, 6341373, 1179091, 2368054, 5953867, 5647525, 2521708, 5748394, 6381118, 6192926, 3728914, 5488099, 406191, 319632, 6719655, 6351191, 1053537, 2426135, 125092, 2208590, 5711638, 6381249, 2843129, 6765410, 1281648, 4753615, 6072535, 7609686, 2898888, 2536845, 5557207, 7710255, 4888320, 7623795, 3430125, 4371129, 705990, 4855603, 4013310, 571145, 7527814, 2327452, 3862327, 7917971, 5040881, 7964652, 1574767, 3144765, 1688101, 6625819, 2732927, 2534105, 1813389, 4410191, 5090510, 1533271, 519348, 3132728, 2146074, 2411977, 3973868, 8115346, 3217323, 7126365, 6731366, 237482, 7858368, 7009180, 5118920, 8075415, 259620, 6483582, 506345, 3367627, 5609856, 3856455, 1595762, 4763366, 7222453, 1923877, 711552, 4217634, 4923617, 5323730, 1564311, 3241595, 4128189, 7495514, 4022248, 4182760, 6535716, 7814569, 1918843, 2597899, 6093117, 5834406, 3768614, 6545194, 7059836, 3279210, 7085689, 6257326, 3488245, 5645446, 6003072, 394008, 4887976, 1122786, 6000568, 5032931, 999856, 522796, 4020096, 4522305, 6376690, 3012989, 2306783, 2608337, 2264480, 4347020, 7065816, 7167465, 7680523, 2466086, 311504, 5844496, 7656963, 6061481, 6897698, 7471520, 2033733, 1037757, 1238363, 4063111, 6278084, 4333761, 2209790, 3782143, 361867, 1586494, 5606396, 6006269, 4116984, 3464551, 41071, 8161924, 5667108, 2901597, 4937793, 691036, 7672681, 5281960, 338756, 1283467, 2331273, 7135025, 839407, 7073291, 5572690, 3797036, 1212146, 5140424, 1442667, 373456, 2145125, 693501], +[6982380, 635923, 7492005, 1591032, 593936, 7009808, 3656893, 7697568, 4859818, 3163348, 6706986, 2053700, 3542660, 2426664, 6651409, 4786180, 897578, 7614508, 1532906, 5845324, 1240291, 1775388, 3201040, 2548775, 7623923, 3967083, 4449439, 3639514, 179876, 6827335, 4102432, 776302, 514150, 3188636, 8266724, 7192700, 7703392, 7724631, 6292077, 885901, 6745081, 7990152, 2865848, 2393445, 7712910, 513496, 4716890, 1118694, 924196, 3134733, 1131866, 7888134, 832542, 5122170, 5404616, 632277, 2623190, 7188050, 1061362, 3440341, 6328305, 6549353, 1910321, 1611483, 1459991, 4129736, 1175542, 2880063, 7661620, 6991078, 5217901, 770635, 2707306, 4287479, 4079002, 5208348, 3177778, 6389758, 2321056, 6809030, 3078661, 5304714, 1381146, 6676205, 610111, 2654179, 1741687, 4256583, 7857788, 6641187, 4580518, 6552474, 5321275, 7661723, 837738, 7972607, 3494865, 1619470, 1512981, 3473560, 5770141, 1857577, 3367273, 3884112, 576734, 5762646, 4695684, 1970194, 4440986, 7435117, 5706880, 7267666, 5238240, 2835448, 6348987, 7437802, 6509475, 1923958, 3645126, 313048, 8042199, 7989500, 3798250, 5481844, 5952536, 5280518, 2623015, 4755240, 7333301, 1125228, 1273838, 6591664, 4829914, 4682931, 1577987, 3118923, 7677663, 1425424, 1653881, 1169770, 47982, 3580203, 6548560, 1962922, 5795517, 77495, 4009653, 680039, 7821275, 5783084, 2004330, 6288789, 785763, 235753, 7149020, 2021062, 4351210, 681862, 3086272, 6443426, 1957875, 8190374, 4629028, 5223514, 750961, 3538658, 7714721, 1734051, 5222159, 1492753, 8228610, 5321490, 2769933, 6565481, 2809241, 4079231, 8183466, 6196399, 7237852, 3494845, 1307094, 1975638, 3765556, 2286312, 6106205, 7716682, 207687, 5243318, 3678858, 6957087, 333662, 1216149, 3504204, 39075, 419453, 7566062, 6689681, 5146198, 3768009, 1127125, 8248436, 5067418, 3156528, 1609251, 611563, 5887228, 4516424, 48228, 3143788, 6540766, 6180614, 993914, 6335378, 2092208, 2055421, 5109509, 594238, 7953071, 5160848, 2901885, 1703810, 7805839, 4987027, 5581403, 6880494, 2044698, 5151845, 4291901, 4810950, 8207590, 2075473, 3672778, 7731727, 2305166, 5894040, 3780884, 807696, 5845190, 1056345, 2161623, 1367150, 7004803, 2624597, 5909826, 3346533, 4239956, 3509369, 6388125, 6561158, 1739575, 7938360, 4248765, 4095750, 425723, 1035239, 1568819], +[7310371, 706549, 1367939, 2495834, 7765113, 5811361, 5398914, 771191, 7444074, 4431490, 4347748, 4962816, 5904426, 4620841, 5697133, 5020011, 1162369, 3646975, 6438705, 1339776, 6791310, 7665993, 3205846, 3401609, 6414587, 1942816, 1768686, 5427072, 7978938, 8137151, 3215450, 2517082, 1632340, 7910368, 6087263, 2537, 4487216, 1509331, 3118667, 3305625, 5947501, 7587963, 7270055, 4072691, 3421070, 6707207, 3150211, 7910561, 516753, 1948225, 463420, 8333030, 4024703, 7577369, 1424531, 4660506, 2007521, 8254145, 1438539, 4272591, 1944836, 1829864, 5166409, 7792035, 6341046, 5069930, 833712, 2194106, 200611, 4189986, 8245688, 1817270, 1487253, 4138891, 4396833, 6633603, 7724057, 35032, 6807484, 5930402, 3599801, 2316088, 5671850, 1827295, 6938643, 924110, 1449054, 4382176, 7446163, 2854247, 8312521, 2646722, 5806252, 1959320, 4135587, 2560005, 4052879, 7012367, 4487325, 96845, 1285370, 8379563, 6231811, 7937792, 1113288, 3843708, 593771, 1771337, 737843, 6708467, 2718002, 7191276, 5623545, 4410335, 6050597, 387489, 2458564, 5160591, 2512361, 91787, 2139877, 6722489, 4495591, 4060814, 290011, 4530373, 5913446, 2526511, 7414552, 8001253, 3013755, 7448892, 4844373, 3703551, 2455592, 6343996, 5187276, 6779613, 1003123, 1904579, 2875166, 4714151, 4745878, 7802812, 4041959, 7278086, 7646179, 8299599, 2999439, 3237636, 6017964, 8143085, 5689117, 3480612, 426791, 7821298, 3484675, 2867530, 3182395, 8235288, 1129300, 7722880, 4370520, 7323640, 810395, 7760119, 7282437, 7854282, 5485369, 8240933, 450423, 8277094, 5513532, 3741329, 5209736, 7028085, 6600361, 1774329, 2279705, 7260367, 3169769, 639998, 1216093, 295202, 6675241, 4305240, 7572719, 499132, 4076766, 3966737, 3533298, 387666, 597638, 5714638, 1705798, 6994905, 7725599, 1125453, 7976269, 6528291, 6145594, 2098897, 3563371, 2811796, 5183596, 980740, 2202937, 4517523, 576137, 2173657, 5727012, 5918359, 4597557, 6560115, 7583981, 5346288, 181910, 1602223, 7839868, 6929593, 961918, 64730, 3724461, 353507, 7849199, 2324581, 1397497, 2272745, 3174922, 7226428, 6828485, 3655179, 134736, 6067457, 1119725, 969660, 6171146, 4566372, 1047942, 5440513, 6980013, 4873027, 6635985, 5458837, 8154378, 1549166, 4571202, 2667576, 4357707, 2351364, 1719483, 43861, 1624663, 2146475, 170510, 3973132], +[7572117, 1253053, 1521143, 4691111, 3353716, 4501662, 8355645, 937062, 8069748, 7378539, 852798, 3673531, 2886408, 1140591, 7620352, 7883288, 947920, 1427313, 2796741, 2622448, 4864492, 7117479, 6757451, 7900152, 3947009, 7244012, 6221980, 3743761, 4597103, 5832177, 7093836, 270862, 2288242, 2573131, 1850342, 1263627, 4823819, 5893864, 4585582, 1152561, 3521901, 1980164, 6112107, 7721508, 4468888, 4847198, 4263499, 2265200, 5028418, 2330718, 3952337, 1439195, 3065237, 56760, 5515918, 3178691, 3505133, 1987494, 3362660, 4336528, 5031357, 5727143, 6511908, 5461006, 608821, 2078486, 998869, 5016552, 401662, 8333357, 4953522, 1638230, 6485867, 3113916, 4804154, 2999409, 3428573, 3485718, 4161227, 1810500, 332486, 8021906, 500160, 7844795, 7990121, 4486389, 3194349, 6149543, 8088688, 7016343, 7120408, 6750768, 4230873, 4350628, 5335372, 7667783, 7307875, 4095154, 3268190, 723290, 2156524, 2993112, 6611996, 1241628, 3725385, 3907302, 6698269, 4491850, 7734784, 1633354, 542823, 3777742, 4704867, 6155801, 2257107, 5403549, 84866, 5328163, 1599677, 5544260, 3207706, 5301892, 6141149, 7512871, 1991492, 6017197, 8104295, 7434585, 8316274, 6982727, 5255185, 2579040, 6394242, 3796377, 5316192, 2705928, 7848838, 3281479, 6398097, 1238761, 6947072, 6854933, 227021, 1112895, 6774390, 5882830, 4950176, 5202592, 5222245, 2413471, 154293, 5201716, 1465309, 3452017, 7871780, 4808373, 8325749, 7572959, 3448419, 3826067, 774155, 8302317, 6549089, 5841210, 670846, 997833, 6950270, 563660, 4464570, 8361225, 2711760, 4319159, 6714512, 3760397, 7867249, 1835, 6383668, 528107, 2450065, 165618, 7424851, 7003317, 2882470, 2800621, 1362327, 7684242, 4403375, 1798797, 4629927, 6266039, 6282644, 7285127, 7974624, 2866874, 5487618, 828591, 666319, 8276317, 4471427, 5200429, 5395964, 6317235, 2752838, 3827927, 3232832, 7379068, 6468101, 8007354, 656103, 2508436, 3055674, 3036559, 2929507, 3632908, 3037157, 6131940, 5301907, 5692611, 4233474, 7577331, 2999170, 3652774, 7794407, 5971301, 2722566, 3329514, 7584156, 1590306, 6848635, 8155296, 8156937, 4743661, 4046968, 5419597, 7234274, 1111835, 6337004, 5832518, 3889218, 139182, 7385096, 6440278, 894858, 2946162, 6973543, 4483978, 4789703, 1896722, 1746562, 6335459, 3045809, 2096312, 3605855, 499165, 7720122, 6975320], +[118516, 1701140, 599308, 1221094, 5744468, 2586747, 5690361, 3557963, 696712, 7304523, 7783122, 1306740, 244830, 2761209, 4634144, 7749366, 6236919, 3772784, 1213472, 3458005, 3082425, 7608576, 3887933, 3191479, 6843095, 4856078, 3794367, 5529686, 1581629, 5971730, 7710365, 3189731, 450164, 5125361, 5275263, 1955730, 7142828, 6426910, 907272, 1665753, 3812512, 5026948, 2603039, 1868533, 3003079, 2699370, 6288805, 7537660, 5103557, 4469383, 6373168, 1249787, 7159692, 1606921, 4521974, 4371036, 3840235, 5621837, 5659225, 8062662, 3390586, 4291120, 8290930, 3432876, 7327471, 3688776, 275997, 5709026, 6531345, 721412, 3554747, 7073522, 7785785, 6979394, 3427120, 4168153, 2523869, 5293930, 7126262, 1127936, 3647939, 4768160, 874386, 1332506, 5497475, 4975907, 2577246, 2840556, 1446802, 8078215, 6943953, 3816198, 3180868, 3043881, 7634863, 1285288, 1695970, 3083110, 297652, 4702643, 3390360, 3073783, 2581836, 310761, 2956774, 7609158, 7377193, 6465622, 8208283, 136904, 7941230, 7917095, 7547283, 2822073, 3694226, 417443, 5160017, 4983865, 6198006, 3871583, 7561792, 452376, 2845841, 632912, 2874930, 1671148, 6970221, 7590436, 5759185, 7243995, 5408005, 2926498, 2417507, 6302695, 5323371, 6658311, 666840, 7809459, 111268, 976713, 7530622, 4663307, 3591750, 4784230, 5003234, 4720706, 2590581, 5639507, 78662, 923664, 7531965, 5221683, 1026813, 5151658, 2921952, 1724377, 8152543, 1989110, 6087939, 1732249, 2257648, 4347410, 3927497, 5144407, 4598004, 4508672, 2156011, 6975380, 7070411, 6488909, 6608994, 5148434, 2843489, 4712749, 5943749, 142056, 2619958, 4876111, 5133304, 5251680, 3961849, 2539820, 4092292, 7629652, 1603165, 4270595, 7335930, 5144815, 6042312, 6898285, 4632639, 724692, 7301590, 3609164, 755919, 5698240, 2131169, 3577397, 2905682, 860818, 3512723, 480678, 1849757, 5385443, 2519918, 1054496, 1605802, 209889, 99407, 7510775, 1798173, 8240317, 103462, 7635741, 766903, 1541891, 289150, 5508190, 2470271, 6679918, 569989, 8240794, 7916176, 4060843, 387397, 7852328, 1974494, 2229841, 1805806, 1100489, 3344896, 1126470, 7084346, 3432907, 421239, 4992535, 4052937, 3098120, 3326669, 2139590, 5146057, 115218, 7537843, 105763, 8014030, 6291251, 4863378, 4802356, 2115898, 6179529, 3547290, 4908768, 4896060, 8124247, 5156850, 7394368], +[3168291, 6245369, 737608, 6022978, 7531545, 2986099, 3209564, 2448067, 507269, 4705925, 4924756, 6752904, 958635, 7941353, 4721544, 6174542, 4784793, 4296995, 6895380, 3657343, 7409177, 1640606, 3436639, 3376008, 6766614, 2350792, 5571701, 895335, 5147900, 6834486, 5946324, 5960585, 3748126, 4106383, 707328, 4370840, 8286591, 1843452, 8098092, 2646617, 1642413, 592572, 3965515, 1551467, 8164577, 2996823, 2382529, 4824121, 8274771, 6027851, 4854744, 2478254, 1065923, 3028315, 3143780, 1495512, 1684331, 4462634, 3253567, 5305819, 3932555, 2340807, 4076775, 1028604, 5826768, 7824189, 1377853, 4719840, 283359, 8345480, 5898545, 3391203, 6042494, 8255428, 12960, 6096030, 4973437, 1634197, 3853500, 6234473, 7543393, 4120920, 5953292, 3289093, 471191, 1752375, 1271208, 8024184, 274891, 8010954, 3841070, 8001143, 4942133, 2406732, 5406272, 5940372, 7473585, 7509826, 2687158, 6612458, 5597765, 3420932, 3458466, 7450482, 1233315, 2097241, 893624, 804709, 5910418, 6834090, 6580959, 408772, 90, 8197952, 324925, 2694058, 4845499, 1048042, 2218046, 8212475, 2215339, 3650612, 4595389, 1219387, 2297582, 4463532, 1868112, 5760052, 4195181, 2961337, 5268643, 6669906, 4293157, 2047531, 6885230, 4670267, 2390933, 5521911, 1738698, 3818456, 2139844, 3325835, 4757039, 4763642, 6752210, 5454899, 414215, 1855210, 6229674, 3926428, 5687159, 7572382, 6518069, 3333465, 7370118, 2388419, 5898558, 390372, 5971330, 3540254, 2594861, 6355787, 6677875, 7651702, 1225349, 2346922, 5871172, 159477, 6606709, 1173069, 4138214, 1030553, 6451652, 3361311, 6149533, 8080044, 4966238, 77721, 3436164, 790393, 1826082, 7462085, 6668150, 6325259, 5057026, 2755822, 8233957, 6740844, 4206261, 1076441, 2538241, 7279929, 5660799, 3226257, 2792806, 6022886, 6300851, 909717, 5890493, 3978629, 7416982, 6498605, 3528982, 8217137, 376428, 7597226, 6832872, 3343679, 2683014, 5472315, 4450004, 6513520, 2180627, 5667099, 1194715, 3147420, 4156364, 6257933, 383298, 7207639, 1971557, 2305420, 3000065, 7750296, 4160378, 6490620, 6911912, 626141, 5371997, 2165093, 4993085, 2667351, 4980525, 7660792, 6395291, 8087565, 3777485, 2786777, 804110, 610331, 6237201, 7908597, 4987799, 7567866, 5115239, 1597752, 2812289, 1984042, 1723372, 4415616, 3604514, 6345982, 2183759, 6367358, 376832, 3201724], +[7439903, 5357115, 327054, 4634013, 5245805, 6677839, 2754449, 5373986, 4041911, 6024600, 7542401, 4626586, 3146630, 448146, 4179237, 3609775, 863678, 5331728, 2735740, 7381126, 7097368, 5404865, 4643439, 2274459, 4781921, 6759526, 6948856, 5338333, 4151403, 774423, 3361214, 6673416, 1586043, 6474050, 808344, 8220709, 222402, 7054973, 3318599, 8009696, 3719056, 1440108, 5901900, 6916830, 1006825, 6777434, 3592018, 5132743, 4831118, 87148, 2455217, 1685546, 2137185, 966535, 1296654, 6910141, 6026445, 7057466, 2280292, 5241075, 1703607, 5921425, 1386664, 8307537, 4098761, 1223009, 236489, 1287616, 4778743, 774170, 3993787, 2256700, 738065, 3297675, 3370461, 6284666, 5856995, 6476318, 1718352, 1843181, 4095977, 5458539, 2967252, 7594126, 5176473, 5941643, 6231213, 2427103, 5368632, 8224044, 3493093, 682584, 7078970, 4234003, 3722111, 254470, 5282543, 7280514, 5563849, 3311155, 2632330, 7530271, 976125, 7061178, 4801523, 7581886, 7842505, 5971463, 651487, 2339571, 4770376, 4574993, 3667083, 7053201, 7818115, 8211462, 6332257, 2586943, 4484954, 343934, 4986449, 6358589, 7072395, 5430127, 2959260, 6403006, 6492666, 2803240, 765759, 3225770, 7941681, 2376714, 8104080, 8205709, 3359856, 628356, 1385105, 7051350, 3870732, 6600979, 5303955, 453383, 1261573, 8272034, 6790332, 2715910, 6660553, 3140084, 4560148, 1056774, 3583268, 7679654, 6803453, 2525800, 6054617, 1674657, 4535412, 4809658, 7030226, 7100215, 4496984, 39504, 2854560, 7283790, 7361822, 7451872, 2573643, 4848455, 7305364, 1376607, 6322979, 259141, 7370126, 2424316, 566026, 6659840, 4840437, 1911335, 6671134, 6517998, 6568968, 2320715, 7594351, 3098026, 5881657, 7534642, 2040999, 692890, 7420679, 29707, 3471119, 3591559, 1773474, 490133, 5385606, 2579327, 6312590, 4754265, 639468, 7890670, 430327, 7762685, 4666295, 4095330, 3534360, 5310560, 7977655, 3793424, 927958, 7730229, 4840707, 3523486, 3211341, 448265, 886079, 2132557, 1760123, 8284689, 6768148, 2561338, 8019813, 652153, 5355226, 1635151, 303692, 5959752, 2715389, 7988359, 1040846, 5950327, 7215096, 4615872, 4090898, 2448027, 6637646, 845901, 1599335, 1521050, 5262778, 7276699, 8297614, 4309034, 4258585, 5324160, 5168238, 5775244, 5197218, 2275555, 2828861, 8290759, 2405349, 2379085, 7376963, 4041328, 7734720, 3341052]], +[[6560282, 3201050, 6162746, 366304, 1923724, 713224, 412092, 652929, 7926524, 3232024, 3951287, 4513750, 158779, 7149944, 3323686, 7916538, 1177586, 3160845, 4650754, 4967630, 1051204, 217849, 7503958, 6026512, 7514606, 5060325, 7807763, 668545, 6281429, 5214618, 1677455, 1213931, 7331667, 312422, 1710578, 1280291, 4852556, 7485639, 5727946, 1146081, 1775233, 2994313, 7661719, 1056810, 7651951, 3736852, 1610476, 5098180, 4578553, 7164983, 5149429, 7617923, 2109948, 1997014, 5700209, 1930568, 2300255, 4083009, 7905876, 5447546, 4474779, 406612, 5119676, 1256407, 4825561, 6277668, 4642881, 5197110, 1809884, 7838741, 4945197, 192354, 134124, 1162718, 4809684, 4319267, 4824432, 1669116, 8108257, 352908, 380357, 3017386, 6248552, 1282196, 2835283, 4066238, 8192039, 6102006, 6877852, 1206456, 2975396, 3886703, 4769727, 6802954, 3768746, 7418331, 622962, 6295702, 7390012, 7266925, 7050045, 2348297, 2890537, 2907402, 263289, 7583839, 4830838, 2248858, 5040623, 5148319, 1217998, 3559138, 6435247, 5184465, 2064548, 6027755, 6961751, 7171968, 4199668, 3180118, 740831, 2047095, 491081, 4137584, 4324769, 2901873, 1432259, 2470050, 7653853, 6148490, 1824094, 1635570, 4313342, 4756063, 6737481, 3868817, 272519, 5028493, 968290, 2600955, 224282, 5119054, 7748076, 6115910, 2701431, 6118639, 7824360, 7229580, 79699, 2901219, 7804097, 5184886, 7714243, 3049729, 1646078, 1327799, 5760164, 3082499, 3010471, 5926887, 5864222, 7808696, 6091985, 4272941, 1900161, 3011039, 7413830, 4527955, 1754248, 3443919, 6816091, 5684205, 6295187, 6197853, 5614749, 6749270, 7555531, 3721837, 6744895, 4783292, 4685687, 6905202, 5421658, 4272954, 2679245, 56709, 5208951, 112821, 6375689, 535815, 7156586, 846437, 2437974, 6523789, 2690123, 6801002, 1510521, 6320204, 3195999, 1599784, 5083254, 4809099, 2276365, 2923868, 2604015, 2323378, 6165264, 4450039, 3479176, 5453761, 703644, 2058154, 1954661, 5537492, 4892079, 745964, 161841, 5274413, 5755791, 4115445, 23570, 5145996, 1456752, 2467497, 6417412, 5657864, 6662120, 821744, 3288811, 3113478, 5895543, 3353452, 6093921, 2586431, 1274203, 6228522, 4909353, 2920109, 5114903, 3480518, 5705868, 2013275, 3859385, 5811558, 3503564, 4653657, 6627708, 7719129, 6684209, 5536508, 4432697, 5125348, 5771296, 7851533, 7664682, 4324326], +[3549515, 6494746, 3129181, 7697556, 5145541, 3330514, 1750921, 6470665, 7733691, 3138866, 1333559, 8083934, 3914711, 5910853, 35756, 3295307, 5094890, 2558796, 1906301, 1861664, 4539512, 3030956, 3676409, 5359921, 1452568, 2036977, 5853752, 2844278, 4491862, 1605422, 8205650, 6018825, 6802484, 6050459, 6233724, 424085, 4912878, 5410120, 4238733, 5551587, 7547196, 7037901, 3318811, 5268791, 6913557, 7643662, 8138304, 6730211, 7275627, 2368472, 2037688, 1267784, 1280693, 3247899, 112610, 2224819, 7394675, 4058518, 8111282, 6445901, 5792303, 425620, 2049980, 4194185, 8169867, 3808044, 4574434, 1939730, 1148563, 3666463, 4630212, 6919167, 5766771, 4494096, 6788740, 2350746, 2701172, 2147666, 6259192, 5179971, 8124687, 7659220, 3362407, 5232896, 3085366, 3343734, 4744503, 2189818, 106357, 2220841, 2710933, 6238786, 7362111, 3895306, 4732040, 5830221, 2789243, 4782928, 7733404, 1766193, 5773267, 241176, 2615777, 5522403, 4721980, 1704977, 3690165, 8044162, 4401302, 324367, 5566510, 1031937, 2524813, 5115913, 6360475, 2978829, 2346795, 5174050, 5092469, 7106751, 1148775, 1110921, 4330366, 3084559, 4258400, 7905984, 1908476, 790609, 8267670, 7659381, 3863407, 3641413, 3451373, 3464533, 2808940, 7445327, 1637609, 586986, 4849587, 5785218, 997168, 2091706, 7644460, 2105709, 2044436, 3893111, 7060630, 7312762, 4159327, 1199376, 7030765, 5939347, 1795539, 6567224, 206868, 6231455, 7623327, 7144320, 5834418, 4754025, 5262100, 7291200, 1693999, 2854773, 4580861, 128181, 6880561, 1896793, 4882624, 2333334, 7374542, 8032151, 1639314, 286923, 4663847, 4551305, 7596481, 8352970, 3802016, 2899496, 1718012, 2546977, 5791288, 8213148, 8040930, 8181498, 2123029, 821310, 1314412, 7774407, 4462103, 7350760, 7335634, 3547042, 1115075, 825586, 6308028, 4498627, 1114097, 5169099, 5584996, 2893974, 346964, 3035602, 178209, 402825, 1972151, 5717285, 5391075, 4794362, 6887588, 1597337, 7742421, 1002780, 7782371, 4647518, 5934161, 2881732, 5956686, 6081180, 7983039, 3305882, 4162806, 4530121, 1552757, 6909535, 6424246, 6541222, 81972, 7896125, 6392519, 5393412, 5048687, 1394383, 6435344, 1370492, 4809669, 2654936, 3581835, 7601325, 3038330, 539564, 2256290, 2994168, 4131171, 5523053, 3470778, 372001, 886831, 287638, 3956532, 3591262, 8166346, 787099, 3437783, 7604186], +[588114, 6815989, 7086444, 3198499, 3952454, 3345439, 2331638, 6548655, 7968333, 882342, 5578940, 6176841, 330537, 1924344, 7839211, 5997913, 4325608, 3441774, 114720, 6594369, 815332, 718499, 642525, 6622078, 2830294, 455333, 5298258, 4912099, 7251169, 3846091, 2158209, 2931587, 6541629, 1381907, 3222695, 752702, 5972813, 2574483, 6661348, 1587848, 5021031, 1479395, 6056794, 3303769, 5575522, 1497161, 4314312, 3367653, 8023968, 6227712, 7257841, 7281098, 2766345, 2315031, 7510492, 2623502, 5330916, 5250918, 5979498, 7394954, 1001745, 3384132, 419249, 31152, 5821198, 5160876, 5627649, 646730, 508753, 6027486, 1015639, 2658772, 7064624, 6550443, 2531606, 4022923, 4647343, 4967335, 1933695, 6824440, 3575917, 4804026, 6251376, 4549803, 3582621, 6664956, 8112585, 8054790, 8330231, 2554894, 6518494, 2500318, 2557633, 6158188, 1908731, 3301488, 7479403, 908585, 4609871, 3145515, 1447643, 7239551, 333917, 2270904, 782848, 7679280, 6318182, 5959214, 119642, 1502843, 5639231, 52057, 2021566, 1640884, 4584855, 853912, 7825281, 2061408, 1287255, 1808993, 8061031, 2838399, 6600647, 7584074, 2176519, 184492, 7713217, 4956266, 1187744, 3666271, 730100, 8167666, 8046322, 5655528, 2684631, 5551754, 323335, 6307861, 2309627, 3886362, 6730917, 364677, 3880599, 2900880, 1459471, 1394302, 5024312, 8196976, 4976569, 3698636, 1188165, 4575409, 2998756, 6664772, 39811, 3981539, 7495584, 681683, 1924400, 1836052, 5954042, 3818394, 2875786, 970803, 2266563, 3087011, 5734607, 5137737, 4376315, 4066901, 6758965, 6998501, 8375955, 6928731, 5412174, 6587240, 8130609, 8101276, 5036869, 3339559, 4152853, 97987, 7473468, 4176415, 1287068, 1016236, 1319658, 3032787, 5352225, 716068, 1308371, 708341, 7258175, 3181936, 2792526, 2931361, 3202810, 1873169, 2955585, 1827005, 5338496, 3629476, 4377627, 5126229, 64383, 7904221, 475881, 47330, 4744478, 6363917, 8328167, 1279047, 3324956, 2290916, 6911316, 3405748, 7432798, 5404720, 3717570, 6873828, 1731585, 8320614, 4406064, 6914116, 1776296, 566695, 4447477, 1817857, 1973033, 3298231, 6226485, 1672811, 7919266, 6398000, 1258224, 485001, 4999071, 1954761, 2601742, 796689, 615301, 5047246, 1582302, 5102124, 4217785, 3175274, 8099631, 4691275, 2042231, 6676074, 6458548, 2411345, 2962655, 2084640, 7669048, 4292416], +[1380865, 8028581, 5671670, 4976794, 6498699, 1266971, 5520359, 5895001, 5820258, 5649259, 7080019, 6841930, 1365551, 4721654, 6724609, 4031316, 2092754, 3462442, 4452673, 1271106, 7652386, 2395974, 3032908, 5195933, 7289516, 7311720, 8286632, 5624601, 4796102, 3211157, 31666, 2184719, 2112046, 826531, 5886792, 852293, 446030, 4572823, 2279101, 5612674, 8234702, 4978831, 4372678, 7317068, 4005342, 1727162, 1591331, 1415010, 915332, 5270605, 7026843, 7692875, 876000, 5187031, 3401464, 7965905, 1891477, 274468, 5447791, 8365546, 1906086, 7341213, 7284684, 7825544, 7723898, 1876236, 2868739, 7466871, 7003265, 1060890, 4111841, 7219399, 5287445, 3777307, 6984165, 876148, 4196809, 2473937, 3712518, 7730788, 2712692, 2230510, 6416727, 7686888, 3153255, 6111193, 913279, 5598464, 5144241, 6638749, 1365568, 4680250, 6705771, 470257, 117559, 3994457, 1442799, 5839389, 4262516, 6697587, 4364607, 1938605, 347752, 3713621, 357056, 6179396, 1391890, 2919942, 4287611, 4888739, 4633957, 854259, 1857887, 3521209, 215045, 4532312, 7871630, 1720750, 7068823, 6856018, 4183564, 2960769, 2880063, 1139559, 317646, 7633491, 6519059, 5337344, 5321955, 8308206, 4977111, 6485918, 7775842, 7244728, 3847385, 4465550, 6836177, 758973, 5237611, 6361393, 6645784, 4876701, 2343895, 8115585, 878759, 3866096, 1837288, 789913, 6216065, 3295628, 7624795, 2312403, 7267475, 2945068, 5870992, 5256799, 7875436, 4945643, 5335515, 5952415, 6680110, 2686598, 1467845, 3479558, 5007537, 4078496, 6590073, 8037002, 3126999, 2521173, 3609739, 993251, 4905186, 8048901, 6995691, 987610, 519080, 2186199, 6185556, 5550878, 5553557, 8053190, 6671292, 5127336, 4971456, 1869973, 4213209, 394451, 2907184, 3889226, 1785032, 4948797, 1116911, 2202759, 739314, 7744411, 6460675, 1652916, 3112799, 4914797, 3634069, 7190757, 5090045, 3361830, 7365791, 385526, 5357961, 4394294, 6587636, 7818266, 2807567, 1341399, 4577711, 3619732, 634810, 8012974, 7939227, 5136622, 899984, 6860206, 2642638, 1559165, 874776, 4330217, 2567269, 6941591, 8056385, 7198251, 414535, 933807, 1559120, 8095592, 550669, 5304618, 1471941, 1175016, 4361767, 7891454, 2603398, 2070056, 2295626, 8065818, 4804672, 5800891, 6303411, 7804070, 5851939, 8013624, 640418, 2603179, 6848082, 4151413, 4267573, 474601, 7610842, 1367355], +[1184651, 6760422, 7321157, 3650876, 7785310, 4234663, 6428477, 2551940, 5353315, 8369334, 3454391, 7924743, 5938589, 3834955, 6858820, 3133116, 8194863, 3127777, 3397926, 1514597, 5909568, 2531198, 3244621, 3564834, 7738315, 7601094, 4430411, 3476583, 5030406, 2111007, 5768015, 654458, 3095355, 4827878, 3102944, 1960314, 4153703, 7461216, 7042487, 7539858, 5041445, 6112033, 1225691, 2991337, 8336802, 899478, 7345851, 3398708, 6573113, 7383585, 7291821, 966322, 6497494, 7245101, 3496540, 5115709, 8304049, 3622202, 8279930, 563023, 794457, 1184381, 5344953, 2977115, 3189450, 1640404, 6873797, 1052003, 3911176, 6861183, 2391580, 3659339, 1516039, 3526306, 5246000, 2579089, 2953678, 344771, 6795935, 4476297, 2440336, 2142356, 4298094, 933421, 2227861, 2530167, 2331794, 2415490, 1343216, 216091, 1532321, 3342594, 2396100, 6834414, 2316958, 4777194, 7538304, 5694405, 6534541, 4773150, 8061474, 2532780, 4968550, 1087998, 5029805, 6356220, 787610, 2961614, 7665715, 7962762, 8050452, 7983796, 4553075, 1664179, 4005666, 399220, 1957998, 2027801, 7312473, 1785556, 5357274, 859263, 1937161, 405964, 7981681, 4092156, 7535880, 501747, 8020917, 2376426, 7767258, 7641933, 1121600, 3079830, 4076945, 2047108, 1543300, 7452809, 6210992, 7100253, 8171337, 1909638, 7776092, 4062142, 1906484, 5416535, 1454131, 3016676, 8373910, 2450657, 7136670, 3572112, 6955355, 6610737, 2067288, 1986701, 8012590, 6059574, 5250749, 8105476, 859810, 5561655, 3716773, 3860443, 1799394, 2600020, 688138, 2715590, 2137092, 698224, 5005334, 7086287, 5431804, 3007034, 3642000, 6930815, 7983760, 2355668, 7328151, 2233726, 2443190, 1976823, 3576650, 3061799, 7341214, 8009258, 7108138, 2599588, 712841, 7701746, 7337136, 543992, 624351, 7834805, 5285592, 2987742, 4203956, 3283878, 5835504, 6195781, 1122664, 3519473, 4389154, 3725146, 1084972, 6344792, 220345, 4877674, 2884262, 114711, 6636685, 4185597, 3846535, 6697064, 1380662, 95168, 7997123, 5420903, 4880090, 1416251, 8312108, 6408429, 5122692, 5859146, 180887, 618213, 3650263, 3391112, 3314061, 410598, 3993794, 6458803, 5238126, 3233290, 1231639, 2281291, 7133825, 5197891, 2862661, 55176, 5754772, 1457308, 6998433, 6370116, 2157553, 6336055, 4401345, 5288328, 1200432, 2776871, 8283049, 7821315, 5997945, 980561, 7340541, 5998133], +[3867691, 3089308, 7176952, 274886, 2102231, 5857083, 980981, 2610035, 5447303, 1832203, 8205943, 1001719, 7783851, 3198494, 5267662, 3855994, 5446029, 230712, 7691428, 1289031, 2743096, 7910056, 1125798, 6146539, 2411467, 3967501, 2323086, 3849146, 7323274, 3545658, 1662944, 2690717, 2656594, 554410, 94676, 3700969, 104983, 1830255, 2110397, 5608626, 6837281, 7059281, 1917813, 7317681, 6201615, 8020912, 88185, 4877324, 2766595, 2420909, 3093780, 1284537, 4225983, 456030, 570885, 2147476, 4684220, 6498994, 1992604, 5565483, 1290324, 4483179, 1991214, 2018787, 6459723, 2447738, 5835425, 606716, 6992191, 5987755, 815408, 1472142, 1556487, 4827977, 5953349, 5388723, 7085823, 3173539, 2593128, 8199150, 1492884, 1153205, 1338182, 5127957, 6560307, 7280312, 149479, 7866833, 3847419, 5458138, 1344718, 6179557, 3020253, 2291684, 1620611, 788483, 217734, 2109316, 5191901, 5322241, 4337068, 6074137, 1662122, 2385046, 6181037, 39641, 145604, 623551, 3089294, 4692574, 141244, 783497, 5178564, 3408945, 2378824, 5095686, 6402470, 7057389, 4587559, 3226001, 2174188, 6422321, 7977141, 1504302, 7394408, 6140094, 1044484, 5392974, 5309413, 4025222, 2786500, 8218141, 768757, 4535499, 3813551, 7653226, 148043, 6888503, 3703024, 6621300, 4433601, 7516777, 5241591, 1015391, 6388006, 4194408, 6401018, 8142017, 7354262, 250958, 5959676, 4039571, 363390, 7352501, 8228045, 3517082, 8316112, 2083790, 1867771, 942995, 6835687, 6790403, 1385426, 916642, 1115772, 1227492, 122710, 440864, 4237758, 4652056, 7774063, 7078082, 856716, 596382, 7932339, 8140768, 4551386, 553142, 5783105, 4149666, 2786048, 6883390, 128950, 649209, 2278868, 3067188, 8163926, 6330567, 4055601, 3868939, 3511369, 955051, 3989287, 1425435, 838616, 8162308, 4363026, 2511771, 8354105, 2289324, 2248975, 697231, 5811936, 403569, 6695602, 7189027, 4747565, 5309632, 3943884, 7996533, 3018177, 7879973, 3438793, 2475142, 4506017, 5424502, 1334155, 3750172, 6324699, 3824655, 4735835, 6340232, 5036986, 5196904, 5979993, 2871866, 4440012, 1919701, 788014, 61035, 695323, 3920175, 7146697, 6664698, 5622277, 2567997, 1256750, 3214433, 5024675, 5425649, 3065938, 2887841, 547802, 3526363, 1652586, 3785163, 5059466, 1145401, 6135103, 1802951, 2593006, 605606, 1976537, 2969296, 5473653, 5727012], +[2516322, 8268791, 4157838, 6573353, 2404243, 4809871, 1415572, 8046432, 7832507, 6967614, 8084589, 2153092, 2160439, 7511087, 8271649, 6473732, 1004702, 6487182, 1755197, 6435522, 452625, 2603907, 5983017, 6687581, 2045096, 5515960, 7776846, 8197595, 6667866, 6652787, 7740728, 2910461, 3453085, 4249186, 5624977, 7124058, 6042319, 3531298, 6964871, 6009130, 5902794, 3671074, 7525313, 4326355, 1855468, 8175969, 727246, 8117505, 944314, 2935313, 4703999, 3810377, 7914788, 7813111, 6174466, 8366912, 1408324, 6327601, 6143422, 1138389, 7737373, 3433529, 1932499, 8339877, 5558649, 6278287, 1725675, 3999438, 6127890, 7715952, 6238468, 932047, 1703957, 6281378, 3291998, 7469283, 1708362, 5877947, 3768941, 3482958, 3090332, 2900551, 1786379, 1633004, 7756467, 5099838, 7150335, 5671424, 7356168, 7509229, 3579301, 1452172, 4023424, 3394577, 4828632, 1141998, 2048710, 5081215, 4998381, 1367084, 4886097, 4295759, 8367435, 1907171, 3791149, 6795566, 873371, 5125811, 1832655, 6240173, 6034658, 7339729, 2726713, 3065264, 2623988, 4220121, 2821956, 3022358, 5691894, 4509976, 675841, 4405404, 6756620, 1128041, 5730597, 1421086, 2469757, 1585728, 5481099, 7987560, 4368337, 8277552, 4021806, 4273646, 8345112, 1670273, 7307069, 4661457, 2083758, 2199525, 2849025, 2010259, 7765647, 374954, 596562, 4338587, 2020293, 4260659, 8312976, 7529446, 4227890, 4415456, 1025263, 405185, 191227, 3799070, 6972538, 142740, 1863153, 512161, 2906573, 1273568, 3666838, 2747054, 8245293, 1898586, 360662, 7158433, 2058819, 8377872, 6984663, 6917065, 4046874, 4756259, 3475520, 4457512, 296075, 2751983, 7121227, 6042687, 4490544, 1073697, 2211463, 4118255, 2878436, 301705, 8019051, 7148272, 4077673, 5637138, 7685623, 8313576, 595790, 5840138, 3044383, 6838454, 4423037, 6244324, 7195147, 7179643, 7100721, 2156755, 2891336, 1820211, 6370590, 3287287, 368374, 5276057, 8136797, 1432604, 2410061, 4458152, 6306542, 6622667, 648219, 3869376, 2793255, 7269797, 2293144, 1945458, 6826984, 4042670, 1131525, 6254350, 2980321, 417394, 4461348, 8136852, 7991742, 5713203, 6361548, 4451234, 684478, 5493737, 5307006, 4765578, 8191336, 3588572, 7871726, 412465, 2437007, 4353860, 1360131, 1437432, 1409484, 6549193, 4973950, 2990294, 4555338, 1296083, 1423009, 6169018, 7769478, 8373368, 1097601, 6560438]], +[[1416855, 1244121, 6342865, 7691165, 61692, 5986141, 7401239, 5863600, 2851801, 5853656, 6994019, 3356387, 5111802, 3957978, 1961477, 8126722, 7493644, 3613023, 8024934, 7089127, 8209767, 4617065, 1156382, 2711485, 2664853, 8162644, 4858359, 5249054, 1673850, 2811818, 5383948, 6422490, 1603657, 7957668, 7425726, 6071807, 5209185, 3897666, 7497174, 7933687, 784536, 5330227, 8276768, 2693234, 5380920, 5051418, 4355455, 459355, 622211, 179479, 5904134, 6216359, 6958193, 4044009, 5772515, 3473670, 4203974, 3341309, 529750, 5031857, 8248971, 4438328, 2507405, 6839992, 3887060, 7006896, 7566145, 3031418, 4320836, 138587, 364074, 7355229, 146991, 4851732, 1699949, 4194015, 5606046, 7498733, 7689899, 7084534, 123632, 580601, 6568661, 7079899, 7483101, 8052706, 228050, 6443600, 1165905, 5392253, 3960563, 1607656, 2437447, 4425571, 1202190, 6792125, 5217152, 5691123, 8302100, 2494319, 8021778, 6992971, 5504125, 5545449, 198916, 2095012, 8113205, 219573, 3130781, 4029414, 7735066, 2796398, 4575277, 7676894, 6872504, 55646, 3688773, 7499087, 2539121, 737840, 353764, 1789043, 6164097, 1537491, 6021767, 1105087, 6460945, 5723500, 4403060, 99349, 4582639, 5402826, 818937, 5812994, 7003379, 5890978, 870425, 7599881, 3525104, 1592883, 1386098, 7410459, 7608276, 1512182, 3562944, 4950106, 1015402, 6434072, 3572444, 697183, 7303902, 7274651, 6751265, 7478223, 7277052, 6615247, 6949745, 5551383, 6820494, 2098498, 6830885, 3075534, 3921525, 6684177, 1766234, 5905724, 7911604, 6447529, 6842865, 1584327, 3490531, 7148173, 7005182, 1877610, 498463, 1289919, 3228187, 7894284, 3856617, 6512081, 3941649, 1601003, 5223958, 794296, 5391196, 3069152, 1670910, 2348479, 3033172, 8224322, 3595794, 6522341, 2794231, 3255363, 939245, 4064757, 6868026, 7913755, 6308862, 5078820, 1440166, 3703577, 7114610, 4370783, 5273432, 2765665, 4022417, 7100878, 3281268, 4366584, 3478280, 4874955, 3718367, 6341252, 7086508, 5359540, 7604072, 2957172, 7289880, 2606882, 2383494, 4870439, 3753101, 5936945, 1130106, 4890784, 3646921, 2194741, 3063142, 1939531, 7452108, 3720205, 2245133, 8245297, 2343067, 6315888, 999805, 7939270, 6845922, 3253949, 7535338, 395564, 7118543, 8262971, 3193560, 3974787, 734716, 4883184, 8100688, 3501656, 8372756, 866918, 3912939, 630685, 7291427, 1101425], +[6464756, 711736, 6709213, 7865557, 6375591, 1485543, 4703147, 7936921, 2242085, 6819813, 3658831, 1068022, 3299609, 6534855, 6282555, 2220401, 5184470, 7778658, 5261876, 31497, 8282282, 7547366, 4499643, 6358915, 161875, 4372662, 3347202, 1335377, 962986, 638159, 7005745, 5176497, 7062724, 2098421, 3144196, 2853992, 2375594, 221785, 2469710, 1147230, 1605347, 7250816, 7635, 738260, 6391974, 4837746, 8269572, 1710664, 7677837, 3078084, 2802822, 6049258, 2060689, 5894411, 4485798, 4990150, 6556049, 8349367, 8083549, 6211102, 4536043, 1927865, 7603954, 4844931, 3511842, 7901767, 2987453, 1040781, 3300380, 3785905, 2244106, 3844454, 6065681, 875286, 901725, 1447812, 1454075, 2209087, 4566224, 2641054, 4664226, 7044503, 2907901, 5619522, 15945, 6491414, 3294380, 7855403, 1503768, 2517018, 7662868, 5577063, 565901, 8227092, 7834386, 4071581, 697604, 3225324, 6879809, 8212441, 7064852, 914071, 6635808, 7914132, 5999661, 2472779, 7078883, 5938287, 4525896, 3286465, 797441, 5121435, 6844183, 8089341, 6777533, 4401672, 4313878, 1782295, 2197072, 3879208, 1004022, 6638255, 7607848, 844911, 5613290, 2107778, 3601937, 7090359, 5642571, 2974518, 5977896, 3355098, 740591, 8036358, 7500501, 2383890, 5491408, 4137335, 4707631, 3721791, 7650689, 7834372, 7257687, 1104414, 8164728, 424126, 7057079, 982554, 3421796, 456716, 4384958, 3096385, 1203767, 6751910, 2198129, 6687063, 7114944, 3156645, 3923664, 8245694, 3230125, 5096148, 4175118, 7674836, 401741, 6719535, 3954303, 7535607, 6114881, 707366, 3720614, 3899987, 2982421, 2515717, 1647767, 8153554, 1080623, 2563678, 7734144, 6390882, 4032892, 6543545, 7190205, 7045366, 2802733, 7679671, 489932, 6164464, 2342980, 152728, 2915619, 6275564, 6587674, 7469193, 2127601, 4076300, 4068991, 6156442, 3948215, 6944247, 1299658, 8353476, 586037, 7606722, 6099682, 2483284, 503757, 1946033, 3232588, 5141017, 3848106, 4188602, 2887135, 6408521, 1929044, 5623900, 4124999, 6839935, 7646214, 7650100, 1172286, 476719, 1536126, 4996383, 6933525, 756964, 5622424, 729319, 3135099, 3196840, 361865, 526803, 6939463, 4709449, 4156075, 6121366, 8033388, 3363575, 3304423, 4498831, 7185572, 2190658, 1232610, 5988148, 2876804, 2557591, 4584204, 6766511, 2783031, 5188777, 2322330, 4374270, 2093177, 1545316, 5111136, 5006430], +[5849817, 1409740, 5486686, 444831, 694249, 6698493, 787873, 3079427, 2702129, 8320460, 6270177, 6950397, 3089861, 7787666, 1625940, 4461755, 962242, 6777636, 8001326, 1202442, 645133, 2441880, 6762279, 8260360, 1219783, 4798206, 3888428, 8353292, 2802273, 7896398, 2677029, 5285141, 6887782, 3292758, 789317, 1654710, 6859015, 6266076, 3878238, 5178619, 4437758, 126216, 7223634, 5758611, 3885346, 2073911, 5605751, 5545705, 4145292, 4550273, 2866408, 2087551, 8131149, 3670537, 4398938, 3599455, 5311172, 2420679, 6209447, 3851432, 5281705, 8053244, 4321982, 5046031, 3826712, 7702201, 8213721, 4748717, 739482, 5150647, 1428557, 3732861, 3436183, 6624124, 5321890, 1196402, 6298409, 6046471, 4892502, 3777602, 4750009, 3130605, 2072557, 7295730, 3870003, 4816584, 4902201, 2530739, 7723106, 5785460, 6190229, 1107498, 2431280, 7090234, 1549116, 7851327, 106763, 156373, 421919, 6040131, 5009725, 5245831, 8330926, 190343, 7293947, 7732268, 3108996, 6714905, 4062243, 1198468, 7981306, 248540, 809651, 7939220, 3142494, 2904613, 1238151, 3521300, 4411874, 1254130, 845623, 6284068, 6005995, 6912106, 7388413, 6919361, 866924, 5677158, 1400440, 3715304, 4695619, 3075395, 3362270, 2054771, 4348361, 6669519, 6194819, 3932970, 4341954, 1774674, 3675717, 6460668, 1149259, 2588291, 6686181, 591677, 7004797, 3042118, 20204, 3082896, 675557, 3247409, 4838568, 694477, 4462008, 8271309, 4188569, 5429358, 6570973, 1014750, 2168928, 1291070, 3132005, 1634052, 2034676, 3952640, 7966065, 8260647, 2733391, 5684091, 3295826, 4467753, 5224768, 6719505, 1764292, 3269428, 6780164, 2182883, 5128760, 8332670, 3822733, 3715748, 3574804, 5047317, 5702918, 1234608, 3988333, 2217896, 1220385, 1268040, 2752902, 5578898, 3569570, 1325549, 1279402, 3779552, 2644340, 8316969, 1862710, 1371761, 6726, 8178022, 5773778, 1620325, 3226860, 641410, 2435048, 2856008, 7815569, 2995934, 8146457, 8178032, 3709719, 3511782, 7033106, 969564, 1193570, 3434307, 4528896, 7589503, 536431, 3603814, 2790783, 4474437, 6862769, 3819027, 551159, 8079350, 959838, 1979737, 7606105, 6815197, 7112376, 2800781, 6058094, 3652150, 8212349, 5324213, 6870422, 5980014, 3179747, 7292980, 6391221, 4401099, 7427218, 6080222, 3194671, 3649322, 7975631, 3427547, 559851, 2895669, 1169992, 3295465, 360072, 7853803], +[2018662, 4444441, 5234908, 894674, 5040680, 6206295, 3273044, 1743001, 5428147, 4402165, 5595345, 2034197, 5597740, 4610020, 471364, 1533884, 4911833, 5720499, 1870429, 7126894, 7334594, 2756023, 1118792, 8123042, 2018743, 543986, 4998221, 2115139, 7860557, 1050000, 2330573, 3995461, 4115129, 7691108, 2059482, 586437, 611563, 8184718, 6726812, 3826816, 8205953, 1720676, 7079711, 8263794, 1903796, 8264046, 2187409, 1071182, 2858022, 1068744, 5771032, 7104028, 5973100, 5528563, 4422524, 7095928, 3614569, 1087028, 8105243, 2268638, 3454061, 1467962, 2295539, 7153066, 972242, 8230316, 4329852, 8305478, 231008, 5334926, 7736732, 3250187, 3933387, 3837210, 1448234, 3919522, 6000152, 4705704, 8100424, 6100007, 4340599, 3811603, 1123586, 6703190, 957434, 204266, 7540201, 4567959, 646657, 1770013, 3538461, 509265, 789753, 450470, 4511354, 5165022, 491946, 2802663, 4475535, 1778177, 2747021, 7684804, 2106443, 7157607, 3290015, 338784, 7113790, 575417, 7978204, 1845672, 5905467, 6113418, 8247141, 4110697, 5275518, 6495813, 5402206, 6101560, 2183852, 8305795, 1480098, 5223157, 179394, 877891, 4596113, 3848243, 7785546, 7425357, 2811537, 713270, 7279687, 4990735, 4085407, 6722097, 7573683, 6162822, 4956443, 3311520, 3672264, 3700573, 6821546, 6197097, 7043518, 2110246, 3051829, 1666017, 6021674, 7739671, 665610, 3507537, 971062, 1827281, 5771007, 6150878, 644262, 123577, 2184933, 95779, 1456182, 1468470, 6017552, 8281615, 1722984, 2169689, 4298362, 6508716, 7689894, 4856680, 1725488, 9233, 4516714, 6096395, 7053714, 7243416, 8098338, 1247353, 4701397, 6240392, 6000834, 5276837, 4386225, 270017, 5638388, 2583580, 6389780, 2130286, 2093267, 1216394, 2586234, 1058495, 8153941, 5781093, 927041, 155074, 4080960, 4953678, 3118619, 4944804, 177556, 8275821, 6041293, 2742470, 4048403, 3299339, 129093, 3518322, 5304643, 7549677, 6868216, 7967306, 5858227, 2193730, 7145363, 6912666, 3018005, 5003933, 1395642, 7976016, 7569070, 3992941, 3673614, 3118416, 1266480, 6901994, 1650712, 724328, 2025456, 8240004, 2807879, 8016821, 1142706, 3031965, 7450741, 6635786, 7025274, 1094707, 2630021, 85615, 5951300, 39069, 5620154, 977783, 6964460, 5239039, 7893137, 5753003, 7631935, 6035745, 5409322, 5591078, 2046944, 660858, 6604457, 476035, 7999781, 875224], +[7119756, 4972460, 1310253, 5799861, 6320057, 1838440, 2936013, 3280698, 8138122, 778289, 2404562, 2563837, 2678311, 6358510, 5801875, 670860, 6895569, 2960228, 2887199, 2193334, 5858100, 2294914, 1834682, 208631, 781613, 5663208, 4045660, 6908178, 6330799, 2237087, 5397812, 763552, 943973, 5962812, 5911667, 2624478, 2443225, 5813561, 334169, 1775638, 1496056, 4018526, 6927038, 5774359, 4759847, 6409585, 5362256, 3092377, 5159208, 3496481, 2464651, 511536, 4276612, 1928938, 7957408, 2796748, 941259, 6060318, 1392255, 1930180, 1862512, 6223000, 3362190, 5148269, 7931845, 7305546, 6619922, 743920, 692996, 835459, 6131829, 6437014, 6873163, 4010177, 7741843, 2503727, 907164, 3282489, 3480743, 5054557, 5485690, 5439016, 4241332, 6568008, 3180886, 3992487, 2557821, 512455, 7156096, 7284801, 5406937, 3082865, 3251066, 3640006, 7447880, 267118, 4204129, 4338699, 584520, 2183546, 3929257, 7956917, 5407418, 5854799, 176809, 6291879, 956485, 2729693, 5749400, 2437549, 6059559, 3423633, 3297020, 4024582, 2676623, 2744431, 375980, 797488, 5232420, 3219363, 7145759, 7396281, 6437252, 3744838, 3203616, 1123425, 1107772, 818992, 453409, 1049565, 4272033, 4160146, 8228715, 8097344, 538620, 2191016, 2785784, 497971, 4033363, 2352298, 7010989, 4016365, 2914639, 7978690, 3369852, 7950004, 167240, 6067894, 1477839, 5144465, 8126390, 7680303, 4017515, 2076874, 7732122, 4246604, 4551424, 4445837, 2629239, 509273, 4773678, 3634209, 3409809, 23041, 5284130, 4544389, 3705345, 4659784, 6498964, 5972053, 319312, 6691764, 6683588, 3961773, 8357927, 450976, 3989378, 4387933, 4995597, 6264808, 791108, 3149295, 5209691, 8175737, 1898665, 6572135, 4230489, 6142746, 5110757, 4789033, 1733887, 5687215, 5500314, 7634111, 1804532, 1793729, 2472771, 59479, 7893782, 1142792, 5854327, 1392613, 1803269, 1199175, 5191234, 5422057, 495452, 50482, 6338102, 401399, 7013836, 6276048, 4620970, 7628870, 7679866, 5890102, 7382457, 4620671, 5869886, 2254689, 7180297, 2549194, 1208525, 6590305, 2626928, 485012, 3627915, 2749053, 5459012, 6499299, 6227203, 376910, 4028881, 2841408, 8127679, 1931393, 7261836, 2698324, 3141828, 1170937, 5841775, 7192371, 2421016, 1761073, 931966, 259565, 184327, 533288, 4064296, 4665505, 3225289, 3169216, 1078868, 248876, 98981, 5300384], +[5177508, 4776410, 3466612, 1182707, 4458955, 1126918, 2827731, 3667699, 5421873, 3506339, 4722249, 2045790, 1321195, 182348, 3004003, 130811, 2013491, 2267613, 5038641, 2348182, 3223877, 2470941, 2338344, 5862561, 3284937, 2124441, 3464572, 2393869, 285605, 7674257, 5340088, 3009879, 5477399, 2184835, 84206, 3655215, 2314899, 4842462, 1967424, 4878961, 5833193, 3759660, 6997298, 1827775, 1545878, 6009719, 2156313, 515775, 1571907, 1569750, 7662364, 2137113, 4132701, 1615868, 6316382, 2368301, 1092224, 6055441, 34896, 6228995, 2695706, 3572932, 7476064, 1318398, 2528115, 7309219, 2198811, 824516, 1485894, 5662450, 5247739, 759354, 4408665, 3731447, 4950661, 5597168, 5228755, 1691269, 4387305, 2976090, 2902559, 286549, 4124495, 6098767, 784646, 4459979, 1057159, 5724495, 7613812, 8116897, 6444876, 4672518, 3522549, 5591399, 3896066, 4286835, 4538665, 6069381, 2136785, 1841375, 986095, 4694391, 4985968, 7441225, 5025372, 5378407, 3912488, 6363615, 3846513, 4251553, 6483429, 5082009, 4887066, 3270297, 1879318, 7945525, 111025, 6917402, 5344394, 2560465, 4243327, 2853742, 1933559, 2192439, 2412053, 234545, 5316870, 4106878, 3635574, 8375119, 7922074, 6667129, 6038994, 5192595, 7531250, 3082645, 5470326, 7355483, 2410756, 6425299, 4332588, 2469809, 7540049, 427118, 5729384, 5803213, 4331086, 7715894, 1021981, 4770022, 5990872, 8207185, 4528241, 7366497, 2991002, 81891, 1207679, 7622376, 5419719, 1386017, 5615498, 2094506, 1823991, 2478968, 5917970, 4184893, 2041561, 4734253, 4944684, 3172975, 8135893, 6975189, 1825075, 3134806, 335123, 1430163, 7735883, 8068839, 1146667, 3162021, 1632362, 3287625, 2013308, 1988557, 301092, 2590683, 580675, 8352, 6956901, 6972386, 3183970, 5944687, 3467416, 3487910, 3708279, 1156370, 5926557, 932764, 1419539, 3724793, 4501882, 280015, 6356156, 70593, 7984967, 7816915, 7947356, 6284393, 2702268, 2888149, 7800851, 2076671, 6539825, 1144332, 1888871, 5339219, 2393917, 7923153, 4950166, 4288575, 4643298, 6935428, 4986710, 2042174, 2753368, 8087650, 4579258, 2784124, 6384486, 3992791, 2903409, 3951219, 2077085, 3956285, 3381104, 3992194, 2430307, 1974045, 4275637, 1541608, 4835701, 196026, 7737307, 2795820, 7931339, 6675906, 4924320, 6370760, 3267323, 988487, 7594838, 3991009, 5999656, 3639180, 1038722, 2300126], +[6378596, 4275171, 3850147, 1464073, 4777634, 2358052, 3641981, 2875943, 6359496, 3778826, 6607657, 2737124, 5882230, 101699, 1818638, 5870675, 7669273, 3575424, 4751649, 4104732, 6127347, 7296627, 854007, 7126612, 6672807, 5379548, 3563253, 5048694, 939510, 6169284, 1879759, 4492204, 2187141, 6141986, 3003325, 6815253, 7993927, 1759924, 1865621, 5070056, 5989100, 957796, 1804368, 1725348, 5470228, 964230, 6547545, 4703917, 6207843, 2150493, 3364952, 6828058, 6098861, 88308, 144472, 3675367, 2471090, 4774328, 696875, 7530236, 2172088, 5868830, 8267286, 462595, 6821149, 6727847, 2684471, 1148473, 5108163, 4291715, 6070079, 8333095, 917028, 4411306, 465278, 8245017, 3049291, 7948215, 3895124, 7755885, 1664707, 6808259, 4085140, 6033301, 1896303, 8143273, 6683378, 7811508, 4856500, 1080763, 1074794, 637845, 2123075, 8277944, 99070, 718249, 7187345, 3939137, 4350944, 7555889, 218263, 5088506, 2691881, 6891842, 1367960, 3067251, 7527394, 3585711, 2669954, 5817539, 4951426, 1648300, 5609356, 4069022, 4784581, 4228237, 8118699, 56192, 4048333, 4541968, 2928358, 3999217, 5091589, 867464, 3709266, 2050135, 4871850, 4576553, 4796462, 3726929, 6313045, 2477316, 3339314, 7802358, 8134887, 7080875, 5337348, 5004614, 764308, 1516320, 1629248, 1934583, 6505736, 3339661, 2435348, 3458388, 7906449, 6434784, 7326626, 53688, 7137452, 3937925, 3272249, 1748908, 3186954, 4600961, 2562515, 5808926, 2929361, 1623276, 5640045, 2114991, 3895955, 1680803, 7498838, 1769522, 476121, 6367946, 5991074, 2922575, 7207618, 1412879, 1330380, 2516326, 1726628, 1346728, 205449, 4930714, 5218250, 6181930, 7229076, 8333043, 3564358, 1718281, 3822594, 8060605, 6290212, 2284424, 3073736, 558080, 6311642, 3440653, 2814066, 4644215, 1320736, 4499829, 4108863, 5432080, 467076, 4151210, 1996965, 1521950, 3579167, 7450801, 5326006, 2401171, 4256442, 6133709, 6825797, 1420880, 7315638, 310650, 6246380, 8087286, 2325733, 2523948, 7374554, 3562534, 2478600, 891204, 2067873, 4119663, 7465105, 692649, 663778, 4405899, 3084808, 5054051, 7744118, 5190042, 2080357, 1132985, 4095423, 3243766, 5285329, 156867, 6178983, 7452726, 5814434, 1774764, 2811808, 5237626, 4935391, 3604996, 1400391, 8204752, 7235941, 1079575, 6945033, 4670828, 4021343, 4839631, 4940658, 6467596, 7063850, 6554064]], +[[5859083, 2380613, 3181736, 4855084, 7240977, 6627881, 234825, 1993440, 5909801, 3413874, 1550049, 4493222, 4214738, 1410251, 4283048, 1587803, 7466096, 1718062, 1935426, 4727510, 6506653, 1551887, 3310767, 6292695, 6064738, 7120095, 423822, 5838864, 3496941, 598224, 7165892, 6306117, 7671044, 6775315, 176679, 751008, 1470465, 3855272, 7528367, 6687507, 7497656, 7681013, 5731609, 1172466, 8335984, 258007, 2041939, 3356238, 2753375, 3211716, 831207, 5930451, 7147863, 5795410, 5365832, 6867702, 6799851, 2995046, 6317462, 6229761, 4529916, 5224080, 7225665, 3790667, 4373900, 7024143, 5318404, 1810368, 5982736, 5693299, 814865, 7869529, 3816002, 7977798, 3572431, 2752604, 5919371, 728216, 1279856, 7144643, 1626218, 3889914, 190314, 369452, 949778, 7682726, 2112103, 6526206, 3600165, 6373208, 4629235, 5838036, 8193091, 8073343, 4570984, 8368660, 7070133, 859738, 5838593, 1713711, 7112589, 6780926, 7821463, 2990304, 1961579, 6163949, 6030854, 3297548, 7842288, 3340463, 8011705, 3308265, 3649417, 2757435, 5967292, 2157177, 4035756, 7450213, 2337074, 3559957, 8281739, 2693430, 3173192, 5628622, 6018509, 3592751, 3525292, 4954677, 2518466, 6773410, 298243, 7977579, 2296538, 3204119, 4493667, 4952377, 929562, 3531899, 2904771, 6990551, 79781, 8379049, 2418359, 8197906, 6224882, 2755092, 6437913, 7787888, 7975268, 5682446, 5468286, 1683185, 3936110, 7293278, 544463, 7677026, 1653263, 2389679, 5010202, 7305705, 3848720, 1572770, 2460501, 6526461, 1515019, 1930426, 5287942, 1162893, 1255101, 8306972, 7082157, 2372085, 3970815, 7351076, 1258471, 6439115, 5584015, 354924, 1863116, 1517889, 2929767, 7258613, 7058514, 6385992, 2388384, 6619669, 6522953, 1375484, 6269509, 7091450, 7540219, 7953765, 8138555, 1605059, 6760626, 2494242, 1879452, 3663579, 3533514, 3978516, 3409674, 7393674, 4528071, 4109473, 4670747, 8052949, 6903479, 1191934, 3075804, 1335284, 2864833, 3459605, 2534710, 8047550, 7158315, 329455, 6883133, 5705410, 3997626, 7059108, 5649088, 1197659, 3657559, 5286071, 6688553, 3288241, 2463841, 5622220, 6751755, 4842692, 5498767, 3813701, 7505181, 4491794, 2331256, 77241, 2469088, 8218016, 8281211, 2467663, 4968091, 3346351, 2841889, 1176921, 1669157, 6960123, 2076832, 957145, 3149259, 4381377, 3741365, 3036167, 7083303, 7593161, 2181259, 6416958], +[381379, 1538957, 5868052, 2166182, 3119054, 258953, 5491255, 6366893, 1414716, 3525246, 6444472, 6722661, 7325475, 4459637, 124364, 8282165, 1766611, 7609622, 2441765, 3212436, 7923099, 1710405, 2240741, 247421, 7495821, 1623081, 7515765, 5474234, 1887482, 225761, 2901488, 4300048, 2393858, 6484798, 7153092, 3439425, 265329, 31471, 7028743, 7681313, 1932067, 847513, 750320, 5214045, 946385, 1953365, 3254638, 7196961, 3333362, 2694987, 6680940, 354471, 4503652, 7056632, 443396, 5735286, 5218492, 5345453, 7487529, 1291648, 7337803, 6755087, 2178065, 6349972, 5556849, 3060160, 8025386, 8327116, 614866, 8380302, 8027239, 4114780, 7312813, 4209559, 401828, 4835572, 4762673, 6970494, 7470615, 3495529, 5413127, 7125316, 2871750, 3443337, 1667984, 2607092, 772134, 2753044, 4181315, 5715676, 5993710, 799177, 2512101, 3266292, 2223904, 7949423, 1665807, 3860794, 1192864, 5120622, 3979586, 7587507, 6382625, 8235008, 7574211, 7371053, 2662858, 4524726, 3007699, 335818, 1637500, 3120700, 4628065, 2462873, 7885430, 5011480, 1609661, 2781355, 4030229, 4921725, 1384357, 7652184, 4846672, 5909059, 1204691, 53894, 6431735, 2974040, 2110983, 2536253, 6488457, 2184406, 2104187, 2264422, 2255633, 2247372, 5203256, 8304560, 6734381, 6547246, 5655999, 590033, 6062064, 6070547, 4077299, 7516879, 477751, 2685988, 6992849, 7752138, 2890098, 4521973, 4733673, 3108556, 863969, 7979600, 2672320, 5753392, 244897, 3704082, 1331233, 1750842, 3544904, 7913973, 5737216, 1040095, 3666346, 7147860, 3761609, 1617881, 3778161, 8320483, 328781, 2735722, 6528669, 862661, 4165100, 5097641, 5324354, 1203319, 959896, 142021, 330124, 1667921, 6386561, 7652892, 3791818, 3232301, 418666, 5941532, 850235, 84286, 2188803, 2485066, 1645461, 3522073, 3591794, 3280572, 1592337, 4615954, 6748274, 4844136, 7755429, 7886130, 6819353, 1662016, 5000047, 6291780, 7889732, 7620764, 716588, 1380024, 6555879, 7811299, 8090024, 165432, 5824707, 3497011, 3416819, 2482443, 411358, 3288479, 40644, 6087998, 3337480, 5161399, 5106207, 5440739, 1674191, 3508546, 7492430, 5401107, 102588, 4769819, 4840023, 3041834, 6231482, 4929454, 1838760, 190340, 1822056, 3489323, 4307334, 676406, 6071881, 6806442, 1207359, 8027252, 2891866, 3945258, 1833795, 3614578, 2077077, 4344219, 4212116, 7333735], +[7195902, 5957485, 1712322, 4318438, 6379697, 4955326, 1035245, 3153962, 5056275, 7946584, 1814661, 1073359, 5342917, 7899536, 3319803, 2610186, 4910569, 3111223, 6441496, 2787479, 4600626, 7033155, 7198052, 7127907, 4417454, 1054012, 270724, 4571244, 5766151, 3278367, 382974, 4857897, 6076730, 2226601, 6216838, 3654281, 659657, 6087126, 4851900, 3935630, 6955415, 6803219, 7081309, 2098849, 706775, 2865046, 8140164, 4156076, 1842535, 2413568, 7447586, 2320911, 6782911, 7631439, 7721406, 3098388, 7138651, 2885652, 665930, 2837132, 1369913, 6277299, 836233, 6933114, 109460, 7342972, 5604065, 4804290, 629118, 131136, 3342659, 591014, 6965496, 3580533, 3520310, 3582117, 980831, 8277034, 6410625, 4598144, 4519325, 2459809, 4364493, 4807628, 6402732, 5545530, 4953750, 8221879, 119810, 1502353, 4098236, 4348832, 3178796, 1378329, 581471, 4021809, 1713213, 440952, 3359317, 5960468, 6536137, 2788869, 294247, 8078705, 6967016, 7006864, 2967848, 5478249, 5307985, 1420625, 5277060, 820901, 2271158, 1657791, 154263, 7240593, 7668076, 7842330, 1665286, 8003858, 2707660, 3749211, 3444389, 4114185, 4892356, 3492568, 2151355, 2121265, 1620230, 49414, 4926823, 1932271, 4095849, 177938, 1020231, 6879174, 363425, 6248680, 3210937, 737665, 2288682, 5745589, 733242, 1484884, 7258430, 6264072, 4288738, 6096106, 8011531, 7438418, 7939815, 226624, 2868436, 100780, 2715589, 3830350, 2931506, 439496, 7516365, 5489145, 425487, 1854194, 6978935, 5362433, 3928019, 5332625, 3057300, 4716308, 2051859, 4264814, 798338, 6459030, 6625178, 2762996, 3232791, 7336744, 2249881, 4088771, 7151263, 2167715, 2579144, 4708094, 8012422, 5899267, 4738817, 2210184, 863397, 3597999, 6143383, 7574393, 842821, 5160429, 3680196, 7456592, 2476037, 2949685, 8214690, 5526156, 4414816, 6818675, 7000882, 6326786, 2437159, 1819065, 5819320, 3999836, 4368959, 873192, 4571806, 1329183, 3128231, 7724617, 3004031, 531519, 365095, 6687631, 5658529, 6478932, 1441485, 7913444, 2841731, 5982124, 4742136, 6717075, 1282707, 1939363, 6534679, 2079367, 2771521, 1877185, 7352535, 1008023, 3230191, 7589078, 3373689, 8219620, 7140035, 615712, 2803258, 8140485, 3195087, 6529922, 5163162, 3976826, 1739513, 6863597, 7696942, 7589048, 8141807, 6501534, 1744310, 7101742, 2536378, 877208, 2993713, 5059523], +[4089041, 8370821, 4331249, 3699219, 4800103, 761441, 2057433, 374891, 7654074, 697252, 7144925, 3085921, 2864666, 2696801, 46268, 2115654, 4147153, 4954895, 4405053, 1777893, 3189159, 1920101, 591988, 2763797, 3840731, 7781282, 5522493, 6145984, 4046892, 776699, 6966519, 7605367, 2174168, 2610829, 1969039, 4437743, 5292914, 6550449, 6579839, 8102871, 4523379, 1490372, 4518633, 2536973, 7323784, 3662076, 1243647, 6149401, 3689480, 780545, 368278, 4834746, 3212978, 1163011, 5983892, 3628073, 8244415, 1603635, 5208299, 4072533, 3071924, 6870006, 6600611, 1865106, 2481288, 8124755, 2768757, 5335039, 7026676, 1445596, 6280188, 2937955, 7870811, 900000, 6050371, 7058485, 3637130, 3970976, 4397069, 5992682, 1171160, 830079, 2279841, 1351867, 2203912, 1873863, 4829789, 7011726, 3256805, 1465571, 5913691, 4166552, 2982104, 5412983, 2098308, 6694790, 4151444, 4910718, 7973151, 5015689, 4494156, 2924829, 4724830, 4337356, 8354666, 718063, 6288458, 8110627, 4795973, 888771, 3471796, 5696153, 7173736, 1242948, 7760274, 239464, 1102499, 2755021, 6126797, 3517018, 504802, 854522, 6295025, 5538304, 4634333, 3407246, 28751, 79743, 1569397, 6533844, 1194690, 105736, 6810520, 1378613, 1752146, 2235473, 1377085, 2206765, 1218671, 2053368, 6036045, 1941753, 6038168, 5081473, 59730, 420165, 4141060, 4238319, 6754777, 5145900, 7007907, 3182549, 7183682, 6075317, 5677522, 8198669, 3003059, 3135942, 5445495, 2572315, 3829845, 1757912, 5677276, 7342277, 5587702, 1291019, 1340510, 4231011, 7689193, 6971195, 5983829, 2008501, 541177, 5195455, 2812827, 3620720, 7095232, 4290818, 4493188, 1504539, 3284685, 6039964, 242206, 1049700, 7115619, 7362676, 2516863, 2997649, 1405825, 4534037, 186048, 4178097, 1364199, 1995727, 2258497, 4744265, 373260, 188461, 2300898, 4338066, 1647760, 3233587, 7716130, 456159, 3549062, 8341115, 914760, 6730646, 1414005, 3889533, 6021089, 3993494, 3175704, 4361207, 8267358, 3748995, 7957813, 5621839, 6817335, 1796199, 8186898, 3128884, 7193069, 3212026, 3319153, 950947, 3165264, 4441976, 4678836, 2102914, 920587, 7482661, 7394074, 335826, 6033334, 7946581, 7194383, 367606, 3808937, 3959537, 4022771, 665011, 1385085, 6887189, 569639, 4555290, 6953021, 1401752, 1491131, 7274537, 4107211, 3510045, 3314490, 681487, 960096, 3424151], +[4662832, 8252315, 1181811, 5118775, 3204487, 40799, 5259581, 5301282, 3379211, 2697338, 4752750, 5598409, 8206926, 8234691, 890723, 2665943, 1918415, 3408582, 6360407, 5241101, 6333355, 8196165, 313187, 7872894, 6835422, 3669531, 5568110, 3636202, 2109720, 7367963, 5437366, 1895994, 3225701, 5704534, 5460019, 1570259, 2112419, 4917632, 7404625, 2852341, 7297064, 2155720, 572626, 3263146, 1467389, 6473155, 1697107, 7822917, 131666, 717776, 3456608, 6984025, 1116773, 3523542, 1943488, 5775481, 5767915, 7323716, 7900762, 7460875, 1269909, 2237373, 6024667, 485188, 6210365, 1566445, 1699111, 1617804, 2272597, 2132852, 7838836, 6111614, 6889695, 1528880, 8041595, 1034699, 1319443, 5169383, 3101329, 1141303, 2157854, 3756605, 2879141, 4600519, 3339275, 1938843, 5943934, 7851249, 5227490, 1612758, 7622241, 2476834, 3501887, 5679100, 4923257, 3373051, 5796896, 1593538, 7967726, 6486929, 2354944, 4291005, 1412092, 3952695, 1251261, 1230041, 6460426, 2315819, 4830223, 627588, 2825749, 4138477, 4305360, 5468350, 1671512, 3322871, 475894, 5469283, 4479426, 922957, 6804536, 4944102, 6567996, 4402110, 7255749, 8311154, 4824802, 3844097, 6258218, 1206636, 2945035, 656880, 1952688, 7805759, 3910369, 366933, 2402018, 688583, 215940, 3067936, 628440, 3992455, 3341153, 3394525, 6748601, 8204279, 6899140, 1066808, 1414365, 7270648, 4549230, 6896962, 2876041, 1851369, 2816189, 1886857, 1635227, 1876740, 1275222, 1163473, 929602, 671508, 6972315, 4146348, 6558760, 7287943, 947435, 617937, 2418186, 4647418, 6154649, 7038149, 6313996, 3052907, 3634545, 313784, 8128103, 704090, 143686, 7652991, 6893466, 2339567, 1126636, 5796458, 1801140, 1651393, 5317586, 5376895, 1895095, 4184588, 1111174, 3199616, 5719696, 1629050, 8039898, 4460429, 8136494, 3970305, 786701, 7480245, 4349977, 4509975, 3519637, 4224000, 3639460, 1832641, 5992213, 2774841, 23560, 6167054, 8133755, 1887216, 358761, 158239, 3912711, 4254245, 3586350, 725243, 7952807, 3514673, 5112020, 221412, 2840435, 676966, 6409740, 1291077, 3731586, 8117728, 3837211, 6384570, 520001, 5513937, 1721673, 3828152, 894311, 3824501, 4369067, 5116198, 6887543, 7413011, 7782731, 1679619, 1991721, 932639, 5887535, 2592940, 7937616, 2856839, 6118364, 2968350, 4882638, 7418901, 7100342, 1731723, 8136783, 5944252], +[5415055, 6611039, 6430913, 264784, 6469906, 5367014, 7731004, 6163143, 2668380, 4663298, 371093, 1224877, 6732887, 2051284, 5838711, 902989, 4421834, 7117461, 3376491, 1031117, 471572, 1719301, 4674135, 5464619, 1986864, 742307, 6848729, 3352172, 841544, 1420337, 5156475, 5942528, 2129865, 5391430, 8094212, 5170002, 6484028, 6961727, 6669392, 4952877, 4221662, 6294407, 2791014, 2509789, 8049821, 289145, 3309916, 6777944, 5597273, 1276002, 2745605, 5711702, 7849371, 3158200, 6879398, 2059419, 6893191, 406256, 5319239, 4179733, 1285184, 4685787, 4845238, 4792126, 242480, 7031749, 2667846, 5051079, 3447486, 1744576, 6642956, 1470259, 535908, 2358483, 912132, 2498860, 5969408, 5516210, 5197136, 6638085, 5257014, 5722186, 6339219, 1502462, 3296244, 202110, 1727114, 4714226, 1749353, 2314073, 6030045, 5407718, 1309030, 7289947, 1997613, 988883, 2192896, 3658726, 3079675, 1676090, 1311073, 2002675, 4569482, 675825, 5715129, 361493, 2880403, 3557711, 3559556, 7754563, 6558947, 7622812, 5525514, 690194, 6401585, 2463205, 7196390, 7052734, 5128999, 7519151, 5703468, 2687315, 4309749, 6996957, 1745033, 115735, 3399899, 7751804, 6161591, 6307355, 4072099, 2354717, 1395125, 7459593, 6940328, 2605811, 1144922, 3458354, 1434424, 3500546, 771840, 7197682, 2001164, 8115638, 8331413, 1417605, 4796042, 7355157, 6295123, 3700591, 1684831, 3900047, 6475905, 5629778, 2545690, 5971433, 2240416, 3085758, 4727408, 6144570, 7533199, 5484819, 4829759, 6303214, 8024218, 5369320, 513544, 1735543, 7661414, 2675078, 6912531, 4328278, 1632645, 8026583, 4302288, 2211615, 1250784, 1607040, 2815046, 6427939, 7112153, 647377, 2545165, 5913052, 8041428, 7614741, 7961287, 5626086, 1955524, 6619302, 506259, 6255079, 8093569, 4313357, 2608549, 1924093, 3990606, 1439479, 4525367, 4935726, 7173439, 1100265, 3646961, 6056404, 1480455, 8231887, 168691, 5985626, 4335264, 6140773, 388324, 8296568, 5437622, 1289936, 2901627, 7636610, 8115126, 3103347, 734005, 3197176, 5001383, 2467180, 3007999, 7743344, 2646579, 5426503, 8001980, 1959453, 1305955, 3966582, 2474301, 7113313, 8266584, 1574621, 2389226, 7751014, 1107581, 3120047, 6864723, 5464672, 1311391, 5718813, 2596182, 959850, 458097, 4421981, 6242751, 6944710, 24636, 747968, 884007, 3447267, 6019650, 4292462, 4738079, 3660889], +[7044749, 2032043, 1530656, 2325583, 2850081, 7688371, 2130924, 5814255, 1094741, 6915147, 4332104, 5955564, 1246443, 2600910, 5088431, 6297690, 6304779, 1764365, 4778877, 1562932, 3667815, 3466130, 3403367, 6365801, 197530, 5988696, 1977410, 414846, 2577373, 3464475, 3880330, 1390123, 1192607, 6332808, 8255962, 1770991, 4405612, 3872842, 3658523, 3889896, 4090003, 247313, 5401649, 1820610, 7270235, 2061747, 8304280, 5525871, 4320691, 1914026, 6877008, 434608, 2570308, 2639643, 8101932, 4294877, 1842920, 5514247, 7669679, 5575409, 4380005, 8345091, 6705986, 7845558, 8190694, 7325332, 3447619, 3181028, 7043823, 2754696, 6944813, 2269464, 2700945, 4402631, 634049, 7588354, 6549500, 2690695, 1272526, 7144643, 8243700, 6348534, 6269579, 6831500, 1312759, 4573839, 1636847, 2228260, 3300897, 4085792, 8288145, 5606203, 57044, 6766902, 2021421, 1325343, 4266302, 3189433, 3429150, 6866224, 4067759, 4662335, 535139, 6173897, 5374349, 1066548, 7319229, 2825016, 998397, 3131211, 1799405, 5766071, 4520545, 553192, 8048973, 4687719, 6965725, 2775130, 4587773, 6950243, 4270772, 1390928, 5321665, 7184806, 6613371, 7067684, 4437205, 64388, 1378581, 1520929, 291491, 7698387, 578181, 3449773, 2470286, 8290159, 4367265, 3452157, 3575058, 5211419, 2502260, 442297, 123403, 6642349, 3723514, 5567087, 792334, 7277515, 3273221, 3227861, 5617946, 7784042, 3385046, 24475, 4251119, 3981344, 415042, 5228380, 7804136, 4475678, 3148141, 283299, 7385771, 4837723, 3525424, 1395899, 8061193, 2542055, 4284471, 4504980, 2014863, 6702493, 6610799, 1980072, 3523424, 4542824, 5947931, 1891869, 6293368, 6966124, 5914856, 7548184, 4297738, 7367111, 6727182, 6991130, 668294, 936698, 7182296, 5678277, 662869, 471910, 248946, 6504666, 5403475, 3645545, 7596811, 1875127, 2584886, 2434096, 99172, 4459480, 5610763, 7316639, 5435335, 6283619, 3382998, 6439440, 8220916, 5868145, 4511593, 1334036, 4518336, 3399263, 3617175, 3686894, 5935373, 4224838, 4855610, 6100250, 6186335, 2603825, 602067, 2744982, 1766990, 3439177, 973988, 3629233, 6556107, 8347774, 3916558, 7522113, 4314549, 4031295, 6487523, 3768852, 6308427, 2452346, 7710314, 5539181, 5368833, 2231471, 6307455, 7312901, 6032962, 7515759, 1028858, 4837312, 7482296, 2617700, 3504860, 1406005, 666986, 3473412, 7122711, 5612980]]] +trCandidate: B68B9A12161F20AD44AE46F610810BE9CE3C7493D0635251FB5E1DD7FF276C7B0424AD8222693CF69DC274D0E0D622638FACBFD64C94518CC6BDAAC5FF723395 +muCandidate: BBBDBB16EE19CB22D02CE874AB62B3AB4ED2EBC056752CAB9A971CD263F2143A607D9931B8B897976F489EC2C6387C2C5446821AC6ACB0048AAEBE6F4F4255BC + +c: [0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, -1, -1, 1, -1, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0] + +NTT(z): [[4912434, 2048650, 2638353, 5330707, 4953177, 4417974, 1072030, 7401020, 3537854, 468343, 3644514, 6674999, 2804308, 367020, 3600796, 2644290, 2575299, 1918843, 1304441, 1379163, 4644252, 5494573, 1536631, 1109880, 27847, 5823027, 5481849, 882910, 5792337, 967804, 3463827, 2208051, 2293129, 7494138, 5848459, 7128059, 2464269, 3532086, 170967, 6951029, 4220996, 7936875, 1344793, 2168206, 2649143, 514206, 1283567, 2363316, 3451840, 4618254, 3722977, 2947420, 7710463, 8150308, 6637358, 2652026, 5581399, 2128769, 5308888, 7270426, 8311523, 3132399, 5677363, 4032756, 2324865, 933519, 3032221, 7962605, 2355405, 1821311, 5612676, 4406955, 4238652, 2739728, 610111, 5522727, 7964501, 8002591, 3261330, 1486773, 5737564, 3816336, 4412524, 2178024, 5237134, 5085058, 7217413, 1353414, 2055497, 2567014, 4924661, 8235218, 781305, 6592985, 7148324, 1987143, 5804255, 146985, 615649, 4993174, 2184120, 538946, 3579755, 4625648, 1081741, 6677179, 4765091, 7526448, 2670710, 7928124, 3909991, 7574990, 6477042, 393171, 1825725, 3442613, 1242673, 3101140, 3525856, 3819503, 980820, 4785891, 3036605, 1625472, 4320976, 7415044, 966256, 2930258, 403050, 7111964, 1122648, 822798, 4388487, 4775345, 1044079, 8322196, 7137877, 4135317, 7044501, 7519024, 5375291, 8033738, 8214517, 1757609, 7118350, 7349963, 462169, 143394, 6068612, 6064420, 8234623, 5516889, 3264211, 5777245, 7295916, 5129460, 5096224, 2938505, 5537548, 3994215, 5161476, 7788606, 3032891, 8073711, 934175, 5935854, 5889383, 6492667, 7066744, 8163798, 414697, 1689714, 6734655, 7371854, 6900053, 1467476, 2270896, 4041007, 2277, 1769573, 8300389, 5717554, 6263582, 2171813, 3095155, 7558247, 8184673, 3735978, 4092298, 6900592, 3552381, 1748516, 7606049, 610339, 1770423, 1438185, 5572216, 1693652, 2309727, 7593152, 4938012, 3383834, 7058969, 5976071, 4157593, 6254731, 6007198, 8320443, 4519927, 2387595, 8209165, 1727034, 3345810, 133080, 533373, 3190883, 2510642, 5749139, 2578608, 2419001, 6613206, 2648834, 683086, 4421291, 7379797, 356938, 2276788, 4458839, 5633699, 2149871, 7083889, 1579341, 3270706, 6780165, 2373128, 2946685, 5012256, 2986293, 6392465, 1488010, 7043691, 1717243, 2983103, 5734538, 96072, 5289970, 4904541, 5628302, 2047954, 2270627, 6210051, 1241211, 7175303, 3020816, 7456251, 5955570], +[1915053, 7558253, 2812144, 6506773, 4414942, 4845338, 8080230, 903152, 4048499, 7663862, 6782271, 2435790, 711208, 7208810, 7797545, 8277082, 2948805, 7072068, 3185987, 3288651, 842699, 5964171, 3773356, 4811143, 8044813, 5397933, 3454830, 5671487, 4691487, 6556247, 1451580, 390296, 1591925, 912927, 2124589, 4290388, 4390511, 1802361, 6849555, 7910671, 2244480, 7874641, 6541791, 7706143, 5041107, 527716, 4898307, 2222273, 231496, 7326273, 1480153, 1946080, 5169934, 5137468, 817010, 2421356, 3557100, 5204538, 2983453, 5321230, 616136, 5421806, 2850841, 1400616, 3519822, 6950152, 2786291, 6560685, 6356567, 3774004, 1845997, 2371168, 2121018, 6280333, 2495654, 1192751, 5041633, 7196924, 8317595, 378899, 6563526, 770957, 3431591, 5389295, 7238517, 3700076, 2666835, 979311, 1139924, 523456, 7474429, 498156, 7652919, 4734679, 1924312, 1088996, 3061020, 1919653, 2578958, 891558, 4077549, 2800081, 2128491, 6130242, 2337404, 1546489, 6146752, 2279889, 6454653, 7309502, 3803701, 5392582, 3395389, 7640908, 7530032, 5135896, 7097741, 7677861, 957811, 2068769, 7077356, 8231807, 6472485, 2152582, 3097557, 8356419, 5898588, 6678823, 2274853, 7523182, 5909447, 6964097, 5468800, 5554901, 6640268, 4489020, 1462051, 3237178, 4048660, 4473706, 819855, 7867231, 4474938, 6363528, 1411961, 2831884, 6411167, 7315292, 4543649, 6208551, 2247274, 7763375, 4246023, 7081477, 2137975, 8119271, 5892923, 4869864, 5009887, 7989800, 6772416, 2681908, 383842, 5693622, 5435460, 8367578, 5348869, 3745579, 774402, 440162, 5749042, 7203434, 4784342, 1347045, 7382638, 6674142, 8241281, 3688530, 7671632, 4583642, 3704687, 2295937, 2596649, 1616639, 1474091, 3691823, 3578288, 7554142, 8098785, 1705368, 2946557, 4338562, 6635014, 7968146, 7129292, 8124218, 2438085, 2715196, 7200807, 7268647, 3394490, 1138514, 4433781, 3272009, 4089322, 7404902, 4161701, 2733566, 4639154, 8083045, 7114754, 6809023, 3770821, 6766025, 3527539, 2347811, 1818027, 835353, 6151261, 5057581, 725156, 7148574, 5087945, 5230010, 1121805, 5689149, 3167993, 3184296, 3333719, 1988544, 7658759, 647405, 3870308, 6099916, 7251402, 1472837, 2856049, 4839816, 4726283, 3993834, 7298444, 5614329, 5061209, 24539, 6758544, 6596326, 1006265, 2322474, 5111441, 6584060, 7059136, 2270037, 4357653, 5969125, 8101446, 7587423], +[5088248, 5790785, 5252372, 6053519, 1260990, 2277344, 3027672, 5019385, 2985727, 565224, 4713727, 2003042, 1909758, 7918926, 2856432, 6454961, 4048005, 384663, 4356944, 3421455, 733663, 1328422, 7848820, 5032389, 6559556, 6061245, 3961833, 7383709, 2555656, 3912336, 5539549, 819150, 2466512, 3505707, 4995908, 4332455, 2986773, 4458152, 6302788, 803899, 6242004, 4007397, 3183084, 2849770, 3877542, 1545748, 6032490, 5228481, 2259830, 7417314, 4966550, 1257227, 2720511, 4678201, 673041, 1664699, 3259040, 8137540, 5095430, 3305791, 100181, 1378439, 4234130, 1161872, 362680, 2484556, 563686, 8199183, 2406739, 1438384, 7661003, 5162329, 6261108, 1724772, 4830673, 5576455, 34301, 2520962, 7847056, 4858284, 6306690, 2181744, 4239038, 6348046, 8061766, 2954015, 1871468, 4363004, 6282062, 3448037, 7679827, 614775, 8006017, 5183329, 6075864, 5139549, 3654573, 6891266, 5915114, 3720843, 6350220, 8105567, 7578664, 2291690, 3021596, 4844633, 3770747, 4395072, 5358383, 3396198, 4103502, 5595690, 6380540, 5629071, 5919510, 7626898, 4247034, 3734327, 1311545, 1167570, 7036194, 2030159, 5650714, 4637710, 6886696, 5006711, 6714777, 5815944, 4393951, 6179125, 1166970, 5353809, 4306454, 4604978, 3733794, 6187053, 2935099, 231928, 3140169, 6857760, 7651731, 3436723, 2462880, 7713300, 2676391, 4492253, 4246071, 3077647, 1195922, 2083037, 2642415, 4693652, 4814247, 2218242, 117235, 142215, 2974310, 6905172, 3040213, 5164098, 3911993, 1474644, 1308232, 4992474, 4724222, 1465593, 6319913, 4442227, 4471924, 7282847, 8308938, 5160687, 4395175, 8121300, 6079396, 4321588, 1216045, 7305665, 6233588, 5503023, 7811889, 4286745, 6111521, 6341560, 642083, 335470, 202329, 5571254, 4537440, 914280, 3895468, 6066438, 2645863, 6412873, 7348159, 3384206, 542230, 1834195, 5184192, 2694983, 1871224, 5528029, 7255210, 5304009, 2790334, 4655323, 235581, 1801264, 7655702, 6985707, 5524910, 5635738, 1973052, 6175687, 694513, 173491, 2544575, 519055, 1559939, 3524921, 7677796, 712270, 5492512, 8008505, 3283118, 4751259, 761985, 4768485, 2519170, 4049161, 2015593, 6206139, 4692899, 2224203, 660576, 5206166, 6832438, 1738512, 860848, 8155289, 6158180, 7748822, 6246841, 1699378, 4071780, 1257975, 8201470, 7702811, 6605251, 1278453, 2221198, 8131, 1341171, 7581364, 5409056, 2600702], +[1962823, 5987682, 7359598, 6994597, 5473338, 4941950, 7352012, 1507977, 5343597, 6145614, 6778899, 7027647, 1348093, 4561510, 6643439, 2749839, 5659946, 3784282, 7054230, 2535011, 5340471, 3756856, 7496628, 7397668, 771172, 6897912, 901426, 2180839, 642913, 4826231, 6828436, 189797, 3785155, 7782582, 4409882, 2152010, 1441573, 3082011, 2973395, 2303812, 7110168, 2272659, 5445229, 2350590, 7362149, 214754, 3629939, 3992590, 6981245, 5572562, 6894954, 6318008, 200267, 8215531, 4215856, 2435400, 2576091, 4619280, 5080305, 4949818, 985781, 2010799, 1706986, 675902, 8061507, 1029308, 1744980, 4852289, 6296122, 762284, 6108625, 5129019, 7039783, 1613755, 6025121, 2276502, 6477896, 1222090, 3917490, 7427246, 4441434, 740146, 5187024, 3061306, 6817598, 1503713, 3887449, 2414378, 5535706, 1776097, 4584902, 4429872, 4306200, 1708730, 514863, 6041559, 1373109, 4280694, 6690459, 2553579, 2372463, 1909020, 4160802, 5765456, 4738785, 2193419, 5121996, 499984, 3554541, 7842378, 5893078, 4279631, 939821, 8102484, 3089931, 1262163, 3843727, 7228097, 249810, 7117154, 3801609, 58921, 3024834, 1983091, 157963, 6589763, 8280024, 1973348, 867665, 6889746, 1933409, 7404409, 2483666, 6164037, 4789695, 5054463, 1117163, 1112025, 5559863, 4786214, 554503, 4266918, 3542869, 1602055, 3994850, 6518548, 562374, 6171789, 4451823, 7269724, 1027791, 7627682, 2432410, 6050778, 820800, 1438965, 3743870, 5540805, 5584940, 7443776, 478670, 4165291, 1230415, 3288480, 463287, 2742281, 7262534, 930753, 1858597, 6794866, 7102807, 6949937, 1295483, 4731793, 5575055, 7752159, 1780431, 5361029, 4194540, 945758, 1781779, 2387684, 3544178, 7780613, 4248702, 1266568, 114864, 3025278, 4183009, 5734055, 683822, 6302078, 7064634, 954535, 436680, 5746659, 6359721, 560436, 3809643, 2118228, 7557899, 6437512, 3721833, 3492323, 5988195, 6480003, 6016486, 3259564, 4426360, 5745249, 3533888, 7157016, 7268199, 2560948, 4589990, 2538447, 6555976, 4441889, 6753451, 2900423, 3802709, 8000381, 2672755, 4189796, 2297627, 2537488, 7614173, 5530253, 138228, 419559, 8258649, 813480, 6400148, 247019, 3925531, 7386627, 377209, 4417439, 4689263, 6803243, 7749661, 4934990, 5715493, 3970945, 2724350, 4051294, 7700794, 7574227, 7300250, 4050993, 1952206, 8113360, 4894174, 2609513, 3165096, 2672195], +[4159703, 1960505, 799988, 711560, 1730545, 3882282, 7589120, 3853642, 6030320, 4425991, 1831829, 1157315, 8367517, 451898, 3469199, 4198326, 1795527, 8027821, 1139451, 1859303, 6702516, 6978340, 6560370, 5515988, 3632770, 3463160, 1033723, 7595662, 4797850, 6916444, 1749472, 8289603, 7209012, 66800, 1949946, 4134890, 4655902, 2281021, 6823529, 4732396, 7973422, 4375546, 6650750, 5841087, 3268162, 500728, 2517153, 1596982, 7572199, 2026589, 5457362, 6245386, 4212405, 4449672, 763306, 2787805, 4645829, 6333402, 7860638, 1511665, 40795, 144860, 5303635, 821427, 6785679, 2564334, 4037423, 7128003, 4224812, 2006347, 6797482, 8001618, 5939918, 5818193, 2843674, 1387143, 472297, 343095, 6808856, 6916930, 6313057, 1324756, 5221556, 388379, 1883996, 5141897, 4709570, 8222993, 3180840, 6309978, 6145317, 7945093, 8248700, 4444463, 4281820, 8029677, 3636471, 1532555, 1599070, 3785748, 7693413, 24576, 3392722, 925832, 4626127, 6064980, 8189811, 6057986, 2796475, 7325536, 8226363, 1467400, 2952308, 6771757, 2834442, 5632379, 6407256, 7425440, 2526415, 3937217, 7911663, 2685140, 5766203, 3874715, 8276185, 396778, 1446723, 3092804, 8037502, 3506819, 212681, 1387913, 2046539, 4871745, 6683759, 1663996, 6598269, 3250762, 5526854, 2852938, 1844805, 2889363, 6638908, 3306345, 6486547, 2106994, 6424110, 810555, 5221272, 3795176, 4561237, 5957705, 7293505, 3927583, 6964478, 6877396, 2032194, 7361550, 7033863, 2106101, 3503867, 5659178, 2022094, 1918354, 3461696, 7890867, 5916279, 6503113, 6723644, 2624621, 5800265, 3704448, 8197575, 5105039, 5637603, 960913, 7415900, 617948, 930852, 6200548, 483092, 1371141, 2908851, 2220860, 5872677, 8040009, 992790, 6467083, 1252567, 7476699, 4646788, 4520439, 3292087, 5573833, 8172221, 7495587, 754786, 4058757, 5520191, 6757872, 5702934, 5495419, 5660922, 2163308, 2290719, 3090426, 5200802, 7183823, 5364625, 5314977, 2792420, 5639223, 5867817, 1023374, 433039, 762510, 6449434, 3664834, 2081610, 6122890, 8270522, 4660896, 1939512, 7539523, 3014208, 986237, 3502898, 6163348, 5144246, 1074846, 301521, 4824531, 3503014, 6224275, 1901089, 744735, 3796031, 7782102, 6257916, 1087936, 5812754, 8081099, 2728713, 5531697, 8147379, 8191097, 7630526, 4001829, 4661635, 5889124, 1471392, 7719673, 3143800, 1965868, 5155728, 7222800], +[1118737, 36602, 3743619, 701748, 3728357, 1476771, 5347173, 5474981, 4281747, 5815903, 7954033, 1658059, 3207516, 1232535, 6757737, 351933, 5244686, 4623533, 137306, 6304089, 5804401, 5441926, 7269519, 7117311, 7578590, 4139720, 5469549, 4543918, 6466503, 6252289, 3931560, 1394391, 1224086, 510506, 2267279, 778304, 6210178, 2409913, 6361613, 3011211, 556208, 1224690, 1974018, 5687066, 3185463, 1597947, 2731836, 3292276, 5969586, 5539654, 1838909, 8052539, 723528, 4081011, 4896431, 1873141, 2986886, 8076935, 2606388, 2778147, 11351, 7906961, 6855417, 3832036, 582088, 5976028, 880833, 7861736, 579941, 3571619, 3106233, 6730087, 1128763, 5713227, 7833169, 724203, 4984518, 5062414, 6703301, 136641, 699202, 4387153, 7478349, 1728173, 1124987, 4683190, 4411211, 496639, 7341226, 6190538, 2256150, 2209169, 6420595, 3460959, 554799, 6008977, 2814818, 1240527, 1364979, 4217495, 4597059, 4436304, 7767409, 1859352, 5452280, 7781974, 6964388, 8021882, 7831338, 298038, 6518713, 4339186, 7224137, 6958197, 5663570, 2418833, 8294489, 88789, 1704050, 4033039, 7489952, 5120389, 2720032, 6164575, 3396804, 7510502, 5139781, 3697935, 7238472, 643465, 1069085, 7269022, 6769241, 3633013, 5389159, 2360526, 3290788, 4246286, 3671495, 8280687, 7681884, 2367783, 5093429, 1983151, 6483407, 954986, 7429712, 3013929, 7451586, 4038381, 2363322, 5657536, 7867345, 4378362, 4705384, 4823732, 4518296, 360161, 7270045, 2821717, 4712119, 756800, 7769512, 1287661, 5020885, 1177290, 4165360, 3488586, 5690267, 3951281, 4587883, 1824034, 8191130, 2778945, 7712655, 7371891, 5863263, 2389044, 1368603, 817993, 2707701, 1122596, 1657413, 3043304, 4716356, 2080511, 4422454, 4682548, 3591133, 8170678, 7041765, 4733878, 130350, 6146553, 6620862, 2836243, 2432866, 6659173, 1960738, 4728641, 7335836, 5273372, 5664859, 3281435, 4913417, 2232642, 5263476, 30173, 3297661, 645915, 4709250, 3848240, 3085686, 3730026, 3578444, 4329319, 937447, 433558, 5568158, 5354589, 409437, 3248454, 8115850, 4359934, 423753, 369398, 6659524, 1056331, 7178225, 2102134, 5731303, 4225790, 849842, 1813263, 1344116, 3986691, 3913010, 3787681, 7197154, 4094447, 5521222, 2547538, 3625575, 5968428, 3853937, 1464562, 152933, 7171304, 882875, 884189, 7816442, 2422660, 7887261, 1012142, 3225701, 947371], +[5328819, 1018428, 1330802, 7207906, 7944746, 7198252, 1000698, 6559513, 5463896, 6523543, 1537450, 2838140, 2250665, 552554, 7008824, 5980362, 7065527, 4175344, 649166, 2386593, 5250947, 6520149, 4995858, 7072209, 2555468, 6249024, 1570072, 4902188, 5395076, 989566, 5274743, 3298689, 2732515, 6428666, 910494, 2201738, 8060223, 7055687, 7646056, 596598, 1257154, 5300570, 4846705, 1182881, 2571578, 1124349, 1508412, 4314751, 2068669, 1033177, 5027236, 3631956, 4336421, 1011475, 1163069, 1637931, 990553, 4865126, 2290698, 7306639, 7024515, 3303685, 6686857, 5087982, 200118, 4697506, 4531263, 394415, 676104, 1065452, 8141261, 8091413, 5925608, 6441264, 2919453, 285472, 2448390, 5654185, 6139664, 7059813, 1029874, 8083055, 7483082, 3747390, 3042799, 4044927, 6930838, 5360902, 6132330, 4824718, 1085684, 1661863, 365677, 5029851, 6457471, 2229448, 8192086, 6436910, 5503714, 4779472, 2446900, 8082587, 26626, 6885991, 1328420, 6142238, 2690424, 1420169, 4732071, 1965644, 8136903, 4991810, 866093, 4631859, 1872487, 4938535, 1975449, 6331611, 6645206, 4718397, 7679231, 1147545, 5084709, 2300368, 5220266, 6929435, 6768185, 4099316, 2199300, 1293863, 6906566, 6333405, 7472676, 7780567, 7990853, 7928642, 2006591, 3519923, 1607425, 275683, 6871457, 7957193, 2977400, 7190303, 479362, 5938034, 3998039, 748346, 58271, 204844, 287171, 6901078, 3853784, 3675456, 5214793, 5340669, 3819863, 7915960, 1053778, 2784472, 619731, 4933760, 3110303, 5228075, 710832, 5106786, 2774403, 2114409, 6622169, 4257487, 8148992, 2514052, 6324790, 4948181, 8263860, 5419287, 1662316, 2256631, 6851751, 4280697, 2185814, 6384400, 7681513, 5395616, 6786425, 3002689, 6293644, 3040315, 1718484, 6934431, 3444999, 1470397, 1207005, 6867670, 4199280, 2990171, 4950287, 1294517, 7714172, 7229159, 34859, 488538, 7558529, 2167, 6583608, 2483107, 7873647, 8321789, 3244811, 5446765, 1995241, 4290116, 408437, 4807604, 7413296, 4322802, 2925079, 5078959, 418914, 3264889, 309995, 787980, 957855, 276803, 359233, 1659906, 4151050, 3887689, 7143914, 8118768, 5961128, 6838831, 6830182, 6813767, 5847432, 340320, 4243397, 1170597, 5286922, 368585, 137373, 4966078, 1622128, 1152832, 1200662, 5801544, 747534, 6511043, 3695295, 2465350, 3903562, 7473274, 2208644, 7703748, 2758683, 1105773]] +aHat * NTT(z): [[6348976, 8115613, 4027425, 2376582, 5031263, 1710948, 5023185, 1982737, 4130939, 80434, 4197557, 1368789, 4648888, 3887579, 7467864, 6301591, 2941684, 7544866, 5457898, 2439163, 3771769, 5347844, 4742450, 5641714, 458570, 3902870, 3311757, 1229250, 4178187, 2000865, 4440698, 902819, 6212127, 6712284, 2371861, 8232702, 4973177, 1969480, 843040, 7665207, 3166441, 7494701, 87823, 1421306, 136615, 3855473, 3192205, 464330, 2137121, 128379, 1814568, 125790, 2031350, 1862659, 7085746, 3909328, 4032771, 6977375, 7901659, 5492685, 3206439, 2430469, 988961, 4084690, 4581717, 2784249, 2830642, 3197475, 4865746, 4401609, 5195838, 5617028, 6813824, 5033681, 2073222, 1597450, 2886423, 5581218, 7706196, 169878, 1044951, 4431460, 6636703, 5732444, 4611125, 6027939, 4870084, 3198762, 848567, 4963279, 6227739, 2665388, 5594380, 5365053, 6980311, 3777885, 3773488, 3299201, 5270582, 5824769, 6394047, 1700239, 4874238, 3512406, 6732573, 8301650, 20468, 6158594, 6929733, 6789389, 285576, 5893074, 6812854, 4839863, 2185094, 6341428, 2433198, 3662983, 6563663, 7917365, 5415941, 3527425, 1473288, 6921915, 7716291, 7101111, 714905, 7681778, 7044691, 6667429, 2699739, 7591109, 3314664, 345502, 3667205, 6484305, 7638164, 3696230, 1699700, 3011168, 5792680, 2483911, 474881, 7915094, 6278951, 3731970, 7791498, 7604082, 5924215, 8002243, 6056190, 362816, 6419513, 3205972, 2293336, 1529512, 5453837, 3504476, 2081147, 4451789, 8027332, 6177111, 4220930, 6826919, 690170, 3715605, 8068052, 2872726, 3653607, 7747000, 8058737, 6133313, 1428453, 4941302, 4350056, 2020114, 4457105, 399554, 322329, 6596326, 3997283, 3286708, 1306132, 107702, 651132, 2588052, 8012281, 2381062, 1852023, 3240660, 4853654, 3937148, 2729899, 2323947, 3377622, 1546364, 2010746, 3352531, 6959943, 6145412, 6113177, 3960140, 7205537, 7161795, 2354284, 5571992, 4776781, 1328190, 7068808, 6817300, 7530526, 3842167, 1550146, 6724105, 4251931, 4564981, 4046157, 854302, 3606817, 4627462, 4933969, 7995642, 892055, 8135206, 5045474, 7467265, 4583978, 844201, 7095359, 6927365, 7075066, 4264077, 669823, 7599380, 7920459, 5453492, 1499422, 2039027, 6680951, 3372342, 6658552, 8207428, 5013798, 3784378, 2370386, 5810918, 3605683, 5505611, 4832558, 5262649, 7194135, 4154367, 3904109, 1399985, 817360, 6303234], +[2126314, 7022009, 3840101, 4151863, 1803696, 2107460, 5452701, 4175356, 7050309, 2086464, 1765605, 1877029, 5788720, 3829922, 240922, 3069917, 7424389, 6546522, 14741, 3767816, 4234211, 7793066, 2875430, 7737834, 7534055, 6471476, 7471102, 3656858, 8118995, 2586690, 6684135, 3218829, 5891531, 7562635, 6169171, 973665, 907655, 1384735, 199556, 697175, 5703036, 7442282, 3711155, 2182752, 6150335, 1260047, 3936189, 4748380, 7197989, 4447044, 8117866, 2013755, 5758494, 14035, 5518659, 1712785, 2972350, 6523846, 7155963, 3579472, 8207174, 1499443, 6377717, 7949760, 238222, 4068704, 6402166, 8285655, 5791458, 7414908, 866064, 7327385, 6475764, 6573249, 6887921, 4759436, 8190930, 1933029, 4711200, 2671832, 4729065, 2360829, 1791700, 7372995, 1951384, 5637843, 6451789, 4516226, 86542, 999609, 1058778, 7094900, 6505659, 6790737, 431487, 4566250, 5799826, 6214810, 551122, 7063458, 4708430, 4862298, 6128119, 6228121, 7554644, 3896432, 2339131, 6895458, 607795, 7955767, 74645, 153438, 8335035, 7632034, 1010019, 1403088, 1789213, 3907042, 3572924, 4052227, 8273041, 3823850, 1443240, 18338, 6646209, 7186350, 921290, 3369496, 4089015, 4198394, 7766146, 7364129, 5768561, 5099646, 7324736, 3054518, 5432673, 6329211, 5137919, 7630568, 2084387, 5271858, 4354488, 3467729, 1735344, 2882171, 919797, 6793229, 5289383, 3573211, 4808577, 6840961, 3762666, 6672510, 881918, 8089962, 2764965, 4041288, 1744208, 1123823, 8059599, 4832349, 1912083, 5060893, 6405077, 1561063, 5672622, 6659368, 3098319, 81885, 2436352, 6029244, 2252083, 3008265, 2993499, 2605828, 7548195, 7254027, 2112675, 3037081, 3994080, 196882, 6704467, 5966852, 937266, 5247976, 6931578, 6352326, 4645684, 7666436, 5036930, 7986810, 2263421, 5835938, 5229712, 7334603, 6775031, 604271, 466360, 1059095, 6136568, 6239783, 3324573, 322162, 626766, 4666974, 5317326, 525570, 2088114, 7476644, 6261928, 4217492, 2154869, 5972743, 6296295, 4544266, 1983933, 6938212, 577628, 1386058, 4743224, 6759599, 6682746, 6668955, 6268383, 629357, 3672911, 6281988, 7411021, 7028793, 7315164, 776504, 312001, 3609117, 3798893, 5856138, 2154544, 4102685, 5587195, 2092798, 4075803, 3823403, 5242730, 8221341, 1221142, 3370873, 6658641, 8321542, 1817887, 4815798, 6272528, 7495658, 6833907, 362596, 5336151, 4460808], +[6115976, 6137435, 6482651, 8048110, 6475330, 3503323, 6159619, 7327430, 6266313, 4568477, 7568799, 6959597, 5338324, 8167427, 7385113, 7922740, 3664516, 7813523, 7535534, 5657726, 8043896, 5735211, 3867521, 4308625, 7157552, 7905006, 4643484, 5530371, 3393698, 7614271, 1113761, 2311618, 3690712, 1290693, 1683397, 2653524, 5744686, 262002, 5012316, 7158032, 6091833, 3939418, 4383600, 2651084, 5461663, 3627539, 5770810, 4685059, 8089505, 8309723, 3398932, 7131789, 3866160, 3278896, 1923038, 8243281, 5985499, 6504383, 3635053, 3186140, 3602320, 5458951, 6007574, 3326919, 5103514, 7880630, 953823, 2262123, 6432584, 1162383, 168213, 7331058, 7541549, 4609464, 4049696, 4321702, 6901317, 2179594, 2706715, 7719356, 4023444, 2630942, 4080581, 6714002, 7084878, 5313930, 6006670, 1802308, 2065246, 5632243, 6705159, 1586630, 781028, 7832955, 5514237, 1466625, 323031, 3985984, 8230380, 4082997, 5346988, 1586133, 3004333, 6104014, 1957662, 4357607, 4674539, 6507792, 2005042, 480689, 4550357, 856712, 8250871, 371773, 2665200, 6233151, 1729229, 3724938, 5311992, 1718507, 6170737, 5770612, 6703691, 7060475, 4305119, 1535168, 4184164, 7350913, 1555149, 4976197, 5772711, 4710521, 4632082, 778256, 4435331, 8218156, 5086357, 2889578, 6205280, 1175689, 2893331, 6379767, 4173438, 7295623, 4015008, 6918823, 7306606, 3241575, 1049928, 6980397, 7951982, 2543070, 1115264, 2767319, 3665032, 5735279, 4237008, 5042842, 3703881, 184672, 392543, 6556135, 5861888, 2177351, 6080544, 2319948, 3649440, 5890057, 1808914, 6691642, 3306711, 6383749, 2472125, 5114832, 8103697, 7989852, 3484904, 6767676, 3844661, 1294579, 7220499, 1301488, 7616139, 3654969, 2356885, 6984722, 6097650, 905003, 652198, 1997684, 6501942, 751024, 2910621, 5062475, 1451710, 2433528, 4381892, 1877914, 2880060, 2356355, 7089493, 3657757, 476489, 2447071, 1990066, 5602209, 5900148, 3005671, 4720163, 2823326, 1113630, 2904437, 6652664, 7586126, 4961762, 1022692, 4184331, 6622564, 6887626, 988560, 6804590, 4540365, 999191, 5593406, 7159654, 4843809, 8134904, 1845681, 7586108, 4262057, 243415, 3557782, 2093009, 2353200, 4350458, 1769485, 1944807, 87338, 606317, 5150544, 7761273, 7246609, 1117968, 2233498, 1565537, 3221369, 177600, 344477, 4107707, 5259908, 1556690, 4346603, 2639488, 894819, 5260926, 1643091], +[6036693, 443680, 3540726, 1161176, 6265593, 2068957, 5877762, 2470499, 3622687, 8054827, 417107, 8012713, 8306057, 4873501, 1940980, 14626, 4740879, 7528192, 1313435, 4999654, 7941764, 8038454, 7822115, 6738481, 1165573, 1301743, 5098059, 4482827, 3401976, 5551891, 3187351, 5581744, 2591783, 24393, 7896616, 6671059, 5492072, 1567128, 707300, 2570603, 3960070, 4945459, 1363857, 2376294, 5842548, 6594422, 134093, 5311592, 2424530, 426673, 2318897, 3312087, 5531742, 6041007, 5926227, 642727, 6531516, 4038397, 6702167, 3842011, 6445451, 1823668, 7028669, 7554631, 6648444, 3854486, 896145, 7694176, 6193557, 3351019, 3715834, 2478085, 2564973, 3551191, 5425724, 2743915, 6677674, 150120, 7580941, 5410643, 8125042, 2964335, 634130, 675479, 439226, 1612138, 6594224, 6151264, 8342499, 622506, 31275, 4902861, 1767871, 7391176, 798223, 8053007, 6252057, 3251914, 338365, 470672, 2713810, 1168377, 2786394, 999454, 6862183, 4917647, 7368524, 855892, 2036966, 4044237, 2066321, 2391381, 4164021, 3600506, 289730, 3266414, 3402426, 3100745, 6508868, 136836, 4840090, 6175369, 6767959, 4604933, 7139508, 7441756, 193885, 5461811, 254311, 4204809, 7690113, 8344498, 4685427, 8207546, 8193393, 2918952, 6976737, 1799717, 1451690, 3943906, 5724894, 163488, 7285441, 3618062, 475194, 504146, 3356721, 1385299, 8225282, 327479, 945763, 1610039, 859304, 8024398, 2617945, 5271304, 5144051, 5971956, 5738141, 7504529, 4076944, 371327, 6031293, 3213183, 5813674, 821864, 6407072, 1918895, 6692167, 6199399, 8313244, 7604640, 7311991, 1274068, 2737821, 685648, 1128476, 4744508, 348334, 7111931, 1712622, 5650041, 4039757, 699029, 7238273, 1781605, 5368497, 3108194, 3378524, 6163118, 6830275, 5881554, 3513399, 6075495, 5092611, 125904, 4622004, 1421756, 7084815, 7062585, 4901987, 3878192, 862305, 5738873, 6251934, 1276641, 4090050, 1657754, 4097169, 5884619, 2557822, 1015143, 3034706, 5092714, 8158805, 4312606, 1479173, 1110732, 142423, 6458331, 3521412, 7275800, 1808121, 7200350, 6950, 2560386, 5827688, 141493, 3709287, 5463042, 5026986, 7934110, 7529985, 1252287, 1315450, 648705, 2803178, 4025289, 8284839, 5642544, 7866925, 6664125, 7416219, 3337489, 6894231, 1527412, 3446578, 508835, 5922711, 2484317, 7305384, 1050905, 7573472, 5290490, 3947864, 2134627], +[7838458, 6604450, 8304947, 3281110, 1210303, 635428, 2354446, 5343680, 5482621, 5054206, 3994959, 4497286, 1060528, 6429299, 3060588, 3141989, 7262038, 3888408, 431631, 1878050, 1059656, 5636480, 2351755, 6859080, 1572786, 1839151, 1341766, 7262853, 5423169, 7187386, 7534697, 7682649, 2531386, 276383, 820959, 3663379, 3743201, 4886085, 7505163, 3051233, 5142489, 323310, 3345311, 6175065, 4623097, 5876285, 7493669, 3237100, 4399780, 2931914, 7221316, 1481387, 999864, 700712, 3092437, 7718259, 5190471, 7195911, 5296482, 7559004, 4399128, 2043303, 1791746, 5816185, 3530447, 4404951, 651047, 782536, 1547322, 145893, 4363988, 2427585, 8164539, 5300369, 1503313, 6795808, 1256157, 1402220, 6562903, 595799, 3031716, 4579258, 5627044, 209186, 7848579, 5050592, 3933773, 5521463, 7289822, 6658207, 3371687, 4592956, 231037, 2001862, 5227604, 5448557, 2538291, 8139774, 3677821, 4615506, 3505424, 3876766, 2411907, 5249252, 2037047, 7741319, 6358855, 6566600, 7923849, 1232366, 1453978, 4922299, 6913429, 5341394, 1800314, 1133810, 6507443, 2085777, 4657014, 669972, 5010340, 4032138, 6587200, 7323504, 7735921, 775620, 7721576, 2325923, 2330430, 7744617, 2936130, 373620, 3421494, 374015, 3511014, 4797072, 6577084, 6346475, 5795908, 7611508, 1040217, 457088, 4670289, 7711473, 7448973, 4265018, 4510803, 7915998, 1004651, 2659414, 7309591, 5736628, 6258218, 8162726, 601213, 4464523, 3467524, 6540805, 3504721, 1763982, 7371202, 6314390, 1826945, 7285608, 762092, 1182482, 7622179, 8376424, 8018267, 6011283, 3366294, 1348193, 3221903, 6485111, 880821, 6416980, 4936966, 2532854, 6236202, 986565, 7895814, 4953879, 6751088, 1413315, 6667553, 5895037, 1277347, 3213948, 2959068, 848777, 4972000, 3039441, 325985, 4611317, 5527287, 3922640, 2800445, 6223357, 792891, 2789653, 2697073, 3928501, 2944629, 5486331, 156008, 5307206, 4622653, 5003570, 1703239, 5823561, 2178901, 5285389, 878823, 6860312, 5344880, 7585261, 381252, 2188179, 5012633, 7118099, 3246477, 1416032, 6364541, 4629825, 4096204, 3630410, 7265240, 4837638, 7625940, 1508919, 5574935, 2836392, 7921927, 3345408, 5171115, 4145128, 6599880, 631464, 8309043, 6865554, 2612603, 7243710, 4978635, 7038699, 7964434, 5782156, 3440767, 4435785, 3391825, 7436162, 4053228, 4113035, 5859556, 3128543, 2953251, 87988], +[1967490, 7221567, 5449611, 1570912, 1277515, 1377963, 5566291, 2835007, 2420399, 3969953, 6805931, 1063263, 391609, 3895399, 4940761, 6424085, 1586550, 5256262, 6960186, 7338374, 6487737, 2906347, 4377746, 1143067, 298279, 7511664, 1467215, 7574200, 5593604, 1424977, 3007303, 1806887, 5444292, 1139015, 7888777, 4420109, 4010540, 3033148, 5802628, 307691, 95903, 4999415, 4342355, 558808, 5149958, 7283217, 426251, 5346426, 4284653, 8163355, 4936071, 1273220, 7778791, 6614252, 5642074, 6814616, 7718437, 710722, 1561894, 4189579, 504633, 3038388, 2569887, 7644342, 4577151, 2191353, 4236315, 2819562, 6594174, 2248915, 2875413, 6908813, 1041193, 7404738, 1628053, 7217137, 7479551, 268135, 6666201, 399434, 7758146, 1982896, 5524356, 6971377, 7673128, 5703915, 5672659, 3433480, 5124386, 1909883, 2988282, 2273453, 5900303, 6067481, 5627335, 8282507, 8134363, 271632, 4638000, 6941936, 1447373, 4972185, 3056810, 3625723, 165855, 3276223, 3927997, 7773523, 2198706, 599529, 996096, 2933910, 4122442, 6996590, 4483614, 710759, 329980, 3510693, 963682, 8182093, 2401297, 3762367, 5145580, 201763, 304524, 3372415, 3164683, 7103855, 6707523, 836378, 7055938, 2529812, 7009430, 5103740, 4453512, 1190081, 521954, 328911, 5007023, 296032, 978406, 5874698, 3168817, 8167849, 7602268, 7486496, 1336629, 2858931, 6635843, 2085013, 4478504, 4275845, 7052952, 3485920, 1910808, 3534531, 7302595, 2127618, 7136422, 2016245, 689038, 3943049, 5122131, 272614, 6221866, 1842130, 5930122, 7630, 853083, 5180887, 5274387, 7405154, 6093582, 6230058, 740658, 5472272, 778788, 2497510, 4534855, 2769209, 5970888, 4965530, 497331, 3571695, 7850850, 4101490, 1434976, 6018757, 3972607, 425127, 8211822, 5210175, 903971, 5363691, 5970464, 1409290, 4573513, 2520287, 5538805, 349076, 1012008, 4992531, 3875256, 5752523, 6871866, 5351564, 4711696, 116234, 4646437, 1866582, 7387487, 901303, 1554223, 995299, 4901320, 7777887, 957431, 6412622, 5938499, 5669660, 4426383, 767638, 6485300, 996438, 3562872, 1597429, 3442905, 7708584, 7949842, 1815644, 5439888, 5863495, 521170, 5482426, 7772744, 3502671, 667447, 6022671, 4842566, 7405096, 2680465, 5366195, 4096954, 3570784, 2134781, 4791115, 802850, 7442930, 941548, 6502610, 4499748, 3752027, 4618148, 6604700, 5463321, 7825701], +[4766582, 1640145, 2537872, 7879244, 864471, 817759, 4384955, 5544122, 6904915, 7845636, 7335454, 8234952, 1144664, 2274574, 7501060, 4716895, 6629150, 6126247, 4060966, 4035173, 8227874, 385272, 2516696, 4182588, 788615, 446807, 1139952, 6120857, 1262734, 5567068, 3142656, 5662554, 4887682, 1056585, 5972082, 6944089, 3607390, 5777245, 4781955, 5419014, 3414107, 3211175, 3184684, 4113675, 2293578, 5197274, 1012736, 444986, 1280581, 5727231, 8237100, 7721433, 1932597, 8047793, 1500465, 5446745, 2261524, 5588056, 6307266, 4710692, 8209439, 5792679, 1040019, 1032145, 6094542, 3127571, 5741539, 2283052, 5712095, 4783026, 6068569, 4883947, 5339494, 4075635, 3776224, 2233852, 484751, 3167319, 2307458, 1207966, 6790625, 3318441, 1770167, 2362390, 7070140, 1754362, 2655167, 6272961, 3074803, 7875730, 1753365, 7141856, 7077971, 3933974, 4802679, 4142520, 7124001, 7442794, 3682479, 2942144, 4321306, 3574893, 3600735, 2162274, 747180, 4214362, 3500937, 2402015, 3205392, 6939260, 5632233, 6860279, 3460798, 7594095, 6506645, 818935, 7054707, 6570497, 968130, 104752, 6076968, 4563059, 5864283, 5841753, 5051801, 935385, 7882706, 5341206, 4720096, 6979172, 4334199, 6485235, 1820048, 6743544, 5015566, 7704571, 515389, 5273500, 3596086, 3220111, 3904840, 4827496, 4706204, 2191414, 2696600, 5360457, 3871406, 6486093, 407243, 1404641, 3191954, 613044, 1625694, 7050713, 3693549, 5520398, 7008300, 5065818, 3857104, 8252796, 2753899, 147276, 6868855, 3449419, 4627701, 1879117, 3849761, 4021328, 7547390, 2588989, 1781620, 2700516, 5612878, 6082603, 3112809, 1130479, 1751445, 303766, 3075906, 2625758, 6402554, 3257990, 5343077, 100903, 5342896, 5286394, 4066191, 1775540, 2469805, 2929293, 6649237, 4305160, 5825045, 1819972, 3671983, 4763756, 1268251, 2821591, 2085899, 4893504, 2294536, 6196410, 6232654, 1613541, 2062243, 8200399, 3473787, 6800036, 605362, 6739077, 7827864, 7492836, 5427315, 7695666, 588389, 3410431, 3665677, 6249625, 6830989, 25975, 8360277, 5836206, 915215, 3211103, 6857529, 5582645, 4771326, 972293, 1941883, 6889711, 160533, 2589940, 498058, 4241299, 4314379, 7874761, 8283371, 34669, 8159798, 8035988, 7151925, 4914034, 8177236, 4069175, 876999, 7533114, 2797054, 1559342, 4484486, 1868384, 863544, 4492582, 2747836, 4096402, 5222568, 6471089], +[1059747, 4360866, 7108506, 5922838, 2635721, 5799108, 2544421, 7112151, 5543554, 8086116, 1581538, 1605789, 237106, 2803582, 4318997, 405019, 490944, 7268658, 3953816, 5399337, 760801, 2568999, 5373498, 2544165, 477236, 7674539, 7118864, 228773, 940801, 3883882, 8284945, 6465551, 7544525, 2103740, 742923, 7800038, 5882856, 503177, 7196508, 5485761, 1603745, 4780566, 4697368, 2011011, 1245907, 1474221, 4608026, 3622749, 383455, 5939389, 4980078, 6366471, 1159390, 7091867, 6882355, 1669847, 2496457, 3392274, 2916374, 3463272, 6886437, 1331415, 1245812, 3832930, 1741193, 6534042, 4886403, 3687895, 6844155, 7636338, 3609577, 2329688, 2989358, 257985, 3901737, 6649293, 3667963, 5543004, 7637674, 6402714, 4922134, 3165645, 7788369, 7260342, 4142396, 4175800, 5470074, 6146604, 8280136, 4947246, 7592364, 4437520, 7212789, 7368081, 8279638, 5332745, 7247363, 4222924, 1413629, 1359303, 2210951, 4394667, 4977229, 2778160, 6932698, 6611460, 2412423, 8057424, 6249780, 1922829, 8072999, 8225238, 6441736, 6095525, 5357271, 86949, 2868012, 1776730, 497547, 5105412, 916173, 4656445, 6148246, 244875, 186324, 4408043, 6722079, 3781481, 474453, 6400893, 4256700, 6910128, 3454289, 5331570, 4945966, 4538359, 1166488, 3127868, 1014485, 6154227, 2199635, 4377124, 558790, 2324565, 2812020, 6061616, 1670647, 6856979, 7767078, 6944180, 8131792, 5919898, 4459758, 3461283, 5229739, 4201711, 1074923, 850624, 6913978, 4374357, 6894556, 2624160, 6411854, 3935591, 4326893, 2581179, 115159, 7953384, 4265682, 4713819, 3054879, 6491042, 1596078, 1332639, 1547234, 1740602, 3968437, 2832785, 2997484, 1983651, 7374304, 6977795, 8362814, 6125642, 5751610, 7010668, 3416161, 1521446, 3676072, 5788513, 4746020, 6037537, 5282013, 2335169, 5342323, 6350707, 7535087, 1907122, 7797619, 3510838, 6759971, 3949786, 2465418, 6300786, 1327641, 2593488, 584477, 273514, 6884934, 7569617, 3614281, 7454530, 163023, 5800082, 8374706, 5035983, 445542, 6583828, 2621815, 5942582, 2271176, 2379578, 3736589, 3587123, 6755513, 4626563, 1339844, 6856965, 1842430, 2871322, 7194630, 395194, 5583164, 6044594, 4651759, 2593330, 7221807, 7231363, 5664874, 5427281, 6183144, 3429290, 8038794, 7212038, 4298573, 2954250, 1343298, 551499, 1306918, 5357649, 1040000, 6016924, 2270012, 2009414, 7914746, 2441319]] +NTT(t1): [[5566064, 8085207, 4830651, 8260903, 4504602, 4796337, 6780081, 91566, 1067423, 2397821, 3777971, 3201356, 1304096, 2661444, 3891915, 7762298, 7230537, 863050, 512092, 2270079, 7308503, 5735899, 4767024, 3575877, 8277944, 2170783, 6960604, 238624, 5005578, 2896999, 2252189, 2825609, 7503420, 6989246, 6381482, 5224093, 793703, 7453928, 1106901, 4030206, 5629689, 5971908, 5777301, 4833581, 8195479, 4602497, 6394948, 3742030, 462340, 1047572, 6379746, 5641673, 1245334, 3249485, 7944873, 1578392, 7395731, 8000191, 3341024, 897078, 6531754, 4865061, 6608139, 2225556, 1756208, 2621144, 2923779, 916700, 2319355, 5190517, 1788931, 2087918, 1050052, 4746317, 8144839, 7585675, 7347789, 3241731, 5499912, 2436634, 6634116, 3733319, 7687329, 7429901, 925567, 653281, 5955825, 3983095, 5925140, 3729545, 6466305, 3836865, 6504935, 3258996, 219549, 1177754, 5635978, 1857555, 1431492, 8124655, 408678, 5053872, 7984902, 2107505, 7222426, 3282818, 7050108, 3779919, 8229934, 1614646, 6388592, 4161617, 6899529, 8295717, 164327, 7618756, 6808624, 5950511, 3693787, 1012106, 7116425, 1516413, 2037404, 5017470, 3739995, 575135, 4302473, 3780496, 6378803, 4083698, 5837475, 7336535, 6823211, 2950526, 1351651, 6498703, 1769315, 3860459, 1990801, 7976835, 1201327, 7704553, 5594197, 4318064, 3799298, 4905538, 7419061, 4416753, 1092281, 3475, 6507356, 7112103, 6820751, 7781761, 5706058, 793648, 1343999, 3499119, 7812200, 5674782, 3058380, 4106162, 5104589, 88911, 5119928, 3990440, 558267, 6864635, 4659865, 7227802, 4234721, 748924, 6549151, 7685157, 2972898, 2982001, 4346421, 481699, 3127862, 4917189, 2838598, 1153902, 7945219, 4394199, 7590896, 8073874, 8099562, 5013866, 672885, 2683705, 3453890, 924352, 3487169, 785340, 5504653, 1648976, 6852999, 8153722, 5047851, 2594629, 1813212, 2288694, 2434228, 3333894, 8033558, 1225560, 616351, 1597251, 477607, 3386755, 5397293, 3384598, 7384229, 424913, 10215, 4799661, 4205825, 5783818, 294207, 5179936, 788962, 8009023, 1469980, 722956, 6556818, 878470, 3476442, 6432096, 5758389, 292584, 6528034, 2109041, 77849, 5846304, 2054260, 2576845, 7897402, 1090338, 268953, 478193, 1622293, 3503559, 897925, 3204180, 754421, 4721132, 1637344, 6698684, 6147481, 5500806, 5739234, 6689014, 5988750, 5060501, 3005729, 7178250], +[5031937, 5786420, 6892283, 7324881, 1888277, 7529900, 7891455, 5773489, 601174, 171778, 8013802, 1281504, 8060002, 1772326, 4309814, 4645568, 3234390, 1273560, 201559, 1878321, 1416976, 7593985, 5881508, 4595575, 7332809, 5447071, 4559557, 868592, 6235631, 6547816, 5562105, 5166263, 4092897, 5612518, 5253118, 6704020, 2719248, 3587485, 2470748, 6978992, 2003691, 6193822, 4741495, 5152015, 2080314, 2004495, 4637066, 401376, 1331579, 2883084, 1849768, 7498482, 4595019, 871107, 3898732, 4759626, 4340167, 7161962, 2351909, 3849665, 5821491, 18589, 3556289, 7430078, 4079535, 3431797, 428931, 3888610, 3947906, 2045836, 4656334, 627801, 5738203, 7681353, 5070085, 3499803, 2698887, 4474677, 7717694, 800472, 7409843, 1951855, 6779815, 3494654, 1594187, 7255259, 119675, 1086608, 7554477, 4704707, 1720878, 4746832, 6952131, 1354752, 952104, 2265973, 7256968, 1294956, 3147077, 4131202, 4285385, 7197246, 6704266, 2300021, 6852146, 2373912, 2852003, 6013309, 2498852, 1642796, 1725753, 6886401, 4209954, 6499524, 7260054, 2769158, 3600004, 360554, 7207437, 2910416, 7827798, 3451528, 3859677, 2549760, 7085786, 4288909, 3834578, 5894763, 1302145, 5583880, 4295354, 2836910, 3163757, 2964532, 2015915, 6690235, 5324219, 6480368, 1160020, 5629460, 1561753, 1756272, 2301064, 5894060, 4967369, 150594, 7989277, 1899750, 1955326, 8095919, 4324729, 7065876, 1468452, 7342282, 7431853, 1537611, 3911160, 2885949, 2772557, 7840782, 4608267, 1574205, 6563635, 7549703, 5591564, 7556750, 5662713, 8124999, 1699519, 3220553, 6514166, 3125153, 1586147, 5458462, 1652477, 57390, 6976055, 3122498, 776462, 5338842, 5747257, 6945297, 6556834, 3412929, 4017294, 2144804, 7372760, 6528444, 3928180, 4018638, 5829687, 6846023, 483301, 6968876, 6212926, 2359560, 5365849, 6423930, 6780975, 2774727, 3417223, 5313481, 7654732, 1950267, 1051032, 4706552, 7211554, 229147, 1296487, 2937850, 232933, 3606197, 3592792, 2606746, 7229349, 6539540, 2877923, 3195847, 7232479, 2306891, 1130283, 5487383, 6757907, 3937572, 3519792, 5969363, 7809029, 2029054, 5506377, 4018732, 4635805, 2006303, 2835404, 7889338, 1264923, 8083444, 4502433, 2370663, 120309, 6894540, 37871, 4038374, 896374, 5715858, 6013132, 7948873, 4925737, 201616, 5427304, 4404790, 1835354, 5810253, 145558, 2075024, 5740332, 4484095], +[1091527, 4148077, 1211674, 3902928, 3349942, 5280150, 390237, 610127, 2113615, 6753527, 2371127, 6666728, 1074309, 5844495, 5533743, 312294, 3296754, 4077971, 7940299, 7741957, 6751363, 7365490, 2074842, 6794537, 2177188, 6394751, 2888877, 7680786, 3776595, 1869455, 7670995, 6852092, 74424, 572187, 7717072, 435023, 524537, 3502593, 980750, 7908977, 320203, 3219300, 3094380, 3780364, 3948748, 154133, 5751852, 3075337, 54875, 7938991, 1304560, 3697491, 6406477, 3582316, 1988578, 7283408, 7750014, 5294467, 2428505, 2214655, 1993308, 6044204, 4345193, 1887938, 5748674, 6284864, 134271, 7392340, 3753584, 5974818, 7913911, 465192, 978780, 8344075, 6901253, 5158774, 8201965, 684554, 3750596, 2331267, 866614, 3643298, 2719151, 5561968, 5180143, 6751207, 4014236, 490666, 4482985, 4382977, 1705547, 733023, 5597994, 4530387, 5906607, 890281, 938245, 5995343, 1553339, 6676127, 3436289, 6255507, 2589997, 2411958, 2647593, 205088, 4384082, 3854683, 116268, 6090579, 6536797, 5175647, 7241053, 6347314, 8005605, 2893224, 1727360, 1987478, 4532524, 6646522, 7928782, 3649972, 125462, 5321977, 4422483, 7309403, 6985222, 4806674, 3120066, 7350136, 7149745, 4039684, 3942507, 5389843, 2996498, 3888836, 2388416, 7560290, 5851609, 4340744, 3365316, 5954664, 4872313, 7759474, 2657134, 232498, 4814319, 565229, 3090692, 7770109, 5229058, 2658995, 2050265, 4782122, 2689493, 6964316, 6155977, 2922619, 7934614, 7789686, 2252663, 7330706, 5277819, 362789, 1171192, 1759553, 3589521, 7906363, 7859542, 2758508, 4712351, 2127739, 1039495, 4055474, 3127693, 7054722, 5875274, 7570614, 3029004, 8107588, 6681891, 1144360, 2687362, 1024189, 1881102, 2763806, 2428872, 4089452, 1861835, 5816224, 7995336, 2474040, 5976724, 1901094, 6085441, 2034722, 4264976, 6858787, 4052128, 2554618, 2605234, 4949434, 7271834, 3755965, 748000, 3837990, 1308615, 5823714, 2504882, 8289251, 2820335, 3538316, 467757, 2421124, 3738955, 6768714, 5397629, 5567914, 2144222, 4777092, 3897348, 3475103, 4276267, 971820, 4949622, 1671852, 6650160, 5808811, 4045456, 4224941, 7146351, 4598297, 5783366, 3633765, 1880767, 5366687, 5728328, 2679266, 2845772, 5027525, 5347630, 7420227, 65075, 4638008, 6611764, 238824, 7268259, 8019784, 3371160, 8071015, 35919, 245553, 7855510, 1733808, 3669108, 2570118], +[3645497, 3858207, 1299714, 2977125, 3467581, 3026544, 7132453, 6227132, 2842101, 6312395, 1385664, 2052969, 2148393, 7413526, 6469531, 8103347, 7292693, 1059017, 3159911, 622422, 8281913, 1872153, 6053960, 3680464, 6093036, 1143401, 7510512, 117415, 589501, 2403167, 3636154, 7508954, 301904, 592978, 2322778, 6707812, 7128041, 2427940, 3538707, 3882531, 6605746, 489759, 4070027, 1887109, 3808436, 663357, 3540185, 544862, 4596266, 1868103, 1120495, 2150578, 4353826, 4130858, 4107200, 83286, 5240230, 3252756, 826400, 7099138, 5921833, 6743856, 5960911, 8003962, 3639612, 4182112, 1631726, 5913858, 5230122, 7713235, 7248908, 4804266, 767254, 7089452, 6143594, 5271875, 7567810, 3241538, 8089305, 7095725, 2100257, 8243645, 706776, 7220036, 116541, 4308596, 4822557, 1510757, 4989829, 3528410, 1866783, 3438510, 3798634, 6972222, 622796, 1313473, 1999276, 126204, 6738790, 7370907, 8118453, 2826738, 6729432, 8053835, 7116781, 6350260, 8053772, 299520, 7228441, 2018776, 7774988, 2151807, 3115425, 1925214, 8371973, 2825223, 894033, 5349021, 7500425, 5533995, 7328470, 5801833, 1071160, 4702833, 4351624, 1549374, 1160248, 2205924, 3970967, 2828284, 7041828, 6801453, 2117766, 7639421, 2088049, 6099966, 4445087, 7654857, 8352392, 5769896, 5743354, 1137412, 6812263, 4483073, 2381490, 6623162, 3142925, 2834434, 1600952, 5588834, 1911392, 1556272, 7483458, 8249306, 759634, 5312291, 2693394, 6928838, 891027, 3023566, 3657531, 585124, 3306404, 3631495, 1032255, 5605751, 4816140, 8362134, 1140041, 3880958, 3312606, 6760182, 858007, 8226903, 5246753, 3194750, 7050577, 997776, 3846275, 513308, 373420, 1856693, 2151484, 674951, 3519199, 8081444, 3394648, 1302185, 7858618, 6746079, 1861179, 1556490, 2244934, 7862980, 5608335, 301433, 6546675, 2337165, 1709486, 2014762, 2546709, 4797973, 5869505, 7587256, 8119365, 456577, 1941454, 4461951, 1799412, 333407, 7668482, 479912, 5536942, 1711971, 6196388, 3139468, 6234997, 1246791, 1733140, 508422, 7415737, 6830806, 3442683, 2861715, 7098319, 5844849, 6392467, 8004978, 6297814, 4105188, 5754316, 457505, 281770, 1616666, 2594451, 5599675, 868124, 6740711, 6236612, 3339209, 4431736, 4434059, 1554106, 5037575, 7414520, 6050026, 1886382, 2681938, 894706, 3123499, 7730718, 3737246, 7205279, 5127963, 2379245, 585802], +[2274589, 4563812, 2217109, 255156, 7266392, 4124139, 7018892, 1652531, 5600301, 4623519, 5725860, 1057656, 515044, 6984800, 6021929, 6493614, 3067273, 7581403, 7999630, 5723169, 7219512, 5122290, 4766814, 6104313, 6705611, 4427965, 3562691, 2756510, 7067140, 6569306, 3531942, 411333, 2633461, 2697987, 7444320, 7069172, 5644432, 2767621, 52204, 6640109, 3014026, 2695416, 7048560, 7920853, 4544476, 4363221, 4894580, 3255597, 2919103, 3531572, 3938847, 983384, 4478317, 2799731, 7054344, 5134242, 6952495, 525044, 3585171, 3474103, 2788537, 516016, 406130, 3169664, 3170518, 3080377, 3662585, 988944, 4923418, 3957588, 2555119, 7135605, 1302444, 3098086, 7075871, 4312966, 1663769, 8333396, 5873104, 7067336, 6627266, 505923, 5802136, 7131145, 5237031, 355057, 6241497, 7242768, 3877088, 6280947, 7659657, 951239, 1430074, 4349366, 7635901, 1911756, 7453573, 6320175, 2846128, 660516, 3397253, 4519204, 6948309, 4750058, 2060858, 3336821, 7810381, 7864399, 6150750, 5117908, 3685613, 2226237, 3993308, 4879129, 2347933, 5973036, 6863606, 2311481, 5775419, 7895647, 2370283, 761769, 5490953, 6272889, 4136588, 388759, 2693186, 5594415, 2875606, 3608946, 8192360, 4197492, 7365619, 6336441, 1235698, 8187332, 811431, 2476465, 131302, 3954135, 6099623, 6211226, 4527796, 6402603, 6687355, 3843722, 878030, 5470393, 3239083, 2611574, 4782399, 2298053, 2859650, 4169914, 4131821, 6645730, 4003032, 6997457, 2804033, 7236069, 7778323, 5281767, 7276281, 1525470, 3881466, 7354822, 2024054, 5656492, 6428602, 4033015, 3424924, 4702494, 4562511, 4211481, 6040880, 8066527, 1218428, 3515095, 2252900, 5053556, 6585651, 8192547, 5150392, 6015712, 8096678, 2947182, 7922549, 4197539, 1233795, 1003500, 3289301, 6075572, 4990449, 7313669, 132247, 6296743, 7284471, 2348543, 4940082, 2196484, 5091665, 3595621, 3213853, 6815771, 1990100, 1733938, 4553964, 4890566, 3493058, 6449636, 2175479, 7148814, 2987627, 3054237, 1898778, 2036656, 1157078, 5585097, 1242220, 7644910, 177823, 1039513, 6056354, 6096387, 5087712, 7494423, 4869246, 4710828, 6893526, 7990638, 7635070, 6923136, 2908022, 5908079, 7809200, 6172705, 8321366, 4262062, 4802210, 6595638, 4547330, 7670146, 775753, 7020872, 4862355, 208399, 6910061, 3090075, 7653069, 6771380, 3368674, 4446110, 2677892, 6724719, 8109473, 3117947], +[8139176, 3957293, 1362807, 2670427, 401888, 4797923, 4423905, 4312711, 388073, 1631860, 32940, 5080542, 5237387, 5789728, 6489837, 7973292, 7933205, 118973, 7883580, 1813053, 1351940, 6273479, 4124001, 6968120, 1073865, 1824776, 4192058, 1103991, 4283338, 1830566, 6050178, 4076864, 3155410, 2460665, 2466941, 6540994, 2730650, 7185414, 373549, 1387707, 1685756, 4772159, 7770179, 3595272, 7212342, 87896, 6985863, 1633112, 7083322, 4429782, 541684, 7065104, 1377319, 7325758, 5267345, 3420674, 5958855, 1398409, 4294758, 5232259, 7418762, 82915, 1832193, 6994767, 8237478, 7202105, 7918366, 6429068, 4039626, 1888757, 7182074, 5277742, 6206300, 1531581, 1569923, 7653727, 18326, 1345517, 305249, 795403, 5422631, 5049753, 4802015, 2046922, 8085770, 7602421, 422666, 1815842, 8010168, 2945450, 3031028, 4130496, 8304994, 8135181, 1658915, 5257160, 5890, 8124427, 7966827, 7754638, 3376907, 6718406, 7466129, 6222600, 483808, 2046792, 4560835, 2938010, 614274, 5711230, 6901654, 1060278, 1195873, 4686111, 4108065, 1326368, 949541, 8032730, 4424738, 4786183, 7992825, 6378263, 3625813, 7229363, 4808346, 4036006, 4069463, 969162, 5461078, 7724276, 1288649, 7270605, 1244352, 631286, 4466591, 3269449, 6886817, 3066999, 5919350, 5371666, 828475, 2337942, 3956963, 2228911, 3978443, 7528047, 3589214, 5894452, 7568202, 2201941, 4875486, 7541772, 5575677, 1447718, 6984155, 666589, 4519762, 1748037, 2768279, 8007466, 6721770, 1768642, 4315937, 3666342, 5000369, 1884102, 2121086, 2891222, 4958296, 2459699, 3812327, 1442666, 5202630, 4525428, 568894, 3162075, 1284756, 4826381, 763948, 1743923, 5835928, 1707331, 2080367, 1358756, 4708659, 5129368, 377252, 5292486, 1274475, 1087191, 1949067, 5417283, 3453188, 8007117, 3675875, 4454546, 577935, 2955186, 2511146, 5707005, 4204193, 3971833, 308724, 4211912, 917907, 2356773, 6973365, 6153874, 1443181, 4508636, 2296286, 8175456, 4215551, 1335598, 4510983, 6965498, 4788616, 7696936, 7793218, 5417767, 3101134, 2097919, 4210124, 8182378, 7142118, 3955554, 3444537, 5725198, 7615079, 3058114, 130398, 1198918, 2638025, 2044883, 5496663, 5441189, 6490486, 7412468, 1730187, 5627338, 4780805, 3987738, 5490056, 7365615, 6202890, 3562131, 6016494, 5139778, 92226, 6761478, 904740, 6050880, 7791222, 2610660, 7665682, 945387], +[4641210, 1102853, 1383161, 7548894, 1483664, 1527378, 6704863, 5571674, 8156612, 7940738, 1818133, 5992808, 1018065, 1599543, 3217047, 6069822, 7760811, 6475002, 3932214, 1997114, 6099971, 7838745, 212466, 5877555, 2791539, 3655072, 996688, 1154454, 1178829, 6762581, 8017577, 7058855, 1752060, 6253282, 97226, 5827718, 585360, 2729744, 3751025, 414878, 8212544, 4874659, 1950559, 4588551, 4965848, 4298774, 8210616, 6873201, 2545686, 575220, 4256156, 5778477, 6192232, 1105171, 1798147, 2087545, 7354693, 5794945, 1267089, 1983339, 7306715, 2849961, 3428837, 6352382, 5105015, 6257971, 8250760, 5696917, 3209454, 2444368, 2851390, 5862143, 2679162, 6744677, 5531642, 7240905, 3361989, 5652514, 6538170, 1815922, 5230431, 5113905, 2422766, 3339047, 4926340, 735629, 7502232, 1796915, 5637660, 718370, 6839287, 5582813, 5375096, 4275109, 3852925, 6110891, 2827427, 1027923, 4453423, 2913558, 1894401, 2703681, 4157474, 7885424, 6101598, 6573587, 4906362, 3851818, 1736686, 2022782, 1900965, 5603827, 5156940, 7346011, 6647885, 8167473, 6064895, 4984295, 4942383, 7019306, 6438500, 5690450, 6334023, 23313, 7709409, 7603692, 281269, 4459105, 3403906, 8286260, 3080737, 2622500, 6040278, 426233, 4060659, 1852038, 3856172, 462352, 3358351, 7069256, 6103282, 776695, 6948008, 7238772, 5951585, 8292805, 260088, 8289437, 600584, 7199020, 5874292, 6011207, 3451104, 6403915, 41486, 2676503, 8250489, 1347682, 6271860, 5577636, 184331, 3132226, 3933798, 1846217, 6587045, 2399001, 3509686, 6448099, 630953, 2703576, 6138887, 1405869, 1900641, 6845466, 3473290, 8299507, 8073919, 5694125, 862035, 221306, 5536365, 6855448, 8347554, 8378125, 1049372, 251054, 3291985, 5398894, 59585, 1206911, 3946950, 4184272, 4016014, 5568863, 2037670, 4563702, 2531808, 4388309, 5718850, 1105300, 1747316, 1135530, 5363276, 8045690, 5381725, 7668825, 4150155, 3599195, 5722526, 413218, 3212060, 2679392, 1049047, 3637189, 2845513, 6027431, 48586, 7637227, 5283786, 6543203, 1799246, 3815988, 8265941, 2459804, 1473058, 3162430, 3170159, 4966639, 7663543, 2273461, 1939893, 114117, 6105325, 7329791, 4513500, 7946939, 512801, 5149760, 183668, 238180, 2974128, 2232000, 181634, 4805485, 556885, 2725276, 5755183, 2812140, 4213494, 1631325, 5127961, 7579079, 1008177, 2289620, 2987574, 5710195], +[3923978, 7531956, 1984338, 7034115, 6290810, 88224, 5350580, 743116, 3835779, 2014601, 292142, 6839248, 4984587, 6074358, 4910855, 3161582, 6164708, 3569573, 6663533, 5900033, 2137939, 4061318, 7968656, 6687750, 3604867, 2456331, 7986381, 4453493, 3384670, 660364, 4320910, 467103, 660229, 7328809, 6420098, 7844818, 1195220, 2375736, 7714980, 7439921, 5476418, 248616, 4986104, 2362743, 6583669, 6803060, 7485412, 5567466, 1509002, 4887060, 1459131, 5128372, 359035, 3612615, 7659896, 6367481, 4917275, 5345288, 6794162, 3512970, 4339723, 1502065, 5338052, 2483712, 1874072, 3051574, 3760621, 1596580, 7193228, 2234888, 5757361, 8132363, 533405, 1691082, 5501243, 7608322, 7002032, 7670474, 1363088, 5975823, 4745200, 2440122, 3519182, 3501037, 670879, 7271941, 2536722, 1438733, 7408112, 2574328, 1938242, 5965668, 1388138, 7436749, 5744717, 4158706, 4159724, 7195262, 6412865, 694178, 441829, 8089917, 3743484, 3234255, 5189216, 3421259, 3684975, 5741060, 2601359, 2630662, 109442, 4341484, 3093486, 2385887, 4518527, 6177398, 3424642, 847104, 3104469, 3413606, 3108578, 5798744, 3454694, 3697993, 7845766, 5416198, 604156, 1551814, 6005864, 5269167, 3822285, 7081232, 7055824, 7367177, 2290923, 1906016, 4969760, 8060519, 1134459, 706210, 5102616, 2397771, 3523096, 6312871, 3511321, 1317492, 975474, 1184369, 8204163, 5402549, 1685580, 964945, 2273915, 4561478, 141141, 173441, 5487819, 8321272, 2737595, 6063645, 2357634, 5855910, 1839938, 7900202, 2505088, 4968216, 266315, 5687973, 360987, 196987, 5480751, 5799471, 7939730, 6672444, 7015598, 5623950, 5904311, 7766208, 4439875, 8063261, 7011528, 2895434, 6727258, 3719978, 7018645, 2925328, 3496462, 5249353, 2023110, 1510944, 5732670, 6460180, 5706188, 2424258, 1342295, 7113029, 2898496, 4159120, 6162231, 3462878, 6859186, 1664503, 5218126, 6208473, 2551560, 6985418, 1260809, 4362547, 1440397, 3973214, 6517356, 2102005, 3767739, 7859615, 6205234, 1767481, 2460534, 1061756, 4652830, 1265610, 6925747, 2725139, 4359177, 2493071, 3174952, 3078073, 3623891, 4085785, 2054520, 5623672, 7147948, 1674171, 6333728, 2389341, 3231339, 4368014, 111043, 2902765, 5541828, 3605927, 6698276, 4899684, 7896054, 5266363, 208021, 2062238, 3511985, 8162522, 640843, 1792338, 1900358, 1779099, 3880078, 7273125, 1266626, 7891621]] +NTT(t1) * 2^d: [[7727808, 3580193, 363918, 1450101, 2723533, 4197808, 5400093, 4251559, 3554285, 7632601, 258451, 3183559, 6503174, 5084631, 3461412, 6521437, 8152165, 5414069, 4849164, 341845, 1557528, 7866906, 7097805, 4026969, 6963301, 8189879, 910700, 2170647, 314595, 7255281, 4634471, 677174, 6038362, 894288, 59298, 5360654, 7191801, 2859914, 121798, 4984989, 977537, 5376307, 3434993, 7605644, 1843381, 159341, 1427349, 7524791, 7921213, 162816, 2598820, 6965878, 2808639, 3576728, 2081194, 7584250, 3793859, 2703732, 7607103, 7617684, 7546640, 5696877, 4761285, 4347777, 6060364, 1783294, 365782, 752768, 1750821, 6859823, 5953836, 8173576, 3718142, 5074401, 6021351, 1057545, 4932594, 7099296, 2157312, 7132851, 8054444, 3207615, 4145830, 7160738, 6347896, 4971906, 7711043, 4550859, 7752033, 5812675, 7735120, 5034330, 5736234, 6067087, 5136170, 2300801, 2214523, 6633705, 2579081, 8282363, 4103793, 2059444, 3162499, 1021940, 369772, 86903, 5031189, 7836050, 7544980, 2882006, 8021916, 430108, 3409320, 1712211, 5300064, 3883753, 4572673, 6080840, 6197734, 2939939, 3572948, 2677302, 5003321, 5549272, 7614905, 1711566, 6205331, 4182417, 3254181, 7409769, 1935798, 4924413, 6743539, 1586364, 2194135, 4966192, 4487487, 5566787, 350310, 4120971, 2661226, 2777749, 3541668, 8220548, 7360895, 2067781, 2163628, 3780387, 6061013, 3325949, 427815, 1688792, 3352053, 6734410, 6441527, 6741241, 6552287, 3756708, 4678188, 1641045, 5182547, 7065683, 6892675, 7643050, 6843508, 6058180, 5995999, 2491850, 814645, 2507879, 4288469, 720164, 7595775, 3113640, 488614, 8017054, 5869416, 7282218, 4510735, 5328186, 6518058, 8035225, 4915626, 3387193, 1925892, 2924844, 3850515, 1166555, 6339951, 3077569, 1979088, 4775033, 6427312, 5725441, 7473916, 7559605, 7734742, 3367134, 3017914, 2463256, 3733780, 1988419, 4183733, 7861062, 7872852, 47954, 4136358, 2849255, 7282222, 5116690, 7924581, 4207380, 1754062, 3014241, 8257527, 6286765, 2224113, 6539755, 4964065, 3984441, 1875197, 8012140, 7797348, 5881150, 3360503, 6028454, 2355898, 4048753, 7735812, 48866, 2213651, 5224435, 827316, 7219630, 620584, 7624234, 7078361, 6904791, 7593722, 3702317, 6863311, 6607520, 6175891, 1176516, 3849503, 8269306, 4454848, 648812, 2238599, 1100543, 1665558, 5236342, 878882, 6081710, 1266822, 7218328], +[6737098, 2714088, 2713007, 1639432, 6895819, 5071680, 262622, 5728757, 5512629, 7675737, 5259623, 5798684, 6611258, 4012348, 7679884, 1019459, 5624743, 7764772, 229179, 760020, 989847, 2089729, 2296203, 2117236, 7922689, 5065524, 372375, 531631, 3647537, 5039872, 436931, 920646, 7344224, 2779794, 101361, 2459239, 931230, 6935118, 1660561, 697690, 5380186, 4745306, 7474662, 1526868, 4544527, 3586137, 6794828, 2948728, 5372651, 2209022, 1505520, 7488351, 5942901, 4373677, 643357, 5156308, 4919150, 7873704, 259845, 946509, 5081542, 1433582, 2789996, 230305, 6828141, 5362406, 2408029, 1528103, 1216749, 7034929, 5410361, 5750171, 1600023, 5472940, 789668, 979619, 1742258, 610026, 1483400, 3980530, 2073525, 8140941, 3221021, 701096, 2890218, 1164364, 8249228, 1489882, 5276456, 7802378, 1571182, 912864, 6923637, 2456276, 5848158, 227161, 6784075, 7052047, 2692092, 2682938, 307107, 3605637, 4474471, 2594616, 746966, 4519664, 7386397, 936202, 5617270, 7215547, 7985514, 4810165, 2527213, 3311407, 6923336, 7533934, 545345, 3751584, 3286139, 8221924, 6750749, 7770835, 7541060, 3634756, 3990770, 4034464, 3060060, 1935742, 7281416, 2828974, 6549402, 1070379, 5247980, 7378095, 4954190, 6858357, 4311980, 5613378, 7871379, 7481986, 5364234, 6584652, 2758455, 4557183, 5762313, 1744749, 5480831, 317631, 3053705, 7528727, 4157309, 115973, 3660389, 1721335, 6390688, 342561, 1888529, 537851, 1856874, 4170256, 5525096, 6806014, 542448, 8069933, 7113383, 7136038, 3336801, 2719994, 2587011, 1217460, 5932833, 7459858, 4069874, 6196009, 2718129, 835528, 1779037, 2470932, 40201, 6777758, 346638, 1222011, 3491575, 1643256, 8155306, 4880336, 8365018, 5572371, 7229697, 2404520, 5179838, 869852, 3644968, 1631588, 2017351, 4273918, 1747843, 4196217, 4343324, 2872680, 3298036, 150454, 5284550, 3512462, 3365885, 6155784, 3490935, 8339233, 2833165, 6689993, 5832477, 995899, 127560, 1160716, 6800486, 4286216, 1832195, 8336333, 7300195, 210737, 7297968, 84748, 8119859, 364791, 5501584, 1288501, 3842607, 3643457, 4836090, 3174568, 4845133, 1636439, 5494061, 8061409, 4053804, 5898531, 1715919, 3045107, 5062539, 4441517, 163803, 4853909, 1850516, 2918957, 7866635, 1327526, 8310066, 696123, 2362183, 6344495, 751870, 5204433, 2391922, 3110932, 2279957, 2338529], +[8264662, 6836266, 3619680, 1495321, 5239606, 3656663, 3882627, 3431852, 792558, 5760567, 6846195, 7038604, 1301478, 780719, 2747103, 2285263, 5305194, 2396270, 6513071, 7496305, 4793913, 7472097, 1619988, 6497807, 1996720, 8193942, 7763193, 828076, 5747093, 3553501, 4424374, 304598, 6291384, 2702801, 4768393, 2031191, 6233600, 7074465, 5864514, 1335757, 32455, 7713718, 6779952, 3101073, 8114413, 5594986, 4467210, 1627202, 5373899, 4178352, 1923845, 3019234, 3688330, 6492755, 7280745, 5489713, 6455913, 3615689, 7583419, 7231372, 4126820, 2615532, 4190057, 4118731, 3574285, 4704257, 2113405, 1156038, 1610155, 4073776, 8233417, 6143546, 6487108, 3981348, 771494, 6614094, 4694191, 1367395, 2273710, 7149338, 1088689, 3232279, 136606, 7695044, 5680185, 3515961, 8245421, 5316129, 1625826, 3641156, 1685885, 4545844, 1125024, 4443828, 6777203, 2219162, 1260651, 4606236, 3480082, 231042, 258785, 7243806, 6419997, 6117067, 562660, 3997496, 4312899, 151880, 5480335, 5400767, 6956811, 2370621, 2114650, 5089220, 5153135, 1471732, 4389224, 6649962, 5189298, 738975, 4350394, 7623185, 5373830, 2706350, 438045, 549911, 1451348, 5074342, 7689239, 7398384, 8357044, 7205012, 7270643, 5557100, 1070223, 3379495, 6010594, 2614050, 395688, 1265517, 5477159, 6580548, 6442342, 148063, 3298779, 2268957, 658846, 4365784, 1709107, 3465813, 4131849, 1783257, 1415212, 5074366, 210363, 6178153, 4794495, 7623896, 1843636, 4612674, 137062, 7455747, 1321945, 5299870, 7207816, 8321353, 6853196, 5063120, 7004670, 4093304, 3378690, 7550945, 1039368, 2470020, 3126287, 926992, 1509777, 3384088, 7566448, 2556171, 5547645, 5290914, 7894462, 1358871, 6781138, 5592435, 2209466, 4264035, 8173797, 3836363, 4833657, 3487374, 2926894, 2947262, 5212356, 8173628, 724919, 4867536, 200839, 1529407, 5535246, 1305882, 2860092, 4354473, 1531173, 5869913, 1620737, 6531524, 4732528, 7405658, 7755068, 6402686, 2014775, 5781186, 7475642, 4466216, 2296676, 6122174, 112592, 5770691, 6066463, 8147644, 1036204, 8133707, 2845978, 2210206, 5400220, 1771986, 4206734, 7974879, 5694647, 7655026, 2836971, 561696, 4036818, 232322, 4508193, 234949, 6624547, 4115662, 3345301, 3335083, 5128129, 6131275, 935617, 3809047, 7095360, 3981665, 3068705, 4645167, 933853, 270096, 7496194, 6928738, 5157374, 2799152], +[4485653, 3879237, 4127498, 1594530, 5190339, 4174962, 787652, 1067065, 1692966, 3966950, 4274870, 6805546, 759756, 7103410, 640844, 1335567, 6128680, 1735669, 7263216, 3587488, 5955681, 514266, 7112931, 6001139, 387260, 5815203, 5473107, 6496142, 2072000, 1144531, 3371550, 1090388, 974553, 5414333, 4650786, 1635, 6546633, 2954939, 1225341, 2011437, 1918663, 6266402, 4362358, 5707980, 6795638, 3710328, 4952700, 5127660, 7777908, 858334, 2538425, 1898442, 7868257, 8245307, 7188562, 3465135, 3468286, 5231509, 6872281, 4424933, 5802340, 1959488, 7473470, 74096, 6558235, 716808, 334277, 7514476, 4467720, 6857357, 7799891, 2108840, 32018, 500974, 3917963, 2911199, 5554971, 5518240, 3629341, 1606888, 309243, 2539654, 7421262, 5932143, 7716751, 6082445, 1101206, 6625852, 5385459, 676487, 6805728, 1692383, 1921407, 3900769, 6651296, 7895805, 2734174, 3071877, 2360901, 1565659, 7758081, 1545525, 1123918, 6373696, 6489300, 4081601, 5857600, 6586076, 7742567, 3250251, 1532496, 3585993, 3191835, 7788711, 6250505, 5895479, 7814295, 6359956, 6644573, 4811487, 5899269, 3271129, 646121, 830987, 6590307, 4520470, 1358738, 2750356, 5763287, 5829940, 4244765, 4490760, 1275882, 5563093, 866311, 6875318, 1240839, 6308550, 5070876, 1436152, 1894930, 7035817, 861693, 2346722, 7935721, 2123446, 2200576, 5928238, 8026596, 1510057, 3504308, 2365967, 1737581, 7012481, 4652314, 7162808, 7026104, 476555, 8330394, 4920437, 2503177, 8117701, 553824, 7107107, 392207, 6007449, 7196061, 1073170, 3431334, 5886255, 1078106, 1615408, 6003898, 7856279, 6622200, 7730126, 492820, 2874417, 6697297, 6430219, 204435, 7952618, 939977, 6503789, 643728, 6275365, 2732810, 7609096, 7815679, 3409470, 2799845, 4151823, 3864430, 1647098, 2034326, 5496538, 4073217, 5183252, 432505, 3889231, 3782215, 839086, 4532631, 5628680, 6848768, 2612802, 6740119, 5304055, 8010018, 7634619, 598712, 1023531, 3812060, 4028791, 624727, 7402500, 6834226, 6363966, 1456482, 8306192, 74671, 1918443, 2355931, 3142931, 6096102, 3680687, 6244248, 16751, 1845236, 7467092, 7891464, 1834561, 3645165, 2669012, 1005080, 6515359, 5078192, 1336899, 3303472, 1119040, 814868, 3084050, 1382929, 2641092, 6865841, 26854, 8132813, 5363139, 4947094, 2290707, 7611004, 1855931, 2368637, 5622892, 6305515, 5291460], +[3766097, 1707667, 2193289, 3514119, 181313, 3485761, 722227, 3160497, 3263134, 4763225, 1051171, 7347191, 3890697, 6374741, 4507906, 5179189, 2610250, 7963406, 6488437, 4147750, 1639535, 1051761, 5377485, 583857, 7112294, 3444504, 4952678, 4486522, 2090244, 5097195, 4469380, 712302, 2119154, 2749875, 7955348, 1975554, 4426355, 3323247, 253901, 6866598, 2192510, 6829494, 730390, 6439362, 2535078, 1027927, 4484432, 3363730, 3962075, 1438340, 2429174, 2300991, 5287655, 6575440, 6210833, 6777958, 1525108, 2006527, 4739664, 8336061, 7058779, 3472904, 8371828, 3355622, 1971173, 1012797, 2003460, 5946426, 6073652, 5107940, 5633599, 1467585, 1350407, 3617836, 6571260, 8359817, 3037606, 303150, 493971, 3695876, 2221746, 4595218, 5753305, 6833350, 2403329, 622245, 1419307, 7783513, 7704883, 6137861, 3728065, 7142495, 7723659, 4853605, 1868504, 6486196, 8332171, 657374, 1160482, 5578107, 7312136, 5017279, 755064, 2199005, 4388898, 6697795, 6537774, 4891129, 3876996, 7056502, 6279662, 1546112, 4411585, 3616095, 1210121, 6236466, 2442699, 4290349, 4778483, 1081818, 8312564, 5381400, 4188937, 7170061, 4902965, 155268, 5322168, 5327524, 7992582, 6754873, 1433784, 1003513, 148448, 8202191, 7674697, 2146493, 1572071, 6592140, 2932608, 1962215, 4065462, 4851785, 8359607, 5474190, 26231, 2543955, 2423974, 3369757, 2167714, 7190024, 7343550, 3233594, 2987285, 1355796, 7753786, 2631328, 266423, 1115464, 8295756, 3187807, 3711565, 142293, 5768248, 1448493, 1667374, 3884011, 4585542, 2656871, 567156, 2855066, 7721709, 6434316, 7810709, 6655980, 526575, 1401139, 285529, 545428, 2078566, 7851189, 4908763, 2965688, 4992086, 3860744, 5366038, 7713984, 3572160, 1388537, 465738, 7863340, 2913137, 8169678, 2084082, 1975315, 2293631, 1452021, 5817392, 6207241, 118051, 841629, 1584271, 6541894, 4993979, 4457978, 2988135, 7993698, 4837021, 5123412, 4387498, 5269344, 4757426, 730292, 3822744, 4764759, 735424, 7256122, 531349, 4418221, 2440002, 246479, 6913875, 1186824, 1583328, 2697401, 2722963, 7758691, 6458729, 7663108, 4515246, 8249726, 3441369, 4048273, 5371110, 2074993, 5243439, 7743599, 2318394, 1994682, 2026922, 2918097, 773795, 5849783, 2612490, 181553, 290159, 5979957, 5883294, 5035060, 41671, 1164837, 7844644, 1240838, 5739975, 4417107, 1237257, 7091225], +[1532140, 2691300, 1399500, 3249614, 7143032, 429486, 3706652, 6270857, 2915973, 1432005, 1671136, 2649242, 5319681, 4671973, 7759673, 237966, 7061942, 2498444, 2793958, 2431252, 4561623, 3622924, 2355265, 3818853, 6044647, 6281481, 6770687, 1424329, 298917, 3430659, 1272038, 1708143, 3912692, 2864795, 3995285, 7816967, 2151827, 7242897, 1261203, 4250292, 7166353, 7261640, 4039253, 3682886, 1565814, 7708587, 6702420, 3307972, 566516, 1568534, 4234735, 2172166, 2955966, 443399, 7703524, 6427377, 7391552, 8116906, 1666970, 5213190, 8094637, 425903, 8378626, 4220235, 2302092, 1508480, 2826692, 4384628, 6729876, 2447562, 5022868, 691161, 6400078, 1227303, 5249538, 5432007, 7659503, 2226909, 3235542, 4357367, 5983052, 1838264, 429482, 7551024, 8192289, 4154105, 1367651, 137489, 631146, 1905857, 7386222, 5279803, 2285642, 2326768, 5175723, 8072174, 6348795, 6414587, 5939605, 2433636, 8246044, 2983513, 2245502, 5843006, 7798312, 6486064, 2461334, 8000713, 3882408, 6908466, 4056486, 3685364, 8264560, 6311452, 5894225, 4586224, 1612896, 1089876, 2150171, 4820410, 1024379, 7210918, 2462248, 6915174, 2010532, 2216087, 8122487, 3120205, 2485030, 5120642, 5667605, 1172541, 3144512, 777623, 1412850, 7893893, 8218037, 365642, 2222438, 7498622, 7109847, 3168019, 8368357, 6690686, 8343760, 6652738, 4338252, 7768447, 385818, 3643288, 7294307, 1762100, 2673334, 1415801, 1090901, 5045621, 1207998, 6166868, 333166, 3637613, 5400150, 7354688, 7556998, 7639553, 7924969, 6215887, 3332071, 1832182, 6860050, 3331740, 5149042, 1931902, 5524515, 5721785, 867796, 8229870, 7297817, 7286163, 6470934, 5986648, 6023608, 7919996, 4978703, 1735376, 6655494, 371818, 6454928, 4148171, 6880035, 6265818, 2062479, 4074321, 4608721, 778605, 1929719, 3305214, 7888332, 6239416, 5764714, 5818934, 5615603, 4477142, 6561491, 1806315, 2260095, 6584065, 4883808, 4327553, 6150782, 2248393, 5519164, 5423305, 6475752, 4774631, 4714183, 7480680, 7990712, 7422621, 25150, 8039249, 3445801, 6297598, 3919853, 3465410, 4539579, 5206246, 783065, 4008484, 7283437, 3003475, 3907457, 8067949, 5985774, 7608370, 682755, 7162682, 4695864, 6816691, 2406757, 6859396, 2665919, 684230, 5221130, 115680, 3606609, 365158, 1886471, 1846368, 1277862, 3851823, 3341452, 7022822, 434752, 8082953, 2802363, 1104996], +[7220808, 482250, 531128, 1442605, 2570838, 317995, 984678, 3402426, 1900763, 1728942, 2144527, 600350, 1473565, 4864485, 6017976, 2967763, 2720350, 3557191, 6754557, 1783904, 6916278, 4243986, 5775153, 3434895, 6509912, 7500300, 2341938, 4176792, 2726784, 4507182, 2662755, 1262860, 5601616, 5777440, 335777, 5810624, 1670596, 3110292, 5788078, 4611691, 7553189, 519523, 5904526, 3239547, 1682698, 1044374, 139430, 5621186, 3782216, 2407886, 3895232, 4688368, 100443, 2710472, 6027555, 5117960, 2827243, 5507552, 5036842, 6264942, 3671066, 7419167, 6255337, 4704191, 2002050, 2287643, 2162815, 6982208, 2479039, 3446443, 2364701, 2886046, 7763398, 304703, 2296545, 902234, 3363626, 3590763, 1443593, 792849, 6999048, 7785594, 2471616, 8172353, 4869425, 752945, 4686683, 4315428, 7613050, 1834306, 4351459, 2468527, 2075514, 8310702, 2511178, 4188331, 7189813, 6806548, 2486015, 439520, 6781125, 7493038, 12320, 1139172, 3483828, 6645479, 437572, 1823051, 5364063, 2545735, 1890494, 7006875, 8350800, 7128052, 3524254, 7069905, 4507864, 1953016, 2207009, 4113715, 6227819, 4287046, 5154769, 6610922, 656016, 6185720, 7921390, 7130874, 3150593, 8044637, 3961917, 4511229, 3975408, 5447264, 3043455, 3340526, 3969351, 8019517, 7082798, 2663682, 518322, 1948937, 6669689, 189532, 6498631, 2998358, 2014978, 548953, 679349, 1377411, 1845650, 477452, 4297427, 7841677, 4636632, 2741704, 8323200, 3201755, 7120910, 1960628, 1564492, 6738955, 2969851, 5937396, 7947994, 538327, 6517402, 1058657, 6430104, 6632878, 7260304, 2185890, 7616703, 4687325, 1675965, 7618640, 3293484, 870978, 5479606, 2768680, 7465693, 2655699, 7340065, 6365187, 6527999, 3432203, 8139631, 4279139, 2056134, 6503269, 1765614, 1650694, 6049963, 5515965, 7182393, 806547, 7419478, 5418815, 2288170, 3767240, 260436, 8379307, 5811078, 6693192, 6097780, 3408568, 7098408, 2298434, 7260711, 7773805, 7066557, 1267141, 3865599, 3469853, 4502819, 7678205, 4136913, 4350679, 8301524, 771844, 6650146, 1618286, 819312, 4191900, 7871073, 2757613, 7410662, 8162570, 2040509, 2905938, 2332824, 4620177, 493744, 8340484, 192196, 2245032, 2276875, 8195159, 4513613, 6913816, 2184357, 6854523, 4611919, 3714471, 3055072, 30104, 6613511, 7664964, 6385642, 5429702, 5606508, 5686032, 4275239, 1193794, 3388568, 6810163], +[6328581, 5153598, 6068333, 8103205, 3131387, 2015146, 2370450, 3423530, 4518235, 2570319, 4808419, 4031971, 4345080, 6605007, 3722560, 4191214, 895094, 2667103, 6006415, 3205497, 7305175, 61566, 4161939, 3262071, 6861373, 882335, 6898050, 3059455, 4797204, 4332923, 6393729, 5037624, 3227003, 295940, 6326141, 3711500, 2915184, 2701038, 4391563, 5440408, 2444055, 220941, 11510, 5207803, 5433053, 894470, 983915, 2452158, 629309, 1543511, 2726510, 593003, 8068770, 3289653, 5685953, 2688944, 6032698, 920471, 3425807, 8278679, 1281902, 2464324, 306078, 7296645, 7854297, 8090714, 594340, 5732840, 4211849, 5371768, 7694853, 4382963, 3456503, 514443, 4680447, 2212595, 5072196, 156342, 3701452, 3926319, 4304354, 2184879, 504464, 2708130, 6667633, 3736636, 5772881, 3234434, 4654007, 3765804, 5568666, 4540729, 7781044, 4596635, 4680209, 1724447, 1683486, 4113543, 5736324, 4783450, 7503441, 262428, 2675125, 4518823, 4582448, 2839280, 1053166, 8243733, 7312914, 4330997, 8224662, 7327597, 7836721, 2053860, 7851712, 4286570, 5411565, 490692, 5624870, 7189240, 5764130, 3107292, 185039, 7131618, 3097099, 3566418, 4799922, 7748116, 6990098, 5868514, 2920808, 206070, 1574159, 4531167, 3487553, 1366201, 208134, 2466105, 7986092, 2784590, 7490693, 7223001, 7426701, 7866342, 3150488, 7297785, 4545607, 6208379, 5939373, 699231, 5724561, 2096209, 6625106, 7728790, 8109943, 4538199, 3656460, 1548346, 382348, 2648281, 5256960, 2107812, 4782330, 4874710, 6420080, 4320520, 2744060, 756296, 7298720, 4677440, 4418323, 682459, 1851823, 3581574, 7259447, 4246151, 4729205, 5030489, 446220, 8167735, 7439675, 2815218, 75344, 2863564, 7079220, 4674773, 7131815, 2780149, 5232711, 8157756, 6556189, 7841622, 7506487, 6313663, 973536, 894167, 2757871, 5115935, 5744761, 185031, 8136144, 670117, 6761492, 7440460, 1619522, 3056980, 3873584, 3886936, 105088, 7409877, 6924062, 6248442, 242077, 7602686, 6047823, 6224193, 1791643, 7412723, 1846844, 1301291, 296334, 7288217, 1421147, 161403, 4772833, 7279680, 3478058, 7745639, 2750504, 1968775, 2016437, 4446620, 2738129, 5207777, 5772202, 6770515, 4579220, 4207851, 1936087, 7164476, 5686893, 4394315, 4415962, 8039397, 2883381, 7313441, 209559, 32981, 3644814, 342312, 5298367, 833845, 7057712, 5055547, 1243946, 1622494]] +NTT(c): [1425712, 8250935, 5651361, 4005257, 4867026, 2486117, 8363592, 445076, 3065022, 2470215, 5900485, 7590979, 3349882, 5200431, 3057972, 6724734, 3240091, 997831, 1220101, 7844037, 158671, 8295106, 6903450, 8066345, 3673215, 5359187, 13711, 2713135, 4298774, 5861870, 4724668, 6334698, 7421267, 3038247, 3447637, 6052773, 3226425, 4831176, 7760573, 4040335, 3448130, 5589934, 6313523, 2407450, 5520740, 6048288, 1830153, 7914002, 2639436, 7225063, 6320971, 5669345, 4547965, 1338645, 7413169, 1634395, 1700576, 4805462, 1553175, 6165285, 1328396, 2206099, 941819, 7994038, 5590823, 1075033, 3434435, 2438149, 7692282, 3398958, 6651473, 1777430, 7819180, 1815186, 2350748, 8288918, 4631936, 7212944, 2164739, 1172934, 3584938, 4700552, 295601, 7595728, 562675, 2844703, 189128, 1226356, 4899457, 732566, 3085923, 584318, 4169326, 3767548, 4166076, 5525018, 2580373, 6915785, 1480231, 313635, 2573186, 738177, 5012846, 39937, 2020560, 4927010, 2705828, 7114708, 7692510, 4247922, 4959577, 2629715, 4000693, 4081237, 52495, 3027171, 6251222, 6976104, 3700607, 310757, 2623160, 6902771, 1959797, 8205784, 155434, 5970376, 4392998, 4643989, 5250138, 2679405, 1796640, 4070766, 8240079, 51932, 8107370, 2590278, 3717623, 5869213, 5644783, 82144, 314884, 1191553, 5197991, 5123768, 8225670, 2312289, 6792396, 6238096, 1551304, 3274429, 7848359, 6188786, 3421448, 3142002, 2206644, 3499929, 8221194, 6704037, 6972891, 4056245, 2956452, 1686606, 2365778, 293122, 2179322, 7856460, 5364732, 4667847, 1923688, 5541510, 7484421, 3411218, 4188021, 477158, 2604004, 1167262, 5440294, 7603024, 4079543, 2291001, 3258580, 5972381, 7954540, 4610642, 2362469, 1941290, 5850585, 5617088, 865026, 5654779, 2315770, 7604445, 2710816, 8359371, 1069176, 7228922, 4016109, 7942825, 1444950, 2603345, 7552341, 7723067, 514415, 2833112, 3397339, 6022387, 6203413, 4837012, 6795184, 6772070, 5079185, 1154796, 6447763, 7770173, 857536, 6620665, 4432573, 235734, 1275959, 7758334, 2354097, 5735000, 4144829, 673331, 6254630, 1789826, 1645073, 87801, 1090043, 5670865, 7731271, 2625075, 2298210, 2351307, 5781577, 5970308, 6857169, 3605540, 4621281, 790177, 3097384, 795320, 731733, 4252125, 951124, 273121, 2181985, 1492898, 2565087, 437193, 7249058, 4990302, 350865, 5926952, 1533006, 4467958] +NTT(c) * (NTT(t1) * 2^d): [[3314817, 596746, 2236845, 4320358, 7604367, 7976432, 3916389, 2236552, 6248460, 3877619, 1767245, 5945539, 5055636, 3838796, 6904197, 5831750, 6168901, 7391127, 4388985, 4702860, 4408375, 3697262, 7476205, 5945455, 6945772, 8278010, 8166787, 4105765, 8154406, 3975514, 53862, 353245, 2895983, 2555064, 6086528, 936711, 7386821, 4653466, 3417241, 616867, 3895074, 3520864, 5534820, 2152840, 794654, 683625, 7271327, 1343250, 3380932, 5103535, 7102496, 4734940, 1050312, 2169784, 4092207, 1124876, 6111581, 1323230, 6153324, 3545637, 3400696, 6310016, 8105719, 6760252, 2628973, 4086199, 4853619, 7321347, 1060753, 2674524, 1541090, 3495160, 6873431, 6665967, 3660042, 4365144, 4278637, 4394409, 4907067, 414143, 5873474, 901266, 1213835, 8312597, 1613064, 8045103, 5593747, 1016986, 6927470, 2772597, 1072575, 5944102, 2774093, 1582658, 6125322, 5706713, 7460625, 392394, 3726697, 2964100, 2829895, 1408537, 2949092, 586990, 7195519, 8065083, 5575927, 5847131, 7484167, 4517082, 1097894, 6859232, 2785823, 3593310, 5395697, 6388884, 4569855, 7608404, 3426444, 7084151, 7315390, 5340430, 3335821, 263453, 6948775, 5958615, 1885564, 7190521, 2982005, 2746506, 400801, 7938018, 574377, 3556138, 5651568, 3492631, 6087339, 2294484, 5878661, 2857943, 2831120, 6220881, 3050493, 3812856, 6620909, 2808448, 465642, 7389322, 6194883, 5695362, 6493284, 2268298, 6194900, 7555111, 5925433, 7588437, 3319329, 3708035, 6763186, 7537512, 1520476, 3324562, 7281720, 845073, 6807943, 7967996, 4397820, 8293468, 1592594, 6677016, 3646044, 960372, 6799307, 1148526, 4379848, 1462681, 7241143, 2374583, 984671, 5954071, 8039079, 6341933, 1253849, 957147, 6051793, 3239584, 6005644, 2419957, 2145173, 5860460, 5027549, 524053, 4525244, 4384757, 2873708, 723846, 971233, 5635195, 1609184, 1722503, 679866, 6409840, 121425, 832015, 993219, 8376378, 7480906, 8315799, 5789774, 5635064, 7572181, 1512892, 1061790, 3622943, 1144735, 427343, 5043123, 6235101, 7483901, 6164653, 2596942, 5999425, 6593425, 4067725, 5272449, 4636917, 8164317, 4033847, 514933, 5620568, 7410944, 6428376, 5275817, 1131619, 4348673, 2549374, 2808583, 4870665, 3564143, 7871664, 7569536, 1479044, 5283938, 3168350, 786574, 7122943, 7737065, 1540316, 6508049, 4814578, 1109545, 8370503, 3108998, 2800014, 1413020, 6312258], +[5182145, 7244479, 7921019, 4840346, 1711018, 8327959, 6245026, 7139116, 580782, 2069704, 8284840, 721654, 6165656, 7937040, 274881, 7232890, 4212555, 41356, 533457, 5857365, 2618340, 8120539, 4616927, 4783124, 4565939, 3320872, 1959672, 7962064, 1023881, 1070973, 5794298, 6760855, 5722669, 332688, 925474, 2548517, 5030327, 2559440, 2423873, 5601111, 2486786, 48894, 6601757, 6340392, 2042469, 3614481, 8149056, 4405001, 5066209, 3311060, 7637655, 895224, 3858915, 6879789, 2092799, 4493873, 5898498, 7136280, 635989, 3872540, 8259804, 5288324, 8253208, 6632528, 8069542, 261353, 4562165, 2152738, 8269772, 3398732, 1886199, 4519006, 3094767, 6342530, 6204079, 2781351, 4436334, 4093613, 7548625, 1055980, 3546199, 4981522, 4331583, 6915655, 8353049, 2129229, 2901545, 2074401, 1389881, 2372519, 6133134, 6085536, 294640, 3596079, 3929762, 603144, 1529108, 740371, 4608501, 2349494, 3631470, 3005800, 8311897, 5703404, 1660511, 2433074, 5785505, 6525331, 642308, 7360846, 1899371, 3535260, 7366874, 7577911, 6979281, 6175246, 2830160, 1247760, 3203511, 7281925, 4322488, 2423978, 5961567, 1199866, 8019091, 4323720, 3299771, 184359, 1811945, 5610225, 7621248, 7088253, 5169971, 6564300, 6673542, 264553, 2973430, 1790657, 1288870, 5616455, 4890838, 5938731, 80257, 3178877, 860240, 6035410, 99490, 5538015, 1322479, 3212582, 6131475, 8025647, 1371800, 1815048, 2613079, 3200481, 489410, 6405650, 2216066, 1648815, 8084676, 4623568, 1528500, 1637572, 5287216, 4645103, 3086980, 8089161, 326539, 4243337, 4431436, 7003625, 5533896, 6611911, 2394486, 675544, 7766914, 6901128, 5327870, 1967717, 1529112, 2862482, 6184537, 6674413, 3503761, 2250770, 4704752, 1138579, 6451706, 3748588, 3572310, 3130287, 7475042, 4547818, 1827818, 4675840, 6919517, 2179406, 1232925, 1929221, 2594058, 4744534, 3741373, 6161766, 6905183, 4190589, 1697710, 3390299, 6426195, 5105571, 323350, 7176277, 5763066, 1250553, 5925957, 8196997, 1679290, 7999841, 8201092, 7338377, 1551552, 7496085, 7603791, 3446968, 3013155, 2397430, 3721377, 1890333, 3965943, 2935264, 5315350, 6875393, 8190671, 3480129, 1831680, 967237, 6453635, 3737744, 6283567, 25581, 1965755, 5336498, 986619, 3718277, 104719, 4867558, 7651871, 1883118, 4185998, 1623041, 2575421, 746985, 1612899, 2568374, 764220, 5231109], +[2259421, 8151413, 6551666, 4469694, 8156602, 55145, 151240, 3397498, 1371737, 8271743, 6632402, 1842711, 3107184, 6285482, 532648, 3371701, 3372278, 5433598, 8106593, 5718198, 6420618, 4351938, 7280440, 3146902, 124323, 1951008, 1462906, 1125981, 1408816, 5922095, 5113882, 3990073, 5340586, 7541555, 97198, 6510716, 4697947, 5163485, 5862104, 1014765, 5350949, 1553702, 6264134, 470234, 3450035, 4740053, 2750857, 4283941, 5578456, 4853323, 5137722, 2035477, 2233744, 4318352, 4636599, 104257, 5415038, 4570554, 2406837, 2858534, 1400170, 4295160, 3971719, 8121166, 6645885, 1833495, 5894139, 7244052, 4442313, 7635073, 1861641, 6094112, 89718, 1029110, 7075793, 446332, 7627685, 5652329, 2199250, 4954982, 5043544, 627016, 4021100, 8153856, 8181083, 4723423, 3607111, 5094944, 2794229, 920200, 7086174, 3404157, 5375588, 5254480, 5556983, 7946402, 7140103, 4550273, 254880, 5772288, 2384607, 2110642, 4059313, 8149229, 919380, 4831475, 5931613, 2502643, 3300273, 126565, 987004, 7863804, 969282, 2538162, 2341482, 3905466, 407457, 5793674, 2937143, 1467441, 6468217, 1079700, 4531529, 3977582, 4578822, 4609697, 6270623, 553343, 7721772, 2438461, 1402867, 375920, 1794084, 3277388, 3961309, 8309341, 6010529, 1341568, 7396030, 3935980, 5057207, 1588330, 2868375, 3212459, 186808, 8053893, 257016, 3365684, 6857987, 7404802, 1193866, 8047868, 3411048, 201985, 4954142, 3570656, 3448396, 8169370, 5378263, 94096, 7301240, 8112012, 7621316, 5453599, 7301373, 6496684, 71112, 4108430, 2552413, 3104731, 7209755, 3896482, 5855924, 1477948, 1073093, 4994949, 813572, 5801639, 1374245, 5200073, 5631315, 3058528, 2659720, 912646, 5281680, 1232245, 1121365, 1772821, 5861656, 2830901, 7068577, 7495525, 2345333, 3770582, 7296575, 3711334, 5234788, 5493076, 5233174, 4428047, 6048535, 1341444, 8217660, 6789697, 4547573, 982490, 5755060, 2471749, 6500210, 963932, 6967022, 5675466, 5611613, 3596774, 7012711, 7458346, 5433262, 4573729, 5667514, 3417601, 7260879, 5371015, 100369, 7515181, 5703869, 503893, 2890623, 8081598, 8179672, 2782770, 3280157, 951832, 7456744, 7919557, 6071581, 7838340, 2088110, 325849, 3612448, 5211571, 127112, 5948558, 5701637, 6769063, 4823946, 2520141, 3484634, 6697904, 4265911, 8044621, 4555380, 4621214, 134445, 8294820, 7138853, 3402917], +[2249730, 5688495, 3970731, 4539352, 4877864, 4233459, 5574794, 6790550, 8198026, 6176567, 8204500, 3009297, 2207977, 7618297, 6297088, 6393610, 7404627, 7356719, 1909000, 4255598, 1278197, 7316686, 684668, 7957377, 5639737, 797041, 3516259, 4949968, 562886, 6636531, 8044302, 4904752, 821813, 1237028, 3568250, 7391795, 7859800, 7909606, 5306323, 3447313, 4955795, 4925856, 976333, 5001088, 2531540, 1393362, 6779236, 2625394, 745830, 264625, 5194552, 3389892, 868248, 1833744, 822103, 5694312, 5111055, 8133882, 2843453, 460797, 515060, 4298704, 2466549, 6746505, 6042758, 4531097, 2542831, 2032435, 3376335, 1261096, 7922122, 6369610, 6308199, 1942494, 6740405, 8137461, 1545011, 7459145, 2112835, 1025258, 5138672, 5759180, 7471206, 6883706, 3114970, 4253947, 7145501, 1032112, 6447510, 3796764, 7414086, 643794, 5845127, 7791945, 6106498, 2925982, 628780, 8359692, 3057046, 3306767, 2460783, 2939630, 7588200, 7891611, 2808966, 4528126, 1691959, 3784935, 7987081, 297169, 4900629, 8309409, 483326, 161981, 1793174, 5472555, 3613429, 1864603, 5357779, 2786187, 1545362, 2430756, 1749571, 5928418, 2647494, 7299896, 6449525, 4319133, 3397584, 8314380, 1032928, 988785, 1261506, 4430435, 2030625, 3823797, 4589715, 7748839, 1562631, 139779, 5828137, 5958260, 7745607, 4385236, 3767925, 1550930, 5945568, 6366839, 8239665, 2696198, 5209547, 6114071, 358739, 6818918, 6710050, 5940160, 1268972, 1120876, 4789881, 6927294, 2666563, 7786562, 5100041, 3458109, 1472573, 6147839, 3083047, 7483657, 5730993, 4213881, 6862763, 7550679, 6966981, 144727, 2075406, 4676950, 5921606, 2733999, 168118, 4809931, 74553, 1013456, 1174427, 2221478, 1551859, 1203379, 522485, 5471165, 6594993, 4756521, 2509422, 2071188, 2773204, 4960621, 7487613, 6871604, 1653240, 1871449, 3643226, 8149137, 1494568, 723589, 3475623, 4363710, 4119961, 7567915, 6101824, 2601528, 3181279, 4510279, 614598, 3871413, 7566217, 639452, 7735947, 6287302, 1108161, 7953040, 3563986, 6393422, 3530512, 6624882, 2199063, 1591904, 1543591, 2149681, 6315273, 4181576, 2700978, 6342385, 1970680, 3305523, 4887272, 8089068, 8165445, 5565866, 5354643, 2950817, 1955412, 5111576, 3776171, 1057189, 7813624, 95897, 2196791, 1526459, 509216, 2606690, 6901191, 4473117, 28060, 4811944, 2627949, 5571276, 339440, 1498729], +[2992496, 5164051, 3772062, 5850415, 5555455, 4829511, 135375, 8369322, 2351966, 571205, 5052899, 1880378, 481848, 4677682, 1838328, 7286240, 6120103, 6342160, 4313921, 4297241, 1753471, 2342148, 4715415, 7149090, 7136082, 3782757, 8029524, 934804, 3453456, 8225368, 7201349, 411988, 8160497, 1403894, 8289254, 7056043, 7549916, 5020706, 5219816, 2512664, 1526430, 938252, 1229303, 3083203, 617295, 1818352, 2897486, 3738620, 5949578, 2916655, 4293882, 3871189, 2367640, 1632441, 2324696, 5323952, 7369882, 7721533, 1732060, 2386084, 5207184, 70505, 6199431, 821749, 4719120, 6420661, 3386833, 347968, 5808054, 5529705, 4370879, 7489462, 1398770, 8029207, 5058890, 7665992, 5538495, 2330794, 2220620, 4894841, 6301612, 5646188, 2787410, 4391794, 3916704, 7300329, 5937786, 4242709, 3724525, 1246231, 2397233, 7205742, 4386723, 2590702, 3351097, 2095711, 6799194, 6732345, 5456767, 2116442, 8155, 6851820, 4214094, 3272942, 179735, 6955779, 3788244, 2129111, 4740376, 683645, 5070028, 7567194, 4374729, 101256, 1741035, 7088025, 4857899, 7361909, 4379157, 2088271, 2401183, 4768552, 1292172, 5602191, 5861498, 133896, 7784291, 2471241, 2647260, 4743171, 4347466, 7193057, 821238, 4728153, 3800759, 795153, 6958522, 6482305, 5899377, 3628799, 6717990, 3728408, 4229926, 3227701, 5333688, 2003606, 5042654, 7908645, 6991134, 292358, 7292010, 4501734, 8291727, 5315403, 507802, 3043570, 1001525, 6046141, 1409363, 3696650, 5540507, 2225929, 8108322, 8098675, 4409645, 3810668, 1006681, 6664283, 1462932, 4296194, 485526, 6087200, 5934534, 2333099, 7957177, 7651366, 1132074, 3669328, 140143, 93498, 3954061, 6203620, 4998891, 8285045, 8110254, 3916639, 7712328, 6124611, 3692747, 4851985, 3389660, 486387, 5275366, 2769247, 834682, 7215526, 1877614, 4993534, 2784832, 7385189, 7206252, 4778063, 2778020, 495593, 5635645, 5068966, 6166675, 6040900, 3146278, 6108975, 3812520, 156888, 57952, 3891124, 1034763, 6388229, 2456880, 6684454, 835584, 6094092, 6084329, 3419689, 3062382, 6218823, 6859606, 3931252, 2520435, 6766663, 1771895, 7920514, 77982, 6197366, 3492950, 875123, 726252, 2843365, 1939254, 7857637, 8057425, 58538, 8033616, 2255091, 4984134, 7177336, 1676489, 747084, 2411318, 7595313, 5901959, 5782702, 4424314, 318448, 8036603, 2621965, 7766183, 6024172], +[1170962, 7973511, 2512831, 5762685, 580032, 3515892, 2643414, 2252869, 7795914, 2976209, 5313339, 4560524, 549668, 2905639, 5342251, 664060, 5627861, 1664970, 346251, 1741610, 5807994, 2890013, 3752526, 2101207, 1719880, 7432384, 3010348, 2213541, 7289148, 1037863, 8225170, 1886673, 1146221, 3435663, 4358669, 892551, 2247327, 8069651, 1326679, 6118942, 2442856, 4975949, 6092307, 40538, 1564358, 8224584, 4185692, 5672239, 6821751, 2862712, 6980912, 3843114, 7989883, 2439913, 3322339, 3361581, 7910648, 5672452, 8199685, 559491, 3881220, 5350025, 6046405, 1078293, 3136035, 4807838, 5375795, 6372943, 5495442, 4288666, 8287777, 4968200, 3475552, 211414, 933167, 2562943, 8307065, 634953, 2837448, 6032324, 6059725, 302619, 371549, 759974, 6505144, 2465783, 7908040, 4850461, 7760143, 5327696, 2783796, 1019144, 4936167, 628269, 2789879, 3458532, 2158093, 7938372, 8169885, 1807334, 902625, 3849035, 5875551, 7799674, 5066733, 509629, 3923401, 2996437, 2692840, 5033299, 6595372, 7555780, 4194952, 4051155, 3965318, 555926, 7462042, 5282356, 85641, 1752871, 4730343, 4871035, 3472137, 508558, 7661375, 4365784, 5067179, 4162227, 8303119, 5913116, 3410516, 6490720, 1473330, 6668530, 1281811, 6314371, 7335438, 7116054, 6067383, 6156068, 7324117, 4270861, 6128117, 2415458, 7398887, 1354167, 3841396, 3746890, 4949, 5055129, 1860145, 7537674, 1219654, 6904164, 5645496, 8373922, 6265430, 1190024, 3186753, 1308799, 3253610, 2317204, 1376668, 6588730, 362807, 7193017, 3807296, 3997399, 3497002, 7356368, 7468089, 5219095, 3874960, 6475936, 6713219, 1171759, 2598613, 2791820, 5866490, 951197, 5369665, 6315307, 5827222, 2721059, 1216367, 1249010, 4404513, 6673009, 5740858, 7977829, 1074271, 3580740, 3049408, 5574822, 858646, 3844369, 2939675, 4571494, 8017150, 7932937, 4856383, 2309194, 7500594, 7822064, 3223465, 3655578, 6268745, 4578210, 8208120, 4081631, 8158826, 7970842, 2165745, 5082179, 2558960, 1801414, 832326, 112550, 1752157, 752419, 585300, 1743031, 5952237, 94983, 6238499, 4986726, 3289590, 4911352, 4429505, 407994, 7492502, 6520026, 2213619, 4513026, 6306793, 1767213, 5397406, 8122633, 3702908, 1693338, 7518707, 7806122, 235913, 5624602, 1429157, 5355818, 104960, 2617326, 3083201, 3919608, 7554598, 3863280, 7290663, 517898, 2887302, 4455128], +[3438318, 8172984, 7249569, 7947997, 4068440, 6137720, 877059, 5182893, 7262977, 5209739, 6919789, 6999718, 2126322, 6902657, 1382279, 6772064, 2548347, 114873, 6715793, 444289, 5520805, 466005, 3727904, 6737970, 1658045, 4993563, 4934391, 7945929, 4818244, 1675707, 1622442, 7973918, 4297721, 3516160, 8306654, 7102274, 3136576, 3828631, 1380370, 430778, 2568148, 8237221, 3176508, 5093691, 4009935, 2461298, 2915557, 7990260, 5111853, 2505676, 125106, 8210068, 3098242, 7967788, 6642839, 5853156, 4174481, 2834652, 2945101, 3735061, 6074917, 1575598, 3989088, 2887490, 4351108, 8066067, 6263656, 2815038, 4182255, 515454, 1110208, 7691910, 6681646, 1858592, 977596, 1979101, 71900, 383177, 3230846, 1435310, 271850, 3983499, 7407156, 6628519, 1797478, 4401807, 3037168, 924034, 8098157, 625748, 6796711, 907214, 1595619, 4420794, 6172659, 1734951, 8174406, 4640354, 1843097, 7756384, 3407291, 4146305, 2969847, 6208688, 1397024, 1986288, 875439, 3578204, 4923129, 1996287, 6499770, 2769806, 2191382, 1191961, 8008455, 3019159, 3622288, 4933165, 3480441, 162241, 7059499, 4075750, 1442988, 1104294, 2657305, 1182610, 8006428, 4957117, 7228493, 5816969, 5108671, 7392225, 312620, 6338213, 4272752, 1508307, 2243644, 1707552, 100918, 1186755, 2683573, 6276376, 2785831, 3655033, 6388643, 1519864, 201236, 7138531, 5861678, 3039340, 7655526, 5403659, 6529047, 4750682, 4860635, 7504842, 749112, 5727005, 3817919, 6440536, 610493, 4619646, 632950, 3431088, 5695278, 7875447, 1311807, 1930757, 1650718, 2781294, 3168879, 4244934, 2921392, 3792139, 85272, 2420794, 5329122, 3591161, 3636327, 3205967, 3484555, 1991783, 6102748, 6717329, 7179026, 543518, 757473, 7308682, 8328323, 5353167, 760982, 4131380, 2897897, 4917311, 6328141, 8115426, 4925068, 516253, 7224575, 7771874, 849942, 562221, 2565053, 278013, 2591760, 1496154, 67109, 7842838, 5820064, 2823641, 4813834, 1506700, 8212410, 6228424, 1978732, 1343523, 3570700, 7530926, 1335617, 4960963, 488810, 2544601, 3941325, 3392883, 6977328, 853188, 3554256, 5307564, 4456334, 5531323, 6364013, 4047535, 2175606, 7830054, 2961394, 2505477, 7046284, 6007665, 454427, 3206051, 5224227, 2550107, 8345148, 7450149, 1934101, 845507, 6550355, 2554690, 1124346, 7547900, 5115005, 5973457, 4132071, 7184456, 1413371, 4778558], +[8194124, 907806, 6384230, 7764429, 7773449, 21729, 7963670, 3619340, 1431176, 1977709, 1864711, 199723, 3155361, 956781, 3479289, 7103935, 243615, 7689822, 1313508, 3772945, 7186321, 2264433, 6071321, 5956389, 6997144, 6632314, 6157705, 3587512, 1455980, 7099507, 2939181, 3261584, 1385245, 3877250, 1406309, 2723454, 3984339, 747903, 1171683, 8064044, 4988614, 6793770, 2053923, 2479500, 5208682, 451342, 6407788, 2516922, 5419490, 847204, 5547799, 226813, 3518021, 3058361, 5793076, 5389076, 6355158, 3754998, 186419, 5305869, 6276460, 6976253, 491916, 2445349, 7146487, 1151772, 3929210, 4968034, 4605750, 7680261, 725187, 7803558, 6694200, 5006339, 2510060, 3883981, 7212806, 418494, 1579405, 5735102, 5539203, 3363044, 7303183, 7658371, 7217800, 7661729, 4330591, 7230983, 6547656, 783336, 2028951, 6426456, 253883, 3455067, 1926425, 5192750, 7527077, 5917630, 4204359, 3469827, 6041722, 4974801, 6730281, 4334473, 7408430, 7408461, 674351, 5220825, 366179, 6868126, 2782174, 5057156, 1592273, 3591829, 1572129, 1373589, 95210, 3013646, 2703984, 4808318, 1965222, 2032162, 1472659, 6304593, 6572652, 1864989, 5108703, 7043524, 1734229, 7999989, 7728894, 8149171, 1846795, 7216118, 899719, 8185620, 8224289, 770904, 1600810, 2259362, 5868711, 816557, 3350543, 5930585, 2192439, 6579924, 3091705, 1222199, 7425912, 2057197, 5419193, 2831270, 3206884, 6340016, 5089067, 3469439, 3418827, 7428, 487441, 7771743, 5656485, 50919, 7794809, 6885286, 5328831, 1824902, 5424716, 6592628, 1622147, 3860922, 310671, 3625798, 1068807, 149967, 6203058, 7725588, 8277505, 4375371, 4637971, 7910949, 6428904, 7671128, 1340005, 7528774, 8325628, 3551206, 6519224, 4374968, 235446, 244412, 310387, 7590444, 5035267, 2540454, 13268, 5963789, 7839642, 2086358, 5564280, 1539952, 6864036, 6829238, 4635500, 8132238, 3035612, 7035235, 3504748, 611161, 5344039, 3485709, 4300630, 2704160, 2457501, 5900820, 4883678, 1330524, 3543227, 4953761, 7767166, 3751379, 4688901, 8078310, 558737, 395737, 2050240, 7769934, 5025237, 4010289, 6406586, 5920048, 459679, 5275965, 7367126, 2693321, 788490, 6793322, 1535884, 3374420, 704903, 6197493, 2971041, 1304290, 696120, 3886010, 3309079, 7068662, 2282261, 2319063, 4760282, 7303847, 6241841, 1537763, 8223218, 4549252, 4412909, 6733912]] +wPrimeApprox: [[5883707, 2589880, 1995189, 5932687, 6560885, 1918345, 3261487, 5929740, 6262902, 510166, 5619233, 4457849, 5833959, 7248443, 8283639, 5272010, 6159614, 4480943, 2516644, 3936440, 5637212, 4501054, 5503108, 2738628, 8035335, 1353405, 768130, 2132487, 7202819, 6137463, 4805307, 2305894, 7088975, 4346302, 6473617, 6570978, 3143444, 2107250, 3015317, 2016816, 3475854, 732250, 2221151, 4278018, 1712500, 1099395, 6376066, 7483656, 4907220, 6342508, 7654699, 4921278, 643089, 7516240, 1828542, 7384630, 7277891, 4199726, 13925, 4684828, 7122366, 2432218, 1329641, 3455841, 713857, 7629265, 3588657, 3787644, 2606893, 6003360, 944002, 2185836, 3441398, 8072092, 2029191, 6225254, 646895, 6543179, 4271230, 1578684, 2484572, 5654362, 3275546, 3997030, 1988589, 5576307, 5678338, 293247, 3457009, 3717231, 6320113, 7020818, 4248812, 4215177, 3921802, 6757021, 5716201, 2445237, 4113459, 7114162, 8009165, 3279802, 487977, 6197433, 7357078, 2892656, 3004424, 1664004, 4567727, 2398976, 6457913, 8181209, 8330177, 53223, 570684, 5239534, 2989417, 7039624, 3692155, 2442313, 5533795, 3579630, 113224, 2587793, 1482241, 6848836, 7831391, 5869474, 4731387, 5651347, 7268875, 5193209, 2505916, 6110335, 6239464, 1328114, 2550859, 3764614, 4192023, 2144676, 2629132, 5633312, 4892140, 703095, 4914160, 2714139, 7823080, 7657897, 6685363, 5704221, 1409218, 5724412, 1249485, 2785550, 5299072, 6604626, 1818458, 1857851, 734827, 6877965, 7296355, 6080553, 767569, 1758336, 3747252, 142000, 1936572, 1150296, 6540115, 1547881, 6010950, 5717066, 7387839, 3741066, 5580776, 1604219, 3827212, 1315646, 2288586, 5802063, 1376075, 4669831, 1733919, 8243842, 1180346, 3469011, 6155214, 7532909, 597781, 6666026, 7955203, 6839660, 7398578, 7423939, 7112793, 4329144, 5878933, 7571244, 5312775, 4605751, 3677050, 3937609, 3699149, 2032037, 5728553, 4249221, 5530773, 3767901, 7442325, 7524511, 802978, 6053660, 4967698, 7031152, 5723433, 8154594, 3391469, 3438332, 3935658, 2228393, 6395759, 806192, 2465254, 6246913, 7798446, 7336079, 2284573, 6363890, 824605, 3470676, 5296041, 3119374, 3118825, 2871505, 4712776, 1997490, 1440506, 1174905, 3326193, 2376493, 6067684, 1130451, 4259856, 6861916, 153053, 6019445, 3046782, 7653546, 4527502, 1598896, 2297435, 7842700, 7946176, 4414237, 3990968, 2187127], +[1527072, 7448419, 8036574, 2083952, 3676667, 6581566, 2526090, 3029708, 243341, 2345402, 39043, 4016585, 2603408, 7577959, 5979283, 7000309, 2441099, 4123927, 5724727, 4789201, 7103773, 8018870, 6216822, 7190020, 3622625, 1216934, 3994608, 4415048, 6098900, 4264955, 6565644, 5365246, 7904970, 7650410, 2164688, 7917936, 7206784, 8220298, 2205816, 2015120, 379097, 6266318, 6592140, 8327952, 4755956, 5751213, 7063595, 3604343, 1821808, 2305280, 2871212, 6241632, 6787982, 6440785, 3667293, 6939121, 8363835, 4826753, 480016, 4133597, 3885507, 1192953, 4669089, 5684760, 1971216, 6995643, 3862194, 2805735, 489168, 196850, 166096, 6263138, 3951736, 6249534, 7865500, 7437912, 8243611, 3894527, 6769593, 5139880, 3125431, 2588976, 4392079, 4537545, 7527359, 4362733, 5687472, 2339130, 5582435, 3430195, 4431767, 3477444, 2051148, 2174040, 7634828, 267812, 8161455, 4048436, 1078230, 3073175, 183935, 4663835, 7770089, 6650435, 4189287, 7048982, 3192397, 2734084, 6772672, 8049467, 3750660, 4696597, 1706457, 47531, 173804, 4011659, 354863, 2345995, 6276691, 5155891, 7190366, 2688468, 4805825, 3965055, 4912918, 5007160, 4596230, 4363409, 7297828, 7926308, 1692782, 316123, 5941033, 7654861, 6483745, 6109334, 6711500, 7375729, 1743965, 4607529, 3483046, 2221060, 5411722, 1713282, 6880742, 1452454, 1174850, 7383784, 2281715, 5918377, 8251496, 1385500, 1268853, 4719894, 7362915, 7354042, 3856366, 7675587, 3498524, 2982683, 3357721, 2881239, 2728248, 3486803, 3846902, 8352573, 2662833, 8197064, 4836188, 7290784, 4652448, 1823689, 4351898, 8297014, 3125234, 1721797, 2695929, 393339, 7340759, 2504095, 3150299, 4868912, 2276458, 1629987, 7547167, 8094512, 7417026, 1195462, 3925589, 8149734, 7185385, 4835009, 3855299, 3297964, 2104430, 1599427, 4713314, 5373480, 1560134, 146054, 5161360, 8334447, 1903579, 1545303, 3074720, 5595108, 5220574, 133227, 7772264, 1798162, 7070858, 995230, 2551104, 7400932, 3802144, 154541, 949484, 7013813, 7021856, 4814425, 5696659, 3165894, 838331, 2398229, 1321524, 3038785, 221523, 4991671, 5339867, 4119464, 3561621, 3816692, 1031543, 1637041, 8031679, 1140304, 1937112, 459213, 75931, 1239426, 7927879, 4460244, 57385, 7914573, 1146915, 4294315, 4024703, 8244514, 7972301, 1205939, 6892661, 1780844, 3270514, 1244592, 7109116, 7291387], +[7921525, 1656911, 4127995, 6279424, 2437830, 1833311, 6369033, 654036, 6444, 5407826, 6343197, 1525171, 8029546, 3675897, 3676987, 7773281, 6955552, 4434853, 301996, 6164759, 7512307, 3615208, 8097645, 4568619, 46995, 7436493, 5606921, 5959303, 6069875, 329200, 4803017, 7863190, 3034834, 6723708, 4876500, 2566339, 6397822, 524033, 4057510, 5096223, 5588376, 2037387, 220431, 7913511, 6642390, 2211649, 5955924, 716480, 7144953, 2577189, 2774273, 4568627, 983396, 5941938, 7558571, 263036, 5506744, 6498081, 3677033, 1340669, 332706, 4078999, 6304686, 7255135, 4601881, 6383429, 3551400, 6369324, 4909157, 2431258, 6969858, 1082392, 4921565, 7109987, 1585812, 1438872, 1712971, 3562076, 6771002, 2521004, 2083387, 5494059, 4134853, 6225516, 3701876, 2791285, 3205167, 5870863, 6193771, 8014026, 3980526, 7591137, 4479695, 2211472, 4883564, 1711595, 5648068, 3550248, 7721194, 3986841, 1572646, 4668547, 66235, 4444445, 2845581, 3397855, 6618717, 2927322, 5714430, 3477499, 4307453, 4928455, 645263, 2168136, 427701, 2794986, 982559, 7794166, 7298447, 756655, 7646305, 2981178, 2991372, 2797765, 1058076, 6820869, 2366759, 7600432, 2613113, 2327877, 3600588, 2697582, 6302080, 5744480, 5010971, 5749772, 4518297, 8243123, 4226621, 193706, 5710824, 5182661, 6652459, 4145969, 4959623, 2842833, 6989095, 4243631, 7065719, 4909830, 5664689, 4479894, 4484773, 1426693, 7001671, 1372367, 1137062, 4988965, 3393035, 8243990, 2195369, 4998159, 5677392, 1358595, 2588755, 2392960, 1577459, 4234119, 2695562, 465037, 1647386, 2635437, 5551112, 3583824, 1483346, 3713492, 6619612, 7955166, 2425151, 6047758, 7875813, 1720161, 1699835, 5955966, 3367383, 5093539, 3217278, 2583402, 951220, 7822267, 1854209, 5685611, 451200, 1040025, 7612328, 3494146, 1199171, 4368201, 868712, 879347, 2564907, 8052317, 4035406, 6564768, 2055075, 3149318, 2557512, 4473791, 725630, 3819121, 2562036, 6482205, 5027941, 4122403, 3184535, 5911552, 2369257, 7376966, 8203916, 8229326, 3384035, 6411416, 7664952, 1869363, 6422284, 2711548, 7487801, 6929789, 6167695, 8274611, 3342403, 3517242, 4183942, 5485819, 3900058, 5744525, 3816757, 6699191, 6687037, 5511396, 6267249, 4684788, 2252946, 5352815, 8317336, 7619213, 2893874, 7487944, 6468078, 735158, 3392491, 3489534, 3259393, 3624150, 4193376, 6835785], +[6364966, 1905480, 1239564, 5771930, 7217032, 7401658, 132589, 6037390, 6715658, 3568175, 3664367, 4627772, 6736742, 7274235, 79576, 3076676, 2368190, 7411001, 3430490, 2809932, 3405279, 6539981, 3185369, 2067268, 6467966, 1202315, 3653278, 3440856, 4285032, 7346247, 6814717, 5366024, 2699207, 7392103, 183400, 4279647, 2878621, 3258505, 4402703, 212743, 3242642, 5234546, 5035789, 1213079, 7176302, 4428972, 2516031, 90702, 1728568, 5607602, 7429269, 2284753, 7701213, 2718573, 1266861, 6652250, 7644259, 2842395, 2857542, 7562598, 4858471, 5950260, 7619326, 6954122, 1743816, 5649644, 7769688, 7949888, 7550544, 2157621, 2364969, 3568327, 2242877, 6734253, 1611552, 3767791, 2970247, 7390893, 4127279, 5136196, 5074626, 5438239, 1729071, 1313629, 6536562, 290232, 1466069, 7606787, 6987107, 2821545, 4116736, 6554039, 7588946, 2590195, 6023193, 3752969, 1511572, 4556614, 2563301, 1066351, 954365, 1014260, 7036080, 6747192, 7643079, 3970781, 4398730, 2512902, 8205840, 6762339, 2596945, 1836661, 1350042, 6554737, 6386789, 2521002, 3356336, 5746546, 5139523, 4458638, 3040025, 2295196, 6924777, 1962481, 7102135, 1043195, 3579659, 2979726, 82632, 852248, 3124494, 5899819, 6005951, 3878503, 2146754, 6617372, 6123100, 376157, 8281767, 8227419, 5592560, 729584, 6921574, 7816447, 7692166, 4280687, 3280614, 5988461, 2537213, 5410248, 1735871, 1095988, 2164003, 3757207, 8177583, 5724171, 6956657, 5648921, 3783231, 5961542, 8173975, 1758408, 1740386, 7025195, 3934803, 6304442, 7989459, 1339612, 478341, 4281595, 4880675, 3511434, 6850697, 7583950, 3727549, 7588607, 8190838, 2681068, 1941140, 1206458, 6430874, 4142552, 2373822, 3830389, 1260832, 1954751, 7740527, 2704280, 4931886, 4302761, 625278, 4465963, 7032224, 2813779, 5895008, 740340, 6646225, 5595053, 573763, 4537589, 1599353, 7422091, 3880833, 7374423, 714891, 3568024, 2986377, 3377583, 8121748, 2123491, 3374285, 4416390, 1474358, 4426259, 5774046, 4813975, 1087417, 4370548, 6608653, 1512758, 675093, 3867837, 4683201, 4587474, 219494, 304999, 554630, 1846979, 1157552, 7287573, 1078877, 6494471, 939735, 33726, 7836548, 949227, 4398182, 1353892, 2498835, 5428348, 990713, 5050324, 3873434, 5478434, 3134442, 7369444, 17953, 418163, 5329960, 1723033, 929838, 6770559, 5087868, 4542938, 6527878, 601132], +[1649559, 6283826, 711182, 4283678, 6999437, 7266209, 3775470, 2947887, 2258754, 2942988, 4604490, 7254901, 2564245, 4797647, 5487708, 3485918, 2207375, 3900213, 2270636, 8137730, 7863921, 3094451, 2931856, 1687438, 5197024, 1092362, 5179047, 6802943, 7833732, 5929719, 5679125, 1193846, 2129687, 2776789, 4139123, 320763, 6712705, 6332099, 4512272, 485084, 2558544, 848780, 2522197, 8020598, 5308843, 4759408, 6266675, 4649503, 2107441, 7861548, 2187736, 5900325, 7473748, 6165247, 7523375, 8331994, 7713023, 6718997, 3479232, 4642326, 7085144, 5940877, 6748263, 4697782, 3644399, 3679658, 4164280, 2957871, 8132226, 6770820, 7923220, 5079550, 7586497, 3080787, 6738463, 5958865, 6908394, 5997134, 6144147, 739542, 2365157, 4066819, 5053644, 7806591, 5413108, 4996036, 7215369, 1096505, 4467060, 7012975, 2664538, 3992759, 7556290, 5389779, 7434033, 2796515, 809732, 8063252, 2268602, 2684595, 7026863, 1072123, 6655872, 3439607, 6065867, 6800928, 6199865, 6126766, 4051421, 6988631, 973409, 3085291, 6450333, 6448952, 284022, 5517385, 629925, 7443927, 4894777, 473082, 5553976, 7945635, 7370277, 3847991, 7445351, 535955, 6590412, 587862, 4163205, 6844006, 7974417, 1359446, 3691831, 5948335, 7159843, 6151797, 6247024, 8262708, 1199834, 7963018, 1265295, 5082482, 634850, 1982287, 1855610, 7501745, 4479333, 2268273, 3974964, 11694, 7208751, 44400, 2504224, 3022805, 8285488, 83477, 4334981, 1961151, 2756643, 5200394, 5719413, 3871391, 8343868, 2878807, 4107117, 7579923, 5298503, 844509, 5373280, 2351769, 5418004, 2121306, 5204993, 4666293, 7959637, 343257, 7415602, 8191735, 3131276, 4343825, 4244605, 528113, 5146620, 3844219, 6510419, 1918352, 407853, 6412507, 3094160, 5820962, 3186842, 7355543, 5249179, 4811534, 8053767, 6066391, 7736118, 4789223, 2883244, 4322809, 5005404, 6798534, 6589944, 2033719, 5378751, 3949013, 3702809, 4381733, 38764, 6045692, 5673755, 2277432, 68193, 518650, 3660962, 6727774, 3251320, 4339676, 4792334, 6401434, 2980710, 6423744, 8081771, 5568765, 1635450, 3298451, 3246142, 2477734, 5778093, 4332260, 4496043, 5268103, 894552, 4818780, 1975834, 6858349, 2919442, 657572, 3760968, 730002, 3532307, 1558687, 6634287, 4213107, 3102460, 8365951, 1549733, 7424808, 4896715, 1719877, 478410, 4156900, 2061212, 1896041, 295351, 5683705], +[309581, 5898280, 3973974, 5522149, 6825963, 1138814, 5481109, 102849, 1649704, 5607249, 3175112, 852939, 251811, 6507694, 3158664, 6927536, 4430909, 7077865, 5067958, 5348558, 3782903, 2031547, 6455760, 1066281, 7464702, 1057464, 3398574, 2951688, 7527847, 4004276, 1419891, 6376194, 7980174, 6143087, 3580203, 4841613, 3582524, 5873036, 5619068, 853093, 1667769, 3466078, 3775975, 6542374, 2872999, 5474299, 6956761, 3842051, 1983957, 4797629, 5233947, 4596275, 795335, 156997, 6498163, 387344, 6394521, 4757058, 1178955, 1552294, 2830212, 873760, 987674, 1054739, 4581882, 1318307, 8240484, 805199, 2728660, 920505, 6019885, 4962570, 2332356, 5459070, 8140097, 8142736, 2454247, 2376948, 2861478, 798806, 5842752, 786833, 6548836, 5955856, 3991634, 3618112, 632508, 5276602, 7953635, 5887676, 7345733, 5084582, 2088256, 3271303, 3033926, 4106048, 6891281, 5615695, 3028368, 1969421, 3589442, 4803296, 3579368, 6350219, 2914904, 7285782, 7772399, 1017088, 2859707, 59507, 7381697, 2348038, 7141504, 6505701, 7677172, 7102667, 4790707, 739793, 3537826, 1442161, 3290057, 797379, 2890198, 5505122, 255114, 737545, 7093138, 228434, 84031, 5501692, 7454159, 5601362, 4690103, 1042225, 6320479, 2129778, 6626365, 7541935, 105411, 7236114, 6950664, 5813567, 6357897, 6420405, 715921, 184661, 2759623, 2900331, 980513, 2296052, 25902, 6747702, 6305423, 4420854, 5354727, 7432923, 199181, 169382, 8307997, 1134556, 432487, 6668275, 4083722, 4615697, 6257231, 6040215, 3301448, 1166143, 7751902, 4620317, 5601182, 7730508, 7523238, 4897826, 3506331, 2854830, 2081947, 6048643, 7282097, 3000042, 1676827, 5707723, 2877674, 552442, 6693042, 1658012, 6762642, 5835579, 5218686, 4397871, 3536841, 5187132, 3153717, 6537207, 8013997, 7022787, 2438597, 1700806, 97651, 3235265, 3843268, 1456901, 5503061, 4857426, 4028942, 7022331, 5909800, 2340975, 6543859, 564992, 118295, 3752128, 1927252, 5951456, 5455288, 6903213, 1213449, 2638630, 882694, 7299575, 4691100, 4788034, 6837241, 3961356, 4838814, 909466, 1790727, 5484749, 1776211, 6652243, 2282192, 6208326, 3661450, 6516601, 2121121, 7249292, 355576, 63074, 2571015, 3011092, 7071701, 6346279, 1179578, 5144306, 6530947, 5379162, 5417431, 1247094, 4071786, 4968094, 4342021, 3111863, 4421256, 7123930, 4797572, 26921], +[5882301, 1235740, 690560, 1922041, 152552, 849418, 2335484, 6199993, 971124, 779129, 4645037, 5113975, 8105905, 3110608, 5667568, 2659596, 5170930, 5366552, 4017128, 4935531, 5613899, 4993306, 481568, 2956664, 6773999, 8324519, 5454077, 5066007, 1216409, 4649845, 5032286, 4845131, 5196542, 5166610, 1318542, 954037, 3353682, 7314730, 2849637, 7737796, 4965161, 2235478, 18977, 5481917, 3171564, 6379103, 3269995, 3109062, 1966589, 4350805, 556313, 5220937, 7963858, 7563271, 1664700, 6077178, 532400, 5272964, 83480, 3616375, 6645863, 6125146, 6329894, 4321470, 291371, 8209917, 4776655, 5470375, 4704439, 5615196, 7370025, 33692, 2264410, 4925967, 3761196, 7929520, 2557964, 967183, 6593703, 293142, 1447695, 5519044, 4309687, 5640452, 7950657, 4013527, 2576434, 5885681, 1205675, 511598, 6884495, 6016493, 5114754, 263619, 1735926, 1111033, 659818, 5348935, 2638043, 7353084, 5888855, 6860879, 1494219, 2806118, 3235950, 5949771, 5720688, 5943045, 2127150, 3479786, 7838850, 4269571, 4598481, 6978979, 5910196, 1083995, 6238905, 29449, 7910848, 428598, 1196753, 1839932, 4297159, 2812983, 4463265, 406806, 3953979, 613572, 7270002, 3964376, 5608604, 5855209, 5945419, 4587422, 5157450, 1170509, 7070346, 6848357, 2276703, 7122508, 6582489, 3168863, 6408012, 4505650, 2903287, 1196366, 3282893, 1343853, 4283139, 4637379, 1445526, 1868875, 3193102, 2131251, 7005782, 5365490, 4703250, 1837862, 1166749, 3865835, 6699986, 5319383, 3416183, 7204176, 6473280, 5189079, 5600440, 4305195, 4700729, 8189775, 6532154, 777302, 233906, 4472662, 4545320, 490931, 682613, 1874081, 2987854, 2459634, 3318986, 6464960, 950353, 4092911, 6540502, 6712205, 1280195, 190629, 5789025, 6005560, 3045350, 1790551, 6889254, 7086260, 717440, 5569516, 4877312, 2732427, 8243669, 7553809, 501366, 7825530, 2889593, 7890253, 2271069, 61849, 940387, 6752745, 1237054, 5049556, 475551, 2005320, 3894817, 6967196, 3616270, 1348045, 3825026, 2210031, 2978919, 3162026, 1193511, 1911322, 2575608, 6180523, 6207003, 980705, 6766108, 1087154, 6959971, 395459, 6127183, 6048810, 7100719, 1586515, 3914437, 5758589, 5533136, 4545110, 5459505, 6843713, 3961056, 6861795, 5523141, 7723178, 4239685, 7104949, 2988143, 8369064, 1126491, 338326, 101106, 5632349, 259318, 2314769, 5464062, 7895497], +[1916637, 498467, 4237328, 2018036, 2441431, 6914979, 4809593, 3069521, 3899548, 8216592, 4411371, 2239065, 3976238, 3209777, 5461697, 7660643, 7945796, 7757152, 3756075, 5181598, 5204545, 7349978, 3346429, 530066, 2209358, 3034816, 5668618, 2238646, 2701377, 1042072, 7809716, 1891128, 2380133, 5946813, 1150790, 1581420, 1244846, 3802816, 4825735, 7227427, 7076756, 1654056, 4206464, 893235, 4212115, 5217792, 7856593, 6435066, 1171694, 1599371, 8216430, 259048, 5559815, 5475367, 487445, 7866522, 1987688, 2877776, 6804671, 2189297, 4352053, 3169268, 586785, 830084, 6199032, 4224327, 3018190, 1888540, 2381545, 4138725, 4912191, 878191, 2308366, 1300896, 3351022, 6417590, 7878147, 1927673, 650280, 476060, 7071018, 3667646, 5996400, 2600851, 6933469, 1509836, 3796881, 1816497, 997371, 7365544, 5134805, 7757629, 2267906, 1042761, 6792975, 5016208, 8165430, 1662196, 2749063, 1056713, 729312, 7027115, 8048253, 6684789, 5617587, 6668700, 5965932, 7934995, 4975450, 7667343, 1785168, 7379313, 3337724, 918495, 428458, 1606270, 3506341, 2834675, 5045787, 4984592, 6204567, 1985719, 3959413, 897484, 3919506, 3695769, 6977830, 2028369, 5376111, 5183438, 5517126, 4676154, 5356219, 1243315, 473270, 3045631, 6355064, 4951040, 5698279, 1544004, 392957, 5681980, 2194558, 4908179, 2083589, 5370038, 222052, 1609716, 5885429, 3522328, 7856896, 7890386, 7199113, 6951285, 519467, 2182082, 2561992, 844309, 959994, 596456, 5542789, 7515668, 3167297, 5260690, 8102336, 6420494, 3260456, 4168120, 232353, 2091024, 1187945, 1561895, 5808296, 6536865, 7348700, 8048805, 6760741, 3938239, 1194437, 730972, 3091198, 2537045, 3978413, 2381551, 2265393, 7813190, 6385920, 1479011, 2018425, 5354186, 3770970, 7375592, 370622, 3342537, 1649130, 5243122, 1087426, 1924824, 3795996, 4318505, 1045656, 3718398, 3230695, 2116203, 2287643, 7886655, 7978348, 3946539, 6389468, 3473910, 4139558, 7072759, 7575235, 7463165, 739301, 5475874, 6433352, 7573555, 7554691, 2684940, 5737098, 8367339, 5152571, 802403, 7510792, 2708566, 4460797, 6292995, 52384, 6162159, 1473800, 1501745, 776418, 3215203, 3566041, 992663, 5730667, 1354712, 2809384, 4023403, 7573509, 7200358, 6675720, 5712589, 144542, 4969589, 7480885, 5466485, 3287988, 2201861, 6116874, 6181858, 3620400, 5869112, 6482831, 72247]] +w1Prime: [[11, 5, 4, 11, 13, 4, 6, 11, 12, 1, 11, 9, 11, 14, 0, 10, 12, 9, 5, 8, 11, 9, 10, 5, 15, 3, 1, 4, 14, 12, 9, 4, 14, 8, 12, 13, 6, 4, 6, 4, 7, 1, 4, 8, 3, 2, 12, 14, 9, 12, 15, 9, 1, 14, 3, 14, 14, 8, 0, 9, 14, 5, 3, 7, 1, 15, 7, 7, 5, 11, 2, 4, 7, 15, 4, 12, 1, 12, 8, 3, 5, 11, 6, 8, 4, 11, 11, 1, 7, 7, 12, 13, 8, 8, 7, 13, 11, 5, 8, 14, 15, 6, 1, 12, 14, 6, 6, 3, 9, 5, 12, 0, 0, 0, 1, 10, 6, 13, 7, 5, 11, 7, 0, 5, 3, 13, 15, 11, 9, 11, 14, 10, 5, 12, 12, 3, 5, 7, 8, 4, 5, 11, 9, 1, 9, 5, 15, 15, 13, 11, 3, 11, 2, 5, 10, 13, 3, 4, 1, 13, 14, 12, 1, 3, 7, 0, 4, 2, 13, 3, 11, 11, 14, 7, 11, 3, 7, 3, 4, 11, 3, 9, 3, 0, 2, 7, 12, 14, 1, 13, 15, 13, 14, 14, 14, 8, 11, 14, 10, 9, 7, 7, 7, 4, 11, 8, 11, 7, 14, 14, 2, 12, 9, 13, 11, 0, 6, 7, 8, 4, 12, 2, 5, 12, 15, 14, 4, 12, 2, 7, 10, 6, 6, 5, 9, 4, 3, 2, 6, 5, 12, 2, 8, 13, 0, 11, 6, 15, 9, 3, 4, 15, 15, 8, 8, 4], +[3, 14, 15, 4, 7, 13, 5, 6, 0, 4, 0, 8, 5, 15, 11, 13, 5, 8, 11, 9, 14, 15, 12, 14, 7, 2, 8, 8, 12, 8, 13, 10, 15, 15, 4, 15, 14, 0, 4, 4, 1, 12, 13, 0, 9, 11, 13, 7, 4, 4, 5, 12, 13, 12, 7, 13, 0, 9, 1, 8, 7, 2, 9, 11, 4, 13, 7, 5, 1, 0, 0, 12, 7, 12, 15, 14, 0, 7, 13, 10, 6, 5, 8, 9, 14, 8, 11, 4, 11, 7, 8, 7, 4, 4, 15, 1, 0, 8, 2, 6, 0, 9, 15, 13, 8, 13, 6, 5, 13, 15, 7, 9, 3, 0, 0, 8, 1, 4, 12, 10, 14, 5, 9, 8, 9, 10, 9, 8, 14, 15, 3, 1, 11, 15, 12, 12, 13, 14, 3, 9, 7, 4, 10, 3, 13, 3, 2, 14, 4, 11, 0, 3, 2, 9, 14, 14, 7, 15, 7, 6, 6, 6, 5, 7, 7, 0, 5, 0, 9, 14, 9, 3, 8, 0, 6, 3, 5, 1, 14, 5, 6, 9, 4, 3, 14, 15, 14, 2, 7, 0, 14, 9, 7, 6, 4, 3, 9, 10, 3, 0, 10, 0, 4, 3, 6, 11, 10, 0, 15, 3, 13, 2, 5, 14, 7, 0, 2, 13, 13, 9, 11, 6, 2, 5, 3, 6, 0, 10, 10, 8, 7, 7, 2, 3, 15, 2, 4, 1, 0, 2, 15, 9, 0, 15, 2, 8, 8, 0, 15, 2, 13, 3, 6, 2, 14, 14], +[15, 3, 8, 12, 5, 4, 12, 1, 0, 10, 12, 3, 15, 7, 7, 15, 13, 8, 1, 12, 14, 7, 15, 9, 0, 14, 11, 11, 12, 1, 9, 15, 6, 13, 9, 5, 12, 1, 8, 10, 11, 4, 0, 15, 13, 4, 11, 1, 14, 5, 5, 9, 2, 11, 14, 0, 11, 12, 7, 3, 1, 8, 12, 14, 9, 12, 7, 12, 9, 5, 13, 2, 9, 14, 3, 3, 3, 7, 13, 5, 4, 10, 8, 12, 7, 5, 6, 11, 12, 15, 8, 15, 9, 4, 9, 3, 11, 7, 15, 8, 3, 9, 0, 8, 5, 7, 13, 6, 11, 7, 8, 9, 1, 4, 1, 5, 2, 15, 14, 1, 15, 6, 6, 5, 2, 13, 5, 15, 5, 4, 7, 5, 12, 11, 10, 11, 9, 0, 8, 0, 11, 10, 13, 8, 9, 5, 13, 8, 14, 9, 11, 8, 9, 3, 13, 3, 2, 10, 6, 0, 4, 10, 11, 3, 5, 5, 3, 8, 5, 1, 3, 5, 11, 7, 3, 7, 13, 15, 5, 12, 15, 3, 3, 11, 6, 10, 6, 5, 2, 15, 4, 11, 1, 2, 15, 7, 2, 8, 2, 2, 5, 15, 8, 13, 4, 6, 5, 9, 1, 7, 5, 12, 10, 8, 6, 11, 5, 14, 0, 0, 6, 12, 15, 4, 12, 5, 14, 13, 12, 0, 6, 7, 8, 10, 7, 11, 7, 13, 13, 11, 12, 9, 4, 10, 0, 15, 6, 14, 12, 1, 6, 7, 6, 7, 8, 13], +[12, 4, 2, 11, 14, 14, 0, 12, 13, 7, 7, 9, 13, 14, 0, 6, 5, 14, 7, 5, 6, 12, 6, 4, 12, 2, 7, 7, 8, 14, 13, 10, 5, 14, 0, 8, 5, 6, 8, 0, 6, 10, 10, 2, 14, 8, 5, 0, 3, 11, 14, 4, 15, 5, 2, 13, 15, 5, 5, 14, 9, 11, 14, 13, 3, 11, 15, 15, 14, 4, 5, 7, 4, 13, 3, 7, 6, 14, 8, 10, 10, 10, 3, 3, 12, 1, 3, 14, 13, 5, 8, 13, 14, 5, 11, 7, 3, 9, 5, 2, 2, 2, 13, 13, 15, 8, 8, 5, 0, 13, 5, 4, 3, 12, 12, 5, 6, 11, 10, 9, 6, 4, 13, 4, 14, 2, 7, 6, 0, 2, 6, 11, 11, 8, 4, 13, 12, 1, 0, 0, 11, 1, 13, 15, 15, 8, 6, 11, 5, 10, 3, 2, 4, 7, 0, 11, 13, 11, 7, 11, 0, 3, 3, 13, 8, 12, 15, 2, 1, 8, 9, 7, 13, 14, 7, 14, 0, 5, 4, 2, 12, 8, 5, 7, 2, 4, 15, 5, 9, 8, 1, 9, 13, 5, 11, 1, 13, 11, 1, 9, 3, 14, 7, 14, 1, 7, 6, 6, 0, 4, 6, 8, 3, 8, 11, 9, 2, 8, 13, 3, 1, 7, 9, 9, 0, 1, 1, 4, 2, 14, 2, 12, 2, 0, 15, 2, 8, 3, 5, 10, 2, 10, 7, 10, 6, 14, 0, 1, 10, 3, 2, 13, 10, 9, 12, 1], +[3, 12, 1, 8, 13, 14, 7, 6, 4, 6, 9, 14, 5, 9, 11, 7, 4, 8, 4, 0, 15, 6, 6, 3, 10, 2, 10, 13, 15, 11, 11, 2, 4, 5, 8, 1, 13, 12, 9, 1, 5, 2, 5, 15, 10, 9, 12, 9, 4, 15, 4, 11, 14, 12, 14, 0, 15, 13, 7, 9, 14, 11, 13, 9, 7, 7, 8, 6, 0, 13, 15, 10, 14, 6, 13, 11, 13, 11, 12, 1, 4, 8, 10, 15, 10, 10, 14, 2, 8, 13, 5, 8, 14, 10, 14, 5, 2, 15, 4, 5, 13, 2, 13, 7, 12, 13, 12, 12, 8, 13, 2, 6, 12, 12, 1, 11, 1, 14, 9, 1, 11, 15, 14, 7, 14, 1, 13, 1, 8, 13, 15, 3, 7, 11, 14, 12, 12, 0, 2, 15, 2, 10, 1, 4, 4, 14, 9, 4, 8, 0, 14, 0, 5, 6, 0, 0, 8, 4, 5, 10, 11, 7, 0, 6, 8, 14, 10, 2, 10, 5, 10, 4, 10, 9, 15, 1, 14, 0, 6, 8, 8, 1, 10, 7, 12, 4, 1, 12, 6, 11, 6, 14, 10, 9, 15, 12, 15, 9, 6, 8, 10, 13, 13, 4, 10, 8, 7, 8, 0, 12, 11, 4, 0, 1, 7, 13, 6, 8, 9, 12, 6, 12, 15, 11, 3, 6, 6, 5, 11, 8, 9, 10, 2, 9, 4, 13, 6, 1, 7, 1, 7, 3, 13, 8, 6, 0, 3, 14, 9, 3, 1, 8, 4, 4, 1, 11], +[1, 11, 8, 11, 13, 2, 10, 0, 3, 11, 6, 2, 0, 12, 6, 13, 8, 13, 10, 10, 7, 4, 12, 2, 14, 2, 6, 6, 14, 8, 3, 12, 15, 12, 7, 9, 7, 11, 11, 2, 3, 7, 7, 13, 6, 10, 13, 7, 4, 9, 10, 9, 2, 0, 12, 1, 12, 9, 2, 3, 5, 2, 2, 2, 9, 3, 0, 1, 5, 2, 11, 9, 4, 10, 0, 0, 5, 5, 5, 2, 11, 1, 13, 11, 8, 7, 1, 10, 15, 11, 14, 10, 4, 6, 6, 8, 13, 11, 6, 4, 7, 9, 7, 12, 6, 14, 15, 2, 5, 0, 14, 4, 14, 12, 15, 14, 9, 1, 7, 3, 6, 2, 6, 11, 0, 1, 14, 0, 0, 11, 14, 11, 9, 2, 12, 4, 13, 14, 0, 14, 13, 11, 12, 12, 1, 0, 5, 6, 2, 4, 0, 13, 12, 8, 10, 14, 0, 0, 0, 2, 1, 13, 8, 9, 12, 12, 6, 2, 15, 9, 11, 15, 14, 9, 7, 5, 4, 12, 14, 6, 3, 11, 6, 1, 13, 3, 13, 11, 10, 8, 7, 10, 6, 12, 15, 13, 5, 3, 0, 6, 7, 3, 10, 9, 8, 13, 11, 4, 13, 1, 0, 7, 4, 11, 10, 13, 2, 5, 2, 14, 9, 9, 13, 8, 9, 2, 3, 10, 3, 13, 4, 12, 7, 12, 4, 14, 1, 0, 5, 6, 14, 12, 2, 10, 12, 10, 10, 2, 8, 9, 8, 6, 8, 14, 9, 0], +[11, 2, 1, 4, 0, 2, 4, 12, 2, 2, 9, 10, 15, 6, 11, 5, 10, 10, 8, 9, 11, 10, 1, 6, 13, 0, 10, 10, 2, 9, 10, 9, 10, 10, 3, 2, 6, 14, 5, 15, 10, 4, 0, 11, 6, 12, 6, 6, 4, 8, 1, 10, 15, 14, 3, 12, 1, 10, 0, 7, 13, 12, 12, 8, 1, 0, 9, 10, 9, 11, 14, 0, 4, 9, 7, 15, 5, 2, 13, 0, 3, 11, 8, 11, 15, 8, 5, 11, 2, 1, 13, 11, 10, 1, 3, 2, 1, 10, 5, 14, 11, 13, 3, 5, 6, 11, 11, 11, 4, 7, 15, 8, 9, 13, 11, 2, 12, 0, 15, 1, 2, 4, 8, 5, 8, 1, 8, 1, 14, 8, 11, 11, 11, 9, 10, 2, 13, 13, 4, 14, 13, 6, 12, 9, 6, 2, 6, 3, 8, 9, 3, 4, 6, 4, 13, 10, 9, 4, 2, 7, 13, 10, 7, 14, 12, 10, 11, 8, 9, 0, 12, 1, 0, 9, 9, 1, 1, 4, 6, 5, 6, 12, 2, 8, 13, 13, 2, 0, 11, 12, 6, 3, 13, 14, 1, 11, 9, 5, 0, 14, 1, 15, 6, 15, 4, 0, 2, 13, 2, 10, 1, 4, 7, 13, 7, 3, 7, 4, 6, 6, 2, 4, 5, 12, 12, 2, 13, 2, 13, 1, 12, 12, 14, 3, 7, 11, 11, 9, 10, 13, 8, 13, 11, 15, 8, 14, 6, 0, 2, 1, 0, 11, 1, 4, 10, 15], +[4, 1, 8, 4, 5, 13, 9, 6, 7, 0, 8, 4, 8, 6, 10, 15, 15, 15, 7, 10, 10, 14, 6, 1, 4, 6, 11, 4, 5, 2, 15, 4, 5, 11, 2, 3, 2, 7, 9, 14, 13, 3, 8, 2, 8, 10, 15, 12, 2, 3, 0, 0, 11, 10, 1, 15, 4, 5, 13, 4, 8, 6, 1, 2, 12, 8, 6, 4, 5, 8, 9, 2, 4, 2, 6, 12, 15, 4, 1, 1, 14, 7, 11, 5, 13, 3, 7, 4, 2, 14, 10, 15, 4, 2, 13, 10, 0, 3, 5, 2, 1, 13, 15, 13, 11, 13, 11, 15, 9, 15, 3, 14, 6, 2, 1, 3, 7, 5, 10, 9, 12, 4, 8, 2, 7, 7, 13, 4, 10, 10, 11, 9, 10, 2, 1, 6, 12, 9, 11, 3, 1, 11, 4, 9, 4, 10, 0, 3, 11, 7, 15, 15, 14, 13, 1, 4, 5, 2, 2, 1, 11, 14, 6, 10, 15, 12, 6, 8, 0, 4, 2, 3, 11, 12, 14, 15, 13, 8, 2, 1, 6, 5, 8, 5, 4, 15, 12, 3, 4, 10, 7, 14, 1, 6, 3, 10, 2, 4, 7, 8, 2, 7, 6, 4, 4, 15, 15, 8, 12, 7, 8, 14, 14, 14, 1, 11, 12, 14, 14, 5, 11, 0, 10, 1, 14, 5, 9, 12, 0, 12, 3, 3, 2, 6, 7, 2, 11, 3, 5, 8, 14, 14, 13, 11, 0, 10, 14, 10, 6, 4, 12, 12, 7, 11, 12, 0]] +w1EncodeTemp: 5BB44DB61C9BEBA09C859B5A3F41CE498EDC4646178423ECC99FE1E38E905E73F177B542F7C4C138B586B41B77DC88D75BE86FC16E36590C00A1D6577B50D3BFB9AEC53C7548B51959FFBDB352DA43D1CE3107243DBB7E3B37B4930372ECD1DFEE8EEB9A77478B7BEEC2D90B76482CC5EFC4726A564923562CD8B0F639F48F48E34FD7654080F5DB859BFEEC27888CADFFF40E44C10DB97D44C5CDD7908127B9D45701C0C7EF70AD56988E4B7B78441F806290DFD856FD97038041AC5E89A989FE13FBCCED93473A3DE2B43092EEF76766750705E9390836155E9634FE2E079E6734A9030A34B60A3F2DE507D29D6B5263A08A77322F14209FF082082F3D26EE3FC8451CA03C7FF78DC17E9FE0BB1CF9D6591CA84BF04D1B5E95B20ECB3781ECC9C7592DE933735DA4C857B6FCF849397B8F9380756D7B984151F21E6F56D2F54557BCBA0908AB8D598D9E8B393DA206A43B558315537B73FDC53FB3A656F2B4217F8222F5D8649571C58AB6E500C64F5CDE0C76A8B7D7BD9CA4F0E61C7676D84CB2EEC07D97ED60E557C6462C77E8ADE5806508A62A8E05B34E5FD25FE5B9DEB3FF4E75D473E6A8AA331CE35DD85E7B932522DD8F58D045C35CB69A464D2E6720B68BD41C001BFD8FB6A52374B0BDB730D3C82F8179EDE750248C75425F89915D1BBD91E3E771664086839B823D71991041E2C2022F38A5A2A7E6103AD29A1CC381ED6764E9957B84046F362ADABF2B5418CD1925F59A9CF4B4CE0EDF97BE9D7768D0AF6EBDBD1C84FAAA2ED885AE5EF2542D7DDCCCD862CCB1E119FB7E1E1DD83FB7CE0CF2A241E449080E650048A57B60E82A5A4A9A1F0E86187A4CC1B6E69ACF9F86DA4D8A87C04B10D786C9C6BF63568BA992D41617378D06E3398144B1B1B82D0AB326C0D6D8AA472C2E668EC3CF97B72B73D7A67D949A021C9C3225223910259BA40055251BBD78A1BFAE6486BD4697C7E62F054ECEEF193726B6100EB0BE294CEDE0BDCC016542D08CEA0020D198CC269FFB9E57C46EB3163DBD8AA7C6DF3560379AD84B1D70B4DA52E2998D29A3D3C4C7E40165CEA2AC2A9868E8092B4120C422A96F5BAA98AB610DAA929AAA23E6F54AB0C66684A1EFC3A170CD8C01A9B90E94F7250DB3B88FB512BD1A23A1E5DB53B6BB748FD92B0C1F425818188EBB9B2ADDE46D9C2636984346AD4972ADE7AC8B091C90194156C682DD02CB36EDB159E0F1F604D2A241D737476642C52C2D1DCC3EB79BDAD8FBE80612B041FA1448D569074868FAFFA7EA16644B254FB53272E93D28A8CF3200ABF1544D68218C46852924C64F117E5B3D47E2FA24AD3025D1DFDBFBF9E32631579A4C28774DAA9B2A619C3BB194A4307BFFDE412512EBA6CF864032CBFE8D125658F43CA4E761A342877246F48F7CE8EEB1EC5E0B1A5EC9C03362273B85EEBDA0AE46CCB70C +cTilde: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE +cTildePrime: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE +cTilde == cTildePrime, signature verified diff --git a/tests/kat_sig.c b/tests/kat_sig.c index 9a3542cf4..ef481c847 100644 --- a/tests/kat_sig.c +++ b/tests/kat_sig.c @@ -62,6 +62,36 @@ OQS_STATUS combine_message_signature(uint8_t **signed_msg, size_t *signed_msg_le memcpy(*signed_msg, signature, signature_len); memcpy(*signed_msg + signature_len, msg, msg_len); return OQS_SUCCESS; + } else if (0 == strcmp(sig->method_name, "ML-DSA-44-ipd")) { + // signed_msg = signature || msg + *signed_msg_len = signature_len + msg_len; + *signed_msg = malloc(*signed_msg_len); + if (*signed_msg == NULL) { + return OQS_ERROR; + } + memcpy(*signed_msg, signature, signature_len); + memcpy(*signed_msg + signature_len, msg, msg_len); + return OQS_SUCCESS; + } else if (0 == strcmp(sig->method_name, "ML-DSA-65-ipd")) { + // signed_msg = signature || msg + *signed_msg_len = signature_len + msg_len; + *signed_msg = malloc(*signed_msg_len); + if (*signed_msg == NULL) { + return OQS_ERROR; + } + memcpy(*signed_msg, signature, signature_len); + memcpy(*signed_msg + signature_len, msg, msg_len); + return OQS_SUCCESS; + } else if (0 == strcmp(sig->method_name, "ML-DSA-87-ipd")) { + // signed_msg = signature || msg + *signed_msg_len = signature_len + msg_len; + *signed_msg = malloc(*signed_msg_len); + if (*signed_msg == NULL) { + return OQS_ERROR; + } + memcpy(*signed_msg, signature, signature_len); + memcpy(*signed_msg + signature_len, msg, msg_len); + return OQS_SUCCESS; } else if (0 == strcmp(sig->method_name, "Falcon-512")) { // signed_msg = sig_len (2 bytes, big endian) || nonce (40 bytes) || msg || 0x29 || sig const uint16_t signature_len_uint16 = (uint16_t)signature_len; diff --git a/tests/vector_test.sh b/tests/vector_test.sh new file mode 100755 index 000000000..82aa91cfc --- /dev/null +++ b/tests/vector_test.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# SPDX-License-Identifier: MIT + +if [[ -z "${OQS_BUILD_DIR}" ]]; then + build_dir=build +else + build_dir="${OQS_BUILD_DIR}" +fi + +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-44.txt +file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-44.txt +file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-44.txt +scheme_name=ML-DSA-44-ipd + +sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi + +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-65.txt +file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-65.txt +file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-65.txt +scheme_name=ML-DSA-65-ipd + +sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi + +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-87.txt +file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-87.txt +file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-87.txt +scheme_name=ML-DSA-87-ipd + +sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi + +#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt +#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt +#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt +#scheme_name=Kyber512 +# +#sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" +#if [ $? != 0 ]; then +# exit 1 +#fi +# +#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt +#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt +#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt +#scheme_name=Kyber768 +# +#sh ./vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" +#if [ $? != 0 ]; then +# exit 1 +#fi +# +#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt +#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt +#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt +#scheme_name=Kyber1024 +# +#sh ./vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" +#if [ $? != 0 ]; then +# exit 1 +#fi \ No newline at end of file diff --git a/tests/vector_test_kem.sh b/tests/vector_test_kem.sh new file mode 100644 index 000000000..de06413dd --- /dev/null +++ b/tests/vector_test_kem.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# SPDX-License-Identifier: MIT + +file_keygen=$2 +file_encaps=$3 +file_decaps=$4 +build_dir=$5 + +# input part +keygen_z=$(grep "z: " "$file_keygen" | sed 's/z: //g') +keygen_d=$(grep "d: " "$file_keygen" | sed 's/d: //g') + +encaps_m=$(grep "m: " "$file_encaps" | sed 's/m: //g') +encaps_ek=$(grep "ek: " "$file_encaps" | sed 's/ek: //g') +encaps_k=$(grep "K: " "$file_encaps" | sed 's/K: //g') + +decaps_dk=$(grep "dk: " "$file_decaps" | sed 's/dk: //g') +decaps_c=$(grep "c: " "$file_decaps" | sed 's/c: //g') +decaps_kprime=$(grep "KPrime: " "$file_decaps" | sed 's/KPrime: //g') + +# KAT part +keygen_pk=$(grep "ek: " "$file_keygen") +keygen_sk=$(grep "dk: " "$file_keygen") + +encaps_c=$(grep "c: " "$file_encaps") +encaps_K=$(grep "K: " "$file_encaps") + +output=$($build_dir/tests/vectors_kem $1 "$keygen_z$keygen_d$encaps_m" "$encaps_ek" "$encaps_k" "$decaps_dk" "$decaps_c" "$decaps_kprime") +if [ $? != 0 ]; then + exit 1 +fi + +# Parse output: pk, sk, signature +output_pk=$(echo "$output" | grep "ek: ") +output_sk=$(echo "$output" | grep "dk: ") +output_c=$(echo "$output" | grep "c: ") +output_K=$(echo "$output" | grep "K: ") + +if [ "$keygen_pk" != "$output_pk" ]; then + echo "keygen_pk mismatch for $1" + echo "$keygen_pk\n$output_pk" + exit 1 +elif [ "$keygen_sk" != "$output_sk" ]; then + echo "keygen_sk mismatch for $1" + exit 1 +elif [ "$encaps_c" != "$output_c" ]; then + echo "$encaps_c\n$output_c" + echo "encaps_c mismatch for $1" + exit 1 +elif [ "$encaps_K" != "$output_K" ]; then + echo "encaps_K mismatch for $1" + exit 1 +else + echo "Vector tests succeeded for $1" +fi diff --git a/tests/vector_test_sig.sh b/tests/vector_test_sig.sh new file mode 100644 index 000000000..fcde299c2 --- /dev/null +++ b/tests/vector_test_sig.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# SPDX-License-Identifier: MIT + +file_keygen=$2 +file_signature=$3 +file_verification=$4 +build_dir=$5 + +# input part +prng_output_stream=$(grep "seed: " "$file_keygen" | sed 's/seed: //g') + +sig_msg=$(grep "message: " "$file_signature" | sed 's/message: //g') +sig_sk=$(grep "sk: " "$file_signature" | sed 's/sk: //g') +sig_rnd=$(grep "rnd: " "$file_signature" | sed "s/rnd: //g") + +verif_sig=$(grep "signature: " "$file_verification" | sed "s/signature: //g") +verif_pk=$(grep "pk: " "$file_verification" | sed "s/pk: //g") +verif_msg=$(grep "message: " "$file_verification" | sed "s/message: //g") + +# KAT part +keygen_pk=$(grep "pk: " "$file_keygen") +keygen_sk=$(grep "sk: " "$file_keygen") +sig_signature=$(grep "signature: " "$file_signature") + +output=$($build_dir/tests/vectors_sig $1 "$prng_output_stream$sig_rnd" "$sig_msg" "$sig_sk" "$verif_sig" "$verif_pk" "$verif_msg") +if [ $? != 0 ]; then + exit 1 +fi + +# Parse output: pk, sk, signature +output_pk=$(echo "$output" | grep "pk: ") +output_sk=$(echo "$output" | grep "sk: ") +output_signature=$(echo "$output" | grep "signature: ") + +if [ "$keygen_pk" != "$output_pk" ]; then + echo "keygen_pk mismatch for $1" + exit 1 +elif [ "$keygen_sk" != "$output_sk" ]; then + echo "keygen_sk mismatch for $1" + exit 1 +elif [ "$sig_signature" != "$output_signature" ]; then + echo "sig_signature mismatch for $1" + exit 1 +else + echo "Vector tests succeeded for $1" +fi diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c new file mode 100644 index 000000000..7c6b6350b --- /dev/null +++ b/tests/vectors_kem.c @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT + +// This tests the test vectors published by NIST CAVP + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "system_info.c" + +typedef struct { + const uint8_t* pos; +} fixed_prng_state; + +fixed_prng_state prng_state = { .pos = 0 }; + +/* Displays hexadecimal strings */ +void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { + printf("%-20s (%4zu bytes): ", label, len); + for (size_t i = 0; i < (len); i++) { + printf("%02X", str[i]); + } + printf("\n"); +} + +void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { + size_t i; + fprintf(fp, "%s", S); + for (i = 0; i < L; i++) { + fprintf(fp, "%02X", A[i]); + } + if (L == 0) { + fprintf(fp, "00"); + } + fprintf(fp, "\n"); +} + +static uint8_t hexCharToDecimal(char c) { + if (c >= '0' && c <= '9') { + return (uint8_t) (c - '0'); + } else if (c >= 'a' && c <= 'f') { + return (uint8_t) (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + return (uint8_t) (c - 'A' + 10); + } else { + fprintf(stderr, "Invalid hex character: %c\n", c); + return 0; + } +} + +static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { + size_t len = strlen(hexString); + + if (len % 2 != 0) { + fprintf(stderr, "Hex string must have an even number of characters\n"); + exit(EXIT_FAILURE); + } + + for (size_t i = 0, j = 0; i < len; i += 2, j++) { + byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); + } +} + +static inline uint16_t UINT16_TO_BE(const uint16_t x) { + union { + uint16_t val; + uint8_t bytes[2]; + } y; + y.bytes[0] = (x >> 8) & 0xFF; + y.bytes[1] = x & 0xFF; + return y.val; +} + +/* HQC-specific functions */ +static inline bool is_kyber(const char *method_name) { + return (0 == strcmp(method_name, OQS_KEM_alg_kyber_512)) + || (0 == strcmp(method_name, OQS_KEM_alg_kyber_768)) + || (0 == strcmp(method_name, OQS_KEM_alg_kyber_1024)); +} + +static void MLKEM_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { + (void) personalization_string; + prng_state.pos = entropy_input; +} + +static void MLKEM_randombytes(uint8_t *random_array, size_t bytes_to_read) { + memcpy(random_array, prng_state.pos, bytes_to_read); + prng_state.pos += bytes_to_read; +} + +static void MLKEM_randombytes_free(void) { + prng_state.pos = 0; +} + +OQS_STATUS kem_vector(const char *method_name, + uint8_t *prng_output_stream, + const uint8_t *encaps_pk, const uint8_t *encaps_K, + const uint8_t *decaps_sk, const uint8_t *decaps_ciphertext, const uint8_t *decaps_kprime) { + + uint8_t *entropy_input; + uint8_t seed[48]; + FILE *fh = NULL; + OQS_KEM *kem = NULL; + uint8_t *msg = NULL; + size_t msg_len = 0; + uint8_t *public_key = NULL; + uint8_t *secret_key = NULL; + uint8_t *ss_encaps = NULL; + uint8_t *ct_encaps = NULL; + uint8_t *ss_decaps = NULL; + OQS_STATUS rc, ret = OQS_ERROR; + int rv; + + void (*randombytes_init)(const uint8_t *, const uint8_t *) = NULL; + void (*randombytes_free)(void) = NULL; + + kem = OQS_KEM_new(method_name); + if (kem == NULL) { + printf("[vectors_kem] %s was not enabled at compile-time.\n", method_name); + goto algo_not_enabled; + } + + if (is_kyber(method_name)) { + OQS_randombytes_custom_algorithm(&MLKEM_randombytes); + randombytes_init = &MLKEM_randombytes_init; + randombytes_free = &MLKEM_randombytes_free; + entropy_input = (uint8_t *) prng_output_stream; + } else { + // Only ML-KEM-ipd supported + goto err; + } + + randombytes_init(entropy_input, NULL); + + fh = stdout; + + public_key = malloc(kem->length_public_key); + secret_key = malloc(kem->length_secret_key); + ss_encaps = malloc(kem->length_shared_secret); + ct_encaps = malloc(kem->length_ciphertext); + ss_decaps = malloc(kem->length_shared_secret); + if ((public_key == NULL) || (secret_key == NULL) || (ss_encaps == NULL) || (ct_encaps == NULL) || (ss_decaps == NULL)) { + fprintf(stderr, "[vectors_kem] %s ERROR: malloc failed!\n", method_name); + goto err; + } + + rc = OQS_KEM_keypair(kem, public_key, secret_key); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_kem] %s ERROR: OQS_KEM_keypair failed!\n", method_name); + goto err; + } + fprintBstr(fh, "ek: ", public_key, kem->length_public_key); + fprintBstr(fh, "dk: ", secret_key, kem->length_secret_key); + + rc = OQS_KEM_encaps(kem, ct_encaps, ss_encaps, encaps_pk); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_kem] %s ERROR: OQS_KEM_encaps failed!\n", method_name); + goto err; + } + + fprintBstr(fh, "c: ", ct_encaps, kem->length_ciphertext); + fprintBstr(fh, "K: ", ss_encaps, kem->length_shared_secret); + + rc = OQS_KEM_decaps(kem, ss_decaps, decaps_ciphertext, decaps_sk); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_kem] %s ERROR: OQS_KEM_decaps failed!\n", method_name); + goto err; + } + + rv = memcmp(ss_decaps, decaps_kprime, kem->length_shared_secret); + if (rv != 0) { + fprintf(stderr, "[vectors_kem] %s ERROR: shared secrets are not equal\n", method_name); + OQS_print_hex_string("ss_decaps", ss_decaps, kem->length_shared_secret); + OQS_print_hex_string("decaps_kprime", decaps_kprime, kem->length_shared_secret); + goto err; + } + + ret = OQS_SUCCESS; + goto cleanup; + +err: + ret = OQS_ERROR; + goto cleanup; + +algo_not_enabled: + ret = OQS_SUCCESS; + +cleanup: + if (kem != NULL) { + OQS_MEM_secure_free(secret_key, kem->length_secret_key); + OQS_MEM_secure_free(ss_encaps , kem->length_shared_secret); + OQS_MEM_secure_free(ss_decaps , kem->length_shared_secret); + } + OQS_MEM_insecure_free(public_key); + OQS_MEM_insecure_free(ct_encaps); + return ret; +} + +int main(int argc, char **argv) { + OQS_init(); + + if (argc != 8) { + fprintf(stderr, "Usage: vectors_kem algname prng_output_stream encaps_pk encaps_K decaps_sk decaps_ciphertext decaps_kprime\n"); + fprintf(stderr, " algname: "); + for (size_t i = 0; i < OQS_KEM_algs_length; i++) { + if (i > 0) { + fprintf(stderr, ", "); + } + fprintf(stderr, "%s", OQS_KEM_alg_identifier(i)); + } + fprintf(stderr, "\n"); + printf("\n"); + print_system_info(); + OQS_destroy(); + return EXIT_FAILURE; + } + + char *alg_name = argv[1]; + char *prng_output_stream = argv[2]; // z || d || m + + char *encaps_pk = argv[3]; + char *encaps_K = argv[4]; + + char *decaps_sk = argv[5]; + char *decaps_ciphertext = argv[6]; + char *decaps_kprime = argv[7]; + + + if (strlen(prng_output_stream) % 2 != 0 || + strlen(encaps_pk) % 2 != 0 || + strlen(encaps_K) % 2 != 0 || + strlen(decaps_sk) % 2 != 0 || + strlen(decaps_ciphertext) % 2 != 0 || + strlen(decaps_kprime) % 2 != 0) { + return EXIT_FAILURE; + } + + uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); + uint8_t *encaps_pk_bytes = malloc(strlen(encaps_pk) / 2); + uint8_t *encaps_K_bytes = malloc(strlen(encaps_K) / 2); + uint8_t *decaps_sk_bytes = malloc(strlen(decaps_sk) / 2); + uint8_t *decaps_ciphertext_bytes = malloc(strlen(decaps_ciphertext) / 2); + uint8_t *decaps_kprime_bytes = malloc(strlen(decaps_kprime) / 2); + + hexStringToByteArray(prng_output_stream, prng_output_stream_bytes); + hexStringToByteArray(encaps_pk, encaps_pk_bytes); + hexStringToByteArray(encaps_K, encaps_K_bytes); + hexStringToByteArray(decaps_sk, decaps_sk_bytes); + hexStringToByteArray(decaps_ciphertext, decaps_ciphertext_bytes); + hexStringToByteArray(decaps_kprime, decaps_kprime_bytes); + + OQS_STATUS rc = kem_vector(alg_name, prng_output_stream_bytes, encaps_pk_bytes, encaps_K_bytes, decaps_sk_bytes, decaps_ciphertext_bytes, decaps_kprime_bytes); + if (rc != OQS_SUCCESS) { + OQS_destroy(); + return EXIT_FAILURE; + } + + OQS_MEM_insecure_free(prng_output_stream_bytes); + OQS_MEM_insecure_free(encaps_pk_bytes); + OQS_MEM_insecure_free(encaps_K_bytes); + OQS_MEM_insecure_free(decaps_sk_bytes); + OQS_MEM_insecure_free(decaps_ciphertext_bytes); + OQS_MEM_insecure_free(decaps_kprime_bytes); + + OQS_destroy(); + return EXIT_SUCCESS; +} diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c new file mode 100644 index 000000000..180d3d642 --- /dev/null +++ b/tests/vectors_sig.c @@ -0,0 +1,269 @@ +// SPDX-License-Identifier: MIT + +// This tests the test vectors published by NIST CAVP + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "system_info.c" + +typedef struct { + const uint8_t* pos; +} fixed_prng_state; + +fixed_prng_state prng_state = { .pos = 0 }; + +/* Displays hexadecimal strings */ +void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { + printf("%-20s (%4zu bytes): ", label, len); + for (size_t i = 0; i < (len); i++) { + printf("%02X", str[i]); + } + printf("\n"); +} + +void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { + size_t i; + fprintf(fp, "%s", S); + for (i = 0; i < L; i++) { + fprintf(fp, "%02X", A[i]); + } + if (L == 0) { + fprintf(fp, "00"); + } + fprintf(fp, "\n"); +} + +static uint8_t hexCharToDecimal(char c) { + if (c >= '0' && c <= '9') { + return (uint8_t) (c - '0'); + } else if (c >= 'a' && c <= 'f') { + return (uint8_t) (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + return (uint8_t) (c - 'A' + 10); + } else { + fprintf(stderr, "Invalid hex character: %c\n", c); + return 0; + } +} + +static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { + size_t len = strlen(hexString); + + if (len % 2 != 0) { + fprintf(stderr, "Hex string must have an even number of characters\n"); + exit(EXIT_FAILURE); + } + + for (size_t i = 0, j = 0; i < len; i += 2, j++) { + byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); + } +} + +static inline uint16_t UINT16_TO_BE(const uint16_t x) { + union { + uint16_t val; + uint8_t bytes[2]; + } y; + y.bytes[0] = (x >> 8) & 0xFF; + y.bytes[1] = x & 0xFF; + return y.val; +} + +/* HQC-specific functions */ +static inline bool is_ml_dsa(const char *method_name) { + return (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_44)) + || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_65)) + || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_87)); +} + +//const uint8_t mldsa_44_stream[] = { +// // seed for keygen +// 0x6C, 0xAE, 0x2E, 0x9C, 0x2C, 0xF6, 0x4D, 0x26, 0x86, 0xC3, 0x1C, 0x21, 0x18, 0xE0, 0xF2, 0x4A, 0x47, 0xDD, 0x46, 0xDB, 0x85, 0x59, 0x09, 0x10, 0xAA, 0xC9, 0xDF, 0x4C, 0x1B, 0x85, 0x4E, 0x44, +// // deterministic signing +// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +//}; + +static void MLDSA_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { + (void) personalization_string; + prng_state.pos = entropy_input; +} + +static void MLDSA_randombytes(uint8_t *random_array, size_t bytes_to_read) { + memcpy(random_array, prng_state.pos, bytes_to_read); + prng_state.pos += bytes_to_read; +} + +static void MLDSA_randombytes_free(void) { + prng_state.pos = 0; +} + +OQS_STATUS sig_vector(const char *method_name, + uint8_t *prng_output_stream, + const uint8_t *sig_msg, size_t sig_msg_len, const uint8_t *sig_sk, + const uint8_t *verif_sig, const uint8_t *verif_pk, const uint8_t *verif_msg, size_t verif_msg_len) { + + uint8_t *entropy_input; + uint8_t seed[48]; + FILE *fh = NULL; + OQS_SIG *sig = NULL; + uint8_t *msg = NULL; + size_t msg_len = 0; + uint8_t *public_key = NULL; + uint8_t *secret_key = NULL; + uint8_t *signature = NULL; + uint8_t *signed_msg = NULL; + size_t signature_len = 0; + size_t signed_msg_len = 0; + OQS_STATUS rc, ret = OQS_ERROR; + + void (*randombytes_init)(const uint8_t *, const uint8_t *) = NULL; + void (*randombytes_free)(void) = NULL; + + sig = OQS_SIG_new(method_name); + if (sig == NULL) { + printf("[sig_kat] %s was not enabled at compile-time.\n", method_name); + goto algo_not_enabled; + } + + if (is_ml_dsa(method_name)) { + OQS_randombytes_custom_algorithm(&MLDSA_randombytes); + randombytes_init = &MLDSA_randombytes_init; + randombytes_free = &MLDSA_randombytes_free; + entropy_input = (uint8_t *) prng_output_stream; + } else { + // Only ML-DSA-ipd supported + goto err; + } + + randombytes_init(entropy_input, NULL); + + fh = stdout; + + public_key = malloc(sig->length_public_key); + secret_key = malloc(sig->length_secret_key); + signature = malloc(sig->length_signature); + if ((public_key == NULL) || (secret_key == NULL) || (signature == NULL)) { + fprintf(stderr, "[vectors_sig] %s ERROR: malloc failed!\n", method_name); + goto err; + } + + rc = OQS_SIG_keypair(sig, public_key, secret_key); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_sig] %s ERROR: OQS_SIG_keypair failed!\n", method_name); + goto err; + } + fprintBstr(fh, "pk: ", public_key, sig->length_public_key); + fprintBstr(fh, "sk: ", secret_key, sig->length_secret_key); + + rc = OQS_SIG_sign(sig, signature, &signature_len, sig_msg, sig_msg_len, sig_sk); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_sig] %s ERROR: OQS_SIG_sign failed!\n", method_name); + goto err; + } + + fprintBstr(fh, "signature: ", signature, signature_len); + + rc = OQS_SIG_verify(sig, verif_msg, verif_msg_len, verif_sig, signature_len, verif_pk); + if (rc != OQS_SUCCESS) { + fprintf(stderr, "[vectors_sig] %s ERROR: OQS_SIG_verify failed!\n", method_name); + goto err; + } + + ret = OQS_SUCCESS; + goto cleanup; + +err: + ret = OQS_ERROR; + goto cleanup; + +algo_not_enabled: + ret = OQS_SUCCESS; + +cleanup: + if (sig != NULL) { + OQS_MEM_secure_free(secret_key, sig->length_secret_key); + OQS_MEM_secure_free(signed_msg, signed_msg_len); + } + OQS_MEM_insecure_free(public_key); + OQS_MEM_insecure_free(signature); + OQS_MEM_insecure_free(msg); + OQS_SIG_free(sig); + return ret; +} + +int main(int argc, char **argv) { + OQS_init(); + + if (argc != 8) { + fprintf(stderr, "Usage: vectors_sig algname prng_output_stream sig_msg sig_sk verif_sig verif_pk verif_msg\n"); + fprintf(stderr, " algname: "); + for (size_t i = 0; i < OQS_SIG_algs_length; i++) { + if (i > 0) { + fprintf(stderr, ", "); + } + fprintf(stderr, "%s", OQS_SIG_alg_identifier(i)); + } + fprintf(stderr, "\n"); + printf("\n"); + print_system_info(); + OQS_destroy(); + return EXIT_FAILURE; + } + + char *alg_name = argv[1]; + char *prng_output_stream = argv[2]; + char *sig_msg = argv[3]; + size_t sig_msg_len = strlen(sig_msg) / 2; + char *sig_sk = argv[4]; + char *verif_sig = argv[5]; + char *verif_pk = argv[6]; + char *verif_msg = argv[7]; + size_t verif_msg_len = strlen(verif_msg) / 2; + + if (strlen(prng_output_stream) % 2 != 0 || + strlen(sig_msg) % 2 != 0 || + strlen(sig_sk) % 2 != 0 || + strlen(verif_sig) % 2 != 0 || + strlen(verif_pk) % 2 != 0 || + strlen(verif_msg) % 2 != 0) { + return EXIT_FAILURE; + } + + uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); + uint8_t *sig_msg_bytes = malloc(strlen(sig_msg) / 2); + uint8_t *sig_sk_bytes = malloc(strlen(sig_sk) / 2); + uint8_t *verif_sig_bytes = malloc(strlen(verif_sig) / 2); + uint8_t *verif_pk_bytes = malloc(strlen(verif_pk) / 2); + uint8_t *verif_msg_bytes = malloc(strlen(verif_msg) / 2); + + hexStringToByteArray(prng_output_stream, prng_output_stream_bytes); + hexStringToByteArray(sig_msg, sig_msg_bytes); + hexStringToByteArray(sig_sk, sig_sk_bytes); + hexStringToByteArray(verif_sig, verif_sig_bytes); + hexStringToByteArray(verif_pk, verif_pk_bytes); + hexStringToByteArray(verif_msg, verif_msg_bytes); + + OQS_STATUS rc = sig_vector(alg_name, prng_output_stream_bytes, sig_msg_bytes, sig_msg_len, sig_sk_bytes, verif_sig_bytes, verif_pk_bytes, verif_msg_bytes, verif_msg_len); + if (rc != OQS_SUCCESS) { + OQS_destroy(); + return EXIT_FAILURE; + } + + OQS_MEM_insecure_free(prng_output_stream_bytes); + OQS_MEM_insecure_free(sig_msg_bytes); + OQS_MEM_insecure_free(sig_sk_bytes); + OQS_MEM_insecure_free(verif_sig_bytes); + OQS_MEM_insecure_free(verif_pk_bytes); + OQS_MEM_insecure_free(verif_msg_bytes); + + OQS_destroy(); + return EXIT_SUCCESS; +} From 05c8bbfd7eba50652a5691f18b3b543b1cc9772e Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 13 Dec 2023 15:03:37 +0100 Subject: [PATCH 02/27] pull ml_kem --- .CMake/alg_support.cmake | 23 + CMakeLists.txt | 3 + .../copy_from_upstream/copy_from_upstream.yml | 46 +- ...qcrystals-dilithium-standard-alldiff.patch | 670 ++++++++++++++++++ .../pqcrystals-kyber-standard-alldiff.patch | 409 +++++++++++ ...ystals-kyber-standard-avx2-shake-aes.patch | 160 +++++ ...rystals-kyber-standard-ref-shake-aes.patch | 80 +++ .../pqcrystals-kyber-standard-yml.patch | 69 ++ src/CMakeLists.txt | 4 + src/kem/kem.c | 39 + src/kem/kem.h | 11 +- src/kem/ml_kem/CMakeLists.txt | 62 ++ src/kem/ml_kem/kem_ml_kem.h | 42 ++ src/kem/ml_kem/kem_ml_kem_1024.c | 91 +++ src/kem/ml_kem/kem_ml_kem_512.c | 91 +++ src/kem/ml_kem/kem_ml_kem_768.c | 91 +++ .../LICENSE | 6 + .../align.h | 19 + .../api.h | 66 ++ .../basemul.S | 105 +++ .../cbd.c | 144 ++++ .../cbd.h | 15 + .../consts.c | 121 ++++ .../consts.h | 43 ++ .../fq.S | 88 +++ .../fq.inc | 30 + .../indcpa.c | 566 +++++++++++++++ .../indcpa.h | 27 + .../invntt.S | 193 +++++ .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.S | 189 +++++ .../ntt.h | 28 + .../params.h | 68 ++ .../poly.c | 606 ++++++++++++++++ .../poly.h | 77 ++ .../polyvec.c | 307 ++++++++ .../polyvec.h | 36 + .../reduce.h | 12 + .../rejsample.c | 398 +++++++++++ .../rejsample.h | 14 + .../shuffle.S | 255 +++++++ .../shuffle.inc | 25 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 34 + .../verify.c | 73 ++ .../verify.h | 14 + .../LICENSE | 6 + .../api.h | 66 ++ .../cbd.c | 128 ++++ .../cbd.h | 14 + .../indcpa.c | 331 +++++++++ .../indcpa.h | 27 + .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.c | 146 ++++ .../ntt.h | 19 + .../params.h | 55 ++ .../poly.c | 343 +++++++++ .../poly.h | 53 ++ .../polyvec.c | 233 ++++++ .../polyvec.h | 36 + .../reduce.c | 42 ++ .../reduce.h | 16 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 35 + .../verify.c | 47 ++ .../verify.h | 14 + .../LICENSE | 6 + .../align.h | 19 + .../api.h | 66 ++ .../basemul.S | 105 +++ .../cbd.c | 144 ++++ .../cbd.h | 15 + .../consts.c | 121 ++++ .../consts.h | 43 ++ .../fq.S | 88 +++ .../fq.inc | 30 + .../indcpa.c | 566 +++++++++++++++ .../indcpa.h | 27 + .../invntt.S | 193 +++++ .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.S | 189 +++++ .../ntt.h | 28 + .../params.h | 68 ++ .../poly.c | 606 ++++++++++++++++ .../poly.h | 77 ++ .../polyvec.c | 307 ++++++++ .../polyvec.h | 36 + .../reduce.h | 12 + .../rejsample.c | 398 +++++++++++ .../rejsample.h | 14 + .../shuffle.S | 255 +++++++ .../shuffle.inc | 25 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 34 + .../verify.c | 73 ++ .../verify.h | 14 + .../LICENSE | 6 + .../api.h | 66 ++ .../cbd.c | 128 ++++ .../cbd.h | 14 + .../indcpa.c | 331 +++++++++ .../indcpa.h | 27 + .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.c | 146 ++++ .../ntt.h | 19 + .../params.h | 55 ++ .../poly.c | 343 +++++++++ .../poly.h | 53 ++ .../polyvec.c | 233 ++++++ .../polyvec.h | 36 + .../reduce.c | 42 ++ .../reduce.h | 16 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 35 + .../verify.c | 47 ++ .../verify.h | 14 + .../LICENSE | 6 + .../align.h | 19 + .../api.h | 66 ++ .../basemul.S | 105 +++ .../cbd.c | 144 ++++ .../cbd.h | 15 + .../consts.c | 121 ++++ .../consts.h | 43 ++ .../fq.S | 88 +++ .../fq.inc | 30 + .../indcpa.c | 566 +++++++++++++++ .../indcpa.h | 27 + .../invntt.S | 193 +++++ .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.S | 189 +++++ .../ntt.h | 28 + .../params.h | 68 ++ .../poly.c | 606 ++++++++++++++++ .../poly.h | 77 ++ .../polyvec.c | 307 ++++++++ .../polyvec.h | 36 + .../reduce.h | 12 + .../rejsample.c | 398 +++++++++++ .../rejsample.h | 14 + .../shuffle.S | 255 +++++++ .../shuffle.inc | 25 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 34 + .../verify.c | 73 ++ .../verify.h | 14 + .../LICENSE | 6 + .../api.h | 66 ++ .../cbd.c | 128 ++++ .../cbd.h | 14 + .../indcpa.c | 331 +++++++++ .../indcpa.h | 27 + .../kem.c | 169 +++++ .../kem.h | 35 + .../ntt.c | 146 ++++ .../ntt.h | 19 + .../params.h | 55 ++ .../poly.c | 343 +++++++++ .../poly.h | 53 ++ .../polyvec.c | 233 ++++++ .../polyvec.h | 36 + .../reduce.c | 42 ++ .../reduce.h | 16 + .../symmetric-shake.c | 74 ++ .../symmetric.h | 35 + .../verify.c | 47 ++ .../verify.h | 14 + src/oqsconfig.h.cmake | 8 + tests/KATs/kem/kats.json | 11 +- tests/vector_test.sh | 58 +- tests/vectors_kem.c | 10 +- tests/vectors_sig.c | 7 - 177 files changed, 19102 insertions(+), 61 deletions(-) create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-alldiff.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-avx2-shake-aes.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-yml.patch create mode 100644 src/kem/ml_kem/CMakeLists.txt create mode 100644 src/kem/ml_kem/kem_ml_kem.h create mode 100644 src/kem/ml_kem/kem_ml_kem_1024.c create mode 100644 src/kem/ml_kem/kem_ml_kem_512.c create mode 100644 src/kem/ml_kem/kem_ml_kem_768.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/align.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/align.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/align.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.inc create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/LICENSE create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/api.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/params.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric.h create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c create mode 100644 src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.h diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index 3b2286a43..2177ebb6e 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -232,6 +232,29 @@ endif() endif() +option(OQS_ENABLE_KEM_ML_KEM "Enable ml_kem algorithm family" ON) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_512" OFF) +endif() +endif() + +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_768" OFF) +endif() +endif() + +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") +if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_1024" OFF) +endif() +endif() + + option(OQS_ENABLE_SIG_DILITHIUM "Enable dilithium algorithm family" ON) cmake_dependent_option(OQS_ENABLE_SIG_dilithium_2 "" ON "OQS_ENABLE_SIG_DILITHIUM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") diff --git a/CMakeLists.txt b/CMakeLists.txt index c404b4370..06e5bd193 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,6 +167,9 @@ endif() if(OQS_ENABLE_KEM_KYBER) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/kem/kyber/kem_kyber.h) endif() +if(OQS_ENABLE_KEM_ML_KEM) + set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/kem/ml_kem/kem_ml_kem.h) +endif() if(OQS_ENABLE_SIG_DILITHIUM) set(PUBLIC_HEADERS ${PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/src/sig/dilithium/sig_dilithium.h) endif() diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index f2735ae53..4d465ade0 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -29,6 +29,15 @@ upstreams: kem_meta_path: '{pretty_name_full}_META.yml' kem_scheme_path: '.' patches: [pqcrystals-kyber-yml.patch, pqcrystals-kyber-ref-shake-aes.patch, pqcrystals-kyber-avx2-shake-aes.patch] + - + name: pqcrystals-kyber-standard + git_url: https://github.com/bhess/kyber.git + git_branch: bhe-ymlupd + git_commit: 0bf4adf5a0a93d7ff51b89fac228d0f65e148fea + kem_meta_path: '{pretty_name_full}_META.yml' + kem_scheme_path: '.' + patches: [pqcrystals-kyber-standard-alldiff.patch] + #patches: [pqcrystals-kyber-standard-yml.patch, pqcrystals-kyber-standard-ref-shake-aes.patch, pqcrystals-kyber-standard-avx2-shake-aes.patch] - name: pqcrystals-dilithium git_url: https://github.com/pq-crystals/dilithium.git @@ -44,7 +53,8 @@ upstreams: git_commit: 588562ac2cc777dfa407e34532d945b5f06b8ffd sig_meta_path: '{pretty_name_full}_META.yml' sig_scheme_path: '.' - patches: [pqcrystals-dilithium-standard-yml.patch, pqcrystals-dilithium-standard-ref-shake-aes.patch, pqcrystals-dilithium-standard-avx2-shake-aes.patch] + patches: [pqcrystals-dilithium-standard-alldiff.patch] + #patches: [pqcrystals-dilithium-standard-yml.patch, pqcrystals-dilithium-standard-ref-shake-aes.patch, pqcrystals-dilithium-standard-avx2-shake-aes.patch] kems: - name: classic_mceliece @@ -129,23 +139,23 @@ kems: scheme: "1024" pqclean_scheme: kyber1024 pretty_name_full: Kyber1024 -# - -# name: ml-kem -# default_implementation: ref -# upstream_location: pqcrystals-kyber-standard -# schemes: -# - -# scheme: "512" -# pqclean_scheme: ml-kem-512-ipd -# pretty_name_full: ML-KEM-512-ipd -# - -# scheme: "768" -# pqclean_scheme: ml-kem-768-ipd -# pretty_name_full: ML-KEM-768-ipd -# - -# scheme: "1024" -# pqclean_scheme: ml-kem-1024-ipd -# pretty_name_full: ML-KEM-512-ipd + - + name: ml_kem + default_implementation: ref + upstream_location: pqcrystals-kyber-standard + schemes: + - + scheme: "512" + pqclean_scheme: ml-kem-512-ipd + pretty_name_full: ML-KEM-512-ipd + - + scheme: "768" + pqclean_scheme: ml-kem-768-ipd + pretty_name_full: ML-KEM-768-ipd + - + scheme: "1024" + pqclean_scheme: ml-kem-1024-ipd + pretty_name_full: ML-KEM-1024-ipd sigs: - name: dilithium diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-alldiff.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-alldiff.patch new file mode 100644 index 000000000..75bb7263d --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-alldiff.patch @@ -0,0 +1,670 @@ +diff --git a/Dilithium2_META.yml b/ML-DSA-44-ipd_META.yml +similarity index 67% +rename from Dilithium2_META.yml +rename to ML-DSA-44-ipd_META.yml +index 78a3b82..d99edb5 100644 +--- a/Dilithium2_META.yml ++++ b/ML-DSA-44-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Dilithium2 ++name: ML-DSA-44-ipd + type: signature + claimed-nist-level: 2 + length-public-key: 1312 +@@ -21,19 +21,17 @@ implementations: + version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref + compile_opts: -DDILITHIUM_MODE=2 +- signature_keypair: pqcrystals_dilithium2_ref_keypair +- signature_signature: pqcrystals_dilithium2_ref_signature +- signature_verify: pqcrystals_dilithium2_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_dsa_44_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_44_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_44_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=2 +- signature_keypair: pqcrystals_dilithium2_avx2_keypair +- signature_signature: pqcrystals_dilithium2_avx2_signature +- signature_verify: pqcrystals_dilithium2_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ signature_keypair: pqcrystals_ml_dsa_44_ipd_avx2_keypair ++ signature_signature: pqcrystals_ml_dsa_44_ipd_avx2_signature ++ signature_verify: pqcrystals_ml_dsa_44_ipd_avx2_verify ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium3_META.yml b/ML-DSA-65-ipd_META.yml +similarity index 67% +rename from Dilithium3_META.yml +rename to ML-DSA-65-ipd_META.yml +index 5e82de5..72a43e7 100644 +--- a/Dilithium3_META.yml ++++ b/ML-DSA-65-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Dilithium3 ++name: ML-DSA-65-ipd + type: signature + claimed-nist-level: 3 + length-public-key: 1952 +@@ -21,19 +21,17 @@ implementations: + version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref + compile_opts: -DDILITHIUM_MODE=3 +- signature_keypair: pqcrystals_dilithium3_ref_keypair +- signature_signature: pqcrystals_dilithium3_ref_signature +- signature_verify: pqcrystals_dilithium3_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_dsa_65_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_65_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_65_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=3 +- signature_keypair: pqcrystals_dilithium3_avx2_keypair +- signature_signature: pqcrystals_dilithium3_avx2_signature +- signature_verify: pqcrystals_dilithium3_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ signature_keypair: pqcrystals_ml_dsa_65_ipd_avx2_keypair ++ signature_signature: pqcrystals_ml_dsa_65_ipd_avx2_signature ++ signature_verify: pqcrystals_ml_dsa_65_ipd_avx2_verify ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium5_META.yml b/ML-DSA-87-ipd_META.yml +similarity index 67% +rename from Dilithium5_META.yml +rename to ML-DSA-87-ipd_META.yml +index c2ea5f0..bf68590 100644 +--- a/Dilithium5_META.yml ++++ b/ML-DSA-87-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Dilithium5 ++name: ML-DSA-87-ipd + type: signature + claimed-nist-level: 5 + length-public-key: 2592 +@@ -21,19 +21,17 @@ implementations: + version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref + compile_opts: -DDILITHIUM_MODE=5 +- signature_keypair: pqcrystals_dilithium5_ref_keypair +- signature_signature: pqcrystals_dilithium5_ref_signature +- signature_verify: pqcrystals_dilithium5_ref_verify +- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_dsa_87_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_87_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_87_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=5 +- signature_keypair: pqcrystals_dilithium5_avx2_keypair +- signature_signature: pqcrystals_dilithium5_avx2_signature +- signature_verify: pqcrystals_dilithium5_avx2_verify +- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 ++ signature_keypair: pqcrystals_ml_dsa_87_ipd_avx2_keypair ++ signature_signature: pqcrystals_ml_dsa_87_ipd_avx2_signature ++ signature_verify: pqcrystals_ml_dsa_87_ipd_avx2_verify ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/avx2/config.h b/avx2/config.h +index a9facc0..e59f81a 100644 +--- a/avx2/config.h ++++ b/avx2/config.h +@@ -11,17 +11,17 @@ + #endif + + #if DILITHIUM_MODE == 2 +-#define CRYPTO_ALGNAME "Dilithium2" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium2_avx2 +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium2_avx2_##s ++#define CRYPTO_ALGNAME "ML-DSA-44-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_avx2 ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_avx2_##s + #elif DILITHIUM_MODE == 3 +-#define CRYPTO_ALGNAME "Dilithium3" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium3_avx2 +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium3_avx2_##s ++#define CRYPTO_ALGNAME "ML-DSA-65-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_avx2 ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_avx2_##s + #elif DILITHIUM_MODE == 5 +-#define CRYPTO_ALGNAME "Dilithium5" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium5_avx2 +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium5_avx2_##s ++#define CRYPTO_ALGNAME "ML-DSA-87-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_avx2 ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_avx2_##s + #endif + + #endif +diff --git a/avx2/poly.c b/avx2/poly.c +index c1b21c1..25d3682 100644 +--- a/avx2/poly.c ++++ b/avx2/poly.c +@@ -401,6 +401,7 @@ void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) + stream128_state state; + stream128_init(&state, seed, nonce); + poly_uniform_preinit(a, &state); ++ stream128_release(&state); + } + + void poly_uniform_4x(poly *a0, +@@ -415,7 +416,7 @@ void poly_uniform_4x(poly *a0, + { + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; +- keccakx4_state state; ++ shake128x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)seed); +@@ -433,6 +434,7 @@ void poly_uniform_4x(poly *a0, + buf[3].coeffs[SEEDBYTES+0] = nonce3; + buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; + ++ shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); + +@@ -449,6 +451,7 @@ void poly_uniform_4x(poly *a0, + ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } ++ shake128x4_inc_ctx_release(&state); + } + + /************************************************* +@@ -530,6 +533,7 @@ void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_eta_preinit(a, &state); ++ stream256_release(&state); + } + + void poly_uniform_eta_4x(poly *a0, +@@ -546,7 +550,7 @@ void poly_uniform_eta_4x(poly *a0, + ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; + + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); + _mm256_store_si256(&buf[0].vec[0],f); +@@ -568,6 +572,7 @@ void poly_uniform_eta_4x(poly *a0, + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); + +@@ -584,6 +589,7 @@ void poly_uniform_eta_4x(poly *a0, + ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); + ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); + } ++ shake256x4_inc_ctx_release(&state); + } + + /************************************************* +@@ -611,6 +617,7 @@ void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) + stream256_state state; + stream256_init(&state, seed, nonce); + poly_uniform_gamma1_preinit(a, &state); ++ stream256_release(&state); + } + + void poly_uniform_gamma1_4x(poly *a0, +@@ -624,7 +631,7 @@ void poly_uniform_gamma1_4x(poly *a0, + uint16_t nonce3) + { + ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; +- keccakx4_state state; ++ shake256x4incctx state; + __m256i f; + + f = _mm256_loadu_si256((__m256i *)&seed[0]); +@@ -647,8 +654,10 @@ void poly_uniform_gamma1_4x(poly *a0, + buf[3].coeffs[64] = nonce3; + buf[3].coeffs[65] = nonce3 >> 8; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + polyz_unpack(a0, buf[0].coeffs); + polyz_unpack(a1, buf[1].coeffs); +@@ -670,12 +679,12 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + ALIGNED_UINT8(SHAKE256_RATE) buf; +- keccak_state state; ++ shake256incctx state; + +- shake256_init(&state); +- shake256_absorb(&state, seed, SEEDBYTES); +- shake256_finalize(&state); +- shake256_squeezeblocks(buf.coeffs, 1, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, seed, SEEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); + + memcpy(&signs, buf.coeffs, 8); + pos = 8; +@@ -695,6 +704,7 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } ++ shake256_inc_ctx_release(&state); + } + + /************************************************* +diff --git a/avx2/sign.c b/avx2/sign.c +index c8f2398..a39f851 100644 +--- a/avx2/sign.c ++++ b/avx2/sign.c +@@ -161,7 +161,7 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t + polyvecl y; + polyveck w0; + } tmpv; +- keccak_state state; ++ shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; +@@ -172,11 +172,11 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t + unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); + + /* Compute CRH(tr, msg) */ +- shake256_init(&state); +- shake256_absorb(&state, tr, TRBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, tr, TRBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + #ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +@@ -223,11 +223,11 @@ rej: + polyveck_decompose(&w1, &tmpv.w0, &w1); + polyveck_pack_w1(sig, &w1); + +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(sig, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&c, sig); + poly_ntt(&c); + +@@ -272,6 +272,7 @@ rej: + hint[OMEGA + i] = pos = pos + n; + } + ++ shake256_inc_ctx_release(&state); + /* Pack z into signature */ + for(i = 0; i < L; i++) + polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); +@@ -329,18 +330,19 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size + polyvecl *row = rowbuf; + polyvecl z; + poly c, w1, h; +- keccak_state state; ++ shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_ctx_release(&state); + + /* Expand challenge */ + poly_challenge(&c, sig); +@@ -390,11 +392,12 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size + if(hint[j]) return -1; + + /* Call random oracle and verify challenge */ +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(buf.coeffs, CTILDEBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); ++ shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(buf.coeffs[i] != sig[i]) + return -1; +diff --git a/avx2/symmetric.h b/avx2/symmetric.h +index 8f3c3c5..fa49963 100644 +--- a/avx2/symmetric.h ++++ b/avx2/symmetric.h +@@ -6,21 +6,23 @@ + + #include "fips202.h" + +-typedef keccak_state stream128_state; +-typedef keccak_state stream256_state; ++typedef shake128incctx stream128_state; ++typedef shake256incctx stream256_state; + + #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +-void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); ++void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); + + #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +-void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce); ++void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); + + #define STREAM128_BLOCKBYTES SHAKE128_RATE + #define STREAM256_BLOCKBYTES SHAKE256_RATE + + #define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) + #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream128_release(STATE) shake128_inc_ctx_release(STATE) + #define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) + #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + + #endif +diff --git a/ref/config.h b/ref/config.h +index 98b8ccb..eddf13f 100644 +--- a/ref/config.h ++++ b/ref/config.h +@@ -11,17 +11,17 @@ + #endif + + #if DILITHIUM_MODE == 2 +-#define CRYPTO_ALGNAME "Dilithium2" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium2_ref +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium2_ref_##s ++#define CRYPTO_ALGNAME "ML-DSA-44-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_44_ipd_ref ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_44_ipd_ref_##s + #elif DILITHIUM_MODE == 3 +-#define CRYPTO_ALGNAME "Dilithium3" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium3_ref +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium3_ref_##s ++#define CRYPTO_ALGNAME "ML-DSA-65-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_65_ipd_ref ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_65_ipd_ref_##s + #elif DILITHIUM_MODE == 5 +-#define CRYPTO_ALGNAME "Dilithium5" +-#define DILITHIUM_NAMESPACETOP pqcrystals_dilithium5_ref +-#define DILITHIUM_NAMESPACE(s) pqcrystals_dilithium5_ref_##s ++#define CRYPTO_ALGNAME "ML-DSA-87-ipd" ++#define DILITHIUM_NAMESPACETOP pqcrystals_ml_dsa_87_ipd_ref ++#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_ref_##s + #endif + + #endif +diff --git a/ref/poly.c b/ref/poly.c +index 054ed98..d44063f 100644 +--- a/ref/poly.c ++++ b/ref/poly.c +@@ -365,6 +365,7 @@ void poly_uniform(poly *a, + buflen = STREAM128_BLOCKBYTES + off; + ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); + } ++ stream128_release(&state); + } + + /************************************************* +@@ -450,6 +451,7 @@ void poly_uniform_eta(poly *a, + stream256_squeezeblocks(buf, 1, &state); + ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); + } ++ stream256_release(&state); + } + + /************************************************* +@@ -473,6 +475,7 @@ void poly_uniform_gamma1(poly *a, + + stream256_init(&state, seed, nonce); + stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); ++ stream256_release(&state); + polyz_unpack(a, buf); + } + +@@ -490,11 +493,11 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + unsigned int i, b, pos; + uint64_t signs; + uint8_t buf[SHAKE256_RATE]; +- keccak_state state; ++ shake256incctx state; + +- shake256_init(&state); +- shake256_absorb(&state, seed, SEEDBYTES); +- shake256_finalize(&state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, seed, SEEDBYTES); ++ shake256_inc_finalize(&state); + shake256_squeezeblocks(buf, 1, &state); + + signs = 0; +@@ -518,6 +521,7 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { + c->coeffs[b] = 1 - 2*(signs & 1); + signs >>= 1; + } ++ shake256_inc_ctx_release(&state); + } + + /************************************************* +diff --git a/ref/sign.c b/ref/sign.c +index d25a399..9298ad2 100644 +--- a/ref/sign.c ++++ b/ref/sign.c +@@ -90,7 +90,7 @@ int crypto_sign_signature(uint8_t *sig, + polyvecl mat[K], s1, y, z; + polyveck t0, s2, w1, w0, h; + poly cp; +- keccak_state state; ++ shake256incctx state; + + rho = seedbuf; + tr = rho + SEEDBYTES; +@@ -102,11 +102,11 @@ int crypto_sign_signature(uint8_t *sig, + + + /* Compute mu = CRH(tr, msg) */ +- shake256_init(&state); +- shake256_absorb(&state, tr, TRBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, tr, TRBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + #ifdef DILITHIUM_RANDOMIZED_SIGNING + randombytes(rnd, RNDBYTES); +@@ -138,11 +138,11 @@ rej: + polyveck_decompose(&w1, &w0, &w1); + polyveck_pack_w1(sig, &w1); + +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(sig, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(sig, CTILDEBYTES, &state); + poly_challenge(&cp, sig); /* uses only the first SEEDBYTES bytes of sig */ + poly_ntt(&cp); + +@@ -175,6 +175,8 @@ rej: + if(n > OMEGA) + goto rej; + ++ shake256_inc_ctx_release(&state); ++ + /* Write signature */ + pack_sig(sig, sig, &z, &h); + *siglen = CRYPTO_BYTES; +@@ -240,7 +242,7 @@ int crypto_sign_verify(const uint8_t *sig, + poly cp; + polyvecl mat[K], z; + polyveck t1, w1, h; +- keccak_state state; ++ shake256incctx state; + + if(siglen != CRYPTO_BYTES) + return -1; +@@ -253,11 +255,11 @@ int crypto_sign_verify(const uint8_t *sig, + + /* Compute CRH(H(rho, t1), msg) */ + shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, m, mlen); +- shake256_finalize(&state); +- shake256_squeeze(mu, CRHBYTES, &state); ++ shake256_inc_init(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, m, mlen); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(mu, CRHBYTES, &state); + + /* Matrix-vector multiplication; compute Az - c2^dt1 */ + poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ +@@ -281,11 +283,12 @@ int crypto_sign_verify(const uint8_t *sig, + polyveck_pack_w1(buf, &w1); + + /* Call random oracle and verify challenge */ +- shake256_init(&state); +- shake256_absorb(&state, mu, CRHBYTES); +- shake256_absorb(&state, buf, K*POLYW1_PACKEDBYTES); +- shake256_finalize(&state); +- shake256_squeeze(c2, CTILDEBYTES, &state); ++ shake256_inc_ctx_reset(&state); ++ shake256_inc_absorb(&state, mu, CRHBYTES); ++ shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); ++ shake256_inc_finalize(&state); ++ shake256_inc_squeeze(c2, CTILDEBYTES, &state); ++ shake256_inc_ctx_release(&state); + for(i = 0; i < CTILDEBYTES; ++i) + if(c[i] != c2[i]) + return -1; +diff --git a/ref/symmetric-shake.c b/ref/symmetric-shake.c +index 11ec09c..963f649 100644 +--- a/ref/symmetric-shake.c ++++ b/ref/symmetric-shake.c +@@ -3,26 +3,26 @@ + #include "symmetric.h" + #include "fips202.h" + +-void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) ++void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) + { + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + +- shake128_init(state); +- shake128_absorb(state, seed, SEEDBYTES); +- shake128_absorb(state, t, 2); +- shake128_finalize(state); ++ shake128_inc_init(state); ++ shake128_inc_absorb(state, seed, SEEDBYTES); ++ shake128_inc_absorb(state, t, 2); ++ shake128_inc_finalize(state); + } + +-void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce) ++void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) + { + uint8_t t[2]; + t[0] = nonce; + t[1] = nonce >> 8; + +- shake256_init(state); +- shake256_absorb(state, seed, CRHBYTES); +- shake256_absorb(state, t, 2); +- shake256_finalize(state); ++ shake256_inc_init(state); ++ shake256_inc_absorb(state, seed, CRHBYTES); ++ shake256_inc_absorb(state, t, 2); ++ shake256_inc_finalize(state); + } +diff --git a/ref/symmetric.h b/ref/symmetric.h +index cba12d1..211de3b 100644 +--- a/ref/symmetric.h ++++ b/ref/symmetric.h +@@ -6,16 +6,16 @@ + + #include "fips202.h" + +-typedef keccak_state stream128_state; +-typedef keccak_state stream256_state; ++typedef shake128incctx stream128_state; ++typedef shake256incctx stream256_state; + + #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) +-void dilithium_shake128_stream_init(keccak_state *state, ++void dilithium_shake128_stream_init(shake128incctx *state, + const uint8_t seed[SEEDBYTES], + uint16_t nonce); + + #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) +-void dilithium_shake256_stream_init(keccak_state *state, ++void dilithium_shake256_stream_init(shake256incctx *state, + const uint8_t seed[CRHBYTES], + uint16_t nonce); + +@@ -26,9 +26,11 @@ void dilithium_shake256_stream_init(keccak_state *state, + dilithium_shake128_stream_init(STATE, SEED, NONCE) + #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream128_release(STATE) shake128_inc_ctx_release(STATE) + #define stream256_init(STATE, SEED, NONCE) \ + dilithium_shake256_stream_init(STATE, SEED, NONCE) + #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ + shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) ++#define stream256_release(STATE) shake256_inc_ctx_release(STATE) + + #endif diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch new file mode 100644 index 000000000..fe6d3c36a --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch @@ -0,0 +1,409 @@ +diff --git a/Kyber1024_META.yml b/ML-KEM-1024-ipd_META.yml +similarity index 72% +rename from Kyber1024_META.yml +rename to ML-KEM-1024-ipd_META.yml +index 7c586ea..ffafcf0 100644 +--- a/Kyber1024_META.yml ++++ b/ML-KEM-1024-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Kyber1024 ++name: ML-KEM-1024-ipd + type: kem + claimed-nist-level: 5 + claimed-security: IND-CCA2 +@@ -25,19 +25,17 @@ implementations: + version: https://github.com/pq-crystals/kyber/tree/standard + folder_name: ref + compile_opts: -DKYBER_K=4 +- signature_keypair: pqcrystals_kyber1024_ref_keypair +- signature_enc: pqcrystals_kyber1024_ref_enc +- signature_dec: pqcrystals_kyber1024_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_kem_1024_ipd_ref_keypair ++ signature_enc: pqcrystals_ml_kem_1024_ipd_ref_enc ++ signature_dec: pqcrystals_ml_kem_1024_ipd_ref_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/tree/standard + compile_opts: -DKYBER_K=4 +- signature_keypair: pqcrystals_kyber1024_avx2_keypair +- signature_enc: pqcrystals_kyber1024_avx2_enc +- signature_dec: pqcrystals_kyber1024_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ signature_keypair: pqcrystals_ml_kem_1024_ipd_avx2_keypair ++ signature_enc: pqcrystals_ml_kem_1024_ipd_avx2_enc ++ signature_dec: pqcrystals_ml_kem_1024_ipd_avx2_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Kyber512_META.yml b/ML-KEM-512-ipd_META.yml +similarity index 72% +rename from Kyber512_META.yml +rename to ML-KEM-512-ipd_META.yml +index d7b07e7..d20f0b1 100644 +--- a/Kyber512_META.yml ++++ b/ML-KEM-512-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Kyber512 ++name: ML-KEM-512-ipd + type: kem + claimed-nist-level: 1 + claimed-security: IND-CCA2 +@@ -25,19 +25,17 @@ implementations: + version: https://github.com/pq-crystals/kyber/tree/standard + folder_name: ref + compile_opts: -DKYBER_K=2 +- signature_keypair: pqcrystals_kyber512_ref_keypair +- signature_enc: pqcrystals_kyber512_ref_enc +- signature_dec: pqcrystals_kyber512_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_kem_512_ipd_ref_keypair ++ signature_enc: pqcrystals_ml_kem_512_ipd_ref_enc ++ signature_dec: pqcrystals_ml_kem_512_ipd_ref_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/tree/standard + compile_opts: -DKYBER_K=2 +- signature_keypair: pqcrystals_kyber512_avx2_keypair +- signature_enc: pqcrystals_kyber512_avx2_enc +- signature_dec: pqcrystals_kyber512_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ signature_keypair: pqcrystals_ml_kem_512_ipd_avx2_keypair ++ signature_enc: pqcrystals_ml_kem_512_ipd_avx2_enc ++ signature_dec: pqcrystals_ml_kem_512_ipd_avx2_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Kyber768_META.yml b/ML-KEM-768-ipd_META.yml +similarity index 72% +rename from Kyber768_META.yml +rename to ML-KEM-768-ipd_META.yml +index 92747ea..e768cd5 100644 +--- a/Kyber768_META.yml ++++ b/ML-KEM-768-ipd_META.yml +@@ -1,4 +1,4 @@ +-name: Kyber768 ++name: ML-KEM-768-ipd + type: kem + claimed-nist-level: 3 + claimed-security: IND-CCA2 +@@ -25,19 +25,17 @@ implementations: + version: https://github.com/pq-crystals/kyber/tree/standard + folder_name: ref + compile_opts: -DKYBER_K=3 +- signature_keypair: pqcrystals_kyber768_ref_keypair +- signature_enc: pqcrystals_kyber768_ref_enc +- signature_dec: pqcrystals_kyber768_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ signature_keypair: pqcrystals_ml_kem_768_ipd_ref_keypair ++ signature_enc: pqcrystals_ml_kem_768_ipd_ref_enc ++ signature_dec: pqcrystals_ml_kem_768_ipd_ref_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/tree/standard + compile_opts: -DKYBER_K=3 +- signature_keypair: pqcrystals_kyber768_avx2_keypair +- signature_enc: pqcrystals_kyber768_avx2_enc +- signature_dec: pqcrystals_kyber768_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ signature_keypair: pqcrystals_ml_kem_768_ipd_avx2_keypair ++ signature_enc: pqcrystals_ml_kem_768_ipd_avx2_enc ++ signature_dec: pqcrystals_ml_kem_768_ipd_avx2_dec ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/avx2/indcpa.c b/avx2/indcpa.c +index 4f3b782..572ce49 100644 +--- a/avx2/indcpa.c ++++ b/avx2/indcpa.c +@@ -175,7 +175,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake128x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -204,6 +204,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + buf[3].coeffs[33] = 1; + } + ++ shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + +@@ -225,6 +226,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[1].vec[0]); + poly_nttunpack(&a[1].vec[1]); ++ shake128x4_inc_ctx_release(&state); + } + #elif KYBER_K == 3 + void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +@@ -232,8 +234,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; +- keccakx4_state state; +- keccak_state state1x; ++ shake128x4incctx state; ++ shake128incctx state1x; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -262,6 +264,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + buf[3].coeffs[33] = 1; + } + ++ shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + +@@ -327,6 +330,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + ctr2 += rej_uniform(a[2].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[2].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } ++ shake128x4_inc_ctx_release(&state); + + poly_nttunpack(&a[1].vec[1]); + poly_nttunpack(&a[1].vec[2]); +@@ -337,6 +341,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + _mm256_store_si256(buf[0].vec, f); + buf[0].coeffs[32] = 2; + buf[0].coeffs[33] = 2; ++ ++ shake128_inc_init(&state1x); + shake128_absorb_once(&state1x, buf[0].coeffs, 34); + shake128_squeezeblocks(buf[0].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state1x); + ctr0 = rej_uniform_avx(a[2].vec[2].coeffs, buf[0].coeffs); +@@ -344,6 +350,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + shake128_squeezeblocks(buf[0].coeffs, 1, &state1x); + ctr0 += rej_uniform(a[2].vec[2].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + } ++ shake128_inc_ctx_release(&state1x); + + poly_nttunpack(&a[2].vec[2]); + } +@@ -353,7 +360,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + unsigned int i, ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake128x4incctx state; ++ shake128x4_inc_init(&state); + + for(i=0;i<4;i++) { + f = _mm256_loadu_si256((__m256i *)seed); +@@ -405,6 +413,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) + poly_nttunpack(&a[i].vec[2]); + poly_nttunpack(&a[i].vec[3]); + } ++ shake128x4_inc_ctx_release(&state); + } + #endif + +diff --git a/avx2/params.h b/avx2/params.h +index bc70ebf..fdc688e 100644 +--- a/avx2/params.h ++++ b/avx2/params.h +@@ -12,19 +12,19 @@ + #ifdef KYBER_90S + #define KYBER_NAMESPACE(s) pqcrystals_kyber512_90s_avx2_##s + #else +-#define KYBER_NAMESPACE(s) pqcrystals_kyber512_avx2_##s ++#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_avx2_##s + #endif + #elif (KYBER_K == 3) + #ifdef KYBER_90S + #define KYBER_NAMESPACE(s) pqcrystals_kyber768_90s_avx2_##s + #else +-#define KYBER_NAMESPACE(s) pqcrystals_kyber768_avx2_##s ++#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_avx2_##s + #endif + #elif (KYBER_K == 4) + #ifdef KYBER_90S + #define KYBER_NAMESPACE(s) pqcrystals_kyber1024_90s_avx2_##s + #else +-#define KYBER_NAMESPACE(s) pqcrystals_kyber1024_avx2_##s ++#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_avx2_##s + #endif + #else + #error "KYBER_K must be in {2,3,4}" +diff --git a/avx2/poly.c b/avx2/poly.c +index ab148a2..96bad86 100644 +--- a/avx2/poly.c ++++ b/avx2/poly.c +@@ -2,6 +2,7 @@ + #include + #include + #include "align.h" ++#include "fips202x4.h" + #include "params.h" + #include "poly.h" + #include "ntt.h" +@@ -412,7 +413,7 @@ void poly_getnoise_eta1_4x(poly *r0, + { + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -425,8 +426,10 @@ void poly_getnoise_eta1_4x(poly *r0, + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); +@@ -447,7 +450,7 @@ void poly_getnoise_eta1122_4x(poly *r0, + { + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -460,8 +463,10 @@ void poly_getnoise_eta1122_4x(poly *r0, + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); +diff --git a/avx2/symmetric.h b/avx2/symmetric.h +index 627b891..e4941f7 100644 +--- a/avx2/symmetric.h ++++ b/avx2/symmetric.h +@@ -8,10 +8,10 @@ + #include "fips202.h" + #include "fips202x4.h" + +-typedef keccak_state xof_state; ++typedef shake128incctx xof_state; + + #define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +-void kyber_shake128_absorb(keccak_state *s, ++void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); +diff --git a/ref/indcpa.c b/ref/indcpa.c +index 5d74518..4a8b4c8 100644 +--- a/ref/indcpa.c ++++ b/ref/indcpa.c +@@ -164,6 +164,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) + unsigned int buflen, off; + uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; + xof_state state; ++ xof_init(&state, seed); + + for(i=0;i + #include + #include "align.h" ++#include "fips202x4.h" + #include "params.h" + #include "poly.h" + #include "ntt.h" +@@ -412,7 +413,7 @@ void poly_getnoise_eta1_4x(poly *r0, + { + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -425,8 +426,10 @@ void poly_getnoise_eta1_4x(poly *r0, + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); +@@ -447,7 +450,7 @@ void poly_getnoise_eta1122_4x(poly *r0, + { + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; +- keccakx4_state state; ++ shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); +@@ -460,8 +463,10 @@ void poly_getnoise_eta1122_4x(poly *r0, + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + ++ shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); ++ shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); +diff --git a/avx2/symmetric.h b/avx2/symmetric.h +index 627b891..e4941f7 100644 +--- a/avx2/symmetric.h ++++ b/avx2/symmetric.h +@@ -8,10 +8,10 @@ + #include "fips202.h" + #include "fips202x4.h" + +-typedef keccak_state xof_state; ++typedef shake128incctx xof_state; + + #define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +-void kyber_shake128_absorb(keccak_state *s, ++void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch new file mode 100644 index 000000000..15ccb1ecc --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch @@ -0,0 +1,80 @@ +diff --git a/ref/indcpa.c b/ref/indcpa.c +index 5d74518..4a8b4c8 100644 +--- a/ref/indcpa.c ++++ b/ref/indcpa.c +@@ -164,6 +164,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) + unsigned int buflen, off; + uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; + xof_state state; ++ xof_init(&state, seed); + + for(i=0;i #endif /* OQS_ENABLE_KEM_KYBER */ +#ifdef OQS_ENABLE_KEM_ML_KEM +#include +#endif /* OQS_ENABLE_KEM_ML_KEM */ ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_INCLUDE_END #ifdef OQS_ENABLE_KEM_NTRUPRIME #include diff --git a/src/kem/ml_kem/CMakeLists.txt b/src/kem/ml_kem/CMakeLists.txt new file mode 100644 index 000000000..d3c7d8f3e --- /dev/null +++ b/src/kem/ml_kem/CMakeLists.txt @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: MIT + +# This file was generated by +# scripts/copy_from_upstream/copy_from_upstream.py + +set(_ML_KEM_OBJS "") + +if(OQS_ENABLE_KEM_ml_kem_512) + add_library(ml_kem_512_ref OBJECT kem_ml_kem_512.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c) + target_compile_options(ml_kem_512_ref PUBLIC -DKYBER_K=2) + target_include_directories(ml_kem_512_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_ref) + target_include_directories(ml_kem_512_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_512_ref PUBLIC -DKYBER_K=2) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +if(OQS_ENABLE_KEM_ml_kem_512_avx2) + add_library(ml_kem_512_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c) + target_include_directories(ml_kem_512_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2) + target_include_directories(ml_kem_512_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_512_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_512_avx2 PUBLIC -DKYBER_K=2) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +if(OQS_ENABLE_KEM_ml_kem_768) + add_library(ml_kem_768_ref OBJECT kem_ml_kem_768.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c) + target_compile_options(ml_kem_768_ref PUBLIC -DKYBER_K=3) + target_include_directories(ml_kem_768_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_ref) + target_include_directories(ml_kem_768_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_768_ref PUBLIC -DKYBER_K=3) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +if(OQS_ENABLE_KEM_ml_kem_768_avx2) + add_library(ml_kem_768_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c) + target_include_directories(ml_kem_768_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2) + target_include_directories(ml_kem_768_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_768_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_768_avx2 PUBLIC -DKYBER_K=3) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +if(OQS_ENABLE_KEM_ml_kem_1024) + add_library(ml_kem_1024_ref OBJECT kem_ml_kem_1024.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c) + target_compile_options(ml_kem_1024_ref PUBLIC -DKYBER_K=4) + target_include_directories(ml_kem_1024_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref) + target_include_directories(ml_kem_1024_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_1024_ref PUBLIC -DKYBER_K=4) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +if(OQS_ENABLE_KEM_ml_kem_1024_avx2) + add_library(ml_kem_1024_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c) + target_include_directories(ml_kem_1024_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2) + target_include_directories(ml_kem_1024_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_1024_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_1024_avx2 PUBLIC -DKYBER_K=4) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +endif() + +set(ML_KEM_OBJS ${_ML_KEM_OBJS} PARENT_SCOPE) diff --git a/src/kem/ml_kem/kem_ml_kem.h b/src/kem/ml_kem/kem_ml_kem.h new file mode 100644 index 000000000..77d7e1435 --- /dev/null +++ b/src/kem/ml_kem/kem_ml_kem.h @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT + +#ifndef OQS_KEM_ML_KEM_H +#define OQS_KEM_ML_KEM_H + +#include + +#ifdef OQS_ENABLE_KEM_ml_kem_512 +#define OQS_KEM_ml_kem_512_length_public_key 800 +#define OQS_KEM_ml_kem_512_length_secret_key 1632 +#define OQS_KEM_ml_kem_512_length_ciphertext 768 +#define OQS_KEM_ml_kem_512_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_512_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#endif + +#ifdef OQS_ENABLE_KEM_ml_kem_768 +#define OQS_KEM_ml_kem_768_length_public_key 1184 +#define OQS_KEM_ml_kem_768_length_secret_key 2400 +#define OQS_KEM_ml_kem_768_length_ciphertext 1088 +#define OQS_KEM_ml_kem_768_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_768_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#endif + +#ifdef OQS_ENABLE_KEM_ml_kem_1024 +#define OQS_KEM_ml_kem_1024_length_public_key 1568 +#define OQS_KEM_ml_kem_1024_length_secret_key 3168 +#define OQS_KEM_ml_kem_1024_length_ciphertext 1568 +#define OQS_KEM_ml_kem_1024_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_1024_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#endif + +#endif + diff --git a/src/kem/ml_kem/kem_ml_kem_1024.c b/src/kem/ml_kem/kem_ml_kem_1024.c new file mode 100644 index 000000000..64aae5db0 --- /dev/null +++ b/src/kem/ml_kem/kem_ml_kem_1024.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_KEM_ml_kem_1024) + +OQS_KEM *OQS_KEM_ml_kem_1024_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_1024; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 5; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_1024_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_1024_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_1024_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_1024_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_1024_keypair; + kem->encaps = OQS_KEM_ml_kem_1024_encaps; + kem->decaps = OQS_KEM_ml_kem_1024_decaps; + + return kem; +} + +extern int pqcrystals_ml_kem_1024_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_1024_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_1024_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +extern int pqcrystals_ml_kem_1024_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_1024_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_1024_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); +#endif + +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_avx2_enc(ciphertext, shared_secret, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_enc(ciphertext, shared_secret, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_enc(ciphertext, shared_secret, public_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_avx2_dec(shared_secret, ciphertext, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_dec(shared_secret, ciphertext, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_1024_ipd_ref_dec(shared_secret, ciphertext, secret_key); +#endif +} + +#endif diff --git a/src/kem/ml_kem/kem_ml_kem_512.c b/src/kem/ml_kem/kem_ml_kem_512.c new file mode 100644 index 000000000..f1623ada1 --- /dev/null +++ b/src/kem/ml_kem/kem_ml_kem_512.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_KEM_ml_kem_512) + +OQS_KEM *OQS_KEM_ml_kem_512_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_512; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 1; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_512_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_512_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_512_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_512_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_512_keypair; + kem->encaps = OQS_KEM_ml_kem_512_encaps; + kem->decaps = OQS_KEM_ml_kem_512_decaps; + + return kem; +} + +extern int pqcrystals_ml_kem_512_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_512_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_512_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +extern int pqcrystals_ml_kem_512_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_512_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_512_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); +#endif + +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_avx2_enc(ciphertext, shared_secret, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_enc(ciphertext, shared_secret, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_enc(ciphertext, shared_secret, public_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_avx2_dec(shared_secret, ciphertext, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_dec(shared_secret, ciphertext, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_512_ipd_ref_dec(shared_secret, ciphertext, secret_key); +#endif +} + +#endif diff --git a/src/kem/ml_kem/kem_ml_kem_768.c b/src/kem/ml_kem/kem_ml_kem_768.c new file mode 100644 index 000000000..bdce1aca2 --- /dev/null +++ b/src/kem/ml_kem/kem_ml_kem_768.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT + +#include + +#include + +#if defined(OQS_ENABLE_KEM_ml_kem_768) + +OQS_KEM *OQS_KEM_ml_kem_768_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_768; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 3; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_768_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_768_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_768_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_768_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_768_keypair; + kem->encaps = OQS_KEM_ml_kem_768_encaps; + kem->decaps = OQS_KEM_ml_kem_768_decaps; + + return kem; +} + +extern int pqcrystals_ml_kem_768_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_768_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_768_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +extern int pqcrystals_ml_kem_768_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); +extern int pqcrystals_ml_kem_768_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +extern int pqcrystals_ml_kem_768_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); +#endif + +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_avx2_keypair(public_key, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_keypair(public_key, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_keypair(public_key, secret_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_avx2_enc(ciphertext, shared_secret, public_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_enc(ciphertext, shared_secret, public_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_enc(ciphertext, shared_secret, public_key); +#endif +} + +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +#if defined(OQS_DIST_BUILD) + if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { +#endif /* OQS_DIST_BUILD */ + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_avx2_dec(shared_secret, ciphertext, secret_key); +#if defined(OQS_DIST_BUILD) + } else { + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_dec(shared_secret, ciphertext, secret_key); + } +#endif /* OQS_DIST_BUILD */ +#else + return (OQS_STATUS) pqcrystals_ml_kem_768_ipd_ref_dec(shared_secret, ciphertext, secret_key); +#endif +} + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/align.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/align.h new file mode 100644 index 000000000..3463866f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT16(N) \ + union { \ + int16_t coeffs[N]; \ + __m256i vec[(N+15)/16]; \ + } + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/api.h new file mode 100644 index 000000000..a154e80f1 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_avx2_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_avx2_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_avx2_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_avx2_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_avx2_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_avx2_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_avx2_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_avx2_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_avx2_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_avx2_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_avx2_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_avx2_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_avx2_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_avx2_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_avx2_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_avx2_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_avx2_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_avx2_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S new file mode 100644 index 000000000..36990639b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S @@ -0,0 +1,105 @@ +#include "consts.h" + +.macro schoolbook off +vmovdqa _16XQINV*2(%rcx),%ymm0 +vmovdqa (64*\off+ 0)*2(%rsi),%ymm1 # a0 +vmovdqa (64*\off+16)*2(%rsi),%ymm2 # b0 +vmovdqa (64*\off+32)*2(%rsi),%ymm3 # a1 +vmovdqa (64*\off+48)*2(%rsi),%ymm4 # b1 + +vpmullw %ymm0,%ymm1,%ymm9 # a0.lo +vpmullw %ymm0,%ymm2,%ymm10 # b0.lo +vpmullw %ymm0,%ymm3,%ymm11 # a1.lo +vpmullw %ymm0,%ymm4,%ymm12 # b1.lo + +vmovdqa (64*\off+ 0)*2(%rdx),%ymm5 # c0 +vmovdqa (64*\off+16)*2(%rdx),%ymm6 # d0 + +vpmulhw %ymm5,%ymm1,%ymm13 # a0c0.hi +vpmulhw %ymm6,%ymm1,%ymm1 # a0d0.hi +vpmulhw %ymm5,%ymm2,%ymm14 # b0c0.hi +vpmulhw %ymm6,%ymm2,%ymm2 # b0d0.hi + +vmovdqa (64*\off+32)*2(%rdx),%ymm7 # c1 +vmovdqa (64*\off+48)*2(%rdx),%ymm8 # d1 + +vpmulhw %ymm7,%ymm3,%ymm15 # a1c1.hi +vpmulhw %ymm8,%ymm3,%ymm3 # a1d1.hi +vpmulhw %ymm7,%ymm4,%ymm0 # b1c1.hi +vpmulhw %ymm8,%ymm4,%ymm4 # b1d1.hi + +vmovdqa %ymm13,(%rsp) + +vpmullw %ymm5,%ymm9,%ymm13 # a0c0.lo +vpmullw %ymm6,%ymm9,%ymm9 # a0d0.lo +vpmullw %ymm5,%ymm10,%ymm5 # b0c0.lo +vpmullw %ymm6,%ymm10,%ymm10 # b0d0.lo + +vpmullw %ymm7,%ymm11,%ymm6 # a1c1.lo +vpmullw %ymm8,%ymm11,%ymm11 # a1d1.lo +vpmullw %ymm7,%ymm12,%ymm7 # b1c1.lo +vpmullw %ymm8,%ymm12,%ymm12 # b1d1.lo + +vmovdqa _16XQ*2(%rcx),%ymm8 +vpmulhw %ymm8,%ymm13,%ymm13 +vpmulhw %ymm8,%ymm9,%ymm9 +vpmulhw %ymm8,%ymm5,%ymm5 +vpmulhw %ymm8,%ymm10,%ymm10 +vpmulhw %ymm8,%ymm6,%ymm6 +vpmulhw %ymm8,%ymm11,%ymm11 +vpmulhw %ymm8,%ymm7,%ymm7 +vpmulhw %ymm8,%ymm12,%ymm12 + +vpsubw (%rsp),%ymm13,%ymm13 # -a0c0 +vpsubw %ymm9,%ymm1,%ymm9 # a0d0 +vpsubw %ymm5,%ymm14,%ymm5 # b0c0 +vpsubw %ymm10,%ymm2,%ymm10 # b0d0 + +vpsubw %ymm6,%ymm15,%ymm6 # a1c1 +vpsubw %ymm11,%ymm3,%ymm11 # a1d1 +vpsubw %ymm7,%ymm0,%ymm7 # b1c1 +vpsubw %ymm12,%ymm4,%ymm12 # b1d1 + +vmovdqa (%r9),%ymm0 +vmovdqa 32(%r9),%ymm1 +vpmullw %ymm0,%ymm10,%ymm2 +vpmullw %ymm0,%ymm12,%ymm3 +vpmulhw %ymm1,%ymm10,%ymm10 +vpmulhw %ymm1,%ymm12,%ymm12 +vpmulhw %ymm8,%ymm2,%ymm2 +vpmulhw %ymm8,%ymm3,%ymm3 +vpsubw %ymm2,%ymm10,%ymm10 # rb0d0 +vpsubw %ymm3,%ymm12,%ymm12 # rb1d1 + +vpaddw %ymm5,%ymm9,%ymm9 +vpaddw %ymm7,%ymm11,%ymm11 +vpsubw %ymm13,%ymm10,%ymm13 +vpsubw %ymm12,%ymm6,%ymm6 + +vmovdqa %ymm13,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(64*\off+16)*2(%rdi) +vmovdqa %ymm6,(64*\off+32)*2(%rdi) +vmovdqa %ymm11,(64*\off+48)*2(%rdi) +.endm + +.text +.global cdecl(basemul_avx) +cdecl(basemul_avx): +mov %rsp,%r8 +and $-32,%rsp +sub $32,%rsp + +lea (_ZETAS_EXP+176)*2(%rcx),%r9 +schoolbook 0 + +add $32*2,%r9 +schoolbook 1 + +add $192*2,%r9 +schoolbook 2 + +add $32*2,%r9 +schoolbook 3 + +mov %r8,%rsp +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c new file mode 100644 index 000000000..dad473c79 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c @@ -0,0 +1,144 @@ +#include +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd2(poly * restrict r, const __m256i buf[2*KYBER_N/128]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask55 = _mm256_set1_epi32(0x55555555); + const __m256i mask33 = _mm256_set1_epi32(0x33333333); + const __m256i mask03 = _mm256_set1_epi32(0x03030303); + const __m256i mask0F = _mm256_set1_epi32(0x0F0F0F0F); + + for(i = 0; i < KYBER_N/64; i++) { + f0 = _mm256_load_si256(&buf[i]); + + f1 = _mm256_srli_epi16(f0, 1); + f0 = _mm256_and_si256(mask55, f0); + f1 = _mm256_and_si256(mask55, f1); + f0 = _mm256_add_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 2); + f0 = _mm256_and_si256(mask33, f0); + f1 = _mm256_and_si256(mask33, f1); + f0 = _mm256_add_epi8(f0, mask33); + f0 = _mm256_sub_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 4); + f0 = _mm256_and_si256(mask0F, f0); + f1 = _mm256_and_si256(mask0F, f1); + f0 = _mm256_sub_epi8(f0, mask03); + f1 = _mm256_sub_epi8(f1, mask03); + + f2 = _mm256_unpacklo_epi8(f0, f1); + f3 = _mm256_unpackhi_epi8(f0, f1); + + f0 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f2)); + f1 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f2,1)); + f2 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f3)); + f3 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f3,1)); + + _mm256_store_si256(&r->vec[4*i+0], f0); + _mm256_store_si256(&r->vec[4*i+1], f2); + _mm256_store_si256(&r->vec[4*i+2], f1); + _mm256_store_si256(&r->vec[4*i+3], f3); + } +} + +#if KYBER_ETA1 == 3 +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3 +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd3(poly * restrict r, const uint8_t buf[3*KYBER_N/4+8]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask249 = _mm256_set1_epi32(0x249249); + const __m256i mask6DB = _mm256_set1_epi32(0x6DB6DB); + const __m256i mask07 = _mm256_set1_epi32(7); + const __m256i mask70 = _mm256_set1_epi32(7 << 16); + const __m256i mask3 = _mm256_set1_epi16(3); + const __m256i shufbidx = _mm256_set_epi8(-1,15,14,13,-1,12,11,10,-1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6,-1, 5, 4, 3,-1, 2, 1, 0); + + for(i = 0; i < KYBER_N/32; i++) { + f0 = _mm256_loadu_si256((__m256i *)&buf[24*i]); + f0 = _mm256_permute4x64_epi64(f0,0x94); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + + f1 = _mm256_srli_epi32(f0,1); + f2 = _mm256_srli_epi32(f0,2); + f0 = _mm256_and_si256(mask249,f0); + f1 = _mm256_and_si256(mask249,f1); + f2 = _mm256_and_si256(mask249,f2); + f0 = _mm256_add_epi32(f0,f1); + f0 = _mm256_add_epi32(f0,f2); + + f1 = _mm256_srli_epi32(f0,3); + f0 = _mm256_add_epi32(f0,mask6DB); + f0 = _mm256_sub_epi32(f0,f1); + + f1 = _mm256_slli_epi32(f0,10); + f2 = _mm256_srli_epi32(f0,12); + f3 = _mm256_srli_epi32(f0, 2); + f0 = _mm256_and_si256(f0,mask07); + f1 = _mm256_and_si256(f1,mask70); + f2 = _mm256_and_si256(f2,mask07); + f3 = _mm256_and_si256(f3,mask70); + f0 = _mm256_add_epi16(f0,f1); + f1 = _mm256_add_epi16(f2,f3); + f0 = _mm256_sub_epi16(f0,mask3); + f1 = _mm256_sub_epi16(f1,mask3); + + f2 = _mm256_unpacklo_epi32(f0,f1); + f3 = _mm256_unpackhi_epi32(f0,f1); + + f0 = _mm256_permute2x128_si256(f2,f3,0x20); + f1 = _mm256_permute2x128_si256(f2,f3,0x31); + + _mm256_store_si256(&r->vec[2*i+0], f0); + _mm256_store_si256(&r->vec[2*i+1], f1); + } +} +#endif + +/* buf 32 bytes longer for cbd3 */ +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, (uint8_t *)buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.h new file mode 100644 index 000000000..05788e06b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.h @@ -0,0 +1,15 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c new file mode 100644 index 000000000..84e596893 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c @@ -0,0 +1,121 @@ +#include "align.h" +#include "params.h" +#include "consts.h" + +#define Q KYBER_Q +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 +#define V 20159 // floor(2^26/q + 0.5) +#define FHI 1441 // mont^2/128 +#define FLO -10079 // qinv*FHI +#define MONTSQHI 1353 // mont^2 +#define MONTSQLO 20553 // qinv*MONTSQHI +#define MASK 4095 +#define SHIFT 32 + +const qdata_t qdata = {{ +#define _16XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, + +#define _16XQINV 16 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _16XV 32 + V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, + +#define _16XFLO 48 + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + +#define _16XFHI 64 + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + +#define _16XMONTSQLO 80 + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + +#define _16XMONTSQHI 96 + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + +#define _16XMASK 112 + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + +#define _REVIDXB 128 + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + +#define _REVIDXD 144 + 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0, + +#define _ZETAS_EXP 160 + 31498, 31498, 31498, 31498, -758, -758, -758, -758, + 5237, 5237, 5237, 5237, 1397, 1397, 1397, 1397, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + -359, -359, -359, -359, -359, -359, -359, -359, + -359, -359, -359, -359, -359, -359, -359, -359, + 13525, 13525, 13525, 13525, 13525, 13525, 13525, 13525, + -12402, -12402, -12402, -12402, -12402, -12402, -12402, -12402, + 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + -20907, -20907, -20907, -20907, 27758, 27758, 27758, 27758, + -3799, -3799, -3799, -3799, -15690, -15690, -15690, -15690, + -171, -171, -171, -171, 622, 622, 622, 622, + 1577, 1577, 1577, 1577, 182, 182, 182, 182, + -5827, -5827, 17363, 17363, -26360, -26360, -29057, -29057, + 5571, 5571, -1102, -1102, 21438, 21438, -26242, -26242, + 573, 573, -1325, -1325, 264, 264, 383, 383, + -829, -829, 1458, 1458, -1602, -1602, -130, -130, + -5689, -6516, 1496, 30967, -23565, 20179, 20710, 25080, + -12796, 26616, 16064, -12442, 9134, -650, -25986, 27837, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -335, -11477, -32227, 20494, -27738, 945, -14883, 6182, + 32010, 10631, 29175, -28762, -18486, 17560, -14430, -5276, + -1103, 555, -1251, 1550, 422, 177, -291, 1574, + -246, 1159, -777, -602, -1590, -872, 418, -156, + 11182, 13387, -14233, -21655, 13131, -4587, 23092, 5493, + -32502, 30317, -18741, 12639, 20100, 18525, 19529, -12619, + 430, 843, 871, 105, 587, -235, -460, 1653, + 778, -147, 1483, 1119, 644, 349, 329, -75, + 787, 787, 787, 787, 787, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 787, 787, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + 28191, 28191, 28191, 28191, 28191, 28191, 28191, 28191, + -16694, -16694, -16694, -16694, -16694, -16694, -16694, -16694, + 287, 287, 287, 287, 287, 287, 287, 287, + 202, 202, 202, 202, 202, 202, 202, 202, + 10690, 10690, 10690, 10690, 1358, 1358, 1358, 1358, + -11202, -11202, -11202, -11202, 31164, 31164, 31164, 31164, + 962, 962, 962, 962, -1202, -1202, -1202, -1202, + -1474, -1474, -1474, -1474, 1468, 1468, 1468, 1468, + -28073, -28073, 24313, 24313, -10532, -10532, 8800, 8800, + 18426, 18426, 8859, 8859, 26675, 26675, -16163, -16163, + -681, -681, 1017, 1017, 732, 732, 608, 608, + -1542, -1542, 411, 411, -205, -205, -1571, -1571, + 19883, -28250, -15887, -8898, -28309, 9075, -30199, 18249, + 13426, 14017, -29156, -12757, 16832, 4311, -24155, -17915, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -31183, 25435, -7382, 24391, -20927, 10946, 24214, 16989, + 10335, -7934, -22502, 10906, 31636, 28644, 23998, -17422, + 817, 603, 1322, -1465, -1215, 1218, -874, -1187, + -1185, -1278, -1510, -870, -108, 996, 958, 1522, + 20297, 2146, 15355, -32384, -6280, -14903, -11044, 14469, + -21498, -20198, 23210, -17442, -23860, -20257, 7756, 23132, + 1097, 610, -1285, 384, -136, -1335, 220, -1659, + -1530, 794, -854, 478, -308, 991, -1460, 1628, + +#define _16XSHIFT 624 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT +}}; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.h new file mode 100644 index 000000000..f95899cd8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.h @@ -0,0 +1,43 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _16XQ 0 +#define _16XQINV 16 +#define _16XV 32 +#define _16XFLO 48 +#define _16XFHI 64 +#define _16XMONTSQLO 80 +#define _16XMONTSQHI 96 +#define _16XMASK 112 +#define _REVIDXB 128 +#define _REVIDXD 144 +#define _ZETAS_EXP 160 +#define _16XSHIFT 624 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#ifdef __ASSEMBLER__ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define cdecl2(s) decorate(s) +#define cdecl(s) cdecl2(KYBER_NAMESPACE(##s)) +#else +#define cdecl(s) KYBER_NAMESPACE(##s) +#endif +#endif + +#ifndef __ASSEMBLER__ +#include "align.h" +typedef ALIGNED_INT16(640) qdata_t; +#define qdata KYBER_NAMESPACE(qdata) +extern const qdata_t qdata; +#endif + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S new file mode 100644 index 000000000..3bb1ebd3d --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S @@ -0,0 +1,88 @@ +#include "consts.h" +.include "fq.inc" + +.text +reduce128_avx: +#load +vmovdqa (%rdi),%ymm2 +vmovdqa 32(%rdi),%ymm3 +vmovdqa 64(%rdi),%ymm4 +vmovdqa 96(%rdi),%ymm5 +vmovdqa 128(%rdi),%ymm6 +vmovdqa 160(%rdi),%ymm7 +vmovdqa 192(%rdi),%ymm8 +vmovdqa 224(%rdi),%ymm9 + +red16 2 +red16 3 +red16 4 +red16 5 +red16 6 +red16 7 +red16 8 +red16 9 + +#store +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm3,32(%rdi) +vmovdqa %ymm4,64(%rdi) +vmovdqa %ymm5,96(%rdi) +vmovdqa %ymm6,128(%rdi) +vmovdqa %ymm7,160(%rdi) +vmovdqa %ymm8,192(%rdi) +vmovdqa %ymm9,224(%rdi) + +ret + +.global cdecl(reduce_avx) +cdecl(reduce_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XV*2(%rsi),%ymm1 +call reduce128_avx +add $256,%rdi +call reduce128_avx +ret + +tomont128_avx: +#load +vmovdqa (%rdi),%ymm3 +vmovdqa 32(%rdi),%ymm4 +vmovdqa 64(%rdi),%ymm5 +vmovdqa 96(%rdi),%ymm6 +vmovdqa 128(%rdi),%ymm7 +vmovdqa 160(%rdi),%ymm8 +vmovdqa 192(%rdi),%ymm9 +vmovdqa 224(%rdi),%ymm10 + +fqmulprecomp 1,2,3,11 +fqmulprecomp 1,2,4,12 +fqmulprecomp 1,2,5,13 +fqmulprecomp 1,2,6,14 +fqmulprecomp 1,2,7,15 +fqmulprecomp 1,2,8,11 +fqmulprecomp 1,2,9,12 +fqmulprecomp 1,2,10,13 + +#store +vmovdqa %ymm3,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm5,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm7,128(%rdi) +vmovdqa %ymm8,160(%rdi) +vmovdqa %ymm9,192(%rdi) +vmovdqa %ymm10,224(%rdi) + +ret + +.global cdecl(tomont_avx) +cdecl(tomont_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XMONTSQLO*2(%rsi),%ymm1 +vmovdqa _16XMONTSQHI*2(%rsi),%ymm2 +call tomont128_avx +add $256,%rdi +call tomont128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.inc new file mode 100644 index 000000000..4b7afc311 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.inc @@ -0,0 +1,30 @@ +.macro red16 r,rs=0,x=12 +vpmulhw %ymm1,%ymm\r,%ymm\x +.if \rs +vpmulhrsw %ymm\rs,%ymm\x,%ymm\x +.else +vpsraw $10,%ymm\x,%ymm\x +.endif +vpmullw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro csubq r,x=12 +vpsubw %ymm0,%ymm\r,%ymm\r +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro caddq r,x=12 +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro fqmulprecomp al,ah,b,x=12 +vpmullw %ymm\al,%ymm\b,%ymm\x +vpmulhw %ymm\ah,%ymm\b,%ymm\b +vpmulhw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\b,%ymm\b +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c new file mode 100644 index 000000000..572ce4900 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c @@ -0,0 +1,566 @@ +#include +#include +#include +#include +#include "align.h" +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "cbd.h" +#include "rejsample.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk and the +* public seed used to generate the matrix A. +* The polynomial coefficients in pk are assumed to +* lie in the invertal [0,q], i.e. pk must be reduced +* by polyvec_reduce(). +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key. +* The polynomial coefficients in sk are assumed to +* lie in the invertal [0,q], i.e. sk must be reduced +* by polyvec_reduce(). +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v. +* The polynomial coefficients in b and v are assumed to +* lie in the invertal [0,q], i.e. b and v must be reduced +* by polyvec_reduce() and poly_reduce(), respectively. +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output array +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos <= buflen - 3) { // buflen is always at least 3 + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#if KYBER_K == 2 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 1; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 1; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[1].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[1].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[1].vec[0]); + poly_nttunpack(&a[1].vec[1]); + shake128x4_inc_ctx_release(&state); +} +#elif KYBER_K == 3 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128incctx state1x; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 0; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 0; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[0].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[0].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[0].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[0].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[0].vec[2]); + poly_nttunpack(&a[1].vec[0]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 2; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 2; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 2; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 2; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[1].vec[1].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[1].vec[2].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[2].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[2].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[1].vec[1].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[1].vec[2].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[2].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[2].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); + + poly_nttunpack(&a[1].vec[1]); + poly_nttunpack(&a[1].vec[2]); + poly_nttunpack(&a[2].vec[0]); + poly_nttunpack(&a[2].vec[1]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + buf[0].coeffs[32] = 2; + buf[0].coeffs[33] = 2; + + shake128_inc_init(&state1x); + shake128_absorb_once(&state1x, buf[0].coeffs, 34); + shake128_squeezeblocks(buf[0].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state1x); + ctr0 = rej_uniform_avx(a[2].vec[2].coeffs, buf[0].coeffs); + while(ctr0 < KYBER_N) { + shake128_squeezeblocks(buf[0].coeffs, 1, &state1x); + ctr0 += rej_uniform(a[2].vec[2].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + } + shake128_inc_ctx_release(&state1x); + + poly_nttunpack(&a[2].vec[2]); +} +#elif KYBER_K == 4 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int i, ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128x4_inc_init(&state); + + for(i=0;i<4;i++) { + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = i; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = i; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = i; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = i; + buf[3].coeffs[33] = 3; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = i; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = i; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = i; + buf[3].coeffs[32] = 3; + buf[3].coeffs[33] = i; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[i].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[i].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[i].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[i].vec[3].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[i].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[i].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[i].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[i].vec[3].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[i].vec[0]); + poly_nttunpack(&a[i].vec[1]); + poly_nttunpack(&a[i].vec[2]); + poly_nttunpack(&a[i].vec[3]); + } + shake128x4_inc_ctx_release(&state); +} +#endif + +/************************************************* +* Name: indcpa_keypair_derand +* +* Description: Generates public and private key for the CPA-secure +* public-key encryption scheme underlying Kyber +* +* Arguments: - uint8_t *pk: pointer to output public key +* (of length KYBER_INDCPA_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (of length KYBER_INDCPA_SECRETKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (of length KYBER_SYMBYTES bytes) +**************************************************/ +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]) +{ + unsigned int i; + uint8_t buf[2*KYBER_SYMBYTES]; + const uint8_t *publicseed = buf; + const uint8_t *noiseseed = buf + KYBER_SYMBYTES; + polyvec a[KYBER_K], e, pkpv, skpv; + + hash_g(buf, coins, KYBER_SYMBYTES); + + gen_a(a, publicseed); + +#if KYBER_K == 2 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, e.vec+0, e.vec+1, noiseseed, 0, 1, 2, 3); +#elif KYBER_K == 3 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, e.vec+0, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+1, e.vec+2, pkpv.vec+0, pkpv.vec+1, noiseseed, 4, 5, 6, 7); +#elif KYBER_K == 4 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, skpv.vec+3, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+0, e.vec+1, e.vec+2, e.vec+3, noiseseed, 4, 5, 6, 7); +#endif + + polyvec_ntt(&skpv); + polyvec_reduce(&skpv); + polyvec_ntt(&e); + + // matrix-vector multiplication + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S new file mode 100644 index 000000000..76d418999 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S @@ -0,0 +1,193 @@ +#include "consts.h" +.include "shuffle.inc" +.include "fq.inc" + +.macro butterfly rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3,zl0=2,zl1=2,zh0=3,zh1=3 +vpsubw %ymm\rl0,%ymm\rh0,%ymm12 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rl0 +vpsubw %ymm\rl1,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl0,%ymm12,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl1 +vpsubw %ymm\rl2,%ymm\rh2,%ymm14 + +vpmullw %ymm\zl0,%ymm13,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl2 +vpsubw %ymm\rl3,%ymm\rh3,%ymm15 + +vpmullw %ymm\zl1,%ymm14,%ymm\rh2 +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl3 +vpmullw %ymm\zl1,%ymm15,%ymm\rh3 + +vpmulhw %ymm\zh0,%ymm12,%ymm12 +vpmulhw %ymm\zh0,%ymm13,%ymm13 + +vpmulhw %ymm\zh1,%ymm14,%ymm14 +vpmulhw %ymm\zh1,%ymm15,%ymm15 + +vpmulhw %ymm0,%ymm\rh0,%ymm\rh0 + +vpmulhw %ymm0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm0,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm0,%ymm\rh3,%ymm\rh3 + +# + +# + +vpsubw %ymm\rh0,%ymm12,%ymm\rh0 + +vpsubw %ymm\rh1,%ymm13,%ymm\rh1 + +vpsubw %ymm\rh2,%ymm14,%ymm\rh2 +vpsubw %ymm\rh3,%ymm15,%ymm\rh3 +.endm + +.macro intt_levels0t5 off +/* level 0 */ +vmovdqa _16XFLO*2(%rsi),%ymm2 +vmovdqa _16XFHI*2(%rsi),%ymm3 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +fqmulprecomp 2,3,4 +fqmulprecomp 2,3,6 +fqmulprecomp 2,3,5 +fqmulprecomp 2,3,7 + +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 + +fqmulprecomp 2,3,8 +fqmulprecomp 2,3,10 +fqmulprecomp 2,3,9 +fqmulprecomp 2,3,11 + +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+208)*2(%rsi),%ymm15 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+176)*2(%rsi),%ymm1 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+224)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+192)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm12 +vpshufb %ymm12,%ymm15,%ymm15 +vpshufb %ymm12,%ymm1,%ymm1 +vpshufb %ymm12,%ymm2,%ymm2 +vpshufb %ymm12,%ymm3,%ymm3 + +butterfly 4,5,8,9,6,7,10,11,15,1,2,3 + +/* level 1 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+144)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+160)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm1 +vpshufb %ymm1,%ymm2,%ymm2 +vpshufb %ymm1,%ymm3,%ymm3 + +butterfly 4,5,6,7,8,9,10,11,2,2,3,3 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +/* level 2 */ +vmovdqa _REVIDXD*2(%rsi),%ymm12 +vpermd (_ZETAS_EXP+(1-\off)*224+112)*2(%rsi),%ymm12,%ymm2 +vpermd (_ZETAS_EXP+(1-\off)*224+128)*2(%rsi),%ymm12,%ymm10 + +butterfly 3,4,6,8,5,7,9,11,2,2,10,10 + +vmovdqa _16XV*2(%rsi),%ymm1 +red16 3 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +/* level 3 */ +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+80)*2(%rsi),%ymm2 +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+96)*2(%rsi),%ymm9 + +butterfly 10,3,6,5,4,8,7,11,2,2,9,9 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +/* level 4 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+48)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+64)*2(%rsi),%ymm7 + +butterfly 9,10,6,4,3,5,8,11,2,2,7,7 + +red16 9 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_EXP+(1-\off)*224+16)*2(%rsi),%ymm2 +vmovdqa (_ZETAS_EXP+(1-\off)*224+32)*2(%rsi),%ymm8 + +butterfly 7,9,6,3,10,4,5,11,2,2,8,8 + +vmovdqa %ymm7,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.macro intt_level6 off +/* level 6 */ +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm2 + +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm3 + +butterfly 4,5,6,7,8,9,10,11 + +.if \off == 0 +red16 4 +.endif + +vmovdqa %ymm4,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm7,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +intt_levels0t5 0 +intt_levels0t5 1 + +intt_level6 0 +intt_level6 1 +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S new file mode 100644 index 000000000..0ce7b4129 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S @@ -0,0 +1,189 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro mul rh0,rh1,rh2,rh3,zl0=15,zl1=15,zh0=2,zh1=2 +vpmullw %ymm\zl0,%ymm\rh0,%ymm12 +vpmullw %ymm\zl0,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl1,%ymm\rh2,%ymm14 +vpmullw %ymm\zl1,%ymm\rh3,%ymm15 + +vpmulhw %ymm\zh0,%ymm\rh0,%ymm\rh0 +vpmulhw %ymm\zh0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm\zh1,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm\zh1,%ymm\rh3,%ymm\rh3 +.endm + +.macro reduce +vpmulhw %ymm0,%ymm12,%ymm12 +vpmulhw %ymm0,%ymm13,%ymm13 + +vpmulhw %ymm0,%ymm14,%ymm14 +vpmulhw %ymm0,%ymm15,%ymm15 +.endm + +.macro update rln,rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rln +vpsubw %ymm\rh0,%ymm\rl0,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl0 + +vpsubw %ymm\rh1,%ymm\rl1,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl1 +vpsubw %ymm\rh2,%ymm\rl2,%ymm\rh2 + +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl2 +vpsubw %ymm\rh3,%ymm\rl3,%ymm\rh3 + +vpsubw %ymm12,%ymm\rln,%ymm\rln +vpaddw %ymm12,%ymm\rh0,%ymm\rh0 +vpsubw %ymm13,%ymm\rl0,%ymm\rl0 + +vpaddw %ymm13,%ymm\rh1,%ymm\rh1 +vpsubw %ymm14,%ymm\rl1,%ymm\rl1 +vpaddw %ymm14,%ymm\rh2,%ymm\rh2 + +vpsubw %ymm15,%ymm\rl2,%ymm\rl2 +vpaddw %ymm15,%ymm\rh3,%ymm\rh3 +.endm + +.macro level0 off +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm15 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +vmovdqa %ymm3,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.macro levels1t6 off +/* level 1 */ +vmovdqa (_ZETAS_EXP+224*\off+16)*2(%rsi),%ymm15 +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 +vmovdqa (_ZETAS_EXP+224*\off+32)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +/* level 2 */ +shuffle8 5,10,7,10 +shuffle8 6,11,5,11 + +vmovdqa (_ZETAS_EXP+224*\off+48)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+64)*2(%rsi),%ymm2 + +mul 7,10,5,11 + +shuffle8 3,8,6,8 +shuffle8 4,9,3,9 + +reduce +update 4,6,8,3,9,7,10,5,11 + +/* level 3 */ +shuffle4 8,5,9,5 +shuffle4 3,11,8,11 + +vmovdqa (_ZETAS_EXP+224*\off+80)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+96)*2(%rsi),%ymm2 + +mul 9,5,8,11 + +shuffle4 4,7,3,7 +shuffle4 6,10,4,10 + +reduce +update 6,3,7,4,10,9,5,8,11 + +/* level 4 */ +shuffle2 7,8,10,8 +shuffle2 4,11,7,11 + +vmovdqa (_ZETAS_EXP+224*\off+112)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+128)*2(%rsi),%ymm2 + +mul 10,8,7,11 + +shuffle2 6,9,4,9 +shuffle2 3,5,6,5 + +reduce +update 3,4,9,6,5,10,8,7,11 + +/* level 5 */ +shuffle1 9,7,5,7 +shuffle1 6,11,9,11 + +vmovdqa (_ZETAS_EXP+224*\off+144)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+160)*2(%rsi),%ymm2 + +mul 5,7,9,11 + +shuffle1 3,10,6,10 +shuffle1 4,8,3,8 + +reduce +update 4,6,10,3,8,5,7,9,11 + +/* level 6 */ +vmovdqa (_ZETAS_EXP+224*\off+176)*2(%rsi),%ymm14 +vmovdqa (_ZETAS_EXP+224*\off+208)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+192)*2(%rsi),%ymm8 +vmovdqa (_ZETAS_EXP+224*\off+224)*2(%rsi),%ymm2 + +mul 10,3,9,11,14,15,8,2 + +reduce +update 8,4,6,5,7,10,3,9,11 + +vmovdqa %ymm8,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +level0 0 +level0 1 + +levels1t6 0 +levels1t6 1 + +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.h new file mode 100644 index 000000000..a4f48e343 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.h @@ -0,0 +1,28 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include + +#define ntt_avx KYBER_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *r, const __m256i *qdata); +#define invntt_avx KYBER_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *r, const __m256i *qdata); + +#define nttpack_avx KYBER_NAMESPACE(nttpack_avx) +void nttpack_avx(__m256i *r, const __m256i *qdata); +#define nttunpack_avx KYBER_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *r, const __m256i *qdata); + +#define basemul_avx KYBER_NAMESPACE(basemul_avx) +void basemul_avx(__m256i *r, + const __m256i *a, + const __m256i *b, + const __m256i *qdata); + +#define ntttobytes_avx KYBER_NAMESPACE(ntttobytes_avx) +void ntttobytes_avx(uint8_t *r, const __m256i *a, const __m256i *qdata); +#define nttfrombytes_avx KYBER_NAMESPACE(nttfrombytes_avx) +void nttfrombytes_avx(__m256i *r, const uint8_t *a, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/params.h new file mode 100644 index 000000000..fdc688ea2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/params.h @@ -0,0 +1,68 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + +//#define KYBER_90S /* Uncomment this if you want the 90S variant */ + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber512_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_avx2_##s +#endif +#elif (KYBER_K == 3) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber768_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_avx2_##s +#endif +#elif (KYBER_K == 4) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber1024_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_avx2_##s +#endif +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c new file mode 100644 index 000000000..96bad864f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c @@ -0,0 +1,606 @@ +#include +#include +#include +#include "align.h" +#include "fips202x4.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +#if (KYBER_POLYCOMPRESSEDBYTES == 96) +void poly_compress(uint8_t r[96], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 8); + const __m256i mask = _mm256_set1_epi16(7); + const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); + const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, + -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f2 = _mm256_sllv_epi32(f2,sllvdidx); + f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 + f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi32(t0,t1,0x08); + _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[24*i+16],t1); + } +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly * restrict r, const uint8_t a[96]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, + 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); + const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, + 224,28,896,112,14,448,56,7); + const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, + 128,1024,32,256,2048,64,512,4096); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +void poly_compress(uint8_t r[128], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 9); + const __m256i mask = _mm256_set1_epi16(15); + const __m256i shift2 = _mm256_set1_epi16((16 << 8) + 1); + const __m256i permdidx = _mm256_set_epi32(7,3,6,2,5,1,4,0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); + f2 = _mm256_maddubs_epi16(f2,shift2); + f0 = _mm256_packus_epi16(f0,f2); + f0 = _mm256_permutevar8x32_epi32(f0,permdidx); + _mm256_storeu_si256((__m256i *)&r[32*i],f0); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[128]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(7,7,7,7,6,6,6,6,5,5,5,5,4,4,4,4, + 3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0); + const __m256i mask = _mm256_set1_epi32(0x00F0000F); + const __m256i shift = _mm256_set1_epi32((128 << 16) + 2048); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) +void poly_compress(uint8_t r[160], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 10); + const __m256i mask = _mm256_set1_epi16(31); + const __m256i shift2 = _mm256_set1_epi16((32 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8,-1,-1,-1,-1,-1, 4, 3, 2, 1, 0,-1,12,11,10, 9, + -1,12,11,10, 9, 8,-1,-1,-1,-1,-1 ,4, 3, 2, 1, 0); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srlv_epi64(f0,sllvdidx); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[160]) +{ + unsigned int i; + __m128i t; + __m256i f; + int16_t ti; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(9,9,9,8,8,8,8,7,7,6,6,6,6,5,5,5, + 4,4,4,3,3,3,3,2,2,1,1,1,1,0,0,0); + const __m256i mask = _mm256_set_epi16(248,1984,62,496,3968,124,992,31, + 248,1984,62,496,3968,124,992,31); + const __m256i shift = _mm256_set_epi16(128,16,512,64,8,256,32,1024, + 128,16,512,64,8,256,32,1024); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial in NTT representation. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). The coefficients are orderd as output by +* poly_ntt(); the serialized output coefficients are in bitreversed +* order. +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + ntttobytes_avx(r, a->vec, qdata.vec); +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + nttfrombytes_avx(r->vec, a, qdata.vec); +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly * restrict r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ +#if (KYBER_INDCPA_MSGBYTES != 32) +#error "KYBER_INDCPA_MSGBYTES must be equal to 32!" +#endif + __m256i f, g0, g1, g2, g3, h0, h1, h2, h3; + const __m256i shift = _mm256_broadcastsi128_si256(_mm_set_epi32(0,1,2,3)); + const __m256i idx = _mm256_broadcastsi128_si256(_mm_set_epi8(15,14,11,10,7,6,3,2,13,12,9,8,5,4,1,0)); + const __m256i hqs = _mm256_set1_epi16((KYBER_Q+1)/2); + +#define FROMMSG64(i) \ + g3 = _mm256_shuffle_epi32(f,0x55*i); \ + g3 = _mm256_sllv_epi32(g3,shift); \ + g3 = _mm256_shuffle_epi8(g3,idx); \ + g0 = _mm256_slli_epi16(g3,12); \ + g1 = _mm256_slli_epi16(g3,8); \ + g2 = _mm256_slli_epi16(g3,4); \ + g0 = _mm256_srai_epi16(g0,15); \ + g1 = _mm256_srai_epi16(g1,15); \ + g2 = _mm256_srai_epi16(g2,15); \ + g3 = _mm256_srai_epi16(g3,15); \ + g0 = _mm256_and_si256(g0,hqs); /* 19 18 17 16 3 2 1 0 */ \ + g1 = _mm256_and_si256(g1,hqs); /* 23 22 21 20 7 6 5 4 */ \ + g2 = _mm256_and_si256(g2,hqs); /* 27 26 25 24 11 10 9 8 */ \ + g3 = _mm256_and_si256(g3,hqs); /* 31 30 29 28 15 14 13 12 */ \ + h0 = _mm256_unpacklo_epi64(g0,g1); \ + h2 = _mm256_unpackhi_epi64(g0,g1); \ + h1 = _mm256_unpacklo_epi64(g2,g3); \ + h3 = _mm256_unpackhi_epi64(g2,g3); \ + g0 = _mm256_permute2x128_si256(h0,h1,0x20); \ + g2 = _mm256_permute2x128_si256(h0,h1,0x31); \ + g1 = _mm256_permute2x128_si256(h2,h3,0x20); \ + g3 = _mm256_permute2x128_si256(h2,h3,0x31); \ + _mm256_store_si256(&r->vec[0+2*i+0],g0); \ + _mm256_store_si256(&r->vec[0+2*i+1],g1); \ + _mm256_store_si256(&r->vec[8+2*i+0],g2); \ + _mm256_store_si256(&r->vec[8+2*i+1],g3) + + f = _mm256_loadu_si256((__m256i *)msg); + FROMMSG64(0); + FROMMSG64(1); + FROMMSG64(2); + FROMMSG64(3); +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *msg: pointer to output message +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly * restrict a) +{ + unsigned int i; + uint32_t small; + __m256i f0, f1, g0, g1; + const __m256i hq = _mm256_set1_epi16((KYBER_Q - 1)/2); + const __m256i hhq = _mm256_set1_epi16((KYBER_Q - 1)/4); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_sub_epi16(hq, f0); + f1 = _mm256_sub_epi16(hq, f1); + g0 = _mm256_srai_epi16(f0, 15); + g1 = _mm256_srai_epi16(f1, 15); + f0 = _mm256_xor_si256(f0, g0); + f1 = _mm256_xor_si256(f1, g1); + f0 = _mm256_sub_epi16(f0, hhq); + f1 = _mm256_sub_epi16(f1, hhq); + f0 = _mm256_packs_epi16(f0, f1); + f0 = _mm256_permute4x64_epi64(f0, 0xD8); + small = _mm256_movemask_epi8(f0); + memcpy(&msg[4*i], &small, 4); + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA1*KYBER_N/4+32) buf; // +32 bytes as required by poly_cbd_eta1 + prf(buf.coeffs, KYBER_ETA1*KYBER_N/4, seed, nonce); + poly_cbd_eta1(r, buf.vec); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA2*KYBER_N/4) buf; + prf(buf.coeffs, KYBER_ETA2*KYBER_N/4, seed, nonce); + poly_cbd_eta2(r, buf.vec); +} + +#ifndef KYBER_90S +#define NOISE_NBLOCKS ((KYBER_ETA1*KYBER_N/4+SHAKE256_RATE-1)/SHAKE256_RATE) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta1(r2, buf[2].vec); + poly_cbd_eta1(r3, buf[3].vec); +} + +#if KYBER_K == 2 +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta2(r2, buf[2].vec); + poly_cbd_eta2(r3, buf[3].vec); +} +#endif +#endif + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place. +* Input coefficients assumed to be in normal order, +* output coefficients are in special order that is natural +* for the vectorization. Input coefficients are assumed to be +* bounded by q in absolute value, output coefficients are bounded +* by 16118 in absolute value. +* +* Arguments: - poly *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* Input coefficients assumed to be in special order from vectorized +* forward ntt, output in normal order. Input coefficients can be +* arbitrary 16-bit integers, output coefficients are bounded by 14870 +* in absolute value. +* +* Arguments: - poly *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt_avx(r->vec, qdata.vec); +} + +void poly_nttunpack(poly *r) +{ + nttunpack_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain. +* One of the input polynomials needs to have coefficients +* bounded by q, the other polynomial can have arbitrary +* coefficients. Output coefficients are bounded by 6656. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + basemul_avx(r->vec, a->vec, b->vec, qdata.vec); +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + tomont_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + reduce_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_add_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_sub_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.h new file mode 100644 index 000000000..6a9cf71c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.h @@ -0,0 +1,77 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" + +typedef ALIGNED_INT16(KYBER_N) poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#ifndef KYBER_90S +#define poly_getnoise_eta1_4x KYBER_NAMESPACE(poly_getnoise_eta2_4x) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); + +#if KYBER_K == 2 +#define poly_getnoise_eta1122_4x KYBER_NAMESPACE(poly_getnoise_eta1122_4x) +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); +#endif +#endif + + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_nttunpack KYBER_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c new file mode 100644 index 000000000..a0174b7b3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c @@ -0,0 +1,307 @@ +#include +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) +static void poly_compress10(uint8_t r[320], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(15); + const __m256i shift1 = _mm256_set1_epi16(1 << 12); + const __m256i mask = _mm256_set1_epi16(1023); + const __m256i shift2 = _mm256_set1_epi64x((1024LL << 48) + (1LL << 32) + (1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8, 4, 3, 2, 1, 0,-1,-1,-1,-1,-1,-1,12,11,10, 9, + -1,-1,-1,-1,-1,-1,12,11,10, 9, 8, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srli_epi64(f0,12); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi16(t0,t1,0xE0); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +static void poly_decompress10(poly * restrict r, const uint8_t a[320+12]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_set1_epi32((KYBER_Q << 16) + 4*KYBER_Q); + const __m256i shufbidx = _mm256_set_epi8(11,10,10, 9, 9, 8, 8, 7, + 6, 5, 5, 4, 4, 3, 3, 2, + 9, 8, 8, 7, 7, 6, 6, 5, + 4, 3, 3, 2, 2, 1, 1, 0); + const __m256i sllvdidx = _mm256_set1_epi64x(4); + const __m256i mask = _mm256_set1_epi32((32736 << 16) + 8184); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) +static void poly_compress11(uint8_t r[352+2], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(36); + const __m256i shift1 = _mm256_set1_epi16(1 << 13); + const __m256i mask = _mm256_set1_epi16(2047); + const __m256i shift2 = _mm256_set1_epi64x((2048LL << 48) + (1LL << 32) + (2048 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(10); + const __m256i srlvqidx = _mm256_set_epi64x(30,10,30,10); + const __m256i shufbidx = _mm256_set_epi8( 4, 3, 2, 1, 0, 0,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, + -1,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f1 = _mm256_bsrli_epi128(f0,8); + f0 = _mm256_srlv_epi64(f0,srlvqidx); + f1 = _mm256_slli_epi64(f1,34); + f0 = _mm256_add_epi64(f0,f1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[22*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[22*i+16],t1); + } +} + +static void poly_decompress11(poly * restrict r, const uint8_t a[352+10]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(13,12,12,11,10, 9, 9, 8, + 8, 7, 6, 5, 5, 4, 4, 3, + 10, 9, 9, 8, 7, 6, 6, 5, + 5, 4, 3, 2, 2, 1, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(0,0,1,0,0,0,1,0); + const __m256i srlvqidx = _mm256_set_epi64x(2,0,2,0); + const __m256i shift = _mm256_set_epi16(4,32,1,8,32,1,4,32,4,32,1,8,32,1,4,32); + const __m256i mask = _mm256_set1_epi16(32752); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i]); +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i],&a[320*i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i],&a[352*i]); +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements in a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly tmp; + + poly_basemul_montgomery(r,&a->vec[0],&b->vec[0]); + for(i=1;ivec[i],&b->vec[i]); + poly_add(r,r,&tmp); + } +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.h new file mode 100644 index 000000000..2ce23c31f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/reduce.h new file mode 100644 index 000000000..5368185b5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/reduce.h @@ -0,0 +1,12 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include "params.h" +#include + +#define reduce_avx KYBER_NAMESPACE(reduce_avx) +void reduce_avx(__m256i *r, const __m256i *qdata); +#define tomont_avx KYBER_NAMESPACE(tomont_avx) +void tomont_avx(__m256i *r, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c new file mode 100644 index 000000000..9060a44cb --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c @@ -0,0 +1,398 @@ +#include +#include +#include +#include "params.h" +#include "consts.h" +#include "rejsample.h" + +//#define BMI + +#ifndef BMI +static const uint8_t idx[256][8] = { + {-1, -1, -1, -1, -1, -1, -1, -1}, + { 0, -1, -1, -1, -1, -1, -1, -1}, + { 2, -1, -1, -1, -1, -1, -1, -1}, + { 0, 2, -1, -1, -1, -1, -1, -1}, + { 4, -1, -1, -1, -1, -1, -1, -1}, + { 0, 4, -1, -1, -1, -1, -1, -1}, + { 2, 4, -1, -1, -1, -1, -1, -1}, + { 0, 2, 4, -1, -1, -1, -1, -1}, + { 6, -1, -1, -1, -1, -1, -1, -1}, + { 0, 6, -1, -1, -1, -1, -1, -1}, + { 2, 6, -1, -1, -1, -1, -1, -1}, + { 0, 2, 6, -1, -1, -1, -1, -1}, + { 4, 6, -1, -1, -1, -1, -1, -1}, + { 0, 4, 6, -1, -1, -1, -1, -1}, + { 2, 4, 6, -1, -1, -1, -1, -1}, + { 0, 2, 4, 6, -1, -1, -1, -1}, + { 8, -1, -1, -1, -1, -1, -1, -1}, + { 0, 8, -1, -1, -1, -1, -1, -1}, + { 2, 8, -1, -1, -1, -1, -1, -1}, + { 0, 2, 8, -1, -1, -1, -1, -1}, + { 4, 8, -1, -1, -1, -1, -1, -1}, + { 0, 4, 8, -1, -1, -1, -1, -1}, + { 2, 4, 8, -1, -1, -1, -1, -1}, + { 0, 2, 4, 8, -1, -1, -1, -1}, + { 6, 8, -1, -1, -1, -1, -1, -1}, + { 0, 6, 8, -1, -1, -1, -1, -1}, + { 2, 6, 8, -1, -1, -1, -1, -1}, + { 0, 2, 6, 8, -1, -1, -1, -1}, + { 4, 6, 8, -1, -1, -1, -1, -1}, + { 0, 4, 6, 8, -1, -1, -1, -1}, + { 2, 4, 6, 8, -1, -1, -1, -1}, + { 0, 2, 4, 6, 8, -1, -1, -1}, + {10, -1, -1, -1, -1, -1, -1, -1}, + { 0, 10, -1, -1, -1, -1, -1, -1}, + { 2, 10, -1, -1, -1, -1, -1, -1}, + { 0, 2, 10, -1, -1, -1, -1, -1}, + { 4, 10, -1, -1, -1, -1, -1, -1}, + { 0, 4, 10, -1, -1, -1, -1, -1}, + { 2, 4, 10, -1, -1, -1, -1, -1}, + { 0, 2, 4, 10, -1, -1, -1, -1}, + { 6, 10, -1, -1, -1, -1, -1, -1}, + { 0, 6, 10, -1, -1, -1, -1, -1}, + { 2, 6, 10, -1, -1, -1, -1, -1}, + { 0, 2, 6, 10, -1, -1, -1, -1}, + { 4, 6, 10, -1, -1, -1, -1, -1}, + { 0, 4, 6, 10, -1, -1, -1, -1}, + { 2, 4, 6, 10, -1, -1, -1, -1}, + { 0, 2, 4, 6, 10, -1, -1, -1}, + { 8, 10, -1, -1, -1, -1, -1, -1}, + { 0, 8, 10, -1, -1, -1, -1, -1}, + { 2, 8, 10, -1, -1, -1, -1, -1}, + { 0, 2, 8, 10, -1, -1, -1, -1}, + { 4, 8, 10, -1, -1, -1, -1, -1}, + { 0, 4, 8, 10, -1, -1, -1, -1}, + { 2, 4, 8, 10, -1, -1, -1, -1}, + { 0, 2, 4, 8, 10, -1, -1, -1}, + { 6, 8, 10, -1, -1, -1, -1, -1}, + { 0, 6, 8, 10, -1, -1, -1, -1}, + { 2, 6, 8, 10, -1, -1, -1, -1}, + { 0, 2, 6, 8, 10, -1, -1, -1}, + { 4, 6, 8, 10, -1, -1, -1, -1}, + { 0, 4, 6, 8, 10, -1, -1, -1}, + { 2, 4, 6, 8, 10, -1, -1, -1}, + { 0, 2, 4, 6, 8, 10, -1, -1}, + {12, -1, -1, -1, -1, -1, -1, -1}, + { 0, 12, -1, -1, -1, -1, -1, -1}, + { 2, 12, -1, -1, -1, -1, -1, -1}, + { 0, 2, 12, -1, -1, -1, -1, -1}, + { 4, 12, -1, -1, -1, -1, -1, -1}, + { 0, 4, 12, -1, -1, -1, -1, -1}, + { 2, 4, 12, -1, -1, -1, -1, -1}, + { 0, 2, 4, 12, -1, -1, -1, -1}, + { 6, 12, -1, -1, -1, -1, -1, -1}, + { 0, 6, 12, -1, -1, -1, -1, -1}, + { 2, 6, 12, -1, -1, -1, -1, -1}, + { 0, 2, 6, 12, -1, -1, -1, -1}, + { 4, 6, 12, -1, -1, -1, -1, -1}, + { 0, 4, 6, 12, -1, -1, -1, -1}, + { 2, 4, 6, 12, -1, -1, -1, -1}, + { 0, 2, 4, 6, 12, -1, -1, -1}, + { 8, 12, -1, -1, -1, -1, -1, -1}, + { 0, 8, 12, -1, -1, -1, -1, -1}, + { 2, 8, 12, -1, -1, -1, -1, -1}, + { 0, 2, 8, 12, -1, -1, -1, -1}, + { 4, 8, 12, -1, -1, -1, -1, -1}, + { 0, 4, 8, 12, -1, -1, -1, -1}, + { 2, 4, 8, 12, -1, -1, -1, -1}, + { 0, 2, 4, 8, 12, -1, -1, -1}, + { 6, 8, 12, -1, -1, -1, -1, -1}, + { 0, 6, 8, 12, -1, -1, -1, -1}, + { 2, 6, 8, 12, -1, -1, -1, -1}, + { 0, 2, 6, 8, 12, -1, -1, -1}, + { 4, 6, 8, 12, -1, -1, -1, -1}, + { 0, 4, 6, 8, 12, -1, -1, -1}, + { 2, 4, 6, 8, 12, -1, -1, -1}, + { 0, 2, 4, 6, 8, 12, -1, -1}, + {10, 12, -1, -1, -1, -1, -1, -1}, + { 0, 10, 12, -1, -1, -1, -1, -1}, + { 2, 10, 12, -1, -1, -1, -1, -1}, + { 0, 2, 10, 12, -1, -1, -1, -1}, + { 4, 10, 12, -1, -1, -1, -1, -1}, + { 0, 4, 10, 12, -1, -1, -1, -1}, + { 2, 4, 10, 12, -1, -1, -1, -1}, + { 0, 2, 4, 10, 12, -1, -1, -1}, + { 6, 10, 12, -1, -1, -1, -1, -1}, + { 0, 6, 10, 12, -1, -1, -1, -1}, + { 2, 6, 10, 12, -1, -1, -1, -1}, + { 0, 2, 6, 10, 12, -1, -1, -1}, + { 4, 6, 10, 12, -1, -1, -1, -1}, + { 0, 4, 6, 10, 12, -1, -1, -1}, + { 2, 4, 6, 10, 12, -1, -1, -1}, + { 0, 2, 4, 6, 10, 12, -1, -1}, + { 8, 10, 12, -1, -1, -1, -1, -1}, + { 0, 8, 10, 12, -1, -1, -1, -1}, + { 2, 8, 10, 12, -1, -1, -1, -1}, + { 0, 2, 8, 10, 12, -1, -1, -1}, + { 4, 8, 10, 12, -1, -1, -1, -1}, + { 0, 4, 8, 10, 12, -1, -1, -1}, + { 2, 4, 8, 10, 12, -1, -1, -1}, + { 0, 2, 4, 8, 10, 12, -1, -1}, + { 6, 8, 10, 12, -1, -1, -1, -1}, + { 0, 6, 8, 10, 12, -1, -1, -1}, + { 2, 6, 8, 10, 12, -1, -1, -1}, + { 0, 2, 6, 8, 10, 12, -1, -1}, + { 4, 6, 8, 10, 12, -1, -1, -1}, + { 0, 4, 6, 8, 10, 12, -1, -1}, + { 2, 4, 6, 8, 10, 12, -1, -1}, + { 0, 2, 4, 6, 8, 10, 12, -1}, + {14, -1, -1, -1, -1, -1, -1, -1}, + { 0, 14, -1, -1, -1, -1, -1, -1}, + { 2, 14, -1, -1, -1, -1, -1, -1}, + { 0, 2, 14, -1, -1, -1, -1, -1}, + { 4, 14, -1, -1, -1, -1, -1, -1}, + { 0, 4, 14, -1, -1, -1, -1, -1}, + { 2, 4, 14, -1, -1, -1, -1, -1}, + { 0, 2, 4, 14, -1, -1, -1, -1}, + { 6, 14, -1, -1, -1, -1, -1, -1}, + { 0, 6, 14, -1, -1, -1, -1, -1}, + { 2, 6, 14, -1, -1, -1, -1, -1}, + { 0, 2, 6, 14, -1, -1, -1, -1}, + { 4, 6, 14, -1, -1, -1, -1, -1}, + { 0, 4, 6, 14, -1, -1, -1, -1}, + { 2, 4, 6, 14, -1, -1, -1, -1}, + { 0, 2, 4, 6, 14, -1, -1, -1}, + { 8, 14, -1, -1, -1, -1, -1, -1}, + { 0, 8, 14, -1, -1, -1, -1, -1}, + { 2, 8, 14, -1, -1, -1, -1, -1}, + { 0, 2, 8, 14, -1, -1, -1, -1}, + { 4, 8, 14, -1, -1, -1, -1, -1}, + { 0, 4, 8, 14, -1, -1, -1, -1}, + { 2, 4, 8, 14, -1, -1, -1, -1}, + { 0, 2, 4, 8, 14, -1, -1, -1}, + { 6, 8, 14, -1, -1, -1, -1, -1}, + { 0, 6, 8, 14, -1, -1, -1, -1}, + { 2, 6, 8, 14, -1, -1, -1, -1}, + { 0, 2, 6, 8, 14, -1, -1, -1}, + { 4, 6, 8, 14, -1, -1, -1, -1}, + { 0, 4, 6, 8, 14, -1, -1, -1}, + { 2, 4, 6, 8, 14, -1, -1, -1}, + { 0, 2, 4, 6, 8, 14, -1, -1}, + {10, 14, -1, -1, -1, -1, -1, -1}, + { 0, 10, 14, -1, -1, -1, -1, -1}, + { 2, 10, 14, -1, -1, -1, -1, -1}, + { 0, 2, 10, 14, -1, -1, -1, -1}, + { 4, 10, 14, -1, -1, -1, -1, -1}, + { 0, 4, 10, 14, -1, -1, -1, -1}, + { 2, 4, 10, 14, -1, -1, -1, -1}, + { 0, 2, 4, 10, 14, -1, -1, -1}, + { 6, 10, 14, -1, -1, -1, -1, -1}, + { 0, 6, 10, 14, -1, -1, -1, -1}, + { 2, 6, 10, 14, -1, -1, -1, -1}, + { 0, 2, 6, 10, 14, -1, -1, -1}, + { 4, 6, 10, 14, -1, -1, -1, -1}, + { 0, 4, 6, 10, 14, -1, -1, -1}, + { 2, 4, 6, 10, 14, -1, -1, -1}, + { 0, 2, 4, 6, 10, 14, -1, -1}, + { 8, 10, 14, -1, -1, -1, -1, -1}, + { 0, 8, 10, 14, -1, -1, -1, -1}, + { 2, 8, 10, 14, -1, -1, -1, -1}, + { 0, 2, 8, 10, 14, -1, -1, -1}, + { 4, 8, 10, 14, -1, -1, -1, -1}, + { 0, 4, 8, 10, 14, -1, -1, -1}, + { 2, 4, 8, 10, 14, -1, -1, -1}, + { 0, 2, 4, 8, 10, 14, -1, -1}, + { 6, 8, 10, 14, -1, -1, -1, -1}, + { 0, 6, 8, 10, 14, -1, -1, -1}, + { 2, 6, 8, 10, 14, -1, -1, -1}, + { 0, 2, 6, 8, 10, 14, -1, -1}, + { 4, 6, 8, 10, 14, -1, -1, -1}, + { 0, 4, 6, 8, 10, 14, -1, -1}, + { 2, 4, 6, 8, 10, 14, -1, -1}, + { 0, 2, 4, 6, 8, 10, 14, -1}, + {12, 14, -1, -1, -1, -1, -1, -1}, + { 0, 12, 14, -1, -1, -1, -1, -1}, + { 2, 12, 14, -1, -1, -1, -1, -1}, + { 0, 2, 12, 14, -1, -1, -1, -1}, + { 4, 12, 14, -1, -1, -1, -1, -1}, + { 0, 4, 12, 14, -1, -1, -1, -1}, + { 2, 4, 12, 14, -1, -1, -1, -1}, + { 0, 2, 4, 12, 14, -1, -1, -1}, + { 6, 12, 14, -1, -1, -1, -1, -1}, + { 0, 6, 12, 14, -1, -1, -1, -1}, + { 2, 6, 12, 14, -1, -1, -1, -1}, + { 0, 2, 6, 12, 14, -1, -1, -1}, + { 4, 6, 12, 14, -1, -1, -1, -1}, + { 0, 4, 6, 12, 14, -1, -1, -1}, + { 2, 4, 6, 12, 14, -1, -1, -1}, + { 0, 2, 4, 6, 12, 14, -1, -1}, + { 8, 12, 14, -1, -1, -1, -1, -1}, + { 0, 8, 12, 14, -1, -1, -1, -1}, + { 2, 8, 12, 14, -1, -1, -1, -1}, + { 0, 2, 8, 12, 14, -1, -1, -1}, + { 4, 8, 12, 14, -1, -1, -1, -1}, + { 0, 4, 8, 12, 14, -1, -1, -1}, + { 2, 4, 8, 12, 14, -1, -1, -1}, + { 0, 2, 4, 8, 12, 14, -1, -1}, + { 6, 8, 12, 14, -1, -1, -1, -1}, + { 0, 6, 8, 12, 14, -1, -1, -1}, + { 2, 6, 8, 12, 14, -1, -1, -1}, + { 0, 2, 6, 8, 12, 14, -1, -1}, + { 4, 6, 8, 12, 14, -1, -1, -1}, + { 0, 4, 6, 8, 12, 14, -1, -1}, + { 2, 4, 6, 8, 12, 14, -1, -1}, + { 0, 2, 4, 6, 8, 12, 14, -1}, + {10, 12, 14, -1, -1, -1, -1, -1}, + { 0, 10, 12, 14, -1, -1, -1, -1}, + { 2, 10, 12, 14, -1, -1, -1, -1}, + { 0, 2, 10, 12, 14, -1, -1, -1}, + { 4, 10, 12, 14, -1, -1, -1, -1}, + { 0, 4, 10, 12, 14, -1, -1, -1}, + { 2, 4, 10, 12, 14, -1, -1, -1}, + { 0, 2, 4, 10, 12, 14, -1, -1}, + { 6, 10, 12, 14, -1, -1, -1, -1}, + { 0, 6, 10, 12, 14, -1, -1, -1}, + { 2, 6, 10, 12, 14, -1, -1, -1}, + { 0, 2, 6, 10, 12, 14, -1, -1}, + { 4, 6, 10, 12, 14, -1, -1, -1}, + { 0, 4, 6, 10, 12, 14, -1, -1}, + { 2, 4, 6, 10, 12, 14, -1, -1}, + { 0, 2, 4, 6, 10, 12, 14, -1}, + { 8, 10, 12, 14, -1, -1, -1, -1}, + { 0, 8, 10, 12, 14, -1, -1, -1}, + { 2, 8, 10, 12, 14, -1, -1, -1}, + { 0, 2, 8, 10, 12, 14, -1, -1}, + { 4, 8, 10, 12, 14, -1, -1, -1}, + { 0, 4, 8, 10, 12, 14, -1, -1}, + { 2, 4, 8, 10, 12, 14, -1, -1}, + { 0, 2, 4, 8, 10, 12, 14, -1}, + { 6, 8, 10, 12, 14, -1, -1, -1}, + { 0, 6, 8, 10, 12, 14, -1, -1}, + { 2, 6, 8, 10, 12, 14, -1, -1}, + { 0, 2, 6, 8, 10, 12, 14, -1}, + { 4, 6, 8, 10, 12, 14, -1, -1}, + { 0, 4, 6, 8, 10, 12, 14, -1}, + { 2, 4, 6, 8, 10, 12, 14, -1}, + { 0, 2, 4, 6, 8, 10, 12, 14} +}; +#endif + +#define _mm256_cmpge_epu16(a, b) _mm256_cmpeq_epi16(_mm256_max_epu16(a, b), a) +#define _mm_cmpge_epu16(a, b) _mm_cmpeq_epi16(_mm_max_epu16(a, b), a) + +unsigned int rej_uniform_avx(int16_t * restrict r, const uint8_t *buf) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + uint32_t good; +#ifdef BMI + uint64_t idx0, idx1, idx2, idx3; +#endif + const __m256i bound = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i ones = _mm256_set1_epi8(1); + const __m256i mask = _mm256_set1_epi16(0xFFF); + const __m256i idx8 = _mm256_set_epi8(15,14,14,13,12,11,11,10, + 9, 8, 8, 7, 6, 5, 5, 4, + 11,10,10, 9, 8, 7, 7, 6, + 5, 4, 4, 3, 2, 1, 1, 0); + __m256i f0, f1, g0, g1, g2, g3; + __m128i f, t, pilo, pihi; + + ctr = pos = 0; + while(ctr <= KYBER_N - 32 && pos <= REJ_UNIFORM_AVX_BUFLEN - 56) { + f0 = _mm256_loadu_si256((__m256i *)&buf[pos]); + f1 = _mm256_loadu_si256((__m256i *)&buf[pos+24]); + f0 = _mm256_permute4x64_epi64(f0, 0x94); + f1 = _mm256_permute4x64_epi64(f1, 0x94); + f0 = _mm256_shuffle_epi8(f0, idx8); + f1 = _mm256_shuffle_epi8(f1, idx8); + g0 = _mm256_srli_epi16(f0, 4); + g1 = _mm256_srli_epi16(f1, 4); + f0 = _mm256_blend_epi16(f0, g0, 0xAA); + f1 = _mm256_blend_epi16(f1, g1, 0xAA); + f0 = _mm256_and_si256(f0, mask); + f1 = _mm256_and_si256(f1, mask); + pos += 48; + + g0 = _mm256_cmpgt_epi16(bound, f0); + g1 = _mm256_cmpgt_epi16(bound, f1); + + g0 = _mm256_packs_epi16(g0, g1); + good = _mm256_movemask_epi8(g0); + +#ifdef BMI + idx0 = _pdep_u64(good >> 0, 0x0101010101010101); + idx1 = _pdep_u64(good >> 8, 0x0101010101010101); + idx2 = _pdep_u64(good >> 16, 0x0101010101010101); + idx3 = _pdep_u64(good >> 24, 0x0101010101010101); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + idx1 = (idx1 << 8) - idx1; + idx1 = _pext_u64(0x0E0C0A0806040200, idx1); + idx2 = (idx2 << 8) - idx2; + idx2 = _pext_u64(0x0E0C0A0806040200, idx2); + idx3 = (idx3 << 8) - idx3; + idx3 = _pext_u64(0x0E0C0A0806040200, idx3); + + g0 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx0)); + g1 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx1)); + g0 = _mm256_inserti128_si256(g0, _mm_cvtsi64_si128(idx2), 1); + g1 = _mm256_inserti128_si256(g1, _mm_cvtsi64_si128(idx3), 1); +#else + g0 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 0) & 0xFF])); + g1 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 8) & 0xFF])); + g0 = _mm256_inserti128_si256(g0, _mm_loadl_epi64((__m128i *)&idx[(good >> 16) & 0xFF]), 1); + g1 = _mm256_inserti128_si256(g1, _mm_loadl_epi64((__m128i *)&idx[(good >> 24) & 0xFF]), 1); +#endif + + g2 = _mm256_add_epi8(g0, ones); + g3 = _mm256_add_epi8(g1, ones); + g0 = _mm256_unpacklo_epi8(g0, g2); + g1 = _mm256_unpacklo_epi8(g1, g3); + + f0 = _mm256_shuffle_epi8(f0, g0); + f1 = _mm256_shuffle_epi8(f1, g1); + + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f0)); + ctr += _mm_popcnt_u32((good >> 0) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f0, 1)); + ctr += _mm_popcnt_u32((good >> 16) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f1)); + ctr += _mm_popcnt_u32((good >> 8) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f1, 1)); + ctr += _mm_popcnt_u32((good >> 24) & 0xFF); + } + + while(ctr <= KYBER_N - 8 && pos <= REJ_UNIFORM_AVX_BUFLEN - 16) { + f = _mm_loadu_si128((__m128i *)&buf[pos]); + f = _mm_shuffle_epi8(f, _mm256_castsi256_si128(idx8)); + t = _mm_srli_epi16(f, 4); + f = _mm_blend_epi16(f, t, 0xAA); + f = _mm_and_si128(f, _mm256_castsi256_si128(mask)); + pos += 12; + + t = _mm_cmpgt_epi16(_mm256_castsi256_si128(bound), f); + good = _mm_movemask_epi8(t); + +#ifdef BMI + good &= 0x5555; + idx0 = _pdep_u64(good, 0x1111111111111111); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + pilo = _mm_cvtsi64_si128(idx0); +#else + good = _pext_u32(good, 0x5555); + pilo = _mm_loadl_epi64((__m128i *)&idx[good]); +#endif + + pihi = _mm_add_epi8(pilo, _mm256_castsi256_si128(ones)); + pilo = _mm_unpacklo_epi8(pilo, pihi); + f = _mm_shuffle_epi8(f, pilo); + _mm_storeu_si128((__m128i *)&r[ctr], f); + ctr += _mm_popcnt_u32(good); + } + + while(ctr < KYBER_N && pos <= REJ_UNIFORM_AVX_BUFLEN - 3) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)); + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(val1 < KYBER_Q && ctr < KYBER_N) + r[ctr++] = val1; + } + + return ctr; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.h new file mode 100644 index 000000000..3be5e2192 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.h @@ -0,0 +1,14 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_AVX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +#define REJ_UNIFORM_AVX_BUFLEN (REJ_UNIFORM_AVX_NBLOCKS*XOF_BLOCKBYTES) + +#define rej_uniform_avx KYBER_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int16_t *r, const uint8_t *buf); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S new file mode 100644 index 000000000..18325ebec --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S @@ -0,0 +1,255 @@ +#include "consts.h" +.include "fq.inc" +.include "shuffle.inc" + +/* +nttpack_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +#store +vmovdqa %ymm7,(%rdi) +vmovdqa %ymm9,32(%rdi) +vmovdqa %ymm6,64(%rdi) +vmovdqa %ymm3,96(%rdi) +vmovdqa %ymm10,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm5,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret +*/ + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +shuffle1 9,5,10,5 +shuffle1 8,4,9,4 +shuffle1 7,3,8,3 +shuffle1 6,11,7,11 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm5,32(%rdi) +vmovdqa %ymm9,64(%rdi) +vmovdqa %ymm4,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm3,160(%rdi) +vmovdqa %ymm7,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret + +ntttobytes128_avx: +#load +vmovdqa (%rsi),%ymm5 +vmovdqa 32(%rsi),%ymm6 +vmovdqa 64(%rsi),%ymm7 +vmovdqa 96(%rsi),%ymm8 +vmovdqa 128(%rsi),%ymm9 +vmovdqa 160(%rsi),%ymm10 +vmovdqa 192(%rsi),%ymm11 +vmovdqa 224(%rsi),%ymm12 + +#csubq +csubq 5,13 +csubq 6,13 +csubq 7,13 +csubq 8,13 +csubq 9,13 +csubq 10,13 +csubq 11,13 +csubq 12,13 + +#bitpack +vpsllw $12,%ymm6,%ymm4 +vpor %ymm4,%ymm5,%ymm4 + +vpsrlw $4,%ymm6,%ymm5 +vpsllw $8,%ymm7,%ymm6 +vpor %ymm5,%ymm6,%ymm5 + +vpsrlw $8,%ymm7,%ymm6 +vpsllw $4,%ymm8,%ymm7 +vpor %ymm6,%ymm7,%ymm6 + +vpsllw $12,%ymm10,%ymm7 +vpor %ymm7,%ymm9,%ymm7 + +vpsrlw $4,%ymm10,%ymm8 +vpsllw $8,%ymm11,%ymm9 +vpor %ymm8,%ymm9,%ymm8 + +vpsrlw $8,%ymm11,%ymm9 +vpsllw $4,%ymm12,%ymm10 +vpor %ymm9,%ymm10,%ymm9 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 + +shuffle2 3,4,8,4 +shuffle2 6,5,3,5 +shuffle2 7,9,6,9 + +shuffle4 8,3,7,3 +shuffle4 6,4,8,4 +shuffle4 5,9,6,9 + +shuffle8 7,8,5,8 +shuffle8 6,3,7,3 +shuffle8 4,9,6,9 + +#store +vmovdqu %ymm5,(%rdi) +vmovdqu %ymm7,32(%rdi) +vmovdqu %ymm6,64(%rdi) +vmovdqu %ymm8,96(%rdi) +vmovdqu %ymm3,128(%rdi) +vmovdqu %ymm9,160(%rdi) + +ret + +.global cdecl(ntttobytes_avx) +cdecl(ntttobytes_avx): +#consts +vmovdqa _16XQ*2(%rdx),%ymm0 +call ntttobytes128_avx +add $256,%rsi +add $192,%rdi +call ntttobytes128_avx +ret + +nttfrombytes128_avx: +#load +vmovdqu (%rsi),%ymm4 +vmovdqu 32(%rsi),%ymm5 +vmovdqu 64(%rsi),%ymm6 +vmovdqu 96(%rsi),%ymm7 +vmovdqu 128(%rsi),%ymm8 +vmovdqu 160(%rsi),%ymm9 + +shuffle8 4,7,3,7 +shuffle8 5,8,4,8 +shuffle8 6,9,5,9 + +shuffle4 3,8,6,8 +shuffle4 7,5,3,5 +shuffle4 4,9,7,9 + +shuffle2 6,5,4,5 +shuffle2 8,7,6,7 +shuffle2 3,9,8,9 + +shuffle1 4,7,10,7 +shuffle1 5,8,4,8 +shuffle1 6,9,5,9 + +#bitunpack +vpsrlw $12,%ymm10,%ymm11 +vpsllw $4,%ymm7,%ymm12 +vpor %ymm11,%ymm12,%ymm11 +vpand %ymm0,%ymm10,%ymm10 +vpand %ymm0,%ymm11,%ymm11 + +vpsrlw $8,%ymm7,%ymm12 +vpsllw $8,%ymm4,%ymm13 +vpor %ymm12,%ymm13,%ymm12 +vpand %ymm0,%ymm12,%ymm12 + +vpsrlw $4,%ymm4,%ymm13 +vpand %ymm0,%ymm13,%ymm13 + +vpsrlw $12,%ymm8,%ymm14 +vpsllw $4,%ymm5,%ymm15 +vpor %ymm14,%ymm15,%ymm14 +vpand %ymm0,%ymm8,%ymm8 +vpand %ymm0,%ymm14,%ymm14 + +vpsrlw $8,%ymm5,%ymm15 +vpsllw $8,%ymm9,%ymm1 +vpor %ymm15,%ymm1,%ymm15 +vpand %ymm0,%ymm15,%ymm15 + +vpsrlw $4,%ymm9,%ymm1 +vpand %ymm0,%ymm1,%ymm1 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm11,32(%rdi) +vmovdqa %ymm12,64(%rdi) +vmovdqa %ymm13,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm14,160(%rdi) +vmovdqa %ymm15,192(%rdi) +vmovdqa %ymm1,224(%rdi) + +ret + +.global cdecl(nttfrombytes_avx) +cdecl(nttfrombytes_avx): +#consts +vmovdqa _16XMASK*2(%rdx),%ymm0 +call nttfrombytes128_avx +add $256,%rdi +add $192,%rsi +call nttfrombytes128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric.h new file mode 100644 index 000000000..e4941f7a8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric.h @@ -0,0 +1,34 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" +#include "fips202x4.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c new file mode 100644 index 000000000..aa8e2850b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint64_t r; + __m256i f, g, h; + + h = _mm256_setzero_si256(); + for(i=0;i> 63; + return r; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t * restrict r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + __m256i xvec, rvec, bvec; + + bvec = _mm256_set1_epi64x(-(uint64_t)b); + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/api.h new file mode 100644 index 000000000..70d40f3f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_ref_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_ref_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_ref_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_ref_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_ref_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_ref_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_ref_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_ref_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_ref_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_ref_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_ref_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_ref_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_ref_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_ref_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_ref_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_ref_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_ref_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_ref_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c new file mode 100644 index 000000000..1500ffea5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c @@ -0,0 +1,128 @@ +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: load32_littleendian +* +* Description: load 4 bytes into a 32-bit integer +* in little-endian order +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x +**************************************************/ +static uint32_t load32_littleendian(const uint8_t x[4]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + r |= (uint32_t)x[3] << 24; + return r; +} + +/************************************************* +* Name: load24_littleendian +* +* Description: load 3 bytes into a 32-bit integer +* in little-endian order. +* This function is only needed for Kyber-512 +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x (most significant byte is zero) +**************************************************/ +#if KYBER_ETA1 == 3 +static uint32_t load24_littleendian(const uint8_t x[3]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + return r; +} +#endif + + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +static void cbd2(poly *r, const uint8_t buf[2*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x55555555; + + for(j=0;j<8;j++) { + a = (d >> (4*j+0)) & 0x3; + b = (d >> (4*j+2)) & 0x3; + r->coeffs[8*i+j] = a - b; + } + } +} + +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3. +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +#if KYBER_ETA1 == 3 +static void cbd3(poly *r, const uint8_t buf[3*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x00249249; + d += (t>>2) & 0x00249249; + + for(j=0;j<4;j++) { + a = (d >> (6*j+0)) & 0x7; + b = (d >> (6*j+3)) & 0x7; + r->coeffs[4*i+j] = a - b; + } + } +} +#endif + +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.h new file mode 100644 index 000000000..7b677d745 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.h @@ -0,0 +1,14 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c new file mode 100644 index 000000000..4a8b4c894 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c @@ -0,0 +1,331 @@ +#include +#include +#include +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk +* and the public seed used to generate the matrix A. +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output buffer +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#define GEN_MATRIX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +// Not static for benchmarking +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) +{ + unsigned int ctr, i, j, k; + unsigned int buflen, off; + uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; + xof_state state; + xof_init(&state, seed); + + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c new file mode 100644 index 000000000..2f2eb10b2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c @@ -0,0 +1,146 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +/* Code to generate zetas and zetas_inv used in the number-theoretic transform: + +#define KYBER_ROOT_OF_UNITY 17 + +static const uint8_t tree[128] = { + 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, + 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, + 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, + 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, + 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, + 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, + 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, + 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127 +}; + +void init_ntt() { + unsigned int i; + int16_t tmp[128]; + + tmp[0] = MONT; + for(i=1;i<128;i++) + tmp[i] = fqmul(tmp[i-1],MONT*KYBER_ROOT_OF_UNITY % KYBER_Q); + + for(i=0;i<128;i++) { + zetas[i] = tmp[tree[i]]; + if(zetas[i] > KYBER_Q/2) + zetas[i] -= KYBER_Q; + if(zetas[i] < -KYBER_Q/2) + zetas[i] += KYBER_Q; + } +} +*/ + +const int16_t zetas[128] = { + -1044, -758, -359, -1517, 1493, 1422, 287, 202, + -171, 622, 1577, 182, 962, -1202, -1474, 1468, + 573, -1325, 264, 383, -829, 1458, -1602, -130, + -681, 1017, 732, 608, -1542, 411, -205, -1571, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -1103, 430, 555, 843, -1251, 871, 1550, 105, + 422, 587, 177, -235, -291, -460, 1574, 1653, + -246, 778, 1159, -147, -777, 1483, -602, 1119, + -1590, 644, -872, 349, 418, 329, -156, -75, + 817, 1097, 603, 610, 1322, -1285, -1465, 384, + -1215, -136, 1218, -1335, -874, 220, -1187, -1659, + -1185, -1530, -1278, 794, -1510, -854, -870, 478, + -108, -308, 996, 991, 958, -1460, 1522, 1628 +}; + +/************************************************* +* Name: fqmul +* +* Description: Multiplication followed by Montgomery reduction +* +* Arguments: - int16_t a: first factor +* - int16_t b: second factor +* +* Returns 16-bit integer congruent to a*b*R^{-1} mod q +**************************************************/ +static int16_t fqmul(int16_t a, int16_t b) { + return montgomery_reduce((int32_t)a*b); +} + +/************************************************* +* Name: ntt +* +* Description: Inplace number-theoretic transform (NTT) in Rq. +* input is in standard order, output is in bitreversed order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void ntt(int16_t r[256]) { + unsigned int len, start, j, k; + int16_t t, zeta; + + k = 1; + for(len = 128; len >= 2; len >>= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k++]; + for(j = start; j < start + len; j++) { + t = fqmul(zeta, r[j + len]); + r[j + len] = r[j] - t; + r[j] = r[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inplace inverse number-theoretic transform in Rq and +* multiplication by Montgomery factor 2^16. +* Input is in bitreversed order, output is in standard order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void invntt(int16_t r[256]) { + unsigned int start, len, j, k; + int16_t t, zeta; + const int16_t f = 1441; // mont^2/128 + + k = 127; + for(len = 2; len <= 128; len <<= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k--]; + for(j = start; j < start + len; j++) { + t = r[j]; + r[j] = barrett_reduce(t + r[j + len]); + r[j + len] = r[j + len] - t; + r[j + len] = fqmul(zeta, r[j + len]); + } + } + } + + for(j = 0; j < 256; j++) + r[j] = fqmul(r[j], f); +} + +/************************************************* +* Name: basemul +* +* Description: Multiplication of polynomials in Zq[X]/(X^2-zeta) +* used for multiplication of elements in Rq in NTT domain +* +* Arguments: - int16_t r[2]: pointer to the output polynomial +* - const int16_t a[2]: pointer to the first factor +* - const int16_t b[2]: pointer to the second factor +* - int16_t zeta: integer defining the reduction polynomial +**************************************************/ +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta) +{ + r[0] = fqmul(a[1], b[1]); + r[0] = fqmul(r[0], zeta); + r[0] += fqmul(a[0], b[0]); + r[1] = fqmul(a[0], b[1]); + r[1] += fqmul(a[1], b[0]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.h new file mode 100644 index 000000000..227ea74f0 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define zetas KYBER_NAMESPACE(zetas) +extern const int16_t zetas[128]; + +#define ntt KYBER_NAMESPACE(ntt) +void ntt(int16_t poly[256]); + +#define invntt KYBER_NAMESPACE(invntt) +void invntt(int16_t poly[256]); + +#define basemul KYBER_NAMESPACE(basemul) +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/params.h new file mode 100644 index 000000000..36b2b987f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/params.h @@ -0,0 +1,55 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_ref_##s +#elif (KYBER_K == 3) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_ref_##s +#elif (KYBER_K == 4) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_ref_##s +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c new file mode 100644 index 000000000..9556ee517 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c @@ -0,0 +1,343 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) +{ + unsigned int i,j; + int16_t u; + uint8_t t[8]; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; + } + + r[0] = t[0] | (t[1] << 4); + r[1] = t[2] | (t[3] << 4); + r[2] = t[4] | (t[5] << 4); + r[3] = t[6] | (t[7] << 4); + r += 4; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; + } + + r[0] = (t[0] >> 0) | (t[1] << 5); + r[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7); + r[2] = (t[3] >> 1) | (t[4] << 4); + r[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6); + r[4] = (t[6] >> 2) | (t[7] << 3); + r += 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]) +{ + unsigned int i; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[2*i+0] = (((uint16_t)(a[0] & 15)*KYBER_Q) + 8) >> 4; + r->coeffs[2*i+1] = (((uint16_t)(a[0] >> 4)*KYBER_Q) + 8) >> 4; + a += 1; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + unsigned int j; + uint8_t t[8]; + for(i=0;i> 0); + t[1] = (a[0] >> 5) | (a[1] << 3); + t[2] = (a[1] >> 2); + t[3] = (a[1] >> 7) | (a[2] << 1); + t[4] = (a[2] >> 4) | (a[3] << 4); + t[5] = (a[3] >> 1); + t[6] = (a[3] >> 6) | (a[4] << 2); + t[7] = (a[4] >> 3); + a += 5; + + for(j=0;j<8;j++) + r->coeffs[8*i+j] = ((uint32_t)(t[j] & 31)*KYBER_Q + 16) >> 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + unsigned int i; + uint16_t t0, t1; + + for(i=0;icoeffs[2*i]; + t0 += ((int16_t)t0 >> 15) & KYBER_Q; + t1 = a->coeffs[2*i+1]; + t1 += ((int16_t)t1 >> 15) & KYBER_Q; + r[3*i+0] = (t0 >> 0); + r[3*i+1] = (t0 >> 8) | (t1 << 4); + r[3*i+2] = (t1 >> 4); + } +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + unsigned int i; + for(i=0;icoeffs[2*i] = ((a[3*i+0] >> 0) | ((uint16_t)a[3*i+1] << 8)) & 0xFFF; + r->coeffs[2*i+1] = ((a[3*i+1] >> 4) | ((uint16_t)a[3*i+2] << 4)) & 0xFFF; + } +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ + unsigned int i,j; + int16_t mask; + +#if (KYBER_INDCPA_MSGBYTES != KYBER_N/8) +#error "KYBER_INDCPA_MSGBYTES must be equal to KYBER_N/8 bytes!" +#endif + + for(i=0;i> j)&1); + r->coeffs[8*i+j] = mask & ((KYBER_Q+1)/2); + } + } +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message +* +* Arguments: - uint8_t *msg: pointer to output message +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) +{ + unsigned int i,j; + uint16_t t; + + for(i=0;icoeffs[8*i+j]; + t += ((int16_t)t >> 15) & KYBER_Q; + t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + msg[i] |= t << j; + } + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA1*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta1(r, buf); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA2*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta2(r, buf); +} + + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place; +* inputs assumed to be in normal order, output in bitreversed order +* +* Arguments: - uint16_t *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt(r->coeffs); + poly_reduce(r); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* inputs assumed to be in bitreversed order, output in normal order +* +* Arguments: - uint16_t *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt(r->coeffs); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[4*i], &a->coeffs[4*i], &b->coeffs[4*i], zetas[64+i]); + basemul(&r->coeffs[4*i+2], &a->coeffs[4*i+2], &b->coeffs[4*i+2], -zetas[64+i]); + } +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + unsigned int i; + const int16_t f = (1ULL << 32) % KYBER_Q; + for(i=0;icoeffs[i] = montgomery_reduce((int32_t)r->coeffs[i]*f); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + unsigned int i; + for(i=0;icoeffs[i] = barrett_reduce(r->coeffs[i]); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] + b->coeffs[i]; +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] - b->coeffs[i]; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.h new file mode 100644 index 000000000..9a99c7cda --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.h @@ -0,0 +1,53 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +/* + * Elements of R_q = Z_q[X]/(X^n + 1). Represents polynomial + * coeffs[0] + X*coeffs[1] + X^2*coeffs[2] + ... + X^{n-1}*coeffs[n-1] + */ +typedef struct{ + int16_t coeffs[KYBER_N]; +} poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c new file mode 100644 index 000000000..8420d069c --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c @@ -0,0 +1,233 @@ +#include +#include "params.h" +#include "poly.h" +#include "polyvec.h" + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;ivec[i].coeffs[8*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; + } + + r[ 0] = (t[0] >> 0); + r[ 1] = (t[0] >> 8) | (t[1] << 3); + r[ 2] = (t[1] >> 5) | (t[2] << 6); + r[ 3] = (t[2] >> 2); + r[ 4] = (t[2] >> 10) | (t[3] << 1); + r[ 5] = (t[3] >> 7) | (t[4] << 4); + r[ 6] = (t[4] >> 4) | (t[5] << 7); + r[ 7] = (t[5] >> 1); + r[ 8] = (t[5] >> 9) | (t[6] << 2); + r[ 9] = (t[6] >> 6) | (t[7] << 5); + r[10] = (t[7] >> 3); + r += 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;ivec[i].coeffs[4*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; + } + + r[0] = (t[0] >> 0); + r[1] = (t[0] >> 8) | (t[1] << 2); + r[2] = (t[1] >> 6) | (t[2] << 4); + r[3] = (t[2] >> 4) | (t[3] << 6); + r[4] = (t[3] >> 2); + r += 5; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;i> 0) | ((uint16_t)a[ 1] << 8); + t[1] = (a[1] >> 3) | ((uint16_t)a[ 2] << 5); + t[2] = (a[2] >> 6) | ((uint16_t)a[ 3] << 2) | ((uint16_t)a[4] << 10); + t[3] = (a[4] >> 1) | ((uint16_t)a[ 5] << 7); + t[4] = (a[5] >> 4) | ((uint16_t)a[ 6] << 4); + t[5] = (a[6] >> 7) | ((uint16_t)a[ 7] << 1) | ((uint16_t)a[8] << 9); + t[6] = (a[8] >> 2) | ((uint16_t)a[ 9] << 6); + t[7] = (a[9] >> 5) | ((uint16_t)a[10] << 3); + a += 11; + + for(k=0;k<8;k++) + r->vec[i].coeffs[8*j+k] = ((uint32_t)(t[k] & 0x7FF)*KYBER_Q + 1024) >> 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;i> 0) | ((uint16_t)a[1] << 8); + t[1] = (a[1] >> 2) | ((uint16_t)a[2] << 6); + t[2] = (a[2] >> 4) | ((uint16_t)a[3] << 4); + t[3] = (a[3] >> 6) | ((uint16_t)a[4] << 2); + a += 5; + + for(k=0;k<4;k++) + r->vec[i].coeffs[4*j+k] = ((uint32_t)(t[k] & 0x3FF)*KYBER_Q + 512) >> 10; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements of a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly t; + + poly_basemul_montgomery(r, &a->vec[0], &b->vec[0]); + for(i=1;ivec[i], &b->vec[i]); + poly_add(r, r, &t); + } + + poly_reduce(r); +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.h new file mode 100644 index 000000000..57b605494 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c new file mode 100644 index 000000000..9d8e7edf8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c @@ -0,0 +1,42 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: Montgomery reduction; given a 32-bit integer a, computes +* 16-bit integer congruent to a * R^-1 mod q, where R=2^16 +* +* Arguments: - int32_t a: input integer to be reduced; +* has to be in {-q2^15,...,q2^15-1} +* +* Returns: integer in {-q+1,...,q-1} congruent to a * R^-1 modulo q. +**************************************************/ +int16_t montgomery_reduce(int32_t a) +{ + int16_t t; + + t = (int16_t)a*QINV; + t = (a - (int32_t)t*KYBER_Q) >> 16; + return t; +} + +/************************************************* +* Name: barrett_reduce +* +* Description: Barrett reduction; given a 16-bit integer a, computes +* centered representative congruent to a mod q in {-(q-1)/2,...,(q-1)/2} +* +* Arguments: - int16_t a: input integer to be reduced +* +* Returns: integer in {-(q-1)/2,...,(q-1)/2} congruent to a modulo q. +**************************************************/ +int16_t barrett_reduce(int16_t a) { + int16_t t; + const int16_t v = ((1<<26) + KYBER_Q/2)/KYBER_Q; + + t = ((int32_t)v*a + (1<<25)) >> 26; + t *= KYBER_Q; + return a - t; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.h new file mode 100644 index 000000000..c1bc1e4c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.h @@ -0,0 +1,16 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 + +#define montgomery_reduce KYBER_NAMESPACE(montgomery_reduce) +int16_t montgomery_reduce(int32_t a); + +#define barrett_reduce KYBER_NAMESPACE(barrett_reduce) +int16_t barrett_reduce(int16_t a); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric.h new file mode 100644 index 000000000..2acc66f98 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric.h @@ -0,0 +1,35 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_init(STATE, SEED) shake128_inc_init(STATE) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define xof_release(STATE) shake128_inc_ctx_release(STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c new file mode 100644 index 000000000..ed4a6541f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c @@ -0,0 +1,47 @@ +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint8_t r = 0; + + for(i=0;i> 63; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + + b = -b; + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/align.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/align.h new file mode 100644 index 000000000..3463866f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT16(N) \ + union { \ + int16_t coeffs[N]; \ + __m256i vec[(N+15)/16]; \ + } + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/api.h new file mode 100644 index 000000000..a154e80f1 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_avx2_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_avx2_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_avx2_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_avx2_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_avx2_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_avx2_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_avx2_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_avx2_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_avx2_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_avx2_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_avx2_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_avx2_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_avx2_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_avx2_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_avx2_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_avx2_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_avx2_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_avx2_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S new file mode 100644 index 000000000..36990639b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S @@ -0,0 +1,105 @@ +#include "consts.h" + +.macro schoolbook off +vmovdqa _16XQINV*2(%rcx),%ymm0 +vmovdqa (64*\off+ 0)*2(%rsi),%ymm1 # a0 +vmovdqa (64*\off+16)*2(%rsi),%ymm2 # b0 +vmovdqa (64*\off+32)*2(%rsi),%ymm3 # a1 +vmovdqa (64*\off+48)*2(%rsi),%ymm4 # b1 + +vpmullw %ymm0,%ymm1,%ymm9 # a0.lo +vpmullw %ymm0,%ymm2,%ymm10 # b0.lo +vpmullw %ymm0,%ymm3,%ymm11 # a1.lo +vpmullw %ymm0,%ymm4,%ymm12 # b1.lo + +vmovdqa (64*\off+ 0)*2(%rdx),%ymm5 # c0 +vmovdqa (64*\off+16)*2(%rdx),%ymm6 # d0 + +vpmulhw %ymm5,%ymm1,%ymm13 # a0c0.hi +vpmulhw %ymm6,%ymm1,%ymm1 # a0d0.hi +vpmulhw %ymm5,%ymm2,%ymm14 # b0c0.hi +vpmulhw %ymm6,%ymm2,%ymm2 # b0d0.hi + +vmovdqa (64*\off+32)*2(%rdx),%ymm7 # c1 +vmovdqa (64*\off+48)*2(%rdx),%ymm8 # d1 + +vpmulhw %ymm7,%ymm3,%ymm15 # a1c1.hi +vpmulhw %ymm8,%ymm3,%ymm3 # a1d1.hi +vpmulhw %ymm7,%ymm4,%ymm0 # b1c1.hi +vpmulhw %ymm8,%ymm4,%ymm4 # b1d1.hi + +vmovdqa %ymm13,(%rsp) + +vpmullw %ymm5,%ymm9,%ymm13 # a0c0.lo +vpmullw %ymm6,%ymm9,%ymm9 # a0d0.lo +vpmullw %ymm5,%ymm10,%ymm5 # b0c0.lo +vpmullw %ymm6,%ymm10,%ymm10 # b0d0.lo + +vpmullw %ymm7,%ymm11,%ymm6 # a1c1.lo +vpmullw %ymm8,%ymm11,%ymm11 # a1d1.lo +vpmullw %ymm7,%ymm12,%ymm7 # b1c1.lo +vpmullw %ymm8,%ymm12,%ymm12 # b1d1.lo + +vmovdqa _16XQ*2(%rcx),%ymm8 +vpmulhw %ymm8,%ymm13,%ymm13 +vpmulhw %ymm8,%ymm9,%ymm9 +vpmulhw %ymm8,%ymm5,%ymm5 +vpmulhw %ymm8,%ymm10,%ymm10 +vpmulhw %ymm8,%ymm6,%ymm6 +vpmulhw %ymm8,%ymm11,%ymm11 +vpmulhw %ymm8,%ymm7,%ymm7 +vpmulhw %ymm8,%ymm12,%ymm12 + +vpsubw (%rsp),%ymm13,%ymm13 # -a0c0 +vpsubw %ymm9,%ymm1,%ymm9 # a0d0 +vpsubw %ymm5,%ymm14,%ymm5 # b0c0 +vpsubw %ymm10,%ymm2,%ymm10 # b0d0 + +vpsubw %ymm6,%ymm15,%ymm6 # a1c1 +vpsubw %ymm11,%ymm3,%ymm11 # a1d1 +vpsubw %ymm7,%ymm0,%ymm7 # b1c1 +vpsubw %ymm12,%ymm4,%ymm12 # b1d1 + +vmovdqa (%r9),%ymm0 +vmovdqa 32(%r9),%ymm1 +vpmullw %ymm0,%ymm10,%ymm2 +vpmullw %ymm0,%ymm12,%ymm3 +vpmulhw %ymm1,%ymm10,%ymm10 +vpmulhw %ymm1,%ymm12,%ymm12 +vpmulhw %ymm8,%ymm2,%ymm2 +vpmulhw %ymm8,%ymm3,%ymm3 +vpsubw %ymm2,%ymm10,%ymm10 # rb0d0 +vpsubw %ymm3,%ymm12,%ymm12 # rb1d1 + +vpaddw %ymm5,%ymm9,%ymm9 +vpaddw %ymm7,%ymm11,%ymm11 +vpsubw %ymm13,%ymm10,%ymm13 +vpsubw %ymm12,%ymm6,%ymm6 + +vmovdqa %ymm13,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(64*\off+16)*2(%rdi) +vmovdqa %ymm6,(64*\off+32)*2(%rdi) +vmovdqa %ymm11,(64*\off+48)*2(%rdi) +.endm + +.text +.global cdecl(basemul_avx) +cdecl(basemul_avx): +mov %rsp,%r8 +and $-32,%rsp +sub $32,%rsp + +lea (_ZETAS_EXP+176)*2(%rcx),%r9 +schoolbook 0 + +add $32*2,%r9 +schoolbook 1 + +add $192*2,%r9 +schoolbook 2 + +add $32*2,%r9 +schoolbook 3 + +mov %r8,%rsp +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c new file mode 100644 index 000000000..dad473c79 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c @@ -0,0 +1,144 @@ +#include +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd2(poly * restrict r, const __m256i buf[2*KYBER_N/128]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask55 = _mm256_set1_epi32(0x55555555); + const __m256i mask33 = _mm256_set1_epi32(0x33333333); + const __m256i mask03 = _mm256_set1_epi32(0x03030303); + const __m256i mask0F = _mm256_set1_epi32(0x0F0F0F0F); + + for(i = 0; i < KYBER_N/64; i++) { + f0 = _mm256_load_si256(&buf[i]); + + f1 = _mm256_srli_epi16(f0, 1); + f0 = _mm256_and_si256(mask55, f0); + f1 = _mm256_and_si256(mask55, f1); + f0 = _mm256_add_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 2); + f0 = _mm256_and_si256(mask33, f0); + f1 = _mm256_and_si256(mask33, f1); + f0 = _mm256_add_epi8(f0, mask33); + f0 = _mm256_sub_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 4); + f0 = _mm256_and_si256(mask0F, f0); + f1 = _mm256_and_si256(mask0F, f1); + f0 = _mm256_sub_epi8(f0, mask03); + f1 = _mm256_sub_epi8(f1, mask03); + + f2 = _mm256_unpacklo_epi8(f0, f1); + f3 = _mm256_unpackhi_epi8(f0, f1); + + f0 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f2)); + f1 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f2,1)); + f2 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f3)); + f3 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f3,1)); + + _mm256_store_si256(&r->vec[4*i+0], f0); + _mm256_store_si256(&r->vec[4*i+1], f2); + _mm256_store_si256(&r->vec[4*i+2], f1); + _mm256_store_si256(&r->vec[4*i+3], f3); + } +} + +#if KYBER_ETA1 == 3 +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3 +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd3(poly * restrict r, const uint8_t buf[3*KYBER_N/4+8]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask249 = _mm256_set1_epi32(0x249249); + const __m256i mask6DB = _mm256_set1_epi32(0x6DB6DB); + const __m256i mask07 = _mm256_set1_epi32(7); + const __m256i mask70 = _mm256_set1_epi32(7 << 16); + const __m256i mask3 = _mm256_set1_epi16(3); + const __m256i shufbidx = _mm256_set_epi8(-1,15,14,13,-1,12,11,10,-1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6,-1, 5, 4, 3,-1, 2, 1, 0); + + for(i = 0; i < KYBER_N/32; i++) { + f0 = _mm256_loadu_si256((__m256i *)&buf[24*i]); + f0 = _mm256_permute4x64_epi64(f0,0x94); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + + f1 = _mm256_srli_epi32(f0,1); + f2 = _mm256_srli_epi32(f0,2); + f0 = _mm256_and_si256(mask249,f0); + f1 = _mm256_and_si256(mask249,f1); + f2 = _mm256_and_si256(mask249,f2); + f0 = _mm256_add_epi32(f0,f1); + f0 = _mm256_add_epi32(f0,f2); + + f1 = _mm256_srli_epi32(f0,3); + f0 = _mm256_add_epi32(f0,mask6DB); + f0 = _mm256_sub_epi32(f0,f1); + + f1 = _mm256_slli_epi32(f0,10); + f2 = _mm256_srli_epi32(f0,12); + f3 = _mm256_srli_epi32(f0, 2); + f0 = _mm256_and_si256(f0,mask07); + f1 = _mm256_and_si256(f1,mask70); + f2 = _mm256_and_si256(f2,mask07); + f3 = _mm256_and_si256(f3,mask70); + f0 = _mm256_add_epi16(f0,f1); + f1 = _mm256_add_epi16(f2,f3); + f0 = _mm256_sub_epi16(f0,mask3); + f1 = _mm256_sub_epi16(f1,mask3); + + f2 = _mm256_unpacklo_epi32(f0,f1); + f3 = _mm256_unpackhi_epi32(f0,f1); + + f0 = _mm256_permute2x128_si256(f2,f3,0x20); + f1 = _mm256_permute2x128_si256(f2,f3,0x31); + + _mm256_store_si256(&r->vec[2*i+0], f0); + _mm256_store_si256(&r->vec[2*i+1], f1); + } +} +#endif + +/* buf 32 bytes longer for cbd3 */ +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, (uint8_t *)buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.h new file mode 100644 index 000000000..05788e06b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.h @@ -0,0 +1,15 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c new file mode 100644 index 000000000..84e596893 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c @@ -0,0 +1,121 @@ +#include "align.h" +#include "params.h" +#include "consts.h" + +#define Q KYBER_Q +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 +#define V 20159 // floor(2^26/q + 0.5) +#define FHI 1441 // mont^2/128 +#define FLO -10079 // qinv*FHI +#define MONTSQHI 1353 // mont^2 +#define MONTSQLO 20553 // qinv*MONTSQHI +#define MASK 4095 +#define SHIFT 32 + +const qdata_t qdata = {{ +#define _16XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, + +#define _16XQINV 16 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _16XV 32 + V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, + +#define _16XFLO 48 + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + +#define _16XFHI 64 + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + +#define _16XMONTSQLO 80 + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + +#define _16XMONTSQHI 96 + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + +#define _16XMASK 112 + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + +#define _REVIDXB 128 + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + +#define _REVIDXD 144 + 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0, + +#define _ZETAS_EXP 160 + 31498, 31498, 31498, 31498, -758, -758, -758, -758, + 5237, 5237, 5237, 5237, 1397, 1397, 1397, 1397, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + -359, -359, -359, -359, -359, -359, -359, -359, + -359, -359, -359, -359, -359, -359, -359, -359, + 13525, 13525, 13525, 13525, 13525, 13525, 13525, 13525, + -12402, -12402, -12402, -12402, -12402, -12402, -12402, -12402, + 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + -20907, -20907, -20907, -20907, 27758, 27758, 27758, 27758, + -3799, -3799, -3799, -3799, -15690, -15690, -15690, -15690, + -171, -171, -171, -171, 622, 622, 622, 622, + 1577, 1577, 1577, 1577, 182, 182, 182, 182, + -5827, -5827, 17363, 17363, -26360, -26360, -29057, -29057, + 5571, 5571, -1102, -1102, 21438, 21438, -26242, -26242, + 573, 573, -1325, -1325, 264, 264, 383, 383, + -829, -829, 1458, 1458, -1602, -1602, -130, -130, + -5689, -6516, 1496, 30967, -23565, 20179, 20710, 25080, + -12796, 26616, 16064, -12442, 9134, -650, -25986, 27837, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -335, -11477, -32227, 20494, -27738, 945, -14883, 6182, + 32010, 10631, 29175, -28762, -18486, 17560, -14430, -5276, + -1103, 555, -1251, 1550, 422, 177, -291, 1574, + -246, 1159, -777, -602, -1590, -872, 418, -156, + 11182, 13387, -14233, -21655, 13131, -4587, 23092, 5493, + -32502, 30317, -18741, 12639, 20100, 18525, 19529, -12619, + 430, 843, 871, 105, 587, -235, -460, 1653, + 778, -147, 1483, 1119, 644, 349, 329, -75, + 787, 787, 787, 787, 787, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 787, 787, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + 28191, 28191, 28191, 28191, 28191, 28191, 28191, 28191, + -16694, -16694, -16694, -16694, -16694, -16694, -16694, -16694, + 287, 287, 287, 287, 287, 287, 287, 287, + 202, 202, 202, 202, 202, 202, 202, 202, + 10690, 10690, 10690, 10690, 1358, 1358, 1358, 1358, + -11202, -11202, -11202, -11202, 31164, 31164, 31164, 31164, + 962, 962, 962, 962, -1202, -1202, -1202, -1202, + -1474, -1474, -1474, -1474, 1468, 1468, 1468, 1468, + -28073, -28073, 24313, 24313, -10532, -10532, 8800, 8800, + 18426, 18426, 8859, 8859, 26675, 26675, -16163, -16163, + -681, -681, 1017, 1017, 732, 732, 608, 608, + -1542, -1542, 411, 411, -205, -205, -1571, -1571, + 19883, -28250, -15887, -8898, -28309, 9075, -30199, 18249, + 13426, 14017, -29156, -12757, 16832, 4311, -24155, -17915, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -31183, 25435, -7382, 24391, -20927, 10946, 24214, 16989, + 10335, -7934, -22502, 10906, 31636, 28644, 23998, -17422, + 817, 603, 1322, -1465, -1215, 1218, -874, -1187, + -1185, -1278, -1510, -870, -108, 996, 958, 1522, + 20297, 2146, 15355, -32384, -6280, -14903, -11044, 14469, + -21498, -20198, 23210, -17442, -23860, -20257, 7756, 23132, + 1097, 610, -1285, 384, -136, -1335, 220, -1659, + -1530, 794, -854, 478, -308, 991, -1460, 1628, + +#define _16XSHIFT 624 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT +}}; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.h new file mode 100644 index 000000000..f95899cd8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.h @@ -0,0 +1,43 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _16XQ 0 +#define _16XQINV 16 +#define _16XV 32 +#define _16XFLO 48 +#define _16XFHI 64 +#define _16XMONTSQLO 80 +#define _16XMONTSQHI 96 +#define _16XMASK 112 +#define _REVIDXB 128 +#define _REVIDXD 144 +#define _ZETAS_EXP 160 +#define _16XSHIFT 624 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#ifdef __ASSEMBLER__ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define cdecl2(s) decorate(s) +#define cdecl(s) cdecl2(KYBER_NAMESPACE(##s)) +#else +#define cdecl(s) KYBER_NAMESPACE(##s) +#endif +#endif + +#ifndef __ASSEMBLER__ +#include "align.h" +typedef ALIGNED_INT16(640) qdata_t; +#define qdata KYBER_NAMESPACE(qdata) +extern const qdata_t qdata; +#endif + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S new file mode 100644 index 000000000..3bb1ebd3d --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S @@ -0,0 +1,88 @@ +#include "consts.h" +.include "fq.inc" + +.text +reduce128_avx: +#load +vmovdqa (%rdi),%ymm2 +vmovdqa 32(%rdi),%ymm3 +vmovdqa 64(%rdi),%ymm4 +vmovdqa 96(%rdi),%ymm5 +vmovdqa 128(%rdi),%ymm6 +vmovdqa 160(%rdi),%ymm7 +vmovdqa 192(%rdi),%ymm8 +vmovdqa 224(%rdi),%ymm9 + +red16 2 +red16 3 +red16 4 +red16 5 +red16 6 +red16 7 +red16 8 +red16 9 + +#store +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm3,32(%rdi) +vmovdqa %ymm4,64(%rdi) +vmovdqa %ymm5,96(%rdi) +vmovdqa %ymm6,128(%rdi) +vmovdqa %ymm7,160(%rdi) +vmovdqa %ymm8,192(%rdi) +vmovdqa %ymm9,224(%rdi) + +ret + +.global cdecl(reduce_avx) +cdecl(reduce_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XV*2(%rsi),%ymm1 +call reduce128_avx +add $256,%rdi +call reduce128_avx +ret + +tomont128_avx: +#load +vmovdqa (%rdi),%ymm3 +vmovdqa 32(%rdi),%ymm4 +vmovdqa 64(%rdi),%ymm5 +vmovdqa 96(%rdi),%ymm6 +vmovdqa 128(%rdi),%ymm7 +vmovdqa 160(%rdi),%ymm8 +vmovdqa 192(%rdi),%ymm9 +vmovdqa 224(%rdi),%ymm10 + +fqmulprecomp 1,2,3,11 +fqmulprecomp 1,2,4,12 +fqmulprecomp 1,2,5,13 +fqmulprecomp 1,2,6,14 +fqmulprecomp 1,2,7,15 +fqmulprecomp 1,2,8,11 +fqmulprecomp 1,2,9,12 +fqmulprecomp 1,2,10,13 + +#store +vmovdqa %ymm3,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm5,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm7,128(%rdi) +vmovdqa %ymm8,160(%rdi) +vmovdqa %ymm9,192(%rdi) +vmovdqa %ymm10,224(%rdi) + +ret + +.global cdecl(tomont_avx) +cdecl(tomont_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XMONTSQLO*2(%rsi),%ymm1 +vmovdqa _16XMONTSQHI*2(%rsi),%ymm2 +call tomont128_avx +add $256,%rdi +call tomont128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.inc new file mode 100644 index 000000000..4b7afc311 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.inc @@ -0,0 +1,30 @@ +.macro red16 r,rs=0,x=12 +vpmulhw %ymm1,%ymm\r,%ymm\x +.if \rs +vpmulhrsw %ymm\rs,%ymm\x,%ymm\x +.else +vpsraw $10,%ymm\x,%ymm\x +.endif +vpmullw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro csubq r,x=12 +vpsubw %ymm0,%ymm\r,%ymm\r +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro caddq r,x=12 +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro fqmulprecomp al,ah,b,x=12 +vpmullw %ymm\al,%ymm\b,%ymm\x +vpmulhw %ymm\ah,%ymm\b,%ymm\b +vpmulhw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\b,%ymm\b +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c new file mode 100644 index 000000000..572ce4900 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c @@ -0,0 +1,566 @@ +#include +#include +#include +#include +#include "align.h" +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "cbd.h" +#include "rejsample.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk and the +* public seed used to generate the matrix A. +* The polynomial coefficients in pk are assumed to +* lie in the invertal [0,q], i.e. pk must be reduced +* by polyvec_reduce(). +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key. +* The polynomial coefficients in sk are assumed to +* lie in the invertal [0,q], i.e. sk must be reduced +* by polyvec_reduce(). +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v. +* The polynomial coefficients in b and v are assumed to +* lie in the invertal [0,q], i.e. b and v must be reduced +* by polyvec_reduce() and poly_reduce(), respectively. +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output array +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos <= buflen - 3) { // buflen is always at least 3 + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#if KYBER_K == 2 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 1; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 1; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[1].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[1].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[1].vec[0]); + poly_nttunpack(&a[1].vec[1]); + shake128x4_inc_ctx_release(&state); +} +#elif KYBER_K == 3 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128incctx state1x; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 0; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 0; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[0].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[0].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[0].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[0].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[0].vec[2]); + poly_nttunpack(&a[1].vec[0]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 2; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 2; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 2; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 2; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[1].vec[1].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[1].vec[2].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[2].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[2].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[1].vec[1].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[1].vec[2].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[2].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[2].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); + + poly_nttunpack(&a[1].vec[1]); + poly_nttunpack(&a[1].vec[2]); + poly_nttunpack(&a[2].vec[0]); + poly_nttunpack(&a[2].vec[1]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + buf[0].coeffs[32] = 2; + buf[0].coeffs[33] = 2; + + shake128_inc_init(&state1x); + shake128_absorb_once(&state1x, buf[0].coeffs, 34); + shake128_squeezeblocks(buf[0].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state1x); + ctr0 = rej_uniform_avx(a[2].vec[2].coeffs, buf[0].coeffs); + while(ctr0 < KYBER_N) { + shake128_squeezeblocks(buf[0].coeffs, 1, &state1x); + ctr0 += rej_uniform(a[2].vec[2].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + } + shake128_inc_ctx_release(&state1x); + + poly_nttunpack(&a[2].vec[2]); +} +#elif KYBER_K == 4 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int i, ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128x4_inc_init(&state); + + for(i=0;i<4;i++) { + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = i; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = i; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = i; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = i; + buf[3].coeffs[33] = 3; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = i; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = i; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = i; + buf[3].coeffs[32] = 3; + buf[3].coeffs[33] = i; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[i].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[i].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[i].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[i].vec[3].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[i].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[i].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[i].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[i].vec[3].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[i].vec[0]); + poly_nttunpack(&a[i].vec[1]); + poly_nttunpack(&a[i].vec[2]); + poly_nttunpack(&a[i].vec[3]); + } + shake128x4_inc_ctx_release(&state); +} +#endif + +/************************************************* +* Name: indcpa_keypair_derand +* +* Description: Generates public and private key for the CPA-secure +* public-key encryption scheme underlying Kyber +* +* Arguments: - uint8_t *pk: pointer to output public key +* (of length KYBER_INDCPA_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (of length KYBER_INDCPA_SECRETKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (of length KYBER_SYMBYTES bytes) +**************************************************/ +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]) +{ + unsigned int i; + uint8_t buf[2*KYBER_SYMBYTES]; + const uint8_t *publicseed = buf; + const uint8_t *noiseseed = buf + KYBER_SYMBYTES; + polyvec a[KYBER_K], e, pkpv, skpv; + + hash_g(buf, coins, KYBER_SYMBYTES); + + gen_a(a, publicseed); + +#if KYBER_K == 2 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, e.vec+0, e.vec+1, noiseseed, 0, 1, 2, 3); +#elif KYBER_K == 3 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, e.vec+0, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+1, e.vec+2, pkpv.vec+0, pkpv.vec+1, noiseseed, 4, 5, 6, 7); +#elif KYBER_K == 4 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, skpv.vec+3, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+0, e.vec+1, e.vec+2, e.vec+3, noiseseed, 4, 5, 6, 7); +#endif + + polyvec_ntt(&skpv); + polyvec_reduce(&skpv); + polyvec_ntt(&e); + + // matrix-vector multiplication + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S new file mode 100644 index 000000000..76d418999 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S @@ -0,0 +1,193 @@ +#include "consts.h" +.include "shuffle.inc" +.include "fq.inc" + +.macro butterfly rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3,zl0=2,zl1=2,zh0=3,zh1=3 +vpsubw %ymm\rl0,%ymm\rh0,%ymm12 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rl0 +vpsubw %ymm\rl1,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl0,%ymm12,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl1 +vpsubw %ymm\rl2,%ymm\rh2,%ymm14 + +vpmullw %ymm\zl0,%ymm13,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl2 +vpsubw %ymm\rl3,%ymm\rh3,%ymm15 + +vpmullw %ymm\zl1,%ymm14,%ymm\rh2 +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl3 +vpmullw %ymm\zl1,%ymm15,%ymm\rh3 + +vpmulhw %ymm\zh0,%ymm12,%ymm12 +vpmulhw %ymm\zh0,%ymm13,%ymm13 + +vpmulhw %ymm\zh1,%ymm14,%ymm14 +vpmulhw %ymm\zh1,%ymm15,%ymm15 + +vpmulhw %ymm0,%ymm\rh0,%ymm\rh0 + +vpmulhw %ymm0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm0,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm0,%ymm\rh3,%ymm\rh3 + +# + +# + +vpsubw %ymm\rh0,%ymm12,%ymm\rh0 + +vpsubw %ymm\rh1,%ymm13,%ymm\rh1 + +vpsubw %ymm\rh2,%ymm14,%ymm\rh2 +vpsubw %ymm\rh3,%ymm15,%ymm\rh3 +.endm + +.macro intt_levels0t5 off +/* level 0 */ +vmovdqa _16XFLO*2(%rsi),%ymm2 +vmovdqa _16XFHI*2(%rsi),%ymm3 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +fqmulprecomp 2,3,4 +fqmulprecomp 2,3,6 +fqmulprecomp 2,3,5 +fqmulprecomp 2,3,7 + +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 + +fqmulprecomp 2,3,8 +fqmulprecomp 2,3,10 +fqmulprecomp 2,3,9 +fqmulprecomp 2,3,11 + +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+208)*2(%rsi),%ymm15 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+176)*2(%rsi),%ymm1 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+224)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+192)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm12 +vpshufb %ymm12,%ymm15,%ymm15 +vpshufb %ymm12,%ymm1,%ymm1 +vpshufb %ymm12,%ymm2,%ymm2 +vpshufb %ymm12,%ymm3,%ymm3 + +butterfly 4,5,8,9,6,7,10,11,15,1,2,3 + +/* level 1 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+144)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+160)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm1 +vpshufb %ymm1,%ymm2,%ymm2 +vpshufb %ymm1,%ymm3,%ymm3 + +butterfly 4,5,6,7,8,9,10,11,2,2,3,3 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +/* level 2 */ +vmovdqa _REVIDXD*2(%rsi),%ymm12 +vpermd (_ZETAS_EXP+(1-\off)*224+112)*2(%rsi),%ymm12,%ymm2 +vpermd (_ZETAS_EXP+(1-\off)*224+128)*2(%rsi),%ymm12,%ymm10 + +butterfly 3,4,6,8,5,7,9,11,2,2,10,10 + +vmovdqa _16XV*2(%rsi),%ymm1 +red16 3 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +/* level 3 */ +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+80)*2(%rsi),%ymm2 +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+96)*2(%rsi),%ymm9 + +butterfly 10,3,6,5,4,8,7,11,2,2,9,9 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +/* level 4 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+48)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+64)*2(%rsi),%ymm7 + +butterfly 9,10,6,4,3,5,8,11,2,2,7,7 + +red16 9 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_EXP+(1-\off)*224+16)*2(%rsi),%ymm2 +vmovdqa (_ZETAS_EXP+(1-\off)*224+32)*2(%rsi),%ymm8 + +butterfly 7,9,6,3,10,4,5,11,2,2,8,8 + +vmovdqa %ymm7,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.macro intt_level6 off +/* level 6 */ +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm2 + +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm3 + +butterfly 4,5,6,7,8,9,10,11 + +.if \off == 0 +red16 4 +.endif + +vmovdqa %ymm4,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm7,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +intt_levels0t5 0 +intt_levels0t5 1 + +intt_level6 0 +intt_level6 1 +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S new file mode 100644 index 000000000..0ce7b4129 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S @@ -0,0 +1,189 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro mul rh0,rh1,rh2,rh3,zl0=15,zl1=15,zh0=2,zh1=2 +vpmullw %ymm\zl0,%ymm\rh0,%ymm12 +vpmullw %ymm\zl0,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl1,%ymm\rh2,%ymm14 +vpmullw %ymm\zl1,%ymm\rh3,%ymm15 + +vpmulhw %ymm\zh0,%ymm\rh0,%ymm\rh0 +vpmulhw %ymm\zh0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm\zh1,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm\zh1,%ymm\rh3,%ymm\rh3 +.endm + +.macro reduce +vpmulhw %ymm0,%ymm12,%ymm12 +vpmulhw %ymm0,%ymm13,%ymm13 + +vpmulhw %ymm0,%ymm14,%ymm14 +vpmulhw %ymm0,%ymm15,%ymm15 +.endm + +.macro update rln,rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rln +vpsubw %ymm\rh0,%ymm\rl0,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl0 + +vpsubw %ymm\rh1,%ymm\rl1,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl1 +vpsubw %ymm\rh2,%ymm\rl2,%ymm\rh2 + +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl2 +vpsubw %ymm\rh3,%ymm\rl3,%ymm\rh3 + +vpsubw %ymm12,%ymm\rln,%ymm\rln +vpaddw %ymm12,%ymm\rh0,%ymm\rh0 +vpsubw %ymm13,%ymm\rl0,%ymm\rl0 + +vpaddw %ymm13,%ymm\rh1,%ymm\rh1 +vpsubw %ymm14,%ymm\rl1,%ymm\rl1 +vpaddw %ymm14,%ymm\rh2,%ymm\rh2 + +vpsubw %ymm15,%ymm\rl2,%ymm\rl2 +vpaddw %ymm15,%ymm\rh3,%ymm\rh3 +.endm + +.macro level0 off +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm15 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +vmovdqa %ymm3,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.macro levels1t6 off +/* level 1 */ +vmovdqa (_ZETAS_EXP+224*\off+16)*2(%rsi),%ymm15 +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 +vmovdqa (_ZETAS_EXP+224*\off+32)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +/* level 2 */ +shuffle8 5,10,7,10 +shuffle8 6,11,5,11 + +vmovdqa (_ZETAS_EXP+224*\off+48)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+64)*2(%rsi),%ymm2 + +mul 7,10,5,11 + +shuffle8 3,8,6,8 +shuffle8 4,9,3,9 + +reduce +update 4,6,8,3,9,7,10,5,11 + +/* level 3 */ +shuffle4 8,5,9,5 +shuffle4 3,11,8,11 + +vmovdqa (_ZETAS_EXP+224*\off+80)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+96)*2(%rsi),%ymm2 + +mul 9,5,8,11 + +shuffle4 4,7,3,7 +shuffle4 6,10,4,10 + +reduce +update 6,3,7,4,10,9,5,8,11 + +/* level 4 */ +shuffle2 7,8,10,8 +shuffle2 4,11,7,11 + +vmovdqa (_ZETAS_EXP+224*\off+112)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+128)*2(%rsi),%ymm2 + +mul 10,8,7,11 + +shuffle2 6,9,4,9 +shuffle2 3,5,6,5 + +reduce +update 3,4,9,6,5,10,8,7,11 + +/* level 5 */ +shuffle1 9,7,5,7 +shuffle1 6,11,9,11 + +vmovdqa (_ZETAS_EXP+224*\off+144)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+160)*2(%rsi),%ymm2 + +mul 5,7,9,11 + +shuffle1 3,10,6,10 +shuffle1 4,8,3,8 + +reduce +update 4,6,10,3,8,5,7,9,11 + +/* level 6 */ +vmovdqa (_ZETAS_EXP+224*\off+176)*2(%rsi),%ymm14 +vmovdqa (_ZETAS_EXP+224*\off+208)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+192)*2(%rsi),%ymm8 +vmovdqa (_ZETAS_EXP+224*\off+224)*2(%rsi),%ymm2 + +mul 10,3,9,11,14,15,8,2 + +reduce +update 8,4,6,5,7,10,3,9,11 + +vmovdqa %ymm8,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +level0 0 +level0 1 + +levels1t6 0 +levels1t6 1 + +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.h new file mode 100644 index 000000000..a4f48e343 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.h @@ -0,0 +1,28 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include + +#define ntt_avx KYBER_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *r, const __m256i *qdata); +#define invntt_avx KYBER_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *r, const __m256i *qdata); + +#define nttpack_avx KYBER_NAMESPACE(nttpack_avx) +void nttpack_avx(__m256i *r, const __m256i *qdata); +#define nttunpack_avx KYBER_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *r, const __m256i *qdata); + +#define basemul_avx KYBER_NAMESPACE(basemul_avx) +void basemul_avx(__m256i *r, + const __m256i *a, + const __m256i *b, + const __m256i *qdata); + +#define ntttobytes_avx KYBER_NAMESPACE(ntttobytes_avx) +void ntttobytes_avx(uint8_t *r, const __m256i *a, const __m256i *qdata); +#define nttfrombytes_avx KYBER_NAMESPACE(nttfrombytes_avx) +void nttfrombytes_avx(__m256i *r, const uint8_t *a, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/params.h new file mode 100644 index 000000000..fdc688ea2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/params.h @@ -0,0 +1,68 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + +//#define KYBER_90S /* Uncomment this if you want the 90S variant */ + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber512_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_avx2_##s +#endif +#elif (KYBER_K == 3) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber768_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_avx2_##s +#endif +#elif (KYBER_K == 4) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber1024_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_avx2_##s +#endif +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c new file mode 100644 index 000000000..96bad864f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c @@ -0,0 +1,606 @@ +#include +#include +#include +#include "align.h" +#include "fips202x4.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +#if (KYBER_POLYCOMPRESSEDBYTES == 96) +void poly_compress(uint8_t r[96], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 8); + const __m256i mask = _mm256_set1_epi16(7); + const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); + const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, + -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f2 = _mm256_sllv_epi32(f2,sllvdidx); + f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 + f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi32(t0,t1,0x08); + _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[24*i+16],t1); + } +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly * restrict r, const uint8_t a[96]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, + 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); + const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, + 224,28,896,112,14,448,56,7); + const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, + 128,1024,32,256,2048,64,512,4096); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +void poly_compress(uint8_t r[128], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 9); + const __m256i mask = _mm256_set1_epi16(15); + const __m256i shift2 = _mm256_set1_epi16((16 << 8) + 1); + const __m256i permdidx = _mm256_set_epi32(7,3,6,2,5,1,4,0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); + f2 = _mm256_maddubs_epi16(f2,shift2); + f0 = _mm256_packus_epi16(f0,f2); + f0 = _mm256_permutevar8x32_epi32(f0,permdidx); + _mm256_storeu_si256((__m256i *)&r[32*i],f0); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[128]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(7,7,7,7,6,6,6,6,5,5,5,5,4,4,4,4, + 3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0); + const __m256i mask = _mm256_set1_epi32(0x00F0000F); + const __m256i shift = _mm256_set1_epi32((128 << 16) + 2048); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) +void poly_compress(uint8_t r[160], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 10); + const __m256i mask = _mm256_set1_epi16(31); + const __m256i shift2 = _mm256_set1_epi16((32 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8,-1,-1,-1,-1,-1, 4, 3, 2, 1, 0,-1,12,11,10, 9, + -1,12,11,10, 9, 8,-1,-1,-1,-1,-1 ,4, 3, 2, 1, 0); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srlv_epi64(f0,sllvdidx); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[160]) +{ + unsigned int i; + __m128i t; + __m256i f; + int16_t ti; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(9,9,9,8,8,8,8,7,7,6,6,6,6,5,5,5, + 4,4,4,3,3,3,3,2,2,1,1,1,1,0,0,0); + const __m256i mask = _mm256_set_epi16(248,1984,62,496,3968,124,992,31, + 248,1984,62,496,3968,124,992,31); + const __m256i shift = _mm256_set_epi16(128,16,512,64,8,256,32,1024, + 128,16,512,64,8,256,32,1024); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial in NTT representation. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). The coefficients are orderd as output by +* poly_ntt(); the serialized output coefficients are in bitreversed +* order. +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + ntttobytes_avx(r, a->vec, qdata.vec); +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + nttfrombytes_avx(r->vec, a, qdata.vec); +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly * restrict r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ +#if (KYBER_INDCPA_MSGBYTES != 32) +#error "KYBER_INDCPA_MSGBYTES must be equal to 32!" +#endif + __m256i f, g0, g1, g2, g3, h0, h1, h2, h3; + const __m256i shift = _mm256_broadcastsi128_si256(_mm_set_epi32(0,1,2,3)); + const __m256i idx = _mm256_broadcastsi128_si256(_mm_set_epi8(15,14,11,10,7,6,3,2,13,12,9,8,5,4,1,0)); + const __m256i hqs = _mm256_set1_epi16((KYBER_Q+1)/2); + +#define FROMMSG64(i) \ + g3 = _mm256_shuffle_epi32(f,0x55*i); \ + g3 = _mm256_sllv_epi32(g3,shift); \ + g3 = _mm256_shuffle_epi8(g3,idx); \ + g0 = _mm256_slli_epi16(g3,12); \ + g1 = _mm256_slli_epi16(g3,8); \ + g2 = _mm256_slli_epi16(g3,4); \ + g0 = _mm256_srai_epi16(g0,15); \ + g1 = _mm256_srai_epi16(g1,15); \ + g2 = _mm256_srai_epi16(g2,15); \ + g3 = _mm256_srai_epi16(g3,15); \ + g0 = _mm256_and_si256(g0,hqs); /* 19 18 17 16 3 2 1 0 */ \ + g1 = _mm256_and_si256(g1,hqs); /* 23 22 21 20 7 6 5 4 */ \ + g2 = _mm256_and_si256(g2,hqs); /* 27 26 25 24 11 10 9 8 */ \ + g3 = _mm256_and_si256(g3,hqs); /* 31 30 29 28 15 14 13 12 */ \ + h0 = _mm256_unpacklo_epi64(g0,g1); \ + h2 = _mm256_unpackhi_epi64(g0,g1); \ + h1 = _mm256_unpacklo_epi64(g2,g3); \ + h3 = _mm256_unpackhi_epi64(g2,g3); \ + g0 = _mm256_permute2x128_si256(h0,h1,0x20); \ + g2 = _mm256_permute2x128_si256(h0,h1,0x31); \ + g1 = _mm256_permute2x128_si256(h2,h3,0x20); \ + g3 = _mm256_permute2x128_si256(h2,h3,0x31); \ + _mm256_store_si256(&r->vec[0+2*i+0],g0); \ + _mm256_store_si256(&r->vec[0+2*i+1],g1); \ + _mm256_store_si256(&r->vec[8+2*i+0],g2); \ + _mm256_store_si256(&r->vec[8+2*i+1],g3) + + f = _mm256_loadu_si256((__m256i *)msg); + FROMMSG64(0); + FROMMSG64(1); + FROMMSG64(2); + FROMMSG64(3); +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *msg: pointer to output message +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly * restrict a) +{ + unsigned int i; + uint32_t small; + __m256i f0, f1, g0, g1; + const __m256i hq = _mm256_set1_epi16((KYBER_Q - 1)/2); + const __m256i hhq = _mm256_set1_epi16((KYBER_Q - 1)/4); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_sub_epi16(hq, f0); + f1 = _mm256_sub_epi16(hq, f1); + g0 = _mm256_srai_epi16(f0, 15); + g1 = _mm256_srai_epi16(f1, 15); + f0 = _mm256_xor_si256(f0, g0); + f1 = _mm256_xor_si256(f1, g1); + f0 = _mm256_sub_epi16(f0, hhq); + f1 = _mm256_sub_epi16(f1, hhq); + f0 = _mm256_packs_epi16(f0, f1); + f0 = _mm256_permute4x64_epi64(f0, 0xD8); + small = _mm256_movemask_epi8(f0); + memcpy(&msg[4*i], &small, 4); + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA1*KYBER_N/4+32) buf; // +32 bytes as required by poly_cbd_eta1 + prf(buf.coeffs, KYBER_ETA1*KYBER_N/4, seed, nonce); + poly_cbd_eta1(r, buf.vec); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA2*KYBER_N/4) buf; + prf(buf.coeffs, KYBER_ETA2*KYBER_N/4, seed, nonce); + poly_cbd_eta2(r, buf.vec); +} + +#ifndef KYBER_90S +#define NOISE_NBLOCKS ((KYBER_ETA1*KYBER_N/4+SHAKE256_RATE-1)/SHAKE256_RATE) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta1(r2, buf[2].vec); + poly_cbd_eta1(r3, buf[3].vec); +} + +#if KYBER_K == 2 +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta2(r2, buf[2].vec); + poly_cbd_eta2(r3, buf[3].vec); +} +#endif +#endif + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place. +* Input coefficients assumed to be in normal order, +* output coefficients are in special order that is natural +* for the vectorization. Input coefficients are assumed to be +* bounded by q in absolute value, output coefficients are bounded +* by 16118 in absolute value. +* +* Arguments: - poly *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* Input coefficients assumed to be in special order from vectorized +* forward ntt, output in normal order. Input coefficients can be +* arbitrary 16-bit integers, output coefficients are bounded by 14870 +* in absolute value. +* +* Arguments: - poly *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt_avx(r->vec, qdata.vec); +} + +void poly_nttunpack(poly *r) +{ + nttunpack_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain. +* One of the input polynomials needs to have coefficients +* bounded by q, the other polynomial can have arbitrary +* coefficients. Output coefficients are bounded by 6656. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + basemul_avx(r->vec, a->vec, b->vec, qdata.vec); +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + tomont_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + reduce_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_add_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_sub_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.h new file mode 100644 index 000000000..6a9cf71c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.h @@ -0,0 +1,77 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" + +typedef ALIGNED_INT16(KYBER_N) poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#ifndef KYBER_90S +#define poly_getnoise_eta1_4x KYBER_NAMESPACE(poly_getnoise_eta2_4x) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); + +#if KYBER_K == 2 +#define poly_getnoise_eta1122_4x KYBER_NAMESPACE(poly_getnoise_eta1122_4x) +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); +#endif +#endif + + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_nttunpack KYBER_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c new file mode 100644 index 000000000..a0174b7b3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c @@ -0,0 +1,307 @@ +#include +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) +static void poly_compress10(uint8_t r[320], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(15); + const __m256i shift1 = _mm256_set1_epi16(1 << 12); + const __m256i mask = _mm256_set1_epi16(1023); + const __m256i shift2 = _mm256_set1_epi64x((1024LL << 48) + (1LL << 32) + (1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8, 4, 3, 2, 1, 0,-1,-1,-1,-1,-1,-1,12,11,10, 9, + -1,-1,-1,-1,-1,-1,12,11,10, 9, 8, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srli_epi64(f0,12); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi16(t0,t1,0xE0); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +static void poly_decompress10(poly * restrict r, const uint8_t a[320+12]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_set1_epi32((KYBER_Q << 16) + 4*KYBER_Q); + const __m256i shufbidx = _mm256_set_epi8(11,10,10, 9, 9, 8, 8, 7, + 6, 5, 5, 4, 4, 3, 3, 2, + 9, 8, 8, 7, 7, 6, 6, 5, + 4, 3, 3, 2, 2, 1, 1, 0); + const __m256i sllvdidx = _mm256_set1_epi64x(4); + const __m256i mask = _mm256_set1_epi32((32736 << 16) + 8184); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) +static void poly_compress11(uint8_t r[352+2], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(36); + const __m256i shift1 = _mm256_set1_epi16(1 << 13); + const __m256i mask = _mm256_set1_epi16(2047); + const __m256i shift2 = _mm256_set1_epi64x((2048LL << 48) + (1LL << 32) + (2048 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(10); + const __m256i srlvqidx = _mm256_set_epi64x(30,10,30,10); + const __m256i shufbidx = _mm256_set_epi8( 4, 3, 2, 1, 0, 0,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, + -1,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f1 = _mm256_bsrli_epi128(f0,8); + f0 = _mm256_srlv_epi64(f0,srlvqidx); + f1 = _mm256_slli_epi64(f1,34); + f0 = _mm256_add_epi64(f0,f1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[22*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[22*i+16],t1); + } +} + +static void poly_decompress11(poly * restrict r, const uint8_t a[352+10]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(13,12,12,11,10, 9, 9, 8, + 8, 7, 6, 5, 5, 4, 4, 3, + 10, 9, 9, 8, 7, 6, 6, 5, + 5, 4, 3, 2, 2, 1, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(0,0,1,0,0,0,1,0); + const __m256i srlvqidx = _mm256_set_epi64x(2,0,2,0); + const __m256i shift = _mm256_set_epi16(4,32,1,8,32,1,4,32,4,32,1,8,32,1,4,32); + const __m256i mask = _mm256_set1_epi16(32752); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i]); +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i],&a[320*i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i],&a[352*i]); +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements in a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly tmp; + + poly_basemul_montgomery(r,&a->vec[0],&b->vec[0]); + for(i=1;ivec[i],&b->vec[i]); + poly_add(r,r,&tmp); + } +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.h new file mode 100644 index 000000000..2ce23c31f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/reduce.h new file mode 100644 index 000000000..5368185b5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/reduce.h @@ -0,0 +1,12 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include "params.h" +#include + +#define reduce_avx KYBER_NAMESPACE(reduce_avx) +void reduce_avx(__m256i *r, const __m256i *qdata); +#define tomont_avx KYBER_NAMESPACE(tomont_avx) +void tomont_avx(__m256i *r, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c new file mode 100644 index 000000000..9060a44cb --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c @@ -0,0 +1,398 @@ +#include +#include +#include +#include "params.h" +#include "consts.h" +#include "rejsample.h" + +//#define BMI + +#ifndef BMI +static const uint8_t idx[256][8] = { + {-1, -1, -1, -1, -1, -1, -1, -1}, + { 0, -1, -1, -1, -1, -1, -1, -1}, + { 2, -1, -1, -1, -1, -1, -1, -1}, + { 0, 2, -1, -1, -1, -1, -1, -1}, + { 4, -1, -1, -1, -1, -1, -1, -1}, + { 0, 4, -1, -1, -1, -1, -1, -1}, + { 2, 4, -1, -1, -1, -1, -1, -1}, + { 0, 2, 4, -1, -1, -1, -1, -1}, + { 6, -1, -1, -1, -1, -1, -1, -1}, + { 0, 6, -1, -1, -1, -1, -1, -1}, + { 2, 6, -1, -1, -1, -1, -1, -1}, + { 0, 2, 6, -1, -1, -1, -1, -1}, + { 4, 6, -1, -1, -1, -1, -1, -1}, + { 0, 4, 6, -1, -1, -1, -1, -1}, + { 2, 4, 6, -1, -1, -1, -1, -1}, + { 0, 2, 4, 6, -1, -1, -1, -1}, + { 8, -1, -1, -1, -1, -1, -1, -1}, + { 0, 8, -1, -1, -1, -1, -1, -1}, + { 2, 8, -1, -1, -1, -1, -1, -1}, + { 0, 2, 8, -1, -1, -1, -1, -1}, + { 4, 8, -1, -1, -1, -1, -1, -1}, + { 0, 4, 8, -1, -1, -1, -1, -1}, + { 2, 4, 8, -1, -1, -1, -1, -1}, + { 0, 2, 4, 8, -1, -1, -1, -1}, + { 6, 8, -1, -1, -1, -1, -1, -1}, + { 0, 6, 8, -1, -1, -1, -1, -1}, + { 2, 6, 8, -1, -1, -1, -1, -1}, + { 0, 2, 6, 8, -1, -1, -1, -1}, + { 4, 6, 8, -1, -1, -1, -1, -1}, + { 0, 4, 6, 8, -1, -1, -1, -1}, + { 2, 4, 6, 8, -1, -1, -1, -1}, + { 0, 2, 4, 6, 8, -1, -1, -1}, + {10, -1, -1, -1, -1, -1, -1, -1}, + { 0, 10, -1, -1, -1, -1, -1, -1}, + { 2, 10, -1, -1, -1, -1, -1, -1}, + { 0, 2, 10, -1, -1, -1, -1, -1}, + { 4, 10, -1, -1, -1, -1, -1, -1}, + { 0, 4, 10, -1, -1, -1, -1, -1}, + { 2, 4, 10, -1, -1, -1, -1, -1}, + { 0, 2, 4, 10, -1, -1, -1, -1}, + { 6, 10, -1, -1, -1, -1, -1, -1}, + { 0, 6, 10, -1, -1, -1, -1, -1}, + { 2, 6, 10, -1, -1, -1, -1, -1}, + { 0, 2, 6, 10, -1, -1, -1, -1}, + { 4, 6, 10, -1, -1, -1, -1, -1}, + { 0, 4, 6, 10, -1, -1, -1, -1}, + { 2, 4, 6, 10, -1, -1, -1, -1}, + { 0, 2, 4, 6, 10, -1, -1, -1}, + { 8, 10, -1, -1, -1, -1, -1, -1}, + { 0, 8, 10, -1, -1, -1, -1, -1}, + { 2, 8, 10, -1, -1, -1, -1, -1}, + { 0, 2, 8, 10, -1, -1, -1, -1}, + { 4, 8, 10, -1, -1, -1, -1, -1}, + { 0, 4, 8, 10, -1, -1, -1, -1}, + { 2, 4, 8, 10, -1, -1, -1, -1}, + { 0, 2, 4, 8, 10, -1, -1, -1}, + { 6, 8, 10, -1, -1, -1, -1, -1}, + { 0, 6, 8, 10, -1, -1, -1, -1}, + { 2, 6, 8, 10, -1, -1, -1, -1}, + { 0, 2, 6, 8, 10, -1, -1, -1}, + { 4, 6, 8, 10, -1, -1, -1, -1}, + { 0, 4, 6, 8, 10, -1, -1, -1}, + { 2, 4, 6, 8, 10, -1, -1, -1}, + { 0, 2, 4, 6, 8, 10, -1, -1}, + {12, -1, -1, -1, -1, -1, -1, -1}, + { 0, 12, -1, -1, -1, -1, -1, -1}, + { 2, 12, -1, -1, -1, -1, -1, -1}, + { 0, 2, 12, -1, -1, -1, -1, -1}, + { 4, 12, -1, -1, -1, -1, -1, -1}, + { 0, 4, 12, -1, -1, -1, -1, -1}, + { 2, 4, 12, -1, -1, -1, -1, -1}, + { 0, 2, 4, 12, -1, -1, -1, -1}, + { 6, 12, -1, -1, -1, -1, -1, -1}, + { 0, 6, 12, -1, -1, -1, -1, -1}, + { 2, 6, 12, -1, -1, -1, -1, -1}, + { 0, 2, 6, 12, -1, -1, -1, -1}, + { 4, 6, 12, -1, -1, -1, -1, -1}, + { 0, 4, 6, 12, -1, -1, -1, -1}, + { 2, 4, 6, 12, -1, -1, -1, -1}, + { 0, 2, 4, 6, 12, -1, -1, -1}, + { 8, 12, -1, -1, -1, -1, -1, -1}, + { 0, 8, 12, -1, -1, -1, -1, -1}, + { 2, 8, 12, -1, -1, -1, -1, -1}, + { 0, 2, 8, 12, -1, -1, -1, -1}, + { 4, 8, 12, -1, -1, -1, -1, -1}, + { 0, 4, 8, 12, -1, -1, -1, -1}, + { 2, 4, 8, 12, -1, -1, -1, -1}, + { 0, 2, 4, 8, 12, -1, -1, -1}, + { 6, 8, 12, -1, -1, -1, -1, -1}, + { 0, 6, 8, 12, -1, -1, -1, -1}, + { 2, 6, 8, 12, -1, -1, -1, -1}, + { 0, 2, 6, 8, 12, -1, -1, -1}, + { 4, 6, 8, 12, -1, -1, -1, -1}, + { 0, 4, 6, 8, 12, -1, -1, -1}, + { 2, 4, 6, 8, 12, -1, -1, -1}, + { 0, 2, 4, 6, 8, 12, -1, -1}, + {10, 12, -1, -1, -1, -1, -1, -1}, + { 0, 10, 12, -1, -1, -1, -1, -1}, + { 2, 10, 12, -1, -1, -1, -1, -1}, + { 0, 2, 10, 12, -1, -1, -1, -1}, + { 4, 10, 12, -1, -1, -1, -1, -1}, + { 0, 4, 10, 12, -1, -1, -1, -1}, + { 2, 4, 10, 12, -1, -1, -1, -1}, + { 0, 2, 4, 10, 12, -1, -1, -1}, + { 6, 10, 12, -1, -1, -1, -1, -1}, + { 0, 6, 10, 12, -1, -1, -1, -1}, + { 2, 6, 10, 12, -1, -1, -1, -1}, + { 0, 2, 6, 10, 12, -1, -1, -1}, + { 4, 6, 10, 12, -1, -1, -1, -1}, + { 0, 4, 6, 10, 12, -1, -1, -1}, + { 2, 4, 6, 10, 12, -1, -1, -1}, + { 0, 2, 4, 6, 10, 12, -1, -1}, + { 8, 10, 12, -1, -1, -1, -1, -1}, + { 0, 8, 10, 12, -1, -1, -1, -1}, + { 2, 8, 10, 12, -1, -1, -1, -1}, + { 0, 2, 8, 10, 12, -1, -1, -1}, + { 4, 8, 10, 12, -1, -1, -1, -1}, + { 0, 4, 8, 10, 12, -1, -1, -1}, + { 2, 4, 8, 10, 12, -1, -1, -1}, + { 0, 2, 4, 8, 10, 12, -1, -1}, + { 6, 8, 10, 12, -1, -1, -1, -1}, + { 0, 6, 8, 10, 12, -1, -1, -1}, + { 2, 6, 8, 10, 12, -1, -1, -1}, + { 0, 2, 6, 8, 10, 12, -1, -1}, + { 4, 6, 8, 10, 12, -1, -1, -1}, + { 0, 4, 6, 8, 10, 12, -1, -1}, + { 2, 4, 6, 8, 10, 12, -1, -1}, + { 0, 2, 4, 6, 8, 10, 12, -1}, + {14, -1, -1, -1, -1, -1, -1, -1}, + { 0, 14, -1, -1, -1, -1, -1, -1}, + { 2, 14, -1, -1, -1, -1, -1, -1}, + { 0, 2, 14, -1, -1, -1, -1, -1}, + { 4, 14, -1, -1, -1, -1, -1, -1}, + { 0, 4, 14, -1, -1, -1, -1, -1}, + { 2, 4, 14, -1, -1, -1, -1, -1}, + { 0, 2, 4, 14, -1, -1, -1, -1}, + { 6, 14, -1, -1, -1, -1, -1, -1}, + { 0, 6, 14, -1, -1, -1, -1, -1}, + { 2, 6, 14, -1, -1, -1, -1, -1}, + { 0, 2, 6, 14, -1, -1, -1, -1}, + { 4, 6, 14, -1, -1, -1, -1, -1}, + { 0, 4, 6, 14, -1, -1, -1, -1}, + { 2, 4, 6, 14, -1, -1, -1, -1}, + { 0, 2, 4, 6, 14, -1, -1, -1}, + { 8, 14, -1, -1, -1, -1, -1, -1}, + { 0, 8, 14, -1, -1, -1, -1, -1}, + { 2, 8, 14, -1, -1, -1, -1, -1}, + { 0, 2, 8, 14, -1, -1, -1, -1}, + { 4, 8, 14, -1, -1, -1, -1, -1}, + { 0, 4, 8, 14, -1, -1, -1, -1}, + { 2, 4, 8, 14, -1, -1, -1, -1}, + { 0, 2, 4, 8, 14, -1, -1, -1}, + { 6, 8, 14, -1, -1, -1, -1, -1}, + { 0, 6, 8, 14, -1, -1, -1, -1}, + { 2, 6, 8, 14, -1, -1, -1, -1}, + { 0, 2, 6, 8, 14, -1, -1, -1}, + { 4, 6, 8, 14, -1, -1, -1, -1}, + { 0, 4, 6, 8, 14, -1, -1, -1}, + { 2, 4, 6, 8, 14, -1, -1, -1}, + { 0, 2, 4, 6, 8, 14, -1, -1}, + {10, 14, -1, -1, -1, -1, -1, -1}, + { 0, 10, 14, -1, -1, -1, -1, -1}, + { 2, 10, 14, -1, -1, -1, -1, -1}, + { 0, 2, 10, 14, -1, -1, -1, -1}, + { 4, 10, 14, -1, -1, -1, -1, -1}, + { 0, 4, 10, 14, -1, -1, -1, -1}, + { 2, 4, 10, 14, -1, -1, -1, -1}, + { 0, 2, 4, 10, 14, -1, -1, -1}, + { 6, 10, 14, -1, -1, -1, -1, -1}, + { 0, 6, 10, 14, -1, -1, -1, -1}, + { 2, 6, 10, 14, -1, -1, -1, -1}, + { 0, 2, 6, 10, 14, -1, -1, -1}, + { 4, 6, 10, 14, -1, -1, -1, -1}, + { 0, 4, 6, 10, 14, -1, -1, -1}, + { 2, 4, 6, 10, 14, -1, -1, -1}, + { 0, 2, 4, 6, 10, 14, -1, -1}, + { 8, 10, 14, -1, -1, -1, -1, -1}, + { 0, 8, 10, 14, -1, -1, -1, -1}, + { 2, 8, 10, 14, -1, -1, -1, -1}, + { 0, 2, 8, 10, 14, -1, -1, -1}, + { 4, 8, 10, 14, -1, -1, -1, -1}, + { 0, 4, 8, 10, 14, -1, -1, -1}, + { 2, 4, 8, 10, 14, -1, -1, -1}, + { 0, 2, 4, 8, 10, 14, -1, -1}, + { 6, 8, 10, 14, -1, -1, -1, -1}, + { 0, 6, 8, 10, 14, -1, -1, -1}, + { 2, 6, 8, 10, 14, -1, -1, -1}, + { 0, 2, 6, 8, 10, 14, -1, -1}, + { 4, 6, 8, 10, 14, -1, -1, -1}, + { 0, 4, 6, 8, 10, 14, -1, -1}, + { 2, 4, 6, 8, 10, 14, -1, -1}, + { 0, 2, 4, 6, 8, 10, 14, -1}, + {12, 14, -1, -1, -1, -1, -1, -1}, + { 0, 12, 14, -1, -1, -1, -1, -1}, + { 2, 12, 14, -1, -1, -1, -1, -1}, + { 0, 2, 12, 14, -1, -1, -1, -1}, + { 4, 12, 14, -1, -1, -1, -1, -1}, + { 0, 4, 12, 14, -1, -1, -1, -1}, + { 2, 4, 12, 14, -1, -1, -1, -1}, + { 0, 2, 4, 12, 14, -1, -1, -1}, + { 6, 12, 14, -1, -1, -1, -1, -1}, + { 0, 6, 12, 14, -1, -1, -1, -1}, + { 2, 6, 12, 14, -1, -1, -1, -1}, + { 0, 2, 6, 12, 14, -1, -1, -1}, + { 4, 6, 12, 14, -1, -1, -1, -1}, + { 0, 4, 6, 12, 14, -1, -1, -1}, + { 2, 4, 6, 12, 14, -1, -1, -1}, + { 0, 2, 4, 6, 12, 14, -1, -1}, + { 8, 12, 14, -1, -1, -1, -1, -1}, + { 0, 8, 12, 14, -1, -1, -1, -1}, + { 2, 8, 12, 14, -1, -1, -1, -1}, + { 0, 2, 8, 12, 14, -1, -1, -1}, + { 4, 8, 12, 14, -1, -1, -1, -1}, + { 0, 4, 8, 12, 14, -1, -1, -1}, + { 2, 4, 8, 12, 14, -1, -1, -1}, + { 0, 2, 4, 8, 12, 14, -1, -1}, + { 6, 8, 12, 14, -1, -1, -1, -1}, + { 0, 6, 8, 12, 14, -1, -1, -1}, + { 2, 6, 8, 12, 14, -1, -1, -1}, + { 0, 2, 6, 8, 12, 14, -1, -1}, + { 4, 6, 8, 12, 14, -1, -1, -1}, + { 0, 4, 6, 8, 12, 14, -1, -1}, + { 2, 4, 6, 8, 12, 14, -1, -1}, + { 0, 2, 4, 6, 8, 12, 14, -1}, + {10, 12, 14, -1, -1, -1, -1, -1}, + { 0, 10, 12, 14, -1, -1, -1, -1}, + { 2, 10, 12, 14, -1, -1, -1, -1}, + { 0, 2, 10, 12, 14, -1, -1, -1}, + { 4, 10, 12, 14, -1, -1, -1, -1}, + { 0, 4, 10, 12, 14, -1, -1, -1}, + { 2, 4, 10, 12, 14, -1, -1, -1}, + { 0, 2, 4, 10, 12, 14, -1, -1}, + { 6, 10, 12, 14, -1, -1, -1, -1}, + { 0, 6, 10, 12, 14, -1, -1, -1}, + { 2, 6, 10, 12, 14, -1, -1, -1}, + { 0, 2, 6, 10, 12, 14, -1, -1}, + { 4, 6, 10, 12, 14, -1, -1, -1}, + { 0, 4, 6, 10, 12, 14, -1, -1}, + { 2, 4, 6, 10, 12, 14, -1, -1}, + { 0, 2, 4, 6, 10, 12, 14, -1}, + { 8, 10, 12, 14, -1, -1, -1, -1}, + { 0, 8, 10, 12, 14, -1, -1, -1}, + { 2, 8, 10, 12, 14, -1, -1, -1}, + { 0, 2, 8, 10, 12, 14, -1, -1}, + { 4, 8, 10, 12, 14, -1, -1, -1}, + { 0, 4, 8, 10, 12, 14, -1, -1}, + { 2, 4, 8, 10, 12, 14, -1, -1}, + { 0, 2, 4, 8, 10, 12, 14, -1}, + { 6, 8, 10, 12, 14, -1, -1, -1}, + { 0, 6, 8, 10, 12, 14, -1, -1}, + { 2, 6, 8, 10, 12, 14, -1, -1}, + { 0, 2, 6, 8, 10, 12, 14, -1}, + { 4, 6, 8, 10, 12, 14, -1, -1}, + { 0, 4, 6, 8, 10, 12, 14, -1}, + { 2, 4, 6, 8, 10, 12, 14, -1}, + { 0, 2, 4, 6, 8, 10, 12, 14} +}; +#endif + +#define _mm256_cmpge_epu16(a, b) _mm256_cmpeq_epi16(_mm256_max_epu16(a, b), a) +#define _mm_cmpge_epu16(a, b) _mm_cmpeq_epi16(_mm_max_epu16(a, b), a) + +unsigned int rej_uniform_avx(int16_t * restrict r, const uint8_t *buf) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + uint32_t good; +#ifdef BMI + uint64_t idx0, idx1, idx2, idx3; +#endif + const __m256i bound = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i ones = _mm256_set1_epi8(1); + const __m256i mask = _mm256_set1_epi16(0xFFF); + const __m256i idx8 = _mm256_set_epi8(15,14,14,13,12,11,11,10, + 9, 8, 8, 7, 6, 5, 5, 4, + 11,10,10, 9, 8, 7, 7, 6, + 5, 4, 4, 3, 2, 1, 1, 0); + __m256i f0, f1, g0, g1, g2, g3; + __m128i f, t, pilo, pihi; + + ctr = pos = 0; + while(ctr <= KYBER_N - 32 && pos <= REJ_UNIFORM_AVX_BUFLEN - 56) { + f0 = _mm256_loadu_si256((__m256i *)&buf[pos]); + f1 = _mm256_loadu_si256((__m256i *)&buf[pos+24]); + f0 = _mm256_permute4x64_epi64(f0, 0x94); + f1 = _mm256_permute4x64_epi64(f1, 0x94); + f0 = _mm256_shuffle_epi8(f0, idx8); + f1 = _mm256_shuffle_epi8(f1, idx8); + g0 = _mm256_srli_epi16(f0, 4); + g1 = _mm256_srli_epi16(f1, 4); + f0 = _mm256_blend_epi16(f0, g0, 0xAA); + f1 = _mm256_blend_epi16(f1, g1, 0xAA); + f0 = _mm256_and_si256(f0, mask); + f1 = _mm256_and_si256(f1, mask); + pos += 48; + + g0 = _mm256_cmpgt_epi16(bound, f0); + g1 = _mm256_cmpgt_epi16(bound, f1); + + g0 = _mm256_packs_epi16(g0, g1); + good = _mm256_movemask_epi8(g0); + +#ifdef BMI + idx0 = _pdep_u64(good >> 0, 0x0101010101010101); + idx1 = _pdep_u64(good >> 8, 0x0101010101010101); + idx2 = _pdep_u64(good >> 16, 0x0101010101010101); + idx3 = _pdep_u64(good >> 24, 0x0101010101010101); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + idx1 = (idx1 << 8) - idx1; + idx1 = _pext_u64(0x0E0C0A0806040200, idx1); + idx2 = (idx2 << 8) - idx2; + idx2 = _pext_u64(0x0E0C0A0806040200, idx2); + idx3 = (idx3 << 8) - idx3; + idx3 = _pext_u64(0x0E0C0A0806040200, idx3); + + g0 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx0)); + g1 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx1)); + g0 = _mm256_inserti128_si256(g0, _mm_cvtsi64_si128(idx2), 1); + g1 = _mm256_inserti128_si256(g1, _mm_cvtsi64_si128(idx3), 1); +#else + g0 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 0) & 0xFF])); + g1 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 8) & 0xFF])); + g0 = _mm256_inserti128_si256(g0, _mm_loadl_epi64((__m128i *)&idx[(good >> 16) & 0xFF]), 1); + g1 = _mm256_inserti128_si256(g1, _mm_loadl_epi64((__m128i *)&idx[(good >> 24) & 0xFF]), 1); +#endif + + g2 = _mm256_add_epi8(g0, ones); + g3 = _mm256_add_epi8(g1, ones); + g0 = _mm256_unpacklo_epi8(g0, g2); + g1 = _mm256_unpacklo_epi8(g1, g3); + + f0 = _mm256_shuffle_epi8(f0, g0); + f1 = _mm256_shuffle_epi8(f1, g1); + + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f0)); + ctr += _mm_popcnt_u32((good >> 0) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f0, 1)); + ctr += _mm_popcnt_u32((good >> 16) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f1)); + ctr += _mm_popcnt_u32((good >> 8) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f1, 1)); + ctr += _mm_popcnt_u32((good >> 24) & 0xFF); + } + + while(ctr <= KYBER_N - 8 && pos <= REJ_UNIFORM_AVX_BUFLEN - 16) { + f = _mm_loadu_si128((__m128i *)&buf[pos]); + f = _mm_shuffle_epi8(f, _mm256_castsi256_si128(idx8)); + t = _mm_srli_epi16(f, 4); + f = _mm_blend_epi16(f, t, 0xAA); + f = _mm_and_si128(f, _mm256_castsi256_si128(mask)); + pos += 12; + + t = _mm_cmpgt_epi16(_mm256_castsi256_si128(bound), f); + good = _mm_movemask_epi8(t); + +#ifdef BMI + good &= 0x5555; + idx0 = _pdep_u64(good, 0x1111111111111111); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + pilo = _mm_cvtsi64_si128(idx0); +#else + good = _pext_u32(good, 0x5555); + pilo = _mm_loadl_epi64((__m128i *)&idx[good]); +#endif + + pihi = _mm_add_epi8(pilo, _mm256_castsi256_si128(ones)); + pilo = _mm_unpacklo_epi8(pilo, pihi); + f = _mm_shuffle_epi8(f, pilo); + _mm_storeu_si128((__m128i *)&r[ctr], f); + ctr += _mm_popcnt_u32(good); + } + + while(ctr < KYBER_N && pos <= REJ_UNIFORM_AVX_BUFLEN - 3) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)); + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(val1 < KYBER_Q && ctr < KYBER_N) + r[ctr++] = val1; + } + + return ctr; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.h new file mode 100644 index 000000000..3be5e2192 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.h @@ -0,0 +1,14 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_AVX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +#define REJ_UNIFORM_AVX_BUFLEN (REJ_UNIFORM_AVX_NBLOCKS*XOF_BLOCKBYTES) + +#define rej_uniform_avx KYBER_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int16_t *r, const uint8_t *buf); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S new file mode 100644 index 000000000..18325ebec --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S @@ -0,0 +1,255 @@ +#include "consts.h" +.include "fq.inc" +.include "shuffle.inc" + +/* +nttpack_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +#store +vmovdqa %ymm7,(%rdi) +vmovdqa %ymm9,32(%rdi) +vmovdqa %ymm6,64(%rdi) +vmovdqa %ymm3,96(%rdi) +vmovdqa %ymm10,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm5,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret +*/ + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +shuffle1 9,5,10,5 +shuffle1 8,4,9,4 +shuffle1 7,3,8,3 +shuffle1 6,11,7,11 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm5,32(%rdi) +vmovdqa %ymm9,64(%rdi) +vmovdqa %ymm4,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm3,160(%rdi) +vmovdqa %ymm7,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret + +ntttobytes128_avx: +#load +vmovdqa (%rsi),%ymm5 +vmovdqa 32(%rsi),%ymm6 +vmovdqa 64(%rsi),%ymm7 +vmovdqa 96(%rsi),%ymm8 +vmovdqa 128(%rsi),%ymm9 +vmovdqa 160(%rsi),%ymm10 +vmovdqa 192(%rsi),%ymm11 +vmovdqa 224(%rsi),%ymm12 + +#csubq +csubq 5,13 +csubq 6,13 +csubq 7,13 +csubq 8,13 +csubq 9,13 +csubq 10,13 +csubq 11,13 +csubq 12,13 + +#bitpack +vpsllw $12,%ymm6,%ymm4 +vpor %ymm4,%ymm5,%ymm4 + +vpsrlw $4,%ymm6,%ymm5 +vpsllw $8,%ymm7,%ymm6 +vpor %ymm5,%ymm6,%ymm5 + +vpsrlw $8,%ymm7,%ymm6 +vpsllw $4,%ymm8,%ymm7 +vpor %ymm6,%ymm7,%ymm6 + +vpsllw $12,%ymm10,%ymm7 +vpor %ymm7,%ymm9,%ymm7 + +vpsrlw $4,%ymm10,%ymm8 +vpsllw $8,%ymm11,%ymm9 +vpor %ymm8,%ymm9,%ymm8 + +vpsrlw $8,%ymm11,%ymm9 +vpsllw $4,%ymm12,%ymm10 +vpor %ymm9,%ymm10,%ymm9 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 + +shuffle2 3,4,8,4 +shuffle2 6,5,3,5 +shuffle2 7,9,6,9 + +shuffle4 8,3,7,3 +shuffle4 6,4,8,4 +shuffle4 5,9,6,9 + +shuffle8 7,8,5,8 +shuffle8 6,3,7,3 +shuffle8 4,9,6,9 + +#store +vmovdqu %ymm5,(%rdi) +vmovdqu %ymm7,32(%rdi) +vmovdqu %ymm6,64(%rdi) +vmovdqu %ymm8,96(%rdi) +vmovdqu %ymm3,128(%rdi) +vmovdqu %ymm9,160(%rdi) + +ret + +.global cdecl(ntttobytes_avx) +cdecl(ntttobytes_avx): +#consts +vmovdqa _16XQ*2(%rdx),%ymm0 +call ntttobytes128_avx +add $256,%rsi +add $192,%rdi +call ntttobytes128_avx +ret + +nttfrombytes128_avx: +#load +vmovdqu (%rsi),%ymm4 +vmovdqu 32(%rsi),%ymm5 +vmovdqu 64(%rsi),%ymm6 +vmovdqu 96(%rsi),%ymm7 +vmovdqu 128(%rsi),%ymm8 +vmovdqu 160(%rsi),%ymm9 + +shuffle8 4,7,3,7 +shuffle8 5,8,4,8 +shuffle8 6,9,5,9 + +shuffle4 3,8,6,8 +shuffle4 7,5,3,5 +shuffle4 4,9,7,9 + +shuffle2 6,5,4,5 +shuffle2 8,7,6,7 +shuffle2 3,9,8,9 + +shuffle1 4,7,10,7 +shuffle1 5,8,4,8 +shuffle1 6,9,5,9 + +#bitunpack +vpsrlw $12,%ymm10,%ymm11 +vpsllw $4,%ymm7,%ymm12 +vpor %ymm11,%ymm12,%ymm11 +vpand %ymm0,%ymm10,%ymm10 +vpand %ymm0,%ymm11,%ymm11 + +vpsrlw $8,%ymm7,%ymm12 +vpsllw $8,%ymm4,%ymm13 +vpor %ymm12,%ymm13,%ymm12 +vpand %ymm0,%ymm12,%ymm12 + +vpsrlw $4,%ymm4,%ymm13 +vpand %ymm0,%ymm13,%ymm13 + +vpsrlw $12,%ymm8,%ymm14 +vpsllw $4,%ymm5,%ymm15 +vpor %ymm14,%ymm15,%ymm14 +vpand %ymm0,%ymm8,%ymm8 +vpand %ymm0,%ymm14,%ymm14 + +vpsrlw $8,%ymm5,%ymm15 +vpsllw $8,%ymm9,%ymm1 +vpor %ymm15,%ymm1,%ymm15 +vpand %ymm0,%ymm15,%ymm15 + +vpsrlw $4,%ymm9,%ymm1 +vpand %ymm0,%ymm1,%ymm1 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm11,32(%rdi) +vmovdqa %ymm12,64(%rdi) +vmovdqa %ymm13,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm14,160(%rdi) +vmovdqa %ymm15,192(%rdi) +vmovdqa %ymm1,224(%rdi) + +ret + +.global cdecl(nttfrombytes_avx) +cdecl(nttfrombytes_avx): +#consts +vmovdqa _16XMASK*2(%rdx),%ymm0 +call nttfrombytes128_avx +add $256,%rdi +add $192,%rsi +call nttfrombytes128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric.h new file mode 100644 index 000000000..e4941f7a8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric.h @@ -0,0 +1,34 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" +#include "fips202x4.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c new file mode 100644 index 000000000..aa8e2850b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint64_t r; + __m256i f, g, h; + + h = _mm256_setzero_si256(); + for(i=0;i> 63; + return r; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t * restrict r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + __m256i xvec, rvec, bvec; + + bvec = _mm256_set1_epi64x(-(uint64_t)b); + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/api.h new file mode 100644 index 000000000..70d40f3f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_ref_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_ref_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_ref_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_ref_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_ref_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_ref_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_ref_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_ref_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_ref_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_ref_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_ref_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_ref_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_ref_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_ref_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_ref_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_ref_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_ref_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_ref_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c new file mode 100644 index 000000000..1500ffea5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c @@ -0,0 +1,128 @@ +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: load32_littleendian +* +* Description: load 4 bytes into a 32-bit integer +* in little-endian order +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x +**************************************************/ +static uint32_t load32_littleendian(const uint8_t x[4]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + r |= (uint32_t)x[3] << 24; + return r; +} + +/************************************************* +* Name: load24_littleendian +* +* Description: load 3 bytes into a 32-bit integer +* in little-endian order. +* This function is only needed for Kyber-512 +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x (most significant byte is zero) +**************************************************/ +#if KYBER_ETA1 == 3 +static uint32_t load24_littleendian(const uint8_t x[3]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + return r; +} +#endif + + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +static void cbd2(poly *r, const uint8_t buf[2*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x55555555; + + for(j=0;j<8;j++) { + a = (d >> (4*j+0)) & 0x3; + b = (d >> (4*j+2)) & 0x3; + r->coeffs[8*i+j] = a - b; + } + } +} + +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3. +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +#if KYBER_ETA1 == 3 +static void cbd3(poly *r, const uint8_t buf[3*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x00249249; + d += (t>>2) & 0x00249249; + + for(j=0;j<4;j++) { + a = (d >> (6*j+0)) & 0x7; + b = (d >> (6*j+3)) & 0x7; + r->coeffs[4*i+j] = a - b; + } + } +} +#endif + +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.h new file mode 100644 index 000000000..7b677d745 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.h @@ -0,0 +1,14 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c new file mode 100644 index 000000000..4a8b4c894 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c @@ -0,0 +1,331 @@ +#include +#include +#include +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk +* and the public seed used to generate the matrix A. +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output buffer +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#define GEN_MATRIX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +// Not static for benchmarking +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) +{ + unsigned int ctr, i, j, k; + unsigned int buflen, off; + uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; + xof_state state; + xof_init(&state, seed); + + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c new file mode 100644 index 000000000..2f2eb10b2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c @@ -0,0 +1,146 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +/* Code to generate zetas and zetas_inv used in the number-theoretic transform: + +#define KYBER_ROOT_OF_UNITY 17 + +static const uint8_t tree[128] = { + 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, + 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, + 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, + 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, + 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, + 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, + 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, + 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127 +}; + +void init_ntt() { + unsigned int i; + int16_t tmp[128]; + + tmp[0] = MONT; + for(i=1;i<128;i++) + tmp[i] = fqmul(tmp[i-1],MONT*KYBER_ROOT_OF_UNITY % KYBER_Q); + + for(i=0;i<128;i++) { + zetas[i] = tmp[tree[i]]; + if(zetas[i] > KYBER_Q/2) + zetas[i] -= KYBER_Q; + if(zetas[i] < -KYBER_Q/2) + zetas[i] += KYBER_Q; + } +} +*/ + +const int16_t zetas[128] = { + -1044, -758, -359, -1517, 1493, 1422, 287, 202, + -171, 622, 1577, 182, 962, -1202, -1474, 1468, + 573, -1325, 264, 383, -829, 1458, -1602, -130, + -681, 1017, 732, 608, -1542, 411, -205, -1571, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -1103, 430, 555, 843, -1251, 871, 1550, 105, + 422, 587, 177, -235, -291, -460, 1574, 1653, + -246, 778, 1159, -147, -777, 1483, -602, 1119, + -1590, 644, -872, 349, 418, 329, -156, -75, + 817, 1097, 603, 610, 1322, -1285, -1465, 384, + -1215, -136, 1218, -1335, -874, 220, -1187, -1659, + -1185, -1530, -1278, 794, -1510, -854, -870, 478, + -108, -308, 996, 991, 958, -1460, 1522, 1628 +}; + +/************************************************* +* Name: fqmul +* +* Description: Multiplication followed by Montgomery reduction +* +* Arguments: - int16_t a: first factor +* - int16_t b: second factor +* +* Returns 16-bit integer congruent to a*b*R^{-1} mod q +**************************************************/ +static int16_t fqmul(int16_t a, int16_t b) { + return montgomery_reduce((int32_t)a*b); +} + +/************************************************* +* Name: ntt +* +* Description: Inplace number-theoretic transform (NTT) in Rq. +* input is in standard order, output is in bitreversed order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void ntt(int16_t r[256]) { + unsigned int len, start, j, k; + int16_t t, zeta; + + k = 1; + for(len = 128; len >= 2; len >>= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k++]; + for(j = start; j < start + len; j++) { + t = fqmul(zeta, r[j + len]); + r[j + len] = r[j] - t; + r[j] = r[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inplace inverse number-theoretic transform in Rq and +* multiplication by Montgomery factor 2^16. +* Input is in bitreversed order, output is in standard order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void invntt(int16_t r[256]) { + unsigned int start, len, j, k; + int16_t t, zeta; + const int16_t f = 1441; // mont^2/128 + + k = 127; + for(len = 2; len <= 128; len <<= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k--]; + for(j = start; j < start + len; j++) { + t = r[j]; + r[j] = barrett_reduce(t + r[j + len]); + r[j + len] = r[j + len] - t; + r[j + len] = fqmul(zeta, r[j + len]); + } + } + } + + for(j = 0; j < 256; j++) + r[j] = fqmul(r[j], f); +} + +/************************************************* +* Name: basemul +* +* Description: Multiplication of polynomials in Zq[X]/(X^2-zeta) +* used for multiplication of elements in Rq in NTT domain +* +* Arguments: - int16_t r[2]: pointer to the output polynomial +* - const int16_t a[2]: pointer to the first factor +* - const int16_t b[2]: pointer to the second factor +* - int16_t zeta: integer defining the reduction polynomial +**************************************************/ +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta) +{ + r[0] = fqmul(a[1], b[1]); + r[0] = fqmul(r[0], zeta); + r[0] += fqmul(a[0], b[0]); + r[1] = fqmul(a[0], b[1]); + r[1] += fqmul(a[1], b[0]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.h new file mode 100644 index 000000000..227ea74f0 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define zetas KYBER_NAMESPACE(zetas) +extern const int16_t zetas[128]; + +#define ntt KYBER_NAMESPACE(ntt) +void ntt(int16_t poly[256]); + +#define invntt KYBER_NAMESPACE(invntt) +void invntt(int16_t poly[256]); + +#define basemul KYBER_NAMESPACE(basemul) +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/params.h new file mode 100644 index 000000000..36b2b987f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/params.h @@ -0,0 +1,55 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_ref_##s +#elif (KYBER_K == 3) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_ref_##s +#elif (KYBER_K == 4) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_ref_##s +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c new file mode 100644 index 000000000..9556ee517 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c @@ -0,0 +1,343 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) +{ + unsigned int i,j; + int16_t u; + uint8_t t[8]; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; + } + + r[0] = t[0] | (t[1] << 4); + r[1] = t[2] | (t[3] << 4); + r[2] = t[4] | (t[5] << 4); + r[3] = t[6] | (t[7] << 4); + r += 4; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; + } + + r[0] = (t[0] >> 0) | (t[1] << 5); + r[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7); + r[2] = (t[3] >> 1) | (t[4] << 4); + r[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6); + r[4] = (t[6] >> 2) | (t[7] << 3); + r += 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]) +{ + unsigned int i; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[2*i+0] = (((uint16_t)(a[0] & 15)*KYBER_Q) + 8) >> 4; + r->coeffs[2*i+1] = (((uint16_t)(a[0] >> 4)*KYBER_Q) + 8) >> 4; + a += 1; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + unsigned int j; + uint8_t t[8]; + for(i=0;i> 0); + t[1] = (a[0] >> 5) | (a[1] << 3); + t[2] = (a[1] >> 2); + t[3] = (a[1] >> 7) | (a[2] << 1); + t[4] = (a[2] >> 4) | (a[3] << 4); + t[5] = (a[3] >> 1); + t[6] = (a[3] >> 6) | (a[4] << 2); + t[7] = (a[4] >> 3); + a += 5; + + for(j=0;j<8;j++) + r->coeffs[8*i+j] = ((uint32_t)(t[j] & 31)*KYBER_Q + 16) >> 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + unsigned int i; + uint16_t t0, t1; + + for(i=0;icoeffs[2*i]; + t0 += ((int16_t)t0 >> 15) & KYBER_Q; + t1 = a->coeffs[2*i+1]; + t1 += ((int16_t)t1 >> 15) & KYBER_Q; + r[3*i+0] = (t0 >> 0); + r[3*i+1] = (t0 >> 8) | (t1 << 4); + r[3*i+2] = (t1 >> 4); + } +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + unsigned int i; + for(i=0;icoeffs[2*i] = ((a[3*i+0] >> 0) | ((uint16_t)a[3*i+1] << 8)) & 0xFFF; + r->coeffs[2*i+1] = ((a[3*i+1] >> 4) | ((uint16_t)a[3*i+2] << 4)) & 0xFFF; + } +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ + unsigned int i,j; + int16_t mask; + +#if (KYBER_INDCPA_MSGBYTES != KYBER_N/8) +#error "KYBER_INDCPA_MSGBYTES must be equal to KYBER_N/8 bytes!" +#endif + + for(i=0;i> j)&1); + r->coeffs[8*i+j] = mask & ((KYBER_Q+1)/2); + } + } +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message +* +* Arguments: - uint8_t *msg: pointer to output message +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) +{ + unsigned int i,j; + uint16_t t; + + for(i=0;icoeffs[8*i+j]; + t += ((int16_t)t >> 15) & KYBER_Q; + t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + msg[i] |= t << j; + } + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA1*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta1(r, buf); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA2*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta2(r, buf); +} + + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place; +* inputs assumed to be in normal order, output in bitreversed order +* +* Arguments: - uint16_t *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt(r->coeffs); + poly_reduce(r); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* inputs assumed to be in bitreversed order, output in normal order +* +* Arguments: - uint16_t *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt(r->coeffs); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[4*i], &a->coeffs[4*i], &b->coeffs[4*i], zetas[64+i]); + basemul(&r->coeffs[4*i+2], &a->coeffs[4*i+2], &b->coeffs[4*i+2], -zetas[64+i]); + } +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + unsigned int i; + const int16_t f = (1ULL << 32) % KYBER_Q; + for(i=0;icoeffs[i] = montgomery_reduce((int32_t)r->coeffs[i]*f); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + unsigned int i; + for(i=0;icoeffs[i] = barrett_reduce(r->coeffs[i]); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] + b->coeffs[i]; +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] - b->coeffs[i]; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.h new file mode 100644 index 000000000..9a99c7cda --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.h @@ -0,0 +1,53 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +/* + * Elements of R_q = Z_q[X]/(X^n + 1). Represents polynomial + * coeffs[0] + X*coeffs[1] + X^2*coeffs[2] + ... + X^{n-1}*coeffs[n-1] + */ +typedef struct{ + int16_t coeffs[KYBER_N]; +} poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c new file mode 100644 index 000000000..8420d069c --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c @@ -0,0 +1,233 @@ +#include +#include "params.h" +#include "poly.h" +#include "polyvec.h" + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;ivec[i].coeffs[8*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; + } + + r[ 0] = (t[0] >> 0); + r[ 1] = (t[0] >> 8) | (t[1] << 3); + r[ 2] = (t[1] >> 5) | (t[2] << 6); + r[ 3] = (t[2] >> 2); + r[ 4] = (t[2] >> 10) | (t[3] << 1); + r[ 5] = (t[3] >> 7) | (t[4] << 4); + r[ 6] = (t[4] >> 4) | (t[5] << 7); + r[ 7] = (t[5] >> 1); + r[ 8] = (t[5] >> 9) | (t[6] << 2); + r[ 9] = (t[6] >> 6) | (t[7] << 5); + r[10] = (t[7] >> 3); + r += 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;ivec[i].coeffs[4*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; + } + + r[0] = (t[0] >> 0); + r[1] = (t[0] >> 8) | (t[1] << 2); + r[2] = (t[1] >> 6) | (t[2] << 4); + r[3] = (t[2] >> 4) | (t[3] << 6); + r[4] = (t[3] >> 2); + r += 5; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;i> 0) | ((uint16_t)a[ 1] << 8); + t[1] = (a[1] >> 3) | ((uint16_t)a[ 2] << 5); + t[2] = (a[2] >> 6) | ((uint16_t)a[ 3] << 2) | ((uint16_t)a[4] << 10); + t[3] = (a[4] >> 1) | ((uint16_t)a[ 5] << 7); + t[4] = (a[5] >> 4) | ((uint16_t)a[ 6] << 4); + t[5] = (a[6] >> 7) | ((uint16_t)a[ 7] << 1) | ((uint16_t)a[8] << 9); + t[6] = (a[8] >> 2) | ((uint16_t)a[ 9] << 6); + t[7] = (a[9] >> 5) | ((uint16_t)a[10] << 3); + a += 11; + + for(k=0;k<8;k++) + r->vec[i].coeffs[8*j+k] = ((uint32_t)(t[k] & 0x7FF)*KYBER_Q + 1024) >> 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;i> 0) | ((uint16_t)a[1] << 8); + t[1] = (a[1] >> 2) | ((uint16_t)a[2] << 6); + t[2] = (a[2] >> 4) | ((uint16_t)a[3] << 4); + t[3] = (a[3] >> 6) | ((uint16_t)a[4] << 2); + a += 5; + + for(k=0;k<4;k++) + r->vec[i].coeffs[4*j+k] = ((uint32_t)(t[k] & 0x3FF)*KYBER_Q + 512) >> 10; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements of a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly t; + + poly_basemul_montgomery(r, &a->vec[0], &b->vec[0]); + for(i=1;ivec[i], &b->vec[i]); + poly_add(r, r, &t); + } + + poly_reduce(r); +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.h new file mode 100644 index 000000000..57b605494 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c new file mode 100644 index 000000000..9d8e7edf8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c @@ -0,0 +1,42 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: Montgomery reduction; given a 32-bit integer a, computes +* 16-bit integer congruent to a * R^-1 mod q, where R=2^16 +* +* Arguments: - int32_t a: input integer to be reduced; +* has to be in {-q2^15,...,q2^15-1} +* +* Returns: integer in {-q+1,...,q-1} congruent to a * R^-1 modulo q. +**************************************************/ +int16_t montgomery_reduce(int32_t a) +{ + int16_t t; + + t = (int16_t)a*QINV; + t = (a - (int32_t)t*KYBER_Q) >> 16; + return t; +} + +/************************************************* +* Name: barrett_reduce +* +* Description: Barrett reduction; given a 16-bit integer a, computes +* centered representative congruent to a mod q in {-(q-1)/2,...,(q-1)/2} +* +* Arguments: - int16_t a: input integer to be reduced +* +* Returns: integer in {-(q-1)/2,...,(q-1)/2} congruent to a modulo q. +**************************************************/ +int16_t barrett_reduce(int16_t a) { + int16_t t; + const int16_t v = ((1<<26) + KYBER_Q/2)/KYBER_Q; + + t = ((int32_t)v*a + (1<<25)) >> 26; + t *= KYBER_Q; + return a - t; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.h new file mode 100644 index 000000000..c1bc1e4c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.h @@ -0,0 +1,16 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 + +#define montgomery_reduce KYBER_NAMESPACE(montgomery_reduce) +int16_t montgomery_reduce(int32_t a); + +#define barrett_reduce KYBER_NAMESPACE(barrett_reduce) +int16_t barrett_reduce(int16_t a); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric.h new file mode 100644 index 000000000..2acc66f98 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric.h @@ -0,0 +1,35 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_init(STATE, SEED) shake128_inc_init(STATE) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define xof_release(STATE) shake128_inc_ctx_release(STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c new file mode 100644 index 000000000..ed4a6541f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c @@ -0,0 +1,47 @@ +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint8_t r = 0; + + for(i=0;i> 63; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + + b = -b; + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/align.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/align.h new file mode 100644 index 000000000..3463866f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/align.h @@ -0,0 +1,19 @@ +#ifndef ALIGN_H +#define ALIGN_H + +#include +#include + +#define ALIGNED_UINT8(N) \ + union { \ + uint8_t coeffs[N]; \ + __m256i vec[(N+31)/32]; \ + } + +#define ALIGNED_INT16(N) \ + union { \ + int16_t coeffs[N]; \ + __m256i vec[(N+15)/16]; \ + } + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/api.h new file mode 100644 index 000000000..a154e80f1 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_avx2_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_avx2_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_avx2_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_avx2_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_avx2_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_avx2_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_avx2_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_avx2_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_avx2_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_avx2_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_avx2_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_avx2_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_avx2_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_avx2_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_avx2_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_avx2_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_avx2_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_avx2_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_avx2_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_avx2_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S new file mode 100644 index 000000000..36990639b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S @@ -0,0 +1,105 @@ +#include "consts.h" + +.macro schoolbook off +vmovdqa _16XQINV*2(%rcx),%ymm0 +vmovdqa (64*\off+ 0)*2(%rsi),%ymm1 # a0 +vmovdqa (64*\off+16)*2(%rsi),%ymm2 # b0 +vmovdqa (64*\off+32)*2(%rsi),%ymm3 # a1 +vmovdqa (64*\off+48)*2(%rsi),%ymm4 # b1 + +vpmullw %ymm0,%ymm1,%ymm9 # a0.lo +vpmullw %ymm0,%ymm2,%ymm10 # b0.lo +vpmullw %ymm0,%ymm3,%ymm11 # a1.lo +vpmullw %ymm0,%ymm4,%ymm12 # b1.lo + +vmovdqa (64*\off+ 0)*2(%rdx),%ymm5 # c0 +vmovdqa (64*\off+16)*2(%rdx),%ymm6 # d0 + +vpmulhw %ymm5,%ymm1,%ymm13 # a0c0.hi +vpmulhw %ymm6,%ymm1,%ymm1 # a0d0.hi +vpmulhw %ymm5,%ymm2,%ymm14 # b0c0.hi +vpmulhw %ymm6,%ymm2,%ymm2 # b0d0.hi + +vmovdqa (64*\off+32)*2(%rdx),%ymm7 # c1 +vmovdqa (64*\off+48)*2(%rdx),%ymm8 # d1 + +vpmulhw %ymm7,%ymm3,%ymm15 # a1c1.hi +vpmulhw %ymm8,%ymm3,%ymm3 # a1d1.hi +vpmulhw %ymm7,%ymm4,%ymm0 # b1c1.hi +vpmulhw %ymm8,%ymm4,%ymm4 # b1d1.hi + +vmovdqa %ymm13,(%rsp) + +vpmullw %ymm5,%ymm9,%ymm13 # a0c0.lo +vpmullw %ymm6,%ymm9,%ymm9 # a0d0.lo +vpmullw %ymm5,%ymm10,%ymm5 # b0c0.lo +vpmullw %ymm6,%ymm10,%ymm10 # b0d0.lo + +vpmullw %ymm7,%ymm11,%ymm6 # a1c1.lo +vpmullw %ymm8,%ymm11,%ymm11 # a1d1.lo +vpmullw %ymm7,%ymm12,%ymm7 # b1c1.lo +vpmullw %ymm8,%ymm12,%ymm12 # b1d1.lo + +vmovdqa _16XQ*2(%rcx),%ymm8 +vpmulhw %ymm8,%ymm13,%ymm13 +vpmulhw %ymm8,%ymm9,%ymm9 +vpmulhw %ymm8,%ymm5,%ymm5 +vpmulhw %ymm8,%ymm10,%ymm10 +vpmulhw %ymm8,%ymm6,%ymm6 +vpmulhw %ymm8,%ymm11,%ymm11 +vpmulhw %ymm8,%ymm7,%ymm7 +vpmulhw %ymm8,%ymm12,%ymm12 + +vpsubw (%rsp),%ymm13,%ymm13 # -a0c0 +vpsubw %ymm9,%ymm1,%ymm9 # a0d0 +vpsubw %ymm5,%ymm14,%ymm5 # b0c0 +vpsubw %ymm10,%ymm2,%ymm10 # b0d0 + +vpsubw %ymm6,%ymm15,%ymm6 # a1c1 +vpsubw %ymm11,%ymm3,%ymm11 # a1d1 +vpsubw %ymm7,%ymm0,%ymm7 # b1c1 +vpsubw %ymm12,%ymm4,%ymm12 # b1d1 + +vmovdqa (%r9),%ymm0 +vmovdqa 32(%r9),%ymm1 +vpmullw %ymm0,%ymm10,%ymm2 +vpmullw %ymm0,%ymm12,%ymm3 +vpmulhw %ymm1,%ymm10,%ymm10 +vpmulhw %ymm1,%ymm12,%ymm12 +vpmulhw %ymm8,%ymm2,%ymm2 +vpmulhw %ymm8,%ymm3,%ymm3 +vpsubw %ymm2,%ymm10,%ymm10 # rb0d0 +vpsubw %ymm3,%ymm12,%ymm12 # rb1d1 + +vpaddw %ymm5,%ymm9,%ymm9 +vpaddw %ymm7,%ymm11,%ymm11 +vpsubw %ymm13,%ymm10,%ymm13 +vpsubw %ymm12,%ymm6,%ymm6 + +vmovdqa %ymm13,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(64*\off+16)*2(%rdi) +vmovdqa %ymm6,(64*\off+32)*2(%rdi) +vmovdqa %ymm11,(64*\off+48)*2(%rdi) +.endm + +.text +.global cdecl(basemul_avx) +cdecl(basemul_avx): +mov %rsp,%r8 +and $-32,%rsp +sub $32,%rsp + +lea (_ZETAS_EXP+176)*2(%rcx),%r9 +schoolbook 0 + +add $32*2,%r9 +schoolbook 1 + +add $192*2,%r9 +schoolbook 2 + +add $32*2,%r9 +schoolbook 3 + +mov %r8,%rsp +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c new file mode 100644 index 000000000..dad473c79 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c @@ -0,0 +1,144 @@ +#include +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd2(poly * restrict r, const __m256i buf[2*KYBER_N/128]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask55 = _mm256_set1_epi32(0x55555555); + const __m256i mask33 = _mm256_set1_epi32(0x33333333); + const __m256i mask03 = _mm256_set1_epi32(0x03030303); + const __m256i mask0F = _mm256_set1_epi32(0x0F0F0F0F); + + for(i = 0; i < KYBER_N/64; i++) { + f0 = _mm256_load_si256(&buf[i]); + + f1 = _mm256_srli_epi16(f0, 1); + f0 = _mm256_and_si256(mask55, f0); + f1 = _mm256_and_si256(mask55, f1); + f0 = _mm256_add_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 2); + f0 = _mm256_and_si256(mask33, f0); + f1 = _mm256_and_si256(mask33, f1); + f0 = _mm256_add_epi8(f0, mask33); + f0 = _mm256_sub_epi8(f0, f1); + + f1 = _mm256_srli_epi16(f0, 4); + f0 = _mm256_and_si256(mask0F, f0); + f1 = _mm256_and_si256(mask0F, f1); + f0 = _mm256_sub_epi8(f0, mask03); + f1 = _mm256_sub_epi8(f1, mask03); + + f2 = _mm256_unpacklo_epi8(f0, f1); + f3 = _mm256_unpackhi_epi8(f0, f1); + + f0 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f2)); + f1 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f2,1)); + f2 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(f3)); + f3 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(f3,1)); + + _mm256_store_si256(&r->vec[4*i+0], f0); + _mm256_store_si256(&r->vec[4*i+1], f2); + _mm256_store_si256(&r->vec[4*i+2], f1); + _mm256_store_si256(&r->vec[4*i+3], f3); + } +} + +#if KYBER_ETA1 == 3 +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3 +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const __m256i *buf: pointer to aligned input byte array +**************************************************/ +static void cbd3(poly * restrict r, const uint8_t buf[3*KYBER_N/4+8]) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i mask249 = _mm256_set1_epi32(0x249249); + const __m256i mask6DB = _mm256_set1_epi32(0x6DB6DB); + const __m256i mask07 = _mm256_set1_epi32(7); + const __m256i mask70 = _mm256_set1_epi32(7 << 16); + const __m256i mask3 = _mm256_set1_epi16(3); + const __m256i shufbidx = _mm256_set_epi8(-1,15,14,13,-1,12,11,10,-1, 9, 8, 7,-1, 6, 5, 4, + -1,11,10, 9,-1, 8, 7, 6,-1, 5, 4, 3,-1, 2, 1, 0); + + for(i = 0; i < KYBER_N/32; i++) { + f0 = _mm256_loadu_si256((__m256i *)&buf[24*i]); + f0 = _mm256_permute4x64_epi64(f0,0x94); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + + f1 = _mm256_srli_epi32(f0,1); + f2 = _mm256_srli_epi32(f0,2); + f0 = _mm256_and_si256(mask249,f0); + f1 = _mm256_and_si256(mask249,f1); + f2 = _mm256_and_si256(mask249,f2); + f0 = _mm256_add_epi32(f0,f1); + f0 = _mm256_add_epi32(f0,f2); + + f1 = _mm256_srli_epi32(f0,3); + f0 = _mm256_add_epi32(f0,mask6DB); + f0 = _mm256_sub_epi32(f0,f1); + + f1 = _mm256_slli_epi32(f0,10); + f2 = _mm256_srli_epi32(f0,12); + f3 = _mm256_srli_epi32(f0, 2); + f0 = _mm256_and_si256(f0,mask07); + f1 = _mm256_and_si256(f1,mask70); + f2 = _mm256_and_si256(f2,mask07); + f3 = _mm256_and_si256(f3,mask70); + f0 = _mm256_add_epi16(f0,f1); + f1 = _mm256_add_epi16(f2,f3); + f0 = _mm256_sub_epi16(f0,mask3); + f1 = _mm256_sub_epi16(f1,mask3); + + f2 = _mm256_unpacklo_epi32(f0,f1); + f3 = _mm256_unpackhi_epi32(f0,f1); + + f0 = _mm256_permute2x128_si256(f2,f3,0x20); + f1 = _mm256_permute2x128_si256(f2,f3,0x31); + + _mm256_store_si256(&r->vec[2*i+0], f0); + _mm256_store_si256(&r->vec[2*i+1], f1); + } +} +#endif + +/* buf 32 bytes longer for cbd3 */ +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, (uint8_t *)buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.h new file mode 100644 index 000000000..05788e06b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.h @@ -0,0 +1,15 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const __m256i buf[KYBER_ETA1*KYBER_N/128+1]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const __m256i buf[KYBER_ETA2*KYBER_N/128]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c new file mode 100644 index 000000000..84e596893 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c @@ -0,0 +1,121 @@ +#include "align.h" +#include "params.h" +#include "consts.h" + +#define Q KYBER_Q +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 +#define V 20159 // floor(2^26/q + 0.5) +#define FHI 1441 // mont^2/128 +#define FLO -10079 // qinv*FHI +#define MONTSQHI 1353 // mont^2 +#define MONTSQLO 20553 // qinv*MONTSQHI +#define MASK 4095 +#define SHIFT 32 + +const qdata_t qdata = {{ +#define _16XQ 0 + Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, + +#define _16XQINV 16 + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + QINV, QINV, QINV, QINV, QINV, QINV, QINV, QINV, + +#define _16XV 32 + V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, + +#define _16XFLO 48 + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + FLO, FLO, FLO, FLO, FLO, FLO, FLO, FLO, + +#define _16XFHI 64 + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + FHI, FHI, FHI, FHI, FHI, FHI, FHI, FHI, + +#define _16XMONTSQLO 80 + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + MONTSQLO, MONTSQLO, MONTSQLO, MONTSQLO, + +#define _16XMONTSQHI 96 + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + MONTSQHI, MONTSQHI, MONTSQHI, MONTSQHI, + +#define _16XMASK 112 + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, + +#define _REVIDXB 128 + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + 3854, 3340, 2826, 2312, 1798, 1284, 770, 256, + +#define _REVIDXD 144 + 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0, + +#define _ZETAS_EXP 160 + 31498, 31498, 31498, 31498, -758, -758, -758, -758, + 5237, 5237, 5237, 5237, 1397, 1397, 1397, 1397, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + 14745, 14745, 14745, 14745, 14745, 14745, 14745, 14745, + -359, -359, -359, -359, -359, -359, -359, -359, + -359, -359, -359, -359, -359, -359, -359, -359, + 13525, 13525, 13525, 13525, 13525, 13525, 13525, 13525, + -12402, -12402, -12402, -12402, -12402, -12402, -12402, -12402, + 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + -20907, -20907, -20907, -20907, 27758, 27758, 27758, 27758, + -3799, -3799, -3799, -3799, -15690, -15690, -15690, -15690, + -171, -171, -171, -171, 622, 622, 622, 622, + 1577, 1577, 1577, 1577, 182, 182, 182, 182, + -5827, -5827, 17363, 17363, -26360, -26360, -29057, -29057, + 5571, 5571, -1102, -1102, 21438, 21438, -26242, -26242, + 573, 573, -1325, -1325, 264, 264, 383, 383, + -829, -829, 1458, 1458, -1602, -1602, -130, -130, + -5689, -6516, 1496, 30967, -23565, 20179, 20710, 25080, + -12796, 26616, 16064, -12442, 9134, -650, -25986, 27837, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -335, -11477, -32227, 20494, -27738, 945, -14883, 6182, + 32010, 10631, 29175, -28762, -18486, 17560, -14430, -5276, + -1103, 555, -1251, 1550, 422, 177, -291, 1574, + -246, 1159, -777, -602, -1590, -872, 418, -156, + 11182, 13387, -14233, -21655, 13131, -4587, 23092, 5493, + -32502, 30317, -18741, 12639, 20100, 18525, 19529, -12619, + 430, 843, 871, 105, 587, -235, -460, 1653, + 778, -147, 1483, 1119, 644, 349, 329, -75, + 787, 787, 787, 787, 787, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 787, 787, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + -1517, -1517, -1517, -1517, -1517, -1517, -1517, -1517, + 28191, 28191, 28191, 28191, 28191, 28191, 28191, 28191, + -16694, -16694, -16694, -16694, -16694, -16694, -16694, -16694, + 287, 287, 287, 287, 287, 287, 287, 287, + 202, 202, 202, 202, 202, 202, 202, 202, + 10690, 10690, 10690, 10690, 1358, 1358, 1358, 1358, + -11202, -11202, -11202, -11202, 31164, 31164, 31164, 31164, + 962, 962, 962, 962, -1202, -1202, -1202, -1202, + -1474, -1474, -1474, -1474, 1468, 1468, 1468, 1468, + -28073, -28073, 24313, 24313, -10532, -10532, 8800, 8800, + 18426, 18426, 8859, 8859, 26675, 26675, -16163, -16163, + -681, -681, 1017, 1017, 732, 732, 608, 608, + -1542, -1542, 411, 411, -205, -205, -1571, -1571, + 19883, -28250, -15887, -8898, -28309, 9075, -30199, 18249, + 13426, 14017, -29156, -12757, 16832, 4311, -24155, -17915, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -31183, 25435, -7382, 24391, -20927, 10946, 24214, 16989, + 10335, -7934, -22502, 10906, 31636, 28644, 23998, -17422, + 817, 603, 1322, -1465, -1215, 1218, -874, -1187, + -1185, -1278, -1510, -870, -108, 996, 958, 1522, + 20297, 2146, 15355, -32384, -6280, -14903, -11044, 14469, + -21498, -20198, 23210, -17442, -23860, -20257, 7756, 23132, + 1097, 610, -1285, 384, -136, -1335, 220, -1659, + -1530, 794, -854, 478, -308, 991, -1460, 1628, + +#define _16XSHIFT 624 + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, + SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT +}}; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.h new file mode 100644 index 000000000..f95899cd8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.h @@ -0,0 +1,43 @@ +#ifndef CONSTS_H +#define CONSTS_H + +#include "params.h" + +#define _16XQ 0 +#define _16XQINV 16 +#define _16XV 32 +#define _16XFLO 48 +#define _16XFHI 64 +#define _16XMONTSQLO 80 +#define _16XMONTSQHI 96 +#define _16XMASK 112 +#define _REVIDXB 128 +#define _REVIDXD 144 +#define _ZETAS_EXP 160 +#define _16XSHIFT 624 + +/* The C ABI on MacOS exports all symbols with a leading + * underscore. This means that any symbols we refer to from + * C files (functions) can't be found, and all symbols we + * refer to from ASM also can't be found. + * + * This define helps us get around this + */ +#ifdef __ASSEMBLER__ +#if defined(__WIN32__) || defined(__APPLE__) +#define decorate(s) _##s +#define cdecl2(s) decorate(s) +#define cdecl(s) cdecl2(KYBER_NAMESPACE(##s)) +#else +#define cdecl(s) KYBER_NAMESPACE(##s) +#endif +#endif + +#ifndef __ASSEMBLER__ +#include "align.h" +typedef ALIGNED_INT16(640) qdata_t; +#define qdata KYBER_NAMESPACE(qdata) +extern const qdata_t qdata; +#endif + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S new file mode 100644 index 000000000..3bb1ebd3d --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S @@ -0,0 +1,88 @@ +#include "consts.h" +.include "fq.inc" + +.text +reduce128_avx: +#load +vmovdqa (%rdi),%ymm2 +vmovdqa 32(%rdi),%ymm3 +vmovdqa 64(%rdi),%ymm4 +vmovdqa 96(%rdi),%ymm5 +vmovdqa 128(%rdi),%ymm6 +vmovdqa 160(%rdi),%ymm7 +vmovdqa 192(%rdi),%ymm8 +vmovdqa 224(%rdi),%ymm9 + +red16 2 +red16 3 +red16 4 +red16 5 +red16 6 +red16 7 +red16 8 +red16 9 + +#store +vmovdqa %ymm2,(%rdi) +vmovdqa %ymm3,32(%rdi) +vmovdqa %ymm4,64(%rdi) +vmovdqa %ymm5,96(%rdi) +vmovdqa %ymm6,128(%rdi) +vmovdqa %ymm7,160(%rdi) +vmovdqa %ymm8,192(%rdi) +vmovdqa %ymm9,224(%rdi) + +ret + +.global cdecl(reduce_avx) +cdecl(reduce_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XV*2(%rsi),%ymm1 +call reduce128_avx +add $256,%rdi +call reduce128_avx +ret + +tomont128_avx: +#load +vmovdqa (%rdi),%ymm3 +vmovdqa 32(%rdi),%ymm4 +vmovdqa 64(%rdi),%ymm5 +vmovdqa 96(%rdi),%ymm6 +vmovdqa 128(%rdi),%ymm7 +vmovdqa 160(%rdi),%ymm8 +vmovdqa 192(%rdi),%ymm9 +vmovdqa 224(%rdi),%ymm10 + +fqmulprecomp 1,2,3,11 +fqmulprecomp 1,2,4,12 +fqmulprecomp 1,2,5,13 +fqmulprecomp 1,2,6,14 +fqmulprecomp 1,2,7,15 +fqmulprecomp 1,2,8,11 +fqmulprecomp 1,2,9,12 +fqmulprecomp 1,2,10,13 + +#store +vmovdqa %ymm3,(%rdi) +vmovdqa %ymm4,32(%rdi) +vmovdqa %ymm5,64(%rdi) +vmovdqa %ymm6,96(%rdi) +vmovdqa %ymm7,128(%rdi) +vmovdqa %ymm8,160(%rdi) +vmovdqa %ymm9,192(%rdi) +vmovdqa %ymm10,224(%rdi) + +ret + +.global cdecl(tomont_avx) +cdecl(tomont_avx): +#consts +vmovdqa _16XQ*2(%rsi),%ymm0 +vmovdqa _16XMONTSQLO*2(%rsi),%ymm1 +vmovdqa _16XMONTSQHI*2(%rsi),%ymm2 +call tomont128_avx +add $256,%rdi +call tomont128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.inc new file mode 100644 index 000000000..4b7afc311 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.inc @@ -0,0 +1,30 @@ +.macro red16 r,rs=0,x=12 +vpmulhw %ymm1,%ymm\r,%ymm\x +.if \rs +vpmulhrsw %ymm\rs,%ymm\x,%ymm\x +.else +vpsraw $10,%ymm\x,%ymm\x +.endif +vpmullw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro csubq r,x=12 +vpsubw %ymm0,%ymm\r,%ymm\r +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro caddq r,x=12 +vpsraw $15,%ymm\r,%ymm\x +vpand %ymm0,%ymm\x,%ymm\x +vpaddw %ymm\x,%ymm\r,%ymm\r +.endm + +.macro fqmulprecomp al,ah,b,x=12 +vpmullw %ymm\al,%ymm\b,%ymm\x +vpmulhw %ymm\ah,%ymm\b,%ymm\b +vpmulhw %ymm0,%ymm\x,%ymm\x +vpsubw %ymm\x,%ymm\b,%ymm\b +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c new file mode 100644 index 000000000..572ce4900 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c @@ -0,0 +1,566 @@ +#include +#include +#include +#include +#include "align.h" +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "cbd.h" +#include "rejsample.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk and the +* public seed used to generate the matrix A. +* The polynomial coefficients in pk are assumed to +* lie in the invertal [0,q], i.e. pk must be reduced +* by polyvec_reduce(). +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key. +* The polynomial coefficients in sk are assumed to +* lie in the invertal [0,q], i.e. sk must be reduced +* by polyvec_reduce(). +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v. +* The polynomial coefficients in b and v are assumed to +* lie in the invertal [0,q], i.e. b and v must be reduced +* by polyvec_reduce() and poly_reduce(), respectively. +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output array +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos <= buflen - 3) { // buflen is always at least 3 + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#if KYBER_K == 2 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 1; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 1; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[1].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[1].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[1].vec[0]); + poly_nttunpack(&a[1].vec[1]); + shake128x4_inc_ctx_release(&state); +} +#elif KYBER_K == 3 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128incctx state1x; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 0; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 0; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 0; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 0; + buf[3].coeffs[33] = 1; + } + + shake128x4_inc_init(&state); + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[0].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[0].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[0].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[1].vec[0].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[0].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[0].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[0].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[1].vec[0].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[0].vec[0]); + poly_nttunpack(&a[0].vec[1]); + poly_nttunpack(&a[0].vec[2]); + poly_nttunpack(&a[1].vec[0]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = 2; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = 0; + buf[3].coeffs[32] = 2; + buf[3].coeffs[33] = 1; + } + else { + buf[0].coeffs[32] = 1; + buf[0].coeffs[33] = 1; + buf[1].coeffs[32] = 2; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = 0; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = 1; + buf[3].coeffs[33] = 2; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[1].vec[1].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[1].vec[2].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[2].vec[0].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[2].vec[1].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[1].vec[1].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[1].vec[2].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[2].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[2].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + shake128x4_inc_ctx_release(&state); + + poly_nttunpack(&a[1].vec[1]); + poly_nttunpack(&a[1].vec[2]); + poly_nttunpack(&a[2].vec[0]); + poly_nttunpack(&a[2].vec[1]); + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + buf[0].coeffs[32] = 2; + buf[0].coeffs[33] = 2; + + shake128_inc_init(&state1x); + shake128_absorb_once(&state1x, buf[0].coeffs, 34); + shake128_squeezeblocks(buf[0].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state1x); + ctr0 = rej_uniform_avx(a[2].vec[2].coeffs, buf[0].coeffs); + while(ctr0 < KYBER_N) { + shake128_squeezeblocks(buf[0].coeffs, 1, &state1x); + ctr0 += rej_uniform(a[2].vec[2].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + } + shake128_inc_ctx_release(&state1x); + + poly_nttunpack(&a[2].vec[2]); +} +#elif KYBER_K == 4 +void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) +{ + unsigned int i, ctr0, ctr1, ctr2, ctr3; + ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; + __m256i f; + shake128x4incctx state; + shake128x4_inc_init(&state); + + for(i=0;i<4;i++) { + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + if(transposed) { + buf[0].coeffs[32] = i; + buf[0].coeffs[33] = 0; + buf[1].coeffs[32] = i; + buf[1].coeffs[33] = 1; + buf[2].coeffs[32] = i; + buf[2].coeffs[33] = 2; + buf[3].coeffs[32] = i; + buf[3].coeffs[33] = 3; + } + else { + buf[0].coeffs[32] = 0; + buf[0].coeffs[33] = i; + buf[1].coeffs[32] = 1; + buf[1].coeffs[33] = i; + buf[2].coeffs[32] = 2; + buf[2].coeffs[33] = i; + buf[3].coeffs[32] = 3; + buf[3].coeffs[33] = i; + } + + shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); + + ctr0 = rej_uniform_avx(a[i].vec[0].coeffs, buf[0].coeffs); + ctr1 = rej_uniform_avx(a[i].vec[1].coeffs, buf[1].coeffs); + ctr2 = rej_uniform_avx(a[i].vec[2].coeffs, buf[2].coeffs); + ctr3 = rej_uniform_avx(a[i].vec[3].coeffs, buf[3].coeffs); + + while(ctr0 < KYBER_N || ctr1 < KYBER_N || ctr2 < KYBER_N || ctr3 < KYBER_N) { + shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 1, &state); + + ctr0 += rej_uniform(a[i].vec[0].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); + ctr1 += rej_uniform(a[i].vec[1].coeffs + ctr1, KYBER_N - ctr1, buf[1].coeffs, SHAKE128_RATE); + ctr2 += rej_uniform(a[i].vec[2].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); + ctr3 += rej_uniform(a[i].vec[3].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); + } + + poly_nttunpack(&a[i].vec[0]); + poly_nttunpack(&a[i].vec[1]); + poly_nttunpack(&a[i].vec[2]); + poly_nttunpack(&a[i].vec[3]); + } + shake128x4_inc_ctx_release(&state); +} +#endif + +/************************************************* +* Name: indcpa_keypair_derand +* +* Description: Generates public and private key for the CPA-secure +* public-key encryption scheme underlying Kyber +* +* Arguments: - uint8_t *pk: pointer to output public key +* (of length KYBER_INDCPA_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (of length KYBER_INDCPA_SECRETKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (of length KYBER_SYMBYTES bytes) +**************************************************/ +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]) +{ + unsigned int i; + uint8_t buf[2*KYBER_SYMBYTES]; + const uint8_t *publicseed = buf; + const uint8_t *noiseseed = buf + KYBER_SYMBYTES; + polyvec a[KYBER_K], e, pkpv, skpv; + + hash_g(buf, coins, KYBER_SYMBYTES); + + gen_a(a, publicseed); + +#if KYBER_K == 2 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, e.vec+0, e.vec+1, noiseseed, 0, 1, 2, 3); +#elif KYBER_K == 3 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, e.vec+0, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+1, e.vec+2, pkpv.vec+0, pkpv.vec+1, noiseseed, 4, 5, 6, 7); +#elif KYBER_K == 4 + poly_getnoise_eta1_4x(skpv.vec+0, skpv.vec+1, skpv.vec+2, skpv.vec+3, noiseseed, 0, 1, 2, 3); + poly_getnoise_eta1_4x(e.vec+0, e.vec+1, e.vec+2, e.vec+3, noiseseed, 4, 5, 6, 7); +#endif + + polyvec_ntt(&skpv); + polyvec_reduce(&skpv); + polyvec_ntt(&e); + + // matrix-vector multiplication + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S new file mode 100644 index 000000000..76d418999 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S @@ -0,0 +1,193 @@ +#include "consts.h" +.include "shuffle.inc" +.include "fq.inc" + +.macro butterfly rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3,zl0=2,zl1=2,zh0=3,zh1=3 +vpsubw %ymm\rl0,%ymm\rh0,%ymm12 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rl0 +vpsubw %ymm\rl1,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl0,%ymm12,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl1 +vpsubw %ymm\rl2,%ymm\rh2,%ymm14 + +vpmullw %ymm\zl0,%ymm13,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl2 +vpsubw %ymm\rl3,%ymm\rh3,%ymm15 + +vpmullw %ymm\zl1,%ymm14,%ymm\rh2 +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl3 +vpmullw %ymm\zl1,%ymm15,%ymm\rh3 + +vpmulhw %ymm\zh0,%ymm12,%ymm12 +vpmulhw %ymm\zh0,%ymm13,%ymm13 + +vpmulhw %ymm\zh1,%ymm14,%ymm14 +vpmulhw %ymm\zh1,%ymm15,%ymm15 + +vpmulhw %ymm0,%ymm\rh0,%ymm\rh0 + +vpmulhw %ymm0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm0,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm0,%ymm\rh3,%ymm\rh3 + +# + +# + +vpsubw %ymm\rh0,%ymm12,%ymm\rh0 + +vpsubw %ymm\rh1,%ymm13,%ymm\rh1 + +vpsubw %ymm\rh2,%ymm14,%ymm\rh2 +vpsubw %ymm\rh3,%ymm15,%ymm\rh3 +.endm + +.macro intt_levels0t5 off +/* level 0 */ +vmovdqa _16XFLO*2(%rsi),%ymm2 +vmovdqa _16XFHI*2(%rsi),%ymm3 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +fqmulprecomp 2,3,4 +fqmulprecomp 2,3,6 +fqmulprecomp 2,3,5 +fqmulprecomp 2,3,7 + +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 + +fqmulprecomp 2,3,8 +fqmulprecomp 2,3,10 +fqmulprecomp 2,3,9 +fqmulprecomp 2,3,11 + +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+208)*2(%rsi),%ymm15 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+176)*2(%rsi),%ymm1 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+224)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+192)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm12 +vpshufb %ymm12,%ymm15,%ymm15 +vpshufb %ymm12,%ymm1,%ymm1 +vpshufb %ymm12,%ymm2,%ymm2 +vpshufb %ymm12,%ymm3,%ymm3 + +butterfly 4,5,8,9,6,7,10,11,15,1,2,3 + +/* level 1 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+144)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+160)*2(%rsi),%ymm3 +vmovdqa _REVIDXB*2(%rsi),%ymm1 +vpshufb %ymm1,%ymm2,%ymm2 +vpshufb %ymm1,%ymm3,%ymm3 + +butterfly 4,5,6,7,8,9,10,11,2,2,3,3 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +/* level 2 */ +vmovdqa _REVIDXD*2(%rsi),%ymm12 +vpermd (_ZETAS_EXP+(1-\off)*224+112)*2(%rsi),%ymm12,%ymm2 +vpermd (_ZETAS_EXP+(1-\off)*224+128)*2(%rsi),%ymm12,%ymm10 + +butterfly 3,4,6,8,5,7,9,11,2,2,10,10 + +vmovdqa _16XV*2(%rsi),%ymm1 +red16 3 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +/* level 3 */ +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+80)*2(%rsi),%ymm2 +vpermq $0x1B,(_ZETAS_EXP+(1-\off)*224+96)*2(%rsi),%ymm9 + +butterfly 10,3,6,5,4,8,7,11,2,2,9,9 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +/* level 4 */ +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+48)*2(%rsi),%ymm2 +vpermq $0x4E,(_ZETAS_EXP+(1-\off)*224+64)*2(%rsi),%ymm7 + +butterfly 9,10,6,4,3,5,8,11,2,2,7,7 + +red16 9 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +/* level 5 */ +vmovdqa (_ZETAS_EXP+(1-\off)*224+16)*2(%rsi),%ymm2 +vmovdqa (_ZETAS_EXP+(1-\off)*224+32)*2(%rsi),%ymm8 + +butterfly 7,9,6,3,10,4,5,11,2,2,8,8 + +vmovdqa %ymm7,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.macro intt_level6 off +/* level 6 */ +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm2 + +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm3 + +butterfly 4,5,6,7,8,9,10,11 + +.if \off == 0 +red16 4 +.endif + +vmovdqa %ymm4,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm7,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.text +.global cdecl(invntt_avx) +cdecl(invntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +intt_levels0t5 0 +intt_levels0t5 1 + +intt_level6 0 +intt_level6 1 +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S new file mode 100644 index 000000000..0ce7b4129 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S @@ -0,0 +1,189 @@ +#include "consts.h" +.include "shuffle.inc" + +.macro mul rh0,rh1,rh2,rh3,zl0=15,zl1=15,zh0=2,zh1=2 +vpmullw %ymm\zl0,%ymm\rh0,%ymm12 +vpmullw %ymm\zl0,%ymm\rh1,%ymm13 + +vpmullw %ymm\zl1,%ymm\rh2,%ymm14 +vpmullw %ymm\zl1,%ymm\rh3,%ymm15 + +vpmulhw %ymm\zh0,%ymm\rh0,%ymm\rh0 +vpmulhw %ymm\zh0,%ymm\rh1,%ymm\rh1 + +vpmulhw %ymm\zh1,%ymm\rh2,%ymm\rh2 +vpmulhw %ymm\zh1,%ymm\rh3,%ymm\rh3 +.endm + +.macro reduce +vpmulhw %ymm0,%ymm12,%ymm12 +vpmulhw %ymm0,%ymm13,%ymm13 + +vpmulhw %ymm0,%ymm14,%ymm14 +vpmulhw %ymm0,%ymm15,%ymm15 +.endm + +.macro update rln,rl0,rl1,rl2,rl3,rh0,rh1,rh2,rh3 +vpaddw %ymm\rh0,%ymm\rl0,%ymm\rln +vpsubw %ymm\rh0,%ymm\rl0,%ymm\rh0 +vpaddw %ymm\rh1,%ymm\rl1,%ymm\rl0 + +vpsubw %ymm\rh1,%ymm\rl1,%ymm\rh1 +vpaddw %ymm\rh2,%ymm\rl2,%ymm\rl1 +vpsubw %ymm\rh2,%ymm\rl2,%ymm\rh2 + +vpaddw %ymm\rh3,%ymm\rl3,%ymm\rl2 +vpsubw %ymm\rh3,%ymm\rl3,%ymm\rh3 + +vpsubw %ymm12,%ymm\rln,%ymm\rln +vpaddw %ymm12,%ymm\rh0,%ymm\rh0 +vpsubw %ymm13,%ymm\rl0,%ymm\rl0 + +vpaddw %ymm13,%ymm\rh1,%ymm\rh1 +vpsubw %ymm14,%ymm\rl1,%ymm\rl1 +vpaddw %ymm14,%ymm\rh2,%ymm\rh2 + +vpsubw %ymm15,%ymm\rl2,%ymm\rl2 +vpaddw %ymm15,%ymm\rh3,%ymm\rh3 +.endm + +.macro level0 off +vpbroadcastq (_ZETAS_EXP+0)*2(%rsi),%ymm15 +vmovdqa (64*\off+128)*2(%rdi),%ymm8 +vmovdqa (64*\off+144)*2(%rdi),%ymm9 +vmovdqa (64*\off+160)*2(%rdi),%ymm10 +vmovdqa (64*\off+176)*2(%rdi),%ymm11 +vpbroadcastq (_ZETAS_EXP+4)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (64*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (64*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (64*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (64*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +vmovdqa %ymm3,(64*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(64*\off+ 16)*2(%rdi) +vmovdqa %ymm5,(64*\off+ 32)*2(%rdi) +vmovdqa %ymm6,(64*\off+ 48)*2(%rdi) +vmovdqa %ymm8,(64*\off+128)*2(%rdi) +vmovdqa %ymm9,(64*\off+144)*2(%rdi) +vmovdqa %ymm10,(64*\off+160)*2(%rdi) +vmovdqa %ymm11,(64*\off+176)*2(%rdi) +.endm + +.macro levels1t6 off +/* level 1 */ +vmovdqa (_ZETAS_EXP+224*\off+16)*2(%rsi),%ymm15 +vmovdqa (128*\off+ 64)*2(%rdi),%ymm8 +vmovdqa (128*\off+ 80)*2(%rdi),%ymm9 +vmovdqa (128*\off+ 96)*2(%rdi),%ymm10 +vmovdqa (128*\off+112)*2(%rdi),%ymm11 +vmovdqa (_ZETAS_EXP+224*\off+32)*2(%rsi),%ymm2 + +mul 8,9,10,11 + +vmovdqa (128*\off+ 0)*2(%rdi),%ymm4 +vmovdqa (128*\off+ 16)*2(%rdi),%ymm5 +vmovdqa (128*\off+ 32)*2(%rdi),%ymm6 +vmovdqa (128*\off+ 48)*2(%rdi),%ymm7 + +reduce +update 3,4,5,6,7,8,9,10,11 + +/* level 2 */ +shuffle8 5,10,7,10 +shuffle8 6,11,5,11 + +vmovdqa (_ZETAS_EXP+224*\off+48)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+64)*2(%rsi),%ymm2 + +mul 7,10,5,11 + +shuffle8 3,8,6,8 +shuffle8 4,9,3,9 + +reduce +update 4,6,8,3,9,7,10,5,11 + +/* level 3 */ +shuffle4 8,5,9,5 +shuffle4 3,11,8,11 + +vmovdqa (_ZETAS_EXP+224*\off+80)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+96)*2(%rsi),%ymm2 + +mul 9,5,8,11 + +shuffle4 4,7,3,7 +shuffle4 6,10,4,10 + +reduce +update 6,3,7,4,10,9,5,8,11 + +/* level 4 */ +shuffle2 7,8,10,8 +shuffle2 4,11,7,11 + +vmovdqa (_ZETAS_EXP+224*\off+112)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+128)*2(%rsi),%ymm2 + +mul 10,8,7,11 + +shuffle2 6,9,4,9 +shuffle2 3,5,6,5 + +reduce +update 3,4,9,6,5,10,8,7,11 + +/* level 5 */ +shuffle1 9,7,5,7 +shuffle1 6,11,9,11 + +vmovdqa (_ZETAS_EXP+224*\off+144)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+160)*2(%rsi),%ymm2 + +mul 5,7,9,11 + +shuffle1 3,10,6,10 +shuffle1 4,8,3,8 + +reduce +update 4,6,10,3,8,5,7,9,11 + +/* level 6 */ +vmovdqa (_ZETAS_EXP+224*\off+176)*2(%rsi),%ymm14 +vmovdqa (_ZETAS_EXP+224*\off+208)*2(%rsi),%ymm15 +vmovdqa (_ZETAS_EXP+224*\off+192)*2(%rsi),%ymm8 +vmovdqa (_ZETAS_EXP+224*\off+224)*2(%rsi),%ymm2 + +mul 10,3,9,11,14,15,8,2 + +reduce +update 8,4,6,5,7,10,3,9,11 + +vmovdqa %ymm8,(128*\off+ 0)*2(%rdi) +vmovdqa %ymm4,(128*\off+ 16)*2(%rdi) +vmovdqa %ymm10,(128*\off+ 32)*2(%rdi) +vmovdqa %ymm3,(128*\off+ 48)*2(%rdi) +vmovdqa %ymm6,(128*\off+ 64)*2(%rdi) +vmovdqa %ymm5,(128*\off+ 80)*2(%rdi) +vmovdqa %ymm9,(128*\off+ 96)*2(%rdi) +vmovdqa %ymm11,(128*\off+112)*2(%rdi) +.endm + +.text +.global cdecl(ntt_avx) +cdecl(ntt_avx): +vmovdqa _16XQ*2(%rsi),%ymm0 + +level0 0 +level0 1 + +levels1t6 0 +levels1t6 1 + +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.h new file mode 100644 index 000000000..a4f48e343 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.h @@ -0,0 +1,28 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include + +#define ntt_avx KYBER_NAMESPACE(ntt_avx) +void ntt_avx(__m256i *r, const __m256i *qdata); +#define invntt_avx KYBER_NAMESPACE(invntt_avx) +void invntt_avx(__m256i *r, const __m256i *qdata); + +#define nttpack_avx KYBER_NAMESPACE(nttpack_avx) +void nttpack_avx(__m256i *r, const __m256i *qdata); +#define nttunpack_avx KYBER_NAMESPACE(nttunpack_avx) +void nttunpack_avx(__m256i *r, const __m256i *qdata); + +#define basemul_avx KYBER_NAMESPACE(basemul_avx) +void basemul_avx(__m256i *r, + const __m256i *a, + const __m256i *b, + const __m256i *qdata); + +#define ntttobytes_avx KYBER_NAMESPACE(ntttobytes_avx) +void ntttobytes_avx(uint8_t *r, const __m256i *a, const __m256i *qdata); +#define nttfrombytes_avx KYBER_NAMESPACE(nttfrombytes_avx) +void nttfrombytes_avx(__m256i *r, const uint8_t *a, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/params.h new file mode 100644 index 000000000..fdc688ea2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/params.h @@ -0,0 +1,68 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + +//#define KYBER_90S /* Uncomment this if you want the 90S variant */ + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber512_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_avx2_##s +#endif +#elif (KYBER_K == 3) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber768_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_avx2_##s +#endif +#elif (KYBER_K == 4) +#ifdef KYBER_90S +#define KYBER_NAMESPACE(s) pqcrystals_kyber1024_90s_avx2_##s +#else +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_avx2_##s +#endif +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c new file mode 100644 index 000000000..96bad864f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c @@ -0,0 +1,606 @@ +#include +#include +#include +#include "align.h" +#include "fips202x4.h" +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +#if (KYBER_POLYCOMPRESSEDBYTES == 96) +void poly_compress(uint8_t r[96], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 8); + const __m256i mask = _mm256_set1_epi16(7); + const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); + const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, + -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f2 = _mm256_sllv_epi32(f2,sllvdidx); + f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 + f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi32(t0,t1,0x08); + _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[24*i+16],t1); + } +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly * restrict r, const uint8_t a[96]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, + 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); + const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, + 224,28,896,112,14,448,56,7); + const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, + 128,1024,32,256,2048,64,512,4096); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +void poly_compress(uint8_t r[128], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2, f3; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 9); + const __m256i mask = _mm256_set1_epi16(15); + const __m256i shift2 = _mm256_set1_epi16((16 << 8) + 1); + const __m256i permdidx = _mm256_set_epi32(7,3,6,2,5,1,4,0); + + for(i=0;ivec[4*i+0]); + f1 = _mm256_load_si256(&a->vec[4*i+1]); + f2 = _mm256_load_si256(&a->vec[4*i+2]); + f3 = _mm256_load_si256(&a->vec[4*i+3]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f2 = _mm256_mulhi_epi16(f2,v); + f3 = _mm256_mulhi_epi16(f3,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f2 = _mm256_mulhrs_epi16(f2,shift1); + f3 = _mm256_mulhrs_epi16(f3,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f2 = _mm256_and_si256(f2,mask); + f3 = _mm256_and_si256(f3,mask); + f0 = _mm256_packus_epi16(f0,f1); + f2 = _mm256_packus_epi16(f2,f3); + f0 = _mm256_maddubs_epi16(f0,shift2); + f2 = _mm256_maddubs_epi16(f2,shift2); + f0 = _mm256_packus_epi16(f0,f2); + f0 = _mm256_permutevar8x32_epi32(f0,permdidx); + _mm256_storeu_si256((__m256i *)&r[32*i],f0); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[128]) +{ + unsigned int i; + __m128i t; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(7,7,7,7,6,6,6,6,5,5,5,5,4,4,4,4, + 3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0); + const __m256i mask = _mm256_set1_epi32(0x00F0000F); + const __m256i shift = _mm256_set1_epi32((128 << 16) + 2048); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) +void poly_compress(uint8_t r[160], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i shift1 = _mm256_set1_epi16(1 << 10); + const __m256i mask = _mm256_set1_epi16(31); + const __m256i shift2 = _mm256_set1_epi16((32 << 8) + 1); + const __m256i shift3 = _mm256_set1_epi32((1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8,-1,-1,-1,-1,-1, 4, 3, 2, 1, 0,-1,12,11,10, 9, + -1,12,11,10, 9, 8,-1,-1,-1,-1,-1 ,4, 3, 2, 1, 0); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_mulhi_epi16(f0,v); + f1 = _mm256_mulhi_epi16(f1,v); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f1 = _mm256_mulhrs_epi16(f1,shift1); + f0 = _mm256_and_si256(f0,mask); + f1 = _mm256_and_si256(f1,mask); + f0 = _mm256_packus_epi16(f0,f1); + f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 + f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srlv_epi64(f0,sllvdidx); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +void poly_decompress(poly * restrict r, const uint8_t a[160]) +{ + unsigned int i; + __m128i t; + __m256i f; + int16_t ti; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(9,9,9,8,8,8,8,7,7,6,6,6,6,5,5,5, + 4,4,4,3,3,3,3,2,2,1,1,1,1,0,0,0); + const __m256i mask = _mm256_set_epi16(248,1984,62,496,3968,124,992,31, + 248,1984,62,496,3968,124,992,31); + const __m256i shift = _mm256_set_epi16(128,16,512,64,8,256,32,1024, + 128,16,512,64,8,256,32,1024); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial in NTT representation. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). The coefficients are orderd as output by +* poly_ntt(); the serialized output coefficients are in bitreversed +* order. +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + ntttobytes_avx(r, a->vec, qdata.vec); +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + nttfrombytes_avx(r->vec, a, qdata.vec); +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly * restrict r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ +#if (KYBER_INDCPA_MSGBYTES != 32) +#error "KYBER_INDCPA_MSGBYTES must be equal to 32!" +#endif + __m256i f, g0, g1, g2, g3, h0, h1, h2, h3; + const __m256i shift = _mm256_broadcastsi128_si256(_mm_set_epi32(0,1,2,3)); + const __m256i idx = _mm256_broadcastsi128_si256(_mm_set_epi8(15,14,11,10,7,6,3,2,13,12,9,8,5,4,1,0)); + const __m256i hqs = _mm256_set1_epi16((KYBER_Q+1)/2); + +#define FROMMSG64(i) \ + g3 = _mm256_shuffle_epi32(f,0x55*i); \ + g3 = _mm256_sllv_epi32(g3,shift); \ + g3 = _mm256_shuffle_epi8(g3,idx); \ + g0 = _mm256_slli_epi16(g3,12); \ + g1 = _mm256_slli_epi16(g3,8); \ + g2 = _mm256_slli_epi16(g3,4); \ + g0 = _mm256_srai_epi16(g0,15); \ + g1 = _mm256_srai_epi16(g1,15); \ + g2 = _mm256_srai_epi16(g2,15); \ + g3 = _mm256_srai_epi16(g3,15); \ + g0 = _mm256_and_si256(g0,hqs); /* 19 18 17 16 3 2 1 0 */ \ + g1 = _mm256_and_si256(g1,hqs); /* 23 22 21 20 7 6 5 4 */ \ + g2 = _mm256_and_si256(g2,hqs); /* 27 26 25 24 11 10 9 8 */ \ + g3 = _mm256_and_si256(g3,hqs); /* 31 30 29 28 15 14 13 12 */ \ + h0 = _mm256_unpacklo_epi64(g0,g1); \ + h2 = _mm256_unpackhi_epi64(g0,g1); \ + h1 = _mm256_unpacklo_epi64(g2,g3); \ + h3 = _mm256_unpackhi_epi64(g2,g3); \ + g0 = _mm256_permute2x128_si256(h0,h1,0x20); \ + g2 = _mm256_permute2x128_si256(h0,h1,0x31); \ + g1 = _mm256_permute2x128_si256(h2,h3,0x20); \ + g3 = _mm256_permute2x128_si256(h2,h3,0x31); \ + _mm256_store_si256(&r->vec[0+2*i+0],g0); \ + _mm256_store_si256(&r->vec[0+2*i+1],g1); \ + _mm256_store_si256(&r->vec[8+2*i+0],g2); \ + _mm256_store_si256(&r->vec[8+2*i+1],g3) + + f = _mm256_loadu_si256((__m256i *)msg); + FROMMSG64(0); + FROMMSG64(1); + FROMMSG64(2); + FROMMSG64(3); +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message. +* The coefficients of the input polynomial are assumed to +* lie in the invertal [0,q], i.e. the polynomial must be reduced +* by poly_reduce(). +* +* Arguments: - uint8_t *msg: pointer to output message +* - poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly * restrict a) +{ + unsigned int i; + uint32_t small; + __m256i f0, f1, g0, g1; + const __m256i hq = _mm256_set1_epi16((KYBER_Q - 1)/2); + const __m256i hhq = _mm256_set1_epi16((KYBER_Q - 1)/4); + + for(i=0;ivec[2*i+0]); + f1 = _mm256_load_si256(&a->vec[2*i+1]); + f0 = _mm256_sub_epi16(hq, f0); + f1 = _mm256_sub_epi16(hq, f1); + g0 = _mm256_srai_epi16(f0, 15); + g1 = _mm256_srai_epi16(f1, 15); + f0 = _mm256_xor_si256(f0, g0); + f1 = _mm256_xor_si256(f1, g1); + f0 = _mm256_sub_epi16(f0, hhq); + f1 = _mm256_sub_epi16(f1, hhq); + f0 = _mm256_packs_epi16(f0, f1); + f0 = _mm256_permute4x64_epi64(f0, 0xD8); + small = _mm256_movemask_epi8(f0); + memcpy(&msg[4*i], &small, 4); + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA1*KYBER_N/4+32) buf; // +32 bytes as required by poly_cbd_eta1 + prf(buf.coeffs, KYBER_ETA1*KYBER_N/4, seed, nonce); + poly_cbd_eta1(r, buf.vec); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + ALIGNED_UINT8(KYBER_ETA2*KYBER_N/4) buf; + prf(buf.coeffs, KYBER_ETA2*KYBER_N/4, seed, nonce); + poly_cbd_eta2(r, buf.vec); +} + +#ifndef KYBER_90S +#define NOISE_NBLOCKS ((KYBER_ETA1*KYBER_N/4+SHAKE256_RATE-1)/SHAKE256_RATE) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta1(r2, buf[2].vec); + poly_cbd_eta1(r3, buf[3].vec); +} + +#if KYBER_K == 2 +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3) +{ + ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; + __m256i f; + shake256x4incctx state; + + f = _mm256_loadu_si256((__m256i *)seed); + _mm256_store_si256(buf[0].vec, f); + _mm256_store_si256(buf[1].vec, f); + _mm256_store_si256(buf[2].vec, f); + _mm256_store_si256(buf[3].vec, f); + + buf[0].coeffs[32] = nonce0; + buf[1].coeffs[32] = nonce1; + buf[2].coeffs[32] = nonce2; + buf[3].coeffs[32] = nonce3; + + shake256x4_inc_init(&state); + shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); + shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); + shake256x4_inc_ctx_release(&state); + + poly_cbd_eta1(r0, buf[0].vec); + poly_cbd_eta1(r1, buf[1].vec); + poly_cbd_eta2(r2, buf[2].vec); + poly_cbd_eta2(r3, buf[3].vec); +} +#endif +#endif + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place. +* Input coefficients assumed to be in normal order, +* output coefficients are in special order that is natural +* for the vectorization. Input coefficients are assumed to be +* bounded by q in absolute value, output coefficients are bounded +* by 16118 in absolute value. +* +* Arguments: - poly *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* Input coefficients assumed to be in special order from vectorized +* forward ntt, output in normal order. Input coefficients can be +* arbitrary 16-bit integers, output coefficients are bounded by 14870 +* in absolute value. +* +* Arguments: - poly *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt_avx(r->vec, qdata.vec); +} + +void poly_nttunpack(poly *r) +{ + nttunpack_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain. +* One of the input polynomials needs to have coefficients +* bounded by q, the other polynomial can have arbitrary +* coefficients. Output coefficients are bounded by 6656. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + basemul_avx(r->vec, a->vec, b->vec, qdata.vec); +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + tomont_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + reduce_avx(r->vec, qdata.vec); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_add_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials. No modular reduction +* is performed. +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + __m256i f0, f1; + + for(i=0;ivec[i]); + f1 = _mm256_load_si256(&b->vec[i]); + f0 = _mm256_sub_epi16(f0, f1); + _mm256_store_si256(&r->vec[i], f0); + } +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.h new file mode 100644 index 000000000..6a9cf71c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.h @@ -0,0 +1,77 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "align.h" +#include "params.h" + +typedef ALIGNED_INT16(KYBER_N) poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#ifndef KYBER_90S +#define poly_getnoise_eta1_4x KYBER_NAMESPACE(poly_getnoise_eta2_4x) +void poly_getnoise_eta1_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); + +#if KYBER_K == 2 +#define poly_getnoise_eta1122_4x KYBER_NAMESPACE(poly_getnoise_eta1122_4x) +void poly_getnoise_eta1122_4x(poly *r0, + poly *r1, + poly *r2, + poly *r3, + const uint8_t seed[32], + uint8_t nonce0, + uint8_t nonce1, + uint8_t nonce2, + uint8_t nonce3); +#endif +#endif + + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_nttunpack KYBER_NAMESPACE(poly_nttunpack) +void poly_nttunpack(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c new file mode 100644 index 000000000..a0174b7b3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c @@ -0,0 +1,307 @@ +#include +#include +#include +#include "params.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "consts.h" + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) +static void poly_compress10(uint8_t r[320], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(15); + const __m256i shift1 = _mm256_set1_epi16(1 << 12); + const __m256i mask = _mm256_set1_epi16(1023); + const __m256i shift2 = _mm256_set1_epi64x((1024LL << 48) + (1LL << 32) + (1024 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(12); + const __m256i shufbidx = _mm256_set_epi8( 8, 4, 3, 2, 1, 0,-1,-1,-1,-1,-1,-1,12,11,10, 9, + -1,-1,-1,-1,-1,-1,12,11,10, 9, 8, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f0 = _mm256_srli_epi64(f0,12); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blend_epi16(t0,t1,0xE0); + _mm_storeu_si128((__m128i *)&r[20*i+ 0],t0); + memcpy(&r[20*i+16],&t1,4); + } +} + +static void poly_decompress10(poly * restrict r, const uint8_t a[320+12]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_set1_epi32((KYBER_Q << 16) + 4*KYBER_Q); + const __m256i shufbidx = _mm256_set_epi8(11,10,10, 9, 9, 8, 8, 7, + 6, 5, 5, 4, 4, 3, 3, 2, + 9, 8, 8, 7, 7, 6, 6, 5, + 4, 3, 3, 2, 2, 1, 1, 0); + const __m256i sllvdidx = _mm256_set1_epi64x(4); + const __m256i mask = _mm256_set1_epi32((32736 << 16) + 8184); + + for(i=0;ivec[i],f); + } +} + +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) +static void poly_compress11(uint8_t r[352+2], const poly * restrict a) +{ + unsigned int i; + __m256i f0, f1, f2; + __m128i t0, t1; + const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); + const __m256i v8 = _mm256_slli_epi16(v,3); + const __m256i off = _mm256_set1_epi16(36); + const __m256i shift1 = _mm256_set1_epi16(1 << 13); + const __m256i mask = _mm256_set1_epi16(2047); + const __m256i shift2 = _mm256_set1_epi64x((2048LL << 48) + (1LL << 32) + (2048 << 16) + 1); + const __m256i sllvdidx = _mm256_set1_epi64x(10); + const __m256i srlvqidx = _mm256_set_epi64x(30,10,30,10); + const __m256i shufbidx = _mm256_set_epi8( 4, 3, 2, 1, 0, 0,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, + -1,-1,-1,-1,-1,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + + for(i=0;ivec[i]); + f1 = _mm256_mullo_epi16(f0,v8); + f2 = _mm256_add_epi16(f0,off); + f0 = _mm256_slli_epi16(f0,3); + f0 = _mm256_mulhi_epi16(f0,v); + f2 = _mm256_sub_epi16(f1,f2); + f1 = _mm256_andnot_si256(f1,f2); + f1 = _mm256_srli_epi16(f1,15); + f0 = _mm256_sub_epi16(f0,f1); + f0 = _mm256_mulhrs_epi16(f0,shift1); + f0 = _mm256_and_si256(f0,mask); + f0 = _mm256_madd_epi16(f0,shift2); + f0 = _mm256_sllv_epi32(f0,sllvdidx); + f1 = _mm256_bsrli_epi128(f0,8); + f0 = _mm256_srlv_epi64(f0,srlvqidx); + f1 = _mm256_slli_epi64(f1,34); + f0 = _mm256_add_epi64(f0,f1); + f0 = _mm256_shuffle_epi8(f0,shufbidx); + t0 = _mm256_castsi256_si128(f0); + t1 = _mm256_extracti128_si256(f0,1); + t0 = _mm_blendv_epi8(t0,t1,_mm256_castsi256_si128(shufbidx)); + _mm_storeu_si128((__m128i *)&r[22*i+ 0],t0); + _mm_storel_epi64((__m128i *)&r[22*i+16],t1); + } +} + +static void poly_decompress11(poly * restrict r, const uint8_t a[352+10]) +{ + unsigned int i; + __m256i f; + const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i shufbidx = _mm256_set_epi8(13,12,12,11,10, 9, 9, 8, + 8, 7, 6, 5, 5, 4, 4, 3, + 10, 9, 9, 8, 7, 6, 6, 5, + 5, 4, 3, 2, 2, 1, 1, 0); + const __m256i srlvdidx = _mm256_set_epi32(0,0,1,0,0,0,1,0); + const __m256i srlvqidx = _mm256_set_epi64x(2,0,2,0); + const __m256i shift = _mm256_set_epi16(4,32,1,8,32,1,4,32,4,32,1,8,32,1,4,32); + const __m256i mask = _mm256_set1_epi16(32752); + + for(i=0;ivec[i],f); + } +} + +#endif + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i]); +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]) +{ + unsigned int i; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + for(i=0;ivec[i],&a[320*i]); +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + for(i=0;ivec[i],&a[352*i]); +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements in a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly tmp; + + poly_basemul_montgomery(r,&a->vec[0],&b->vec[0]); + for(i=1;ivec[i],&b->vec[i]); + poly_add(r,r,&tmp); + } +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.h new file mode 100644 index 000000000..2ce23c31f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES+2], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES+12]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/reduce.h new file mode 100644 index 000000000..5368185b5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/reduce.h @@ -0,0 +1,12 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include "params.h" +#include + +#define reduce_avx KYBER_NAMESPACE(reduce_avx) +void reduce_avx(__m256i *r, const __m256i *qdata); +#define tomont_avx KYBER_NAMESPACE(tomont_avx) +void tomont_avx(__m256i *r, const __m256i *qdata); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c new file mode 100644 index 000000000..9060a44cb --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c @@ -0,0 +1,398 @@ +#include +#include +#include +#include "params.h" +#include "consts.h" +#include "rejsample.h" + +//#define BMI + +#ifndef BMI +static const uint8_t idx[256][8] = { + {-1, -1, -1, -1, -1, -1, -1, -1}, + { 0, -1, -1, -1, -1, -1, -1, -1}, + { 2, -1, -1, -1, -1, -1, -1, -1}, + { 0, 2, -1, -1, -1, -1, -1, -1}, + { 4, -1, -1, -1, -1, -1, -1, -1}, + { 0, 4, -1, -1, -1, -1, -1, -1}, + { 2, 4, -1, -1, -1, -1, -1, -1}, + { 0, 2, 4, -1, -1, -1, -1, -1}, + { 6, -1, -1, -1, -1, -1, -1, -1}, + { 0, 6, -1, -1, -1, -1, -1, -1}, + { 2, 6, -1, -1, -1, -1, -1, -1}, + { 0, 2, 6, -1, -1, -1, -1, -1}, + { 4, 6, -1, -1, -1, -1, -1, -1}, + { 0, 4, 6, -1, -1, -1, -1, -1}, + { 2, 4, 6, -1, -1, -1, -1, -1}, + { 0, 2, 4, 6, -1, -1, -1, -1}, + { 8, -1, -1, -1, -1, -1, -1, -1}, + { 0, 8, -1, -1, -1, -1, -1, -1}, + { 2, 8, -1, -1, -1, -1, -1, -1}, + { 0, 2, 8, -1, -1, -1, -1, -1}, + { 4, 8, -1, -1, -1, -1, -1, -1}, + { 0, 4, 8, -1, -1, -1, -1, -1}, + { 2, 4, 8, -1, -1, -1, -1, -1}, + { 0, 2, 4, 8, -1, -1, -1, -1}, + { 6, 8, -1, -1, -1, -1, -1, -1}, + { 0, 6, 8, -1, -1, -1, -1, -1}, + { 2, 6, 8, -1, -1, -1, -1, -1}, + { 0, 2, 6, 8, -1, -1, -1, -1}, + { 4, 6, 8, -1, -1, -1, -1, -1}, + { 0, 4, 6, 8, -1, -1, -1, -1}, + { 2, 4, 6, 8, -1, -1, -1, -1}, + { 0, 2, 4, 6, 8, -1, -1, -1}, + {10, -1, -1, -1, -1, -1, -1, -1}, + { 0, 10, -1, -1, -1, -1, -1, -1}, + { 2, 10, -1, -1, -1, -1, -1, -1}, + { 0, 2, 10, -1, -1, -1, -1, -1}, + { 4, 10, -1, -1, -1, -1, -1, -1}, + { 0, 4, 10, -1, -1, -1, -1, -1}, + { 2, 4, 10, -1, -1, -1, -1, -1}, + { 0, 2, 4, 10, -1, -1, -1, -1}, + { 6, 10, -1, -1, -1, -1, -1, -1}, + { 0, 6, 10, -1, -1, -1, -1, -1}, + { 2, 6, 10, -1, -1, -1, -1, -1}, + { 0, 2, 6, 10, -1, -1, -1, -1}, + { 4, 6, 10, -1, -1, -1, -1, -1}, + { 0, 4, 6, 10, -1, -1, -1, -1}, + { 2, 4, 6, 10, -1, -1, -1, -1}, + { 0, 2, 4, 6, 10, -1, -1, -1}, + { 8, 10, -1, -1, -1, -1, -1, -1}, + { 0, 8, 10, -1, -1, -1, -1, -1}, + { 2, 8, 10, -1, -1, -1, -1, -1}, + { 0, 2, 8, 10, -1, -1, -1, -1}, + { 4, 8, 10, -1, -1, -1, -1, -1}, + { 0, 4, 8, 10, -1, -1, -1, -1}, + { 2, 4, 8, 10, -1, -1, -1, -1}, + { 0, 2, 4, 8, 10, -1, -1, -1}, + { 6, 8, 10, -1, -1, -1, -1, -1}, + { 0, 6, 8, 10, -1, -1, -1, -1}, + { 2, 6, 8, 10, -1, -1, -1, -1}, + { 0, 2, 6, 8, 10, -1, -1, -1}, + { 4, 6, 8, 10, -1, -1, -1, -1}, + { 0, 4, 6, 8, 10, -1, -1, -1}, + { 2, 4, 6, 8, 10, -1, -1, -1}, + { 0, 2, 4, 6, 8, 10, -1, -1}, + {12, -1, -1, -1, -1, -1, -1, -1}, + { 0, 12, -1, -1, -1, -1, -1, -1}, + { 2, 12, -1, -1, -1, -1, -1, -1}, + { 0, 2, 12, -1, -1, -1, -1, -1}, + { 4, 12, -1, -1, -1, -1, -1, -1}, + { 0, 4, 12, -1, -1, -1, -1, -1}, + { 2, 4, 12, -1, -1, -1, -1, -1}, + { 0, 2, 4, 12, -1, -1, -1, -1}, + { 6, 12, -1, -1, -1, -1, -1, -1}, + { 0, 6, 12, -1, -1, -1, -1, -1}, + { 2, 6, 12, -1, -1, -1, -1, -1}, + { 0, 2, 6, 12, -1, -1, -1, -1}, + { 4, 6, 12, -1, -1, -1, -1, -1}, + { 0, 4, 6, 12, -1, -1, -1, -1}, + { 2, 4, 6, 12, -1, -1, -1, -1}, + { 0, 2, 4, 6, 12, -1, -1, -1}, + { 8, 12, -1, -1, -1, -1, -1, -1}, + { 0, 8, 12, -1, -1, -1, -1, -1}, + { 2, 8, 12, -1, -1, -1, -1, -1}, + { 0, 2, 8, 12, -1, -1, -1, -1}, + { 4, 8, 12, -1, -1, -1, -1, -1}, + { 0, 4, 8, 12, -1, -1, -1, -1}, + { 2, 4, 8, 12, -1, -1, -1, -1}, + { 0, 2, 4, 8, 12, -1, -1, -1}, + { 6, 8, 12, -1, -1, -1, -1, -1}, + { 0, 6, 8, 12, -1, -1, -1, -1}, + { 2, 6, 8, 12, -1, -1, -1, -1}, + { 0, 2, 6, 8, 12, -1, -1, -1}, + { 4, 6, 8, 12, -1, -1, -1, -1}, + { 0, 4, 6, 8, 12, -1, -1, -1}, + { 2, 4, 6, 8, 12, -1, -1, -1}, + { 0, 2, 4, 6, 8, 12, -1, -1}, + {10, 12, -1, -1, -1, -1, -1, -1}, + { 0, 10, 12, -1, -1, -1, -1, -1}, + { 2, 10, 12, -1, -1, -1, -1, -1}, + { 0, 2, 10, 12, -1, -1, -1, -1}, + { 4, 10, 12, -1, -1, -1, -1, -1}, + { 0, 4, 10, 12, -1, -1, -1, -1}, + { 2, 4, 10, 12, -1, -1, -1, -1}, + { 0, 2, 4, 10, 12, -1, -1, -1}, + { 6, 10, 12, -1, -1, -1, -1, -1}, + { 0, 6, 10, 12, -1, -1, -1, -1}, + { 2, 6, 10, 12, -1, -1, -1, -1}, + { 0, 2, 6, 10, 12, -1, -1, -1}, + { 4, 6, 10, 12, -1, -1, -1, -1}, + { 0, 4, 6, 10, 12, -1, -1, -1}, + { 2, 4, 6, 10, 12, -1, -1, -1}, + { 0, 2, 4, 6, 10, 12, -1, -1}, + { 8, 10, 12, -1, -1, -1, -1, -1}, + { 0, 8, 10, 12, -1, -1, -1, -1}, + { 2, 8, 10, 12, -1, -1, -1, -1}, + { 0, 2, 8, 10, 12, -1, -1, -1}, + { 4, 8, 10, 12, -1, -1, -1, -1}, + { 0, 4, 8, 10, 12, -1, -1, -1}, + { 2, 4, 8, 10, 12, -1, -1, -1}, + { 0, 2, 4, 8, 10, 12, -1, -1}, + { 6, 8, 10, 12, -1, -1, -1, -1}, + { 0, 6, 8, 10, 12, -1, -1, -1}, + { 2, 6, 8, 10, 12, -1, -1, -1}, + { 0, 2, 6, 8, 10, 12, -1, -1}, + { 4, 6, 8, 10, 12, -1, -1, -1}, + { 0, 4, 6, 8, 10, 12, -1, -1}, + { 2, 4, 6, 8, 10, 12, -1, -1}, + { 0, 2, 4, 6, 8, 10, 12, -1}, + {14, -1, -1, -1, -1, -1, -1, -1}, + { 0, 14, -1, -1, -1, -1, -1, -1}, + { 2, 14, -1, -1, -1, -1, -1, -1}, + { 0, 2, 14, -1, -1, -1, -1, -1}, + { 4, 14, -1, -1, -1, -1, -1, -1}, + { 0, 4, 14, -1, -1, -1, -1, -1}, + { 2, 4, 14, -1, -1, -1, -1, -1}, + { 0, 2, 4, 14, -1, -1, -1, -1}, + { 6, 14, -1, -1, -1, -1, -1, -1}, + { 0, 6, 14, -1, -1, -1, -1, -1}, + { 2, 6, 14, -1, -1, -1, -1, -1}, + { 0, 2, 6, 14, -1, -1, -1, -1}, + { 4, 6, 14, -1, -1, -1, -1, -1}, + { 0, 4, 6, 14, -1, -1, -1, -1}, + { 2, 4, 6, 14, -1, -1, -1, -1}, + { 0, 2, 4, 6, 14, -1, -1, -1}, + { 8, 14, -1, -1, -1, -1, -1, -1}, + { 0, 8, 14, -1, -1, -1, -1, -1}, + { 2, 8, 14, -1, -1, -1, -1, -1}, + { 0, 2, 8, 14, -1, -1, -1, -1}, + { 4, 8, 14, -1, -1, -1, -1, -1}, + { 0, 4, 8, 14, -1, -1, -1, -1}, + { 2, 4, 8, 14, -1, -1, -1, -1}, + { 0, 2, 4, 8, 14, -1, -1, -1}, + { 6, 8, 14, -1, -1, -1, -1, -1}, + { 0, 6, 8, 14, -1, -1, -1, -1}, + { 2, 6, 8, 14, -1, -1, -1, -1}, + { 0, 2, 6, 8, 14, -1, -1, -1}, + { 4, 6, 8, 14, -1, -1, -1, -1}, + { 0, 4, 6, 8, 14, -1, -1, -1}, + { 2, 4, 6, 8, 14, -1, -1, -1}, + { 0, 2, 4, 6, 8, 14, -1, -1}, + {10, 14, -1, -1, -1, -1, -1, -1}, + { 0, 10, 14, -1, -1, -1, -1, -1}, + { 2, 10, 14, -1, -1, -1, -1, -1}, + { 0, 2, 10, 14, -1, -1, -1, -1}, + { 4, 10, 14, -1, -1, -1, -1, -1}, + { 0, 4, 10, 14, -1, -1, -1, -1}, + { 2, 4, 10, 14, -1, -1, -1, -1}, + { 0, 2, 4, 10, 14, -1, -1, -1}, + { 6, 10, 14, -1, -1, -1, -1, -1}, + { 0, 6, 10, 14, -1, -1, -1, -1}, + { 2, 6, 10, 14, -1, -1, -1, -1}, + { 0, 2, 6, 10, 14, -1, -1, -1}, + { 4, 6, 10, 14, -1, -1, -1, -1}, + { 0, 4, 6, 10, 14, -1, -1, -1}, + { 2, 4, 6, 10, 14, -1, -1, -1}, + { 0, 2, 4, 6, 10, 14, -1, -1}, + { 8, 10, 14, -1, -1, -1, -1, -1}, + { 0, 8, 10, 14, -1, -1, -1, -1}, + { 2, 8, 10, 14, -1, -1, -1, -1}, + { 0, 2, 8, 10, 14, -1, -1, -1}, + { 4, 8, 10, 14, -1, -1, -1, -1}, + { 0, 4, 8, 10, 14, -1, -1, -1}, + { 2, 4, 8, 10, 14, -1, -1, -1}, + { 0, 2, 4, 8, 10, 14, -1, -1}, + { 6, 8, 10, 14, -1, -1, -1, -1}, + { 0, 6, 8, 10, 14, -1, -1, -1}, + { 2, 6, 8, 10, 14, -1, -1, -1}, + { 0, 2, 6, 8, 10, 14, -1, -1}, + { 4, 6, 8, 10, 14, -1, -1, -1}, + { 0, 4, 6, 8, 10, 14, -1, -1}, + { 2, 4, 6, 8, 10, 14, -1, -1}, + { 0, 2, 4, 6, 8, 10, 14, -1}, + {12, 14, -1, -1, -1, -1, -1, -1}, + { 0, 12, 14, -1, -1, -1, -1, -1}, + { 2, 12, 14, -1, -1, -1, -1, -1}, + { 0, 2, 12, 14, -1, -1, -1, -1}, + { 4, 12, 14, -1, -1, -1, -1, -1}, + { 0, 4, 12, 14, -1, -1, -1, -1}, + { 2, 4, 12, 14, -1, -1, -1, -1}, + { 0, 2, 4, 12, 14, -1, -1, -1}, + { 6, 12, 14, -1, -1, -1, -1, -1}, + { 0, 6, 12, 14, -1, -1, -1, -1}, + { 2, 6, 12, 14, -1, -1, -1, -1}, + { 0, 2, 6, 12, 14, -1, -1, -1}, + { 4, 6, 12, 14, -1, -1, -1, -1}, + { 0, 4, 6, 12, 14, -1, -1, -1}, + { 2, 4, 6, 12, 14, -1, -1, -1}, + { 0, 2, 4, 6, 12, 14, -1, -1}, + { 8, 12, 14, -1, -1, -1, -1, -1}, + { 0, 8, 12, 14, -1, -1, -1, -1}, + { 2, 8, 12, 14, -1, -1, -1, -1}, + { 0, 2, 8, 12, 14, -1, -1, -1}, + { 4, 8, 12, 14, -1, -1, -1, -1}, + { 0, 4, 8, 12, 14, -1, -1, -1}, + { 2, 4, 8, 12, 14, -1, -1, -1}, + { 0, 2, 4, 8, 12, 14, -1, -1}, + { 6, 8, 12, 14, -1, -1, -1, -1}, + { 0, 6, 8, 12, 14, -1, -1, -1}, + { 2, 6, 8, 12, 14, -1, -1, -1}, + { 0, 2, 6, 8, 12, 14, -1, -1}, + { 4, 6, 8, 12, 14, -1, -1, -1}, + { 0, 4, 6, 8, 12, 14, -1, -1}, + { 2, 4, 6, 8, 12, 14, -1, -1}, + { 0, 2, 4, 6, 8, 12, 14, -1}, + {10, 12, 14, -1, -1, -1, -1, -1}, + { 0, 10, 12, 14, -1, -1, -1, -1}, + { 2, 10, 12, 14, -1, -1, -1, -1}, + { 0, 2, 10, 12, 14, -1, -1, -1}, + { 4, 10, 12, 14, -1, -1, -1, -1}, + { 0, 4, 10, 12, 14, -1, -1, -1}, + { 2, 4, 10, 12, 14, -1, -1, -1}, + { 0, 2, 4, 10, 12, 14, -1, -1}, + { 6, 10, 12, 14, -1, -1, -1, -1}, + { 0, 6, 10, 12, 14, -1, -1, -1}, + { 2, 6, 10, 12, 14, -1, -1, -1}, + { 0, 2, 6, 10, 12, 14, -1, -1}, + { 4, 6, 10, 12, 14, -1, -1, -1}, + { 0, 4, 6, 10, 12, 14, -1, -1}, + { 2, 4, 6, 10, 12, 14, -1, -1}, + { 0, 2, 4, 6, 10, 12, 14, -1}, + { 8, 10, 12, 14, -1, -1, -1, -1}, + { 0, 8, 10, 12, 14, -1, -1, -1}, + { 2, 8, 10, 12, 14, -1, -1, -1}, + { 0, 2, 8, 10, 12, 14, -1, -1}, + { 4, 8, 10, 12, 14, -1, -1, -1}, + { 0, 4, 8, 10, 12, 14, -1, -1}, + { 2, 4, 8, 10, 12, 14, -1, -1}, + { 0, 2, 4, 8, 10, 12, 14, -1}, + { 6, 8, 10, 12, 14, -1, -1, -1}, + { 0, 6, 8, 10, 12, 14, -1, -1}, + { 2, 6, 8, 10, 12, 14, -1, -1}, + { 0, 2, 6, 8, 10, 12, 14, -1}, + { 4, 6, 8, 10, 12, 14, -1, -1}, + { 0, 4, 6, 8, 10, 12, 14, -1}, + { 2, 4, 6, 8, 10, 12, 14, -1}, + { 0, 2, 4, 6, 8, 10, 12, 14} +}; +#endif + +#define _mm256_cmpge_epu16(a, b) _mm256_cmpeq_epi16(_mm256_max_epu16(a, b), a) +#define _mm_cmpge_epu16(a, b) _mm_cmpeq_epi16(_mm_max_epu16(a, b), a) + +unsigned int rej_uniform_avx(int16_t * restrict r, const uint8_t *buf) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + uint32_t good; +#ifdef BMI + uint64_t idx0, idx1, idx2, idx3; +#endif + const __m256i bound = _mm256_load_si256(&qdata.vec[_16XQ/16]); + const __m256i ones = _mm256_set1_epi8(1); + const __m256i mask = _mm256_set1_epi16(0xFFF); + const __m256i idx8 = _mm256_set_epi8(15,14,14,13,12,11,11,10, + 9, 8, 8, 7, 6, 5, 5, 4, + 11,10,10, 9, 8, 7, 7, 6, + 5, 4, 4, 3, 2, 1, 1, 0); + __m256i f0, f1, g0, g1, g2, g3; + __m128i f, t, pilo, pihi; + + ctr = pos = 0; + while(ctr <= KYBER_N - 32 && pos <= REJ_UNIFORM_AVX_BUFLEN - 56) { + f0 = _mm256_loadu_si256((__m256i *)&buf[pos]); + f1 = _mm256_loadu_si256((__m256i *)&buf[pos+24]); + f0 = _mm256_permute4x64_epi64(f0, 0x94); + f1 = _mm256_permute4x64_epi64(f1, 0x94); + f0 = _mm256_shuffle_epi8(f0, idx8); + f1 = _mm256_shuffle_epi8(f1, idx8); + g0 = _mm256_srli_epi16(f0, 4); + g1 = _mm256_srli_epi16(f1, 4); + f0 = _mm256_blend_epi16(f0, g0, 0xAA); + f1 = _mm256_blend_epi16(f1, g1, 0xAA); + f0 = _mm256_and_si256(f0, mask); + f1 = _mm256_and_si256(f1, mask); + pos += 48; + + g0 = _mm256_cmpgt_epi16(bound, f0); + g1 = _mm256_cmpgt_epi16(bound, f1); + + g0 = _mm256_packs_epi16(g0, g1); + good = _mm256_movemask_epi8(g0); + +#ifdef BMI + idx0 = _pdep_u64(good >> 0, 0x0101010101010101); + idx1 = _pdep_u64(good >> 8, 0x0101010101010101); + idx2 = _pdep_u64(good >> 16, 0x0101010101010101); + idx3 = _pdep_u64(good >> 24, 0x0101010101010101); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + idx1 = (idx1 << 8) - idx1; + idx1 = _pext_u64(0x0E0C0A0806040200, idx1); + idx2 = (idx2 << 8) - idx2; + idx2 = _pext_u64(0x0E0C0A0806040200, idx2); + idx3 = (idx3 << 8) - idx3; + idx3 = _pext_u64(0x0E0C0A0806040200, idx3); + + g0 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx0)); + g1 = _mm256_castsi128_si256(_mm_cvtsi64_si128(idx1)); + g0 = _mm256_inserti128_si256(g0, _mm_cvtsi64_si128(idx2), 1); + g1 = _mm256_inserti128_si256(g1, _mm_cvtsi64_si128(idx3), 1); +#else + g0 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 0) & 0xFF])); + g1 = _mm256_castsi128_si256(_mm_loadl_epi64((__m128i *)&idx[(good >> 8) & 0xFF])); + g0 = _mm256_inserti128_si256(g0, _mm_loadl_epi64((__m128i *)&idx[(good >> 16) & 0xFF]), 1); + g1 = _mm256_inserti128_si256(g1, _mm_loadl_epi64((__m128i *)&idx[(good >> 24) & 0xFF]), 1); +#endif + + g2 = _mm256_add_epi8(g0, ones); + g3 = _mm256_add_epi8(g1, ones); + g0 = _mm256_unpacklo_epi8(g0, g2); + g1 = _mm256_unpacklo_epi8(g1, g3); + + f0 = _mm256_shuffle_epi8(f0, g0); + f1 = _mm256_shuffle_epi8(f1, g1); + + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f0)); + ctr += _mm_popcnt_u32((good >> 0) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f0, 1)); + ctr += _mm_popcnt_u32((good >> 16) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_castsi256_si128(f1)); + ctr += _mm_popcnt_u32((good >> 8) & 0xFF); + _mm_storeu_si128((__m128i *)&r[ctr], _mm256_extracti128_si256(f1, 1)); + ctr += _mm_popcnt_u32((good >> 24) & 0xFF); + } + + while(ctr <= KYBER_N - 8 && pos <= REJ_UNIFORM_AVX_BUFLEN - 16) { + f = _mm_loadu_si128((__m128i *)&buf[pos]); + f = _mm_shuffle_epi8(f, _mm256_castsi256_si128(idx8)); + t = _mm_srli_epi16(f, 4); + f = _mm_blend_epi16(f, t, 0xAA); + f = _mm_and_si128(f, _mm256_castsi256_si128(mask)); + pos += 12; + + t = _mm_cmpgt_epi16(_mm256_castsi256_si128(bound), f); + good = _mm_movemask_epi8(t); + +#ifdef BMI + good &= 0x5555; + idx0 = _pdep_u64(good, 0x1111111111111111); + idx0 = (idx0 << 8) - idx0; + idx0 = _pext_u64(0x0E0C0A0806040200, idx0); + pilo = _mm_cvtsi64_si128(idx0); +#else + good = _pext_u32(good, 0x5555); + pilo = _mm_loadl_epi64((__m128i *)&idx[good]); +#endif + + pihi = _mm_add_epi8(pilo, _mm256_castsi256_si128(ones)); + pilo = _mm_unpacklo_epi8(pilo, pihi); + f = _mm_shuffle_epi8(f, pilo); + _mm_storeu_si128((__m128i *)&r[ctr], f); + ctr += _mm_popcnt_u32(good); + } + + while(ctr < KYBER_N && pos <= REJ_UNIFORM_AVX_BUFLEN - 3) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)); + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(val1 < KYBER_Q && ctr < KYBER_N) + r[ctr++] = val1; + } + + return ctr; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.h new file mode 100644 index 000000000..3be5e2192 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.h @@ -0,0 +1,14 @@ +#ifndef REJSAMPLE_H +#define REJSAMPLE_H + +#include +#include "params.h" +#include "symmetric.h" + +#define REJ_UNIFORM_AVX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +#define REJ_UNIFORM_AVX_BUFLEN (REJ_UNIFORM_AVX_NBLOCKS*XOF_BLOCKBYTES) + +#define rej_uniform_avx KYBER_NAMESPACE(rej_uniform_avx) +unsigned int rej_uniform_avx(int16_t *r, const uint8_t *buf); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S new file mode 100644 index 000000000..18325ebec --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S @@ -0,0 +1,255 @@ +#include "consts.h" +.include "fq.inc" +.include "shuffle.inc" + +/* +nttpack_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 +shuffle1 10,11,8,11 + +shuffle2 3,4,10,4 +shuffle2 6,8,3,8 +shuffle2 5,7,6,7 +shuffle2 9,11,5,11 + +shuffle4 10,3,9,3 +shuffle4 6,5,10,5 +shuffle4 4,8,6,8 +shuffle4 7,11,4,11 + +shuffle8 9,10,7,10 +shuffle8 6,4,9,4 +shuffle8 3,5,6,5 +shuffle8 8,11,3,11 + +#store +vmovdqa %ymm7,(%rdi) +vmovdqa %ymm9,32(%rdi) +vmovdqa %ymm6,64(%rdi) +vmovdqa %ymm3,96(%rdi) +vmovdqa %ymm10,128(%rdi) +vmovdqa %ymm4,160(%rdi) +vmovdqa %ymm5,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret +*/ + +.text +nttunpack128_avx: +#load +vmovdqa (%rdi),%ymm4 +vmovdqa 32(%rdi),%ymm5 +vmovdqa 64(%rdi),%ymm6 +vmovdqa 96(%rdi),%ymm7 +vmovdqa 128(%rdi),%ymm8 +vmovdqa 160(%rdi),%ymm9 +vmovdqa 192(%rdi),%ymm10 +vmovdqa 224(%rdi),%ymm11 + +shuffle8 4,8,3,8 +shuffle8 5,9,4,9 +shuffle8 6,10,5,10 +shuffle8 7,11,6,11 + +shuffle4 3,5,7,5 +shuffle4 8,10,3,10 +shuffle4 4,6,8,6 +shuffle4 9,11,4,11 + +shuffle2 7,8,9,8 +shuffle2 5,6,7,6 +shuffle2 3,4,5,4 +shuffle2 10,11,3,11 + +shuffle1 9,5,10,5 +shuffle1 8,4,9,4 +shuffle1 7,3,8,3 +shuffle1 6,11,7,11 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm5,32(%rdi) +vmovdqa %ymm9,64(%rdi) +vmovdqa %ymm4,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm3,160(%rdi) +vmovdqa %ymm7,192(%rdi) +vmovdqa %ymm11,224(%rdi) + +ret + +.global cdecl(nttunpack_avx) +cdecl(nttunpack_avx): +call nttunpack128_avx +add $256,%rdi +call nttunpack128_avx +ret + +ntttobytes128_avx: +#load +vmovdqa (%rsi),%ymm5 +vmovdqa 32(%rsi),%ymm6 +vmovdqa 64(%rsi),%ymm7 +vmovdqa 96(%rsi),%ymm8 +vmovdqa 128(%rsi),%ymm9 +vmovdqa 160(%rsi),%ymm10 +vmovdqa 192(%rsi),%ymm11 +vmovdqa 224(%rsi),%ymm12 + +#csubq +csubq 5,13 +csubq 6,13 +csubq 7,13 +csubq 8,13 +csubq 9,13 +csubq 10,13 +csubq 11,13 +csubq 12,13 + +#bitpack +vpsllw $12,%ymm6,%ymm4 +vpor %ymm4,%ymm5,%ymm4 + +vpsrlw $4,%ymm6,%ymm5 +vpsllw $8,%ymm7,%ymm6 +vpor %ymm5,%ymm6,%ymm5 + +vpsrlw $8,%ymm7,%ymm6 +vpsllw $4,%ymm8,%ymm7 +vpor %ymm6,%ymm7,%ymm6 + +vpsllw $12,%ymm10,%ymm7 +vpor %ymm7,%ymm9,%ymm7 + +vpsrlw $4,%ymm10,%ymm8 +vpsllw $8,%ymm11,%ymm9 +vpor %ymm8,%ymm9,%ymm8 + +vpsrlw $8,%ymm11,%ymm9 +vpsllw $4,%ymm12,%ymm10 +vpor %ymm9,%ymm10,%ymm9 + +shuffle1 4,5,3,5 +shuffle1 6,7,4,7 +shuffle1 8,9,6,9 + +shuffle2 3,4,8,4 +shuffle2 6,5,3,5 +shuffle2 7,9,6,9 + +shuffle4 8,3,7,3 +shuffle4 6,4,8,4 +shuffle4 5,9,6,9 + +shuffle8 7,8,5,8 +shuffle8 6,3,7,3 +shuffle8 4,9,6,9 + +#store +vmovdqu %ymm5,(%rdi) +vmovdqu %ymm7,32(%rdi) +vmovdqu %ymm6,64(%rdi) +vmovdqu %ymm8,96(%rdi) +vmovdqu %ymm3,128(%rdi) +vmovdqu %ymm9,160(%rdi) + +ret + +.global cdecl(ntttobytes_avx) +cdecl(ntttobytes_avx): +#consts +vmovdqa _16XQ*2(%rdx),%ymm0 +call ntttobytes128_avx +add $256,%rsi +add $192,%rdi +call ntttobytes128_avx +ret + +nttfrombytes128_avx: +#load +vmovdqu (%rsi),%ymm4 +vmovdqu 32(%rsi),%ymm5 +vmovdqu 64(%rsi),%ymm6 +vmovdqu 96(%rsi),%ymm7 +vmovdqu 128(%rsi),%ymm8 +vmovdqu 160(%rsi),%ymm9 + +shuffle8 4,7,3,7 +shuffle8 5,8,4,8 +shuffle8 6,9,5,9 + +shuffle4 3,8,6,8 +shuffle4 7,5,3,5 +shuffle4 4,9,7,9 + +shuffle2 6,5,4,5 +shuffle2 8,7,6,7 +shuffle2 3,9,8,9 + +shuffle1 4,7,10,7 +shuffle1 5,8,4,8 +shuffle1 6,9,5,9 + +#bitunpack +vpsrlw $12,%ymm10,%ymm11 +vpsllw $4,%ymm7,%ymm12 +vpor %ymm11,%ymm12,%ymm11 +vpand %ymm0,%ymm10,%ymm10 +vpand %ymm0,%ymm11,%ymm11 + +vpsrlw $8,%ymm7,%ymm12 +vpsllw $8,%ymm4,%ymm13 +vpor %ymm12,%ymm13,%ymm12 +vpand %ymm0,%ymm12,%ymm12 + +vpsrlw $4,%ymm4,%ymm13 +vpand %ymm0,%ymm13,%ymm13 + +vpsrlw $12,%ymm8,%ymm14 +vpsllw $4,%ymm5,%ymm15 +vpor %ymm14,%ymm15,%ymm14 +vpand %ymm0,%ymm8,%ymm8 +vpand %ymm0,%ymm14,%ymm14 + +vpsrlw $8,%ymm5,%ymm15 +vpsllw $8,%ymm9,%ymm1 +vpor %ymm15,%ymm1,%ymm15 +vpand %ymm0,%ymm15,%ymm15 + +vpsrlw $4,%ymm9,%ymm1 +vpand %ymm0,%ymm1,%ymm1 + +#store +vmovdqa %ymm10,(%rdi) +vmovdqa %ymm11,32(%rdi) +vmovdqa %ymm12,64(%rdi) +vmovdqa %ymm13,96(%rdi) +vmovdqa %ymm8,128(%rdi) +vmovdqa %ymm14,160(%rdi) +vmovdqa %ymm15,192(%rdi) +vmovdqa %ymm1,224(%rdi) + +ret + +.global cdecl(nttfrombytes_avx) +cdecl(nttfrombytes_avx): +#consts +vmovdqa _16XMASK*2(%rdx),%ymm0 +call nttfrombytes128_avx +add $256,%rdi +add $192,%rsi +call nttfrombytes128_avx +ret diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.inc b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.inc new file mode 100644 index 000000000..73e9ffe03 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.inc @@ -0,0 +1,25 @@ +.macro shuffle8 r0,r1,r2,r3 +vperm2i128 $0x20,%ymm\r1,%ymm\r0,%ymm\r2 +vperm2i128 $0x31,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle4 r0,r1,r2,r3 +vpunpcklqdq %ymm\r1,%ymm\r0,%ymm\r2 +vpunpckhqdq %ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle2 r0,r1,r2,r3 +#vpsllq $32,%ymm\r1,%ymm\r2 +vmovsldup %ymm\r1,%ymm\r2 +vpblendd $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrlq $32,%ymm\r0,%ymm\r0 +#vmovshdup %ymm\r0,%ymm\r0 +vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm + +.macro shuffle1 r0,r1,r2,r3 +vpslld $16,%ymm\r1,%ymm\r2 +vpblendw $0xAA,%ymm\r2,%ymm\r0,%ymm\r2 +vpsrld $16,%ymm\r0,%ymm\r0 +vpblendw $0xAA,%ymm\r1,%ymm\r0,%ymm\r3 +.endm diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric.h new file mode 100644 index 000000000..e4941f7a8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric.h @@ -0,0 +1,34 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" +#include "fips202x4.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c new file mode 100644 index 000000000..aa8e2850b --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint64_t r; + __m256i f, g, h; + + h = _mm256_setzero_si256(); + for(i=0;i> 63; + return r; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t * restrict r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + __m256i xvec, rvec, bvec; + + bvec = _mm256_set1_epi64x(-(uint64_t)b); + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/LICENSE b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/LICENSE new file mode 100644 index 000000000..7922ab800 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/LICENSE @@ -0,0 +1,6 @@ +Public Domain (https://creativecommons.org/share-your-work/public-domain/cc0/); +or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html). + +For Keccak and AES we are using public-domain +code from sources and by authors listed in +comments on top of the respective files. diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/api.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/api.h new file mode 100644 index 000000000..70d40f3f3 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/api.h @@ -0,0 +1,66 @@ +#ifndef API_H +#define API_H + +#include + +#define pqcrystals_kyber512_SECRETKEYBYTES 1632 +#define pqcrystals_kyber512_PUBLICKEYBYTES 800 +#define pqcrystals_kyber512_CIPHERTEXTBYTES 768 +#define pqcrystals_kyber512_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber512_ENCCOINBYTES 32 +#define pqcrystals_kyber512_BYTES 32 + +#define pqcrystals_kyber512_ref_SECRETKEYBYTES pqcrystals_kyber512_SECRETKEYBYTES +#define pqcrystals_kyber512_ref_PUBLICKEYBYTES pqcrystals_kyber512_PUBLICKEYBYTES +#define pqcrystals_kyber512_ref_CIPHERTEXTBYTES pqcrystals_kyber512_CIPHERTEXTBYTES +#define pqcrystals_kyber512_ref_KEYPAIRCOINBYTES pqcrystals_kyber512_KEYPAIRCOINBYTES +#define pqcrystals_kyber512_ref_ENCCOINBYTES pqcrystals_kyber512_ENCCOINBYTES +#define pqcrystals_kyber512_ref_BYTES pqcrystals_kyber512_BYTES + +int pqcrystals_kyber512_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber512_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber512_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber512_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber512_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber768_SECRETKEYBYTES 2400 +#define pqcrystals_kyber768_PUBLICKEYBYTES 1184 +#define pqcrystals_kyber768_CIPHERTEXTBYTES 1088 +#define pqcrystals_kyber768_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber768_ENCCOINBYTES 32 +#define pqcrystals_kyber768_BYTES 32 + +#define pqcrystals_kyber768_ref_SECRETKEYBYTES pqcrystals_kyber768_SECRETKEYBYTES +#define pqcrystals_kyber768_ref_PUBLICKEYBYTES pqcrystals_kyber768_PUBLICKEYBYTES +#define pqcrystals_kyber768_ref_CIPHERTEXTBYTES pqcrystals_kyber768_CIPHERTEXTBYTES +#define pqcrystals_kyber768_ref_KEYPAIRCOINBYTES pqcrystals_kyber768_KEYPAIRCOINBYTES +#define pqcrystals_kyber768_ref_ENCCOINBYTES pqcrystals_kyber768_ENCCOINBYTES +#define pqcrystals_kyber768_ref_BYTES pqcrystals_kyber768_BYTES + +int pqcrystals_kyber768_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber768_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber768_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber768_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber768_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#define pqcrystals_kyber1024_SECRETKEYBYTES 3168 +#define pqcrystals_kyber1024_PUBLICKEYBYTES 1568 +#define pqcrystals_kyber1024_CIPHERTEXTBYTES 1568 +#define pqcrystals_kyber1024_KEYPAIRCOINBYTES 64 +#define pqcrystals_kyber1024_ENCCOINBYTES 32 +#define pqcrystals_kyber1024_BYTES 32 + +#define pqcrystals_kyber1024_ref_SECRETKEYBYTES pqcrystals_kyber1024_SECRETKEYBYTES +#define pqcrystals_kyber1024_ref_PUBLICKEYBYTES pqcrystals_kyber1024_PUBLICKEYBYTES +#define pqcrystals_kyber1024_ref_CIPHERTEXTBYTES pqcrystals_kyber1024_CIPHERTEXTBYTES +#define pqcrystals_kyber1024_ref_KEYPAIRCOINBYTES pqcrystals_kyber1024_KEYPAIRCOINBYTES +#define pqcrystals_kyber1024_ref_ENCCOINBYTES pqcrystals_kyber1024_ENCCOINBYTES +#define pqcrystals_kyber1024_ref_BYTES pqcrystals_kyber1024_BYTES + +int pqcrystals_kyber1024_ref_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_keypair(uint8_t *pk, uint8_t *sk); +int pqcrystals_kyber1024_ref_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); +int pqcrystals_kyber1024_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); +int pqcrystals_kyber1024_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c new file mode 100644 index 000000000..1500ffea5 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c @@ -0,0 +1,128 @@ +#include +#include "params.h" +#include "cbd.h" + +/************************************************* +* Name: load32_littleendian +* +* Description: load 4 bytes into a 32-bit integer +* in little-endian order +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x +**************************************************/ +static uint32_t load32_littleendian(const uint8_t x[4]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + r |= (uint32_t)x[3] << 24; + return r; +} + +/************************************************* +* Name: load24_littleendian +* +* Description: load 3 bytes into a 32-bit integer +* in little-endian order. +* This function is only needed for Kyber-512 +* +* Arguments: - const uint8_t *x: pointer to input byte array +* +* Returns 32-bit unsigned integer loaded from x (most significant byte is zero) +**************************************************/ +#if KYBER_ETA1 == 3 +static uint32_t load24_littleendian(const uint8_t x[3]) +{ + uint32_t r; + r = (uint32_t)x[0]; + r |= (uint32_t)x[1] << 8; + r |= (uint32_t)x[2] << 16; + return r; +} +#endif + + +/************************************************* +* Name: cbd2 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +static void cbd2(poly *r, const uint8_t buf[2*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x55555555; + + for(j=0;j<8;j++) { + a = (d >> (4*j+0)) & 0x3; + b = (d >> (4*j+2)) & 0x3; + r->coeffs[8*i+j] = a - b; + } + } +} + +/************************************************* +* Name: cbd3 +* +* Description: Given an array of uniformly random bytes, compute +* polynomial with coefficients distributed according to +* a centered binomial distribution with parameter eta=3. +* This function is only needed for Kyber-512 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *buf: pointer to input byte array +**************************************************/ +#if KYBER_ETA1 == 3 +static void cbd3(poly *r, const uint8_t buf[3*KYBER_N/4]) +{ + unsigned int i,j; + uint32_t t,d; + int16_t a,b; + + for(i=0;i>1) & 0x00249249; + d += (t>>2) & 0x00249249; + + for(j=0;j<4;j++) { + a = (d >> (6*j+0)) & 0x7; + b = (d >> (6*j+3)) & 0x7; + r->coeffs[4*i+j] = a - b; + } + } +} +#endif + +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]) +{ +#if KYBER_ETA1 == 2 + cbd2(r, buf); +#elif KYBER_ETA1 == 3 + cbd3(r, buf); +#else +#error "This implementation requires eta1 in {2,3}" +#endif +} + +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]) +{ +#if KYBER_ETA2 == 2 + cbd2(r, buf); +#else +#error "This implementation requires eta2 = 2" +#endif +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.h new file mode 100644 index 000000000..7b677d745 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.h @@ -0,0 +1,14 @@ +#ifndef CBD_H +#define CBD_H + +#include +#include "params.h" +#include "poly.h" + +#define poly_cbd_eta1 KYBER_NAMESPACE(poly_cbd_eta1) +void poly_cbd_eta1(poly *r, const uint8_t buf[KYBER_ETA1*KYBER_N/4]); + +#define poly_cbd_eta2 KYBER_NAMESPACE(poly_cbd_eta2) +void poly_cbd_eta2(poly *r, const uint8_t buf[KYBER_ETA2*KYBER_N/4]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c new file mode 100644 index 000000000..4a8b4c894 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c @@ -0,0 +1,331 @@ +#include +#include +#include +#include "params.h" +#include "indcpa.h" +#include "polyvec.h" +#include "poly.h" +#include "ntt.h" +#include "symmetric.h" +#include "randombytes.h" + +/************************************************* +* Name: pack_pk +* +* Description: Serialize the public key as concatenation of the +* serialized vector of polynomials pk +* and the public seed used to generate the matrix A. +* +* Arguments: uint8_t *r: pointer to the output serialized public key +* polyvec *pk: pointer to the input public-key polyvec +* const uint8_t *seed: pointer to the input public seed +**************************************************/ +static void pack_pk(uint8_t r[KYBER_INDCPA_PUBLICKEYBYTES], + polyvec *pk, + const uint8_t seed[KYBER_SYMBYTES]) +{ + polyvec_tobytes(r, pk); + memcpy(r+KYBER_POLYVECBYTES, seed, KYBER_SYMBYTES); +} + +/************************************************* +* Name: unpack_pk +* +* Description: De-serialize public key from a byte array; +* approximate inverse of pack_pk +* +* Arguments: - polyvec *pk: pointer to output public-key polynomial vector +* - uint8_t *seed: pointer to output seed to generate matrix A +* - const uint8_t *packedpk: pointer to input serialized public key +**************************************************/ +static void unpack_pk(polyvec *pk, + uint8_t seed[KYBER_SYMBYTES], + const uint8_t packedpk[KYBER_INDCPA_PUBLICKEYBYTES]) +{ + polyvec_frombytes(pk, packedpk); + memcpy(seed, packedpk+KYBER_POLYVECBYTES, KYBER_SYMBYTES); +} + +/************************************************* +* Name: pack_sk +* +* Description: Serialize the secret key +* +* Arguments: - uint8_t *r: pointer to output serialized secret key +* - polyvec *sk: pointer to input vector of polynomials (secret key) +**************************************************/ +static void pack_sk(uint8_t r[KYBER_INDCPA_SECRETKEYBYTES], polyvec *sk) +{ + polyvec_tobytes(r, sk); +} + +/************************************************* +* Name: unpack_sk +* +* Description: De-serialize the secret key; inverse of pack_sk +* +* Arguments: - polyvec *sk: pointer to output vector of polynomials (secret key) +* - const uint8_t *packedsk: pointer to input serialized secret key +**************************************************/ +static void unpack_sk(polyvec *sk, const uint8_t packedsk[KYBER_INDCPA_SECRETKEYBYTES]) +{ + polyvec_frombytes(sk, packedsk); +} + +/************************************************* +* Name: pack_ciphertext +* +* Description: Serialize the ciphertext as concatenation of the +* compressed and serialized vector of polynomials b +* and the compressed and serialized polynomial v +* +* Arguments: uint8_t *r: pointer to the output serialized ciphertext +* poly *pk: pointer to the input vector of polynomials b +* poly *v: pointer to the input polynomial v +**************************************************/ +static void pack_ciphertext(uint8_t r[KYBER_INDCPA_BYTES], polyvec *b, poly *v) +{ + polyvec_compress(r, b); + poly_compress(r+KYBER_POLYVECCOMPRESSEDBYTES, v); +} + +/************************************************* +* Name: unpack_ciphertext +* +* Description: De-serialize and decompress ciphertext from a byte array; +* approximate inverse of pack_ciphertext +* +* Arguments: - polyvec *b: pointer to the output vector of polynomials b +* - poly *v: pointer to the output polynomial v +* - const uint8_t *c: pointer to the input serialized ciphertext +**************************************************/ +static void unpack_ciphertext(polyvec *b, poly *v, const uint8_t c[KYBER_INDCPA_BYTES]) +{ + polyvec_decompress(b, c); + poly_decompress(v, c+KYBER_POLYVECCOMPRESSEDBYTES); +} + +/************************************************* +* Name: rej_uniform +* +* Description: Run rejection sampling on uniform random bytes to generate +* uniform random integers mod q +* +* Arguments: - int16_t *r: pointer to output buffer +* - unsigned int len: requested number of 16-bit integers (uniform mod q) +* - const uint8_t *buf: pointer to input buffer (assumed to be uniformly random bytes) +* - unsigned int buflen: length of input buffer in bytes +* +* Returns number of sampled 16-bit integers (at most len) +**************************************************/ +static unsigned int rej_uniform(int16_t *r, + unsigned int len, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int ctr, pos; + uint16_t val0, val1; + + ctr = pos = 0; + while(ctr < len && pos + 3 <= buflen) { + val0 = ((buf[pos+0] >> 0) | ((uint16_t)buf[pos+1] << 8)) & 0xFFF; + val1 = ((buf[pos+1] >> 4) | ((uint16_t)buf[pos+2] << 4)) & 0xFFF; + pos += 3; + + if(val0 < KYBER_Q) + r[ctr++] = val0; + if(ctr < len && val1 < KYBER_Q) + r[ctr++] = val1; + } + + return ctr; +} + +#define gen_a(A,B) gen_matrix(A,B,0) +#define gen_at(A,B) gen_matrix(A,B,1) + +/************************************************* +* Name: gen_matrix +* +* Description: Deterministically generate matrix A (or the transpose of A) +* from a seed. Entries of the matrix are polynomials that look +* uniformly random. Performs rejection sampling on output of +* a XOF +* +* Arguments: - polyvec *a: pointer to ouptput matrix A +* - const uint8_t *seed: pointer to input seed +* - int transposed: boolean deciding whether A or A^T is generated +**************************************************/ +#define GEN_MATRIX_NBLOCKS ((12*KYBER_N/8*(1 << 12)/KYBER_Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) +// Not static for benchmarking +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) +{ + unsigned int ctr, i, j, k; + unsigned int buflen, off; + uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; + xof_state state; + xof_init(&state, seed); + + for(i=0;i +#include "params.h" +#include "polyvec.h" + +#define gen_matrix KYBER_NAMESPACE(gen_matrix) +void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed); + +#define indcpa_keypair_derand KYBER_NAMESPACE(indcpa_keypair_derand) +void indcpa_keypair_derand(uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_enc KYBER_NAMESPACE(indcpa_enc) +void indcpa_enc(uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t pk[KYBER_INDCPA_PUBLICKEYBYTES], + const uint8_t coins[KYBER_SYMBYTES]); + +#define indcpa_dec KYBER_NAMESPACE(indcpa_dec) +void indcpa_dec(uint8_t m[KYBER_INDCPA_MSGBYTES], + const uint8_t c[KYBER_INDCPA_BYTES], + const uint8_t sk[KYBER_INDCPA_SECRETKEYBYTES]); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c new file mode 100644 index 000000000..63abc1029 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include "params.h" +#include "kem.h" +#include "indcpa.h" +#include "verify.h" +#include "symmetric.h" +#include "randombytes.h" +/************************************************* +* Name: crypto_kem_keypair_derand +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* - uint8_t *coins: pointer to input randomness +* (an already allocated array filled with 2*KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair_derand(uint8_t *pk, + uint8_t *sk, + const uint8_t *coins) +{ + indcpa_keypair_derand(pk, sk, coins); + memcpy(sk+KYBER_INDCPA_SECRETKEYBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_h(sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + /* Value z for pseudo-random output on reject */ + memcpy(sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES, coins+KYBER_SYMBYTES, KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_keypair +* +* Description: Generates public and private key +* for CCA-secure Kyber key encapsulation mechanism +* +* Arguments: - uint8_t *pk: pointer to output public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - uint8_t *sk: pointer to output private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_keypair(uint8_t *pk, + uint8_t *sk) +{ + uint8_t coins[2*KYBER_SYMBYTES]; + randombytes(coins, 2*KYBER_SYMBYTES); + crypto_kem_keypair_derand(pk, sk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc_derand +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* - const uint8_t *coins: pointer to input randomness +* (an already allocated array filled with KYBER_SYMBYTES random bytes) +** +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc_derand(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk, + const uint8_t *coins) +{ + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + + memcpy(buf, coins, KYBER_SYMBYTES); + + /* Multitarget countermeasure for coins + contributory KEM */ + hash_h(buf+KYBER_SYMBYTES, pk, KYBER_PUBLICKEYBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(ct, buf, pk, kr+KYBER_SYMBYTES); + + memcpy(ss,kr,KYBER_SYMBYTES); + return 0; +} + +/************************************************* +* Name: crypto_kem_enc +* +* Description: Generates cipher text and shared +* secret for given public key +* +* Arguments: - uint8_t *ct: pointer to output cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *pk: pointer to input public key +* (an already allocated array of KYBER_PUBLICKEYBYTES bytes) +* +* Returns 0 (success) +**************************************************/ +int crypto_kem_enc(uint8_t *ct, + uint8_t *ss, + const uint8_t *pk) +{ + uint8_t coins[KYBER_SYMBYTES]; + randombytes(coins, KYBER_SYMBYTES); + crypto_kem_enc_derand(ct, ss, pk, coins); + return 0; +} + +/************************************************* +* Name: crypto_kem_dec +* +* Description: Generates shared secret for given +* cipher text and private key +* +* Arguments: - uint8_t *ss: pointer to output shared secret +* (an already allocated array of KYBER_SSBYTES bytes) +* - const uint8_t *ct: pointer to input cipher text +* (an already allocated array of KYBER_CIPHERTEXTBYTES bytes) +* - const uint8_t *sk: pointer to input private key +* (an already allocated array of KYBER_SECRETKEYBYTES bytes) +* +* Returns 0. +* +* On failure, ss will contain a pseudo-random value. +**************************************************/ +int crypto_kem_dec(uint8_t *ss, + const uint8_t *ct, + const uint8_t *sk) +{ + int fail; + uint8_t buf[2*KYBER_SYMBYTES]; + /* Will contain key, coins */ + uint8_t kr[2*KYBER_SYMBYTES]; + uint8_t cmp[KYBER_CIPHERTEXTBYTES+KYBER_SYMBYTES]; + const uint8_t *pk = sk+KYBER_INDCPA_SECRETKEYBYTES; + + indcpa_dec(buf, ct, sk); + + /* Multitarget countermeasure for coins + contributory KEM */ + memcpy(buf+KYBER_SYMBYTES, sk+KYBER_SECRETKEYBYTES-2*KYBER_SYMBYTES, KYBER_SYMBYTES); + hash_g(kr, buf, 2*KYBER_SYMBYTES); + + /* coins are in kr+KYBER_SYMBYTES */ + indcpa_enc(cmp, buf, pk, kr+KYBER_SYMBYTES); + + fail = verify(ct, cmp, KYBER_CIPHERTEXTBYTES); + + /* Compute rejection key */ + rkprf(ss,sk+KYBER_SECRETKEYBYTES-KYBER_SYMBYTES,ct); + + /* Copy true key to return buffer if fail is false */ + cmov(ss,kr,KYBER_SYMBYTES,!fail); + + return 0; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.h new file mode 100644 index 000000000..234f11966 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.h @@ -0,0 +1,35 @@ +#ifndef KEM_H +#define KEM_H + +#include +#include "params.h" + +#define CRYPTO_SECRETKEYBYTES KYBER_SECRETKEYBYTES +#define CRYPTO_PUBLICKEYBYTES KYBER_PUBLICKEYBYTES +#define CRYPTO_CIPHERTEXTBYTES KYBER_CIPHERTEXTBYTES +#define CRYPTO_BYTES KYBER_SSBYTES + +#if (KYBER_K == 2) +#define CRYPTO_ALGNAME "Kyber512" +#elif (KYBER_K == 3) +#define CRYPTO_ALGNAME "Kyber768" +#elif (KYBER_K == 4) +#define CRYPTO_ALGNAME "Kyber1024" +#endif + +#define crypto_kem_keypair_derand KYBER_NAMESPACE(keypair_derand) +int crypto_kem_keypair_derand(uint8_t *pk, uint8_t *sk, const uint8_t *coins); + +#define crypto_kem_keypair KYBER_NAMESPACE(keypair) +int crypto_kem_keypair(uint8_t *pk, uint8_t *sk); + +#define crypto_kem_enc_derand KYBER_NAMESPACE(enc_derand) +int crypto_kem_enc_derand(uint8_t *ct, uint8_t *ss, const uint8_t *pk, const uint8_t *coins); + +#define crypto_kem_enc KYBER_NAMESPACE(enc) +int crypto_kem_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); + +#define crypto_kem_dec KYBER_NAMESPACE(dec) +int crypto_kem_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c new file mode 100644 index 000000000..2f2eb10b2 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c @@ -0,0 +1,146 @@ +#include +#include "params.h" +#include "ntt.h" +#include "reduce.h" + +/* Code to generate zetas and zetas_inv used in the number-theoretic transform: + +#define KYBER_ROOT_OF_UNITY 17 + +static const uint8_t tree[128] = { + 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, + 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, + 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, + 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, + 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, + 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, + 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, + 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127 +}; + +void init_ntt() { + unsigned int i; + int16_t tmp[128]; + + tmp[0] = MONT; + for(i=1;i<128;i++) + tmp[i] = fqmul(tmp[i-1],MONT*KYBER_ROOT_OF_UNITY % KYBER_Q); + + for(i=0;i<128;i++) { + zetas[i] = tmp[tree[i]]; + if(zetas[i] > KYBER_Q/2) + zetas[i] -= KYBER_Q; + if(zetas[i] < -KYBER_Q/2) + zetas[i] += KYBER_Q; + } +} +*/ + +const int16_t zetas[128] = { + -1044, -758, -359, -1517, 1493, 1422, 287, 202, + -171, 622, 1577, 182, 962, -1202, -1474, 1468, + 573, -1325, 264, 383, -829, 1458, -1602, -130, + -681, 1017, 732, 608, -1542, 411, -205, -1571, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -1103, 430, 555, 843, -1251, 871, 1550, 105, + 422, 587, 177, -235, -291, -460, 1574, 1653, + -246, 778, 1159, -147, -777, 1483, -602, 1119, + -1590, 644, -872, 349, 418, 329, -156, -75, + 817, 1097, 603, 610, 1322, -1285, -1465, 384, + -1215, -136, 1218, -1335, -874, 220, -1187, -1659, + -1185, -1530, -1278, 794, -1510, -854, -870, 478, + -108, -308, 996, 991, 958, -1460, 1522, 1628 +}; + +/************************************************* +* Name: fqmul +* +* Description: Multiplication followed by Montgomery reduction +* +* Arguments: - int16_t a: first factor +* - int16_t b: second factor +* +* Returns 16-bit integer congruent to a*b*R^{-1} mod q +**************************************************/ +static int16_t fqmul(int16_t a, int16_t b) { + return montgomery_reduce((int32_t)a*b); +} + +/************************************************* +* Name: ntt +* +* Description: Inplace number-theoretic transform (NTT) in Rq. +* input is in standard order, output is in bitreversed order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void ntt(int16_t r[256]) { + unsigned int len, start, j, k; + int16_t t, zeta; + + k = 1; + for(len = 128; len >= 2; len >>= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k++]; + for(j = start; j < start + len; j++) { + t = fqmul(zeta, r[j + len]); + r[j + len] = r[j] - t; + r[j] = r[j] + t; + } + } + } +} + +/************************************************* +* Name: invntt_tomont +* +* Description: Inplace inverse number-theoretic transform in Rq and +* multiplication by Montgomery factor 2^16. +* Input is in bitreversed order, output is in standard order +* +* Arguments: - int16_t r[256]: pointer to input/output vector of elements of Zq +**************************************************/ +void invntt(int16_t r[256]) { + unsigned int start, len, j, k; + int16_t t, zeta; + const int16_t f = 1441; // mont^2/128 + + k = 127; + for(len = 2; len <= 128; len <<= 1) { + for(start = 0; start < 256; start = j + len) { + zeta = zetas[k--]; + for(j = start; j < start + len; j++) { + t = r[j]; + r[j] = barrett_reduce(t + r[j + len]); + r[j + len] = r[j + len] - t; + r[j + len] = fqmul(zeta, r[j + len]); + } + } + } + + for(j = 0; j < 256; j++) + r[j] = fqmul(r[j], f); +} + +/************************************************* +* Name: basemul +* +* Description: Multiplication of polynomials in Zq[X]/(X^2-zeta) +* used for multiplication of elements in Rq in NTT domain +* +* Arguments: - int16_t r[2]: pointer to the output polynomial +* - const int16_t a[2]: pointer to the first factor +* - const int16_t b[2]: pointer to the second factor +* - int16_t zeta: integer defining the reduction polynomial +**************************************************/ +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta) +{ + r[0] = fqmul(a[1], b[1]); + r[0] = fqmul(r[0], zeta); + r[0] += fqmul(a[0], b[0]); + r[1] = fqmul(a[0], b[1]); + r[1] += fqmul(a[1], b[0]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.h new file mode 100644 index 000000000..227ea74f0 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.h @@ -0,0 +1,19 @@ +#ifndef NTT_H +#define NTT_H + +#include +#include "params.h" + +#define zetas KYBER_NAMESPACE(zetas) +extern const int16_t zetas[128]; + +#define ntt KYBER_NAMESPACE(ntt) +void ntt(int16_t poly[256]); + +#define invntt KYBER_NAMESPACE(invntt) +void invntt(int16_t poly[256]); + +#define basemul KYBER_NAMESPACE(basemul) +void basemul(int16_t r[2], const int16_t a[2], const int16_t b[2], int16_t zeta); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/params.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/params.h new file mode 100644 index 000000000..36b2b987f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/params.h @@ -0,0 +1,55 @@ +#ifndef PARAMS_H +#define PARAMS_H + +#ifndef KYBER_K +#define KYBER_K 3 /* Change this for different security strengths */ +#endif + + +/* Don't change parameters below this line */ +#if (KYBER_K == 2) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_512_ipd_ref_##s +#elif (KYBER_K == 3) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_768_ipd_ref_##s +#elif (KYBER_K == 4) +#define KYBER_NAMESPACE(s) pqcrystals_ml_kem_1024_ipd_ref_##s +#else +#error "KYBER_K must be in {2,3,4}" +#endif + +#define KYBER_N 256 +#define KYBER_Q 3329 + +#define KYBER_SYMBYTES 32 /* size in bytes of hashes, and seeds */ +#define KYBER_SSBYTES 32 /* size in bytes of shared key */ + +#define KYBER_POLYBYTES 384 +#define KYBER_POLYVECBYTES (KYBER_K * KYBER_POLYBYTES) + +#if KYBER_K == 2 +#define KYBER_ETA1 3 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 3 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 128 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 320) +#elif KYBER_K == 4 +#define KYBER_ETA1 2 +#define KYBER_POLYCOMPRESSEDBYTES 160 +#define KYBER_POLYVECCOMPRESSEDBYTES (KYBER_K * 352) +#endif + +#define KYBER_ETA2 2 + +#define KYBER_INDCPA_MSGBYTES (KYBER_SYMBYTES) +#define KYBER_INDCPA_PUBLICKEYBYTES (KYBER_POLYVECBYTES + KYBER_SYMBYTES) +#define KYBER_INDCPA_SECRETKEYBYTES (KYBER_POLYVECBYTES) +#define KYBER_INDCPA_BYTES (KYBER_POLYVECCOMPRESSEDBYTES + KYBER_POLYCOMPRESSEDBYTES) + +#define KYBER_PUBLICKEYBYTES (KYBER_INDCPA_PUBLICKEYBYTES) +/* 32 bytes of additional space to save H(pk) */ +#define KYBER_SECRETKEYBYTES (KYBER_INDCPA_SECRETKEYBYTES + KYBER_INDCPA_PUBLICKEYBYTES + 2*KYBER_SYMBYTES) +#define KYBER_CIPHERTEXTBYTES (KYBER_INDCPA_BYTES) + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c new file mode 100644 index 000000000..9556ee517 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c @@ -0,0 +1,343 @@ +#include +#include "params.h" +#include "poly.h" +#include "ntt.h" +#include "reduce.h" +#include "cbd.h" +#include "symmetric.h" + +/************************************************* +* Name: poly_compress +* +* Description: Compression and subsequent serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (of length KYBER_POLYCOMPRESSEDBYTES) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) +{ + unsigned int i,j; + int16_t u; + uint8_t t[8]; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; + } + + r[0] = t[0] | (t[1] << 4); + r[1] = t[2] | (t[3] << 4); + r[2] = t[4] | (t[5] << 4); + r[3] = t[6] | (t[7] << 4); + r += 4; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + for(i=0;icoeffs[8*i+j]; + u += (u >> 15) & KYBER_Q; + t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; + } + + r[0] = (t[0] >> 0) | (t[1] << 5); + r[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7); + r[2] = (t[3] >> 1) | (t[4] << 4); + r[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6); + r[4] = (t[6] >> 2) | (t[7] << 3); + r += 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_decompress +* +* Description: De-serialization and subsequent decompression of a polynomial; +* approximate inverse of poly_compress +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYCOMPRESSEDBYTES bytes) +**************************************************/ +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]) +{ + unsigned int i; + +#if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[2*i+0] = (((uint16_t)(a[0] & 15)*KYBER_Q) + 8) >> 4; + r->coeffs[2*i+1] = (((uint16_t)(a[0] >> 4)*KYBER_Q) + 8) >> 4; + a += 1; + } +#elif (KYBER_POLYCOMPRESSEDBYTES == 160) + unsigned int j; + uint8_t t[8]; + for(i=0;i> 0); + t[1] = (a[0] >> 5) | (a[1] << 3); + t[2] = (a[1] >> 2); + t[3] = (a[1] >> 7) | (a[2] << 1); + t[4] = (a[2] >> 4) | (a[3] << 4); + t[5] = (a[3] >> 1); + t[6] = (a[3] >> 6) | (a[4] << 2); + t[7] = (a[4] >> 3); + a += 5; + + for(j=0;j<8;j++) + r->coeffs[8*i+j] = ((uint32_t)(t[j] & 31)*KYBER_Q + 16) >> 5; + } +#else +#error "KYBER_POLYCOMPRESSEDBYTES needs to be in {128, 160}" +#endif +} + +/************************************************* +* Name: poly_tobytes +* +* Description: Serialization of a polynomial +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYBYTES bytes) +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a) +{ + unsigned int i; + uint16_t t0, t1; + + for(i=0;icoeffs[2*i]; + t0 += ((int16_t)t0 >> 15) & KYBER_Q; + t1 = a->coeffs[2*i+1]; + t1 += ((int16_t)t1 >> 15) & KYBER_Q; + r[3*i+0] = (t0 >> 0); + r[3*i+1] = (t0 >> 8) | (t1 << 4); + r[3*i+2] = (t1 >> 4); + } +} + +/************************************************* +* Name: poly_frombytes +* +* Description: De-serialization of a polynomial; +* inverse of poly_tobytes +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *a: pointer to input byte array +* (of KYBER_POLYBYTES bytes) +**************************************************/ +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]) +{ + unsigned int i; + for(i=0;icoeffs[2*i] = ((a[3*i+0] >> 0) | ((uint16_t)a[3*i+1] << 8)) & 0xFFF; + r->coeffs[2*i+1] = ((a[3*i+1] >> 4) | ((uint16_t)a[3*i+2] << 4)) & 0xFFF; + } +} + +/************************************************* +* Name: poly_frommsg +* +* Description: Convert 32-byte message to polynomial +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *msg: pointer to input message +**************************************************/ +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) +{ + unsigned int i,j; + int16_t mask; + +#if (KYBER_INDCPA_MSGBYTES != KYBER_N/8) +#error "KYBER_INDCPA_MSGBYTES must be equal to KYBER_N/8 bytes!" +#endif + + for(i=0;i> j)&1); + r->coeffs[8*i+j] = mask & ((KYBER_Q+1)/2); + } + } +} + +/************************************************* +* Name: poly_tomsg +* +* Description: Convert polynomial to 32-byte message +* +* Arguments: - uint8_t *msg: pointer to output message +* - const poly *a: pointer to input polynomial +**************************************************/ +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) +{ + unsigned int i,j; + uint16_t t; + + for(i=0;icoeffs[8*i+j]; + t += ((int16_t)t >> 15) & KYBER_Q; + t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + msg[i] |= t << j; + } + } +} + +/************************************************* +* Name: poly_getnoise_eta1 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA1 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA1*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta1(r, buf); +} + +/************************************************* +* Name: poly_getnoise_eta2 +* +* Description: Sample a polynomial deterministically from a seed and a nonce, +* with output polynomial close to centered binomial distribution +* with parameter KYBER_ETA2 +* +* Arguments: - poly *r: pointer to output polynomial +* - const uint8_t *seed: pointer to input seed +* (of length KYBER_SYMBYTES bytes) +* - uint8_t nonce: one-byte input nonce +**************************************************/ +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t buf[KYBER_ETA2*KYBER_N/4]; + prf(buf, sizeof(buf), seed, nonce); + poly_cbd_eta2(r, buf); +} + + +/************************************************* +* Name: poly_ntt +* +* Description: Computes negacyclic number-theoretic transform (NTT) of +* a polynomial in place; +* inputs assumed to be in normal order, output in bitreversed order +* +* Arguments: - uint16_t *r: pointer to in/output polynomial +**************************************************/ +void poly_ntt(poly *r) +{ + ntt(r->coeffs); + poly_reduce(r); +} + +/************************************************* +* Name: poly_invntt_tomont +* +* Description: Computes inverse of negacyclic number-theoretic transform (NTT) +* of a polynomial in place; +* inputs assumed to be in bitreversed order, output in normal order +* +* Arguments: - uint16_t *a: pointer to in/output polynomial +**************************************************/ +void poly_invntt_tomont(poly *r) +{ + invntt(r->coeffs); +} + +/************************************************* +* Name: poly_basemul_montgomery +* +* Description: Multiplication of two polynomials in NTT domain +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[4*i], &a->coeffs[4*i], &b->coeffs[4*i], zetas[64+i]); + basemul(&r->coeffs[4*i+2], &a->coeffs[4*i+2], &b->coeffs[4*i+2], -zetas[64+i]); + } +} + +/************************************************* +* Name: poly_tomont +* +* Description: Inplace conversion of all coefficients of a polynomial +* from normal domain to Montgomery domain +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_tomont(poly *r) +{ + unsigned int i; + const int16_t f = (1ULL << 32) % KYBER_Q; + for(i=0;icoeffs[i] = montgomery_reduce((int32_t)r->coeffs[i]*f); +} + +/************************************************* +* Name: poly_reduce +* +* Description: Applies Barrett reduction to all coefficients of a polynomial +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - poly *r: pointer to input/output polynomial +**************************************************/ +void poly_reduce(poly *r) +{ + unsigned int i; + for(i=0;icoeffs[i] = barrett_reduce(r->coeffs[i]); +} + +/************************************************* +* Name: poly_add +* +* Description: Add two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_add(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] + b->coeffs[i]; +} + +/************************************************* +* Name: poly_sub +* +* Description: Subtract two polynomials; no modular reduction is performed +* +* Arguments: - poly *r: pointer to output polynomial +* - const poly *a: pointer to first input polynomial +* - const poly *b: pointer to second input polynomial +**************************************************/ +void poly_sub(poly *r, const poly *a, const poly *b) +{ + unsigned int i; + for(i=0;icoeffs[i] = a->coeffs[i] - b->coeffs[i]; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.h new file mode 100644 index 000000000..9a99c7cda --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.h @@ -0,0 +1,53 @@ +#ifndef POLY_H +#define POLY_H + +#include +#include "params.h" + +/* + * Elements of R_q = Z_q[X]/(X^n + 1). Represents polynomial + * coeffs[0] + X*coeffs[1] + X^2*coeffs[2] + ... + X^{n-1}*coeffs[n-1] + */ +typedef struct{ + int16_t coeffs[KYBER_N]; +} poly; + +#define poly_compress KYBER_NAMESPACE(poly_compress) +void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a); +#define poly_decompress KYBER_NAMESPACE(poly_decompress) +void poly_decompress(poly *r, const uint8_t a[KYBER_POLYCOMPRESSEDBYTES]); + +#define poly_tobytes KYBER_NAMESPACE(poly_tobytes) +void poly_tobytes(uint8_t r[KYBER_POLYBYTES], const poly *a); +#define poly_frombytes KYBER_NAMESPACE(poly_frombytes) +void poly_frombytes(poly *r, const uint8_t a[KYBER_POLYBYTES]); + +#define poly_frommsg KYBER_NAMESPACE(poly_frommsg) +void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]); +#define poly_tomsg KYBER_NAMESPACE(poly_tomsg) +void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *r); + +#define poly_getnoise_eta1 KYBER_NAMESPACE(poly_getnoise_eta1) +void poly_getnoise_eta1(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_getnoise_eta2 KYBER_NAMESPACE(poly_getnoise_eta2) +void poly_getnoise_eta2(poly *r, const uint8_t seed[KYBER_SYMBYTES], uint8_t nonce); + +#define poly_ntt KYBER_NAMESPACE(poly_ntt) +void poly_ntt(poly *r); +#define poly_invntt_tomont KYBER_NAMESPACE(poly_invntt_tomont) +void poly_invntt_tomont(poly *r); +#define poly_basemul_montgomery KYBER_NAMESPACE(poly_basemul_montgomery) +void poly_basemul_montgomery(poly *r, const poly *a, const poly *b); +#define poly_tomont KYBER_NAMESPACE(poly_tomont) +void poly_tomont(poly *r); + +#define poly_reduce KYBER_NAMESPACE(poly_reduce) +void poly_reduce(poly *r); + +#define poly_add KYBER_NAMESPACE(poly_add) +void poly_add(poly *r, const poly *a, const poly *b); +#define poly_sub KYBER_NAMESPACE(poly_sub) +void poly_sub(poly *r, const poly *a, const poly *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c new file mode 100644 index 000000000..8420d069c --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c @@ -0,0 +1,233 @@ +#include +#include "params.h" +#include "poly.h" +#include "polyvec.h" + +/************************************************* +* Name: polyvec_compress +* +* Description: Compress and serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECCOMPRESSEDBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;ivec[i].coeffs[8*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; + } + + r[ 0] = (t[0] >> 0); + r[ 1] = (t[0] >> 8) | (t[1] << 3); + r[ 2] = (t[1] >> 5) | (t[2] << 6); + r[ 3] = (t[2] >> 2); + r[ 4] = (t[2] >> 10) | (t[3] << 1); + r[ 5] = (t[3] >> 7) | (t[4] << 4); + r[ 6] = (t[4] >> 4) | (t[5] << 7); + r[ 7] = (t[5] >> 1); + r[ 8] = (t[5] >> 9) | (t[6] << 2); + r[ 9] = (t[6] >> 6) | (t[7] << 5); + r[10] = (t[7] >> 3); + r += 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;ivec[i].coeffs[4*j+k]; + t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; + t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; + } + + r[0] = (t[0] >> 0); + r[1] = (t[0] >> 8) | (t[1] << 2); + r[2] = (t[1] >> 6) | (t[2] << 4); + r[3] = (t[2] >> 4) | (t[3] << 6); + r[4] = (t[3] >> 2); + r += 5; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_decompress +* +* Description: De-serialize and decompress vector of polynomials; +* approximate inverse of polyvec_compress +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const uint8_t *a: pointer to input byte array +* (of length KYBER_POLYVECCOMPRESSEDBYTES) +**************************************************/ +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]) +{ + unsigned int i,j,k; + +#if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) + uint16_t t[8]; + for(i=0;i> 0) | ((uint16_t)a[ 1] << 8); + t[1] = (a[1] >> 3) | ((uint16_t)a[ 2] << 5); + t[2] = (a[2] >> 6) | ((uint16_t)a[ 3] << 2) | ((uint16_t)a[4] << 10); + t[3] = (a[4] >> 1) | ((uint16_t)a[ 5] << 7); + t[4] = (a[5] >> 4) | ((uint16_t)a[ 6] << 4); + t[5] = (a[6] >> 7) | ((uint16_t)a[ 7] << 1) | ((uint16_t)a[8] << 9); + t[6] = (a[8] >> 2) | ((uint16_t)a[ 9] << 6); + t[7] = (a[9] >> 5) | ((uint16_t)a[10] << 3); + a += 11; + + for(k=0;k<8;k++) + r->vec[i].coeffs[8*j+k] = ((uint32_t)(t[k] & 0x7FF)*KYBER_Q + 1024) >> 11; + } + } +#elif (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 320)) + uint16_t t[4]; + for(i=0;i> 0) | ((uint16_t)a[1] << 8); + t[1] = (a[1] >> 2) | ((uint16_t)a[2] << 6); + t[2] = (a[2] >> 4) | ((uint16_t)a[3] << 4); + t[3] = (a[3] >> 6) | ((uint16_t)a[4] << 2); + a += 5; + + for(k=0;k<4;k++) + r->vec[i].coeffs[4*j+k] = ((uint32_t)(t[k] & 0x3FF)*KYBER_Q + 512) >> 10; + } + } +#else +#error "KYBER_POLYVECCOMPRESSEDBYTES needs to be in {320*KYBER_K, 352*KYBER_K}" +#endif +} + +/************************************************* +* Name: polyvec_tobytes +* +* Description: Serialize vector of polynomials +* +* Arguments: - uint8_t *r: pointer to output byte array +* (needs space for KYBER_POLYVECBYTES) +* - const polyvec *a: pointer to input vector of polynomials +**************************************************/ +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_frombytes +* +* Description: De-serialize vector of polynomials; +* inverse of polyvec_tobytes +* +* Arguments: - uint8_t *r: pointer to output byte array +* - const polyvec *a: pointer to input vector of polynomials +* (of length KYBER_POLYVECBYTES) +**************************************************/ +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]) +{ + unsigned int i; + for(i=0;ivec[i], a+i*KYBER_POLYBYTES); +} + +/************************************************* +* Name: polyvec_ntt +* +* Description: Apply forward NTT to all elements of a vector of polynomials +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_ntt(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_invntt_tomont +* +* Description: Apply inverse NTT to all elements of a vector of polynomials +* and multiply by Montgomery factor 2^16 +* +* Arguments: - polyvec *r: pointer to in/output vector of polynomials +**************************************************/ +void polyvec_invntt_tomont(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_basemul_acc_montgomery +* +* Description: Multiply elements of a and b in NTT domain, accumulate into r, +* and multiply by 2^-16. +* +* Arguments: - poly *r: pointer to output polynomial +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + poly t; + + poly_basemul_montgomery(r, &a->vec[0], &b->vec[0]); + for(i=1;ivec[i], &b->vec[i]); + poly_add(r, r, &t); + } + + poly_reduce(r); +} + +/************************************************* +* Name: polyvec_reduce +* +* Description: Applies Barrett reduction to each coefficient +* of each element of a vector of polynomials; +* for details of the Barrett reduction see comments in reduce.c +* +* Arguments: - polyvec *r: pointer to input/output polynomial +**************************************************/ +void polyvec_reduce(polyvec *r) +{ + unsigned int i; + for(i=0;ivec[i]); +} + +/************************************************* +* Name: polyvec_add +* +* Description: Add vectors of polynomials +* +* Arguments: - polyvec *r: pointer to output vector of polynomials +* - const polyvec *a: pointer to first input vector of polynomials +* - const polyvec *b: pointer to second input vector of polynomials +**************************************************/ +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b) +{ + unsigned int i; + for(i=0;ivec[i], &a->vec[i], &b->vec[i]); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.h new file mode 100644 index 000000000..57b605494 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.h @@ -0,0 +1,36 @@ +#ifndef POLYVEC_H +#define POLYVEC_H + +#include +#include "params.h" +#include "poly.h" + +typedef struct{ + poly vec[KYBER_K]; +} polyvec; + +#define polyvec_compress KYBER_NAMESPACE(polyvec_compress) +void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a); +#define polyvec_decompress KYBER_NAMESPACE(polyvec_decompress) +void polyvec_decompress(polyvec *r, const uint8_t a[KYBER_POLYVECCOMPRESSEDBYTES]); + +#define polyvec_tobytes KYBER_NAMESPACE(polyvec_tobytes) +void polyvec_tobytes(uint8_t r[KYBER_POLYVECBYTES], const polyvec *a); +#define polyvec_frombytes KYBER_NAMESPACE(polyvec_frombytes) +void polyvec_frombytes(polyvec *r, const uint8_t a[KYBER_POLYVECBYTES]); + +#define polyvec_ntt KYBER_NAMESPACE(polyvec_ntt) +void polyvec_ntt(polyvec *r); +#define polyvec_invntt_tomont KYBER_NAMESPACE(polyvec_invntt_tomont) +void polyvec_invntt_tomont(polyvec *r); + +#define polyvec_basemul_acc_montgomery KYBER_NAMESPACE(polyvec_basemul_acc_montgomery) +void polyvec_basemul_acc_montgomery(poly *r, const polyvec *a, const polyvec *b); + +#define polyvec_reduce KYBER_NAMESPACE(polyvec_reduce) +void polyvec_reduce(polyvec *r); + +#define polyvec_add KYBER_NAMESPACE(polyvec_add) +void polyvec_add(polyvec *r, const polyvec *a, const polyvec *b); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c new file mode 100644 index 000000000..9d8e7edf8 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c @@ -0,0 +1,42 @@ +#include +#include "params.h" +#include "reduce.h" + +/************************************************* +* Name: montgomery_reduce +* +* Description: Montgomery reduction; given a 32-bit integer a, computes +* 16-bit integer congruent to a * R^-1 mod q, where R=2^16 +* +* Arguments: - int32_t a: input integer to be reduced; +* has to be in {-q2^15,...,q2^15-1} +* +* Returns: integer in {-q+1,...,q-1} congruent to a * R^-1 modulo q. +**************************************************/ +int16_t montgomery_reduce(int32_t a) +{ + int16_t t; + + t = (int16_t)a*QINV; + t = (a - (int32_t)t*KYBER_Q) >> 16; + return t; +} + +/************************************************* +* Name: barrett_reduce +* +* Description: Barrett reduction; given a 16-bit integer a, computes +* centered representative congruent to a mod q in {-(q-1)/2,...,(q-1)/2} +* +* Arguments: - int16_t a: input integer to be reduced +* +* Returns: integer in {-(q-1)/2,...,(q-1)/2} congruent to a modulo q. +**************************************************/ +int16_t barrett_reduce(int16_t a) { + int16_t t; + const int16_t v = ((1<<26) + KYBER_Q/2)/KYBER_Q; + + t = ((int32_t)v*a + (1<<25)) >> 26; + t *= KYBER_Q; + return a - t; +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.h new file mode 100644 index 000000000..c1bc1e4c7 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.h @@ -0,0 +1,16 @@ +#ifndef REDUCE_H +#define REDUCE_H + +#include +#include "params.h" + +#define MONT -1044 // 2^16 mod q +#define QINV -3327 // q^-1 mod 2^16 + +#define montgomery_reduce KYBER_NAMESPACE(montgomery_reduce) +int16_t montgomery_reduce(int32_t a); + +#define barrett_reduce KYBER_NAMESPACE(barrett_reduce) +int16_t barrett_reduce(int16_t a); + +#endif diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c new file mode 100644 index 000000000..20f451882 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "params.h" +#include "symmetric.h" +#include "fips202.h" + +/************************************************* +* Name: kyber_shake128_absorb +* +* Description: Absorb step of the SHAKE128 specialized for the Kyber context. +* +* Arguments: - keccak_state *state: pointer to (uninitialized) output Keccak state +* - const uint8_t *seed: pointer to KYBER_SYMBYTES input to be absorbed into state +* - uint8_t i: additional byte of input +* - uint8_t j: additional byte of input +**************************************************/ +void kyber_shake128_absorb(shake128incctx *state, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y) +{ + uint8_t extseed[KYBER_SYMBYTES+2]; + + memcpy(extseed, seed, KYBER_SYMBYTES); + extseed[KYBER_SYMBYTES+0] = x; + extseed[KYBER_SYMBYTES+1] = y; + + shake128_absorb_once(state, extseed, sizeof(extseed)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce) +{ + uint8_t extkey[KYBER_SYMBYTES+1]; + + memcpy(extkey, key, KYBER_SYMBYTES); + extkey[KYBER_SYMBYTES] = nonce; + + shake256(out, outlen, extkey, sizeof(extkey)); +} + +/************************************************* +* Name: kyber_shake256_prf +* +* Description: Usage of SHAKE256 as a PRF, concatenates secret and public input +* and then generates outlen bytes of SHAKE256 output +* +* Arguments: - uint8_t *out: pointer to output +* - size_t outlen: number of requested output bytes +* - const uint8_t *key: pointer to the key (of length KYBER_SYMBYTES) +* - uint8_t nonce: single-byte nonce (public PRF input) +**************************************************/ +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]) +{ + shake256incctx s; + + shake256_inc_init(&s); + shake256_inc_absorb(&s, key, KYBER_SYMBYTES); + shake256_inc_absorb(&s, input, KYBER_CIPHERTEXTBYTES); + shake256_inc_finalize(&s); + shake256_inc_squeeze(out, KYBER_SSBYTES, &s); + shake256_inc_ctx_release(&s); +} diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric.h b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric.h new file mode 100644 index 000000000..2acc66f98 --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric.h @@ -0,0 +1,35 @@ +#ifndef SYMMETRIC_H +#define SYMMETRIC_H + +#include +#include +#include "params.h" + +#include "fips202.h" + +typedef shake128incctx xof_state; + +#define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) +void kyber_shake128_absorb(shake128incctx *s, + const uint8_t seed[KYBER_SYMBYTES], + uint8_t x, + uint8_t y); + +#define kyber_shake256_prf KYBER_NAMESPACE(kyber_shake256_prf) +void kyber_shake256_prf(uint8_t *out, size_t outlen, const uint8_t key[KYBER_SYMBYTES], uint8_t nonce); + +#define kyber_shake256_rkprf KYBER_NAMESPACE(kyber_shake256_rkprf) +void kyber_shake256_rkprf(uint8_t out[KYBER_SSBYTES], const uint8_t key[KYBER_SYMBYTES], const uint8_t input[KYBER_CIPHERTEXTBYTES]); + +#define XOF_BLOCKBYTES SHAKE128_RATE + +#define hash_h(OUT, IN, INBYTES) sha3_256(OUT, IN, INBYTES) +#define hash_g(OUT, IN, INBYTES) sha3_512(OUT, IN, INBYTES) +#define xof_init(STATE, SEED) shake128_inc_init(STATE) +#define xof_absorb(STATE, SEED, X, Y) kyber_shake128_absorb(STATE, SEED, X, Y) +#define xof_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) +#define xof_release(STATE) shake128_inc_ctx_release(STATE) +#define prf(OUT, OUTBYTES, KEY, NONCE) kyber_shake256_prf(OUT, OUTBYTES, KEY, NONCE) +#define rkprf(OUT, KEY, INPUT) kyber_shake256_rkprf(OUT, KEY, INPUT) + +#endif /* SYMMETRIC_H */ diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c new file mode 100644 index 000000000..ed4a6541f --- /dev/null +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c @@ -0,0 +1,47 @@ +#include +#include +#include "verify.h" + +/************************************************* +* Name: verify +* +* Description: Compare two arrays for equality in constant time. +* +* Arguments: const uint8_t *a: pointer to first byte array +* const uint8_t *b: pointer to second byte array +* size_t len: length of the byte arrays +* +* Returns 0 if the byte arrays are equal, 1 otherwise +**************************************************/ +int verify(const uint8_t *a, const uint8_t *b, size_t len) +{ + size_t i; + uint8_t r = 0; + + for(i=0;i> 63; +} + +/************************************************* +* Name: cmov +* +* Description: Copy len bytes from x to r if b is 1; +* don't modify x if b is 0. Requires b to be in {0,1}; +* assumes two's complement representation of negative integers. +* Runs in constant time. +* +* Arguments: uint8_t *r: pointer to output byte array +* const uint8_t *x: pointer to input byte array +* size_t len: Amount of bytes to be copied +* uint8_t b: Condition bit; has to be in {0,1} +**************************************************/ +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b) +{ + size_t i; + + b = -b; + for(i=0;i +#include +#include "params.h" + +#define verify KYBER_NAMESPACE(verify) +int verify(const uint8_t *a, const uint8_t *b, size_t len); + +#define cmov KYBER_NAMESPACE(cmov) +void cmov(uint8_t *r, const uint8_t *x, size_t len, uint8_t b); + +#endif diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index 82dfc89fd..53754c334 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -109,6 +109,14 @@ #cmakedefine OQS_ENABLE_KEM_kyber_1024_avx2 1 #cmakedefine OQS_ENABLE_KEM_kyber_1024_aarch64 1 +#cmakedefine OQS_ENABLE_KEM_ML_KEM 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_512 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_512_avx2 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_768 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_768_avx2 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_1024 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_1024_avx2 1 + #cmakedefine OQS_ENABLE_SIG_DILITHIUM 1 #cmakedefine OQS_ENABLE_SIG_dilithium_2 1 #cmakedefine OQS_ENABLE_SIG_dilithium_2_avx2 1 diff --git a/tests/KATs/kem/kats.json b/tests/KATs/kem/kats.json index b4ea3ffa2..9652b5ada 100644 --- a/tests/KATs/kem/kats.json +++ b/tests/KATs/kem/kats.json @@ -99,8 +99,17 @@ "all": "b3a12005fe1ce49f5df510aea6a56bfa4bdc2d3d706afb0361d70dc88188a2a6", "single": "89e82a5bf2d4ddb2c6444e10409e6d9ca65dafbca67d1a0db2c9b54920a29172" }, + "ML-KEM-1024-ipd": { + "single": "03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7" + }, + "ML-KEM-512-ipd": { + "single": "76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f" + }, + "ML-KEM-768-ipd": { + "single": "c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310" + } "sntrup761": { "all": "36e1e53d4e6e295e8fb804449958ad9a3719aa350e91933c65791b9117382d57", "single": "afc42c3a5b10f4ef69654250097ebda9b9564570f4086744b24a6daf2bd1f89a" } -} \ No newline at end of file +} diff --git a/tests/vector_test.sh b/tests/vector_test.sh index 82aa91cfc..25d5e0d50 100755 --- a/tests/vector_test.sh +++ b/tests/vector_test.sh @@ -37,32 +37,32 @@ if [ $? != 0 ]; then exit 1 fi -#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt -#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt -#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt -#scheme_name=Kyber512 -# -#sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" -#if [ $? != 0 ]; then -# exit 1 -#fi -# -#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt -#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt -#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt -#scheme_name=Kyber768 -# -#sh ./vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" -#if [ $? != 0 ]; then -# exit 1 -#fi -# -#file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt -#file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt -#file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt -#scheme_name=Kyber1024 -# -#sh ./vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" -#if [ $? != 0 ]; then -# exit 1 -#fi \ No newline at end of file +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt +file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt +file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt +scheme_name=ML-KEM-512-ipd + +sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi + +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt +file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt +file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt +scheme_name=ML-KEM-768-ipd + +sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi + +file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt +file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt +file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt +scheme_name=ML-KEM-1024-ipd + +sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +if [ $? != 0 ]; then + exit 1 +fi \ No newline at end of file diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index 7c6b6350b..d2214a88d 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -78,10 +78,10 @@ static inline uint16_t UINT16_TO_BE(const uint16_t x) { } /* HQC-specific functions */ -static inline bool is_kyber(const char *method_name) { - return (0 == strcmp(method_name, OQS_KEM_alg_kyber_512)) - || (0 == strcmp(method_name, OQS_KEM_alg_kyber_768)) - || (0 == strcmp(method_name, OQS_KEM_alg_kyber_1024)); +static inline bool is_ml_kem(const char *method_name) { + return (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_768)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024)); } static void MLKEM_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { @@ -126,7 +126,7 @@ OQS_STATUS kem_vector(const char *method_name, goto algo_not_enabled; } - if (is_kyber(method_name)) { + if (is_ml_kem(method_name)) { OQS_randombytes_custom_algorithm(&MLKEM_randombytes); randombytes_init = &MLKEM_randombytes_init; randombytes_free = &MLKEM_randombytes_free; diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index 180d3d642..855367e85 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -84,13 +84,6 @@ static inline bool is_ml_dsa(const char *method_name) { || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_87)); } -//const uint8_t mldsa_44_stream[] = { -// // seed for keygen -// 0x6C, 0xAE, 0x2E, 0x9C, 0x2C, 0xF6, 0x4D, 0x26, 0x86, 0xC3, 0x1C, 0x21, 0x18, 0xE0, 0xF2, 0x4A, 0x47, 0xDD, 0x46, 0xDB, 0x85, 0x59, 0x09, 0x10, 0xAA, 0xC9, 0xDF, 0x4C, 0x1B, 0x85, 0x4E, 0x44, -// // deterministic signing -// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -//}; - static void MLDSA_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { (void) personalization_string; prng_state.pos = entropy_input; From bcb7c735483feede85ba8eff33510b4a5c3b86a0 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 13 Dec 2023 16:02:57 +0100 Subject: [PATCH 03/27] update patches --- README.md | 2 + docs/algorithms/kem/ml_kem.md | 57 +++ docs/algorithms/kem/ml_kem.yml | 128 +++++ docs/algorithms/sig/ml_dsa.md | 57 +++ docs/algorithms/sig/ml_dsa.yml | 120 +++++ docs/cbom.json | 350 ++++++++++++- .../copy_from_upstream/copy_from_upstream.yml | 16 +- ...ls-dilithium-standard-avx2-shake-aes.patch | 256 ---------- ...als-dilithium-standard-ref-shake-aes.patch | 231 --------- .../pqcrystals-dilithium-standard-yml.patch | 69 --- ...ystals-kyber-standard-avx2-shake-aes.patch | 160 ------ ...rystals-kyber-standard-ref-shake-aes.patch | 80 --- .../pqcrystals-kyber-standard-yml.patch | 69 --- .../patches/pqcrystals-kyber-yml.patch | 69 --- ...diff.patch => pqcrystals-ml_dsa_ipd.patch} | 482 +++++++++++++++--- ...diff.patch => pqcrystals-ml_kem_ipd.patch} | 105 +++- 16 files changed, 1202 insertions(+), 1049 deletions(-) create mode 100644 docs/algorithms/kem/ml_kem.md create mode 100644 docs/algorithms/kem/ml_kem.yml create mode 100644 docs/algorithms/sig/ml_dsa.md create mode 100644 docs/algorithms/sig/ml_dsa.yml delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-avx2-shake-aes.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-yml.patch delete mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-yml.patch rename scripts/copy_from_upstream/patches/{pqcrystals-dilithium-standard-alldiff.patch => pqcrystals-ml_dsa_ipd.patch} (66%) rename scripts/copy_from_upstream/patches/{pqcrystals-kyber-standard-alldiff.patch => pqcrystals-ml_kem_ipd.patch} (82%) diff --git a/README.md b/README.md index 69edc15e6..80a401e6f 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The list below indicates all algorithms supported by liboqs, but not all those a - **FrodoKEM**: FrodoKEM-640-AES, FrodoKEM-640-SHAKE, FrodoKEM-976-AES, FrodoKEM-976-SHAKE, FrodoKEM-1344-AES, FrodoKEM-1344-SHAKE - **HQC**: HQC-128, HQC-192, HQC-256 - **Kyber**: Kyber512, Kyber768, Kyber1024 +- **ML-KEM**: ML-KEM-512-ipd, ML-KEM-768-ipd, ML-KEM-1024-ipd - **NTRU-Prime**: sntrup761 @@ -54,6 +55,7 @@ The list below indicates all algorithms supported by liboqs, but not all those a - **CRYSTALS-Dilithium**: Dilithium2, Dilithium3, Dilithium5 - **Falcon**: Falcon-512, Falcon-1024 +- **ML-DSA**: ML-DSA-44-ipd, ML-DSA-65-ipd, ML-DSA-87-ipd - **SPHINCS+-SHA2**: SPHINCS+-SHA2-128f-simple, SPHINCS+-SHA2-128s-simple, SPHINCS+-SHA2-192f-simple, SPHINCS+-SHA2-192s-simple, SPHINCS+-SHA2-256f-simple, SPHINCS+-SHA2-256s-simple - **SPHINCS+-SHAKE**: SPHINCS+-SHAKE-128f-simple, SPHINCS+-SHAKE-128s-simple, SPHINCS+-SHAKE-192f-simple, SPHINCS+-SHAKE-192s-simple, SPHINCS+-SHAKE-256f-simple, SPHINCS+-SHAKE-256s-simple diff --git a/docs/algorithms/kem/ml_kem.md b/docs/algorithms/kem/ml_kem.md new file mode 100644 index 000000000..47d766c36 --- /dev/null +++ b/docs/algorithms/kem/ml_kem.md @@ -0,0 +1,57 @@ +# ML-KEM + +- **Algorithm type**: Key encapsulation mechanism. +- **Main cryptographic assumption**: Module LWE+R with base ring Z[x]/(3329, x^256+1). +- **Principal submitters**: Peter Schwabe. +- **Auxiliary submitters**: Roberto Avanzi, Joppe Bos, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Vadim Lyubashevsky, John M. Schanck, Gregor Seiler, Damien Stehlé. +- **Authors' website**: https://pq-crystals.org/ +- **Specification version**: pq-crystals 20230726. +- **Primary Source**: + - **Source**: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 with copy_from_upstream patches + - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 +- **Optimized Implementation sources**: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 with copy_from_upstream patches + - **oldpqclean-aarch64**: + - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches + - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT + + +## Parameter set summary + +| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| ML-KEM-512-ipd | IND-CCA2 | 1 | 800 | 1632 | 768 | 32 | +| ML-KEM-768-ipd | IND-CCA2 | 3 | 1184 | 2400 | 1088 | 32 | +| ML-KEM-1024-ipd | IND-CCA2 | 5 | 1568 | 3168 | 1568 | 32 | + +## ML-KEM-512-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage?‡ | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:----------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Linux,Darwin | AVX2,BMI2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + + ‡For an explanation of what this denotes, consult the [Explanation of Terms](#explanation-of-terms) section at the end of this file. + +## ML-KEM-768-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage? | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:---------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Linux,Darwin | AVX2,BMI2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + +## ML-KEM-1024-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage? | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:---------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Linux,Darwin | AVX2,BMI2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + +## Explanation of Terms + +- **Large Stack Usage**: Implementations identified as having such may cause failures when running in threads or in constrained environments. \ No newline at end of file diff --git a/docs/algorithms/kem/ml_kem.yml b/docs/algorithms/kem/ml_kem.yml new file mode 100644 index 000000000..752f7fe66 --- /dev/null +++ b/docs/algorithms/kem/ml_kem.yml @@ -0,0 +1,128 @@ +name: ML-KEM +type: kem +principal-submitters: +- Peter Schwabe +auxiliary-submitters: +- Roberto Avanzi +- Joppe Bos +- Léo Ducas +- Eike Kiltz +- Tancrède Lepoint +- Vadim Lyubashevsky +- John M. Schanck +- Gregor Seiler +- Damien Stehlé +crypto-assumption: Module LWE+R with base ring Z[x]/(3329, x^256+1) +website: https://pq-crystals.org/ +nist-round: ipd +spec-version: pq-crystals 20230726 +primary-upstream: + source: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 + with copy_from_upstream patches + spdx-license-identifier: CC0-1.0 or Apache-2.0 +optimized-upstreams: + oldpqclean-aarch64: + source: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a + with copy_from_upstream patches + spdx-license-identifier: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) + and MIT +parameter-sets: +- name: ML-KEM-512-ipd + claimed-nist-level: 1 + claimed-security: IND-CCA2 + length-public-key: 800 + length-ciphertext: 768 + length-secret-key: 1632 + length-shared-secret: 32 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 + - bmi2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false +- name: ML-KEM-768-ipd + claimed-nist-level: 3 + claimed-security: IND-CCA2 + length-public-key: 1184 + length-ciphertext: 1088 + length-secret-key: 2400 + length-shared-secret: 32 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 + - bmi2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false +- name: ML-KEM-1024-ipd + claimed-nist-level: 5 + claimed-security: IND-CCA2 + length-public-key: 1568 + length-ciphertext: 1568 + length-secret-key: 3168 + length-shared-secret: 32 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Linux + - Darwin + required_flags: + - avx2 + - bmi2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false diff --git a/docs/algorithms/sig/ml_dsa.md b/docs/algorithms/sig/ml_dsa.md new file mode 100644 index 000000000..872408e87 --- /dev/null +++ b/docs/algorithms/sig/ml_dsa.md @@ -0,0 +1,57 @@ +# ML-DSA + +- **Algorithm type**: Digital signature scheme. +- **Main cryptographic assumption**: hardness of lattice problems over module lattices. +- **Principal submitters**: Vadim Lyubashevsky. +- **Auxiliary submitters**: Shi Bai, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Peter Schwabe, Gregor Seiler, Damien Stehlé. +- **Authors' website**: https://pq-crystals.org/dilithium/ +- **Specification version**: pq-crystals 20230825. +- **Primary Source**: + - **Source**: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f with copy_from_upstream patches + - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 +- **Optimized Implementation sources**: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f with copy_from_upstream patches + - **oldpqclean-aarch64**: + - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches + - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT + + +## Parameter set summary + +| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | +|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| +| ML-DSA-44-ipd | EUF-CMA | 2 | 1312 | 2560 | 2420 | +| ML-DSA-65-ipd | EUF-CMA | 3 | 1952 | 4032 | 3309 | +| ML-DSA-87-ipd | EUF-CMA | 5 | 2592 | 4896 | 4627 | + +## ML-DSA-44-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage?‡ | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:----------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Darwin,Linux | AVX2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + + ‡For an explanation of what this denotes, consult the [Explanation of Terms](#explanation-of-terms) section at the end of this file. + +## ML-DSA-65-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage? | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:---------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Darwin,Linux | AVX2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + +## ML-DSA-87-ipd implementation characteristics + +| Implementation source | Identifier in upstream | Supported architecture(s) | Supported operating system(s) | CPU extension(s) used | No branching-on-secrets claimed? | No branching-on-secrets checked by valgrind? | Large stack usage? | +|:---------------------------------:|:-------------------------|:----------------------------|:--------------------------------|:------------------------|:-----------------------------------|:-----------------------------------------------|:---------------------| +| [Primary Source](#primary-source) | ref | All | All | None | True | True | False | +| [Primary Source](#primary-source) | avx2 | x86\_64 | Darwin,Linux | AVX2,POPCNT | True | True | False | + +Are implementations chosen based on runtime CPU feature detection? **Yes**. + +## Explanation of Terms + +- **Large Stack Usage**: Implementations identified as having such may cause failures when running in threads or in constrained environments. \ No newline at end of file diff --git a/docs/algorithms/sig/ml_dsa.yml b/docs/algorithms/sig/ml_dsa.yml new file mode 100644 index 000000000..f0302cc10 --- /dev/null +++ b/docs/algorithms/sig/ml_dsa.yml @@ -0,0 +1,120 @@ +name: ML-DSA +type: signature +principal-submitters: +- Vadim Lyubashevsky +auxiliary-submitters: +- Shi Bai +- Léo Ducas +- Eike Kiltz +- Tancrède Lepoint +- Peter Schwabe +- Gregor Seiler +- Damien Stehlé +crypto-assumption: hardness of lattice problems over module lattices +website: https://pq-crystals.org/dilithium/ +nist-round: ipd +spec-version: pq-crystals 20230825 +primary-upstream: + source: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f + with copy_from_upstream patches + spdx-license-identifier: CC0-1.0 or Apache-2.0 +optimized-upstreams: + oldpqclean-aarch64: + source: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a + with copy_from_upstream patches + spdx-license-identifier: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) + and MIT +parameter-sets: +- name: ML-DSA-44-ipd + claimed-nist-level: 2 + claimed-security: EUF-CMA + length-public-key: 1312 + length-secret-key: 2560 + length-signature: 2420 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Darwin + - Linux + required_flags: + - avx2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false +- name: ML-DSA-65-ipd + claimed-nist-level: 3 + claimed-security: EUF-CMA + length-public-key: 1952 + length-secret-key: 4032 + length-signature: 3309 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Darwin + - Linux + required_flags: + - avx2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false +- name: ML-DSA-87-ipd + claimed-nist-level: 5 + claimed-security: EUF-CMA + length-public-key: 2592 + length-secret-key: 4896 + length-signature: 4627 + implementations-switch-on-runtime-cpu-features: true + implementations: + - upstream: primary-upstream + upstream-id: ref + supported-platforms: all + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false + - upstream: primary-upstream + upstream-id: avx2 + supported-platforms: + - architecture: x86_64 + operating_systems: + - Darwin + - Linux + required_flags: + - avx2 + - popcnt + common-crypto: + - SHA3: liboqs + no-secret-dependent-branching-claimed: true + no-secret-dependent-branching-checked-by-valgrind: true + large-stack-usage: false diff --git a/docs/cbom.json b/docs/cbom.json index 87a7be322..02d2d59ca 100644 --- a/docs/cbom.json +++ b/docs/cbom.json @@ -1,23 +1,23 @@ { "bomFormat": "CBOM", "specVersion": "1.4-cbom-1.0", - "serialNumber": "urn:uuid:043e6cd4-f2a6-4828-ae97-7cbdbd372414", + "serialNumber": "urn:uuid:c25dad99-ad00-48b6-aa9e-25d4f7c3c8c5", "version": 1, "metadata": { - "timestamp": "2023-10-19T08:58:49.361520", + "timestamp": "2023-12-13T17:05:36.137517", "component": { "type": "library", - "bom-ref": "pkg:github/open-quantum-safe/liboqs@4846f81a98232e6c90f08578e8f122146550be8d", + "bom-ref": "pkg:github/open-quantum-safe/liboqs@5f83324a6c464448b70b1e57b3cd161b6832e0e0", "name": "liboqs", - "version": "4846f81a98232e6c90f08578e8f122146550be8d" + "version": "5f83324a6c464448b70b1e57b3cd161b6832e0e0" } }, "components": [ { "type": "library", - "bom-ref": "pkg:github/open-quantum-safe/liboqs@4846f81a98232e6c90f08578e8f122146550be8d", + "bom-ref": "pkg:github/open-quantum-safe/liboqs@5f83324a6c464448b70b1e57b3cd161b6832e0e0", "name": "liboqs", - "version": "4846f81a98232e6c90f08578e8f122146550be8d" + "version": "5f83324a6c464448b70b1e57b3cd161b6832e0e0" }, { "type": "crypto-asset", @@ -959,6 +959,126 @@ "nistQuantumSecurityLevel": 5 } }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-512-ipd:generic", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-512-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 1 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-512-ipd:x86_64", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-512-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 1 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-768-ipd:generic", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-768-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 3 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-768-ipd:x86_64", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-768-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 3 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-1024-ipd:generic", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-1024-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 5 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-KEM-1024-ipd:x86_64", + "name": "ML-KEM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-KEM-1024-ipd", + "primitive": "kem", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "encapsulate", + "decapsulate" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 5 + } + }, { "type": "crypto-asset", "bom-ref": "alg:sntrup761:generic", @@ -1299,6 +1419,126 @@ "nistQuantumSecurityLevel": 5 } }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-44-ipd:generic", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-44-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 2 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-44-ipd:x86_64", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-44-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 2 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-65-ipd:generic", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-65-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 3 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-65-ipd:x86_64", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-65-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 3 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-87-ipd:generic", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-87-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "generic" + }, + "nistQuantumSecurityLevel": 5 + } + }, + { + "type": "crypto-asset", + "bom-ref": "alg:ML-DSA-87-ipd:x86_64", + "name": "ML-DSA", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "variant": "ML-DSA-87-ipd", + "primitive": "signature", + "implementationLevel": "softwarePlainRam", + "cryptoFunctions": [ + "keygen", + "sign", + "verify" + ], + "implementationPlatform": "x86_64" + }, + "nistQuantumSecurityLevel": 5 + } + }, { "type": "crypto-asset", "bom-ref": "alg:SPHINCS+-SHA2-128f-simple:generic", @@ -1808,7 +2048,7 @@ ], "dependencies": [ { - "ref": "pkg:github/open-quantum-safe/liboqs@4846f81a98232e6c90f08578e8f122146550be8d", + "ref": "pkg:github/open-quantum-safe/liboqs@5f83324a6c464448b70b1e57b3cd161b6832e0e0", "dependsOn": [ "alg:BIKE-L1:x86_64", "alg:BIKE-L3:x86_64", @@ -1857,6 +2097,12 @@ "alg:Kyber1024:generic", "alg:Kyber1024:x86_64", "alg:Kyber1024:armv8-a", + "alg:ML-KEM-512-ipd:generic", + "alg:ML-KEM-512-ipd:x86_64", + "alg:ML-KEM-768-ipd:generic", + "alg:ML-KEM-768-ipd:x86_64", + "alg:ML-KEM-1024-ipd:generic", + "alg:ML-KEM-1024-ipd:x86_64", "alg:sntrup761:generic", "alg:sntrup761:x86_64", "alg:Dilithium2:generic", @@ -1874,6 +2120,12 @@ "alg:Falcon-1024:generic", "alg:Falcon-1024:x86_64", "alg:Falcon-1024:armv8-a", + "alg:ML-DSA-44-ipd:generic", + "alg:ML-DSA-44-ipd:x86_64", + "alg:ML-DSA-65-ipd:generic", + "alg:ML-DSA-65-ipd:x86_64", + "alg:ML-DSA-87-ipd:generic", + "alg:ML-DSA-87-ipd:x86_64", "alg:SPHINCS+-SHA2-128f-simple:generic", "alg:SPHINCS+-SHA2-128f-simple:x86_64", "alg:SPHINCS+-SHA2-128s-simple:generic", @@ -2262,6 +2514,48 @@ ], "dependencyType": "uses" }, + { + "ref": "alg:ML-KEM-512-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-KEM-512-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-KEM-768-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-KEM-768-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-KEM-1024-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-KEM-1024-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, { "ref": "alg:sntrup761:generic", "dependsOn": [ @@ -2381,6 +2675,48 @@ ], "dependencyType": "uses" }, + { + "ref": "alg:ML-DSA-44-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-DSA-44-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-DSA-65-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-DSA-65-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-DSA-87-ipd:generic", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, + { + "ref": "alg:ML-DSA-87-ipd:x86_64", + "dependsOn": [ + "alg:sha3" + ], + "dependencyType": "uses" + }, { "ref": "alg:SPHINCS+-SHAKE-128f-simple:generic", "dependsOn": [ diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index 4d465ade0..4f07dd58f 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -31,12 +31,12 @@ upstreams: patches: [pqcrystals-kyber-yml.patch, pqcrystals-kyber-ref-shake-aes.patch, pqcrystals-kyber-avx2-shake-aes.patch] - name: pqcrystals-kyber-standard - git_url: https://github.com/bhess/kyber.git - git_branch: bhe-ymlupd - git_commit: 0bf4adf5a0a93d7ff51b89fac228d0f65e148fea + git_url: https://github.com/pq-crystals/kyber.git + git_branch: standard + git_commit: bc8e640727b5178eb1c65867d6ba6599b3ad88e5 kem_meta_path: '{pretty_name_full}_META.yml' kem_scheme_path: '.' - patches: [pqcrystals-kyber-standard-alldiff.patch] + patches: [pqcrystals-ml_kem_ipd.patch] #patches: [pqcrystals-kyber-standard-yml.patch, pqcrystals-kyber-standard-ref-shake-aes.patch, pqcrystals-kyber-standard-avx2-shake-aes.patch] - name: pqcrystals-dilithium @@ -48,12 +48,12 @@ upstreams: patches: [pqcrystals-dilithium-yml.patch, pqcrystals-dilithium-ref-shake-aes.patch, pqcrystals-dilithium-avx2-shake-aes.patch] - name: pqcrystals-dilithium-standard - git_url: https://github.com/bhess/dilithium.git - git_branch: bhe-standard-fixes - git_commit: 588562ac2cc777dfa407e34532d945b5f06b8ffd + git_url: https://github.com/pq-crystals/dilithium.git + git_branch: standard + git_commit: 918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f sig_meta_path: '{pretty_name_full}_META.yml' sig_scheme_path: '.' - patches: [pqcrystals-dilithium-standard-alldiff.patch] + patches: [pqcrystals-ml_dsa_ipd.patch] #patches: [pqcrystals-dilithium-standard-yml.patch, pqcrystals-dilithium-standard-ref-shake-aes.patch, pqcrystals-dilithium-standard-avx2-shake-aes.patch] kems: - diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch deleted file mode 100644 index 0d7b3fd03..000000000 --- a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-avx2-shake-aes.patch +++ /dev/null @@ -1,256 +0,0 @@ -diff --git a/avx2/poly.c b/avx2/poly.c -index c1b21c1..25d3682 100644 ---- a/avx2/poly.c -+++ b/avx2/poly.c -@@ -401,6 +401,7 @@ void poly_uniform(poly *a, const uint8_t seed[SEEDBYTES], uint16_t nonce) - stream128_state state; - stream128_init(&state, seed, nonce); - poly_uniform_preinit(a, &state); -+ stream128_release(&state); - } - - void poly_uniform_4x(poly *a0, -@@ -415,7 +416,7 @@ void poly_uniform_4x(poly *a0, - { - unsigned int ctr0, ctr1, ctr2, ctr3; - ALIGNED_UINT8(REJ_UNIFORM_BUFLEN+8) buf[4]; -- keccakx4_state state; -+ shake128x4incctx state; - __m256i f; - - f = _mm256_loadu_si256((__m256i *)seed); -@@ -433,6 +434,7 @@ void poly_uniform_4x(poly *a0, - buf[3].coeffs[SEEDBYTES+0] = nonce3; - buf[3].coeffs[SEEDBYTES+1] = nonce3 >> 8; - -+ shake128x4_inc_init(&state); - shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, SEEDBYTES + 2); - shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_NBLOCKS, &state); - -@@ -449,6 +451,7 @@ void poly_uniform_4x(poly *a0, - ctr2 += rej_uniform(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE128_RATE); - ctr3 += rej_uniform(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE128_RATE); - } -+ shake128x4_inc_ctx_release(&state); - } - - /************************************************* -@@ -530,6 +533,7 @@ void poly_uniform_eta(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) - stream256_state state; - stream256_init(&state, seed, nonce); - poly_uniform_eta_preinit(a, &state); -+ stream256_release(&state); - } - - void poly_uniform_eta_4x(poly *a0, -@@ -546,7 +550,7 @@ void poly_uniform_eta_4x(poly *a0, - ALIGNED_UINT8(REJ_UNIFORM_ETA_BUFLEN) buf[4]; - - __m256i f; -- keccakx4_state state; -+ shake256x4incctx state; - - f = _mm256_loadu_si256((__m256i *)&seed[0]); - _mm256_store_si256(&buf[0].vec[0],f); -@@ -568,6 +572,7 @@ void poly_uniform_eta_4x(poly *a0, - buf[3].coeffs[64] = nonce3; - buf[3].coeffs[65] = nonce3 >> 8; - -+ shake256x4_inc_init(&state); - shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); - shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_ETA_NBLOCKS, &state); - -@@ -584,6 +589,7 @@ void poly_uniform_eta_4x(poly *a0, - ctr2 += rej_eta(a2->coeffs + ctr2, N - ctr2, buf[2].coeffs, SHAKE256_RATE); - ctr3 += rej_eta(a3->coeffs + ctr3, N - ctr3, buf[3].coeffs, SHAKE256_RATE); - } -+ shake256x4_inc_ctx_release(&state); - } - - /************************************************* -@@ -611,6 +617,7 @@ void poly_uniform_gamma1(poly *a, const uint8_t seed[CRHBYTES], uint16_t nonce) - stream256_state state; - stream256_init(&state, seed, nonce); - poly_uniform_gamma1_preinit(a, &state); -+ stream256_release(&state); - } - - void poly_uniform_gamma1_4x(poly *a0, -@@ -624,7 +631,7 @@ void poly_uniform_gamma1_4x(poly *a0, - uint16_t nonce3) - { - ALIGNED_UINT8(POLY_UNIFORM_GAMMA1_NBLOCKS*STREAM256_BLOCKBYTES+14) buf[4]; -- keccakx4_state state; -+ shake256x4incctx state; - __m256i f; - - f = _mm256_loadu_si256((__m256i *)&seed[0]); -@@ -647,8 +654,10 @@ void poly_uniform_gamma1_4x(poly *a0, - buf[3].coeffs[64] = nonce3; - buf[3].coeffs[65] = nonce3 >> 8; - -+ shake256x4_inc_init(&state); - shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 66); - shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); -+ shake256x4_inc_ctx_release(&state); - - polyz_unpack(a0, buf[0].coeffs); - polyz_unpack(a1, buf[1].coeffs); -@@ -670,12 +679,12 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { - unsigned int i, b, pos; - uint64_t signs; - ALIGNED_UINT8(SHAKE256_RATE) buf; -- keccak_state state; -+ shake256incctx state; - -- shake256_init(&state); -- shake256_absorb(&state, seed, SEEDBYTES); -- shake256_finalize(&state); -- shake256_squeezeblocks(buf.coeffs, 1, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, seed, SEEDBYTES); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(buf.coeffs, SHAKE256_RATE, &state); - - memcpy(&signs, buf.coeffs, 8); - pos = 8; -@@ -695,6 +704,7 @@ void poly_challenge(poly * restrict c, const uint8_t seed[SEEDBYTES]) { - c->coeffs[b] = 1 - 2*(signs & 1); - signs >>= 1; - } -+ shake256_inc_ctx_release(&state); - } - - /************************************************* -diff --git a/avx2/sign.c b/avx2/sign.c -index c8f2398..70599a3 100644 ---- a/avx2/sign.c -+++ b/avx2/sign.c -@@ -161,7 +161,7 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t - polyvecl y; - polyveck w0; - } tmpv; -- keccak_state state; -+ shake256incctx state; - - rho = seedbuf; - tr = rho + SEEDBYTES; -@@ -172,11 +172,11 @@ int crypto_sign_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t - unpack_sk(rho, tr, key, &t0, &s1, &s2, sk); - - /* Compute CRH(tr, msg) */ -- shake256_init(&state); -- shake256_absorb(&state, tr, TRBYTES); -- shake256_absorb(&state, m, mlen); -- shake256_finalize(&state); -- shake256_squeeze(mu, CRHBYTES, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, tr, TRBYTES); -+ shake256_inc_absorb(&state, m, mlen); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(mu, CRHBYTES, &state); - - #ifdef DILITHIUM_RANDOMIZED_SIGNING - randombytes(rnd, RNDBYTES); -@@ -223,11 +223,11 @@ rej: - polyveck_decompose(&w1, &tmpv.w0, &w1); - polyveck_pack_w1(sig, &w1); - -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); -- shake256_finalize(&state); -- shake256_squeeze(sig, CTILDEBYTES, &state); -+ shake256_inc_ctx_reset(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(sig, CTILDEBYTES, &state); - poly_challenge(&c, sig); - poly_ntt(&c); - -@@ -272,6 +272,7 @@ rej: - hint[OMEGA + i] = pos = pos + n; - } - -+ shake256_inc_ctx_release(&state); - /* Pack z into signature */ - for(i = 0; i < L; i++) - polyz_pack(sig + CTILDEBYTES + i*POLYZ_PACKEDBYTES, &z.vec[i]); -@@ -329,18 +330,19 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size - polyvecl *row = rowbuf; - polyvecl z; - poly c, w1, h; -- keccak_state state; -+ shake256incctx state; - - if(siglen != CRYPTO_BYTES) - return -1; - - /* Compute CRH(H(rho, t1), msg) */ - shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, m, mlen); -- shake256_finalize(&state); -- shake256_squeeze(mu, CRHBYTES, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, m, mlen); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(mu, CRHBYTES, &state); -+ shake256_inc_ctx_release(&state); - - /* Expand challenge */ - poly_challenge(&c, sig); -@@ -390,11 +392,12 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size - if(hint[j]) return -1; - - /* Call random oracle and verify challenge */ -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); -- shake256_finalize(&state); -- shake256_squeeze(buf.coeffs, CTILDEBYTES, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, buf.coeffs, K*POLYW1_PACKEDBYTES); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(buf.coeffs, CTILDEBYTES, &state); -+ shake256_inc_ctx_release(&state); - for(i = 0; i < CTILDEBYTES; ++i) - if(buf.coeffs[i] != sig[i]) - return -1; -diff --git a/avx2/symmetric.h b/avx2/symmetric.h -index 8f3c3c5..fa49963 100644 ---- a/avx2/symmetric.h -+++ b/avx2/symmetric.h -@@ -6,21 +6,23 @@ - - #include "fips202.h" - --typedef keccak_state stream128_state; --typedef keccak_state stream256_state; -+typedef shake128incctx stream128_state; -+typedef shake256incctx stream256_state; - - #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) --void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); -+void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce); - - #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) --void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce); -+void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce); - - #define STREAM128_BLOCKBYTES SHAKE128_RATE - #define STREAM256_BLOCKBYTES SHAKE256_RATE - - #define stream128_init(STATE, SEED, NONCE) dilithium_shake128_stream_init(STATE, SEED, NONCE) - #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) -+#define stream128_release(STATE) shake128_inc_ctx_release(STATE) - #define stream256_init(STATE, SEED, NONCE) dilithium_shake256_stream_init(STATE, SEED, NONCE) - #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) -+#define stream256_release(STATE) shake256_inc_ctx_release(STATE) - - #endif - \ No newline at end of file diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch deleted file mode 100644 index ae0c75c3b..000000000 --- a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-ref-shake-aes.patch +++ /dev/null @@ -1,231 +0,0 @@ -diff --git a/ref/poly.c b/ref/poly.c -index 054ed98..d44063f 100644 ---- a/ref/poly.c -+++ b/ref/poly.c -@@ -365,6 +365,7 @@ void poly_uniform(poly *a, - buflen = STREAM128_BLOCKBYTES + off; - ctr += rej_uniform(a->coeffs + ctr, N - ctr, buf, buflen); - } -+ stream128_release(&state); - } - - /************************************************* -@@ -450,6 +451,7 @@ void poly_uniform_eta(poly *a, - stream256_squeezeblocks(buf, 1, &state); - ctr += rej_eta(a->coeffs + ctr, N - ctr, buf, STREAM256_BLOCKBYTES); - } -+ stream256_release(&state); - } - - /************************************************* -@@ -473,6 +475,7 @@ void poly_uniform_gamma1(poly *a, - - stream256_init(&state, seed, nonce); - stream256_squeezeblocks(buf, POLY_UNIFORM_GAMMA1_NBLOCKS, &state); -+ stream256_release(&state); - polyz_unpack(a, buf); - } - -@@ -490,11 +493,11 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { - unsigned int i, b, pos; - uint64_t signs; - uint8_t buf[SHAKE256_RATE]; -- keccak_state state; -+ shake256incctx state; - -- shake256_init(&state); -- shake256_absorb(&state, seed, SEEDBYTES); -- shake256_finalize(&state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, seed, SEEDBYTES); -+ shake256_inc_finalize(&state); - shake256_squeezeblocks(buf, 1, &state); - - signs = 0; -@@ -518,6 +521,7 @@ void poly_challenge(poly *c, const uint8_t seed[SEEDBYTES]) { - c->coeffs[b] = 1 - 2*(signs & 1); - signs >>= 1; - } -+ shake256_inc_ctx_release(&state); - } - - /************************************************* -diff --git a/ref/sign.c b/ref/sign.c -index d25a399..5f57036 100644 ---- a/ref/sign.c -+++ b/ref/sign.c -@@ -90,7 +90,7 @@ int crypto_sign_signature(uint8_t *sig, - polyvecl mat[K], s1, y, z; - polyveck t0, s2, w1, w0, h; - poly cp; -- keccak_state state; -+ shake256incctx state; - - rho = seedbuf; - tr = rho + SEEDBYTES; -@@ -102,11 +102,11 @@ int crypto_sign_signature(uint8_t *sig, - - - /* Compute mu = CRH(tr, msg) */ -- shake256_init(&state); -- shake256_absorb(&state, tr, TRBYTES); -- shake256_absorb(&state, m, mlen); -- shake256_finalize(&state); -- shake256_squeeze(mu, CRHBYTES, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, tr, TRBYTES); -+ shake256_inc_absorb(&state, m, mlen); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(mu, CRHBYTES, &state); - - #ifdef DILITHIUM_RANDOMIZED_SIGNING - randombytes(rnd, RNDBYTES); -@@ -138,11 +138,11 @@ rej: - polyveck_decompose(&w1, &w0, &w1); - polyveck_pack_w1(sig, &w1); - -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, sig, K*POLYW1_PACKEDBYTES); -- shake256_finalize(&state); -- shake256_squeeze(sig, CTILDEBYTES, &state); -+ shake256_inc_ctx_reset(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, sig, K*POLYW1_PACKEDBYTES); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(sig, CTILDEBYTES, &state); - poly_challenge(&cp, sig); /* uses only the first SEEDBYTES bytes of sig */ - poly_ntt(&cp); - -@@ -175,6 +175,8 @@ rej: - if(n > OMEGA) - goto rej; - -+ shake256_inc_ctx_release(&state); -+ - /* Write signature */ - pack_sig(sig, sig, &z, &h); - *siglen = CRYPTO_BYTES; -@@ -240,7 +242,7 @@ int crypto_sign_verify(const uint8_t *sig, - poly cp; - polyvecl mat[K], z; - polyveck t1, w1, h; -- keccak_state state; -+ shake256incctx state; - - if(siglen != CRYPTO_BYTES) - return -1; -@@ -253,11 +255,11 @@ int crypto_sign_verify(const uint8_t *sig, - - /* Compute CRH(H(rho, t1), msg) */ - shake256(mu, CRHBYTES, pk, CRYPTO_PUBLICKEYBYTES); -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, m, mlen); -- shake256_finalize(&state); -- shake256_squeeze(mu, CRHBYTES, &state); -+ shake256_inc_init(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, m, mlen); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(mu, CRHBYTES, &state); - - /* Matrix-vector multiplication; compute Az - c2^dt1 */ - poly_challenge(&cp, c); /* uses only the first SEEDBYTES bytes of c */ -@@ -281,11 +283,12 @@ int crypto_sign_verify(const uint8_t *sig, - polyveck_pack_w1(buf, &w1); - - /* Call random oracle and verify challenge */ -- shake256_init(&state); -- shake256_absorb(&state, mu, CRHBYTES); -- shake256_absorb(&state, buf, K*POLYW1_PACKEDBYTES); -- shake256_finalize(&state); -- shake256_squeeze(c2, CTILDEBYTES, &state); -+ shake256_inc_ctx_reset(&state); -+ shake256_inc_absorb(&state, mu, CRHBYTES); -+ shake256_inc_absorb(&state, buf, K*POLYW1_PACKEDBYTES); -+ shake256_inc_finalize(&state); -+ shake256_inc_squeeze(c2, CTILDEBYTES, &state); -+ shake256_inc_ctx_release(&state); - for(i = 0; i < CTILDEBYTES; ++i) - if(c[i] != c2[i]) - return -1; -diff --git a/ref/symmetric-shake.c b/ref/symmetric-shake.c -index 11ec09c..963f649 100644 ---- a/ref/symmetric-shake.c -+++ b/ref/symmetric-shake.c -@@ -3,26 +3,26 @@ - #include "symmetric.h" - #include "fips202.h" - --void dilithium_shake128_stream_init(keccak_state *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) -+void dilithium_shake128_stream_init(shake128incctx *state, const uint8_t seed[SEEDBYTES], uint16_t nonce) - { - uint8_t t[2]; - t[0] = nonce; - t[1] = nonce >> 8; - -- shake128_init(state); -- shake128_absorb(state, seed, SEEDBYTES); -- shake128_absorb(state, t, 2); -- shake128_finalize(state); -+ shake128_inc_init(state); -+ shake128_inc_absorb(state, seed, SEEDBYTES); -+ shake128_inc_absorb(state, t, 2); -+ shake128_inc_finalize(state); - } - --void dilithium_shake256_stream_init(keccak_state *state, const uint8_t seed[CRHBYTES], uint16_t nonce) -+void dilithium_shake256_stream_init(shake256incctx *state, const uint8_t seed[CRHBYTES], uint16_t nonce) - { - uint8_t t[2]; - t[0] = nonce; - t[1] = nonce >> 8; - -- shake256_init(state); -- shake256_absorb(state, seed, CRHBYTES); -- shake256_absorb(state, t, 2); -- shake256_finalize(state); -+ shake256_inc_init(state); -+ shake256_inc_absorb(state, seed, CRHBYTES); -+ shake256_inc_absorb(state, t, 2); -+ shake256_inc_finalize(state); - } -diff --git a/ref/symmetric.h b/ref/symmetric.h -index cba12d1..211de3b 100644 ---- a/ref/symmetric.h -+++ b/ref/symmetric.h -@@ -6,16 +6,16 @@ - - #include "fips202.h" - --typedef keccak_state stream128_state; --typedef keccak_state stream256_state; -+typedef shake128incctx stream128_state; -+typedef shake256incctx stream256_state; - - #define dilithium_shake128_stream_init DILITHIUM_NAMESPACE(dilithium_shake128_stream_init) --void dilithium_shake128_stream_init(keccak_state *state, -+void dilithium_shake128_stream_init(shake128incctx *state, - const uint8_t seed[SEEDBYTES], - uint16_t nonce); - - #define dilithium_shake256_stream_init DILITHIUM_NAMESPACE(dilithium_shake256_stream_init) --void dilithium_shake256_stream_init(keccak_state *state, -+void dilithium_shake256_stream_init(shake256incctx *state, - const uint8_t seed[CRHBYTES], - uint16_t nonce); - -@@ -26,9 +26,11 @@ void dilithium_shake256_stream_init(keccak_state *state, - dilithium_shake128_stream_init(STATE, SEED, NONCE) - #define stream128_squeezeblocks(OUT, OUTBLOCKS, STATE) \ - shake128_squeezeblocks(OUT, OUTBLOCKS, STATE) -+#define stream128_release(STATE) shake128_inc_ctx_release(STATE) - #define stream256_init(STATE, SEED, NONCE) \ - dilithium_shake256_stream_init(STATE, SEED, NONCE) - #define stream256_squeezeblocks(OUT, OUTBLOCKS, STATE) \ - shake256_squeezeblocks(OUT, OUTBLOCKS, STATE) -+#define stream256_release(STATE) shake256_inc_ctx_release(STATE) - - #endif - \ No newline at end of file diff --git a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch b/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch deleted file mode 100644 index 6f9ed598d..000000000 --- a/scripts/copy_from_upstream/patches/pqcrystals-dilithium-standard-yml.patch +++ /dev/null @@ -1,69 +0,0 @@ -diff --git a/Dilithium2_META.yml b/Dilithium2_META.yml -index 78a3b82..1e37507 100644 ---- a/Dilithium2_META.yml -+++ b/Dilithium2_META.yml -@@ -24,16 +24,14 @@ implementations: - signature_keypair: pqcrystals_dilithium2_ref_keypair - signature_signature: pqcrystals_dilithium2_ref_signature - signature_verify: pqcrystals_dilithium2_ref_verify -- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c -- common_dep: common_ref -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c - - name: avx2 - version: https://github.com/pq-crystals/dilithium/tree/standard - compile_opts: -DDILITHIUM_MODE=2 - signature_keypair: pqcrystals_dilithium2_avx2_keypair - signature_signature: pqcrystals_dilithium2_avx2_signature - signature_verify: pqcrystals_dilithium2_avx2_verify -- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c -- common_dep: common_avx2 -+ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c - supported_platforms: - - architecture: x86_64 - operating_systems: -diff --git a/Dilithium3_META.yml b/Dilithium3_META.yml -index d9b76e2..dbd3677 100644 ---- a/Dilithium3_META.yml -+++ b/Dilithium3_META.yml -@@ -24,16 +24,14 @@ implementations: - signature_keypair: pqcrystals_dilithium3_ref_keypair - signature_signature: pqcrystals_dilithium3_ref_signature - signature_verify: pqcrystals_dilithium3_ref_verify -- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c -- common_dep: common_ref -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c - - name: avx2 - version: https://github.com/pq-crystals/dilithium/tree/standard - compile_opts: -DDILITHIUM_MODE=3 - signature_keypair: pqcrystals_dilithium3_avx2_keypair - signature_signature: pqcrystals_dilithium3_avx2_signature - signature_verify: pqcrystals_dilithium3_avx2_verify -- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c -- common_dep: common_avx2 -+ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c - supported_platforms: - - architecture: x86_64 - operating_systems: -diff --git a/Dilithium5_META.yml b/Dilithium5_META.yml -index c2ea5f0..3eb4bf5 100644 ---- a/Dilithium5_META.yml -+++ b/Dilithium5_META.yml -@@ -24,16 +24,14 @@ implementations: - signature_keypair: pqcrystals_dilithium5_ref_keypair - signature_signature: pqcrystals_dilithium5_ref_signature - signature_verify: pqcrystals_dilithium5_ref_verify -- sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c -- common_dep: common_ref -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c - - name: avx2 - version: https://github.com/pq-crystals/dilithium/tree/standard - compile_opts: -DDILITHIUM_MODE=5 - signature_keypair: pqcrystals_dilithium5_avx2_keypair - signature_signature: pqcrystals_dilithium5_avx2_signature - signature_verify: pqcrystals_dilithium5_avx2_verify -- sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c -- common_dep: common_avx2 -+ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c - supported_platforms: - - architecture: x86_64 - operating_systems: diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-avx2-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-avx2-shake-aes.patch deleted file mode 100644 index d4a7eaca8..000000000 --- a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-avx2-shake-aes.patch +++ /dev/null @@ -1,160 +0,0 @@ -diff --git a/avx2/indcpa.c b/avx2/indcpa.c -index 4f3b782..572ce49 100644 ---- a/avx2/indcpa.c -+++ b/avx2/indcpa.c -@@ -175,7 +175,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - unsigned int ctr0, ctr1, ctr2, ctr3; - ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; - __m256i f; -- keccakx4_state state; -+ shake128x4incctx state; - - f = _mm256_loadu_si256((__m256i *)seed); - _mm256_store_si256(buf[0].vec, f); -@@ -204,6 +204,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - buf[3].coeffs[33] = 1; - } - -+ shake128x4_inc_init(&state); - shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); - shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); - -@@ -225,6 +226,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - poly_nttunpack(&a[0].vec[1]); - poly_nttunpack(&a[1].vec[0]); - poly_nttunpack(&a[1].vec[1]); -+ shake128x4_inc_ctx_release(&state); - } - #elif KYBER_K == 3 - void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) -@@ -232,8 +234,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - unsigned int ctr0, ctr1, ctr2, ctr3; - ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; - __m256i f; -- keccakx4_state state; -- keccak_state state1x; -+ shake128x4incctx state; -+ shake128incctx state1x; - - f = _mm256_loadu_si256((__m256i *)seed); - _mm256_store_si256(buf[0].vec, f); -@@ -262,6 +264,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - buf[3].coeffs[33] = 1; - } - -+ shake128x4_inc_init(&state); - shake128x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 34); - shake128x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state); - -@@ -327,6 +330,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - ctr2 += rej_uniform(a[2].vec[0].coeffs + ctr2, KYBER_N - ctr2, buf[2].coeffs, SHAKE128_RATE); - ctr3 += rej_uniform(a[2].vec[1].coeffs + ctr3, KYBER_N - ctr3, buf[3].coeffs, SHAKE128_RATE); - } -+ shake128x4_inc_ctx_release(&state); - - poly_nttunpack(&a[1].vec[1]); - poly_nttunpack(&a[1].vec[2]); -@@ -337,6 +341,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - _mm256_store_si256(buf[0].vec, f); - buf[0].coeffs[32] = 2; - buf[0].coeffs[33] = 2; -+ -+ shake128_inc_init(&state1x); - shake128_absorb_once(&state1x, buf[0].coeffs, 34); - shake128_squeezeblocks(buf[0].coeffs, REJ_UNIFORM_AVX_NBLOCKS, &state1x); - ctr0 = rej_uniform_avx(a[2].vec[2].coeffs, buf[0].coeffs); -@@ -344,6 +350,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - shake128_squeezeblocks(buf[0].coeffs, 1, &state1x); - ctr0 += rej_uniform(a[2].vec[2].coeffs + ctr0, KYBER_N - ctr0, buf[0].coeffs, SHAKE128_RATE); - } -+ shake128_inc_ctx_release(&state1x); - - poly_nttunpack(&a[2].vec[2]); - } -@@ -353,7 +360,8 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - unsigned int i, ctr0, ctr1, ctr2, ctr3; - ALIGNED_UINT8(REJ_UNIFORM_AVX_NBLOCKS*SHAKE128_RATE) buf[4]; - __m256i f; -- keccakx4_state state; -+ shake128x4incctx state; -+ shake128x4_inc_init(&state); - - for(i=0;i<4;i++) { - f = _mm256_loadu_si256((__m256i *)seed); -@@ -405,6 +413,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[32], int transposed) - poly_nttunpack(&a[i].vec[2]); - poly_nttunpack(&a[i].vec[3]); - } -+ shake128x4_inc_ctx_release(&state); - } - #endif - -diff --git a/avx2/poly.c b/avx2/poly.c -index ab148a2..96bad86 100644 ---- a/avx2/poly.c -+++ b/avx2/poly.c -@@ -2,6 +2,7 @@ - #include - #include - #include "align.h" -+#include "fips202x4.h" - #include "params.h" - #include "poly.h" - #include "ntt.h" -@@ -412,7 +413,7 @@ void poly_getnoise_eta1_4x(poly *r0, - { - ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; - __m256i f; -- keccakx4_state state; -+ shake256x4incctx state; - - f = _mm256_loadu_si256((__m256i *)seed); - _mm256_store_si256(buf[0].vec, f); -@@ -425,8 +426,10 @@ void poly_getnoise_eta1_4x(poly *r0, - buf[2].coeffs[32] = nonce2; - buf[3].coeffs[32] = nonce3; - -+ shake256x4_inc_init(&state); - shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); - shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); -+ shake256x4_inc_ctx_release(&state); - - poly_cbd_eta1(r0, buf[0].vec); - poly_cbd_eta1(r1, buf[1].vec); -@@ -447,7 +450,7 @@ void poly_getnoise_eta1122_4x(poly *r0, - { - ALIGNED_UINT8(NOISE_NBLOCKS*SHAKE256_RATE) buf[4]; - __m256i f; -- keccakx4_state state; -+ shake256x4incctx state; - - f = _mm256_loadu_si256((__m256i *)seed); - _mm256_store_si256(buf[0].vec, f); -@@ -460,8 +463,10 @@ void poly_getnoise_eta1122_4x(poly *r0, - buf[2].coeffs[32] = nonce2; - buf[3].coeffs[32] = nonce3; - -+ shake256x4_inc_init(&state); - shake256x4_absorb_once(&state, buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, 33); - shake256x4_squeezeblocks(buf[0].coeffs, buf[1].coeffs, buf[2].coeffs, buf[3].coeffs, NOISE_NBLOCKS, &state); -+ shake256x4_inc_ctx_release(&state); - - poly_cbd_eta1(r0, buf[0].vec); - poly_cbd_eta1(r1, buf[1].vec); -diff --git a/avx2/symmetric.h b/avx2/symmetric.h -index 627b891..e4941f7 100644 ---- a/avx2/symmetric.h -+++ b/avx2/symmetric.h -@@ -8,10 +8,10 @@ - #include "fips202.h" - #include "fips202x4.h" - --typedef keccak_state xof_state; -+typedef shake128incctx xof_state; - - #define kyber_shake128_absorb KYBER_NAMESPACE(kyber_shake128_absorb) --void kyber_shake128_absorb(keccak_state *s, -+void kyber_shake128_absorb(shake128incctx *s, - const uint8_t seed[KYBER_SYMBYTES], - uint8_t x, - uint8_t y); diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch b/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch deleted file mode 100644 index 15ccb1ecc..000000000 --- a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-ref-shake-aes.patch +++ /dev/null @@ -1,80 +0,0 @@ -diff --git a/ref/indcpa.c b/ref/indcpa.c -index 5d74518..4a8b4c8 100644 ---- a/ref/indcpa.c -+++ b/ref/indcpa.c -@@ -164,6 +164,7 @@ void gen_matrix(polyvec *a, const uint8_t seed[KYBER_SYMBYTES], int transposed) - unsigned int buflen, off; - uint8_t buf[GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES+2]; - xof_state state; -+ xof_init(&state, seed); - - for(i=0;i + + #define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +-#define pqcrystals_dilithium2_SECRETKEYBYTES 2528 ++#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 + #define pqcrystals_dilithium2_BYTES 2420 + + #define pqcrystals_dilithium2_avx2_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +@@ -32,8 +32,8 @@ int pqcrystals_dilithium2_avx2_open(uint8_t *m, size_t *mlen, + + + #define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +-#define pqcrystals_dilithium3_SECRETKEYBYTES 4000 +-#define pqcrystals_dilithium3_BYTES 3293 ++#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 ++#define pqcrystals_dilithium3_BYTES 3309 + + #define pqcrystals_dilithium3_avx2_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES + #define pqcrystals_dilithium3_avx2_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +@@ -59,8 +59,8 @@ int pqcrystals_dilithium3_avx2_open(uint8_t *m, size_t *mlen, + + + #define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +-#define pqcrystals_dilithium5_SECRETKEYBYTES 4864 +-#define pqcrystals_dilithium5_BYTES 4595 ++#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 ++#define pqcrystals_dilithium5_BYTES 4627 + + #define pqcrystals_dilithium5_avx2_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES + #define pqcrystals_dilithium5_avx2_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES diff --git a/avx2/config.h b/avx2/config.h -index a9facc0..e59f81a 100644 +index ba5caa8..e59f81a 100644 --- a/avx2/config.h +++ b/avx2/config.h +@@ -2,7 +2,7 @@ + #define CONFIG_H + + //#define DILITHIUM_MODE 2 +-//#define DILITHIUM_RANDOMIZED_SIGNING ++#define DILITHIUM_RANDOMIZED_SIGNING + //#define USE_RDPMC + //#define DBENCH + @@ -11,17 +11,17 @@ #endif @@ -407,10 +654,54 @@ index 8f3c3c5..fa49963 100644 +#define stream256_release(STATE) shake256_inc_ctx_release(STATE) #endif +diff --git a/ref/api.h b/ref/api.h +index cd364e5..78caa5c 100644 +--- a/ref/api.h ++++ b/ref/api.h +@@ -5,7 +5,7 @@ + #include + + #define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 +-#define pqcrystals_dilithium2_SECRETKEYBYTES 2528 ++#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 + #define pqcrystals_dilithium2_BYTES 2420 + + #define pqcrystals_dilithium2_ref_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES +@@ -32,8 +32,8 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, + + + #define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 +-#define pqcrystals_dilithium3_SECRETKEYBYTES 4000 +-#define pqcrystals_dilithium3_BYTES 3293 ++#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 ++#define pqcrystals_dilithium3_BYTES 3309 + + #define pqcrystals_dilithium3_ref_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES + #define pqcrystals_dilithium3_ref_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES +@@ -59,8 +59,8 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, + + + #define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 +-#define pqcrystals_dilithium5_SECRETKEYBYTES 4864 +-#define pqcrystals_dilithium5_BYTES 4595 ++#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 ++#define pqcrystals_dilithium5_BYTES 4627 + + #define pqcrystals_dilithium5_ref_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES + #define pqcrystals_dilithium5_ref_SECRETKEYBYTES pqcrystals_dilithium5_SECRETKEYBYTES diff --git a/ref/config.h b/ref/config.h -index 98b8ccb..eddf13f 100644 +index 5ddcd8c..eddf13f 100644 --- a/ref/config.h +++ b/ref/config.h +@@ -2,7 +2,7 @@ + #define CONFIG_H + + //#define DILITHIUM_MODE 2 +-//#define DILITHIUM_RANDOMIZED_SIGNING ++#define DILITHIUM_RANDOMIZED_SIGNING + //#define USE_RDPMC + //#define DBENCH + @@ -11,17 +11,17 @@ #endif @@ -437,6 +728,27 @@ index 98b8ccb..eddf13f 100644 +#define DILITHIUM_NAMESPACE(s) pqcrystals_ml_dsa_87_ipd_ref_##s #endif + #endif +diff --git a/ref/packing.h b/ref/packing.h +index 1e8e9e7..8e47728 100644 +--- a/ref/packing.h ++++ b/ref/packing.h +@@ -18,7 +18,7 @@ void pack_sk(uint8_t sk[CRYPTO_SECRETKEYBYTES], + const polyveck *s2); + + #define pack_sig DILITHIUM_NAMESPACE(pack_sig) +-void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[SEEDBYTES], const polyvecl *z, const polyveck *h); ++void pack_sig(uint8_t sig[CRYPTO_BYTES], const uint8_t c[CTILDEBYTES], const polyvecl *z, const polyveck *h); + + #define unpack_pk DILITHIUM_NAMESPACE(unpack_pk) + void unpack_pk(uint8_t rho[SEEDBYTES], polyveck *t1, const uint8_t pk[CRYPTO_PUBLICKEYBYTES]); +@@ -33,6 +33,6 @@ void unpack_sk(uint8_t rho[SEEDBYTES], + const uint8_t sk[CRYPTO_SECRETKEYBYTES]); + + #define unpack_sig DILITHIUM_NAMESPACE(unpack_sig) +-int unpack_sig(uint8_t c[SEEDBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); ++int unpack_sig(uint8_t c[CTILDEBYTES], polyvecl *z, polyveck *h, const uint8_t sig[CRYPTO_BYTES]); + #endif diff --git a/ref/poly.c b/ref/poly.c index 054ed98..d44063f 100644 diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch b/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch similarity index 82% rename from scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch rename to scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch index fe6d3c36a..5ea885534 100644 --- a/scripts/copy_from_upstream/patches/pqcrystals-kyber-standard-alldiff.patch +++ b/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch @@ -1,8 +1,8 @@ diff --git a/Kyber1024_META.yml b/ML-KEM-1024-ipd_META.yml -similarity index 72% +similarity index 55% rename from Kyber1024_META.yml rename to ML-KEM-1024-ipd_META.yml -index 7c586ea..ffafcf0 100644 +index baa5ca3..ffafcf0 100644 --- a/Kyber1024_META.yml +++ b/ML-KEM-1024-ipd_META.yml @@ -1,4 +1,4 @@ @@ -11,8 +11,23 @@ index 7c586ea..ffafcf0 100644 type: kem claimed-nist-level: 5 claimed-security: IND-CCA2 -@@ -25,19 +25,17 @@ implementations: - version: https://github.com/pq-crystals/kyber/tree/standard +@@ -6,8 +6,8 @@ length-public-key: 1568 + length-ciphertext: 1568 + length-secret-key: 3168 + length-shared-secret: 32 +-nistkat-sha256: 5afcf2a568ad32d49b55105b032af1850f03f3888ff9e2a72f4059c58e968f60 +-testvectors-sha256: ff1a854b9b6761a70c65ccae85246fe0596a949e72eae0866a8a2a2d4ea54b10 ++nistkat-sha256: 03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7 ++testvectors-sha256: 85ab251d6e749e6b27507a8a6ec473ba2e8419c1aef87d0cd5ec9903c1bb92df + principal-submitters: + - Peter Schwabe + auxiliary-submitters: +@@ -22,22 +22,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref +- version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff ++ version: https://github.com/pq-crystals/kyber/tree/standard folder_name: ref compile_opts: -DKYBER_K=4 - signature_keypair: pqcrystals_kyber1024_ref_keypair @@ -25,7 +40,8 @@ index 7c586ea..ffafcf0 100644 + signature_dec: pqcrystals_ml_kem_1024_ipd_ref_dec + sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c - name: avx2 - version: https://github.com/pq-crystals/kyber/tree/standard +- version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff ++ version: https://github.com/pq-crystals/kyber/tree/standard compile_opts: -DKYBER_K=4 - signature_keypair: pqcrystals_kyber1024_avx2_keypair - signature_enc: pqcrystals_kyber1024_avx2_enc @@ -40,10 +56,10 @@ index 7c586ea..ffafcf0 100644 - architecture: x86_64 operating_systems: diff --git a/Kyber512_META.yml b/ML-KEM-512-ipd_META.yml -similarity index 72% +similarity index 55% rename from Kyber512_META.yml rename to ML-KEM-512-ipd_META.yml -index d7b07e7..d20f0b1 100644 +index b251701..d20f0b1 100644 --- a/Kyber512_META.yml +++ b/ML-KEM-512-ipd_META.yml @@ -1,4 +1,4 @@ @@ -52,8 +68,23 @@ index d7b07e7..d20f0b1 100644 type: kem claimed-nist-level: 1 claimed-security: IND-CCA2 -@@ -25,19 +25,17 @@ implementations: - version: https://github.com/pq-crystals/kyber/tree/standard +@@ -6,8 +6,8 @@ length-public-key: 800 + length-ciphertext: 768 + length-secret-key: 1632 + length-shared-secret: 32 +-nistkat-sha256: bb0481d3325d828817900b709d23917cefbc10026fc857f098979451f67bb0ca +-testvectors-sha256: 6730bb552c22d9d2176ffb5568e48eb30952cf1f065073ec5f9724f6a3c6ea85 ++nistkat-sha256: 76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f ++testvectors-sha256: e1ac6fb45e2511f4170a3527c0c50dcd61336f47113df7a299a61ef8394bd669 + principal-submitters: + - Peter Schwabe + auxiliary-submitters: +@@ -22,22 +22,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref +- version: https://github.com/pq-crystals/kyber/commit/74cad307858b61e434490c75f812cb9b9ef7279b ++ version: https://github.com/pq-crystals/kyber/tree/standard folder_name: ref compile_opts: -DKYBER_K=2 - signature_keypair: pqcrystals_kyber512_ref_keypair @@ -66,7 +97,8 @@ index d7b07e7..d20f0b1 100644 + signature_dec: pqcrystals_ml_kem_512_ipd_ref_dec + sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c - name: avx2 - version: https://github.com/pq-crystals/kyber/tree/standard +- version: https://github.com/pq-crystals/kyber/commit/36414d64fc1890ed58d1ca8b1e0cab23635d1ac2 ++ version: https://github.com/pq-crystals/kyber/tree/standard compile_opts: -DKYBER_K=2 - signature_keypair: pqcrystals_kyber512_avx2_keypair - signature_enc: pqcrystals_kyber512_avx2_enc @@ -81,10 +113,10 @@ index d7b07e7..d20f0b1 100644 - architecture: x86_64 operating_systems: diff --git a/Kyber768_META.yml b/ML-KEM-768-ipd_META.yml -similarity index 72% +similarity index 55% rename from Kyber768_META.yml rename to ML-KEM-768-ipd_META.yml -index 92747ea..e768cd5 100644 +index 7a0cc3d..e768cd5 100644 --- a/Kyber768_META.yml +++ b/ML-KEM-768-ipd_META.yml @@ -1,4 +1,4 @@ @@ -93,8 +125,23 @@ index 92747ea..e768cd5 100644 type: kem claimed-nist-level: 3 claimed-security: IND-CCA2 -@@ -25,19 +25,17 @@ implementations: - version: https://github.com/pq-crystals/kyber/tree/standard +@@ -6,8 +6,8 @@ length-public-key: 1184 + length-ciphertext: 1088 + length-secret-key: 2400 + length-shared-secret: 32 +-nistkat-sha256: 89e82a5bf2d4ddb2c6444e10409e6d9ca65dafbca67d1a0db2c9b54920a29172 +-testvectors-sha256: 667c8ca2ca93729c0df6ff24588460bad1bbdbfb64ece0fe8563852a7ff348c6 ++nistkat-sha256: c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310 ++testvectors-sha256: 2586721a714c439f6fef26e29ee1c4c67c6207186f810617f278e6ce3e67ea0d + principal-submitters: + - Peter Schwabe + auxiliary-submitters: +@@ -22,22 +22,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref +- version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff ++ version: https://github.com/pq-crystals/kyber/tree/standard folder_name: ref compile_opts: -DKYBER_K=3 - signature_keypair: pqcrystals_kyber768_ref_keypair @@ -107,7 +154,8 @@ index 92747ea..e768cd5 100644 + signature_dec: pqcrystals_ml_kem_768_ipd_ref_dec + sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c - name: avx2 - version: https://github.com/pq-crystals/kyber/tree/standard +- version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff ++ version: https://github.com/pq-crystals/kyber/tree/standard compile_opts: -DKYBER_K=3 - signature_keypair: pqcrystals_kyber768_avx2_keypair - signature_enc: pqcrystals_kyber768_avx2_enc @@ -347,6 +395,33 @@ index 0802c74..36b2b98 100644 #else #error "KYBER_K must be in {2,3,4}" #endif +diff --git a/ref/poly.c b/ref/poly.c +index 017cacf..9556ee5 100644 +--- a/ref/poly.c ++++ b/ref/poly.c +@@ -180,19 +180,14 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) + void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) + { + unsigned int i,j; +- uint32_t t; ++ uint16_t t; + + for(i=0;icoeffs[8*i+j]; +- // t += ((int16_t)t >> 15) & KYBER_Q; +- // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; +- t <<= 1; +- t += 1665; +- t *= 80635; +- t >>= 28; +- t &= 1; ++ t += ((int16_t)t >> 15) & KYBER_Q; ++ t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + msg[i] |= t << j; + } + } diff --git a/ref/symmetric-shake.c b/ref/symmetric-shake.c index 6a99071..20f4518 100644 --- a/ref/symmetric-shake.c From 85904f9c3463939fd0c879db5766b089934d3a57 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 13 Dec 2023 17:28:21 +0100 Subject: [PATCH 04/27] run astyle --- tests/vectors_kem.c | 68 ++++++++++++++++++++++----------------------- tests/vectors_sig.c | 58 +++++++++++++++++++------------------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index d2214a88d..f74398f45 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -15,7 +15,7 @@ #include "system_info.c" typedef struct { - const uint8_t* pos; + const uint8_t *pos; } fixed_prng_state; fixed_prng_state prng_state = { .pos = 0 }; @@ -42,29 +42,29 @@ void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { } static uint8_t hexCharToDecimal(char c) { - if (c >= '0' && c <= '9') { - return (uint8_t) (c - '0'); - } else if (c >= 'a' && c <= 'f') { - return (uint8_t) (c - 'a' + 10); - } else if (c >= 'A' && c <= 'F') { - return (uint8_t) (c - 'A' + 10); - } else { - fprintf(stderr, "Invalid hex character: %c\n", c); + if (c >= '0' && c <= '9') { + return (uint8_t) (c - '0'); + } else if (c >= 'a' && c <= 'f') { + return (uint8_t) (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + return (uint8_t) (c - 'A' + 10); + } else { + fprintf(stderr, "Invalid hex character: %c\n", c); return 0; - } + } } static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { - size_t len = strlen(hexString); + size_t len = strlen(hexString); - if (len % 2 != 0) { - fprintf(stderr, "Hex string must have an even number of characters\n"); - exit(EXIT_FAILURE); - } + if (len % 2 != 0) { + fprintf(stderr, "Hex string must have an even number of characters\n"); + exit(EXIT_FAILURE); + } - for (size_t i = 0, j = 0; i < len; i += 2, j++) { - byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); - } + for (size_t i = 0, j = 0; i < len; i += 2, j++) { + byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); + } } static inline uint16_t UINT16_TO_BE(const uint16_t x) { @@ -91,17 +91,17 @@ static void MLKEM_randombytes_init(const uint8_t *entropy_input, const uint8_t * static void MLKEM_randombytes(uint8_t *random_array, size_t bytes_to_read) { memcpy(random_array, prng_state.pos, bytes_to_read); - prng_state.pos += bytes_to_read; + prng_state.pos += bytes_to_read; } static void MLKEM_randombytes_free(void) { prng_state.pos = 0; } -OQS_STATUS kem_vector(const char *method_name, - uint8_t *prng_output_stream, - const uint8_t *encaps_pk, const uint8_t *encaps_K, - const uint8_t *decaps_sk, const uint8_t *decaps_ciphertext, const uint8_t *decaps_kprime) { +OQS_STATUS kem_vector(const char *method_name, + uint8_t *prng_output_stream, + const uint8_t *encaps_pk, const uint8_t *encaps_K, + const uint8_t *decaps_sk, const uint8_t *decaps_ciphertext, const uint8_t *decaps_kprime) { uint8_t *entropy_input; uint8_t seed[48]; @@ -163,7 +163,7 @@ OQS_STATUS kem_vector(const char *method_name, fprintf(stderr, "[vectors_kem] %s ERROR: OQS_KEM_encaps failed!\n", method_name); goto err; } - + fprintBstr(fh, "c: ", ct_encaps, kem->length_ciphertext); fprintBstr(fh, "K: ", ss_encaps, kem->length_shared_secret); @@ -194,8 +194,8 @@ OQS_STATUS kem_vector(const char *method_name, cleanup: if (kem != NULL) { OQS_MEM_secure_free(secret_key, kem->length_secret_key); - OQS_MEM_secure_free(ss_encaps , kem->length_shared_secret); - OQS_MEM_secure_free(ss_decaps , kem->length_shared_secret); + OQS_MEM_secure_free(ss_encaps, kem->length_shared_secret); + OQS_MEM_secure_free(ss_decaps, kem->length_shared_secret); } OQS_MEM_insecure_free(public_key); OQS_MEM_insecure_free(ct_encaps); @@ -223,21 +223,21 @@ int main(int argc, char **argv) { char *alg_name = argv[1]; char *prng_output_stream = argv[2]; // z || d || m - + char *encaps_pk = argv[3]; char *encaps_K = argv[4]; - + char *decaps_sk = argv[5]; char *decaps_ciphertext = argv[6]; char *decaps_kprime = argv[7]; - if (strlen(prng_output_stream) % 2 != 0 || - strlen(encaps_pk) % 2 != 0 || - strlen(encaps_K) % 2 != 0 || - strlen(decaps_sk) % 2 != 0 || - strlen(decaps_ciphertext) % 2 != 0 || - strlen(decaps_kprime) % 2 != 0) { + if (strlen(prng_output_stream) % 2 != 0 || + strlen(encaps_pk) % 2 != 0 || + strlen(encaps_K) % 2 != 0 || + strlen(decaps_sk) % 2 != 0 || + strlen(decaps_ciphertext) % 2 != 0 || + strlen(decaps_kprime) % 2 != 0) { return EXIT_FAILURE; } diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index 855367e85..11fa9d979 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -15,7 +15,7 @@ #include "system_info.c" typedef struct { - const uint8_t* pos; + const uint8_t *pos; } fixed_prng_state; fixed_prng_state prng_state = { .pos = 0 }; @@ -42,29 +42,29 @@ void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { } static uint8_t hexCharToDecimal(char c) { - if (c >= '0' && c <= '9') { - return (uint8_t) (c - '0'); - } else if (c >= 'a' && c <= 'f') { - return (uint8_t) (c - 'a' + 10); - } else if (c >= 'A' && c <= 'F') { - return (uint8_t) (c - 'A' + 10); - } else { - fprintf(stderr, "Invalid hex character: %c\n", c); + if (c >= '0' && c <= '9') { + return (uint8_t) (c - '0'); + } else if (c >= 'a' && c <= 'f') { + return (uint8_t) (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + return (uint8_t) (c - 'A' + 10); + } else { + fprintf(stderr, "Invalid hex character: %c\n", c); return 0; - } + } } static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { - size_t len = strlen(hexString); + size_t len = strlen(hexString); - if (len % 2 != 0) { - fprintf(stderr, "Hex string must have an even number of characters\n"); - exit(EXIT_FAILURE); - } + if (len % 2 != 0) { + fprintf(stderr, "Hex string must have an even number of characters\n"); + exit(EXIT_FAILURE); + } - for (size_t i = 0, j = 0; i < len; i += 2, j++) { - byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); - } + for (size_t i = 0, j = 0; i < len; i += 2, j++) { + byteArray[j] = (uint8_t) ((hexCharToDecimal(hexString[i]) << 4) | hexCharToDecimal(hexString[i + 1])); + } } static inline uint16_t UINT16_TO_BE(const uint16_t x) { @@ -91,17 +91,17 @@ static void MLDSA_randombytes_init(const uint8_t *entropy_input, const uint8_t * static void MLDSA_randombytes(uint8_t *random_array, size_t bytes_to_read) { memcpy(random_array, prng_state.pos, bytes_to_read); - prng_state.pos += bytes_to_read; + prng_state.pos += bytes_to_read; } static void MLDSA_randombytes_free(void) { prng_state.pos = 0; } -OQS_STATUS sig_vector(const char *method_name, - uint8_t *prng_output_stream, - const uint8_t *sig_msg, size_t sig_msg_len, const uint8_t *sig_sk, - const uint8_t *verif_sig, const uint8_t *verif_pk, const uint8_t *verif_msg, size_t verif_msg_len) { +OQS_STATUS sig_vector(const char *method_name, + uint8_t *prng_output_stream, + const uint8_t *sig_msg, size_t sig_msg_len, const uint8_t *sig_sk, + const uint8_t *verif_sig, const uint8_t *verif_pk, const uint8_t *verif_msg, size_t verif_msg_len) { uint8_t *entropy_input; uint8_t seed[48]; @@ -221,12 +221,12 @@ int main(int argc, char **argv) { char *verif_msg = argv[7]; size_t verif_msg_len = strlen(verif_msg) / 2; - if (strlen(prng_output_stream) % 2 != 0 || - strlen(sig_msg) % 2 != 0 || - strlen(sig_sk) % 2 != 0 || - strlen(verif_sig) % 2 != 0 || - strlen(verif_pk) % 2 != 0 || - strlen(verif_msg) % 2 != 0) { + if (strlen(prng_output_stream) % 2 != 0 || + strlen(sig_msg) % 2 != 0 || + strlen(sig_sk) % 2 != 0 || + strlen(verif_sig) % 2 != 0 || + strlen(verif_pk) % 2 != 0 || + strlen(verif_msg) % 2 != 0) { return EXIT_FAILURE; } From 04789537b94929499533a1f740926e3c53adbe96 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 13 Dec 2023 17:37:13 +0100 Subject: [PATCH 05/27] add missing patch --- .../patches/pqcrystals-kyber-yml.patch | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 scripts/copy_from_upstream/patches/pqcrystals-kyber-yml.patch diff --git a/scripts/copy_from_upstream/patches/pqcrystals-kyber-yml.patch b/scripts/copy_from_upstream/patches/pqcrystals-kyber-yml.patch new file mode 100644 index 000000000..34559ab46 --- /dev/null +++ b/scripts/copy_from_upstream/patches/pqcrystals-kyber-yml.patch @@ -0,0 +1,69 @@ +diff --git a/Kyber1024_META.yml b/Kyber1024_META.yml +index baa5ca3..fec9249 100644 +--- a/Kyber1024_META.yml ++++ b/Kyber1024_META.yml +@@ -28,16 +28,14 @@ implementations: + signature_keypair: pqcrystals_kyber1024_ref_keypair + signature_enc: pqcrystals_kyber1024_ref_enc + signature_dec: pqcrystals_kyber1024_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff + compile_opts: -DKYBER_K=4 + signature_keypair: pqcrystals_kyber1024_avx2_keypair + signature_enc: pqcrystals_kyber1024_avx2_enc + signature_dec: pqcrystals_kyber1024_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Kyber512_META.yml b/Kyber512_META.yml +index b251701..a744ccf 100644 +--- a/Kyber512_META.yml ++++ b/Kyber512_META.yml +@@ -28,16 +28,14 @@ implementations: + signature_keypair: pqcrystals_kyber512_ref_keypair + signature_enc: pqcrystals_kyber512_ref_enc + signature_dec: pqcrystals_kyber512_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/commit/36414d64fc1890ed58d1ca8b1e0cab23635d1ac2 + compile_opts: -DKYBER_K=2 + signature_keypair: pqcrystals_kyber512_avx2_keypair + signature_enc: pqcrystals_kyber512_avx2_enc + signature_dec: pqcrystals_kyber512_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Kyber768_META.yml b/Kyber768_META.yml +index 7a0cc3d..397a524 100644 +--- a/Kyber768_META.yml ++++ b/Kyber768_META.yml +@@ -28,16 +28,14 @@ implementations: + signature_keypair: pqcrystals_kyber768_ref_keypair + signature_enc: pqcrystals_kyber768_ref_enc + signature_dec: pqcrystals_kyber768_ref_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h fips202.h symmetric-shake.c +- common_dep: common_ref ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c reduce.c ntt.c cbd.c verify.c kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h ntt.h cbd.h verify.h symmetric.h symmetric-shake.c + - name: avx2 + version: https://github.com/pq-crystals/kyber/commit/28413dfbf523fdde181246451c2bd77199c0f7ff + compile_opts: -DKYBER_K=3 + signature_keypair: pqcrystals_kyber768_avx2_keypair + signature_enc: pqcrystals_kyber768_avx2_enc + signature_dec: pqcrystals_kyber768_avx2_dec +- sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h fips202.h fips202x4.h symmetric-shake.c +- common_dep: common_avx2 common_keccak4x_avx2 ++ sources: ../LICENSE kem.c indcpa.c polyvec.c poly.c fq.S shuffle.S ntt.S invntt.S basemul.S consts.c rejsample.c cbd.c verify.c align.h kem.h params.h api.h indcpa.h polyvec.h poly.h reduce.h fq.inc shuffle.inc ntt.h consts.h rejsample.h cbd.h verify.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: From 1227cd275a371c6d2422f3aec424692a3e059c33 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Thu, 14 Dec 2023 09:51:47 +0100 Subject: [PATCH 06/27] Updates for scan-build --- tests/vector_test.sh | 2 +- tests/vector_test_kem.sh | 2 +- tests/vector_test_sig.sh | 2 +- tests/vectors_kem.c | 33 ++++++++++++++++++++++++++------- tests/vectors_sig.c | 15 +++++++++------ 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/tests/vector_test.sh b/tests/vector_test.sh index 25d5e0d50..06816bcb7 100755 --- a/tests/vector_test.sh +++ b/tests/vector_test.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: MIT if [[ -z "${OQS_BUILD_DIR}" ]]; then diff --git a/tests/vector_test_kem.sh b/tests/vector_test_kem.sh index de06413dd..df45739af 100644 --- a/tests/vector_test_kem.sh +++ b/tests/vector_test_kem.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: MIT file_keygen=$2 diff --git a/tests/vector_test_sig.sh b/tests/vector_test_sig.sh index fcde299c2..278348a5c 100644 --- a/tests/vector_test_sig.sh +++ b/tests/vector_test_sig.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: MIT file_keygen=$2 diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index f74398f45..49f81a080 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -150,6 +150,11 @@ OQS_STATUS kem_vector(const char *method_name, goto err; } + if ((prng_output_stream == NULL) || (encaps_pk == NULL) || (encaps_K == NULL) || (decaps_sk == NULL) || (decaps_ciphertext == NULL) || (decaps_kprime == NULL)) { + fprintf(stderr, "[vectors_kem] %s ERROR: inputs NULL!\n", method_name); + goto err; + } + rc = OQS_KEM_keypair(kem, public_key, secret_key); if (rc != OQS_SUCCESS) { fprintf(stderr, "[vectors_kem] %s ERROR: OQS_KEM_keypair failed!\n", method_name); @@ -197,12 +202,18 @@ OQS_STATUS kem_vector(const char *method_name, OQS_MEM_secure_free(ss_encaps, kem->length_shared_secret); OQS_MEM_secure_free(ss_decaps, kem->length_shared_secret); } + if (randombytes_free != NULL) { + randombytes_free(); + } OQS_MEM_insecure_free(public_key); OQS_MEM_insecure_free(ct_encaps); + OQS_KEM_free(kem); return ret; } int main(int argc, char **argv) { + OQS_STATUS rc; + OQS_init(); if (argc != 8) { @@ -241,13 +252,19 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } - uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); + uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); // TODO: allocate real sizes and check before to real sizes! uint8_t *encaps_pk_bytes = malloc(strlen(encaps_pk) / 2); uint8_t *encaps_K_bytes = malloc(strlen(encaps_K) / 2); uint8_t *decaps_sk_bytes = malloc(strlen(decaps_sk) / 2); uint8_t *decaps_ciphertext_bytes = malloc(strlen(decaps_ciphertext) / 2); uint8_t *decaps_kprime_bytes = malloc(strlen(decaps_kprime) / 2); + if ((prng_output_stream_bytes == NULL) || (encaps_pk_bytes == NULL) || (encaps_K_bytes == NULL) || (decaps_sk_bytes == NULL) || (decaps_ciphertext_bytes == NULL) || (decaps_kprime_bytes == NULL)) { + fprintf(stderr, "[vectors_kem] ERROR: malloc failed!\n"); + rc = OQS_ERROR; + goto err; + } + hexStringToByteArray(prng_output_stream, prng_output_stream_bytes); hexStringToByteArray(encaps_pk, encaps_pk_bytes); hexStringToByteArray(encaps_K, encaps_K_bytes); @@ -255,12 +272,9 @@ int main(int argc, char **argv) { hexStringToByteArray(decaps_ciphertext, decaps_ciphertext_bytes); hexStringToByteArray(decaps_kprime, decaps_kprime_bytes); - OQS_STATUS rc = kem_vector(alg_name, prng_output_stream_bytes, encaps_pk_bytes, encaps_K_bytes, decaps_sk_bytes, decaps_ciphertext_bytes, decaps_kprime_bytes); - if (rc != OQS_SUCCESS) { - OQS_destroy(); - return EXIT_FAILURE; - } + rc = kem_vector(alg_name, prng_output_stream_bytes, encaps_pk_bytes, encaps_K_bytes, decaps_sk_bytes, decaps_ciphertext_bytes, decaps_kprime_bytes); +err: OQS_MEM_insecure_free(prng_output_stream_bytes); OQS_MEM_insecure_free(encaps_pk_bytes); OQS_MEM_insecure_free(encaps_K_bytes); @@ -269,5 +283,10 @@ int main(int argc, char **argv) { OQS_MEM_insecure_free(decaps_kprime_bytes); OQS_destroy(); - return EXIT_SUCCESS; + + if (rc != OQS_SUCCESS) { + return EXIT_FAILURE; + } else { + return EXIT_SUCCESS; + } } diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index 11fa9d979..a1aedff35 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -185,6 +185,9 @@ OQS_STATUS sig_vector(const char *method_name, OQS_MEM_secure_free(secret_key, sig->length_secret_key); OQS_MEM_secure_free(signed_msg, signed_msg_len); } + if (randombytes_free != NULL) { + randombytes_free(); + } OQS_MEM_insecure_free(public_key); OQS_MEM_insecure_free(signature); OQS_MEM_insecure_free(msg); @@ -245,11 +248,6 @@ int main(int argc, char **argv) { hexStringToByteArray(verif_msg, verif_msg_bytes); OQS_STATUS rc = sig_vector(alg_name, prng_output_stream_bytes, sig_msg_bytes, sig_msg_len, sig_sk_bytes, verif_sig_bytes, verif_pk_bytes, verif_msg_bytes, verif_msg_len); - if (rc != OQS_SUCCESS) { - OQS_destroy(); - return EXIT_FAILURE; - } - OQS_MEM_insecure_free(prng_output_stream_bytes); OQS_MEM_insecure_free(sig_msg_bytes); OQS_MEM_insecure_free(sig_sk_bytes); @@ -258,5 +256,10 @@ int main(int argc, char **argv) { OQS_MEM_insecure_free(verif_msg_bytes); OQS_destroy(); - return EXIT_SUCCESS; + + if (rc != OQS_SUCCESS) { + return EXIT_FAILURE; + } else { + return EXIT_SUCCESS; + } } From b07aaa988c063194de03c73771869a190ed1a6a0 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 23 Jan 2024 18:21:32 +0100 Subject: [PATCH 07/27] pull latest mlkem/mldsa from upstream --- docs/algorithms/kem/ml_kem.md | 4 +- docs/algorithms/kem/ml_kem.yml | 2 +- docs/algorithms/sig/ml_dsa.md | 4 +- docs/algorithms/sig/ml_dsa.yml | 2 +- .../copy_from_upstream/copy_from_upstream.yml | 6 +- .../patches/pqcrystals-ml_dsa_ipd.patch | 356 ++++++------------ .../patches/pqcrystals-ml_kem_ipd.patch | 36 -- .../poly.c | 89 +---- .../poly.c | 29 +- .../polyvec.c | 18 +- .../poly.c | 89 +---- .../poly.c | 29 +- .../polyvec.c | 18 +- .../poly.c | 89 +---- .../poly.c | 29 +- .../polyvec.c | 18 +- .../poly.c | 2 +- .../poly.c | 2 +- .../poly.c | 2 +- 19 files changed, 239 insertions(+), 585 deletions(-) diff --git a/docs/algorithms/kem/ml_kem.md b/docs/algorithms/kem/ml_kem.md index 47d766c36..8b63fe9f4 100644 --- a/docs/algorithms/kem/ml_kem.md +++ b/docs/algorithms/kem/ml_kem.md @@ -7,9 +7,9 @@ - **Authors' website**: https://pq-crystals.org/ - **Specification version**: pq-crystals 20230726. - **Primary Source**: - - **Source**: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 with copy_from_upstream patches + - **Source**: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 -- **Optimized Implementation sources**: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 with copy_from_upstream patches +- **Optimized Implementation sources**: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches - **oldpqclean-aarch64**: - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT diff --git a/docs/algorithms/kem/ml_kem.yml b/docs/algorithms/kem/ml_kem.yml index 752f7fe66..d7db917db 100644 --- a/docs/algorithms/kem/ml_kem.yml +++ b/docs/algorithms/kem/ml_kem.yml @@ -17,7 +17,7 @@ website: https://pq-crystals.org/ nist-round: ipd spec-version: pq-crystals 20230726 primary-upstream: - source: https://github.com/pq-crystals/kyber/commit/bc8e640727b5178eb1c65867d6ba6599b3ad88e5 + source: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches spdx-license-identifier: CC0-1.0 or Apache-2.0 optimized-upstreams: diff --git a/docs/algorithms/sig/ml_dsa.md b/docs/algorithms/sig/ml_dsa.md index 872408e87..13d095e35 100644 --- a/docs/algorithms/sig/ml_dsa.md +++ b/docs/algorithms/sig/ml_dsa.md @@ -7,9 +7,9 @@ - **Authors' website**: https://pq-crystals.org/dilithium/ - **Specification version**: pq-crystals 20230825. - **Primary Source**: - - **Source**: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f with copy_from_upstream patches + - **Source**: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 -- **Optimized Implementation sources**: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f with copy_from_upstream patches +- **Optimized Implementation sources**: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches - **oldpqclean-aarch64**: - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT diff --git a/docs/algorithms/sig/ml_dsa.yml b/docs/algorithms/sig/ml_dsa.yml index f0302cc10..763b45a59 100644 --- a/docs/algorithms/sig/ml_dsa.yml +++ b/docs/algorithms/sig/ml_dsa.yml @@ -15,7 +15,7 @@ website: https://pq-crystals.org/dilithium/ nist-round: ipd spec-version: pq-crystals 20230825 primary-upstream: - source: https://github.com/pq-crystals/dilithium/commit/918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f + source: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches spdx-license-identifier: CC0-1.0 or Apache-2.0 optimized-upstreams: diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index 4f07dd58f..a314894f9 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -33,11 +33,10 @@ upstreams: name: pqcrystals-kyber-standard git_url: https://github.com/pq-crystals/kyber.git git_branch: standard - git_commit: bc8e640727b5178eb1c65867d6ba6599b3ad88e5 + git_commit: 11d00ff1f20cfca1f72d819e5a45165c1e0a2816 kem_meta_path: '{pretty_name_full}_META.yml' kem_scheme_path: '.' patches: [pqcrystals-ml_kem_ipd.patch] - #patches: [pqcrystals-kyber-standard-yml.patch, pqcrystals-kyber-standard-ref-shake-aes.patch, pqcrystals-kyber-standard-avx2-shake-aes.patch] - name: pqcrystals-dilithium git_url: https://github.com/pq-crystals/dilithium.git @@ -50,11 +49,10 @@ upstreams: name: pqcrystals-dilithium-standard git_url: https://github.com/pq-crystals/dilithium.git git_branch: standard - git_commit: 918af1a6eaedcedf9fdd8aaaca6c1fccd5a7a51f + git_commit: e7bed6258b9a3703ce78d4ec38021c86382ce31c sig_meta_path: '{pretty_name_full}_META.yml' sig_scheme_path: '.' patches: [pqcrystals-ml_dsa_ipd.patch] - #patches: [pqcrystals-dilithium-standard-yml.patch, pqcrystals-dilithium-standard-ref-shake-aes.patch, pqcrystals-dilithium-standard-avx2-shake-aes.patch] kems: - name: classic_mceliece diff --git a/scripts/copy_from_upstream/patches/pqcrystals-ml_dsa_ipd.patch b/scripts/copy_from_upstream/patches/pqcrystals-ml_dsa_ipd.patch index 340d28b67..58e1cf34d 100644 --- a/scripts/copy_from_upstream/patches/pqcrystals-ml_dsa_ipd.patch +++ b/scripts/copy_from_upstream/patches/pqcrystals-ml_dsa_ipd.patch @@ -1,38 +1,42 @@ -diff --git a/Dilithium2_META.yml b/Dilithium2_META.yml -deleted file mode 100644 -index 0e2e6fc..0000000 +diff --git a/Dilithium2_META.yml b/ML-DSA-44-ipd_META.yml +index 0e2e6fc..d99edb5 100644 --- a/Dilithium2_META.yml -+++ /dev/null -@@ -1,44 +0,0 @@ ++++ b/ML-DSA-44-ipd_META.yml +@@ -1,11 +1,11 @@ -name: Dilithium2 --type: signature --claimed-nist-level: 2 --length-public-key: 1312 ++name: ML-DSA-44-ipd + type: signature + claimed-nist-level: 2 + length-public-key: 1312 -length-secret-key: 2528 --length-signature: 2420 ++length-secret-key: 2560 + length-signature: 2420 -nistkat-sha256: 26ae9c1224171e957dbe38672942d31edb7dffbe700825e0cb52128cdb45280a -testvectors-sha256: b56155479f5643a3cb3d73260ba2b1fd7e772a49b6f4cebcf742cd860fbf6879 --principal-submitters: -- - Vadim Lyubashevsky --auxiliary-submitters: -- - Shi Bai -- - Léo Ducas -- - Eike Kiltz -- - Tancrède Lepoint -- - Peter Schwabe -- - Gregor Seiler -- - Damien Stehlé --implementations: -- - name: ref ++nistkat-sha256: e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1 ++testvectors-sha256: aff4dbcb0c5ad52c840036907661efd2cafd6c1cba95ed052184f45adf30f365 + principal-submitters: + - Vadim Lyubashevsky + auxiliary-submitters: +@@ -18,22 +18,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 -- folder_name: ref ++ version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref - compile_opts: -DDILITHIUM_MODE=2 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium2_ref_keypair - signature_signature: pqcrystals_dilithium2_ref_signature - signature_verify: pqcrystals_dilithium2_ref_verify - sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c - common_dep: common_ref -- - name: avx2 ++ compile_opts: -DDILITHIUM_MODE=2 ++ signature_keypair: pqcrystals_ml_dsa_44_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_44_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_44_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 - compile_opts: -DDILITHIUM_MODE=2 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium2_avx2_keypair @@ -40,49 +44,55 @@ index 0e2e6fc..0000000 - signature_verify: pqcrystals_dilithium2_avx2_verify - sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c - common_dep: common_avx2 -- supported_platforms: -- - architecture: x86_64 -- operating_systems: -- - Darwin -- - Linux -- required_flags: -- - avx2 -- - popcnt -diff --git a/Dilithium3_META.yml b/Dilithium3_META.yml -deleted file mode 100644 -index d1bca64..0000000 ++ version: https://github.com/pq-crystals/dilithium/tree/standard ++ compile_opts: -DDILITHIUM_MODE=2 ++ signature_keypair: pqcrystals_ml_dsa_44_ipd_avx2_keypair ++ signature_signature: pqcrystals_ml_dsa_44_ipd_avx2_signature ++ signature_verify: pqcrystals_ml_dsa_44_ipd_avx2_verify ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium3_META.yml b/ML-DSA-65-ipd_META.yml +index d1bca64..72a43e7 100644 --- a/Dilithium3_META.yml -+++ /dev/null -@@ -1,44 +0,0 @@ ++++ b/ML-DSA-65-ipd_META.yml +@@ -1,11 +1,11 @@ -name: Dilithium3 --type: signature --claimed-nist-level: 3 --length-public-key: 1952 ++name: ML-DSA-65-ipd + type: signature + claimed-nist-level: 3 + length-public-key: 1952 -length-secret-key: 4000 -length-signature: 3293 -nistkat-sha256: eea584803c3d6991a4acbf9f117147bbdd246faf822cfb1a17effe20b2052ba9 -testvectors-sha256: a237032c7840a0d2f922951f806c2199f8f86b8a8947f6f6f1b856c925222958 --principal-submitters: -- - Vadim Lyubashevsky --auxiliary-submitters: -- - Shi Bai -- - Léo Ducas -- - Eike Kiltz -- - Tancrède Lepoint -- - Peter Schwabe -- - Gregor Seiler -- - Damien Stehlé --implementations: -- - name: ref ++length-secret-key: 4032 ++length-signature: 3309 ++nistkat-sha256: 7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7 ++testvectors-sha256: e0a98c0a29137dcbeb12104ccaa6a0555a9bdb4dcfbc2b0fc9a959dd8b6c8699 + principal-submitters: + - Vadim Lyubashevsky + auxiliary-submitters: +@@ -18,22 +18,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 -- folder_name: ref ++ version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref - compile_opts: -DDILITHIUM_MODE=3 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium3_ref_keypair - signature_signature: pqcrystals_dilithium3_ref_signature - signature_verify: pqcrystals_dilithium3_ref_verify - sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c - common_dep: common_ref -- - name: avx2 ++ compile_opts: -DDILITHIUM_MODE=3 ++ signature_keypair: pqcrystals_ml_dsa_65_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_65_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_65_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 - compile_opts: -DDILITHIUM_MODE=3 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium3_avx2_keypair @@ -90,49 +100,55 @@ index d1bca64..0000000 - signature_verify: pqcrystals_dilithium3_avx2_verify - sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c - common_dep: common_avx2 -- supported_platforms: -- - architecture: x86_64 -- operating_systems: -- - Darwin -- - Linux -- required_flags: -- - avx2 -- - popcnt -diff --git a/Dilithium5_META.yml b/Dilithium5_META.yml -deleted file mode 100644 -index a4dbdbf..0000000 ++ version: https://github.com/pq-crystals/dilithium/tree/standard ++ compile_opts: -DDILITHIUM_MODE=3 ++ signature_keypair: pqcrystals_ml_dsa_65_ipd_avx2_keypair ++ signature_signature: pqcrystals_ml_dsa_65_ipd_avx2_signature ++ signature_verify: pqcrystals_ml_dsa_65_ipd_avx2_verify ++ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c + supported_platforms: + - architecture: x86_64 + operating_systems: +diff --git a/Dilithium5_META.yml b/ML-DSA-87-ipd_META.yml +index a4dbdbf..bf68590 100644 --- a/Dilithium5_META.yml -+++ /dev/null -@@ -1,44 +0,0 @@ ++++ b/ML-DSA-87-ipd_META.yml +@@ -1,11 +1,11 @@ -name: Dilithium5 --type: signature --claimed-nist-level: 5 --length-public-key: 2592 ++name: ML-DSA-87-ipd + type: signature + claimed-nist-level: 5 + length-public-key: 2592 -length-secret-key: 4864 -length-signature: 4595 -nistkat-sha256: 3f6e58603a38be57cf08d79b01fcfd0ccc1129a09e14a6122c6fe22c906ddc3b -testvectors-sha256: ddeb95f4a743562010bce527ea7c99fed4ce1234bafd5ed6f44eea0f065ba49c --principal-submitters: -- - Vadim Lyubashevsky --auxiliary-submitters: -- - Shi Bai -- - Léo Ducas -- - Eike Kiltz -- - Tancrède Lepoint -- - Peter Schwabe -- - Gregor Seiler -- - Damien Stehlé --implementations: -- - name: ref ++length-secret-key: 4896 ++length-signature: 4627 ++nistkat-sha256: f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f ++testvectors-sha256: 9a1985c10b13efefee50067edf3432ed8ab48a62965743feb45a317485980883 + principal-submitters: + - Vadim Lyubashevsky + auxiliary-submitters: +@@ -18,22 +18,20 @@ auxiliary-submitters: + - Damien Stehlé + implementations: + - name: ref - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 -- folder_name: ref ++ version: https://github.com/pq-crystals/dilithium/tree/standard + folder_name: ref - compile_opts: -DDILITHIUM_MODE=5 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium5_ref_keypair - signature_signature: pqcrystals_dilithium5_ref_signature - signature_verify: pqcrystals_dilithium5_ref_verify - sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h fips202.h symmetric-shake.c - common_dep: common_ref -- - name: avx2 ++ compile_opts: -DDILITHIUM_MODE=5 ++ signature_keypair: pqcrystals_ml_dsa_87_ipd_ref_keypair ++ signature_signature: pqcrystals_ml_dsa_87_ipd_ref_signature ++ signature_verify: pqcrystals_ml_dsa_87_ipd_ref_verify ++ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c + - name: avx2 - version: https://github.com/pq-crystals/dilithium/commit/d9c885d3f2e11c05529eeeb7d70d808c972b8409 - compile_opts: -DDILITHIUM_MODE=5 -DDILITHIUM_RANDOMIZED_SIGNING - signature_keypair: pqcrystals_dilithium5_avx2_keypair @@ -140,158 +156,15 @@ index a4dbdbf..0000000 - signature_verify: pqcrystals_dilithium5_avx2_verify - sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h fips202.h fips202x4.h symmetric-shake.c - common_dep: common_avx2 -- supported_platforms: -- - architecture: x86_64 -- operating_systems: -- - Darwin -- - Linux -- required_flags: -- - avx2 -- - popcnt -diff --git a/ML-DSA-44-ipd_META.yml b/ML-DSA-44-ipd_META.yml -new file mode 100644 -index 0000000..d99edb5 ---- /dev/null -+++ b/ML-DSA-44-ipd_META.yml -@@ -0,0 +1,42 @@ -+name: ML-DSA-44-ipd -+type: signature -+claimed-nist-level: 2 -+length-public-key: 1312 -+length-secret-key: 2560 -+length-signature: 2420 -+nistkat-sha256: e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1 -+testvectors-sha256: aff4dbcb0c5ad52c840036907661efd2cafd6c1cba95ed052184f45adf30f365 -+principal-submitters: -+ - Vadim Lyubashevsky -+auxiliary-submitters: -+ - Shi Bai -+ - Léo Ducas -+ - Eike Kiltz -+ - Tancrède Lepoint -+ - Peter Schwabe -+ - Gregor Seiler -+ - Damien Stehlé -+implementations: -+ - name: ref -+ version: https://github.com/pq-crystals/dilithium/tree/standard -+ folder_name: ref -+ compile_opts: -DDILITHIUM_MODE=2 -+ signature_keypair: pqcrystals_ml_dsa_44_ipd_ref_keypair -+ signature_signature: pqcrystals_ml_dsa_44_ipd_ref_signature -+ signature_verify: pqcrystals_ml_dsa_44_ipd_ref_verify -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ - name: avx2 -+ version: https://github.com/pq-crystals/dilithium/tree/standard -+ compile_opts: -DDILITHIUM_MODE=2 -+ signature_keypair: pqcrystals_ml_dsa_44_ipd_avx2_keypair -+ signature_signature: pqcrystals_ml_dsa_44_ipd_avx2_signature -+ signature_verify: pqcrystals_ml_dsa_44_ipd_avx2_verify -+ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ supported_platforms: -+ - architecture: x86_64 -+ operating_systems: -+ - Darwin -+ - Linux -+ required_flags: -+ - avx2 -+ - popcnt -diff --git a/ML-DSA-65-ipd_META.yml b/ML-DSA-65-ipd_META.yml -new file mode 100644 -index 0000000..72a43e7 ---- /dev/null -+++ b/ML-DSA-65-ipd_META.yml -@@ -0,0 +1,42 @@ -+name: ML-DSA-65-ipd -+type: signature -+claimed-nist-level: 3 -+length-public-key: 1952 -+length-secret-key: 4032 -+length-signature: 3309 -+nistkat-sha256: 7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7 -+testvectors-sha256: e0a98c0a29137dcbeb12104ccaa6a0555a9bdb4dcfbc2b0fc9a959dd8b6c8699 -+principal-submitters: -+ - Vadim Lyubashevsky -+auxiliary-submitters: -+ - Shi Bai -+ - Léo Ducas -+ - Eike Kiltz -+ - Tancrède Lepoint -+ - Peter Schwabe -+ - Gregor Seiler -+ - Damien Stehlé -+implementations: -+ - name: ref -+ version: https://github.com/pq-crystals/dilithium/tree/standard -+ folder_name: ref -+ compile_opts: -DDILITHIUM_MODE=3 -+ signature_keypair: pqcrystals_ml_dsa_65_ipd_ref_keypair -+ signature_signature: pqcrystals_ml_dsa_65_ipd_ref_signature -+ signature_verify: pqcrystals_ml_dsa_65_ipd_ref_verify -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ - name: avx2 -+ version: https://github.com/pq-crystals/dilithium/tree/standard -+ compile_opts: -DDILITHIUM_MODE=3 -+ signature_keypair: pqcrystals_ml_dsa_65_ipd_avx2_keypair -+ signature_signature: pqcrystals_ml_dsa_65_ipd_avx2_signature -+ signature_verify: pqcrystals_ml_dsa_65_ipd_avx2_verify -+ sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ supported_platforms: -+ - architecture: x86_64 -+ operating_systems: -+ - Darwin -+ - Linux -+ required_flags: -+ - avx2 -+ - popcnt -diff --git a/ML-DSA-87-ipd_META.yml b/ML-DSA-87-ipd_META.yml -new file mode 100644 -index 0000000..bf68590 ---- /dev/null -+++ b/ML-DSA-87-ipd_META.yml -@@ -0,0 +1,42 @@ -+name: ML-DSA-87-ipd -+type: signature -+claimed-nist-level: 5 -+length-public-key: 2592 -+length-secret-key: 4896 -+length-signature: 4627 -+nistkat-sha256: f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f -+testvectors-sha256: 9a1985c10b13efefee50067edf3432ed8ab48a62965743feb45a317485980883 -+principal-submitters: -+ - Vadim Lyubashevsky -+auxiliary-submitters: -+ - Shi Bai -+ - Léo Ducas -+ - Eike Kiltz -+ - Tancrède Lepoint -+ - Peter Schwabe -+ - Gregor Seiler -+ - Damien Stehlé -+implementations: -+ - name: ref -+ version: https://github.com/pq-crystals/dilithium/tree/standard -+ folder_name: ref -+ compile_opts: -DDILITHIUM_MODE=5 -+ signature_keypair: pqcrystals_ml_dsa_87_ipd_ref_keypair -+ signature_signature: pqcrystals_ml_dsa_87_ipd_ref_signature -+ signature_verify: pqcrystals_ml_dsa_87_ipd_ref_verify -+ sources: ../LICENSE api.h config.h params.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.c ntt.h reduce.c reduce.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ - name: avx2 + version: https://github.com/pq-crystals/dilithium/tree/standard + compile_opts: -DDILITHIUM_MODE=5 + signature_keypair: pqcrystals_ml_dsa_87_ipd_avx2_keypair + signature_signature: pqcrystals_ml_dsa_87_ipd_avx2_signature + signature_verify: pqcrystals_ml_dsa_87_ipd_avx2_verify + sources: ../LICENSE api.h config.h params.h align.h sign.c sign.h packing.c packing.h polyvec.c polyvec.h poly.c poly.h ntt.S invntt.S pointwise.S ntt.h shuffle.S shuffle.inc consts.c consts.h rejsample.c rejsample.h rounding.c rounding.h symmetric.h symmetric-shake.c -+ supported_platforms: -+ - architecture: x86_64 -+ operating_systems: -+ - Darwin -+ - Linux -+ required_flags: -+ - avx2 -+ - popcnt + supported_platforms: + - architecture: x86_64 + operating_systems: diff --git a/README.md b/README.md index 5a5d48d..d6b337a 100644 --- a/README.md @@ -655,36 +528,23 @@ index 8f3c3c5..fa49963 100644 #endif diff --git a/ref/api.h b/ref/api.h -index cd364e5..78caa5c 100644 +index cc5c6fe..78caa5c 100644 --- a/ref/api.h +++ b/ref/api.h -@@ -5,7 +5,7 @@ - #include - - #define pqcrystals_dilithium2_PUBLICKEYBYTES 1312 --#define pqcrystals_dilithium2_SECRETKEYBYTES 2528 -+#define pqcrystals_dilithium2_SECRETKEYBYTES 2560 - #define pqcrystals_dilithium2_BYTES 2420 - - #define pqcrystals_dilithium2_ref_PUBLICKEYBYTES pqcrystals_dilithium2_PUBLICKEYBYTES -@@ -32,8 +32,8 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, - +@@ -33,7 +33,7 @@ int pqcrystals_dilithium2_ref_open(uint8_t *m, size_t *mlen, #define pqcrystals_dilithium3_PUBLICKEYBYTES 1952 --#define pqcrystals_dilithium3_SECRETKEYBYTES 4000 + #define pqcrystals_dilithium3_SECRETKEYBYTES 4032 -#define pqcrystals_dilithium3_BYTES 3293 -+#define pqcrystals_dilithium3_SECRETKEYBYTES 4032 +#define pqcrystals_dilithium3_BYTES 3309 #define pqcrystals_dilithium3_ref_PUBLICKEYBYTES pqcrystals_dilithium3_PUBLICKEYBYTES #define pqcrystals_dilithium3_ref_SECRETKEYBYTES pqcrystals_dilithium3_SECRETKEYBYTES -@@ -59,8 +59,8 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, - +@@ -60,7 +60,7 @@ int pqcrystals_dilithium3_ref_open(uint8_t *m, size_t *mlen, #define pqcrystals_dilithium5_PUBLICKEYBYTES 2592 --#define pqcrystals_dilithium5_SECRETKEYBYTES 4864 + #define pqcrystals_dilithium5_SECRETKEYBYTES 4896 -#define pqcrystals_dilithium5_BYTES 4595 -+#define pqcrystals_dilithium5_SECRETKEYBYTES 4896 +#define pqcrystals_dilithium5_BYTES 4627 #define pqcrystals_dilithium5_ref_PUBLICKEYBYTES pqcrystals_dilithium5_PUBLICKEYBYTES @@ -751,7 +611,7 @@ index 1e8e9e7..8e47728 100644 #endif diff --git a/ref/poly.c b/ref/poly.c -index 054ed98..d44063f 100644 +index fe3b787..7983aac 100644 --- a/ref/poly.c +++ b/ref/poly.c @@ -365,6 +365,7 @@ void poly_uniform(poly *a, diff --git a/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch b/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch index 5ea885534..ba138bf3c 100644 --- a/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch +++ b/scripts/copy_from_upstream/patches/pqcrystals-ml_kem_ipd.patch @@ -1,7 +1,4 @@ diff --git a/Kyber1024_META.yml b/ML-KEM-1024-ipd_META.yml -similarity index 55% -rename from Kyber1024_META.yml -rename to ML-KEM-1024-ipd_META.yml index baa5ca3..ffafcf0 100644 --- a/Kyber1024_META.yml +++ b/ML-KEM-1024-ipd_META.yml @@ -56,9 +53,6 @@ index baa5ca3..ffafcf0 100644 - architecture: x86_64 operating_systems: diff --git a/Kyber512_META.yml b/ML-KEM-512-ipd_META.yml -similarity index 55% -rename from Kyber512_META.yml -rename to ML-KEM-512-ipd_META.yml index b251701..d20f0b1 100644 --- a/Kyber512_META.yml +++ b/ML-KEM-512-ipd_META.yml @@ -113,9 +107,6 @@ index b251701..d20f0b1 100644 - architecture: x86_64 operating_systems: diff --git a/Kyber768_META.yml b/ML-KEM-768-ipd_META.yml -similarity index 55% -rename from Kyber768_META.yml -rename to ML-KEM-768-ipd_META.yml index 7a0cc3d..e768cd5 100644 --- a/Kyber768_META.yml +++ b/ML-KEM-768-ipd_META.yml @@ -395,33 +386,6 @@ index 0802c74..36b2b98 100644 #else #error "KYBER_K must be in {2,3,4}" #endif -diff --git a/ref/poly.c b/ref/poly.c -index 017cacf..9556ee5 100644 ---- a/ref/poly.c -+++ b/ref/poly.c -@@ -180,19 +180,14 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) - void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) - { - unsigned int i,j; -- uint32_t t; -+ uint16_t t; - - for(i=0;icoeffs[8*i+j]; -- // t += ((int16_t)t >> 15) & KYBER_Q; -- // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; -- t <<= 1; -- t += 1665; -- t *= 80635; -- t >>= 28; -- t &= 1; -+ t += ((int16_t)t >> 15) & KYBER_Q; -+ t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; - msg[i] |= t << j; - } - } diff --git a/ref/symmetric-shake.c b/ref/symmetric-shake.c index 6a99071..20f4518 100644 --- a/ref/symmetric-shake.c diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c index 96bad864f..681fd6d23 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c @@ -23,94 +23,7 @@ * (of length KYBER_POLYCOMPRESSEDBYTES) * - const poly *a: pointer to input polynomial **************************************************/ -#if (KYBER_POLYCOMPRESSEDBYTES == 96) -void poly_compress(uint8_t r[96], const poly * restrict a) -{ - unsigned int i; - __m256i f0, f1, f2, f3; - __m128i t0, t1; - const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); - const __m256i shift1 = _mm256_set1_epi16(1 << 8); - const __m256i mask = _mm256_set1_epi16(7); - const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); - const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); - const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); - const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, - -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); - - for(i=0;ivec[4*i+0]); - f1 = _mm256_load_si256(&a->vec[4*i+1]); - f2 = _mm256_load_si256(&a->vec[4*i+2]); - f3 = _mm256_load_si256(&a->vec[4*i+3]); - f0 = _mm256_mulhi_epi16(f0,v); - f1 = _mm256_mulhi_epi16(f1,v); - f2 = _mm256_mulhi_epi16(f2,v); - f3 = _mm256_mulhi_epi16(f3,v); - f0 = _mm256_mulhrs_epi16(f0,shift1); - f1 = _mm256_mulhrs_epi16(f1,shift1); - f2 = _mm256_mulhrs_epi16(f2,shift1); - f3 = _mm256_mulhrs_epi16(f3,shift1); - f0 = _mm256_and_si256(f0,mask); - f1 = _mm256_and_si256(f1,mask); - f2 = _mm256_and_si256(f2,mask); - f3 = _mm256_and_si256(f3,mask); - f0 = _mm256_packus_epi16(f0,f1); - f2 = _mm256_packus_epi16(f2,f3); - f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 - f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 - f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 - f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 - f0 = _mm256_sllv_epi32(f0,sllvdidx); - f2 = _mm256_sllv_epi32(f2,sllvdidx); - f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 - f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 - f0 = _mm256_shuffle_epi8(f0,shufbidx); - t0 = _mm256_castsi256_si128(f0); - t1 = _mm256_extracti128_si256(f0,1); - t0 = _mm_blend_epi32(t0,t1,0x08); - _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); - _mm_storel_epi64((__m128i *)&r[24*i+16],t1); - } -} - -/************************************************* -* Name: poly_decompress -* -* Description: De-serialization and subsequent decompression of a polynomial; -* approximate inverse of poly_compress -* -* Arguments: - poly *r: pointer to output polynomial -* - const uint8_t *a: pointer to input byte array -* (of length KYBER_POLYCOMPRESSEDBYTES bytes) -**************************************************/ -void poly_decompress(poly * restrict r, const uint8_t a[96]) -{ - unsigned int i; - __m128i t; - __m256i f; - const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); - const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, - 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); - const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, - 224,28,896,112,14,448,56,7); - const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, - 128,1024,32,256,2048,64,512,4096); - - for(i=0;ivec[i],f); - } -} - -#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +#if (KYBER_POLYCOMPRESSEDBYTES == 128) void poly_compress(uint8_t r[128], const poly * restrict a) { unsigned int i; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c index 9556ee517..0fe5a20f6 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c @@ -18,16 +18,23 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) { unsigned int i,j; - int16_t u; + int32_t u; + uint32_t d0; uint8_t t[8]; #if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; +/* t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; */ + d0 = u << 4; + d0 += 1665; + d0 *= 80635; + d0 >>= 28; + t[j] = d0 & 0xf; } r[0] = t[0] | (t[1] << 4); @@ -42,7 +49,12 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) // map to positive standard representatives u = a->coeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; +/* t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; */ + d0 = u << 5; + d0 += 1664; + d0 *= 40318; + d0 >>= 27; + t[j] = d0 & 0x1f; } r[0] = (t[0] >> 0) | (t[1] << 5); @@ -180,14 +192,19 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) { unsigned int i,j; - uint16_t t; + uint32_t t; for(i=0;icoeffs[8*i+j]; - t += ((int16_t)t >> 15) & KYBER_Q; - t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + // t += ((int16_t)t >> 15) & KYBER_Q; + // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + t <<= 1; + t += 1665; + t *= 80635; + t >>= 28; + t &= 1; msg[i] |= t << j; } } diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c index 8420d069c..661c71ec3 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c @@ -15,6 +15,7 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) { unsigned int i,j,k; + uint64_t d0; #if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) uint16_t t[8]; @@ -23,7 +24,14 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<8;k++) { t[k] = a->vec[i].coeffs[8*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; +/* t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; */ + d0 = t[k]; + d0 <<= 11; + d0 += 1664; + d0 *= 645084; + d0 >>= 31; + t[k] = d0 & 0x7ff; + } r[ 0] = (t[0] >> 0); @@ -47,7 +55,13 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<4;k++) { t[k] = a->vec[i].coeffs[4*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; +/* t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; */ + d0 = t[k]; + d0 <<= 10; + d0 += 1665; + d0 *= 1290167; + d0 >>= 32; + t[k] = d0 & 0x3ff; } r[0] = (t[0] >> 0); diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c index 96bad864f..681fd6d23 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c @@ -23,94 +23,7 @@ * (of length KYBER_POLYCOMPRESSEDBYTES) * - const poly *a: pointer to input polynomial **************************************************/ -#if (KYBER_POLYCOMPRESSEDBYTES == 96) -void poly_compress(uint8_t r[96], const poly * restrict a) -{ - unsigned int i; - __m256i f0, f1, f2, f3; - __m128i t0, t1; - const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); - const __m256i shift1 = _mm256_set1_epi16(1 << 8); - const __m256i mask = _mm256_set1_epi16(7); - const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); - const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); - const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); - const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, - -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); - - for(i=0;ivec[4*i+0]); - f1 = _mm256_load_si256(&a->vec[4*i+1]); - f2 = _mm256_load_si256(&a->vec[4*i+2]); - f3 = _mm256_load_si256(&a->vec[4*i+3]); - f0 = _mm256_mulhi_epi16(f0,v); - f1 = _mm256_mulhi_epi16(f1,v); - f2 = _mm256_mulhi_epi16(f2,v); - f3 = _mm256_mulhi_epi16(f3,v); - f0 = _mm256_mulhrs_epi16(f0,shift1); - f1 = _mm256_mulhrs_epi16(f1,shift1); - f2 = _mm256_mulhrs_epi16(f2,shift1); - f3 = _mm256_mulhrs_epi16(f3,shift1); - f0 = _mm256_and_si256(f0,mask); - f1 = _mm256_and_si256(f1,mask); - f2 = _mm256_and_si256(f2,mask); - f3 = _mm256_and_si256(f3,mask); - f0 = _mm256_packus_epi16(f0,f1); - f2 = _mm256_packus_epi16(f2,f3); - f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 - f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 - f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 - f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 - f0 = _mm256_sllv_epi32(f0,sllvdidx); - f2 = _mm256_sllv_epi32(f2,sllvdidx); - f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 - f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 - f0 = _mm256_shuffle_epi8(f0,shufbidx); - t0 = _mm256_castsi256_si128(f0); - t1 = _mm256_extracti128_si256(f0,1); - t0 = _mm_blend_epi32(t0,t1,0x08); - _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); - _mm_storel_epi64((__m128i *)&r[24*i+16],t1); - } -} - -/************************************************* -* Name: poly_decompress -* -* Description: De-serialization and subsequent decompression of a polynomial; -* approximate inverse of poly_compress -* -* Arguments: - poly *r: pointer to output polynomial -* - const uint8_t *a: pointer to input byte array -* (of length KYBER_POLYCOMPRESSEDBYTES bytes) -**************************************************/ -void poly_decompress(poly * restrict r, const uint8_t a[96]) -{ - unsigned int i; - __m128i t; - __m256i f; - const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); - const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, - 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); - const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, - 224,28,896,112,14,448,56,7); - const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, - 128,1024,32,256,2048,64,512,4096); - - for(i=0;ivec[i],f); - } -} - -#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +#if (KYBER_POLYCOMPRESSEDBYTES == 128) void poly_compress(uint8_t r[128], const poly * restrict a) { unsigned int i; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c index 9556ee517..0fe5a20f6 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c @@ -18,16 +18,23 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) { unsigned int i,j; - int16_t u; + int32_t u; + uint32_t d0; uint8_t t[8]; #if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; +/* t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; */ + d0 = u << 4; + d0 += 1665; + d0 *= 80635; + d0 >>= 28; + t[j] = d0 & 0xf; } r[0] = t[0] | (t[1] << 4); @@ -42,7 +49,12 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) // map to positive standard representatives u = a->coeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; +/* t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; */ + d0 = u << 5; + d0 += 1664; + d0 *= 40318; + d0 >>= 27; + t[j] = d0 & 0x1f; } r[0] = (t[0] >> 0) | (t[1] << 5); @@ -180,14 +192,19 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) { unsigned int i,j; - uint16_t t; + uint32_t t; for(i=0;icoeffs[8*i+j]; - t += ((int16_t)t >> 15) & KYBER_Q; - t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + // t += ((int16_t)t >> 15) & KYBER_Q; + // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + t <<= 1; + t += 1665; + t *= 80635; + t >>= 28; + t &= 1; msg[i] |= t << j; } } diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c index 8420d069c..661c71ec3 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c @@ -15,6 +15,7 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) { unsigned int i,j,k; + uint64_t d0; #if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) uint16_t t[8]; @@ -23,7 +24,14 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<8;k++) { t[k] = a->vec[i].coeffs[8*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; +/* t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; */ + d0 = t[k]; + d0 <<= 11; + d0 += 1664; + d0 *= 645084; + d0 >>= 31; + t[k] = d0 & 0x7ff; + } r[ 0] = (t[0] >> 0); @@ -47,7 +55,13 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<4;k++) { t[k] = a->vec[i].coeffs[4*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; +/* t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; */ + d0 = t[k]; + d0 <<= 10; + d0 += 1665; + d0 *= 1290167; + d0 >>= 32; + t[k] = d0 & 0x3ff; } r[0] = (t[0] >> 0); diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c index 96bad864f..681fd6d23 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c @@ -23,94 +23,7 @@ * (of length KYBER_POLYCOMPRESSEDBYTES) * - const poly *a: pointer to input polynomial **************************************************/ -#if (KYBER_POLYCOMPRESSEDBYTES == 96) -void poly_compress(uint8_t r[96], const poly * restrict a) -{ - unsigned int i; - __m256i f0, f1, f2, f3; - __m128i t0, t1; - const __m256i v = _mm256_load_si256(&qdata.vec[_16XV/16]); - const __m256i shift1 = _mm256_set1_epi16(1 << 8); - const __m256i mask = _mm256_set1_epi16(7); - const __m256i shift2 = _mm256_set1_epi16((8 << 8) + 1); - const __m256i shift3 = _mm256_set1_epi32((64 << 16) + 1); - const __m256i sllvdidx = _mm256_set1_epi64x(12LL << 32); - const __m256i shufbidx = _mm256_set_epi8( 8, 2, 1, 0,-1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, - -1,-1,-1,-1,14,13,12, 6, 5, 4,10, 9, 8, 2, 1, 0); - - for(i=0;ivec[4*i+0]); - f1 = _mm256_load_si256(&a->vec[4*i+1]); - f2 = _mm256_load_si256(&a->vec[4*i+2]); - f3 = _mm256_load_si256(&a->vec[4*i+3]); - f0 = _mm256_mulhi_epi16(f0,v); - f1 = _mm256_mulhi_epi16(f1,v); - f2 = _mm256_mulhi_epi16(f2,v); - f3 = _mm256_mulhi_epi16(f3,v); - f0 = _mm256_mulhrs_epi16(f0,shift1); - f1 = _mm256_mulhrs_epi16(f1,shift1); - f2 = _mm256_mulhrs_epi16(f2,shift1); - f3 = _mm256_mulhrs_epi16(f3,shift1); - f0 = _mm256_and_si256(f0,mask); - f1 = _mm256_and_si256(f1,mask); - f2 = _mm256_and_si256(f2,mask); - f3 = _mm256_and_si256(f3,mask); - f0 = _mm256_packus_epi16(f0,f1); - f2 = _mm256_packus_epi16(f2,f3); - f0 = _mm256_maddubs_epi16(f0,shift2); // a0 a1 a2 a3 b0 b1 b2 b3 a4 a5 a6 a7 b4 b5 b6 b7 - f2 = _mm256_maddubs_epi16(f2,shift2); // c0 c1 c2 c3 d0 d1 d2 d3 c4 c5 c6 c7 d4 d5 d6 d7 - f0 = _mm256_madd_epi16(f0,shift3); // a0 a1 b0 b1 a2 a3 b2 b3 - f2 = _mm256_madd_epi16(f2,shift3); // c0 c1 d0 d1 c2 c3 d2 d3 - f0 = _mm256_sllv_epi32(f0,sllvdidx); - f2 = _mm256_sllv_epi32(f2,sllvdidx); - f0 = _mm256_hadd_epi32(f0,f2); // a0 c0 c0 d0 a1 b1 c1 d1 - f0 = _mm256_permute4x64_epi64(f0,0xD8); // a0 b0 a1 b1 c0 d0 c1 d1 - f0 = _mm256_shuffle_epi8(f0,shufbidx); - t0 = _mm256_castsi256_si128(f0); - t1 = _mm256_extracti128_si256(f0,1); - t0 = _mm_blend_epi32(t0,t1,0x08); - _mm_storeu_si128((__m128i *)&r[24*i+ 0],t0); - _mm_storel_epi64((__m128i *)&r[24*i+16],t1); - } -} - -/************************************************* -* Name: poly_decompress -* -* Description: De-serialization and subsequent decompression of a polynomial; -* approximate inverse of poly_compress -* -* Arguments: - poly *r: pointer to output polynomial -* - const uint8_t *a: pointer to input byte array -* (of length KYBER_POLYCOMPRESSEDBYTES bytes) -**************************************************/ -void poly_decompress(poly * restrict r, const uint8_t a[96]) -{ - unsigned int i; - __m128i t; - __m256i f; - const __m256i q = _mm256_load_si256(&qdata.vec[_16XQ/16]); - const __m256i shufbidx = _mm256_set_epi8(5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3, - 2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0); - const __m256i mask = _mm256_set_epi16(224,28,896,112,14,448,56,7, - 224,28,896,112,14,448,56,7); - const __m256i shift = _mm256_set_epi16(128,1024,32,256,2048,64,512,4096, - 128,1024,32,256,2048,64,512,4096); - - for(i=0;ivec[i],f); - } -} - -#elif (KYBER_POLYCOMPRESSEDBYTES == 128) +#if (KYBER_POLYCOMPRESSEDBYTES == 128) void poly_compress(uint8_t r[128], const poly * restrict a) { unsigned int i; diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c index 9556ee517..0fe5a20f6 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c @@ -18,16 +18,23 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) { unsigned int i,j; - int16_t u; + int32_t u; + uint32_t d0; uint8_t t[8]; #if (KYBER_POLYCOMPRESSEDBYTES == 128) + for(i=0;icoeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; +/* t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; */ + d0 = u << 4; + d0 += 1665; + d0 *= 80635; + d0 >>= 28; + t[j] = d0 & 0xf; } r[0] = t[0] | (t[1] << 4); @@ -42,7 +49,12 @@ void poly_compress(uint8_t r[KYBER_POLYCOMPRESSEDBYTES], const poly *a) // map to positive standard representatives u = a->coeffs[8*i+j]; u += (u >> 15) & KYBER_Q; - t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; +/* t[j] = ((((uint32_t)u << 5) + KYBER_Q/2)/KYBER_Q) & 31; */ + d0 = u << 5; + d0 += 1664; + d0 *= 40318; + d0 >>= 27; + t[j] = d0 & 0x1f; } r[0] = (t[0] >> 0) | (t[1] << 5); @@ -180,14 +192,19 @@ void poly_frommsg(poly *r, const uint8_t msg[KYBER_INDCPA_MSGBYTES]) void poly_tomsg(uint8_t msg[KYBER_INDCPA_MSGBYTES], const poly *a) { unsigned int i,j; - uint16_t t; + uint32_t t; for(i=0;icoeffs[8*i+j]; - t += ((int16_t)t >> 15) & KYBER_Q; - t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + // t += ((int16_t)t >> 15) & KYBER_Q; + // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1; + t <<= 1; + t += 1665; + t *= 80635; + t >>= 28; + t &= 1; msg[i] |= t << j; } } diff --git a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c index 8420d069c..661c71ec3 100644 --- a/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c +++ b/src/kem/ml_kem/pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c @@ -15,6 +15,7 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) { unsigned int i,j,k; + uint64_t d0; #if (KYBER_POLYVECCOMPRESSEDBYTES == (KYBER_K * 352)) uint16_t t[8]; @@ -23,7 +24,14 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<8;k++) { t[k] = a->vec[i].coeffs[8*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; +/* t[k] = ((((uint32_t)t[k] << 11) + KYBER_Q/2)/KYBER_Q) & 0x7ff; */ + d0 = t[k]; + d0 <<= 11; + d0 += 1664; + d0 *= 645084; + d0 >>= 31; + t[k] = d0 & 0x7ff; + } r[ 0] = (t[0] >> 0); @@ -47,7 +55,13 @@ void polyvec_compress(uint8_t r[KYBER_POLYVECCOMPRESSEDBYTES], const polyvec *a) for(k=0;k<4;k++) { t[k] = a->vec[i].coeffs[4*j+k]; t[k] += ((int16_t)t[k] >> 15) & KYBER_Q; - t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; +/* t[k] = ((((uint32_t)t[k] << 10) + KYBER_Q/2)/ KYBER_Q) & 0x3ff; */ + d0 = t[k]; + d0 <<= 10; + d0 += 1665; + d0 *= 1290167; + d0 >>= 32; + t[k] = d0 & 0x3ff; } r[0] = (t[0] >> 0); diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c index d44063fee..7983aacdd 100644 --- a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c @@ -869,7 +869,7 @@ void polyz_unpack(poly *r, const uint8_t *a) { r->coeffs[2*i+1] = a[5*i+2] >> 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; - r->coeffs[2*i+0] &= 0xFFFFF; + /* r->coeffs[2*i+1] &= 0xFFFFF; */ /* No effect, since we're anyway at 20 bits */ r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c index d44063fee..7983aacdd 100644 --- a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c @@ -869,7 +869,7 @@ void polyz_unpack(poly *r, const uint8_t *a) { r->coeffs[2*i+1] = a[5*i+2] >> 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; - r->coeffs[2*i+0] &= 0xFFFFF; + /* r->coeffs[2*i+1] &= 0xFFFFF; */ /* No effect, since we're anyway at 20 bits */ r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; diff --git a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c index d44063fee..7983aacdd 100644 --- a/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c +++ b/src/sig/ml_dsa/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c @@ -869,7 +869,7 @@ void polyz_unpack(poly *r, const uint8_t *a) { r->coeffs[2*i+1] = a[5*i+2] >> 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+3] << 4; r->coeffs[2*i+1] |= (uint32_t)a[5*i+4] << 12; - r->coeffs[2*i+0] &= 0xFFFFF; + /* r->coeffs[2*i+1] &= 0xFFFFF; */ /* No effect, since we're anyway at 20 bits */ r->coeffs[2*i+0] = GAMMA1 - r->coeffs[2*i+0]; r->coeffs[2*i+1] = GAMMA1 - r->coeffs[2*i+1]; From b3034b10b0d25ede6eaac224b2de84fd31775810 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 10:28:00 +0000 Subject: [PATCH 08/27] scan-build fixes --- tests/vectors_kem.c | 5 ++--- tests/vectors_sig.c | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index 49f81a080..2fddf9f54 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -21,7 +21,7 @@ typedef struct { fixed_prng_state prng_state = { .pos = 0 }; /* Displays hexadecimal strings */ -void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { +static void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { printf("%-20s (%4zu bytes): ", label, len); for (size_t i = 0; i < (len); i++) { printf("%02X", str[i]); @@ -29,7 +29,7 @@ void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { printf("\n"); } -void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { +static void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { size_t i; fprintf(fp, "%s", S); for (i = 0; i < L; i++) { @@ -182,7 +182,6 @@ OQS_STATUS kem_vector(const char *method_name, if (rv != 0) { fprintf(stderr, "[vectors_kem] %s ERROR: shared secrets are not equal\n", method_name); OQS_print_hex_string("ss_decaps", ss_decaps, kem->length_shared_secret); - OQS_print_hex_string("decaps_kprime", decaps_kprime, kem->length_shared_secret); goto err; } diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index a1aedff35..df7d008d4 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -21,7 +21,7 @@ typedef struct { fixed_prng_state prng_state = { .pos = 0 }; /* Displays hexadecimal strings */ -void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { +static void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { printf("%-20s (%4zu bytes): ", label, len); for (size_t i = 0; i < (len); i++) { printf("%02X", str[i]); @@ -29,7 +29,7 @@ void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { printf("\n"); } -void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { +static void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { size_t i; fprintf(fp, "%s", S); for (i = 0; i < L; i++) { From 6563ac5fc1c9875e831118f823b1b9ffeaaa0a2e Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 12:35:26 +0100 Subject: [PATCH 09/27] build fixes --- tests/vectors_kem.c | 13 ------------- tests/vectors_sig.c | 21 --------------------- 2 files changed, 34 deletions(-) diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index 2fddf9f54..04296f17d 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -67,16 +67,6 @@ static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { } } -static inline uint16_t UINT16_TO_BE(const uint16_t x) { - union { - uint16_t val; - uint8_t bytes[2]; - } y; - y.bytes[0] = (x >> 8) & 0xFF; - y.bytes[1] = x & 0xFF; - return y.val; -} - /* HQC-specific functions */ static inline bool is_ml_kem(const char *method_name) { return (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512)) @@ -104,11 +94,8 @@ OQS_STATUS kem_vector(const char *method_name, const uint8_t *decaps_sk, const uint8_t *decaps_ciphertext, const uint8_t *decaps_kprime) { uint8_t *entropy_input; - uint8_t seed[48]; FILE *fh = NULL; OQS_KEM *kem = NULL; - uint8_t *msg = NULL; - size_t msg_len = 0; uint8_t *public_key = NULL; uint8_t *secret_key = NULL; uint8_t *ss_encaps = NULL; diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index df7d008d4..1cc2c08d1 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -20,15 +20,6 @@ typedef struct { fixed_prng_state prng_state = { .pos = 0 }; -/* Displays hexadecimal strings */ -static void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { - printf("%-20s (%4zu bytes): ", label, len); - for (size_t i = 0; i < (len); i++) { - printf("%02X", str[i]); - } - printf("\n"); -} - static void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { size_t i; fprintf(fp, "%s", S); @@ -67,16 +58,6 @@ static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { } } -static inline uint16_t UINT16_TO_BE(const uint16_t x) { - union { - uint16_t val; - uint8_t bytes[2]; - } y; - y.bytes[0] = (x >> 8) & 0xFF; - y.bytes[1] = x & 0xFF; - return y.val; -} - /* HQC-specific functions */ static inline bool is_ml_dsa(const char *method_name) { return (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_44)) @@ -104,11 +85,9 @@ OQS_STATUS sig_vector(const char *method_name, const uint8_t *verif_sig, const uint8_t *verif_pk, const uint8_t *verif_msg, size_t verif_msg_len) { uint8_t *entropy_input; - uint8_t seed[48]; FILE *fh = NULL; OQS_SIG *sig = NULL; uint8_t *msg = NULL; - size_t msg_len = 0; uint8_t *public_key = NULL; uint8_t *secret_key = NULL; uint8_t *signature = NULL; From ea20f2ec864e2244bb051038549de1aa72e6203a Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 12:54:31 +0100 Subject: [PATCH 10/27] update after rebase --- tests/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 59821e75a..d9da81647 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -74,7 +74,7 @@ target_link_libraries(test_kem_mem PRIVATE ${TEST_DEPS}) add_executable(speed_kem speed_kem.c) target_link_libraries(speed_kem PRIVATE ${TEST_DEPS}) -set(KEM_TESTS example_kem kat_kem test_kem test_kem_mem speed_kem) +set(KEM_TESTS example_kem kat_kem test_kem test_kem_mem speed_kem vectors_kem) # SIG API tests add_executable(example_sig example_sig.c) @@ -92,17 +92,17 @@ target_link_libraries(test_sig_mem PRIVATE ${TEST_DEPS}) add_executable(speed_sig speed_sig.c) target_link_libraries(speed_sig PRIVATE ${TEST_DEPS}) -set(SIG_TESTS example_sig kat_sig test_sig test_sig_mem speed_sig) +set(SIG_TESTS example_sig kat_sig test_sig test_sig_mem speed_sig vectors_sig) add_executable(dump_alg_info dump_alg_info.c) target_link_libraries(dump_alg_info PRIVATE ${TEST_DEPS}) # Intermediate values vector tests add_executable(vectors_sig vectors_sig.c) -target_link_libraries(vectors_sig PRIVATE ${API_TEST_DEPS}) +target_link_libraries(vectors_sig PRIVATE ${TEST_DEPS}) add_executable(vectors_kem vectors_kem.c) -target_link_libraries(vectors_kem PRIVATE ${API_TEST_DEPS}) +target_link_libraries(vectors_kem PRIVATE ${TEST_DEPS}) # Enable Valgrind-based timing side-channel analysis for test_kem and test_sig if(OQS_ENABLE_TEST_CONSTANT_TIME AND NOT OQS_DEBUG_BUILD) From fab7af6496525e678dcad58881758337993017b2 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 13:30:25 +0100 Subject: [PATCH 11/27] vector tests for CI --- ...vector_test_kem.sh => test_kem_vectors.sh} | 0 ...vector_test_sig.sh => test_sig_vectors.sh} | 0 tests/test_vectors.py | 22 +++++++++++++++++++ tests/{vector_test.sh => test_vectors.sh} | 12 +++++----- 4 files changed, 28 insertions(+), 6 deletions(-) rename tests/{vector_test_kem.sh => test_kem_vectors.sh} (100%) rename tests/{vector_test_sig.sh => test_sig_vectors.sh} (100%) create mode 100644 tests/test_vectors.py rename tests/{vector_test.sh => test_vectors.sh} (75%) diff --git a/tests/vector_test_kem.sh b/tests/test_kem_vectors.sh similarity index 100% rename from tests/vector_test_kem.sh rename to tests/test_kem_vectors.sh diff --git a/tests/vector_test_sig.sh b/tests/test_sig_vectors.sh similarity index 100% rename from tests/vector_test_sig.sh rename to tests/test_sig_vectors.sh diff --git a/tests/test_vectors.py b/tests/test_vectors.py new file mode 100644 index 000000000..1f6f83f08 --- /dev/null +++ b/tests/test_vectors.py @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MIT + +import helpers +import os +import pytest +import re +import sys + +@helpers.filtered_test +@pytest.mark.skipif(sys.platform.startswith("win"), reason="Not needed on Windows") +def test_vectors(): + + result = helpers.run_subprocess( + ['tests/test_vectors.sh'] + ) + + print("Test vectors mismatch.") + print(result) + +if __name__ == "__main__": + import sys + pytest.main(sys.argv) diff --git a/tests/vector_test.sh b/tests/test_vectors.sh similarity index 75% rename from tests/vector_test.sh rename to tests/test_vectors.sh index 06816bcb7..1ce22ea25 100755 --- a/tests/vector_test.sh +++ b/tests/test_vectors.sh @@ -12,7 +12,7 @@ file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-44.txt scheme_name=ML-DSA-44-ipd -sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" if [ $? != 0 ]; then exit 1 fi @@ -22,7 +22,7 @@ file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-65.txt scheme_name=ML-DSA-65-ipd -sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" if [ $? != 0 ]; then exit 1 fi @@ -32,7 +32,7 @@ file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-87.txt scheme_name=ML-DSA-87-ipd -sh tests/vector_test_sig.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" +sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" if [ $? != 0 ]; then exit 1 fi @@ -42,7 +42,7 @@ file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt scheme_name=ML-KEM-512-ipd -sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" if [ $? != 0 ]; then exit 1 fi @@ -52,7 +52,7 @@ file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt scheme_name=ML-KEM-768-ipd -sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" if [ $? != 0 ]; then exit 1 fi @@ -62,7 +62,7 @@ file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt scheme_name=ML-KEM-1024-ipd -sh tests/vector_test_kem.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" +sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" if [ $? != 0 ]; then exit 1 fi \ No newline at end of file From 384070379e5e5f1130d124b19367d0bae2fb5d2f Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 13:59:30 +0000 Subject: [PATCH 12/27] better CI integration --- tests/test_leaks.py | 1 + tests/test_vectors.py | 21 ++++++-- tests/test_vectors.sh | 112 ++++++++++++++++++++++++------------------ 3 files changed, 81 insertions(+), 53 deletions(-) diff --git a/tests/test_leaks.py b/tests/test_leaks.py index 9522cce64..e0e8f395d 100644 --- a/tests/test_leaks.py +++ b/tests/test_leaks.py @@ -3,6 +3,7 @@ import helpers import os import pytest +import re import sys @helpers.filtered_test diff --git a/tests/test_vectors.py b/tests/test_vectors.py index 1f6f83f08..7c3037fb3 100644 --- a/tests/test_vectors.py +++ b/tests/test_vectors.py @@ -8,14 +8,25 @@ @helpers.filtered_test @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not needed on Windows") -def test_vectors(): - +@pytest.mark.parametrize('kem_name', helpers.available_kems_by_name()) +def test_vectors_kem(kem_name): + if not(helpers.is_kem_enabled_by_name(kem_name)): pytest.skip('Not enabled') result = helpers.run_subprocess( - ['tests/test_vectors.sh'] + ['tests/test_vectors.sh', kem_name], ) + if kem_name + " not supported" in result: + pytest.skip("Not supported") - print("Test vectors mismatch.") - print(result) +@helpers.filtered_test +@pytest.mark.skipif(sys.platform.startswith("win"), reason="Not needed on Windows") +@pytest.mark.parametrize('sig_name', helpers.available_sigs_by_name()) +def test_vectors_sig(sig_name): + if not(helpers.is_sig_enabled_by_name(sig_name)): pytest.skip('Not enabled') + result = helpers.run_subprocess( + ['tests/test_vectors.sh', sig_name], + ) + if sig_name + " not supported" in result: + pytest.skip("Not supported") if __name__ == "__main__": import sys diff --git a/tests/test_vectors.sh b/tests/test_vectors.sh index 1ce22ea25..727a2a705 100755 --- a/tests/test_vectors.sh +++ b/tests/test_vectors.sh @@ -7,62 +7,78 @@ else build_dir="${OQS_BUILD_DIR}" fi -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-44.txt -file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-44.txt -file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-44.txt -scheme_name=ML-DSA-44-ipd +if [ "$1" = "ML-DSA-44-ipd" ]; then -sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi + scheme_name=ML-DSA-44-ipd + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-44.txt + file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-44.txt + file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-44.txt + + sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-65.txt -file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-65.txt -file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-65.txt -scheme_name=ML-DSA-65-ipd +elif [ "$1" = "ML-DSA-65-ipd" ]; then -sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-65.txt + file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-65.txt + file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-65.txt + scheme_name=ML-DSA-65-ipd + + sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-87.txt -file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-87.txt -file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-87.txt -scheme_name=ML-DSA-87-ipd +elif [ "$1" = "ML-DSA-87-ipd" ]; then -sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-87.txt + file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-87.txt + file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-87.txt + scheme_name=ML-DSA-87-ipd + + sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt -file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt -file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt -scheme_name=ML-KEM-512-ipd +elif [ "$1" = "ML-KEM-512-ipd" ]; then -sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt + file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt + file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt + scheme_name=ML-KEM-512-ipd + + sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt -file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt -file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt -scheme_name=ML-KEM-768-ipd +elif [ "$1" = "ML-KEM-768-ipd" ]; then -sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt + file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt + file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt + scheme_name=ML-KEM-768-ipd + + sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi + +elif [ "$1" = "ML-KEM-1024-ipd" ]; then -file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt -file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt -file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt -scheme_name=ML-KEM-1024-ipd + file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt + file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt + file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt + scheme_name=ML-KEM-1024-ipd + + sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + if [ $? != 0 ]; then + exit 1 + fi -sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" -if [ $? != 0 ]; then - exit 1 -fi \ No newline at end of file +else + echo "$1 not supported" +fi From d8c10f2b1ec672ad09dd5dcbcd8df1ef2c2d81e5 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 15:18:09 +0000 Subject: [PATCH 13/27] CT tests & suppression files --- tests/constant_time/kem/issues.json | 3 + tests/constant_time/kem/passes.json | 3 + tests/constant_time/kem/passes/ml_kem | 21 +++ tests/constant_time/sig/issues.json | 51 +++---- tests/constant_time/sig/passes.json | 3 + tests/constant_time/sig/passes/ml_dsa | 80 +++++++++++ tests/constant_time/sig/passes/ml_dsa-avx2 | 155 +++++++++++++++++++++ tests/test_vectors.py | 6 +- 8 files changed, 294 insertions(+), 28 deletions(-) create mode 100644 tests/constant_time/kem/passes/ml_kem create mode 100644 tests/constant_time/sig/passes/ml_dsa create mode 100644 tests/constant_time/sig/passes/ml_dsa-avx2 diff --git a/tests/constant_time/kem/issues.json b/tests/constant_time/kem/issues.json index ae0a6a065..ae2f88fa1 100644 --- a/tests/constant_time/kem/issues.json +++ b/tests/constant_time/kem/issues.json @@ -24,5 +24,8 @@ "Kyber1024": [], "Kyber512": [], "Kyber768": [], + "ML-KEM-512-ipd": [], + "ML-KEM-768-ipd": [], + "ML-KEM-1024-ipd": [], "sntrup761": [] } diff --git a/tests/constant_time/kem/passes.json b/tests/constant_time/kem/passes.json index 824f1dae6..0e7959214 100644 --- a/tests/constant_time/kem/passes.json +++ b/tests/constant_time/kem/passes.json @@ -24,5 +24,8 @@ "Kyber1024": ["kyber"], "Kyber512": ["kyber"], "Kyber768": ["kyber"], + "ML-KEM-512-ipd": ["ml_kem"], + "ML-KEM-768-ipd": ["ml_kem"], + "ML-KEM-1024-ipd": ["ml_kem"], "sntrup761": ["sntrup"] } diff --git a/tests/constant_time/kem/passes/ml_kem b/tests/constant_time/kem/passes/ml_kem new file mode 100644 index 000000000..262ec9381 --- /dev/null +++ b/tests/constant_time/kem/passes/ml_kem @@ -0,0 +1,21 @@ +{ + Rejection sampling to produce public "A" matrix + Memcheck:Cond + fun:rej_uniform + fun:pqcrystals_ml_kem*_ref_gen_matrix + fun:pqcrystals_ml_kem*_ref_indcpa_* +} +{ + Rejection sampling to produce public "A" matrix + Memcheck:Cond + ... + fun:pqcrystals_ml_kem*_avx2_gen_matrix + fun:pqcrystals_ml_kem*_avx2_indcpa_* +} +{ + Rejection sampling to produce public "A" matrix + Memcheck:Value8 + ... + fun:pqcrystals_ml_kem*_avx2_gen_matrix + fun:pqcrystals_ml_kem*_avx2_indcpa_* +} diff --git a/tests/constant_time/sig/issues.json b/tests/constant_time/sig/issues.json index 37dc98827..88e4c1d75 100644 --- a/tests/constant_time/sig/issues.json +++ b/tests/constant_time/sig/issues.json @@ -5,28 +5,31 @@ "Dilithium5": [], "Falcon-1024": ["falcon"], "Falcon-512": ["falcon"], - "SPHINCS+-SHA2-128f-robust": ["sphincs"], - "SPHINCS+-SHA2-128f-simple": ["sphincs"], - "SPHINCS+-SHA2-128s-robust": ["sphincs"], - "SPHINCS+-SHA2-128s-simple": ["sphincs"], - "SPHINCS+-SHA2-192f-robust": ["sphincs"], - "SPHINCS+-SHA2-192f-simple": ["sphincs"], - "SPHINCS+-SHA2-192s-robust": ["sphincs"], - "SPHINCS+-SHA2-192s-simple": ["sphincs"], - "SPHINCS+-SHA2-256f-robust": ["sphincs"], - "SPHINCS+-SHA2-256f-simple": ["sphincs"], - "SPHINCS+-SHA2-256s-robust": ["sphincs"], - "SPHINCS+-SHA2-256s-simple": ["sphincs"], - "SPHINCS+-SHAKE-128f-robust": ["sphincs"], - "SPHINCS+-SHAKE-128f-simple": ["sphincs"], - "SPHINCS+-SHAKE-128s-robust": ["sphincs"], - "SPHINCS+-SHAKE-128s-simple": ["sphincs"], - "SPHINCS+-SHAKE-192f-robust": ["sphincs"], - "SPHINCS+-SHAKE-192f-simple": ["sphincs"], - "SPHINCS+-SHAKE-192s-robust": ["sphincs"], - "SPHINCS+-SHAKE-192s-simple": ["sphincs"], - "SPHINCS+-SHAKE-256f-robust": ["sphincs"], - "SPHINCS+-SHAKE-256f-simple": ["sphincs"], - "SPHINCS+-SHAKE-256s-robust": ["sphincs"], - "SPHINCS+-SHAKE-256s-simple": ["sphincs"] + "ML-DSA-44-ipd": [], + "ML-DSA-65-ipd": [], + "ML-DSA-87-ipd": [], + "SPHINCS+-SHA256-128f-robust": ["sphincs"], + "SPHINCS+-SHA256-128f-simple": ["sphincs"], + "SPHINCS+-SHA256-128s-robust": ["sphincs"], + "SPHINCS+-SHA256-128s-simple": ["sphincs"], + "SPHINCS+-SHA256-192f-robust": ["sphincs"], + "SPHINCS+-SHA256-192f-simple": ["sphincs"], + "SPHINCS+-SHA256-192s-robust": ["sphincs"], + "SPHINCS+-SHA256-192s-simple": ["sphincs"], + "SPHINCS+-SHA256-256f-robust": ["sphincs"], + "SPHINCS+-SHA256-256f-simple": ["sphincs"], + "SPHINCS+-SHA256-256s-robust": ["sphincs"], + "SPHINCS+-SHA256-256s-simple": ["sphincs"], + "SPHINCS+-SHAKE256-128f-robust": ["sphincs"], + "SPHINCS+-SHAKE256-128f-simple": ["sphincs"], + "SPHINCS+-SHAKE256-128s-robust": ["sphincs"], + "SPHINCS+-SHAKE256-128s-simple": ["sphincs"], + "SPHINCS+-SHAKE256-192f-robust": ["sphincs"], + "SPHINCS+-SHAKE256-192f-simple": ["sphincs"], + "SPHINCS+-SHAKE256-192s-robust": ["sphincs"], + "SPHINCS+-SHAKE256-192s-simple": ["sphincs"], + "SPHINCS+-SHAKE256-256f-robust": ["sphincs"], + "SPHINCS+-SHAKE256-256f-simple": ["sphincs"], + "SPHINCS+-SHAKE256-256s-robust": ["sphincs"], + "SPHINCS+-SHAKE256-256s-simple": ["sphincs"] } diff --git a/tests/constant_time/sig/passes.json b/tests/constant_time/sig/passes.json index 9d4ea8ba9..8645bbaac 100644 --- a/tests/constant_time/sig/passes.json +++ b/tests/constant_time/sig/passes.json @@ -5,6 +5,9 @@ "Dilithium5": ["dilithium", "dilithium-avx2", "dilithium-aarch64"], "Falcon-1024": ["falcon_keygen", "falcon_sign"], "Falcon-512": ["falcon_keygen", "falcon_sign"], + "ML-DSA-44-ipd": ["ml_dsa", "ml_dsa-avx2"], + "ML-DSA-65-ipd": ["ml_dsa", "ml_dsa-avx2"], + "ML-DSA-87-ipd": ["ml_dsa", "ml_dsa-avx2"], "SPHINCS+-SHA2-128f-robust": ["sphincs", "sphincs-sha2-avx2"], "SPHINCS+-SHA2-128f-simple": ["sphincs", "sphincs-sha2-avx2"], "SPHINCS+-SHA2-128s-robust": ["sphincs", "sphincs-sha2-avx2"], diff --git a/tests/constant_time/sig/passes/ml_dsa b/tests/constant_time/sig/passes/ml_dsa new file mode 100644 index 000000000..f38940135 --- /dev/null +++ b/tests/constant_time/sig/passes/ml_dsa @@ -0,0 +1,80 @@ +{ + Rejection sampling for uniformly distributed public A matrix + Memcheck:Cond + fun:rej_uniform + fun:pqcrystals_ml_dsa*_ref_poly_uniform + fun:pqcrystals_ml_dsa*_ref_polyvec_matrix_expand +} +{ + Rejection sampling for s1 and s2 + Memcheck:Cond + fun:rej_eta + fun:pqcrystals_ml_dsa*_ref_poly_uniform_eta + fun:pqcrystals_ml_dsa*_ref_polyvec*_uniform_eta + fun:pqcrystals_ml_dsa*_ref_keypair +} +{ + Rejection sampling for y + Memcheck:Cond + fun:rej_gamma1m1 + fun:pqcrystals_ml_dsa*_ref_poly_uniform_gamma1m1 + fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for challenge + Memcheck:Cond + fun:pqcrystals_ml_dsa*_ref_poly_challenge + fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for challenge + Memcheck:Value8 + fun:pqcrystals_ml_dsa*_ref_poly_challenge + fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:154 # Call to polyvecl_chknorm + # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:163 # Call to polyveck_chknorm + # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:170 # Call to polyveck_chknorm + # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Hint does not need to be computed in constant time + Memcheck:Cond + ... + src:sign.c:174 # Call to polyveck_make_hint + # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for hint + Memcheck:Cond + ... + src:sign.c:175 # Checking number of 1 bits in hint + # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Packing routines do not need to be constant time + Memcheck:Cond + fun:pqcrystals_ml_dsa*_ref_pack_sig + fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Verification is not done in constant time + Memcheck:Cond + fun:pqcrystals_ml_dsa*_ref_verify +} diff --git a/tests/constant_time/sig/passes/ml_dsa-avx2 b/tests/constant_time/sig/passes/ml_dsa-avx2 new file mode 100644 index 000000000..a9ad9fb3d --- /dev/null +++ b/tests/constant_time/sig/passes/ml_dsa-avx2 @@ -0,0 +1,155 @@ +{ + Rejection sampling for uniformly distributed public A matrix + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_4x + fun:pqcrystals_ml_dsa*_avx2_polyvec_matrix_expand_row* +} +{ + Rejection sampling for uniformly distributed public A matrix + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_4x + fun:pqcrystals_ml_dsa*_avx2_polyvec_matrix_expand_row* +} + + +{ + Rejection sampling for s1 and s2 + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta_4x + fun:pqcrystals_ml_dsa*_avx2_keypair +} +{ + Rejection sampling for s1 and s2 + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta_4x + fun:pqcrystals_ml_dsa*_avx2_keypair +} + +{ + Rejection sampling for y + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1_4x + fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for y + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1_4x + fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for s1 and s2 + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta_preinit + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta + fun:pqcrystals_ml_dsa*_avx2_keypair +} +{ + Rejection sampling for s1 and s2 + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta_preinit + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_eta + fun:pqcrystals_ml_dsa*_avx2_keypair +} +{ + Rejection sampling for y + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1_preinit + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1 + fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for y + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1_preinit + fun:pqcrystals_ml_dsa*_avx2_poly_uniform_gamma1m1 + fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for challenge + Memcheck:Cond + fun:pqcrystals_ml_dsa*_avx2_poly_challenge +} +{ + Rejection sampling for challenge + Memcheck:Value8 + fun:pqcrystals_ml_dsa*_avx2_poly_challenge +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:240 # Call to poly_chknorm + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:255 # Call to poly_chknorm + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Rejection sampling for signature distribution + Memcheck:Cond + ... + src:sign.c:262 # Call to poly_chknorm + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Hint does not need to be computed in constant time + Memcheck:Cond + ... + fun:pqcrystals_ml_dsa*_avx2_poly_make_hint + src:sign.c:266 # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Hint does not need to be computed in constant time + Memcheck:Value8 + ... + fun:pqcrystals_ml_dsa*_avx2_poly_make_hint + src:sign.c:266 # fun:pqcrystals_ml_dsa*_ref_signature +} +{ + Rejection sampling for hint + Memcheck:Cond + ... + src:sign.c:267 # Checking number of 1 bits in hint + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Hint positions are not secret + Memcheck:Cond + ... + src:sign.c:271 # memcpy + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Hint positions are not secret + Memcheck:Value8 + ... + src:sign.c:271 # memcpy + # fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Packing routines do not need to be constant time + Memcheck:Cond + fun:pqcrystals_ml_dsa*_avx2_pack_sig + fun:pqcrystals_ml_dsa*_avx2_signature +} +{ + Verification is not done in constant time + Memcheck:Cond + fun:pqcrystals_ml_dsa*_avx2_verify +} + diff --git a/tests/test_vectors.py b/tests/test_vectors.py index 7c3037fb3..820b9a054 100644 --- a/tests/test_vectors.py +++ b/tests/test_vectors.py @@ -14,8 +14,7 @@ def test_vectors_kem(kem_name): result = helpers.run_subprocess( ['tests/test_vectors.sh', kem_name], ) - if kem_name + " not supported" in result: - pytest.skip("Not supported") + if kem_name + " not supported" in result: pytest.skip("Not supported") @helpers.filtered_test @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not needed on Windows") @@ -25,8 +24,7 @@ def test_vectors_sig(sig_name): result = helpers.run_subprocess( ['tests/test_vectors.sh', sig_name], ) - if sig_name + " not supported" in result: - pytest.skip("Not supported") + if sig_name + " not supported" in result: pytest.skip("Not supported") if __name__ == "__main__": import sys From d7bca25b42eafd80f0849c4403e0ebad9c73a805 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 16:34:54 +0100 Subject: [PATCH 14/27] update docs --- docs/algorithms/kem/ml_kem.md | 8 ++------ docs/algorithms/kem/ml_kem.yml | 10 ++-------- docs/algorithms/sig/ml_dsa.md | 8 ++------ docs/algorithms/sig/ml_dsa.yml | 10 ++-------- 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/docs/algorithms/kem/ml_kem.md b/docs/algorithms/kem/ml_kem.md index 8b63fe9f4..fc0bf8ada 100644 --- a/docs/algorithms/kem/ml_kem.md +++ b/docs/algorithms/kem/ml_kem.md @@ -4,15 +4,11 @@ - **Main cryptographic assumption**: Module LWE+R with base ring Z[x]/(3329, x^256+1). - **Principal submitters**: Peter Schwabe. - **Auxiliary submitters**: Roberto Avanzi, Joppe Bos, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Vadim Lyubashevsky, John M. Schanck, Gregor Seiler, Damien Stehlé. -- **Authors' website**: https://pq-crystals.org/ -- **Specification version**: pq-crystals 20230726. +- **Authors' website**: https://pq-crystals.org/kyber/ and https://csrc.nist.gov/pubs/fips/203/ipd +- **Specification version**: ML-KEM-ipd. - **Primary Source**: - **Source**: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 -- **Optimized Implementation sources**: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches - - **oldpqclean-aarch64**: - - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches - - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT ## Parameter set summary diff --git a/docs/algorithms/kem/ml_kem.yml b/docs/algorithms/kem/ml_kem.yml index d7db917db..405270749 100644 --- a/docs/algorithms/kem/ml_kem.yml +++ b/docs/algorithms/kem/ml_kem.yml @@ -13,19 +13,13 @@ auxiliary-submitters: - Gregor Seiler - Damien Stehlé crypto-assumption: Module LWE+R with base ring Z[x]/(3329, x^256+1) -website: https://pq-crystals.org/ +website: https://pq-crystals.org/kyber/ and https://csrc.nist.gov/pubs/fips/203/ipd nist-round: ipd -spec-version: pq-crystals 20230726 +spec-version: ML-KEM-ipd primary-upstream: source: https://github.com/pq-crystals/kyber/commit/11d00ff1f20cfca1f72d819e5a45165c1e0a2816 with copy_from_upstream patches spdx-license-identifier: CC0-1.0 or Apache-2.0 -optimized-upstreams: - oldpqclean-aarch64: - source: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a - with copy_from_upstream patches - spdx-license-identifier: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) - and MIT parameter-sets: - name: ML-KEM-512-ipd claimed-nist-level: 1 diff --git a/docs/algorithms/sig/ml_dsa.md b/docs/algorithms/sig/ml_dsa.md index 13d095e35..479b75d2e 100644 --- a/docs/algorithms/sig/ml_dsa.md +++ b/docs/algorithms/sig/ml_dsa.md @@ -4,15 +4,11 @@ - **Main cryptographic assumption**: hardness of lattice problems over module lattices. - **Principal submitters**: Vadim Lyubashevsky. - **Auxiliary submitters**: Shi Bai, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Peter Schwabe, Gregor Seiler, Damien Stehlé. -- **Authors' website**: https://pq-crystals.org/dilithium/ -- **Specification version**: pq-crystals 20230825. +- **Authors' website**: https://pq-crystals.org/dilithium/ and https://csrc.nist.gov/pubs/fips/204/ipd +- **Specification version**: ML-DSA-ipd. - **Primary Source**: - **Source**: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches - **Implementation license (SPDX-Identifier)**: CC0-1.0 or Apache-2.0 -- **Optimized Implementation sources**: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches - - **oldpqclean-aarch64**: - - **Source**: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a with copy_from_upstream patches - - **Implementation license (SPDX-Identifier)**: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) and MIT ## Parameter set summary diff --git a/docs/algorithms/sig/ml_dsa.yml b/docs/algorithms/sig/ml_dsa.yml index 763b45a59..33b1a3e1e 100644 --- a/docs/algorithms/sig/ml_dsa.yml +++ b/docs/algorithms/sig/ml_dsa.yml @@ -11,19 +11,13 @@ auxiliary-submitters: - Gregor Seiler - Damien Stehlé crypto-assumption: hardness of lattice problems over module lattices -website: https://pq-crystals.org/dilithium/ +website: https://pq-crystals.org/dilithium/ and https://csrc.nist.gov/pubs/fips/204/ipd nist-round: ipd -spec-version: pq-crystals 20230825 +spec-version: ML-DSA-ipd primary-upstream: source: https://github.com/pq-crystals/dilithium/commit/e7bed6258b9a3703ce78d4ec38021c86382ce31c with copy_from_upstream patches spdx-license-identifier: CC0-1.0 or Apache-2.0 -optimized-upstreams: - oldpqclean-aarch64: - source: https://github.com/PQClean/PQClean/commit/8e220a87308154d48fdfac40abbb191ac7fce06a - with copy_from_upstream patches - spdx-license-identifier: CC0-1.0 and (CC0-1.0 or Apache-2.0) and (CC0-1.0 or MIT) - and MIT parameter-sets: - name: ML-DSA-44-ipd claimed-nist-level: 2 From 252501b6e7358f382c5302ef1b53454de3350736 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 18:06:35 +0100 Subject: [PATCH 15/27] More compact ML-* vectors --- .../Decapsulation -- ML-KEM-1024.txt | 87 ---- .../Decapsulation -- ML-KEM-512.txt | 57 --- .../Decapsulation -- ML-KEM-768.txt | 71 --- .../Encapsulation -- ML-KEM-1024.txt | 64 --- .../Encapsulation -- ML-KEM-512.txt | 38 -- .../Encapsulation -- ML-KEM-768.txt | 50 -- .../Key Generation -- ML-DSA-44.txt | 60 --- .../Key Generation -- ML-DSA-65.txt | 88 ---- .../Key Generation -- ML-DSA-87.txt | 130 ----- .../Key Generation -- ML-KEM-1024.txt | 53 -- .../Key Generation -- ML-KEM-512.txt | 29 -- .../Key Generation -- ML-KEM-768.txt | 40 -- tests/PQC Intermediate Values/ML-DSA-44.txt | 11 + tests/PQC Intermediate Values/ML-DSA-65.txt | 11 + tests/PQC Intermediate Values/ML-DSA-87.txt | 11 + tests/PQC Intermediate Values/ML-KEM-1024.txt | 12 + tests/PQC Intermediate Values/ML-KEM-512.txt | 12 + tests/PQC Intermediate Values/ML-KEM-768.txt | 12 + tests/PQC Intermediate Values/Readme.txt | 4 - .../Signature Generation -- ML-DSA-44.txt | 484 ------------------ .../Signature Generation -- ML-DSA-65.txt | 273 ---------- .../Signature Generation -- ML-DSA-87.txt | 211 -------- .../Signature Verification -- ML-DSA-44.txt | 75 --- .../Signature Verification -- ML-DSA-65.txt | 107 ---- .../Signature Verification -- ML-DSA-87.txt | 153 ------ tests/PQC Intermediate Values/fetch_values.sh | 53 ++ tests/test_kem_vectors.sh | 38 +- tests/test_sig_vectors.sh | 32 +- tests/test_vectors.sh | 36 +- 29 files changed, 167 insertions(+), 2135 deletions(-) delete mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt delete mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt delete mode 100644 tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt delete mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt delete mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt delete mode 100644 tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt delete mode 100644 tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt create mode 100644 tests/PQC Intermediate Values/ML-DSA-44.txt create mode 100644 tests/PQC Intermediate Values/ML-DSA-65.txt create mode 100644 tests/PQC Intermediate Values/ML-DSA-87.txt create mode 100644 tests/PQC Intermediate Values/ML-KEM-1024.txt create mode 100644 tests/PQC Intermediate Values/ML-KEM-512.txt create mode 100644 tests/PQC Intermediate Values/ML-KEM-768.txt delete mode 100644 tests/PQC Intermediate Values/Readme.txt delete mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt delete mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt delete mode 100644 tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt delete mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt delete mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt delete mode 100644 tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt create mode 100755 tests/PQC Intermediate Values/fetch_values.sh diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt deleted file mode 100644 index 58b3e7a06..000000000 --- a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-1024.txt +++ /dev/null @@ -1,87 +0,0 @@ -Decapsulation -- ML-KEM-1024 -dk: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B005C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 -c: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 - -dk_pke: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061 -ek_pke: A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12 -h: FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B0 -z: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 - -c1: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4 -c2: FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 -u: [[3071, 1403, 2568, 1534, 2888, 2554, 884, 3019, 1058, 2038, 995, 871, 2394, 1510, 2544, 2102, 688, 50, 1824, 3032, 2676, 2706, 2637, 1257, 3209, 2845, 1052, 1172, 636, 530, 1795, 748, 1515, 288, 2643, 2601, 3062, 2962, 1265, 816, 388, 192, 2628, 1172, 974, 1500, 1814, 1302, 1482, 549, 2910, 1001, 1315, 870, 1851, 2329, 1079, 1717, 2973, 2064, 1648, 1338, 3028, 1539, 145, 242, 1749, 559, 2441, 1804, 2459, 50, 2614, 1892, 1190, 2546, 2409, 1361, 1715, 3220, 367, 637, 966, 683, 231, 375, 1577, 1222, 249, 1213, 1331, 600, 996, 232, 1284, 325, 3147, 2355, 640, 766, 20, 2276, 2554, 3123, 145, 2823, 2051, 2637, 2687, 2320, 5, 2552, 2386, 904, 2438, 1118, 3145, 2934, 57, 488, 2845, 2641, 2949, 180, 2454, 2680, 390, 535, 55, 3227, 1640, 2901, 566, 2388, 766, 2373, 1469, 444, 1304, 1544, 98, 70, 2845, 575, 322, 2056, 1843, 2346, 3184, 1016, 265, 673, 957, 571, 2767, 692, 2211, 1851, 1091, 2915, 502, 164, 1521, 2167, 2705, 1426, 966, 268, 1123, 1629, 3155, 1364, 1959, 783, 63, 2077, 553, 306, 3023, 1790, 437, 1105, 1757, 18, 1650, 3175, 3066, 923, 1913, 2003, 2755, 1086, 1952, 1946, 354, 1959, 418, 2789, 55, 1738, 2303, 450, 3114, 15, 2887, 1923, 2867, 2199, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3158, 2685, 1239, 1242, 2120, 1375, 330, 1968, 1013, 3002, 2341, 1980, 2090, 3240, 925, 3010, 842, 2467, 753, 3188, 1128, 366, 2025, 1772, 2849, 3171, 964, 1213, 3028, 1349, 304, 567, 1148, 1916, 2237, 1087, 3041, 935, 1720, 1562, 140], -[606, 2207, 1164, 535, 1988, 2767, 2697, 3197, 1435, 2404, 89, 918, 2087, 1426, 2284, 2705, 2063, 618, 176, 1481, 2654, 1230, 3009, 1679, 1170, 210, 681, 3253, 117, 271, 1751, 2843, 2705, 1227, 3071, 444, 362, 1149, 1240, 1157, 1925, 1796, 268, 1965, 463, 2059, 712, 709, 3231, 1474, 1508, 1240, 1096, 1482, 1812, 2360, 795, 1204, 10, 3184, 2086, 2110, 1237, 2568, 2152, 1556, 2797, 2376, 606, 1973, 2380, 335, 2562, 845, 580, 2589, 85, 1955, 2393, 1271, 1320, 2177, 1335, 1388, 2064, 1460, 1226, 231, 884, 636, 2467, 1756, 2867, 2988, 1842, 2454, 172, 2736, 961, 3092, 1890, 1582, 2201, 1850, 759, 488, 1782, 327, 1400, 1517, 1252, 3061, 3171, 2484, 3215, 2380, 3246, 673, 301, 2373, 640, 1877, 1933, 1039, 2107, 2788, 728, 2183, 1398, 2781, 1603, 652, 2750, 1200, 562, 1161, 3327, 1612, 2775, 930, 751, 2672, 224, 1302, 1346, 1447, 3079, 806, 2258, 3129, 689, 2354, 392, 2292, 247, 3002, 2702, 2380, 1648, 712, 1003, 180, 725, 1691, 1461, 1599, 319, 104, 1159, 3175, 1671, 2567, 1326, 1998, 2760, 1048, 2581, 2, 1595, 2142, 2781, 514, 263, 1084, 2989, 1318, 858, 320, 822, 3183, 863, 1401, 1455, 1185, 358, 1239, 881, 2342, 2936, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3114, 1486, 1068, 34, 176, 2606, 1206, 2820, 2819, 268, 2754, 2747, 2541, 2043, 3264, 1162, 2037, 1824, 1520, 819, 2146, 1430, 2669, 2502, 2942, 627, 1700, 1013, 1352, 2367, 1682, 3210, 644, 1343, 3012, 2212, 3179, 2454, 2923, 65, 2952, 2557, 1973, 463, 1994, 2381], -[1769, 3266, 3045, 127, 262, 2121, 2316, 1681, 2310, 2910, 1416, 2105, 953, 229, 1318, 2671, 2033, 2342, 2063, 1270, 2885, 2750, 2832, 1396, 1458, 618, 154, 3149, 11, 714, 2289, 2997, 2389, 284, 2682, 215, 1442, 237, 310, 281, 2575, 1403, 735, 3002, 1318, 276, 1770, 2017, 1170, 2232, 2477, 720, 2498, 2068, 2674, 2294, 1092, 2012, 2581, 2347, 2684, 624, 2526, 1482, 2950, 3197, 1910, 743, 1169, 1634, 1515, 3040, 2747, 2298, 1091, 1484, 788, 1647, 2771, 2659, 3058, 671, 3189, 1782, 2653, 106, 72, 1123, 2394, 3152, 1860, 3062, 158, 1835, 1026, 1135, 2263, 3038, 2599, 2207, 780, 41, 1022, 1027, 2255, 2110, 2077, 2094, 2120, 2698, 597, 3041, 1499, 463, 1057, 85, 257, 413, 2996, 1588, 367, 2825, 2507, 2407, 1565, 2635, 2033, 1681, 2485, 1107, 650, 1707, 3293, 3010, 3212, 1565, 1148, 649, 1417, 2066, 42, 2742, 393, 2903, 2216, 3253, 640, 114, 1157, 85, 60, 2677, 358, 718, 2255, 428, 845, 3205, 268, 738, 2589, 1830, 2038, 2516, 2417, 2554, 1543, 2757, 2190, 961, 3067, 2658, 2086, 3132, 1739, 2633, 182, 1791, 930, 1437, 1946, 923, 2352, 2994, 291, 2511, 1554, 2328, 2341, 540, 1344, 1565, 1100, 1365, 3162, 2905, 380, 1655, 814, 2693, 16, 1715, 1013, 902, 569, 2284, 2329, 1325, 1570, 535, 2094, 992, 1320, 229, 884, 133, 2422, 98, 1858, 3244, 3279, 2695, 2667, 2266, 1157, 2549, 2437, 387, 805, 803, 944, 2866, 1279, 1856, 1460, 1916, 2121, 494, 1284, 1452, 1986, 2046, 1625, 3183, 2363, 31, 1538, 1861, 2739, 80, 2581, 1213, 2396, 2191, 931, 2915], -[1603, 907, 2780, 2897, 1440, 1196, 866, 2225, 1720, 2596, 1432, 1359, 2268, 2489, 548, 1928, 1364, 1925, 1850, 2866, 1073, 2029, 2971, 2937, 93, 1243, 2389, 1985, 1817, 3305, 1704, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2368, 811, 328, 28, 975, 2684, 509, 2572, 1130, 657, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2931, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 836, 1855, 1830, 3279, 3184, 2064, 3309, 2082, 1047, 1257, 2715, 783, 3111, 821, 2619, 161, 2911, 2020, 429, 1281, 1918, 580, 2285, 3103, 1504, 2903, 1567, 1492, 1947, 1903, 3136, 3253, 3144, 7, 1942, 458, 3048, 2680, 2890, 2211, 814, 623, 432, 1697, 65, 2915, 918, 746, 393, 1447, 1091, 2146, 1006, 813, 692, 987, 2204, 1951, 3119, 1437, 670, 1764, 2190, 2534, 247, 3110, 2500, 2363, 3009, 590, 2924, 2032, 2373, 2796, 3179, 444, 665, 1942, 2698, 788, 1383, 1109, 1577, 158, 1913, 2380, 3202, 891, 1299, 2313, 1837, 2651, 1035, 348, 2949, 341, 312, 1643, 1191, 416, 522, 2848, 1227, 1525, 2185, 1291, 2750, 2684, 3301, 1843, 1330, 983, 2276, 98, 3214, 957, 2386, 2653, 3212, 1765, 2882, 909, 585, 3035, 2211, 312, 465, 1721, 397, 2502, 2477, 336, 1110, 2682, 3041, 1211, 1274, 2963, 866, 692, 1960, 2355, 1417, 1439, 540, 2149, 2495, 1908, 478, 2211, 1782, 1923, 2141, 1795, 735, 1484, 3238, 2368, 73, 892, 896, 922, 180, 2550, 3254, 1785, 782, 3318, 3235, 2822, 3205, 1022, 3100, 914, 855, 2667, 3290, 3035, 1087, 1055, 1939, 1975, 770, 1305, 897, 2929, 2976]] -v: [3121, 1560, 1665, 2393, 3017, 2705, 1665, 520, 936, 208, 2289, 2081, 1977, 3121, 520, 1665, 3121, 2809, 1144, 520, 624, 0, 0, 104, 832, 416, 2809, 104, 2809, 2185, 3225, 3225, 1560, 1560, 2705, 3121, 1560, 728, 624, 1144, 1248, 1665, 3121, 1144, 208, 3225, 1456, 2185, 104, 104, 2497, 2289, 2185, 1769, 936, 1144, 2913, 520, 1144, 416, 1040, 2809, 0, 1665, 2497, 2809, 520, 1144, 1873, 728, 312, 1456, 1560, 832, 2185, 2497, 312, 416, 2289, 624, 1560, 936, 1248, 208, 2289, 1665, 1769, 1040, 728, 1248, 1560, 1665, 104, 2809, 2705, 2497, 1144, 1560, 2081, 3121, 936, 312, 728, 728, 1665, 520, 2913, 2705, 3225, 1977, 104, 3225, 1040, 2809, 1040, 520, 624, 2705, 2081, 1977, 3225, 2185, 3121, 1977, 2497, 2913, 312, 624, 1769, 2705, 936, 1560, 2913, 2809, 2289, 2393, 2289, 2497, 728, 2705, 2913, 2601, 3017, 1248, 1248, 1769, 2809, 1144, 1560, 1352, 1456, 1977, 2393, 1352, 3017, 312, 728, 2185, 2809, 2393, 520, 104, 2913, 1040, 2913, 3225, 624, 624, 1248, 2393, 1040, 3225, 104, 1456, 3121, 2081, 936, 2185, 1769, 728, 1352, 1560, 2081, 2081, 2809, 728, 3225, 1456, 936, 1456, 2289, 2809, 624, 2601, 416, 1873, 832, 3225, 2185, 1560, 2185, 2497, 0, 2289, 1560, 624, 416, 312, 1352, 520, 2393, 2393, 1560, 3017, 1248, 1248, 208, 728, 624, 3121, 520, 208, 312, 208, 2497, 0, 1456, 2081, 1352, 1977, 1769, 2601, 208, 3225, 2081, 1977, 3017, 3225, 1977, 2289, 2393, 1977, 1769, 416, 1248, 0, 2497, 728, 3017, 2289, 104, 520, 1248, 2913, 1560, 2497] -sHat: [[2575, 622, 1476, 1098, 1189, 1089, 1866, 441, 2652, 2085, 1880, 3074, 669, 1124, 2462, 837, 588, 2767, 518, 2266, 2355, 2574, 2578, 2620, 2929, 711, 2363, 162, 1287, 2081, 2321, 3136, 2764, 3150, 1183, 467, 941, 1917, 2772, 882, 2342, 353, 2988, 2967, 3300, 145, 2156, 394, 1308, 2111, 1872, 1013, 1632, 2117, 3233, 2651, 2109, 600, 884, 3157, 1589, 1473, 1870, 685, 159, 1391, 325, 663, 1537, 1743, 16, 1277, 1118, 2603, 2028, 1827, 2537, 2276, 1181, 1212, 3005, 1818, 3003, 3021, 1532, 2952, 1537, 771, 2697, 1550, 1519, 2158, 737, 398, 2060, 2851, 1255, 2667, 1598, 125, 2889, 3152, 2746, 1415, 2988, 451, 782, 2404, 114, 3184, 664, 2304, 1259, 287, 1154, 920, 3310, 2280, 2401, 2850, 344, 990, 3090, 2839, 90, 3248, 1659, 2260, 832, 2898, 2825, 2487, 46, 2485, 2128, 2318, 2998, 1139, 2055, 1940, 609, 2538, 1304, 1750, 210, 2541, 2922, 2179, 579, 2126, 1084, 2139, 2127, 273, 366, 2007, 987, 1360, 423, 853, 690, 1696, 3189, 2274, 383, 2287, 2575, 916, 796, 2042, 2907, 3266, 2440, 2460, 1204, 1918, 1104, 1628, 3143, 126, 618, 348, 560, 711, 2554, 1663, 409, 3222, 2182, 3128, 2902, 370, 204, 2072, 326, 602, 2418, 2908, 1535, 417, 1195, 1045, 265, 2112, 1550, 1058, 1849, 3160, 736, 2285, 2802, 1342, 1514, 2398, 542, 2758, 1403, 397, 953, 168, 3149, 3307, 874, 1625, 2705, 2286, 1522, 119, 2442, 1840, 2693, 1234, 1043, 2384, 3024, 1008, 1313, 344, 153, 457, 2557, 879, 1155, 3204, 528, 756, 254, 2218, 3053, 428, 895, 1581, 1631, 2818, 308, 760], -[1955, 2736, 44, 2370, 1364, 1350, 365, 2611, 1089, 26, 317, 2200, 1460, 255, 232, 2662, 2664, 3197, 945, 1088, 1566, 505, 206, 3163, 945, 1247, 1522, 2446, 2246, 3325, 2144, 1611, 3093, 1792, 2877, 3042, 2988, 9, 538, 266, 1921, 2788, 2667, 2792, 1836, 2327, 2523, 1390, 2497, 2863, 2564, 343, 2422, 1072, 1671, 1216, 58, 440, 2317, 3224, 1430, 3322, 163, 299, 1217, 900, 953, 1343, 3084, 1520, 2217, 2547, 2832, 1007, 753, 30, 2099, 1043, 2911, 471, 436, 2769, 3321, 1841, 1462, 1716, 2920, 1994, 3068, 3223, 1065, 1262, 2904, 846, 202, 2785, 49, 959, 2860, 2659, 716, 2026, 3251, 2837, 2615, 313, 3082, 2170, 2275, 1883, 719, 1342, 943, 3136, 2237, 1015, 1304, 2604, 2552, 692, 3263, 1383, 1415, 2437, 1713, 1019, 3046, 108, 148, 1165, 268, 3210, 1784, 1992, 2065, 3067, 819, 714, 1824, 2555, 1180, 2154, 1669, 264, 1969, 2105, 1982, 2127, 3007, 246, 3205, 424, 377, 769, 2522, 1398, 754, 561, 2382, 2156, 377, 1208, 2536, 3059, 2833, 1104, 2241, 2108, 3308, 989, 2227, 559, 1956, 3103, 1573, 1765, 1745, 854, 2152, 1052, 60, 461, 1570, 1956, 213, 418, 3082, 1901, 1332, 2595, 1483, 3280, 196, 1831, 937, 1796, 1269, 843, 3319, 117, 395, 1428, 2195, 1358, 477, 1982, 1727, 3080, 2502, 2620, 1316, 808, 729, 316, 926, 3199, 2906, 3177, 2195, 263, 3168, 2797, 2607, 1423, 3289, 1356, 2447, 3089, 974, 1605, 3208, 2032, 3253, 3184, 190, 1332, 1554, 3277, 916, 1888, 792, 2191, 196, 2809, 399, 2966, 1204, 1216, 2807, 1477, 2775, 337, 2949, 1523, 726, 1218], -[1387, 2313, 1509, 24, 466, 1064, 2304, 412, 1010, 3272, 2347, 2772, 2699, 1471, 682, 2426, 895, 2080, 63, 2534, 1275, 610, 1785, 3123, 1794, 152, 1659, 2941, 1725, 1932, 1378, 2184, 2947, 1437, 2132, 64, 2345, 3291, 2562, 2412, 3260, 3249, 475, 533, 2271, 95, 688, 1192, 2542, 2537, 2859, 731, 1410, 995, 2669, 771, 519, 1929, 2064, 3157, 1902, 159, 906, 1419, 78, 1578, 30, 818, 2685, 2419, 861, 3321, 2098, 1749, 362, 2599, 3012, 2859, 2050, 1339, 2559, 3136, 1031, 955, 2332, 2833, 3268, 2956, 2081, 724, 2013, 882, 1921, 2727, 383, 1926, 3145, 1015, 2490, 1815, 1107, 2248, 2909, 496, 1344, 1259, 413, 2357, 2704, 772, 575, 1527, 3084, 1644, 3270, 2844, 1368, 104, 1029, 1747, 2996, 2162, 2429, 3309, 1701, 2511, 530, 539, 3271, 1310, 1792, 1631, 2439, 2107, 75, 3180, 833, 2293, 2179, 1470, 2483, 208, 3002, 3263, 267, 391, 3327, 2423, 745, 1589, 21, 1047, 3320, 1034, 82, 1037, 53, 3264, 2127, 2374, 1877, 1225, 3051, 117, 103, 2569, 80, 2878, 2038, 679, 1911, 1350, 1567, 2927, 2683, 466, 1876, 2080, 1798, 1668, 1679, 163, 299, 1136, 1847, 1814, 2345, 2848, 1319, 2230, 1510, 1924, 1096, 1036, 373, 1671, 2054, 2177, 3160, 2825, 2394, 2537, 2389, 1652, 401, 427, 1778, 1712, 2744, 1868, 352, 3141, 2664, 176, 960, 2087, 2625, 2946, 952, 410, 2011, 2380, 1757, 2380, 3007, 2077, 63, 2904, 651, 535, 1677, 1245, 3068, 2589, 2219, 2708, 2639, 2263, 714, 1641, 1485, 2625, 2861, 2649, 2043, 1654, 1449, 1317, 1388, 208, 2530, 2229, 2577, 690, 2576, 2595], -[209, 1551, 1647, 2222, 2389, 481, 3061, 771, 3119, 407, 802, 28, 2766, 2446, 666, 310, 64, 2697, 1632, 1911, 1135, 1130, 1831, 795, 1635, 1400, 1898, 2070, 629, 395, 1254, 2095, 2997, 3170, 2818, 3047, 1715, 2436, 185, 760, 1750, 839, 2497, 1242, 1492, 3292, 3145, 1774, 1581, 1526, 1906, 2071, 3281, 270, 1706, 1711, 2008, 2482, 667, 1231, 2201, 1886, 1260, 857, 1581, 89, 250, 3251, 2877, 616, 134, 923, 1905, 1546, 1459, 944, 1076, 1747, 269, 2887, 2893, 2008, 1582, 426, 92, 2705, 819, 2237, 932, 872, 369, 1857, 340, 1142, 3028, 660, 2068, 1391, 2441, 3101, 191, 880, 1991, 895, 2428, 781, 1743, 255, 132, 2603, 3328, 997, 1534, 3189, 2865, 433, 609, 1891, 651, 2309, 1752, 2947, 1067, 1084, 3011, 1266, 1772, 41, 2841, 541, 1842, 2463, 1546, 2125, 675, 2551, 2621, 705, 2794, 499, 484, 619, 1141, 2204, 1007, 403, 399, 2576, 6, 1768, 2300, 2350, 1053, 1772, 3223, 161, 1546, 1189, 1529, 1742, 1959, 2674, 3172, 1377, 1420, 2729, 1625, 2325, 2059, 2114, 2089, 239, 743, 1762, 1181, 108, 1150, 2371, 1615, 2336, 1133, 2852, 1999, 1608, 1015, 1425, 1083, 660, 3064, 2290, 204, 1910, 408, 1721, 2945, 2309, 920, 227, 1219, 659, 2061, 3083, 2123, 976, 2803, 268, 1486, 1875, 7, 643, 1257, 2601, 1883, 654, 2424, 756, 1761, 2411, 3258, 2837, 935, 407, 2874, 643, 1188, 1039, 2222, 725, 711, 1276, 1511, 468, 1638, 567, 2347, 1563, 1221, 192, 670, 21, 938, 3295, 1101, 174, 2517, 1402, 1418, 655, 1296, 2363, 489, 1512, 1571, 1023, 86, 1556]] -w: [1740, 3246, 1647, 44, 19, 3261, 2, 20, 1595, 3296, 110, 1684, 48, 81, 1566, 1653, 30, 3215, 137, 1688, 1685, 3285, 1601, 3240, 3245, 4, 1683, 1611, 3292, 1659, 1736, 1630, 135, 1607, 1654, 51, 65, 1611, 47, 3, 3293, 1747, 1678, 2, 1817, 3266, 1618, 3283, 1701, 1574, 3287, 1667, 1758, 8, 14, 49, 1692, 3185, 1628, 1648, 3315, 1749, 1745, 26, 5, 3249, 3217, 1781, 1620, 1588, 48, 1654, 70, 33, 3304, 1692, 1762, 3292, 58, 3241, 76, 23, 1609, 14, 1617, 1629, 1721, 1696, 3260, 9, 3322, 1663, 1684, 1668, 3326, 1641, 1729, 1599, 75, 1573, 3275, 26, 1652, 1550, 3256, 1567, 1647, 1724, 3226, 1704, 3294, 3296, 85, 54, 3263, 1654, 3293, 1685, 3318, 3296, 1758, 3222, 3227, 1648, 1724, 3314, 39, 1734, 3270, 1729, 1655, 1702, 8, 3273, 3233, 35, 52, 3304, 1681, 43, 1637, 1701, 1738, 3257, 99, 3305, 1574, 3220, 3281, 3290, 80, 1631, 1657, 1674, 1692, 190, 1683, 3291, 25, 3289, 3248, 54, 3313, 1695, 1613, 3290, 1604, 3296, 1576, 1635, 1737, 1575, 1781, 1685, 1636, 142, 3237, 25, 1565, 1683, 3132, 1612, 1598, 1580, 51, 6, 3253, 1693, 1610, 1580, 3257, 134, 1643, 3205, 51, 21, 115, 1593, 3326, 1714, 42, 83, 3293, 1620, 23, 1648, 73, 3327, 1630, 1665, 56, 1717, 3286, 3198, 1563, 140, 1569, 1761, 3299, 1660, 1652, 1661, 82, 1654, 1770, 1606, 1676, 1541, 3272, 107, 1671, 3284, 1622, 18, 3324, 1639, 1723, 1613, 1653, 1725, 3297, 15, 1673, 3253, 3306, 1647, 1668, 1595, 3305, 47, 0, 1574, 1587, 1692, 1761, 3278] -mPrime: 05C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 - -KPrime: C61F73D2BFB18594E1BA5D3B58B4C934206D3A6F8EC91395AB7779C61FA1DD6F -rPrime: 6DC410C18448882046E2162045D93FE36D6F9C6B27F2A04E04050E9985617B1D - -tHat: [[1188, 120, 2593, 2579, 176, 2297, 1867, 1265, 1414, 1853, 1274, 896, 2148, 3049, 2408, 2275, 653, 215, 295, 280, 472, 1851, 3, 678, 918, 1534, 2902, 607, 3095, 1267, 842, 3232, 2346, 3068, 3193, 2749, 2934, 3300, 68, 1025, 30, 305, 742, 2245, 460, 309, 1333, 1912, 986, 1880, 992, 1074, 3088, 664, 548, 1373, 3102, 3157, 161, 1243, 2287, 808, 1357, 1272, 3273, 1186, 3295, 567, 769, 2019, 69, 3058, 1475, 1382, 1647, 150, 1582, 1955, 1766, 288, 1652, 1332, 3009, 1150, 752, 152, 593, 2586, 588, 1428, 1033, 211, 1927, 386, 2702, 138, 1764, 1928, 2200, 1892, 208, 2256, 2478, 25, 1627, 1587, 3069, 1836, 343, 1332, 779, 2204, 347, 1569, 780, 2894, 791, 522, 2273, 312, 3257, 569, 90, 1788, 85, 246, 2200, 2083, 191, 47, 54, 1969, 592, 1348, 2907, 1910, 2136, 2790, 2555, 2903, 2453, 1685, 1538, 2492, 2718, 988, 3125, 1560, 254, 878, 2258, 2753, 2627, 1019, 82, 1708, 2191, 424, 1918, 61, 1158, 705, 1466, 3276, 3076, 3135, 1566, 625, 374, 3301, 3117, 1292, 1556, 2991, 346, 1481, 2067, 2099, 1102, 1871, 438, 1431, 3091, 1963, 2382, 965, 1896, 1640, 1965, 109, 920, 2027, 1286, 926, 789, 2143, 3128, 600, 1732, 1506, 1052, 1275, 227, 413, 465, 2786, 588, 1075, 1871, 2819, 2980, 1692, 3271, 2396, 880, 1287, 2499, 980, 271, 459, 212, 2557, 3113, 1389, 3008, 3207, 3051, 3328, 2824, 1042, 324, 1106, 3174, 531, 939, 836, 2407, 1515, 1986, 2116, 291, 2236, 3314, 1806, 2878, 2607, 2700, 3037, 1858, 2955, 1331, 209, 621, 1514, 2736, 2096], -[40, 745, 2093, 2480, 1621, 2477, 2733, 2377, 2264, 609, 1100, 2821, 333, 1238, 2580, 775, 3243, 63, 729, 2521, 2710, 2043, 1665, 1496, 931, 3141, 2644, 1963, 2215, 424, 1209, 3095, 184, 2111, 2334, 3143, 1601, 1608, 1001, 2645, 2381, 814, 2323, 1830, 1153, 467, 1335, 143, 3048, 2796, 317, 2136, 1285, 1652, 3294, 2287, 3131, 2731, 1858, 2308, 2172, 948, 2959, 2113, 1203, 3090, 2727, 2124, 2882, 1725, 635, 2241, 899, 3041, 543, 1406, 145, 2482, 2694, 996, 282, 2262, 1878, 269, 982, 3071, 1365, 265, 3094, 1127, 2892, 2486, 1163, 2316, 184, 926, 37, 989, 2830, 1502, 1912, 2369, 2856, 2059, 3027, 335, 136, 1796, 412, 324, 2170, 1782, 3273, 3035, 1997, 3199, 3306, 775, 1275, 246, 3056, 1877, 2873, 2746, 2416, 664, 2312, 974, 969, 1148, 3320, 2186, 1694, 1125, 906, 1457, 1433, 1143, 312, 1534, 1870, 2006, 1523, 3063, 795, 1540, 3178, 1138, 2872, 256, 416, 1228, 2088, 965, 387, 419, 1064, 2853, 937, 505, 214, 2150, 1985, 1168, 1267, 1395, 1919, 189, 2385, 1291, 1888, 1296, 409, 2483, 3135, 2903, 1970, 771, 1836, 163, 1827, 1505, 334, 960, 2134, 434, 687, 3054, 671, 1448, 1584, 2742, 2699, 1403, 659, 494, 2170, 2420, 1676, 207, 2825, 497, 128, 3116, 1080, 2609, 1807, 1543, 2656, 3297, 427, 539, 82, 2368, 2575, 351, 546, 151, 1389, 2260, 3328, 61, 927, 1714, 1831, 2898, 1672, 556, 1796, 2510, 1605, 2065, 1247, 270, 1262, 700, 1140, 1449, 1004, 304, 419, 2377, 298, 2846, 1826, 1233, 2494, 2741, 2334, 195, 2518, 1044, 3139, 1878, 681, 963], -[1641, 1050, 2184, 1792, 763, 2059, 947, 1979, 2363, 2093, 2488, 1362, 2914, 112, 2179, 747, 393, 2630, 2820, 3187, 3318, 230, 2802, 1509, 977, 613, 504, 1768, 1118, 362, 2174, 3070, 1638, 1110, 285, 1459, 1324, 327, 1857, 705, 807, 8, 550, 1560, 3271, 1784, 1548, 1380, 2343, 2871, 2465, 1777, 903, 1528, 3193, 2943, 3040, 2588, 1619, 3267, 387, 1390, 709, 640, 2183, 154, 1158, 2507, 1819, 1621, 660, 794, 578, 1190, 703, 1157, 290, 2244, 353, 2304, 594, 2054, 613, 1175, 1869, 1331, 704, 2070, 487, 2031, 2317, 1735, 1751, 2039, 2524, 30, 2046, 289, 2720, 976, 2870, 1070, 2366, 2146, 1672, 2356, 1066, 793, 2744, 1644, 271, 2428, 862, 2674, 2651, 1300, 222, 1681, 1491, 2554, 2926, 686, 1884, 686, 1673, 2897, 1000, 1142, 2670, 3158, 626, 2553, 2348, 3010, 1878, 2978, 409, 1588, 974, 1453, 951, 448, 2304, 116, 1316, 1445, 1741, 318, 1198, 3131, 2537, 2073, 3014, 1490, 2502, 2874, 1883, 2346, 1056, 866, 137, 1438, 1609, 2137, 1148, 1488, 2407, 977, 414, 436, 847, 2527, 3087, 968, 10, 2775, 2743, 1794, 801, 1758, 2916, 671, 845, 697, 292, 2606, 3004, 3136, 2588, 2612, 3253, 974, 1776, 1838, 1246, 241, 1864, 820, 765, 3064, 2312, 834, 181, 2660, 1077, 1164, 2200, 2750, 1678, 1104, 2672, 2645, 385, 2231, 577, 3139, 551, 2041, 1454, 3063, 1686, 2641, 3138, 516, 2848, 3166, 463, 3020, 270, 1629, 1338, 14, 1882, 1345, 1560, 513, 183, 1759, 881, 310, 2819, 2931, 42, 1604, 2938, 749, 870, 1799, 2034, 1276, 1243, 1065, 1037, 2266, 2001, 2515], -[2490, 2725, 2082, 1407, 482, 3155, 960, 664, 1536, 3158, 1608, 439, 2271, 1523, 1327, 2072, 379, 514, 870, 2557, 1795, 2043, 1166, 303, 1049, 3070, 441, 748, 2383, 2188, 1792, 469, 2594, 2707, 554, 3187, 675, 2684, 3279, 2457, 90, 2686, 949, 2329, 2814, 1273, 781, 950, 2555, 2247, 1844, 699, 2746, 2550, 1046, 316, 2094, 2904, 1392, 2231, 469, 3221, 539, 2781, 1003, 2677, 1578, 2732, 2051, 2518, 3030, 52, 2391, 2688, 1711, 2132, 2883, 380, 2870, 3229, 3015, 1314, 158, 1431, 2157, 2833, 1692, 2282, 2657, 327, 2172, 2513, 2600, 1907, 3176, 2808, 2708, 1453, 2830, 1593, 2584, 1025, 1979, 3038, 2113, 2598, 1869, 1074, 2329, 2362, 2748, 2222, 191, 1525, 744, 294, 662, 2905, 2237, 1182, 2803, 3222, 303, 1815, 2277, 1427, 1585, 67, 490, 188, 2274, 1783, 1523, 2968, 2247, 337, 2120, 1905, 1839, 2954, 153, 1260, 2301, 2689, 2561, 1945, 1718, 1247, 2651, 713, 1877, 2126, 1995, 3236, 2089, 1380, 2664, 2665, 3239, 3104, 3195, 518, 468, 3197, 1065, 156, 2512, 603, 3268, 768, 1984, 1927, 1813, 1904, 2121, 2228, 141, 927, 1286, 2745, 1243, 2240, 380, 2142, 566, 2640, 1357, 961, 1522, 362, 1047, 1976, 1553, 974, 1612, 407, 1382, 2781, 1427, 211, 2746, 1197, 277, 588, 189, 2184, 2417, 1017, 1479, 2919, 228, 3121, 2438, 245, 2675, 2272, 1993, 1508, 494, 1289, 2361, 446, 1135, 606, 1721, 1664, 3270, 1322, 1880, 2811, 2832, 2547, 862, 178, 2929, 3001, 1801, 472, 705, 342, 2583, 683, 3203, 2409, 1706, 1098, 1802, 1512, 172, 2857, 1688, 445, 979, 2767, 1161, 91]] - -bHat = aHat^T: [[[2624, 568, 2343, 2233, 2805, 2899, 2873, 862, 1680, 1122, 2223, 1232, 675, 223, 877, 554, 3109, 1566, 1221, 2974, 631, 3155, 353, 85, 3205, 916, 3125, 2800, 13, 2810, 1568, 429, 563, 1252, 1415, 2283, 2688, 1290, 3302, 649, 589, 1319, 2435, 655, 549, 2025, 2435, 1070, 995, 3155, 1026, 2083, 974, 2385, 93, 1256, 2492, 2678, 3138, 1863, 1159, 1109, 2613, 662, 2632, 1104, 1563, 1378, 2425, 1369, 611, 236, 2763, 2290, 3078, 2556, 386, 1806, 735, 831, 2924, 2003, 2871, 2522, 2509, 914, 1083, 1197, 1758, 2568, 1334, 2933, 543, 2137, 3112, 434, 776, 1395, 2779, 2681, 439, 1404, 2186, 2413, 3163, 34, 1561, 2114, 2889, 2952, 1819, 2707, 2234, 2185, 2329, 1552, 2269, 1453, 3081, 2519, 2289, 539, 806, 1893, 3036, 2448, 283, 2499, 117, 677, 994, 1962, 461, 2927, 2741, 331, 2486, 2447, 1930, 2426, 2701, 2778, 224, 772, 2444, 97, 0, 12, 626, 2491, 3044, 655, 2045, 738, 1645, 1426, 1334, 936, 2424, 192, 3313, 334, 1788, 1179, 149, 2674, 2776, 3000, 3129, 606, 732, 1811, 636, 355, 702, 3041, 2996, 1356, 1668, 2856, 3297, 2606, 2095, 973, 488, 2087, 532, 662, 2483, 528, 1732, 1731, 2227, 307, 1570, 2730, 2661, 512, 2669, 1085, 376, 2425, 1357, 2493, 1542, 2905, 27, 2645, 1219, 3235, 964, 825, 1505, 1674, 2035, 2117, 883, 961, 338, 1483, 1964, 2875, 731, 817, 164, 1113, 2260, 1775, 3152, 2447, 2146, 322, 1161, 3061, 1272, 2586, 46, 1580, 2792, 1404, 2247, 479, 1185, 268, 2075, 1355, 2787, 159, 3022, 14, 2382, 15, 2529, 815, 3234, 2762], -[2629, 1997, 2999, 1097, 137, 1577, 1900, 1104, 1001, 1440, 2424, 609, 2363, 1592, 130, 3142, 2673, 3040, 1280, 3295, 1901, 2413, 3046, 2832, 201, 439, 1201, 2413, 1883, 622, 92, 13, 1687, 2757, 1880, 1234, 2632, 560, 251, 396, 1783, 2916, 1138, 2990, 361, 2641, 27, 2237, 2272, 2193, 3129, 886, 1795, 1779, 2149, 2804, 2857, 1854, 1378, 3054, 394, 1916, 845, 2223, 158, 30, 3243, 277, 2010, 2276, 2939, 2488, 1972, 1670, 950, 1919, 1914, 2179, 2793, 782, 1729, 765, 2667, 364, 373, 2127, 2856, 291, 1981, 1220, 3128, 1221, 1286, 642, 2538, 2719, 2928, 1831, 26, 215, 3185, 2281, 518, 306, 1696, 1186, 2416, 3172, 1707, 761, 1563, 2160, 64, 2901, 1932, 2750, 2014, 3232, 1255, 2255, 60, 155, 2295, 1060, 279, 761, 1916, 835, 1373, 582, 1286, 2901, 1228, 2238, 611, 299, 1915, 22, 2933, 337, 2796, 2308, 2280, 1388, 2764, 1312, 1073, 3084, 2467, 2918, 1874, 3254, 3078, 2895, 2580, 2327, 1351, 1919, 1337, 409, 3067, 1023, 2327, 413, 1829, 2534, 2638, 1918, 3215, 35, 3248, 3325, 1764, 1766, 1393, 745, 82, 1052, 1128, 3070, 1811, 802, 679, 241, 2434, 1471, 1158, 1994, 3075, 2179, 2694, 579, 16, 2918, 2980, 1404, 168, 1251, 3011, 2492, 1835, 2206, 1910, 1589, 1495, 2248, 699, 522, 1341, 1561, 2988, 3196, 1256, 1345, 508, 252, 211, 1764, 203, 1641, 1042, 396, 1582, 1581, 3321, 1317, 1307, 3201, 2143, 3186, 1067, 2674, 1455, 2192, 1017, 2701, 2103, 513, 1084, 2345, 1712, 2798, 2048, 880, 851, 2992, 2355, 48, 4, 1212, 2558, 2978, 715, 2217, 2388, 2088], -[2987, 273, 1770, 1102, 1971, 3319, 510, 2205, 3078, 1835, 191, 851, 89, 2463, 3156, 2065, 3103, 872, 3160, 1639, 2774, 945, 875, 2723, 2952, 3094, 2384, 837, 1586, 2229, 1725, 2179, 3081, 2650, 2181, 1175, 1049, 1294, 90, 1765, 555, 3164, 2556, 1274, 796, 2802, 1471, 1642, 2526, 1128, 3287, 976, 671, 2519, 1954, 1740, 1026, 1812, 2252, 845, 1144, 1595, 648, 2181, 1608, 1664, 830, 695, 3260, 1279, 2937, 2090, 1488, 1583, 930, 1576, 1832, 1167, 564, 1811, 1975, 2946, 1567, 1744, 416, 624, 2742, 275, 2330, 261, 2551, 1218, 275, 1296, 3056, 2183, 245, 1847, 1705, 874, 914, 565, 1927, 501, 2152, 2471, 3211, 2397, 2891, 1258, 2064, 1753, 999, 1006, 3315, 2414, 1949, 1231, 2831, 3146, 1703, 2372, 2345, 156, 3078, 343, 2771, 1873, 1709, 2947, 1945, 1644, 1648, 547, 1193, 1949, 2797, 827, 3136, 310, 636, 2212, 71, 2744, 1694, 3218, 1367, 2236, 2096, 2133, 2509, 1490, 2800, 2296, 3096, 3200, 2041, 813, 2231, 3255, 2686, 3180, 995, 2066, 748, 3059, 1857, 1182, 2027, 708, 1658, 2201, 647, 2114, 2442, 629, 3146, 1167, 2999, 3254, 2345, 740, 3109, 716, 1227, 740, 3188, 220, 443, 2741, 1181, 634, 2402, 2461, 804, 1544, 224, 345, 449, 2810, 688, 1900, 172, 941, 667, 1613, 1424, 764, 26, 1666, 974, 2352, 2772, 397, 3037, 1452, 1423, 927, 2881, 2724, 3182, 2090, 784, 1973, 780, 794, 1469, 2338, 3118, 826, 2391, 2938, 172, 2039, 1162, 1330, 138, 3133, 1518, 2500, 1571, 2412, 3111, 2600, 1767, 1177, 935, 1238, 1054, 2788, 3015, 52, 1839, 1319, 1638, 3304], -[2564, 46, 3039, 1265, 664, 3080, 3046, 737, 1933, 895, 2587, 227, 480, 254, 1794, 3059, 1222, 477, 833, 387, 1745, 3025, 1713, 2893, 1063, 11, 3121, 724, 404, 3122, 1214, 1049, 496, 1828, 1278, 960, 3093, 639, 2967, 2987, 1777, 1251, 193, 1933, 319, 2372, 2975, 2140, 584, 454, 3118, 1832, 2460, 1921, 571, 981, 1009, 1318, 2167, 851, 1839, 3154, 2923, 2121, 3192, 2486, 3268, 1020, 449, 1355, 1720, 2757, 616, 3262, 3237, 585, 2873, 1484, 2566, 1664, 2767, 2250, 1187, 3278, 1661, 329, 634, 606, 2877, 2035, 975, 433, 445, 14, 1683, 157, 25, 3075, 1176, 2831, 945, 1947, 744, 1907, 2585, 2300, 2869, 2347, 113, 281, 429, 694, 1261, 3221, 2524, 2928, 2528, 474, 2659, 2178, 2044, 2418, 2623, 1366, 1110, 2711, 1449, 453, 1862, 3086, 1665, 1522, 45, 900, 2857, 3286, 1714, 2597, 109, 2432, 2006, 562, 3247, 2119, 1769, 422, 1348, 2281, 898, 755, 2120, 359, 2189, 2682, 589, 442, 1435, 2438, 3315, 241, 142, 2907, 25, 1337, 724, 2767, 2929, 492, 1136, 533, 1590, 321, 575, 1052, 2051, 902, 3208, 626, 2637, 1349, 945, 1624, 1225, 928, 968, 438, 1202, 1447, 1819, 499, 1134, 1702, 141, 1522, 1259, 3188, 2952, 2275, 1974, 2385, 1084, 2399, 3150, 403, 1802, 615, 2440, 1036, 3114, 2179, 1054, 2675, 232, 1358, 673, 1759, 1779, 53, 1113, 862, 1907, 2112, 1388, 752, 1247, 3067, 2591, 2477, 440, 323, 1086, 1599, 3174, 3179, 2493, 375, 365, 2496, 2012, 3239, 624, 3187, 490, 2254, 1256, 2758, 2170, 317, 1619, 2913, 3150, 2862, 1356, 259, 249, 192]], -[[381, 2010, 2217, 1935, 3124, 1918, 3067, 2709, 2398, 1950, 949, 3173, 1987, 2300, 3321, 3290, 2006, 3170, 2635, 3264, 2064, 1442, 1427, 197, 2613, 988, 2821, 2533, 2379, 3066, 1247, 2768, 2704, 3307, 3222, 2868, 46, 14, 177, 3281, 3083, 2638, 1200, 1130, 1336, 2347, 2636, 2717, 1414, 1911, 3073, 2977, 2154, 700, 2743, 2137, 865, 1748, 2420, 3187, 2830, 429, 2817, 995, 3232, 2409, 366, 571, 597, 2748, 999, 1717, 3245, 1510, 520, 1472, 1571, 1308, 2647, 2104, 2201, 3127, 2504, 3313, 1963, 3236, 3132, 1973, 1926, 2273, 1464, 433, 990, 1395, 1439, 1944, 118, 245, 1968, 73, 2213, 2863, 1629, 1291, 2108, 919, 2326, 1607, 1124, 2463, 1063, 1909, 548, 990, 843, 1599, 2128, 1820, 1629, 580, 729, 1649, 1041, 1857, 2661, 1263, 117, 1986, 2337, 1459, 3305, 3041, 88, 3314, 685, 1898, 3303, 662, 845, 2607, 894, 3200, 1403, 2958, 999, 1700, 2838, 781, 1807, 2331, 2205, 2672, 2411, 856, 185, 1136, 228, 3177, 2475, 932, 3264, 1968, 1843, 2819, 1970, 245, 464, 1845, 2761, 1190, 1102, 1581, 1915, 621, 1083, 452, 3092, 1567, 1436, 2040, 953, 155, 2788, 314, 1167, 1017, 422, 917, 3286, 1063, 1086, 208, 460, 2537, 93, 2322, 2852, 1876, 2207, 2289, 2385, 2937, 2935, 1774, 411, 1893, 897, 2465, 1228, 204, 1036, 299, 3140, 1190, 2309, 3125, 143, 188, 569, 2166, 1952, 1963, 2791, 2692, 1003, 1272, 671, 212, 3204, 1518, 1627, 2391, 2481, 1162, 891, 234, 3160, 33, 1095, 1921, 1902, 586, 1479, 256, 3005, 14, 1312, 2855, 1017, 2588, 1662, 2974, 2668, 2186, 1232, 2454], -[2762, 243, 107, 2437, 1701, 3113, 1491, 1412, 59, 1936, 1069, 143, 1822, 3004, 1307, 2896, 591, 2456, 3104, 3228, 2832, 1517, 1186, 801, 1049, 1786, 293, 2898, 2994, 2183, 1966, 2133, 1823, 1015, 2101, 854, 1381, 11, 1377, 2887, 1587, 270, 1719, 2804, 2076, 595, 3158, 1782, 2244, 1967, 1156, 2483, 2271, 2011, 2829, 2783, 933, 1300, 3312, 66, 594, 1992, 2471, 792, 3224, 240, 2242, 1235, 305, 1374, 130, 1248, 3130, 1380, 3075, 3224, 1643, 269, 560, 2250, 3156, 1084, 3316, 1254, 2705, 1011, 852, 1665, 2469, 51, 2986, 1126, 3080, 322, 3263, 306, 284, 69, 432, 3307, 1563, 2270, 2650, 118, 2398, 1171, 3073, 377, 2549, 1390, 1255, 2624, 1885, 2614, 289, 1373, 2201, 875, 490, 3300, 1697, 2130, 2387, 230, 3106, 964, 1618, 1786, 2565, 717, 2280, 2892, 2662, 355, 478, 2333, 37, 2236, 83, 862, 2302, 1349, 3050, 1944, 1096, 86, 3182, 2964, 2045, 2845, 2654, 3261, 1209, 706, 1881, 665, 2871, 939, 993, 1598, 1160, 2792, 3021, 398, 2892, 938, 2505, 2795, 2316, 2641, 2867, 2979, 677, 1050, 3313, 2851, 120, 1476, 615, 1299, 3185, 1919, 528, 590, 1317, 2059, 572, 1579, 3018, 1104, 1557, 706, 3294, 154, 1592, 1195, 1587, 1498, 2034, 1586, 1425, 2087, 1068, 2078, 1673, 1391, 1534, 1126, 2936, 2390, 334, 1332, 1738, 2686, 1195, 564, 1864, 1712, 2155, 740, 1529, 494, 3117, 3118, 2098, 503, 440, 977, 1407, 2450, 2408, 1645, 2068, 160, 1809, 2710, 606, 776, 680, 918, 1485, 2401, 163, 488, 856, 1283, 445, 2185, 1773, 3004, 975, 1157, 234, 800, 3266, 2201], -[2117, 656, 1637, 514, 414, 3033, 3278, 927, 1965, 2351, 2372, 2572, 2285, 1624, 1529, 2780, 2665, 3015, 1022, 303, 1509, 2229, 897, 368, 52, 337, 1722, 2719, 1336, 2374, 2388, 1094, 318, 481, 3276, 2700, 39, 3112, 2367, 3010, 3220, 1094, 3203, 61, 3264, 1979, 2048, 292, 1475, 1328, 1112, 2813, 375, 1839, 1986, 2295, 1697, 2070, 112, 674, 921, 1719, 1195, 1767, 1483, 924, 703, 1606, 1365, 694, 3098, 3120, 2285, 1212, 2531, 401, 1093, 2550, 676, 2945, 465, 1061, 3053, 750, 2714, 2615, 2047, 2270, 3069, 1945, 1286, 2207, 2170, 2816, 1972, 299, 1068, 1767, 1968, 1078, 2544, 2320, 236, 3019, 1531, 2493, 1717, 1885, 2289, 2477, 2462, 1624, 2352, 2360, 2580, 2544, 3134, 902, 2502, 3233, 1789, 252, 197, 1803, 372, 1343, 922, 856, 633, 130, 2445, 1149, 1796, 381, 16, 2159, 2764, 3185, 2271, 2513, 1133, 1126, 1096, 272, 30, 1062, 3126, 676, 3236, 2500, 1695, 95, 2682, 2890, 3286, 3301, 2070, 1087, 1976, 2259, 692, 1612, 1169, 1045, 3022, 1192, 1469, 2662, 1868, 2545, 1135, 3258, 5, 2323, 1039, 2021, 1337, 931, 1029, 557, 2597, 2287, 955, 1463, 2298, 685, 2263, 310, 708, 2283, 3234, 1586, 20, 357, 2502, 2507, 1812, 2436, 271, 736, 1490, 2144, 718, 367, 2901, 1572, 1384, 2268, 875, 1557, 745, 2024, 1149, 2133, 1916, 2525, 469, 1764, 470, 1399, 386, 2296, 1765, 3046, 976, 1578, 1532, 1111, 3047, 690, 2033, 2307, 1834, 1736, 630, 2184, 1893, 1516, 658, 2016, 2476, 361, 2781, 62, 789, 677, 758, 1460, 891, 2299, 2601, 1327, 1484, 1102, 13, 1328], -[227, 2881, 2934, 1877, 1445, 1035, 841, 1422, 2771, 2429, 439, 32, 3042, 2410, 2433, 3047, 342, 159, 2687, 164, 2746, 514, 1542, 185, 815, 3173, 417, 2081, 1736, 2824, 3188, 166, 1176, 227, 499, 834, 829, 2850, 872, 109, 1051, 3219, 1974, 2581, 246, 2085, 276, 784, 2832, 2893, 1818, 1162, 3156, 2671, 1458, 1269, 516, 1650, 1956, 152, 81, 650, 405, 1885, 1425, 2756, 1080, 1575, 1526, 1370, 1159, 2365, 2244, 3219, 1231, 391, 2300, 836, 2430, 2808, 2017, 2430, 2782, 1098, 721, 2547, 223, 2068, 2136, 303, 1057, 830, 446, 1691, 2516, 953, 2930, 2537, 2846, 1274, 1762, 982, 945, 1742, 376, 1052, 1974, 2328, 354, 474, 1604, 2917, 1202, 1867, 1998, 2692, 3228, 2207, 3013, 3192, 1731, 2191, 2099, 1237, 2132, 767, 2776, 650, 2881, 2442, 561, 1370, 143, 2114, 312, 1124, 2301, 1839, 3214, 1812, 697, 534, 3285, 346, 698, 103, 1895, 1926, 1233, 2431, 2814, 1204, 2568, 538, 1855, 2019, 1934, 3319, 2912, 2543, 1651, 2416, 2303, 416, 2725, 1484, 611, 727, 1756, 2115, 1847, 647, 3133, 2504, 158, 832, 1346, 2857, 350, 1722, 1583, 936, 1232, 3297, 1156, 1933, 1842, 439, 728, 2141, 612, 325, 731, 2358, 1969, 1649, 1438, 886, 691, 2115, 1323, 552, 421, 2834, 1097, 625, 2630, 814, 265, 1019, 3063, 208, 1734, 2395, 1264, 2214, 2112, 1205, 159, 2197, 2168, 2655, 764, 3128, 603, 241, 973, 2703, 1961, 1396, 2123, 264, 2771, 440, 2114, 288, 1235, 108, 2591, 341, 2753, 851, 879, 0, 2593, 1439, 368, 2797, 1415, 2834, 2179, 1599, 2494, 3285, 2028, 3323]], -[[3236, 336, 469, 393, 681, 1084, 2197, 49, 1351, 3173, 375, 300, 2754, 1981, 2260, 1105, 3152, 1208, 2983, 499, 1136, 3164, 2357, 657, 605, 1497, 2533, 1348, 2158, 806, 694, 1567, 1923, 3087, 473, 2114, 2185, 908, 3164, 2866, 3141, 3277, 3216, 854, 1591, 729, 1452, 961, 161, 355, 443, 2223, 3317, 1304, 1652, 1442, 2772, 1720, 951, 1645, 130, 3033, 2055, 670, 832, 2254, 220, 1226, 2317, 1560, 349, 945, 771, 1444, 1982, 144, 2894, 1534, 1865, 828, 856, 1426, 1475, 2268, 3175, 546, 3296, 2563, 3319, 423, 704, 1344, 2872, 129, 164, 986, 2004, 1171, 3029, 133, 1575, 1335, 1751, 2557, 1109, 453, 3193, 271, 2591, 216, 600, 2636, 1672, 283, 27, 1953, 812, 755, 968, 2653, 2349, 2087, 1150, 1463, 3035, 1365, 2749, 1326, 2790, 2920, 2242, 1955, 847, 1397, 15, 1378, 944, 3321, 1966, 1229, 720, 318, 728, 928, 257, 3173, 1205, 2681, 1333, 3228, 1533, 320, 2894, 1949, 1272, 1989, 1736, 811, 496, 782, 1947, 644, 606, 1791, 1273, 71, 3315, 592, 518, 1533, 1808, 2655, 2309, 665, 1545, 1743, 2915, 1705, 2116, 505, 2412, 1350, 1864, 317, 3213, 10, 1706, 3272, 1106, 2320, 1374, 3164, 314, 314, 1038, 1136, 611, 2173, 2909, 2481, 738, 103, 451, 438, 2576, 2561, 1511, 2263, 2636, 1168, 2942, 191, 603, 860, 2554, 1244, 139, 2014, 2121, 2244, 2104, 1900, 329, 1029, 1442, 1570, 3179, 2639, 1979, 2676, 2442, 3151, 141, 1884, 2742, 291, 2484, 2689, 394, 2867, 2908, 2791, 1525, 2209, 2755, 191, 1586, 2448, 972, 2742, 252, 1519, 1568, 546, 623, 2252], -[832, 1602, 2989, 2379, 2113, 3210, 609, 473, 1515, 2815, 2191, 945, 160, 937, 499, 2405, 3261, 651, 2491, 3309, 3122, 1898, 2484, 3252, 961, 1596, 837, 222, 1565, 488, 2795, 2389, 2828, 2079, 2018, 742, 1034, 1403, 343, 290, 2825, 3298, 2511, 568, 2218, 1521, 2638, 1424, 3058, 704, 370, 3135, 620, 2591, 319, 1525, 755, 2292, 2693, 331, 426, 2079, 993, 3254, 1230, 191, 145, 408, 1872, 20, 1920, 769, 2126, 1916, 3021, 1857, 2011, 420, 1694, 2362, 1954, 395, 720, 1531, 2266, 2108, 413, 1245, 2026, 3217, 1376, 119, 2314, 625, 2097, 1104, 2393, 2683, 2226, 2676, 2280, 3312, 1804, 1114, 1523, 1992, 392, 1907, 285, 568, 513, 708, 657, 1423, 3133, 3307, 1207, 8, 2310, 2378, 2873, 2270, 2854, 1284, 2285, 641, 816, 454, 1325, 468, 2772, 190, 1505, 3255, 1251, 2992, 2894, 116, 2457, 1064, 2312, 973, 3258, 935, 3064, 173, 2050, 3168, 1692, 1068, 2453, 2082, 548, 3262, 2125, 440, 2306, 1938, 2384, 1955, 233, 280, 118, 1222, 274, 2085, 1908, 2087, 2212, 448, 2353, 252, 391, 3048, 777, 1508, 424, 2206, 1898, 2551, 2808, 477, 1657, 3179, 1966, 54, 1419, 2285, 2237, 188, 270, 280, 2891, 968, 905, 962, 96, 2227, 1891, 1156, 1500, 355, 2003, 2275, 2870, 3184, 3323, 1906, 1972, 190, 568, 660, 2809, 2041, 1645, 1081, 3094, 409, 2276, 2356, 1609, 1728, 828, 955, 2498, 1505, 3211, 2375, 2869, 488, 2156, 52, 653, 729, 2382, 718, 1951, 2230, 2240, 1783, 2121, 2923, 3155, 979, 242, 2043, 1017, 133, 2810, 2374, 1782, 2345, 2054, 1872, 815, 1463], -[1532, 932, 1476, 3209, 1469, 237, 1495, 518, 809, 1710, 792, 2096, 907, 458, 1013, 1682, 1325, 399, 315, 3121, 1584, 2286, 1284, 325, 682, 1028, 2536, 1911, 736, 3288, 2873, 1554, 3216, 2288, 42, 175, 3233, 913, 1911, 2404, 1242, 1113, 1228, 379, 2127, 1083, 39, 193, 2582, 1882, 1649, 1818, 2640, 2071, 1623, 235, 2732, 1679, 2441, 535, 420, 1138, 1195, 302, 1432, 308, 2467, 656, 1366, 3041, 1086, 1934, 1208, 1024, 3308, 2488, 1767, 1120, 2926, 1963, 2864, 2933, 80, 2866, 3030, 1695, 2909, 67, 65, 1636, 1089, 738, 2700, 3084, 2695, 1058, 1656, 3319, 224, 1451, 41, 1593, 1178, 1662, 840, 552, 3181, 2575, 2166, 1850, 2973, 2995, 634, 2451, 1441, 2762, 1771, 1929, 2412, 1112, 3004, 1852, 716, 2652, 959, 2800, 1101, 496, 3037, 2905, 2802, 202, 1202, 571, 512, 585, 2866, 850, 743, 486, 2687, 1888, 1106, 573, 78, 1063, 2228, 1641, 245, 919, 697, 2634, 1610, 780, 936, 1039, 1543, 1284, 1462, 1004, 354, 1155, 1687, 1840, 859, 2896, 3315, 1318, 130, 989, 1124, 2040, 2413, 2674, 710, 338, 1893, 1198, 2660, 1998, 2285, 1665, 2538, 1650, 475, 3049, 2349, 309, 758, 2224, 2565, 3254, 3207, 684, 1966, 1513, 1737, 2758, 2642, 644, 1096, 2784, 1586, 460, 1021, 758, 2654, 305, 880, 325, 2425, 1223, 1939, 215, 3120, 1573, 291, 2409, 995, 510, 1129, 291, 2608, 98, 2270, 2947, 2485, 2283, 1842, 1011, 2585, 1730, 317, 3132, 3157, 1118, 3262, 951, 2089, 1881, 1864, 2404, 2086, 1387, 1269, 1862, 975, 1230, 557, 2111, 1776, 966, 1184, 951, 3275, 2089], -[672, 2087, 876, 1898, 2630, 2142, 1294, 333, 2333, 1969, 1052, 2146, 1713, 600, 1682, 1838, 1185, 3287, 8, 1757, 600, 1574, 2145, 130, 165, 1300, 2361, 782, 968, 124, 2840, 2632, 3301, 2035, 944, 2758, 2208, 2858, 896, 1722, 3067, 2068, 2749, 823, 934, 3185, 2817, 1438, 1056, 1542, 2048, 3004, 1705, 1925, 956, 639, 2097, 3047, 1673, 911, 11, 2913, 1860, 1988, 735, 2807, 953, 739, 835, 2894, 453, 1245, 1892, 1397, 2048, 2611, 895, 2964, 2164, 2358, 286, 3100, 3160, 1177, 475, 1861, 2092, 1461, 551, 521, 2237, 406, 2330, 3247, 1019, 1857, 2175, 2319, 3028, 2994, 3148, 927, 3292, 121, 334, 1440, 2360, 2535, 2291, 1598, 2794, 2630, 2406, 1884, 451, 3040, 3277, 2540, 3198, 2417, 1351, 2159, 2963, 2971, 257, 113, 3206, 1765, 1616, 1436, 2958, 1010, 1102, 96, 879, 725, 1885, 1827, 943, 255, 1519, 950, 372, 1401, 224, 1102, 1767, 2568, 352, 794, 2799, 147, 1226, 129, 2321, 1896, 957, 2396, 1043, 3202, 3159, 2915, 2073, 2125, 1919, 1750, 725, 79, 3244, 151, 2732, 1865, 1394, 314, 764, 315, 402, 2059, 353, 2167, 1815, 1438, 1038, 269, 2779, 2334, 1444, 2011, 1586, 1529, 2333, 463, 3234, 1181, 1051, 407, 751, 2725, 1613, 1009, 2313, 1004, 2877, 2238, 80, 2864, 538, 2178, 1243, 3061, 1563, 868, 2781, 2727, 461, 3117, 455, 2223, 2366, 2862, 725, 2922, 924, 1900, 1060, 2, 692, 472, 2799, 3034, 1025, 2992, 1863, 3261, 3099, 1175, 1786, 1076, 1511, 693, 1215, 359, 807, 1408, 1766, 183, 324, 819, 259, 2641, 3319, 1578, 348, 349, 2057, 608]], -[[1206, 1314, 1500, 1288, 2199, 664, 813, 1904, 2451, 461, 2466, 2183, 2431, 776, 2967, 3088, 3049, 1792, 933, 1003, 2293, 1341, 1359, 3259, 2973, 1400, 612, 1613, 952, 2484, 1818, 404, 2014, 647, 1432, 2797, 1457, 1290, 2649, 1943, 718, 900, 790, 1446, 389, 889, 781, 462, 977, 1974, 2606, 2918, 2488, 237, 2308, 3095, 1012, 2124, 2726, 1336, 1792, 3305, 3093, 2377, 1547, 2182, 2880, 2633, 848, 1158, 300, 3027, 2569, 2545, 1263, 1963, 2641, 1932, 3147, 2821, 2944, 3076, 686, 1868, 1204, 1014, 1952, 1683, 1059, 3135, 268, 1244, 1507, 3095, 1571, 2442, 1178, 1159, 1042, 879, 144, 1099, 2983, 3234, 725, 381, 426, 1419, 1041, 128, 832, 3274, 124, 3283, 1727, 1904, 313, 1167, 2242, 1296, 2870, 1383, 2064, 501, 1913, 2534, 2438, 672, 2274, 1915, 1455, 2594, 1279, 159, 3243, 3280, 2797, 259, 445, 2811, 142, 2013, 783, 696, 1631, 558, 345, 1168, 1955, 1078, 1947, 2936, 2788, 1081, 2559, 462, 1620, 2475, 1728, 377, 1544, 1050, 3024, 2876, 1432, 1121, 699, 1533, 2260, 1408, 1831, 930, 2100, 71, 1666, 3261, 1884, 2231, 1354, 3024, 2044, 2449, 538, 1509, 618, 1669, 2663, 1719, 3081, 2214, 239, 2467, 1059, 3227, 1923, 1552, 1728, 1338, 2181, 2189, 2258, 2682, 1700, 2020, 625, 2116, 1856, 2870, 477, 978, 1114, 1294, 1468, 2735, 1811, 1152, 1660, 1107, 184, 1583, 2037, 2539, 1350, 1879, 534, 705, 275, 305, 203, 2815, 1902, 3067, 2206, 1811, 3204, 3132, 852, 1501, 47, 1, 661, 104, 2152, 2150, 1737, 740, 551, 1825, 1997, 1544, 2819, 712, 44, 1701, 261, 3035], -[619, 3204, 369, 1810, 1593, 84, 1721, 875, 3204, 56, 1919, 604, 3290, 2766, 2033, 2417, 2425, 313, 2004, 746, 1985, 2051, 1234, 1054, 1320, 1098, 1955, 262, 1348, 39, 527, 417, 2256, 3202, 2238, 499, 3139, 144, 3139, 2389, 2404, 1092, 699, 1025, 2972, 3318, 2298, 2652, 223, 1688, 3268, 2887, 2294, 557, 23, 155, 285, 414, 2557, 2945, 2210, 156, 2850, 141, 2659, 2339, 1480, 883, 2049, 1994, 1178, 1484, 3275, 1799, 3166, 1711, 2050, 872, 1574, 932, 3071, 177, 1168, 883, 472, 2145, 1423, 1457, 1918, 2797, 2903, 1729, 341, 3128, 2575, 1996, 2388, 1188, 1157, 301, 1138, 2038, 907, 2812, 1922, 1428, 1018, 2401, 3232, 3317, 2160, 974, 1329, 3191, 676, 972, 2908, 1875, 2224, 1555, 694, 760, 997, 502, 1563, 594, 889, 2186, 1065, 577, 2396, 335, 1544, 975, 599, 564, 910, 2978, 2913, 1944, 2351, 3219, 134, 2920, 1204, 69, 2971, 72, 2134, 463, 1935, 3206, 2809, 2857, 923, 2603, 1448, 800, 3001, 458, 1507, 2955, 765, 1677, 567, 2614, 1233, 1110, 2627, 5, 2068, 3101, 2636, 1418, 2125, 1039, 2024, 3150, 842, 1494, 311, 2810, 2003, 1067, 2904, 774, 1501, 1649, 564, 343, 946, 1037, 2142, 1504, 2264, 1407, 1013, 1114, 1872, 2516, 1986, 124, 2125, 1631, 2711, 1541, 3135, 2558, 1044, 35, 546, 3296, 1710, 705, 1986, 570, 306, 136, 2041, 3159, 1077, 965, 2006, 1172, 3097, 2706, 1766, 1822, 1975, 2586, 2887, 2441, 694, 3029, 2763, 3325, 646, 2618, 1128, 795, 2460, 913, 38, 466, 1841, 740, 2563, 1556, 1531, 425, 2553, 2570, 2341, 3193, 862, 1921], -[3248, 2199, 1872, 1800, 252, 2561, 1433, 1415, 610, 3292, 2771, 2753, 2871, 1735, 2797, 131, 1348, 2221, 1271, 2042, 1041, 2476, 1145, 1854, 3229, 1441, 2327, 2990, 2265, 998, 2400, 841, 248, 138, 231, 2486, 1360, 1079, 2207, 2606, 1258, 2862, 2262, 1495, 2776, 1520, 291, 2184, 1988, 947, 926, 2727, 1929, 971, 934, 962, 2360, 1037, 758, 2801, 2759, 2321, 2593, 986, 1858, 1963, 791, 1722, 957, 1547, 879, 2237, 1133, 738, 1404, 2684, 458, 2263, 2855, 2170, 963, 1821, 1563, 1524, 1223, 1441, 1606, 737, 158, 1859, 2721, 1756, 2168, 368, 1219, 828, 2155, 479, 1680, 1180, 2964, 811, 1681, 126, 1166, 1691, 694, 2515, 1890, 963, 1987, 2789, 79, 424, 1082, 365, 3216, 781, 1788, 3091, 2053, 2677, 593, 2000, 3020, 1884, 2396, 284, 2489, 3223, 1520, 2460, 2438, 2583, 2285, 663, 2540, 1668, 2208, 3087, 1751, 30, 1930, 1544, 1688, 3052, 3326, 452, 3232, 1905, 1960, 2547, 909, 1030, 774, 357, 3114, 1973, 1607, 2624, 236, 2273, 308, 507, 1123, 616, 1083, 127, 1848, 1701, 808, 220, 1735, 3153, 1223, 2654, 1719, 2409, 2233, 1793, 420, 3238, 1927, 460, 2615, 27, 1242, 2823, 2504, 1706, 2352, 1916, 1257, 2408, 1232, 3174, 1401, 1517, 518, 1072, 2849, 728, 293, 1397, 1844, 1830, 2559, 75, 492, 2869, 2848, 1265, 2524, 1421, 358, 3202, 1837, 2925, 932, 2859, 389, 1295, 1920, 488, 2459, 1364, 2853, 1247, 289, 2486, 2806, 807, 1535, 2870, 29, 2879, 3195, 1054, 2148, 422, 2057, 585, 88, 1290, 1579, 2426, 1553, 976, 517, 1857, 2045, 475, 3117, 2334, 1878, 2771], -[1351, 279, 2141, 1097, 1906, 3306, 776, 1713, 3070, 2649, 1632, 996, 469, 552, 952, 714, 2772, 1663, 2450, 233, 939, 3077, 2355, 879, 1038, 1875, 2196, 1381, 3011, 3159, 1812, 2979, 2788, 1530, 2606, 2497, 433, 2491, 2733, 263, 2487, 194, 1191, 770, 2073, 1575, 3291, 1698, 2815, 2684, 2822, 1770, 2092, 42, 2484, 2177, 2609, 2743, 3036, 2211, 1958, 2673, 1232, 1046, 1748, 3250, 3243, 2517, 1274, 3124, 2877, 2737, 3012, 2560, 1170, 2219, 2189, 2855, 585, 2168, 992, 3051, 1151, 2110, 2031, 658, 781, 3158, 906, 349, 140, 1103, 38, 388, 1605, 1860, 1049, 229, 1512, 476, 2634, 33, 2385, 1801, 665, 2179, 2441, 1095, 1406, 214, 1005, 1809, 1883, 1220, 1491, 2155, 2349, 3199, 62, 748, 580, 2035, 1474, 365, 1455, 967, 1337, 2746, 2766, 3124, 1666, 3308, 2553, 2952, 3309, 1779, 2683, 2204, 2239, 664, 2049, 3317, 3129, 786, 1448, 2343, 3312, 1591, 2325, 2021, 1646, 164, 822, 419, 1237, 1989, 2556, 1951, 3134, 1162, 206, 1566, 1846, 2440, 663, 1801, 2154, 835, 1901, 2141, 410, 1820, 1170, 967, 2540, 630, 205, 1623, 209, 2169, 3196, 2962, 1241, 2218, 1372, 179, 1672, 1089, 282, 552, 38, 2889, 1454, 331, 1075, 2603, 1851, 1004, 1580, 837, 2250, 1390, 2129, 69, 1183, 2592, 2701, 2512, 2779, 1930, 167, 1678, 687, 2626, 3029, 518, 1729, 1466, 2969, 1638, 3243, 509, 1912, 2760, 722, 2714, 1012, 1370, 1733, 3288, 1646, 2526, 1406, 1304, 1442, 1755, 549, 1627, 1479, 2781, 2842, 525, 973, 499, 888, 413, 3097, 2384, 173, 520, 1527, 2000, 2653, 318, 1623, 386]]] - -r: [[0, 3328, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 2, 0, 2, 3328, 0, 3328, 1, 1, 0, 3328, 0, 3327, 1, 0, 1, 3327, 1, 3328, 0, 0, 1, 3328, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 2, 2, 0, 3328, 3327, 1, 1, 0, 0, 3327, 2, 0, 3327, 1, 3328, 1, 0, 3328, 1, 1, 0, 0, 2, 3327, 0, 0, 0, 3327, 3328, 1, 0, 3328, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 0, 0, 3327, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 0, 1, 1, 2, 1, 1, 3328, 1, 3328, 1, 1, 3327, 3328, 1, 0, 2, 3328, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 3328, 0, 2, 1, 0, 3327, 1, 0, 1, 1, 2, 2, 0, 3327, 1, 3327, 0, 0, 1, 0, 3328, 3328, 1, 0, 0, 1, 3328, 2, 1, 0, 0, 2, 1, 3328, 3328, 0, 1, 0, 0, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3327, 1, 3327, 3328, 1, 3327, 0, 1, 0, 0, 3328, 0, 1, 3328, 3328, 0, 1, 0, 3328, 0, 0, 1, 0, 1, 3328, 3328], -[1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 3328, 3328, 0, 3328, 3328, 3328, 1, 1, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 1, 1, 3328, 1, 3328, 2, 0, 3328, 0, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 0, 3327, 3328, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 3327, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 2, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 2, 3327, 3328, 3327, 2, 1, 2, 0, 0, 3328, 3328, 0, 3327, 0, 1, 3327, 1, 0, 3328, 1, 0, 3327, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 1, 0, 3328, 0, 0, 1, 0, 0, 1, 0, 1, 0, 3328, 1, 1, 1, 0, 0, 1, 3328, 3327, 1, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 3327, 0, 3327, 3328, 1, 3328, 1, 3328, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3327, 0, 0, 2, 0, 1, 3328, 2, 1, 0, 3328, 0, 0, 0, 1, 3327, 0, 0, 3327, 0, 1, 0, 0, 2, 0, 3328, 1, 1, 3328, 3328, 1, 0, 3327, 1, 0, 3327, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 2, 3327, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 1, 1, 1, 1, 1, 3328, 0, 2, 3327, 2, 1], -[3328, 0, 0, 1, 0, 3328, 1, 1, 1, 1, 3328, 0, 1, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 3328, 2, 0, 1, 1, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 3328, 1, 2, 0, 3328, 1, 3327, 0, 1, 0, 1, 3327, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 3327, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 1, 1, 3327, 3327, 1, 1, 1, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 1, 2, 0, 0, 1, 0, 3327, 0, 0, 0, 0, 0, 3327, 3328, 3328, 3328, 0, 0, 1, 2, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 3328, 1, 3328, 2, 1, 1, 1, 0, 3327, 3327, 3328, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 1, 3327, 1, 1, 1, 3328, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 3327, 0, 0, 0, 3328, 3328, 1, 3327, 1, 0, 1, 3328, 0, 0, 0, 3327, 3328, 2, 0, 3328, 1, 2, 0, 3328, 0, 2, 1, 0, 2, 0, 3328, 1, 3328, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 3327, 1, 0, 3328, 0, 3328, 0, 1, 1, 3327, 0, 3327, 1, 3328, 2, 0], -[1, 3328, 0, 1, 3327, 1, 1, 1, 2, 0, 0, 0, 1, 0, 0, 3328, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 0, 0, 2, 3328, 3328, 0, 3328, 3328, 0, 1, 0, 3328, 3327, 1, 3328, 1, 2, 3328, 1, 0, 0, 3328, 3328, 0, 0, 1, 0, 3328, 3328, 3328, 0, 2, 1, 2, 3328, 0, 3328, 0, 0, 1, 2, 1, 0, 2, 3328, 3328, 0, 0, 3328, 0, 0, 0, 2, 3328, 3328, 2, 3327, 2, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 3327, 0, 1, 0, 1, 2, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 3328, 2, 1, 3327, 1, 3328, 1, 2, 1, 0, 0, 2, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 3328, 1, 2, 2, 2, 1, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 3327, 3328, 0, 1, 3328, 0, 0, 3327, 0, 0, 2, 0, 0, 3327, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 0, 2, 2, 3328, 0, 1, 1, 3327, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 2, 3328, 3328, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 3328, 3328, 1, 3327, 3327, 1, 0, 0, 3328, 1, 0]] - -e1: [[0, 3328, 3328, 3328, 3328, 3327, 0, 3328, 2, 3327, 3328, 3328, 0, 0, 2, 3328, 3328, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 3328, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 3327, 1, 3327, 0, 3328, 1, 3327, 3328, 3328, 1, 1, 0, 1, 0, 0, 3328, 0, 3328, 3328, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 0, 3327, 0, 1, 3327, 3328, 3328, 3327, 1, 1, 3328, 0, 3328, 0, 0, 1, 3328, 0, 3328, 3328, 3328, 1, 2, 0, 3328, 3328, 0, 0, 1, 3328, 3328, 1, 1, 1, 0, 0, 3328, 0, 1, 1, 0, 1, 0, 3328, 3328, 2, 3328, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 0, 1, 3327, 3328, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 0, 3327, 1, 0, 0, 0, 3328, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 0, 2, 3328, 1, 1, 1, 0, 0, 1, 3328, 2, 0, 1, 3328, 1, 1, 0, 3328, 3327, 1, 1, 1, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 3327, 1, 0, 0, 1, 3328, 3328, 3328, 0, 0, 2, 2, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3327, 1, 3327, 1, 1, 0, 0, 0, 1], -[0, 2, 3328, 0, 1, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 0, 2, 3327, 3328, 0, 1, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 3327, 1, 3328, 2, 3328, 0, 1, 0, 3327, 0, 3328, 0, 0, 3328, 3328, 3327, 0, 3327, 0, 3328, 1, 0, 0, 3328, 3328, 1, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3327, 1, 1, 0, 1, 3328, 2, 3328, 3328, 3328, 3327, 2, 3328, 1, 0, 3328, 3328, 0, 3327, 0, 3328, 1, 1, 2, 0, 1, 3328, 0, 0, 0, 1, 3328, 1, 0, 0, 0, 3328, 0, 0, 3328, 1, 1, 0, 1, 3328, 0, 3328, 1, 3327, 1, 0, 1, 0, 0, 1, 1, 1, 3328, 1, 3327, 2, 0, 1, 3328, 3327, 1, 3328, 2, 2, 1, 0, 1, 3327, 0, 0, 0, 3328, 3328, 0, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 3328, 0, 1, 1, 3328, 0, 0, 0, 2, 0, 0, 2, 0, 3328, 1, 0, 3328, 2, 0, 3327, 0, 2, 3328, 0, 0, 0, 1, 3328, 2, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 2, 0, 0, 0, 1, 3327, 3328, 0, 3328, 2, 0, 1, 3327, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3327, 2, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 2, 3328, 3327, 1, 0, 3328, 1, 0, 3328, 3328, 0, 1, 0, 1], -[3328, 0, 1, 3328, 1, 3328, 3328, 2, 3327, 1, 1, 3328, 0, 3328, 0, 3327, 0, 3328, 1, 3328, 1, 2, 1, 0, 0, 3328, 3328, 2, 3327, 1, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3327, 3328, 3328, 0, 2, 0, 3328, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 1, 0, 1, 3327, 3327, 2, 1, 1, 0, 1, 3328, 3328, 1, 1, 3328, 1, 0, 3328, 2, 3328, 3328, 0, 3328, 3328, 3328, 3327, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 3327, 2, 0, 1, 1, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 1, 3328, 3328, 1, 1, 0, 0, 0, 3328, 3328, 3327, 0, 3328, 3328, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 2, 3327, 0, 2, 2, 1, 0, 3328, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3328, 0, 0, 1, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 1, 1, 2, 3328, 2, 1, 1, 1, 0, 3328, 1, 3327, 3328, 0, 3327, 2, 1, 1, 3328, 0, 1, 0, 3328, 0, 3328, 2, 3327, 3328, 3328, 3328, 0], -[3328, 0, 0, 1, 0, 1, 1, 3328, 0, 0, 1, 3328, 1, 1, 0, 3328, 3327, 2, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 1, 3328, 1, 0, 3328, 2, 0, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 3328, 3327, 3328, 1, 2, 0, 3328, 3328, 1, 1, 1, 2, 3328, 2, 3328, 0, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1, 3328, 1, 1, 2, 0, 2, 0, 3328, 3328, 0, 3328, 1, 0, 2, 2, 0, 3328, 1, 1, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 3328, 3327, 1, 1, 1, 0, 3328, 1, 1, 0, 1, 0, 2, 0, 1, 1, 0, 0, 3327, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 0, 3327, 0, 0, 2, 3328, 3327, 0, 1, 1, 3327, 3328, 0, 0, 0, 1, 3328, 3328, 0, 2, 3327, 1, 1, 3328, 0, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3328, 1, 3328, 0, 3328, 1, 2, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 0, 0, 3328, 1, 0, 3327, 1, 0, 1, 0, 2, 0, 1, 1, 3328, 0, 1, 1, 0, 1, 1, 3327, 3327, 0, 3328, 1, 0, 0, 0, 2, 3327, 2, 1, 3328, 2, 0, 1]] - -e2: [0, 3327, 1, 3328, 1, 2, 0, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 1, 2, 0, 0, 0, 1, 0, 2, 1, 2, 0, 3327, 2, 3328, 3327, 2, 1, 1, 0, 0, 0, 3328, 0, 1, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 0, 1, 3327, 3328, 3328, 3327, 0, 0, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 2, 1, 3328, 0, 0, 2, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 0, 3328, 0, 2, 3328, 3328, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 0, 0, 0, 0, 3327, 1, 1, 0, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3327, 1, 0, 2, 3328, 1, 1, 0, 1, 0, 3328, 1, 3328, 1, 0, 3328, 1, 1, 2, 3328, 1, 0, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 1, 0, 3328, 2, 0, 2, 3328, 0, 0, 0, 3327, 2, 3328, 3328, 3327, 0, 0, 0, 3328, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 3327, 0, 3328, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 1, 0, 1, 3327, 3328, 1, 1, 3328, 3327, 1, 0] -rHat: [[2961, 3151, 3250, 2522, 466, 1490, 1030, 1206, 2334, 2137, 1753, 2041, 2417, 1536, 2849, 2167, 2109, 919, 3056, 1731, 1659, 1875, 2419, 2016, 2710, 1881, 2237, 2309, 2798, 1029, 2844, 3148, 2249, 2078, 1804, 1091, 3190, 1373, 3122, 2914, 1641, 358, 2751, 1763, 206, 424, 2254, 2358, 1224, 3280, 2695, 2390, 2284, 274, 1151, 2264, 172, 2380, 1036, 2592, 2833, 2022, 1622, 491, 1655, 2741, 3282, 290, 206, 175, 2374, 1809, 908, 779, 1458, 305, 2308, 2476, 3075, 811, 2695, 2671, 1230, 782, 1376, 1540, 2642, 928, 1982, 864, 1397, 2176, 138, 1232, 898, 340, 2206, 2730, 1402, 2119, 2834, 1508, 2641, 1930, 288, 1599, 2775, 490, 1978, 1969, 3010, 2127, 1484, 2233, 3010, 1764, 690, 2285, 779, 1092, 859, 1627, 566, 502, 314, 1790, 2788, 771, 1950, 2163, 250, 718, 756, 239, 1797, 508, 2590, 2409, 2409, 3069, 1069, 219, 606, 618, 2155, 2175, 1603, 2041, 1765, 3072, 1492, 2660, 1511, 982, 2442, 2669, 735, 685, 1153, 1729, 2108, 2742, 1146, 1168, 2604, 2012, 796, 766, 1232, 2440, 2645, 1584, 2624, 892, 402, 1440, 1987, 2819, 457, 3142, 1976, 2606, 345, 3267, 465, 3282, 472, 882, 1081, 409, 614, 1273, 1904, 1507, 344, 496, 2426, 1611, 1595, 191, 2808, 2900, 1971, 269, 2413, 1656, 1031, 3323, 3094, 1094, 710, 1983, 1669, 1443, 19, 2852, 168, 3199, 1599, 393, 1722, 2438, 914, 2791, 1879, 1726, 889, 2821, 1074, 2815, 1281, 2225, 1240, 1544, 3134, 768, 3268, 1102, 2173, 133, 1603, 3152, 2293, 2947, 2342, 2474, 314, 157, 2066, 2186, 749, 967, 1908, 2, 1503, 747], -[1189, 2551, 2100, 2299, 2054, 2162, 3251, 1612, 2462, 3169, 915, 103, 2714, 3276, 2159, 3154, 3152, 2348, 559, 1071, 2421, 2154, 1575, 2261, 2653, 468, 1337, 662, 907, 2087, 527, 541, 549, 1961, 1239, 2163, 727, 490, 393, 2693, 1601, 757, 487, 990, 555, 1418, 298, 354, 1450, 1595, 1914, 1794, 1274, 1825, 1624, 1290, 3162, 1400, 1705, 1487, 3041, 2435, 1288, 1391, 3147, 825, 842, 1775, 1484, 2047, 500, 1973, 878, 1261, 60, 2102, 236, 558, 2754, 2788, 682, 434, 1646, 1171, 2657, 2727, 2339, 2040, 2008, 1623, 1963, 2666, 934, 1717, 39, 778, 1289, 960, 1094, 2293, 614, 3234, 1820, 1398, 575, 1580, 1041, 2844, 2708, 3137, 1537, 2148, 408, 2415, 1547, 2957, 2357, 409, 1685, 491, 3119, 129, 2576, 183, 487, 2265, 2827, 3032, 2544, 2631, 3182, 474, 2093, 2298, 1329, 2063, 296, 1911, 3148, 133, 1214, 1762, 3081, 1864, 2522, 1331, 1523, 1694, 1563, 1370, 1183, 38, 638, 1960, 2711, 2801, 2339, 2802, 535, 1774, 2869, 1522, 2765, 2201, 3262, 410, 1833, 588, 421, 2501, 3156, 494, 1935, 106, 970, 1266, 1488, 3260, 2111, 2712, 3199, 1525, 2672, 3109, 732, 2472, 861, 1811, 1910, 1641, 499, 2052, 1771, 787, 1658, 231, 124, 1770, 2701, 645, 3203, 3029, 1169, 2875, 1435, 2968, 2212, 308, 232, 3289, 2018, 1813, 1815, 3203, 61, 822, 2652, 250, 990, 2565, 175, 1404, 2600, 3175, 100, 2623, 1234, 1411, 1116, 1753, 767, 3180, 2619, 829, 1328, 2731, 1207, 2624, 872, 497, 2731, 2358, 3038, 3214, 2936, 2091, 1250, 1210, 3167, 3138, 246, 1191, 1091, 239, 1618, 451], -[125, 1510, 2110, 3009, 1778, 1285, 938, 1419, 68, 809, 2600, 491, 492, 1897, 978, 2401, 2711, 779, 348, 752, 2074, 3128, 1260, 1871, 1244, 1799, 735, 1223, 2239, 1419, 791, 1997, 2045, 3275, 2715, 3147, 250, 3157, 878, 1816, 1889, 3318, 1364, 1787, 2863, 1533, 1639, 1559, 2493, 1826, 2511, 1427, 844, 2177, 428, 1155, 1057, 3018, 207, 43, 2134, 602, 3327, 3013, 179, 1926, 838, 3004, 3158, 90, 2275, 534, 3006, 2862, 2681, 1791, 3046, 2263, 3065, 985, 2779, 732, 2646, 2516, 2047, 79, 1034, 2434, 1120, 1250, 2537, 609, 2270, 3287, 786, 2528, 344, 2972, 1448, 1516, 275, 128, 2558, 1660, 1027, 2989, 3241, 2639, 2732, 227, 362, 1615, 591, 2044, 1780, 1745, 550, 536, 2711, 628, 1441, 1748, 1709, 1869, 2078, 687, 3015, 1322, 1432, 2658, 3140, 2281, 2191, 323, 138, 654, 1176, 850, 2368, 2482, 12, 3080, 1749, 1813, 3322, 3027, 65, 298, 2844, 1375, 3116, 728, 1257, 1884, 890, 2929, 1469, 3037, 2862, 2379, 672, 1024, 2695, 1775, 1282, 542, 2094, 531, 1913, 3001, 2015, 1040, 2433, 2971, 140, 2241, 1209, 636, 836, 2245, 592, 823, 3328, 1526, 459, 1862, 3120, 2843, 1484, 3174, 1490, 3225, 1991, 740, 415, 2169, 1873, 3322, 795, 2649, 3272, 418, 1002, 2662, 2162, 1275, 2861, 2247, 2890, 134, 2181, 1308, 2549, 976, 574, 2913, 1394, 2749, 3158, 2666, 2592, 1712, 725, 1962, 171, 1324, 2697, 718, 1202, 1190, 3133, 3115, 2979, 221, 433, 1932, 801, 1204, 1392, 46, 1184, 3102, 1601, 1880, 3110, 2858, 3208, 461, 1577, 3170, 1715, 2465, 3150, 2297, 542, 1373], -[129, 3281, 1891, 987, 608, 1105, 536, 193, 517, 1519, 230, 2266, 1852, 1290, 1686, 1876, 1797, 2312, 2503, 556, 420, 1266, 2259, 2616, 230, 1176, 2515, 291, 3169, 1769, 1159, 3237, 2988, 934, 2904, 1271, 570, 2276, 2989, 2393, 1965, 695, 2379, 1903, 971, 165, 210, 2288, 1241, 243, 1719, 551, 1060, 1233, 1384, 2422, 2036, 3001, 425, 2274, 307, 1758, 2723, 2651, 1423, 1577, 395, 610, 1573, 2921, 2026, 584, 1903, 2244, 3222, 520, 1770, 811, 1289, 1722, 786, 2263, 2679, 2071, 2698, 1651, 1006, 2944, 1272, 726, 2615, 1124, 440, 2276, 2512, 574, 2680, 1050, 1004, 45, 2342, 1647, 2928, 1933, 2311, 148, 1034, 2048, 1445, 1002, 15, 136, 2344, 1942, 109, 291, 656, 2244, 2034, 305, 2914, 1130, 1918, 305, 587, 932, 1431, 1574, 47, 2833, 3201, 2256, 1489, 961, 2810, 2670, 2188, 1434, 2185, 1288, 2792, 3142, 2263, 2399, 2350, 115, 2424, 2344, 2261, 1936, 1724, 2299, 446, 2972, 1929, 780, 1832, 835, 1574, 1361, 2763, 2881, 313, 3294, 1868, 2936, 1533, 1264, 553, 2251, 1071, 2463, 3150, 2330, 826, 3275, 1284, 1996, 2776, 925, 847, 1197, 3217, 2821, 2864, 1138, 915, 2495, 14, 1451, 3150, 927, 1371, 1069, 1247, 121, 1147, 1844, 1608, 1240, 1748, 1637, 3270, 1827, 3217, 837, 2605, 1693, 2588, 2886, 901, 1535, 459, 428, 154, 2854, 1067, 2096, 2589, 55, 396, 1053, 46, 154, 1228, 3036, 328, 128, 72, 204, 2303, 3104, 112, 489, 377, 1990, 145, 2473, 2994, 859, 1758, 1730, 291, 517, 2892, 3093, 1430, 2643, 1636, 837, 59, 1968, 460, 1939, 3307, 185]] - -BHat * rHat: [[3177, 2307, 2045, 211, 502, 2182, 280, 2061, 1553, 1500, 2903, 1612, 1218, 2202, 3131, 26, 1881, 1487, 3171, 1176, 1953, 232, 887, 2834, 2475, 1504, 1778, 1293, 194, 1958, 1224, 1530, 1718, 1679, 1414, 390, 1106, 1685, 416, 399, 1732, 1013, 2278, 1386, 3112, 1003, 516, 1180, 2108, 962, 633, 2541, 2704, 2031, 2667, 203, 3160, 2046, 477, 887, 448, 1666, 742, 2912, 2329, 56, 1688, 2262, 1513, 1327, 709, 2954, 395, 630, 661, 941, 2012, 1957, 1816, 1923, 918, 1565, 1838, 859, 1923, 2054, 58, 1737, 2812, 1887, 2569, 108, 2063, 971, 1718, 2233, 1898, 344, 517, 2919, 955, 16, 1172, 2114, 620, 382, 1751, 3232, 3138, 2853, 2268, 615, 3031, 188, 2982, 1177, 494, 14, 2450, 3270, 2362, 2313, 1171, 2530, 3105, 2013, 726, 507, 626, 2708, 405, 3037, 2565, 43, 2351, 858, 1215, 1800, 268, 2370, 2945, 1237, 2408, 125, 156, 651, 2315, 2590, 3107, 2172, 2577, 2998, 2058, 1320, 282, 1180, 2891, 3096, 174, 2048, 20, 3163, 1973, 844, 283, 3136, 732, 1697, 409, 906, 2185, 812, 1788, 738, 2249, 1968, 1649, 2209, 2856, 1061, 775, 1351, 746, 556, 1226, 1770, 2504, 2836, 1207, 2312, 2080, 275, 2630, 2516, 1272, 1101, 2973, 1436, 1524, 3035, 454, 2458, 1753, 1931, 1964, 92, 1254, 3250, 2434, 2808, 2506, 1511, 325, 464, 1494, 2469, 207, 1521, 2190, 2403, 239, 3050, 1137, 423, 574, 355, 655, 1042, 2432, 259, 310, 2204, 1840, 2348, 1549, 2843, 1785, 1748, 239, 2160, 1567, 776, 1617, 1229, 2520, 421, 3261, 3065, 1618, 2951, 654, 2350, 867, 386, 1073, 366], -[1396, 3277, 3123, 1246, 892, 1821, 416, 1095, 2313, 2155, 2538, 2380, 1873, 1203, 2992, 2095, 2261, 1877, 2457, 2468, 495, 1649, 1243, 1662, 2288, 2281, 2418, 1597, 2094, 3288, 1542, 806, 2473, 903, 1672, 90, 2657, 1705, 1626, 1477, 487, 919, 1259, 3171, 1721, 857, 1687, 346, 1801, 1593, 1652, 660, 1968, 97, 2612, 2233, 2873, 2963, 1398, 472, 1926, 1154, 2078, 269, 3280, 1349, 2388, 93, 1133, 165, 1737, 1830, 2177, 1312, 2229, 1327, 488, 2667, 1459, 1308, 1783, 2551, 2327, 1986, 1383, 1908, 107, 2509, 2191, 3272, 3040, 3279, 3275, 1218, 2459, 1888, 87, 1165, 1375, 1875, 2271, 2946, 2299, 1128, 495, 552, 688, 3004, 152, 410, 1706, 632, 2611, 2036, 1790, 2214, 1592, 844, 1472, 2743, 1792, 252, 585, 359, 2170, 1522, 1900, 65, 74, 2510, 2767, 2301, 372, 1756, 549, 1051, 1007, 72, 2808, 1828, 3141, 2584, 200, 563, 3181, 1327, 368, 3293, 257, 774, 221, 26, 308, 2068, 578, 272, 1610, 1013, 468, 1070, 220, 1664, 1234, 601, 1194, 2200, 2547, 2965, 1694, 534, 2042, 1404, 2826, 2958, 1936, 3262, 1578, 1323, 2605, 457, 2837, 669, 2711, 2288, 2007, 773, 1257, 2458, 943, 240, 190, 3281, 3227, 2377, 69, 1314, 1833, 1513, 2404, 2121, 3097, 1291, 2166, 3246, 2954, 1836, 1516, 2412, 72, 833, 101, 2060, 157, 1939, 885, 1336, 3167, 2181, 206, 2808, 334, 1889, 1535, 767, 2805, 732, 2998, 356, 160, 3208, 1443, 1173, 193, 1504, 2434, 3227, 183, 82, 2620, 3273, 3081, 767, 1207, 607, 2747, 1262, 972, 2984, 2697, 203, 1905, 962, 744, 2490, 542, 3117], -[36, 2141, 2507, 2722, 695, 674, 2402, 2411, 1481, 2602, 3005, 1950, 2693, 1536, 873, 2707, 1997, 527, 885, 22, 2263, 994, 415, 2981, 386, 1029, 2066, 274, 3196, 441, 273, 3108, 1768, 2146, 2047, 2282, 2835, 1038, 385, 2576, 2918, 208, 255, 2576, 2187, 874, 3139, 835, 2396, 1696, 63, 2747, 3205, 242, 96, 457, 2308, 3260, 1349, 2451, 1719, 2309, 967, 407, 2934, 293, 2298, 3205, 1763, 614, 124, 77, 973, 136, 549, 118, 637, 2582, 169, 1297, 3001, 1396, 1595, 761, 759, 433, 729, 27, 1740, 1629, 1811, 542, 2412, 322, 844, 137, 2249, 2113, 21, 2530, 612, 1769, 249, 2471, 3212, 2598, 2453, 3208, 329, 1930, 937, 2077, 57, 735, 2468, 3244, 3315, 374, 2168, 142, 2230, 475, 1683, 838, 2564, 2306, 102, 3014, 3063, 21, 3024, 2846, 1269, 3079, 224, 2172, 2107, 1115, 3317, 3328, 1378, 923, 401, 1672, 618, 1277, 377, 2658, 513, 1936, 666, 702, 584, 2002, 36, 3017, 207, 2434, 549, 1219, 2350, 2086, 2559, 756, 628, 805, 1905, 3150, 2897, 2029, 2765, 247, 1230, 1896, 2107, 2033, 1011, 915, 1524, 140, 1635, 2194, 2348, 2336, 2280, 2779, 3115, 1641, 1595, 2152, 2749, 1450, 2547, 3306, 2367, 586, 1598, 717, 1996, 779, 764, 2292, 3140, 1476, 2384, 308, 1295, 1623, 1989, 548, 796, 1048, 1658, 2125, 2501, 2980, 530, 1418, 1004, 275, 8, 712, 3316, 1078, 1101, 2937, 616, 2132, 2592, 2561, 2491, 2334, 1656, 1386, 2760, 809, 1606, 1941, 3010, 593, 1688, 1666, 2927, 1582, 2431, 1202, 1691, 2145, 1046, 2138, 1407, 1859, 645, 1954, 198, 527], -[1506, 379, 1200, 924, 1096, 407, 3201, 2679, 1175, 2383, 151, 1150, 1101, 3211, 1477, 2148, 1078, 2363, 3224, 2756, 1525, 2512, 583, 785, 328, 2669, 895, 2307, 949, 2127, 1386, 1876, 2459, 1636, 686, 2969, 2242, 2840, 1416, 826, 2899, 885, 2234, 37, 425, 1235, 1578, 1055, 2907, 525, 858, 430, 1908, 15, 3221, 933, 1880, 2226, 2412, 2800, 1729, 959, 820, 2324, 15, 1322, 3226, 1066, 2086, 1501, 2703, 2905, 3003, 1714, 241, 2339, 1210, 1327, 3154, 1245, 1820, 1694, 1151, 1516, 1575, 1272, 1425, 2292, 618, 809, 2588, 988, 2176, 1135, 2106, 2675, 924, 1053, 1126, 2056, 2818, 1862, 1974, 818, 379, 2933, 2314, 1803, 862, 2891, 934, 2381, 842, 446, 3241, 142, 2881, 550, 2934, 3284, 989, 1467, 2565, 2278, 1305, 245, 708, 2434, 1235, 1982, 1056, 2099, 459, 2260, 2464, 2604, 2231, 2657, 2326, 842, 1833, 3224, 395, 72, 1997, 3071, 1006, 2584, 685, 1198, 1230, 939, 909, 2634, 1056, 2503, 2068, 3074, 3163, 2885, 1216, 2512, 1366, 1287, 497, 3168, 1704, 1239, 2795, 829, 1926, 1073, 1499, 1657, 3278, 1090, 1274, 809, 535, 1055, 2486, 3073, 2668, 2030, 2353, 1250, 3195, 696, 493, 1422, 2327, 971, 464, 1228, 115, 827, 2712, 631, 1340, 69, 2131, 505, 503, 879, 1769, 3048, 1737, 937, 2082, 2227, 183, 2823, 20, 2032, 559, 157, 2032, 2079, 2871, 1940, 1468, 2682, 2785, 2394, 2195, 3067, 2872, 2930, 2607, 3300, 1986, 3165, 3308, 282, 397, 2735, 1390, 2599, 1483, 315, 2720, 1197, 2965, 2466, 1095, 1057, 1383, 1411, 2811, 247, 2240, 1499, 2765, 2881, 144, 2083]] -NTTInverse(BHat * rHat): [[3070, 1403, 2569, 1535, 2889, 2555, 885, 3020, 1056, 2040, 995, 873, 2394, 1510, 2542, 2103, 689, 51, 1822, 3032, 2675, 2707, 2636, 1256, 3207, 2846, 1050, 1173, 636, 530, 1794, 746, 1513, 286, 2642, 2601, 3062, 2961, 1264, 818, 388, 194, 2629, 1173, 973, 1503, 1815, 1303, 1481, 548, 2909, 1001, 1315, 869, 1852, 2329, 1081, 1718, 2971, 2064, 1649, 1337, 3030, 1542, 145, 243, 1749, 559, 2441, 1805, 2460, 49, 2615, 1890, 1190, 2547, 2409, 1359, 1717, 3221, 369, 639, 964, 682, 232, 375, 1578, 1223, 248, 1212, 1333, 599, 998, 234, 1285, 324, 3145, 2356, 642, 766, 19, 2276, 2553, 3123, 146, 2823, 2051, 2636, 2687, 2320, 6, 2552, 2385, 902, 2438, 1118, 3145, 2935, 58, 485, 2846, 2641, 2949, 181, 2455, 2681, 390, 534, 55, 3226, 1641, 2901, 567, 2387, 765, 2375, 1468, 442, 1303, 1543, 97, 70, 2844, 577, 323, 2056, 1844, 2345, 3185, 1016, 265, 672, 958, 570, 2765, 693, 2210, 1849, 1092, 2915, 502, 164, 1522, 2167, 2705, 1425, 967, 271, 1125, 1629, 3157, 1363, 1959, 784, 63, 2079, 551, 305, 3022, 1790, 438, 1106, 1757, 17, 1650, 3176, 3066, 923, 1911, 2003, 2754, 1085, 1952, 1946, 354, 1958, 418, 2788, 56, 1736, 2304, 449, 3114, 14, 2888, 1925, 2867, 2199, 1207, 2101, 310, 2433, 3082, 1564, 1887, 3159, 2687, 1239, 1243, 2119, 1375, 330, 1968, 1013, 3003, 2343, 1979, 2092, 3238, 925, 3011, 841, 2468, 753, 3189, 1128, 366, 2024, 1769, 2850, 3171, 964, 1213, 3029, 1350, 304, 568, 1149, 1915, 2239, 1087, 3040, 935, 1720, 1562, 139], -[607, 2205, 1165, 535, 1987, 2768, 2696, 3197, 1435, 2405, 88, 919, 2087, 1426, 2285, 2705, 2061, 620, 176, 1481, 2653, 1231, 3007, 1679, 1172, 209, 682, 3254, 118, 272, 1751, 2843, 2706, 1229, 3072, 442, 364, 1148, 1240, 1159, 1924, 1797, 266, 1967, 464, 2058, 712, 711, 3231, 1476, 1509, 1240, 1097, 1483, 1814, 2360, 797, 1204, 10, 3184, 2085, 2110, 1238, 2570, 2151, 1553, 2796, 2378, 606, 1974, 2380, 334, 2562, 846, 581, 2588, 85, 1957, 2392, 1270, 1319, 2175, 1335, 1388, 2066, 1459, 1225, 231, 883, 636, 2465, 1757, 2869, 2989, 1844, 2453, 174, 2735, 960, 3092, 1892, 1581, 2203, 1849, 760, 486, 1781, 324, 1399, 1515, 1252, 3060, 3171, 2483, 3214, 2381, 3245, 673, 300, 2373, 641, 1877, 1933, 1040, 2106, 2787, 729, 2182, 1399, 2782, 1603, 651, 2753, 1199, 563, 1160, 3327, 1613, 2774, 929, 750, 2673, 224, 1304, 1344, 1447, 3078, 807, 2259, 3128, 690, 2352, 390, 2291, 247, 3002, 2703, 2380, 1648, 712, 1004, 181, 725, 1689, 1460, 1599, 320, 105, 1158, 3174, 1670, 2567, 1327, 1997, 2759, 1048, 2583, 2, 1594, 2143, 2779, 514, 263, 1083, 2990, 1320, 857, 320, 823, 3180, 863, 1403, 1455, 1183, 359, 1238, 881, 2343, 2934, 2977, 1768, 1878, 1486, 1744, 1995, 1156, 1071, 2892, 347, 69, 3113, 1485, 1068, 34, 175, 2608, 1207, 2821, 2819, 266, 2754, 2746, 2543, 2045, 3263, 1163, 2036, 1822, 1520, 821, 2146, 1432, 2671, 2500, 2942, 629, 1701, 1012, 1352, 2367, 1684, 3211, 641, 1344, 3014, 2212, 3179, 2455, 2922, 65, 2953, 2558, 1974, 463, 1995, 2380], -[1770, 3266, 3043, 128, 261, 2123, 2318, 1679, 2312, 2908, 1415, 2106, 952, 231, 1318, 2672, 2033, 2343, 2062, 1271, 2885, 2749, 2830, 1397, 1458, 619, 156, 3146, 13, 712, 2290, 2997, 2389, 285, 2680, 215, 1442, 237, 311, 281, 2575, 1402, 734, 3001, 1319, 279, 1769, 2017, 1170, 2232, 2479, 719, 2499, 2068, 2674, 2293, 1093, 2012, 2581, 2347, 2686, 625, 2527, 1482, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1486, 789, 1648, 2771, 2658, 3058, 673, 3189, 1781, 2653, 106, 71, 1122, 2394, 3152, 1859, 3062, 157, 1835, 1027, 1134, 2264, 3036, 2598, 2207, 781, 40, 1023, 1027, 2254, 2111, 2079, 2093, 2120, 2697, 595, 3042, 1497, 465, 1059, 82, 256, 412, 2995, 1587, 368, 2826, 2505, 2406, 1566, 2634, 2034, 1682, 2483, 1108, 651, 1706, 3294, 3012, 3213, 1568, 1147, 650, 1416, 2066, 43, 2743, 396, 2903, 2214, 3254, 639, 113, 1157, 84, 60, 2678, 357, 720, 2255, 427, 847, 3204, 268, 737, 2590, 1831, 2037, 2516, 2417, 2553, 1542, 2758, 2190, 962, 3068, 2659, 2086, 3133, 1740, 2634, 180, 1791, 930, 1437, 1946, 923, 2351, 2992, 293, 2512, 1552, 2326, 2340, 539, 1345, 1565, 1101, 1365, 3161, 2904, 382, 1654, 814, 2694, 17, 1715, 1013, 901, 569, 2283, 2331, 1325, 1572, 535, 2094, 991, 1320, 228, 884, 135, 2421, 97, 1859, 3246, 3280, 2695, 2668, 2268, 1157, 2547, 2436, 385, 805, 801, 944, 2865, 1279, 1857, 1461, 1916, 2123, 495, 1284, 1453, 1985, 2046, 1624, 3183, 2364, 30, 1537, 1862, 2739, 80, 2579, 1215, 2397, 2192, 932, 2914], -[1604, 907, 2780, 2896, 1440, 1196, 865, 2226, 1719, 2596, 1431, 1360, 2267, 2487, 547, 1929, 1366, 1922, 1848, 2866, 1071, 2029, 2971, 2938, 92, 1243, 2389, 1985, 1817, 3303, 1704, 2386, 124, 1364, 2576, 727, 450, 944, 1975, 793, 436, 3138, 2370, 811, 330, 27, 977, 2684, 509, 2572, 1129, 656, 2651, 3175, 2299, 2138, 1874, 1231, 1038, 2930, 954, 324, 1412, 3221, 578, 2157, 157, 2462, 147, 835, 1855, 1831, 3277, 3186, 2064, 3310, 2081, 1046, 1255, 2715, 784, 3111, 821, 2619, 161, 2911, 2020, 427, 1280, 1918, 582, 2287, 3104, 1504, 2902, 1566, 1491, 1947, 1901, 3135, 3252, 3142, 8, 1941, 457, 3045, 2681, 2888, 2211, 816, 624, 432, 1698, 64, 2915, 916, 744, 394, 1448, 1090, 2144, 1006, 813, 692, 987, 2205, 1951, 3121, 1438, 671, 1765, 2188, 2533, 246, 3109, 2501, 2362, 3007, 590, 2924, 2032, 2371, 2796, 3178, 442, 665, 1942, 2701, 787, 1384, 1107, 1575, 157, 1914, 2380, 3203, 890, 1299, 2312, 1837, 2649, 1035, 349, 2949, 342, 313, 1645, 1191, 415, 521, 2850, 1227, 1525, 2183, 1291, 2753, 2684, 3300, 1842, 1332, 984, 2275, 98, 3213, 956, 2387, 2654, 3212, 1764, 2884, 907, 584, 3036, 2211, 314, 465, 1722, 397, 2501, 2477, 337, 1110, 2683, 3042, 1210, 1275, 2964, 867, 692, 1958, 2356, 1419, 1437, 541, 2149, 2496, 1907, 477, 2210, 1782, 1923, 2141, 1793, 734, 1486, 3237, 2369, 72, 892, 893, 922, 179, 2550, 3256, 1785, 781, 3317, 3235, 2821, 3205, 1024, 3101, 913, 856, 2667, 3290, 3034, 1088, 1053, 1942, 1973, 769, 1307, 895, 2929, 2976]] -u = NTTInverse(BHat * rHat) + e1: [[3070, 1402, 2568, 1534, 2888, 2553, 885, 3019, 1058, 2038, 994, 872, 2394, 1510, 2544, 2102, 688, 51, 1823, 3031, 2676, 2707, 2637, 1256, 3208, 2845, 1051, 1172, 635, 530, 1794, 748, 1515, 287, 2643, 2601, 3062, 2961, 1264, 816, 389, 192, 2629, 1172, 974, 1501, 1814, 1302, 1482, 549, 2909, 1002, 1315, 869, 1851, 2329, 1080, 1717, 2973, 2064, 1648, 1337, 3029, 1540, 145, 242, 1749, 559, 2441, 1804, 2459, 51, 2613, 1892, 1190, 2545, 2409, 1360, 1715, 3220, 368, 637, 965, 683, 231, 375, 1577, 1223, 248, 1213, 1332, 599, 997, 233, 1284, 325, 3147, 2356, 641, 765, 19, 2276, 2554, 3122, 145, 2824, 2052, 2637, 2687, 2320, 5, 2552, 2386, 903, 2438, 1119, 3145, 2934, 57, 487, 2845, 2641, 2949, 181, 2455, 2680, 390, 535, 55, 3226, 1640, 2901, 566, 2388, 765, 2374, 1469, 443, 1303, 1544, 98, 70, 2845, 575, 322, 2057, 1843, 2345, 3185, 1016, 265, 673, 958, 571, 2766, 693, 2210, 1851, 1091, 2915, 502, 164, 1522, 2167, 2704, 1426, 966, 269, 1124, 1629, 3155, 1364, 1959, 784, 63, 2078, 552, 305, 3023, 1789, 438, 1106, 1757, 18, 1650, 3175, 3066, 923, 1913, 2002, 2755, 1086, 1953, 1946, 354, 1959, 417, 2790, 56, 1737, 2303, 450, 3115, 14, 2887, 1923, 2868, 2200, 1208, 2100, 309, 2432, 3084, 1564, 1887, 3159, 2686, 1239, 1242, 2119, 1375, 330, 1968, 1013, 3003, 2341, 1980, 2090, 3239, 925, 3011, 842, 2467, 752, 3188, 1128, 366, 2026, 1771, 2850, 3172, 964, 1213, 3028, 1349, 304, 567, 1147, 1916, 2237, 1088, 3041, 935, 1720, 1562, 140], -[607, 2207, 1164, 535, 1988, 2767, 2696, 3197, 1435, 2404, 89, 919, 2087, 1426, 2284, 2705, 2063, 618, 175, 1481, 2654, 1231, 3008, 1679, 1171, 210, 681, 3253, 117, 272, 1751, 2843, 2705, 1228, 3071, 443, 363, 1149, 1240, 1157, 1925, 1796, 268, 1966, 464, 2059, 712, 709, 3231, 1475, 1509, 1240, 1096, 1482, 1812, 2360, 795, 1204, 9, 3185, 2085, 2110, 1237, 2569, 2152, 1555, 2797, 2377, 606, 1973, 2379, 335, 2561, 845, 581, 2589, 85, 1956, 2392, 1271, 1320, 2176, 1335, 1388, 2064, 1460, 1226, 231, 884, 635, 2467, 1756, 2868, 2988, 1842, 2455, 173, 2736, 960, 3091, 1891, 1581, 2201, 1849, 759, 487, 1782, 326, 1399, 1516, 1251, 3060, 3171, 2483, 3215, 2380, 3246, 673, 300, 2373, 640, 1877, 1933, 1039, 2107, 2788, 729, 2183, 1398, 2782, 1602, 652, 2751, 1200, 563, 1161, 3327, 1613, 2775, 930, 751, 2672, 225, 1302, 1346, 1447, 3079, 806, 2257, 3129, 689, 2354, 392, 2292, 247, 3003, 2701, 2380, 1648, 712, 1003, 180, 725, 1690, 1461, 1600, 319, 104, 1159, 3175, 1671, 2566, 1326, 1997, 2760, 1049, 2582, 2, 1594, 2143, 2781, 514, 263, 1085, 2990, 1319, 858, 320, 822, 3182, 863, 1401, 1455, 1185, 358, 1238, 881, 2343, 2935, 2976, 1770, 1879, 1487, 1743, 1994, 1154, 1070, 2892, 346, 70, 3115, 1485, 1068, 34, 176, 2606, 1206, 2821, 2818, 268, 2754, 2747, 2541, 2044, 3264, 1162, 2036, 1823, 1520, 820, 2145, 1431, 2669, 2502, 2942, 627, 1700, 1012, 1352, 2366, 1683, 3211, 643, 1343, 3012, 2213, 3179, 2454, 2923, 65, 2952, 2557, 1974, 464, 1995, 2381], -[1769, 3266, 3044, 127, 262, 2122, 2317, 1681, 2310, 2909, 1416, 2105, 952, 230, 1318, 2670, 2033, 2342, 2063, 1270, 2886, 2751, 2831, 1397, 1458, 618, 155, 3148, 11, 713, 2289, 2998, 2389, 285, 2682, 215, 1442, 238, 311, 282, 2574, 1402, 734, 3002, 1318, 277, 1770, 2017, 1170, 2231, 2478, 720, 2498, 2067, 2674, 2294, 1093, 2012, 2581, 2348, 2684, 625, 2526, 1483, 2950, 3198, 1910, 743, 1169, 1634, 1515, 3039, 2747, 2298, 1090, 1484, 788, 1647, 2771, 2660, 3058, 672, 3189, 1781, 2653, 106, 72, 1123, 2395, 3152, 1860, 3063, 158, 1835, 1026, 1134, 2263, 3038, 2599, 2207, 780, 40, 1023, 1027, 2254, 2110, 2078, 2093, 2119, 2698, 596, 3042, 1498, 463, 1057, 84, 257, 413, 2995, 1588, 367, 2825, 2506, 2407, 1565, 2635, 2034, 1681, 2485, 1107, 650, 1706, 3293, 3011, 3212, 1566, 1147, 649, 1417, 2066, 43, 2743, 394, 2903, 2215, 3252, 641, 113, 1158, 85, 60, 2677, 358, 719, 2255, 427, 846, 3205, 268, 738, 2589, 1830, 2038, 2517, 2417, 2553, 1542, 2757, 2189, 960, 3068, 2658, 2085, 3132, 1740, 2634, 182, 1792, 930, 1437, 1946, 923, 2352, 2994, 291, 2512, 1554, 2328, 2341, 539, 1344, 1566, 1100, 1365, 3162, 2905, 381, 1654, 814, 2694, 17, 1715, 1013, 902, 569, 2284, 2330, 1324, 1571, 535, 2093, 991, 1320, 229, 884, 133, 2422, 97, 1858, 3245, 3279, 2695, 2668, 2266, 1157, 2548, 2437, 387, 804, 803, 945, 2866, 1280, 1857, 1460, 1917, 2121, 494, 1284, 1451, 1987, 2047, 1625, 3182, 2364, 31, 1537, 1861, 2739, 79, 2581, 1213, 2396, 2191, 931, 2914], -[1603, 907, 2780, 2897, 1440, 1197, 866, 2225, 1719, 2596, 1432, 1359, 2268, 2488, 547, 1928, 1364, 1924, 1849, 2866, 1073, 2029, 2971, 2938, 93, 1243, 2389, 1985, 1818, 3304, 1703, 2386, 125, 1365, 2575, 728, 450, 943, 1977, 793, 436, 3137, 2369, 811, 329, 27, 976, 2684, 509, 2572, 1129, 656, 2651, 3175, 2298, 2136, 1873, 1232, 1040, 2930, 953, 323, 1413, 3222, 579, 2159, 156, 2464, 146, 835, 1855, 1830, 3279, 3184, 2064, 3310, 2082, 1047, 1256, 2714, 784, 3111, 821, 2619, 161, 2912, 2021, 429, 1281, 1918, 581, 2286, 3103, 1503, 2903, 1567, 1492, 1947, 1903, 3136, 3252, 3143, 7, 1942, 458, 3047, 2681, 2890, 2211, 815, 623, 432, 1697, 65, 2915, 918, 746, 394, 1447, 1091, 2145, 1006, 812, 693, 986, 2204, 1951, 3120, 1437, 670, 1763, 2189, 2534, 247, 3109, 2500, 2363, 3008, 590, 2925, 2032, 2373, 2796, 3179, 443, 665, 1942, 2699, 789, 1384, 1108, 1576, 158, 1914, 2380, 3203, 890, 1299, 2313, 1836, 2651, 1036, 348, 2949, 341, 312, 1643, 1192, 416, 521, 2848, 1227, 1525, 2185, 1290, 2751, 2684, 3301, 1843, 1330, 983, 2275, 98, 3213, 957, 2386, 2653, 3212, 1766, 2882, 908, 585, 3035, 2211, 312, 465, 1721, 396, 2502, 2477, 337, 1111, 2682, 3041, 1211, 1274, 2964, 866, 693, 1960, 2355, 1417, 1438, 539, 2149, 2495, 1908, 478, 2210, 1782, 1923, 2140, 1794, 734, 1484, 3238, 2369, 73, 892, 895, 922, 180, 2551, 3255, 1785, 782, 3318, 3235, 2822, 3206, 1022, 3099, 913, 855, 2668, 3290, 3034, 1088, 1055, 1940, 1975, 770, 1306, 897, 2929, 2977]] - -mu: [1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0] -tHat^T * rHat: [2521, 1369, 68, 1528, 885, 2690, 1603, 1010, 2439, 2475, 3038, 2950, 2802, 515, 997, 2224, 265, 2892, 1640, 1056, 2648, 2894, 761, 3110, 1444, 809, 1776, 153, 1273, 2927, 1206, 474, 1024, 1319, 709, 1223, 372, 1046, 702, 2886, 1740, 1983, 3267, 3286, 2119, 119, 2873, 2020, 2698, 873, 388, 2392, 1860, 1105, 1484, 296, 2039, 103, 2512, 3108, 1212, 476, 1874, 422, 2025, 1328, 59, 2041, 835, 2678, 1733, 2812, 1648, 1426, 420, 1770, 2865, 218, 3125, 3324, 2568, 66, 2746, 1487, 2559, 2516, 2680, 3000, 3225, 1933, 2058, 565, 2699, 2311, 436, 989, 1998, 455, 2658, 3143, 1628, 1347, 400, 1533, 526, 2834, 337, 1605, 2508, 2211, 2642, 727, 600, 2363, 1027, 2666, 1051, 592, 1384, 1563, 1353, 2589, 3316, 2491, 3246, 1824, 487, 1599, 1557, 2240, 2645, 601, 78, 1153, 2842, 2609, 2477, 914, 2910, 1203, 795, 1324, 1369, 1941, 350, 3231, 1514, 2083, 1753, 2156, 2885, 2080, 532, 2189, 1530, 1072, 3173, 1407, 2806, 2507, 3309, 1225, 1431, 728, 1562, 183, 1475, 2509, 3181, 3023, 632, 1610, 630, 2779, 1042, 1494, 698, 2106, 2687, 63, 1288, 1777, 1555, 1383, 2064, 1961, 2394, 689, 3249, 500, 656, 2249, 2442, 331, 2729, 2280, 1736, 111, 1669, 1719, 1198, 1197, 2329, 1953, 1931, 2421, 856, 2272, 2114, 412, 597, 2752, 2077, 1388, 2382, 207, 2363, 3299, 3038, 1663, 2261, 3147, 2806, 2432, 2666, 398, 2874, 1470, 2710, 98, 186, 2820, 1241, 3283, 601, 85, 37, 2846, 627, 1262, 238, 816, 1033, 2485, 602, 816, 1408, 2509, 1723, 511, 2256, 1595, 2550, 654, 1254, 780] -NTTInverse(tHat^T * rHat): [1412, 1558, 3294, 2350, 2981, 2714, 1658, 564, 2631, 244, 2252, 431, 1955, 3100, 2202, 38, 3093, 2809, 1095, 2136, 2259, 15, 1706, 78, 857, 458, 1099, 1767, 2837, 522, 1536, 1544, 1508, 3242, 1050, 3077, 1549, 2401, 574, 1124, 1293, 3307, 1429, 1156, 1855, 3243, 3173, 2230, 1721, 1805, 2457, 640, 482, 1742, 937, 1105, 1233, 572, 2803, 2059, 1081, 1098, 1681, 1665, 2498, 2846, 536, 2773, 241, 2365, 300, 3112, 1536, 788, 2196, 831, 1930, 406, 2239, 656, 1550, 929, 2924, 195, 622, 43, 77, 2653, 751, 1284, 1538, 25, 1757, 1150, 2694, 811, 2783, 3181, 2082, 1504, 964, 324, 2392, 2445, 1646, 2211, 1253, 1008, 3252, 301, 128, 3261, 1039, 2807, 1094, 2214, 590, 1086, 2116, 1952, 1537, 2226, 3127, 361, 808, 2908, 268, 2253, 1765, 1000, 2632, 3179, 2911, 2830, 2241, 2390, 2276, 2450, 2395, 2700, 1280, 948, 1321, 1284, 1198, 1808, 1192, 1179, 1561, 1365, 1414, 338, 718, 3056, 1338, 281, 2380, 2232, 2846, 2442, 548, 141, 2880, 2664, 1288, 3179, 2325, 647, 2925, 747, 2703, 1598, 1759, 3080, 1446, 2048, 980, 2228, 79, 2430, 1390, 3251, 451, 422, 2767, 700, 3242, 3123, 2623, 3128, 2298, 2766, 2336, 2637, 380, 1826, 783, 1534, 2157, 3240, 2149, 2461, 3317, 623, 1529, 2295, 368, 326, 3064, 2141, 2387, 775, 1550, 3068, 2961, 1202, 1899, 2383, 652, 1455, 2205, 1921, 322, 1857, 784, 1673, 3138, 465, 1388, 1943, 110, 2634, 1909, 3214, 2062, 276, 1304, 1535, 358, 593, 2391, 1968, 108, 449, 1268, 1701, 833, 2384, 3020, 2241, 69, 2209, 2960, 1240, 3207, 2501] -e2 + mu: [1665, 3327, 1666, 3328, 1, 2, 0, 1, 1665, 0, 0, 1663, 0, 1, 1665, 1664, 1, 2, 0, 1665, 1665, 1, 1665, 2, 1, 2, 1665, 1663, 2, 1664, 1663, 1667, 1, 1666, 1665, 0, 0, 1664, 0, 1, 3328, 1665, 1663, 1, 1666, 1, 1664, 3328, 1665, 1666, 3327, 1664, 1664, 3327, 0, 0, 1665, 0, 1665, 1664, 0, 1664, 1663, 1, 3328, 0, 2, 1666, 1664, 1665, 0, 1667, 0, 1, 0, 1665, 1666, 1, 0, 1, 0, 1, 1666, 0, 1667, 1664, 1665, 1665, 3328, 0, 2, 1664, 1664, 1665, 0, 1665, 1665, 1665, 1, 1667, 0, 0, 1666, 1663, 1, 1666, 1665, 1666, 3328, 1666, 0, 0, 0, 0, 3327, 1666, 1, 1665, 0, 0, 1665, 3328, 0, 1664, 1665, 0, 0, 1665, 1, 1665, 1666, 1664, 3327, 1, 0, 2, 3328, 1, 1666, 0, 1666, 1665, 1664, 1, 3328, 1, 1665, 3328, 1, 1, 2, 1664, 1666, 1665, 1666, 3328, 1666, 3328, 0, 1, 3328, 1, 1, 1665, 1666, 3328, 1665, 0, 1665, 1665, 1666, 1664, 1666, 1664, 1666, 3328, 3328, 3328, 1665, 1665, 3328, 1666, 1664, 1664, 1, 0, 3328, 1667, 1665, 1667, 3328, 0, 1665, 0, 3327, 2, 3328, 1664, 3327, 1665, 0, 0, 3328, 1665, 3328, 1664, 0, 1, 1664, 1664, 0, 1663, 0, 3328, 1664, 3328, 1665, 1664, 1, 1665, 1666, 1664, 0, 1664, 1664, 1666, 1665, 1664, 0, 3327, 1664, 3328, 1664, 3328, 3328, 1665, 1665, 1665, 1666, 1665, 2, 1, 1665, 0, 0, 1666, 1665, 1666, 3327, 3328, 1, 1666, 1664, 1663, 1666, 0] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [3077, 1556, 1631, 2349, 2982, 2716, 1658, 565, 967, 244, 2252, 2094, 1955, 3101, 538, 1702, 3094, 2811, 1095, 472, 595, 16, 42, 80, 858, 460, 2764, 101, 2839, 2186, 3199, 3211, 1509, 1579, 2715, 3077, 1549, 736, 574, 1125, 1292, 1643, 3092, 1157, 192, 3244, 1508, 2229, 57, 142, 2455, 2304, 2146, 1740, 937, 1105, 2898, 572, 1139, 394, 1081, 2762, 15, 1666, 2497, 2846, 538, 1110, 1905, 701, 300, 1450, 1536, 789, 2196, 2496, 267, 407, 2239, 657, 1550, 930, 1261, 195, 2289, 1707, 1742, 989, 750, 1284, 1540, 1689, 92, 2815, 2694, 2476, 1119, 1517, 2083, 3171, 964, 324, 729, 779, 1647, 548, 2918, 2674, 3251, 1967, 128, 3261, 1039, 2807, 1092, 551, 591, 2751, 2116, 1952, 3202, 2225, 3127, 2025, 2473, 2908, 268, 589, 1766, 2665, 969, 1514, 2909, 2831, 2241, 2392, 2275, 2451, 732, 2700, 2946, 2613, 2985, 1285, 1197, 1809, 2857, 1178, 1562, 1366, 1416, 2002, 2384, 1392, 3004, 280, 717, 2231, 2846, 2443, 547, 142, 2881, 1000, 2954, 3178, 661, 647, 1261, 2412, 1040, 3262, 96, 1415, 3112, 2047, 979, 2227, 1744, 766, 1389, 1588, 2115, 2086, 2768, 700, 3241, 1461, 959, 1466, 2297, 2766, 672, 2637, 378, 1828, 782, 3198, 2155, 1576, 2149, 2461, 3316, 2288, 1528, 630, 368, 327, 1399, 476, 2387, 2438, 1550, 3067, 1296, 1201, 235, 718, 653, 3120, 542, 256, 322, 192, 2448, 10, 1474, 2129, 1388, 1941, 1774, 2633, 244, 3213, 2061, 1941, 2969, 3200, 2024, 2258, 2393, 1969, 1773, 449, 1268, 38, 2498, 721, 3018, 2240, 70, 546, 1295, 2903, 1544, 2501] - -KBar: 62C86B23A76F753CD161DAE4D4B44E900BAACE3D758C356D534FBFAFF6BDCCFA -cPrime: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 - -Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt deleted file mode 100644 index 1ca796fcd..000000000 --- a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-512.txt +++ /dev/null @@ -1,57 +0,0 @@ -Decapsulation -- ML-KEM-512 -dk: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C52B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 -c: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 - -dk_pke: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD -ek_pke: 9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C5 -h: 2B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481 -z: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 - -c1: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE -c2: 1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 -u: [[1261, 1795, 1691, 1489, 741, 1005, 517, 2136, 3114, 432, 2705, 2877, 2633, 2988, 2767, 1430, 1317, 3062, 20, 2253, 1037, 1235, 1573, 705, 3140, 3046, 836, 2048, 683, 3277, 2955, 2259, 2640, 127, 3085, 2237, 1300, 289, 1791, 940, 2523, 2126, 42, 2682, 660, 670, 2698, 72, 2949, 348, 2045, 1138, 114, 3228, 257, 85, 3043, 2094, 800, 2578, 2370, 1053, 605, 601, 1421, 1190, 1291, 3270, 2003, 543, 2363, 803, 2441, 3290, 205, 1112, 2435, 2624, 549, 1089, 754, 1700, 312, 2919, 1313, 575, 185, 1908, 2656, 855, 3225, 2585, 2129, 2620, 992, 367, 1622, 52, 2526, 1782, 2637, 2568, 2331, 3101, 800, 1586, 2594, 2467, 221, 3238, 478, 2890, 2958, 42, 2272, 2120, 1651, 273, 1307, 2077, 2952, 988, 780, 1326, 2923, 1492, 127, 351, 2744, 3251, 3033, 940, 2617, 1873, 2835, 1118, 1912, 1378, 2698, 3319, 507, 364, 1473, 488, 1632, 2838, 371, 3088, 1538, 497, 348, 966, 1362, 497, 3319, 85, 2116, 2588, 2129, 2370, 306, 319, 1577, 575, 2923, 2737, 2637, 1632, 2812, 361, 2253, 1235, 631, 2048, 796, 2328, 1141, 59, 640, 2276, 2415, 2715, 387, 1534, 588, 992, 878, 757, 1200, 2815, 3049, 3322, 2799, 280, 1473, 2578, 2949, 244, 1326, 1921, 3140, 2253, 3222, 796, 94, 2406, 3322, 1063, 3205, 2337, 2741, 878, 2542, 2984, 1440, 2637, 458, 1795, 1479, 3027, 1599, 2393, 1161, 1808, 1651, 2295, 553, 419, 335, 111, 2728, 1752, 2949, 2936, 2113, 2731, 2526, 783, 2097, 2175, 1330, 2744, 3040, 114, 2295, 354, 3033, 2598, 1811, 2243, 1411, 988, 1440, 1759, 2698, 3137], -[1131, 1313, 868, 2363, 1580, 1447, 774, 546, 800, 2864, 2289, 2224, 3157, 1860, 796, 891, 2276, 2893, 2620, 2747, 289, 3319, 1456, 3192, 728, 192, 1938, 436, 1970, 2984, 2224, 3131, 709, 1873, 1863, 2757, 3166, 2702, 3033, 754, 575, 2682, 2776, 1031, 241, 598, 120, 2454, 1070, 1037, 972, 341, 1573, 1310, 2754, 2770, 2854, 2757, 2350, 800, 790, 364, 1115, 832, 361, 3322, 868, 2806, 3150, 1918, 65, 2708, 2445, 741, 55, 1362, 923, 2702, 328, 1294, 2389, 832, 1352, 780, 2279, 3137, 1463, 1005, 2913, 2867, 367, 2767, 1369, 2705, 345, 3303, 2984, 1021, 582, 1437, 166, 439, 1170, 3309, 2133, 1934, 3157, 107, 2042, 484, 686, 1463, 1024, 2812, 2324, 618, 585, 465, 699, 150, 16, 1037, 2929, 2516, 276, 156, 2448, 179, 575, 1310, 2120, 2721, 575, 569, 3040, 3228, 436, 1300, 2676, 1395, 2942, 2399, 1749, 2607, 1759, 163, 995, 3189, 2929, 731, 250, 2962, 1027, 2165, 1990, 975, 1567, 3023, 3196, 601, 1609, 2220, 1655, 3231, 458, 3212, 2897, 637, 2448, 2523, 2679, 2932, 2656, 2685, 2861, 1450, 2376, 2666, 2588, 2646, 1460, 946, 836, 2240, 2061, 849, 1570, 1476, 1798, 1619, 1700, 2770, 660, 1131, 2428, 1733, 2802, 1144, 1456, 2845, 2871, 2711, 764, 2120, 202, 403, 1534, 29, 2578, 1879, 764, 631, 3300, 1502, 2962, 2032, 3215, 2578, 1726, 770, 2536, 2357, 2432, 3160, 2646, 2162, 1248, 2737, 696, 1495, 384, 1495, 1473, 2207, 2211, 575, 3316, 2702, 3124, 2097, 1440, 276, 3056, 653, 1492, 497, 2217, 335, 647, 566, 1138, 2581, 445, 738, 2493, 3095]] -v: [2705, 208, 2289, 2913, 208, 0, 1456, 832, 2289, 416, 1456, 2913, 2497, 1248, 2081, 624, 1665, 1456, 2289, 2497, 832, 416, 2913, 416, 3121, 2705, 416, 2913, 2705, 208, 1248, 1873, 3121, 208, 2289, 2497, 1040, 1665, 624, 2497, 3121, 2497, 2497, 1248, 2913, 2913, 208, 416, 1873, 1665, 1248, 1665, 208, 2497, 2705, 2289, 624, 1873, 2289, 416, 1873, 3121, 2289, 1456, 1248, 2497, 2913, 2705, 2081, 2497, 2289, 2081, 1665, 3121, 1248, 2497, 1873, 416, 0, 832, 0, 2497, 1040, 2081, 2913, 1665, 1456, 1665, 1248, 2497, 2705, 2913, 2497, 2705, 1456, 2705, 2289, 832, 3121, 1456, 208, 1456, 2705, 1040, 2497, 1665, 416, 416, 416, 1040, 1040, 0, 1248, 832, 624, 416, 3121, 1873, 2081, 624, 2081, 2081, 0, 208, 832, 2081, 1040, 624, 416, 1665, 208, 0, 624, 0, 832, 2289, 624, 2913, 1873, 416, 624, 1040, 208, 208, 1873, 2705, 416, 1873, 1873, 2497, 1665, 2497, 1456, 1456, 2081, 208, 2497, 624, 1665, 2913, 1873, 832, 1248, 1665, 3121, 1665, 1248, 624, 624, 3121, 416, 208, 832, 208, 1873, 3121, 624, 1248, 2497, 1873, 416, 0, 3121, 1665, 2081, 832, 3121, 1040, 1873, 832, 1040, 832, 416, 3121, 2913, 2289, 1873, 2497, 1665, 1040, 0, 1040, 1456, 1456, 3121, 2289, 3121, 416, 624, 1248, 2705, 1456, 1040, 416, 1873, 832, 1665, 3121, 832, 624, 2497, 1665, 0, 0, 2497, 2913, 3121, 2289, 1873, 208, 832, 2497, 0, 1456, 3121, 2705, 1040, 416, 2913, 1040, 3121, 3121, 416, 1248, 416, 624, 208, 1665, 832, 624, 1873, 416, 1665, 3121, 624, 1040] -sHat: [[791, 308, 2543, 858, 544, 2222, 1648, 3207, 2440, 1760, 2, 3035, 2264, 774, 2889, 1559, 2813, 2926, 3104, 1737, 3319, 1569, 1628, 2052, 3191, 837, 2167, 453, 2626, 1783, 225, 859, 2926, 74, 2699, 1084, 847, 2904, 2114, 2956, 352, 96, 1430, 1834, 2969, 619, 2082, 2198, 3103, 1839, 3092, 2578, 1704, 390, 2140, 730, 5, 1636, 2709, 1403, 2516, 780, 505, 2012, 866, 1314, 1340, 2639, 1266, 826, 1187, 1110, 154, 2764, 734, 1351, 840, 657, 2856, 440, 2017, 3272, 293, 2546, 584, 1100, 828, 533, 1433, 2360, 597, 211, 4, 2959, 2317, 1694, 2545, 2614, 2770, 843, 1041, 2779, 444, 2912, 354, 2087, 2380, 1357, 2108, 2983, 1096, 2784, 897, 2815, 768, 1731, 860, 1692, 1155, 3077, 2272, 1841, 418, 2010, 1386, 2617, 2066, 2470, 3225, 2205, 264, 1284, 1448, 701, 3251, 1009, 1267, 541, 863, 3146, 2833, 1025, 537, 2153, 366, 997, 2129, 2594, 2318, 1533, 1758, 334, 3205, 2365, 2430, 2512, 1910, 2495, 914, 1239, 3012, 2972, 1191, 314, 1790, 650, 91, 3116, 1660, 489, 327, 2445, 1078, 3140, 447, 985, 1138, 2831, 816, 1149, 568, 1828, 2147, 1966, 180, 2940, 3039, 1824, 2762, 2568, 1722, 1978, 2311, 921, 2005, 2056, 29, 3206, 122, 1026, 3166, 1317, 3168, 115, 2863, 1597, 482, 3118, 3241, 3109, 2671, 3045, 2294, 2096, 51, 136, 134, 2365, 458, 2672, 1903, 5, 1374, 848, 1129, 741, 1802, 1712, 920, 1751, 2381, 2819, 271, 1628, 3135, 731, 2578, 814, 2985, 2484, 1682, 2236, 1700, 2219, 2894, 887, 778, 2818, 2111, 558, 2326, 2819, 1042, 2052, 1900, 98], -[2170, 53, 2077, 219, 813, 1632, 282, 1968, 2996, 2870, 2673, 3249, 2646, 1272, 2987, 2814, 2757, 111, 2807, 236, 1613, 745, 49, 3255, 17, 2700, 2769, 152, 1998, 2658, 1705, 999, 2066, 2131, 581, 576, 2014, 3264, 1047, 1733, 1303, 505, 2014, 1764, 1288, 2099, 239, 3057, 2422, 2218, 2559, 2847, 1325, 1035, 796, 1661, 1332, 921, 1069, 295, 913, 2732, 632, 196, 3210, 2903, 1791, 1294, 2322, 1993, 1101, 810, 2350, 186, 1104, 2897, 180, 397, 1, 576, 1904, 836, 3102, 580, 3001, 2262, 124, 512, 2898, 1988, 1565, 3126, 3296, 2856, 2969, 1262, 2758, 239, 2792, 94, 1021, 244, 87, 1510, 2953, 562, 45, 1138, 3018, 1257, 2506, 3037, 3280, 2457, 2385, 1681, 534, 1493, 2334, 540, 950, 3310, 1550, 2350, 2027, 650, 2996, 269, 2291, 499, 2239, 1189, 3003, 1703, 146, 3185, 1220, 3298, 1610, 2355, 2928, 1164, 2262, 1584, 2634, 187, 511, 3161, 2658, 272, 137, 3245, 663, 468, 1090, 659, 1787, 918, 3154, 301, 1073, 875, 299, 1575, 2814, 1059, 3089, 2321, 2775, 2406, 1100, 347, 1089, 521, 2974, 2733, 2079, 436, 1745, 3122, 293, 1389, 888, 2494, 1228, 3198, 2564, 1166, 1650, 1604, 3210, 1734, 37, 2900, 246, 2616, 606, 2094, 1602, 1108, 522, 2359, 2802, 2305, 463, 1261, 2042, 2303, 1955, 813, 290, 3173, 1345, 234, 2965, 1515, 2757, 188, 2144, 2526, 2172, 2929, 2724, 244, 1199, 3019, 2477, 2910, 392, 2941, 508, 703, 417, 142, 1613, 2837, 2711, 2318, 2727, 985, 643, 1961, 1827, 1536, 571, 284, 960, 200, 1719, 704, 1284, 1154, 1828, 1461, 3106, 2774]] -w: [1558, 92, 164, 1760, 1700, 82, 3105, 3297, 1538, 1766, 1763, 181, 1746, 3293, 1756, 3229, 1581, 8, 1636, 3282, 1699, 3307, 1542, 41, 39, 46, 1686, 1653, 29, 1697, 1665, 1697, 73, 3243, 1717, 2, 3277, 34, 3276, 68, 1621, 1657, 3315, 1666, 1664, 1717, 3311, 1598, 3262, 1738, 1544, 3302, 1628, 1521, 1606, 3239, 1658, 3316, 209, 108, 1510, 1568, 1658, 108, 48, 5, 1696, 78, 3141, 3300, 1557, 1676, 1577, 1765, 85, 3312, 1720, 1592, 3250, 3181, 142, 45, 1613, 47, 1830, 3239, 3216, 3269, 3232, 1703, 1712, 33, 3111, 3253, 1703, 3251, 1663, 1709, 224, 1684, 1623, 1643, 3231, 1767, 3319, 15, 156, 1611, 3132, 1753, 1498, 1764, 1593, 128, 1737, 3279, 1753, 60, 3263, 1540, 1655, 5, 1655, 15, 3275, 1574, 149, 227, 134, 49, 1633, 24, 1752, 3319, 46, 8, 3270, 36, 78, 113, 1701, 8, 44, 1723, 1668, 1589, 3290, 103, 1718, 86, 1582, 38, 1561, 133, 3309, 3160, 93, 1733, 3315, 3313, 116, 1723, 3238, 3254, 3306, 1665, 27, 1534, 1672, 1676, 1773, 3237, 1562, 5, 70, 19, 182, 1737, 1688, 1670, 36, 1532, 1757, 3210, 1725, 1596, 3272, 3275, 1759, 41, 3310, 1625, 1661, 1739, 3279, 1614, 1641, 3285, 1639, 158, 3266, 3238, 1755, 27, 1468, 193, 1660, 43, 68, 18, 3164, 19, 5, 1560, 3209, 3321, 3182, 3315, 57, 3164, 73, 3304, 1688, 1743, 1758, 72, 1555, 114, 1898, 3174, 1652, 1616, 2, 1791, 3209, 1685, 3225, 1552, 1823, 1636, 42, 17, 1715, 26, 3234, 92, 1605, 199, 1802, 0, 1641, 3224, 3295, 1749, 1513, 3251] -mPrime: 195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 - -KPrime: 224B9C051213EF46549243796532282973FA7CF97E8913C339C1940AC17E05E0 -rPrime: 92A1F927E9CB290EA28358A8927D1CB7E25789194C510DC1462A04EE4CC75B21 - -tHat: [[1946, 3106, 1444, 405, 2478, 1347, 1892, 1686, 1284, 1176, 650, 163, 2517, 2358, 2737, 2517, 1570, 412, 1556, 3252, 2624, 1882, 71, 356, 3201, 3197, 1507, 2406, 3249, 112, 2810, 514, 3252, 1203, 1025, 1026, 2591, 232, 2164, 1924, 2503, 1634, 1827, 924, 2395, 2374, 3281, 1144, 647, 2202, 219, 1483, 689, 1864, 2129, 1021, 2311, 66, 1363, 2375, 1525, 3233, 1808, 2449, 22, 2610, 2366, 1760, 3296, 157, 1050, 3246, 1686, 48, 433, 2896, 692, 1006, 2970, 1621, 1761, 3119, 3240, 2204, 820, 2097, 1719, 1824, 1374, 2877, 1864, 1685, 2840, 2289, 886, 2500, 773, 1702, 1036, 867, 2815, 2235, 1414, 778, 367, 282, 3318, 1823, 2027, 2487, 37, 1991, 250, 2670, 3034, 167, 2517, 1213, 528, 495, 2639, 2348, 2953, 2547, 1022, 535, 775, 1030, 1811, 2103, 122, 3233, 1430, 834, 620, 2772, 1479, 3024, 2962, 845, 2342, 621, 3022, 1508, 2754, 1476, 2015, 3250, 1425, 2686, 1767, 1233, 3099, 2461, 1751, 1941, 2555, 940, 1624, 1151, 474, 140, 2412, 798, 2236, 2336, 2355, 1166, 2174, 1648, 2236, 1141, 299, 3056, 1320, 3129, 1571, 1243, 2750, 372, 2217, 1054, 944, 3237, 3291, 1893, 1488, 1827, 588, 435, 956, 1633, 2671, 848, 2783, 125, 2081, 2446, 886, 594, 2410, 1241, 2709, 463, 1285, 1999, 1310, 2609, 2572, 196, 2179, 2561, 3288, 1043, 1548, 643, 2146, 382, 2781, 2998, 2986, 3044, 1909, 875, 3020, 2892, 2735, 386, 644, 3024, 1356, 2430, 147, 130, 2182, 1618, 1331, 1570, 1267, 3186, 1188, 338, 1311, 2523, 266, 2094, 2079, 1602, 1735, 2446, 2578, 2775, 914, 956, 2353, 2179], -[2754, 153, 226, 1094, 2715, 1980, 1774, 131, 354, 1251, 327, 2533, 499, 2265, 1245, 62, 2535, 683, 201, 2297, 1683, 876, 1436, 3148, 3195, 2840, 2780, 835, 1913, 1580, 2806, 386, 1534, 2704, 1200, 1446, 339, 2561, 2072, 1826, 2874, 1310, 250, 1509, 662, 2539, 2877, 1762, 859, 625, 2782, 1555, 3243, 1280, 446, 576, 2998, 820, 2865, 804, 726, 593, 1040, 1614, 1349, 1960, 672, 3150, 688, 1389, 1685, 517, 2216, 470, 1310, 1301, 38, 93, 777, 1470, 1781, 2105, 2781, 1034, 3304, 1298, 1435, 1416, 850, 1644, 1227, 1109, 2347, 271, 432, 1680, 35, 835, 2135, 1616, 319, 389, 256, 235, 3328, 2553, 125, 2641, 2875, 776, 959, 2817, 1391, 1250, 1736, 2986, 1875, 9, 1526, 2259, 1760, 932, 1281, 1033, 1993, 1016, 1599, 2052, 482, 929, 3196, 1372, 1535, 1239, 2693, 1658, 1513, 1534, 1160, 583, 736, 1579, 598, 2648, 733, 394, 3312, 963, 528, 1130, 205, 3275, 401, 2525, 655, 1232, 441, 1051, 95, 2757, 1752, 1503, 2274, 1975, 913, 3152, 1653, 2171, 1398, 1829, 2767, 1439, 3074, 694, 1998, 1870, 3107, 2811, 1491, 1200, 760, 1822, 2111, 1467, 1547, 2639, 366, 1559, 1362, 3231, 419, 480, 457, 320, 3015, 22, 1873, 2454, 2493, 277, 2881, 1797, 1093, 116, 2175, 2177, 1286, 1511, 492, 788, 1509, 1381, 219, 1017, 1090, 3096, 249, 2144, 1023, 436, 1384, 511, 2146, 297, 243, 2898, 351, 2514, 370, 2346, 2191, 3219, 3233, 2094, 315, 2442, 2746, 3001, 1708, 671, 770, 3243, 3082, 2399, 2794, 3128, 2819, 2239, 2525, 2994, 2205, 2561, 1083, 1258, 344, 2827]] - -bHat = aHat^T: [[[1341, 1232, 1520, 1770, 1003, 1831, 2265, 2612, 3123, 2306, 2308, 2255, 1490, 1757, 3189, 527, 3134, 69, 1977, 3080, 2397, 130, 1582, 978, 3006, 804, 2954, 2425, 1044, 1858, 3045, 2399, 2205, 2550, 2921, 122, 1228, 2138, 2028, 121, 2672, 2810, 2355, 918, 3306, 1704, 760, 542, 3315, 2757, 2693, 1951, 1877, 1773, 1983, 1080, 708, 2782, 3172, 1953, 1452, 1721, 1892, 1248, 1798, 1997, 1316, 2886, 2562, 2126, 3292, 31, 3282, 2460, 1927, 2546, 2859, 1498, 905, 1786, 199, 2414, 1990, 1834, 515, 2527, 494, 743, 2335, 2652, 2521, 1445, 1538, 275, 2051, 1796, 1074, 333, 2770, 1060, 2473, 2840, 979, 648, 2891, 139, 2866, 3043, 1062, 159, 2676, 1072, 1455, 1652, 1722, 1985, 2592, 2855, 2396, 1723, 3, 304, 3034, 2717, 899, 72, 2047, 3212, 1207, 2879, 3130, 1150, 453, 1398, 518, 916, 3155, 520, 629, 2344, 966, 3254, 577, 2344, 1025, 1063, 1548, 2577, 2271, 665, 1798, 3220, 2069, 1307, 3102, 3220, 1057, 437, 1217, 941, 487, 885, 1418, 2967, 1058, 1396, 1932, 721, 2302, 730, 522, 2775, 372, 359, 1712, 2573, 2476, 2273, 2627, 1436, 417, 2326, 2963, 1542, 1470, 2662, 728, 2267, 2454, 836, 443, 998, 3223, 2987, 440, 2548, 539, 1465, 1776, 532, 406, 1756, 3231, 2506, 1574, 1183, 1437, 2043, 1381, 1618, 2438, 416, 3158, 2431, 760, 1974, 1599, 1637, 611, 826, 1576, 1703, 3197, 127, 2296, 2774, 3170, 1351, 1635, 2287, 1133, 1110, 1299, 915, 2495, 787, 2044, 689, 3080, 1719, 1343, 3007, 1914, 1995, 1831, 2520, 2468, 694, 965, 665, 1532, 2025, 733, 2621, 752, 1605], -[1107, 1430, 1656, 2723, 1978, 2161, 2909, 1681, 2024, 1209, 2176, 1472, 2579, 3193, 1266, 2891, 2717, 2156, 2500, 2580, 1459, 1409, 1570, 1053, 538, 1782, 2370, 2274, 2948, 325, 2898, 857, 3112, 710, 1579, 1744, 3081, 1871, 2509, 2458, 1463, 479, 1749, 2296, 1140, 2636, 328, 1349, 502, 1761, 989, 359, 2149, 1892, 2098, 1286, 804, 933, 149, 1944, 2217, 2744, 2954, 1092, 1103, 878, 3326, 1679, 3102, 2809, 1795, 574, 696, 2034, 2029, 2448, 2135, 2194, 2503, 823, 2128, 144, 1105, 963, 1929, 1328, 3113, 1097, 3052, 1648, 2484, 1650, 2180, 958, 606, 1317, 1804, 1384, 672, 3053, 2554, 865, 1727, 1415, 1929, 3154, 652, 875, 3149, 998, 3240, 2022, 2963, 1205, 1546, 3195, 767, 2671, 2607, 1803, 20, 1117, 948, 2191, 3261, 2478, 404, 1826, 3250, 2506, 2373, 932, 1131, 2317, 2269, 1348, 1468, 1091, 748, 1428, 1056, 1387, 1239, 2847, 3157, 2702, 2015, 1255, 2443, 2435, 2593, 90, 3119, 499, 1133, 1612, 1520, 2342, 1072, 2683, 83, 2279, 1263, 3266, 2199, 1519, 1825, 1309, 2528, 47, 438, 309, 1518, 2420, 3090, 2179, 2935, 1451, 2304, 951, 2545, 1654, 3056, 2547, 77, 1009, 205, 1809, 1568, 2342, 599, 836, 2768, 3005, 2877, 301, 475, 2302, 305, 2121, 1705, 1426, 134, 1412, 2429, 795, 688, 3322, 2501, 2658, 2624, 3098, 878, 687, 1608, 1006, 1545, 1968, 2378, 468, 2303, 2194, 2518, 1457, 16, 504, 95, 2007, 734, 2785, 98, 1422, 3236, 3044, 1251, 2906, 2639, 2433, 3163, 1519, 1576, 1630, 2987, 1430, 1823, 2949, 2139, 637, 298, 3004, 2426, 3260, 3128, 3059, 291, 2868]], -[[1490, 2832, 3007, 87, 745, 2812, 374, 2590, 2710, 2551, 3299, 346, 1573, 2189, 2468, 139, 551, 1030, 1873, 3009, 1273, 1775, 2465, 190, 1929, 666, 2757, 1478, 1525, 362, 784, 472, 2798, 715, 2660, 855, 76, 2123, 524, 394, 3257, 1995, 205, 2851, 2305, 202, 3016, 2563, 816, 161, 992, 379, 1278, 2061, 95, 1542, 1884, 1431, 2503, 62, 3180, 1320, 1291, 2129, 697, 2997, 367, 1277, 948, 2299, 228, 1321, 1930, 2895, 842, 2553, 1372, 3135, 1074, 2797, 2292, 3180, 291, 1832, 2580, 201, 2690, 2465, 2544, 1341, 2051, 2719, 692, 2968, 1173, 728, 595, 968, 39, 2628, 1344, 2638, 1878, 2022, 138, 974, 2049, 1125, 1616, 603, 1373, 2565, 1100, 143, 1672, 3104, 1243, 2222, 2379, 2517, 1040, 2306, 1932, 2232, 2414, 1713, 2733, 2613, 210, 2899, 2225, 2417, 1153, 497, 532, 1226, 262, 2346, 1385, 924, 3111, 468, 1646, 191, 2982, 2701, 2902, 2380, 3032, 494, 174, 2728, 1105, 744, 125, 1495, 38, 2909, 1141, 3020, 2882, 1922, 2506, 2908, 2238, 1611, 41, 431, 2658, 2025, 2119, 3256, 3101, 2231, 2925, 3299, 791, 2320, 84, 3084, 1029, 2357, 2775, 2083, 2328, 1041, 1048, 991, 1106, 2707, 1944, 3248, 1587, 548, 2929, 600, 3258, 1248, 2516, 1528, 358, 1167, 106, 1476, 1446, 1374, 2209, 2259, 234, 928, 3253, 3168, 478, 2383, 2531, 2209, 630, 2093, 962, 55, 318, 2421, 1577, 1821, 751, 1514, 294, 1757, 425, 1024, 895, 390, 2531, 2178, 2151, 1118, 3219, 299, 2208, 2239, 407, 2184, 2323, 742, 1553, 3275, 1188, 1947, 60, 1538, 989, 1589, 2246, 677, 2878, 1923], -[1870, 3321, 145, 1061, 1324, 1482, 2251, 3214, 3210, 2036, 1155, 393, 3199, 3013, 627, 371, 1565, 1594, 523, 2681, 452, 1173, 2787, 2781, 1422, 420, 1010, 1164, 1696, 2259, 464, 1557, 709, 2202, 986, 2065, 3081, 3085, 1543, 2780, 1209, 1584, 452, 631, 943, 2201, 3047, 617, 156, 1642, 1750, 3056, 2725, 158, 2234, 2969, 3002, 3121, 2707, 3103, 1852, 312, 2732, 2553, 836, 1663, 2660, 1299, 1227, 732, 2633, 1653, 2922, 1352, 2187, 383, 2319, 2650, 1625, 828, 3144, 1333, 2004, 830, 888, 1811, 1248, 2772, 543, 2505, 1352, 2143, 3127, 2158, 89, 2546, 2032, 918, 1347, 1170, 1139, 1824, 605, 1597, 1536, 360, 2817, 1845, 2283, 2681, 1821, 1632, 1674, 3289, 695, 651, 2882, 3127, 1179, 2895, 4, 2780, 1420, 2965, 545, 2508, 278, 1726, 467, 1242, 2215, 1513, 424, 2896, 1910, 2627, 576, 2049, 408, 3020, 2565, 3272, 1820, 1438, 1010, 523, 3067, 2464, 1939, 624, 347, 1840, 2150, 2970, 1050, 1275, 3275, 760, 1072, 1447, 355, 2674, 1035, 2885, 840, 665, 1106, 2391, 2849, 3088, 2274, 2110, 2245, 3223, 1668, 256, 1557, 406, 1585, 2563, 194, 1876, 2882, 1126, 1050, 2555, 3260, 2140, 2434, 700, 1806, 512, 3174, 841, 2889, 1971, 652, 821, 828, 1498, 3151, 1440, 1038, 1782, 2297, 2146, 871, 2472, 3117, 21, 86, 2439, 3245, 1017, 2212, 2431, 1440, 1670, 1586, 1253, 2961, 1185, 2464, 704, 213, 1625, 961, 1036, 2316, 355, 1592, 3255, 3012, 365, 1156, 1393, 1085, 1161, 2603, 601, 3076, 799, 1919, 914, 561, 2296, 1331, 2214, 2464, 2121, 311, 2043, 2450, 2336, 1608, 1583]]] - -r: [[2, 0, 3328, 3328, 3328, 1, 0, 2, 0, 3328, 2, 1, 1, 3327, 1, 3327, 3328, 3328, 3328, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 3326, 1, 3328, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3326, 3328, 1, 3328, 3327, 0, 3328, 1, 1, 3328, 3327, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3326, 1, 0, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 3327, 3328, 0, 3328, 2, 0, 3327, 0, 2, 1, 0, 1, 3327, 0, 0, 1, 1, 2, 3328, 2, 3328, 0, 3328, 1, 3328, 1, 1, 2, 0, 3328, 3, 1, 3327, 3328, 3328, 3328, 0, 0, 0, 3327, 0, 3328, 0, 0, 3328, 3, 3327, 3328, 0, 0, 0, 1, 1, 2, 3327, 0, 2, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 0, 3328, 0, 0, 3328, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 0, 2, 0, 3328, 0, 0, 1, 3328, 2, 0, 0, 1, 1, 2, 2, 1, 1, 3327, 0, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 3328, 0, 3328, 0, 3328, 0, 3326, 2, 1, 3328, 3328, 2, 3328, 1, 1, 0, 2, 0, 3328, 1, 2, 1, 3328, 3328, 0, 1, 0, 0, 3327, 0, 1, 0, 0, 0, 0, 0, 1, 2, 2, 1, 3328, 1, 0, 0, 3328, 3328, 0, 0], -[3327, 0, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 0, 0, 0, 1, 3328, 3328, 3, 3328, 3327, 3328, 0, 0, 0, 1, 0, 1, 1, 3326, 3, 0, 1, 3328, 1, 3328, 3328, 1, 0, 3327, 3326, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 1, 1, 0, 3328, 1, 0, 2, 0, 3328, 3328, 3327, 3328, 3328, 3328, 1, 1, 3327, 1, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 2, 1, 1, 0, 1, 3328, 0, 0, 0, 3, 0, 1, 3327, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 2, 1, 0, 0, 0, 2, 2, 0, 0, 1, 3328, 3328, 1, 1, 1, 2, 3327, 1, 3328, 3328, 2, 2, 3328, 3328, 1, 3328, 0, 3, 1, 0, 3328, 1, 3328, 0, 0, 1, 2, 3328, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 1, 3328, 0, 2, 2, 0, 2, 0, 0, 3328, 1, 1, 0, 3328, 3328, 2, 1, 1, 0, 2, 0, 1, 0, 3327, 3328, 2, 0, 0, 1, 3327, 3328, 3328, 1, 3327, 0, 2, 1, 2, 0, 3326, 1, 1, 3327, 0, 3328, 3327, 3328, 0, 3328, 1, 2, 3327, 2, 2, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 3328, 2, 1, 0, 0, 1, 3327, 3328, 1, 3328, 1, 1, 1, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 3327, 3328, 3328, 0, 0, 1, 0, 0, 3328, 2, 3328]] - -e1: [[3328, 1, 0, 3328, 0, 0, 3328, 0, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 1, 3328, 3328, 1, 0, 0, 3328, 3328, 1, 1, 2, 3327, 3328, 3328, 0, 0, 3327, 0, 0, 0, 3327, 0, 3327, 3328, 2, 1, 2, 3328, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 2, 0, 2, 3328, 3328, 0, 1, 0, 1, 3328, 3328, 3328, 0, 3327, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 3327, 0, 3327, 3328, 0, 1, 3328, 3327, 1, 3327, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 2, 1, 0, 0, 3327, 3328, 3327, 0, 3328, 3328, 1, 3328, 2, 2, 3328, 0, 0, 2, 3328, 3327, 3328, 1, 1, 0, 1, 3327, 1, 1, 0, 1, 3328, 1, 3327, 1, 1, 1, 1, 3328, 3328, 3328, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 0, 1, 1, 1, 3327, 1, 0, 3328, 3328, 3327, 2, 3328, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 3328, 0, 1, 1, 3328, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 3328, 1, 0, 0, 3328, 2, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 1, 0, 1, 2, 3327, 3328, 0, 3328, 3328, 3328, 1, 0, 3327, 3328, 3328, 0, 3328, 0, 0, 1], -[3328, 0, 3328, 2, 1, 3328, 3328, 1, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 0, 1, 3328, 0, 0, 3328, 1, 1, 3328, 0, 3328, 1, 1, 3328, 1, 0, 0, 0, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 2, 0, 1, 2, 0, 3328, 0, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 0, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 2, 0, 0, 1, 2, 0, 2, 1, 3328, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 2, 0, 1, 3328, 2, 0, 0, 1, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 3328, 1, 0, 3328, 3327, 0, 0, 3328, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3327, 1, 2, 3327, 1, 1, 0, 3328, 1, 0, 1, 3328, 0, 1, 1, 0, 3328, 1, 1, 3328, 0, 1, 1, 3328, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 3328, 1, 3328, 3328, 1, 1, 3328, 3327, 3328, 1, 0, 0, 0, 1, 0, 3327, 3328, 0, 0, 1, 0, 0, 3328, 3328, 3328, 1, 1, 2, 1, 3328, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 3328, 3327, 0, 1, 3328, 0, 1]] - -e2: [0, 2, 2, 0, 3328, 0, 1, 1, 1, 2, 1, 3328, 3328, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 3328, 1, 3327, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 3327, 3328, 0, 1, 0, 1, 0, 1, 1, 0, 3328, 0, 1, 3327, 0, 3328, 0, 0, 0, 3328, 3328, 2, 1, 1, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 1, 1, 2, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 3328, 0, 1, 3327, 3328, 1, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 2, 3328, 3328, 0, 3328, 2, 0, 0, 0, 3327, 1, 0, 1, 1, 0, 2, 0, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 0, 1, 1, 3328, 0, 1, 2, 0, 0, 1, 1, 3328, 1, 0, 0, 2, 0, 1, 1, 1, 1, 3328, 0, 1, 3328, 1, 0, 3328, 0, 0, 0, 3328, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 2, 0, 3328, 0, 3328, 3327, 0, 3328, 1, 1, 0, 0, 0, 1, 0, 3328, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3327, 3327, 3327, 3327, 3328, 3327, 3328, 2, 1, 0] -rHat: [[2524, 3201, 2259, 2409, 1681, 275, 2303, 818, 2724, 1213, 1874, 1491, 2627, 2267, 1790, 12, 3216, 2734, 1684, 2342, 1622, 1659, 3106, 855, 2814, 529, 2170, 1324, 273, 1745, 1941, 1553, 2165, 1335, 2735, 1669, 520, 1013, 2681, 3008, 2408, 3292, 843, 1569, 2385, 2734, 1605, 1413, 443, 2593, 1163, 1239, 2014, 783, 1773, 2574, 2450, 80, 760, 3150, 2495, 763, 3235, 2456, 2033, 1064, 2718, 534, 2202, 299, 612, 1585, 2342, 1360, 1308, 3246, 1146, 788, 1211, 783, 1471, 2124, 398, 2285, 2531, 994, 3263, 2893, 1074, 695, 1524, 3080, 894, 2625, 512, 1759, 2052, 916, 1074, 608, 644, 3141, 277, 1115, 1244, 3295, 1022, 1937, 1207, 1096, 2567, 1853, 1625, 2532, 534, 1443, 2334, 2936, 3230, 1282, 542, 18, 1030, 1792, 1598, 3267, 1880, 3213, 1318, 2900, 1931, 1871, 1677, 223, 2486, 2627, 1779, 1945, 240, 2493, 70, 3217, 189, 2838, 952, 2143, 3236, 1620, 398, 1922, 479, 440, 1424, 1538, 281, 971, 668, 994, 1200, 154, 2452, 745, 474, 462, 25, 684, 2216, 2045, 2962, 1599, 1659, 2517, 460, 19, 696, 2294, 614, 2282, 2546, 3081, 2283, 1197, 675, 537, 2278, 2680, 1624, 2793, 1187, 1766, 3278, 3162, 298, 561, 3300, 210, 2649, 643, 272, 1969, 1891, 787, 568, 423, 3263, 2003, 2642, 3065, 845, 726, 1002, 2673, 211, 6, 1058, 1126, 2912, 2357, 2493, 1682, 2878, 1044, 1661, 2427, 2278, 1435, 2201, 964, 2782, 1094, 1585, 95, 996, 1635, 462, 101, 2586, 702, 1186, 1200, 2658, 785, 1751, 2850, 1082, 1995, 1832, 592, 718, 2503, 845, 471, 917, 2668, 2022, 2520], -[153, 2870, 2700, 2222, 2289, 2362, 2880, 434, 237, 1157, 1217, 1258, 529, 216, 2039, 632, 801, 1177, 846, 3283, 2928, 556, 497, 2045, 488, 2415, 270, 932, 3309, 2207, 1567, 1072, 3038, 1143, 1162, 2202, 1093, 897, 1530, 1793, 875, 1533, 344, 2089, 1670, 1517, 3316, 1918, 1807, 689, 2044, 1087, 523, 1793, 29, 3297, 2309, 3292, 2088, 1136, 2044, 2922, 570, 414, 2765, 2010, 1848, 355, 2566, 256, 2477, 2794, 990, 882, 994, 1062, 485, 1696, 550, 648, 2853, 2085, 3065, 1942, 317, 2527, 1139, 671, 1979, 437, 57, 2648, 1536, 3309, 69, 1061, 779, 2239, 388, 2325, 648, 1406, 811, 2049, 1520, 2168, 2834, 935, 2073, 2211, 2863, 412, 374, 511, 1478, 1497, 1286, 1904, 1994, 49, 2022, 2931, 2250, 2824, 3277, 198, 135, 67, 2689, 942, 1624, 10, 2475, 3012, 2342, 620, 743, 1841, 2725, 351, 2842, 2368, 3198, 2234, 902, 1513, 1034, 3104, 2285, 2153, 692, 1349, 2132, 363, 1355, 932, 334, 1150, 2968, 496, 2963, 1153, 2525, 2895, 787, 1747, 2289, 657, 511, 2167, 863, 2640, 185, 3061, 139, 3245, 2298, 285, 1725, 3324, 1094, 2624, 2431, 3195, 1644, 2997, 929, 1264, 943, 1465, 884, 3262, 687, 2971, 711, 1222, 509, 119, 1482, 1233, 174, 1969, 2405, 1928, 3170, 1896, 781, 2754, 2283, 3300, 1106, 853, 3086, 2295, 694, 2001, 1864, 1166, 1783, 623, 231, 2970, 221, 2465, 839, 3095, 1322, 2849, 589, 239, 1850, 152, 2995, 2443, 1516, 509, 2137, 2231, 2276, 3156, 1772, 3261, 105, 2271, 2845, 3071, 2791, 2548, 571, 2241, 2621, 1945, 3259, 1238, 2645, 2941]] - -BHat * rHat: [[1543, 2042, 1510, 2836, 1201, 2517, 2269, 179, 2136, 1238, 1383, 1803, 493, 2955, 3151, 3114, 1526, 2974, 2350, 4, 1260, 2779, 1774, 1509, 2880, 2684, 2612, 1779, 2610, 242, 2279, 2924, 2714, 210, 2765, 2912, 1737, 376, 2090, 3112, 2113, 1662, 891, 621, 2484, 2511, 1311, 2014, 395, 2519, 726, 796, 3074, 2714, 1336, 1669, 1272, 2131, 714, 1523, 1719, 1344, 669, 3130, 1254, 1492, 2878, 448, 2314, 336, 736, 2346, 2842, 2432, 2778, 1767, 2107, 2579, 884, 2490, 851, 2861, 1907, 1423, 116, 2521, 620, 1217, 1675, 1322, 1058, 200, 2651, 1753, 1460, 1280, 2913, 3219, 2773, 147, 738, 2656, 1455, 1688, 53, 2552, 1957, 2717, 1278, 678, 667, 294, 7, 836, 3224, 1846, 62, 574, 2446, 2639, 1747, 1911, 56, 2958, 2384, 223, 368, 2590, 2915, 541, 1855, 26, 652, 1692, 1555, 2431, 2461, 1852, 181, 2682, 1954, 591, 2169, 1335, 3209, 2526, 1862, 3108, 3004, 68, 1295, 1407, 3241, 2109, 1606, 3057, 2888, 1175, 1393, 911, 584, 89, 2305, 2683, 782, 3218, 1617, 19, 2209, 119, 2961, 141, 424, 28, 1874, 2287, 1264, 1326, 2725, 2876, 2694, 2237, 2529, 1851, 3078, 2013, 1574, 1222, 2029, 1185, 2870, 1424, 2724, 3292, 2679, 3088, 2311, 2703, 468, 356, 2705, 1483, 2729, 2718, 1225, 122, 3303, 3177, 2833, 3053, 1444, 1330, 3222, 3052, 2086, 2284, 3007, 506, 2570, 3220, 3139, 1385, 2444, 1138, 1341, 2767, 568, 1659, 784, 3218, 387, 1786, 3169, 308, 1169, 1873, 1585, 2188, 1603, 2695, 1532, 116, 3132, 2442, 1544, 1001, 835, 135, 3063, 2831, 2785, 2821, 2186, 1203, 1197, 3050], -[855, 2295, 2396, 1118, 2704, 3002, 565, 2103, 1429, 1441, 1242, 1576, 2583, 3119, 1139, 3018, 544, 1377, 2295, 3013, 2574, 1439, 821, 2014, 3087, 2157, 2434, 355, 2732, 2912, 256, 864, 593, 8, 2616, 106, 3056, 2697, 1801, 1734, 1270, 3157, 60, 1387, 1052, 1982, 2484, 3176, 2816, 1969, 628, 1358, 3153, 3256, 1461, 338, 2578, 2644, 1646, 1878, 2747, 997, 2614, 727, 1080, 133, 672, 842, 2712, 1418, 2037, 676, 1549, 1245, 484, 508, 1030, 1661, 2599, 642, 454, 186, 845, 3310, 2879, 2313, 156, 2644, 2236, 604, 783, 1517, 732, 2089, 1259, 2998, 2775, 2937, 2500, 291, 2532, 1756, 2864, 2294, 3191, 829, 177, 1517, 2062, 1439, 2751, 133, 1872, 3047, 2975, 729, 1421, 1456, 1163, 2328, 2561, 439, 439, 503, 2237, 1870, 1097, 24, 674, 220, 3318, 851, 1060, 1020, 2849, 703, 2635, 2069, 2037, 2951, 2918, 205, 1429, 2787, 1382, 2586, 405, 2514, 88, 3084, 519, 2053, 3116, 951, 2652, 1920, 296, 2216, 1285, 683, 935, 1984, 1775, 464, 1532, 3201, 2990, 1336, 726, 40, 2626, 342, 606, 1178, 1540, 3109, 2010, 2268, 939, 220, 759, 2749, 1763, 814, 2665, 1811, 850, 2335, 2294, 1206, 1667, 1102, 2159, 2394, 2172, 3289, 1505, 664, 1253, 1786, 2980, 1728, 2365, 2843, 738, 1760, 1232, 446, 3197, 2777, 257, 2884, 3119, 2519, 2060, 1728, 2968, 1082, 2682, 521, 877, 2171, 930, 1763, 2310, 1044, 236, 2134, 96, 1641, 58, 2641, 2003, 1507, 1108, 1760, 2299, 1637, 2372, 710, 1796, 769, 738, 3247, 1656, 2790, 1624, 2209, 1494, 1108, 2064, 1565, 1656, 1725, 1307, 3133]] -NTTInverse(BHat * rHat): [[1262, 1792, 1692, 1491, 741, 1006, 518, 2135, 3114, 433, 2704, 2877, 2631, 2987, 2765, 1430, 1319, 3062, 20, 2252, 1035, 1235, 1575, 706, 3139, 3047, 838, 2049, 682, 3276, 2954, 2263, 2640, 129, 3084, 2238, 1304, 288, 1791, 938, 2524, 2126, 43, 2683, 659, 669, 2697, 71, 2950, 349, 2044, 1138, 115, 3228, 257, 85, 3042, 2092, 801, 2577, 2370, 1051, 605, 604, 1421, 1188, 1290, 3270, 2004, 545, 2363, 802, 2442, 3289, 206, 1112, 2435, 2623, 552, 1088, 756, 1699, 314, 2919, 1314, 576, 186, 1908, 2657, 854, 3226, 2586, 2128, 2621, 991, 367, 1622, 52, 2528, 1782, 2638, 2568, 2330, 3101, 801, 1587, 2595, 2470, 224, 3238, 479, 2892, 2956, 42, 2270, 2117, 1652, 273, 1308, 2074, 2952, 990, 781, 1324, 2923, 1492, 126, 354, 2743, 3250, 3034, 937, 2617, 1870, 2838, 1116, 1910, 1377, 2697, 3320, 507, 366, 1472, 488, 1633, 2840, 371, 3091, 1538, 497, 347, 965, 1363, 496, 3318, 83, 2117, 2590, 2127, 2371, 308, 318, 1580, 573, 2925, 2738, 2638, 1632, 2813, 362, 2255, 1236, 632, 2049, 797, 2328, 1141, 58, 639, 2275, 2416, 2716, 387, 1532, 588, 991, 877, 756, 1199, 2816, 3048, 3322, 2798, 280, 1472, 2577, 2948, 243, 1327, 1918, 3142, 2251, 3222, 797, 91, 2406, 3323, 1063, 3207, 2337, 2741, 877, 2542, 2982, 1438, 2635, 458, 1792, 1479, 3026, 1599, 2391, 1159, 1807, 1653, 2296, 552, 419, 337, 112, 2731, 1754, 2949, 2935, 2112, 2731, 2524, 784, 2095, 2172, 1331, 2746, 3040, 116, 2295, 356, 3033, 2599, 1813, 2243, 1411, 987, 1441, 1760, 2699, 3135], -[1131, 1312, 870, 2363, 1580, 1447, 776, 544, 801, 2862, 2291, 2223, 3157, 1862, 797, 893, 2277, 2895, 2622, 2746, 289, 3319, 1456, 3194, 729, 192, 1937, 437, 1971, 2984, 2224, 3130, 707, 1873, 1863, 2758, 3168, 2702, 3031, 755, 575, 2682, 2775, 1028, 243, 598, 119, 2454, 1069, 1037, 972, 341, 1572, 1309, 2755, 2769, 2854, 2757, 2350, 800, 791, 364, 1114, 830, 361, 3321, 865, 2807, 3152, 1918, 64, 2708, 2444, 740, 54, 1363, 924, 2704, 328, 1292, 2389, 832, 1351, 780, 2281, 3137, 1463, 1004, 2911, 2868, 368, 2765, 1367, 2705, 343, 3304, 2982, 1020, 580, 1438, 166, 438, 1167, 3310, 2132, 1932, 3157, 109, 2040, 484, 685, 1462, 1023, 2813, 2326, 618, 588, 464, 697, 148, 15, 1036, 2928, 2515, 276, 153, 2448, 179, 575, 1312, 2120, 2721, 576, 569, 3042, 3229, 436, 1299, 2676, 1395, 2943, 2397, 1750, 2605, 1760, 163, 998, 3189, 2929, 733, 249, 2960, 1025, 2164, 1987, 975, 1564, 3024, 3195, 602, 1612, 2219, 1653, 3234, 457, 3211, 2897, 639, 2446, 2524, 2678, 2932, 2655, 2683, 2861, 1449, 2378, 2666, 2586, 2648, 1459, 946, 833, 2242, 2062, 847, 1570, 1476, 1796, 1620, 1702, 2770, 660, 1131, 2427, 1734, 2802, 1143, 1456, 2846, 2871, 2709, 764, 2119, 201, 402, 1536, 29, 2577, 1879, 765, 629, 3302, 1503, 2962, 2031, 3217, 2581, 1728, 769, 2535, 2356, 2431, 3158, 2645, 2164, 1248, 2736, 697, 1493, 382, 1497, 1474, 2210, 2213, 575, 3316, 2700, 3124, 2099, 1439, 276, 3056, 655, 1492, 497, 2214, 336, 648, 566, 1139, 2582, 445, 740, 2492, 3093]] -u = NTTInverse(BHat * rHat) + e1: [[1261, 1793, 1692, 1490, 741, 1006, 517, 2135, 3114, 432, 2704, 2877, 2632, 2988, 2765, 1430, 1318, 3062, 20, 2253, 1036, 1234, 1574, 707, 3139, 3047, 837, 2048, 683, 3277, 2956, 2261, 2639, 128, 3084, 2238, 1302, 288, 1791, 938, 2522, 2126, 41, 2682, 661, 670, 2699, 70, 2949, 349, 2044, 1138, 115, 3228, 257, 86, 3043, 2093, 800, 2579, 2370, 1053, 604, 603, 1421, 1189, 1290, 3271, 2003, 544, 2362, 802, 2440, 3289, 206, 1112, 2435, 2622, 551, 1088, 755, 1700, 313, 2919, 1312, 576, 184, 1907, 2657, 855, 3225, 2584, 2129, 2619, 990, 366, 1623, 51, 2527, 1782, 2637, 2569, 2332, 3102, 801, 1587, 2593, 2469, 222, 3238, 478, 2891, 2957, 41, 2272, 2119, 1651, 273, 1308, 2076, 2951, 988, 780, 1325, 2924, 1492, 127, 352, 2744, 3251, 3034, 938, 2616, 1871, 2836, 1117, 1911, 1378, 2698, 3319, 506, 365, 1472, 489, 1632, 2839, 371, 3090, 1538, 496, 348, 965, 1362, 496, 3319, 84, 2118, 2588, 2128, 2371, 307, 317, 1578, 575, 2924, 2738, 2638, 1631, 2812, 362, 2254, 1236, 630, 2047, 798, 2327, 1141, 59, 639, 2277, 2415, 2716, 387, 1533, 588, 992, 878, 756, 1201, 2815, 3048, 3323, 2799, 279, 1472, 2578, 2948, 244, 1327, 1920, 3142, 2252, 3222, 798, 93, 2407, 3324, 1063, 3207, 2338, 2741, 878, 2543, 2983, 1439, 2635, 457, 1793, 1479, 3026, 1598, 2393, 1159, 1807, 1652, 2296, 552, 418, 336, 111, 2729, 1753, 2949, 2936, 2113, 2732, 2525, 784, 2096, 2174, 1329, 2745, 3040, 115, 2294, 355, 3034, 2599, 1811, 2242, 1410, 987, 1440, 1760, 2699, 3136], -[1130, 1312, 869, 2365, 1581, 1446, 775, 545, 800, 2863, 2290, 2223, 3157, 1860, 797, 892, 2277, 2894, 2621, 2748, 288, 3318, 1456, 3193, 728, 193, 1937, 436, 1971, 2983, 2224, 3130, 708, 1872, 1863, 2758, 3167, 2703, 3032, 754, 575, 2681, 2776, 1029, 242, 599, 119, 2454, 1069, 1036, 973, 340, 1572, 1309, 2755, 2770, 2853, 2757, 2351, 801, 791, 363, 1114, 832, 361, 3322, 867, 2807, 3151, 1918, 65, 2708, 2445, 740, 55, 1361, 924, 2703, 327, 1293, 2389, 832, 1352, 779, 2279, 3137, 1463, 1003, 2912, 2867, 368, 2765, 1368, 2705, 344, 3304, 2983, 1020, 582, 1438, 166, 439, 1169, 3310, 2134, 1933, 3156, 108, 2042, 484, 685, 1462, 1024, 2812, 2326, 617, 586, 464, 699, 149, 16, 1038, 2928, 2516, 275, 155, 2448, 179, 576, 1311, 2120, 2722, 577, 569, 3041, 3229, 436, 1299, 2675, 1395, 2943, 2398, 1749, 2606, 1760, 162, 996, 3189, 2929, 732, 250, 2961, 1026, 2165, 1988, 976, 1566, 3025, 3197, 603, 1610, 2220, 1655, 3232, 458, 3212, 2897, 638, 2447, 2524, 2679, 2931, 2655, 2684, 2862, 1449, 2377, 2667, 2587, 2647, 1459, 947, 834, 2241, 2062, 847, 1570, 1477, 1797, 1620, 1701, 2770, 660, 1131, 2428, 1733, 2801, 1143, 1457, 2845, 2871, 2710, 763, 2119, 200, 403, 1536, 28, 2577, 1880, 764, 630, 3301, 1502, 2963, 2032, 3216, 2579, 1727, 770, 2535, 2356, 2431, 3159, 2645, 2162, 1247, 2736, 697, 1494, 382, 1497, 1473, 2209, 2212, 576, 3317, 2702, 3125, 2098, 1439, 276, 3057, 654, 1492, 498, 2216, 335, 647, 565, 1137, 2582, 446, 739, 2492, 3094]] - -mu: [1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0] -tHat^T * rHat: [474, 1376, 1132, 3010, 891, 2219, 2908, 2935, 1253, 763, 2954, 1511, 2031, 331, 2722, 1959, 1548, 58, 2185, 2256, 2257, 692, 2086, 1659, 3002, 627, 2156, 2421, 2648, 13, 1169, 2843, 1429, 2709, 563, 992, 2112, 2855, 1367, 92, 1669, 3044, 1221, 2938, 919, 357, 1616, 2927, 1260, 77, 2778, 2526, 2148, 1749, 446, 2201, 3125, 1803, 784, 2865, 3074, 3057, 715, 1352, 203, 1281, 3021, 2640, 2088, 1453, 2081, 1846, 375, 1467, 1925, 1486, 1653, 78, 3047, 1159, 3119, 854, 1992, 2435, 949, 2631, 2924, 1393, 2232, 3067, 2685, 3159, 875, 197, 2418, 521, 2211, 2482, 2034, 1237, 1239, 2799, 3260, 508, 1583, 2208, 853, 2224, 187, 2505, 2902, 724, 492, 1388, 3239, 948, 3229, 594, 2246, 555, 131, 734, 2142, 1682, 1735, 1488, 2786, 223, 1346, 66, 936, 2635, 688, 3028, 1727, 945, 2259, 735, 883, 2039, 260, 2687, 1643, 3310, 1819, 2805, 1954, 107, 2899, 3172, 2126, 2686, 1656, 884, 2654, 1351, 23, 1013, 1695, 694, 224, 2518, 1195, 3034, 2178, 830, 1088, 2782, 1916, 1058, 3175, 1914, 2925, 264, 2699, 1523, 1140, 1949, 407, 686, 2624, 2646, 2078, 3080, 1324, 2449, 2388, 2390, 215, 2167, 190, 178, 1342, 3051, 637, 3012, 1031, 1600, 2066, 834, 2532, 2080, 2114, 115, 2480, 1006, 57, 208, 3068, 2594, 3205, 3067, 1244, 2583, 1495, 1844, 2610, 867, 3008, 698, 702, 835, 2898, 272, 2742, 210, 1750, 3128, 73, 1308, 634, 1916, 1286, 1831, 731, 3255, 1165, 2, 1559, 2539, 1751, 1680, 200, 1957, 2809, 2302, 2968, 399, 1064, 1227, 333, 2502, 2727, 510, 2271, 2451] -NTTInverse(tHat^T * rHat): [1121, 135, 2210, 1197, 1834, 3261, 1526, 865, 695, 1984, 3092, 2833, 763, 1317, 345, 713, 1, 1484, 632, 2551, 2446, 486, 1259, 376, 3102, 2743, 2082, 1299, 2606, 1823, 2957, 177, 3043, 200, 554, 2434, 1046, 1647, 711, 2409, 1465, 835, 2470, 2840, 1326, 1173, 159, 2113, 1887, 3242, 2935, 1698, 1918, 891, 1052, 2314, 2251, 1814, 2198, 356, 305, 1548, 607, 1413, 1205, 2524, 1311, 2635, 2176, 2517, 701, 444, 61, 1423, 1152, 2509, 184, 2048, 82, 908, 3227, 2433, 2769, 2125, 1145, 1743, 1501, 1694, 1346, 828, 957, 2822, 2588, 2758, 3044, 2766, 562, 2392, 3072, 3141, 1901, 3151, 2754, 2606, 2551, 1653, 314, 2106, 477, 2685, 2792, 1697, 2961, 730, 2228, 490, 1399, 1844, 2072, 2389, 485, 2141, 1680, 184, 891, 497, 953, 552, 371, 1682, 1958, 3274, 2237, 21, 793, 2266, 643, 2849, 1821, 313, 2310, 993, 239, 1906, 222, 1087, 435, 1833, 263, 2435, 62, 2402, 3174, 1401, 2068, 310, 2415, 2268, 1628, 2928, 1861, 2409, 1332, 1716, 3083, 22, 1172, 2393, 2300, 1465, 1995, 225, 2466, 149, 1770, 3098, 642, 2861, 736, 206, 352, 1741, 1404, 1739, 402, 2576, 3163, 1120, 108, 767, 938, 2507, 2034, 1415, 2998, 634, 286, 2494, 26, 938, 3326, 1119, 3059, 1412, 1527, 2190, 1492, 387, 547, 1227, 2762, 1379, 1023, 2151, 1925, 799, 1715, 3053, 759, 714, 2460, 1592, 1654, 1584, 774, 2901, 1501, 2187, 111, 296, 2520, 923, 47, 3019, 3187, 1018, 1100, 2185, 1146, 2734, 3063, 3069, 2020, 1239, 486, 598, 1936, 1595, 2447, 623, 293, 418, 1621, 1373, 2371, 1097] -e2 + mu: [1665, 2, 2, 1665, 1664, 0, 1, 1, 1666, 1667, 1666, 3328, 1664, 0, 1664, 2, 1665, 1, 1666, 1, 1664, 3328, 1664, 1, 3327, 3328, 1666, 1666, 0, 1665, 1664, 1666, 0, 0, 1663, 3328, 0, 1, 0, 1, 1665, 1666, 1, 1665, 1664, 1665, 1, 1663, 0, 1664, 1665, 0, 1665, 1664, 1664, 2, 1666, 1, 0, 0, 1666, 1664, 1664, 3328, 3328, 1, 1666, 0, 1, 3328, 1665, 1666, 1666, 1667, 0, 0, 1664, 1665, 1, 0, 3328, 0, 1666, 1, 1666, 3328, 0, 1, 3327, 1664, 1666, 1, 0, 3328, 1664, 3327, 1665, 1666, 3328, 1665, 1666, 1665, 3328, 1664, 3327, 3328, 0, 1665, 0, 1665, 1665, 1666, 1664, 3328, 1664, 3328, 1666, 1, 0, 1666, 1664, 0, 1664, 3328, 2, 1664, 3328, 0, 3328, 2, 1665, 0, 1665, 3327, 1, 0, 1, 1, 0, 2, 1665, 1, 0, 1665, 1664, 1665, 0, 1, 1664, 1, 1666, 0, 1665, 0, 0, 3328, 0, 1666, 1, 0, 0, 1666, 0, 0, 3328, 1666, 3328, 1664, 1664, 1664, 1665, 0, 1666, 0, 0, 0, 1, 1666, 1664, 1665, 0, 1666, 1666, 3328, 1665, 1666, 2, 0, 1665, 1, 1, 1664, 1666, 1665, 0, 1667, 1665, 1, 1666, 1, 1, 3328, 1665, 1, 1664, 1, 1665, 3328, 0, 0, 0, 3328, 1, 1663, 1, 3328, 3328, 3328, 1, 0, 3328, 0, 1667, 1665, 1664, 0, 1664, 3327, 1665, 3328, 1666, 1666, 0, 1665, 0, 1666, 0, 1664, 1666, 1665, 3328, 3328, 1666, 3328, 0, 0, 1663, 3327, 1663, 3327, 1664, 3327, 3328, 1667, 1666, 0] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [2786, 137, 2212, 2862, 169, 3261, 1527, 866, 2361, 322, 1429, 2832, 2427, 1317, 2009, 715, 1666, 1485, 2298, 2552, 781, 485, 2923, 377, 3100, 2742, 419, 2965, 2606, 159, 1292, 1843, 3043, 200, 2217, 2433, 1046, 1648, 711, 2410, 3130, 2501, 2471, 1176, 2990, 2838, 160, 447, 1887, 1577, 1271, 1698, 254, 2555, 2716, 2316, 588, 1815, 2198, 356, 1971, 3212, 2271, 1412, 1204, 2525, 2977, 2635, 2177, 2516, 2366, 2110, 1727, 3090, 1152, 2509, 1848, 384, 83, 908, 3226, 2433, 1106, 2126, 2811, 1742, 1501, 1695, 1344, 2492, 2623, 2823, 2588, 2757, 1379, 2764, 2227, 729, 3071, 1477, 238, 1487, 2753, 941, 2549, 1652, 314, 442, 477, 1021, 1128, 34, 1296, 729, 563, 489, 3065, 1845, 2072, 726, 2149, 2141, 15, 183, 893, 2161, 952, 552, 370, 1684, 294, 3274, 573, 19, 794, 2266, 644, 2850, 1821, 315, 646, 994, 239, 242, 1886, 2752, 435, 1834, 1927, 2436, 1728, 2402, 1510, 1401, 2068, 309, 2415, 605, 1629, 2928, 1861, 746, 1332, 1716, 3082, 1688, 1171, 728, 635, 3129, 331, 225, 803, 149, 1770, 3098, 643, 1198, 2400, 1871, 352, 78, 3070, 1738, 2067, 913, 3165, 1120, 1773, 768, 939, 842, 371, 3080, 2998, 2301, 1951, 2495, 1692, 939, 3327, 1118, 1395, 1413, 3191, 2191, 3157, 386, 547, 1227, 2762, 1378, 1024, 485, 1926, 798, 1714, 3052, 760, 714, 2459, 1592, 3321, 3249, 2438, 2901, 3165, 2185, 1776, 295, 857, 2589, 47, 1355, 3187, 2684, 1100, 520, 2812, 1070, 3062, 3068, 357, 1238, 486, 598, 270, 1593, 781, 621, 1957, 416, 1620, 3040, 708, 1097] - -KBar: 59083ED864711F4AE886A8F055932D84294CEAB01B51A0F12ABBA30EB9809715 -cPrime: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 - -Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt deleted file mode 100644 index b50892fcb..000000000 --- a/tests/PQC Intermediate Values/Decapsulation -- ML-KEM-768.txt +++ /dev/null @@ -1,71 +0,0 @@ -Decapsulation -- ML-KEM-768 -dk: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C1234E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C03010B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF714EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC -c: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 - -dk_pke: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C12 -ek_pke: 34E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C0301 -h: 0B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF7 -z: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC - -c1: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C1 -c2: 10FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 -u: [[2389, 2006, 1232, 556, 322, 146, 2919, 2048, 722, 1521, 1713, 2780, 2854, 1622, 2263, 3306, 1642, 2614, 2181, 374, 458, 3153, 1996, 3049, 1437, 780, 803, 2809, 1219, 2965, 569, 2799, 1739, 559, 1795, 397, 1778, 1112, 172, 1531, 406, 943, 770, 1284, 793, 2305, 2906, 3059, 1343, 2955, 1791, 2051, 0, 2295, 2936, 231, 2542, 2360, 400, 2624, 845, 1476, 2393, 2263, 2510, 1515, 1765, 1713, 2354, 878, 2630, 1294, 969, 1378, 481, 1265, 504, 923, 1112, 436, 1443, 1476, 478, 858, 777, 715, 2337, 679, 2315, 1196, 894, 3101, 2536, 2214, 940, 2731, 393, 1222, 2389, 741, 3267, 218, 3306, 1821, 1788, 237, 3075, 478, 150, 2789, 2237, 634, 2897, 1876, 325, 2337, 478, 3257, 2022, 3228, 2237, 3179, 2113, 1554, 1434, 2354, 1021, 3192, 494, 562, 3053, 2298, 257, 2607, 33, 748, 2926, 1661, 1830, 3313, 2874, 1443, 1177, 2770, 1824, 686, 2116, 501, 806, 1759, 2337, 2754, 536, 2786, 231, 1925, 2633, 3189, 46, 1960, 2679, 2760, 0, 2207, 725, 676, 1232, 1131, 927, 878, 2055, 1827, 1635, 1625, 888, 120, 1687, 650, 296, 2055, 855, 2568, 211, 2116, 3267, 124, 1489, 3040, 1336, 1229, 2438, 1219, 2263, 1837, 705, 3066, 286, 1057, 1427, 2204, 1219, 163, 2965, 2695, 969, 1037, 2958, 81, 1339, 2146, 1674, 120, 1749, 2750, 68, 221, 1567, 36, 2334, 2305, 1057, 3069, 1782, 2107, 2562, 1619, 631, 1684, 267, 1808, 1424, 2627, 829, 1109, 979, 2357, 2737, 2578, 679, 3303, 1635, 1551, 306, 1037, 777, 1200, 2939, 1352, 1486, 1525, 1382, 2458, 2224, 1281, 2155, 572], -[663, 2877, 1505, 1456, 1180, 1349, 1050, 273, 2984, 1964, 1242, 2324, 1333, 3157, 1830, 705, 992, 1489, 1814, 397, 2081, 1294, 793, 507, 2562, 598, 1346, 445, 2055, 631, 153, 1138, 666, 1057, 2318, 2724, 1560, 20, 1847, 1837, 2461, 1151, 3176, 2224, 2520, 1232, 400, 3014, 2113, 3296, 1860, 328, 1944, 2669, 705, 2090, 1196, 1096, 2110, 2461, 1343, 429, 1021, 982, 2337, 640, 3134, 1996, 1892, 1769, 894, 150, 101, 3007, 3075, 787, 2507, 3290, 1070, 1206, 1648, 2188, 2533, 2055, 966, 2467, 1486, 2773, 1144, 3017, 393, 543, 819, 2428, 1534, 1489, 1970, 2129, 3251, 2893, 1908, 1730, 2110, 1320, 2958, 1638, 101, 2295, 670, 2581, 3079, 1502, 1005, 1622, 2461, 2949, 1769, 3179, 1326, 1508, 2724, 380, 634, 2851, 1625, 159, 666, 2659, 211, 1866, 1196, 2656, 1317, 2380, 3118, 1882, 312, 1534, 1765, 1622, 2952, 3313, 2029, 962, 3326, 728, 1034, 2308, 2806, 1076, 497, 2100, 189, 2695, 2949, 2929, 1183, 1427, 1866, 1261, 3192, 2750, 494, 49, 595, 218, 1873, 683, 914, 166, 943, 276, 1700, 1625, 1326, 3199, 2598, 3316, 523, 2019, 1599, 2350, 770, 2520, 3303, 3114, 3075, 3170, 2903, 2285, 673, 1655, 767, 3049, 2380, 1278, 1180, 413, 2425, 3007, 858, 176, 2087, 263, 3023, 1856, 289, 488, 1148, 2155, 481, 2480, 312, 2402, 169, 2224, 1606, 744, 2220, 1209, 2259, 1307, 914, 2003, 1242, 2097, 2994, 2038, 2370, 1778, 2211, 3131, 1349, 1674, 751, 1612, 1242, 2393, 741, 1775, 585, 406, 1658, 2149, 1070, 120, 2331, 2428, 3183, 1024, 2185, 953, 2728, 1860, 3010, 3010], -[221, 862, 471, 2399, 1684, 1037, 81, 3004, 2949, 1804, 2120, 1700, 2422, 172, 2539, 198, 371, 10, 1873, 3004, 1541, 1307, 1456, 1209, 1743, 133, 2711, 55, 33, 153, 156, 416, 46, 1213, 1840, 299, 2988, 2198, 2393, 546, 1369, 1248, 465, 1278, 1551, 130, 1050, 2198, 1349, 543, 2507, 2214, 2133, 2389, 3322, 2848, 1661, 1281, 3, 2900, 2598, 1957, 2090, 979, 2552, 1430, 2890, 176, 1268, 1034, 936, 3023, 972, 2087, 1960, 1248, 400, 1674, 2451, 2448, 855, 416, 2315, 1541, 813, 1141, 1378, 2282, 3257, 315, 2185, 3085, 2607, 156, 1372, 510, 1278, 962, 3007, 3290, 2955, 741, 114, 2838, 1427, 679, 1957, 1050, 3248, 2669, 75, 2159, 2611, 2139, 3215, 1395, 1408, 1999, 1573, 1317, 312, 1869, 3010, 1443, 2298, 159, 462, 3088, 1144, 614, 2910, 263, 1736, 2477, 1934, 2480, 2728, 865, 228, 1873, 1183, 1573, 1554, 2003, 2100, 715, 881, 111, 1008, 2357, 3205, 185, 1476, 3105, 361, 1567, 2172, 2471, 1769, 3053, 2133, 2659, 172, 270, 2568, 1034, 579, 2285, 2146, 1008, 2084, 3306, 2838, 2789, 2796, 478, 1235, 1651, 575, 3040, 166, 1300, 543, 1362, 2152, 1391, 1713, 293, 3072, 1655, 2900, 520, 416, 1762, 1278, 2311, 1330, 2591, 2256, 130, 1359, 2968, 1427, 1027, 387, 901, 1235, 1408, 744, 1330, 1057, 3043, 901, 3069, 2113, 2289, 2978, 397, 3127, 1590, 1229, 676, 1099, 1541, 2324, 1840, 738, 2991, 2936, 728, 2042, 624, 2227, 2988, 3313, 1057, 2360, 3274, 2520, 553, 3079, 98, 514, 1388, 3056, 2624, 2975, 133, 910, 2042, 1993, 2428, 1437, 2588, 462, 2516]] -v: [0, 208, 2705, 3121, 832, 1665, 624, 2497, 1248, 624, 3121, 2705, 624, 1248, 3121, 0, 1456, 416, 2497, 208, 1456, 3121, 624, 1873, 1665, 416, 1248, 2289, 1665, 2497, 1873, 1456, 3121, 2705, 2497, 1456, 2913, 2705, 3121, 0, 0, 1456, 208, 1456, 416, 416, 0, 416, 208, 2289, 2289, 3121, 1873, 2289, 2497, 2081, 832, 2289, 416, 1665, 1665, 832, 1873, 2705, 3121, 208, 2913, 0, 2289, 416, 2913, 1248, 2289, 624, 832, 2913, 2497, 0, 2289, 416, 416, 416, 2913, 208, 416, 1248, 2913, 1248, 2913, 1456, 624, 624, 2705, 0, 2705, 1873, 624, 1665, 2497, 2497, 1248, 0, 1665, 1248, 1456, 3121, 0, 624, 1040, 1665, 208, 1873, 208, 2913, 2497, 832, 2705, 1456, 416, 1456, 1665, 2289, 208, 832, 1248, 2081, 0, 3121, 3121, 1040, 3121, 624, 2497, 2705, 624, 208, 2913, 1873, 2497, 2913, 208, 2497, 624, 1040, 1456, 1248, 1040, 1248, 1040, 1248, 2289, 0, 1040, 1040, 1873, 2081, 2913, 2497, 1248, 2497, 2289, 2289, 1040, 3121, 2497, 832, 2913, 2497, 1040, 2497, 624, 2497, 2497, 2081, 2081, 1873, 2913, 0, 1873, 624, 832, 3121, 3121, 1665, 624, 416, 2289, 1456, 832, 2705, 1248, 2497, 0, 1248, 2289, 2497, 2081, 208, 2705, 1665, 1040, 416, 2289, 0, 1248, 2289, 1665, 2497, 0, 2497, 0, 208, 2913, 3121, 624, 2497, 2497, 832, 624, 2497, 1873, 2705, 1040, 208, 1873, 1873, 1456, 416, 2497, 208, 1040, 1456, 208, 624, 624, 624, 3121, 0, 416, 208, 624, 2081, 832, 2913, 3121, 832, 3121, 2081, 1873, 2705, 1040, 0, 416, 2705, 1248, 2497] -sHat: [[1588, 2133, 1947, 127, 742, 2759, 2929, 2018, 1392, 1071, 1141, 1431, 629, 2944, 2077, 2366, 540, 2713, 704, 685, 1934, 1841, 1995, 1144, 1314, 2608, 540, 515, 1131, 3018, 756, 1426, 3155, 2867, 3233, 41, 1536, 40, 1604, 3130, 758, 393, 69, 2571, 88, 389, 890, 260, 1459, 557, 2618, 2570, 3015, 2489, 3260, 3263, 1343, 295, 2836, 206, 506, 2604, 2206, 2125, 2698, 1173, 1210, 2984, 1640, 2926, 1525, 2000, 329, 83, 2303, 2707, 3060, 1252, 3199, 3046, 381, 1602, 1800, 2895, 1414, 2848, 624, 1339, 432, 2640, 3136, 193, 1937, 3266, 2840, 437, 2316, 703, 2969, 2575, 2777, 661, 1887, 856, 533, 197, 646, 435, 1676, 1737, 2691, 2743, 564, 3067, 762, 2603, 164, 435, 2869, 614, 1229, 1388, 568, 2304, 1819, 1572, 1266, 648, 2074, 739, 1631, 695, 2031, 2900, 2073, 426, 1552, 1400, 2539, 1582, 702, 177, 863, 2971, 1005, 2243, 1999, 2868, 2464, 1315, 1697, 822, 1782, 2910, 1588, 2926, 1341, 1792, 2670, 255, 148, 940, 1323, 1704, 485, 1061, 47, 281, 2290, 2469, 2369, 1707, 556, 317, 2502, 2489, 2313, 510, 1012, 3250, 2576, 422, 2962, 2112, 440, 1121, 1940, 345, 834, 2434, 127, 1472, 2162, 2815, 2872, 152, 780, 2550, 1932, 1271, 709, 2378, 2759, 532, 300, 2697, 620, 2211, 2795, 1374, 1162, 1019, 1931, 856, 2612, 751, 1785, 1742, 3311, 1315, 1997, 420, 951, 1880, 1511, 2964, 2768, 1626, 2002, 2226, 1426, 2791, 2131, 2836, 1644, 687, 1736, 1392, 1076, 3038, 2167, 203, 2511, 1896, 2821, 1902, 1524, 2808, 2954, 1120, 1893, 2693, 572, 2336, 2508, 63], -[2798, 2647, 2940, 1299, 1709, 22, 2185, 1563, 825, 2062, 2882, 789, 1705, 2194, 1247, 786, 1983, 2922, 2974, 378, 1319, 436, 2601, 2237, 2187, 1311, 3297, 731, 826, 310, 2380, 1642, 1852, 2789, 2246, 1481, 1515, 1757, 1200, 1972, 2835, 22, 1914, 1145, 865, 3180, 893, 1907, 2351, 1609, 997, 1236, 1380, 67, 2611, 770, 2343, 1186, 3079, 1432, 668, 2331, 99, 2497, 1507, 1739, 2278, 2889, 1491, 2543, 1577, 2581, 2800, 1203, 1429, 2357, 754, 1117, 2687, 2799, 1174, 2562, 113, 1105, 1459, 1327, 658, 207, 201, 3293, 2681, 529, 2905, 247, 2348, 2061, 499, 245, 523, 912, 2, 2, 1495, 1411, 1646, 2686, 2623, 979, 1739, 3037, 1306, 3208, 613, 2737, 1523, 460, 2784, 48, 1585, 1343, 1632, 708, 770, 658, 2649, 2071, 2499, 767, 2497, 903, 969, 2289, 321, 897, 2425, 3111, 911, 832, 505, 400, 802, 1857, 218, 1115, 2962, 1177, 2788, 2403, 582, 1082, 1780, 1236, 431, 424, 1712, 768, 2503, 1557, 1212, 2813, 2397, 281, 1882, 1171, 2841, 2689, 509, 3300, 3083, 2195, 1446, 2889, 1467, 104, 847, 2813, 2453, 2892, 174, 2478, 199, 3275, 3177, 2622, 106, 1200, 1644, 1581, 934, 637, 1429, 992, 240, 938, 3034, 2435, 959, 2894, 2410, 1831, 2622, 1107, 3243, 787, 1685, 1680, 1965, 119, 544, 3270, 59, 1237, 1009, 1267, 214, 2537, 2476, 343, 1521, 2781, 790, 2550, 1375, 1611, 1089, 1350, 293, 841, 1493, 2182, 812, 2075, 1483, 2234, 2166, 120, 1383, 171, 2241, 1403, 1941, 621, 900, 2867, 881, 226, 2004, 764, 2969, 426, 1489, 2398, 2468, 3317, 778, 834], -[1194, 1585, 1197, 3038, 1225, 2402, 2053, 387, 2903, 2443, 2825, 1045, 2323, 1122, 1226, 1394, 2783, 2330, 2121, 677, 2465, 633, 1718, 2195, 738, 2473, 164, 625, 1214, 2351, 25, 2983, 1492, 1354, 2448, 429, 1470, 466, 1519, 1316, 2250, 56, 1601, 2560, 1068, 2830, 2136, 2911, 1174, 2914, 1662, 944, 2289, 2823, 1045, 654, 286, 331, 3234, 587, 1108, 937, 1611, 1140, 3090, 1058, 2763, 1262, 1428, 1265, 1235, 2942, 1681, 671, 2059, 663, 148, 1666, 1619, 1805, 1536, 826, 243, 2690, 1187, 3239, 93, 900, 2809, 1068, 3140, 2829, 2606, 2121, 2017, 3215, 424, 306, 555, 2963, 168, 1364, 1147, 1923, 1286, 774, 1047, 2978, 1574, 1664, 1053, 1513, 1844, 3325, 2964, 2193, 2659, 2588, 2560, 1169, 2843, 744, 1859, 229, 2458, 1483, 1802, 3157, 3, 2751, 2966, 1152, 86, 605, 1045, 1815, 1295, 3262, 583, 2116, 252, 1169, 2730, 1970, 2307, 1190, 1564, 999, 2713, 3181, 2989, 2688, 2819, 312, 1162, 1078, 1070, 2323, 22, 794, 2024, 2348, 1912, 1297, 1978, 964, 1469, 1407, 32, 1440, 2749, 314, 469, 2080, 1776, 830, 2935, 2822, 3175, 1029, 2887, 2770, 1567, 1833, 374, 2105, 3280, 3212, 3088, 603, 1960, 805, 1568, 2549, 1130, 2988, 2754, 306, 2132, 2877, 1388, 2048, 1488, 670, 670, 2502, 3152, 3190, 1381, 1125, 2047, 2066, 1804, 2905, 27, 1386, 2235, 1775, 3033, 1996, 778, 2037, 114, 3325, 666, 3117, 561, 2542, 1471, 1013, 3169, 2995, 789, 1835, 26, 114, 126, 1525, 211, 3257, 1561, 1167, 138, 2001, 3310, 2753, 2904, 1802, 2612, 1691, 3, 528, 1429, 2873, 3177, 293]] -w: [68, 163, 1585, 16, 1716, 11, 3326, 51, 52, 3252, 1770, 1636, 3287, 1786, 1720, 1554, 20, 1550, 1709, 1771, 1697, 12, 1754, 20, 3227, 1698, 42, 1763, 1637, 1607, 1608, 1707, 1790, 1695, 59, 10, 3285, 3274, 1590, 1631, 1625, 9, 3219, 146, 1584, 1612, 55, 1718, 1623, 1815, 1771, 20, 1792, 3222, 78, 1808, 1557, 1786, 3313, 1782, 3233, 1678, 1637, 3310, 1608, 106, 5, 1563, 92, 1584, 3202, 135, 9, 1537, 3282, 1691, 1705, 3312, 1623, 1719, 1595, 1623, 3267, 1613, 1734, 3273, 1564, 1710, 9, 19, 88, 50, 66, 1760, 1615, 27, 1707, 1603, 117, 1602, 1545, 3273, 1559, 3328, 4, 3277, 1698, 32, 1646, 75, 3299, 105, 1651, 1636, 154, 46, 1661, 8, 1742, 1730, 1753, 1537, 36, 3290, 1712, 1806, 1512, 45, 1693, 1571, 9, 1733, 139, 1579, 133, 32, 1555, 29, 1657, 1708, 1720, 3209, 1668, 57, 1611, 39, 3300, 96, 3225, 1615, 1544, 1601, 53, 3301, 26, 1750, 1722, 3231, 78, 3309, 1519, 3323, 53, 1727, 1542, 70, 1593, 127, 1723, 90, 1689, 3263, 16, 1580, 1852, 34, 3256, 1790, 1665, 53, 1649, 52, 13, 3326, 1683, 3276, 1678, 48, 0, 8, 53, 1651, 1676, 3311, 3302, 3247, 3299, 3224, 121, 1613, 1644, 1479, 1744, 3277, 1812, 3319, 3202, 3308, 3319, 1580, 65, 122, 3220, 1629, 1638, 1696, 1643, 1560, 83, 180, 68, 1634, 1549, 3293, 15, 72, 1537, 1598, 3259, 3141, 1620, 3253, 49, 1759, 1718, 1753, 3308, 3210, 1592, 108, 30, 119, 55, 8, 24, 1608, 10, 1692, 3276, 3280, 1788, 1539, 3261, 84, 1703, 1659] -mPrime: 14EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC - -KPrime: BD7256B242F404869D662F80BF677A16C0C6FC1568CCA5B64582A01A6A142D71 -rPrime: 5AE7C624837B9165CB3469F5F573F94FB3B1DE20C97F718135CEA8A97A81DC4D - -tHat: [[2100, 2910, 894, 3203, 211, 1162, 2629, 1556, 877, 3231, 2741, 1782, 754, 1696, 2041, 1833, 2399, 1372, 1145, 944, 942, 2457, 2486, 215, 2915, 1271, 168, 2818, 690, 3245, 1974, 2976, 1014, 1834, 3187, 788, 238, 608, 243, 1900, 2769, 2276, 1598, 1710, 2989, 3000, 3020, 2526, 3271, 1968, 107, 3003, 630, 12, 450, 1539, 28, 2170, 2110, 1820, 2831, 388, 725, 2311, 944, 1827, 124, 486, 475, 3111, 176, 3119, 1309, 997, 2574, 1271, 375, 1671, 1849, 3212, 2628, 3000, 1695, 2646, 2638, 1208, 1800, 2522, 2458, 707, 1953, 2, 2097, 2227, 1709, 533, 638, 2787, 1269, 277, 2455, 100, 1442, 3076, 519, 2865, 459, 379, 1286, 408, 575, 1454, 2765, 3095, 573, 115, 2111, 1939, 1957, 2109, 117, 95, 1836, 2335, 2677, 2891, 621, 882, 1797, 3033, 2054, 2535, 2013, 272, 716, 1076, 2640, 39, 2740, 2783, 699, 598, 2316, 2428, 942, 624, 174, 219, 747, 2325, 1682, 1210, 1552, 2697, 2411, 1649, 2893, 160, 3312, 1189, 1966, 2241, 2604, 1609, 2370, 1262, 1488, 1546, 307, 490, 1764, 802, 1216, 2731, 1105, 541, 2384, 247, 1601, 688, 1399, 962, 2597, 1243, 2533, 1893, 2591, 2304, 774, 2200, 2930, 3224, 1911, 207, 3319, 3323, 2237, 984, 3313, 1939, 757, 3135, 579, 3249, 2589, 1365, 3287, 440, 36, 2402, 168, 1436, 2876, 639, 1619, 180, 2771, 2976, 3120, 1862, 2327, 2387, 884, 2136, 3024, 864, 1648, 318, 2084, 2013, 488, 1098, 3152, 1181, 2103, 1910, 127, 3311, 104, 2353, 378, 295, 1577, 421, 606, 3007, 1641, 264, 116, 190, 729, 1635, 2276, 1579, 361, 2286], -[3306, 2722, 203, 2582, 1589, 872, 2765, 1991, 2982, 1675, 33, 579, 1047, 2840, 2561, 1470, 3325, 934, 1287, 2145, 289, 1142, 1590, 2463, 2669, 1253, 1556, 937, 2066, 877, 997, 2563, 456, 729, 439, 366, 1157, 2650, 573, 2136, 2032, 1288, 1759, 1759, 3234, 567, 1465, 1063, 3038, 2463, 228, 2759, 1749, 1150, 201, 3252, 87, 435, 3139, 1004, 1640, 1262, 40, 1659, 2416, 1510, 2550, 608, 1630, 3168, 527, 3250, 2183, 1173, 3046, 2738, 3208, 268, 1772, 559, 2499, 3255, 340, 991, 2955, 2754, 2960, 2466, 2992, 2866, 1072, 1451, 1992, 1051, 1218, 1958, 3012, 1461, 2804, 1752, 63, 926, 3224, 3222, 1600, 172, 1684, 1742, 1270, 1332, 1552, 2641, 1063, 1282, 898, 324, 1717, 678, 10, 2473, 1215, 1787, 3026, 2791, 3027, 2698, 805, 1561, 2137, 2086, 2992, 680, 967, 914, 3120, 895, 902, 2279, 2258, 495, 2278, 3139, 2908, 2499, 2557, 1297, 3035, 3269, 1300, 3108, 705, 1494, 1367, 1981, 83, 1209, 2666, 2913, 2177, 117, 2133, 2558, 1959, 1881, 1958, 3285, 1122, 1067, 1123, 3008, 268, 487, 1832, 2592, 2249, 1326, 1236, 859, 1694, 2910, 1598, 1876, 1013, 3218, 519, 1400, 1837, 876, 1167, 11, 2243, 3186, 2063, 1132, 2485, 2222, 67, 2995, 1974, 3026, 1239, 2888, 218, 2847, 1526, 2372, 585, 2884, 1730, 555, 2908, 792, 2537, 1352, 597, 2978, 111, 913, 1120, 3251, 1820, 1114, 2199, 1095, 213, 2199, 332, 422, 2134, 2672, 343, 1748, 1389, 2462, 867, 636, 1176, 2364, 751, 621, 844, 402, 2320, 2622, 0, 3241, 891, 2117, 498, 2947, 1691, 2218, 291, 2312, 2799, 673], -[2883, 28, 1136, 1795, 160, 1567, 1959, 896, 2964, 3284, 155, 71, 2034, 2420, 2990, 2188, 2481, 448, 254, 1437, 1035, 336, 3141, 915, 3254, 1118, 950, 86, 2810, 1726, 1109, 2938, 1430, 87, 2302, 1571, 1954, 2774, 191, 1470, 401, 2568, 357, 2192, 307, 1625, 2574, 2634, 422, 1677, 1107, 2339, 2422, 2287, 1039, 3284, 1650, 342, 3270, 353, 113, 2371, 3032, 154, 3132, 1818, 242, 1000, 2429, 259, 1438, 15, 3228, 713, 2010, 2943, 934, 1963, 1075, 2442, 1153, 3007, 605, 1111, 3233, 1284, 2114, 194, 2166, 1258, 1123, 2527, 269, 2518, 1862, 573, 1978, 1146, 2723, 2315, 2982, 1599, 2682, 473, 704, 1666, 3325, 69, 2109, 3249, 673, 2213, 712, 606, 2497, 575, 3281, 2124, 2034, 2286, 3109, 973, 974, 1337, 2761, 3117, 685, 1703, 1657, 1183, 64, 472, 213, 487, 3323, 2957, 2058, 2601, 857, 3289, 127, 1432, 19, 2914, 561, 1815, 1926, 2964, 2422, 2218, 1655, 2145, 752, 161, 2821, 195, 1092, 1543, 1347, 2192, 3087, 2814, 1827, 1492, 476, 444, 2752, 2504, 2399, 677, 2747, 337, 317, 2955, 131, 1292, 1662, 2299, 120, 2590, 2893, 3070, 1774, 540, 2785, 1680, 2742, 2813, 426, 1721, 1363, 825, 2277, 0, 380, 2180, 1486, 3200, 354, 29, 3028, 477, 1267, 1292, 3115, 2216, 1505, 1860, 904, 1770, 1709, 1618, 3263, 2874, 1569, 39, 2945, 2509, 3239, 1890, 1556, 835, 4, 2698, 3306, 91, 906, 2610, 1862, 1528, 2985, 2838, 650, 3276, 1008, 2953, 1448, 1653, 312, 3297, 3284, 3047, 2078, 478, 44, 2031, 3139, 1167, 2418, 128, 1107, 791, 1544, 1528, 1282, 1564]] - -bHat = aHat^T: [[[504, 2561, 2088, 2399, 2069, 274, 1069, 2208, 2645, 1765, 1640, 521, 787, 2050, 2822, 2997, 781, 1188, 2933, 1171, 2759, 2455, 950, 891, 348, 2834, 1385, 700, 1585, 1576, 576, 291, 1843, 662, 3091, 3142, 1490, 1488, 281, 1242, 1900, 2462, 444, 691, 3262, 184, 1193, 2680, 550, 1625, 2801, 1621, 3120, 1201, 194, 326, 2485, 1941, 1407, 959, 2886, 2526, 1406, 1385, 2114, 3007, 2940, 1188, 2724, 2563, 3055, 2818, 327, 564, 63, 1667, 3065, 1932, 5, 1290, 3017, 331, 419, 224, 2851, 2633, 3076, 2962, 2068, 2099, 1693, 1130, 2106, 1270, 441, 1013, 1765, 458, 2772, 2202, 1835, 1049, 2259, 2454, 2650, 1365, 1627, 2967, 3093, 1882, 2911, 510, 2129, 642, 2237, 2085, 2050, 864, 2870, 1072, 2052, 2223, 2191, 2426, 957, 447, 1237, 2365, 2069, 1161, 1049, 936, 1374, 3132, 608, 1800, 3108, 2674, 3265, 1940, 426, 771, 1148, 328, 2337, 2425, 117, 3062, 664, 653, 1628, 2268, 2932, 365, 1186, 3233, 3026, 2257, 2522, 1096, 3141, 1785, 2330, 1394, 717, 1691, 38, 1601, 2433, 2305, 538, 673, 3275, 421, 2579, 405, 892, 1534, 1396, 1827, 648, 1721, 2241, 698, 265, 43, 2673, 1673, 2438, 1445, 3143, 2364, 561, 831, 1097, 2447, 473, 2584, 518, 2594, 1930, 160, 3103, 523, 818, 1547, 2342, 1909, 220, 405, 2025, 1972, 1353, 2370, 1261, 2552, 736, 1993, 514, 2503, 97, 2700, 1505, 619, 3128, 2609, 2608, 2280, 826, 1528, 3181, 1835, 1107, 739, 1033, 587, 512, 828, 2049, 588, 2052, 1067, 2020, 3175, 2234, 1586, 2374, 1862, 1807, 1121, 2289, 760, 1079, 1776, 657, 1874], -[1435, 2714, 2093, 2896, 517, 494, 2247, 2648, 2828, 2715, 1739, 878, 392, 376, 1827, 2132, 2803, 1460, 2753, 59, 1064, 724, 934, 1041, 1642, 3064, 1629, 1249, 1891, 2787, 2524, 2964, 271, 2785, 3317, 3054, 3050, 1946, 149, 2757, 2099, 3066, 2070, 126, 3059, 1287, 817, 663, 846, 1671, 669, 1630, 230, 134, 1851, 956, 3227, 144, 2684, 1896, 1365, 793, 453, 804, 895, 1377, 1305, 3144, 614, 414, 2549, 1391, 511, 565, 2795, 1321, 1259, 1745, 2527, 508, 1770, 1839, 1316, 2127, 1302, 1044, 2759, 2112, 669, 453, 2185, 349, 2549, 3017, 3173, 1789, 2817, 2493, 658, 2102, 297, 2025, 816, 1083, 970, 372, 1964, 906, 823, 2432, 2817, 2965, 2882, 2338, 3005, 2385, 1198, 521, 2632, 1714, 159, 2135, 31, 3278, 1230, 1100, 479, 1492, 642, 111, 1104, 939, 901, 2950, 1227, 2008, 873, 1790, 1779, 1706, 781, 1017, 1747, 2670, 1125, 2139, 1174, 726, 1934, 3180, 1299, 988, 473, 266, 2481, 2115, 1483, 3244, 499, 1211, 492, 1495, 3301, 1054, 3261, 3169, 560, 2466, 2040, 1180, 1126, 1371, 342, 917, 215, 2825, 1900, 1015, 3253, 1106, 1878, 3052, 2792, 1743, 152, 1733, 2732, 1031, 1338, 2118, 285, 1338, 1878, 3325, 2550, 219, 2947, 247, 1082, 1126, 2652, 2538, 2871, 2715, 2810, 2969, 3131, 258, 844, 578, 3197, 3069, 2519, 2894, 2860, 1627, 1428, 1206, 628, 2543, 335, 1101, 227, 2985, 2607, 2666, 2251, 2018, 613, 1187, 3057, 1355, 2599, 2119, 960, 2002, 343, 453, 3082, 964, 1855, 3167, 1176, 1334, 2813, 2580, 698, 2624, 1672, 1906, 1836, 984, 2838, 1044, 1528, 479], -[173, 872, 2311, 901, 2233, 305, 1614, 153, 2648, 1301, 1372, 1173, 1956, 1923, 1074, 1787, 827, 802, 2238, 1507, 360, 2287, 530, 52, 1078, 2726, 3283, 323, 995, 1454, 38, 1260, 3029, 1150, 1296, 605, 307, 1490, 1189, 1163, 2788, 1006, 311, 1585, 712, 2709, 2767, 1200, 2872, 1181, 2113, 681, 21, 240, 1383, 2755, 2439, 2202, 1396, 148, 2791, 1213, 431, 3074, 1902, 655, 2953, 2758, 1289, 2689, 1210, 2897, 562, 1719, 1022, 1480, 3242, 1193, 2429, 1038, 596, 1432, 515, 12, 1484, 2369, 3012, 1330, 1834, 279, 1301, 421, 2313, 2182, 139, 1734, 1923, 2672, 2362, 200, 1017, 843, 596, 724, 346, 894, 2515, 1914, 3208, 1104, 2891, 381, 751, 321, 2038, 2740, 2049, 315, 3109, 672, 1259, 2627, 2576, 2376, 3229, 185, 19, 2373, 2249, 311, 720, 2180, 1752, 1684, 2874, 1873, 242, 1445, 1156, 826, 2464, 2821, 1976, 340, 1973, 3163, 2666, 3216, 343, 1948, 1672, 2281, 3079, 1685, 1856, 1883, 714, 758, 223, 2844, 2117, 1899, 2167, 806, 2296, 72, 160, 1508, 2985, 2758, 671, 638, 2766, 89, 2292, 2447, 1963, 448, 1878, 1446, 2991, 2114, 405, 2676, 2944, 1891, 1392, 1271, 1018, 714, 166, 2714, 1782, 2490, 2039, 1542, 2674, 1223, 1699, 2470, 67, 2778, 2201, 1330, 607, 116, 1375, 2339, 2912, 1032, 2632, 1539, 1349, 357, 288, 877, 962, 2331, 2148, 1493, 797, 2809, 1334, 1087, 1515, 228, 494, 1690, 2989, 2906, 2594, 576, 146, 1646, 451, 2629, 1249, 459, 990, 1058, 2371, 1143, 711, 63, 2602, 208, 961, 1872, 2135, 1727, 1865, 460, 2063, 1377, 1961, 674]], -[[877, 2689, 1314, 2901, 2383, 2676, 776, 1093, 373, 619, 2108, 1575, 302, 2884, 2512, 3312, 354, 3190, 2488, 1489, 450, 2083, 950, 3219, 1736, 858, 990, 1726, 1010, 268, 1985, 2456, 2400, 1322, 1692, 792, 830, 2967, 1496, 305, 1859, 3199, 181, 773, 737, 654, 2211, 2472, 1979, 1700, 1487, 481, 1512, 1996, 704, 3195, 1924, 577, 2456, 2113, 620, 1900, 747, 1711, 3029, 330, 3103, 344, 1648, 193, 1535, 2411, 1276, 3311, 2481, 2874, 391, 101, 2934, 877, 2063, 1063, 528, 89, 2131, 2800, 2878, 1023, 1280, 851, 1870, 2841, 1500, 1453, 1779, 1740, 447, 3105, 1459, 2871, 1054, 2457, 2503, 2298, 2740, 2664, 3326, 703, 2697, 1073, 588, 1797, 146, 3163, 482, 3245, 328, 2927, 1894, 1676, 2011, 2012, 3326, 2628, 2114, 51, 9, 325, 3212, 2441, 104, 1908, 2893, 2419, 1131, 2260, 1076, 3290, 3303, 1284, 1342, 272, 1042, 499, 2096, 697, 94, 1653, 3156, 1314, 707, 132, 540, 395, 3132, 2127, 2717, 2405, 827, 593, 224, 2818, 1100, 1236, 1585, 3159, 2404, 2160, 657, 1064, 1578, 1321, 1941, 1275, 1228, 943, 2773, 3179, 1719, 1584, 940, 2966, 2024, 843, 1858, 2536, 1122, 2306, 3257, 1191, 1368, 83, 2567, 1552, 1912, 286, 2792, 183, 1800, 705, 1242, 1652, 469, 555, 123, 2646, 950, 3230, 941, 3104, 2895, 1836, 592, 1449, 95, 3121, 2440, 2724, 1799, 1139, 214, 494, 534, 2152, 2559, 1648, 1041, 1856, 1250, 1418, 3159, 1988, 1690, 162, 711, 1731, 1316, 1566, 2396, 2183, 2879, 907, 2796, 3073, 100, 3060, 2629, 2117, 2826, 3135, 2089, 3126, 301, 1620, 3086, 2870], -[2030, 1476, 1307, 1939, 469, 688, 102, 935, 1684, 2508, 2703, 2261, 3181, 7, 1626, 2393, 1204, 1721, 1179, 1497, 2130, 2115, 1335, 1073, 2528, 773, 949, 2385, 562, 2111, 2643, 2432, 2674, 570, 3076, 2459, 1549, 322, 964, 2775, 1385, 727, 3251, 844, 3017, 305, 1718, 74, 246, 2901, 2480, 2465, 2876, 2534, 2461, 2405, 2370, 1091, 3058, 2925, 174, 1887, 1655, 868, 666, 3224, 639, 1967, 7, 323, 668, 2464, 496, 2743, 2606, 2358, 2146, 503, 1470, 377, 1935, 1406, 2879, 2045, 1266, 3100, 1121, 822, 2643, 953, 310, 816, 1910, 671, 3122, 780, 1930, 1547, 2064, 63, 651, 1358, 3187, 2051, 1087, 3039, 400, 2813, 2661, 466, 1380, 3102, 1423, 587, 760, 2773, 217, 520, 843, 309, 2936, 2653, 59, 2991, 310, 1523, 2450, 901, 245, 1000, 1998, 543, 1124, 2506, 783, 1442, 652, 2915, 636, 3058, 601, 264, 1463, 2600, 194, 831, 609, 871, 1298, 811, 913, 2155, 2352, 3094, 1291, 2202, 2384, 1109, 407, 419, 2011, 252, 929, 2402, 2480, 610, 2196, 1179, 365, 383, 1843, 690, 3274, 843, 1526, 180, 340, 2717, 246, 1660, 1494, 2922, 1744, 1293, 674, 3307, 2035, 3176, 1011, 2997, 187, 2305, 2535, 3095, 2049, 1458, 3089, 479, 1693, 2935, 1871, 1208, 2406, 1548, 59, 2275, 172, 2777, 1653, 1702, 2404, 1153, 19, 2692, 722, 2679, 2435, 1039, 2537, 10, 410, 485, 2369, 465, 1481, 1427, 2357, 2868, 2171, 2474, 2812, 2681, 3184, 388, 2601, 468, 2609, 1566, 1300, 848, 1776, 1073, 3059, 2328, 1887, 1799, 2995, 3099, 498, 2584, 2918, 591, 2214, 709, 837, 2916], -[1699, 1753, 2869, 3202, 1534, 2495, 1639, 2474, 3258, 502, 315, 2343, 2767, 2558, 782, 3300, 763, 719, 2597, 770, 1299, 2184, 1891, 2564, 2579, 328, 818, 105, 2248, 2130, 2559, 2964, 2411, 3256, 835, 1059, 3154, 2224, 2134, 2836, 2372, 2213, 2197, 941, 688, 2759, 3100, 3214, 1206, 482, 761, 1515, 684, 3073, 130, 3204, 177, 2931, 1937, 283, 51, 2569, 2983, 2924, 1276, 595, 225, 2274, 1372, 1458, 31, 931, 537, 359, 47, 710, 3270, 735, 549, 1245, 2463, 1829, 2641, 3320, 451, 2958, 3219, 2582, 2743, 2170, 603, 426, 1730, 3270, 1241, 2177, 341, 2549, 2362, 1529, 2581, 1944, 3265, 1705, 1458, 1757, 966, 350, 1235, 2974, 1305, 1257, 1476, 818, 2677, 742, 1442, 3305, 2688, 1263, 5, 2460, 1315, 3313, 1831, 1135, 1908, 2076, 1739, 2340, 1771, 592, 1136, 346, 528, 3141, 756, 302, 1663, 341, 3211, 2052, 3228, 1009, 124, 3147, 591, 66, 1445, 2356, 106, 1276, 1299, 2065, 382, 1965, 2930, 2989, 1787, 2113, 1759, 2501, 1978, 1898, 591, 406, 3110, 1522, 3239, 1451, 2368, 2957, 2291, 582, 2707, 370, 871, 3257, 1335, 1495, 1790, 27, 1934, 2767, 1933, 2027, 3172, 2031, 880, 916, 193, 695, 2225, 817, 2187, 549, 2, 2608, 31, 1501, 1901, 853, 2148, 2952, 1211, 270, 477, 820, 2580, 2250, 95, 651, 1475, 360, 2596, 660, 353, 2985, 1346, 33, 2966, 2156, 1732, 2577, 2902, 148, 979, 2601, 1659, 1423, 368, 1435, 2324, 1147, 996, 3191, 2176, 1055, 3219, 427, 3077, 2739, 2896, 3220, 693, 2421, 1259, 893, 3075, 3112, 1219, 218, 3006, 2683, 260, 1594]], -[[944, 2368, 2787, 2753, 1705, 169, 2455, 2348, 1200, 3008, 513, 1731, 441, 2153, 493, 2496, 1405, 2360, 2147, 2699, 1629, 2955, 353, 2774, 1471, 1444, 1430, 2000, 2051, 956, 2517, 3193, 1350, 1581, 2066, 2621, 2178, 866, 1706, 420, 1024, 428, 1180, 2236, 31, 2331, 2615, 2312, 3054, 2288, 485, 1167, 2293, 946, 3103, 2625, 3258, 2567, 2840, 2568, 2198, 1295, 3081, 1233, 334, 269, 2864, 1981, 1823, 646, 1377, 757, 1997, 183, 1819, 2432, 2779, 2861, 2612, 975, 1288, 2691, 2196, 864, 441, 2778, 799, 1224, 2825, 1130, 3188, 2877, 2661, 1563, 476, 3208, 3266, 1094, 338, 56, 936, 210, 563, 3179, 628, 604, 1738, 3232, 1899, 2116, 1616, 2938, 3075, 446, 971, 166, 2634, 2641, 2881, 1533, 3082, 2998, 834, 2501, 1380, 2904, 1934, 3302, 3194, 1864, 543, 668, 3162, 3136, 1542, 1482, 336, 140, 2347, 938, 1300, 2734, 2140, 347, 283, 1220, 1000, 1185, 2426, 1996, 1903, 1608, 2316, 500, 2018, 2520, 1712, 825, 464, 2240, 1720, 1602, 868, 1703, 1748, 495, 2972, 432, 2901, 687, 1700, 512, 532, 2738, 2935, 2770, 434, 425, 1358, 2528, 623, 574, 1719, 589, 2229, 2713, 524, 2083, 630, 2900, 122, 3289, 23, 1215, 678, 2081, 423, 3004, 1949, 72, 1439, 1410, 66, 1038, 989, 1498, 2423, 3096, 3191, 1954, 523, 965, 753, 515, 99, 1500, 634, 3144, 1190, 2916, 1319, 3141, 1491, 2471, 1143, 2160, 2206, 1933, 1550, 1899, 2968, 396, 2964, 947, 456, 2026, 1666, 2535, 2078, 2911, 53, 2785, 1750, 1115, 197, 1643, 137, 499, 3078, 1343, 2495, 1636, 1800, 1670, 842, 3096], -[701, 632, 1748, 2683, 1252, 1738, 953, 2885, 2065, 3283, 1280, 65, 150, 2085, 687, 1257, 1828, 3211, 3204, 3016, 2508, 3259, 2379, 1469, 2774, 2441, 1831, 979, 1840, 2930, 250, 2733, 2091, 1663, 126, 2994, 2941, 124, 1260, 2555, 813, 462, 1359, 1108, 2598, 1961, 453, 228, 1688, 2019, 745, 1924, 3183, 2730, 2857, 970, 853, 3174, 2550, 1691, 2114, 1921, 1568, 1852, 2851, 2882, 2838, 914, 377, 1767, 1026, 602, 1162, 691, 16, 2105, 1066, 2449, 2264, 3126, 1580, 1207, 927, 2682, 658, 2350, 456, 2203, 1390, 1665, 2836, 3194, 1357, 315, 1680, 787, 2404, 681, 3128, 55, 645, 225, 2332, 2371, 297, 831, 865, 1022, 2016, 2860, 1134, 3159, 3000, 1703, 2896, 1555, 858, 1331, 3113, 2002, 637, 1153, 133, 1369, 2392, 1332, 1122, 2070, 1858, 2577, 2766, 1889, 1808, 3322, 2828, 1534, 1708, 1433, 561, 1073, 2651, 2576, 3219, 493, 1964, 2504, 1388, 1955, 670, 285, 1201, 2333, 3009, 1526, 3324, 2845, 2875, 12, 734, 381, 3094, 1188, 2567, 981, 1434, 2909, 3229, 1392, 885, 553, 329, 2917, 1254, 1733, 2306, 3163, 2760, 90, 2761, 2545, 2023, 1064, 1617, 485, 1501, 1834, 417, 740, 2618, 1530, 2781, 3183, 933, 2813, 163, 2695, 2418, 2915, 1864, 2416, 3096, 11, 3251, 208, 2963, 3042, 1177, 802, 1301, 893, 1178, 2365, 1836, 913, 990, 44, 858, 1250, 1826, 1028, 2652, 2647, 1886, 857, 3109, 2386, 2999, 309, 1793, 2014, 1510, 484, 1292, 1250, 826, 2990, 3286, 2879, 249, 1737, 2728, 1980, 2468, 1574, 212, 1477, 1690, 1738, 1462, 2880, 1990, 209, 37, 2970, 327, 2770], -[454, 1606, 3133, 139, 2795, 769, 2212, 86, 131, 527, 505, 544, 2963, 2093, 2911, 982, 2357, 2477, 3171, 1936, 232, 94, 2258, 2957, 1822, 2592, 2248, 591, 644, 2553, 56, 2399, 2031, 2479, 512, 2031, 2073, 696, 2997, 1479, 2115, 1333, 2071, 2112, 2857, 1975, 1589, 739, 1865, 1143, 1707, 1359, 878, 2913, 2013, 269, 1244, 218, 2514, 829, 577, 3189, 3005, 1949, 2682, 1797, 927, 551, 1430, 2855, 2441, 1418, 2388, 828, 750, 2561, 2617, 908, 1994, 576, 3117, 701, 3133, 327, 2484, 2193, 3224, 941, 276, 1944, 2895, 2002, 2352, 1759, 1646, 1277, 93, 262, 2000, 755, 3251, 2887, 96, 2626, 2898, 826, 558, 238, 1874, 3065, 2603, 412, 2462, 2709, 216, 2452, 3234, 2320, 2180, 2328, 3309, 2342, 2563, 1471, 1771, 1419, 2533, 684, 1128, 2261, 1698, 245, 1626, 1846, 330, 1136, 3169, 3277, 316, 635, 1532, 672, 6, 2971, 2318, 2494, 1756, 1532, 3120, 888, 1856, 1097, 17, 654, 2313, 2165, 3316, 1952, 73, 254, 2355, 3106, 62, 3157, 2767, 2106, 109, 2500, 454, 2668, 988, 961, 2317, 1731, 480, 346, 2506, 3081, 1855, 1033, 1453, 1419, 2298, 2688, 1949, 966, 2697, 2766, 2787, 2752, 1609, 2440, 1453, 2303, 3002, 2149, 3135, 1694, 100, 2178, 1566, 2395, 485, 1617, 288, 2597, 236, 99, 1462, 1487, 734, 1105, 2786, 3195, 634, 2823, 1219, 539, 2446, 3027, 1322, 3251, 887, 571, 2691, 1538, 3111, 661, 454, 2600, 2306, 1674, 727, 206, 2435, 2979, 1853, 2309, 379, 2419, 196, 2090, 2423, 1876, 2189, 2, 3270, 506, 2055, 1309, 736, 2176, 1070, 633, 1274, 3239]]] - -r: [[1, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 3328, 1, 2, 0, 0, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 0, 1, 0, 0, 2, 3328, 2, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 2, 2, 3328, 3328, 1, 3328, 2, 1, 0, 1, 1, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 3328, 2, 0, 1, 3328, 0, 0, 0, 3327, 3328, 0, 0, 0, 3328, 1, 0, 0, 0, 3328, 3328, 1, 3328, 1, 1, 1, 3327, 3327, 1, 1, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 1, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 0, 2, 3328, 1, 2, 2, 3328, 1, 2, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3327, 2, 3328, 1, 3328, 3328, 3328, 1, 1, 1, 0, 3328, 0, 1, 3327, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 3327, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 0, 3328, 3327, 2, 0, 3328, 0, 0, 3327, 3328, 1, 3328, 3327, 1, 3327, 0, 0, 3327, 1, 3328, 3328, 0, 2, 3327, 3328, 0, 0, 0, 2, 0, 3328, 0, 3328], -[2, 3327, 0, 1, 3328, 3328, 0, 2, 3328, 1, 2, 1, 1, 1, 0, 3328, 2, 3328, 0, 3327, 3328, 1, 2, 0, 0, 0, 1, 0, 1, 3328, 1, 0, 3328, 0, 3327, 1, 0, 0, 3328, 3328, 3327, 0, 1, 3328, 0, 1, 3328, 1, 2, 3328, 1, 0, 3328, 1, 1, 3328, 3328, 1, 0, 1, 3328, 3328, 0, 3328, 0, 0, 1, 3328, 3328, 2, 1, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 0, 0, 2, 0, 2, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 3328, 0, 0, 0, 2, 3328, 0, 0, 1, 0, 3327, 0, 3328, 0, 1, 1, 0, 0, 1, 0, 1, 0, 3327, 0, 3327, 0, 1, 1, 3327, 0, 1, 1, 1, 3328, 3328, 1, 3328, 1, 0, 1, 1, 1, 3328, 0, 0, 1, 3328, 0, 1, 0, 1, 0, 3328, 1, 0, 1, 1, 3328, 1, 1, 1, 1, 3328, 1, 0, 3328, 3327, 0, 1, 1, 0, 3328, 3328, 3327, 0, 0, 2, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 3327, 1, 2, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 3328, 3328, 1, 0, 1, 0, 0, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 1, 0, 3328, 1, 0, 2, 3328, 3328, 3328, 0, 3327, 0, 0, 1, 1, 3328, 0, 0, 2], -[0, 3328, 3328, 0, 3328, 1, 0, 0, 0, 3327, 3327, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 3328, 3328, 1, 3327, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 1, 3327, 3328, 3328, 0, 3328, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 3328, 0, 1, 3327, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 2, 3327, 3328, 0, 0, 0, 3328, 3328, 1, 3327, 1, 1, 3327, 1, 3328, 3328, 1, 1, 2, 2, 3328, 3328, 1, 0, 0, 0, 0, 3328, 2, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 3328, 3328, 1, 2, 3328, 2, 1, 0, 1, 0, 3328, 3328, 0, 3327, 1, 1, 1, 0, 1, 0, 1, 3328, 0, 0, 2, 0, 2, 0, 0, 1, 0, 0, 1, 1, 0, 1, 2, 0, 1, 0, 1, 1, 3327, 0, 0, 3328, 3328, 0, 2, 1, 3328, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 3328, 3328, 0, 3328, 1, 3327, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 3327, 3328, 1, 0, 1, 0, 0, 0, 2, 3328, 3328, 1, 0, 1, 1, 0, 3327, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 0, 3327, 3328, 0, 3328, 3328, 0, 3328, 2, 1, 0, 3328, 0, 3328, 3328, 0, 3327, 0, 0, 3327, 0, 3328, 0, 2]] - -e1: [[0, 2, 0, 0, 1, 3328, 0, 0, 1, 3328, 3328, 0, 0, 3327, 3327, 3327, 3328, 3328, 1, 1, 3327, 0, 1, 0, 1, 0, 3327, 0, 1, 1, 3327, 1, 2, 1, 1, 0, 3328, 1, 0, 0, 2, 3328, 0, 0, 2, 0, 3328, 0, 0, 0, 0, 3328, 1, 2, 1, 3328, 0, 1, 3328, 0, 0, 0, 0, 1, 3328, 0, 3327, 1, 0, 1, 0, 3328, 0, 0, 2, 2, 3328, 1, 0, 0, 3328, 1, 0, 0, 1, 3328, 0, 1, 3327, 3328, 3328, 2, 3327, 1, 3328, 3328, 0, 3328, 0, 3328, 3328, 3327, 1, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 3328, 3327, 2, 3328, 0, 3328, 0, 1, 1, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3327, 0, 2, 1, 3327, 1, 3328, 1, 0, 0, 1, 1, 2, 3328, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 0, 1, 0, 0, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 2, 0, 0, 2, 0, 0, 0, 1, 1, 3328, 3328, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 0, 1, 2, 3328, 3327, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 3327, 3327, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 0, 0, 1, 3327, 0, 0, 0, 2, 0, 0, 0, 1, 0, 2, 0, 3328, 0, 1, 0, 3327, 0], -[1, 0, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 0, 1, 3327, 0, 2, 3327, 3328, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 3328, 3327, 0, 1, 3328, 0, 1, 0, 1, 0, 0, 1, 3328, 3327, 3327, 3328, 1, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 1, 3327, 1, 1, 0, 0, 0, 1, 2, 3328, 3328, 0, 0, 3328, 0, 1, 1, 3328, 0, 2, 3328, 2, 3328, 0, 0, 3328, 0, 3328, 3327, 1, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 0, 3327, 3327, 0, 2, 1, 2, 0, 2, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 1, 1, 0, 0, 0, 3328, 0, 3328, 0, 0, 1, 2, 2, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 1, 3327, 3328, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 3328, 0, 3327, 1, 1, 1, 3328, 3328, 3328, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 2, 0, 0, 3328, 1, 3328, 0, 3327, 3328, 3328, 2, 0, 3328, 1, 3328, 1, 2, 1, 1, 0, 1, 3328, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3327, 0, 0, 3327, 1, 3328, 3327, 1, 3328, 1, 0, 0, 3328, 0, 3327, 1, 0, 1, 0, 1, 3328, 0, 3327, 1, 0, 1, 2, 3328, 0, 1, 1, 0, 3328, 0, 1, 3328, 3327, 0, 1, 1, 3327, 3328, 1, 3328, 1, 3328, 3328], -[3328, 3328, 1, 0, 3328, 0, 1, 0, 3327, 1, 0, 0, 1, 0, 0, 2, 0, 3328, 0, 3328, 0, 3328, 0, 2, 0, 3327, 2, 1, 1, 0, 3328, 1, 0, 0, 3327, 3327, 0, 3327, 0, 3328, 1, 0, 2, 1, 3328, 0, 1, 1, 3328, 3328, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 3328, 3328, 3328, 1, 3327, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 1, 3328, 0, 1, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 1, 2, 3328, 3328, 0, 3328, 3328, 1, 3328, 0, 3327, 1, 0, 3328, 0, 0, 0, 1, 0, 0, 3327, 1, 3327, 0, 0, 1, 2, 2, 1, 0, 1, 1, 3328, 3328, 3328, 0, 0, 0, 1, 2, 0, 0, 2, 1, 1, 2, 0, 2, 0, 3327, 3327, 1, 0, 1, 0, 0, 1, 0, 0, 1, 3328, 3328, 1, 0, 1, 0, 2, 0, 3328, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 1, 2, 3328, 1, 3327, 1, 0, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 1, 0, 3328, 0, 0, 0, 3328, 0, 2, 0, 1, 2, 1, 3328, 1, 1, 0, 3328, 1, 3327, 1, 0, 2, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3327, 1, 0, 0, 1, 0, 2, 0, 3327, 3328, 3328, 1, 2, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 0, 0, 0, 3328, 1, 0, 1, 3328, 3328, 3328, 1, 0, 0, 1, 0, 3328, 3328]] - -e2: [0, 3328, 1, 3328, 1, 0, 2, 3328, 0, 0, 1, 0, 1, 1, 0, 2, 0, 3328, 0, 2, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 3328, 0, 1, 0, 0, 1, 3328, 2, 1, 0, 3328, 3327, 0, 1, 0, 0, 1, 3328, 3328, 0, 1, 1, 0, 3328, 3328, 3327, 0, 3327, 3328, 1, 1, 0, 1, 0, 0, 0, 3328, 0, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 3327, 3328, 0, 0, 0, 3328, 3328, 3327, 3328, 1, 3328, 0, 0, 0, 2, 0, 1, 3328, 3328, 3328, 1, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 0, 0, 3327, 0, 1, 0, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 1, 0, 1, 2, 1, 0, 2, 3328, 3328, 1, 3327, 0, 1, 0, 2, 3328, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 3327, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2, 3328, 3328, 0, 3328, 0, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 0, 1, 3327, 0, 2, 1, 0, 1, 0, 1, 0, 3327, 0, 3327, 1, 3328, 0, 0, 0, 0, 0, 3327, 2, 0, 0, 0, 1, 3328, 3328, 3328, 0, 1, 1, 0, 0, 3328, 3328, 3328, 3328, 0, 3328] -rHat: [[1307, 1115, 2843, 2750, 53, 3232, 564, 1601, 2979, 2813, 1924, 1256, 1363, 633, 2606, 249, 2826, 2564, 2747, 1538, 2332, 21, 893, 2167, 611, 3127, 2608, 1426, 1081, 1514, 1018, 510, 1079, 399, 1279, 509, 1997, 1460, 2516, 2053, 1757, 3107, 2995, 277, 1354, 446, 322, 2854, 419, 2019, 1109, 335, 869, 2546, 3265, 2635, 1718, 1225, 3045, 2903, 803, 2065, 999, 516, 2535, 320, 933, 3171, 1749, 1406, 2421, 1363, 1268, 586, 1371, 1555, 497, 496, 699, 3237, 1947, 2316, 804, 831, 3009, 1795, 2522, 2963, 1788, 785, 373, 1016, 2314, 2753, 2892, 3128, 246, 2345, 2091, 1837, 2095, 2036, 1994, 1765, 883, 1531, 209, 2778, 1779, 676, 205, 2197, 806, 2525, 2371, 3288, 158, 531, 2376, 8, 2869, 1665, 2627, 2850, 221, 2139, 1131, 1301, 2577, 80, 1259, 203, 1327, 3149, 1171, 2194, 2991, 2128, 2983, 1248, 1251, 1904, 1525, 351, 2595, 1305, 1386, 2865, 1327, 1410, 650, 1645, 1282, 1884, 52, 308, 1745, 2224, 212, 1390, 2506, 1300, 180, 1271, 1145, 1839, 725, 237, 2801, 2338, 361, 2214, 30, 907, 1822, 380, 2219, 1293, 894, 160, 1426, 2145, 653, 2098, 86, 1136, 1388, 3070, 602, 712, 208, 1233, 2304, 1531, 255, 579, 2002, 197, 1904, 328, 854, 126, 18, 2581, 1522, 2321, 3212, 2555, 792, 1870, 913, 1792, 55, 2535, 797, 863, 953, 165, 1324, 3024, 43, 69, 716, 965, 2489, 1861, 256, 1146, 686, 2695, 1081, 1053, 552, 2553, 2344, 808, 850, 791, 2257, 1480, 748, 1285, 1412, 154, 3276, 1722, 2047, 87, 76, 140, 22, 1221, 857, 774, 2763, 1461], -[1606, 193, 658, 2035, 830, 1434, 2887, 2937, 1435, 750, 371, 486, 1389, 3313, 1789, 356, 1508, 331, 1781, 3270, 1515, 1980, 465, 130, 1415, 3281, 2759, 2523, 2849, 2101, 2599, 2120, 2625, 1888, 2754, 1413, 2725, 2188, 1204, 80, 664, 1229, 168, 3045, 83, 1983, 1496, 697, 955, 2869, 2222, 3294, 1102, 549, 370, 1293, 1899, 430, 2203, 3234, 1947, 2397, 461, 651, 803, 1038, 2293, 1020, 3296, 2577, 306, 1966, 2308, 2718, 1657, 2698, 2867, 1522, 558, 292, 3009, 1182, 2047, 1330, 1802, 257, 1514, 31, 1540, 1028, 76, 2765, 421, 774, 530, 1433, 294, 879, 3102, 2394, 2190, 1496, 1356, 1777, 3044, 2226, 39, 3260, 2623, 2750, 1977, 2371, 805, 1154, 2686, 1858, 2028, 1393, 1022, 1547, 1241, 1322, 1216, 2805, 2162, 3026, 1251, 2360, 646, 641, 3200, 1178, 1950, 2938, 613, 318, 2880, 2281, 1880, 2294, 2750, 849, 3268, 1666, 1833, 1310, 418, 3191, 721, 1925, 1152, 2260, 2448, 874, 1347, 11, 1614, 2288, 2603, 1244, 2736, 662, 1146, 88, 1941, 1015, 414, 2587, 3298, 3023, 3154, 413, 1499, 1620, 992, 925, 1058, 334, 2122, 1282, 652, 2395, 2905, 443, 966, 1127, 2259, 3137, 1184, 2542, 2273, 346, 3271, 2285, 100, 2988, 704, 2947, 3197, 1133, 283, 1698, 714, 3, 2664, 2180, 1280, 401, 2419, 2301, 1578, 1876, 199, 627, 2908, 940, 226, 780, 1597, 964, 115, 155, 1280, 3325, 3019, 460, 1876, 2699, 2839, 2161, 1179, 2061, 3257, 1889, 2580, 3259, 1888, 2110, 987, 180, 1521, 3077, 2340, 1854, 91, 1039, 1621, 1250, 169, 1894, 1936, 927, 992, 1705, 2434, 1367], -[2587, 820, 2401, 2720, 764, 2141, 1899, 2778, 135, 3105, 1553, 3121, 2658, 633, 395, 974, 1703, 1573, 129, 276, 2071, 1564, 2379, 2705, 1804, 243, 980, 2120, 691, 3200, 494, 2145, 2791, 1635, 373, 991, 2625, 2728, 3050, 848, 1414, 1703, 1755, 1962, 1299, 386, 1507, 2018, 3197, 2260, 1397, 1340, 3120, 351, 3280, 421, 1643, 375, 1710, 974, 942, 2396, 518, 2195, 1439, 2069, 1251, 2831, 2416, 1189, 2869, 1659, 3100, 1962, 2662, 2289, 1946, 1021, 1254, 1971, 1156, 1955, 445, 1211, 135, 2617, 3239, 820, 1338, 2348, 690, 406, 763, 1621, 89, 866, 3324, 89, 822, 2244, 566, 1003, 2011, 1258, 335, 2550, 755, 901, 1904, 541, 41, 1246, 1841, 939, 2912, 531, 2272, 1474, 2719, 2344, 794, 3234, 280, 2473, 1947, 2513, 2620, 1857, 615, 3190, 625, 2697, 3189, 3219, 1279, 481, 1864, 3168, 3040, 2774, 2037, 2584, 2972, 2375, 382, 537, 1543, 998, 705, 1351, 1718, 3261, 1764, 2789, 2223, 1768, 3227, 1644, 3010, 2718, 2505, 315, 1174, 2729, 974, 2857, 2621, 186, 1992, 1278, 2543, 2680, 125, 323, 3078, 2591, 85, 2116, 1580, 1807, 2817, 2867, 679, 2415, 1596, 1879, 2695, 2730, 2359, 1791, 2906, 2400, 1099, 827, 2784, 110, 295, 1134, 859, 2748, 1282, 654, 929, 2850, 2781, 3132, 2707, 175, 738, 1896, 1218, 288, 1496, 3163, 1920, 3298, 2708, 1040, 1738, 3097, 3030, 2954, 686, 1682, 269, 1011, 1271, 3295, 816, 2693, 3173, 2675, 2277, 1242, 2829, 1963, 1314, 2069, 1233, 3188, 249, 661, 1787, 920, 3266, 70, 2834, 37, 656, 2035, 243, 1184, 2410, 2491, 2367, 411]] - -BHat * rHat: [[1, 127, 2252, 1774, 1319, 216, 2740, 506, 2897, 1644, 1067, 272, 434, 1016, 25, 1865, 3075, 443, 73, 142, 1652, 1257, 2977, 353, 1340, 2123, 1191, 655, 883, 1513, 2253, 274, 2589, 20, 2457, 2532, 2608, 402, 2513, 286, 1696, 2329, 2459, 875, 2707, 2484, 2913, 1826, 2816, 1611, 16, 415, 1928, 337, 2103, 2763, 1296, 2036, 2062, 2354, 101, 584, 2008, 3280, 2525, 1548, 246, 1703, 1568, 472, 1609, 349, 1357, 959, 3200, 2951, 2227, 782, 2490, 2235, 1387, 1622, 1661, 990, 1976, 1582, 1407, 3172, 1473, 2834, 2960, 75, 1568, 3224, 1296, 1940, 1550, 1713, 2506, 536, 1045, 2653, 1081, 2949, 3005, 1827, 609, 2200, 1382, 2198, 1180, 1562, 2810, 49, 1645, 2656, 3067, 3038, 981, 897, 1083, 2694, 642, 400, 523, 2424, 527, 1242, 1739, 546, 2235, 2736, 1763, 2130, 1377, 2308, 1538, 1232, 2629, 929, 2115, 1378, 1060, 3099, 806, 432, 2297, 2946, 2275, 1134, 1453, 232, 2713, 291, 1665, 1074, 1044, 255, 2862, 2514, 83, 330, 62, 2434, 2266, 683, 3256, 1522, 840, 3000, 1333, 3187, 3085, 458, 3256, 3316, 1038, 1171, 2442, 493, 2839, 1183, 1600, 1313, 2039, 526, 3072, 349, 949, 1199, 2694, 2752, 1395, 3207, 28, 1796, 595, 949, 3083, 294, 93, 1699, 3004, 3208, 485, 2079, 1355, 3306, 2745, 1964, 2455, 146, 2867, 172, 3275, 2714, 1099, 613, 1441, 3172, 2834, 1475, 1921, 2885, 1165, 2685, 1536, 1784, 2594, 141, 1216, 3145, 3277, 2496, 599, 1651, 2438, 2737, 2311, 3269, 2152, 2195, 481, 218, 2828, 1972, 2310, 382, 1456, 140, 3067, 3229, 2774, 842, 1012, 2412], -[553, 3304, 606, 2390, 2439, 2992, 902, 713, 2388, 2438, 132, 1771, 3202, 1334, 490, 2721, 2671, 1012, 2173, 938, 1959, 1191, 1677, 2515, 1574, 836, 1836, 3183, 2296, 2289, 3179, 2232, 2928, 197, 166, 332, 2753, 2646, 2298, 2711, 1350, 490, 2870, 2235, 2918, 2828, 1561, 2357, 2159, 184, 2253, 640, 2873, 2394, 2230, 865, 2393, 2503, 391, 3100, 1793, 1546, 397, 3085, 851, 97, 1301, 2233, 3314, 2698, 3251, 2196, 1593, 803, 1605, 994, 1418, 746, 3196, 729, 1403, 1298, 643, 1675, 1787, 534, 370, 3232, 1686, 2598, 1886, 3283, 445, 854, 3323, 949, 2849, 2782, 1617, 443, 1948, 3086, 2953, 3100, 2336, 111, 1765, 413, 1124, 286, 338, 2339, 2850, 1587, 3280, 2864, 1172, 3075, 1997, 1997, 338, 1024, 274, 91, 890, 1989, 404, 1888, 127, 2298, 2886, 2757, 2279, 2150, 3016, 2494, 1390, 2966, 1358, 563, 2247, 456, 1157, 2369, 250, 3309, 1777, 3320, 3272, 306, 413, 102, 351, 3053, 1085, 969, 2087, 1190, 634, 1079, 2126, 696, 1167, 297, 494, 3040, 2000, 2614, 1999, 802, 1963, 923, 34, 964, 190, 3115, 647, 1547, 2607, 218, 1690, 2456, 2504, 2319, 1393, 593, 3071, 1446, 3062, 1412, 2611, 3195, 2298, 781, 1046, 2504, 1785, 2999, 2703, 979, 1129, 2581, 2207, 1750, 485, 1886, 1583, 3132, 1742, 1903, 762, 1963, 1239, 1563, 1124, 1270, 1507, 866, 782, 182, 2914, 3017, 336, 2441, 2254, 2512, 52, 999, 174, 464, 2492, 2199, 1438, 2773, 2897, 1467, 2074, 501, 1194, 2547, 2249, 2446, 677, 1997, 2216, 2948, 2732, 834, 586, 2992, 2472, 1905, 859, 2921, 1055, 2004], -[2316, 944, 2344, 1074, 2292, 2320, 467, 469, 1195, 2346, 412, 1069, 112, 429, 109, 3279, 424, 2370, 1830, 2462, 2954, 1978, 510, 3030, 967, 3129, 701, 58, 1276, 3243, 1783, 3303, 2591, 1043, 2943, 665, 1894, 2510, 2957, 1146, 214, 178, 3231, 2723, 2173, 2074, 1816, 1938, 428, 3113, 3295, 1175, 964, 3138, 523, 2481, 296, 378, 2010, 472, 421, 499, 2116, 1005, 285, 2464, 796, 2584, 2057, 1346, 1797, 331, 45, 1603, 274, 1827, 1079, 302, 168, 2187, 397, 2744, 249, 2563, 1121, 909, 3018, 956, 2470, 1813, 1820, 2624, 2874, 2647, 2890, 3127, 3067, 1529, 1147, 3230, 2408, 2763, 2696, 2800, 1711, 1506, 3190, 965, 298, 2594, 565, 1539, 2807, 2217, 2391, 1869, 537, 2180, 81, 2321, 1763, 484, 669, 1392, 2916, 2131, 129, 789, 3127, 399, 1187, 3191, 1979, 935, 1935, 1044, 2655, 727, 2522, 344, 2430, 1110, 3295, 611, 2187, 2144, 2455, 1458, 2139, 1893, 2289, 704, 1122, 623, 906, 1144, 2343, 2466, 3269, 2820, 1224, 1022, 2068, 709, 2582, 249, 184, 1551, 2515, 2369, 1128, 310, 3080, 27, 1050, 2871, 2122, 3066, 2109, 2875, 2461, 719, 379, 2049, 35, 854, 459, 2540, 2163, 3142, 1070, 3305, 2288, 396, 2493, 3197, 2796, 1991, 1830, 1198, 1239, 775, 1419, 2608, 2478, 1745, 847, 2966, 781, 2721, 1248, 2899, 1616, 492, 815, 70, 3100, 2110, 3179, 1690, 3144, 3051, 1373, 2483, 1489, 2908, 2671, 780, 2532, 577, 1460, 640, 3120, 1128, 1857, 1752, 807, 2342, 557, 2649, 1119, 2044, 2522, 1365, 964, 922, 2027, 1282, 1771, 857, 3212, 695, 853, 996, 1613, 15]] -NTTInverse(BHat * rHat): [[2390, 2004, 1233, 557, 320, 148, 2920, 2049, 722, 1522, 1714, 2781, 2853, 1623, 2266, 3309, 1643, 2616, 2182, 372, 459, 3152, 1994, 3049, 1436, 781, 805, 2808, 1217, 2963, 572, 2798, 1738, 559, 1794, 395, 1779, 1110, 171, 1532, 403, 943, 769, 1283, 790, 2306, 2907, 3058, 1342, 2956, 1792, 2051, 0, 2293, 2935, 233, 2541, 2358, 401, 2622, 846, 1476, 2393, 2262, 2512, 1515, 1767, 1711, 2355, 878, 2631, 1296, 970, 1380, 478, 1263, 506, 921, 1113, 437, 1444, 1475, 478, 857, 776, 715, 2336, 680, 2316, 1196, 895, 3098, 2537, 2212, 942, 2731, 392, 1222, 2391, 741, 3269, 219, 3306, 1823, 1789, 236, 3076, 477, 148, 2791, 2236, 634, 2897, 1875, 325, 2339, 480, 3257, 2021, 3226, 2237, 3178, 2113, 1556, 1433, 2354, 1022, 3195, 495, 561, 3054, 2300, 256, 2607, 33, 747, 2928, 1660, 1829, 3314, 2874, 1443, 1176, 2772, 1822, 685, 2116, 501, 804, 1759, 2335, 2755, 538, 2785, 231, 1924, 2632, 3191, 47, 1962, 2679, 2760, 1, 2205, 726, 675, 1234, 1130, 926, 878, 2055, 1828, 1633, 1627, 887, 119, 1687, 651, 295, 2055, 854, 2568, 211, 2117, 3268, 125, 1490, 3040, 1336, 1230, 2439, 1220, 2263, 1836, 706, 3065, 285, 1055, 1427, 2205, 1220, 161, 2966, 2696, 970, 1037, 2957, 81, 1340, 2147, 1675, 118, 1749, 2749, 67, 220, 1567, 37, 2337, 2306, 1058, 3070, 1780, 2105, 2564, 1620, 631, 1685, 270, 1805, 1426, 2626, 831, 1107, 978, 2357, 2736, 2577, 683, 3304, 1634, 1552, 303, 1038, 777, 1201, 2937, 1353, 1484, 1524, 1382, 2458, 2223, 1280, 2159, 572], -[662, 2876, 1504, 1457, 1182, 1351, 1049, 272, 2986, 1962, 1243, 2325, 1333, 3155, 1830, 706, 990, 1491, 1815, 398, 2081, 1293, 796, 506, 2560, 599, 1348, 445, 2054, 631, 151, 1136, 665, 1057, 2318, 2725, 1561, 22, 1850, 1838, 2460, 1152, 3175, 2223, 2519, 1232, 399, 3014, 2113, 3296, 1861, 330, 1944, 2668, 707, 2089, 1196, 1094, 2110, 2461, 1343, 427, 1019, 982, 2338, 640, 3133, 1997, 1891, 1770, 892, 148, 102, 3008, 3077, 786, 2506, 3291, 1068, 1205, 1649, 2189, 2532, 2055, 965, 2468, 1485, 2773, 1144, 3016, 393, 545, 817, 2428, 1535, 1488, 1968, 2130, 3253, 2893, 1908, 1730, 2108, 1320, 2958, 1639, 103, 2295, 668, 2581, 3077, 1501, 1001, 1620, 2460, 2950, 1769, 3180, 1328, 1509, 2725, 381, 633, 2849, 1624, 158, 666, 2659, 210, 1868, 1196, 2655, 1316, 2379, 3115, 1883, 312, 1534, 1764, 1624, 2954, 3314, 2027, 962, 3328, 728, 1035, 2306, 2805, 1077, 497, 2100, 188, 2695, 2950, 2929, 1182, 1428, 1866, 1262, 3195, 2750, 496, 47, 593, 217, 1872, 685, 913, 165, 941, 275, 1702, 1623, 1326, 3200, 2595, 3317, 521, 2019, 1600, 2351, 768, 2520, 3304, 3116, 3077, 3170, 2900, 2285, 675, 1654, 769, 3048, 2377, 1277, 1178, 413, 2425, 3009, 857, 174, 2088, 261, 3023, 1856, 288, 486, 1146, 2158, 480, 2480, 313, 2400, 170, 2225, 1605, 746, 2220, 1209, 2261, 1309, 913, 2004, 1240, 2096, 2992, 2037, 2369, 1779, 2210, 3133, 1347, 1675, 749, 1609, 1243, 2392, 739, 1774, 585, 408, 1659, 2148, 1071, 123, 2331, 2429, 3183, 1027, 2186, 952, 2730, 1858, 3010, 3010], -[223, 863, 472, 2398, 1684, 1037, 80, 3005, 2951, 1804, 2121, 1700, 2420, 171, 2540, 196, 371, 10, 1873, 3006, 1541, 1308, 1457, 1207, 1742, 136, 2708, 54, 30, 154, 158, 415, 47, 1212, 1841, 300, 2988, 2199, 2393, 546, 1368, 1247, 464, 1277, 1552, 131, 1049, 2198, 1349, 544, 2507, 2212, 2133, 2388, 3323, 2846, 1660, 1280, 3, 2900, 2597, 1957, 2092, 976, 2554, 1430, 2889, 173, 1266, 1035, 937, 3025, 973, 2088, 1959, 1249, 401, 1673, 2449, 2447, 855, 415, 2313, 1540, 812, 1139, 1380, 2282, 3255, 313, 2187, 3087, 2608, 158, 1374, 511, 1279, 961, 3008, 3290, 2954, 742, 114, 2838, 1428, 680, 1958, 1049, 3250, 2669, 77, 2159, 2610, 2139, 3213, 1392, 1407, 2000, 1571, 1316, 312, 1870, 3013, 1442, 2298, 160, 461, 3087, 1143, 614, 2907, 263, 1735, 2474, 1933, 2480, 2726, 868, 229, 1872, 1182, 1572, 1553, 2002, 2100, 714, 882, 108, 1009, 2359, 3205, 185, 1474, 3104, 360, 1568, 2173, 2472, 1770, 3053, 2133, 2659, 172, 270, 2566, 1036, 579, 2284, 2144, 1010, 2082, 3309, 2836, 2788, 2797, 477, 1237, 1653, 576, 3041, 167, 1301, 542, 1361, 2153, 1393, 1713, 293, 3073, 1656, 2900, 519, 417, 1762, 1277, 2309, 1330, 2590, 2254, 129, 1359, 2966, 1429, 1026, 387, 900, 1235, 1407, 746, 1329, 1058, 3044, 900, 3071, 2114, 2289, 2977, 397, 3128, 1591, 1228, 676, 1101, 1543, 2327, 1840, 736, 2991, 2936, 728, 2042, 626, 2227, 2987, 3314, 1057, 2360, 3273, 2520, 553, 3078, 99, 516, 1387, 3056, 2622, 2975, 134, 912, 2040, 1994, 2428, 1437, 2588, 463, 2517]] -u = NTTInverse(BHat * rHat) + e1: [[2390, 2006, 1233, 557, 321, 147, 2920, 2049, 723, 1521, 1713, 2781, 2853, 1621, 2264, 3307, 1642, 2615, 2183, 373, 457, 3152, 1995, 3049, 1437, 781, 803, 2808, 1218, 2964, 570, 2799, 1740, 560, 1795, 395, 1778, 1111, 171, 1532, 405, 942, 769, 1283, 792, 2306, 2906, 3058, 1342, 2956, 1792, 2050, 1, 2295, 2936, 232, 2541, 2359, 400, 2622, 846, 1476, 2393, 2263, 2511, 1515, 1765, 1712, 2355, 879, 2631, 1295, 970, 1380, 480, 1265, 505, 922, 1113, 437, 1443, 1476, 478, 857, 777, 714, 2336, 681, 2314, 1195, 894, 3100, 2535, 2213, 941, 2730, 392, 1221, 2391, 740, 3268, 217, 3307, 1822, 1788, 237, 3075, 477, 148, 2790, 2236, 633, 2895, 1877, 324, 2339, 479, 3257, 2022, 3227, 2237, 3179, 2114, 1555, 1433, 2353, 1021, 3194, 495, 561, 3052, 2300, 258, 2608, 31, 748, 2927, 1661, 1829, 3314, 2875, 1444, 1178, 2771, 1823, 685, 2116, 500, 805, 1760, 2336, 2755, 537, 2785, 231, 1923, 2632, 3190, 47, 1961, 2679, 2761, 1, 2206, 726, 675, 1233, 1131, 927, 878, 2056, 1828, 1634, 1626, 887, 121, 1687, 651, 297, 2055, 854, 2568, 212, 2118, 3267, 124, 1489, 3040, 1335, 1228, 2438, 1220, 2263, 1836, 705, 3065, 286, 1057, 1426, 2203, 1219, 161, 2965, 2696, 969, 1037, 2957, 82, 1340, 2147, 1675, 119, 1748, 2749, 67, 220, 1568, 37, 2335, 2304, 1058, 3069, 1781, 2106, 2563, 1618, 631, 1684, 268, 1806, 1425, 2626, 830, 1107, 979, 2357, 2736, 2578, 681, 3304, 1634, 1552, 305, 1038, 777, 1201, 2938, 1353, 1486, 1524, 1381, 2458, 2224, 1280, 2157, 572], -[663, 2876, 1504, 1456, 1181, 1350, 1049, 272, 2985, 1962, 1242, 2325, 1334, 3156, 1829, 706, 990, 1490, 1814, 398, 2081, 1294, 794, 506, 2562, 597, 1347, 445, 2054, 631, 152, 1137, 665, 1057, 2317, 2725, 1562, 21, 1848, 1838, 2461, 1151, 3175, 2224, 2519, 1233, 399, 3014, 2114, 3295, 1859, 328, 1943, 2669, 706, 2089, 1196, 1094, 2110, 2460, 1343, 428, 1020, 983, 2336, 641, 3134, 1997, 1891, 1770, 893, 150, 101, 3007, 3077, 786, 2505, 3291, 1069, 1206, 1648, 2189, 2534, 2054, 967, 2467, 1485, 2773, 1143, 3016, 392, 543, 818, 2430, 1536, 1488, 1969, 2129, 3252, 2893, 1907, 1729, 2109, 1320, 2958, 1637, 101, 2295, 670, 2582, 3079, 1501, 1003, 1621, 2460, 2949, 1770, 3181, 1327, 1510, 2725, 381, 634, 2850, 1624, 158, 666, 2658, 210, 1867, 1196, 2655, 1317, 2381, 3117, 1882, 312, 1534, 1765, 1623, 2953, 3313, 2027, 961, 3327, 728, 1034, 2307, 2806, 1075, 496, 2101, 188, 2695, 2949, 2930, 1183, 1428, 1865, 1262, 3194, 2750, 494, 48, 594, 218, 1871, 684, 912, 165, 942, 275, 1701, 1624, 1327, 3199, 2596, 3317, 523, 2019, 1600, 2350, 769, 2519, 3304, 3114, 3076, 3169, 2902, 2285, 674, 1655, 768, 3049, 2379, 1278, 1179, 413, 2426, 3008, 858, 174, 2088, 262, 3022, 1857, 288, 487, 1146, 2156, 480, 2480, 311, 2401, 169, 2223, 1606, 745, 2221, 1209, 2261, 1308, 913, 2002, 1241, 2096, 2993, 2037, 2370, 1778, 2210, 3131, 1348, 1675, 750, 1611, 1242, 2392, 740, 1775, 585, 407, 1659, 2149, 1070, 121, 2331, 2430, 3184, 1025, 2185, 953, 2729, 1859, 3009, 3009], -[222, 862, 473, 2398, 1683, 1037, 81, 3005, 2949, 1805, 2121, 1700, 2421, 171, 2540, 198, 371, 9, 1873, 3005, 1541, 1307, 1457, 1209, 1742, 134, 2710, 55, 31, 154, 157, 416, 47, 1212, 1839, 298, 2988, 2197, 2393, 545, 1369, 1247, 466, 1278, 1551, 131, 1050, 2199, 1348, 543, 2507, 2213, 2134, 2388, 3324, 2847, 1661, 1280, 3, 2900, 2596, 1956, 2091, 977, 2552, 1431, 2889, 174, 1267, 1034, 937, 3025, 973, 2087, 1959, 1250, 400, 1673, 2450, 2447, 855, 415, 2314, 1540, 812, 1140, 1379, 2282, 3256, 315, 2186, 3086, 2608, 157, 1373, 512, 1278, 961, 3006, 3291, 2954, 741, 114, 2838, 1428, 681, 1958, 1049, 3248, 2670, 75, 2159, 2610, 2140, 3215, 1394, 1408, 2000, 1572, 1317, 311, 1869, 3012, 1442, 2298, 160, 462, 3089, 1143, 614, 2909, 264, 1736, 2476, 1933, 2482, 2726, 866, 227, 1873, 1182, 1573, 1553, 2002, 2101, 714, 882, 109, 1008, 2358, 3206, 185, 1475, 3104, 362, 1568, 2172, 2472, 1769, 3053, 2132, 2658, 172, 269, 2567, 1035, 579, 2285, 2146, 1009, 2083, 3307, 2837, 2788, 2796, 478, 1236, 1652, 577, 3041, 167, 1300, 544, 1362, 2153, 1392, 1713, 293, 3073, 1655, 2900, 521, 417, 1763, 1279, 2310, 1329, 2591, 2255, 129, 1358, 2967, 1427, 1027, 387, 902, 1235, 1407, 746, 1330, 1056, 3042, 899, 3069, 2112, 2290, 2977, 397, 3129, 1591, 1230, 676, 1099, 1542, 2326, 1841, 738, 2992, 2936, 727, 2043, 625, 2228, 2988, 3314, 1056, 2359, 3273, 2520, 553, 3078, 99, 515, 1388, 3056, 2623, 2974, 133, 911, 2041, 1994, 2428, 1438, 2588, 462, 2516]] - -mu: [0, 0, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665] -tHat^T * rHat: [168, 1978, 1879, 506, 2991, 2549, 1591, 3010, 2292, 3168, 735, 2810, 809, 2276, 173, 2808, 3298, 1969, 368, 1506, 1472, 3275, 292, 590, 3078, 2931, 2675, 2578, 567, 1161, 2015, 3020, 2566, 2296, 860, 1511, 1139, 1161, 3020, 1988, 2403, 1878, 513, 342, 215, 2884, 1115, 1845, 3082, 980, 1395, 1520, 17, 2863, 603, 569, 1322, 715, 1465, 2054, 2488, 2923, 1385, 1926, 2847, 3174, 1309, 44, 2990, 3300, 1894, 2855, 2882, 596, 2113, 2173, 2488, 2587, 2610, 2707, 2338, 2011, 2050, 3181, 2208, 2572, 2347, 955, 3284, 1416, 2106, 1698, 1044, 1087, 2930, 1895, 2493, 2836, 87, 1212, 2012, 660, 377, 1982, 3063, 2234, 1604, 2972, 297, 2607, 185, 3176, 1179, 52, 1105, 2425, 2655, 1992, 571, 329, 3318, 1336, 2715, 2042, 1316, 3046, 435, 141, 2283, 2272, 487, 2767, 1208, 2900, 1355, 1420, 2897, 376, 2389, 193, 1804, 1101, 338, 89, 1510, 2702, 3065, 2652, 983, 2245, 2677, 604, 41, 3037, 3282, 2371, 1804, 747, 1341, 1148, 2174, 2645, 3093, 1297, 508, 137, 3097, 1526, 1875, 2438, 1330, 2284, 72, 932, 2674, 2714, 3005, 2400, 2457, 1273, 3190, 3099, 2290, 1724, 2420, 2006, 34, 1441, 623, 428, 1286, 3175, 44, 311, 198, 2210, 3236, 1936, 2655, 3239, 1190, 3072, 3231, 1773, 970, 1631, 1927, 843, 2192, 3310, 1153, 922, 1770, 246, 1467, 2142, 1566, 931, 870, 2016, 2271, 41, 1153, 128, 254, 1707, 3255, 3297, 2955, 2360, 74, 3061, 1746, 878, 2738, 2738, 409, 247, 247, 611, 162, 3152, 2853, 1623, 2673, 2255, 2709, 3261, 3157, 1628, 2144, 1375, 1998, 555, 526, 1701] -NTTInverse(tHat^T * rHat): [3281, 129, 1087, 3110, 2523, 1722, 632, 2517, 1209, 720, 1354, 1061, 665, 2811, 1418, 1765, 1465, 2182, 847, 1799, 3093, 3104, 2223, 1845, 1735, 2124, 1227, 526, 9, 879, 286, 3103, 1395, 1074, 2472, 1474, 2942, 2733, 1516, 1637, 1671, 1449, 305, 1462, 2130, 2158, 3279, 2030, 1895, 578, 537, 3135, 144, 2361, 2423, 335, 2587, 584, 399, 3321, 1770, 2466, 179, 2746, 1488, 124, 2933, 1743, 2206, 2141, 3015, 1149, 2344, 2363, 905, 1195, 779, 44, 626, 1980, 2074, 2113, 2982, 1942, 2032, 1330, 1306, 2907, 2899, 1397, 566, 589, 2703, 1610, 1065, 1844, 2260, 42, 2428, 814, 2948, 31, 64, 1232, 1421, 3124, 1641, 603, 2757, 1572, 141, 1863, 1945, 1253, 2403, 769, 1022, 1458, 2067, 3079, 3245, 703, 131, 882, 2829, 342, 1710, 3145, 1515, 2800, 3129, 2228, 2402, 1083, 555, 192, 1286, 1852, 869, 1145, 1785, 2593, 2297, 957, 3197, 1240, 1109, 1167, 1135, 2977, 689, 1727, 960, 1032, 1854, 381, 1242, 2563, 1172, 2511, 716, 2236, 1036, 1387, 932, 784, 1289, 2397, 2608, 2489, 2185, 2571, 2504, 468, 364, 1779, 2899, 1582, 173, 590, 2530, 3055, 3057, 1668, 2253, 447, 578, 1413, 868, 2620, 1185, 844, 1691, 1330, 2338, 2476, 2030, 310, 2611, 90, 2633, 2180, 552, 59, 2834, 2316, 1761, 2493, 43, 886, 3233, 126, 2940, 1478, 2338, 825, 849, 2553, 562, 2400, 1808, 1090, 2777, 254, 1814, 1772, 3214, 2124, 2556, 303, 2709, 1546, 145, 2220, 2247, 2206, 3113, 65, 2125, 106, 687, 2032, 732, 2960, 3056, 2494, 3084, 358, 1895, 2795, 2621, 1702, 449, 2606, 2886, 816] -e2 + mu: [0, 3328, 1666, 3328, 1666, 0, 2, 3328, 0, 0, 1666, 1665, 1, 1666, 1665, 1667, 0, 1664, 1665, 1667, 1667, 0, 1666, 1, 1, 1665, 0, 1665, 1665, 1665, 1666, 1666, 1667, 1664, 0, 1, 0, 0, 1666, 1664, 1667, 1, 0, 3328, 1663, 1665, 1, 1665, 1665, 1666, 1664, 3328, 1665, 1, 1, 1665, 1664, 1664, 3327, 1665, 3327, 1664, 1666, 1, 1665, 1, 0, 1665, 0, 1664, 0, 3327, 0, 1665, 0, 1665, 1665, 1, 1664, 1665, 1665, 1666, 0, 1665, 1665, 1, 1663, 1664, 0, 0, 0, 3328, 3328, 1663, 1664, 1, 1664, 1665, 0, 1665, 1667, 0, 1666, 3328, 3328, 3328, 1666, 3328, 1664, 0, 1, 0, 1664, 1665, 3328, 1, 1665, 0, 1665, 1663, 1665, 1666, 0, 3328, 1665, 1664, 1666, 0, 1666, 1664, 1, 1665, 1, 1665, 1, 2, 1666, 0, 1667, 1664, 1664, 1, 1663, 0, 1666, 0, 2, 3328, 3328, 1664, 1664, 1666, 0, 0, 3328, 1665, 1665, 1, 0, 3328, 1665, 0, 3328, 1664, 1665, 0, 1664, 1, 1665, 0, 1666, 3327, 0, 1666, 1667, 1, 0, 1666, 1665, 0, 1665, 0, 1, 3328, 1665, 0, 1665, 0, 1, 0, 1, 1665, 1666, 2, 3328, 3328, 0, 3328, 0, 1665, 1665, 1667, 1666, 1, 1664, 1, 0, 0, 0, 1666, 3328, 0, 0, 1664, 1665, 1665, 1666, 1663, 0, 2, 1, 1665, 1666, 0, 1, 0, 1663, 1665, 3327, 1, 1664, 0, 0, 1665, 1665, 1665, 3327, 2, 1665, 0, 0, 1, 3328, 3328, 3328, 1665, 1, 1666, 0, 0, 1664, 1664, 3328, 3328, 1665, 1664] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [3281, 128, 2753, 3109, 860, 1722, 634, 2516, 1209, 720, 3020, 2726, 666, 1148, 3083, 103, 1465, 517, 2512, 137, 1431, 3104, 560, 1846, 1736, 460, 1227, 2191, 1674, 2544, 1952, 1440, 3062, 2738, 2472, 1475, 2942, 2733, 3182, 3301, 9, 1450, 305, 1461, 464, 494, 3280, 366, 231, 2244, 2201, 3134, 1809, 2362, 2424, 2000, 922, 2248, 397, 1657, 1768, 801, 1845, 2747, 3153, 125, 2933, 79, 2206, 476, 3015, 1147, 2344, 699, 905, 2860, 2444, 45, 2290, 316, 410, 450, 2982, 278, 368, 1331, 2969, 1242, 2899, 1397, 566, 588, 2702, 3273, 2729, 1845, 595, 1707, 2428, 2479, 1286, 31, 1730, 1231, 1420, 3123, 3307, 602, 1092, 1572, 142, 1863, 280, 2918, 2402, 770, 2687, 1458, 403, 1413, 1581, 2369, 131, 881, 1165, 2006, 47, 3145, 3181, 1135, 3130, 564, 2403, 2748, 556, 194, 2952, 1852, 2536, 2809, 120, 2594, 631, 957, 1534, 1240, 1111, 1166, 1134, 1312, 2353, 64, 960, 1032, 1853, 2046, 2907, 2564, 1172, 2510, 2381, 2236, 1035, 3051, 2597, 784, 2953, 2398, 944, 2489, 522, 2569, 2504, 2134, 2031, 1780, 2899, 3248, 1838, 590, 866, 3055, 3058, 1667, 589, 447, 2243, 1413, 869, 2620, 1186, 2509, 28, 1332, 2337, 2475, 2030, 309, 2611, 1755, 969, 518, 2218, 60, 1169, 2317, 1761, 2493, 43, 2552, 3232, 126, 2940, 3142, 674, 2490, 2515, 887, 562, 2402, 1809, 2755, 1114, 254, 1815, 1772, 1548, 460, 2554, 304, 1044, 1546, 145, 556, 583, 542, 3111, 67, 461, 106, 687, 2033, 731, 2959, 3055, 830, 3085, 2024, 1895, 2795, 956, 37, 448, 2605, 1222, 2480] - -KBar: 72A437218AD22B2318C371896616F14B6E85EE8CED6FC1D3B87199B9522E59D4 -cPrime: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 - -Accepted, returning KPrime diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt deleted file mode 100644 index 986ce7a20..000000000 --- a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-1024.txt +++ /dev/null @@ -1,64 +0,0 @@ -Encapsulation -- ML-KEM-1024 -ek: 27669A667667B8D5466858602260115B6209BC2C45DF7A4E64932B75C78B9F7083F131BCD4E20EFF8CCF69736BDBC88406F9B69AD3CE356A0F5E676DD0A7C4ABB1A1C9D62021BB384A4014FB04CD2F821890D90427C49F4A628ECEC2731FAC025237360D582CD06647B1109AA6C2AC5D433758C1CAA53555FFF577EBB521FBE32D10F790604C53C2F82C17B08EF3625674214844906DB3FB9520031422A13BD7612D4201C27D15B9D194830CC3669BB8BA34C2523764413971C40D84AEE65675D5215309DA8367F001497546ECE07CBF002D781B830682484080AD6F9558B36B6BF610917130B7419B39F85029621264CF2C8AE4D808387B20CC5AA0B969C39BC80E6CB9CA0351A3F60ACEAF12BD41FA0996E39906A9B61697B747C2031C760288364457425BBBB40F4898AD085876608A77A5EB9D124BC9922651B76395881558CAD06F3C4BCF08E45B67BA516038A364B7740E9740EE2B93C5C65F49020AD42B3C0AEA5BF242A4F1B089B5A3458BE8A371CA1F293C53F2780ECE281293D991E6E579042BABC169724F10681FD1C7D2FB1648B0BF80818A7DD3B709734D38972E3E44875AF0927A9AADE82613FCA05EE5B3210647A5632AA170D09E70B56A2F04337A337EE952383A1A8AEEA6CDB90CCD86A818D1BB39465BA313D266BBB10581FA187D926AC3A8B749F64445FAB56C9927555793FB4ACFB039B1AA543B1B87AE6A49AB562933C4C97BD74C07BF29851A469851A982595596FE7ACAE0DB23533028AA34676F7A9B29263E7AA27900104B1BA1B5674739B2FC4ED8A330BBA5A0B6247C63F1153DA01DC8F616F10483A693A634C1BA6AE1AB2F163400BB5771E70171FCB54155ABFCB2044FCB30BAD67F742183861819EDB1AA6C771FC8E11A92E08B71F40D036C15D2896A204725BA90A03B478D98C49084382F1D223FE12980E947A415E55FE67B85DA40441342445B46C2FC42020D04769A2A1C64641F0C36636BA6C4652B267A4B9219E333A06817B5817B6E6CC485E352614169ABC20E1891B7A000C52AF15A7B904C976C1BFD3A2377EB76B55033C7C4C69E7174AAF27715756316CACCCE63A5A22435C7D1020443AA71693BF062303D13331F795424C20D266C1D90305FC8C2536684A93D506DE6329B6162405999BD5CAA7DDB9613C8238CC6D335A1EB4082E7710D079F87A4BFF6478B5F0C587786AF427192D9A34A4FA33BF0D3CC58FB463B4838CA2C337E65397DA15690C52AC0E5468BDC03DF5A62F7020934E267E0F7CF95599435F952FAB74CFEB4308B173F12E073F7F040DB4C63C1C48A7B7A41F4779A6B57A922C970771180008493D4C76805400B7C664D0B92B22C49551B1247E62C85E1E540C82093371013C4676CEAD77C5F3064A37349C7165EB3AA7DEF8731E9D66A56368F195C045B2A50E59786161A630D280089801298C130E4483150CA9152C2A0F247750C062259B84C28236C3FB54625D5CDBECC68DBA22FB1558055FB9B243501C75851E76ABE4847B9B972A73411A6B4282BF5983A82DA7413E54BA35BAB37A9B3C62884B643C134165C9870C6BB390F6B7A1E5745158FB251D6909433551FEBD30BA575A1E2F10958498D9F147ED9531322A16097F55D811795457912912B1C65F38025429B3E764A2E1ABC4E30C288082742995590981C43DBB365966BCB9720B178C5EB963B82934C02814B7525546DB7C96D65822E4942E4A4AC13C99490E7AB4A702371F21316A57906B19258428801192567C2045BF8775CF58C5DB28BA1B05E042A1859E64286B5B114F39FCACC127BE63DFF590BC184B83B168C30199890374100E40D2FC7752B1430355022F3D58925D1991BF3B98A90395F8579646C8413BAB3C0C0707A238A27D09FA57A32FF85392FD08C2F2286ABDB2B6936B9D3503802C6B51E415B81673CC78054F1B2C4BDFA733E5264C55A7C4DA5B73944402462033D08AE620BD05644B477AB315E936D3F25B5BA7AC19EB559A5C1195F568B313C2675092E6DF58FF399C42CAB6363AA033691CB8CE06699E701F2B92597CB8FC23516E9F40CE75B7BC1E0520A5A3895EB7D8D474009A0CB0ADC2DF476B5164112C3B600B6776DAB49B20381A4014691652A3C3161AAC6616CFAA265638C6C665A8454F36780B789CFA35D2AF49E6D5F482BFA3C864B0EF29E18D2EFFF92DB1876A22076AB1AAC0A7393ED9E5A48 -m: 034FF14A56249C2521D4279EBA3D04931CC892BBC45002B5B33D9F0188ACBAF6 - -K: 46C200F3F6EE8E11D47653801E3482241CB783B9D794EB116A4BDA085AEB6BB7 -r: 8A6BF0ABC0660F5EAF82FC503DA73AA76A2BD0D8E85424D27F4F750AC3CCE15E -tHat: [[1575, 2470, 1638, 1655, 1464, 1133, 2152, 1541, 34, 278, 603, 150, 3260, 1106, 2783, 1255, 868, 697, 1909, 2236, 159, 2103, 497, 3011, 724, 238, 3327, 3320, 873, 1719, 2267, 2124, 2310, 2927, 922, 3309, 2613, 246, 1886, 1750, 2000, 3146, 427, 2587, 1737, 525, 2849, 907, 74, 324, 1275, 3280, 559, 392, 2448, 77, 1063, 2556, 586, 2278, 718, 1852, 3103, 42, 1874, 867, 2061, 709, 1744, 1142, 177, 2465, 678, 2764, 861, 884, 344, 3244, 1445, 1363, 1535, 1919, 1515, 539, 1019, 734, 1808, 2319, 3168, 1332, 2242, 719, 23, 2283, 755, 1382, 372, 1154, 68, 1753, 2995, 2399, 800, 320, 290, 954, 471, 726, 322, 3104, 1405, 2961, 1233, 2105, 780, 1644, 2203, 2987, 564, 1324, 1079, 1046, 313, 3143, 1037, 2792, 1766, 1877, 469, 1330, 2569, 2109, 103, 31, 1353, 1127, 236, 1998, 191, 720, 2936, 2097, 518, 1160, 64, 2776, 1391, 1417, 2995, 1718, 246, 2321, 113, 2931, 2881, 921, 248, 661, 610, 1601, 3279, 2210, 2276, 141, 2872, 519, 2764, 2565, 2489, 3126, 2203, 236, 2412, 3243, 259, 2613, 2806, 3296, 687, 3025, 2625, 159, 918, 2462, 2310, 2922, 1814, 2937, 583, 60, 1564, 39, 1672, 1091, 599, 1460, 1211, 251, 2120, 2777, 2056, 1893, 2656, 1912, 2981, 2526, 2834, 3220, 1682, 1298, 951, 2390, 1416, 1409, 202, 1789, 2876, 3316, 1032, 1470, 2663, 1307, 2144, 2611, 1892, 1867, 1806, 1033, 3054, 2354, 1733, 1532, 585, 160, 3028, 962, 2570, 1470, 754, 2628, 241, 2203, 949, 1114, 2187, 2622, 2673, 508, 3113, 1331, 2290, 231, 2254, 290, 2451, 2333], -[1510, 1950, 2820, 2738, 2497, 1830, 79, 1665, 287, 3197, 3026, 367, 72, 3067, 384, 2216, 893, 2941, 777, 1239, 1848, 745, 1086, 2164, 90, 2351, 2682, 2777, 1768, 306, 252, 1514, 997, 539, 1798, 2644, 2659, 2578, 112, 2541, 1392, 1707, 1071, 816, 890, 2019, 745, 901, 2618, 2209, 1774, 3290, 3257, 3280, 2182, 394, 3025, 923, 2886, 2613, 531, 1645, 443, 91, 2689, 399, 637, 1705, 2243, 2938, 1609, 1103, 2629, 2911, 2412, 633, 1877, 2357, 2811, 3316, 2480, 2835, 1194, 949, 1819, 2792, 2410, 2740, 2390, 818, 2500, 1980, 3287, 116, 2495, 2130, 1562, 2436, 2385, 2090, 1369, 2405, 2814, 3239, 3040, 573, 83, 643, 1194, 1651, 2671, 2487, 1577, 994, 634, 1946, 0, 1201, 283, 2906, 1895, 916, 3250, 1263, 984, 778, 1467, 2570, 1206, 1986, 355, 351, 61, 474, 1736, 367, 1265, 2096, 934, 2665, 308, 2988, 362, 2750, 1583, 833, 2816, 1403, 1905, 30, 3185, 2911, 1345, 2741, 764, 75, 2895, 780, 1722, 2045, 372, 2098, 2182, 401, 493, 2731, 1900, 503, 456, 430, 146, 2238, 1137, 223, 3075, 342, 2514, 1704, 1824, 596, 186, 2569, 1851, 2260, 1176, 2316, 2180, 755, 541, 1010, 2529, 2050, 2025, 2628, 1301, 1534, 3046, 2135, 218, 1092, 531, 1092, 1627, 3108, 764, 36, 1037, 1888, 2714, 450, 1124, 502, 1548, 1587, 1643, 3146, 2917, 610, 2938, 2340, 793, 830, 2208, 374, 437, 1976, 3182, 3142, 901, 1326, 353, 1684, 683, 236, 280, 2937, 160, 3152, 298, 1455, 123, 1225, 3223, 438, 2813, 563, 2935, 1902, 181, 821, 1223, 3180, 414, 1863, 682, 1919], -[1301, 1591, 2582, 3276, 974, 2646, 1186, 850, 455, 45, 772, 2724, 2417, 950, 752, 774, 829, 817, 2335, 1351, 548, 220, 3110, 470, 144, 1523, 712, 1340, 1126, 2712, 61, 1749, 742, 2483, 609, 1030, 2393, 3033, 2652, 2010, 1755, 313, 968, 2242, 966, 861, 2977, 1038, 1922, 1822, 1805, 2544, 1159, 3066, 2038, 2228, 3167, 1408, 1655, 2808, 322, 2343, 985, 1194, 847, 954, 1008, 3277, 2904, 1135, 2107, 900, 3274, 818, 1406, 918, 381, 1386, 1424, 684, 1472, 1134, 3211, 61, 2783, 1573, 759, 144, 564, 1662, 2016, 3327, 2453, 2373, 2357, 1327, 2042, 1227, 1278, 779, 1931, 1009, 18, 1854, 247, 1039, 3291, 1588, 1217, 2220, 2683, 1047, 2036, 2471, 1899, 2709, 2338, 1804, 375, 2049, 1024, 2360, 2004, 1676, 5, 180, 1660, 1238, 523, 2857, 2348, 1364, 539, 1137, 3302, 2130, 1505, 1038, 200, 2354, 55, 305, 1988, 1734, 2026, 1997, 95, 1603, 931, 1175, 1735, 1505, 2739, 2010, 2031, 792, 1769, 1709, 1622, 2291, 3097, 69, 2651, 1282, 2021, 2153, 2582, 1585, 2061, 2, 137, 296, 408, 780, 2276, 788, 2640, 2332, 594, 2572, 2034, 1876, 1548, 544, 2137, 1227, 808, 1730, 1343, 1131, 1317, 3293, 3262, 1676, 731, 762, 1457, 2053, 2901, 2495, 1316, 19, 2247, 1301, 2791, 3046, 1864, 2964, 697, 2679, 308, 2657, 2228, 690, 2293, 937, 2690, 1869, 1299, 1214, 2979, 2741, 2359, 2874, 2246, 2114, 950, 3092, 1588, 1473, 152, 3175, 2491, 243, 2667, 487, 1367, 340, 655, 1307, 214, 2377, 1331, 501, 1003, 189, 1445, 2583, 482, 159, 2392, 2260, 1183, 2017, 985, 309], -[290, 1546, 1431, 1503, 1921, 2385, 2373, 295, 2961, 450, 869, 2063, 549, 2484, 1598, 1191, 2606, 3009, 78, 3107, 2184, 624, 2370, 1369, 2192, 457, 2883, 2877, 1637, 1721, 1995, 521, 2225, 3159, 1771, 953, 898, 1225, 258, 1208, 1397, 1346, 1901, 3227, 1389, 2086, 2350, 1060, 1252, 2762, 2323, 2380, 1936, 2750, 74, 567, 625, 319, 1302, 1946, 262, 2347, 600, 2180, 2305, 593, 615, 76, 2139, 1919, 1372, 2255, 605, 2235, 161, 1515, 2564, 386, 1625, 1070, 1414, 2843, 788, 2559, 3274, 300, 1659, 990, 2559, 181, 1217, 2952, 1595, 2241, 2352, 2433, 1936, 1043, 1024, 222, 1839, 1884, 1067, 769, 53, 549, 1523, 2205, 293, 2461, 795, 2975, 138, 921, 1375, 1944, 3172, 2118, 2579, 2875, 192, 1804, 890, 2210, 39, 2557, 2725, 807, 1535, 920, 47, 2253, 559, 2146, 2987, 701, 1641, 2963, 211, 901, 1538, 2908, 286, 1460, 1921, 966, 199, 1352, 753, 3147, 2749, 1855, 574, 1605, 2757, 1989, 1357, 2938, 1081, 1028, 548, 54, 2109, 2784, 2914, 3328, 1110, 2884, 2935, 794, 862, 1753, 1343, 2898, 2746, 3095, 1438, 1435, 421, 412, 1631, 2229, 3121, 611, 2421, 736, 1389, 2303, 2547, 3145, 2860, 1594, 2659, 58, 310, 3257, 140, 1646, 1945, 30, 2546, 603, 2967, 2300, 1474, 355, 1257, 207, 3047, 1973, 193, 1326, 2570, 901, 2965, 2014, 1933, 1028, 9, 3258, 3082, 733, 1780, 2903, 278, 292, 1731, 11, 1974, 1751, 2475, 2852, 259, 2632, 1537, 2324, 2661, 962, 305, 2726, 454, 1734, 762, 1626, 3171, 1736, 2662, 2117, 852, 1663, 1920, 2203, 975, 1498, 1066, 2543]] - -bHat = aHat^T: [[[1596, 166, 2137, 2913, 2171, 2784, 98, 1417, 3000, 1618, 389, 1082, 698, 2456, 1546, 1879, 1476, 1505, 253, 1946, 2617, 1049, 1030, 843, 1737, 1130, 1534, 2075, 333, 2836, 3098, 2545, 1405, 1599, 875, 934, 1448, 2461, 2195, 1386, 934, 390, 2440, 1968, 2256, 960, 733, 901, 3052, 266, 1081, 2479, 232, 1555, 1694, 3051, 1877, 65, 2794, 524, 627, 1155, 2873, 2252, 2479, 3087, 433, 2665, 431, 2806, 3032, 2107, 2170, 747, 2505, 3199, 1197, 1621, 263, 694, 2398, 622, 1469, 1509, 794, 2227, 1861, 1426, 2700, 99, 2717, 2351, 396, 1696, 882, 1892, 1147, 1040, 479, 2515, 2940, 259, 2745, 399, 1364, 1103, 410, 781, 2815, 2477, 1635, 2780, 1096, 3064, 785, 484, 2168, 2426, 1858, 3117, 1632, 543, 369, 3113, 3030, 2921, 758, 3176, 609, 2454, 3051, 2209, 1112, 1291, 2055, 3136, 3007, 995, 2647, 3179, 731, 1932, 276, 2695, 849, 3325, 1137, 2638, 2292, 1922, 1928, 3284, 1123, 2278, 2721, 1556, 1571, 2421, 2737, 578, 656, 2725, 3105, 1246, 217, 2019, 752, 3150, 310, 3241, 1335, 34, 220, 629, 2425, 2803, 439, 2208, 2398, 3001, 1840, 1937, 1472, 1139, 1431, 2934, 519, 1539, 554, 94, 273, 1015, 2142, 3198, 1325, 791, 2864, 1562, 685, 1097, 1253, 2870, 2492, 2970, 2159, 401, 2843, 3250, 2194, 211, 2734, 1246, 2450, 2960, 1153, 929, 1165, 2438, 3145, 381, 2831, 1063, 436, 2205, 362, 2615, 1057, 2712, 1897, 1491, 893, 869, 404, 490, 3205, 1272, 2492, 904, 1765, 1996, 92, 1555, 885, 1577, 530, 1226, 1824, 1342, 3315, 2765, 2350, 1384, 713, 2605, 3294, 2813], -[326, 286, 474, 255, 188, 2276, 1226, 3148, 1420, 880, 812, 1837, 1553, 263, 2959, 3060, 54, 355, 2367, 820, 2668, 2969, 1728, 408, 3122, 1251, 1078, 1983, 938, 2492, 3315, 877, 321, 2522, 3057, 252, 2960, 1050, 3230, 1128, 3131, 1411, 2373, 3050, 1821, 3191, 1236, 2236, 3048, 106, 1559, 925, 116, 1976, 2069, 2884, 2308, 1281, 2983, 599, 3045, 369, 227, 2771, 1683, 2977, 2722, 1788, 535, 2751, 1272, 1407, 1059, 1642, 2166, 1776, 2215, 3251, 1673, 2074, 1810, 487, 364, 2356, 2234, 1012, 2346, 270, 82, 3190, 810, 1349, 161, 2091, 1671, 677, 1888, 1560, 2664, 1684, 1044, 232, 356, 2750, 188, 132, 426, 449, 2983, 1903, 1253, 1802, 864, 222, 2370, 3251, 989, 1291, 3073, 854, 1200, 2325, 2939, 1221, 205, 1373, 1102, 921, 1115, 1733, 1187, 3209, 1318, 970, 1062, 1972, 2525, 1966, 3230, 448, 2847, 522, 3156, 855, 2078, 1390, 461, 642, 1760, 568, 212, 2529, 665, 2532, 2451, 293, 352, 1344, 740, 1848, 2749, 857, 602, 172, 232, 1064, 1615, 3010, 1848, 2265, 210, 1008, 2368, 2876, 2552, 2055, 2123, 2095, 2164, 2177, 3147, 948, 50, 1486, 410, 619, 856, 105, 2018, 327, 2979, 806, 700, 2181, 1048, 1069, 2256, 2391, 2265, 874, 1830, 3107, 2170, 2601, 3044, 3109, 128, 3292, 285, 306, 3085, 240, 1101, 2412, 511, 3021, 175, 225, 2269, 1790, 2171, 971, 966, 3096, 1015, 3222, 621, 892, 3227, 1766, 2783, 1026, 1868, 2559, 78, 2655, 2271, 1728, 423, 327, 1603, 1192, 1397, 1368, 216, 2771, 202, 2822, 441, 427, 2315, 1095, 1104, 2640, 939, 954], -[2304, 262, 1834, 801, 2275, 286, 2335, 2942, 2851, 2246, 1255, 1520, 1021, 990, 3051, 2949, 2904, 1963, 0, 1581, 910, 795, 2111, 3256, 2929, 531, 136, 28, 123, 2185, 984, 1609, 965, 2068, 742, 119, 1595, 3008, 585, 1428, 400, 2525, 538, 62, 2585, 2448, 277, 2010, 1256, 1090, 3303, 1341, 2800, 1149, 833, 1578, 544, 15, 649, 2807, 2929, 1755, 2170, 3321, 200, 230, 3323, 1134, 1399, 2363, 109, 2979, 1425, 2608, 741, 2765, 887, 2764, 165, 731, 1005, 578, 1297, 259, 105, 77, 3207, 2526, 846, 1758, 1552, 596, 3167, 2723, 202, 1116, 1324, 2725, 3158, 1523, 336, 1042, 414, 1355, 166, 2971, 662, 2018, 174, 1754, 3290, 20, 1458, 719, 2436, 781, 1797, 1759, 2981, 673, 2252, 1515, 1705, 318, 1816, 134, 426, 1564, 1395, 665, 2143, 1311, 2596, 361, 2335, 1660, 1711, 2211, 13, 288, 431, 2911, 1340, 1202, 1594, 205, 1503, 692, 1459, 2459, 1149, 2902, 1524, 1298, 170, 1090, 1635, 549, 2167, 1557, 1673, 437, 2738, 2835, 1004, 1618, 566, 282, 2191, 2888, 1707, 2791, 827, 2242, 1872, 1392, 2516, 829, 1817, 480, 1163, 1400, 1224, 1727, 120, 2934, 3186, 272, 2478, 1131, 1923, 516, 1710, 452, 1418, 2533, 633, 2716, 1925, 1962, 1897, 2446, 3135, 972, 677, 511, 157, 585, 88, 1963, 2920, 2406, 1757, 724, 202, 2989, 30, 1541, 1395, 2772, 1144, 1945, 502, 2765, 1833, 1603, 483, 3286, 2403, 502, 361, 1170, 2061, 1818, 132, 2745, 888, 1152, 1965, 2589, 3064, 1221, 2634, 2914, 2760, 1594, 360, 1302, 2936, 1785, 2229, 846, 1209, 3207, 2837, 1295], -[1732, 1508, 1472, 1564, 2690, 2020, 1063, 1683, 3059, 2257, 341, 2097, 1960, 2634, 2680, 1223, 414, 3158, 1673, 2617, 2828, 2012, 778, 2605, 1170, 1119, 2624, 2699, 1294, 1474, 2531, 372, 260, 589, 1173, 776, 2827, 774, 42, 1298, 1190, 1291, 477, 1476, 1692, 956, 635, 2371, 2505, 409, 2380, 2933, 1573, 2256, 3224, 1776, 1203, 65, 2017, 955, 3190, 1453, 3226, 1254, 1568, 1790, 2185, 2714, 2984, 1664, 2394, 576, 2337, 1389, 2900, 33, 317, 2537, 1320, 44, 2510, 2721, 1528, 1742, 574, 2134, 1932, 1913, 1913, 2640, 106, 893, 2061, 2414, 3068, 2916, 286, 1577, 1743, 186, 1028, 1008, 1700, 2693, 790, 725, 2624, 2032, 2988, 2662, 366, 1926, 2331, 252, 1319, 2609, 417, 3189, 37, 1881, 715, 1880, 1865, 1715, 999, 1421, 1715, 592, 2579, 2941, 241, 2139, 1259, 1847, 182, 1395, 3187, 774, 113, 1600, 2914, 1644, 2576, 1651, 27, 837, 994, 340, 1212, 856, 355, 2627, 778, 2191, 976, 2928, 2578, 3237, 2438, 1072, 1523, 267, 1626, 759, 2718, 2606, 2037, 2156, 711, 2793, 2668, 2253, 1973, 2041, 2359, 634, 3294, 1698, 2746, 1496, 1410, 806, 1114, 2795, 1865, 716, 1521, 2974, 1401, 2716, 2752, 970, 2460, 781, 182, 1885, 1162, 3119, 1830, 1659, 2326, 3089, 2101, 1208, 1434, 960, 2832, 2584, 1417, 1407, 3034, 292, 29, 2033, 338, 2005, 92, 1660, 2218, 734, 2689, 275, 3001, 2136, 1209, 1252, 2499, 1742, 1025, 1681, 845, 1519, 121, 2231, 2696, 3273, 362, 3162, 1921, 1214, 3048, 2755, 1035, 2048, 1581, 3204, 2196, 2957, 334, 577, 3051, 2611, 2111, 2173, 583, 841]], -[[867, 2459, 154, 2063, 1119, 846, 1765, 1508, 1937, 701, 1350, 640, 884, 1092, 2013, 714, 3044, 413, 1441, 2118, 454, 631, 1334, 2704, 226, 3225, 2277, 1146, 1180, 2535, 3160, 2872, 955, 3215, 886, 838, 2297, 2854, 894, 700, 873, 2878, 2981, 319, 754, 424, 1595, 2704, 2021, 3033, 2257, 1114, 1689, 1960, 2621, 960, 1241, 2022, 960, 1863, 2691, 1909, 1072, 1674, 2215, 1403, 1226, 3141, 657, 2453, 3303, 1435, 557, 2429, 398, 512, 2956, 761, 293, 1278, 2157, 2289, 39, 711, 2458, 2286, 1941, 3024, 495, 1463, 2109, 1163, 3245, 1089, 2667, 3048, 50, 1407, 1976, 2451, 2252, 3074, 334, 538, 1693, 2198, 1061, 425, 2529, 1000, 486, 2651, 985, 1629, 2680, 2429, 399, 2383, 564, 3172, 1523, 1570, 286, 3301, 55, 1652, 2988, 2257, 1400, 1765, 3188, 735, 1280, 2502, 663, 3268, 1716, 2449, 745, 696, 1115, 1318, 3086, 1460, 25, 107, 1773, 2802, 67, 1825, 1804, 2681, 1929, 2862, 2391, 2263, 2796, 41, 1109, 2056, 2459, 369, 399, 1790, 1334, 3038, 1139, 2452, 2600, 2642, 386, 2186, 930, 295, 1388, 1527, 1763, 1280, 2408, 373, 635, 3103, 2968, 3052, 1077, 24, 660, 708, 373, 1459, 2037, 2177, 2796, 1090, 2361, 1908, 1332, 2042, 231, 292, 1150, 3125, 387, 2885, 2637, 3040, 32, 2758, 788, 1011, 814, 2970, 2199, 3164, 1817, 912, 939, 1584, 2101, 389, 1490, 2396, 862, 1985, 2915, 1481, 360, 3100, 347, 3054, 697, 1431, 1456, 1699, 1569, 1110, 952, 3262, 8, 1944, 1744, 830, 120, 2073, 2652, 3023, 1639, 1857, 2185, 1525, 2457, 1910, 3251, 2908, 931, 1854], -[1874, 1090, 3206, 1005, 475, 666, 913, 3174, 1808, 1376, 667, 1889, 1375, 3187, 1036, 3131, 2664, 2013, 3310, 2979, 2962, 1128, 1187, 1418, 1050, 1331, 3194, 2413, 2426, 706, 1413, 422, 1899, 2934, 1401, 1515, 1639, 3133, 2137, 2153, 2740, 1582, 744, 3322, 1018, 433, 1769, 2595, 520, 2684, 1155, 723, 2458, 608, 789, 3006, 1109, 1821, 968, 656, 2300, 2276, 1050, 114, 2141, 926, 1235, 152, 104, 1928, 401, 3282, 1368, 971, 2620, 835, 1520, 3124, 2728, 1842, 1710, 50, 398, 2059, 2479, 1755, 622, 977, 734, 2277, 2071, 2450, 129, 2231, 1302, 2176, 2567, 2627, 699, 381, 241, 1124, 2468, 1302, 645, 2050, 1417, 678, 3235, 950, 2007, 1294, 1036, 451, 2822, 968, 2924, 2703, 2804, 610, 2423, 1824, 652, 2482, 1334, 419, 81, 715, 2701, 985, 1572, 641, 1234, 1484, 1282, 296, 1080, 2109, 220, 2492, 2611, 2851, 3133, 1721, 1680, 2433, 204, 2611, 2846, 63, 1690, 1667, 1032, 2461, 627, 1383, 2451, 2928, 3084, 863, 134, 2984, 2133, 2442, 161, 1633, 86, 1255, 2963, 2355, 849, 206, 687, 1150, 1171, 53, 1941, 1195, 2811, 1982, 2038, 736, 2207, 3102, 1497, 328, 1951, 1674, 2774, 1346, 1969, 2278, 295, 2054, 663, 2151, 97, 1712, 2390, 2055, 244, 3152, 1314, 2546, 58, 2298, 588, 2885, 2739, 2158, 1, 2620, 2211, 83, 1974, 2234, 3068, 2247, 1295, 2540, 2471, 1452, 1382, 3210, 335, 1623, 1584, 1249, 954, 88, 1171, 2163, 851, 1195, 2071, 1269, 121, 2415, 1799, 3016, 917, 1659, 158, 231, 416, 117, 2562, 12, 88, 1433, 879, 1166, 884, 3133, 2147, 2039], -[2271, 230, 1006, 3028, 1294, 724, 986, 579, 956, 1950, 413, 1686, 281, 1401, 3037, 892, 392, 2394, 2259, 3083, 2181, 2601, 1089, 2263, 2088, 1850, 1037, 84, 488, 1919, 1917, 218, 2996, 1822, 104, 700, 1887, 1139, 2333, 1935, 2619, 223, 2036, 997, 583, 861, 1682, 3171, 2192, 1862, 847, 2573, 1319, 571, 1270, 2048, 2464, 89, 2028, 1239, 1324, 155, 3142, 920, 552, 1401, 3318, 1764, 2750, 445, 2111, 374, 2540, 1644, 2934, 2757, 2848, 1616, 2205, 537, 102, 2501, 591, 514, 2559, 881, 21, 3060, 1093, 1730, 2068, 1055, 2962, 1668, 3314, 1264, 2169, 2915, 1829, 1282, 499, 3241, 1663, 2318, 2401, 1208, 314, 1495, 2705, 1971, 766, 596, 2543, 943, 1701, 2866, 903, 2611, 2997, 1646, 1369, 1593, 817, 2368, 1955, 398, 2318, 231, 2032, 417, 395, 1175, 1298, 1627, 2565, 728, 1643, 310, 2896, 2175, 2508, 968, 1289, 1346, 3046, 765, 3027, 810, 1298, 2880, 2969, 2490, 846, 2373, 340, 624, 1996, 864, 2973, 1603, 2299, 2633, 787, 1015, 1102, 2182, 2817, 1238, 1610, 2315, 28, 546, 804, 1846, 1120, 292, 1022, 2511, 1135, 2848, 3247, 1596, 2510, 451, 115, 797, 570, 567, 2795, 111, 1891, 1183, 827, 1252, 1452, 2230, 1682, 2314, 3140, 965, 2515, 1540, 2546, 2178, 502, 749, 3109, 480, 2765, 1317, 1947, 1016, 899, 1811, 517, 431, 1419, 464, 620, 880, 486, 901, 3101, 1710, 3167, 1540, 3015, 706, 2999, 31, 1862, 1052, 2016, 1410, 2746, 1305, 812, 2694, 2056, 1777, 1149, 1817, 134, 144, 967, 4, 3142, 1919, 281, 2680, 2465, 2122, 1654, 2006, 3153, 2197], -[376, 1719, 1024, 2535, 9, 310, 820, 1549, 681, 558, 1868, 1619, 3129, 667, 1773, 2251, 2282, 597, 3153, 965, 3252, 570, 986, 1843, 2876, 1852, 330, 2692, 1698, 1761, 2771, 473, 3008, 193, 1916, 822, 378, 11, 1469, 2309, 1592, 2415, 514, 1417, 2205, 181, 2936, 2740, 3181, 2936, 196, 1409, 237, 1263, 2701, 872, 1810, 3225, 754, 2575, 374, 2608, 952, 226, 1737, 2540, 1567, 55, 2133, 820, 1313, 1181, 1593, 1492, 2597, 1760, 214, 308, 1934, 3224, 1837, 1585, 777, 3071, 1828, 1507, 117, 222, 2348, 416, 76, 3307, 3211, 3220, 1361, 2724, 898, 2848, 2291, 3128, 122, 666, 2519, 1732, 1851, 130, 2713, 1893, 3178, 3038, 1228, 1085, 50, 2596, 1101, 2151, 598, 2753, 1947, 1262, 2542, 530, 57, 2533, 1050, 123, 2318, 577, 2406, 2980, 847, 3213, 1181, 2454, 2843, 631, 3154, 288, 2088, 3208, 744, 2912, 1155, 1996, 1470, 1984, 2877, 3158, 144, 648, 1623, 1088, 2624, 1616, 778, 453, 1983, 989, 3066, 1210, 1142, 877, 791, 1308, 1700, 612, 540, 3147, 2147, 3288, 1416, 2479, 2554, 2494, 2050, 2286, 321, 1621, 487, 1002, 919, 805, 1467, 2796, 2339, 2340, 2847, 554, 2446, 611, 220, 925, 80, 320, 1630, 501, 426, 2344, 3178, 423, 1907, 2347, 662, 2479, 1059, 2696, 2538, 1739, 2114, 3253, 1966, 1467, 748, 985, 2820, 1503, 808, 637, 790, 2782, 2169, 1463, 1904, 311, 1458, 3173, 2455, 2436, 1398, 1587, 458, 593, 101, 2641, 634, 3138, 980, 277, 2731, 904, 1481, 83, 2503, 1800, 3074, 1891, 3035, 3157, 1500, 173, 1, 494, 2493, 144, 3172, 534]], -[[3256, 1412, 1157, 2871, 2908, 2935, 2445, 2517, 2735, 1116, 1788, 3322, 2762, 3222, 2304, 292, 903, 2013, 3311, 3298, 970, 2952, 861, 1193, 2507, 1395, 3081, 2610, 1985, 86, 2877, 1762, 2574, 936, 3218, 774, 1892, 642, 717, 1856, 2079, 527, 536, 311, 414, 2034, 997, 705, 1804, 1077, 2754, 2377, 100, 2461, 3083, 2501, 2432, 3044, 2423, 1772, 142, 2924, 2229, 762, 2759, 935, 2169, 1635, 2681, 2744, 1428, 65, 1416, 1752, 796, 276, 1508, 94, 601, 2459, 1748, 2994, 786, 428, 3036, 2504, 723, 782, 1581, 2046, 713, 223, 3094, 2883, 1874, 418, 1198, 947, 557, 2059, 2430, 372, 2942, 1938, 1922, 3085, 795, 2261, 145, 1857, 627, 679, 1909, 1955, 529, 1922, 2364, 226, 1616, 738, 1419, 674, 569, 1850, 1690, 2288, 2886, 2360, 3230, 2850, 2808, 2531, 2421, 2109, 2868, 319, 320, 2518, 1619, 3292, 3179, 2573, 3243, 1720, 1469, 1968, 2157, 857, 1025, 3282, 3259, 2696, 2710, 3124, 982, 859, 2631, 2495, 2897, 2786, 940, 3092, 672, 2539, 3243, 1079, 2257, 434, 2103, 1895, 42, 2653, 3058, 1442, 500, 1732, 298, 1094, 127, 558, 2647, 2609, 1596, 1400, 3142, 1634, 1668, 1326, 1682, 2095, 2939, 2326, 1460, 2679, 122, 2549, 2562, 182, 425, 2006, 82, 2252, 2949, 2174, 2420, 1099, 1024, 424, 2839, 2363, 1480, 2945, 684, 2461, 1981, 2580, 1770, 17, 3251, 1566, 441, 1348, 61, 3189, 2123, 2455, 740, 258, 2773, 11, 1548, 2899, 22, 592, 200, 778, 205, 400, 209, 1526, 2336, 1572, 2424, 537, 3232, 1320, 1035, 1657, 2100, 2873, 125, 1719, 2029, 2009, 1317, 2534], -[41, 2034, 256, 1285, 2151, 2067, 834, 2772, 2864, 2380, 3041, 650, 2684, 1687, 2070, 664, 1396, 54, 1558, 1858, 1655, 2529, 731, 171, 1066, 2956, 769, 1889, 2023, 2924, 3020, 3059, 2573, 679, 307, 2741, 244, 576, 774, 683, 1923, 965, 265, 948, 1048, 144, 1044, 1889, 2668, 91, 2877, 982, 1510, 2511, 2868, 1421, 2853, 360, 1066, 2800, 178, 293, 492, 1584, 2456, 2067, 3202, 552, 1032, 2693, 2245, 2361, 3181, 1015, 2903, 529, 3148, 289, 2527, 2146, 537, 3096, 1802, 1849, 1589, 520, 2254, 1125, 1782, 2380, 1335, 1610, 93, 3182, 1628, 82, 3058, 448, 2921, 2190, 476, 35, 1979, 1995, 1330, 1529, 922, 2558, 330, 439, 2626, 1162, 430, 682, 2990, 2644, 2288, 2702, 777, 357, 1091, 3083, 2344, 2753, 972, 2831, 1638, 2527, 2257, 614, 3029, 320, 1685, 1402, 2337, 1816, 498, 2384, 2627, 2739, 1811, 2798, 1517, 3219, 945, 2048, 951, 3043, 767, 366, 2951, 2092, 2022, 1812, 2132, 775, 3075, 3123, 1446, 1355, 1476, 1346, 3200, 3224, 2416, 1049, 1429, 2278, 260, 1510, 2027, 555, 3284, 1502, 1628, 829, 556, 332, 928, 1065, 542, 1527, 1000, 1154, 3271, 1168, 274, 766, 411, 2841, 583, 387, 1050, 1189, 829, 1996, 361, 267, 826, 1635, 647, 3056, 1728, 538, 960, 1568, 3116, 264, 836, 3168, 3144, 2675, 75, 1145, 1467, 962, 2590, 2501, 149, 619, 2218, 1831, 2576, 2960, 3008, 1772, 1341, 2024, 2952, 821, 2780, 3257, 1993, 2869, 1324, 1508, 1002, 1698, 1999, 2538, 2299, 2023, 2695, 3327, 2251, 2527, 262, 3018, 789, 986, 2343, 1497, 1024, 2006, 1576, 228], -[1264, 1853, 982, 2897, 1684, 690, 1172, 1929, 1182, 3159, 3154, 1368, 1617, 1250, 612, 93, 768, 2698, 569, 1787, 3097, 2310, 1119, 1412, 307, 2318, 85, 307, 2429, 1069, 3238, 920, 1213, 1841, 1752, 1767, 2365, 676, 2149, 503, 2194, 2359, 890, 1510, 1918, 3212, 1859, 150, 2758, 262, 2057, 3228, 1138, 2854, 1227, 851, 3328, 1438, 1840, 1705, 492, 276, 2365, 1427, 3235, 982, 882, 2752, 894, 1869, 9, 2275, 2468, 1090, 2538, 899, 1845, 2263, 1970, 1521, 1495, 2202, 1582, 222, 1566, 2721, 2368, 1968, 3277, 1674, 1789, 1305, 295, 1487, 501, 1329, 478, 1755, 33, 3178, 2591, 1531, 564, 2475, 2216, 2993, 673, 2616, 2858, 59, 3164, 383, 1217, 3251, 620, 2224, 2821, 1422, 3075, 1128, 2659, 687, 288, 1659, 115, 56, 2523, 242, 2252, 3238, 524, 2490, 2194, 699, 3301, 1566, 2334, 1649, 1198, 3071, 2620, 457, 2365, 795, 335, 1117, 1779, 689, 2771, 46, 1565, 585, 3255, 667, 2094, 1608, 166, 2541, 2497, 1421, 1822, 1990, 229, 2733, 2473, 2004, 1479, 245, 3230, 1609, 2243, 2167, 1504, 2946, 1739, 644, 2403, 2029, 537, 2803, 1610, 593, 2693, 2051, 3027, 314, 737, 697, 166, 3165, 1824, 3216, 64, 1534, 3184, 1012, 1101, 1931, 3298, 411, 3007, 1690, 901, 2191, 739, 953, 2270, 1634, 2873, 1871, 1789, 2677, 1546, 3046, 1429, 469, 1386, 2222, 2229, 1022, 995, 759, 1966, 581, 2820, 973, 416, 2070, 2039, 23, 3164, 1936, 997, 359, 2210, 3327, 3170, 1512, 2912, 2714, 1959, 1431, 1429, 862, 2424, 1198, 2660, 895, 1663, 2420, 2969, 1724, 2479, 2261, 855, 577], -[887, 1074, 3018, 81, 1837, 539, 1344, 2879, 2345, 2253, 1725, 1117, 2547, 1307, 3039, 644, 569, 1530, 3152, 3203, 2617, 594, 100, 3251, 1692, 1615, 1624, 211, 3016, 1711, 2315, 2555, 2174, 2397, 1888, 301, 1863, 2502, 3111, 990, 2551, 1333, 3220, 3059, 334, 920, 742, 860, 977, 1518, 432, 1884, 3056, 1457, 2237, 2070, 647, 2503, 1133, 48, 1923, 135, 3110, 3301, 1045, 752, 2466, 3055, 6, 505, 2015, 2858, 2846, 2470, 2887, 1147, 817, 277, 71, 26, 2017, 104, 3231, 2363, 1968, 2968, 3052, 2882, 1247, 2945, 3142, 3090, 2552, 3232, 1585, 863, 793, 808, 944, 514, 2259, 343, 452, 3165, 2686, 1413, 412, 59, 3274, 1230, 2528, 2772, 1233, 2672, 2127, 773, 864, 1860, 1898, 1931, 838, 162, 673, 3152, 1994, 2406, 2283, 2076, 3008, 615, 112, 1365, 2030, 3308, 1574, 2361, 93, 1701, 2380, 1890, 3152, 1971, 1573, 2460, 191, 2241, 674, 3111, 1657, 1557, 982, 1777, 2589, 633, 499, 1273, 2809, 533, 1732, 1129, 563, 33, 1882, 371, 2383, 423, 1643, 376, 1286, 2727, 17, 1822, 2652, 1239, 2159, 2859, 2359, 3048, 2656, 3184, 940, 1203, 719, 88, 1272, 483, 717, 789, 238, 1387, 1330, 1999, 2229, 1214, 1673, 1435, 3057, 1092, 1906, 2316, 960, 830, 1503, 1066, 1051, 340, 1598, 681, 1459, 970, 1421, 3097, 2004, 3258, 2411, 627, 1745, 585, 1316, 649, 1374, 2625, 2042, 2801, 793, 1156, 2998, 3026, 1532, 1216, 1831, 1077, 2314, 2736, 1672, 2440, 819, 2769, 751, 2337, 2606, 1808, 108, 3200, 2220, 1366, 778, 406, 847, 2422, 570, 3207, 705, 1727, 2319, 1485]], -[[2956, 2744, 2646, 1052, 2049, 587, 782, 1688, 47, 347, 1187, 2560, 3010, 2052, 580, 2356, 1623, 98, 1400, 960, 2216, 1701, 667, 3230, 474, 3145, 2220, 3283, 3025, 2462, 2293, 2593, 1746, 444, 3186, 2338, 1372, 32, 598, 1387, 169, 1435, 2638, 1518, 1094, 2023, 2598, 2795, 1853, 273, 241, 1158, 1844, 2151, 775, 1477, 2683, 2007, 3143, 562, 3002, 2787, 2843, 887, 2685, 2994, 903, 2383, 1956, 2741, 870, 3128, 1322, 658, 2565, 300, 2834, 2250, 194, 2023, 2595, 2220, 2241, 1336, 661, 1583, 2866, 437, 2487, 2439, 2826, 491, 1575, 1139, 1499, 2996, 2635, 1122, 2239, 237, 2416, 2681, 384, 2224, 3088, 2225, 2121, 1815, 916, 3294, 1581, 2158, 999, 2320, 2150, 1126, 681, 1987, 1384, 641, 3062, 1519, 1166, 2074, 859, 2588, 616, 1220, 1586, 450, 1537, 1400, 2887, 3079, 2944, 1810, 2175, 2691, 1316, 332, 73, 1421, 55, 2032, 254, 1352, 2605, 637, 649, 3220, 1217, 2319, 3061, 535, 2298, 585, 3132, 1129, 1178, 2871, 81, 1808, 2410, 2987, 1663, 1022, 2431, 3049, 625, 1888, 2510, 1925, 900, 2652, 97, 1084, 374, 250, 2444, 3079, 2087, 507, 3115, 1133, 977, 565, 1115, 107, 3030, 2384, 836, 2536, 90, 2678, 518, 1892, 2408, 167, 1662, 320, 2116, 2375, 859, 2159, 2706, 1424, 319, 1316, 2517, 2150, 577, 407, 168, 910, 107, 535, 249, 3112, 388, 839, 510, 2423, 1769, 2288, 2205, 347, 1782, 1000, 2316, 1271, 728, 279, 3327, 542, 1500, 2144, 2622, 1700, 440, 217, 1232, 302, 1187, 206, 1090, 2052, 1927, 407, 527, 3324, 1627, 3151, 1080, 2646, 1280, 2663], -[1938, 2889, 762, 3213, 3128, 3238, 3240, 141, 978, 3260, 3073, 2367, 739, 2139, 2363, 1280, 128, 1091, 2084, 52, 3113, 841, 488, 2846, 1234, 940, 981, 1561, 2118, 1290, 2368, 2210, 1683, 1659, 1208, 1072, 1810, 1917, 886, 1873, 1276, 3101, 796, 1854, 613, 814, 1502, 2709, 1534, 357, 1250, 430, 190, 491, 2734, 1635, 1683, 1128, 567, 1347, 592, 1075, 249, 3011, 645, 1917, 2360, 2703, 537, 458, 3076, 1970, 2132, 2019, 2729, 1581, 362, 3230, 2948, 3012, 2422, 974, 440, 2249, 816, 3290, 2347, 2334, 3037, 1572, 1581, 2208, 561, 553, 1830, 1234, 3249, 1115, 838, 36, 2338, 2738, 2080, 3249, 2055, 844, 1813, 3058, 1166, 1112, 2769, 1860, 2391, 2632, 1583, 1527, 1092, 529, 2270, 382, 761, 3053, 2024, 1236, 2909, 3210, 2843, 603, 2655, 2468, 1039, 1251, 1161, 918, 2686, 451, 985, 3229, 2735, 974, 819, 1687, 2820, 61, 743, 887, 2358, 2664, 2544, 1465, 2609, 3175, 1414, 755, 2810, 3030, 1223, 774, 2454, 2843, 2800, 1722, 2966, 1738, 729, 1163, 485, 953, 2028, 1074, 434, 153, 97, 2185, 951, 1683, 1366, 2291, 907, 605, 1722, 1373, 1197, 571, 2974, 2349, 2832, 1674, 2740, 151, 3000, 2163, 727, 1317, 2949, 3034, 2810, 1760, 2929, 3317, 1614, 1390, 1039, 3143, 1137, 2475, 3018, 2063, 2717, 3270, 1995, 224, 2902, 2393, 21, 332, 2490, 1538, 3028, 2626, 2144, 3170, 2540, 1635, 2423, 214, 3165, 3316, 2596, 974, 2135, 804, 1282, 714, 904, 2408, 1086, 374, 722, 2173, 3248, 3161, 600, 963, 946, 327, 868, 1306, 71, 566, 1891, 2864, 100, 970, 536, 1156], -[1079, 835, 3192, 2207, 1405, 2431, 2088, 2296, 1745, 1733, 62, 3022, 2033, 1702, 2802, 1572, 1967, 2146, 88, 1099, 3180, 2543, 3281, 415, 2252, 1666, 2565, 1977, 1484, 2383, 191, 2587, 711, 975, 2854, 474, 1083, 2241, 1488, 1336, 473, 2322, 2189, 2977, 73, 1623, 2933, 3089, 1499, 1916, 1261, 1038, 1780, 1375, 417, 2103, 3154, 3212, 1661, 1024, 3249, 2405, 2613, 1845, 769, 1334, 438, 2633, 2698, 803, 164, 2912, 2342, 834, 710, 543, 2478, 1015, 806, 913, 2278, 1453, 543, 1093, 375, 2411, 2800, 582, 2010, 886, 3246, 2816, 96, 2696, 3312, 551, 73, 2224, 1658, 349, 1595, 1965, 9, 814, 1678, 3034, 1168, 1472, 2642, 840, 148, 2025, 1438, 331, 1622, 475, 775, 3311, 466, 21, 941, 1834, 205, 710, 859, 2954, 915, 143, 246, 71, 3325, 1116, 3020, 628, 2015, 637, 2070, 1517, 1728, 2834, 1785, 3001, 2437, 2904, 1174, 1740, 1339, 1089, 1185, 2107, 814, 2432, 1553, 2091, 880, 2052, 1886, 2821, 1352, 2545, 2699, 3137, 842, 2402, 186, 764, 1538, 1857, 1140, 906, 1861, 2120, 463, 854, 58, 368, 1514, 228, 2193, 197, 1535, 2356, 3140, 2935, 376, 1160, 2248, 275, 1532, 1900, 2296, 2437, 2794, 178, 249, 216, 2806, 2043, 993, 1858, 1552, 372, 108, 2362, 2346, 1136, 675, 2095, 1456, 3064, 2680, 2244, 136, 920, 1214, 380, 2802, 1041, 693, 2446, 951, 2764, 355, 2531, 707, 641, 2519, 3144, 674, 1104, 509, 3150, 150, 1889, 858, 70, 1545, 712, 4, 1827, 2627, 1988, 3120, 1808, 2328, 1049, 3071, 455, 3278, 1876, 1446, 1090, 2901, 2976, 1448, 1925], -[2192, 2394, 3045, 1041, 2255, 2164, 2168, 1421, 708, 1046, 2571, 2080, 391, 2271, 1998, 772, 251, 1508, 1377, 1610, 1582, 169, 1903, 1253, 2187, 2718, 2638, 2088, 3253, 332, 2647, 2457, 1904, 2140, 1655, 2071, 2489, 3115, 861, 1395, 219, 49, 67, 1335, 983, 820, 1354, 1304, 2208, 1907, 2364, 2977, 885, 2566, 1014, 1253, 414, 1961, 2695, 426, 182, 1505, 1354, 2693, 2580, 3183, 253, 3308, 895, 1761, 983, 1709, 40, 2188, 216, 2172, 1369, 1639, 109, 1916, 718, 177, 1754, 1518, 2487, 1611, 670, 297, 123, 159, 710, 2589, 296, 2863, 1572, 2895, 312, 2306, 2473, 44, 3157, 1761, 1416, 1158, 887, 1745, 1762, 272, 560, 2794, 3228, 373, 715, 2745, 645, 2513, 2256, 903, 1928, 1603, 1365, 110, 2754, 2264, 3062, 3091, 3099, 3234, 166, 49, 459, 483, 1835, 2884, 395, 802, 2690, 1005, 2556, 1318, 1428, 790, 1200, 2239, 430, 1310, 952, 2798, 1767, 3266, 2216, 368, 1127, 899, 2853, 1394, 2395, 561, 2213, 782, 1498, 1533, 364, 2335, 1646, 1239, 931, 2893, 2365, 3123, 346, 1194, 868, 115, 103, 1420, 1851, 938, 1192, 1571, 2394, 2010, 2475, 1281, 124, 1042, 2064, 1391, 3059, 2824, 815, 29, 2758, 2435, 1058, 968, 1324, 1141, 3231, 2260, 1515, 2698, 2040, 1948, 986, 2474, 2428, 1270, 3133, 1347, 1570, 3222, 2877, 2574, 712, 1697, 58, 2862, 2634, 631, 2186, 1915, 1702, 1788, 1987, 3289, 3184, 2398, 726, 775, 1612, 1184, 1064, 3171, 2943, 2840, 3306, 3306, 430, 1675, 263, 956, 7, 2571, 1364, 1553, 124, 2442, 498, 2560, 2977, 944, 10, 268, 1759, 1297]]] - -r: [[1, 3327, 1, 0, 0, 1, 0, 0, 1, 2, 0, 3328, 2, 1, 0, 1, 2, 1, 1, 1, 0, 0, 3328, 1, 1, 0, 3328, 0, 0, 3328, 0, 3327, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 0, 2, 0, 0, 3327, 1, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 1, 3328, 1, 1, 1, 0, 1, 3328, 0, 1, 0, 0, 1, 3328, 3328, 3328, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 0, 1, 0, 3328, 1, 3328, 3327, 2, 3328, 0, 0, 0, 3328, 2, 3328, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 3327, 3328, 0, 3328, 2, 3328, 2, 0, 1, 1, 1, 3327, 0, 3328, 1, 1, 1, 1, 3327, 0, 1, 0, 0, 0, 1, 1, 0, 3328, 1, 1, 1, 1, 1, 0, 1, 3328, 0, 3328, 1, 2, 0, 3328, 3328, 1, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 3327, 0, 1, 1, 1, 3327, 1, 3328, 3328, 3328, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3328, 2, 2, 1, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 2, 3327, 2, 2, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 3328, 1, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 3327, 0, 0, 0, 3328, 0, 3328, 3327, 3327, 1, 0], -[0, 0, 1, 1, 0, 1, 0, 3328, 3328, 1, 3327, 3328, 0, 0, 1, 0, 3328, 3327, 3328, 3328, 1, 1, 0, 0, 3327, 1, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 2, 1, 3328, 3327, 3327, 0, 1, 3327, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 3328, 1, 3328, 0, 3328, 3328, 0, 0, 0, 1, 1, 0, 2, 3328, 1, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 0, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 3328, 1, 0, 1, 0, 1, 3328, 0, 0, 0, 0, 1, 0, 1, 3328, 3328, 3328, 3327, 0, 3328, 0, 3328, 0, 3327, 1, 0, 3328, 0, 1, 0, 0, 0, 1, 3327, 0, 0, 1, 3328, 0, 1, 3327, 1, 3328, 2, 3328, 1, 0, 2, 3328, 1, 0, 3328, 1, 1, 0, 3328, 2, 3328, 1, 0, 1, 3328, 3328, 0, 0, 1, 1, 0, 1, 3328, 0, 2, 1, 3328, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, 1, 1, 3328, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 3328, 3328, 0, 0, 1, 3327, 3328, 1, 2, 2, 0, 0, 0, 1, 3328, 1, 0], -[2, 1, 3328, 3327, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 3328, 3327, 0, 1, 0, 3328, 1, 1, 0, 2, 0, 3327, 3328, 1, 2, 3328, 3328, 1, 1, 1, 3328, 1, 0, 0, 0, 0, 0, 2, 3327, 3327, 0, 1, 0, 1, 1, 1, 1, 3328, 0, 0, 3328, 2, 0, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 1, 3328, 0, 1, 2, 0, 0, 3328, 1, 0, 3328, 1, 2, 1, 0, 3327, 1, 1, 1, 3327, 0, 2, 3328, 0, 0, 3327, 0, 0, 1, 1, 3328, 3328, 0, 0, 3327, 3327, 1, 0, 2, 0, 3327, 0, 3328, 3327, 3328, 0, 1, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 0, 2, 1, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 2, 1, 1, 0, 1, 0, 3328, 0, 3327, 2, 3328, 2, 2, 3328, 3328, 0, 1, 1, 1, 1, 3328, 3328, 1, 3327, 0, 2, 0, 0, 0, 3327, 0, 0, 3328, 3328, 2, 0, 0, 3327, 3328, 0, 0, 1, 0, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 1, 1, 3328, 0, 0, 0, 3327, 1, 3328, 3327, 3328, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 1, 0, 0, 3328, 0], -[0, 0, 0, 0, 3328, 3328, 1, 3328, 3328, 1, 3328, 3328, 3328, 3328, 1, 0, 1, 3328, 2, 0, 0, 1, 3328, 1, 0, 3327, 2, 3328, 2, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 3327, 1, 2, 0, 1, 2, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 0, 1, 3328, 3328, 2, 0, 3328, 2, 0, 0, 2, 3327, 0, 0, 3327, 3328, 0, 0, 0, 0, 3327, 1, 0, 3327, 3328, 2, 3328, 3327, 1, 3328, 0, 3328, 0, 1, 1, 3328, 2, 1, 1, 3327, 0, 1, 0, 0, 0, 3328, 3328, 3327, 3328, 0, 1, 1, 1, 3327, 2, 1, 3328, 0, 3328, 1, 0, 2, 3328, 0, 3328, 0, 3328, 3327, 3327, 0, 0, 0, 0, 3328, 0, 1, 0, 0, 3328, 1, 0, 3328, 3327, 3328, 3328, 3328, 1, 2, 3328, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 0, 0, 3327, 0, 0, 3328, 2, 1, 3328, 1, 1, 0, 3327, 3328, 3328, 1, 0, 3328, 1, 0, 3328, 1, 0, 0, 0, 1, 3328, 0, 3328, 0, 1, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 0, 3328, 0, 1, 0, 1, 2, 3328, 3328, 0, 1, 3328, 3327, 2, 0, 1, 1, 2, 1, 0, 0, 0, 0, 0, 1, 3328, 0, 1, 3328, 2, 0, 0, 1, 2, 1, 3327, 2, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 0, 3328, 0, 1, 0, 3328, 2, 1, 0, 3327, 3328, 0, 0, 2]] - -e1: [[3327, 0, 3328, 0, 0, 0, 0, 2, 3327, 0, 3328, 3328, 0, 0, 0, 3327, 1, 0, 1, 0, 2, 3328, 1, 0, 3328, 1, 3328, 1, 1, 3328, 0, 3328, 1, 3327, 3328, 0, 1, 1, 1, 0, 2, 3328, 2, 3328, 1, 3328, 2, 2, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3327, 1, 1, 0, 0, 1, 1, 3328, 0, 3328, 3327, 0, 2, 1, 1, 3328, 1, 1, 3328, 1, 0, 1, 1, 0, 0, 0, 0, 3327, 1, 3328, 0, 1, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 1, 3327, 1, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 0, 1, 1, 1, 2, 1, 3328, 3327, 3328, 0, 0, 1, 0, 0, 3328, 1, 0, 3328, 3328, 2, 3328, 0, 1, 3327, 1, 3328, 3328, 3328, 2, 3328, 3328, 2, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 3327, 3328, 2, 0, 0, 0, 0, 3328, 3328, 1, 0, 0, 0, 2, 3327, 0, 1, 1, 3328, 0, 3327, 1, 1, 3327, 1, 0, 1, 0, 0, 3328, 0, 1, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 2, 0, 2, 1, 3327, 0, 0, 0, 0, 0, 1, 3328, 0, 3327, 3327, 0, 3328, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 0, 3328, 0], -[1, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 0, 1, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 2, 3328, 0, 1, 0, 2, 0, 1, 0, 1, 3327, 0, 1, 1, 0, 3328, 1, 3328, 1, 3327, 0, 1, 3327, 3328, 3328, 1, 2, 1, 1, 1, 3328, 3328, 3327, 1, 0, 0, 3327, 3327, 0, 3328, 0, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 0, 1, 2, 3328, 3327, 2, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 3327, 0, 3328, 1, 0, 3328, 3327, 1, 0, 0, 2, 1, 0, 0, 1, 3327, 1, 2, 3328, 1, 3328, 1, 0, 0, 0, 3328, 0, 3327, 0, 3328, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 2, 3328, 1, 2, 3328, 3328, 1, 3328, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 3328, 3328, 1, 1, 0, 3328, 3328, 3328, 3328, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 2, 0, 3328, 1, 3327, 0, 3328, 3328, 0, 3328, 0, 2, 3328, 0, 3328, 1, 0, 1, 0, 3328, 3328, 2, 2, 0, 3327, 1, 2, 0, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 0, 1, 3327, 0, 1, 0, 1, 0, 0, 3328, 3328, 3327, 0, 3328, 2, 1, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 0, 2, 1, 3328, 3328, 0, 0, 1, 0, 0, 0, 1], -[2, 3328, 3328, 0, 0, 1, 3328, 3328, 3328, 0, 3328, 2, 1, 1, 0, 0, 1, 0, 3328, 1, 0, 0, 0, 1, 2, 2, 3328, 1, 1, 1, 0, 0, 3328, 1, 0, 3328, 0, 3328, 3328, 1, 1, 0, 1, 1, 0, 3328, 2, 0, 0, 0, 1, 3328, 0, 3328, 0, 3327, 0, 3327, 0, 1, 1, 3327, 3328, 3327, 1, 0, 1, 1, 0, 2, 1, 0, 3328, 1, 0, 3328, 3328, 0, 0, 3327, 2, 3327, 3328, 0, 0, 0, 2, 1, 3328, 3328, 3328, 3328, 3328, 0, 0, 2, 2, 1, 3328, 0, 0, 1, 1, 0, 0, 0, 2, 1, 0, 3328, 0, 0, 1, 3328, 1, 3328, 0, 1, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3328, 0, 1, 1, 0, 0, 3328, 2, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 3328, 3328, 1, 1, 0, 0, 0, 3328, 0, 3328, 2, 0, 3328, 3328, 3328, 0, 1, 1, 0, 2, 0, 1, 3328, 0, 1, 2, 3328, 1, 1, 3328, 1, 0, 3328, 0, 0, 1, 3328, 1, 0, 1, 0, 1, 3328, 1, 3328, 1, 3328, 0, 3328, 1, 1, 2, 3328, 0, 3328, 1, 1, 1, 3328, 0, 0, 3327, 3328, 3328, 2, 3328, 2, 1, 0, 2, 0, 0, 0, 0, 1, 0, 0, 3328, 0, 3328, 0, 1, 3327, 0, 0, 1, 1, 3327, 0, 0, 1, 1, 0, 0, 1, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 0, 1, 0, 0, 2, 3327, 2, 3328], -[1, 1, 0, 3328, 1, 2, 3328, 3327, 0, 0, 0, 3327, 3328, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 0, 0, 0, 0, 0, 3328, 0, 2, 0, 0, 1, 3328, 0, 1, 3328, 0, 3328, 1, 3328, 1, 1, 2, 3328, 1, 0, 2, 2, 0, 3327, 3327, 3328, 2, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 2, 1, 0, 2, 2, 0, 0, 0, 1, 1, 0, 0, 3328, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 0, 1, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 3327, 0, 3327, 2, 0, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 3328, 0, 0, 1, 0, 0, 3328, 3328, 0, 1, 2, 3328, 3328, 2, 0, 3328, 1, 1, 0, 0, 1, 3328, 0, 3327, 1, 3328, 1, 3328, 0, 1, 1, 0, 1, 1, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 1, 0, 2, 1, 1, 2, 1, 1, 0, 0, 0, 1, 3328, 1, 1, 1, 2, 0, 0, 3327, 0, 0, 0, 1, 3327, 0, 2, 3327, 3328, 1, 0, 3328, 3328, 3327, 0, 2, 0, 0, 0, 1, 3328, 1, 3328, 1, 1, 2, 3328, 0, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 3327, 0, 3328, 3328, 0, 3328, 3328, 0, 1, 3328, 0, 1, 0, 1, 0, 3327, 3328, 1, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 1, 2, 2, 2, 0]] - -e2: [3328, 3328, 0, 2, 0, 0, 0, 0, 3327, 3328, 1, 1, 0, 3328, 2, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 3328, 2, 1, 0, 3328, 3328, 1, 2, 3328, 3328, 1, 0, 3328, 1, 2, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3327, 3327, 0, 0, 0, 1, 3328, 0, 3328, 1, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 0, 2, 1, 1, 3327, 2, 0, 0, 2, 3328, 3328, 0, 3328, 3327, 1, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 3328, 0, 2, 1, 0, 1, 3328, 3328, 0, 3328, 3328, 3327, 3328, 0, 3328, 0, 1, 3328, 3328, 1, 3328, 1, 0, 3328, 3328, 3328, 1, 0, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 2, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 2, 3328, 3328, 1, 3328, 0, 0, 2, 2, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 0, 1, 0, 3328, 3328, 3328, 3328, 3328, 0, 1, 1, 3327, 3328, 3328, 2, 0, 0, 3328, 0, 1, 3328, 0, 1, 3327, 0, 0, 3328, 1, 0, 0, 3328, 3327, 3328, 0, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1, 1, 3328, 0, 1, 1, 1, 0, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 0, 1, 3328, 3328, 3327, 3328, 0, 0, 3328, 0, 1, 1] -rHat: [[1895, 1256, 3, 1874, 570, 1626, 984, 2228, 1975, 1271, 1874, 3151, 2407, 1664, 829, 837, 2011, 1836, 354, 22, 2574, 242, 1950, 2861, 422, 605, 2908, 1886, 3089, 1720, 850, 1391, 1683, 553, 60, 1104, 141, 2392, 2513, 1034, 1697, 3126, 2575, 990, 585, 2978, 2867, 906, 1388, 1830, 727, 569, 1339, 3, 35, 2751, 1124, 950, 1884, 1833, 894, 462, 382, 1856, 1831, 18, 1098, 664, 50, 2252, 1435, 1571, 1038, 456, 914, 1621, 2777, 485, 1985, 2933, 2707, 1244, 2281, 232, 3129, 3160, 2071, 2029, 38, 1456, 2487, 3315, 279, 847, 3032, 2373, 2099, 1161, 775, 290, 1763, 627, 233, 1197, 1314, 2189, 3129, 911, 2609, 2213, 3315, 20, 2409, 798, 1747, 3045, 560, 2377, 2821, 1903, 1233, 2035, 3143, 1506, 839, 2487, 204, 392, 1468, 1339, 1634, 2431, 1955, 3014, 2153, 1803, 732, 541, 530, 1944, 296, 1071, 1050, 3042, 1493, 1520, 465, 1266, 127, 219, 2566, 1483, 480, 2661, 845, 2882, 2498, 1842, 1212, 1217, 2029, 711, 1742, 950, 1819, 196, 791, 2569, 2207, 3100, 1883, 2760, 2133, 1975, 3001, 1120, 2061, 1317, 3295, 1679, 2575, 270, 650, 1020, 1841, 352, 46, 2659, 3077, 2593, 1978, 389, 1677, 1847, 1515, 1507, 1350, 1937, 1182, 1459, 2354, 3272, 1979, 2307, 520, 1133, 541, 1102, 838, 301, 2397, 1001, 3267, 2764, 1768, 544, 3121, 1160, 2344, 169, 2464, 1851, 142, 1810, 876, 874, 961, 147, 2578, 1359, 1511, 1869, 1887, 3328, 2213, 1855, 597, 1925, 278, 1676, 3121, 1837, 2860, 2532, 628, 1050, 2785, 687, 1170, 2906, 431, 2763, 1915, 3082, 1361, 3210], -[2457, 3029, 949, 1672, 367, 997, 1951, 2482, 1619, 1181, 2198, 1891, 199, 2458, 757, 1297, 292, 3214, 1235, 15, 2977, 18, 1972, 2941, 1320, 454, 1932, 1981, 3219, 2728, 888, 2779, 2488, 1603, 360, 369, 1261, 1308, 3246, 1767, 1073, 416, 2752, 59, 951, 2852, 2481, 2709, 2187, 1330, 1651, 454, 57, 1531, 2072, 1117, 2897, 2985, 1470, 2352, 2893, 2160, 1108, 435, 697, 1725, 2070, 2925, 838, 877, 398, 2151, 753, 2895, 2648, 727, 1491, 782, 497, 1173, 1962, 1199, 648, 489, 1778, 199, 2526, 1285, 496, 1028, 846, 689, 89, 2127, 2490, 555, 2078, 2968, 2515, 95, 725, 3012, 779, 2917, 191, 60, 3297, 311, 2021, 3161, 895, 2885, 801, 3046, 2914, 2021, 12, 2490, 924, 2795, 92, 2643, 630, 2107, 1291, 2201, 1340, 2936, 1061, 810, 1302, 2217, 2893, 1693, 488, 2710, 1088, 273, 421, 2458, 2793, 195, 373, 3025, 189, 2486, 1842, 3267, 1175, 1778, 596, 484, 480, 2524, 1087, 2875, 2149, 1060, 1904, 3077, 1764, 852, 758, 2313, 3285, 2905, 788, 694, 241, 1333, 1958, 376, 2953, 2951, 2705, 3, 1155, 3322, 2101, 1415, 1118, 1009, 2734, 342, 2301, 1408, 626, 3012, 2295, 1846, 1913, 1999, 184, 1301, 296, 297, 2182, 3225, 654, 3215, 2422, 328, 1267, 582, 1386, 2902, 1732, 1121, 542, 1128, 495, 1054, 1552, 391, 553, 421, 2663, 2768, 1240, 2658, 2572, 479, 1446, 1289, 587, 436, 2096, 452, 1700, 642, 2628, 1044, 2716, 2457, 1934, 1518, 235, 2370, 2194, 1500, 2763, 1672, 1397, 1483, 1402, 2033, 2430, 1435, 2869, 2871, 2873, 1874, 708, 2737, 817, 2932], -[3087, 2138, 1880, 2919, 1063, 302, 1, 3033, 2212, 2417, 1770, 830, 2173, 1019, 1782, 2840, 2339, 734, 2303, 421, 917, 2841, 1180, 2575, 2094, 797, 2356, 3048, 2471, 2926, 805, 397, 1850, 2934, 1468, 2111, 639, 2044, 588, 1790, 1995, 851, 1360, 449, 2948, 2876, 803, 3316, 1114, 2633, 1983, 505, 2017, 2868, 1187, 2667, 2356, 1540, 1686, 2466, 2116, 2200, 1465, 2131, 658, 2929, 3204, 1492, 1735, 1149, 1288, 3151, 714, 1685, 3031, 444, 664, 2819, 86, 2149, 2638, 509, 2564, 1848, 1124, 218, 2495, 2862, 431, 1498, 680, 171, 1014, 1754, 2296, 936, 872, 263, 3054, 2106, 2560, 1495, 1807, 3219, 975, 995, 1477, 1758, 1417, 1025, 136, 428, 1206, 1979, 349, 1283, 2556, 281, 1373, 3165, 1778, 260, 3299, 2793, 2687, 610, 3279, 29, 11, 1829, 2817, 672, 1331, 2768, 1722, 2700, 2134, 325, 3032, 1637, 2784, 2451, 1054, 2212, 335, 2390, 40, 210, 606, 3325, 2231, 2519, 539, 3112, 1406, 356, 1259, 1313, 2839, 1220, 2862, 3063, 2641, 3178, 2492, 1254, 744, 1427, 1278, 2631, 28, 2645, 2374, 1838, 1499, 1258, 2927, 2588, 2517, 2803, 1670, 909, 644, 2740, 1823, 1813, 1290, 2202, 3242, 33, 1038, 2582, 2474, 774, 1259, 291, 403, 2092, 333, 824, 2072, 192, 2602, 1489, 1005, 1471, 2752, 2463, 213, 203, 2834, 1970, 1748, 2506, 837, 387, 1298, 2467, 980, 1456, 199, 1623, 826, 2494, 2296, 2928, 3298, 32, 49, 1239, 1917, 2086, 2421, 1834, 2380, 1928, 445, 1990, 166, 676, 3, 2308, 3270, 2992, 830, 3121, 3298, 2950, 443, 868, 2191, 64, 491, 2825, 657, 704], -[1723, 2076, 2569, 611, 2206, 800, 2025, 1086, 436, 2132, 1067, 3264, 2429, 3304, 2669, 1826, 251, 2504, 2919, 963, 244, 547, 695, 2239, 3252, 2611, 2828, 1663, 3228, 2228, 892, 1213, 1901, 2900, 2269, 1843, 1662, 2633, 1372, 490, 3148, 308, 236, 1862, 1927, 3091, 1024, 2622, 1517, 386, 861, 3194, 212, 1821, 902, 464, 1589, 487, 373, 216, 1072, 1802, 422, 797, 1708, 1125, 2194, 1550, 896, 2831, 2511, 1609, 2751, 3208, 1825, 3241, 714, 2711, 996, 1824, 2575, 31, 2940, 2250, 1990, 2936, 2432, 879, 1212, 794, 1481, 1342, 1517, 2512, 1091, 2200, 2008, 1905, 459, 1673, 2813, 2762, 2011, 64, 2398, 2636, 2554, 2469, 58, 1729, 627, 1673, 790, 1952, 90, 218, 16, 2133, 1183, 622, 2782, 1637, 597, 95, 2893, 1200, 2368, 2063, 2388, 1456, 639, 765, 1430, 2289, 969, 2459, 1083, 2658, 750, 433, 669, 2648, 1441, 3163, 1661, 2127, 541, 2436, 2380, 1703, 1948, 1491, 540, 829, 364, 2461, 1675, 2389, 1052, 1144, 2657, 344, 406, 1421, 335, 165, 3058, 142, 74, 2050, 774, 1420, 604, 2786, 2928, 477, 699, 1616, 553, 816, 1626, 821, 954, 1198, 2638, 623, 601, 2814, 2120, 272, 1790, 2623, 3264, 500, 2617, 3001, 740, 2774, 2819, 1614, 2403, 1904, 1448, 3058, 2054, 1214, 1328, 2793, 383, 2684, 2156, 2298, 2020, 3057, 379, 421, 1155, 1730, 1048, 377, 207, 2704, 3157, 708, 664, 1454, 2279, 215, 1749, 1234, 2377, 1315, 2755, 2017, 2403, 602, 1, 1526, 281, 618, 2243, 1730, 2396, 1819, 611, 2415, 3018, 1922, 966, 3308, 895, 3189, 2484, 3228, 364, 2389]] - -BHat * rHat: [[82, 2041, 2174, 3197, 1198, 59, 1197, 724, 722, 183, 1908, 3236, 1348, 3322, 147, 888, 1675, 1639, 228, 2865, 1500, 1884, 1180, 1297, 2251, 2484, 2135, 3169, 1146, 610, 2942, 2932, 2831, 2633, 428, 1384, 3155, 1682, 2699, 946, 1501, 804, 786, 2079, 954, 3242, 3195, 2968, 3071, 2, 2502, 1403, 338, 1282, 867, 2636, 3277, 474, 1238, 924, 1132, 1406, 1788, 3313, 1065, 1319, 2694, 1915, 3053, 106, 1409, 1664, 3328, 122, 329, 1776, 1480, 2284, 741, 1557, 478, 1924, 2182, 202, 2672, 2372, 1520, 2612, 2939, 1174, 2494, 2916, 2011, 3186, 2274, 1795, 2044, 215, 2806, 290, 2319, 2887, 1256, 2323, 392, 2625, 673, 2544, 1519, 2588, 3257, 3233, 2892, 2505, 3123, 580, 604, 879, 2118, 2090, 2535, 1477, 285, 2066, 2555, 2361, 2910, 2097, 498, 35, 108, 2468, 1624, 377, 0, 2519, 155, 2824, 1519, 939, 1746, 2378, 1338, 3282, 1578, 1483, 3283, 871, 1463, 1538, 968, 918, 1126, 1184, 1974, 739, 571, 2895, 245, 1666, 1430, 485, 574, 178, 2452, 2379, 2820, 3270, 1422, 1704, 622, 855, 2569, 2489, 2421, 2137, 3312, 1525, 52, 3286, 2494, 46, 499, 1146, 1661, 1923, 48, 1552, 69, 3193, 1446, 1015, 2550, 898, 3218, 528, 662, 2502, 904, 2250, 1614, 2300, 1220, 691, 2688, 261, 1868, 2408, 1899, 579, 38, 1235, 811, 2947, 1815, 882, 1194, 3134, 3244, 2463, 123, 2440, 183, 3223, 2638, 2617, 823, 1641, 2883, 267, 1488, 2846, 585, 1051, 839, 1750, 3168, 1975, 1896, 2000, 176, 2179, 1439, 2071, 470, 1044, 532, 2035, 1076, 907, 337, 467, 99, 356, 1260, 1036], -[298, 1526, 142, 1986, 2985, 844, 2506, 390, 1487, 141, 845, 158, 555, 2913, 0, 482, 1123, 2714, 2716, 1852, 550, 1725, 1852, 1372, 3067, 955, 711, 2558, 654, 3105, 982, 1874, 2222, 2760, 2257, 2276, 597, 2661, 3059, 2634, 2210, 983, 1633, 1721, 2478, 322, 465, 3132, 1179, 434, 461, 2539, 601, 326, 1785, 502, 2981, 3081, 917, 2402, 1680, 472, 2128, 2107, 1216, 2390, 1783, 2839, 1922, 2393, 1673, 93, 3323, 848, 1086, 1501, 3121, 199, 793, 3171, 451, 962, 3070, 1357, 2656, 1624, 1592, 764, 2772, 1352, 577, 2675, 676, 3167, 1150, 1816, 124, 2235, 428, 1068, 425, 1190, 1013, 3192, 3143, 2710, 877, 772, 1167, 2408, 3298, 1007, 1335, 363, 1062, 2914, 2256, 3029, 797, 1221, 1261, 847, 227, 1048, 1977, 2577, 1092, 105, 1577, 1026, 1460, 2642, 1551, 1245, 323, 853, 1261, 993, 1488, 2670, 2731, 2904, 2127, 767, 2958, 192, 3157, 2357, 3275, 3146, 3121, 691, 889, 1734, 1159, 79, 2913, 361, 1733, 2236, 2261, 1616, 2574, 937, 1359, 2632, 1984, 2138, 1544, 3305, 1663, 2564, 1092, 368, 409, 2457, 1254, 3095, 675, 637, 429, 2170, 2007, 3147, 2088, 373, 1007, 946, 1204, 65, 3082, 629, 3246, 2266, 1811, 194, 1179, 1235, 2394, 1746, 143, 2450, 3319, 1631, 1880, 729, 983, 3030, 852, 2381, 1361, 1599, 2272, 1610, 523, 761, 2680, 223, 3322, 457, 324, 2743, 976, 391, 2680, 1389, 499, 2915, 1514, 812, 1659, 1601, 344, 1818, 494, 2935, 3064, 3082, 2173, 298, 3096, 2712, 759, 2050, 1036, 2418, 2616, 2210, 2477, 2855, 1075, 1361, 3115, 3299, 1800, 518], -[808, 2799, 2135, 1035, 1245, 2352, 3009, 2676, 81, 3082, 68, 288, 2308, 806, 1503, 2054, 855, 2957, 126, 1364, 758, 1389, 1682, 2971, 38, 678, 2957, 3119, 2161, 1979, 2172, 2695, 1932, 12, 54, 528, 1085, 656, 3044, 2836, 1429, 1030, 914, 523, 2788, 2710, 1520, 2492, 1192, 1703, 115, 2741, 681, 1549, 1915, 2899, 2887, 2954, 366, 3142, 918, 131, 1244, 1908, 2317, 3181, 3327, 372, 2503, 985, 782, 431, 2979, 2682, 2522, 2130, 479, 1660, 3060, 761, 570, 2081, 736, 1596, 827, 976, 1780, 3049, 1652, 2238, 3094, 2675, 2093, 580, 904, 178, 345, 1911, 2005, 1185, 1164, 3242, 2654, 2773, 2036, 2748, 2441, 521, 1805, 1904, 1707, 186, 499, 532, 3319, 1271, 2901, 1806, 2394, 607, 1007, 1662, 864, 2504, 3000, 2140, 1453, 340, 2286, 1843, 1040, 2593, 1180, 997, 1767, 1731, 965, 733, 1538, 286, 1131, 1928, 2516, 2104, 476, 1377, 2356, 1051, 581, 1075, 1170, 1296, 1808, 631, 312, 2110, 1464, 1935, 1475, 2691, 1940, 231, 2629, 716, 2507, 1020, 9, 650, 689, 206, 3249, 202, 2260, 357, 2423, 2499, 2816, 1477, 355, 1152, 2762, 1233, 792, 344, 2927, 3054, 498, 2251, 2073, 2275, 1724, 721, 1751, 2142, 1107, 3311, 580, 3280, 2711, 510, 3235, 2157, 2476, 2486, 430, 948, 19, 503, 1064, 1348, 1645, 3306, 416, 226, 953, 1966, 2836, 573, 1209, 1059, 2356, 1520, 2203, 3164, 3068, 406, 1020, 1643, 2718, 214, 2905, 2134, 485, 2775, 2970, 1952, 994, 2714, 435, 1334, 1180, 1598, 3156, 3226, 1796, 2536, 1249, 2730, 176, 718, 2373, 549, 2033, 235, 725, 533], -[899, 558, 2689, 1909, 217, 2327, 807, 877, 878, 308, 3314, 2512, 3053, 363, 2776, 16, 1283, 1961, 1550, 1597, 1435, 2939, 1239, 2402, 466, 1230, 1513, 1521, 3256, 2231, 2511, 2229, 3184, 3118, 717, 531, 1133, 1324, 708, 258, 1526, 683, 1264, 16, 676, 1831, 1585, 1898, 1085, 2092, 1617, 1672, 1454, 2486, 68, 2425, 1679, 2770, 560, 2174, 800, 1183, 2804, 2198, 650, 337, 684, 2774, 3031, 3078, 1187, 140, 277, 3134, 1531, 3319, 1597, 2349, 1120, 1571, 3241, 1979, 408, 1229, 2287, 1043, 1667, 3016, 2042, 92, 965, 738, 2882, 620, 41, 686, 126, 2946, 1414, 903, 2657, 784, 453, 2965, 2157, 2341, 635, 2488, 2855, 947, 788, 1406, 1028, 2582, 1515, 814, 1742, 2088, 113, 2736, 1172, 402, 2119, 2479, 1536, 2638, 1199, 358, 1444, 327, 2826, 1740, 1921, 3185, 270, 2493, 2885, 1837, 2729, 724, 1444, 2469, 1231, 1890, 1711, 2820, 74, 2185, 691, 1263, 2091, 100, 230, 2176, 9, 1258, 1925, 3259, 2583, 2192, 1856, 3181, 10, 2804, 2283, 1201, 2246, 2240, 2654, 192, 799, 1644, 2593, 965, 2413, 1838, 12, 2274, 3018, 470, 2028, 2203, 527, 1869, 2017, 532, 1460, 1766, 892, 3327, 1595, 1101, 1548, 1628, 2418, 1906, 664, 665, 3202, 885, 1965, 1840, 1941, 1125, 1698, 2078, 2610, 181, 3311, 1983, 2378, 812, 1468, 923, 967, 1127, 232, 1618, 2772, 1192, 1107, 574, 2760, 2148, 1880, 337, 3246, 433, 2123, 496, 1443, 2159, 1948, 847, 2625, 1417, 566, 2617, 646, 739, 2192, 2494, 1877, 1939, 997, 3173, 2085, 761, 1253, 1202, 1811, 1050, 2410, 2963, 2355, 22]] -NTTInverse(BHat * rHat): [[2728, 2304, 2829, 2833, 2625, 1826, 1467, 2857, 59, 3288, 577, 376, 3174, 1542, 1012, 1689, 926, 1310, 311, 1655, 2244, 3216, 837, 3012, 3150, 2318, 2182, 2567, 824, 1286, 891, 674, 1539, 3002, 175, 3299, 815, 1447, 284, 3224, 353, 257, 1842, 811, 288, 496, 551, 3101, 3221, 1527, 1446, 2279, 498, 1731, 1763, 1165, 568, 953, 2071, 1559, 2967, 1778, 353, 1027, 2928, 3209, 998, 1065, 3066, 2081, 3137, 897, 1825, 2258, 401, 2417, 2783, 1297, 431, 2029, 1012, 1197, 1993, 1339, 1674, 950, 2893, 3028, 3269, 2453, 2228, 2556, 418, 1874, 792, 254, 253, 436, 473, 1571, 1459, 980, 2296, 2527, 547, 2299, 3215, 3220, 3292, 2644, 2939, 3073, 500, 3084, 2883, 138, 1781, 3120, 3129, 1320, 95, 201, 1850, 2622, 2788, 364, 2424, 508, 2011, 689, 2130, 2770, 1817, 938, 3130, 853, 878, 188, 2862, 91, 3055, 2944, 646, 3070, 3264, 145, 1708, 1713, 520, 2190, 283, 472, 1842, 1878, 3277, 1862, 1835, 3317, 818, 1899, 2287, 1418, 2458, 3167, 1572, 3114, 1667, 899, 2027, 528, 2017, 199, 1982, 485, 1139, 3241, 2560, 918, 665, 2345, 1483, 2717, 2134, 3193, 1540, 977, 1919, 2029, 2493, 2140, 242, 2093, 280, 2944, 533, 2427, 2647, 3151, 3039, 1297, 2561, 1283, 2802, 1925, 2968, 1887, 335, 763, 1091, 1953, 665, 1046, 2485, 2470, 1043, 866, 1944, 1177, 1944, 1702, 2378, 3114, 1789, 2269, 810, 1162, 700, 3234, 635, 2606, 438, 2619, 3169, 1240, 1872, 1098, 2608, 654, 1668, 393, 1334, 3322, 2884, 2581, 1959, 2831, 1913, 1758, 1996, 1996, 3163, 3095, 1053, 1390, 1464, 1648], -[1569, 2344, 876, 650, 2412, 697, 3077, 236, 1862, 1645, 955, 3257, 920, 1123, 2068, 2601, 463, 1294, 1418, 527, 1123, 88, 106, 839, 2029, 3247, 374, 1607, 2576, 2305, 2402, 333, 2861, 125, 710, 3202, 545, 2265, 1184, 2044, 1172, 2624, 2725, 1821, 3210, 1643, 1265, 1081, 1029, 2086, 1619, 803, 22, 2330, 1617, 220, 2560, 1399, 1994, 2741, 2972, 2750, 2863, 2690, 2273, 1715, 2811, 1293, 2335, 3089, 2287, 2508, 3054, 1353, 1539, 3071, 2950, 56, 3147, 1778, 2417, 340, 404, 2208, 2937, 420, 1936, 2998, 481, 3321, 194, 1111, 71, 999, 450, 496, 3157, 1670, 329, 2883, 594, 1938, 2728, 1713, 2188, 2330, 1174, 427, 1051, 289, 2200, 1509, 1185, 1691, 1206, 2931, 1463, 2824, 1545, 3005, 3123, 1975, 1099, 1683, 1448, 3155, 2111, 2524, 2827, 1125, 179, 1429, 1625, 73, 1843, 2674, 2811, 724, 2916, 1958, 1462, 1449, 2466, 1743, 1130, 1663, 494, 2207, 2234, 2156, 1853, 2817, 570, 3004, 2976, 1272, 670, 2828, 2385, 124, 1714, 486, 2372, 955, 1265, 879, 3079, 2080, 1854, 579, 3218, 1740, 1938, 820, 2064, 1998, 3017, 2329, 797, 1154, 659, 821, 2385, 2181, 3149, 2134, 2848, 1691, 36, 490, 1024, 345, 3211, 1268, 1796, 1216, 17, 2878, 1658, 94, 1077, 3145, 2226, 2840, 945, 1876, 2850, 2053, 2261, 2871, 1835, 171, 2216, 3160, 83, 2986, 1016, 2546, 2772, 1613, 2387, 3108, 2953, 1225, 1296, 858, 2014, 1446, 3243, 2490, 521, 2225, 2228, 1960, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1329, 1374, 1722, 2064, 3035, 290, 2169, 2141, 2715, 2493, 3259, 610, 1423, 846, 1488], -[2425, 529, 3010, 2623, 707, 1719, 1392, 697, 69, 1760, 2602, 841, 2529, 245, 3266, 1397, 406, 2831, 2126, 1601, 1242, 2769, 2400, 1585, 2104, 495, 444, 235, 2172, 1364, 2942, 3237, 1084, 1839, 2895, 1196, 2250, 1591, 573, 2794, 1307, 3, 1620, 2694, 2657, 2972, 1558, 2406, 1405, 2983, 2700, 1915, 2909, 852, 501, 3004, 2775, 1964, 1464, 1304, 2225, 992, 2283, 491, 414, 3224, 2212, 2651, 1239, 1968, 1412, 914, 3300, 2713, 1696, 906, 2662, 2527, 2346, 2321, 3141, 2169, 1518, 1788, 351, 122, 193, 2146, 2173, 1351, 2225, 2633, 1274, 3062, 2549, 2428, 3159, 2925, 2320, 2078, 2999, 2581, 2851, 840, 900, 1349, 92, 440, 2232, 2015, 1139, 2161, 2831, 2480, 2433, 2833, 316, 1182, 3037, 1588, 3197, 758, 687, 596, 1977, 219, 2611, 905, 1864, 234, 44, 2359, 3216, 313, 3142, 829, 662, 728, 12, 1995, 2044, 2098, 3158, 2037, 1008, 3174, 56, 3185, 10, 1905, 1383, 584, 2759, 489, 2213, 2450, 230, 54, 1295, 2158, 3095, 2907, 1937, 2320, 0, 3227, 2886, 1971, 2864, 2748, 1375, 2674, 2281, 1503, 2115, 1325, 288, 795, 3273, 505, 1494, 2495, 368, 3014, 3070, 1503, 1779, 47, 441, 2063, 1099, 2963, 1246, 1129, 1165, 2571, 761, 2194, 906, 1596, 229, 890, 92, 1479, 2960, 665, 1742, 2903, 816, 1997, 22, 1835, 2640, 1128, 2758, 2264, 1035, 1646, 277, 2288, 90, 2978, 922, 2276, 3048, 1626, 2210, 1592, 2268, 2268, 180, 2605, 2660, 786, 37, 2195, 45, 2075, 2490, 2485, 1153, 132, 2656, 619, 883, 237, 1363, 239, 773, 2909, 2026, 829, 606, 2009, 2039, 394], -[820, 1829, 641, 967, 2242, 772, 435, 1740, 1911, 1805, 581, 2080, 3116, 22, 2646, 3253, 543, 1048, 1517, 2828, 948, 2801, 1211, 3222, 1466, 2299, 583, 785, 3287, 234, 2877, 1666, 1705, 1421, 414, 1021, 1814, 3027, 452, 323, 2367, 3296, 265, 466, 1450, 895, 1924, 2906, 3168, 92, 6, 3022, 1080, 57, 3115, 1047, 95, 2807, 2773, 1388, 1697, 178, 2042, 2612, 980, 2645, 2253, 1960, 654, 1216, 706, 2110, 1440, 1001, 2487, 251, 2494, 1278, 487, 1936, 1539, 436, 1580, 2042, 2811, 1530, 1239, 2147, 720, 6, 2698, 1710, 1759, 1747, 896, 2876, 1075, 511, 2132, 784, 1956, 2623, 3038, 836, 977, 3066, 1781, 332, 1054, 1937, 2436, 372, 1052, 2296, 2089, 2565, 996, 2935, 3196, 3080, 2166, 2104, 2135, 3025, 438, 2998, 2138, 2857, 2635, 2116, 2009, 1602, 180, 866, 1630, 2814, 722, 3053, 2808, 1552, 1657, 3196, 2219, 3253, 2591, 998, 3144, 985, 1499, 1438, 1052, 1517, 2243, 1454, 1895, 966, 2020, 1742, 2090, 2468, 401, 1129, 2235, 1099, 2836, 1429, 1401, 2931, 2868, 474, 831, 532, 199, 3113, 1515, 3105, 3301, 674, 1224, 977, 2388, 265, 1627, 3146, 3318, 3303, 330, 1566, 1180, 371, 149, 1469, 1678, 1804, 3213, 1902, 1584, 1369, 749, 2116, 1424, 897, 1940, 3255, 1337, 944, 2899, 2317, 471, 777, 808, 2697, 2302, 2191, 2402, 2506, 1003, 2978, 2448, 2896, 2783, 2550, 1963, 857, 2567, 1079, 392, 21, 2708, 3274, 2598, 1661, 2575, 1637, 587, 394, 2874, 2117, 2723, 3065, 565, 40, 1101, 64, 2879, 2464, 2470, 947, 2685, 1563, 1115, 399, 2129, 951, 558, 400]] -u = NTTInverse(BHat * rHat) + e1: [[2726, 2304, 2828, 2833, 2625, 1826, 1467, 2859, 57, 3288, 576, 375, 3174, 1542, 1012, 1687, 927, 1310, 312, 1655, 2246, 3215, 838, 3012, 3149, 2319, 2181, 2568, 825, 1285, 891, 673, 1540, 3000, 174, 3299, 816, 1448, 285, 3224, 355, 256, 1844, 810, 289, 495, 553, 3103, 3221, 1528, 1445, 2279, 497, 1731, 1764, 1164, 568, 953, 2070, 1560, 2966, 1777, 353, 1027, 2928, 3208, 997, 1065, 3066, 2081, 3138, 895, 1826, 2259, 401, 2417, 2784, 1298, 430, 2029, 1011, 1195, 1993, 1341, 1675, 951, 2892, 3029, 3270, 2452, 2229, 2556, 419, 1875, 792, 254, 253, 436, 471, 1572, 1458, 980, 2297, 2526, 547, 2299, 3215, 3221, 3293, 2645, 2939, 3073, 501, 3082, 2884, 138, 1781, 3119, 3129, 1319, 94, 202, 1849, 2622, 2789, 365, 2425, 510, 2012, 688, 2128, 2769, 1817, 938, 3131, 853, 878, 187, 2863, 91, 3054, 2943, 648, 3069, 3264, 146, 1706, 1714, 519, 2189, 282, 474, 1841, 1877, 3279, 1862, 1836, 3317, 818, 1899, 2287, 1419, 2459, 3167, 1572, 3112, 1666, 901, 2027, 528, 2017, 199, 1981, 484, 1140, 3241, 2560, 918, 667, 2343, 1483, 2718, 2135, 3192, 1540, 975, 1920, 2030, 2491, 2141, 242, 2094, 280, 2944, 532, 2427, 2648, 3150, 3041, 1297, 2560, 1282, 2801, 1925, 2968, 1886, 333, 763, 1093, 1953, 667, 1047, 2483, 2470, 1043, 866, 1944, 1177, 1945, 1701, 2378, 3112, 1787, 2269, 809, 1161, 698, 3234, 634, 2606, 438, 2620, 3168, 1239, 1871, 1099, 2609, 653, 1668, 394, 1334, 3322, 2883, 2580, 1959, 2830, 1912, 1758, 1995, 1996, 3162, 3096, 1053, 1390, 1463, 1648], -[1570, 2343, 876, 650, 2411, 697, 3077, 236, 1861, 1645, 956, 3257, 921, 1124, 2069, 2601, 463, 1295, 1417, 527, 1123, 88, 108, 838, 2029, 3248, 374, 1609, 2576, 2306, 2402, 334, 2859, 125, 711, 3203, 545, 2264, 1185, 2043, 1173, 2622, 2725, 1822, 3208, 1642, 1264, 1082, 1031, 2087, 1620, 804, 21, 2329, 1615, 221, 2560, 1399, 1992, 2739, 2972, 2749, 2863, 2690, 2272, 1714, 2810, 1293, 2334, 3089, 2286, 2509, 3053, 1352, 1541, 3071, 2949, 57, 3147, 1779, 2418, 340, 405, 2210, 2936, 418, 1938, 2999, 480, 3321, 194, 1111, 71, 998, 450, 495, 3158, 1671, 329, 2882, 592, 1938, 2727, 1714, 2188, 2329, 1172, 428, 1051, 289, 2202, 1510, 1185, 1691, 1207, 2929, 1464, 2826, 1544, 3006, 3122, 1976, 1099, 1683, 1448, 3154, 2111, 2522, 2827, 1124, 178, 1428, 1624, 73, 1843, 2674, 2812, 723, 2918, 1957, 1463, 1451, 2465, 1742, 1131, 1662, 495, 2206, 2235, 2156, 1852, 2817, 570, 3005, 2975, 1271, 669, 2829, 2386, 124, 1713, 485, 2371, 954, 1265, 878, 3078, 2079, 1854, 581, 3218, 1740, 1937, 818, 2066, 1998, 3016, 2330, 795, 1154, 658, 820, 2385, 2180, 3149, 2136, 2847, 1691, 35, 491, 1024, 346, 3211, 1267, 1795, 1218, 19, 2878, 1656, 95, 1079, 3145, 2227, 2840, 945, 1877, 2852, 2052, 2261, 2872, 1835, 171, 2217, 3158, 83, 2987, 1016, 2547, 2772, 1613, 2386, 3107, 2951, 1225, 1295, 860, 2015, 1447, 3242, 2489, 522, 2225, 2228, 1962, 2402, 2603, 2304, 1005, 1025, 1579, 3107, 1328, 1374, 1723, 2064, 3037, 291, 2168, 2140, 2715, 2493, 3260, 610, 1423, 846, 1489], -[2427, 528, 3009, 2623, 707, 1720, 1391, 696, 68, 1760, 2601, 843, 2530, 246, 3266, 1397, 407, 2831, 2125, 1602, 1242, 2769, 2400, 1586, 2106, 497, 443, 236, 2173, 1365, 2942, 3237, 1083, 1840, 2895, 1195, 2250, 1590, 572, 2795, 1308, 3, 1621, 2695, 2657, 2971, 1560, 2406, 1405, 2983, 2701, 1914, 2909, 851, 501, 3002, 2775, 1962, 1464, 1305, 2226, 990, 2282, 489, 415, 3224, 2213, 2652, 1239, 1970, 1413, 914, 3299, 2714, 1696, 905, 2661, 2527, 2346, 2319, 3143, 2167, 1517, 1788, 351, 122, 195, 2147, 2172, 1350, 2224, 2632, 1273, 3062, 2549, 2430, 3161, 2926, 2319, 2078, 2999, 2582, 2852, 840, 900, 1349, 94, 441, 2232, 2014, 1139, 2161, 2832, 2479, 2434, 2832, 316, 1183, 3037, 1588, 3198, 757, 685, 595, 1977, 220, 2610, 905, 1865, 235, 44, 2359, 3215, 315, 3142, 829, 663, 728, 12, 1994, 2044, 2099, 3159, 2037, 1007, 3173, 57, 3186, 10, 1905, 1383, 583, 2759, 488, 2215, 2450, 229, 53, 1294, 2158, 3096, 2908, 1937, 2322, 0, 3228, 2885, 1971, 2865, 2750, 1374, 2675, 2282, 1502, 2116, 1325, 287, 795, 3273, 506, 1493, 2496, 368, 3015, 3070, 1504, 1778, 48, 440, 2064, 1098, 2963, 1245, 1130, 1166, 2573, 760, 2194, 905, 1597, 230, 891, 91, 1479, 2960, 663, 1741, 2902, 818, 1996, 24, 1836, 2640, 1130, 2758, 2264, 1035, 1646, 278, 2288, 90, 2977, 922, 2275, 3048, 1627, 2208, 1592, 2268, 2269, 181, 2603, 2660, 786, 38, 2196, 45, 2075, 2491, 2485, 1152, 132, 2657, 619, 883, 236, 1364, 238, 773, 2910, 2026, 829, 608, 2007, 2041, 393], -[821, 1830, 641, 966, 2243, 774, 434, 1738, 1911, 1805, 581, 2078, 3115, 22, 2645, 3254, 543, 1048, 1517, 2827, 947, 2801, 1211, 3222, 1466, 2299, 583, 784, 3287, 236, 2877, 1666, 1706, 1420, 414, 1022, 1813, 3027, 451, 324, 2366, 3297, 266, 468, 1449, 896, 1924, 2908, 3170, 92, 4, 3020, 1079, 59, 3116, 1048, 95, 2806, 2772, 1389, 1696, 177, 2044, 2613, 980, 2647, 2255, 1960, 654, 1216, 707, 2111, 1440, 1001, 2486, 251, 2494, 1279, 487, 1936, 1540, 437, 1580, 2041, 2811, 1531, 1239, 2146, 720, 7, 2699, 1709, 1758, 1746, 895, 2874, 1075, 509, 2134, 784, 1955, 2622, 3039, 835, 978, 3066, 1780, 331, 1054, 1936, 2436, 372, 1053, 2296, 2089, 2564, 995, 2935, 3197, 3082, 2165, 2103, 2137, 3025, 437, 2999, 2139, 2857, 2635, 2117, 2008, 1602, 178, 867, 1629, 2815, 721, 3053, 2809, 1553, 1657, 3197, 2220, 3253, 2590, 999, 3143, 986, 1500, 1438, 1051, 1516, 2244, 1455, 1894, 966, 2020, 1741, 2089, 2467, 401, 1130, 2235, 1101, 2837, 1430, 1403, 2932, 2869, 474, 831, 532, 200, 3112, 1516, 3106, 3302, 676, 1224, 977, 2386, 265, 1627, 3146, 3319, 3301, 330, 1568, 1178, 370, 150, 1469, 1677, 1803, 3211, 1902, 1586, 1369, 749, 2116, 1425, 896, 1941, 3254, 1338, 945, 2901, 2316, 471, 776, 808, 2697, 2301, 2192, 2402, 2506, 1004, 2979, 2449, 2896, 2784, 2550, 1963, 857, 2565, 1079, 391, 20, 2708, 3273, 2597, 1661, 2576, 1636, 587, 395, 2874, 2118, 2723, 3063, 564, 41, 1100, 64, 2880, 2463, 2469, 947, 2685, 1563, 1115, 400, 2131, 953, 560, 400]] - -mu: [1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665] -tHat^T * rHat: [2832, 998, 1041, 112, 1377, 3292, 2245, 2778, 1275, 131, 1065, 1532, 1554, 3218, 321, 64, 713, 2494, 1080, 1187, 1448, 2307, 2085, 600, 1497, 1186, 243, 356, 97, 3068, 2998, 1766, 1245, 1393, 1446, 70, 3167, 1797, 393, 2580, 789, 593, 2041, 422, 1847, 1834, 2425, 3181, 54, 1941, 2527, 1251, 828, 1724, 586, 789, 1630, 721, 2239, 1085, 259, 2515, 217, 3208, 930, 2981, 3085, 3225, 851, 2573, 2518, 609, 2072, 3236, 2034, 2805, 1671, 2242, 3032, 2593, 1943, 176, 895, 196, 885, 920, 3047, 2375, 646, 3039, 2687, 1152, 785, 1572, 207, 2196, 2962, 866, 523, 1363, 2262, 2797, 1400, 1828, 2406, 1579, 680, 1879, 180, 1614, 116, 3168, 2110, 3106, 2738, 3256, 3185, 2813, 2433, 2343, 64, 841, 2623, 3211, 2036, 123, 2832, 2922, 1144, 2110, 2682, 1124, 862, 1205, 524, 3286, 439, 3121, 2484, 1957, 1531, 1002, 2941, 3205, 982, 1679, 1973, 1222, 1430, 1574, 2859, 10, 345, 344, 1108, 1822, 784, 2299, 2135, 2346, 3206, 2656, 2077, 757, 1195, 303, 1971, 706, 993, 1931, 2663, 1192, 3152, 2734, 707, 3013, 242, 2335, 2685, 1550, 1923, 1604, 2041, 2685, 2607, 1429, 2139, 2041, 2099, 1781, 1376, 1258, 2320, 346, 1478, 3321, 572, 1093, 316, 787, 2434, 1114, 1757, 1293, 3051, 1743, 1842, 1527, 2670, 822, 2980, 1818, 2503, 1163, 214, 3061, 1190, 2501, 1650, 180, 64, 2031, 2924, 1525, 3214, 2702, 715, 3050, 1714, 3228, 1269, 155, 11, 1043, 2307, 3294, 3308, 2766, 67, 563, 765, 2037, 125, 1582, 810, 2910, 1856, 2345, 3146, 3039, 3002, 1274, 2109, 2488, 2045, 520] -NTTInverse(tHat^T * rHat): [2232, 1324, 153, 262, 1847, 1416, 1179, 704, 88, 3232, 1082, 2292, 1628, 1916, 3032, 2802, 1858, 890, 2481, 1541, 804, 1566, 2553, 2200, 2924, 2688, 0, 2050, 2407, 3241, 2099, 1311, 2358, 528, 1275, 386, 552, 2798, 924, 2192, 1443, 1889, 2438, 2186, 3233, 2258, 1093, 726, 2741, 2431, 651, 870, 1376, 2355, 168, 2366, 692, 2672, 1340, 1489, 1460, 2443, 284, 256, 975, 2416, 2213, 831, 1123, 192, 1765, 530, 1509, 1172, 3312, 2025, 2872, 2944, 1809, 1716, 987, 463, 3269, 2654, 3194, 2944, 1906, 904, 633, 2175, 695, 2662, 2358, 2672, 720, 2781, 1279, 2227, 2303, 2049, 2443, 1296, 1965, 2113, 2468, 1294, 65, 1591, 757, 1164, 3166, 2137, 2708, 1248, 3093, 2018, 2280, 1013, 1610, 2916, 2591, 2842, 1635, 2816, 580, 514, 1221, 2231, 2433, 743, 1694, 707, 19, 896, 2286, 1789, 693, 306, 57, 3257, 1273, 2850, 763, 2603, 1261, 2474, 2133, 2079, 1286, 2860, 1782, 195, 2165, 2808, 1879, 1, 1951, 2754, 2700, 286, 2031, 880, 2542, 25, 2342, 1074, 3036, 1057, 128, 1079, 3282, 1918, 1609, 41, 491, 1524, 2377, 67, 227, 2073, 2509, 1439, 1160, 1490, 1222, 3251, 1901, 1490, 2225, 272, 1737, 1372, 1324, 3310, 226, 2776, 1335, 2768, 1113, 1620, 311, 1735, 160, 443, 1913, 1803, 3181, 1457, 2569, 2543, 148, 974, 2701, 1357, 2180, 1294, 1637, 1155, 709, 2124, 2828, 1059, 1415, 488, 184, 710, 2323, 205, 2977, 2645, 2103, 3014, 1927, 693, 791, 2997, 1509, 2940, 80, 3245, 789, 2218, 2282, 1865, 2319, 941, 3314, 2810, 2836, 715, 741, 1423, 2100, 2656, 3122, 2027] -e2 + mu: [1664, 1664, 0, 2, 0, 0, 0, 0, 1663, 1664, 1666, 1666, 0, 3328, 1667, 0, 1665, 0, 0, 0, 1666, 1665, 1666, 1665, 0, 1665, 2, 1665, 3328, 2, 1666, 0, 3328, 1664, 1666, 2, 1664, 3328, 1666, 0, 3328, 1, 1667, 0, 1, 1664, 0, 3328, 1, 3328, 1666, 1663, 1663, 0, 0, 1665, 1666, 3328, 1665, 3328, 1, 1665, 3328, 0, 1666, 0, 3328, 3328, 3328, 1664, 2, 0, 0, 0, 1664, 3328, 1665, 0, 1665, 1666, 1664, 1665, 1664, 0, 2, 1666, 1, 3327, 2, 1665, 1665, 1667, 1664, 3328, 0, 1664, 3327, 1666, 2, 1665, 1666, 1666, 1, 1666, 1666, 0, 1665, 1665, 1664, 1665, 2, 1, 0, 1, 1664, 3328, 0, 3328, 3328, 3327, 1664, 1665, 3328, 0, 1666, 3328, 3328, 1666, 3328, 1, 1665, 1664, 1664, 3328, 1, 0, 2, 0, 0, 1665, 0, 3327, 1666, 1664, 0, 1667, 0, 3328, 1664, 0, 0, 1664, 1665, 1664, 1, 1666, 1666, 1666, 1, 1666, 0, 1, 1665, 1, 2, 3328, 1664, 1666, 3328, 0, 0, 2, 1667, 0, 1666, 0, 1, 1666, 0, 0, 0, 1, 3328, 0, 1666, 0, 1664, 3328, 1664, 1664, 3328, 1665, 1666, 1666, 3327, 3328, 1664, 1667, 0, 1665, 1664, 0, 1666, 1664, 1665, 1666, 3327, 0, 1665, 1664, 1666, 1665, 1665, 3328, 3327, 1664, 1665, 0, 2, 1, 0, 0, 0, 0, 1, 1, 3327, 1666, 1, 3328, 0, 1666, 1, 1, 1665, 1665, 2, 1666, 0, 1666, 2, 1665, 2, 1664, 1665, 1666, 3328, 1664, 3327, 1664, 1665, 0, 1664, 1665, 1666, 1666] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [567, 2988, 153, 264, 1847, 1416, 1179, 704, 1751, 1567, 2748, 629, 1628, 1915, 1370, 2802, 194, 890, 2481, 1541, 2470, 3231, 890, 536, 2924, 1024, 2, 386, 2406, 3243, 436, 1311, 2357, 2192, 2941, 388, 2216, 2797, 2590, 2192, 1442, 1890, 776, 2186, 3234, 593, 1093, 725, 2742, 2430, 2317, 2533, 3039, 2355, 168, 702, 2358, 2671, 3005, 1488, 1461, 779, 283, 256, 2641, 2416, 2212, 830, 1122, 1856, 1767, 530, 1509, 1172, 1647, 2024, 1208, 2944, 145, 53, 2651, 2128, 1604, 2654, 3196, 1281, 1907, 902, 635, 511, 2360, 1000, 693, 2671, 720, 1116, 1277, 564, 2305, 385, 780, 2962, 1966, 450, 805, 1294, 1730, 3256, 2421, 2829, 3168, 2138, 2708, 1249, 1428, 2017, 2280, 1012, 1609, 2914, 926, 1178, 1634, 2816, 2246, 513, 1220, 568, 2432, 744, 30, 2371, 1683, 895, 2287, 1789, 695, 306, 57, 1593, 1273, 2848, 2429, 938, 1261, 812, 2133, 2078, 2950, 2860, 1782, 1859, 501, 1143, 1880, 1667, 288, 1091, 2701, 1952, 2031, 881, 878, 26, 2344, 1073, 1371, 2723, 127, 1079, 3282, 1920, 3276, 41, 2157, 1524, 2378, 1733, 227, 2073, 2509, 1440, 1159, 1490, 2888, 3251, 236, 1489, 560, 1936, 1736, 3037, 2990, 1647, 224, 2775, 2999, 1106, 1113, 3285, 1975, 1735, 1826, 2107, 249, 140, 3179, 1457, 905, 878, 1814, 2639, 1037, 1356, 2178, 2958, 3302, 1155, 711, 2125, 2828, 1059, 1415, 488, 185, 711, 2321, 1871, 2978, 2644, 2103, 1351, 1928, 694, 2456, 1333, 1511, 1277, 80, 1582, 791, 554, 2284, 200, 655, 2607, 3313, 1145, 2834, 2379, 2406, 1423, 435, 992, 1459, 364] - -c: 8D4E2CB39FFDE4311AEEDB2338BF58CE11FADABDC9813A321930F46756DD13A8E7919FAC4F59CC9F8B91C833B3B3F91ADC6F9FBDBDE2F7DAE8841BE5238B9850A5EEBE675DDEF42A9314F690595D51523E8117F22266034F09B77D991EE575802AFE446374EB3D9E1BEB8F25049C6EFA96327366C024CDFBE8DC27EF56492C90409E87139C6088488E17B82D1556C25131ACEE7DAFFE2D437CEC3441BBBBAB80C4BF177E653AE0831C9B4CEB70505727D63C4D474FEDC52019BE411C9A43B87170F5893F06ECD8D782063DF893A1B682246D1C64F8F5A8C6FCDF07927F4D5B7A397FBCBD075045DF2C4A36F5304C95F44AF927AE9166420B39448794F5B3C35227C3C9DF925602A1AC98F851AADB65C93FDD6327AED8AE4129724436A33AA08AA56608855FF80AAA42ACA4562B2D78DBBD2F91AEF251566B8C6F98213784C99DD7D71F495564C908501E35E3BFBB675CCB66635287CB6466E6E38EA8AB11CE7EC60BED8620B3DCD6943D1279A41F93A87FA359E513C81DE918DA88322B1B088140E074BE39BC17E3C51AB719DF6E426D64FF94B8662B9DD26A32A3C3687BF9294C537A2268F9DED380CC8A0F1127EE5A322B4DF24D87FBCE76F560B037C659B6FB15C156071AEDC26EF11140DE88D08D463EA0EAF080A0B2E627D9FF1D56C502335524269727A032DACD16543ADA8342CD6CB40E7228592C3574D982E0B9145EB865DB2EE7810726A916B837CA4F14C2CB9E951BDE76BE16B8B1CDC2EECDC06949B8BEB11786B8F25F4C9AFA5597CEB1D85FC9B9C91DC61966F396091E54C96C97A4300E99FD9F752C0BEF5D88CAFBDCB3993FCF6C7A8C5519FCECB6A79117E9B521680197D8A91AB75F1814DBC58075EF4F07987ABC56A75DA4416EDB9D6F3D771AD340D5CBCFC0E571FA70AAC1C7DBBB5F5C5E1D8B1036F5A6FCFD0625AB5BBDA571839C5835DD6979778F59D348684FA6CFC2A62535B47FAD7F97B5218872D52DCACE9D3C1B11628D352AD821900F44E14B647F6BFA70F646B5C7AF5313177A10954944229153A449FCF89A6263BDBF8556E981E5D6251340F9F43C6692030FB9605BB99F33E96F06D1E4E6ABBE65E14696D530F1B525FFF87D54C1AC2F5E964D46EE37F4045B54E6098F76B28EAF69E998888D25E021A538FD1956A7FC30AE83F8BA9947F864FD59731A6FBB402AF2990E1ED2D56BF62AA6CEAE6F769D2D0C6C313D7AAF974E69DC02CC4318B9457B8CC40656AB7B6134DE3F9801CE019699CE855EBE9C6C02FD08506F004A4EED2CA166C954C7DB8810700CA671EF372A290B00E1BFBB97E3E674D3DCCC57CE59F465B1488FF76F6239008BE3E761EF9C113DF0107B8EEAE3FEBA55B35E4C1DA3B6C87A8D20110E1CD771CCBC30DFF761E603D488E55B853AAE7DAADF2A007B8393DF08AF534F9F53A73757BABE21C86426CF058ECA817EF237BFC58AC298FBF2A1481C4D12DCF1B737FD639769A2531EF931A362A44456EE2CA48598B46259FCC977076C59FA4E2954E9967DA45DA7CBF78633EC59C463FE48A83B801A54DB3FEAB445A357E418B0653F2940B2B71381B2DF9ECF8100848E2912F4BD503AF075AAAF36C136A413C95BE2F25A6D291976CD66A27643537E35E1DF89B1E494B36B08F3D0196CD7E90BA5BB21009F37A843199E08DD95CA4948C533CB263B5D405AF2FA119981A8536EB71C88226C41534C2687BF1EED3475E8488BDE909A93D4DB55B6E834B5E7860AA98FD8BCB13AB077B7BFD75B35FA393E93E3BFB4B9BA1DAA7465FD5B23A5B4CD1716D4BDF7B8D5574B156DB87D8DE1E526C97F8EB287BD97EEEEEF074DBCB2C4DB51A4EFF1FA7FFF328A572D7270017108ACE2ED25093DA535C7A26D3B912AA57FB322E53BB222E94E7CF68CD8A21AD7C06A4AF978ED1DEB10E3F2412AC6543C182068EFFBD87F31765F5AE681EE8B2E9AEB5BC940A94EC0EEF5BEF74874169EABECF1512565C51EA58721DD3AF1690365DB22E1877F2A5C01723F69B7725277AE4E9EFACD3AFA5ADCAF385777E7CE10F956B4642C6FC1C97808993EFD994CA65C75F459AC5872F82488C57FB7AF9AB969D5E369C16D0B2BF7800B938D6784C7F64D0C55CA7794654938949E14217055D34101F9417D370A8ADD72FC0B5766EC1D8ADDD702334A2AC27709C5AC5AE5601DBA952BE258D9336DF3E0F65878A858613258FB5E47941B diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt deleted file mode 100644 index d9c83f3c2..000000000 --- a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-512.txt +++ /dev/null @@ -1,38 +0,0 @@ -Encapsulation -- ML-KEM-512 -ek: A5409718CB72F2438A3555A3C8F18F2671A1F81403DF7B5A4659A51F50827BA6577AA70800D78D8BC5AA86B89E08B58F3480A89E104DC6922EDBC12D06F891027C654E994A22F91A2AF63404CA98D7B67EEA25911B24C70DEB8146A0821F34A302551F2D510C0588C8BCA74EB4DC0CFA4603C1C5A3C5537061789068682C4CC3143FBA9BB5542F9778BDF23B3652F2A7524756FA73909DDAC7E532522659218CBA25F33B6B0458CB03DA7935BA59111955312B15CCE2C0F73466A8006283A2AA7CBB61022ABBC2D19F2920BC302472DC97C4A1788C9BD3BBEDC9122B827B279C074C80443141119F4B1629F62F10D4CE2BE3BB343816CAD16A1C87582F2B70E26635B08BB390C13398FCCDA7E9BB3D9B0B7803750C955C57A028A5D26C270316BB2B815C3B972BA6782DAB02F306821E61285BB072BF79781CABC386142A50C7AAAE66A947585BB0D8288DBCAF4B3B85BB7926987BAF7643AAB5FB02210580A0264352E69C6098989CFB87483395960A3A4F31BEFDA80B5F286ECFDAA555D4390AF6B55D313920929093449CD6729D00218E2D86570ADC0C4F6545FFB5632EFB3AAE2625A6982670FACE8D16126FA607E6D0A1FF616A46ECA642CC6AAC554DBBC43DFCF57F364C190CEA5776C1CEB58B7007505FD79C5F005A4BA218CF0693B058B510A4CA204324602F59BB8F2281C4D7B0BC8625E7881650F57C89E32CF4809144775C9073B673E39412A27C914321CCB6A7CF7C37C5BCBE7CA51BE0C928466A458EB778D6466A892A0ACBC09638784A27739C970CA58BC2595AD6BFA4E52EB438AC97C41623802248E110B074838F31A6E7503737704E7AE4AD91299572A8C13603500F3609B625B4E24CAE332B0D7A5BB47A038512A081BC27CDF0F2923CD3479F5307020B77F149584564060E5083CED55312B6A6A465A82B4577D63A4B49C80B07A9367E39778AF76FA8EC2CF528722856CE7813401A8383BDB7151B9B6D2DD6BFF55401D28AC612818C88C9287347B098A966EB9C0A2DB71F0A75555E1757D3AC4E3D802C8DC6A261521255186ABB98C2480301B8C6B31228B54461BC44EA3C2CF94B86C7A5B82C55167A7606CA9DC8253B7604E44A07F3ED55CD5B5E -m: 109A248FE8052F84271FF57BAC156B1BA6A509CDCDBCC96CCDB1CCB85CA49315 - -K: 4DDD304E274899BD82971856824B587130927952060121858F9ADEB96AB7F571 -r: D93F0F5C16390B24AB38D288F511F0ECEB618C0E7F0BB9BD65E0321A5C4712A6 -tHat: [[165, 2420, 2840, 1836, 1010, 2212, 1333, 2613, 456, 2303, 294, 2583, 1272, 49, 3039, 1447, 2374, 2645, 31, 2085, 1659, 1402, 1914, 138, 1792, 2269, 1419, 2732, 2182, 2539, 1288, 2299, 52, 2696, 158, 1233, 710, 745, 475, 732, 2054, 2335, 3074, 1623, 2382, 1193, 2338, 431, 1578, 847, 2564, 2444, 1751, 2027, 1514, 2322, 1051, 3186, 2829, 2078, 70, 2090, 1055, 2611, 1282, 501, 301, 197, 2053, 3208, 1980, 1258, 3252, 205, 1786, 52, 1473, 2620, 965, 1797, 2145, 2311, 2152, 710, 844, 332, 2623, 2491, 1205, 757, 2199, 3031, 3058, 867, 594, 2687, 1874, 1380, 1018, 2311, 2717, 3197, 741, 1315, 2342, 533, 2700, 603, 3059, 1715, 2052, 3253, 2563, 1949, 2613, 1435, 2321, 1361, 2865, 338, 716, 3086, 1271, 1635, 168, 1568, 643, 2730, 2940, 1563, 2562, 2994, 450, 2557, 41, 3010, 1072, 1826, 2012, 3145, 2209, 2247, 923, 3005, 2541, 300, 555, 1976, 3111, 121, 76, 1096, 305, 276, 2975, 356, 1577, 767, 1040, 3309, 811, 3006, 2100, 355, 458, 1709, 1820, 1416, 2863, 1794, 1762, 854, 2992, 2872, 400, 828, 3224, 3295, 2471, 3006, 2877, 185, 888, 1872, 1292, 1481, 87, 650, 677, 1741, 807, 352, 3003, 2066, 2908, 2419, 1579, 1930, 2861, 42, 1779, 2080, 286, 646, 91, 1835, 2495, 1927, 2844, 3130, 1158, 673, 1872, 2732, 1710, 2710, 2119, 1461, 2224, 653, 3213, 2811, 2891, 2131, 2491, 615, 2968, 2807, 886, 2724, 2997, 47, 1313, 2048, 1696, 1074, 1618, 2510, 2144, 2441, 2972, 2175, 840, 2387, 2710, 928, 335, 3043, 2301, 186, 2143, 1762, 2767, 2653, 1109, 925], -[1546, 2911, 349, 915, 544, 2313, 1171, 2500, 726, 2519, 256, 2274, 1581, 1400, 3082, 205, 1359, 1110, 1535, 1595, 2862, 943, 1710, 594, 2214, 617, 2672, 3311, 1677, 289, 1647, 122, 230, 2589, 511, 1702, 3142, 2670, 3138, 1708, 1452, 1237, 1211, 988, 1532, 2047, 3126, 404, 2572, 1406, 374, 3308, 2997, 1800, 7, 1525, 3287, 1529, 2560, 1205, 2210, 3313, 774, 2825, 1368, 267, 2724, 524, 1091, 1538, 2351, 2997, 655, 2066, 1988, 2829, 1724, 600, 2279, 360, 1360, 1999, 905, 718, 244, 2328, 1860, 1479, 912, 2919, 883, 2382, 530, 1994, 913, 532, 1740, 2683, 3279, 887, 3269, 3051, 1404, 442, 2528, 652, 2630, 1110, 1934, 1931, 1750, 1700, 2697, 162, 203, 2412, 2104, 1191, 807, 2503, 3223, 2640, 651, 1436, 1626, 3069, 1444, 750, 2228, 2755, 1175, 364, 35, 552, 328, 270, 1200, 2103, 399, 2659, 231, 885, 55, 1255, 1146, 2782, 2449, 2386, 2162, 3098, 822, 1280, 1551, 147, 1462, 2882, 3298, 2788, 2867, 210, 2938, 2885, 890, 2128, 18, 2074, 1980, 3282, 752, 2351, 828, 1149, 927, 117, 2818, 1904, 2545, 1412, 1093, 102, 14, 2101, 1486, 1341, 1554, 2667, 1444, 2694, 1323, 1908, 2774, 1203, 2121, 188, 2311, 874, 2430, 1907, 1930, 1791, 3240, 718, 2293, 1826, 1576, 3301, 888, 1025, 794, 2104, 1981, 347, 2843, 1753, 1581, 3069, 1269, 21, 2770, 3176, 274, 2248, 2440, 652, 1907, 2820, 2456, 1642, 3307, 169, 1837, 507, 1290, 1367, 1886, 1393, 3283, 1258, 61, 712, 1677, 2604, 609, 293, 2133, 1697, 2235, 3113, 840, 16, 1720, 2876, 2066, 2898, 324, 3014]] - -bHat = aHat^T: [[[3168, 3188, 3062, 1132, 108, 2666, 3029, 1599, 507, 3166, 2406, 2585, 37, 2415, 1386, 25, 959, 2147, 1383, 3278, 683, 1054, 2230, 2766, 2314, 2519, 561, 3279, 2896, 487, 1783, 863, 1614, 2452, 829, 2499, 1590, 2885, 789, 316, 1769, 574, 1646, 540, 674, 2867, 2914, 3209, 361, 51, 3098, 2013, 3200, 942, 3179, 2862, 1119, 1122, 1797, 2223, 2597, 2122, 2572, 2138, 1966, 2500, 3270, 891, 1876, 2437, 2629, 1616, 41, 2058, 1054, 1545, 757, 1962, 1818, 2937, 825, 2705, 466, 2824, 1660, 331, 82, 2240, 2568, 1589, 1858, 1407, 2784, 1015, 2616, 2349, 690, 1988, 2528, 1832, 989, 1959, 446, 1593, 1246, 2648, 1616, 2206, 2007, 2371, 2827, 2930, 2403, 1045, 1896, 175, 24, 2046, 1072, 797, 1169, 1119, 2787, 349, 2736, 2002, 2066, 2431, 1344, 2496, 1125, 3195, 2685, 3036, 1036, 1516, 825, 2956, 1746, 1447, 1426, 2442, 1389, 1812, 2052, 1402, 1113, 2637, 531, 2004, 1146, 3243, 132, 3089, 1283, 908, 2812, 2253, 2537, 1909, 1017, 1705, 3227, 1163, 2574, 2166, 3244, 1812, 2087, 3037, 3298, 489, 221, 2927, 1370, 1305, 2338, 1158, 945, 2619, 595, 1229, 423, 1971, 1664, 1565, 669, 2658, 848, 657, 631, 2314, 2768, 3193, 1855, 2042, 2704, 2438, 776, 1597, 2565, 1917, 961, 1584, 3201, 2285, 231, 989, 2946, 1792, 3156, 224, 1483, 2249, 116, 2272, 926, 2505, 428, 106, 1806, 173, 3113, 2337, 2885, 1255, 677, 785, 2010, 1898, 1970, 744, 490, 2718, 3158, 1388, 1822, 2541, 1595, 171, 1835, 2104, 1636, 1308, 458, 708, 410, 2025, 2854, 2630, 657, 1906, 2612, 1548, 1285, 2985], -[2187, 2809, 281, 1086, 1360, 711, 2799, 2132, 1448, 914, 1940, 2572, 623, 1180, 2183, 2741, 2595, 1022, 908, 893, 1752, 3285, 2013, 2536, 2996, 2211, 948, 330, 1830, 2894, 1862, 3010, 1941, 1152, 2089, 425, 925, 3041, 2780, 12, 2052, 1880, 2438, 1003, 540, 2464, 3313, 1791, 1080, 2187, 373, 830, 2382, 2167, 3242, 868, 2239, 825, 2591, 577, 1956, 2541, 1666, 3175, 3237, 3294, 803, 1654, 4, 2142, 804, 1030, 2469, 3106, 2674, 1241, 2770, 1947, 587, 839, 2135, 1409, 583, 11, 423, 2898, 2065, 2559, 2037, 2465, 3139, 918, 348, 571, 1605, 3114, 1457, 321, 364, 2883, 608, 2389, 966, 504, 2656, 2214, 2447, 850, 2028, 3182, 2321, 341, 1618, 1636, 558, 530, 1971, 1119, 2794, 591, 3323, 1004, 540, 46, 1901, 1272, 88, 463, 1969, 3173, 339, 561, 550, 1136, 1709, 1277, 2686, 2038, 478, 2874, 2435, 1733, 2164, 2182, 2979, 852, 12, 3235, 2603, 1357, 1687, 438, 272, 1349, 1036, 429, 1408, 1422, 608, 1369, 2870, 1167, 434, 1669, 2656, 974, 1555, 430, 640, 238, 1626, 76, 454, 2897, 1009, 2852, 1176, 1861, 206, 2633, 1301, 3141, 556, 3305, 1897, 808, 2044, 2623, 2863, 173, 336, 400, 970, 3214, 2334, 1544, 1594, 2119, 870, 3166, 1047, 2902, 958, 198, 2697, 1357, 1468, 568, 2975, 2777, 3228, 3115, 12, 2378, 820, 2341, 645, 31, 1373, 2581, 175, 1393, 2148, 1199, 1866, 2720, 2706, 2886, 24, 845, 3327, 2259, 3315, 2380, 2455, 2167, 1450, 2326, 221, 2727, 1293, 1541, 1152, 2420, 2015, 2573, 3109, 1298, 777, 2173, 1094, 994, 2095, 2504, 2729, 1062]], -[[1357, 636, 1559, 1810, 938, 644, 229, 103, 89, 381, 547, 1750, 1336, 1791, 32, 850, 1642, 3065, 2026, 749, 1380, 924, 2593, 2078, 1428, 2606, 2705, 2884, 866, 965, 515, 3196, 1999, 501, 3092, 790, 2427, 3080, 1155, 2250, 1382, 1619, 1826, 2660, 734, 3268, 984, 617, 2085, 1164, 3016, 198, 482, 2666, 961, 1377, 2830, 3234, 2228, 514, 459, 2799, 2507, 2383, 2515, 1917, 2617, 410, 966, 1685, 3251, 2135, 2910, 310, 999, 1428, 2153, 1082, 157, 336, 398, 2706, 2102, 643, 2493, 1464, 1569, 2378, 1221, 2471, 174, 2576, 721, 2689, 614, 303, 223, 710, 2205, 724, 1091, 2823, 576, 1710, 1972, 1524, 89, 1509, 1520, 2865, 2165, 1541, 1303, 1047, 1128, 1920, 3317, 2991, 2163, 1650, 1932, 2030, 2433, 3115, 376, 556, 1817, 839, 2698, 2316, 822, 1934, 50, 1299, 2961, 3240, 2212, 691, 148, 3239, 698, 321, 3154, 1743, 2713, 64, 2915, 444, 723, 2208, 645, 474, 1985, 2558, 2888, 1379, 53, 1675, 410, 1671, 2221, 1496, 2614, 1098, 4, 3325, 2043, 2059, 2991, 2307, 2704, 1422, 88, 682, 897, 478, 1576, 2699, 658, 2050, 2189, 364, 149, 2210, 3245, 2546, 1965, 2084, 901, 1083, 2854, 3265, 1808, 260, 1680, 2862, 3296, 1011, 2302, 1512, 688, 1287, 2895, 604, 2252, 3083, 2024, 938, 718, 1790, 2428, 294, 428, 2817, 209, 340, 1227, 3287, 2732, 2282, 2064, 1087, 1694, 3095, 1564, 1239, 2204, 2483, 1421, 1358, 1880, 1268, 434, 1552, 565, 20, 893, 2896, 1756, 2499, 2204, 574, 1211, 2151, 1210, 299, 960, 2134, 2990, 930, 2171, 2848, 1297, 3271, 1241, 2550], -[327, 2990, 1094, 2515, 2012, 2050, 1995, 1283, 486, 625, 2883, 245, 3038, 2509, 383, 524, 1019, 1128, 564, 314, 75, 3314, 425, 2395, 824, 31, 652, 2056, 587, 2799, 1466, 2818, 2306, 2785, 3113, 3246, 738, 382, 3306, 1503, 616, 184, 3142, 3259, 1168, 335, 1831, 1243, 1052, 9, 100, 2557, 1609, 20, 3229, 1640, 2221, 2405, 629, 508, 216, 2961, 2631, 1270, 2931, 1574, 2751, 2361, 2026, 1541, 210, 1043, 2443, 1143, 1923, 2032, 2688, 3139, 884, 1725, 644, 200, 2440, 565, 868, 1261, 2603, 2003, 484, 349, 1083, 1599, 1042, 2402, 508, 123, 1624, 352, 1537, 10, 1323, 1047, 1898, 1050, 2852, 2851, 1079, 275, 602, 931, 1956, 3212, 119, 1771, 2944, 2631, 3044, 1561, 725, 3244, 3282, 3236, 2764, 3121, 2703, 209, 3152, 120, 1035, 2101, 2675, 1320, 724, 2295, 1034, 504, 398, 3117, 13, 955, 1287, 2680, 2963, 2382, 415, 2417, 3284, 2099, 1668, 926, 3039, 2604, 1481, 438, 2263, 896, 1430, 1101, 494, 332, 3042, 2114, 2219, 1788, 1194, 2630, 589, 455, 2802, 1218, 2933, 865, 2761, 1921, 1625, 1521, 1448, 978, 514, 3153, 2354, 11, 3165, 3203, 12, 1042, 2122, 493, 1980, 1363, 947, 205, 672, 1565, 247, 918, 2205, 2249, 2083, 665, 672, 1724, 3326, 178, 341, 683, 1306, 2359, 2343, 578, 1846, 1704, 1676, 1248, 750, 3062, 712, 2959, 2430, 3004, 2082, 945, 548, 8, 3003, 3020, 2994, 1248, 2782, 2460, 1158, 3313, 2543, 1244, 721, 1804, 537, 924, 1560, 915, 1428, 1599, 490, 1916, 2237, 2342, 3031, 2823, 2350, 1063, 2087, 1721, 1099, 2391, 1478, 674]]] - -r: [[0, 2, 3328, 3328, 3327, 0, 0, 1, 3328, 0, 3328, 3328, 1, 2, 3328, 1, 3328, 0, 0, 0, 0, 1, 3, 0, 2, 2, 0, 0, 0, 0, 3327, 0, 3328, 2, 1, 0, 0, 0, 2, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 1, 3327, 0, 1, 1, 3327, 0, 0, 1, 1, 3328, 3327, 3328, 0, 0, 0, 0, 3328, 0, 0, 3327, 0, 0, 1, 0, 1, 3328, 3328, 2, 1, 1, 3328, 2, 3328, 1, 3328, 0, 0, 1, 0, 2, 0, 1, 2, 3328, 3328, 1, 1, 1, 1, 2, 3327, 1, 1, 1, 0, 3328, 0, 1, 2, 3328, 3328, 3328, 1, 1, 0, 3328, 1, 3328, 0, 3328, 3327, 1, 1, 1, 1, 0, 3328, 0, 1, 3328, 3326, 3327, 0, 1, 0, 3, 0, 1, 3328, 3328, 3327, 2, 1, 3, 1, 3327, 0, 1, 3328, 2, 0, 3327, 0, 3328, 3327, 0, 2, 1, 3328, 1, 1, 0, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 1, 3328, 1, 1, 1, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 0, 3328, 0, 1, 1, 0, 2, 1, 1, 3326, 3, 3328, 3328, 3328, 0, 1, 3327, 0, 3327, 1, 0, 3328, 0, 0, 0, 3328, 2, 1, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 2, 3327, 3328, 2, 2, 1, 3328, 1, 1, 0, 0, 3328, 1, 1, 1, 0, 3327, 3328, 3328, 3327, 3327, 0, 0, 3328, 1, 1, 3328, 2, 1, 0, 0], -[3328, 3328, 1, 1, 2, 3328, 3328, 1, 3327, 1, 3328, 3327, 3, 0, 0, 3328, 0, 0, 1, 0, 0, 3328, 1, 3328, 3328, 1, 3328, 3328, 3, 0, 3327, 1, 3328, 1, 2, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 2, 2, 1, 1, 1, 1, 0, 3328, 1, 3328, 3327, 0, 0, 3328, 1, 0, 3328, 0, 0, 3326, 0, 2, 0, 3328, 0, 0, 3327, 0, 1, 0, 2, 2, 1, 3328, 3327, 1, 3, 3328, 3327, 1, 1, 0, 1, 3328, 3327, 3327, 0, 1, 3, 3328, 0, 1, 3327, 0, 3328, 2, 0, 3328, 0, 2, 3327, 1, 3328, 1, 3328, 3328, 3328, 1, 1, 3327, 0, 3326, 3328, 2, 3327, 0, 3, 1, 0, 2, 2, 1, 0, 0, 0, 1, 3327, 1, 2, 2, 2, 3327, 1, 1, 3328, 0, 3328, 2, 1, 0, 1, 1, 1, 0, 0, 3328, 3328, 2, 0, 3328, 1, 0, 1, 1, 3327, 3328, 3327, 1, 3328, 3328, 3328, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3327, 3326, 3327, 0, 0, 1, 0, 1, 1, 0, 3326, 2, 0, 0, 0, 1, 3327, 1, 2, 1, 3327, 1, 0, 2, 1, 0, 3327, 0, 0, 3328, 3328, 1, 3327, 3327, 2, 0, 1, 3328, 3326, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 1, 0, 3328, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 1, 1, 3327, 1, 2, 0, 3328, 1, 0, 1, 2, 0, 0, 0, 1, 2, 3328]] - -e1: [[3328, 0, 0, 1, 2, 0, 3328, 0, 3328, 0, 0, 2, 3328, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3328, 3327, 3328, 2, 0, 0, 1, 0, 1, 0, 2, 1, 3328, 1, 3328, 0, 1, 2, 0, 1, 0, 0, 0, 3328, 3327, 0, 1, 3328, 3327, 0, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 0, 0, 0, 0, 0, 0, 3327, 1, 0, 3327, 0, 3328, 0, 0, 0, 3327, 3328, 3327, 1, 3328, 0, 3328, 0, 2, 2, 3328, 3328, 2, 1, 0, 0, 0, 1, 3327, 3327, 3328, 3327, 3328, 1, 3327, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 1, 0, 0, 3328, 0, 0, 0, 1, 3328, 1, 3327, 0, 3328, 3328, 0, 2, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 1, 3328, 0, 0, 3328, 0, 0, 1, 2, 3327, 1, 1, 0, 3328, 2, 3328, 1, 1, 1, 0, 1, 0, 2, 0, 0, 2, 0, 1, 0, 0, 2, 3328, 0, 3327, 3328, 3328, 0, 2, 1, 3328, 1, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 1, 3328, 3327, 0, 3328, 0, 0, 3328, 0, 1, 3328, 0, 1, 1, 3328, 3328, 3328, 1, 0, 2, 3327, 2, 3327, 1, 0, 1, 3328, 2, 3328, 3327, 1, 0, 0, 3328, 0, 3328, 1, 1, 0, 3328, 0, 1, 0, 2, 0, 3328, 3328, 2, 0, 0, 3328, 2, 3327, 0, 0, 0, 3328, 0, 1, 3328, 3328, 0, 0, 3328, 1, 0], -[1, 0, 0, 0, 0, 0, 1, 0, 0, 3327, 0, 0, 3328, 0, 3328, 3328, 1, 2, 1, 0, 0, 0, 0, 2, 3328, 1, 0, 1, 2, 3327, 2, 0, 3327, 0, 1, 1, 0, 2, 1, 0, 1, 2, 0, 2, 3328, 3328, 0, 1, 1, 0, 0, 0, 0, 3328, 0, 0, 1, 2, 0, 0, 2, 0, 3328, 3328, 1, 0, 1, 0, 2, 3328, 0, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 1, 2, 0, 0, 0, 0, 2, 3328, 0, 0, 3328, 3327, 1, 0, 3328, 3328, 1, 2, 0, 0, 0, 0, 1, 1, 3328, 1, 3328, 3328, 0, 3328, 2, 0, 3328, 0, 3328, 0, 1, 1, 0, 1, 3328, 0, 3327, 0, 0, 0, 1, 3328, 3328, 3327, 1, 0, 0, 0, 3328, 1, 3328, 1, 3328, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 1, 3328, 3328, 3327, 3328, 2, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 2, 0, 0, 3328, 1, 0, 1, 0, 3327, 0, 0, 1, 0, 1, 3327, 3328, 0, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3327, 3328, 2, 0, 3328, 3328, 3328, 0, 0, 3328, 3327, 0, 1, 0, 0, 3328, 0, 0, 3328, 1, 0, 3328, 3328, 3328, 0, 2, 0, 0, 3328, 3327, 0, 0, 2, 3328, 1, 0, 3328, 3328, 3328, 3328, 3328, 1, 3328, 0, 0, 0, 0, 0, 3328, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3327, 1, 1, 1, 0, 1]] - -e2: [1, 1, 1, 3328, 0, 3328, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 0, 0, 3327, 0, 0, 3328, 1, 2, 0, 0, 2, 1, 3328, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 0, 3328, 0, 0, 3328, 0, 2, 0, 0, 1, 0, 2, 3328, 0, 3327, 0, 1, 1, 0, 1, 2, 1, 1, 1, 0, 0, 0, 1, 3327, 1, 0, 0, 3327, 0, 1, 0, 1, 0, 1, 3327, 3327, 2, 0, 0, 1, 1, 3328, 3328, 0, 3328, 3327, 0, 1, 3327, 2, 1, 1, 3328, 1, 2, 3328, 0, 3328, 3328, 1, 2, 3327, 3328, 1, 0, 3328, 3328, 0, 0, 2, 0, 0, 0, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 2, 3328, 3327, 0, 3328, 3328, 3328, 1, 3328, 1, 0, 1, 0, 0, 1, 3327, 3327, 3328, 0, 0, 3328, 3327, 1, 3328, 3327, 2, 3328, 3327, 2, 1, 3328, 1, 0, 0, 0, 0, 1, 1, 3327, 0, 0, 0, 1, 0, 1, 1, 3328, 1, 3328, 3327, 1, 1, 2, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 3328, 0, 0, 1, 0, 3328, 0, 1, 3327, 3328, 1, 0, 1, 1, 0, 3328, 3328, 3327, 3328, 3328, 0, 3328, 0, 3328, 0, 2, 3328, 0, 0, 3328, 0, 1, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 0, 0] -rHat: [[1859, 3002, 1459, 1664, 1376, 1748, 2271, 3230, 32, 2576, 2658, 234, 3252, 1763, 1324, 635, 2205, 1894, 953, 1375, 1659, 1649, 2944, 2869, 3176, 3103, 2306, 1553, 304, 2679, 735, 561, 3117, 2017, 527, 888, 1853, 2191, 290, 228, 1274, 992, 1359, 2416, 1481, 2617, 3153, 606, 1072, 333, 1630, 833, 3030, 303, 1331, 1900, 566, 2927, 2126, 1823, 443, 442, 2283, 2262, 2674, 2690, 1286, 2859, 1166, 1385, 3056, 2408, 2850, 1495, 456, 2051, 2040, 2554, 2907, 1943, 1514, 2826, 2020, 242, 3276, 2554, 3119, 961, 1246, 955, 1608, 2697, 2451, 2670, 624, 27, 2372, 2130, 2136, 1820, 2375, 2146, 900, 1655, 2891, 2826, 2141, 2689, 528, 2409, 3135, 1014, 32, 2279, 621, 1779, 92, 1908, 1162, 2040, 247, 2523, 1911, 2141, 2085, 2, 1687, 2853, 1528, 1671, 528, 3000, 3040, 2018, 916, 114, 3196, 2196, 1876, 2508, 834, 2437, 1645, 1148, 2659, 1543, 2292, 2399, 1537, 1178, 2860, 821, 1578, 3039, 232, 1732, 2079, 1299, 494, 569, 2828, 1488, 2407, 2593, 1112, 13, 1233, 2269, 3199, 1034, 877, 3029, 2671, 3055, 2567, 3092, 1890, 3208, 1855, 2280, 2708, 2264, 2801, 1973, 418, 2370, 1785, 783, 694, 1755, 854, 2507, 2007, 236, 3197, 1625, 1632, 2522, 1555, 2027, 2927, 2840, 196, 2435, 1109, 1797, 1761, 2465, 2047, 500, 3248, 2507, 264, 2913, 970, 1505, 1122, 92, 1797, 3092, 1663, 56, 2334, 1668, 2254, 1771, 1780, 336, 1603, 2375, 767, 1679, 1510, 960, 2645, 3091, 430, 162, 2121, 3036, 122, 77, 3026, 2312, 2055, 2452, 889, 317, 1522, 1817, 392, 961, 1157, 1355, 1763, 1747], -[1396, 1200, 448, 2954, 1293, 2927, 1975, 933, 146, 1434, 2041, 2095, 1823, 2620, 711, 3141, 3152, 634, 1182, 416, 2474, 3280, 373, 1316, 3262, 1169, 1558, 342, 3177, 2735, 1538, 2137, 2401, 612, 2490, 2924, 1880, 2579, 1096, 319, 2294, 733, 1086, 2039, 2071, 2171, 1240, 2471, 2139, 128, 2939, 3175, 1350, 1374, 514, 2979, 748, 952, 475, 736, 110, 2567, 2024, 2719, 1812, 1023, 461, 2623, 1349, 666, 1226, 1488, 1629, 1294, 2623, 915, 2983, 1747, 2993, 2606, 3025, 188, 10, 209, 442, 3283, 1173, 4, 1504, 863, 1856, 3033, 174, 2137, 196, 2844, 3298, 3089, 2877, 596, 200, 1804, 2530, 1811, 136, 2285, 311, 230, 3322, 545, 352, 845, 755, 2275, 862, 1616, 2317, 1392, 3128, 1985, 3134, 1629, 686, 966, 1910, 3087, 3254, 1306, 1292, 116, 837, 2114, 1743, 2539, 3135, 204, 701, 2656, 86, 3181, 2501, 76, 3004, 2133, 2417, 2131, 1991, 2393, 918, 1488, 3269, 3160, 706, 1302, 2173, 1038, 967, 1768, 492, 115, 3320, 2759, 529, 108, 665, 2759, 1220, 248, 2926, 752, 846, 2846, 1462, 1596, 2427, 751, 190, 1171, 2597, 2740, 455, 938, 2866, 625, 2233, 2336, 2325, 2919, 1381, 3180, 2262, 1224, 2516, 1913, 265, 2104, 1209, 1718, 1463, 775, 2554, 373, 2742, 1494, 2545, 3025, 2248, 624, 3239, 2439, 449, 532, 1068, 2300, 1901, 1495, 2063, 1745, 2759, 369, 1118, 380, 534, 1496, 1212, 2392, 2617, 2525, 600, 445, 989, 2228, 1947, 2183, 614, 1039, 3244, 1482, 1104, 2314, 2300, 1219, 3155, 1912, 1283, 3011, 2028, 2021, 2450, 1424, 397, 3255, 868, 726, 1577, 409]] - -BHat * rHat: [[368, 1205, 1220, 520, 154, 1973, 2334, 175, 6, 1926, 228, 2816, 2562, 776, 1737, 1513, 278, 1914, 970, 553, 1784, 304, 2153, 2947, 1926, 2330, 2242, 3027, 397, 1160, 1904, 3038, 1905, 1497, 136, 1610, 49, 956, 1788, 3025, 871, 434, 1904, 1621, 2582, 1159, 1123, 140, 245, 947, 2166, 1148, 193, 1888, 3004, 2795, 18, 993, 2139, 2998, 691, 1431, 3146, 3156, 1242, 1383, 884, 913, 1753, 2866, 551, 2793, 1156, 2944, 573, 2610, 48, 1200, 1886, 2051, 2708, 1526, 2290, 273, 1678, 692, 3273, 1775, 1278, 508, 525, 1953, 783, 1418, 1755, 108, 395, 3184, 1456, 941, 2814, 519, 686, 3136, 2684, 2798, 2114, 1842, 543, 2400, 1959, 1800, 2907, 2908, 1920, 3210, 1412, 962, 2146, 1408, 1544, 823, 117, 3120, 2163, 457, 2644, 2044, 1122, 1152, 2660, 2959, 1642, 1062, 1741, 3080, 871, 864, 308, 2753, 339, 806, 139, 3011, 1971, 1603, 2145, 123, 2336, 2806, 457, 688, 1029, 695, 53, 2840, 2805, 408, 627, 807, 582, 1401, 1811, 2468, 2358, 1227, 2756, 2077, 378, 1309, 2573, 56, 3211, 681, 1068, 2073, 1192, 1140, 2575, 616, 1358, 905, 844, 2698, 2080, 940, 2319, 2494, 1765, 2141, 2472, 481, 3018, 2430, 2143, 1889, 2830, 2952, 504, 1247, 2757, 1505, 988, 686, 1329, 819, 1862, 3132, 1960, 3127, 1861, 876, 1097, 756, 2717, 1710, 684, 597, 1092, 40, 327, 1993, 166, 2921, 2705, 1982, 1623, 923, 834, 1437, 2807, 2587, 1767, 3154, 2628, 3121, 1448, 3326, 3151, 1804, 510, 2297, 1591, 1044, 2990, 1828, 1594, 3275, 1853, 2537, 74, 1059, 1517, 3148, 2724, 1788], -[1636, 1928, 1024, 2513, 1985, 3275, 3080, 2495, 1462, 969, 2904, 828, 2133, 129, 825, 1494, 783, 1421, 1070, 662, 2001, 2652, 1188, 2452, 3310, 45, 1085, 2849, 576, 1640, 2429, 1386, 1894, 2809, 2880, 130, 1433, 688, 643, 2448, 1633, 2777, 1211, 2426, 1359, 3299, 647, 1961, 2675, 2079, 1358, 1475, 870, 2074, 2210, 2549, 2408, 2109, 274, 2941, 3102, 2704, 1180, 2510, 1089, 1668, 2851, 1457, 3319, 2836, 3093, 1585, 1370, 490, 678, 2338, 2127, 613, 1276, 3149, 876, 2110, 706, 2841, 3048, 2488, 2486, 2741, 2140, 927, 978, 1442, 2152, 1703, 674, 23, 756, 726, 1217, 2849, 2528, 490, 2623, 567, 3169, 1953, 3299, 2067, 2221, 3123, 1904, 2555, 2139, 206, 70, 1099, 669, 246, 2799, 2828, 2592, 1005, 20, 306, 2115, 2917, 3153, 742, 2101, 2586, 1482, 280, 662, 1151, 2084, 3000, 1456, 1509, 292, 2914, 3324, 646, 1909, 2950, 479, 348, 1411, 1216, 1351, 638, 328, 269, 3032, 2445, 1910, 465, 1969, 45, 1360, 582, 3214, 97, 320, 298, 834, 2023, 2199, 2401, 38, 1438, 965, 720, 152, 965, 2348, 659, 19, 682, 1588, 2416, 243, 1944, 921, 1739, 992, 823, 2542, 1942, 70, 1907, 2200, 1180, 2479, 2947, 1587, 2559, 87, 1132, 2621, 369, 171, 1557, 79, 1261, 2623, 2305, 3189, 2226, 3024, 1626, 2158, 516, 868, 792, 2069, 2995, 1730, 2263, 1905, 1092, 484, 2507, 1082, 888, 2070, 654, 3190, 292, 307, 3161, 2697, 1986, 1403, 901, 2761, 848, 1786, 3312, 887, 1446, 2556, 2197, 3007, 1821, 3095, 2429, 2910, 432, 2448, 2364, 2541, 3066, 338, 2861, 2803, 1919]] -NTTInverse(BHat * rHat): [[1954, 1346, 1561, 2402, 2082, 2172, 713, 1618, 1556, 529, 545, 2116, 171, 357, 2189, 3225, 3041, 2117, 2709, 2684, 3018, 2481, 2380, 1743, 2956, 483, 975, 2951, 2508, 3057, 3225, 1070, 85, 973, 2803, 2854, 1088, 1105, 941, 942, 2284, 1184, 2830, 351, 778, 1567, 946, 2593, 1283, 1569, 949, 510, 1102, 731, 2200, 979, 1697, 746, 149, 815, 1370, 3069, 2156, 567, 1978, 1277, 1928, 1699, 2594, 692, 1890, 1503, 351, 1925, 116, 166, 477, 2961, 610, 1142, 1327, 1668, 3139, 157, 2415, 1690, 3073, 345, 573, 443, 2931, 2937, 2767, 1411, 182, 654, 2084, 1922, 2702, 842, 1372, 1301, 2641, 1946, 747, 609, 1712, 946, 3109, 1556, 1444, 2571, 2267, 1509, 439, 1361, 1534, 1436, 2768, 57, 120, 2808, 811, 2091, 2616, 131, 1488, 2424, 1942, 628, 3110, 1074, 1418, 2568, 2945, 3253, 3110, 124, 765, 2421, 9, 2064, 312, 1484, 2794, 893, 2175, 1546, 784, 508, 9, 923, 1413, 1065, 470, 253, 1991, 1815, 1833, 1769, 3274, 1658, 3097, 1726, 2606, 60, 607, 2184, 2823, 2430, 3153, 2004, 920, 1765, 1626, 1603, 1327, 2325, 1038, 1466, 778, 3034, 599, 1194, 184, 3145, 501, 46, 289, 492, 3072, 403, 437, 1497, 1863, 1357, 919, 1662, 1113, 1337, 3275, 3063, 1770, 1536, 3051, 479, 1648, 2206, 634, 2823, 2888, 3126, 2092, 818, 182, 2386, 1232, 991, 2450, 2050, 2001, 3081, 1879, 1756, 1462, 624, 17, 568, 2531, 777, 3075, 2684, 21, 1727, 830, 3229, 2334, 1453, 767, 2059, 1720, 796, 780, 2562, 2477, 317, 2187, 2862, 1023, 529, 3141, 1628, 1585, 277, 3106, 2480], -[586, 3093, 251, 2710, 1969, 1081, 1181, 1433, 1108, 1107, 399, 1048, 1366, 846, 1998, 743, 579, 929, 2878, 2923, 2512, 3241, 3252, 488, 1180, 2798, 1010, 2834, 2825, 676, 3105, 96, 2148, 2627, 2882, 1152, 1968, 426, 2390, 1936, 192, 862, 1317, 3292, 656, 3276, 720, 2661, 3090, 3067, 737, 704, 145, 242, 1123, 1712, 2929, 2776, 1057, 1762, 3244, 411, 3232, 601, 1888, 2482, 1298, 2287, 1461, 944, 1142, 1309, 1950, 1886, 1819, 2243, 3025, 1056, 1745, 477, 3109, 2099, 2219, 1725, 1167, 1732, 2222, 1571, 1718, 1644, 2529, 1252, 3249, 1127, 3209, 3170, 3312, 3303, 8, 1399, 3073, 3274, 3053, 2501, 1481, 2432, 3245, 1518, 1784, 1459, 2310, 3195, 1629, 1507, 1421, 1794, 490, 63, 899, 1656, 726, 3219, 2191, 309, 1422, 733, 355, 2857, 3324, 303, 1906, 1805, 70, 2561, 3031, 728, 1303, 1262, 848, 156, 569, 3106, 1308, 750, 2230, 3038, 1640, 2623, 623, 1655, 2795, 1206, 2318, 2756, 1525, 151, 1031, 1432, 2378, 2271, 1804, 726, 669, 1265, 4, 404, 2758, 1879, 1089, 2790, 2088, 1287, 1111, 2643, 327, 2684, 2948, 2247, 1555, 2490, 1601, 234, 2484, 192, 1495, 1157, 3328, 1183, 3049, 2748, 127, 2047, 659, 3158, 1596, 2146, 3287, 228, 1064, 920, 3096, 40, 359, 328, 1253, 3247, 334, 37, 1873, 1937, 1208, 1138, 2190, 3215, 1318, 2667, 1805, 460, 453, 1732, 499, 597, 381, 954, 2752, 1798, 1608, 3056, 3274, 3082, 2792, 2553, 2056, 635, 1935, 59, 909, 2448, 2486, 3161, 1121, 1408, 1591, 529, 1193, 1237, 1590, 506, 31, 2969, 1477, 2038, 1469, 1581, 1873, 3069]] -u = NTTInverse(BHat * rHat) + e1: [[1953, 1346, 1561, 2403, 2084, 2172, 712, 1618, 1555, 529, 545, 2118, 170, 357, 2189, 3225, 3041, 2117, 2709, 2685, 3019, 2481, 2381, 1742, 2954, 482, 977, 2951, 2508, 3058, 3225, 1071, 85, 975, 2804, 2853, 1089, 1104, 941, 943, 2286, 1184, 2831, 351, 778, 1567, 945, 2591, 1283, 1570, 948, 508, 1102, 732, 2201, 980, 1696, 746, 148, 815, 1371, 3069, 2155, 566, 1977, 1277, 1928, 1699, 2594, 692, 1890, 1501, 352, 1925, 114, 166, 476, 2961, 610, 1142, 1325, 1667, 3137, 158, 2414, 1690, 3072, 345, 575, 445, 2930, 2936, 2769, 1412, 182, 654, 2084, 1923, 2700, 840, 1371, 1299, 2640, 1947, 745, 609, 1712, 946, 3109, 1557, 1445, 2569, 2267, 1509, 440, 1361, 1534, 1435, 2768, 57, 120, 2809, 810, 2092, 2614, 131, 1487, 2423, 1942, 630, 3111, 1073, 1418, 2567, 2946, 3252, 3109, 123, 766, 2420, 9, 2064, 311, 1484, 2794, 894, 2177, 1544, 785, 509, 9, 922, 1415, 1064, 471, 254, 1992, 1815, 1834, 1769, 3276, 1658, 3097, 1728, 2606, 61, 607, 2184, 2825, 2429, 3153, 2002, 919, 1764, 1626, 1605, 1328, 2324, 1039, 1466, 777, 3034, 598, 1194, 185, 3146, 500, 45, 288, 493, 3073, 402, 435, 1497, 1862, 1357, 919, 1661, 1113, 1338, 3274, 3063, 1771, 1537, 3050, 478, 1647, 2207, 634, 2825, 2886, 3128, 2090, 819, 182, 2387, 1231, 993, 2449, 2048, 2002, 3081, 1879, 1755, 1462, 623, 18, 569, 2531, 776, 3075, 2685, 21, 1729, 830, 3228, 2333, 1455, 767, 2059, 1719, 798, 778, 2562, 2477, 317, 2186, 2862, 1024, 528, 3140, 1628, 1585, 276, 3107, 2480], -[587, 3093, 251, 2710, 1969, 1081, 1182, 1433, 1108, 1105, 399, 1048, 1365, 846, 1997, 742, 580, 931, 2879, 2923, 2512, 3241, 3252, 490, 1179, 2799, 1010, 2835, 2827, 674, 3107, 96, 2146, 2627, 2883, 1153, 1968, 428, 2391, 1936, 193, 864, 1317, 3294, 655, 3275, 720, 2662, 3091, 3067, 737, 704, 145, 241, 1123, 1712, 2930, 2778, 1057, 1762, 3246, 411, 3231, 600, 1889, 2482, 1299, 2287, 1463, 943, 1142, 1309, 1950, 1886, 1821, 2242, 3026, 1056, 1745, 476, 3110, 2101, 2219, 1725, 1167, 1732, 2224, 1570, 1718, 1644, 2528, 1250, 3250, 1127, 3208, 3169, 3313, 3305, 8, 1399, 3073, 3274, 3054, 2502, 1480, 2433, 3244, 1517, 1784, 1458, 2312, 3195, 1628, 1507, 1420, 1794, 491, 64, 899, 1657, 725, 3219, 2189, 309, 1422, 733, 356, 2856, 3323, 301, 1907, 1805, 70, 2561, 3030, 729, 1302, 1263, 847, 155, 570, 3105, 1308, 751, 2231, 3037, 1641, 2622, 623, 1657, 2796, 1205, 2317, 2754, 1524, 153, 1031, 1432, 2379, 2272, 1805, 726, 670, 1266, 4, 404, 2760, 1879, 1089, 2789, 2089, 1287, 1112, 2643, 325, 2684, 2948, 2248, 1555, 2491, 1599, 233, 2484, 192, 1496, 1156, 3328, 1184, 3050, 2747, 127, 2047, 658, 3156, 1595, 2148, 3287, 227, 1063, 919, 3096, 40, 358, 326, 1253, 3248, 334, 37, 1872, 1937, 1208, 1137, 2191, 3215, 1317, 2666, 1804, 460, 455, 1732, 499, 596, 379, 954, 2752, 1800, 1607, 3057, 3274, 3081, 2791, 2552, 2055, 634, 1936, 58, 909, 2448, 2486, 3161, 1121, 1407, 1592, 530, 1191, 1237, 1589, 507, 30, 2970, 1475, 2039, 1470, 1582, 1873, 3070]] - -mu: [0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 0, 1665, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 0, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 0, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 0] -tHat^T * rHat: [2898, 604, 1851, 197, 557, 1080, 2663, 933, 720, 668, 749, 1062, 1483, 1476, 2960, 3036, 1765, 1359, 218, 2737, 2553, 462, 2252, 354, 1127, 347, 1348, 1699, 2478, 1293, 2625, 906, 2098, 1280, 1579, 728, 149, 3146, 2194, 1059, 1410, 2619, 997, 1785, 2820, 2761, 761, 2061, 181, 2980, 3068, 1359, 1662, 782, 2010, 699, 884, 1048, 617, 624, 1691, 81, 2861, 676, 2791, 206, 2391, 1580, 1438, 850, 1898, 2109, 2720, 1645, 2249, 3107, 2672, 3237, 1103, 468, 910, 594, 1827, 775, 934, 3169, 1070, 1433, 1175, 693, 2250, 320, 2731, 1428, 2938, 2619, 1695, 3008, 2426, 3271, 56, 310, 271, 1992, 107, 2799, 2512, 467, 35, 622, 2631, 1385, 2686, 593, 252, 531, 1783, 1991, 1599, 2361, 3057, 351, 899, 2698, 783, 2618, 1876, 367, 1074, 52, 3165, 1141, 2789, 1714, 3135, 3309, 2522, 1471, 681, 207, 1334, 622, 418, 3034, 1884, 2753, 2536, 2857, 935, 1322, 2436, 1783, 1149, 144, 449, 2373, 3175, 2481, 2831, 2889, 2556, 866, 622, 1406, 2082, 2905, 1659, 753, 2708, 1557, 2755, 186, 2609, 2913, 682, 2745, 2057, 1080, 2787, 1890, 2345, 653, 2151, 2866, 2966, 588, 601, 2193, 459, 502, 727, 1304, 2099, 1200, 1624, 2509, 2910, 20, 1596, 198, 2915, 1272, 701, 1040, 2329, 323, 793, 1409, 2345, 2112, 544, 237, 2468, 1139, 2860, 789, 3030, 577, 352, 1310, 862, 1729, 1967, 2303, 834, 1753, 2271, 356, 3272, 973, 1334, 1513, 552, 42, 325, 2105, 37, 1164, 1976, 166, 1473, 2088, 485, 1945, 454, 666, 288, 2608, 3144, 121, 730, 2849, 1823, 1620, 55, 1461] -NTTInverse(tHat^T * rHat): [619, 2111, 495, 3086, 1708, 2575, 1456, 2210, 3041, 2742, 2098, 3252, 2817, 563, 2989, 768, 1240, 1666, 2270, 385, 1667, 52, 3302, 3155, 520, 1750, 742, 2379, 1962, 1056, 2747, 2281, 2575, 131, 2532, 31, 2060, 2972, 2587, 734, 1013, 1051, 2209, 1470, 1552, 2181, 3082, 338, 2982, 1455, 2472, 685, 1576, 1443, 1139, 50, 201, 2373, 1957, 717, 2787, 2950, 3013, 2403, 1364, 361, 2847, 1063, 174, 1698, 1539, 2669, 3038, 636, 659, 2291, 1259, 82, 1523, 581, 2524, 392, 3100, 2847, 1038, 2746, 23, 2669, 1076, 1034, 3234, 2790, 2650, 1380, 3039, 1605, 2565, 127, 2442, 2758, 579, 495, 2510, 3169, 2450, 274, 1849, 1691, 2280, 523, 1361, 252, 108, 2708, 852, 1381, 2999, 714, 2995, 1596, 713, 1402, 1746, 2727, 2152, 2127, 2957, 2889, 3305, 1762, 1863, 715, 3261, 2306, 1267, 1410, 1288, 1353, 3289, 224, 2433, 3119, 2208, 3227, 2664, 2168, 158, 1760, 2356, 965, 1484, 2864, 2377, 297, 227, 2099, 1129, 1150, 132, 34, 865, 2040, 1403, 422, 3202, 2231, 2703, 3013, 1216, 1791, 288, 3235, 1150, 3176, 628, 1581, 2397, 2726, 461, 295, 2414, 3327, 1897, 211, 444, 3181, 2242, 2974, 539, 2391, 3091, 2360, 1393, 2294, 3018, 1880, 1651, 1807, 1370, 448, 1832, 1566, 2529, 1121, 2210, 125, 874, 1002, 3204, 2720, 2624, 2630, 2780, 2283, 3176, 2590, 3282, 2094, 409, 35, 217, 2400, 3143, 649, 118, 242, 1685, 2327, 2268, 1264, 701, 3035, 713, 2364, 2667, 1838, 593, 1713, 1872, 1164, 2830, 700, 742, 2714, 1303, 525, 2451, 338, 652, 1462, 927, 3254, 1730, 534, 2147, 1083] -e2 + mu: [1, 1, 1, 3328, 1665, 3328, 0, 1, 0, 1665, 3328, 1666, 1664, 1, 3328, 1666, 3328, 3328, 1664, 1, 0, 1665, 3327, 0, 1665, 1664, 1666, 1667, 0, 0, 2, 1666, 3328, 0, 1, 1665, 3328, 1664, 1665, 1664, 1663, 3328, 1666, 1, 0, 3328, 3328, 0, 1665, 1664, 1664, 1666, 0, 1664, 0, 0, 3328, 0, 1667, 0, 0, 1, 0, 1667, 1664, 1665, 1663, 0, 1, 1666, 0, 1, 1667, 1666, 1666, 1666, 1665, 0, 0, 1, 1663, 1, 1665, 0, 1663, 1665, 1666, 1665, 1666, 1665, 1, 1663, 1663, 1667, 1665, 0, 1, 1, 1664, 1664, 0, 1664, 3327, 1665, 1666, 3327, 1667, 1, 1666, 3328, 1, 2, 1664, 1665, 3328, 1664, 1, 1667, 1663, 3328, 1666, 1665, 3328, 1664, 1665, 0, 2, 0, 0, 1665, 1666, 0, 3328, 1664, 0, 1666, 1664, 3328, 1666, 0, 2, 1664, 3327, 1665, 1664, 3328, 3328, 1666, 3328, 1, 0, 1, 1665, 0, 1666, 1663, 3327, 3328, 1665, 1665, 1664, 3327, 1666, 1664, 3327, 2, 1664, 1663, 2, 1, 1664, 1666, 1665, 1665, 0, 1665, 1666, 1, 3327, 1665, 0, 0, 1666, 1665, 1, 1, 1664, 1666, 3328, 1663, 1666, 1, 1667, 3328, 1665, 1664, 1, 3328, 1665, 1664, 1665, 3328, 0, 0, 1666, 1665, 3328, 1665, 1, 3327, 1664, 1666, 0, 1, 1666, 1665, 3328, 3328, 3327, 1664, 1664, 1665, 3328, 1665, 3328, 0, 1667, 1664, 1665, 0, 1664, 0, 1, 0, 1665, 0, 1, 1664, 0, 1665, 1665, 1665, 0, 3328, 1664, 0, 0, 1666, 1665, 0, 1665, 3328, 1665, 0, 0, 0] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [620, 2112, 496, 3085, 44, 2574, 1456, 2211, 3041, 1078, 2097, 1589, 1152, 564, 2988, 2434, 1239, 1665, 605, 386, 1667, 1717, 3300, 3155, 2185, 85, 2408, 717, 1962, 1056, 2749, 618, 2574, 131, 2533, 1696, 2059, 1307, 923, 2398, 2676, 1050, 546, 1471, 1552, 2180, 3081, 338, 1318, 3119, 807, 2351, 1576, 3107, 1139, 50, 200, 2373, 295, 717, 2787, 2951, 3013, 741, 3028, 2026, 1181, 1063, 175, 35, 1539, 2670, 1376, 2302, 2325, 628, 2924, 82, 1523, 582, 858, 393, 1436, 2847, 2701, 1082, 1689, 1005, 2742, 2699, 3235, 1124, 984, 3047, 1375, 1605, 2566, 128, 777, 1093, 579, 2159, 2508, 1505, 787, 272, 187, 1692, 617, 522, 1362, 254, 1772, 1044, 851, 3045, 3000, 2381, 1329, 1595, 2379, 3067, 1745, 1062, 488, 2127, 2959, 2889, 3305, 98, 200, 715, 3260, 641, 1267, 3076, 2952, 1352, 1626, 224, 2435, 1454, 2206, 1563, 999, 2167, 157, 97, 2355, 966, 1484, 2865, 713, 297, 1893, 433, 1127, 1149, 1797, 1699, 2529, 2038, 3069, 2086, 3200, 2233, 1038, 1347, 1218, 1792, 1952, 1572, 2815, 1512, 628, 3246, 734, 2727, 459, 1960, 2414, 3327, 234, 1876, 445, 3182, 577, 1311, 538, 725, 1428, 2361, 3060, 2293, 1354, 215, 1652, 1806, 3035, 2112, 168, 1565, 2529, 1121, 547, 1790, 873, 2667, 3205, 2718, 959, 967, 2780, 2284, 1513, 926, 3281, 2093, 407, 1699, 1881, 736, 3142, 2314, 117, 242, 23, 662, 604, 1264, 2365, 3035, 714, 2364, 1003, 1838, 594, 48, 1872, 2829, 1166, 2365, 742, 2713, 2967, 525, 2451, 2004, 2317, 1462, 2592, 3253, 66, 534, 2147, 1083] - -c: 597A06DEB88172BA8D7CDE8D82CAA234B8112AF8A72F1AB4CEA1EFCB2D868D53D212E303B70E7E521AB0F4B5DB4F51159248BFB275361BEF883752C78B8D4712275385536A4B0A96E3C23EA6C17EA92B602616E5821E5753A4736C4039C20C923CCECB579805587C0CE72218BB1AB12452F8E154CB8643328142F9B340A641C6F295E5ECF2E048BC7FC79BC5B94277C868D8E536B50425809DCFA024A3905CBA550AD3BB52B459AC38FABC9BC00EBA03EC0906725B4FE4E976F174320047B31D15891365BA482388F0FB973B85224FB00BA865AFAB3C9A1B7D489F7B982D0BD470EF948ECB5B3920AF89035960123B1F8630D763681BFD671567EFBB1E6276AA4FB2DFA9C3948DB7F083F28383B77BC514AF9D68D22E2487C20163C02B0BBF23BBCE0650F84FF8CE02C74E9E11D6F30EC5FA8A012ADC3B89627C7DE855C1FBBEB5DCDE84D05E36C5566E5551B58750A411642639B27864F7E005978FFE256B757D13DA663FC3BB0794A27CF7585D12F22D953B285459FDC9BCDFCDCCB7BF3E4E362D2891D583855F5D9487E6FB217E2E45EE0BD9AFC289F4D564581209A3ACA31795A124BD1BBAEA846755C8EA7810EAA73060E86FB5FDF3FBE72F806BB1BFBFBAC0C7B16BFE74250277ECF5F541571B8A975050917FDF781FEA17B585E3C6DBFE77B1E48A16504C3A38901156100CAFEC2ED939AE9A9EDFC9C0F8C7F55CC93E5DDD0B3DE1C6EDAE2B7EE34C6101F011B5904F693D286356B54C86CE8BCFEA9DBFEC21C1EF0ECC9105005BAA377D829DCA2CBF5EA5F31B71D446B833E00619819D7FC6024052499757A2765F19CD2B36C2488599DC5247494FABE81EEBEFD3BE75C4780E43A50418C5DB2FF359C5A6DE286EF5951E2709486EDC9CC49D0724ECA3F2C0B75F8A36CE862388F00B3C593D1C8C6AC45D73A72FF6B4F805B131ED4EAF5601D7B73B0E3724E75D58DD50F5871C54A37C1481331759F4BE86FB58A2EE003130F66E187C8BA5015BE713296589ACAFBF6596897E03D4920C91F26333B7BF1798AF815C93D4DF55BD47A08249BF113063FBB39503E9B6D43EAC7B0C305A diff --git a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt deleted file mode 100644 index 835173cf5..000000000 --- a/tests/PQC Intermediate Values/Encapsulation -- ML-KEM-768.txt +++ /dev/null @@ -1,50 +0,0 @@ -Encapsulation -- ML-KEM-768 -ek: 1456A2EE8C3556054ABC79B4882C3190E5CA726AB402E5B09728C0F4F79C9FC2ADD828ABE432B1501B60F46CCBC86A3378C34895708A13671B20B389479AAA01C69D6B3B7D07D1C3AB54B91C580F5A336B30069A4F134FFD3764CE73A047E2844771742BF4710B972D4F6590A1C53A975368C271B670F1A4036441054A66E8815997512288552FD7149FFB705AAE133F8414060D0092FA8A1627D78AB2ABC6696288BAF5C60EF370827A7EFA72AE5C6741A5DA043D5940F121485372A98F472D60F05F74D95F01A1991E73A3E0A9536467A4738AB4CF385BA772827EB8CC058B3572E40B598444C181C7F6D9B760A7B907092E9C3351EA234E4449BD9B61A134654E2DA191FF0793961569D3594448BBC2586999A6671EFCA957F3A6699A4A1B2F4707ABA0B2DB20114FE68A4E2815AF3AAC4B8C6BE5648C50CC35C27C57288028D361708D302EEBB860BEE691F656A2550CB321E9293D7516C599817B766BA928B108779A1C8712E74C76841AC58B8C515BF4749BF715984445B2B53063384001E55F68867B1AF46CA70CA8EA74172DB80B5218BDE4F00A0E658DB5A18D94E1427AF7AE358CCEB238772FCC83F10828A4A367D42C4CB6933FDD1C1C7B86AD8B009657A96222D7BA92F527AF877970A83247F47A23FC2285118B57717715204674DA9C94B62BC7838CF87200156B26BA4671159931C49322D80671A0F332EAA2BBF893BE408B9EAC6A505483AA9075BD1368B51F99211F480A9C542A75B5BE08E43ADAF301DD729A85954010E64892A2AA4F15C0BD70B3D856494FF9BA0FE4CE12991CA06B5E3D0B2AF1F797B7A2B760910AE9F833D0D4267A58052C2990F161B886E251711C09D085C3D958B144192C9CC3224A460715B6784EB0B26F237187507D85C5110ACC71CE47198F254553356DAB448C38D243A7C02BE40C908C828D05C081DFAB8FC6B5CFE7D56E7317157DC053B2B3489986B081288871818585E09931095E3274A084115BE276438254A796270A7B4306F08B98D9C2AAECF7065E74446B7C696DBAAF8B4625A10B07827B4A8BABAB09B64AE1C375BB785441F319FB9AC2F14C95FFB252ABBB809C6909CD97706E40691CBA61C9252BD38A04311CA5BB2CA79578347505D0888851E082648BD003BE97C0F8F66759EC96A96A081C6822C4510559537042FC15F069A649B74A10961B354A1F625B04E25B293CF65FB4F53A80CC733D7A175775BF8A9ABB9201620E83A7F3E724D1287DBC44BDD5D85FC71545A927BEEDE537A7768735CC1486C7C3F31104DB67343F435D2D45554BAAC9CDB5822E8422AE8321C78ABE9F261FD4810A79E33E94E63B3341872C92253521997C084FBC060B8B125CCC88AC85AC5FE3168ACB059B3F119C4E050A20732F501BB9B3E687C846B5C2653F8886373E1004A2AB8D1BB970A7E571D8A46EE81B782F26942DD394FDD9A5E4C5631D985528604B1CC976275B6AC8A67CEEC10FFACBBA3D3BB141321DFC3C9231FC96E448B9AB847021E2C8D90C6BCAF2B1240783B62C79DEDC072A5763E660AF2C27C3F0C3C09207CAD990BB41A7BFCEC99F51596A0E83778F85C006AC6D1FE981B4C4BA1CB575A7D07AE2D31BA760095F74BC163841CF8FF77F894ABC6D261ED87A4530363B949C4AD24EFB3A56809478DDA2 -m: 40BE9DCAC16E9CA73D49D0C83F9D3D89BB71574A4219A0F393DFECE2988394C4 - -K: 616E0B753A3B7F40FEF9A389F58F16BFBB04622941D2464BDAE767820DFAC38E -r: DF3BF6F2937BC204C19CB6531298C968C4099B04718020BED6C7F3B0D1A33AFB -tHat: [[1556, 2597, 3310, 856, 1366, 1184, 2492, 2887, 3208, 786, 1424, 3246, 2674, 2886, 1282, 2830, 2199, 3074, 2036, 2511, 671, 2780, 2264, 2738, 740, 2835, 2896, 1537, 3316, 3254, 2760, 822, 888, 1164, 149, 2215, 1811, 438, 800, 2203, 2631, 2729, 1537, 2524, 2923, 2003, 263, 3133, 1195, 2965, 2076, 245, 858, 1715, 1584, 2464, 847, 1265, 2045, 1603, 974, 2567, 583, 2126, 327, 1863, 1067, 1823, 1803, 729, 1359, 2310, 1441, 940, 919, 1669, 450, 2919, 368, 2639, 1027, 1046, 2565, 1636, 488, 1432, 407, 549, 1416, 757, 1239, 2545, 251, 1447, 942, 1009, 1156, 97, 13, 2336, 2810, 360, 1831, 2221, 2994, 3178, 617, 2182, 1466, 3183, 782, 1807, 2690, 2023, 762, 2791, 1884, 1046, 2725, 77, 2365, 1029, 497, 1154, 595, 2711, 1935, 724, 96, 1535, 2420, 1533, 257, 2458, 798, 2615, 2528, 1338, 1892, 2630, 2675, 2888, 2255, 1459, 679, 2087, 2174, 3275, 2821, 856, 1138, 190, 1113, 1096, 449, 3192, 2550, 2941, 1888, 2970, 2311, 736, 924, 1299, 1002, 1250, 2372, 3028, 411, 2582, 1332, 1254, 301, 2330, 2047, 2352, 1430, 1681, 2515, 1093, 2888, 3115, 2392, 2454, 1958, 486, 2556, 1402, 1779, 1690, 2714, 436, 1839, 116, 171, 2858, 219, 274, 1615, 2222, 2126, 338, 2735, 2755, 3147, 1720, 1253, 2246, 3152, 860, 3266, 1399, 40, 648, 467, 1798, 141, 739, 2283, 1547, 1726, 2334, 1782, 2597, 3157, 2864, 2337, 670, 1341, 359, 2501, 2073, 1659, 1719, 2217, 2834, 1800, 2471, 1820, 296, 3303, 1892, 2692, 3153, 3211, 1304, 1115, 1871, 1947, 351, 1176, 1108, 1458, 779, 2147, 1027], -[1281, 1534, 1640, 1976, 1050, 1743, 3239, 2688, 1258, 375, 2093, 187, 2130, 3025, 228, 175, 1294, 2262, 437, 2266, 404, 1070, 1914, 2799, 3125, 3304, 2226, 1907, 3119, 2108, 2289, 640, 932, 1658, 3284, 1218, 950, 1017, 3293, 449, 1659, 2776, 139, 2400, 2391, 1578, 1826, 2989, 1426, 639, 1967, 1944, 2160, 810, 1095, 1967, 3107, 559, 389, 2225, 343, 1911, 21, 1122, 2676, 2509, 1684, 699, 967, 2248, 760, 7, 2837, 614, 1722, 1812, 2325, 793, 964, 553, 1752, 1808, 928, 815, 746, 3002, 1016, 3049, 2880, 2536, 2732, 1286, 852, 2728, 1424, 3031, 2067, 2902, 2335, 537, 2079, 164, 1180, 677, 1397, 3051, 1032, 942, 986, 31, 733, 2471, 1413, 1033, 1552, 1166, 658, 2730, 1359, 3073, 189, 2871, 1752, 1173, 2383, 2991, 1039, 3310, 2322, 457, 2976, 1510, 2877, 672, 2033, 2431, 695, 2938, 352, 169, 2281, 831, 1232, 621, 2170, 85, 2348, 2306, 497, 2950, 646, 1310, 3185, 145, 1488, 3128, 2265, 2837, 2372, 705, 924, 556, 1610, 116, 1557, 1931, 78, 2859, 879, 1810, 135, 2005, 1413, 284, 3082, 1820, 1998, 404, 1423, 1106, 1363, 1747, 1195, 2244, 568, 1085, 167, 700, 3300, 2304, 652, 2264, 5, 2076, 3039, 2298, 1478, 3323, 1511, 1773, 1907, 337, 125, 1340, 946, 1163, 1689, 2824, 2177, 2178, 369, 2136, 133, 2462, 2353, 1504, 1074, 2567, 388, 1457, 1762, 1079, 1154, 2677, 1942, 162, 891, 100, 3056, 2440, 729, 2732, 2028, 111, 1118, 1095, 3179, 1687, 2669, 2811, 1675, 596, 2977, 112, 2946, 1191, 2955, 2746, 1545, 1195, 993, 1884, 2235, 1351, 833, 415], -[2811, 3113, 3313, 2388, 767, 1323, 2987, 2059, 2460, 150, 1997, 1801, 110, 1684, 2588, 1563, 1481, 690, 2771, 72, 3121, 2641, 3259, 2674, 2197, 839, 1397, 3328, 2184, 1304, 736, 1608, 139, 61, 1982, 3081, 1784, 1663, 3161, 2414, 2729, 134, 2076, 550, 452, 85, 857, 1797, 3138, 351, 2544, 2662, 1865, 1195, 1552, 441, 2613, 500, 2914, 69, 3042, 661, 1596, 1535, 1460, 943, 3200, 1852, 2621, 375, 1367, 3063, 2698, 3001, 402, 1568, 782, 2680, 2035, 590, 2257, 2002, 1212, 3028, 2261, 1533, 1479, 1105, 1961, 3042, 1517, 894, 1703, 2167, 3125, 332, 1926, 3132, 499, 65, 2011, 838, 831, 1492, 1325, 1364, 2635, 3226, 1485, 2091, 1070, 552, 942, 536, 2759, 3048, 1695, 498, 468, 168, 889, 1006, 1684, 958, 307, 2164, 556, 601, 309, 2450, 2172, 1264, 1724, 176, 651, 1473, 2252, 2760, 3205, 1530, 1763, 2209, 1483, 2480, 319, 2497, 1358, 160, 800, 759, 2896, 2961, 1715, 2174, 1736, 2900, 1474, 1014, 1672, 888, 62, 65, 2978, 2266, 2331, 1803, 1447, 1822, 1240, 1770, 3048, 1921, 1583, 2370, 813, 2381, 2557, 2653, 1508, 1596, 2077, 1369, 40, 1206, 2332, 1900, 2855, 1701, 1736, 1994, 494, 252, 3066, 2988, 2877, 2835, 577, 467, 3324, 2339, 3121, 2415, 2276, 2964, 1195, 1800, 545, 3214, 3289, 1712, 714, 2847, 1828, 2096, 3254, 1938, 3294, 125, 1834, 1589, 230, 2806, 1836, 3122, 1008, 3084, 1938, 3232, 217, 3001, 1857, 3066, 2510, 2556, 2385, 1701, 782, 1912, 1423, 3080, 3078, 1754, 2335, 2078, 1204, 2988, 1308, 1883, 167, 1965, 994, 445, 167, 150, 1119, 3015]] - -bHat = aHat^T: [[[2269, 1855, 3190, 1178, 1407, 2272, 1027, 2845, 2746, 1751, 72, 2945, 186, 951, 2139, 1192, 680, 13, 3106, 1489, 1902, 3294, 1138, 763, 1831, 2818, 2977, 177, 3258, 2714, 132, 2734, 1592, 2562, 2053, 1789, 171, 1288, 1286, 1162, 2581, 871, 3022, 2765, 2169, 2217, 364, 2465, 3320, 1916, 2379, 3095, 25, 1543, 878, 1779, 800, 2024, 2207, 141, 2080, 2214, 2974, 2486, 949, 2890, 654, 456, 1555, 1042, 3113, 3294, 1991, 2229, 807, 2276, 793, 2593, 697, 2451, 3284, 1578, 2676, 2117, 2859, 3327, 2070, 1825, 1276, 2330, 2798, 1535, 2196, 1129, 3215, 2831, 481, 1140, 2006, 3157, 3212, 1426, 1295, 1075, 1239, 2423, 506, 830, 1351, 1221, 1433, 3291, 1535, 2310, 1752, 2368, 1473, 3212, 488, 2120, 361, 2503, 1924, 2448, 65, 675, 94, 2918, 1555, 659, 816, 2161, 2494, 2824, 2991, 2262, 153, 282, 2985, 1424, 1414, 1752, 2365, 1838, 98, 1268, 2494, 1658, 2630, 1054, 737, 895, 3230, 2826, 63, 192, 2911, 659, 1305, 2323, 2139, 2689, 3031, 254, 1240, 1531, 860, 2771, 2364, 2679, 248, 2788, 1488, 755, 1952, 227, 1322, 1020, 2194, 2163, 2193, 885, 2056, 3150, 993, 462, 850, 84, 289, 2921, 1854, 1563, 1042, 21, 3224, 156, 2831, 2807, 1620, 1073, 2186, 2767, 210, 393, 1354, 1184, 3130, 115, 221, 2358, 761, 1914, 753, 2891, 3316, 3254, 1656, 1645, 203, 1911, 1625, 1173, 2392, 2401, 1360, 409, 1594, 827, 2260, 249, 1195, 2382, 1151, 2177, 284, 1040, 2926, 436, 2523, 2038, 2498, 793, 2840, 2954, 2997, 2117, 991, 2190, 1337, 1771, 1975, 1077, 127, 17, 3033, 2498], -[1095, 705, 1916, 1081, 375, 739, 1365, 2439, 2118, 2041, 630, 1130, 1568, 2436, 2929, 179, 2991, 2512, 1633, 409, 2913, 1810, 2503, 1023, 442, 79, 1857, 2823, 2818, 2645, 2864, 115, 2145, 2331, 2676, 1861, 3203, 3117, 473, 468, 2784, 146, 76, 964, 849, 2961, 2280, 2558, 809, 205, 2824, 3082, 2492, 2018, 1903, 1673, 288, 1722, 2343, 541, 3203, 2841, 2345, 89, 3320, 236, 2280, 1391, 1597, 2273, 2533, 548, 507, 355, 1546, 2739, 2543, 2558, 270, 1315, 2722, 3212, 2848, 1869, 1600, 1787, 1175, 2023, 2586, 1523, 1641, 3305, 884, 1276, 1421, 1807, 837, 358, 2362, 601, 691, 2324, 393, 1846, 316, 2699, 3078, 1634, 1142, 2404, 1387, 1191, 2397, 1426, 1479, 290, 59, 1215, 1201, 3293, 2873, 972, 2165, 678, 2008, 3298, 2638, 2180, 2714, 2381, 1550, 1804, 204, 945, 2851, 416, 2770, 1122, 1142, 2013, 694, 2295, 2307, 2635, 682, 608, 1151, 1950, 2841, 1866, 559, 1316, 1155, 494, 1501, 876, 148, 2667, 2921, 2072, 1265, 3, 84, 404, 484, 275, 3096, 2436, 2642, 2678, 1642, 1481, 790, 850, 965, 514, 2246, 3019, 2008, 113, 1267, 3155, 2372, 2496, 2165, 1187, 936, 405, 574, 1843, 1622, 903, 1312, 1797, 3257, 1665, 108, 3116, 3068, 2422, 2209, 1731, 2095, 1288, 885, 2155, 2203, 1623, 1471, 2778, 473, 1017, 2698, 1997, 2531, 2057, 453, 2846, 3136, 1563, 206, 2211, 2232, 755, 1246, 2544, 1244, 76, 2249, 2612, 2928, 1830, 577, 532, 1204, 2859, 19, 1381, 788, 2405, 33, 1178, 3207, 2113, 753, 1473, 3013, 749, 1239, 601, 2943, 482, 2855, 2388, 2022, 965], -[2208, 2157, 2178, 1185, 1280, 2238, 2077, 2805, 2681, 3221, 752, 750, 2988, 1739, 1339, 2432, 186, 2001, 1032, 2098, 1649, 3054, 2910, 1141, 1887, 2610, 1111, 509, 1407, 1690, 2802, 582, 3214, 2829, 3008, 1659, 3211, 1666, 117, 762, 2108, 1902, 2916, 2419, 2439, 219, 1625, 2854, 176, 1682, 2301, 1044, 854, 3050, 1592, 1156, 463, 2845, 2283, 2646, 1915, 638, 2554, 2814, 1146, 1244, 2721, 962, 1392, 3156, 533, 2553, 2823, 2209, 2963, 285, 1290, 2703, 1093, 1772, 829, 1851, 1800, 1326, 909, 2644, 1913, 496, 3012, 1380, 649, 3224, 394, 315, 2323, 3201, 3295, 1217, 3031, 2329, 1190, 944, 977, 1204, 2562, 1434, 1898, 2948, 1640, 3097, 55, 2132, 2496, 302, 2697, 965, 810, 17, 953, 2697, 1842, 1345, 2684, 1497, 920, 13, 622, 3014, 1256, 3030, 2553, 1521, 583, 739, 1351, 1958, 1743, 2987, 2572, 60, 474, 834, 2627, 884, 983, 1577, 3297, 1625, 1669, 465, 1636, 1264, 2673, 3302, 2050, 647, 532, 611, 483, 24, 2714, 3037, 3039, 2707, 2341, 3233, 3154, 736, 2547, 2014, 2763, 99, 3280, 3226, 1960, 1007, 380, 2517, 349, 333, 2684, 1316, 1790, 3321, 2929, 1941, 32, 229, 1338, 701, 1491, 822, 1221, 2419, 1831, 1198, 570, 2512, 2922, 367, 1496, 766, 1, 909, 1160, 2469, 652, 29, 403, 604, 31, 79, 466, 3082, 2291, 701, 578, 100, 1781, 1286, 2720, 106, 892, 667, 3156, 1299, 3256, 2328, 2608, 2933, 1728, 3035, 952, 3294, 2879, 2234, 1192, 510, 309, 1038, 3122, 1590, 608, 2798, 561, 1073, 2259, 152, 2552, 1574, 1697, 846, 2698, 3074, 1195, 1963]], -[[1071, 2351, 1127, 2119, 3312, 2999, 2149, 2452, 1025, 644, 932, 2564, 2187, 1448, 1896, 2685, 2389, 415, 661, 713, 2005, 1447, 2556, 2554, 2768, 3071, 3147, 1915, 2606, 1647, 1073, 2062, 1653, 381, 424, 440, 2427, 1215, 3144, 1401, 2518, 2407, 2332, 2428, 375, 655, 1585, 417, 64, 2798, 2810, 118, 2723, 2708, 1947, 2336, 2321, 179, 2986, 558, 1419, 1941, 1175, 2079, 2633, 3244, 3237, 261, 147, 2993, 2316, 760, 1280, 1325, 2856, 655, 153, 1621, 2098, 2620, 1659, 339, 2957, 2693, 1814, 675, 3130, 2725, 725, 1937, 1817, 1121, 76, 756, 983, 994, 300, 2438, 619, 883, 115, 598, 362, 2283, 1650, 2989, 515, 1863, 2033, 2299, 75, 304, 98, 3122, 1701, 490, 3312, 2519, 1667, 2819, 1950, 1087, 856, 2023, 3211, 3250, 2252, 2632, 625, 1046, 1320, 145, 2375, 2833, 2979, 220, 3275, 1959, 1763, 653, 1898, 1631, 3011, 1115, 1607, 2800, 92, 1340, 148, 3152, 3087, 1062, 2605, 1522, 2989, 413, 983, 1770, 260, 1420, 2236, 2251, 8, 2757, 2039, 3075, 2727, 150, 1455, 2070, 239, 528, 873, 1113, 1076, 3303, 154, 1937, 2944, 834, 596, 1254, 1359, 2347, 233, 2372, 3017, 314, 992, 661, 3232, 2959, 482, 2652, 3003, 2508, 1663, 2198, 1532, 3195, 2295, 380, 1042, 1050, 1400, 1121, 56, 2036, 147, 3314, 1884, 1370, 2144, 2963, 680, 13, 357, 1539, 949, 210, 433, 797, 524, 847, 1971, 981, 1831, 3259, 75, 1210, 19, 2299, 148, 1125, 302, 2396, 2005, 2212, 861, 2847, 1687, 280, 1649, 1509, 2082, 1369, 1918, 1970, 2790, 2188, 951, 2220, 2347, 2050, 277, 1554], -[180, 2663, 814, 3229, 3165, 1307, 364, 3020, 445, 1191, 2817, 3050, 463, 2180, 738, 294, 415, 3273, 1589, 3216, 1676, 1273, 2046, 471, 3134, 118, 1336, 1214, 3114, 225, 2165, 537, 2131, 2198, 1989, 94, 2173, 533, 1549, 1665, 2887, 386, 1461, 769, 726, 703, 2980, 2249, 2867, 1508, 2235, 507, 2884, 2596, 313, 703, 474, 3009, 2428, 1012, 1851, 2338, 2046, 655, 1985, 2969, 1478, 428, 703, 3180, 1370, 1053, 3137, 1898, 2200, 1246, 1016, 90, 3045, 1555, 1295, 858, 1270, 1277, 3136, 2448, 72, 1075, 1010, 1238, 2310, 37, 1785, 1508, 405, 2690, 2519, 284, 2507, 1437, 96, 1911, 2815, 756, 1326, 1602, 967, 428, 881, 417, 324, 1318, 1920, 2453, 341, 11, 385, 1810, 1320, 2661, 351, 547, 2099, 551, 1225, 1674, 1841, 1210, 2012, 114, 36, 107, 337, 466, 517, 2336, 1165, 2594, 898, 563, 613, 1855, 714, 2259, 2951, 2710, 1288, 1168, 3003, 1405, 2897, 2528, 1129, 184, 1627, 1792, 2191, 2326, 2605, 1165, 1952, 2075, 1278, 2860, 38, 1492, 789, 2519, 1925, 1561, 1662, 2386, 1788, 1480, 1324, 257, 2375, 1468, 507, 2334, 1526, 540, 253, 466, 644, 2432, 1771, 2168, 3153, 1091, 2151, 2480, 177, 1853, 2193, 288, 2046, 951, 1409, 3107, 2832, 2643, 1599, 571, 1412, 1055, 2363, 1015, 2949, 408, 2613, 589, 3258, 1670, 3114, 954, 1847, 40, 507, 781, 1824, 1366, 2740, 2969, 252, 358, 2715, 2814, 808, 812, 2054, 692, 232, 791, 263, 2386, 746, 2266, 1387, 508, 2461, 2959, 314, 1756, 2168, 469, 1554, 2054, 121, 62, 458, 2574, 3296, 2465, 3288, 372], -[723, 581, 904, 461, 2378, 342, 1830, 2996, 910, 1321, 2030, 2259, 795, 2411, 2424, 34, 2461, 1854, 3095, 1818, 1011, 174, 1151, 2981, 189, 1311, 1146, 437, 2922, 3019, 1695, 343, 787, 598, 1294, 3140, 523, 476, 3242, 3242, 1000, 1770, 2989, 2346, 168, 1496, 1909, 743, 597, 1130, 1726, 948, 2693, 2028, 16, 2882, 2515, 1447, 1809, 1288, 378, 1502, 899, 1637, 2241, 45, 526, 2657, 2389, 2377, 724, 2412, 1517, 373, 1356, 1200, 875, 3321, 2860, 558, 3297, 3171, 3096, 2364, 3050, 2730, 339, 529, 1201, 1138, 722, 1628, 1167, 1258, 1382, 1616, 2411, 896, 2828, 59, 469, 930, 718, 207, 110, 1821, 735, 1621, 621, 1594, 1062, 2427, 3004, 3020, 401, 2093, 125, 1227, 2002, 2520, 2238, 869, 1895, 851, 817, 2861, 179, 3104, 2378, 1927, 1470, 409, 3096, 140, 2104, 1000, 223, 1756, 2452, 1022, 2089, 1979, 3318, 995, 2092, 2441, 3184, 140, 187, 395, 3111, 27, 1504, 2966, 1323, 1693, 2517, 2612, 1505, 2889, 2489, 1824, 866, 1269, 1681, 1827, 407, 1389, 1116, 1092, 2945, 848, 1557, 1595, 3238, 2311, 2923, 2462, 274, 1955, 2463, 1342, 1731, 1454, 1364, 1628, 1570, 1476, 2938, 2954, 970, 1817, 46, 3030, 654, 739, 374, 3198, 177, 1534, 2718, 2869, 2664, 2267, 2065, 3132, 38, 442, 999, 289, 2084, 2908, 3177, 1684, 34, 3189, 1391, 1676, 2139, 2095, 1912, 517, 0, 1557, 2562, 1289, 1913, 2468, 317, 2793, 1956, 2990, 2994, 3060, 595, 866, 860, 3121, 63, 2572, 1881, 1168, 39, 309, 865, 727, 348, 2448, 395, 961, 1946, 3101, 1465, 2904, 862, 768]], -[[2651, 1652, 2254, 2887, 2120, 2620, 3273, 686, 2064, 1481, 2850, 1022, 1425, 194, 691, 1735, 457, 978, 365, 2518, 1750, 330, 1284, 3323, 2989, 435, 2756, 2568, 2991, 1261, 896, 1805, 2302, 1271, 2013, 1273, 2264, 3094, 1175, 722, 2233, 197, 1498, 1711, 1169, 1132, 2014, 1230, 1053, 1091, 545, 161, 1688, 2043, 2022, 1310, 292, 344, 2600, 2904, 758, 2494, 651, 2044, 1098, 1866, 2059, 2189, 1674, 1863, 1887, 1289, 3291, 126, 481, 2007, 2274, 1421, 2276, 2468, 968, 423, 2822, 3135, 3176, 2982, 1695, 2262, 1407, 2768, 2205, 202, 2458, 366, 2719, 2875, 2237, 217, 1032, 899, 3235, 2588, 26, 1609, 1386, 298, 986, 2333, 1911, 1444, 1171, 2001, 2218, 795, 1995, 2098, 224, 534, 211, 3131, 1947, 3033, 821, 3128, 3145, 1882, 1419, 2881, 2362, 3231, 1336, 2831, 1593, 2988, 3007, 622, 843, 2264, 2462, 1990, 2736, 2049, 1993, 2361, 1415, 3283, 2295, 2590, 2993, 701, 733, 523, 2956, 771, 1420, 3047, 116, 1638, 86, 3263, 3184, 1998, 1793, 792, 1081, 951, 1261, 647, 1796, 769, 2909, 809, 1916, 161, 2267, 1184, 1757, 357, 17, 1264, 2133, 1296, 3207, 1855, 3221, 2353, 2659, 2430, 269, 556, 1104, 748, 1144, 3139, 1651, 2804, 2903, 1466, 398, 2972, 1937, 2169, 674, 2747, 1505, 1039, 2369, 1875, 2115, 1265, 1169, 2279, 514, 152, 2626, 484, 1636, 2074, 939, 2954, 1231, 271, 10, 1096, 2838, 1132, 23, 1100, 3264, 2853, 1400, 1959, 624, 2537, 828, 3206, 778, 2224, 2916, 2704, 2497, 264, 1607, 1060, 920, 2008, 1820, 3255, 2853, 3171, 315, 1682, 989, 1760, 1165, 1921], -[276, 361, 2772, 1882, 433, 2175, 2154, 1970, 394, 1482, 2631, 1555, 1225, 1052, 1649, 2373, 611, 472, 1721, 221, 94, 2685, 1077, 2197, 3107, 462, 2275, 953, 2925, 708, 219, 5, 224, 30, 3314, 2215, 1406, 2821, 1492, 160, 3227, 1324, 2629, 291, 967, 2088, 2107, 1511, 253, 1429, 321, 590, 2920, 1692, 1161, 2233, 75, 1820, 2404, 913, 3220, 3071, 2034, 2107, 2161, 1380, 1742, 640, 881, 1574, 2017, 504, 1045, 1369, 922, 163, 554, 1351, 362, 2383, 3016, 1899, 2658, 2912, 2950, 868, 350, 2206, 315, 2532, 840, 3320, 2823, 2209, 592, 1017, 1048, 2342, 333, 109, 3293, 1671, 290, 1984, 1235, 134, 2367, 1750, 1927, 1187, 1598, 1582, 1542, 1236, 857, 774, 2381, 752, 2294, 478, 240, 2802, 2257, 837, 915, 1899, 1536, 1755, 2528, 617, 2332, 927, 2205, 3071, 2298, 652, 3308, 268, 1201, 2347, 1334, 275, 898, 3254, 376, 1783, 2377, 2719, 2590, 3250, 2998, 1533, 563, 114, 220, 2152, 491, 2777, 297, 1168, 1477, 2531, 1369, 1342, 637, 2192, 1672, 3261, 1056, 2071, 2428, 41, 2678, 964, 1599, 658, 1341, 1680, 2262, 2153, 2997, 2637, 1404, 1785, 2695, 2404, 715, 1732, 2783, 384, 656, 3012, 2878, 637, 2802, 1893, 2592, 551, 884, 2338, 2011, 812, 841, 1843, 456, 1090, 2724, 637, 137, 606, 1687, 1074, 2530, 269, 2357, 2398, 3237, 144, 147, 372, 1525, 2427, 1182, 2978, 851, 968, 122, 1540, 2380, 22, 1818, 1278, 2496, 240, 1937, 2198, 1234, 1366, 759, 1124, 2839, 1193, 2927, 1517, 190, 958, 2617, 134, 2304, 493, 2787, 1350, 575, 68, 3163, 3025], -[966, 2452, 116, 2534, 1196, 754, 3152, 1210, 1734, 970, 2156, 1172, 1741, 364, 2810, 3072, 2247, 37, 344, 3156, 590, 3234, 1310, 1828, 1654, 188, 2537, 2766, 1378, 395, 2993, 3029, 770, 2307, 697, 686, 627, 2696, 1133, 2779, 733, 1478, 1202, 180, 901, 2510, 2905, 1511, 3325, 2720, 2992, 210, 49, 2466, 3259, 1684, 2542, 290, 2588, 397, 579, 309, 1275, 2095, 530, 2230, 608, 2879, 20, 2031, 403, 155, 234, 3103, 766, 2912, 457, 202, 2701, 2776, 214, 1778, 3146, 1114, 1640, 1190, 1870, 2251, 1017, 2507, 1603, 2591, 949, 3028, 2257, 222, 3051, 879, 1185, 1764, 290, 3163, 1082, 172, 1555, 2535, 2225, 2930, 812, 694, 1759, 688, 3266, 2354, 369, 917, 903, 1897, 1154, 596, 2, 2130, 3168, 2448, 930, 993, 2230, 2156, 1960, 1882, 576, 3305, 1027, 1135, 1282, 2001, 1787, 3141, 3070, 2465, 2149, 2889, 164, 1857, 180, 1177, 3102, 1375, 2565, 1363, 2105, 3221, 536, 707, 1474, 1103, 467, 1915, 3294, 621, 1733, 817, 939, 349, 2446, 514, 2959, 3256, 2103, 959, 1006, 1446, 1625, 933, 2034, 1970, 3297, 66, 3020, 2573, 1363, 822, 370, 1550, 1695, 1048, 728, 2544, 1942, 2194, 323, 2172, 499, 2199, 1322, 2747, 2130, 578, 623, 3033, 807, 94, 2384, 1548, 1935, 1907, 809, 1350, 2853, 1169, 883, 2790, 1766, 45, 670, 739, 886, 2962, 669, 1511, 1412, 180, 2166, 3127, 471, 2346, 3126, 785, 312, 1281, 300, 336, 1189, 2833, 2363, 1690, 2966, 2874, 2130, 1315, 1108, 1457, 2350, 1598, 2809, 607, 3245, 306, 1523, 897, 1487, 1771, 1831, 2650, 54, 2877]]] - -r: [[0, 0, 3327, 1, 0, 1, 1, 3328, 1, 0, 0, 3328, 0, 1, 0, 3327, 0, 1, 3328, 0, 1, 0, 3328, 0, 3328, 1, 3328, 0, 3328, 1, 0, 1, 3328, 1, 0, 3328, 1, 1, 3328, 0, 3328, 0, 3328, 0, 0, 0, 0, 1, 1, 0, 3328, 0, 0, 0, 3328, 2, 0, 3328, 0, 0, 0, 2, 3328, 1, 3328, 0, 1, 0, 1, 3328, 0, 0, 3328, 0, 0, 3327, 3328, 0, 1, 1, 1, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 3328, 0, 1, 0, 3328, 1, 2, 3328, 0, 1, 0, 3327, 1, 3328, 3328, 0, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 2, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 1, 2, 1, 3328, 1, 0, 1, 1, 0, 1, 0, 1, 3327, 0, 3328, 3328, 3327, 0, 1, 0, 1, 0, 3328, 0, 2, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3327, 0, 3328, 3328, 1, 3327, 3328, 0, 1, 3328, 0, 3328, 3328, 3327, 1, 1, 2, 0, 1, 3328, 1, 3327, 0, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 2, 1, 3328, 0, 3328, 1, 0, 0, 0, 2, 3328, 1, 2, 0, 0, 1, 3327, 3328, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 2, 0, 0, 1, 3328, 2, 0, 3328, 0, 0, 1, 0, 3328, 3328, 3327, 1, 0, 3328, 3328, 3328, 0, 1, 3328, 1, 0, 0, 1, 3328, 0, 1, 2], -[0, 3327, 1, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 0, 3328, 1, 3328, 0, 0, 3327, 0, 3328, 0, 1, 3327, 1, 1, 1, 3328, 1, 0, 0, 3328, 1, 0, 3328, 0, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 3328, 0, 0, 2, 3328, 0, 0, 0, 3328, 2, 3328, 0, 0, 3328, 3328, 2, 3328, 3328, 2, 2, 1, 1, 3328, 0, 3328, 0, 1, 1, 3328, 3327, 1, 3327, 0, 3328, 1, 1, 0, 2, 1, 1, 2, 0, 2, 0, 3328, 3328, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 3328, 3328, 0, 1, 1, 1, 0, 3328, 1, 3328, 3328, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 0, 0, 2, 3328, 0, 1, 1, 3328, 3328, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3327, 0, 1, 1, 3328, 3328, 1, 0, 3328, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 3328, 2, 0, 1, 0, 0, 3328, 1, 1, 1, 0, 3328, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 1, 1, 2, 1, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 0, 0, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 1, 0, 0, 0, 0, 3328, 3327, 0, 1, 1, 1, 0, 3328, 0, 3327, 1, 3328, 0, 0, 0, 3327, 1, 0, 3328, 3327, 0, 3328, 1, 3327, 0, 3328], -[0, 2, 0, 0, 2, 3328, 0, 1, 3328, 0, 2, 3328, 3328, 0, 1, 3328, 3328, 0, 1, 0, 2, 0, 3328, 3328, 3328, 1, 1, 0, 1, 0, 1, 3328, 0, 3328, 3327, 0, 1, 2, 1, 3327, 1, 1, 1, 3327, 1, 1, 1, 3328, 0, 1, 1, 0, 0, 0, 3327, 3327, 1, 3328, 3328, 3328, 1, 2, 3327, 3328, 1, 3328, 0, 3328, 3327, 3328, 0, 0, 0, 1, 0, 0, 3328, 1, 1, 3327, 3328, 3328, 1, 3328, 3327, 1, 0, 3328, 1, 3328, 3328, 0, 0, 3328, 3328, 0, 1, 1, 3328, 0, 1, 3328, 0, 0, 1, 3328, 0, 3328, 0, 3328, 0, 3327, 1, 3327, 3327, 0, 0, 2, 0, 3327, 1, 0, 3328, 1, 1, 3327, 3328, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 3327, 3328, 0, 3328, 0, 1, 2, 1, 3328, 3328, 0, 1, 0, 3328, 3328, 0, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 3328, 3328, 3328, 1, 1, 3328, 1, 3328, 2, 0, 1, 2, 1, 3328, 1, 3328, 3328, 1, 0, 0, 3328, 2, 0, 1, 1, 3328, 0, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 0, 1, 3328, 0, 0, 1, 3327, 1, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 2, 3328, 2, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 0, 1, 2, 3327, 3328, 0, 1, 0, 0, 0, 0, 0, 2, 1, 1, 3327, 3327, 3327, 3328, 1, 3327, 3328, 3328, 1, 2, 1, 1, 0]] - -e1: [[0, 3328, 3327, 0, 3328, 0, 0, 1, 3328, 0, 0, 0, 1, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 1, 0, 3328, 0, 1, 2, 1, 0, 3328, 3328, 1, 3327, 3327, 3328, 0, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 0, 0, 3328, 0, 0, 0, 3328, 3328, 1, 0, 3327, 0, 1, 1, 0, 0, 3328, 1, 1, 3328, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 3328, 2, 2, 2, 1, 0, 3328, 3328, 0, 2, 1, 1, 3328, 0, 1, 3327, 0, 0, 2, 1, 0, 0, 3328, 0, 3328, 3328, 3328, 0, 0, 0, 3328, 1, 3328, 2, 1, 0, 0, 2, 3328, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 3328, 1, 1, 3328, 1, 0, 1, 0, 0, 0, 0, 3328, 0, 3327, 1, 0, 0, 0, 3327, 2, 3328, 3328, 1, 2, 0, 1, 1, 0, 1, 1, 1, 1, 3328, 2, 3328, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 3328, 3328, 0, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 3328, 3327, 1, 0, 1, 1, 1, 3328, 3328, 1, 1, 3328, 1, 1, 0, 2, 0, 3328, 1, 1, 3327, 0, 0, 3328, 1, 0, 1, 3328, 0, 1, 3328, 1, 3327, 0, 3328, 0, 2, 0, 2, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 3328, 0, 0, 1, 2, 1, 3328, 3328, 1, 3328, 0, 1, 0], -[0, 1, 3328, 0, 1, 1, 3327, 1, 3327, 1, 1, 3328, 1, 3328, 3328, 3328, 0, 0, 1, 1, 0, 2, 2, 3328, 1, 3328, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 1, 3327, 3328, 1, 3328, 1, 3327, 3328, 1, 1, 3328, 3328, 0, 0, 1, 2, 1, 3328, 1, 0, 2, 0, 3328, 1, 3327, 2, 0, 0, 2, 2, 0, 3327, 3327, 3327, 2, 3328, 3328, 0, 3328, 1, 3328, 0, 0, 0, 3327, 0, 3328, 3328, 3328, 3328, 1, 3327, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 0, 0, 1, 3327, 0, 3328, 3328, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 3327, 1, 0, 2, 0, 0, 0, 0, 2, 2, 3327, 3328, 3328, 1, 3328, 0, 1, 2, 3328, 1, 0, 0, 1, 0, 0, 1, 2, 3328, 1, 3327, 3328, 0, 3328, 0, 3328, 3328, 3328, 0, 3328, 1, 3327, 3328, 3328, 3328, 1, 0, 2, 3328, 0, 1, 0, 0, 1, 3328, 1, 0, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 3327, 0, 1, 2, 0, 0, 0, 0, 3327, 1, 3328, 0, 3328, 0, 3327, 3328, 3328, 1, 1, 0, 0, 1, 1, 0, 3328, 3328, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 1, 1, 1, 1, 0, 0, 0, 2, 3328, 0, 3327, 0, 3327, 1, 0, 0, 0, 2, 0, 3328, 3328, 3328, 3328, 0, 0, 3328, 1, 1, 1, 3328, 1, 0, 3328, 1, 0, 3327, 3328, 0, 1, 1], -[0, 3328, 3328, 0, 1, 0, 0, 3328, 1, 0, 0, 0, 1, 1, 3328, 3328, 2, 3328, 3328, 0, 0, 1, 0, 3328, 1, 0, 1, 0, 3328, 1, 0, 3327, 3328, 3328, 0, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 0, 2, 0, 0, 0, 2, 3327, 3328, 0, 1, 0, 0, 3328, 1, 3328, 3328, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 3328, 3327, 1, 1, 0, 0, 0, 1, 0, 1, 0, 2, 1, 1, 0, 3327, 2, 1, 3328, 0, 2, 3328, 1, 0, 0, 3327, 3328, 3327, 0, 3327, 3328, 0, 1, 0, 0, 3328, 1, 0, 1, 1, 0, 0, 3328, 0, 1, 0, 1, 3327, 0, 1, 1, 1, 3328, 0, 3328, 3328, 3328, 0, 0, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 1, 0, 3328, 1, 0, 1, 3328, 1, 0, 0, 3328, 1, 1, 0, 2, 3328, 3328, 3328, 0, 3328, 1, 3328, 1, 2, 1, 0, 2, 3327, 3327, 1, 2, 1, 0, 3327, 0, 0, 1, 0, 0, 1, 1, 1, 3328, 3328, 1, 0, 3328, 3328, 3328, 3327, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3328, 0, 3327, 3328, 2, 3328, 0, 3328, 0, 2, 0, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 1, 3328, 3327, 2, 3328, 3328, 1, 3328, 0, 2, 0, 0, 2, 1, 0, 3328, 0, 3328, 1, 0, 3327, 1, 0, 3328]] - -e2: [0, 1, 1, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 1, 1, 0, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 0, 0, 0, 0, 1, 0, 3328, 3328, 3327, 0, 1, 3328, 3327, 3328, 1, 3328, 0, 0, 1, 0, 1, 0, 2, 3328, 3328, 2, 0, 3328, 3328, 3328, 1, 0, 0, 2, 3327, 3328, 0, 0, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 1, 1, 0, 0, 2, 1, 3327, 3328, 1, 3328, 0, 0, 0, 1, 1, 2, 1, 1, 3327, 3328, 0, 0, 0, 3328, 0, 3327, 1, 2, 3328, 3328, 3328, 0, 1, 3327, 1, 1, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 1, 1, 0, 3328, 1, 2, 1, 0, 2, 0, 3328, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 0, 3328, 2, 3327, 0, 0, 1, 1, 1, 3327, 0, 1, 1, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 1, 3328, 1, 3328, 1, 3328, 3328, 3327, 1, 0, 0, 1, 3328, 0, 1, 0, 1, 3327, 0, 3327, 1, 1, 2, 3327, 3328, 0, 0, 1, 1, 2, 3327, 0, 0, 3328, 0, 3328, 0, 0, 0, 3327, 3328, 0, 0, 3328, 3328, 0, 1, 0, 3328, 0, 3328, 1, 2, 3328, 2, 3328, 0, 0, 1, 0, 1, 1, 3328, 3328, 3328, 3328, 0, 1, 0, 1, 0, 1, 3328, 0, 0, 3328, 3328, 3327, 3328, 3328, 1, 3328, 2, 0, 1, 2, 0, 1, 3328, 0, 0, 3328, 0] -rHat: [[686, 2870, 147, 3262, 3159, 1222, 1207, 2995, 2249, 3295, 1022, 1568, 385, 1447, 642, 1705, 1821, 3053, 2730, 294, 1279, 2060, 1538, 1773, 716, 971, 3051, 1928, 1011, 607, 1083, 1598, 414, 1866, 2491, 2973, 1082, 1995, 574, 3258, 1506, 2441, 1882, 370, 1234, 1317, 101, 3057, 2495, 2307, 2624, 976, 2319, 547, 2011, 2255, 3323, 222, 349, 1635, 2221, 1814, 1184, 2256, 1648, 2204, 1284, 188, 646, 1939, 223, 2501, 2732, 844, 1319, 2892, 1937, 164, 1269, 1389, 1297, 1512, 231, 3328, 3057, 3074, 427, 2734, 328, 2379, 1716, 3188, 1454, 1944, 109, 195, 2537, 1493, 1763, 213, 2991, 3281, 603, 2651, 1717, 2652, 1159, 234, 2855, 3275, 1814, 514, 904, 1871, 897, 211, 2704, 2308, 2855, 862, 598, 1540, 331, 518, 848, 1900, 2953, 50, 582, 1628, 780, 561, 977, 2181, 1358, 2005, 841, 2567, 1585, 574, 1487, 836, 212, 963, 2111, 552, 1217, 521, 217, 909, 2238, 2724, 1643, 474, 2509, 1109, 321, 542, 1858, 2617, 3289, 352, 426, 1796, 1612, 1456, 409, 2321, 1305, 1416, 1524, 575, 1145, 1938, 146, 2746, 866, 2688, 3213, 2052, 2235, 1098, 1989, 731, 352, 2665, 2931, 2147, 1797, 2190, 117, 1602, 3009, 3133, 86, 1330, 2462, 1369, 78, 1623, 2215, 931, 1508, 2284, 288, 1826, 2758, 690, 1259, 2420, 182, 50, 307, 2796, 2876, 3140, 469, 1145, 574, 866, 1320, 2129, 909, 2287, 407, 921, 387, 2096, 1694, 3151, 759, 216, 1902, 2128, 132, 424, 3294, 1722, 331, 3004, 1117, 336, 1887, 1775, 1799, 2444, 106, 2113, 446, 1832, 790, 437, 1336, 1747, 716, 1499], -[1139, 1269, 364, 2358, 888, 1140, 2032, 1827, 1827, 1980, 1179, 1062, 765, 1125, 1792, 1287, 1787, 2419, 2297, 2020, 358, 82, 776, 1074, 1492, 947, 1073, 2663, 133, 1332, 1500, 2401, 411, 684, 272, 2463, 1249, 878, 2765, 2292, 1587, 1971, 2917, 1654, 2480, 1395, 619, 2210, 14, 1469, 2403, 1714, 2508, 1702, 1201, 3043, 233, 1558, 732, 1298, 1455, 3101, 1699, 916, 718, 1989, 3284, 361, 1573, 2155, 752, 468, 2806, 2746, 2507, 2646, 288, 2542, 807, 2978, 2016, 1740, 1805, 1412, 2472, 2107, 267, 809, 665, 2095, 1522, 892, 1471, 2937, 2020, 2830, 36, 731, 2945, 1444, 1367, 3174, 2862, 131, 316, 1044, 2821, 341, 2164, 209, 2431, 1319, 3134, 297, 2838, 1617, 1429, 597, 1493, 2484, 2877, 1144, 1294, 2056, 741, 965, 873, 3075, 1326, 2056, 2551, 690, 390, 1879, 2210, 24, 2111, 2170, 3325, 2664, 2735, 1586, 1147, 846, 483, 888, 1801, 1002, 165, 2569, 2517, 2586, 2364, 165, 640, 1283, 2103, 2417, 2561, 1778, 2308, 2060, 1181, 3290, 2737, 1187, 2772, 1779, 2131, 2122, 2434, 3293, 3150, 2796, 2390, 2490, 2011, 2899, 2490, 2738, 2466, 2304, 2781, 1952, 4, 1399, 1285, 2771, 1122, 2172, 1000, 1253, 1899, 2928, 1836, 1019, 585, 2751, 288, 1072, 607, 1075, 846, 2323, 3317, 3248, 1969, 2062, 2879, 2967, 2641, 442, 1579, 1673, 250, 2075, 2023, 540, 1819, 688, 1393, 2153, 1043, 325, 278, 2313, 730, 467, 0, 1344, 1961, 2027, 442, 910, 514, 2400, 2666, 270, 1364, 2477, 2397, 2644, 1198, 2579, 3126, 2335, 804, 686, 1406, 2096, 168, 2903, 2395, 2277, 1414, 1941], -[3022, 3246, 2122, 1725, 1400, 2270, 227, 1537, 2513, 2783, 2623, 1702, 336, 1561, 1219, 2282, 709, 2746, 1664, 1575, 2625, 1490, 2179, 2681, 1325, 1600, 1587, 256, 1564, 1013, 551, 1338, 755, 437, 2792, 2579, 1328, 2406, 2628, 2888, 2425, 2847, 922, 1513, 2224, 1839, 3213, 2255, 630, 2707, 1301, 1868, 148, 1090, 2360, 2483, 2982, 3172, 3014, 3009, 1707, 578, 3113, 2504, 3292, 2984, 16, 404, 2882, 2665, 3319, 2097, 694, 3175, 729, 2050, 921, 3068, 548, 1367, 1580, 3304, 197, 405, 1851, 3052, 1376, 2613, 603, 1304, 3312, 1327, 1995, 572, 1093, 202, 1865, 38, 2297, 305, 1397, 885, 1967, 2441, 1307, 239, 1059, 2308, 811, 777, 1156, 909, 1988, 2488, 3180, 3158, 2041, 2813, 158, 1367, 1905, 1279, 3084, 464, 2306, 1550, 1720, 1053, 2724, 1259, 2946, 338, 1194, 126, 3149, 1075, 944, 2115, 41, 1242, 2433, 2100, 1711, 358, 2170, 1739, 717, 234, 1498, 874, 2728, 3136, 2918, 584, 1383, 1508, 1202, 2300, 1236, 2179, 1958, 759, 1510, 350, 2771, 3184, 2331, 471, 1739, 2205, 2679, 2209, 2235, 2122, 3128, 2641, 3226, 3, 852, 1347, 1218, 2839, 2977, 2789, 1371, 2538, 2742, 369, 1412, 2471, 1493, 486, 2454, 1877, 60, 1919, 1758, 2167, 982, 1761, 352, 643, 1152, 3270, 1321, 2523, 2368, 2615, 514, 272, 1489, 2406, 1130, 1601, 1236, 2617, 2768, 3320, 384, 294, 2878, 1025, 1193, 1889, 1201, 1948, 3313, 2800, 1780, 2108, 2900, 1220, 860, 2818, 2017, 1697, 872, 1780, 1369, 2459, 806, 2305, 295, 240, 3065, 492, 752, 664, 608, 940, 965, 854, 470, 561, 580, 2292]] - -BHat * rHat: [[3180, 200, 1027, 305, 2077, 3315, 928, 1920, 2199, 1675, 136, 2064, 1757, 436, 2372, 1758, 1695, 523, 786, 1394, 606, 457, 3031, 3261, 218, 218, 1028, 2791, 417, 2055, 1933, 2512, 1229, 3316, 290, 2483, 607, 2162, 504, 1140, 2923, 2571, 2137, 2484, 1634, 548, 1222, 1955, 2188, 119, 380, 2972, 371, 1928, 2301, 1406, 1270, 2086, 1331, 1361, 2549, 1653, 207, 2479, 1636, 3006, 1458, 313, 2280, 1115, 2134, 1143, 756, 1339, 2645, 1243, 2242, 2023, 256, 3179, 1671, 1767, 1455, 3038, 3149, 979, 1776, 1584, 2930, 2939, 1786, 2354, 1046, 2312, 20, 1380, 1515, 1924, 1770, 621, 1859, 1810, 1826, 906, 2314, 3261, 1814, 540, 1245, 2998, 1432, 616, 1647, 374, 2352, 2, 52, 664, 2675, 2822, 2766, 1024, 564, 1200, 1089, 1918, 1301, 782, 2193, 1926, 348, 2432, 1026, 2377, 2398, 941, 3023, 2388, 687, 1494, 229, 1161, 3261, 680, 1196, 3052, 2782, 1944, 3313, 532, 1276, 3142, 90, 3172, 982, 29, 2865, 3047, 1103, 1841, 1644, 2557, 2361, 1495, 1324, 1634, 1636, 1789, 2657, 645, 670, 1129, 2909, 1179, 2013, 152, 2908, 2922, 384, 1642, 1514, 3022, 3128, 3271, 2504, 1542, 2410, 2540, 496, 94, 1875, 682, 1367, 1007, 3019, 1292, 3149, 1881, 1220, 1308, 1725, 1044, 608, 2901, 1849, 2334, 1526, 1066, 248, 465, 882, 1431, 2126, 1380, 3267, 974, 1091, 2936, 2940, 305, 3127, 2955, 2181, 1755, 2294, 2789, 2372, 1131, 2716, 1829, 550, 2022, 594, 2516, 1723, 31, 1041, 1345, 336, 545, 1759, 846, 3119, 1230, 2632, 1507, 1849, 1452, 868, 137, 1920, 444, 2047, 3106, 1281, 1903], -[2785, 3122, 762, 2696, 1716, 1470, 536, 2583, 3211, 2866, 1305, 2567, 2741, 2096, 35, 1744, 2725, 1031, 3087, 1062, 2322, 1763, 3231, 989, 2949, 3097, 1688, 480, 1939, 2761, 718, 1185, 1423, 285, 1677, 406, 1596, 1062, 2585, 2500, 151, 372, 1609, 2541, 547, 1092, 1239, 2901, 1642, 524, 1999, 1831, 578, 39, 3245, 2595, 837, 1520, 82, 1638, 2332, 316, 475, 3163, 3328, 2423, 1562, 1888, 412, 1389, 1376, 490, 40, 3080, 847, 1294, 1133, 1691, 351, 912, 1143, 976, 2034, 1982, 2648, 2330, 514, 1847, 3089, 1477, 955, 827, 2711, 485, 486, 384, 2265, 715, 204, 2427, 1189, 2760, 155, 1036, 509, 2792, 1758, 2622, 2744, 1089, 1967, 2790, 2917, 172, 2998, 1928, 2224, 605, 877, 1045, 2370, 2673, 36, 1210, 1511, 1525, 2295, 2534, 1940, 2250, 1632, 238, 2283, 2064, 3253, 2696, 2893, 681, 2131, 733, 2392, 1210, 907, 49, 1216, 1166, 2488, 2659, 259, 2585, 2568, 1648, 1241, 1213, 2237, 693, 2917, 3217, 2922, 716, 2489, 611, 208, 1391, 3089, 1894, 2264, 171, 3321, 925, 2251, 552, 1978, 1662, 2797, 1727, 519, 2389, 1892, 1997, 596, 361, 1516, 2679, 2509, 884, 807, 9, 1994, 3318, 1720, 1341, 730, 3101, 3196, 3243, 2462, 1975, 2698, 1385, 1173, 1457, 2465, 2427, 3303, 1997, 1567, 2121, 2071, 2012, 758, 955, 86, 3068, 2395, 16, 1771, 1068, 2819, 570, 384, 2842, 2514, 3145, 2197, 1437, 929, 2592, 2964, 190, 2937, 690, 1887, 2458, 3216, 1610, 330, 1464, 2851, 1381, 1894, 2026, 971, 3236, 1141, 1894, 2126, 2760, 3058, 3111, 2838, 251, 2877, 290, 1621, 1178], -[1822, 1407, 1469, 2389, 3194, 1635, 1631, 2494, 2381, 3227, 2278, 3060, 794, 2225, 204, 1726, 587, 2679, 1766, 705, 385, 3052, 1591, 628, 1844, 258, 305, 1434, 1080, 2867, 1526, 2706, 2730, 1409, 427, 1587, 2178, 855, 3288, 939, 1695, 2582, 763, 422, 3130, 1252, 1967, 2057, 2038, 1847, 1747, 2712, 3066, 2710, 3099, 1605, 1960, 747, 1344, 532, 403, 2103, 250, 815, 774, 2558, 2296, 1514, 1224, 2987, 2639, 2673, 1867, 2485, 1376, 124, 672, 2692, 1768, 106, 1471, 444, 2681, 2148, 599, 3151, 1918, 1324, 172, 2365, 3177, 1490, 3235, 1963, 3159, 2033, 3186, 1164, 3261, 2411, 1348, 2896, 1331, 841, 2281, 2556, 1538, 2089, 2000, 1913, 1981, 2609, 349, 1026, 3073, 2897, 1422, 3053, 86, 251, 634, 635, 1927, 1457, 1459, 621, 566, 893, 2888, 864, 53, 1366, 686, 2956, 2954, 3302, 3209, 876, 1478, 3274, 1038, 2875, 1522, 1084, 1615, 2336, 2842, 2167, 2911, 1637, 1523, 2654, 1471, 42, 2316, 3187, 2943, 2349, 212, 1984, 2037, 96, 3249, 2506, 2598, 3088, 1351, 295, 2022, 448, 2120, 2462, 2219, 1320, 2704, 35, 1097, 455, 2664, 2429, 838, 1221, 805, 118, 75, 2166, 1954, 642, 2574, 1150, 375, 1696, 947, 3229, 3210, 1093, 2193, 1828, 3286, 2825, 2103, 488, 3137, 1458, 2025, 2031, 1925, 720, 2065, 2295, 2846, 908, 2532, 1204, 1478, 1188, 611, 3077, 1400, 2104, 318, 3101, 1916, 807, 2458, 2150, 579, 2184, 1548, 2106, 149, 3054, 226, 2968, 2387, 3093, 932, 2701, 818, 1941, 2663, 1253, 2456, 676, 430, 1370, 476, 2846, 890, 2037, 2575, 2752, 1531, 819, 1075, 887]] -NTTInverse(BHat * rHat): [[1219, 2403, 179, 1572, 1750, 1202, 2338, 2213, 3317, 2657, 2418, 1205, 1444, 3043, 406, 722, 3254, 3281, 572, 2979, 791, 732, 248, 2916, 2922, 1481, 663, 1691, 1077, 978, 288, 425, 263, 3223, 752, 2083, 1991, 1323, 2949, 1791, 1928, 1139, 1763, 1391, 40, 2901, 1462, 827, 875, 1895, 3170, 1437, 252, 606, 2846, 2145, 3260, 320, 787, 1304, 956, 2586, 1571, 115, 3225, 164, 1926, 2832, 101, 1529, 333, 2301, 3270, 2770, 1674, 923, 363, 679, 2866, 1866, 2969, 1542, 1978, 3096, 1595, 3240, 3098, 2012, 642, 42, 560, 1927, 1507, 748, 578, 179, 2750, 2588, 518, 854, 2718, 1019, 455, 954, 943, 2785, 1879, 1902, 453, 1334, 252, 3202, 2870, 1206, 3213, 812, 2937, 2453, 1941, 1687, 3041, 2626, 2939, 3126, 2483, 1845, 2360, 1354, 100, 1741, 565, 3190, 427, 695, 1185, 803, 1248, 508, 1584, 1180, 1378, 2264, 2647, 2870, 2342, 2351, 2696, 951, 2777, 2778, 2624, 1470, 2381, 154, 2845, 2659, 2064, 1867, 1820, 1136, 1262, 245, 1304, 1499, 1858, 1097, 3217, 2572, 1560, 1414, 738, 1125, 432, 2426, 1402, 3304, 2756, 970, 2482, 885, 1210, 1276, 722, 2028, 2132, 2507, 1783, 1827, 1747, 2295, 35, 2539, 328, 614, 366, 393, 487, 2218, 3009, 1418, 244, 1632, 726, 3057, 1767, 0, 3155, 1696, 2766, 2162, 1594, 2496, 784, 1674, 1776, 846, 2013, 2225, 1149, 2637, 2039, 1359, 2157, 1702, 515, 2283, 213, 1987, 32, 1088, 1223, 1416, 1010, 1030, 385, 1207, 1627, 2274, 726, 1907, 1707, 1705, 591, 688, 644, 2421, 34, 24, 2931, 125, 1547, 1616, 467, 1415, 1246, 2760], -[2186, 2520, 1230, 906, 2777, 2834, 1273, 2176, 2822, 1460, 947, 2903, 718, 1956, 423, 371, 1401, 1656, 1009, 2089, 2732, 2288, 1094, 584, 2750, 1371, 2972, 1728, 1302, 409, 1629, 2776, 1314, 1253, 2693, 2543, 2522, 2427, 1183, 1794, 2993, 1110, 1325, 1102, 1372, 2668, 1604, 2197, 1812, 1268, 2999, 921, 1364, 2881, 1171, 2638, 1821, 3217, 1287, 711, 2649, 2010, 603, 2318, 1990, 2658, 1643, 1112, 299, 1744, 3149, 2561, 1144, 2933, 2755, 3023, 3328, 1675, 2876, 2999, 2121, 1630, 2516, 154, 267, 2979, 2639, 1920, 1368, 1595, 2959, 1488, 2021, 285, 1713, 703, 930, 2313, 2584, 833, 228, 2558, 2226, 2459, 2422, 1226, 1300, 1834, 2949, 1294, 2583, 2408, 1721, 3140, 2556, 1521, 423, 2604, 1947, 21, 278, 497, 2338, 2850, 860, 780, 1264, 1598, 1553, 1897, 2765, 1032, 1834, 431, 1091, 2802, 1141, 1021, 1072, 3297, 2905, 2164, 2063, 1397, 1949, 3257, 1297, 2051, 2502, 2839, 2762, 2608, 1736, 109, 2139, 1833, 2783, 2944, 3052, 1429, 30, 348, 2197, 1990, 3050, 1920, 199, 1714, 1092, 1722, 221, 802, 3189, 346, 2042, 2301, 218, 903, 2707, 986, 1402, 544, 3288, 2528, 1381, 1116, 3097, 610, 779, 2164, 3229, 1477, 851, 1103, 1555, 1392, 1346, 1823, 1197, 2396, 3269, 1029, 50, 711, 994, 2963, 987, 1346, 322, 1604, 3221, 2994, 2170, 2706, 1104, 1541, 93, 2183, 2488, 341, 2949, 1290, 1211, 1082, 1474, 2387, 2950, 1943, 1610, 2646, 2700, 3283, 2804, 1377, 2404, 717, 379, 1653, 2598, 836, 3097, 2172, 1962, 1763, 2269, 795, 2804, 1332, 2216, 2237, 1159, 1921, 1063, 1226, 819, 1759], -[782, 2928, 1475, 97, 2729, 1954, 41, 1553, 2326, 2219, 3235, 2151, 222, 2730, 2804, 386, 2172, 3050, 2951, 940, 3248, 3235, 2019, 2918, 2072, 452, 2659, 34, 2760, 3028, 471, 152, 3066, 2937, 1211, 1626, 250, 2621, 1606, 958, 341, 3179, 1202, 2522, 1832, 2983, 1091, 1767, 518, 3164, 621, 2342, 799, 1750, 6, 786, 2426, 2303, 1882, 1270, 1091, 502, 2253, 764, 1564, 291, 955, 566, 1686, 312, 330, 2542, 2355, 2455, 887, 3163, 3151, 2534, 947, 3152, 1512, 3181, 990, 2316, 577, 3013, 2265, 1779, 1805, 3078, 2911, 1814, 1241, 344, 763, 1021, 1011, 2549, 434, 995, 402, 1407, 1882, 1280, 2091, 2606, 2902, 2824, 2236, 1627, 883, 358, 3203, 1818, 2073, 3257, 1682, 1194, 3247, 161, 1913, 3207, 25, 2169, 1753, 2878, 2034, 2267, 998, 354, 581, 2926, 965, 1467, 1498, 260, 2576, 1644, 225, 2487, 1797, 261, 1962, 434, 374, 2214, 2163, 598, 2035, 827, 1936, 1796, 2601, 2568, 2195, 2413, 2534, 831, 1925, 399, 386, 2456, 2, 963, 1670, 618, 2960, 765, 600, 2714, 3295, 1411, 794, 18, 90, 3170, 2844, 3200, 1724, 1369, 1406, 1608, 3056, 2044, 1699, 2519, 1, 1560, 170, 3275, 2213, 2437, 3048, 3208, 999, 1122, 1084, 1800, 2394, 1778, 316, 758, 2108, 306, 236, 1003, 345, 1486, 3072, 1441, 262, 3148, 2176, 2304, 2734, 2383, 175, 356, 2805, 13, 1530, 553, 991, 222, 449, 514, 1986, 1337, 3032, 1672, 98, 168, 1935, 2121, 945, 1406, 804, 1174, 202, 2176, 1343, 1673, 1694, 63, 814, 1440, 2209, 831, 411, 2401, 1427, 2287, 1926, 3295, 1551, 2910]] -u = NTTInverse(BHat * rHat) + e1: [[1219, 2402, 177, 1572, 1749, 1202, 2338, 2214, 3316, 2657, 2418, 1205, 1445, 3043, 407, 721, 3254, 3281, 570, 2981, 791, 732, 249, 2916, 2921, 1481, 664, 1693, 1078, 978, 287, 424, 264, 3221, 750, 2082, 1991, 1322, 2950, 1792, 1928, 1138, 1762, 1391, 40, 2903, 1461, 828, 874, 1896, 3171, 1436, 251, 607, 2845, 2145, 3259, 319, 787, 1303, 956, 2586, 1570, 115, 3225, 164, 1925, 2831, 102, 1529, 331, 2301, 3271, 2771, 1674, 923, 362, 680, 2867, 1865, 2969, 1542, 1979, 3096, 1594, 3241, 3099, 2011, 643, 41, 562, 1929, 1509, 749, 578, 178, 2749, 2588, 520, 855, 2719, 1018, 455, 955, 941, 2785, 1879, 1904, 454, 1334, 252, 3201, 2870, 1205, 3212, 811, 2937, 2453, 1941, 1686, 3042, 2625, 2941, 3127, 2483, 1845, 2362, 1353, 99, 1740, 567, 3191, 428, 695, 1184, 803, 1248, 509, 1583, 1181, 1379, 2263, 2648, 2870, 2343, 2351, 2696, 951, 2777, 2777, 2624, 1468, 2382, 154, 2845, 2659, 2062, 1869, 1819, 1135, 1263, 247, 1304, 1500, 1859, 1097, 3218, 2573, 1561, 1415, 737, 1127, 431, 2428, 1402, 3304, 2756, 970, 2482, 886, 1211, 1276, 722, 2029, 2131, 2506, 1783, 1826, 1747, 2295, 35, 2539, 328, 615, 366, 393, 486, 2216, 3010, 1418, 245, 1633, 727, 3056, 1766, 1, 3156, 1695, 2767, 2163, 1594, 2498, 784, 1673, 1777, 847, 2011, 2225, 1149, 2636, 2040, 1359, 2158, 1701, 515, 2284, 212, 1988, 30, 1088, 1222, 1416, 1012, 1030, 387, 1207, 1628, 2272, 726, 1906, 1706, 1704, 592, 687, 644, 2421, 35, 26, 2932, 124, 1546, 1617, 466, 1415, 1247, 2760], -[2186, 2521, 1229, 906, 2778, 2835, 1271, 2177, 2820, 1461, 948, 2902, 719, 1955, 422, 370, 1401, 1656, 1010, 2090, 2732, 2290, 1096, 583, 2751, 1370, 2971, 1728, 1301, 410, 1630, 2775, 1312, 1253, 2694, 2541, 2521, 2428, 1182, 1795, 2991, 1109, 1326, 1103, 1371, 2667, 1604, 2197, 1813, 1270, 3000, 920, 1365, 2881, 1173, 2638, 1820, 3218, 1285, 713, 2649, 2010, 605, 2320, 1990, 2656, 1641, 1110, 301, 1743, 3148, 2561, 1143, 2934, 2754, 3023, 3328, 1675, 2874, 2999, 2120, 1629, 2515, 153, 268, 2977, 2640, 1920, 1367, 1594, 2958, 1487, 2021, 286, 1714, 703, 930, 2314, 2582, 833, 227, 2557, 2226, 2460, 2422, 1228, 1300, 1834, 2950, 1294, 2583, 2410, 1719, 3141, 2556, 1523, 423, 2604, 1947, 21, 280, 499, 2336, 2849, 859, 781, 1263, 1598, 1554, 1899, 2764, 1033, 1834, 431, 1092, 2802, 1141, 1022, 1074, 3296, 2906, 2162, 2062, 1397, 1948, 3257, 1296, 2050, 2501, 2839, 2761, 2609, 1734, 108, 2138, 1832, 2784, 2944, 3054, 1428, 30, 349, 2197, 1990, 3051, 1919, 200, 1714, 1093, 1722, 220, 803, 3189, 347, 2042, 2301, 217, 903, 2706, 984, 1402, 545, 3290, 2528, 1381, 1116, 3097, 608, 780, 2163, 3229, 1476, 851, 1101, 1554, 1391, 1347, 1824, 1197, 2396, 3270, 1030, 50, 710, 993, 2963, 987, 1346, 323, 1605, 3222, 2996, 2170, 2707, 1104, 1543, 94, 2184, 2489, 342, 2949, 1290, 1211, 1084, 1473, 2387, 2948, 1943, 1608, 2647, 2700, 3283, 2804, 1379, 2404, 716, 378, 1652, 2597, 836, 3097, 2171, 1963, 1764, 2270, 794, 2805, 1332, 2215, 2238, 1159, 1919, 1062, 1226, 820, 1760], -[782, 2927, 1474, 97, 2730, 1954, 41, 1552, 2327, 2219, 3235, 2151, 223, 2731, 2803, 385, 2174, 3049, 2950, 940, 3248, 3236, 2019, 2917, 2073, 452, 2660, 34, 2759, 3029, 471, 150, 3065, 2936, 1211, 1627, 250, 2622, 1607, 956, 341, 3179, 1200, 2521, 1831, 2983, 1091, 1766, 517, 3164, 619, 2343, 799, 1752, 6, 786, 2426, 2305, 1880, 1269, 1091, 503, 2253, 764, 1563, 292, 954, 565, 1685, 311, 329, 2541, 2355, 2455, 888, 3163, 3151, 2533, 947, 3151, 1510, 3182, 991, 2316, 577, 3013, 2266, 1779, 1806, 3078, 2913, 1815, 1242, 344, 761, 1023, 1012, 2548, 434, 997, 401, 1408, 1882, 1280, 2089, 2605, 2900, 2824, 2234, 1626, 883, 359, 3203, 1818, 2072, 3258, 1682, 1195, 3248, 161, 1913, 3206, 25, 2170, 1753, 2879, 2032, 2267, 999, 355, 582, 2925, 965, 1466, 1497, 259, 2576, 1644, 224, 2487, 1796, 261, 1962, 434, 373, 2213, 2162, 600, 2033, 828, 1936, 1795, 2602, 2568, 2196, 2412, 2535, 831, 1925, 398, 387, 2457, 2, 965, 1669, 617, 2959, 765, 599, 2715, 3294, 1412, 796, 19, 90, 3172, 2842, 3198, 1725, 1371, 1407, 1608, 3054, 2044, 1699, 2520, 1, 1560, 171, 3276, 2214, 2436, 3047, 3209, 999, 1121, 1083, 1799, 2392, 1777, 315, 757, 2107, 306, 236, 1004, 345, 1486, 3072, 1441, 263, 3148, 2175, 2304, 2732, 2382, 177, 355, 2805, 12, 1530, 555, 991, 222, 449, 513, 1986, 1337, 3032, 1672, 98, 168, 1936, 2120, 943, 1408, 803, 1173, 203, 2175, 1343, 1675, 1694, 63, 816, 1441, 2209, 830, 411, 2400, 1428, 2287, 1924, 3296, 1551, 2909]] - -mu: [0, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 0, 1665, 0, 1665, 0, 0, 1665, 1665, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 1665, 1665, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 0, 1665, 0, 0, 1665, 1665, 1665, 1665, 1665, 1665, 0, 1665, 1665, 0, 0, 1665, 1665, 0, 1665, 1665, 1665, 0, 1665, 0, 0, 0, 1665, 1665, 1665, 0, 0, 0, 1665, 1665, 0, 0, 1665, 1665, 1665, 0, 0, 0, 0, 0, 1665, 0, 0, 1665, 0, 1665, 0, 0, 1665, 0, 0, 1665, 0, 0, 0, 1665, 1665] -tHat^T * rHat: [2789, 2045, 1564, 2584, 3322, 2870, 1233, 1876, 2979, 99, 785, 711, 1339, 1869, 2114, 320, 2129, 1008, 1461, 2283, 2195, 2360, 3197, 1966, 1521, 753, 1276, 517, 424, 868, 1927, 1774, 1601, 2598, 1829, 629, 2540, 1814, 1493, 2873, 3035, 2859, 895, 2067, 3299, 2768, 1941, 1520, 240, 1276, 512, 2015, 544, 15, 688, 734, 2091, 268, 2053, 2375, 1177, 709, 3186, 1700, 318, 3203, 2278, 2672, 1175, 2297, 1389, 158, 1482, 917, 242, 2820, 1382, 2339, 2476, 2319, 1760, 2836, 2764, 2992, 216, 689, 1957, 2518, 2976, 2274, 98, 1727, 2169, 3121, 2990, 1893, 1692, 848, 383, 1378, 1271, 2513, 2877, 2542, 1915, 2043, 3033, 284, 707, 229, 267, 380, 426, 2922, 2909, 230, 2463, 898, 1788, 74, 256, 868, 2214, 934, 685, 2176, 1903, 1400, 215, 66, 657, 170, 3173, 2434, 2087, 1473, 3008, 2858, 2109, 1604, 2264, 2651, 510, 1352, 104, 1602, 59, 2314, 1218, 1363, 2972, 2477, 902, 2273, 488, 1072, 1058, 3154, 746, 558, 258, 443, 1786, 3161, 2115, 1871, 1425, 2081, 2524, 2885, 253, 324, 1256, 1084, 1800, 2570, 275, 460, 1156, 1462, 231, 1611, 1716, 2522, 1639, 779, 931, 1927, 261, 1778, 1443, 3317, 2091, 1834, 2910, 1029, 2727, 797, 3269, 2356, 2600, 2977, 2224, 1866, 245, 2342, 3084, 860, 1473, 1660, 609, 1777, 1428, 1869, 834, 10, 2054, 2642, 3223, 677, 3042, 92, 1272, 1213, 2508, 2843, 897, 2437, 2623, 2634, 1795, 1867, 2063, 2488, 2064, 724, 2842, 3083, 2745, 467, 1319, 1891, 996, 2271, 1164, 2569, 1876, 2238, 1001, 3311, 234, 1026, 1130, 2514, 1888, 1091] -NTTInverse(tHat^T * rHat): [3165, 661, 2894, 3181, 3096, 2553, 1089, 1146, 3139, 2327, 3046, 3041, 452, 1230, 2199, 2491, 528, 1887, 2834, 1825, 832, 2627, 1113, 3176, 3139, 2533, 2112, 2531, 1676, 1186, 2610, 1289, 1477, 2822, 464, 602, 1339, 3167, 1847, 316, 1390, 2311, 3093, 1315, 1918, 766, 2377, 3009, 723, 2400, 30, 1252, 2054, 2582, 436, 1263, 2846, 2330, 3219, 2495, 2253, 1201, 861, 735, 996, 1111, 2904, 2551, 897, 1300, 1176, 214, 3062, 1450, 1077, 447, 1730, 2089, 630, 2270, 1229, 351, 1674, 1326, 2471, 848, 701, 2381, 2299, 3320, 1583, 1231, 1877, 1331, 1017, 2314, 2093, 873, 3137, 2734, 1795, 1367, 2729, 638, 582, 1662, 400, 199, 1689, 1784, 3269, 1785, 596, 104, 2156, 204, 2402, 656, 286, 2706, 2893, 1424, 2240, 1816, 303, 1620, 1289, 167, 2248, 3182, 562, 89, 893, 1986, 499, 2277, 1993, 78, 1266, 3272, 1875, 3067, 1454, 2343, 2202, 534, 1572, 2758, 2112, 384, 495, 15, 1280, 2288, 2877, 2342, 2335, 741, 1122, 2954, 2666, 3010, 901, 1307, 2660, 1862, 1392, 554, 2279, 1542, 1615, 2999, 1401, 2408, 84, 2938, 126, 1729, 171, 2937, 1212, 133, 892, 491, 1078, 2304, 1502, 874, 73, 1636, 221, 3114, 1329, 63, 304, 628, 580, 2373, 2023, 2080, 1390, 2119, 1863, 2834, 2166, 1609, 2882, 2462, 931, 1521, 716, 354, 499, 468, 737, 1394, 2695, 149, 2627, 2563, 1125, 1565, 572, 1112, 800, 1565, 1672, 536, 2108, 1287, 1997, 3073, 1800, 1279, 817, 197, 1641, 1692, 1627, 54, 3190, 1284, 2030, 1810, 545, 162, 1439, 915, 2065, 1856, 1942, 2995, 2801, 3128, 2244, 1673] -e2 + mu: [0, 1, 1, 3328, 0, 3328, 1665, 3328, 0, 1664, 1665, 1666, 1666, 1665, 3328, 1665, 1663, 3327, 1666, 1664, 1665, 0, 3327, 1664, 0, 1665, 0, 1665, 1, 0, 1664, 1664, 1663, 0, 1, 3328, 3327, 3328, 1666, 1664, 0, 1665, 1666, 1665, 1, 1665, 1667, 3328, 3328, 2, 1665, 1664, 1664, 3328, 1, 1665, 1665, 1667, 1663, 3328, 0, 1665, 3328, 1665, 1664, 0, 1664, 1665, 1666, 1664, 1, 1, 1665, 0, 2, 1666, 3327, 3328, 1666, 3328, 0, 0, 0, 1, 1666, 2, 1666, 1666, 3327, 3328, 0, 1665, 0, 3328, 1665, 1663, 1666, 1667, 1664, 1664, 1664, 1665, 1, 3327, 1666, 1, 1665, 1665, 1665, 3327, 3328, 1664, 1666, 0, 1666, 1665, 1665, 1665, 3328, 1, 1666, 1, 1, 1665, 3328, 1, 2, 1666, 1665, 1667, 0, 1664, 1666, 1664, 3328, 1665, 1664, 0, 3328, 1, 1665, 1664, 1667, 3327, 1665, 1665, 1666, 1, 1666, 3327, 1665, 1, 1, 1665, 1, 1665, 0, 0, 1667, 0, 1, 1665, 0, 1, 3328, 1, 1664, 1, 1664, 3328, 3327, 1666, 1665, 0, 1, 3328, 0, 1, 0, 1, 3327, 1665, 3327, 1666, 1666, 1667, 3327, 3328, 1665, 1665, 1666, 1666, 1667, 1663, 0, 0, 1664, 0, 3328, 1665, 1665, 1665, 1663, 1664, 1665, 0, 1664, 1664, 0, 1, 1665, 1664, 0, 1664, 1666, 1667, 3328, 1667, 3328, 0, 0, 1666, 1665, 1666, 1, 3328, 3328, 1664, 1664, 0, 1, 1665, 1666, 1665, 1, 3328, 0, 0, 3328, 1664, 3327, 3328, 1664, 1, 1664, 2, 0, 1666, 2, 0, 1666, 3328, 0, 0, 1664, 1665] -v = NTTInverse(tHat^T * rHat) + e2 + mu: [3165, 662, 2895, 3180, 3096, 2552, 2754, 1145, 3139, 662, 1382, 1378, 2118, 2895, 2198, 827, 2191, 1885, 1171, 160, 2497, 2627, 1111, 1511, 3139, 869, 2112, 867, 1677, 1186, 945, 2953, 3140, 2822, 465, 601, 1337, 3166, 184, 1980, 1390, 647, 1430, 2980, 1919, 2431, 715, 3008, 722, 2402, 1695, 2916, 389, 2581, 437, 2928, 1182, 668, 1553, 2494, 2253, 2866, 860, 2400, 2660, 1111, 1239, 887, 2563, 2964, 1177, 215, 1398, 1450, 1079, 2113, 1728, 2088, 2296, 2269, 1229, 351, 1674, 1327, 808, 850, 2367, 718, 2297, 3319, 1583, 2896, 1877, 1330, 2682, 648, 430, 2540, 1472, 1069, 130, 3032, 2730, 636, 2248, 1663, 2065, 1864, 25, 1782, 3268, 120, 2262, 104, 493, 1869, 738, 2321, 285, 2707, 1230, 1425, 2241, 152, 302, 1621, 1291, 1833, 584, 1520, 562, 1753, 2559, 321, 498, 613, 328, 78, 1265, 3273, 211, 1402, 3121, 2341, 538, 2199, 3238, 2759, 449, 382, 2160, 16, 1281, 624, 2878, 678, 2335, 741, 2789, 2954, 2667, 1346, 901, 1308, 2659, 1863, 3056, 555, 614, 1541, 1613, 1336, 3066, 2408, 85, 2937, 126, 1730, 171, 2938, 1210, 1798, 890, 2157, 2744, 642, 1500, 873, 1738, 3301, 1887, 1451, 2996, 1726, 304, 628, 2244, 2373, 2022, 416, 3055, 455, 197, 1169, 502, 1609, 1217, 797, 931, 1522, 2381, 2018, 499, 2132, 2403, 3061, 2694, 1816, 2626, 2563, 1125, 3231, 2237, 2778, 801, 1564, 1671, 2200, 443, 1287, 1998, 1409, 137, 2944, 818, 196, 1641, 1692, 1626, 1718, 3188, 1283, 365, 1811, 2209, 164, 1439, 2581, 2067, 1856, 279, 2994, 2801, 3128, 579, 9] - -c: 778D6B03791ACAF56CAAFCC78CEE5CBCA1DE8737E9C7FF4AE5F384D344E08223C74C824CB5848520517C7F0EA0645EB6F889517AE5216B0CF41DDC3F0D1DF9BC6E4DECB236A5EA8B214F64266D3CDE08E0CB00E5D91F586706B1EE533D20476F4423B78F916B1726EEEA959FFB9AC634D04A94D09923CB0D4E730CCA4144E7C4884921652DA4928C68E644F673CFC57D3E87CF5BE581A89F9CB8F0FCE2782D681E5CE88AF58458C3D63D807572DE5AA8E1FAF2DCD14EDB7349565B7D3271DDBEB0B6CC7AFE08635784311159733C46E5FDC5E0CD36CE5685ACFB1AFE50ABB46F447521E60D9C8F0E4CA28C190ABB40C365F412471E95A8EA396D4BD8070EEB1F02B07C825367AA1EC0F10C3862416BB21AD6CA748A86E9829EFC1A0499093C85176D37F574C75CF5EDFA8D920D3268CB34C6A4BB0002869BC05D7C8FCC0658D4A01EACD74557A37D98A763074752DFDD6429881CAFF577D3A048031BD52C4E9726398590F9519FD59405D6B3C307AFCB168A985785D954A6D1DC1EA92E1EB6F946A4D99DD6CA307ABFD8362FABA98BB264C69C5F555D60883CC56019FEB4E8000C48B7E68CD667F00B5250CEF293A4A9E778726E62F120361E21AB3140464CDC6ABDE9EA05198D8B3BB671B9111A2F317582847CA5015664F22CDB08C143187BDE2129B54F34160295D75FE9A494FD7E67AAA76B57AAFFD89D01A71DF5C8158620298D582BBEFA6D09AC412A99AA3BE9C383504948C43DD5AF4127B1435804F44BAFA142BFC2A95D95FB2EF0641ABE71064DE51D6B9EC50857B8EEF7F48036313D0E936763B8F7BDE69B064DD5761D80EA6F1A8B37565753C579BBB895EFB9FCB3FC5FA3362E3774F0F77140B973CAE587BAD2F3B566A9C25A969347E5C54F87F1105E9C074867D94077CCAE3ABEA54520EDB51D9DAABE7848E78FDF66E07E2E22B30251931E890BAF1F5E177D4D9CEC9E4969481FD7C1335A0ED5879F34EF4BB4F66C28803CEA162BA461506D52EB3AE16951922B06825186C3D4CE1B51F3C92F3C52F2D04D1F13B2B17C9EEB882CCE0EB88B7EA9A1CE4E37415CC84C7BC436A4628386CC77D9AFD207911BD9BFD8A7FA05C275BE0C4C6A8FC0A61BDA1D67AE33B5310BE1290DC71C1418EB5744BF2842C1652173A49A692E71FE43258A205B3CAAB90C0304A51E77D01B404A01FAE2F83AB80C5DBF6CF518C001F46A633FA169B1BDB77A9D0B1E0C007835C09F6ABBA96F3F53564DA508EE8861A483A81749D4A44672B1EF1605F29D168B74B736B4F13501D7AD1213118A7832E666A50BE8010D54322A526CF7A4E543A79D0D98E004FBEC76EA3F7E887BDBAF50DADFDDDF3FFECF6D3F77EA4B9B16DC754F4A68E5EF32F6A137E7C9E3C3E8C2E236C7EBC45D46EC1677A5A8BB2668443B0BE8693DC257F13D8B9A90100B92B4D1761B819673832C32020671BFB3D0220A363E4BED6D649D3F7368CFE081E196A43D4708798E31BB2A2F61824674ABA2FC9DCD05DB84B8627AE11488886F921BC79AE1FD03 diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt deleted file mode 100644 index 00df74291..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-44.txt +++ /dev/null @@ -1,60 +0,0 @@ -Key Generation -- ML-DSA-44 -seed: 6CAE2E9C2CF64D2686C31C2118E0F24A47DD46DB85590910AAC9DF4C1B854E44 -rho: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28B -rhoPrime: 11779B16A7054953860C14796F63018C9EFD3957CC53A12AF727A5AFC64507445D9EA5E19B6403B3DD3ABAD9B1DAD1146E9C64410E372E7A6D9973F0D04D9632 -k: B149C045A55EADA0C519069A8EE0602FBEDA8D2EDFEA09CAE01D542D47DCBA1E - -aHat: [[[4518441, 4610216, 2805006, 6522567, 958931, 2266298, 7298857, 6160680, 4376220, 5886423, 2456656, 7246256, 4825911, 4337879, 2286865, 4975700, 7723526, 6630454, 2204799, 6974152, 3641877, 2682186, 3758592, 330607, 1959748, 3746432, 7597266, 4910389, 641899, 1715509, 4016248, 7983993, 461860, 1925060, 5588342, 6865940, 801570, 1437121, 2888995, 4630526, 7744414, 3207892, 3168892, 3304860, 2869380, 1589994, 6622481, 2993789, 239572, 1127468, 4289687, 3743089, 8306066, 670866, 224252, 2668871, 4766662, 6351470, 107841, 4351591, 6149703, 4029424, 2974292, 2952371, 2390000, 3452883, 5520752, 8045611, 3071748, 6918874, 1598525, 5839685, 2588194, 1661639, 8283367, 451132, 2401602, 4482892, 1648467, 3766818, 5943364, 2607508, 1396017, 354778, 7392330, 3426517, 2252104, 7582171, 7041680, 8254132, 4837419, 3427646, 5648239, 1340483, 2106014, 5619971, 8047549, 1766861, 4997094, 2655087, 1833901, 6496344, 1627718, 5577072, 1614037, 8275918, 3612158, 4023975, 2857599, 2705923, 4976039, 1646530, 3668470, 7279361, 1139314, 6200673, 6509985, 7634125, 751210, 1686515, 3632581, 6879928, 6710111, 5998910, 3641475, 7918054, 7161821, 781378, 7072756, 406340, 6364143, 3877989, 5757571, 4960393, 978980, 3293448, 8071153, 3426539, 2209015, 5829651, 6805842, 2205790, 4854682, 5689645, 4011852, 672630, 617486, 7641292, 4172951, 552101, 4850266, 2002565, 4698909, 668414, 2894419, 5170042, 6623145, 4969904, 5081850, 3046208, 2744487, 6937629, 4859523, 7875762, 2030321, 5614884, 6294169, 6123973, 7804743, 3650248, 6927979, 1296021, 325849, 7021109, 4763099, 5292228, 5427774, 6977480, 8119876, 376758, 1371392, 5321018, 3940066, 7227323, 1881381, 2508237, 1826744, 6054373, 1469672, 2013638, 2815608, 5224298, 3744517, 2208767, 3195006, 5346041, 3555416, 2810011, 5767192, 1992423, 1996425, 673727, 3820400, 2603024, 1265806, 4105841, 5709176, 1701301, 1257375, 2322551, 2282344, 6197550, 4919774, 1715437, 2310440, 4139096, 2777066, 4690551, 4375746, 1204776, 4339181, 492762, 6285749, 5544359, 2609114, 7793257, 5522279, 6469830, 6966070, 7131876, 1192681, 3121188, 3585363, 1109594, 544971, 1239128, 2606639, 383455, 4553205, 7290844, 5113828, 6265912, 5040919, 2360841, 5979830, 2226344, 5995031, 1428977, 6093613, 3906579, 6105434, 6821401, 454876, 4358818, 2011397, 3753793], -[1518172, 2060152, 4749985, 6513620, 2245042, 7549147, 2532897, 6922184, 1547706, 7925910, 4641118, 6372818, 5442868, 3048857, 7986176, 21420, 5056353, 6891298, 4542399, 7076213, 6275361, 8208180, 154945, 1948346, 3284898, 4989897, 7108808, 7056573, 6885085, 571778, 4065644, 2685766, 8155194, 541203, 5470838, 1472371, 2416151, 7749407, 8064363, 7548353, 4712156, 6871549, 8036386, 6504374, 3864765, 8053363, 8318453, 125969, 1939728, 632034, 2998769, 436571, 5781522, 2508874, 801728, 4798344, 1008085, 1423633, 1265200, 5674908, 7925025, 6212469, 673086, 8105049, 5030459, 7006432, 5881726, 158417, 7556353, 5968301, 973369, 527641, 3238686, 4879338, 610039, 4739629, 7852300, 5153192, 5167041, 1339561, 549682, 1776472, 270443, 7329846, 2925703, 51375, 3372021, 4292891, 8137765, 6613054, 6358921, 6961144, 1627786, 1999316, 225990, 1011796, 1146585, 2475820, 2057713, 970282, 5258000, 7836558, 3749162, 5684970, 2554920, 3989052, 3989309, 818669, 355042, 7609968, 3599884, 8237170, 4479000, 5550720, 1990775, 713096, 4937363, 3958646, 4051217, 4966364, 6410537, 7346515, 3787148, 1435141, 406867, 1274391, 4801696, 5836062, 5288721, 4747517, 640604, 4391898, 2414827, 3432201, 333532, 235219, 450266, 1274021, 2323020, 7881933, 2990152, 4693110, 1709601, 6672812, 465669, 2288253, 7720032, 1857528, 3611405, 8306302, 881492, 2094316, 3495978, 3387236, 4248594, 5144503, 2136154, 1923534, 6312530, 8023281, 1784993, 1014235, 2591079, 7276663, 4964399, 5833711, 5882067, 6787296, 1007764, 5428257, 1054806, 1862149, 5925847, 4453996, 1583669, 4383789, 4034600, 8279879, 3014613, 7745916, 5572748, 4191518, 124358, 5330651, 5649969, 5220517, 1969915, 5773922, 2155348, 7028310, 5826040, 5432945, 2178759, 1591689, 2687555, 1233601, 5835556, 4766760, 4122842, 7080329, 8233748, 2915448, 5224484, 7189786, 3972229, 8371705, 4438065, 6082193, 5771723, 3819276, 2996234, 3370235, 7895249, 3379379, 8105675, 1685296, 3453709, 6974001, 3392577, 5323805, 6564006, 2922350, 5250917, 4816644, 6745278, 6692013, 54937, 7819808, 1099662, 6594866, 2579133, 8127228, 7500445, 1077904, 1666808, 1627578, 7121000, 5726282, 2747483, 7782887, 6902073, 1423073, 3162770, 197711, 4261107, 7234872, 8079119, 7069423, 6875165, 2517374, 3357707, 5793532, 1574278, 5929221, 6438097, 1301156], -[5580016, 7782159, 4916820, 3492846, 1528232, 8008932, 7778144, 980016, 3083229, 8050068, 4533047, 3121986, 1216278, 1788935, 5913428, 2162915, 6613702, 7187741, 6399716, 649528, 544655, 6984351, 124762, 7905385, 4802618, 5676543, 978087, 7760525, 2252449, 5178828, 4024996, 7488399, 5945620, 3516586, 6926424, 851414, 1905338, 7805119, 7215103, 1367698, 7005025, 6583705, 2678247, 4431560, 3621123, 714899, 5589627, 3661459, 6251607, 7180144, 2041125, 8123654, 4508779, 1642245, 535598, 5791575, 3243986, 288972, 1258976, 6162954, 2678852, 3362489, 6783099, 2673543, 7949924, 7158207, 555311, 523584, 7898033, 5007402, 7048741, 1089711, 1038614, 8049732, 7151128, 5877201, 4199472, 3234224, 305330, 3409089, 7529662, 7093835, 7058243, 3103514, 8257718, 3430935, 2214545, 4830751, 7647853, 2548093, 1567164, 3347946, 4184655, 7725624, 1151396, 4558452, 3438973, 5913013, 6490784, 1816083, 1235129, 7714209, 7318389, 2443984, 4543605, 4550342, 6260869, 2009870, 3798982, 3596706, 2082602, 7487515, 5877287, 6535731, 2245110, 7979759, 1505718, 4801130, 19098, 4411481, 1436961, 2033515, 2267667, 8058670, 1073955, 6357383, 709520, 6872430, 4721983, 5360679, 3873632, 6149355, 7363592, 2845178, 2562854, 5496102, 2909217, 373723, 7138856, 613927, 2858137, 3130330, 7503022, 3222249, 5958159, 3619194, 3427195, 826897, 3613603, 3023499, 2513752, 262049, 7209308, 4572034, 5715316, 6851643, 4058379, 6356935, 1440714, 514135, 6906799, 6402882, 2558726, 3237259, 4465496, 1881604, 3392275, 459158, 4799953, 7181344, 6262321, 6085045, 3935786, 4292640, 3016549, 5513699, 5488484, 4269176, 3290063, 234979, 7209054, 5142806, 7101425, 8084356, 8369708, 6975023, 6467417, 7551178, 2509660, 2220413, 1744880, 8330255, 7740428, 5818101, 2958695, 8293183, 1703104, 5170863, 694158, 5810297, 6807628, 8124310, 6290425, 5997606, 5608879, 1296268, 7237136, 1822457, 4493472, 8255348, 5378147, 898876, 6900344, 1881619, 4712423, 2014144, 946306, 5177584, 3172773, 5441677, 7194832, 5233822, 6188125, 3818815, 2986839, 2891747, 3238179, 2665510, 4670825, 4431218, 2558983, 5303695, 5335001, 7211671, 1324392, 4155560, 1238623, 352487, 3111224, 8046879, 11016, 2642804, 8031881, 470499, 866313, 5069481, 2873574, 667775, 6897652, 3681050, 3265012, 1011725, 2310395, 6794032, 8221903, 5058927], -[3867698, 3883645, 7640217, 1653450, 7082472, 1447081, 7250588, 6581285, 294533, 5402653, 604135, 2911419, 6568667, 5301208, 4153480, 7717253, 3503939, 7212932, 5358805, 431999, 8123001, 3575610, 2966989, 6920466, 4811686, 5262876, 5878254, 1228969, 4668617, 136369, 4564256, 674798, 7403258, 3103734, 1902817, 3507509, 5780034, 5794528, 8343498, 6855770, 3314569, 7117130, 6455227, 493097, 2127494, 3351787, 248360, 6445957, 6449069, 7360619, 2832685, 2737524, 444922, 789268, 1785731, 5519708, 6852687, 3463042, 1363515, 4846634, 6309176, 7758177, 7140078, 4999039, 4168434, 4845481, 8376655, 1222988, 2220523, 814073, 7350739, 929651, 3207340, 2209495, 1801246, 6842001, 8161678, 2392071, 7100808, 8165593, 1266683, 26287, 1077846, 6835607, 7718291, 1416286, 2269897, 4921558, 485785, 3315594, 611576, 7989995, 987839, 6167298, 6411012, 248289, 833830, 7731057, 4594799, 7648777, 4674945, 2441770, 3659260, 7949656, 4424607, 5983814, 1014632, 49698, 619222, 7934754, 5933766, 5439181, 4175593, 76864, 1817838, 3352907, 7096503, 3873149, 6979849, 6868478, 6423983, 323477, 4902231, 4095937, 2776794, 8135714, 3564606, 1815038, 3363841, 7009231, 4599109, 6499403, 5401067, 7297969, 5973110, 4103010, 4954796, 2097084, 7347436, 4889534, 4262124, 4235038, 4932033, 6632728, 4928069, 1837592, 1352565, 4928866, 5553589, 5194490, 1822136, 2656487, 4329299, 4852935, 6044336, 6789270, 2636592, 284470, 6095094, 3148181, 7193700, 8039321, 7114030, 5318912, 3813707, 2312678, 2590242, 1964027, 2520436, 1472838, 1543667, 3889347, 535775, 274776, 4927494, 5500148, 2398943, 5789622, 947547, 1550227, 6740223, 1409204, 3434700, 3849397, 3814243, 646926, 111329, 6875554, 864036, 1432465, 1482868, 1986078, 63247, 4160214, 7392191, 4363968, 3335444, 5539216, 749669, 3060665, 3020591, 3514511, 3972481, 5352850, 6653620, 571371, 6913910, 5560871, 824977, 4712403, 1862050, 3251723, 467235, 6107009, 7570225, 7137228, 2567958, 174754, 1671568, 6781061, 6536043, 1474348, 203283, 1929596, 4268021, 7324374, 6864285, 2320114, 5894602, 486347, 849717, 7946989, 195446, 1212363, 8181349, 6223219, 4117548, 7261111, 7958608, 7723700, 6973511, 5142677, 3569022, 7339732, 4492625, 7723827, 7375389, 2086411, 181908, 396347, 2726536, 4452170, 5837876, 8377072, 5627687, 1379342]], -[[1279303, 2532728, 3723926, 1729839, 3554515, 7192021, 7349548, 488026, 4908512, 4753212, 2935848, 582517, 8226312, 3995094, 3902326, 5741747, 4972919, 4115615, 3317175, 6834082, 7323460, 573427, 117906, 2680762, 3977869, 6802298, 4350808, 7476367, 692851, 7212430, 7247385, 2513003, 1258295, 3256675, 5405716, 2036577, 4278264, 3388709, 953424, 6452628, 2700855, 8220831, 5011710, 8208478, 4352772, 2928017, 4393396, 2168691, 623598, 3328599, 3998364, 534668, 6148112, 3227690, 4861477, 8283266, 586852, 4073984, 6884509, 2169099, 1569696, 4711636, 7913079, 7454742, 211250, 3592870, 2498642, 513598, 3282434, 6651101, 4122429, 7450059, 2729210, 4272498, 2079560, 4592438, 1901429, 1893014, 6617247, 894772, 1128794, 5516347, 6371640, 7871953, 1496239, 5869781, 206873, 2188900, 7149361, 7023493, 6337361, 1758757, 3851211, 2092765, 8218384, 5907086, 5536899, 4082483, 2130791, 5057091, 2006344, 4039813, 8107433, 1668350, 5283839, 3606048, 5272715, 2397565, 5007287, 3790945, 8115279, 4020548, 7556076, 3942239, 3524809, 2994266, 6884771, 1077683, 1996486, 6978119, 5971665, 2606909, 6787740, 3383593, 7450843, 7584824, 8105951, 1401479, 5181903, 2690540, 523297, 3321928, 1367725, 3543984, 1555558, 6823124, 1831065, 1243203, 6990122, 4631942, 787269, 5553480, 693494, 1444751, 3485719, 7485710, 7420792, 7104326, 4283267, 1843580, 4260034, 1873542, 426165, 401486, 6589358, 3880011, 2032423, 2121508, 1916138, 4758351, 4401552, 5779887, 2860436, 6593863, 5081695, 4202248, 5069924, 2398934, 5506877, 8137104, 4429075, 6598969, 3964736, 555130, 3539468, 5937585, 1170550, 827954, 7297302, 7923441, 3067402, 943901, 1557953, 1934928, 2733436, 490124, 6849329, 8150031, 2303296, 1599065, 2537381, 333500, 862886, 8055632, 3540201, 1032498, 4792804, 6054459, 522909, 3185613, 464367, 1863182, 3295536, 4103063, 7423023, 5385995, 2775855, 3199389, 892455, 5296759, 849365, 5139235, 2008389, 2911983, 6241941, 1238812, 6174687, 2982094, 1113422, 938783, 7059221, 1734800, 4016617, 2292347, 5311484, 2543992, 299568, 2472565, 1310012, 4427750, 1680141, 4739129, 1351576, 6281068, 2885304, 561892, 3275418, 1798270, 1556508, 7335164, 454592, 1481328, 7120546, 4556406, 3425680, 2524385, 2696744, 8182132, 6449102, 2413664, 5718114, 521636, 1155506, 460943, 8092747, 1833977], -[2588787, 7264972, 1949825, 6006983, 4106024, 65365, 8042118, 4118970, 7298493, 5150193, 3503187, 6298208, 7082413, 6628507, 875436, 2772530, 1406536, 2280872, 2828381, 954090, 2076839, 5050897, 4475769, 2225131, 7118120, 7733023, 5380256, 7923294, 2471163, 5656587, 5229877, 1349453, 5489004, 7160049, 8092605, 1728427, 2175550, 635825, 897094, 3815049, 3282124, 2029619, 5550263, 4936206, 4294227, 6979739, 655083, 35701, 7380879, 3080743, 6423293, 7548297, 8229387, 1780180, 5014966, 6949210, 6671373, 4066690, 1277373, 3977637, 2320299, 3833464, 2158176, 7612292, 5098910, 642704, 6354228, 6855810, 1257984, 656182, 4155134, 7657851, 6786028, 4163551, 3658918, 696975, 3176269, 3299909, 589382, 5413667, 7564428, 7624131, 7752638, 2730219, 419268, 3892274, 714867, 1416747, 4555948, 3951837, 1909180, 6148843, 2626201, 5092443, 1473012, 5642995, 4211814, 6216758, 5798255, 2972642, 6069745, 7531656, 5510550, 2303940, 5456128, 560229, 6324598, 6728416, 2485231, 5553409, 105343, 6016571, 6462957, 3308595, 3153700, 2592460, 4215420, 600521, 3123877, 2644776, 1046855, 6048332, 7014019, 7269070, 1643295, 235324, 5040734, 5633949, 2855572, 7599411, 4989659, 6649349, 3749099, 6717074, 764211, 982726, 6822644, 2333790, 4353857, 1220958, 975158, 1154488, 4638406, 5038614, 2667522, 3507565, 5427602, 5555482, 934836, 1027744, 4011580, 3871212, 5853435, 7102778, 1196843, 6813958, 2825362, 99776, 1284806, 289769, 3318585, 2705395, 8308591, 107187, 1389506, 1431304, 4774512, 2847857, 7358547, 1558739, 7365439, 6194242, 1911145, 2891273, 1316031, 3360773, 1403043, 30324, 1698587, 3761446, 385509, 1858284, 705870, 8258769, 377990, 1898545, 894576, 3557282, 4629897, 5833132, 2586828, 4798068, 5611442, 6511628, 6884634, 1493708, 6048510, 8221241, 6021553, 5248480, 5765260, 5721630, 5661859, 4085633, 3348565, 1999214, 1958294, 6872939, 3567283, 534321, 5312654, 4153388, 5093992, 6454300, 7952066, 467209, 2177999, 5440902, 4520149, 6811250, 7364753, 2178359, 7325634, 6880754, 1405754, 7492063, 4465431, 5877044, 6364516, 4337892, 2462302, 6913486, 2440627, 409901, 5659563, 1559745, 8193169, 1215069, 2166309, 232782, 8196663, 1987072, 7793561, 7802230, 1949546, 6091111, 162868, 8220543, 5975956, 2171296, 1492660, 7845511, 3236095, 966714, 3316883, 2131015], -[7214090, 1245002, 5091873, 3288262, 5791684, 3803755, 1182560, 491901, 8125913, 8076680, 5245769, 261418, 5214617, 1778846, 4876381, 7795651, 7190721, 5880649, 4408791, 2467023, 3574516, 1248173, 7761758, 2235975, 4374782, 1626661, 3978887, 837583, 5235745, 1599171, 4722125, 8036000, 2714503, 7942919, 6652999, 1026397, 1043823, 379474, 8252447, 6841482, 6076136, 7991346, 2205377, 87069, 3074605, 2717905, 5328781, 3968095, 903688, 506337, 7220319, 5755646, 448503, 2644949, 831389, 357262, 538889, 4163796, 6057964, 1294134, 2663052, 4076289, 5586600, 1396275, 4705160, 7053357, 2883964, 406345, 1374354, 4332948, 1029004, 279419, 6636542, 4529366, 2351108, 4409698, 1338142, 5908375, 6384170, 4842362, 544686, 8234323, 4616269, 627864, 1631970, 5736636, 3659316, 6468911, 8344375, 5961775, 594709, 2850593, 6324275, 5042376, 1075204, 6152354, 6431084, 5546271, 7674344, 2823850, 1584983, 5034374, 8117886, 568783, 4611894, 39963, 983742, 1684251, 2643291, 3825305, 6225251, 2028326, 2009291, 7273081, 5679386, 544533, 7520328, 2101684, 2813660, 7336240, 7345845, 1093431, 6453688, 4827055, 409973, 1987340, 3579976, 5385536, 5829031, 4751524, 7257923, 3104015, 5510642, 8373776, 6078296, 519100, 2906332, 4401342, 1856885, 3005697, 5404444, 2558656, 2944819, 7349099, 2382031, 3211224, 8312742, 8103659, 8062449, 7392699, 3818121, 4225616, 6928598, 7109620, 4627220, 5284981, 1272140, 8073111, 135960, 2650625, 1533684, 1127131, 1898644, 247448, 5408073, 3682733, 5494057, 1767908, 6580607, 6935412, 1880523, 7293620, 6258505, 6978421, 3991535, 3556132, 576859, 5736265, 6633259, 884, 7605607, 4004045, 523198, 3396954, 6941056, 8112620, 1708240, 414090, 5260636, 3779436, 3580935, 3547923, 3238368, 1750330, 2693699, 769137, 4105604, 2851917, 5412669, 4823799, 4087508, 5916080, 2233153, 8094207, 5453445, 2431140, 7991852, 238306, 2267382, 252683, 6856823, 6552092, 4407510, 5917084, 1708488, 3967746, 814512, 4347019, 4287715, 4242787, 7485937, 1663006, 3581033, 5766274, 6649947, 2339668, 6884550, 6910508, 3669313, 5580577, 3551337, 5757673, 158343, 4404680, 5102557, 7042148, 2222677, 1398435, 6502015, 7121462, 1120694, 7500838, 3547108, 7722409, 8172842, 4078832, 7432114, 5607647, 2406552, 3823941, 5704073, 119155, 4984839, 6996480, 8222205, 678670], -[1502785, 581000, 1879879, 3156914, 1881, 5520763, 5935759, 6693937, 3320379, 537813, 3615546, 5159640, 8378114, 7826275, 4223748, 1036709, 4188652, 1484384, 5837742, 1356604, 7125068, 2395989, 1330893, 2911668, 1939147, 4710718, 1719727, 8071301, 5634364, 545563, 654278, 3304318, 4969457, 5539370, 2303242, 4995627, 4465753, 8245885, 6763821, 6734333, 3898452, 3722998, 1299712, 6769049, 1377368, 2908214, 4567604, 421417, 6262335, 2350617, 33592, 6581823, 7307321, 1202346, 8201474, 976710, 4506529, 6166292, 7327699, 807370, 3100909, 2687642, 1616262, 6499341, 2856549, 418495, 1508468, 2333450, 1800626, 8181786, 5911687, 2107476, 4333817, 4213541, 4063539, 6735982, 2820646, 6389940, 1158843, 4515074, 244540, 7813631, 1184677, 810509, 2194550, 8007913, 658508, 4985024, 1092544, 467220, 6540210, 7811261, 5855992, 6679079, 5671171, 6307749, 8189132, 7587409, 4129306, 1248229, 1951351, 528847, 1847435, 5277341, 3056245, 3383891, 46623, 4076284, 3481972, 7861379, 3161346, 3301328, 3963460, 648312, 5207105, 4952087, 564963, 5425267, 6659913, 8355131, 5399906, 4927795, 7431636, 2815882, 2538145, 5339797, 6863498, 4815843, 7963571, 390704, 4657086, 3257065, 2450447, 4756488, 260609, 4908346, 6471042, 6821104, 365682, 3167001, 7436986, 3754100, 8014606, 3653522, 5691317, 7225196, 703841, 4991615, 5060750, 4802316, 5669898, 2923891, 4096639, 2876583, 6916570, 1295212, 7070463, 3815406, 5593591, 307863, 7887401, 1195013, 2062930, 6493420, 7162249, 6165917, 1633371, 1155848, 4102687, 2595361, 1594031, 699359, 6340600, 6346037, 1394702, 6598893, 3450996, 1217433, 3986188, 7739076, 2918353, 3715297, 6796746, 2035447, 2314395, 5986496, 7940579, 996360, 7374792, 7397647, 4571139, 1824594, 8208877, 5912141, 1557570, 6492115, 1435560, 7362202, 495028, 1608298, 7712470, 5007077, 6445561, 8007526, 1229785, 5782624, 3752609, 6294465, 1219456, 4207775, 6782427, 5431652, 5014733, 6303859, 747560, 6130760, 742958, 1446765, 1441348, 5942755, 7017974, 5377921, 437429, 3479341, 118404, 6745093, 3385406, 4169486, 6915264, 2014287, 313377, 1266882, 4414167, 2092747, 3487847, 2727246, 5453665, 7929258, 3767661, 3543330, 1351459, 278072, 1017968, 1030806, 5304879, 679742, 2719859, 5557184, 3672367, 4095138, 7136369, 3378300, 7895056, 1112543, 5904443, 1202903]], -[[2404918, 276932, 3882934, 6309816, 7054, 1227527, 6032464, 1468902, 1006551, 7960608, 2274509, 6217106, 2692912, 3723609, 7365367, 479793, 8275436, 1223182, 7857245, 1698505, 4382472, 1020689, 4187499, 7730791, 1141069, 4064588, 2100349, 2608143, 5621896, 135891, 4094687, 5270722, 4117897, 6779221, 4130188, 2188880, 7309237, 8142312, 3208894, 2447742, 2444463, 5923969, 4340653, 4451352, 3157937, 4105317, 2036212, 5601367, 7290177, 7253956, 18454, 7080442, 3041740, 4371122, 1237977, 1371602, 5955693, 277450, 542356, 6950067, 4990246, 3317434, 1480980, 7103270, 4294298, 1195832, 415981, 2970518, 7707786, 6928318, 7251838, 7642040, 7660974, 3743720, 7290830, 5954427, 4780109, 964684, 7684066, 6979418, 1725456, 7383614, 2856087, 626237, 6401866, 3106189, 1444619, 4347453, 2951395, 1373500, 3207489, 3054027, 4187665, 2217116, 4606640, 2937783, 2753791, 4969896, 2478917, 4230228, 3142542, 4154066, 2249014, 6111716, 5250896, 1649030, 2616659, 1579147, 3229291, 5686831, 4078876, 6995665, 2846322, 6486235, 1936229, 7277093, 800481, 2388028, 5232539, 572028, 3408175, 8106863, 4771058, 1731325, 1791876, 4076429, 4431610, 5208613, 276462, 6781837, 4529871, 7045443, 1788896, 6958841, 2990803, 6754275, 3238036, 5448829, 8193306, 2476490, 1640507, 5280259, 2520904, 5198571, 5162632, 6571150, 6202832, 984789, 7199638, 4531630, 3170130, 859036, 7942670, 7980584, 492489, 4227106, 5311994, 2661568, 7654661, 2514672, 1704729, 928536, 5911230, 6845108, 6008402, 2655746, 4421201, 8287461, 5671446, 3330378, 1554315, 4185797, 8269183, 8361400, 2645345, 3545311, 4207346, 4376263, 44161, 509423, 881404, 2027491, 4801259, 2053698, 2445544, 5595661, 8015735, 3821274, 4795254, 2597044, 1703431, 523947, 4878164, 2948061, 6164412, 5935226, 6292998, 322269, 3877967, 6201686, 7083060, 4610491, 2591483, 8323966, 8210203, 6008787, 459729, 6682324, 54016, 5495567, 2341092, 2863364, 2469355, 7398004, 8181252, 63214, 4482387, 6869539, 7865106, 8298372, 3045726, 5956776, 3350095, 2414255, 1007141, 4612954, 3193628, 7229815, 7941391, 7818244, 6249602, 1134627, 1155382, 3806264, 6043308, 3861063, 4125831, 7150584, 2662306, 3134283, 5882310, 7954242, 2696106, 1531245, 6441348, 5025275, 993951, 8310223, 5200671, 1404277, 6774394, 6970434, 7466655, 2065592, 3474453, 6088781], -[693190, 1361324, 7727759, 1970984, 6574841, 5428942, 6405128, 7678800, 803027, 5292092, 7678200, 2171904, 4578474, 116086, 5949644, 7854469, 4486967, 6189516, 8037897, 190272, 4338939, 3526540, 2879168, 6535121, 868861, 3614109, 5851122, 809245, 3172146, 5334031, 2779523, 337330, 6244908, 5824737, 2773828, 1261154, 7470403, 5320506, 3732204, 4315046, 3837757, 969234, 5396148, 4315988, 332850, 2345289, 2541008, 3119173, 1261821, 1033729, 4386047, 2127580, 5228707, 5131727, 6255688, 1845701, 2725457, 560492, 4391584, 5155992, 5563458, 6850300, 6916701, 1405351, 3465283, 5372839, 3137242, 4568056, 6528909, 5493622, 1513135, 3042164, 2338753, 1956182, 8172059, 5768417, 4205354, 282772, 2589352, 7115443, 3974986, 8100327, 3241822, 443132, 5961877, 4984198, 245231, 3578585, 3576186, 2463032, 5524928, 7950739, 2614044, 5048629, 6849381, 8110943, 2554144, 7896925, 7009014, 3680131, 1146379, 2262467, 7222102, 6010112, 3567221, 5989929, 4466557, 6213649, 5578746, 3919629, 1591954, 1672284, 7951015, 2011223, 4394647, 3681219, 4046387, 1122127, 6995689, 4115547, 3486871, 5559996, 7016542, 5185015, 4138064, 4418241, 6454394, 6757035, 8012689, 1783927, 8157596, 45041, 8092587, 2470080, 7185169, 8317186, 1773582, 7845756, 4742896, 3108596, 5807894, 3636438, 2633279, 3089498, 1259630, 5404158, 7523232, 6382223, 5726497, 2198256, 7175573, 7590947, 6960575, 5319174, 3436716, 566892, 411351, 2744838, 6251469, 7524716, 686571, 8029625, 5579022, 1853509, 1066438, 5953627, 6174703, 1477997, 2578358, 4267691, 1066977, 2814682, 2229131, 6223372, 678095, 6556461, 8002646, 1003093, 7473557, 4645612, 2586747, 3919328, 5937281, 6870125, 3445412, 5786669, 1455705, 5885834, 3273128, 6923558, 1845642, 7740846, 1354208, 6535242, 4306761, 48780, 2305909, 6171013, 3181982, 4011679, 2923333, 7914097, 2329686, 1922218, 7603714, 2493637, 7762006, 7385885, 7628070, 5389856, 4157813, 7746219, 4536210, 5503325, 3034993, 941457, 2345223, 4856719, 1439570, 6246479, 759606, 6602955, 5781037, 5404049, 2339107, 6317760, 6516372, 2266187, 1041332, 3797342, 7626320, 6944604, 8123476, 8050895, 1147683, 3258224, 3535601, 2484659, 209440, 7068358, 4970998, 866248, 8117128, 2482345, 2352048, 5322014, 824820, 4752577, 849390, 1432826, 1130729, 169765, 7920358, 4450407, 6641840, 6176528], -[7312216, 779896, 2063100, 2626307, 113765, 2660404, 5929719, 639671, 4486125, 7505161, 3557068, 3961934, 3889306, 5903614, 4669780, 3123630, 4197544, 635814, 7701796, 2359696, 6854366, 6229635, 4784683, 239568, 479175, 2104853, 1396955, 2203805, 4558511, 647737, 7987135, 3209153, 8281079, 6540443, 8248882, 1482326, 5887339, 259681, 159989, 2310553, 3329609, 5679840, 6023629, 4496991, 3429663, 4063270, 6657076, 7482065, 4391535, 696832, 2866708, 4883516, 7916041, 3033765, 5673338, 4913378, 7804184, 6662795, 4598281, 6064331, 630175, 2233938, 7914047, 4283458, 4253688, 5327841, 3592582, 5344832, 1151693, 7603432, 3925031, 2193557, 2174267, 8173986, 7447582, 2925498, 7327635, 7672205, 2581250, 6237118, 2972818, 1404298, 6592867, 3545527, 5447734, 8186271, 3445122, 1277089, 6547218, 5031239, 7745109, 6935811, 8006482, 2210686, 246778, 4428898, 4343029, 415501, 7904272, 978164, 255568, 6374957, 5789812, 7041591, 6515334, 6788081, 7618211, 4963012, 323170, 611857, 5273777, 4903229, 6731920, 428412, 3992136, 691353, 6575120, 2248642, 4825680, 4526726, 4127444, 6061438, 3304649, 4612242, 2725296, 3114125, 4397194, 1092739, 8162970, 7769125, 7808259, 3278989, 5995383, 6276587, 2727229, 7163774, 7412419, 5696460, 8165463, 3186393, 2398123, 1302525, 4106632, 2465301, 4087308, 2394718, 557157, 4811562, 4480504, 4504800, 5632014, 4097984, 4498638, 3597303, 6478980, 1550286, 7668897, 296776, 4433133, 5419330, 7424148, 3902819, 4064440, 5024723, 785701, 8345980, 1456362, 3222982, 8002975, 297381, 6194682, 5811299, 4869584, 1250891, 1428092, 1854047, 3056635, 4229045, 2431615, 7045505, 206352, 5432465, 1009988, 110, 6225272, 964878, 6345997, 6848714, 4698291, 7007322, 6258933, 4098716, 7176292, 7590976, 6438244, 6457630, 391110, 359845, 5119649, 1858632, 8115938, 3054259, 6012581, 4448016, 6792916, 1401512, 1938527, 6982560, 3116142, 7760458, 5565554, 2920048, 7348697, 1908832, 758977, 7851218, 6584745, 5318671, 992796, 3653043, 6659111, 4527057, 595830, 2707998, 4657398, 2054082, 692515, 3577784, 6355980, 2554996, 2530985, 1675947, 7109321, 5034422, 2771451, 6292098, 601358, 931391, 3400188, 7208107, 4702570, 3464873, 3500337, 6880386, 6686795, 7057403, 6010082, 150408, 6011018, 1263009, 1551712, 2248193, 1177138, 4274837, 5576282, 7330853], -[5053121, 7113161, 8075856, 4167528, 3962210, 5505083, 2796737, 4967776, 2306280, 5546792, 2245077, 1129294, 1964533, 3418665, 3511436, 8207089, 2810020, 4388346, 1411686, 4853493, 327938, 7637758, 7560222, 5238956, 1778815, 6129527, 6177635, 3452768, 5295532, 8021070, 1706652, 3739501, 3145917, 5839037, 5599134, 3081251, 2772458, 7977709, 5134985, 2507338, 2332534, 2569773, 331459, 3371897, 3221114, 195644, 550863, 1681486, 5059769, 586938, 1108857, 2900477, 4446757, 1539910, 6350051, 770954, 3570979, 2387478, 8096619, 2734668, 702551, 633689, 758025, 2364495, 3957274, 7406722, 2797219, 7029565, 7991452, 764245, 1595294, 7921833, 5991981, 8218968, 621124, 5737525, 4837685, 2455209, 4514442, 1936167, 5692592, 1221236, 2267334, 2687325, 2840651, 1515157, 1845797, 1897198, 4926292, 8030343, 7509627, 5246153, 3989494, 7241730, 3118087, 8072141, 6044673, 6523822, 7082361, 4111590, 3396837, 4113521, 7911901, 3201742, 5769722, 4130087, 4639559, 3675432, 7530660, 4855053, 354, 4501909, 6180067, 4897693, 8224838, 5167137, 7687644, 1235701, 5771096, 3404054, 5753519, 383198, 5872232, 1948807, 3083525, 8104652, 7284239, 4906245, 3128685, 4067292, 7122, 989376, 5573652, 5950796, 6945281, 384627, 7355365, 7757148, 2442962, 6667045, 4274814, 3372859, 3977532, 5931239, 4726461, 7746291, 5745573, 4316024, 7726951, 4981744, 785671, 4959451, 7653107, 22380, 1289175, 6403709, 7231033, 5463892, 8104869, 2541338, 2288040, 4057059, 4961008, 2100467, 2984322, 736030, 1218345, 6994080, 6189742, 4213330, 6738712, 1496909, 979234, 5239844, 5180599, 417385, 3791658, 3641082, 7989596, 1964599, 4986514, 3255786, 94642, 1903907, 6835331, 8070542, 6391182, 3542224, 303226, 176878, 2988048, 1091003, 4813143, 8064394, 6374449, 4394761, 6252684, 1880120, 8019341, 7308861, 7013053, 5352621, 1241279, 1037965, 2985476, 2925196, 4340053, 7102167, 6532306, 6852547, 4323909, 1563722, 586450, 5973773, 607003, 1126586, 6999294, 7335884, 1119994, 4818376, 6264692, 2748165, 2923740, 4301253, 3502805, 1676677, 6283617, 3642267, 1194169, 3132115, 7024173, 7611267, 59918, 3567656, 6098403, 5507452, 3061729, 1892859, 4402578, 6470247, 8127388, 3951037, 1482816, 2038659, 4254688, 7785673, 8213130, 7448512, 8240705, 8178839, 3350255, 8043978, 5109954, 361166, 6331899, 6456125]], -[[8083583, 3829710, 4605090, 5594754, 3627807, 5380754, 6806165, 770598, 3986640, 7635515, 5405099, 2939507, 6176056, 5874875, 3050712, 2456835, 6040581, 918818, 1541763, 3527058, 6747497, 6680706, 2784782, 5338300, 5859035, 7861767, 5226208, 3646731, 2218415, 6777641, 3231279, 8089193, 2178602, 7352675, 8063521, 165409, 441802, 3532451, 2613031, 5788169, 3006463, 6034609, 1001381, 958354, 1255337, 972768, 5808421, 1532766, 343788, 6756310, 1635683, 4670195, 5004542, 4592303, 5349095, 1285586, 3770574, 8052986, 6648749, 7563122, 3582203, 5071876, 627014, 1066212, 2783078, 7530243, 673350, 3415794, 2304320, 61299, 3550745, 4385362, 8288515, 7029031, 7135897, 4346516, 5589622, 3994416, 821603, 97113, 4581136, 1609172, 1347491, 4617698, 1082075, 2579610, 5386582, 6940164, 476513, 4322096, 6561422, 8219390, 4255989, 7812840, 5376072, 6698656, 5848557, 7902483, 5226871, 775683, 5307299, 5739756, 3050838, 5095521, 5621441, 6041779, 5805538, 6559790, 4189853, 5779003, 3049125, 7525742, 2320349, 1696816, 7920223, 5919733, 5017285, 553575, 131679, 4422676, 7164224, 2658873, 6089695, 6922988, 758027, 6510045, 8040002, 1381866, 5063180, 2601947, 4144146, 1374267, 8288919, 586314, 7441113, 1287378, 5462646, 5658937, 4284260, 4653572, 8063585, 6354293, 7593945, 5454366, 2611916, 510348, 2359458, 820976, 8337310, 3100210, 355101, 757901, 5283304, 7474986, 4096366, 5529677, 5709894, 664473, 6374713, 5533511, 344196, 8240797, 2338959, 5959194, 5611329, 4732139, 2457133, 154121, 1030519, 2167510, 1031979, 8372840, 4393587, 4484784, 6594928, 964770, 4985949, 4123609, 1239689, 4823883, 4774558, 633791, 5078423, 29259, 7245694, 657847, 6328017, 4870886, 785978, 2440597, 5421803, 6593890, 7548395, 1499676, 4214453, 2989860, 3499875, 3194605, 7561819, 2100019, 7946911, 4331233, 5556846, 5016598, 5370252, 7576719, 1403288, 5522006, 486574, 6818497, 552158, 1663226, 3611901, 8108953, 7371325, 2968884, 2397774, 1701035, 6544439, 2640284, 2792045, 3251781, 1735899, 7122846, 5466290, 4090216, 2994553, 3904379, 6057140, 2200799, 2631972, 3825961, 6981918, 4757714, 3856461, 6599790, 2294283, 1228402, 4193039, 8232376, 6341481, 7657431, 3676721, 7676424, 5424772, 1319610, 2013683, 3086216, 3689587, 7478360, 374908, 8180582, 5272359, 2284128, 903495, 5779499], -[5225355, 3636085, 6264034, 4804566, 1436962, 4576464, 7345998, 2774594, 1298527, 6241183, 6452112, 187476, 4626517, 6625557, 6117743, 6996883, 7546288, 1645702, 5143135, 5781126, 3313530, 6198350, 1071644, 1606743, 2030585, 2793394, 6437354, 6815069, 365786, 912402, 2807180, 2444846, 4207302, 5682515, 3324528, 250138, 2241677, 2778633, 8187203, 5125080, 3685097, 6842468, 237575, 8277760, 5985038, 2182313, 3513126, 1558495, 1690723, 984433, 3065390, 834325, 3900087, 1220339, 8027192, 7827501, 5712377, 2309316, 7618569, 4667917, 209111, 547671, 2990894, 3029875, 3840480, 6234876, 6480262, 1616142, 3134535, 3219630, 5903603, 7724765, 4615016, 5343619, 4522733, 5695734, 4291086, 911497, 3378050, 5356362, 5920416, 6821882, 1303450, 289612, 1555202, 1050374, 985790, 2737361, 5747509, 5535358, 3900404, 6544391, 5064737, 6671371, 3953175, 211361, 7527848, 6249726, 7148351, 7859904, 751071, 370454, 4613019, 2094402, 3571025, 1485717, 3892850, 1000587, 3278578, 5518440, 2984482, 1988260, 2351049, 5780817, 2929124, 6025521, 5084991, 2432110, 1449094, 5949310, 1807630, 7614877, 2703509, 4930137, 8302121, 747394, 2700056, 4536986, 3004349, 645733, 1288299, 7899319, 4109700, 4260048, 6648121, 6234741, 7985892, 5415175, 2044539, 489102, 1650901, 599336, 7307686, 6971641, 2703366, 2714248, 6999091, 4062573, 5545722, 2514055, 572633, 262522, 6472981, 265927, 2333781, 5041919, 1757128, 2481415, 3044811, 6589382, 3793092, 535524, 8186782, 4168229, 4318436, 5949493, 1084649, 5152536, 6411003, 5507716, 5974543, 4173381, 3423803, 5184262, 6028781, 3119267, 1283937, 4269048, 3859755, 586742, 312849, 2977024, 3898483, 4595251, 5801076, 2286770, 7623905, 1931066, 4964292, 3168799, 4770064, 28804, 7315918, 7671593, 4423708, 4057181, 2078662, 6503625, 1152746, 791986, 6442096, 4333331, 5487539, 7718371, 1605053, 6395432, 284042, 5604759, 5887185, 2682932, 230814, 1253929, 6667400, 58175, 1946573, 8362101, 4601871, 4184777, 6572308, 423782, 6737961, 800386, 5423496, 5877781, 6739683, 6528507, 4496177, 2531393, 8095426, 7580028, 5380411, 5751984, 1228410, 6040280, 5230298, 2296028, 6362081, 671020, 5034343, 3130863, 4908217, 2360897, 361744, 2833225, 335952, 6760196, 2544094, 4654514, 4339287, 216508, 4532246, 1377143, 5431824, 1775666, 5169329, 7061706], -[1465241, 4597311, 4033004, 7584645, 4594230, 4330242, 6022842, 5220659, 1647018, 7693321, 6223896, 8022657, 5312843, 5162426, 1117933, 5704909, 3493111, 2599624, 4480078, 3295852, 5624992, 4594863, 8230150, 974360, 8015534, 1995426, 1505614, 2589524, 6523951, 105287, 2469411, 5678031, 2781466, 672652, 3955923, 3139639, 1067095, 782352, 1266575, 8132925, 5250378, 475689, 2848663, 1913665, 3923580, 8007784, 836532, 6475242, 3831088, 5251180, 2549448, 4934936, 7247629, 7843280, 5784618, 8263811, 470896, 4553059, 8222955, 2275616, 5423534, 7309517, 7722118, 7437545, 3726263, 516684, 3556441, 122422, 4223007, 4526597, 8191165, 4952207, 6684892, 2832200, 2956491, 2754815, 6384374, 3919934, 3156562, 6215647, 3648719, 4165962, 1049908, 3191371, 2463831, 5021312, 7163765, 983969, 1359389, 2807336, 7439773, 2846933, 210226, 8149774, 1224069, 1900516, 4082063, 2663906, 6731764, 5006256, 4843786, 131139, 8271247, 411094, 2141873, 2355696, 6482312, 6826733, 2872902, 3860070, 3892877, 8149564, 4072039, 5062393, 8369491, 971439, 1355257, 8067320, 7536078, 3362841, 3945360, 7922609, 1038076, 4585186, 3835586, 5543012, 6313539, 226082, 4435081, 7352070, 2398569, 4482981, 8347431, 4711297, 3545174, 3952417, 3522452, 2721926, 1584094, 4567039, 7180922, 5968668, 170613, 5490782, 6119679, 6045696, 2205548, 3234941, 4903033, 1332410, 4235969, 3064915, 7897050, 7239215, 5369900, 6142596, 491818, 6707112, 3706937, 1255157, 2476220, 2893221, 6604928, 3139627, 1718334, 8313885, 6429985, 862562, 7612735, 748282, 7973838, 1279466, 4372463, 6621194, 2670786, 2233196, 4755001, 607504, 4944429, 1107232, 6199537, 1132528, 1155726, 3575983, 4717358, 481821, 2023359, 8243902, 3685018, 3121498, 2360585, 7742988, 7887096, 5218910, 6415040, 4448412, 7883474, 2480538, 900303, 2700253, 3998553, 3887133, 5620654, 156068, 8183022, 2015316, 4731305, 7852980, 1498502, 5796115, 8102492, 4636472, 2433034, 6167914, 7685033, 6093632, 3155651, 2892040, 2321847, 2887011, 2143816, 6791238, 2373275, 2685789, 3050458, 8245498, 4366677, 331700, 781321, 4332612, 6332567, 351154, 7260785, 6092982, 901299, 2942274, 7153861, 8323324, 4735868, 900965, 6039242, 5662516, 6090297, 926985, 8256193, 4086608, 1786977, 1185340, 4049740, 355908, 1897329, 3716753, 1180520, 2162734, 4781944, 2114859], -[8338083, 4172559, 2550928, 1858116, 1603331, 4131505, 2410053, 6945245, 898089, 3000517, 836782, 3521873, 334161, 4235527, 2384101, 1220958, 3847163, 7230856, 669901, 1440757, 151879, 4242253, 183867, 3910486, 4970837, 1623134, 2920090, 6959202, 1373651, 5985685, 2220843, 8133725, 3326927, 35825, 627425, 6193505, 848088, 6885358, 5019375, 6403478, 8117835, 3528005, 4492911, 542425, 6167725, 8252674, 727831, 78912, 2053472, 1324828, 3598492, 6634512, 2417142, 3252452, 1458450, 1726049, 6248714, 7476988, 1995347, 1881935, 6808933, 3156255, 278053, 5826239, 5483659, 687474, 7957086, 5692599, 697569, 5874222, 5427099, 5240244, 7630248, 4203622, 3959272, 6988683, 5388598, 1456552, 5082875, 1365122, 4007360, 3921703, 775627, 7806091, 7888629, 6044033, 7169982, 3780967, 6439875, 1443136, 2913909, 4218596, 7179240, 6260750, 3975141, 7419390, 53458, 3522404, 7994183, 6411437, 2748132, 6625626, 4463553, 4256789, 6310680, 2080141, 4510977, 5855328, 539537, 7967406, 7562182, 335787, 5357214, 92049, 7763723, 2267335, 6296010, 2065654, 5704841, 469102, 3763995, 6398911, 8308380, 3362687, 493320, 3950692, 7590853, 1475516, 5875077, 201774, 599891, 139368, 6305444, 4973939, 3295421, 5608627, 4844526, 558116, 814564, 5061749, 7036311, 6634378, 6733961, 5951848, 2733103, 7588816, 1483859, 6325051, 629433, 5730649, 1661245, 3269145, 6314505, 7404969, 7470313, 3667537, 6484873, 4631831, 4022979, 3852366, 3714167, 266257, 4257440, 6515045, 3016602, 745014, 3524800, 2042961, 6722723, 2354629, 4610120, 721354, 35727, 4639915, 233090, 106241, 8145968, 2081586, 1242429, 5783828, 2802750, 4415986, 2120175, 2233461, 726528, 579024, 6849259, 6805860, 1395524, 5037239, 6193815, 476449, 7572016, 896779, 3236923, 7696116, 6898251, 7520417, 3135474, 7859088, 948642, 6983885, 1435791, 1269996, 7579894, 548325, 6984424, 3161041, 2899221, 3872096, 2380664, 1524458, 5454790, 596129, 8274749, 106451, 4595248, 4632249, 5470993, 5115659, 3764016, 1003334, 6488856, 1609339, 5511444, 6790866, 2251480, 6037630, 4582999, 2981359, 1126406, 6562051, 3842385, 1514483, 8035349, 2185048, 3455701, 2143171, 2545005, 5569422, 3811652, 2453715, 495237, 3994722, 547936, 6535376, 5207309, 3263934, 1362044, 3582116, 4124308, 7761829, 8226121, 6060326, 3498777, 6463985]]] -s1: [[-2, -1, 1, 2, -2, -1, 2, 2, -1, 1, 1, 0, -2, 2, 0, 2, -2, 0, 2, 2, -1, 2, -1, 2, 0, -2, -2, 0, 0, -2, 2, -2, 2, -2, 1, 1, -2, 0, -2, -1, 0, 1, 0, 2, -2, -2, 2, -1, -2, 1, -2, 0, 0, 0, 2, 0, -1, 1, 0, -2, -1, 0, -2, 2, -1, -2, 1, 2, 2, 2, 1, -1, 0, 2, 2, 0, 2, -1, -1, -2, 2, 2, -1, 2, -2, -1, -2, -1, -1, -2, -2, 1, -2, 2, -1, 0, -2, 1, 2, 2, 2, -1, 1, 2, -1, -2, -2, 1, 0, 2, -2, 2, -1, -1, -2, 0, 0, 1, -1, 0, 2, -2, -1, 2, 2, -1, -2, 0, -1, 1, -1, -2, 1, 2, 1, 0, 2, 2, -2, -2, 2, 2, -2, 2, 2, 1, 2, 0, 1, -1, 0, 1, 2, 0, -2, -1, -2, 2, 0, 1, 0, 0, 2, 2, 1, -1, 0, 1, -2, -2, -2, 0, 1, -1, 1, -1, 0, -2, -2, -2, 0, -2, -2, -1, 2, -2, -2, -1, 1, 0, 2, 1, -2, 1, 2, 0, 0, -2, 1, 1, 1, -1, 0, 0, 2, -2, 1, -1, 1, -2, 1, 1, 2, 0, 2, 1, 2, 2, 2, 2, 0, 2, 0, -2, 0, -1, -1, 1, 1, 1, -1, -1, -2, 1, 1, -1, 0, 2, 1, -1, -2, -2, -1, -2, -1, -2, 2, 1, -2, -2, 0, 0, 1, -2, 1, -2], -[1, 1, 0, 0, 0, 2, 0, 0, 1, 1, 2, 0, -1, -1, 0, 0, -1, 1, 1, 0, 2, -1, -1, 0, 0, 0, 2, 1, -2, 2, -2, -1, 1, -2, -1, 1, -1, 2, 2, -2, -2, -2, 2, 1, 1, 1, -2, 1, 1, 1, 2, 1, 0, 2, 0, -2, -2, 0, 1, -2, 0, -1, 0, 0, 1, 2, -1, -2, -2, -2, 2, 0, 2, 1, 0, -1, 0, 0, 0, 2, -2, 0, 0, -1, 1, -2, 1, -2, 2, 2, -1, 2, 1, 0, 0, 0, 2, 0, 2, -2, -1, -1, 2, 0, 1, 2, 2, 1, 0, 0, 1, 1, -2, 2, -2, -1, 1, -1, 0, 1, 1, 0, 2, 1, -1, 1, -1, -2, 0, -2, -1, 2, 0, 2, -1, 1, -1, 2, 0, 0, 1, -2, -1, -2, -1, 1, -2, -1, 0, 1, 2, 1, 2, -1, 1, 1, -2, -1, 0, 2, 1, -1, -1, 0, 2, 1, -1, -2, -1, 1, -1, 1, 1, 0, -2, -2, -2, -2, 2, 0, -2, 1, 1, 0, 0, 0, -1, 1, -1, -2, 2, 2, -2, -2, 1, 2, 2, 0, -1, 1, -1, 1, -1, 0, -1, 1, 0, 2, -2, 0, -1, -1, -2, -1, 2, 2, 1, -2, 2, -1, -2, -2, 0, 0, -2, 0, -1, 2, -1, 2, -2, 2, 1, -1, 2, 0, 2, -2, 2, 0, -1, 1, 2, 0, -2, 0, -1, 0, -2, 0, 2, -1, -1, 1, 0, -2], -[0, -1, -2, 0, 2, -1, 1, -1, -2, -1, 1, -2, 2, 2, 0, 2, -1, -1, 1, -2, 0, 0, 2, 0, 0, 0, 2, -2, 2, 2, -1, 2, 2, 0, 2, 0, -1, 1, 0, -2, -1, -2, 1, 1, 0, -1, -1, -1, 0, 2, 0, -2, -1, 0, -1, 0, 1, -1, -1, 0, 2, -2, 2, 1, 1, -2, -2, 2, -2, 0, -1, 1, -2, -2, 0, 1, 0, 1, -2, -2, -2, 2, 0, -1, -2, -1, -1, 1, 0, 1, 2, 1, 0, -2, -1, -2, 0, 2, 1, 2, -2, 1, 2, 2, 0, 0, -2, 0, -1, 2, 1, 1, -1, -1, -1, 0, -2, 2, 1, -2, -1, -2, -2, 2, -2, 1, 0, 2, 1, -1, -2, -1, 1, 1, 2, 0, 0, -1, 2, 1, -2, 1, -2, 0, 2, 0, 0, 0, -1, -1, 1, -1, 1, 0, -1, 1, 1, -1, 2, 0, 2, 2, 1, 2, -1, -2, -2, 2, 2, -1, -1, 1, 1, 1, 0, 1, -2, 0, 2, 1, -1, 2, 1, -2, 1, -1, 0, -2, 1, -2, -1, -2, 0, 1, 0, 1, 1, -1, 1, -2, 0, -1, -2, 0, 1, 2, -2, -2, -1, -2, 1, 1, -2, -2, -2, -2, 2, -2, -1, -2, 0, -2, 0, 1, -1, 2, 1, 2, 0, 2, -1, -2, 2, -2, -2, -2, -2, 2, 0, -2, 2, 0, -2, 1, 2, 1, 1, -2, 0, -1, 2, 0, 1, 0, -1, 0], -[0, -2, 2, 2, 2, -2, 2, 0, 1, 1, -2, -2, 2, 2, -1, -1, -2, 1, 1, -2, -2, 0, -2, -1, 1, -2, 1, -1, 2, -1, 2, -1, 0, -2, -2, 2, 0, 2, 1, 2, 1, -2, 0, 2, -2, -1, -1, 1, 0, 2, 1, -2, -2, 0, 1, 0, -2, -2, 1, -2, -2, 2, 1, -2, 2, -2, 2, 1, 2, -1, -1, -1, 2, 2, 0, 2, 0, 2, 1, -1, -2, 2, -2, -2, -1, 2, 2, 2, 0, -2, -1, 2, -1, 2, -1, -1, -1, 0, -2, -2, 2, 1, 0, 0, 2, -2, -1, 2, 2, -1, 0, 1, 2, 2, 0, -1, 1, -2, -1, 2, 2, 1, 2, 2, -1, -2, 2, 0, 0, 1, 2, 2, 1, 2, 1, 0, 0, 2, 2, -2, -2, 2, 0, -2, -1, -2, 0, 1, 1, 2, 1, 1, -1, 0, 0, 1, 0, -1, -1, -2, 2, 1, -1, 1, -2, 0, -1, 2, -2, 2, -2, 1, -2, 0, 1, -2, 1, 2, 2, 2, 0, -2, -2, -1, 0, 0, 0, -2, -1, 2, -2, 2, -2, 0, -2, 2, -1, 1, 2, -1, 1, 1, 0, -1, 2, 2, -1, 2, 2, -2, 1, 1, -1, 2, -2, 1, -2, 1, -1, 1, 0, -2, 0, 1, 2, -2, 0, 2, -2, -1, 1, -1, 2, 2, -2, -1, -2, -2, 2, 0, -2, 1, 2, 2, 2, 1, 2, 0, 2, 0, -2, 1, -1, 0, -2, 1]] -s2: [[1, 1, -1, 0, 1, -1, 2, -2, 1, 0, 0, 1, -2, -1, 2, -1, 2, 1, 1, 0, 2, 1, -1, -1, 0, 2, -2, 0, 2, 2, 2, -2, -2, -2, -1, -2, 2, -1, -1, -1, 2, 2, 0, -1, -1, 2, 2, 1, -2, 1, 0, 2, -1, -1, 0, -1, 1, -1, -1, 2, 1, 2, -1, 0, 2, 0, 2, -1, 2, -2, 2, -1, 2, -1, 1, 0, 0, -2, 0, 1, 2, 1, 1, 0, -1, 2, 1, 0, -2, 2, 1, 2, -1, 2, 2, 0, -1, 2, 2, -1, 1, -2, -2, 2, 0, -1, 1, 2, 1, 1, 1, -1, -1, -1, 0, -1, -2, 0, -2, -2, 2, 2, 1, 2, 2, 1, 2, -1, 2, -2, 0, -1, 2, 2, -2, -2, -2, 1, -1, 0, 2, 2, 0, 2, 0, -1, 0, -1, 2, -1, 1, 1, -1, -2, 1, -1, -1, 2, 0, -2, -2, 1, 0, 1, -2, -2, 1, -1, 0, 2, -2, -2, 2, -1, 1, -1, 0, 0, -1, 0, -1, 2, 2, -1, 2, -2, 1, -2, -1, 1, 2, 2, 0, 2, 2, 0, -1, -2, -2, 2, 2, -2, -2, -2, 2, 0, -1, 2, -2, 1, 2, 2, 1, -2, 2, 2, 1, -1, 2, -1, -1, 0, -2, 1, 0, 0, 1, 1, 0, 1, 2, 0, -1, 0, 0, -2, -2, -2, -1, -2, 0, 0, -1, -1, -1, -1, 2, 2, 0, -2, -1, -2, -2, 1, 2, 1], -[2, 0, 1, 1, 2, -1, 0, 0, -1, 1, -1, 0, -2, 0, -1, 2, 2, 1, 0, -2, 2, -1, -1, 1, 2, -2, 1, -2, 1, 0, 0, 2, -2, -2, 0, -2, 1, -1, 0, -1, 0, -2, 1, 0, -1, -1, 2, -1, -2, 0, -1, 2, -2, 1, 2, -1, -2, 2, -1, 2, 0, 0, 0, -1, -1, 0, 1, 2, -2, 2, -1, -2, 2, -2, 2, 0, 2, -2, 2, 1, -2, 0, 0, 1, 2, -1, 0, 2, 0, -1, 1, 2, 0, -1, -1, 0, 1, 2, 0, -1, -1, 0, 1, 0, -1, -1, -1, 2, 1, -2, -1, -1, -1, -2, 2, 1, 2, -1, -1, 0, -2, 0, -2, 0, -2, 0, 2, 0, 2, -2, 2, -1, -1, 2, 2, -2, 2, 0, -2, 1, 1, -2, -1, 2, 0, -1, -2, 2, 2, 0, 2, -2, 1, 1, 2, 2, -2, 1, -2, 2, 0, -2, 0, -2, 2, 2, -1, 2, 0, 0, -1, 1, 2, -1, -1, 2, -1, 1, 2, 1, 2, 2, 2, 2, 1, 1, -2, 1, 2, -2, -2, 0, -1, -1, -1, 1, -1, 0, 1, -1, -1, 0, -1, -1, 0, 0, -1, -2, -2, 2, -1, -1, 1, -2, 2, 0, 2, 2, -2, -2, 1, 0, 2, -1, 2, -1, 2, 1, 2, 1, -2, 1, 1, 2, -1, -2, -2, 1, -2, -1, -2, -2, 0, 0, 0, -1, -1, -1, 1, -1, -1, -2, 0, -1, -2, 0], -[0, -2, -1, -2, 1, 2, 1, 2, 0, -2, 1, 2, 1, -2, -1, -2, 0, -2, 1, 0, 0, 0, -1, 2, 0, -1, 0, -2, -2, -1, 1, 2, 0, 1, -1, 1, 2, 0, 1, -1, 0, 0, 1, -2, 1, -1, -1, -1, 1, 0, 1, -1, 1, 1, 2, 1, 2, -1, 1, 2, 0, 2, -2, 2, 0, 1, 1, 1, -1, -1, -1, -1, -2, 0, -2, 1, 1, -1, 2, 2, 1, -1, -1, -1, 0, 2, -1, 0, -2, 1, -2, -2, -2, 0, 1, 2, 0, 0, 1, 2, -2, 0, -2, -1, 0, 2, 1, -1, 0, 2, 2, -1, -2, 0, -1, 0, 0, 1, -1, 2, -1, -1, -1, 0, 2, 1, -1, 0, -2, 1, -1, -1, -1, -1, 2, 1, -2, -1, 1, -1, -1, 0, -2, -1, -2, 1, 2, 2, 0, 0, 2, -2, 1, -1, 1, -1, 2, 2, -1, 2, -2, -1, 0, -2, 1, 1, 0, -1, 1, 1, 1, 2, 2, 1, 2, -2, -1, 2, -1, -1, 0, 0, 0, 0, -1, 0, -2, -2, 2, -1, -1, 0, 0, -1, 2, 1, -2, -1, 2, -1, 0, 0, -2, -1, -2, 1, -2, -1, 2, 0, -2, -1, -2, -1, -2, 1, -1, 0, 2, 2, 1, 0, -1, -2, 0, 1, 1, -2, 2, 0, 0, 1, -1, 2, 2, -1, -1, -1, -2, 0, 2, 0, 1, 0, -1, 1, -2, -2, 2, -2, 1, 1, -1, -2, 2, -1], -[1, 2, 1, 1, 1, -1, -2, 0, 2, 1, -1, 2, -1, 1, 0, -2, 2, 1, -1, -2, -1, 0, -1, -2, 2, -1, -1, -1, -1, 2, -1, 1, 0, 1, 1, 1, 1, 2, -1, -1, 0, -2, 1, 2, -1, 0, 1, 1, 2, -1, 0, -2, 0, 1, 0, 2, 0, 1, 0, -2, -2, 0, 0, -2, -2, -1, 0, 0, 1, 1, -2, -2, -2, 2, -2, 2, 2, -2, 1, 2, 0, 0, 0, -2, -1, 2, 2, 0, -1, -1, -2, 0, 1, 2, 1, -1, 0, -2, -1, 2, 0, -1, -1, 1, 2, 1, -1, 0, 1, 1, -2, -2, 1, 2, 1, 1, 2, 1, 2, -1, -2, -2, 2, 1, 0, 1, -2, -1, -1, 0, 0, 2, 0, -2, 1, 2, 1, 0, 2, 2, 1, 0, 1, 2, 2, 1, -1, 1, 0, 2, 0, 0, 1, 1, -1, -2, 1, 1, -1, -2, 2, 2, 0, 0, 2, 0, 2, 1, -2, -1, 0, -2, 1, -1, 0, -2, 0, -1, -2, 2, 1, 1, 1, 0, 0, 2, 1, 1, 0, -1, -2, 2, 0, 0, 2, 1, -2, -2, 0, -1, -1, 2, 2, -2, -1, 0, 0, -1, -2, 0, 0, 0, 0, -2, -2, 0, 0, 1, 0, 2, 1, 0, -2, -1, -2, 0, 2, 0, 0, 1, 1, 1, -2, 1, -1, 2, 0, 0, 0, -1, -1, 0, -2, 1, 1, -1, -1, 1, -2, 1, 0, -2, 2, 2, 2, 1]] - -s1Hat: [[6579390, 3234202, 5760413, 813693, 7870206, 2714807, 5107675, 3985485, 7446642, 7802351, 141, 5569695, 7400683, 4456408, 3517152, 6601894, 3332893, 55620, 1169651, 3111757, 661012, 3610743, 5046516, 8072167, 508778, 1766524, 3229308, 7203161, 5380902, 5188330, 8055823, 8128169, 2817872, 4107211, 6367648, 1695164, 3786392, 7225557, 2553668, 3778664, 3699611, 2182416, 1488561, 1267703, 2951877, 5445089, 5654853, 3346216, 7966369, 4377444, 4951861, 2854808, 1524437, 2942619, 769466, 8189886, 7518358, 2016270, 5304549, 3962640, 1244803, 3496148, 5890731, 4006497, 1365117, 6765135, 1399066, 6950605, 2254178, 5327227, 1610130, 7482656, 6639515, 2134671, 2797987, 6708377, 6680920, 4251072, 4497451, 5756808, 8198722, 3326241, 2240860, 4774795, 7008524, 1969453, 3244854, 2750638, 615380, 3885211, 2353675, 6259422, 115442, 4047902, 1485587, 3101808, 5447822, 510632, 2875594, 2764403, 6359926, 1687163, 3176520, 3837004, 4684471, 6679118, 2584327, 2707017, 1122616, 2622865, 7477253, 6434841, 316700, 6947181, 5276845, 8094036, 2224801, 7817467, 5605892, 1763986, 3830369, 6956190, 353481, 1890521, 3620122, 3021081, 1625346, 7205026, 479943, 7254439, 5334505, 4432845, 133218, 8280893, 4460942, 5355173, 5201069, 6857548, 5066208, 6695302, 4226067, 6816327, 8017334, 2752344, 2789281, 3741958, 2516782, 4752862, 6615384, 7622555, 7469261, 604980, 4280277, 4441746, 2759765, 3427063, 6198445, 577872, 7309699, 2421732, 6829873, 7333638, 3082152, 1042274, 4995667, 3153414, 6296691, 7254489, 3687149, 1384177, 7562126, 5827974, 5957043, 776181, 1871817, 5008466, 8313612, 207994, 4059440, 2762107, 2498073, 6211891, 8304285, 3440601, 1958798, 3410905, 4407271, 4105466, 6554661, 948386, 7565578, 3238770, 5348055, 7700742, 7187028, 2827373, 151723, 6734005, 7529760, 6296162, 7599625, 6523851, 6962820, 5963896, 3489862, 7535357, 2821382, 6868118, 6533303, 358286, 4783166, 3532648, 483862, 8195643, 530865, 530010, 6475981, 1220411, 3387939, 2317848, 4660787, 5956734, 5516147, 5275866, 3800910, 2769699, 1025042, 363223, 3720915, 3290599, 6615991, 4046541, 4965397, 5544664, 7874159, 4782981, 7285488, 6243171, 7479862, 1387929, 3612500, 7789, 1361188, 4537444, 7636644, 7325338, 6619043, 2144286, 4684364, 6645684, 5392547, 1741394, 8129123, 226488, 5008522, 5413940], -[1777819, 261206, 3793527, 4091808, 8075935, 8319015, 1591393, 6418054, 2659780, 5318519, 4711574, 7434797, 1779310, 4891453, 7850950, 3606500, 6953358, 6567997, 4000959, 7793710, 4221931, 5061350, 397144, 5848952, 3992205, 1048912, 4906375, 378078, 3154532, 1986180, 7351667, 4901240, 3831291, 4457571, 6756994, 1184063, 3326351, 4545355, 4573799, 3066837, 954002, 3777153, 5416138, 560161, 1271638, 8296968, 8337038, 357740, 5201860, 3635609, 3710042, 2129489, 1054585, 6441249, 4897927, 4789549, 4284817, 2916227, 1613838, 5350683, 8105129, 1691146, 7230283, 5818923, 4504536, 3505099, 4763339, 3969503, 4601754, 7943124, 1541811, 3579580, 7752585, 2569266, 5582802, 527110, 7800025, 5999933, 5240212, 5489096, 7594664, 7892749, 8339295, 5813455, 3072485, 7500889, 7715052, 7741685, 8267641, 7721448, 1735362, 1622116, 5012310, 1114293, 3617880, 7751481, 4984741, 8362961, 8242480, 563139, 6356273, 3369936, 7860188, 3586347, 4160032, 2128411, 993930, 5868301, 4374049, 4493726, 3675523, 5208597, 500897, 1927534, 17145, 7977174, 3097861, 7217438, 2679712, 2017426, 3086931, 655663, 528636, 1408453, 1294053, 5674646, 5398960, 5163639, 986231, 2039018, 1665291, 1650164, 1775820, 3584220, 8228266, 4275387, 8376284, 3306274, 4239049, 5424552, 2016017, 8076321, 2975703, 6824058, 1910491, 1124358, 3025053, 5992539, 1357374, 462145, 1840035, 4980580, 7455912, 5685185, 1702221, 8368335, 4576883, 1191289, 6631773, 6393827, 7108068, 3102656, 8373950, 5339894, 5952018, 5288816, 7239649, 884244, 1918455, 7996127, 1109648, 748377, 8347152, 2749158, 4184314, 5981177, 5859752, 2878076, 350219, 8068589, 1192939, 3845527, 4450823, 2034780, 8104147, 3755756, 2267333, 4524780, 1571126, 1694039, 8363207, 6519186, 7655560, 6368507, 942539, 701445, 8328360, 2621252, 6380467, 1773815, 4647469, 7060147, 2475923, 5462960, 673272, 8065209, 7207180, 8141424, 4010569, 7737861, 2053448, 1531535, 6497567, 4615341, 6442307, 6618443, 3931807, 6783312, 4285425, 7932012, 704918, 5667957, 5924372, 2508599, 6041736, 8352639, 4105086, 6574689, 1452132, 5917986, 8142073, 2760529, 850421, 3689343, 8186586, 8048995, 1471403, 5766166, 3416432, 2975963, 320464, 4671906, 3361886, 7147872, 7119040, 5278942, 1999948, 7805974, 2554862, 3228850, 8071247, 1968259, 3206951, 322650, 1346000, 8015815], -[4210846, 2632563, 1462415, 7922880, 6998343, 2905191, 1706001, 4830423, 8168731, 3073535, 1021728, 3391631, 7847474, 4202026, 5017409, 7715663, 2190774, 5789630, 7632613, 5260264, 1633572, 529986, 608417, 8053588, 532671, 6341917, 4739054, 6284372, 1184604, 2616586, 3822612, 7873299, 646484, 7485308, 3096700, 1341094, 3897162, 5977822, 1946230, 3799171, 3531553, 5262057, 7105025, 3129309, 6592650, 2306241, 703288, 5501454, 835221, 7286058, 6447395, 3701317, 3151883, 2102688, 2508019, 7419072, 5493830, 1167334, 1092113, 3500870, 3199898, 4500193, 6206158, 4654671, 2452867, 7047682, 3713394, 6729779, 5595074, 4300514, 2830220, 7825357, 7184511, 6656569, 5961395, 6398149, 4773990, 7053708, 7043945, 6610263, 5903516, 6427273, 6673380, 7331906, 1636264, 6439231, 2630090, 7437495, 1562711, 310978, 1336264, 2638743, 5523535, 6157256, 7228206, 1327784, 1408589, 5639984, 6398948, 8303172, 4163198, 1214819, 3159419, 3323112, 4236011, 7365422, 6119754, 4188613, 4599034, 6750659, 3963885, 5566213, 8032890, 6705399, 1627261, 5596707, 3369915, 5894168, 2791646, 1627712, 1928989, 1502498, 5092528, 4574107, 3515054, 44637, 6225401, 3705451, 7480701, 231684, 4837474, 5812809, 2796129, 8039178, 664757, 3239434, 6586534, 987181, 6771301, 2467911, 4762599, 7331833, 6791249, 2606543, 7950095, 4317319, 1794048, 4433576, 3004013, 1509470, 1368933, 1958976, 5074369, 3782457, 4963484, 7512407, 3721208, 7607113, 2600686, 4771850, 2823703, 7125126, 4071644, 7407005, 2263430, 1577937, 7525562, 5420729, 7286064, 3091365, 7040038, 4160447, 2360769, 306859, 1151146, 1258695, 3356637, 2098003, 7806531, 4546081, 1668275, 3113968, 4031587, 5727394, 3696996, 2662191, 4385469, 3954235, 721299, 5064616, 3575042, 792515, 4023773, 2500093, 5024093, 5251714, 5430853, 596123, 5448558, 3740167, 7085660, 5646570, 1203098, 5191110, 12283, 1670591, 4431962, 1940154, 3757822, 3792108, 8049016, 157827, 7015364, 4443649, 1424391, 5721124, 7951897, 4784997, 7607976, 7639798, 180896, 7068729, 5579847, 8345891, 482938, 3243912, 4119032, 4044079, 6152105, 2165999, 2815576, 183984, 5700573, 3634357, 3299126, 2604516, 3167438, 4552953, 4797131, 4094544, 781367, 7323094, 3957716, 2837595, 6475888, 7772725, 5367157, 1766678, 5557409, 5642029, 5016057, 4739958, 1199913, 2649352, 81630, 5494236], -[3403971, 3716226, 2350306, 311129, 1392253, 5521860, 2432006, 1589053, 715014, 3344243, 3872748, 7139941, 933479, 6536172, 7059154, 659654, 2372053, 4631029, 4706989, 7191318, 1581026, 4093836, 7906106, 5822701, 5474901, 4682649, 5793945, 6341552, 3592866, 999973, 6911492, 7414933, 4699049, 4135185, 7754957, 2214785, 1559232, 3498898, 3223528, 7804173, 6564043, 3416337, 2098231, 6460717, 2190718, 6870293, 6812863, 5429070, 4485814, 7931908, 3885564, 108673, 1333436, 1100374, 5389416, 2634959, 5493555, 820519, 2891908, 1215297, 8022625, 1052319, 8171684, 552251, 7707606, 1301876, 6613266, 108202, 1546325, 5542902, 3616405, 7398941, 5102734, 7106617, 7709406, 3440500, 82263, 1292286, 8355094, 1426041, 2537192, 1386053, 3967622, 4540861, 189623, 6028704, 194583, 3262408, 3843705, 3891321, 5966332, 8084755, 3846192, 957106, 3563402, 6525384, 8007749, 1571876, 506995, 4751162, 5546215, 5030703, 6822558, 8225476, 6039693, 2691985, 831000, 1768135, 5792236, 3720218, 4965142, 7702380, 7865283, 4344721, 2659363, 5188879, 1845034, 2325646, 2849999, 6341118, 8228912, 473604, 5958848, 7481882, 6382303, 5301092, 8072043, 7982189, 2011207, 2662834, 3994474, 5733637, 7370637, 5457818, 4896232, 3044205, 6394406, 2637125, 8137749, 7103744, 2410412, 4912777, 7236253, 1906101, 5867038, 7430061, 3496728, 2361595, 7162981, 4688635, 4663715, 564460, 4319560, 5497315, 1131778, 8357520, 4449396, 2887298, 5176808, 8310409, 2103164, 5355198, 1314192, 1333922, 7627092, 5035248, 4012636, 82094, 6160396, 5238502, 521834, 6169832, 3956039, 7990750, 6823038, 4384273, 6076013, 149552, 7859758, 5081836, 5979316, 2886707, 801491, 2408061, 7621040, 4394426, 7992912, 3311222, 8236976, 3604812, 188568, 5814755, 5208294, 1542434, 5748310, 752834, 8157781, 6609789, 3230371, 6825820, 1260726, 4232643, 4673970, 5749046, 2579455, 3582036, 8027541, 8287944, 1039528, 1224694, 1979993, 2949218, 4343295, 8210997, 4443771, 7371963, 6881009, 7204172, 786485, 5167849, 4383249, 6365828, 3655991, 4768139, 5331403, 6054675, 5379218, 1061808, 8204951, 2653330, 2084986, 7376605, 7412925, 2070061, 5789716, 5533405, 81429, 4396569, 145151, 7694275, 2416267, 8061887, 1917003, 6986799, 4689104, 3481676, 3602354, 5285944, 2626294, 273894, 2469254, 4502811, 7324319, 3572447, 6555545, 3176930]] -aHat * s1Hat: [[7173756, 4463163, 7813712, 8016531, 3997849, 5162484, 7557753, 5209556, 2455766, 1538558, 5954781, 7567856, 8230327, 5889153, 3360342, 1138821, 181145, 4804369, 2808142, 6333266, 3085444, 975796, 4574536, 4489251, 7527120, 373153, 6008302, 3141197, 5608805, 1043230, 6743931, 7811993, 2682956, 7739834, 1864028, 8157075, 7576707, 6020957, 4683726, 4124676, 3516847, 7815986, 6043031, 4976847, 7787749, 4890002, 4952002, 5665440, 3298602, 3234377, 2526698, 7786455, 4379810, 6237612, 5889381, 438607, 5181618, 8248510, 7193304, 284918, 5432635, 6790412, 1785156, 979070, 2110597, 5818966, 5731551, 1443433, 3178894, 5535253, 2533321, 7778379, 734983, 6045692, 3407963, 5523841, 7632620, 4660511, 3948421, 7212453, 197434, 2447231, 6133534, 6773050, 2921294, 1314805, 3206488, 7654354, 2743508, 525315, 3367701, 3644062, 7975859, 8219225, 7416907, 6990697, 5651960, 488369, 5698785, 5470582, 7900704, 3279218, 8207650, 1711549, 3499379, 3039621, 2778722, 5563946, 7790020, 1870085, 1164406, 2827076, 2867556, 4381889, 6198274, 1772562, 7624864, 944102, 1748708, 5659987, 2141930, 6742563, 1955877, 1204357, 8205041, 8075370, 1935743, 2298664, 7158458, 5419090, 1793717, 2319608, 1676958, 640214, 7702535, 5080581, 6921654, 5411094, 2731479, 6296734, 2241471, 6689308, 2734852, 5753792, 7597455, 4257683, 8299793, 7898875, 6612590, 6782606, 5765883, 4301433, 396655, 5048539, 6595430, 4514167, 5033687, 3948416, 8371884, 6133585, 206517, 6977786, 6656907, 3595264, 2618658, 2317087, 5278380, 1140711, 2270649, 1226621, 6504948, 2982810, 1220884, 1169248, 6804380, 8061390, 7130391, 5698609, 2917631, 4870488, 6771651, 3577087, 6419000, 4287419, 7677836, 2991718, 8123281, 3751452, 5559827, 4206879, 881391, 721806, 3269284, 5465012, 2415071, 3086890, 7190174, 934025, 5558825, 6805457, 2741958, 7618748, 4167520, 6510915, 4531194, 7138987, 5934426, 1742549, 1332316, 1337852, 3945028, 3764133, 7030001, 4200351, 3566501, 4869468, 2122174, 4769298, 5510392, 4719401, 4119965, 7931459, 2547042, 2698259, 1686597, 5183322, 2135077, 3308862, 5645462, 6666154, 878250, 4181880, 3137050, 6609634, 6287614, 4251094, 412379, 7912804, 636015, 7767796, 8105857, 7760035, 1182664, 1425300, 738558, 6601834, 2923470, 1793608, 7209242, 4842600, 1424066, 3339528, 2894985, 1610136, 844885, 6974182], -[5284259, 3885376, 1368620, 132205, 6879018, 685232, 7336444, 6249654, 2777641, 2709738, 3850162, 6826710, 7020678, 3892065, 1694446, 5674450, 1387712, 2742244, 6830513, 6694116, 6449419, 2587617, 2862001, 6993137, 4993423, 5191364, 7871548, 1709781, 2499282, 7094064, 1931730, 6612107, 2422206, 4544859, 4097710, 1240405, 7819296, 5039980, 8273103, 4328835, 1384560, 4612419, 2927531, 7678616, 8042905, 5540072, 1813238, 3336605, 4485892, 234744, 6326804, 1428110, 2868336, 5252129, 4692503, 247667, 6029092, 4569463, 6940634, 6316079, 2357833, 2961166, 7044263, 4193375, 4323430, 721207, 3520689, 1983955, 6486585, 7428184, 3490782, 6402040, 5632770, 6052599, 2392897, 1843030, 54600, 3452802, 7592889, 4348669, 232870, 4936540, 4505370, 1226226, 6846259, 7978702, 7135420, 725085, 7279340, 4022518, 3580894, 4490629, 1188006, 3023546, 271963, 3958021, 2967085, 1742538, 7974138, 7813494, 5216320, 5045473, 7171949, 573799, 3868474, 4120761, 5561968, 4568926, 4356697, 50391, 1335694, 3010752, 667170, 5893837, 6747946, 6922841, 7679909, 1321817, 7249114, 6803703, 563728, 836610, 6687639, 1078442, 3031955, 2398308, 6014605, 3793995, 7182934, 3740413, 4977967, 3183907, 4697706, 1047560, 115947, 6275570, 7108168, 564545, 6037497, 4249495, 7181731, 1594144, 831004, 2844727, 1341690, 3763207, 6734110, 2142665, 5937723, 1523678, 6661419, 4110393, 4661110, 153775, 1831294, 5661523, 1088074, 2438553, 6436489, 6493131, 3980503, 1974865, 1911800, 3898070, 2982239, 4955344, 1456388, 5514401, 7899861, 6006142, 1950111, 564686, 628696, 6747763, 2409809, 6766205, 2027279, 1335548, 8044860, 8065642, 6284116, 1143350, 110906, 4901667, 3969739, 213428, 7850848, 2112202, 5132388, 7398187, 2008037, 7419596, 6646869, 164900, 5250517, 670605, 2517637, 8028184, 3241948, 579951, 6574635, 2821707, 5273368, 4471160, 5262380, 2862328, 7371545, 66487, 998449, 707717, 5349877, 7761980, 154147, 1284556, 544310, 3384496, 1831031, 8215913, 5332844, 6501612, 5650853, 7986074, 6023911, 6769778, 6845814, 2590542, 227588, 186742, 2906736, 7021328, 7209266, 1348916, 2895486, 6323851, 2874799, 944544, 547546, 3445958, 4927316, 2244703, 7666869, 2341454, 4783335, 4187707, 265376, 3081431, 2958912, 4404846, 808479, 8208562, 7357641, 149446, 3011179, 3815373, 1152471, 290835], -[1828613, 8016403, 5983422, 6981535, 5591372, 3243001, 2083753, 755060, 6994817, 236727, 7259592, 3082803, 4788195, 4417006, 127649, 6622423, 6290244, 204714, 7692701, 2433055, 4616518, 5542513, 702763, 2369015, 1262351, 6082768, 1317834, 5632989, 4369493, 3633054, 1865683, 448730, 3995611, 1978094, 8255725, 5443626, 3335714, 5228716, 1276548, 2525005, 3539778, 7339034, 8229561, 1188959, 5295636, 8359844, 3999191, 2844072, 5623737, 2324931, 7118387, 3690742, 480546, 4860952, 2229159, 129017, 6579449, 1161086, 6914990, 5310637, 2802356, 6893936, 3082578, 503004, 7517607, 8327600, 4659301, 6434554, 7161961, 6699552, 8244848, 3453018, 8173438, 5602359, 6184039, 4861973, 4920905, 458434, 5951104, 6301117, 212785, 4307324, 9935, 5856350, 7887116, 5068732, 6670294, 8076921, 6039646, 5771485, 2840701, 2662546, 5732224, 4991429, 2569381, 2240628, 6488656, 910312, 2811854, 5059180, 7212233, 6272578, 5039645, 7812602, 2913486, 5308512, 1844973, 1583306, 2987065, 3868461, 4177759, 5989914, 6699121, 1980919, 7981068, 813187, 6017264, 1082665, 1973788, 4577724, 2660607, 3467445, 5016886, 5629206, 1735677, 5340212, 6747271, 7796070, 1810761, 2917464, 1454610, 288724, 8328418, 2896928, 5527649, 7523745, 3331102, 2066184, 4515028, 6237003, 5920268, 3380294, 971341, 5956007, 4680424, 7826416, 3741661, 6217149, 4782079, 6678674, 5433007, 2443426, 4056992, 4236574, 1716903, 2745623, 4690903, 4027458, 5070286, 6737845, 6713729, 7448403, 869110, 345984, 4142952, 311497, 35586, 818857, 7685169, 6229066, 8208985, 4182387, 1815494, 7682553, 7919073, 5298111, 6708928, 2719787, 8148063, 4433677, 6317452, 6693699, 7650640, 2803205, 1267025, 717633, 8077413, 4299309, 2569654, 3671841, 1182656, 3509469, 87076, 1680595, 3909067, 446204, 6473563, 1811194, 7113769, 6407595, 2937192, 1757380, 7222684, 4790444, 6669094, 6631017, 4250252, 7733012, 5733400, 603663, 3848738, 7238566, 1841786, 6437669, 3843662, 7634813, 6085483, 3993109, 567969, 4175191, 2538293, 8211327, 454464, 1642273, 4664663, 2141046, 2890663, 7375350, 4196109, 3057923, 6547589, 2187753, 8216849, 6959826, 5725311, 6917744, 4979582, 1929950, 5991694, 6141079, 4399771, 5624709, 5566349, 8105364, 6050465, 6820262, 3547671, 7845983, 1978852, 617977, 3104838, 8060717, 3782109, 8212420, 1467857, 4448722], -[7860225, 8258854, 8004522, 1814955, 6846388, 7533577, 2341537, 5866449, 3366727, 6720900, 7291455, 4012098, 6941796, 2314989, 1645772, 2138598, 5286343, 7487624, 8210689, 33563, 3564209, 1856957, 6534553, 6881485, 2561379, 3017989, 6789878, 7102051, 2817256, 564530, 3067077, 3656212, 4371530, 2132581, 2041098, 2631160, 3982766, 6394254, 5025594, 1605205, 5641729, 4505604, 2406708, 4092343, 2191105, 6368215, 3137793, 2844984, 6914375, 4221834, 4137512, 6335431, 1971127, 7373512, 1774790, 2136978, 7743031, 3573225, 5684438, 5516650, 7207590, 5937035, 122569, 6363695, 6771970, 8296868, 1537199, 1346922, 3192988, 2076345, 4134661, 8019395, 7419384, 3009199, 1922666, 8044741, 3921073, 6600873, 8207018, 6492013, 3006065, 5900203, 547836, 2980975, 2131131, 6947195, 5375492, 4427678, 6892976, 3120613, 1171951, 1243698, 5872579, 2785402, 7708361, 7099479, 4752281, 7948118, 5922733, 723391, 4624631, 2740564, 4259525, 5657874, 5325567, 5359405, 772350, 3595552, 3483510, 7417827, 7771405, 161324, 5196676, 7300938, 4927723, 2554498, 2544443, 998221, 2202086, 3131352, 4404360, 2946575, 8153277, 7001860, 5679096, 3760070, 3534988, 514274, 2660858, 6257379, 7207894, 567665, 1771629, 3174060, 8242633, 4276413, 3207377, 7752938, 3833869, 3254416, 26862, 1771400, 3203798, 1185679, 375778, 505615, 7267195, 1449631, 2740566, 4787711, 712135, 991024, 7909384, 3911679, 1681431, 8072886, 4914954, 7734829, 6858951, 1419099, 1339437, 2025224, 1705915, 5466742, 8078014, 5391686, 3844478, 6886645, 747718, 4383878, 3869858, 942492, 3242733, 5687559, 6895735, 5881233, 4161708, 5929248, 7099194, 3796109, 3955833, 7565367, 8227477, 8218633, 5214871, 2895768, 7258486, 2621253, 7094061, 7379042, 4664278, 474556, 5570377, 876246, 4712328, 2499461, 3526909, 19243, 136964, 2115851, 8103704, 575225, 56562, 1128901, 3275524, 4958361, 6789310, 1279013, 5586423, 3324951, 4045874, 1326878, 3205980, 4611414, 6443909, 6014391, 117606, 2176988, 7434126, 4591873, 2650966, 5131929, 6562520, 1708158, 5426752, 6623645, 3619627, 3894145, 3397506, 130596, 290406, 4160791, 6959084, 4794458, 3384833, 3688557, 3321598, 6269178, 2216576, 5805188, 6337638, 8286344, 6357418, 910624, 7783248, 6640376, 3196282, 7163882, 5338782, 8352592, 1475796, 5743556, 5612352, 3834791, 1298088, 6926856]] -NTTInverse(aHat * s1Hat): [[4089385, 3243627, 2997576, 1860759, 7743501, 7853441, 1170077, 1195218, 7888106, 665458, 5751129, 5154174, 7545301, 4808040, 4175098, 7253799, 7354401, 4374114, 4898140, 8044441, 4815372, 4010427, 6091385, 7511375, 5519099, 8122144, 2751558, 5957631, 3470660, 302268, 5061991, 4165622, 2714659, 8063459, 2847894, 1533472, 4438403, 6443104, 2347662, 289547, 184159, 5498888, 5443787, 1425670, 3078839, 5300425, 5553617, 7454249, 3728399, 6859040, 2564941, 2503834, 6526467, 3139810, 4830966, 3195083, 3837599, 3020684, 5099414, 7632484, 7411640, 949374, 4008957, 25711, 5508339, 8179926, 5906373, 7293751, 7933155, 2462199, 7399825, 2422046, 1919134, 2219453, 5125954, 4215190, 6111785, 4964145, 4699695, 3414382, 5633204, 8253928, 6384382, 5252926, 1909370, 7134709, 1002384, 2857427, 782475, 6710664, 578965, 6004387, 250791, 1740254, 2869920, 6754518, 5004253, 3901061, 6136709, 257472, 434038, 5473324, 3029021, 9021, 6504021, 533317, 172691, 449164, 903614, 5480884, 5137554, 2470044, 5050434, 4148316, 6679782, 7441998, 732383, 7945132, 6825658, 626286, 5927752, 421578, 6978195, 5197373, 2226286, 7037106, 1725738, 6927486, 6997502, 1201567, 2573924, 8193142, 2094057, 3138833, 6966564, 7497571, 6111573, 6131203, 3073023, 3823983, 8264453, 4390787, 3881140, 4873363, 5557490, 792772, 7477984, 7046048, 8348349, 6302649, 6541801, 8341189, 1418279, 2709922, 700308, 1217449, 2297217, 1470439, 3212806, 790777, 5213120, 5758425, 2076338, 7545777, 1805605, 2703815, 2067337, 2102944, 636299, 4233636, 6027475, 600281, 7267577, 5879100, 8103361, 415092, 3881831, 6691668, 3448279, 2899642, 3276783, 4799396, 7504762, 1243741, 6158462, 2871358, 5882567, 3341518, 542921, 732539, 7112079, 6697560, 4666153, 3317112, 5864087, 6699666, 2879704, 3446807, 2688491, 5407074, 139236, 6915964, 3050814, 7186377, 5246300, 3820169, 4976134, 6808630, 983871, 5644977, 8027008, 6509110, 2021339, 444784, 6184213, 6370231, 3543847, 7815931, 2290130, 1767280, 2494956, 7165443, 2394185, 6418859, 2101956, 5246065, 5209342, 4703811, 2405169, 3885181, 5663167, 3017062, 2999548, 1031789, 2800455, 3702120, 748277, 1095694, 2873435, 6784032, 999330, 7553807, 7064382, 795640, 1427808, 1871738, 4214659, 8127216, 8074002, 1777326, 2706004, 7614288, 6665819, 6039723, 2142283, 792449], -[3424695, 3851902, 7946663, 7319124, 3293286, 4224957, 4060028, 3286208, 60159, 2504816, 5758015, 5804699, 749986, 7462904, 5351146, 2632035, 2853283, 611042, 524618, 7013505, 7063882, 5050956, 7482637, 1669759, 7283173, 879, 6404094, 1897950, 7624650, 1459694, 1738080, 631549, 4880914, 6642021, 6838518, 5550582, 5960333, 6207807, 5242158, 1822450, 7437190, 3238536, 6645595, 423243, 6066631, 8056918, 6399922, 5697097, 8242501, 732180, 198418, 2766884, 2270581, 5701403, 1135138, 8197833, 1974559, 6143785, 1682114, 3402104, 7819628, 5787659, 4651657, 748064, 6811831, 1379049, 469113, 5052180, 8208855, 1952045, 7813633, 6299960, 5840565, 7080326, 400269, 3186522, 1864224, 423158, 3305970, 7123647, 843954, 5789455, 6919577, 5837478, 7614468, 7722304, 6482681, 8156351, 6028288, 7136110, 6812329, 2521103, 879313, 6313515, 4155740, 5957056, 3461072, 3674013, 1303662, 5323132, 3109450, 2862258, 5839198, 1025044, 2735530, 1681423, 1158434, 7562638, 5632777, 3879238, 180855, 7020215, 4748859, 3243932, 5979262, 6160414, 6066632, 792368, 4192626, 7863217, 886899, 2009585, 4326007, 7085219, 7622610, 3118274, 3992835, 4532977, 2600098, 2491388, 1127216, 5770495, 688904, 5422250, 5655242, 6793791, 8036904, 1111124, 4090337, 5072013, 4959199, 413106, 5278590, 6905221, 3538262, 593483, 126314, 7748366, 4923111, 5544693, 7950001, 7708029, 3428345, 1358095, 793299, 8008047, 7398863, 4939405, 7195367, 1931939, 2135454, 4586798, 3358235, 4574039, 3741742, 6546536, 5907758, 4525561, 126526, 6537530, 346442, 4154402, 2506090, 5054506, 7833272, 5492834, 5929410, 5773490, 1021035, 4190007, 3953982, 7606524, 830722, 7246442, 4788771, 4564004, 1958702, 6741305, 3003739, 2311838, 6282800, 4374990, 4019103, 60861, 2260773, 4739317, 774350, 546887, 3298028, 7537930, 1936736, 5147247, 5491279, 5188527, 5636260, 5782248, 3051842, 6902039, 5967255, 7162124, 5618424, 543754, 6005114, 2159043, 7534796, 2940798, 7011455, 145590, 3728597, 2750789, 5753651, 7992286, 5411603, 6677323, 8287529, 6095749, 7690576, 6993070, 5893833, 6523179, 4769266, 7673291, 1651630, 7320632, 4753701, 221529, 6982325, 778411, 2930144, 1244932, 3503055, 6465906, 3250207, 7735918, 6383851, 6921164, 346844, 2805486, 3481572, 3781001, 914637, 2398891, 3206325, 515530, 6168665, 731884], -[1285947, 630930, 2012121, 7066228, 3129344, 6394749, 6593383, 4387907, 887463, 812692, 603020, 4377173, 4103483, 1156382, 5369498, 8071448, 2281453, 4224566, 5272032, 1838907, 6047178, 3329268, 6749205, 5458253, 2186741, 5519041, 1329113, 5438547, 1681210, 3590947, 7028899, 2422292, 2277841, 7547872, 7732011, 7483190, 5098267, 2051635, 1542359, 3226695, 7028976, 4609970, 1337465, 869137, 871165, 5141036, 2774985, 2462731, 6505028, 2104296, 1724592, 1894598, 1679234, 347885, 6959033, 6726898, 5240702, 2056539, 6605145, 2564441, 7296784, 1081689, 7618357, 2375022, 6556161, 6182829, 3602326, 6469673, 3773524, 6640991, 5379744, 1221214, 1129515, 4256148, 1140741, 6895784, 8178431, 3580574, 6387912, 5879466, 3702168, 6930283, 4337076, 126424, 7509137, 2286265, 5870223, 2376601, 5636159, 486415, 1528271, 8238139, 690718, 125230, 4177471, 4455488, 6551702, 1094664, 8170974, 6038971, 1798727, 2266183, 4421546, 3745496, 1589438, 2209460, 683195, 562950, 3373443, 5523241, 2278508, 3634124, 1096875, 4354897, 3833136, 4074198, 3708176, 5291681, 6186251, 2618800, 784904, 2033447, 5349566, 5776766, 5773857, 1526787, 2865668, 7065941, 4745134, 2361342, 6739405, 6553049, 7230049, 5267037, 4333511, 6041430, 3679567, 5119173, 8254748, 1474374, 2147226, 4632197, 4911442, 5848354, 2159421, 3779114, 1189628, 2952580, 8158330, 2045331, 7518659, 2492139, 8282027, 4299058, 3945633, 7926724, 3682565, 5705509, 3832827, 5979921, 6594509, 2978022, 7446868, 6975705, 2051725, 3479710, 5465505, 7887015, 3890278, 8324545, 2645564, 4163467, 5766302, 7936624, 3535460, 5478595, 5301466, 3712564, 927667, 3179850, 2621833, 5002164, 7248770, 4961154, 3312121, 852237, 7544291, 3618228, 5028488, 1177452, 3145740, 6302583, 2428133, 638999, 6442056, 3274606, 4033377, 1860127, 6969393, 2787442, 3562126, 8277329, 7610342, 6438965, 8278100, 3790348, 5467721, 3864836, 5724001, 5779859, 6082966, 4474644, 6065861, 7322462, 3707245, 1379623, 332429, 8379773, 2534853, 4699512, 5398130, 2769315, 254641, 4062657, 7750574, 1192805, 5132465, 4328165, 2105878, 4126113, 5040662, 6964074, 3039283, 6055839, 7602129, 572323, 3086649, 3627091, 1424735, 1528581, 2587179, 1346346, 5868296, 4496993, 1793023, 1955943, 337849, 8332896, 2784200, 6417779, 1936980, 1080565, 7848398, 1975180, 6760728, 1622118], -[2744379, 6885345, 1807923, 6069656, 7723085, 1276462, 7935274, 1842025, 7671994, 1471837, 2361166, 5712830, 6416006, 4256155, 2086655, 6041980, 7850710, 4851603, 7559832, 678895, 6609594, 6073222, 1182875, 4529032, 7074411, 1931892, 2958057, 2685279, 417066, 1718998, 47645, 8330578, 5570086, 6731127, 8220976, 8261900, 4382920, 7621374, 3941221, 1436124, 2328952, 1354935, 626480, 5542502, 2895930, 6265126, 6388096, 5139463, 4275154, 2069743, 7711751, 4705240, 68367, 2347443, 469656, 6013859, 7038082, 5969353, 3314702, 4767343, 4697703, 294325, 4710633, 6229667, 8050294, 7047753, 8095673, 3078183, 1355152, 3375925, 153571, 6840666, 6022515, 2078726, 941659, 4566963, 4583903, 8232962, 3622647, 5082093, 114695, 7270847, 5136449, 2425559, 6942636, 5456916, 415748, 2666815, 2621575, 5434989, 5721327, 2349115, 2628653, 4263657, 8771, 2476565, 2676940, 3385837, 5030150, 7533730, 2216672, 1231656, 8290981, 2140179, 2373735, 2021092, 5831682, 8072098, 3759584, 15227, 5279577, 432118, 1864527, 3316973, 6050653, 3467487, 3236496, 7704965, 5308437, 628019, 1482419, 8125918, 3890681, 794066, 5054805, 2062883, 2190391, 4744113, 2199426, 4541677, 5153949, 4001735, 8124426, 6226277, 4216809, 3124782, 2918839, 6895211, 6824640, 7488676, 8288762, 7748465, 1235531, 2751766, 5125883, 1192491, 4502710, 5665762, 2126057, 4085647, 6968122, 2178470, 5528926, 4137035, 6996256, 1489785, 694167, 7897283, 210877, 2940709, 652576, 4693054, 2526938, 5241819, 4647590, 7677156, 1302757, 2447116, 1934618, 1971507, 6648280, 3985967, 151420, 7767100, 2729502, 2822212, 5552807, 156455, 5544071, 568745, 7341009, 6339283, 4488696, 1194494, 7121982, 6570664, 233959, 5248444, 1360166, 726667, 6903157, 8134001, 1302246, 3707545, 7482388, 4743618, 4193426, 5569903, 4457089, 2075984, 4936280, 6826065, 1997664, 8046952, 3242090, 3865359, 6215919, 2395352, 7812330, 144665, 5376732, 3695858, 2878804, 7275898, 5907422, 1774677, 556449, 2898796, 908702, 1599506, 2662060, 2503504, 7345946, 1233447, 7197613, 8029531, 2256785, 1307416, 5099849, 7162618, 6247378, 4132615, 4571828, 3707672, 3665606, 1175100, 6902652, 189897, 8059671, 6330145, 637737, 7586354, 4344977, 2149996, 21487, 6908532, 2491590, 6042182, 306412, 2393074, 7046117, 2009454, 3857205, 4266714, 4101378, 6804066]] -t: [[4089386, 3243628, 2997575, 1860759, 7743502, 7853440, 1170079, 1195216, 7888107, 665458, 5751129, 5154175, 7545299, 4808039, 4175100, 7253798, 7354403, 4374115, 4898141, 8044441, 4815374, 4010428, 6091384, 7511374, 5519099, 8122146, 2751556, 5957631, 3470662, 302270, 5061993, 4165620, 2714657, 8063457, 2847893, 1533470, 4438405, 6443103, 2347661, 289546, 184161, 5498890, 5443787, 1425669, 3078838, 5300427, 5553619, 7454250, 3728397, 6859041, 2564941, 2503836, 6526466, 3139809, 4830966, 3195082, 3837600, 3020683, 5099413, 7632486, 7411641, 949376, 4008956, 25711, 5508341, 8179926, 5906375, 7293750, 7933157, 2462197, 7399827, 2422045, 1919136, 2219452, 5125955, 4215190, 6111785, 4964143, 4699695, 3414383, 5633206, 8253929, 6384383, 5252926, 1909369, 7134711, 1002385, 2857427, 782473, 6710666, 578966, 6004389, 250790, 1740256, 2869922, 6754518, 5004252, 3901063, 6136711, 257471, 434039, 5473322, 3029019, 9023, 6504021, 533316, 172692, 449166, 903615, 5480885, 5137555, 2470043, 5050433, 4148315, 6679782, 7441997, 732381, 7945132, 6825656, 626284, 5927754, 421580, 6978196, 5197375, 2226288, 7037107, 1725740, 6927485, 6997504, 1201565, 2573924, 8193141, 2094059, 3138835, 6966562, 7497569, 6111571, 6131204, 3073022, 3823983, 8264455, 4390789, 3881140, 4873365, 5557490, 792771, 7477984, 7046047, 8348351, 6302648, 6541802, 8341190, 1418278, 2709920, 700309, 1217448, 2297216, 1470441, 3212806, 790775, 5213118, 5758426, 2076338, 7545778, 1805603, 2703813, 2067338, 2102943, 636299, 4233638, 6027473, 600279, 7267579, 5879099, 8103362, 415091, 3881831, 6691668, 3448278, 2899642, 3276782, 4799398, 7504764, 1243740, 6158464, 2871356, 5882568, 3341516, 542920, 732540, 7112081, 6697562, 4666153, 3317114, 5864089, 6699666, 2879703, 3446805, 2688489, 5407076, 139238, 6915962, 3050812, 7186375, 5246302, 3820169, 4976133, 6808632, 983869, 5644978, 8027010, 6509112, 2021340, 444782, 6184215, 6370233, 3543848, 7815930, 2290132, 1767279, 2494955, 7165443, 2394183, 6418860, 2101956, 5246065, 5209343, 4703812, 2405169, 3885182, 5663169, 3017062, 2999547, 1031789, 2800455, 3702118, 748275, 1095692, 2873434, 6784030, 999330, 7553807, 7064381, 795639, 1427807, 1871737, 4214661, 8127218, 8074002, 1777324, 2706003, 7614286, 6665817, 6039724, 2142285, 792450], -[3424697, 3851902, 7946664, 7319125, 3293288, 4224956, 4060028, 3286208, 60158, 2504817, 5758014, 5804699, 749984, 7462904, 5351145, 2632037, 2853285, 611043, 524618, 7013503, 7063884, 5050955, 7482636, 1669760, 7283175, 877, 6404095, 1897948, 7624651, 1459694, 1738080, 631551, 4880912, 6642019, 6838518, 5550580, 5960334, 6207806, 5242158, 1822449, 7437190, 3238534, 6645596, 423243, 6066630, 8056917, 6399924, 5697096, 8242499, 732180, 198417, 2766886, 2270579, 5701404, 1135140, 8197832, 1974557, 6143787, 1682113, 3402106, 7819628, 5787659, 4651657, 748063, 6811830, 1379049, 469114, 5052182, 8208853, 1952047, 7813632, 6299958, 5840567, 7080324, 400271, 3186522, 1864226, 423156, 3305972, 7123648, 843952, 5789455, 6919577, 5837479, 7614470, 7722303, 6482681, 8156353, 6028288, 7136109, 6812330, 2521105, 879313, 6313514, 4155739, 5957056, 3461073, 3674015, 1303662, 5323131, 3109449, 2862258, 5839199, 1025044, 2735529, 1681422, 1158433, 7562640, 5632778, 3879236, 180854, 7020214, 4748858, 3243930, 5979264, 6160415, 6066634, 792367, 4192625, 7863217, 886897, 2009585, 4326005, 7085219, 7622608, 3118274, 3992837, 4532977, 2600100, 2491386, 1127218, 5770494, 688903, 5422252, 5655244, 6793789, 8036906, 1111124, 4090335, 5072014, 4959200, 413104, 5278589, 6905223, 3538262, 593482, 126312, 7748368, 4923113, 5544693, 7950003, 7708027, 3428346, 1358096, 793301, 8008049, 7398861, 4939406, 7195365, 1931941, 2135454, 4586796, 3358235, 4574037, 3741744, 6546538, 5907757, 4525563, 126526, 6537530, 346441, 4154403, 2506092, 5054505, 7833271, 5492836, 5929409, 5773491, 1021037, 4190008, 3953984, 7606526, 830724, 7246444, 4788772, 4564005, 1958700, 6741306, 3003741, 2311836, 6282798, 4374990, 4019102, 60860, 2260772, 4739318, 774349, 546887, 3298029, 7537929, 1936735, 5147247, 5491278, 5188526, 5636260, 5782248, 3051841, 6902037, 5967253, 7162126, 5618423, 543753, 6005115, 2159041, 7534798, 2940798, 7011457, 145592, 3728595, 2750787, 5753652, 7992286, 5411605, 6677322, 8287531, 6095748, 7690578, 6993071, 5893835, 6523180, 4769264, 7673292, 1651631, 7320634, 4753700, 221527, 6982323, 778412, 2930142, 1244931, 3503053, 6465904, 3250207, 7735918, 6383851, 6921163, 346843, 2805485, 3481573, 3781000, 914636, 2398889, 3206325, 515529, 6168663, 731884], -[1285947, 630928, 2012120, 7066226, 3129345, 6394751, 6593384, 4387909, 887463, 812690, 603021, 4377175, 4103484, 1156380, 5369497, 8071446, 2281453, 4224564, 5272033, 1838907, 6047178, 3329268, 6749204, 5458255, 2186741, 5519040, 1329113, 5438545, 1681208, 3590946, 7028900, 2422294, 2277841, 7547873, 7732010, 7483191, 5098269, 2051635, 1542360, 3226694, 7028976, 4609970, 1337466, 869135, 871166, 5141035, 2774984, 2462730, 6505029, 2104296, 1724593, 1894597, 1679235, 347886, 6959035, 6726899, 5240704, 2056538, 6605146, 2564443, 7296784, 1081691, 7618355, 2375024, 6556161, 6182830, 3602327, 6469674, 3773523, 6640990, 5379743, 1221213, 1129513, 4256148, 1140739, 6895785, 8178432, 3580573, 6387914, 5879468, 3702169, 6930282, 4337075, 126423, 7509137, 2286267, 5870222, 2376601, 5636157, 486416, 1528269, 8238137, 690716, 125230, 4177472, 4455490, 6551702, 1094664, 8170975, 6038973, 1798725, 2266183, 4421544, 3745495, 1589438, 2209462, 683196, 562949, 3373443, 5523243, 2278510, 3634123, 1096873, 4354897, 3833135, 4074198, 3708176, 5291682, 6186250, 2618802, 784903, 2033446, 5349565, 5776766, 5773859, 1526788, 2865667, 7065941, 4745132, 2361343, 6739404, 6553048, 7230048, 5267036, 4333513, 6041431, 3679565, 5119172, 8254749, 1474373, 2147225, 4632197, 4911440, 5848353, 2159419, 3779115, 1189630, 2952582, 8158330, 2045331, 7518661, 2492137, 8282028, 4299057, 3945634, 7926723, 3682567, 5705511, 3832826, 5979923, 6594507, 2978021, 7446868, 6975703, 2051726, 3479711, 5465505, 7887014, 3890279, 8324546, 2645565, 4163469, 5766304, 7936625, 3535462, 5478593, 5301465, 3712566, 927666, 3179849, 2621833, 5002164, 7248770, 4961154, 3312120, 852237, 7544289, 3618226, 5028490, 1177451, 3145739, 6302583, 2428133, 638998, 6442058, 3274607, 4033375, 1860126, 6969395, 2787441, 3562126, 8277329, 7610340, 6438964, 8278098, 3790349, 5467719, 3864835, 5724003, 5779859, 6082964, 4474643, 6065859, 7322461, 3707243, 1379624, 332428, 8379773, 2534855, 4699514, 5398131, 2769315, 254640, 4062655, 7750574, 1192806, 5132466, 4328163, 2105880, 4126113, 5040662, 6964075, 3039282, 6055841, 7602131, 572322, 3086648, 3627090, 1424733, 1528581, 2587181, 1346346, 5868297, 4496993, 1793022, 1955944, 337847, 8332894, 2784202, 6417777, 1936981, 1080566, 7848397, 1975178, 6760730, 1622117], -[2744380, 6885347, 1807924, 6069657, 7723086, 1276461, 7935272, 1842025, 7671996, 1471838, 2361165, 5712832, 6416005, 4256156, 2086655, 6041978, 7850712, 4851604, 7559831, 678893, 6609593, 6073222, 1182874, 4529030, 7074413, 1931891, 2958056, 2685278, 417065, 1719000, 47644, 8330579, 5570086, 6731128, 8220977, 8261901, 4382921, 7621376, 3941220, 1436123, 2328952, 1354933, 626481, 5542504, 2895929, 6265126, 6388097, 5139464, 4275156, 2069742, 7711751, 4705238, 68367, 2347444, 469656, 6013861, 7038082, 5969354, 3314702, 4767341, 4697701, 294325, 4710633, 6229665, 8050292, 7047752, 8095673, 3078183, 1355153, 3375926, 153569, 6840664, 6022513, 2078728, 941657, 4566965, 4583905, 8232960, 3622648, 5082095, 114695, 7270847, 5136449, 2425557, 6942635, 5456918, 415750, 2666815, 2621574, 5434988, 5721325, 2349115, 2628654, 4263659, 8772, 2476564, 2676940, 3385835, 5030149, 7533732, 2216672, 1231655, 8290980, 2140180, 2373737, 2021093, 5831681, 8072098, 3759585, 15228, 5279575, 432116, 1864528, 3316975, 6050654, 3467488, 3236498, 7704966, 5308439, 628018, 1482417, 8125916, 3890683, 794067, 5054805, 2062884, 2190389, 4744112, 2199425, 4541677, 5153949, 4001737, 8124426, 6226275, 4216810, 3124784, 2918840, 6895211, 6824642, 7488678, 8288763, 7748465, 1235532, 2751768, 5125885, 1192492, 4502709, 5665763, 2126057, 4085649, 6968122, 2178470, 5528927, 4137036, 6996255, 1489783, 694168, 7897284, 210876, 2940707, 652578, 4693056, 2526938, 5241819, 4647592, 7677156, 1302759, 2447117, 1934616, 1971506, 6648280, 3985965, 151421, 7767099, 2729502, 2822210, 5552807, 156454, 5544069, 568747, 7341010, 6339284, 4488697, 1194494, 7121982, 6570666, 233960, 5248445, 1360166, 726666, 6903155, 8134003, 1302246, 3707545, 7482390, 4743619, 4193424, 5569901, 4457089, 2075983, 4936279, 6826067, 1997666, 8046950, 3242089, 3865359, 6215919, 2395351, 7812328, 144665, 5376732, 3695858, 2878804, 7275896, 5907420, 1774677, 556449, 2898797, 908702, 1599508, 2662061, 2503504, 7345944, 1233446, 7197611, 8029531, 2256787, 1307416, 5099849, 7162619, 6247379, 4132616, 4571826, 3707673, 3665605, 1175102, 6902652, 189897, 8059671, 6330144, 637736, 7586354, 4344975, 2149997, 21488, 6908531, 2491589, 6042183, 306410, 2393075, 7046117, 2009452, 3857207, 4266716, 4101380, 6804067]] - -t0: [[1578, -404, -697, 1175, 2062, -2688, -1377, -816, -789, 1906, 345, 1407, 467, -665, -2820, 3878, -2013, -413, -675, -103, -1522, -3652, -3464, -690, -2309, 3874, -956, 2047, -2746, -834, -663, 4084, 3105, 2529, -2923, 1566, -1659, -4001, -3443, 2826, 3937, 2058, -3893, 261, -1354, 203, -557, -470, 1037, 2337, 845, -2916, -2558, 2273, -2314, 202, 3744, -2165, 3989, -2458, -2119, -896, 3068, 1135, 3317, -3882, -57, 2870, 3301, -3595, 2451, -2787, 2208, -580, -2237, -3690, 553, -209, -2513, -1681, -2890, -3607, 2815, 1854, 633, -521, 2961, -1581, -3959, 1418, -2666, -347, -3162, 3552, 2722, -3882, -1060, 1671, 903, 3519, -137, 1066, -2021, 831, -427, 836, 660, -1394, 2495, 437, 1171, -3941, -4031, 3163, 3302, 3661, 3293, -1108, 1720, 3692, -3254, 3788, -1388, 3647, -1936, 179, -2772, -2947, 1536, -2659, 1636, 1141, -3093, 1299, 3362, 1889, 339, 3588, 1022, -1681, -1273, -123, -1868, -875, 3314, -1853, -1312, 927, 703, 3000, -3606, 1734, 1062, -1632, 3989, -3160, 3456, 4073, 1542, -3849, 3006, -550, 3762, 946, 3363, 453, 2954, -2401, -2677, -1626, -1839, 2263, 1275, -2757, 1474, -2701, -1177, -1196, -554, -326, -18, -1114, 892, -1444, -1920, -4036, 712, -820, 2248, 3452, 1425, -3494, -3287, -646, -1383, -1390, -3881, -2027, 1513, 356, -26, 1914, 3388, 1991, 3422, 2697, 3589, 1080, 829, 690, -1150, -3528, -2084, 2414, -745, -3143, -3288, 762, -3628, -2193, -3605, -2557, 2119, -3668, -3388, 3185, -769, 1604, -3279, 2174, 2497, 2406, 1275, -403, -1209, -666, 2803, -2036, -1958, 1054, -94, 783, 2877, 1015, 2399, 3961, 3973, 754, -3310, -340, 2643, 3918, -2471, 2220, -4019, -2174], -[441, 1662, 424, 3669, 104, -2116, -3204, 1216, 2814, -1935, -962, -3429, -3680, -8, 1769, 2405, 2469, -3357, 330, 1151, 2380, -3509, 3340, -1408, 487, 877, -2049, -2596, -2101, 1518, 1376, 767, -1520, -1693, -1802, -3596, -3442, -1730, -722, 3825, -1146, 2694, 1884, -2741, -3642, -4011, 1972, 3656, 1347, 3092, 1809, -2010, 1395, -228, -3548, -2360, 285, -213, 2753, 2426, -3732, -4085, -1399, 2591, -3914, 2793, 2170, -2282, 469, 2351, -1536, 310, -329, 2436, -1137, -166, -3550, -2828, -3596, -3392, 176, -2289, -2663, -3417, -4090, -2753, 2809, -2879, -1024, 877, -3414, -2031, 2769, -2518, 2395, 1472, 4049, 3999, 1134, -1669, -3511, 3250, -1697, 1044, -599, 2062, 3361, 1424, -3318, -3772, 630, -330, -2502, -102, -896, 31, -3638, -2257, -1679, -1103, 2161, 2545, 629, -861, 4048, -2878, 3333, 2801, 3236, 1018, -3278, 3326, 775, -852, 2764, 2621, 554, -2988, 2527, 1166, 3040, 3504, 2941, -633, -682, 3658, 3432, -1264, -279, -1291, 3763, -645, 4090, -1776, -1323, -3727, 1485, -370, 2789, -1371, -2658, -724, -485, 2901, -2000, 1130, 1325, 3579, 3646, 314, 2377, 1059, -660, 41, 1719, -3996, -1599, -1869, -2963, 3896, -2752, -3842, 3332, -3476, -3548, 1061, 812, -710, -2723, 1692, -466, 462, -3170, 3516, -220, -3850, -3891, -1977, -3347, 1289, 3423, 2671, 2638, 2990, 164, -1304, -3775, -3819, 3477, 2318, -1289, 3081, 379, -3647, -1842, -130, -895, -1864, 1235, -1725, 2868, -3106, -3307, 842, -2773, 900, -1710, -2897, 3787, 2348, 1520, -2612, -3153, -3014, 2340, 343, 2739, 172, -2594, -253, -3123, 2416, -2017, 2670, 2283, -1077, 2779, 3821, -27, -3704, -2868, -1367, 3253, -567, 87, 2796], -[-197, 144, -3112, -3470, 1, -3201, -1176, -3003, 2727, 1682, -3187, 2647, -708, 1308, 3737, 2326, 4077, -2508, -3615, 3899, 1482, 3316, -1004, 2383, -523, -2368, 2009, -943, 1848, 2850, 164, -2538, 465, 3041, -1238, 3895, 2845, 3635, 2264, -954, 240, -2126, 2170, 783, 2814, -3541, -2104, -3062, 581, -1048, -3919, 2245, -125, 3822, 4027, 1267, -2176, 346, 2394, 347, -2288, 347, -205, -656, 2561, -2130, -2153, -2006, -2989, -2722, -2401, 605, -983, -3692, 2051, -1879, 2816, 669, -1846, -2388, -615, -150, 3507, 3543, -2927, 699, -3442, 921, 61, 3088, -3635, -3015, 2588, 2350, -448, -958, -1898, -3064, 3551, 1469, -3515, -3001, -2136, 1751, 190, -2378, 3260, -2299, -1661, 1835, 1134, -3125, -855, -3247, -721, 2774, -2800, -350, 1290, -2638, -1529, 1830, 189, 1406, -1501, 3076, -1533, -3755, 1964, 2047, -2612, -552, -3488, -420, -55, 3927, 1357, -828, -2787, -187, 921, 3717, -3760, -735, -3269, 2603, 1790, 3462, -902, -2669, -1595, 1769, -84, -1743, -2910, -3133, -3833, 3879, -1030, -237, -53, -3867, 340, -3881, 3726, -1889, 1441, -1882, -921, 1474, -451, 1933, -864, -1423, -3482, -1855, 1241, 1590, 1970, 1353, 393, -3148, -1150, -3198, 2552, 269, -543, -2638, -1398, -2197, 11, 2935, 3301, 22, 3146, -2193, 2911, 542, -1997, 2161, -1394, 3409, -28, 52, -4014, -2547, 3655, -1789, -2205, -3693, -3692, 1811, 3779, -1187, -3733, 3368, -3444, -643, 3527, -2694, -397, 419, 688, -577, 942, -3226, -3918, 2787, 536, -2655, 2582, 875, 50, 1953, -45, -1118, -1736, -1966, -675, -3323, -1491, 2858, 2825, -415, -1026, -1944, 1975, 1630, -1078, 3441, 3669, -778, 461, 906, 2330, 101], -[60, 4067, -2508, -615, -1970, -1491, -2776, -1175, -3908, -2722, 1869, 3008, 1669, -3684, -2305, -3718, 2776, 1940, -1385, -1043, -1351, 2950, 3226, -1146, -3475, -1421, 744, -1698, -727, -1320, -1508, -685, -474, -2696, -3791, -3827, 201, 2816, 868, 2523, 2424, 3253, 3889, -3480, -4039, -1754, -1663, 3080, -1068, -2834, 3079, 3030, 2831, -3660, 2712, 933, 1154, -2614, -3058, -403, 3685, -587, 233, 3745, -2444, 2632, 1977, -2009, 3473, 822, -2079, 344, 1393, -2040, -423, 4021, -3615, 0, 1784, 3055, 7, -3649, 65, 725, 4011, 1046, -2042, -3777, 134, 3692, 3309, -1989, -978, 3819, 580, 2580, -1844, 2539, 261, -2908, -3360, 2855, 676, 2068, -1943, -2331, -1023, 2978, -543, -1156, 3927, -2060, -3248, -785, -3234, 2272, 658, -3706, 23, -2766, -335, -548, -517, -557, 341, -1500, 3125, 944, 3969, 3309, 1181, 4041, -2038, 355, -2070, 3632, 2488, -2453, 706, 1190, -1541, -1167, -1460, -744, -2307, -3540, -2891, -3101, -3863, -2159, -3270, -602, -673, 76, 287, -1161, -2152, 196, -2116, -221, -2782, -960, 3802, -1061, 2728, 1252, 231, -2291, 1304, -2766, -3624, -3539, 3965, 1083, 1566, -4030, -1369, 806, -1915, 3499, 978, -1324, -519, -1538, 3134, 682, -3608, -2627, 294, -2422, -2701, -653, -282, -3431, 3094, 451, -880, -659, 641, 3407, -3497, 2131, -1182, 2406, -1943, -1265, -1809, 3287, -2840, -2791, 2780, 1266, 3412, 1400, 988, -2987, -607, -1171, -610, 2068, -339, -3248, -2280, -3546, -3157, 1371, 3987, -3304, -3767, 2811, -3117, 3848, 690, -3303, 3781, 3646, -3204, 1481, -1257, -2272, -1240, 562, 3215, 3693, -3088, 2675, 1221, -3513, 3306, 1011, 997, 2412, -1225, -1316, -2812, -3485]] -t1: [[499, 396, 366, 227, 945, 959, 143, 146, 963, 81, 702, 629, 921, 587, 510, 885, 898, 534, 598, 982, 588, 490, 744, 917, 674, 991, 336, 727, 424, 37, 618, 508, 331, 984, 348, 187, 542, 787, 287, 35, 22, 671, 665, 174, 376, 647, 678, 910, 455, 837, 313, 306, 797, 383, 590, 390, 468, 369, 622, 932, 905, 116, 489, 3, 672, 999, 721, 890, 968, 301, 903, 296, 234, 271, 626, 515, 746, 606, 574, 417, 688, 1008, 779, 641, 233, 871, 122, 349, 96, 819, 71, 733, 31, 212, 350, 825, 611, 476, 749, 31, 53, 668, 370, 1, 794, 65, 21, 55, 110, 669, 627, 302, 617, 506, 815, 908, 89, 970, 833, 76, 724, 51, 852, 634, 272, 859, 211, 846, 854, 147, 314, 1000, 256, 383, 850, 915, 746, 748, 375, 467, 1009, 536, 474, 595, 678, 97, 913, 860, 1019, 769, 799, 1018, 173, 331, 85, 149, 280, 179, 392, 97, 636, 703, 253, 921, 220, 330, 252, 257, 78, 517, 736, 73, 887, 718, 989, 51, 474, 817, 421, 354, 400, 586, 916, 152, 752, 351, 718, 408, 66, 89, 868, 818, 570, 405, 716, 818, 352, 421, 328, 660, 17, 844, 372, 877, 640, 466, 607, 831, 120, 689, 980, 795, 247, 54, 755, 778, 433, 954, 280, 216, 305, 875, 292, 784, 257, 640, 636, 574, 294, 474, 691, 368, 366, 126, 342, 452, 91, 134, 351, 828, 122, 922, 862, 97, 174, 228, 514, 992, 986, 217, 330, 929, 814, 737, 262, 97], -[418, 470, 970, 893, 402, 516, 496, 401, 7, 306, 703, 709, 92, 911, 653, 321, 348, 75, 64, 856, 862, 617, 913, 204, 889, 0, 782, 232, 931, 178, 212, 77, 596, 811, 835, 678, 728, 758, 640, 222, 908, 395, 811, 52, 741, 984, 781, 695, 1006, 89, 24, 338, 277, 696, 139, 1001, 241, 750, 205, 415, 955, 707, 568, 91, 832, 168, 57, 617, 1002, 238, 954, 769, 713, 864, 49, 389, 228, 52, 404, 870, 103, 707, 845, 713, 930, 943, 791, 996, 736, 871, 832, 308, 107, 771, 507, 727, 422, 448, 159, 650, 380, 349, 713, 125, 334, 205, 141, 923, 688, 474, 22, 857, 580, 396, 730, 752, 741, 97, 512, 960, 108, 245, 528, 865, 930, 381, 487, 553, 317, 304, 138, 704, 84, 662, 690, 829, 981, 136, 499, 619, 605, 50, 644, 843, 432, 72, 15, 946, 601, 677, 970, 941, 418, 166, 97, 978, 903, 603, 878, 236, 261, 560, 410, 558, 457, 799, 721, 552, 15, 798, 42, 507, 306, 617, 956, 671, 724, 705, 125, 511, 483, 929, 101, 885, 585, 557, 239, 823, 367, 282, 767, 534, 491, 7, 276, 579, 95, 67, 403, 920, 236, 628, 670, 633, 688, 706, 373, 843, 728, 874, 686, 66, 733, 264, 920, 359, 856, 18, 455, 336, 702, 976, 661, 815, 1012, 744, 939, 854, 719, 796, 582, 937, 202, 894, 580, 27, 852, 95, 358, 152, 428, 789, 397, 944, 779, 845, 42, 342, 425, 462, 112, 293, 391, 63, 753, 89], -[157, 77, 246, 863, 382, 781, 805, 536, 108, 99, 74, 534, 501, 141, 655, 985, 278, 516, 644, 224, 738, 406, 824, 666, 267, 674, 162, 664, 205, 438, 858, 296, 278, 921, 944, 913, 622, 250, 188, 394, 858, 563, 163, 106, 106, 628, 339, 301, 794, 257, 211, 231, 205, 42, 849, 821, 640, 251, 806, 313, 891, 132, 930, 290, 800, 755, 440, 790, 461, 811, 657, 149, 138, 520, 139, 842, 998, 437, 780, 718, 452, 846, 529, 15, 917, 279, 717, 290, 688, 59, 187, 1006, 84, 15, 510, 544, 800, 134, 997, 737, 220, 277, 540, 457, 194, 270, 83, 69, 412, 674, 278, 444, 134, 532, 468, 497, 453, 646, 755, 320, 96, 248, 653, 705, 705, 186, 350, 863, 579, 288, 823, 800, 883, 643, 529, 737, 449, 625, 1008, 180, 262, 565, 600, 714, 264, 461, 145, 360, 996, 250, 918, 304, 1011, 525, 482, 968, 450, 696, 468, 730, 805, 364, 909, 852, 250, 425, 667, 963, 475, 1016, 323, 508, 704, 969, 432, 669, 647, 453, 113, 388, 320, 611, 885, 606, 404, 104, 921, 442, 614, 144, 384, 769, 296, 78, 786, 400, 492, 227, 851, 340, 435, 1010, 929, 786, 1011, 463, 667, 472, 699, 706, 743, 546, 740, 894, 453, 168, 41, 1023, 309, 574, 659, 338, 31, 496, 946, 146, 627, 528, 257, 504, 615, 850, 371, 739, 928, 70, 377, 443, 174, 187, 316, 164, 716, 549, 219, 239, 41, 1017, 340, 783, 236, 132, 958, 241, 825, 198], -[335, 840, 221, 741, 943, 156, 969, 225, 937, 180, 288, 697, 783, 520, 255, 738, 958, 592, 923, 83, 807, 741, 144, 553, 864, 236, 361, 328, 51, 210, 6, 1017, 680, 822, 1004, 1009, 535, 930, 481, 175, 284, 165, 76, 677, 354, 765, 780, 627, 522, 253, 941, 574, 8, 287, 57, 734, 859, 729, 405, 582, 573, 36, 575, 760, 983, 860, 988, 376, 165, 412, 19, 835, 735, 254, 115, 557, 560, 1005, 442, 620, 14, 888, 627, 296, 847, 666, 51, 326, 320, 663, 698, 287, 321, 520, 1, 302, 327, 413, 614, 920, 271, 150, 1012, 261, 290, 247, 712, 985, 459, 2, 644, 53, 228, 405, 739, 423, 395, 941, 648, 77, 181, 992, 475, 97, 617, 252, 267, 579, 268, 554, 629, 488, 992, 760, 515, 381, 356, 842, 833, 914, 1012, 946, 151, 336, 626, 146, 550, 692, 260, 499, 851, 266, 675, 505, 854, 182, 85, 964, 26, 359, 80, 573, 308, 640, 567, 937, 159, 299, 236, 241, 812, 487, 18, 948, 333, 345, 678, 19, 677, 69, 896, 774, 548, 146, 869, 802, 29, 641, 166, 89, 843, 993, 159, 453, 913, 579, 512, 680, 544, 253, 603, 833, 244, 982, 396, 472, 759, 292, 954, 18, 656, 451, 351, 888, 721, 217, 68, 354, 111, 195, 325, 306, 897, 151, 879, 980, 275, 160, 623, 874, 763, 504, 558, 453, 447, 143, 843, 23, 984, 773, 78, 926, 530, 262, 3, 843, 304, 738, 37, 292, 860, 245, 471, 521, 501, 831]] - -tr: 75A821E4FF2B52A3AB3DDD0C77C3A9F96FCC9BE360C2B75C97D7F9DEC97D1BDDE028D36C4FE18093AF6C5794AD19F9FA090C19A76F05A7F3B930B11792A13A7A -pk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BF331E6D638B1FFFE8824C347E16B9D992FE95FDD825B68A5F54CAA876EE5A27E0FD5B5A895A0267F4B61CFD52E1E4EFCD108167C9AA92B781D6AAAE3C7159D934C1DFFE5A461D4C5E526E989D391DE00A09E1FADDEC8B774384AEA3C24E780EA7AE96368B0C2BF70A0E99CAD475760CC7C44B71F50E355CE6372D7EE0735702A57001A0751C10D6E743AA74B69EAF732E359281F3413D4CE40B59E106D3D8DD3564FA213FA00FD25F5E4EAB27BD774F163A8DD94A6861139D7FB07FCB1FEAD2C55452518CD8258187CFEDA4FE6DC28C54F404E14086E12773BDBFD0CDAC55C9A589029493926F07EE52C66426441B6CC3A56C6ACCC60958614A511304D57DB804AF7E5CF78C44AFDC6F7D830AFC2B1E98E113631AD4D12C40101CAA78F2669372B5C6EF96115715B18F215CF7A68EE7518AE902320F8DA67A354E82E876B5018A259A77CDF9211085F6407C8F46BB15C3CDE68505C2D0104D65EA71939337903E0303AA3CB424D1354AE3CB4A9D8DA0BA8378C2FB6320DE562DFF0ADEE6781815415E1BA48FAF1B8DBCC67BB0F8BE31640A392439AEABBA37BC0C9821D4361E4D04099D9670CDB74B2A2BF7E31F9E09E0D344D6B0CBCDFB5A601F789A27C75956C1F4E35D3C8E6B06A6741D64432A62DBCE5860120F06CD40361D8A2F7755E8A3DC1A408B054582A6BCFD52332DF9A5DCA40E8D2B021F180EC5996AA7CEBA2991286F4876FE9363B05C1A8998BC97D1C2D8A0F78ACC27E32A5C9FBA7D406DBC77FE3855E46DD49B6F8CECD6F69F4AF85EB1D40D1905F0C3119E6ECD0E9699EB00A5BD7D2D8AAEDAA10DD2284F959584B701C54BE425FE9CBF4A3BBBAD5CF726C64EACAF84DE406547F611626AC55DC18EC0B37AD8255A93907474987FD106F169D3461CFD77E355C32866C8CA18485F535F268F61611482838E25A86B3A60B892A0AA6CDD8A6354A16650E7BE46EEAC38B625ACF388A1A6AD039554B1A0734CD39CDA81075CD80EE63724E7B1322BA4820CF8B9BC5CDAD1C69258A20B888D2E6D7C6B0B3C4391DE103955FD4AC48B0EEB08BFB543CE01F88201B527EB8DC54C46172C2383445119C896A116F8650485D7CC5193A2F5060E0D368B0C1EAE2D5D743827433C8730F1A61B8C1C5093F2D06D588A5B2083517095AE4EB63394CF337281EF2C2E14A9DB625B3D538D5FAA4B6E9F0DBE13F147FC0260F5BA78716170761408D59B79794A191B96E66420258C02839213164EC8D333555B3C91FBAC4F33FB72976BB0A7BAE88E4FA5D1C2A29FC5F938F934AF5017CB24B32278401E177A6D4738D0BBA1179EDE6CA2E3C91C26C89DBBC9342FE543DCC0E21BEC793B3314F21DD4DB9AF73927C38A9D30252AE0F23F88FB8BE43B9F91427970B498A60B393165233486340FEA8DACC7EFC178A1EDE2B1C95C244A962F5CBF09C0AF6D3BA8F087C9483B75B675B99913D92F023BED773CD3D5EA57036C1D0DFFA33478B30B6AF1B9B0EE03D274A4F6B3A8351405DAAEB47412118804B47756626E60F59427F4122DD836CF6CB0940680DE45436EE698BB58E6813B580BF5D1869F2B3D0900CA958277AE0E33B605F64291DB4E4F4CB7E0954724A6222AD04CD37B542A3E667B52D5510AFC15950F44813A037A6FEC94AECC4C3F27912D0DE5456A64E506A11801B4CA224658BDC41A0A664B174F89F1417F99000A20A623F5B064D8FF58C61772F49BA4B00E9705FE11D6D364488F5C63045C914F8256F533F11286FAABD2F7E2E16F7DB234B5F807DC14E782EA141032C0D93B82590C4753DD72558DFCF -sk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BB149C045A55EADA0C519069A8EE0602FBEDA8D2EDFEA09CAE01D542D47DCBA1E75A821E4FF2B52A3AB3DDD0C77C3A9F96FCC9BE360C2B75C97D7F9DEC97D1BDDE028D36C4FE18093AF6C5794AD19F9FA090C19A76F05A7F3B930B11792A13A7A5CC0014B440814300C2225826042718A40620C25418B381163006402848DC0C07123434C0C80052323101BA54CE08051CB18440009100894291047281290292495652229722017210C2426990466610221002088DA926C4C2664E43822A4148689244809B4494B844D124270E1328024923009228854A849C14842882609941686C0104910B84101222504972911B28CE2202C83148E0BA72058C209D9848CCB129124C444D2320264002DCBB408D4C60121464AD430101904420B444D14B6881A85655C08085B284112080C10B48863A26D82384DD9042221412DA4A29084C62D0A228E42C000123524DB448423C1081997401AC25090B465D19241403012D8922814328499188E8A92851A1590634292E0282A43208C2049881083841A144D22004209096C4C4871618661222104A1C02D42484564488420826D802064043900E2306C138948E0802980160E0830420A1044024888A3122493A28DC8420D04438501207292381014B16089060C603230CC222AA0C0650047420C8040103331C9948191C26148846C020580E4886D8036208CB069D9104C10066258242A4834444430400316125A90649B4691408060A00690CC04089A86256336888C4266028965D2346060B80002341220090D0C100219363152A24093488ED2B601E2C820508249CB440D88882D601809A4986962B461D4C060C4206953408C2004229482095AA04D813645DB106E23824D14454120368010130E1A018109C010A2080CD2820D0B0200090352DB3265D3268DC41642001961188230C1C870A4A46DD9A851E2180462108E62240D9AC805CA026552986D5196205820104AB26D149301D9264C0C4905524071422660D4A40CDB844CCCB6215C36710C208159060C9C9868498080C3264913894D1AC26112C77010C73113108D4A082903B65150B490603262419251C8B088C8388DD8362C4A126C62302598A8088A48899C94900401069238401B1564E2A02DC8949041826024A270932006111005C82248C9988C8004219C98891A914442A21112426A0338699424528A107114A424CC206913932D8C0820D68932E6CAB4257F007558859915D3119DBA40D5E23225C1D606DDB7338ECA33285F893C62979505D91BF0CE00A4AB85E6A56400DFE3C3AC6DF1B46743FF5CB7279FC0FED4FC7DA7546B5E8BB48EF3EBDBCC32B2ED9F3F8E42B67960A10EAF01CD7C84012701895C0B43E5E74065B231167C9B19D7608748F662357FDDA261748EB44AFBC207146174D812E41B69B177DF4EA9E9ADA8C541845751F924342FE5B1209108AD57F90D66AB9197B135B91A64965CDB2AFBBFBF74688CD93032A82852A20CB69C26B0D5E000799B1EB51EDC006A4C73A6C555C1DB95B7F844AD8E3F08B0489B4FF720D35D9B0EA3E782D43016D4908885D749DA0BCCAE012C0E282E807E4AF842C4443A0527D62D769C1D09CB755ACBBEDC9453B08AB58F6AD4999495AA48A32801B5282123AD8097F8E3349A897308C59B32EDD7DC509E55B79AF2D7EF85E2741AD010118B1C242AEECA7E405EC3CCA9F951E44E82254DBA3CE2D8DCA0B1F8485CE1FB73EEA1F23CFD71044CDEF4CC05CF8FD134056B32E6524DD950E8AFE9155F5E309E0D9304166A0EC11E7068EE9C2AB61659709AA9CEECF7C3474E3061B9D580F9883021075A02E5F10ACFB20EE611E045DA345BA6A3DBBAC0456B6A3BBD00AC196E920560125D832514A80A68F0B5D32A5C062FD785ADB47C087A54AF90A25AADE3573F13C20DBD8A7DBC23EDDBA8C82177C7C9E3AE1AFE144343E9EBFF5D0D2F4AFFA2181E75BCE2A20D8055764991CFC45153E8DD19368307EA502F1E9FE9ACAEFF83F541F9D900749259F5F7FB52AC73A901522F200C48AE427BDB9D46A8655F5752FE7C0B3865CF79BD62538AC6D90C02CEF067E3A3F1A37DA28FE7C12CB6AE09037CF6BE78285CC38039738191CFA8264D192ED68D758718B90542A0C420C993AAD236600A787A11176A5328940600DEAED4473FA3E4E246D9AA629A5A96C755027D2DD7B42A10C2C1D8DD9AEE4529AF5F52E2FC3FB6E94E6E6400AC053EBFA0ECDC7D7B51336339AAC992749471629C487043853FF373EF44BF57A122B2C81629C2F530EAAF5FF76B42DE24D4FB51E87EBCCC15847F13E9B6AC5ECB4C44F83AB765D59A8FB9DAA85D13A80D84A2D151DC78739B54D754A89E88EE87331CD2845FC952716A684999081B10CFD3ECABBA346E64EAA328C510EEA170C7FEFF023926DDDD59C52DCDF1D4422CC9D55950371380397FF86260A31806FB8C350B12289FA0D7898CBC09D753CF2FEE8358D364304E9A03CAD19D10CF091B9E782650AA3B0EB6DFBB0D833EFD9DD307254211685880D8D4999A52078F4B5D338494FF450AA761EBDBBA4575581E6DD793CDF79FAB0B50C69ACDA5CA67D212368914F1B68B9A5C3F63C30F7ECCF8E34D5EA40D70F49D6A177F878821B5DB7337164E49424F29138D7DDC67AB91E4AAE157F395474B9502AFBDA2BD72D2F9551B0D3D41D55DF9477F5DF5542800D1681409DA49E30D4C05B38A678EEB5D78C6F602ACFF96C5BCBA08243D6138DBF48EBD4854F0D97AED1E9EEFB381016D873570E3B3BA942F17C2EE97D2BA99D3470DC73904361FAB66FFB9274B3939A15B75E798B81FF5E30866DE7D48276D572B71FD4B241B43FDD98E481C4AC45BF37D3C72F5557040E6E7FAE7736EE8B79DB8CDB3F976D4134669A5C716747D50E60843DD18BB1C540B92524C933BFD8E82DEBEB47AA964CEEF0BB5402F8A6C5DEFA8DCE7D3D59ADC93CF2840316F12124D36F451AC068539E3EC98B9D97CC4AF0330E733297BA72BB6BEA4445F54CF2220B297C87C4036F428850DA5D5097A54F588D9D0A393BDB16234517B2D512A796D95DA11513FFB797FF3000A272B318866693C03CC7EFCB5ED9FC51F2C5462E70F15124F983C5AD9627ECB46CBEFC9B81996E4C5FB0A8C19B71CA1ECFB2694D90746758F0AFF9EC625F0E10120428A20F92FC8FFBE955605D497FE0DF67A8F324C8CE22B3D2B026F632F34B7C2EC3BAE0DD2B30957633F977723FF4F2FF22109692A60C0B03C628A7290E3D6F47CFA73D64F914416C816B9EAB8EBF280627F60628CAD1B607F3B9D05860E48A632FB34AD55601F296D45970399BA2FED0E7EF1DFB031D792A192F685BB448A86791E11EE86DE1A789A84128A553856C69BC7E8CA59A3F8E93E088A9778F2FD59559BEDDD2AE1C258EA8114B0C2C3AA61F821ADEDEC72A36E941AF1ACAB8F1E073727E55F8B15A9BDF578524D7379E369C44D1918FB5C931487C52A1015095BDD5F72928A49F6331561393AD6EE55BC54B501747EEB0B4A0BC7074EED9CEF04E140C86F543A05C7D8D4B9C58DC900C11BCBCECAED16A3816D304A934C492ABFEEEC diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt deleted file mode 100644 index 011562875..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-65.txt +++ /dev/null @@ -1,88 +0,0 @@ -Key Generation -- ML-DSA-65 -seed: 72C3C5E0CC9F332F49D0FC0FD6399DA75645A3E33DBF56F1E96897662D0A9B37 -rho: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F -rhoPrime: DC6A3A1A9734E79B41C2ED6F988BE18802726D9B975E35A656E6303C3FE798EAF9049E0DDEBBC32902605BCE6F2536B9AC71E124827025A1C4E4524CA6E39459 -k: 9B2E348E4865616680FC184376A8CCB8DBE598365A23A2723944F5351F42F474 - -aHat: [[[3482139, 8186163, 2372395, 3386819, 1143206, 2532484, 8052453, 4473490, 106443, 7179739, 507086, 3597062, 3935196, 4173570, 4894936, 73631, 3923816, 485984, 8303229, 418498, 4036494, 3329435, 87822, 2247277, 952450, 1978109, 2997645, 5170958, 7137052, 498572, 6902549, 5000158, 4440102, 6172438, 8254652, 7211061, 5854442, 3139758, 5893400, 7655936, 4531127, 2920492, 694997, 3700280, 1015307, 7330957, 6698948, 8190071, 7370326, 5031935, 6475609, 7449364, 821181, 2258657, 8177579, 342859, 1927209, 621786, 2591863, 8005111, 6471577, 2890207, 1607020, 1722749, 2444680, 1525424, 874519, 2912496, 3122222, 8121488, 14954, 6974534, 853039, 5043046, 2563397, 2968386, 7990895, 1126735, 4798433, 2401947, 1275283, 868219, 6004047, 2208907, 2722238, 2340420, 4128269, 6331126, 1974241, 7439181, 8252773, 1219710, 62405, 2800555, 5705387, 2872004, 41065, 493061, 2544170, 1158560, 4009348, 3142805, 7476154, 6828659, 7691796, 3548866, 8134542, 7765604, 5718455, 2342255, 510863, 5388852, 3800516, 938253, 6663034, 7645963, 242746, 5025356, 1847800, 2410227, 6437351, 4054057, 2058288, 1105810, 7244758, 5549033, 2838854, 7376749, 648271, 6116217, 3156383, 5607076, 7100285, 7217664, 1365942, 6316618, 4417786, 1418305, 8017787, 1921823, 2737106, 1977270, 7909604, 1659612, 2263825, 4223224, 4903412, 1092262, 3918378, 1438847, 1125058, 8347845, 1579301, 7446952, 7852836, 1225947, 977321, 3498691, 7212891, 918627, 1612511, 3803396, 8085172, 3891699, 5743866, 6941716, 219579, 6278823, 1585468, 8099873, 4315795, 8096204, 6503682, 3710042, 7627375, 2627448, 5126134, 6861330, 7140328, 5252709, 1481849, 2143309, 5989699, 1243249, 859264, 5272237, 1536840, 5653399, 6191690, 5659837, 435597, 4255912, 6260676, 7436604, 4285241, 458782, 6386431, 2374394, 538345, 7694314, 1454040, 416175, 4678198, 3575352, 6429995, 3545291, 3173558, 7889992, 3746243, 7911255, 1957610, 701184, 2995003, 3222046, 7941019, 5678653, 304959, 1450925, 7836173, 1066653, 4162595, 3349735, 5519259, 1610239, 527540, 5141930, 863259, 509637, 7725149, 6503527, 7635929, 5341698, 2869, 6057974, 7824865, 4185418, 6940188, 4827490, 3875104, 3278037, 6563827, 4940836, 1466788, 5790742, 4260142, 3825122, 6317302, 4911489, 6390531, 4276141, 3475545, 4800230, 3691606, 4956359, 3900278, 1672013], -[5438570, 2582029, 476691, 7191286, 2585592, 259673, 5132184, 5304984, 7471548, 6079566, 5747610, 5836232, 4384043, 5798278, 4102804, 6679763, 6394993, 818458, 5349407, 8335947, 6190534, 1208792, 5944248, 8199254, 7530919, 3770439, 1297150, 2031460, 2669841, 3132013, 524538, 5492819, 534244, 547639, 4670529, 14568, 3368987, 664855, 7875525, 4923871, 4462990, 3022074, 2118563, 2961478, 5907039, 692432, 1642953, 2610518, 7939355, 5509519, 4984306, 4122697, 1258171, 5452769, 5204721, 7840797, 2989959, 1701597, 297604, 3574666, 3707519, 2114222, 5005479, 4193750, 1668159, 4615160, 4437794, 7190922, 3613558, 1993108, 2138810, 312935, 3190082, 463665, 5177630, 6720233, 3731685, 5631048, 5978728, 7035710, 4117003, 7123630, 787266, 5464484, 1961082, 2033646, 6591362, 6639385, 4816307, 6683133, 5700568, 71465, 4946562, 5188973, 156042, 364133, 2207368, 380139, 527053, 3330429, 7501581, 3382499, 6372334, 416536, 5101859, 488629, 6338551, 7271446, 8270270, 4307424, 1451712, 7992496, 7603148, 3776937, 2438046, 4319786, 3707206, 389422, 6910972, 529208, 1416130, 4810143, 3935619, 7559708, 17392, 7886517, 371325, 4230074, 1741984, 3289908, 3195576, 6918528, 8079750, 2217284, 7416144, 7420576, 1580838, 1964192, 7916703, 5067297, 5119624, 204286, 1488284, 7332350, 6068193, 3753559, 6768045, 4213776, 7474293, 2548003, 7555890, 3553370, 8327619, 1999423, 6768513, 330234, 7061070, 7890760, 3017400, 3087379, 2633673, 2187081, 620210, 5247048, 2497916, 5122648, 5686129, 6744691, 7853553, 1708297, 4334265, 1310587, 2045700, 5928006, 4068358, 7539964, 3800637, 3167192, 8360027, 1690416, 6073663, 2828153, 1675142, 3724388, 3883689, 5880046, 4952860, 3707792, 7453217, 729439, 3070594, 5329750, 3362410, 2125123, 3043978, 3521393, 5703054, 1370925, 5406918, 1591252, 1303019, 1293393, 4227055, 3055522, 3358196, 176035, 5850238, 593643, 822974, 548120, 4734793, 1732895, 4562498, 8201655, 1410791, 3634893, 7931722, 7945593, 1573721, 4616392, 5355072, 5842947, 2980710, 1486907, 5095599, 336857, 7693615, 5611732, 6733969, 6197569, 4630263, 6271829, 2973178, 7015926, 7801236, 6215313, 7405116, 6871848, 2588139, 3760749, 95648, 7601471, 2589548, 2450351, 5048990, 97855, 6611633, 7065544, 341583, 1288022, 3078434, 6004158, 8187757, 4451491, 4933470, 2311673], -[6652261, 6541307, 6782340, 5753970, 4113496, 6955120, 3450748, 5458598, 960745, 4000649, 6166376, 411068, 6698363, 5711965, 2429410, 1513165, 2883391, 4190049, 1944020, 6178123, 6271809, 4405845, 5257683, 4887849, 3749545, 5969309, 6214374, 3811135, 1558680, 7433632, 3560180, 1410448, 2911662, 4972166, 4395531, 3592157, 7339514, 3664701, 2952690, 3545688, 7342895, 3073704, 2098936, 3420599, 5178999, 5470640, 955703, 5709101, 97334, 5816955, 1298574, 4282856, 7486521, 6273259, 1348516, 3119121, 8031321, 5085085, 3434472, 6765975, 3929320, 7604658, 1272194, 29271, 5468536, 7577414, 322414, 554961, 6821168, 890206, 770338, 2080875, 1168270, 2407478, 5612788, 4394170, 5478303, 193684, 2051261, 6972777, 2239394, 4750351, 3981553, 6551996, 687583, 6509119, 1817966, 4018884, 7205519, 7637188, 3003822, 2449536, 3415547, 969623, 2462280, 7905281, 4951087, 5841146, 3960102, 1092115, 5950017, 3213896, 2017269, 5297586, 5835272, 3695697, 269390, 4709564, 960828, 5030190, 1742791, 7388403, 3128945, 2906886, 6667421, 7177674, 4613596, 5209254, 2960552, 8227208, 6694316, 6711739, 2706133, 3817813, 3838022, 937045, 6864967, 4008544, 402088, 5807892, 428208, 3790476, 1318907, 2877469, 7990380, 3032242, 21451, 5885796, 465921, 4390846, 8043751, 4786736, 7136018, 3419177, 2157445, 2441359, 3891080, 4329755, 2841563, 3609049, 8007623, 1883878, 7682401, 1601609, 6003281, 7779390, 1122039, 4477399, 1553478, 890442, 7404340, 5361176, 5641402, 2081397, 6510144, 6920505, 4283596, 5634518, 6633841, 5191763, 5621243, 7196318, 4142022, 780212, 1635009, 947072, 3595538, 2085074, 5354220, 54931, 6159725, 7486772, 7126639, 2877709, 3205742, 3135622, 6182789, 2554015, 5262829, 1714468, 7164424, 6124899, 8079303, 195295, 4575362, 2633997, 4745366, 6653210, 6305797, 5945622, 6760103, 5035169, 1073413, 7444232, 4411889, 4220543, 4498261, 5917215, 920455, 5727269, 5075890, 7525675, 7689923, 5919938, 4013729, 1019013, 2681976, 5267409, 2354513, 2557662, 6259207, 4703693, 7484114, 7119571, 8309036, 3036680, 158377, 3117589, 6831946, 6899466, 7964531, 1369018, 2358610, 3665923, 5246283, 2844298, 3641762, 4812802, 7961027, 6097700, 2559219, 7946116, 379456, 7896221, 4209858, 286355, 8029395, 1077992, 6432603, 5872619, 4710598, 938250, 7602299, 2389152, 3270399, 905234], -[7985693, 6078251, 5840586, 6613275, 1381273, 8210977, 7550052, 6009435, 6242491, 707762, 2017360, 1331300, 2251714, 3679902, 7779754, 6773968, 5930500, 5014032, 4260964, 5422762, 2450300, 2027233, 1992753, 2754268, 432716, 7119874, 6162539, 2182505, 4125201, 4266091, 4925476, 8015676, 6508714, 4889238, 3462207, 4566275, 1835938, 5487005, 3720689, 1511712, 2664811, 3982532, 8194346, 3393585, 6007733, 7967322, 6205818, 5741452, 4544907, 4646190, 5519869, 3287901, 5923099, 2182944, 2064854, 3815742, 6686393, 4783020, 2177242, 6101200, 1037921, 5271868, 6411614, 5431009, 5976849, 6532476, 1783929, 7811311, 5786204, 4853687, 2633835, 3410959, 6628562, 4182869, 1947254, 3122941, 5982497, 3739322, 3332582, 5504931, 2895983, 2243285, 3717956, 1282777, 8290861, 30795, 2024107, 1210456, 1058442, 6796606, 4252203, 5751756, 5564439, 1378505, 1342258, 7725439, 8349669, 7569610, 488102, 4073771, 2460149, 6829223, 2639903, 2603860, 5449725, 956105, 616539, 5873432, 2079589, 3781342, 3775169, 3723442, 7393898, 309146, 185923, 4688590, 6811842, 123883, 7165280, 3949632, 1218847, 6196103, 8301369, 7177375, 1248430, 661857, 17991, 1955843, 4074492, 2052785, 7209252, 3733308, 376121, 6561163, 1148722, 6343925, 5018951, 7420833, 1654862, 4387024, 4348469, 6727942, 6547430, 3812313, 7695373, 3798270, 4707464, 7971766, 680887, 5116224, 3726638, 5766891, 7741411, 2256354, 4163240, 3720160, 398850, 7610548, 5149296, 6819280, 6135632, 3352453, 4358514, 3161739, 386889, 349172, 7040871, 5224942, 5272761, 2601070, 1278010, 7356156, 433242, 4003781, 2214156, 1583454, 8336220, 7686470, 4114562, 6578720, 6068537, 1161400, 6199508, 7773024, 5407288, 5980335, 3869854, 4440459, 5506390, 5067956, 2232381, 2029665, 7794356, 6025808, 6857280, 3403334, 7927056, 4662526, 5883067, 686166, 179599, 8201685, 174345, 5781929, 755052, 1115137, 5024525, 839187, 3257500, 5763330, 1215479, 1933585, 7223327, 5378528, 1749178, 419724, 4450447, 5043616, 3561734, 6935749, 4442718, 6971923, 670657, 6410415, 7246613, 7344167, 2660520, 2302586, 2470812, 3379453, 3508582, 5853335, 4418479, 1510824, 5224888, 4151395, 4792770, 3373493, 7586675, 8349439, 6280616, 7577210, 584543, 4384275, 4237175, 7176755, 7920996, 5563123, 3737229, 738334, 3572924, 1205638, 7046856, 1462701, 7012449, 5624468], -[5424179, 5787241, 4195854, 7735838, 7905232, 4574482, 2131536, 3311482, 6413372, 7626247, 2860041, 5132035, 8226949, 5223107, 1854983, 4793255, 852237, 3633582, 1672837, 4067706, 5202217, 876070, 3704970, 3156759, 1222948, 871061, 1455072, 4458640, 6457588, 7541960, 3202293, 1582312, 7650212, 1968461, 1052120, 3413638, 2942986, 5119538, 5519467, 5448651, 6346255, 1687389, 4471083, 863399, 6196820, 6493771, 6955590, 5009549, 2465220, 5358048, 7785064, 3653211, 7873361, 4610421, 170202, 7866952, 3563379, 4202280, 6315898, 5754033, 8133606, 4861977, 6376653, 1307325, 4258192, 7619018, 2800654, 6524763, 2607712, 3282486, 5913216, 1731258, 584855, 1618423, 4914143, 7031692, 3426098, 8246106, 1282852, 3019019, 7409207, 253703, 3334926, 144079, 2692066, 2264528, 6186387, 836918, 3267612, 6401263, 296232, 8151779, 463440, 6391898, 3183049, 3281309, 2159035, 4396983, 5304606, 2288026, 490467, 2163129, 6828117, 4005513, 1210901, 2253292, 803493, 4769045, 3881413, 5529444, 5801469, 4289797, 5840192, 7887002, 4520373, 6596749, 6604950, 5565768, 7467512, 7705507, 8305057, 819216, 6514168, 4716015, 7411049, 5752180, 297416, 3562660, 4924245, 6081708, 4831775, 892682, 1128522, 4554056, 7026900, 53640, 5975867, 3251505, 281219, 5507791, 6001547, 1432080, 1026919, 7449941, 583243, 5777121, 3745441, 3979561, 5076878, 1169144, 2528658, 5181148, 3811918, 7856529, 5255566, 8115892, 3295063, 4312384, 5455094, 7815256, 7545636, 3047804, 589130, 3414108, 6259223, 289623, 6578413, 1672078, 5087695, 7375364, 201820, 503803, 4953186, 4208785, 6345345, 1590631, 3100605, 3247495, 6024674, 6033243, 673378, 644510, 8143842, 6540547, 3874992, 424990, 6227253, 8042344, 7998417, 2000721, 2005396, 2995089, 4990018, 797926, 4819604, 4056907, 5742190, 7829418, 727939, 1691992, 5512606, 3904456, 7889119, 7742616, 840078, 5551261, 6736331, 918473, 2485394, 2281630, 6914943, 5451052, 3097753, 6477967, 1855261, 4739532, 996851, 12860, 3787948, 1651767, 2274626, 8309069, 6443873, 7718177, 8161157, 2028659, 3332388, 1485406, 3609939, 7995661, 3797310, 2084907, 2042975, 1877613, 3697209, 3447179, 6112980, 6049832, 7064708, 2287706, 4594474, 2006163, 1806106, 5139374, 4245180, 1207754, 4306656, 2991375, 6697138, 2534290, 8055506, 3594386, 917652, 58971, 4430633, 374541]], -[[4649733, 7839693, 1176635, 7094572, 8112287, 8378837, 7410710, 1675627, 6501946, 6304930, 2718622, 6410547, 6737589, 5080538, 5229488, 1497989, 6886819, 7227769, 2199632, 4770407, 6674588, 8026616, 8205559, 7671196, 7665129, 1456331, 7592813, 2609859, 3806907, 1693343, 2162068, 5869827, 3916365, 2700497, 1580059, 8072761, 4232247, 2376608, 3753206, 5896261, 3704432, 5019116, 1768168, 1361641, 8084289, 7490233, 6913541, 6721433, 6056051, 7656172, 703686, 7382463, 5808104, 4485957, 5980043, 7589848, 1522662, 2259426, 417832, 3734547, 1191862, 6790961, 6062865, 2028816, 6330195, 2022987, 749404, 8270504, 3890131, 2465303, 4369381, 1762826, 7432428, 1907802, 7309246, 7794531, 8320287, 894048, 2298801, 5816322, 5112430, 1354658, 6940249, 7786547, 1208385, 5797686, 6989393, 2446771, 4139336, 6510501, 6261181, 5999584, 6180245, 1060945, 2381010, 2485426, 2252781, 6432217, 7954960, 4709093, 7033059, 2461788, 1841251, 7337042, 2127699, 4068407, 7547222, 2190119, 2583747, 2050472, 2426161, 5843870, 7299325, 8344963, 6871491, 1006689, 2832911, 3925697, 2849735, 75728, 7198342, 4301374, 6092932, 3519448, 7060611, 1163163, 8084853, 1331374, 7962486, 7263185, 1910905, 3613143, 154624, 3664459, 6580470, 6005599, 7806387, 1919457, 7965132, 5621780, 6312159, 1596898, 6693846, 3946018, 4698954, 878298, 3432583, 6546700, 1195581, 3446670, 1565414, 2253317, 3624622, 7233247, 5344620, 3187464, 1628306, 4612362, 5101486, 1129890, 4498238, 445140, 6482994, 7821973, 2905913, 3294837, 3773129, 4472331, 5822506, 835089, 7572994, 2612091, 4724810, 5419319, 903190, 12096, 5554843, 7265448, 7673775, 1705238, 7044667, 6704282, 7199668, 7329821, 8237739, 2261075, 1377969, 7742820, 1695988, 5082142, 5591409, 2433714, 6319589, 2402496, 5694352, 4985742, 4916005, 3428981, 618443, 1183373, 452198, 5309330, 5370749, 193466, 8080875, 1425971, 1083271, 2350632, 1406924, 2358515, 4747118, 6078060, 6115880, 3200723, 4067786, 1570187, 2317231, 5503409, 8177615, 7294724, 5778378, 714238, 4361243, 814477, 67710, 5820002, 4640050, 2585379, 2362730, 4342168, 6806898, 2113205, 2361273, 6642001, 672748, 2911904, 7556621, 4545620, 332570, 201132, 1341879, 5806826, 4895419, 957831, 5228315, 4412372, 4167994, 1331918, 1154756, 6440185, 2836764, 3486650, 774979, 6361536, 4799719, 7160844], -[295054, 4576058, 7453620, 6444719, 3590039, 1205456, 1326657, 4179157, 3091771, 2655398, 7011701, 245782, 1933388, 5106078, 790836, 1182457, 2765782, 5179936, 7927656, 788893, 3955679, 2274806, 3335998, 304793, 7467777, 3553577, 7576063, 8009116, 2848170, 8248207, 6936451, 4779530, 1656180, 3713129, 750693, 5341445, 201552, 3379582, 3440809, 6125796, 1246801, 298226, 2636352, 9339, 4324698, 7723037, 7180306, 3744055, 1027669, 772725, 7557679, 2147801, 3539715, 3604642, 6770068, 7485658, 4802877, 6720431, 5163560, 1345830, 3322401, 6990883, 6289071, 1166625, 4015981, 3331105, 5175393, 3545816, 830793, 5953327, 1316267, 3370688, 6371357, 355100, 5588527, 5471224, 6188891, 6626334, 4156844, 5846895, 8331394, 1980847, 7388428, 4783035, 4919848, 5173976, 3212274, 6705265, 980121, 5719566, 6332092, 8376966, 3158156, 3518797, 689559, 181977, 5122173, 6055130, 4379853, 5860103, 5288198, 355722, 7708101, 318840, 4640477, 985566, 6422140, 6713411, 517495, 3072077, 2525827, 6312916, 466780, 4019614, 4735775, 417132, 3061069, 6310957, 6653291, 5878635, 1120440, 2572515, 3244310, 6979448, 7801207, 6345962, 6689911, 5944521, 7585391, 3125645, 3336969, 6987451, 4133329, 1531376, 4995244, 6974225, 1303244, 942311, 7276631, 8041896, 8004841, 754978, 2881510, 8377870, 3828014, 2187494, 3684950, 6074324, 4664242, 4578196, 4775636, 7062730, 1620373, 7693605, 7798882, 4616131, 531283, 178722, 4206429, 7405845, 3101328, 6945906, 7858104, 1524473, 554931, 5884296, 6618424, 7840706, 1010234, 2984806, 2710615, 267116, 2957478, 5576577, 6951222, 7889884, 379634, 2975498, 5484095, 4472044, 5247429, 4253642, 8325958, 7350115, 3503644, 4136644, 4635642, 1189636, 6471186, 5864911, 7947832, 3937732, 5732634, 287232, 4709097, 1824947, 1455120, 243852, 899868, 7219866, 1174644, 5271191, 3351561, 3742871, 1544200, 5137207, 105150, 2992301, 7137780, 8182594, 8200214, 2967438, 5964580, 3792155, 2965196, 6301626, 185698, 7750229, 4874808, 597790, 925099, 1529742, 5238433, 4030080, 8035192, 1675802, 2420361, 5942216, 1067874, 3763957, 7150703, 2199269, 815292, 8188423, 2211229, 7426086, 7073460, 6180198, 6635296, 4229795, 4682570, 662521, 5715342, 4539327, 8134224, 1198185, 4975549, 1299167, 1659968, 5463635, 6101082, 6747339, 8167690, 7941548, 283849, 6763969], -[7673148, 976616, 4457727, 6388970, 3566215, 7402657, 3350824, 3841935, 3275456, 7858859, 758444, 4163041, 7825743, 980464, 6300486, 8074614, 2315733, 7043423, 7802290, 2377706, 994848, 5278947, 2977991, 6267332, 2445398, 3800157, 4322300, 5016323, 7395334, 4405424, 1881905, 5068017, 5508466, 5904170, 4281777, 5858902, 2693953, 1505905, 7906719, 7100292, 1349783, 3686089, 8130816, 6578801, 5766856, 6070951, 4634193, 2643616, 3940231, 5878844, 642889, 8329892, 5144300, 3872876, 1225792, 919081, 7622480, 8121829, 179236, 7404907, 2062787, 6090703, 5398868, 4259682, 8190710, 4478927, 3496234, 1858313, 4938672, 4062419, 4559482, 3478599, 2311581, 3183370, 6169980, 4368245, 6056375, 5425139, 5206909, 2371100, 1499676, 2378411, 328020, 1956992, 4505079, 1050622, 675039, 6313202, 1376053, 2404858, 5895018, 655845, 338718, 2813534, 4167879, 6691679, 2147144, 1684798, 619895, 4381893, 4183788, 8234345, 1598272, 5533700, 7660946, 8199815, 3018534, 4303801, 6517618, 4954868, 864530, 8144259, 96738, 486887, 617388, 4184566, 5872303, 6915745, 1178465, 7434190, 6163591, 6337102, 2982593, 6370294, 5376964, 1944879, 1699775, 8358216, 8220123, 3785267, 1361959, 4960972, 5114625, 2831460, 7973822, 3050994, 7639689, 6880710, 6082505, 8209106, 719842, 2504803, 5876796, 3273962, 1182924, 3061631, 2361952, 3730379, 1965494, 395371, 938954, 5350881, 2295978, 4394194, 5906993, 3821273, 111850, 3555977, 7747492, 7876168, 3784018, 4882799, 3466470, 5361608, 2508006, 5103205, 5319542, 4862690, 2463938, 7696025, 5940580, 7348233, 3403000, 6921506, 6585536, 2035742, 1933570, 6150533, 7871734, 7038762, 3032672, 130289, 5001588, 480688, 3140118, 5491390, 2430602, 1416863, 7957419, 7735283, 6555760, 596960, 3289910, 1643826, 2202241, 3032934, 6366209, 1786, 5965164, 4866666, 1136863, 5385741, 5169399, 6078944, 7172410, 6720099, 2527901, 145524, 686030, 5660987, 5853627, 866793, 8178451, 6847177, 7361642, 1254079, 839605, 5654757, 7128472, 1856380, 839253, 359525, 5833885, 8297128, 70323, 4758322, 829341, 315880, 2644103, 7409207, 6524640, 729161, 6172611, 7137080, 2167806, 6864985, 3513950, 2104282, 3692923, 4481811, 3440227, 2193608, 4083676, 5548289, 7382506, 7573737, 2053959, 875765, 3477328, 705749, 8176119, 6077864, 6720077, 7997943, 7870436, 7852704], -[2720925, 7740388, 4654673, 5956258, 7403917, 6770026, 3547414, 1510133, 6593562, 2004045, 3809, 6455333, 3420561, 3548681, 4616473, 4184514, 5986836, 3901625, 3046054, 703512, 776072, 1136425, 7237732, 795340, 7198823, 2763047, 1556893, 5640853, 731802, 2468735, 7377846, 7678956, 7957132, 6107505, 5216562, 6422393, 7151753, 8270673, 1464261, 4516378, 7954024, 4447432, 2989936, 4404705, 3985161, 8242669, 4072027, 2884548, 7632118, 3421244, 6421485, 3831684, 2391021, 1787211, 5283053, 7055242, 2190098, 7093471, 3003786, 3637174, 1561848, 3299129, 3932463, 7614400, 5216949, 7494179, 6380879, 6204634, 6583631, 4083746, 4045638, 8170796, 5215344, 3579781, 6871000, 4806150, 3853073, 248833, 5270175, 3652955, 4518387, 2426767, 5707634, 7058720, 7098812, 4026175, 8227990, 4816939, 5531173, 2223099, 4663106, 6566278, 2376055, 7272019, 5108653, 3216965, 2708562, 1232604, 6690879, 56628, 7265995, 1973668, 5878316, 2300523, 6357550, 5753958, 2537165, 1985881, 1028257, 225997, 5712148, 5412952, 3244258, 2217143, 6902244, 6559259, 4309325, 1833951, 2580566, 6045438, 3362712, 3101581, 3783289, 6131074, 4398022, 5925983, 1193858, 1346576, 1980982, 2228003, 4621509, 1116643, 6491218, 6880830, 3413998, 1417318, 2733527, 5420415, 7499407, 1812297, 4399825, 7072862, 6130617, 944589, 4028424, 4367086, 4276595, 6569791, 7184576, 1949448, 4550637, 4628924, 3770861, 634159, 1203795, 931835, 5761933, 2717593, 106015, 6745418, 7436387, 4947479, 8101510, 2207992, 2616472, 4991634, 3876031, 389463, 4160162, 6672272, 1225685, 2227743, 5353468, 1766506, 4031787, 6149406, 2608927, 3777216, 4940824, 279906, 6860189, 8070834, 275323, 971545, 7211849, 7428946, 7543842, 374383, 1075485, 1215066, 8342588, 6759825, 401765, 8325595, 2511635, 704285, 2751538, 8200399, 1725124, 3146639, 8329362, 1540767, 3838272, 3863301, 776300, 2259226, 5597898, 7889667, 6805979, 7791123, 2484890, 4717779, 5452415, 7435801, 1438643, 2272868, 7940162, 776577, 1868891, 3251149, 1368078, 742232, 6393079, 3364179, 2119117, 1867071, 2811055, 4145292, 8230276, 251631, 8047523, 4569002, 7357706, 1905882, 635728, 8159738, 1558749, 233755, 4566175, 979751, 1714188, 5022087, 6380669, 1490067, 2816354, 1973797, 6649068, 1414546, 2494783, 5144643, 2776308, 3729744, 6652652, 2432888, 3972132, 3711142], -[552390, 2397067, 2887944, 7804461, 7234408, 1636118, 5562648, 7540599, 1158599, 4087937, 4987072, 5516104, 2098937, 675725, 5077964, 8312622, 1771356, 6650986, 7054654, 3023309, 8078404, 4797276, 622198, 4361887, 5715593, 6889201, 2074927, 911794, 39002, 6209955, 5006776, 5105033, 67897, 5249489, 5527340, 5591626, 21872, 7629883, 7098427, 5062124, 5980747, 5790611, 6745363, 674410, 6970499, 6384137, 5023368, 3186017, 820896, 2606597, 5695259, 2000842, 8114270, 6243168, 1786047, 2580993, 1183677, 3557882, 4173264, 5079801, 1396923, 3052443, 4300035, 7541635, 6074704, 2903400, 8330489, 5173144, 2560438, 2763259, 6154121, 4698521, 7946308, 2795518, 5218272, 7254964, 5356212, 7372408, 3140778, 4930850, 5579271, 2371776, 6843134, 2340632, 5648730, 1265097, 5355931, 1006038, 7750759, 7199519, 1881816, 1300085, 7925848, 531, 2160021, 5155874, 3538299, 582289, 8134772, 1265552, 3130768, 7985349, 2524206, 1405861, 7362435, 4254529, 7443457, 5615886, 1104003, 4305652, 5118570, 6090067, 4170824, 5647446, 5041804, 7060488, 2354280, 6185182, 5207064, 8154862, 6620403, 8190048, 2070036, 3934886, 3063290, 3900965, 4454636, 7397502, 4168861, 2893386, 677035, 337437, 5760715, 3371977, 3868792, 4526981, 5035105, 6329332, 2611369, 6129885, 1508860, 3846070, 1601252, 4450692, 1200474, 5995920, 3828412, 346593, 5040225, 2714309, 3198273, 2215556, 6162339, 6450017, 3573817, 3091688, 7603582, 7277688, 3308129, 4962936, 4977748, 6182533, 5584508, 4204721, 7064916, 1953962, 6228195, 973483, 2249192, 1208295, 1091124, 4100848, 6034419, 6602957, 1356765, 5122199, 7177258, 7899853, 3374139, 4957665, 2752547, 4556920, 2541013, 4205340, 7163748, 3557887, 3570256, 8367601, 7547882, 5556420, 5121774, 3435852, 4067201, 2627692, 7460175, 1650192, 3037325, 2547966, 6684611, 1372407, 4683867, 7498933, 5165643, 5646028, 1223719, 1568638, 2070704, 4660673, 900382, 8059680, 3687681, 511194, 5600958, 2923377, 4939747, 1575368, 6999579, 1447039, 7437421, 6437605, 3118244, 7286437, 6481393, 1519437, 3926156, 6532317, 6939248, 252472, 2912066, 8147034, 5027193, 2188989, 2189260, 3763453, 510797, 2082540, 4000308, 6381644, 3655600, 6428808, 1441509, 8109232, 2474473, 6897806, 1632147, 469528, 7308795, 6382619, 4537728, 4322543, 5607522, 7998645, 4944575, 2977279, 3186018, 3509744]], -[[3055621, 253220, 2141435, 5157504, 2299058, 5911211, 1650028, 3200129, 1107256, 1401739, 4299394, 7170278, 1220670, 2455171, 8127000, 256472, 5211715, 534019, 6881150, 1721208, 1069144, 2803022, 139065, 3585292, 7028783, 807646, 5280402, 6576372, 7298086, 1886604, 6756676, 1313290, 321382, 1193706, 6312231, 2943041, 4863328, 1492448, 4456718, 2473343, 6348835, 5255735, 5386931, 5456196, 3801817, 6130346, 4427080, 1337806, 7487491, 5390060, 3471001, 6631998, 4433590, 1393269, 2478925, 1601395, 5199410, 6438869, 680716, 974491, 5544108, 5255666, 7199509, 3554202, 5314312, 5203629, 3374330, 2938342, 1960244, 3969680, 1692715, 5677870, 6583488, 6577074, 4711655, 5080325, 6674681, 878315, 1426728, 985303, 7918432, 3308517, 1857576, 7009440, 2233492, 3664085, 1002079, 7863140, 2869670, 780366, 6205257, 957735, 992457, 1687049, 5769479, 2752668, 1955872, 561275, 3928936, 2901202, 4967962, 6375645, 5648275, 4512968, 3279378, 6740792, 3755016, 4383743, 6793566, 2876567, 3157952, 5373597, 5509035, 1209095, 6226160, 6079918, 2105263, 4885118, 996379, 3234841, 3856473, 2202884, 6803001, 4733265, 6643024, 3215165, 3807789, 3033191, 7731796, 3077585, 1950726, 2827590, 1528965, 7378054, 938369, 6986810, 1627824, 1964301, 1574093, 3432700, 2372013, 2881047, 1891048, 3156844, 3475634, 4106075, 7371347, 6553218, 4745701, 3656188, 8224210, 3966432, 3387922, 3622931, 6868638, 8378960, 7214763, 7939934, 5117256, 8158280, 974931, 449159, 7022158, 3771645, 814504, 3685253, 7015812, 681852, 5963253, 3070882, 1754957, 4742665, 3892152, 3173227, 1947077, 5514468, 7712598, 2683036, 2446204, 3749079, 2205171, 6622470, 7182184, 7544003, 738394, 6716574, 3715616, 8274323, 6915521, 5863544, 6311565, 8268524, 3731534, 27851, 6642560, 1376311, 279305, 1388191, 7344912, 1475984, 1415889, 5086930, 6893610, 3621030, 900598, 4030395, 7402016, 912363, 5837516, 6287088, 4486993, 2329026, 2194271, 2853280, 1968042, 6634153, 1162108, 4088513, 841196, 3493509, 432522, 4731749, 5370820, 3024778, 5922181, 5106080, 3556630, 7035024, 2829579, 8086519, 3210579, 317485, 7824967, 7204928, 5677454, 6392380, 5499575, 7241688, 7332415, 4332232, 4366511, 2981204, 6493263, 6093525, 8360622, 2805834, 7967505, 5254507, 8280828, 5627408, 4757805, 2686804, 2043932, 4897395, 2965455, 7805546], -[2934033, 8297616, 1753081, 793100, 2624086, 5951809, 2368924, 3642449, 3628337, 2510873, 843241, 3399762, 6049661, 1308811, 1844196, 7570107, 3776994, 4990759, 7872975, 600395, 95034, 2524756, 8302746, 7416617, 5830444, 749311, 5424318, 5889750, 4862963, 2090249, 949652, 3504011, 3629722, 2571717, 640148, 3785690, 6232560, 6304682, 7548921, 2176853, 5321451, 5399379, 5089236, 2463707, 5640565, 3958460, 6569065, 7080704, 6767461, 232282, 4657506, 4794136, 763365, 4867033, 6978540, 8215880, 390903, 2133527, 1948439, 6350529, 6069408, 2775020, 6856188, 8175317, 5101649, 7991989, 6747016, 3568420, 7041223, 2469731, 1496226, 319961, 6114810, 2363457, 520258, 2523724, 6980061, 3447694, 7344351, 4743537, 7036716, 2230249, 1063804, 186512, 7442234, 3302469, 3765313, 4832316, 1484791, 6648600, 40493, 7067851, 6171655, 5395355, 1812511, 6336191, 7245767, 2563825, 6519907, 3247422, 8072188, 4531977, 3623648, 4123016, 2777687, 7301043, 4788185, 3999332, 1715415, 8104856, 3978795, 6813107, 1793836, 201978, 7463566, 6440292, 1630326, 2130775, 8326886, 4335662, 3745029, 1783580, 3311166, 7273642, 7684685, 6245874, 5709086, 7129365, 5025063, 893290, 4738028, 3152906, 4339250, 323990, 6380078, 697242, 1057142, 3916677, 2318352, 7328457, 3952541, 8069142, 3087149, 3753932, 7712285, 2073167, 3602786, 4031034, 2489600, 8007631, 2658187, 6931803, 6794414, 6073204, 679778, 1805779, 6826805, 5110806, 1056117, 8220440, 8145585, 2994939, 6453278, 4889298, 2476777, 3163281, 2774114, 1964232, 5611187, 7255445, 3347773, 7069646, 2117202, 1205747, 7675106, 6828424, 670388, 5284066, 7983404, 892024, 6295518, 2081793, 2886099, 936294, 1521937, 4208382, 7135525, 6831597, 5535951, 7560651, 3994095, 2552644, 873826, 8298185, 1496546, 4968620, 4656784, 1956223, 733244, 7651365, 5833090, 5595051, 4769280, 3489548, 6902837, 6140860, 6104396, 927707, 16055, 83586, 3844274, 5709697, 6862059, 6790622, 8216835, 5921253, 333906, 4729823, 3607729, 5581920, 5809233, 7548353, 3256357, 6306715, 1089769, 5969153, 7653626, 2430438, 7621938, 340165, 7702400, 49014, 8102014, 7846758, 152676, 376314, 1740793, 2001213, 4433185, 5147164, 5937370, 8196885, 2995703, 1867220, 4044866, 7494937, 8108271, 6079753, 819107, 2428042, 4199013, 126737, 4576000, 7142502, 7596031, 2913537], -[7004300, 915788, 4014760, 79757, 1249838, 5284349, 1380057, 3808673, 955149, 5235039, 6803918, 4172312, 1747296, 5926216, 4424366, 2370805, 4876797, 164232, 457575, 2185733, 3428043, 2852476, 3788694, 1478699, 4840740, 4253222, 5148906, 6802279, 6992244, 2602415, 1823338, 6170057, 4098881, 6250120, 1064322, 4614149, 2213247, 5793055, 1064953, 1462604, 2564136, 2014015, 6836391, 3252663, 8350826, 2665021, 437362, 7270503, 2849352, 4551946, 5358911, 5867831, 5469480, 6233959, 3033636, 2856290, 1100934, 2788484, 3753437, 5615198, 2940259, 3465140, 92644, 7851538, 7578902, 1010747, 6418918, 3416893, 4089128, 7305248, 1211636, 2526384, 5542440, 6872305, 7453179, 5936429, 2635044, 6883772, 3122606, 128083, 1085859, 6505690, 276644, 7740467, 3411319, 2158805, 554181, 2200897, 6206299, 4732542, 6589619, 6163563, 3456612, 170399, 6636509, 5473063, 1956465, 4801337, 732260, 1705400, 7348160, 5083748, 6285514, 4056405, 5323757, 3628245, 7730365, 6697689, 7414110, 398817, 968148, 401278, 2175346, 6505994, 5220022, 971318, 7907419, 7209862, 4653328, 1981244, 1923032, 7798358, 5231389, 5464523, 6312095, 18876, 3461420, 5602874, 1092480, 268112, 117324, 6347549, 7159966, 3353668, 4624068, 3770635, 4807835, 6169692, 3677241, 1151250, 4134569, 3205422, 1990937, 8302266, 3136165, 4726757, 5837065, 4702797, 3853068, 1245117, 792180, 5818132, 6833287, 4280601, 1461304, 5613485, 2474325, 1406105, 1246494, 5648294, 318066, 5596366, 7871031, 6437049, 7127678, 7193752, 1217155, 5568012, 1914138, 4501985, 4547290, 6047889, 4891560, 3107106, 4393481, 2526967, 6819577, 186831, 1624443, 517234, 2839157, 6685749, 1553708, 4685694, 1857657, 5924317, 3515149, 7322247, 2133573, 114531, 6019365, 2286094, 2708121, 2552545, 4838055, 7789292, 880322, 5906624, 6045075, 2280702, 6213342, 2661784, 2585959, 6865080, 7297263, 3832535, 1995087, 5394201, 1571175, 4849545, 670836, 4366471, 8121890, 554050, 4038011, 1773881, 3670872, 3858605, 4230729, 2458644, 720513, 2300544, 711862, 950587, 4938225, 7014733, 4007060, 3574109, 5864814, 516179, 8262561, 6871847, 5196667, 2602014, 4225518, 6443215, 4213526, 3604806, 2994394, 7865383, 8353577, 6341909, 748909, 6457997, 6860778, 2615442, 6447455, 1257316, 4693995, 4811019, 7661723, 2287455, 4052841, 1445471, 8262581, 1169714], -[6306941, 7774709, 4867312, 8275210, 2044331, 3338976, 5234627, 1414527, 3016525, 572061, 7534689, 76515, 2143233, 2490688, 7497176, 5446123, 4556568, 7356066, 7367651, 503772, 1665224, 3666140, 6084674, 5724700, 5639967, 6028670, 4084018, 3754281, 7786483, 5086982, 2983489, 1905682, 3161550, 3223638, 6851865, 1142211, 3989833, 3173043, 1879280, 8224661, 6022037, 250507, 1963832, 4919151, 6394376, 7563425, 3198496, 1898801, 1252885, 7636652, 2635203, 7628235, 530443, 5615986, 1176260, 4421943, 2909765, 7540878, 6693600, 7453488, 2334820, 7558347, 4001115, 2873524, 1777057, 3032568, 1561480, 3606359, 4875930, 190172, 6848728, 564169, 807104, 4433073, 1253405, 2895868, 7531142, 6450499, 6291286, 6139401, 5660522, 53981, 938613, 5694608, 1253755, 1156611, 6156324, 3983408, 3724171, 5252103, 5707346, 7185348, 3736757, 8291725, 4818352, 1547651, 1216548, 3110142, 3125016, 5019683, 6303763, 1031486, 773817, 6825729, 2471424, 4672713, 6289242, 486308, 82094, 4620797, 2749820, 669585, 5599861, 2947421, 711933, 7162902, 7952293, 6710429, 2248338, 313730, 4487341, 8045092, 4505941, 310192, 6415414, 314111, 510561, 8208601, 8149650, 4775653, 1759521, 3433461, 5599311, 2521929, 2604893, 237292, 485899, 1536236, 6909059, 5390913, 4561530, 1442033, 1362623, 7576755, 7542217, 6700621, 2482600, 1689219, 3142972, 2418147, 5895026, 6229567, 5410923, 7349115, 4069828, 8179162, 8364381, 7810039, 712359, 470670, 1983179, 4710717, 7557829, 2576138, 3756181, 4524150, 547785, 4540205, 5990727, 3250489, 3818238, 1687569, 5950249, 2400784, 2109352, 6406111, 6637505, 1370852, 1438782, 7473311, 5951127, 7566930, 4205219, 1710569, 4160116, 2110211, 660045, 1917362, 2938976, 6884441, 1820725, 918348, 6765625, 49439, 1317964, 6393221, 257248, 6276738, 4359018, 3899372, 2015098, 6286283, 5755719, 7461733, 3800550, 7759176, 1057180, 4620505, 6591882, 8267796, 8169293, 2632727, 4101846, 5144561, 4760243, 5573383, 3993112, 392796, 8212027, 2031386, 1092276, 1436792, 6255511, 1145895, 5862306, 631388, 7665381, 7295567, 2708042, 206672, 8304625, 6931177, 7916214, 5813462, 7435542, 2015715, 7358527, 4791663, 1245607, 1602687, 6713400, 5149131, 5255498, 2698946, 3146678, 5019751, 7483068, 3133201, 5287101, 3382540, 8208299, 2728025, 7790396, 213621, 7797413, 4814107], -[7725198, 7633963, 6413316, 5731361, 7540199, 128591, 4821612, 6212127, 6810113, 1211955, 295913, 8354527, 46620, 8110900, 2275380, 4358642, 7475882, 962360, 6765148, 4961947, 7913442, 8015312, 7174556, 4789718, 554868, 7173551, 4909946, 4939143, 7047753, 3974148, 6662056, 304799, 1391145, 5836281, 7230526, 2614843, 4870362, 6857793, 3680490, 1134467, 2189445, 1210184, 51592, 7312570, 6780943, 7930397, 1691839, 7485231, 3567420, 7835737, 4753753, 1152826, 939007, 5965187, 4218637, 3946217, 1537980, 4448319, 4460847, 7918607, 6367843, 2140224, 5907316, 4796820, 2614211, 6586255, 7252180, 2098329, 4146903, 7854297, 321784, 928175, 4239850, 7777248, 2215564, 5011700, 7719717, 3737769, 88704, 4492584, 2142490, 6919256, 7575592, 1478996, 3911774, 4609333, 1301987, 6264586, 1265915, 7812262, 1692583, 2739677, 330770, 6184163, 4265861, 1725064, 8264332, 2284959, 4280533, 2904889, 6308067, 1875808, 3551751, 4485197, 2919505, 5486281, 4962134, 2527742, 3514385, 7315132, 127784, 4261974, 5263238, 5604075, 701909, 6280390, 6938821, 1044613, 7964520, 5692118, 953681, 3053227, 1197544, 4281457, 3780231, 1252185, 4708165, 2003187, 4084457, 5656519, 6958325, 2319997, 7506325, 7123729, 461165, 1094623, 7708501, 3541434, 3519289, 7563098, 7689586, 1356003, 909606, 7643653, 3974702, 6505031, 3125330, 1293218, 1075280, 8365159, 3704791, 6981222, 1458188, 5578641, 3519482, 7039078, 8018178, 1293101, 2397652, 6480515, 7775610, 3789047, 4121076, 770484, 2594083, 1269742, 3009655, 2618649, 7470252, 106878, 579576, 4107756, 5830590, 7658936, 4114194, 7382598, 4924833, 1283335, 3337297, 946497, 5957185, 6917627, 438705, 3370248, 1388398, 1306034, 1739123, 4667024, 1169520, 5153243, 3310558, 2308490, 630323, 5634896, 5540694, 1732900, 3673596, 5506979, 117526, 1414140, 1573157, 8052668, 4726471, 6565859, 2546967, 4586608, 5724294, 7373799, 3246474, 3897553, 3381936, 977587, 4059367, 1971969, 3391071, 7073920, 4174108, 6147634, 6591619, 1742301, 535757, 1327059, 6006653, 746886, 4707665, 1870228, 2875071, 2540565, 6390950, 8200707, 958398, 2458544, 1345519, 3628746, 3908788, 1290047, 180666, 7424037, 8156840, 6313699, 6763647, 4618455, 7133896, 5471329, 4839920, 2276882, 3624163, 3496914, 842488, 4867623, 1225302, 2682877, 2935131, 8068944, 6712065, 4352260]], -[[2230647, 8114300, 2009753, 6160015, 964480, 2776573, 1434730, 8286757, 7826461, 1928132, 6381276, 5760852, 5271830, 778443, 6247865, 8064890, 4902308, 824385, 4166061, 401113, 2544470, 7456396, 5789009, 5618655, 52382, 6560128, 7574048, 2375317, 6567849, 2218260, 1765451, 3427376, 1529911, 2425189, 3402507, 2917371, 6466665, 321766, 6229265, 7144743, 7517647, 5320468, 1634459, 289829, 2575648, 4137523, 6628123, 7231666, 4827826, 590104, 812432, 414012, 2762495, 8077397, 4605082, 2445727, 1570435, 607649, 6218115, 3396240, 5334715, 6019834, 6398227, 1355655, 4766910, 5550481, 8167214, 4945167, 3377581, 7765521, 232365, 6513523, 2670832, 6284903, 1576458, 7552370, 3016137, 1919684, 1214537, 5265124, 3897034, 4275602, 5673933, 6488981, 1901516, 8345439, 7215886, 4013147, 1424849, 6049087, 3507779, 130594, 2966912, 3729077, 5837328, 5382410, 485952, 890878, 6421734, 2604218, 7145929, 4154744, 7606349, 3521902, 45521, 885705, 6929374, 4572360, 4532033, 3794668, 3446050, 6717990, 7326382, 805389, 1768134, 4791081, 2564396, 3035513, 1765969, 4941897, 3601056, 1285055, 5786668, 3074502, 6958764, 6226273, 4841883, 8035522, 173242, 949526, 5938505, 748194, 4367652, 809363, 2631803, 7474065, 4401080, 3125667, 3331362, 8152088, 4084259, 7959402, 528168, 899913, 1789941, 4832677, 5586706, 4668105, 7744976, 7936314, 7796491, 3210882, 615566, 5304143, 2345564, 1366023, 4399492, 572238, 7115627, 6610000, 2680511, 7876324, 365109, 5142308, 925931, 3103788, 1553894, 5416703, 3523589, 2402997, 1486436, 4144435, 6655586, 5673032, 5088045, 7080206, 3071709, 5848767, 1408124, 6083879, 2884119, 6132034, 5466614, 694013, 6513332, 7374256, 5378010, 1815615, 4064765, 492366, 6977808, 551960, 1664460, 4235034, 407168, 5185875, 6316934, 8016846, 7938257, 434355, 2756281, 534876, 2767228, 7662910, 6901934, 3307514, 2061288, 3120142, 7919340, 8265625, 5240439, 6261323, 5678950, 5385669, 4294662, 661073, 1100098, 1047288, 8035780, 7508659, 2660967, 5876031, 6246217, 7138581, 8085651, 5800642, 3836080, 6443466, 485623, 6579487, 3227494, 1986494, 5501317, 494115, 5569335, 6558588, 5985291, 2978816, 1478921, 7416740, 5955468, 3738566, 514983, 5654387, 6829429, 8221325, 487459, 5657651, 1659466, 850825, 1157901, 682934, 4466581, 1300485, 3879090, 1964252], -[1447243, 5620686, 6178370, 2927328, 2053160, 8379945, 637580, 1710660, 215651, 2686398, 4635947, 3299001, 786702, 5713347, 6296038, 764103, 4014072, 1829355, 7306631, 5330815, 7788907, 3553201, 6534665, 3986428, 39728, 319160, 2688271, 5018337, 3947302, 4388085, 4476493, 4326410, 7449058, 341058, 4162017, 1563824, 1424309, 1278603, 474356, 6544600, 6006749, 3417744, 2201620, 6187661, 3971624, 1535590, 4003829, 3180496, 2259235, 2321216, 799675, 4198649, 6224123, 8812, 5962513, 8327521, 2584609, 4831997, 5609889, 7512167, 1031982, 3658032, 6843123, 526728, 5499354, 7039986, 6080893, 61965, 2816968, 5835659, 7317174, 2901191, 6642010, 2795099, 2883396, 5988771, 4469319, 2681531, 3562245, 1453476, 3945504, 5414567, 4829362, 4408466, 5121056, 3977730, 8046180, 2728908, 1537034, 2352391, 8138158, 6602423, 6851918, 2007718, 2885066, 1578919, 7741938, 7117103, 363606, 3595016, 6530487, 6715289, 8250330, 6808816, 3421706, 4292350, 690376, 4334390, 2061098, 8077603, 3578893, 8326019, 5918422, 7850347, 7350435, 3329135, 2755897, 6946695, 1789268, 90697, 6241727, 1908885, 8099228, 1764305, 5147316, 3949393, 6071272, 8036544, 1408179, 4874737, 4918134, 2407641, 7673380, 6748056, 678880, 2132429, 4298221, 7371316, 303536, 7106030, 7441862, 5619936, 972591, 6415746, 4434530, 1990393, 3245767, 7572520, 8327693, 2054359, 2678403, 3998838, 7177390, 6403085, 475604, 4792922, 2042394, 8007153, 7269030, 3796442, 4143932, 5682906, 2688232, 5715687, 5003153, 2821005, 4492433, 3610176, 2316781, 4577067, 5333184, 996016, 4266736, 188914, 7639190, 916177, 7606580, 3420092, 3749927, 39067, 8217460, 3428519, 1735347, 997420, 5519613, 7708246, 8151013, 8166126, 4727460, 6435299, 6015714, 147151, 2149168, 7818834, 7524475, 2613942, 4248100, 2606354, 4773390, 1100816, 1437050, 4007596, 5130815, 6861544, 3393695, 5021827, 8082026, 2494149, 2509387, 6222739, 5897215, 4896468, 5858459, 2670235, 1338970, 5961099, 6704452, 7145979, 439882, 4455545, 1009931, 7585055, 6479916, 3566314, 6201691, 6927266, 6642585, 3464687, 2041050, 6608642, 4228311, 4917483, 920129, 105613, 3093131, 8367610, 4471627, 2174513, 4028834, 1353748, 998576, 788257, 28562, 4400906, 2305415, 1848367, 6919803, 190949, 3132264, 8043528, 8204826, 6996812, 4648639, 7607010, 6315383, 5645967], -[2633358, 8012073, 4614158, 7402919, 4177768, 8066715, 976119, 2606421, 1463127, 6710633, 8115362, 8056063, 7038303, 6310141, 6252073, 460936, 7872668, 2519829, 1763824, 1598684, 5205205, 792019, 1159548, 2204542, 3401458, 4218415, 5667204, 4280073, 3316597, 1583405, 4553530, 3209900, 3437049, 4063983, 8016632, 3013033, 1105381, 1837783, 1483525, 8008074, 4794925, 803237, 3314056, 3616840, 917960, 8259636, 197108, 3765335, 3221202, 6396137, 5033394, 4987300, 731227, 7251946, 235929, 5101551, 388187, 6385402, 4565710, 3314221, 4255767, 6295373, 4415471, 509580, 1065458, 4261189, 3366598, 4251340, 7054266, 6167956, 8318840, 1189308, 4661019, 5792949, 7745732, 5582884, 2201435, 1757766, 4858355, 6783438, 5238584, 6518297, 2051283, 5375743, 6477715, 2474929, 1736279, 499111, 4970183, 1263329, 8225082, 4931793, 6567664, 1515304, 1153074, 1431602, 2596616, 1178996, 1694760, 2947734, 1277533, 5433842, 1758876, 8224960, 3311951, 8160582, 7354266, 8327057, 5422142, 4129076, 1089547, 6320367, 5128612, 7028489, 2250803, 3375655, 7333112, 2114942, 178201, 452543, 5682149, 4092269, 409941, 3614504, 5840528, 253451, 5648709, 7802525, 884904, 1176231, 1941768, 649975, 6808430, 6185770, 1172496, 1348050, 1187504, 1587907, 8170186, 7733096, 4297553, 2880262, 3967130, 958243, 7204757, 975214, 4714606, 3501725, 3966694, 4683176, 2594458, 3814653, 7289713, 1538335, 6901735, 179264, 2167534, 2371293, 3327312, 6407030, 3536679, 7292391, 3803808, 744960, 1658073, 6220343, 432825, 3583867, 3276034, 1815634, 3793807, 775320, 3467861, 4729047, 5015819, 4149457, 4352844, 1838156, 6519188, 5023515, 8321918, 2308603, 5508306, 6687349, 3526905, 1582122, 3852955, 3275934, 8347110, 3513550, 3201175, 1430274, 3071325, 4259249, 2587055, 418391, 7047811, 1659962, 430037, 2288575, 5777361, 750682, 767218, 7606467, 5634350, 8184239, 4401779, 2210697, 4328353, 3418137, 4590872, 2804016, 2964565, 2998340, 506031, 1661014, 4250082, 2560737, 6909470, 7879522, 6478429, 8280523, 7316392, 6280350, 7364993, 1348647, 5643723, 2376106, 6953018, 99699, 351040, 6035548, 2957015, 7034638, 3580185, 3693283, 7412696, 1329858, 6232103, 1824743, 7444500, 7050783, 1175508, 3731989, 945925, 5782026, 5886507, 4247009, 6896541, 4161222, 5085319, 6796105, 7736084, 7593603, 4558951, 5926830], -[7719462, 5722654, 6611372, 3364567, 4051125, 3017073, 3813789, 5286110, 2633777, 8119331, 397713, 2853073, 6647612, 4607685, 8271234, 7960935, 889189, 6996793, 7352920, 7076784, 8122706, 5646135, 3480699, 2001396, 8343630, 578611, 2400041, 991225, 2364988, 2495406, 6597455, 1537939, 964506, 6224803, 5033136, 965646, 5970270, 1349284, 6592701, 7617898, 2565632, 5016439, 4707919, 1971085, 6393286, 6668038, 1059679, 3785439, 4332815, 3969519, 6712897, 3940667, 6797030, 7875332, 4571412, 2729173, 1305651, 6880393, 2033747, 2001062, 3725693, 5771256, 4150814, 2219099, 371329, 1537977, 4572869, 1558119, 8367599, 5477770, 2002258, 4180558, 3856036, 5869694, 7117910, 600507, 2570674, 7643147, 4101426, 3454214, 4096396, 7886153, 5913513, 2458291, 7539254, 7539870, 8174184, 2529394, 5713014, 8229248, 2316805, 7689214, 5841153, 5782592, 323101, 7178422, 4065713, 8369754, 7413568, 3408764, 1948480, 4253162, 2183891, 7106418, 8152939, 1088546, 7437659, 2185432, 4524755, 1455020, 3305025, 6939890, 2178559, 7995739, 8017872, 7420487, 2612547, 7139562, 7054699, 4909384, 4831949, 2000688, 47605, 874626, 4748872, 495333, 2009762, 2995737, 5481078, 1793223, 4538157, 1190074, 6252182, 3402118, 3647359, 2527984, 5090505, 6099381, 7005962, 5975558, 7115240, 5771754, 2567782, 2857616, 3726181, 7896232, 4737374, 4062726, 6632136, 6866967, 212626, 3620973, 6871445, 6809980, 5725339, 5816786, 1361967, 5022066, 7011527, 944152, 6680505, 1087473, 6382477, 2093949, 2515501, 4488141, 6017968, 4191559, 7725325, 2747270, 4742058, 4570474, 7914837, 6441631, 7163410, 5216873, 1807200, 2484437, 7795428, 6827133, 5001449, 4604074, 4710693, 3178833, 7548361, 2308297, 6862214, 2503462, 8249598, 1457503, 4856632, 6827292, 5446755, 2097725, 1852099, 7175902, 6079018, 8147852, 5264284, 1009213, 6943902, 930258, 1156024, 3948112, 8137925, 6913293, 6525276, 8247398, 2400315, 5557492, 1693667, 1343057, 3588050, 95866, 204428, 5574318, 2063419, 5724793, 613983, 7437871, 7417235, 1894388, 6142649, 1313613, 6488513, 5183001, 17528, 6579339, 6408933, 7471280, 3068306, 193493, 4303865, 2208984, 5094311, 3172978, 2493620, 8330198, 2559792, 1180075, 3818880, 4319971, 2828216, 5316937, 845856, 5388932, 1903842, 1585803, 5132327, 3694398, 5556569, 2763003, 6937062, 8323531, 198887, 7959418], -[2448101, 6662568, 5874963, 5604877, 6083714, 7422096, 1062595, 6414757, 1140955, 2557662, 3884050, 1802161, 6748290, 6002932, 263524, 1167400, 1138609, 4043733, 1645166, 5003376, 5601973, 872422, 7065530, 7478649, 1065817, 5489094, 3811882, 6741964, 1750533, 1263510, 1298505, 1674670, 2936553, 3830044, 2123995, 6675587, 473052, 860110, 3015907, 3394151, 5822441, 4324208, 2606049, 6916089, 1924704, 5015846, 7285223, 147747, 3301757, 2216756, 4109216, 361004, 7832614, 5648159, 4141204, 2810727, 919905, 1713227, 7664503, 7047150, 6653800, 1600239, 5863601, 5672026, 505557, 3551981, 2940849, 1721032, 2477018, 1781291, 3530039, 5252448, 7475581, 333059, 4319253, 4037608, 1373871, 2204658, 4441165, 5246563, 1702199, 7093105, 8186401, 5862789, 3418917, 3669080, 8309153, 4898700, 1230456, 4404771, 2696894, 6497796, 4060020, 7930979, 5401114, 2081042, 2383411, 166430, 7090163, 915221, 1555237, 1083212, 4725733, 5286841, 7895883, 510760, 1439114, 5056961, 4522705, 684817, 5607509, 8098199, 6899806, 3979574, 6573821, 1240014, 7301853, 2383038, 1286383, 671193, 5851630, 3131347, 7923600, 66660, 1033456, 2408019, 6279889, 1990999, 6743479, 5650287, 8364278, 6885120, 6297668, 3348575, 8082875, 4067622, 3001120, 108710, 7140829, 7454466, 7228357, 7753743, 4784758, 7938260, 2353293, 448060, 1741928, 4195511, 1444911, 7456189, 5797026, 7230325, 1963453, 8185828, 6645764, 2645360, 3387555, 3560684, 841748, 6733204, 7477370, 5323454, 5356731, 4355825, 3821903, 5935629, 3274735, 3499523, 33508, 4914753, 548478, 1547134, 4686241, 4261010, 5535676, 7271238, 4680782, 1786078, 4493001, 395569, 2771325, 8057297, 49713, 304073, 3820650, 2940210, 7067325, 6879599, 8245804, 181380, 3308495, 8094819, 3047305, 2789148, 62896, 7654120, 8108111, 2201816, 2877597, 6635771, 1344133, 3858162, 888948, 4421713, 332327, 5671599, 2418696, 7286413, 5750110, 5932576, 6293950, 3546890, 5110277, 7733545, 5351593, 3785957, 3529257, 7666301, 135821, 1229858, 5333976, 1765, 4829907, 3662381, 734995, 991668, 3740864, 5265890, 625546, 2977582, 3255087, 2473716, 7083704, 3085942, 7898217, 4016531, 1290850, 3116360, 468819, 6650965, 2909700, 540831, 1055724, 1928242, 2660764, 8033425, 5611670, 2417446, 3930125, 1603155, 8270157, 1690991, 6073329, 3929254, 1690826, 6569610]], -[[8378172, 7261396, 5774731, 3383062, 8134772, 327996, 5867237, 156926, 7571321, 8181947, 2174378, 5150583, 398664, 2615313, 5462278, 1767273, 3069822, 5235680, 7395268, 336945, 2361199, 3860627, 881239, 4039430, 717041, 863270, 6881696, 4626978, 3814261, 7262728, 2551891, 7655943, 5754678, 5966132, 3877827, 3459173, 996670, 7177032, 4804864, 5739081, 2426055, 2406161, 5906587, 618350, 3078371, 6371837, 3750844, 236931, 2944786, 7719491, 2026948, 5708079, 5144017, 1116840, 566791, 786675, 1889499, 3721243, 3555113, 1492396, 786022, 5133526, 64287, 2850588, 223842, 3356616, 6019049, 4448757, 653088, 7528829, 275584, 159038, 3825558, 3088354, 7310264, 6818674, 8100566, 7898348, 6899249, 2388538, 8027198, 5146602, 4536220, 147290, 2739203, 5732549, 5350912, 1080915, 6954879, 6318264, 126478, 5018822, 2998648, 2664339, 6380753, 4469679, 7208907, 5139534, 1843029, 4404400, 6848207, 1246585, 1972847, 4950392, 2321710, 4066298, 2260960, 1636871, 2293718, 2825493, 7132562, 2264623, 1588961, 5572512, 679649, 5653745, 3933144, 6063773, 7017612, 708930, 1482318, 1954880, 2620537, 2579769, 8371394, 704957, 2322241, 3525431, 4391789, 2965048, 8296739, 2403301, 3737582, 3502164, 7645780, 7803912, 4789693, 532228, 2286600, 2384577, 4517864, 3098080, 7439329, 5366348, 5649621, 4102794, 5832211, 2964632, 8039831, 2702049, 3023443, 7632951, 93020, 1503213, 1385910, 7751722, 7834955, 4837419, 953137, 3916441, 1799221, 1239998, 7528965, 4534011, 4007163, 1743812, 899153, 5476667, 7117109, 720840, 6957303, 2628706, 525728, 2936528, 7573821, 7403145, 292045, 5095538, 1490127, 3157777, 6107727, 761277, 4416143, 1445990, 3206103, 3673733, 1350712, 6316924, 3819606, 2974114, 7931170, 6823643, 1757358, 7655988, 4285178, 6372337, 6269041, 5922888, 7897407, 5375515, 4906342, 3783319, 5408993, 3695194, 1236717, 6077962, 4985635, 5681758, 3394323, 5112356, 7751802, 4474140, 5070570, 6285174, 4652935, 6343648, 7398041, 236740, 8055614, 2064037, 3374243, 5990043, 4234588, 7393399, 6027458, 793788, 4052971, 3381784, 2568259, 490959, 3725665, 905499, 3001459, 5604553, 1970875, 2534467, 1057659, 2386099, 2827205, 7706946, 8318239, 7984859, 2275073, 7433410, 6766113, 3775440, 3040270, 1879535, 4706333, 4048350, 5362283, 1000944, 98332, 1951613, 3586865, 5997392], -[3732528, 2713657, 1007895, 4575674, 3274828, 7221646, 4321978, 221931, 6165071, 5626098, 7020551, 924080, 6123235, 387320, 2955856, 1599048, 1375616, 6048544, 5367153, 3312832, 7005254, 6384379, 4421814, 3686336, 7170222, 5435143, 4324653, 1672347, 4144340, 8185570, 7813524, 3647085, 7746831, 676210, 4899482, 7876481, 7075033, 4909107, 6581915, 7044011, 93817, 6687894, 6271672, 6112871, 7118660, 7953389, 4252727, 6946583, 587624, 1285194, 6955090, 7821106, 3722438, 7584598, 2258605, 6166621, 5568090, 1979813, 2767741, 2893454, 7806900, 2992025, 2999962, 1674020, 4864498, 7896007, 6618013, 2645549, 5022311, 8158836, 5892004, 2200306, 7830786, 1282481, 5655627, 1297423, 5710739, 7968477, 7793938, 553508, 8162833, 6063214, 6391781, 1450009, 3449768, 6465817, 2301921, 6478017, 4639978, 4167968, 278099, 4250332, 1017061, 2231155, 7923956, 1065047, 1957822, 3920677, 7873947, 4235976, 2611513, 4299471, 1960770, 380488, 5842234, 4151221, 4192892, 5166817, 5314549, 1153641, 3806050, 5744914, 6414130, 403410, 5323246, 7924239, 274257, 7572400, 5420842, 2358309, 2741442, 1944105, 3101909, 6003341, 3437601, 2775012, 4874491, 8158860, 7074931, 4005764, 1389997, 6392552, 3819548, 8244348, 1882476, 867156, 2492975, 2065949, 4193719, 8189751, 6099978, 3177488, 7192838, 6063162, 5553343, 6560004, 7924009, 8115515, 7188155, 5178023, 5350070, 2433724, 8349022, 7906338, 5789494, 38113, 2880062, 5281680, 4787827, 6885557, 3506618, 6600717, 3542598, 2151794, 6303066, 5335626, 4549739, 6272279, 2118779, 7213175, 5643972, 1372897, 6876333, 3273922, 8291828, 8114789, 1422088, 5270784, 2807105, 4733039, 1786329, 310417, 1114158, 6097916, 7823578, 4247911, 7152325, 3054769, 4906132, 1156065, 7962085, 4928356, 3747252, 5408792, 7358401, 6515934, 4459367, 2089865, 958051, 3397642, 5514349, 3439351, 3228489, 359335, 717809, 4857118, 4915481, 1371058, 1694560, 1878103, 7286787, 7187966, 2702372, 7185278, 3700841, 6718785, 7909221, 8304523, 7206518, 7641358, 3806321, 691483, 3775532, 3397093, 2505747, 5636797, 923495, 5233998, 1283414, 4117711, 891197, 2038798, 6305997, 8289532, 4638172, 3121108, 6212076, 3106269, 3592892, 770680, 6241295, 4615470, 840274, 1198665, 5001169, 5555325, 2736418, 4799737, 5361891, 723808, 7984418, 7450820, 5679426, 1368683, 905892, 791173], -[7495, 1396935, 4005406, 3108302, 8043426, 3536632, 6701684, 5167442, 4942030, 5210685, 5233371, 5596218, 6734161, 7783665, 492697, 6743409, 2517369, 3962936, 6270186, 6587861, 6028806, 52664, 6319465, 3346214, 6817642, 6329698, 3544930, 3665145, 1345646, 4200001, 7151149, 1792889, 3556688, 5926264, 3910765, 2438774, 7719663, 3509727, 2150901, 6701953, 6124892, 941767, 6310791, 2119047, 7462993, 944258, 333227, 276385, 5072246, 1819631, 815587, 2503199, 4781950, 5948502, 6651298, 6967753, 2977648, 6882829, 3365399, 3482728, 2612714, 2038485, 4964122, 7811329, 7996976, 6757901, 7843574, 1311716, 1262226, 1859222, 7640047, 752714, 501463, 1367067, 3475559, 6987068, 3942128, 8048793, 1701358, 4612647, 4729972, 5713514, 857281, 1980447, 4024295, 3152782, 5439583, 6912271, 7915433, 1518400, 7301337, 778640, 5113676, 2725337, 267749, 5701730, 3019222, 6869273, 5879802, 508003, 1039018, 1384051, 328908, 4409776, 7177984, 5240747, 30356, 8190683, 3025379, 5518282, 5689312, 7390019, 7516418, 6235620, 2333729, 1261037, 3846185, 3365562, 5154571, 6130023, 8210723, 7462966, 7122619, 6676521, 5165338, 2563481, 7664721, 4731854, 1102595, 5187125, 5045893, 2533, 780, 5753260, 6399754, 55466, 4186497, 2064623, 7356499, 6788470, 8126671, 3399735, 4316245, 3647992, 5165620, 718395, 3344730, 6923220, 5074622, 6988651, 3845079, 6216376, 7529001, 824698, 7368322, 7164420, 5266438, 7522673, 6704243, 4372588, 7711039, 1082233, 7311030, 4554571, 5191674, 7979624, 8136653, 6618871, 6397920, 6942207, 1959986, 4338516, 794803, 2754495, 7590618, 5997063, 3660239, 2367444, 553152, 270708, 4580462, 6214482, 644770, 6296164, 3442395, 7533651, 515447, 5281429, 2690155, 1493762, 2786184, 4926646, 557862, 4697319, 3012989, 2807563, 6679147, 1858419, 6708237, 7984914, 6757997, 2467707, 952073, 5918700, 2095586, 3177263, 6247482, 6921127, 7848902, 1555412, 1989019, 5449228, 6151124, 4004716, 2664192, 7438908, 7240248, 848233, 7276457, 5631274, 1057733, 5895515, 6644964, 3157923, 140187, 4254865, 3786967, 6528558, 401552, 1942928, 4094701, 7233756, 6646730, 2109407, 1690082, 6387808, 731468, 7978863, 4077124, 4637795, 940602, 207523, 1421870, 5746723, 276151, 3998737, 3480550, 4564234, 4421463, 307868, 7777777, 6231509, 6043057, 5019785, 44772, 6749828], -[7386307, 1379258, 676829, 8241592, 1244323, 446804, 804254, 6811871, 2867796, 3598417, 3145398, 4726293, 5180912, 1630966, 2551279, 7254244, 7931307, 3624077, 4380050, 8264023, 5099033, 3238238, 7312518, 2047095, 1897019, 870330, 7343678, 4287883, 6198880, 1546735, 1559744, 3108970, 7658528, 6548461, 763687, 5432056, 5431432, 986174, 2614419, 7769829, 8150699, 3488595, 2864195, 3705473, 988346, 55858, 7979988, 8202064, 536417, 4722319, 5641463, 3588638, 457143, 398757, 4953716, 3151729, 6649316, 5403874, 5134630, 4211342, 2565980, 3466276, 6749183, 5717125, 5014772, 6663686, 2062539, 8054320, 6449034, 621165, 4919990, 7579844, 4714552, 5790876, 7670692, 8311418, 7944465, 263909, 1207492, 1516985, 8090345, 4165843, 5872260, 7947950, 3121854, 1131567, 3251689, 5367558, 2067786, 8248401, 4908800, 3704766, 5642508, 2966371, 5352836, 84207, 7770952, 6205239, 1374440, 4526034, 7110631, 7798831, 1794882, 6630557, 5141216, 6390779, 2410915, 4410403, 1815795, 7590988, 4548002, 488486, 3174710, 6671255, 6978001, 560543, 7110392, 1158792, 7478177, 1271888, 6887485, 1646538, 2811147, 7922597, 6398021, 3561394, 5821017, 3984567, 6500217, 3392063, 2486688, 4501875, 2124286, 7072198, 3608821, 554831, 3553932, 8104851, 5961245, 2847556, 6514890, 5675908, 2079225, 5424898, 7821788, 2030447, 7006307, 5567338, 7865760, 7889844, 5067046, 3545189, 3693168, 7902753, 7056108, 1158106, 2888269, 6698116, 4462748, 2112875, 2440095, 7456827, 4181188, 757011, 6975622, 4700388, 4981669, 541295, 8051388, 4781639, 528844, 2295913, 4565148, 3277808, 716370, 3142574, 5718023, 2218786, 624774, 3194419, 7405256, 95017, 5209340, 1902114, 4356676, 169865, 6659150, 1515691, 5103827, 7338933, 2944651, 606527, 880086, 2484372, 5686183, 3988914, 2618389, 6996715, 7057720, 7547250, 5561468, 1138994, 1695840, 8326338, 2590072, 3623275, 4656064, 3921766, 3745922, 4865649, 6962628, 3552925, 2741436, 1890444, 5319301, 7230350, 5537962, 5364182, 5865619, 1210969, 4479752, 252073, 1406044, 4056591, 5342275, 1453051, 251271, 1355358, 71195, 5175466, 7430060, 5991216, 4830471, 2612603, 4522290, 346246, 7137716, 3195316, 7148951, 5843975, 1577286, 187530, 5045659, 6760122, 6614964, 3327813, 6743305, 5783057, 4366313, 6813733, 1905890, 8180946, 4393461, 7974498, 23493, 6510078], -[2434900, 3798566, 3376271, 1953701, 6676207, 5868056, 2055634, 7123189, 5284801, 3631581, 3668357, 3398740, 7589662, 1082204, 5798589, 3182027, 1630066, 2313434, 6506223, 619768, 3273198, 1560389, 3841851, 5276819, 1386282, 2030856, 6808668, 3425259, 4862242, 2631912, 1671669, 3226128, 1474867, 5496764, 1107292, 167768, 2882007, 958430, 5021020, 8053168, 5450904, 1461781, 7882194, 2921175, 6801961, 2659965, 7091037, 2726044, 4285669, 3502117, 3751791, 5689664, 5551458, 3585846, 3442925, 1905869, 2448734, 638864, 2802696, 1676371, 3724013, 3809731, 2293880, 1086434, 2542750, 1033756, 1021976, 8308317, 6921547, 8108113, 3873340, 4505634, 3028517, 7984425, 1535424, 5331983, 3946276, 5472663, 3825515, 4235412, 4853978, 584397, 28610, 173862, 1855743, 1588581, 3574600, 6864399, 1038584, 900426, 7577673, 7581819, 7435695, 5267042, 4179829, 666369, 3800415, 4964526, 6421813, 5659951, 6501765, 2974457, 2188710, 7724602, 2196384, 1664779, 4711579, 7462237, 869454, 7109616, 6495888, 8269731, 3824820, 144732, 7655145, 5285692, 7196607, 991770, 3289521, 1836340, 1423993, 530299, 2691526, 1082718, 712168, 1800120, 3748868, 5625102, 2942270, 691778, 223180, 4128394, 4450810, 5930083, 5264628, 5488184, 4131950, 7507199, 1266319, 4652565, 4197940, 2515415, 4698091, 8335560, 460081, 118480, 626306, 715270, 2069556, 1417045, 5387602, 5946205, 7860436, 7781887, 8043205, 1039085, 6011584, 4504946, 1727567, 5214558, 385738, 7774456, 7506202, 293129, 8254200, 987225, 5267997, 5528505, 8374025, 7176889, 3492097, 216153, 544980, 315023, 6407868, 4143020, 284510, 576825, 7653063, 4877469, 914484, 7607493, 401618, 6387361, 6016924, 1297886, 358281, 7118600, 2716165, 4337418, 6052836, 3979683, 3541522, 2081655, 1061549, 4731608, 347443, 1320671, 1523193, 3941260, 6160135, 3231417, 5532001, 7585393, 10610, 735189, 6289554, 5651815, 2177521, 8320004, 3702100, 185447, 7708711, 486816, 7020560, 4931945, 4916199, 4144419, 8311018, 4012260, 8022533, 562061, 5013010, 7318858, 7630476, 401816, 1033247, 2882170, 2944399, 6846491, 6276053, 6256876, 7896483, 6278828, 898156, 5198588, 4360333, 3784628, 8193490, 1819136, 3989623, 2678738, 1965077, 6047235, 261892, 455805, 3111353, 6663479, 3520337, 1155576, 5545023, 1742838, 6669363, 87926, 8300433, 4931814]], -[[8187837, 6379403, 2173589, 2600248, 2866964, 6403163, 2811043, 6019308, 2194728, 7159578, 6810241, 3492279, 4448090, 7619833, 6011331, 5323808, 562206, 7712254, 2532978, 7842816, 1821781, 5446239, 4474567, 2988436, 7643147, 1446806, 7785746, 7016849, 3013611, 2761989, 1908562, 5755825, 7859242, 643883, 6383259, 6106476, 7899169, 4922562, 5726236, 5642215, 6746425, 6070851, 7802714, 5013967, 5445084, 5453238, 5975506, 921480, 8073248, 7659294, 5204296, 2771305, 413105, 3845131, 978790, 1356011, 6812917, 4975603, 6909716, 1828431, 846978, 2456582, 1635671, 5600350, 5755312, 4378902, 3795358, 4878226, 5686002, 4653415, 6352908, 2603143, 4684206, 3744063, 2080459, 4723764, 5042936, 1960477, 2572620, 6357056, 3240844, 7856195, 3859400, 6842347, 4040874, 6430235, 8062807, 2168963, 6428689, 7647913, 1224211, 2085657, 6025986, 7394557, 1116478, 3839805, 3434036, 3749348, 6779124, 7990323, 617575, 7042825, 5861180, 7296146, 4646285, 2658334, 2150828, 2524517, 6510397, 7798597, 2461585, 512108, 2747928, 1826782, 1964397, 5261949, 4770719, 1303612, 2141583, 82378, 757086, 2472302, 1682345, 3350197, 8356049, 5367042, 3804881, 4595729, 6341012, 7085856, 3086256, 5317011, 4429223, 7265660, 833888, 4523844, 681146, 3801776, 2599067, 3941570, 3745797, 1871114, 470910, 4101801, 2383412, 2934171, 1065669, 1536064, 7046251, 7731418, 6530465, 1981650, 7906289, 4675528, 4099628, 3487335, 3418978, 3702177, 4395443, 5957172, 3565819, 5950722, 5781540, 6325176, 1431313, 2741875, 618583, 373271, 6612419, 416583, 7471913, 2219721, 3681653, 6197922, 2214436, 1302353, 7736300, 2901670, 2548995, 2865031, 8315268, 4461481, 2242162, 7302840, 4719293, 5054504, 2915472, 8166945, 7656257, 5783318, 6171134, 5905156, 5839870, 6439012, 7123804, 5514283, 2470276, 2423879, 1872612, 6155349, 4968025, 41251, 1559118, 6199596, 2725486, 7059018, 1729131, 5034684, 5496931, 7171417, 4363637, 4702456, 5038379, 8032329, 6407461, 585911, 7883756, 6838450, 6433835, 4061443, 7244186, 365128, 5196907, 6615155, 7187022, 2051202, 3126582, 3845405, 7845407, 5725007, 2849585, 3966771, 5437766, 3494104, 1490517, 7569880, 1130825, 2154606, 2513140, 7319465, 7382845, 4385189, 2957877, 3322913, 1713992, 3310478, 7048977, 4742078, 6550044, 2274070, 7225541, 5089799, 6373855, 3444199, 7051598, 8110102], -[4253518, 7662918, 4114508, 7801340, 405692, 28913, 3946824, 8256773, 79705, 7800304, 1276253, 1139422, 4778725, 6469836, 780489, 1826302, 157311, 4112780, 1475439, 6435674, 3668018, 2563727, 2623612, 3406837, 1252277, 4577991, 1600027, 6916166, 6392032, 5039103, 3181669, 3928641, 4361855, 3755824, 3305638, 2362782, 8158271, 1639762, 4680707, 5991935, 6384478, 1676328, 3459933, 1473617, 7755639, 5945105, 3850075, 4941644, 6365155, 1024691, 2305984, 7093251, 7684000, 616639, 7346158, 881320, 4492872, 1123045, 2290342, 6487427, 7651092, 2735082, 8000749, 2907928, 6442076, 599230, 862870, 8223863, 3765878, 8227579, 2088793, 1715129, 2153719, 1017416, 7864577, 7750107, 5129555, 2508115, 105388, 2988945, 1195800, 1630002, 6525948, 198779, 2624236, 6847157, 4831526, 8102789, 2497325, 583208, 7920822, 4493397, 272517, 1945926, 3580, 3666334, 6589672, 236791, 2300522, 510220, 6211167, 5649786, 3515856, 1760959, 3208456, 5533998, 8066708, 6571, 7060440, 2959165, 3405084, 2760704, 4264946, 2833162, 2504381, 475265, 359601, 4070009, 1255872, 3159147, 3197916, 8077040, 7992344, 3569032, 1910312, 3684163, 2987043, 5328668, 5666232, 8070587, 8046626, 2284948, 4210580, 4770003, 1453654, 7066497, 6154446, 4673876, 239548, 4905629, 5583956, 3706147, 7332245, 7269814, 7450975, 4437585, 4096270, 2992488, 5976500, 528336, 8116764, 7656649, 3866725, 7703037, 8109523, 1730816, 7227134, 3969107, 8128030, 8305651, 5381849, 5884277, 8115677, 737127, 4890267, 6545900, 2164346, 3644657, 4002420, 6341736, 7856383, 5249793, 324479, 6516645, 7602941, 937608, 3651443, 3611763, 2932032, 3089964, 4312785, 420305, 6674455, 7019178, 2482924, 8359701, 8139390, 8277689, 1302957, 893071, 7093334, 2264782, 4342173, 7806076, 6810526, 8350253, 6492149, 4127326, 3617705, 6612338, 3865666, 1271189, 1198042, 2958575, 4251042, 122136, 5914618, 1133993, 2180602, 3965385, 5726315, 5046657, 6236915, 1276392, 2128828, 3026007, 6250796, 5337251, 2164908, 5753225, 5149817, 1862263, 4927667, 7888202, 6681349, 8229142, 6528755, 6449304, 841305, 647968, 7374925, 703053, 648055, 4004488, 6804112, 714384, 4362418, 3884967, 6082142, 5549784, 6469197, 4746217, 5996044, 5402545, 1398409, 6384831, 5061198, 1668626, 7950771, 3051552, 3705674, 331406, 5095829, 8194150, 6779334, 3045952], -[8076424, 4374323, 1332547, 2385778, 189403, 1893282, 8335790, 3542929, 1738063, 5128874, 6473638, 7124537, 1951861, 84412, 3447547, 7754231, 4893534, 3788366, 6527856, 7660545, 4331834, 144222, 1248533, 5122656, 7556632, 3289749, 27116, 6622017, 2617217, 2225824, 72246, 4911759, 4670029, 3796250, 5699224, 490645, 1318778, 6101370, 6842959, 8008990, 7682950, 7313768, 2854954, 6787490, 6511912, 1927395, 1288817, 343853, 5986155, 6236866, 7119865, 3691968, 3582786, 7803899, 6723856, 4870194, 5957409, 7682142, 3912028, 3509308, 413478, 6574358, 1078161, 1800944, 5551836, 3869990, 6513227, 3114454, 2111092, 4437005, 1880533, 7617853, 4609070, 305334, 5398449, 5956671, 6479043, 6519750, 1742715, 4684772, 100399, 9929, 2302926, 2831031, 2992262, 169248, 5753369, 701445, 1129094, 711785, 8103501, 2484482, 5699143, 7706179, 1278466, 7283808, 7146735, 3337949, 6225802, 960628, 28640, 5235018, 3481949, 978403, 7972291, 5328426, 59610, 7756189, 2835548, 6497, 7769742, 313187, 1216754, 7062710, 7172572, 6092532, 5531608, 5578506, 325548, 2559339, 3876618, 6776676, 970146, 7321815, 1501344, 6357637, 532273, 3377559, 7405523, 5835967, 5080569, 6715366, 563759, 6250555, 5483783, 4318053, 6328137, 4282076, 3134985, 2909706, 5929977, 7066274, 7142018, 869346, 1493887, 4766440, 2837215, 4002878, 2957607, 7918486, 3769481, 4086091, 7266390, 3685302, 1606635, 2396976, 586133, 4555270, 6343297, 3831859, 3280449, 2448056, 160330, 1759502, 8379096, 4904682, 1154043, 2869687, 912028, 8053066, 1487799, 2231750, 717413, 221488, 1621181, 6941071, 4523652, 6038137, 2616724, 7826719, 4277994, 3492032, 7614875, 6426563, 3061090, 5795789, 2339496, 693157, 1718124, 6820144, 3124465, 7054195, 6231882, 7918439, 8091610, 2189611, 7406934, 7092667, 3536836, 4732329, 2410802, 7509133, 1547452, 5876473, 7151824, 5974629, 5682239, 7131127, 7200249, 5453534, 6092680, 5250359, 3290066, 5605335, 5734433, 335554, 1152000, 3620120, 627321, 1367477, 4902462, 4792965, 7501415, 844824, 5854358, 6983534, 5547838, 1370136, 2223801, 3082317, 3533866, 8145766, 4885340, 2844844, 2003950, 7935593, 2438514, 6204978, 8093498, 311491, 177919, 6163354, 801957, 4082131, 7367577, 5748131, 6961647, 6392969, 1036809, 1918482, 5635069, 3478098, 6555565, 2636000, 606712, 7103276], -[4315109, 6215373, 8316044, 7935864, 8350855, 4438923, 4067859, 5715190, 5835796, 6256065, 3117085, 1399465, 1567242, 39362, 4146744, 520388, 7893782, 6452636, 431924, 7880616, 1709641, 6113165, 6702449, 6862489, 4558108, 6005513, 7613112, 4922317, 4207220, 4281399, 5103929, 5220774, 2771281, 5905357, 1827187, 7909850, 5890565, 7021370, 4631205, 1287100, 7150914, 7473657, 1324136, 6946726, 1642581, 5952824, 7611242, 7229573, 1623148, 5849562, 4931806, 6054121, 2135461, 1580408, 750087, 5963863, 5807313, 6232421, 1116633, 527285, 2902105, 5240879, 2266075, 6940042, 4961750, 1667664, 211973, 4574333, 5643004, 3214951, 7286168, 4491899, 7260554, 6482877, 5521731, 2559686, 3157776, 5376433, 8359775, 7555254, 6892641, 703927, 3211504, 875200, 1189181, 7580581, 6931969, 2283918, 2766401, 2164977, 4840544, 2516637, 6589765, 2129518, 2655871, 500453, 1451779, 3275042, 5399005, 7137294, 8349931, 856724, 1663318, 3346712, 7576898, 1859503, 4852078, 3723377, 3514158, 2019909, 8102965, 5783363, 5514530, 7183990, 4519744, 1870855, 7211994, 3266922, 2639240, 3353327, 8029705, 4333654, 5895651, 2904081, 3523815, 4299810, 2370992, 2441104, 5119991, 7123868, 7649986, 4651715, 2515757, 7138607, 6411412, 2530027, 2929711, 1663192, 1039761, 2756364, 6898730, 6467687, 999083, 1083676, 6777553, 5357007, 912928, 1534974, 1109887, 3067431, 6347331, 402977, 7065759, 7287628, 7174104, 7410844, 4190755, 4000606, 4844876, 640018, 5576717, 3061168, 3260601, 5352182, 3328256, 647870, 7921598, 5697308, 4370033, 594255, 5903141, 5566164, 1102883, 321350, 7499056, 3650051, 6135457, 6266049, 4876207, 5561767, 1533177, 3270642, 7305442, 1656204, 5869976, 7557437, 3376202, 2248905, 6366497, 305839, 4733686, 7889559, 7070705, 5829791, 4569069, 4112463, 5217212, 3451057, 2558787, 4639449, 1626800, 3310025, 2903215, 1256192, 6466330, 189903, 2655709, 2191514, 5134001, 5296706, 3238435, 2501268, 502033, 3856826, 6844773, 6945047, 4607268, 6335183, 3673315, 3570540, 2572617, 6640037, 6422699, 94512, 5754440, 4342108, 5312934, 5080243, 6853, 7676134, 5718824, 752542, 4727293, 5616446, 4150687, 5033829, 8143484, 165204, 7853039, 5835353, 4647973, 5115427, 4428956, 2338034, 7540552, 455610, 2693628, 1049318, 4747379, 6573914, 7306896, 7970265, 7232117, 3260641, 3686054, 6818729], -[6330211, 6233563, 2514758, 2371630, 4743218, 1212502, 4148355, 2265497, 5584901, 6448812, 4781764, 3399792, 7432249, 3088046, 5855212, 2769493, 494029, 549387, 6625994, 5577766, 1687390, 970169, 7929970, 5348871, 58838, 1585912, 1782023, 6974962, 6000138, 4700540, 1056554, 3284607, 4088881, 4401060, 4756202, 3770154, 1657904, 7075728, 4928806, 4263320, 7169946, 8001091, 3757128, 3360686, 7559013, 4035598, 99621, 96008, 2504393, 608086, 4493813, 4702740, 1150731, 1628671, 7711437, 836368, 1172049, 7886179, 6349983, 4964028, 7624853, 7282956, 7482503, 2255801, 5207801, 4496869, 999039, 4908708, 7593692, 1505115, 7759111, 5761142, 5475907, 4944072, 934112, 1099447, 7088858, 4829679, 2309818, 4767917, 1601173, 5970905, 2811884, 1971253, 7918309, 6247468, 2240428, 5068568, 4156255, 106542, 5601507, 5008570, 5267196, 427149, 7357355, 6378748, 2086103, 2479322, 5827292, 6482612, 8100508, 6749188, 3591140, 1882419, 482888, 2176652, 4788632, 4123191, 7560831, 5089753, 209643, 1595891, 4331119, 1951703, 5092083, 4532179, 7162489, 1951250, 2133953, 3264996, 2062903, 1507723, 3326997, 6033018, 5246967, 5278643, 2143250, 6295629, 1170997, 5957457, 2513010, 540821, 2134967, 6206181, 1813815, 4964543, 4212877, 5312462, 7874798, 3306412, 2234436, 6276842, 7956356, 4915885, 5211781, 3622056, 4857734, 4240258, 6237538, 2088185, 981200, 6449051, 5524747, 833377, 2449754, 5037824, 1344389, 7448739, 1262786, 6857116, 7276762, 5959055, 1332558, 613190, 6186203, 7647230, 92029, 4651123, 6230573, 4821414, 3189347, 4973578, 7688352, 2186614, 6918762, 55358, 4300957, 6145274, 7997842, 631452, 3837933, 7405530, 4289622, 7827469, 5738840, 4105172, 895305, 8237924, 1725102, 6087720, 5761887, 5873485, 6756455, 2746602, 3190012, 2670519, 5847156, 713505, 5241471, 7968520, 7950533, 3590373, 1045524, 1940170, 431775, 1200555, 5434544, 2800567, 3690411, 4436835, 24172, 1232848, 2867671, 7686600, 7523712, 4150161, 4454850, 297567, 5968300, 1863560, 1673540, 2053876, 4767201, 7152623, 3420177, 1374707, 8053512, 4065077, 2417032, 8253914, 6496900, 6772209, 3090929, 3794538, 3641492, 3017177, 3583623, 3566219, 1367747, 7242862, 2357697, 3148102, 2784456, 1375455, 1706363, 910495, 2901642, 8067151, 63597, 6025069, 5172778, 461998, 6228996, 1908066, 878461, 4080959]]] -s1: [[-1, -2, -1, 0, -1, 3, 0, -4, 1, 3, 1, 2, 2, 2, -1, 2, 4, -4, 2, 1, 4, 3, 4, 0, 2, 3, -2, 4, 2, 0, 4, -2, 1, -4, -2, -3, -4, 3, -1, -4, 4, -1, -3, 3, -2, -2, 0, 1, 1, -3, -1, 3, 4, 3, -4, -2, 1, 1, 1, 1, -2, 2, 4, 0, -4, -3, -4, 2, -2, -3, -1, 3, 2, 1, 3, -1, -3, 2, 0, 2, 4, 1, 1, -1, -4, 1, 1, -1, -1, 1, -2, -3, -3, 0, 4, -1, -1, -2, 0, 3, 3, 3, -1, 1, -4, 2, -2, -4, 3, 0, 0, 2, -3, 0, 0, 0, -4, 3, 0, -1, -1, -2, 0, -2, -2, 2, -4, -1, 3, 2, -3, -3, -1, -4, -4, -2, 3, 3, -4, 1, 4, -1, 2, 4, 1, 3, -4, -2, 3, 0, -2, -4, -3, 1, -1, -4, -3, 0, -2, 2, 0, 3, -4, 0, -2, -1, 0, 0, 4, 2, 2, -3, 0, -4, -2, -4, -3, 1, -2, 0, -3, 2, 3, -1, -2, 3, 2, 4, 2, 3, 0, 0, -2, 1, 0, 2, 2, -3, -3, 4, 0, -2, 2, 1, -1, -4, 2, 0, -3, 3, -4, 3, 4, 0, 4, 3, 2, 0, -3, 3, -1, -3, -4, 3, 3, 0, 0, -2, -4, -1, 3, -1, -4, 0, -4, 4, -3, -2, 4, 3, 0, 1, -1, -4, -3, 4, 3, 1, 1, -1, -4, 2, 2, 4, -1, -3], -[1, 1, 1, -2, -1, 2, 0, -1, -1, 0, 2, -3, 2, -3, -3, 4, -2, 2, -3, 1, 1, 3, 1, -1, 1, 4, 3, 4, -2, -4, -3, 4, 2, -1, 0, -4, -2, 0, -1, 3, -4, -1, 1, -1, 3, -2, 2, 3, -1, 1, 2, 4, 2, -3, 3, 2, -1, -4, -1, 0, 3, 4, -2, -1, 0, 2, 4, 4, 0, -4, 1, -1, -4, 0, -2, 2, -3, -4, 4, 0, 3, 3, -2, -4, -2, 1, 2, 0, 3, 1, 4, 1, 3, 3, -2, 2, 4, 4, 4, 4, 1, -4, 0, 4, 3, -3, -1, 3, -4, 2, 0, -1, 1, -3, 4, 3, 1, -1, 0, 4, -4, 0, 1, -2, -3, -1, 1, 0, -1, 0, -3, -2, 0, 3, 3, 3, -3, 0, -2, 1, 0, 4, 2, 0, -4, 1, 3, 4, -2, 1, 3, 4, -3, -1, -4, -1, -2, -1, 2, 0, -4, -1, 0, 3, -3, -2, -2, -1, 1, 1, 4, 2, -2, 3, -2, 0, -1, 4, 4, 0, 3, -3, -4, -2, -2, -2, -1, 4, 1, -3, 2, -2, 3, 3, -1, 3, 4, 3, -2, -3, 1, -2, 0, -3, 1, 3, -1, 1, -3, -3, 0, 3, 4, 2, -1, 4, -1, -1, 0, 3, 2, -4, -2, 4, 2, 1, 2, -4, -1, -3, 0, 0, 0, -4, -2, -4, 2, -4, -4, 4, -1, 3, -3, 2, 4, 1, -4, -2, -4, -1, -4, 3, -1, -2, 3, -4], -[-4, 1, -4, -4, 0, -3, 0, 2, 4, 3, 1, -3, -1, 1, -4, -3, -3, 0, 3, -4, -1, 0, -3, -1, -3, -1, 0, -4, 3, -1, 0, 4, -3, -4, 3, 0, 0, 1, -4, -4, -2, -2, 4, -2, 2, -2, 1, -2, -4, 0, -2, -3, 4, -4, 3, 4, 0, -2, 1, -2, 4, -3, -2, 3, 1, -4, 0, -2, -4, 4, 4, 1, 2, 1, 3, 3, -3, -2, -2, -2, 4, -2, -2, -3, -2, 1, -3, 1, 4, -4, 1, -4, -2, -1, 0, -3, 4, -3, -3, 3, -3, 4, 3, -1, 4, -2, 1, 0, 2, 3, -3, 1, -2, -4, -3, 1, -2, 4, -1, -1, 4, -2, 0, 0, -4, -1, 1, 2, -1, -1, 3, 3, -3, 0, 4, -2, -4, -3, 2, -2, 2, -3, 0, -4, -1, 0, 0, -2, 3, -2, -1, -1, 0, 3, 4, -1, -4, 2, 2, -4, -3, -3, 0, 3, -4, -4, -4, -2, 3, -1, -2, -1, 3, -1, 0, -4, -2, 3, -1, -1, 2, 4, -1, -1, -1, 1, 3, 3, -2, 3, 1, 3, 1, 3, 4, -4, 2, -3, 3, 2, -4, -2, 0, 4, 2, 4, -3, 4, 3, -4, -1, -3, 3, 0, 2, 1, 4, 3, -2, 2, 4, 3, 1, -1, 2, 1, -3, 1, -1, 2, 1, 3, -4, -1, -1, -4, 4, -2, -4, 0, -2, -2, -2, -2, -2, -3, -2, 1, -1, 4, -1, 3, 0, 1, 4, 4], -[-4, -2, 4, -2, -2, 1, -4, -3, -3, 3, 1, -3, 1, -1, 1, 2, 1, 4, -4, -1, -1, 0, -1, -4, -4, -1, 1, -1, 2, -4, -1, -1, 3, -2, -1, 0, -3, -4, 2, 1, 3, 1, 4, -3, -2, 2, 3, -1, 2, -4, -2, 3, 3, 4, 3, -2, 0, -1, -1, -3, 3, -2, 0, 1, -1, 1, -1, 0, 2, 1, -1, 4, -1, 2, -2, 1, -2, 0, 4, -1, 4, 1, -1, -3, 2, 3, 1, 0, -1, -3, 3, 4, 1, -2, -4, 3, 3, 1, -2, 0, 0, 2, 1, 2, -3, 2, -3, -3, -2, -2, -4, 1, 3, 4, -3, -4, 0, -4, -2, 2, 2, 0, -4, 0, -3, 1, 4, -4, -3, -3, -3, 0, 0, 0, -1, 0, 4, 1, 1, 1, -3, -1, 1, 0, 0, -4, 2, 4, 1, -1, 2, -3, -1, 0, 1, 1, -3, 4, -4, -2, 3, 3, 3, 0, 3, -1, -2, 2, 2, -1, 1, 2, 4, 2, 4, -4, 1, 3, -3, 4, -2, 1, 2, 3, 2, 2, -2, 1, 2, 0, 3, -2, -3, 1, 1, -2, 4, 4, -4, 1, -4, 0, 3, -2, 1, -4, 3, 1, 0, 1, 2, -2, 1, 1, -1, 4, -1, 4, 4, 4, -1, -3, -2, 3, 0, -2, -4, 3, 4, -1, 2, -2, -1, 4, -3, 3, -4, -1, -4, -2, 0, -3, -1, -1, 0, 1, 3, -1, 1, 0, 4, 1, -4, -2, 2, -3], -[3, -4, 3, 3, -4, -4, 4, -2, 3, 4, 1, -2, 4, -1, -3, 1, 3, 3, -2, -4, -2, -2, 1, 1, -4, 2, -4, 3, 1, -4, 4, 3, 1, -4, -3, 4, -1, 0, -3, 2, -2, 1, 4, -1, 2, -3, 3, 4, -1, 4, -4, 3, -3, 2, -3, 1, 2, 2, -3, 1, -1, 2, -4, 1, -2, -1, -1, 1, 4, 1, 2, -1, 3, 3, 2, 4, 3, 0, -4, -3, 3, -2, -4, 1, -2, 2, -4, -1, -3, 1, 0, -3, 1, -4, 4, 3, 1, 0, 0, -1, 3, -4, 1, 3, 3, -2, 2, -3, 4, -2, -2, 2, -4, 0, -1, -4, -1, 4, -4, -3, -4, 1, 0, 4, -3, 4, 4, -2, 4, 1, 3, 2, 4, 3, 4, -3, -4, 3, 3, 2, 0, -3, -2, 4, 3, -4, -1, 4, -4, -2, 4, -4, 2, 1, 1, -2, -1, -3, -2, -2, 1, 0, 2, -4, -2, 2, 4, 0, 2, 3, 3, -4, 3, 3, 4, -2, -3, 0, -1, -4, 1, 4, -4, 2, 1, -4, 0, 0, -2, 2, -3, -2, 3, 0, 2, -3, 2, 2, -3, -2, -4, 4, 4, 1, 0, 4, 2, 1, 3, 2, 4, -3, 0, -1, 4, -1, -1, -1, -3, 1, -1, -2, -4, 2, -2, -4, 4, 2, -1, 2, -1, -2, 2, 0, 0, -3, 4, -1, 0, -2, 0, 3, 2, 3, -3, -3, -4, 1, -1, 2, 3, 3, 0, -4, -2, -3]] -s2: [[3, -2, -1, -4, 3, -2, -3, 0, -3, 1, -4, 0, 4, -4, -3, 0, -4, 4, -4, -1, 4, -4, -4, 3, 0, 2, 2, 3, 0, 4, 0, -1, -2, 1, 0, 0, 3, 2, 4, 1, 3, -4, 0, 3, -2, -1, -1, -3, -4, 2, 1, 0, 4, 2, 3, 2, 4, -1, 1, 3, -3, -4, -1, -1, 2, -3, -2, -3, -4, 4, -1, -4, 0, -2, 2, -4, 2, -2, -4, 2, -4, 1, 2, 0, 0, 0, 2, 4, 0, -4, -1, 0, -3, -4, 1, 2, -3, 1, 0, -3, -3, 3, 1, 1, 3, 0, -3, -2, 3, 1, 4, 3, -3, 4, 0, 4, 1, -4, 3, 4, 4, 0, -4, -2, 1, -3, 2, 4, -3, -3, -4, 3, 3, -3, -2, 3, -2, 1, 1, -3, 0, -3, 0, -4, -1, 4, 4, -4, 2, 2, -3, 2, -4, -3, -1, -2, -4, -1, -1, -2, -1, -3, -3, 2, -2, -1, -4, 3, 3, -2, 3, -3, -2, -4, 4, -4, -4, -2, -2, 2, -2, -3, 1, 2, -3, -1, 1, 4, 4, 0, 2, -3, 4, -4, -3, -4, 0, 0, 2, 4, 2, -2, -2, 4, 0, 0, 1, 3, 2, 1, -3, 3, 0, -4, 4, 0, -1, -3, 4, 1, 1, 0, -2, 2, -1, -3, 4, 0, 3, 0, 1, -1, 3, -1, 2, 4, 2, 2, 4, -4, 3, 3, -3, 2, 2, -4, -1, -4, -4, -3, -4, 2, 1, -2, -4, 2], -[2, -2, 2, 4, -1, 0, 3, -1, 0, 0, 0, -4, 1, 4, 4, -4, -4, 3, -1, -1, -4, 0, -2, 3, 4, 2, 2, -4, -1, 4, 4, -1, 0, 0, -2, -1, 0, 2, 2, 2, 4, 2, -2, 2, -2, 4, 4, -1, 1, -3, -2, 4, -1, 0, 0, 3, -3, -2, 1, 2, -2, 4, 3, 2, 3, 1, 1, 4, -3, -2, 0, 2, -1, -1, 4, -1, 2, 4, -1, -3, 1, 2, 2, 0, -3, -1, 4, 2, -3, -1, -3, -2, -1, 2, -2, -2, 0, 0, -3, 4, 0, -4, 3, 2, 1, -1, -1, -2, -3, -1, 4, 0, 0, -4, 0, 3, 4, -1, 2, 3, -2, 0, -4, -2, -2, -1, 0, 4, -1, 0, 1, 4, 3, -3, -2, 2, 2, -4, -3, -1, -1, 0, 0, 0, -4, 3, 2, 2, -3, -2, -3, 0, 1, -4, -4, 0, 1, -1, 3, 1, 1, 4, 2, 2, 3, 2, 1, -1, -4, 0, -1, 4, -2, 2, 3, 0, 0, -1, -4, -1, 0, 4, 1, 1, 3, -1, 1, 1, 0, 2, 2, 1, -4, 1, -1, -4, 0, 0, -2, -3, -4, 2, 2, -4, -4, -1, -3, 3, 0, 3, 1, 4, 4, 0, -1, -2, 0, -4, -1, 2, -2, 4, -1, 4, 3, 2, 3, 2, -1, -4, 0, -3, 4, 4, 3, -1, 4, -2, 3, 2, 2, 2, -2, -3, -4, -1, 0, -3, -1, -2, 2, -4, 3, -2, 1, 2], -[1, -1, 4, 0, 1, -1, -3, 4, -1, 4, 2, -3, -3, -2, 1, 1, 1, -4, 0, 0, -4, -4, -2, -4, -3, -3, 0, 1, 4, 0, 3, -2, 0, -3, -3, 2, 0, 3, 2, 1, 3, -4, 2, 0, 1, 1, 2, 1, 2, -1, -2, -2, 1, 1, -3, 0, 1, -2, 3, 2, -4, -2, 2, 1, -4, 0, 3, 4, 4, 2, -3, -1, 2, 0, -2, -1, -4, 0, 3, -1, -2, -4, 0, -3, 3, 3, -2, 2, 0, -4, 2, 4, 1, 2, -2, 1, -2, 2, -4, 2, -1, 0, -4, -3, -2, 1, 4, -1, 3, -4, 1, 3, 2, -1, 1, 4, -4, 1, 1, -4, -3, 3, -4, -1, 1, -1, 3, -4, -2, -3, -2, -4, -4, -3, 0, 1, 0, 3, -3, -2, 1, -1, -4, -2, 3, 2, -4, -4, 3, -3, 1, 1, -3, -3, -2, -2, -1, 3, -2, 4, 0, -3, -3, -3, 4, -1, -3, -3, 2, -3, -4, 4, -3, -4, -4, -4, -3, 0, 2, -1, 1, 2, -2, 3, 3, 4, -4, 1, 4, -4, -3, 0, -1, 3, 2, -3, -1, -4, -1, 1, -4, -3, 4, -2, 1, 2, -2, 2, -2, 4, -2, 0, 2, -4, 4, -2, 3, 2, -4, -4, -3, -1, 2, 3, 4, 1, 2, -2, 3, -4, 0, -2, -4, -3, 2, 3, -2, 4, 1, 2, 2, -3, 3, -4, 2, 3, -2, -4, -2, 1, -2, 1, 3, 3, 0, 4], -[-3, -2, -3, 2, 4, -4, 4, -4, -3, -1, 2, -3, 0, 4, 2, 0, -3, -3, 3, -2, 2, 1, -4, -3, 4, 3, -3, -2, 3, -3, 1, -2, 2, -1, -4, 0, 1, -4, 3, -2, -2, 4, -3, 2, 1, 1, -1, 2, -4, 3, -2, -2, -1, 4, -2, 0, -1, -4, -1, -4, -4, -3, 4, 0, -1, 0, 0, -3, 4, 2, 0, -1, 4, 2, 1, 2, 0, -1, 3, -1, -1, -1, -2, -3, 1, -1, -3, -3, -1, -4, 4, -3, 0, -4, -4, -1, 2, 2, 0, 0, 4, -1, 0, -4, -1, -2, 1, 3, 4, -1, -1, 1, -3, 3, 0, 2, -4, -1, -2, 2, -4, 3, -2, 3, -1, -1, 1, 0, 0, 1, -1, 2, 1, 0, -3, 3, -2, 3, 3, -2, 3, -3, 3, 1, -4, 1, 0, 2, -3, 1, 2, 2, -4, -4, 1, 1, 0, 4, -2, -4, 0, 1, -4, -4, 4, 1, 1, 2, 3, 2, -1, 1, -2, 1, -3, -4, -3, 3, 1, 2, -2, 2, 1, 1, 4, 2, 0, 0, 4, -4, 0, 2, 1, -1, 2, -2, 2, -3, 1, 0, -1, 2, 4, -3, 2, 2, 3, -2, 1, -1, 3, -2, -4, 2, -1, 2, 4, 2, -3, 4, 0, -2, 1, 3, 4, 2, 1, -4, 0, 3, -3, -2, -3, -3, -4, -2, 2, 4, 3, 3, -4, 0, -3, -4, -4, 0, 0, -4, -1, -2, 3, 0, -4, 4, -2, 2], -[-1, 4, -2, 1, 2, 4, 0, -1, 4, 1, 4, 3, -2, -3, -2, 2, 3, 4, 2, 0, 0, -3, 0, 2, 4, 2, -2, -4, 3, -3, 1, -1, 1, 2, 3, -3, 1, -2, 2, -2, 4, 3, 0, 3, 2, -3, 0, 2, -1, -4, 3, 4, 1, 1, 2, -1, 4, 4, 1, 1, -4, 2, -4, 3, 4, -3, 0, 4, -1, -1, 0, -3, -4, -1, -3, -3, -1, 1, 0, 4, -1, 4, 1, 1, 4, -3, -3, 0, 1, -4, -2, 3, 0, -1, 2, 3, -4, -2, 4, 4, -4, -3, 1, -3, 3, 3, -3, -1, -3, 0, 4, -3, 3, -1, -1, 3, -2, 2, 0, 3, 2, 1, -1, 0, -3, 3, -4, -1, 4, 3, -4, -4, 1, 0, -3, 3, -1, -4, 3, 0, 2, -3, -1, -3, -2, 3, -2, 2, 2, 1, 4, 0, 0, 3, 1, -3, 2, 1, 4, 3, 1, -4, 3, -4, -2, -1, -4, -3, -1, -4, -1, -2, -1, 0, 0, -3, -3, -2, -2, -3, -3, 1, -4, 0, 0, -3, 4, 1, -4, 0, 4, 4, 2, -2, 4, -2, -3, 4, 1, 0, -4, 1, 1, -2, 0, 4, 1, -4, -1, 4, 0, 2, 3, 2, -4, -2, 0, -4, 3, -3, -4, 2, -4, 0, 3, -1, -3, -1, -4, -3, 0, -1, 4, -2, 2, 3, 2, -3, 3, 0, -3, 1, -2, 1, 4, -4, 2, 3, 4, 1, 3, 1, 2, 1, -1, 4], -[4, 3, -1, -3, -1, 1, -3, -1, -3, 0, 0, -2, -1, -1, 3, -2, 0, -4, 2, -4, -1, 2, -2, -3, 3, -3, -3, 2, 4, 3, 4, 0, 4, 0, 4, 1, 4, -1, -4, 3, 4, 2, 1, -1, 1, -2, 0, -1, -2, 0, 3, -2, -4, 3, 2, 0, -3, 1, -3, 3, 2, -4, 4, 4, 1, 1, -1, -4, 4, 2, 0, -2, -1, 2, -4, -2, 1, -2, 0, 2, 4, -1, 2, -2, -4, -3, 0, -3, -4, 1, 1, 0, 4, -2, -3, -4, 4, -2, -2, 3, -2, -3, -3, 0, -1, 4, -4, 2, 2, 3, -1, -3, 0, -2, 0, 1, -1, -4, 3, 4, 4, -1, 4, 1, 4, 0, 2, -2, 2, 3, -4, 1, -1, 1, 0, -2, 2, -1, 0, 0, 4, 4, -1, 4, -1, -1, 1, 1, -4, 0, 0, -1, 0, -4, 1, 4, 0, 4, 0, -4, 4, -2, 4, -3, 2, -1, -2, 2, 2, -3, 4, 0, 4, -2, 0, 4, 2, -4, -1, -1, 3, -4, 2, 4, 0, 3, 3, -3, 1, 0, 1, -1, 1, -2, 3, -2, 3, 3, -4, 3, 0, 0, -3, 3, -1, -4, -4, -2, 4, 1, 3, 0, 3, -4, 4, 0, 4, 2, -1, 3, -1, 0, 4, -3, 0, -3, 1, 0, 4, 1, 1, -1, -3, 1, 2, 0, 3, 3, -4, 1, 1, 4, 2, -2, 2, -3, 2, -2, 3, 3, 0, 2, -4, 3, -3, 0]] - -s1Hat: [[4742810, 5480085, 3608963, 3572361, 2496000, 2560487, 1879108, 7694448, 4144377, 481365, 496577, 2004557, 699714, 16806, 4146884, 7783158, 6884497, 6641795, 4384217, 1947609, 998521, 7290413, 4072600, 5608672, 6631341, 2833450, 5897029, 165165, 1576227, 3659892, 900301, 5623437, 2181875, 1627946, 2727906, 3487624, 7508307, 5755376, 2864362, 2608896, 3258353, 2590830, 4237257, 4174680, 7179975, 1460909, 5979467, 1474464, 6760411, 6303748, 8201639, 6894863, 3112627, 6910164, 1508457, 6473353, 1943579, 1463737, 1359400, 2902378, 8178643, 4317241, 6685413, 8026163, 3301660, 7044457, 3439009, 5744555, 6152722, 3014283, 6058961, 8365038, 399666, 2119299, 3396852, 7022737, 3008383, 315350, 6501458, 3387653, 6625409, 4606020, 1131561, 2151472, 5803074, 3841116, 8123727, 5508007, 6412910, 2055109, 2322296, 8285823, 8300747, 3489835, 3811394, 1143352, 2868638, 6972554, 1492157, 7716486, 5371524, 4686843, 1085263, 2473126, 5877038, 1497798, 600354, 4608458, 7702667, 7433639, 125544, 5323574, 7618090, 2057154, 6040255, 5936125, 110885, 4107097, 5421373, 8060130, 5292167, 760352, 4690292, 4306544, 7841892, 4994673, 5074318, 887462, 6961082, 379750, 8305721, 7017340, 6471524, 4467235, 7152940, 3551894, 8004129, 3382378, 724796, 3127534, 252087, 2884838, 531759, 7560865, 2721490, 3791369, 1136535, 3687571, 936818, 1088541, 3319493, 4519220, 1328103, 8131139, 6429866, 393625, 2046143, 5465673, 8063077, 5568335, 3899826, 1842740, 589162, 4757690, 609938, 4819034, 7655049, 7070533, 5615885, 3172114, 5313703, 4959257, 6250952, 6918828, 6857035, 6609080, 7692885, 8030051, 1615402, 6955080, 2286740, 4407476, 606604, 3356322, 8058683, 4185891, 1691746, 2698101, 6333230, 1146647, 1087217, 5217248, 2771676, 7828671, 2167790, 1546174, 1363015, 499739, 7334143, 5759686, 5328535, 1036146, 2379415, 1140967, 3901410, 6846918, 6595738, 5832715, 5415196, 4212970, 5367332, 5410205, 4742509, 2002189, 2870536, 4877419, 984309, 5855181, 6631970, 3788761, 4334494, 5829412, 1150724, 1939133, 105854, 8126125, 6797850, 9688, 4960827, 1695452, 8242294, 5210506, 8240725, 8209102, 999171, 2306590, 4789018, 4536218, 2420646, 3910025, 4861587, 4269982, 2244078, 6702738, 1257823, 4270500, 4468924, 6286369, 3407422, 8091003, 2977249, 374112, 5383805, 4247084, 5819009, 7392348], -[4057742, 4504507, 3272907, 1325218, 4129292, 3614014, 3051254, 515860, 2896719, 7331125, 3068150, 6889345, 2679067, 7725131, 2945046, 4430364, 8366187, 6233011, 2012958, 2704720, 6176319, 7646431, 1648438, 5605772, 2087021, 2331259, 4021949, 4050459, 4288940, 5804777, 110243, 7140203, 2096061, 2112249, 7901451, 5168353, 1034549, 5771529, 5433791, 191550, 6683817, 4498246, 4621580, 214617, 5668917, 3364260, 5166168, 2214349, 4360953, 2816284, 7714822, 5944605, 6988769, 7954004, 576659, 6326309, 7010102, 6959509, 2765375, 7040910, 4223149, 8122428, 6855107, 8314989, 563974, 1441020, 5472131, 4204271, 4520923, 5386552, 1918067, 6996849, 2316080, 357039, 1029277, 1866262, 3708669, 4082413, 3004974, 6795766, 2867039, 2308409, 6282574, 7886290, 6162311, 4916288, 5306585, 7274262, 7250841, 7909926, 5201722, 4126739, 3076833, 6709000, 5926199, 1444951, 5212402, 7134450, 197067, 3919942, 863699, 5443129, 1918165, 2778212, 7263849, 6118697, 2178381, 3485673, 1208288, 139330, 5024781, 5043037, 2221110, 6097437, 6106138, 7764066, 780548, 7070299, 2498217, 8322955, 4586736, 3813378, 5151798, 7406008, 6276196, 6217018, 5755459, 1099503, 3575146, 6102774, 2964012, 926433, 4328627, 3615244, 7391692, 5554540, 3797117, 51861, 8232452, 7083324, 4989615, 3702898, 348260, 1725796, 5497734, 8102994, 6434606, 4027324, 291592, 2814646, 7323824, 6166333, 6925324, 7656746, 6695096, 3230053, 7413794, 3060856, 6883854, 7713532, 2186669, 5905912, 4906071, 1967626, 3054806, 7834661, 2115295, 6322191, 5367632, 7287859, 5234513, 2585842, 304049, 5685064, 1929869, 298709, 2910674, 2510939, 599066, 4136888, 5853903, 4411476, 2111209, 6883754, 1120627, 1548788, 4640918, 2667744, 6516162, 6314411, 4371749, 2270319, 7509479, 7642954, 4462218, 8159345, 8150674, 8045255, 5127711, 705581, 2098680, 5669706, 6999632, 6083014, 6487059, 650155, 4628853, 1005457, 3504795, 5903682, 5756730, 7519173, 5889468, 4896138, 7748999, 2736802, 5497205, 3128595, 959972, 8335224, 8171489, 1444771, 5320604, 1724381, 3426518, 5760546, 3387879, 2318852, 5413196, 653872, 311452, 1580413, 7735800, 556333, 4991242, 6137507, 173966, 2400249, 5038727, 7681569, 5567161, 4423377, 7638399, 189995, 1908705, 1891134, 3339752, 3856409, 6009315, 1363060, 4017586, 2728608, 1728326, 2764362, 6904627, 6439809], -[6953814, 6814454, 1217384, 612897, 6922873, 5405353, 7135231, 5774090, 799795, 4977818, 7803032, 7649318, 4996106, 7851605, 6725313, 362100, 2987055, 6692467, 40443, 6498445, 862258, 5711596, 5337215, 7955582, 4992135, 1701207, 463730, 7417484, 5876278, 2267908, 2215213, 4432291, 5885303, 2997526, 209409, 7821505, 6221350, 3488579, 6799091, 5543671, 6891879, 2603213, 6301964, 2512553, 5509165, 5714249, 7270980, 1362287, 3972095, 4980458, 5878714, 3241230, 2982259, 5198395, 7115127, 5112616, 4125505, 2418174, 81187, 6692002, 7528352, 5502543, 2037313, 8266079, 7608305, 2124856, 7289179, 6453940, 4891044, 1940314, 5782661, 4416088, 4841869, 929952, 6815878, 7831779, 2288892, 1890421, 5761360, 5012909, 5392049, 2511256, 7068885, 4619972, 3670047, 907334, 6145325, 3790292, 1142795, 2877784, 2281682, 2960638, 5154172, 4208305, 654647, 5936628, 3055480, 7634046, 6790097, 2292844, 4635011, 7439580, 4088543, 2094691, 3838119, 1172693, 7413973, 7991401, 5073239, 2728751, 6254184, 8287721, 4013087, 3741031, 7465690, 862337, 1797439, 2691253, 6955062, 5961000, 1569240, 7121029, 2365629, 7130732, 5846416, 5468102, 4874709, 7759054, 1222556, 919130, 888204, 5668583, 5093655, 4726339, 7484010, 6291575, 3114170, 7501232, 403689, 4876819, 7344540, 1259805, 6464789, 7192864, 1024345, 7033738, 6015782, 1342526, 2273308, 7364294, 33923, 5688051, 7908773, 1156932, 373222, 4491595, 1956502, 515934, 3478840, 7436585, 1069809, 7925369, 7743291, 5941966, 4466988, 5151368, 6711015, 2471268, 1099720, 6388932, 2394345, 2101723, 5496518, 3818056, 6854134, 1572021, 7231272, 7284060, 2328732, 2875470, 7726987, 873011, 7772926, 7315676, 6062587, 1763500, 1951267, 945209, 3423894, 6173072, 6578837, 8195070, 1307301, 7247339, 3566851, 5589443, 2358788, 7537900, 8201492, 2364753, 7970825, 8099068, 6196502, 7101964, 4120873, 1583410, 793634, 4969124, 2314974, 7619496, 7411221, 1063764, 7088307, 4054162, 5310509, 4390194, 6913740, 2764053, 8041179, 8194201, 7171222, 214913, 120276, 6133011, 934775, 6814908, 3669836, 5943734, 7591335, 4511234, 2246426, 5018515, 1113822, 7113270, 1570146, 5606778, 7403074, 1380791, 3289994, 1010851, 1456716, 7931266, 6809676, 8175216, 5815228, 6723542, 1426142, 2476815, 5624393, 8061398, 296336, 6547471, 7344723, 642269, 5356322, 5950758], -[7580950, 121835, 2575656, 4013929, 2116951, 555454, 7123823, 952520, 2676357, 1002897, 1216620, 7813254, 4612479, 3061420, 3095931, 423876, 4796045, 3577541, 2286620, 2978899, 6610343, 1191787, 5685471, 5943566, 1868404, 6281782, 7113597, 4050325, 5854261, 6173120, 5187256, 4736560, 2117293, 2789339, 4466605, 2176465, 3739152, 6598267, 6197330, 2015918, 4149801, 689908, 6469872, 7148395, 5469384, 7713534, 7844203, 2884697, 4008141, 3383841, 7845986, 2429126, 4211028, 3448437, 7989874, 5920200, 7677860, 4358883, 3563621, 2756671, 3392545, 4958999, 3060910, 2628507, 5371441, 2616622, 3317225, 2771897, 1730996, 3541038, 3832165, 4677409, 6036998, 6983898, 2398906, 3543147, 7941528, 621166, 5283227, 133657, 7593406, 7507594, 364799, 6206369, 4321986, 759160, 6185417, 2821013, 3349951, 3266218, 6798193, 7532981, 4971744, 6204454, 1275945, 1629119, 7862380, 3649977, 1553669, 1092506, 3333968, 3584786, 6930986, 3004116, 2643600, 7782664, 1550062, 6068735, 8335951, 2132795, 318512, 7733779, 5198713, 4339508, 3038698, 6141014, 5793237, 7943784, 1484504, 5729452, 5785754, 3687807, 606009, 4860684, 5698933, 176290, 1664478, 4990079, 871366, 6170295, 4487007, 3012238, 7981429, 5908633, 1056580, 3842041, 8105872, 2259239, 64070, 7185957, 4184392, 2329175, 6615289, 5677773, 6193848, 1895389, 3873198, 2719975, 2872839, 2652168, 3270101, 1817955, 5966991, 2959374, 3700217, 8294568, 3302596, 2349187, 6146517, 5421222, 1548073, 5042351, 2547281, 2498460, 3751226, 5764320, 3146244, 7077372, 6087595, 4338908, 4081369, 687530, 625281, 4801891, 1610171, 5856598, 159833, 6458802, 4036566, 6813967, 512410, 45561, 2791738, 6402607, 8098289, 3299501, 4254300, 4981710, 8189825, 6498810, 2634809, 3303729, 6704669, 2143613, 5488608, 3882672, 5635140, 6336147, 5673998, 2323857, 8291263, 6812437, 2348883, 7224700, 5712459, 3038720, 6242010, 1795283, 3358271, 3251121, 5935174, 7956806, 795420, 6159956, 4251054, 977493, 2091440, 676618, 7636918, 6859175, 2407980, 6707440, 4247835, 6510547, 8537, 155079, 6986811, 3944954, 6949813, 7436668, 5115668, 1878654, 7122155, 2143538, 6983228, 7416321, 6510422, 6486638, 449133, 3285601, 2044056, 4824430, 465614, 7656101, 7472515, 3414715, 7032733, 2994610, 747196, 3019380, 590965, 3856107, 4264260, 5244173, 1196906, 691616], -[4659932, 7874021, 4231352, 924735, 4703317, 965774, 6393902, 6863374, 901654, 5652694, 7938571, 4832367, 7464835, 8179857, 7770819, 6163337, 1303760, 283948, 1242537, 5599518, 3513553, 2480578, 4143242, 3893509, 275418, 6482118, 2074408, 8180475, 79321, 4352813, 3060784, 1366152, 7917417, 7610704, 8175782, 7817441, 7877659, 6621792, 5909495, 4476380, 843585, 2992718, 5064139, 5333779, 7207317, 4864287, 4317435, 5557788, 6348198, 1997392, 4680686, 7424041, 7602633, 8105240, 4109879, 689713, 6147234, 7327001, 2155591, 3308062, 5854310, 180010, 3435136, 2046757, 1012797, 4335829, 5974352, 6789877, 7246198, 6359872, 8191573, 5230790, 6409546, 6143722, 7623992, 556304, 7483237, 3974581, 6141575, 7728281, 3548335, 7207867, 2234830, 2455786, 1354562, 1377489, 3546326, 2472958, 3498149, 2515684, 3909826, 2901439, 6433830, 2210936, 1024414, 951939, 8177746, 6436569, 4174846, 2750979, 6550354, 5462021, 5941601, 7836833, 6158868, 5323260, 8023674, 8212869, 1390674, 377625, 2685700, 2258720, 5306122, 8310378, 413159, 7974340, 6092689, 4197160, 7691621, 4557752, 2552851, 4134660, 1318735, 4367927, 6490992, 4276831, 5399038, 1416955, 1016882, 1735877, 5924496, 5957056, 2612406, 2062302, 5465307, 4517243, 1912686, 4235228, 1368920, 3588540, 6443746, 6922479, 1248124, 7025503, 7870081, 584950, 2582915, 7727932, 4127426, 4538352, 1062647, 6434381, 1056807, 8042197, 8283390, 6864375, 4642395, 685912, 5824501, 5335081, 6022323, 6643765, 4733978, 646023, 7879739, 5320722, 6625951, 4502686, 4994089, 5359556, 3083171, 6886236, 6785421, 2603038, 1740275, 1993760, 5493924, 4759109, 4427683, 2287009, 4296385, 8036687, 2426681, 2044884, 4263275, 5777671, 776367, 143654, 7664802, 7748225, 3694326, 7087240, 6643656, 8013010, 8097380, 6860592, 1818358, 8361991, 859415, 4390694, 6960440, 5939280, 4472328, 1522653, 2826166, 115526, 1625827, 2829052, 1171227, 3300166, 710056, 3098632, 3912007, 7054283, 725411, 6027219, 3116191, 3200921, 6731579, 1398604, 3507322, 3258616, 6825799, 3291889, 8054646, 4707151, 1570765, 2100782, 1096983, 7262128, 4933036, 7488634, 4001214, 2618541, 2908108, 638159, 2099954, 4486700, 6895229, 6148691, 3701358, 1345137, 7520307, 1084253, 309274, 4571178, 1090521, 2778319, 3359548, 4514317, 1232502, 5092537, 3679755, 1792107, 335803, 7481206]] -aHat * s1Hat: [[5356299, 1931310, 7303741, 7925554, 2153837, 609392, 6305657, 3136250, 2941288, 530460, 8077615, 8360692, 6894278, 7030219, 491152, 7104545, 3742922, 3207142, 4883433, 1511246, 6926855, 5652647, 7723983, 1685813, 5189481, 7924854, 7857432, 260149, 8040421, 3066709, 759368, 7369831, 5231708, 3098412, 449339, 7505413, 6761792, 6127929, 7737545, 2384712, 637080, 5859717, 4986448, 596930, 8225240, 1893100, 3179678, 2952658, 242386, 4439989, 3609305, 8339777, 7047361, 91504, 1848779, 5030401, 951986, 2558192, 7002698, 6068533, 5568880, 7346691, 5889181, 6155743, 7886383, 1406972, 7622529, 4259958, 1983168, 8307712, 3712779, 4492607, 3759662, 1287669, 7629642, 7539518, 2623392, 7980251, 3212723, 4151028, 768304, 5822283, 3792129, 8302021, 2595602, 7531997, 8031649, 4473840, 3275962, 6893515, 7281840, 5262910, 6127579, 3912538, 3978695, 610274, 5243166, 1689202, 3037693, 2252742, 2604673, 2932227, 4575112, 2128926, 3526816, 4392014, 6919548, 4237007, 1280989, 5365150, 6046784, 459760, 7666802, 6557688, 5118724, 5417274, 3319485, 63477, 7233436, 2291441, 1588833, 5606815, 2727231, 432604, 5809954, 2747821, 4806416, 4764130, 4556330, 7163641, 631617, 1045133, 307949, 397031, 270426, 4094691, 4484784, 100358, 3766967, 6785913, 5734322, 5865128, 8072991, 2023343, 2974590, 5748970, 7478122, 4624596, 3357713, 4015674, 7388030, 3282545, 7733751, 5733733, 7267858, 4992679, 1454395, 4429094, 5282522, 110936, 5083990, 4420166, 7011717, 6578737, 3353466, 5075507, 7035190, 5684036, 8104361, 6702454, 2974524, 854467, 667178, 4368892, 6648292, 1315627, 3012288, 7645736, 6188714, 208579, 2454757, 5101499, 2619064, 6026627, 1448404, 1102214, 5779571, 3481475, 449031, 3325074, 6267010, 7308622, 2501928, 4196686, 720831, 7616509, 6529535, 3360967, 8080649, 5058368, 1015046, 972229, 6852326, 95777, 6955902, 1801530, 7628665, 515802, 146604, 2162265, 6257569, 2410346, 5690426, 3447994, 5373061, 7440421, 396258, 4797877, 8283433, 2691490, 1424515, 7738954, 3906238, 5487514, 4215290, 4753319, 4210441, 6764287, 7570213, 584239, 3668780, 637971, 5634150, 3426236, 3744154, 3397217, 1405566, 1804261, 2335962, 5807738, 162426, 6709099, 6287954, 3977910, 8057417, 6151491, 3663207, 4876059, 7694499, 3682806, 6167620, 3072556, 7938834, 2337471, 4558027, 1951482], -[3558904, 6768771, 4705558, 2862463, 3409666, 2996371, 6242882, 3757159, 5662539, 383660, 4491438, 759267, 5424063, 4889573, 7326241, 7980019, 3742759, 4644347, 4262593, 2477044, 1002331, 7043673, 451189, 7689104, 3071955, 374146, 1591762, 2996709, 3114743, 7330025, 2643775, 247995, 3569180, 5419172, 2900161, 5936569, 6481244, 2734873, 6054115, 6531286, 5460917, 4379365, 7244506, 4191749, 7248879, 1799303, 3623316, 4049686, 3688415, 3827381, 2447369, 6220814, 483348, 3427525, 4290025, 3365314, 5585246, 1006501, 8214852, 7104886, 2198214, 5330389, 2007901, 7308495, 1700767, 2555451, 165618, 1834227, 1158173, 1819053, 7824040, 5717722, 821614, 5048193, 7985083, 6188988, 5148089, 7084066, 1220989, 6792374, 1009070, 2050913, 6790422, 6427299, 674355, 1627258, 4397266, 2832912, 4730434, 243321, 7550827, 80232, 1048461, 8146792, 8338365, 6675319, 7661743, 364863, 5774159, 6475087, 6292737, 7573144, 6083929, 3734651, 8207220, 5329015, 6433982, 5291060, 3129118, 7050324, 2154368, 976851, 1667668, 3902028, 6436341, 1587797, 1155044, 4404011, 5581934, 1233837, 7277224, 6518419, 128512, 3612838, 5545190, 49004, 8159326, 563769, 3788419, 6748956, 6344107, 295910, 7594454, 3134827, 4336216, 7505282, 2559031, 5388010, 1974057, 5211954, 2424849, 2445622, 79727, 2334714, 3138703, 2368451, 2171409, 3999410, 3442251, 7552737, 7208383, 4841373, 4508413, 5673001, 2185455, 6113276, 4575391, 3481170, 6180665, 7197361, 5214333, 3470102, 8182446, 3770025, 381096, 5808211, 7356975, 4781193, 350210, 197307, 4772947, 6452774, 4845586, 6974712, 7515912, 7452559, 3356214, 1672268, 397810, 1750361, 6855144, 6177818, 3614689, 7086944, 3287180, 3793765, 399733, 1995251, 1871766, 5180869, 7031007, 99965, 4074931, 4892003, 3442196, 2926270, 7127199, 3831799, 2780952, 1873263, 1403272, 8128548, 2523340, 5763286, 1870704, 984576, 3650112, 7757898, 8083309, 1636193, 3404879, 7109682, 1027577, 7640729, 7981983, 5008376, 7207556, 963197, 5122111, 5268390, 1158819, 2964630, 2058801, 2518266, 1071640, 3500024, 3375324, 4793926, 822441, 2411320, 7655190, 6716969, 346125, 3819766, 7092035, 531028, 3472811, 486244, 7389042, 6161019, 5397903, 2760257, 4230022, 5102704, 4724338, 8376316, 2501561, 7392212, 6370734, 5134456, 3109703, 7922650, 4776311, 6845182, 5817507, 8204684], -[1736177, 1413435, 7706408, 2975456, 5541766, 1407143, 5351381, 8314562, 7482370, 8360761, 1850524, 7137151, 5840118, 166235, 7431434, 5648752, 4432041, 788979, 1851176, 3496698, 3780252, 2937292, 5434817, 1064974, 236707, 1250746, 2222339, 4320174, 2131550, 928781, 7306841, 5124759, 4895324, 399193, 1792728, 3465199, 2084837, 8145715, 6636274, 4568047, 1976674, 1836236, 8062792, 692434, 2831469, 4736878, 4122127, 4372989, 640425, 7439050, 2591081, 4418362, 3305827, 5969019, 2261242, 6554920, 2465713, 5245952, 1983931, 1271500, 3011614, 1067043, 3970539, 7909291, 5206094, 250012, 4879503, 81208, 2739298, 648731, 1558801, 6745331, 8303640, 7457443, 4418672, 385096, 3105715, 4927609, 7541436, 2181328, 5870284, 1600494, 4662224, 226320, 5856066, 3496678, 6749208, 4624495, 4302333, 2852355, 7856347, 677223, 558609, 2776096, 2557201, 5563015, 6616010, 3313126, 7607996, 5479431, 2291257, 4392734, 4143015, 1051672, 8009194, 504711, 5058301, 3757696, 2654352, 2540709, 7151100, 2919697, 439871, 3410382, 2456633, 4604384, 6608420, 3383305, 6257192, 7069955, 1236023, 555014, 2072677, 6946566, 14713, 2283660, 216914, 5627933, 7930609, 6437241, 438137, 4911098, 1686839, 6761181, 5509143, 262063, 755015, 7674455, 1654731, 5743511, 3454331, 7261702, 3619418, 96543, 7729918, 1384649, 285985, 2533951, 8045238, 2168776, 6387019, 1067557, 4153406, 3020824, 2095574, 5780465, 2341870, 5675490, 6336409, 1447496, 4541788, 5009178, 4409257, 6786077, 7561108, 7893177, 3592624, 7666868, 3534481, 5028053, 5110934, 1226483, 2047932, 4128767, 4675459, 5415041, 840943, 4037233, 6543131, 7203919, 956131, 2749308, 5884020, 6767142, 1928634, 3731400, 3664668, 5802370, 6032771, 175697, 3137093, 2466276, 6489882, 2848365, 6884231, 6646169, 7309768, 3859265, 7328997, 8361875, 1190167, 6142719, 4186680, 6127118, 6236844, 1404501, 4282843, 2154006, 3275749, 5975450, 6117874, 567668, 617152, 4152757, 2265453, 3101148, 5052928, 5570942, 5428680, 7534011, 1203430, 829181, 563900, 2777447, 3697340, 5651521, 7985108, 529550, 4610894, 2078265, 3940489, 534980, 6400923, 5160599, 7659849, 5582558, 6951454, 5915050, 6721575, 7985818, 700572, 7757999, 2584187, 2783847, 450075, 158491, 5361698, 1131103, 938885, 2096040, 6751884, 1351101, 3840053, 178489, 3282801, 1469284], -[8195053, 5209273, 7760591, 5111799, 5033477, 5220217, 5816911, 2790632, 1882047, 8053438, 8363037, 1727849, 8375343, 964121, 1805868, 7691589, 1978348, 2211389, 5544905, 2002840, 8352538, 3132816, 840338, 6975354, 1987393, 1610570, 8141019, 5050259, 1888213, 1057513, 7222225, 3174907, 5293066, 5263632, 3791797, 2721531, 3838501, 7337213, 5011589, 376161, 3159905, 806808, 7391617, 2088126, 264803, 7337546, 5903316, 622705, 741733, 2790949, 4438828, 4775174, 547623, 818397, 7136919, 818607, 7489543, 7738255, 23290, 3434731, 1042561, 2691851, 4815652, 1678654, 1825681, 6457756, 349255, 4594800, 310873, 6697089, 6240592, 7103037, 5696914, 4332529, 3492136, 3917923, 1262892, 7953092, 1920568, 2555944, 5072881, 2315180, 6957431, 177798, 5699776, 6824307, 2760992, 4833286, 7712090, 2684464, 1467346, 4929204, 4454877, 1108170, 8224563, 82902, 2484842, 2357130, 3232578, 24952, 2274475, 728841, 7195908, 5727303, 3623643, 838846, 3920478, 4235618, 718653, 7532564, 4557544, 2436959, 7213176, 7669046, 3331455, 1178400, 7817710, 3208789, 1629271, 5172388, 5982717, 4907072, 6323887, 5462831, 4805307, 6357291, 8120665, 2381741, 7998498, 268758, 7343715, 5257781, 3319982, 7146488, 437234, 4955033, 103225, 2926410, 2618646, 2944721, 725647, 1519647, 4376885, 7991228, 8175824, 2850050, 7327080, 440942, 5519994, 6161359, 4936433, 70578, 4867002, 7112087, 4869869, 4275994, 7857879, 3672893, 7440392, 3515136, 1818598, 6787287, 6430306, 1101593, 8061605, 831734, 6835791, 6193237, 7531769, 4464051, 5740268, 6009117, 1243319, 1500293, 6868103, 7858882, 5413083, 3659775, 6360697, 2138582, 6144076, 2230374, 508546, 1399531, 4850610, 7047172, 1334121, 6564445, 746023, 6021639, 615477, 6041008, 5831326, 6078494, 6583612, 119319, 2632431, 1999150, 458088, 6996226, 631885, 1856257, 6278413, 7806208, 2141307, 1986677, 3757898, 2736599, 801425, 1563372, 5725935, 1232416, 1811041, 7526837, 8051317, 7162834, 3310954, 4553764, 7311034, 1536885, 2095088, 7326548, 8288780, 3654076, 7027177, 8054848, 7245326, 2536699, 1137399, 1816611, 3796605, 4726902, 5980753, 464134, 7419166, 3720557, 1616045, 6690455, 6498205, 160189, 1607728, 8083423, 4529838, 5948501, 105499, 3649347, 451385, 6687759, 1032804, 7210834, 5979066, 8036766, 3694435, 3083572, 4921833, 5504434], -[3098851, 1886755, 5522073, 1016488, 3725422, 1253971, 342708, 423704, 2973749, 3165878, 8221646, 6877523, 3292551, 6923273, 3257483, 3023046, 7899239, 296086, 172616, 4662667, 6573943, 852115, 835471, 5854615, 2301872, 439941, 5291504, 7896942, 7116033, 7111310, 7013905, 2734543, 6086352, 1010042, 1981762, 5261669, 6712327, 103726, 2080301, 3988747, 7007856, 6265645, 4598218, 281618, 1265298, 4755410, 2311304, 4067381, 2933466, 2337632, 5546531, 5234842, 4942613, 7049662, 1942109, 4889101, 6649520, 612211, 4482039, 8277468, 7626273, 8147219, 1005729, 4040760, 7836315, 7121187, 1222784, 7021037, 7952923, 5008922, 1882006, 1730779, 6004583, 6243590, 3715888, 8082314, 5972844, 7042952, 4692272, 2183719, 8161343, 2759012, 7182235, 283672, 3387077, 1515562, 90578, 3031621, 6251259, 4576845, 1910721, 7069640, 412577, 6275616, 6688687, 7976830, 1569774, 6831598, 6113113, 2614702, 6823871, 2643338, 6681982, 6720254, 2803194, 349508, 3691921, 4808547, 4329014, 3343125, 2697937, 5242, 6732474, 3416725, 240680, 1931664, 3883168, 5208386, 8013248, 3736292, 7792905, 6690422, 7183166, 1451736, 1640736, 5969315, 5659049, 6986618, 490362, 7871522, 3990672, 5380233, 2823715, 5770687, 953334, 1053611, 1300886, 5864321, 5717787, 4110582, 1530210, 4931595, 3059017, 5071479, 6767078, 1040879, 1431308, 3852177, 1335639, 7100011, 6418954, 1584552, 4931476, 7418994, 414679, 4103554, 2645348, 1802686, 525632, 1605744, 3116085, 3444400, 5564831, 1312712, 6084957, 7509210, 5653708, 4338717, 3099921, 4318787, 5576858, 6318540, 1429150, 5068796, 2817215, 5181984, 8214074, 572616, 2057466, 2920154, 7651755, 6885494, 7842682, 262630, 2369527, 7195419, 3026995, 3496337, 4808487, 2766970, 2903344, 5834993, 7414649, 7938878, 1968847, 2538133, 6603793, 3038288, 3884783, 2455080, 8376578, 5244839, 8308816, 3345155, 3627615, 7541787, 8206725, 4263507, 4039576, 4829772, 6161614, 7413142, 4543067, 2454072, 8243882, 6825134, 5260857, 1555600, 3939658, 2999140, 1702661, 5312710, 2145047, 4963470, 5429391, 8025428, 6277212, 1307072, 7063011, 2404323, 8313382, 2548738, 4981588, 6935441, 8106254, 5872353, 7007947, 839045, 6987357, 5572400, 6930805, 7068799, 5796677, 7367956, 2715874, 3356088, 5959118, 8269838, 6401981, 2311271, 4044570, 1103727, 7777793, 811488, 8337093, 2754126], -[2691317, 5881308, 2992825, 2286970, 8335510, 6922817, 3420603, 5279667, 2121819, 3216961, 7147090, 6407303, 5477005, 4558109, 942353, 3709871, 5923384, 8200569, 761056, 6105791, 1426494, 6194601, 4113371, 5734571, 3718720, 1728355, 2640984, 3587659, 7141534, 5967259, 8142931, 1151393, 7801353, 933775, 6268989, 1550451, 1605007, 4134200, 3381988, 3664079, 5841538, 2866330, 829264, 3917779, 6694605, 5187145, 4260166, 6242231, 2055947, 226025, 2981359, 2173990, 2188916, 5510032, 7332265, 4394574, 2173354, 911561, 8160963, 1744427, 6761902, 544096, 5413152, 4640858, 8185099, 1398118, 4960017, 1582944, 3869233, 1708033, 7322079, 8325941, 1360348, 3232179, 1611688, 737615, 6076125, 3429290, 2402165, 4785013, 1847266, 2538329, 2759108, 6602760, 1606892, 8127286, 2388567, 1456208, 6384370, 4877567, 4214655, 6090586, 2049959, 2225865, 7009355, 5700307, 6191618, 5557941, 8141315, 3292171, 913705, 8349414, 41426, 8360466, 4872505, 2603721, 7450064, 6104949, 2279064, 6754453, 8056014, 1717223, 1516202, 5021651, 2874116, 1656917, 466806, 8109411, 5853335, 2694007, 6822700, 6084876, 7677653, 7941019, 4985398, 129850, 331770, 391757, 1399332, 5971004, 1279308, 3936313, 3523317, 2133122, 4839090, 5092130, 2187705, 8337478, 1052408, 6876169, 3615044, 1590033, 1527167, 6784469, 5194852, 1863803, 8195191, 3403823, 7977928, 7709637, 3513379, 2821413, 2967675, 2696167, 2265021, 8260322, 7747021, 4598263, 707536, 8209497, 6562846, 1244127, 398180, 622322, 2458535, 4468503, 7235940, 7701458, 3431313, 4050708, 7039024, 353385, 3074772, 3478149, 2234459, 5426962, 7446204, 852751, 1192793, 2896515, 6932426, 4093594, 290179, 6172877, 4693391, 4692414, 1115243, 4116500, 4556568, 8332345, 443006, 7953251, 71568, 6485800, 5967720, 7596577, 2907311, 2172070, 7909839, 1317817, 909156, 7565357, 6725905, 2125918, 602119, 4853232, 4183993, 2928585, 1476079, 6729365, 8091060, 4269713, 3634563, 1758471, 6085769, 6024439, 1572329, 8054454, 7940640, 6937184, 7785521, 7187013, 3968381, 209864, 7520244, 1517611, 3576123, 4779529, 1737471, 8222951, 7246754, 2965172, 4284164, 5852692, 6801096, 5973961, 1631018, 5424368, 3146561, 8243545, 2898472, 2765348, 5412674, 4308907, 2410301, 4761874, 6135359, 7120165, 6902879, 4199065, 113303, 7825652, 1268469, 4945691, 4273253, 4120001]] -NTTInverse(aHat * s1Hat): [[830897, 2049833, 6969400, 7713335, 5408488, 7739107, 6814387, 5445045, 4299840, 4623630, 5600489, 970754, 6088905, 5234075, 4265145, 4827235, 6985528, 8132429, 7904641, 2124141, 2214658, 1990802, 6491209, 1466042, 3906849, 422790, 2844497, 5635218, 3052908, 3693638, 7069807, 5149612, 6793090, 6316831, 5223556, 4906560, 2640758, 6259040, 4603354, 350630, 2676843, 642972, 1194346, 5057399, 1197066, 7592819, 6001672, 8183194, 7914878, 5330704, 6947177, 2890033, 2528985, 8237993, 910660, 2104710, 6815144, 483063, 3043336, 4341116, 3620738, 254071, 2265370, 6178683, 7489213, 401005, 867999, 1172157, 1815764, 4059760, 5383393, 3043078, 473863, 6728410, 808005, 3000087, 2826274, 2287193, 1175760, 720220, 2434523, 862109, 2667457, 5338582, 6495963, 5491680, 4325993, 754733, 1906144, 4680928, 6780178, 7492093, 5356156, 6345635, 7283384, 1417413, 5550317, 5304042, 4624792, 649064, 3151665, 8139938, 1415280, 5185361, 4359608, 822499, 5057029, 3453267, 6898914, 372767, 664304, 6781702, 3473923, 3631653, 5954646, 6724674, 1149409, 3956638, 5627577, 7636946, 3706592, 1746907, 7734756, 3722467, 827361, 903702, 31090, 5772814, 1665351, 7000261, 6776039, 8351822, 5804027, 1694323, 574486, 6736393, 3280669, 2804553, 7022444, 5492468, 5300019, 4706983, 1476604, 8333644, 4385118, 8290495, 6378992, 1211684, 120187, 7583559, 3761388, 7679430, 4506238, 979295, 8258427, 1039168, 6552448, 5942033, 7114669, 3915990, 6195466, 4623256, 5115335, 6476043, 1516424, 5987993, 2962237, 2153131, 903430, 7822971, 4335736, 7340380, 7347333, 2846393, 5789183, 4324995, 5359805, 2574489, 7943831, 7250479, 5355207, 2097405, 6511510, 2891214, 1544013, 2468945, 2261919, 6923981, 785750, 7168456, 3889771, 6802616, 4866776, 4838100, 5467167, 2599498, 3843348, 3080907, 8035389, 5510313, 6180840, 7198481, 1425344, 325996, 6144076, 1213298, 7716704, 7830318, 6511496, 2575529, 3832433, 4768048, 4599869, 4430115, 1424196, 7910434, 3210195, 7904069, 5251564, 3872663, 3962856, 2958241, 6415110, 5314643, 4718362, 2957079, 6361575, 3624111, 632494, 1766540, 5904115, 5307677, 7778880, 6385387, 5668306, 3031461, 7408523, 1107530, 7262246, 5641663, 5909338, 4632800, 5274126, 3773435, 7142527, 7746948, 2683311, 5237050, 5615659, 5852448, 6063504, 3077534, 6186557, 1497080, 4197381, 5483691], -[4592415, 5153279, 4630162, 8013727, 2438913, 2145174, 5103918, 6594116, 1964706, 5675452, 2120068, 1411298, 149435, 5563055, 4826949, 5463073, 1566682, 541590, 2914919, 7028119, 8370750, 7679217, 6797260, 4310226, 6733539, 8345798, 4855383, 3311401, 4214074, 4681586, 1405343, 2389656, 4576062, 7882220, 1343756, 806412, 2380852, 6428998, 7435815, 4957499, 5341197, 6297497, 2890529, 2011091, 21312, 5700337, 841142, 8279776, 340211, 2680436, 1567372, 4642734, 303716, 4588000, 954357, 7516685, 8000311, 556713, 4268427, 5886085, 3776330, 580825, 741650, 6521908, 428585, 1757913, 1139555, 1271587, 4188190, 6297921, 6353457, 7341871, 278667, 5528715, 677489, 4047886, 5211162, 460309, 4838532, 5416501, 4255888, 352927, 4653490, 1987430, 6049583, 1458006, 8193416, 1792290, 2396159, 746900, 3059760, 4599055, 4865765, 5673808, 2038313, 4571592, 7372586, 4876261, 8071403, 4559099, 6901679, 624880, 1213247, 742437, 2479534, 1549581, 289997, 1313748, 3908495, 177857, 2327634, 1032168, 3965419, 3912590, 6274256, 8064114, 7693567, 2227184, 5233996, 6081523, 4125051, 4205008, 6245450, 4989176, 4756688, 4754690, 6807733, 6823527, 7483162, 7968599, 5242427, 1022754, 4789181, 1307998, 2941870, 4931752, 2648397, 6418741, 6107579, 6934175, 3953297, 1605391, 5714599, 7731621, 664492, 3905930, 7160887, 4497988, 5533705, 7110106, 271066, 5213343, 4463502, 2595383, 1931815, 5407974, 4969151, 1632292, 192335, 5755591, 1983977, 5285764, 1727522, 2059834, 6943238, 6399418, 2871853, 5887443, 2239285, 1465831, 4131431, 1679154, 2405050, 6523084, 6550802, 3244215, 7601208, 421743, 2936727, 7112410, 8209256, 3077780, 2083139, 7404340, 4908911, 5434009, 5633403, 7786379, 8359734, 5078551, 3574840, 5183943, 5168403, 7576958, 3046321, 5326148, 812211, 2521821, 70283, 3652865, 1316450, 4268777, 213726, 2742138, 8169721, 7122315, 6988426, 8188827, 2635151, 3322438, 447857, 6604058, 7056059, 259486, 5180679, 71721, 3264409, 5105523, 7159751, 2895697, 1886056, 4336823, 3206815, 403509, 6124788, 4011653, 6089384, 6491742, 3755413, 7959816, 2305185, 4196513, 476001, 7017368, 5569862, 7869277, 2039182, 5911568, 2788257, 4261139, 1821970, 1070015, 6217894, 3551701, 4795383, 5276772, 7586695, 693074, 2086600, 486415, 1381673, 4885134, 8107906, 6881654, 6204728, 8280693], -[2740557, 6007421, 5931051, 3757377, 4836137, 1153007, 6299116, 3461784, 5064365, 569404, 8372552, 190220, 6097117, 3008663, 2112941, 82737, 1276153, 1966476, 1938665, 7246408, 1073683, 2933818, 1457258, 6289821, 3826808, 7639039, 5350343, 3728906, 7642817, 2773085, 5252976, 3057401, 5468748, 8296322, 711076, 7715031, 2316303, 8234944, 7469701, 5504741, 1318867, 2922626, 7346584, 3268244, 674218, 236063, 6836301, 7855565, 7879839, 6595194, 1137711, 5241047, 2598323, 8239991, 895808, 6894915, 2720983, 8089168, 4585442, 6821664, 2561609, 7661468, 802335, 2176307, 2909782, 3769173, 1747216, 929740, 841768, 6080272, 6280149, 2311763, 6706490, 7758854, 2188456, 5796405, 980094, 1869249, 1207568, 3311942, 5370121, 8084922, 1484540, 45466, 5986116, 6326969, 2010476, 7700450, 7718070, 5297615, 1200189, 4691455, 6852796, 2486223, 6566937, 3376700, 5975811, 377560, 2992123, 5719152, 124601, 2943199, 3413509, 1425227, 2725134, 7893789, 5595018, 7183180, 4625576, 6637224, 1631761, 1928130, 6477318, 7806911, 2717771, 5929829, 5015387, 783422, 7402749, 2839557, 3898792, 4974707, 8141499, 4799250, 2006911, 724092, 750613, 7305545, 1591728, 7032265, 5929216, 3044433, 2275185, 7410199, 4512554, 7175003, 1382107, 1892424, 70708, 1405837, 8139616, 681539, 749605, 2232636, 114923, 4179288, 7854707, 1388169, 8079202, 8327210, 2994360, 3891771, 805618, 7338730, 2844575, 5759135, 3312670, 8378473, 4664736, 5670733, 6117139, 1829278, 6808408, 7593467, 3192688, 3087763, 7842602, 6578147, 2614315, 1062153, 1448826, 6850521, 2826323, 5347360, 893855, 4484169, 2679184, 4170079, 4721908, 2846492, 2225969, 734576, 4009121, 77517, 7654277, 3307933, 5840922, 5619375, 7951566, 5161784, 1134459, 600687, 322361, 3536657, 3682802, 4157582, 7668200, 1051427, 6101820, 6776779, 6469347, 7952998, 3227276, 7585212, 7964744, 3309650, 8036897, 354535, 7955459, 7987967, 3582072, 4043344, 4978792, 2047531, 5015151, 2530612, 38091, 2223337, 3229099, 3311431, 1704177, 2833718, 1373173, 7807851, 4081251, 350181, 4915974, 3230182, 5088912, 5741127, 46999, 121159, 4548609, 588759, 3058129, 6996731, 4551434, 2863896, 7114998, 7266462, 6997283, 3047642, 4775473, 2536925, 1591922, 1680284, 2863277, 7545610, 3598855, 494535, 1700690, 3072120, 8273142, 4126342, 265812, 420681], -[1165922, 6792254, 7240533, 4959654, 7163765, 2479428, 2718384, 1386152, 6409068, 7204480, 7296443, 5064345, 6282509, 4909950, 6871560, 5062845, 518940, 7356617, 4700085, 6303551, 4120110, 1333608, 1446586, 3218126, 6515906, 2342962, 8116363, 1756661, 2749747, 1926680, 4765514, 3638330, 1430573, 6526919, 850159, 7642442, 2623215, 2389318, 1688207, 879891, 7539896, 572428, 823105, 2467476, 1722302, 3401292, 6019980, 5433811, 3914407, 5152592, 5880296, 325364, 5271356, 5006123, 4497005, 7755062, 5100632, 6716977, 265352, 2913943, 4308361, 325770, 8190788, 894466, 6141811, 5095200, 3617557, 2951312, 7073117, 1044940, 2632184, 2075567, 5102243, 6696955, 1467227, 4257292, 2393651, 1090145, 2386335, 6445110, 1235481, 7820046, 2739736, 6296785, 6075674, 8055931, 2523517, 4311714, 5060848, 4996690, 1226347, 2161777, 5036212, 6408704, 4376538, 563575, 4662674, 5447949, 2983142, 3544127, 2461204, 472760, 5685843, 7083710, 3331055, 375279, 3011108, 3365187, 4414443, 6599024, 6948574, 1784217, 4292718, 6833875, 4919211, 3121660, 3097935, 4906454, 2299645, 1786654, 5613340, 7103172, 3505385, 7361360, 2981186, 1080003, 2745679, 2523274, 3848616, 4855258, 7094923, 1461412, 3549634, 5210298, 1721017, 7935000, 6573710, 3526769, 4933189, 3953994, 124645, 4155263, 7734041, 5363945, 2023898, 4681685, 5717705, 2923714, 4684569, 601241, 5116695, 2279070, 1543846, 7926817, 4638629, 256165, 1732749, 5274674, 7760054, 3411594, 5920789, 935213, 5145041, 3751384, 3315394, 6942898, 533028, 4365841, 485550, 2640630, 5761238, 6519994, 576913, 3394708, 373724, 1469610, 185985, 3142141, 715083, 3282873, 8283929, 849701, 7280659, 4449668, 8378645, 3856700, 5446620, 2640008, 7923692, 3764092, 4077919, 2389415, 4686681, 7841337, 33907, 4501743, 6596869, 1115221, 1185202, 6030838, 7845021, 4433026, 4556660, 6530018, 1005194, 2353208, 392020, 3200471, 4419834, 4992842, 7629983, 7999834, 7576583, 6121793, 5503897, 2573041, 3917311, 788310, 713615, 4398330, 5770590, 2956824, 4424490, 458228, 6865698, 5063749, 5533821, 2836357, 3516222, 4222168, 5731722, 72813, 2151774, 1512336, 7423130, 7295495, 3343582, 4462879, 91819, 3873229, 1596607, 35110, 3775259, 7452950, 2394584, 6767273, 5207202, 2815479, 1102983, 2456420, 4235062, 5911800, 3715813, 3195018, 1371865, 3115713], -[4684360, 1726385, 5037526, 934248, 8117288, 1152637, 7176799, 1254229, 2336714, 361782, 8374155, 2728471, 794828, 7344574, 5796679, 1009357, 859095, 5138797, 8081098, 2378654, 3694575, 8214384, 5342217, 370018, 7582101, 662992, 3512818, 1550381, 6756713, 2159746, 7249251, 6721355, 6816583, 5187090, 2721104, 857463, 48719, 5633021, 6525980, 1920051, 2487365, 1655239, 7373066, 2815836, 6544017, 3503349, 5260343, 1303671, 4963255, 1998433, 6227129, 3898909, 1776751, 1760740, 2273285, 3027084, 6344126, 2415717, 7053257, 5071738, 2087796, 2214594, 3207192, 6073885, 5658525, 7659046, 1871656, 1180335, 7936821, 2390818, 7223535, 7249072, 6960120, 2089291, 3602050, 7262916, 4490582, 3636458, 7560760, 8355905, 5454640, 2723159, 4986637, 3780578, 3923420, 6298252, 6957399, 5961486, 8291705, 8351841, 4343476, 3932531, 1458805, 485326, 4036550, 4141875, 3358343, 6280875, 4491748, 7250024, 4887076, 38561, 4537942, 6248065, 2455585, 1853113, 955799, 1330879, 6909030, 1401304, 2035250, 4475595, 887631, 2124273, 5236894, 2107167, 4939746, 3690251, 7651734, 8119108, 3001568, 5398911, 3288628, 1699543, 135880, 8271083, 1000247, 7797886, 8268796, 3895005, 5384630, 8062628, 4244946, 1710336, 3662334, 6087177, 370975, 363527, 540193, 8171400, 6272485, 1746157, 7361814, 7142487, 5787816, 546197, 4946586, 4526863, 6284879, 6763192, 999986, 6182228, 4731261, 4229706, 1616447, 1658170, 2396584, 1621393, 7557399, 378614, 2932410, 1222804, 5869491, 2644699, 7572073, 4944327, 4042877, 2475161, 317964, 5930686, 6513231, 889689, 7832117, 8290498, 8065607, 6473147, 467457, 5038536, 8204414, 8321093, 1954798, 4216969, 6141032, 2652546, 5900350, 1855015, 2192647, 6164920, 4284918, 190335, 7383178, 1733132, 4020451, 3602858, 7433743, 2513852, 2634869, 6226651, 477430, 6596145, 5962858, 794999, 1417006, 8198466, 3497585, 281111, 7680403, 2443684, 1011917, 6073083, 3873022, 575347, 7047485, 1825853, 8061795, 3809162, 7514118, 337665, 2160851, 1936810, 6092886, 8249223, 2301270, 2432694, 6716509, 1878961, 7994941, 483679, 2626358, 7627828, 1134616, 7947459, 317201, 6566970, 4853487, 5859299, 1808804, 171054, 7959524, 7386347, 4186915, 4916270, 461253, 6646769, 3215518, 6359038, 3851356, 1170287, 2206751, 3846975, 7933797, 6960326, 7172109, 6407306, 5944817, 7568736], -[1951915, 3838908, 3756091, 4942758, 6438653, 6929857, 7684886, 5183908, 4582831, 5540235, 6473838, 4907421, 4580004, 7996268, 7505443, 6555094, 5372016, 5676161, 3811222, 5517851, 7983205, 1000478, 7327670, 268379, 4955664, 3719508, 4260597, 4433527, 909436, 2309540, 1359836, 4279147, 8098079, 5090944, 2826781, 864624, 6426334, 1094150, 2029358, 2864608, 8123313, 420666, 7713286, 6512271, 1779054, 4738312, 4494405, 6792685, 2659027, 6322127, 677084, 6280011, 7186569, 1301764, 5863648, 6180101, 4046917, 3511561, 4105404, 1436767, 5793601, 7768950, 5236955, 5512131, 2909016, 624905, 6831932, 7569438, 507421, 6975683, 5424097, 7228020, 7271781, 5084201, 492980, 2336256, 4461399, 6023447, 7293537, 2046166, 294946, 2932991, 6794956, 5427881, 6623646, 4445475, 3282147, 6198313, 158054, 6526217, 3604427, 1954483, 3010574, 5181770, 6432019, 6690092, 8885, 6257878, 567396, 7698811, 4261643, 4198201, 2770665, 4907225, 1275497, 7748961, 3402173, 3182989, 1307339, 1115522, 5841994, 4642303, 2182272, 3299200, 4457, 3624240, 5678075, 4629038, 4715180, 6394531, 1935151, 1035597, 4716195, 2159454, 5403929, 5241668, 1068632, 1150356, 3205192, 7464596, 1791722, 8244970, 5083707, 3152408, 7694101, 8076840, 3378366, 448096, 7869255, 4926424, 83653, 1380726, 481499, 2742996, 875123, 1419587, 815580, 631302, 952072, 6798375, 6413567, 2374919, 406894, 5968674, 4263795, 104133, 325965, 5447609, 6282146, 334045, 8313408, 2317000, 6973482, 2982826, 7497638, 6425268, 6793903, 6579432, 8332390, 7132041, 3262463, 4615482, 1337702, 6730997, 5924950, 3389788, 6729045, 2673763, 4487645, 207969, 2738031, 1372362, 2253789, 4202252, 7081219, 1241675, 3065948, 5066996, 3067654, 1898189, 876069, 3887170, 6467498, 4280182, 1920861, 4262365, 7800920, 4324875, 3911318, 2727607, 5224718, 8281029, 3920138, 6706120, 1222966, 3515452, 3716316, 8188782, 608133, 232299, 6247912, 4788444, 2724103, 7032321, 934790, 7385469, 6250595, 6574643, 5906701, 7106016, 4970121, 4963271, 6646485, 2585470, 2009028, 4096226, 2575954, 7089876, 2901776, 5943537, 4461610, 1894206, 3498810, 1985333, 6998062, 346676, 1030114, 508651, 6346205, 3129931, 2415770, 588702, 3950752, 6073905, 81219, 2294871, 5092181, 4891073, 4958391, 6458962, 4732317, 1094440, 857115, 4854223, 6996668, 2297021]] -t: [[830900, 2049831, 6969399, 7713331, 5408491, 7739105, 6814384, 5445045, 4299837, 4623631, 5600485, 970754, 6088909, 5234071, 4265142, 4827235, 6985524, 8132433, 7904637, 2124140, 2214662, 1990798, 6491205, 1466045, 3906849, 422792, 2844499, 5635221, 3052908, 3693642, 7069807, 5149611, 6793088, 6316832, 5223556, 4906560, 2640761, 6259042, 4603358, 350631, 2676846, 642968, 1194346, 5057402, 1197064, 7592818, 6001671, 8183191, 7914874, 5330706, 6947178, 2890033, 2528989, 8237995, 910663, 2104712, 6815148, 483062, 3043337, 4341119, 3620735, 254067, 2265369, 6178682, 7489215, 401002, 867997, 1172154, 1815760, 4059764, 5383392, 3043074, 473863, 6728408, 808007, 3000083, 2826276, 2287191, 1175756, 720222, 2434519, 862110, 2667459, 5338582, 6495963, 5491680, 4325995, 754737, 1906144, 4680924, 6780177, 7492093, 5356153, 6345631, 7283385, 1417415, 5550314, 5304043, 4624792, 649061, 3151662, 8139941, 1415281, 5185362, 4359611, 822499, 5057026, 3453265, 6898917, 372768, 664308, 6781705, 3473920, 3631657, 5954646, 6724678, 1149410, 3956634, 5627580, 7636950, 3706596, 1746907, 7734752, 3722465, 827362, 903699, 31092, 5772818, 1665348, 7000258, 6776035, 8351825, 5804030, 1694320, 574484, 6736396, 3280667, 2804554, 7022445, 5492465, 5300019, 4706980, 1476604, 8333640, 4385117, 8290499, 6378996, 1211680, 120189, 7583561, 3761385, 7679432, 4506234, 979292, 8258426, 1039166, 6552444, 5942032, 7114668, 3915988, 6195465, 4623253, 5115332, 6476045, 1516422, 5987992, 2962233, 2153134, 903433, 7822969, 4335739, 7340377, 7347331, 2846389, 5789187, 4324991, 5359801, 2574487, 7943829, 7250481, 5355205, 2097402, 6511511, 2891216, 1544010, 2468944, 2261920, 6923985, 785754, 7168456, 3889773, 6802613, 4866780, 4838096, 5467164, 2599494, 3843348, 3080907, 8035391, 5510317, 6180842, 7198479, 1425342, 326000, 6144076, 1213298, 7716705, 7830321, 6511498, 2575530, 3832430, 4768051, 4599869, 4430111, 1424200, 7910434, 3210194, 7904066, 5251568, 3872664, 3962857, 2958241, 6415108, 5314645, 4718361, 2957076, 6361579, 3624111, 632497, 1766540, 5904116, 5307676, 7778883, 6385386, 5668308, 3031465, 7408525, 1107532, 7262250, 5641659, 5909341, 4632803, 5274123, 3773437, 7142529, 7746944, 2683310, 5237046, 5615655, 5852445, 6063500, 3077536, 6186558, 1497078, 4197377, 5483693], -[4592417, 5153277, 4630164, 8013731, 2438912, 2145174, 5103921, 6594115, 1964706, 5675452, 2120068, 1411294, 149436, 5563059, 4826953, 5463069, 1566678, 541593, 2914918, 7028118, 8370746, 7679217, 6797258, 4310229, 6733543, 8345800, 4855385, 3311397, 4214073, 4681590, 1405347, 2389655, 4576062, 7882220, 1343754, 806411, 2380852, 6429000, 7435817, 4957501, 5341201, 6297499, 2890527, 2011093, 21310, 5700341, 841146, 8279775, 340212, 2680433, 1567370, 4642738, 303715, 4588000, 954357, 7516688, 8000308, 556711, 4268428, 5886087, 3776328, 580829, 741653, 6521910, 428588, 1757914, 1139556, 1271591, 4188187, 6297919, 6353457, 7341873, 278666, 5528714, 677493, 4047885, 5211164, 460313, 4838531, 5416498, 4255889, 352929, 4653492, 1987430, 6049580, 1458005, 8193420, 1792292, 2396156, 746899, 3059757, 4599053, 4865764, 5673810, 2038311, 4571590, 7372586, 4876261, 8071400, 4559103, 6901679, 624876, 1213250, 742439, 2479535, 1549580, 289996, 1313746, 3908492, 177856, 2327638, 1032168, 3965419, 3912586, 6274256, 8064117, 7693571, 2227183, 5233998, 6081526, 4125049, 4205008, 6245446, 4989174, 4756686, 4754689, 6807733, 6823531, 7483161, 7968599, 5242428, 1022758, 4789184, 1307995, 2941868, 4931754, 2648399, 6418737, 6107576, 6934174, 3953296, 1605391, 5714599, 7731621, 664488, 3905933, 7160889, 4497990, 5533702, 7110104, 271063, 5213343, 4463503, 2595379, 1931811, 5407974, 4969152, 1632291, 192338, 5755592, 1983978, 5285768, 1727524, 2059836, 6943241, 6399420, 2871854, 5887442, 2239281, 1465831, 4131430, 1679158, 2405048, 6523086, 6550805, 3244215, 7601208, 421742, 2936723, 7112409, 8209256, 3077784, 2083140, 7404341, 4908914, 5434008, 5633404, 7786380, 8359734, 5078553, 3574842, 5183944, 5168399, 7576959, 3046320, 5326144, 812211, 2521821, 70281, 3652862, 1316446, 4268779, 213728, 2742134, 8169717, 7122314, 6988423, 8188830, 2635151, 3322441, 447858, 6604062, 7056063, 259486, 5180678, 71719, 3264409, 5105519, 7159750, 2895699, 1886054, 4336827, 3206814, 403513, 6124791, 4011655, 6089387, 6491744, 3755412, 7959812, 2305185, 4196510, 476005, 7017372, 5569865, 7869276, 2039186, 5911566, 2788260, 4261141, 1821972, 1070017, 6217892, 3551698, 4795379, 5276771, 7586695, 693071, 2086599, 486413, 1381675, 4885130, 8107909, 6881652, 6204729, 8280695], -[2740558, 6007420, 5931055, 3757377, 4836138, 1153006, 6299113, 3461788, 5064364, 569408, 8372554, 190217, 6097114, 3008661, 2112942, 82738, 1276154, 1966472, 1938665, 7246408, 1073679, 2933814, 1457256, 6289817, 3826805, 7639036, 5350343, 3728907, 7642821, 2773085, 5252979, 3057399, 5468748, 8296319, 711073, 7715033, 2316303, 8234947, 7469703, 5504742, 1318870, 2922622, 7346586, 3268244, 674219, 236064, 6836303, 7855566, 7879841, 6595193, 1137709, 5241045, 2598324, 8239992, 895805, 6894915, 2720984, 8089166, 4585445, 6821666, 2561605, 7661466, 802337, 2176308, 2909778, 3769173, 1747219, 929744, 841772, 6080274, 6280146, 2311762, 6706492, 7758854, 2188454, 5796404, 980090, 1869249, 1207571, 3311941, 5370119, 8084918, 1484540, 45463, 5986119, 6326972, 2010474, 7700452, 7718070, 5297611, 1200191, 4691459, 6852797, 2486225, 6566935, 3376701, 5975809, 377562, 2992119, 5719154, 124600, 2943199, 3413505, 1425224, 2725132, 7893790, 5595022, 7183179, 4625579, 6637220, 1631762, 1928133, 6477320, 7806910, 2717772, 5929833, 5015383, 783423, 7402750, 2839553, 3898789, 4974710, 8141495, 4799249, 2006912, 724091, 750616, 7305541, 1591726, 7032262, 5929214, 3044429, 2275181, 7410196, 4512554, 7175004, 1382107, 1892427, 70705, 1405835, 8139617, 681538, 749601, 2232634, 114926, 4179290, 7854703, 1388165, 8079205, 8327207, 2994361, 3891772, 805615, 7338727, 2844573, 5759133, 3312669, 8378476, 4664734, 5670737, 6117139, 1829275, 6808405, 7593464, 3192692, 3087762, 7842599, 6578144, 2614317, 1062150, 1448822, 6850525, 2826320, 5347356, 893851, 4484165, 2679181, 4170079, 4721910, 2846491, 2225970, 734578, 4009119, 77520, 7654280, 3307937, 5840918, 5619376, 7951570, 5161780, 1134456, 600687, 322360, 3536660, 3682804, 4157579, 7668199, 1051423, 6101819, 6776780, 6469343, 7952995, 3227280, 7585210, 7964745, 3309652, 8036895, 354537, 7955457, 7987971, 3582070, 4043344, 4978794, 2047527, 5015155, 2530610, 38094, 2223339, 3229095, 3311427, 1704174, 2833717, 1373175, 7807854, 4081255, 350182, 4915976, 3230180, 5088915, 5741123, 46999, 121157, 4548605, 588756, 3058131, 6996734, 4551432, 2863900, 7114999, 7266464, 6997285, 3047639, 4775476, 2536921, 1591924, 1680287, 2863275, 7545606, 3598853, 494536, 1700688, 3072121, 8273145, 4126345, 265812, 420685], -[1165919, 6792252, 7240530, 4959656, 7163769, 2479424, 2718388, 1386148, 6409065, 7204479, 7296445, 5064342, 6282509, 4909954, 6871562, 5062845, 518937, 7356614, 4700088, 6303549, 4120112, 1333609, 1446582, 3218123, 6515910, 2342965, 8116360, 1756659, 2749750, 1926677, 4765515, 3638328, 1430575, 6526918, 850155, 7642442, 2623216, 2389314, 1688210, 879889, 7539894, 572432, 823102, 2467478, 1722303, 3401293, 6019979, 5433813, 3914403, 5152595, 5880294, 325362, 5271355, 5006127, 4497003, 7755062, 5100631, 6716973, 265351, 2913939, 4308357, 325767, 8190792, 894466, 6141810, 5095200, 3617557, 2951309, 7073121, 1044942, 2632184, 2075566, 5102247, 6696957, 1467228, 4257294, 2393651, 1090144, 2386338, 6445109, 1235480, 7820045, 2739734, 6296782, 6075675, 8055930, 2523514, 4311711, 5060847, 4996686, 1226351, 2161774, 5036212, 6408700, 4376534, 563574, 4662676, 5447951, 2983142, 3544127, 2461208, 472759, 5685843, 7083706, 3331054, 375277, 3011109, 3365190, 4414447, 6599023, 6948573, 1784218, 4292715, 6833878, 4919211, 3121662, 3097931, 4906453, 2299643, 1786656, 5613336, 7103175, 3505383, 7361363, 2981185, 1080002, 2745680, 2523274, 3848616, 4855259, 7094922, 1461414, 3549635, 5210298, 1721014, 7935003, 6573708, 3526772, 4933192, 3953992, 124648, 4155260, 7734044, 5363946, 2023894, 4681686, 5717705, 2923716, 4684566, 601242, 5116697, 2279072, 1543842, 7926813, 4638630, 256166, 1732749, 5274678, 7760052, 3411590, 5920789, 935214, 5145037, 3751380, 3315398, 6942899, 533029, 4365843, 485553, 2640632, 5761237, 6519995, 576911, 3394709, 373721, 1469606, 185982, 3142144, 715084, 3282875, 8283927, 849703, 7280660, 4449669, 8378649, 3856702, 5446620, 2640008, 7923696, 3764088, 4077919, 2389417, 4686682, 7841336, 33909, 4501741, 6596871, 1115218, 1185203, 6030838, 7845020, 4433028, 4556664, 6530015, 1005196, 2353210, 392023, 3200469, 4419835, 4992841, 7629986, 7999832, 7576579, 6121795, 5503896, 2573043, 3917315, 788312, 713612, 4398334, 5770590, 2956822, 4424491, 458231, 6865702, 5063751, 5533822, 2836353, 3516222, 4222171, 5731719, 72811, 2151771, 1512333, 7423126, 7295493, 3343584, 4462883, 91822, 3873232, 1596603, 35110, 3775256, 7452946, 2394580, 6767273, 5207202, 2815475, 1102982, 2456418, 4235065, 5911800, 3715809, 3195022, 1371863, 3115715], -[4684359, 1726389, 5037524, 934249, 8117290, 1152641, 7176799, 1254228, 2336718, 361783, 8374159, 2728474, 794826, 7344571, 5796677, 1009359, 859098, 5138801, 8081100, 2378654, 3694575, 8214381, 5342217, 370020, 7582105, 662994, 3512816, 1550377, 6756716, 2159743, 7249252, 6721354, 6816584, 5187092, 2721107, 857460, 48720, 5633019, 6525982, 1920049, 2487369, 1655242, 7373066, 2815839, 6544019, 3503346, 5260343, 1303673, 4963254, 1998429, 6227132, 3898913, 1776752, 1760741, 2273287, 3027083, 6344130, 2415721, 7053258, 5071739, 2087792, 2214596, 3207188, 6073888, 5658529, 7659043, 1871656, 1180339, 7936820, 2390817, 7223535, 7249069, 6960116, 2089290, 3602047, 7262913, 4490581, 3636459, 7560760, 8355909, 5454639, 2723163, 4986638, 3780579, 3923424, 6298249, 6957396, 5961486, 8291706, 8351837, 4343474, 3932534, 1458805, 485325, 4036552, 4141878, 3358339, 6280873, 4491752, 7250028, 4887072, 38558, 4537943, 6248062, 2455588, 1853116, 955796, 1330878, 6909027, 1401304, 2035254, 4475592, 887634, 2124272, 5236893, 2107170, 4939744, 3690253, 7651734, 8119111, 3001570, 5398912, 3288627, 1699543, 135877, 8271086, 1000243, 7797885, 8268800, 3895008, 5384626, 8062624, 4244947, 1710336, 3662331, 6087180, 370974, 363523, 540196, 8171400, 6272487, 1746154, 7361813, 7142484, 5787814, 546200, 4946584, 4526865, 6284881, 6763193, 999990, 6182228, 4731261, 4229709, 1616448, 1658167, 2396586, 1621394, 7557403, 378617, 2932411, 1222800, 5869494, 2644695, 7572071, 4944326, 4042873, 2475158, 317963, 5930682, 6513230, 889687, 7832116, 8290498, 8065607, 6473144, 467454, 5038534, 8204412, 8321090, 1954795, 4216970, 6141028, 2652546, 5900350, 1855012, 2192651, 6164921, 4284914, 190335, 7383182, 1733136, 4020453, 3602856, 7433747, 2513850, 2634866, 6226655, 477431, 6596145, 5962854, 795000, 1417007, 8198464, 3497585, 281115, 7680404, 2443680, 1011916, 6073087, 3873022, 575349, 7047488, 1825855, 8061791, 3809160, 7514118, 337661, 2160854, 1936807, 6092882, 8249225, 2301266, 2432694, 6716512, 1878960, 7994938, 483678, 2626354, 7627825, 1134616, 7947458, 317205, 6566968, 4853489, 5859302, 1808806, 171051, 7959527, 7386347, 4186912, 4916271, 461251, 6646770, 3215522, 6359034, 3851358, 1170290, 2206755, 3846976, 7933800, 6960327, 7172111, 6407307, 5944816, 7568740], -[1951919, 3838911, 3756090, 4942755, 6438652, 6929858, 7684883, 5183907, 4582828, 5540235, 6473838, 4907419, 4580003, 7996267, 7505446, 6555092, 5372016, 5676157, 3811224, 5517847, 7983204, 1000480, 7327668, 268376, 4955667, 3719505, 4260594, 4433529, 909440, 2309543, 1359840, 4279147, 8098083, 5090944, 2826785, 864625, 6426338, 1094149, 2029354, 2864611, 8123317, 420668, 7713287, 6512270, 1779055, 4738310, 4494405, 6792684, 2659025, 6322127, 677087, 6280009, 7186565, 1301767, 5863650, 6180101, 4046914, 3511562, 4105401, 1436770, 5793603, 7768946, 5236959, 5512135, 2909017, 624906, 6831931, 7569434, 507425, 6975685, 5424097, 7228018, 7271780, 5084203, 492976, 2336254, 4461400, 6023445, 7293537, 2046168, 294950, 2932990, 6794958, 5427879, 6623642, 4445472, 3282147, 6198310, 158050, 6526218, 3604428, 1954483, 3010578, 5181768, 6432016, 6690088, 8889, 6257876, 567394, 7698814, 4261641, 4198198, 2770662, 4907225, 1275496, 7748965, 3402169, 3182991, 1307341, 1115525, 5841993, 4642300, 2182272, 3299198, 4457, 3624241, 5678074, 4629034, 4715183, 6394535, 1935155, 1035596, 4716199, 2159455, 5403933, 5241668, 1068634, 1150354, 3205194, 7464599, 1791718, 8244971, 5083706, 3152409, 7694101, 8076838, 3378368, 448095, 7869255, 4926424, 83657, 1380730, 481498, 2743000, 875122, 1419586, 815581, 631303, 952068, 6798375, 6413567, 2374918, 406894, 5968670, 4263796, 104137, 325965, 5447613, 6282146, 334041, 8313412, 2316998, 6973486, 2982823, 7497640, 6425267, 6793901, 6579434, 8332392, 7132038, 3262467, 4615482, 1337706, 6730995, 5924950, 3389792, 6729047, 2673759, 4487644, 207968, 2738034, 1372358, 2253791, 4202256, 7081219, 1241678, 3065951, 5066993, 3067655, 1898189, 876070, 3887169, 6467499, 4280180, 1920864, 4262363, 7800923, 4324878, 3911314, 2727610, 5224718, 8281029, 3920135, 6706123, 1222965, 3515448, 3716312, 8188780, 608137, 232300, 6247915, 4788444, 2724106, 7032317, 934794, 7385469, 6250599, 6574645, 5906700, 7106019, 4970120, 4963271, 6646489, 2585467, 2009028, 4096223, 2575955, 7089876, 2901780, 5943538, 4461611, 1894205, 3498807, 1985334, 6998064, 346676, 1030117, 508654, 6346201, 3129932, 2415771, 588706, 3950754, 6073903, 81221, 2294868, 5092183, 4891071, 4958394, 6458965, 4732317, 1094442, 857111, 4854226, 6996665, 2297021]] - -t0: [[3508, 1831, -1993, -3533, 1771, -2335, -1360, -2635, -963, 3343, -2843, -4094, 2253, -617, -2890, 2147, -2252, -2223, -643, 2412, 2822, 142, 3141, -323, -735, -3192, 1875, -875, -2708, -950, 111, -3157, 1920, 800, -2940, -448, 2937, 354, -546, -1625, -1938, 3992, -1686, 2938, 1032, -1166, -3065, -617, 1402, -2286, 362, -1743, -2339, -3157, 1351, -632, -596, -266, -4087, -641, -129, 115, -3815, 1914, 1727, -406, -355, 698, -2864, -3468, 1248, 3842, -1273, 2776, -3001, 1811, 36, 1623, -3892, -674, 1495, 1950, -3133, -2602, -293, 3040, 619, 1073, -2592, 3292, -2799, -3587, -1415, -3169, 697, 199, -3862, 3819, -3688, 1893, -2258, -2907, -1935, -174, 1467, 3299, 2562, -3759, 1253, -4064, 756, -1271, 512, 2601, -938, -954, 2530, -102, -324, 2006, 3812, 2011, 1504, 3297, -30, 2579, -1676, -2542, 2372, -3902, 1251, -4015, 4094, -1424, 1044, 2572, 3867, 2890, 1901, 3825, -205, -3420, 2044, 2376, 2397, 195, -2572, -736, -2691, -2231, 1257, 3528, 634, -3748, 890, -1218, -1156, 2832, 4012, 212, 2313, 2965, 3524, -3827, 902, -360, -3271, -1362, 2313, -391, 2171, 345, -893, 3765, -2557, -385, 2233, 2199, -2411, 561, -2363, 250, -1129, -560, 3914, 3152, 928, 1745, -678, 456, -1427, 3253, 732, -3376, 3100, 2630, 1300, 715, -961, -2899, 4074, -2289, -66, -1680, 76, 882, -159, -1231, -1142, 3242, -1426, 307, -4035, -1761, -1208, -3038, -1070, -1214, 496, -2152, -2071, 929, 772, -1963, -231, -236, -3605, 3247, 1713, -2932, -2316, -740, -3517, 3818, -556, 425, 2957, 1612, -4054, -2629, 2909, -3869, -1525, -3075, -895, -2688, -3666, 2358, -4057, 3357, 1420, -2656, 1598, -2058, 3073, 3245], -[-3295, 509, 1684, 1955, -2304, -1130, 305, -445, -1374, -1604, -1660, 2270, 1980, 691, 1865, -995, 2006, 921, -1434, -618, -1478, 3313, -2102, 1237, -281, -1848, -2471, 1829, 3385, 3958, -3677, -2409, -3266, 1516, 266, 3595, -3020, -1720, -2519, 1341, 17, -2149, -1249, 4053, -3266, -1291, -2630, -2337, -3852, 1649, 2698, -2126, 611, 480, 4085, -3568, -3276, -345, 396, -3961, -184, -803, -3819, 1078, 2604, -3366, 868, 1831, 2075, -1729, -3535, 1841, 138, -886, -2443, 1037, 1052, 1561, -2941, 1586, -3951, 673, 436, -3226, 3884, -171, 1420, -1756, 4092, 1427, -4051, 3341, -284, -3246, -1497, 454, -214, 2021, 2280, -3841, 4015, 2284, 834, -3033, -2641, 1292, 3276, 3026, 908, -2368, 1110, -24, 491, -3190, -816, 3189, 1283, -1041, -690, 3062, -3719, 2512, 3142, 246, -2866, 3329, 181, -405, 3865, -2217, -452, -1242, -3136, -2725, 940, 170, 2383, -3791, -3656, 3742, -3440, -241, -3417, -1627, 936, -1651, 1081, 582, -4090, -552, 727, 3231, -1137, -1485, -1501, 1254, -3392, 2083, 3922, -3384, 1514, 1928, -988, 3644, -3575, 1468, -3538, -2606, 2865, -537, 2662, -202, -3400, 2254, -2795, 183, -968, 3950, 3987, 1753, 872, -2408, 2372, -1227, 1906, 2712, -2692, 3980, 3894, -487, 3130, -1592, -753, -641, -1104, 1344, 1203, -1315, -3447, -770, -2466, 747, 736, -2186, 2293, 3466, 647, -3170, -2673, -3511, -2702, 1310, 2751, -2658, 3334, -2009, 3993, 1903, -58, 3923, 1894, 3259, 3742, 2105, -2825, -2425, 2731, 3680, 3476, -2812, 3233, 2206, 869, -3172, -695, -3236, -622, -3058, 2980, 1301, 3348, -3135, 164, -3630, 3059, 1123, 903, -3249, -2361, 3085, -2773, 2698, -2171, 372, 3385, -1417], -[-3762, 2684, 47, -2751, 2858, -2066, -535, -3428, 1708, -4032, 330, 1801, 2266, 2197, -594, 818, -1798, 392, -2839, -3512, 527, 1078, -920, -1639, 1141, 4092, 967, 1547, -315, -4003, 1907, 1783, -3508, -2177, -1631, -1831, -2033, 1987, -1401, -282, -42, -1922, -1638, -364, 2475, -1504, -4017, -562, -863, 633, -979, -1835, 1460, -1160, 2877, -2749, 1240, 3662, -2075, -2270, -2491, 1946, -479, -2764, 1618, 853, 2323, 4048, -2004, 1810, -3118, 1618, -2756, 1030, 1190, -3532, -2950, 1473, 3347, 2373, -3833, -586, 1788, -3689, -2233, 2748, 3434, -28, 1206, -2613, -4033, -2557, -3907, 4049, -3049, 1597, 3841, 730, 2039, 1138, 1720, 2271, -2559, -184, -2804, -3298, -114, -1205, -2901, 1700, 1554, 3013, -2552, -66, -1972, -1175, 1879, -3009, -2818, -3071, -603, 2166, -1353, -1263, -128, 3195, -3048, -1723, 2478, 3526, -1794, -2995, -2195, -3564, -1238, -1188, -2341, 75, -3023, -3189, -3231, 1602, -4063, -3782, 238, 1370, -1425, 3717, 1893, -4057, -3911, 572, 2799, -1305, 1949, 157, 3101, -1940, 3486, 1873, -2285, 2459, 853, -520, -2188, -622, 2855, -32, 1069, -2810, -1162, 2013, 80, -2020, 923, 3141, 397, 351, 3318, 3867, -2254, -2702, 3231, 3792, 2952, -1631, 22, -336, -2862, 820, 3960, 2671, 2872, -2284, -3596, -3957, 487, 2847, -1221, 1996, -2337, -1437, -368, -582, 2121, 84, 543, 2281, 1025, 771, 2166, -3504, -1942, -473, 1651, -718, -2866, 3307, 1447, 1859, 238, -715, -3081, 878, 1639, -2074, 776, 2532, 1683, -1469, -2153, -1723, 2045, -1068, 2515, 766, -3320, -3300, -3849, 160, 1317, 215, -460, -2599, 2676, 927, -3925, 774, 2565, 3016, -3248, 121, -775, -2423, 3668, 2893], -[2655, 1084, -1198, 3496, 3961, -2752, -1356, 1700, 2921, 3711, -2627, 1686, -755, 2946, -1526, 189, 2841, 198, -2120, 3901, -464, -1687, -3402, -1333, 3270, 53, -1912, 3571, -2762, 1557, -2229, 1080, -3025, -2106, -1813, -694, 1776, -2750, 658, 3345, 3254, -1008, 3902, 1686, 1983, 1613, -1141, 2517, -1373, -173, -1562, -2318, 3899, 815, -405, -2762, -2985, -467, 3207, -2413, -635, -1913, -1208, 1538, -2190, -224, -3307, 2189, 3425, -3634, 2552, 2990, -1369, 4093, 860, -2546, 1587, 608, 2466, -1995, -1512, -3315, 3606, -2866, -2789, 3194, 378, 2719, -1809, -434, -2449, -914, -1868, 2556, 2006, -1674, 1428, 271, 1254, -3009, 3608, -2377, 595, -2374, -3090, -1555, -3547, -1722, -1041, -3729, 1757, -1638, 107, 1750, 4011, 510, 1355, -555, -2309, 800, 1816, 711, -793, -3245, -703, -1342, 1360, 138, -1624, -2597, 650, 3238, 2499, 186, 694, -3045, 3724, -3980, 1608, -2744, 1768, 1916, 796, -1814, 470, 4054, -311, -828, -1258, 3226, -3303, 1696, 3746, -3043, 1958, 2214, -3955, -970, 2228, 3718, -2027, 1326, 461, -556, -2362, -3917, 549, -493, 2225, 2808, 2261, -837, 3471, 3221, -3111, 3238, -2434, -3584, 2380, -2117, 1815, -2265, -2028, 1413, -1767, -1730, -1060, 2184, 2032, 3960, -1697, -2647, 858, 1592, 1141, -3859, 2311, 1106, -2637, 1526, -2916, 1156, 1912, 991, -2420, 2106, -1193, -2603, -3845, 3913, 3234, -3752, -1021, 2371, -1128, 755, 1539, 1880, 908, -770, 3422, -490, 811, -521, 806, 1095, -3970, 1921, 1854, 3291, -2681, -917, -2725, -3187, 1174, -3579, 1248, -1757, 1710, -1584, -837, 2342, -1256, -1774, 2516, 681, -2910, -2573, -2938, -1182, -199, -2824, -3359, 142, 3799, 2755], -[-1465, -2123, -556, 361, -982, -2431, 607, 852, 1998, 1335, 1935, 538, 202, -3653, -3259, 1743, -1062, 2417, 3788, 2974, -17, -2195, 1033, 1380, -3687, -558, -1552, 2089, -1684, -2945, -668, 3914, 840, 1556, 1363, -2700, -432, -3077, -3042, 3121, -2999, 458, 266, -2209, -1389, -2830, 1079, 1145, -1098, -419, 1212, -479, -912, -539, -4089, -3957, 3522, -919, -54, 891, -1168, 2756, -4076, 3616, -2143, -477, 3880, 691, -1228, -1247, -1809, -851, -3084, 330, -2433, -3391, 1365, -789, -456, 69, -1233, 3419, -2290, 4067, -544, -1399, 2388, -2290, 1402, -4003, 1714, 374, 629, 1997, -2104, -3274, -381, -2391, 2536, 108, -3552, -2402, -425, -2434, -2012, 1724, -2668, 3774, 3171, 472, 3638, 2760, 2898, 2544, 2205, 1826, -32, 3853, 406, 839, 3298, 384, 3635, 3799, -3387, -2834, 819, -899, 3072, 3808, 2482, 1696, 1491, -1792, 507, 524, 2334, 3075, -476, 3976, -2585, 1258, -2795, -940, -3930, -2664, -1384, -3311, 1617, -3399, 566, -2732, -3715, 2637, 2624, 3383, -3670, -622, -3813, 1785, -325, 2192, 4022, -1321, 2663, -3642, -3975, 1174, -1525, -326, 590, -3241, 564, 194, -3513, 1464, 510, 454, -3972, -1982, -3093, -1910, -2972, -1662, 2110, 3620, -2805, -3655, 498, 1919, 2190, -3568, -1819, -1624, 3603, -1094, -2958, 735, 2295, 1585, -922, 376, -209, -1728, -399, 2587, -3692, 2464, -3892, 2815, -1794, 1909, 2368, -961, 863, -120, 2054, 1789, -1834, 3495, -1966, -119, -686, -330, -928, 2992, -454, 350, -3278, 1073, -4072, 1218, -2283, -3016, 3825, 2022, -1626, -981, -3097, -2837, 800, 1071, 2499, 3058, -3934, 2042, 1118, -1166, 3107, -3264, 3944, -2873, -4081, 1163, -2576, -668], -[2223, -3137, -4038, 2979, -260, -574, 787, -1629, 3500, 2443, 2158, 411, 675, 875, 1574, 1492, -1936, -899, 1944, -3561, -3996, 1056, 4020, -1960, -493, 337, 754, 1657, 128, -601, -32, 2923, -3805, 3712, 545, -3727, 3810, -3579, -2262, -2589, -3147, 2876, -3577, -370, 1391, 3334, -3003, 1516, -3375, -2097, -2849, -3255, 2181, -761, -1822, 3333, 66, -2806, 1209, 3170, 1859, 2930, 2271, -1081, 857, 2314, -197, 26, -479, -3899, 993, 2674, -2716, -3029, 1456, 1534, -3240, 2325, 2657, -1832, 38, 254, 3790, -3417, -3686, -2784, -2845, -3034, 2402, -2806, -52, -3405, -4078, -3768, 1296, -2776, 697, -812, 2146, -1666, 1801, 3894, 1766, 217, -2456, -667, 2489, -3697, -3379, 1413, 1097, -2564, 3200, -2178, -3735, 3377, 1018, 554, -3409, -3417, 1843, 3404, -2393, -3233, -2787, -1212, 3674, 3474, 2122, 1687, -2330, 3819, -3526, -1511, 1813, -474, 3264, -2465, -3257, 3032, 1737, -3718, -1830, -1320, -1422, 2370, -3619, 519, 1796, -985, -769, -762, -2706, -3298, 3956, -2359, -1715, -67, -1118, -1831, -1468, -1338, 2094, 935, 1960, 2739, 2733, 1258, 1128, -3194, 2051, 3386, 2410, -2829, 2134, -1696, 3415, 3167, -1572, 3168, 1906, -3898, 991, -240, 3331, -3506, 2143, -3855, 3847, -2355, -474, -4031, 4011, 3956, 3936, 2523, 2139, -498, 3730, -326, -1778, -1083, -3833, -3125, 2357, 1080, -2856, -3220, 1929, 2924, -2581, -3876, -3830, 3581, 906, -3715, 103, -3531, 268, 3555, -2424, -1081, 2777, -3205, 1988, 223, 3667, 3796, 1812, -3854, -3029, 1853, 823, 2870, 2096, 2612, -2075, 750, -2599, 588, -869, -1118, 2210, 3631, -699, 1108, -3241, 447, 2234, 3669, -2659, -3286, -3049, -3630, 697, 3261]] -t1: [[101, 250, 851, 942, 660, 945, 832, 665, 525, 564, 684, 119, 743, 639, 521, 589, 853, 993, 965, 259, 270, 243, 792, 179, 477, 52, 347, 688, 373, 451, 863, 629, 829, 771, 638, 599, 322, 764, 562, 43, 327, 78, 146, 617, 146, 927, 733, 999, 966, 651, 848, 353, 309, 1006, 111, 257, 832, 59, 372, 530, 442, 31, 277, 754, 914, 49, 106, 143, 222, 496, 657, 371, 58, 821, 99, 366, 345, 279, 144, 88, 297, 105, 326, 652, 793, 670, 528, 92, 233, 571, 828, 915, 654, 775, 889, 173, 678, 647, 565, 79, 385, 994, 173, 633, 532, 100, 617, 422, 842, 46, 81, 828, 424, 443, 727, 821, 140, 483, 687, 932, 452, 213, 944, 454, 101, 110, 4, 705, 203, 855, 827, 1020, 708, 207, 70, 822, 400, 342, 857, 670, 647, 575, 180, 1017, 535, 1012, 779, 148, 15, 926, 459, 937, 550, 120, 1008, 127, 800, 725, 868, 478, 756, 564, 624, 791, 185, 731, 362, 263, 110, 955, 529, 896, 897, 347, 707, 528, 654, 314, 970, 885, 654, 256, 795, 353, 188, 301, 276, 845, 96, 875, 475, 830, 594, 591, 667, 317, 469, 376, 981, 673, 754, 879, 174, 40, 750, 148, 942, 956, 795, 314, 468, 582, 562, 541, 174, 966, 392, 965, 641, 473, 484, 361, 783, 649, 576, 361, 777, 442, 77, 216, 721, 648, 950, 779, 692, 370, 904, 135, 887, 689, 721, 566, 644, 461, 872, 946, 328, 639, 686, 714, 740, 376, 755, 183, 512, 669], -[561, 629, 565, 978, 298, 262, 623, 805, 240, 693, 259, 172, 18, 679, 589, 667, 191, 66, 356, 858, 1022, 937, 830, 526, 822, 1019, 593, 404, 514, 571, 172, 292, 559, 962, 164, 98, 291, 785, 908, 605, 652, 769, 353, 245, 3, 696, 103, 1011, 42, 327, 191, 567, 37, 560, 116, 918, 977, 68, 521, 719, 461, 71, 91, 796, 52, 215, 139, 155, 511, 769, 776, 896, 34, 675, 83, 494, 636, 56, 591, 661, 520, 43, 568, 243, 738, 178, 1000, 219, 292, 91, 374, 561, 594, 693, 249, 558, 900, 595, 985, 557, 842, 76, 148, 91, 303, 189, 35, 160, 477, 22, 284, 126, 484, 478, 766, 984, 939, 272, 639, 742, 504, 513, 762, 609, 581, 580, 831, 833, 913, 973, 640, 125, 585, 160, 359, 602, 323, 784, 746, 846, 483, 196, 698, 944, 81, 477, 874, 549, 676, 868, 33, 636, 545, 317, 236, 660, 607, 199, 23, 703, 242, 645, 211, 251, 848, 781, 351, 719, 273, 179, 504, 205, 294, 796, 800, 396, 928, 51, 358, 868, 1002, 376, 254, 904, 599, 663, 688, 950, 1020, 620, 436, 633, 631, 925, 372, 650, 99, 308, 9, 446, 161, 521, 26, 335, 997, 869, 853, 1000, 322, 406, 55, 806, 861, 32, 632, 9, 398, 623, 874, 353, 230, 529, 391, 49, 748, 490, 743, 792, 458, 972, 281, 512, 58, 857, 680, 961, 249, 722, 340, 520, 222, 131, 759, 434, 585, 644, 926, 85, 255, 59, 169, 596, 990, 840, 757, 1011], -[335, 733, 724, 459, 590, 141, 769, 423, 618, 70, 1022, 23, 744, 367, 258, 10, 156, 240, 237, 885, 131, 358, 178, 768, 467, 932, 653, 455, 933, 339, 641, 373, 668, 1013, 87, 942, 283, 1005, 912, 672, 161, 357, 897, 399, 82, 29, 835, 959, 962, 805, 139, 640, 317, 1006, 109, 842, 332, 987, 560, 833, 313, 935, 98, 266, 355, 460, 213, 113, 103, 742, 767, 282, 819, 947, 267, 708, 120, 228, 147, 404, 656, 987, 181, 6, 731, 772, 245, 940, 942, 647, 147, 573, 837, 303, 802, 412, 729, 46, 365, 698, 15, 359, 417, 174, 333, 964, 683, 877, 565, 810, 199, 235, 791, 953, 332, 724, 612, 96, 904, 347, 476, 607, 994, 586, 245, 88, 92, 892, 194, 858, 724, 372, 278, 905, 551, 876, 169, 231, 9, 172, 994, 83, 92, 273, 14, 510, 959, 169, 986, 1017, 366, 475, 98, 896, 347, 703, 404, 1023, 569, 692, 747, 223, 831, 927, 390, 377, 957, 803, 319, 130, 177, 836, 345, 653, 109, 547, 327, 509, 576, 347, 272, 90, 489, 9, 934, 404, 713, 686, 971, 630, 138, 73, 39, 432, 450, 508, 936, 128, 745, 827, 790, 971, 394, 926, 972, 404, 981, 43, 971, 975, 437, 494, 608, 250, 612, 309, 5, 271, 394, 404, 208, 346, 168, 953, 498, 43, 600, 394, 621, 701, 6, 15, 555, 72, 373, 854, 556, 350, 869, 887, 854, 372, 583, 310, 194, 205, 350, 921, 439, 60, 208, 375, 1010, 504, 32, 51], -[142, 829, 884, 605, 874, 303, 332, 169, 782, 879, 891, 618, 767, 599, 839, 618, 63, 898, 574, 769, 503, 163, 177, 393, 795, 286, 991, 214, 336, 235, 582, 444, 175, 797, 104, 933, 320, 292, 206, 107, 920, 70, 100, 301, 210, 415, 735, 663, 478, 629, 718, 40, 643, 611, 549, 947, 623, 820, 32, 356, 526, 40, 1000, 109, 750, 622, 442, 360, 863, 128, 321, 253, 623, 817, 179, 520, 292, 133, 291, 787, 151, 955, 334, 769, 742, 983, 308, 526, 618, 610, 150, 264, 615, 782, 534, 69, 569, 665, 364, 433, 300, 58, 694, 865, 407, 46, 368, 411, 539, 806, 848, 218, 524, 834, 600, 381, 378, 599, 281, 218, 685, 867, 428, 899, 364, 132, 335, 308, 470, 593, 866, 178, 433, 636, 210, 969, 802, 431, 602, 483, 15, 507, 944, 655, 247, 571, 698, 357, 572, 73, 625, 278, 188, 968, 566, 31, 212, 644, 947, 416, 723, 114, 628, 458, 405, 848, 65, 533, 59, 322, 703, 796, 70, 414, 46, 179, 23, 384, 87, 401, 1011, 104, 889, 543, 1023, 471, 665, 322, 967, 459, 498, 292, 572, 957, 4, 550, 805, 136, 145, 736, 958, 541, 556, 797, 123, 287, 48, 391, 540, 609, 931, 977, 925, 747, 672, 314, 478, 96, 87, 537, 704, 361, 540, 56, 838, 618, 676, 346, 429, 515, 700, 9, 263, 185, 906, 891, 408, 545, 11, 473, 195, 4, 461, 910, 292, 826, 636, 344, 135, 300, 517, 722, 454, 390, 167, 380], -[572, 211, 615, 114, 991, 141, 876, 153, 285, 44, 1022, 333, 97, 897, 708, 123, 105, 627, 986, 290, 451, 1003, 652, 45, 926, 81, 429, 189, 825, 264, 885, 820, 832, 633, 332, 105, 6, 688, 797, 234, 304, 202, 900, 344, 799, 428, 642, 159, 606, 244, 760, 476, 217, 215, 278, 370, 774, 295, 861, 619, 255, 270, 392, 741, 691, 935, 228, 144, 969, 292, 882, 885, 850, 255, 440, 887, 548, 444, 923, 1020, 666, 332, 609, 461, 479, 769, 849, 728, 1012, 1020, 530, 480, 178, 59, 493, 506, 410, 767, 548, 885, 597, 5, 554, 763, 300, 226, 117, 162, 843, 171, 248, 546, 108, 259, 639, 257, 603, 450, 934, 991, 366, 659, 401, 207, 17, 1010, 122, 952, 1009, 475, 657, 984, 518, 209, 447, 743, 45, 44, 66, 997, 766, 213, 899, 872, 707, 67, 604, 553, 767, 826, 122, 755, 578, 516, 197, 202, 293, 198, 923, 46, 358, 149, 716, 323, 924, 604, 494, 302, 39, 724, 795, 109, 956, 1012, 985, 790, 57, 615, 1002, 1016, 239, 515, 750, 324, 720, 226, 268, 753, 523, 23, 901, 212, 491, 440, 907, 307, 322, 760, 58, 805, 728, 97, 173, 1001, 427, 34, 938, 298, 124, 741, 473, 70, 860, 223, 984, 465, 917, 41, 264, 236, 744, 1007, 281, 297, 820, 229, 976, 59, 321, 931, 139, 970, 39, 802, 592, 715, 221, 21, 972, 902, 511, 600, 56, 811, 393, 776, 470, 143, 269, 470, 968, 850, 876, 782, 726, 924], -[238, 469, 459, 603, 786, 846, 938, 633, 559, 676, 790, 599, 559, 976, 916, 800, 656, 693, 465, 674, 975, 122, 894, 33, 605, 454, 520, 541, 111, 282, 166, 522, 989, 621, 345, 106, 784, 134, 248, 350, 992, 51, 942, 795, 217, 578, 549, 829, 325, 772, 83, 767, 877, 159, 716, 754, 494, 429, 501, 175, 707, 948, 639, 673, 355, 76, 834, 924, 62, 852, 662, 882, 888, 621, 60, 285, 545, 735, 890, 250, 36, 358, 829, 663, 809, 543, 401, 757, 19, 797, 440, 239, 368, 633, 785, 817, 1, 764, 69, 940, 520, 512, 338, 599, 156, 946, 415, 389, 160, 136, 713, 567, 266, 403, 1, 442, 693, 565, 576, 781, 236, 126, 576, 264, 660, 640, 130, 140, 391, 911, 219, 1006, 621, 385, 939, 986, 412, 55, 961, 601, 10, 169, 59, 335, 107, 173, 100, 77, 116, 830, 783, 290, 50, 729, 520, 13, 40, 665, 767, 41, 1015, 283, 851, 364, 915, 784, 829, 803, 1017, 871, 398, 563, 163, 822, 723, 414, 821, 326, 548, 25, 334, 168, 275, 513, 864, 152, 374, 619, 374, 232, 107, 475, 789, 522, 234, 520, 952, 528, 477, 333, 638, 1011, 479, 819, 149, 429, 454, 1000, 74, 28, 763, 585, 333, 858, 114, 902, 763, 803, 721, 867, 607, 606, 811, 316, 245, 500, 314, 865, 354, 726, 545, 231, 427, 242, 854, 42, 126, 62, 775, 382, 295, 72, 482, 741, 10, 280, 622, 597, 605, 788, 578, 134, 105, 593, 854, 280]] - -tr: 2077582102F6F313C22564F8414E3766704FFD18017FDCAE570DB8C8FCB567E413219CB4B45175B83E6BA5E322A112D18CF9F356B57697230350D2591EE02AD2 -pk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F65E833B5EB94C60E74A60DD2C8EA1DE7FE99609355875FFC400ECD83F12CDDD1B015AC750DF7759D3D0FECE79542F12BE30A473921499A927CDEEDF9C62F0A755835B9FF464040EF409784BA7D5091BC92C7A0C623DEC017E95C3AD43C865B595D04091629A56114A3197B0A2117E9ECC8F3E48E1E9C772BA61E5AE3138189DF4A9E149291A6694ABB1005CFA8ED766DCD8C8CF72AE9C45503BB7165B84140B0CB5CBD33FFC43E6384CD905995B5A787FE484BFE17D2BF30250F78BE5CEA26E201FF1F20574BB677F4D208E7C5B96CABD6416EEC1E21E0816F352C848EEAA47CDD8E02B47158BCB44451D360ACBD9DCF523EB9694FD5E1557DA8F2BEED0A0AEE52E23AEF1BEB449D913276E88AF188151F6876E4A5F570A240A695B06E4D60132DA2B62F4CAB5C881F7277ACD1DA48687368CB8ED49FAE2A4B2E5EF3DE0260A731D659A3F42A19F466C9F0D43A102B129CDAE4A6BF084196D6FEA7EEB38336EF1F256502EEC80A492F0A4F8A182345CC78978C061C563D03E07AC6FC2A1CF5CB8D25C04887E5D11391E0B3CD1DB105C7345CB3C826FF058C30E0228C3A857B7CE2F064A508AE80E33CE2CA82FE36246D61578C52D69A8F8B844F997D8B4A3341C9162FF5320228DD59C0911FE479E72FF6AB43F4A7B9F805A86F984512F973D091370F681F49827296964341ACAED3E311A32BEC5174A77689A4921D029F21F6C40EA55F1E73C1AFF2143ACD3E5037FCD5B311CD825F3326710C3263A0CF6016D9EAE3E50FE2575E0AABEDFCB3495B9E77764E97A263D094806FA124A8C153E5975D35FA42597683C95D838067028EBDA97658E64478580CECAA772EC6CA319F11803A648D6AF0F9484B1582DE0C72AF6C4912EA7915FFEC900A95DE235DEFFC4F754BED724E3612F0696A1AE1FF05E8BE2590029CC0D34EDD8398250BC0D391DEE871A54F15685D9CD67F85EB1BB50F39A8A19415F863527430F4EFC297BC08A03DB9DF86D24C6D0F63D0399D2E86426331574D1C6798FBAF4633CFBE10B17890330965906E5F8B01DB125C0FEBAE1F3A498F45BF243267D9BAD096AE0F9C159A2B4D11BF6ADB35AA7CCC3A17E7CE14B5648281F856DC7D29BE92F560C105DFC2684D2D5D16257E22DBA99C93002BE24FC145440EF8F77B2ADAE7EFD6766200BED5AF94FD9F23ADEB7EF3F3E786E5D5FBC83F09120BD15935DAC68847F507E4561069915E02A65396ACABCBDBA9481227C0261C7FA80392EECE162FAF98E7CC5356FD0ACB3F5F9B7B60EA43664D053CA41865D068854AEEF2AD80A5626DF66AC0032B225197D52C7A55F6DD56D375A44DC234E355E6B7F100CD5DF2E307C20C8EF44C77976ABFC4542A0EBFBDB79AFF5E79B49A3F08EE63C0F78D124B621B7BF4BD3550AD63246FAF748C46E94091E4CC1A981B41464BD27CF6EDA5DED5E92C0A838E59E2EC6FD20C02590EA2807E1BEEBAA91B5A5F0312543F6FC63C0B82241532D2C497ECEE54C0E65E4F93836A8A690942673A6C61113966CA566C2CE9606BD897B900D7661B9A0CB5360C0A8D655F7A5D999136AD8ECDDAE06C11F2144DD64529B62CB1F1294DF222BFA6E5780FEC07FBA3F7ECA86B593C2611A745BC206FE307D4103A3B68D3CA41A77295411D44853B08F52BC74678E6C22C1700764564F3A391F787FF5F97A950C72F271F493CF64E808925231209B8BE77C862C77B7C04C3611C86397AF49DAF0BAA4EDE81714586C0A6C5210E46AB49AA56AD0DC86B0207E5A2F8DE9885B84076C310D09CE324E9CC275687B054A0B4C619760A5F3C4E73A61CDF37C276261DB1E07F5361044EEC1E69CCA9BD48C3ADCF680B9E47D15A2F39235437CD40E7C9541A06C0DAB13A30294338561FB326E8275ED2832F77D95C63915C069FD4F59AFF388458B9B39E4E0E24C9932477DD52FF83DBDD24F2B639FF9A32156673DF051C35B6F4F32F2178B2ECD09E7E9AFD4B62DD5516A0E2BE2C895387284BAF828F886C0CF467405B0A67FAF76E4D1AD93311C8AF07EEF16F1729F60646F3DBB92DB02044F9FE563338DAC30EC1658AFFEAACC7BC4212588C322519B3B90B6655C2EC509C73E99E4B2750BB711BBCD39FBDC5399CA93EFEEF0CE82E51D08AC350BC0B5E503835EBE1B6F84C42E1AB43C9D886D14AFAAB89A0BA4A7C949B9D115C7F837D7495A780103BE8BE9F514A349703FD0E418DBE88F227880CE5B2DD54C0BCE1FF6189C3CA89216CDD230D5987BCD46C3B6C2DE7EE54B7DC96123BAD7A9E2F926AF1952F424F39C890D61A9DA8CFEBE177085D1A8760876F68648A82DDB799951A101B828F57E0CFE0FAC6D9085962CF45113CC5BF6D7FC2ACBCEEB556DF2BC3D2FE67A863312134E73E506DA9DC78B7C94347217EABB73E2498D5F3A5297F1859BD13748CDB3B70E51971CC01F05B04EB080228D5959CC8FE5961A02092EC8D0A4D16806EB5D60864C3ECF801244294022A0823873DBE8DFB6D06B6BAF69CDD107C960AA4B2C3536BB442461374F8FCB04832648B60032864FA6F0AF76F34355B9343DCF3C8F99FEDD88CA3D83CAD67351B4562064EA1325180606362D79A76A1B3C676152BA80E82B843D85D537ECEFFDDCC95B4661CFA4A70B06F924D692D87E1FB8E1CEDD85F7AB9324FF5D0A753D862591BE239ABC963B50A7EF870B05F2721215EB90A60E466955D522CA4216944693546 -sk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F9B2E348E4865616680FC184376A8CCB8DBE598365A23A2723944F5351F42F4742077582102F6F313C22564F8414E3766704FFD18017FDCAE570DB8C8FCB567E413219CB4B45175B83E6BA5E322A112D18CF9F356B57697230350D2591EE02AD2654515841323222580321040120642608376188550176634731510683333264078287615325127243053385335764750651411352886412447441854656426582177856811385002136841863785472614485644207284863746275116021244362472076432854217184010421775184164585148086710348507315328027533632554457272072637135303018607528446155853611235027221854501562400845348268740118636423130112600008304711528547310530448635743456714114736044238013601575856425814675633201646054071686605736211151076637413357714200555148206328275448486820815273068581865813888742410733578478145575784510487413488666062634876800164637016836408303211676660763637808356747017075160431237863706556044582355114760786272844564615514502882771488685156518416550255351116131380722168040207817541321026105332372513588560486666763605153400686036781773532303584585585382556145873231702651821601615475613435453205253646503075124375016318314624232777663801878426424837807747444530335743840253724533076811415126522320801307361222364261376300384861833134623305050075166418506205175868745534514330687281118860016350371186663328188310830745273650720105182737223725385635305211024178613826583774831043548113617260264885057838040760302110701821740681056880326375664382264012811160478503288344266741722267083004322170545055376528862025654274506414127738251184766185614737488047085880182412045436442130811456752843202150138755727608856482622838424402844587233774173341673110070483014068730277187116367374840580222778655865752756186171868068267623570340728087440262064413321784407530432675404153510222801127828578286328620245514484038018554816208205504456242220260650730645146723062131036724555002752342572057672566440784215365574084145012466856044503712682574544182267478348533103222153480526415458043351332432388544762882581714034065842506052121857400516021227658746582612353405307057267338344888677344061742714328142333252663347632168324801205742564851867411268402233626284578365081135203388317585381768678341467536821887133776615067477507772088788475223160138804715728535786023260646826021885712306281647812062372811286363611046727808057720442776132781067716352488361062733251866054685857840457420542023545155765377857084582244508465135035172458261816554334254317166171313824372288330486348830232135368717232633204480245362724325702261536128252007641320831467776802114887488465410826053602543010762601427424208671532371636210147224850133520033281870045574587735040533704783165412680078731157477051152614324517581088431785417275162632401473321083815678856545746776374874304800626007433863048305242168847128485157785460127241373680123031320510753557476455618482257671271040403050182053635446611842371782003385206425686324506278743843608760167647052812756434850150304062123835645244000555334854840304846070522672406004825581021471435363611118441785683041814020154570744330533742113803627262112418474C221B25DFE65E913E32545DD2C3335E6C6CFF3F73D2A4D2EE3CCCF8150F4A4AA34FE4DEEE188ADF128FB7A2B549A96D67E4ABE280089CF16DE078483C9D88CCB292170D585A4382BF1C69FE4E9386CA1D5BBA673B92AB78AEC293545221DEFF4019081BDFB9374441C9328E45A306B3193BC8F207F914A5E4EE76C4FD5213CD1795294A0CF570155D124148657B5E209A64BCEB017F58C3F851CB7916BF22A0F94D248DB7F6E3758545AA63F89757BFB1C03F43BBA700EEBAA84EDDE961CC205154411CA10481A88FE101DB0BA375CFBCC6E777ACD72F00202BFBA22FE5C0964CA287D00CB93A01C235A3A6E731687039A86FF1C5C211868DD41B32614A48E109156079F7668DF08879AFC7D0E23197AAF7E630169E53D73797427F0E8C4727EDACE5E7B6930D5E1A8591B6007680B197642A71DC645D1A240DA6930FDDC2AE6A5AF09CDA16201E0B41484BFB1CD9277CA676D46A48D66637FCC32D2EF5DE2ED4974238347C81BF183F5BBDE7901D56F8A8F194E836432697BDDD22B0C82B37476893F52FD2A3A4E3D7D701FE3701B5945736D97F5CD029302D9C14F0FF981ADF7CC0B1A52E0490D5E8B3EB8D5E95C8F2599143849ADA2D1A9F2AE88C695635695C1F860D5E591911E79EE66D742C1441974FCBC29C42D9BBFAC0BC71ED751E56EFAF0C87D31520CC17AA910EC90CFF31D91527DCD940DC0280EFCC3C2BD2B9BC8F0B47E6BA575ED4C5A473B26C547E82ED737F4676CF6E2EE6F945BECE53DF764E6FFFAB31394D4E0D56219DE2B604A04D4DFF79C1115D7976D571D67003619C801F05288E2FCBDE519A5ED10C1742C780B2EAC28015CE8EC3CCC5D1AF22A8AC5420871EC6E80E8527B3FFC5D2AB8CE7201513476D0AC44B3515B37AB1E6D92379B100D7E36156DFB2586CCE1E2FDDA6FF51644A0B1B71B4B976578D05D4BB8F2BC0E9160A0F714FE270DF89947477D1CF24436A166588D465CEBA4E7AC85312B4819384C9D032AF59A68E08AD106A3AA00CCEA3F1C0B1F13250425160D5B446EA5D1798A2B9A2813445BC70EC445E13E371FAB63B6A711554C4B4BEC8BE672012E9C056A0898A8658383E093B2F5715D0C026F8F5D7103B9B8C8CDF4A52EE26E537175957ECE287733D17DF403A571E8BE539797E546BBBB28719DDB148ACB29EB044BF5F6D4D24F08524EB5409F8DBBA7B6472D68E9474660617CF5D6CDC1EDF9417E63CB38B8B00E4B0FAB413477F234A48B43D107FD9931B7F7B505ED5882A50F09A59B65865C06BEC97915FF3B04DCF95CBA410E930E9D5284B366C606FBC9BCDD07764D6AE6995B51B18407DDD910B774DC45A7F692DE66EB87F54BBD835F95E4912A4349F8B898AA5E0804AAB4607FFFE3CF45F40FA1E4EFFC0A42520C7859442CE7FC685F45A9CCBC15A5AB5B9927BDA21F85908D2DE4B9A8A82B7C0FEDF5B52F124D5770A080B07FADEB552464708DCD93D89D9BB3525A525B9F63DEF3AFEC97DD3F737F612CF5445D6BDB089B2FFD1276E1125A38EA1B1373E28AF987845EDB8CCAC3204C988DD64360181D34B5F2BD21104FBC86F19DB1D732ED4298C72E08C1D75D8800978E4CBAA3FA8E8B2991922882CC8841D33F8BA9FE1C24931A54121B9B3C24523797B585F78BB38FFAB9F291ED86E79B36363729632BB6264A95E24F19665029764994903E3330ED3967A6B1ADEB5038885B6188186CFC979C2077BDB2AE531C713CD58C258D5D767FB0587C0F2C37730EF326B9825A18578B9522C7108803553E54A9724300C69B5342FFD887D1D7AE744E721E161001D2FAD52AFA93A63F9E1DD06A1ACD7532D465ED15B07575C5B09917CB55B7B174A037E0A03B5148466531D5D315DB5156A58875C0CA2596554D6A97B3AE68DB6BC27F32E2EF54F8E181CAEF3B9F329643C8291225975009032F9DC9C409B9759BEE8759EAB07995DAE0D87A10B2B1157364666C9C974098C0A52B46C2ADE69ACE08D1E92726B33CA127CC26E775D1B4123FD4832B3954F2555010157AB5664410667E828A765CC56FE2B7D2AACB27B58B644DB35ADD1638C9E522BDF7481F1E3265C8D91081139B3B82A4E05DC449EA94ECDC639074B5E617C6B21AD33F79527D3D10BEB575ACD3816A9939BFE766B8F4F07A1AC9CA21927D6C609D71A8219C0D39A229C8EB231FBDD53E756D89250BC03811041A8BDD2A60C392DAE899F6F5C57935650649B6F21A21046978D4F2A5DD105FF16780D54DF3F7B0D1A6D68FD0915D13181292AD463354B90DA2C7709FE3F248C4A469EAE9CA57A8EABADFD0EB2BAAD5482B14553DBA05377CB62AE9AD76ED07ADB931E4384FDD1E55E4AE829B97509B3C84B673DFF72686365322859C521F366F38AFC2E8F4926F4D1D00431120127F1FDE25467DE4542D8EB43690337A7B405B88C3DB52A460D1B0BB8F87E1EB7DBC6D9BB50DC561D76F23A5C4A743412ADEF08393764FEAFFB3EE272DAC0420649790AFB070F5FB83B6283A6C64CBF69C49D9A0CDCD605E69FBEAA2A2672DC7DD1B454C8E30E0022EF2AAB91C7866AF43B2545B7D866100E56E67DF12A6318CA07DEC5726A14CCDC9728B169A1D039509C72C029AE04C28C1D6F0402E7819ACB651E03D0358794B0D32576331B9C0004243819B0D4A2006E81A36FE2A67F70473C90A12DD6BA669D5A1F4DA3D577FE9A8EBA7263D5837EB600976461E5DD64B93F484511EE2881949A5974FCE1575BF5D528CAB654CEDC7C5E6E4752024EC7117EDF5BC1ED2EE7F6B3C2873BD4EB23EFE00291DC81EF1B17CBB60723EAB8435AC2794E9A13D1454360FB18CB0B9B0733343FA008DC45046C826728C383FA6720A9DC2CE17AEFA0AB548AA0138A184751E7CC9F17FAF759EB18793F040DA465AB6706AFD8E02C7AF51807E2F50D90E872A4DD039863829C1DFFEB1684E6945127881BFF2E42107D643BEBB254A2CE489E32D7D52A99766251907770A2A1F4CEF9C1171340BDEDF1D539B4C304F8B22408AC24DD1E307CB747EF11F6BB35EED04B9C98E477B918A9F4C5EEA6502F3D0687EC5BBE77F2A5C7DD17BECF5E1F2DCFD18B1C49C8C9A1A7CCDE1443F3F71D77FE07732C9CBA7A43290185CAD7CD6741B9DA4FE0C984AC6EE6C175C7D6DE9EC65ED3C0A6EEFE713DBCC2D6478D657A1E417B8F9481463A799879531E99383FD3F7D4ED22D08043105FFA6761C0AC5B54CFEACD885664E5503EAE79A9697013B6272D69E48A60DCCFEB3AD28E402334E7721472930CBDC945A98ED5D78CF8FCC68FB267C0D497925A9C33829B3C6B87A0173DB9BC55A74A9F2C86859ACA54B158984B8FF71F6361691AB6EA01B5A922749058D0E188747E088387FD42B6879E879F0F66B276FCFD558011808212537AE4A35B308AF27687E6FB1ABE6C9017CAA6E47788925468926FEF07841D1BF4996FB9D3BB0E819773E84929E43C28E4B50696C08E1C7EF51E46C94C99401FE6B28125DA89A66D65D38B7A9DE8B02B59572A0F724667358C696B9EBE5DFC511B1A diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt deleted file mode 100644 index a9e11477d..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-DSA-87.txt +++ /dev/null @@ -1,130 +0,0 @@ -Key Generation -- ML-DSA-87 -seed: 6DDC6B90E85615F0B14B4404DF3980684561530D0836B13E83E3D0FCB6BAE3A7 -rho: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4 -rhoPrime: 3045D0593BE84B554E7F8F01B0E495189D29CB5FD0623D43942B73C5A2FB1CA3601FEF3D2B7534DB93A6366BA829F0976192E5E1AF6FA53C310977D320D48637 -k: 292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5 - -aHat: [[[4942817, 8033578, 6193969, 328164, 3123076, 5608360, 1966694, 6159093, 6759326, 6515321, 4110789, 2846010, 10361, 7650249, 7781336, 6041326, 3536117, 2317544, 2721408, 3046749, 6270459, 1299626, 1215811, 3133880, 2370213, 920527, 1371791, 6811904, 2145793, 6207375, 8116305, 6492100, 252579, 5753948, 2401968, 7443724, 6047272, 2583106, 4272483, 5642404, 7540939, 2340897, 8148728, 6414703, 3554582, 4848846, 6304416, 4682923, 4866938, 1589246, 5949669, 1816143, 4144854, 739672, 1612639, 3960420, 4823091, 5152652, 162563, 7250025, 7861187, 1075468, 2760719, 5325368, 2853995, 2491970, 184325, 8285647, 1101892, 8236541, 2352450, 4836362, 4400092, 1730566, 5875078, 1163328, 3799181, 1078400, 6473097, 176770, 4389290, 3930702, 2247381, 5252155, 5094297, 5798128, 1548908, 786346, 2167616, 3408943, 6482932, 8268308, 6846461, 311108, 3509443, 292335, 2139945, 5315971, 4034246, 3368750, 3185661, 850239, 4727176, 2835091, 1966568, 628972, 3540979, 5585861, 4851680, 6954667, 5585688, 7575029, 1022666, 1224100, 2117265, 8081556, 5564272, 6094337, 3512192, 4447560, 2593735, 7029115, 1615057, 6182604, 6007387, 440008, 6161124, 285274, 3999454, 1761041, 2682656, 403435, 2315983, 5882539, 1551338, 4646148, 4502297, 4745509, 3584078, 3034937, 318029, 2307385, 5511360, 5629585, 4943712, 1674374, 6932098, 404086, 3453431, 4041486, 4634031, 2114236, 2992967, 5097826, 427152, 1671710, 8117492, 8244909, 4947244, 7239291, 3863419, 784527, 7897835, 6455885, 132223, 5997318, 2639167, 475440, 4874364, 8341775, 5628523, 1704181, 1098470, 7942278, 3058693, 3581325, 7088671, 5471389, 5666382, 5936984, 738801, 4232882, 424231, 5718096, 2810555, 6995518, 7506366, 6192412, 1757809, 1852167, 8088408, 7915331, 3188672, 3633386, 2245020, 2109698, 8282768, 4928891, 4784934, 8234992, 313604, 3282379, 1182558, 1215938, 2941269, 6527348, 3668135, 7140353, 6666194, 2123640, 3890789, 4426242, 4754497, 7088400, 6357265, 1544629, 186145, 4633732, 5978430, 1508484, 6936717, 3072796, 3033893, 8284754, 7504959, 6804803, 7393696, 2806493, 5282554, 7253014, 7185358, 2664060, 5981318, 5057868, 2331017, 7531460, 2845195, 6326162, 4354426, 5894280, 1602267, 6299024, 6615246, 1498629, 5102463, 7208301, 2184276, 4872292, 6275357, 1334360, 2731352, 1632393, 2666965, 4482704, 3506670, 5714329], -[1550168, 7424210, 292109, 7423684, 1750345, 6974931, 5688264, 8172582, 770260, 1381627, 1430742, 693826, 1001472, 6715016, 1188195, 1888150, 3818556, 4676105, 6034536, 676245, 8304778, 2161621, 1600065, 4407112, 2158044, 835278, 6792695, 6929321, 6760175, 1439959, 1023596, 1154979, 1529259, 5763706, 8334783, 5823503, 4999957, 7234018, 6957958, 1228673, 2899197, 6071344, 501162, 6338780, 348247, 6966377, 8354104, 5109858, 8248876, 7506290, 2141176, 5088302, 2589322, 3257874, 35325, 3628863, 7891066, 3961938, 7778545, 4186932, 4544233, 7669253, 7142240, 4164782, 2509776, 5557977, 1239692, 629677, 6586379, 3360713, 1958463, 3764734, 1682603, 2598256, 1418342, 2138070, 3711210, 4332406, 5252160, 1253277, 6428406, 3393451, 4341410, 6485247, 2227999, 2690968, 875285, 1447394, 7206506, 1558323, 965728, 652347, 3011978, 2437239, 1823421, 144, 729592, 3499376, 2958953, 6006172, 771666, 6233402, 791991, 3989110, 7045738, 6702703, 4506662, 4675489, 5488081, 5637200, 3266530, 2294293, 5597871, 5543096, 7933404, 5422472, 6442413, 3556798, 6221072, 1330862, 3079373, 1215107, 4472703, 700557, 6503776, 3711232, 8016347, 2297024, 5321936, 7719190, 2619287, 6428343, 7931800, 339829, 1210465, 1083452, 7581552, 4333105, 7219062, 8349424, 2110987, 5827470, 1903192, 6042708, 1260469, 404345, 1308913, 3877033, 2156613, 3818187, 682298, 5693335, 8221670, 7241503, 4244003, 7377251, 7599163, 3143159, 6714452, 5889779, 4242052, 3780681, 1681893, 4207853, 3939263, 1254054, 4637554, 5677431, 7446000, 2908649, 5745245, 1125336, 2914898, 2246931, 6519697, 747492, 3807501, 4510429, 7516883, 7420863, 46634, 7519094, 5632365, 7495346, 4046425, 4648072, 7600501, 7802465, 3036604, 7028666, 5613020, 369226, 3095310, 4874432, 1079495, 6601707, 2555469, 4647714, 4287202, 6893076, 1130447, 7845836, 2725068, 1644341, 1445534, 2873352, 6836269, 1098473, 7034864, 186560, 5900811, 3032385, 1546486, 3120856, 5387893, 5268223, 3833296, 502334, 2324504, 1602597, 2153345, 2891768, 4175188, 5234338, 5254478, 5533199, 5364139, 3814120, 1196947, 706277, 7598811, 6387988, 5315995, 1287836, 1107367, 7834361, 2430011, 5174785, 6101375, 229022, 6316026, 4036416, 426020, 4898874, 7591, 507098, 5712767, 7951861, 3393251, 3246455, 4503296, 3783317, 7261701, 2807309, 6255617, 7918489], -[124268, 3454508, 4540277, 2184358, 7715163, 1896113, 7392215, 2245934, 1933423, 544210, 2362289, 1133934, 5522240, 7079493, 6220452, 6725585, 4287242, 7872520, 6621741, 3618444, 3504714, 4508259, 80298, 6477825, 450462, 2979288, 2311097, 8017037, 1898478, 1693384, 4568288, 825712, 659735, 2197465, 6608878, 5097441, 329414, 1492926, 7771628, 2764980, 8267025, 1045780, 6086304, 5728373, 1185312, 4403074, 1113298, 2528623, 636481, 6048978, 5522881, 5237844, 7252175, 6302111, 1737301, 7430134, 6042491, 6280648, 592171, 6568069, 7386665, 260177, 8162793, 5396531, 2080605, 2879094, 6550355, 4316630, 4693187, 7227018, 1878178, 4062968, 660982, 4107999, 7342087, 143367, 5924700, 5292073, 5963544, 6392840, 1479198, 1674589, 6104642, 4482736, 8249291, 6361729, 1378596, 4908681, 4536361, 4362312, 7063547, 6487585, 6293197, 5083317, 1023209, 7483314, 7347362, 8016708, 6258737, 841418, 5986694, 8187776, 7314254, 4069187, 4777966, 1282229, 6849823, 3651546, 5167237, 448982, 1617535, 6148062, 2563831, 341348, 462953, 2726092, 470426, 4389745, 1897006, 4198701, 922933, 4832433, 3998732, 1019961, 4704547, 3686639, 1630795, 7480248, 4423139, 6066099, 1658452, 6587344, 2406221, 2616268, 3370493, 945748, 7548847, 3540138, 5497123, 1777802, 2285179, 6059608, 1116857, 276355, 847199, 470378, 380991, 2090624, 5511114, 5338633, 3294702, 2758899, 6750230, 7849133, 2519388, 5952859, 2024128, 2765296, 4432592, 4002463, 5501721, 8048477, 3042065, 1048052, 3038342, 317406, 5628826, 5089941, 2414816, 97410, 2666506, 5195965, 4308509, 5255146, 3067360, 3058663, 3154174, 4210082, 1201494, 335802, 4732686, 5599873, 1517675, 5649550, 82666, 8196174, 3041934, 1141908, 2422690, 6366263, 2276637, 4975039, 4811690, 4288619, 546780, 4828023, 849944, 2754180, 5503830, 1260152, 6280854, 4347769, 1714217, 7055213, 1845288, 6519162, 162994, 3813822, 2123297, 4083321, 94343, 2805404, 8015229, 1940844, 970280, 5414903, 3027911, 5144950, 5266658, 8296429, 7608062, 2147950, 3858856, 6791048, 4115046, 2360009, 1007126, 1420551, 6999770, 5397107, 3240435, 3315224, 5647378, 6172666, 4887504, 4141035, 2861062, 3122658, 4093908, 715621, 1714512, 4633066, 767499, 4331334, 2272858, 7241032, 3107744, 7800848, 6296453, 3911231, 3540601, 2068866, 3927560, 1040826, 2201935, 664526], -[7090291, 1989201, 6118115, 1476146, 7536419, 8322799, 5950956, 8267461, 7609389, 1431325, 112675, 8267806, 2877813, 4587228, 577546, 6811694, 2846461, 6055685, 1172044, 7701176, 350602, 3345503, 1484354, 4957584, 6104233, 8114112, 6390720, 8160489, 5543073, 6161915, 6908779, 3470522, 5663216, 1025863, 5518546, 179031, 5319046, 6492566, 4387380, 328865, 2385300, 7509164, 4523830, 1769437, 7305191, 1799542, 2579784, 3379695, 5023935, 5119468, 6440062, 2478574, 5947135, 958864, 180362, 983875, 3631642, 3133879, 7769249, 5795411, 418829, 3861659, 7308043, 2791794, 5470605, 828605, 2531813, 1043049, 4853410, 7922908, 2008161, 392887, 6419330, 6961948, 6912016, 224530, 7823713, 3084620, 5966231, 5456628, 939767, 226305, 243958, 3042851, 4844383, 1859447, 4688504, 5537197, 5850555, 5348179, 4615676, 1784321, 8078674, 4808530, 743138, 4156228, 6846512, 6273431, 5871168, 7755251, 5252026, 1891973, 7255979, 3093452, 6088132, 4544061, 6903402, 7069266, 2713182, 1732214, 3097381, 7338844, 3829305, 8201661, 1264893, 7370864, 1319291, 7615276, 7261221, 5162860, 3374788, 487509, 2734496, 4436233, 6454810, 3515043, 901118, 8015800, 1048476, 3640805, 1445919, 2573951, 41572, 4724743, 310668, 2494134, 1127574, 3700120, 1140349, 6456036, 363970, 3869283, 3279457, 7762368, 2866833, 6299927, 1719650, 4131478, 3913974, 116163, 5214814, 723937, 6021159, 7621537, 3356650, 4600497, 1298750, 2427630, 1482432, 6759971, 6863640, 6354088, 7045221, 662877, 6594395, 978353, 3130181, 1412508, 2686843, 6669197, 3433059, 6682135, 2522990, 8345241, 4097226, 2199179, 5021392, 1997087, 4416448, 1851497, 3676944, 4864657, 1591364, 2453500, 6349615, 4985104, 273089, 6509201, 142979, 5212001, 6724389, 6847978, 192405, 6975782, 4255889, 2256402, 7721989, 1586571, 6669505, 6615576, 2454479, 6254706, 6553216, 678558, 6052126, 197972, 5932736, 6717340, 4478648, 610318, 6591033, 7963332, 58445, 7514386, 7185820, 1503190, 3721213, 7131565, 7114576, 5410511, 4436485, 4755765, 3078576, 5879490, 397700, 1948141, 196872, 2587143, 3256582, 536885, 8291646, 4951029, 497181, 3717800, 1439253, 1539922, 2107716, 4688967, 7120882, 7560935, 928356, 5989369, 917995, 2455435, 2352765, 2883184, 2695744, 7213419, 4429725, 4589005, 8187736, 7721735, 7801436, 7824046, 6971001, 1076175], -[6562658, 4589386, 6234799, 7747056, 5404545, 2851093, 6252981, 7600008, 5648332, 7563286, 6404145, 7446438, 1037168, 5590589, 304912, 6960005, 5744852, 2746386, 2898502, 3422249, 8167784, 1309529, 2758962, 2671454, 4194029, 1085914, 797984, 1647852, 206216, 4073375, 5435427, 1499910, 6729526, 2635710, 5632714, 7529680, 1428005, 4103599, 3821554, 7098260, 465711, 2757861, 5446148, 3440599, 4530016, 7700119, 6190804, 861232, 3944011, 6180181, 7139693, 6235623, 2983564, 1706716, 6738505, 5250519, 1738465, 1270613, 363412, 6579829, 4925248, 3329734, 6411381, 1783469, 6605643, 1721359, 7398433, 6872567, 160503, 171249, 2336352, 7364444, 4603427, 1956714, 2766079, 3050834, 2233409, 1364666, 8266683, 7161440, 8350339, 3670932, 1703959, 22757, 5317210, 6512134, 5242806, 4243750, 6531552, 7312805, 7511890, 3287607, 767868, 4987844, 1938322, 277307, 3685347, 7676723, 6628398, 6580532, 1230075, 3836024, 701948, 149399, 3755502, 3370574, 3267189, 200216, 1632788, 796172, 6374951, 6761509, 8073339, 5555301, 1367489, 3701593, 6876839, 7391291, 2042009, 6628353, 6453810, 7228110, 7245753, 8098564, 7201603, 1493223, 1693809, 623301, 3445276, 1016451, 1475111, 3382255, 1203580, 5943013, 3043118, 1644084, 5771140, 3522427, 131065, 1126935, 4217440, 4984877, 4872483, 7793824, 1260334, 5232320, 5184612, 6915124, 2335251, 7318959, 6655725, 494764, 2819970, 2159975, 4308005, 4871776, 5668657, 4555501, 3923486, 8042080, 3351893, 8165657, 5047625, 2086590, 7434653, 290308, 6596745, 5204995, 1611056, 8223486, 3545529, 6785072, 6380045, 1672801, 1761495, 7561702, 6328723, 3819929, 7100920, 7760954, 998438, 7106637, 640831, 6285002, 1555626, 5308276, 1431966, 7121865, 6685259, 6267600, 424532, 4442371, 3188000, 1131698, 3361174, 473970, 2028693, 4594364, 101879, 7911894, 7849749, 3702466, 1929498, 7602101, 6438906, 8290092, 4622910, 5379401, 8277555, 6076121, 687759, 6303932, 8014870, 4304568, 6836794, 1534152, 6135528, 3561472, 8091493, 7321206, 5416391, 1911962, 7726862, 2606264, 6310349, 4307424, 179712, 5888195, 730849, 175061, 4954712, 2800340, 7000348, 7002065, 3643029, 7336409, 8327667, 2405013, 4737561, 7978872, 7558159, 2966653, 7609329, 2694919, 5579629, 4894203, 2124591, 1588521, 6168078, 1981865, 2604210, 817321, 4997594, 6341282, 7888693, 2178309], -[3291489, 355298, 6318436, 2743739, 2683026, 2452262, 4419231, 4318992, 3175689, 6158679, 6560796, 5470575, 7202885, 2142351, 1162017, 833132, 7115046, 1024202, 4011955, 1243334, 1566406, 7291028, 1800528, 7434535, 4753067, 6669087, 5157910, 1225615, 733758, 5059269, 1405834, 5737760, 1827199, 7429041, 4945180, 7288049, 4592238, 4669567, 1540085, 6732701, 5121778, 1176156, 6513025, 634514, 7058789, 3658132, 7299854, 3960003, 6337720, 6944448, 1572149, 6614321, 2327214, 6448700, 8211235, 1310972, 2861913, 240787, 2120767, 5811986, 3496974, 7830062, 1777202, 8295596, 5670692, 4565177, 7762600, 7384213, 6073137, 758809, 1562827, 3650471, 3230719, 6276997, 6364453, 7790129, 2165338, 7405311, 2523061, 5370921, 7308988, 6428925, 7636941, 3852314, 404904, 5787905, 2404242, 7669057, 6630597, 2045477, 1538028, 7178786, 4031242, 6868106, 1006508, 2894804, 5252844, 1540351, 6641674, 4819286, 3346530, 2127824, 292560, 8241122, 7089843, 3993080, 5335622, 6190000, 7762219, 4082211, 7182135, 4871977, 6074725, 5973764, 3437891, 510067, 2579299, 1383156, 1804347, 1625094, 3296368, 1998359, 1111718, 5523524, 3928799, 6662714, 7046742, 4716316, 6110031, 7745795, 6745752, 2759022, 4656918, 3932306, 2031488, 3772845, 3911021, 3007748, 7322319, 2757657, 566202, 7266127, 6770431, 866924, 5989071, 2932644, 8066863, 144656, 5453890, 1244952, 3957526, 5526654, 1226544, 2137720, 1884574, 8012225, 7355529, 5641775, 3474075, 5009081, 1422018, 3757299, 3895970, 5861437, 8267021, 2572551, 5122437, 8305441, 2795997, 6490598, 7850818, 7333662, 3652637, 4191273, 7561082, 5225217, 3614063, 6607886, 3498001, 966846, 5942594, 7337788, 3191805, 4224922, 5202069, 1688596, 1981936, 3862115, 6326591, 7265125, 4742705, 2774314, 5329378, 7112644, 2536312, 6976007, 8356455, 4102683, 7647006, 5160465, 4374949, 4683296, 4124670, 2441640, 2545570, 5622816, 5459400, 2598296, 1708806, 7250218, 360980, 4055939, 6637525, 498900, 7474442, 6365726, 3736619, 6265007, 1782616, 2229228, 7113972, 1439365, 4304835, 2717545, 3850714, 2426070, 635255, 7178569, 3647900, 1304479, 3620126, 4314908, 380949, 5261176, 2220297, 6801588, 319274, 5555023, 762561, 4283760, 7707711, 4155486, 7717787, 6062317, 5256117, 1494618, 3461102, 2150123, 2693569, 6246660, 5150462, 1052373, 6150796, 6409892, 6156663, 4125505], -[2318043, 7634396, 4128865, 1470370, 8206572, 4934646, 1248748, 7691275, 6739257, 2035651, 1186985, 64591, 6787706, 2783456, 2005998, 7121044, 2615939, 7792539, 2107293, 6455128, 2905042, 4871871, 119937, 255218, 2463182, 1894493, 1153410, 3578021, 5361819, 7504103, 2063679, 6813131, 1375990, 1337553, 4671486, 7911246, 5814813, 7039830, 5267927, 4867866, 4627304, 1274635, 29492, 6802158, 857730, 4742465, 8139844, 3784980, 8178018, 5230085, 678155, 1866601, 5002198, 292759, 119103, 4862978, 914208, 4463045, 1980598, 3763875, 8289289, 537456, 1396433, 7223993, 6028806, 7404699, 5722404, 1571479, 4536443, 5470083, 7393180, 782089, 7410085, 2580657, 3277785, 7604831, 967464, 6362582, 5870678, 5918271, 7761026, 2469347, 3696925, 4597721, 2199906, 146141, 7742163, 4407167, 1837463, 192411, 6087419, 4704629, 3296522, 3746844, 7564947, 2349514, 7338993, 2606699, 6572041, 7386240, 3431541, 5693487, 2761404, 3718757, 6438353, 4047003, 1448719, 7618901, 6713099, 1916112, 6713348, 6394728, 6287415, 4908384, 5238618, 5035257, 682648, 7642357, 6338709, 4266467, 464443, 1948226, 7034213, 3799, 4819257, 603692, 286512, 4613495, 6413019, 8093545, 6472938, 2713773, 7684995, 2988502, 992015, 7651302, 7549382, 6820837, 1077546, 3172635, 5812266, 4075566, 7605044, 3121055, 4797932, 4550027, 7869895, 2597491, 4130894, 5780693, 7380796, 1634434, 93222, 7331275, 2519148, 6961480, 7254808, 4925813, 28176, 1339337, 761837, 3735627, 1138328, 6127790, 2607131, 1351154, 789103, 2268991, 1650990, 1953390, 8129282, 140889, 3695278, 2577608, 85218, 6634886, 5256301, 4190229, 2427849, 1201555, 2142420, 6071051, 8096546, 924908, 4372138, 787581, 4282091, 2832449, 8024845, 3929088, 1779977, 5160502, 2968631, 5928748, 2422370, 890621, 54158, 1544166, 7992931, 562184, 5369427, 782984, 2939808, 6263502, 1767407, 3093903, 5483480, 4159618, 2831389, 2815050, 545622, 8152053, 3137421, 8337969, 1329605, 2005251, 1800340, 5750814, 4246108, 3440553, 7525381, 3794399, 661566, 3212729, 4884181, 8271048, 667405, 2531805, 8157274, 1036172, 7043646, 1070459, 6789345, 4781654, 1824175, 7878106, 3336934, 4519946, 3671062, 1902593, 4200439, 1713694, 3405389, 6746655, 7336880, 7879513, 6707627, 1062511, 2028245, 1188314, 1792884, 752605, 7901641, 7147858, 6152594, 8343818]], -[[6751095, 4795203, 885047, 7940309, 3478932, 3238845, 863413, 7851412, 6543404, 1357512, 4757923, 3430655, 3676858, 1096643, 2035346, 1725087, 3507397, 879250, 2288486, 280410, 3000791, 1984678, 1373405, 7853247, 4736334, 2332728, 2350953, 2186166, 6808659, 7979162, 5080950, 8143904, 7268047, 5605829, 7908376, 7948657, 6561944, 3135604, 2691985, 3994273, 1821263, 6695907, 3712683, 7708795, 3716683, 433189, 4666287, 1892953, 1205689, 1884751, 7742487, 4865850, 7322163, 4706767, 6052298, 4627777, 3847127, 3228439, 7721549, 8117503, 2882600, 4816017, 1510540, 2317754, 291126, 5849360, 7724084, 7403677, 104336, 3619157, 1202556, 1110298, 7841957, 4238043, 7393146, 1968558, 3168770, 2877227, 2714562, 944233, 5588351, 2384955, 6110746, 1965275, 491269, 295712, 6818342, 291487, 5020579, 1971892, 2059733, 6497678, 4047600, 7556301, 6539029, 2338681, 4043349, 4364643, 347335, 3195915, 239945, 8332701, 517255, 5605823, 7357017, 2734022, 8202537, 6301241, 8111641, 3110622, 2239943, 2802622, 2202877, 1688656, 5280977, 6759869, 5804947, 787123, 5042862, 4689223, 3934824, 2819262, 1273265, 5904214, 489859, 4147976, 3948606, 431460, 2439562, 1903663, 2840047, 8287966, 5297735, 402689, 1502823, 3587927, 6606677, 4816862, 8047747, 5965768, 2650493, 4630375, 6813294, 7124647, 1033707, 2825313, 8177791, 235634, 3212471, 3215376, 3035029, 6311988, 1086544, 5212123, 217492, 4333461, 5296456, 238495, 6728832, 1018752, 7972486, 4044650, 4886825, 5510336, 2219791, 729333, 6868987, 536484, 5733946, 3233489, 774738, 1349325, 400438, 3636645, 7554378, 6015410, 3532873, 5538835, 401019, 2883838, 2723643, 6607023, 5519380, 3094919, 6027316, 2685918, 2909373, 1415425, 5240992, 278754, 2345667, 6235146, 7620696, 4121899, 4502119, 2555363, 664532, 5547725, 2628573, 7180606, 3391994, 5424680, 3210167, 2042474, 3769922, 5621045, 4201283, 6594107, 2133648, 6931021, 473998, 4046819, 1403445, 6255888, 2137075, 3652598, 824511, 5254020, 6063424, 6057342, 280780, 5740573, 3672971, 7403778, 119374, 848070, 3299338, 6886103, 1900989, 3833782, 1207252, 1822715, 4606129, 8294995, 933298, 5445054, 8026640, 5049098, 1682529, 5876662, 4810134, 1592882, 1511200, 7136876, 1331216, 3121004, 5162348, 2518345, 5177633, 1545182, 4734107, 4125372, 7565800, 2987938, 223471, 7434975], -[6476891, 1272736, 6895586, 5995035, 3702657, 1401339, 2764560, 2935833, 6056732, 5204200, 7883077, 6613066, 5655867, 3999117, 7461239, 25070, 661785, 6153359, 8246781, 7146281, 7007317, 1650728, 5956800, 2758622, 5034532, 7065320, 2124924, 3964137, 965414, 1625485, 1733553, 7504007, 6551472, 7900070, 7482544, 793905, 1026118, 1571976, 3913244, 2822754, 777321, 1024911, 483321, 6691468, 6102271, 3558611, 6695078, 2093271, 8278712, 5208811, 4569412, 3656736, 4554180, 377091, 7861784, 6083642, 6561199, 7078199, 7223561, 944610, 1137887, 4395992, 7543311, 4133130, 3287430, 7753270, 734286, 602206, 4091314, 4514852, 3320601, 4331908, 4309428, 4333282, 6969814, 2354487, 2453465, 728783, 4025949, 5329756, 1281858, 3912836, 5407965, 6967513, 2082577, 5564225, 86243, 8065043, 6542808, 6112996, 3334872, 8273080, 2332332, 2278327, 2140087, 461490, 5681877, 8086723, 7178764, 7215555, 1999691, 5462873, 4779520, 5038401, 2072430, 54234, 3458740, 6841286, 195726, 4711342, 2673222, 6133969, 8157160, 4522306, 3172419, 6118689, 3671789, 6016236, 6690747, 4767189, 7629121, 6638934, 3448050, 116322, 672154, 7126721, 4383307, 4043477, 3840265, 3429511, 1204334, 6102473, 5091034, 1963914, 8272802, 5960368, 1792045, 5960367, 7552500, 1008550, 5659021, 4128869, 3311842, 3127272, 3788843, 7450387, 3411140, 4866745, 3947284, 1004443, 7011341, 1282024, 1380404, 4314417, 2976249, 920749, 2695644, 4653367, 2153892, 680205, 3949025, 4846090, 3013192, 3437938, 5853869, 2110353, 2018090, 5642105, 2061456, 295805, 7281932, 2190730, 5469153, 2801403, 2644754, 659541, 6421762, 6108961, 3861817, 4543297, 6832299, 5496097, 2903780, 6527846, 5006095, 6477294, 5075665, 5529606, 1913399, 313944, 2485155, 8043278, 3403779, 2005266, 3388133, 3669212, 3135482, 341739, 292356, 6260799, 3101772, 6218234, 267767, 1689670, 963126, 1799986, 7748068, 2475689, 4814367, 4782406, 7834185, 3228347, 71406, 5096387, 1015713, 4204839, 4380399, 3017429, 5278885, 1329709, 2741256, 8352956, 1789673, 1705272, 1296461, 4014281, 2025872, 4521377, 4560695, 2745517, 3802749, 4941885, 4810271, 3945148, 7710417, 3894015, 4735556, 616183, 3133252, 1730823, 5185677, 6729885, 3704649, 6951087, 951499, 1629073, 3551815, 4971465, 5156933, 6963295, 3240860, 2262626, 7106398, 8294249, 3311636, 6982187], -[111619, 1676994, 1098033, 7710340, 4760347, 6602290, 7315031, 583574, 1626727, 114820, 4149543, 3038751, 7361786, 5735246, 3890677, 8012447, 2604931, 2684764, 6581247, 4394982, 7701225, 7909965, 7526721, 5118485, 5320434, 5698954, 5349329, 1473466, 3400943, 412228, 4770835, 3459174, 2095715, 27144, 4941901, 8140658, 7117633, 7432500, 8265263, 2725505, 7151706, 1165339, 2214439, 4267376, 4437403, 2692371, 4311270, 7136977, 2521293, 8227583, 401703, 8360516, 8261995, 5781447, 7086980, 24140, 4828655, 6050732, 7958, 5310267, 6805324, 3332368, 7096315, 2010763, 1779478, 5507514, 817253, 8003762, 3812905, 7138960, 6221024, 2603806, 5800256, 2699033, 1168661, 865306, 1017725, 1362241, 4594286, 2153557, 2753094, 636703, 1917776, 5222181, 3814607, 6597777, 8336267, 7372776, 4797723, 5145069, 4398226, 4477675, 7138360, 5104574, 92449, 1541680, 5146709, 4714944, 1340886, 2521418, 6210599, 6763988, 648010, 1210506, 4522327, 7220120, 2539632, 5502013, 5429101, 7297533, 2330200, 801829, 4307704, 1564563, 7660938, 1486554, 7085516, 2067582, 4177849, 7771615, 6902300, 3782060, 1780540, 3387065, 5338543, 3783816, 1808309, 5025146, 5497441, 6669583, 6440450, 1387637, 5308114, 5958104, 7962645, 5297694, 217910, 5818179, 8107471, 1742062, 3323546, 3205566, 5438963, 865402, 5244058, 2129686, 7648350, 7525973, 378679, 1639334, 8106734, 6638892, 5592849, 2137207, 2385452, 6482525, 4479444, 2617984, 2137320, 2658402, 4812798, 2509087, 5945382, 3670439, 4705473, 1142377, 8201723, 1045729, 2362050, 6678922, 207442, 4363495, 5593076, 3950996, 1424564, 1439296, 2428094, 575177, 1048, 2632687, 7183292, 517156, 2866908, 4019740, 5485492, 1630403, 3854222, 7494081, 2613643, 39814, 5570057, 2565918, 5594189, 8256879, 1437564, 4428191, 4695604, 3325202, 7999642, 7620225, 5072968, 1209312, 7771244, 6978854, 443972, 4372896, 4087611, 1887400, 229728, 7586330, 1123133, 5814707, 6081995, 3186047, 3477409, 3860170, 6503187, 4480135, 95838, 6350297, 1229136, 3623912, 3682561, 6224580, 5762404, 2480050, 247450, 1613365, 2351719, 6229159, 2065951, 8148746, 4567389, 4524949, 2421069, 7709944, 5273185, 978712, 3282297, 2052230, 96588, 7056422, 6939803, 3227456, 5376329, 656857, 1707491, 2361931, 4749949, 6452618, 309084, 6722262, 3919921, 2719174, 368589, 3099014], -[1440271, 5728915, 6744425, 5387316, 2224474, 3278861, 7884805, 2439391, 4207727, 7990031, 6602542, 6027830, 1622622, 420242, 3955074, 7508794, 3594656, 6506828, 5210271, 1641300, 2002611, 1890290, 7165934, 4864127, 7528599, 5159198, 7411610, 1600681, 8097738, 2775133, 5582741, 6756740, 1472117, 44100, 5121027, 4737891, 6721415, 8107516, 7749325, 4166297, 623411, 4332720, 6327763, 3851672, 1830623, 2567124, 2086122, 1655603, 4987454, 7553431, 7074153, 5497490, 4315022, 1170125, 2999857, 3513096, 3077743, 4365435, 2656943, 4567950, 8261950, 1428889, 1945783, 3505370, 827025, 5490949, 1463425, 6913993, 4490590, 3262197, 6723810, 5270961, 1693688, 3194706, 7870375, 282821, 8154936, 5439411, 7346416, 2322829, 4498397, 4448288, 4926603, 412709, 1467492, 1744393, 6324381, 6807702, 6698955, 2836148, 1098737, 7787632, 5600183, 371117, 4441500, 2874651, 6341038, 3413325, 2812055, 5535489, 624307, 6650283, 5199110, 2376768, 5823438, 6852952, 1630717, 6391776, 6510242, 1486924, 5867609, 4047369, 5837502, 4363815, 5387744, 8289435, 7811456, 1511827, 5326328, 142721, 6737079, 2641974, 4083182, 7422018, 7730845, 3724776, 4416264, 3890631, 6679547, 1921729, 4035936, 7817015, 5181126, 5020502, 7595951, 7975474, 4893442, 1576956, 7209064, 4364720, 2438984, 2032332, 4744565, 4688186, 5703513, 8100558, 7230920, 3311055, 4439061, 5635770, 3899831, 1885655, 617854, 1255288, 2395895, 3631106, 1570697, 4396400, 1695570, 4407054, 5299201, 7882535, 4034632, 2725065, 821406, 5826558, 7013710, 5380165, 2386136, 5192039, 5084403, 2421784, 2808044, 6011123, 3873461, 1249881, 6209740, 8219344, 6974819, 7235173, 8339928, 2076486, 1733701, 8084269, 6959599, 5771827, 5707238, 93481, 41310, 8061116, 2085879, 7141713, 7677783, 5843820, 5992287, 7737448, 802522, 7052498, 992924, 841287, 5500278, 1329849, 3629010, 5377923, 4811434, 5232705, 925726, 2674185, 4741592, 5814553, 6329610, 4618171, 3774201, 568387, 8148374, 3064425, 208034, 7527510, 5217180, 3572150, 5711951, 7035536, 6239242, 8294020, 8074928, 2103706, 6772843, 1083972, 5009329, 3177257, 6149619, 835559, 1011387, 7414590, 3597950, 2542614, 2691486, 7159129, 2652292, 849763, 6607563, 1830791, 728450, 4795880, 7201012, 6741918, 2307056, 6694005, 2205922, 6343351, 1940664, 8125548, 2213634, 519296, 6398731, 1742236], -[6370436, 182888, 7464879, 2196521, 3016161, 5710855, 2178731, 5242891, 7175646, 3376572, 692652, 115256, 4681265, 2327364, 2866131, 711001, 2543099, 3952645, 6873295, 5874177, 7842267, 7460562, 2103889, 5307755, 2748798, 5682641, 2064938, 994731, 7316148, 7724024, 6661771, 7891061, 3333696, 3505649, 6523273, 887444, 6717279, 2121048, 2210738, 4195354, 6759001, 1863853, 376520, 1308760, 7186525, 4452157, 783534, 134073, 2252782, 1339413, 1861831, 3241553, 5573493, 3828234, 2542644, 6324500, 1571161, 2652195, 2037112, 6669366, 4686981, 2056409, 1564989, 7246088, 3488787, 2424423, 623278, 140110, 3051064, 7864232, 768386, 1315674, 1511982, 7121946, 1538112, 7211115, 6300123, 3663354, 1726877, 28613, 4445831, 5273734, 3002191, 385451, 5009543, 4747052, 499099, 4633017, 3164423, 6692198, 1151832, 7368178, 1730215, 7593663, 4420845, 6559731, 1778274, 7733518, 3493353, 7115783, 1328832, 2776578, 4566058, 239026, 8259472, 6553016, 6416483, 2929324, 5498164, 6281446, 1943822, 4238161, 963731, 8064601, 2622570, 6355087, 4337091, 1503751, 4093881, 291377, 5411105, 6900748, 1285139, 2996804, 1639018, 4451582, 4467082, 8097000, 4047496, 2908878, 8338836, 2089162, 3783940, 1771450, 6799800, 4997128, 5100179, 1796653, 550299, 1219994, 4008138, 383514, 6311848, 7640655, 537625, 4510206, 1034153, 5330904, 4657692, 3396866, 6742694, 4497646, 4217863, 2007116, 3072597, 8067082, 1109224, 5139740, 7294832, 3383664, 2509457, 3744060, 6408599, 1302642, 8329512, 4588043, 1102524, 4964929, 2821649, 1823572, 6767145, 2586648, 308995, 4776529, 8157535, 4316630, 4735203, 1011890, 2695909, 5143059, 7353613, 724804, 3130264, 5338244, 8139815, 4239395, 6222159, 4321803, 8322735, 6234963, 6507140, 1842719, 5625545, 4511207, 3406794, 8020465, 3309806, 98342, 105605, 361485, 7289774, 7343717, 5474574, 3382938, 81991, 1648491, 6095443, 1708831, 5419209, 297297, 877589, 1901449, 7055875, 4390177, 7180193, 3813482, 623224, 2133247, 5237295, 2580078, 8297584, 8140553, 2207391, 1791402, 469374, 1258826, 4457375, 7059905, 3903672, 7032837, 2336308, 7562556, 549571, 3207520, 6897500, 2374073, 2525078, 2405454, 866625, 6922550, 4767212, 3713596, 6227576, 6905221, 1758141, 3361235, 6912194, 4383639, 5525742, 3496007, 5593733, 4665592, 7956024, 1706800, 7680460, 1302122], -[5188684, 5135238, 2297957, 6853152, 915652, 396775, 2807763, 1583950, 4150010, 3415769, 7391999, 6813601, 7072294, 5490506, 2824855, 49545, 8264355, 4098461, 4777510, 6500465, 1428602, 1855085, 5447637, 1145048, 4935218, 5419327, 1677402, 2990969, 1051297, 6256614, 5530434, 5012074, 8075416, 1304490, 7707684, 5299912, 5734297, 7846005, 5107826, 213311, 2703934, 8005644, 5214795, 7613563, 1212925, 8125766, 1361743, 4455087, 1496409, 4410391, 4436496, 8283312, 7151812, 5539885, 6707432, 7994726, 7095397, 6192040, 5077777, 5577855, 2869095, 4047545, 8189070, 6220763, 75955, 4385765, 636052, 4572864, 2066601, 4508464, 5945656, 3324303, 6189266, 1287276, 6926910, 8210694, 3218693, 929109, 2972097, 5072056, 769760, 5472836, 2286651, 6514537, 3099230, 1663793, 1719663, 8192586, 338385, 6428412, 7306278, 7668214, 2508447, 5775485, 2913751, 227433, 159552, 6590226, 5599974, 5442169, 4795632, 7948716, 2136690, 1391615, 5475437, 1731855, 1108447, 2259297, 1328225, 5226910, 860282, 8323024, 7020816, 714547, 5708399, 6831589, 2230688, 7522236, 7411356, 4143192, 1206109, 3603321, 5592645, 6391587, 4782316, 4232161, 5108558, 6948077, 2233238, 8371438, 4040646, 6319502, 6702108, 6942376, 2186013, 7048495, 6011145, 7920113, 6182143, 1142088, 3001344, 888009, 2366964, 3813796, 404752, 186801, 6710043, 989313, 2939002, 1540143, 203997, 3992775, 1019585, 7467304, 6273972, 8226276, 6835853, 5683825, 783467, 4779036, 6538227, 6581944, 1311199, 78493, 6255063, 2786811, 4880643, 1671827, 3209645, 3753049, 7382031, 3385531, 4736602, 4517108, 678625, 7688556, 7048041, 8268232, 4313694, 1346460, 509573, 4695861, 904968, 5515360, 4197105, 1429467, 4196332, 4508373, 5323233, 2096377, 1723206, 6385954, 7562597, 7740186, 5645050, 7979631, 1712487, 7263435, 4077406, 6099701, 3720423, 5030308, 5225176, 3492173, 6042577, 6819292, 4602024, 1753319, 6095055, 5107877, 7544405, 793939, 2432377, 5345564, 1069504, 3431216, 3026505, 5635957, 6427472, 4422110, 1516109, 3010762, 4798740, 1636871, 2261079, 666510, 4979533, 2771542, 1603972, 7448104, 4134703, 7842028, 3607408, 4855718, 6830817, 7330854, 1180320, 8342148, 8202896, 2103302, 4726766, 207074, 4336685, 5301805, 8017531, 3207765, 4800668, 4566823, 5510486, 477610, 1241002, 2889600, 7107733, 3843327, 808457, 6037945], -[7393218, 1010544, 3183488, 218660, 1441560, 7836839, 4983576, 4533836, 4969688, 3733928, 6869004, 5587507, 3764032, 4131977, 3851001, 1453460, 5118791, 3854553, 2073971, 2228573, 6929473, 4323941, 7733547, 1524685, 2865938, 399231, 5733417, 5736532, 417290, 2588427, 6919824, 71817, 6867722, 4383823, 6190831, 7968742, 2026367, 6042561, 2146353, 5878182, 4203143, 4541042, 6083522, 4939206, 3988980, 7283451, 2999672, 6853643, 8182666, 1151008, 6527229, 6864305, 2819138, 6714176, 1288565, 3207889, 2065181, 916640, 3059622, 1598106, 6112770, 429106, 969034, 5076607, 7130262, 2339937, 6908584, 749908, 6922910, 4837313, 6383853, 4326285, 750885, 6416544, 5486858, 2293387, 7413210, 6218001, 1596253, 1976809, 2120109, 4792013, 2612340, 5217977, 7350753, 5974215, 4446632, 140160, 2585069, 3101378, 2755997, 4206147, 4253155, 5845946, 8107194, 1963949, 3871759, 4881533, 1652782, 7983440, 7685161, 4284228, 5654027, 7044660, 1583462, 5104430, 7834647, 2532939, 2841082, 5057887, 1823885, 6823299, 2144802, 228342, 2805703, 573965, 3727947, 4627422, 1117472, 8300813, 2533346, 3635354, 4840010, 5144115, 8284731, 5033354, 2163030, 5590009, 7644617, 4960397, 3407240, 631099, 7524712, 96012, 3605586, 3082542, 7905016, 6199246, 718259, 7694530, 3956311, 6266425, 1150139, 8084362, 1915011, 2644793, 5243211, 3139878, 2689012, 1286078, 4451144, 481318, 4632259, 8335499, 6855889, 6500657, 8194073, 3641807, 3933466, 6943907, 4783841, 689874, 7223634, 2127663, 1553196, 3446462, 2093820, 6158213, 2446582, 2581522, 7758883, 8305768, 3764022, 8326987, 2982826, 6419194, 4128593, 658068, 7600883, 2259852, 2916371, 6336323, 4427505, 6009050, 6598145, 5442426, 8356766, 6331308, 1923665, 2062793, 8133521, 1321759, 1984376, 1476431, 832971, 4118161, 1757245, 6384005, 314822, 4708615, 3648245, 605737, 5968656, 2276625, 7434635, 1038395, 695736, 2330549, 3838059, 3828632, 3673039, 878015, 1331304, 8266234, 656965, 4365274, 1078122, 3717961, 2481642, 3895505, 8269144, 4792734, 6966191, 4643038, 4611752, 2812883, 1283788, 7402851, 2675286, 7957640, 3306450, 6993067, 5590700, 1584176, 5971990, 2948979, 2207517, 5592115, 3090390, 8238826, 3141801, 3497152, 5500832, 2763996, 2426928, 3522197, 6429592, 7644530, 6766918, 7615983, 7988132, 4084939, 3031288, 5365043, 4759102, 3014436]], -[[3370263, 1299342, 5032432, 7061446, 6126697, 6765940, 6437056, 7315301, 4981667, 2489899, 3182661, 1225959, 100414, 134135, 2004517, 3625453, 578729, 6939089, 4536144, 2456983, 3387733, 6724231, 5731499, 5173368, 4730278, 3814469, 8167680, 2279258, 8049541, 742775, 7581054, 7256159, 7971096, 5079182, 6344532, 508911, 7301600, 2795538, 5234115, 7367426, 6346625, 7453439, 2412006, 521226, 7980331, 392874, 7570550, 4793369, 3728966, 3234210, 3425449, 1022433, 2375398, 3377419, 4509020, 6722704, 7724484, 2351714, 1528176, 1073572, 7674001, 8110410, 500114, 303841, 8214655, 7101694, 826539, 2394823, 825759, 1586550, 5547245, 6992106, 1243916, 1890801, 1241774, 5360335, 7989979, 6152430, 7841138, 1770796, 3144485, 7808898, 664244, 4726379, 7416723, 1199638, 4059396, 573458, 4297269, 6586347, 5159968, 7751445, 13923, 7178485, 6174051, 3787674, 240725, 4186665, 4402460, 1591098, 288813, 2807572, 8290861, 5059356, 5063924, 5776449, 4436483, 5864031, 5409614, 1281189, 1295414, 2173938, 551794, 2051025, 776118, 4472346, 805703, 580048, 3225194, 7595431, 7108433, 272339, 6702207, 1142788, 63817, 6823331, 1916328, 2663113, 2711045, 1259772, 8131532, 8088118, 2963971, 3078835, 7413207, 8010696, 220298, 2297499, 4892617, 1879194, 2218141, 5853492, 7734517, 4957669, 6045751, 7552485, 1197893, 5406474, 6568777, 4209272, 5539442, 3502497, 4800896, 6527371, 7003313, 3254711, 3623152, 3820113, 378599, 3456670, 5306285, 5213009, 757733, 6552657, 7765895, 2487483, 7938810, 2860798, 3368951, 4464133, 627361, 6560682, 1662374, 1223048, 564743, 4435405, 3081744, 1490237, 4258025, 5994084, 8067940, 8074694, 5688845, 6084869, 652500, 1382884, 5414137, 2001653, 1272341, 6870987, 8271120, 5730142, 4481312, 1275364, 5380118, 7671022, 5982366, 4186302, 1357454, 5900277, 7381177, 1159252, 4699439, 3786881, 5363490, 6406565, 4617969, 8248384, 4929029, 5919827, 7562778, 165143, 2202408, 989063, 3686245, 5442312, 3393707, 5488221, 3934599, 3037552, 219778, 3432133, 7156069, 4045239, 6166246, 5141467, 6450221, 6664669, 4545185, 5563393, 6940125, 7815759, 5068078, 3999753, 6394938, 2149591, 1848783, 2658595, 4988305, 6439136, 6660796, 747320, 7512029, 2274920, 6997800, 1067768, 5919123, 4928164, 584410, 742930, 6419491, 8189549, 5784638, 6364383, 1279991, 5426589], -[6486891, 4134635, 6662125, 2267307, 1485590, 4866120, 1942594, 2315799, 4549479, 1310108, 2865296, 7414502, 4158063, 5585248, 6904333, 4709561, 6522755, 7391681, 662500, 6919424, 1242586, 7982493, 7840114, 2124013, 3424444, 6579333, 5367006, 4153374, 7163413, 6726895, 84724, 919943, 5497524, 7270822, 670241, 3864373, 3346706, 5996766, 2412285, 3829599, 4858004, 5057848, 780037, 5046363, 5183361, 3135466, 5577767, 818796, 5038430, 6809301, 7318763, 8125019, 4066804, 3466827, 4310899, 4287981, 3521391, 7907687, 6770724, 986189, 164639, 1475778, 5264157, 7908300, 5086771, 882803, 3612346, 2065187, 4710360, 3274338, 1295124, 2161795, 849661, 3174432, 5999437, 7487091, 900155, 1450944, 533484, 5211631, 666194, 5789488, 7530482, 4301058, 4783584, 7920266, 6702854, 5599039, 7273077, 1782238, 250705, 2442885, 1709783, 201696, 5569405, 2242299, 5760132, 7265903, 1737699, 6441095, 6089094, 5569757, 5917349, 5450989, 1063932, 3251013, 443637, 6124621, 7959269, 4991146, 5731727, 2615447, 2156300, 3178573, 285810, 7293436, 1844124, 5593131, 772619, 3425537, 8365223, 8149101, 6293446, 5880537, 460898, 1857027, 5221106, 1586575, 7251322, 3417109, 8059674, 5951072, 6849694, 1783382, 1403634, 7651653, 3478968, 249491, 4472553, 1726046, 7217115, 6111415, 5832718, 4082258, 4822680, 205835, 2593960, 4825894, 2836919, 8198750, 5698654, 4516557, 5665758, 4116568, 2599079, 6496023, 3940040, 2766724, 6274875, 7061605, 28616, 2509242, 5249922, 8297378, 2361152, 5057827, 6142467, 301752, 7061292, 5817479, 1253298, 6303816, 7775455, 5316596, 5341496, 8124618, 984136, 7503890, 1462637, 4485311, 4279213, 6224857, 934511, 1243241, 5967475, 5025962, 5379516, 3603492, 242553, 4151226, 41772, 890208, 1813771, 2011794, 5554248, 5881586, 7663788, 4130647, 4671251, 3634669, 521215, 5300628, 4615848, 4755718, 1176214, 4367269, 2461989, 696253, 3868849, 7148228, 3388382, 1505924, 6867076, 4168625, 5713705, 2486287, 2849323, 2640768, 4010455, 8239474, 326057, 6881231, 3209082, 6201440, 561880, 6246623, 4351250, 8192610, 7738037, 524215, 5374035, 185308, 4055774, 7980145, 7933828, 8001448, 3512516, 446900, 2421450, 1951241, 1269221, 4824212, 1632840, 4115509, 4040146, 3952078, 2277565, 5557504, 2420974, 5088619, 6694090, 6620405, 7294355, 687112, 2660872, 648892], -[3441553, 3979285, 133147, 5349434, 1017619, 2776213, 4142221, 3803179, 4540498, 5675471, 6470991, 4841527, 3357281, 7357435, 2894473, 7900698, 3169619, 5713251, 3118857, 1277342, 415609, 7220625, 6026701, 643116, 6097489, 7727734, 4065351, 6375860, 8117575, 4545678, 4333574, 5110984, 3598055, 7581953, 2439618, 1863069, 1449982, 1349515, 530357, 5619299, 5469847, 479772, 3081697, 7956057, 6309245, 1706839, 5622278, 2183376, 4213386, 2181687, 1396500, 5887806, 6740532, 5931761, 5967880, 1770294, 6007649, 7580694, 3430048, 4800265, 4891315, 5685215, 4919189, 5798984, 3538331, 8313848, 7969850, 7988911, 1608787, 3293872, 772400, 623896, 3728568, 5454949, 2814662, 5165114, 1742262, 2374598, 1642942, 7894219, 7322533, 1949042, 2448548, 4638378, 7962919, 6629587, 4951618, 4277901, 4652755, 2201231, 7749850, 8293548, 266824, 1888667, 3087474, 7102866, 2916373, 6522551, 6817945, 5223176, 1638848, 456022, 5003183, 6602242, 7404340, 4592256, 2167063, 6541547, 7976695, 386098, 5949474, 6177768, 2993831, 4216730, 3627729, 7464546, 872995, 6822210, 4862710, 3810456, 4994117, 3955423, 1509830, 2545105, 372891, 2509240, 2575381, 3430551, 1832096, 3427950, 771891, 7635736, 4430734, 7375712, 7150891, 3871714, 2369104, 5171594, 1359332, 4437796, 6942610, 3366405, 5931856, 4753520, 4961026, 5091945, 1885608, 6671291, 4423946, 5776029, 3298572, 8233382, 4931343, 5362711, 8111959, 2776709, 5390292, 717530, 6588152, 3095563, 3804043, 7346099, 2478173, 4461446, 2083375, 157666, 4793003, 3148614, 213230, 4593374, 10063, 3749586, 3835925, 3801118, 1127922, 2864566, 6785763, 7113581, 787089, 6465796, 7798302, 3835108, 3347848, 1305703, 6241286, 4328459, 8284094, 1327814, 1711177, 1795444, 665896, 1351202, 5885776, 5854065, 2797435, 1496487, 5102304, 668646, 6868654, 6333796, 3047870, 556935, 2479556, 8220176, 6155594, 7741281, 482135, 6960884, 1194451, 5715420, 3695884, 6075020, 8092721, 3222329, 3025710, 7599302, 1521787, 4912624, 6041466, 236583, 7253076, 4410617, 4101159, 2014830, 3109051, 2771533, 2807780, 3405961, 1293401, 7737756, 5592598, 3152558, 1464853, 5780958, 577125, 1681876, 3673899, 1739891, 8118368, 4230372, 2945845, 8260598, 6813870, 1723907, 7390798, 6010412, 754533, 425234, 6806744, 5113717, 361194, 7065522, 120535, 7426601, 1508200, 1582144], -[487068, 4872182, 3989539, 6199493, 95514, 2737219, 5857363, 6680601, 622058, 1133125, 5273818, 1409124, 1358525, 399396, 4353870, 3231532, 3310152, 6974637, 6200098, 5546740, 691227, 6643278, 354333, 7205498, 5548124, 1903322, 4247416, 2874696, 1186573, 7174683, 6107693, 4908518, 7164153, 5974054, 7028793, 3174692, 4392813, 5213258, 3705591, 2106541, 1319290, 5737421, 5688327, 5577885, 5337155, 2730292, 4246605, 2538795, 772522, 7508220, 5255561, 3312279, 4583530, 7160014, 6336223, 4594751, 3723083, 436532, 2369653, 1912121, 2535519, 1619808, 4779908, 6759677, 6276297, 2386901, 6087741, 1450686, 5165245, 1738944, 2672610, 4238194, 3590303, 4365412, 7218300, 2493194, 3879852, 2407856, 2644048, 1974150, 5152025, 7010351, 2354088, 4007288, 1047338, 983944, 513507, 1849449, 529633, 5994969, 4647398, 5379193, 7552795, 6049401, 8336049, 6279915, 4519899, 8310840, 1158628, 4696338, 4907405, 7236116, 7211083, 4811923, 5276319, 7742602, 3461985, 366427, 4378192, 1671837, 393983, 7094048, 3666886, 5354669, 1491114, 2712512, 328250, 6009111, 8104441, 6232089, 2698106, 3628631, 5255690, 6883789, 7316359, 3587755, 5963485, 4919045, 6687792, 4109601, 4412564, 1912747, 7262334, 5347955, 4426786, 311241, 332959, 3580117, 7276386, 6903712, 4781318, 2246500, 5811249, 1577361, 4858340, 3682371, 7810555, 1286787, 7171507, 4554132, 3627523, 6865068, 3273788, 6163772, 5856193, 1217427, 659399, 2272128, 437058, 2563401, 6672872, 3627954, 7473688, 5415216, 5271923, 5463356, 2128542, 8358876, 4291261, 5793229, 6260387, 3070863, 5090012, 3185548, 1932542, 4399391, 7598852, 4844478, 3259610, 2736770, 6860609, 3091564, 8240410, 7664840, 3747418, 6745269, 4081088, 2266090, 3306751, 6007412, 1039428, 1696325, 2427732, 8171600, 1787865, 1031445, 2893969, 5429540, 5990122, 3075135, 8014552, 2115921, 5038113, 5064367, 1414699, 5405798, 7454758, 3962826, 2159435, 3276562, 4616159, 4853070, 6260083, 5432963, 2240173, 4307068, 296823, 4571915, 620118, 5217500, 7037946, 7320181, 3770120, 7678233, 5514933, 4895649, 4257799, 3313641, 2227804, 5403601, 343819, 7346391, 7109382, 6279623, 2104229, 6555309, 937478, 8252972, 7190254, 2664726, 6348362, 4726872, 7110892, 7536209, 484507, 4761687, 3384015, 364756, 1971456, 7569751, 7382717, 3201109, 357990, 2987105, 8288771, 3630083], -[866447, 3947679, 1769457, 544454, 319297, 5389592, 3919245, 1952922, 3937569, 3387302, 4847677, 5140047, 1861483, 3601976, 414205, 4130652, 3626428, 6927278, 5260596, 7361355, 3627341, 5708923, 421046, 3703726, 1306583, 1837160, 3945516, 5411417, 4409756, 4215664, 2431852, 4063280, 921951, 47571, 947720, 8270019, 7197412, 3049706, 1270261, 4652623, 6912549, 5555621, 6696417, 2154647, 6040628, 7598532, 444172, 3049526, 5794903, 5920103, 6354485, 2717719, 2207372, 7556334, 7868006, 1461599, 3013143, 1801908, 4849285, 463172, 1739405, 5179098, 4289047, 7100056, 5813131, 6637292, 6170526, 446737, 5332989, 2674163, 3925636, 6804718, 2638722, 3748940, 6367884, 7322326, 1516153, 852415, 3451688, 1318027, 2645531, 2519773, 7598657, 184929, 4488231, 6768979, 1011689, 7290243, 2378310, 7475067, 7873783, 3656638, 8186730, 6743149, 4188385, 4051391, 7858336, 1381129, 7660103, 4685916, 1504622, 4384716, 2975229, 1474990, 4694943, 4094186, 8072676, 3294041, 8025753, 18461, 5690362, 45376, 4607830, 7530916, 3347828, 3690910, 2351029, 3669517, 2181843, 1110894, 8195706, 6841683, 32192, 2254708, 224086, 5930798, 3526744, 6536872, 5667114, 3226430, 3006410, 664562, 7917881, 693785, 6967946, 3552647, 5908198, 700826, 3161048, 5312239, 1797094, 6314893, 4667552, 7420950, 5090698, 3189713, 7192755, 919644, 3597773, 3931684, 6175687, 3920149, 325368, 8256184, 1287962, 4160480, 3325302, 6884333, 4452767, 6947824, 1330966, 1927529, 4150262, 2848542, 7887260, 7374041, 8268955, 6012176, 215748, 5791198, 5782089, 6301537, 6017312, 4065444, 2385270, 357938, 5847966, 882968, 4176509, 6192628, 3615277, 4844233, 4905553, 7067094, 5843983, 3494509, 4799205, 6141654, 5851709, 3640179, 6424051, 2432810, 2548809, 5307795, 6785641, 3191344, 725500, 2132647, 2069807, 7959108, 492023, 2928847, 2597774, 4648793, 8086471, 2731366, 4111957, 5296417, 2359449, 5718971, 95783, 7734177, 331516, 1420844, 3176128, 4010975, 139119, 40913, 350585, 2518210, 4472044, 4533156, 429368, 552783, 8018912, 4968601, 2911681, 1367732, 3751855, 2708915, 4003099, 6744823, 838092, 7668051, 4879005, 1670642, 6539701, 8318157, 4590938, 5320069, 4237749, 589813, 1786385, 1538608, 7363186, 4914439, 7984182, 5300400, 3960278, 3835028, 1758814, 7874135, 2523781, 359969, 2299194, 426777], -[1073395, 5657154, 6544594, 5142518, 3127479, 163603, 2031343, 5765489, 904245, 1034349, 7163678, 2500418, 2804720, 7733422, 6024520, 6211821, 6894846, 8358426, 7020469, 1159448, 2137158, 7325056, 3982222, 3726458, 4159121, 581021, 5855839, 4842745, 5493257, 2017884, 4938904, 1247342, 5084380, 4201598, 7289364, 3930204, 8111510, 3233383, 8123729, 5529036, 6108560, 7969165, 3802419, 1248697, 2669809, 582053, 7602678, 359827, 7102416, 7049899, 615644, 6710279, 2326573, 5676793, 709910, 4546315, 4440134, 2983390, 5603906, 6352893, 4012150, 88873, 7356523, 7922013, 5316083, 3218471, 1229305, 2331183, 1774526, 2468353, 6082168, 4467890, 2051974, 5311193, 2185199, 3983995, 636449, 7683173, 6976708, 2359199, 7630490, 5444850, 7099528, 4589720, 6207511, 6070601, 5252204, 7785845, 1598687, 417694, 3119547, 1302914, 1164756, 4471488, 2182031, 4990793, 7392796, 6221607, 2415649, 7043957, 1686557, 5308191, 1043068, 6913747, 2711492, 6832940, 7470813, 4105624, 7218337, 3729370, 3649877, 7898397, 7303069, 7999998, 7539544, 5504971, 5298476, 5315978, 335654, 6585163, 3847871, 104077, 2251840, 3784865, 2689769, 3322006, 7915242, 5033344, 7403842, 207817, 4047109, 5895551, 5314554, 805738, 2090200, 6101253, 1932159, 3213089, 5423322, 5555222, 2765815, 1003830, 6642836, 4989331, 1854998, 2726512, 1063926, 2314196, 4357559, 4941745, 1034470, 2172177, 236885, 6670628, 3538854, 564881, 5663550, 1498214, 4980961, 4150543, 3196640, 3326073, 2866721, 1275750, 5655474, 3177899, 3448846, 7446357, 6448869, 374180, 2296737, 8235941, 6957014, 5670644, 7680933, 7183947, 5354752, 5648560, 84742, 230321, 4951775, 4182627, 1014047, 5036690, 6523130, 2667668, 4074835, 3430880, 2069902, 6214553, 2211210, 2402142, 1799331, 7641195, 248846, 2870575, 4179921, 3999181, 2766387, 5361256, 2020385, 3936778, 3110820, 6843107, 541994, 6960644, 475677, 4049315, 1303632, 2209309, 8237298, 6784317, 2912388, 3576854, 5166596, 3875597, 7668509, 7551469, 5188298, 3340684, 3365695, 2934298, 5669260, 408513, 497445, 7710719, 2799603, 2127868, 2633101, 4208433, 2653519, 6011240, 3210626, 4527122, 2769037, 846747, 6850903, 6695043, 4534988, 4376037, 5658002, 4321125, 3444444, 7785273, 4819806, 3518442, 7660022, 1360830, 6388208, 3071767, 5747428, 6500875, 3906812, 5681769, 6368480, 7412897], -[1091497, 5888885, 5945547, 2880565, 1447085, 2690723, 108740, 983805, 1260361, 8032161, 2936029, 1785380, 6112095, 1994872, 79532, 3077177, 2964652, 5359618, 5359651, 2986548, 4032941, 59371, 3803946, 6243804, 8142756, 266347, 7430749, 4628145, 3684061, 7568280, 1727752, 3293707, 1176920, 1416086, 381956, 759510, 4638303, 307382, 7466831, 6420465, 3868486, 7212259, 3336735, 7785055, 3392653, 3319832, 1452478, 2634977, 6248949, 5163732, 1080444, 6039360, 5314580, 4252618, 5750481, 5223530, 1176312, 2877927, 914338, 24183, 7982210, 6586021, 8312315, 185610, 7660912, 6901543, 3734474, 108177, 1389719, 7074642, 6539600, 1569442, 1114271, 171575, 7945294, 742430, 3785546, 2458678, 4479547, 1723972, 8097353, 3521327, 2485040, 6424723, 2779848, 3405193, 813098, 2950085, 7206715, 6422772, 5244855, 6466051, 5512150, 6091835, 6251868, 997002, 5051077, 129099, 3966085, 6322269, 7136957, 1861223, 7216215, 7934179, 5763921, 2505075, 5045266, 541109, 8253516, 7957826, 5174331, 6109912, 5522359, 430725, 4348935, 7848288, 847964, 7579877, 1186688, 2795794, 8203186, 3717882, 273977, 6806558, 1931939, 5339534, 6657207, 2097390, 7787353, 2211503, 4033233, 3829874, 498898, 284839, 6528472, 5444690, 1190447, 6514354, 4106148, 1195303, 8323366, 8157369, 6721871, 3185748, 2359412, 479260, 6776310, 1504006, 3397140, 6280421, 5448049, 6321251, 4294833, 760819, 5665060, 5666810, 2139339, 593614, 3365896, 4223012, 706215, 5614132, 1015453, 5208741, 7125391, 2500415, 2190623, 7241064, 6774419, 985451, 2693600, 2585293, 3912648, 2763566, 4452648, 6897261, 2851520, 5564469, 6063664, 342509, 535117, 7457880, 610637, 2289616, 7072403, 1166571, 597267, 4342576, 6433689, 2053020, 4854467, 7122474, 3236606, 2852219, 1411019, 1067602, 4034975, 3307185, 6987468, 8188574, 2536672, 8317394, 3481082, 418944, 3168953, 6826194, 3305744, 8156918, 2727679, 5319840, 6903436, 99739, 5492437, 688023, 2023161, 5058813, 6477746, 6265546, 4248552, 3361626, 6360121, 3043848, 494761, 434014, 7762789, 6140129, 2452502, 7796445, 5206461, 5601787, 4843562, 5108236, 5611560, 5135291, 49356, 3082726, 222102, 2068422, 2887627, 2451878, 4084165, 5152179, 1751777, 7818436, 6248250, 532717, 688194, 3898514, 7879288, 6366190, 3584176, 7651835, 4213487, 1989911, 5042449, 4539840]], -[[7811034, 4101752, 4245472, 6073675, 1840404, 6250945, 1555058, 2120393, 1371489, 1671518, 4281717, 3309207, 6016120, 2526947, 2597507, 3488163, 1473549, 3896396, 7464922, 5062365, 720334, 2654250, 2806963, 2343272, 7959183, 5625930, 4238586, 2828879, 3218093, 8275971, 255241, 95652, 7358277, 2955752, 6588258, 5436651, 4310701, 4115484, 3997590, 1681180, 6377377, 4984026, 7728084, 1124172, 5151515, 7392587, 7212320, 1988786, 1469334, 6576597, 7671570, 2457976, 2032623, 7915765, 25792, 1993849, 5812670, 4145655, 7681746, 5613768, 5907693, 4310916, 2356521, 4579667, 5528002, 1081873, 3731128, 6821365, 5640258, 6908964, 6689436, 6691586, 1960130, 7978197, 1361321, 2204205, 4792675, 6751253, 6224912, 2714525, 7157068, 7773271, 3449774, 3704355, 1948548, 7333442, 4142247, 7190427, 2644876, 5893841, 4040484, 6436308, 6162570, 4586169, 1124328, 8122457, 7688341, 2198877, 3049460, 7538209, 7955893, 6706569, 3936421, 1182256, 1275366, 7542693, 8240356, 6695277, 8349688, 3857760, 48323, 3991311, 6045712, 1178717, 5180071, 4071305, 7031633, 3814811, 1042233, 3301709, 7651908, 2429255, 1194267, 6145474, 7142062, 168019, 2603243, 1929145, 712081, 8342879, 5792855, 6278775, 2615169, 7076719, 4476696, 4287465, 3661903, 5285781, 7800841, 7584498, 4088201, 1348969, 5369736, 2441916, 948390, 1353929, 7715351, 3431405, 3430793, 7588591, 619170, 1658274, 6969721, 4132746, 911100, 129925, 4738018, 4278712, 5533966, 6258744, 1520978, 6743151, 6468528, 5029792, 4775056, 5178178, 1137833, 8128756, 3935124, 1658609, 4297552, 302874, 5179623, 5821844, 251791, 2181799, 5885328, 4114299, 7910280, 2640821, 2630708, 5646095, 1572538, 6120953, 3006955, 2127227, 4920357, 1404365, 4804281, 5524336, 7553822, 7094073, 5635183, 3997367, 931747, 5483244, 4680653, 4228086, 8236395, 118522, 7617447, 7319084, 2974225, 1215473, 3555039, 6662272, 7110713, 5436233, 3979616, 6272857, 2003140, 1237529, 7266963, 5765861, 785352, 7206448, 8224950, 5224884, 3735985, 4149803, 2557395, 5401731, 797413, 944538, 691439, 7879378, 4427982, 1758520, 5266671, 2666997, 4760746, 4165771, 6017287, 2755530, 2999992, 642462, 1354184, 4126885, 7111344, 3700, 5555924, 6694733, 6452652, 1535625, 4307722, 3570299, 4056305, 7861196, 322078, 158368, 5079383, 3448260, 1313471, 6011413, 2035183, 6251261], -[1256704, 1488355, 7581873, 7558212, 7859489, 7092691, 7575430, 4205350, 1319598, 1739683, 623414, 6513847, 4614254, 5691051, 3896457, 3201893, 5354838, 1747765, 6887182, 5075088, 6633310, 674619, 5762972, 3983920, 7317707, 1288197, 2318301, 7236862, 1999326, 605736, 4887038, 1937153, 3701597, 926606, 4575448, 5383892, 2688188, 4901594, 4137514, 3877928, 5436773, 2536088, 4110745, 57030, 7657193, 6898520, 5187922, 7337738, 4067762, 5516933, 1579484, 3933838, 5110111, 959253, 8009430, 388313, 2920587, 449655, 6870454, 7317543, 7938387, 5961729, 6016667, 869106, 77445, 7966818, 595236, 7006559, 1386164, 296446, 5173226, 2273891, 5119728, 5299221, 2329867, 3571905, 1341274, 6108746, 3521510, 7151103, 6333391, 7746300, 690008, 2058189, 1538670, 518253, 2864732, 6847196, 436780, 781503, 7820175, 3555789, 2895884, 4329272, 4007871, 387699, 2146874, 4880718, 4813518, 169614, 2416606, 4371208, 1581503, 5450949, 7338913, 2413508, 974281, 6182988, 2007399, 2378714, 5566680, 2332982, 284428, 4079364, 2479613, 412453, 2958177, 2323915, 3073554, 6925681, 2838387, 7256803, 7963195, 5427935, 5753546, 1897883, 2599545, 1047633, 4656600, 1308018, 6616741, 1785945, 6386465, 5871322, 2717040, 1840926, 7406815, 4247873, 3539674, 4505060, 6457339, 2309193, 568925, 3979458, 690765, 7486625, 104640, 1028101, 7581807, 4692806, 7417001, 1989144, 979611, 4032945, 7204189, 5262250, 3927790, 599505, 6301276, 824057, 5381724, 2081592, 3943831, 1363517, 6158597, 4940388, 80763, 4144015, 292403, 936608, 78183, 5200365, 5380622, 6275487, 7205203, 7792195, 7862887, 5956808, 6917451, 3837513, 2652991, 6788080, 4547298, 6258780, 3013551, 1909177, 2751272, 8069917, 8350637, 6115312, 6420050, 1859334, 1134198, 477566, 5139461, 5246866, 6997939, 8226041, 2729740, 7422743, 2194665, 6475007, 8047526, 4429272, 6910083, 3942719, 6830983, 5712321, 3380462, 4901570, 4242386, 5844186, 1716794, 2789389, 4481338, 3741804, 751713, 72888, 2380303, 3100852, 1052470, 4755402, 7379879, 137045, 3045108, 1350904, 4366777, 5732703, 261014, 6270944, 7390063, 4739261, 3026858, 841503, 2073893, 5688322, 3191351, 3636487, 7246195, 7470765, 6000780, 809318, 5205086, 3461811, 3761188, 4553585, 1289828, 6146932, 7809159, 6804052, 7695660, 2315687, 4127215, 1115226, 6150121, 5731701], -[109922, 4185020, 646071, 4045549, 7361432, 7699670, 2954929, 5255748, 3714642, 6832145, 8037086, 8211787, 3834552, 7989652, 6418615, 3353711, 3600625, 2807706, 3532517, 7351418, 7076621, 7762202, 8151520, 2144508, 4589692, 4743880, 3194433, 680377, 2458095, 1483222, 8284513, 693750, 3318666, 5831973, 4370188, 145627, 4375869, 8144341, 2213926, 592792, 7681198, 7023921, 6950836, 7102755, 2199059, 8006675, 6526003, 6399429, 4991621, 3425378, 3868271, 7347478, 2631896, 6315997, 7252311, 3819053, 5724728, 3597198, 5190987, 4203206, 8215746, 2536959, 1303784, 6765998, 3614651, 2662547, 3633239, 7718348, 4512462, 497572, 2961067, 1090436, 6431850, 6685021, 4475041, 5640488, 6397796, 7208426, 2192549, 1406456, 6105572, 6592591, 6848068, 3269128, 7029944, 7391674, 2306085, 4668390, 7384417, 4973328, 6802039, 7503461, 6366739, 3548138, 520290, 2728819, 7686180, 848848, 4634200, 6976636, 2698139, 1500942, 531637, 1365438, 7378624, 2832560, 1547201, 3607022, 5182797, 1274524, 1120935, 4537781, 7285878, 7815823, 5448805, 3115927, 717397, 1342678, 8165940, 7751375, 6165536, 7606850, 8175106, 4819176, 2616014, 7209646, 6324214, 2618433, 590915, 3205647, 6405045, 5355917, 196609, 6788593, 5193005, 2954403, 7698605, 2330814, 2758946, 3834615, 2724704, 1919839, 6181472, 645634, 3209922, 5732551, 7457721, 4206286, 268221, 2018033, 5536207, 6243472, 4728415, 596017, 6162972, 2917444, 686065, 7448051, 7188144, 3698257, 6687114, 7277146, 2524804, 1089670, 5061967, 3331757, 2496812, 6140951, 3507352, 4342099, 8139096, 6780893, 4723825, 4489752, 622398, 259375, 7725254, 8087603, 3364148, 2642604, 4571747, 3475495, 8237459, 2653030, 3877743, 2267222, 2376385, 387997, 7879722, 6818908, 2888989, 2068812, 951382, 5258253, 3002237, 4330703, 2166667, 6671132, 6254560, 656374, 3715709, 4866989, 2312321, 2182911, 1999505, 763684, 7615860, 5723638, 2153463, 7622031, 4255488, 8341721, 3141229, 211020, 4644884, 6258259, 8092958, 7053192, 3382074, 748840, 4580928, 2958149, 6435024, 4649496, 7847275, 1158032, 6255740, 4134874, 5882852, 19161, 3701972, 7237434, 5767498, 389894, 2626734, 6917378, 8331028, 4312429, 1642940, 4871803, 2684100, 4110681, 6904038, 4254741, 454595, 7622610, 5514822, 6565493, 639234, 2697405, 8332752, 2268418, 1165456, 3930460, 4035883, 5306127], -[4483816, 3379592, 1203546, 2692844, 3427347, 3560702, 327826, 7632973, 8024956, 4331491, 6748621, 1459765, 2904956, 1951615, 4513228, 6971204, 5846516, 6030800, 3877016, 6434794, 2339897, 5552229, 4219454, 5405387, 3114314, 2225157, 396615, 92872, 1079978, 6884247, 1168789, 3510860, 1717039, 6275755, 2663979, 660714, 7922203, 3546608, 1205723, 4966453, 5866114, 5571988, 7879994, 7043226, 3062032, 3622844, 2092782, 2942763, 4795751, 4904374, 7744555, 1725917, 5860205, 475395, 1034126, 5066202, 4405744, 7050318, 530491, 8359120, 3358424, 1717516, 690729, 4676559, 1094250, 1695506, 4465868, 4740971, 2239327, 4966152, 4689145, 3284467, 1580817, 852538, 3741767, 6451186, 3778806, 6159023, 214477, 1237453, 3995042, 5226216, 4053200, 6275128, 6391361, 1609377, 3137151, 6800822, 1902869, 411819, 331183, 7567583, 3515536, 3968800, 3586825, 6690600, 2997817, 7192003, 7456641, 2132739, 2180485, 4079933, 1988700, 1026873, 3874858, 370845, 201437, 635322, 5198928, 3008997, 6276376, 5390774, 274788, 1442311, 839132, 4746707, 2263155, 8024317, 2668925, 4276631, 3075967, 7655496, 2396561, 1006296, 480569, 2741029, 6989234, 1040298, 2787738, 2908218, 7805540, 6996655, 430918, 4700629, 3018146, 6141364, 4086145, 8341757, 3506329, 6410534, 2202976, 88672, 7219552, 5657181, 7868798, 6668100, 8293960, 6093194, 5781844, 1915347, 2855028, 518222, 4840426, 6328358, 4896957, 2068139, 3181328, 2680058, 6603632, 4317271, 1837761, 6639253, 2201105, 2625448, 5508122, 5367425, 1595870, 7476458, 8106677, 5948865, 4695503, 7802511, 2242096, 7632432, 345069, 817086, 5464529, 4361594, 2017789, 5126058, 3597053, 7863302, 7637726, 8357340, 6803380, 6282652, 3199666, 7418499, 7010635, 7938770, 6626909, 2009459, 3142533, 5305210, 4370962, 1720330, 1495234, 4844605, 8096759, 7718297, 2066004, 1708289, 3218672, 4579767, 3994046, 4948983, 5809873, 1814558, 8140746, 4034502, 2227392, 6289371, 3407837, 2303869, 4896085, 3215749, 5993081, 4652499, 6402551, 3507036, 4284634, 2779926, 5053256, 4700734, 4624439, 5819197, 7579824, 6497464, 8301976, 759075, 6134726, 6616248, 2925808, 1628154, 5139381, 4649740, 2611764, 45664, 2438990, 1116980, 3415587, 4806248, 7230362, 3984018, 268676, 2174811, 4506765, 7764197, 3315762, 2609243, 5712324, 3243764, 2883906, 3038378, 2058201, 5999244], -[8051145, 5145816, 1776929, 1565352, 3826835, 255606, 7531483, 5409777, 78830, 80006, 5094255, 6403281, 6227379, 7122081, 4312321, 7267994, 6284531, 5630679, 1535142, 5621959, 6872447, 2949585, 6621261, 380618, 4972084, 536535, 8250887, 6369664, 6306588, 2816537, 3802017, 8282333, 5606907, 8254701, 2463360, 203279, 3885991, 6000707, 1186711, 3653237, 6599927, 4155527, 2283701, 6112953, 144165, 2849003, 3131070, 5774682, 7944174, 913848, 6412105, 2067794, 1806582, 3181323, 2808803, 1483852, 7356835, 1701030, 76715, 4976722, 1946731, 5556745, 735141, 2472958, 3034498, 5964770, 6461590, 3663453, 3579686, 7806684, 431355, 7447767, 1639772, 3948854, 3579701, 5996845, 4835117, 3761968, 1114643, 7803303, 5558087, 6130280, 6837251, 3240831, 2661974, 7265694, 6123, 7130221, 4047124, 2737230, 7687334, 3565149, 6329857, 2127526, 1939858, 2246148, 5026402, 1366582, 4408979, 5044312, 3056539, 7647688, 5601482, 3945656, 782895, 2563355, 4084915, 7886949, 1663457, 792218, 116788, 2650204, 6220050, 4767858, 2135096, 4383604, 6068199, 6980386, 8100125, 3717870, 1751799, 1169428, 6601735, 346037, 7721802, 6474309, 5035155, 7207522, 3305271, 2411038, 4694592, 4948476, 7531435, 4968575, 3436510, 665667, 7184482, 7646505, 4231544, 3857385, 3948538, 6813903, 7841245, 2820874, 2097148, 6662407, 3014948, 1351909, 7298755, 172484, 5062326, 7124626, 7917513, 4738864, 6039188, 2000501, 589729, 2022173, 5710600, 3707244, 5385622, 4067453, 5891045, 4453487, 5495426, 2090686, 7100792, 540553, 7258372, 4744151, 6477215, 4359700, 7198626, 5126790, 7102482, 6021695, 5631416, 2110081, 5606040, 7127673, 2732845, 1269337, 5385847, 6071973, 1648112, 4012618, 2554936, 7453012, 5869976, 5190781, 4984310, 8269436, 1053969, 6646070, 5448377, 1068431, 2780819, 2889768, 527531, 7713764, 1639612, 6918726, 4056204, 3420246, 3370180, 5077292, 1850388, 3456363, 3324234, 3869511, 6983293, 3264994, 6952813, 6629000, 1530196, 1269398, 2145320, 7586100, 9091, 5363502, 3434928, 1088026, 7444489, 884347, 7474044, 4081981, 2761150, 7607852, 5437025, 5566456, 4311956, 4521115, 4108533, 5923142, 6105850, 191156, 2785562, 5087888, 1896068, 4129716, 750810, 4120008, 6890438, 4691909, 2069278, 578527, 5023581, 2123017, 2309955, 5129166, 5187886, 4325504, 3130060, 2110730, 6731086, 6879866], -[1630276, 523180, 2797640, 2762571, 75733, 4223242, 6272299, 6599994, 3270576, 8299462, 2868060, 7091997, 1433287, 5825090, 6838783, 2199558, 3354990, 7115668, 4667311, 1661288, 400830, 18133, 5073934, 662345, 6174430, 5559616, 1296802, 6195848, 2709860, 4645106, 6870301, 6480242, 1783682, 5878939, 4848048, 6383603, 7796085, 3362918, 2320705, 7477367, 3790148, 2166149, 5184348, 3493576, 6660923, 8155232, 1437872, 1124258, 8037137, 3556598, 3888628, 3677225, 4839596, 880652, 5139752, 477012, 7226642, 2780778, 4436703, 6316265, 5409256, 206849, 3267902, 7318947, 4974291, 6870905, 6153128, 1679853, 3948769, 5540510, 6962514, 4275622, 4985516, 4799772, 1835328, 5465327, 2145165, 877519, 8254963, 2690654, 1903699, 4717278, 1455748, 1920264, 4614067, 2737606, 3001127, 1968039, 5874809, 5861629, 2233521, 3884365, 5162206, 3018088, 5278649, 8062625, 4241874, 7589272, 1096604, 7300491, 4527378, 1273497, 1433633, 7723238, 248133, 5997038, 5111139, 576518, 2608269, 582230, 4158483, 5220008, 1660209, 3555975, 2059227, 3055112, 1145482, 3179263, 3903974, 5007914, 1560801, 120909, 7016349, 5390387, 2466294, 4745506, 4701950, 4615508, 6395300, 4771558, 3646858, 2905980, 2936907, 222613, 2290260, 6649832, 2487272, 7606870, 3226133, 6286485, 752564, 5291910, 1717460, 7766798, 4391771, 7204765, 3937422, 6590678, 5714907, 755546, 5551649, 2544917, 3436186, 6901681, 1758541, 5006312, 5649748, 4660045, 4382653, 869434, 5972359, 5392261, 2784078, 6677345, 987288, 3999373, 6220372, 5220792, 7936016, 6864280, 6043212, 8139255, 3321310, 6230630, 6681532, 293740, 5880645, 1003359, 5025143, 1166524, 7521743, 1243824, 3397665, 7374145, 6787561, 6778317, 6162283, 2699401, 483819, 6707997, 2302692, 999784, 3257905, 2346885, 2655946, 2558008, 5397536, 4643384, 3325909, 7231049, 2569893, 5578458, 2336952, 3650104, 5078456, 4588238, 535103, 1428479, 5267909, 7110638, 648978, 3753595, 6739991, 3454160, 2467079, 4844239, 1259945, 2457759, 4223943, 6631487, 8356361, 1579483, 5126787, 2826789, 4443343, 601641, 2864994, 3274408, 2627862, 5822624, 7146096, 4050572, 3903430, 194490, 5498980, 5022682, 4621536, 2840691, 195461, 4834166, 6786792, 4525861, 565141, 1540056, 701331, 5619166, 6085163, 1491014, 7828941, 4586411, 3526621, 7966877, 515244, 5826290, 5540034, 1605806], -[751530, 5905843, 3672147, 4127071, 6938257, 7569913, 5720039, 5698380, 1076489, 6078155, 6140224, 976796, 4359689, 1431756, 2263584, 4458374, 5660321, 7100983, 5830682, 5039840, 3545504, 5360258, 5548835, 1822537, 894864, 1328328, 5334186, 8126709, 5662139, 6165209, 3552847, 6794949, 1284556, 646401, 1957098, 7612063, 2075893, 6426311, 7418949, 8250033, 5534641, 4933989, 836951, 4254844, 451369, 8213836, 6666052, 6881094, 6017598, 2906435, 7140232, 658296, 5831168, 2715854, 5569452, 4864739, 4223620, 5446283, 1444386, 4750472, 6430572, 5678195, 3742508, 1773619, 2419742, 6328743, 3495481, 5498585, 1168765, 7778401, 7783292, 2585518, 189877, 1519462, 2278452, 4308869, 1603426, 5967464, 6474730, 2177500, 2324828, 8014510, 3370896, 5440640, 4081174, 3287298, 76333, 7801033, 3380507, 5616079, 6779437, 6196679, 5020492, 5202345, 3224340, 6431670, 7397932, 5909088, 5461769, 779990, 4839690, 1857373, 3623298, 1369497, 1460706, 2943193, 5202106, 3483202, 4095858, 7951836, 1072067, 5593151, 6579328, 4484671, 3564098, 4039949, 406144, 5514184, 8237154, 2186454, 7515983, 898844, 1743549, 2529736, 5644280, 5375228, 2476243, 7091064, 3297269, 4770674, 6979279, 7559932, 2012394, 313989, 1485807, 1157859, 6874030, 173990, 5380925, 1777874, 2068217, 1978150, 1057131, 8134735, 3336236, 7358905, 1466324, 2290795, 8178763, 7489415, 1173640, 8268809, 6066941, 5011141, 6448773, 3367821, 4318769, 5476441, 543744, 313760, 5879783, 5781450, 4946107, 4357621, 1353832, 2580726, 5125600, 7950855, 8054853, 1423231, 6145445, 7360399, 8128706, 6444457, 1155444, 2560997, 7923929, 2347011, 6296431, 7347275, 2881346, 7477119, 3896982, 6639865, 536591, 3703725, 727079, 3641942, 2649035, 6752022, 6416050, 3646962, 3474762, 6224146, 7292612, 4317752, 6631707, 626905, 3832919, 1455118, 3531308, 1241716, 3039723, 2637620, 2201581, 3870412, 718136, 4144478, 2188112, 4102630, 4473449, 4332451, 4299788, 434455, 5464736, 2349781, 4800943, 4828454, 7697639, 1199874, 7104871, 5215017, 2710162, 372782, 1837242, 8097956, 7683642, 3840989, 7886703, 4614107, 1663442, 5735352, 6620824, 8158491, 3557378, 3695912, 7026647, 3973571, 7707159, 7523748, 7017564, 8230503, 2903301, 1683179, 2722733, 5797940, 4694416, 5042813, 720723, 4461916, 947782, 1117287, 6737929, 3069419, 7988813, 6706592]], -[[6065439, 8098530, 5023810, 3381156, 6754733, 8094528, 2177707, 3111036, 7726676, 629546, 484643, 3088074, 8083517, 3432654, 5947760, 7464840, 2809352, 1293705, 2161515, 5167235, 7588976, 5272972, 2507932, 4740874, 6713670, 2677670, 5944836, 6280256, 3504771, 5665806, 4261247, 5346554, 6855031, 2342557, 5386712, 374061, 5834168, 4738021, 924002, 1651429, 2817473, 3775056, 8191761, 3019257, 4873383, 6864721, 6005610, 1554003, 890595, 5017759, 129837, 1797130, 6927116, 7222023, 5456406, 2989326, 5239270, 4960563, 2804667, 5558044, 8248954, 7231731, 6851615, 2736490, 4381530, 1851355, 7327469, 2633801, 1188268, 6666886, 6009233, 7138474, 5855102, 6936599, 2208617, 7506787, 6935467, 3083477, 268341, 5051249, 685554, 1631620, 5502636, 5703894, 476211, 841551, 5578983, 5496622, 267959, 5083084, 1086771, 1813620, 1877396, 3046376, 3953948, 2812225, 1752363, 6287571, 2783914, 6861632, 907280, 1692098, 712059, 5579485, 4443683, 8225659, 8094792, 6219611, 3934896, 3058583, 682062, 4094924, 4572655, 4595098, 348239, 8194569, 7069956, 1158279, 4203848, 8159248, 7301504, 1376237, 3003634, 3139321, 3393982, 7678646, 5361024, 5600871, 5115313, 6164519, 5052485, 2125740, 187821, 7855321, 6141126, 6321742, 6663527, 3085067, 7177000, 1123310, 3035694, 1060155, 7565014, 5349429, 1442616, 807345, 5422688, 1909112, 4792902, 8077562, 8068234, 3876796, 3664755, 7997599, 7742808, 1596915, 6646805, 7029787, 6356840, 4550401, 1342566, 7172620, 1281840, 3033542, 1221120, 642163, 3649099, 8000533, 3943967, 7447439, 4935652, 5839684, 4628894, 1927890, 4487704, 2170724, 5682155, 178968, 4409051, 5818012, 8198602, 3963301, 5548696, 3533619, 1479720, 7758344, 7216034, 6520999, 5008243, 426108, 7910967, 1519116, 6430637, 7696642, 3230976, 5997069, 5676833, 3780721, 3757373, 4468243, 4757017, 7609122, 4958938, 4423267, 1159821, 4754098, 1880200, 3249813, 4596375, 3205560, 1475629, 892832, 2266101, 1369551, 5856215, 5169258, 808305, 8135676, 1723528, 8242694, 7000718, 5239617, 1439637, 3866441, 1672738, 1640374, 3451118, 3979491, 2727658, 3960102, 6885664, 5084531, 3139692, 2309980, 6745314, 3779889, 4473594, 787503, 962662, 7848557, 5524131, 5105164, 1112207, 129779, 7662914, 6864707, 1046269, 3598044, 7924894, 4919929, 5504571, 7644181, 6175045, 8347723, 6810483, 2845860], -[4007120, 5423943, 4306969, 4494957, 2761168, 800537, 6538318, 897473, 5377893, 2096060, 1890988, 3770397, 2216755, 4691747, 7702645, 6363843, 2625662, 7527301, 1503125, 5164199, 5842069, 2036053, 1992862, 5119892, 841022, 8308219, 5278310, 4113988, 3996346, 7495801, 2924478, 6829166, 3053315, 6290721, 3999812, 2369223, 1006380, 648489, 3345382, 2843439, 1332072, 3127630, 6085969, 1168473, 3281009, 1579820, 4532577, 3911106, 5704565, 4311750, 4973522, 7249092, 2690177, 6076057, 7146221, 6810693, 7229874, 4067772, 7589685, 5523885, 2285367, 7505433, 3337642, 2997313, 8242998, 5172400, 917219, 3211637, 8024970, 1373899, 6398327, 8334626, 2376275, 1040964, 6855672, 2097302, 19747, 1290176, 102349, 5686201, 7291506, 5016938, 6334176, 4196839, 1014297, 1042425, 3899853, 4340175, 5817727, 1299889, 1520217, 7379288, 3902502, 6287771, 3292794, 4996075, 6704117, 3732567, 5266808, 4248435, 7865397, 4312725, 1846977, 4708806, 5750892, 2099692, 8244241, 3643726, 881312, 465703, 7355745, 6934849, 4731372, 6529701, 7866754, 2146466, 4752091, 1196952, 3864527, 3888854, 6318296, 4503032, 989019, 988975, 7964009, 6765922, 6670523, 6000973, 7367533, 3028000, 380308, 7263464, 1053469, 904372, 2771224, 7045432, 841953, 8283212, 543359, 7116833, 7788957, 3377047, 1410397, 6638640, 5930780, 2848485, 805857, 1406190, 2988106, 5204346, 3666932, 7926941, 2488280, 4985040, 2865110, 3035363, 1497202, 2817796, 1993263, 1590887, 1844254, 7001652, 4194258, 6393088, 8003079, 3852112, 1727679, 3541710, 7503319, 7555829, 4955325, 2643206, 1369803, 6691658, 4943062, 3026882, 1142921, 7661220, 1678271, 3149574, 8167950, 7623039, 4896419, 6722398, 2939096, 5729350, 3568411, 1422175, 4604617, 784613, 6608734, 4650598, 5974213, 2397461, 5545194, 5198203, 2996451, 4597343, 4153035, 6772858, 2639233, 6847483, 2664030, 8190252, 6634332, 7274845, 4795777, 5385361, 5996962, 1739905, 8319401, 6223355, 3877982, 6956879, 2427708, 6002480, 5433573, 6775158, 5207754, 7121567, 6044217, 7430943, 3353263, 5479123, 2057020, 3965090, 5103532, 9620, 7894203, 195375, 3553067, 4562964, 3521892, 2639695, 7326355, 7694597, 4188489, 4077371, 3229382, 3455191, 2777309, 1065956, 4343354, 2983455, 7148309, 4548468, 3024992, 2040118, 7211470, 1920227, 7706345, 1668559, 3029285, 4463782, 3510335, 6700969], -[6323841, 5209833, 5157296, 466039, 2749828, 6970345, 1962517, 7353185, 3694630, 3683167, 5208263, 4427881, 5780948, 5375250, 5100008, 7179708, 5070481, 3838328, 4793520, 226234, 3680194, 7823751, 4272524, 2530644, 3256965, 7689738, 2369891, 6122504, 4686244, 3569148, 8317704, 7020426, 4220274, 887330, 692608, 5378003, 8285122, 134049, 2624513, 1868211, 987881, 665778, 1815333, 5586872, 2203713, 3377406, 3404010, 7127424, 8022483, 2303055, 954376, 7697690, 6403982, 986782, 104867, 2254228, 8306009, 4319806, 6171726, 4755601, 2243642, 5767709, 2867879, 7167377, 7719897, 7484176, 1566245, 3924729, 3445057, 5308767, 4588273, 2681809, 4248141, 7167510, 860789, 828580, 5868201, 4841612, 5615046, 2241199, 68068, 2089044, 2264942, 663786, 3776796, 7030236, 7492646, 1268409, 5505005, 4935375, 1030628, 4907225, 3986279, 7918597, 264305, 2122525, 2107495, 1543964, 7223646, 2459152, 4141351, 4836274, 435860, 1306531, 4277859, 6035603, 5067301, 624480, 2331879, 4749864, 6551227, 3908396, 3851233, 919087, 6562890, 3314476, 3067031, 6914429, 5470171, 6572362, 5474978, 3727388, 6693137, 1506493, 1633673, 787017, 591648, 2557564, 2570816, 6445452, 2016023, 5199010, 8051130, 3678378, 1172422, 6755164, 1114389, 3000723, 8190855, 1841795, 1330841, 4639722, 1099629, 7637507, 2118361, 928782, 6790090, 8362917, 3103942, 2233548, 374401, 2849666, 3590394, 6351470, 8073256, 752145, 7439588, 3757919, 7696535, 5786268, 4201353, 3897052, 275547, 2911786, 6912150, 8197144, 3021691, 279320, 7192665, 1805177, 8140386, 5870875, 2156492, 4339064, 8123514, 5483203, 2694781, 6821387, 793256, 3383296, 8000491, 5694434, 2650030, 4527299, 2052913, 7457517, 7866862, 5867514, 7431849, 7973790, 3977604, 6589365, 4253888, 1628453, 1537005, 7135886, 6545013, 3739472, 4760670, 2483672, 7276474, 2652710, 76150, 964432, 1590418, 7444807, 6778848, 3767619, 4630593, 9830, 1803185, 4072069, 6194467, 1422413, 5033131, 682879, 4652767, 2402001, 7809203, 208637, 8375957, 8070047, 2260867, 1706434, 2610320, 3542000, 3597433, 2890298, 6751982, 5330380, 779100, 1675140, 1353843, 3088832, 2629579, 6467217, 7778088, 564663, 5091190, 4345288, 2792860, 7793481, 6583310, 6796384, 39045, 7562747, 5550914, 4199782, 1017567, 6255493, 4139212, 8219736, 7585519, 7835405, 6977604, 7231492], -[8154847, 7566155, 6146913, 2462188, 5971340, 1798655, 6204442, 7607641, 3936291, 1606870, 7125553, 73749, 2568183, 5390254, 7182909, 4042384, 2765143, 6809397, 4729520, 4658091, 1692613, 4815224, 857808, 1850571, 4415706, 5828583, 1510374, 4333325, 840381, 4465684, 6648950, 7710895, 6094197, 1167586, 2150385, 868522, 8090466, 3543213, 6862447, 5414557, 6745364, 7873095, 7615115, 7248369, 5926609, 3836333, 6017410, 7145166, 3554046, 2304324, 1386528, 3258835, 4181051, 963172, 5627171, 7476731, 4313342, 4743085, 4092880, 661108, 4592973, 3021186, 6417065, 5896927, 6197897, 4550478, 6995515, 3522238, 1082938, 1235805, 7622564, 6515645, 2822702, 2913189, 2553916, 306480, 2596679, 3147894, 2003502, 5242706, 2518437, 5697984, 8258205, 6636021, 259943, 6890034, 7901191, 4552161, 6291357, 3503629, 2759818, 1969485, 3098650, 4051220, 5117605, 8225404, 4357592, 6705720, 8105378, 8250338, 3223284, 1310449, 492274, 2307000, 3961233, 7363485, 5577650, 8068442, 6695612, 3403410, 6060904, 1628342, 2009841, 7466363, 913053, 5191025, 489039, 6433274, 6416666, 7516965, 1234497, 866504, 537164, 6815340, 7380410, 2381525, 3432042, 5257016, 5940752, 6773508, 4181364, 804323, 4917649, 7679849, 2532945, 1833247, 6750930, 741532, 5705471, 594678, 8020641, 6827685, 2622621, 7709457, 2623542, 7924848, 1291259, 3755298, 1469448, 7537353, 6065121, 4824131, 1883842, 2475181, 1898269, 4502642, 2190114, 6648633, 3894977, 3072148, 970904, 231839, 3682422, 3654869, 1513149, 4386838, 7302344, 683068, 1458725, 5573891, 5293368, 6804543, 1242510, 2198628, 3617190, 3267290, 7987379, 6459326, 1908387, 6613312, 2029049, 6191882, 3892387, 3698734, 6964746, 3397539, 5716224, 6282650, 5956617, 2023007, 3861456, 2267203, 1979851, 6934881, 5854970, 3931281, 392332, 1392461, 4171168, 4721159, 6239800, 7787564, 1248320, 744301, 7498446, 2866748, 5909376, 5807494, 1193609, 965605, 3452681, 2631568, 2666659, 2645873, 960192, 810012, 3076060, 3026031, 7542342, 5816586, 708606, 4670334, 238456, 3303528, 125255, 3843602, 2607509, 966211, 2899406, 4887532, 7242203, 1821906, 992231, 1025328, 4068852, 4791641, 4188290, 2755045, 573124, 1751171, 2643011, 5419168, 3374866, 5916663, 1220910, 7534329, 2150395, 3468485, 3439803, 4644089, 7920444, 3154676, 8168607, 4522101, 6287873, 5750589], -[3012424, 4406492, 2546740, 5034037, 7784928, 8376615, 4586774, 4380561, 6402916, 8140939, 6443466, 3744222, 7553967, 7410966, 2482042, 6520029, 3303186, 1286771, 2292328, 3841531, 1636778, 4411532, 5693288, 1363128, 1736141, 3222265, 8005379, 1699184, 1257265, 8043985, 8082978, 2026893, 4852547, 3005247, 1525389, 1668353, 3874912, 6022074, 3273505, 654468, 642093, 2223334, 7502337, 5380851, 657264, 4037865, 7251145, 4212111, 6679634, 1943579, 6078682, 401147, 6533959, 4141494, 7135384, 5400916, 1652938, 3389236, 3727774, 6267994, 7519709, 4834477, 553194, 4007619, 5609838, 1786393, 1638799, 5160205, 8061976, 5625006, 4825203, 1419534, 2702679, 4650093, 7300915, 4485580, 4388954, 6367834, 3923510, 6017306, 3426495, 8009268, 7308311, 2499285, 790514, 6808118, 608123, 6295758, 6423865, 4759630, 3917677, 3419702, 7178834, 823783, 1485586, 5935385, 487631, 840516, 6722655, 2117490, 6275340, 6191135, 4893139, 4155211, 5333992, 1103425, 16580, 2547910, 4129018, 2986445, 5482707, 6868553, 4824018, 7833849, 7028073, 8252119, 7757600, 1261160, 7964682, 6386172, 5694990, 6535857, 3284294, 1570198, 2622184, 1429615, 6670897, 7364735, 4015211, 731626, 764562, 216213, 1513319, 8088547, 3053229, 2434054, 1518110, 3132242, 1310597, 6880613, 7369064, 5312815, 7839808, 4085736, 6663264, 3425227, 3688897, 7327407, 4412355, 3322230, 8079276, 4380264, 2845840, 8324985, 5412228, 8049379, 6978279, 2984319, 2931, 3879882, 7421619, 4462199, 6205925, 2307212, 2433541, 734802, 7411708, 739470, 2116407, 1654059, 490509, 5584903, 2741517, 2364361, 2738670, 2975393, 700217, 6075957, 4088927, 5813673, 3436721, 4332931, 5583951, 6551375, 3912310, 2259905, 2350513, 590624, 788849, 250945, 3698979, 7470226, 5796027, 6924870, 1122159, 6904221, 5444170, 6831056, 5300518, 1184024, 3304848, 4173966, 600504, 5244215, 268278, 2338377, 1086791, 4268868, 516080, 2306418, 4563883, 2097104, 3770710, 6574383, 7667401, 5084888, 2591342, 5437156, 2099151, 7804463, 4660469, 5073141, 6907634, 4255955, 5023475, 4058249, 5825964, 8185866, 2927171, 5565488, 97410, 6596410, 7440701, 4199496, 5769811, 7438274, 4671802, 4760803, 1987269, 8044167, 3095292, 5294419, 3640742, 7029844, 4929730, 3660095, 6309054, 6442179, 6520550, 3987381, 5989950, 7984765, 4911458, 4731245, 5836420, 7253460], -[1200975, 8294972, 6178632, 667223, 6306105, 1602816, 7266288, 1198660, 1611996, 1835252, 3104937, 7478491, 119976, 2811530, 1092120, 2344890, 3262023, 781322, 6636599, 5679588, 784842, 8285318, 4904312, 5156472, 1028975, 3590408, 8003281, 7434876, 4024121, 542526, 2123272, 8055066, 4864331, 3628644, 4653774, 1510572, 740902, 1024777, 5377874, 2742709, 956080, 1897066, 5580186, 725884, 791497, 5923539, 7165898, 4891983, 3566451, 1503607, 1230301, 4660205, 6707890, 4534136, 7925405, 3352078, 7415718, 4706861, 7555575, 8178537, 252523, 6739908, 5613889, 3779526, 3558819, 6210177, 3105543, 2795679, 1045114, 7844101, 7717405, 4860246, 4793041, 5995040, 5555415, 4694463, 2600659, 4220265, 2100962, 6636830, 3496220, 6946030, 6747615, 4990114, 7783185, 8017266, 3338364, 6024643, 6525385, 401113, 2128518, 4179736, 735853, 7754507, 232607, 8353222, 5831300, 8107928, 5742849, 1089107, 1150253, 5096851, 377956, 4785616, 3480720, 1957601, 4855281, 6376587, 5810343, 6607052, 4761022, 5139937, 5234553, 5061764, 4958843, 730534, 985272, 5921641, 2114478, 723322, 1020823, 8296367, 2913968, 882051, 6279296, 855590, 1921432, 5731488, 7594353, 6785515, 2181488, 5458463, 8048273, 3979383, 6783908, 6803903, 2872969, 7984094, 2995606, 7659849, 6818495, 4447457, 1150577, 4021049, 8093162, 7616850, 8016521, 1719806, 2512302, 258798, 7380299, 2471186, 3357367, 3535392, 4491835, 4560765, 4017763, 5807016, 6429446, 1117538, 5967637, 7897423, 4662486, 6120042, 5253149, 6542425, 1675433, 5314423, 1856179, 8052899, 979398, 5240186, 3593021, 5408479, 2452698, 6569240, 5750344, 7162286, 1901408, 7610249, 8047499, 878623, 6958425, 2368784, 4640386, 2628599, 5563328, 4184264, 1182730, 1148992, 7530228, 4193800, 1686875, 6526257, 1626523, 2557530, 719981, 4143524, 98280, 5445546, 908860, 7320267, 5614781, 2680102, 4051477, 7656240, 7565619, 4577163, 2241199, 4223826, 5520324, 6266248, 6669455, 5104042, 7979000, 5687279, 5984952, 4341664, 5622583, 4165678, 5034494, 3124982, 6987063, 6611500, 1504848, 6880616, 877733, 5201510, 3786331, 6399382, 5865555, 3183897, 6227623, 1432560, 909739, 5871071, 4236552, 7544582, 1543963, 7372744, 3788089, 6125649, 7908285, 2123918, 3700116, 5922065, 1970857, 6546629, 8153448, 5679421, 662072, 2701253, 6739043, 3667053, 2115351, 4952822], -[1110207, 247437, 6926931, 759266, 179, 2872777, 1627927, 1633244, 6758329, 2523719, 5435926, 868629, 7097254, 3694812, 961799, 3632419, 2482338, 3122158, 3041753, 4798795, 6062680, 4523031, 1221940, 1569028, 6139793, 646517, 4719057, 8047080, 660144, 5017165, 4177372, 3390288, 6900732, 5231594, 3099315, 589575, 1569259, 6932308, 226200, 2528806, 3470878, 4474637, 1100913, 3311646, 5058737, 3494823, 5271311, 4468048, 4262916, 1884375, 1306141, 2847164, 1372685, 6749769, 2369220, 6198477, 4672905, 1137811, 1219967, 4151529, 5411818, 1793961, 2693006, 5257651, 5397635, 5965885, 6101327, 181089, 1512830, 7749924, 2657493, 1916973, 7707444, 1140328, 6155562, 2912351, 226138, 6541107, 6501552, 638964, 5077425, 8290197, 8326432, 2693488, 2527993, 6106005, 3159702, 3379969, 5963216, 636009, 7893901, 8270926, 3597573, 3400254, 833667, 6987033, 7141436, 2726879, 5604107, 1931341, 1532279, 1607073, 2071695, 8278730, 3031706, 8305383, 7033001, 6509108, 1137086, 587822, 3174792, 5748092, 5604087, 5574221, 7815185, 4376829, 2230471, 3470758, 5401246, 1654278, 4725924, 1514222, 6382160, 5113718, 7937878, 1580311, 2879779, 6978018, 1503597, 4234207, 4489347, 3539647, 7964368, 1790915, 5684583, 1349298, 4870522, 5486435, 2746351, 6543101, 2925633, 7387373, 8113499, 4063237, 2754031, 1461855, 7429663, 7618697, 3314698, 7611427, 1636009, 2028195, 6861402, 111020, 1449528, 7229952, 2439655, 681019, 6482518, 6089687, 6352678, 1749691, 537978, 48724, 3888754, 954122, 3014340, 4089798, 6385135, 6495002, 4007464, 1776101, 112874, 6703560, 3936519, 2713100, 5845341, 2950865, 2959950, 7575819, 5894951, 2010816, 1963700, 307910, 1401599, 533523, 2992814, 5172325, 5904526, 6899275, 3739698, 4513442, 4504301, 4274890, 5525610, 6136740, 5711774, 6970910, 6514393, 2405723, 3663240, 2819312, 5610046, 578112, 6318028, 8235168, 2818108, 3189030, 3291646, 4309501, 858403, 539869, 7644290, 5427619, 5191510, 4261061, 1912718, 3888893, 3130066, 4954991, 5716329, 4184973, 7166603, 4897517, 6289440, 4058463, 3569250, 884235, 7776646, 2577166, 5582048, 5034505, 6450335, 8354142, 413939, 5786370, 5755357, 5216239, 5164226, 6001083, 2781595, 7334875, 3783840, 4533314, 5651216, 6990931, 5827191, 602334, 2667688, 6600632, 6019790, 6179058, 6921172, 4377416, 7570949, 423032]], -[[4388288, 497144, 2983146, 1570740, 4073113, 1504059, 1003568, 5651483, 5095800, 2831436, 7119888, 4974541, 2920629, 2654728, 7179884, 6671636, 6362431, 789803, 4618871, 6684088, 8277939, 1487583, 7556318, 7699884, 5776907, 5937795, 7322064, 2894382, 4841218, 7777089, 1437842, 4935259, 2248004, 5941399, 6733840, 2352903, 7256419, 832888, 1962971, 3747072, 6363768, 1561960, 2256890, 578707, 2019367, 5741516, 2026676, 3956084, 6409717, 7146411, 4892640, 4712965, 2172806, 2934575, 7727325, 7443271, 2314514, 827320, 2240087, 2201837, 1731606, 7840791, 2278291, 7456278, 4921109, 2984550, 6012301, 6324136, 6176775, 4761686, 5434479, 7406592, 5923578, 2352329, 2081716, 7511585, 6462049, 2628954, 3626780, 1573688, 5089133, 7853394, 1017126, 6616383, 6811389, 3762499, 4321213, 8258037, 384583, 5634400, 3491937, 2630391, 591453, 1974490, 4246951, 6529752, 4881550, 3884232, 6516929, 4745055, 4206681, 5169934, 6804510, 3385123, 6481489, 8122200, 1739482, 406587, 4059056, 8165991, 2283511, 7944880, 5223218, 2537541, 5998303, 7006843, 3268667, 6202276, 5132869, 2037770, 5008874, 2432729, 6689564, 5088550, 5244148, 4012711, 4513502, 7233819, 3321544, 6591286, 448686, 3314683, 2699086, 5376627, 5533349, 3690750, 7748559, 1416287, 2399111, 1945648, 6977420, 5303151, 6167988, 6565001, 1031107, 1708121, 2408401, 5079705, 7714974, 4077452, 7824356, 7716840, 3710457, 188952, 1824516, 6831727, 139480, 4850196, 7507467, 7208788, 4142273, 907916, 8033143, 4256614, 5892773, 1961945, 5286387, 8246953, 4316592, 1185705, 455270, 6781497, 494963, 1221179, 6863836, 3042112, 3051826, 5935136, 7263756, 8104497, 2008778, 7599509, 3014968, 8121844, 2410262, 2679694, 1677585, 3523574, 6897082, 2036337, 394569, 2782900, 7169456, 3090219, 6854123, 5170978, 1059557, 8280866, 3408289, 2164135, 4456763, 6510425, 4141118, 8176954, 810380, 8158406, 6994641, 2122221, 5562599, 4397184, 4495968, 3590537, 4946971, 2034930, 5536086, 1385996, 8034252, 1619980, 4887531, 1596246, 3159985, 2624227, 2817104, 838003, 5995979, 8336089, 6047556, 6924634, 6732327, 2802547, 2371319, 2756821, 3450215, 6481992, 6170484, 8327859, 1081603, 3790908, 6227758, 7849985, 1358497, 3722530, 1109346, 7345538, 6912963, 2746798, 4417344, 6903947, 5871831, 7933057, 7657550, 3576049, 78103, 4918836, 5572644, 1430029], -[1750910, 6951273, 8232392, 7393526, 636560, 7364581, 6958310, 7378466, 6633679, 5193564, 3168714, 200963, 265328, 515516, 5254982, 3614670, 2292436, 8047878, 4096052, 3217799, 4465900, 4027920, 6407331, 2845717, 2508952, 1459636, 6550777, 2553901, 419091, 1188539, 5300457, 4013389, 1418700, 7373795, 7048944, 1132807, 2191804, 3411503, 325832, 4101088, 4858390, 3868377, 5759145, 3046463, 3926241, 7726677, 5661229, 7159769, 2615255, 337690, 1138933, 4474394, 7076269, 5278210, 2086735, 3131557, 8271983, 4237277, 4207062, 311409, 5550960, 1224347, 4117558, 950597, 5417669, 7384514, 2623227, 7259247, 4739970, 5825506, 6668690, 3292970, 3220133, 3890839, 6922670, 7419166, 2122972, 3904503, 3423359, 8356437, 2079151, 1245806, 254939, 7189517, 7126374, 5232343, 6928761, 448424, 7889648, 6201813, 5932872, 6761070, 8053705, 3329052, 7350640, 2857512, 513075, 3247585, 5201098, 5205125, 6478236, 2346887, 3471787, 2704436, 200167, 5222735, 5167112, 3468804, 7460050, 4734734, 7107221, 716666, 1163790, 6384809, 227019, 6428189, 4165678, 916629, 3463413, 1987749, 7599401, 438125, 7899608, 5638627, 1119557, 4237370, 2141109, 1350612, 5018742, 4348999, 992843, 5771306, 1361967, 1370081, 126407, 5807955, 4964482, 7467516, 1454580, 8132157, 6155283, 7124004, 624270, 5824280, 4048721, 7364402, 3711001, 6938613, 2439112, 3901012, 5417732, 6690740, 4935835, 7993677, 887046, 6953436, 4145173, 3393255, 8332615, 120143, 7944423, 7202280, 6216415, 4896072, 3377205, 4633190, 3992741, 2666755, 3738850, 616582, 7481242, 2265791, 4246091, 846419, 3091519, 5727512, 4601564, 3219023, 2665042, 7782713, 6223576, 7320769, 2673377, 6901189, 2884698, 4420420, 3044829, 6097144, 1290116, 440763, 2481254, 1085366, 1937349, 46980, 4931638, 2197994, 168396, 4609138, 3118019, 1166656, 977282, 4823643, 188352, 1217000, 3198373, 135109, 652454, 2288221, 6685141, 7761935, 6279890, 6128261, 7740931, 1446550, 143615, 1697942, 4509352, 6214681, 4559273, 4743760, 4568772, 2848212, 247661, 5649908, 5069503, 233466, 6752497, 5878304, 1103412, 4273029, 5565128, 319492, 3595728, 5742835, 3973341, 1589084, 5308989, 3731961, 5641556, 1353323, 4128893, 6683095, 5209641, 7070660, 493748, 2298416, 6047563, 2425129, 391941, 2680536, 8241086, 2745936, 8282743, 2132676, 6113173, 1527866], -[68549, 1468933, 6381093, 2184999, 7461915, 3762500, 6017944, 6263114, 6054502, 5026470, 3489242, 2290266, 948767, 8297397, 7239339, 3168740, 6301781, 4129359, 7879401, 3999213, 5540787, 8241709, 5072866, 2841696, 2183988, 902985, 3924715, 5926149, 6681924, 5825783, 1833574, 4877516, 148387, 118220, 1952290, 4984706, 5498500, 5351671, 4023111, 4957255, 709634, 5997724, 227832, 640693, 7524742, 6073279, 1435369, 3138860, 715847, 3773392, 3270528, 3446566, 7468118, 5725515, 7495194, 7460807, 225616, 7602703, 3734373, 2243470, 3667699, 7618156, 915670, 2388810, 336754, 3183048, 6731736, 5072254, 3372722, 7879870, 1767187, 6907509, 5450430, 3966274, 1866890, 6481799, 8329982, 519548, 5692812, 3211030, 1467604, 6253800, 5503980, 5982830, 4179073, 7990800, 4295551, 8250912, 3607765, 73477, 1311827, 977238, 239676, 8100081, 577083, 2360024, 5792013, 2707035, 2031027, 5593208, 2622624, 535256, 4447976, 6035836, 1723062, 8355725, 5355326, 200865, 5997835, 1884944, 4826194, 5149592, 2463189, 5853701, 1753623, 2398150, 6288718, 3586003, 2940577, 3050408, 6762530, 862058, 2899737, 4327364, 7375183, 5833873, 569948, 6702133, 4314842, 2360071, 7290293, 1908892, 543441, 5411054, 6469658, 4735636, 854645, 3381997, 5311635, 7807019, 1019160, 1365310, 3504526, 3722874, 8219202, 8055219, 6728223, 5329803, 3215479, 3579077, 246425, 356737, 4992355, 8176147, 8183096, 7992820, 3277092, 5620023, 8133065, 3970990, 6932683, 5379523, 614387, 2170200, 1147671, 3694432, 2236786, 6457150, 3684798, 2884192, 4589407, 7944361, 4590692, 956261, 3358316, 3586828, 4363068, 1710504, 7502608, 2602531, 5132769, 7453275, 7117295, 1734959, 5292059, 4766078, 3793389, 8140885, 5846209, 4690408, 5459738, 1121280, 6434759, 487204, 7478247, 5849513, 5199191, 5181923, 1839284, 1239229, 2856552, 5744499, 2881097, 3892786, 4000423, 2753744, 5145955, 2928746, 1775469, 7719021, 5141358, 1070919, 1761094, 6347761, 2811869, 4328064, 8280718, 6880716, 5617548, 855542, 2923389, 2028182, 42349, 8341736, 6062979, 2366338, 4112637, 3395662, 258109, 374495, 453344, 4763043, 2618033, 925044, 4376153, 73930, 3169161, 2865844, 4581751, 6868307, 3032531, 891082, 701598, 5526005, 4296721, 3251571, 4630245, 4084525, 4640947, 3923723, 6532392, 2397905, 1629993, 3122931, 4923232, 498035], -[1013954, 3233436, 1912641, 2522565, 8174999, 493675, 4399449, 3766932, 3809737, 1507590, 8330073, 6585932, 1911700, 5908661, 2302698, 1937726, 2263048, 6269694, 6961156, 5356016, 6862280, 4469937, 3393050, 4772966, 5031906, 6102619, 2100545, 1826658, 3614014, 3630218, 5679021, 5449786, 2428031, 7870161, 1948904, 3849415, 4575028, 6342375, 4731316, 1651071, 2917738, 651139, 206169, 133239, 2797793, 2786796, 8377905, 2965827, 3852276, 4580204, 1667067, 4766596, 8145707, 5075894, 2736882, 7387464, 2647996, 4494544, 2218930, 4375199, 2155463, 7594721, 2024665, 2224481, 3434277, 6033659, 1016134, 2232946, 1529502, 1594817, 5965829, 400898, 4092621, 3399888, 58480, 7805510, 4299595, 1709481, 4031727, 6744054, 4307843, 1553668, 4425055, 412210, 4817030, 3816602, 619205, 1053470, 878182, 1099129, 1123043, 1238183, 8365733, 7802804, 2926473, 7947354, 5728898, 6037691, 7418090, 4001492, 6461185, 5692095, 6885865, 1607588, 7570125, 506017, 1836049, 1246379, 2498637, 3426812, 6318561, 3889305, 3511277, 5217940, 6074695, 7476544, 2378357, 4028078, 3942589, 6249310, 7383987, 3307549, 1538465, 1400401, 2967319, 1634879, 1689846, 131038, 1863605, 5499496, 3006157, 932748, 2074161, 7080595, 8003388, 3215935, 5153168, 3874737, 5170783, 2238204, 6997047, 6091899, 8343249, 5488701, 397808, 1256767, 1352603, 2587664, 2060077, 465278, 1665944, 7956370, 1898969, 4364106, 7794671, 3060346, 5466773, 3573196, 6407047, 7860187, 7442171, 1329410, 6435913, 4860460, 697593, 5117436, 52177, 2964431, 7384476, 2423436, 2739580, 956611, 1214725, 7319672, 5450380, 7790833, 721179, 3841071, 1932896, 2713944, 2515587, 2560788, 3800683, 8151942, 1652547, 4300571, 5702188, 6479999, 7915551, 1564437, 2817301, 6037461, 7951831, 5777006, 1181957, 5506392, 5763434, 4800686, 5704968, 3204301, 5503790, 1384828, 6218571, 2014758, 4259621, 4761796, 6611945, 2318983, 4554697, 3810678, 7168304, 3462584, 3458490, 8299110, 5169127, 8260870, 7496389, 6578045, 4826837, 8178737, 8072823, 5623390, 2232570, 3525911, 4996764, 2928741, 3543331, 2245710, 4591456, 4334082, 7616920, 6772356, 6214777, 1489097, 3849439, 1232786, 1587687, 4558593, 8376404, 3327296, 4746468, 6458494, 251244, 7741495, 6379952, 6968511, 353484, 4180329, 8008034, 3747904, 1112714, 3439194, 1762647, 4023730, 7522344, 7958134], -[5648881, 3781786, 3517480, 5728285, 1650729, 6213397, 3656094, 5452810, 2200149, 1099769, 31270, 1894560, 5327906, 2048487, 8192367, 883697, 832879, 2837250, 223884, 4312798, 2218625, 1813087, 5872070, 6660335, 2970713, 5257118, 6949191, 1951313, 1382289, 6231699, 5710347, 3984693, 1234513, 6856681, 8010440, 7366840, 868895, 93541, 1464609, 1106158, 4349789, 353290, 7720134, 3672417, 3170447, 741700, 4831358, 6546793, 7881942, 6261297, 6593493, 4325802, 3264171, 3297808, 7440009, 3946617, 6194846, 5206975, 3454237, 773208, 5165172, 3137150, 2130511, 192649, 494753, 7482632, 1524593, 4347465, 2751033, 6479011, 6148361, 4864402, 6355813, 4005090, 3747527, 5598436, 4768672, 334170, 3137115, 7387733, 6937122, 6504560, 4813170, 4111934, 4038848, 6576662, 2054875, 6932854, 2601973, 984992, 4466337, 1773640, 6138559, 5865861, 8092369, 2455254, 3026557, 7901906, 5906429, 1632268, 6739444, 795953, 2384382, 7554215, 7769022, 7088494, 2504817, 7937202, 5648077, 1166172, 1083104, 5513913, 8211921, 2543688, 8116413, 4719702, 6649444, 8160086, 916517, 4297516, 5824953, 1069705, 3885920, 3039646, 5448725, 6103888, 3631180, 3264789, 1046670, 2873130, 6674383, 5002328, 5677500, 7016677, 4733154, 7724558, 4670630, 5322897, 3100250, 24935, 2680488, 7271714, 6107847, 2930977, 2391299, 3650750, 5127422, 1657995, 4338777, 7095139, 723428, 5202319, 6511846, 7983709, 3017155, 3946856, 3040867, 8352471, 7387387, 3629103, 2759615, 7393440, 2358844, 8191782, 1456277, 6543875, 6275693, 2427920, 2876351, 7376096, 5219847, 5143526, 4466408, 8064012, 2784469, 3539129, 2838447, 5987963, 2330338, 2798880, 8076354, 7195860, 4160379, 6176190, 3421773, 6239816, 343464, 6357642, 4687988, 6730105, 328960, 7745247, 4720406, 6930127, 1866770, 666367, 323398, 2910821, 263571, 5681164, 1554271, 4021738, 5089858, 4179337, 1937642, 1028263, 3857335, 5797292, 2245354, 7730652, 1032088, 748909, 1697606, 1415513, 18819, 7163165, 5632886, 1706799, 8217135, 566844, 1633836, 7799239, 6604838, 899047, 314425, 2451697, 8066214, 5820318, 1400877, 1655029, 1788268, 7120600, 3171645, 5438772, 2530575, 2119142, 4056569, 6977459, 2505551, 98471, 7013420, 7870721, 3112903, 91085, 902130, 1146652, 1897864, 7246455, 1880281, 357582, 8219545, 2499442, 6792958, 2005935, 5081598, 3784585], -[6128253, 7915070, 2598082, 1643279, 6376975, 4206287, 2056122, 120138, 2512862, 2897316, 4643110, 75314, 986492, 7497241, 3445832, 1299098, 943893, 3118881, 275456, 1808617, 863429, 5065896, 7295041, 4854915, 5183173, 4800806, 2581027, 4895786, 7636878, 5582083, 6426355, 4552370, 8064347, 4307036, 172146, 1926291, 3183437, 2583157, 1981112, 3636139, 971442, 1796370, 7790843, 135702, 3763407, 1277277, 3803580, 1715528, 7873011, 7015998, 5243222, 7808672, 5603992, 6107520, 8179912, 4619831, 5497215, 1010662, 1970681, 2802202, 766787, 527571, 1379360, 1143208, 5283728, 917366, 8014933, 1759527, 960233, 3763166, 4096961, 6974227, 5860053, 5339025, 2310403, 6463909, 5932724, 2191500, 2353174, 1387328, 6925553, 3021390, 4405017, 5201159, 2940328, 291307, 1210912, 7808597, 436863, 5121959, 7266786, 4799888, 7807263, 2082986, 1213569, 7310657, 2997878, 3849605, 6532198, 5042995, 7071263, 1398088, 6516888, 2378817, 3785885, 6036533, 7312211, 1238009, 3093264, 1493503, 716565, 5150916, 7337371, 5196598, 2715288, 6699467, 30902, 4136569, 3355768, 349116, 3795679, 4541644, 1067333, 3140688, 4385781, 7632915, 353336, 4395983, 6469507, 2302264, 2784608, 392989, 2102863, 4719605, 6662527, 4994209, 440529, 7016041, 433514, 1418774, 2105224, 3865879, 92803, 3937115, 762019, 5276383, 5296168, 8288056, 1083769, 2201648, 6149320, 1400986, 3634019, 6558902, 4941783, 3656972, 1238307, 6871140, 2512946, 3721684, 5843749, 524120, 848060, 6004089, 5101416, 576610, 290617, 6854404, 5806583, 4890734, 216650, 3516954, 3406903, 618771, 765218, 7500844, 4511685, 7452585, 8192609, 3328167, 2884677, 1439478, 6346323, 1997887, 3711555, 4050657, 3775598, 7185691, 2317440, 3880325, 592817, 6738999, 4180615, 5533687, 8101325, 6639241, 978824, 3863338, 1652785, 3337898, 4641320, 7314497, 1697337, 5276793, 6837750, 3688788, 3083183, 650199, 5477877, 5739888, 2360861, 842418, 4233010, 5776965, 6934508, 3281500, 3197329, 3764944, 5618065, 7878879, 8105516, 4868332, 3781972, 908211, 8004603, 5632102, 7323156, 1865565, 80203, 5985627, 2686529, 3981144, 1863459, 4397308, 1919687, 5806665, 1237169, 7033650, 4093302, 6208367, 1520480, 6024587, 4174979, 718411, 1859488, 3153337, 5738138, 2052412, 5103675, 5451372, 3340224, 6088800, 2301536, 2880489, 5756886, 7294370], -[4811026, 2543527, 523859, 952036, 6081653, 7574093, 8220092, 73168, 295029, 1353722, 2484995, 10567, 51992, 3388257, 2111470, 2186645, 105565, 3407063, 7010059, 4684642, 6938576, 1591386, 3587272, 7223976, 6023349, 7448215, 3157205, 3497083, 7261541, 3374507, 1262644, 7436014, 5332801, 684969, 4620023, 7949677, 2605237, 833277, 628161, 6655422, 4008693, 1985280, 2622001, 3617288, 2147230, 6558266, 6827074, 5644960, 2803565, 8209731, 3591817, 5139823, 139398, 5205422, 2760195, 4593220, 3632612, 4241148, 2800975, 6857396, 6384876, 5469107, 7740838, 8147235, 5312906, 1986923, 1687889, 4409056, 1664789, 6936530, 4118246, 953892, 7263138, 6041387, 6205446, 4848152, 6807239, 319761, 2185413, 600141, 6448937, 3230682, 7975858, 7065145, 1542190, 4962614, 6267289, 8111822, 538336, 23458, 3540312, 6157754, 3318792, 2206119, 3445825, 4837399, 3045613, 2543093, 7024353, 4774664, 8205629, 1172146, 3330254, 7494359, 4964695, 3483179, 2385497, 7069758, 296966, 680993, 3426095, 1062070, 7379100, 3096237, 817370, 5965020, 7406395, 3652113, 370165, 5821054, 2264370, 6959640, 7648294, 556882, 7726437, 3107257, 8169520, 3572411, 3051063, 3820034, 6831913, 5653824, 1383155, 5913899, 6280358, 7787329, 1854646, 5989040, 4869405, 5612375, 2452709, 84341, 5610719, 4960952, 7042537, 7458704, 2875010, 1024429, 1412095, 213209, 5507069, 4332023, 8278424, 6124721, 6681806, 1030779, 6003120, 4219895, 2252407, 4562541, 8149541, 3974428, 1248299, 6578176, 5108529, 1872535, 5073630, 3490444, 9404, 7332060, 1865302, 1855165, 3364203, 7124500, 4107085, 7339141, 1847817, 7562332, 3945207, 5161534, 3784020, 7709475, 3792133, 2562723, 4285367, 4048580, 7384350, 5636154, 493219, 3503220, 564250, 5933649, 4830850, 6658194, 1691293, 5027947, 3465019, 8037576, 4192178, 2189905, 6862370, 6747669, 7757641, 5508590, 4852443, 946201, 5174684, 4384642, 8025731, 2983563, 7691614, 4054211, 6793529, 2732277, 1998925, 1355297, 260495, 7455108, 3107341, 1747359, 4431630, 5424534, 6812500, 1816766, 1625193, 3683346, 6464886, 3712843, 3030033, 2856032, 8018305, 4755437, 4911969, 225283, 156811, 5569275, 3478201, 2839459, 6438380, 1808839, 4903764, 4455862, 6045039, 6936245, 3350208, 3978082, 4632385, 1824829, 4322134, 5772210, 7794457, 1470465, 3404405, 584840, 130285, 1961599]], -[[7484207, 1398862, 3230161, 6236595, 5855087, 8324820, 3582388, 2987610, 878980, 3744099, 5495501, 4295584, 1630699, 975433, 3403837, 567054, 6178913, 2635493, 182352, 1182883, 1317627, 1981981, 6217975, 318145, 278352, 3761501, 5977213, 7802388, 4605824, 404040, 6026529, 5650251, 7582537, 1898589, 4866091, 1213926, 5834115, 2121386, 897884, 4310058, 592313, 5259203, 5118194, 5520969, 7532186, 3649534, 8108429, 2632133, 1791021, 3212587, 1225674, 6238574, 812108, 2651895, 8072686, 6434983, 3541236, 5017328, 836417, 7841899, 5492124, 6574288, 7681128, 3562937, 7879632, 6346353, 4287972, 2994701, 3865600, 3304091, 5799313, 3499595, 7929033, 2564463, 8097434, 585417, 1099562, 4800743, 907428, 956029, 2543491, 4218929, 7604487, 3530826, 2011780, 5186247, 7918053, 6536848, 5249085, 5570967, 4983205, 4556045, 5039343, 2739394, 5419798, 5908096, 1345135, 5441517, 8050114, 1418837, 4626884, 4850609, 7742925, 6615924, 7317040, 6011167, 1580549, 278825, 6695698, 5580034, 3722718, 3644219, 6232399, 1910876, 131721, 4967489, 6791751, 7666156, 5294938, 5779819, 1326103, 4414195, 8209884, 777715, 6988519, 6985284, 5226578, 2682348, 8318827, 5170013, 624072, 8271021, 2712893, 7978523, 5684887, 2830664, 1123957, 5339800, 7821894, 7819124, 1599392, 963017, 4441170, 994371, 1273152, 7278833, 446368, 7885392, 2730838, 8098316, 8353277, 679567, 7426641, 509902, 4429732, 4075644, 4722133, 5149737, 2882910, 38621, 3899091, 8046371, 4697469, 4864854, 4016787, 7339346, 4348201, 5890273, 7449167, 2115155, 7787532, 78333, 4169887, 5805246, 156531, 8345100, 3769431, 2509242, 1824424, 4627997, 7550733, 2361964, 3541547, 1649216, 7811161, 250431, 3642759, 3795799, 3343568, 1791532, 3652729, 4380298, 3753806, 3926810, 1312420, 2323382, 2990996, 2078773, 7463896, 7071316, 5217026, 140741, 3516754, 5247685, 6060717, 2111695, 27063, 2777134, 4776862, 1849426, 2457884, 5803292, 3191419, 5464522, 3604752, 4082224, 6048545, 822343, 5193295, 1404464, 7580984, 4164456, 6787285, 316202, 3416965, 1237421, 1112952, 1371158, 2950656, 2015113, 5729522, 504732, 2956961, 2140070, 1942284, 5023358, 292386, 990886, 2107381, 2593502, 2534615, 2327755, 1716549, 7007086, 3989533, 7964308, 4973205, 1713189, 6842091, 786515, 6150566, 4719827, 2513031, 3593021, 5850873, 5482748], -[2877996, 4124424, 1198751, 7004319, 9754, 6985264, 5563151, 461591, 4151903, 318273, 3142549, 2101869, 6318229, 4660153, 4796887, 5002479, 4145043, 3688597, 5270624, 8110572, 3912515, 1987450, 475904, 2492428, 7070600, 3709352, 3361941, 3527147, 54723, 3527445, 7219088, 6755642, 2677862, 7594805, 2266404, 3849156, 7884279, 3070867, 4362632, 1582761, 7081804, 1312980, 500997, 7098631, 2960254, 8320016, 1592378, 6070242, 7488822, 1474864, 2643899, 7142717, 6058441, 5425626, 3143584, 5003211, 2482339, 5825915, 6885694, 6491216, 888863, 356634, 1960766, 5568046, 4223430, 2184898, 862876, 2966036, 1476832, 4240072, 1077906, 6513602, 3158485, 972240, 2526847, 5933226, 2184223, 2742163, 8009622, 3706049, 4967759, 3887322, 2122217, 4872678, 828666, 1007206, 7507097, 3415482, 3633473, 220708, 444245, 4017084, 8355373, 3753870, 3055035, 2987874, 409766, 7256420, 7057501, 7940759, 2690686, 2555288, 8241921, 2689466, 4581371, 4092655, 1808073, 5362139, 4066252, 142254, 7923596, 1221139, 8292676, 7368029, 3456454, 7328921, 5870604, 6751249, 414935, 1543175, 1171538, 3142976, 6066702, 325271, 2153610, 4750561, 7587867, 7211362, 8055239, 1730914, 1432370, 3997397, 2552338, 6745947, 2797470, 6423769, 2630307, 5358144, 1600099, 3489502, 3889650, 7740521, 7452003, 761023, 5793556, 3414934, 6602437, 3469542, 2226750, 6733361, 3183289, 2681287, 4034796, 5332033, 878464, 2835838, 3708467, 7041138, 6052732, 1182108, 1533514, 2336008, 5312662, 6519757, 2396904, 278876, 6956104, 3108921, 7225567, 6188202, 6002441, 5952684, 1329229, 5540422, 7744193, 1875019, 2001280, 6183985, 6485066, 5598816, 1946068, 6334175, 8179784, 5355482, 4538998, 3304989, 7874706, 5772949, 6706700, 3715649, 6879477, 8022587, 1491951, 7600851, 2306834, 6484219, 707645, 4306917, 3142086, 3955916, 199527, 7182617, 6439526, 6621210, 2501404, 7069402, 1511317, 5200509, 1471358, 4015139, 3666356, 2135186, 7742381, 2476913, 380661, 1383781, 8344370, 4135237, 4537328, 3457866, 5818782, 4039639, 3803276, 2958981, 4633936, 7670898, 1499387, 6673606, 4117197, 6917479, 4071318, 59441, 8371370, 7115133, 8028244, 5139268, 6950913, 205569, 7373668, 2851878, 2348800, 1506044, 2473374, 8125477, 726436, 1638471, 1561341, 4804185, 3479065, 678630, 8030068, 3963928, 2344574, 2877594, 6549948, 3040866], -[1332294, 1431905, 6583020, 4445281, 3578159, 5090392, 884824, 5451892, 1176416, 3119898, 1022452, 2512096, 4130058, 1059205, 251496, 6591216, 3980721, 415723, 5957345, 1294891, 6345505, 2596805, 7904305, 7931242, 2571402, 6618399, 2554628, 1082870, 8146583, 1782641, 1931623, 7605154, 7465876, 4440983, 4270607, 3293215, 6386138, 2184084, 2394602, 7546735, 2978572, 6657218, 5718061, 4245378, 3585896, 6820466, 2038090, 306700, 4524788, 2973327, 5456369, 132840, 6038410, 5712542, 230369, 5012177, 5378128, 4891105, 5814072, 7164391, 1340347, 2987256, 1576420, 3945810, 1421929, 5635544, 7228704, 6667267, 3541133, 2931264, 280305, 6185265, 6292095, 7063421, 55808, 5576887, 265508, 8332387, 6599337, 6289587, 1491900, 4330973, 1063976, 282164, 1555035, 7231885, 6244819, 5702463, 4018324, 3343603, 531787, 2584725, 5520646, 426359, 6220922, 8341337, 2958022, 7166271, 283265, 3649084, 3745942, 5533797, 7217096, 1889512, 4432744, 918297, 633676, 7160965, 5577127, 4084535, 6818226, 3176622, 2348590, 6695795, 7907577, 1976928, 5282974, 6432613, 5043994, 1553265, 2692934, 327159, 3649826, 3379284, 4555753, 2156975, 3856993, 4700880, 4964085, 6963602, 1521740, 4764558, 2187255, 7586448, 5284316, 6682397, 5887195, 7648885, 6917702, 7349628, 8230586, 297712, 533435, 3933697, 6566398, 2154850, 8117744, 1865317, 5517779, 6482795, 4119335, 6480799, 7265454, 2560307, 4370374, 8046636, 7166055, 6077238, 7833474, 7718756, 4913452, 1894873, 2824449, 7545217, 1805908, 6548972, 5462165, 2429162, 7679812, 6946691, 1833962, 606919, 4215456, 2721033, 4491799, 5705027, 5658636, 2393764, 1467734, 79343, 2163936, 7489916, 6313348, 6955507, 4059353, 2194415, 8141719, 3742259, 1455297, 3717120, 6872234, 4883661, 5700475, 3002092, 3695588, 2651519, 770245, 4081512, 7250887, 293878, 895721, 945158, 6729347, 7855167, 4716394, 7881865, 8261158, 2270059, 5472597, 433292, 7643946, 4566741, 8104685, 8285640, 2543629, 3987008, 211691, 4193827, 6401168, 6244893, 8352337, 3028498, 6907330, 3151958, 7017104, 6486576, 209986, 3838610, 3440694, 5071909, 1731300, 3572011, 8213370, 6502601, 7684204, 273794, 1483125, 3316948, 6494624, 6371712, 8076921, 3001774, 5767612, 2810732, 8007981, 3067462, 3881865, 1964512, 2324657, 5683830, 911383, 2774338, 7041162, 6016112, 5488486, 3811906], -[7265270, 4634067, 6250786, 2524054, 6384266, 2802831, 4889491, 6532268, 2792783, 6546221, 3467516, 5768646, 6249036, 2363514, 5234784, 7244796, 5654292, 7691109, 3195777, 6203918, 4759157, 6429929, 1395667, 8350366, 6819675, 533977, 7609630, 1366958, 3794326, 2802526, 2807249, 4588340, 3958086, 1923206, 3982390, 1714889, 2381393, 3716510, 4560259, 7154489, 6404120, 2536620, 228135, 3547727, 7084963, 1832254, 2975548, 3743838, 5783634, 4203353, 4654283, 7636373, 4142420, 421285, 383645, 313612, 7172355, 6058592, 4389846, 4864869, 6367300, 2859845, 6908472, 3278018, 5994591, 5679912, 5659444, 568562, 8156651, 4168252, 8102567, 7484767, 5506082, 1345818, 7979888, 54441, 4523085, 2684838, 6708566, 3804048, 7901003, 4817162, 7740258, 6976533, 2453655, 2643600, 1051174, 6283829, 6976661, 6267874, 1004129, 4455265, 6985890, 6813555, 3957163, 4675037, 6560910, 2130707, 7939605, 1078726, 3886, 7819311, 1188382, 5505051, 3288712, 2176973, 1932854, 2402391, 6523184, 4330352, 6489598, 7346659, 118983, 3481388, 4228051, 4774911, 3031121, 6983129, 1722490, 4840118, 3655661, 4993731, 2356401, 6417051, 5000334, 2120005, 6275218, 2408072, 236114, 2518313, 8017520, 2371461, 6695011, 3662735, 2021718, 8122943, 4145453, 6873269, 2250544, 1993275, 2126658, 1706834, 7266911, 2235057, 932682, 2600429, 1434018, 7528685, 7823248, 943883, 8016206, 7500018, 5874570, 3513683, 7510666, 1674179, 704355, 5146378, 1633470, 3371650, 2788195, 7538775, 2502432, 1371893, 482977, 5181607, 5185165, 4206654, 3913603, 1958739, 8132496, 321943, 7662774, 1807112, 5736899, 390841, 4293434, 1861152, 1509708, 4684561, 5947058, 2240089, 45839, 7610075, 4561912, 3683030, 4275915, 1970359, 8260606, 85804, 8062366, 1847917, 2412330, 877897, 3008764, 4577642, 1005689, 7322501, 7826265, 7469509, 4662849, 4989945, 8016270, 3098903, 3244186, 1650960, 1396886, 6976436, 355995, 6364497, 367517, 2539474, 1002502, 350022, 4639391, 5787651, 4423980, 5311845, 7055269, 1438164, 7624894, 4795378, 1522004, 1171912, 3329714, 2755679, 2618705, 6809795, 4879321, 670061, 4933027, 3310811, 321465, 6137756, 3613010, 1127913, 496769, 8063181, 7159849, 6265544, 6799870, 1795581, 4869113, 3001644, 8090942, 678836, 5460105, 6894469, 6965185, 2383060, 2953086, 6090371, 3625443, 4668028, 5969818, 1742173], -[6892481, 5688825, 6408196, 6053802, 6888138, 5752874, 5091096, 6608290, 1333452, 3648184, 5767894, 4715836, 7108134, 1834216, 7743815, 6143360, 793608, 5524615, 4546628, 3046169, 1739769, 5245132, 6547813, 6820778, 7478310, 4415716, 1896850, 1341790, 7600673, 1044159, 6591195, 792179, 1027538, 1955082, 1849376, 396093, 7059280, 3866917, 2854651, 2281945, 1629317, 17372, 1550266, 2361983, 5225620, 6385609, 7534129, 4027952, 5305941, 8331529, 6981043, 2718245, 972460, 3804836, 2388676, 5180308, 6239950, 4144115, 222874, 32999, 6120759, 1264301, 1190914, 4955489, 2929740, 1677540, 3800173, 5797709, 7329819, 4182640, 4463307, 5412392, 6135130, 4631608, 1231335, 67938, 6961783, 4003520, 7948146, 1356864, 3400550, 4437243, 7489668, 4138868, 4510315, 4908919, 1325525, 1464288, 8287356, 7682976, 3162050, 8357323, 2341254, 5680266, 2371993, 7474532, 6855298, 904910, 2869944, 36775, 996194, 1069682, 3113290, 6899662, 496836, 5081132, 6871386, 7847766, 5055044, 4995816, 7103152, 1903773, 7332664, 549637, 7866981, 3814771, 5214528, 1941670, 83015, 8046463, 8080239, 4517507, 4920554, 1234036, 3470737, 4299252, 6089733, 2323130, 153798, 579035, 4232594, 1410715, 7789418, 7597450, 7471978, 1093754, 632816, 7561661, 1592964, 2249967, 5066137, 3945095, 1958855, 8351384, 934439, 3314682, 5836350, 5017833, 6679528, 5320586, 6825376, 8340941, 3466296, 2362265, 6787107, 4807170, 4333957, 1394245, 3599035, 4768545, 1575915, 6437081, 7040097, 55247, 1654745, 1390792, 7201639, 2418910, 5186367, 7332502, 4387306, 6839560, 543808, 5894877, 2483726, 7219110, 7935831, 1139525, 6992558, 846376, 5859530, 6317565, 7942679, 37947, 5183688, 1592401, 6529717, 4035494, 8108698, 4684617, 6844543, 3158350, 5395608, 6636334, 1662557, 746988, 1376241, 3236495, 5008172, 4505726, 3259166, 6684669, 942470, 331687, 3749291, 5126514, 5820265, 8159827, 126021, 6809820, 3343410, 5159888, 3598046, 501519, 5921345, 5314976, 1058325, 7434392, 3877895, 588078, 674273, 7305442, 3188365, 7685511, 5559671, 4192277, 861624, 7536334, 2319533, 3728647, 7756385, 8364501, 6598826, 1534742, 163375, 342504, 1646182, 767209, 7034769, 3821040, 4885333, 5246133, 3588668, 3401465, 417621, 6967607, 4812638, 3425124, 605222, 3003235, 5222469, 4520441, 4659020, 2592686, 7675923, 4624315], -[4189740, 5020560, 532067, 3830956, 3826880, 431460, 666573, 3263671, 5580150, 3275760, 5874585, 4959570, 1748071, 5176862, 1881136, 6465617, 691141, 2891199, 1100770, 8261023, 4113747, 3617881, 2975674, 7685858, 4041173, 1449957, 5553501, 4773514, 3810312, 3957007, 7853804, 3006438, 203971, 8113036, 4739447, 4336414, 2169449, 4501124, 424473, 781311, 7012922, 6565664, 8207031, 911624, 2316314, 1673663, 117393, 465249, 5395315, 2520947, 5119540, 8014618, 6861865, 1031718, 681877, 454634, 4121090, 4254389, 4620463, 883283, 3562913, 4115613, 5796672, 3179571, 7351785, 6654764, 4338181, 5416077, 3156093, 2808821, 4345210, 1283437, 7891884, 1125541, 2045285, 2075229, 1387447, 2007199, 7006868, 6657652, 7140287, 3205808, 8158172, 6508025, 8377681, 4862900, 1731077, 101048, 1465923, 847195, 6012757, 763714, 6294017, 3739163, 4307627, 706993, 981201, 8355418, 7260845, 2564600, 2166057, 4731318, 8189949, 4253209, 7924705, 7636080, 4365555, 772888, 1768142, 1306685, 7521374, 3213880, 2012313, 6641607, 6602243, 2760716, 5932003, 6531755, 6530631, 6410078, 5981003, 2578512, 7649702, 6414865, 4233752, 6116349, 1917413, 1478043, 8003833, 3265784, 1521867, 3984151, 389497, 2942633, 2792220, 3084710, 6454102, 6570969, 4802088, 5191150, 802476, 2588110, 5082202, 8252585, 7194656, 7888857, 7088224, 7126635, 7254545, 1107774, 5916083, 1094568, 1312316, 6718825, 7375921, 4613162, 7896364, 3346862, 6821061, 259908, 7109047, 4855916, 5786122, 4583498, 7768313, 4133565, 6996650, 1853155, 1863196, 5516844, 906200, 4477562, 6322379, 3956106, 6863253, 6383739, 7788789, 7908501, 714241, 8207061, 4733014, 437107, 8119278, 4488504, 5822922, 7767337, 5964811, 3773354, 747621, 2751000, 1831426, 2652748, 7277669, 4223765, 5506370, 5752223, 7270315, 7466047, 511634, 3237018, 7748887, 1268046, 3211163, 7700460, 762594, 5349376, 5317352, 5256109, 3452792, 4737441, 463937, 2840918, 5960491, 281990, 2809923, 5789978, 120369, 3752813, 2357812, 7567491, 3929786, 3282410, 1705967, 3403927, 672563, 2782935, 2302183, 5357036, 5538409, 8353718, 1317636, 7952312, 4629337, 4262269, 8192576, 4293275, 4646192, 1242987, 5504492, 6146023, 2349451, 6652976, 543701, 7479620, 5436338, 4190154, 3600015, 5926659, 3954491, 5714014, 3699285, 1770495, 7958478, 5087283, 1891295, 3569946], -[2064287, 7538397, 1701410, 6692398, 3431600, 5966918, 1719034, 2860070, 7963510, 8158351, 5253319, 566275, 2866288, 1676583, 1237647, 1522936, 7931959, 3295878, 7864774, 7501524, 1044599, 2132524, 4810773, 2340734, 679501, 1481389, 3545268, 2973722, 7366213, 2698372, 3459652, 3709749, 7456968, 5715018, 6636305, 3729062, 2833227, 5879416, 5406117, 781615, 175863, 3865580, 758176, 7744206, 1914882, 3120618, 2651096, 4603140, 7295198, 3506041, 8027845, 6210098, 1990501, 481437, 738205, 7897895, 6898338, 3479403, 6065228, 1841662, 4888726, 5598386, 4785758, 6837766, 2940975, 5510652, 5643773, 136423, 1407522, 6755845, 7179057, 2688261, 5710611, 590548, 4470456, 7024065, 4153270, 4541349, 1255524, 1645470, 2763645, 5237491, 4706300, 4660171, 6594112, 6630581, 2713007, 2041515, 1356921, 4779328, 4645766, 4886815, 2588029, 8021517, 6658728, 547034, 6488812, 695550, 7160167, 5918762, 2473293, 2593517, 8295315, 4903675, 6734028, 3719147, 6278945, 7178693, 5185274, 4658151, 6935036, 5215940, 7608510, 4824835, 8273998, 1182395, 1045103, 2682146, 4546469, 4300336, 4286538, 4879969, 5527623, 7244471, 7970328, 8244494, 3035012, 5959435, 406435, 7789343, 2657498, 4989012, 4216523, 1517667, 1305321, 2069601, 4984735, 2441342, 7585824, 808842, 5170240, 3292273, 8316001, 7809544, 2347137, 3664902, 6421568, 159731, 7118092, 6828866, 5760482, 7265976, 4698602, 3411936, 630024, 6698406, 3395223, 5958735, 6984905, 3132440, 5621114, 3995504, 665568, 860449, 6580675, 3448746, 2229821, 7529207, 2649775, 1186071, 6234692, 7451976, 5762821, 94247, 7157366, 2833082, 956459, 4569649, 7715883, 8347776, 3006275, 7370970, 3734708, 1919084, 1977095, 7337386, 3680085, 5355607, 3207798, 3311878, 5514375, 584253, 2992778, 8006776, 3190562, 2915892, 3330467, 4622787, 1403118, 1990601, 4541749, 1470908, 2429084, 8328944, 3586219, 4686514, 395647, 5842073, 7234799, 2799072, 8083849, 5322562, 6654064, 1847701, 3797747, 18947, 7948329, 4491608, 8137493, 1173344, 2517742, 7933058, 4604314, 721883, 8211781, 5384837, 5009467, 3658001, 426518, 1734177, 7951028, 3635905, 1247086, 3633795, 5283865, 6420083, 3145285, 7214906, 2035587, 5784531, 3303010, 6178688, 4631632, 6579312, 4227601, 4462950, 3101417, 2149614, 3336063, 2110448, 5784497, 1220553, 4096902, 1750082, 3145805, 3217584]], -[[5683391, 3710350, 92719, 1308362, 7290103, 3944071, 753228, 2477620, 5628327, 2844743, 646481, 1331593, 1103650, 3107746, 7647179, 4318608, 7294668, 2756838, 4884808, 8285339, 1269566, 1770852, 6974741, 7195195, 1683878, 104725, 7371601, 2657716, 4117127, 3054077, 230785, 1503264, 6762082, 7512641, 5998732, 3430376, 1376117, 5125504, 4495264, 4616177, 8234425, 5948466, 7945236, 2826866, 1747539, 5382666, 8271396, 2763986, 1798221, 5617535, 4514790, 3912812, 910278, 4430894, 4472792, 920498, 7831594, 3391036, 8159560, 4482961, 5644483, 3970881, 8317951, 3361483, 4832442, 5727054, 7668045, 6812533, 6952711, 746664, 5874158, 239779, 1366675, 3864332, 1890651, 1171664, 3421772, 6882534, 333444, 4431937, 3877383, 3518335, 3967629, 2426444, 3732139, 2315628, 2950494, 3869759, 966542, 6758356, 5071254, 7497892, 3562349, 2725540, 2100949, 4875092, 7950602, 7973212, 1293637, 7783907, 8184304, 6914214, 6956953, 678440, 3964167, 5019123, 2953816, 33134, 7103616, 4771436, 374294, 4967828, 2195906, 8286830, 1905910, 417751, 7106533, 6082346, 1943376, 1115236, 2587573, 2862562, 6824032, 3597436, 5275150, 7812016, 6019254, 5462659, 3384997, 5497100, 4397929, 687520, 6166316, 2144845, 2358303, 6942245, 8138531, 815541, 7603570, 5018190, 7009997, 710061, 1576455, 212713, 7094710, 2670726, 1384932, 2476995, 3000927, 627627, 2155112, 7340356, 1188666, 4001321, 764087, 7106602, 6550930, 5399850, 3375346, 3708768, 8144182, 4709848, 7340111, 6745872, 2635217, 1414146, 8165502, 3657014, 2963298, 6118933, 2423496, 1794421, 3722883, 2062261, 4583571, 6265227, 1970404, 8088295, 8002594, 8368139, 6288791, 7387656, 5171444, 7477085, 6576009, 5466034, 2704096, 8268019, 1925743, 174523, 2530070, 2560462, 518848, 5671761, 6596698, 5486552, 584502, 2382640, 7166679, 3495914, 4669506, 132828, 706321, 34309, 2170945, 1739874, 4124945, 8312651, 123306, 2794030, 5326396, 1432097, 3395293, 74078, 4861039, 6015628, 6213190, 4649215, 1570113, 5446964, 3260667, 7749376, 6487671, 3664254, 2236782, 7021557, 696484, 7911555, 1086990, 3198664, 17850, 3683312, 3288003, 4217996, 555822, 4614956, 6176937, 6459481, 7876317, 4893512, 7383955, 7940986, 1675795, 7770017, 4412811, 7626775, 7813763, 4350655, 2087956, 2026481, 5154897, 3610764, 6676835, 331133, 3184716, 637448], -[3845441, 5948345, 2526079, 3527655, 8340658, 3871182, 5148928, 5273305, 4432905, 1891173, 5260826, 6465732, 4540806, 2818528, 4544029, 4430633, 3482639, 2702517, 5146042, 6419635, 1109684, 2372543, 8311838, 2085052, 3507878, 26762, 7716435, 8042736, 2138382, 7979425, 76163, 4807471, 3606062, 7946765, 330929, 734329, 4104102, 1808857, 477449, 8163261, 6971057, 7843251, 4927691, 6677920, 7665717, 3750609, 4701258, 3058870, 1251659, 6129335, 3556202, 1283857, 7630073, 1124997, 3130214, 1734737, 6007745, 4348698, 1397023, 7082059, 1163772, 6078529, 3517091, 4020385, 897223, 3798751, 7959469, 5063932, 1267106, 52148, 5430708, 2714705, 2666072, 4875376, 1226832, 6721928, 5063888, 6380967, 933788, 2481579, 2263113, 7780343, 2048034, 987223, 2698835, 4314650, 4962142, 1974605, 4487825, 898178, 7427615, 2636860, 2146730, 384510, 5570125, 4600025, 2744349, 970545, 341361, 4100257, 2926654, 6861050, 4939857, 5174127, 2490985, 4322473, 6611647, 6683729, 4435760, 3273613, 4556997, 904654, 536191, 1109818, 6632377, 767075, 5487421, 1211712, 3135240, 4474932, 7124961, 2680467, 6172472, 637392, 1445508, 1741521, 1569219, 3534604, 7302355, 6016112, 545828, 4227739, 5696466, 5642100, 6919350, 8144659, 1677477, 5773615, 874454, 1757969, 5750019, 1593476, 6362379, 1713607, 2706621, 3233779, 6479540, 892299, 4636373, 6377149, 5664978, 13120, 8281728, 5159402, 5696454, 5605574, 4653622, 1817441, 171885, 4374113, 3492702, 4162724, 7346068, 4733212, 2311547, 2477432, 6274796, 5416878, 1617111, 222937, 725686, 7257772, 6728147, 6471494, 763061, 719071, 6524550, 5519922, 971694, 2743166, 1508664, 3216851, 1060612, 6929127, 574077, 3871271, 3989461, 1099586, 4101828, 2818783, 4684972, 4972365, 2089600, 43683, 4556841, 7602949, 3615224, 3810031, 3427704, 1895016, 3547470, 3704258, 7424605, 6413426, 3248473, 2785536, 1654293, 3783061, 3425238, 3710350, 7102589, 7479478, 822457, 5167322, 6826453, 87829, 5699697, 2120761, 6801762, 7653895, 4940055, 7463717, 6572931, 7651737, 1239232, 3285823, 5308731, 6587411, 635269, 8068897, 7814186, 7007527, 6594288, 4494652, 4786689, 6077348, 4353010, 3982747, 2629676, 6452340, 2511502, 5592118, 7629882, 7821505, 4997854, 4071122, 177996, 6561917, 3801074, 10598, 6352643, 3098145, 4116065, 1527167, 7537296, 1578787], -[3891096, 6185093, 4971478, 4257325, 1020462, 675281, 134694, 4822802, 5810277, 3955271, 1491528, 3794827, 253530, 6428696, 4818163, 2884145, 2903266, 298298, 4603064, 8160714, 5792499, 865799, 1619577, 533766, 6972000, 6098559, 2326570, 969769, 6130060, 4397918, 6968167, 3637012, 7283379, 6301530, 6195231, 7955036, 6469135, 4020548, 7853350, 7961177, 3028661, 5220419, 6277568, 4695048, 4029424, 8010317, 4689206, 7720318, 4002318, 1113351, 2234670, 7906967, 439390, 5063227, 7370501, 7895781, 4524, 795561, 3628925, 4723394, 5398137, 4562159, 807714, 5878753, 4272113, 1357717, 825704, 5887330, 4319744, 4196390, 6727146, 7306212, 7203743, 2697266, 4687508, 4697954, 2530266, 3688268, 7307078, 2964441, 3293843, 5911467, 8214149, 5127001, 671444, 6351888, 6998433, 3710780, 643318, 5062735, 8069513, 7433864, 1807428, 5642159, 2721109, 2096781, 5836671, 1518576, 5844253, 2863227, 2592012, 479290, 549486, 433947, 5491622, 2252945, 3090577, 4722684, 7096096, 5137542, 6307772, 5188696, 4497272, 7105336, 1756597, 5072162, 3158415, 4870493, 107132, 5609711, 1827485, 1840804, 3017463, 7261892, 5897131, 3893754, 2336067, 3534738, 3862427, 1668761, 2059021, 1408013, 2645537, 6802499, 7345627, 6877105, 4304158, 1135307, 3684153, 6344078, 5869579, 5248261, 6501, 4693562, 4705703, 41217, 7487942, 77835, 1222738, 2992465, 322889, 3158864, 6610809, 4150224, 1441527, 2152252, 7620592, 7839794, 7057093, 7546652, 3054583, 1998065, 5085277, 2923084, 5624592, 6130206, 3219899, 2027486, 7892198, 7381486, 5754551, 7300624, 4279935, 3771460, 2850110, 1323702, 3628136, 7404930, 5343431, 6826326, 7577609, 119856, 2490216, 3433424, 8281375, 7149694, 7470393, 7906970, 5758272, 1139062, 5235439, 5968308, 434025, 6653678, 8324197, 3846059, 3352235, 2432978, 461841, 718037, 1241021, 6979115, 218058, 3620647, 5247186, 1630029, 1422383, 405956, 4371450, 1083953, 3691402, 7412225, 2952833, 1155508, 4630029, 6642268, 2222359, 3074423, 4496171, 722030, 1933910, 7783306, 5363795, 4241947, 4478330, 6369040, 2701766, 2893780, 1619372, 6732951, 384933, 587101, 376500, 7168867, 4352422, 7298991, 5641566, 3365784, 7788116, 280828, 3611013, 127448, 6495127, 3602655, 4039854, 7342936, 6614505, 4220213, 2049870, 1984412, 1135319, 1485097, 1820592, 1367085, 5005544, 5806867], -[5490328, 6103382, 7375552, 1282221, 3029624, 3110897, 151679, 1735155, 5636900, 8126990, 1822332, 320718, 5264538, 6595771, 7535240, 1176690, 4927375, 5026013, 3009081, 6115026, 4933795, 3745120, 6615052, 4593525, 514722, 4739787, 5181504, 8049019, 4876778, 680977, 7823729, 7102549, 1731093, 2650587, 7288671, 7007274, 2329313, 5913831, 2625239, 1421543, 4096507, 5287827, 7741390, 4467290, 4934718, 5941948, 753373, 1958841, 6845215, 5533006, 5176679, 339157, 5901403, 4314943, 2052431, 4561751, 8256012, 311349, 8016485, 4340808, 5194472, 3475832, 5959032, 7415319, 7054535, 5058689, 5662985, 4728338, 1899776, 2812415, 7321986, 706825, 5980822, 8303324, 2917536, 7593600, 634645, 190380, 3762069, 3640030, 1337266, 2747661, 2134756, 6449709, 2186332, 8114154, 4930325, 1403549, 7856665, 6036945, 2567732, 557921, 6034843, 7263045, 2796676, 5289811, 2167016, 4190744, 2692845, 5648414, 3505129, 1677213, 3177843, 4018468, 6093027, 5311844, 7524766, 6330320, 4846043, 6672832, 6410792, 1134778, 1435678, 6954372, 8332817, 5592628, 6524481, 6584781, 2969407, 6682130, 7722806, 2292745, 6806724, 7580684, 1286847, 2361421, 4195108, 1821989, 2594429, 3725881, 8082694, 3927265, 6173582, 7435094, 7974320, 2663486, 7826202, 174879, 1787137, 7009547, 4990512, 5055362, 3292997, 7550092, 6894673, 2323713, 7943700, 5251060, 6784237, 6975398, 2847573, 631158, 2767586, 7384238, 3609378, 6410445, 7439884, 8325182, 5570429, 1838353, 6650691, 1047299, 3756663, 1947278, 367966, 1371153, 1193339, 3048657, 7415152, 8245192, 7239919, 5509247, 3838864, 7020648, 4552428, 7039101, 6660695, 8364395, 7548446, 1795311, 2262848, 7388484, 968001, 7165526, 6934633, 3201576, 3398382, 4326142, 4988619, 58103, 8206263, 7471474, 5800029, 4648766, 7643818, 2706946, 7690640, 4191529, 1932311, 7548429, 1618612, 3822340, 5674483, 398672, 2183801, 1417526, 7678333, 509238, 8288451, 3993762, 7699208, 4897923, 4062488, 5912152, 7263613, 2633162, 876336, 1318836, 7965983, 2964620, 3043715, 6108188, 712841, 4418616, 5403849, 2627894, 2517626, 5918639, 4777756, 150791, 81461, 6759800, 2272791, 3839455, 5446312, 6664687, 7620308, 2740215, 2187833, 6951716, 3506031, 4437310, 3800782, 5251191, 7359081, 5375135, 3263448, 1005779, 8174544, 1089636, 1270856, 6781891, 4956628, 6664988, 7957389, 5791918], -[1960391, 6492981, 2680159, 5794776, 2695689, 2994834, 4319039, 2802253, 5456051, 5880760, 380440, 994922, 1273115, 973634, 1330084, 551564, 4507054, 2810921, 583228, 2882919, 917977, 245061, 2491996, 3112425, 3368498, 1925914, 5961626, 6760898, 1678195, 1608615, 3952754, 2755186, 7601800, 950361, 3833227, 7413328, 3301678, 5924922, 6817243, 1431720, 91360, 2995101, 4507620, 2729246, 3477020, 4551907, 817811, 3127024, 2405339, 4054149, 5605307, 5248727, 6087820, 5749850, 7714642, 6728393, 3591532, 577585, 6473552, 7522817, 1392819, 6880935, 5312690, 506945, 8091145, 742929, 6799260, 2652586, 7452729, 4541860, 3381481, 3061014, 3376644, 5481519, 5731437, 1932141, 3621310, 5147332, 806862, 7357747, 4986069, 4576253, 5069876, 2652690, 8064760, 3839600, 4424535, 780086, 4691504, 1699483, 5974470, 8020211, 1201612, 809656, 4464587, 7252763, 6052120, 6076335, 3083068, 3168047, 4957750, 3478661, 835216, 584933, 4127478, 4942548, 2728615, 1054891, 4836533, 3177007, 2577866, 8073339, 3264847, 6210100, 1043897, 6918130, 2532474, 6341590, 413784, 6546039, 900589, 4908413, 3854232, 1298302, 8293745, 6435805, 5588713, 8162310, 5733943, 564722, 2568541, 5535776, 1334324, 1698880, 506678, 7038492, 6452016, 3572627, 148130, 3717450, 6821979, 2914494, 3924012, 1545574, 8276309, 2424409, 4448223, 7133022, 869513, 5849107, 8117963, 3771355, 8324513, 562863, 8346779, 7642036, 7777906, 6411315, 4438572, 2928891, 4155741, 5247557, 948670, 5148880, 2836540, 6068476, 2790331, 3860362, 6130088, 3493728, 318684, 1574949, 6425420, 6630654, 3591850, 5439494, 6254389, 5600976, 2534116, 4057493, 3751239, 4348479, 6989249, 2345693, 654691, 3403550, 691586, 1979429, 8064223, 4606604, 739758, 548107, 5179586, 2730203, 7257148, 2610058, 365507, 1384500, 1967234, 1705797, 6700681, 7225578, 7389586, 6165942, 922604, 5114800, 7891846, 1154582, 3049978, 3867059, 6029908, 4114632, 3496583, 6250390, 697990, 5041106, 4313626, 3439979, 4213705, 3476530, 7441723, 4038065, 5458545, 6069422, 5275723, 538502, 8104834, 1741116, 5251792, 1927295, 1078520, 2405168, 3132377, 6658912, 2024428, 135843, 894294, 978881, 156397, 5845025, 903581, 7596297, 5894171, 741065, 1568180, 1979423, 4668001, 5184514, 7454511, 6928227, 2360543, 2878160, 3997382, 7975802, 2949452, 5117284], -[24448, 911491, 7427273, 3055044, 6727997, 1380282, 1024871, 7315650, 1758021, 5081711, 3522078, 3823749, 641736, 4837778, 247446, 6899785, 7829133, 4293145, 5196979, 7771104, 7351477, 1468067, 3457945, 7194757, 7472864, 7116529, 1379297, 7875722, 4722927, 8125863, 2373250, 4752283, 7397445, 3101527, 8218504, 1096673, 2314375, 3296859, 7363912, 1815690, 2998871, 1200499, 8260569, 634424, 8258449, 6894614, 8285099, 141189, 1949477, 8040110, 1786560, 7358607, 5017383, 5295747, 5585198, 4398961, 3653257, 4645692, 6961420, 7294531, 5967803, 1051854, 2995747, 5678452, 7377075, 1447653, 6063890, 1270842, 3865195, 4744815, 7998826, 1064391, 3606436, 966076, 724279, 8196623, 985045, 3944293, 3044492, 7283955, 988148, 681120, 434246, 345234, 5945994, 3692422, 7323481, 3316639, 4844627, 5288159, 559594, 2447028, 1454464, 1765968, 3869036, 2189817, 407292, 8179694, 5477854, 227526, 925453, 7975518, 824609, 5699764, 7844466, 2053154, 3982992, 1350080, 4486299, 1319191, 3664229, 6996815, 7497336, 659671, 5732007, 6343583, 4360474, 4174342, 8106737, 7085598, 7445358, 4795540, 6007096, 7363100, 7571393, 2467383, 3261958, 750473, 2092204, 4523560, 5954472, 7733481, 767316, 1731503, 4690616, 7602015, 8267516, 173659, 6240898, 4452819, 948704, 1582705, 3485660, 5320108, 3364478, 5560344, 1652741, 805836, 2119977, 856448, 3545859, 6269842, 977818, 5482292, 8286115, 5928481, 5545946, 945323, 8064057, 5062629, 8101232, 2361444, 1342352, 5074037, 6451710, 3642825, 967000, 3068060, 5679383, 4875558, 1902169, 7646938, 7956660, 3764508, 7530686, 1489544, 4359946, 3577810, 2163531, 3112585, 6344303, 7437705, 3104641, 2903089, 7703074, 1986921, 6498273, 650936, 7190182, 4977232, 3735528, 1191251, 1268285, 3421582, 7161511, 1539658, 2827847, 5057412, 4975728, 5574462, 6753096, 5757133, 2298886, 7952150, 1147000, 172458, 7337009, 1366819, 1902206, 3817146, 3153154, 6804049, 7253881, 2060635, 1315198, 1301267, 1231714, 1867468, 184067, 3629133, 1075220, 8184728, 7934963, 6465061, 6187164, 3396129, 549001, 3820231, 7577133, 332606, 7740569, 6964709, 517732, 4604688, 5573216, 521069, 7563427, 4203692, 1143995, 1523296, 6740048, 6728098, 1281990, 1608403, 856636, 1488357, 2426433, 7966635, 8157559, 5277437, 4963441, 2998979, 151003, 5975265, 2337800, 4791086], -[853006, 3965114, 5798521, 2355536, 473987, 2094950, 1746940, 3439199, 2184668, 1528327, 2814729, 7208660, 739852, 2295255, 1239273, 770499, 1130010, 7149225, 965208, 2409132, 5887529, 4581272, 7786968, 6556903, 6112103, 5435067, 1716408, 2924294, 2646088, 3190283, 3499688, 1778366, 7772718, 4874214, 2787961, 457558, 254830, 942496, 767122, 5419708, 2192423, 7273882, 7413199, 3336916, 233451, 2108313, 5041745, 3389504, 6217239, 1702498, 4738958, 300807, 3472322, 3902738, 5011384, 3733792, 5222317, 6948108, 1111755, 6517087, 2914158, 7000117, 4428692, 4450110, 5443175, 877295, 3646490, 543826, 3563968, 5868858, 1436491, 3674677, 6746738, 6136970, 2441634, 3309425, 5499044, 4424694, 1161656, 2693751, 6636057, 1239961, 4920262, 5871366, 3502632, 5116544, 4911027, 1612766, 1034534, 509103, 3278852, 5908563, 623688, 8056947, 7735596, 1914792, 5900891, 7691411, 1316995, 6751492, 810226, 3353662, 2661343, 4458342, 5917673, 3109593, 2208143, 1009948, 4987592, 4786600, 6984048, 1898867, 6400767, 2620334, 3692795, 4464587, 5231992, 6303993, 1797052, 2853704, 6417686, 6782822, 3650870, 4488170, 4025408, 5710940, 616570, 4476180, 3569417, 2565452, 3734889, 911583, 5755623, 4754613, 5320042, 5568908, 4826025, 7685369, 984166, 2446207, 722936, 4592228, 3614133, 44202, 289014, 1906484, 8058444, 2875352, 7368410, 926432, 3777554, 7015834, 3606747, 3836257, 63917, 2656071, 2646224, 53954, 6673012, 2562718, 1420073, 1635984, 6575278, 2069706, 6629513, 2293698, 527493, 3846643, 2241747, 3736104, 3223765, 1533664, 1474159, 7819457, 7650427, 7950472, 3346343, 690335, 491626, 8119383, 3341691, 4319927, 8162307, 7444286, 3747712, 3440703, 3469757, 5985746, 4225955, 705945, 6439342, 8093677, 61798, 6626687, 4309974, 8262902, 844978, 452, 8044627, 4068662, 4044885, 7791150, 5185798, 2216436, 7238558, 8025482, 5205687, 5421381, 7276796, 3546405, 189627, 316710, 5752157, 2501730, 4811974, 4010658, 2011957, 6306560, 3965919, 3731480, 1399952, 7493624, 1997305, 6885143, 5167542, 5304802, 7896963, 4466286, 5230402, 7533362, 7552379, 2209957, 5255290, 2160918, 7922991, 1650354, 7646074, 2821172, 6992810, 1060641, 6475595, 3694520, 6826389, 684812, 6687845, 7118866, 6151799, 6938089, 5613508, 1617252, 3806555, 6052647, 3375998, 460657, 3113800, 6571280]]] -s1: [[1, -1, 0, 2, -2, 2, -1, 0, -1, 2, 2, 2, 0, -2, 0, -1, -1, 2, -1, -2, 0, -1, -2, -1, 1, 2, 0, 1, 2, 2, 1, 1, 0, -2, -1, -1, 0, -1, 0, 2, 1, 0, 0, 1, -2, -2, 2, 0, 0, -1, 2, -2, -2, -2, 1, -2, -2, 0, -2, 2, 0, -1, 0, 0, -1, 0, -1, 2, -2, 1, -2, 1, -1, -1, 2, 1, 1, 2, -2, 0, 1, 0, 1, 2, 0, -1, -1, 2, -1, 2, 0, -2, -1, -2, -2, 2, 2, 1, -1, -1, 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, -1, -2, 1, 2, -1, 1, 1, 1, 0, -2, 1, 1, 0, -1, 1, -1, -2, 2, -1, 1, 0, 1, -1, -2, -2, 2, -2, 2, 2, 1, 1, 1, 0, 1, 1, 0, 1, 1, -1, 1, 1, 0, 0, 1, 0, -2, -2, 1, 2, 2, 0, 0, -2, -1, -1, 2, -2, -2, 1, -2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 1, 1, 0, 0, 2, 0, 1, 2, 2, 0, -1, -1, 1, 1, 1, -1, -2, 2, -2, 1, -2, 2, -2, 2, -1, 2, 0, 0, 2, 1, 0, -1, 1, 0, -1, 1, 1, 2, 0, 2, -1, -2, 2, 0, -2, 0, 0, -2, 2, 1, 2, 1, 0, 0, 1, 1, -1, -2, 0, -2, 2, -2, -1, 0, 0, 0, 1, 0, -2, 1, -1, -2, 2, -2, -2, -1, 1], -[-1, 1, 2, 1, 0, 1, 0, 0, -2, -2, -1, 1, 0, 1, 0, 1, 2, 2, -1, 2, -2, -2, 0, -1, 2, -2, 1, 0, 0, -1, -2, -1, -2, -1, -2, 0, 1, 0, -2, -1, -2, 1, 2, -1, -2, -1, -2, 2, -1, -2, -2, -2, 2, -1, -2, 2, 0, -1, 1, 2, -2, 1, -1, 0, 0, 2, 1, 0, -1, 2, -1, -2, 2, 1, 2, 2, 2, 0, 1, 2, 1, -1, 1, 0, -1, -2, 0, 1, 2, 0, 1, 1, 2, -2, -1, 2, -2, -2, 2, 2, 2, 1, 1, 2, 0, 1, 1, -2, 1, 0, 1, -1, 2, 0, -1, 1, -1, 2, -1, -1, 0, -2, -1, 1, -1, -2, 1, 1, -1, 1, -2, 1, 0, 1, 2, -2, -2, -1, -1, -2, 1, -2, 1, 1, 2, 2, 2, 2, -1, 0, -1, -1, 0, -2, 1, 0, -1, 2, 0, 1, -1, -2, 0, 1, -1, 0, 2, -2, 1, 1, -1, 1, -2, 1, -1, 1, -2, -2, -1, -2, -1, 2, 2, -2, -2, -1, -2, 2, 2, -1, -2, -2, 1, 2, 2, 0, 2, 1, -1, -1, -2, 0, -1, 1, -2, 1, -1, -1, 1, 1, -2, -2, -1, -2, 2, 1, 0, 0, -1, 2, 2, 1, -2, -2, -2, -2, -1, 0, 2, 1, 2, 0, 2, 1, 2, -1, 2, 1, 2, 1, -2, 2, 2, -1, -2, -2, 0, -1, 0, 1, 1, -1, 2, -2, -2, 2], -[0, 2, 2, 2, -1, 1, 2, -1, -1, 2, -1, -2, -1, 2, 1, -2, -1, 1, -1, 1, 0, 0, -2, 0, 2, 2, 2, 2, -1, 0, -1, 2, 2, 1, 1, -2, -1, 1, 0, 0, 1, 1, -2, -2, -1, 2, 2, 1, -2, 1, -1, 0, 1, 0, 0, -1, -2, 2, 2, 2, 2, 2, -1, -2, 1, 0, -2, -2, 1, 0, -1, 1, 1, -2, -2, 0, -1, -2, 0, -2, -2, -1, -1, -1, 1, -1, 0, 1, 0, 0, -1, -1, 0, -1, -2, 0, -1, 0, 1, 2, -1, -1, -1, -1, 1, -1, 2, -1, 1, 2, 1, 0, 1, -2, 2, 2, 0, -1, -2, 1, -2, -1, 1, 1, 2, -1, -2, 1, 1, 1, -2, 2, 1, 1, 1, 0, -1, 1, 2, -2, -2, 0, -2, 1, -2, -1, 2, -1, -2, -2, -2, 0, 0, -1, 2, 2, -1, 1, 0, 0, 2, 1, 0, 1, 2, 1, 2, -1, 2, 2, 1, -2, 2, 0, 0, 0, 2, 1, 2, 0, 2, -2, 1, 2, 0, -1, 1, 0, -2, 0, -2, -1, 1, 1, 0, 1, -2, -1, 1, -1, 2, 2, 2, 2, 2, 2, -2, -2, 1, 2, 2, 2, 2, 2, 1, -1, 0, -1, 1, -1, -1, -2, 0, 2, 2, 1, -2, 2, 2, -1, 1, 2, 2, 1, -2, 0, 1, 2, -1, -1, -2, 0, -1, -1, -2, 2, -1, 0, -1, 2, 1, 0, -1, 1, 2, -1], -[-2, -2, 1, -2, -1, 1, 2, -1, 0, 1, 1, -1, 0, 1, 0, 1, -2, 0, 0, 1, -2, 0, 0, 1, 2, 1, 2, -1, 2, -2, 0, 1, 1, -1, 1, 1, -2, -1, -1, 0, 1, 1, 1, -2, 2, -1, 1, -1, -2, 2, -2, -2, -2, -2, 2, 2, 2, 0, -1, -1, 0, -2, -1, 0, -1, -2, -1, 2, 0, -1, 1, -1, 1, -2, -2, 1, 0, 2, 2, -2, 0, -1, -2, -2, 2, 1, -1, 2, -1, -2, 1, -1, 1, 0, 2, -1, 1, 1, 2, 2, 0, -1, 0, 2, 0, 0, 2, -2, -1, 0, -1, -2, -1, 1, 2, 1, 2, -2, 2, -1, 0, -2, 0, 2, -1, 2, 2, 2, -1, 2, -1, 0, -2, -2, -1, 0, 1, 0, 0, 0, -1, -1, 2, 1, 0, 1, 2, 0, -1, -1, 2, -2, -1, -1, -1, 0, -2, -1, 1, 2, -2, 2, -2, 1, 0, 2, 2, 1, -2, 1, 0, -1, 1, 1, 0, -1, 2, -2, 2, 0, -1, 0, 0, 1, 1, -2, 2, 0, 2, 1, 1, 1, -2, 2, 0, 0, -1, 0, 1, 0, -2, -1, -2, 2, 2, -1, 2, -1, -2, 0, 1, 2, -1, 1, 1, -1, 0, 0, 2, 1, 0, 0, 2, -1, 1, -2, 2, 2, 2, 0, -1, 0, 2, -1, 1, -1, 0, 0, 0, -2, -2, -2, 2, -2, 1, -1, 1, 1, 1, 0, 1, 1, -1, 2, -1, 2], -[-1, 1, -2, 2, 1, -2, 1, 1, -2, 2, 0, 1, 2, 0, -1, 1, 1, 0, -2, 2, 2, 0, 0, 2, -1, -1, 2, 0, -2, 1, 2, -1, -1, 2, 1, 0, -2, -2, -1, -1, 0, -2, -2, -2, 1, -1, -1, 2, 1, 1, 1, 2, 0, 1, 2, -1, -2, 0, 2, 0, 0, -2, -2, 2, 1, -2, -2, 1, 2, 1, -1, -2, 2, -1, 2, 2, -1, 1, -2, -1, -1, -1, 0, 0, 2, 1, 1, 0, 2, 1, 2, 1, 0, 1, 2, -2, 1, -1, 1, 0, -1, -1, -1, 0, -1, -2, 1, 0, -2, 2, -1, -2, 1, 2, 1, 2, 2, 0, 0, 0, 2, 0, 2, -2, -1, 0, 0, -2, -1, 2, -1, 1, 1, -1, -1, -2, -1, 0, -1, -2, 2, -1, 2, 0, 2, 0, 1, 1, -1, 1, 0, 1, 2, -1, 0, 2, -2, 2, -1, -1, 0, -1, 0, 0, 2, -1, 1, -1, 0, -2, -1, 0, -2, 0, 1, -2, 1, 0, 0, -2, -2, 1, 1, 1, -2, 0, 0, 0, 2, -1, -2, -2, 0, 2, -1, 1, 1, 0, -2, 2, -2, 1, -1, 1, -2, 2, -1, 1, -1, -1, 2, 1, 1, -1, -2, -1, 2, 2, -2, 0, -2, 1, -2, -2, -1, 1, 1, -2, -1, -2, -1, 2, 1, 1, 1, -1, 2, 2, -1, -2, 0, -2, -1, -2, -2, -2, -1, 2, 1, -2, -2, 2, -2, -1, 0, -2], -[1, 0, 2, 0, -2, -2, 1, -2, 2, 0, 2, 2, 2, 0, 0, -2, 1, 2, -2, 2, -1, 1, 1, -1, -2, 1, 1, 2, 0, -1, 0, -2, -1, -1, 0, 0, -1, -1, 0, 1, -2, -2, 1, -1, 2, -2, 1, -2, -2, 0, 2, 1, 1, -2, 0, 2, -2, 2, 2, 2, 1, -2, 1, 1, 1, 2, 0, 0, 1, 0, 1, -2, -1, -1, -1, 1, 1, 2, 0, -2, 0, 1, 1, 0, -1, 2, -1, 0, 1, -2, -2, 0, 0, -2, 1, -1, 2, -1, -2, -1, 2, -2, 2, -1, -2, 2, 2, -2, -2, 0, -1, -1, 2, 1, 1, -1, -1, -2, -1, -2, -2, -2, 2, 2, 0, 1, 2, 1, 2, 0, -1, -2, -1, 0, -2, 0, 1, -2, 1, -2, -1, 0, -2, -1, 0, 0, -2, 0, 0, -1, 1, -2, 0, 1, 1, -1, 2, -1, -1, 1, 0, 0, -2, 2, 2, -1, -1, 1, 0, -2, -2, -1, -1, -2, 1, 0, -2, 0, 2, 2, -1, 0, -1, 1, 0, 2, -2, 1, -1, 1, 2, 0, 2, 1, 1, -1, 2, 2, 2, 2, -1, 1, -2, 1, -1, 2, 2, -1, 0, -2, -1, 1, 1, -1, -1, -1, 0, -2, -1, 1, -2, -2, 1, -1, 2, -1, 2, -1, 1, -1, 1, 1, 0, -2, 0, 0, 2, 0, -1, -1, 1, 2, 1, -1, -2, 0, 1, 2, 2, 0, 1, 0, -1, 2, -2, 1], -[-2, 1, 0, 1, -1, 0, 0, 1, -2, 1, 1, -1, 2, 2, 1, -2, 1, -1, -2, 0, -2, -1, 2, -2, -2, -1, 0, 2, 2, 1, 0, 1, 2, 2, -1, -2, 0, 1, 0, 1, 0, -2, 0, -1, -1, 2, -1, -1, -2, 2, -2, -2, 1, 1, 1, -1, 2, 1, -1, -2, -2, 0, 1, 0, -1, 1, 2, 1, -2, -2, -2, 1, 2, -2, 0, -2, 1, 1, -2, -1, -1, 2, 0, -2, -1, -2, -1, -1, 1, -2, -1, 2, -2, 0, 2, -2, 0, -2, -2, 2, 2, -1, -2, -1, 1, -1, -2, 0, 1, -1, 1, -2, -2, -2, 2, 2, 2, -2, -1, 1, -1, -2, 1, 2, 1, -1, 2, -1, -2, -1, 0, 2, 0, 1, 1, -2, 2, -1, 0, -1, -1, 1, 2, -1, 0, 1, 1, 0, 2, -1, 1, 0, -2, -2, 0, -2, 2, 0, 0, 2, -2, 1, 1, -1, 0, -1, 2, -1, 0, -2, 1, -2, 0, -2, 1, 0, -1, 1, 0, 1, 2, 2, -2, 1, 1, -2, -2, -2, -2, 0, 0, 0, 2, -2, 2, -1, 0, 1, 1, -1, 1, 2, -1, -2, -1, -1, 2, 1, -1, 1, 1, -2, 2, 1, -2, -1, 0, 2, 0, 0, 0, -2, 0, 1, 0, 1, 1, -1, 0, 0, -1, 2, 1, 0, 0, 1, -2, 0, 0, 0, -1, 0, -2, -1, 1, 2, 1, 1, -2, -2, 0, -2, 0, 1, 1, -2]] -s2: [[-2, -1, -2, 0, 0, 1, -1, 2, 2, 2, 0, -1, -2, 1, 0, -1, 1, 2, 0, -2, 1, -1, 1, 2, 1, 0, 1, -2, -2, 2, -1, 0, -2, -1, -1, 2, 2, 2, 1, -1, 1, -2, -2, 1, 1, 0, -2, 2, 0, 1, 0, 2, -2, -1, 0, -1, 1, -1, -2, 0, 1, 2, -1, -2, 0, 0, 1, 1, -2, 0, -2, -2, -2, 0, 2, -1, -1, -1, 2, 2, 0, 2, 2, -1, 0, -2, -2, 1, 0, -1, 0, 1, 2, 1, 0, -1, 2, 0, -2, 2, 2, -2, -1, -2, 2, 1, 0, 1, 1, 0, 2, -1, -2, 2, 1, -2, 0, 2, 1, -2, -2, 2, -1, -1, 2, 2, 1, -1, 0, 1, 1, -1, 0, 0, 2, -2, 2, -1, 0, -2, -2, 0, 0, 0, 1, 0, 0, 2, -2, 2, -1, 0, 2, -2, -1, -2, 2, 1, -2, -2, 0, -2, 2, 0, 2, 0, -1, 1, -2, 1, 0, -2, 1, 1, 1, 0, 2, 0, -1, 2, 0, 0, -2, 2, -2, -2, 2, 1, 0, 0, 0, -1, -2, 1, 0, 2, -2, 0, 2, 2, 1, -1, 2, 2, 2, -1, 1, -2, -2, -2, -2, 1, 2, -2, 2, 1, 0, 1, 1, 2, 1, -2, 2, 0, -1, -2, 1, 1, 2, -2, -1, -2, -1, 1, -2, 1, -2, 1, -1, 0, -2, 1, -2, 2, -1, -2, 2, 0, 1, 2, 1, -2, 0, -1, 2, 1], -[2, -2, 2, 1, -2, -1, 1, -2, 1, -1, 0, -2, -2, -1, 0, 1, 2, 2, -2, 0, 2, 2, 2, -2, 1, 2, 1, 0, -2, -2, 0, 1, -2, 1, 1, -2, 0, 1, 2, 2, 1, 1, 2, 0, 1, 2, 0, -2, 0, 1, -2, -1, -1, 2, 1, -2, 0, 2, -2, 0, 2, -2, 1, 1, -2, -2, 1, 0, 1, 1, 1, 0, 1, -2, -2, 0, -2, -1, 0, 2, 0, -2, 2, 1, 1, 1, -1, 2, -1, -1, 2, -2, 2, 0, -1, -1, 2, -1, -2, -1, 0, 2, 0, 2, -2, 0, 0, -1, -1, 1, 1, -2, 1, -1, -2, 1, 0, 0, 2, 1, 2, -1, -1, -2, 1, 1, 0, -1, 1, -1, 1, 1, 2, 0, 0, -1, 2, -2, 0, 0, 1, 1, -1, 2, -1, 0, 2, 1, -1, 1, -2, -2, -1, 0, -2, 0, 1, -1, -1, -2, 1, 1, 0, 0, 2, 2, 0, 0, -2, -1, 2, 0, 1, -1, -2, -1, -1, 1, 2, -2, 0, -2, -2, -1, 0, 1, 2, 2, 1, -1, 0, -1, 2, 0, 2, 1, 2, -1, 2, -2, -2, -2, 0, -1, -1, -1, 2, 0, 1, 2, 2, 0, 0, -2, 2, 2, 1, 2, 2, 2, -2, -1, 1, 2, 2, 2, 2, 0, -1, 0, 2, -1, -1, -1, 2, 2, 0, -1, -2, 1, 0, 2, -1, 0, 1, -1, 2, 1, 1, 0, 0, -1, 1, -2, 1, 2], -[2, -2, 1, -2, 1, 1, 2, -2, 0, 2, -2, 0, -1, 0, -1, 0, 1, -1, 1, -2, -1, -2, -2, -1, -2, 0, -1, 1, 0, -1, 2, 2, -1, 0, 0, 2, -2, -1, -1, 2, 2, -1, -2, 0, 0, 0, 1, 2, -2, -1, 2, 0, 1, 1, -1, -1, 2, -1, -1, 1, -1, 2, -1, -1, -1, -2, -1, -2, -2, -2, -1, 1, 2, 0, -1, 1, -2, -1, 2, 1, -2, -1, -2, 1, 0, -2, 2, 2, -1, -2, 1, -1, -2, 1, 1, 1, 2, -2, 1, 2, 0, 2, -2, 0, -2, 2, 2, -1, -1, -1, 0, 2, 0, -2, 0, 2, -2, 1, 0, -2, -1, 0, 2, 0, 0, 2, 0, -1, 0, -2, 1, -1, -1, -2, 2, 0, 1, -2, 0, 2, -1, 2, 2, 0, 1, 1, 1, -2, 1, -2, 1, 2, -2, 2, -1, 0, 2, 1, 2, -2, 1, 2, 1, -1, -1, 0, 1, 2, 0, -2, 1, 1, 0, 1, -2, -1, -1, 0, 1, 1, -2, 2, 0, 2, -2, 0, 2, -2, 1, -2, 0, 2, -2, 1, 0, 0, -1, 1, 2, -2, 1, 1, 2, 1, -1, 0, -2, 0, -1, 0, 0, -2, 1, -2, 0, 1, 2, 2, 0, -2, -1, -2, 0, 2, -2, 0, 0, 0, 0, 1, -2, -1, 0, 1, -2, 0, 0, 2, 2, -2, -2, 0, -1, -1, 1, 0, 1, 2, -1, 0, 2, 0, 1, 1, -1, 0], -[0, 1, 1, 2, -2, -1, -2, -2, 2, 2, 2, 1, -2, 1, -1, -1, 0, -1, 2, -2, 1, -2, -1, 0, 0, -1, -1, 2, 0, -1, 0, -1, 2, -2, -2, 1, -1, -2, -2, 1, -1, 2, -2, 1, -2, 0, 1, 1, 2, 1, -1, -2, -1, 0, 2, -1, 0, 1, -2, 0, 2, 2, 0, 2, -2, 1, -2, -1, 2, 1, 1, -1, 1, 1, 2, -1, -2, 0, 0, 1, 0, 0, -2, -1, -1, 0, 0, 2, 2, -1, -1, 1, -2, 1, -1, 2, 0, -2, 0, -2, 0, 2, 0, 1, -2, 2, 0, 1, 2, 2, 1, -2, 2, 2, 2, -2, 2, -2, 2, 2, 0, -1, -2, -2, 2, 1, -1, 1, -2, -2, -1, 2, 0, -2, 1, 1, 1, -1, -2, -2, 2, -2, -1, -2, -1, 1, 1, 1, 2, 1, 1, -1, 0, 2, 2, 2, 0, -1, -1, 0, 1, -2, 1, 0, -2, -1, 1, -1, 1, 1, 1, -2, -1, -1, 1, 0, 1, 0, -1, -1, 2, 0, 0, -2, -2, 0, -2, 1, 1, 2, -2, 2, 1, -1, 1, -2, 2, 1, 0, 0, 2, 0, -1, 1, 0, -1, 1, -2, 0, 0, -2, -1, 0, -2, 1, -2, 2, -2, 1, 0, -1, 1, 2, 1, 1, -1, -2, -1, 1, 1, -1, 0, -1, 2, 1, 1, -1, -1, -2, 1, 1, 1, 0, 2, -2, 2, -2, 1, -2, 0, 1, -1, -2, 2, -2, -2], -[1, 1, -2, 0, 2, -1, -2, -2, 1, 1, 0, -1, 2, 0, 2, 1, -2, 2, -1, -2, -1, -2, -2, -2, 1, 2, 1, 1, -1, 2, 2, 2, 1, -1, 2, 0, -2, 1, 1, 0, 0, 2, -2, -2, 2, 2, 2, 2, -1, 0, -1, 1, 2, -2, 1, -2, -2, 1, 0, -2, -1, -1, 2, 1, 1, 1, 1, 1, 1, 0, 1, 0, -2, -1, 2, 1, -1, 2, -2, 0, -2, -2, 2, 1, 2, -2, 0, 2, 1, 2, -1, -2, 2, 0, -1, 0, -1, 2, 1, -2, 1, 1, -1, -2, -2, 2, -1, -1, 1, 1, 0, 2, 2, -1, 2, 2, 0, -2, 2, -1, 2, -2, 1, 2, 1, 1, -2, 1, -2, -1, 0, 2, 2, -2, 0, 2, 2, -2, -1, -2, 0, 2, -2, 0, 2, -2, 1, -2, -1, 0, 2, -2, -1, -1, 0, 1, 0, 0, 1, 1, 1, -1, 0, 1, 2, 2, 0, 0, 0, 2, 0, 0, -2, 2, 2, -2, 2, -2, 2, -2, 2, -2, -2, 1, -1, -1, 0, 2, 1, 0, 1, -1, 0, 1, -1, 0, 1, -1, -1, 1, -2, -1, 0, 1, -1, -1, 2, -2, 0, 1, 1, 2, -2, 0, -1, -2, 1, -2, 1, -2, -2, 0, 2, -1, -1, 1, 0, 1, -1, 0, 2, -1, -1, 0, 2, 1, 0, 2, -1, 1, 2, -1, 1, -2, 1, 1, -2, 2, -1, 1, -1, 1, 1, 0, 0, 1], -[1, -1, 0, -1, 2, -2, -1, 0, -2, -1, 1, 2, 0, -1, -1, -2, 2, -1, -2, 0, -1, -2, 1, -1, -2, 1, -2, 0, 2, -2, -2, -2, 2, -2, 0, 0, 0, 0, 1, 1, -2, -2, -2, 0, 1, 0, -1, 1, -1, 1, -2, -2, 2, -2, 0, 2, 0, 2, 2, -1, 2, 0, 2, -1, -1, 0, 2, 2, 2, -2, 2, 1, 2, 2, 2, 0, -2, 2, -2, 0, -2, 2, -2, 2, 0, -1, 1, 2, -1, 0, 2, 1, -2, 1, 1, -2, 0, 0, 1, 0, -1, -2, -2, -2, -2, 0, -1, 0, -2, 1, 1, 1, -2, -2, -1, 0, -2, 2, 1, 1, -2, 0, -2, -1, 1, -2, -2, 1, -1, -2, 0, 2, -2, 2, 0, 1, 0, -1, -1, 2, -2, -1, 2, -1, 1, 2, 2, 2, -2, -1, -2, 1, 1, -2, 2, -1, -1, 2, 0, 0, 2, 0, 0, -2, 0, -1, 0, -1, 2, 2, 0, 1, 1, -1, 1, -1, -1, 0, 0, 1, 1, -1, 2, -2, 1, -2, -1, 2, -1, 2, -1, 2, -2, -1, -1, 0, -1, 1, 2, 2, 1, 2, -1, 1, -2, 2, -1, 0, -1, 2, 2, 0, -2, 1, 1, 1, 1, 2, 1, -1, -2, 2, 1, 1, 2, -2, -1, -1, 2, 2, 1, 0, 0, -1, 1, -1, 1, 0, -1, 1, 2, -2, -2, 2, 2, -2, 2, 2, 2, 1, -2, -1, -2, 0, -2, 1], -[0, 2, 0, -1, 1, -2, -1, 2, -2, -1, 0, 0, 1, 2, -2, 1, 1, 1, -1, 0, 2, 0, 0, 0, -2, 2, 2, 1, 1, -2, -1, 1, -1, -2, -1, 0, 1, 0, 2, 2, 1, 1, -2, 2, 0, 0, 2, -2, 0, 2, 0, 0, 1, 0, 1, 2, 0, -1, 1, 0, -2, 2, 2, 0, 0, 1, -1, -1, 2, -2, -2, 0, 2, 2, 2, 1, -2, -2, 1, -2, 0, 1, 0, 0, -2, 1, 2, -2, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, -2, -2, 2, 2, -1, 2, 0, 2, 1, 0, 2, -2, 0, 2, 1, 2, 0, -2, 1, 2, 2, -1, 1, -2, 2, 1, 1, 1, -2, -2, 0, 1, 0, -1, -1, -2, -2, 0, 2, -2, 0, -1, -1, 2, 1, 1, 2, -2, 2, 2, -1, -1, 0, 1, 0, -1, -2, -1, 2, 2, 1, 0, 0, -2, -1, 0, 1, 2, -2, 0, -2, -1, -2, -1, 1, 0, -1, 2, 2, 1, 1, 0, 1, 1, 0, 2, 1, 1, 0, 1, 2, 0, 2, -1, 0, -2, 0, 2, -1, 1, 0, 2, -1, 1, -2, 0, -1, 2, -2, 0, 0, 1, 1, 0, 0, -2, -2, 1, -2, 0, -2, 0, 0, -2, 0, 1, 0, -1, 2, -2, 2, 1, 0, -2, -2, 1, -2, -2, 1, 0, -2, 1, -2, -2, 0, -2, 1, 1, 1, 1, -2, 2, 1, 0, 0, 2, -1], -[-2, 2, 1, -2, 2, 2, -2, -1, -2, -1, -2, 1, -2, 1, 0, 1, 2, 1, 1, 1, 2, -2, 2, 2, 1, -1, -1, -1, 1, 0, -2, -1, 1, -1, -2, 0, 0, 0, 0, -1, 1, -1, 0, 1, -2, -1, 0, -2, -1, 2, 2, -2, 1, 0, -1, -2, 2, -2, 2, 2, -2, -1, 0, -2, 1, -2, 1, 2, -2, 0, 2, 1, -1, 0, 2, -2, 2, 2, -2, 2, -2, -1, 0, 2, 0, 2, -2, 0, -1, -2, 1, -2, -1, 0, 0, 0, -1, -2, -2, -2, 1, 1, -1, 0, -1, -2, 1, -1, 1, -1, 0, 2, -1, -1, 1, 0, -2, -2, -2, 1, -1, 0, 1, 2, 1, -2, 0, 0, 2, 1, 1, -1, 0, 0, 2, 2, 2, -1, 0, -2, 1, 1, 1, -2, 2, 0, -1, 2, 1, 0, 0, -1, 1, 0, -1, -1, 2, 2, -1, -1, 0, 2, 2, 0, 1, 0, 2, -1, 0, 0, -2, 0, 1, 0, 2, 1, 0, 1, 0, -2, 2, 2, 0, -2, 1, 0, 1, 1, 1, -2, 2, 0, 2, -1, -2, -2, 1, -2, -1, 1, 1, -2, 0, 0, 2, 0, 2, -2, 1, 1, -1, 2, 0, -1, -1, 2, -1, -2, -2, -1, 1, 1, -1, 1, -2, -1, -1, 0, 1, -1, -2, 0, -2, 2, 0, 0, 0, -1, -1, -1, 0, 2, 2, -1, 1, 0, -1, -1, 1, 0, 2, 0, 1, -2, -2, 1]] - -s1Hat: [[5795647, 3150302, 5761214, 72796, 2266350, 6924562, 6191710, 4214634, 1336751, 4238696, 7592796, 2159125, 5848504, 4844318, 6573695, 6686111, 8357433, 835445, 157395, 7303916, 6588758, 837730, 843272, 3312442, 5643095, 4080364, 4048366, 40873, 6396702, 4747670, 1570463, 2326475, 6561750, 8025716, 5633476, 4483686, 1462341, 8359766, 6737641, 1956744, 3404848, 488982, 5751175, 6906454, 594413, 8363428, 4389333, 69269, 3815336, 1348627, 8373909, 8365022, 3482251, 7041865, 7306425, 1550567, 1882569, 1912996, 4143590, 5074495, 1167162, 3102841, 7989002, 8149533, 965003, 3366442, 3684153, 1175633, 4883063, 3718574, 6246334, 419135, 6753720, 8152352, 8291950, 6602975, 17937, 4220092, 3027474, 5379264, 2275, 4097168, 2107701, 3391767, 5314207, 901476, 6010766, 5729071, 3941058, 3815443, 8116932, 1738505, 7047820, 1162479, 8072637, 6611116, 119081, 1003931, 164033, 8007953, 5333731, 1003603, 4807358, 1249177, 7575880, 450378, 6591435, 7369346, 3775550, 6506459, 5340081, 6999878, 7190151, 5226240, 6058982, 4368572, 4138180, 7381248, 8267598, 7793721, 5114279, 3283739, 2251895, 31698, 3922389, 6263873, 4184574, 2427319, 7835643, 4506324, 127266, 3526243, 341269, 650594, 5224491, 7269124, 6417481, 334377, 616254, 7992832, 6154385, 3077993, 4950088, 2362844, 1886191, 3040677, 2510860, 4119625, 2085030, 4844539, 2904940, 5945485, 4467886, 4119194, 2582006, 7176134, 1280915, 31882, 6730022, 744177, 2428141, 2200455, 6888105, 2288192, 3562211, 1551121, 5633473, 6685202, 2707345, 2233115, 5824472, 77656, 523169, 1414621, 3560903, 2469298, 5009442, 7898198, 429315, 7750314, 6367769, 4612983, 3327000, 2340908, 6568536, 6827196, 3399524, 7024260, 1375254, 5830403, 2319527, 3958281, 180585, 4394514, 2005930, 3666266, 5734950, 1688091, 4629570, 1305699, 4499339, 6296001, 4961620, 1882644, 2512083, 6741794, 827858, 1385426, 7712054, 712049, 328281, 6091668, 1355595, 2707459, 5816135, 36351, 5821274, 1804511, 6819135, 6253963, 7284305, 3071199, 2912600, 200908, 4689401, 1908853, 2322028, 4586006, 7818432, 6550217, 8120410, 2352478, 7213643, 1872281, 5294908, 7478978, 2193154, 2795257, 1499615, 1611547, 5515853, 6449513, 2335204, 3381388, 7342801, 164336, 6575088, 4012267, 8253357, 1915394, 6062895, 2950942, 5508741, 4385532, 3180426, 818743], -[7151875, 1460286, 3779147, 2797845, 4811306, 5419464, 6753226, 5694248, 2370198, 1786178, 931182, 7859667, 4212058, 1252827, 7958658, 1353091, 4208922, 4421226, 2746249, 4722939, 7755899, 4959990, 965729, 6519033, 3659620, 5159830, 6887304, 4009839, 1618838, 3429110, 4010083, 2883381, 5682293, 7114304, 8187150, 6030738, 6272538, 1801148, 7770281, 6220736, 6067318, 688099, 677184, 7548805, 2791915, 5556038, 7971323, 3794919, 7032458, 5825575, 4548090, 4995366, 2994003, 213799, 5634793, 2760494, 4801623, 4185089, 7725355, 4477619, 4494551, 2172618, 7718530, 6066283, 2144979, 7244906, 4148645, 713253, 6202226, 6222332, 6029876, 7831357, 6023837, 1308989, 7736208, 6539395, 1099109, 4187155, 364971, 3117229, 7409649, 4102620, 7357000, 3265697, 8089895, 4385210, 6246408, 7538926, 3462686, 2208874, 1368532, 5892036, 3946331, 3694260, 7208729, 817649, 1924077, 4256761, 2689823, 4165659, 900897, 6815584, 5327960, 4232581, 2277362, 3516382, 2494122, 546984, 1506704, 4063012, 2418940, 7495887, 871147, 5007958, 5369712, 6956562, 5521691, 1918109, 8366343, 1195651, 3514248, 846301, 5116585, 2975539, 2144316, 7622382, 6159253, 6692053, 1086452, 2052779, 8299643, 1160535, 1328966, 7427487, 4180778, 7718281, 185624, 2672762, 900197, 4636933, 4743192, 5325988, 5083166, 3213145, 2489648, 3807530, 3198620, 1029556, 1187414, 7984371, 8106531, 6186659, 296074, 3776452, 5632802, 5457021, 917438, 1935963, 1106681, 5121716, 5208847, 8188872, 7691062, 1216545, 8312888, 5129642, 4664147, 2989029, 88805, 3960967, 558279, 7079551, 8034422, 8306258, 6492685, 779099, 5719596, 1258639, 6852737, 4645572, 1550886, 1772755, 7676385, 295344, 1434580, 4308662, 1117011, 5379707, 2183429, 6827463, 3081078, 4353259, 6870390, 3228048, 2506658, 1359078, 789929, 3937603, 2346512, 5293653, 3775686, 6009227, 6089431, 2388938, 96981, 7919616, 5647575, 1362269, 4205221, 925980, 4139068, 2840967, 1148588, 6517475, 6164119, 2794406, 6208963, 7039692, 7639253, 4342331, 429917, 5224776, 5446088, 291586, 641054, 1881035, 446264, 3898200, 6589430, 6061339, 3754558, 6745543, 7046183, 5474018, 7447495, 5101052, 2821590, 5992416, 3866877, 5765950, 1596148, 7417539, 1430171, 5847174, 8349914, 697355, 3460737, 2294578, 3626548, 7912444, 5221528, 6085186, 3238008, 4173425, 4917828, 3073901], -[5165910, 7508523, 6136157, 7092897, 1989069, 5382216, 4537391, 7269969, 61242, 7729887, 2235094, 4825796, 1463414, 5391268, 7043218, 2056267, 4616504, 1333028, 2880498, 5343036, 4323425, 1190874, 6144562, 6417547, 1067841, 3085417, 3815701, 5988306, 8041686, 4181803, 6164865, 3594826, 4882806, 6916121, 3501199, 3563633, 7510370, 8108, 1777842, 2982607, 5095312, 4167266, 4465534, 7963731, 4141136, 3860294, 5313402, 4505358, 4987184, 5383760, 8027012, 5017245, 778248, 170575, 3380103, 2499811, 7443783, 6401947, 6404624, 924632, 2848401, 734228, 8195474, 324676, 2133477, 7902597, 6332337, 6059523, 4501988, 95105, 1553797, 337931, 5253085, 1645715, 5995282, 1238538, 1998690, 2765405, 1094983, 6263371, 4035926, 6292372, 8320046, 8012173, 1119137, 1898875, 5529768, 390697, 1266807, 6756123, 544335, 6591132, 1689751, 2141708, 5458817, 407063, 6093385, 7091704, 5794026, 1624416, 6634659, 6014887, 2068641, 5014960, 4902572, 384896, 7398651, 7470390, 4215288, 1418897, 7743411, 7483555, 5712419, 6342296, 3514360, 5654700, 2168407, 806193, 8046287, 6786917, 3470178, 7919698, 3117736, 8249459, 1106705, 134851, 8315549, 1824190, 5341004, 5384861, 2377042, 3764106, 3781293, 7232654, 5804693, 2570019, 5187771, 3291296, 1053566, 5390852, 1806844, 4176210, 1031824, 8037171, 1102287, 4549996, 1682869, 4086803, 2207521, 1476853, 6155709, 6021544, 527068, 6021873, 3420479, 3791561, 4564909, 6884226, 2297416, 1001014, 3456304, 7978168, 7864081, 6474704, 7294567, 189002, 6730217, 3844279, 5216942, 5246428, 1344024, 139635, 6787779, 5089428, 512388, 7568327, 2201671, 2612616, 3792887, 7967057, 4251140, 7612127, 3697913, 5951767, 5829773, 6842557, 7771544, 7174683, 4272439, 2821249, 740958, 3276280, 4691924, 4523318, 8291494, 1114377, 942976, 5930280, 6392889, 129435, 7493961, 7394628, 5811217, 8048889, 3454984, 5598482, 1823487, 6356935, 2428931, 2982560, 7522215, 4855245, 6180155, 7365317, 3477330, 4305342, 2715920, 5428577, 6688879, 6910687, 6007482, 6538858, 3581829, 4143429, 866402, 3662964, 3341130, 2942034, 4964150, 2376352, 7649915, 8237162, 3944038, 4736098, 6277242, 7393356, 2299012, 1211658, 6331808, 7544530, 3486398, 2180438, 1240594, 119391, 8373658, 2098556, 6702493, 2279223, 2636458, 1633123, 1366292, 624488, 4723119, 2743833, 4712575, 5402758], -[7026961, 2185768, 771806, 2120769, 3125969, 4544875, 5402957, 8030344, 7563176, 7342287, 2150838, 601073, 2617396, 4125810, 7853309, 6589193, 8959, 3712147, 3358323, 4776550, 7016772, 2964318, 7010311, 1660424, 7734119, 3365715, 5173906, 486936, 5594242, 969764, 2021290, 6996729, 5060171, 6697597, 6758739, 4889942, 6986108, 6361676, 6904128, 4594704, 7799568, 1539724, 2911783, 1103743, 2880017, 2045171, 1348006, 1504456, 7285949, 340418, 741003, 5908881, 1095654, 1463671, 7603542, 4091705, 1585982, 71557, 3623030, 3216250, 4259381, 5235021, 520420, 675712, 6629205, 1949355, 3470421, 6290423, 7451369, 4690422, 5284380, 4515335, 5935319, 153859, 4893579, 5340490, 4700627, 3909859, 7278600, 2837372, 2912009, 6293666, 8295140, 7236660, 2423974, 2085137, 2593864, 279419, 5167864, 6303428, 7487194, 761023, 6199022, 4479322, 5657905, 3128634, 1937528, 460640, 1248529, 1302242, 6746045, 6566765, 8285194, 2194889, 6972238, 6175678, 7870543, 6145773, 5043305, 5400229, 4630279, 6540563, 5930843, 7020425, 5595285, 5047063, 1781759, 6928296, 1338247, 5591596, 2741032, 2636007, 2345111, 190488, 2601299, 5756273, 5213801, 4168872, 4267666, 6921630, 6784253, 2751398, 6484197, 5662911, 2528542, 1508946, 329989, 6175241, 7748090, 3001740, 9818, 6329820, 775880, 2877728, 3084025, 7647566, 3684286, 7604994, 7996268, 2241346, 749932, 4171599, 5592726, 816871, 7574647, 2406175, 7382081, 1709372, 4000657, 3201538, 2550042, 5568818, 3842756, 7659492, 1716586, 5342806, 5887976, 2797303, 3126430, 7135256, 8309606, 8149823, 5957802, 6431071, 2712321, 8349006, 1919608, 1644339, 5554624, 5584696, 3485605, 2877607, 2967940, 2309440, 4109165, 2604769, 8195600, 6453514, 1424412, 2981345, 5812857, 3079824, 4769177, 2392579, 6894709, 211496, 1737234, 7559766, 3944753, 3951976, 7904260, 4422540, 685409, 1764823, 4526123, 6230055, 1443615, 6542238, 2207956, 2487931, 1534268, 984098, 2352007, 624699, 2864845, 1598074, 5669258, 4207264, 3516109, 867375, 2270006, 7192518, 8327083, 6000744, 775704, 4197481, 4063685, 7415846, 5358554, 3110982, 1431613, 2740900, 8056811, 7823520, 1825369, 3186987, 7456629, 4327904, 7223114, 1310325, 7467346, 4488442, 4311034, 8358601, 7543833, 2927441, 1133996, 2729071, 2477822, 944967, 5969230, 503031, 3554560, 7330726, 3495026, 8234914], -[6566183, 901367, 2269152, 8292510, 1269082, 7261436, 5166259, 1844722, 3308544, 2302256, 1847468, 3412069, 4618800, 3783586, 589875, 3149388, 1493546, 3054257, 3587331, 4242579, 5566465, 4004656, 3907398, 3386721, 7951057, 3703483, 5433244, 729306, 4447645, 938700, 8181275, 3941198, 2772777, 4605282, 264408, 7611068, 2332180, 7379542, 2644429, 553541, 4829457, 3074836, 5249797, 4422426, 7568354, 2154788, 1431233, 4658516, 4330003, 7852314, 210629, 6169362, 3661390, 6549808, 625479, 6925257, 1058095, 6186815, 2920319, 5391179, 2377458, 4425075, 4006271, 6336568, 3181977, 1064531, 1109405, 4701303, 3674475, 6826404, 1070590, 5406092, 7557045, 1687647, 2182774, 5416564, 5715716, 1950187, 3372938, 5526493, 513838, 6454315, 2690288, 3817220, 2739903, 6356034, 5738195, 2804915, 1740419, 962179, 5224932, 2467224, 7933513, 2189779, 4019734, 5493399, 6497170, 7177221, 2081757, 3905860, 5965021, 1660417, 7859251, 2179465, 7837722, 3253249, 4927275, 707373, 1730562, 479222, 7603177, 2079727, 6099948, 5658629, 5679252, 8242212, 7953675, 8009643, 6832543, 7249526, 724568, 3871205, 2124720, 2877659, 3617522, 592087, 3959253, 3150182, 6948062, 8347087, 1965646, 6855942, 2541747, 8214023, 7012450, 4844515, 6545379, 988839, 5348637, 5031618, 7026672, 4898913, 5268636, 57317, 1834392, 3575704, 6358870, 2722534, 5033800, 2466890, 1694408, 3502678, 2822948, 6723141, 6884537, 113724, 7482520, 2363175, 6769809, 8353865, 3631863, 5416185, 5865219, 6645725, 3066837, 5758482, 5052706, 4060678, 3902119, 2067721, 2334366, 73892, 4741400, 7103102, 6763010, 6798453, 6691505, 7372247, 2323302, 7330471, 8283747, 4232468, 6900784, 7280079, 3656169, 3088254, 8326620, 2954741, 8259674, 2307723, 3115399, 7806089, 5029624, 2946674, 7252704, 79025, 1346054, 1761752, 7400208, 467759, 6512935, 4410084, 3894827, 4689142, 5825154, 2713021, 7233580, 716227, 2605578, 6738749, 1384755, 2238191, 4384765, 8220875, 1866511, 6521235, 1375746, 2204286, 2984798, 3870519, 4402200, 6386181, 3729308, 8154795, 5591355, 6797872, 995958, 8338378, 5071538, 828690, 4608292, 372849, 432738, 7243132, 349202, 3505243, 528166, 2451964, 6504081, 3021087, 2919609, 788626, 6206825, 6360312, 4725916, 7957732, 5773545, 158962, 1084093, 4301838, 6472987, 6597182, 7933776, 2686475, 3254157, 6527269], -[4754400, 7297762, 1784184, 6577486, 901234, 3072649, 703734, 7142635, 6446904, 3978792, 1105978, 3460331, 328804, 4577883, 3789043, 1898530, 3246250, 1042023, 3543636, 3957541, 7246236, 706371, 6892937, 3442473, 6470, 6476042, 5211050, 6068272, 2098371, 6194879, 5422825, 2785782, 6132251, 4025838, 1498267, 5174312, 4850092, 4513768, 7723416, 6320191, 6828666, 1053379, 5740083, 2732436, 4328266, 1090238, 8347562, 7680568, 4570507, 2508104, 2502792, 7564902, 7639953, 3814116, 1041569, 7883164, 756249, 980071, 5594204, 693709, 3013934, 1961412, 7118020, 7384486, 1501117, 841099, 6818372, 2566942, 7220439, 5917103, 284079, 2459215, 7228428, 5176490, 6975454, 6079804, 2360216, 8058737, 5998455, 5059168, 5996385, 334917, 7250820, 391852, 3588934, 6138841, 4844744, 2541107, 1888105, 1780039, 7591768, 5703902, 4101594, 8282029, 843955, 7076446, 3675124, 1680432, 3253870, 5992913, 2951215, 2309858, 1197461, 3677159, 2375261, 4249435, 7993489, 4225831, 4322946, 2778853, 8072543, 5906409, 2418286, 2337160, 3531001, 1809944, 5086548, 1472920, 6120185, 2055130, 1870572, 6705124, 4261897, 6391245, 1167475, 142302, 1191884, 7589704, 293598, 1616521, 1863033, 1721361, 6362952, 1225806, 98811, 771108, 4943597, 4839603, 1438462, 5587494, 1719379, 515749, 2907436, 7695303, 8374642, 6807899, 2486959, 1391218, 6684534, 7536216, 7483032, 7411894, 2146027, 2062870, 8162450, 4435464, 6817738, 7580243, 6840705, 2917539, 7330450, 2707496, 6303219, 4107425, 943576, 8197060, 4434915, 1484207, 7482421, 3340948, 1746452, 1869957, 6757580, 2692360, 2707082, 6113317, 6755377, 6570807, 2336775, 1121018, 6868684, 7396036, 2105089, 6474261, 1200049, 194792, 2771268, 5929346, 5332695, 5391695, 167409, 4940274, 687476, 1353871, 1388817, 2898827, 4701431, 1067596, 4214096, 3066917, 5649900, 1590503, 6469683, 1398442, 2626668, 3558511, 2698313, 129431, 548579, 2463421, 5218934, 1869677, 4868108, 3343788, 7233175, 1311666, 7751777, 8297024, 7018583, 4902429, 8271601, 19671, 4844348, 5130145, 7805231, 8158353, 723817, 6111363, 1934882, 8172456, 5308646, 2439491, 1179394, 7556971, 7103189, 6605937, 7402526, 8206821, 7077839, 5352934, 420546, 5344376, 4141843, 5792143, 5997639, 5607885, 1679502, 8258754, 7857810, 4211555, 1728944, 6051236, 6515486, 1446972, 2348475, 4100761], -[4180256, 4430151, 2666320, 2063999, 3793431, 5042253, 4874051, 2908133, 3076555, 4839220, 7731176, 1748073, 3869518, 7461708, 444401, 8003022, 7652106, 7110979, 7306248, 309481, 7532431, 904459, 6853198, 1746848, 7971138, 1030445, 6348084, 2817255, 2569892, 6887987, 3075307, 6905165, 1829540, 7788168, 2361658, 2627737, 7452687, 2582402, 6369817, 7012970, 4231620, 4879563, 2196506, 115709, 750309, 6683681, 81279, 2467820, 6788999, 7276340, 6228591, 2371105, 3647487, 7098409, 3099116, 1532937, 900184, 1400246, 4075463, 6691598, 388408, 2802168, 4116545, 8315613, 3360274, 5403976, 6061133, 7856581, 2490199, 4081204, 8352901, 1247142, 5861748, 6847822, 1497612, 7288780, 1985562, 3204272, 7223782, 7139080, 6921679, 789868, 2353548, 3804159, 3404916, 5032412, 640182, 4019974, 1948087, 2245937, 7282954, 5498097, 3512955, 3974950, 1272959, 5346825, 688356, 2174310, 4639633, 3243152, 5999016, 5585961, 1568902, 3038709, 1170324, 4843198, 7062800, 471085, 5065362, 8140006, 4764303, 2980249, 2928108, 2714172, 3496555, 62834, 8000094, 4248362, 5657930, 3146768, 7963983, 4630848, 3303687, 5208522, 2678793, 3361654, 4023423, 6239433, 5049228, 6236682, 2044478, 3317147, 1971873, 684430, 3054978, 2258802, 4597204, 1510693, 4025531, 5081994, 3237172, 7438322, 2338501, 2243880, 4784011, 6754986, 3565544, 4757548, 185560, 1342875, 153027, 7969158, 7190555, 2217310, 706039, 5807232, 6723928, 7993995, 688043, 6774150, 313778, 4136987, 234085, 1068687, 3998044, 6265263, 3266286, 190253, 1557745, 6495130, 1859939, 6627746, 4847265, 937921, 1643988, 7479434, 7636005, 7690048, 678976, 5100305, 1272390, 2886631, 7860728, 4794748, 4287807, 6849071, 4622017, 6233667, 877935, 8223736, 6053379, 4624674, 7702858, 848981, 4836966, 3056477, 7559380, 100050, 5351493, 1462561, 5335426, 7528987, 6458902, 6557191, 4134163, 1061770, 5244219, 8366185, 6442328, 1136862, 4806844, 7219692, 637760, 2577205, 612586, 2119869, 3128725, 5394960, 6063875, 4317098, 7877548, 5463281, 7284286, 935179, 7618540, 2359366, 1144281, 5719589, 3272742, 5723623, 5763522, 886167, 3620419, 5644406, 2737553, 6451695, 7239177, 5588810, 83997, 4391023, 3648013, 2068894, 1402083, 4561848, 1244021, 5015440, 6895509, 8009243, 6745434, 3144483, 4597973, 2344958, 4901968, 7038808, 980775, 1154769]] -aHat * s1Hat: [[8245964, 3625183, 3907468, 1685519, 2157647, 5362673, 5257729, 6171207, 5107407, 351925, 563434, 3807257, 7296681, 5906750, 2786173, 6594600, 2492252, 2616910, 1332168, 3008716, 3761219, 532908, 1692959, 1189134, 4801545, 7940227, 6798233, 7682383, 2194640, 5301200, 3815418, 2846737, 6344554, 4890285, 4768514, 5950651, 4488235, 4378288, 3825488, 4155023, 3431869, 1957667, 3144579, 7237126, 838028, 4195458, 625180, 155554, 5307678, 4947387, 1887486, 4635331, 3622887, 7569181, 3396116, 2179813, 6996631, 4252077, 2920831, 8377855, 7186373, 7622837, 14005, 6608758, 4499036, 3035172, 1234337, 7254380, 5105299, 148408, 6005161, 3432080, 13639, 2003384, 5769463, 5858572, 3857889, 813189, 3715140, 1475753, 6944958, 3544071, 724560, 104908, 7296815, 6067741, 1383606, 4129722, 907532, 1403293, 755174, 4398644, 5230183, 8066317, 2105592, 5575801, 1645449, 7565416, 5657156, 7550370, 4108611, 7534569, 896362, 4765719, 3221190, 613572, 2092690, 792254, 4309606, 5509641, 6336741, 641397, 6686490, 3419670, 6878267, 3607956, 1993871, 2957681, 5678862, 481815, 4170642, 7994150, 4853036, 7795358, 7407786, 5727510, 921246, 3413862, 2937336, 2046037, 7689675, 1728994, 1171872, 3292917, 6974300, 3360533, 7093990, 4786257, 3524684, 7951506, 1900547, 226314, 2597794, 5413871, 303160, 65829, 3648276, 2861087, 7300694, 877131, 7693614, 6194507, 5566740, 5278074, 528911, 7291501, 7893689, 7724012, 1667383, 280795, 7728098, 7265318, 4230753, 2174001, 6241165, 5755690, 662207, 7048442, 7647728, 632097, 8272440, 5133894, 3984322, 6871442, 2245913, 2041098, 6224492, 6799104, 5132700, 2972312, 1925503, 7623937, 7158503, 605114, 299539, 7438859, 5048818, 5491804, 5246430, 2023735, 4460221, 5647008, 3746400, 3177830, 6624184, 3053185, 5056865, 5316026, 2710083, 4362380, 1274393, 1268610, 2785680, 6875187, 3106891, 5830736, 3946591, 3291432, 6204471, 1074766, 2474591, 652928, 5931895, 3227532, 3474876, 498899, 7075396, 2781731, 7647885, 4273539, 6715984, 2597718, 7208169, 4233331, 2430566, 5984397, 4658665, 3834807, 4404187, 8156040, 6115137, 1258427, 6403704, 1627989, 766815, 7219507, 4590834, 4447176, 3968407, 4973019, 309406, 3567447, 6504506, 3942900, 7650186, 2030157, 2719629, 7781989, 5492568, 7847443, 438690, 1799522, 7766241, 2070949, 2323682, 2168258], -[2276159, 7337188, 7586299, 1787140, 3908649, 545777, 2049367, 3038981, 7118485, 8049766, 3621486, 863391, 2890554, 8668, 2004767, 838845, 3519926, 7626474, 4487058, 1877858, 5438558, 4443113, 2213278, 2577367, 2472824, 7989757, 323915, 2067342, 689365, 6437828, 7664897, 3232184, 7687090, 4028748, 547044, 4704213, 5822532, 642108, 76151, 3360900, 3550282, 369793, 8008028, 949558, 422200, 2015146, 5647564, 2712923, 3137759, 3803542, 4545506, 4419047, 6325528, 5478185, 2023085, 1597865, 3136371, 6585062, 3641668, 3656929, 8296496, 683795, 4020542, 3799299, 6746421, 487706, 4078763, 1841217, 2052239, 3294664, 5614684, 4537948, 3454756, 2168993, 4279061, 6136104, 5582916, 4729069, 7158419, 4862471, 2414460, 6159770, 2705229, 2135192, 2406554, 5547228, 720339, 2640422, 2067456, 7598260, 3402465, 3904070, 3656843, 3835479, 34973, 3085199, 7526706, 2035372, 2219468, 4748143, 1381422, 4439553, 5685324, 4495798, 2597174, 7052621, 5068914, 5574572, 60906, 5468916, 1160524, 4618599, 5066661, 4772704, 3003260, 571673, 1703480, 1764067, 7954421, 8032087, 3537220, 1585356, 3553725, 6832607, 983342, 8223523, 3497496, 7030471, 2588688, 6002926, 1361561, 3309053, 5198678, 5009855, 1475913, 2201133, 7545881, 1844850, 6708293, 6770034, 8218179, 1093183, 610981, 7197954, 6100172, 4325531, 1506581, 6590367, 8224328, 7909921, 5458884, 6975777, 3586841, 5247965, 1363414, 1083518, 6604031, 7535781, 5315957, 6035961, 1010799, 7173530, 6280418, 2732687, 7000718, 6843504, 3819165, 3129894, 3990850, 4423185, 3884946, 1265442, 1134864, 209917, 124520, 6242239, 7047350, 1555616, 4919468, 3724921, 6692055, 7053549, 7221878, 6599746, 2574954, 2753624, 7643035, 5448214, 884490, 1898717, 1945606, 6780368, 7208197, 7920212, 5295447, 7298616, 1723790, 5949675, 659581, 286231, 242283, 3867257, 6365761, 2088174, 1445826, 4454046, 2538009, 3781371, 7812249, 6704886, 516014, 1595300, 7219271, 6771979, 1502289, 3920812, 4309438, 4054168, 6513125, 5469848, 5538949, 5833539, 1789947, 4980513, 2528293, 1810810, 1037523, 7883135, 6412161, 7929664, 7408191, 7861128, 4646238, 5166485, 5144583, 5739762, 1731372, 1466201, 7977220, 6977699, 4315207, 6992200, 3280984, 5671110, 3402538, 2194984, 6694420, 1810473, 3368645, 776298, 140395, 8302754, 910760, 7977249, 2754154, 16598], -[4991109, 3907269, 586589, 6062954, 5753798, 6665990, 2325849, 372455, 8129687, 8363465, 485795, 5114757, 3691818, 7015920, 7093902, 2278483, 1844223, 3144846, 4600075, 4648783, 3793584, 8336172, 2638458, 1399586, 1351204, 3117814, 8280391, 1791423, 8127379, 7589341, 8293223, 8052991, 2334753, 7173943, 6817190, 7010520, 4991921, 6107706, 8163810, 8209566, 2898646, 3923926, 805658, 7173080, 1901129, 4125547, 1361100, 8028091, 3052046, 2607267, 4234556, 8235642, 1031668, 2637180, 3884331, 8100271, 143325, 1848130, 7247915, 7050356, 6072792, 2505962, 4092440, 156283, 1152252, 2393534, 7223927, 2366306, 545909, 4299631, 782331, 1034687, 1980812, 5249753, 556308, 1238002, 7057210, 2591644, 3158575, 3999497, 6794899, 7923163, 1115246, 6795917, 7213380, 1997756, 1003253, 7044832, 7235083, 3845331, 1556166, 1548960, 3224966, 3832645, 6722952, 2419642, 6380838, 856583, 2904551, 5648453, 4526977, 6917330, 5179571, 5487868, 941635, 5648215, 6015115, 7900977, 4749206, 7954437, 4336955, 2098228, 6153691, 7019705, 4296287, 4997305, 1188789, 3895069, 40517, 114951, 2599255, 153477, 5556945, 1812593, 4021191, 1859661, 4175545, 3167381, 918395, 2360055, 3444553, 361874, 3062366, 6763889, 2445704, 68750, 7632663, 786904, 4685835, 8002456, 4192729, 5760888, 3366498, 5797990, 8357651, 5535316, 4388336, 4030798, 7967781, 4660529, 3852506, 8143424, 4752292, 307952, 1493754, 7510188, 6495932, 5075563, 3053488, 4386769, 2694573, 4902252, 1203625, 3795235, 3620718, 1573628, 5202970, 3235236, 7808439, 420447, 4759778, 6267380, 3915950, 5567276, 3964599, 6007864, 1533852, 2145561, 5937883, 3822215, 2135474, 2910518, 6008247, 7843690, 3912393, 5179193, 3327863, 4822621, 3958872, 7574701, 7768760, 7574791, 3200335, 1322185, 7808170, 3521928, 268088, 3538276, 3966494, 6382985, 5122424, 4214990, 96730, 6419390, 7975222, 4321889, 1929328, 5721006, 8269034, 4203033, 879215, 3642131, 6886777, 6973960, 5503982, 6560604, 8078468, 6064736, 1296181, 141610, 1668970, 2440517, 8149265, 1619975, 5220839, 5051546, 7150628, 7648019, 7937522, 7036941, 5221363, 1274376, 5464561, 4922638, 4091644, 6841757, 7482052, 5598009, 2175838, 6849784, 4035430, 6846295, 2866898, 4190656, 646574, 7172848, 7414881, 343399, 4619800, 6182378, 5949963, 7954224, 6553973, 5662394, 462421, 3556002], -[6885229, 4604296, 4725779, 2429067, 7812135, 380345, 8144350, 4550488, 7683444, 2086316, 2687, 6311051, 8316591, 1134905, 764565, 5965465, 6096109, 2136053, 4249748, 5942633, 5040916, 4648845, 3378470, 2106526, 7311439, 4691062, 1943901, 2329109, 7407017, 3336754, 4116615, 2324171, 5787420, 6245768, 6940518, 1806521, 4836623, 5040965, 883996, 3044132, 2422638, 3690199, 1944031, 1095242, 4762435, 8043835, 5176778, 8133846, 3108939, 2196233, 2403452, 2563390, 6406667, 1004317, 2416541, 4054499, 5203998, 1217022, 1006446, 6539396, 5007197, 4749712, 6343622, 6158592, 2948892, 6314352, 1130287, 5756795, 4443848, 4725217, 1483542, 2678874, 6177845, 2545886, 1601222, 6831460, 4268242, 5032608, 7410926, 4422064, 3635043, 6498332, 7439468, 1988693, 166147, 1975268, 4167725, 634461, 1681447, 698987, 3181162, 2464223, 2795038, 8361682, 315619, 849219, 6138490, 8275051, 7358116, 3260647, 5009084, 6952680, 1537825, 90492, 1704264, 3324205, 365698, 4467358, 2935585, 6456283, 7880360, 1027256, 3746689, 3470222, 6022313, 5885309, 3310149, 2261937, 1888501, 3410214, 5217319, 6353683, 19561, 175946, 6586044, 1239123, 7630473, 1544082, 5030992, 1271255, 2412908, 7272448, 6085293, 3699425, 1346869, 4567239, 6603363, 7437647, 8051205, 6198399, 2992771, 494267, 863409, 4319333, 7435145, 1659691, 8030517, 2024218, 4901705, 2207429, 6586284, 7616882, 7441010, 3289095, 625404, 7950444, 8192916, 953325, 4227443, 2235130, 3601894, 1472373, 3762825, 1843988, 2623755, 6933981, 1990059, 6013913, 2341931, 4898857, 7203767, 5703364, 3242653, 579501, 6216902, 4404254, 5972157, 2789349, 3036287, 7498883, 2573728, 4635267, 3958520, 3791197, 5879884, 3387420, 3019258, 3044993, 4662605, 6423405, 3314996, 1100949, 3300593, 6324299, 3085266, 2904123, 874866, 514363, 5288300, 5344759, 4126887, 3203708, 1640490, 1451254, 2400453, 5283239, 6404715, 2064020, 6680582, 2151818, 499872, 4099524, 591246, 1586715, 6550928, 4998606, 3814765, 1335363, 6890397, 3032373, 1676916, 5704296, 3448102, 7531013, 769797, 7126549, 1168981, 5373293, 2219241, 2748691, 6523648, 1503228, 7002418, 2782148, 3238674, 5674031, 7947886, 5019923, 4146208, 4618195, 6881494, 4760476, 6893418, 6827137, 1887253, 6167450, 3599759, 769058, 3643769, 7443716, 7493680, 6311505, 869719, 7528635, 2952595, 4490408], -[4747136, 389335, 7662797, 8117388, 3835580, 5384398, 7216539, 6907247, 6534651, 6490049, 1133453, 3985816, 812389, 3122916, 639849, 3210115, 2992278, 7827360, 6684258, 2831831, 906820, 6957251, 5707498, 4166826, 5115465, 8185903, 5050388, 464927, 414211, 1136285, 7096179, 293112, 1766115, 5272589, 6261178, 1603539, 2554331, 3644222, 4246274, 1219534, 1359851, 4526458, 4044910, 3428955, 4887145, 3732089, 7293540, 1957697, 1908860, 8042769, 5820248, 6896171, 496268, 1725052, 6201560, 6388088, 5190711, 425849, 1954089, 7795276, 4267056, 1036266, 4405729, 3501756, 6391537, 5538072, 7008013, 5624044, 1413123, 50506, 2553152, 3770224, 7721336, 8262724, 44262, 5485051, 6560093, 1339247, 7979747, 1800314, 4057885, 7179653, 5378561, 368222, 3461584, 2691961, 4619154, 2881683, 6163629, 4429959, 4243472, 3173397, 955752, 3342651, 656202, 259825, 38479, 7787834, 3748902, 5105735, 5986747, 401379, 465231, 6485270, 1222118, 1892947, 1079554, 33707, 3945770, 4151990, 294734, 3399847, 7845738, 330230, 157876, 1002743, 1542329, 1524041, 7659848, 5655461, 4340192, 4821737, 2162039, 3840571, 2280487, 5007058, 1456103, 4978571, 4633290, 4297101, 5463076, 2753348, 7911684, 6763800, 7171432, 5399191, 2797666, 6429587, 2562121, 4825074, 474038, 693987, 3116924, 6206716, 8140596, 2317498, 8310582, 4264907, 48040, 2761671, 4015777, 1884047, 641, 1516145, 183276, 7535185, 5499674, 3728792, 7800823, 8248651, 6679594, 5448051, 5968460, 4339821, 2965031, 5968707, 6063982, 3922299, 5296633, 4793893, 7579410, 1746278, 6296392, 139452, 1524820, 635563, 2210092, 4853425, 6083559, 6241651, 1595166, 2656435, 6568541, 7340894, 2486640, 5659987, 5771710, 5599572, 3789803, 1654350, 6184559, 1915649, 6468973, 4913402, 5342900, 1594436, 3908292, 1750622, 5475897, 725917, 4796998, 5173311, 7211384, 5489244, 4172936, 5791992, 804989, 1334329, 3520930, 8229557, 6185493, 1517540, 4016298, 4944674, 181338, 7249524, 6660233, 4194026, 3487746, 4050994, 1727733, 5790994, 6088657, 7407568, 3615986, 1374034, 6861027, 4012296, 4795074, 6351953, 7709670, 3869077, 7052380, 711215, 5261529, 989706, 3354103, 5291294, 5270686, 2543272, 5664362, 3855999, 7901454, 4671320, 7477129, 7694737, 900417, 4963190, 854482, 811429, 4560251, 1803156, 7201326, 4833805, 6429765, 1169112], -[4556891, 1824098, 239439, 3819970, 5659273, 385399, 2765989, 7797397, 3120677, 2962941, 209788, 2050857, 2322757, 1951173, 7659775, 1420146, 4947465, 2001984, 6678087, 8231520, 6029242, 5070664, 5422470, 3124475, 1156679, 1658010, 6178254, 2524959, 360715, 8044560, 7471404, 8096601, 7198975, 7317818, 4884801, 8349917, 7727081, 7071105, 6540580, 294259, 7230696, 1377339, 7015690, 3169802, 8275058, 4543649, 5491438, 3827986, 2856872, 3238620, 822501, 2500841, 32380, 6753682, 8368780, 6850127, 2750498, 7010748, 2149658, 7668401, 3066620, 1441847, 3954301, 7637228, 3507730, 6836831, 3044836, 1260484, 1966495, 3634327, 1328584, 7899229, 4114852, 4127609, 6078337, 4141401, 1872302, 4076357, 2422543, 4223252, 4163248, 1610441, 3103341, 1188354, 4944210, 5786850, 1342238, 195142, 7051530, 3695129, 1614274, 5882180, 2410933, 3371091, 1487553, 4087442, 4290164, 4415504, 1428707, 2412315, 4396642, 8264903, 4514750, 4730623, 4108948, 5042719, 1663374, 6718756, 8083005, 8056364, 355593, 7650601, 5240967, 2049482, 7760859, 6263560, 6490057, 1119636, 7855203, 1648559, 3409023, 3237821, 7865019, 3278566, 637042, 4527028, 4873133, 4286538, 2427005, 4742331, 2686196, 2552718, 6849666, 294041, 4909396, 5364221, 4376302, 915267, 1541302, 5319115, 4224260, 2880649, 6599216, 6837847, 7104952, 5059263, 1792855, 132592, 122871, 4262755, 7771486, 2558697, 5075260, 1430517, 7867445, 174191, 5748413, 6381600, 7050066, 3049672, 2746287, 2731080, 8114209, 4969274, 872309, 1270690, 1653782, 1643803, 8019820, 3825467, 2974292, 4741018, 5441311, 1071985, 5228666, 713894, 5802960, 1723788, 6173189, 2727848, 3862266, 4331710, 1881961, 6007975, 4699287, 5821479, 4675629, 1035175, 4033134, 6029199, 6236405, 2302870, 6989361, 6985727, 110264, 6925945, 5834418, 1351925, 6228324, 6945638, 7617401, 3478169, 3623435, 6853144, 3361066, 1635758, 4586184, 32742, 2592485, 4101808, 1018555, 286986, 8353752, 7399079, 1528145, 3429129, 3740734, 60232, 8211003, 6406938, 6598060, 5945777, 7107961, 405338, 511477, 146428, 6598459, 1128908, 6431083, 5783065, 1509497, 6457238, 1954717, 3179853, 2825411, 291847, 7325731, 3075033, 3420317, 6693619, 3028668, 47562, 6154441, 5738385, 4639450, 5672715, 7709445, 7270017, 5167395, 4698328, 5430194, 2129107, 3500360, 582311, 5156926, 7626970], -[6005898, 8151477, 4291178, 3518324, 5461855, 5324846, 7256057, 1982610, 7159157, 2015938, 6197616, 4997862, 979173, 2232049, 4251050, 5413264, 6293536, 4782858, 6198556, 5055018, 5274874, 2033801, 3298727, 6366179, 7965609, 5546935, 5701041, 5291416, 8195625, 5017391, 2673518, 3139238, 6816702, 2123335, 646532, 7711463, 5856499, 2534908, 295029, 3824350, 996572, 1380250, 2152224, 2712889, 6249002, 8114002, 4246562, 52867, 1500186, 5211968, 3032365, 5910767, 4330183, 6252276, 4734750, 7199426, 5641786, 4019663, 7624124, 2765156, 5184206, 4611183, 8310539, 5499469, 1695877, 3964178, 512383, 7524192, 7716802, 3690117, 720671, 2726916, 1817191, 5018493, 7900759, 7524570, 1607349, 1116219, 2594705, 6927422, 8001547, 5845518, 3667146, 2795162, 292457, 7244092, 4126800, 6565810, 564693, 4426749, 4520825, 4057251, 3438244, 8094052, 5039204, 1703548, 7403397, 572162, 2764277, 4809199, 5271090, 3937306, 7048419, 2087901, 5426276, 7792639, 6580075, 6578289, 5984145, 18786, 655335, 3428749, 115160, 4856013, 6637648, 6247088, 4841103, 6702413, 1347551, 3053143, 1914812, 3468076, 2654820, 7451389, 534762, 3610700, 5577319, 481503, 4724645, 3587857, 2957063, 2666899, 7645283, 1143141, 6870155, 5230343, 6188084, 2400898, 1941804, 2938333, 366918, 1895749, 6023352, 1231834, 2796184, 5960429, 3593859, 5374589, 4329570, 5471508, 7408111, 7020848, 7301944, 3617384, 6619969, 7598857, 3084694, 2015810, 1020508, 5706321, 6475102, 7847748, 7745160, 84659, 6775309, 5184660, 856656, 46810, 3255767, 2217528, 1650213, 1530029, 5670064, 4977489, 3751037, 2698680, 324375, 208117, 1908443, 7407199, 6106521, 408077, 3381121, 1289532, 3393863, 3384772, 7132692, 3657484, 2376078, 1666269, 7674803, 2611823, 3634930, 3615384, 4827833, 5947695, 8348721, 7485697, 1240370, 2175933, 1628526, 4037535, 899926, 8027569, 1692718, 4800453, 2681150, 5027375, 2179139, 4497459, 4097274, 6716522, 4532503, 2639718, 6834426, 1055295, 3140518, 2264911, 202030, 49635, 7526526, 6565712, 4254562, 379857, 3942668, 7845306, 2438961, 1142245, 3105941, 467807, 2746694, 1992368, 5687853, 4474229, 1366176, 7712787, 4623152, 5355928, 241415, 1914514, 4093355, 5915183, 7303744, 6830703, 3306027, 1172668, 6374361, 5522637, 725117, 5248358, 7328649, 4290757, 1558745, 4591504, 5959082, 3841663], -[5241048, 640128, 1856278, 358125, 6406690, 5708373, 1814274, 6765413, 5912712, 429661, 8175856, 1217095, 400922, 1308683, 4453582, 3797370, 5752938, 7720107, 7890927, 1026895, 5778212, 603402, 3428962, 4886401, 7998649, 1581129, 1895905, 8283606, 6612473, 2861784, 955011, 1624634, 272036, 5348771, 3707657, 4745053, 4321662, 6552754, 3873607, 7269344, 1516672, 3116331, 1577115, 4726487, 7249482, 6004991, 221228, 4065233, 2686783, 4224005, 2289006, 7785968, 7943012, 3373, 838103, 4866498, 3597139, 3132181, 5003987, 5162869, 6739589, 123893, 5021881, 672956, 886059, 8095039, 3867024, 7156761, 7685971, 3418484, 6787728, 370384, 8342499, 6284004, 7450598, 6018907, 2876252, 8312144, 272987, 4815966, 738704, 2053743, 507004, 4847436, 6247502, 1162609, 4412674, 2014297, 5592532, 8297244, 955731, 2392032, 4790801, 3276687, 7034819, 4096810, 7005377, 7718966, 3858907, 5215034, 2263631, 5838332, 3713119, 474675, 6921604, 6797272, 6737808, 3466588, 3195878, 6379602, 2173160, 4331799, 8009923, 5349440, 6975150, 6447689, 3900440, 3323125, 4827529, 6267799, 5051210, 5279169, 6304940, 619662, 2656958, 751836, 6331999, 569553, 8348492, 3594281, 6807500, 8185537, 219013, 2819942, 6845714, 5262306, 1655165, 358315, 4823804, 7429698, 2628222, 3208550, 5622008, 2889556, 5559393, 6656973, 6431879, 6987471, 1967698, 5330781, 4973335, 4919690, 1046153, 6441556, 4189278, 175008, 360213, 5002772, 1562271, 1843186, 5933440, 6851209, 6689108, 2145522, 6680129, 2391126, 3743183, 5613936, 765484, 616547, 891464, 1377523, 5249964, 707930, 6843699, 4593067, 331169, 2651760, 5208814, 3006332, 7996599, 1038395, 5598215, 1975264, 2051432, 6181445, 1718163, 2606207, 1439647, 7283154, 4118977, 3145989, 7399181, 7212895, 1547343, 3325251, 3342764, 5809079, 1888333, 1948844, 3753765, 1014686, 6987052, 8008388, 2085482, 3705972, 7722710, 7306457, 7022565, 5895770, 6963132, 7402558, 7423764, 4862477, 2086753, 7183074, 8183556, 4190235, 5980521, 5258655, 3459396, 104474, 5872499, 1068338, 5688516, 478201, 8054312, 110837, 3685239, 1589900, 7620524, 5557668, 5129342, 753034, 391746, 5653160, 8127761, 476724, 1636549, 358492, 31087, 4355238, 2187093, 8348843, 4886242, 1680131, 7266140, 5880175, 7452251, 7897815, 8236767, 8115733, 1538366, 2628728, 6520350, 6779371]] -NTTInverse(aHat * s1Hat): [[4200210, 4078470, 2691151, 979714, 3056064, 4106053, 5083725, 7794482, 269738, 8322132, 1813450, 3894380, 144005, 6350291, 5434749, 911790, 4566374, 7419350, 2303506, 4661661, 1551022, 7168093, 4744713, 7715500, 3025283, 2680461, 1318264, 4993426, 6891155, 8033053, 5838813, 5047757, 3772135, 3430779, 472832, 5998817, 1338430, 775811, 7093373, 7410958, 814343, 7151529, 3451479, 1625482, 8278417, 5424683, 1938777, 6854035, 6011505, 3849691, 6301540, 4580127, 1465270, 7448920, 1192228, 6733809, 3540232, 6079835, 6219522, 5671304, 5805338, 4310190, 8231550, 2317065, 6080229, 6190598, 1424413, 4207320, 605752, 3672336, 3121229, 1498357, 2028597, 3502038, 2285064, 4605330, 4799543, 5979845, 4465892, 2227064, 5138212, 7710153, 1124627, 459279, 668895, 4601150, 4204238, 1443647, 785334, 6627681, 6979782, 30282, 5181569, 664701, 5834365, 3619832, 8012093, 4134652, 2279538, 103277, 3289225, 6453009, 413615, 6848704, 1986449, 5660083, 1427130, 3144061, 7895328, 7039939, 2720687, 3292155, 2820786, 4557152, 4339217, 3239605, 2630161, 3536451, 3289126, 7205080, 2171479, 1638374, 1699203, 2732010, 3888807, 3809857, 5228290, 8358670, 5838505, 6590284, 2532697, 5636865, 7725617, 5849529, 3402014, 5243909, 7494053, 3806846, 2975343, 6944657, 197386, 2668077, 7429284, 7463952, 4034182, 3764420, 4808472, 1328472, 2638693, 7052528, 3924630, 5567143, 643984, 7980146, 584179, 6772730, 1191944, 5705123, 6847795, 4298308, 3674341, 30026, 2226428, 1004894, 5212871, 881588, 7112576, 3871317, 4533464, 1044369, 7867098, 8267246, 2232174, 2343072, 571699, 5854078, 3888292, 5156829, 654789, 1569568, 5081038, 494706, 955562, 2850999, 7215908, 3913313, 1769923, 3088271, 4399968, 3766179, 346093, 1201464, 6141322, 569198, 2234422, 7624521, 4545802, 6269847, 6404110, 487756, 4570722, 5342030, 6223350, 183711, 3354408, 3593038, 6563701, 3938350, 140597, 5602799, 7592537, 7349170, 635144, 7139654, 584897, 1791578, 7890734, 3684164, 3783904, 4283562, 3465874, 2044450, 6651105, 7466985, 6496511, 6393859, 6134186, 750865, 3176111, 7920742, 6844712, 6372544, 56056, 8238631, 3209420, 2093371, 8199189, 5604506, 219653, 3895870, 5537094, 2424621, 6386025, 634503, 6602462, 2779209, 7333630, 367434, 208467, 2697552, 6242895, 4281711, 7247269, 5419613, 3350500, 3753196], -[3395615, 7382856, 6134019, 7203116, 4640363, 2350333, 6043129, 5953192, 8010030, 5433125, 5773725, 4459948, 7536554, 1647344, 1699921, 4404626, 401705, 7268014, 7727277, 175753, 6336589, 4830357, 3649866, 3168903, 2386641, 2166840, 7576180, 5919326, 5725146, 7907383, 4503288, 2884310, 7107146, 5534308, 1711072, 8268535, 7126994, 1195720, 152511, 2883111, 6662672, 7642045, 6509674, 4805832, 5448089, 1574664, 93432, 5735580, 1579055, 3054194, 7087337, 1651500, 6433402, 306604, 7238417, 7717815, 1327616, 4705411, 5329079, 1349780, 255284, 4067605, 2061597, 7053041, 4956381, 1183367, 8308362, 6753956, 3666184, 7433726, 1438513, 7950830, 6683695, 6487864, 6397587, 2294339, 1326783, 2528098, 3736113, 3432165, 7959134, 5394253, 3039309, 3855811, 3471609, 5587005, 3016201, 4315875, 3085890, 723618, 2876567, 24919, 3718200, 2484840, 8363137, 4104195, 1619741, 510832, 6504624, 4392114, 7219299, 2336720, 5270809, 968154, 7742678, 6421526, 5982398, 604610, 4485295, 5483118, 1087986, 2420613, 8250658, 2972397, 6087429, 6587405, 5408374, 246125, 5329450, 5016993, 2702558, 7584686, 526029, 6613613, 6752745, 5155261, 1756106, 5524116, 312234, 528780, 1104228, 2367700, 7591249, 758441, 410137, 3264460, 520068, 2693930, 3291196, 641215, 6148871, 691540, 2371726, 5359748, 1616884, 715914, 745144, 135538, 1096659, 5777373, 960842, 2729767, 6916091, 2118014, 2188234, 5227070, 2779640, 3596137, 5802539, 5578436, 2904972, 6014510, 4710109, 4019761, 7600620, 2687893, 4172781, 3327174, 1705197, 6142137, 7176036, 6327598, 1988511, 6923568, 2890144, 4904609, 1102234, 745703, 8032404, 6943553, 605237, 7467543, 3779671, 4189978, 2943051, 5308687, 5676016, 1239832, 2953273, 3346467, 7282974, 855028, 3849887, 3732960, 1344397, 8226774, 6603917, 51060, 8199632, 7526740, 5624231, 5374307, 4543328, 8210830, 3083862, 7233942, 2516294, 401126, 183675, 6239069, 7473986, 2068907, 6614057, 2502659, 5880951, 8177718, 4815704, 7594979, 4927934, 3652104, 7519171, 5329921, 3474544, 3318119, 7591743, 3768413, 4569726, 7747867, 1712964, 5007983, 4462163, 5000718, 7154664, 3825133, 5805500, 8084403, 2236649, 6710948, 5072714, 3426793, 7983850, 6780606, 3677395, 1407082, 7860466, 1077708, 7364494, 7939604, 2431652, 8007446, 5933526, 1493553, 2641167, 1210822, 2339983, 2033318], -[8049065, 5172075, 6609228, 392917, 1378445, 2628393, 2778725, 1169299, 4421628, 3700041, 2203570, 2269677, 4755417, 8020717, 2242828, 286164, 7801757, 5795876, 2089000, 7876775, 4732355, 2694836, 7217667, 2444829, 3989582, 3046824, 3608035, 1127497, 4793604, 6866, 1141034, 7836431, 4340222, 3905186, 5004529, 6927362, 1708206, 6515607, 3135190, 279647, 2778002, 4701846, 2666026, 4875151, 1591246, 5919261, 4269781, 4996074, 6702296, 3608843, 7665813, 7110166, 4948171, 3998820, 416201, 405993, 4061978, 6970667, 5720765, 2128898, 5698319, 4900726, 3996248, 4520198, 4606922, 7711035, 6573045, 4050854, 1196088, 5826679, 2516846, 3677357, 2223870, 1955291, 2510668, 6213747, 6910481, 2188986, 4678774, 5066127, 7577016, 4763932, 2538891, 241147, 3821305, 3295805, 4442066, 2393555, 289980, 6124508, 3560066, 5033703, 7449932, 4647415, 3863937, 6809685, 896030, 4765413, 925016, 4476930, 7032469, 5597046, 1523165, 5369679, 1934591, 1767998, 6504521, 6402810, 3550319, 4300986, 7087231, 3865144, 7683931, 4590921, 4094222, 7333278, 7214799, 1362864, 6039770, 6030430, 4312464, 520097, 892824, 4648007, 7416492, 1447312, 4971887, 6032397, 2100685, 5207449, 3202133, 6821140, 976692, 2777702, 3972425, 5918317, 3571211, 2862277, 7088104, 6398823, 1208533, 5800544, 8222420, 5929355, 6473109, 4200675, 80856, 2527625, 5209779, 166608, 7197128, 1329998, 7770290, 4353565, 8086686, 5593189, 4234068, 6182972, 6339434, 6741902, 514049, 3357626, 1801881, 1518448, 6494335, 7501432, 899098, 989730, 3786385, 1503236, 3359571, 7208838, 1328534, 5922544, 6273989, 4746132, 2712246, 4182320, 2741887, 7782529, 4095533, 5559823, 8119672, 3096272, 1159754, 1722381, 2670450, 6812717, 3709331, 3457109, 4472479, 6071864, 4096892, 1834566, 1627778, 162942, 4553203, 8351377, 1255355, 725028, 3854137, 4809739, 1105069, 3917255, 6884253, 1567879, 2422764, 6465132, 174074, 5146566, 3162097, 5778981, 2171131, 6275701, 4184236, 2851540, 3848023, 2267416, 4908926, 3942278, 3355668, 5172771, 5880290, 3498861, 3633212, 5318487, 1071182, 7998822, 8097262, 1404005, 1526558, 6435772, 2427415, 7432902, 7108210, 258632, 3477560, 2348227, 3468452, 8259272, 7002699, 7429489, 5297830, 3362614, 1209779, 1335528, 7233990, 5240511, 7311296, 6137179, 7050625, 7673457, 5227004, 8020602, 6506008, 7686123], -[6101483, 4606584, 5791266, 4946564, 1939739, 7680607, 2203240, 1399982, 723336, 5046118, 979604, 5954501, 6201328, 6789404, 1253168, 7756452, 4625995, 6185599, 1980754, 3594967, 6422446, 7026615, 1957722, 5645514, 7740321, 4686960, 1331305, 3455585, 4905752, 7248286, 5668416, 4541871, 7290249, 6607676, 4710195, 6157613, 6050426, 2245346, 328195, 18898, 5467410, 3973885, 836464, 6054939, 882890, 4228150, 6656591, 4884894, 4301028, 3781472, 3802560, 5042982, 4001583, 6977952, 6216344, 5397040, 6551939, 3621383, 888563, 619527, 1698509, 883422, 6833706, 2767492, 3272630, 1399120, 2120714, 3416149, 313668, 2465175, 284628, 2975810, 2157312, 8230265, 569007, 899778, 1050864, 6174648, 4838925, 5531527, 8118473, 194087, 7159289, 1586731, 940165, 5710507, 8237211, 752695, 8377810, 2108961, 245408, 3633402, 3406353, 7756894, 915776, 3426303, 77615, 3312955, 5112254, 2114792, 6882233, 7160736, 8331429, 4902412, 5339840, 7711840, 1575016, 3006408, 7473389, 3908195, 1633362, 3207765, 2190299, 7898371, 8182241, 3586833, 3441970, 8058594, 4604757, 1640108, 3125270, 3070971, 1324951, 412024, 7152836, 1101259, 2121152, 571480, 7694311, 4089498, 5311801, 3623706, 2292161, 6885184, 8306939, 6037653, 3204929, 4400529, 5449985, 3206124, 2299664, 4950800, 7735007, 4165039, 6923982, 5679551, 357275, 2665031, 4353778, 6333662, 3185161, 1278337, 4139572, 2592024, 5624921, 6573986, 7233749, 3327772, 5210746, 3902728, 5514813, 6534265, 2456052, 3162345, 532999, 4223448, 7489596, 859443, 305355, 6199902, 5479235, 5481982, 5328625, 2657107, 5473449, 5673607, 5137783, 4669339, 1518053, 2822529, 4137803, 8087879, 3027512, 6902316, 3631730, 3476992, 5785608, 6805474, 4536585, 5685895, 7221238, 6050350, 2471067, 322960, 998597, 5995092, 7638241, 3134903, 3359920, 7271318, 60600, 1664580, 97368, 458931, 5784844, 1117172, 3075636, 811007, 5640254, 756329, 5200973, 5829774, 229452, 8193437, 4332508, 1357113, 3431270, 3714424, 4303942, 3905281, 5999273, 7989454, 5183870, 4465407, 6941647, 5619025, 7345892, 6574985, 7793882, 2142708, 1403489, 6862979, 8056689, 6585185, 8180850, 6650289, 7718853, 3410291, 3766890, 4818030, 4042865, 3378722, 7694849, 5679798, 4862443, 2276925, 4627990, 5247272, 8202471, 4594784, 7338082, 6401932, 3907070, 5180152, 5085183, 2731041], -[607033, 8370673, 6814491, 1988463, 2641459, 757384, 7467239, 4660425, 1902074, 4501430, 2717782, 8017822, 1058410, 4341092, 3899939, 2865375, 3450516, 7541455, 2155830, 6039444, 2496260, 5623614, 8188483, 3353329, 7542277, 856471, 6576744, 5265237, 8169542, 1973031, 1805820, 3014477, 604358, 7216983, 8368164, 4894597, 2098049, 2000117, 4551418, 6338805, 1832710, 5715364, 107983, 441655, 7453645, 5673680, 2943285, 6896764, 2565843, 7777466, 7545319, 3908433, 4476851, 231791, 4134426, 6482706, 5536022, 4823669, 3681411, 3567805, 5047872, 7893663, 1483051, 853187, 1248655, 8160500, 3327582, 7402474, 918171, 4961336, 263684, 1084263, 4908175, 1436887, 6003635, 4595359, 7601243, 410637, 2775456, 3154799, 223862, 523919, 6836012, 5443000, 6604513, 3262063, 7597320, 1959990, 7778533, 5639235, 5698221, 1390096, 3868531, 7606398, 1348663, 6776313, 6876298, 7429224, 1122406, 8138412, 479568, 8088562, 778735, 3085321, 4235411, 8164471, 2274865, 4413653, 3463249, 8078388, 2240183, 4544116, 3290801, 146748, 463740, 1259314, 3653428, 7511606, 4081635, 6469278, 63588, 5964737, 7074148, 6607683, 6949247, 5467165, 3525945, 896004, 1375620, 1226342, 4781604, 359048, 2859174, 7889652, 8058958, 8013117, 6717093, 3423051, 5289875, 3758943, 8101600, 5531336, 4874399, 798438, 4103047, 5927025, 1804025, 2791497, 7070085, 8315533, 6344215, 5240583, 216799, 4396321, 2909510, 710534, 2780863, 7290966, 6423897, 5687520, 3512498, 7517354, 4755822, 5814197, 4559404, 5897245, 1451154, 3512545, 1839938, 5607965, 141513, 5127599, 6803656, 7885645, 7372449, 339660, 5720501, 2024346, 6229730, 2118703, 762641, 737880, 6563209, 6743370, 4384422, 226692, 6861065, 1755349, 5502778, 3016560, 191884, 1965208, 4613054, 5435992, 5129396, 6646963, 8074384, 6644704, 2651361, 3018694, 3633563, 757682, 4620204, 1889566, 2442923, 6937732, 7247096, 7769590, 5540976, 8224149, 799761, 3024610, 4769697, 2568438, 5707305, 3586030, 5589140, 6602714, 253130, 8279287, 2681542, 806221, 646591, 7533536, 597591, 3400310, 2954168, 1390196, 2759895, 7707938, 5348661, 7963207, 1096866, 5446238, 5121297, 889832, 3995003, 1900244, 4424512, 2704420, 7588129, 4870947, 4485251, 8093160, 1805922, 6610328, 4727787, 2193558, 6583119, 7004019, 8131714, 5505179, 2602885, 4100195, 5415329, 1452050], -[3114178, 1989458, 427606, 4342809, 360380, 5257612, 4182914, 4504968, 3282758, 4915455, 3580536, 8192997, 784823, 4674814, 4324036, 89502, 1175225, 1595091, 1011066, 2215818, 1675232, 5040917, 2499283, 6073868, 7094002, 6300655, 4070738, 4065888, 4977779, 6923394, 6441515, 3563096, 2685123, 5156495, 1061273, 5640642, 6088491, 3537426, 8239238, 2162850, 552581, 7350597, 5277318, 3740477, 1933348, 5447994, 3230561, 368909, 7879396, 4770818, 5875380, 3916148, 1594766, 6752664, 2418859, 3647311, 1307436, 5923925, 3681504, 1529783, 2364369, 5037464, 3866259, 7437566, 7664488, 6536495, 1956975, 4060190, 6679471, 474787, 914916, 621854, 4154325, 3276674, 3800958, 2017540, 3844989, 5291904, 5951163, 2736818, 7953326, 3853721, 3049169, 4296801, 1096520, 3731685, 7388898, 2932921, 7857234, 1775644, 2609129, 1443037, 100976, 2422674, 2586487, 5051579, 3978522, 5591606, 6143350, 7332741, 2963549, 1044350, 1773289, 4004596, 7016261, 4057765, 7130121, 8239100, 2674345, 4700150, 3298175, 6085947, 5312999, 4018090, 3805635, 3422060, 1656156, 251074, 7355205, 8156616, 6627328, 388234, 7124609, 74533, 6290717, 6738219, 4805379, 4001787, 1709631, 579082, 2918135, 4411271, 3749053, 3396035, 3053824, 2215145, 3219894, 4315242, 4442604, 4971866, 2484297, 1103148, 6352113, 2567648, 5360878, 4046056, 5252513, 479678, 7451376, 1982583, 4769222, 7028023, 1725160, 3822880, 6188467, 3752358, 7046119, 5148126, 1168717, 5286359, 3704735, 5828718, 6540623, 3275606, 3395308, 6660463, 2055803, 430531, 7517172, 4012902, 5700722, 2918705, 1186788, 2706589, 7778458, 6328622, 2500429, 825934, 1244964, 2407753, 2847436, 5007430, 6145619, 7068494, 1649995, 3393056, 2238769, 991417, 425821, 3352418, 205639, 5736797, 177662, 5532295, 2799649, 8073097, 3047701, 4793410, 6065084, 2201336, 501172, 2809324, 7438017, 38396, 1787204, 2214380, 1896714, 5441528, 63135, 4212477, 781537, 5341502, 2257133, 4390334, 2551447, 451069, 2025318, 753517, 8029634, 6155440, 3140209, 217524, 4058117, 5502179, 3528142, 4187819, 3420502, 1686789, 5702211, 238838, 2312447, 6862358, 8123586, 5749462, 7019800, 477252, 6846145, 5979647, 6568792, 7885990, 4758829, 7189537, 7286595, 6368874, 4404987, 8221630, 6106598, 530042, 7442257, 5052903, 2054784, 1506792, 7154725, 8051353, 3849621, 199113], -[2116719, 3421845, 2847422, 1150099, 4097761, 1864633, 8194329, 3467779, 3823400, 48808, 1626014, 1184796, 2728861, 5978728, 1879632, 3785382, 6920388, 222133, 1446502, 1903917, 5487587, 6459112, 4591992, 5138880, 7994017, 2574888, 4419821, 5012940, 4171355, 7468635, 5969596, 5537049, 4036871, 4284466, 7481456, 4920449, 7609955, 3929553, 8257621, 6817016, 2967891, 1769265, 5379677, 3565779, 347367, 5325722, 5480099, 2631671, 7212251, 7880842, 3980958, 2264085, 2627139, 4287004, 1648230, 1108168, 2105451, 2970230, 1820178, 5026686, 4997185, 6469323, 1308910, 5038259, 4744032, 6309725, 3393472, 225908, 1060666, 5184443, 4712433, 3877932, 3058857, 115639, 3815849, 2576916, 6585756, 2361789, 6703395, 6155191, 8321381, 2425971, 3816528, 1531265, 7210514, 1931138, 3493921, 6476254, 5267434, 2989141, 5509055, 7665759, 7228107, 435967, 2594485, 6446085, 6892219, 5059124, 483657, 1858682, 2407897, 509119, 3425983, 6372064, 4280231, 4810805, 7319785, 4801989, 7180821, 7140834, 4703317, 5011038, 5290714, 1567562, 4244867, 4187570, 7286102, 445198, 2772926, 6144097, 2087952, 853052, 6294402, 2932832, 6655568, 6433165, 6464008, 3097117, 4759918, 163839, 1455950, 956107, 2052853, 4195996, 6768456, 1402834, 737353, 6447343, 6140301, 893094, 4313928, 893615, 6942911, 811655, 5265621, 49498, 5002617, 3776116, 3053823, 6057471, 2903090, 8186192, 5185644, 4372520, 2634683, 4107034, 95426, 1830737, 1798535, 1224941, 4148560, 5727539, 6111476, 1996882, 8309987, 227939, 7816754, 8243296, 819684, 1841965, 718035, 6948390, 4712968, 2145628, 5803984, 6998073, 6476401, 5727670, 4616924, 4002108, 2674499, 5953516, 1821330, 3522721, 4980269, 318725, 6853364, 5234901, 6331659, 5533968, 7359003, 6252660, 65837, 7063189, 8239059, 2949055, 5577909, 8340837, 4434820, 7652549, 2828973, 3033856, 5997302, 2661927, 904990, 4605189, 8292511, 7404121, 6199913, 6400660, 7691291, 6527596, 6559847, 6878944, 6989283, 6495070, 7876882, 4021187, 4906427, 1941848, 7889927, 684733, 6018753, 5787604, 4780615, 3667108, 2262623, 8290209, 4847518, 3687614, 1719186, 3807512, 4126415, 513176, 6844973, 192676, 8362087, 4017628, 1487185, 3368234, 2838315, 6097862, 392005, 2397756, 6224527, 5728651, 477975, 6024395, 6879876, 1603047, 6593033, 4383324, 1403810, 3982219, 7742494, 5722991], -[7313862, 3439943, 2567310, 137916, 8191487, 4244600, 5253841, 2548624, 5733002, 5620118, 4444650, 7533731, 4698832, 579280, 5760201, 8328699, 6446305, 5322843, 1549474, 4678267, 7401283, 5429117, 6211707, 4666000, 1610894, 6229915, 2723930, 4923530, 962176, 7217883, 4326740, 4342079, 4015793, 4435445, 6945023, 266447, 6151355, 6058257, 4784990, 7979034, 6045541, 3008453, 4349926, 3051421, 2504440, 6621221, 5697657, 4370817, 8365527, 7672827, 6846228, 3366439, 3092085, 748955, 2134687, 2404271, 7130160, 4769951, 3975804, 3415748, 6428144, 5665806, 4747269, 3580518, 7619629, 2981565, 3994482, 5517587, 6000465, 5950615, 5287882, 3684020, 2696201, 2344936, 3429020, 383786, 1112162, 4589197, 945599, 5305963, 6528131, 4463628, 5724576, 5198179, 4299974, 767039, 2799664, 2124725, 4768640, 6497489, 1568935, 4829160, 4766613, 2868528, 6310334, 3459948, 4201388, 4028373, 3091498, 2899954, 3174940, 7187229, 6493489, 4683427, 4378311, 2860751, 5085874, 1052373, 969176, 3768578, 8050733, 1463088, 4804314, 968114, 4977281, 4865207, 5447579, 106994, 3627883, 3332741, 4649374, 982965, 2187074, 6523620, 1571838, 7728639, 7811682, 2263524, 7732431, 2278349, 5564044, 6371277, 809114, 8345406, 7621495, 3066512, 6542490, 5796925, 3539412, 6364903, 372704, 3309825, 1579438, 7578683, 6678277, 7456949, 7334289, 997632, 6024438, 4583708, 8208281, 3523534, 3429255, 4544306, 1328172, 3999819, 5255286, 6581208, 2025926, 8147913, 8072447, 2933302, 5320521, 6709177, 1418290, 7341339, 2230280, 3390661, 2330646, 3679767, 2748030, 4572071, 4741937, 7847649, 5564229, 8283833, 6823949, 6118882, 3306028, 5827396, 2311476, 997773, 959286, 2322028, 6258025, 3606887, 6652669, 6737513, 3638310, 6823598, 497892, 1128250, 4733292, 5401528, 333687, 6580057, 2811943, 371074, 801930, 4399883, 8377349, 1013102, 6449218, 6293978, 2872959, 2355844, 3067472, 1282869, 6079322, 6215689, 4531644, 1339641, 3666636, 4133798, 1459833, 3494343, 4234229, 4159020, 3848142, 1426642, 1242925, 2294354, 6029463, 783085, 3254154, 125688, 2717514, 3797025, 1046162, 3902775, 5586050, 6058244, 8289824, 5115352, 5815898, 6352152, 7197731, 7956374, 6850567, 3395372, 4470829, 8273569, 5604708, 599355, 4006397, 3356000, 3425834, 246510, 549613, 919264, 6720942, 1580358, 5945241, 2126121, 3002166, 6479288]] -t: [[4200208, 4078469, 2691149, 979714, 3056064, 4106054, 5083724, 7794484, 269740, 8322134, 1813450, 3894379, 144003, 6350292, 5434749, 911789, 4566375, 7419352, 2303506, 4661659, 1551023, 7168092, 4744714, 7715502, 3025284, 2680461, 1318265, 4993424, 6891153, 8033055, 5838812, 5047757, 3772133, 3430778, 472831, 5998819, 1338432, 775813, 7093374, 7410957, 814344, 7151527, 3451477, 1625483, 8278418, 5424683, 1938775, 6854037, 6011505, 3849692, 6301540, 4580129, 1465268, 7448919, 1192228, 6733808, 3540233, 6079834, 6219520, 5671304, 5805339, 4310192, 8231549, 2317063, 6080229, 6190598, 1424414, 4207321, 605750, 3672336, 3121227, 1498355, 2028595, 3502038, 2285066, 4605329, 4799542, 5979844, 4465894, 2227066, 5138212, 7710155, 1124629, 459278, 668895, 4601148, 4204236, 1443648, 785334, 6627680, 6979782, 30283, 5181571, 664702, 5834365, 3619831, 8012095, 4134652, 2279536, 103279, 3289227, 6453007, 413614, 6848702, 1986451, 5660084, 1427130, 3144062, 7895329, 7039939, 2720689, 3292154, 2820784, 4557154, 4339218, 3239603, 2630161, 3536453, 3289127, 7205078, 2171477, 1638376, 1699202, 2732009, 3888809, 3809859, 5228291, 8358669, 5838505, 6590285, 2532698, 5636864, 7725617, 5849529, 3402016, 5243907, 7494055, 3806845, 2975343, 6944655, 197384, 2668077, 7429284, 7463952, 4034183, 3764420, 4808472, 1328474, 2638691, 7052530, 3924629, 5567143, 643986, 7980144, 584178, 6772728, 1191946, 5705124, 6847793, 4298306, 3674341, 30024, 2226430, 1004894, 5212873, 881588, 7112575, 3871318, 4533462, 1044370, 7867098, 8267244, 2232175, 2343073, 571700, 5854078, 3888294, 5156829, 654788, 1569570, 5081038, 494706, 955560, 2851001, 7215906, 3913311, 1769925, 3088272, 4399968, 3766179, 346093, 1201463, 6141320, 569199, 2234422, 7624523, 4545800, 6269847, 6404112, 487758, 4570723, 5342029, 6223352, 183713, 3354410, 3593037, 6563702, 3938348, 140595, 5602797, 7592535, 7349171, 635146, 7139652, 584899, 1791579, 7890734, 3684165, 3783905, 4283564, 3465875, 2044448, 6651107, 7466985, 6496510, 6393857, 6134187, 750866, 3176113, 7920740, 6844711, 6372542, 56055, 8238632, 3209418, 2093372, 8199187, 5604507, 219652, 3895870, 5537092, 2424622, 6386023, 634505, 6602461, 2779207, 7333632, 367434, 208468, 2697554, 6242896, 4281709, 7247269, 5419612, 3350502, 3753197], -[3395617, 7382854, 6134021, 7203117, 4640361, 2350332, 6043130, 5953190, 8010031, 5433124, 5773725, 4459946, 7536552, 1647343, 1699921, 4404627, 401707, 7268016, 7727275, 175753, 6336591, 4830359, 3649868, 3168901, 2386642, 2166842, 7576181, 5919326, 5725144, 7907381, 4503288, 2884311, 7107144, 5534309, 1711073, 8268533, 7126994, 1195721, 152513, 2883113, 6662673, 7642046, 6509676, 4805832, 5448090, 1574666, 93432, 5735578, 1579055, 3054195, 7087335, 1651499, 6433401, 306606, 7238418, 7717813, 1327616, 4705413, 5329077, 1349780, 255286, 4067603, 2061598, 7053042, 4956379, 1183365, 8308363, 6753956, 3666185, 7433727, 1438514, 7950830, 6683696, 6487862, 6397585, 2294339, 1326781, 2528097, 3736113, 3432167, 7959134, 5394251, 3039311, 3855812, 3471610, 5587006, 3016200, 4315877, 3085889, 723617, 2876569, 24917, 3718202, 2484840, 8363136, 4104194, 1619743, 510831, 6504622, 4392113, 7219299, 2336722, 5270809, 968156, 7742676, 6421526, 5982398, 604609, 4485294, 5483119, 1087987, 2420611, 8250659, 2972396, 6087427, 6587406, 5408374, 246125, 5329452, 5016994, 2702560, 7584685, 526028, 6613611, 6752746, 5155262, 1756106, 5524115, 312235, 528779, 1104229, 2367701, 7591251, 758441, 410137, 3264459, 520070, 2693928, 3291196, 641215, 6148872, 691541, 2371725, 5359750, 1616883, 715914, 745146, 135539, 1096658, 5777374, 960840, 2729765, 6916090, 2118014, 2188232, 5227070, 2779641, 3596136, 5802538, 5578434, 2904973, 6014511, 4710109, 4019761, 7600622, 2687895, 4172781, 3327174, 1705195, 6142136, 7176038, 6327598, 1988512, 6923567, 2890142, 4904608, 1102233, 745704, 8032406, 6943551, 605237, 7467541, 3779669, 4189977, 2943051, 5308688, 5676018, 1239834, 2953274, 3346466, 7282974, 855027, 3849889, 3732960, 1344399, 8226775, 6603919, 51059, 8199634, 7526738, 5624229, 5374305, 4543328, 8210829, 3083861, 7233941, 2516296, 401126, 183676, 6239071, 7473988, 2068907, 6614057, 2502657, 5880953, 8177720, 4815705, 7594981, 4927936, 3652106, 7519169, 5329920, 3474545, 3318121, 7591745, 3768415, 4569728, 7747867, 1712963, 5007983, 4462165, 5000717, 7154663, 3825132, 5805502, 8084405, 2236649, 6710947, 5072712, 3426794, 7983850, 6780608, 3677394, 1407082, 7860467, 1077707, 7364496, 7939605, 2431653, 8007446, 5933526, 1493552, 2641168, 1210820, 2339984, 2033320], -[8049067, 5172073, 6609229, 392915, 1378446, 2628394, 2778727, 1169297, 4421628, 3700043, 2203568, 2269677, 4755416, 8020717, 2242827, 286164, 7801758, 5795875, 2089001, 7876773, 4732354, 2694834, 7217665, 2444828, 3989580, 3046824, 3608034, 1127498, 4793604, 6865, 1141036, 7836433, 4340221, 3905186, 5004529, 6927364, 1708204, 6515606, 3135189, 279649, 2778004, 4701845, 2666024, 4875151, 1591246, 5919261, 4269782, 4996076, 6702294, 3608842, 7665815, 7110166, 4948172, 3998821, 416200, 405992, 4061980, 6970666, 5720764, 2128899, 5698318, 4900728, 3996247, 4520197, 4606921, 7711033, 6573044, 4050852, 1196086, 5826677, 2516845, 3677358, 2223872, 1955291, 2510667, 6213748, 6910479, 2188985, 4678776, 5066128, 7577014, 4763931, 2538889, 241148, 3821305, 3295803, 4442068, 2393557, 289979, 6124506, 3560067, 5033702, 7449930, 4647416, 3863938, 6809686, 896032, 4765411, 925017, 4476932, 7032469, 5597048, 1523163, 5369679, 1934589, 1768000, 6504523, 6402809, 3550318, 4300985, 7087231, 3865146, 7683931, 4590919, 4094222, 7333280, 7214797, 1362865, 6039770, 6030428, 4312463, 520097, 892826, 4648007, 7416492, 1447314, 4971887, 6032396, 2100685, 5207447, 3202134, 6821139, 976691, 2777700, 3972427, 5918317, 3571212, 2862275, 7088104, 6398825, 1208532, 5800546, 8222422, 5929355, 6473110, 4200676, 80857, 2527623, 5209780, 166606, 7197129, 1330000, 7770288, 4353567, 8086685, 5593189, 4234070, 6182973, 6339436, 6741900, 514050, 3357628, 1801882, 1518447, 6494334, 7501432, 899099, 989732, 3786385, 1503234, 3359572, 7208839, 1328534, 5922545, 6273987, 4746131, 2712245, 4182320, 2741888, 7782530, 4095531, 5559825, 8119672, 3096274, 1159752, 1722381, 2670452, 6812715, 3709332, 3457107, 4472479, 6071866, 4096890, 1834567, 1627778, 162942, 4553202, 8351378, 1255357, 725026, 3854138, 4809740, 1105071, 3917256, 6884252, 1567879, 2422762, 6465132, 174073, 5146566, 3162097, 5778979, 2171132, 6275699, 4184236, 2851541, 3848025, 2267418, 4908926, 3942276, 3355667, 5172769, 5880290, 3498863, 3633210, 5318487, 1071182, 7998822, 8097262, 1404006, 1526556, 6435771, 2427415, 7432903, 7108208, 258632, 3477560, 2348229, 3468454, 8259270, 7002697, 7429489, 5297829, 3362613, 1209780, 1335528, 7233991, 5240513, 7311295, 6137179, 7050627, 7673457, 5227005, 8020603, 6506007, 7686123], -[6101483, 4606585, 5791267, 4946566, 1939737, 7680606, 2203238, 1399980, 723338, 5046120, 979606, 5954502, 6201326, 6789405, 1253167, 7756451, 4625995, 6185598, 1980756, 3594965, 6422447, 7026613, 1957721, 5645514, 7740321, 4686959, 1331304, 3455587, 4905752, 7248285, 5668416, 4541870, 7290251, 6607674, 4710193, 6157614, 6050425, 2245344, 328193, 18899, 5467409, 3973887, 836462, 6054940, 882888, 4228150, 6656592, 4884895, 4301030, 3781473, 3802559, 5042980, 4001582, 6977952, 6216346, 5397039, 6551939, 3621384, 888561, 619527, 1698511, 883424, 6833706, 2767494, 3272628, 1399121, 2120712, 3416148, 313670, 2465176, 284629, 2975809, 2157313, 8230266, 569009, 899777, 1050862, 6174648, 4838925, 5531528, 8118473, 194087, 7159287, 1586730, 940164, 5710507, 8237211, 752697, 8377812, 2108960, 245407, 3633403, 3406351, 7756895, 915775, 3426305, 77615, 3312953, 5112254, 2114790, 6882233, 7160738, 8331429, 4902413, 5339838, 7711842, 1575016, 3006409, 7473391, 3908197, 1633363, 3207763, 2190301, 7898373, 8182243, 3586831, 3441972, 8058592, 4604759, 1640110, 3125270, 3070970, 1324949, 412022, 7152838, 1101260, 2121151, 571481, 7694309, 4089496, 5311800, 3623708, 2292161, 6885182, 8306940, 6037654, 3204930, 4400528, 5449983, 3206122, 2299666, 4950798, 7735006, 4165037, 6923981, 5679552, 357276, 2665032, 4353780, 6333663, 3185162, 1278336, 4139572, 2592026, 5624923, 6573988, 7233749, 3327771, 5210745, 3902728, 5514814, 6534263, 2456053, 3162345, 532997, 4223447, 7489597, 859442, 305356, 6199903, 5479236, 5481980, 5328624, 2657106, 5473450, 5673607, 5137784, 4669339, 1518052, 2822528, 4137805, 8087879, 3027512, 6902314, 3631728, 3476992, 5785606, 6805475, 4536586, 5685897, 7221236, 6050352, 2471068, 322959, 998598, 5995090, 7638243, 3134904, 3359920, 7271318, 60602, 1664580, 97367, 458932, 5784844, 1117171, 3075637, 811005, 5640254, 756329, 5200971, 5829773, 229452, 8193435, 4332509, 1357111, 3431272, 3714422, 4303943, 3905281, 5999272, 7989455, 5183872, 4465408, 6941648, 5619024, 7345890, 6574984, 7793883, 2142709, 1403488, 6862979, 8056688, 6585187, 8180851, 6650290, 7718852, 3410290, 3766888, 4818031, 4042866, 3378723, 7694849, 5679800, 4862441, 2276927, 4627988, 5247273, 8202469, 4594784, 7338083, 6401931, 3907068, 5180154, 5085181, 2731039], -[607034, 8370674, 6814489, 1988463, 2641461, 757383, 7467237, 4660423, 1902075, 4501431, 2717782, 8017821, 1058412, 4341092, 3899941, 2865376, 3450514, 7541457, 2155829, 6039442, 2496259, 5623612, 8188481, 3353327, 7542278, 856473, 6576745, 5265238, 8169541, 1973033, 1805822, 3014479, 604359, 7216982, 8368166, 4894597, 2098047, 2000118, 4551419, 6338805, 1832710, 5715366, 107981, 441653, 7453647, 5673682, 2943287, 6896766, 2565842, 7777466, 7545318, 3908434, 4476853, 231789, 4134427, 6482704, 5536020, 4823670, 3681411, 3567803, 5047871, 7893662, 1483053, 853188, 1248656, 8160501, 3327583, 7402475, 918172, 4961336, 263685, 1084263, 4908173, 1436886, 6003637, 4595360, 7601242, 410639, 2775454, 3154799, 223860, 523917, 6836014, 5443001, 6604515, 3262061, 7597320, 1959992, 7778534, 5639237, 5698220, 1390094, 3868533, 7606398, 1348662, 6776313, 6876297, 7429226, 1122407, 8138410, 479569, 8088563, 778734, 3085319, 4235409, 8164473, 2274864, 4413652, 3463250, 8078389, 2240183, 4544118, 3290803, 146747, 463742, 1259316, 3653428, 7511604, 4081637, 6469277, 63590, 5964735, 7074149, 6607685, 6949248, 5467166, 3525943, 896005, 1375618, 1226341, 4781604, 359050, 2859176, 7889650, 8058958, 8013119, 6717095, 3423049, 5289874, 3758941, 8101600, 5531338, 4874397, 798438, 4103049, 5927023, 1804026, 2791495, 7070084, 8315533, 6344217, 5240581, 216798, 4396320, 2909510, 710535, 2780863, 7290966, 6423898, 5687521, 3512499, 7517353, 4755822, 5814198, 4559406, 5897247, 1451154, 3512545, 1839938, 5607967, 141513, 5127599, 6803654, 7885647, 7372451, 339658, 5720503, 2024344, 6229732, 2118701, 762643, 737878, 6563207, 6743371, 4384421, 226691, 6861065, 1755351, 5502779, 3016560, 191885, 1965207, 4613054, 5435993, 5129395, 6646963, 8074385, 6644703, 2651360, 3018695, 3633561, 757681, 4620204, 1889567, 2442922, 6937731, 7247098, 7769588, 5540976, 8224150, 799762, 3024612, 4769695, 2568438, 5707304, 3586028, 5589141, 6602712, 253131, 8279285, 2681540, 806221, 646593, 7533535, 597590, 3400311, 2954168, 1390197, 2759894, 7707938, 5348663, 7963206, 1096865, 5446238, 5121299, 889833, 3995003, 1900246, 4424511, 2704421, 7588131, 4870946, 4485252, 8093158, 1805923, 6610329, 4727785, 2193560, 6583118, 7004020, 8131713, 5505180, 2602886, 4100195, 5415329, 1452051], -[3114179, 1989457, 427606, 4342808, 360382, 5257610, 4182913, 4504968, 3282756, 4915454, 3580537, 8192999, 784823, 4674813, 4324035, 89500, 1175227, 1595090, 1011064, 2215818, 1675231, 5040915, 2499284, 6073867, 7094000, 6300656, 4070736, 4065888, 4977781, 6923392, 6441513, 3563094, 2685125, 5156493, 1061273, 5640642, 6088491, 3537426, 8239239, 2162851, 552579, 7350595, 5277316, 3740477, 1933349, 5447994, 3230560, 368910, 7879395, 4770819, 5875378, 3916146, 1594768, 6752662, 2418859, 3647313, 1307436, 5923927, 3681506, 1529782, 2364371, 5037464, 3866261, 7437565, 7664487, 6536495, 1956977, 4060192, 6679473, 474785, 914918, 621855, 4154327, 3276676, 3800960, 2017540, 3844987, 5291906, 5951161, 2736818, 7953324, 3853723, 3049167, 4296803, 1096520, 3731684, 7388899, 2932923, 7857233, 1775644, 2609131, 1443038, 100974, 2422675, 2586488, 5051577, 3978522, 5591606, 6143351, 7332741, 2963548, 1044348, 1773287, 4004594, 7016259, 4057765, 7130120, 8239100, 2674343, 4700151, 3298176, 6085948, 5312997, 4018088, 3805634, 3422060, 1656154, 251076, 7355206, 8156617, 6627326, 388234, 7124607, 74532, 6290718, 6738217, 4805377, 4001788, 1709630, 579080, 2918135, 4411273, 3749051, 3396037, 3053824, 2215146, 3219894, 4315241, 4442603, 4971868, 2484295, 1103147, 6352115, 2567647, 5360879, 4046058, 5252515, 479680, 7451374, 1982582, 4769220, 7028024, 1725161, 3822878, 6188469, 3752357, 7046118, 5148128, 1168717, 5286359, 3704737, 5828718, 6540623, 3275604, 3395308, 6660462, 2055803, 430530, 7517174, 4012904, 5700722, 2918706, 1186789, 2706588, 7778459, 6328621, 2500428, 825934, 1244964, 2407754, 2847437, 5007429, 6145621, 7068492, 1649996, 3393054, 2238768, 991419, 425820, 3352420, 205638, 5736799, 177660, 5532294, 2799648, 8073097, 3047700, 4793411, 6065086, 2201338, 501173, 2809326, 7438016, 38397, 1787202, 2214382, 1896713, 5441528, 63134, 4212479, 781539, 5341502, 2257131, 4390335, 2551448, 451070, 2025319, 753519, 8029635, 6155439, 3140207, 217526, 4058118, 5502180, 3528144, 4187817, 3420501, 1686788, 5702213, 238840, 2312448, 6862358, 8123586, 5749461, 7019801, 477251, 6846146, 5979647, 6568791, 7885991, 4758831, 7189535, 7286593, 6368876, 4404989, 8221628, 6106600, 530044, 7442259, 5052904, 2054782, 1506791, 7154723, 8051353, 3849619, 199114], -[2116719, 3421847, 2847422, 1150098, 4097762, 1864631, 8194328, 3467781, 3823398, 48807, 1626014, 1184796, 2728862, 5978730, 1879630, 3785383, 6920389, 222134, 1446501, 1903917, 5487589, 6459112, 4591992, 5138880, 7994015, 2574890, 4419823, 5012941, 4171356, 7468633, 5969595, 5537050, 4036870, 4284464, 7481455, 4920449, 7609956, 3929553, 8257623, 6817018, 2967892, 1769266, 5379675, 3565781, 347367, 5325722, 5480101, 2631669, 7212251, 7880844, 3980958, 2264085, 2627140, 4287004, 1648231, 1108170, 2105451, 2970229, 1820179, 5026686, 4997183, 6469325, 1308912, 5038259, 4744032, 6309726, 3393471, 225907, 1060668, 5184441, 4712431, 3877932, 3058859, 115641, 3815851, 2576917, 6585754, 2361787, 6703396, 6155189, 8321381, 2425972, 3816528, 1531265, 7210512, 1931139, 3493923, 6476252, 5267433, 2989142, 5509055, 7665760, 7228107, 435967, 2594485, 6446085, 6892219, 5059124, 483658, 1858680, 2407895, 509121, 3425985, 6372063, 4280233, 4810805, 7319787, 4801990, 7180821, 7140836, 4703315, 5011038, 5290716, 1567563, 4244869, 4187570, 7286100, 445199, 2772928, 6144099, 2087951, 853053, 6294400, 2932834, 6655569, 6433166, 6464009, 3097115, 4759916, 163839, 1455951, 956107, 2052852, 4195995, 6768454, 1402832, 737353, 6447345, 6140299, 893094, 4313927, 893614, 6942913, 811656, 5265622, 49500, 5002615, 3776118, 3053825, 6057470, 2903089, 8186192, 5185645, 4372520, 2634682, 4107032, 95425, 1830739, 1798537, 1224942, 4148560, 5727539, 6111474, 1996881, 8309987, 227940, 7816756, 8243294, 819684, 1841963, 718034, 6948388, 4712967, 2145629, 5803984, 6998072, 6476403, 5727672, 4616925, 4002109, 2674499, 5953517, 1821331, 3522721, 4980271, 318726, 6853365, 5234901, 6331660, 5533970, 7359003, 6252662, 65836, 7063189, 8239057, 2949055, 5577911, 8340836, 4434821, 7652549, 2828975, 3033855, 5997303, 2661925, 904990, 4605188, 8292513, 7404119, 6199913, 6400660, 7691292, 6527597, 6559847, 6878944, 6989281, 6495068, 7876883, 4021185, 4906427, 1941846, 7889927, 684733, 6018751, 5787604, 4780616, 3667108, 2262622, 8290211, 4847516, 3687616, 1719187, 3807512, 4126413, 513174, 6844974, 192674, 8362085, 4017629, 1487185, 3368232, 2838316, 6097860, 392003, 2397756, 6224525, 5728652, 477976, 6024396, 6879877, 1603045, 6593035, 4383325, 1403810, 3982219, 7742496, 5722990], -[7313860, 3439945, 2567311, 137914, 8191489, 4244602, 5253839, 2548623, 5733000, 5620117, 4444648, 7533732, 4698830, 579281, 5760201, 8328700, 6446307, 5322844, 1549475, 4678268, 7401285, 5429115, 6211709, 4666002, 1610895, 6229914, 2723929, 4923529, 962177, 7217883, 4326738, 4342078, 4015794, 4435444, 6945021, 266447, 6151355, 6058257, 4784990, 7979033, 6045542, 3008452, 4349926, 3051422, 2504438, 6621220, 5697657, 4370815, 8365526, 7672829, 6846230, 3366437, 3092086, 748955, 2134686, 2404269, 7130162, 4769949, 3975806, 3415750, 6428142, 5665805, 4747269, 3580516, 7619630, 2981563, 3994483, 5517589, 6000463, 5950615, 5287884, 3684021, 2696200, 2344936, 3429022, 383784, 1112164, 4589199, 945597, 5305965, 6528129, 4463627, 5724576, 5198181, 4299974, 767041, 2799662, 2124725, 4768639, 6497487, 1568936, 4829158, 4766612, 2868528, 6310334, 3459948, 4201387, 4028371, 3091496, 2899952, 3174941, 7187230, 6493488, 4683427, 4378310, 2860749, 5085875, 1052372, 969177, 3768577, 8050733, 1463090, 4804313, 968113, 4977282, 4865207, 5447577, 106992, 3627881, 3332742, 4649373, 982965, 2187075, 6523622, 1571839, 7728637, 7811682, 2263524, 7732433, 2278350, 5564045, 6371276, 809114, 8345406, 7621497, 3066514, 6542492, 5796924, 3539412, 6364901, 372705, 3309826, 1579439, 7578681, 6678279, 7456949, 7334288, 997634, 6024439, 4583708, 8208281, 3523533, 3429256, 4544306, 1328171, 3999818, 5255288, 6581210, 2025925, 8147912, 8072447, 2933304, 5320523, 6709177, 1418291, 7341339, 2230282, 3390660, 2330646, 3679767, 2748028, 4572071, 4741938, 7847649, 5564231, 8283834, 6823949, 6118883, 3306028, 5827394, 2311478, 997775, 959286, 2322026, 6258026, 3606887, 6652670, 6737514, 3638311, 6823596, 497894, 1128250, 4733294, 5401527, 333685, 6580055, 2811944, 371072, 801929, 4399884, 8377350, 1013100, 6449218, 6293978, 2872961, 2355844, 3067474, 1282867, 6079323, 6215690, 4531643, 1339643, 3666636, 4133797, 1459832, 3494345, 4234228, 4159018, 3848140, 1426641, 1242926, 2294355, 6029462, 783086, 3254152, 125687, 2717513, 3797025, 1046163, 3902774, 5586048, 6058244, 8289822, 5115354, 5815898, 6352152, 7197731, 7956373, 6850566, 3395371, 4470829, 8273571, 5604710, 599354, 4006398, 3356000, 3425833, 246509, 549614, 919264, 6720944, 1580358, 5945242, 2126119, 3002164, 6479289]] - -t0: [[-2288, -1147, -4019, -3326, 448, 1862, -3508, 3892, -596, -938, 3018, 3179, -3453, 1492, 3453, 2477, 3431, -2600, 1554, 411, 2735, 92, 1546, -1362, 2436, 1677, -647, -3696, 1681, -3297, -2084, 1485, 3813, -1670, -2305, 2275, 3136, -2427, -898, -2803, 3336, -89, 2645, 3467, -3694, 1579, -2729, -2667, -1423, -548, 1892, 801, -1100, 2391, -3804, -16, 1289, 1370, 1792, 2440, -2789, 1200, -1411, -1273, 1765, -2554, -994, -3367, -458, 2320, 75, -781, -3021, 4054, -502, 1425, -970, -316, 1254, -1158, 1828, 1483, 2325, 526, -2849, -2756, 1740, 1856, -1098, 352, 198, -2485, -3965, 1150, 1661, -1033, 319, -2308, 2160, -3217, -3957, -2289, 4014, 190, 3987, -588, 1722, -1666, -1759, 3011, 945, -1030, 2736, 2402, -2542, 3763, 529, -2491, -4057, -3882, 597, -24, 3458, 4073, -2391, 579, 1795, 2829, -2391, 3917, 1370, 768, 561, 441, 2336, 1027, -1625, -2435, 1647, -2161, 776, -2515, -860, 1040, 3719, -3900, -232, 1370, 867, -782, 661, -3417, -3182, 1136, 2546, -2056, -4086, 3492, -719, -2494, -3867, -2744, -1794, -2722, 2761, -3148, 1919, -3498, 3286, 3986, 2778, 1516, 3951, 161, -1740, -3202, -2906, 4061, -572, -3294, 1998, 3186, -2904, 185, -1246, -2465, 453, -112, 864, -2141, 2029, -2761, -2680, 3951, -1994, -2229, -760, 2967, -2032, -3762, -413, 845, -2568, 3489, 3882, -3251, 1910, -2004, 1331, -531, -1449, 947, -3830, -3772, 3267, -2469, 1838, -2235, -799, -852, 659, -3552, -797, 4073, 254, -4095, -1621, -2798, -2383, -924, -3801, -834, -1289, -2520, -1846, -3780, -1005, 1179, -1532, -3522, -700, -210, -3737, 3721, -291, 2119, 1792, -1206, 3668, 2386, 592, -2707, -2651, -3492, -26, 1261], -[-4063, 1862, -1787, 2349, 3689, -772, -2566, -2394, -1745, 1828, -1635, 3498, -88, 751, -4015, -2669, 299, 1712, 2219, 3721, -4017, -2921, -3764, -1403, 2770, -4038, -1419, -3490, -1064, 2101, -2312, 727, -3512, -3483, -1055, 2805, -46, -311, -3135, -471, 2577, -1090, -2964, -2872, 410, 1802, 3320, 1178, -2001, -1421, 1255, -3285, 2681, 3502, -3310, 949, 512, 3205, -3915, -1900, 1334, -3821, -2786, -270, 219, 3717, 1675, 3748, -3831, 3583, -3278, -3602, -976, -202, -367, 579, -323, -3231, 561, -281, -3490, 3915, 79, -2620, -1798, 62, 1544, -1307, -2495, 2721, 1177, 341, -966, 2664, -896, 2, -2273, 2927, 174, 1201, 2147, 2002, 3353, 1500, 1236, -1002, 2238, -1599, -3922, 2671, -1549, 3971, 1315, -1300, 771, 1038, 1654, 365, -3540, 3490, -800, -1107, 1740, 2667, 2538, 2494, 3018, 2707, 939, -3701, -1691, 213, -2733, -3415, 537, 4043, 3974, -1240, -1988, 2239, -3320, 3413, -3955, 2182, 3059, 3210, -326, -3725, -1070, 2014, 2376, 1829, 2042, -3714, 968, 574, 2553, -152, 2602, -318, -3187, 1583, -291, -2511, -1554, 919, 3053, 1222, 1259, -1864, -154, 3374, -2144, 1327, -1634, -2400, -3687, 232, -3946, -3265, -971, -3563, 3157, 3865, 2123, 272, -1038, 2842, -4038, -4062, 286, 3059, -351, -2592, 911, 2007, 1167, 1907, -558, -1710, -3675, 353, -3232, 2445, 3669, 405, 1352, -282, 3452, -3233, 2884, -3669, 3113, -4095, -903, 2104, -1191, 997, -3648, -1526, -1087, -3072, 1137, 361, -2239, 95, -1408, -1765, 835, 2671, -2475, 3597, 3047, -532, -2626, -1099, 233, 1699, 1864, 2538, -3350, -2368, -814, -1942, -3853, -3637, -112, 1557, -1371, 3862, 2518, 2608, 3344, -1596, -2928, 1704], -[-3669, 2921, -1715, -301, 2190, -1238, 1639, -2159, -2052, -2741, -80, 493, 4056, 749, -1781, -556, 2974, -4061, 41, -3931, -2622, -334, 513, 3612, 76, -600, 3554, -2998, 1284, -1327, 2348, -3311, -1539, -2398, -783, -3068, -3924, 2966, -2347, 1121, 916, -363, 3624, 911, 1998, -3555, 1750, -1044, 1238, -3830, -1897, -490, 204, 1125, -1592, -3608, -1252, -726, 2748, -1021, -3314, 1912, -1449, -1787, 3017, 2361, 3060, 4004, 54, 2165, 1901, -850, 3840, -2597, 3915, -3980, -3569, 1721, 1144, 3472, -586, -3813, -631, 3580, 3833, 2619, 2004, 1493, 3259, -3110, -3453, 3814, 3402, 2552, -2686, 2134, 3104, -2333, -679, -4092, 3733, 1912, -549, 3919, 1277, -1472, 75, -3335, 3182, 185, 1151, -1478, -165, 3399, -1778, 1440, -2355, 2993, 2266, 1116, 3471, 4001, -102, 3143, 2732, -2670, -657, 3084, 3533, -2665, -938, -2797, 1843, 612, -693, 3693, -500, 3267, 2024, 873, -3884, 610, -2346, -1653, 1430, -1820, -1063, -3705, -332, 2766, -3639, 2896, -3920, 3615, 1181, -1947, -1194, -1987, -1172, -116, -2046, -1092, -358, 2927, -1922, -2440, -2021, -1500, 1681, -4094, 852, -121, 1430, -271, -1085, 2963, 693, -3792, -2432, 130, -469, -2543, 1400, -302, -3512, 2061, -140, -3029, -1644, 83, -353, 1594, 890, -441, -2430, -898, -1550, 3730, 1981, -4062, 3898, 1036, -849, 1480, 2972, 3207, -2070, 1644, 2041, 1990, -15, 3619, 252, 627, -1876, 725, -2215, -1766, 1918, 1924, -3053, 3617, -1566, 879, -4038, 1879, -1970, 3430, 3566, 3174, 2844, -3141, 2583, 2759, -2448, -3512, -4040, -2875, 3238, 1734, -1463, -655, -2395, 3893, -2636, 232, 455, -2367, 4031, 1371, -2685, -2447, 509, 635, 1559, 2027], -[-1557, 2681, -477, -1402, -1767, -3490, -410, -852, 2442, -152, -3434, -1082, -18, -1763, -209, -1373, -2485, 638, -1708, -1323, -81, -2123, -167, 1226, -1119, 1135, -3992, -1437, -1256, -1635, -448, 3502, -629, -3270, -207, -2770, -3463, 736, 513, 2515, 3345, 767, 878, 1052, -1848, 1078, -3504, 2463, 230, -3231, 1471, -3292, 3886, -1632, -1382, -1489, -1661, 520, 3825, -3065, 2767, -1312, 1578, -1402, 4020, -1711, -1016, 84, 2374, -616, -2091, 2113, 2817, -2694, 3761, -1343, 2286, -2120, -2547, 1928, 201, -2521, -521, -2518, -1916, 683, -3941, -967, -2604, 3616, -353, -3845, -1521, -929, -1729, 2049, 3887, 3385, 446, 1254, 953, 930, 165, 3597, -1346, 3170, 2152, -55, 2287, 613, 3155, -3501, 3037, 1285, -1565, -1265, 1332, -2336, 855, 1710, -4074, -1030, -2155, 2422, 1222, 3532, -577, -1959, 2021, 1688, 3384, 2844, -1599, 3902, 252, 150, 1858, 1424, 2303, 3050, -2286, 2830, 1758, 3501, 1741, 2496, -3172, 2632, 3828, 1247, -1526, 384, 2612, 3354, -2981, 4004, 213, 1819, 633, 3336, 1598, -2953, -1547, 233, 517, -3625, 2109, -718, 2252, -1441, -1212, 1532, 3824, 2898, 1194, -3449, 1400, -101, 2532, -3712, 845, 2375, -3528, -3542, 2672, 3584, 2054, -2077, -1782, 649, 4084, -3536, -2916, 3471, -826, -1454, 3299, -2632, 1200, -3178, 3258, 1604, -937, 180, 1292, 3059, 3637, -3, -4034, 2665, -949, -2931, 76, 1435, -1059, -2761, -1176, 3446, 3143, -2303, 2728, 2255, -1664, 768, 3024, -688, -2334, -3192, 3291, -3595, 2656, -1917, 3952, -1181, -2957, -1614, 1988, 2418, -1432, 1135, -3982, 3619, 2561, 2744, -3607, -449, -492, -3799, 2277, -928, -1949, 3979, -516, 2810, -2051, 3103], -[826, -1550, -1255, -2193, 3637, 3719, -3867, -825, 1531, 4023, -1962, -2147, 1644, -668, 549, -1824, 1682, -3375, 1333, 1938, -2301, 3900, -3519, 2799, -2554, -3687, -1431, -2218, 2117, -1239, 3582, -177, -1849, -170, -4058, 3973, 895, 1270, -3333, -1803, -2298, -2650, 1485, -715, -1073, -3374, 2359, -898, 1746, 3258, 486, 850, 4021, 2413, -2533, 2832, -1772, -1418, 3203, -3909, 1599, -3426, 301, 1220, 3472, 1269, 1631, -3093, 668, -3016, 1541, 2919, 1165, 3286, -1099, -352, -934, 1039, -1634, 879, 2676, -371, 3886, 3513, 1763, 1645, 3336, 2104, -3866, 3141, -3412, -2546, 1909, -3970, -3018, 1529, 3209, -918, 103, 3754, -3759, 3059, 494, -3065, 145, -2951, -2512, -1836, -1966, 1077, 3767, -2442, -2381, -709, -3202, -2252, -204, -460, 2021, -2403, -1946, 959, -3739, -3259, 2432, 3102, 3383, 3077, -638, -2459, -2524, -1398, 168, 754, -1970, 1343, -345, -1207, -2158, -1187, -288, 1738, 157, 3814, -1143, -3985, 1786, -1977, 388, 653, 3609, -2299, 3806, -2784, 1350, -2169, 3775, 86, 1370, 2273, -1869, -2903, -3730, -2122, -3538, -993, 1170, -1823, -3262, -3553, 2249, -593, -3898, -3249, -349, 3786, 2487, 920, 3812, -3027, 787, 598, 1415, 1355, 1701, -2685, -3831, 2263, -2245, 1904, 3469, -873, 958, -3495, 1203, 3251, -2927, 991, -2848, 4039, -3687, 4017, -84, -2785, 1706, -893, -2822, 3572, 3184, -618, -3054, 1764, 1951, -3850, -2520, -2068, 2197, -40, -821, -2827, 2756, 3405, -575, -3105, -426, 631, -3144, -2443, -810, -734, -713, 582, -863, -1442, 1299, -3095, -2693, -298, 831, 1061, 2339, -3294, -3964, -538, 3683, -615, 1001, -1896, -3250, -140, -2943, 156, -2170, -3997, 417, 2067], -[1219, -1199, 1622, 1048, -66, -1654, -3199, -632, -2236, 254, 633, 999, -1609, -2819, -1341, -612, 3771, -2350, 3448, 3978, 4063, 2835, 724, 3595, -272, 1008, -688, 2656, -2955, 1152, 2601, -426, -1851, 3725, -3687, -3646, 1835, -1518, -1913, 163, 3715, 2371, 1668, -3267, 37, 314, 2912, 270, -1309, 3075, 1714, 370, -2672, 2454, 2219, 1873, -3284, 1111, 3298, -2122, -3117, -616, -363, -771, -3225, -721, -911, -3040, 2993, -351, -2586, -737, 983, -124, -128, 2308, 2939, -126, 3769, 690, -1108, 3483, 1743, -3997, -1208, -3868, -285, 187, 1105, -2020, 4075, 1246, 2670, -2157, -2184, -2887, -2790, -3530, -649, 901, -1956, 3964, 3815, -1294, 3907, 2725, 3080, -2052, 3751, -2057, -3200, -708, -3611, 4008, -3646, -2196, 1370, -2876, -1210, -2615, -2, 3210, -2433, 804, -738, -3799, -3327, 4092, -2498, -2552, 1783, 3977, -2885, -3643, -1792, 3306, 438, -1943, 2539, -676, 2119, -2773, 3315, 3551, 3311, -790, 1443, -3648, -3346, 118, 1476, -712, -3351, -2786, 3509, 421, 998, 3552, -2739, 2519, 1953, -3986, 3407, -1196, 3820, 366, -389, -3646, -3082, -1176, -910, 2354, -1051, 3228, -3941, -3795, 1868, -1458, -220, -694, -3379, 2117, 1621, -1204, 3404, 1566, 2352, 187, -164, 1892, 838, 2399, -2564, 2694, -2016, 3977, 276, 1091, 3006, -2310, 1461, -530, -320, -2563, 1346, 2542, -3831, 2040, -2402, 1791, 3299, 318, -3861, -577, 3736, 510, 1895, -145, 1475, 3247, 2671, -3658, 3078, -2844, -2608, 1705, -3755, -764, 581, 1272, 2304, -2538, -2878, -1323, -743, 2115, -2366, -513, -1193, -2905, -721, -3041, 3905, 3692, -2307, -3140, 3560, -2436, 3923, -1560, -1410, -537, 3107, -1383, -621, 2506], -[3183, -2409, -3394, 3218, 1762, -3145, 2328, 2565, -2266, -345, 3998, -3044, 926, -1430, 3662, 679, -1851, 950, -3483, 3373, -1051, 3816, -3720, 2496, -1377, 2602, -3857, -563, 1628, -2471, -2373, -742, -1786, 48, 2159, -2943, -412, -2607, 87, 1274, 2388, -206, -2469, 2261, 3303, 922, -347, 2037, 3291, 140, -354, 3093, -2492, 2588, 1639, 2250, 107, -3467, 1555, -3202, 63, -2355, -1808, 179, 864, 1886, 1983, -3469, 3900, -1095, 2031, 3116, 3243, 953, -1621, -3563, -614, 2491, 2340, 2997, -1691, 1140, -944, -639, 1552, -2173, -4061, -3620, -23, -938, 4031, -1952, 2763, 1791, -2379, -1019, 2747, -3532, 330, -904, -553, 1217, 1729, -1313, 4009, 2101, -3861, 1478, -3563, -2588, 1107, -2466, -1316, 2891, 1413, 1458, 3412, 2831, 4032, 99, -1009, 1085, 2944, 98, 3665, 2446, 521, 539, 364, -1, -2225, -2357, -3340, 1691, 1862, 2000, 73, 241, -3701, 166, -3257, 686, -3903, 648, -1834, 348, -2697, -394, -1791, 3582, 3121, 2384, 109, -2008, -3142, 2840, -2879, 3923, -3703, -3858, 3408, 1331, 242, -1967, 3299, -1436, 1588, 2142, 484, -1237, -2862, 1572, 2567, -675, 4048, 2104, -3469, 1464, -3363, -3779, 3907, -2067, 2707, 161, -465, -762, -3339, 213, -756, -3822, 2587, 2166, 300, 1685, -2095, -65, -841, 1380, 2949, 1221, 2735, 2815, 759, -475, 3870, 1284, 2209, -1449, -1431, 2708, -996, -1427, -1945, -2336, 1505, -1188, -3821, -1087, -581, 342, 1031, -3395, -2369, 4052, -3512, -2908, 1630, -93, -2148, 1216, -1133, -1768, -2355, -2922, -3538, -3934, -1947, 3549, -3759, 1320, 3884, 3012, -1213, -2500, -1395, 2444, 2840, 3276, -1403, -2587, -1525, 605, 2978, 907, 1056, -3218], -[-1596, -695, 3215, -1350, -511, 1146, 2767, 911, -1400, 405, -3608, -2908, -3378, -2351, 1225, -2564, -797, -1956, 1187, 636, 3909, -2181, 2173, -3438, -2929, 3994, -4007, 137, 3713, 731, 1362, 318, 1714, 3572, -1795, -3889, -837, -3823, 862, 25, -154, 1988, -26, 3998, -2314, 2084, -3975, -3713, 1494, -3075, -2282, -475, 3702, 3483, -3426, 4013, 3122, 2205, 2686, -314, -2578, -3059, -4091, 612, 1070, -325, -3213, -3819, 3919, 3223, 4044, -2379, 1032, 2024, -3426, -1240, -1948, 1679, 3517, -2451, -895, -1013, -1632, -3739, -826, -3007, -2002, 2997, 895, 1231, -3928, 4070, -1132, 1328, 2494, 2924, -1109, -2093, 3112, -16, -3555, 2846, -2768, -2397, 3782, 1741, -1357, 3796, 2521, 257, -2003, -3278, 3801, 1457, -3454, -841, -103, 496, -1175, -1402, -3683, -75, -189, 2790, -1025, 3581, -3486, 2532, -815, 974, 1677, -2100, -1894, -2242, 2937, 2706, -2916, -3012, 468, -283, 4065, 258, -1617, 1081, 1799, 2229, 2448, -1790, 3319, -3812, -103, 973, -3192, -2254, 1067, 2122, -3976, 3034, 2501, -3128, 3327, 568, 3915, -71, 1075, 1307, 2058, -828, -4074, 1559, 3708, 935, -1230, -287, 1863, 1722, 13, -541, -3540, 2882, 1334, -1649, 822, 3690, -662, 2407, 766, 3690, 1063, -340, -1818, -2246, -1682, 2999, -2187, 1879, 2088, 2432, -887, 780, -3066, -2708, 2114, 2522, -2431, -3452, 3666, -3277, 859, -2038, 1467, -3845, -3380, -3163, 1656, -3639, -1036, -2518, -2100, 1233, -2258, 595, 150, -3346, 1928, 2807, -2231, -4063, -2413, 3382, -896, -3836, -482, 3546, -422, 3352, -3037, 1941, 2054, 3883, -2003, -349, 1382, 1338, 510, -2720, 1577, 749, 750, 1760, 3504, -698, -2150, -3801, 3892, -583]] -t1: [[513, 498, 329, 120, 373, 501, 621, 951, 33, 1016, 221, 475, 18, 775, 663, 111, 557, 906, 281, 569, 189, 875, 579, 942, 369, 327, 161, 610, 841, 981, 713, 616, 460, 419, 58, 732, 163, 95, 866, 905, 99, 873, 421, 198, 1011, 662, 237, 837, 734, 470, 769, 559, 179, 909, 146, 822, 432, 742, 759, 692, 709, 526, 1005, 283, 742, 756, 174, 514, 74, 448, 381, 183, 248, 427, 279, 562, 586, 730, 545, 272, 627, 941, 137, 56, 82, 562, 513, 176, 96, 809, 852, 4, 633, 81, 712, 442, 978, 505, 278, 13, 402, 788, 50, 836, 242, 691, 174, 384, 964, 859, 332, 402, 344, 556, 530, 395, 321, 432, 402, 880, 265, 200, 207, 333, 475, 465, 638, 1020, 713, 804, 309, 688, 943, 714, 415, 640, 915, 465, 363, 848, 24, 326, 907, 911, 492, 460, 587, 162, 322, 861, 479, 680, 79, 974, 71, 827, 146, 696, 836, 525, 449, 4, 272, 123, 636, 108, 868, 473, 553, 127, 960, 1009, 272, 286, 70, 715, 475, 629, 80, 192, 620, 60, 117, 348, 881, 478, 216, 377, 537, 460, 42, 147, 750, 69, 273, 931, 555, 765, 782, 60, 558, 652, 760, 22, 409, 439, 801, 481, 17, 684, 927, 897, 78, 872, 71, 219, 963, 450, 462, 523, 423, 250, 812, 911, 793, 781, 749, 92, 388, 967, 836, 778, 7, 1006, 392, 256, 1001, 684, 27, 476, 676, 296, 780, 77, 806, 339, 895, 45, 25, 329, 762, 523, 885, 662, 409, 458], -[415, 901, 749, 879, 566, 287, 738, 727, 978, 663, 705, 544, 920, 201, 208, 538, 49, 887, 943, 21, 774, 590, 446, 387, 291, 265, 925, 723, 699, 965, 550, 352, 868, 676, 209, 1009, 870, 146, 19, 352, 813, 933, 795, 587, 665, 192, 11, 700, 193, 373, 865, 202, 785, 37, 884, 942, 162, 574, 651, 165, 31, 497, 252, 861, 605, 144, 1014, 824, 448, 907, 176, 971, 816, 792, 781, 280, 162, 309, 456, 419, 972, 658, 371, 471, 424, 682, 368, 527, 377, 88, 351, 3, 454, 303, 1021, 501, 198, 62, 794, 536, 881, 285, 643, 118, 945, 784, 730, 74, 548, 669, 133, 295, 1007, 363, 743, 804, 660, 30, 651, 612, 330, 926, 64, 807, 824, 629, 214, 674, 38, 65, 135, 289, 927, 93, 50, 398, 63, 329, 402, 78, 751, 84, 290, 654, 197, 87, 91, 17, 134, 705, 117, 333, 844, 259, 267, 638, 339, 439, 708, 681, 355, 734, 575, 491, 928, 328, 509, 406, 208, 750, 876, 772, 243, 845, 353, 599, 135, 91, 981, 848, 74, 912, 461, 511, 359, 648, 693, 151, 361, 409, 889, 104, 470, 456, 164, 1004, 806, 6, 1001, 919, 687, 656, 555, 1002, 376, 883, 307, 49, 22, 762, 912, 253, 807, 306, 718, 998, 588, 927, 602, 446, 918, 651, 424, 405, 927, 460, 558, 946, 209, 611, 545, 610, 873, 467, 709, 987, 273, 819, 619, 418, 975, 828, 449, 172, 960, 132, 899, 969, 297, 977, 724, 182, 322, 148, 286, 248], -[983, 631, 807, 48, 168, 321, 339, 143, 540, 452, 269, 277, 580, 979, 274, 35, 952, 708, 255, 962, 578, 329, 881, 298, 487, 372, 440, 138, 585, 1, 139, 957, 530, 477, 611, 846, 209, 795, 383, 34, 339, 574, 325, 595, 194, 723, 521, 610, 818, 441, 936, 868, 604, 488, 51, 50, 496, 851, 698, 260, 696, 598, 488, 552, 562, 941, 802, 494, 146, 711, 307, 449, 271, 239, 306, 759, 844, 267, 571, 618, 925, 582, 310, 29, 466, 402, 542, 292, 35, 748, 435, 614, 909, 567, 472, 831, 109, 582, 113, 547, 858, 683, 186, 655, 236, 216, 794, 782, 433, 525, 865, 472, 938, 560, 500, 895, 881, 166, 737, 736, 526, 63, 109, 567, 905, 177, 607, 736, 256, 636, 391, 833, 119, 339, 485, 722, 436, 349, 865, 781, 148, 708, 1004, 724, 790, 513, 10, 309, 636, 20, 879, 162, 949, 531, 987, 683, 517, 755, 774, 823, 63, 410, 220, 185, 793, 916, 110, 121, 462, 184, 410, 880, 162, 723, 766, 579, 331, 511, 335, 950, 500, 679, 991, 378, 142, 210, 326, 832, 453, 422, 546, 741, 500, 224, 199, 20, 556, 1019, 153, 89, 470, 587, 135, 478, 840, 191, 296, 789, 21, 628, 386, 705, 265, 766, 511, 348, 470, 277, 599, 481, 410, 631, 718, 427, 444, 649, 131, 976, 988, 171, 186, 786, 296, 907, 868, 32, 425, 287, 423, 1008, 855, 907, 647, 410, 148, 163, 883, 640, 892, 749, 861, 937, 638, 979, 794, 938], -[745, 562, 707, 604, 237, 938, 269, 171, 88, 616, 120, 727, 757, 829, 153, 947, 565, 755, 242, 439, 784, 858, 239, 689, 945, 572, 163, 422, 599, 885, 692, 554, 890, 807, 575, 752, 739, 274, 40, 2, 667, 485, 102, 739, 108, 516, 813, 596, 525, 462, 464, 616, 488, 852, 759, 659, 800, 442, 108, 76, 207, 108, 834, 338, 399, 171, 259, 417, 38, 301, 35, 363, 263, 1005, 69, 110, 128, 754, 591, 675, 991, 24, 874, 194, 115, 697, 1006, 92, 1023, 257, 30, 444, 416, 947, 112, 418, 9, 404, 624, 258, 840, 874, 1017, 598, 652, 941, 192, 367, 912, 477, 199, 392, 267, 964, 999, 438, 420, 984, 562, 200, 382, 375, 162, 50, 873, 134, 259, 70, 939, 499, 648, 442, 280, 840, 1014, 737, 391, 537, 665, 391, 281, 604, 944, 508, 845, 693, 44, 325, 531, 773, 389, 156, 505, 316, 687, 802, 883, 406, 636, 476, 673, 798, 300, 386, 65, 516, 914, 105, 37, 757, 669, 669, 650, 324, 668, 693, 627, 570, 185, 345, 505, 987, 370, 843, 443, 424, 706, 831, 554, 694, 881, 739, 302, 39, 122, 732, 932, 383, 410, 888, 7, 203, 12, 56, 706, 136, 375, 99, 689, 92, 635, 712, 28, 1000, 529, 166, 419, 453, 525, 477, 732, 975, 633, 545, 847, 686, 897, 803, 951, 262, 171, 838, 983, 804, 999, 812, 942, 416, 460, 588, 494, 412, 939, 693, 594, 278, 565, 641, 1001, 561, 896, 781, 477, 632, 621, 333], -[74, 1022, 832, 243, 322, 92, 912, 569, 232, 549, 332, 979, 129, 530, 476, 350, 421, 921, 263, 737, 305, 686, 1000, 409, 921, 105, 803, 643, 997, 241, 220, 368, 74, 881, 1022, 597, 256, 244, 556, 774, 224, 698, 13, 54, 910, 693, 359, 842, 313, 949, 921, 477, 546, 28, 505, 791, 676, 589, 449, 436, 616, 964, 181, 104, 152, 996, 406, 904, 112, 606, 32, 132, 599, 175, 733, 561, 928, 50, 339, 385, 27, 64, 834, 664, 806, 398, 927, 239, 950, 688, 696, 170, 472, 929, 165, 827, 839, 907, 137, 993, 59, 987, 95, 377, 517, 997, 278, 539, 423, 986, 273, 555, 402, 18, 57, 154, 446, 917, 498, 790, 8, 728, 864, 807, 848, 667, 430, 109, 168, 150, 584, 44, 349, 963, 984, 978, 820, 418, 646, 459, 989, 675, 595, 97, 501, 724, 220, 341, 863, 1015, 774, 640, 26, 537, 355, 87, 339, 890, 784, 694, 429, 918, 581, 710, 557, 720, 177, 429, 225, 685, 17, 626, 831, 963, 900, 41, 698, 247, 760, 259, 93, 90, 801, 823, 535, 28, 838, 214, 672, 368, 23, 240, 563, 664, 626, 811, 986, 811, 324, 368, 444, 92, 564, 231, 298, 847, 885, 948, 676, 1004, 98, 369, 582, 314, 697, 438, 682, 806, 31, 1011, 327, 98, 79, 920, 73, 415, 361, 170, 337, 941, 653, 972, 134, 665, 625, 109, 488, 232, 540, 330, 926, 595, 548, 988, 220, 807, 577, 268, 804, 855, 993, 672, 318, 501, 661, 177], -[380, 243, 52, 530, 44, 642, 511, 550, 401, 600, 437, 1000, 96, 571, 528, 11, 143, 195, 123, 270, 204, 615, 305, 741, 866, 769, 497, 496, 608, 845, 786, 435, 328, 629, 130, 689, 743, 432, 1006, 264, 67, 897, 644, 457, 236, 665, 394, 45, 962, 582, 717, 478, 195, 824, 295, 445, 160, 723, 449, 187, 289, 615, 472, 908, 936, 798, 239, 496, 815, 58, 112, 76, 507, 400, 464, 246, 469, 646, 726, 334, 971, 470, 372, 525, 134, 456, 902, 358, 959, 217, 318, 176, 12, 296, 316, 617, 486, 683, 750, 895, 362, 127, 216, 489, 856, 495, 870, 1006, 326, 574, 403, 743, 649, 490, 465, 418, 202, 31, 898, 996, 809, 47, 870, 9, 768, 823, 587, 488, 209, 71, 356, 538, 458, 415, 373, 270, 393, 527, 542, 607, 303, 135, 775, 313, 654, 494, 641, 59, 910, 242, 582, 858, 211, 467, 755, 458, 860, 628, 143, 645, 452, 712, 798, 400, 414, 813, 251, 53, 918, 490, 696, 356, 145, 330, 950, 773, 305, 101, 152, 294, 348, 611, 750, 863, 201, 414, 273, 121, 52, 409, 25, 700, 22, 675, 342, 985, 372, 585, 740, 269, 61, 343, 908, 5, 218, 270, 232, 664, 8, 514, 95, 652, 276, 536, 311, 55, 247, 92, 980, 751, 383, 27, 495, 672, 431, 511, 418, 206, 696, 29, 282, 838, 992, 702, 857, 58, 836, 730, 802, 963, 581, 878, 889, 777, 538, 1004, 745, 65, 908, 617, 251, 184, 873, 983, 470, 24], -[258, 418, 348, 140, 500, 228, 1000, 423, 467, 6, 198, 145, 333, 730, 229, 462, 845, 27, 177, 232, 670, 788, 561, 627, 976, 314, 540, 612, 509, 912, 729, 676, 493, 523, 913, 601, 929, 480, 1008, 832, 362, 216, 657, 435, 42, 650, 669, 321, 880, 962, 486, 276, 321, 523, 201, 135, 257, 363, 222, 614, 610, 790, 160, 615, 579, 770, 414, 28, 129, 633, 575, 473, 373, 14, 466, 315, 804, 288, 818, 751, 1016, 296, 466, 187, 880, 236, 427, 791, 643, 365, 672, 936, 882, 53, 317, 787, 841, 618, 59, 227, 294, 62, 418, 778, 522, 587, 894, 586, 877, 872, 574, 612, 646, 191, 518, 511, 889, 54, 338, 750, 255, 104, 768, 358, 812, 785, 789, 378, 581, 20, 178, 117, 251, 512, 826, 171, 90, 787, 750, 109, 527, 109, 848, 99, 643, 6, 611, 461, 373, 739, 354, 999, 633, 534, 322, 501, 12, 223, 220, 150, 506, 699, 746, 244, 1014, 28, 954, 1006, 100, 225, 88, 848, 575, 262, 708, 854, 791, 699, 564, 489, 326, 727, 222, 430, 608, 39, 837, 639, 773, 676, 898, 763, 8, 862, 1006, 360, 681, 1018, 541, 934, 345, 370, 732, 325, 110, 562, 1012, 904, 757, 781, 939, 797, 801, 840, 853, 793, 962, 491, 599, 237, 963, 84, 735, 706, 584, 448, 276, 1012, 592, 450, 210, 465, 504, 63, 836, 24, 1021, 490, 182, 411, 346, 744, 48, 293, 760, 699, 58, 735, 840, 196, 805, 535, 171, 486, 945, 699], -[893, 420, 313, 17, 1000, 518, 641, 311, 700, 686, 543, 920, 574, 71, 703, 1017, 787, 650, 189, 571, 903, 663, 758, 570, 197, 760, 333, 601, 117, 881, 528, 530, 490, 541, 848, 33, 751, 740, 584, 974, 738, 367, 531, 372, 306, 808, 696, 534, 1021, 937, 836, 411, 377, 91, 261, 293, 870, 582, 485, 417, 785, 692, 580, 437, 930, 364, 488, 674, 732, 726, 645, 450, 329, 286, 419, 47, 136, 560, 115, 648, 797, 545, 699, 635, 525, 94, 342, 259, 582, 793, 192, 589, 582, 350, 770, 422, 513, 492, 377, 354, 388, 877, 793, 572, 534, 349, 621, 128, 118, 460, 983, 179, 586, 118, 608, 594, 665, 13, 443, 407, 568, 120, 267, 796, 192, 943, 954, 276, 944, 278, 679, 778, 99, 1019, 930, 374, 799, 708, 432, 777, 45, 404, 193, 925, 815, 910, 895, 122, 735, 560, 1002, 430, 419, 555, 162, 488, 642, 803, 247, 995, 985, 358, 649, 819, 173, 896, 272, 414, 285, 449, 335, 558, 579, 958, 679, 1011, 833, 747, 404, 711, 282, 122, 117, 283, 764, 440, 812, 822, 444, 833, 61, 138, 578, 659, 41, 803, 343, 45, 98, 537, 1023, 124, 787, 768, 351, 288, 374, 157, 742, 759, 553, 164, 448, 505, 178, 427, 517, 508, 470, 174, 152, 280, 736, 96, 397, 15, 332, 464, 128, 476, 682, 740, 1012, 624, 710, 775, 879, 971, 836, 414, 546, 1010, 684, 73, 489, 410, 418, 30, 67, 112, 820, 193, 726, 260, 366, 791]] - -tr: DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E049 -pk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B401CA97141E75D5D7E6ED21E0DFCD76121C7CE91B2D2A9E518EBDAC3DA4EB711D158A9849579F2C9ACC8DA603B7A37C2176E263A45D9A31F35BDA4ED1DE5A17F08BB3342E89CDB0997B2FADC53AD8FE46E6D2EB8A804A00D7D72DF8AC76918C4A6A1B224473B69E080E52C818202C60A44C3501794681AC6ED2E767510392512C03D1F2CCEA0A60C46FCD946458B128E16241C12619DC0921F34C53DB45E727FFC9925C13ACAF2BFB19A09347B716D41818B5F8E3EC31B7A4284275FD1DAA4F387FC4CE92E04A7483C11100D11E7CB241767629FE017CFC107964C4B2DBD50905306CF2500757717B874D5E1932A7C224EE1611D1E82BF6EB300F2E328AAF0599DD16727811B0FA79E04EA07DC436C30BE7DC82A7E9C3F2E31937DC2E17841D4FB4C207B88F1840E9B3BA0177A4A2C47013264FF5770B1924A5EF82755B9A99729F15DEEEDB367E24EEB5D25F1A2C889827038D8631DCFD7A05063BE9DB602325D4F9B4BB166F225864931A4DFC664B3201582D97BEF1929902B300AFC1D415B632119740B7EBA2F8B868291FC4C74FD75D42623FCEC02D0ECBF23063DC3046A2D484DC68CC4B3AD775A8A90AD7837961F1D500C6BDD47F7DC6F8A03186717734A81DB143ACAD1224765AC849EFAF752EC9947AB028994A790EC4C938D7698DA826047148489F772183633F24259913EF522192A3C55CB1450486045B47534C0FB4909F53DD466CAA6379FBE37AA023D59F65D0B8CB36C1F3341DD695876C513DD44A40DEDC7F67215AEB25696596371AD621470AFB261B90FEE5AF42BAA2FA78CD3D530C16E80B793F27CBE4ACF94C7EAEA56F962F8A5A659F33E7A2ECD18C19A298694F57ECF611CDBCA668CFF31C1C2BC0133278F229454FAD2D4251E2113ED7DF79320CA80435D5231C12D75045444E2FD108B813FB8FF0422615B74AE7D1859B224906B048EF127637A6D3D16CFC970853F958D494C24C9BA09832E7863AD95CA237830CF04DAD2B41B85A891E8A32B62EB27B921C3B53700FBD23D3BD4C2FB4A39A9D1B695307D249E6214923B03B9B998DDF88DDCF6D1819C7885AAFAACBA3EC60A3B1C3B135183676AAC348DFDF719B122EB80EFED0C68D89C7F225B800F17958D0774C559EB4B4751576C39410CB3EB51607A8404D7C52F0B628B54FB8FDAA05CE6BF0CD3F68C64D2E1953EE461ECEE1A219DCA24CEBEF904BFDF794EDF49DFABD5E8E486314D0C5992662B9F481730C052CEE9F4916D62D79887748FF8252C515D02958B009F9FB1F57D6557465789ADDE9EC6ABC253A08F4DCAFA28BC4282D4E3608A97D741AFC572F7EA866948C3237A07CB7DB75EA7E4EAFB1EAE9CA382C97EDA8DED02A58A089C7B5F5F69CC9EC35CE2BCF6D106BFD4EACB1F3388A6957D64DAB8A7A9FFC23BCE34A8482009B9667C6B86C10D832950D3A071D9AE8517DEFA420EBC60613CFB021B4548FAD32506826B434C25A07B55F841B80C8FBE4A8DF63A0B63073E4EA3E17FF07E4016FA0CD0E8768095006A74048AB9DBF958CB60ECC5B9077770C620B117FBE6DA4612F23327EDD258A0C691B329011ABCF87A86E18216D7FB8876598E9611971093B7F4DD7CA425113165C1827F9F1F4AAC8735BC62777A17ACC9260411028791A25D4DB69A78A12C569AD73EA984B56F96D2FD7D2BBA126ECCF2ADA1AF7B82E9DA007B7A4FFA519DE072CC3000EC22272D718B172B127B21CA01FA129A315D76077DC3E9F67884FBB1AF8C8B71BB48AD1D7937C3ECBAE83C61C93EE71B67AAD525A5463A0E9C70878C3DDE1D966534AF80FF43C427101798EE894C8D4F48148C89D57A5657E50B831B98A7E6699A731F2A0E5C7C30D5C4AC4ED7F9500D1C3A2C1E0E8DA800D8ED77A96D239D59E7977227290DFC5A436191C6D68125F0B1A98906F19E2707809022157BED26D8CA0CB3055601B002134A6263BF6F93BB6C38AAB2AD8855ECACE472F9E48F83B6CFF455E05966FD186A7691FD18A9249908326BE552E9FC508600BF6C9506FEA5A1BA85882240B5D0D8FBDF4348B66E872DD8F3A6518F551CB4D555FDF6F30A01A6438D61553E90DB1ADAD595EA4B12D421B4B6BE1B41A819C3F0F4F780ABADE83EF405D6811F2CD177260B435A0C275013C33622AE7CADAAF4C145CBC7141E3392A3D5D37EDA4B22F465C46EA94AB6DAA9AFCC1FC4789F104E6497C96962A51B5DE28F386641A671BE8A1C3A1529E4F4922F7DC9C1C2443245F1D3EA83ED557692C7CCD4383842C08FA9F899161591BFA60EC08E1028F0CB38743CC9C1953B962071C1F7C60362DF16C48D52948ACE7C2E63E4243044E6872EC64AA580BC21BD9AC77C3E07C526FA04C1BDC2E219D891DE3A87BFC0E7C2FEB000713FB41069D3DD5196AAD53CB5B475783862067B859BF67E3132C0CA0C4539AE6ADEAEEDF6AFD814D7A58BF67B6FB46F938D9B989AA179D68CA7C2038F929BF60760200DFBC247AD11C419686CA7D569743893DE8E1972F1D72704E8EBA17E80E8ECB63A4D6D34C37AF725CD3F948A1C421EB31649EB5BC4F0D96AB872B599128657BC131958189495C8DE9EED7C97816511E34649601AF168C6A55F67425496E433D5CC57801DA38840EA60808F805A3146178D30DF77041FDBB7F6DF01EA8AFFD279A33B876A091D1E0FB9AB50E446B2BF2F045BA9D77C21AB29F6E108CA7B90F2E695F6F1D060289C61523F49183FE69D319604C244D695B8E734D6F100B3A9E521CE39CD0EBC42199FD419E2DA9ED2D187996A183073FD06A6113E96C2A28DA6950700B6F1E45412D98CC2101ADE58D99625A0CCA99430AEC190781E4F96376753920DD4E248324F3BBF8A324DD2E70B3B3DAC583B6052AEA72D7D0D3C449ABB9C33826F9209AC20A2EE9B7926DA3ED239986FE62E07F79DB2095BBFFA001B0592C475CB15E4552204B1DFB00A8F32A5A4CEC6E1B0FB601F518831A306673758D2BD6F9795A28547D0C7CC38D25FAEDAA2E3DF673A0BBFB64848305D43F1A44ACD517EF4A637A465DEB8D6B609E50F49F05932AF8BE0878ED3E5AA9EADFA1E959C9C56D516EC8483FE2F536BC7AC721235D75C6C2AF77653BC353F1ADB048024711FD500A274D74F8FD403406FDAB67CB665AA10B4349F8EEAAC3B7481353F285AB9817FBAE7D93965304E81B18E84DBCBAFA21E63E1EF16BFE132BDACB8E875F6AAF8EC5E0DB549675C40DA184EA75087508EF928BA4F3E2BE35215D32A18CAB85FDA74EF466796D515049661B595E6811D34A646DA2B3859EA8DC5A5BA870497934DA0B88C03807A21D87B8EB9E0D7A61D54046660C4C93467A25B06901B297975884B59D318F1676D52620763077FD2C4ADA01A6949936B0DB6538E2B110C7C0BCAE3B45B05B74AAC263EC2FBA5D1F130B5BC22D50164CE72F3BFEB71EDFC2A8BE6BA3AD280A7A828E7CCFF8D99B95E8CCAD000E91671D05F7948B43FA7EEAFC41AF4BD9B11AE951C746FCE2C6B2CDBC05DD8322424E9AC2C857B5204686FFF33131C05F81645727E6DE9B2229C0E527CB6A05F2679D2B9860042E188D3DC014748070A72AB9F4C369ECC16F2F4FB46722CACF6A12E969269A0743C0417330D612E4D6C5 -sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt deleted file mode 100644 index 8df751a9a..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-1024.txt +++ /dev/null @@ -1,53 +0,0 @@ -Key Generation -- ML-KEM-1024 -z: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C -d: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C - -rho: 30052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B -sigma: 889827B5C3F8C203A48974ECF1CAD9CB2BFE5F87EBA26F585BBF02AC89176D2A - -aHat: [[[1652, 2709, 763, 2938, 1546, 2812, 478, 1643, 2699, 3011, 80, 152, 2846, 2573, 2671, 382, 1188, 1272, 2324, 1034, 1267, 1818, 2144, 2478, 2843, 2676, 2244, 1278, 2717, 2408, 1897, 2639, 2481, 781, 2925, 1506, 7, 1056, 2984, 2660, 3088, 2597, 578, 1579, 628, 3025, 2972, 2376, 3307, 1208, 1112, 2414, 2516, 286, 2978, 2668, 614, 2095, 370, 724, 2983, 2724, 1214, 728, 551, 826, 2744, 2417, 1999, 1540, 1055, 378, 1369, 2764, 3108, 2801, 1962, 373, 1856, 2283, 324, 834, 2121, 556, 1, 2100, 2203, 591, 2729, 2066, 1406, 2540, 2258, 2177, 2625, 1717, 791, 2880, 836, 2708, 905, 651, 811, 154, 262, 1018, 3009, 60, 1648, 92, 840, 1552, 2757, 1412, 1897, 1441, 983, 1683, 3313, 1330, 1288, 1630, 2284, 3144, 1038, 3244, 1610, 354, 1945, 1578, 2309, 1091, 1881, 2674, 1253, 905, 2869, 1686, 2600, 82, 1434, 2382, 2771, 87, 663, 1390, 1547, 2663, 1989, 5, 1488, 882, 3131, 933, 1649, 1516, 1832, 141, 1582, 1438, 2470, 716, 151, 781, 3045, 3312, 2271, 3090, 1235, 761, 3272, 1157, 1707, 2185, 66, 1214, 655, 430, 1771, 2217, 2222, 741, 358, 2928, 1325, 3222, 2696, 818, 1342, 825, 1070, 2540, 374, 2469, 2990, 2717, 1272, 2211, 878, 1355, 173, 2303, 2390, 2158, 1532, 829, 2634, 811, 1838, 812, 841, 760, 3151, 2392, 2594, 3217, 561, 3163, 37, 529, 3170, 2221, 3191, 1694, 873, 1880, 2071, 2460, 1896, 140, 2316, 2480, 1419, 1261, 3184, 31, 1114, 1447, 3318, 2221, 1601, 2732, 1451, 504, 2698, 80, 716, 2138, 2815, 387, 2871, 2115, 1732, 3062, 7, 2013], -[1814, 3075, 1364, 2326, 2782, 1230, 1232, 3219, 2519, 287, 972, 562, 908, 217, 1149, 1377, 117, 2774, 3169, 2260, 1907, 2670, 997, 2736, 2936, 3288, 1602, 563, 1987, 1760, 405, 939, 1338, 58, 3053, 597, 188, 122, 2583, 3121, 2142, 1170, 1294, 27, 2263, 2034, 1286, 2297, 27, 2873, 2087, 3118, 786, 1370, 271, 1822, 2446, 1803, 1262, 3283, 2316, 2874, 666, 322, 1288, 1377, 2592, 1481, 1902, 3026, 2224, 1162, 412, 62, 1255, 1701, 646, 2379, 984, 1324, 86, 1394, 3159, 3217, 297, 3214, 1775, 224, 1211, 1689, 3219, 1238, 2832, 1472, 780, 791, 2068, 2175, 512, 1092, 3179, 1491, 1925, 1155, 1475, 1718, 1518, 2788, 2326, 1701, 290, 1324, 1269, 69, 1429, 1600, 2173, 2777, 3232, 1623, 62, 1683, 495, 1874, 1180, 2961, 1213, 515, 2100, 2066, 956, 2085, 2189, 2267, 1718, 28, 127, 2729, 1719, 1773, 855, 1141, 3278, 2240, 2496, 2034, 1352, 2506, 1490, 1826, 2498, 2023, 1520, 3215, 3279, 2406, 2761, 1950, 678, 408, 488, 2901, 2410, 1445, 2383, 1429, 644, 3033, 1460, 2388, 374, 2267, 1380, 63, 172, 2726, 803, 1599, 1886, 1025, 1569, 2498, 524, 3227, 2984, 1514, 44, 2340, 2516, 2693, 2254, 1294, 2879, 1998, 2702, 242, 1931, 1111, 3182, 682, 2301, 2044, 1972, 380, 90, 405, 1024, 1188, 866, 1395, 505, 2727, 1152, 3231, 412, 1908, 2840, 2030, 2785, 2578, 3305, 1310, 2011, 388, 1321, 12, 1264, 1758, 274, 900, 1998, 1261, 1271, 3265, 540, 36, 1910, 2520, 213, 352, 283, 139, 0, 363, 2048, 1945, 2466, 2287, 3085, 1636, 996, 2390, 3156, 2946, 113, 2175], -[1514, 2850, 3241, 3269, 252, 2471, 2422, 2055, 2274, 1913, 2400, 2995, 1555, 3061, 3285, 3116, 1030, 82, 3145, 1455, 2641, 1402, 1888, 3293, 1285, 2872, 891, 2921, 2097, 1545, 2014, 1326, 2677, 1729, 1590, 2450, 2907, 2271, 1668, 865, 1278, 2849, 2672, 2257, 1484, 2148, 900, 700, 2760, 2472, 685, 2963, 3257, 1272, 2867, 1589, 2955, 3263, 2704, 774, 3118, 584, 568, 3061, 2231, 3201, 229, 2718, 3062, 584, 2849, 2412, 694, 2647, 640, 3270, 390, 2610, 664, 1495, 2429, 3053, 2549, 2419, 818, 2609, 2339, 2026, 1548, 1134, 2454, 2876, 2505, 2552, 378, 1157, 831, 816, 3166, 1638, 3104, 976, 2329, 2103, 4, 764, 1211, 2090, 3229, 2114, 2933, 60, 2659, 1302, 1511, 2460, 786, 1183, 1358, 1956, 3287, 1821, 1273, 912, 2532, 2368, 1188, 2003, 1173, 3293, 236, 1869, 1242, 3291, 2992, 1419, 3117, 2527, 1453, 2844, 2778, 2646, 2881, 2216, 559, 2669, 772, 1769, 694, 2330, 1002, 1417, 2725, 729, 3306, 1594, 2677, 2035, 3155, 727, 727, 2996, 1625, 1651, 699, 799, 2698, 2601, 2737, 1563, 3098, 335, 680, 12, 1980, 702, 2465, 979, 983, 1048, 2206, 1920, 2646, 2249, 2964, 2629, 298, 2961, 421, 2314, 2903, 321, 2198, 1927, 338, 1780, 1364, 2710, 1835, 823, 2269, 925, 113, 267, 472, 1423, 3087, 11, 2467, 2293, 2263, 1801, 277, 2138, 919, 3113, 2740, 1935, 964, 502, 781, 1649, 2970, 553, 264, 2051, 1190, 1389, 2909, 865, 2662, 1132, 3019, 2770, 3311, 434, 515, 3051, 1592, 2082, 2140, 658, 2595, 566, 3199, 2974, 1778, 1182, 2, 3126, 1278, 1678, 2056, 2101, 1642, 2578], -[2612, 1718, 2853, 989, 2686, 2869, 3278, 2056, 1801, 2774, 793, 476, 276, 3297, 533, 2268, 2306, 507, 32, 1470, 889, 685, 341, 1131, 2929, 1698, 880, 869, 1720, 470, 375, 380, 2541, 1818, 2951, 792, 1033, 2912, 443, 2128, 271, 2744, 1407, 1252, 2667, 544, 3091, 2378, 1892, 1686, 3278, 517, 399, 1573, 1942, 1037, 82, 2526, 958, 2031, 405, 2959, 3169, 204, 625, 2736, 2397, 3148, 1093, 2058, 752, 2022, 3196, 890, 2625, 1031, 2472, 564, 3162, 39, 2309, 714, 2743, 2724, 826, 2890, 1984, 540, 993, 2822, 2741, 1082, 2047, 1620, 2134, 1405, 1282, 2771, 1473, 1882, 2709, 106, 1206, 1946, 1978, 2538, 2256, 1975, 1434, 1651, 537, 900, 2005, 430, 2270, 994, 1757, 2700, 784, 2957, 1675, 2139, 3278, 845, 1405, 86, 3136, 3069, 1535, 3263, 1259, 2131, 341, 105, 1790, 1957, 1727, 631, 2150, 3150, 1981, 2673, 3190, 496, 635, 674, 1617, 2193, 2236, 3192, 1049, 2757, 3203, 2301, 1627, 298, 145, 2531, 700, 828, 1875, 414, 3245, 965, 1563, 1234, 3106, 1618, 2638, 2177, 2684, 2123, 2569, 95, 1793, 2361, 2453, 196, 251, 2301, 1851, 1988, 837, 2740, 937, 1798, 183, 2702, 198, 205, 26, 2505, 641, 1472, 3271, 1467, 2649, 1098, 30, 1524, 1406, 185, 14, 1364, 1047, 1584, 2182, 1160, 2381, 1045, 2472, 17, 630, 730, 612, 2248, 1098, 2496, 181, 2113, 690, 985, 2370, 2211, 226, 1994, 1459, 1645, 2771, 3277, 2230, 2953, 22, 3135, 2967, 1519, 488, 1299, 430, 2557, 2757, 146, 2268, 467, 2096, 2182, 2013, 2743, 1869, 1117, 3326, 769, 3106, 397, 137, 291]], -[[550, 1346, 65, 3260, 365, 436, 431, 1333, 2159, 1739, 1199, 294, 671, 361, 2154, 927, 83, 42, 1028, 402, 3223, 3057, 2718, 2237, 2211, 3109, 565, 2834, 1914, 1935, 1455, 1284, 1244, 1584, 565, 258, 1972, 1700, 1897, 2505, 1257, 2436, 2975, 364, 352, 1334, 736, 3195, 2843, 575, 1460, 448, 2038, 692, 1703, 1059, 2382, 1490, 328, 1689, 2641, 2478, 820, 1548, 2185, 2674, 2416, 3258, 2095, 1639, 2470, 1326, 2538, 1620, 3227, 3296, 726, 567, 1549, 1617, 687, 1984, 12, 1173, 2507, 3017, 688, 1109, 703, 247, 891, 997, 2290, 1086, 2760, 2816, 998, 2921, 2657, 2914, 595, 1186, 2536, 864, 918, 2592, 2904, 809, 700, 2929, 2200, 402, 1605, 263, 2440, 1177, 1306, 2056, 2898, 1111, 1710, 1997, 2983, 1924, 903, 1204, 642, 2756, 751, 691, 455, 3129, 1921, 3137, 584, 2230, 1115, 278, 2811, 395, 1598, 3137, 2356, 142, 1226, 3060, 1647, 3031, 498, 1150, 441, 334, 1432, 609, 2878, 1227, 1778, 1888, 2070, 3279, 1866, 208, 2755, 3175, 153, 3246, 2089, 2556, 1811, 928, 1197, 746, 788, 2953, 1564, 2364, 3022, 2833, 3112, 2502, 3080, 1981, 1585, 1254, 3083, 2670, 151, 2749, 685, 1836, 248, 1297, 203, 1234, 3246, 434, 630, 793, 1119, 3228, 1903, 725, 3218, 2536, 1421, 2918, 2480, 1757, 2321, 1641, 2463, 2715, 1621, 2726, 1373, 2081, 244, 1724, 1758, 1041, 158, 3223, 1646, 2191, 2393, 2520, 658, 520, 17, 1519, 2102, 2603, 637, 3020, 2618, 2201, 3015, 2870, 354, 1936, 2557, 2835, 793, 36, 3212, 1246, 2680, 2975, 283, 2555, 2631, 1941, 2649, 2085, 633, 1263], -[322, 638, 1997, 309, 2643, 406, 3306, 1544, 101, 1685, 1366, 3197, 2937, 1799, 707, 1050, 1924, 3217, 2258, 2127, 1995, 2877, 2495, 1081, 521, 1575, 1341, 57, 2552, 1379, 976, 1729, 2626, 2455, 819, 3014, 644, 1176, 561, 747, 2500, 1358, 2911, 794, 3100, 218, 2730, 975, 1001, 632, 918, 1903, 357, 2755, 2644, 581, 2686, 2692, 55, 888, 65, 2497, 178, 2829, 1162, 1635, 427, 3065, 3157, 464, 3006, 1286, 2396, 2168, 628, 602, 220, 578, 1060, 2274, 2057, 762, 2517, 1550, 3138, 2931, 207, 3327, 2323, 2556, 1208, 1573, 281, 1964, 850, 1708, 2369, 2183, 566, 3024, 1668, 140, 3161, 1117, 79, 1929, 1056, 742, 1685, 489, 1608, 2611, 271, 1645, 3175, 206, 2278, 2206, 1791, 2933, 2768, 3096, 1571, 3210, 2759, 1361, 934, 785, 3116, 136, 1433, 613, 220, 2890, 2745, 1577, 1661, 676, 1296, 2236, 567, 303, 2945, 1198, 2992, 1425, 2762, 1312, 683, 1146, 1207, 1707, 1142, 2796, 2202, 184, 174, 1986, 1031, 1002, 1772, 3020, 1211, 1255, 250, 848, 2432, 2272, 1378, 764, 750, 523, 1310, 1146, 1692, 662, 1993, 691, 273, 1055, 2359, 2521, 806, 1438, 3036, 2348, 3017, 1499, 2933, 2416, 497, 3175, 524, 3312, 2248, 1895, 410, 3259, 1996, 681, 3093, 543, 1088, 1890, 2657, 2648, 2157, 1074, 893, 634, 358, 1859, 608, 1233, 1481, 1745, 3327, 1090, 2564, 1013, 1373, 2318, 3261, 432, 2784, 180, 15, 1956, 2500, 359, 297, 1724, 2404, 2740, 1306, 2973, 2027, 2479, 1947, 2957, 3234, 1838, 2792, 2873, 2814, 1430, 1925, 2999, 2932, 509, 1153, 2091, 808, 1612, 2441, 1342], -[2804, 2793, 2684, 2670, 3135, 2888, 2598, 244, 1960, 480, 3315, 1827, 3014, 782, 1090, 1338, 1933, 995, 3035, 1184, 3324, 417, 198, 746, 1283, 1082, 3039, 1804, 2478, 550, 1206, 1513, 2837, 2730, 807, 57, 746, 2764, 381, 2421, 144, 3315, 2507, 1487, 1443, 1796, 1426, 401, 1108, 2236, 1377, 2427, 307, 542, 1667, 1305, 949, 766, 483, 3130, 3145, 2579, 570, 886, 2129, 2242, 1613, 240, 1463, 351, 3180, 1201, 2740, 781, 3251, 2702, 1764, 1046, 1481, 2888, 2517, 1703, 86, 521, 3078, 2558, 1949, 2410, 1568, 94, 1013, 717, 247, 378, 1952, 1927, 3240, 1392, 782, 3023, 2299, 2478, 1758, 2049, 1710, 3092, 3288, 2593, 1307, 142, 253, 139, 965, 2649, 3034, 148, 2296, 2432, 1096, 2630, 2340, 2238, 2577, 1850, 658, 1307, 2354, 2113, 2006, 1606, 2597, 1571, 2255, 900, 827, 1446, 1876, 3157, 1619, 1027, 188, 989, 2942, 2544, 1386, 1188, 2152, 405, 857, 2565, 1080, 2485, 2802, 254, 219, 1104, 1268, 2522, 1923, 1201, 880, 1130, 1647, 2094, 1792, 3079, 2208, 1577, 1380, 1838, 95, 3022, 3212, 10, 2613, 1079, 85, 2584, 2995, 2772, 991, 929, 2480, 3203, 252, 1570, 919, 2028, 2938, 1477, 2124, 3055, 71, 2687, 2058, 472, 1450, 2294, 3208, 1597, 3015, 2778, 1364, 885, 3003, 721, 634, 3293, 2239, 193, 2675, 3292, 2241, 1013, 396, 764, 2677, 399, 1287, 3282, 2695, 741, 1292, 685, 898, 1101, 2217, 1212, 3132, 1561, 3252, 2329, 2746, 1506, 2007, 3205, 1905, 2177, 1918, 1337, 231, 2530, 1817, 1486, 3086, 3278, 765, 2573, 2295, 2667, 1970, 1762, 588, 2410, 1184, 2318], -[1066, 1563, 2850, 1114, 1007, 2546, 1986, 44, 1719, 974, 2071, 3199, 2394, 2627, 3052, 398, 969, 228, 2661, 2231, 1429, 2042, 135, 2096, 2188, 925, 219, 290, 520, 200, 1983, 1203, 1408, 221, 3309, 2579, 2969, 1439, 3189, 2629, 17, 2245, 2609, 2462, 2363, 2342, 2781, 2824, 365, 826, 2457, 2887, 2586, 970, 1467, 2273, 3085, 2760, 1074, 370, 3166, 1207, 2684, 1012, 2601, 1118, 2237, 3167, 2590, 2677, 1843, 1439, 532, 279, 2557, 2890, 1497, 3032, 302, 822, 2774, 476, 1731, 118, 1270, 1931, 1778, 654, 554, 2135, 1882, 2658, 2467, 1593, 2621, 1646, 3322, 861, 555, 2359, 940, 708, 3157, 2440, 691, 1526, 378, 1709, 1977, 2639, 2704, 2698, 1377, 1228, 2951, 1411, 1947, 1144, 1231, 3020, 2677, 686, 1423, 820, 2296, 2265, 1956, 2072, 1703, 1506, 3098, 842, 1575, 2905, 1311, 2494, 2502, 3119, 1650, 612, 1749, 999, 1293, 2558, 1788, 2612, 223, 2401, 2847, 724, 1873, 2791, 3264, 1623, 2037, 2871, 386, 2840, 807, 2928, 2527, 2828, 754, 1359, 610, 2350, 2819, 512, 1198, 178, 1332, 1548, 984, 496, 892, 2599, 531, 2252, 2437, 1891, 2311, 1479, 1441, 1509, 1675, 402, 1669, 435, 708, 531, 1761, 3132, 1390, 1254, 139, 902, 3300, 3161, 3317, 2413, 2877, 1298, 1532, 1989, 2446, 1919, 1686, 465, 1972, 1929, 2209, 424, 2154, 224, 1231, 2702, 1772, 1218, 1344, 62, 1619, 2557, 187, 1222, 2996, 1431, 1851, 2399, 2976, 1863, 66, 829, 350, 1321, 2616, 2218, 2319, 2242, 762, 212, 664, 1806, 142, 2739, 441, 2362, 449, 2371, 14, 1276, 1829, 692, 1964, 1140, 1891, 2619]], -[[2969, 364, 2109, 2109, 944, 2810, 685, 936, 2351, 942, 3308, 2687, 3264, 2404, 2898, 3092, 197, 3253, 3039, 1696, 3118, 1362, 2478, 824, 131, 1304, 3297, 1659, 2575, 1044, 2588, 434, 1853, 695, 2046, 1330, 1920, 1817, 2042, 1862, 85, 1906, 1526, 455, 356, 1132, 311, 274, 530, 2967, 2344, 1542, 2241, 972, 2078, 3201, 246, 3316, 2083, 803, 2794, 2479, 336, 1961, 256, 1555, 977, 1824, 406, 137, 214, 76, 934, 565, 829, 1875, 929, 657, 2453, 2004, 2087, 2357, 3079, 1666, 1331, 998, 2255, 149, 1473, 3229, 1403, 2448, 1707, 1669, 1533, 3276, 2592, 1923, 610, 171, 2653, 1755, 1461, 1410, 733, 754, 2210, 989, 68, 1132, 2770, 85, 846, 517, 2035, 2926, 1293, 3260, 3022, 2349, 2388, 2678, 720, 1663, 1136, 3251, 2820, 1869, 1909, 1917, 803, 1541, 2507, 2545, 1979, 3058, 333, 2800, 2125, 183, 707, 224, 194, 3064, 1183, 1180, 1473, 1418, 1777, 1888, 1194, 3309, 664, 461, 1616, 2693, 2108, 1873, 1762, 2683, 1165, 641, 2678, 3123, 1182, 1304, 35, 2739, 1252, 951, 1590, 840, 431, 1041, 801, 2808, 2362, 2429, 3017, 2184, 1038, 3280, 2569, 1505, 465, 2804, 1476, 1565, 445, 161, 1878, 939, 1343, 1321, 3163, 1499, 762, 3091, 2383, 271, 544, 1682, 2329, 1278, 1476, 2296, 1642, 2425, 216, 1671, 2340, 2779, 80, 2074, 1357, 3048, 3026, 1090, 2633, 501, 2202, 2825, 2754, 251, 2418, 321, 2937, 1061, 700, 1757, 405, 776, 2517, 2604, 2297, 2399, 1517, 602, 69, 1149, 546, 1629, 978, 1161, 3019, 3245, 596, 2371, 2783, 922, 868, 1828, 1011, 2876, 2194, 1324], -[605, 3270, 1954, 1889, 816, 2873, 3317, 2439, 1484, 10, 1401, 480, 750, 1630, 1261, 2894, 1537, 585, 2060, 1720, 689, 167, 3118, 2117, 1891, 1343, 2247, 2293, 2963, 2725, 295, 826, 2165, 457, 1534, 800, 15, 1560, 1613, 18, 1278, 615, 658, 764, 1759, 1900, 2730, 867, 1718, 2447, 1058, 1082, 3131, 1375, 454, 323, 3292, 2084, 2344, 1914, 392, 2533, 2710, 2623, 1101, 1525, 902, 1585, 1182, 144, 2408, 941, 1478, 2665, 594, 525, 2070, 16, 3091, 2952, 674, 2445, 1922, 2188, 1088, 2951, 1149, 1683, 582, 2391, 1402, 470, 1157, 3296, 1644, 64, 222, 1674, 2554, 1300, 2680, 252, 2116, 2860, 2650, 2779, 1538, 990, 1107, 2635, 445, 3196, 1724, 1318, 2298, 194, 1210, 1719, 1914, 1697, 1510, 2725, 1152, 1256, 2778, 228, 1002, 1033, 1814, 1964, 3083, 2496, 1330, 1627, 1511, 3024, 813, 2026, 2485, 2479, 614, 418, 2968, 1559, 737, 666, 1221, 294, 1398, 417, 82, 362, 1809, 1570, 1869, 2532, 3020, 2954, 720, 2568, 1621, 2879, 482, 2602, 115, 2279, 1977, 2530, 1873, 2981, 2859, 2195, 46, 1816, 1722, 1440, 1565, 612, 2994, 852, 3315, 1549, 1037, 407, 543, 1367, 1913, 1584, 120, 1034, 2850, 2383, 1734, 3135, 2075, 69, 2728, 2146, 1138, 1133, 1603, 902, 2910, 877, 917, 2455, 1082, 539, 2108, 3038, 3166, 2452, 349, 1694, 1681, 1521, 3157, 213, 1189, 2326, 3308, 2460, 1286, 376, 2344, 2709, 2542, 936, 1959, 1549, 2227, 842, 2523, 2345, 406, 805, 593, 497, 1398, 1396, 2357, 146, 1444, 2060, 2618, 2452, 1684, 131, 1969, 2807, 2545, 3324, 866, 838, 2643, 2820], -[3074, 946, 699, 2360, 3284, 869, 2741, 2437, 403, 138, 1479, 3100, 1659, 794, 1730, 1410, 1659, 1924, 2899, 3125, 2395, 2904, 495, 1586, 902, 737, 395, 1954, 434, 1671, 550, 2737, 2514, 541, 2529, 771, 679, 187, 1290, 2656, 1169, 2201, 1620, 1640, 2949, 626, 1693, 2041, 2679, 23, 1627, 957, 1937, 3140, 1007, 1177, 1029, 1386, 1437, 255, 1715, 2096, 2140, 3282, 2835, 3102, 2220, 3253, 3288, 2311, 2584, 1433, 483, 1167, 2153, 664, 1387, 2578, 3116, 3171, 2304, 2681, 1453, 1536, 626, 1647, 2189, 2760, 3134, 1012, 185, 2069, 532, 2209, 3090, 1122, 19, 163, 2718, 132, 2075, 796, 2073, 3196, 2119, 2662, 2339, 2385, 2895, 1772, 1401, 1128, 152, 1561, 1013, 2488, 13, 2187, 2155, 936, 2275, 1749, 102, 1524, 3120, 1219, 1256, 372, 2263, 1886, 959, 621, 1065, 925, 768, 742, 2948, 1238, 2255, 92, 150, 1670, 3324, 1392, 763, 2795, 2843, 949, 1497, 1763, 398, 70, 2841, 2547, 2491, 1320, 2328, 82, 761, 1763, 3107, 1419, 370, 2524, 2667, 3272, 2041, 792, 385, 869, 103, 1282, 503, 2951, 41, 813, 1683, 1899, 2667, 2252, 1887, 779, 192, 2493, 3256, 2260, 2628, 2734, 2317, 2915, 1483, 869, 985, 2107, 61, 2273, 809, 466, 1603, 2916, 2543, 3108, 865, 94, 2696, 1213, 1277, 2696, 674, 2416, 1972, 1388, 2193, 3089, 1189, 795, 2503, 1671, 3111, 1827, 2094, 556, 1585, 69, 2416, 1811, 1675, 3012, 3179, 3242, 124, 2227, 818, 2940, 216, 1151, 1997, 2070, 246, 1955, 2409, 1996, 1279, 951, 2576, 2178, 1884, 1016, 3308, 2614, 303, 2956, 96, 2249, 2331, 2642], -[2345, 807, 563, 1066, 1579, 1614, 317, 261, 674, 1044, 3238, 1330, 1482, 1880, 901, 2270, 2513, 2257, 1636, 869, 2410, 2277, 2542, 951, 2777, 1161, 548, 1812, 168, 674, 1375, 499, 169, 2052, 1243, 2911, 758, 1518, 900, 678, 142, 3063, 335, 968, 947, 190, 1913, 2847, 1250, 1866, 3056, 1092, 2627, 3255, 664, 1583, 1784, 2454, 2131, 1933, 1196, 1688, 909, 3257, 1365, 851, 1262, 2352, 2464, 663, 1514, 2634, 669, 22, 1610, 2040, 1159, 1714, 499, 1388, 2654, 3090, 2542, 1951, 1604, 2515, 1000, 850, 2970, 2874, 1273, 1301, 1883, 1091, 875, 2189, 3144, 439, 2364, 1662, 1898, 507, 2927, 550, 1415, 113, 399, 1726, 3068, 2799, 289, 1040, 2578, 298, 260, 2581, 1007, 2457, 2794, 889, 2573, 2914, 1382, 1941, 619, 2300, 1533, 2698, 707, 1471, 1473, 2151, 14, 655, 1569, 2909, 2369, 3123, 708, 1190, 2025, 1351, 1085, 3021, 1197, 672, 2710, 2010, 1832, 2327, 2061, 1735, 156, 1742, 890, 179, 1182, 1813, 37, 3306, 713, 1251, 3117, 2084, 3099, 2895, 2171, 1954, 2197, 2587, 81, 41, 2295, 650, 370, 2149, 1976, 2025, 2921, 2562, 3043, 2887, 1516, 80, 720, 1344, 373, 744, 1835, 3299, 3260, 12, 467, 1840, 638, 67, 2152, 1866, 192, 387, 3039, 1371, 1095, 2653, 837, 1681, 2058, 1527, 2924, 593, 2474, 2083, 412, 926, 3266, 3065, 701, 1439, 2678, 2344, 3058, 1880, 1698, 2916, 1214, 698, 2859, 2608, 862, 1165, 1053, 480, 1567, 2899, 3046, 2962, 2717, 10, 207, 318, 1383, 1784, 972, 2996, 3242, 174, 3154, 339, 178, 1667, 725, 2915, 1265, 883, 639, 1905]], -[[2365, 1266, 2849, 1275, 548, 561, 1179, 2946, 687, 1099, 2510, 1315, 1438, 2146, 2139, 3288, 139, 3246, 2153, 123, 3115, 1287, 1993, 775, 201, 787, 49, 308, 269, 946, 375, 2129, 767, 1699, 2139, 959, 2959, 2141, 2145, 2681, 2594, 1879, 784, 2516, 2582, 3169, 2886, 2278, 3147, 2971, 1923, 271, 342, 2002, 332, 1386, 2954, 468, 2997, 1087, 1574, 1637, 1068, 281, 2390, 196, 3271, 3318, 663, 3027, 1928, 3164, 2294, 1543, 459, 1702, 2518, 371, 1612, 3081, 3163, 795, 3265, 2508, 3082, 669, 619, 2344, 222, 145, 225, 1602, 742, 348, 2075, 1794, 243, 2857, 1571, 1413, 345, 2659, 1408, 3008, 1022, 470, 457, 933, 1851, 792, 1015, 584, 763, 1668, 2289, 872, 320, 409, 1703, 2836, 46, 2937, 2667, 2075, 2149, 1966, 1755, 437, 1843, 1898, 1686, 1170, 743, 3054, 647, 395, 1672, 1333, 65, 665, 2435, 2133, 2227, 2249, 1211, 1782, 2706, 2030, 2923, 453, 99, 2365, 2452, 2565, 1333, 1762, 292, 485, 626, 736, 1601, 1599, 1779, 1014, 1964, 2591, 2180, 1877, 1835, 2109, 2418, 596, 9, 1309, 1890, 404, 64, 1433, 1348, 389, 1775, 2945, 3034, 3293, 1702, 2862, 72, 1654, 600, 1061, 2456, 2448, 1906, 590, 1943, 608, 1685, 3139, 3047, 2248, 2493, 933, 2476, 1683, 1885, 787, 2348, 542, 2071, 2213, 1807, 2371, 1054, 2942, 63, 2026, 2238, 2692, 3007, 1133, 2669, 2217, 1865, 132, 1424, 991, 2629, 2114, 2353, 988, 2469, 1482, 3309, 1476, 324, 1517, 2860, 684, 2483, 2030, 3273, 1606, 844, 263, 3222, 2916, 484, 3135, 130, 2728, 2211, 406, 655, 3093, 197, 3193], -[1712, 1394, 145, 2844, 1948, 2192, 2370, 513, 2183, 2290, 2056, 2771, 2563, 853, 2403, 2026, 1086, 2065, 1238, 1455, 2215, 304, 2203, 495, 1533, 2888, 965, 1635, 500, 1487, 2013, 2375, 2036, 2000, 2839, 1638, 2278, 3134, 348, 3008, 2404, 914, 1821, 2713, 1155, 1851, 421, 279, 2313, 1096, 175, 2157, 3000, 564, 1670, 2428, 1902, 1705, 3009, 385, 3316, 3151, 1442, 2501, 1764, 512, 2838, 1490, 934, 3216, 136, 1071, 18, 85, 1628, 2685, 537, 588, 2786, 2331, 2683, 1023, 62, 3141, 1856, 2911, 1166, 2158, 152, 336, 1760, 1158, 2198, 2721, 1298, 1070, 337, 2277, 969, 815, 2317, 1358, 3247, 2107, 20, 1832, 696, 1135, 2555, 1022, 2254, 831, 1816, 1057, 3062, 683, 1264, 1502, 3311, 1865, 2802, 606, 14, 888, 1297, 1122, 571, 2968, 288, 1014, 2922, 1087, 1637, 3151, 74, 486, 1663, 1565, 2503, 878, 2585, 1898, 547, 1500, 645, 733, 1120, 2309, 1789, 1921, 3169, 513, 736, 3138, 1980, 1186, 2148, 949, 2970, 2402, 312, 1148, 1260, 297, 2717, 1516, 1280, 2000, 697, 349, 3220, 3050, 1525, 1574, 3032, 733, 263, 2195, 1045, 3095, 2452, 1619, 1128, 1644, 111, 2168, 39, 1699, 2666, 1544, 2845, 985, 2846, 1853, 2182, 287, 320, 426, 2158, 2292, 3131, 1519, 1120, 1319, 1974, 2875, 2684, 2308, 3133, 77, 3209, 1927, 404, 986, 2135, 2576, 169, 2499, 333, 1720, 1293, 695, 1486, 1470, 1089, 3167, 2412, 53, 2799, 2423, 2450, 3245, 437, 2724, 1249, 1404, 2004, 871, 1813, 553, 121, 1390, 713, 478, 3198, 2283, 282, 2391, 945, 135, 1423, 2407, 1598, 597, 933, 1708], -[354, 221, 2080, 3251, 804, 1387, 3049, 56, 2710, 1630, 2480, 1811, 1041, 3195, 2626, 3274, 2785, 30, 2718, 1953, 890, 2750, 1894, 687, 1784, 916, 518, 1460, 1770, 3055, 2914, 1869, 133, 1597, 447, 267, 1985, 225, 2375, 444, 1139, 1324, 2256, 2917, 833, 3125, 1460, 3102, 1848, 1542, 2631, 2467, 2941, 1130, 2903, 12, 1240, 556, 1033, 1161, 1051, 621, 1364, 2550, 2314, 1690, 1176, 1860, 1308, 2842, 550, 2759, 307, 494, 2556, 1049, 972, 1625, 237, 395, 2307, 293, 2621, 1381, 1812, 535, 1591, 39, 195, 1428, 3301, 602, 1505, 2453, 2358, 216, 646, 1965, 1543, 512, 1891, 1687, 1725, 316, 1168, 861, 3247, 1114, 2962, 949, 3211, 2070, 2615, 2693, 3226, 155, 189, 2203, 477, 819, 1655, 377, 364, 551, 1940, 2884, 2704, 2831, 2533, 1099, 1187, 284, 346, 2287, 1431, 236, 3188, 2099, 3302, 29, 2603, 2226, 822, 776, 2037, 2196, 585, 2166, 2966, 1618, 688, 855, 2489, 812, 174, 1221, 1491, 58, 831, 15, 9, 1654, 736, 1996, 2712, 2865, 2057, 162, 1288, 2866, 1368, 3164, 324, 306, 2569, 721, 3250, 375, 57, 1342, 2490, 1421, 377, 1557, 494, 11, 1562, 892, 1332, 915, 1746, 1274, 36, 2471, 1427, 2391, 1327, 1329, 46, 390, 2445, 2152, 3176, 1868, 2831, 1870, 2856, 807, 3001, 3300, 2334, 362, 1147, 712, 3206, 11, 2976, 1392, 2401, 1916, 2246, 2328, 2268, 1670, 52, 949, 791, 911, 1575, 2720, 2983, 293, 1665, 1792, 2998, 920, 2407, 442, 1920, 2204, 1520, 668, 1084, 2588, 1643, 3094, 3178, 1646, 873, 1303, 3115, 226, 950, 381, 1552, 3142], -[2864, 1188, 1418, 1457, 1252, 3318, 531, 2402, 461, 159, 1891, 1633, 744, 1336, 2711, 205, 883, 916, 1815, 1212, 3114, 1381, 2045, 557, 2808, 1461, 2749, 1509, 2502, 491, 2328, 399, 2763, 208, 1072, 1216, 451, 3293, 2945, 3052, 2879, 67, 2180, 1184, 2000, 1534, 2749, 2425, 3139, 2893, 3117, 2580, 2012, 11, 2366, 832, 3264, 2973, 2905, 57, 2431, 548, 2091, 435, 2574, 1466, 57, 627, 591, 2485, 2464, 2641, 238, 725, 2952, 3277, 2062, 1804, 993, 2697, 1415, 114, 2273, 711, 34, 847, 2697, 2394, 2913, 1456, 653, 2849, 138, 2649, 224, 2500, 2097, 77, 1278, 1136, 1607, 689, 2353, 3224, 3281, 248, 2795, 414, 2609, 3216, 961, 2489, 2680, 988, 2596, 1061, 2772, 2266, 1269, 996, 3061, 1473, 373, 1802, 1431, 637, 651, 1875, 351, 317, 2908, 796, 702, 317, 2421, 591, 1893, 443, 575, 3083, 1304, 887, 1312, 1834, 1082, 589, 2385, 1098, 1322, 862, 1974, 1730, 1552, 767, 537, 2304, 524, 1798, 2627, 2330, 644, 2732, 296, 2331, 875, 1402, 2872, 451, 2923, 674, 698, 813, 639, 11, 2256, 3135, 1224, 2430, 2759, 1475, 3222, 2654, 1639, 367, 1966, 404, 2916, 1110, 1374, 3123, 1629, 841, 2582, 2528, 1295, 26, 1476, 1931, 2752, 2170, 3030, 2842, 3309, 2768, 561, 3246, 2396, 3202, 1019, 1043, 578, 1441, 1177, 1047, 2101, 732, 3176, 192, 3109, 2618, 1528, 687, 2795, 1103, 2879, 472, 226, 466, 1802, 1347, 2673, 2096, 602, 1282, 3082, 3085, 1120, 3240, 1802, 1092, 2457, 489, 2875, 1486, 2430, 774, 897, 1392, 2477, 906, 980, 615, 772, 1209, 954, 148]]] - -s: [[3327, 3328, 3328, 3327, 2, 1, 1, 1, 3327, 1, 3327, 0, 1, 1, 0, 3328, 3328, 1, 3328, 3328, 0, 1, 2, 0, 3327, 1, 3328, 3328, 0, 1, 1, 1, 3327, 0, 3328, 1, 3328, 1, 3328, 0, 1, 0, 3328, 3328, 0, 0, 3328, 3328, 3328, 3327, 3328, 3327, 1, 0, 3327, 2, 3328, 3327, 3328, 3328, 1, 0, 0, 3327, 1, 1, 3328, 2, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 0, 0, 3328, 1, 1, 2, 0, 3328, 0, 0, 3327, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 1, 0, 3328, 1, 1, 0, 0, 1, 0, 3327, 1, 0, 0, 2, 3328, 0, 0, 3328, 3328, 1, 0, 1, 1, 2, 1, 3328, 1, 1, 0, 0, 1, 0, 0, 0, 3328, 3327, 3327, 2, 0, 1, 0, 1, 2, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 3328, 3328, 0, 0, 0, 3327, 3327, 1, 3328, 0, 0, 3327, 3328, 1, 1, 3328, 0, 1, 0, 1, 1, 3328, 1, 1, 1, 0, 1, 2, 3328, 0, 1, 1, 1, 1, 1, 0, 0, 3327, 0, 3328, 2, 1, 0, 2, 1, 1, 1, 0, 0, 0, 0, 3327, 3328, 0, 1, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 3328, 3328, 3327, 3328, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 0, 3328, 0, 1, 3328, 1, 3328, 1, 3328, 2, 2, 1, 0, 3328, 3328, 3328, 1, 1, 2, 3327, 0, 1, 0, 0], -[3328, 0, 3327, 1, 0, 3327, 1, 3328, 0, 3328, 0, 2, 3327, 3328, 1, 0, 2, 3328, 0, 0, 0, 0, 1, 3327, 3328, 3328, 1, 1, 0, 3328, 0, 3327, 3328, 0, 2, 0, 0, 3327, 3328, 1, 1, 0, 0, 3328, 0, 0, 3328, 1, 1, 3328, 1, 1, 1, 3328, 3328, 2, 0, 1, 3327, 0, 1, 3327, 3328, 0, 3328, 1, 1, 1, 0, 3328, 0, 1, 1, 0, 0, 1, 3328, 0, 3328, 1, 3328, 2, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 0, 3328, 0, 0, 3328, 2, 0, 3328, 0, 1, 1, 3328, 3327, 1, 1, 0, 2, 3328, 0, 0, 0, 1, 1, 0, 3328, 2, 1, 0, 0, 0, 3328, 1, 0, 2, 0, 3328, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 0, 1, 0, 2, 3328, 1, 3328, 3328, 0, 0, 0, 3328, 0, 0, 1, 3327, 3327, 1, 1, 1, 1, 1, 0, 2, 0, 1, 0, 3328, 0, 2, 3327, 3328, 0, 3328, 3328, 3328, 3328, 0, 1, 3327, 0, 1, 3328, 0, 1, 3328, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 3328, 3328, 1, 3328, 1, 2, 0, 0, 2, 2, 0, 1, 1, 3328, 0, 1, 1, 2, 1, 1, 0, 3328, 1, 0, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 3327, 0, 3327, 1, 0, 3328, 2, 1, 0, 1, 0, 1], -[1, 0, 1, 3328, 1, 3327, 3328, 3328, 1, 0, 1, 1, 0, 3328, 2, 0, 3327, 0, 0, 1, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 1, 0, 1, 3328, 2, 0, 1, 1, 1, 0, 0, 3327, 2, 0, 0, 0, 1, 1, 1, 3327, 0, 3327, 2, 2, 1, 0, 1, 0, 3328, 0, 3328, 0, 3328, 3327, 1, 3328, 0, 3328, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 0, 0, 0, 1, 0, 1, 3327, 3327, 3328, 3328, 1, 1, 1, 3328, 3328, 1, 1, 1, 3328, 1, 2, 1, 3328, 0, 0, 3328, 3327, 3328, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 1, 3328, 0, 3328, 3328, 3328, 0, 1, 0, 1, 3328, 0, 1, 0, 3327, 0, 3327, 1, 0, 3328, 1, 3328, 0, 3328, 1, 3328, 0, 0, 2, 0, 1, 1, 3328, 1, 0, 0, 0, 1, 0, 1, 0, 0, 2, 3327, 1, 0, 0, 0, 0, 1, 0, 0, 3328, 1, 3328, 1, 3328, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3328, 0, 0, 2, 3328, 1, 0, 3328, 1, 1, 3328, 1, 1, 3328, 0, 3328, 1, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 0, 0, 1, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3328, 3328, 1, 3328, 2, 0, 0, 3327, 0, 2, 0, 3327, 0, 3328, 1, 3328], -[0, 3328, 2, 1, 1, 1, 1, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 3328, 2, 1, 1, 1, 3328, 0, 0, 3327, 0, 3327, 1, 3328, 3327, 1, 2, 3328, 1, 3328, 3327, 3328, 3328, 0, 2, 0, 0, 3328, 0, 0, 0, 3327, 0, 0, 3328, 3328, 1, 1, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 3328, 1, 1, 3328, 3328, 0, 1, 2, 0, 0, 2, 0, 0, 3328, 0, 0, 0, 2, 3328, 1, 0, 0, 3328, 3328, 2, 0, 0, 0, 0, 0, 3328, 1, 2, 0, 3328, 0, 3328, 0, 2, 0, 0, 3328, 2, 0, 3328, 3328, 3328, 3328, 1, 1, 1, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 3328, 0, 0, 0, 1, 0, 3328, 0, 2, 1, 3327, 1, 0, 1, 3328, 2, 1, 0, 3328, 3328, 1, 1, 0, 3328, 2, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 1, 3328, 3327, 0, 0, 0, 1, 3327, 1, 1, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 0, 1, 0, 0, 1, 1, 3327, 1, 0, 2, 1, 3328, 1, 0, 1, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, 2, 1, 1, 2, 0, 1, 3328, 0, 3327, 3328, 3327, 1, 3328, 3328, 3327, 0, 0, 0, 3328, 2, 0, 0, 1, 3328, 3328, 2, 0, 0, 3328, 3328, 0, 0, 1, 2, 1, 1, 0, 1, 0, 3328, 3327, 3328, 2, 3328, 3328, 3327, 2, 3328, 3327, 2, 1]] - -e: [[3327, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 3328, 1, 0, 0, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 3328, 1, 3327, 3328, 1, 0, 3328, 0, 1, 3328, 3327, 3328, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 3327, 0, 1, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 0, 0, 1, 1, 1, 3328, 1, 0, 3328, 0, 3328, 1, 3328, 3327, 3328, 1, 1, 0, 3328, 3328, 0, 1, 3328, 3328, 0, 0, 1, 3328, 3328, 0, 3328, 0, 3328, 1, 3328, 1, 1, 3328, 3328, 1, 1, 3328, 1, 3328, 0, 1, 3328, 1, 1, 0, 0, 3328, 3328, 1, 0, 0, 1, 0, 1, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 1, 0, 1, 2, 0, 3328, 0, 1, 0, 0, 2, 2, 0, 0, 3327, 0, 1, 3328, 3328, 1, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0, 3328, 2, 0, 1, 1, 1, 3328, 3328, 0, 0, 3328, 0, 0, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 3328, 0, 0, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 3327, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3327, 0, 0, 1, 1, 2, 1, 3328, 0, 0, 3328, 3328, 0, 3328, 1, 3328, 1, 0, 3328, 3328, 0, 0, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 1, 1, 3328, 1, 0], -[3328, 3327, 3328, 3328, 1, 0, 0, 3328, 1, 0, 3328, 1, 3327, 3328, 0, 0, 1, 3328, 0, 2, 0, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 1, 1, 1, 3328, 0, 0, 0, 1, 3328, 1, 1, 1, 3328, 0, 3328, 0, 1, 0, 1, 3328, 0, 3327, 3328, 0, 3328, 3328, 2, 1, 0, 3328, 3328, 0, 0, 3328, 1, 1, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 2, 0, 3328, 1, 1, 3327, 0, 3328, 0, 1, 0, 0, 1, 3327, 1, 0, 0, 0, 3328, 1, 3328, 3328, 0, 0, 0, 1, 3328, 3327, 3328, 0, 1, 3327, 3327, 3328, 0, 1, 1, 1, 0, 1, 0, 2, 3328, 0, 3328, 3328, 0, 0, 3328, 3328, 0, 0, 3328, 3327, 0, 3327, 1, 1, 0, 3328, 3328, 0, 3327, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 0, 3327, 0, 0, 0, 3328, 0, 0, 2, 1, 1, 0, 1, 1, 1, 1, 3328, 0, 3328, 0, 1, 3327, 0, 3328, 3328, 3328, 1, 2, 1, 1, 3328, 0, 3328, 1, 1, 1, 3327, 0, 1, 3328, 0, 0, 0, 1, 0, 3328, 0, 1, 0, 1, 3328, 0, 0, 0, 1, 3327, 3328, 3327, 3328, 0, 0, 0, 0, 0, 1, 0, 2, 0, 3328, 1, 3328, 2, 0, 0, 3328, 1, 3328, 3328, 2, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 0, 1, 2, 0, 0, 1, 0, 3328, 1, 3328, 3327, 0, 3327, 3328, 3327, 0, 1], -[0, 0, 0, 3328, 1, 0, 3328, 3328, 1, 0, 0, 0, 3328, 3327, 1, 0, 3328, 0, 0, 0, 3327, 3328, 0, 3328, 3327, 0, 3327, 3328, 1, 0, 0, 1, 3327, 3328, 3328, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 0, 1, 0, 0, 3328, 3328, 0, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 1, 3328, 3328, 1, 0, 1, 3328, 1, 0, 3327, 0, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 1, 2, 3328, 3328, 0, 0, 0, 3328, 0, 1, 3328, 3328, 3328, 1, 0, 1, 0, 2, 3328, 1, 0, 0, 2, 3328, 3327, 0, 3328, 3328, 1, 0, 0, 1, 1, 2, 0, 3327, 0, 1, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 1, 3328, 1, 3328, 3328, 0, 3327, 0, 3328, 0, 0, 0, 0, 3328, 3328, 0, 0, 3327, 0, 0, 0, 1, 1, 3328, 3327, 0, 3328, 0, 0, 0, 3328, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 2, 0, 3328, 3328, 1, 3328, 3328, 0, 3328, 3328, 1, 0, 3328, 3328, 0, 0, 0, 1, 0, 1, 0, 0, 0, 3328, 1, 1, 0, 0, 1, 3328, 3327, 0, 1, 3328, 3328, 1, 2, 0, 0, 0, 3328, 0, 0, 0, 3328, 1, 1, 3328, 0, 3327, 3328, 3328, 0, 1, 3328, 3328, 3327, 2, 3328, 3327, 1, 0, 3328, 1, 1, 1, 3328, 3328, 3328, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 1, 0, 1, 0, 1, 1, 3328, 1, 0], -[1, 3328, 1, 1, 1, 1, 1, 3328, 1, 0, 1, 1, 3327, 0, 0, 3327, 3328, 0, 2, 0, 3328, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 2, 3328, 0, 3328, 1, 1, 3328, 3327, 0, 3328, 3328, 1, 0, 1, 0, 0, 3328, 0, 1, 0, 3328, 3328, 3328, 1, 0, 1, 2, 1, 0, 1, 0, 0, 1, 0, 3328, 3328, 0, 2, 0, 0, 0, 1, 3328, 0, 3328, 1, 1, 3328, 1, 1, 0, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 1, 3327, 1, 0, 3328, 0, 0, 1, 0, 2, 2, 0, 0, 3328, 1, 0, 0, 0, 1, 3327, 1, 1, 2, 3328, 1, 0, 3328, 2, 1, 0, 3327, 1, 3328, 1, 1, 1, 0, 3327, 0, 2, 1, 0, 0, 1, 2, 3328, 0, 1, 0, 3328, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 2, 1, 3328, 3327, 1, 3327, 0, 0, 1, 0, 0, 3328, 2, 3328, 3327, 1, 3328, 0, 1, 0, 0, 0, 3328, 0, 3328, 3327, 1, 3327, 0, 0, 3328, 0, 1, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 1, 0, 3328, 1, 1, 3328, 1, 0, 0, 3328, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 0, 1, 1, 0, 3328, 3328, 3328, 1, 1, 1, 0, 2, 1, 0, 1]] - -sHat: [[138, 2909, 2800, 601, 938, 1497, 2777, 845, 683, 3240, 373, 730, 2406, 2510, 3060, 3240, 2373, 2859, 1243, 436, 1986, 441, 2524, 553, 2229, 3023, 1596, 1920, 1876, 1430, 3079, 2947, 1678, 2978, 465, 2875, 1188, 1702, 2405, 3170, 2610, 2622, 839, 1191, 1339, 2110, 468, 1927, 3081, 1188, 3175, 3008, 3137, 110, 1673, 1383, 1128, 741, 1391, 2673, 1749, 3224, 2786, 1702, 1795, 332, 617, 3164, 2879, 327, 795, 722, 390, 1698, 1829, 2700, 2291, 1318, 3205, 120, 681, 1253, 3041, 2663, 2612, 2592, 1442, 3089, 1514, 536, 1639, 2203, 284, 1644, 2754, 319, 1952, 162, 2082, 841, 19, 2766, 1220, 3060, 576, 2254, 325, 1262, 7, 1268, 2402, 1593, 2409, 2037, 3088, 3103, 3200, 2766, 2733, 1649, 2841, 2554, 1051, 1956, 2785, 713, 2736, 2002, 4, 1554, 1650, 2241, 2639, 2448, 2746, 2367, 1581, 1174, 1256, 2697, 2032, 1973, 1665, 1612, 1411, 2908, 207, 2790, 1141, 1098, 2642, 2486, 1078, 807, 2655, 907, 757, 2403, 2626, 1921, 336, 3089, 989, 2667, 1945, 1111, 987, 3288, 3160, 195, 1857, 3191, 1175, 173, 2383, 2550, 31, 3156, 2625, 3139, 996, 1842, 2889, 1698, 2604, 1030, 877, 2036, 1858, 181, 1118, 2537, 1524, 211, 2538, 199, 2046, 731, 1810, 1304, 895, 638, 3133, 2659, 858, 3233, 878, 3154, 123, 2015, 2976, 2132, 796, 2815, 2977, 2808, 94, 527, 2169, 1394, 1961, 542, 3056, 2545, 3050, 1559, 3118, 1764, 1833, 2352, 102, 555, 2182, 3048, 1578, 2032, 702, 2121, 557, 2061, 1971, 1244, 2042, 1563, 998, 2689, 3168, 1140, 1390, 1121, 1382, 3176, 3221, 858, 2681, 2321], -[1113, 761, 1888, 193, 1186, 3185, 3008, 425, 2891, 3265, 3151, 3172, 13, 431, 2320, 337, 681, 3018, 341, 403, 102, 805, 2524, 1149, 2671, 1979, 432, 1399, 3283, 2499, 2702, 1727, 3280, 906, 3265, 618, 1375, 395, 87, 349, 279, 1334, 2598, 236, 1288, 182, 2726, 1039, 3203, 1970, 332, 2916, 324, 1543, 1570, 1323, 689, 2009, 2389, 2876, 639, 1534, 1562, 1963, 922, 3184, 3072, 2120, 3248, 1175, 1574, 907, 30, 3316, 468, 68, 1298, 387, 1652, 3297, 1731, 3238, 1903, 1787, 2976, 1770, 2610, 616, 3137, 1151, 2012, 1773, 2705, 2380, 305, 2494, 767, 3296, 2146, 3106, 819, 2086, 504, 234, 670, 3214, 1521, 2359, 656, 10, 292, 1466, 2363, 192, 19, 3241, 771, 1940, 1138, 584, 2155, 2381, 1845, 2928, 1958, 507, 2755, 51, 2231, 2106, 1126, 2814, 493, 1397, 1337, 3182, 2719, 616, 2670, 500, 1875, 925, 2352, 2174, 2389, 790, 1835, 50, 3198, 2037, 389, 2, 2754, 875, 328, 2971, 449, 1179, 1526, 226, 2826, 102, 850, 305, 79, 595, 1385, 1463, 3212, 1269, 2300, 182, 503, 392, 1093, 3, 309, 1807, 2224, 2982, 1127, 3130, 1712, 1745, 3075, 2092, 1121, 24, 656, 250, 2970, 483, 1524, 3110, 2290, 721, 2728, 2269, 3131, 2243, 2481, 338, 2551, 1005, 2052, 2125, 1292, 1651, 2597, 1973, 1238, 829, 207, 1665, 1240, 1320, 463, 508, 2969, 1985, 2531, 631, 2774, 2796, 136, 1857, 559, 324, 2443, 1768, 3012, 2910, 820, 2144, 2865, 709, 2846, 1074, 3217, 69, 3156, 3209, 2753, 2889, 2830, 1987, 2865, 1057, 97, 2705, 443, 2267, 2363, 681, 66, 396], -[146, 3049, 2663, 915, 124, 2308, 2884, 2179, 1477, 3165, 357, 250, 1514, 1536, 1597, 579, 2634, 2692, 1513, 1474, 1265, 2792, 873, 1445, 2435, 3097, 1990, 1743, 1266, 675, 2783, 1710, 2884, 2887, 2896, 2465, 1132, 1428, 62, 1083, 1511, 1290, 2095, 1733, 243, 2004, 2795, 247, 3011, 1010, 326, 591, 1372, 2405, 480, 3055, 2009, 515, 1404, 148, 2273, 2445, 1883, 1118, 2557, 3062, 68, 2344, 67, 643, 1470, 2386, 912, 275, 1351, 2153, 2979, 724, 73, 1857, 3088, 1211, 1746, 1337, 3095, 1903, 2869, 1586, 909, 2879, 1443, 801, 1616, 2050, 2974, 3139, 3168, 184, 2092, 1243, 2544, 1468, 704, 1797, 383, 2620, 631, 2891, 2917, 1966, 1117, 1190, 1972, 2258, 1500, 2926, 2846, 2866, 167, 1313, 3157, 2869, 1722, 2364, 751, 1520, 1008, 1328, 1787, 2375, 2651, 2616, 1513, 249, 914, 2071, 391, 3273, 1709, 2181, 2118, 325, 2858, 1234, 1523, 2028, 970, 2769, 1092, 2491, 1635, 3172, 2110, 2318, 2168, 2533, 2462, 2715, 2688, 52, 2751, 631, 1647, 2968, 3175, 1414, 2003, 478, 1836, 1800, 2688, 1556, 345, 1922, 2484, 3188, 2965, 3045, 1164, 767, 1841, 598, 483, 1755, 1365, 635, 719, 811, 2920, 529, 2994, 764, 3120, 1898, 2817, 2901, 2625, 70, 273, 1868, 600, 1049, 2094, 934, 1944, 877, 2797, 1217, 217, 1560, 2173, 528, 3010, 42, 1922, 160, 2657, 273, 2001, 25, 1531, 1453, 1825, 2866, 1572, 2318, 1053, 2440, 1132, 1600, 478, 519, 1455, 260, 2479, 469, 3033, 1947, 3143, 1529, 1960, 328, 2502, 2426, 1812, 1711, 30, 708, 2191, 1187, 1614, 3022, 1492, 1, 3186, 3092], -[2681, 3059, 984, 3117, 243, 914, 1137, 2819, 1551, 727, 1466, 2600, 314, 1375, 3302, 60, 115, 3096, 1245, 2710, 2931, 861, 1207, 1796, 2884, 584, 33, 1570, 1910, 2164, 2533, 938, 72, 1816, 1905, 1818, 3164, 2207, 3260, 2539, 2068, 2145, 2040, 2576, 1785, 2125, 712, 1780, 513, 2178, 3197, 1225, 2599, 1694, 1484, 433, 2381, 2900, 2590, 1253, 1450, 2778, 2822, 2698, 2413, 1071, 1769, 2648, 2517, 519, 3200, 1167, 1539, 2873, 1684, 1672, 2299, 707, 3272, 351, 2119, 3252, 1840, 1611, 543, 1792, 1224, 899, 3252, 991, 281, 608, 88, 1032, 1873, 3015, 1151, 1924, 386, 2741, 1220, 631, 309, 531, 1578, 630, 158, 823, 890, 146, 1277, 2543, 2821, 3033, 2479, 1844, 1957, 1955, 333, 1973, 1447, 1797, 1836, 3267, 1589, 2133, 3136, 2388, 1583, 2027, 2308, 3185, 1421, 2113, 1232, 2345, 84, 1181, 1874, 591, 315, 1039, 808, 3216, 1020, 1847, 2085, 312, 2680, 1916, 1518, 3151, 2837, 63, 2173, 2470, 1112, 2581, 3026, 1620, 1319, 2490, 1691, 2385, 1171, 856, 652, 964, 1145, 1478, 463, 819, 3042, 1201, 1380, 1977, 1556, 1023, 554, 1594, 343, 3115, 610, 2719, 3087, 3271, 1322, 2353, 2409, 2825, 1185, 2443, 2987, 803, 67, 803, 2761, 572, 3080, 1361, 3283, 2769, 2358, 206, 28, 2910, 1276, 1986, 2280, 1084, 2290, 856, 1572, 1611, 506, 2860, 1547, 46, 2721, 2800, 869, 2151, 2944, 267, 1061, 612, 3065, 156, 1441, 1241, 1463, 1382, 34, 2291, 1454, 95, 1196, 2427, 2645, 2292, 2511, 1706, 1413, 1442, 1752, 1348, 800, 2945, 2369, 1301, 1213, 1485, 769, 489, 2238, 997]] -eHat: [[1188, 957, 1854, 1760, 2017, 88, 868, 2372, 693, 1472, 2585, 1400, 703, 433, 285, 1530, 1630, 2272, 151, 2609, 1180, 2761, 644, 2679, 2660, 335, 601, 2078, 3050, 1130, 2149, 3115, 1708, 1655, 1728, 494, 2085, 1845, 398, 1935, 193, 1201, 2097, 1450, 1750, 2345, 444, 1826, 2013, 1078, 2698, 8, 1490, 588, 130, 2570, 497, 2623, 1411, 2635, 466, 697, 1232, 113, 935, 957, 2798, 518, 2017, 171, 3124, 2448, 2324, 433, 1140, 233, 562, 776, 2263, 2529, 2292, 2029, 122, 2008, 1839, 867, 138, 1193, 1029, 2575, 2162, 1872, 291, 1241, 433, 1926, 1072, 2199, 2765, 798, 1817, 1096, 3029, 2758, 995, 1389, 2676, 2342, 2735, 2718, 2927, 827, 3324, 262, 1621, 1702, 2966, 2568, 2212, 3290, 1192, 1794, 1833, 2804, 1974, 1438, 537, 854, 2601, 3328, 2472, 65, 3102, 1983, 1985, 1727, 2215, 3125, 1182, 1622, 1919, 781, 571, 2067, 1131, 208, 1586, 3043, 464, 614, 3057, 3259, 432, 1740, 1201, 2758, 3090, 1868, 9, 2816, 335, 1950, 1187, 107, 955, 1508, 1527, 567, 962, 810, 644, 376, 789, 2117, 146, 2175, 1674, 879, 2940, 3181, 1699, 290, 1965, 197, 1920, 287, 3289, 3003, 165, 1990, 3272, 2143, 724, 1268, 1132, 131, 473, 1610, 2858, 702, 2468, 351, 1270, 335, 2578, 251, 2873, 156, 566, 2502, 2806, 764, 2318, 2692, 2792, 2681, 563, 1522, 1042, 1447, 577, 627, 1958, 0, 1693, 203, 2669, 2636, 16, 2995, 1292, 107, 1634, 818, 2654, 493, 2990, 793, 2980, 2797, 1474, 1209, 2521, 3217, 1852, 1183, 1452, 915, 276, 952, 373, 2961, 377, 2848, 1334, 1992], -[660, 1462, 1225, 231, 1832, 1747, 446, 2909, 2260, 2983, 2541, 3043, 1601, 334, 2664, 576, 2804, 1440, 222, 886, 66, 827, 3269, 932, 622, 525, 2296, 2905, 2910, 1715, 975, 3096, 912, 3042, 816, 499, 3290, 1148, 710, 2164, 2767, 3112, 251, 1747, 359, 1338, 108, 3324, 801, 2445, 221, 156, 576, 3201, 2284, 2898, 2066, 2724, 504, 1961, 1593, 1258, 2258, 1285, 919, 510, 3319, 2749, 2221, 871, 3145, 1993, 2248, 1477, 3079, 2211, 1060, 541, 2461, 486, 2779, 2527, 2636, 3035, 1625, 2428, 1154, 1902, 112, 1179, 1357, 2583, 1665, 650, 3121, 812, 2923, 2451, 1643, 1659, 2761, 2880, 2319, 2781, 600, 1259, 281, 371, 1043, 1112, 746, 1141, 1719, 1515, 3002, 1431, 1716, 2137, 1529, 2076, 3236, 2321, 2396, 2645, 3058, 590, 2011, 2822, 3227, 1063, 1030, 423, 2421, 2647, 1887, 1873, 661, 3080, 3053, 856, 1540, 112, 1608, 151, 1822, 2253, 2260, 2572, 13, 888, 2506, 1945, 651, 360, 1111, 1906, 1704, 2273, 2852, 2268, 2021, 1101, 2451, 11, 1018, 2909, 1157, 1102, 2921, 1325, 2566, 2084, 934, 1191, 2414, 1459, 700, 447, 1178, 843, 2590, 836, 1371, 2535, 2327, 247, 286, 3135, 3043, 3282, 3287, 749, 1565, 922, 522, 2734, 2843, 1879, 1602, 1287, 3306, 3003, 1355, 2699, 2926, 461, 3195, 363, 730, 1433, 2374, 165, 917, 2990, 1976, 847, 2761, 2088, 923, 776, 305, 311, 1511, 2786, 2987, 3298, 687, 626, 344, 130, 2444, 2642, 2218, 1765, 2093, 3202, 2462, 3218, 1164, 3204, 1215, 2887, 3254, 622, 2544, 2340, 2047, 1413, 1246, 1099, 3313, 2317, 601, 2352, 411, 2615], -[153, 1005, 2013, 532, 1130, 2665, 1355, 739, 3165, 2693, 371, 3127, 1007, 1010, 2105, 2202, 956, 1878, 1528, 2279, 221, 2621, 153, 398, 1973, 1308, 1451, 80, 3200, 589, 1017, 2428, 737, 3132, 2638, 487, 1023, 1676, 3103, 2390, 655, 2497, 1654, 2329, 1154, 505, 1204, 1810, 1805, 3262, 785, 353, 994, 658, 2437, 1148, 2197, 3229, 70, 1811, 1271, 162, 2431, 2246, 690, 2678, 1875, 2044, 264, 985, 1210, 2388, 308, 2081, 1676, 2471, 805, 2364, 728, 526, 1248, 3246, 623, 2912, 355, 391, 631, 1596, 542, 1146, 1476, 565, 2831, 1362, 2943, 2944, 2544, 390, 2626, 1996, 1103, 3135, 628, 1411, 2217, 1858, 1445, 2566, 1438, 2031, 2535, 220, 596, 1747, 1331, 2503, 86, 779, 3149, 2835, 2958, 2333, 1812, 604, 7, 472, 2046, 1230, 3019, 2780, 1362, 2592, 918, 1585, 1458, 2473, 3249, 2330, 298, 2364, 2580, 699, 3088, 208, 1969, 2024, 85, 2280, 361, 251, 909, 3156, 196, 3037, 853, 2215, 1397, 1255, 2016, 2247, 163, 3180, 1817, 694, 3254, 2878, 2937, 3280, 1957, 2267, 1003, 2286, 3020, 2037, 2688, 1570, 2071, 352, 2374, 3295, 1935, 2634, 2133, 1590, 2202, 2574, 3140, 2541, 1782, 683, 1009, 1293, 2297, 3325, 2875, 2390, 1811, 2168, 2221, 1348, 1140, 1525, 1503, 1550, 492, 508, 227, 1523, 432, 2674, 896, 1324, 357, 2279, 2312, 3028, 907, 892, 3222, 404, 1767, 105, 2378, 109, 2900, 3090, 1661, 964, 3320, 341, 1636, 724, 2551, 2540, 2273, 1818, 326, 3148, 488, 1760, 706, 221, 3306, 453, 1264, 877, 2571, 3193, 716, 290, 3106, 1728, 2563, 892, 920, 2144], -[688, 1592, 214, 3271, 2431, 1606, 831, 1479, 388, 3003, 2320, 1682, 1456, 3211, 2513, 2272, 1060, 1871, 969, 1896, 648, 3000, 95, 3075, 3277, 386, 363, 470, 294, 1239, 371, 1109, 2835, 138, 2534, 540, 2522, 1460, 3243, 2434, 772, 3161, 3184, 69, 2491, 1174, 344, 973, 2366, 1649, 2468, 1888, 2030, 940, 3055, 712, 1197, 103, 939, 1873, 2083, 1011, 3315, 2546, 2746, 3025, 3218, 279, 1662, 2881, 979, 1158, 2828, 846, 1158, 2539, 1638, 2212, 560, 117, 2418, 2844, 2013, 1115, 970, 1551, 1891, 1294, 332, 1761, 563, 3145, 738, 1892, 3232, 648, 2870, 8, 809, 1136, 2962, 2893, 2419, 3060, 1695, 795, 348, 2859, 2331, 2900, 1581, 2299, 826, 993, 1165, 61, 2560, 3189, 1196, 3274, 690, 1564, 207, 3256, 2970, 1760, 1721, 3136, 1601, 2694, 706, 2503, 2281, 1899, 2084, 1341, 949, 2015, 1584, 2203, 1352, 1384, 1812, 417, 1662, 2599, 2747, 1867, 2197, 903, 3188, 2060, 1078, 601, 1630, 3177, 259, 1388, 1220, 1330, 175, 866, 1614, 902, 1314, 969, 1663, 1014, 1733, 2308, 1780, 3041, 336, 3067, 935, 2283, 2630, 2566, 754, 378, 2058, 1559, 450, 475, 666, 1407, 255, 1817, 2301, 2155, 1624, 59, 2518, 2096, 454, 1, 1817, 1957, 1852, 602, 1822, 1713, 441, 3058, 1699, 761, 338, 3151, 1758, 1360, 823, 2014, 967, 2460, 2305, 2457, 581, 3114, 155, 3225, 337, 2637, 866, 2055, 496, 2471, 2985, 2190, 2676, 2213, 2936, 2675, 296, 736, 1084, 2315, 419, 2485, 165, 1288, 811, 296, 2261, 1224, 1333, 212, 132, 987, 3258, 2750, 2510, 1364, 337, 712, 2877, 766]] -aHat * sHat: [[2509, 65, 2803, 1938, 2517, 130, 780, 1456, 1710, 2897, 2632, 206, 2222, 1377, 281, 188, 1646, 1437, 1397, 693, 2361, 432, 433, 1853, 2559, 3145, 1827, 1581, 2872, 2857, 1481, 771, 79, 900, 1054, 654, 2518, 2823, 2717, 121, 1805, 842, 2412, 2876, 1846, 2327, 2737, 1696, 3282, 938, 2467, 2146, 3162, 2040, 1422, 3259, 1492, 813, 2104, 788, 74, 1714, 589, 522, 356, 1978, 2852, 1744, 1355, 1629, 1549, 2462, 109, 641, 1787, 1186, 3008, 234, 2719, 1125, 2418, 2371, 989, 2567, 2821, 2765, 844, 3211, 2329, 17, 1930, 2225, 2726, 1266, 2860, 185, 397, 1023, 1960, 3303, 3081, 1488, 1182, 12, 3135, 2583, 2960, 1142, 2103, 2273, 427, 2172, 437, 2889, 1326, 1249, 1197, 415, 451, 3116, 204, 2203, 1763, 977, 1392, 178, 1879, 3296, 1653, 2351, 337, 715, 876, 614, 607, 3011, 3041, 2978, 290, 1405, 1653, 3127, 2479, 400, 280, 2364, 3208, 1354, 653, 2828, 540, 2798, 1322, 1238, 1810, 201, 2243, 1455, 997, 2849, 2792, 3048, 2976, 1196, 2340, 90, 1385, 2434, 142, 785, 2909, 1964, 2673, 1363, 1343, 783, 1684, 1128, 2457, 975, 1066, 3219, 936, 2524, 1171, 879, 1458, 375, 1547, 30, 797, 2146, 2668, 2875, 2908, 469, 1581, 537, 2233, 1574, 2653, 2993, 1297, 403, 182, 1458, 707, 1574, 2908, 1924, 61, 2511, 2979, 2427, 2139, 2892, 2317, 12, 1863, 1029, 2977, 232, 1856, 1298, 2159, 164, 308, 622, 777, 1278, 110, 2075, 53, 602, 2071, 3153, 1188, 2864, 2300, 3069, 1683, 2106, 1767, 2426, 720, 606, 85, 2599, 1121, 1081, 479, 3093, 501, 23, 2232, 2098], -[2537, 897, 572, 210, 2232, 2325, 1387, 775, 710, 90, 525, 2028, 337, 17, 1446, 194, 403, 55, 999, 1580, 108, 3272, 1122, 2223, 87, 254, 1628, 685, 971, 2207, 115, 2376, 1808, 172, 3130, 383, 839, 3051, 651, 699, 2169, 1797, 2488, 1839, 2796, 1342, 2781, 326, 1814, 2750, 2071, 566, 1234, 1369, 1969, 1672, 2529, 2526, 611, 1758, 1293, 1086, 2580, 2686, 305, 1446, 1062, 1134, 1101, 2335, 2374, 825, 1170, 3067, 2589, 2963, 767, 226, 1698, 380, 541, 1945, 580, 3275, 1292, 505, 3006, 2175, 936, 1762, 58, 601, 1281, 2612, 787, 1122, 1010, 709, 2885, 1159, 3097, 2951, 1261, 1152, 796, 684, 641, 2114, 254, 2467, 3172, 1802, 2372, 2000, 1055, 449, 865, 2084, 790, 1004, 1841, 1164, 2471, 2075, 1931, 2928, 1326, 3153, 2241, 341, 3111, 1309, 175, 463, 2584, 2710, 2793, 927, 184, 2496, 1891, 274, 716, 306, 3326, 2561, 2985, 552, 1595, 1123, 1198, 2206, 2812, 1713, 1517, 204, 2392, 1559, 631, 1178, 1672, 2249, 1234, 2274, 2316, 1921, 19, 2042, 2009, 1239, 118, 1240, 227, 1241, 383, 2271, 3063, 907, 2712, 1676, 1188, 3196, 2340, 1044, 1673, 1810, 68, 1311, 3177, 2595, 1426, 1713, 883, 2585, 217, 2826, 2840, 2834, 2642, 1455, 1319, 630, 2769, 2696, 306, 2651, 1349, 638, 699, 1428, 2518, 2567, 3112, 2181, 892, 2345, 611, 277, 540, 787, 1865, 1735, 1401, 176, 2015, 2845, 2325, 1442, 3066, 1760, 3096, 2585, 1847, 3098, 1899, 3013, 3013, 511, 2298, 882, 2664, 2613, 1005, 1131, 107, 973, 1277, 3178, 784, 1612, 2523, 3070, 2450, 2506, 1091, 2049], -[1286, 2474, 3112, 1474, 1364, 73, 1088, 2985, 2631, 1792, 2704, 2856, 2219, 3121, 2733, 1009, 1919, 170, 1978, 1755, 2298, 1873, 1170, 2086, 2487, 3196, 2676, 124, 1996, 1409, 2867, 2090, 278, 2976, 978, 352, 2335, 1011, 1617, 2413, 154, 703, 524, 1112, 1297, 1854, 86, 1832, 1767, 364, 93, 326, 2378, 1721, 2619, 1918, 1910, 792, 1415, 195, 1720, 442, 585, 1430, 814, 2148, 950, 3150, 2551, 248, 300, 113, 2210, 3239, 2733, 3110, 236, 871, 1108, 1819, 2916, 434, 443, 95, 1665, 2278, 1861, 564, 259, 1193, 2377, 392, 2864, 765, 269, 2061, 2390, 759, 2932, 3208, 3081, 1817, 671, 730, 2232, 2775, 1005, 1386, 947, 326, 2632, 457, 564, 2842, 306, 2720, 1462, 2998, 26, 76, 818, 998, 2178, 3059, 1235, 863, 2138, 464, 2508, 305, 2325, 1172, 806, 2167, 2414, 2181, 707, 1492, 3202, 986, 1522, 2587, 2389, 2422, 2362, 3025, 1048, 750, 1474, 1506, 561, 2256, 785, 1995, 1803, 2479, 1684, 2729, 920, 2467, 1045, 2941, 1666, 352, 1450, 2104, 2003, 79, 1202, 3052, 1283, 1368, 368, 2651, 0, 1444, 2717, 2244, 528, 3182, 2246, 1781, 1182, 374, 2629, 2137, 748, 0, 700, 1162, 3211, 2030, 157, 3032, 2736, 1949, 2206, 2784, 954, 1091, 2453, 2601, 1851, 1054, 1473, 611, 2299, 355, 1348, 1364, 598, 69, 1358, 2547, 2852, 1053, 1653, 1780, 1099, 998, 3067, 889, 357, 1937, 395, 2587, 381, 628, 534, 296, 2825, 26, 395, 2469, 1008, 2262, 1025, 1, 944, 3035, 1657, 2901, 1125, 1857, 3150, 1075, 935, 1172, 600, 2007, 591, 657, 1267, 113, 2607, 2904], -[1492, 3021, 868, 2511, 2212, 612, 741, 516, 527, 956, 2887, 329, 2931, 235, 1121, 2871, 2234, 2848, 168, 2285, 583, 273, 2453, 2787, 308, 3180, 1259, 83, 2452, 854, 921, 2976, 1043, 2634, 2827, 1084, 1777, 1333, 2958, 941, 89, 630, 2704, 1794, 153, 755, 1741, 3150, 2464, 2928, 3044, 2668, 2674, 198, 2321, 2172, 962, 3121, 500, 2609, 2247, 1648, 2306, 2828, 3169, 740, 879, 2263, 3205, 685, 1918, 392, 304, 2692, 1530, 748, 581, 764, 1906, 2326, 2808, 1968, 2502, 1857, 1177, 1351, 1461, 1738, 1490, 3036, 2270, 2728, 708, 2819, 3304, 878, 2835, 1999, 2785, 3089, 1638, 3225, 1726, 1250, 919, 303, 93, 2273, 271, 2643, 2346, 2748, 694, 2756, 682, 2701, 1563, 1935, 202, 549, 2136, 1819, 305, 3269, 1527, 2651, 2246, 2459, 829, 2887, 2175, 1715, 493, 527, 3041, 3061, 2731, 1034, 1452, 1624, 771, 2293, 1911, 2420, 2167, 2033, 2741, 2052, 915, 1296, 2552, 1709, 2836, 758, 127, 1003, 2200, 1820, 1632, 3021, 1971, 2499, 1329, 1877, 2603, 1366, 1177, 278, 38, 1624, 1455, 1623, 298, 822, 2121, 2852, 2112, 629, 2811, 1500, 870, 774, 963, 1986, 2408, 2541, 967, 780, 899, 1386, 316, 2299, 1539, 1563, 2748, 1273, 492, 1402, 1575, 220, 1279, 3036, 1283, 3077, 153, 657, 3075, 710, 1677, 2587, 1796, 3141, 1175, 1109, 878, 2337, 2597, 2736, 775, 1473, 2503, 1901, 2868, 2165, 225, 2380, 2941, 996, 804, 2727, 244, 1976, 2542, 692, 1334, 31, 450, 1993, 3159, 2896, 2919, 1237, 41, 2559, 3026, 697, 2888, 563, 1026, 841, 2282, 2774, 312, 2848, 1008, 1401]] -tHat = aHat * sHat + eHat: [[368, 1022, 1328, 369, 1205, 218, 1648, 499, 2403, 1040, 1888, 1606, 2925, 1810, 566, 1718, 3276, 380, 1548, 3302, 212, 3193, 1077, 1203, 1890, 151, 2428, 330, 2593, 658, 301, 557, 1787, 2555, 2782, 1148, 1274, 1339, 3115, 2056, 1998, 2043, 1180, 997, 267, 1343, 3181, 193, 1966, 2016, 1836, 2154, 1323, 2628, 1552, 2500, 1989, 107, 186, 94, 540, 2411, 1821, 635, 1291, 2935, 2321, 2262, 43, 1800, 1344, 1581, 2433, 1074, 2927, 1419, 241, 1010, 1653, 325, 1381, 1071, 1111, 1246, 1331, 303, 982, 1075, 29, 2592, 763, 768, 3017, 2507, 3293, 2111, 1469, 3222, 1396, 772, 1569, 2584, 882, 2770, 801, 643, 2307, 155, 1509, 1662, 25, 2999, 432, 3151, 2947, 2951, 834, 2983, 2663, 3077, 1396, 668, 267, 452, 37, 1616, 2416, 821, 925, 2350, 2809, 780, 649, 2597, 2592, 1409, 1927, 2774, 1472, 3027, 243, 579, 3050, 2467, 1411, 2572, 1465, 1068, 1117, 113, 268, 2728, 1754, 2978, 3011, 2959, 2004, 3323, 1006, 2336, 3127, 1669, 834, 1303, 3295, 1598, 2912, 3001, 1104, 1595, 224, 2340, 133, 151, 1489, 2958, 29, 2007, 2068, 827, 2765, 180, 2901, 2721, 3091, 1166, 1418, 49, 1712, 2020, 740, 960, 63, 814, 711, 600, 2054, 2147, 1762, 2276, 1792, 15, 2567, 738, 2760, 1709, 251, 1730, 145, 1097, 2867, 3275, 1968, 1790, 1602, 2244, 2880, 1534, 2905, 2476, 225, 859, 485, 1298, 523, 367, 2977, 3258, 793, 944, 1402, 2182, 1687, 1420, 1396, 317, 849, 328, 1951, 2537, 3157, 3315, 959, 2314, 2572, 1789, 1537, 185, 1397, 2033, 852, 2725, 878, 2871, 237, 761], -[3197, 2359, 1797, 441, 735, 743, 1833, 355, 2970, 3073, 3066, 1742, 1938, 351, 781, 770, 3207, 1495, 1221, 2466, 174, 770, 1062, 3155, 709, 779, 595, 261, 552, 593, 1090, 2143, 2720, 3214, 617, 882, 800, 870, 1361, 2863, 1607, 1580, 2739, 257, 3155, 2680, 2889, 321, 2615, 1866, 2292, 722, 1810, 1241, 924, 1241, 1266, 1921, 1115, 390, 2886, 2344, 1509, 642, 1224, 1956, 1052, 554, 3322, 3206, 2190, 2818, 89, 1215, 2339, 1845, 1827, 767, 830, 866, 3320, 1143, 3216, 2981, 2917, 2933, 831, 748, 1048, 2941, 1415, 3184, 2946, 3262, 579, 1934, 604, 3160, 1199, 2818, 2529, 2502, 251, 604, 1396, 1943, 922, 2485, 1297, 250, 589, 2943, 762, 186, 728, 1880, 2581, 892, 2319, 3080, 1748, 156, 1538, 1391, 1660, 189, 8, 2646, 2139, 1404, 812, 1732, 2596, 3110, 1142, 1254, 125, 678, 3237, 23, 102, 386, 2324, 457, 1819, 1485, 1916, 3124, 1608, 2011, 375, 822, 134, 2073, 2628, 2110, 767, 503, 154, 117, 364, 21, 356, 2285, 5, 1501, 1176, 3144, 1601, 2564, 2684, 3324, 1161, 2432, 2797, 401, 434, 1354, 561, 2519, 449, 703, 382, 250, 671, 2057, 354, 1117, 2891, 2548, 1384, 2462, 2448, 178, 739, 2231, 2354, 1384, 915, 2742, 1296, 304, 795, 2066, 3232, 3112, 1215, 1001, 1429, 2861, 1563, 2732, 700, 1842, 2868, 3192, 43, 2365, 1463, 1563, 2170, 2046, 2912, 2962, 1673, 2814, 3012, 2068, 81, 1890, 2211, 1898, 736, 1534, 663, 2886, 2146, 400, 133, 757, 550, 2171, 930, 1753, 2651, 3313, 3324, 1262, 2030, 2711, 2507, 2058, 3051, 1529, 1502, 1335], -[1439, 150, 1796, 2006, 2494, 2738, 2443, 395, 2467, 1156, 3075, 2654, 3226, 802, 1509, 3211, 2875, 2048, 177, 705, 2519, 1165, 1323, 2484, 1131, 1175, 798, 204, 1867, 1998, 555, 1189, 1015, 2779, 287, 839, 29, 2687, 1391, 1474, 809, 3200, 2178, 112, 2451, 2359, 1290, 313, 243, 297, 878, 679, 43, 2379, 1727, 3066, 778, 692, 1485, 2006, 2991, 604, 3016, 347, 1504, 1497, 2825, 1865, 2815, 1233, 1510, 2501, 2518, 1991, 1080, 2252, 1041, 3235, 1836, 2345, 835, 351, 1066, 3007, 2020, 2669, 2492, 2160, 801, 2339, 524, 957, 2366, 2127, 3212, 1676, 1605, 1149, 2229, 1875, 855, 1623, 1299, 2141, 1120, 1304, 2450, 623, 2385, 2357, 1838, 677, 1160, 1260, 1637, 1894, 1548, 448, 3175, 2911, 447, 2, 661, 334, 1242, 1335, 855, 1694, 2198, 3085, 358, 435, 1724, 423, 543, 1325, 627, 493, 171, 21, 773, 3286, 2148, 2630, 1002, 1720, 1133, 3030, 1835, 1757, 1470, 2083, 981, 1703, 2656, 1365, 3081, 655, 2936, 1385, 1208, 2792, 154, 1046, 1375, 1653, 1611, 30, 3159, 1990, 2286, 325, 59, 1359, 2688, 3014, 1459, 2596, 2902, 3148, 852, 1086, 3315, 1964, 1502, 1382, 559, 2541, 2482, 1845, 891, 3323, 2454, 3028, 2282, 1010, 688, 1623, 3175, 2439, 264, 797, 25, 2604, 1965, 1119, 2526, 1878, 1780, 709, 1494, 1393, 1715, 1497, 1835, 752, 2560, 2672, 992, 1402, 1505, 994, 2735, 2046, 3295, 2348, 2042, 1592, 525, 637, 1132, 750, 2946, 1680, 3281, 751, 1351, 3149, 1432, 1466, 2363, 3122, 1102, 2310, 1085, 1952, 177, 1036, 1316, 2297, 368, 2385, 501, 1005, 198, 1719], -[2180, 1284, 1082, 2453, 1314, 2218, 1572, 1995, 915, 630, 1878, 2011, 1058, 117, 305, 1814, 3294, 1390, 1137, 852, 1231, 3273, 2548, 2533, 256, 237, 1622, 553, 2746, 2093, 1292, 756, 549, 2772, 2032, 1624, 970, 2793, 2872, 46, 861, 462, 2559, 1863, 2644, 1929, 2085, 794, 1501, 1248, 2183, 1227, 1375, 1138, 2047, 2884, 2159, 3224, 1439, 1153, 1001, 2659, 2292, 2045, 2586, 436, 768, 2542, 1538, 237, 2897, 1550, 3132, 209, 2688, 3287, 2219, 2976, 2466, 2443, 1897, 1483, 1186, 2972, 2147, 2902, 23, 3032, 1822, 1468, 2833, 2544, 1446, 1382, 3207, 1526, 2376, 2007, 265, 896, 1271, 2789, 816, 981, 2614, 1098, 441, 1803, 2602, 2214, 598, 1718, 1520, 420, 1847, 2762, 794, 1795, 1398, 494, 2826, 54, 512, 3196, 1168, 1082, 638, 2266, 2430, 2252, 2881, 889, 2774, 2426, 1796, 1073, 351, 3049, 3036, 498, 2123, 348, 394, 2837, 500, 1303, 2159, 590, 3112, 2199, 2411, 440, 585, 1359, 1757, 851, 2459, 3208, 2852, 1022, 2146, 36, 2943, 2779, 588, 2335, 2840, 1292, 1771, 603, 3235, 1335, 634, 560, 3056, 1806, 1413, 3195, 236, 1878, 2928, 2333, 1413, 2461, 3074, 619, 1222, 2597, 3200, 212, 1940, 2358, 728, 330, 3202, 1274, 2309, 30, 98, 822, 3101, 1420, 1724, 2806, 1852, 1418, 84, 532, 106, 618, 2619, 1826, 2142, 240, 3183, 1465, 3178, 2521, 930, 1369, 2840, 1209, 405, 891, 721, 1522, 2597, 3186, 151, 1611, 3180, 1322, 2838, 1428, 2418, 2346, 869, 1149, 3324, 855, 401, 1533, 2302, 454, 1030, 909, 3020, 1550, 955, 262, 1463, 809, 649, 231, 556, 2167]] - -ek: 70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B -dk: 8AD0B5F09A25AA935DD9DA34AB82CA75A12D66E99CF48BCA45B9B2DB441BC2971BDC9922B5F8BC3C0678546759073CB88E26BAD1B1B3A4646A6529C632EAA347734A3BE583D47178094C4A670CBC41EC0689765668542E6F15A7D586C9E26A6A03C71469C2C53F7B141B232D86216A25C7A8F36852858C07A9524EE17BA6340AA2A215C1EA852167B6891CC166C2FA13A0270A22983413E0ACC444BF40E28C45E14E07404F62996369597F10FCC180ECACAD1A6719AB9F1B447AE19A2CB02A7D04206172168C4F0A99BAFA932D6649E894A8F0577B81C66483C5B5CF60AE75A444526A9B3674325FBA38F53296421A785011C1DDB3A6997745DB83CD583C0C4177C797D40A4F699F1F40C5413AC4E42373492B6A2C6A406D437F42570B5E949EF4350DEA790CFEB72D1287517FE3273D3CA65A13CA6E23C57BF07DA04B851CF3AFA18BAF5EF020792857A9E721F01B9FEA7B612E4C6E29079366B0228688BE2A067FBE92842DD280B3C74DFAB761E613A8604C476E15466685C695AC35791A9159942F60170CA214C7C09B1A4B1BCC4F4CC60DF01A101915A9A2BC553119665032DCD9476FBA7BB07157D33C9C8EFA6BD0AC38C1AC265FB51857D01517615326CA0E08650BA6FA40832C7B4C41B644716022B652B1927D55C9B37FE25F1AB67A9A03C7008C84B07C4926B6381E40CFD441041235187416CEC366CA6FB76FA0AB6E328A2641FC47DCD76E91CA9431E19BFF02CE6228C2336382F8A10E9EE2C8F1759390A20024A15B3B090C1390CA0343797284246BD8943507B7A6B71FC33A03B7A88366E4AFED515739E5C69F8A266E4A1F53D73930E9875569312B27037E5C7F852100C2BA3648B1B9C1B149F6250E0A6B065213134F302569755B8C5C4FFC680BF7811845340035F170B068BA67A4C3B0166D03CC8261840190A20F9A3B1EF465C2F2182DA8DA8D3B3C8CB12915F7D93E04D8840C3567255A7BD6D433CF1068D88452CFC11F991B7CE37927D6CAAE8810742F42148B896EC4EBB5340386315B2C1E2B43915C04549CC8C19AB40E3B7C311B426110A9BBB18D3B992A42C0189290BE673A397C4090443B88C5D5C565A10FEA05603D36244A4AA8E9255CF184AE69535A8399C1C6F76CF2342ADFEA6A447BB4501B9A6C44593EB043E7A5502F586CF3407DEB7A0FC32B3F46F1245C5596E0F1BED937207C4509E1D8985BE745FD69BF448092433028BE2595903311479586A34B2D49107410BC4BD2965317FC76352B638DF3B3A315325026809E3BC4608C0B2CB84DF0C95BC052707FC1A377B2B465EB7A5D644AB4278DDCE5B61E2BB3A71052555CB3BAC693EF025FF00353FB76945B8AA3E9950F9273818791CCAD56884658142A2B4DF3C57ECA13AD44B49B6346C63EE89078589E9EB9A9804A03BF7A276F86B9676C58D3E71D2C8770804A61592178B449C7955BBE8CF42F316725E3B16D55B527CFB232681B21B2CB2F30AC76015BB5416A0411C1745892412E683A98D736ED1A4CD980617D0821C2AB0282070A611A11D19701FBD55A2127B324E6901D84986C0464DE7120AF4510AF591DD9BB79479C5FA88714C6A99714F76A1E402C8F384A4EE6BCD41500724CC1793ABFD8D3C2F320397134B00F762DBA85A23AF155E6CC037380C1DD64A973DB35B74470448B24212062764787E5A93A48807171A7715CFC89BCBC9E141886F807A1F9D684C8426F0122887D9C4C27EA69CC151B4D49B51E5A4EAAA5AD06ABA86DF942E986A5D5792080FC480396B3948668FB382CC8FC154748CB30B7641F0270C83438B4FC3D1901265880405177BC7F44788251ABC474273531212A66279E70337A2309FDF49E059BBDAF4973A5377A4D517BA755702C37CC355685404C952FB67E0419C78D1584D0949254D04952F7243BF1402803C9FC737325881378CA77EEF5C415FB037D689A5854A1D24B6527A59B9B16959384358C423C79645CCF3133E21B4B64957B14F63F2AA26357B1C262F2A90F7CCC2A15936999B0A1B498AB3B32433032C9CA23081C55D31CAD36E90C1CE0B5FC247CE8C843F2883524B664FAC1B20BE602A10AAF65738680BB10254426F9CB09A1954DB7655622308FAEF505ACB497554A8FCFA96A85255AD846542013B8415951BDD45C01931EBE583E70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271BE6E832F2498CA5A3431F40D3187B1ED965FDD6693B37F6EB408A99977AE496447AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt deleted file mode 100644 index 4badc394d..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-512.txt +++ /dev/null @@ -1,29 +0,0 @@ -Key Generation -- ML-KEM-512 -z: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC -d: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC - -rho: B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 -sigma: AC0901D990F43DD3FBC28234B27082414B64B340950CB71059DC2EE2712BF19C - -aHat: [[[874, 2151, 1834, 1833, 1123, 1560, 1623, 2685, 2968, 1755, 479, 522, 3279, 3134, 2578, 1373, 1613, 1975, 2734, 2886, 2848, 2425, 3302, 1229, 35, 2238, 1168, 1710, 2456, 109, 2249, 2281, 856, 98, 2411, 1748, 646, 2423, 1182, 501, 2636, 3290, 2232, 2204, 1912, 553, 1609, 2800, 1034, 2472, 1002, 2938, 1255, 1057, 2987, 2203, 1005, 3160, 136, 1693, 2708, 2228, 3141, 2666, 1886, 2059, 3154, 724, 456, 2863, 1913, 2237, 1847, 665, 2204, 1641, 791, 3068, 756, 81, 709, 2728, 2207, 1650, 1620, 2345, 854, 2044, 3255, 1014, 1710, 695, 2732, 1558, 1211, 527, 2351, 684, 1557, 655, 2771, 1658, 1508, 3022, 2189, 2389, 698, 365, 517, 1479, 2069, 211, 2498, 303, 195, 2883, 1279, 2888, 1430, 542, 1408, 2098, 1702, 1521, 165, 1755, 2634, 2979, 517, 878, 2569, 1750, 2099, 3296, 2834, 2898, 1754, 3182, 2974, 1779, 906, 2264, 3227, 523, 2593, 124, 590, 1108, 1741, 1521, 2489, 510, 1081, 1153, 531, 117, 866, 443, 347, 2026, 17, 241, 1803, 2857, 1806, 3317, 2301, 32, 2694, 2336, 1767, 832, 2127, 2642, 447, 231, 1849, 561, 3131, 133, 2619, 1571, 1669, 81, 2340, 2208, 2989, 949, 2962, 48, 2159, 1060, 977, 801, 1283, 564, 2120, 1236, 1824, 2651, 1362, 834, 2749, 1383, 991, 196, 2701, 3234, 1294, 888, 998, 679, 1821, 666, 2277, 2962, 2453, 2188, 807, 2175, 2682, 1058, 2254, 849, 1796, 2731, 568, 858, 2107, 2649, 715, 2217, 2404, 73, 821, 24, 1050, 1367, 356, 2395, 2238, 1378, 1125, 258, 2965, 917, 1166, 2616, 620, 1385, 1126, 1895, 864, 2923, 2356, 671], -[3311, 1836, 162, 1739, 606, 1712, 627, 1758, 1002, 3101, 946, 1310, 2995, 1857, 2569, 2796, 1743, 1146, 3210, 168, 94, 1700, 628, 3077, 1949, 1668, 1601, 1698, 835, 814, 2372, 1960, 1896, 1507, 1715, 1590, 1310, 1269, 1591, 2109, 3041, 4, 1484, 779, 341, 1192, 3099, 1440, 931, 2552, 2114, 2837, 1259, 3039, 3312, 1146, 1360, 2275, 1836, 789, 1545, 1665, 2107, 145, 1914, 2633, 1890, 2732, 2083, 75, 2826, 2165, 2518, 1587, 1961, 349, 2697, 1315, 69, 3259, 1570, 447, 587, 2759, 3091, 525, 2125, 2702, 178, 1374, 633, 3177, 2760, 2028, 3214, 3275, 2911, 3019, 3032, 79, 2180, 2971, 974, 941, 3024, 873, 506, 1825, 2951, 3030, 3065, 1523, 30, 2625, 1916, 959, 43, 1866, 3188, 2534, 316, 1647, 2692, 2318, 1881, 1579, 324, 73, 2897, 1170, 673, 1402, 1377, 2819, 2723, 1685, 123, 1814, 2583, 986, 2878, 542, 1762, 1513, 1639, 1309, 3325, 1432, 1284, 2587, 2444, 1861, 2898, 1994, 1878, 2072, 1689, 501, 2896, 102, 2572, 1928, 3125, 1480, 1420, 286, 1988, 2536, 132, 1335, 1795, 420, 1503, 623, 1228, 2807, 2741, 2155, 80, 2800, 2546, 661, 1914, 2439, 1421, 1650, 535, 3059, 982, 1519, 635, 5, 1519, 643, 2693, 2774, 1813, 1940, 3021, 384, 1287, 2782, 114, 2365, 2690, 1973, 289, 356, 123, 1710, 2328, 2540, 2418, 3259, 2268, 1529, 2479, 1824, 483, 260, 786, 89, 1767, 2085, 56, 3052, 3155, 2485, 925, 1483, 2331, 1902, 2798, 2526, 1532, 2792, 694, 3039, 1848, 3173, 1998, 552, 1978, 2634, 2084, 217, 992, 139, 407, 365, 274, 1279, 1682, 782, 2133, 2292]], -[[704, 1581, 1782, 3300, 319, 2966, 3229, 425, 636, 465, 2507, 2501, 599, 2768, 2663, 1274, 2799, 1206, 2202, 1994, 312, 1774, 3064, 2777, 582, 1277, 1448, 2237, 1577, 1039, 1440, 2351, 1103, 1239, 1957, 3022, 163, 64, 845, 1905, 94, 2267, 1063, 2277, 2053, 2900, 1759, 2027, 614, 2596, 1196, 633, 1624, 2855, 2133, 434, 459, 579, 213, 573, 804, 1256, 2377, 3263, 646, 1464, 2950, 1846, 2594, 2737, 746, 1866, 2663, 1472, 151, 2479, 2680, 1863, 2361, 2532, 607, 1070, 2194, 275, 514, 242, 2025, 1254, 3147, 2015, 2301, 594, 794, 1753, 2774, 1728, 470, 1067, 916, 2934, 412, 3062, 1254, 2672, 2712, 2972, 1068, 2144, 2791, 3262, 1345, 774, 2646, 1092, 1905, 3148, 228, 517, 1634, 2077, 2564, 1485, 1116, 2445, 2830, 1978, 971, 165, 742, 1118, 1262, 276, 3221, 319, 1708, 1129, 2544, 1548, 2239, 1855, 1386, 1718, 1449, 1424, 1765, 1483, 1748, 361, 1434, 339, 1651, 790, 401, 2347, 1058, 588, 3088, 1579, 326, 1413, 3050, 3161, 3086, 1880, 253, 1307, 1630, 1074, 1664, 2738, 396, 1987, 714, 1243, 651, 261, 173, 741, 2760, 318, 198, 2501, 2361, 1523, 3066, 2218, 36, 354, 1117, 330, 2148, 517, 1221, 3152, 1845, 1099, 1897, 3159, 3008, 79, 542, 1244, 2627, 2347, 2259, 884, 1088, 74, 652, 408, 3248, 2727, 376, 2805, 2253, 1925, 339, 1447, 1973, 120, 2949, 2273, 1850, 1528, 2211, 2211, 2411, 1920, 2173, 2688, 2943, 2864, 2904, 508, 1412, 1454, 687, 541, 2408, 3258, 795, 3013, 1824, 330, 1047, 1375, 469, 41, 3100, 2334, 1321, 1654, 1849, 2078, 909, 374], -[206, 3093, 1216, 1950, 1396, 3065, 1119, 3323, 2732, 1581, 70, 2075, 1035, 658, 354, 777, 1357, 650, 2033, 2517, 896, 2303, 3237, 186, 2106, 2128, 596, 3180, 1400, 2980, 495, 2122, 843, 339, 261, 315, 841, 2221, 2768, 2702, 1567, 218, 2327, 1797, 1780, 1334, 490, 2946, 592, 2803, 804, 348, 3227, 1956, 885, 3316, 20, 2295, 2938, 1893, 2630, 1058, 2222, 2449, 1682, 1110, 1651, 2703, 1651, 89, 2228, 2831, 2312, 2897, 999, 2236, 3085, 220, 2765, 3270, 2998, 1891, 2798, 3083, 2197, 1517, 1253, 1666, 1681, 3101, 2775, 1721, 600, 2112, 387, 284, 468, 1330, 1440, 1938, 2252, 2404, 698, 2402, 1883, 2558, 1112, 706, 1007, 2571, 2375, 408, 565, 2839, 1182, 1976, 817, 920, 2775, 580, 437, 3071, 2833, 711, 200, 1973, 1621, 3198, 3065, 128, 1765, 208, 2197, 3151, 2237, 706, 229, 2769, 1253, 3268, 507, 1662, 748, 2455, 1707, 2980, 2562, 1470, 33, 1591, 1455, 2926, 1047, 2430, 50, 217, 430, 727, 3182, 2318, 2416, 1565, 2153, 2128, 3106, 2065, 1435, 1245, 1012, 1932, 339, 1886, 3281, 764, 1224, 2563, 749, 2787, 21, 536, 2171, 1779, 392, 1624, 1824, 45, 1676, 276, 3251, 2499, 330, 2474, 1113, 239, 1247, 1242, 2332, 1877, 2354, 2776, 1236, 3186, 1896, 2231, 1648, 397, 2655, 753, 1402, 3278, 1426, 2605, 426, 2943, 1831, 3009, 1896, 2127, 1823, 1368, 559, 1859, 84, 3240, 599, 882, 1729, 244, 2235, 317, 1229, 2630, 2312, 2969, 2388, 2336, 3299, 3151, 1772, 1745, 2530, 494, 2589, 3316, 2421, 1328, 309, 2978, 569, 470, 604, 1655, 2522, 2450, 2711, 2823]]] - -s: [[1, 3328, 3327, 1, 1, 1, 3328, 3328, 2, 3328, 0, 2, 0, 1, 3328, 0, 0, 3327, 2, 0, 0, 3, 3327, 3328, 3328, 3327, 3326, 0, 3327, 0, 1, 3328, 0, 0, 0, 2, 0, 0, 0, 0, 3, 1, 0, 1, 1, 3328, 1, 3327, 1, 1, 3328, 3328, 3327, 3328, 0, 3328, 1, 0, 0, 0, 0, 0, 0, 3328, 1, 3327, 3328, 0, 1, 1, 0, 1, 0, 0, 0, 3328, 1, 0, 3327, 2, 3327, 0, 0, 3328, 0, 3328, 0, 1, 1, 3328, 3328, 1, 1, 3328, 2, 1, 0, 0, 1, 0, 3328, 0, 1, 3328, 3328, 1, 3327, 3327, 0, 3328, 3327, 1, 2, 0, 2, 3328, 3328, 0, 3328, 0, 1, 3328, 1, 2, 0, 3328, 0, 3328, 3, 2, 2, 1, 0, 0, 1, 3328, 0, 3328, 3328, 1, 3327, 1, 0, 2, 3327, 2, 0, 0, 0, 0, 0, 3327, 0, 0, 3328, 0, 1, 3328, 0, 3327, 3327, 1, 3328, 0, 0, 0, 0, 3328, 0, 3328, 1, 2, 3328, 0, 0, 3328, 1, 3328, 0, 0, 3326, 3328, 1, 1, 1, 3328, 3328, 3328, 1, 2, 3327, 0, 3328, 3327, 3328, 1, 1, 0, 3327, 3328, 2, 0, 0, 3328, 0, 3, 0, 3327, 0, 1, 0, 1, 0, 3326, 0, 1, 0, 3328, 0, 3328, 3328, 1, 0, 3328, 3326, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 0, 3327, 3328, 0, 1, 1, 0, 0, 1, 0, 0, 3328, 0, 1, 1, 0, 0, 2, 1, 2, 2, 3326], -[2, 0, 3327, 2, 2, 0, 0, 1, 3328, 2, 3327, 3328, 3328, 1, 0, 3328, 3328, 3328, 0, 3328, 3328, 3327, 0, 3327, 0, 1, 0, 3328, 3327, 0, 3328, 1, 0, 1, 3328, 0, 2, 3326, 0, 1, 2, 3328, 3327, 0, 3328, 0, 0, 3328, 3327, 1, 3328, 2, 0, 0, 3328, 3328, 1, 2, 1, 0, 1, 0, 0, 0, 1, 1, 3328, 3327, 3328, 1, 3328, 3328, 3327, 3327, 1, 2, 0, 3328, 3328, 1, 0, 1, 3328, 3327, 0, 0, 0, 0, 2, 1, 0, 0, 3328, 0, 1, 3327, 0, 0, 0, 0, 1, 3328, 1, 3328, 3328, 3328, 0, 2, 3327, 1, 3328, 0, 0, 3327, 0, 1, 1, 0, 3327, 0, 2, 1, 3328, 1, 3328, 0, 1, 3328, 1, 3328, 0, 0, 3328, 1, 1, 3328, 3328, 0, 2, 3328, 1, 0, 3328, 3328, 0, 0, 3, 3, 1, 3328, 3328, 1, 0, 3327, 0, 0, 3328, 3328, 0, 0, 3328, 1, 3328, 3328, 3327, 3328, 3328, 0, 0, 0, 0, 3328, 3328, 1, 3328, 1, 0, 0, 0, 3328, 3328, 3328, 2, 3327, 0, 3327, 1, 3328, 3328, 3327, 3327, 0, 3326, 0, 3327, 0, 3328, 0, 3328, 0, 1, 3327, 3328, 1, 0, 3328, 3328, 0, 3326, 3327, 0, 0, 1, 1, 0, 1, 3328, 0, 1, 3327, 1, 3327, 3328, 0, 3, 2, 3328, 0, 0, 0, 2, 3328, 1, 1, 0, 1, 3328, 0, 2, 0, 0, 0, 1, 0, 0, 3327, 2, 1, 0, 3328, 0, 2, 3328, 0, 2, 0]] - -e: [[1, 0, 1, 0, 3328, 1, 1, 0, 1, 3327, 3328, 2, 0, 3326, 1, 1, 3328, 0, 1, 2, 1, 3328, 3328, 3327, 3326, 3327, 3328, 2, 3328, 0, 1, 2, 3326, 2, 3326, 2, 3327, 3327, 1, 2, 3328, 0, 1, 3328, 3328, 0, 0, 0, 0, 0, 1, 1, 3328, 3328, 0, 3328, 0, 1, 3328, 3328, 3327, 1, 0, 0, 1, 1, 0, 3328, 2, 3, 2, 3328, 1, 3327, 3328, 2, 0, 1, 3326, 3328, 3328, 1, 1, 3326, 3328, 1, 1, 0, 0, 3, 1, 0, 3328, 3, 3328, 3, 3328, 3328, 3328, 1, 3327, 3327, 0, 1, 3328, 1, 3327, 1, 3328, 0, 0, 1, 3328, 0, 3327, 3327, 3327, 3328, 1, 3326, 1, 1, 0, 0, 0, 2, 2, 1, 3328, 3328, 0, 0, 0, 0, 1, 3327, 0, 0, 3328, 1, 0, 3327, 2, 3328, 3326, 0, 1, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 2, 3328, 2, 3328, 3328, 2, 3328, 1, 1, 0, 2, 2, 3328, 1, 0, 2, 0, 0, 0, 2, 3328, 3327, 2, 3328, 3328, 0, 2, 0, 3328, 3328, 3327, 0, 1, 0, 3327, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 3328, 1, 0, 0, 3327, 3328, 1, 3328, 1, 0, 0, 1, 3328, 0, 3327, 0, 1, 0, 0, 1, 3328, 2, 1, 1, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 0, 0, 3327, 0, 3327, 1, 1, 3328, 0, 0, 0, 0, 0, 0, 1, 2, 3328, 3, 1, 3327, 3327], -[0, 1, 3328, 1, 3327, 3, 0, 1, 0, 2, 0, 3327, 1, 3328, 1, 0, 1, 3327, 2, 0, 0, 0, 0, 0, 1, 1, 3328, 1, 2, 1, 2, 3328, 0, 0, 0, 1, 1, 2, 3328, 0, 3327, 1, 3328, 3, 3328, 0, 3328, 0, 1, 3328, 3328, 0, 2, 0, 3328, 1, 2, 0, 0, 3328, 1, 1, 3328, 1, 0, 1, 1, 1, 0, 0, 0, 3327, 0, 3328, 3327, 0, 0, 3328, 3327, 0, 3328, 1, 0, 0, 1, 0, 0, 3328, 3327, 0, 0, 3328, 1, 0, 1, 1, 3327, 3327, 0, 3328, 3328, 3328, 2, 0, 0, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 3328, 0, 0, 3327, 1, 3327, 3328, 0, 3328, 0, 0, 3328, 0, 3328, 3328, 1, 1, 1, 0, 1, 3327, 0, 3328, 0, 0, 1, 0, 3328, 3328, 0, 3328, 3327, 3327, 1, 3328, 2, 0, 2, 3328, 2, 0, 0, 3327, 2, 1, 1, 3328, 1, 3327, 2, 3328, 0, 3327, 3328, 3327, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 3327, 3328, 0, 1, 3327, 1, 3328, 0, 3328, 3328, 3328, 0, 3328, 0, 3328, 2, 1, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 1, 3328, 0, 1, 0, 0, 3328, 3328, 3327, 0, 0, 0, 0, 3328, 0, 0, 3, 0, 0, 3327, 0, 3328, 2, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 3328, 3328, 1, 1, 0, 2, 0, 3326, 0, 0, 3327, 0, 1, 1, 0, 2, 1, 3327, 3328, 3328]] - -sHat: [[3127, 1150, 382, 1970, 251, 900, 1356, 232, 337, 2108, 2161, 3029, 956, 2610, 536, 3011, 2341, 444, 305, 1090, 1098, 1341, 823, 2979, 2047, 3232, 2945, 1607, 2738, 1068, 2713, 618, 3141, 2980, 1531, 2915, 427, 398, 1116, 1995, 1612, 429, 1017, 2104, 452, 1208, 2848, 2170, 3156, 1311, 847, 114, 1089, 3121, 2277, 266, 932, 2949, 2645, 2042, 19, 3185, 2891, 16, 2789, 2858, 488, 1847, 3215, 634, 1926, 2572, 2909, 950, 50, 1290, 3024, 559, 1593, 3221, 92, 3114, 1473, 1053, 1876, 1978, 2003, 883, 2724, 9, 357, 1069, 2634, 2978, 765, 2725, 3219, 2436, 772, 2345, 8, 1487, 3023, 2232, 1664, 792, 2414, 1072, 1952, 264, 3152, 2320, 2954, 530, 1933, 2947, 602, 2062, 2850, 28, 2868, 1183, 1269, 1500, 920, 3085, 1355, 1447, 2144, 72, 1570, 2278, 43, 435, 1304, 413, 2381, 2334, 1458, 3062, 2452, 2022, 2922, 2068, 2128, 2956, 850, 912, 789, 1510, 1584, 1462, 474, 2322, 1498, 90, 980, 1091, 2557, 3218, 508, 3164, 2311, 470, 2887, 1557, 1148, 2297, 1228, 2840, 2736, 456, 3171, 1000, 2067, 197, 2531, 1925, 2202, 1545, 1765, 2500, 1223, 2821, 910, 1022, 265, 3026, 1519, 2705, 1542, 2553, 1325, 1964, 2085, 206, 1252, 1532, 17, 1198, 2641, 2825, 2955, 2345, 2684, 307, 416, 3320, 506, 241, 3244, 1516, 653, 2380, 1941, 2233, 853, 261, 1869, 932, 2327, 389, 2989, 1349, 2951, 2667, 663, 2785, 1683, 351, 2758, 2256, 2872, 3303, 1343, 486, 2134, 168, 2898, 722, 952, 1302, 1738, 1499, 1043, 1691, 61, 2859, 2504, 864, 506, 3309, 615, 1513, 1899, 3099], -[1040, 1004, 1155, 2002, 34, 2262, 140, 561, 3139, 2913, 146, 2633, 2552, 1434, 315, 591, 797, 1991, 268, 1757, 2933, 1294, 1222, 712, 736, 474, 2510, 1028, 566, 1224, 742, 1315, 745, 1523, 1797, 843, 2885, 290, 657, 2835, 2198, 1184, 2103, 3000, 689, 175, 567, 3117, 2483, 239, 1805, 2605, 2420, 2844, 169, 751, 1991, 542, 1268, 986, 2624, 601, 2555, 2476, 1092, 1901, 1841, 3184, 647, 150, 1601, 487, 3284, 2360, 1065, 2978, 2402, 2144, 1999, 1954, 1827, 452, 891, 817, 829, 1737, 1037, 2541, 783, 1231, 2979, 2090, 1076, 684, 1259, 1438, 710, 81, 1835, 361, 3049, 518, 1982, 396, 18, 1030, 2473, 496, 2411, 1098, 1375, 2052, 2922, 1774, 1592, 1809, 3087, 3063, 493, 17, 582, 2113, 1757, 697, 635, 65, 2684, 160, 2704, 86, 1161, 2715, 1700, 1122, 2715, 925, 2374, 416, 2871, 405, 2386, 458, 3107, 241, 1510, 2043, 2428, 2028, 254, 3021, 272, 864, 888, 3042, 1560, 776, 2699, 531, 2885, 2018, 69, 1637, 3185, 3273, 1770, 2687, 3110, 559, 956, 2456, 3061, 3060, 1994, 3247, 2659, 1851, 3095, 1955, 424, 2470, 2111, 1476, 830, 67, 33, 1648, 1126, 1783, 1614, 1631, 1086, 228, 3164, 1437, 83, 388, 707, 3077, 2083, 1221, 1979, 1251, 2487, 2938, 2179, 806, 958, 2805, 2599, 98, 1431, 3301, 559, 2511, 984, 2379, 1221, 546, 1971, 228, 295, 1524, 833, 2427, 2387, 1429, 241, 6, 1339, 708, 1780, 2425, 1463, 874, 1417, 696, 3262, 3318, 1247, 187, 2376, 814, 397, 350, 34, 2637, 305, 347, 165, 3116, 244, 2003, 664, 3078, 3037, 1025]] -eHat: [[522, 1963, 2339, 1049, 383, 728, 639, 1380, 2621, 1800, 108, 2626, 634, 1542, 1849, 2631, 2057, 2926, 497, 1024, 565, 1356, 2933, 794, 318, 3186, 2569, 993, 2342, 739, 2976, 3282, 3032, 614, 16, 1012, 786, 1595, 196, 15, 2915, 1049, 2749, 1800, 1800, 2324, 3241, 3304, 1155, 2244, 1769, 2734, 3169, 3178, 601, 2361, 555, 2812, 2264, 759, 875, 542, 2092, 2831, 215, 413, 1225, 1877, 1896, 2264, 2780, 634, 1826, 2287, 1868, 1290, 234, 710, 2712, 2357, 1067, 1119, 1206, 2304, 183, 1410, 1768, 746, 65, 440, 1037, 2510, 3325, 1563, 1922, 2168, 1858, 1235, 196, 1795, 1950, 1141, 886, 2853, 3304, 2031, 1706, 2689, 3312, 2787, 3313, 1111, 3282, 205, 1245, 2005, 2284, 1949, 3225, 677, 314, 3257, 1812, 3316, 2891, 2844, 319, 1207, 826, 1901, 2413, 1690, 3215, 1750, 173, 1810, 1593, 1712, 1216, 2008, 3036, 404, 2263, 1792, 1185, 3043, 2914, 833, 1165, 717, 1122, 1198, 1764, 2877, 2924, 815, 548, 2566, 1423, 2030, 535, 913, 1190, 589, 3046, 1151, 445, 2512, 2388, 3097, 1571, 1220, 1915, 3117, 114, 3107, 64, 174, 1921, 908, 275, 1711, 2969, 1215, 2424, 1707, 3059, 2024, 2928, 3214, 1456, 243, 2870, 1789, 1505, 2588, 2603, 2617, 3309, 2012, 156, 2381, 2128, 3147, 2309, 871, 2153, 3153, 3160, 749, 807, 1840, 984, 876, 245, 94, 1118, 1698, 1691, 1317, 213, 59, 1997, 2128, 2415, 2561, 1121, 2771, 2243, 1712, 129, 2363, 2232, 79, 1043, 1351, 733, 1938, 39, 2265, 2798, 1649, 2423, 2892, 1116, 2102, 2354, 1351, 1280, 1952, 519, 1486, 3181, 1942, 2437, 875], -[1744, 65, 540, 293, 2235, 2869, 395, 195, 83, 89, 2366, 631, 50, 426, 3199, 1907, 538, 644, 488, 2131, 464, 1969, 2439, 3121, 2213, 3302, 828, 1346, 2442, 2660, 596, 2958, 1917, 1177, 1398, 421, 3194, 1342, 1305, 2364, 1478, 2589, 1094, 555, 1316, 2753, 887, 3000, 1232, 1322, 627, 303, 421, 2032, 1001, 1328, 2856, 834, 2074, 1789, 1275, 2949, 2616, 722, 2763, 581, 74, 1768, 1669, 498, 1515, 533, 117, 358, 2153, 2987, 1524, 443, 225, 1568, 2600, 1429, 274, 2060, 1899, 1735, 1973, 1804, 2735, 419, 3305, 535, 767, 128, 239, 2055, 3257, 901, 3260, 1816, 853, 2397, 2657, 1576, 3207, 406, 1248, 1743, 816, 1842, 2258, 760, 332, 680, 1648, 1286, 1550, 1901, 476, 1134, 1500, 496, 742, 2744, 527, 1463, 2268, 614, 1007, 941, 756, 749, 2518, 1085, 683, 3020, 1473, 3147, 1002, 2834, 3030, 1384, 1012, 1311, 2789, 2302, 1744, 719, 2852, 955, 2699, 442, 494, 2390, 658, 411, 971, 1910, 1739, 539, 243, 3213, 2858, 117, 1723, 84, 1883, 591, 2856, 1185, 2782, 2394, 625, 428, 487, 1156, 2619, 2041, 1354, 1233, 30, 148, 2611, 2197, 88, 439, 3262, 3215, 1344, 1842, 477, 1536, 945, 1503, 506, 2115, 1709, 3191, 3133, 1956, 1262, 1948, 2944, 1456, 1393, 2697, 1491, 667, 1941, 3058, 1087, 2870, 51, 141, 232, 1503, 1838, 1816, 2519, 2632, 1939, 1552, 2752, 1677, 1687, 2481, 1299, 1732, 3052, 1015, 1926, 479, 1969, 1999, 2080, 1209, 96, 2246, 2278, 2613, 1020, 132, 1465, 554, 2822, 927, 1808, 3031, 2614, 1438, 1706, 2851, 2059, 2839, 3035, 178]] -aHat * sHat: [[2236, 1835, 2939, 1371, 1272, 1590, 3036, 1269, 1935, 2891, 2736, 1191, 216, 1652, 2371, 1488, 1078, 2642, 1383, 1041, 1821, 1305, 1849, 1617, 2823, 1356, 1705, 755, 2604, 3276, 2410, 885, 1240, 1294, 21, 2125, 219, 2965, 2586, 1441, 757, 67, 2602, 1456, 3200, 1758, 3160, 554, 2631, 122, 1890, 1023, 2127, 401, 2976, 2809, 2812, 57, 1107, 2957, 572, 2991, 2988, 2437, 395, 2789, 2787, 1876, 2347, 784, 1089, 2771, 1954, 2641, 1217, 1977, 2545, 1754, 2470, 2333, 2561, 298, 522, 2279, 2470, 1989, 968, 133, 1437, 1708, 541, 102, 1442, 865, 2093, 956, 2512, 1529, 2398, 33, 2105, 202, 3142, 1329, 784, 923, 2311, 1887, 1572, 20, 1896, 17, 3106, 2078, 38, 1442, 1436, 1289, 1057, 1955, 2156, 1106, 655, 2442, 3002, 2780, 1527, 2916, 942, 2749, 1738, 290, 356, 1707, 386, 1991, 401, 1976, 4, 700, 47, 938, 560, 1188, 2488, 1098, 2910, 1770, 2848, 2593, 1639, 428, 1450, 750, 198, 2429, 3097, 2723, 2308, 1711, 837, 2159, 571, 1008, 954, 1630, 40, 2356, 3114, 2460, 337, 3255, 2645, 2259, 3160, 2451, 737, 3064, 2691, 208, 3291, 2419, 1248, 2310, 1513, 2529, 2600, 2361, 784, 896, 1096, 2818, 2344, 110, 1017, 2229, 2976, 781, 1038, 810, 2107, 2993, 1626, 1658, 621, 440, 542, 2610, 1864, 983, 2161, 1348, 1396, 2070, 3183, 308, 108, 1823, 2562, 197, 3150, 2203, 1502, 2056, 1548, 573, 3149, 2150, 348, 1995, 2509, 917, 829, 2990, 553, 872, 808, 2746, 1555, 1683, 3233, 2977, 1850, 1150, 2236, 1398, 1250, 1504, 2779, 2428, 2290, 2917, 1427, 2774, 3148, 2335], -[950, 2207, 1036, 133, 1127, 2447, 1077, 1553, 1105, 569, 455, 3174, 2827, 2598, 3075, 376, 712, 1987, 1108, 996, 3137, 415, 654, 3311, 2716, 2015, 1015, 2178, 1021, 2949, 886, 2653, 446, 3090, 2231, 1884, 3277, 2452, 2530, 1734, 2139, 403, 2149, 2281, 3264, 1318, 2177, 949, 1632, 223, 2271, 2804, 1395, 792, 1430, 920, 1214, 1828, 3249, 490, 165, 461, 1614, 1199, 2820, 2421, 53, 756, 3213, 3272, 897, 1248, 1054, 319, 2353, 2486, 2139, 3089, 1775, 1819, 3252, 773, 1295, 1693, 1565, 2981, 1181, 9, 1530, 945, 1110, 2800, 376, 759, 3034, 1214, 1480, 2371, 1873, 188, 1809, 2025, 1049, 936, 1222, 663, 1559, 2550, 936, 703, 1649, 2190, 2523, 809, 234, 1920, 2228, 1850, 2514, 3178, 2858, 2579, 1183, 946, 3055, 1544, 2189, 1699, 2470, 767, 39, 2474, 724, 1940, 3145, 1656, 1917, 228, 2495, 2283, 2495, 694, 2070, 1558, 1423, 1659, 117, 3135, 68, 440, 1982, 2221, 632, 2692, 880, 1790, 1908, 2845, 286, 613, 2970, 2236, 1632, 1752, 798, 2478, 3328, 406, 2479, 3318, 806, 237, 764, 952, 1252, 1063, 3184, 1230, 244, 395, 790, 1245, 1338, 77, 2527, 3219, 270, 3051, 1143, 1924, 1340, 1498, 2695, 1643, 1753, 2645, 2269, 540, 3080, 862, 1227, 1039, 3048, 2828, 2128, 3029, 2038, 301, 598, 2237, 1984, 907, 1250, 1782, 3258, 1780, 83, 1501, 3230, 1822, 2864, 287, 429, 1933, 2961, 2723, 2622, 593, 1609, 2960, 1128, 2273, 1107, 1224, 2149, 1020, 2871, 501, 2071, 2120, 1248, 2583, 726, 849, 1988, 3134, 267, 1953, 19, 126, 1247, 624, 362, 2547, 376, 2142]] -tHat = aHat * sHat + eHat: [[2758, 469, 1949, 2420, 1655, 2318, 346, 2649, 1227, 1362, 2844, 488, 850, 3194, 891, 790, 3135, 2239, 1880, 2065, 2386, 2661, 1453, 2411, 3141, 1213, 945, 1748, 1617, 686, 2057, 838, 943, 1908, 37, 3137, 1005, 1231, 2782, 1456, 343, 1116, 2022, 3256, 1671, 753, 3072, 529, 457, 2366, 330, 428, 1967, 250, 248, 1841, 38, 2869, 42, 387, 1447, 204, 1751, 1939, 610, 3202, 683, 424, 914, 3048, 540, 76, 451, 1599, 3085, 3267, 2779, 2464, 1853, 1361, 299, 1417, 1728, 1254, 2653, 70, 2736, 879, 1502, 2148, 1578, 2612, 1438, 2428, 686, 3124, 1041, 2764, 2594, 1828, 726, 1343, 699, 853, 759, 2954, 688, 1247, 1555, 2807, 1880, 1128, 3059, 2283, 1283, 118, 391, 3238, 953, 2632, 2470, 1034, 2467, 2429, 2564, 2295, 1846, 794, 1768, 1321, 822, 1980, 242, 128, 559, 472, 1994, 359, 1220, 2708, 3083, 1342, 2823, 2980, 344, 812, 2495, 2603, 684, 3310, 2761, 1626, 3214, 298, 3122, 3244, 316, 1960, 402, 412, 1372, 3072, 1761, 1597, 671, 2781, 485, 1539, 2173, 2228, 1908, 1146, 1231, 2047, 3274, 2229, 801, 3238, 1283, 1116, 237, 801, 888, 196, 608, 907, 2330, 1056, 383, 781, 2552, 3061, 1885, 1899, 2522, 1488, 2250, 69, 1018, 2822, 2263, 2045, 425, 1476, 2930, 1311, 2695, 2434, 1695, 1732, 2968, 3188, 2380, 2946, 99, 402, 1226, 192, 924, 1514, 34, 2262, 170, 855, 634, 3134, 941, 1592, 2591, 378, 2638, 3280, 3061, 3069, 1596, 2223, 1541, 1355, 1594, 619, 2702, 1297, 944, 713, 23, 171, 275, 2855, 730, 1051, 2809, 1074, 1279, 1387, 2256, 3210], -[2694, 2272, 1576, 426, 33, 1987, 1472, 1748, 1188, 658, 2821, 476, 2877, 3024, 2945, 2283, 1250, 2631, 1596, 3127, 272, 2384, 3093, 3103, 1600, 1988, 1843, 195, 134, 2280, 1482, 2282, 2363, 938, 300, 2305, 3142, 465, 506, 769, 288, 2992, 3243, 2836, 1251, 742, 3064, 620, 2864, 1545, 2898, 3107, 1816, 2824, 2431, 2248, 741, 2662, 1994, 2279, 1440, 81, 901, 1921, 2254, 3002, 127, 2524, 1553, 441, 2412, 1781, 1171, 677, 1177, 2144, 334, 203, 2000, 58, 2523, 2202, 1569, 424, 135, 1387, 3154, 1813, 936, 1364, 1086, 6, 1143, 887, 3273, 3269, 1408, 3272, 1804, 2004, 2662, 1093, 377, 2512, 1100, 1069, 2807, 964, 1752, 2545, 578, 2950, 2855, 1489, 1882, 3206, 449, 422, 2990, 983, 1029, 3075, 1925, 361, 253, 3007, 1128, 2313, 148, 1708, 795, 3223, 3242, 3025, 499, 1347, 61, 46, 168, 1788, 2196, 2078, 3082, 2869, 883, 632, 1861, 525, 2920, 1395, 1352, 2663, 1126, 1753, 1538, 2201, 2879, 1426, 2025, 1152, 3213, 2120, 1161, 1869, 2521, 2562, 1882, 997, 2006, 1174, 259, 2631, 1389, 1380, 1739, 2219, 2474, 3271, 1598, 1628, 820, 1393, 620, 2274, 2615, 329, 203, 2937, 2487, 437, 1817, 3034, 311, 3146, 2259, 1431, 649, 402, 2884, 2818, 2489, 2987, 2663, 955, 192, 2397, 200, 968, 2539, 1966, 3071, 448, 1301, 1923, 161, 3283, 1921, 3317, 2420, 1125, 1474, 1839, 3181, 281, 1319, 1875, 592, 2325, 1332, 646, 3054, 2752, 3076, 3223, 900, 2229, 2967, 2747, 1020, 1404, 2268, 2715, 2191, 1403, 1481, 732, 2075, 1655, 2633, 1564, 2953, 146, 2421, 2057, 82, 2320]] - -ek: C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 -dk: 37EC477E217BFB40384C850E51C1837158BDBC23A31832BC25C91B3121444AD4533733BAFF07CA817B64B2CA4299AA26454CBAFB35B6ABE1185CB47C4CD61AF98383C4814B20AB8754FC514F23074114C3E5A810A453B855AA7F1310C74B0B01E5AAB2E871738FAC2786C7A05D6B3B32A050D0FB223956C95CA0C2C1D54154A77BD33737A49A0065D1424A2ABAFD52AA934C9804939208F05CCF8B8B8086316E0943A08710500C918A2B218D37B85AE28022CB0134FB49F5C45D98D3C04B755A60880422668E2B301B18D5194DE991B265BF94697E6A4B8150C8B852033915635E30665BDA2191DAA505D43344FD29C9FCC1C507691D475B617C948FCC84B1B08A1C638C3E13580CE359789A9860E5469CC754B08EE33F0921BDEF15A906969F2DC57A25E80CE4C45F11E04A519AB08B9B927C3A13A081CFFA110FACCC5E8DC29495978B5553104D473A175918AD5B5487BBA69712AE93F615C60A8D387BCE3F651E56880A522B2DB86351CAB65D13B4693DB0B2C80936FAD1CE67925E6BB7C110C43E83247D22608D8C1023431CB69290A4F8A9593BF1241D737C0CD16D75EB50C6842CE0A21DCE494036824CE63252E9325F05B734452B129132B196084A3788BBB1F20A37D2C2B3F90E0DD7A274C9B1A9F02EC7E721F4A43D409A25FBC99A44D4763107C787620941761ED48C932924BA620986CF277A23471C7B13333D936C0DD49E0FF34CA3AB8234C42AEBE459C612052B9716E96B20BEC718126040A9091F6BA9445F45806AEB6E3816710F7CBFED1101461284DD962B7B12047C0A0A906A0589B4A9A426469BDA3946091A375B1952A91C231C0FE6B57F7CC97EFED0BC1001367823BE1886308B3A21452B7E455066719CCCEAF6A726FC22BC8399F54BBFCAF7CA63BA73173C7AA8619A3F485C3E330421006766746F4EF6653E440E5CDC59534018C352C023584CBB374EB7A9B7836832BE53AF272A069755CE2FF29CD8B394C52422B3470E27415F41B397535959F160003B452CF49697B7A53689852BBE6CCFDFB40B48E9328DE11522D0A431B115A5C0C2F4307D9862C0DD1B40C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636C0ECC8DDAE8B594A14037868BEC0B22300DEFDFAA1D973AC5CEC84AE4386B8FBCD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC diff --git a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt b/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt deleted file mode 100644 index 79626920f..000000000 --- a/tests/PQC Intermediate Values/Key Generation -- ML-KEM-768.txt +++ /dev/null @@ -1,40 +0,0 @@ -Key Generation -- ML-KEM-768 -z: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC -d: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC - -rho: 7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD -sigma: E71CB52F313F38B4CF0ADD7270390FB1ADE0AEE2D1EF704562409F6F9F825F2F - -aHat: [[[503, 2488, 1249, 1628, 3202, 1319, 414, 1890, 2741, 1035, 2249, 881, 402, 455, 2452, 1726, 610, 1860, 2796, 2467, 1906, 1982, 2045, 298, 1925, 2123, 1925, 1486, 1733, 1907, 1152, 2585, 1259, 1341, 2565, 1580, 1308, 2806, 1535, 780, 1417, 9, 831, 377, 2838, 1062, 2037, 111, 1148, 396, 1151, 1545, 1380, 1520, 912, 3104, 3245, 515, 2156, 2341, 613, 42, 1262, 2597, 1121, 2364, 897, 2206, 3019, 2194, 628, 890, 1345, 2183, 0, 1138, 1315, 2939, 356, 482, 1065, 514, 1033, 2523, 1791, 2845, 436, 3038, 643, 813, 2979, 1867, 3056, 2369, 1542, 2820, 344, 232, 3302, 1791, 2607, 3293, 2915, 774, 3072, 1977, 3295, 950, 2318, 1807, 111, 3001, 307, 2725, 1142, 361, 1118, 1309, 2969, 528, 2827, 1406, 2579, 1436, 2059, 438, 1942, 823, 704, 3234, 2247, 1902, 2097, 2143, 1700, 414, 2370, 1503, 1930, 2643, 1340, 2640, 842, 617, 2757, 410, 2400, 2905, 2636, 1854, 598, 1598, 3256, 2780, 2094, 215, 1285, 368, 364, 2328, 2187, 229, 1425, 1028, 1304, 17, 1313, 613, 29, 2378, 2316, 515, 890, 2648, 568, 763, 566, 1078, 315, 2898, 13, 925, 1052, 3132, 3276, 2750, 145, 1410, 1541, 1684, 2488, 3249, 1427, 3197, 3175, 1711, 1076, 2583, 1127, 1319, 629, 3238, 1244, 1272, 1548, 2882, 818, 2576, 1325, 1555, 3210, 1553, 2269, 681, 1180, 2870, 72, 1058, 1018, 1243, 1907, 3263, 2172, 2016, 1962, 191, 1585, 1174, 1300, 1399, 867, 342, 2750, 2353, 1341, 1064, 1004, 680, 1720, 792, 166, 943, 3243, 1543, 2988, 2333, 2223, 2080, 2610, 2275, 57, 1481, 1374, 1436, 1895, 1779], -[170, 3122, 168, 852, 273, 11, 87, 3134, 1240, 623, 349, 894, 2031, 2474, 2364, 2688, 791, 1502, 3253, 3225, 1850, 75, 661, 37, 2792, 1555, 2110, 2365, 711, 916, 967, 2584, 1940, 1388, 2500, 1102, 2625, 3112, 2519, 2890, 1729, 2487, 432, 1730, 2935, 1104, 2177, 369, 2456, 1882, 1416, 713, 494, 2002, 530, 223, 1129, 271, 789, 3011, 2723, 2920, 1672, 3062, 1211, 844, 922, 317, 2353, 1828, 245, 2530, 2496, 2560, 3015, 1780, 795, 443, 2755, 2605, 1379, 405, 2053, 1079, 1548, 2758, 1472, 858, 2939, 1358, 2786, 1832, 1107, 1205, 2992, 2699, 313, 91, 617, 3040, 2353, 2693, 1646, 1818, 3079, 2548, 1590, 1806, 1074, 2930, 3288, 3204, 2051, 2131, 2763, 2782, 2248, 1621, 2857, 2887, 514, 2412, 114, 202, 487, 17, 1475, 600, 826, 105, 679, 721, 2067, 324, 556, 671, 386, 1627, 1094, 778, 2684, 3285, 2071, 2071, 2938, 608, 3276, 739, 1303, 1530, 2443, 2880, 3177, 1933, 2643, 2657, 800, 753, 1540, 1306, 1628, 1057, 3306, 2064, 299, 366, 1699, 1352, 226, 1254, 682, 1525, 2404, 112, 55, 568, 610, 1097, 2022, 1897, 733, 1611, 2291, 957, 1701, 1240, 388, 2126, 634, 1782, 2581, 2346, 784, 1618, 1516, 667, 2958, 839, 2691, 684, 331, 1725, 594, 252, 2425, 2261, 2981, 1930, 2399, 948, 2755, 2735, 1881, 1280, 1740, 863, 1849, 882, 2766, 279, 2854, 694, 892, 1802, 445, 198, 2152, 2448, 2609, 2649, 3208, 333, 3207, 1460, 69, 2927, 3308, 235, 2466, 3030, 180, 218, 1033, 492, 2020, 1757, 2780, 653, 1137, 1437, 195, 660, 2614, 1499, 2041, 806], -[1374, 59, 66, 1050, 2591, 2316, 593, 2806, 162, 2198, 3073, 2638, 145, 1038, 1027, 2730, 736, 1123, 204, 2989, 974, 2145, 1750, 784, 417, 583, 1694, 1072, 736, 1124, 1603, 3279, 1478, 1043, 2154, 1322, 2709, 2841, 2283, 1171, 601, 988, 735, 2892, 2516, 1596, 575, 3267, 484, 2051, 618, 1776, 744, 2682, 2762, 2886, 1855, 573, 458, 1921, 746, 2738, 1954, 1501, 1494, 27, 2999, 1362, 1430, 1903, 1829, 2282, 1920, 1572, 1717, 706, 2400, 684, 1193, 3192, 1902, 2209, 2493, 2289, 380, 220, 2308, 1791, 2876, 1727, 2071, 1681, 1453, 666, 1431, 215, 2436, 3158, 400, 616, 1759, 646, 2966, 1337, 295, 1106, 141, 1981, 134, 2597, 1052, 2939, 1763, 2219, 1771, 2965, 756, 2143, 2055, 479, 314, 2364, 2507, 401, 672, 383, 1532, 1356, 2485, 1911, 747, 506, 2203, 1040, 1363, 3318, 1533, 1154, 2224, 876, 2211, 1896, 3153, 2607, 463, 2613, 1208, 2891, 759, 511, 2951, 1867, 2710, 1808, 1384, 1090, 1916, 196, 2471, 2310, 1781, 380, 79, 2937, 1650, 387, 1971, 2708, 359, 2622, 1884, 1559, 2280, 2928, 1588, 2198, 591, 3313, 3167, 342, 94, 304, 2877, 1272, 3121, 1303, 2367, 381, 1221, 1727, 136, 543, 170, 1495, 1140, 8, 2629, 1281, 2408, 389, 1418, 2520, 2085, 2977, 2133, 2043, 1705, 585, 2964, 2524, 301, 463, 1253, 1685, 1342, 2489, 2230, 2392, 993, 1870, 2287, 3285, 3152, 2416, 2121, 1802, 672, 2850, 2884, 1130, 363, 1192, 1470, 1163, 2282, 806, 2472, 2719, 3122, 2266, 1165, 1482, 2823, 957, 2694, 1350, 3299, 2023, 1730, 573, 1409, 1205, 1427, 1099, 2442, 2460]], -[[2477, 657, 1008, 914, 2644, 3115, 1701, 124, 1237, 2897, 2444, 2579, 1646, 1288, 1786, 1949, 3202, 767, 1479, 2484, 2355, 3029, 3175, 621, 2647, 1535, 2320, 2744, 1065, 1369, 649, 266, 1964, 52, 1017, 1651, 2300, 385, 3154, 2545, 2585, 2808, 2427, 1894, 1101, 2881, 2864, 2131, 1168, 210, 191, 663, 2270, 2921, 2626, 155, 3305, 1858, 236, 3250, 1448, 874, 509, 1827, 66, 727, 2581, 1007, 108, 796, 3099, 1302, 2163, 783, 1520, 2983, 2560, 3306, 1078, 1912, 2986, 1053, 2098, 1540, 2134, 3065, 2171, 612, 233, 2026, 2027, 683, 2595, 656, 2127, 842, 965, 2274, 1436, 1170, 996, 3176, 1757, 474, 1745, 2129, 200, 2537, 48, 2472, 2944, 1920, 1180, 2961, 665, 32, 1911, 2182, 205, 3010, 2598, 356, 2980, 1208, 3159, 947, 609, 2166, 1714, 2162, 696, 1457, 906, 896, 183, 434, 2534, 2493, 3019, 1019, 1691, 1910, 3071, 251, 974, 3132, 974, 906, 1754, 912, 1849, 345, 2120, 509, 366, 3174, 1248, 2425, 1866, 1913, 2382, 2335, 1353, 370, 998, 69, 1760, 316, 1007, 1425, 1337, 2521, 2915, 2570, 2043, 2808, 2911, 2687, 2946, 1640, 331, 3093, 2922, 3208, 333, 866, 1564, 962, 1768, 943, 3239, 883, 3075, 1084, 821, 444, 1020, 947, 1381, 249, 2621, 1579, 1604, 2626, 1923, 1772, 2675, 257, 520, 129, 1126, 2349, 2476, 1234, 2760, 873, 1105, 1285, 746, 3035, 430, 286, 1376, 2601, 505, 1415, 1643, 2312, 694, 1562, 3012, 2342, 2117, 2785, 1796, 1636, 1123, 2184, 1658, 2308, 850, 609, 534, 1294, 804, 27, 170, 3094, 2549, 1432, 2006, 2967, 731, 1757, 2042, 983], -[2415, 302, 2224, 160, 2409, 2914, 570, 216, 119, 562, 1106, 2122, 220, 66, 884, 2875, 602, 1463, 145, 974, 2728, 436, 1227, 1445, 1876, 102, 2273, 3068, 635, 3217, 2866, 2440, 2103, 1964, 1136, 1284, 1888, 3080, 2933, 1696, 1812, 3267, 2910, 400, 1673, 1177, 2239, 3092, 849, 2846, 2365, 1527, 1284, 1305, 434, 2138, 367, 761, 638, 472, 1132, 16, 3217, 52, 2708, 1545, 987, 3314, 642, 182, 2977, 300, 2319, 165, 2594, 835, 884, 564, 2909, 1570, 2651, 2401, 243, 638, 2602, 493, 233, 2260, 1668, 2980, 2889, 2405, 2627, 2662, 2891, 488, 730, 2451, 569, 3056, 1898, 1746, 1939, 2420, 1989, 2450, 2360, 646, 84, 2192, 1014, 3230, 2302, 1567, 173, 3172, 2516, 2120, 2135, 70, 1598, 1446, 1844, 867, 830, 203, 3315, 3107, 1804, 2836, 876, 2924, 1000, 1048, 483, 2937, 2600, 2906, 641, 1655, 1450, 1531, 1840, 2212, 2902, 2930, 181, 2936, 1776, 172, 282, 2041, 183, 363, 2135, 3171, 122, 1731, 1582, 2383, 2294, 2999, 3076, 1134, 2405, 1781, 120, 2644, 1080, 3150, 1842, 2826, 2373, 3089, 3278, 2364, 2102, 3037, 2028, 1219, 1376, 619, 2897, 3287, 2694, 1064, 2328, 1477, 115, 2585, 42, 1810, 689, 625, 2129, 1404, 1992, 2436, 520, 2555, 2787, 1155, 795, 323, 2595, 618, 2432, 530, 397, 2967, 1276, 2950, 3151, 989, 569, 1134, 2608, 2692, 1997, 1191, 1909, 2416, 2131, 2321, 2670, 1623, 186, 1381, 2268, 81, 2274, 1437, 2557, 36, 3076, 2556, 1562, 369, 1796, 2765, 3234, 3159, 2353, 140, 756, 335, 275, 1688, 3192, 3118, 753, 2313, 1668, 361, 1894, 1348], -[1387, 669, 2843, 320, 1888, 1947, 3000, 173, 3061, 2470, 336, 189, 2719, 810, 237, 1545, 1053, 3226, 725, 1754, 1844, 549, 3293, 2417, 196, 1852, 794, 235, 1922, 3, 262, 3259, 3281, 1843, 177, 3285, 1980, 2359, 1584, 2869, 2202, 404, 2439, 2874, 2901, 1309, 1118, 1333, 724, 217, 757, 2605, 474, 342, 2761, 818, 607, 2074, 1586, 183, 241, 1589, 1884, 1145, 1511, 2981, 332, 3187, 1481, 182, 2156, 2337, 2911, 1263, 3072, 2458, 3294, 685, 553, 2181, 1539, 644, 2851, 263, 1591, 2685, 1399, 1783, 2323, 1319, 2618, 871, 3251, 329, 755, 1819, 2855, 2252, 149, 1525, 1842, 3213, 815, 111, 1016, 2601, 881, 1191, 962, 193, 575, 727, 2807, 680, 2077, 2205, 1826, 1701, 2804, 1228, 2797, 70, 3035, 2617, 430, 1780, 1190, 851, 253, 648, 3004, 2685, 1855, 2552, 3096, 2489, 1887, 333, 823, 1169, 3255, 615, 1990, 66, 1233, 2168, 2752, 416, 1117, 2408, 2343, 1249, 2128, 3245, 2747, 1606, 472, 991, 875, 2280, 2077, 2662, 2250, 79, 1123, 1282, 3075, 3142, 1229, 226, 2220, 2257, 170, 1691, 561, 2270, 2436, 960, 487, 1867, 1704, 3197, 2302, 2704, 2518, 2088, 2070, 1051, 1795, 815, 529, 1592, 2160, 1655, 500, 3297, 1793, 440, 1509, 999, 439, 744, 1107, 15, 2895, 1108, 545, 2390, 1997, 1530, 831, 3269, 3107, 1694, 2830, 2221, 1473, 1294, 1671, 571, 3013, 2996, 3013, 1979, 1614, 1899, 2822, 2674, 2163, 498, 2424, 1081, 2045, 2502, 2358, 2013, 59, 597, 2476, 398, 447, 2889, 2891, 3114, 804, 1983, 1683, 2293, 2450, 2233, 1213, 1355, 410, 2145, 1639, 695]], -[[458, 3073, 1091, 2535, 1094, 1943, 1517, 612, 823, 2562, 961, 3148, 2102, 2898, 2302, 3274, 1990, 590, 2543, 2127, 269, 2158, 1898, 2142, 2617, 1806, 2830, 895, 3107, 2424, 3323, 654, 2317, 2595, 646, 831, 442, 839, 2546, 344, 1877, 1782, 206, 1611, 2549, 3152, 2200, 1022, 2247, 2769, 2133, 1318, 3202, 196, 2240, 2517, 509, 2046, 1217, 1162, 962, 673, 3260, 1960, 833, 2255, 2696, 2559, 2216, 1544, 672, 2335, 3137, 2870, 2134, 1478, 929, 3117, 71, 1323, 209, 885, 11, 297, 637, 918, 394, 692, 2146, 1054, 693, 1084, 2665, 397, 2290, 579, 867, 2556, 664, 1469, 2241, 1680, 279, 2432, 2276, 2922, 2817, 2906, 506, 2123, 2163, 637, 2221, 2176, 494, 583, 3173, 452, 2273, 1564, 2759, 2236, 2676, 1900, 2165, 1297, 3292, 1921, 2376, 102, 2910, 1360, 1376, 2755, 3006, 1346, 579, 301, 2897, 437, 3040, 532, 2756, 3124, 2622, 796, 2327, 2225, 2470, 1837, 21, 2810, 2394, 1202, 2418, 2068, 2669, 3009, 2605, 2708, 1689, 256, 981, 2372, 566, 121, 800, 2325, 3026, 144, 1717, 447, 3133, 482, 608, 918, 2362, 2249, 2477, 1043, 549, 2131, 1158, 2677, 1991, 2206, 91, 2383, 2315, 511, 2510, 2981, 2787, 398, 3256, 3039, 1253, 2682, 3229, 1645, 1894, 901, 200, 810, 2945, 2771, 2689, 2402, 872, 2320, 1910, 1908, 2454, 2747, 1986, 453, 1590, 361, 979, 3218, 2348, 1361, 855, 2976, 906, 2007, 2590, 2210, 2175, 1606, 1693, 987, 2643, 1760, 2347, 2341, 60, 273, 3296, 558, 1255, 1275, 1610, 2742, 660, 3157, 1586, 2457, 3022, 371, 470, 1863, 1148, 3266, 1523, 1905], -[56, 2761, 2607, 2958, 1428, 73, 3236, 2181, 3088, 1588, 736, 2868, 3172, 1142, 833, 171, 1755, 2209, 1592, 190, 876, 2625, 991, 163, 1899, 2251, 1345, 1914, 2530, 2024, 1833, 1094, 2406, 2561, 1984, 1014, 1067, 2406, 353, 1217, 3007, 2788, 2864, 2042, 2472, 1902, 3295, 2420, 1327, 102, 167, 3153, 1079, 461, 3226, 554, 2561, 188, 709, 237, 1747, 2327, 2596, 771, 914, 2942, 1811, 2030, 2001, 635, 516, 1786, 3255, 2861, 723, 2557, 2285, 1591, 1883, 844, 2426, 2113, 1573, 1796, 3160, 365, 1433, 1091, 1769, 937, 244, 650, 309, 3210, 1955, 1163, 2310, 2034, 685, 1462, 1903, 1057, 1277, 883, 2106, 2582, 2792, 2110, 1969, 226, 2577, 1601, 307, 1471, 638, 2438, 1996, 146, 2879, 2799, 599, 1011, 2148, 1353, 1223, 3059, 2710, 242, 861, 1193, 1790, 40, 125, 1656, 184, 954, 2453, 957, 558, 2368, 1358, 614, 2888, 1752, 584, 1878, 1297, 1236, 2505, 805, 354, 2350, 815, 242, 2373, 881, 3055, 2177, 160, 3120, 2451, 635, 1449, 520, 3320, 1111, 28, 483, 2198, 1300, 1556, 976, 1294, 340, 2108, 1986, 1188, 2567, 1361, 2318, 42, 988, 1513, 2456, 3299, 2559, 1750, 1951, 566, 2435, 2072, 725, 2578, 3145, 1094, 1679, 1289, 3260, 2411, 3263, 2764, 1863, 800, 163, 535, 1434, 1896, 628, 905, 638, 1994, 1886, 633, 2923, 1854, 973, 3226, 1, 2995, 2480, 487, 208, 2777, 2661, 1475, 765, 2268, 1747, 2877, 3143, 2719, 400, 2759, 1817, 2237, 2715, 2308, 2123, 1163, 3184, 2705, 66, 2859, 1543, 1730, 3231, 380, 1175, 157, 1174, 3321, 1291, 2646, 268, 1462, 1694], -[2401, 200, 2377, 1120, 1797, 2462, 975, 1295, 1107, 3103, 822, 2259, 478, 157, 2498, 315, 238, 373, 2218, 3326, 1328, 1479, 1224, 1117, 1824, 2327, 737, 2957, 3287, 3303, 2706, 2408, 1931, 2060, 892, 403, 1036, 3027, 2042, 570, 1233, 731, 215, 2635, 1250, 739, 1287, 109, 3125, 3246, 421, 2756, 602, 1482, 1006, 1111, 1227, 497, 1037, 1001, 3285, 3075, 1947, 1613, 882, 655, 407, 2465, 1546, 1641, 2880, 2275, 1751, 2763, 230, 1735, 1655, 1232, 207, 1521, 275, 2302, 2074, 1090, 1838, 1810, 2398, 2400, 3095, 1871, 3109, 3029, 2055, 2648, 3293, 1373, 2444, 1836, 1521, 2099, 1910, 3283, 1744, 1176, 1149, 2951, 2130, 164, 948, 2539, 2920, 2951, 1801, 84, 3229, 597, 3164, 645, 2370, 806, 2007, 2465, 2359, 2795, 2657, 573, 1119, 1978, 22, 2661, 609, 746, 1684, 2329, 1658, 2028, 132, 1510, 1913, 1867, 1774, 975, 1900, 2021, 529, 1164, 268, 1592, 57, 798, 1975, 2997, 590, 1263, 570, 1306, 552, 782, 472, 3105, 400, 580, 795, 335, 616, 1218, 1056, 2128, 885, 2161, 2594, 236, 640, 191, 3141, 215, 2020, 2870, 2042, 978, 2068, 2729, 219, 2219, 736, 2210, 222, 3225, 3071, 2663, 2110, 1827, 796, 3152, 1390, 1639, 1529, 508, 1639, 196, 3163, 599, 2540, 199, 2565, 192, 25, 614, 1343, 90, 1995, 2068, 328, 2499, 2315, 2751, 1063, 335, 1128, 1208, 1061, 2845, 272, 1685, 1659, 2745, 525, 1958, 3099, 311, 1197, 3002, 340, 3180, 2576, 2474, 622, 2704, 2922, 2248, 2015, 3049, 176, 2307, 122, 1379, 510, 149, 1777, 632, 2248, 2614, 2369, 3111, 1926, 2229]]] - -s: [[3328, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 1, 0, 0, 1, 0, 1, 3328, 3328, 0, 1, 3328, 1, 2, 3328, 1, 3328, 0, 1, 1, 3328, 1, 3328, 0, 2, 3328, 1, 0, 3328, 0, 1, 0, 0, 3328, 3327, 0, 1, 3328, 0, 0, 1, 1, 3328, 0, 3327, 0, 3328, 1, 0, 0, 0, 0, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 0, 1, 3327, 1, 3328, 0, 1, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 3328, 2, 3327, 0, 3328, 1, 3328, 3328, 0, 1, 3328, 1, 0, 3328, 0, 1, 0, 3328, 0, 3328, 1, 0, 3328, 3327, 3328, 0, 2, 1, 2, 2, 1, 3328, 3327, 0, 0, 1, 1, 3328, 0, 0, 0, 3328, 2, 0, 1, 1, 0, 3328, 0, 3328, 0, 0, 3328, 2, 2, 3328, 2, 1, 0, 0, 3328, 0, 3328, 2, 1, 1, 1, 0, 3328, 0, 0, 1, 0, 3328, 0, 0, 0, 1, 1, 3328, 1, 0, 1, 0, 3328, 3328, 3328, 3328, 0, 1, 1, 1, 0, 2, 0, 3328, 3328, 0, 0, 3328, 1, 3327, 0, 0, 1, 1, 0, 0, 0, 0, 0, 3328, 3328, 0, 3328, 0, 3327, 3328, 3328, 3328, 3328, 3328, 3328, 1, 3327, 0, 3328, 0, 0, 0, 1, 1, 3327, 0, 3327, 1, 0, 1, 2, 2, 3328, 1, 3328, 1, 0, 0, 3328, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 3328, 2, 3327, 3328], -[0, 3327, 2, 3327, 0, 3327, 0, 0, 0, 1, 0, 2, 2, 0, 3327, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 3328, 1, 1, 1, 1, 2, 3328, 3328, 3327, 1, 0, 1, 0, 1, 0, 0, 0, 0, 3328, 3328, 1, 2, 3328, 0, 0, 0, 3328, 1, 3328, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 2, 1, 3328, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 3328, 3328, 0, 0, 0, 0, 1, 3328, 2, 3328, 2, 0, 2, 0, 3328, 1, 3327, 3327, 1, 3328, 3327, 1, 1, 2, 0, 0, 3328, 3328, 1, 0, 0, 3328, 0, 0, 3328, 3327, 3328, 3328, 0, 3328, 0, 1, 1, 1, 1, 0, 0, 0, 3327, 2, 3328, 0, 0, 3328, 0, 2, 1, 0, 0, 0, 3328, 1, 3328, 1, 1, 0, 3328, 3327, 3328, 1, 3328, 0, 0, 3328, 3328, 0, 0, 0, 3328, 1, 1, 1, 0, 1, 3328, 0, 2, 3328, 1, 1, 3328, 3327, 1, 2, 0, 0, 3327, 1, 0, 3328, 3328, 3328, 0, 2, 3328, 1, 1, 1, 1, 0, 0, 3328, 1, 0, 0, 3328, 3327, 0, 0, 0, 3327, 1, 1, 1, 0, 3328, 1, 3328, 1, 0, 1, 1, 3328, 0, 0, 0, 3328, 0, 3327, 0, 1, 3328, 0, 1, 3328, 3327, 3328, 0, 3328, 0, 1, 3327, 0, 0, 3327, 0, 3328, 0, 3328, 3328, 3328, 1, 1, 3328, 0, 1, 0, 3328, 0, 3327, 1, 1, 3328, 0, 0, 2, 0, 0, 0], -[0, 1, 1, 0, 1, 0, 1, 2, 0, 3328, 0, 0, 0, 1, 3328, 3328, 0, 3328, 1, 0, 0, 1, 3328, 2, 0, 0, 0, 3327, 3328, 3328, 1, 0, 1, 3328, 0, 1, 0, 3328, 3328, 1, 1, 3327, 2, 1, 3328, 0, 3328, 3328, 1, 3328, 1, 3328, 3327, 1, 3328, 0, 1, 1, 1, 3328, 1, 1, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 0, 3328, 0, 1, 3327, 3328, 0, 3328, 0, 3328, 0, 1, 3328, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 3327, 1, 1, 3328, 0, 0, 3328, 0, 1, 3328, 1, 0, 2, 3328, 1, 1, 1, 1, 0, 3328, 3328, 3328, 2, 0, 0, 3327, 1, 1, 0, 3328, 0, 3328, 2, 1, 0, 1, 3328, 0, 1, 1, 3328, 0, 3328, 3328, 3328, 1, 0, 3328, 3327, 0, 3328, 0, 1, 1, 3328, 0, 1, 0, 3328, 0, 1, 1, 1, 0, 1, 3328, 3328, 3328, 0, 2, 0, 1, 0, 0, 1, 3328, 3328, 1, 3327, 0, 2, 3328, 1, 1, 0, 3327, 3328, 0, 1, 0, 3328, 0, 3328, 3328, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 3328, 0, 0, 3328, 3328, 3328, 1, 3328, 1, 3328, 2, 3327, 3327, 0, 1, 1, 0, 1, 3328, 0, 1, 3328, 0, 3328, 0, 0, 1, 1, 0, 0, 3328, 0, 1, 1, 3327, 3328, 0, 1, 1, 3328, 0, 0, 3328, 3328, 0, 3327, 1, 2, 3328, 1, 0, 3328, 3328, 1, 3328, 1, 1]] - -e: [[1, 3328, 0, 3327, 0, 0, 0, 3327, 1, 1, 3328, 1, 1, 0, 3328, 2, 1, 1, 2, 3328, 3328, 0, 0, 0, 3328, 3327, 0, 2, 3328, 0, 2, 0, 0, 1, 0, 3328, 0, 0, 1, 1, 0, 3328, 3328, 2, 3328, 3328, 1, 0, 1, 1, 3328, 3328, 0, 0, 3328, 1, 0, 0, 1, 1, 1, 1, 1, 0, 2, 0, 0, 1, 1, 0, 0, 1, 1, 3327, 3328, 0, 3327, 3328, 0, 0, 3328, 3328, 1, 1, 1, 3328, 0, 0, 0, 1, 3327, 0, 3328, 3327, 3328, 1, 0, 3328, 3328, 3328, 2, 1, 1, 3327, 3328, 3328, 3328, 3328, 0, 0, 3328, 3328, 3328, 3328, 0, 3328, 2, 3327, 1, 0, 0, 0, 0, 0, 3328, 2, 0, 1, 1, 3328, 3328, 2, 0, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 3328, 0, 2, 3328, 1, 1, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 0, 2, 0, 1, 0, 3327, 3328, 0, 3327, 0, 0, 3327, 0, 3327, 1, 1, 1, 0, 3328, 3328, 3328, 1, 1, 0, 1, 2, 0, 3327, 0, 3328, 1, 1, 0, 0, 0, 0, 0, 0, 3328, 0, 1, 2, 2, 0, 3328, 3328, 0, 0, 0, 3328, 0, 0, 3328, 3328, 1, 3327, 0, 0, 3327, 0, 1, 0, 1, 1, 0, 0, 0, 1, 3328, 3328, 0, 0, 1, 1, 1, 2, 3327, 2, 0, 0, 0, 0, 0, 0, 1, 3328, 1, 0, 0, 1, 1, 3328, 1, 3328, 3327, 3328, 2, 1], -[1, 1, 3328, 1, 3328, 0, 3328, 3328, 1, 3328, 0, 0, 3328, 3328, 3328, 0, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 3327, 1, 0, 0, 3328, 0, 0, 3328, 0, 0, 0, 1, 3328, 0, 3327, 0, 0, 3328, 3328, 0, 3328, 3328, 3328, 1, 0, 1, 3327, 0, 3328, 3328, 1, 0, 3328, 3327, 0, 0, 2, 2, 1, 0, 1, 0, 3328, 0, 2, 3328, 0, 0, 2, 3327, 3328, 1, 0, 3328, 1, 1, 0, 0, 1, 1, 0, 0, 3328, 3327, 0, 0, 0, 1, 2, 2, 1, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 1, 0, 3328, 1, 0, 0, 0, 3328, 3328, 0, 1, 3327, 3328, 0, 1, 3328, 2, 1, 0, 3328, 2, 3328, 1, 3328, 3328, 1, 1, 3328, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 1, 0, 0, 0, 3327, 0, 3328, 1, 0, 1, 3328, 0, 3328, 0, 1, 3328, 0, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 1, 3328, 0, 3328, 3328, 0, 1, 0, 0, 3327, 3328, 3328, 3328, 1, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3328, 0, 1, 3328, 2, 0, 1, 1, 1, 3328, 0, 3328, 0, 0, 0, 3328, 3328, 3328, 1, 1, 3328, 3328, 2, 3327, 2, 2, 1, 0, 0, 1, 3328, 1, 1, 0, 0, 3328, 1, 0, 0, 1, 1, 0, 0, 3327, 0, 1, 1, 3328, 1, 1, 0, 0, 3328, 0, 1, 0, 0, 0, 0, 0, 3328, 1, 0, 0], -[3328, 1, 0, 3328, 0, 3328, 3328, 0, 0, 0, 1, 0, 3328, 3328, 1, 0, 3328, 1, 0, 1, 0, 0, 3328, 0, 3328, 0, 3328, 3327, 3328, 3328, 0, 3328, 1, 3328, 3327, 1, 0, 0, 3328, 3328, 0, 0, 0, 1, 0, 0, 1, 3328, 3327, 1, 2, 0, 0, 3328, 0, 3328, 3328, 0, 3328, 1, 0, 1, 3328, 0, 3328, 1, 3328, 1, 3328, 1, 0, 0, 0, 0, 3328, 1, 0, 3328, 1, 3328, 3328, 0, 0, 1, 0, 1, 3328, 0, 3328, 0, 1, 0, 2, 0, 2, 2, 2, 1, 0, 1, 0, 0, 1, 3328, 0, 0, 0, 0, 3328, 3327, 1, 3328, 0, 3328, 3328, 3327, 3328, 0, 0, 0, 1, 3327, 0, 2, 1, 0, 3327, 0, 3327, 3328, 0, 3327, 3328, 3328, 0, 0, 3328, 0, 1, 0, 0, 3328, 3327, 3328, 0, 0, 0, 3328, 2, 0, 3328, 1, 0, 1, 0, 0, 3328, 3327, 3328, 3328, 1, 0, 0, 0, 0, 1, 2, 0, 1, 0, 1, 3328, 0, 3328, 1, 3328, 3328, 3328, 0, 1, 1, 0, 1, 2, 0, 2, 3327, 3328, 3328, 1, 3328, 1, 3328, 0, 3328, 3328, 0, 3328, 3328, 2, 0, 1, 1, 3328, 0, 0, 0, 0, 0, 1, 0, 0, 1, 3328, 0, 3327, 3327, 0, 1, 2, 3328, 0, 0, 3327, 0, 3327, 1, 0, 0, 2, 1, 1, 3328, 1, 0, 0, 0, 0, 1, 3328, 0, 0, 0, 0, 0, 3328, 3328, 3328, 1, 0, 1, 0, 3328, 0, 2, 0]] - -sHat: [[1817, 1197, 2005, 676, 2955, 2722, 1490, 1658, 2306, 2876, 437, 229, 755, 1161, 1624, 464, 2391, 223, 473, 2570, 3103, 766, 1367, 428, 2184, 88, 2868, 1553, 380, 1365, 2361, 1909, 848, 1480, 1854, 2573, 51, 923, 1239, 2322, 3123, 1490, 1780, 2490, 621, 1567, 1905, 1960, 1489, 174, 453, 0, 1982, 644, 1656, 2134, 2778, 1847, 1182, 1016, 1264, 1437, 1826, 653, 286, 210, 606, 2968, 1348, 758, 584, 3318, 2483, 45, 222, 2806, 464, 1610, 2887, 609, 2580, 468, 2170, 147, 869, 144, 345, 1889, 2606, 1947, 1122, 1308, 1309, 2576, 552, 1935, 2846, 988, 2847, 2837, 548, 884, 2657, 2977, 1209, 2450, 2591, 632, 562, 1806, 1330, 1939, 288, 2431, 2503, 726, 2400, 1098, 580, 599, 1164, 1403, 1985, 443, 2423, 1353, 873, 2719, 866, 2751, 2470, 2406, 3092, 3279, 1258, 487, 1569, 12, 1476, 1971, 3007, 1114, 1833, 3122, 468, 3060, 1934, 797, 1874, 1487, 1288, 1039, 1761, 2760, 970, 611, 756, 3202, 2123, 2265, 1655, 430, 2278, 1425, 1487, 1048, 760, 153, 2276, 777, 1344, 1564, 1142, 2053, 648, 2917, 2121, 2459, 2467, 2793, 2242, 3004, 1448, 1066, 1523, 2740, 498, 1016, 2405, 2686, 913, 717, 1986, 1549, 2854, 2271, 1036, 2921, 2135, 2468, 2235, 2004, 676, 3082, 1763, 2264, 1084, 2047, 2844, 763, 3239, 1337, 1743, 623, 1863, 3079, 1947, 1985, 401, 1347, 644, 2877, 3083, 2592, 1311, 2773, 3282, 1395, 481, 457, 2111, 1712, 714, 381, 2200, 1764, 2996, 1991, 1880, 1845, 129, 2556, 594, 1413, 2861, 625, 1447, 2957, 224, 3302, 120, 2498, 3016, 2786, 1613, 106], -[3200, 2256, 1713, 2290, 634, 2941, 1171, 1274, 308, 710, 974, 458, 2023, 2413, 2726, 613, 1681, 349, 512, 1526, 1923, 3054, 1879, 2016, 489, 2956, 2753, 2588, 3127, 1212, 869, 775, 2444, 1633, 1163, 2818, 1566, 1689, 2819, 3018, 2999, 1657, 2750, 992, 1342, 2208, 429, 2202, 2745, 2062, 2613, 3113, 3183, 1476, 851, 1527, 3300, 863, 804, 887, 3190, 3232, 2357, 2946, 1746, 2998, 2156, 20, 1030, 3285, 2748, 997, 1943, 1317, 1350, 2743, 964, 305, 524, 1804, 2079, 2354, 2878, 2954, 2873, 210, 1389, 2496, 2812, 771, 3122, 1270, 460, 184, 1079, 1866, 3212, 1329, 2706, 1176, 1043, 2238, 1560, 2422, 3094, 818, 3071, 111, 477, 1557, 968, 2518, 1457, 3177, 1226, 2086, 2971, 930, 3118, 2404, 1667, 1755, 3063, 415, 9, 1257, 512, 208, 954, 1249, 258, 1674, 2775, 3078, 2934, 1915, 3284, 2125, 1174, 3003, 1255, 1691, 523, 2490, 2402, 426, 702, 3047, 1011, 2626, 2380, 56, 740, 2920, 2317, 2985, 353, 3005, 3279, 2969, 1383, 835, 1729, 1149, 870, 1858, 3310, 1986, 95, 2064, 442, 1181, 756, 100, 1649, 2119, 1241, 1719, 2080, 1588, 1850, 2671, 2188, 1622, 2555, 53, 2136, 3325, 1154, 1409, 2870, 201, 2865, 1438, 1404, 3055, 2936, 1166, 14, 1258, 2613, 3279, 824, 1824, 200, 2572, 589, 1902, 1969, 538, 1313, 2414, 715, 1515, 1015, 1701, 211, 1048, 2180, 1978, 1503, 2683, 1641, 177, 251, 3243, 1596, 115, 1424, 1390, 1835, 2283, 254, 1680, 1223, 2103, 1453, 3235, 1986, 3171, 1821, 2222, 1149, 1787, 1993, 289, 332, 1882, 2832, 2013, 2210, 2193, 1039, 2276, 502, 2147], -[275, 3226, 636, 2281, 2859, 1703, 340, 1974, 1740, 3291, 2290, 2791, 2900, 1378, 2989, 2903, 2284, 3149, 1642, 3142, 2554, 1280, 462, 852, 2092, 1403, 2321, 72, 600, 2463, 191, 2980, 623, 3087, 2161, 1571, 2854, 1528, 1032, 2446, 69, 2379, 2371, 1961, 2738, 1577, 3079, 211, 2200, 3073, 1568, 2001, 2375, 564, 1308, 2528, 2159, 1012, 2199, 374, 3273, 512, 2473, 892, 3079, 729, 843, 222, 1193, 2711, 2942, 3156, 2366, 1709, 1621, 2545, 842, 2610, 1258, 3026, 398, 2944, 3066, 2398, 1492, 1022, 3327, 2926, 520, 3120, 1160, 250, 70, 1350, 2827, 497, 1665, 3223, 2945, 2849, 2154, 966, 2471, 1384, 2378, 1026, 3068, 718, 2534, 682, 1054, 1518, 996, 396, 2391, 2972, 1464, 1707, 2425, 1453, 2886, 924, 314, 2595, 2931, 2807, 3306, 2070, 2566, 1654, 1067, 3091, 2314, 2202, 2391, 380, 1894, 779, 2563, 1382, 217, 2724, 3150, 2939, 88, 2107, 593, 3150, 2557, 1105, 827, 2671, 2601, 2450, 1853, 3190, 2028, 764, 1858, 2095, 3049, 2734, 2842, 952, 1551, 1957, 1203, 537, 1782, 1962, 1131, 264, 1277, 2681, 801, 1629, 1009, 2534, 2717, 3069, 1744, 3306, 1562, 84, 3005, 450, 1947, 1977, 2769, 814, 902, 1671, 1750, 926, 2512, 2753, 2064, 1329, 1468, 961, 2182, 1327, 3200, 1903, 571, 1274, 2741, 663, 364, 731, 50, 2222, 3251, 1362, 2589, 1109, 676, 2298, 3226, 653, 759, 2314, 1294, 2626, 267, 2309, 2738, 2834, 2973, 591, 623, 2852, 1871, 3273, 169, 2491, 746, 1133, 993, 1271, 1604, 1910, 2995, 1880, 1826, 2059, 3186, 279, 116, 3220, 241, 586, 3154, 320, 2330, 3286]] -eHat: [[1982, 1061, 127, 1369, 2445, 716, 350, 1511, 1239, 1299, 3046, 526, 3296, 795, 2588, 640, 261, 1048, 2063, 543, 2956, 469, 2187, 2087, 2540, 919, 950, 763, 1865, 248, 2449, 552, 698, 2932, 3027, 848, 830, 2408, 2447, 1113, 3112, 1661, 2414, 1875, 3276, 2741, 2414, 774, 1121, 2867, 197, 76, 340, 1177, 1060, 2528, 1326, 2092, 169, 1024, 2774, 122, 1810, 2397, 1939, 3147, 1929, 3255, 421, 574, 1204, 3197, 170, 930, 340, 1978, 581, 1664, 2689, 112, 1670, 1082, 2171, 540, 413, 1836, 91, 2592, 2611, 2021, 1357, 1035, 1626, 860, 2475, 2502, 212, 735, 1018, 2212, 2893, 2802, 2850, 2223, 1529, 1146, 2615, 125, 2885, 2587, 1278, 1440, 14, 2962, 1450, 354, 2192, 791, 3201, 3066, 2632, 2983, 1777, 2447, 367, 2915, 1432, 1713, 2399, 2086, 379, 53, 512, 2100, 2199, 1885, 2933, 2750, 2066, 464, 34, 253, 1169, 2809, 2372, 590, 1821, 2757, 2114, 2355, 1181, 1888, 1332, 1960, 2666, 3072, 2630, 3252, 1858, 1930, 1088, 870, 2917, 1813, 2629, 2049, 1642, 1887, 661, 23, 1917, 3123, 1094, 735, 2733, 2529, 576, 423, 260, 387, 958, 2056, 440, 3268, 756, 2311, 766, 2878, 1595, 2302, 975, 1767, 1616, 3088, 2910, 732, 1635, 1755, 1548, 295, 2027, 2419, 2145, 1311, 1045, 2412, 659, 2082, 2385, 1614, 2583, 1164, 3006, 2693, 916, 2770, 1102, 2121, 2946, 109, 1861, 2020, 1841, 608, 39, 85, 1524, 1452, 167, 881, 90, 2323, 94, 372, 1544, 883, 2020, 2214, 760, 2742, 2221, 2077, 869, 1184, 2004, 3187, 2571, 1985, 2718, 1865, 2310, 3292, 1058, 3173, 249, 388], -[121, 1331, 2061, 3202, 1885, 2068, 1746, 1667, 470, 1010, 1738, 3270, 354, 502, 3017, 3269, 268, 2680, 2015, 913, 1987, 228, 2231, 2319, 2877, 771, 527, 2743, 355, 287, 3250, 361, 3208, 1414, 2325, 1499, 353, 1438, 1956, 2707, 2180, 2792, 35, 2477, 1512, 2800, 2824, 1233, 500, 498, 704, 929, 2592, 2625, 1928, 1044, 2506, 1923, 2014, 2634, 48, 234, 2260, 1693, 627, 1461, 360, 1243, 2092, 1817, 1128, 1871, 2281, 2383, 1537, 943, 2848, 1096, 1949, 3299, 2784, 737, 2085, 2530, 2688, 3236, 912, 3246, 803, 3057, 460, 882, 2519, 1471, 2039, 2909, 960, 1741, 91, 1561, 2559, 3044, 1578, 3259, 3291, 2221, 3146, 975, 1561, 109, 572, 3092, 2099, 2646, 1138, 1020, 2087, 379, 2369, 361, 787, 791, 2459, 271, 470, 2309, 1667, 1930, 224, 532, 1145, 206, 3295, 828, 2180, 2473, 1454, 261, 2642, 359, 2419, 3327, 2028, 3045, 1053, 1876, 3083, 827, 1102, 116, 1185, 2527, 3221, 1232, 3120, 1201, 490, 3256, 1494, 1894, 999, 2336, 1494, 2894, 63, 1185, 1116, 301, 2783, 1031, 2383, 2973, 2463, 2371, 2446, 1812, 562, 1015, 104, 1594, 2341, 1821, 1101, 2749, 91, 2057, 1050, 2610, 1522, 623, 763, 699, 1546, 3181, 811, 728, 2816, 2123, 2725, 647, 3024, 283, 799, 970, 75, 174, 3096, 277, 549, 1202, 423, 429, 2906, 1965, 2218, 2599, 1539, 2288, 1802, 1118, 1315, 2111, 3096, 675, 1679, 3300, 29, 2835, 1177, 812, 965, 1243, 1650, 2370, 1938, 1853, 1763, 2257, 3299, 2849, 1348, 2504, 3160, 1175, 2906, 3224, 1901, 137, 1249, 2251, 3173, 1525, 2754, 1115, 1573, 1811], -[1002, 3149, 2353, 1914, 1865, 1014, 1066, 1038, 1534, 2250, 1870, 2632, 976, 942, 399, 851, 370, 1962, 2930, 810, 3093, 734, 1355, 645, 1324, 777, 2584, 2503, 445, 1466, 564, 1824, 3234, 2682, 237, 212, 399, 797, 3099, 1364, 240, 1515, 1299, 1179, 950, 567, 694, 765, 1781, 2354, 121, 2522, 758, 242, 1892, 159, 737, 3036, 978, 984, 337, 438, 576, 582, 2043, 2584, 474, 1810, 2794, 117, 3150, 277, 866, 3116, 1647, 635, 3072, 1436, 2613, 2882, 974, 1070, 2912, 2123, 2672, 2929, 1981, 3045, 2296, 973, 456, 2578, 1042, 2161, 175, 2079, 228, 2500, 2740, 107, 692, 1508, 3202, 1342, 2642, 545, 1077, 2897, 2809, 1760, 939, 2155, 918, 2775, 3090, 2663, 2376, 451, 657, 1271, 305, 1693, 2221, 1765, 2845, 2778, 1238, 2530, 1261, 1576, 1310, 1608, 1168, 2028, 1120, 2735, 1824, 3052, 186, 161, 3325, 3266, 992, 1258, 2176, 1923, 2130, 1897, 1704, 239, 2763, 637, 2615, 2997, 777, 2641, 1504, 1643, 1953, 3136, 2427, 1016, 1096, 1621, 688, 849, 275, 589, 1405, 1842, 2629, 3041, 2801, 3189, 69, 2086, 2833, 2248, 3152, 2430, 1857, 1178, 969, 322, 1635, 523, 113, 25, 576, 2295, 3314, 29, 1380, 1592, 757, 545, 1521, 178, 919, 369, 2620, 2122, 2546, 1374, 2340, 2878, 1186, 56, 2160, 2170, 567, 942, 2169, 2846, 278, 2049, 3184, 2046, 3071, 2942, 2542, 890, 2961, 514, 3104, 2610, 1828, 2052, 2219, 2649, 1775, 971, 1367, 1414, 199, 910, 3181, 2399, 1183, 998, 1614, 127, 639, 220, 1109, 890, 2120, 394, 2253, 2882, 3193, 2712, 1107, 1739, 1652, 173]] -aHat * sHat: [[3093, 1417, 646, 3149, 1510, 2439, 1683, 132, 1554, 208, 3069, 3249, 2119, 755, 1928, 3109, 2265, 2771, 204, 168, 2592, 2183, 1606, 506, 1584, 1269, 305, 1396, 167, 2211, 3232, 2239, 1925, 2382, 947, 1165, 1489, 1453, 2294, 1204, 1339, 2357, 2057, 2344, 2409, 806, 231, 1616, 1147, 1442, 275, 3319, 1945, 2060, 2546, 599, 104, 3325, 208, 53, 887, 3219, 2569, 813, 2945, 664, 2247, 115, 745, 2707, 596, 1811, 1018, 3188, 2488, 1370, 199, 1272, 1741, 2528, 757, 833, 56, 2481, 2390, 846, 305, 1435, 838, 1579, 2445, 3131, 1080, 652, 2483, 67, 853, 332, 1194, 3294, 3255, 1191, 929, 1665, 183, 1729, 1401, 292, 2982, 3304, 2904, 1589, 3043, 1916, 1488, 29, 3185, 746, 2351, 824, 885, 1337, 2755, 1933, 1387, 1343, 3217, 2188, 582, 2378, 1262, 1013, 564, 918, 1595, 149, 1406, 2041, 3016, 1591, 989, 2012, 2604, 759, 1618, 2117, 906, 2037, 453, 176, 2801, 1740, 2314, 1611, 1349, 267, 1905, 2179, 1613, 1519, 1759, 1724, 3056, 1397, 1868, 3050, 1470, 2288, 3225, 2050, 1711, 1630, 2539, 888, 3282, 1735, 778, 2832, 313, 1554, 1296, 2305, 930, 2841, 3257, 1109, 3105, 1187, 1701, 188, 3313, 2296, 671, 1882, 1313, 417, 1354, 2498, 2597, 2952, 1766, 1825, 1211, 1160, 2618, 538, 2378, 2259, 1383, 1286, 935, 1898, 371, 976, 602, 1686, 1876, 2636, 360, 2480, 3315, 1609, 2592, 1223, 1604, 2066, 3321, 2314, 468, 843, 611, 1257, 2149, 483, 2605, 379, 1790, 809, 1139, 1, 2717, 2894, 787, 1236, 131, 3269, 2491, 114, 615, 748, 1525, 78, 2872, 915, 3143, 1380], -[1013, 1640, 3112, 1717, 1698, 283, 2650, 1257, 1813, 2930, 2278, 1322, 1355, 2822, 2214, 2048, 1058, 2121, 796, 1398, 1250, 3202, 1818, 284, 953, 766, 1114, 1784, 3065, 1638, 2063, 1612, 2113, 904, 2810, 2288, 2771, 1924, 2826, 1878, 1314, 963, 1743, 942, 2020, 2195, 1742, 2994, 2777, 1051, 1520, 1154, 1453, 1936, 2444, 476, 2402, 903, 3095, 90, 1397, 1935, 1421, 249, 1234, 2367, 2927, 2734, 2937, 87, 830, 2224, 616, 148, 261, 1767, 1691, 39, 804, 2393, 2620, 2986, 2064, 1937, 1299, 2695, 34, 1886, 2813, 3203, 1283, 1106, 1194, 976, 1563, 87, 901, 618, 134, 234, 1939, 2521, 2864, 1671, 144, 1081, 209, 2693, 298, 2410, 320, 1296, 3195, 3100, 2853, 2128, 281, 2146, 2233, 84, 63, 3160, 2955, 411, 975, 2971, 2343, 1584, 2591, 1879, 726, 12, 2516, 2377, 3291, 733, 2150, 1715, 2498, 2701, 1191, 1242, 441, 1162, 557, 2561, 732, 1511, 239, 1365, 1408, 2163, 1599, 1973, 2791, 2205, 2185, 2681, 590, 2939, 1915, 2291, 2049, 2916, 1546, 670, 2386, 3265, 2403, 333, 1658, 1540, 2562, 2223, 2199, 3266, 1211, 3299, 1017, 2632, 561, 2784, 675, 2601, 3289, 3114, 2035, 457, 32, 1152, 2609, 2156, 2807, 2809, 435, 3219, 1813, 1441, 338, 3020, 672, 890, 989, 8, 140, 752, 2990, 720, 196, 806, 2898, 949, 1540, 1189, 436, 2794, 963, 2165, 2700, 117, 625, 2378, 2968, 1880, 1511, 255, 2956, 93, 1163, 1132, 2366, 2198, 2052, 1877, 1464, 2186, 101, 3292, 178, 2132, 3145, 955, 790, 572, 1568, 1055, 1603, 734, 2021, 3100, 2718, 1265, 1340, 943, 1878, 1219], -[1429, 496, 562, 1458, 2796, 1300, 1646, 1526, 2068, 1558, 3059, 2779, 2633, 476, 1524, 2020, 1637, 1805, 2842, 1119, 2693, 2211, 803, 57, 1772, 3110, 3005, 1000, 1378, 664, 1545, 552, 1144, 2196, 1777, 1179, 747, 589, 2655, 1778, 1856, 1609, 3097, 397, 1523, 341, 184, 2911, 565, 2869, 2097, 1774, 2023, 1999, 499, 2763, 1498, 1186, 718, 2921, 2660, 770, 2403, 2343, 64, 1268, 2356, 1397, 927, 2931, 2672, 325, 2651, 863, 2164, 2094, 797, 3223, 872, 1724, 1474, 2467, 1568, 1469, 1309, 18, 1093, 622, 3226, 1103, 543, 821, 2513, 3236, 481, 1504, 1061, 2103, 1807, 408, 46, 2051, 2076, 1274, 3263, 1831, 1737, 2270, 220, 282, 1572, 3009, 848, 991, 3081, 769, 231, 1214, 3230, 2218, 1393, 2281, 1638, 646, 55, 2878, 3235, 752, 1995, 3169, 1293, 61, 768, 3270, 2151, 2914, 1420, 2751, 2308, 1, 3311, 897, 3016, 2949, 2570, 1330, 499, 2270, 427, 2503, 3097, 3135, 528, 1115, 167, 1618, 1065, 304, 1883, 754, 2320, 2453, 644, 1978, 1509, 510, 431, 2807, 2860, 3212, 695, 2050, 2325, 822, 1200, 2445, 775, 1621, 178, 1233, 16, 2380, 2537, 1055, 3100, 3038, 8, 3316, 468, 2076, 525, 1511, 3231, 2848, 1793, 3010, 3221, 258, 3306, 817, 2393, 998, 927, 1933, 3200, 1279, 1979, 1724, 1302, 731, 1805, 3231, 1478, 136, 774, 151, 354, 2206, 2713, 742, 2717, 149, 788, 2310, 1238, 1611, 1538, 1183, 2396, 819, 509, 3268, 852, 1633, 1306, 1520, 573, 2205, 1995, 968, 2030, 2606, 2831, 2757, 1901, 1545, 1211, 319, 264, 3185, 1526, 1864, 2657, 1783, 135, 312]] -tHat = aHat * sHat + eHat: [[1746, 2478, 773, 1189, 626, 3155, 2033, 1643, 2793, 1507, 2786, 446, 2086, 1550, 1187, 420, 2526, 490, 2267, 711, 2219, 2652, 464, 2593, 795, 2188, 1255, 2159, 2032, 2459, 2352, 2791, 2623, 1985, 645, 2013, 2319, 532, 1412, 2317, 1122, 689, 1142, 890, 2356, 218, 2645, 2390, 2268, 980, 472, 66, 2285, 3237, 277, 3127, 1430, 2088, 377, 1077, 332, 12, 1050, 3210, 1555, 482, 847, 41, 1166, 3281, 1800, 1679, 1188, 789, 2828, 19, 780, 2936, 1101, 2640, 2427, 1915, 2227, 3021, 2803, 2682, 396, 698, 120, 271, 473, 837, 2706, 1512, 1629, 2569, 1065, 1067, 2212, 2177, 2819, 664, 450, 559, 1712, 2875, 687, 417, 2538, 2562, 853, 3029, 3057, 1549, 2938, 383, 2048, 1537, 2223, 561, 188, 991, 1203, 1051, 1754, 929, 1320, 572, 2981, 1135, 1641, 1066, 1076, 3018, 465, 2034, 1010, 1462, 1753, 2055, 1023, 2265, 444, 239, 661, 2707, 2727, 1465, 2567, 2531, 653, 299, 317, 242, 686, 10, 1206, 2102, 142, 120, 2847, 2594, 2644, 3210, 1168, 1770, 3112, 846, 557, 2073, 299, 1424, 304, 1623, 2686, 935, 1354, 3255, 573, 1941, 2254, 1032, 1370, 2780, 684, 91, 542, 736, 3296, 2490, 959, 734, 2287, 1641, 894, 1149, 2989, 924, 816, 3247, 464, 915, 27, 2471, 334, 2950, 3037, 1012, 439, 2900, 189, 3062, 48, 340, 1518, 1127, 2978, 1428, 3306, 2589, 1847, 300, 1104, 1831, 1643, 2151, 1516, 437, 635, 1724, 701, 251, 2243, 855, 820, 1262, 481, 3023, 1899, 2743, 1609, 1642, 1656, 2420, 2135, 3127, 1733, 2099, 4, 2613, 506, 41, 601, 759, 63, 1768], -[1134, 2971, 1844, 1590, 254, 2351, 1067, 2924, 2283, 611, 687, 1263, 1709, 3324, 1902, 1988, 1326, 1472, 2811, 2311, 3237, 101, 720, 2603, 501, 1537, 1641, 1198, 91, 1925, 1984, 1973, 1992, 2318, 1806, 458, 3124, 33, 1453, 1256, 165, 426, 1778, 90, 203, 1666, 1237, 898, 3277, 1549, 2224, 2083, 716, 1232, 1043, 1520, 1579, 2826, 1780, 2724, 1445, 2169, 352, 1942, 1861, 499, 3287, 648, 1700, 1904, 1958, 766, 2897, 2531, 1798, 2710, 1210, 1135, 2753, 2363, 2075, 394, 820, 1138, 658, 2602, 946, 1803, 287, 2931, 1743, 1988, 384, 2447, 273, 2996, 1861, 2359, 225, 1795, 1169, 2236, 1113, 1601, 106, 3302, 26, 339, 1859, 2519, 892, 1059, 1965, 2417, 662, 3148, 2368, 2525, 1273, 445, 850, 622, 2085, 682, 1445, 1951, 681, 185, 2815, 2411, 1871, 218, 2482, 3205, 2142, 3206, 275, 1976, 1811, 3060, 281, 1240, 2469, 878, 1610, 1108, 486, 2338, 1341, 1481, 2593, 1361, 1491, 3205, 2582, 77, 2675, 2608, 2084, 1504, 2914, 1298, 214, 2481, 1609, 1855, 173, 237, 1857, 1364, 712, 1184, 1696, 1265, 1316, 1749, 1773, 985, 1121, 897, 2902, 1276, 1776, 2021, 51, 1842, 3085, 3067, 1554, 1775, 43, 2855, 1024, 2661, 1246, 618, 1300, 235, 3063, 338, 367, 1173, 1788, 978, 215, 926, 2757, 997, 745, 2008, 3321, 1378, 1117, 3154, 2654, 2064, 2502, 1124, 1173, 1235, 1940, 1160, 2735, 2555, 3190, 226, 2985, 2928, 2340, 1944, 2, 112, 373, 918, 73, 710, 1864, 2220, 148, 1652, 1164, 130, 621, 1747, 1145, 950, 175, 871, 3270, 2022, 2562, 2790, 765, 2058, 122, 3030], -[2431, 316, 2915, 43, 1332, 2314, 2712, 2564, 273, 479, 1600, 2082, 280, 1418, 1923, 2871, 2007, 438, 2443, 1929, 2457, 2945, 2158, 702, 3096, 558, 2260, 174, 1823, 2130, 2109, 2376, 1049, 1549, 2014, 1391, 1146, 1386, 2425, 3142, 2096, 3124, 1067, 1576, 2473, 908, 878, 347, 2346, 1894, 2218, 967, 2781, 2241, 2391, 2922, 2235, 893, 1696, 576, 2997, 1208, 2979, 2925, 2107, 523, 2830, 3207, 392, 3048, 2493, 602, 188, 650, 482, 2729, 540, 1330, 156, 1277, 2448, 208, 1151, 263, 652, 2947, 3074, 338, 2193, 2076, 999, 70, 226, 2068, 656, 254, 1289, 1274, 1218, 515, 738, 230, 1949, 2616, 2576, 2376, 2814, 1838, 3029, 2042, 2511, 1835, 1766, 437, 2842, 103, 2607, 1665, 558, 160, 1698, 645, 530, 2411, 2900, 2327, 1144, 3282, 3256, 1416, 2603, 1669, 1936, 1969, 3271, 2320, 3244, 2474, 2494, 162, 3307, 834, 679, 878, 1417, 3253, 2629, 838, 2131, 2742, 2531, 443, 3143, 783, 944, 930, 2569, 1947, 507, 561, 1418, 140, 1740, 270, 2197, 1359, 706, 67, 936, 1725, 3324, 1762, 1797, 682, 1269, 1202, 279, 540, 1, 334, 1873, 229, 177, 1377, 1406, 232, 121, 12, 1044, 1042, 510, 1540, 1282, 1111, 2550, 226, 1413, 436, 896, 1186, 1684, 3120, 144, 3307, 2211, 828, 3165, 1780, 133, 2901, 2372, 844, 318, 2982, 1052, 2200, 209, 923, 2455, 355, 1930, 1039, 420, 2824, 1013, 892, 37, 3235, 1286, 139, 2284, 910, 2219, 3047, 1505, 2430, 425, 1275, 3178, 1966, 315, 2733, 141, 2977, 3010, 2435, 2, 713, 2517, 2738, 1390, 1247, 435, 193, 1787, 485]] - -ek: D2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD -dk: 19D74AD5472A8B2BAAD2A56702C9B3B5510EF3924858061D57F90DD9A1A01FEC2F57C51A888805341B617C515539597750835C3ED7A033B039D72491332C5DF4A69B6DF26171877AD1E50AC50100BE4728786685DA7A739E843FF0D45922D7281E210D5E82B944652F4862CFB3D902DE60AFD0A164471B26144A1D7A38096503095911762EBA7962C4511D05A128F2781ECB3D1F5BB1244237611ABAB924991F8A2732E27032357920F197C7692D60A9444472258CB457C1B71B77995469F3A962F3ABA6699614FCCCEA741E21C600C4357BBFAB452927C3D441BF8ED73152F75C08F540E186ACCA3326F422C84B988D77E61AE61859CF8541F89209E4983040C5617654808852B649B899A399AEC2C8BBA8A542F345ABF2813F65E9A791D32CC2D76026FB8D0C94B657489ABB487DA4A2C0E3868D3CF47F1CBB2FA79C53CFF6264777C09B177C91315484D2B30B0CA21F55ADD23C57E1911C3F086BCAD21798486EB47B7C58577381C09F5252582D1B27A7D5B8E060CE78209CC82BAE4DA606800C8DB1268F7AD2B793A44F34612CCEA31CE7D796A65A2691D61500625F83E7BE57077EE9C1B8C1CAA137CC4B6573308C19668B24B01E966903ABBCB79B67BE0A3E3E058AADA189B9EA80359AC26F4C5C53735FE4FC35247337760CCA3529B8D266BB6C48010654CDBC5A3E9757524675ABC413130CC2701F28933EABB8392B0D6D059CFC3A30326C4FCC810B37A4748C1C53928A4913E48B186697162C33FFFB06DD5161C8639DB195C6CA64829B2B3A2E4C9683B66DF7FB1909904E00020DBA134E02A168D76AC076BB77D4DC8496B4BBE7B4690BA29B62A91ABE72BEF323A44C8903E482B60D99BA61D1BBCF9CB9673534C1D647662374EE2C7C5F0081BAD149F44206717684D9746B2048633AF7A68C6865FB590358D8CF821458369B0C31EB597CF5BE78EB480EA04E35FACC380372C8C0A04DE276B1A72121E596CBB25EF7536AD3804184A87BDFB5A769160BFBB0CA3C360790E5562BB78EFE0069C77483AD35CAC237C61DE78A7DB46FC917124CA17510DB7DA218890F448EF6318613A1C97C928E2B7B6A54617BCCB6CDF278AE542B56AD7BB5ECD8C46A66C4FA0950CE41352CB85711890458F299BF40BA6FF2C0713862268B5F08E49845B09443997AB29A62073C0D9818C020167D4749231C059E6F483F976817C90C20A9C937079C2D4BE30DA974A97E4BC53ED96A55169F4A23A3EA24BD8E01B8FAEB95D4E53FFFECB60802C388A40F4660540B1B1F8176C9811BB26A683CA789564A2940FCEB2CE6A92A1EE45EE4C31857C9B9B8B56A79D95A46CB393A31A2737BAFEA6C81066A672B34C10AA98957C91766B730036A56D940AA4EBCB758B08351E2C4FD19453BF3A6292A993D67C7ECC72F42F782E9EBAA1A8B3B0F567AB39421F6A67A6B8410FD94A721D365F1639E9DDABFD0A6CE1A4605BD2B1C9B977BD1EA32867368D6E639D019AC101853BC153C86F85280FC763BA24FB57A296CB12D32E08AB32C551D5A45A4A28F9ADC28F7A2900E25A40B5190B22AB19DFB246F42B24F97CCA9B09BEAD246E1734F446677B38B7522B780727C117440C9F1A024520C141A69CDD2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CDECE9E246AAD11021A67B20EB8F7765AC2823A9D18C93EC282D6DBC53CD6DF57592AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC diff --git a/tests/PQC Intermediate Values/ML-DSA-44.txt b/tests/PQC Intermediate Values/ML-DSA-44.txt new file mode 100644 index 000000000..b9e6612aa --- /dev/null +++ b/tests/PQC Intermediate Values/ML-DSA-44.txt @@ -0,0 +1,11 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +seed: 6CAE2E9C2CF64D2686C31C2118E0F24A47DD46DB85590910AAC9DF4C1B854E44 +sig_message: DA5FBC7F78116BC8537E8E522DFBB6F68710FC36AE5AF0ACE5CFA3BA4FEBF6C86D966A44C2CF53CCC4FF5B9CC4E6403CFF3C23B4F292AAC01E35A21AB11F0707726E88048DD05887448B870741FDCDFB4451E1216FA2F89D90D872B67B4BA546C8CBF504A46FC02036FB5B287BC82DB9E2D835802DDE3075C7B703ADF4FAE4F98840670964A1ABC61105C3B99C78609605E7F17CD262BE67F7E7A2C6ECC519ECDE8D5B76C21FE5C15859FC94382608A15C7E656AD8E0042CA649EB8EEB59B8E266C244591B265B672D4654C5FF28296707815C647DD11AB3148AEDE24E96D7ABD6C479C0C367B00E464804184140152063153EC3982987618F7D9BD9812DF3B95DDBC47D1F96C752C01B742255946461509EF7A7A67DA0123D670845BE07725D9C1E9F419B4B9133EBA36BC90DE45666C40EA664D93A16948F848CDB9688E116B00B0A4F03B26BB836DFBA93EA6247550FD983371E360F04C9F2793EB769A00BF4049E94F225EE035676E983FC9CB01D15EEB621CC0D4B840EE777ECE351EC66C4B28A36FAF02C42B24804E8126E3852735C2A6F6E201662DC18E125210C78197372B4787A8163ACF4B758921AB23ECC4AB8F3C1DB3549050E26F9C35594DCC1C27AE5999DB695A19681FFD9CD4416E0C79E3457C0B5144F3993E945F6006EA0F541B1C3F473D78F4FED4011E07D46F8DAF7998BBD4A9F5161050D9982DFF28C72E15D158A630B8972E8E2B70611C299BE4BD3405350D2FEB84C93E97FE4DFBDCA5BCC9B6708D7E542D7101BD8D5589BAAEC5649E1C9844C37C5DB0556BBB6B2EB577FB65909B1EBFA7F1590D53D98FC9975BC06F7AC581FE22066BACCA0375AE09DBADC8940E98A38B15FC190523FA6D0CF326D7495B5CC948AC994181EE0DFCAB11722E1B46AD6FD2065442D1FA06ADF21FD9187B55320F554B929BC795F367AFEF11A5CE4128AE32E6C1662D013A91456AD292DFB8B4C161EA7A4D5B43AF63BE7BFC5EEAB9D1E3198F441AD70DF9D6BDEAEAFBD0A293F1A6DF07339A4C34C7375CB6096EB06EC035777C22344912DCCF3D0F8DAED1D0B046118A22886299DA5782DC77487CA5FD0D3CFC724769D658131FA415672996CE8E8BED83E057E3AFE26703012DFED31C732D770FFC7FA55C59BC3FD68C34D00738FC9E3DBECCF4B695B99BBD6A0082752E3A95150AFFE793D8F7FF19BAEFF7744688445E7B561294371E1909035929D654606EED6BD011D2CB0512B1A0987827BB07F14E0E8F0207519DF24BA69AB788EFAB21F1BD69BCB14AB44AED8FEF80F1F63685C6A85100DA1671405F8D6454FCD7D5FB6656959AD68D3E1896C6EB4967615332993D4207DB6B0F5A6E33EF4B2494DCDBA368A052FB8CD48A9E215D30C8C9D37DDAA6B4F3080744E6861B9889E23E9D964F75C5BD5E1DEA98EEEA8E66C60DA73ED1E39115EE0274F2747858D5D644C09B5EFC978D4496A007DAC35F2F68B1F9A3B43A638F38F663E6124740234119D6E8DBAF933ED0FD5A02FEFFF7AE3235C82D90B2F8557DDDC9102FAAF8181E6EE3E9BCEC78E4C61F73FBDA23D4382E5050A0E151E3F51BC22347F9B1A19D74649558ACFF8B21AF69EFFF78BA3E83CEB9EA36D4799272E10F56D3C151209C99105A133B665EA51E4A245D37E7A0F84F5222E3A0401E67BFC1BAB6269CA4A87D3CF062CFFEEE0B5EE5FBFBE1029E93F46FAE68A91CFBCBD5CF8B78F122AF22A11E77095DEAEBC96F1613911E02237F795AE717301499936B440E07B32DDB09008276C9A5A314889E8B9ACDF32D6695AE2931CC29ED1DAFDB61B708B52F9888DA67ECED25217F1A5FC1EE7D482917C7C7E44CA7F0508FD3BC94BEC116A630ADB08DDD882A221DC5D2C60A2E9F2F849B3E8B5DF150EF753C35251850D0B4980164F8C07339E035D5B2EEC4BEEFB885E261E401BDBA408869951075DEEED3C7EE7452AB39856D240E954FC8A4BEB01A0F79187BB72DD2925E63B3DE9E16CDDC041BC3BE47F318DA6DC6A9AD8710B18883367E374DA58D97F00B1E75AC8D4658F04295223C8C4F61B2CF7104492DC7A0C6267F45B5A4A2D258239455A31D265BDBAC9FA6E4A1812043C9112ACD4240625F08B901263EC456D2A5877BC9223A6C483673BE5CAB8C32516AD5B956688A01374AA48789D53AE79E7FB109632969E45684804DAD54FAB1E94A19C2A9B53BB9079F484C64A924C9C940FE5A3ECF29C739E3826311E42B310CF75A47B932BEF104CB27FF35D51E3FED9D724D90A17982F2897E2FD09E555977CD668E67A34216637380B8720A593FFC4175BB27E293C652C2DD8C506F4D1F551542EDBB31EFB3C1BD5DE6315280BB04BFA53CDC2D38C385C04E9BDF389745ED394147063CE3639ABCAA429C68475F9D466321EEBDE9392A2A2A6EAF53FDE20803B76B0903DDC6C81874A81AC147FCFB9FDA970BA5D87E4C346DDB83B60A718882E16F256A0F13969606C43D84AFD193D7BA3CFAB875646401547458F36DD53C2182B36B84DE8F8A50E62921A5B011319C555766E46EFECEB239297DFBFABEF3AE370CF48A08BC073B1E16A8C840F2604F75F39B3F0F4847A445A15F0B946D423210BD32A09A9EDF4CCEAA6E90AD1379E5928B66BD3A02C5E2AEAB56E8987B342EBFD9D3C70EED3465D78F12AF4423319B3106AD8BDBD9AA5736E6CC15C7AEE0DC78A1FAB83015CF880DE6249734153F6058F567D648AECF70D1BAB8397879617FD6FB06DA1AF6713E3CE584B214742587A5D35C6DFD33AFDAAF00AFE00E1CB516C955DDA9E0A5FB78DEF914B532F556D7E72E9717BA49A2D0F9EAFB5F526565C58E0FFC1B55138C8DE7A9D6CC06FC9927F6D04440512163B58A236F57B093E80F3CE0F4CCE282ABDCCE284057C4DB6314E05EE0A32B5F20C481F8BA4ADF943CA1B0277119DA1BBC4EA1D24CF7E3DB4C759E98753EFCABE2FB5B1FA593F2AE2B7ECEA96B8E0E5B3FFEEE97DD6C50CFE8602613FAC2D71174984C2EB59E532A35CF4FB0BFD60B8CF7CA3E7D5C0EEAD822648533D3CDE72C787DAA412FC70674E95CE2F5BF58D3646B4881D4CB6DD96659BB1A937B24795B435A103C03CEB6AC85E8FFE9C495082A87854392BEA530D61A7F60B3431455DB85414E6C365F9721ED2DD4F7C8A37B88131F5B2FFB5FC4A40BDB12EACE61AA956F8724C99DA98DAC18F6D33DB5F4A189454C736 +sig_sk: 5AE5192442A0894AC775D84419BB7EDE9E8143A6E21CD709A47B58545EAEC7F59EAD08050900CBCF4093F9327CAD67B7600D9F8425084B6905BB6550F426F58B27B47C434BC194D466D83C14BF5ABEA249E05287EC80D1B56BD0824E4EB84CE1CD4CCD0DBD1BDE59106AE10516E1150E841B03E759DFDD930F6C7BAC857530451C438E128029E436491980441BA56913074A8A8831E084641A152C40B865C9A22100800C13828C1C080A84C850221688241100D220085302695B1881524812C832881CA970D91445A122221226449106800413504BA86DC126321C312288486280A64463C261C220220A210653C8910919925308200988640A3100CB9868434050C2A06C1830482138640CA80D03339254C44D42B29014B9500400220BB38D8C269010B62DCC481261980522A03050A489DA2225A120859BC80480129252906193985182B470584481D2806448C669C8B65164B6219C964143262D1294641887111414500A166D64364EC282095C980502202683C48113A20559B02D10090DC084519CA6215C8885E1088990200E11126D182129D422421C2811214611582829482830A1400EA4400A428040D0882504C72111B20C8A148123002C53B688943411E0448140044A03A4111B042C6330715204285114864B8004E3B649E4B831D13264D814094B468881424A01430C41388008478A20378A01A8080831228CB285CB880D0A13499C860191848D04A72192A80181248959964D0805202341511A36081012842407300A1820D39881E0164A0AA669A2462044240C54084D1B208C923869588428D1144E63920022C94DC9320800497111A28909B384234591C22452D8C220C810610106669B062959B24C11B38941149083886108C488D1462682B00D14B8685AB65080409119B38DE2A44D1A0161981489A196610181514106019B0804C3C461A1823010A32D21876098103190425252145293A241534692212332A1828D40286ED3288AA38689D1048E1C936910970DD4125184C891D4246A194609E33426D0A485481605618489124126C9B6281C2111A3860543C05158386121828C1835645AB68C04892C03422EA148065280910146852219205B3292E1440404A908C9C884E4928C5342400C181010064A1BC07142887010284D2241602393905A88455A186E618445400884139084D4406964140288006A63380E18362E98160C04A7894B964D04844051B08419450612912411B410E186895A00318C129097956ABE59E75ECDE4E7482F0BB70D6502309163C9467EA51E7B467C114BA884CBDF37291400166F7E2450D27C5A20FC1130192F1B482740712446605F49EA14E3C35515D05EFB062339E69349C7D416830F426282A4C0C0BF875B0F8D98BCA9B55BC1E199C9482A8D5CFEC68166F9545F54F3B0BF14B2117DDC6356966BE0DD3CD42FA47EEC9FE4058A0679F3EF50F7306EDF0DBC58D2020702F3C1F0B23A70C4B9023B43E7EC670EABB06869A3AA3D315E9606F0216BAFE585E0006BB6656E1C146E2396A44D3B545A1D722B6BEDD33B40433B7A9A0B91DB43A0AE280F57DAFF4EC8E534885C436A6745FDF857A093F9067BA95229CF52D0C8DF29C52736EFD4FA98FC4C71F6A94983F8F008F29178BB53CBDD56A045408151FBFDE28941F7D7446D5C2B2CAB3C418E04C851D230A49F288713F3E7221CEE86FEB67B469B076871A7CB576D423B5CE20FDDCDBC6F3BFE841C494E6D6050BE92AED653F7B387CBD662AFB7B01401609D66EE5739BC0E9188EF3F61B23F6402A8C60D6C272EB27E3C36ED15A7D95E1BB15C8DF6774170CCBF50A2628F1E80F3007BE33D0C5D86C61BD927BA3EADCF000C5B4A1BBC0889C42183A1FDFFDA0FDEC7A2CB5148953B3C428F1153E802B0E60F39EC4CF4108DE315B8870E80790E6B67799499A768A60F0E70EE861369F0B0110498B206B01AEC9C56CC335221E675F0DB77B6A2F9BE317407442F152D32E2FA57054C2F05757079D29BF85077E571973C5410743C679AEC39B51163A9B3AF4049647FA008AC5E304F82AF0A0F28E5CE3040C8D9AD6799BD4E70B7CA23F965FE96539EBE04ABAD5DF057FE26437FE44289ECF68807FD2C8900A0D3C5B3910BAAD7AF92BE09B83D0E16CC617607623DD8A2A8ABAE82C48C1B383C13DFFBC62CFC3F45B7A0150E799868D55AB5A9F67EA0D4D35D9D2EB0317768E1F67FFB8DCDC9A6FF9FAF58BC260DE56A0165900F4C54DF209CC148CB93469C59CE5D0576BD2CD40BB0D0A9EB21A41EADEE0039D603FC2917366B7F238E75E431ED7DE076E9E72701DB873D86F73A4A99A82538FDF5611FC42BA4D899BBEE81EC55E997A697A9591AFCC2425A570BD026CF0F3DA4999D0CE7C2238037D8077B3E13290DF420A41771548FF2C2D89416FE776481236B3AE22DD2A21EF8EDFD5E2CA526A796B568AC47B3CD4FFB0743771E647138AFD6ED35AB242B0252DD19862AC4DC3310D905FF68DB2F53038D176D22D350401857794DC2E2C1443696E65D7886759A5ED653F14D9F804FE55E45DB4090C0E166C01F1FA8AA939B8D83CB3B1B65ADF4B31656CB8D04F21452BF2B6B36BC18A8EFA7A0E4AB67479844DE5EF231C8E8168BCC252411E67EB3F6598176F4D6739DA69AB952CA12B7A951B2333A991477CA51E1183D2769CCF90FA87EA2C62DF0145990C787AE739D5802E9362E5EDF969DC71FE7D2542A4DD1EBF12A08240BAB3FB4EC2126DD0C0AC740EBA06CCA2AC6ECA57E4094ED4C818965105037D1EF2E739DC2D58F2554C40AF69ABBD483A896654C5A26668691A6A8C005ADCA4EE51BAA82DB5D7495E29FBDE6DADC67929A60FA95267A1AB764A1A41B3CA0C3FE03FB5A8400130E6ACE93197D3DF50FA789F16BFBE6B292FCC2E9C03C792473A70AFE13935DF76C2E5A2FAB154B5CC5723E5611BB363B621EEF74343CE19AEED62BF771DCAAE501977CD573A412F15FC8D294A512B7B412F462298713889F6F9E7DC35A0541A2A306CFB9AECFB74C0F94817AB81C804A0508718269E5691A24A2CFAEE8D0BAA69BB30FE04C45881485B2D67AD09D5EBB43A3508AA45BA2D54CCE4E7FD7B679E735A4D78E8DB1BB1583F1C91B0330D2AD7A80C7D2BC60DB220287413E9B4DF7F68E8A8541C1F1F85D15BDD51C6902DBA86A67B2E4CD86B92E7BF58724AC5A53219216B78BD1B50CFBE9B468A667FC6C4F35A610E7AECDA8A12DAB0C5A658005879E2608EA6549999DE0C396E2E0E19895E77A68356EA29BD2A1F24BE4552E679DFF66EFF39235183E26DF4D23CDD284BE2D9D706A301CCF33D0C85DAE62ECCBACC1503246B853603F68DB14C2E0B972BE2AAE6856BEEEF83DE2227AA876E5DC62636E2E95BCE79597E01A5A3FEAAFACC205AB09FFF7641BCE3ACEBDC6E6AC2C95276148543F2AA1A4E949DE5F35F4DC1048824389CB90910D47C7ECEF591BAF68D6A456B79278F356A6C34AEBC370EAFB722F0791033708C24A3CCFAEDCA515C6DC1B83B85251A2F665B3777E1805FC8F98F9789944139C60BB8AB0BFA34D3783599707BD44CC99D2E4ED71F31EF7AE6B8FBAAA4A5377DF40F8D6A4C1F720159E57718C78FE40 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +verif_signature: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A1523FA43A15CC894A81285C4BD0E5063267D317BD1EA3E3A2F0AEA6BFAADF074926F5E522140F00CA40BE0C60D492C7BF420EEA18F2C922A0570FBEFBF07CC3D084793D4D07F9FAADF386C6D1C24AC98F153313FD1C5957D02C884B21CED24B3BC5148F9F837EE94E9FD03371342353D627FB43FEF9472C832A1DCFAD355DABD974AC185C2FF7A7CEED63124BA86696F095D419810E381FA62B66C12D2B75E8CF59B0CB76E9D0546D71D9BF154D0D056603666212ABE8910E60C08DF738EF0EE8BB794B35C6E47E7BFEC734A6451909972093BC17E080518053EDE94905978F397DACABE24A6C4194F0305C0F6839F8D9993A6F6948B9EF3984A90B1C3B2E9991449D1B1BAC5DD54A2134608851662F6F25E8ED9BCC65D199A770F20D2A28C35BC56500E4BBF0823615FCD07452B8A558F8146081861DCA6A6EE9E24C688DC7367BEA1E00181D8F0FCFECD8D46A607C08CCADC32499BB73A9C664CF07817C7D496CBB428AF3A06ABB3C4A140C681CF8A6B7216A64AC4BD3505E4AC5C08C076C9F34F7DF9157BA1141628837B0F3BE1064D3F4908FF0DFBD83426C90ACA12D8FB9C9F9955B5959EF6DAEC31140CE117D9448C813F2A940D54DEBF844E28CEC621CEE34A9F336C0294572CD03AE5EA6A9B7199C6FCD9E20BE47214FC0F7E0125A6D8B8C397CA9D497671BC41CA08CCC153AEE53ED7F52D678E2C1873D70ECA96AB6A43ACF1786BB018057F98A4311751CE6C3D8B0C4601A370AC792B081CAE7581AC836F0C0BD3F11D2A78EBC5E268F8D19355F3B4995B57736C042F1B7B90EA55899011DE84A2CD0F6BD440D51DB2A6BFD93E5ABE620BD0CF9452ED0C5F4EEE9B724B06FE1981A16CD14D554859ED4A1B205E4527B66085587769ADFEFC289D07B09CABECDB95CE52587B7BE95D6D5068C05AAC009CDDC7AB550CD49C66EF55A86EA04765C46E74CC3ECB02650797966A6F125DB780C3C507C2E2B4EEB148B243673FB5FD2865533CEDA9938821221A01A8585EF76086E429A80A99AE31A2A6D4541AA3393FAF0A092B3744D8C742239C18F7AA3FA258FEE01736D446785BB9C0086B6BEB05AE13BFE5E5C462A87C35CC5731218EF2AC902B4505A593457F553F8F4DA1533B2B144DB83963663C3EC991C6F834DD9C75B21E40D0060646E323468C1D44F6071B6135CA41EADD17F4C36FF21C5DEA01775FB519597D4F9DDDAB30CD63DB37E8F5C0620EDCBCF2C84595C8DE1E10EA2D8D7A8A2B7D45BF84C0784392E0C7FC74FC8787C118782E57802DE412A1E99D002C2793AA614DAA5685C5D4253FADF0A630D1150DAA8D8D54F4EE0F6081E59434C6664A933167C61262FE7A16E3CFC18BF9AC42C49C5E0F9928F2DEAE020F5E105BF247E4432F4263E6BE8ACE9D8D8269B215E31782DC83B0805538BD75503C2DB6E90E99741D120951598493176499DFABDE262A16F28EA1FD183485478BD4E906DDA0FA037A7061BB28C7031BA4DE21CE4B1F736B1DCB12ECBB755A1DBD11469A924F417383E0B0AE22739C8888477FBE24336C2551040B3F044B02F28D4D5C3CB4852871DDA6584303882AAD3DEC7D6436E0089F2E2E4F6E2B5FF628DC565CAAD8775C1DB24CE7FEF3FCD524821CD58E43443D1669F3E4DEB508C7A2EAF0AE8742C06C537520EFFC894EE1F58EA2D335E9B8986783CFD4E3687D966A03BE25A8DA8F8565FDCA33EF9F5E8444F0966F73952354A985B61C2A4520F7758721FE9E667EA36A746F999B6E1906747555A361CAB9603A68795B065CEAFE7625F3EC8CCD9589C9E4800AE2ABCA461734BEDF46582E2820F129E4030D6A2E967BE349BA20DDBC5DD04EF8006351EB39AAB145E0E5FF648491C016AB7CA26E5789BB184DA0824F699AF597ED6A252C7AAE5F60B0119F74C439AF414545B2C1299DC546EC0C66589AD70C2DB8EB517E3CE2485C0F13D96E699B0C7C3AE607619637FE5732A31DBDE4565A894478A00DFE78BF559E0E9BB65125B1CB5F1A1A221C9C8BCFA3D294646AA9E21F4EDA1825880FCB7E1A4B7F42522442697A677ED9F3777F8CB8BE61DA12BB182C3148E9FA395E95311C0C374698C462407FE98E188FAB09057099915732CFE16DD35909F912A42E2C5EF0059139DF8AE6D85FAB29B33973E40EA0C592B066859611BDE45C96F2397FC0FB5F07A2E8F2177FC2C8EA2E3F357B5617892B071F6366488D0FA27FDA31D674997BBE9B0234459EEE7E5FB606B405448DF0322782B55D5DD83459B55F6041E62D47E2EA4389A2A29F2C4FC27CCB0AB9907952C9678650C57C0B909EFA205CA27F25C13FCA3E572E484F0F7EC947CD0955C1020FFC6F1612BDA856C8E540E6A41EA9D0A84C7E9DC6255BAF32C3D135A299F00354463C3E1CC0B3EDCC309F8F046BD329A19F9B747828807B958FFBB7D6F05D77B3D354948CFA9215EA79DD62E0EA95BFED33F9BAB1B92623AE9DBD4512B4A4F6B8C08A70CDFFB6A91609309752707C04D183651191B1C3964D6AE450334E0BFF52F7E1B64273955056E944D47041CAEF51385F01F0ECA4973BF2A56FFD8ABD679BA6983161B7EAB18758A5BD62C61693BA3C724395F5FD69D94E242C6F174FB26E7BF0B089BDF92FA03C4C1E663C99F2E22A23ABC3810B0EEB6953B1EAF7F2207616400CF79E530AF203873BCC0DDDA656BCAE9FBED9B20F870877002DCB79FFCD2CA91266FC8F8EABEBDBF71F7032EDEF77C3FDBBA35161A45C22F1248106A4AD3B2FF1132A24891FBD3E79DFD2E0F44F4CD5EFD5D07BAA5ED8E13A406FC9E813460FAAA196E4DFAAAB4A8F686A59ED6753DE8A7DFF287BF24BFD60FD7A84A431F80D84062F4157A4B0712B89A3743C80FC0B5D8BA8D4A6A6D113C029F5579CAF30A9E458BEF1903A989753237CBC69109DC435121FDDD10892547F41EF4DA88F35CACD6F5199E9973682440ED4AAA0F98106CF86B30766B31C55DA18EA8C0FB67B0C937FF4727CD8FE157F6E96E73138F1BF394E7AEA8162CBFDD548F3F4633CBE99CF91A9364D4C93E6ED58167670DAED4358D517D9CD0C9B5F771EB2F9198F91D833CD92ACBE244C6888F9577BC8CB4B514E89C03DF1AF38CD355426A21EDA4EEDB8791B41BB13ACA2A5B6637B9985C1B19AC3D5004B177B8DB3844D3A7D0573CC2F4237A712D2D4F42D3429C13E189913EFD4DC4B382B8E14873C8FB7D3B885F208DAABDF186601DAFE85E02D2B47DA258B5D554C2ACFF9D12C2260AC96D5E150C98A226E212151A49788186899AB4BEC6F707203D48526F75848C9AA0A6ABB2D1E200181D2C5758606873777C85CDD2DBDEE8EDFF09162527435861626AA1A4A7A9BFD5F900000000000000000000000000000000000C1C2F3F +verif_pk: 5B003CBFAF3E5166A85F8A45B9C1A4533FF216FB226CFEB83A81A20EE6E97E540FE2E3C6E44262A8C344330126E881551371383EA34EA2ADEDAD1185908B34905B09FC1E1304BD96225F36056C1B2099C624E770227D1E7CC310EC1D24A8F034FD91CD01FFDE608FAFAE157C6589DBD5F63DC8F57E857844AAA44E0B644E5F6BD684239D145F3D45A8454BE4BB588AEF4245DB3A0BB949322987B9C40A7DBD37A4526363FDE5EC3778C1F72E85230187A9E7B35028C3EE5CF8AEBE8748C45D50E8E22A81E70494C11C276375A8AD230411DB26C8100F07C471D69095575F09A1EEBCEC4C9C0E050B84DF0D4F95E558B921DDFC8F26B2067680998E9C99488EFC128D5BF927ABA361FB5E9CE7CE32C0524EE88FBA0F3BE5A1A7C55AE6C518AD4C7A33C05E2956CFC8DF6EB2A81FD1EDDA40F67AECFD715E4E3DC042AA939ADD3D275AE72CA7EB85F0F0B38884D0D7DE81CFC8487411F8A84247B82B2BC28F76BBA2D80BB7009697A7FE729DC123D11E695E60C024FD31D5F94F5C3CA6B76A13B7537FE6402DDF86EA6D8D77718D03B32505444ABF4BE76C01FD43CC86CDD5736E469DAF3B9A239DE67FD4C4D99319B0BA690C424DA2F3E68831E5CDBA77B49F20D138A3CAED4EAEC8968F33169C3A2A7A28B39B875A6C18F5A3A7F49E6AAD46D475C99FA980BCA322FC69633B576B30E1E98F771412A1267F0C82653562F755BF39DB93090235870598E405BE0F8A58F033F19BBDF126639FB85D6030CCBF4666384943E7F4DF69EA767982D82147D8F52955EBB3D3A8D90664AE9B9610CE8A8F66454B2C518BE42853BA93C434C8D9E072726BBC8EACE2A218F6DA2639737541FEB2016E3478E3443442381A4AF18004C49198D2A87154DC6D8975BBE20C22DBDC1B95DEB7EB74E61E5AFF999833B746221FA13BC442F9F25C6035861B7A5E75615CA6749716E8CEF56CAFEAF04CCF6B824FBE295C55C2D796AAA7992C49C4903D362AB50AFABC4AEAF6644106ED2F749CAE8C970D4D49B79A98ABF6CC3933563E499C07B52B80F963DE9A5C54FDC1EC4898B7713630D0C6F4CBC84DC245EFCF821FE382E0FA855AD32E3B70D38772341C0C3000D2595F749E26C5EA692A0BD42251A5A9C5653B995EB6B83A2FB8635C0EC0E29F9760A4684591D0CEF71D46F529204BC56087EDAD2D37939040F834610B9BD3B616C87E43B49E8B38D21B9E8B936B4DCD90D73C12F3F6F66A111738B16A2EAEEF8DF66C61E78D29AAA2D1378DA0039ECD56CE7231A5ECE7EC2ACAC469A42B9E323AC420D86A100DCFB78B1716A0365DA724EE0EDC9C4E1115E3BE71F4FF0794A10AB766D49E11EC1DB556816627DD54BFCC22CBAFB4F2A2568192638B9789E3020A2802A4B90F9DDAA36F650546D41600B2F33A86B1B10E802EF9B7C4DD1975970A930B0CB383E3916728CE1E2C698DB19AA027CFB620D88840C51DF17657BEFD3240510D95A0B6C480FDC1A1346E00C195CFFA6BA7822625F9A47CA029C29858F07AC0A86F4A1D0792635F82C15D5DFB19CCC415A2B9556AD67B1806E8AF681827B1C465D8646B481A00B7AB68C7CAFC623656D2FDD9431EAE0171B96885140196EB7F1ED76BE72AB001CDE7CBDB220DA5EECFE8D341EACBE12878011CF85681AE8F4BF0A9E8C40087FF51692207C57E0BD3C1F45E90F22B5D139008CCCDF10795EF0858C5DC3F6FD9F78858DFCA5D81510A9682EB45D0E094DEED0454101B0B28EAD2BFB7CF1230994E03BC98CE986F4CE7720577DA9C8406BAEFCB3F2A8B9EAC2D1A5C598A076E52BCAF2951CF1D4339757F5C6C522C3BC4B93C71E47B639A6FB8FFADB117C191B4B9D0D9 +verif_message: DBAEDE95F7793725C9DB980AE6544EB2E2C4FC165C28A12B6EE675764F020C01C048BD0DC8064612E4B6858FB6871F71D104ECC4AA0FB27B9B79D1D95EF34E1072743826CA9E4AC0F1DC608D75695F1D39B5BC2B52758ABC11FE8BFCDAB36DA01B713B1434B9FA141ABA354EF1C50220757425B486682DF64FD3C584DFE147180657C15E6E21A9888219BDAEE8FD883A41177A6F6537F4DBE6809A0334D54582325C80119B6D4B37D45CDFCE93683FEFDD684F180119B88558D4737FCF1815063A06C0D0CC2F653DA98C272883B71BF463AC57A104F02C1944999E3788DB99F3F26D752F8D286049D0FBEFCA4BF5E1E5765FD0E3DDB9B72550A725DD96F2E017CC99937812D037FE476C613541DE88498A2CB72DB2120EA3232629709F551C4134372E58BD6EDF8366FC5F00DB38DF6E281962CB5C68FDA2CC4EBC135D438AE84E908E6DAFF39AA1A7E09785F8375D3E9950041679E86DEDC7398798EE624067A7D31E313A509E16BC25564DBD96F7FA811A6B5128819CB35396FD2BFDE8200EC146192AB727516FAD0FB85613B1C922203B4CC0617E076BDEFEA2A178DA9CFADC2044A89FF9034C23201F11D3C8B3EB98BADCB3E767812D8F71733885B6B6E13BBDE5811CA2DA120D8529FE5EBB21910E25ED49364F8E17EBD49901C0F235049258C97BD24186E5BC3ABE0D1FE6C448739760CC586BE39DBBF9043FAC6DCD5AAD1F5CCEA91994E75125F24DE6CC0495C2017EE37D35263294D1DCA2903A571D3511A1E38E575B0C1469E0B02ADA0EBE331CE290DB49F353C1C7ACFBD25C715D7B8154310B1042D73CC78145752A93B07BE7D1125F8B122A38849CE7AD7B69D0729822333DF209EDE90783CE95039E856002834F09BE1F41C213012B9569AB2F0AB29FFB084BE293B387B823F62E14F0F38DE03E4DE40F5A753C71A00DEC36750855A1771A06FCBD8B8448C67F08806812B72FD7C56EE3FCE1EBE2E2DABAA9196A2FCD9B4D479D553229D7C69B359ED53BD7132A2129130953F5EC0753703C202649F6D218776E6FB023A1188ACE6FDC49FD56BAD40D7936ED945FF0C5403F24377EABB1A3D97ADC8916EB8BF67B7C8DD0A48F8C3E62BF1A12A009FE4A3B3C6D7FDB87F64FA200285C6DE922BEE5C5CD28C0CEA9ECD6740C5966EE76C948195B626830725AE7D048955339A095DEEEF7C9DCDE9EE169B2FF233AD7213959231E74BF2132CC60566AB84806910894A0BD2ADFC562DBB4F64722280FFF3DCDAB54D5F96826DB5AF6BEF32068343A5F22F55FEA30A417C76B620BADA6A44B09228136516CBA30E70ABD4CDAA603A0FB5EC5E1268E47665D5AE9FF70468A3D19283A5276ECA45A847FDE13E3446F1F17CF057E581E071FBA06AC4321880B820C4E01329EED052A67ABA632B73896D0BE7C6DAFB5BC674CA11FAE0F1AF7A69CAE1C43A81733186902192F06ED2C73864D68B0584076353DFD8FA10F0556F8652C04520EF5712EBE2E4B9B4E62E308DB848D58106B1EB82FFA1DD6DF689B1C92C62C237200A38BAD10F5E622C9026329D48C0BEAE51BAE803DB0FCD68FAB0E0C1E00C8F0990D09D44DA36DE0C5B8BFF16D18E1AFCC465EDC575C9381334103B0098D209141F870E51D80813220A6408B4287C12228BC4403846E2A687A0DB1390BA6CBA6F0A16ADCE5E2EA6BF3FCEF7DE0DA0915638916AA437661F278A2652DC20FE96F84C8FB76612FA8B11D6E2FF0EACA6F1B1A4F680B4537471C24CD878EA34D725E6CB37A75F97DB8A4AB052518D798B0A8EC06A7094ECC524251CD06F5FAED9439299B0E988371E0AF0BBE7E97B1B601068BA3950E9F000D50CDADE4018A160A96ED4DB2FE500ADDEF749E1056FE8C6C9CA82E8D0FD9FA7F5EFAE2F196475BA73D4031E5BAECB0A83575D203D8CB9D6F49DB3B6FFFFA0864FEF2847BC36C3DAA3F19987B54784B84BCB8D5982FA6BB7145FA5BB9726813E24647D70C23401FB7FD4E1CA26D7E43E5FBA1E27FADBAC64D1B8004C201C7D29336DA4BAC7A18A850E42FFDA6E7C586B94021E3FC989864E2A40EF0233CFA7DAFCCCFA519FA6D8690D6DFA6948BD88D904BB9E6E9B9949A65F13D8F32F910C40A5410F8D71BCBF7B71716A73271D8355132776E6C56748CEE9ED6226FE340C704D1FBA5F58204AE56673C148B2C6C7D94020BE854D49F0E3FC5CCBA6981CFE3180521469E42FA3B458922F9BE4E23EC93324FD73BBCAB4C43C70E8FEA1D232A92FCCF4D7BEBA195D024C67A66E93F68618FAF32C943DB3622FBD22CF777084F54B638C774D6D3D8C91763C20693A92712456D42DF9D2FEAF0ADB1A6D9B4D500AB899A1AD2213A7008AA21E2FD7D00879FBBF765EBDC7526B8FA2D13BE83FD2717945670B5D73E96445A948AE028165CB3A73D3F2541238CF40C1B6EB26F33FC8F69D22BB899CEBCBB739BFD073EFC6993E221BA2EDEEBF35922FABE93B254C438A12A22E0BCF74D149043BDFECBCBB6EB1A55D928150F601EFC4DF082322B83C8395555135CA1936D690CF3ACFDC19E5164280905E3F3C5F62155184714EB9F61EEEFCCE338BC0217045AB2910F4E9DA330283CF93DB2D0B4EC2D81877266785BBB52AB0F81E0A06A7C5B736C1F58D234094F74DF7EE550C03404E9A192EE63163C079DF3C5ECA1214F20A2BC0683C66F22AF3F1AF532F5FD828EF3F2F9FF1724FC2BDEB2E7F706B2A219A2188D828D57255300CF6E29A7B992BED0D3BC532719B475A08D759CA7A888E0895683027D9A3AD3FDDA5F021E5193844382B1A963945AA49BCE0CF4231133C585807E0CA86D4779564801C05F2E474DF49A9C0AE7000D65B35B0896916CF18D584B24FC41A29AC67103A240025D316BBA272ADF68F06CFB19012F846DF8F5AA45EFC76B89FE08EC9CF0DFC7CDC63A392B83ABDD51DE93728996C99812052E83DA07DD3026A15E4186A19D2A7CA6232C9F54C886423B7ED35F9E8A97B804F401AAE8B3B7DDADF5D6851C4C4DD4FBC15D55520837123C11499A6F6B4C024F457C3D9AF50D7D82E31F433101834930C183DF8427922887CC36D9DFEC570C204E77E8C54119EA5D9210F82100E1C1E846F763397ED5DB39B7C086F3730617D91413CBEDB2AADC91C95B7997D45C8977D8D17E9BF86B97E3E388BBBFCD1264216C3BA773030FF49ACC1E79B2BFDF73C890E68A1EC42A638D2E5F57 +keygen_pk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BF331E6D638B1FFFE8824C347E16B9D992FE95FDD825B68A5F54CAA876EE5A27E0FD5B5A895A0267F4B61CFD52E1E4EFCD108167C9AA92B781D6AAAE3C7159D934C1DFFE5A461D4C5E526E989D391DE00A09E1FADDEC8B774384AEA3C24E780EA7AE96368B0C2BF70A0E99CAD475760CC7C44B71F50E355CE6372D7EE0735702A57001A0751C10D6E743AA74B69EAF732E359281F3413D4CE40B59E106D3D8DD3564FA213FA00FD25F5E4EAB27BD774F163A8DD94A6861139D7FB07FCB1FEAD2C55452518CD8258187CFEDA4FE6DC28C54F404E14086E12773BDBFD0CDAC55C9A589029493926F07EE52C66426441B6CC3A56C6ACCC60958614A511304D57DB804AF7E5CF78C44AFDC6F7D830AFC2B1E98E113631AD4D12C40101CAA78F2669372B5C6EF96115715B18F215CF7A68EE7518AE902320F8DA67A354E82E876B5018A259A77CDF9211085F6407C8F46BB15C3CDE68505C2D0104D65EA71939337903E0303AA3CB424D1354AE3CB4A9D8DA0BA8378C2FB6320DE562DFF0ADEE6781815415E1BA48FAF1B8DBCC67BB0F8BE31640A392439AEABBA37BC0C9821D4361E4D04099D9670CDB74B2A2BF7E31F9E09E0D344D6B0CBCDFB5A601F789A27C75956C1F4E35D3C8E6B06A6741D64432A62DBCE5860120F06CD40361D8A2F7755E8A3DC1A408B054582A6BCFD52332DF9A5DCA40E8D2B021F180EC5996AA7CEBA2991286F4876FE9363B05C1A8998BC97D1C2D8A0F78ACC27E32A5C9FBA7D406DBC77FE3855E46DD49B6F8CECD6F69F4AF85EB1D40D1905F0C3119E6ECD0E9699EB00A5BD7D2D8AAEDAA10DD2284F959584B701C54BE425FE9CBF4A3BBBAD5CF726C64EACAF84DE406547F611626AC55DC18EC0B37AD8255A93907474987FD106F169D3461CFD77E355C32866C8CA18485F535F268F61611482838E25A86B3A60B892A0AA6CDD8A6354A16650E7BE46EEAC38B625ACF388A1A6AD039554B1A0734CD39CDA81075CD80EE63724E7B1322BA4820CF8B9BC5CDAD1C69258A20B888D2E6D7C6B0B3C4391DE103955FD4AC48B0EEB08BFB543CE01F88201B527EB8DC54C46172C2383445119C896A116F8650485D7CC5193A2F5060E0D368B0C1EAE2D5D743827433C8730F1A61B8C1C5093F2D06D588A5B2083517095AE4EB63394CF337281EF2C2E14A9DB625B3D538D5FAA4B6E9F0DBE13F147FC0260F5BA78716170761408D59B79794A191B96E66420258C02839213164EC8D333555B3C91FBAC4F33FB72976BB0A7BAE88E4FA5D1C2A29FC5F938F934AF5017CB24B32278401E177A6D4738D0BBA1179EDE6CA2E3C91C26C89DBBC9342FE543DCC0E21BEC793B3314F21DD4DB9AF73927C38A9D30252AE0F23F88FB8BE43B9F91427970B498A60B393165233486340FEA8DACC7EFC178A1EDE2B1C95C244A962F5CBF09C0AF6D3BA8F087C9483B75B675B99913D92F023BED773CD3D5EA57036C1D0DFFA33478B30B6AF1B9B0EE03D274A4F6B3A8351405DAAEB47412118804B47756626E60F59427F4122DD836CF6CB0940680DE45436EE698BB58E6813B580BF5D1869F2B3D0900CA958277AE0E33B605F64291DB4E4F4CB7E0954724A6222AD04CD37B542A3E667B52D5510AFC15950F44813A037A6FEC94AECC4C3F27912D0DE5456A64E506A11801B4CA224658BDC41A0A664B174F89F1417F99000A20A623F5B064D8FF58C61772F49BA4B00E9705FE11D6D364488F5C63045C914F8256F533F11286FAABD2F7E2E16F7DB234B5F807DC14E782EA141032C0D93B82590C4753DD72558DFCF +keygen_sk: C8BEADEDC6DBA5BF3BECA52C67CEAFB4F3EBF84190B2CFA6BCA132883129A28BB149C045A55EADA0C519069A8EE0602FBEDA8D2EDFEA09CAE01D542D47DCBA1E75A821E4FF2B52A3AB3DDD0C77C3A9F96FCC9BE360C2B75C97D7F9DEC97D1BDDE028D36C4FE18093AF6C5794AD19F9FA090C19A76F05A7F3B930B11792A13A7A5CC0014B440814300C2225826042718A40620C25418B381163006402848DC0C07123434C0C80052323101BA54CE08051CB18440009100894291047281290292495652229722017210C2426990466610221002088DA926C4C2664E43822A4148689244809B4494B844D124270E1328024923009228854A849C14842882609941686C0104910B84101222504972911B28CE2202C83148E0BA72058C209D9848CCB129124C444D2320264002DCBB408D4C60121464AD430101904420B444D14B6881A85655C08085B284112080C10B48863A26D82384DD9042221412DA4A29084C62D0A228E42C000123524DB448423C1081997401AC25090B465D19241403012D8922814328499188E8A92851A1590634292E0282A43208C2049881083841A144D22004209096C4C4871618661222104A1C02D42484564488420826D802064043900E2306C138948E0802980160E0830420A1044024888A3122493A28DC8420D04438501207292381014B16089060C603230CC222AA0C0650047420C8040103331C9948191C26148846C020580E4886D8036208CB069D9104C10066258242A4834444430400316125A90649B4691408060A00690CC04089A86256336888C4266028965D2346060B80002341220090D0C100219363152A24093488ED2B601E2C820508249CB440D88882D601809A4986962B461D4C060C4206953408C2004229482095AA04D813645DB106E23824D14454120368010130E1A018109C010A2080CD2820D0B0200090352DB3265D3268DC41642001961188230C1C870A4A46DD9A851E2180462108E62240D9AC805CA026552986D5196205820104AB26D149301D9264C0C4905524071422660D4A40CDB844CCCB6215C36710C208159060C9C9868498080C3264913894D1AC26112C77010C73113108D4A082903B65150B490603262419251C8B088C8388DD8362C4A126C62302598A8088A48899C94900401069238401B1564E2A02DC8949041826024A270932006111005C82248C9988C8004219C98891A914442A21112426A0338699424528A107114A424CC206913932D8C0820D68932E6CAB4257F007558859915D3119DBA40D5E23225C1D606DDB7338ECA33285F893C62979505D91BF0CE00A4AB85E6A56400DFE3C3AC6DF1B46743FF5CB7279FC0FED4FC7DA7546B5E8BB48EF3EBDBCC32B2ED9F3F8E42B67960A10EAF01CD7C84012701895C0B43E5E74065B231167C9B19D7608748F662357FDDA261748EB44AFBC207146174D812E41B69B177DF4EA9E9ADA8C541845751F924342FE5B1209108AD57F90D66AB9197B135B91A64965CDB2AFBBFBF74688CD93032A82852A20CB69C26B0D5E000799B1EB51EDC006A4C73A6C555C1DB95B7F844AD8E3F08B0489B4FF720D35D9B0EA3E782D43016D4908885D749DA0BCCAE012C0E282E807E4AF842C4443A0527D62D769C1D09CB755ACBBEDC9453B08AB58F6AD4999495AA48A32801B5282123AD8097F8E3349A897308C59B32EDD7DC509E55B79AF2D7EF85E2741AD010118B1C242AEECA7E405EC3CCA9F951E44E82254DBA3CE2D8DCA0B1F8485CE1FB73EEA1F23CFD71044CDEF4CC05CF8FD134056B32E6524DD950E8AFE9155F5E309E0D9304166A0EC11E7068EE9C2AB61659709AA9CEECF7C3474E3061B9D580F9883021075A02E5F10ACFB20EE611E045DA345BA6A3DBBAC0456B6A3BBD00AC196E920560125D832514A80A68F0B5D32A5C062FD785ADB47C087A54AF90A25AADE3573F13C20DBD8A7DBC23EDDBA8C82177C7C9E3AE1AFE144343E9EBFF5D0D2F4AFFA2181E75BCE2A20D8055764991CFC45153E8DD19368307EA502F1E9FE9ACAEFF83F541F9D900749259F5F7FB52AC73A901522F200C48AE427BDB9D46A8655F5752FE7C0B3865CF79BD62538AC6D90C02CEF067E3A3F1A37DA28FE7C12CB6AE09037CF6BE78285CC38039738191CFA8264D192ED68D758718B90542A0C420C993AAD236600A787A11176A5328940600DEAED4473FA3E4E246D9AA629A5A96C755027D2DD7B42A10C2C1D8DD9AEE4529AF5F52E2FC3FB6E94E6E6400AC053EBFA0ECDC7D7B51336339AAC992749471629C487043853FF373EF44BF57A122B2C81629C2F530EAAF5FF76B42DE24D4FB51E87EBCCC15847F13E9B6AC5ECB4C44F83AB765D59A8FB9DAA85D13A80D84A2D151DC78739B54D754A89E88EE87331CD2845FC952716A684999081B10CFD3ECABBA346E64EAA328C510EEA170C7FEFF023926DDDD59C52DCDF1D4422CC9D55950371380397FF86260A31806FB8C350B12289FA0D7898CBC09D753CF2FEE8358D364304E9A03CAD19D10CF091B9E782650AA3B0EB6DFBB0D833EFD9DD307254211685880D8D4999A52078F4B5D338494FF450AA761EBDBBA4575581E6DD793CDF79FAB0B50C69ACDA5CA67D212368914F1B68B9A5C3F63C30F7ECCF8E34D5EA40D70F49D6A177F878821B5DB7337164E49424F29138D7DDC67AB91E4AAE157F395474B9502AFBDA2BD72D2F9551B0D3D41D55DF9477F5DF5542800D1681409DA49E30D4C05B38A678EEB5D78C6F602ACFF96C5BCBA08243D6138DBF48EBD4854F0D97AED1E9EEFB381016D873570E3B3BA942F17C2EE97D2BA99D3470DC73904361FAB66FFB9274B3939A15B75E798B81FF5E30866DE7D48276D572B71FD4B241B43FDD98E481C4AC45BF37D3C72F5557040E6E7FAE7736EE8B79DB8CDB3F976D4134669A5C716747D50E60843DD18BB1C540B92524C933BFD8E82DEBEB47AA964CEEF0BB5402F8A6C5DEFA8DCE7D3D59ADC93CF2840316F12124D36F451AC068539E3EC98B9D97CC4AF0330E733297BA72BB6BEA4445F54CF2220B297C87C4036F428850DA5D5097A54F588D9D0A393BDB16234517B2D512A796D95DA11513FFB797FF3000A272B318866693C03CC7EFCB5ED9FC51F2C5462E70F15124F983C5AD9627ECB46CBEFC9B81996E4C5FB0A8C19B71CA1ECFB2694D90746758F0AFF9EC625F0E10120428A20F92FC8FFBE955605D497FE0DF67A8F324C8CE22B3D2B026F632F34B7C2EC3BAE0DD2B30957633F977723FF4F2FF22109692A60C0B03C628A7290E3D6F47CFA73D64F914416C816B9EAB8EBF280627F60628CAD1B607F3B9D05860E48A632FB34AD55601F296D45970399BA2FED0E7EF1DFB031D792A192F685BB448A86791E11EE86DE1A789A84128A553856C69BC7E8CA59A3F8E93E088A9778F2FD59559BEDDD2AE1C258EA8114B0C2C3AA61F821ADEDEC72A36E941AF1ACAB8F1E073727E55F8B15A9BDF578524D7379E369C44D1918FB5C931487C52A1015095BDD5F72928A49F6331561393AD6EE55BC54B501747EEB0B4A0BC7074EED9CEF04E140C86F543A05C7D8D4B9C58DC900C11BCBCECAED16A3816D304A934C492ABFEEEC +sig_signature: 3202542EF1E239D32BE1BCE5AE4AC8052D578899D653E368E11BC11C5480BA06FED24E83A4361E358121DA338108794DDBF93ED0FDE9AD07C50F983BAAF01E985F9A6F380C6B14148AC829B67467CCF9F2A16D2594DB895BBE6774F4DF57DF40239AB2C2FDA9FF98F9B1A2ED58F405631AB0B2D62FE573E82961B1495ABB2A572CCEFF02696899A6778F9127E1249AEBC8593EB8CDE2780C5E503DF4C6D80C449225E7A96FDD199973553EC15D964285943207447F1D6E8575A38522270AC356E200C1260CF4B5AFF21FB5EB8DD724E79029084DB5E26C1BE84D19C5C0DAF7B5D78384B57D3B915E37492604984016721CD3D532ADB65B3E7F2D93196A04E05303D3ECEF7C5FD110BBD61C18AA94C4C1606C4D542C82A55B0FD7E824BCF900DAE8926D6C8C1454BDA5C5C4B3788B96BFFEBC2A771F999FD1A2413FCB5142158CE3A8D06764931E1F465BC5D9F8FA18867650A2074472C361038B5B7BE8ECDBCB65268AC7AF4B53AC3182B1AC7BB651AA40AD4310AFC80631D1DEE6FF01186E4AE1E1B1797B8A6281F8F72EA57B77DE4C17DAAED4EDB6F93714AC56A04B61A411CBAF2C4DCA9A01767FC5644647250ECD8BD20C2168042A61477CE280FDC8BF91FCE5C7C525A7A56555BA9644E6BF90C8DE121C31CAE7178F56B0B2A332661FFFF4457BC6BBE68A092D70065CFA5F1022534B317CAFFE4EE7C19FE1CB374FBB0B8497B0AFEA62023680D9E54B1782079C7E090EE27FC7451C030DE8438C697C9436117A21A68B0615AF126C1DABF41EC1E39A4E488AD8EEEA11ABCE4685B7B50CC9B6666CD831400CA28B443675E8F93107EACEE1B287CF85C6565EF3330D07104A72E69164B2F64185688C91622775AD7E27F563CBF45B6BDFF3D9A2A8619DA4E45098197B0E72F559F3B60D201C81CE35DD3EC4CD7F2970F44D2BFBCF28D77A483E887DEA60E0BC7AFF1F1C0B0E703253DECE61B981FBBC9441935840025DFD196A1E3FBE956BA1756AFFF5958806F76CF5DC33C1D7E9C43DF25FE21B689D4245550D1F84BD226CAD79E48AD242B41CD10B387270628435A398E9CD217ABD388AF6154EA7B584F44A9D00870968880E313A2DF84EECFA6473CA3CD444416E6950F78A8AAB03AF462E07273AEAFC2B18ACDCDF7F0162963261C0EF0184700F4348E81A21404DE8154B5A9FF7B3EFE257556A480A066A13055E4CC01CA4C4F13FA74A33B15DE11511BFA41FB2BD70D6B09BD9D31ED6E3DF746411B35C587EF37487D7B234C4FFC4FF4D4875CE93E9D8C5D68C079A066B6D07D895EB61977BEC207377903D97877A04FA70D900C721AD009E0512CE023ECC6999FAC6BEBA12BBB7DBBC2D2C631E45018477E014E1206D17ECDA5DC7AFA24E9650A6AAC21EDD94816100E411C5DC32811C7628A5D0708309B1E2A6D8400D83E370423E76DB209DA20B8F20188205BE7825A9318E5F75CAAA0CEBA4F3CA801074426968F8BC1935830B7A3DFC07D3AC0F0CAFBAF805127604EDE45AB5E121A798341E0C59CBC681E49194D9B6D24CE563E38F0425D145A31B799AF07FF0F4D1E4E50928E8DE470900A9DF217AD64771F25165987D7524897B1C03C6A2220A93EE2F020BEBD37328C0FBC0A751F9601AEC1878B866E168BE948DA82CE3A80DE14E0E599558CE1634947335F68262B4F8FAA55711AA91192E9AC3DE2BCADD6FE6FC40910E9AA060B23C2FBFD838D760B235BE7902718491832CEA6910FE7A712068AEC8868524FB90E60926B5BF3ED8D4A10726D78DD64F8C83A907F8BE398C990300119A29B4A7756146E77A3D4C352FCFE015EB3C033624C2CDB43A9C1C6FA803ADE04F7790DC15615FE67D176B6826094ECD6F189124E307BA001D7C769F6A2A88B2006F4E300E85FC2AE85362F375A8DB00F23B12E87CD5D4EC5D635A8C8E974D4D2186FDC7CD73A2D7DE4F6D45BD6B9A6C6F6C24E0953FD059DCD455F1F9AD7FE01BCD351BB7A28D36C3A7277A544BCC3CBF2145D1FCE6AA1F278427026B79513010A07DF441F99E6D36AF18DF7255E46A3118B4429028D3C93689C28F95C407346F27AFFDFB4548BF8D90596F5EA3EFF931E37903E8438B16BEB8CF4CADA30EAC62BDE20BA3D905AE77755498510DB493BFBBDEE2EF1AF7C57B517D9E9DCE3DC861E151262561CA0038FB9CB9D44C421B9AFB4C8E260B08B257437998E8E60904777B86B4DE3BB33D5894B66E7F7DD1437F5B18C4D169D910B2AE5EB9F114680C8AA5C9D6A56FFF02DAC97430D2AF8B1AA166374AF5A4BBBCA6BC7A68DCA1BBF09F578E49B646CD23EDFE7C9002320ECEB200E35244DA38408D6C1AB67FBFC8F4D1E7FFA1183778FA3A596E507A42FC99390F4B78FC53313725E8E70111798DE45160B26217AFB38E81C315ED732C63FCAD5ED861D5AE901E3F8E34A011A2066A432F016A5D7FA626A6B09C3CED3E5530380C990F754A038243761145A591AE814C4FEA5F62B8DB21DCFD8E37C13E8FD212893F0DA9F656DEDE606F9665B1DDD250E4C0C3FFD55B91E4D62618DCDB859EF34EC7D99F618DDC754389A0CC397697BBAC7EAEAB94F93B7348CA02BF1C8A039162BF3428D532C464A785FD793875B89BE8C920A11B5BB54A290BE14A725065CDF92F102575BFCFC8325B6595DDE6E81FEE3DC65FACFA6C20D6F96F365D0FC6DB45E4AA9F852CD6F4A2E2A6DE867873E5F5B5B64449318A007EBA3B1976FCEDF4AC097D7F1033D6EF45EF2261C1D8CC696CD0EBABCC31E1646F9E0CABBF65806969913CB4EF213924F27142E8067BC51BD9267F460B3BB2F0B69A97CB47FBC25E4DD56781E2AF1AD93CF4F1D8B9136D8F144D27D6D6DF6B29CE568865E5591668E8D6FFBC4185525D5486DE774615249790526F3F4C29A256EDB6DCD41500C0F37140F2114A9773941B8BB50606666D38E76D6A6CC7300F6A5184C428A4866CDDDF175F98AEF74A8243587C436E9646E284FCF3965DD6CAA444A0AFBA1C04050F47AA539AF3A4E5338797093F4DBE2BF7919C7CFAD9517C15561E679428D1768DB77632738C44BECDB3686D2C793A5B66384CE3C57556B59454BA5BD9E9EAC1E4257735860EB7B6478804F23FC430D411A4A6EEC4AF1EBE026569C68475083058E8574D4B33BE929FDE5FAB363D0DB7C7B256996815AB796E27D0125D41B05D229F8E532DD93089EAE920B20313D286939732E0BEDCAF328FB6ED0D265E33ABC9B7BE7B87BDA7FB94C8CDB1F0726ED51BD7323682F473B3BF68564F1CB7FE7B67F38ED3D5DF369C9171B30040886D5105945CC2E3D117203A425F6263656C858ADCEAF707212E3543465355575F7080838494999FA1A4B1B8C0C8DB2527676C7686A5B6C8CED3E0ECFAFB1D5A6A79909EABB6F60000000000000000000000000000000000000E26353E diff --git a/tests/PQC Intermediate Values/ML-DSA-65.txt b/tests/PQC Intermediate Values/ML-DSA-65.txt new file mode 100644 index 000000000..7ba88ad5b --- /dev/null +++ b/tests/PQC Intermediate Values/ML-DSA-65.txt @@ -0,0 +1,11 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +seed: 72C3C5E0CC9F332F49D0FC0FD6399DA75645A3E33DBF56F1E96897662D0A9B37 +sig_message: 4D3C4D952A1DAC151736AE9D0AD81CD37F7C492539FCC916A4B2251309E06CED54D7145868D145BC8D16F8B364E5D6026E113BEC4824F6BFAE3C9F6C8B888EC6B8254CE59E9E8E158EB04077841243EE3A89D25C0B30B4A64B723697330AA87663B20EA4513189558466D264C79088415EFA09DE9B64AB01B640B288D1D5562ED744E80CAF0B6E2C29FFA1C321129EBC70CAA73DCA7DCE899571260B2E7DA1B47CEC5BB00FD66AF8B89BB84392897BDD1A5EC7186670DB81604E0B949B5AB1D19522A3F0828D0E77B300A63EDCB74C48F9A01CA91816FBEE011A5B0145C6A0B4EFD5A3008A91E0B1AC96DD8CB9410D56A952E74B7FB684A0B166E5F0DF9AD100EE1C9E3B7B851B4CBF337A3328DB13977451E992C4A0B454BAC5E3A2D0E64D106DC47C216E0C0AC11B0F7C48589E573051133D01F29579C7E659F8FB8E6539B0F618D053F4323AD0237A58949F689458ACC109BEB7C81952A879A10BF8BC01CE057E936B62017E226DD66AB2470852C000A618B9B130050F6B047746D068FE7D3CC1277E4FF4400F372D50A85F469B4C7A35AA7FE88DD923ACEF5FFF47A95F971EFEA6B65D33E65F20173C5BA5A320DD16CAAB59AA7A7BB99956EB5ED54EB93E89C887A30D6D384345E21291B8E9C6CDCBE2671F810A058B858220146A2161B7412CE2DB817CC8C99528195F567A92E198330AAA418A5FAB754E27221A2165EC4D50B391BB8AB2BECCAA449CA1D4D3D5C17E28573048452EE4120693505515CF8D1E2F8984D363464DB786E9B8B7BDEDFA2301A21F3C469F013E27742405CFD0D15E70BE0560E8B18C82327861A8DF64200A51E69D2791D41E1E12BF371664270AFBBE1C84FF19D11D4C233ECDB8033BC79BC7967C410C13E8E3F9340F848510760DABCCAB6EF7BB87398B1421E5804F6D41ABC09E6542D72B87115F1281450C66AF3BF4FDC21CB9B8C27D0FC6DDFA73732A877CB7D7C09B8E9F4603D9865E4AF91C58E9EF6FD9A32C91EEAAEF170BF4F44BF586D789EF4571DEBE6FFF0C43E842617FA50FA6EAC8C7F70EB680BE717688188A430484F3388F6219A70EA38BF3C6DBBC7FF3A749D8C8E51A1365AE372988D248F9FC0F2B67E896CBC86D2AED35F7AD8D4E93C21DA09E0204C7DB92FAFA7119A63BD0CC00A029CE7DB93DF34C33ECF673D48CE3F40948DE86CA5467CC159960B329F560B20E5C8AC37AC4C8960B49B455075489E7217D6BC53AEE7C19B3FDE9FFF667EAE89AA6CE8C415E807B348A14598329A32D9E508C3409DF18EB426BDBFDDD88AEB3A9BCB9D84C2388AD79AABFA3445F80A9A68EF74096E34516CB5316DF599E5836F123271CF729472952E06C817A67C219382F22C4B0A16F7B7DDE9ECF4AF6927BBF4424F43FCEB1A48F1F2CBD98E7593464EBDE45D604B6AF95E32AE728D921B390F712ADC280257F4420741C0D29E0E6B98EC1708569381BC845420DB0C1BDC9A23DAEC209378A01703B9C16C10FC29763A52FEE64F0A728198513361CD981DAC739937FC472CCCF666E61DA3D90C3656F0BBDE6B942D8A0496C9BC703F7424BF00848800AAD519347A4747676C81088109A2B67848EE0A08BD1409E774434EFFE754BDECAFF2328EDC30FDB85B45488DE0A5D9052397F9DDB0F13865DCA85A36F6B43B84ED044E5F40BB960E56DD0CD6EC08C37B017FEEDBA4A7F20A174E1146C441DB99A2BF34BB8D8FCAEB874B2313AF2E20B01D38B56B42451047EAFF592236CB241857754F6E2DA3E4FAD070FD195B641567375B6F2744FE16996D7A73D095F5CFFDD50A96508FBECF802625E5F168DA08C8D5198BB2702F1CBDEA8221BCFC301195B717A0D174EEC9BB96E7C49E15CD2A26B933E0C6BB11D702F1A21D33BE48039E89E38C2A5E96F55A557359BBC8E191719EC5E5669B2F168912C9177B320A5762474CB2303F54E78F4DBB914EA354F8C9A3E81342A10ACF5FD4A3D8CD6F85A204E165D59E4FD12D5E5E900AC94DB984DD8A5A72372D8B5D8958EC7F9E64CEA4E560A8D9525CB24D3B2F36ED7D46F897229A776E7E422838D4E2B551B28D0127F2B7644F35FBC35BEF9D856EF447F699151F73AA70CEEA55F6193060762B28FA150A83344A2E23B9E5E1B103805DE85C520EACCFD67A5C390334B036028D4B696AE3D6F6DD80304F7CF915F564409AE65AB7504D8FED434966AA4D4DB3A3C90B160332FB8E6A33A392122E3C02F27C38E37B8B217958912D0AB987D232B65D7FDF3F28CD507D53F5CAACE75224AA3F63A4D4570627561AA146A32645C89BA18CD4C7D2AC0D9123C89AA7D4AEE9CF811DC877D7D0321AB5C7EAE86F2EBD61AAE681EB53EEA73D0D7532937AAF8F8A23E0AE64FCBAF782169422ADB6CE8F3F003CD2EE9EFC37E5EA1A8902D3D1246A89736C6C7C9A46FE2D2DB3BEC00E69166ABD213A6D30494244FEE28050BFAE566DCC91C9528883011F215995DC92E577421C9645478FD3C3D7D8FE06BD1824AA20B4A67CF9E8C2A69C031E4E1FCBCBB6170D60838C61AF3731C7FD4DE4D6277FD6652B63318CF093F7DF46D800368A71333BA657171ADCE4D360E249B32F49F93E38C22ECF79C89647564B7F83E26A59D403B239A25F7629CEC50EDE1EFB58D9017ED44CE34A3136518FA009C8BEC057BA054C794EA0F49F3C581FD91009835946742B806D115D4E2DD109E1797F7DB5575CF233980B2D072D247E704EF40A6DD6651369C67B576FA7DE4C794E469EB2DB8C0E424D07CA01753671116FDCB9B37C0517686D85111B8E12A530C25F0D01ECB20E259CCCDB0A081ACA5CD06E9FE50D79B9A7412E02F41B53CE3555E986833D253532CA5D27A4F0C72FB698CADE01B36CF94C5A05907AB3AC631455B4AE91803F2A3A83E9EE23EB0538840E1C9408F73205D7930AF7CAA7B4EEC2D47A71B99C07B09FB4BA1ECC036BAAF5230D600550CEBFCAF49A19D63B3B50016CC8077D97C27376E2AAA370BB3CA213968D242C11AC0A341 +sig_sk: D26EE59A89F67C98B20F890B03422C8027B776FC305BEF422CDED403AA705DA5DC380AD909E3C13A76F7F59BDD27A843F5F9A1B8E5B7B524EC445A916B7A44A15167716BC609B3EC0C653B210C6569BA2F8233E7F6E404B92EB21F39729FEBC06A644087C75FA7DA3DDC5B85A89F55C9F87A15014E27AB325EBEE0FE472B2F56205844860382534018828866441476575685641203648087665585183625516555420058871751602717711246115635711801273601127806468005021161768110481565564313804086156224775253365085726676702542128777015217656384221466167018541712560775653305356788352067346543727338426471425281415038533202656128851671300117755513452307351315370854301872372157587303156081110321112258736404438264705244308745330557358455160473004531650442427724303753273643545546151241081547412433078243311343703723518581388573234883002524138203118818106712726275005164485846703435423180316086652647174338637385102777331112452328027048826136833604027623520567678561007443300118026417762172470414100567684236755276750265038807023654313530500201746332586762137686700431224203777868426234607501375807606118643643343182854487118067375717216763686234631445727470521225615865012624304163885146650645168324156757125027631761181378335367286426405258178463767046744346405385558607416365312311607655783032614171118036426333182624236747864807656353823246577001576547601536137245648167881548355703441616635365661535127864121615460226475308628856173321321610874562553506784723735385386463056370235073236822680783606365575167372423481370273787321706274756640515832755317524417643527131782776733023626563226284344414664814180751873017473606630568447604505822478245472545717704487614714872060204431705604477512622755208754111644114533555057070674013756756613028602834613507528705643218236456378337317881601264762752721064334675027466164547381066466654324575825520882682277558861126808652842067242706502602822135413806761150412241623142132062854561462005282463527054222067084232463834703022563303120640700613028248186135862267807514517034808871887028651376603357053471356848232460123720236623604868157088117331708032612544633466027487881011822577840213584603838688167482874577534023608684717551178060878605807013607371146861810111452118252851727546664116442725718666627745565706128063346337837125850568444871521347471236266350161674306083251415448031242478881077307231468143328543380706263487802348512856658522881606460085147711847660265787214085344812640116713686701544018882508606025375436400485704788868344567583740386811256420867877166077712432136288331062381178450376522316153520153726880635206125157517874821078632831518110002578434628677277256811181641133083303108474041885821315177237034415740262877735530252155663683621050363812382062703541636072037888130651437727453164255777504346625374221717666355341021461642300018161635551232553767782843483040236111880701245700154018276321853454261144802277261072016656336147062500850107086111551067005227866654812551566680414042612307370316834001206560231706668641615317857425305313402768758031066346812502214187812016774121074448086641371280564240151566227543442570306101083513862873685631407576010245281712830883456301434255351012FADA607976F6837B0DBB68127C5D2CCA1E3BFE9CE0441DAA2FC7F0145F96BFA473054009EFB11184E4718B045758DAB9E41CC03A8A581F86F05C9D76F3BBEFCEE4A67DCD2CE920CD15B7241D7BF641B462A72E287C3DB90AFF454ED1C8B0794AC1055BC6B4BE81669FE7154ED8FAB43BB21E2D787FED316B81CE03DA5019A0948BF4F19CE09D317736CF91FDDD4B42B29B9AA0C87D58C81D2A74F22F44AFEFDF6DD0BB2689BC4E54C42DE56F5FC6796941631931525D7B51FED90894F88B20BC819BE6F19D080EFC03E23CB034D06EAA41D552CCB07B42AE79486825EBEAEE22CE193D5B9174E20491E23F376E3EA9731981FDEE6E0C837A07C9A6575A038522C8F36FF0E481625E1D693C69E2B4B4910B35CFCD7AFF76301F15E580C5F2E4118CB9754D90ADC4140E4AA8DA02FF7502514652F07D14B0AFDD6DE58EB896CF51E562E0B7972E85D334EE77E09E7882EF080275786B91E1BDB949E94BCFBE45333D0CFD6305746A24B4B2AF2311F964151D4F89D12D1D88A6149351CB3294926A3B05051FA1F613F4854A1727E3FC195F4F5F99D7A6F6766A250839C090B4D81E71C242A58DEBE5DDCA556B97DE9790DB89ED15CEDCF7EBC6D44DC61881BE060F905CBB77025694FB382A66A2809A759AE66DE102CF059E9339C26112F76C50B39EF61ADF393B92B69BD88F6AC5E7EED1FA1A8BA7201696DBECC8FB9AFC1946C744D92F3ED30F8834C398F42C53720510D16817A8074A2F12D27FF98CFCFFDFF7D94FF793993991FD44C799D8BAA5E0BCC789D3F3EF467104BDBF2092509E530F920DA1F663A5E58AECA50EC6F1DC82986D37EE6C195D64E2D4960BEFB09D3EEAADBF9873340A5B86D29DE380DFC41A99D7350D9A5055706E3C2037245DF35B9DF14B810772C3A40887CA02CF5CD42993E360852219A9A384647CE912D95DFF0E80706A2696296C7290214CEC72EEB016D34E03FBF5E65F4795E714B35DE183FEE6CC6C35E349289CC8DBB37AE9F968CF0BC3654D3B82175B0C5AFFD9B1D421B7DCE8015AFD77520A983E1C1E9EB0708118FA4BBEE072157E7CD8CE9381091D3F1D4FC3980E5F8C95D54F4E6BB7AF368AF6BC9B332B80D7F8E76C2E203049C3380C5E0F5299DD6E57CD59AED1CCDC998F2FAE72C29A0C1D4025C34E506AF77760228DC3B8B680AC8A2FAD784EA6B86EF34F1842E66F46FB0F68F0101425D16341825DD6605DF6310E7C9811F4CB81EC3C7AE7CC6F528C782C6D33D6883E895B3A06E3D3EA84B03E3603394B44A1A3C289871A59269F4B80F4C7CF404A4B99A529A574BE46AA6B52B4E544FB7022C90904BE1C767FB8DB744B9C69FBC503C234F6618794F71AD8C95E5087F54B4F82154454C0E7386F21EECC0DDBAF454382A973BE4ECEFE846E0C21B60B56448E6E5EDDBAE084132A1397F16314047144ACADD6CC342447DB6A65365747A63C404AE623BC3EF1703C18B14FDA178AB7392E9EB6D2C9045EEFC8A7368DBCBA7F09CC88D6EA54505BFB82373819FB990F0F64C6FBE421E35CEBD9B79CE77BDF3C8946C58C6071757284E5B53B56DFEDB2EEF928DC9AE02BA21A2B5E284E285C9A6CB05710E2634CB3627C52E577F7E5CA7475607A7D2CCF1452F9BA703D322F69A47F16BD9851C7528D89B59C03B426AEBB3B372328CA9102F624E901DC8A315524B941706ECFE0AA8AEB0AF8EC33D2E1CA203B489AE23C03D880B83D738CC277EB6FF1C7DD31886C639C6C658396F60920D8A0A4E58278D63E5B393295FE8887E8F9F6A64C10CA241F699B99D72D13722E42D4615D9F3D0545E320D38EF809076F4216428C29D130F2F83052B9D0BA4A8A1872A242BDC59722281DDECE5407CBBDDBDB0B8C04E9385AD9660D252DD28AA881166694207BB04F9A24FA92216ACAF264C9F1CC200A5E2CBD2694C91238A8972496097B3BD3785345EE7171A9EB96619722C64571DE6327CD0345B788871D7D5D0D84EF2A47DDE6680B7743AD61B164E558B672E4CC4B46D6E6C236C2133965C8B3C7D0F240AB0EDEC78E8EAB4C80040A037F0080FA3B15ACC3EEA34208065EB6E6E21DA65601454E6DB037C08B051A1942DAB90C92B0BDC8C572C52F0AEF84B85F0444A6C15E84801448DE8147804F796A1A05341E75DF015FEEA7E191C461D3D3D7B2D74A9C4C7E18EAFE0966C26731F0A960461DE0387A917A6BBD645C4668030642D70DE30D9954556CDACDE00F82219E7A3EECC8354FC5A4388195CE568016C7C63661559EF65E2FF09F1C98A6668C23AE4863B04287A3BB6210B3F5689A3E7978517B95B0D06A831F28A3FF55B6053E38535B2AA97FD66B42980CDAF9E5DB6F1212BC23CC740BB7DDF8CD40391C0190F62A0A2A287DCC2AB8FA65C71675619C451EC07F3D67EE81A6370EA2144D82CE63CAEB4FD76E6FE4979FBC149BC54A9236D4CF23CD5C09E83DE5BD888F2EB03008BB9FBA0CD5CB79DDB62E2F9F8F2E11B2210DDD11590E21214015085A3CD8DD1665AD81D28D552B214D91550FFB3010102098E6F7649A5E06057998E25B4F789B2FF356299C589B1CE03D4AADDC9177B47974FBE205516B3A9E88F0B3955F133C29C1EDB94969E89B2DA7B64EE423A51672521CB4E1008D0AFCF68D6172A174F0ECABB5FB7648444032E6443CF9C7FA4ED4E1728427C2804699A143EDF11CD6CF9F5AFF6341A69DE7B7710C223C799861242C0D68841F36D9200122381EBF94D22258B38375C0D25DC1E3EEE00E312433CF8032F46EA0A0BCA36C679F5FFC82898372D631FA7368595ED7CB6571E8C00C16AFA4F4791E63813141D800111C1EDCEFD8872BEA41B2DD159676F23BF85C7DE07A30D2459EB16B24BDAD322C177B174BA83EAEB352B2C0D8140B33D50B0C9F2DDD39F305F9AB4565D3ADF35550F023F346900C59903CB972579395840D6A89169DA96D7012A821632E66821591FD3731EB068CBAF5F18589E7541CB4AEB0C4859020D0A3B99887D12E78F690073D29A242682D4677E2F904DFD7266E0514F6E460AD2F1FC5CE875D106432C5F91D6246D80AE5C7D8C4E4EE122F5FC58380391ED536CA4F073E2B55F5ED19751479CB3A71E72E8F330E086981169140A8AD069A49B1FD4EB950F9FB9084D1E702B957D081709FC510D31CE2EB1E42AB474D73A793231EC274EE399257DEC4B9D0704265A77E745F4CD8F9E4909FB9299304CE6AC7FA95C3F47B210DA388EE748ABD41CDEB3CBB187A40BB3C3F4150ADA3472DDB398DF8D8D5865EF27F54CBD4164DB0465DF7443E1D7782A2403387EF0118E8EB10283A39072C36A46E724165F49ED170A8FCC00FADF037EBFC652810697CD7108A56989491BA2232BED54BA167DB9D526FAD348B7787AE71557C59B38D1054CBE9BCB45E17BB146ADFC04F6816334D3D815BF73FBECF1C9D437D3A47A7862C286884B638DD7FB64BE01B7981D7CC82A90938EBDD9664DEBAF0E03A595368B89338AB076BD22AD579D04F1C7EA075D220F8CCDC0B9E372F5194AFE834D28 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +verif_signature: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F46373045B9E540C73DFE91B61F0588D613593FCE1B00EEF1B227034C6FD3B18B3F221110FB345AA78631B8B59FBDFDCCDAE6A24D259D34AABAD218B3AE4E77186653B8563AA6120A0A531A4E913730DC914FE5E008BECE6869B02B07FDC16214540D316C43FA0C211B41AC7E52656729C773E4C4B88ED311886DD4D275417D70196644EED15FA315066003E309F832AF91262C949011FCB0AD2CCE65DD9EFF567EE29CC40A6FE0664E7D9F236568FC94295DBB34288233E8C511D28815EC721032296E1EDECA7F726A6EB0F76CC5828011C0E4013CC7EE4329B81ECC0D52ED1E491DD6D55C5265665ED8AD219B894F31C68C619AFCDB7358E5554C495B8B6E3325688FB8C1A25331D57BD348A27D390929BC46A1496AB35B46BA61B6B9D23CD06315FB72C24776016130ADB1CF2DC72959EA9CAD96AF5DA996126CDD85B134CC927A51FD23F84791A3FCDA077E15991748A0394F334EB8BC48A99AB9DFBB0F2AAD6FBE484961D3A4E8F8B21A6AC092B226D6E119FAD44D8E576FE96C6CDB6840EA614BAFC70786C519E1D5DC0F984443C8B1E54F8EE176D98B2C7027F57D7E3DE9B2A0A36911B8E47121DE0C07EBBA5D7B594EF244C68327EC6C6D1DD501F483FE9B9570597E70DF413E7AF03847F409ED61E2846E6C641E6A7FFA79DE6BFA373A0644B00BF41A034992A794DA17C88885239032C851764E3E4DBDE7F12A16C5A263E964C1E7FDD3CCE576DD6D56B18182848B7563645D4E42FF22742A996785169D7F503B48A7158B3CBD29935ED32049BEA1AD953EF707327B778BFDDDFC60511DA113A34F655712E4E59D6CCE404E94ABA61E8135388FC21C8E41344F324B01AC8C069F92575D34F88BCA22CB307E37070063320256B8BAD6EB7A81AFE9A254016E1C8A125089AAA3EDE84E5B6C2ECFAEFAA52B9F5709602C06AEA4A0384E9B09E5B88164B274EA3265FB5152397DFF5A3A0861E2BC12D2109289729747E83FDF243A1D17B98348379845A9E955E2D6F938DAA5918E2A14F97BA2BE501CCCAFD681910F4A4F06715CE84096F37A91DCCA2A8A4BE8DA7921DBF8D3F4EFB98C6B4F940ECEF832B549D068947C3DFB5809CB7B060A3A0EF3B21C0164501DDEA7C9E5E7897C6B1C46348B2C3E805F6F2287BA158CF925A7BA7F08254989C87D24979AD986AA97C51B01F45D4A1F24752991F04205EB551FD02D415F2DD1EFF142B0D70416C6D815EB91732B268FB20D0867442D71DEC057B286CD93811FF3F646EBD565D51D09A42D3ABAAC0F34CC817B18938ECCBB1FEF05BD3C2B494FA529ED4C634C9325A48173F20FFAC32DC101E6EE03B2FCBEC2468DBC8F76758C3215474F7EF24065F79060ACA3C8D5D74AF70F48301DDB30C05DB3EFA726CF88555901841282AA08F666A65351A6A24EED6BE211773107E185E1B488A2E491B6C141528462A86494B54FDCCECCB6AA21253686693AE798C9CE9E0BDDC6AE53D9B706DC4F4D81B9C73C461ECD7035C5172EFAE5602CAF88C64E79E5324030555DE211F89FD424C338C3883C83CA9405C2B5D1445F7C98C43ED3D2BECBE25F5F3F544CCC5B5AEAE47DDF3FB5649FF5D61EAA02EDEBC75CE478BA00426CAF474FA79E5B089EB1A882F15354592695952BA0A8EE91E649E3F2C382264DAA30F6A6D217F6129C1939B6DCACCDA5B637326E8A8361C3B56FCFFC485036865822B9BB87B43510BCDD55BC350DE7B2AE90A21E9E19978EDA10DF667614A44FE2A84D16BE043EA8773633EA6BADF65710052F341F65CBE928D3962A5A2FE64E46D6BFB8FD0D9978F0423CBD195F72F3CB19D7EFD9EBE33CD2F5709A57807DF944ECE568AACA4336422083B0697B6AA00586E4BF7DD673A3D596B8618AC3B4061750C6BE97CB53753D02395556075A26F140B93F577DAD505E1CF2B551A04C98C7F0901831B3CA61D75DA793AC72A44C7A07F7DBBAD60A55F49CBD79DEE4739FFD36778EBD08EBDB79EC07A16239C5B921599FEBFEA46DDF966AA4A01512E610943F5DC54B4C76B764B380BF2F84EDE32124912F54F7B6E207B7381F670F7AA0F3C3ED1015740384DD61A9765EE4696EACF82EA410691805CB688903535D7046100DCC2BA7D8302ACB0430D506CCC1C0DDEA7111A76F45B454E25CDDFB639B3D664C36D8843513A3FCAF9E6057E9BC068237FE2419A2D2D90B4A1FC2A71A146D2BD04364C79B8EBA8E3E88CE11E916E4A7528421328CF54FAAB2B19F44468781F8AB84B7DD972FF5615071430A4374DAFCAE1E6044AA98E985941BA6B9DB8C02F589603EEB8BE90A70EFC088D795E6DA1F1F2E6ECEDD031D8199E65912D434D09BFBE594406DC1150E99358CEA7FAD2E7C44C38B6E0CEEAB9BDE0DB97BCF5AC99410C9470E266B8BE45F6690831F4145E26379DB807C26DDF91E309D4F4A3E7ECAB7362F15D20EA433B7E70A7DDE7416CEA871498B2CE3F58D29D8628C531840F022DD3BD2F3809B1168D38E63C7F69308A31A2D4D5EEB974239B34A62BC85E4ECF90C336A0C37BD9E0EF4266B835AC8906A83CF0B35138A65E5D9A61FCC9B2D5A337B8ABEF88A7FB3C0945D7CAF35611AE0E44693A5BCE0A6E2FECAE9BDF4E356D6536B581A18F03A59164ED5447C7EC8BD997BE953DED932535B5F438A04319F5E0D8B0FEBC8DE8146658E52B9759C73935B120DC9B854F3C8F94EC9339057D7D7CD91F7E0B98D84EC7B2F92328D736018B03165A8745F8E77EB8029F9782670CBD86B4316C7BE4A880338BACFB015699BF30D3A4B05325435BA5FA3B9D2B2FE0B519C2CB246E53D1A343D661A66143C6F468C5538645CC26D4E2A8703EC9B10FC89BE6F859997708F31194F0DFEE92998B25E93B97070DE14409D5BA43DF88D15C2FBA97BDDE618CC3FC042F7748184BA9EC9CBA1B2006881D0514264198FB691C5C038E04950CF69099377FE66BA64E21952A44581719664F5D92397D22AA7032BF589AF8ACA48DF6D14EB43CEF0A9C8A8F9AD329525EF0AAA4F9E09C3513CF029F3DEFCBB4114FA0F668DB4722FCCD9C207B66F109ED95B454BB6195D59C4A678BA6F5A9B234121AD0516A1D4123D3826D92A61B35DEB295BAA2FE1B5EE25021DAEF857B5DF192E175E3A2A0D3F082F211CB5BDC236274F86C5DC74C39BE97CCF5F5794EB64EC645545210FC667D1E0740E66CBEDC20648CA1FA73414596BA08917A19A463AD3027C81836B8F4F02B99FC5083F06F34BD2309C2342AD88A84FA96E207C0108F6825414944F264ED6C4667C788D61A6BC2C456AF66C2F769E16901706912CC90D4B6C90DCA16CAC8FFED8397020E2975E24FF4C807C8AB731C81D36CA84C9121A8513E0C9D0F41BC68F88EACAA35599FAE3BBA6FCC6528D47E40C0764CF9C8383B3A44515E61D92CDAEC9CB9082B5A0C0379460D9179A7D9DF29E0B4B6A4118285215E87B6F118E9731E466FB3FEBD195E144FD2037D116627579AC55FED5E32585EC6638A0DFBE6ED6C5876CF8114C902AEFA363F4C9B72E7D5C852DCC1AF2B8852A9D0F995938865084CE5213B308A9CB37F681960D84EFE1DF5134A5915AE5878B10DA0FD4D9AC2AEF0C7E01C2E9E7C017E7BA740CEE1A899459BB75033EEAF3190D6779ED9EDD846A74E321528C03084A5D30874839718A53549B2EC6B2B730AA935CA6E1C4FD8BE0357D93F62174EEEDF8DAB7755B46657E59D7AA00B9F2F85E4C0F77FA11A5D69A23B1EF3A09F219D83B1F391F841318EEF35A326367BFA2B15FD714032092B9D02BF613AFF7696FADF1DE2C817077CB7C996776D69EC241A24254DA2D13987691EAC7EBA8CD8DCFB3947B1D99EDF962D215B318BB5F9AA04D1C82626A4173D02D410C586BCA4E51CA4F3E151B54F17A6BC9677609BBAF6C3038A67CADA66B4FDFB51029E07807D705969D96C9ABFB7162E45810A1DC4B56DA1477ED900A89CCAC298E17884269C39E8D7AB966F33DDADBE56A384CA20A7B1899EC18E2AE547000B904E34E46801D8574DB008417BCFDD1A74DC018E507B76B0FA08626235B1CE24BCFC320FAE3551C1C929B94C7C4965341829D8A1347D6A7385803B08BCDA84A27EA5E49CA1E6006EA232A53EE417EC881D3328A156382A6B293894DDF9B369CDE6B2FF59CB6A564E21C9279ECA0311F5D80CE39B98BF90DB327F74D3F762D117DF5F9132084FFB555A5D147221AF863ABF78715B72194529A0E334D4A191D42A99BEA52ADA2C7CC4A9774D5CB28D4ED82B61F94E89F60F0C8EA52DC079D4658BF8C856D6152D92251948B3BA014D8BAF3DCD36BC71F8E5B2CE6F535B7B9AE13DA4A1EAFFC253BE43A9F608EACE733CFCE52EA5CDA8359DB53FF3AF2CEFE8779BCC53C24A4B18D5E0D781BECF75B5477473A2024AD56C54A7F990EF6B1DFAC501088509D3A37F1C8D5C26487E420B7F4358E9269761FF1FA3AFCBECAEB68F5DDDE3AA8FD078CC4224CEA67132D7EBF5D232E43BADD218C0B4DBE1E16529866B9AB935885ACB415FBB1EEE69408A521B462EC59CD0D3C5496D985AEB0CE374F6772A4E6393A4EF007438090A8A9E52D2F55666D70F0000000000000000000000000000000000000000000000004080E121920 +verif_pk: 6C8414380856CB52D79C4B29139FB1839B8606F5948B9D72A956DCF10116DA9E2D79770186FC74D942C0F4A3B595FF6C19804B49901C6AD5FAF71601C2B600315E1F40C2054767B00925DF3AA490E8C76F05FBFB74911075E6518C5F1D91B8A0E5B59830D3DF3994760411EBB911ED4CC2C160E3849A93762DFCA7B9812BC7AEB2DDB2767BEF36505605AE069260BCC8DC4787C428CB3C076EF2A6B93561D8943F45CABE8F0553FF2EA1AC95C1CE21593A175459D7DF12C4070ADB0EEE55B4ABAE59BE69C3FF0DE5A9B027FC7D8E6E057B7152EE6AB480D105D30B0F5051B60C7901C525C4635FE668CC00E9D3097DB99D66323715CE4F0B79B426B4545E09F4DE39323DD14CCB0D17108CD46DEC6138CDFA2872C1C4C8AEAD5C8CE04157E553A37558C2346A06194CB50B4981BF4D090CE4E860126A8254A4D4C084C3E2020BC0753521049B0FD88997E027AC51E75CF1350C3F303A0ECE426487153DAF1FAAD6808B9D9907DA9F35185BD3BE8D9CEBE916CED1FA2928D885A9CBA88149703F5E4772E48523125DDD026E714C49F4FB4E544BBF617A40B00B68DF8F155F5880D411877E25B42B2448B36BEC2F1F8F9A770C545150A0278E9B724500AEAAEA471C11CFF04E30EAB2F473BC048E32CD31AEF21579B699225BF9E1B6700C57E509FCA1F236294A5974DAA15FBCAD62D4BDDC4532B2614144DBE28807368C281A770EA22B1E5A3FA5BA14926DC55A54F84A2A77C5A70841F07BC1DEEF7403B247AB42B84ADF141E030C98468424DAAEB99D2577F950C2373CCA1E2DC2761B8EDD6D08FF79E528880FFB51C36ED420AC5D50F2582AA664E54EA5F4189EA0176DAA6122F6235A70B15CEB4DDD65D3BE6EBF3DC43189EE0A2E3105638F23873695280F1B74274352D60A48E5D3DD02FB7A5ED83FE27A698251421C8E9C98806102396E537390ACFD8C1D0B4F99B702A9EA659878583D92758941B30ECE507C104B2CE487679ECF68B4D8B980698ACF6AA6A57E8ED6AF3FF18D2668950428B57D182F73BB49B9B038CCC82D561278A386D56645EC3FAFFB4125E0E7F36B48B14B452547A0B481AA6B334229249153E42EDF7E49DD6E7636BFC615A23A401EFD4034C81B4DCEF027D344DDCCE0A71618EB5910CEC62228819385033E8D0ABD493D983E4FC087D72B455E4DB63A2F82CEFF65C1E628EAE630596DEC27FB98B84DBFDCDFAB40E472244914AFF179326D542D401A3CBB86E5FF8351EFE53A73C51ABB63FF553E7D7957EF89135E0F5BB1BD0C24F9E45E3236413C60E1396A47567C9439510F00D4A43C149A5CCC04F3D47E67A8E294A461A5F693DB0CAE22CFAC61E853477D339A4E45F7B17C3C116D56F3A068FC5ADFEF38FF85332BD5153C4D8FB8F148F117659C2EA94DB42AA0B0BEBB475A110412F3CD3349FC1AD041B7D5304A8593144EFA3A361D1B0C7613B82C086EA7126E43C616CEE8F1444E9956E87F5CAB95C7C7FB1758EC7D97019E5BA93543EF3BAC1A174299CA48BF7859DBFBDFF243B114F6BF423CE98B4D4D091DA44F3274D573FDC904BD885E35C9152A65354888F11ED4F3D63F26A7BE2F5726EADAF48586592BBDF6CEE246769E0EDA2A80771FED347D67AFEEC68B89463FA0496DBC15C89E8D569983D1D674733F2BF9DF4A980EA8C5E3AF15560A0E28D672B580AB6552ED76AACB5F80260B9703769D33F4138ABC10BF5B0582DCC62DBE58C890F51B4100127734FB7DB7447A720AAE009D00BE8C610792C64F131F2D72115C7E058E48B9DE64F55B4D610C36D112716A31A3DFE26699E9C2ABA05658CEF1B2B0867CF8D5233DB74FA8DC3AD145F5D28574360A85E3B0B10AC0A6467A7B05984628ECA10463F348A3111E00578D3CE5480F5375A1EE23EE82087BAC41233A14AAA724734B1874A4ACE1133706258F5FEA3A0C1609E30C7FD210DA0C4FDE9162DF66FBAF792FA2AEAA512F0FF7837B9CC02EE9BD95539F001BBD60DD8B42D616B2CA95F3835F5E47D43B1434C4563FD81C15BEFA202CF3D9540873F684AFE19AB5C01FA92E95A8CD6F360730856E59C9C6AB770D6575962AF75878572A2A26413D01AB318C100DFC34DC1DEFA5927C4B459925D73E1EB91470E37A58455C22A961FD53F7D99026FF884BF4A2579F706335EFB6FB2250D52AE561898BA1606E51E96D37C9ED3EC6CFCB33BFBE9C3143FD3B6B334D5F61922B369AFBB31C3E6E9B5F3AEBF95CB708346FECF7159CAD94A93D8CD4B8C4894192DFE53EA436FBF3AF4E864E8C3991EA020A811F0AF50B4257436A3FF522BE7367391D0F950BA6452FBFD8FD8728F40BD2FCB894529985B432DFEF6230EB4DEE737A8D10A3BCDFB763E0869B225C1A8D0E1FBF2D161C2C65D6DFB958E982D11777ACBEAD8DFB6B1F5EB21EA942F7C40DC20D2E4EB3E729B4E29F7501DA34234561F6288812D612D41DFA83C5B8D90FF38BA548201B575B5293AD78120D91CEC059CAE2E76A9AB43EF1281E2BEF3E348D28F21947C88848960459489775176F8E40EE06427953687FB63E470F7D59FB60DF569F8A11E28E0937162C46AFC7D2210A885FFA21B3DBF5354B2941F4ED5D50790890840CC3B973D2C3D02602B29BACCB6CE17CEDB97B085A2AB310572BA7371D1F8120FFE37D0B0FCA35AFC5B562AA8499715A299CE059CCE3B0D11CEF0D9238961AD4BE11E9A6D1A4692177C8B0C53F11A8ED2650212E7A2F80EBFF6DCFE4672103658434D0327ADDCD66BCB6 +verif_message: DB8494BA19C4118FB15D0ACF4254FD37483FCF4748FD1844F717CE6F69589E61772CFEFA7F9758653409D4EE5A264B834E60D6BB96499EBEB2B06B0BA874BF31E641394CFAA6A2D30DDB8F045876208D2F51DE15E205E8C91B87ECEB05FF3183271B2649665DD3CC49BFDB998D539DA809305516BBBE9C906021191C5223E525A8FC3616A1765EC3F9C5DB53CC337E039F186ACFEA91148EE2A79CCA3689EDB62AAF28B5D752FDE265EE5280B519726C1CA9803295C674B7EFAFA4D61B306A79E3F6E7A887C2FB535B3B0FB3D9EBC87603EAFEF170C1F1D28E99BB +keygen_pk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F65E833B5EB94C60E74A60DD2C8EA1DE7FE99609355875FFC400ECD83F12CDDD1B015AC750DF7759D3D0FECE79542F12BE30A473921499A927CDEEDF9C62F0A755835B9FF464040EF409784BA7D5091BC92C7A0C623DEC017E95C3AD43C865B595D04091629A56114A3197B0A2117E9ECC8F3E48E1E9C772BA61E5AE3138189DF4A9E149291A6694ABB1005CFA8ED766DCD8C8CF72AE9C45503BB7165B84140B0CB5CBD33FFC43E6384CD905995B5A787FE484BFE17D2BF30250F78BE5CEA26E201FF1F20574BB677F4D208E7C5B96CABD6416EEC1E21E0816F352C848EEAA47CDD8E02B47158BCB44451D360ACBD9DCF523EB9694FD5E1557DA8F2BEED0A0AEE52E23AEF1BEB449D913276E88AF188151F6876E4A5F570A240A695B06E4D60132DA2B62F4CAB5C881F7277ACD1DA48687368CB8ED49FAE2A4B2E5EF3DE0260A731D659A3F42A19F466C9F0D43A102B129CDAE4A6BF084196D6FEA7EEB38336EF1F256502EEC80A492F0A4F8A182345CC78978C061C563D03E07AC6FC2A1CF5CB8D25C04887E5D11391E0B3CD1DB105C7345CB3C826FF058C30E0228C3A857B7CE2F064A508AE80E33CE2CA82FE36246D61578C52D69A8F8B844F997D8B4A3341C9162FF5320228DD59C0911FE479E72FF6AB43F4A7B9F805A86F984512F973D091370F681F49827296964341ACAED3E311A32BEC5174A77689A4921D029F21F6C40EA55F1E73C1AFF2143ACD3E5037FCD5B311CD825F3326710C3263A0CF6016D9EAE3E50FE2575E0AABEDFCB3495B9E77764E97A263D094806FA124A8C153E5975D35FA42597683C95D838067028EBDA97658E64478580CECAA772EC6CA319F11803A648D6AF0F9484B1582DE0C72AF6C4912EA7915FFEC900A95DE235DEFFC4F754BED724E3612F0696A1AE1FF05E8BE2590029CC0D34EDD8398250BC0D391DEE871A54F15685D9CD67F85EB1BB50F39A8A19415F863527430F4EFC297BC08A03DB9DF86D24C6D0F63D0399D2E86426331574D1C6798FBAF4633CFBE10B17890330965906E5F8B01DB125C0FEBAE1F3A498F45BF243267D9BAD096AE0F9C159A2B4D11BF6ADB35AA7CCC3A17E7CE14B5648281F856DC7D29BE92F560C105DFC2684D2D5D16257E22DBA99C93002BE24FC145440EF8F77B2ADAE7EFD6766200BED5AF94FD9F23ADEB7EF3F3E786E5D5FBC83F09120BD15935DAC68847F507E4561069915E02A65396ACABCBDBA9481227C0261C7FA80392EECE162FAF98E7CC5356FD0ACB3F5F9B7B60EA43664D053CA41865D068854AEEF2AD80A5626DF66AC0032B225197D52C7A55F6DD56D375A44DC234E355E6B7F100CD5DF2E307C20C8EF44C77976ABFC4542A0EBFBDB79AFF5E79B49A3F08EE63C0F78D124B621B7BF4BD3550AD63246FAF748C46E94091E4CC1A981B41464BD27CF6EDA5DED5E92C0A838E59E2EC6FD20C02590EA2807E1BEEBAA91B5A5F0312543F6FC63C0B82241532D2C497ECEE54C0E65E4F93836A8A690942673A6C61113966CA566C2CE9606BD897B900D7661B9A0CB5360C0A8D655F7A5D999136AD8ECDDAE06C11F2144DD64529B62CB1F1294DF222BFA6E5780FEC07FBA3F7ECA86B593C2611A745BC206FE307D4103A3B68D3CA41A77295411D44853B08F52BC74678E6C22C1700764564F3A391F787FF5F97A950C72F271F493CF64E808925231209B8BE77C862C77B7C04C3611C86397AF49DAF0BAA4EDE81714586C0A6C5210E46AB49AA56AD0DC86B0207E5A2F8DE9885B84076C310D09CE324E9CC275687B054A0B4C619760A5F3C4E73A61CDF37C276261DB1E07F5361044EEC1E69CCA9BD48C3ADCF680B9E47D15A2F39235437CD40E7C9541A06C0DAB13A30294338561FB326E8275ED2832F77D95C63915C069FD4F59AFF388458B9B39E4E0E24C9932477DD52FF83DBDD24F2B639FF9A32156673DF051C35B6F4F32F2178B2ECD09E7E9AFD4B62DD5516A0E2BE2C895387284BAF828F886C0CF467405B0A67FAF76E4D1AD93311C8AF07EEF16F1729F60646F3DBB92DB02044F9FE563338DAC30EC1658AFFEAACC7BC4212588C322519B3B90B6655C2EC509C73E99E4B2750BB711BBCD39FBDC5399CA93EFEEF0CE82E51D08AC350BC0B5E503835EBE1B6F84C42E1AB43C9D886D14AFAAB89A0BA4A7C949B9D115C7F837D7495A780103BE8BE9F514A349703FD0E418DBE88F227880CE5B2DD54C0BCE1FF6189C3CA89216CDD230D5987BCD46C3B6C2DE7EE54B7DC96123BAD7A9E2F926AF1952F424F39C890D61A9DA8CFEBE177085D1A8760876F68648A82DDB799951A101B828F57E0CFE0FAC6D9085962CF45113CC5BF6D7FC2ACBCEEB556DF2BC3D2FE67A863312134E73E506DA9DC78B7C94347217EABB73E2498D5F3A5297F1859BD13748CDB3B70E51971CC01F05B04EB080228D5959CC8FE5961A02092EC8D0A4D16806EB5D60864C3ECF801244294022A0823873DBE8DFB6D06B6BAF69CDD107C960AA4B2C3536BB442461374F8FCB04832648B60032864FA6F0AF76F34355B9343DCF3C8F99FEDD88CA3D83CAD67351B4562064EA1325180606362D79A76A1B3C676152BA80E82B843D85D537ECEFFDDCC95B4661CFA4A70B06F924D692D87E1FB8E1CEDD85F7AB9324FF5D0A753D862591BE239ABC963B50A7EF870B05F2721215EB90A60E466955D522CA4216944693546 +keygen_sk: 88C93DEB901A24A945FA94AE54DBAF46D81CACA943FBE320421C61B33204849F9B2E348E4865616680FC184376A8CCB8DBE598365A23A2723944F5351F42F4742077582102F6F313C22564F8414E3766704FFD18017FDCAE570DB8C8FCB567E413219CB4B45175B83E6BA5E322A112D18CF9F356B57697230350D2591EE02AD2654515841323222580321040120642608376188550176634731510683333264078287615325127243053385335764750651411352886412447441854656426582177856811385002136841863785472614485644207284863746275116021244362472076432854217184010421775184164585148086710348507315328027533632554457272072637135303018607528446155853611235027221854501562400845348268740118636423130112600008304711528547310530448635743456714114736044238013601575856425814675633201646054071686605736211151076637413357714200555148206328275448486820815273068581865813888742410733578478145575784510487413488666062634876800164637016836408303211676660763637808356747017075160431237863706556044582355114760786272844564615514502882771488685156518416550255351116131380722168040207817541321026105332372513588560486666763605153400686036781773532303584585585382556145873231702651821601615475613435453205253646503075124375016318314624232777663801878426424837807747444530335743840253724533076811415126522320801307361222364261376300384861833134623305050075166418506205175868745534514330687281118860016350371186663328188310830745273650720105182737223725385635305211024178613826583774831043548113617260264885057838040760302110701821740681056880326375664382264012811160478503288344266741722267083004322170545055376528862025654274506414127738251184766185614737488047085880182412045436442130811456752843202150138755727608856482622838424402844587233774173341673110070483014068730277187116367374840580222778655865752756186171868068267623570340728087440262064413321784407530432675404153510222801127828578286328620245514484038018554816208205504456242220260650730645146723062131036724555002752342572057672566440784215365574084145012466856044503712682574544182267478348533103222153480526415458043351332432388544762882581714034065842506052121857400516021227658746582612353405307057267338344888677344061742714328142333252663347632168324801205742564851867411268402233626284578365081135203388317585381768678341467536821887133776615067477507772088788475223160138804715728535786023260646826021885712306281647812062372811286363611046727808057720442776132781067716352488361062733251866054685857840457420542023545155765377857084582244508465135035172458261816554334254317166171313824372288330486348830232135368717232633204480245362724325702261536128252007641320831467776802114887488465410826053602543010762601427424208671532371636210147224850133520033281870045574587735040533704783165412680078731157477051152614324517581088431785417275162632401473321083815678856545746776374874304800626007433863048305242168847128485157785460127241373680123031320510753557476455618482257671271040403050182053635446611842371782003385206425686324506278743843608760167647052812756434850150304062123835645244000555334854840304846070522672406004825581021471435363611118441785683041814020154570744330533742113803627262112418474C221B25DFE65E913E32545DD2C3335E6C6CFF3F73D2A4D2EE3CCCF8150F4A4AA34FE4DEEE188ADF128FB7A2B549A96D67E4ABE280089CF16DE078483C9D88CCB292170D585A4382BF1C69FE4E9386CA1D5BBA673B92AB78AEC293545221DEFF4019081BDFB9374441C9328E45A306B3193BC8F207F914A5E4EE76C4FD5213CD1795294A0CF570155D124148657B5E209A64BCEB017F58C3F851CB7916BF22A0F94D248DB7F6E3758545AA63F89757BFB1C03F43BBA700EEBAA84EDDE961CC205154411CA10481A88FE101DB0BA375CFBCC6E777ACD72F00202BFBA22FE5C0964CA287D00CB93A01C235A3A6E731687039A86FF1C5C211868DD41B32614A48E109156079F7668DF08879AFC7D0E23197AAF7E630169E53D73797427F0E8C4727EDACE5E7B6930D5E1A8591B6007680B197642A71DC645D1A240DA6930FDDC2AE6A5AF09CDA16201E0B41484BFB1CD9277CA676D46A48D66637FCC32D2EF5DE2ED4974238347C81BF183F5BBDE7901D56F8A8F194E836432697BDDD22B0C82B37476893F52FD2A3A4E3D7D701FE3701B5945736D97F5CD029302D9C14F0FF981ADF7CC0B1A52E0490D5E8B3EB8D5E95C8F2599143849ADA2D1A9F2AE88C695635695C1F860D5E591911E79EE66D742C1441974FCBC29C42D9BBFAC0BC71ED751E56EFAF0C87D31520CC17AA910EC90CFF31D91527DCD940DC0280EFCC3C2BD2B9BC8F0B47E6BA575ED4C5A473B26C547E82ED737F4676CF6E2EE6F945BECE53DF764E6FFFAB31394D4E0D56219DE2B604A04D4DFF79C1115D7976D571D67003619C801F05288E2FCBDE519A5ED10C1742C780B2EAC28015CE8EC3CCC5D1AF22A8AC5420871EC6E80E8527B3FFC5D2AB8CE7201513476D0AC44B3515B37AB1E6D92379B100D7E36156DFB2586CCE1E2FDDA6FF51644A0B1B71B4B976578D05D4BB8F2BC0E9160A0F714FE270DF89947477D1CF24436A166588D465CEBA4E7AC85312B4819384C9D032AF59A68E08AD106A3AA00CCEA3F1C0B1F13250425160D5B446EA5D1798A2B9A2813445BC70EC445E13E371FAB63B6A711554C4B4BEC8BE672012E9C056A0898A8658383E093B2F5715D0C026F8F5D7103B9B8C8CDF4A52EE26E537175957ECE287733D17DF403A571E8BE539797E546BBBB28719DDB148ACB29EB044BF5F6D4D24F08524EB5409F8DBBA7B6472D68E9474660617CF5D6CDC1EDF9417E63CB38B8B00E4B0FAB413477F234A48B43D107FD9931B7F7B505ED5882A50F09A59B65865C06BEC97915FF3B04DCF95CBA410E930E9D5284B366C606FBC9BCDD07764D6AE6995B51B18407DDD910B774DC45A7F692DE66EB87F54BBD835F95E4912A4349F8B898AA5E0804AAB4607FFFE3CF45F40FA1E4EFFC0A42520C7859442CE7FC685F45A9CCBC15A5AB5B9927BDA21F85908D2DE4B9A8A82B7C0FEDF5B52F124D5770A080B07FADEB552464708DCD93D89D9BB3525A525B9F63DEF3AFEC97DD3F737F612CF5445D6BDB089B2FFD1276E1125A38EA1B1373E28AF987845EDB8CCAC3204C988DD64360181D34B5F2BD21104FBC86F19DB1D732ED4298C72E08C1D75D8800978E4CBAA3FA8E8B2991922882CC8841D33F8BA9FE1C24931A54121B9B3C24523797B585F78BB38FFAB9F291ED86E79B36363729632BB6264A95E24F19665029764994903E3330ED3967A6B1ADEB5038885B6188186CFC979C2077BDB2AE531C713CD58C258D5D767FB0587C0F2C37730EF326B9825A18578B9522C7108803553E54A9724300C69B5342FFD887D1D7AE744E721E161001D2FAD52AFA93A63F9E1DD06A1ACD7532D465ED15B07575C5B09917CB55B7B174A037E0A03B5148466531D5D315DB5156A58875C0CA2596554D6A97B3AE68DB6BC27F32E2EF54F8E181CAEF3B9F329643C8291225975009032F9DC9C409B9759BEE8759EAB07995DAE0D87A10B2B1157364666C9C974098C0A52B46C2ADE69ACE08D1E92726B33CA127CC26E775D1B4123FD4832B3954F2555010157AB5664410667E828A765CC56FE2B7D2AACB27B58B644DB35ADD1638C9E522BDF7481F1E3265C8D91081139B3B82A4E05DC449EA94ECDC639074B5E617C6B21AD33F79527D3D10BEB575ACD3816A9939BFE766B8F4F07A1AC9CA21927D6C609D71A8219C0D39A229C8EB231FBDD53E756D89250BC03811041A8BDD2A60C392DAE899F6F5C57935650649B6F21A21046978D4F2A5DD105FF16780D54DF3F7B0D1A6D68FD0915D13181292AD463354B90DA2C7709FE3F248C4A469EAE9CA57A8EABADFD0EB2BAAD5482B14553DBA05377CB62AE9AD76ED07ADB931E4384FDD1E55E4AE829B97509B3C84B673DFF72686365322859C521F366F38AFC2E8F4926F4D1D00431120127F1FDE25467DE4542D8EB43690337A7B405B88C3DB52A460D1B0BB8F87E1EB7DBC6D9BB50DC561D76F23A5C4A743412ADEF08393764FEAFFB3EE272DAC0420649790AFB070F5FB83B6283A6C64CBF69C49D9A0CDCD605E69FBEAA2A2672DC7DD1B454C8E30E0022EF2AAB91C7866AF43B2545B7D866100E56E67DF12A6318CA07DEC5726A14CCDC9728B169A1D039509C72C029AE04C28C1D6F0402E7819ACB651E03D0358794B0D32576331B9C0004243819B0D4A2006E81A36FE2A67F70473C90A12DD6BA669D5A1F4DA3D577FE9A8EBA7263D5837EB600976461E5DD64B93F484511EE2881949A5974FCE1575BF5D528CAB654CEDC7C5E6E4752024EC7117EDF5BC1ED2EE7F6B3C2873BD4EB23EFE00291DC81EF1B17CBB60723EAB8435AC2794E9A13D1454360FB18CB0B9B0733343FA008DC45046C826728C383FA6720A9DC2CE17AEFA0AB548AA0138A184751E7CC9F17FAF759EB18793F040DA465AB6706AFD8E02C7AF51807E2F50D90E872A4DD039863829C1DFFEB1684E6945127881BFF2E42107D643BEBB254A2CE489E32D7D52A99766251907770A2A1F4CEF9C1171340BDEDF1D539B4C304F8B22408AC24DD1E307CB747EF11F6BB35EED04B9C98E477B918A9F4C5EEA6502F3D0687EC5BBE77F2A5C7DD17BECF5E1F2DCFD18B1C49C8C9A1A7CCDE1443F3F71D77FE07732C9CBA7A43290185CAD7CD6741B9DA4FE0C984AC6EE6C175C7D6DE9EC65ED3C0A6EEFE713DBCC2D6478D657A1E417B8F9481463A799879531E99383FD3F7D4ED22D08043105FFA6761C0AC5B54CFEACD885664E5503EAE79A9697013B6272D69E48A60DCCFEB3AD28E402334E7721472930CBDC945A98ED5D78CF8FCC68FB267C0D497925A9C33829B3C6B87A0173DB9BC55A74A9F2C86859ACA54B158984B8FF71F6361691AB6EA01B5A922749058D0E188747E088387FD42B6879E879F0F66B276FCFD558011808212537AE4A35B308AF27687E6FB1ABE6C9017CAA6E47788925468926FEF07841D1BF4996FB9D3BB0E819773E84929E43C28E4B50696C08E1C7EF51E46C94C99401FE6B28125DA89A66D65D38B7A9DE8B02B59572A0F724667358C696B9EBE5DFC511B1A +sig_signature: 765AB68AC204B255699618463D65D693A1845D574181D1403972888A76B3A553F79FEFD05FF22F37A99C525FCE21F283E437FDC36F8EF4E9C3628BDAA7CEB6EB228C231180B68DE63421238141664AE3005860A4221AFAB18DA83F3A586491B192C852017781FE449A54E5AB166D972A182D3B4BD3D0AA5D0BE63CFFA78D3B1EC7014D1D65BB94153CC4AAF1CDAD92DD3F9460E91238E551A67DA3980CBC951F58250D32984BDF98837486AA9E1D7F0072BB731CA62C2316DBF852C8ACC3696CAC3037871959B7C4633E17479D53611F8AB80257A8D27A3C32EC62D6E68CDE16CF4ED867D33CEB4A963C91951333862788D42162BE8173166A1042E67FC81F37E4B33D68E3906FB51F09EF15B083F2F26BBEB14BDE765A9CC830445C1B8D4C3BBC438FCB76ACC8B43D43A94E85EC2D64CE0276A3BE11D5696AC29FE8624C30619A7F9E716F06D004FCB9BE4513AC1719A688FEBBED40B7781340E6AFCEAF523A337B90DC964F1580C78E26093CD952E1F94DAEFC15F0E5B289C0704964D9DE70BD8DFDC6F857D925C5249806A16D4233040B049D31E7201B52756F863836E6142A8CC6A2ABD11CF405F063683535BFB9B8A495404B98E6EF53E37065440FE868FB78E88E5E8998615F788E1CB6A3AA3707084F17C314C40376644E2DF461203103DE0E652038F90923F42C31C4A0169EF5D3A02FC575CE3F731D7B1A9DB444386708CA4A1AC239081A3F66E269A9070B7A3AEB7B76A0FD76C26B1FD91823F84D7C9F8905E4725B528896221CE7DB23530C62343F5EA3DB1F90EB1452D54EE1AB1E109EF962F0419CA0111F95C1A8034F969FBDC107F5EFAD0C2BD5BC174B29D65975FAD98A6127284227356A42866CAF9AFA816341C8E7C4C8E4862B7140B65FDA457E9B1EC13F78EEB051D371213134186969327D0E45163638E939E6A49C10B0E0ACC5BAC904E24F22A1F2B1298F4F59BCD085EB08302C55DECD53FA84E128647D3BA84D06ED092A0A416085BCB22F21A516BAC01F49C54488BF91E249C00A655EABF6525F0AB99BBF15DB355782ABB7626AD60B13EDB2E413715C129EDF21543059A3A5646F9A55E92570A683E6EF5C7E097C4DFA5B4A725C82C0F60E94149A5D1E6E1405DF204BE749A9A403D0A2EE26B7113B2439904190BEAACE77F25E3F62C122F7925FD8913A3331AD4313B6C34790E5940990761519EA6B17394F51FA7CE89CB77AD9A15A184261B4E5F2F95871E9CA59EB996B93518312EA1FA3B6DE7990363FE65259A7DE67256E3E8DC857E350826E95C1953689FB6A5BAD826A1E9C6ADED1AEEE12491A978DE2EC35FD1DC76B48322B8772A7B7E55E8BFC5A8BD0409411F0FF3BE693549F04B3463CD04669DF95CDE04D7EB6BD13DABB39AA3916A503FD1570D5C5D4DFE294A9E82BE575B27F9AB1EB21BAE06407E2698CC4DD533CBB78C92E227E9E81361049B92EC1999DC30BC9EC30E9BBB57255BEE750F884449EFDFD2891D69706C3CE2A19D4B64D26FCCDA924544D69BB87D50D17F640D5FC5FDEAFC6E4D61F2911AC6317D18AD12CCA6D6A6139EE3420E9E082527FEF6D111A885841227207BB79331AC0A20AE1317D09C7537DFFD182DBD4B25EE483166F6CE03AC5E19560F282169661F9F861DD5933597EAA06DD34B24924021D1D35CA30640147FA2AAF1BA782650DDECE73A7287FCB16E6444ED53131B9D9169BF6A9E09776D22C05EFC740A76F7F2FBBDE0BD4AC63F50B3FA5C718285567E8ECAD96DAF89F48FE1F6C4B2D34E01914669C1346F0AE30F549EDE7375C731203EE4AA29047BC31D98F7C2E472DA8224DFD0D05EDFAD589D9AB17811559C8C338641933C778FE572202BC4114EDAE552FD9A9A44EAF8BC66BC643A6CCA708CB9FFB8EFCD6CB5C87F16F821D88959B40AAEED4ED6A6D1F0EB7F50D90E1D40DC323C38E6667195FACD3590745D7A2899E558132201032C5782B343EC162C71066D8B752E5DFA9114B55AAF70A8C29179C8852A60308C7326EF0B4FDE20CABFFBC7D22AFC9400994669312EB78F0FD45843A6BA5A0DABD7B3AB585B7338A848C85E80B536EE9599BF7BADE5867A28B12B4EFE464639897E6B6FC79F42F785BB4A7DCFC0CA546D88CD8F98B930F072062994FBDE90510E6D61A7CE1BA63A66C4645CF995F2C7777E41D2876010FD7CF887E9DB602D96E864B5B9F64102E00F19868779A780D516B6945F5828E9807D415C768822A3B9A363CFF263E04BA72FF41D508B75924D17CCA35955ED102ECCF934FD2208656756B8DDA6FFD5A2B1889072E13141B9DBCF8B8A69E8DAC83403E7D4245A3118EC51BEE519669B84921E9EB9B85450A4504AA4763B5C1FF0783559BF7D04A3832D5C1E690C4A27B6F0E6DCBB4DA80249CA9825FAA25563267FA0237244B2DD0AE1A8F1010ABDF3D052707DF8DB9BD3B206B61D2B262B7BB0C0F4372155F6E27F1E036849DA92A792249E29D876E0C9763A244CF583950D6CDEC348DA48360F9B7CEEEC046BDFC7EE401D708590713E6F145C90610EBD1BEC8FB9518C39A2FA9EFEDBC61DEB4D0B61101E373930F2D5776BEE5E1AE6DFB2D8EAF3DD071753BB700E0C8CD997984905417AA2BF805C1B944FA67BC0CB961D848AD3B0725C269CAE77B61F01DB3BB160F8FA28B046136BEACAC81174BAA18B7E4DE4E210832232ADA0BCE8005B450C249E05B796E312B691FF1365E9A397605DFFA63A2F612CB46E9F2A1B5C9E0BCF1235D1C551FE568B1F2634F901592BD547B8C6068324EF660EBFFB6CEBB74AD033A614259146E30E02B456FFA038C2A0A28FFE5F882BFFCA4E7E36B07A6CB9BED8FDF775D4BCDE854DEBAA18B219F158ED2491028D2A418A190A8DB4F07900467F9B612B4EF9642AA1F7C09E08EE8B124401BAFB5BACAC225047483E5362A99F39CBB22D2DB63E3883812B8425360F79B1C3518C1D10C3E1D64DC1FC2C51FC20E346ECA8294E37C9116871485DB47395F8BC0D708EB2A52EE68BB2ACE0CB070AB9938C33FB341B81480418F8D39CF0E6F923EB65206F80D3AE5391392782F148EDB6EE3939431DF8FEE91DE625FD0AD8953D3A50D338179B4D1F7F42ABA9F5189C7DDE472B1F89BFA60586B750B2217580FA518549E502A30181AABA3217C1A5DC96D2A862DD8C9D91F5A556367C2D4449D07606069211EE65ABE35CD87025F89BF53F064FDDE4CB5B4C1FB6BAF6DF3149784B54382F100188E62EF5B56600412541F21019435657E53266F865D8623E2182945BF30D133B2F695D1B75DE11A3328FFEEFF041F4B5C3E9642040E13A825F117676AD5D40B827AAE31564F9143E8586F394BFFC0507329DC6AE496A6E0E0C1664E1CDF307C394D19515FC1D6B805F5ED3FE9FF20DAD5703C4304DEA97EFDED617C20DFB82BE300229227EFC33645A469E2EBF8B80B4D157BE5CBF9AB9BFD27350687BA5FF5BD6BCA72848E6E30C95EA3552A7FBD4662358B38C5EECFD5488A1FB3E98AFEA479B9DDAC0E91C16FCE75FE37CAAF089E6F84B8CE6331E6B57828A67A12B4D2616655E594C461834B228D38D323C509C2701D0327EBD8E9760A3CC8FD9892F10C84BFDF00A1F92DB6976F236BA7F430CEB0C13C28BF5D1B7C92E16637B699760A04C8871521719378292EDFF085900F364D1D2FD14BBA8FD437564B863009900F4C80CB8697DB7DD85941E8F9F459FA6C2DA26F2F783DA51986B344C5B8E8A8B993F40C7EA295046535B9AC02FC56769DC141E0ED3A6FC5C9ACE38611047042ACD43AE40CC19CF1103490B0107B3497471B2FBA1F078B7793C6EDC920DA777355251C7CC35A0124AB3C86371D7AB11C8BF083BFB879EE9CF02FE5570DD0503983E24C82EB211E47BBB0465B4BD47E2ECA814B68960CCDAECC5172C87F0488A0276499591FEE17639873F21146198D164C5C20DE69D110E87664406745F679E67626FDCF2202761A2C5C96EBE8303F05A9746973170A7CC1105F9AE50A53307901AC66CE27A65CF9A6AC0D2F40AA0D158AFEAD737E1611847995DEE84BC748A5ED57EA2AC58B2FD3D2D928666EA09D070A1E87953FAFB3AB8D3D468A153EF87CBCA1CE7A6C278AC890098D2BE52B3AF9F02187EB63883D5264171D485FFB1ECB272F18385C6B8E81788F37B634E0EC96728ABDCFC8769A5F2DEB8BB1FCA844DAFAF6D63AE11E8E9A1A1BD70E14D0583BB12B7E0C13C7A988054EEDC5DDDB57BC255F6EA90D6619B542FEDC5653078232070410AD7514FB50E9E74D51C6F8162AD25AD6159770762F36F74587E1AB3E9F50F7C04CE75CBC78BACB26FCE243E13CE74C28671157599651016BB041459DF4EA0B6F6F35E30EC1EA6FEA94BB53D347E26CE7BE6E4C569E60F9A428EB55C02F651A0B84E2D652A242A5512ACB2943F029BEE7793AC385BF7EA077F200654EDA0A23182A1FABB5001087AC7B45DFA79FAB72BAD1349093EC40870BC88DA3CD660E6E61711BFBCBCD507A2947DDC4114FE27E93A346182543F7C5706C5C8E58804F421AA775BC824D9B27C758A69042697F046A17C8B997A8FDA096A2A373195DA3E5FF02FA1AFE5166F8C243FF65497F673D6F9597BFD911234D7C81C3C5F1798FB4CAEA4F7D84E9F310343B51A9B44D93A2C0F90000000000000000000000000000000000000000060E13181E23 diff --git a/tests/PQC Intermediate Values/ML-DSA-87.txt b/tests/PQC Intermediate Values/ML-DSA-87.txt new file mode 100644 index 000000000..03b881831 --- /dev/null +++ b/tests/PQC Intermediate Values/ML-DSA-87.txt @@ -0,0 +1,11 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +seed: 6DDC6B90E85615F0B14B4404DF3980684561530D0836B13E83E3D0FCB6BAE3A7 +sig_message: 802CFBC8E848587F98DBEC233DBB54909D07F8618BCF2FE7E858FF059742251554A5CD255AA87FF73D8327DD46633397926362B78C66B289E30E7EC19DB39261FC7F6AE86D8CAEAD185A27363A580F75B3D2E9ECA8332FAC06D08F7A7FFE386AF28FF78FB32352071DCB8AABEB29C56FE0DEA9D939BD8E10EEE39C37BBE4580C8C5369591ACA24C1F8AE9DDAAC5696CF05E1D89D71698816923A912498B8869CBDCA80B1F1B1B32FA4BEA289471C2573EAC36CBA4390F7FBA389266EBFEF3934F1BF6BA92536C65DE59D1CAEBEEC5BE972CFB0C7E4FF45B51B805D64B72A7FB9E693C76C2A7279AA0A27FDDF344F6636187418F0C7B857BB0953B67F919C79AE9088A47E2CD97CF2ACD2D665236CAFA82DC16966D98ABF04CB20CCCA0859A90C007957EBA715AA56C682F1EE2026687A024F1A713E688093571F830D60346776733F14B344B5544487C1C74140EEC00301CAED1A4478B235A03FA1919EEE7A6B65502ECAE4037C12B93B8C1CC6C5E4A5FC1BC0592D3116E16E4AA4FD19A2E1AD1901F5D891A279F158B0F3A61D1FBF9F8DBA0F1BB032BA0105B0E21BDF8F0A2A413B4EDAF7DBA61351E1E97A1396EFCE7B0A6B453DD189881ABA27A5A7746A77946E5A075092C9B283BB8800F506C73326B8FD8C58CD143B483225FA630969408FF62EA5DE9E2F1D2CE20E8003F43A99A197EC9AD2E2AD99F443B20D03888D1ABC89ABA4B11CE70B4FD83FD76D16E217E3CA687897270FFEE03CDA625809F31336D6EA0578AACB860CB674052E5B28922AC92B8C89B1CB17572A74D6265A14483280F3446520EAD954BD327DF6D275E59AD9CA389C6390260B0D9E1EDA0DF517122CB77A818F802ABD3B61A37B6B4E03CD732B1DD9274A5FF55C918BF8F582B95C4ECA7C2B441CB1FF501A5831A90F7B8C1E2C2440B4BF286CF806CAC55E1A464763FD0743B32305991770796C5C0D1CDE024CB1708C5FCC49442B5CE1D599E615781B47DBF1695259E03CC2DC0A424627F369748A3F3246D9A1824EDEFCC2919838C1C5845A0921956768B9DFEC8BB320F8BEB2E72B03969F1362DF33F53E920E12B62AAE258679526EC39BCC2608068FD6A4A7F9E406D439EEF46969BBDBEF6AD5AD85CD648F0BE4FFE62990C8589523D64816682BF3C7E0983321D2272C9D76A218C468149092FBAE8757E5D1E152A7CF9396B7714E013A8234B22026299945245D89803F13A94DCE5DFB832FC9CC646E42473177E7B61B585A7D11A195CCEC39ACDFA40016ED9C3E161A61BFFB3739E05A371068B8CADE321A2AC1ACDE72C816F1B6373C68AA457686BE571745BD30EAA42264AD560F69176D58769CF5420A25DF869D4A1F1B3EE800DBB86B5D2AAEFC9A24001105758D02F8885C94502259B9F3072A65394B73F40F1C483AF92E1A69143B1C305B5A555DD5668504645B470487BA105CD91B3687990D2A413A78BD905DB5EF7A09C679A6C8AAE2D7A4A8B2FC9EF49903C748ABC3F1B72A45A88401AF8349EC12C4D8407B3A76F935F2FB09C49CCAF2D7A66808B103D0D5AA05AB431E805113A944451C3FCCD785AF6539F859A27B1B41D49C5E057835CCD21BDDA0C1A4A748C39F8E37ADF41DB811CB2A027FC39DB2ED4E3A98C1A0D9252FBC103426EBCFFBE25752D5674C28AB7FE18E9586F1FA782422784AD31CAFF5EFED0B0D694BA7F98E492B9F9364E603994AF55AED1486931FA4631E38EA7C20798182FBBDBF08287D8EE51B2D4724DF6D625580340A1E40FBF35F344C48924178F615C48BD529EE0302043559952A01F6AEED6DEDE1479C06B638E73F0A3A5538598BC958E46E68D4BADC6A0EF2743B1DCB874082D03346D2EA9FA445D006621B23998BE5213D5E2DB4E3A51039EC1EDC16F5C7098AE20FEC3495C3B35FB9FB4F06B267F01FD79085036D5477D0CBD6C7CA513C4B68195F7D63A81F71083CFA2DE23270D588F8641D443C9A23642833EDDDD4600D5EB138CAC283CDE3964C2C49932ED6019EA56976DEA8E39AFFCA7CBB9524C54A1D010F0BD58F69AE6D77DEFA0B96A7BF532CA9236B514CF12DC859F14B4ECCE46222763743CFD8966B0A77C0585D79CA6178985DAB8B61355DDCF9971F204E1C01460DDBA43BBBA92B1F20E9992DA2734F632DB4CE9FCF279B1ADB3F47381EA6454ED9E04F6EB28D28F7F12B99D0517129FE641356A7F7B3AB15125038C792F94C495A7FE6E52BEE569CF7DDFFEB4A4CDDBFB56B19A195A307FA91238C7F9C781E1FAEE386E60BE80807D98618782DFACD3F5E42B9E6F8C564BBA44DFCF63DF93B4FBAC416C2DE588DCFC079AFD0F0BF37801304A37B280D084A04E2CBD8618B2E61F91304AB8E7AC10263AE11D6532D6D1A82F26C2C7205AAC631E9EC522C1B15EBE6438D854A3E23AF3CDC5BA37F31597F43CA2EE94C25E75C59EBDF2128FA21D279DD891FB7D9103126872F110DAEEDB92DE68DA7859681062C9098186A9F18324E9C35AF960C539224F63C1C6CB412B63ADFF779CB487D02E7CCEAC3B7A90148D7CDECC185F5E6D587E351ABB460DD2E3E4F4BC0A77AC488BBC0C634394F32E926FBAF33B6086DD64302388B492E55F6C08388963C81B5F045202A5BC783F5EDAF7D7EB6351633D4838AD6F797B6CF8C66E12F804AC4179D31BD5D24ADF2DDD1A1DB43C22CF98020853FB34E314527E1249A22B8CC5FC471D2DC13DED0CD1D9740EFD671065723A05C46B33AA8B5DE6BC4DBD4F31432780DD6323C209F977B1412100B95CFAE7EA901160A1EB67A9BA88970517CC1D95D1003322C44DC73873677B63D7F41E2AB9B43F64DC87D70C110510D80198FA4B067A696D99D3A2EAA0B0B37482508C4387CB5ACDAF36C06799A4C184474BD2B100ED665DB48C1789DC5129795DF1A161978889D7B2B0B0858600D94CA1565487BC8317A2FFF9AB4FD649E9ECB24EB4FB7829E04A3E0F2087C518C30596E390D62530ED44CE64A754F57016C1BB3C91FEBD66D4770C8C7406B4A33D58DEB3EA43E70D3D217AE3FB841CC981289575ADCE06027DA7A86CB73E42628D1C33583BD907B1723D025 +sig_sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 +rnd: 0000000000000000000000000000000000000000000000000000000000000000 +verif_signature: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBEB11EE5E070E6DA52E548DC04FDEF5472E7E5F18210AACBA04F4F18AE6686B9AF9657E38E3B9BDDB4AA84E67B4D8192D003873DD3EEE74700FBD81E381C2198B7CCC137C171B22F9353419C48C14B8D630F996340275F6E604B95C435208AED2BCA1B419F8363F0950E240D6F9EAB118E4BD3DA0EC3A2BE26A8A09857713C36DD69C34EDD2C619E88267071CF9EE5A60CA3142DF163F01D8D796AC850CFF3666078B318FB5BD17360C876C9C90D8A7F412C8A31616BE7A3745871548486715C94263A17B36CA49925450C578AD9D4B1C20043F45E8431994FA6D26A141BAD9E496E009E914616CA570C09F638D062BEC687333AC7283834537EFB6042F37D83F7295DEA30D50090B6384C1729EF17A0D58750C0037514E5E1227853BC5AA31E95BEEC37B1518269262EA35ADA4FDA77627EEDDAAF57971BA36D467B19A90B991CD255DB79B0154886523031D6C5B1AE8FCF9A4310BBC8197484B2923BFE0B1215A1C4D8C68390898AD53E3369B7053FB18B0D874070902A5D3B3D91D81D4DF1087EF7DC0584EBDC63D7BA3C0D31F86DA6C0FD08115C53F6AEFEC0829A68D2A3442EEE4736702D66810D62308A8CC82AA62182F598F44E253711B5D60788BD0D690EF98F9AD593E03CEF38B9C977983F6911BA1AB9F735E928CDA38C03E6AD8362F460AE4CD0F46E00EEEC74B6123498AB31E7A79D334D72A7A7EEF3B551E78D31BC2CAFFB139CACA4D79C8BBD52BD78F4906509BE42E7763AE6ACB898285EC9323E68676A8CC74A58C8DA8BE911ED6F513B6608707310FB45CBD97D5FF0D2ABA36FCEF73D46CB7F01C2CFE38E68E84F4A301916D2F510D82B4969BE7A0E9CC60EFF5C0A8717B822838C77AF4206B12545089BB2DD6A3FF012C86415BBA04FD7D4EC707AF3B17F25574766F1E92738E06210F48A5EF2550EBDF85A5CA34497CF1D4D3A758648EC41172443835E5091BE8F047823D9620C2AD51C9611AAEE39B21E6D6AEC870C8915E266476A50EECA599622F7091A34C23F14B40429D95E3EF98FED3E749437F04BB4A337522E6809FC104503E253B41C4F0301AF467F74D33125FA83EF712445A171FA40EBF4E6553E454AFE2568021D2B2A198DEC9BF720F9D72F81520BE87466AF70D00E0E860FF9ABD03978C3E429B5AA17B97F9AE93448853D6EFD168A30C6CBE8DE2D288D9A24EA5D2A5823332B84FD2CE793A22BEC439848D4E60F3BB9C75D7EB0871E803D61B07E749ED76072B27C87B69D6C014261F647AFA88C4F1EC55A75A50FB4C79D2C94C0503DB20DFDF71F628874188CDD7385C03381DABB854D4AA9F47B66438C43FF53EF5E78AB450B450191278AF6E26A7B5E6461F577F9852F81C90203C713F5B1F6C3EF558C9032516D8D62FD5E24E4F0F50718F56B5A59A009D5938DAD5591F61F4C659A760526EF41202FA7E5F6C7D5E0B0C0C43B524B66712C5A7C53C84C50B83EB9C98D2FD084C9C5F21FEE7742E6EFC8CBBE5718B70C062D82E2F986F38DF1E71589DC7987243562A2319D7C00B26E531E93C38444618CE758734FDECFD0C6853728C61000784EDFFED7B33086E168D6CB63E3DACAF3552F885B478262DE5E1E63CE7A4C6695D1193835E45A67918C42D39BF880385330310F2C7BF91E6C3E29B781D09870C26D76BD8AE209C42BC7432DBB4C16526357A5634EECDE93C51DD4D6F0065B2EC57AD3B58266539597C8F42B55271D6F90E986F6828D959EE800DBEBCF48236BA3DE2527E0ECA4A3C2A34BBCDD6CBB3A9C96DC3BE110D3499466E2857FBA98123A6DBA9014877E24EADCCA40F8AE94B2FED236CBE5BCA9DFE0CBA9A0F86241331859F9D6C087B276DEC9356F1FEF69B359F9FB384A84022DECB70108DAC8E93BB6C300C0345FC640C006EAEBC15113812FB37DD96E2A06A463AFCE66C59F8D714AA1FF494F086FB9EADA184563CA9D8808B16C19A824AD857DDE51E508B7041235F300ED2C799C182305389576CF393CAEB0D3BA3E4EE4B577A3E37B275FD8051942AE9154E5BD7C35E0F895523A29B0E6B7AE20BE21DFF567EC8252FF5BD0AA145015E11C6A1B941BCC7601BF039442F200619658D9D04021FACE6BAB5D49D8D7BC9A66C2BA3FDC490DA55CB4670838EB2D07245BB1227B024A8A5338E9428EA55741D671A79D6A14D27D13FB59D0DAE5239E1BC42187BB78E038011DA0D1363FD0A78F86261EB026DE7E173A90FCC017DD78F5A32D3E29CE384576A95511B6B4E56EDD014B160799BD1977F5D79E399EAA8E2B75C5EB33566CD8B63F3F4E817E290A68ED1E9FDC6BFA18E3E57D057F22FAA2F60FB634567255165EF418D182FADDF7B89F7D301069C485D8E83489D493BE56EEDC43D48200FD1E2B0669071BBF33613928CA31910BF2EA328EA864139AEF791A9ABE52133249937DA88C48D4C01D108A4685AD29DF2ECD4183820128440EE5378D6BCA6198DE89A97BBB4448A28D823A5740607C6E69989893FA7E299A7453D8DCB34BDB7EFE95B0C72314EFCB493C09D77BD0119BACF2C22E7CCBCD597F6A09FEFEDFA0A7AC3C90BA7519F4016056D5FB412BA02D0D45CFF3A63D36EEE1E468E6EA2F673A7A02926BB318BA73EE1B2C137DEF4A39E803FF573553E9A5C6AA1A1721CA54387CB1DFB8FA7DA726B2AE7A05453B400A19E53252789DC3206324B2584B861F00A250F99FD9DC7D513DD7A65A04034EB33D2D56A496B36ABA0A3008E30FC13824885D9E6F681A7DB62DDDE3501BD40775E2E2CC09CC8E4E67027202A81170A57F4AC198C17FBF95BBCED36D4930B9508CFA3E8BF6E554E91BD7D6E53233BB91ADC815761A0435DECCE167264C2F4E34343D1E5AF7BCE60C9B7B7EE5DF729A0DDD4BE66F82FB5E2CC07B038576110EFDC7D55026BE755EC1F02E4762D6F1DADFF41CEE6352C44537E685A50A075463217B92F7330CD929CFE3ABB5FCAA262093558A0733B27D95027A769E7DBBC1F36E8410304B5D597368EC2A632D46E8C2F8EA2BC44FA76EF474EB96A364409B2363424B8F85004304AD617693BDC388C3FC2961BDB15A1F5B20EF95ED998496B2938182FFE3B927EA9A23F6428DD35C8611C839E316E9A5327CC9EA82509B215CC966BE1C7848EF392DA1C6F369A336253AA1152B6DCFDAA7CADD4D9A1D589F73D3EF0FBF03882FDEB944B5B6CFE26F6AB5123829558C4C736F0B687AC7068380FE7F61BE6B40E3F04D7B36820FD86329B3109D02EC6390EAFC8CA730562B68082424FDA98D0B64BC9734B40B63F7E37AF6890AF7C2D92F79EEA3CCEAC60A6F380692F802B1556A78FE5583FF20A9C6A7BFCC863A9E7B62014D1605DE894FB585E2D4F94115E029E5857E6A0A7389275F530D3D80CFAB1F225D38335D24679197D48A018A34187DE3BCCEDE94FF8EC534C02DA724D4598D669E85A9C60E45214FAA6544D6A47D1C4ED7409D55B1A7F115AE15443A1C310640D116238493EF3EE2879BB8461F7D68736470D4B573AE454993F532301E35CB9EEEDFFEA82FAC497753F75019F2B3B02C70B64A579531C326072ACF1BD0AAA09F0A978B78AB22BD6119F88DD2D572F8919D474F591DAE9FCE4753C985FB250425F26561FFA9443F2376689FEB48C4CE514604526A100AF33F0D4337D1604222C4D9F93A8E69E4CCD36669090C5DFB0E95494229FF9B20CCB1AC81B81A36D63A850DDB33334DAA5146BF36FE18801E3BEBD0E91B5E1CFE7A9826850AF4397D1B07D3B719E57BB832AF4234C0CD9FD40B882FCEDA937EF9A2DA24592BCB5D1BE83EC5F03DBDFBCB335D90D5C8A02EE53D508EB5DE4A961B958F751E5F89A1D28895A3DB7B62EF4AE16D28FB789B3203AD2463D6EAB83A6D20CEA1314AE02A3FF6F653154AE144238186214741C236148183BC39AEDF44DA97F731CE3DCB61A4CFE14F9E84AA05AB1C1B951D20155233FAFAF16CF1BD0BAFE199E65D563453BFE55D5F474AB10594D738A8C106288D69D07A1688601463F3BD2146819C83726D14C6A80839B8790B5716E772F6C24C2BEB7E2CF37B3F42ACDD473E8CCDBE484D6E07B073DECB174AC3B8BB2EF54E6DF9E02071FA600AE55967EB6F702F719159F0EB065CC46048E875E7CF4271AD2EDAF910829AF613BA89FC612A00FDAE537B093AE8CBE6B70D0301FA2E13A916381C92ECB451A36E3FA8B7373620C071A30534EDCB4A3F113117A502D6A72DE6C77BBBF6AE99859AACE64A928C374BD2C4652AC97EB744D29A70CEA9A19D7013497BCAB69631433F9ED1FE20F80B5983E1288BB6A2BE91543ED47928BB5E462D01E9C0B7FFFAC06C10F152F43C329E89DF8A79996A09798A367640BE9FB53DCE27BD0BAA9BF021BF10D2FCFE5B13FD7D84D1C1EBC0BCEC26D08780D13B9947672661E0FA5FAE6F315B6DE40168C2351DE31F41FF6C533226E1BCE3F8E216AF3BE64C693372A066B175F726CFCD642BAE980292C1CB65E01F0729640AB009CB98892D6CFE40033455DEE73033B6D5E19C599F8A400EB141527DF2BBDDEF50BBD5FB55AA5EFDB35D08569B0297E2481469F17B87B508936A9C5C11089AE9E4B0CAC5749393C803E47039F51B5CBD42A6C9E19EC3F63C2332E87768A960FA02186B7A2B029265091146730463DF8B375F24AA83BDD41D1304FC2FB52DA10F1FED652908CF8C528FB2625F393FC8C7B33FAD45BAD47D383D2C04CF32E807425F93D2350721B7B2F596648EB5E1386B43D12EFDDB8FE2436AEC278EE76875B523C5431D99485773D9ADBCD014DD87BC68FB82EE474B22A5433AF9F991FC34B25834DF13099A46F568AFD1155F321B9DA9E9C06347AB3C1F59F7EA0ED6CF47B3E9AF657AA7AE9BF8260B969DE4AD24D3A8CE95E577D0441305064E07B9A2C75C3C43801FCEB736FE3D271BE1F36BFFC8E43DB14A162476BAEA9D346B5211ABD00608B15AF3B5E63A00FF928D1EA1A18D75FA7C6C1B0FB6272E55C3FE7E4D4205E5CF0A1F8718304E14F2B4CC543D0437341A4A311601A92E92566B7DFB4264E870E1B3A875EDBC003A561970CF8A669F3D1B69288CC6E359CE28CA65F9DAE8CECA743C1C8D9FFB5508824A8361E33B431A2E9E9A997847D2E6E43C83F02262E2946DF7726D54E3E6C9CCDB6D3F136346C11E5942E7A1BF850C2E99B4FACE75FD40886933907CCDFC0DE117702031941D001E2A683C5578FD3354212CEAD969BF1C81239EECC774FD0B883D0EEE824B10B879CF707CB268474522061E927B1243244115C669E9EB272B60A644F519EFEC063408B658472E9161A1F744FD66169F0CAE36B42E2379CBE81E6E51A0F53415184EA006B2270B33E2CA364CDB33AAAE77FFD953DB39704D490CE9AC6F2DD1C7A18E617419A9AAFB37E7239B236A4B74CE63E4A0ADFF855DCD78F6458E760BFD1D2AB95E83C03B6FAE0CD3C5CEEEEE1C69515965A335FCF78E80AA739339542127170B2C3EE10B0EAA099AC7AD4CD76E7FE4C1164E62F4E5807DC0061F77E4A8A528D710375930CB755B28BFFD928CB07BB4A107CDCABB308A48650DA4E574D9BF5607F583DAC340D72093EFB12BBF93410F1EF5C9516C744D2315EC9E000A8DC5D17A7B6F0D079D784B6D90193F6E3EE7EA0EABFC6F68C52B37CBCE8218AFA3670A80BC17B95D7B40536226358F04ACD92A1BE15B26A4E5817E628BA679B3527203CD3632628EC83AA4F2186D2F005D5DFE6F7FDB4FEDAC9E89D666E303BB568306156C56F09534E25C619AB3B95018F4896BACAA4834F6D2D8FE14A938AA10E53054F0008444AC2EEA2538C1230E6A18C92B01D9147FDCEFC9C8DAC1D4ECC8CF1F962EFA1B8CD3C969000B7EBAC598DCA45EB40BCFB19851483851CF340F3E8C237A9EFF1C9F21E4975541C61A8FEF2AC6057F59DCB23A80E80610CD85DB203C35D24BC82B9CD78246F59FEBB24832D7CD664C995188E0281CD7867900DC0DF44D409080268B79E95682885F228770734FA53518EC80CE2306CE1448524EF0184303D450C76EA63B733EB0C8DC48BF12423AD23889CFCDD891E5950047240DC0C38AB2DBC165B81E631002EA6F74119E27F9F86073BF2DF710818676980C4CB6BD53F9A5721778B89F59C68C8935F5031C8A93367D717057FD4D5EFABEDE702CC645EFB6D7F44C860FFF7637AAD972248C844D15133920073891C3135D297868B7DA86F097D8FB39C13BA14C4F247516ABA4C5F8CE3818482C8FF60CCA51FDB2CEE96BC1138DC04A86F857727591AAE6F87C30059B3E81B68055B24EA2FA983686498BFC9D9E7D595079EB646E85B212CEDD21D0087E0F2AF663EB772A9847B1DF2197AF13626B897C24637AF5BFE81816A8C90D3048375B699497143E577185A70E115058A3A9112B2C4351B6CAD009282B4F7CB8BDFC285777D7DFE8F5000000000000000000000000000000000000000000000000000000000003060B11171F272E +verif_pk: 2D1E6BED8452EBF126EDE70CA0A2B50D03342D5B13B2AE210F4562A3BF670CB15CE925FD22F26242BAE310B3AA413B6E78D442D935D1728A3248CC205CCD8D3FD834955520CDFB2C73E90E608B2C3FA8B7D179FDDCC88111C9E84171E9709B535933E492B6819C6A92EDA25AC407771A8FEDB4E711FB89EB7BDFCCEAC53B4EF46B6FBEE132A9D7ADB436E74A6D671183AF311A7A31429B012117527585F7920F348A6911885A0208B66DE30793B13FE1D57BD951F7AAC0349A785D26DBF1F0A91E5C9F4FA7435C44A943F1381145EDEB1C8A05EEFFAB202CF62CEE7742363EE69D8E450FF67C3962D6FF97BC3D02D6DF4A35DA3F89A48833CDF290F0E9372F65A58865FD4044AD090992AA159EEEF72B0DA7CB3A5E0AEDD67D828BBACFE59EE462AB696BBAD0E5A9BB1F5A51E0FA5DD44D8EC0DC4306DF2367B24AA2FB752F82D844E4C0CE159E3FD6B4705F3BD0563E0A7A4B94BFBA012B9C8B9135F2DB4C8C8DD6EEC8658DF30559BE3A17A772105614EFB8C1BE18110BE670F839A5727DF947FBACFD1FC37133584415D37C932E7092FABBF2D09D25C4CF4AB8ECBE5D8B7FA47CABADE71E938392861E8D15A41C5B4225DA3D16D393F28550860A86356B14AB5F22D0CF037CEBB40EAC87A24142A0219300B6476F96D041D1C30E3C52D245AB6AE7A1E5FD73C5829D60628B6D87FC889C3EEFAEAAB61C18EED7511A96C4932505D3833DD83316144488E2AFC4EC591812B999C1C95F31790003F6C95514AA29087824AF1D991236D94AD950EF66FC7FF4BC3BA0F6FDF262CAA59D2B55B833BCA67AA51EE1145F94E2DCF05BBD4307D8B1E0813F845490BF2359923CA598AB7D99D2F0ED8E0BC99FAFB013EDC7DDB86172073DCC3573A0CF0CD97E93DC63B882ECF430CE4392EA5ED8C8A1EC79DCAE64D433EB538CFC4979BF7A28651E8CD521B08ECAADF8969A981000356D589AEF84848672BACD3866969BC283B065C1ABCF638C2DC342B27DF6B8F03D26218FAE4E96F25566BC6FEDE719D38DC0CD55205F10CADA09ED914A4333D382115C2F5DECCD54F96CE4E5F268BCE927B21DCAB5CD04011E92F5F601862B20209BB0F956D933D50AEC1BF4CED2B2C2D43F9A25768E29875264864AA57B5A91726EBE6D730A8D89538233704420BEE0B01B763043A55B8FAB7EB8615F43701B1A716156F913312A643314009872EC328809FB64463D5602D976D3AA900FBDF0F996437B621926226A9391EC0734F52232B36566E06B117F979F1A8946CE8FBDFD2FCC3DBFF283A430E10272F874E6219677E1578AF79EB331AFD8C5D720DCFDCF79060F1FE5843D0B9CB3C7ABB8F1C0D0B5C701E20E3BAF7EAC445A75500A761C13DB25D40D19754C02D9F3DF6DBBCF47A6AEF6D1FBF4B455D3A587A155FBBFCDF6A1645712759A11A3CE427084549312E13A0FFACAF22591F14D8F84B1B535ACE98177344D6F5D149DB9E1F03F3CE7AD48E68C5186F44AB4D098EC3A4EAB582F089E5A9D4530B085DF4AE792C6C8189308CE9A8CE2918D91577B37C880A231100D4EEF5107948EF83C3C2ED50326B8727FB9BCD795C43108EC6FEE11AFC0A2ECD7C80BBE15AEC917BE37E2408365DEB34EB415B35C14F65FA91F70B5239378B947F91D2B1E8DB1257EE5853C169FD0C2678B0DD2724E7430E1AFB866CB53DFC4FBA56D03F2AEEE90FED730AF339809EB75C73EC82FE7225F2F0ABDA42288281935831286EE72B426892FC7116EDD149822E7733EFA4675F940C18422BC7536C782D3AE6E0DBF6FC34B674919F34B12F283FD395644053A246A356912CFE493FE26CCD601A04A84A81D85E6830F3CE66DD2CBB1148CEC10B3634B9CF511E0F9866FA7C03B9D25D754CA404D26BA718E25F5A7E39B25207F2905B6271417672610ADA30603FE82855D01044DE06438385E831E219A3902F8F9698552E5EC6AAC9686A78869B5B57E031DA968CA450FF914D67BCF9C036FD1D96F013DF8F311F3291790E89BED589BF0BCC7BAF460C8AA30B42F228FD3AC18C2B7C47B319E0F7E9DBFD463C28B1B585033536D79BBF80D9133D907E7B081D4B4476193F0FB68BC1B41C2F543307E76F9B1A3D6D426EA7775127AC8309BCF45BE747D8A8BECED11E6A1D1B8F190AD6D6AC654E9DBAD4C9739C8D844A91A37167E68450CBB10F4AE8E2B69FA953EA5C991D3F1A3893F9086931BF1A089C7F22357D48E2FD571CD36F190B3983E19EAC80F129DBF58EDDC6B9A7984FCF04CC3B40DB87A8DAD7540D5D5DEC8CA393E45E4BCF433EA64E15E944291ABBC422AB3D06023CE578EFFADA22B64D994A0800F8E5017081D16CF51D0B928B659EF78CCC996F9CA877AEED9155EDF5DBCC258E604EE17DCB3F990F988329EA1DB1C3856539030692E52002CF30FD5802E025B99BFCD1112645B56C60AE638E74D21E598789DE6CB60B42EE49856CBADE6DD53F4C567A29FA05C7CFB245AA772D0E763F25DBFD8E9F16BB429A628E693D387B6D93C398DEA28C0963DF5C23C29F280218A039D64F8BA81C1DDA2882A842E3CB50395EDAA6EE26F5E993C63EEB84F6632774223362989B0ED5FF25A65663FD28B486865DCE0B0C27273F1A4C6562C5DD8C65C41CE308959A9D64596D08E7B25E013FBFE7CEAF3670DB29A213CCE9975A913CEF4236E64003087709CAD6181710E951926CA55297199A608AE545875CDC38FE383C14562B48DCA6602EA34055D983F38E61CCE531AD93F58EC162845F538CE4843871D3C4ADF05F35E297EA62EFCDD5EF9401BA042A235150A09D9474A3FB03AAA19E7E37A228D5F5B07414C3DA2AD2E5C75ECF04C112B90769E19960E975E8D1917B3BFDA84FDC6D2326FB8A3B00F95D9C52650111572BEC21B12127CA570D8A98AB977EBD8D79A59375EE14F64B5B04FD969FEB03D0AF73489E3BAEFE7C7BC8DC7E85483EE62F02398580F83B96DD84477B9C48F0BB39F5406A37036D6F36E2B1B6B53FE6FF61C327B29D4E05DD2B81174C60B59C79CB1976BC06E7AC34DF3E38F7D2C1C0E3151B7147AB831774770143B927B5FEC5DF776C1D72DB6BC9981D65867713CF297C8B0F1E98D0E16F0CC227A39E47E50BA0116156D5B5467536604BE05CC2EF40ABCE852F15DFA2CACF86A789E5B7B0E5BB4B777CD7CC9F654779B102F78B5AA4B94C3B4FDE55FA7F7BF54AC225E1F26165B65F16D0321669FD9F6E47FCA1DD347096DF5DDA86466A57C5B068D9C67B7320366EA19C8993FF90BD8FB0693FBA370E66D2B203B997011B0D15B94E28BAA2EBF01774F7AE78F84EDBDAD9F65A450427A4774C60CC89A020B37DA21C791DAC8F7A7457E30D08B01375160039C301B6051A965E8A7CCA2AEF93BD52F82C020BECE90A129024EFEA4B2FA21270F8EB5ED6AAAE55929AAC599A577972957660CC47AC4E3CE772BBF10052DE7EDB1B8A44941F884C9F8BE13174669945629F46DE2467444F3106A73FA279CF02A800A047E20BD4D820B389C3BB6A868A5384CF5724C204CEFB1A6A1BEB9723E36DDDDD9C707C8F63E8BC26683CC8B43C7DFDAA408AC4DD2BA9AECBC3B6DDAEDCE094AAB58FF732B196638D8B8EFC428BBA9615793C4DD9F00F90D62C676D127A0E18C14C6EE9C990510B054ADB4B4170AC7127F93175C1EB22512 +verif_message: 14426334940960773BFF65F08D1DE489C4C3ED36 +keygen_pk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B401CA97141E75D5D7E6ED21E0DFCD76121C7CE91B2D2A9E518EBDAC3DA4EB711D158A9849579F2C9ACC8DA603B7A37C2176E263A45D9A31F35BDA4ED1DE5A17F08BB3342E89CDB0997B2FADC53AD8FE46E6D2EB8A804A00D7D72DF8AC76918C4A6A1B224473B69E080E52C818202C60A44C3501794681AC6ED2E767510392512C03D1F2CCEA0A60C46FCD946458B128E16241C12619DC0921F34C53DB45E727FFC9925C13ACAF2BFB19A09347B716D41818B5F8E3EC31B7A4284275FD1DAA4F387FC4CE92E04A7483C11100D11E7CB241767629FE017CFC107964C4B2DBD50905306CF2500757717B874D5E1932A7C224EE1611D1E82BF6EB300F2E328AAF0599DD16727811B0FA79E04EA07DC436C30BE7DC82A7E9C3F2E31937DC2E17841D4FB4C207B88F1840E9B3BA0177A4A2C47013264FF5770B1924A5EF82755B9A99729F15DEEEDB367E24EEB5D25F1A2C889827038D8631DCFD7A05063BE9DB602325D4F9B4BB166F225864931A4DFC664B3201582D97BEF1929902B300AFC1D415B632119740B7EBA2F8B868291FC4C74FD75D42623FCEC02D0ECBF23063DC3046A2D484DC68CC4B3AD775A8A90AD7837961F1D500C6BDD47F7DC6F8A03186717734A81DB143ACAD1224765AC849EFAF752EC9947AB028994A790EC4C938D7698DA826047148489F772183633F24259913EF522192A3C55CB1450486045B47534C0FB4909F53DD466CAA6379FBE37AA023D59F65D0B8CB36C1F3341DD695876C513DD44A40DEDC7F67215AEB25696596371AD621470AFB261B90FEE5AF42BAA2FA78CD3D530C16E80B793F27CBE4ACF94C7EAEA56F962F8A5A659F33E7A2ECD18C19A298694F57ECF611CDBCA668CFF31C1C2BC0133278F229454FAD2D4251E2113ED7DF79320CA80435D5231C12D75045444E2FD108B813FB8FF0422615B74AE7D1859B224906B048EF127637A6D3D16CFC970853F958D494C24C9BA09832E7863AD95CA237830CF04DAD2B41B85A891E8A32B62EB27B921C3B53700FBD23D3BD4C2FB4A39A9D1B695307D249E6214923B03B9B998DDF88DDCF6D1819C7885AAFAACBA3EC60A3B1C3B135183676AAC348DFDF719B122EB80EFED0C68D89C7F225B800F17958D0774C559EB4B4751576C39410CB3EB51607A8404D7C52F0B628B54FB8FDAA05CE6BF0CD3F68C64D2E1953EE461ECEE1A219DCA24CEBEF904BFDF794EDF49DFABD5E8E486314D0C5992662B9F481730C052CEE9F4916D62D79887748FF8252C515D02958B009F9FB1F57D6557465789ADDE9EC6ABC253A08F4DCAFA28BC4282D4E3608A97D741AFC572F7EA866948C3237A07CB7DB75EA7E4EAFB1EAE9CA382C97EDA8DED02A58A089C7B5F5F69CC9EC35CE2BCF6D106BFD4EACB1F3388A6957D64DAB8A7A9FFC23BCE34A8482009B9667C6B86C10D832950D3A071D9AE8517DEFA420EBC60613CFB021B4548FAD32506826B434C25A07B55F841B80C8FBE4A8DF63A0B63073E4EA3E17FF07E4016FA0CD0E8768095006A74048AB9DBF958CB60ECC5B9077770C620B117FBE6DA4612F23327EDD258A0C691B329011ABCF87A86E18216D7FB8876598E9611971093B7F4DD7CA425113165C1827F9F1F4AAC8735BC62777A17ACC9260411028791A25D4DB69A78A12C569AD73EA984B56F96D2FD7D2BBA126ECCF2ADA1AF7B82E9DA007B7A4FFA519DE072CC3000EC22272D718B172B127B21CA01FA129A315D76077DC3E9F67884FBB1AF8C8B71BB48AD1D7937C3ECBAE83C61C93EE71B67AAD525A5463A0E9C70878C3DDE1D966534AF80FF43C427101798EE894C8D4F48148C89D57A5657E50B831B98A7E6699A731F2A0E5C7C30D5C4AC4ED7F9500D1C3A2C1E0E8DA800D8ED77A96D239D59E7977227290DFC5A436191C6D68125F0B1A98906F19E2707809022157BED26D8CA0CB3055601B002134A6263BF6F93BB6C38AAB2AD8855ECACE472F9E48F83B6CFF455E05966FD186A7691FD18A9249908326BE552E9FC508600BF6C9506FEA5A1BA85882240B5D0D8FBDF4348B66E872DD8F3A6518F551CB4D555FDF6F30A01A6438D61553E90DB1ADAD595EA4B12D421B4B6BE1B41A819C3F0F4F780ABADE83EF405D6811F2CD177260B435A0C275013C33622AE7CADAAF4C145CBC7141E3392A3D5D37EDA4B22F465C46EA94AB6DAA9AFCC1FC4789F104E6497C96962A51B5DE28F386641A671BE8A1C3A1529E4F4922F7DC9C1C2443245F1D3EA83ED557692C7CCD4383842C08FA9F899161591BFA60EC08E1028F0CB38743CC9C1953B962071C1F7C60362DF16C48D52948ACE7C2E63E4243044E6872EC64AA580BC21BD9AC77C3E07C526FA04C1BDC2E219D891DE3A87BFC0E7C2FEB000713FB41069D3DD5196AAD53CB5B475783862067B859BF67E3132C0CA0C4539AE6ADEAEEDF6AFD814D7A58BF67B6FB46F938D9B989AA179D68CA7C2038F929BF60760200DFBC247AD11C419686CA7D569743893DE8E1972F1D72704E8EBA17E80E8ECB63A4D6D34C37AF725CD3F948A1C421EB31649EB5BC4F0D96AB872B599128657BC131958189495C8DE9EED7C97816511E34649601AF168C6A55F67425496E433D5CC57801DA38840EA60808F805A3146178D30DF77041FDBB7F6DF01EA8AFFD279A33B876A091D1E0FB9AB50E446B2BF2F045BA9D77C21AB29F6E108CA7B90F2E695F6F1D060289C61523F49183FE69D319604C244D695B8E734D6F100B3A9E521CE39CD0EBC42199FD419E2DA9ED2D187996A183073FD06A6113E96C2A28DA6950700B6F1E45412D98CC2101ADE58D99625A0CCA99430AEC190781E4F96376753920DD4E248324F3BBF8A324DD2E70B3B3DAC583B6052AEA72D7D0D3C449ABB9C33826F9209AC20A2EE9B7926DA3ED239986FE62E07F79DB2095BBFFA001B0592C475CB15E4552204B1DFB00A8F32A5A4CEC6E1B0FB601F518831A306673758D2BD6F9795A28547D0C7CC38D25FAEDAA2E3DF673A0BBFB64848305D43F1A44ACD517EF4A637A465DEB8D6B609E50F49F05932AF8BE0878ED3E5AA9EADFA1E959C9C56D516EC8483FE2F536BC7AC721235D75C6C2AF77653BC353F1ADB048024711FD500A274D74F8FD403406FDAB67CB665AA10B4349F8EEAAC3B7481353F285AB9817FBAE7D93965304E81B18E84DBCBAFA21E63E1EF16BFE132BDACB8E875F6AAF8EC5E0DB549675C40DA184EA75087508EF928BA4F3E2BE35215D32A18CAB85FDA74EF466796D515049661B595E6811D34A646DA2B3859EA8DC5A5BA870497934DA0B88C03807A21D87B8EB9E0D7A61D54046660C4C93467A25B06901B297975884B59D318F1676D52620763077FD2C4ADA01A6949936B0DB6538E2B110C7C0BCAE3B45B05B74AAC263EC2FBA5D1F130B5BC22D50164CE72F3BFEB71EDFC2A8BE6BA3AD280A7A828E7CCFF8D99B95E8CCAD000E91671D05F7948B43FA7EEAFC41AF4BD9B11AE951C746FCE2C6B2CDBC05DD8322424E9AC2C857B5204686FFF33131C05F81645727E6DE9B2229C0E527CB6A05F2679D2B9860042E188D3DC014748070A72AB9F4C369ECC16F2F4FB46722CACF6A12E969269A0743C0417330D612E4D6C5 +keygen_sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 +sig_signature: 1C3B7FB47134FC1211A4F8FA16D8F84D642DB8182BBF70D549362A3182E2D313885BE701B5FBA7B2A7EE0B19B04A8F4E1D4B689028B10EB196297F56E75A5D037C89B141FC1CB41436159E014D096B8BDD86CD0946F4D51A02950FAAE06AA28B608F86A3AFE6A423DAB187CAB362176E44C7CF5C33E872D67126D4F7C442EBF493B685C5CEB7DE5C070E2D0656E16455D2A69A750EC29B50196ACA08DA2BA2D4048649FFF5E2923623561456897543BD1CCFEDBF854ACD1B4334C49C67DAA0456B1089B95D83CA8CBFDC1012ED3253AE6A97FEB8E8185D7A5A034F9B6F17ABFEA994AB6BA519FCF7632284056BFC41B69E7763A644D51D5936B235D8797A38657644AD0CDF1FDD05A0F7F36841ABC2BAB1EF0091B9A50B23DC37ADEA38D8791EE9C4728C612FADD4092A2EFEA38AECD6FEA2827F7D32856C6D1D43B0D30DA9DB79F192AD3F5AACF71CFD814E41D325D8D843D0F8252FDCA1279FC4A286063A69305F1342A46148D39580D290B22609B1B5499F1A5A698F62C1B0C1085A08E285E269EC4348494A188FE0F7C761A8C2D33D74831DF8969AD5464B658E9F059C70DC50F4D9FAA4119C69526446D59A46A0482C6ADF363E03887B320CD7502136712806E02067F4D4C2637EDF8F77148F6DB7EAD6EF797D7BDFDFC3438570B7FD144A4646D5FDA70C55352FD4789670F57156A3FAF6BFEEE142633C626E783BCB97AF8350833B159ECF162512CD5851F91332B8477E82D14174F6E52585B5EEC943AE99044FDE73E7D8035FC19D56DE56560DD541AF03999B415A927FC3036D80B4D2C64D03BCE42B7CE8D9863443D0600060DE7DECFF046626095F44A7BFC258DF7CD0C7570F5E06A158A6100CA60CDFB3C6C84029F3CFD1A1F7D355A537EF2F5A8C6FA5D1D8ED7D2FFE100EE943B8E20215F4DB23D5CCF782796BBE524A9A83904B4CB0F74FDAE0444B6D19D91114FC5C8A186EFF80880F7840E53788D334965EFB504695C6E9FECD2CAC50A3ADA9B2150BD88CACD80759066ABCE3868529F475A915D1341062A32C9D7713C8D8B76E9081EE715DE298E6A28EFACCE23B1916667396C4B0DFA3E12D11A5947B38D67B0BEFD14244B4C847FDB72226B3DB2C7AF3FBC5468768DD7849FDF20DEC9E8101A68F9304CABDA527799EDC0F994DE669B1A57E6E1D8D60893FE37157D72B0430530E362EF790CADADD5750FF38A146DB00B7553A2357FDC5E7454068B7694FAEED62454E5CFAEF69024783B5173D5BB761CDA8986A874F02098D93EC135B03164C2219FB39E5712408679147FF71F06B9C5720AFD40AD2561CC88354997066366A464454924B49DB8703EC24F807C5078FF68D9510587B2DB6BC82A6D597C9E2941E92444A7E3B85AA4766605E4C3D726589B35E2CD5DA4EC4288C615D1CF3582EBD5E63C2BBC60F7E34849DBDF734FBA6D4D8F4EF8121DAFD049AF1AAAABE4769FB9CC591D2206051BDCB9C102141E540BE5A4E4242FED93E96F620A02CF02A07E12A5AD8F3C7B6312198AEF2507D065D3614830F5C5441F9C53238EA649366A0EEA00350FA7414C7544FAD497EBD92D512E5CDCBF8C953724935D97C0E1A3079D45A40A54EDD9910E52F88175D0E4FEEFA0EA779404A24AAE32979F0AF3EBADB745B51B09FEC972145AE3EA4E485428EEB4C610120F29E9D94B3E4BB9B468582DAD685CDE5B5A900204C16863C21E1B5059487D772955CC1A74917FF8C05FDF4BBB8CC54CA2D59BD052B23D5ED7AE1A0671AC9713C43D1D7ED55087CE75245B496CA21011C08649471304420DB1142C2733FA0CC8E00AC670514882918A0B93E6969B0FE214B63E0A2F2A9C092E25D5E6870CD9BD98EAAFEC1ED886F64C9798834CABFA10DC8F45A86E89A0CDC301620A6202BED8C6B8F28BDA260DE8FD6CF502EFFF40F88E1F44786C2A062BDE1E44B237BF8BF5206E7890591A9E09B6AE196511CA444717E6A76A005A55F5866F010D79110A8F98217BAC2A2055883392ECE9E5B5F423F6EE28FE1F88370DCEDE6B3EFFD93A427F31AE8AECD8FBA6559ECC8E23C595147AF5DEE50E4C938B6D3D19E02181260800D5A12DD883F186C94061068E3BBC1D7366259664ACBCE927587A20F4BD80A67F72BDF405DD5E4F04679D916D5BA984CA51461EB33E0626CBA8FA7FDD6B3DBE15B21B776B18F6C7B82328486CC2644E9C6040B6F8DD97772D06944B7DA8B86E3876C2FF14C5E995D61F19FECCDFD79BCBC159986003C77961DE9487FDEFF065D22C639417C10DA0ACA253B9025663E54135DE4AFA0DB7A0D5AD1189D94DF24D6A71CD5A7858D48C242A7A7E3AEA8D67174B444791E2F43A4A081A99F9AEE0CC2859C0855326E2036B1FDB89D8CCF00AF787B459AA6049BC67FB54D82243E4F58CEE58E9255DEA3D5C2254378AFEB290FE78630A9065937873498B350526943DE231F5384EA83E98E2317E013C487D57EC50D1C850F83B272437BE365CA11F1C94C36F6A36DD99418287D0573440447AE18F6327AB2CF8F81CF93AFB3D09F6D814BF007740307BF22A54FA24B3D9155C95735B22FBD66B6A63DF6771904EA8DA54B2D4BA8477534065BB20B5653015BB67EE514EF0EF4EE07458B4196884C1132927540C3EB78C76E795F433EC0B43D544FB6F28006E9E49C79FDB9181AD5761E111346657E89BE1E2F89A3972C20101BA1F7F63C92FB9F299597AAAAD2C6108BC5D314927D4EC1D395F1B3BA859453A7E292CA8F0D50EC63A53A9E40248CF779CCDDB1A17710F98041FA9DC793E0EC53AC6CEC4286B891AFBD6D41D67AA630DF94818E56AC934FB14EE8C43C2B3893D01A08BD85CC69230FF416BA50CAFD3FD7BCE3E7A16379CD0F7E5AECD4B39B856D4720E8A0410376DAA35ACEF23A13043DEFD5EFB8FB210994B62E8088294D2C7497F942ACF47F1A1019D9F12041BF3AD086115282C1989DF5A60267647E8747BAA2F27BC8A48DD730199831F5AA61B954F01117141CB75E37C4EFA3377A86B8AB916874F348C9987E590D91B908E04387B7B654A6103D2E6DE8647F3953F0D4B9E977FAFC3F1087EE529E31C545994D79FA3DED540185A8FB1CC87ABD5D570959B061C23B3D98628A53E9C6D5462AB3E53E773202B38370EA2742E45161400A5FBB8C86C1EC5F55B30CE923ACD4EDAD4913527D1C9DF4426A851101899B0A255B6688D0A7134978139C56B5D25B8CC389DD3972E38260521FE85BB9FC0F319AE57D18D1CDE432C7F34C1BFBC38A759882132B0CE158023DA883298051E51743390CCA45F525DEE3C6430948C906876664EC00A259B70E1D0AB9CBD416950653BD507CC0BE87CA531ADE170917F4856CD4EAEE9E040EFF1FC4525F38C6C032C03DB831AB978BFA048FA8D38F5213A987E5780AAB8D989516FD7AC235A9B4C17A7531FBC22492034969D2ABB1182029804F1C6F40F9B0F39A980E6506920A6EE84847F46904EDF22A1C78DA1BE49DA78D681F049D123DB37798B189905EA20583E4FADE7B153ECFE3228D0ED92927B2E50AA74604A9759232B546C4DA752C66B0616790CA1AE90FBE40E25B2B5C9B5E261BECAB2F7B9E4F1541F5023631DDA694B12DA8567D7B62B755768F76CE749DC95541D49BE856121050C6BBC59AF3EF47B2F892F7FD01E4F192756E5AE1EE01F17E8A96B2915EA1C40C02466214D38E7F8AE8749CC9C00F7EE6DACC3C26831435F3913372AE00EAB2398A44A12DABB865CC5F6C345190A1DBC2BFE8497B3FF1460F49F04A9086A8250931B239322C18A08C28175A6B32FCF602F62A1C7D2317C2B83782A293594E4A02DADE59FDCA0EF3F256EF254485957FE5B0BF0452B40616FCFB7836138C9EF26109D9CE08E99421CCC07B0B57C90D51583C4DE64D8443359C96BE5C94CE11F536694FAE8463B6D04DCDA912B7330CA4664D179E824DD6BC6377DFBE1EFBBDC2F9C5497B49343BC6439F88C9CB041038971057826845BD39EBC8C7735AC7C062DD7EB67E20D7391726C998543470153D841026F53805216DB0C4D90B4BE069956569F00D416B9CAEE4BFC1BC515C20CD7FB2DC1DC58832A5D2EB50348A86927D78D48632D4C69C58D58FD39C449F1E06D1D41EA1A01FE0F28C68188C85CD76A56E3928A3BA2E2A028DC6F445C446123D69CADABAAC9698C3DF1F2102D1FC318D6E0D069D8BC31E73588D3999BA04B5A6DA47F62E7C707179771E0A8C4982A858DBAA9A4A65675E098B644468A0A3C8CB4248ECF871A3BF828874BEA55BF181BB265444AF1C77166EC6CB47FBB39D21A8110FD6E6458582C6FCE348475619618540E4535CD27C195FCD21439FAEE1268BC52EC6DB9AEF6AC082CEFC1BA389D8AFBF071987D53A39ACF5599F2E06F7887EB63A312CE4C3D07701CA62ED2D486F64860BB32CF227929F9737D6C80354D33407A98DBF303C1E87698F18FE626D8A702F6AC095EDE418CE6A88144AC74CBB5740FA53A6FC3EBD3E27C6C68F04914789AB5BC1241609F0E9FCBE0360FDB809528F7457625D137237045FC46DB5CA5A28088ACAD2CC8D9A1EB90A1F271ECCCBCDD4196619E1A3E911BBCA9430A2AC60E529351A74EED7B4EC0CCF6FADA40A4D918C54330DFC85FAAE4F5D872D02C0B3E074A9958E8EBF433A8BBB08466C90B1D1CCA2E194277F22D3265F624786ABC21FD893422313D7AC4FE43866A6768652533A6140CA1F382FE556EABF7C53BE4B72C7F3821B26AE6CAE3CDDF595CD0F77A99C2360F98A9092780D4635311A286FB16A2429155BC57A03CAFBD1EB23EF574E9C93DDB8C11A811BA4CB025583DD53F7B8ABD9B4813177894798C9E9F5E2289855E586046727BE7D8C388F6443B0739AC2410EF8B980FC01A2F4AA0A2065D89DCA877C263A2CFF9F384A0750CE58757120D45BAF7522EB532EB7F5FDCF3111DE2291396EC9403618BA4C993898815E36CF07BCCFA857867AF949888118B3C603A76C0AA25B349CADF9BC29F7DE9DE518B6A1B5122ECE31EBEDD5EEA10F4A9A80B3949374DEE28D5793258AC1C73495B91695ADF6512B8937522530D60B74CEB0FE97D16DD642E094E51F18C875420ECF75FF23A544435363046B2C74B89EE4B13231B0C674A74F3104E0A159392836A7BD696E75C1173F20D525976AA1D68E21288EF072B3BA58574FE08AFD0B8F5407ED7CFB2831D44C5BD55ABA143AC446D5D2A906F0EF89A68E231D8BB2670AEF18CB47C45A632073715A6143B0759A24C9C97A29D8F8CD69473795096115118E1847329BF98A4DE168658FCBA2CEC9CA8BAC487B9F155EBBAEF2DA4DFA5DA707CDDC00215F8EDF7308F8FA12A722963573594281D528696DC9E36BA464D107031D973E84DFD1415485BF0E800A56080B040BD58EB40EED553833B3BEB8BA9E5F9F815C01C378A8E9FD009558F707078BB3E08C4350DC0BEE5F4AB3665D2A71E70531B3DBAA65CE945C163D3AE88DFF91AB2646D5354191BC01F405984528D4CFFB69A8C86A25DEFD81B40EC75832F0A02FBDC1628E3BBDE95D83A5FE6B0893FAC48E62BA3A2E920B99BD0FFB0355A3F3E86B466D561214892F7B6BBC15AF8B71E279278FE563C8B7B9AA331931C9F2C557E2620AD4ED6FC21166CC90BE76029588677FE706AC280F0070A27606F956530F40BEC2626407AEA8CA7F3330F45D1AB52E6F1673FA6EADF812BA5FA55BF9DC67BFA84E22CFF9615917B6CEA9893A193751CD917B438BD1BD48B4BA1E9F1AFA6436F5625A89122B28066EDAD6284D07B123C29017DEC63482976ACB6CFE7340B2CAB9098919C63E1477EEA8958F318D106F97AAF17D18A3E4D8CA72FDFA8593F4F568174A3ED97ED7D7023D0B80660A0EDDF5DA2534AC8825FFEDF9412EB33E4E0DFDF71865C4C0A0049DA2D77A80C1C2CB1E07C1816849D12131D8170AF08FFB8CA0D0FC69099305E35DF7259606F5B31FB9C43EEEF984ACFFC7DD5944EAC643B6FFBE7051CDE6A67A3BD8B617611B2D759EBD34CA9BF12DFE45DB2B95F3AB65BB5226AF7975ED4B352EFFB9E833020085660B951541F39CDB43A7C7A6AFFBD0600764BF3B03C400FF1B55B6D27B626DA06F7EA130910F64076538DC05949B20D7AF51CCF4E0FC688439DCAECB5BF76556D89610E03D0E138088B9CD6F1C8C5B81EE3AE7CF1751BB2B393DFC086ECE19FBA8920E8250FAC575907133D7DCD9084F2B63AC5AA9F770E885CD6E401763E1CAD8912F3C709DD8866853ADC149A85BB2926FB17FA4DFF9B1D6EB8DC84C5424D0F4A54E99C11EEB2830505ED3BAC853E7AD8C377E849110189E5746E8A8677E0A8A399BB35487EF22658CDAC854BDE55325D24DC1385517676DE8102D2B2AD79C4FA3C3AFEBFDEC78FD0950A76E2C0BD3C3C369AA967EB2E622DDF94B348502632C4230A36DBECCBA333A8CAC5E5283A3C12587182248535F686D70D9082F37383D505D768BC4DB030D346797B0B4E932365365AAADB1F0385796B2CA2451626B737786D3DDEA1A5CDD114EA1ADBCF400000000000000000000000000000009141C242933363C diff --git a/tests/PQC Intermediate Values/ML-KEM-1024.txt b/tests/PQC Intermediate Values/ML-KEM-1024.txt new file mode 100644 index 000000000..c605073df --- /dev/null +++ b/tests/PQC Intermediate Values/ML-KEM-1024.txt @@ -0,0 +1,12 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +keygen_z: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C +keygen_d: 7AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C +encaps_m: 034FF14A56249C2521D4279EBA3D04931CC892BBC45002B5B33D9F0188ACBAF6 +encaps_ek: 27669A667667B8D5466858602260115B6209BC2C45DF7A4E64932B75C78B9F7083F131BCD4E20EFF8CCF69736BDBC88406F9B69AD3CE356A0F5E676DD0A7C4ABB1A1C9D62021BB384A4014FB04CD2F821890D90427C49F4A628ECEC2731FAC025237360D582CD06647B1109AA6C2AC5D433758C1CAA53555FFF577EBB521FBE32D10F790604C53C2F82C17B08EF3625674214844906DB3FB9520031422A13BD7612D4201C27D15B9D194830CC3669BB8BA34C2523764413971C40D84AEE65675D5215309DA8367F001497546ECE07CBF002D781B830682484080AD6F9558B36B6BF610917130B7419B39F85029621264CF2C8AE4D808387B20CC5AA0B969C39BC80E6CB9CA0351A3F60ACEAF12BD41FA0996E39906A9B61697B747C2031C760288364457425BBBB40F4898AD085876608A77A5EB9D124BC9922651B76395881558CAD06F3C4BCF08E45B67BA516038A364B7740E9740EE2B93C5C65F49020AD42B3C0AEA5BF242A4F1B089B5A3458BE8A371CA1F293C53F2780ECE281293D991E6E579042BABC169724F10681FD1C7D2FB1648B0BF80818A7DD3B709734D38972E3E44875AF0927A9AADE82613FCA05EE5B3210647A5632AA170D09E70B56A2F04337A337EE952383A1A8AEEA6CDB90CCD86A818D1BB39465BA313D266BBB10581FA187D926AC3A8B749F64445FAB56C9927555793FB4ACFB039B1AA543B1B87AE6A49AB562933C4C97BD74C07BF29851A469851A982595596FE7ACAE0DB23533028AA34676F7A9B29263E7AA27900104B1BA1B5674739B2FC4ED8A330BBA5A0B6247C63F1153DA01DC8F616F10483A693A634C1BA6AE1AB2F163400BB5771E70171FCB54155ABFCB2044FCB30BAD67F742183861819EDB1AA6C771FC8E11A92E08B71F40D036C15D2896A204725BA90A03B478D98C49084382F1D223FE12980E947A415E55FE67B85DA40441342445B46C2FC42020D04769A2A1C64641F0C36636BA6C4652B267A4B9219E333A06817B5817B6E6CC485E352614169ABC20E1891B7A000C52AF15A7B904C976C1BFD3A2377EB76B55033C7C4C69E7174AAF27715756316CACCCE63A5A22435C7D1020443AA71693BF062303D13331F795424C20D266C1D90305FC8C2536684A93D506DE6329B6162405999BD5CAA7DDB9613C8238CC6D335A1EB4082E7710D079F87A4BFF6478B5F0C587786AF427192D9A34A4FA33BF0D3CC58FB463B4838CA2C337E65397DA15690C52AC0E5468BDC03DF5A62F7020934E267E0F7CF95599435F952FAB74CFEB4308B173F12E073F7F040DB4C63C1C48A7B7A41F4779A6B57A922C970771180008493D4C76805400B7C664D0B92B22C49551B1247E62C85E1E540C82093371013C4676CEAD77C5F3064A37349C7165EB3AA7DEF8731E9D66A56368F195C045B2A50E59786161A630D280089801298C130E4483150CA9152C2A0F247750C062259B84C28236C3FB54625D5CDBECC68DBA22FB1558055FB9B243501C75851E76ABE4847B9B972A73411A6B4282BF5983A82DA7413E54BA35BAB37A9B3C62884B643C134165C9870C6BB390F6B7A1E5745158FB251D6909433551FEBD30BA575A1E2F10958498D9F147ED9531322A16097F55D811795457912912B1C65F38025429B3E764A2E1ABC4E30C288082742995590981C43DBB365966BCB9720B178C5EB963B82934C02814B7525546DB7C96D65822E4942E4A4AC13C99490E7AB4A702371F21316A57906B19258428801192567C2045BF8775CF58C5DB28BA1B05E042A1859E64286B5B114F39FCACC127BE63DFF590BC184B83B168C30199890374100E40D2FC7752B1430355022F3D58925D1991BF3B98A90395F8579646C8413BAB3C0C0707A238A27D09FA57A32FF85392FD08C2F2286ABDB2B6936B9D3503802C6B51E415B81673CC78054F1B2C4BDFA733E5264C55A7C4DA5B73944402462033D08AE620BD05644B477AB315E936D3F25B5BA7AC19EB559A5C1195F568B313C2675092E6DF58FF399C42CAB6363AA033691CB8CE06699E701F2B92597CB8FC23516E9F40CE75B7BC1E0520A5A3895EB7D8D474009A0CB0ADC2DF476B5164112C3B600B6776DAB49B20381A4014691652A3C3161AAC6616CFAA265638C6C665A8454F36780B789CFA35D2AF49E6D5F482BFA3C864B0EF29E18D2EFFF92DB1876A22076AB1AAC0A7393ED9E5A48 +encaps_K: 46C200F3F6EE8E11D47653801E3482241CB783B9D794EB116A4BDA085AEB6BB7 +decaps_dk: 0FEA26C4A544A514444A971B5C5A825827C09D42469E59344CF2AC06A28D33E9A012CAA3717B2C3B290A0715821109C4CCEAC49F341DADD377D42A37261916AC7BB9E41C096CA8181CF58350573F605684A1BCA53D88257453C535165C4ED72A9FF05645712901F66C10D04F5EB4A2EC3772E9498E9DC44BBDAB71BBDBBCFC85B801363089EA60EFE586E1E2180C38B2E7B4A63ED607490BC5BA7A58AC3B1C0E43967200C7980290EBF411828439EE8C8E6129B258E13D127CB15A00CB7B468D4023B5097B9B2E509B50E890B63B4707487961A29E18656DD2D09E6A3B8843E2843CB4854F18116E717DDB0355A75135B2026A752C8E7FF18E0F4A391CA37F5B2BCC88C999B4E47750C46547EC076AC21530722CFAF9679961C98688C3562B17CC808146A12572C9B5FF151AAB54410901840E26423987C5E0D28EF2EA53EAE5951E62AC7BD518B9830A4DBCCE6A936591EA8EF275078A0973852A4D130495D00B3F21851599901CFDF9368344C810422FFEA08AEDCB1A7FD3625F26B034812FA307AB2C20945465546D31A341A4013D8189B4F50FE860A668DAC7B103441E961FCEB0C5B1F34DF2E598C6D8CF60B864150C703D2BBEAC9B001AA2108147AE6B8AAE2C7791DBE956C1F9B2047A1576094387064C3A801B0D89C996A5CFA3B012C14438B9F3530C0C5FA9389F10FB3EF1E2013338415F7B1DB411ADF91C73B6456B68AB7CFC7BC929E44E58EB34CA10AE31F03B2C3BA6CCA27EB35CB1379A130AAC87E3B875CFE253AF03C4BD783F18C5A2F8492BBF7C56875598B1B63FE6CB0694D0480CA1C8F8867C11B8BF33A32C20B79F9CA486858610B19783BEF784BF6B0F858C1A791130DA6957F212234EC98679814BE839BF110B45C1C883ECDC3DB3F822A4F7C125566ED1663568C8413CD01C22467AD5201A0ADC763435A2CB05CDC47072A94370F5B434F75C078B415993E854DDE17BBF86C0C6C9A3248532D9C2139EF3C75A9BC693781060DCAE2FFA58D9CC548F19C1CE5364880C7FB50CC7BE405312D6CC94037618F388C490AF8F61B9B4044CF75A5CD71A15853B5FD6224C6B9590E58501D2814200C919F283CC2B49AD8BFA5BAAA2977F03823F609EFB2426F936C30287097BD6B7BDC67862858883DB5954080429B9CD02CA96BC1CCBDB5121DFF805B0824AEE999E2BBB2D82353E6D3A300792781058C56EF7098AB3584EA0621E20337D3A975D93CF32586D6A71A2C4BBB202B853FF09C407B43B1C19B1C4CCB821482DDD27378177AA7F6178497C3FBA797153848C5D0B1F40B54E9D5193904A303F725F0CCC66C6CCB158850605346DB42B877DD9CEA5F69C12B221C7EC5100F76587B9834BC0C641538F83E85BB3090DBAFBCB0B7118FF7C97E95263157041F8AC4052D0403500CC4F689455974CEB5B076790A050E0B3F6772A7767541FF6B67B2A1D5407820647688F360A2B01473767712909B227658BE6457848C440757168061888589CB05A999E55496791B11AF2066BB8CA746051C4680A0BC07382412AB8B8A319DBC794DDC694BFDB813F80B58B72218DD64DFCDBA1AB48A94F7A8DCA9266CD15A42D9BA5FB6767A955526C050DE2598B112A2B103AA2D1F0606FE68A55191EF53B302F7C1922C301CEEA989A62134090A86076776FA44627B7316386576A678175B218E6F482B52BC6027BBEB34698B9802FD67634C1A94DD4C5CD49EC6E2D665F727781D1EC10AAF66AD8279B9BF24C99E875EC94352D9605FA30CB3D8B2686B03971A760B3053B34346D0D71B44D8B7D2EA61A5C10A933D38BA48336711174546147D44B2914F85689D9C1BF0037C7F7377CD930CFF60F84B0A2005D3EFE55C7311B1B6132768B5290D836B82BC443C32B4FEC960219DB2132F7990AD684A3729F3D1A2CEA3A1FE4B12675C489EF33198F01A106806EFCE8921DC46E971C0A0A564AF9E56CA727A7641C568C95AA5956910B288429F80EE7226E9DC4067E34944F06926D44B2CF8764F713593B4429F82B8FCC607798916B815B9098330EC334290DB8C04B083DF3CA10CE3575073028E994A25BE72878492FE1B696BA5CB1A773193A3B28A4F440AE582DC7C24FE7451D6676232BB961C5040C9E5201AAF3CD4DE40AD5A9578AF52810B593E9815E23F63F564061A48407213AA1B0908F4B174F86D573FA04386498BE68398E8D720D278111D8B17303602A96E35F56FB25173C4F4A03CA2AC9BF79DCAB764BCE4410401E1013E6528CCC5113358577DA8375E02343108C2924D2551E5CC5A1B04DEF88324D854FC92C4ADF7C2301337E4520BFC365566F66092E367AE60612744653C1EB47F0820951A2A14C425909340D8727188EAA08E48678984876D0008DAE99015B3663FDCB725741530BC3895B11620CE3B417A320E18813B99C235AC06F55600F983882BFF00236107B5042545B6B775868AEFB79B595596902C69B9ECA3D358C61FEE036D218AC43BA3F52C06A8F881A7ED70386142CBAC5CC04FCC31E16277651CE2DCC5014F6BA5A915C1338834EF474B6715913BC7A4E593C688766ADD70698B37E06E53915F385388C25C4265E1CB44FE3D019D121AE4C32434F37B0A4CB69C7CC95707350C3493D0FB11CD4D09F29DC56C07BC8EB0BD0082B41442145663C21AB433467B95EC2478423C18BF2EC703EFBA28CDABD42B7B833150D6DA25EB00A8328902E2D089B55D69AAD9A94D818264C54B04D614D147A30ABFC03D9929D96BA7F81865DA353C454BA7AA7881AB974C1B8F0831E79C4418664E953A54DE93213697281341D37F508E8CBAE3D8185054567DEFC8E3BBCAA4247907C483B8F1B84B324C1A7CA8442DB6B7B128C8313BE1FE25791209B864A3E1A618D56D710D6F3BF559510167C464C6B9B8BC490B8E03925D03D0EEB5D78179428BB80D3FB148840709C41147A686FC9BCBDCDF7C7EA7C30FB640FF05B7539ABAB70892908E93CC9C347F8AC889E56468A135B99754738E15F4E677DF375BF1B43606A2C47380B10A0C14C28583C83311A2854B2A9931FD66086C10749F334577FD70B51B95060075199319B3F7CB5B237302C370A23175E4E013C56281BAFE2BE9F825A3066AB8BBA5793E21E7A48978CF60C091B1F80C0C23814A30F7760601ACEABB1215200940FFA152272096D458D00DD039F236B2727B588C62204E79C451681DFE410EEC42B74945AEC0313A391942AE1B122174DBE59AB1E390CD64941436C75A9323C69A641880870FBB280B3B37B3BD982B82955620B0783B82E8961A4043BC7F66C0EF25A5ED15326F8816E5EA4167EE8BF6666451D315B2C751441172C278300268261C78C6F0C46562779B3A1196F87835F79FCB7E0CBA15336CC83E156C5022887A80986B49C1B576594A23142624ABF524822418C6101905262806572494D3753C06281E7F17E0D796CD7767FDCE901FE1712A00A3D36EB423E29868846932A9431B8CA660FC1975E23A75B4A51DE1069D3A59F6EEB2A5CE72A8916B5E863476E6AC572929F2C29BC5627BA994163CED35AB7031C00490724555ACDE613AEB4C3E99981C62B5DC6A9B35BA79220243689E0594996857C045D67193D9E411B4FF39D0F8C3C0A70ADB72A7021E36D64FB294D932B24E1A2BC0BC41C4AA3B5EC3CF0E672DE140F484733FD82BF082934B540A635C44898E8AB8E0645705AA581718B4132C427927FAE75BF9616A5424C2020EBC5CFC1BC0ED1653AE5005A1754181620B7F06D716313033BB72A40647ADB2E667370F2C74FDB94420DA48DD1379DBA59AA22F857E231C5C083290066C548761BDF385F2F85817B212066D39F03B77F8EF41219E4BFB9C12E4FC98800571D223AA92A32C7A3C2A7CF9C995AE0A7B59391FE9A4F0D633BFB798C34B72BBA6A9F16C4132E88B570758BD551C91BD2ADEB53A72AC6AA03689DD64B035709A8AF468543CB1736DBC9C72B529E70596D18B19CA68E617A147C189D283A77688CAF94DA5A0E9B63181A40BBE7BD4168A24D274319A993BCEA8ABF505FE862129692B5BDE849F36AC92F7171E53859313604EAC10BE2786FF385B9C718154818772FA7B899C04EFD18A8019A79B6F64D5B9A2C55E784CB47CA294856689AA6A70CC27B6C20D4D1C729C409D0B925C40C30C0777815077749488B8DF0390695ABDB048C7CE1853602A54D153CF2A51617847B11E63C4C761966D5AD93350DBADA4A15C124BD808871993FC775B6E410C386590F730A8EC9475EEE915039E91B6FE425B90668C6AC5258B7AF103B9F5E230B719BBB09871DC1621517BA2A839C96AAA6440A875EAC90B298D61BD3F3AC89B405DB394232686A2BE0F3C75F15E64E61F070791EB4BB97B7019825F117C7D73A12FD3DCC22D581B0E41B786374A461EA0D88DAA89B659F0DC82443423515B633B005C958EC26561B6DB818F4B8CB2E28990E748417587FEC38A1284BBB4FF9E478 +decaps_c: 61FF1A8B6117EF118328E88B3227993014DCD075B8A1A7F9801893EEE6405BB960B6B7F6A1A27518A3409139A48B859681CC758F2BCC3EEFB04394A375A5CD71316490938ABFD194B20BCD31B3980261C9ED69BF9B1D7D7659A8040DB1E25D2BA6F703486624B73CACDCA27DB0F7E2408C9448E38873280F5E9950D7CCE252A647580C19904FAD62AEC300BC8E38F05948B63BAD5CE7C90E40C4BC65117761F5F8868F8025D6CEB2C5DF60DE38C3232922087EFCF2CD95DE5E87B6888B88C86CC78315585B2CC688A71B477BFA388DC2334DFA8AA95503D5397E2AE0352903EA6A0AE8B649A914B3525FE58F564BF19CC09F54E105D19BD81054E57001F70BBDD7719449687E9A53B16CA5366A19105A8BA08589AD08DF1300EF4F923BA9E762A82FB09B76E125F2F274D617BF30EAB465ECF24D3707AD300D9AFC1CF1DC40EE7D4EEA6D150E6F0A31DB9F8F92BA8EEEB35D7445589B046BA79EFE231106CF0A75712AB392724C53EFF9F5733BEE0D6A44D0B6F515D0F5E40B1B1E17E67AED3C81D00AC468A28F8453D4B0DA809E57D823F28D61ED0B59A08C622972D99179DA8636C45F1CE8F6252AC86D91B5E92997014E3F5089E68BC52CED5DAE6D5B175FE2D61928465059724C835902D7612CDB69CDAC664FC1C9CB11203A8C7B71486E97B7D1BC6A98F493DCBEC8E629558ED361091293D1B5D2096CEB9FC7AFEE71DB7CCFE482B68A196429FF04D15903E7A75C7BB5F622C36971694559FF07DFAA79E41C362B22643CD39BD9E1D3D6C2A306B5F1102C266EEE67DCDACF36697A836F203838EC110308C90A3D01570CB3668ABA50340E40F54CFA6A9E8862532F5F19848AA11FD34FC86B7FCB1637F4E5A1D03AFCE44124E4E460B84C63496ADED55801DF2517A90AB061C8E63AB6B14BE1694D6F389DD85F5639C5783AFCA0146E6A1EB0C40563C137010DB60BBC3D6374D6F3A892DEBC064701C64BECCB8E2C33B740CC7ED49D108A8C4656818DF5F7D91EAAA446AC6CCDE30C6D3D1BF66E4E3B7B6B81E3CB17227F80DB0096E6BE7D859C09713749FCA21530FE1A716EBE325504319BD0EA2A7D7713607CB679B0A0B2268D493B67C0481872177FFD2593F3ACF691CEE99A36ECA722579EFAA59ACC59EF8CEA9108E620B06056C19D3C1EB91E8634DE4957706DFA8F9D0A9E0CD4094F6B95A83F118A513EBFE5E99AEB88A268E0097FCC3C7AE250B681933BBC2A8F5381F94D156434A87E9EE37E78C27A0CDAEEA9814BCB43DF538DBE628C802C1A94E0CDDCD0CD5A0F8220DA97C2383936A33919FCDC11D70ED4437DD2D7C73CD0C3BB90CA7070228FE8D64A1C9D56E6B34830EF300B5AA6EC6C78A5425AE6F7AD0EFDD527CF0AF8E09B56E495BE66F665C64B0A42C5C4B24680480AD2E5C11D991F7E3DA759AEC802F176DDF11EF71469DC13B3A3E03699519858AC6FC65C27FA4CEFDA09C82E8F958E018DD5255CA2F628E0DA7391ABED6D37705528AB22EC71DC8836D7FD4645944703A51CC74D297092FCE139E8976F8BE9C5F86390B74D401A8C8153112201133D0C517C6CE7A38C086069CE3971F1AD28F3E5D01B56A480B417A016AEA46394CDF764812918D8AB0501D5D18CE13FBD3DE91F504215CCD0E2D17B7E963C867F6F132114E36459FC5AF7CEE99B789673E524131F7DC71360951A997A9CE50DD5FAFC4521144441C06BB41C79E8ED53285D137D54F325A6C2F2EF74E34C0F877A614CE45DC0AEDDF95A0E2E4EDAE29AF411C9CC2AF95C9EA9A94A7961C8246E654FA28F3D568D5FEE93352C2E0D60CCAF5B00090AB6E7A53AA06A8CD3737EBF1B65D625BCF220F74DE22D9871EFC376BF082D4B872A303C32427A0C98BECF58959C9F9E2E887DBC42AAB1656AD15637A6A8F4BF9634095491F8C99242913891437E6C5B50A213DDE80D2196BE12C3937FE3239BF6759ABB8C1C9466F42FBD53894AE52FB533321429FCE4FEC1DB352C49583A7D817EAF62000888ECB0EBFFEF69FF8E590CFA25BEAB21605B635ABC2CA23680789725CF700F553C88352F31616154873D18B6C6EB519FC639B070FD67F86AAB62349DBFFA89F93051A7C7B7BD161FCD73672CEEF59A9BB7F571EABE2570C5BF31ECAA1F9CA7A9C6D31EA5FB7C979CDD2613897E7D1503FB0C19ADDCFB3A63E2185FC4101838DA66CCE2D3D9FFB47746C2003EDD86C2F8C3 +decaps_KPrime: C61F73D2BFB18594E1BA5D3B58B4C934206D3A6F8EC91395AB7779C61FA1DD6F +keygen_ek: 70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271B +keygen_dk: 8AD0B5F09A25AA935DD9DA34AB82CA75A12D66E99CF48BCA45B9B2DB441BC2971BDC9922B5F8BC3C0678546759073CB88E26BAD1B1B3A4646A6529C632EAA347734A3BE583D47178094C4A670CBC41EC0689765668542E6F15A7D586C9E26A6A03C71469C2C53F7B141B232D86216A25C7A8F36852858C07A9524EE17BA6340AA2A215C1EA852167B6891CC166C2FA13A0270A22983413E0ACC444BF40E28C45E14E07404F62996369597F10FCC180ECACAD1A6719AB9F1B447AE19A2CB02A7D04206172168C4F0A99BAFA932D6649E894A8F0577B81C66483C5B5CF60AE75A444526A9B3674325FBA38F53296421A785011C1DDB3A6997745DB83CD583C0C4177C797D40A4F699F1F40C5413AC4E42373492B6A2C6A406D437F42570B5E949EF4350DEA790CFEB72D1287517FE3273D3CA65A13CA6E23C57BF07DA04B851CF3AFA18BAF5EF020792857A9E721F01B9FEA7B612E4C6E29079366B0228688BE2A067FBE92842DD280B3C74DFAB761E613A8604C476E15466685C695AC35791A9159942F60170CA214C7C09B1A4B1BCC4F4CC60DF01A101915A9A2BC553119665032DCD9476FBA7BB07157D33C9C8EFA6BD0AC38C1AC265FB51857D01517615326CA0E08650BA6FA40832C7B4C41B644716022B652B1927D55C9B37FE25F1AB67A9A03C7008C84B07C4926B6381E40CFD441041235187416CEC366CA6FB76FA0AB6E328A2641FC47DCD76E91CA9431E19BFF02CE6228C2336382F8A10E9EE2C8F1759390A20024A15B3B090C1390CA0343797284246BD8943507B7A6B71FC33A03B7A88366E4AFED515739E5C69F8A266E4A1F53D73930E9875569312B27037E5C7F852100C2BA3648B1B9C1B149F6250E0A6B065213134F302569755B8C5C4FFC680BF7811845340035F170B068BA67A4C3B0166D03CC8261840190A20F9A3B1EF465C2F2182DA8DA8D3B3C8CB12915F7D93E04D8840C3567255A7BD6D433CF1068D88452CFC11F991B7CE37927D6CAAE8810742F42148B896EC4EBB5340386315B2C1E2B43915C04549CC8C19AB40E3B7C311B426110A9BBB18D3B992A42C0189290BE673A397C4090443B88C5D5C565A10FEA05603D36244A4AA8E9255CF184AE69535A8399C1C6F76CF2342ADFEA6A447BB4501B9A6C44593EB043E7A5502F586CF3407DEB7A0FC32B3F46F1245C5596E0F1BED937207C4509E1D8985BE745FD69BF448092433028BE2595903311479586A34B2D49107410BC4BD2965317FC76352B638DF3B3A315325026809E3BC4608C0B2CB84DF0C95BC052707FC1A377B2B465EB7A5D644AB4278DDCE5B61E2BB3A71052555CB3BAC693EF025FF00353FB76945B8AA3E9950F9273818791CCAD56884658142A2B4DF3C57ECA13AD44B49B6346C63EE89078589E9EB9A9804A03BF7A276F86B9676C58D3E71D2C8770804A61592178B449C7955BBE8CF42F316725E3B16D55B527CFB232681B21B2CB2F30AC76015BB5416A0411C1745892412E683A98D736ED1A4CD980617D0821C2AB0282070A611A11D19701FBD55A2127B324E6901D84986C0464DE7120AF4510AF591DD9BB79479C5FA88714C6A99714F76A1E402C8F384A4EE6BCD41500724CC1793ABFD8D3C2F320397134B00F762DBA85A23AF155E6CC037380C1DD64A973DB35B74470448B24212062764787E5A93A48807171A7715CFC89BCBC9E141886F807A1F9D684C8426F0122887D9C4C27EA69CC151B4D49B51E5A4EAAA5AD06ABA86DF942E986A5D5792080FC480396B3948668FB382CC8FC154748CB30B7641F0270C83438B4FC3D1901265880405177BC7F44788251ABC474273531212A66279E70337A2309FDF49E059BBDAF4973A5377A4D517BA755702C37CC355685404C952FB67E0419C78D1584D0949254D04952F7243BF1402803C9FC737325881378CA77EEF5C415FB037D689A5854A1D24B6527A59B9B16959384358C423C79645CCF3133E21B4B64957B14F63F2AA26357B1C262F2A90F7CCC2A15936999B0A1B498AB3B32433032C9CA23081C55D31CAD36E90C1CE0B5FC247CE8C843F2883524B664FAC1B20BE602A10AAF65738680BB10254426F9CB09A1954DB7655622308FAEF505ACB497554A8FCFA96A85255AD846542013B8415951BDD45C01931EBE583E70E13F301517B5A40D70361F6309416067646D2B7136626BCCCC170C66CED490C735344B6277097CA914212A292DD122FBB69FDECA47FAB4532B8C80CEB77F9C543E0BF1536D1C0CAE077E2CA7862B45A410469CC5B706BAE0051CB2961DB7270B75B711698D2B807040D5628129436FBB58F1203F75561465F54257E44D33F512D633431D00A2FB0230C9BB9CDDFC83BD65C97445302186A17223AD21332803B909E5E5671970BBB0F1C4837BB84273BA675AC074C5290B411C2500657059339DE392F9CA308952A2201A588767ADC035BDF33024EA3B9A83C5A0B9C5425D14070C81AADA26BAC3FBB8D4B7CFEE0392375C68427351DFEC63609BBB50B463E04092857009D1E5B81D707D14B833CD4A0B551BAA13EC488A1503B0467EE4023C3FE032C78225063886E2468E00F700072A2EC8DA6AFB206C91904433BBCCB0E76F42468C40EB5F59CB9AE1B035E521510BF216A1ABCB19033B7A658897C65874D5135183149F979E553CCFBFA3900CDA6F01960B75157F5453AA6E73B3ED902F7D7C9305971BDF722E2937169A1BC0FAEB6C92F7150D2330877C5DC5249AAE20302634C5C5B23053521028122542F485A0EAC869223720633651F5B247C662B31A10538CA7491B1437AA74F4282D12974D9C934DF214785B6418468B92E52528C8447A1CA422FA6CC88E28B059F04B23597323F72F3E2336F87C47905CBA655BB73FC32E18D4B78705C782EBCB43E2785C82C5AF24B0E1699CFBC0257475799A539B11A50F4DF2B7FAA20BD8827515CA370F89C0D4C60902F6567CD60B0860A55BC8572C436C246AC276644E7D602AA57C0166201814991C1BD75C7C47C348B67D77613386908144EA83FF721F9A50076C510164D18E05D05D9884C44146A07CCACF890498ED1A19B2A15431729DC1F12B7EA10F9F928062D1454B4B9F68E59990290BE3728B3289569363AB1005131B2381A08CC2BF943E95D5B21BC6AABC2273348BC72BD093B7B5617AE87F602BB989E6AFC44B81512076A3A876E0E25F9762B462081985502F26B287A2936D5B1ACFFCEC4EEE77A9CBA980EB9B5FDE75539F650904677DBE29AB8BB918A3494803ECA59A2C32E5B5C83B0B80B1102CD7D9482B459B6B74491EC30C4BE77C2B524AF7B3AD1F71341DF0A76F255C2903C88208079379930A9513F390126E732A2BB094BFA6BF0A432BCD657DAFCB25C8BB15E0955D099B74FF1A4DE6559CD6797C38C48C1134CA2C979243F3152AF4BBE4D7A6BC09872133920CD23B3EF9848CCC6845D647B5387557736513D58560845192F9265159932E572A88C44E6566760C061C67FCB5BF210095E214DA745357E36996D8C066311BBC761A1FD25273D21EAB50010563CD6468A4EA836B6D64BD2BD76DBE3582D5736A605A5509FC28789B56B884AE9A60415F55674BE601576C7CEE58143BF054806ABCB345A256CBC454E343F3CC7ADE65562FD29EB259737BB3CF9649BDEA283FB07265677C9808D13119C0A2ADF745DE6975F4562CD61557B3965D2B072F000AA7E0A357E1253EAFEA7FDFCC92FA87630DD2276CE42E820B69D1FC2E47D5C498A55B3B29C34E64903D047AB1C04024958F701195F5D13EC6706B8448503A549922A58A24B67C93632756B77D225407316171DEEC56714435CF94CCF4599E00D10E569622BADA820C452F2542ADF08765CA93AE38EB025DE31CFF7974549A7825A831DD054E87B84C5F2547FF47B46F88C99F1548E933A6F4D87F1A4A1B00E39E02D60E51EB603C1C0D807ACDAB08BAA2B99869B75CA2C4B96368B51780BD1EC75B110B9FA66556876C5F48797D090138F754AE30533D36AA44B9B1702A6A8A56626BF0451A37A7AC1A337076E51E0A6B0300C2C790A4437EA28D7EC98C419B37D6AA970417435F91BEDC2B1F4BC8158A51B1F471516FE824287C896B891B49F254DD36359B89C824EB3F6248027FBBAD4CF29118CB50EBB625A37C537A0223F0EB7085B5C7EC607570DB9185D59902BC26C654A2804C0D946793D8A21482AC4F05E9016260331DCC58BC66AF3CA7585440216AA0263B2A725E080F6F9C5B6A9C9DA29355189B4B95B137D1225F252AC797B0646CAC52164B5972A99265D347FC7C3591D15FFE681C06D438CCEB60BB6310B7953289720E2C728730052337ACA7C8521AB44F1E2A049B83E0774C96CD8C876FA675D0923977271BE6E832F2498CA5A3431F40D3187B1ED965FDD6693B37F6EB408A99977AE496447AF65022E0A472ED6388638EA29D82DA68B4CF9FFDF2B67CD708EA5A370C6A7C +encaps_c: 8D4E2CB39FFDE4311AEEDB2338BF58CE11FADABDC9813A321930F46756DD13A8E7919FAC4F59CC9F8B91C833B3B3F91ADC6F9FBDBDE2F7DAE8841BE5238B9850A5EEBE675DDEF42A9314F690595D51523E8117F22266034F09B77D991EE575802AFE446374EB3D9E1BEB8F25049C6EFA96327366C024CDFBE8DC27EF56492C90409E87139C6088488E17B82D1556C25131ACEE7DAFFE2D437CEC3441BBBBAB80C4BF177E653AE0831C9B4CEB70505727D63C4D474FEDC52019BE411C9A43B87170F5893F06ECD8D782063DF893A1B682246D1C64F8F5A8C6FCDF07927F4D5B7A397FBCBD075045DF2C4A36F5304C95F44AF927AE9166420B39448794F5B3C35227C3C9DF925602A1AC98F851AADB65C93FDD6327AED8AE4129724436A33AA08AA56608855FF80AAA42ACA4562B2D78DBBD2F91AEF251566B8C6F98213784C99DD7D71F495564C908501E35E3BFBB675CCB66635287CB6466E6E38EA8AB11CE7EC60BED8620B3DCD6943D1279A41F93A87FA359E513C81DE918DA88322B1B088140E074BE39BC17E3C51AB719DF6E426D64FF94B8662B9DD26A32A3C3687BF9294C537A2268F9DED380CC8A0F1127EE5A322B4DF24D87FBCE76F560B037C659B6FB15C156071AEDC26EF11140DE88D08D463EA0EAF080A0B2E627D9FF1D56C502335524269727A032DACD16543ADA8342CD6CB40E7228592C3574D982E0B9145EB865DB2EE7810726A916B837CA4F14C2CB9E951BDE76BE16B8B1CDC2EECDC06949B8BEB11786B8F25F4C9AFA5597CEB1D85FC9B9C91DC61966F396091E54C96C97A4300E99FD9F752C0BEF5D88CAFBDCB3993FCF6C7A8C5519FCECB6A79117E9B521680197D8A91AB75F1814DBC58075EF4F07987ABC56A75DA4416EDB9D6F3D771AD340D5CBCFC0E571FA70AAC1C7DBBB5F5C5E1D8B1036F5A6FCFD0625AB5BBDA571839C5835DD6979778F59D348684FA6CFC2A62535B47FAD7F97B5218872D52DCACE9D3C1B11628D352AD821900F44E14B647F6BFA70F646B5C7AF5313177A10954944229153A449FCF89A6263BDBF8556E981E5D6251340F9F43C6692030FB9605BB99F33E96F06D1E4E6ABBE65E14696D530F1B525FFF87D54C1AC2F5E964D46EE37F4045B54E6098F76B28EAF69E998888D25E021A538FD1956A7FC30AE83F8BA9947F864FD59731A6FBB402AF2990E1ED2D56BF62AA6CEAE6F769D2D0C6C313D7AAF974E69DC02CC4318B9457B8CC40656AB7B6134DE3F9801CE019699CE855EBE9C6C02FD08506F004A4EED2CA166C954C7DB8810700CA671EF372A290B00E1BFBB97E3E674D3DCCC57CE59F465B1488FF76F6239008BE3E761EF9C113DF0107B8EEAE3FEBA55B35E4C1DA3B6C87A8D20110E1CD771CCBC30DFF761E603D488E55B853AAE7DAADF2A007B8393DF08AF534F9F53A73757BABE21C86426CF058ECA817EF237BFC58AC298FBF2A1481C4D12DCF1B737FD639769A2531EF931A362A44456EE2CA48598B46259FCC977076C59FA4E2954E9967DA45DA7CBF78633EC59C463FE48A83B801A54DB3FEAB445A357E418B0653F2940B2B71381B2DF9ECF8100848E2912F4BD503AF075AAAF36C136A413C95BE2F25A6D291976CD66A27643537E35E1DF89B1E494B36B08F3D0196CD7E90BA5BB21009F37A843199E08DD95CA4948C533CB263B5D405AF2FA119981A8536EB71C88226C41534C2687BF1EED3475E8488BDE909A93D4DB55B6E834B5E7860AA98FD8BCB13AB077B7BFD75B35FA393E93E3BFB4B9BA1DAA7465FD5B23A5B4CD1716D4BDF7B8D5574B156DB87D8DE1E526C97F8EB287BD97EEEEEF074DBCB2C4DB51A4EFF1FA7FFF328A572D7270017108ACE2ED25093DA535C7A26D3B912AA57FB322E53BB222E94E7CF68CD8A21AD7C06A4AF978ED1DEB10E3F2412AC6543C182068EFFBD87F31765F5AE681EE8B2E9AEB5BC940A94EC0EEF5BEF74874169EABECF1512565C51EA58721DD3AF1690365DB22E1877F2A5C01723F69B7725277AE4E9EFACD3AFA5ADCAF385777E7CE10F956B4642C6FC1C97808993EFD994CA65C75F459AC5872F82488C57FB7AF9AB969D5E369C16D0B2BF7800B938D6784C7F64D0C55CA7794654938949E14217055D34101F9417D370A8ADD72FC0B5766EC1D8ADDD702334A2AC27709C5AC5AE5601DBA952BE258D9336DF3E0F65878A858613258FB5E47941B diff --git a/tests/PQC Intermediate Values/ML-KEM-512.txt b/tests/PQC Intermediate Values/ML-KEM-512.txt new file mode 100644 index 000000000..08b8715f0 --- /dev/null +++ b/tests/PQC Intermediate Values/ML-KEM-512.txt @@ -0,0 +1,12 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +keygen_z: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC +keygen_d: CD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC +encaps_m: 109A248FE8052F84271FF57BAC156B1BA6A509CDCDBCC96CCDB1CCB85CA49315 +encaps_ek: A5409718CB72F2438A3555A3C8F18F2671A1F81403DF7B5A4659A51F50827BA6577AA70800D78D8BC5AA86B89E08B58F3480A89E104DC6922EDBC12D06F891027C654E994A22F91A2AF63404CA98D7B67EEA25911B24C70DEB8146A0821F34A302551F2D510C0588C8BCA74EB4DC0CFA4603C1C5A3C5537061789068682C4CC3143FBA9BB5542F9778BDF23B3652F2A7524756FA73909DDAC7E532522659218CBA25F33B6B0458CB03DA7935BA59111955312B15CCE2C0F73466A8006283A2AA7CBB61022ABBC2D19F2920BC302472DC97C4A1788C9BD3BBEDC9122B827B279C074C80443141119F4B1629F62F10D4CE2BE3BB343816CAD16A1C87582F2B70E26635B08BB390C13398FCCDA7E9BB3D9B0B7803750C955C57A028A5D26C270316BB2B815C3B972BA6782DAB02F306821E61285BB072BF79781CABC386142A50C7AAAE66A947585BB0D8288DBCAF4B3B85BB7926987BAF7643AAB5FB02210580A0264352E69C6098989CFB87483395960A3A4F31BEFDA80B5F286ECFDAA555D4390AF6B55D313920929093449CD6729D00218E2D86570ADC0C4F6545FFB5632EFB3AAE2625A6982670FACE8D16126FA607E6D0A1FF616A46ECA642CC6AAC554DBBC43DFCF57F364C190CEA5776C1CEB58B7007505FD79C5F005A4BA218CF0693B058B510A4CA204324602F59BB8F2281C4D7B0BC8625E7881650F57C89E32CF4809144775C9073B673E39412A27C914321CCB6A7CF7C37C5BCBE7CA51BE0C928466A458EB778D6466A892A0ACBC09638784A27739C970CA58BC2595AD6BFA4E52EB438AC97C41623802248E110B074838F31A6E7503737704E7AE4AD91299572A8C13603500F3609B625B4E24CAE332B0D7A5BB47A038512A081BC27CDF0F2923CD3479F5307020B77F149584564060E5083CED55312B6A6A465A82B4577D63A4B49C80B07A9367E39778AF76FA8EC2CF528722856CE7813401A8383BDB7151B9B6D2DD6BFF55401D28AC612818C88C9287347B098A966EB9C0A2DB71F0A75555E1757D3AC4E3D802C8DC6A261521255186ABB98C2480301B8C6B31228B54461BC44EA3C2CF94B86C7A5B82C55167A7606CA9DC8253B7604E44A07F3ED55CD5B5E +encaps_K: 4DDD304E274899BD82971856824B587130927952060121858F9ADEB96AB7F571 +decaps_dk: 174313EFA93520E28A7076C888096E02B0BDD86830497B61FDEAB6209C6CF71C625C4680775C3477581C427A6FE1B0356EAB048BCA434F83B542C8B860010696A57299BB262268891FFC72142CA1A866185CA82D05406695BA57D4C930F9C17D6223523CF5A4F2A433A364459AC0ACDE7254481329288B1BE187CC25219F48C2443C532199859355320D04F0B80DE969F169A3D2BA3411B4ADBC01B66271824CD9543C78BA4804AE81F3AF00336C5CC3698354C0E01873A2A17D6A95A312689A99DC89084150A8D52BB31C3FF3D4215FA3C4111B401992866E513E5128A20ED95FDEE61485DC937E099D76F79B92734DC4CBB9A7A413FEA6285BC0C27C961E47D1983644C4BF913D72F4B030D34738427263E87AB4C0B7DF0B72CA8AA0BAA67B079939D587801D60C87A20405E5C52603C072FDB63E2E1C2A95CC26F5ABEF6088333800886D093CA01A76F57005E053569542E0A076B98736D4D39B00FC1653FBC2D12EA32A94B9B92C68BA4B68A4E7B370A23B03FE8221639B01244806C27067A58031DB80D2D03661A017BB46BB3711ACB568A4FABEBAFC5FA06F7CA0E4D962E3170CB11C0A8D18A09CE27A6A9763E123885450224DE07CC17546C17951FDE476E083583EF10BF76A98AFFF9B12DB5401CD3673495392D741291C3AA78420C8A7CB5FFE65012997C4DA4322EA90B5014B5B4D0180100247047341E4C24B96B8D7C0020524B7C1D66C3E08CB299EB4EC6FA0EE8EA05FD430F57605E892B232D2047CA9B4ECAD9BDD09C9951196916525D1EC921B6E3CE0EE692EBA728B4DB10F3381FBF584ABB7B6A9210C7C424CE4A369370CB48D608634ABA0BFF91C5620A1189D0CA97421D423429FB663952DC1231B4362B7162FE3A42111C91D76A964CB4154194209EDBAA1F481BD126C325D15678E39BCCE4C704EA487246648A6C6C2540B5F680A35EE2824246450A7293F21A90CFD14EFAF78FA3D7322251C641A50E95BB5EC5CA0B60E89D7C18B7A44A0FAFB4BCADE9B588D1B7FCF12BA1E1084D56B197EA90A79A3D83927A2307603BC211C0830CB7062C04254824575B226CAD9A27C2A45519AE39546467690485498A320AD56993B15A9D22C6191446CB40AA7547401681DCC7E36596B10C07FA2A20B43C4B0124401F8A0E744878C7296623C7395B6994D18C4787A289DBB05CB1827451D83F072904537594F515CA1017991620A33E096EE0DC091AE4CA960603B101B5B4E23E9A5B65E1F6C2A8CC89341383B706725ED5B3485769181B8F76439C05636A0C3436FFBA8B86A5306FA111F6FC71EB779B25707CFAE0A6DA7B0AD5D94B10F21E4FCA92893B9FFE73210763401377837A10CA9625346C42ADC705BD92DB3426D926CE4B5EC24A5CDF27CB91E5A7E7164D1BDC99D75679FBC93A58F647DAC1086CE931BC089233E9487E0867BC58472B01BF2895C323B64DBE4A17A9E841B053CADB5C76D035724C321BBC13666F0A35DFDA0721E8987623256A994D95FA1C05F57C1E15A30C4A0C8318A0D83C410C362862E817DD6ABBAA4BBE75B736CCCBB4AF2A188402BD4CE597932008862865332562F324C7A424151FB59D0AE1821F2864C7E698127AAD92C33B313988C29A09E260449BCA7BEE360862314E47519EF3918DDDE403E7B92AC9908F93C6369CC5C47B8CB1DC3A3479C762F62A18FE05A9B0645A5311A01828723AEB51FA505E96B29E3D2B6E5B1327DE3A61AB0C50BE0124B64B33314B32D6122510E46445857AA0E2C4B0D256955620A8681D1E555126D00509E35BF59683DDAA40E82C519B855852C366CB54452BF910B001692330345708653F511800B10E009D9F7D10A53B8B30BF13B06F254EC8A6BA539700F6358DE0463A019540C9873F3F4680E2113A7CCC55FF754D85AA67E9E55F887424E0B2625682A5DDA218F03C3C10A246CDB0CC91D19D8F024DB9B1415F50ACD8F65DE2787B9103C575B687765572CFFA59026C2BCEE77423BCAFD3054BF8E2713FB85B0BF6A46E716152F5C9A3011EC90114C76B01516799BD5911415B704544077F188806755EEC4131E55556DB903F4284C1F90086FF431B68F51F629812F320B55F219D72A1928F38C9A1EC823BA198BA9ABBACF62902B3CA0AFC95EA8AC303FB8BDD29BB9D18A03BA44E58B1B0B85A2A1662E6A31DA7545511A478A18177889061EF76631264239ADEBD04A8C52B72E2B1F3A2DFBBD8C054E70CC2A742E7B7D417DFED314422187DE1B2954481195755EC04BB7671C4331446BBE8952514905321A2176E935B5420C0D5EA4465 +decaps_c: 84A188A072E4D4F449A4BE170274DD2A5F3E356E95B96E40AD3FF1455E36C6A71E909DD2C0DFF8AD2C9F503BAC9065716248083BDA40CECB38E3B3058BAF51A7572384FF8406A8136A4FC6D912A54B2EB5B9D598FB689E72ED3DEFD2FF8355ED9E9CCA53E82C0886E094C592C392311F04FEC68F9A1C531CF3419030892B5BDCACEEF6A0E7F1BD44903F49DE8E37B02BA3FC5121D99F8CC3040F66832F77021B4CA35F7A4825038936564CA2E673FF9CC0519C25F6A52D87EDD965B2464AA365D2BF068B72FC68B65E88515E2C832BBDB27D61BF512B5FC2D8590FB35F49500CAFE70E7D0776B5C4E4503A7189ADBAFF5D5B515CC68B2F81D993C6D7FA7D3D1D90EBFF51DA3FBBB4430E5BBEDBCA8DA078DCE8EC815B168BFC09AB4A20678870F4868B1FAE28D209C75368A799317DFA08C2B651FAC72DCA2A1B4CBB75E873F15C51B6D0B5E6F5E60E2AF6C40D2CABCBF3588F44BCEA6D72D359F40F9CF5E0EC40A5215E5ACEEAF0DA00D923D4CEFF5C3A3AB1E46C754F4AE052C2BC49FDB4521AE44DF634D56E433DAD3DF3C07115406FF8BFD0D7C93B4941D0F09213C1681CFD5C8663DF02041A3CBD162F5C4D80CB1DC7D4A501AD06FE96EB348B6E331C8296FE904EB97C087456328D703B85BDAC2FB43C728D0B05FC54B8C155C010EF0DB14CC668D1B1BC727AF8864076736B898BABA1C81DCA2053F58587D3C4E33C694A264BE2897E7D2EEFADDA9FF88D70BF3731F1228CB3E131EB0CB76FDBD2CCB1CBC18D1450AC7A16349E7129CAB720D5CB70B56E855E8305DCDA730BBD0EA33EF0815D02190BB98E30F73BF7789CDD673C613B0C57CB2EF32E670A98D2D630670773C59D8A6A2CFCFF1C7CA1BB55C17A32CB65A2EA19C7B8E295C6898CF32FEE1DEB01472BE76C3A78CB242EDFE21D961FCB85C3CF6CEE218986C1BD932BF97BC6DECAABF8C62940C0A58E87C6EDDCD74B7F715D8C22520546239F3AAA10A435820103B4E3295311D992C9C8771A3CE849868F36F31214F9639C028F4A5F4945F2BEC9585077BF2F637D2549F8348C00ECBF19C470DF255EFF6232813429F853 +decaps_KPrime: 224B9C051213EF46549243796532282973FA7CF97E8913C339C1940AC17E05E0 +keygen_ek: C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636 +keygen_dk: 37EC477E217BFB40384C850E51C1837158BDBC23A31832BC25C91B3121444AD4533733BAFF07CA817B64B2CA4299AA26454CBAFB35B6ABE1185CB47C4CD61AF98383C4814B20AB8754FC514F23074114C3E5A810A453B855AA7F1310C74B0B01E5AAB2E871738FAC2786C7A05D6B3B32A050D0FB223956C95CA0C2C1D54154A77BD33737A49A0065D1424A2ABAFD52AA934C9804939208F05CCF8B8B8086316E0943A08710500C918A2B218D37B85AE28022CB0134FB49F5C45D98D3C04B755A60880422668E2B301B18D5194DE991B265BF94697E6A4B8150C8B852033915635E30665BDA2191DAA505D43344FD29C9FCC1C507691D475B617C948FCC84B1B08A1C638C3E13580CE359789A9860E5469CC754B08EE33F0921BDEF15A906969F2DC57A25E80CE4C45F11E04A519AB08B9B927C3A13A081CFFA110FACCC5E8DC29495978B5553104D473A175918AD5B5487BBA69712AE93F615C60A8D387BCE3F651E56880A522B2DB86351CAB65D13B4693DB0B2C80936FAD1CE67925E6BB7C110C43E83247D22608D8C1023431CB69290A4F8A9593BF1241D737C0CD16D75EB50C6842CE0A21DCE494036824CE63252E9325F05B734452B129132B196084A3788BBB1F20A37D2C2B3F90E0DD7A274C9B1A9F02EC7E721F4A43D409A25FBC99A44D4763107C787620941761ED48C932924BA620986CF277A23471C7B13333D936C0DD49E0FF34CA3AB8234C42AEBE459C612052B9716E96B20BEC718126040A9091F6BA9445F45806AEB6E3816710F7CBFED1101461284DD962B7B12047C0A0A906A0589B4A9A426469BDA3946091A375B1952A91C231C0FE6B57F7CC97EFED0BC1001367823BE1886308B3A21452B7E455066719CCCEAF6A726FC22BC8399F54BBFCAF7CA63BA73173C7AA8619A3F485C3E330421006766746F4EF6653E440E5CDC59534018C352C023584CBB374EB7A9B7836832BE53AF272A069755CE2FF29CD8B394C52422B3470E27415F41B397535959F160003B452CF49697B7A53689852BBE6CCFDFB40B48E9328DE11522D0A431B115A5C0C2F4307D9862C0DD1B40C65A1D9D479777E6905A91A5CB24551C8B1E52A3C77B63313FFC8B5817815259A6ADB59645DC4BB1436D51E62A096834AF43772510C4EDF34CDE0A5B57C145E687CB87162F001C21C9E1934AC11AAFA70FF810732650B32A3018A7C50CD736796222C8AB821A9283BE1CC204C3F1630D3CCCDB0A9A3D17552B9158C0664E5D6A04B0FA36DE45862A46A39EC597AE42C311C4AC224A72D6F253BB5235F7A2B8B0F24D1376AF588746F3BB8E0365078761CAB983A4A6A940A3D997047A8F36A731E8965236C37BF200082F821DCA7716C444A90BEC53074BBA58C132BFB9A2ACE2CEC9AA658EAC1232CCCA3C817A92C1195C05C0E1D6639FD2ADE531607D488B74A747CFF47FCA5C8B2163CA03C545ED103278430C60B2381A09427FD130F859BF5DB776DA095DCA5804FA63B0D7D87FA9415C72FB51872A989F466C984BC74C29B8632019CA040C9CA35E22608DAA70357AE2C3AD83631FAA174E0ACDF5DBBF3CF68A05B6543AB6268E1A51B0932C17B00A1371B2DAB241F92A43FFB456D0A8C8860A8E28A61A21307CC0456DA4242905CB1D3D0BBD81BB8EE274A43C76C310019515FCC140467C33370C86808ECAA58E3BA93A2C1190461C1DFA11302001BBAB4CB1E3642EF8CB26309B60523BC21887B07F898CE562A6CA778EA01505851378CEA8BB7FC09D11961B6C596F93542A9904864EB10CD0A703DBA98921861A87B056525C71A843553E6400777437C95CCC8085CC0C477D665A4479019D4CD442F74A3CD8169F4262B8271B5D5A67C8C1611AAE7B3D0534C0859716FDF0BB68949094C06A1B73C9AA1CBDF331543DE002A8C06F94E8810A5CB373832745D720683B574875A666946D0296893F2B59E907488D8C8489D474D929A05A573ED667490371A46D4556CBB68AAA79CC3EC6653413576C228E379A14CB90B7B7591B19A7BD37A1C4D37859892219442BB0B9B9BA67BA3BC0D095C8803CEBE97AFF0B1C153578A130CD8157CF745946C2F5726D9C11273575505291346528EE0BAC047CC984538B97BBABFCC357DCB8A98FB857C9C52D1B786749CA61892B09759980520091B9B477C70E6C46586B1CCEBE87BCF6DF03C2B27CB09FA03F63160958383BE636C0ECC8DDAE8B594A14037868BEC0B22300DEFDFAA1D973AC5CEC84AE4386B8FBCD119AFDC8559442424A87C13EA101E29FCA11881869077E4092E751BEDCA8BC +encaps_c: 597A06DEB88172BA8D7CDE8D82CAA234B8112AF8A72F1AB4CEA1EFCB2D868D53D212E303B70E7E521AB0F4B5DB4F51159248BFB275361BEF883752C78B8D4712275385536A4B0A96E3C23EA6C17EA92B602616E5821E5753A4736C4039C20C923CCECB579805587C0CE72218BB1AB12452F8E154CB8643328142F9B340A641C6F295E5ECF2E048BC7FC79BC5B94277C868D8E536B50425809DCFA024A3905CBA550AD3BB52B459AC38FABC9BC00EBA03EC0906725B4FE4E976F174320047B31D15891365BA482388F0FB973B85224FB00BA865AFAB3C9A1B7D489F7B982D0BD470EF948ECB5B3920AF89035960123B1F8630D763681BFD671567EFBB1E6276AA4FB2DFA9C3948DB7F083F28383B77BC514AF9D68D22E2487C20163C02B0BBF23BBCE0650F84FF8CE02C74E9E11D6F30EC5FA8A012ADC3B89627C7DE855C1FBBEB5DCDE84D05E36C5566E5551B58750A411642639B27864F7E005978FFE256B757D13DA663FC3BB0794A27CF7585D12F22D953B285459FDC9BCDFCDCCB7BF3E4E362D2891D583855F5D9487E6FB217E2E45EE0BD9AFC289F4D564581209A3ACA31795A124BD1BBAEA846755C8EA7810EAA73060E86FB5FDF3FBE72F806BB1BFBFBAC0C7B16BFE74250277ECF5F541571B8A975050917FDF781FEA17B585E3C6DBFE77B1E48A16504C3A38901156100CAFEC2ED939AE9A9EDFC9C0F8C7F55CC93E5DDD0B3DE1C6EDAE2B7EE34C6101F011B5904F693D286356B54C86CE8BCFEA9DBFEC21C1EF0ECC9105005BAA377D829DCA2CBF5EA5F31B71D446B833E00619819D7FC6024052499757A2765F19CD2B36C2488599DC5247494FABE81EEBEFD3BE75C4780E43A50418C5DB2FF359C5A6DE286EF5951E2709486EDC9CC49D0724ECA3F2C0B75F8A36CE862388F00B3C593D1C8C6AC45D73A72FF6B4F805B131ED4EAF5601D7B73B0E3724E75D58DD50F5871C54A37C1481331759F4BE86FB58A2EE003130F66E187C8BA5015BE713296589ACAFBF6596897E03D4920C91F26333B7BF1798AF815C93D4DF55BD47A08249BF113063FBB39503E9B6D43EAC7B0C305A diff --git a/tests/PQC Intermediate Values/ML-KEM-768.txt b/tests/PQC Intermediate Values/ML-KEM-768.txt new file mode 100644 index 000000000..09cbbeb55 --- /dev/null +++ b/tests/PQC Intermediate Values/ML-KEM-768.txt @@ -0,0 +1,12 @@ +Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +keygen_z: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC +keygen_d: 92AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC +encaps_m: 40BE9DCAC16E9CA73D49D0C83F9D3D89BB71574A4219A0F393DFECE2988394C4 +encaps_ek: 1456A2EE8C3556054ABC79B4882C3190E5CA726AB402E5B09728C0F4F79C9FC2ADD828ABE432B1501B60F46CCBC86A3378C34895708A13671B20B389479AAA01C69D6B3B7D07D1C3AB54B91C580F5A336B30069A4F134FFD3764CE73A047E2844771742BF4710B972D4F6590A1C53A975368C271B670F1A4036441054A66E8815997512288552FD7149FFB705AAE133F8414060D0092FA8A1627D78AB2ABC6696288BAF5C60EF370827A7EFA72AE5C6741A5DA043D5940F121485372A98F472D60F05F74D95F01A1991E73A3E0A9536467A4738AB4CF385BA772827EB8CC058B3572E40B598444C181C7F6D9B760A7B907092E9C3351EA234E4449BD9B61A134654E2DA191FF0793961569D3594448BBC2586999A6671EFCA957F3A6699A4A1B2F4707ABA0B2DB20114FE68A4E2815AF3AAC4B8C6BE5648C50CC35C27C57288028D361708D302EEBB860BEE691F656A2550CB321E9293D7516C599817B766BA928B108779A1C8712E74C76841AC58B8C515BF4749BF715984445B2B53063384001E55F68867B1AF46CA70CA8EA74172DB80B5218BDE4F00A0E658DB5A18D94E1427AF7AE358CCEB238772FCC83F10828A4A367D42C4CB6933FDD1C1C7B86AD8B009657A96222D7BA92F527AF877970A83247F47A23FC2285118B57717715204674DA9C94B62BC7838CF87200156B26BA4671159931C49322D80671A0F332EAA2BBF893BE408B9EAC6A505483AA9075BD1368B51F99211F480A9C542A75B5BE08E43ADAF301DD729A85954010E64892A2AA4F15C0BD70B3D856494FF9BA0FE4CE12991CA06B5E3D0B2AF1F797B7A2B760910AE9F833D0D4267A58052C2990F161B886E251711C09D085C3D958B144192C9CC3224A460715B6784EB0B26F237187507D85C5110ACC71CE47198F254553356DAB448C38D243A7C02BE40C908C828D05C081DFAB8FC6B5CFE7D56E7317157DC053B2B3489986B081288871818585E09931095E3274A084115BE276438254A796270A7B4306F08B98D9C2AAECF7065E74446B7C696DBAAF8B4625A10B07827B4A8BABAB09B64AE1C375BB785441F319FB9AC2F14C95FFB252ABBB809C6909CD97706E40691CBA61C9252BD38A04311CA5BB2CA79578347505D0888851E082648BD003BE97C0F8F66759EC96A96A081C6822C4510559537042FC15F069A649B74A10961B354A1F625B04E25B293CF65FB4F53A80CC733D7A175775BF8A9ABB9201620E83A7F3E724D1287DBC44BDD5D85FC71545A927BEEDE537A7768735CC1486C7C3F31104DB67343F435D2D45554BAAC9CDB5822E8422AE8321C78ABE9F261FD4810A79E33E94E63B3341872C92253521997C084FBC060B8B125CCC88AC85AC5FE3168ACB059B3F119C4E050A20732F501BB9B3E687C846B5C2653F8886373E1004A2AB8D1BB970A7E571D8A46EE81B782F26942DD394FDD9A5E4C5631D985528604B1CC976275B6AC8A67CEEC10FFACBBA3D3BB141321DFC3C9231FC96E448B9AB847021E2C8D90C6BCAF2B1240783B62C79DEDC072A5763E660AF2C27C3F0C3C09207CAD990BB41A7BFCEC99F51596A0E83778F85C006AC6D1FE981B4C4BA1CB575A7D07AE2D31BA760095F74BC163841CF8FF77F894ABC6D261ED87A4530363B949C4AD24EFB3A56809478DDA2 +encaps_K: 616E0B753A3B7F40FEF9A389F58F16BFBB04622941D2464BDAE767820DFAC38E +decaps_dk: 3456859BF707E672AC712B7E70F5427574597502B81DE8931C92A9C0D22A8E1773CB87472205A31C32206BA4BCF42259533CB3A19C0200860244A6C3F6921845B0A05850187A4310B3D5223AAAA0C79B9BBCFCCB3F751214EB0CFAC1A29ED8848A5A49BA84BA68E6B6F5057D493105FF38A9F44B4E7F6CBE7D216408F7B48605B270B253B001A5401C0C9127CC185B1B0CF92B99FBA0D95A295F873515520C86321B8C966C837AAB34B2BFFAB2A2A4301B356B26CDC4563802901B4762F284281A382E5F762BEF47B519A81A108657EBE962BE120B5FB3B9ED338CCF47B3A03952A16633F6E6B534E6B63D05706EFA0F94C03A2B856AE551422F9011F2589A41B96A2CD213C6999B09E91FF423CB106A1A920B84B811469497154223987F005C72F8AF388B090C639F8C774FC5A294C74A212C91A86C328AEBEA558AB43F8B873534FA2EF9E66CEF3C52CD471AB78375E745B9D0AA65D2278B9275AE5348B16CF62AC8065734E4BD77B80CCF897605EB76F485AF8A0B466557A83C0292CCF903EE7AA57C3B51AD660189B86139E380425B31A92689DF2431BFA7B69EAB1727451B29DA8B8BF851E1BC2D3A63134CA9663C57AEC6985CEBD56DB0447B136B017A974761C3C67D33772F9964E5434D643504332A3027294A078C599CB29163109CE3B56CE698B4D3F59E2956A1F03A4B955593F2D2457FFAAE9624A0711045B3F55292F20CC9D0CD791A21597B0F2CD980F3510F0B0239022000D735586EE6A73F3A3DCBD6BD1A85C86512ABF3C51CE00A0331F65360462C022329597A81C3F92FC17938C9138F4111387979C28F0334F90119221374DAB045929B49E43A9646A243F4464DAF811AB00630C75961BCD4AF5D99115A3749191BA8FD41CE0B3C89A695B4BB85064FD3AF95C9B4AEE09AC7B0CC69ECA36A004B6CD662A6D32795053EF0A03ADA3B98BFE3B46A79723E3A45AB3C31950669AD77072062CC3B504DF1334FD6909EAC7915F1D5AD16639F5FB564416454259134D565882CB381CBA58B76880767B50AC1B85795D7268433B371230ED4C72F99AB1AD1E595A459CF0A2334AA1463ADE4BDC9249605381857BB98095B41132946CA2457DFAA9149582AA19927B63689E2929AA41027BEF4921970BAD4A55490D91ABE251DEF4552CA88034106A02CE4B058F8B59624B67E063BF178B015E4281EB114A2BC2454943A4B4647122C42CBEA4E94154FD3E4B791F6290B782994206853D67000A633F320A8A374CA5D4038F9CA4244DCB02E9A84E1F7C8A821132B32B9A840557B34780665301724BA2606681D945E34D7CF941B8963CAA1001A491B8B2E43570E9AB95C0A57C503F0AB960B4856D0251574710FE5CB474284FC1049AA2A7B03694A1C763E99DAC6AD0BA8038B138A64432E349116A031E8C792781751BA473CBDF55720005ABDAA13D50182F0E633776BB0675C40472BAD1F9672769183D0CCC810BC25A8573220569F6AC4BAC22A1354D8B36C0580D0E5299E629C506CC7655546FF27810C97B51BA056BBF86ED9CB7C0A537F72D0CF9AD2C231E29EBF553F613CBB15B3721A20077E505FD390CB19F6488A107DEE1CAC58AB7034BA690300219595B3695C1234E8B57E33C8D3A048454A616DF3C9B56A6FF2026AF997725FC95579043BAE9399B6790D637B4FA820B0B2D2CAB607BAF6A372734C31EE0026F3C076D14A8E3EE66AAD8BBBCCEB9DC70C7B6BB0BB76C200C231601CA0873EC8710F4B18D57290B033727C601EDB71C2B0F0C21D553E0E7A4F77716839C7C8448ABB9F66A54E8A4B08A79D9A392CA1270031388BAD56217E32AEF55411974906A245C00712B3CBB1170685193FE25ACD7AC13D32073F3879A5D78375F0052CF79175BAB46D22370597BD06789EDD0711CC4243507A02B4FAADBB62250CC997AE0327AEB00DEB529192A64B1096A86B19674D0B0AF05C4AAE178C2C9A6442E94ED0A56033A11EE42632C0B4AA51D42150790F41062B77253C25BA4DE559761F0A90068389728BC977F70CF7BCCFBD883DF13C79F5F2C34312CB1D5A55D78C1B242096A8C0593CFB2753460BD30ABA306C74173995748385D00B3670E61324D87DE8A14450DC493768777FF0CE6810937A711229561A5EF2BB69861074E00BD93266E4B86269E18EEA2CAACB60A1358636CD7A7CA6BB682130241784B101EA5BFD6C3A07158621614736F6996D5A4E14963A12D836E533A0C8912DB7E11685A4A53D8285F08750DFF66DA27C23B97542DEFB99E470ACD5E647C940CB57301B43CC3E68E64E28B06770695EF609265E06C60F22CB875849E62BAB88CC10ECF622C379CB54F13D8B2BAC902B9AB02BB330B45AC8B741C2647AC45B5BF48A6D3FE039986CC940C60A94E66CF644531016A5272450824314B5662A0A909ABFB46FD27BAED3ABA8259361596882B08B2AC7233930FC3786738ED2F81EE638C45C3B9CFD1951DB5BCC1445C2C1625D57D57B53904B6A1AB681580755E89FA79775A657CD62B4426304BC0C711E2807A2C9E852D4B4359EE6B53E4675F523C90782572DC7368FB400C328C70FC846B5E98A4330BBB627BDD784B4DAF0B1F645944942B4C2B6225C8B31E989545522BA6F10396034CB1CA745977844D570894C611A5608A757416D6DE59963C32798C493EFD2264C231910E9A30090CA7B5384F231B89BA68A238190EF1A2A43CB01703470A0F061A70738944BCD9B7004F24797AECB88B1091CFED0590B0415453C39B6EC45B66305FAEA6B55A4B7967505FE3862A267ADBFE05B9181A06501893391650EAAA4A6D16853349276F98E0F44CD726615C61C16713094D8AB093CAC71F2803E7D39109EF5009C9C2CDAF7B7A6B37A33A49881F4BB5D7245A14C5042280C76A84E63F49D0D619D46D723BAA747A3BA90A6FB637A9A1DC02268FD5C043D18CBA1528AC8E225C1F923D1CC84F2E78E25DC3CCE9353C9DAC2AD726A79F64940801DD5701EFBDCB80A98A25993CD7F80591320B63172718647B976A98A771686F0120A053B0C4474604305890FECAF23475DDCC11BC08A9C5F592ABB1A153DB1B883C0507EB68F78E0A14DEBBFEEC621E10A69B6DAAFAA916B539533E508007C4188CE05C862D101D4DB1DF3C4502B8C8AE1457488A36EAD2665BFACB321760281DB9CA72C7614363404A0A8EABC058A23A346875FA96BB18AC2CCF093B8A855673811CED47CBE1EE81D2CF07E43FC4872090853743108865F02C5612AA87166707EE90FFD5B8021F0AA016E5DBCD91F57B3562D3A2BCFA20A4C03010B8AA144E6482804B474FEC1F5E138BE632A3B9C82483DC6890A13B1E8EE6AF714EC5EFAC3B1976B29DADB605B14D3732B5DE118596516858117E2634C4EA0CC +decaps_c: DFA6B9D72A63B420B89DDE50F7E0D56ECF876BFEF991FCE91C8D286FA6EABAC1730FD87741FE4AD717B282A21E235A55C3757D88D4CE62F414EB77EB9D357EE29D00087BF8110E5BBBC7C90419072EAE044BF7E183D43A94B2632AA14649619B70649521BC19370942EF70F36C34C8C23591EE0CA71A12D279E0F52D39ED0F913F8C262621FB242E680DEB307B0749C6B393A8EF66F8B04AAFA877B951AB93F598B4B2FAB04F88AC803984FF37E3FE74F3A616D5314EB3A826F874F8ECD3A5647D04942A57EFC09638470DC0A9DF40B317571D3984A78CF7D11751090722B3059E07591CC4A2ED9BA0DCE99BE9E5EE5DB8D698CDEB5814759BA977C90079CF2AFDE478069C513A60091A3A5D0111E22DE06CB145C14E22A214CB278C8152B0681BCAFF54D552B54A671C0DFEF775E7C54FEFC4853868C955971ABDAC2A76292CCCD4FD1C706B7D3614159673E9D7B29A2D3F63363129E7A21E803A460F2714E3E25922780AF38257CD1495ACD1E01980638DF58A153DAB07EFB5C7E78ADACF631956D69CCDA070459568BD9D11A2934BCF1643BC99468238910B1F742EBB3C03D39FD45CFB85BA309E29DD9B5CD560819EC729FCAC8B9D725E3E8ABEDE4B5298A8658EE3F781B0CE683CBB7335CD57EFE2204A8F197446D7314CDBF4C5D08CCC41F80857CC9571FBFB906060F7E17C8CEF0F274AFF83E393B15F2F9589A13AF4BC78E16CDDE62361D63B8DC903B70C01A43419CD2052150BD28719F61FF31F4A9BEC4DDBCEC1F8FB2EFBF37DFFFA4C7FECA8CE6D626BFDA16EE708D9206814A2EF988525615D4AC9BE608C4B03ABEE95B32A5DB74A96119A7E159AF99CD98E88EAF09F0D780E7C7E814B8E88B4F4E15FA54995D0ECBAD3EF046A4947F3E8B9E744241489B806FE9401E78BAFC8E882E9D6D0700F720C0024E7DA49061C5D18A62074040ABC0003200ED465231797930A2E2AA501F64862DDA13014A99F9D3270AA907EEB3FDBFF291600DF1F6B39684B11E396B70D86F90492E82B09BA25607B0C286FBC070182AC76FA7C859AAFEA87016AED22C3605A2789A1D439FD8D933342DAB745A3E550E7D77C01A6234BDA7D6BB19D495E6560FCE8396FC3C6E088ED60F5F2771416EA3BE5BE472B6404906C91E71D9A8672F390083655AB7D0EC6EDFE86789CE20BE2EA90CA5CC31416FB24CBAF94DA1468FE696BCDF5247CF117CBE9334076CA6896B2F6A016B1F7C73728807898D8B199756C2B0AA2457E1B4F7754C4576CE5645614EA15C1AE28B094EB217C7A7A41239576CBDA380EE68783432730AD5EBE7F51D6BE7FB02AB37BE0C96AAC9F3C790A18D159E6BABA71EC88C110FD84C336DF630F271CF79328B6C879DF7CDE0F70712220B1FBB9ACB48248D91F0E2B6E3BE40C2B221E626E7E330D9D83CC0668F7308591E14C7D72B841A6F05F3FDC139EECC1536765650B55A9CEC6BBF54CCEC5C3AC9A0E39F48F237BD4C660CB1A8D250BB6C8C010FEC34CC3D91599271C7531330F12A3E44FAFD905D2C6 +decaps_KPrime: BD7256B242F404869D662F80BF677A16C0C6FC1568CCA5B64582A01A6A142D71 +keygen_ek: D2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CD +keygen_dk: 19D74AD5472A8B2BAAD2A56702C9B3B5510EF3924858061D57F90DD9A1A01FEC2F57C51A888805341B617C515539597750835C3ED7A033B039D72491332C5DF4A69B6DF26171877AD1E50AC50100BE4728786685DA7A739E843FF0D45922D7281E210D5E82B944652F4862CFB3D902DE60AFD0A164471B26144A1D7A38096503095911762EBA7962C4511D05A128F2781ECB3D1F5BB1244237611ABAB924991F8A2732E27032357920F197C7692D60A9444472258CB457C1B71B77995469F3A962F3ABA6699614FCCCEA741E21C600C4357BBFAB452927C3D441BF8ED73152F75C08F540E186ACCA3326F422C84B988D77E61AE61859CF8541F89209E4983040C5617654808852B649B899A399AEC2C8BBA8A542F345ABF2813F65E9A791D32CC2D76026FB8D0C94B657489ABB487DA4A2C0E3868D3CF47F1CBB2FA79C53CFF6264777C09B177C91315484D2B30B0CA21F55ADD23C57E1911C3F086BCAD21798486EB47B7C58577381C09F5252582D1B27A7D5B8E060CE78209CC82BAE4DA606800C8DB1268F7AD2B793A44F34612CCEA31CE7D796A65A2691D61500625F83E7BE57077EE9C1B8C1CAA137CC4B6573308C19668B24B01E966903ABBCB79B67BE0A3E3E058AADA189B9EA80359AC26F4C5C53735FE4FC35247337760CCA3529B8D266BB6C48010654CDBC5A3E9757524675ABC413130CC2701F28933EABB8392B0D6D059CFC3A30326C4FCC810B37A4748C1C53928A4913E48B186697162C33FFFB06DD5161C8639DB195C6CA64829B2B3A2E4C9683B66DF7FB1909904E00020DBA134E02A168D76AC076BB77D4DC8496B4BBE7B4690BA29B62A91ABE72BEF323A44C8903E482B60D99BA61D1BBCF9CB9673534C1D647662374EE2C7C5F0081BAD149F44206717684D9746B2048633AF7A68C6865FB590358D8CF821458369B0C31EB597CF5BE78EB480EA04E35FACC380372C8C0A04DE276B1A72121E596CBB25EF7536AD3804184A87BDFB5A769160BFBB0CA3C360790E5562BB78EFE0069C77483AD35CAC237C61DE78A7DB46FC917124CA17510DB7DA218890F448EF6318613A1C97C928E2B7B6A54617BCCB6CDF278AE542B56AD7BB5ECD8C46A66C4FA0950CE41352CB85711890458F299BF40BA6FF2C0713862268B5F08E49845B09443997AB29A62073C0D9818C020167D4749231C059E6F483F976817C90C20A9C937079C2D4BE30DA974A97E4BC53ED96A55169F4A23A3EA24BD8E01B8FAEB95D4E53FFFECB60802C388A40F4660540B1B1F8176C9811BB26A683CA789564A2940FCEB2CE6A92A1EE45EE4C31857C9B9B8B56A79D95A46CB393A31A2737BAFEA6C81066A672B34C10AA98957C91766B730036A56D940AA4EBCB758B08351E2C4FD19453BF3A6292A993D67C7ECC72F42F782E9EBAA1A8B3B0F567AB39421F6A67A6B8410FD94A721D365F1639E9DDABFD0A6CE1A4605BD2B1C9B977BD1EA32867368D6E639D019AC101853BC153C86F85280FC763BA24FB57A296CB12D32E08AB32C551D5A45A4A28F9ADC28F7A2900E25A40B5190B22AB19DFB246F42B24F97CCA9B09BEAD246E1734F446677B38B7522B780727C117440C9F1A024520C141A69CDD2E69A05534A7232C5F1B766E93A5EE2EA1B26E860A3441ADEA91EDB782CABC8A5D011A21BC388E7F486F0B7993079AE3F1A7C85D27D0F492184D59062142B76A43734A90D556A95DC483DD82104ED58CA1571C39685827951434CC1001AA4C813261E4F93028E14CD08F768A454310C3B010C83B74D04A57BB977B3D8BCF3AAA78CA12B78F010D95134928A5E5D96A029B442A41888038B29C2F122B0B6B3AF121AEA29A05553BDF1DB607AFB17001860AF1823BCF03DB3B441DA163A28C523A5FB4669A64234A4BCD1217FF2635BD97680FF938DBCF10E9532A9A79A5B073A9E8DB2123D210FAEA200B664838E80071F2BA254AAC890A46E28EC342D92812B01593071657E7A3A4A75CB3D5279CE88405AC5ADACB2051E022EE0AC9BBFE32DEF98667ED347ADCB3930F3CAD031391B709A4E61B8DD4B3FB741B5BD60BF304015EE7546A24B59EADCA137C7125074726B7686EC551B7BC26BBDB20FC3783534E34EE1F1BC6B77AB49A6667846975778C3C536830450A3FA910259722F3F806E6EB4B9346763FEF0922BC4B6EB3826AFF24EADC6CF6E477C2E055CFB7A90A55C06D0B2A2F5116069E64A5B5078C0577BC8E7900EA71C341C02AD854EA5A01AF2A605CB2068D52438CDDC60B03882CC024D13045F2BA6B0F446AAA5958760617945371FD78C28A40677A6E72F513B9E0667A9BAF446C1BA931BA81834234792A2A2B2B3701F31B7CF467C80F1981141BB457793E1307091C48B5914646A60CE1A301543779D7C3342AD179796C2C440D99DF9D41B52E32625A82AA5F579A9920BFFBA964FA70DB259C85E68C813817B1347BF19814DA5E9364A4645E621923D955C211A55D355C816DA04730AA324085E622B51D6109B49F673ADD00E414755C8024AA0164F24556DED963D61143856CB4FF0567E3320730DBCBF12F66E2B70B20054A6DEA42614B50EF72B156F5149FC263DD7E039C55A3EE9827DF92C565D24C55E0A81C6494695344D948748AFBA9F762C0EA90BB724897902000775613949602C48C78A9440678C24086D326D79643BAF7036C66C7E026AAEFDA2807A60BD7FC91363BB0234A590984AA011F11D40268218A1588377B3D7671B8B99789919B86EE82B18EC22D4E80A1F27853D889419D460DEF7567AA4567969C43048C32B8462A9C9386EB3152A6976AA783CDD1A8C57A9B6BBD837A00624B58B4BA3DBB63BB8200E7BC88881BEBDA925BCA028E291AA1C22539CD04F90090D7F74108C32B8022C1591C881E76304E2408190E20F09A54FC23420E2620E9D87A3108A94FEEA72D5AB7FCFB972E6561B1A7B062F1A682E020AA2562812B296547B917824CDB88C582B5A6890177BC70C91ACAC9ABE290AEB2C34A7E2368955CB456A345368ABE3B91B47FC30B0233A09BA79FB11238AC508CCE61095F854C23204A8D36BFC2C6E05A72AF5244B17C12101E01451570EB110567E850E79C000142441FE4160027545F6290E85451B80234A9406C390B0CEA3C8335D4C6F8550B544C9343E61BA1C8489D1B0399739168AF740A481B0F5C3372530CA06B508ECE838AB78BEE1E597A9B14F6AEC7A3BD1AA8D10BAC23B9802902CD529AB6EF54DB3110CFB561E7E6948E65281250416C349C8100B3B4D3D0F62ACAD8D161175B134F7564937CDECE9E246AAD11021A67B20EB8F7765AC2823A9D18C93EC282D6DBC53CD6DF57592AC7D1F83BAFAE6EE86FE00F95D813375772434860F5FF7D54FFC37399BC4CC +encaps_c: 778D6B03791ACAF56CAAFCC78CEE5CBCA1DE8737E9C7FF4AE5F384D344E08223C74C824CB5848520517C7F0EA0645EB6F889517AE5216B0CF41DDC3F0D1DF9BC6E4DECB236A5EA8B214F64266D3CDE08E0CB00E5D91F586706B1EE533D20476F4423B78F916B1726EEEA959FFB9AC634D04A94D09923CB0D4E730CCA4144E7C4884921652DA4928C68E644F673CFC57D3E87CF5BE581A89F9CB8F0FCE2782D681E5CE88AF58458C3D63D807572DE5AA8E1FAF2DCD14EDB7349565B7D3271DDBEB0B6CC7AFE08635784311159733C46E5FDC5E0CD36CE5685ACFB1AFE50ABB46F447521E60D9C8F0E4CA28C190ABB40C365F412471E95A8EA396D4BD8070EEB1F02B07C825367AA1EC0F10C3862416BB21AD6CA748A86E9829EFC1A0499093C85176D37F574C75CF5EDFA8D920D3268CB34C6A4BB0002869BC05D7C8FCC0658D4A01EACD74557A37D98A763074752DFDD6429881CAFF577D3A048031BD52C4E9726398590F9519FD59405D6B3C307AFCB168A985785D954A6D1DC1EA92E1EB6F946A4D99DD6CA307ABFD8362FABA98BB264C69C5F555D60883CC56019FEB4E8000C48B7E68CD667F00B5250CEF293A4A9E778726E62F120361E21AB3140464CDC6ABDE9EA05198D8B3BB671B9111A2F317582847CA5015664F22CDB08C143187BDE2129B54F34160295D75FE9A494FD7E67AAA76B57AAFFD89D01A71DF5C8158620298D582BBEFA6D09AC412A99AA3BE9C383504948C43DD5AF4127B1435804F44BAFA142BFC2A95D95FB2EF0641ABE71064DE51D6B9EC50857B8EEF7F48036313D0E936763B8F7BDE69B064DD5761D80EA6F1A8B37565753C579BBB895EFB9FCB3FC5FA3362E3774F0F77140B973CAE587BAD2F3B566A9C25A969347E5C54F87F1105E9C074867D94077CCAE3ABEA54520EDB51D9DAABE7848E78FDF66E07E2E22B30251931E890BAF1F5E177D4D9CEC9E4969481FD7C1335A0ED5879F34EF4BB4F66C28803CEA162BA461506D52EB3AE16951922B06825186C3D4CE1B51F3C92F3C52F2D04D1F13B2B17C9EEB882CCE0EB88B7EA9A1CE4E37415CC84C7BC436A4628386CC77D9AFD207911BD9BFD8A7FA05C275BE0C4C6A8FC0A61BDA1D67AE33B5310BE1290DC71C1418EB5744BF2842C1652173A49A692E71FE43258A205B3CAAB90C0304A51E77D01B404A01FAE2F83AB80C5DBF6CF518C001F46A633FA169B1BDB77A9D0B1E0C007835C09F6ABBA96F3F53564DA508EE8861A483A81749D4A44672B1EF1605F29D168B74B736B4F13501D7AD1213118A7832E666A50BE8010D54322A526CF7A4E543A79D0D98E004FBEC76EA3F7E887BDBAF50DADFDDDF3FFECF6D3F77EA4B9B16DC754F4A68E5EF32F6A137E7C9E3C3E8C2E236C7EBC45D46EC1677A5A8BB2668443B0BE8693DC257F13D8B9A90100B92B4D1761B819673832C32020671BFB3D0220A363E4BED6D649D3F7368CFE081E196A43D4708798E31BB2A2F61824674ABA2FC9DCD05DB84B8627AE11488886F921BC79AE1FD03 diff --git a/tests/PQC Intermediate Values/Readme.txt b/tests/PQC Intermediate Values/Readme.txt deleted file mode 100644 index 406cc2b7e..000000000 --- a/tests/PQC Intermediate Values/Readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -October 2023 Note on the intermediate values for ML-KEM: These test results were from an implementation of the 3 ML-KEMs in draft FIPS 203 with two specific changes: - 1) The order of the input i and j to the XOF at step 6 in Algorithm 12 K-PKE.KeyGen() is switched. 2) The order of the input i and j to the XOF at step 6 in Algorithm 13 K-PKE.Encrypt() is switched. - -In addition to the above, our implementation of Algorithm 13 uses a matrix variable "bHat" which is equal to the transpose of the matrix "aHat", i.e., bHat[j,i]=aHat[i,j]. This is done for convenience, and does not affect functionality. Ê Ê Note on the intermediate values for ML-DSA. Ê We recognize that Table 2 of the draft FIPS 204 gives incorrect values for the sizes of the signature and private key.Ê In addition, we note that the incorrect signature length is also reflected in the output description in Algorithm 2 and the input description in Algorithm 3 (both in draft FIPS 204). The lengths of signatures and private keys in this Intermediate Values document are not consistent with these, but rather with what would be expected from following the steps of the pseudocode in draft FIPS 204. \ No newline at end of file diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt deleted file mode 100644 index 0c2402b36..000000000 --- a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-44.txt +++ /dev/null @@ -1,484 +0,0 @@ -Signature Generation -- ML-DSA-44 -message: DA5FBC7F78116BC8537E8E522DFBB6F68710FC36AE5AF0ACE5CFA3BA4FEBF6C86D966A44C2CF53CCC4FF5B9CC4E6403CFF3C23B4F292AAC01E35A21AB11F0707726E88048DD05887448B870741FDCDFB4451E1216FA2F89D90D872B67B4BA546C8CBF504A46FC02036FB5B287BC82DB9E2D835802DDE3075C7B703ADF4FAE4F98840670964A1ABC61105C3B99C78609605E7F17CD262BE67F7E7A2C6ECC519ECDE8D5B76C21FE5C15859FC94382608A15C7E656AD8E0042CA649EB8EEB59B8E266C244591B265B672D4654C5FF28296707815C647DD11AB3148AEDE24E96D7ABD6C479C0C367B00E464804184140152063153EC3982987618F7D9BD9812DF3B95DDBC47D1F96C752C01B742255946461509EF7A7A67DA0123D670845BE07725D9C1E9F419B4B9133EBA36BC90DE45666C40EA664D93A16948F848CDB9688E116B00B0A4F03B26BB836DFBA93EA6247550FD983371E360F04C9F2793EB769A00BF4049E94F225EE035676E983FC9CB01D15EEB621CC0D4B840EE777ECE351EC66C4B28A36FAF02C42B24804E8126E3852735C2A6F6E201662DC18E125210C78197372B4787A8163ACF4B758921AB23ECC4AB8F3C1DB3549050E26F9C35594DCC1C27AE5999DB695A19681FFD9CD4416E0C79E3457C0B5144F3993E945F6006EA0F541B1C3F473D78F4FED4011E07D46F8DAF7998BBD4A9F5161050D9982DFF28C72E15D158A630B8972E8E2B70611C299BE4BD3405350D2FEB84C93E97FE4DFBDCA5BCC9B6708D7E542D7101BD8D5589BAAEC5649E1C9844C37C5DB0556BBB6B2EB577FB65909B1EBFA7F1590D53D98FC9975BC06F7AC581FE22066BACCA0375AE09DBADC8940E98A38B15FC190523FA6D0CF326D7495B5CC948AC994181EE0DFCAB11722E1B46AD6FD2065442D1FA06ADF21FD9187B55320F554B929BC795F367AFEF11A5CE4128AE32E6C1662D013A91456AD292DFB8B4C161EA7A4D5B43AF63BE7BFC5EEAB9D1E3198F441AD70DF9D6BDEAEAFBD0A293F1A6DF07339A4C34C7375CB6096EB06EC035777C22344912DCCF3D0F8DAED1D0B046118A22886299DA5782DC77487CA5FD0D3CFC724769D658131FA415672996CE8E8BED83E057E3AFE26703012DFED31C732D770FFC7FA55C59BC3FD68C34D00738FC9E3DBECCF4B695B99BBD6A0082752E3A95150AFFE793D8F7FF19BAEFF7744688445E7B561294371E1909035929D654606EED6BD011D2CB0512B1A0987827BB07F14E0E8F0207519DF24BA69AB788EFAB21F1BD69BCB14AB44AED8FEF80F1F63685C6A85100DA1671405F8D6454FCD7D5FB6656959AD68D3E1896C6EB4967615332993D4207DB6B0F5A6E33EF4B2494DCDBA368A052FB8CD48A9E215D30C8C9D37DDAA6B4F3080744E6861B9889E23E9D964F75C5BD5E1DEA98EEEA8E66C60DA73ED1E39115EE0274F2747858D5D644C09B5EFC978D4496A007DAC35F2F68B1F9A3B43A638F38F663E6124740234119D6E8DBAF933ED0FD5A02FEFFF7AE3235C82D90B2F8557DDDC9102FAAF8181E6EE3E9BCEC78E4C61F73FBDA23D4382E5050A0E151E3F51BC22347F9B1A19D74649558ACFF8B21AF69EFFF78BA3E83CEB9EA36D4799272E10F56D3C151209C99105A133B665EA51E4A245D37E7A0F84F5222E3A0401E67BFC1BAB6269CA4A87D3CF062CFFEEE0B5EE5FBFBE1029E93F46FAE68A91CFBCBD5CF8B78F122AF22A11E77095DEAEBC96F1613911E02237F795AE717301499936B440E07B32DDB09008276C9A5A314889E8B9ACDF32D6695AE2931CC29ED1DAFDB61B708B52F9888DA67ECED25217F1A5FC1EE7D482917C7C7E44CA7F0508FD3BC94BEC116A630ADB08DDD882A221DC5D2C60A2E9F2F849B3E8B5DF150EF753C35251850D0B4980164F8C07339E035D5B2EEC4BEEFB885E261E401BDBA408869951075DEEED3C7EE7452AB39856D240E954FC8A4BEB01A0F79187BB72DD2925E63B3DE9E16CDDC041BC3BE47F318DA6DC6A9AD8710B18883367E374DA58D97F00B1E75AC8D4658F04295223C8C4F61B2CF7104492DC7A0C6267F45B5A4A2D258239455A31D265BDBAC9FA6E4A1812043C9112ACD4240625F08B901263EC456D2A5877BC9223A6C483673BE5CAB8C32516AD5B956688A01374AA48789D53AE79E7FB109632969E45684804DAD54FAB1E94A19C2A9B53BB9079F484C64A924C9C940FE5A3ECF29C739E3826311E42B310CF75A47B932BEF104CB27FF35D51E3FED9D724D90A17982F2897E2FD09E555977CD668E67A34216637380B8720A593FFC4175BB27E293C652C2DD8C506F4D1F551542EDBB31EFB3C1BD5DE6315280BB04BFA53CDC2D38C385C04E9BDF389745ED394147063CE3639ABCAA429C68475F9D466321EEBDE9392A2A2A6EAF53FDE20803B76B0903DDC6C81874A81AC147FCFB9FDA970BA5D87E4C346DDB83B60A718882E16F256A0F13969606C43D84AFD193D7BA3CFAB875646401547458F36DD53C2182B36B84DE8F8A50E62921A5B011319C555766E46EFECEB239297DFBFABEF3AE370CF48A08BC073B1E16A8C840F2604F75F39B3F0F4847A445A15F0B946D423210BD32A09A9EDF4CCEAA6E90AD1379E5928B66BD3A02C5E2AEAB56E8987B342EBFD9D3C70EED3465D78F12AF4423319B3106AD8BDBD9AA5736E6CC15C7AEE0DC78A1FAB83015CF880DE6249734153F6058F567D648AECF70D1BAB8397879617FD6FB06DA1AF6713E3CE584B214742587A5D35C6DFD33AFDAAF00AFE00E1CB516C955DDA9E0A5FB78DEF914B532F556D7E72E9717BA49A2D0F9EAFB5F526565C58E0FFC1B55138C8DE7A9D6CC06FC9927F6D04440512163B58A236F57B093E80F3CE0F4CCE282ABDCCE284057C4DB6314E05EE0A32B5F20C481F8BA4ADF943CA1B0277119DA1BBC4EA1D24CF7E3DB4C759E98753EFCABE2FB5B1FA593F2AE2B7ECEA96B8E0E5B3FFEEE97DD6C50CFE8602613FAC2D71174984C2EB59E532A35CF4FB0BFD60B8CF7CA3E7D5C0EEAD822648533D3CDE72C787DAA412FC70674E95CE2F5BF58D3646B4881D4CB6DD96659BB1A937B24795B435A103C03CEB6AC85E8FFE9C495082A87854392BEA530D61A7F60B3431455DB85414E6C365F9721ED2DD4F7C8A37B88131F5B2FFB5FC4A40BDB12EACE61AA956F8724C99DA98DAC18F6D33DB5F4A189454C736 -deterministic: true -sk: 5AE5192442A0894AC775D84419BB7EDE9E8143A6E21CD709A47B58545EAEC7F59EAD08050900CBCF4093F9327CAD67B7600D9F8425084B6905BB6550F426F58B27B47C434BC194D466D83C14BF5ABEA249E05287EC80D1B56BD0824E4EB84CE1CD4CCD0DBD1BDE59106AE10516E1150E841B03E759DFDD930F6C7BAC857530451C438E128029E436491980441BA56913074A8A8831E084641A152C40B865C9A22100800C13828C1C080A84C850221688241100D220085302695B1881524812C832881CA970D91445A122221226449106800413504BA86DC126321C312288486280A64463C261C220220A210653C8910919925308200988640A3100CB9868434050C2A06C1830482138640CA80D03339254C44D42B29014B9500400220BB38D8C269010B62DCC481261980522A03050A489DA2225A120859BC80480129252906193985182B470584481D2806448C669C8B65164B6219C964143262D1294641887111414500A166D64364EC282095C980502202683C48113A20559B02D10090DC084519CA6215C8885E1088990200E11126D182129D422421C2811214611582829482830A1400EA4400A428040D0882504C72111B20C8A148123002C53B688943411E0448140044A03A4111B042C6330715204285114864B8004E3B649E4B831D13264D814094B468881424A01430C41388008478A20378A01A8080831228CB285CB880D0A13499C860191848D04A72192A80181248959964D0805202341511A36081012842407300A1820D39881E0164A0AA669A2462044240C54084D1B208C923869588428D1144E63920022C94DC9320800497111A28909B384234591C22452D8C220C810610106669B062959B24C11B38941149083886108C488D1462682B00D14B8685AB65080409119B38DE2A44D1A0161981489A196610181514106019B0804C3C461A1823010A32D21876098103190425252145293A241534692212332A1828D40286ED3288AA38689D1048E1C936910970DD4125184C891D4246A194609E33426D0A485481605618489124126C9B6281C2111A3860543C05158386121828C1835645AB68C04892C03422EA148065280910146852219205B3292E1440404A908C9C884E4928C5342400C181010064A1BC07142887010284D2241602393905A88455A186E618445400884139084D4406964140288006A63380E18362E98160C04A7894B964D04844051B08419450612912411B410E186895A00318C129097956ABE59E75ECDE4E7482F0BB70D6502309163C9467EA51E7B467C114BA884CBDF37291400166F7E2450D27C5A20FC1130192F1B482740712446605F49EA14E3C35515D05EFB062339E69349C7D416830F426282A4C0C0BF875B0F8D98BCA9B55BC1E199C9482A8D5CFEC68166F9545F54F3B0BF14B2117DDC6356966BE0DD3CD42FA47EEC9FE4058A0679F3EF50F7306EDF0DBC58D2020702F3C1F0B23A70C4B9023B43E7EC670EABB06869A3AA3D315E9606F0216BAFE585E0006BB6656E1C146E2396A44D3B545A1D722B6BEDD33B40433B7A9A0B91DB43A0AE280F57DAFF4EC8E534885C436A6745FDF857A093F9067BA95229CF52D0C8DF29C52736EFD4FA98FC4C71F6A94983F8F008F29178BB53CBDD56A045408151FBFDE28941F7D7446D5C2B2CAB3C418E04C851D230A49F288713F3E7221CEE86FEB67B469B076871A7CB576D423B5CE20FDDCDBC6F3BFE841C494E6D6050BE92AED653F7B387CBD662AFB7B01401609D66EE5739BC0E9188EF3F61B23F6402A8C60D6C272EB27E3C36ED15A7D95E1BB15C8DF6774170CCBF50A2628F1E80F3007BE33D0C5D86C61BD927BA3EADCF000C5B4A1BBC0889C42183A1FDFFDA0FDEC7A2CB5148953B3C428F1153E802B0E60F39EC4CF4108DE315B8870E80790E6B67799499A768A60F0E70EE861369F0B0110498B206B01AEC9C56CC335221E675F0DB77B6A2F9BE317407442F152D32E2FA57054C2F05757079D29BF85077E571973C5410743C679AEC39B51163A9B3AF4049647FA008AC5E304F82AF0A0F28E5CE3040C8D9AD6799BD4E70B7CA23F965FE96539EBE04ABAD5DF057FE26437FE44289ECF68807FD2C8900A0D3C5B3910BAAD7AF92BE09B83D0E16CC617607623DD8A2A8ABAE82C48C1B383C13DFFBC62CFC3F45B7A0150E799868D55AB5A9F67EA0D4D35D9D2EB0317768E1F67FFB8DCDC9A6FF9FAF58BC260DE56A0165900F4C54DF209CC148CB93469C59CE5D0576BD2CD40BB0D0A9EB21A41EADEE0039D603FC2917366B7F238E75E431ED7DE076E9E72701DB873D86F73A4A99A82538FDF5611FC42BA4D899BBEE81EC55E997A697A9591AFCC2425A570BD026CF0F3DA4999D0CE7C2238037D8077B3E13290DF420A41771548FF2C2D89416FE776481236B3AE22DD2A21EF8EDFD5E2CA526A796B568AC47B3CD4FFB0743771E647138AFD6ED35AB242B0252DD19862AC4DC3310D905FF68DB2F53038D176D22D350401857794DC2E2C1443696E65D7886759A5ED653F14D9F804FE55E45DB4090C0E166C01F1FA8AA939B8D83CB3B1B65ADF4B31656CB8D04F21452BF2B6B36BC18A8EFA7A0E4AB67479844DE5EF231C8E8168BCC252411E67EB3F6598176F4D6739DA69AB952CA12B7A951B2333A991477CA51E1183D2769CCF90FA87EA2C62DF0145990C787AE739D5802E9362E5EDF969DC71FE7D2542A4DD1EBF12A08240BAB3FB4EC2126DD0C0AC740EBA06CCA2AC6ECA57E4094ED4C818965105037D1EF2E739DC2D58F2554C40AF69ABBD483A896654C5A26668691A6A8C005ADCA4EE51BAA82DB5D7495E29FBDE6DADC67929A60FA95267A1AB764A1A41B3CA0C3FE03FB5A8400130E6ACE93197D3DF50FA789F16BFBE6B292FCC2E9C03C792473A70AFE13935DF76C2E5A2FAB154B5CC5723E5611BB363B621EEF74343CE19AEED62BF771DCAAE501977CD573A412F15FC8D294A512B7B412F462298713889F6F9E7DC35A0541A2A306CFB9AECFB74C0F94817AB81C804A0508718269E5691A24A2CFAEE8D0BAA69BB30FE04C45881485B2D67AD09D5EBB43A3508AA45BA2D54CCE4E7FD7B679E735A4D78E8DB1BB1583F1C91B0330D2AD7A80C7D2BC60DB220287413E9B4DF7F68E8A8541C1F1F85D15BDD51C6902DBA86A67B2E4CD86B92E7BF58724AC5A53219216B78BD1B50CFBE9B468A667FC6C4F35A610E7AECDA8A12DAB0C5A658005879E2608EA6549999DE0C396E2E0E19895E77A68356EA29BD2A1F24BE4552E679DFF66EFF39235183E26DF4D23CDD284BE2D9D706A301CCF33D0C85DAE62ECCBACC1503246B853603F68DB14C2E0B972BE2AAE6856BEEEF83DE2227AA876E5DC62636E2E95BCE79597E01A5A3FEAAFACC205AB09FFF7641BCE3ACEBDC6E6AC2C95276148543F2AA1A4E949DE5F35F4DC1048824389CB90910D47C7ECEF591BAF68D6A456B79278F356A6C34AEBC370EAFB722F0791033708C24A3CCFAEDCA515C6DC1B83B85251A2F665B3777E1805FC8F98F9789944139C60BB8AB0BFA34D3783599707BD44CC99D2E4ED71F31EF7AE6B8FBAAA4A5377DF40F8D6A4C1F720159E57718C78FE40 -rho: 5AE5192442A0894AC775D84419BB7EDE9E8143A6E21CD709A47B58545EAEC7F5 -k: 9EAD08050900CBCF4093F9327CAD67B7600D9F8425084B6905BB6550F426F58B -tr: 27B47C434BC194D466D83C14BF5ABEA249E05287EC80D1B56BD0824E4EB84CE1CD4CCD0DBD1BDE59106AE10516E1150E841B03E759DFDD930F6C7BAC85753045 -mu: A12A0CBDCEC8AEF5EC6AD85326CA82938BBEA6C371CA19083DC23BED8053940A544CA299C0CF8AF2DD7BDA21A995598DB01944BAEC75E78D9774652CB8CB3250 -rnd: 0000000000000000000000000000000000000000000000000000000000000000 -aHat: [[[6040986, 2350664, 1214746, 7632339, 2508550, 633397, 2663794, 7047179, 821075, 758878, 8358712, 1928899, 6060553, 760254, 7369556, 7140499, 5751989, 2504697, 5094036, 4563991, 4073328, 5622919, 6029102, 7379655, 7672951, 3416667, 6485296, 2830854, 2621718, 5963945, 7183670, 3586882, 2852838, 6786342, 2722121, 1503122, 2769766, 1427614, 7088930, 4600100, 8250050, 4813409, 6980912, 996957, 424822, 8000666, 7168583, 6950036, 8032196, 3564965, 6073353, 5931172, 7965533, 4375723, 6870372, 4198660, 8122158, 1243945, 5946829, 4007480, 5577699, 5764870, 8198821, 3235891, 3775167, 7793765, 5103782, 7141522, 3760488, 4589128, 2336101, 4457102, 4358559, 3193742, 373175, 7970714, 6877204, 6792324, 937506, 3123328, 4921926, 2848763, 3843554, 4543318, 5220100, 1044889, 6976011, 6616235, 1422172, 6498443, 8067844, 7151509, 6940488, 1358047, 5571135, 299233, 1372766, 6104339, 5198985, 2782218, 1342478, 3375712, 8183129, 1065696, 8012685, 1045386, 6354609, 2986786, 4663298, 719975, 6282346, 7461351, 5956596, 1063719, 4931518, 4651650, 3736048, 1755530, 7231879, 202559, 15167, 7300860, 6786295, 2490106, 6023958, 6389610, 4719427, 2776704, 7744577, 4661900, 2162433, 7843585, 5312677, 777875, 7056587, 4051586, 3478653, 4103665, 8137683, 7838098, 7165642, 805903, 5308595, 7882519, 4857878, 843301, 1833251, 526798, 4160036, 2013578, 5522673, 3075203, 203206, 5987368, 8194761, 291971, 369785, 802696, 6736990, 7473766, 3311312, 131382, 4296582, 6080976, 1675688, 7465367, 1257519, 3266340, 2060356, 5464389, 3980210, 5160260, 5507144, 3680373, 4341454, 6818539, 2503229, 5166713, 3174085, 5425190, 1262366, 7221283, 969984, 525652, 2577772, 7428087, 2183705, 3952735, 1766039, 347449, 3564017, 3307055, 917795, 3286384, 5329952, 5102294, 4346614, 7014312, 356924, 4283440, 2748067, 1580767, 5945677, 7713147, 2832096, 6137232, 2134942, 4635898, 5498935, 2047474, 4970409, 1778801, 5940793, 4251259, 5134961, 6853766, 6589754, 6504205, 2464387, 5640175, 1430364, 6437125, 5061577, 6037427, 3037, 5345539, 7571573, 6525051, 953744, 3474556, 169659, 1912028, 4376513, 8231914, 6844852, 716251, 5795044, 340017, 1946710, 6759462, 251690, 8170448, 251458, 5692683, 18769, 5759733, 7499596, 2345673, 7340984, 7323149, 2082272, 5564966, 6116153, 2370989, 5704252, 7193998], -[7400627, 6870200, 1419581, 6282757, 2134937, 2354926, 8261572, 5849282, 5519182, 7542763, 5975707, 3266136, 3059571, 5539098, 5795874, 1179544, 4284364, 120186, 2874906, 2071355, 4448035, 3222271, 3495009, 897168, 2388109, 1092283, 6550981, 1583447, 7538440, 5070538, 13553, 558889, 6245438, 2277600, 730121, 4532827, 1781556, 3420649, 2068783, 4337434, 2277661, 8049309, 6984878, 5931505, 7328016, 7074393, 2954725, 5965493, 5652142, 6625631, 6892203, 8125775, 5531168, 290843, 7260383, 612911, 5185051, 2614831, 4623830, 6291687, 7538505, 6320741, 3178623, 6905548, 6244890, 7781851, 5148957, 7636680, 7836589, 5249043, 388848, 503761, 4830466, 2345461, 4632432, 2259582, 2647329, 5661878, 1696911, 4429315, 5318820, 8326822, 6858526, 6403528, 4786259, 6835733, 1162450, 4506619, 755495, 3065292, 5922804, 697182, 1405833, 4372182, 3161430, 5449301, 3462775, 1764096, 5528444, 1025706, 2373896, 303720, 2108546, 7824951, 3596449, 7685093, 4828252, 8312840, 4772197, 2499089, 442743, 5932698, 3536734, 3324307, 3225526, 6591268, 2312992, 3567260, 6721063, 3851742, 810532, 5468890, 4771510, 6181777, 4789263, 6389001, 6813976, 2084975, 8171342, 7222138, 1293110, 2625004, 3294269, 82878, 3984841, 4821506, 6991945, 3159101, 4972272, 14235, 1504903, 8033692, 4394438, 6807836, 413940, 5738134, 5404032, 2256070, 5019967, 2339563, 5150354, 4386691, 2824836, 2869880, 2755542, 6337881, 4422618, 1155102, 5085714, 63752, 5365541, 4110836, 3466858, 4958839, 2577689, 6676325, 7236122, 6410227, 6332592, 3207179, 5959969, 2285320, 6225326, 928696, 2161402, 7687291, 5586096, 1194962, 104865, 2235291, 2217017, 41035, 3952855, 3753055, 6317891, 7609740, 2852994, 1551446, 3181894, 112819, 799673, 2204563, 6199546, 6085242, 4328109, 6492099, 4567643, 2465653, 3387806, 2040155, 3587722, 3084345, 6422377, 4743150, 4777413, 773516, 1273239, 346282, 7533928, 449658, 6425655, 6914451, 4777356, 5441643, 4856084, 6881040, 7058880, 7407460, 4823203, 5830854, 1188799, 5647284, 2706403, 1862090, 4604473, 152232, 2777889, 6195409, 2606489, 1035729, 220215, 7617107, 4930824, 5428395, 7863419, 4484121, 2705161, 3964671, 2871947, 7862108, 1004210, 6882610, 6522855, 5384088, 7874694, 3320238, 4790199, 417141, 3787916, 5820038, 6818634, 3480353, 4808631, 3711225, 8128642, 5819550], -[4853538, 5915247, 6459939, 623769, 866340, 1744787, 2650216, 1046178, 4635104, 1794943, 5661288, 8122745, 799868, 2108125, 3052542, 6100564, 2865788, 6089437, 5220755, 2037081, 4379922, 5582163, 2448088, 4504515, 5321899, 4613171, 406236, 8077470, 7990411, 1063724, 2934744, 4522204, 5842923, 3503823, 7185068, 5913346, 7828007, 5508785, 5321584, 7442301, 3024375, 3604039, 2734390, 5452258, 404841, 2384787, 1519097, 1455901, 2285989, 3628398, 975336, 1958834, 8266421, 4666161, 3631579, 3897372, 6221613, 1560914, 3263699, 4706474, 6036472, 6488238, 972056, 2716167, 5932873, 8293548, 2838850, 416571, 2106667, 6124679, 4260155, 810929, 2023230, 5985183, 1017564, 3659063, 7379451, 4089633, 5124208, 8360716, 4060887, 6833022, 7427054, 2912817, 1149825, 6188522, 6071188, 4993302, 6306037, 4231083, 3346406, 5297801, 2188233, 4080814, 1710296, 7819204, 5685176, 7328652, 5218298, 1959928, 4194539, 5805582, 6996022, 1042189, 5124908, 7241095, 6552674, 7833514, 4194524, 5644761, 6485081, 48588, 3792236, 436444, 3290049, 4492322, 7319406, 6770639, 4180196, 2912661, 6397747, 1422061, 8010635, 7786311, 5369737, 665976, 5217316, 7631112, 6310865, 2232768, 3618633, 1595379, 7909923, 4729314, 4564163, 5832317, 1725894, 5257592, 4167924, 6329239, 3759913, 4353246, 5025159, 3632505, 4678821, 425197, 2499814, 1033851, 782773, 5368592, 8003695, 4760092, 4504737, 5020982, 4782905, 8187276, 5344493, 314845, 8357378, 2226682, 3240295, 4440549, 764865, 5787224, 641326, 5594643, 8313230, 3881357, 1260517, 2766964, 5330606, 6922164, 5093003, 142392, 2114231, 2678808, 3783916, 7654186, 6299382, 464106, 6417625, 729071, 5000046, 2745435, 4067325, 7517469, 6362860, 6517993, 4509595, 7120260, 2434601, 3867001, 7129347, 4241221, 2224626, 5029728, 6586530, 6417395, 4487576, 404446, 3438979, 2371788, 4564901, 8206003, 2097966, 1550698, 3372670, 4764303, 719120, 4897600, 2406317, 8051463, 6929783, 7439481, 7869575, 5585767, 5862779, 6759326, 7562526, 6851477, 5108259, 1282037, 8038366, 1768454, 1995291, 7897783, 7577009, 7580388, 5156407, 3119265, 1616943, 6732731, 5094137, 5144998, 4103118, 1053782, 7516472, 2113499, 7612103, 928775, 8060362, 1169340, 3702717, 3062940, 3615559, 812523, 4173212, 4673563, 476588, 5367143, 7400390, 5268641, 2417345, 5804478, 1889545, 8277141], -[3916585, 1206507, 7616051, 1490935, 7681477, 4390106, 2603657, 5730813, 7464249, 7237698, 3578248, 568065, 4982191, 6213955, 6384033, 3672923, 4717541, 336488, 7221385, 615973, 764226, 1613342, 1246937, 97773, 5364192, 3685094, 803120, 937091, 1687667, 4394966, 7290406, 1687650, 7635845, 3949325, 3886352, 7852358, 1765082, 4090215, 6128515, 4539939, 3652634, 5188739, 4390586, 5199000, 6613748, 3286640, 4254635, 7063028, 922375, 2030990, 7041584, 4262137, 1681998, 3063411, 5452184, 6166809, 4556276, 414742, 1810769, 212236, 7468167, 4316928, 818734, 4333750, 2240541, 7864948, 7378612, 5924823, 3425348, 3860587, 2129696, 4968571, 1791832, 3508992, 8170303, 2889471, 3042330, 3232357, 3029026, 4978007, 2691564, 2240364, 188587, 7152960, 2739076, 2672481, 1010789, 5488065, 3970830, 5916842, 1588309, 7040781, 416653, 3317316, 3092535, 1565174, 6761026, 3269781, 3966978, 1437541, 5400410, 833755, 5718359, 2934489, 5036070, 6634214, 4942721, 3339684, 305306, 5667871, 1731480, 8329642, 5132373, 4624986, 1377978, 318062, 5760584, 2624957, 5503689, 8204506, 2766223, 6193133, 5123684, 3154130, 8106880, 466003, 5463043, 658514, 5667837, 4055595, 3535682, 3496767, 1114431, 3219882, 2635973, 3952966, 2367373, 4796374, 4546132, 2231085, 4268517, 3879949, 3405663, 5846403, 3639589, 877294, 337978, 2677033, 5358393, 7644305, 3871781, 7172891, 2308052, 4051605, 8129219, 4750611, 2045710, 4229823, 1761920, 6713159, 1463876, 6332328, 8008486, 5590536, 3724686, 1727507, 4914229, 7917140, 867080, 974839, 3448358, 2008336, 4359491, 3390669, 7756766, 93104, 3483049, 8224409, 7227294, 6435410, 4843071, 3257605, 1304406, 4873970, 4994857, 1386668, 272858, 3140550, 3513453, 1039773, 2013547, 7355417, 3062993, 6210376, 6532551, 4727020, 1162842, 4356968, 4312146, 5526594, 386527, 2075986, 1632091, 6825230, 6849077, 7128308, 8274619, 5213217, 5602993, 4477639, 7284067, 6538728, 3760874, 7570530, 5902036, 4147590, 6513061, 6225644, 5911373, 3471479, 3246988, 3568867, 1175643, 1505016, 2549273, 6989750, 6079665, 6245893, 4972101, 5156682, 4958438, 4755302, 2601190, 2068972, 2321962, 6144658, 4523163, 6015871, 5578888, 560943, 7184031, 8184715, 6264208, 7459668, 7256367, 7127086, 7971736, 4725900, 4714203, 5100592, 2354309, 5993817, 5770704, 5494745, 4044922, 7669754]], -[[943959, 7939384, 3714210, 3779061, 3532517, 1733564, 3701928, 5174646, 8297884, 6102742, 4457757, 3421267, 6110238, 2334728, 340452, 5776822, 6474300, 3130351, 4372768, 5996505, 5052928, 5814508, 2131019, 7338319, 3644226, 1106524, 2526268, 3905430, 4494217, 4191473, 304496, 3199683, 3717876, 3081250, 5719122, 6030393, 1954531, 3817209, 8005103, 4965486, 1758713, 5413977, 82479, 7880951, 742237, 6002511, 1394290, 472533, 404021, 1882170, 4032671, 6432358, 6795388, 2443002, 5889884, 6171124, 1964878, 1771943, 965911, 927593, 5902067, 1522949, 3939619, 4680020, 6889907, 2413868, 7858643, 3017252, 7058517, 3737157, 4959766, 3958362, 375084, 5506268, 7535769, 4390403, 490498, 2573136, 662004, 1488585, 2721182, 2672427, 1334673, 2356143, 2930290, 6041728, 3249280, 591357, 868996, 2325971, 6098676, 2780586, 2161230, 6143945, 2686827, 2300228, 7967951, 1018711, 6261457, 4960894, 6235685, 5885644, 2589026, 911483, 3642627, 4421007, 4514757, 6550697, 27446, 8060107, 3211014, 7898656, 5584780, 4581466, 2126052, 4605312, 6885237, 5669562, 3727218, 7225366, 5368400, 1979073, 5683812, 2708226, 4454797, 4688412, 1769119, 5926660, 4563037, 4462882, 7745003, 1049874, 3534476, 3358910, 2954672, 7084321, 2060171, 3908503, 8272077, 4253294, 7516237, 2651887, 4003822, 8114374, 2947161, 2748585, 852854, 6176299, 6502819, 902094, 3486913, 6841190, 49662, 3403925, 2471537, 1881602, 7599355, 6369915, 686662, 5618445, 7842347, 2225164, 7245678, 1913838, 8331607, 2717159, 2683038, 6109921, 2843752, 7749817, 2833474, 1355177, 5481326, 8067483, 3803983, 7763620, 3050005, 4407253, 1657589, 5148605, 5016304, 185227, 4808840, 1289373, 6740904, 8262553, 1273329, 8115749, 3017499, 7292218, 6497792, 7550433, 4091032, 2143791, 2460490, 6212132, 8119137, 4347484, 5005034, 1684746, 3548730, 5501499, 79497, 5552699, 3997816, 8262012, 6267241, 6959093, 1694467, 2201802, 5685642, 779698, 750559, 4476308, 1836786, 4050375, 6102774, 910865, 1589976, 7915433, 4934361, 2328018, 8025883, 532075, 6465207, 7431440, 2470382, 4601581, 3279614, 8271024, 6675761, 6023468, 6856373, 6864428, 5601183, 4935051, 6199641, 5463351, 326921, 3032141, 7431480, 5431912, 1539503, 3678946, 796191, 2570078, 5375508, 5014384, 914800, 3591309, 6887978, 6504111, 1274063, 2357688, 6056808, 3514954], -[5477485, 2611553, 1259502, 2429692, 2155400, 5304211, 108616, 7182226, 5890307, 6712102, 4890109, 3285941, 5670628, 4516456, 1881767, 1532264, 5785651, 3643681, 7558957, 866280, 5474191, 5168458, 5352260, 5765163, 7527682, 5531228, 5949368, 8235171, 1609466, 5179517, 5716509, 5071034, 5411802, 2123764, 2395459, 6623179, 7810236, 5986950, 5436983, 4530726, 6467720, 3776060, 4946082, 2391326, 5006656, 2498454, 2271349, 405023, 674230, 5845937, 7903681, 3409409, 3438532, 3476555, 4007833, 2464115, 7670651, 7137671, 1035547, 7750171, 3347655, 1822552, 8079398, 2571881, 3221957, 3986260, 6071756, 5558671, 7269962, 2145085, 6390803, 3604702, 1435387, 420237, 1043670, 5116954, 2472428, 7149441, 1429561, 3308342, 344940, 5431288, 2486291, 4211372, 4227623, 430553, 3867634, 1101067, 2526803, 6835425, 3430778, 3909184, 8100403, 293741, 3372164, 4264601, 1554039, 2477471, 7970317, 5076852, 4977799, 7789276, 576961, 2830066, 4302902, 4364376, 7674461, 3765539, 7611145, 1651007, 921371, 7090990, 6521421, 3287635, 8218714, 6653295, 815643, 4430270, 959047, 2516027, 5628866, 4883513, 7046453, 7713656, 4569333, 2985039, 8152827, 749491, 559814, 377076, 3432561, 965264, 1572302, 5357870, 7185653, 6272776, 1234654, 2087855, 2321320, 3348607, 4203379, 405898, 6991254, 8098013, 319283, 5630003, 6944629, 5576041, 6511440, 496114, 5712949, 2969403, 6489143, 2621990, 8305639, 4908298, 48187, 3429344, 4532854, 6832322, 4123672, 94210, 5413908, 7500165, 5636879, 6755228, 1903555, 1180252, 3438774, 6830089, 2105691, 6266992, 6032013, 2602148, 7541627, 489068, 5707446, 3858943, 1317006, 1669685, 4828512, 6764954, 5818989, 1772850, 3219865, 3994867, 2711441, 1113378, 1297267, 4574730, 1213680, 6445830, 4664725, 7484632, 1630526, 3534856, 2361491, 2273748, 3985715, 8048616, 6560596, 3538090, 1876081, 3940340, 365648, 5176385, 1655910, 3156679, 694083, 1752647, 7740301, 3116345, 5231813, 4229458, 8311039, 7551996, 164738, 2517303, 7156147, 1462147, 7629657, 3125879, 1268394, 1294279, 293896, 1964874, 8353743, 5959680, 4394843, 280307, 1312690, 1414413, 526453, 2446659, 5006392, 2679129, 5035671, 420049, 1019204, 1334255, 2683529, 3329910, 6701487, 1570643, 6666619, 7228976, 768790, 7411802, 4798054, 7478657, 489634, 1557118, 5070996, 8058851, 56261, 2422508], -[7915225, 4356971, 5032330, 4384725, 7883036, 4028534, 8055029, 267544, 7542538, 6772860, 7559022, 5734317, 3926646, 4942056, 5690476, 685077, 2090582, 7225046, 19007, 6745057, 5117744, 6860211, 5478393, 217967, 6532812, 4286124, 6924643, 8101335, 864043, 1551549, 6513821, 4081011, 3329965, 55641, 3753397, 3580005, 4976850, 7512819, 6134790, 2982428, 2002471, 3736587, 7874148, 5803081, 2512006, 2550455, 3438734, 2417623, 3404263, 4933986, 6213443, 7083184, 6916985, 6474335, 4017514, 4712230, 553325, 2359538, 7494780, 1718149, 7869582, 2123262, 1824898, 5091796, 2719332, 7738020, 2629477, 5326493, 7418583, 1296640, 4159118, 3293871, 1622681, 4324320, 5867231, 871359, 6734276, 4579750, 376625, 4088782, 5800814, 6832260, 5019301, 4856215, 6998676, 532380, 1763354, 7399583, 2976755, 4716213, 1430434, 5202023, 488578, 5276093, 6264559, 5517229, 1068912, 6777192, 4657847, 2152256, 4410805, 760007, 5863510, 5798849, 6975929, 2820812, 8039782, 7146821, 6681860, 1019625, 898443, 5361564, 6708253, 5753615, 622015, 6006207, 1406548, 3626147, 6824846, 8125892, 5278510, 7814767, 7675451, 6359885, 3798106, 388249, 7814157, 2012772, 6721072, 459479, 8265673, 4867464, 5496566, 3597616, 2770584, 7700804, 6290512, 1301340, 114523, 7566454, 1510365, 4379545, 2726916, 561870, 8048211, 758285, 239127, 5071102, 1725545, 4094057, 2404891, 1962107, 6655152, 5066933, 7332889, 527396, 3507026, 636480, 540139, 1047993, 544511, 2243964, 4901676, 347561, 2550825, 73706, 6049842, 72448, 6474990, 1131124, 6888056, 1746282, 7207162, 3883198, 223896, 3437887, 3089299, 7250264, 7774651, 7616501, 5025927, 1974133, 7703449, 6502031, 6404627, 3886706, 3260730, 2736627, 5604043, 7427473, 6624331, 7569725, 2499752, 1852045, 1975181, 2221242, 7091308, 453529, 3105323, 1300798, 4461636, 2624177, 3413292, 3685876, 7632686, 6277789, 816205, 6743846, 850139, 6891018, 2602942, 5703447, 5401554, 567771, 6712413, 1581149, 4118778, 1350212, 6268856, 7150293, 8079643, 2746562, 3297139, 6216809, 12651, 860094, 7647487, 8377669, 1827068, 6024422, 217447, 2881693, 4184318, 661362, 3973412, 108488, 4160964, 2707377, 599643, 7164804, 2021045, 937318, 5148154, 1862205, 362759, 4908556, 5072105, 1998547, 2566508, 4022100, 6018342, 8351838, 6855323, 7725886, 2173906, 7406255], -[967844, 2541863, 1434278, 7791641, 6290694, 477058, 2117736, 5389582, 6432849, 2186234, 5524702, 1879624, 5388089, 3042210, 159604, 4293019, 3327343, 3827274, 3412627, 6571396, 2326984, 7516402, 2948752, 671201, 3450320, 2904095, 2538269, 209490, 6274644, 3976807, 3792786, 1039704, 7763789, 1315608, 7133381, 6502861, 6344955, 8276070, 1776713, 4194447, 2604416, 7377652, 5021967, 6299819, 4922686, 6707320, 856267, 4889566, 95774, 4868956, 5486333, 3358981, 5770324, 757260, 8280508, 7044409, 3907599, 1168006, 2720775, 6664087, 3231803, 5644718, 7052649, 4799256, 3568850, 7429051, 1105175, 5304811, 3650174, 1815613, 2640843, 8115575, 2559589, 2356591, 7137220, 3577900, 1932301, 6768823, 2556418, 5696253, 5969922, 4228867, 3561451, 1018706, 3254167, 4583464, 1838871, 6144598, 4803200, 1350593, 4673289, 3056202, 8022786, 2108074, 7011624, 2721083, 921786, 5488784, 5391012, 4853305, 1530682, 5034814, 4738978, 980082, 2142703, 1081476, 6618148, 7642423, 8199177, 2433260, 5146648, 3327993, 4912906, 2341023, 5516987, 1731669, 7325564, 6091134, 2151067, 6250345, 2122742, 7838557, 2212290, 77283, 5755893, 1848073, 2338603, 7979592, 325507, 6204273, 672900, 8286658, 3506648, 2304161, 2600966, 4085952, 8272204, 1701937, 1345748, 4039812, 6324055, 5971923, 1424390, 537097, 25133, 6555649, 2978522, 2908926, 2705280, 5905685, 192790, 1718596, 4829328, 4749325, 4006797, 5895057, 2841282, 2897179, 7328882, 3800821, 5569747, 4303259, 5100988, 4926991, 3159362, 2012950, 3107380, 4171473, 7238795, 1307102, 6318211, 5573980, 5972942, 5475298, 2949982, 768498, 755622, 1101003, 7547127, 7134264, 1746475, 3135561, 7822619, 7756816, 2975015, 3043018, 6278447, 1068710, 1923466, 5402567, 5863669, 2067185, 2141560, 766277, 1197154, 7698951, 4263338, 8347598, 4094660, 57322, 764577, 2342424, 7288869, 2766171, 5014574, 2916582, 7099545, 6014113, 2894218, 147510, 456445, 4967372, 2653805, 4077958, 6616736, 5733628, 7939204, 1738532, 2604714, 5598485, 7814931, 5350288, 2920940, 1508954, 106263, 1763058, 96765, 7448207, 1673518, 4350710, 4737780, 3273607, 2484428, 2451107, 995118, 2388633, 2702217, 6740080, 4563890, 5427169, 6878681, 3714471, 589067, 6625361, 4987907, 2920346, 5817314, 6249538, 6156545, 2366813, 4040640, 6129527, 7607252, 2882841, 6965097, 3968827]], -[[1250521, 4914661, 3956311, 304150, 1808420, 6170884, 4896688, 7569431, 6368685, 5599167, 6795675, 4292470, 2230677, 7633465, 2348413, 940116, 4197286, 5181628, 633589, 3734563, 888025, 5877099, 6912313, 3225327, 6168885, 1398850, 1260883, 2529837, 8871, 4657687, 3154945, 3891835, 4044599, 1597732, 941904, 1226071, 5828122, 188477, 1812902, 309821, 3058862, 7881988, 6717771, 8085074, 4817867, 6522016, 5894563, 3063915, 17188, 5420681, 4378541, 671435, 2546654, 1633532, 7378333, 1546991, 8290543, 1901423, 6940229, 3737986, 6558717, 2350480, 863912, 1170733, 6730828, 509628, 5744393, 2164437, 4843824, 4444118, 5865494, 4538355, 7650974, 347132, 8076471, 7353549, 738256, 1573735, 5040738, 7545240, 53326, 7286109, 601174, 578330, 727880, 8107056, 7822019, 8280943, 860141, 6654304, 6215871, 7093700, 455064, 2220824, 5904819, 4669190, 604607, 6715927, 8152756, 6500941, 6829124, 2608008, 938444, 6678466, 8000825, 6170351, 5107097, 8289501, 5952719, 6842136, 4952404, 3096467, 4858456, 3622324, 7957037, 2316384, 1254244, 1750463, 4730756, 4371115, 4043479, 7024431, 5274554, 206505, 873873, 3135298, 6585393, 1752434, 5220777, 4886195, 2226409, 6458321, 1794860, 1607596, 308189, 4035096, 2446644, 6945980, 867185, 533349, 4108847, 5508751, 41313, 4773383, 184836, 6523691, 7853447, 6367620, 4301343, 3127986, 635037, 3733509, 3790433, 1228502, 10727, 6424167, 3821829, 2497613, 3611480, 5177044, 7068318, 4068346, 7265964, 6602253, 2580175, 2659637, 1671411, 7896097, 1390867, 1465099, 6412807, 4846411, 3058749, 3751032, 870722, 6547110, 2921172, 1819100, 4777710, 7203515, 4542572, 5127533, 124634, 7114833, 5110276, 6830038, 502569, 5970676, 3315504, 3756423, 1475614, 7803568, 6215874, 2489806, 628473, 5895680, 1324931, 8005015, 7919696, 4665338, 2107062, 2721343, 4347300, 7521310, 6004717, 6845564, 4160645, 6416432, 2694617, 7374477, 5565378, 3615914, 6300703, 6214750, 7414747, 6636766, 5236917, 1383523, 3071592, 2927893, 4380628, 1130080, 8327431, 3627953, 2388826, 5835976, 137133, 2504395, 7013150, 551102, 3960135, 450100, 1465251, 1862173, 2150067, 251808, 135884, 4048771, 835819, 407676, 6791818, 4630958, 4748100, 8373532, 4385037, 876026, 7199354, 2730815, 7368818, 332800, 3455059, 1855042, 7181968, 4749469, 3276030, 7493616], -[7723786, 1986439, 5167384, 5129199, 5986250, 5843946, 2363491, 5431901, 5836706, 1548222, 5312317, 2608992, 4175032, 5499437, 2380595, 1418505, 1681347, 3361875, 2502457, 5927211, 6532917, 1722151, 5506086, 8156520, 1833901, 8337805, 54942, 6907445, 3041590, 6775081, 7689834, 1112730, 6089735, 4427719, 3986338, 3666144, 2884735, 885358, 5929704, 1568826, 2843111, 2031425, 4944157, 3150457, 4761517, 2340867, 4804268, 5239327, 1582801, 8077184, 2409928, 5998099, 1643581, 1506376, 1555792, 2763346, 7551387, 4124739, 2420905, 3917803, 3408958, 7483458, 6642263, 5472650, 3548981, 5631632, 2459935, 2594235, 3737163, 5555506, 239976, 1909749, 7707760, 7819175, 4955017, 5660349, 1852543, 5542733, 4395805, 2541381, 671357, 8061464, 4632161, 8084452, 2521347, 7340554, 2191944, 7157303, 2893221, 8284036, 3680207, 1881790, 8048710, 7291868, 8099313, 522341, 319805, 2136804, 2022349, 2492478, 980679, 1292653, 3526436, 1421233, 8356279, 1350398, 4496600, 4087872, 5451796, 7787515, 83947, 420963, 6441117, 6235876, 114846, 6033746, 5881080, 2946885, 282160, 4141534, 2960904, 4476822, 3944605, 1555692, 5655704, 606960, 2806244, 7154700, 3314822, 8038635, 3970295, 2013060, 7843291, 3586336, 7516901, 6989869, 1849847, 1102909, 4391909, 4341038, 5265586, 1963810, 4752051, 6719792, 1518053, 4097171, 340894, 1709789, 6291899, 3861046, 8189247, 7533039, 1084567, 4838401, 5385028, 5124206, 4872182, 1422365, 409212, 1779736, 3736379, 1379753, 585809, 5144178, 1707854, 1258045, 3077614, 226126, 7707359, 2651632, 8314640, 1538874, 7650980, 7900836, 7166545, 5201702, 5754699, 5452038, 1822486, 3089098, 23479, 2411462, 6071592, 991129, 5024374, 3154941, 5895839, 841184, 4841739, 7275841, 2484713, 672514, 5422246, 895173, 3758110, 3531791, 5759418, 3986745, 1493773, 3352426, 5483284, 6434390, 7281801, 5534272, 1076227, 3186270, 3556199, 7837551, 3483822, 1647286, 801830, 5008096, 4797599, 7660617, 1680182, 3901719, 3403778, 5608267, 6310954, 7247455, 7963819, 3608211, 8358323, 3601713, 690378, 1865087, 343295, 78952, 6322561, 2237835, 176870, 4925674, 5296341, 1078801, 7218621, 1801092, 2226042, 629470, 3708705, 1252749, 3856157, 28744, 5807092, 5947434, 6699157, 3645627, 4134974, 7369092, 5762212, 869676, 6000296, 2144590, 3671731, 2868805, 5560276, 5729186], -[3975431, 4948822, 763025, 65789, 4414616, 6756589, 7422492, 4171291, 3197578, 4422295, 1518670, 8127993, 6088136, 2061394, 7026758, 3450526, 327492, 8192319, 7060189, 4417964, 636452, 7416154, 3022659, 6488427, 1466493, 4040701, 7594229, 3813765, 6603185, 6483726, 3489088, 616672, 2987084, 6473467, 2838705, 5712190, 6995424, 7169136, 3901932, 500731, 4523292, 3587392, 5666900, 6379705, 6194988, 1364979, 8264532, 6150681, 496511, 4971422, 4044652, 3106289, 667489, 75218, 2919672, 4091625, 4361129, 2889576, 6306681, 2129137, 6146160, 4851695, 6254983, 2321029, 7541271, 11430, 1613832, 7839761, 706482, 1343049, 7067, 1561107, 6109439, 2628540, 5537288, 2656321, 2493023, 1732303, 6494908, 6920116, 5072570, 2460893, 3114078, 5728547, 4525953, 6099069, 7371451, 5016200, 5135550, 2398642, 6079257, 4375107, 1487911, 192899, 6437836, 5747514, 5262209, 7739127, 1193296, 3522141, 4386115, 7974882, 2327045, 1822958, 2705572, 1201582, 2684857, 2744602, 1298710, 923635, 4596572, 580899, 1412398, 1840073, 318606, 7194574, 3791402, 3092672, 571145, 2923260, 6141519, 723175, 1621410, 5887665, 3015737, 712414, 2809743, 3143293, 3098120, 496597, 1667892, 1200331, 2957629, 218047, 6742990, 2416117, 3499071, 8127702, 3072734, 2636835, 4802538, 3797170, 4147332, 4599309, 2168363, 488328, 7769689, 4730130, 7440460, 777040, 2512705, 3901243, 4725457, 3243804, 3523967, 1922704, 3583958, 3584608, 1443973, 763019, 3926101, 2467018, 3753960, 5205545, 2408814, 3890817, 4678757, 2422162, 5762203, 4420537, 4728893, 1736897, 2215484, 7291610, 7589211, 5336290, 2015100, 3723806, 5041412, 3489590, 2674858, 6616899, 3597229, 3359974, 3603425, 1199764, 7444555, 4138384, 5974832, 3585020, 7306856, 667733, 6654867, 7369705, 3505879, 6246192, 4153491, 7083579, 3394892, 8123235, 4169877, 7212789, 4753205, 6262295, 5558100, 7045282, 7022381, 5482237, 6598016, 7027625, 8087538, 8014063, 2717139, 6481772, 4351022, 6083588, 3758705, 6210218, 21702, 2517591, 7788963, 409959, 4108038, 4024168, 2410576, 4343751, 6800111, 7426274, 1297907, 3162456, 2935484, 2392072, 3660222, 7345270, 7620665, 6390632, 7840479, 6726748, 6545381, 8116470, 2125240, 1244667, 7438344, 4590609, 8297936, 6715183, 1929018, 342968, 4187636, 6167731, 485377, 8366734, 3443058, 3061628, 5999351, 2578700], -[2372094, 5397346, 7224234, 4647690, 1380723, 8020559, 7654057, 3062121, 7027898, 2226550, 4801860, 7819970, 1451714, 5809247, 6771665, 7292397, 5633880, 5755388, 6298762, 241822, 3093555, 5288614, 1200449, 4057770, 4010560, 6091691, 2411704, 6690184, 24808, 3290777, 3330515, 1500509, 4934671, 8298145, 3752881, 4385658, 3493371, 2594776, 2532073, 2021125, 1907527, 1111563, 8121148, 2949828, 7276406, 1184130, 2966417, 5332728, 2270445, 7228250, 7719894, 7951793, 2504903, 5384899, 3735175, 2956435, 8243568, 1200863, 233943, 5331856, 140296, 8349564, 6264093, 214046, 4442726, 4765155, 6995858, 6869843, 4904125, 6406765, 5976151, 7326691, 6316510, 6195709, 8217547, 3269135, 2505267, 672193, 1400606, 522548, 3843656, 5824902, 1186331, 1919520, 2187381, 2297754, 3394597, 7199550, 1416201, 6836040, 3458096, 2459218, 3201773, 6079244, 1735371, 5859952, 2380644, 4190148, 2763549, 3016070, 2357671, 3388458, 4643918, 5488121, 6423039, 4901896, 4218493, 4508152, 5175428, 3443569, 1644332, 6743827, 4643699, 5994407, 2672475, 7509641, 5789301, 516721, 6607249, 5390605, 7436402, 2274185, 4222038, 6389618, 2597747, 6287010, 5708276, 1408003, 2148485, 5344525, 4019942, 5614433, 3270875, 6625112, 7928832, 8268274, 1203449, 890712, 958002, 7110952, 1514749, 8045792, 369413, 3321235, 944235, 4068640, 2858621, 5609734, 4226436, 6302302, 4468522, 3295654, 8295655, 239387, 209353, 5667091, 7875188, 2311537, 1773236, 3554355, 4935697, 7464904, 5137013, 7192813, 1342904, 6440806, 4986357, 3913888, 1866355, 6035857, 7174788, 1413502, 7948842, 8344498, 3961707, 3313637, 7275853, 6360175, 886233, 3682457, 7803874, 7738724, 3862360, 7236074, 1812187, 4543661, 463956, 5840977, 8362107, 3001281, 873843, 6328285, 3972329, 3574178, 6964901, 5123406, 3555370, 195722, 2847001, 3331011, 5596729, 4561019, 686072, 2401930, 4893025, 4659334, 2723055, 1913031, 6963739, 3143281, 2391048, 2476051, 7447234, 627228, 3371897, 4251975, 3317739, 1839326, 5126002, 4199130, 6664575, 6940244, 4893432, 1253235, 172273, 6787670, 2320347, 2982261, 6942603, 4837322, 7198513, 7290153, 2404245, 3576506, 3725220, 3237445, 1428908, 7948567, 8113739, 3796587, 1239308, 2266244, 8136747, 8058820, 1733802, 651103, 5286921, 2158029, 2198421, 1145401, 3542003, 3761123, 1871601, 2807334, 475599, 775870]], -[[1286566, 1892857, 7600279, 2094394, 3830016, 1410580, 2187758, 1207715, 983845, 6450122, 5787642, 4170645, 5728402, 3347029, 4856373, 5635836, 4279081, 5025224, 7525090, 458210, 8528, 2824407, 4403511, 1454742, 121667, 7059016, 255208, 7606885, 7341947, 8369331, 3140002, 1121527, 7772268, 3280030, 6056826, 4447171, 922549, 6232653, 438060, 1134790, 5847510, 674793, 272422, 7548664, 2090286, 1656050, 3191995, 7929149, 5841385, 1589763, 6507932, 1684859, 2559409, 393613, 4917930, 5866357, 8152257, 5628975, 7764787, 5819603, 1936646, 264682, 3253259, 322770, 2978668, 6972763, 572826, 7385941, 6828008, 365200, 5254467, 5750234, 958015, 1761079, 5871793, 920410, 2725801, 1540587, 3762911, 2479543, 1441646, 8140907, 5767455, 7987034, 4286505, 798500, 5455498, 2465585, 984338, 6823195, 6088289, 4531471, 3119328, 787461, 4466633, 4373545, 7528150, 1326535, 5054034, 3883314, 3334611, 6235707, 5217727, 7555014, 5405777, 922409, 7757515, 5517540, 6864727, 2800677, 7818476, 372203, 3457870, 6644441, 5476661, 4789628, 4659073, 7731027, 3993627, 6787204, 4609415, 4928619, 764979, 797306, 2056368, 3750402, 2750494, 6823131, 3620629, 4116279, 2378108, 4042587, 2047942, 8201847, 6471231, 4238807, 7036094, 4178322, 8103240, 7124277, 4435367, 213797, 1366494, 4757420, 2346950, 4954200, 5178234, 4436863, 4153121, 4014457, 6087867, 6261739, 6133482, 35806, 958315, 1534562, 4135704, 3827386, 6753728, 2235731, 2369747, 8123199, 7884249, 8128961, 392580, 24889, 6465333, 44608, 1313336, 4856377, 3547043, 5382818, 8008553, 1954568, 5174489, 1861350, 2075304, 7487212, 6490783, 7708676, 5183968, 6756258, 450512, 5952302, 7005617, 2107318, 4335687, 1911349, 2708213, 367782, 5483115, 3066429, 2700, 1842837, 729992, 3664833, 2670527, 3734899, 2402851, 5662899, 5085488, 3815157, 1437075, 755647, 1187904, 3012138, 3678031, 7517031, 7810247, 558392, 6194713, 3344003, 3337589, 290725, 1636009, 3251352, 1878557, 2742540, 3172815, 4577216, 3181422, 2625911, 648306, 2947540, 5503827, 1074046, 7394177, 1770955, 6784500, 760925, 5882413, 7977793, 5616699, 1638150, 2322476, 3510936, 3558911, 2130310, 1434531, 1556585, 3011019, 4079911, 7410377, 7751685, 3136624, 2042079, 8156182, 2206915, 2477664, 3357698, 7769443, 238446, 5013706, 6890552, 4298398, 6226006], -[4597438, 1858914, 2048909, 149414, 4881059, 5550767, 3233540, 7590486, 6645948, 2271790, 4936024, 7436776, 1975151, 3365797, 8055158, 6369121, 5167870, 4133220, 886117, 1097887, 1483599, 3659288, 52859, 4920779, 6841182, 164338, 6324255, 2355270, 5928037, 8270143, 6601159, 7650881, 6932785, 4310607, 109897, 253901, 5054724, 1034080, 6860941, 690906, 3615750, 3551291, 3358628, 1064873, 5741611, 1304492, 7985020, 7188049, 3331060, 2969779, 7672962, 3800628, 747425, 2396944, 3519915, 1556844, 1250210, 7292915, 8208532, 4934132, 1499663, 2852574, 3928550, 8144814, 6268265, 5123984, 6494442, 6268404, 874793, 8323509, 7531644, 2753878, 2974698, 8108967, 3314173, 6211937, 1102349, 6754938, 5659386, 5212740, 687654, 4064345, 4950918, 7332111, 6069814, 2962546, 5913673, 6720488, 5083138, 4842488, 4336189, 4565202, 8331225, 8211541, 1929906, 6922572, 3228353, 6162781, 194537, 5519547, 7471820, 652436, 3973493, 3546129, 2146384, 4834279, 7877176, 740881, 3741375, 7377531, 4180008, 3410734, 3080044, 729438, 3434440, 7759605, 64264, 6858484, 1577468, 3517288, 7844426, 3778433, 8336158, 839896, 471993, 1917498, 4214116, 3644363, 469839, 1613754, 23793, 4639432, 2786191, 8104526, 153582, 7869326, 1336389, 5629166, 715228, 2526490, 4672500, 5025599, 430554, 7452759, 3169052, 8023830, 4429010, 3530712, 3818850, 4552366, 1293181, 6806378, 2348334, 6179546, 8143805, 4676178, 6647487, 1129606, 4456050, 5946737, 6969638, 5285206, 8039335, 4333517, 6895662, 6020596, 1927229, 7207897, 6557996, 184152, 6738097, 3015963, 6070270, 2202268, 5791286, 4373362, 7546428, 3437216, 7568967, 7449953, 4525248, 336594, 985871, 7173260, 2419452, 4980606, 154127, 6400386, 1093660, 2370336, 5555039, 1658103, 973950, 7475048, 4376169, 6844003, 6554737, 6706622, 3728803, 6950759, 7059463, 3982715, 8366754, 5184101, 8012343, 4817353, 6819476, 7679339, 2883349, 6917692, 513042, 1148994, 6457310, 6535977, 3839278, 3416533, 7513884, 7945433, 60514, 547721, 5650212, 7935738, 4944070, 4893652, 1028545, 3551093, 7212200, 2314684, 5067894, 4739967, 3725984, 2481822, 5294700, 2061409, 2055070, 1808466, 2945795, 2955886, 4480351, 3961264, 8244830, 4531426, 242610, 7436456, 4492587, 567385, 2024404, 8320861, 7532621, 3606496, 5487212, 1207247, 1326056, 6828627, 8082761, 3988257], -[6415545, 5183767, 3793280, 3140822, 3501151, 4562966, 7366328, 5744523, 4336994, 5186210, 3928108, 1420493, 3675722, 7522454, 7842773, 6099531, 3645181, 3572654, 4756745, 1548390, 5831892, 3920298, 2393044, 6285228, 6441795, 3813227, 3815686, 7862948, 7749338, 5532211, 2664299, 4039055, 4528626, 175358, 4625507, 2489354, 4088684, 8190699, 3142575, 4774643, 576160, 2499333, 5787575, 7232277, 8349918, 4093253, 8020398, 3937728, 8316695, 2405469, 5926910, 2353314, 1059408, 2850163, 3157194, 1399243, 2139366, 195491, 5742659, 5325667, 8265517, 3502570, 2901749, 3938485, 6213467, 8053229, 2621618, 1285030, 1242346, 3173759, 6270555, 7422337, 970439, 1168402, 6272412, 1826119, 3788864, 7553947, 7974108, 4972367, 620046, 7390717, 6030999, 1473051, 1080671, 5427952, 5103294, 3088835, 6670532, 718221, 2094700, 3221740, 1508128, 1709962, 3690983, 6511631, 6612735, 344217, 4786239, 7849594, 3243305, 1574993, 1656797, 3089085, 2423743, 4112242, 2506510, 4872467, 3176304, 7868853, 3417709, 4786034, 3630913, 7336765, 7475827, 3986539, 7035953, 5232408, 5772024, 578508, 5061872, 5996757, 3974466, 2082171, 2626811, 3993370, 6994921, 5512177, 3384674, 2397512, 2580519, 5018224, 2806343, 2922219, 6427676, 5495309, 6643539, 7420731, 2847646, 1444924, 7120603, 2832488, 3257902, 3731264, 3446571, 6009375, 98182, 6507832, 5121108, 1214131, 6463895, 8286949, 1590106, 7196880, 6941308, 4815245, 1522710, 8096049, 2528946, 7056037, 4135040, 7024485, 5451226, 5126487, 4204216, 3262762, 1274387, 8338888, 6275653, 1633021, 446301, 137698, 7030467, 533046, 3111389, 3803015, 291153, 6979956, 8140828, 7675012, 6712413, 7814825, 8355834, 6699735, 8039866, 768856, 1322282, 3762471, 7418304, 2732176, 4523505, 7814750, 3541933, 756240, 4311591, 5329646, 8056989, 6669403, 3868780, 7157850, 208547, 8161669, 5137928, 6732707, 3094886, 7441864, 805624, 834529, 5627993, 7719531, 953493, 4343482, 8306310, 2058503, 2369152, 2490233, 193781, 1435984, 245229, 2348006, 6575035, 5104217, 3645215, 7249841, 5897059, 3241262, 47669, 6141227, 4680518, 6724666, 4736699, 3370815, 6361168, 359100, 2294821, 5308409, 3106567, 7197163, 4895696, 1363492, 7136673, 6618873, 3327992, 4078007, 5204495, 2695715, 5346679, 5306616, 7701022, 5127799, 53490, 605060, 5037181, 4919945, 5031195, 846999], -[7965062, 607644, 2309032, 2362594, 8260421, 7879312, 110959, 2350996, 702703, 7741031, 539149, 5773106, 95166, 3022158, 3317906, 1923911, 6167338, 3046735, 2655534, 525158, 3042272, 5290724, 8189567, 32847, 4107297, 2419793, 8313797, 3766935, 5258815, 6665926, 6696256, 2953752, 7298055, 7006622, 419777, 5241700, 6046739, 2397370, 4716248, 6976785, 7327031, 6419241, 7521092, 961119, 4595176, 6642141, 1427773, 1161820, 4615095, 6154554, 968363, 2387186, 5429923, 371797, 5014040, 4153830, 3395514, 5265524, 904460, 4356343, 883773, 1382843, 2148499, 563978, 2997794, 8285983, 2133341, 239434, 2121782, 6588802, 4767873, 6181611, 8357241, 3062839, 4509182, 4951825, 5033639, 3169328, 5032188, 4195990, 5106194, 2867161, 2557858, 2193590, 7421491, 3629264, 3129173, 5286339, 7256043, 2418304, 2570507, 8127689, 7720454, 2810982, 5571343, 4341745, 4861930, 262578, 2091132, 8310333, 3158351, 1532405, 8367992, 7305108, 4751817, 6950708, 1759001, 4309248, 2674236, 8353450, 6463959, 2698951, 3113187, 4001306, 1311319, 4668635, 7317375, 4621808, 1514097, 4531017, 7226150, 617451, 4396992, 2861365, 1982091, 1729732, 6288204, 2175692, 6069070, 5188985, 4432205, 5383122, 2497060, 4554289, 1915749, 358346, 6377223, 1893901, 2169346, 7147482, 5169962, 4222755, 3639693, 792583, 4650832, 7312196, 3791658, 6804120, 4592398, 6380017, 8067994, 2007970, 107157, 5381554, 5844187, 1480517, 4470892, 7841829, 6309205, 5076529, 5402678, 160187, 6846484, 530182, 4098294, 1878699, 6334728, 2055196, 2844029, 4151605, 3827304, 5852606, 1747165, 1767222, 5072173, 3552028, 3265773, 4890573, 2189271, 7501180, 3216068, 1946349, 2383492, 7739269, 2130294, 5009524, 3651266, 5937084, 6989388, 7927415, 509669, 4717418, 186952, 956923, 7329346, 3990036, 5569359, 2856246, 7586748, 4108732, 3647516, 5392871, 8056427, 1919460, 7745843, 6696542, 4984083, 1299456, 7218916, 3403678, 1720313, 1278490, 4163918, 8290156, 1681040, 707969, 5312310, 4651349, 5336590, 954991, 2452752, 6650679, 3772483, 4861858, 8113790, 4696283, 4604238, 5774658, 1958830, 8199028, 4288958, 5425782, 1709745, 5025098, 1374902, 1197773, 2852247, 2195543, 5307440, 2078658, 7176359, 1922399, 849968, 4134702, 4684560, 2018289, 7912848, 752394, 2308927, 5659476, 7331343, 6640917, 1468151, 7138190, 6826836, 2837496]]] -s1Hat: [[3780472, 8001483, 7484040, 4059895, 7647343, 3434819, 902292, 6727194, 2342222, 4671283, 2590107, 8356189, 3994258, 2362867, 1015481, 901117, 2057577, 3818479, 7514602, 2834012, 2872015, 1117313, 3754976, 4587196, 377034, 3596764, 3558223, 5346916, 4822395, 7541493, 4876216, 8013761, 4619399, 3884541, 7067946, 3288249, 3122674, 3148154, 5724895, 558455, 7148082, 4087158, 2706701, 6414162, 1600947, 6225087, 3488397, 1393499, 3407333, 6615811, 625797, 6745026, 5161872, 641377, 7117916, 1412922, 88979, 761715, 2736024, 844724, 5577113, 3935628, 50484, 277629, 3912207, 2716145, 336983, 6194732, 7956586, 2476195, 3213793, 736974, 7669490, 6591687, 5455725, 286773, 5798834, 3445153, 5264877, 6901969, 2918204, 6158632, 1247106, 1731982, 1224779, 2879753, 7766107, 1737079, 3712876, 1494224, 3627760, 4441196, 2559466, 2586371, 6665468, 3616081, 6369594, 3832102, 7177406, 387632, 5004314, 169531, 4466944, 5727377, 5450513, 1646717, 4314737, 4828468, 7556714, 202091, 573008, 1886421, 7407237, 4793758, 2516709, 1501952, 2912975, 501398, 1910916, 4258279, 6339988, 899719, 492320, 1248493, 627247, 7133292, 2363123, 5442236, 300666, 2307884, 5568729, 2746930, 8088555, 2797021, 6541834, 8353505, 1080202, 3170193, 1653966, 6027538, 5776215, 2476940, 6353397, 2062159, 7186611, 908166, 5273713, 2399920, 7983166, 212791, 158642, 2080870, 7778091, 6087871, 7653873, 3068291, 3471243, 2523763, 548390, 2196162, 1977811, 2079189, 4926090, 318216, 2468780, 7613829, 5752063, 6760760, 2051824, 7980632, 4174570, 6606611, 6314394, 8292559, 2073384, 2315992, 847414, 3481592, 3885108, 5408354, 708414, 1162338, 1920983, 7823037, 4025355, 1623338, 5431531, 108757, 5836508, 2473617, 7784454, 3992727, 1672043, 4791723, 4727614, 4550193, 4790100, 3833476, 2922653, 3293432, 5906689, 1820614, 316721, 6949903, 7057224, 4871626, 2215822, 3892485, 744545, 4575901, 7544641, 1375977, 1859843, 2889133, 3703576, 2985816, 5823879, 8180807, 4092816, 3114300, 4458987, 2094981, 3894080, 3088197, 6630018, 6601178, 457195, 3278540, 4485374, 834323, 5312864, 327329, 3136137, 8220473, 7266614, 2400672, 4409641, 104790, 5571322, 6634357, 146509, 475692, 411263, 3398622, 1722946, 7730545, 5654645, 5628631, 7355926, 5474327, 237898, 1259182, 7491577, 6184739, 301897, 5558578], -[7490143, 2416677, 6018412, 4886851, 4661549, 951995, 1217523, 200620, 4047296, 5752223, 5204483, 629955, 7868040, 5657793, 2519186, 7379324, 6277538, 4438049, 2975906, 941441, 5707699, 7778781, 3615008, 1962990, 397022, 4297837, 8139510, 4455900, 3297031, 977526, 1146196, 7692715, 8363126, 2989622, 7443475, 4686312, 829050, 2159711, 7873900, 7417623, 2355442, 636554, 5247813, 2741442, 1705844, 3349823, 512773, 5746069, 1410581, 4320810, 4748088, 2471804, 5681603, 1889210, 250418, 3375817, 1740586, 7023616, 1383344, 991532, 1386480, 3416571, 2991066, 7295662, 6752145, 399232, 2407594, 4220687, 6841208, 91492, 6385609, 6471466, 5440045, 3581841, 3238400, 1445899, 6591434, 6046404, 4175614, 6242164, 2069210, 6022136, 5396287, 3910328, 6091407, 5263676, 2078083, 8310059, 5899745, 2513494, 6955184, 5554072, 2000856, 3996830, 6460829, 798819, 4659061, 2571223, 3457056, 3531604, 6860393, 7486079, 3619350, 850669, 4037213, 4520361, 4151224, 305902, 5885218, 6147278, 7204562, 6570737, 2112376, 5430331, 3265589, 2035980, 4066990, 7654941, 5581671, 2580931, 857526, 544898, 5132083, 7632701, 1841308, 251988, 6742135, 3929132, 7342560, 4792460, 2584290, 7140337, 2952249, 2139281, 122010, 2950547, 3892823, 1059965, 4169551, 8171839, 3556085, 3444318, 7322197, 6219406, 2499331, 8169629, 1132692, 5614906, 1700320, 6982836, 3240404, 823680, 5894285, 6635759, 4479224, 7911155, 5433574, 957541, 2227913, 5233041, 8065525, 4708575, 1772128, 7019421, 7238940, 243872, 6408013, 2038403, 6415019, 7006297, 2470766, 3510418, 1917510, 4250390, 1146893, 260711, 3796860, 5299774, 1187338, 7287103, 8230953, 3188461, 5463536, 1432402, 4093616, 8168956, 1622255, 1249460, 1500481, 2902430, 286695, 4458792, 8148629, 5732743, 160205, 5113649, 413002, 6974928, 3793222, 559966, 8185373, 1419330, 99797, 2731143, 3156355, 7739043, 5036417, 4723991, 378541, 745074, 4385898, 7883483, 673438, 3077408, 7302415, 7313423, 891988, 2478460, 776200, 845696, 2565548, 3961703, 3435660, 1003929, 2341778, 3250738, 8209645, 5549708, 7126463, 8010297, 3259731, 3710545, 2198832, 567401, 2134515, 1439720, 3070406, 3241022, 5559551, 4808643, 3087692, 1960718, 2966572, 5453411, 8019599, 829933, 2289216, 3900490, 2043518, 5454290, 1292962, 3051361, 85872, 4296336, 6726366, 4339035], -[674988, 7034336, 4666570, 6284494, 4350353, 7495817, 2574693, 7634530, 6913604, 560773, 7663665, 2035513, 3454030, 33489, 5804374, 2874174, 5610439, 8091833, 6640077, 7242939, 5270752, 7301966, 4117641, 8115935, 1367508, 4680418, 8069033, 402730, 2467679, 7109184, 6065796, 6294164, 4995502, 3924429, 7699875, 8324968, 3079342, 7165699, 884347, 819697, 1199410, 1707140, 3377848, 2555184, 4609963, 3218481, 626573, 6514932, 6616470, 6328505, 3682921, 1040096, 7203670, 95402, 2803852, 6002958, 6042438, 5377666, 6782350, 8347385, 7724395, 7443249, 3443784, 2890904, 937760, 5111095, 6032106, 5453636, 6346154, 7363067, 3603272, 7053352, 6013411, 5274369, 1137106, 3636954, 1922868, 7047056, 1581761, 3602368, 3399231, 3453226, 163808, 6440026, 1211705, 1971100, 1468621, 8173986, 7885118, 5982472, 4959566, 8315860, 7446768, 2826908, 5088900, 5464137, 8235639, 2557164, 2901597, 145114, 5768687, 4349012, 4427602, 5920634, 733275, 6456688, 7083577, 6663572, 75663, 5688665, 1824820, 6096941, 7755539, 4467817, 3368800, 4738941, 6895485, 6997885, 2886394, 3687406, 5451576, 8075163, 215371, 6940785, 2573795, 8077435, 7116222, 7411933, 4991634, 1254916, 664579, 67217, 6911772, 885917, 5393394, 6012017, 7032973, 5924484, 3571157, 5979290, 383609, 3918569, 864033, 4196913, 5880771, 5949815, 2469273, 6050912, 26666, 6706282, 3909879, 1063169, 7677943, 8267037, 6681415, 1301326, 1197763, 7954759, 4240836, 2164329, 3752085, 1235952, 1619110, 6882323, 5915963, 7172443, 3316331, 6006084, 5937873, 6581970, 3371258, 7161055, 382992, 5686877, 6457770, 5975337, 7045337, 7957289, 743890, 2808804, 3631893, 2298159, 1165304, 6832217, 7111225, 2557734, 1989655, 6470484, 2538786, 1993041, 4911200, 1330206, 3068161, 1245204, 6838466, 6607252, 2487651, 4145660, 3779867, 7249278, 5871860, 3664539, 5969912, 3067353, 1147974, 6680537, 1141800, 3623057, 8026219, 7205137, 5985239, 3164129, 175923, 7559038, 7518272, 8337204, 8070357, 3553177, 4044405, 5602329, 3010056, 8308691, 7700438, 4058410, 6874480, 1382170, 3889748, 2678524, 5606782, 7329873, 5603777, 5728954, 750133, 5174557, 1922845, 6772490, 1452767, 521065, 7514917, 4695096, 474962, 4229374, 1556080, 4599836, 7671549, 4698146, 5912621, 876442, 4024696, 4378664, 6847307, 1802246, 8105670, 561439, 2771671, 7736039], -[4406566, 5954670, 7130704, 1917294, 3030143, 7617234, 1177455, 3376554, 5350376, 3264614, 7417136, 2215991, 224662, 7250601, 4335013, 6761466, 1317099, 2345440, 532480, 1936264, 3490566, 4477507, 6489169, 7856679, 2334618, 4227774, 5456976, 7027353, 5407026, 3288707, 8118040, 7449171, 225176, 8040574, 6272821, 2398797, 2780133, 204627, 3446811, 7076249, 1187712, 862083, 3326208, 8146515, 1114850, 5753622, 731798, 3779457, 3831158, 1430783, 2513220, 2227479, 167927, 7974858, 5805902, 3123388, 2004267, 2152391, 7854303, 5447621, 4083283, 1738812, 6898381, 3744485, 4510705, 4672465, 6855374, 3587089, 2326402, 5865435, 6602623, 6329014, 5445784, 5668496, 4762211, 7779789, 6138532, 5987389, 4403569, 7627046, 1438624, 1401790, 6351369, 2290148, 5189700, 7675560, 4914961, 6880208, 8122871, 3981786, 1687890, 644941, 1348864, 2182124, 485253, 7433796, 3701459, 6699727, 5151946, 6275560, 1613443, 5865956, 6704180, 3562312, 3579947, 4484573, 5558222, 593306, 4613736, 5475088, 8257767, 2766461, 3475092, 4556941, 5323282, 5536148, 3179620, 5830119, 7889988, 4569687, 1568291, 960391, 3135612, 2252202, 2871417, 5931358, 7920019, 3081081, 1684886, 764859, 8089522, 5837179, 2177247, 7686882, 5091120, 5099785, 680534, 7120158, 6648810, 7071882, 4428841, 4762358, 6674688, 2754810, 5114776, 4375489, 3786554, 1877104, 2856860, 1944281, 2010832, 218760, 4923418, 4006565, 6484528, 5971839, 7732666, 4074071, 6628035, 3640244, 7722617, 7085326, 6277964, 1872886, 1259127, 4242358, 5165474, 509652, 2278217, 3168934, 4537649, 3785635, 2240631, 427791, 5520927, 2385656, 5816074, 2649992, 7274109, 1660400, 2703091, 5460052, 8015214, 7296887, 85420, 2860224, 4566975, 7338559, 1022184, 1962560, 765998, 8257322, 2195050, 6470013, 2682354, 1030994, 2478119, 3041681, 2165385, 4745595, 3807511, 1337552, 2245481, 3559287, 3406619, 238984, 1552865, 1081564, 4824348, 1632127, 7131467, 1694325, 3573924, 3554488, 7849409, 7111869, 3638176, 921506, 8328651, 1011245, 68065, 1353114, 5302971, 1256712, 7183518, 1869687, 8022197, 3454416, 5189088, 1565664, 6016864, 7591504, 1486340, 3837498, 7986965, 5188466, 7272041, 4088314, 4783331, 2517289, 2438297, 3385645, 2616900, 5443176, 3603790, 3090236, 8219112, 3585732, 7244020, 4346380, 5936094, 3491793, 1931361, 2226264, 31751, 5835021]] -s2Hat: [[3629686, 4323385, 1136763, 1892621, 396580, 4015673, 7506969, 413433, 3429836, 5013117, 5164433, 3162170, 3109721, 7122983, 2862134, 7835515, 3443139, 1216071, 4400887, 5301233, 498101, 2585222, 2724554, 870133, 1724740, 6181750, 2638389, 3361347, 5690056, 2060513, 960108, 1371185, 4742391, 7638652, 2949217, 6369537, 8155223, 7476791, 6834454, 2136536, 4460144, 5567329, 2254921, 680146, 5002506, 6197174, 7382619, 1946922, 7294370, 1275504, 5855339, 5375244, 3839455, 4745604, 7842326, 6857672, 962116, 5966114, 4272168, 2605526, 4358797, 5220736, 101184, 5612470, 7489244, 375068, 7914536, 7747344, 3403130, 7667289, 818728, 6087460, 4501742, 1147280, 6654387, 2486774, 1936421, 6049872, 3272855, 1327320, 1663066, 1933720, 4236504, 414102, 1032279, 7158786, 3519705, 3079904, 4727731, 3749441, 4717070, 974543, 7625923, 8203239, 6855725, 4839557, 4636518, 710879, 2058559, 2855127, 5456922, 6375973, 5481394, 3669129, 4384794, 2627025, 1052271, 4520173, 2998508, 4998669, 5892011, 3466581, 6169517, 467203, 3368917, 1942219, 6836643, 82898, 6425499, 5889372, 7510294, 6513571, 3595486, 8249639, 3793137, 4476796, 7126137, 2701903, 3175828, 6849692, 266465, 5171458, 2081437, 3990636, 387543, 3151076, 5721073, 1608216, 6814281, 3252209, 6505892, 6013787, 3794590, 5856081, 1438447, 846044, 5197889, 5210625, 4411171, 5507389, 2384182, 3775287, 6701082, 2319557, 2079773, 2459927, 7807647, 6795612, 6538213, 3337476, 1097662, 7927629, 4017477, 8047574, 6153612, 2692562, 6113902, 2599359, 2267298, 1406501, 2204553, 403410, 1967242, 4765186, 457501, 447580, 4273774, 88082, 4816897, 4703968, 693466, 3898874, 1077498, 7827138, 7262745, 6116800, 7413546, 545452, 707694, 1590633, 3436405, 2002147, 6609679, 5962106, 7488017, 2185516, 312439, 32631, 907151, 8196157, 382968, 6025804, 4176334, 2333455, 4066462, 6965699, 2927417, 1622550, 6294377, 4791100, 7012608, 3656498, 6856868, 3962455, 402808, 7062678, 2772150, 7478089, 2126815, 1056175, 1561116, 2464831, 6137266, 1129124, 3374878, 3238515, 2234866, 3115110, 7546753, 1452741, 4969563, 315646, 3093038, 1356114, 2569767, 6228689, 7254710, 2164300, 4874069, 5824044, 4324985, 3713315, 3483527, 3367275, 5359290, 6665937, 3118106, 3852266, 1616532, 1361275, 20968, 1351100, 413351, 6436321, 6502602, 1049893], -[1691622, 622196, 3664387, 1888517, 6954472, 1664504, 4698479, 6040992, 3462971, 8143638, 1775563, 4512773, 4656917, 1689760, 1077062, 874302, 1811691, 3362096, 3871642, 8298838, 6348712, 8194682, 6008666, 3759777, 4142541, 5265378, 7251827, 3658940, 3184186, 6689508, 4594372, 6300187, 2909893, 2801071, 5100854, 7803908, 1230071, 3155806, 2632709, 6090515, 1926220, 378933, 2349147, 6243904, 6585648, 5503971, 1351042, 2835369, 7224695, 7495821, 3914337, 1644163, 6423757, 4526416, 2510355, 2382274, 1910502, 4607825, 8149776, 4556231, 7050873, 6338060, 5492615, 6989335, 654504, 2560286, 4932358, 3441552, 6296675, 6832338, 6649419, 931795, 5150478, 6993776, 8244494, 419449, 5596276, 2586641, 3385680, 7353149, 7051473, 6821530, 769346, 681513, 263013, 7926847, 6361186, 8224351, 47881, 6913600, 6624965, 4356878, 163232, 6340185, 2751966, 2876565, 6927242, 6697439, 7976350, 5200635, 7208686, 646420, 8232672, 8122606, 7328552, 2301445, 8162505, 444080, 6364875, 3276357, 7509617, 7886229, 7357945, 339801, 2124618, 1976232, 5453730, 5520065, 8371749, 8292537, 5976407, 4749215, 6547455, 1519091, 4035189, 8140748, 2678327, 2779932, 3361759, 8257301, 6302450, 4258721, 5054534, 4656021, 802431, 8049352, 7826122, 3601955, 5620786, 7786012, 1887101, 4835126, 1433879, 86004, 7392579, 4524221, 4796530, 8137047, 3125570, 4067398, 6317304, 3002343, 5052937, 4283099, 7712279, 1094187, 1824099, 1797466, 3955250, 7401265, 7320241, 3177813, 63966, 6441524, 3839732, 1063559, 713838, 142135, 594101, 4496270, 7825121, 886744, 5504682, 2143428, 5630395, 7151912, 4138159, 3563701, 463247, 3944431, 6605573, 1987470, 1324001, 7753662, 4383529, 6190942, 8132988, 3584329, 4280915, 858036, 8035383, 5732339, 1434416, 287384, 252126, 782056, 2538480, 842510, 814422, 5419409, 1181197, 474845, 54042, 2083464, 229363, 6241425, 3568733, 3734372, 6532970, 313655, 6933746, 4758179, 536432, 4613241, 3790574, 812038, 1969549, 7205109, 2359167, 5558347, 4752827, 3409663, 4464066, 6587902, 7623981, 6264846, 1826243, 6189711, 6968541, 1516166, 2478154, 5552249, 3881023, 6713424, 6374859, 8367840, 4056049, 8373121, 6784334, 3702890, 5909442, 5660540, 3809143, 231023, 7926503, 6895537, 5783716, 3641055, 4260499, 2046925, 7901106, 5761837, 4220890, 4710257, 4184090, 5917947], -[1613043, 4987276, 7287169, 6380375, 224343, 5098268, 1770771, 294873, 858281, 2279584, 6969794, 4732503, 6092736, 370529, 5329783, 1832892, 2840003, 3583275, 4567554, 8072429, 4530929, 4860054, 4452789, 515012, 5294495, 3431611, 3406884, 2662023, 3080812, 7380928, 4242848, 1478978, 2453443, 2447485, 2895332, 7420193, 7747439, 4527517, 6015467, 1042476, 3651780, 6952557, 1065041, 2253056, 2095906, 4090301, 6078012, 7985353, 2363403, 800454, 4465647, 2719060, 7619551, 6295180, 2090922, 6454370, 4980179, 182173, 959630, 413533, 5999117, 5054129, 3740388, 5956218, 7915133, 6698033, 539560, 6872443, 5019135, 2630774, 7425408, 7445534, 6295712, 7967375, 6940082, 2761668, 5601996, 1933249, 2891563, 5497365, 3655132, 4567675, 2466133, 1278977, 4299683, 7427231, 7454645, 1887621, 5149468, 754344, 615225, 6493646, 6056725, 6615436, 2632994, 2699135, 3511640, 7985562, 6112319, 5514548, 7398766, 1076887, 5552486, 3896541, 7582829, 7126828, 359291, 3749763, 6613060, 8340897, 4372312, 3354401, 5824476, 3070532, 5781978, 6872541, 5004060, 2147061, 230113, 7420173, 1646934, 4143655, 4253389, 7480166, 7185077, 4168398, 5178897, 6003205, 7500345, 6404284, 1054591, 8024280, 3811621, 7561174, 3935931, 5176090, 2617511, 2835103, 1574019, 5572463, 2553209, 4776359, 8316177, 1058117, 1697693, 45248, 4235182, 1961276, 746255, 4287214, 3938349, 6306148, 2516149, 3268835, 4191863, 5464751, 6151910, 782095, 3003856, 4607359, 5800052, 2644955, 3953084, 3355452, 767646, 404803, 6037201, 1963388, 7778333, 3140878, 2378529, 7813196, 6268369, 341862, 6750932, 4270396, 2422273, 1991277, 4570180, 2214659, 3514429, 3630794, 7275831, 2623346, 1192463, 8027765, 8316720, 1509238, 7256714, 7276158, 6939242, 4014977, 563567, 2549646, 6868081, 2811058, 3231489, 2867520, 4581862, 3068174, 5779279, 6186823, 964592, 5728992, 1374741, 3023510, 6891413, 4702750, 2862172, 6641381, 5927817, 7951816, 4009687, 1282811, 6851720, 4713465, 2023930, 3457495, 4937259, 5442523, 7986282, 4031091, 6269724, 3775426, 5209053, 916666, 8198372, 4632399, 6185595, 7881527, 3383221, 4466245, 2219391, 8279846, 1163718, 3392028, 5082690, 2825241, 6003644, 2501885, 7325119, 7018932, 307682, 760268, 2774742, 7010186, 6272820, 4450402, 3417420, 387535, 2009676, 4408645, 7297873, 2501695, 7938805, 3046826], -[1302014, 5489441, 37061, 4413680, 1025518, 6704923, 6704959, 5549932, 2780863, 1049739, 364807, 716450, 5247856, 63141, 3739196, 7655028, 4955270, 560276, 1132518, 6450351, 4382245, 125445, 6088857, 298074, 8110838, 829829, 6862554, 2816576, 2774253, 4977013, 6560054, 3485187, 6556554, 6229476, 622238, 4242717, 2759508, 3597811, 8257265, 3244837, 694917, 3181610, 7061554, 7327015, 3277887, 7639742, 2118228, 4471783, 7662959, 938128, 712366, 3390440, 3116076, 2402942, 3126576, 3606055, 1169409, 6400788, 6372642, 7859353, 1695220, 1626092, 6871291, 6770596, 7560733, 890451, 7964985, 6406507, 2802658, 5345617, 952819, 6599201, 3084031, 2587292, 3985672, 4756068, 4301312, 7190463, 170630, 4088476, 6556223, 2210718, 2386583, 8297733, 1814972, 4237486, 8091625, 2695348, 6311070, 2153144, 7797042, 50058, 2807042, 4881327, 7017041, 4039484, 3060995, 634744, 4094216, 4226018, 6186514, 4799778, 3495038, 2798081, 5530670, 220156, 7500716, 2857934, 5779706, 800751, 4981923, 4785414, 2480083, 3445496, 7885616, 507823, 3637938, 1268943, 1842093, 6959192, 973199, 3808746, 4058101, 1158543, 3347492, 1406565, 5132126, 5891955, 4912986, 2032677, 6002485, 3256250, 1440529, 7792749, 2393309, 3788672, 2989968, 4233945, 7643371, 671725, 2650783, 1762477, 746404, 8228286, 4298910, 5213540, 7256794, 5828525, 4862671, 784590, 5705017, 7451001, 2979884, 1806141, 6842084, 1889482, 2340791, 2110546, 7905189, 7512049, 3897685, 3091660, 4300579, 3452896, 4116066, 2499722, 6158506, 5017498, 4988476, 4281211, 2272670, 6955297, 729777, 5550944, 3962225, 481652, 8086715, 7729957, 3465930, 4519395, 14947, 915182, 4928557, 4620652, 1987855, 2083154, 8170164, 1598313, 217470, 934749, 755500, 7447507, 5858205, 44613, 8185089, 7134059, 170867, 5532125, 3312329, 1955903, 6850031, 8300812, 6784704, 1505379, 6822615, 7954525, 2946832, 2294136, 2844340, 232653, 3179833, 1735975, 4714499, 4733889, 2726486, 3889463, 153793, 2410578, 5560746, 700134, 5025806, 4050594, 5162649, 2528856, 6713599, 1862416, 5318308, 2908611, 6873560, 2803087, 594723, 1455568, 7644043, 6053464, 618839, 687194, 4904332, 2828979, 4029209, 6649796, 7245539, 7499495, 7224351, 6137411, 1383318, 4042123, 7563872, 2476145, 1620406, 131159, 5958855, 8375009, 6363364, 7791554, 2832657, 101718]] -t0Hat: [[610973, 5626726, 3451877, 7487350, 6292492, 6530640, 1903374, 7333475, 6327440, 7331451, 1406104, 1022202, 8154710, 6372860, 1693340, 6923492, 896656, 1701499, 3271025, 988771, 920893, 3030485, 4017370, 632660, 5527856, 6686272, 7217499, 452753, 6832027, 3041629, 3192632, 2914297, 979062, 7087365, 5358512, 412204, 3619931, 8339506, 2456709, 6754473, 446411, 4728744, 3169238, 95839, 8012760, 3483239, 845224, 7748375, 6267498, 2439012, 6236957, 7878754, 4875606, 5195378, 3251399, 4477589, 4615855, 7890813, 6483850, 4509797, 2918113, 2712377, 4355987, 1055428, 110636, 7141710, 2317624, 6675102, 5884565, 1673566, 4873347, 6250376, 2182090, 1149918, 7440641, 475522, 173090, 5322016, 978828, 1380713, 3044969, 6148659, 7024237, 1630187, 4159540, 2548121, 7088777, 1014204, 7662153, 4338182, 6435686, 5706354, 784863, 35521, 5515223, 3103110, 6694045, 6904720, 2140778, 6497909, 3561026, 4447628, 909997, 3906225, 1544725, 3504108, 3184159, 4810298, 4572346, 5328378, 7439395, 7798535, 7497196, 5381328, 8133611, 6949421, 5442246, 52152, 5127248, 9718, 3498321, 7822138, 899431, 4964109, 5379974, 8215181, 7511854, 5216915, 3151607, 8243471, 7739801, 3032075, 6554720, 2080098, 4844823, 5309640, 6603077, 7215912, 6624323, 1107886, 5733323, 3085663, 5718473, 5936425, 1014409, 136365, 901138, 231573, 3964639, 4710826, 1013296, 1397957, 8090348, 5930648, 999984, 2725682, 4222660, 4691619, 5350249, 4037080, 7446237, 3605175, 6784989, 7578796, 3117855, 146989, 463372, 3211034, 5636977, 5395207, 4443525, 2705180, 5568984, 2840343, 6364721, 5740332, 521361, 4390220, 4167131, 7899805, 7808015, 1235522, 5870762, 966474, 7775834, 4097522, 2986262, 1771870, 6395676, 1876404, 2304501, 5858846, 2687399, 6889063, 8354122, 3427164, 2038220, 424259, 8287978, 7214200, 2279422, 947812, 1398450, 5208409, 1933295, 5440170, 2219265, 1906405, 6331323, 707561, 294365, 7933297, 1900250, 8107073, 6791100, 5898220, 7910271, 215132, 7933668, 6935701, 7110514, 1443878, 7452136, 3902668, 3501479, 4845524, 1197180, 5233294, 203624, 7231585, 1094477, 7025176, 1002730, 4165923, 1600550, 3390574, 4632360, 1078389, 5622929, 4087339, 5481056, 3661222, 1988419, 5518398, 7883810, 3957233, 4870771, 5410125, 1814256, 4455678, 6279467, 2114073, 5403492, 1384433, 7756678, 1807232], -[6938612, 1405233, 2812565, 2424669, 85312, 2801824, 4388851, 4016848, 956731, 3276110, 1543239, 2157804, 7522223, 3984456, 673385, 3865973, 38925, 2806610, 6785343, 5504465, 7783692, 5745501, 6848689, 3213630, 6973764, 2842810, 7728160, 1873723, 114233, 1639870, 7891136, 349761, 766069, 3974782, 799993, 1278412, 7419390, 320879, 6191130, 2411826, 5688646, 6504894, 7785510, 6945250, 7309125, 7820053, 2686547, 3771393, 1497002, 3405460, 2163205, 7830535, 4803241, 1709051, 1845242, 6219461, 3089788, 6000718, 30358, 4767261, 4741154, 6118959, 4615620, 415331, 8146484, 5481181, 149372, 3281988, 781913, 2517023, 5997370, 7926143, 3829380, 736831, 1853117, 1485473, 7455217, 926908, 205221, 2301763, 1885414, 5401882, 478821, 5150059, 8095709, 6141562, 6254393, 4266386, 1103322, 5419137, 1407248, 4637589, 493250, 2198799, 279709, 4119382, 2736000, 25225, 6778957, 7192480, 5821392, 341730, 3808995, 5870199, 2919084, 6384753, 8317223, 2687241, 3717188, 7985333, 1828290, 795856, 3732213, 501745, 6474185, 553276, 4788013, 4175543, 3670893, 1885544, 2743145, 3507549, 8317223, 1986501, 5034000, 7181625, 1490799, 3729491, 7606359, 2183576, 4193468, 6376589, 4431806, 1333519, 4342017, 2322773, 2706831, 5962261, 6157802, 4190480, 650267, 3883194, 3967516, 3526324, 3475501, 3596619, 978931, 2386804, 6112728, 8153934, 4633100, 4249068, 4697541, 953870, 7172816, 4992392, 2100132, 6901762, 1792893, 3950509, 2213669, 7948190, 5933192, 4629147, 2730772, 7571128, 1580500, 24476, 7340231, 4362446, 8270016, 7989966, 6333163, 7351937, 6685981, 977238, 5930967, 265026, 4945754, 4951897, 2358026, 5149731, 5481552, 7667962, 3889394, 7595917, 2638206, 389890, 2301856, 4810100, 6144314, 5065428, 6866152, 2553458, 7103810, 6212588, 1086303, 7746640, 6263621, 6360252, 1753684, 7825173, 5776217, 4083339, 7557370, 6532508, 2933923, 5280828, 6127716, 5345262, 5408466, 4922315, 2766285, 3961457, 2963203, 3231129, 3971204, 7460596, 4070262, 3611414, 4219439, 3130763, 2768990, 4654211, 1152976, 122085, 3952718, 5880843, 4210691, 6329242, 4709007, 2787718, 6320281, 3596077, 6528667, 3020282, 7320635, 7925385, 5174440, 760500, 4363350, 6736035, 626013, 4171435, 2137995, 6330098, 5846200, 4743799, 7697376, 5858306, 1850654, 3802945, 5510210, 2013307, 6117808, 4574096], -[317716, 7952704, 5819693, 7775640, 6498344, 692925, 296983, 3947939, 2170031, 2731242, 991907, 4337667, 7009311, 5014777, 447037, 586519, 4402718, 2604042, 350455, 2351923, 2328352, 8355353, 6097737, 3065570, 8152695, 191198, 5819041, 6950882, 4976775, 7473310, 6447616, 7834104, 7483925, 1806461, 6126030, 4265223, 1669681, 5894461, 2712556, 2614443, 1228609, 3731586, 4779504, 2002769, 2830423, 1778917, 1238836, 3233524, 85368, 6408992, 2256291, 6423433, 7530238, 2886199, 5831078, 8296003, 1536815, 3160546, 8004459, 6237077, 6257213, 2524231, 669762, 4468406, 5132086, 2333413, 4940411, 1946284, 5595607, 4176165, 3217299, 6865813, 6950470, 679533, 3964530, 4077159, 1613104, 1022976, 565174, 4520394, 3383796, 3055526, 7682784, 5320035, 7072207, 4321591, 5596608, 5542713, 3839622, 6439121, 4273622, 6843833, 3368890, 2607410, 4781497, 7260262, 5643260, 3163338, 4775382, 4375342, 975875, 4306192, 4159713, 8341094, 1635527, 6124766, 2662572, 1414118, 7171182, 1135356, 1325807, 949241, 3123980, 631027, 2090449, 3958614, 3787522, 5030949, 3211661, 623099, 3096270, 3947472, 1328299, 5644144, 177198, 6416462, 5838664, 8168831, 150542, 5093188, 6183431, 7066336, 2080050, 7336842, 2866581, 4724868, 1085654, 1943207, 1953965, 5255817, 7750428, 5548206, 498495, 3480857, 5847160, 3101729, 1924858, 3814678, 5908325, 7909263, 1693322, 8010113, 7163597, 2920462, 1192082, 5744004, 8047903, 6449702, 4028155, 8118325, 6341777, 7201555, 6068738, 2782972, 705928, 6149032, 3858877, 3932470, 7512152, 5989478, 5535435, 419468, 7129259, 5613980, 2591268, 5392106, 7889393, 1397344, 3521596, 7103323, 6896011, 7484099, 1951338, 4732530, 5643931, 962806, 7323203, 5823926, 3228887, 185006, 1055644, 213982, 5153263, 3558577, 3536474, 7208986, 3691419, 930472, 7440403, 7524248, 561805, 7164868, 678214, 8244858, 5879323, 6839943, 1193887, 2283280, 3739933, 2209873, 4280988, 1676352, 5365855, 5307969, 5431705, 15230, 2037636, 3235191, 7204534, 697733, 5997406, 7714462, 3691768, 2101251, 3545975, 5940996, 7397924, 8293790, 7084550, 4600664, 7376491, 1835186, 5640765, 421583, 5599301, 5311184, 2639855, 8347733, 4766640, 462618, 1223800, 1504237, 6192671, 7051358, 1247347, 2917298, 5718729, 1296321, 7719669, 3938265, 3295475, 2409064, 1351962, 350848, 7135082, 4847184], -[1570404, 3374127, 6203829, 3403877, 8157306, 6508111, 4782724, 2219282, 4184276, 4852824, 3605792, 1342862, 1287197, 8372404, 5693597, 3661467, 6326627, 7153325, 6211371, 6526012, 2020091, 1771102, 6241797, 1357363, 7607119, 2073443, 5054176, 1771299, 5531947, 8271765, 6597038, 6259651, 6880061, 7089895, 590772, 2145951, 6421682, 641759, 7934919, 715842, 6968225, 3868079, 63579, 7031869, 3129039, 4979914, 4281280, 1276531, 3226314, 1767020, 6862807, 1598672, 6339046, 1873372, 3665094, 5207848, 4924248, 2487121, 5679461, 4176553, 2740805, 7059597, 4527368, 7072602, 4274221, 7714169, 71306, 4520803, 5379297, 137667, 7278378, 5825137, 110072, 740497, 7762901, 7227963, 2473550, 8202144, 4534630, 2925710, 7877993, 3801163, 6058400, 2009613, 7931962, 2326616, 4093909, 3217423, 8197632, 5298678, 6281184, 1577380, 702423, 5766812, 6667920, 4223, 4549231, 5223902, 2984665, 947568, 6910865, 731397, 6894109, 814661, 4271938, 4952930, 2629503, 101533, 3365587, 5398558, 195825, 5185414, 3339965, 3885402, 3960985, 4495375, 4719657, 88679, 7256404, 3623562, 6778626, 2712758, 5595800, 7512097, 5800708, 1427537, 7071733, 5962141, 482184, 6695953, 6603466, 748166, 3036892, 7670188, 4265260, 6078743, 3919020, 5656783, 8120398, 713773, 59727, 611243, 7777094, 7301003, 6353098, 4128861, 8336842, 2016068, 1873087, 649102, 7211325, 3746468, 4235722, 7974178, 7050065, 6597303, 333156, 2036329, 7167824, 2628452, 7145670, 5398761, 4749752, 7788186, 1201302, 3272982, 6396460, 6473043, 6817399, 2713736, 546956, 6099077, 3936865, 330521, 820294, 211599, 1859586, 4364485, 2644762, 6418040, 7553698, 8075199, 681738, 7587338, 7627856, 3870439, 2986043, 2063441, 4291340, 5756085, 5696183, 145540, 4139724, 802484, 3377639, 1015223, 1081888, 3892696, 1170703, 7592173, 5838885, 337129, 2984923, 3956815, 6131988, 1908356, 1590974, 8363798, 6944379, 6648649, 980622, 5775093, 4734466, 6743812, 5903497, 1141660, 703605, 2412880, 69377, 5651431, 1357639, 591929, 717511, 7645106, 7415780, 2588422, 2172724, 1620095, 4767010, 7304743, 2345432, 4723904, 8053773, 7274156, 7546678, 7963392, 256057, 8372559, 1128193, 1622932, 6401558, 3494263, 7468679, 5157259, 3277134, 6366278, 7530289, 6540690, 3439462, 6815227, 5906631, 7099855, 5138749, 1225009, 536149, 3085217]] - -rhoPrime: A9A9F85C9C20C2B207E25FDC800A2E59F41FB874B7A5DB2CA80C3CD2F6FD1DD6D8F945C176A75CCDEE86D21C830C4164C2386D38968EC0F58ECAA2E6C5193BC7 -y: [[-16088, -48849, 63050, 50124, -117504, 29493, 110219, -11008, -94012, 29530, 41186, -11050, -104046, -3384, -45232, -68582, 14328, 17028, -69181, -69300, 3293, 70652, -2121, -378, 117461, 72983, -117864, 67363, -35215, 51094, -22819, 51871, 86131, 101059, 30470, -66277, -15511, 34287, -42349, -35828, -17686, 42515, 1527, 126597, 17083, -100496, -118979, -85759, -87971, 41953, 99297, -67052, -71217, -77397, -60850, -10260, 10481, -3214, -39450, -48254, -89976, -68475, -5510, 89904, -125478, -128840, 48793, 128372, -32895, -29612, -120833, 29165, 21313, -110467, 108580, 59996, 115299, 50449, 29181, -88440, -33487, 117379, 61524, 124643, -82773, 96060, 58742, -3877, 109797, -31935, -60274, 64993, -74226, 47448, 87510, -64687, 34601, 52799, -63930, -81677, 112409, 30915, -106070, 77538, 70562, -53589, 91150, 107995, -5512, 55207, -60775, 80791, 1353, 81585, 82427, 33866, -120743, 61869, 32363, 42325, -46410, -2777, -5760, -84458, 24696, 30009, -109606, 110435, -128592, -3302, -115967, 22284, -74860, 65511, 49688, -125485, 45757, 35101, -89371, 40420, -113396, 85846, 84166, 37368, 127856, -124543, 63829, -97527, -106716, -101857, -55900, -32374, -32430, 14336, 7829, 114856, -14174, -50613, 103267, -106749, -66426, 83411, -53153, 67851, -81939, 13627, -83060, 50535, 33201, 102480, -52579, -106417, 30107, 31619, -83124, 19515, -102746, -60688, 21293, -93959, 108080, 123561, 80735, -3372, -69144, -40638, -17900, 123059, -55070, 32873, -125683, -90691, 41079, -78901, -92599, 4529, 54296, -95390, 38964, 2301, 130745, -63473, 82935, 66454, -11647, -39686, 19820, -41764, -5873, -37486, 68562, 51809, 126581, 28064, 87229, 112468, -45476, -106781, 64626, -5539, 18762, -91123, 84360, 25677, -86374, 46299, 27925, -18086, -115752, -26103, -16191, 28268, 92458, 51404, 25308, 4325, 106974, 128246, -37792, -24646, -88331, 22653, 2459, 85289, 12361, 5356, -70765, -17811, -22046, 14438, 91798, -14723, -62699, 4024, -33621, 47932], -[-49377, -73585, -45443, -27462, 26060, 118796, -126939, -81588, 97485, -34038, -101409, -20398, -6286, 130451, 108502, 15632, 33952, 113909, 107688, 84947, 121773, -62990, -7811, -78100, -84591, 6438, 34103, 112902, -3786, 27501, 73553, -67296, -104579, 87550, -123921, 12997, -41973, -109852, -70361, 84459, 3595, -70596, -20570, 64071, 127678, 15894, 41890, -10796, 54694, -80393, 64510, -130253, -90319, 41583, 41404, 61936, 43701, -61889, -47411, -76176, -2845, 6936, 1039, -707, 130567, 104514, 94116, 114853, 107037, 122310, 28505, 66665, 18175, 85314, -121390, -3847, 40011, 63703, 39832, -25817, 109725, 89333, 14223, -102614, -18697, 23924, 25211, -77495, 117901, -11550, -32847, -82603, -120813, -96990, -1008, 23792, -74934, 92968, 101369, 109093, -39370, -61265, 93395, 80409, 53523, -117393, -88241, -11798, 119493, 81457, -8663, -107363, 73739, 65482, -23261, 9041, 70709, -39592, -105084, -116035, -77888, -63839, 14574, -1629, -74212, 83445, 77483, 103281, 17861, -3056, -87478, 37252, 102951, -16005, 11803, -74507, -58771, -41738, 125879, -18196, 31660, -103421, 126957, -85013, -95252, -52708, 77371, -44347, 94673, -19548, -63293, 15351, 93994, -115072, 107481, 62050, 120492, 129793, 54130, 44804, 6443, -42939, -83994, -44762, 92175, 4170, -18009, -101238, -92712, 36731, -126521, -74986, 87454, -126335, -42968, -65791, -21947, 21884, -39734, 124175, -21156, -97254, 95854, -4740, -76395, -5323, 11564, -29688, -32052, -74604, 54506, -118189, 83396, -81678, -16415, -74228, -105243, -92277, -13483, -81992, 41313, 97981, -30747, -100981, -72478, -25019, -99707, 112041, 2296, -89787, 21152, 42077, 46314, 60583, 38437, -113374, 51396, 48722, -83901, 100610, 40949, 110234, -80983, -123639, -77325, 19997, -13706, 117953, -9001, 73428, -9907, 30882, -120449, 52409, -126179, 88655, -25076, -13925, 57776, -87937, 79412, 104939, -105775, 48688, -92727, 83620, -115159, 50442, 33650, 36699, 40622, 64085, -30877, 98310, -57586, -56481], -[106078, -34816, 58147, 11659, -42750, 62417, -126762, -120564, -69150, -750, 119074, 72712, -121945, 14163, -72493, -49792, 120019, -24362, -58201, 119464, 99309, 34091, -38736, -19079, -27311, 50472, -3894, -92162, 33886, 2149, 48130, 67760, 119547, -94167, 23907, -127150, -32475, -77647, 66621, 2347, 71599, 60678, -72707, -91752, 41582, 103341, 88667, 28487, 115533, 119416, 107523, -50231, 115541, -15847, 50349, -15283, 94168, -40938, -92094, -21304, -120367, -130594, 103949, -11890, -100130, -102530, 61815, -26927, 43863, -59205, 123123, -117229, -106808, 44615, -331, 120519, -25327, 119254, 17986, 85399, -26099, 21496, -84469, 91335, 71578, -29115, -90306, 46190, -106824, 34176, 93638, 105924, -4933, -30903, -104382, -25734, 92951, -71518, 94597, -40815, 127099, -14026, -22534, 58051, -36308, 29870, -7767, -81605, 123752, -75333, 98310, -119405, -119275, -85714, -78553, 42308, 124651, -49610, 30784, 12889, 8620, 1890, -117284, 5522, -79380, -117666, -104399, 127065, 104080, 69260, 1769, -48101, -113859, 27524, 71854, 113332, 128813, 80305, 5838, 97077, -51666, 55496, 73528, 68561, -108197, -34039, -92954, -128836, -64711, -9761, 31679, -112115, -54118, 74079, -21748, 128815, 45471, -110126, 37538, -16446, -5271, -124654, 89969, 99201, -47570, 125374, 113823, 92266, -77867, -87812, -68215, 53432, -108221, -127302, -105026, 61661, 67180, 98461, 126599, 87431, -130270, -173, 44630, 11378, 32079, 35720, 29672, 76352, -53631, 65164, -55836, 11975, 80953, -53292, 1030, 29002, -81920, 129011, 95349, -66997, 77527, -19082, -121362, -62597, -107999, -9304, -119632, 111077, 64852, -40756, -125459, -10203, 36586, -37954, -122470, 1429, 10839, 90932, -40695, 5749, 64052, 44524, 35300, -9980, 126724, -117095, 63082, -92280, -16913, -22385, 102758, 421, 125529, 52191, 39073, -80973, -68341, -21546, 25283, -4828, -104021, -109772, 114700, -90686, 10403, -82871, 96829, -113392, -125575, 81964, -44010, -86323, 70442, -94945, -28797, -119267], -[-98574, -78763, -87710, -28962, -79473, -50851, -62821, -5213, 76005, -11100, 72963, 78058, -69941, -54968, -51710, 81369, -122193, -11067, -32462, 20787, 104041, 37140, -23427, 110165, 127719, -80603, 6654, 117981, 19692, 76880, -91927, -46683, -27975, -115832, 50139, 44373, 2179, 2875, -35300, 6860, 116567, 119654, 82411, -59897, 11920, 111334, 34936, -19235, 18012, 108187, -41065, 8572, -49338, 80783, -33097, 163, 69124, -56875, 87423, -114715, 29113, 55759, -13130, -124307, 129338, -37770, 778, 28634, 20946, 91575, -109285, 46015, 44491, 99918, -23379, 29551, 122952, 93669, -71182, 42575, 122674, 101629, -46265, 87621, 75058, 38492, 43221, 123138, 123030, 117270, -72825, -31716, -20233, -85491, -63856, 40161, 28798, -52994, 121513, 64817, 106285, -130326, -71219, -23003, -102105, 81984, -50205, -125795, -37445, 83779, -9762, 40538, -24000, -53947, -117553, 130594, -102226, 85695, 66413, 99525, -90702, -75918, -39594, -88380, -70639, -88372, -42388, -96820, -74805, -8372, 4904, -14687, 83097, -102034, -40988, 88593, -51297, 85898, -125234, 63541, 41150, 37518, -124676, -28563, -9387, -54477, 18805, -29976, 115346, -77975, -2717, -55725, 69346, 127946, 69318, 73740, 15240, 55908, -39874, -30705, -33293, -122085, -123057, 95548, 77189, -17528, 93237, 12570, -99050, 40460, -25672, -19572, -76971, 82403, -39822, 94398, 47407, 112108, -54925, 30109, -30569, -18869, -97093, -120239, 15717, -89366, -70614, 49075, 96815, -37795, 40941, 99362, 129506, -79914, 47398, -114309, 10389, 109649, -37690, -51902, 81854, 95897, 122787, -119513, -12582, 65354, 112057, -28350, -64338, 69652, 37931, 65661, -109976, -22932, 75159, 103357, -83843, -67305, -9742, 42977, -125009, 34600, 39432, 60522, 117679, -72445, 95954, -17664, 62912, -98316, 48700, -41892, -94817, -83422, 43895, 39721, 123334, -41690, 112537, -64785, 63199, -455, -55741, 60812, 3099, 41207, -46472, -89077, -70379, 52387, -49603, -128978, 50389, 115459, 35717, -54854]] -NTT(y): [[4047304, 6951015, 1424143, 997117, 6879402, 1833717, 7020260, 1181620, 3857346, 5444919, 8194325, 6688481, 3045723, 2553835, 8293136, 4135624, 3903731, 3168071, 7750529, 4203151, 2358050, 4620113, 7261178, 2102960, 7239039, 3563889, 4250473, 5247329, 2095144, 3579081, 1375903, 2824842, 3508276, 583279, 7985971, 6337149, 1733785, 4719941, 4130201, 7606023, 2208405, 698220, 421291, 2862132, 6100156, 4241289, 492684, 6318413, 5386611, 5054202, 8366094, 915437, 2887972, 3733125, 6441182, 151919, 8141130, 6456516, 6048296, 6651902, 5254766, 1766460, 6748660, 4928040, 7969474, 6780814, 1074451, 7522205, 2499719, 2655016, 5433007, 2794576, 6129091, 2260903, 4836517, 2744265, 5586478, 2950576, 6600262, 6411158, 5387029, 4175444, 4875532, 6716643, 3381244, 5659854, 5679166, 1816373, 5944766, 2369891, 7308601, 510008, 498395, 138446, 2276734, 2763675, 2144328, 7539623, 517247, 1571496, 5711698, 3032615, 1384373, 5677335, 3641703, 7040295, 3943525, 5417434, 6430363, 442182, 6129980, 3575821, 5390203, 3176150, 285838, 4963248, 2902075, 4262715, 6259777, 5677937, 7007778, 1059424, 6365813, 7950419, 925573, 8313399, 5292476, 2134967, 7281546, 2717888, 3597495, 3492668, 2062518, 3845010, 7429111, 4335417, 1327773, 7136735, 8187227, 4700109, 6486499, 6211795, 2797058, 2519385, 7015187, 2079427, 6372435, 5317176, 3965252, 2928176, 5876382, 5121900, 1162414, 642330, 6383348, 5893097, 51428, 5835574, 2937850, 5972764, 1855507, 3267790, 7455812, 264858, 5564922, 4758826, 884993, 1607726, 3265364, 7148294, 8091595, 131995, 8061313, 1011446, 3502483, 2229343, 559564, 5125686, 2979146, 1681278, 7104775, 3603982, 658824, 4958666, 1924888, 3487831, 4370447, 7134267, 165753, 4049890, 3586582, 7579657, 7986363, 5025107, 3121885, 7234851, 5940341, 1776020, 1324805, 5778235, 4727508, 509985, 4217559, 5197029, 6112860, 5483161, 7832985, 2735436, 4844039, 5681837, 1624960, 6506659, 4278687, 3165902, 1662950, 4698023, 314344, 5609489, 1436721, 4100014, 4539342, 7637951, 1338933, 5111603, 4160731, 7955561, 7756072, 5026188, 7704780, 3503469, 1545409, 5985360, 2287942, 3539150, 6131328, 5717386, 1338790, 3847046, 5032089, 7919773, 1125763, 2608017, 7687993, 2419895, 6489167, 6157808, 36230, 1243929, 7559586, 1683170, 3551563, 8000633, 5150948, 2086616, 7132968, 7129578], -[4178864, 8277210, 5532799, 3218212, 6790163, 4187444, 2718546, 8115736, 7414998, 8001594, 7388631, 7101592, 1756098, 5221140, 2733177, 3585605, 1546552, 5457291, 4358642, 5729935, 8171151, 5270187, 6621524, 4792252, 1806432, 5189620, 3355374, 4292954, 6032600, 7034028, 4465204, 5923506, 6067931, 4965865, 5536899, 5233880, 1012182, 3630257, 1335508, 1411742, 5761884, 8076663, 6156523, 5055876, 6306172, 2901626, 4463774, 594131, 1397757, 6836423, 3668147, 518416, 4712382, 3664480, 6365108, 5717459, 7414061, 97817, 1144430, 3875542, 1914959, 3703393, 3490974, 5347691, 2507083, 3422451, 3823956, 3653016, 2368429, 1508086, 5040565, 6271546, 1772742, 2014764, 2395473, 4203579, 6743936, 3291102, 4452066, 4772126, 3044442, 4542497, 7416197, 2784765, 4773584, 866291, 2360281, 7954249, 5463107, 1113964, 3902206, 4905848, 4506947, 2676638, 6456490, 2645741, 6528962, 1279653, 7660350, 4749827, 5684602, 1359909, 6278744, 1893510, 522560, 3439150, 3602204, 6520710, 4153727, 5165463, 1783411, 2788112, 978583, 271029, 356134, 7545202, 7327858, 4583913, 1248438, 5334990, 6410543, 3664754, 4649432, 7826286, 6240735, 3404418, 5247367, 5636298, 3228859, 7948000, 779498, 3714494, 6705896, 1105196, 1748120, 769327, 2602638, 2995923, 2638239, 3052068, 1153111, 7426747, 4347428, 3642786, 1620233, 7510548, 5582057, 261765, 1905857, 4685302, 6989285, 2525028, 7195938, 6387725, 4332855, 8346752, 3447180, 4669923, 5935284, 285504, 5365387, 750458, 8129534, 3799319, 1372994, 7690717, 8359932, 5952268, 2668843, 7513519, 1579797, 4435194, 4921456, 658245, 3485380, 7658826, 3840696, 5574612, 4367784, 3239, 8123551, 6602237, 5667529, 4150683, 7406043, 6951162, 457930, 2755552, 5924780, 4999538, 2411501, 4675458, 5973794, 6885773, 7635583, 1974600, 5970090, 7375076, 609644, 6136632, 2900815, 5589889, 5697995, 4481884, 3082135, 5600754, 6156159, 7533243, 4028948, 6366842, 3924093, 3608754, 635457, 134163, 8108403, 7106940, 2982117, 7415341, 1557420, 2662532, 4049024, 5398253, 6856813, 3861902, 5061633, 3629702, 3775152, 1752335, 6045490, 512500, 3625326, 1036820, 8103889, 2566336, 237309, 6700378, 2726792, 6711521, 1516383, 2430096, 5837929, 6135308, 72440, 2725875, 5373620, 5296413, 1970212, 253842, 5143391, 1334811, 7346455, 2498019, 892858, 1261856, 3923925, 160647], -[6221069, 5071213, 5233243, 7246516, 3046386, 273627, 5694753, 7681721, 735904, 489493, 3912647, 7563435, 6490180, 5709317, 679610, 8218614, 3632908, 8215178, 1857135, 471651, 4275627, 902876, 2906103, 5080494, 7485157, 4813643, 4928297, 4382962, 1979118, 6521219, 3324312, 4699111, 2187205, 4575640, 36504, 4854473, 3738509, 302508, 7146744, 1283310, 1278234, 470192, 8005346, 4516256, 6393546, 678454, 5913550, 1680792, 2687720, 1387465, 5423539, 983550, 5686987, 6830164, 6230790, 3064320, 1757874, 1160485, 4682885, 5590351, 7336287, 1468845, 6045909, 355318, 7435146, 3946098, 8132779, 7031334, 2259491, 283119, 5576844, 7218700, 6617910, 6836036, 1211007, 4156113, 3572456, 6043257, 6003709, 210808, 3306411, 3622281, 3844378, 4937849, 5442651, 2508505, 5151961, 8286856, 3430099, 3407125, 7985566, 6688200, 6544157, 4587968, 8121026, 3182973, 2769884, 6828778, 734197, 8010322, 4755409, 7346488, 1837274, 4517110, 1143531, 5554115, 1965115, 2848029, 6097548, 401415, 7388084, 2308525, 3123792, 5976925, 2220815, 5352830, 1573176, 8132143, 5906450, 3726028, 3712508, 1376363, 6849912, 3997916, 2457556, 6535367, 7514308, 1847727, 3601701, 6601238, 421057, 323638, 5714366, 7714466, 2329932, 1898765, 2919818, 1855438, 2490488, 1679539, 3696100, 8258064, 80120, 2810612, 5794690, 6289830, 7137786, 8241390, 4079243, 4695290, 7538821, 848760, 3371600, 2781355, 1332621, 1788241, 1581302, 3810196, 8146826, 8259256, 3635062, 6948963, 5759538, 5329513, 2575877, 5985047, 3670581, 8287533, 1433224, 6968974, 1689972, 8329324, 2851238, 1399880, 3950314, 4870868, 5809209, 5786978, 1618821, 2353114, 2724445, 537420, 4222432, 2610595, 2320445, 549069, 4081970, 1337054, 7455098, 5989622, 8190909, 5269272, 5767226, 7062700, 2131884, 6750889, 6383646, 5639975, 3965719, 3676893, 5999022, 3380634, 5790412, 955174, 101834, 376619, 4980827, 2251034, 3538843, 6171621, 1335011, 1892849, 3536724, 379733, 6254120, 8097074, 1096294, 3916145, 8099159, 1343321, 5113737, 5408085, 6582044, 3339295, 2976983, 2469362, 4578346, 6761458, 5338976, 4039662, 2507110, 2771830, 3062742, 4292093, 688234, 5653998, 716460, 5051071, 5225527, 681557, 3145204, 5319600, 334900, 654509, 5638807, 2085146, 671948, 7761143, 7704097, 1184162, 7175874, 2570267, 49697, 3716326, 1299761, 3596815], -[2798587, 1932060, 6277196, 739855, 394065, 3463139, 570713, 5907339, 2481270, 3662599, 5151296, 3173381, 3585865, 548692, 6675016, 6809766, 7943215, 8249315, 3790498, 7866708, 3941080, 6414760, 5259566, 1292680, 6127024, 3219474, 3174223, 8001594, 189592, 138203, 6512524, 570861, 6102423, 1690139, 4925457, 2536026, 3317607, 1465107, 1642101, 3906423, 5954211, 3659285, 3195631, 4075032, 6845971, 6924700, 7399565, 6300612, 4028667, 638443, 6753233, 4258961, 819926, 3963997, 7340562, 4934500, 8283505, 7109253, 8308459, 1570973, 148388, 5132258, 5959189, 5252142, 2068184, 2457432, 5665769, 7730135, 8147106, 376675, 7650836, 7873943, 7062391, 5927148, 7014981, 4609955, 2861548, 384626, 2103925, 1762087, 3334571, 5285202, 8311061, 6300850, 7733814, 7238551, 3172392, 1200346, 3710567, 3948624, 2647832, 6691477, 5046141, 3287839, 2621535, 5394494, 1316203, 6617643, 8312807, 5982983, 7334321, 6862573, 7290411, 1312422, 7847077, 4044970, 2672770, 1427387, 4811123, 8118408, 5318624, 2215143, 5943613, 7135381, 3275137, 4111365, 5518411, 2794886, 3757217, 8220196, 6160631, 920659, 620286, 6716008, 1575680, 4864910, 783726, 1394414, 580768, 8301555, 4246935, 3814756, 4669168, 7677617, 4661095, 5968123, 5539826, 7820909, 5619281, 7503995, 3381907, 1943706, 7096689, 367795, 5329341, 2898402, 1759147, 1520293, 6390486, 7018582, 4853391, 652576, 8037335, 8195819, 5230643, 6671359, 4097904, 1305292, 3714808, 6402737, 6691742, 3363707, 5914525, 2603540, 2459967, 2328322, 2083674, 4640373, 7734788, 4076304, 7249487, 6721964, 5183438, 2792513, 2654167, 3517871, 3390069, 2448401, 9157, 6469505, 5326077, 4219253, 1427769, 3390249, 131629, 784738, 3403761, 5448113, 5812172, 1210943, 5432614, 655410, 8366712, 4187701, 7876775, 6444733, 6577200, 5625561, 6190829, 7717858, 7396412, 3466281, 2575216, 5180091, 1190168, 3721634, 4696209, 5466607, 3463744, 3196113, 5491204, 2277874, 1880116, 5581699, 4968880, 6038829, 3036991, 3496696, 227665, 2514383, 1683790, 4290910, 5758880, 1516484, 5530904, 570074, 1217501, 8154645, 8326953, 7022, 148950, 2547509, 3990961, 405386, 529996, 1967496, 837573, 2573733, 6146199, 4357622, 4722384, 5752651, 5965459, 2017400, 1466182, 1007632, 3725146, 2226866, 4262580, 2319173, 4851481, 5226915, 6062827, 4587659, 776790, 5919797]] -aHat * NTT(y): [[4353692, 5048177, 801391, 576865, 5871765, 6252585, 7465370, 186136, 3504805, 6073060, 2228432, 1605873, 7451066, 1616403, 5584379, 4341230, 7359284, 5762964, 4997819, 4456214, 7523576, 2099024, 6130237, 1055023, 8088381, 2282984, 4153079, 5579630, 6962123, 3858284, 6119695, 4457767, 4666119, 228485, 3854215, 8099180, 4643912, 4257606, 3177559, 3135056, 3639849, 7757802, 2096630, 2213004, 7368272, 3772597, 7868678, 5629074, 2174686, 6914100, 7303605, 950259, 8280872, 699475, 4016484, 3322830, 1883449, 3854522, 6006936, 2631445, 8053882, 6674021, 241381, 5048386, 1545904, 3859296, 4783187, 1109343, 6239057, 8285136, 5101044, 7813898, 436930, 8250640, 3110701, 8175078, 4363994, 2100130, 1976302, 3033362, 6644228, 2174377, 3091381, 3247049, 3329611, 6975717, 2924381, 13764, 5896559, 174175, 3855191, 5245158, 343947, 3467010, 5949901, 2454555, 2982182, 6153818, 7862746, 3051280, 1605784, 2958351, 4869784, 8025145, 6097104, 1382431, 6075556, 3084004, 5170117, 1562121, 3535913, 3791005, 4706879, 2629851, 3489184, 112577, 8222955, 2365891, 1005617, 2828492, 7909693, 6017852, 2218640, 5764700, 5461341, 1185790, 2272654, 6711460, 42942, 3515681, 4282320, 6402239, 2142770, 7523713, 3236075, 297844, 1440040, 7094358, 1931694, 139857, 5891260, 1596241, 6535867, 8344683, 3830882, 5106051, 604954, 7429707, 7078697, 6638027, 2540562, 2101819, 1124933, 442161, 6227052, 573461, 154368, 5038560, 8210269, 644696, 6000172, 7171980, 5390423, 8096820, 4895302, 7358454, 2502384, 6260099, 7278040, 3578500, 7694700, 4933454, 5347081, 3417200, 7997460, 2398739, 2869745, 4611598, 2414021, 3577643, 7737332, 2121445, 3247120, 4673961, 3272341, 2355845, 385931, 7275147, 5608293, 5691917, 7303988, 7031679, 530681, 4543860, 513030, 6536974, 532849, 4540802, 3316414, 1450980, 1394302, 5858210, 4373408, 7510238, 2456810, 5650429, 2529673, 8251471, 3834347, 1917675, 3316559, 686638, 689049, 6413634, 7439663, 3701099, 4531644, 2042082, 8005752, 6507205, 7389037, 37450, 3727399, 5461799, 2573871, 4841323, 680402, 7518464, 2138818, 8127928, 6739315, 2970565, 2237299, 7189858, 1205158, 2516134, 100081, 7932786, 6538105, 8299739, 2886258, 5372459, 6513398, 3063269, 1561643, 269133, 1150140, 5906916, 8197992, 3721737, 5695862, 2587735, 5716960, 5793312, 4970017, 8319353], -[738060, 3232700, 7967298, 6079826, 8240678, 4329585, 6843740, 7763930, 5548893, 2044020, 7566831, 2433770, 519751, 5889672, 355766, 4942098, 8354750, 3607886, 273603, 5204862, 4935492, 4915302, 8167655, 3218985, 8245930, 5262332, 1010710, 3177209, 2316288, 3547964, 5589198, 1429728, 3136218, 1238158, 364063, 2154533, 4261315, 8229063, 6129089, 3016456, 6185527, 6884298, 6524022, 351428, 6616844, 22500, 1614010, 994962, 7287316, 6892081, 4887638, 707065, 1202420, 2578208, 5570477, 3022302, 137766, 3589061, 3842660, 2001695, 5196551, 892043, 998239, 1341095, 1459376, 230011, 5295960, 1664877, 920372, 7991123, 2814081, 3503745, 4987092, 3005585, 8221651, 4563522, 256165, 4055658, 5343786, 7168390, 3665489, 7869730, 2692333, 3480480, 463771, 3637718, 208051, 2599526, 4162932, 2010474, 6233801, 166421, 1816076, 2096811, 6163768, 2630813, 7558773, 1858856, 6301860, 346505, 7280218, 175373, 1229202, 7767864, 7705021, 6423207, 7234789, 1595767, 6492944, 1055356, 6971535, 4702393, 1951640, 1301153, 2253464, 7900522, 6375856, 5728677, 6815739, 5114008, 645650, 7084458, 8338522, 473792, 8346457, 6734123, 7778742, 4188560, 7218521, 1116878, 353790, 3891248, 6715531, 1375148, 4929901, 6971147, 3038151, 3074678, 914604, 4991566, 6402240, 1102720, 3133643, 1326364, 411158, 2859705, 2100114, 4135231, 1186564, 3102643, 7672655, 580019, 6022456, 7728292, 4985711, 2798353, 3636949, 3057338, 6686604, 8330880, 1855755, 4677768, 365168, 1584011, 3116224, 4372354, 8362768, 8074099, 4519801, 7908049, 6846324, 7461038, 1093905, 6493311, 8043076, 7945174, 813821, 830477, 4618119, 255864, 3694847, 7123989, 6998601, 5718793, 3332595, 440019, 6466879, 6807085, 462422, 8140442, 3979677, 6770976, 1796222, 3933862, 3745957, 4470120, 3481188, 5754506, 1169468, 4861912, 1945747, 5171317, 3265332, 3429754, 5092470, 7508356, 6138332, 5894295, 593405, 7020983, 5083692, 929673, 6883013, 5448237, 497658, 5457403, 8212937, 6396419, 4912114, 246600, 3242305, 3090218, 2262760, 3361457, 3009838, 3895765, 7482885, 944689, 8286046, 763236, 5406299, 6851962, 5596328, 2704189, 6769011, 6660318, 3350371, 1211374, 7566229, 3677063, 4750253, 6746456, 4065769, 644609, 7644778, 8120011, 7688289, 7736713, 4579698, 7779359, 7868078, 7735865, 6712663, 3611674, 1035051, 6240036], -[2608116, 2639997, 7069639, 5437784, 6827606, 1998995, 3184681, 5699063, 6100134, 7241135, 1726100, 677525, 7499890, 2431889, 6200308, 259086, 1315171, 784564, 8121128, 7968989, 6865461, 2038823, 4877810, 5560668, 7883584, 7346267, 6137992, 6236942, 683787, 4627933, 6315469, 7595758, 4603352, 4790238, 3200038, 3452426, 2797795, 7399453, 2597845, 2211253, 7035083, 6699980, 8268632, 5945207, 4154418, 975930, 2899561, 1430002, 1727048, 2924544, 5148192, 7341274, 6836422, 774949, 1245170, 4173473, 3403874, 7982762, 7714365, 7486628, 4064345, 8272019, 4316131, 7833828, 3115529, 4583931, 6979684, 1160292, 3013105, 5508270, 7384846, 4665061, 7942141, 1076647, 648083, 517547, 2701137, 8363539, 5818872, 5653384, 1205296, 5732793, 4231045, 8378719, 1789038, 6101557, 869751, 4188502, 1501241, 1304758, 1537131, 5652471, 49117, 1478889, 6582812, 3807680, 4687241, 1742201, 7671462, 6687645, 5102031, 4838263, 4513572, 398874, 1596364, 7281575, 4858826, 609512, 4945384, 7345231, 852358, 7488300, 1915000, 5051692, 1984457, 97114, 3852843, 3411906, 3362368, 7542507, 966611, 1685613, 2325440, 3612235, 3111818, 5566544, 6916278, 1346133, 2332939, 6497066, 7929141, 5178877, 5402454, 1600647, 2566879, 3277628, 2673975, 3679263, 142807, 250735, 1287697, 5255598, 8315316, 980407, 5661699, 6018776, 2450922, 1310523, 3572412, 2758432, 5522308, 4931982, 7027495, 1625498, 5930962, 5764783, 3547948, 4995873, 5151973, 98678, 2347919, 5812659, 5278241, 526343, 5878530, 7641880, 7132254, 8273537, 2194115, 4135198, 1024375, 7637611, 1622093, 7717669, 6372977, 7602797, 6033441, 3310675, 8170655, 3035896, 5219046, 3763856, 3880224, 5303026, 5470773, 1112961, 7194288, 2120391, 699978, 2868071, 2254233, 2101352, 7186927, 4690283, 7481246, 3186783, 2064177, 7013141, 3493420, 1586114, 5304631, 274100, 1118326, 1694748, 3561125, 6936488, 3213936, 6538594, 324772, 1840949, 916147, 2701978, 204197, 4000529, 3554147, 778954, 803788, 6558478, 5330495, 645668, 1509269, 7107096, 1300847, 483125, 617165, 4492030, 3700032, 7429155, 2518311, 6382556, 5514368, 6802273, 4920761, 2660272, 5469550, 5849559, 2249208, 4559327, 2969632, 7041270, 3063274, 4084340, 2576837, 5214231, 4112947, 3260748, 23527, 7884933, 3188964, 2244500, 6364981, 2702024, 6032331, 1299146, 7754278, 3465935], -[1138512, 7566907, 7035146, 1279552, 3507202, 7211876, 929897, 108860, 3521083, 5554161, 5005824, 167922, 890861, 6643266, 2962597, 2288439, 6652557, 6349689, 5489954, 136949, 1522464, 2018825, 3052928, 7388027, 407824, 3728010, 184326, 6107534, 2210818, 2452624, 1354566, 4542882, 7144267, 1040041, 4849743, 5019032, 3910098, 4743124, 5582739, 3031105, 2811254, 5376443, 1273481, 5153077, 7244128, 990743, 845956, 4659615, 8181230, 6581889, 1108975, 4097986, 7701391, 3219176, 7353199, 6991255, 1805830, 114527, 8000377, 3805619, 5909585, 963066, 820713, 3103933, 2752987, 5350402, 1075220, 8290902, 5517790, 4092341, 5008171, 676548, 3875217, 1693210, 6810503, 6472215, 4622516, 8233029, 3674513, 6542180, 4354263, 6165224, 4005461, 4769167, 6550632, 5707434, 7162072, 1284555, 1030848, 7484282, 7542440, 2188438, 609767, 274156, 5744171, 7179464, 2172112, 6150176, 7983009, 4211240, 3135953, 6792138, 5136384, 4660671, 2096948, 3155071, 2571849, 3179365, 5581203, 7398902, 2270545, 4048853, 3525706, 5986145, 5001563, 7132980, 5082908, 5215387, 3857781, 6200254, 2577322, 2771578, 2322713, 6805395, 3154821, 5414665, 3531576, 405061, 6619155, 432158, 6033939, 3913633, 7638193, 2576432, 6801758, 1330552, 3345240, 6496812, 6223375, 2392201, 8207976, 4976928, 6721484, 3246432, 6721201, 7646539, 1558843, 2396850, 3670704, 5653833, 3081704, 3212998, 4335394, 3384877, 1079687, 804826, 7970506, 3250602, 6141897, 7909757, 6047699, 6768169, 7961213, 8260428, 5717626, 4661333, 4425286, 2944052, 8299592, 3203905, 7102910, 6657340, 5780536, 956507, 7016581, 364759, 7756423, 7428274, 2086798, 5774733, 518438, 7485428, 7422195, 7020543, 1889255, 6847812, 7340228, 2076224, 4056747, 3586055, 3338376, 5916148, 3455345, 8375222, 8039757, 1201212, 2862066, 3918553, 1818303, 2458920, 4008328, 1639532, 5391017, 5627204, 1063742, 3010713, 7585007, 547434, 1931537, 7750745, 7700829, 225464, 5713566, 6069921, 1268004, 328077, 3544705, 1238722, 7482536, 5195323, 5330182, 2480840, 3571439, 4781162, 4038252, 1931907, 6369889, 6965785, 2132916, 5764207, 6708816, 5700308, 5414389, 5294862, 4018668, 6061098, 550368, 3338844, 1772725, 7379810, 3442708, 4982682, 866797, 8039685, 522561, 7762634, 4831191, 3517447, 8066381, 1789931, 7109925, 1018738, 1508398, 3994855, 2157616, 1318054]] -w = NTTInverse(aHat * NTT(y)): [[4090552, 3533489, 3040556, 7911513, 7938043, 4498751, 8247264, 4019279, 4489651, 1937009, 2134142, 8254119, 5094448, 5222799, 4576247, 3403906, 2975355, 2140940, 3628608, 5281315, 5109889, 1200233, 195163, 2108850, 6480104, 7855161, 3333152, 7956488, 3193974, 5711179, 7180786, 3453736, 1821842, 2110116, 2878243, 7162500, 4778256, 4585424, 5690153, 7214683, 7867794, 2415723, 2750775, 6199950, 5719012, 2555792, 8356651, 3060335, 2218881, 2981138, 880777, 2010263, 4240860, 3033290, 4162306, 7281551, 5050617, 2706197, 6037641, 2789071, 7542768, 5586676, 1796352, 7117584, 396604, 5672109, 2211396, 7377636, 3191925, 3589697, 3458243, 6379171, 6282224, 7514513, 8093269, 744491, 6530745, 6680303, 7959458, 6468404, 4554613, 1579512, 7291999, 7940063, 5019760, 6110959, 574920, 1509170, 2888154, 1483394, 4374310, 5359784, 8352303, 6983263, 3258247, 6175746, 1484936, 6603038, 4425884, 5388303, 7924352, 2295988, 357783, 6525701, 991874, 541802, 1891087, 1683548, 1436139, 6093709, 4703588, 2636067, 7443210, 3950995, 7438244, 944369, 1009384, 2164098, 1776297, 7705035, 2651433, 4265265, 2499396, 7229014, 4506901, 5760894, 3042795, 2855661, 7863673, 2822996, 4370369, 1689991, 4483121, 7462859, 5232048, 1998726, 6947975, 2216539, 854217, 3298338, 7281699, 67968, 4282308, 5533878, 2648693, 8270748, 7048058, 8080304, 945526, 1061351, 3105094, 6747922, 2060092, 4308541, 7899, 4691965, 1970672, 2573098, 2648528, 4774027, 4483315, 7794077, 5267629, 5118370, 6540218, 3008373, 8351187, 4767263, 5247715, 4942060, 3176502, 188236, 8036029, 468894, 8299608, 1200966, 3396215, 4071474, 7010176, 2333943, 1514853, 5727543, 7097700, 5803346, 747441, 728038, 3038012, 7421953, 3616257, 878509, 1073073, 1471585, 4678718, 6739394, 3823885, 3885780, 2141989, 5404595, 2739157, 3790080, 1495297, 3192452, 7681032, 7973598, 478836, 1872058, 6164948, 1242520, 2012693, 2823987, 4319384, 7352140, 2080489, 4333079, 6387854, 7945174, 3186302, 1021503, 5663058, 2112936, 5241400, 832081, 1374845, 2208928, 550747, 1558786, 118265, 239678, 6818495, 6013688, 7967061, 2194948, 5730629, 8373419, 823721, 6536521, 7935959, 3299061, 1701492, 7337991, 318236, 3178638, 5878875, 5250341, 4727458, 5440170, 5264828, 2273682, 3509101, 8219686, 8352834, 3882307, 3053324, 8316046, 6618579, 1562087], -[878938, 3249557, 2546737, 901344, 4319125, 6286731, 1073874, 4468646, 4873825, 6112187, 6504777, 6313410, 7373300, 5166865, 2229412, 4599942, 3176733, 5918893, 2110433, 2936140, 6373051, 667948, 4140520, 1725804, 204641, 6045189, 2252608, 4255291, 6262883, 163760, 1412968, 4821595, 7935453, 2708222, 933957, 4500050, 138844, 408630, 6502197, 7262840, 1163397, 5627306, 7402806, 7861057, 1758547, 2345204, 8356980, 6563412, 2313286, 2827412, 3402809, 7614175, 2277052, 8056482, 8107101, 213027, 6338730, 5233873, 6499462, 4748998, 1668948, 5198538, 5010804, 120779, 3959128, 2521763, 3670633, 1204808, 4361868, 6034800, 494841, 1871868, 6440200, 3117304, 8049483, 3828500, 5373817, 2031370, 1601600, 2532597, 1381862, 2748671, 6631491, 1934826, 1078559, 862694, 1304191, 1358889, 4440775, 2431981, 4227383, 5697653, 5228498, 5039500, 1410003, 257044, 4666693, 1202107, 2010016, 131507, 2318054, 3845556, 552283, 3459844, 837006, 2785903, 8262068, 3460199, 168305, 1760628, 3637969, 6024250, 3191775, 2150754, 3726576, 6757779, 1150298, 949237, 2102380, 7967130, 3188952, 572209, 7718459, 7493283, 1891765, 4931885, 5112738, 4430536, 8006791, 3746032, 3253506, 3174672, 1353867, 3154691, 508565, 888929, 5454374, 7955958, 24454, 3365575, 8282178, 777531, 845346, 3637631, 1453232, 2075734, 7096562, 6139591, 2722325, 5225277, 4241028, 3575242, 5945092, 5476576, 3198403, 1987397, 4866150, 312218, 1359972, 6746793, 1155214, 1801715, 2242161, 906046, 6792312, 4059310, 4229945, 2110549, 3332339, 2964876, 4447897, 1816874, 7746804, 7812956, 3920419, 8111815, 7091234, 1667459, 3087906, 1764031, 1450458, 2043160, 2442670, 6005704, 6558394, 116958, 5094677, 7847250, 7507664, 4095400, 7023782, 6392253, 7565551, 5319510, 6159000, 1731864, 3717139, 4391564, 6298226, 7473137, 4483685, 1636080, 5133935, 7818133, 1782733, 7111545, 852554, 2594918, 4266609, 6498212, 4522996, 1089165, 6790276, 3361049, 1549395, 3471617, 1201373, 3583212, 2444993, 6898816, 6552876, 3749508, 4700392, 3043028, 4661823, 4024273, 3202206, 6052747, 3482436, 7703626, 1196435, 2983682, 7233760, 3922570, 7127966, 3482486, 8250148, 2031260, 7079700, 8231754, 5264529, 7149341, 2404310, 1144725, 7516909, 1057587, 6292480, 1254399, 3497441, 4594875, 3333922, 4146648, 4679828, 4409222, 5228574, 4755418], -[949258, 2730384, 6772847, 2325014, 1541422, 6739241, 1315386, 6582122, 8247226, 1516007, 7681105, 3495421, 7583492, 2787120, 5028909, 5730230, 674353, 723156, 389094, 3351610, 2786893, 3410207, 7182702, 3925753, 7951764, 1790268, 5635310, 645113, 1930471, 4062226, 6584283, 5481427, 7089053, 2369054, 801270, 179953, 5926968, 900145, 5009571, 4245071, 7083092, 4422199, 2154899, 796250, 2306127, 7448105, 462157, 679943, 3571850, 5211288, 3964723, 1627455, 2886677, 7617132, 602119, 430905, 1396450, 2029600, 3595332, 3813722, 7886677, 2912068, 4070594, 5181576, 2186384, 1241029, 5447972, 8372516, 3924601, 945220, 4932906, 2502416, 2775615, 3899458, 4648100, 7216349, 1205996, 728357, 4907391, 1755333, 8288424, 5405263, 1603919, 7322763, 2751873, 150240, 3975486, 3486651, 1136953, 8166892, 2507859, 1668704, 3127259, 6027470, 991426, 2376955, 5207746, 3782224, 1431460, 4525537, 1370748, 2285534, 8264842, 4236673, 973783, 383807, 1251015, 5669850, 7226309, 7425110, 2469729, 2467342, 1239313, 1387187, 5256387, 6627559, 1212356, 8251804, 1550772, 3513287, 5458448, 2264605, 4823016, 4557317, 7078610, 2053054, 4192231, 3227316, 7132330, 3272839, 8370103, 6602303, 335850, 5233248, 3599779, 3155861, 6733495, 5649995, 7002782, 8226502, 2725156, 4449116, 3079731, 5580074, 5070515, 4990059, 7101675, 1823455, 5454129, 3142142, 8316183, 864244, 6821266, 1798778, 6960057, 614214, 6982659, 2677947, 4603311, 6327689, 947688, 1704442, 6221412, 285918, 4855096, 7098856, 7477311, 4693713, 7890139, 7016105, 1274072, 2291314, 4652673, 6812173, 5371564, 811237, 6047427, 829086, 3766500, 8203302, 524923, 6855414, 5086194, 1667802, 6406852, 1700252, 3011561, 2459790, 7337118, 5266765, 5923131, 5345145, 1769304, 3407946, 4193648, 2343293, 1675996, 1034255, 5944434, 7369101, 4438442, 626711, 6819989, 2672185, 2947413, 4675667, 1354402, 4029472, 852777, 5790913, 538542, 283230, 7903200, 3193834, 5107166, 3751001, 3769409, 6626424, 6530476, 3892262, 7618977, 2347059, 469100, 6639510, 2402352, 5861211, 1857368, 301732, 5798050, 8179576, 3993177, 5858735, 5940629, 3834140, 6203750, 7220144, 7716386, 2555009, 2765433, 1619297, 6618898, 2655535, 7063753, 5594193, 6014760, 892863, 2385558, 6808267, 1764062, 1516629, 3211851, 4537452, 4272330, 6767391, 820445, 5089936], -[5612534, 1325268, 5996650, 7140063, 1681842, 2797563, 136924, 1441163, 5564941, 4546184, 6692952, 5526876, 8172948, 3295924, 2117538, 942003, 537856, 7130446, 4618022, 315386, 5202296, 2536365, 2704110, 1645595, 2279123, 2757187, 1668750, 6575889, 1281181, 7823110, 4362281, 1640345, 1988457, 4866317, 5400951, 6308463, 618928, 7153979, 4755408, 422177, 4053260, 8019893, 8294628, 588143, 164887, 6052838, 6115248, 8229314, 2349695, 1175441, 7884808, 4357051, 6924038, 5656605, 7385258, 7334903, 4659417, 2368368, 4528565, 4124112, 3473584, 6171739, 3440859, 6266883, 5575069, 7371746, 774184, 3667157, 8146068, 504476, 2382967, 1810183, 1230436, 4020527, 7340243, 7440581, 355702, 87707, 3697082, 4713199, 5835854, 4796085, 8239673, 4897032, 6552996, 6498093, 7484998, 8043160, 6023693, 239341, 2000746, 2523429, 4501539, 4520298, 1870911, 5221338, 2598281, 4125043, 4410591, 2646252, 3217045, 7376344, 222515, 4477742, 62539, 4935544, 4626514, 6460484, 6297138, 7450942, 6141738, 6893121, 4973650, 2982908, 2595687, 1826015, 3986993, 5414018, 3013135, 1764142, 441615, 6275680, 3536442, 492634, 4252513, 4168546, 5352734, 6655757, 1204944, 4916046, 3013786, 6148695, 7162577, 1431994, 6560207, 676899, 1109492, 1164898, 1501136, 7532915, 5515742, 2508355, 6822032, 1612574, 2724830, 203269, 2208209, 2750082, 5071785, 5501531, 6956869, 4144941, 2774710, 380242, 2835160, 6167947, 6797382, 5293807, 2204194, 4913562, 2977351, 7930993, 5604160, 5116348, 1812952, 53486, 1528512, 1799805, 5768274, 756496, 4929665, 1920089, 4803189, 5243810, 6365143, 6579175, 603136, 5064057, 2339349, 3389408, 2453871, 8285616, 4584387, 6411732, 5144173, 99388, 2131575, 1452525, 3983634, 969828, 4378282, 8205045, 3782624, 5089001, 6059932, 2887528, 6174773, 7344489, 5339932, 1741106, 910857, 5289849, 173524, 7838004, 7318043, 963318, 7274591, 5262196, 4586343, 2937409, 3123760, 3424644, 7560800, 6039850, 6069225, 2810, 2261513, 3839467, 2230671, 7042500, 5789684, 2042659, 4722213, 5552956, 6514200, 2308786, 3086463, 7469164, 4034604, 2761265, 7080266, 1229916, 7932884, 7653844, 6534803, 7686752, 4716211, 4585792, 7261430, 4577991, 8113268, 927711, 4290933, 5754768, 8104430, 6030500, 2190639, 140086, 5741957, 188256, 8289244, 1625491, 32795, 6031073, 3321604, 3522678]] - -w1: [[21, 19, 16, 42, 42, 24, 43, 21, 24, 10, 11, 43, 27, 27, 24, 18, 16, 11, 19, 28, 27, 6, 1, 11, 34, 41, 18, 42, 17, 30, 38, 18, 10, 11, 15, 38, 25, 24, 30, 38, 41, 13, 14, 33, 30, 13, 0, 16, 12, 16, 5, 11, 22, 16, 22, 38, 27, 14, 32, 15, 40, 29, 9, 37, 2, 30, 12, 39, 17, 19, 18, 33, 33, 39, 42, 4, 34, 35, 42, 34, 24, 8, 38, 42, 26, 32, 3, 8, 15, 8, 23, 28, 0, 37, 17, 32, 8, 35, 23, 28, 42, 12, 2, 34, 5, 3, 10, 9, 8, 32, 25, 14, 39, 21, 39, 5, 5, 11, 9, 40, 14, 22, 13, 38, 24, 30, 16, 15, 41, 15, 23, 9, 24, 39, 27, 10, 36, 12, 4, 17, 38, 0, 22, 29, 14, 43, 37, 42, 5, 6, 16, 35, 11, 23, 0, 25, 10, 14, 14, 25, 24, 41, 28, 27, 34, 16, 0, 25, 28, 26, 17, 1, 42, 2, 0, 6, 18, 21, 37, 12, 8, 30, 37, 30, 4, 4, 16, 39, 19, 5, 6, 8, 25, 35, 20, 20, 11, 28, 14, 20, 8, 17, 40, 42, 3, 10, 32, 7, 11, 15, 23, 39, 11, 23, 34, 42, 17, 5, 30, 11, 28, 4, 7, 12, 3, 8, 1, 1, 36, 32, 42, 12, 30, 0, 4, 34, 42, 17, 9, 39, 2, 17, 31, 28, 25, 29, 28, 12, 18, 43, 0, 20, 16, 0, 35, 8], -[5, 17, 13, 5, 23, 33, 6, 23, 26, 32, 34, 33, 39, 27, 12, 24, 17, 31, 11, 15, 33, 4, 22, 9, 1, 32, 12, 22, 33, 1, 7, 25, 42, 14, 5, 24, 1, 2, 34, 38, 6, 30, 39, 41, 9, 12, 0, 34, 12, 15, 18, 40, 12, 42, 43, 1, 33, 27, 34, 25, 9, 27, 26, 1, 21, 13, 19, 6, 23, 32, 3, 10, 34, 16, 42, 20, 28, 11, 8, 13, 7, 14, 35, 10, 6, 5, 7, 7, 23, 13, 22, 30, 27, 26, 7, 1, 25, 6, 11, 1, 12, 20, 3, 18, 4, 15, 43, 18, 1, 9, 19, 32, 17, 11, 20, 35, 6, 5, 11, 42, 17, 3, 41, 39, 10, 26, 27, 23, 42, 20, 17, 17, 7, 17, 3, 5, 29, 42, 0, 18, 43, 4, 4, 19, 8, 11, 37, 32, 14, 27, 22, 19, 31, 29, 17, 10, 26, 2, 7, 35, 6, 9, 12, 5, 36, 21, 22, 11, 17, 16, 23, 10, 41, 41, 21, 43, 37, 9, 16, 9, 8, 11, 13, 32, 34, 1, 27, 41, 39, 22, 37, 34, 40, 28, 32, 9, 20, 23, 33, 39, 24, 9, 27, 41, 9, 37, 4, 14, 22, 34, 24, 6, 36, 18, 8, 18, 6, 19, 13, 36, 34, 20, 25, 16, 24, 21, 17, 32, 18, 40, 6, 16, 38, 21, 37, 18, 43, 11, 37, 43, 28, 38, 13, 6, 39, 6, 33, 7, 18, 24, 18, 22, 25, 23, 27, 25], -[5, 14, 36, 12, 8, 35, 7, 35, 43, 8, 40, 18, 40, 15, 26, 30, 4, 4, 2, 18, 15, 18, 38, 21, 42, 9, 30, 3, 10, 21, 35, 29, 37, 12, 4, 1, 31, 5, 26, 22, 37, 23, 11, 4, 12, 39, 2, 4, 19, 27, 21, 9, 15, 40, 3, 2, 7, 11, 19, 20, 41, 15, 21, 27, 11, 7, 29, 0, 21, 5, 26, 13, 15, 20, 24, 38, 6, 4, 26, 9, 0, 28, 8, 38, 14, 1, 21, 18, 6, 43, 13, 9, 16, 32, 5, 12, 27, 20, 8, 24, 7, 12, 43, 22, 5, 2, 7, 30, 38, 39, 13, 13, 7, 7, 28, 35, 6, 43, 8, 18, 29, 12, 25, 24, 37, 11, 22, 17, 37, 17, 0, 35, 2, 27, 19, 17, 35, 30, 37, 43, 14, 23, 16, 29, 27, 26, 37, 10, 29, 16, 0, 5, 36, 9, 37, 3, 37, 14, 24, 33, 5, 9, 33, 2, 25, 37, 39, 25, 41, 37, 7, 12, 24, 36, 28, 4, 32, 4, 20, 43, 3, 36, 27, 9, 34, 9, 16, 13, 39, 28, 31, 28, 9, 18, 22, 12, 9, 5, 31, 39, 23, 3, 36, 14, 15, 25, 7, 21, 4, 30, 3, 1, 41, 17, 27, 20, 20, 35, 34, 20, 40, 12, 2, 35, 13, 31, 10, 2, 30, 43, 21, 31, 31, 20, 33, 38, 41, 13, 15, 9, 35, 14, 37, 29, 32, 5, 13, 36, 9, 8, 17, 24, 22, 36, 4, 27], -[29, 7, 31, 37, 9, 15, 1, 8, 29, 24, 35, 29, 43, 17, 11, 5, 3, 37, 24, 2, 27, 13, 14, 9, 12, 14, 9, 35, 7, 41, 23, 9, 10, 26, 28, 33, 3, 38, 25, 2, 21, 42, 0, 3, 1, 32, 32, 43, 12, 6, 41, 23, 36, 30, 39, 39, 24, 12, 24, 22, 18, 32, 18, 33, 29, 39, 4, 19, 43, 3, 13, 10, 6, 21, 39, 39, 2, 0, 19, 25, 31, 25, 43, 26, 34, 34, 39, 42, 32, 1, 11, 13, 24, 24, 10, 27, 14, 22, 23, 14, 17, 39, 1, 24, 0, 26, 24, 34, 33, 39, 32, 36, 26, 16, 14, 10, 21, 28, 16, 9, 2, 33, 19, 3, 22, 22, 28, 35, 6, 26, 16, 32, 38, 8, 34, 4, 6, 6, 8, 40, 29, 13, 36, 8, 14, 1, 12, 14, 27, 29, 37, 22, 15, 2, 15, 32, 36, 28, 12, 26, 16, 42, 29, 27, 10, 0, 8, 9, 30, 4, 26, 10, 25, 28, 33, 35, 3, 27, 12, 18, 13, 0, 24, 34, 27, 1, 11, 8, 21, 5, 23, 43, 20, 27, 32, 15, 32, 39, 28, 9, 5, 28, 1, 41, 38, 5, 38, 28, 24, 15, 16, 18, 40, 32, 32, 0, 12, 20, 12, 37, 30, 11, 25, 29, 34, 12, 16, 39, 21, 14, 37, 6, 42, 40, 34, 40, 25, 24, 38, 24, 43, 5, 23, 30, 43, 32, 12, 1, 30, 1, 0, 9, 0, 32, 17, 18]] -w1Encode: D504A92AB65698B2ACDB8649D032719B112C622AA991674ACAF29819E69969E3845E03400C542C1664999B033E68979482C79CD12485E1A912E2A88A1862AA1A38200F7271401981C878712A2388C5A024089839677516C592A08ED59898073DE97325D8B929244344266075CE5AAA85018DCB05648AE36458CA6D2204649C1605AA001852553288577A04019D536120D948510BE7504884AA83021ECB739DCB25AA51E12D1C713003120424A8321E40886A949C42F47159C731D20A5010302245D41457685C1A2886E7C660D1B73C21612501C858617064AA536081209A8677A6090388CC23A18CBA06E12666C9A60555331917382822A452DC823487332A46711C5763799B760499B1040C3548C4B34A413281D1428D46B1A8D1909E8AB65D2A15454734149D0A482B414CC85282CE664D5F17299A708C46C21464652D117429695AAD650225C8D28062B0A5A7558A280726D4159E58B2A5494938968819A48448C6D490229541581581126A4066554AEB52AE9CD918A7111E122659D9B565854332C8788C2B824AE8A3790421488F64566AE20D4A35762543045FA159E5B510CC2910D356250F3A08C73251E9536DCBD10155A1350F859906A1250087984E5049C6DA241058301B856007B35A857078E6D934C7C18DC68A481D9361E5624565048CC23645A357AECE05759B562A1D041464520EA5838545120A59796669793018C9112041AD03B92562023527F77189643149F19DD7403A4F765484370469B451D4285228238CCDA708DE5A7D1F159A69F324A3537660D19009126116496CDDF195C913201D36766BB4144389095BE3248C938C477A258AC685839909950A0C0108AE8C915EA4779E188359122885DD494CEBD02846759E0230655FB66AA278AA60B03418A66C8E7539D11960808689E109921AE42815072542380D96C58D8606812622128681A05D43224EC0385B575A8FF08024C76890DA6D0A80241EA12919178EC3C6480D80895BB0205571ADD4063EE0C9250517A4666172D803492808020CC594DE927522039D95531A2A2AA21966626B71792BC8045E0024001849 - -cTilde: 71F7304848C9CF3A3BF5D462212B4725AC2117EE7E420270B25A58AF64729F7F -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, 0, -1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0] -cHat: [2060547, 2894636, 7854481, 3440460, 7408659, 7382511, 5753344, 7781768, 2569291, 5243091, 2508709, 98183, 7503405, 5855988, 5869363, 5431530, 3037109, 7040069, 4007987, 2558559, 5084072, 1121500, 2697270, 18930, 3455081, 2104488, 5486704, 4241590, 37711, 293768, 4053025, 4046341, 151387, 4400314, 1520689, 6661986, 4837455, 1987406, 5471255, 2398824, 5127474, 7291398, 810761, 2961828, 2976666, 14098, 1052468, 530915, 8087371, 1987589, 7468860, 5562550, 6069977, 405104, 6642566, 1432384, 6609915, 1114816, 3960605, 3520057, 7340203, 2615446, 5576690, 3588022, 7789971, 2329418, 6933375, 3326484, 5851931, 3765238, 1896988, 1112603, 7933813, 3564497, 7408935, 1348227, 8303007, 8148475, 1245175, 3840545, 4658220, 3845842, 7700782, 1334559, 3941281, 10085, 1618946, 2955767, 4589793, 3357080, 1603372, 3813239, 1790598, 8203716, 5547118, 5891871, 4034933, 4087417, 327350, 7755857, 4588875, 1098896, 812366, 2605200, 4971038, 2468348, 4837595, 5246139, 8310537, 6150263, 2610782, 6959320, 3630409, 8218449, 746511, 4784359, 1511540, 6929872, 2227873, 8111629, 2418331, 3895825, 740820, 3528240, 5015989, 4267510, 964977, 2569987, 7256883, 104590, 6575926, 3440328, 3659561, 3064331, 5988045, 6876436, 487414, 6805382, 1486151, 2912397, 2922991, 4958233, 7191685, 5001155, 420676, 3144110, 5771745, 306900, 4834534, 4550188, 7184525, 147935, 1854366, 3928521, 6591880, 1819398, 4736605, 6598766, 1627967, 2866657, 230487, 2490315, 7728564, 7952, 5701309, 6971169, 6900309, 7788825, 8102722, 3361077, 2030792, 795592, 5034542, 5497978, 7031061, 2085726, 3127851, 7322167, 8315444, 698629, 126497, 3627660, 6749191, 3918046, 5309870, 63570, 1210389, 4109730, 1802042, 3398839, 4438183, 6666873, 5883393, 7748759, 2199185, 7382899, 437678, 7266699, 1283604, 1332716, 4242910, 7003425, 1256013, 7745076, 1378481, 7597851, 4030073, 3968181, 3247517, 6336187, 4030801, 8128186, 6121167, 2430798, 1927348, 4319467, 3590488, 2016726, 6831074, 7076816, 3415906, 6541545, 3640538, 7453750, 8069489, 2360352, 4528264, 7911306, 2522286, 4766400, 7451410, 5929412, 8355526, 2772155, 5076047, 7145703, 5192019, 609356, 7282120, 5783468, 76837, 5363984, 6043085, 130560, 5036927, 6288616, 1167524, 8298475, 4576907, 648583, 3224319, 2288040, 6811346, 1326194, 6580441, 3865432] -cs1: [[7, 6, 8380414, 8380407, 9, 8380413, 0, 4, 8380415, 4, 8380411, 0, 11, 8380409, 2, 8380412, 8380416, 8380414, 2, 8380409, 8, 14, 8380401, 5, 8380411, 8380400, 1, 8380415, 8380403, 8380414, 1, 6, 8380409, 1, 0, 8380413, 8380396, 6, 11, 0, 10, 8380415, 11, 8380416, 8380414, 12, 8380413, 8380409, 12, 1, 0, 8380412, 4, 3, 8380415, 8, 3, 16, 8, 8380414, 8380415, 8380411, 8380416, 6, 13, 13, 13, 5, 7, 7, 8380416, 7, 8, 2, 8380411, 8380408, 8380406, 8380414, 8380407, 17, 8380413, 3, 11, 8380411, 8380406, 5, 4, 8380406, 9, 8380407, 9, 8380400, 8380400, 8380414, 15, 8380398, 23, 4, 8380404, 1, 2, 8380415, 8380410, 8380408, 8380395, 0, 2, 8380413, 9, 6, 8380408, 9, 2, 8, 18, 10, 12, 8380412, 8, 8380412, 4, 1, 8380410, 9, 8380416, 3, 8380393, 8, 10, 3, 3, 3, 8380415, 6, 8380408, 8380414, 8380409, 8380413, 8380411, 8380413, 1, 8380400, 8380413, 8380407, 8380416, 14, 2, 0, 8380406, 0, 8380416, 1, 8380412, 8380405, 8380401, 8380410, 8380404, 5, 9, 6, 8380415, 8380409, 6, 8380401, 1, 8380405, 1, 18, 8380401, 11, 2, 8380416, 8380411, 3, 8380395, 19, 8380413, 1, 11, 1, 0, 8, 8380404, 8380408, 8380413, 8380398, 8, 8380409, 9, 5, 14, 8380412, 11, 8380416, 6, 10, 1, 8380405, 8380411, 8380412, 8380403, 6, 11, 21, 8380413, 2, 8380396, 7, 8380412, 8380397, 5, 8380412, 8380413, 1, 8380416, 8380410, 8380414, 8380415, 6, 15, 7, 12, 0, 13, 8380414, 11, 1, 1, 1, 1, 4, 8380400, 5, 8380412, 1, 8380412, 11, 8, 8380407, 9, 11, 8380412, 0, 8380407, 5, 8, 8380416, 14, 8380408, 8380414, 8380403, 1, 8380406, 8380416, 4, 8380404], -[3, 5, 8380411, 8380411, 1, 5, 8380402, 8380416, 0, 15, 8380416, 8380411, 14, 8380411, 4, 14, 8380414, 8, 8380413, 8380399, 7, 11, 8380406, 8380415, 8380413, 17, 8380410, 2, 8380408, 8, 2, 9, 8380415, 8380409, 8380415, 0, 3, 8380406, 9, 8380411, 8380414, 8380403, 6, 8380412, 8380412, 7, 1, 10, 1, 8380402, 8380413, 3, 0, 8380408, 8380398, 7, 8380416, 8, 9, 13, 25, 1, 12, 6, 4, 8380402, 8380404, 15, 0, 4, 1, 8380406, 0, 1, 8380401, 0, 5, 10, 14, 12, 4, 14, 8380412, 8380413, 6, 8380397, 20, 13, 8380394, 0, 8380415, 8380398, 8380411, 8380392, 8380415, 8380408, 8380404, 8380407, 3, 3, 8, 8380411, 5, 7, 2, 8380411, 8380412, 0, 10, 6, 8380405, 21, 0, 8380396, 7, 8380399, 8380412, 7, 8380406, 8380412, 8380413, 8380407, 8380407, 1, 6, 20, 8380415, 8380412, 15, 0, 8380416, 0, 8380409, 8380400, 1, 8380412, 8380408, 8380408, 12, 8380413, 0, 8380416, 8380408, 8380413, 8380416, 8380410, 8380412, 8380408, 8380409, 3, 4, 6, 8380416, 6, 12, 21, 2, 8380407, 5, 8380416, 7, 8380404, 8380413, 8380415, 8380407, 8380413, 8, 8380412, 11, 8380411, 8380416, 11, 8380411, 0, 8380414, 8, 8380409, 8380406, 8380412, 8380401, 6, 0, 9, 4, 8380408, 8380398, 11, 8380400, 1, 4, 4, 9, 8, 6, 2, 3, 5, 4, 9, 9, 9, 4, 8380404, 7, 8380411, 8, 4, 7, 9, 0, 14, 8, 8380414, 8380409, 8, 8380414, 6, 8, 10, 8380405, 8, 7, 8380416, 4, 1, 10, 8380416, 2, 10, 8380402, 0, 2, 11, 8380397, 8380414, 8380412, 5, 5, 5, 8380408, 7, 8380416, 3, 8380411, 1, 6, 8380405, 8380414, 19, 3, 4, 8380399, 5, 9, 7, 1], -[8380412, 8380411, 8380414, 3, 12, 8380406, 10, 3, 8380410, 8380403, 8380409, 8380410, 8380412, 8380402, 8380414, 8380414, 8380413, 13, 11, 0, 8380416, 8380416, 7, 0, 8380407, 5, 6, 8380402, 8380416, 8380411, 8380415, 3, 12, 8380397, 8380411, 8380415, 2, 8380414, 8, 1, 13, 8380416, 8380406, 10, 8380415, 3, 6, 8380404, 3, 10, 8380405, 8380416, 2, 8380407, 7, 2, 8, 4, 3, 8380408, 10, 0, 8380416, 17, 8380407, 8380409, 8380411, 1, 7, 9, 6, 8380412, 8380414, 3, 14, 8380413, 1, 14, 11, 8380412, 5, 8380402, 8380411, 10, 2, 8380409, 6, 2, 8380415, 8380416, 8380414, 8380415, 3, 8380404, 0, 0, 4, 8380411, 8, 6, 3, 0, 8380412, 8380402, 8380407, 8380397, 4, 4, 8380415, 6, 3, 13, 4, 5, 11, 0, 11, 2, 8380409, 10, 8380412, 3, 16, 8380408, 2, 8380414, 8380415, 5, 8380412, 19, 8, 8380413, 5, 3, 8380416, 15, 1, 8380411, 8380410, 8380404, 8380416, 8380412, 1, 4, 8380411, 2, 8380413, 8380398, 11, 1, 8380399, 18, 8380411, 8380416, 5, 8380410, 8380413, 12, 8380401, 9, 4, 8380399, 12, 0, 8380399, 13, 8380414, 0, 12, 8380416, 8380408, 8, 1, 2, 10, 3, 8380399, 7, 8380414, 8380414, 9, 4, 8380410, 3, 8380409, 8380402, 14, 8380416, 11, 8380406, 8380405, 8380416, 8380398, 4, 1, 8380400, 5, 2, 8380410, 5, 8380406, 15, 2, 8380407, 1, 14, 1, 8380408, 8380412, 4, 7, 8380412, 8380400, 14, 6, 8380408, 8380415, 5, 12, 2, 8380412, 4, 8380394, 14, 14, 1, 13, 11, 8380416, 8380411, 3, 8380407, 14, 8380411, 8380409, 8380410, 8, 0, 8380412, 8, 8380407, 1, 8380406, 8380400, 8380406, 16, 8380406, 3, 3, 4, 8380411, 8380406, 11, 3, 8380411, 8380412], -[17, 0, 2, 8380409, 8380415, 8380415, 8380404, 9, 8380416, 15, 8380406, 8380410, 8380406, 8380413, 8380412, 5, 8380412, 7, 2, 8380414, 12, 6, 8380413, 11, 8380412, 8380413, 28, 8380402, 8380416, 14, 8380401, 2, 2, 8380404, 10, 8380400, 8380416, 12, 8380415, 2, 8380411, 8380416, 8380407, 11, 8380414, 17, 14, 2, 9, 7, 8380409, 8380409, 4, 9, 8380401, 10, 18, 8380410, 8380414, 8380411, 2, 8380416, 8380401, 8380411, 13, 8380409, 8380410, 8380407, 8380416, 8380414, 8380416, 8380412, 1, 8380409, 13, 8380416, 8380411, 22, 8380406, 8380408, 1, 8380408, 3, 7, 8380406, 8380405, 0, 4, 8380396, 8380408, 2, 8380410, 8380409, 3, 6, 7, 9, 1, 8380412, 3, 2, 1, 6, 8380415, 8, 8, 7, 3, 8380414, 13, 8380394, 8380414, 8, 10, 2, 8380413, 1, 8380406, 4, 8380411, 0, 8380408, 0, 9, 8380407, 4, 2, 8380413, 6, 8380407, 3, 8380407, 8380410, 17, 8380407, 8380413, 1, 8380405, 7, 2, 7, 8380415, 8380402, 8380402, 8380416, 8380408, 8380410, 5, 8380404, 3, 4, 8380402, 1, 1, 8380409, 7, 12, 5, 2, 8380401, 3, 3, 8380402, 9, 13, 8380411, 15, 0, 8380406, 4, 3, 8380404, 21, 2, 8380412, 9, 8380407, 8380402, 7, 8380408, 8380416, 8380416, 8380408, 8380407, 11, 8380415, 8380411, 0, 8380415, 8380415, 8380412, 22, 1, 8380416, 6, 7, 8380416, 0, 8380404, 6, 9, 4, 0, 3, 7, 8380411, 0, 8380413, 8380412, 8380413, 8380403, 8380411, 8380406, 8380399, 8380414, 8380410, 4, 9, 13, 8380410, 6, 1, 8380416, 13, 8380410, 8380405, 8380409, 11, 8380404, 8380409, 16, 8380412, 8380411, 8380413, 8380411, 4, 3, 14, 8380411, 8, 5, 8380413, 0, 4, 8380411, 7, 8380416, 1, 3, 5, 0, 8380414, 9, 8380413, 1, 8380407]] -cs2: [[8380416, 4, 4, 8380413, 8380415, 3, 8380400, 4, 8380414, 8, 8380415, 8380410, 9, 1, 0, 6, 10, 8, 17, 8380410, 4, 8380401, 1, 8380414, 8380416, 8380401, 8380412, 8380401, 8380401, 8380399, 8380415, 13, 0, 15, 13, 5, 9, 8380416, 8380400, 8380415, 8380403, 8380411, 12, 8380407, 2, 8380412, 8380411, 11, 8380415, 1, 3, 8380412, 5, 8, 8380404, 1, 8380410, 3, 0, 8380406, 3, 8380400, 8380410, 8380416, 0, 11, 1, 8380415, 16, 4, 8380413, 1, 8380406, 1, 4, 1, 8380414, 2, 8380404, 6, 3, 8380411, 2, 8380416, 3, 4, 8380416, 8380413, 4, 5, 8380413, 3, 8380415, 8380402, 8380412, 14, 8380413, 2, 5, 8380401, 8380409, 0, 8380409, 4, 8380409, 9, 4, 8380411, 8, 11, 8380413, 8380410, 8380413, 8380406, 3, 0, 8380407, 9, 8380400, 5, 2, 8380410, 6, 8380415, 5, 7, 8, 17, 3, 8380412, 8380410, 8380414, 8380407, 8380409, 8380409, 8380408, 6, 0, 6, 23, 8380414, 13, 8380397, 2, 8380416, 8380408, 19, 15, 8380397, 1, 8380414, 8380405, 8380410, 8380412, 8380403, 5, 8380416, 8380411, 9, 4, 4, 8380413, 12, 8380407, 8380414, 2, 8380402, 2, 8380416, 8380410, 5, 8380413, 8, 8380409, 8380406, 1, 4, 8380413, 8380416, 1, 8380400, 4, 2, 5, 8380406, 4, 8380415, 15, 13, 6, 8380414, 3, 8380414, 8380406, 3, 8380410, 8380410, 6, 13, 8380414, 8380413, 8380412, 8380411, 9, 8380413, 5, 8380412, 1, 8380403, 8380415, 8380413, 8380410, 8380408, 15, 13, 8, 8380408, 8380415, 2, 1, 8380412, 8, 8380403, 8380411, 5, 8380403, 8380410, 8380402, 8380403, 8380415, 8380416, 6, 13, 11, 8380414, 8, 0, 8380411, 8380416, 4, 16, 8380415, 8380416, 17, 8380411, 8380410, 8380415, 8380402, 8380410, 5, 8380407, 8380416, 0, 6, 3, 6], -[8380406, 8380411, 3, 8380410, 12, 8380414, 8380415, 3, 1, 0, 8, 0, 8380414, 27, 8380408, 8380415, 8380416, 8380405, 8380408, 8380411, 8380412, 6, 8380415, 8380409, 8380414, 1, 6, 8380411, 4, 8380406, 6, 8380405, 8380415, 8380416, 8380409, 23, 8380406, 8380415, 8380411, 8380406, 8380409, 8380408, 8380412, 8380416, 8380413, 8380404, 3, 3, 2, 8380398, 8380416, 8380413, 10, 8380401, 3, 8380409, 6, 8380407, 8380415, 8, 8380404, 8380410, 4, 1, 16, 8380414, 8380408, 8, 8380416, 8380401, 1, 8380404, 8380408, 10, 8380404, 8380415, 15, 8380400, 16, 3, 8380405, 5, 8380398, 8380410, 2, 1, 8380414, 7, 5, 8380406, 1, 8380411, 8380405, 0, 1, 11, 8380408, 8380405, 3, 8380416, 8380406, 8380400, 8, 8380407, 8380411, 6, 8380410, 17, 2, 8380406, 8380415, 6, 8380410, 2, 0, 9, 8380413, 3, 8380414, 15, 8380414, 6, 8380416, 8380416, 8380408, 2, 8380406, 8380411, 8380415, 3, 1, 5, 9, 8380416, 16, 8380410, 1, 20, 11, 20, 3, 8380408, 16, 8380413, 8380396, 2, 1, 8380406, 8380408, 8, 15, 14, 8380414, 8380401, 13, 8380411, 8380407, 19, 0, 10, 5, 6, 8380416, 14, 1, 4, 6, 8380411, 8380415, 8380408, 8380410, 8380414, 8380413, 8380406, 8380416, 8380401, 8380414, 1, 8380406, 8380408, 3, 6, 12, 14, 9, 2, 3, 8, 8380412, 6, 10, 8380413, 8380411, 1, 8380405, 5, 8380401, 8380403, 9, 8380404, 8380414, 5, 11, 8380409, 4, 8380415, 14, 1, 8380408, 19, 8380401, 9, 1, 0, 8380412, 8380414, 8380397, 4, 8380412, 8380415, 8380404, 1, 8380412, 8380415, 8380413, 8380410, 0, 8380398, 10, 7, 8380401, 8380415, 3, 21, 3, 8380404, 8380411, 5, 8380406, 8380411, 8380404, 7, 3, 8380411, 8380412, 4, 1, 8380389, 8380411, 8380411, 4, 8380416, 8380398, 4, 3, 8380413], -[8380414, 8380404, 1, 2, 8380404, 8380415, 20, 7, 14, 8380403, 1, 8380415, 19, 0, 8380410, 8380408, 8380402, 8380413, 8380409, 8380415, 1, 8380402, 8380413, 1, 4, 9, 8380416, 8380407, 8380415, 10, 4, 8380402, 8380413, 4, 16, 1, 9, 8380416, 8380410, 8380412, 8380400, 8380409, 3, 8380411, 8380407, 8380412, 5, 8380413, 8380390, 9, 10, 8380400, 7, 8380410, 8, 11, 2, 4, 1, 8380413, 8380412, 13, 6, 3, 8380402, 8380406, 5, 8380413, 4, 8380406, 8380410, 8380416, 8, 21, 0, 8380410, 14, 10, 8, 1, 7, 7, 4, 0, 8380411, 15, 8380411, 6, 8380416, 7, 1, 8380415, 2, 12, 3, 6, 8380398, 15, 8380409, 8, 12, 8380409, 7, 3, 5, 22, 2, 8380412, 8380405, 8380409, 12, 13, 8380410, 8380415, 10, 3, 13, 8380410, 8380406, 11, 8380410, 3, 1, 1, 4, 9, 8380408, 19, 5, 7, 8, 4, 10, 12, 2, 8380395, 0, 6, 8380414, 8380411, 1, 12, 7, 11, 1, 8380410, 6, 8380412, 2, 22, 4, 8380406, 8380415, 8380414, 8380409, 8380409, 3, 8380412, 11, 8380409, 8380406, 4, 8380412, 11, 1, 8380406, 4, 8, 8380412, 1, 5, 0, 8380408, 5, 8380398, 8380414, 8380411, 5, 8380407, 11, 5, 8380416, 8380412, 9, 9, 14, 2, 14, 8380412, 8380414, 8380406, 8380412, 8380405, 3, 8380409, 18, 1, 16, 8380409, 6, 9, 4, 8, 8380402, 5, 8380416, 8380416, 5, 8380409, 9, 3, 8380402, 8380407, 8380416, 8380412, 8380413, 4, 8380412, 8380414, 2, 8380402, 12, 0, 8380411, 9, 8380407, 15, 4, 9, 8, 1, 8380404, 8380410, 8380414, 11, 3, 8380409, 8380413, 12, 8380408, 18, 13, 8380398, 19, 8380416, 4, 4, 8380407, 20, 8380413, 1, 6, 30, 12, 6, 1], -[8380413, 8380402, 2, 5, 12, 8380398, 1, 21, 3, 8380411, 11, 7, 8, 0, 8380407, 11, 8380414, 8380416, 2, 3, 8380409, 8380414, 8380407, 4, 23, 8380401, 8380412, 6, 12, 8380413, 13, 8380404, 5, 3, 8, 16, 0, 6, 8380410, 7, 5, 4, 8380413, 8380406, 2, 8380412, 11, 8380405, 11, 3, 8380414, 3, 8380400, 8380398, 27, 7, 8380415, 2, 8380410, 0, 8380413, 8380415, 8380416, 14, 8380407, 12, 9, 8380410, 0, 8380415, 8380406, 9, 8380411, 8380406, 13, 3, 5, 8380409, 8380412, 8380410, 8380411, 8380409, 8380410, 0, 8380409, 10, 8, 8380412, 5, 5, 8380412, 6, 7, 9, 5, 4, 6, 8380406, 12, 8380399, 6, 5, 7, 8380415, 8380407, 8380405, 15, 1, 8380401, 4, 8380406, 15, 0, 8380415, 8380408, 6, 8380414, 6, 8380414, 16, 18, 1, 5, 8380412, 8, 8380415, 8380408, 13, 14, 8380404, 1, 8380414, 8380416, 8, 8380410, 8380403, 8380402, 5, 8380412, 8380416, 0, 8, 8380415, 8380404, 20, 7, 2, 11, 18, 8380411, 0, 8380411, 8380413, 8380416, 8380416, 8380405, 8380390, 4, 8380416, 1, 8380393, 8380413, 5, 12, 8380408, 8, 8380412, 7, 21, 2, 14, 0, 0, 1, 8380413, 24, 15, 8380403, 4, 6, 8380411, 8380412, 8380412, 11, 8380415, 15, 8380393, 8380395, 8380408, 1, 8, 5, 12, 0, 8380415, 9, 0, 7, 11, 5, 14, 4, 8380410, 4, 8380412, 11, 8380411, 8380415, 8380378, 0, 8380405, 4, 8380415, 5, 6, 5, 8380397, 3, 6, 6, 8380416, 2, 4, 8380409, 9, 8380401, 9, 11, 8380405, 9, 4, 12, 8380408, 8380416, 8380408, 8380411, 8380409, 8380404, 8380411, 8380412, 8380403, 14, 3, 8, 16, 8380415, 8380413, 3, 1, 23, 7, 3, 4, 7, 8380386, 19]] -z: [[8364336, 8331574, 63047, 50114, 8262922, 29489, 110219, 8369413, 8286403, 29534, 41180, 8369367, 8276382, 8377025, 8335187, 8311830, 14327, 17025, 8311238, 8311109, 3301, 70666, 8378280, 8380044, 117455, 72966, 8262554, 67361, 8345188, 51091, 8357599, 51877, 86123, 101060, 30470, 8314136, 8364885, 34293, 8338079, 8344589, 8362741, 42513, 1538, 126596, 17080, 8279933, 8261434, 8294650, 8292458, 41954, 99297, 8313360, 8309204, 8303023, 8319565, 8370165, 10484, 8377219, 8340975, 8332160, 8290439, 8311936, 8374906, 89910, 8254952, 8251590, 48806, 128377, 8347529, 8350812, 8259583, 29172, 21321, 8269952, 108574, 59987, 115288, 50446, 29171, 8291994, 8346926, 117382, 61535, 124637, 8297633, 96065, 58746, 8376529, 109806, 8348472, 8320152, 64976, 8306174, 47445, 87525, 8315711, 34624, 52803, 8316474, 8298741, 112411, 30913, 8274340, 77529, 70540, 8326828, 91152, 107991, 8374914, 55213, 8319633, 80800, 1355, 81593, 82445, 33876, 8259686, 61864, 32371, 42320, 8334011, 8377641, 8374650, 8295968, 24695, 30012, 8270787, 110443, 8251835, 8377118, 8264453, 22287, 8305555, 65517, 49679, 8254929, 45749, 35097, 8291040, 40416, 8267022, 85829, 84162, 37358, 127855, 8255888, 63831, 8282890, 8273690, 8278560, 8324516, 8348044, 8347982, 14324, 7813, 114849, 8366230, 8329809, 103276, 8273674, 8313989, 83403, 8327270, 67835, 8298479, 13615, 8297358, 50553, 33185, 102491, 8327840, 8273999, 30101, 31622, 8297271, 19534, 8277667, 8319730, 21304, 8286459, 108080, 123569, 80722, 8377036, 8311269, 8339760, 8362525, 123051, 8325356, 32878, 8254748, 8289721, 41090, 8301515, 8287824, 4539, 54297, 8285015, 38958, 2296, 130731, 8316950, 82946, 66475, 8368766, 8340733, 19799, 8338660, 8374539, 8342911, 68567, 51804, 126577, 28065, 87228, 112461, 8334938, 8273634, 64632, 8374893, 18769, 8289306, 84360, 25690, 8294040, 46310, 27926, 8362332, 8264666, 8354315, 8364230, 28251, 92463, 51399, 25309, 4320, 106985, 128254, 8342615, 8355780, 8292097, 22648, 2459, 85279, 12366, 5364, 8309651, 8362620, 8358362, 14435, 91784, 8365695, 8317707, 4023, 8346800, 47919], -[8331043, 8306837, 8334968, 8352949, 26061, 118801, 8253463, 8298828, 97485, 8346394, 8279007, 8360013, 8374145, 130445, 108506, 15646, 33949, 113917, 107684, 84929, 121780, 8317438, 8372595, 8302315, 8295822, 6455, 34096, 112904, 8376622, 27509, 73555, 8313130, 8275836, 87542, 8256494, 12997, 8338447, 8270554, 8310065, 84453, 3592, 8309807, 8359853, 64066, 127673, 15901, 41891, 8369631, 54695, 8300009, 64506, 8250167, 8290098, 41574, 41385, 61943, 43700, 8318536, 8333015, 8304254, 8377597, 6937, 1051, 8379716, 130571, 104499, 94103, 114868, 107037, 122314, 28506, 66654, 18175, 85315, 8259011, 8376570, 40016, 63713, 39846, 8354612, 109729, 89347, 14218, 8277799, 8361726, 23904, 25231, 8302935, 117878, 8368867, 8347568, 8297795, 8259598, 8283402, 8379407, 23783, 8305470, 92958, 101372, 109096, 8341055, 8319146, 93400, 80416, 53525, 8263018, 8292171, 8368619, 119503, 81463, 8371742, 8273075, 73739, 65461, 8357163, 9023, 70704, 8340832, 8275322, 8264377, 8302525, 8316568, 14564, 8378789, 8306211, 83465, 77481, 103276, 17876, 8377361, 8292938, 37252, 102943, 8364395, 11804, 8305905, 8321637, 8338670, 125891, 8362217, 31660, 8276995, 126948, 8295400, 8285164, 8327702, 77366, 8336061, 94665, 8360872, 8317128, 15357, 93993, 8265351, 107493, 62071, 120494, 129783, 54135, 44803, 6450, 8337465, 8296419, 8335653, 92165, 4166, 8362416, 8279174, 8287716, 36725, 8253895, 8305442, 87448, 8254082, 8337446, 8314634, 8358462, 21873, 8340678, 124159, 8359267, 8283163, 95863, 8375681, 8304013, 8375075, 11575, 8350712, 8348366, 8305817, 54510, 8262237, 83404, 8298745, 8364004, 8306192, 8275179, 8288144, 8366943, 8298434, 41322, 97985, 8349657, 8279443, 8307933, 8355406, 8280714, 112048, 2305, 8290630, 21166, 42085, 46311, 60575, 38445, 8267040, 51402, 48730, 8296526, 100598, 40957, 110241, 8299433, 8256782, 8303093, 20007, 8366710, 117955, 8371426, 73413, 8370510, 30884, 8259979, 52389, 8254235, 88650, 8355346, 8366497, 57781, 8292471, 79419, 104938, 8274645, 48682, 8287691, 83626, 8265246, 50439, 33669, 36702, 40626, 64067, 8349545, 98319, 8322838, 8323937], -[106073, 8345595, 58144, 11662, 8337679, 62406, 8253665, 8259856, 8311260, 8379653, 119066, 72705, 8258467, 14148, 8307921, 8330622, 120015, 8356068, 8322227, 119464, 99308, 34090, 8341688, 8361338, 8353096, 50477, 8376529, 8288240, 33885, 2143, 48128, 67763, 119559, 8286230, 23901, 8253265, 8347944, 8302767, 66629, 2348, 71612, 60677, 8307699, 8288675, 41580, 103344, 88673, 28474, 115536, 119426, 107511, 8330185, 115543, 8364560, 50356, 8365136, 94176, 8339483, 8288326, 8359104, 8260060, 8249823, 103948, 8368544, 8280277, 8277879, 61809, 8353491, 43870, 8321221, 123129, 8263183, 8273606, 44618, 8380100, 120515, 8355091, 119268, 17997, 85394, 8354323, 21481, 8295942, 91345, 71580, 8351294, 8290117, 46192, 8273591, 34175, 93635, 105922, 8375487, 8349501, 8276035, 8354683, 92955, 8308893, 94605, 8339608, 127102, 8366391, 8357878, 58036, 8344099, 29850, 8372654, 8298816, 123750, 8305090, 98313, 8261025, 8261146, 8294708, 8301875, 42308, 124662, 8330809, 30776, 12899, 8615, 1893, 8263149, 5513, 8301039, 8262748, 8276016, 127070, 104075, 69279, 1777, 8332312, 8266563, 27527, 71853, 113347, 128814, 80299, 5831, 97064, 8328750, 55491, 73529, 68565, 8272214, 8346380, 8287459, 8251562, 8315717, 8370657, 31661, 8268320, 8326293, 74078, 8358674, 128808, 45467, 8270303, 37522, 8363980, 8375150, 8255745, 89981, 99201, 8332829, 125387, 113820, 92266, 8302562, 8292604, 8312193, 53440, 8272197, 8253117, 8275401, 61664, 67162, 98468, 126596, 87428, 8250156, 8380248, 44623, 11381, 32071, 35705, 29686, 76351, 8326797, 65153, 8324569, 11974, 80934, 8327129, 1031, 28985, 8298502, 129013, 95342, 8313425, 77516, 8361350, 8259057, 8317810, 8272419, 8371127, 8260786, 111068, 64847, 8339665, 8254965, 8370209, 36569, 8342477, 8257953, 1420, 10837, 90937, 8339734, 5751, 64047, 44528, 35277, 8370451, 126738, 8263323, 63095, 8288148, 8363503, 8358026, 102761, 411, 125543, 52185, 39065, 8299437, 8312084, 8358871, 25278, 8375597, 8276386, 8270646, 114689, 8289714, 10392, 8297562, 96818, 8267028, 8254845, 81968, 8336401, 8294083, 70453, 8285475, 8351614, 8261145], -[8281860, 8301654, 8292709, 8351447, 8300942, 8329564, 8317583, 8375213, 76004, 8369332, 72952, 78051, 8310465, 8325445, 8328702, 81374, 8258219, 8369357, 8347957, 20784, 104053, 37146, 8356986, 110176, 127714, 8299810, 6682, 117966, 19691, 76894, 8288474, 8333736, 8352444, 8264572, 50149, 44356, 2178, 2887, 8345115, 6862, 116561, 119653, 82401, 8320531, 11917, 111351, 34950, 8361184, 18021, 108194, 8339344, 8564, 8331083, 80792, 8347304, 173, 69142, 8323535, 87420, 8265696, 29115, 55758, 8367271, 8256104, 129351, 8342639, 771, 28624, 20945, 91572, 8271131, 46010, 44492, 99910, 8357051, 29550, 122946, 93691, 8309224, 42566, 122675, 101620, 8334155, 87628, 75047, 38480, 43221, 123142, 123009, 117261, 8307594, 8348694, 8360176, 8294929, 8316567, 40168, 28807, 8327424, 121508, 64820, 106287, 8250092, 8309204, 8357412, 8278320, 81992, 8330219, 8254625, 8342969, 83792, 8370632, 40535, 8356425, 8326480, 8262866, 130590, 8278192, 85684, 66417, 99519, 8289715, 8304490, 8340823, 8292046, 8309768, 8292049, 8338031, 8283593, 8305618, 8372035, 4907, 8365720, 83090, 8278400, 8339419, 88589, 8329121, 85886, 8255190, 63543, 41157, 37516, 8255726, 8351839, 8371029, 8325931, 18798, 8350446, 115333, 8302445, 8377704, 8324677, 69347, 127947, 69310, 73747, 15252, 55913, 8340545, 8349696, 8347127, 8258335, 8257345, 95557, 77202, 8362883, 93252, 12570, 8281356, 40464, 8354748, 8360832, 8303467, 82405, 8340590, 94407, 47397, 112093, 8325499, 30100, 8349847, 8361547, 8283315, 8260168, 15728, 8291049, 8309797, 49075, 96813, 8342620, 40936, 99384, 129507, 8300502, 47404, 8266115, 10388, 109649, 8342714, 8328521, 81863, 95901, 122787, 8260907, 8367842, 65348, 112057, 8352063, 8316074, 69648, 37917, 65655, 8270430, 8357467, 75156, 103350, 8296578, 8313121, 8370688, 42970, 8255414, 34601, 39431, 60535, 117672, 8307960, 95946, 8362764, 62899, 8282093, 48716, 8338520, 8285594, 8296991, 43889, 39725, 123337, 8338741, 112531, 8315640, 63204, 8379958, 8324676, 60816, 3093, 41214, 8333944, 8291341, 8310041, 52392, 8330814, 8251436, 50398, 115455, 35718, 8325553]] -||z||: 130731, ||z|| check passed -r0: [[90809, -85331, -6872, -87971, -61443, -72388, 57329, 19531, -81482, 32361, 39040, 64174, -48089, 80270, 5111, -24452, -72079, 45828, 9775, -51670, -32643, 57465, 4698, 13749, 4329, 46153, -95195, -42984, -43898, -2723, -56844, 25371, -82798, 14997, 21270, -75137, 16647, 14289, -23750, -22947, 58784, -60303, 84267, -85352, 5090, 79765, -23760, 12900, -66685, -66287, -71546, -84836, 50647, -14142, -27889, 43918, -91904, 39698, -57207, -67878, -75795, 63237, 82183, 70417, 15676, -41822, -74173, -50458, -45979, -29123, 29895, 93858, -3077, 86416, 93777, -17366, 54972, 14061, -40017, -7378, -16526, 55806, 54365, -59424, 67693, 16107, 3529, -14538, 31190, -40323, -6358, 26789, -28112, -63890, 20364, 80884, -38772, -63204, 45207, 55327, -75128, 10420, -23137, 49921, 39562, -29599, -13557, -30622, -87581, -1150, -58008, -30422, 15118, -48738, 10145, -7951, 57074, 68985, 62138, 86470, -15065, 75064, 23358, -8616, -64240, 46967, -4637, -1316, 54646, -33959, -10296, -24182, -88005, 34771, 89528, 94095, 91265, -69029, 92355, 60427, 44070, 67955, 92120, 10420, -17802, 80805, 871, 80801, -6774, -81434, 57673, 81694, -35005, -72126, 7913, -69640, 66033, -93392, -17977, 12423, -87825, -14943, -65375, -24148, 64445, -39053, -29215, 5661, -85276, -9997, -61391, -2224, 36533, 87974, -80798, 58181, -32141, 71734, -36991, 48374, -8842, 13619, 50530, 89421, -14404, -33822, -9410, -6158, -2572, -73817, -69708, -52130, -82879, 73165, 14602, 76507, 46892, 71597, 72648, -19197, -28411, -45431, 62478, -25899, -92552, -32587, 70105, -90729, -82397, -32971, -61284, -75949, -14606, -47608, -87935, -54322, -51577, 69185, -50864, 17831, -91587, 70217, 41611, -76634, -20650, 35088, -72192, 49229, -38195, -81158, -32426, -90626, 16696, -7009, 61868, 60737, -63529, 61179, -12683, -90109, -62708, -59248, -25508, -82668, -34136, -83279, -68162, -11871, 80756, 29729, -27573, 73028, 5900, -64377, -47664, 38369], -[-73371, 11675, 70702, -50969, -61559, 1422, -68908, 87971, -78240, 17339, 28993, 28098, -54793, 24310, -56147, 28808, -61154, 14521, 15338, 79186, 87744, -93914, -49686, 11636, 14180, -49660, -32966, 65089, -22433, -26693, 79714, 60007, -64033, 41727, -18355, -71109, -51609, 27704, 26427, 25219, 20621, -86605, -25285, 52034, 44375, 59649, -23440, 87633, 27716, -29529, -25542, -4381, -8526, 57010, -82854, 22571, 53412, 91355, 23688, -12610, -45215, 56017, 58736, -69686, -40632, 45734, 51826, 62016, -18803, -60032, -76552, -32759, -35567, 69870, 50008, 19222, 40810, -63717, 77872, 56562, 48626, 82170, -34730, 30193, -64227, -89627, -29054, 25634, 60098, -44040, 37174, -16261, 85982, 87436, 76754, 66569, -94898, 59335, -85091, -58956, 32497, 36293, -19117, 31502, 75156, -71063, 72123, 31830, -22161, 46463, 19155, -70604, -46106, 55648, -82704, 91530, 7518, -3086, 7279, -32373, -48933, 811, -90564, 65188, -12866, -20181, -29779, 49870, 7305, -63251, 15617, -63221, 20610, -83196, -62843, -63384, -69083, -43550, 24443, -62797, 92223, 15684, 83474, 18819, -70459, -19372, 49393, 44754, 55838, 82741, 50805, -43588, 40711, -46864, -39498, 82763, -85904, -68729, 26724, 80543, 12425, 87533, -43406, -46288, -64393, 59562, 39731, 15451, 94453, -82539, 67232, -87763, -62216, 3943, -79324, -78121, 44069, -46718, 40493, 49864, -73257, -51950, -33374, -89158, 82609, -73508, -47854, 38218, 79573, -94814, -23396, -83519, -53003, -13483, 64164, 17683, -92125, 10906, 12905, 45054, -87448, -78101, -8604, 9117, 68553, 64379, 90684, -71579, 76410, 22417, -48124, -53628, -66429, -67303, 25688, 43268, 58609, -35608, -31034, 42114, 77113, -59773, -61203, -4394, 90691, 24536, -35682, -42082, 54074, 85059, 53667, -63740, -3875, -77195, 80795, 54147, 60202, -63849, 32543, 41808, -68450, -88298, -71725, 1947, 88818, -85201, 7167, -78821, 69095, 23745, -94434, -43559, -81753, 28546, 86043, -6178], -[-3059, 63901, -83858, 39444, 17723, 73003, -17882, -84125, 57260, -7691, 62544, 67071, -35087, -69840, 76852, 16319, -87488, -38696, 8174, -76740, -70068, -18130, -54926, -73992, -47728, 76083, -78609, 73731, 25833, 62472, -81961, -42014, 41889, 83482, 39398, -10512, 22575, -52174, 57514, 54868, 35941, 41535, 59792, 34400, 20569, 20014, 81224, -81909, -46939, 68751, -35031, -86704, 29710, -1421, 30719, 49966, 63200, -65508, -23485, 4446, 77658, 55095, 70844, 39045, 91295, -92208, -75489, -7897, -75147, -7089, -19151, 26385, -81353, 90157, 76964, -21276, 63198, -33509, -44681, 41156, -92000, 72264, 80203, 85131, 85383, -40239, -24252, 58293, -5830, -23067, 31826, -45470, 79833, -67390, 39103, 91381, 65237, -27071, -92244, -45607, 37488, -26, 74883, 46462, 21458, 2857, -82235, -44065, -11311, -2978, -6315, -8703, -93928, 53941, -76615, -38684, 69559, 61859, 27071, 84924, -65001, -20966, 61415, -13820, 31438, -42059, 2032, -10591, 85157, 34944, -10322, -63941, -45088, 90708, -19039, -82005, 67255, -63931, -44383, 36556, 58659, 68432, 32300, 56607, -72014, 38002, 54501, -81180, -69329, 94696, -64238, -88065, -35436, 84605, -87103, 42830, -64512, 11456, 32164, 42385, -4621, -9738, -63895, -95021, 93495, 51699, 49211, -67895, 81120, -31064, -59181, 5746, 81546, -44536, 38591, 49384, -47415, 67225, -42770, 13339, -46474, -1289, -56329, -46383, -68933, -13938, -35865, -16256, -90973, -66224, 18758, 12158, 55140, -20409, 3448, 57707, -38181, 81919, 40058, -59001, 57761, 55315, -36723, 5704, 90448, -85932, 21155, 29723, 90929, 76984, -32853, 92781, 94186, -44053, -35357, -58275, -39875, -39811, 54703, 82980, 432, 61479, 88172, -26724, -73689, -43163, -47287, -79200, 84121, -10384, -6568, -45636, 36252, 24863, -81573, -17491, -92630, 78981, -91539, -94870, -47360, -10974, 16604, 70718, -80087, -59461, -90478, -48427, 49866, -7079, -26038, -33690, 82092, -89325, 58583, -52593], -[89082, -7965, 92264, 92890, -32346, -59378, -53541, -82570, 41482, -24946, 26701, 3413, -17012, 58036, 22444, -10328, -33533, 83279, 46884, -65545, 59776, 60336, 37624, -68585, -6468, 90707, -45421, -90357, -52079, 14090, -18404, -73818, 83812, -85750, 67951, 23135, 47536, -83659, -6185, 41242, 53511, 20401, -85785, 16762, -25579, -42005, 20389, 39374, 64116, 32654, 75787, -23624, 67351, -57296, -42865, -93200, 88283, 82798, -42564, -66096, 45236, 76893, 12508, -18443, 51623, -56362, 12319, 48348, -43884, -66914, -93054, -94466, 87658, 20794, -87866, 12482, -25231, 87715, 78271, -48394, -68524, 34493, 49728, -55032, 77228, 22307, 56894, 43677, -71160, 48872, -94353, 47391, -69604, -50847, -33734, 78806, -68221, -65154, 29907, -20226, -20849, -51757, 32044, -93392, 62549, -16508, 55363, -15293, 11842, 22842, 46901, 36402, 21586, -64514, -70800, -78631, -12748, 81020, -34286, 49950, 60669, -9633, -82379, -78753, 62297, -21660, 19751, -10496, 62146, -36005, -33639, 53850, -75054, -91726, 84438, -84943, -33277, 22109, -22571, -85644, -7714, 32315, -34670, 88875, 58314, 12798, -77361, 83575, -70761, -21919, -90299, -45261, -82246, -685, -21799, 73111, -59295, -39189, -81373, -38503, -70049, -68491, 80699, -26192, -91679, 53478, 4805, 85622, 54333, -5362, -22413, 15449, 41589, -89183, 79835, -87089, 31729, -78457, 53777, -38950, -22155, -94796, 13256, -64055, 1647, -91091, 36495, -71165, -16101, 17507, -2398, 15088, -26668, -53527, -34914, 30559, 79925, -83614, 6929, 26925, -41477, -43147, -16933, 28976, 80416, 10987, 36965, -70794, 15246, 80449, 76348, -3712, -57758, -55003, -25629, 2805, -24035, 30184, -54903, -4674, 75765, -52447, -39391, 29508, 38415, 23234, 39030, 41057, 34872, 94760, 33094, 87120, -66595, 35285, 59036, 68198, -45381, 14669, 23804, 6860, -76670, -24623, -89742, 40840, -85538, -64346, -94925, -50381, 28036, -2231, -91180, -88688, 32791, -63782, 83747, 94307]] -||r0||95195, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-35856, 100566, -14374, 35613, 78314, 74701, -68861, -11498, -81857, -114895, 8053, 102615, -47381, 126072, -39741, 25364, -50875, -4747, 52739, -5240, 40645, -125455, -112468, 10450, -16624, -112135, 108416, -87745, -105760, -32919, 93641, 70790, -95754, -20911, 65171, 21257, -14518, 95949, -72944, -21707, -93938, -98646, -37379, -68655, -2777, 121431, -92948, -20494, 106902, 53026, -26479, -38875, -126960, -69739, 55542, 33760, -106805, 75208, 57168, 119341, -111485, 48166, -21358, 47220, 85069, 18934, -1550, -72120, 63848, 94286, -40064, 11149, -18863, 85419, -78881, -48766, -88540, -109890, -96398, 90323, -109027, -17624, 28805, 49470, 107223, 196, -11912, 6174, -123298, 19269, 57662, -49388, -122990, -2894, -116444, -799, 31384, -122924, -111821, -103914, -99494, 109098, -7347, -115744, 33953, 91317, 49138, 77842, -54727, 100704, -45127, -95971, 53357, -83523, 73976, -124340, -11043, -30007, 35702, -85207, -110722, 17181, -35939, -17931, -27527, -53766, 27688, 106854, -99029, 77932, -104312, -33010, -66310, 81064, 130169, -114256, -50012, 120547, 84054, -24061, -14258, -68721, 83643, 98168, -49244, 17456, 81354, -39770, 100344, 9826, 2490, 37171, -14094, 96854, -29327, 19928, -17850, 67207, -81336, 40776, 40274, -41066, 27049, -98753, 19912, 7681, -13100, -110920, -95222, 19703, -45413, 1684, 84505, 75230, -30398, -81443, 55112, 130811, -110504, -59114, 21600, 93018, 2111, 116846, 8012, -22716, 11251, -98705, -32484, 88285, 68880, -101524, 32970, -123423, -81920, 87982, -65775, -27067, -29780, 130551, 42244, -9451, -35391, 54345, 127909, 99235, 46490, -58844, 66491, 96896, 6775, -43672, 116208, 100682, -36734, 20314, -43537, 88570, 39679, 66537, -61661, -34382, -123351, 89874, 130633, 47477, 41196, 123923, -110879, -90079, 46785, 98669, -17714, -7601, 12244, -108710, -18054, 20337, 112679, 48990, 64975, -63691, 63580, 94970, 6932, -13464, -43213, 130298, -115151, -29911, 83029, -81218, 30805, -47543, -123994, -38821], -[-111990, 94237, -64944, 77717, -26420, -60505, -89393, 62117, -73177, 101268, -67769, 82827, -98032, -32964, 63485, -30907, 119010, -17789, 99176, -100130, -101589, 86169, 124707, 118422, -105699, 102260, 88773, -52819, -72693, 52368, 90101, 34257, 36844, 128170, 73967, -1743, -11515, -128139, -75014, 62071, 34649, -30268, -115126, 31185, 120285, 84705, 11735, 34359, 26252, -38090, 28087, -54278, -119973, 100298, -84411, 34657, -15625, 71315, -51166, -121687, 31319, 113294, 53924, 31417, 54104, 123301, 53759, -127092, 121042, 41609, -116599, -73386, 129158, -37883, 29635, -125289, -99981, 11463, 12909, 23337, -51857, 28832, 46670, -76017, -80804, 105849, 77218, -84749, 82697, 50241, -100535, 34856, -53108, -102805, -92274, 59175, 28142, 94157, 93742, -40686, -64877, -115131, 108113, -4188, -46470, -126386, 127310, -122212, 106937, 23429, -19610, -49433, -79151, -123939, -79226, 126815, 57434, -8989, -34032, -54907, 77709, -107732, 90846, -57203, -16985, 129904, -67059, 96687, 41564, -21128, -77189, -99122, 41953, -64704, 66904, -64232, 98075, 52633, -16500, 97127, -8561, 84538, 74314, -71268, -72629, -37605, -90521, 73654, 125343, 97573, -92248, -44399, -114931, -33921, -23378, 34883, -67843, 59065, 105976, -92343, 68280, -71473, 93960, -130772, 13256, 79190, 120708, 13358, 100400, 56733, 116589, -87608, 55280, -2230, -16048, -83880, 15807, -14052, -37273, -1169, -77202, -29304, 123854, 118052, -83346, 100740, -64004, 53840, 128913, -83858, -101546, 115154, 128279, -31188, -40070, -88374, 86303, 763, -121842, -113404, -79128, -91044, -29685, -108822, 117168, 121605, -31651, 49165, -112320, 21595, -66156, 124643, -13115, -29972, 126021, 64819, 128619, 71581, -60995, 32877, 2486, 12613, -112590, -124249, 117223, 128706, 111247, 87723, 11776, -46749, -61485, 101660, 7285, 60612, -123243, 58668, 2606, 96657, 44036, -127226, -99674, -66596, -48226, -12563, 37339, 110603, -26485, -19032, -121046, 16221, -105986, -1928, -58282, -3757, -10092, 17798], -[10026, 90470, -68398, 21982, 17740, -25856, -122111, 4958, 16625, 6465, -72079, 38922, 99008, 73760, 9867, 71270, -105066, -72697, 29773, -112688, -81372, 67177, 51149, 50131, 102040, 8899, 58020, -118213, 10913, 8769, -97269, -14411, -116759, -62181, -101115, 25134, 9355, 45405, -20370, -119016, 27102, -17873, 107687, 72568, -77707, -7230, 124914, 37364, -128266, 17514, -86429, -31056, -114699, -67248, 68522, -76902, 43484, 86494, 91453, 38891, -80849, 43194, -31445, 88811, -111151, 81238, -37737, 112942, -53445, -125338, 72023, 88618, 25449, -72511, -31696, 127222, 102732, -56833, 96070, -57960, 89017, 96311, 107975, -77440, -119418, 82465, 47982, 42526, 65282, -128819, 29140, 130675, 109780, 74636, 118240, 50372, -19323, 79089, -108463, -79184, -60384, -51668, 87679, 57075, 53864, 64401, 93064, -30607, 62598, -58356, -19030, -68952, -42438, 18961, -3605, -11275, -20147, -82081, 21202, 50578, -127342, -117147, 118813, -129786, -21256, -102494, -109525, 3281, 80003, -22643, 99428, -96321, 79998, -71182, 122039, 13579, 40023, 46746, 92152, 86934, 56944, 5336, 119161, 45834, 90134, 114180, 23049, 35601, -37088, -38325, -81566, 17474, 108658, 31255, 23252, -121361, 37481, 27001, 71114, 80717, 124598, 37617, 17669, 25635, 65287, -51785, -32640, -99417, 103657, -74175, 2083, -63029, 1108, -103096, -24672, -67446, -94366, 56298, -18845, -112662, -113750, 72016, 44829, 34809, -76815, -24322, 4657, -39434, 57659, -74700, 35139, 35670, -82192, 5054, -113370, 30464, -90573, 86286, 84244, -92260, 55149, -111444, 17889, 56983, 57211, -105485, 3487, 94463, -38769, -33606, 62857, 45220, 23673, -86738, 72338, 10122, -9996, 67105, 77031, -9301, 99702, -40687, -108255, -94718, -47001, 110631, -93427, -3577, -84055, 77333, 1518, 86811, 43108, -86691, -5179, -29417, 21971, -10365, -103620, 32660, 110887, 5473, -10411, 129950, 111334, 114463, 104492, 92090, -44562, 33496, 41473, 124986, -75192, -86327, -84551, -95975], -[-89065, -109845, -4640, 57194, -11980, -1440, -131014, -52997, -96533, 83017, -126961, -52874, -71315, -66255, -79451, 95683, -61002, -5002, 113541, -14199, 74598, 61477, 27184, 73610, -64516, -83804, -108134, -71913, -62955, -104365, 120493, -75444, 51227, -58207, 73043, -121894, 83836, 100984, 72174, -56435, 42627, 14282, -43559, 50582, -44834, -120354, -110589, 94038, -52794, 107129, -126000, 1652, 96625, 56669, -87131, -40539, -15533, 10800, 99454, -13845, -85366, 35720, 70873, -1156, -48608, -98234, 93929, 76917, 93794, -37981, -24855, -109389, -104323, -98198, 81779, -82808, 61341, 118999, -109494, 124853, 7831, 111560, -124973, -11335, 56105, 9760, -96141, -78333, -105895, -97910, -126707, -81243, 33843, -5352, 60065, -108592, -102823, -15611, 16265, 83698, -71859, -117182, -95822, 32564, 106741, 97808, 18748, -31139, -60378, -6708, 23450, 69482, -39824, 36752, 121927, 23397, -101126, 74349, -50480, 34147, -50924, -58778, 102957, -13613, -108802, -49749, -72002, -29739, 111595, -58168, 116267, -16099, 123703, -112661, -30538, 20579, 117778, 125302, -12677, -33154, -87579, 32963, -112848, 63885, 13296, 59886, -49672, -66840, -37519, 125915, -70366, -6122, 20602, 76526, -99870, -49110, -37278, -120653, 36702, 100051, -9422, -116118, 7560, 59371, -85926, -12749, -31013, 11477, 56403, -101552, 86241, -47411, -1554, 7736, 80672, 112732, 95931, 130457, 16995, 57089, 2916, 120328, -71915, -123066, 47998, 61006, 3449, -56662, -104528, 49555, 51207, -80996, -88200, -121041, -73657, -120931, -74864, 3909, 80638, 65989, -38928, 116168, -83531, 41723, 112825, -53045, 36997, -71644, 74672, -28727, -82641, -76708, -69356, 123864, 123348, -48685, 56697, -83826, -96922, -35533, -111904, -5488, -68507, 6325, 6804, -127157, -77408, -118449, 86748, -31533, -26800, -64641, 111628, -73179, -106596, 23700, 99193, -22584, 36349, 53765, -103831, 118114, -119580, 40619, 75801, 64284, 57757, -75105, -122403, 101983, 77248, 107812, -28732, -48704, 43621, -122238]] -NTT(y): [[3119785, 3641509, 718111, 7355761, 4868534, 3413221, 796547, 1461664, 6885692, 4425989, 3241682, 5657911, 413453, 6636162, 397716, 6413695, 4561034, 6586013, 4943477, 8372576, 136880, 3959897, 5285385, 6315330, 5631314, 7800617, 6934428, 6128206, 4109390, 6096414, 1930864, 1466406, 5197056, 977017, 2633200, 3496669, 340444, 2249148, 7241240, 6280990, 3123654, 6306438, 6406577, 2666953, 2829338, 4414121, 5341592, 5057999, 967220, 7691079, 2117057, 6248415, 6789565, 2954195, 8272513, 107703, 2338524, 1414713, 7423581, 1410477, 3285472, 365429, 4750456, 5293660, 6030300, 7002826, 5975562, 4472526, 5976954, 6610167, 4787109, 3249526, 5628049, 1937085, 8240890, 2903905, 5658094, 3498116, 2881409, 4462440, 2361170, 2441875, 619736, 2147355, 7188360, 8040589, 6392968, 6759672, 1922776, 2196017, 3758207, 7616849, 4538699, 5650956, 7098671, 1396329, 859435, 1324837, 1694368, 7137300, 4321551, 2369413, 7585863, 5857050, 5689620, 7321706, 1070323, 7566855, 6189671, 7935646, 1665074, 1647785, 5621608, 2490510, 2309891, 844932, 4972432, 4384350, 7167911, 6391586, 3267362, 302532, 7939626, 3723379, 3699435, 6836779, 5804981, 1584198, 1126818, 7148103, 269203, 5585839, 6323498, 6962580, 7915272, 7676682, 8308273, 5415962, 926464, 7517087, 7895429, 1794500, 2589434, 7070717, 5156460, 3818637, 6510529, 7147720, 2641780, 227933, 1643319, 3579736, 2576426, 3138498, 5123947, 3476935, 16155, 7153434, 900062, 4742967, 5997769, 5152479, 7303586, 6158220, 1745666, 3549188, 7739598, 5611433, 7660052, 450870, 5278592, 3212589, 694934, 4729508, 5396174, 1522477, 5588451, 4491808, 6836454, 5566688, 888478, 3965303, 7596185, 7974786, 5444814, 5361203, 2084020, 6591770, 4849796, 5643858, 3189183, 5287804, 6103384, 2860886, 2917610, 4591218, 5831427, 1397666, 4931768, 1377377, 2705098, 7658249, 8181111, 5240497, 4960908, 2032563, 5846813, 3330151, 1927676, 1374230, 6957050, 472204, 384208, 5671976, 2809533, 3574682, 3934590, 4240195, 4575708, 6926210, 183343, 6869763, 4851143, 6358128, 2500056, 1261349, 1139950, 3095722, 1956343, 1151636, 4344379, 4423621, 4468392, 3835088, 1818193, 3847451, 983475, 3289111, 5941224, 4403596, 1564147, 3398308, 3763426, 2854224, 881246, 5791591, 4200813, 7341451, 3835238, 1802705, 5443656, 4711237, 2995108, 4457392, 3156219, 4256290], -[3588749, 4255217, 2625142, 7996295, 4175494, 7175465, 7333393, 766593, 5081127, 4091245, 7819354, 5424005, 7720647, 5365254, 1295765, 285673, 4360571, 1052544, 5713232, 3566090, 4790873, 1313667, 4901638, 1911530, 2690059, 807263, 6257578, 5686307, 8366908, 326642, 5525069, 1029265, 668511, 4165193, 5036804, 6113170, 5859574, 5299036, 5694378, 6557696, 6505828, 881444, 5311755, 3148090, 1320656, 3960958, 5658018, 1732199, 5461194, 5861165, 7108282, 6575069, 6017903, 2880712, 698486, 2865937, 8202170, 2247381, 1373491, 8248181, 158123, 7673233, 4374420, 3418116, 3949409, 3995570, 6979371, 3110271, 2185607, 4461078, 4297949, 1326640, 5965094, 3532044, 948471, 4883569, 7395508, 1491592, 6571230, 8214260, 734948, 826176, 1055212, 3333095, 1869473, 3945868, 2153432, 2391334, 4345569, 4812726, 3675290, 381019, 4283300, 5401117, 1369883, 2632125, 3018270, 199042, 7572218, 2111244, 7567627, 8104775, 7925065, 190471, 7773089, 139926, 5456489, 5236088, 3522971, 7103303, 182265, 4970697, 6015808, 583375, 771038, 6113889, 5963257, 2026457, 8308555, 5383154, 2610854, 2968965, 2215234, 5174395, 8075576, 1967251, 358598, 1823741, 1104771, 8324941, 4649328, 5144220, 6649494, 1019093, 2105654, 5992318, 1571462, 297756, 4451745, 2083851, 3469576, 4192, 8069680, 3964152, 7737297, 5627140, 7027478, 6004696, 172230, 3648905, 5884012, 1687659, 6863391, 1484508, 7503194, 5649363, 1831579, 7938317, 4575248, 179163, 3904124, 5571117, 6021301, 5135216, 484487, 7591321, 5460127, 901174, 4683570, 7551890, 5931068, 1619367, 3059280, 4979031, 6106919, 5045744, 4436704, 4231918, 2240388, 4949934, 5028524, 7336445, 958674, 7487420, 7743117, 740754, 6352697, 4626299, 2530595, 7864353, 184644, 5435213, 5690244, 3139198, 4848633, 5478745, 3297360, 8052739, 471158, 7042709, 7913273, 8013979, 4042050, 3905440, 7072486, 4813016, 4994696, 2254918, 656482, 7602894, 3234448, 6769776, 1012303, 7125117, 6647800, 3362671, 6137878, 6683313, 1432822, 5331159, 197786, 7317700, 2976394, 5950027, 3808158, 1936187, 4970856, 5143000, 3028280, 6933192, 2595097, 5701916, 3425095, 8149254, 7208210, 5800342, 5347379, 4255994, 2568855, 6389076, 1464928, 4734642, 3892899, 375115, 5536261, 3277568, 3089782, 7627215, 8151803, 5048821, 3666851, 3130165, 3501602, 3094483, 6536451, 3210175], -[7939053, 2381588, 1322720, 1589025, 1918749, 2664572, 632498, 152577, 665880, 5507589, 716575, 506728, 1100838, 2451796, 1928303, 8353662, 8215647, 4141926, 5715109, 4307318, 7289705, 5431097, 2681607, 101184, 99196, 5005929, 4683096, 2704018, 5974837, 8240424, 1364915, 4191803, 2905927, 7864316, 2602870, 8234095, 441656, 7413680, 1496309, 6049083, 7650221, 5561832, 1265155, 4080353, 2134673, 5760929, 6429585, 1924062, 2168403, 3473033, 5065505, 1283930, 569794, 6765619, 2242146, 671228, 7031527, 1441270, 3798825, 7527595, 4820457, 1568915, 2727255, 7364018, 6540111, 7832007, 6232903, 7419696, 5698620, 6060971, 6505216, 244630, 6015347, 4550372, 1768779, 5715119, 1113794, 3271892, 1834358, 456774, 7077153, 6462281, 1026878, 1940455, 5589424, 2023066, 7399285, 5674390, 8084980, 5810467, 2423003, 6424543, 4804561, 6488805, 3029067, 684900, 1988271, 1836124, 7191172, 4168376, 6619454, 753091, 2573565, 4110530, 1140297, 6727888, 2038003, 1898624, 4279966, 1448538, 1080016, 5682527, 4287461, 7850649, 5225932, 7704669, 7095852, 2000868, 6984486, 3145899, 4579522, 5529353, 376164, 71940, 6158887, 913350, 6025795, 75220, 4800983, 6272930, 8310163, 5091112, 1307049, 272107, 3556422, 6487399, 6427135, 897855, 637249, 4882040, 886458, 2529139, 1422742, 7131998, 5257278, 2439248, 420708, 7989679, 1131139, 1824186, 92154, 556069, 8259193, 7179610, 5787952, 725165, 1311914, 814201, 3999759, 1453510, 5631673, 2404120, 842082, 8189318, 2797763, 7661387, 5305947, 4774988, 7753611, 6380104, 6583933, 7296889, 5509219, 5368164, 7076032, 3343396, 5698153, 8034675, 1855601, 1369181, 5458292, 3235140, 2022097, 7554789, 7669998, 6113612, 4795394, 7761554, 7177681, 1323217, 3207429, 2957654, 2443618, 4975013, 2305155, 3340987, 3375871, 5607225, 6415356, 1866209, 6443274, 4731529, 1372532, 1847019, 5722303, 2631089, 8178199, 3352166, 6727066, 6110329, 8011283, 4170542, 5125964, 7630258, 360023, 2837692, 2166686, 7142785, 584599, 143590, 5740728, 3284866, 3903477, 2332134, 1782586, 8099224, 5517238, 4069923, 709784, 8005342, 4664366, 2830521, 6855393, 1250885, 7959099, 6019986, 5964405, 1867608, 5320344, 7983272, 1028996, 6630057, 1149090, 410783, 726826, 6389966, 7320215, 3904216, 8377942, 7294573, 139761, 8114431, 7363316, 5231923, 6687364, 4942408], -[4112827, 5745554, 2362536, 2114223, 2873321, 6664021, 3742890, 6355616, 681750, 8019167, 7249153, 4207884, 4751101, 8242103, 3496854, 6052560, 2156079, 981446, 1248617, 6172301, 1879973, 5939416, 7669575, 5842380, 2231117, 7366717, 350720, 3660588, 1173971, 2325973, 226240, 4629771, 3211422, 595796, 8157020, 6173770, 403188, 7820723, 8153222, 4040051, 4515427, 789703, 7906508, 4370259, 2764908, 2938877, 1780396, 4645726, 788103, 3583712, 3740408, 5820597, 3130646, 695963, 5171940, 7237608, 2368384, 6848697, 6133665, 6612361, 2296504, 3302228, 7192625, 1177597, 1937806, 642731, 597847, 2103132, 7915091, 3626490, 1565229, 5465786, 1215946, 1335132, 3341163, 4094988, 1726442, 7014021, 121098, 824153, 2610276, 47103, 342608, 7486550, 1962903, 7206604, 785005, 2258685, 4215366, 2559843, 1870947, 8018669, 113664, 2830768, 4374346, 5086943, 1184492, 5141399, 6854192, 2059951, 32318, 587754, 3504765, 7895132, 5815756, 3415947, 6078991, 2025284, 4546621, 983253, 7469995, 4972568, 5475705, 5465113, 68766, 6090992, 4268368, 2824525, 3455702, 6542707, 849327, 4149528, 916225, 5449846, 1212725, 2553874, 718030, 2320353, 25016, 1620373, 2524948, 4491368, 993873, 5964311, 1902849, 1268730, 7477357, 2243608, 561516, 6983458, 5054464, 7101057, 6980241, 2649537, 2344329, 5309887, 2861997, 2934404, 6687143, 4070204, 2157395, 4870518, 8265351, 7655026, 7386842, 233582, 984933, 1665758, 7152848, 3303242, 253436, 7986998, 7691272, 3661292, 4834259, 3226774, 2221446, 7941132, 3478987, 3600232, 1376940, 6048990, 5105731, 5462493, 4808469, 7599541, 3751765, 6678105, 5384398, 4343969, 4930646, 4834375, 1473688, 7131286, 5890796, 1294411, 5325699, 287181, 7773476, 4527177, 6711346, 2673043, 1520976, 6143119, 568097, 5730817, 6215844, 6127152, 1283990, 4115317, 427362, 4472695, 3814098, 845379, 6953416, 6249547, 2951013, 6198972, 6715366, 7555969, 7604146, 3426234, 649431, 1917934, 8208770, 6525800, 841301, 1006064, 7029270, 4214915, 8204752, 248586, 1985358, 6475951, 5138283, 6588099, 8270138, 4510382, 3497955, 1408758, 5345948, 7850408, 5956581, 5314652, 2681764, 4265122, 61180, 3780526, 8249303, 1851647, 7365197, 1989913, 8332639, 4278465, 5314674, 767464, 951826, 4810536, 558667, 1861325, 4055742, 8361788, 5983705, 4444348, 1176018, 4343256]] -aHat * NTT(y): [[4119157, 4505652, 6897916, 4806244, 6670663, 3722624, 6104592, 410456, 6916294, 1351624, 1471249, 7817884, 1022432, 2906279, 229580, 4350585, 1067397, 1948128, 2964589, 5087708, 3419462, 1322155, 2258645, 3016736, 743432, 5070822, 6864104, 3603348, 2828350, 2551459, 6506617, 342362, 1697036, 3656135, 3725520, 1936311, 1811542, 5025592, 6414861, 6641330, 2561047, 4460921, 7923163, 3940117, 96960, 6633996, 5044919, 910287, 4079595, 6024926, 999115, 3401211, 7454097, 419511, 8351401, 695330, 484307, 2986984, 1560856, 514990, 1019197, 1210749, 6190490, 6643871, 192851, 1090678, 2361826, 5617893, 466884, 7796394, 1634530, 8125279, 4664464, 3376259, 2872831, 2282116, 1286962, 3414088, 492311, 5610102, 300434, 292767, 5462202, 1855131, 7991776, 961117, 690518, 4861974, 5708212, 1995637, 2025076, 2592836, 1883793, 2316580, 6444558, 6824472, 3735581, 1148536, 2122728, 1920873, 7987369, 2834593, 5849081, 3521554, 577512, 3139555, 3323671, 1864187, 4031715, 4365034, 5080152, 2353044, 8072169, 5048399, 7712099, 857933, 6597723, 2133892, 7874803, 8183691, 3617268, 158021, 7965930, 282924, 2344956, 1661149, 427167, 5194716, 4274496, 2503434, 5563801, 4949620, 2336803, 5144226, 6003183, 1148224, 4348142, 5936750, 3982248, 4761760, 2594613, 8028987, 27396, 4700121, 5419741, 1259523, 2407545, 2710748, 2490245, 340966, 1760188, 3606892, 5125161, 7420018, 7858511, 5399261, 2081486, 3582517, 5635873, 8210355, 4630905, 7209680, 8209364, 2122756, 2950324, 7384872, 7508136, 3072473, 2654368, 3913844, 4926780, 411832, 1831493, 5436967, 7710061, 1773156, 5217831, 7057492, 222078, 5498717, 3073989, 6977501, 1376190, 3696526, 6565670, 4479326, 745986, 898781, 5645806, 4466322, 1543955, 3162952, 3491918, 2269407, 6546127, 1465149, 3843614, 6604748, 4517157, 3026459, 1396261, 7186079, 5187880, 3389548, 6347979, 6050083, 6537771, 7594187, 3478860, 2848109, 6367670, 2832544, 6083968, 1424056, 1963831, 1131804, 8046601, 5960408, 6077217, 4758134, 4639554, 5483511, 7919951, 5552396, 477197, 8362596, 4249042, 3932859, 1819050, 7173639, 5646100, 7127582, 7082270, 6113124, 3874179, 8194942, 7012009, 530398, 2714013, 657657, 1346900, 6937646, 2203649, 2150717, 1750135, 1974680, 1171662, 2920905, 2226089, 5558024, 2979495, 4108312, 481351, 3810077, 6065179, 2498009], -[8093950, 55583, 3701896, 4030076, 2848480, 5667392, 1783043, 7223515, 4740291, 536960, 6246059, 3982897, 8097265, 5767501, 1553492, 7079737, 86457, 7533717, 4615213, 701407, 6877196, 8323661, 2042187, 1332023, 2767871, 5620550, 807640, 4076948, 1352525, 7570008, 6365687, 262971, 1273019, 55139, 4496376, 5403770, 7938335, 6159130, 6960290, 1549448, 3368593, 8305935, 6561310, 6648430, 1298682, 1008126, 717713, 6937159, 312752, 257564, 2450524, 7730637, 1978178, 1797068, 6528814, 3776639, 3113990, 1294766, 7212306, 4775062, 356455, 3160033, 6627822, 597689, 7713273, 3266828, 699566, 5277008, 3528864, 6639141, 7868770, 6687472, 4496176, 1637492, 2248361, 2524234, 7985054, 6455786, 4793068, 7803234, 5741200, 6848052, 55710, 8255004, 6925964, 154648, 5450694, 1470438, 7850334, 6500696, 3158721, 7189407, 813219, 884160, 172658, 6603074, 3933422, 923554, 45455, 6049401, 4089100, 2505166, 493825, 864872, 6178222, 3538358, 5592773, 3785202, 8182024, 5606700, 3993002, 1263020, 6004717, 6960207, 6780548, 623772, 4193592, 3447583, 4345605, 2992323, 2566296, 1666173, 3752406, 4199237, 1660666, 5345507, 6022005, 3947946, 864103, 7882328, 2449768, 8179261, 4721956, 2535077, 7986272, 5427586, 5003747, 3806355, 6333167, 220924, 592341, 7997780, 7600128, 6166968, 5460919, 6359016, 3309030, 3324811, 2810549, 3345052, 5648826, 2183367, 6361590, 503856, 5077618, 5557523, 7263962, 1932261, 5556915, 8111321, 2729568, 4770392, 4854758, 5998735, 5389671, 3258737, 4535922, 6377487, 4160956, 469161, 2424907, 3516536, 584890, 946181, 5642569, 7257975, 7969720, 8192307, 6283858, 137671, 5303187, 5297556, 7559046, 8218264, 8276239, 1152339, 7953021, 448828, 2683868, 4145221, 7915445, 2538604, 5947785, 1167124, 2444873, 1555619, 5155461, 6770116, 2797215, 5516229, 645988, 4715069, 4331868, 3031399, 4295136, 939016, 4678205, 5344426, 6128748, 5383417, 2187649, 4745756, 8120723, 915458, 6607232, 6607372, 4648893, 2001844, 835300, 7794095, 1072914, 1386701, 147114, 265148, 8184958, 6075645, 1087709, 6591632, 1042494, 2934577, 775980, 4648571, 8178831, 4444300, 5221767, 5479900, 7608154, 6916313, 5990717, 6647236, 694144, 7900267, 6584614, 306055, 3714, 1969509, 232922, 1556862, 1018902, 6469446, 7124808, 7941335, 788578, 5209543, 7368821, 6383834], -[5843848, 8173586, 8049654, 7379430, 3524880, 745104, 6949026, 7737314, 5822018, 666963, 695446, 7070334, 8357504, 2922745, 688236, 1393645, 2766793, 1604984, 1750068, 3665309, 8063616, 2463098, 1339637, 3255525, 7243444, 4450350, 6639750, 3790783, 5875484, 1127476, 2194692, 8108576, 7648482, 5109149, 4431576, 6227957, 3501118, 6441757, 6820959, 1040368, 5810303, 4749173, 574688, 6565572, 5432404, 149275, 505353, 1460230, 3589799, 3566863, 4962102, 2392087, 3544225, 3346109, 7790921, 1955810, 2533717, 1632041, 7072116, 3297097, 5083693, 4057960, 775064, 5421331, 7488916, 591611, 3424186, 1072143, 1579748, 1746459, 2678535, 2365149, 1207547, 1809372, 2049, 5522671, 4937450, 1369992, 6252994, 878860, 6799850, 7144170, 1185332, 2809383, 2092037, 5242635, 6558751, 1795598, 4186664, 7386503, 624444, 3324751, 3400021, 1443172, 1352012, 439300, 3467587, 8029389, 7523237, 2305752, 7503656, 7411207, 295693, 2105145, 6574902, 471650, 8108221, 8144357, 4763339, 1555510, 1065468, 5968764, 4471719, 1944705, 4307884, 297551, 3984944, 4272429, 5749260, 1075534, 5437323, 2390126, 9517, 2398813, 3962399, 2266547, 3895475, 754707, 7530158, 1028336, 8341362, 99079, 2954705, 5717914, 1606768, 5489474, 805173, 6852282, 3810101, 2960605, 4855538, 7654697, 4407016, 4628249, 7317213, 5108215, 970312, 2957378, 3606355, 6389532, 4579431, 3050273, 353627, 7864347, 2521453, 6261648, 1896702, 7947422, 1359906, 4484826, 2684079, 191360, 7925495, 457142, 2000326, 7161754, 7080581, 2177020, 5688803, 4805961, 3390140, 5324233, 7841755, 3466126, 7193863, 870013, 5784347, 7478832, 1476126, 2406412, 4609954, 5247772, 4137878, 7027088, 4071255, 2362371, 5913749, 4528310, 8365140, 2290147, 3293888, 2582160, 3497534, 6185374, 7438768, 3126379, 1694461, 4978716, 6015648, 4210810, 3159161, 6667995, 4937785, 7862128, 7893021, 7114894, 4525067, 6466433, 6694928, 8252388, 1325012, 3145080, 6688334, 5302076, 5968078, 8152103, 7813760, 1934232, 2370893, 633067, 5461939, 6273, 5854591, 1441159, 7243199, 5935687, 658028, 5861398, 5160457, 292407, 5778600, 1694679, 4848572, 5452381, 2903333, 5409980, 6045787, 6745449, 2038449, 6761040, 4855961, 7179191, 7341334, 1601012, 3825293, 6438712, 2391247, 1387534, 7108002, 7677931, 6089893, 1618808, 6352228, 7849655, 4308769, 2192540], -[3853994, 1891534, 1851389, 2803407, 7224342, 3892763, 7035696, 5825004, 1815477, 6173056, 1687300, 613041, 4981670, 3098447, 5023136, 2680924, 5912718, 3990374, 4033059, 4006508, 7407211, 2828518, 6171748, 5602973, 2835257, 5463450, 1821068, 4127170, 8314534, 2728766, 4449073, 4151631, 5162517, 4843478, 45975, 7261313, 7087094, 5494539, 7255023, 5789440, 2075612, 1192118, 1232809, 1087441, 7014861, 4094517, 7136068, 1702724, 7734185, 2728813, 7761746, 7878659, 97988, 3300559, 2473680, 2082006, 5643760, 3973429, 2391976, 6437720, 7145209, 2699734, 2684124, 193147, 2196143, 760121, 362525, 5803529, 7206109, 965522, 2831573, 1611317, 6004621, 3008697, 3062789, 7509184, 7204067, 6481118, 609534, 752975, 3806627, 4574409, 867211, 518099, 5683407, 2658875, 4255630, 4133927, 7598717, 579392, 7168872, 5015534, 2637246, 7113845, 6205738, 7736963, 3853365, 3717931, 2209382, 1142156, 6806908, 1074701, 4063554, 2442919, 783297, 5367270, 4747400, 7512036, 1718486, 2727252, 5719219, 6070901, 372654, 4674898, 6377251, 6372839, 4700326, 3701634, 3592803, 2440560, 4819877, 1003959, 6768735, 380936, 7508250, 3915404, 3071916, 837545, 3942255, 1922330, 2723094, 7245027, 7862045, 5688101, 4645096, 7833172, 1606348, 8103698, 6872645, 5445098, 6528404, 5198218, 3857415, 8315376, 2238882, 5611012, 4496734, 1137267, 6175674, 1687276, 3550362, 3517442, 7421518, 7558893, 1860690, 1313358, 1032806, 5057838, 2521759, 2489897, 3902152, 244539, 4200717, 5201742, 4362264, 4576058, 5574510, 2965808, 2904569, 7198401, 5589760, 5275080, 1334813, 746894, 8115106, 8278923, 6729976, 7246243, 4139142, 6681620, 3751856, 7571110, 7202441, 8331261, 2475061, 8108548, 4080216, 2775204, 3706512, 1917907, 7389800, 4429693, 2456852, 663774, 7336810, 3328140, 8020273, 5315884, 4456661, 579548, 7377532, 4090256, 5574156, 6865634, 1977361, 3007714, 4145773, 3454226, 2620671, 2812326, 7608586, 6504916, 1732496, 634141, 4560199, 8273468, 3654075, 5901821, 1354416, 6548328, 7145845, 2783193, 7934948, 3303802, 5107499, 3282488, 6576581, 3650100, 3348129, 4388312, 6079732, 3355715, 6002015, 3898116, 6830335, 926288, 1803510, 6390867, 6611853, 6143582, 5537649, 8039652, 7278925, 5923462, 1749956, 3338926, 13982, 2654378, 2318832, 8349697, 4649451, 5404921, 2784429, 5882149, 559595, 2888311]] -w = NTTInverse(aHat * NTT(y)): [[5078642, 2908747, 5983117, 5702027, 7014885, 3882278, 8130884, 5111356, 7153298, 6965105, 3536162, 7516375, 6734081, 5132054, 5879000, 298690, 4318561, 8300441, 7316064, 6853806, 813190, 556351, 5616495, 1832475, 742705, 593306, 2248098, 604274, 35882, 4964163, 427852, 3496795, 5195401, 6836862, 486710, 8333642, 5734776, 5710443, 3050693, 583496, 320004, 2659988, 2871312, 4394287, 4144062, 6914101, 7729184, 7582019, 6468579, 650271, 3727687, 4968937, 7739869, 8217743, 7160675, 4796060, 2782841, 1539847, 8133708, 7962487, 3387429, 7262850, 2109712, 6219667, 2320322, 8045416, 6831805, 2823105, 4002186, 1305011, 5493376, 4014920, 3838240, 2553617, 4352803, 6911656, 15171, 5948050, 6395662, 6703949, 361289, 1846084, 3046953, 5360360, 3762914, 3371944, 5620433, 547591, 5283180, 7798896, 7203346, 3439985, 7615941, 5909004, 6818691, 3009435, 830188, 7523762, 7267372, 6276513, 385655, 1930344, 3184713, 5399939, 6662831, 7735333, 1771182, 2836759, 2999780, 3877333, 6867699, 4836826, 3307073, 677380, 177486, 2188234, 443022, 6446584, 5721130, 570766, 1430125, 4861342, 1091892, 1658013, 2527057, 723711, 4160092, 14020, 2444811, 2694966, 7121093, 3249298, 5309347, 860091, 6342579, 3386367, 4057667, 1822788, 2879193, 132195, 3916152, 7377292, 3490373, 3217777, 7613922, 347049, 3169825, 2559024, 7181042, 3869250, 2509875, 7599631, 603858, 5223679, 7107149, 3081018, 5657840, 5009001, 2414698, 3642032, 4414103, 1672424, 3638254, 6298014, 5024707, 2540182, 1664534, 4376282, 1412443, 6799459, 8256582, 2002544, 688379, 5512887, 1288812, 6604015, 6720858, 7453167, 5525606, 8199408, 1477293, 7230410, 1976704, 4331417, 4327270, 6619602, 534318, 954957, 3638641, 6718661, 4806332, 8067070, 8039826, 4878855, 8370793, 569313, 4648473, 3712524, 7846105, 3141332, 8324693, 2000502, 550140, 3094982, 5923140, 4058757, 5420419, 5829087, 7740297, 2340194, 2208284, 4284243, 7111864, 8307775, 5772478, 1267544, 3836435, 1700348, 6645871, 6164883, 122073, 7576509, 4017238, 6431527, 1012940, 3002219, 8069454, 3791742, 3850362, 2197003, 2830291, 6269368, 3237523, 6452242, 3472564, 3057873, 2680688, 3204419, 7117932, 7534801, 595170, 6593692, 6066886, 3755931, 635205, 8230087, 1210291, 201414, 5853041, 5763321, 6085956, 6232046, 5209152, 1690320, 7901696, 3448646], -[7233513, 4474629, 3056070, 5688568, 669762, 5043155, 4443737, 7067239, 729459, 8014349, 4568581, 750381, 938236, 3368436, 686215, 4334526, 8366428, 2227223, 6763476, 3992740, 419574, 6508919, 667760, 4793216, 7673319, 397353, 809529, 7703697, 1069004, 2716513, 3798789, 3921993, 2346519, 7643073, 3284231, 6150608, 529402, 2304023, 5552245, 5022466, 3202395, 1555475, 3417368, 3520651, 6939194, 815073, 8337739, 3605131, 7213038, 1403937, 880875, 6548969, 1473232, 6726741, 1173497, 6090176, 3504863, 7670499, 1101300, 7220722, 4921838, 790824, 1096836, 4305475, 3365971, 4194066, 1590789, 604759, 1838211, 7824297, 4471913, 8310535, 92930, 4723392, 6719253, 8319191, 1988505, 643029, 2788213, 5142972, 5926099, 1079013, 5209, 105839, 307299, 2787956, 786545, 6335724, 3298530, 3425867, 7388051, 7258413, 2597221, 5874656, 7466864, 6786776, 4180214, 3932089, 1427711, 7641080, 647077, 86445, 1319351, 3173646, 2242364, 5620760, 2367573, 3236978, 7223600, 1092281, 4463729, 2116591, 3254044, 4889817, 811804, 1288672, 7502501, 2111047, 5505092, 855661, 822042, 7370149, 4837368, 3638970, 8131280, 5668197, 6198940, 7236940, 2999601, 5361336, 8311265, 5220025, 594901, 2306797, 6269118, 2092010, 4376160, 449913, 6241680, 4892946, 2671774, 2384337, 3915300, 4359447, 8198098, 1711527, 4558082, 258213, 636293, 573354, 132351, 3264312, 5690094, 3594892, 982944, 3836384, 90628, 2605709, 3820901, 1162641, 6451015, 8243768, 1591618, 6856707, 311363, 3895309, 3247231, 2558624, 3371223, 1372266, 2985543, 6567925, 5389979, 95762, 642459, 2773365, 7602623, 4277893, 1616194, 5478902, 8004275, 3489801, 2937200, 3026783, 6222496, 4252105, 18911, 5082285, 3338856, 5408998, 706661, 4957684, 4730813, 4249637, 8303496, 4375835, 5197068, 7477832, 4466091, 5922631, 1522542, 2473332, 1264985, 4083921, 4103804, 837660, 949999, 6401232, 3341145, 8145146, 4783703, 6695080, 6515050, 2645016, 3247203, 2281677, 968636, 4223497, 7090894, 7955791, 1042668, 3263470, 973489, 7054303, 1585405, 3959696, 5681268, 3265334, 7644166, 5749794, 2333319, 5710386, 4020036, 480461, 862322, 5992105, 7514734, 1953788, 3486210, 2369345, 5953806, 3661350, 2633119, 3810804, 7420950, 5426255, 3913803, 2219572, 4302857, 657070, 1749345, 7156506, 7082369, 864042, 106474, 2723028], -[4188217, 7811554, 4241102, 6024428, 3274259, 964348, 1479304, 5879512, 2013388, 5889941, 2897597, 513724, 2598129, 5800713, 2438674, 6930245, 1344616, 3154690, 6285104, 2298751, 5622545, 4318483, 7854605, 5345652, 7009108, 3889320, 4933172, 3255269, 1905612, 4788962, 7346073, 6117506, 1705192, 7271808, 7906834, 6808392, 213984, 3171469, 4242930, 3434524, 441357, 4567621, 943125, 3397466, 3131981, 7845701, 5884658, 6465909, 1651079, 4131649, 4505883, 4811087, 1483482, 3468901, 5938702, 4578475, 1414157, 1879113, 3797130, 2929533, 5675539, 4382554, 7180442, 1898847, 1848910, 6602125, 72312, 8163291, 8150843, 3793713, 3682400, 5191435, 3790375, 4325155, 8287436, 212523, 5749477, 3294261, 759278, 1649819, 2480019, 8173339, 6791961, 7401505, 5650256, 5604403, 2727027, 6973322, 7810704, 3029615, 5576661, 6242438, 597967, 6566753, 7965210, 1914623, 5825008, 3041321, 4991489, 6055343, 1075120, 5794537, 6433926, 1762487, 4913357, 4362167, 8159080, 5117534, 1949577, 1473367, 584810, 4394190, 3580755, 4623534, 5615322, 441556, 4661710, 3086294, 7137947, 1065254, 2529042, 2564171, 5422193, 2715267, 5056209, 3452091, 7790284, 205476, 5800082, 6006941, 4727529, 7926434, 6135833, 929485, 3659735, 3534993, 4561264, 4902652, 5901718, 7330211, 3460998, 5232120, 8187524, 2836878, 5447229, 971524, 2420759, 1086619, 4837811, 482827, 6491790, 4579567, 5008847, 5095257, 37415, 2272253, 7792933, 6755373, 2669523, 8049335, 3900643, 2428996, 757959, 7545464, 7084626, 5115922, 7333992, 6837560, 826373, 5156392, 6064122, 2047328, 7872349, 4519298, 5060997, 1548854, 7484433, 5098363, 7730324, 5083026, 4630119, 7961695, 1491507, 2853882, 3984194, 6628537, 7090826, 3295608, 2689405, 7718761, 6465750, 6820891, 5753027, 1106729, 3988505, 6229951, 2174208, 2087304, 151580, 1678213, 5849038, 8090130, 876469, 6378612, 5846078, 4829078, 1695393, 4962074, 4791776, 627213, 2806125, 963007, 8055593, 4363493, 779883, 6195959, 4915484, 5183911, 748221, 4288982, 2108421, 178982, 425824, 3893206, 6629787, 3091177, 6490949, 8008263, 7516607, 2589070, 6176295, 153510, 5720966, 6473792, 4295214, 4732675, 4932801, 7811261, 5233290, 6100807, 660227, 5227326, 2145935, 999615, 6605008, 1841798, 4093815, 5908802, 2621030, 1143726, 3327702, 5208174, 6410, 6242837, 8338488, 4916093], -[4434378, 3276963, 2949043, 5298708, 2474214, 5316978, 90362, 6538041, 3696979, 6187561, 4829792, 8288193, 1107329, 7572178, 5575356, 3023378, 1070705, 97083, 163854, 7459026, 187528, 8065406, 2886513, 5586371, 7925368, 6322528, 4684169, 1384886, 3077581, 4356160, 4198725, 1354632, 950986, 6784841, 3193280, 953245, 1844098, 103368, 1782048, 846834, 3140776, 5045727, 4822128, 2966404, 3320979, 4449327, 95418, 4212781, 3691490, 2126630, 3065820, 6695922, 1255173, 2079483, 2756512, 1476731, 5095047, 5413530, 4381620, 7024651, 1252436, 5286554, 477995, 2593229, 7954226, 2313095, 555767, 5197329, 3381510, 831255, 3646298, 2076798, 7231281, 126588, 4723412, 630290, 8154892, 1032988, 5313158, 4201005, 496843, 6101845, 7787782, 5730245, 3668610, 1129645, 560383, 993546, 7232271, 4276531, 2049312, 6826182, 6043631, 53150, 5509906, 1246805, 3373995, 5217941, 6670811, 2341695, 4005142, 5359672, 271709, 7645656, 5687734, 2923194, 6654445, 1012219, 5734871, 3080978, 471501, 1243205, 7079284, 5987229, 4556375, 2894448, 8308784, 1338949, 5523666, 3420800, 7477580, 5202887, 7566615, 8202618, 3502782, 4252322, 6551312, 5656606, 2681056, 1305765, 3921276, 7339168, 7197745, 5645205, 7416609, 2845971, 1318962, 3508492, 5464493, 1377003, 7697623, 564824, 5021884, 818852, 7344939, 1371274, 6680079, 1292595, 294215, 4749573, 3748769, 5988946, 388246, 2834599, 5189494, 5954170, 5907619, 4058435, 6095346, 5035509, 6538851, 2834639, 7053959, 3939678, 3944172, 6380979, 1633933, 1074457, 7055173, 2845520, 3165846, 6786157, 4249235, 2447114, 381428, 3605345, 2253322, 6533313, 1595706, 7126253, 7478365, 7188523, 3446088, 3121959, 3469671, 3440332, 5014463, 3190237, 5061227, 5873789, 3805634, 2620541, 5028484, 4604322, 4598230, 482432, 4162265, 6139141, 3912733, 3053107, 6052547, 5257292, 3121101, 4741495, 2712129, 7732773, 2172730, 1585942, 681342, 8022415, 4564064, 7457457, 1262186, 6414433, 2999203, 7526218, 3616613, 3643090, 1847301, 7961767, 5713373, 6778869, 2374457, 667024, 6147715, 4551997, 8108255, 3407259, 1825534, 1972157, 1925856, 481264, 4628659, 2257595, 1858815, 6166219, 327325, 4430127, 7158365, 496925, 6438896, 7730658, 3302234, 3028553, 7663001, 5883881, 2325606, 7861612, 7830178, 7644069, 5418993, 5772127, 4279502, 6713004, 6045623, 1274930]] - -w1: [[27, 15, 31, 30, 37, 20, 43, 27, 38, 37, 19, 39, 35, 27, 31, 2, 23, 0, 38, 36, 4, 3, 29, 10, 4, 3, 12, 3, 0, 26, 2, 18, 27, 36, 3, 0, 30, 30, 16, 3, 2, 14, 15, 23, 22, 36, 41, 40, 34, 3, 20, 26, 41, 43, 38, 25, 15, 8, 43, 42, 18, 38, 11, 33, 12, 42, 36, 15, 21, 7, 29, 21, 20, 13, 23, 36, 0, 31, 34, 35, 2, 10, 16, 28, 20, 18, 30, 3, 28, 41, 38, 18, 40, 31, 36, 16, 4, 40, 38, 33, 2, 10, 17, 28, 35, 41, 9, 15, 16, 20, 36, 25, 17, 4, 1, 11, 2, 34, 30, 3, 8, 26, 6, 9, 13, 4, 22, 0, 13, 14, 37, 17, 28, 5, 33, 18, 21, 10, 15, 1, 21, 39, 18, 17, 40, 2, 17, 13, 38, 20, 13, 40, 3, 27, 37, 16, 30, 26, 13, 19, 23, 9, 19, 33, 26, 13, 9, 23, 7, 36, 43, 11, 4, 29, 7, 35, 35, 39, 29, 43, 8, 38, 10, 23, 23, 35, 3, 5, 19, 35, 25, 42, 42, 26, 0, 3, 24, 19, 41, 16, 0, 11, 3, 16, 31, 21, 28, 31, 41, 12, 12, 22, 37, 0, 30, 7, 20, 9, 35, 32, 1, 40, 21, 34, 5, 16, 42, 20, 20, 12, 15, 33, 17, 34, 18, 16, 14, 17, 37, 40, 3, 35, 32, 20, 3, 43, 6, 1, 31, 30, 32, 33, 27, 9, 41, 18], -[38, 23, 16, 30, 4, 26, 23, 37, 4, 42, 24, 4, 5, 18, 4, 23, 0, 12, 36, 21, 2, 34, 4, 25, 40, 2, 4, 40, 6, 14, 20, 21, 12, 40, 17, 32, 3, 12, 29, 26, 17, 8, 18, 18, 36, 4, 0, 19, 38, 7, 5, 34, 8, 35, 6, 32, 18, 40, 6, 38, 26, 4, 6, 23, 18, 22, 8, 3, 10, 41, 23, 0, 0, 25, 35, 0, 10, 3, 15, 27, 31, 6, 0, 1, 2, 15, 4, 33, 17, 18, 39, 38, 14, 31, 39, 36, 22, 21, 7, 40, 3, 0, 7, 17, 12, 30, 12, 17, 38, 6, 23, 11, 17, 26, 4, 7, 39, 11, 29, 4, 4, 39, 25, 19, 43, 30, 33, 38, 16, 28, 0, 27, 3, 12, 33, 11, 23, 2, 33, 26, 14, 13, 21, 23, 43, 9, 24, 1, 3, 3, 1, 17, 30, 19, 5, 20, 0, 14, 20, 6, 34, 43, 8, 36, 2, 20, 17, 13, 18, 7, 16, 34, 28, 1, 3, 15, 40, 22, 8, 29, 42, 18, 15, 16, 33, 22, 0, 27, 18, 28, 4, 26, 25, 22, 0, 23, 27, 39, 23, 31, 8, 13, 7, 21, 22, 4, 5, 34, 18, 43, 25, 35, 34, 14, 17, 12, 5, 22, 37, 42, 5, 17, 5, 37, 8, 21, 30, 17, 40, 30, 12, 30, 21, 3, 5, 31, 39, 10, 18, 12, 31, 19, 14, 20, 39, 28, 21, 12, 23, 3, 9, 38, 37, 5, 1, 14], -[22, 41, 22, 32, 17, 5, 8, 31, 11, 31, 15, 3, 14, 30, 13, 36, 7, 17, 33, 12, 30, 23, 41, 28, 37, 20, 26, 17, 10, 25, 39, 32, 9, 38, 42, 36, 1, 17, 22, 18, 2, 24, 5, 18, 16, 41, 31, 34, 9, 22, 24, 25, 8, 18, 31, 24, 7, 10, 20, 15, 30, 23, 38, 10, 10, 35, 0, 43, 43, 20, 19, 27, 20, 23, 0, 1, 30, 17, 4, 9, 13, 43, 36, 39, 30, 29, 14, 37, 41, 16, 29, 33, 3, 34, 42, 10, 31, 16, 26, 32, 6, 30, 34, 9, 26, 23, 43, 27, 10, 8, 3, 23, 19, 24, 29, 2, 24, 16, 37, 6, 13, 13, 28, 14, 27, 18, 41, 1, 30, 32, 25, 42, 32, 5, 19, 19, 24, 26, 31, 38, 18, 27, 43, 15, 29, 5, 13, 6, 25, 3, 34, 24, 26, 27, 0, 12, 41, 35, 14, 42, 20, 13, 4, 40, 37, 27, 39, 36, 4, 27, 32, 11, 41, 24, 27, 8, 39, 27, 41, 27, 24, 42, 8, 15, 21, 35, 37, 17, 14, 41, 34, 36, 30, 6, 21, 33, 11, 11, 1, 9, 31, 42, 5, 33, 31, 25, 9, 26, 25, 3, 15, 5, 42, 23, 4, 33, 26, 27, 4, 23, 11, 1, 2, 20, 35, 16, 34, 42, 39, 14, 32, 1, 30, 34, 23, 25, 26, 41, 27, 32, 3, 27, 11, 5, 35, 10, 21, 31, 14, 6, 17, 27, 0, 33, 0, 26], -[23, 17, 15, 28, 13, 28, 0, 34, 19, 32, 25, 0, 6, 40, 29, 16, 6, 1, 1, 39, 1, 42, 15, 29, 42, 33, 25, 7, 16, 23, 22, 7, 5, 36, 17, 5, 10, 1, 9, 4, 16, 26, 25, 16, 17, 23, 1, 22, 19, 11, 16, 35, 7, 11, 14, 8, 27, 28, 23, 37, 7, 28, 3, 14, 42, 12, 3, 27, 18, 4, 19, 11, 38, 1, 25, 3, 43, 5, 28, 22, 3, 32, 41, 30, 19, 6, 3, 5, 38, 22, 11, 36, 32, 0, 29, 7, 18, 27, 35, 12, 21, 28, 1, 40, 30, 15, 35, 5, 30, 16, 2, 7, 37, 31, 24, 15, 0, 7, 29, 18, 39, 27, 40, 43, 18, 22, 34, 30, 14, 7, 21, 39, 38, 30, 39, 15, 7, 18, 29, 7, 40, 3, 26, 4, 39, 7, 35, 7, 2, 25, 20, 31, 2, 15, 27, 31, 31, 21, 32, 26, 34, 15, 37, 21, 21, 34, 9, 6, 37, 15, 17, 36, 22, 13, 2, 19, 12, 34, 8, 37, 39, 38, 18, 16, 18, 18, 26, 17, 27, 31, 20, 14, 26, 24, 24, 3, 22, 32, 21, 16, 32, 28, 16, 25, 14, 41, 11, 8, 4, 42, 24, 39, 7, 34, 16, 40, 19, 19, 10, 42, 30, 36, 12, 4, 32, 24, 43, 18, 10, 10, 10, 3, 24, 12, 10, 32, 2, 23, 38, 3, 34, 41, 17, 16, 40, 31, 12, 41, 41, 40, 28, 30, 22, 35, 32, 7]] -w1Encode: DBF37925B56E66399DE3F609176092C4D029C4C00C8026481B39009E070D82F35C1699A2E24069E96A660FB2AA92B9848C4A3ED5D155547391C0278E82027194E40D5C6A4AE84742046A86821271639A3C10456611112C82E80D8866240D61018D53465C114A95F204D52945A8103526D5A0C356429ED64C5732855A935C07B92E44778CE3D9AD88A95CD73814D398A9AA060CD89442C032405FC57D29C35825E01D543282015A8905A45214F3849128414E54A2C30852C36A049F07865B924AE60579847695848A1185445C004356824864A840A08643550C1A8103D36911224924014CE65188C86880126A981A615C92850C4A7A01403602CAF06C9F0104C2438491749ACE77925675A00370448CC744A6712D91461CE7D211C4994DAB179A10076C03132E97106A4E535D6B8205C31044DE5450804319E28A90021535D201895C303CA88574AAF440A1056C12476899055CDB797D487354165188D29A8DA213318555AA45549448E545A8C778D5507CA72231DFE450275731D79098651138566A8151817CCBF70C8ED790471432DE957225A5454A768289A99241644902564850FA8989856588F46187423DDE652ACA08AC2B356DD405045E4424CD4A9E5EE79429D48583A82A1FA481862726DAB56E0A325C13D60918541A4DC3399B94061E98A960314D98F699D2B63E5DD118D92062DA0630E9E8A85443A0E57692C4062E29B621E7966E988A3CD558464E2A929E5185CB12249F5A845F9668D9F014EA4584DA465C4B20502324AAA703069E78655ABA81C3B614A3527D8E116D40086857F4700D078813980106DA4146109C81FA746A981DD0651D0519154A9010909641D11558D3028DC7E2201B77950737382A336C12312D66900D6BC15903987A933114A6B59020D01DD236321517A0DE33161E241CE5873DC0D149E786AE92257ACE519DA6773E87D41DE8A011E7311E42467DC2B37D5F056AE25356959818E5139156234C8C8894A7294192A445DB47391A860D1658412007654EBA20848A9D8708A1D3A4A81EC91020B64A8AA20C18A380C2650E621A41E8C7A429CA79D6081E - -cTilde: 082E83CF5781050B99CD3EE374AF5B0B24E49C82C438150D45051C9C1EB94F2B -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0] -cHat: [5123131, 1702613, 2818704, 7068434, 7339560, 7688271, 849899, 4328931, 2641106, 4279859, 4547491, 6809917, 1401253, 7381696, 1444065, 1617382, 8228511, 6305862, 5061444, 1216155, 7287689, 3355220, 4262694, 3474005, 2370790, 7020685, 7035874, 2868149, 7178942, 5936668, 7862291, 4338167, 3773203, 1741930, 1456442, 5753980, 8189085, 7721019, 1458685, 894023, 8320044, 4320364, 2243536, 2523578, 1993032, 4626255, 5188584, 6840600, 3780136, 3634171, 6516782, 827762, 6838926, 672876, 2923103, 2121334, 7245774, 6300150, 6219144, 6542516, 2959535, 4125590, 6498498, 8218480, 1173847, 4043944, 7319432, 235218, 5794487, 6375933, 6701212, 4502111, 5636083, 4681049, 839160, 6411618, 5319711, 3192194, 1164727, 7843842, 2267371, 7761101, 8288736, 2056109, 1642313, 3800210, 8127089, 3819828, 2871633, 2977490, 3529802, 3505785, 476325, 4593916, 2929146, 4207297, 2619436, 5937413, 3729705, 5068088, 4759586, 4761896, 5076178, 3537468, 2422779, 2383646, 7622050, 455813, 5045398, 7773550, 2129565, 7909950, 2938952, 4597105, 6635695, 3195347, 711436, 8067750, 830281, 6952784, 5149668, 728808, 8141009, 7745425, 5021545, 1602917, 7459672, 1454127, 4431378, 8367805, 5745293, 2758760, 6032446, 4992563, 366911, 7909354, 5502064, 2836064, 6650644, 104327, 1807186, 5017592, 7688929, 1021205, 6272391, 2570364, 2836020, 4822930, 6310377, 4047883, 8183670, 5114392, 6409168, 7409836, 6402876, 2286484, 6104688, 323999, 502376, 1635067, 4408802, 3923690, 7314853, 571010, 7838778, 4446862, 240510, 7106386, 6917681, 4412931, 7567865, 4649215, 1706849, 345444, 8054627, 1729065, 2624423, 3227385, 726587, 1839553, 3243687, 7667939, 4600951, 1519743, 4383349, 2716954, 5921263, 4583798, 6448247, 2877340, 5559824, 4913108, 94171, 1007330, 4055461, 5387053, 2396139, 746299, 4037225, 1007697, 4889522, 7456776, 3901082, 2903583, 2076633, 7384688, 1614197, 1325670, 1569110, 4620773, 6015922, 1613751, 7156792, 1379390, 5926085, 1375924, 5112326, 1413849, 5796595, 4903421, 4691344, 3464974, 6179427, 5824677, 75312, 6595593, 7732189, 1383143, 4067153, 1383548, 3894598, 4067049, 42213, 2493012, 4505834, 6627120, 5933201, 6423218, 5634981, 6184148, 385411, 6632115, 2519896, 6987855, 1226906, 7934816, 7242056, 5284672, 8373320, 3004614, 723339, 5406301, 2484643, 5021380, 6804742, 5390663] -cs1: [[8380416, 8380415, 8380409, 8380411, 8380416, 8380403, 11, 9, 8380410, 1, 5, 8, 3, 8380409, 8380401, 8380410, 8380406, 8380399, 8380410, 8380406, 8380410, 2, 8380407, 4, 8380413, 8380404, 8380399, 8380412, 8380413, 2, 8380411, 8380413, 7, 8380407, 1, 0, 8380416, 8380405, 8380409, 8380416, 8, 10, 23, 3, 7, 8380401, 8380411, 4, 8380402, 8380408, 8380409, 8380400, 8380411, 8380413, 1, 8, 3, 7, 17, 21, 8380414, 11, 8380413, 8380408, 5, 8380412, 8380415, 8380408, 8380415, 2, 8380415, 9, 16, 6, 3, 2, 11, 19, 8380408, 8380410, 8380408, 8380410, 8380414, 3, 19, 2, 8380415, 8380413, 0, 8380407, 10, 4, 20, 1, 4, 8380413, 8380407, 8380408, 8380407, 13, 2, 3, 10, 4, 8380411, 13, 9, 8, 8380409, 11, 8380411, 8, 8380413, 15, 8380407, 8380409, 8380412, 10, 9, 4, 5, 1, 3, 8380415, 8380410, 8380414, 8380412, 8380402, 4, 8380408, 8380404, 8380412, 8380412, 8380410, 3, 11, 5, 7, 8380397, 4, 7, 8380401, 8380416, 2, 8380410, 8380410, 8380403, 8380415, 0, 9, 8380416, 9, 8380403, 2, 12, 0, 11, 13, 8380415, 9, 8380407, 8380414, 8380413, 3, 6, 8, 0, 8380406, 8380405, 5, 5, 8380415, 12, 0, 8380405, 8380398, 1, 8380412, 10, 3, 17, 8380416, 8380411, 0, 4, 8380415, 8380400, 8380406, 8380406, 8380394, 8380401, 8380410, 5, 8380410, 16, 3, 14, 2, 8380416, 8, 8380413, 0, 8380411, 8380409, 8380416, 4, 2, 10, 8380396, 8, 8380408, 8380413, 8, 8380415, 8380413, 2, 8380413, 2, 5, 8380411, 6, 10, 8380409, 8380411, 15, 8380414, 8380404, 8380410, 6, 7, 14, 1, 12, 8380409, 1, 8380412, 2, 0, 0, 8380409, 5, 4, 8, 8380416, 8380414, 5, 8380410, 8380412, 8380402, 3, 8380398, 8380409, 8380400, 8380404, 8380415, 3], -[11, 13, 17, 0, 1, 4, 8380412, 8380416, 8380412, 8380404, 8380394, 8380415, 8380416, 8380411, 8380403, 8380405, 8380414, 8380404, 8380408, 8380410, 8, 8380415, 12, 8380414, 8380416, 8380410, 1, 8380397, 8380416, 0, 8380404, 8380405, 1, 8380405, 8380413, 8380410, 17, 14, 13, 4, 20, 8380409, 13, 8380410, 8380416, 8380407, 8380414, 8380410, 8380410, 8, 8380402, 0, 7, 8380415, 7, 0, 8380415, 7, 8380398, 7, 8380413, 8380410, 22, 8380409, 10, 15, 8380403, 14, 0, 4, 7, 8380405, 12, 2, 4, 8380415, 8380415, 16, 10, 8380415, 8, 8, 12, 8380414, 18, 4, 8380414, 19, 10, 2, 6, 8380409, 22, 8, 8380412, 8380411, 8380416, 6, 8380413, 8380411, 11, 14, 11, 4, 8380412, 9, 6, 3, 8380406, 8380415, 8380398, 8380406, 8380401, 0, 4, 4, 8380410, 8380415, 8380402, 8380409, 8380412, 13, 5, 8380409, 4, 8380409, 8380416, 1, 1, 8380414, 0, 13, 8380412, 8380407, 8380410, 8380400, 2, 8380411, 8380410, 8380415, 2, 7, 9, 8380415, 13, 10, 3, 5, 8380409, 2, 8380409, 6, 8380414, 8380402, 8380408, 8380406, 8380398, 8380414, 8380410, 8380414, 5, 8380406, 14, 8380411, 8380409, 4, 8380412, 4, 1, 14, 15, 4, 0, 8380414, 6, 8380414, 8380408, 8380405, 5, 8380404, 5, 8380409, 10, 1, 5, 12, 8, 9, 18, 8380406, 0, 4, 8380411, 3, 2, 8380407, 8380414, 8380404, 8380414, 8380414, 6, 8380414, 5, 6, 8380407, 6, 0, 8380409, 0, 3, 8380416, 8380414, 5, 8380397, 8380416, 8380409, 9, 8380415, 8380408, 8380416, 10, 8380414, 22, 12, 1, 7, 15, 8380403, 8380404, 8380414, 8380411, 4, 0, 8380407, 12, 16, 21, 14, 8380411, 5, 12, 2, 10, 8, 8380413, 5, 8380416, 8380408, 8380406, 8380396, 4, 8, 6, 1, 2, 8380407], -[10, 6, 7, 8380403, 8380414, 8, 8380414, 8, 13, 8380414, 5, 7, 8380407, 12, 2, 8380412, 3, 8380403, 8380405, 8380410, 11, 0, 1, 8380408, 8380409, 8380414, 3, 8380411, 8380406, 8380416, 8380414, 8380407, 2, 8, 8380412, 8380416, 14, 8380402, 4, 8380414, 8380416, 8380411, 1, 8380412, 4, 7, 8, 8380412, 12, 8380409, 8380409, 13, 8380411, 4, 8380409, 8380413, 8380416, 8380416, 1, 3, 6, 7, 8380413, 8380407, 8380411, 9, 21, 8380414, 8380405, 4, 1, 8380409, 6, 8380407, 2, 5, 8380402, 1, 8380416, 1, 8380406, 8380394, 8380416, 8, 8380409, 8380414, 8380416, 8380413, 2, 6, 12, 8380414, 8380414, 1, 8380405, 1, 8380403, 17, 12, 2, 5, 8, 8, 12, 8380415, 19, 3, 8380402, 9, 8380402, 0, 13, 0, 8, 8380404, 8380412, 8380407, 8380413, 5, 4, 8380413, 8380415, 8380407, 7, 6, 8380406, 8380411, 7, 8380415, 8380402, 14, 7, 8380400, 4, 8380409, 8380414, 8380413, 9, 4, 10, 5, 17, 2, 17, 8380406, 1, 9, 8380413, 1, 8, 2, 12, 8380406, 6, 5, 8380405, 12, 8380414, 5, 11, 8380410, 8, 11, 14, 12, 8380402, 8380403, 0, 8380406, 8380411, 8380413, 2, 8380409, 8380386, 5, 8380415, 3, 4, 8, 6, 12, 8380404, 14, 8380416, 8380400, 8, 8380403, 8380408, 8380409, 8380410, 8380415, 8380412, 8380412, 10, 9, 8380415, 8380412, 8380408, 15, 9, 7, 8380415, 8380415, 10, 8380405, 5, 8380395, 8380409, 12, 8380409, 8380414, 8380415, 8380407, 5, 9, 6, 2, 8380408, 4, 8380404, 8380405, 2, 16, 3, 8380402, 1, 8380409, 8380411, 13, 8380407, 2, 3, 8380410, 2, 16, 8380413, 3, 8380410, 8380410, 12, 2, 3, 8, 10, 8380412, 11, 0, 5, 8380416, 8380405, 8380405, 7, 8380404, 6, 8380407, 8380410], -[8380406, 5, 1, 8380414, 5, 8380414, 8380411, 8, 8380404, 3, 8380409, 9, 3, 8380413, 0, 8380407, 8380405, 5, 2, 8380416, 7, 8380410, 8380413, 8380410, 8380396, 8380410, 8380416, 8380406, 6, 8380408, 5, 8380407, 3, 11, 11, 3, 10, 23, 4, 27, 3, 8380403, 7, 3, 8380401, 7, 8380407, 0, 1, 1, 8380407, 8, 8380415, 6, 4, 8380414, 8380411, 8380415, 5, 8380403, 8380413, 8380406, 2, 8380416, 8380409, 8380409, 7, 8380401, 15, 1, 2, 8380416, 8380412, 8380415, 0, 8380409, 3, 8380416, 8380415, 2, 6, 8380413, 9, 2, 0, 3, 8380413, 0, 8380416, 3, 8380415, 7, 8380404, 8380413, 8380415, 8380406, 8380406, 4, 8380413, 11, 7, 8380402, 8380416, 2, 8380409, 8380401, 12, 8380394, 3, 13, 8380416, 5, 8380414, 8380410, 17, 11, 12, 22, 12, 8380414, 3, 8380406, 2, 8380415, 8380409, 3, 8380405, 8380409, 10, 8380413, 8380407, 19, 1, 8380415, 13, 8380412, 8380405, 11, 8380414, 8380411, 11, 8380406, 8380408, 8380416, 18, 1, 8380415, 0, 8380413, 8380410, 8380415, 8380414, 8380407, 2, 6, 8380412, 5, 8380412, 8380407, 8380411, 7, 12, 6, 0, 8380412, 8380411, 8380402, 8380413, 8380414, 3, 8380405, 8380406, 8380409, 8380413, 8380412, 9, 8380410, 4, 0, 8, 18, 4, 5, 12, 4, 12, 8380409, 8380408, 8380406, 8380401, 8380399, 5, 6, 8380411, 8380415, 7, 1, 8380411, 8, 8380415, 8380416, 14, 8380408, 8380402, 8380416, 7, 2, 3, 3, 8, 18, 1, 3, 2, 8, 8, 8380414, 3, 7, 2, 22, 12, 8380411, 8380409, 8380406, 4, 8380399, 8380400, 8380416, 6, 8380401, 8380416, 5, 8380413, 8380402, 0, 6, 9, 8, 6, 6, 8380410, 5, 2, 8, 3, 2, 8380406, 5, 8380414, 8380412, 15, 8380409, 8380397, 7, 8380406]] -cs2: [[8380414, 2, 8380406, 8380401, 8380409, 8380409, 4, 5, 1, 15, 10, 3, 11, 8380410, 8380407, 4, 8380408, 8380414, 8380397, 3, 2, 8380408, 3, 1, 10, 8380410, 8380410, 8380404, 3, 8380415, 8380410, 0, 8380411, 3, 7, 5, 8, 8380408, 0, 4, 8380405, 4, 8380399, 8380411, 8380404, 8380405, 8380415, 8380407, 8380411, 8380412, 2, 16, 14, 12, 8380416, 8380413, 8380411, 10, 8380411, 4, 10, 11, 6, 8380407, 8380415, 8380413, 8380394, 8380409, 8380409, 8380416, 3, 21, 3, 5, 8380416, 8380409, 9, 3, 8380409, 21, 8380413, 10, 8380413, 8380409, 5, 6, 15, 3, 8380402, 8380409, 8380401, 8380410, 0, 8380412, 8380415, 8380414, 10, 13, 0, 8380415, 12, 8380408, 18, 8380409, 8380408, 8380409, 8380395, 8380402, 8380404, 2, 8380407, 8380406, 4, 8380412, 17, 20, 8, 18, 8380412, 8380412, 1, 1, 8380415, 8380402, 8380404, 4, 8380408, 0, 3, 8380415, 8380409, 25, 5, 14, 2, 8380415, 4, 8380406, 6, 8380406, 8380410, 8380401, 8380394, 8380414, 8380414, 8380412, 8380412, 8380412, 3, 9, 9, 11, 8380407, 8380411, 6, 4, 17, 11, 2, 0, 8380416, 8380411, 13, 8380408, 8380413, 8380407, 19, 18, 3, 1, 8380402, 8380408, 3, 7, 14, 3, 6, 15, 8380413, 13, 11, 12, 8380399, 8380412, 8380401, 8380411, 8380408, 8380407, 8380415, 8380415, 8380415, 19, 11, 9, 4, 10, 18, 4, 8380413, 8380409, 8380409, 8380409, 8380414, 8380415, 8380411, 8380405, 8380415, 9, 11, 14, 10, 8380413, 8380414, 8380411, 8380410, 1, 8380407, 8380413, 8380403, 9, 8380414, 0, 8380413, 8380413, 8380413, 8380415, 1, 1, 8380416, 8, 3, 2, 4, 8380416, 8380411, 8380402, 8380407, 4, 12, 8380413, 8380416, 18, 8380403, 6, 8, 8380413, 8380415, 8380409, 1, 8380401, 8380412, 8380412, 0, 1, 8380413, 8380414], -[9, 12, 12, 11, 20, 5, 8380413, 8380400, 5, 6, 8380416, 9, 4, 8380413, 8380413, 8380416, 8380415, 8380416, 8380409, 8380410, 3, 12, 8380408, 10, 3, 8380415, 4, 0, 5, 4, 1, 8380409, 13, 2, 8380416, 10, 8380410, 3, 11, 8380405, 3, 8380414, 8380413, 8380410, 8380414, 8380414, 4, 8380406, 8380409, 9, 0, 10, 5, 8380407, 4, 5, 9, 8380411, 8380411, 8380401, 8380411, 5, 8380408, 8380414, 14, 8380412, 8380406, 6, 8380407, 8380415, 8380412, 4, 1, 9, 8380412, 29, 9, 8380407, 14, 3, 8380416, 4, 8380408, 7, 8380415, 8380410, 8380400, 8380412, 8380391, 8380413, 8380414, 8380404, 8380411, 2, 8380404, 8, 6, 1, 5, 0, 8380399, 1, 8380411, 8380397, 5, 8380414, 8380405, 5, 8380400, 8380408, 5, 8380415, 8380409, 2, 8380411, 8, 2, 8380395, 8380415, 7, 8380406, 0, 8380403, 8380415, 8380406, 8380409, 8380412, 16, 6, 8380400, 6, 8380394, 8380414, 7, 8380410, 6, 4, 8380405, 1, 3, 1, 8380414, 2, 5, 12, 8380411, 1, 9, 10, 8380416, 8380415, 8380412, 8, 8380412, 8380412, 13, 6, 7, 1, 23, 8380407, 3, 8380415, 5, 4, 8380416, 14, 8380415, 13, 8380402, 15, 16, 8380408, 8380412, 18, 1, 15, 9, 9, 14, 3, 1, 5, 8380413, 5, 4, 2, 12, 0, 8380416, 6, 8380409, 8380414, 2, 9, 1, 8380411, 9, 8380411, 29, 3, 8380414, 3, 10, 9, 8380411, 8380409, 8380412, 8380407, 4, 1, 12, 0, 8380408, 8380409, 8380407, 8380413, 2, 8, 7, 8, 12, 8380414, 7, 8380416, 8380407, 8, 8380413, 8380416, 8380409, 6, 8380416, 8380410, 0, 4, 1, 8380402, 2, 5, 8380414, 8, 8380406, 8380402, 16, 8380399, 0, 8380411, 8380416, 4, 16, 8380415, 1, 8380416, 8380413, 8380415, 8380407], -[11, 4, 8380416, 3, 13, 5, 16, 8380399, 8380393, 8380405, 7, 9, 8380414, 8380394, 11, 1, 12, 8380416, 14, 0, 0, 8380408, 8380409, 5, 3, 3, 8380410, 8380409, 8, 8380416, 8380405, 8380408, 8380396, 8380414, 9, 1, 8380410, 8380415, 8380406, 8380412, 13, 3, 8380411, 8380411, 8380413, 8380400, 2, 7, 8380409, 8380414, 8380402, 0, 2, 8380416, 8380415, 8380413, 8380412, 10, 1, 6, 8380410, 8380412, 2, 6, 8380414, 3, 8380413, 6, 8380409, 8380415, 1, 10, 8380414, 3, 2, 4, 7, 4, 6, 8380409, 2, 10, 4, 6, 8380403, 8380395, 8380416, 10, 8380409, 2, 8380415, 10, 7, 0, 11, 0, 8380409, 10, 8380413, 7, 8380415, 8380409, 3, 8380416, 8380414, 3, 0, 4, 8380411, 1, 8380413, 7, 2, 8380415, 0, 8380415, 5, 13, 3, 24, 6, 23, 4, 5, 8380416, 17, 15, 8380408, 8380405, 8380405, 8380414, 11, 0, 8380411, 6, 8380416, 1, 5, 4, 16, 8, 5, 3, 4, 14, 8380412, 8380405, 4, 16, 8380410, 8380413, 8380392, 3, 8380416, 6, 8380415, 8380409, 8380414, 8, 8, 5, 10, 3, 8380416, 8380408, 6, 2, 11, 5, 8380414, 8380410, 11, 9, 12, 8380415, 8380416, 8380411, 16, 16, 8380414, 8380400, 8380414, 8380411, 7, 5, 14, 4, 8380414, 5, 8380412, 3, 4, 2, 8380413, 8380416, 8380402, 5, 9, 1, 8380413, 8380416, 8380414, 0, 8380411, 3, 8380404, 8380408, 8380407, 8380414, 8380410, 8380414, 7, 8380415, 5, 6, 8380396, 6, 8380408, 5, 1, 8380398, 5, 8380406, 8380405, 8380412, 8380415, 8380410, 8380403, 8380415, 11, 11, 8380414, 8380410, 8380408, 1, 8380416, 8380413, 8380408, 8380412, 8380403, 9, 6, 4, 8380405, 8380400, 8380412, 7, 14, 8380414, 14, 1, 8380407, 8380407, 8380411, 4, 8380409], -[9, 9, 8380416, 8380402, 8380404, 6, 10, 9, 8380416, 8380415, 1, 9, 12, 11, 8380410, 9, 1, 10, 5, 6, 8380398, 4, 4, 8, 2, 8380411, 8380413, 8380404, 8380415, 8380412, 7, 8380416, 10, 8380407, 8380400, 3, 11, 8380410, 0, 8380415, 2, 12, 1, 8, 4, 10, 11, 8380414, 8380416, 5, 8380391, 6, 7, 7, 8380415, 8380415, 8380403, 6, 0, 6, 8380409, 10, 3, 7, 11, 1, 4, 8380408, 8380415, 6, 8380416, 1, 8380409, 8380393, 8380410, 8380405, 13, 8, 8380415, 8380402, 8380412, 8380408, 16, 1, 0, 8380399, 8380414, 8380409, 8380413, 11, 19, 3, 8, 8380413, 0, 17, 0, 8380416, 8380410, 8380411, 2, 8380406, 8380400, 7, 8380413, 9, 1, 1, 1, 10, 5, 2, 8380413, 8380411, 2, 5, 4, 10, 8380416, 8380413, 8380412, 0, 14, 3, 0, 5, 9, 8380416, 16, 8380416, 8380416, 8380412, 8380410, 8380413, 1, 8380412, 6, 0, 10, 3, 1, 8, 8380410, 9, 8380409, 9, 13, 8380408, 8380413, 8380403, 8380393, 2, 8380401, 1, 12, 4, 8380411, 7, 8380391, 13, 8380408, 0, 8380408, 8380409, 8380407, 8380409, 0, 4, 8380411, 8380414, 8380413, 2, 4, 7, 24, 10, 8380407, 8380414, 8380395, 2, 2, 8380411, 16, 8380410, 8380401, 8380413, 8380404, 13, 3, 10, 7, 6, 2, 8380410, 8380413, 16, 8380404, 4, 8380402, 8380408, 8380416, 8380415, 7, 6, 8380412, 10, 8380415, 9, 7, 12, 9, 23, 1, 2, 8380399, 8380415, 8380399, 3, 9, 6, 12, 8380403, 8380408, 8380412, 1, 4, 11, 8380408, 8380411, 8380416, 5, 11, 1, 6, 1, 3, 8380409, 8380410, 10, 4, 8380412, 8380408, 8380408, 2, 8380410, 8380407, 12, 14, 8380409, 2, 8380408, 8380415, 13, 8380415, 11, 3]] -z: [[8344560, 100564, 8366035, 35607, 78313, 74687, 8311567, 8368928, 8298553, 8265523, 8058, 102623, 8333039, 126064, 8340660, 25357, 8329531, 8375652, 52732, 8375166, 40638, 8254964, 8267939, 10454, 8363789, 8268269, 108398, 8292667, 8274653, 8347500, 93635, 70786, 8284670, 8359496, 65172, 21257, 8365898, 95937, 8307465, 8358709, 8286487, 8281781, 8343061, 8311765, 8377647, 121415, 8287463, 8359927, 106887, 53017, 8353930, 8341525, 8253451, 8310674, 55543, 33768, 8273615, 75215, 57185, 119362, 8268929, 48177, 8359055, 47211, 85074, 18929, 8378865, 8308288, 63846, 94288, 8340351, 11158, 8361570, 85425, 8301539, 8331653, 8291888, 8270546, 8284010, 90316, 8271381, 8362786, 28802, 49473, 107242, 198, 8368503, 6170, 8257119, 19259, 57672, 8331033, 8257447, 8377524, 8263977, 8379614, 31374, 8257484, 8268586, 8276516, 8280925, 109101, 8373080, 8264677, 33947, 91330, 49147, 77850, 8325682, 100715, 8335284, 8284454, 53353, 8296909, 73966, 8256069, 8369369, 8350420, 35711, 8295214, 8269700, 17182, 8344481, 8362484, 8352883, 8326648, 27683, 106839, 8281392, 77923, 8276092, 8347402, 8314102, 81057, 130172, 8266172, 8330410, 120554, 84034, 8356360, 8366166, 8311680, 83642, 98170, 8331166, 17449, 81340, 8340645, 100344, 9835, 2489, 37180, 8366309, 96856, 8351102, 19928, 8362578, 67220, 8299079, 40785, 40264, 8339348, 27045, 8281667, 19918, 7689, 8367317, 8269486, 8285183, 19708, 8335009, 1682, 84517, 75230, 8350007, 8298955, 55113, 130806, 8269923, 8321306, 21617, 93017, 2105, 116846, 8016, 8357699, 11234, 8281701, 8347922, 88262, 68864, 8278886, 32975, 8256987, 8298513, 87985, 8314656, 8353352, 8350636, 130559, 42240, 8370966, 8345020, 54337, 127908, 99239, 46492, 8321583, 66470, 96904, 6766, 8336741, 116216, 100680, 8343679, 20316, 8336876, 88572, 39684, 66531, 8318762, 8346045, 8257058, 89868, 130648, 47474, 41183, 123916, 8269544, 8290345, 46799, 98670, 8362715, 8372808, 12245, 8271702, 8362365, 20337, 112679, 48982, 64980, 8316730, 63588, 94969, 6929, 8366958, 8337197, 130293, 8265251, 8350509, 83010, 8299191, 30788, 8332861, 8256421, 8341599], -[8268438, 94250, 8315490, 77717, 8353998, 8319916, 8291019, 62116, 8307235, 101255, 8312625, 82825, 8282384, 8347447, 63471, 8349498, 119007, 8362615, 99167, 8280280, 8278836, 86167, 124719, 118419, 8274717, 102253, 88774, 8327578, 8307723, 52368, 90088, 34245, 36845, 128158, 73963, 8378667, 8368919, 8252292, 8305416, 62075, 34669, 8350141, 8265304, 31178, 120284, 84695, 11732, 34352, 26245, 8342335, 28072, 8326139, 8260451, 100296, 8296013, 34657, 8364790, 71322, 8329232, 8258737, 31315, 113287, 53946, 31409, 54114, 123316, 53745, 8253339, 121042, 41613, 8263825, 8307019, 129170, 8342536, 29639, 8255126, 8280434, 11479, 12919, 23335, 8328568, 28840, 46682, 8304397, 8299631, 105853, 77215, 8295687, 82707, 50243, 8279888, 34848, 8327331, 8277620, 8288138, 59169, 28141, 94163, 93738, 8339725, 8315551, 8265300, 108124, 8376233, 8333942, 8254040, 127316, 8258208, 106926, 23427, 8360788, 8330973, 8301250, 8256478, 8301195, 126819, 57427, 8371426, 8346370, 8325502, 77704, 8272698, 90851, 8323206, 8363436, 129896, 8313357, 96688, 41565, 8359286, 8303228, 8281308, 41948, 8315703, 66897, 8316168, 98077, 52627, 8363910, 97125, 8371858, 84545, 74323, 8309147, 8307801, 8342822, 8289899, 73659, 125335, 97575, 8288161, 8336024, 8265483, 8346481, 8357030, 34872, 8312555, 59062, 105969, 8288071, 68285, 8308933, 93974, 8249639, 13248, 79194, 120703, 13362, 100401, 56747, 116604, 8292813, 55280, 8378184, 8364375, 8296534, 15798, 8366353, 8343149, 8379235, 8303220, 8351105, 123864, 118053, 8297076, 100752, 8316421, 53849, 128931, 8296548, 8278871, 115158, 128273, 8349232, 8340349, 8292033, 86300, 750, 8258572, 8267010, 8301295, 8289370, 8350737, 8271601, 117158, 121611, 8348766, 49157, 8268097, 21598, 8314260, 124640, 8367307, 8350425, 126020, 64811, 128628, 71579, 8319413, 32876, 2496, 12610, 8267849, 8256180, 117224, 128713, 111262, 87709, 11763, 8333665, 8318926, 101664, 7285, 60602, 8257186, 58684, 2627, 96671, 44030, 8253196, 8280755, 8313823, 8332201, 8367862, 37335, 110608, 8353931, 8361376, 8259360, 16200, 8274435, 8378497, 8322141, 8376661, 8370327, 17788], -[10036, 90476, 8312026, 21968, 17737, 8354569, 8258303, 4966, 16638, 6462, 8308343, 38929, 98998, 73772, 9869, 71265, 8275354, 8307706, 29761, 8267722, 8299056, 67177, 51150, 50122, 102032, 8896, 58023, 8262198, 10902, 8768, 8283145, 8365996, 8263660, 8318244, 8279297, 25133, 9369, 45390, 8360051, 8261398, 27101, 8362538, 107688, 72563, 8302714, 8373194, 124922, 37359, 8252163, 17506, 8293980, 8349374, 8265712, 8313173, 68514, 8303511, 43483, 86493, 91454, 38894, 8299574, 43201, 8348968, 88801, 8269260, 81247, 8342701, 112939, 8326960, 8255083, 72024, 88610, 25455, 8307896, 8348723, 127227, 102717, 8323585, 96069, 8322458, 89006, 96288, 107974, 8302985, 8260991, 82462, 47981, 42522, 65284, 8251604, 29152, 130672, 109777, 74637, 118228, 50373, 8361080, 79106, 8271966, 8301235, 8320038, 8328757, 87687, 57087, 53862, 64420, 93067, 8349795, 62607, 8322046, 8361387, 8311478, 8337979, 18969, 8376799, 8369137, 8360260, 8298332, 21207, 50582, 8253071, 8263268, 118803, 8250638, 8359167, 8277912, 8270886, 3288, 80001, 8357759, 99442, 8284103, 79981, 8309239, 122031, 13576, 40019, 46755, 92156, 86944, 56949, 5353, 119163, 45851, 90123, 114181, 23058, 35597, 8343330, 8342100, 8298853, 17486, 108647, 31261, 23257, 8259044, 37493, 26998, 71119, 80728, 124591, 37625, 17680, 25649, 65299, 8328617, 8347763, 8281000, 103646, 8306236, 2079, 8317390, 1100, 8277290, 8355750, 8312969, 8286054, 56302, 8361580, 8267761, 8266679, 72003, 44843, 34808, 8303585, 8356103, 4643, 8340974, 57651, 8305710, 35137, 35665, 8298220, 5064, 8267056, 30462, 8289839, 86277, 84259, 8288166, 55156, 8268971, 17887, 56993, 57199, 8274937, 3465, 94455, 8341660, 8346803, 62854, 45218, 23663, 8293684, 72347, 10128, 8370423, 67096, 77035, 8371103, 99690, 8339732, 8272178, 8285702, 8333401, 110632, 8286982, 8376834, 8296375, 77323, 1520, 86814, 43101, 8293728, 8375254, 8350996, 21974, 8370045, 8276790, 32672, 110889, 5476, 8370014, 129960, 111329, 114474, 104492, 92095, 8335854, 33484, 41461, 124993, 8305212, 8294096, 8295856, 8284435], -[8291341, 8270577, 8375778, 57191, 8368442, 8378974, 8249397, 8327428, 8283871, 83020, 8253448, 8327552, 8309105, 8314158, 8300966, 95673, 8319403, 8375420, 113543, 8366217, 74605, 61470, 27180, 73603, 8315880, 8296606, 8272282, 8308493, 8317468, 8276043, 120498, 8304963, 51230, 8322221, 73054, 8258526, 83846, 101007, 72178, 8324009, 42630, 14268, 8336865, 50585, 8335567, 8260070, 8269818, 94038, 8327624, 107130, 8254407, 1660, 96623, 56675, 8293290, 8339875, 8364878, 10798, 99459, 8366558, 8295047, 35709, 70875, 8379260, 8331801, 8282175, 93936, 76901, 93809, 8342437, 8355564, 8271027, 8276089, 8282217, 81779, 8297601, 61344, 118998, 8270921, 124855, 7837, 111556, 8255453, 8369084, 56105, 9763, 8284272, 8302084, 8274521, 8282510, 8253708, 8299181, 33830, 8375061, 60063, 8271814, 8277583, 8364810, 16261, 83709, 8308565, 8263220, 8284594, 32566, 106733, 97792, 18760, 8349255, 8320042, 8373722, 23449, 69487, 8340590, 36745, 121944, 23408, 8279303, 74371, 8329949, 34144, 8329496, 8321628, 102959, 8366802, 8271607, 8330671, 8308403, 8350670, 111605, 8322245, 116257, 8364337, 123704, 8267754, 8349892, 20574, 117766, 125313, 8367737, 8347257, 8292849, 32952, 8267560, 63884, 13314, 59887, 8330743, 8313577, 8342894, 125908, 8310049, 8374292, 20592, 76528, 8280553, 8331302, 8343144, 8259759, 36692, 100045, 8371002, 8264311, 7566, 59371, 8294486, 8367662, 8349389, 11473, 56400, 8278868, 86229, 8332995, 8378855, 7732, 80667, 112741, 95924, 130461, 16995, 57097, 2934, 120332, 8308507, 8257363, 48002, 61018, 3441, 8323746, 8275878, 49539, 51189, 8299426, 8292223, 8259370, 8306758, 8259493, 8305554, 3903, 80646, 65987, 8341488, 116182, 8296877, 41708, 112824, 8327379, 36999, 8308776, 74675, 8351698, 8297794, 8303710, 8311064, 123866, 123356, 8331740, 56694, 8296594, 8283502, 8344886, 8268535, 8374941, 8311904, 6317, 6793, 8253264, 8302991, 8261951, 86747, 8348890, 8353601, 8315775, 111633, 8307234, 8273806, 23700, 99199, 8357842, 36357, 53771, 8276592, 118107, 8260842, 40621, 75809, 64287, 57759, 8305301, 8258019, 101980, 77243, 107827, 8351677, 8331693, 43628, 8258168]] -||z||: 131020, ||z|| too large -r0: [[-63883, 51785, 78744, -11877, -32275, 73006, -59072, -31177, -84335, -82078, -82664, 88276, 67830, -10467, -25374, -82242, -62102, -79973, 78452, -2901, 51332, -15032, 93036, -72166, -19161, 21921, -37463, 32895, 35879, 12101, 46931, 68443, 52879, -19845, -84689, -46780, 20848, -3468, 3269, 12100, -60912, -6512, 14370, 13621, -46133, 57409, -79838, -36531, -7191, 78884, -81595, 16857, -69169, 27779, -76956, 34464, -74113, 16125, -56238, -37005, -40933, 25207, 14602, -65635, 34756, 45932, -24876, -33847, 2450, -28236, -30083, 15155, 28957, 77580, -27868, 54960, 15162, 43663, -80106, 37688, -19635, -58566, -467, 27376, -46371, -56414, -93502, -23804, -49797, -10120, -34270, 11640, -2619, 4625, -38011, -37986, 68322, -94811, 29740, -8797, 4715, 25713, -53193, 66955, -3400, -73683, 57028, -20186, -47631, 68051, 11005, 75237, 69181, -84471, -12995, 93110, 62086, -29210, 7215, -621, -93588, -90723, -50890, -56148, 51038, -38149, -30107, 14020, -31224, 28472, 73933, 11385, -23650, -92243, 57265, -41983, 57919, -81841, 22227, -58258, -83585, -50788, 62044, -20108, -4635, -33874, -68058, 82997, -56593, 59961, 33834, -18940, 32476, 81157, 59975, 33590, -56097, 56926, -61336, 23216, 33432, -41746, 19425, 12711, 72647, 64160, -49661, -4408, 79192, -57246, 66645, -92551, -73480, -10576, -44450, -62228, 54612, 25056, 2154, 9443, -46430, -7234, 72082, -49250, -53386, -46632, -37065, 2647, 19827, 52423, 44734, 67563, 40327, -73218, -9628, -2089, 77319, 93704, 37085, 93916, -55716, -94594, -21249, 47560, 18762, 59025, 87429, -75306, -68738, 54612, -77294, 94039, 64699, -72636, 58565, -65705, 27165, -13824, -20355, 70026, -68388, -42051, 17498, -44245, 60624, -45203, 69965, -17539, 41083, -88573, -26672, -15946, -369, -23533, 44218, 10464, 14202, -33473, 70752, -83755, 23779, -72566, -27948, -53355, 63805, 40139, 67509, 10958, -51344, 49417, -8887, -53261, 66624, -23857, 92676, 20297], -[-4128, 93945, 8634, -25363, -92114, 91086, 63069, 20088, -32402, 14855, -2554, -11484, -14088, -59912, -75637, -46145, -13987, -58344, -93220, -6997, 38643, 33131, -94087, 31606, 54756, 16427, 47669, 85137, -73785, 50013, -10492, -77743, 60938, 24511, 46344, 55750, -41983, 18452, 28778, 70414, -35496, 31766, -10980, 92306, 82493, 53220, -42682, -13674, -24586, 70680, -71445, 73183, -50485, 60511, 30709, -4677, 76502, 51945, -41478, -16894, -30220, 28963, -45939, -75194, -62395, 3863, 67088, 33361, -66419, 15275, 91246, -69886, 92929, -38217, 53018, -61255, 83856, 71647, -68761, 441, 21716, -63775, 5218, -84632, -73627, -68997, 24706, 50417, 60668, -2481, -40042, 20794, -69269, -29730, 38781, -69936, -10000, -67656, 94458, 22520, 75703, 86444, -13891, -64222, -43209, -93157, 82017, -915, -14015, -50494, 83052, 21489, 16164, -62249, 49954, -44584, 74403, 15965, -18362, 93798, 60197, -57947, 75782, 20156, -58661, -45715, -86367, -708, -47829, 28361, -69158, 77520, 23512, 21222, -16187, -3100, -4516, 68997, -43633, -59121, 5277, -91692, -84446, -21230, 8134, -2643, -13055, 67740, 64891, 1963, -58111, 26429, -23834, -23919, 30629, 27091, 90622, -60794, 11620, 19834, -24751, 53813, 67908, -2, -69569, 86030, 9329, 82594, -57142, 39033, -61896, 92133, 56996, -94697, 71049, -83596, -15952, 87676, 92473, -44568, 4784, 61448, 80235, -20637, -62821, 61893, 18909, -60255, -89496, 76007, -55201, 5628, -30784, 59427, -76930, -4838, 54546, 49727, 85425, 18218, -1173, -2697, -68266, 84167, -86413, 75810, -2313, -74539, -87197, -44810, 22102, 28828, 39274, -21471, 9323, -3881, 16320, 33287, 43718, -43704, 90340, 25570, 21172, 7128, 61694, -40038, -32660, 27450, 25607, 35882, 47745, -3533, 20299, -90931, -90002, 87720, 86653, 49146, 57853, 83780, 49414, 42545, -33362, 1508, -7128, 93263, -85935, -65995, -77819, 85662, 35171, -81127, 35202, -88274, -83988, 56542], -[-2002, 2526, 50895, -70423, 36358, 12023, -44424, -24854, -81692, -14431, 40630, -57677, -68364, 86816, -37369, 73540, 11356, -83197, -222, 13183, -91375, -62180, 45589, 12655, -38063, 80037, -18885, 17389, 964, 27363, -82011, 22667, -8963, 34179, -92663, -48313, 23527, -66417, 52733, 6177, 60416, -3518, -9189, -30880, 84561, 36694, -19728, -9874, -63089, -58556, -65238, 49487, -40232, 40550, 34320, 7343, 80914, -25537, -12151, 72567, -38374, 1887, -57192, -5799, -55727, -64118, 72316, -26667, -39101, -15565, 63583, 48897, -18902, -55520, -92983, 22055, 35550, 56369, -2584, -64349, 3985, -16623, -64747, -26597, -63650, 80969, 60532, -73856, 1688, -17811, 53207, -42884, 26568, 90977, -34289, 9983, -79368, -6113, 39429, -39512, -67662, 80625, -41853, 48312, -38704, -18508, -30872, -24998, 44943, -50346, 13422, 13511, -38063, 52400, 91866, 60630, 90569, 38857, 90776, -77554, 53004, 88116, 89197, 48766, -86318, 23722, -18755, 15021, 86174, -87895, -34068, -73065, 40985, -22829, 40913, -83822, -9873, -49417, -2670, 92563, 32638, 89587, -2431, -20086, -76241, 19209, -55261, -56169, 76195, -88558, 16018, 8456, 56780, -47270, 37409, -13313, -16083, 89136, 3019, 49839, 91358, -47046, -3900, -73095, 37467, -26612, -94106, -19155, 64512, 13867, -30719, -47787, 63316, -51850, -81529, 25143, 56343, -44181, -78716, -59499, 59000, -37790, -32199, -3085, -15555, -37717, 43654, 57723, 22904, -90258, -10029, -35817, 39105, -36051, -11238, -55346, 79099, -7809, -38885, -35959, -55345, 90645, -75851, 93306, -58309, 67491, -18774, 10020, 30179, 55828, -50832, 10680, 56107, -17184, 18021, -89332, -36586, 41392, -13640, -91691, 13336, -11487, 44907, 83938, -36448, 43755, 15180, 8789, 88513, -77437, 81436, -36951, 7053, -1975, -85459, -28924, -19259, 2246, 90767, 5973, 88826, 84792, 50827, 47307, -61215, -62837, 94064, 4404, -45463, 928, 89813, 65656, 6420, -42469, -41933, -35963], -[53697, 39066, 92084, -34269, -1805, -16020, 90352, 62256, 78164, 92715, 68191, -92233, -35467, -46393, 51907, -24055, -72080, -93391, -26615, 30924, -2917, 65914, 29549, 62907, -74122, 37222, -77427, 51651, 30159, -24507, 8510, 21385, -1344, -71853, -44591, 922, -60553, -87089, 67872, 84980, 93350, 93651, 60527, -81028, 83087, 68645, -95057, 22576, 72675, 31521, 18422, 29676, -78082, -15628, 90018, -46979, -47467, 80532, 948, -22523, -80804, -46448, -93400, -73274, -45273, 27526, -15629, 54810, -46840, 69393, 27483, -18307, -6343, -63852, -38181, 58910, -35073, 80660, -19832, 10812, -74544, 7006, -21258, 16324, 49794, -13121, -11006, 41234, -5357, 86312, -45811, -30525, -51225, 53154, -13550, -86460, -54357, 75414, 4578, 56133, 5396, 26691, 81262, 27089, -26182, 66225, -11796, 59898, 20950, 33544, 90568, -90045, 32120, 82851, -14763, 37483, -71637, 5691, 211, -7548, 49489, 60359, -51959, 12663, 74430, 62109, 75527, -57313, 14544, -27482, -78467, -88923, -39880, -68711, -11488, -10984, -14292, 80140, -58973, 43752, 79062, -6576, 69827, 56987, -83149, 38017, 13826, -40644, -86709, -12013, -60487, 84560, 7334, -22362, 46954, 49782, 3241, 58684, 524, 83432, 63084, -22321, 6800, -60058, -55562, -94789, -80243, -68331, 8011, -11437, -72038, -70549, 59023, -28925, 476, -13481, -32236, 57540, 72016, 79083, 50267, -49103, 17720, 74542, 41335, 11984, 62412, -47664, -81304, -30605, -3653, -45961, 76418, 33193, 27098, -88976, -27930, 44289, -86996, 5692, -42300, -75698, 73670, -20111, 45638, -76261, 77628, 62221, -80521, 22915, -7081, 29338, -71063, -61345, -48203, -92340, -2185, 24271, -57348, -37727, -559, -77821, 88898, -94827, 52866, -19143, -81708, -21084, -79100, 67518, 21211, -90139, 57522, -27979, -45826, 71368, -53595, 49462, -79277, -74471, -36875, -78357, 64355, -18873, 44448, -20493, 40026, 52574, 21162, 25507, 86010, 58209, 89281, 46766, -49236, -58321]] -||r0||95057, ||r0|| check passed -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-84840, 117763, 52680, 75654, -50073, 98811, 99830, 96973, 1590, -16278, 61118, 130645, -60448, -126424, 60085, -12442, -73783, 41682, -91137, -65824, 48054, 17560, 124594, -111918, 26718, -65603, -110890, -53647, 106653, 51242, 67788, -27922, -75840, 3639, -37134, 99472, -52227, 111914, -49423, 119043, 80547, 44922, -49470, -88005, -126410, 114178, -118977, -89158, 61800, 32704, 81780, 26488, -23354, 122391, 118600, -105091, -20176, -31708, -86434, -82750, -69942, -2580, 14164, 101933, -64957, 8402, -65270, -24817, -92991, 114251, 69107, -94313, -15115, -97192, -54839, -117851, 124139, 67300, -30275, 37719, -79344, 115632, -64753, -130161, 35086, -54087, 29893, 22327, -123638, 11758, -92073, -4716, -98836, -94342, -30801, -58932, 74591, -27005, 79210, 72842, -19904, -13204, -109486, 55550, -103030, 109612, 90330, -128676, 3586, -78608, -102398, -103862, -12722, -59275, -5761, 57620, -65664, -128998, 32639, -47244, 117850, -59077, 81064, 3510, -46456, -115422, -52356, -18265, 65086, 51597, 122777, 92421, -109880, -105176, 66680, 13894, -88472, -69244, 32466, 52924, -72615, 8383, 77316, 60814, -115913, -8210, 70776, -49822, -113431, 53696, -129561, 52209, -18007, -10043, 53251, 90257, 26986, 31443, -103117, -54495, 128262, 112842, -61681, 30123, -101569, -108303, 75207, -120914, 73490, -58118, 120935, -53174, -44654, -34942, -93321, -80001, -38726, -84256, 35228, 62532, -120467, 9350, -76525, 90211, 14221, 26956, 9395, -73641, -22564, 79220, -31020, 95214, 110619, -63980, -23655, 72065, 36830, -25562, -25454, -124050, 2175, 119849, 39680, 102456, -122458, 110513, 26688, 112164, -18219, -60799, 67269, -52609, 103658, 120965, 21162, 7265, -120091, 122727, -118422, 42512, -19525, 80757, -122152, -96078, -110713, 54285, 4335, 119421, 26300, -102052, -45574, 63703, -4071, 16452, -18638, 58764, -107541, 80236, 82971, -39838, -83049, 11932, 44506, -38911, 114496, 88180, -1348, -117775, -32194, 87424, 11761, -106838, 20771, 49906, -86537, 9395], -[-70331, -88764, -7924, 130877, -17920, -7125, 7540, 123604, 56048, -432, -88120, -2205, 56606, 69074, -109169, -111451, -33195, -62317, 34152, -123674, -4281, -1530, -59829, -127601, 114737, -196, 42179, -6803, 59230, -33239, 122983, -96474, -90958, 118342, -10244, 44531, 9352, 118459, 1431, -8672, 100237, 88483, -81402, -1076, 52714, -121289, -82125, 106478, 67025, -36922, -43731, -88461, -99059, -83671, 110399, 53008, -13427, -66076, -106731, 113563, 27893, 128015, -51510, 100415, 122774, -100950, -97882, 107044, -76490, 14382, -8954, 27228, 52818, 34480, 89506, 21896, 47278, 64288, -46094, -30275, 82180, 29770, 107082, 127541, 117622, 129741, -77927, -29825, -34013, -70456, -73863, -20951, -126786, -26863, 58223, -92907, -76433, 90885, 65196, -61331, -11224, 105053, -79333, -11112, 33150, 48909, 20530, 97680, 66845, -6942, 51759, -41856, 66053, 54043, 50733, -5691, 62299, 37955, 111039, -62437, 22501, 81192, 58778, -35916, -74840, -103300, 116293, 75355, 83344, -115009, 86281, 95593, -102910, -19753, 97191, -124108, -109618, -87175, 8421, -119749, 11659, 102120, -14493, 121011, 128108, -30943, -58817, 116263, 52823, -30, -39155, -55503, 62494, -34177, -87962, 38307, -67734, 123513, 27029, 83825, -64219, -10187, 9878, 20576, -76360, -29956, 12969, -12887, 52950, 31018, -38286, 107020, -114703, -81115, 6248, 88964, 117225, 68492, 109917, 73795, 90310, -79724, -36119, -105477, -97247, 24614, -81050, 52420, 35620, 16954, -47005, 113206, 28433, 107629, -98675, -85398, -32499, 101749, -750, 126287, 66180, 85954, -123660, -118299, 104917, 60761, -77882, -54532, 22704, -99563, -93111, -62816, 1775, 37783, 97132, 98424, 127412, -48761, -45807, 74754, -10523, -608, 128880, -65393, 65423, 81321, -77978, 63720, -120508, 9218, -100983, -16076, 28321, -1522, -65005, 26529, -87050, 73186, -8108, 98458, 35629, 117772, -105804, 115578, 101329, 59786, 10998, -66131, -92408, -123201, -23824, -4550, -49860, -86624, -118614, -39897], -[74251, 86143, -113454, 129055, -99562, -40415, 97446, 81315, -43064, 124515, 129172, -41182, -38236, -95608, -7602, 2383, -116482, -9223, 11177, -52552, -66354, -53630, 111446, 77693, -34216, 13610, 19645, -82128, 80142, -114274, 88521, -49094, 114236, -75586, -89535, 92851, -43967, 88854, 102982, -127220, 3784, -63298, -8703, 107833, -66939, 123059, -130413, 93714, 20815, 96122, 20859, 109231, -93052, -52573, 3355, -31227, 36937, 97655, -129199, -69625, 37971, -126173, -8912, -73545, 24750, 56488, 20540, -91394, -26988, 105256, -75833, 56731, -67434, -12366, 74389, -71888, 95697, -57349, -124552, -6275, 126538, -130816, 39966, 94653, 78200, -101905, -112235, -102364, 33101, 72471, -71852, -10218, 26006, -9663, -16298, -56774, 98702, 107550, 12389, 3087, 49155, -31797, 77811, 113978, 62724, -75214, -68749, 56405, -60724, 34016, 48252, -118212, 40915, 89127, 114362, -84561, 43839, -101551, -101592, -66906, 27879, -15834, 116591, -105731, -88553, 14601, -15974, 98764, -30998, -116675, 85553, -76510, 112650, -54277, 107786, -6359, -100958, 48939, 93966, -83057, -1374, -49558, 113311, -63039, 75658, 81858, 126472, 26893, 49260, 33536, 15920, -51380, 9729, -109755, -33600, 20952, 30019, -50297, 89953, -25873, 6127, -24366, -81830, -22319, 68102, -70600, -26201, 61509, -87414, 17041, 68195, 130187, -16254, -34495, -54646, 39915, 100528, 34332, -3973, -125130, 102822, 61777, 48231, 90160, -24669, -30554, -105683, 56360, 81078, 126280, -42901, -7195, -71373, -44999, -109640, 97373, 71170, 23230, 118206, 123948, -17988, -3135, -109815, -85312, -29853, -20039, 130201, 79845, 40704, -49880, 31493, 27948, -6594, -80269, -88782, 19373, 69896, -35186, 497, 31595, 65833, 125783, -18886, -32823, 96035, -78871, -4953, -68731, 100040, -104899, -3127, -97503, 16960, 98021, 46266, 99643, 116101, -115158, -9482, 95299, -79261, 43966, -111887, -125224, 120101, -116288, -3523, -109762, 1425, -31705, 96170, -117573, 30020, -114674, 78881, 44999], -[44781, -129214, 115675, -78286, 22800, -112718, -92402, 91288, -50912, 83722, 97273, 22933, 57607, 104615, 102425, -79141, -99986, -125080, 96131, -40110, -63705, -34012, 117875, -68620, -43630, -106793, -17282, -8433, -8444, -124583, -28843, -6951, 101717, -33320, 122968, -77323, -18345, 75449, -97128, 103257, -76434, 107502, 68837, -20609, -89458, -93489, 77568, -117758, 37742, 60038, -100435, -56562, -105678, -4493, 51135, 84635, 113839, -49258, -110538, 123792, 47334, 129105, -17349, 86514, -5156, 29768, -63475, -6683, -50058, 35286, 97134, 129306, 91951, -81914, 65019, 40746, 104670, 85535, -99649, -57009, 92445, -103620, -53103, -103468, -13839, 33827, 101200, -26325, -80461, 121566, 61114, 113108, -20961, -103760, 106250, -46406, -127900, -48524, -79803, -83832, -20623, 37852, 122502, -14090, -43770, 104438, 51371, 49355, 15861, 26646, 91944, -89173, -30383, 8846, -23288, -63439, 129492, -130674, -23691, 126961, 93487, -97057, -95137, -1668, -98162, 90253, -2656, -85000, -36813, 19908, -83894, -71903, -112476, -93198, 22603, 3853, 103135, 130453, 94136, -101705, 81408, -38124, 88267, -47824, 20169, -109835, 83910, 3169, -33186, 4442, 25363, -76763, 71760, 84738, 72594, 65018, -129300, 120722, -35748, -2028, -47176, 35982, 127265, -99963, -24891, -57644, 32582, -47011, -16678, 30414, 33484, 70493, 21333, -82771, 115811, 73585, 129246, 81646, 7755, 13421, -61281, 89947, -10122, -28716, -93882, 114933, -103692, 91847, -4926, 128059, -21234, 9040, -130768, 18925, -125604, 102770, -6270, 121585, 41031, 24937, -32411, -105533, -109349, 37978, -29502, 97575, -1101, -36137, 24751, -126079, 32308, 71029, -82978, -43845, 4247, -110459, -49803, -107969, -63001, 49874, -62203, 70213, 67574, -52340, 24280, 34549, 60419, 72508, 98473, 38797, 58612, 129726, 89363, -81220, 124017, -93421, -103303, 43637, -77512, 3208, 41932, -63290, -41926, -112820, 12147, 103591, 89115, 92228, 86148, 7975, 111889, -45874, 14172, 51510, -16419, -48115]] -NTT(y): [[1088073, 4527624, 5847240, 7288007, 3888974, 4841681, 4121955, 6958614, 3686007, 5594017, 4666901, 5368437, 2829411, 5259323, 1090572, 2538987, 4231917, 7087065, 5086141, 581351, 1074355, 2723254, 191721, 7346466, 5380982, 3187324, 7278852, 6600466, 5104234, 3409911, 357114, 3107410, 5783227, 5212363, 6403992, 7994693, 25640, 1726502, 6486448, 4575134, 489588, 5982088, 787298, 4456751, 6409686, 5801476, 7815465, 2169308, 7890885, 3185460, 3850709, 2774188, 4739031, 6576931, 4246775, 4973092, 5824248, 1500778, 1047298, 5615479, 3752385, 304390, 4567297, 5953730, 2400437, 1143476, 3303589, 3930561, 7325936, 2675923, 2023936, 2265022, 2811809, 1961377, 1637751, 5567743, 3479684, 7773285, 377918, 821487, 1626514, 6517429, 8098310, 7469320, 3034086, 225260, 508852, 87370, 7172851, 4102689, 1039286, 8027536, 2950685, 4142338, 6105374, 4462559, 85236, 1605685, 7703145, 2441351, 7384749, 6583167, 3764081, 3667114, 6206986, 5301804, 7643702, 7304481, 4393275, 3356737, 8334304, 4778063, 4552672, 573549, 147163, 5618417, 339781, 7624736, 7881788, 6796155, 7434555, 682762, 1803364, 1999624, 548088, 6533079, 3612319, 2451892, 653573, 6620050, 7283812, 8349900, 3298229, 6149582, 4710420, 3540416, 3049602, 8059914, 317172, 7985659, 5920005, 3828043, 5034154, 480056, 6219550, 1974359, 6954136, 1880566, 7603742, 6705810, 3249300, 6240179, 2841966, 4507157, 7880340, 7419918, 1680674, 6827753, 2357927, 8169342, 5144167, 6387797, 2988640, 3627072, 6677480, 522441, 1819311, 1637787, 830078, 666550, 5702444, 7298811, 2225837, 3006668, 1521899, 1178439, 800444, 2038674, 1319431, 1559667, 5164880, 2649414, 6871402, 3774080, 5514641, 6652472, 7419594, 3249133, 279566, 7864802, 2105715, 202195, 6660660, 2271240, 1962326, 3571355, 5776709, 1293968, 7895853, 7325084, 8313715, 3207369, 1397791, 4152907, 3223486, 870276, 3934898, 5258275, 5218449, 7400913, 3131888, 174506, 6856941, 3506023, 1702007, 5792724, 1536190, 689291, 6695503, 6255504, 3118429, 65062, 2124902, 8278514, 2278682, 307492, 3134269, 478984, 5563549, 5563979, 6487182, 3704850, 1338802, 7567564, 5320956, 390938, 1821498, 1922711, 3364857, 5128696, 8030535, 5905957, 124338, 34065, 225899, 7187093, 3568273, 7827365, 5361176, 2628585, 216305, 6131641, 7715148, 7489343, 1823746, 2300908], -[417222, 5090758, 3206330, 1707897, 7938025, 8160683, 7906160, 5446606, 3324187, 6387319, 699421, 3552719, 4142247, 2194145, 6957297, 5781788, 4387966, 2583305, 8310507, 1767937, 6145971, 978034, 2246162, 6174055, 8187524, 4330677, 1647336, 4786988, 5907644, 775055, 364678, 6050629, 4641275, 2299747, 4636499, 61884, 4119825, 1016073, 3571207, 4022859, 1525329, 7404684, 123229, 6470934, 414747, 6786014, 5815996, 3610120, 7192502, 1371907, 3084104, 2766511, 648578, 6607166, 2050567, 1744910, 442775, 4530811, 1784496, 2936029, 3299778, 1786172, 706502, 6593944, 2385853, 4220727, 3228199, 251040, 1435545, 5799047, 4779107, 7538157, 7668210, 3050498, 1470782, 972734, 8321646, 712613, 6501564, 160600, 7147694, 5595086, 2318937, 5359267, 2263722, 7680740, 369119, 4346763, 6457828, 2092851, 3827383, 7689776, 7848814, 8098017, 2634993, 3656236, 3741231, 7827021, 5115979, 136635, 2677062, 3903882, 7696366, 1361214, 6205847, 8090127, 989955, 6062904, 3618960, 1896972, 5854328, 7500703, 2893955, 7143083, 7861913, 5790129, 5887012, 5100401, 3759028, 5019320, 6783949, 2645561, 1395028, 6583722, 3190357, 4417495, 7092783, 998214, 3483906, 812361, 4449410, 3704671, 5466108, 4867349, 681730, 5090394, 5573061, 358043, 2367495, 1435580, 5278391, 5385066, 6371119, 6267698, 1206626, 2430761, 3126098, 928293, 1155000, 3574546, 6331528, 5163341, 8012513, 4592233, 2025424, 1051372, 4131861, 1254042, 3134072, 8193319, 365541, 4568806, 6213314, 174760, 3226688, 6403902, 6351843, 3416970, 820115, 7811458, 135543, 5681239, 5916624, 274528, 8235583, 4500200, 5308730, 656805, 1515241, 2085708, 214920, 6806544, 4037101, 5089320, 5203483, 2137486, 1375094, 6014091, 3980515, 2652718, 5889908, 2249724, 777231, 4219310, 921219, 7856262, 2199179, 3156292, 4727119, 1157202, 7218523, 7402453, 3265331, 5997923, 6556296, 3059112, 773905, 1213621, 5731138, 4589517, 4938952, 5087185, 1929374, 7808540, 7203164, 1958753, 930657, 1571619, 3746445, 7991047, 414839, 6370207, 4191693, 6137031, 1381645, 5873247, 6849294, 586259, 2715543, 1730569, 2276762, 7622733, 6478988, 6555643, 2418404, 903937, 2421957, 4540450, 7463768, 1981215, 3010392, 3922621, 5105763, 242808, 2230135, 1033834, 2942929, 4753721, 4959828, 4911365, 990840, 7927670, 6683456, 6972683, 5237630, 3372701], -[7641296, 2266305, 7250344, 42935, 6407319, 7369220, 2074949, 6516823, 2076806, 5499623, 5838893, 6761683, 6144703, 5398726, 1137342, 4610894, 2582108, 4287943, 5878214, 4566624, 5996262, 2848104, 5162111, 5409966, 31855, 6767235, 954856, 4655071, 1606037, 3979460, 6242010, 3275183, 6627616, 955758, 8364203, 1810661, 3968005, 4272401, 3360288, 2285751, 6892742, 5245744, 3674537, 3651899, 6571536, 3009657, 5928581, 3951494, 1614954, 7289543, 572641, 1096276, 246099, 4623071, 5853694, 5760307, 22161, 2741381, 6410674, 6157401, 7725402, 5809636, 5302956, 1304353, 8034102, 1776781, 906984, 3507356, 889910, 5500602, 4038199, 1082694, 4349163, 2400912, 5203263, 2971152, 6360114, 2727069, 7324131, 7580095, 5575808, 8282205, 3266118, 6813370, 3286348, 7081515, 666637, 1493712, 546538, 7653953, 1193659, 7903247, 5411498, 6193527, 1400587, 7713327, 309853, 6821572, 1566275, 2940910, 6377139, 2738798, 396955, 2913869, 8069357, 7893552, 1884844, 8251158, 5596434, 196827, 6658580, 1278195, 6757367, 5969418, 5242679, 5297136, 5579972, 7360169, 964250, 5833380, 3671393, 7151819, 8297239, 8208138, 2340982, 3187863, 167901, 1979795, 2733961, 7242463, 3794943, 1918461, 170977, 1040030, 741149, 5901143, 4794794, 5641694, 6587013, 1390688, 8244702, 7450449, 4565869, 3889928, 6268099, 7600426, 8301431, 7800343, 8172405, 3607968, 7121578, 2619486, 7488304, 6052550, 4033609, 6471800, 2258174, 4407633, 216816, 3626951, 3116175, 8224159, 6462916, 2603772, 7293575, 7252076, 7347822, 3501786, 4104147, 403974, 7711102, 7957369, 2929668, 6548699, 6873553, 1748207, 2751933, 3149636, 4617870, 7686352, 5135544, 2392580, 4575902, 6115631, 8216208, 1197453, 113266, 6367617, 6691142, 933660, 4542919, 3381073, 7063828, 4907377, 3248401, 6640557, 6102946, 118232, 4500538, 3764684, 2576521, 7803641, 1407639, 7704761, 5327654, 4822388, 1979244, 2074324, 8101155, 3303727, 2136822, 7123014, 576673, 1195225, 6899810, 4913594, 6141505, 5876375, 7106928, 3363262, 6130121, 3740186, 4877788, 4296130, 962385, 7547980, 8235189, 6758322, 5845582, 6837339, 1223553, 6204123, 3938890, 2953945, 7741426, 954654, 3835786, 6989470, 7209550, 6815315, 1803126, 6340967, 1445658, 2886929, 8009271, 4527265, 4383767, 3601662, 7111936, 1522043, 4810318, 1952326, 5856796, 8101015, 3007669, 3981321], -[469495, 5197371, 4840897, 6605745, 7623389, 2016704, 7814431, 6648429, 6429309, 5256781, 7286040, 3799625, 5599407, 7826789, 5256180, 4777444, 4195439, 490680, 4156866, 2606492, 2726053, 5673009, 7973130, 1884457, 6629731, 6434595, 4212676, 3644517, 6688746, 1030024, 3333210, 5826368, 5131445, 1917382, 3199602, 7199586, 7048844, 4226741, 4831700, 372533, 2987287, 919294, 3433668, 5044716, 6412871, 281456, 4122529, 6893968, 6787477, 5928723, 906619, 5698340, 4133508, 57082, 7204708, 6425323, 6912973, 3832557, 1947374, 1407784, 6016101, 1141341, 3422037, 3460503, 6661797, 6025616, 3719643, 4543641, 7342924, 6051359, 2308367, 5659052, 6787362, 1274295, 2478398, 175290, 3335036, 8040773, 3440639, 2792251, 8141403, 2359541, 3817625, 7092836, 8017478, 3150002, 5917367, 6253019, 8100563, 3871428, 6643515, 5374832, 1654604, 1758679, 4404599, 2165294, 7779727, 8206940, 6802288, 881819, 4116476, 7483031, 2781367, 2974114, 6100252, 5313487, 1159686, 7676173, 2420193, 1292178, 4482569, 6046868, 4316125, 2834050, 7375358, 5593699, 4816844, 2452671, 3191334, 6721559, 6669911, 2177366, 5675657, 1421975, 2758352, 7149541, 7790847, 2068958, 2255858, 4097200, 1093465, 6012768, 1817467, 5380952, 7057794, 6131485, 457855, 5462138, 7930941, 7946123, 650473, 4493708, 2322273, 5209758, 742831, 3760705, 4168388, 7754035, 3066085, 2191629, 8068842, 7569716, 4423556, 4570300, 8213028, 2758280, 3022163, 1359800, 3315874, 3544904, 6585208, 2751893, 7034720, 2815563, 4637542, 4550438, 918541, 3934932, 2330700, 3029434, 6123006, 2188987, 7993287, 409982, 3525205, 3729751, 4350016, 4899129, 2941574, 201492, 6587571, 4111739, 5617045, 6616077, 2676911, 5248023, 4214105, 2686589, 869189, 5582620, 6383688, 4477680, 4380523, 6453880, 7718680, 2569899, 4259990, 590829, 1286324, 1380554, 2351860, 6204335, 4247612, 6580874, 4404700, 1086037, 1888220, 2854279, 2805852, 5148018, 1820747, 7067428, 2483195, 4786803, 1049566, 7821317, 2078392, 1506840, 295832, 4617829, 6731626, 3386983, 2167493, 3332761, 1139067, 3814674, 1773920, 1459017, 5604678, 6247741, 2394377, 8117179, 8168593, 6434555, 2457931, 4569432, 4016031, 1444110, 6310307, 5726615, 5247904, 5127971, 1306564, 6286304, 532594, 6274386, 7002744, 5450328, 5083577, 564925, 5706118, 3497028, 8138546, 7777153, 3159925, 4081216]] -aHat * NTT(y): [[270439, 1411037, 3377986, 78159, 2180123, 1422052, 1539112, 4901871, 3499164, 5202915, 5895461, 6245409, 5661, 5520541, 6963748, 7375972, 357689, 255839, 6953748, 1300170, 5686391, 5381591, 6025671, 692468, 3813346, 7064302, 8265258, 6333634, 641012, 7799324, 7631007, 6778528, 7015864, 6492383, 1546856, 5388201, 7343229, 5795471, 7794468, 5984449, 7704729, 2583493, 5903665, 5290330, 2723371, 4469623, 4634712, 3833999, 229613, 4840059, 5988016, 7869482, 6142921, 4134744, 6728559, 1448930, 2499244, 868269, 3675580, 4128116, 1633331, 5473768, 8039539, 221897, 5449129, 619008, 3186765, 7601650, 6469561, 2649495, 1944846, 2641664, 4413249, 5022101, 4948349, 3763931, 4332795, 2462908, 5609865, 6334703, 6439823, 5716034, 6368697, 3965070, 6553067, 434943, 5269846, 7068965, 2511877, 3869856, 6020334, 2454395, 694163, 6098709, 5894956, 6858074, 7911100, 451403, 2487949, 2857793, 1117452, 531522, 6586000, 7248477, 6161964, 2480315, 1212450, 1535116, 4690555, 5426276, 1978615, 4490013, 4119858, 3139696, 2287571, 265875, 5450308, 5558510, 571996, 7980836, 3117111, 3070862, 4613476, 6358709, 1116687, 3475251, 2324795, 289123, 1753647, 4551872, 7051247, 4271872, 3621759, 307571, 4463206, 5539950, 2758876, 1168112, 4260769, 2489571, 4997475, 1551997, 811992, 3864818, 8189661, 5708611, 5655256, 100693, 7514304, 4502295, 5959216, 4369905, 1689582, 2511305, 3382188, 3003285, 3971609, 7834992, 6441726, 5885280, 2251605, 5341337, 3087824, 6110659, 4923959, 7916180, 7411763, 4411104, 3797597, 1911050, 5999092, 2677961, 6388421, 6838456, 305566, 2188744, 500351, 7288058, 4568389, 1742411, 5735486, 1788148, 5489697, 1683021, 1357541, 1325630, 8040164, 2793414, 2772766, 7870602, 6168526, 1145799, 1403387, 3641817, 1124649, 1233705, 1356142, 5011012, 4678335, 1145790, 7648366, 4981430, 7138199, 6143835, 5431165, 3953282, 4555644, 7447701, 7430096, 5206325, 1649025, 3700212, 4106442, 4062045, 5080650, 1417100, 1759276, 784375, 4667173, 3661887, 4324724, 702200, 5636528, 740386, 6137036, 465242, 356675, 7676519, 1490083, 603059, 3084235, 2758380, 688895, 5368148, 3468603, 3643497, 4278023, 6221160, 1246505, 5649340, 4448393, 1534168, 6312053, 13446, 3798373, 392323, 8097640, 4820757, 501334, 3678061, 906673, 3652378, 5428514, 6829935, 7470838, 2307732], -[1441270, 8068310, 301738, 7196829, 766548, 6821201, 7558911, 2816785, 4112317, 5982287, 2118034, 2706917, 4752384, 30228, 8328555, 4851594, 5135697, 8070952, 7227189, 5209493, 190937, 169260, 3074693, 6872128, 6827410, 3429283, 7718955, 8096905, 3132988, 4130902, 1033341, 2825519, 7714377, 4501728, 7924100, 2405164, 4243971, 5679393, 6994804, 2157816, 2601145, 6835607, 6500566, 5340526, 4223098, 7953895, 370651, 4229396, 3780172, 7482911, 5386745, 6773588, 687356, 3751453, 4790327, 6635415, 646035, 7326654, 2143395, 4037002, 6541502, 3397121, 7114200, 6684448, 3537928, 2028419, 874764, 6419065, 3332758, 5519924, 7041646, 8275961, 3770481, 5073453, 2610203, 1530624, 4454491, 6493789, 5661679, 688206, 8151520, 7151858, 918092, 5781516, 6232786, 4442483, 4394134, 7314110, 651326, 4022981, 2837190, 2229720, 5092180, 1060549, 5141435, 7096555, 949540, 4235365, 8330517, 5247593, 7789544, 1371472, 4144797, 596779, 7087855, 149585, 1176960, 1681684, 137454, 6234722, 7170943, 4176676, 3807062, 3866746, 8346719, 1723236, 6153753, 4609744, 3863881, 553192, 4674724, 817934, 3909035, 2104089, 1490086, 1118742, 312912, 2043333, 4685437, 5807133, 5330244, 2800067, 2811984, 137393, 5665439, 2954357, 6501698, 1070751, 2492082, 3586571, 5234853, 2738282, 2773108, 2435738, 2675347, 787889, 2023693, 795073, 7674041, 1659350, 1237083, 8068188, 7151281, 6378375, 7460786, 2643496, 3011461, 1281648, 4518649, 3920261, 6537520, 5522485, 276304, 1553170, 3731016, 3177386, 4956975, 2703487, 6702981, 3558637, 4083543, 3179920, 7693289, 5558263, 1166759, 5047964, 6680810, 756394, 3060404, 2913261, 4978025, 1450487, 3382902, 3758840, 4023524, 4038176, 712681, 2666823, 1193871, 3448514, 5713024, 3086728, 4493939, 1509586, 4236197, 8095005, 7670130, 5640886, 763535, 5826894, 4512310, 5470813, 2350042, 6950934, 7470584, 186365, 6419973, 5983886, 8051793, 7279665, 3142429, 596146, 7192184, 2849051, 374003, 909904, 1870834, 14362, 7840049, 2453596, 7931184, 6283694, 5921383, 7353203, 2176675, 3260687, 1437674, 400096, 1076453, 429043, 938487, 4057156, 4932986, 1472643, 3902890, 2948250, 7940538, 3808769, 2015389, 1227040, 6794784, 8150400, 4834920, 2368384, 2879398, 6734867, 5035915, 4258681, 2788386, 573273, 1121245, 8035407, 6685620, 4801094, 6409635, 6250889], -[4972682, 1791296, 1391484, 2280859, 6338938, 2334721, 3576375, 2251461, 4504096, 3002649, 477709, 5935258, 2526801, 3257454, 5265805, 3370730, 1916006, 3417121, 2720550, 2122078, 4528257, 7082414, 6852245, 6862340, 4647656, 5208398, 1869742, 314056, 7893714, 2218993, 78036, 4548252, 1320217, 7871143, 3663151, 4903400, 7108280, 3290139, 2283018, 4823606, 358634, 4143505, 5944462, 2229452, 4992428, 1077170, 1714259, 1191478, 4921679, 2152002, 5104295, 2990978, 3330674, 4447721, 4724011, 2780333, 8350979, 6044926, 1210788, 7565931, 2595, 1494688, 5159434, 6975516, 3477118, 5660457, 4009737, 4778053, 5915711, 5081226, 3849254, 3317308, 6004436, 6546017, 50478, 8239127, 162752, 5282251, 7382552, 2766905, 3175764, 5905593, 4966284, 7568169, 2929867, 4823134, 7975152, 4511053, 3140291, 6294075, 1714307, 6717316, 3025246, 6777900, 5199260, 5280386, 1208427, 467993, 105344, 4052764, 2103431, 3864485, 4934893, 2804621, 4364161, 2585783, 7832628, 1610103, 199454, 2369320, 1997187, 6595117, 2561155, 2068302, 7474203, 5577634, 6446434, 1992091, 2896906, 5826731, 3735651, 4968075, 2380768, 3036065, 6436938, 5838947, 4802503, 4724616, 7113408, 3302927, 1361138, 5213889, 1666323, 7372067, 3094469, 2947377, 862888, 5983646, 85419, 3057068, 3999186, 7755723, 1335044, 5008335, 4837946, 4637128, 3060531, 7250144, 1981303, 1800950, 7629457, 102592, 2000223, 2932354, 528381, 3392273, 3335510, 5696104, 777076, 5778199, 4845375, 3835063, 8340729, 8002901, 4539655, 1969592, 5075552, 5498285, 2178086, 3942923, 1613838, 1414899, 5384003, 6025565, 1346961, 2480827, 6361148, 582527, 2140475, 1079974, 1833351, 2430323, 4708831, 811834, 8285109, 5096145, 2057685, 4431298, 1499358, 200306, 7966923, 3011895, 754467, 6372902, 1803897, 328195, 7260540, 2671591, 5116225, 7849147, 3681298, 1847983, 4010245, 2375487, 4234193, 581714, 2861195, 7246240, 2596294, 7432213, 8295317, 5506748, 673817, 3526111, 6158634, 6025539, 3132487, 977428, 5479947, 8000176, 95314, 6630237, 7453087, 697959, 3553495, 6610343, 6205630, 7028920, 8147264, 8074420, 1770955, 5446165, 2487223, 6626229, 1080392, 2740434, 6888644, 7640724, 830483, 2710953, 6804999, 4656069, 3631195, 2448187, 3865565, 8165282, 296746, 4390449, 7242080, 435448, 5281486, 4458418, 1382865, 6730646, 1692415, 7228314], -[4024774, 1857842, 5266907, 4774314, 522814, 6075117, 2546077, 3821746, 6656982, 3069486, 4109179, 3177705, 705894, 2666195, 6890609, 1975060, 7673256, 2109300, 3507816, 663850, 4949519, 4460373, 5886262, 4472670, 2912411, 7918080, 5934547, 7489490, 8195679, 1134344, 279990, 8318825, 1545390, 4776518, 6504330, 4790405, 6019086, 4517375, 1197543, 8173382, 6892281, 5394228, 2598642, 8298090, 8122596, 5509682, 6306700, 193777, 7081160, 7590798, 2548818, 3029662, 5869190, 6100251, 4481901, 8091858, 2426588, 175254, 1792245, 6878975, 8188162, 2178007, 1190468, 1020488, 3005014, 4489954, 2160471, 578508, 3090104, 8177165, 1842803, 4099334, 4467832, 5287289, 1345083, 951716, 1855239, 4021550, 2727182, 1112458, 5876551, 7893013, 6570530, 6582877, 5175811, 6199854, 2933513, 6295113, 5639992, 5999440, 4088946, 1329676, 103062, 1922531, 4824983, 930695, 5392185, 4764880, 2736735, 8197297, 1436483, 299300, 953214, 6841547, 7484104, 4682660, 1523413, 3228739, 1779979, 1976165, 3001808, 3451704, 7873046, 3008236, 5771214, 7683326, 6236777, 1570044, 2234648, 4523552, 7842516, 1740435, 1080676, 2035179, 2398624, 7773951, 2382299, 5751370, 5025388, 625977, 3401347, 5069435, 6377785, 5472123, 2219090, 5603090, 5594420, 3569997, 5154630, 8249961, 6216176, 1477467, 3332360, 2109516, 2246415, 5581141, 1423790, 252681, 2497444, 5468184, 5125122, 5635290, 7305262, 1232260, 983721, 4989322, 6107247, 2589314, 5937402, 921081, 3972998, 7630256, 2613488, 3915119, 8058168, 3670961, 5226082, 4209546, 7259307, 5578360, 8013599, 4415195, 5874263, 3275209, 2248204, 4310642, 7917312, 7891430, 3281603, 3412398, 4619623, 5059065, 3757670, 7599732, 4753099, 4790149, 7560941, 5660526, 1902811, 7843223, 4491580, 4235555, 6671727, 3652997, 7360645, 2178203, 5093195, 3176023, 1037830, 3449462, 3369243, 2931748, 1995847, 6034305, 7994772, 1166272, 4473061, 2368570, 7133439, 5292025, 4252587, 6907184, 372043, 3862890, 4477639, 3111520, 2525285, 6161537, 628214, 8018799, 6217732, 7262235, 283667, 7641661, 7739310, 7674065, 4924107, 752140, 343555, 7168660, 7574192, 5298099, 5371078, 574577, 735928, 8069735, 588272, 4554475, 1664055, 2747118, 8369383, 4099344, 4005756, 8325869, 7435823, 8236331, 366017, 7985056, 3338248, 8013835, 5382298, 3310744, 4405017, 99250, 7779408, 306435]] -w = NTTInverse(aHat * NTT(y)): [[6810060, 5257295, 3345583, 563675, 2836703, 547228, 5361665, 5992755, 5084814, 3315175, 8274605, 1850047, 2172053, 6165931, 1831180, 2584211, 6374627, 6752156, 7824113, 6345678, 6210108, 6552017, 6090444, 1977866, 2095932, 654181, 6135955, 1701793, 2492319, 273562, 2274683, 7605268, 3432616, 6241327, 6090594, 5037093, 2433492, 6492107, 769107, 2249870, 7747152, 862336, 6984462, 2882730, 1481930, 504950, 5428312, 3889903, 3470199, 6075553, 390654, 5432315, 6093208, 5047184, 2750411, 4691774, 6190863, 286665, 6847365, 3074794, 2414883, 3956958, 5826818, 4475784, 8069308, 5763459, 4096128, 3996498, 6622285, 2812756, 5181899, 5511536, 2267672, 4808858, 4539829, 5293998, 352697, 6116656, 3356186, 5077122, 1384863, 4168883, 8204574, 6762031, 7982928, 5971938, 1713792, 257917, 1971971, 7324845, 8318138, 3529583, 8080948, 5350186, 5957622, 6025144, 7982838, 5587477, 3291765, 1816959, 4882010, 5796387, 3951888, 7920334, 4025055, 1951560, 3572826, 4059910, 2681065, 8285583, 5739081, 7640414, 6913583, 2343183, 660858, 8211560, 4467485, 550045, 1176015, 2290350, 4336432, 5102418, 8236768, 6833365, 6682988, 2863085, 3216113, 5654687, 6346513, 2276840, 7087590, 6575819, 7523431, 4854376, 1160149, 617581, 1362257, 4179289, 8308324, 5648908, 7446702, 5451334, 7047349, 5148881, 7459033, 7830470, 2333917, 3138547, 5543837, 876323, 1158376, 735444, 1471120, 613167, 5970922, 6096918, 2754375, 2780955, 4754069, 7468161, 2144640, 2898340, 2251696, 229491, 5460893, 3829178, 5878117, 6319089, 74056, 3297315, 4042048, 4711962, 8204448, 4654703, 1285683, 7434843, 4118231, 3624810, 6890483, 7028958, 6676126, 5416594, 5183184, 1027346, 4484787, 3405892, 8105594, 1022268, 4835352, 6486881, 6076569, 4315027, 6952114, 6668703, 1241352, 2260652, 440881, 6260090, 2925987, 5062999, 1307248, 6426499, 4060110, 4688243, 5182302, 5094896, 7143829, 6201727, 5946744, 8278720, 233488, 2931900, 4836732, 5880504, 7792717, 5685863, 2257945, 4091436, 6640950, 2759011, 5782620, 5098681, 3582628, 4387985, 1511354, 1101721, 5044827, 5759042, 6195504, 1878917, 5374397, 3781938, 5400091, 2313818, 4471911, 3887175, 7337812, 8215304, 5189572, 589717, 315656, 1611167, 6553875, 6539852, 6037350, 905324, 6905269, 2860728, 217119, 4128930, 6671457, 6165801, 3488346, 7781498, 3904266, 102617], -[2827127, 2106670, 7547276, 7086876, 955315, 4132137, 7891601, 2699294, 4112040, 7211844, 5118940, 3418682, 7601125, 5209460, 1906739, 208283, 632454, 7229102, 4123864, 3123848, 5877208, 7002828, 344305, 1319415, 2928570, 2035239, 5138570, 1478134, 5679332, 3656637, 1514270, 2322316, 3526602, 3102462, 4172753, 3124100, 2796890, 751678, 8325236, 7885676, 1983794, 2688543, 2083074, 982625, 2945616, 6942820, 1435943, 5325330, 7641718, 6294104, 1108333, 4545500, 459025, 7698915, 3411777, 7151926, 1307347, 7851540, 5032934, 998499, 382213, 203399, 4056088, 2253908, 8356775, 7490626, 7824250, 4106739, 786533, 7192447, 2370858, 6825975, 3592305, 3453357, 3996934, 1543656, 7815557, 3254984, 3968690, 3167638, 2695807, 7726850, 4737546, 2938455, 5466176, 1629592, 3389220, 6847063, 527871, 6280958, 508697, 497015, 4878861, 2903859, 3900995, 411503, 8023419, 1593131, 6532090, 1764577, 4982743, 839637, 1666955, 6593725, 2066929, 1572879, 5837617, 7462285, 8131845, 6724405, 7940073, 3851287, 6331171, 8343802, 5598232, 3847365, 1911005, 2798516, 7684023, 2745095, 1854605, 7619684, 6344383, 5257091, 2769877, 4639513, 3789532, 656749, 4696923, 2440503, 2798077, 4887712, 4004822, 7341202, 6812494, 1246042, 5674339, 3757231, 34767, 5753673, 3241696, 3614406, 3721198, 1145774, 4298341, 7540717, 4423754, 2159293, 2711465, 7114290, 2780582, 5586394, 2530061, 7585773, 98175, 7044198, 3497871, 55250, 1933262, 7406885, 8047760, 4519464, 3922, 4506600, 7834501, 7371818, 4425937, 541922, 5533604, 2212861, 4719306, 272121, 3970118, 4694385, 8025750, 8356604, 7126351, 5974112, 3151072, 3759597, 2566268, 626504, 7861911, 5648674, 4665166, 7851932, 4561965, 3921885, 5205401, 6361151, 5403942, 5900889, 4409959, 4309039, 4025421, 259952, 3798210, 7710497, 5015574, 8144722, 5615224, 401839, 6987398, 3427167, 1399426, 2358536, 98373, 4900130, 1044911, 2229707, 6921291, 2154924, 3175404, 3999130, 4063058, 5644721, 613607, 5180666, 2509080, 7083141, 3043933, 3438656, 5460378, 413863, 1208255, 1219690, 6990977, 5853305, 3934034, 4275457, 992464, 6165038, 4343724, 2829689, 1700754, 4839106, 6816741, 619915, 8270159, 2803583, 1666385, 3294424, 2198874, 5251878, 7405026, 4605730, 4966073, 2017358, 2315375, 1172832, 1243848, 4055429, 3052807, 5275554, 3463890, 1435442], -[7270626, 5546619, 707307, 6352746, 244647, 4735554, 3957673, 4251809, 5416761, 7742090, 5690461, 7259411, 6714793, 4262639, 7107876, 6939250, 5562742, 6424063, 3494102, 1869921, 6883202, 1381391, 6471391, 8317663, 5553306, 3880351, 5736178, 6435344, 1507310, 2700383, 4941761, 2429493, 2889864, 4616878, 5242502, 3510002, 415114, 4577354, 1751347, 403974, 574798, 2272368, 1110317, 6570432, 7116000, 1149884, 3055510, 7053337, 7886957, 4434026, 3597485, 681079, 151846, 7716925, 4860687, 5168602, 5747907, 2349754, 2376200, 1706582, 959603, 7421511, 255848, 6542542, 3032169, 7218421, 2726231, 2045033, 5877566, 8283389, 3924701, 1616611, 1490249, 8291009, 6761522, 5628798, 3670863, 5972905, 6825509, 5028127, 6619637, 7542979, 3291394, 6600294, 6121593, 4210377, 2520266, 4886952, 319201, 5831233, 2910906, 5249938, 7679713, 5320697, 2051825, 417417, 6349486, 2487631, 6522376, 2027227, 7469725, 1225716, 1125935, 4316806, 2361128, 318533, 1957766, 6743678, 6708071, 6686649, 6034206, 1016248, 6631016, 3767993, 6069727, 1741069, 1411464, 3532755, 3513661, 2452347, 507719, 4859429, 2239801, 2438793, 3930637, 5939650, 966824, 6108056, 5704026, 5455241, 6518133, 5587325, 668379, 17312, 1223477, 1643021, 8088683, 412360, 1194588, 3504103, 2512654, 4699253, 2708658, 4714333, 7527638, 3914191, 415173, 4472643, 2643969, 2178054, 4400153, 1001270, 7380384, 1695585, 5924832, 3763045, 4398100, 6145768, 1206424, 882323, 911016, 5294308, 8030767, 3452502, 1135811, 941073, 4902663, 2555780, 4165031, 6349985, 4683725, 2227928, 8093771, 2776936, 3312105, 3545256, 3670784, 606150, 7788821, 4270616, 208858, 7028204, 114173, 4057724, 8349910, 8097269, 1169218, 3227183, 2649839, 5942980, 7443482, 7358461, 4691462, 3200575, 213357, 1707902, 8372500, 6235067, 4824153, 2621395, 6409764, 2531405, 2597236, 8097558, 241990, 7552478, 3075659, 4070633, 2283089, 96590, 2335348, 7813393, 8245749, 3936876, 1860172, 6310645, 339965, 7169930, 5021477, 7985934, 1945694, 7301940, 7719181, 2689293, 3525245, 2052693, 7755503, 6330167, 7823781, 4311673, 2515321, 4134507, 2366398, 7246642, 8050002, 6297851, 4750052, 7561780, 4974476, 1480744, 2620298, 6602747, 6807386, 5782584, 780233, 6744435, 4184838, 7680407, 814436, 6995671, 6444705, 1713223, 4119279, 3349620, 1983577, 5735156], -[3320920, 4698932, 7896500, 1152677, 4805885, 49015, 2064676, 4545670, 3360000, 2596083, 6462710, 2083215, 3887818, 28535, 6091762, 2429812, 5198131, 5256902, 1513471, 6043942, 6484423, 6213498, 603471, 3556011, 427518, 1861304, 1354951, 2171381, 4633496, 6922740, 8189051, 2773673, 4229859, 7738991, 840025, 7218388, 8148149, 6118771, 6011152, 3092077, 2469038, 6109935, 1013480, 1947579, 8094277, 5885674, 1800418, 2572803, 347895, 3127527, 4693650, 3178198, 3869305, 7424955, 2565388, 1639262, 5805816, 3072819, 6270613, 4235828, 6259204, 5164168, 474667, 6728655, 1749608, 7722992, 8248628, 1996477, 1261995, 3519444, 4822261, 3151335, 1976379, 1720166, 8240287, 1091208, 82662, 5675513, 7144527, 4683800, 7825574, 6279670, 5495077, 5433969, 6907037, 5023306, 3337457, 5417399, 3946705, 942493, 4630253, 8338708, 2186660, 2130907, 3428626, 2898999, 2770412, 6796703, 5183185, 1045771, 2061182, 3372856, 7969914, 3404465, 1584071, 2376828, 2338400, 1009776, 365393, 3441822, 6632466, 1632953, 531512, 8290879, 5958537, 3313246, 4393320, 3534667, 354767, 5589996, 48812, 1949756, 7466097, 8056996, 4873381, 256569, 2452857, 6813310, 4412932, 3130787, 541480, 219354, 3897337, 5961951, 5824682, 3703356, 5625732, 2011809, 7763145, 8250493, 7093179, 46990, 2031304, 5108723, 6301841, 4943520, 4382013, 6668389, 2809029, 7477075, 7427649, 2911059, 1814979, 2402708, 5679756, 4831190, 7505475, 5974462, 5866055, 5940306, 6438821, 8077111, 3340904, 8298066, 4468634, 5410021, 3258960, 4500158, 4076859, 5342502, 4708441, 7696595, 2733468, 181260, 3028379, 3901615, 7257540, 5866064, 1071336, 3773033, 4248963, 880643, 471461, 4015364, 6564888, 1851958, 6811540, 517319, 2456309, 7562223, 6008785, 2231028, 337017, 4017768, 2344222, 6918487, 5350010, 1755510, 2831109, 5146998, 7964914, 7360813, 1546751, 3007115, 2159387, 732818, 2920137, 1636439, 1945991, 6595402, 7613964, 4642656, 4222965, 6297098, 5870686, 3273455, 3686011, 1251547, 8163613, 5036266, 7824555, 3776379, 7963411, 6550031, 169115, 5147346, 7207004, 248190, 518744, 5192245, 3746995, 8195658, 3684981, 5550876, 1773365, 4497568, 3805300, 5570097, 1036807, 3224722, 8376223, 292464, 4683990, 3737259, 1291784, 7628773, 7163248, 7721566, 2421523, 674164, 4066268, 2336576, 4791278, 6096018, 6956403, 4509783]] - -w1: [[36, 28, 18, 3, 15, 3, 28, 31, 27, 17, 43, 10, 11, 32, 10, 14, 33, 35, 41, 33, 33, 34, 32, 10, 11, 3, 32, 9, 13, 1, 12, 40, 18, 33, 32, 26, 13, 34, 4, 12, 41, 5, 37, 15, 8, 3, 29, 20, 18, 32, 2, 29, 32, 26, 14, 25, 33, 2, 36, 16, 13, 21, 31, 23, 42, 30, 22, 21, 35, 15, 27, 29, 12, 25, 24, 28, 2, 32, 18, 27, 7, 22, 43, 36, 42, 31, 9, 1, 10, 38, 0, 19, 42, 28, 31, 32, 42, 29, 17, 10, 26, 30, 21, 42, 21, 10, 19, 21, 14, 0, 30, 40, 36, 12, 3, 43, 23, 3, 6, 12, 23, 27, 43, 36, 35, 15, 17, 30, 33, 12, 37, 35, 40, 25, 6, 3, 7, 22, 0, 30, 39, 29, 37, 27, 39, 41, 12, 16, 29, 5, 6, 4, 8, 3, 31, 32, 14, 15, 25, 39, 11, 15, 12, 1, 29, 20, 31, 33, 0, 17, 21, 25, 43, 24, 7, 39, 22, 19, 36, 37, 35, 28, 27, 5, 24, 18, 43, 5, 25, 34, 32, 23, 37, 35, 7, 12, 2, 33, 15, 27, 7, 34, 21, 25, 27, 27, 38, 33, 31, 43, 1, 15, 25, 31, 41, 30, 12, 21, 35, 14, 30, 27, 19, 23, 8, 6, 26, 30, 33, 10, 28, 20, 28, 12, 23, 20, 39, 43, 27, 3, 2, 8, 34, 34, 32, 5, 36, 15, 1, 22, 35, 32, 18, 41, 20, 1], -[15, 11, 40, 37, 5, 22, 41, 14, 22, 38, 27, 18, 40, 27, 10, 1, 3, 38, 22, 16, 31, 37, 2, 7, 15, 11, 27, 8, 30, 19, 8, 12, 19, 16, 22, 16, 15, 4, 0, 41, 10, 14, 11, 5, 15, 36, 8, 28, 40, 33, 6, 24, 2, 40, 18, 38, 7, 41, 26, 5, 2, 1, 21, 12, 0, 39, 41, 22, 4, 38, 12, 36, 19, 18, 21, 8, 41, 17, 21, 17, 14, 41, 25, 15, 29, 9, 18, 36, 3, 33, 3, 3, 26, 15, 20, 2, 42, 8, 34, 9, 26, 4, 9, 35, 11, 8, 31, 39, 43, 35, 42, 20, 33, 0, 29, 20, 10, 15, 40, 14, 10, 40, 33, 28, 15, 24, 20, 3, 25, 13, 15, 26, 21, 39, 36, 7, 30, 20, 0, 30, 17, 19, 20, 6, 23, 40, 23, 11, 14, 37, 15, 29, 13, 40, 1, 37, 18, 0, 10, 39, 42, 24, 0, 24, 41, 39, 23, 3, 29, 12, 25, 1, 21, 25, 42, 0, 37, 31, 17, 20, 13, 3, 41, 30, 24, 41, 24, 21, 27, 33, 28, 31, 23, 23, 21, 1, 20, 40, 26, 43, 29, 2, 37, 18, 7, 12, 1, 26, 5, 12, 36, 11, 17, 21, 21, 30, 3, 27, 13, 37, 16, 18, 29, 2, 6, 6, 37, 31, 21, 22, 5, 32, 23, 15, 9, 25, 36, 3, 43, 15, 9, 17, 12, 28, 39, 24, 26, 11, 12, 6, 7, 21, 16, 28, 18, 8], -[38, 29, 4, 33, 1, 25, 21, 22, 28, 41, 30, 38, 35, 22, 37, 36, 29, 34, 18, 10, 36, 7, 34, 0, 29, 20, 30, 34, 8, 14, 26, 13, 15, 24, 28, 18, 2, 24, 9, 2, 3, 12, 6, 34, 37, 6, 16, 37, 41, 23, 19, 4, 1, 41, 26, 27, 30, 12, 12, 9, 5, 39, 1, 34, 16, 38, 14, 11, 31, 43, 21, 8, 8, 0, 36, 30, 19, 31, 36, 26, 35, 40, 17, 35, 32, 22, 13, 26, 2, 31, 15, 28, 40, 28, 11, 2, 33, 13, 34, 11, 39, 6, 6, 23, 12, 2, 10, 35, 35, 35, 32, 5, 35, 20, 32, 9, 7, 19, 18, 13, 3, 26, 12, 13, 21, 31, 5, 32, 30, 29, 34, 29, 4, 0, 6, 9, 42, 2, 6, 18, 13, 25, 14, 25, 40, 21, 2, 23, 14, 11, 23, 5, 39, 9, 31, 20, 23, 32, 6, 5, 5, 28, 42, 18, 6, 5, 26, 13, 22, 33, 25, 12, 42, 15, 17, 19, 19, 3, 41, 22, 1, 37, 1, 21, 0, 43, 6, 17, 14, 31, 39, 39, 25, 17, 1, 9, 0, 33, 25, 14, 34, 13, 14, 43, 1, 40, 16, 21, 12, 1, 12, 41, 43, 21, 10, 33, 2, 38, 26, 42, 10, 38, 41, 14, 19, 11, 41, 33, 41, 23, 13, 22, 12, 38, 42, 33, 25, 40, 26, 8, 14, 35, 36, 30, 4, 35, 22, 40, 4, 37, 34, 9, 22, 18, 10, 30], -[17, 25, 41, 6, 25, 0, 11, 24, 18, 14, 34, 11, 20, 0, 32, 13, 27, 28, 8, 32, 34, 33, 3, 19, 2, 10, 7, 11, 24, 36, 43, 15, 22, 41, 4, 38, 43, 32, 32, 16, 13, 32, 5, 10, 42, 31, 9, 14, 2, 16, 25, 17, 20, 39, 13, 9, 30, 16, 33, 22, 33, 27, 2, 35, 9, 41, 43, 10, 7, 18, 25, 17, 10, 9, 43, 6, 0, 30, 38, 25, 41, 33, 29, 29, 36, 26, 18, 28, 21, 5, 24, 0, 11, 11, 18, 15, 15, 36, 27, 5, 11, 18, 42, 18, 8, 12, 12, 5, 2, 18, 35, 9, 3, 0, 31, 17, 23, 19, 2, 29, 0, 10, 39, 42, 26, 1, 13, 36, 23, 16, 3, 1, 20, 31, 31, 19, 30, 11, 41, 43, 37, 0, 11, 27, 33, 26, 23, 35, 15, 39, 39, 15, 10, 13, 30, 25, 39, 31, 31, 31, 34, 42, 18, 0, 23, 28, 17, 24, 21, 28, 25, 40, 14, 1, 16, 20, 38, 31, 6, 20, 22, 5, 2, 21, 34, 10, 36, 3, 13, 40, 32, 12, 2, 21, 12, 36, 28, 9, 15, 27, 42, 39, 8, 16, 11, 4, 15, 9, 10, 35, 40, 24, 22, 33, 31, 17, 19, 7, 43, 26, 41, 20, 42, 34, 1, 27, 38, 1, 3, 27, 20, 43, 19, 29, 9, 24, 20, 29, 5, 17, 0, 2, 25, 20, 7, 40, 38, 41, 13, 4, 21, 12, 25, 32, 37, 24]] -w1Encode: 24270DCFC07D5BB42A0BA838E19886A1082ACB00264DC0A052086A8D483069513EC8D051122874A0E664A140424DF55DAA6755E3B3754C867102286D87B592EA97048A094C2AF7816A17299A57A99532550EE0A12433ACD76030D7B692E3137921538E68660C87057867576E67CA405D6110C8F081CE939DCBC3041DF5854054652B769CD6449623B71598B41699085EE5783042F86C875865DB6686DF1A3CD9977A4C353ADE365D88A179A1C2511C7351E7BA0D02228A60413E813582524A05CF829685953A96B949E8A6048369415F291CCFB221DE84301364410F01A48AB3140F8970686860022A9947AA15425031C0995A84C9909354216954454E9A3D5D229143380CDA43092A22261A918C0BF29DEBA85221D051CA833A0A1A720F460D59F368D5491E1E0578D14419177A2D4EF9740D1A9412A09C2A0660E9790D1D930555A602E51751CD907A588A555BC87DD7550514AAAD9D504A07136805432E515579C3D69490D40986517E955580D79364E4B03E49C47027A62D8C71541027216647844156595CEA99A355929D2829E421021DE58988A3350FC649029608036388A50195E9351141AA6D1EC324C5198890E92CDF5A2108407AD3476A231A8DA0D568C2F77028B70861232EA7615C8CA08CE30816230526C7243583C634D557805E2776046024AA60484DE66468255CCE721567F25117681405A74A46A135569831EA134DD3905A411954C06A44CE779E59142440983962E3AC010A554CC0A46BA58482A9A98A993AD39286E9D5588CA98619AA21CE487AC468A144292696A47851961A19B06092232E1400361B878062384C82722C18B93E564A982B08420D5828EA9738029445D4D9241E145AE1268C49BA2A8794454AB21A80676669D875A42671558101CB223D0FB9158BA44A08C31482342603F045D724748072AA5AD090173404D4F74DDE92AE25B06CA1768DCF793E4AE365E7F77DA22A011717611597A14E0051E66750562154A2420E0D0A3242C5905CF26CEA89400BF124CA886256F845D3B16A29A58AC16606C346AD539760545744809051076AA60D5131195862 - -cTilde: 514431DDB2E1846A8D7E7CA6543AE52B63590653C400244B65C052909997240B -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0] -cHat: [2945008, 6068878, 2747561, 2088191, 588983, 4661831, 7359034, 8177761, 3501657, 4119133, 6954513, 4793340, 1681457, 8340679, 5593289, 3296261, 4370767, 3513394, 7942130, 517476, 2517834, 2381244, 4945113, 6935123, 7472201, 1187500, 4108850, 8158211, 6305182, 20842, 2956115, 879692, 7613476, 2451033, 185083, 7240468, 2988410, 5070386, 3100143, 1191126, 7982941, 2247548, 915220, 3293821, 985391, 1126920, 1929065, 2266839, 74029, 7047651, 5866591, 478442, 4160902, 3519812, 6411340, 2315003, 7315875, 2575378, 6066770, 6759180, 5666106, 7823905, 4651753, 7428226, 5167948, 5763142, 3686742, 5583258, 180630, 1183008, 6873002, 3731713, 2687846, 7633533, 2183320, 7966760, 2646227, 8077828, 653702, 6428797, 3765032, 6863623, 179696, 6196077, 3154281, 2659595, 6862797, 5524635, 61788, 7188082, 8058624, 5774882, 4501353, 379105, 4607631, 3199854, 2424697, 7479674, 507091, 6384829, 1382067, 3869830, 3180312, 8237014, 4097262, 8276947, 7797621, 6463606, 3952494, 1550478, 7133369, 129131, 5292534, 538686, 3803382, 3395671, 24440, 3997478, 7288963, 2440611, 4674635, 7734935, 3891558, 7101364, 1094782, 2829651, 900741, 3168241, 2700015, 3772934, 4095208, 2761251, 21861, 4108599, 1837118, 4686023, 1521157, 5515527, 3258926, 4513729, 6287487, 8105503, 4462799, 61812, 5086188, 6427409, 5686786, 3714344, 6369408, 5766777, 1488388, 6379589, 6362534, 7714651, 6471895, 6827910, 4407992, 3746614, 5999300, 5480941, 4938644, 203619, 6316204, 2850765, 4971156, 7994156, 1062516, 3528309, 1387604, 5455249, 1983623, 5235266, 7686217, 1433707, 4697070, 6624990, 613570, 8024814, 776804, 5660391, 534112, 675541, 7915922, 1979129, 16264, 7868408, 632222, 3997212, 2757728, 3446262, 1167472, 8064478, 7081785, 1683397, 7317182, 3397205, 5136729, 61194, 5283039, 2301243, 4377640, 582813, 4308444, 1138822, 8238335, 3719257, 1160431, 2257246, 1112449, 2189491, 7339931, 3811877, 8148436, 2661117, 2200998, 5430330, 111246, 1959338, 4670227, 3730157, 1138963, 2590107, 2236056, 6776767, 2889849, 2798679, 2769848, 100317, 6637252, 7813347, 6630403, 1373995, 6807657, 2035483, 2844459, 2429672, 2121528, 3532349, 4476485, 3617918, 3015142, 6833086, 6093540, 4160341, 5085400, 4662209, 8349237, 3517206, 1923395, 660356, 3168149, 7059752, 2276780, 2208328, 1277074, 3363433] -cs1: [[8380404, 9, 8380416, 9, 1, 2, 1, 8380406, 9, 8380401, 2, 12, 2, 10, 6, 8380394, 8380409, 8380412, 8380413, 1, 8380410, 5, 11, 1, 8380411, 9, 7, 8380407, 8380416, 8380416, 6, 8380411, 11, 8380407, 3, 8380412, 1, 3, 3, 6, 8, 9, 0, 9, 8380416, 4, 3, 4, 8380410, 8380405, 8380409, 4, 16, 8380408, 3, 0, 8380413, 8380410, 19, 0, 8380412, 8380406, 8380415, 8380416, 12, 8380416, 8380412, 1, 8380415, 0, 8380412, 6, 5, 20, 5, 7, 16, 8380411, 8380415, 9, 8380416, 8380403, 8380405, 8380410, 8380415, 8380407, 8380415, 8380416, 9, 8380406, 6, 5, 8380414, 8380393, 8380399, 7, 8380413, 7, 3, 6, 8380408, 6, 8380410, 3, 8380416, 8380398, 2, 1, 10, 11, 1, 8380412, 1, 3, 8380414, 7, 0, 8380416, 7, 0, 8380414, 17, 6, 4, 2, 7, 8380396, 8380405, 15, 8380414, 11, 8380416, 1, 8380402, 8380415, 8380415, 0, 8380415, 8380402, 6, 8380405, 8, 8380410, 20, 4, 3, 9, 8380414, 8380410, 0, 8380412, 8380407, 5, 8380415, 21, 8380412, 2, 1, 8, 0, 1, 4, 8380405, 1, 4, 4, 0, 8380402, 8380410, 8380414, 8380413, 8380415, 8380412, 6, 8380412, 8380408, 7, 7, 8380409, 0, 18, 10, 8380407, 4, 13, 5, 5, 22, 7, 3, 8, 4, 8380395, 8380414, 1, 0, 2, 7, 19, 8380403, 1, 9, 5, 7, 12, 5, 8380410, 8380401, 8380411, 8, 11, 8380409, 3, 8380415, 1, 8380409, 8, 7, 8380413, 8380412, 8380415, 8, 8380414, 7, 8380407, 8, 8380415, 8380414, 6, 5, 15, 17, 5, 8380407, 8380407, 8380404, 8380413, 8380415, 8380415, 6, 2, 5, 7, 16, 2, 8380405, 8380408, 8380409, 8380404, 0, 4, 8380413, 9, 8380415, 5, 8380411], -[2, 11, 2, 6, 19, 8380413, 0, 14, 15, 17, 14, 3, 8380406, 0, 8380411, 8380410, 8380405, 8380412, 15, 0, 8380412, 13, 10, 11, 8380413, 2, 0, 1, 8380408, 8380415, 8380414, 8380402, 8380412, 8380412, 8380416, 8380398, 17, 13, 8380411, 15, 17, 8380416, 6, 7, 8380408, 6, 1, 0, 8380412, 11, 10, 6, 8380406, 2, 15, 8380404, 8380407, 8380415, 8380416, 8380399, 19, 1, 8380413, 4, 19, 5, 8380411, 9, 8380414, 2, 5, 5, 8380413, 4, 8380407, 8380413, 4, 8380415, 8380416, 8380415, 8380411, 3, 8380409, 8380411, 8380407, 4, 1, 8380410, 5, 3, 8380411, 5, 8380401, 17, 8380414, 8380414, 8, 8380403, 8380411, 0, 4, 8380400, 4, 1, 8380407, 3, 7, 4, 4, 7, 3, 2, 8380416, 4, 8380411, 8380411, 8380412, 2, 10, 8380415, 8380412, 3, 8380416, 6, 8380408, 8380409, 8380415, 8380414, 8380406, 1, 8380408, 3, 4, 21, 8380408, 8380404, 4, 10, 1, 13, 8380415, 8380414, 8380410, 8380411, 8380408, 14, 8380415, 4, 1, 15, 11, 1, 11, 8380415, 12, 8380412, 2, 8380409, 8380407, 6, 2, 4, 10, 8380408, 8380410, 2, 8380404, 8380415, 4, 3, 8380394, 4, 2, 8380416, 8380408, 8380405, 4, 8380416, 8380410, 8380403, 4, 11, 6, 8380409, 19, 8380415, 1, 8380413, 0, 11, 8380413, 14, 1, 22, 9, 7, 8380410, 8380380, 0, 4, 8380416, 8, 16, 8380411, 15, 3, 14, 8380405, 8380411, 3, 8380397, 8380412, 8380402, 8380407, 3, 5, 11, 8380398, 9, 5, 8380412, 8380414, 23, 8380410, 8380410, 0, 17, 8380405, 8380400, 8380409, 8380414, 12, 8380415, 7, 8380415, 8380409, 2, 8380406, 8380402, 8380412, 7, 8380408, 3, 8380408, 8380402, 8380414, 17, 6, 8380412, 8380413, 3, 2, 8380414, 8380412, 4, 1], -[8380409, 8380413, 3, 8380406, 3, 5, 8380416, 8380410, 1, 8380413, 0, 8380409, 1, 3, 8380415, 2, 10, 13, 9, 8380416, 1, 8380407, 8380413, 8380408, 10, 9, 8380408, 8380415, 7, 8380404, 1, 6, 8380411, 8380409, 8380411, 8380413, 8380414, 3, 13, 8380413, 8380415, 5, 9, 8380400, 8380409, 8380416, 4, 1, 8380416, 8380405, 15, 11, 8380412, 9, 4, 8380414, 4, 14, 1, 8380408, 3, 8380413, 0, 8380408, 10, 8380400, 8380411, 15, 1, 5, 13, 0, 2, 8380416, 8380414, 0, 8, 5, 8380409, 5, 19, 8380406, 15, 8380414, 8380398, 8380415, 8380410, 8380403, 5, 8380414, 0, 8380411, 8380415, 2, 8380410, 8380414, 8380408, 8380414, 8380412, 4, 8380413, 11, 8380410, 0, 4, 8380400, 1, 9, 13, 4, 4, 5, 8, 11, 8380416, 8380416, 8380409, 8380404, 8380407, 16, 4, 0, 11, 2, 8380408, 8380414, 4, 8380415, 2, 8380409, 12, 8380397, 8380406, 11, 8380412, 8380410, 8380415, 5, 1, 7, 8380397, 7, 7, 8380411, 8380416, 1, 8380416, 1, 1, 8380414, 15, 8380415, 8380410, 8380408, 8, 8380404, 8380399, 5, 2, 2, 10, 10, 8380412, 0, 16, 6, 8380406, 5, 8380412, 8380403, 8, 8380406, 5, 8380407, 0, 8380413, 8380405, 9, 4, 4, 8380404, 8380416, 10, 8380412, 8380412, 3, 8380411, 7, 4, 8380407, 4, 1, 12, 8380416, 1, 8380415, 9, 8380410, 5, 2, 14, 8380403, 8380410, 10, 7, 8380413, 8380413, 3, 2, 5, 6, 9, 2, 8380407, 1, 10, 8380414, 2, 8380413, 0, 5, 8380407, 8380411, 12, 11, 8380408, 8380415, 7, 8380396, 6, 11, 6, 6, 7, 8380411, 8380408, 4, 8380395, 3, 6, 8380402, 8380396, 9, 7, 4, 11, 16, 1, 8380412, 6, 0, 8380409, 1, 0, 6, 5], -[8380412, 8380412, 12, 2, 1, 8380416, 2, 6, 8, 8380416, 8380408, 20, 8380395, 2, 5, 11, 1, 2, 18, 8380416, 8380406, 8380411, 3, 8, 8380408, 0, 8380397, 15, 6, 8380408, 8380408, 8380409, 5, 8380408, 11, 14, 8, 7, 22, 2, 8380413, 1, 5, 8380410, 8380408, 11, 9, 8, 3, 0, 2, 6, 8380400, 8380410, 4, 4, 0, 2, 9, 3, 8380408, 8380399, 8380412, 3, 7, 12, 8380399, 5, 8380411, 8380406, 4, 4, 8380410, 11, 18, 8380401, 8380413, 7, 0, 2, 8, 6, 8380402, 8380414, 17, 8380412, 10, 2, 8380405, 12, 5, 0, 3, 8380412, 8380406, 3, 18, 2, 8380415, 7, 8, 3, 1, 8380416, 11, 5, 8380416, 8380409, 8380411, 8380404, 3, 8380416, 8380415, 15, 19, 8380416, 1, 8380414, 8380412, 1, 8, 8380409, 6, 8, 18, 10, 8380400, 8380407, 1, 8380414, 8380415, 17, 8380416, 15, 10, 0, 8380406, 8380410, 8380405, 8380403, 15, 8380414, 8380416, 4, 8380412, 8380413, 14, 0, 8380408, 8380414, 4, 0, 8380404, 8380408, 16, 1, 0, 8, 8, 9, 1, 1, 11, 17, 13, 9, 8380405, 4, 7, 1, 0, 0, 8380405, 8380415, 8380409, 8380405, 8380403, 6, 3, 4, 8380416, 10, 8, 8380408, 2, 8, 8380412, 8380416, 10, 1, 11, 29, 8380415, 1, 4, 8380411, 8380414, 3, 6, 11, 18, 2, 8380413, 1, 8380405, 8380397, 1, 8380405, 8380401, 9, 8380408, 8380410, 8380405, 8380412, 8380402, 8380414, 8, 13, 8380413, 8380413, 13, 4, 0, 3, 4, 1, 8380415, 4, 10, 8380413, 21, 25, 3, 8380409, 8380400, 8380393, 14, 8380409, 8380412, 1, 8, 8380407, 9, 8380409, 8380398, 2, 5, 14, 8380408, 21, 4, 6, 8380412, 8380413, 6, 3]] -cs2: [[21, 3, 4, 8380412, 1, 0, 8380401, 8380409, 5, 3, 16, 8, 2, 8380409, 8380415, 7, 8380412, 8380403, 8380411, 8380414, 5, 16, 8380413, 8380406, 8380413, 8380406, 6, 8380405, 8380412, 8, 9, 15, 7, 9, 8380414, 2, 6, 0, 8380410, 8380410, 3, 9, 11, 3, 8380416, 8, 4, 5, 4, 8380409, 7, 8380414, 8380410, 8380414, 6, 8380412, 8380409, 7, 8380409, 1, 6, 2, 8380413, 8380408, 12, 8380416, 2, 10, 13, 8380416, 8, 9, 8380411, 8380415, 8380409, 4, 8380416, 8380412, 8, 0, 0, 10, 5, 21, 8380416, 0, 17, 7, 8380409, 8380410, 8380414, 8380404, 8380412, 2, 8380413, 4, 19, 6, 8380416, 12, 2, 8380400, 3, 8380416, 3, 3, 2, 9, 4, 8380410, 0, 8380416, 8380406, 8380415, 0, 5, 14, 18, 13, 8380410, 3, 8380408, 8380405, 13, 0, 8380413, 9, 8380416, 19, 8380416, 8380410, 8380411, 7, 4, 8380411, 8380415, 4, 4, 21, 9, 5, 2, 8380403, 8380405, 8380405, 1, 6, 8380415, 8380415, 10, 8380414, 8380408, 8380407, 15, 8380408, 10, 13, 1, 8380416, 8380413, 4, 8380415, 3, 8380403, 13, 12, 6, 8380412, 8380415, 8380410, 8380403, 0, 5, 4, 8380410, 8380407, 8380413, 21, 7, 4, 6, 8380416, 8, 8380407, 8380409, 8380405, 1, 8380411, 8380414, 4, 0, 8, 4, 8, 8380407, 8380415, 9, 1, 3, 8, 1, 3, 2, 8, 8380409, 8380416, 8380415, 8380413, 8380412, 8380413, 2, 5, 5, 9, 8380411, 8380414, 8380407, 6, 8380405, 2, 8380413, 8380415, 11, 6, 2, 4, 12, 8380411, 4, 8380401, 8380407, 8380414, 8380407, 4, 4, 8380407, 8380413, 8380412, 8380415, 12, 10, 26, 8380411, 10, 2, 0, 8380413, 8380410, 4, 8380413, 8380412, 3, 0, 8380405, 8380412, 6], -[8380412, 3, 8380414, 8380409, 23, 8380416, 2, 5, 8380400, 8380408, 8380414, 8380409, 8380412, 3, 9, 8380413, 3, 8380414, 8380408, 8380413, 18, 8380402, 3, 2, 0, 8380406, 3, 8380409, 8380411, 8380410, 7, 8380416, 8380414, 8380412, 14, 10, 8380416, 2, 8380412, 4, 8380406, 8380416, 8380412, 8380409, 13, 8380415, 16, 4, 8380415, 8380410, 8380401, 8380415, 8380412, 1, 8380406, 9, 10, 17, 8380415, 0, 9, 10, 8380416, 8, 1, 8380412, 15, 8380403, 2, 8380414, 8380412, 8380413, 9, 6, 2, 2, 4, 8380416, 6, 7, 4, 8380416, 5, 17, 8380404, 10, 3, 8380406, 0, 17, 3, 8380413, 1, 8380416, 8380410, 10, 1, 18, 8380410, 8380409, 6, 3, 1, 8380411, 15, 8380414, 10, 10, 8380416, 8380407, 8380416, 0, 0, 14, 3, 16, 17, 7, 1, 8380410, 8380416, 8380413, 9, 9, 6, 8380410, 5, 6, 8, 18, 2, 8380406, 8380410, 0, 8380407, 2, 1, 8380412, 5, 8, 5, 8380407, 11, 3, 10, 4, 12, 8380413, 5, 14, 3, 7, 4, 8380406, 8380405, 8380413, 8380414, 9, 8380413, 3, 8380414, 8380413, 8380399, 3, 1, 8380405, 10, 8380410, 12, 8380416, 2, 8380403, 1, 1, 8380401, 8380415, 8380404, 8380414, 8380408, 12, 8380413, 5, 7, 7, 8380410, 8380414, 8380407, 8380397, 12, 5, 17, 8380407, 17, 8380404, 8380401, 5, 10, 8380412, 8380413, 11, 8380416, 8, 1, 8380409, 8380404, 8380411, 8380403, 8380413, 8380414, 8380405, 6, 1, 11, 8380405, 8380416, 16, 8380406, 8380398, 1, 10, 8380412, 4, 7, 19, 2, 8380401, 8380410, 3, 8380411, 8380404, 3, 8380409, 5, 8380415, 4, 16, 8380415, 8380409, 8380414, 8380415, 8380413, 2, 8380416, 8380414, 8380413, 1, 8380397, 1, 1, 8380406, 8380414, 11, 3, 8380408, 4, 10], -[8380415, 8380415, 11, 8380410, 8380407, 8380412, 15, 2, 3, 8380389, 8380414, 8380412, 12, 16, 0, 8380408, 8380416, 15, 8380411, 0, 13, 8380414, 8380405, 1, 8380416, 8380414, 9, 5, 8380411, 8380409, 8380405, 1, 0, 8380409, 11, 5, 8, 8380408, 3, 22, 7, 3, 8380416, 8380412, 7, 5, 8380412, 8380399, 8380412, 8380404, 12, 14, 10, 8380406, 8380398, 4, 9, 8380413, 8380409, 3, 8380414, 0, 1, 6, 8380414, 8380414, 8380413, 6, 3, 8380407, 0, 14, 10, 8380416, 8380416, 8380403, 8380409, 8380409, 5, 8380408, 8380416, 14, 8380412, 16, 10, 8380403, 8380399, 8380410, 16, 0, 2, 8380410, 7, 10, 8380413, 5, 8380407, 8380411, 8380415, 8380410, 8380415, 8380411, 0, 8380409, 8, 3, 8380416, 8380416, 8380416, 8380410, 0, 12, 8380407, 8380412, 8380404, 8380401, 8380405, 8380413, 8380410, 8380408, 8380416, 1, 8380415, 10, 8380414, 8380415, 9, 8, 7, 8380403, 8380411, 8380410, 8380398, 8380408, 8380408, 8380413, 8380411, 15, 8380407, 8380411, 8380412, 8380414, 8380409, 8, 8380408, 8380405, 8380406, 4, 8380410, 1, 15, 8380408, 8380404, 8380411, 8380410, 8380410, 8380407, 8380414, 12, 4, 8380403, 8380413, 8380403, 0, 8380404, 8380414, 7, 8380408, 6, 8380415, 4, 8380406, 8380412, 8380394, 1, 8380400, 8380409, 8, 9, 9, 4, 3, 8380407, 6, 8380407, 8380413, 8380406, 8380407, 8380411, 1, 0, 8380406, 17, 1, 8380415, 8380407, 5, 6, 1, 5, 8380400, 8380413, 8380412, 3, 8380414, 8380411, 5, 8380412, 2, 1, 8380409, 6, 8380415, 8380414, 6, 8380408, 8, 8380409, 11, 1, 8380416, 8380411, 8380412, 8380415, 8380415, 11, 8380406, 1, 12, 8380410, 8380407, 1, 8380413, 0, 3, 19, 6, 7, 4, 0, 8380409, 8380400, 8380404, 3, 4, 11, 1, 17, 8380413, 3, 5, 8380414, 8380411, 0, 2, 8380413], -[8380411, 8380415, 3, 8380410, 0, 7, 8380404, 5, 8380415, 4, 8380405, 8380412, 7, 6, 0, 0, 13, 14, 13, 8380409, 8380408, 8380411, 6, 8380411, 8380416, 14, 0, 8380411, 8380414, 10, 8380412, 8380408, 8380410, 9, 8380412, 8380404, 8380408, 8380416, 8380415, 8380412, 2, 8380414, 13, 8380415, 1, 8380415, 13, 6, 8, 8380413, 8380416, 8380409, 8380411, 16, 2, 8380406, 8380416, 6, 8380402, 3, 8380407, 8380409, 2, 8380404, 8, 8380405, 8380416, 2, 7, 8380406, 8380411, 8380407, 2, 5, 12, 1, 8380406, 11, 8380404, 8380415, 8380416, 8380401, 8380407, 8380414, 4, 5, 3, 8380413, 13, 8380411, 8380413, 8380406, 9, 6, 9, 8380411, 4, 8380410, 1, 7, 13, 2, 0, 8380413, 8380410, 8380415, 6, 2, 1, 8380405, 1, 8380403, 4, 8380411, 7, 3, 0, 8380401, 8380400, 8380398, 8380416, 7, 6, 3, 14, 9, 20, 6, 8380409, 4, 8380413, 13, 8380411, 8380408, 8380409, 3, 3, 8380403, 2, 8380411, 4, 8380413, 2, 8380414, 8380408, 8380406, 8380415, 8380415, 8380403, 8380412, 1, 8380415, 6, 4, 5, 8380416, 14, 3, 5, 8, 8380415, 1, 11, 8380414, 8380411, 8380394, 0, 8380405, 8380416, 8380414, 24, 10, 8380408, 5, 8380403, 14, 8380410, 19, 8380414, 7, 8380416, 8380410, 7, 19, 8380416, 3, 8380404, 8380398, 8380411, 8, 3, 2, 6, 8380411, 8380412, 8380404, 8380416, 8380415, 8380413, 6, 8380412, 5, 8380409, 1, 8380410, 2, 2, 2, 18, 6, 20, 8380415, 1, 2, 8380412, 8380409, 8380411, 8380413, 8380409, 8380415, 8380411, 11, 8380405, 5, 8380401, 0, 8380416, 8380405, 9, 10, 8380397, 1, 0, 4, 10, 12, 8380410, 8380399, 9, 10, 8, 1, 11, 10, 8380413, 3, 8380413, 8380396, 10, 21, 8380406, 8380414, 8380415, 8380412, 0, 21]] -z: [[8295564, 117772, 52679, 75663, 8330345, 98813, 99831, 96962, 1599, 8364123, 61120, 130657, 8319971, 8254003, 60091, 8367952, 8306626, 41677, 8289276, 8314594, 48047, 17565, 124605, 8268500, 26712, 8314823, 8269534, 8326760, 106652, 51241, 67794, 8352489, 8304588, 3629, 8343286, 99467, 8328191, 111917, 8330997, 119049, 80555, 44931, 8330947, 8292421, 8254006, 114182, 8261443, 8291263, 61793, 32692, 81772, 26492, 8357079, 122382, 118603, 8275326, 8360237, 8348702, 8294002, 8297667, 8310470, 8377826, 14162, 101932, 8315472, 8401, 8315142, 8355601, 8287424, 114251, 69102, 8286110, 8365307, 8283245, 8325583, 8262573, 124155, 67294, 8350140, 37728, 8301072, 115618, 8315652, 8250249, 35084, 8326320, 29891, 22326, 8256788, 11747, 8288350, 8375706, 8281578, 8286051, 8349598, 8321492, 74587, 8353419, 79213, 72848, 8360504, 8367219, 8270924, 55553, 8277386, 109593, 90332, 8251742, 3596, 8301820, 8278020, 8276550, 8367696, 8321145, 8374653, 57627, 8314753, 8251418, 32646, 8333173, 117847, 8321357, 81070, 3514, 8333963, 8265002, 8328040, 8362140, 65101, 51594, 122788, 92420, 8270538, 8275226, 66678, 13892, 8291945, 8311171, 32451, 52930, 8307790, 8391, 77309, 60834, 8264508, 8372210, 70785, 8330592, 8266979, 53696, 8250851, 52199, 8362415, 8370372, 53272, 90252, 26988, 31444, 8277308, 8325922, 128263, 112846, 8318724, 30124, 8278852, 8272118, 75207, 8259488, 73483, 8322296, 120931, 8327241, 8335758, 8345481, 8287091, 8300407, 8341698, 8296168, 35220, 62532, 8259968, 9360, 8303882, 90215, 14234, 26961, 9400, 8306798, 8357860, 79223, 8349405, 95218, 110597, 8316434, 8356763, 72065, 36832, 8354862, 8354982, 8256353, 2176, 119858, 39685, 102463, 8257971, 110518, 26681, 112148, 8362192, 8319626, 67280, 8327800, 103661, 120963, 21163, 7257, 8260334, 122734, 8261991, 42507, 8360890, 80765, 8258262, 8284346, 8269694, 54293, 4333, 119418, 26306, 8278370, 8334858, 63720, 8376351, 16442, 8361769, 58751, 8272872, 80234, 82969, 8340585, 8297370, 11937, 44513, 8341522, 114498, 88168, 8379060, 8262634, 8348210, 87424, 11765, 8273575, 20780, 49904, 8293885, 9389], -[8310088, 8291664, 8372495, 130883, 8362516, 8373288, 7540, 123618, 56063, 8380002, 8292311, 8378215, 56595, 69074, 8271242, 8268959, 8347210, 8318095, 34167, 8256743, 8376131, 8378900, 8320598, 8252827, 114733, 8380223, 42179, 8373615, 59221, 8347176, 122980, 8283928, 8289454, 118337, 8370172, 44512, 9369, 118472, 1425, 8371760, 100254, 88482, 8299021, 8379348, 52705, 8259134, 8298293, 106478, 67020, 8343506, 8336696, 8291962, 8281347, 8296748, 110414, 52995, 8366980, 8314339, 8273685, 113545, 27912, 128016, 8328903, 100419, 122793, 8279472, 8282529, 107053, 8303924, 14384, 8371468, 27233, 52814, 34484, 89496, 21892, 47282, 64286, 8334322, 8350140, 82174, 29773, 107074, 127535, 117612, 129745, 8302491, 8350585, 8346409, 8309964, 8306548, 8359471, 8253615, 8353571, 58220, 8287507, 8303992, 90871, 65190, 8319086, 8369197, 105036, 8301088, 8369306, 33140, 48912, 20537, 97684, 66849, 8373482, 51762, 8338563, 66052, 54047, 50727, 8374720, 62294, 37957, 111049, 8317978, 22496, 81195, 58777, 8344507, 8305568, 8277109, 116291, 75352, 83333, 8265409, 86272, 95596, 8277511, 8360685, 97182, 8256296, 8270803, 8293252, 8422, 8260681, 11657, 102117, 8365917, 121005, 128099, 8349488, 8321598, 116267, 52824, 8380402, 8341273, 8324915, 62505, 8346238, 8292467, 38302, 8312685, 123505, 27019, 83831, 8316200, 8370234, 9888, 20567, 8304050, 8350463, 12956, 8367528, 52954, 31021, 8342108, 107024, 8265716, 8299301, 6239, 88952, 117229, 68491, 109910, 73781, 90314, 8300704, 8344304, 8274932, 8283189, 24612, 8299368, 52416, 35620, 16965, 8333408, 113220, 28434, 107651, 8281751, 8295026, 8347911, 101712, 8379667, 126291, 66179, 85962, 8256773, 8262112, 104932, 60764, 8302549, 8325873, 22698, 8280857, 8287286, 8317596, 1760, 37773, 97135, 98429, 127423, 8331637, 8334619, 74759, 8369889, 8379806, 128903, 8315017, 65416, 81321, 8302456, 63708, 8259892, 9210, 8279431, 8364353, 28319, 8378902, 8315410, 26521, 8293369, 73175, 8372294, 98453, 35636, 117763, 8274616, 115569, 101314, 59783, 11015, 8314292, 8288004, 8257212, 8356596, 8375869, 8330554, 8293788, 8261807, 8340521], -[74243, 86139, 8266966, 129044, 8280858, 8340007, 97445, 81308, 8337354, 124511, 129172, 8339227, 8342182, 8284812, 8372813, 2385, 8263945, 8371207, 11186, 8327864, 8314064, 8326777, 111442, 77684, 8346211, 13619, 19636, 8298287, 80149, 8266130, 88522, 8331329, 114230, 8304823, 8290876, 92847, 8336447, 88857, 102995, 8253193, 3782, 8317124, 8371723, 107816, 8313470, 123058, 8250008, 93715, 20814, 96110, 20874, 109242, 8287360, 8327853, 3359, 8349187, 36941, 97669, 8251219, 8310783, 37974, 8254240, 8371505, 8306863, 24760, 56471, 20534, 8289038, 8353430, 105261, 8304597, 56731, 8312985, 8368050, 74386, 8308529, 95705, 8323073, 8255857, 8374147, 126557, 8249590, 39981, 94650, 78181, 8278510, 8268175, 8278039, 33106, 72468, 8308565, 8370193, 26004, 8370756, 8364112, 8323640, 98693, 107547, 12384, 3091, 49151, 8348631, 77804, 113978, 62728, 8305186, 8311669, 56414, 8319706, 34020, 48256, 8262210, 40923, 89138, 114361, 8295855, 43831, 8278853, 8278815, 8313527, 27883, 8364583, 116602, 8274688, 8291855, 14598, 8364447, 98762, 8349421, 8263734, 85565, 8303887, 112639, 8326151, 107781, 8374051, 8279457, 48944, 93967, 8297367, 8379023, 8330866, 113318, 8317372, 75657, 81859, 126471, 26894, 49261, 33533, 15935, 8329035, 9722, 8270653, 8346825, 20939, 30001, 8330125, 89955, 8354546, 6137, 8356061, 8298582, 8358098, 68118, 8309823, 8354205, 61514, 8292998, 17027, 68203, 130176, 8364168, 8345912, 8325771, 39911, 100516, 34341, 8376448, 8255291, 102809, 61776, 48241, 90155, 8355743, 8349866, 8274728, 56367, 81082, 126270, 8337520, 8373223, 8309056, 8335417, 8270778, 97371, 71179, 23223, 118211, 123950, 8362443, 8377268, 8270595, 8295115, 8350571, 8360374, 130197, 79848, 40706, 8330542, 31499, 27957, 8373825, 8300138, 8291636, 19383, 69893, 8345233, 493, 31595, 65838, 125773, 8361525, 8347606, 96046, 8301537, 8375462, 8311693, 100019, 8275524, 8377301, 8282920, 16966, 98028, 46260, 99634, 116105, 8265237, 8370938, 95305, 8301141, 43945, 8268539, 8255200, 120105, 8264140, 8376910, 8270656, 1420, 8348718, 96170, 8262836, 30021, 8265743, 78887, 45004], -[44776, 8251198, 115687, 8302133, 22801, 8267698, 8288017, 91294, 8329513, 83721, 97264, 22953, 57585, 104617, 102430, 8301287, 8280432, 8255339, 96149, 8340306, 8316701, 8346399, 117878, 8311805, 8336778, 8273624, 8363115, 8371999, 8371979, 8255825, 8351565, 8373458, 101722, 8347088, 122979, 8303108, 8362080, 75456, 8283311, 103259, 8303979, 107503, 68842, 8359801, 8290950, 8286939, 77577, 8262667, 37745, 60038, 8279984, 8323861, 8274722, 8375917, 51139, 84639, 113839, 8331161, 8269888, 123795, 47325, 129087, 8363063, 86517, 8375268, 29780, 8316924, 8373739, 8330353, 35275, 97138, 129310, 91944, 8298514, 65037, 40730, 104666, 85542, 8280768, 8323410, 92453, 8276803, 8327299, 8276946, 8366595, 33822, 101210, 8354094, 8299944, 121578, 61119, 113108, 8359459, 8276652, 106239, 8334014, 8252535, 8331895, 8300612, 8296592, 8359802, 37855, 122503, 8366326, 8336658, 104443, 51370, 49347, 15855, 26633, 91947, 8291243, 8350032, 8861, 8357148, 8316977, 129493, 8249740, 8356721, 126962, 93495, 8283352, 8285286, 8378757, 8282273, 90263, 8377744, 8295407, 8343605, 19905, 8296521, 8308531, 8267940, 8287234, 22613, 3853, 103124, 130446, 94124, 8278698, 81423, 8342290, 88266, 8332597, 20164, 8270578, 83924, 3169, 8347222, 4439, 25367, 8303654, 71747, 84729, 72610, 65019, 8251117, 120730, 8344677, 8378398, 8333242, 35983, 127276, 8280471, 8355539, 8322782, 32570, 8333410, 8363746, 30415, 33484, 70493, 21321, 8297644, 115803, 73573, 129232, 81652, 7758, 13425, 8319135, 89957, 8370303, 8351692, 8286537, 114941, 8276720, 91846, 8375501, 128060, 8359194, 9069, 8249647, 18926, 8254817, 102764, 8374144, 121588, 41037, 24948, 8348024, 8274886, 8271064, 37979, 8350903, 97555, 8379317, 8344268, 24735, 8254347, 32299, 71022, 8297427, 8336567, 4232, 8269955, 8330622, 8272461, 8317412, 49870, 8318227, 70217, 67574, 8328080, 24284, 34550, 60417, 72512, 98483, 38793, 58633, 129751, 89366, 8299189, 124000, 8286972, 8277128, 43629, 8302900, 3209, 41940, 8317117, 8338500, 8267589, 12128, 103593, 89120, 92242, 86139, 7996, 111893, 8334549, 14167, 51506, 8364004, 8332305]] -||z||: 130883, ||z|| check passed -r0: [[-46665, -75700, -82773, -7712, -20258, -24164, 28689, 88379, -57719, 77284, 84637, -54601, 76947, 71091, -73458, -82292, 89320, 85930, 15095, 60369, -75209, 76225, -4400, 73237, 832, 82800, 41101, -12371, 16292, 83090, -10894, -13307, 4257, -43994, -4251, 85027, -42546, 16331, 7258, -35691, -61875, -89993, -62717, 25767, -41781, -66450, -95148, 80618, 41843, -19287, 9719, -91138, -1633, 95123, 83909, -69821, -94441, -94270, -9331, 27369, -61155, -42788, -77562, 95121, 69808, 49540, -94082, -3256, -43968, -44203, 39363, -11929, -17890, 47260, -31299, -38998, -28230, 21813, -72174, -65406, 51615, -21335, 14617, -94694, -16559, 67554, -401, 67446, 67339, 87220, -62276, -89220, 81465, 17192, 53242, -69708, -16669, 64015, 53878, -87693, -70056, 82484, -47859, -79153, 25308, 46917, -45992, 60157, 14565, -94827, 25161, 21855, 56890, 57617, 89466, 21603, 86799, -21365, 33218, 4789, -44243, -40101, 46828, -23352, 16748, 6129, -21784, -59232, 61182, -8727, 40429, -90415, -95136, 92772, 17371, 46191, 29005, -10923, -72114, -65021, 18601, -72124, 195, 6365, 30949, 21445, 48343, 91125, 20383, -76007, 15595, -26403, -52582, 41760, 66547, 2060, 87866, -76006, -7530, 40069, 49532, 41382, -33875, 39041, -62576, 19886, -26273, 33782, 74058, 59434, 42318, -49638, 14491, 83563, -47558, 6757, -71973, 5973, 33772, -18214, 9880, 83603, 40648, 75036, -86341, -22448, -84359, 69954, 73755, 11101, -18279, -65653, -95058, 2455, -91886, -24914, 59944, -25223, 69024, -79537, -26001, -49280, 60364, -73365, 39782, -47631, -93801, -83581, 42365, 88772, 43022, 74935, 75127, -23889, -16301, -28054, -27613, 91686, -25278, 92513, 68704, -43845, -36199, 7307, -12360, -41067, 92751, 45128, -89812, -25707, 41415, -27339, 67109, 28246, 91235, 77905, -90280, 25357, 47046, 18313, -65282, 87429, 78105, 64066, -57500, -46996, 48569, 3775, 26651, -61274, 5222, 70950, 59994, -27514, 94991, -87853], -[-29828, 11563, -71281, 39716, 2972, -58070, 82575, 32793, -78151, -25779, -23585, -9662, -17430, 66929, 2090, 17823, 61059, -8527, -66335, 76428, -27194, -44325, -36626, -13835, 71610, -59854, -3961, -45570, -34582, 37828, -9449, 36749, -92211, 55043, -17469, 76666, -60069, -10180, -55176, 76648, 79165, 22048, -12025, 30313, 88643, 86118, -87785, -7666, 23160, 8799, -34435, -25634, 78102, 80354, -16564, -85715, -25911, 42499, 80872, 46179, 1276, 12925, 56345, -31668, -23643, 62535, 15211, -83455, 24675, -45182, 85295, -30725, -26520, 24999, -2812, 19942, 6529, 17097, -31060, -70257, 29307, -82173, -24059, 81478, -57267, -84594, -39135, -9630, -43521, -4371, -62698, -74373, -73204, 46900, 91722, 30565, 23930, 69401, 56321, 50409, 30673, 77778, -47222, -72509, -28190, 49170, -66777, 34179, -58106, 58175, -59414, 42007, 45859, -36629, 74773, 38069, 6348, -58451, 65462, 78606, -50034, 1128, 59062, -75910, -87089, 68384, -19753, 85351, -64685, -35547, -58885, -64341, 5085, -86894, -44200, -87208, -39582, -52044, 34762, 39745, 3803, -4400, -88093, 2987, -82341, -77847, 43070, 64193, 44964, 67108, -76381, 62931, 54025, -32776, -92277, -2966, 69522, 55241, 28626, -21214, 48275, -51668, 3940, -64539, 25476, -56266, 45255, -29463, 10136, -72706, -42296, 81671, -29627, -67216, 26278, -23811, 79196, 69731, -86807, -49695, 90240, 55107, 52880, -65253, 94037, 42911, -9161, -77839, 62861, 75834, 70933, -3485, 29270, -71620, 25693, 69483, -11080, 91942, 63514, -45241, 91769, 20903, -59771, -1177, 66191, 72974, -92077, -51930, 92594, -55849, 64581, 59819, -62495, -602, 63315, -69215, 42226, 38157, 33047, 35963, -3486, 10300, -63085, 32916, 65469, 76922, -56184, -51082, -65704, 85262, 40141, 70198, -36953, -27269, -13426, 77490, -39961, 48531, 80210, -53375, -47787, 56534, -86693, -81111, -23066, 34593, 14029, -77747, 29806, 30059, -89397, 55674, 5380, -57429, 35534, -88280], -[32996, 23165, -54560, 67441, 54193, -26041, -42086, 61599, 83766, -66906, -23456, 21784, 48541, 72415, 60708, 82555, 39287, -51728, 65756, -34719, 26485, 48146, -4373, -62755, 29851, 71074, 22249, -40437, -16396, 33895, -10291, -46540, 32904, 45750, -90501, 81645, 34178, 6227, 37168, 23024, 3399, -13203, -32466, 94661, 68825, 7095, 8091, 6187, 77938, 53367, -21343, -80791, -38628, -92088, -91358, 26070, 33978, 64190, 90640, -7597, 7286, -6585, 65383, 66760, -15252, -19208, 59739, -50077, -26821, 93447, -75043, 92885, -33473, -89407, -95181, -85108, 52055, 68529, -31200, 76072, -46602, -75595, 53511, -65962, 26735, 20183, 44252, -65105, -61743, -73151, 53944, -83047, 61146, -12305, -43275, 36484, 64184, 11605, 46602, -67870, 41631, 82938, -16849, -63858, 75552, -62398, 53127, 77439, 41832, 20416, -60642, 63916, -35214, -41282, -25108, 26909, 78228, -86057, 85316, -23676, -63672, -92636, -45765, -37249, -69104, 35268, 14495, 13200, -9901, -68201, 42363, 63876, -93458, 17321, 80702, -71151, 89201, 31417, 51814, 75757, 36627, -62344, 42170, -47275, -90913, -85541, 34256, 91967, -22520, 82949, 19466, 48959, -47699, -18585, 20455, -46228, 17438, 50923, 63628, -70001, -41290, -38680, 31293, 24150, -6960, -11244, -49408, 79757, -25183, 64675, -77879, -57629, 94288, -80001, 74216, -73543, 51976, 34750, -20212, 80399, 18390, -18967, -76281, 57974, -30497, -92679, 26445, -10695, -16651, 38595, 15386, -69624, -70155, -37314, 22895, -6264, -7922, -50251, 62552, -45106, -65995, 55377, -69255, -92397, 51529, -66076, 28230, 70894, -2481, -93875, 49788, 4363, 55799, -62865, -44474, 25342, -40971, -67694, 69402, -13555, 41055, 64314, -89838, 22799, -93569, -42422, -53510, 44854, 14745, -68992, 39299, -55702, 80834, 9010, 50511, 12520, -11554, -56787, 22408, -42968, -46190, -63476, -49305, 68661, 18373, 78184, -5371, 61830, 52584, -51500, -31076, -950, -70923, -78732, 78935, 21240], -[83038, -62666, 87473, 9900, 44285, 49008, -30415, -25471, -68350, -70417, -13054, -11884, 78531, 28529, -3086, -46220, 55590, -76104, -10254, -50898, 8656, -71808, 32073, -62799, 46591, -43350, 21703, 76283, 62363, 66026, -896, -83278, 39658, -70042, 78174, -19231, -41794, 23924, -83694, 44658, -6996, 15090, 61147, 42941, 94788, -18708, 86229, -93699, -33041, 80107, -67949, -59682, 60031, -3157, 89354, -74903, 91897, 25389, -14684, 45617, -26098, 21648, 93737, 62428, 35424, -86020, 58677, 91835, -71260, 91103, 60667, -86543, 71737, 5985, 50323, -51577, 82673, -38418, -93092, -77798, 16551, -5626, -28369, -89484, 50329, 71237, -90898, 84411, -53052, -9821, 59121, -41698, 91547, 35797, 265, 42045, -86552, -59994, 40656, 93444, -33935, -55498, -29574, -23883, 60366, 91262, 52826, 57454, -15536, 13482, -33775, -81209, -39884, -89532, 54146, 75355, 12648, -84133, -26144, 66559, 48813, 45109, 37995, 57505, -78697, 66096, -23195, -43400, 32268, 83359, -29908, 28877, 88063, 57576, -79694, 84537, -88191, -83281, -45881, 60547, 46007, 46994, -63802, -33802, 16538, -8533, 1343, 2151, -47917, 48984, -448, 54101, -89667, -73328, -34169, 69591, 77365, 70075, -38334, 35914, -36953, 77622, -87459, -82348, 87968, 77052, 21072, -70966, 77116, 9513, -53183, 78025, 66981, -9209, -19031, 92321, 19915, -38339, -71445, -36254, 58756, -71670, 90526, 15601, 89113, -52685, -45151, -54054, -19717, -56345, -86066, -54542, -43917, 18030, 58659, 61796, 17019, 41336, -25847, 4464, -34569, -67288, 23047, -40310, 64290, -29040, 63175, -77739, 41333, -70844, -4616, 71522, 32756, 11784, -33693, 35575, 67201, -81697, -26331, 84204, 15537, -32912, -36065, 74250, -21333, 4818, -30627, 57738, -52657, 49707, -62265, 5705, 66165, 27416, 59179, -73580, -3973, 46659, 84478, -13176, -4202, -88465, -77621, -72031, -41460, 10210, -74380, -87437, -54519, -87713, 66535, 51011, 29680, 1175, -90765, -61374]] -||r0||95181, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[97107, 89549, -44861, -2395, 27444, 25623, -46215, 44495, -48082, -17558, 102546, -65057, 114460, -88007, 124788, 5386, 101439, -45335, 45473, 83719, 34885, 97084, 92895, -6977, -83444, -27051, 69976, 100708, -126080, -29987, 42382, -112320, 10325, 38857, 53702, -28193, 84983, -104857, 36895, 4844, 115880, 70792, -29600, -114291, 32852, -61118, -6031, 102061, -115438, 58575, 41246, -118729, -16346, 81089, 29788, 45769, 88287, -22015, 84592, -55924, 128289, 108854, -96486, 125816, 123128, -68143, -125312, 31596, 99628, 79227, -28843, 100277, 29574, -64933, -125958, -66164, -120774, 11210, 11844, 110031, 89657, 27452, -3097, -121658, -17549, 32875, 78162, 95814, -89300, -20260, 109963, -32089, 842, -11136, -69104, -109450, -78406, 7743, -56713, -75237, -87378, 64860, 5593, 28887, 47243, 6982, -84220, 39768, -46819, -19382, 26210, -117638, -129163, -126877, -41107, -51984, -17660, 79102, -78408, 55659, -35081, -53491, -79141, -1593, -90809, 101022, -24848, -35983, 39781, 63188, -68780, 65463, 72164, -47463, -35019, -70321, -69698, 80592, 20924, 130245, 128796, 64900, -39116, 15745, -100659, 63436, -23484, 458, -68364, 117367, 82380, -35023, -54232, -111027, 15740, -25184, 95434, -117371, -70441, -31595, -1315, 69113, 91192, 121598, -12911, -111722, 69455, 111101, 39935, -60150, -12091, -54159, 120387, 129265, 61005, 56751, 106809, -101296, 41560, -57017, 20873, -89370, -109480, 127973, -8046, 92377, -111291, 7870, 107909, 7449, -29439, 90109, 38725, 42661, 122141, 101707, -57150, -51, -74377, 72447, 18482, 107256, -61938, 828, -3830, -45986, 112856, -54698, -99839, -97249, -61983, 53383, -98105, -106781, 117403, 97661, 71389, -90012, -7077, 49552, -15521, 97000, 97141, -82741, -43529, 121364, 47575, 118444, -2200, 371, -71622, 114894, -53865, 119895, -59353, -29918, -81338, 35753, 12726, -33878, -27319, 50092, 43013, -44676, 115922, 98493, 103687, 27075, -8476, 60560, -6377, -123397, -66489, 51456, 21663, -63383], -[107075, 125330, 96677, 105024, 77134, 54029, 37194, -68692, 125586, -121396, 67591, 13815, 38050, 95115, 1028, -31030, -23633, 73287, -127676, 71586, -111408, 89761, -85513, -104182, -32028, -80017, 90342, 35844, -23074, -23484, -123668, -42834, -65831, 115370, 7734, -74607, 37979, -120961, 49770, 100857, -78557, -63080, -39593, -130657, 11777, -14906, -122822, 67496, -44929, 44794, -62842, -123152, 64385, -76911, -31236, -2257, -8384, 49244, -101800, -93360, -47387, -128169, -50191, -34136, 98139, 69796, -14635, -25692, -87153, 128604, -100914, 12396, -51596, -19715, 97888, -33947, -7106, -106483, -91056, -86065, 55335, -34397, -18260, -82082, -122600, -90378, -7133, -105867, 108123, -17202, -131021, 14310, -63805, -54715, 112322, -89281, -124758, -108067, 78134, -111112, 12342, -84546, -123959, 61225, 70787, -113357, 6798, -115278, 79016, -56348, -106309, -98813, 21635, 34055, 98693, -122331, 65210, 18545, -80768, -43434, 55459, -68678, 71175, 124564, -85375, 90100, -14468, 64953, -17202, -125157, 96515, -58919, -117888, 28044, -110655, 41237, -124424, -16624, 67587, 65510, 122333, 809, -56531, -124098, -127133, 28725, -42903, -44459, 52723, -118693, -781, 60416, -128553, 41075, -59895, 88473, 116472, 114864, 27518, -55550, -21597, -24248, 17494, 61528, -11612, 83616, -106559, 100130, 21472, 30190, 43214, -76894, 130770, 34135, 82100, 27403, 81855, -112413, -53843, 41625, -91082, -77382, -126774, 68075, 49061, 24513, -7113, 111266, 124701, -55196, -87643, -91399, 13978, 59736, 88856, -48668, 59396, -122296, 1300, 13632, 757, -60838, 18961, 104877, -91328, 4825, -87398, -102011, 33801, -46540, 109406, -60032, -70429, -9665, -11383, 34478, 13848, -124541, 53430, 114050, -71712, 59543, 64048, -106254, -104953, -129262, 5889, 86257, 61088, 81359, -16260, 78544, 94416, -53724, 44243, 17100, -29738, 129894, -115489, -26739, -25325, -75106, -42724, 45539, 87054, 78627, 31304, -31665, -124610, 79652, -58845, -47367, 61265, 97754, -16253, -115742], -[118604, 36709, 37210, 33694, 34107, 104257, -64278, 18644, -114645, -112013, -71412, 5455, -67113, -118112, -26569, 51773, 9003, 75556, 100522, -128920, -110525, -128954, -60995, 57664, -10418, -53894, -122556, 64093, 20544, 13629, -63153, 95271, -121277, 48096, -74803, -18796, 67544, -6070, 41768, -89975, 21295, -118613, 13311, 68659, -120228, 3901, 36402, 16893, 83694, -122727, 36280, -95566, 47831, -74779, 23392, 42479, 9110, 47538, -11168, 1062, 47538, 25238, 96194, 128226, -116901, -126602, 127405, -50726, -74532, -72764, 72690, 48111, -34163, 84267, 33402, 16096, -45827, -9309, -52995, -24450, 8332, 84270, 87827, 76424, -57941, 40489, -100930, -85898, 106466, -5843, -119638, 109107, 7457, -77359, -17221, 66963, -9547, -63131, -103598, 83037, -17095, 9706, -1579, -57013, 65978, 94725, 119910, 92552, 5382, -93400, -92363, -116497, -4040, -40815, -76805, -22796, 57406, -127274, 30651, 44139, 9989, 129970, -67622, 87664, -57379, 1530, 38952, 118036, -106340, 22982, -72680, 87875, -37737, -34782, -117562, 67015, -91654, 56292, 66817, 114513, 61794, -116000, 94768, 65482, -105059, 17458, -81295, 109598, 36354, 44425, -930, 28250, -55151, 35979, 63706, -93620, 70365, 39812, -3998, -114163, 2084, 48195, -70495, -32322, -35127, -85269, 126180, -113394, 15764, 51126, 17150, -43654, 44978, 70807, -47977, 35162, 114301, -130848, -126464, -47406, 36760, 92615, 96093, 115048, -119906, 39365, 74017, -38248, 79710, -122381, 80789, 56868, 113486, 13515, 13908, -88674, -18216, 121216, -82712, -23445, -93916, 16895, 53068, -41283, -61768, -9740, 120743, 8774, -16032, 53824, -62338, 71290, -14387, 121301, 117421, -12988, 101971, -108780, -123265, 56253, -76158, 14661, -83597, 117469, 106656, 99565, 24440, 105297, 118664, 41720, 10479, 121469, -26661, 31420, 125493, 6116, 110036, 72513, -127414, -33083, 62400, 32149, 80627, -86126, 16125, 18930, -68326, -130382, -113911, -49354, -130196, -72808, 114210, -51778, -121610, -72526], -[90399, -100349, -126756, -9096, -19780, 59139, 48247, 96008, 50372, -38623, 128829, -92641, 41090, -85128, -25460, 78299, 77773, -57629, -9158, -118108, -63544, -78902, 108077, -121272, -42417, 63975, 71812, 44068, 66851, 94271, 69896, 59679, -3467, -45927, 17681, 77275, -20094, -101716, 20857, -95339, 48743, -27117, 59379, 59307, 71867, 73115, 114906, -17720, 37786, 52211, 79841, 116215, 23445, 81295, -128671, 24624, 3433, -10580, -65742, -13758, 68167, 39565, 121990, -126995, -81050, -81974, -100124, 57317, -105967, 29520, -5623, 80281, -108741, -38072, 69124, 70160, -95388, -12869, -98520, 24266, 86184, -125997, 30348, 95016, -42723, -2977, -39321, 100001, -19007, -56334, -69788, 9557, -19358, -98007, 55823, 51630, 106451, -46934, -98332, 52097, 26883, -112151, 34476, 87491, 82529, -85435, -58178, -18210, -125882, 86856, -2287, -88885, 81452, 64044, 24466, -49161, 32654, -71917, -43040, 34057, -49303, -38440, 22394, 3484, -70685, 61988, -129854, -91688, -32586, 73318, 104584, -122849, 40333, 58113, 14373, 96019, 38329, 32766, 114195, -41745, 60480, 46625, 90633, -109716, -129142, -25964, 124690, 86758, -3284, -91570, -30563, 534, -100938, -107761, 16286, -72851, -117765, -68142, -59575, -2020, -53894, -31394, 60276, -67778, 112570, 58439, 76957, -5894, 23714, -101472, 100202, 43611, 23067, -11262, -46269, 126236, -13013, 66977, 36933, 62292, 53287, -50785, -31994, 116453, 61716, -80305, 87817, 18405, -38236, 57457, 94048, 130611, -3125, -20350, -94328, -17549, -113918, -86797, -121374, 99182, -38146, -112263, -4955, 6642, -205, 70255, 2752, 88904, -61212, -91271, 60163, 81675, 44001, -7321, -44361, 122695, 102378, -7706, -116955, -99756, 35316, 46229, 126799, 3666, -8310, -92609, -19430, 67368, -49928, 58458, 48523, 130607, 13417, 109076, -117757, -23040, -12079, 90768, -41110, 73082, -45107, 125396, -113157, -81385, 9924, 122258, -47949, -93931, 98397, -45246, 7432, -40233, 88742, 41856, 24848, -46528]] -NTT(y): [[5843, 4599570, 7088519, 8026103, 1852481, 3661398, 8191076, 3008569, 3799278, 6020499, 6822463, 6858400, 1755416, 5661033, 2815278, 68944, 4937286, 1777829, 7805811, 7894388, 7714177, 1902851, 5430661, 7449896, 5082834, 7913201, 4723604, 1241589, 3079470, 3459197, 6900625, 6721090, 1108201, 4631021, 999197, 6874828, 2245952, 7169580, 1064999, 3732194, 1077241, 2545523, 5140633, 5917133, 5274937, 5692104, 2778845, 4291400, 829625, 4831573, 5999340, 1671984, 5851905, 2122306, 7904674, 7893278, 2277788, 7435197, 5080427, 6211388, 6840727, 2776248, 6411311, 7911230, 8271984, 2692685, 4021795, 930238, 1791815, 2590039, 5984020, 4709841, 4958325, 434301, 7408443, 6111468, 2139284, 6430632, 814532, 5538383, 3075719, 4966757, 3401118, 8184884, 300982, 5464397, 8241746, 1777046, 2726594, 1324589, 2606494, 3868096, 5704100, 7368068, 1797753, 960796, 5355826, 2032280, 135779, 2161369, 1885254, 7891530, 5747639, 3562686, 1052933, 6485351, 3880193, 5853441, 4535169, 2357561, 2779110, 2819157, 5793787, 3995257, 6026220, 7370399, 6941872, 7690882, 1290118, 4368235, 2603425, 4007945, 1917984, 4788256, 7486973, 2788875, 1151249, 6552088, 285837, 5426312, 3670288, 5971094, 1372115, 4152521, 1095048, 4792974, 956345, 362422, 1284999, 3287661, 6078537, 8603, 3308587, 5851638, 3194481, 6440632, 4046653, 5356672, 2729966, 4855796, 776851, 1540869, 1693825, 6694398, 841697, 3558441, 6175937, 1455442, 1722800, 4921877, 6852026, 1875832, 4964122, 4094442, 7453403, 83739, 4491975, 1949041, 2413598, 806643, 4485709, 2494022, 386422, 4860131, 499905, 7222241, 5451802, 6160140, 454616, 7613123, 4485164, 3535745, 4442802, 3336798, 5726261, 2338032, 2370916, 1853431, 7369518, 3910888, 2597632, 2319859, 3052418, 4702940, 4436586, 3101213, 204867, 5971699, 3351374, 4333788, 4687327, 8337999, 1556870, 1685075, 2691930, 2205826, 4760088, 7153717, 1055251, 3317753, 5119666, 2275560, 1213735, 656284, 1233277, 1890744, 8327533, 8229183, 5870671, 5963318, 7841409, 6718235, 7070250, 866818, 5857100, 1574568, 8250116, 6077839, 4370951, 3095219, 3106747, 3451945, 6939369, 3862660, 6407959, 5467724, 8351, 4401855, 5968675, 5909118, 7886178, 1380318, 7728422, 2096074, 7326236, 1336256, 5507377, 6608347, 513002, 8150753, 6238032, 1279408, 52253, 5877467, 5646004, 3811725], -[86422, 4319701, 1273953, 6086381, 1200864, 3127589, 8301271, 103977, 2398092, 4218276, 4960439, 6051759, 8125359, 6245240, 120950, 1989522, 5180837, 6075914, 1568536, 6537394, 5465224, 1946938, 7407373, 6856847, 4511341, 2347683, 4497551, 7026669, 2958953, 3837673, 2362422, 4388106, 6193414, 5387376, 60763, 1004250, 6279008, 7271719, 2297029, 3379284, 5999006, 1679236, 1217669, 559118, 4507124, 7306976, 5663025, 4389784, 5952382, 4618543, 4073784, 8327714, 2930813, 1655206, 3672967, 4100839, 3108095, 185504, 7110558, 880386, 7612409, 4592444, 8246341, 5593039, 468036, 6986581, 3984379, 7926968, 6813642, 58641, 6550561, 5631784, 3431182, 2087022, 1645552, 7395091, 8187768, 1772521, 3693025, 7013893, 2305392, 7225239, 2476198, 2510041, 7145373, 3764119, 1645729, 7786729, 1134580, 5388190, 5644416, 3427686, 4626073, 8200164, 3789059, 795439, 4578418, 7438039, 1693895, 4525507, 2772093, 373313, 1403278, 120454, 6188907, 622829, 8006075, 6258700, 6031591, 3072049, 7208799, 3301459, 2896685, 5104449, 5748095, 6730171, 7928074, 7837007, 1599742, 3324183, 2344362, 8214254, 8199334, 5908652, 1529412, 1963081, 18058, 4631557, 4475500, 4244160, 6492483, 7380704, 2825664, 2006130, 8311045, 2959949, 93298, 1135216, 4324905, 8370648, 2428054, 5294130, 5784502, 5521531, 6481661, 836976, 1938659, 1097493, 3955951, 3821728, 2284316, 534190, 7948707, 5450189, 128859, 7799322, 5566184, 6683073, 2285493, 5435102, 4898377, 2047131, 215504, 7803618, 3719719, 3044236, 3643478, 1290960, 1834648, 533357, 6342509, 823274, 141405, 4765653, 8285273, 6649099, 1635479, 2585302, 6215650, 3721180, 8266503, 7337608, 6107689, 3674311, 108362, 1489286, 2145206, 6057372, 5683294, 4804847, 125576, 1664682, 6491892, 5193438, 7800796, 5553882, 5841353, 1114311, 2804335, 1328656, 3487054, 1120496, 1365684, 3214305, 4702529, 4110786, 8165326, 3867579, 5348904, 4611278, 5548162, 6717564, 5368009, 917703, 7744663, 449363, 1257091, 3538502, 7385252, 3003646, 6254939, 210720, 1734291, 4710890, 7017828, 3977436, 5693617, 2774720, 4158403, 5176566, 1040964, 872184, 5904717, 4397333, 5699405, 3511925, 4516286, 2141682, 1673790, 1565072, 6352923, 3110230, 7509007, 1244992, 7614631, 6426623, 2998299, 1128619, 7316046, 4548941, 2188535, 8201912, 3316999, 4941469, 5995486, 4527803], -[835873, 7812070, 1969768, 6070802, 7455762, 3510048, 4036666, 4996159, 4281095, 7160490, 4294568, 7029865, 6858825, 5247936, 4041547, 4463356, 3796755, 6940744, 2780739, 1818401, 5777105, 5657353, 4857586, 2815100, 2277617, 699154, 6606997, 3708975, 1120302, 6941215, 3852023, 1107770, 6371374, 2668083, 1378618, 4038351, 3740143, 2588342, 2169911, 5821715, 6119069, 8270621, 4191205, 8039737, 4524800, 5350533, 5811381, 5749121, 4943149, 6213371, 6439337, 6335143, 4195890, 399379, 6741257, 3428459, 4134133, 7118180, 7191844, 917999, 5311250, 4021969, 1218907, 3119095, 6752760, 8002802, 610931, 6867327, 3333635, 7617620, 8274747, 3445717, 944722, 5978530, 6794401, 2183978, 6373404, 6577504, 2525078, 1723725, 228422, 5253924, 6832609, 6773564, 4199398, 79718, 966133, 4075272, 4348280, 2809420, 4470131, 5887640, 4600944, 5420658, 4581719, 645476, 1184335, 1380505, 150605, 312097, 5347125, 1826393, 4627636, 1332994, 7734066, 7947022, 445763, 7970566, 1202924, 4919523, 2265075, 1646263, 4035572, 2259568, 7363413, 2526092, 4861363, 637800, 192671, 2623694, 289250, 6088838, 674918, 2472954, 3586977, 677379, 3532799, 1569883, 542972, 163962, 7535572, 4351934, 7013511, 2994362, 7351423, 2786619, 4500734, 3737034, 1903708, 4720034, 871063, 7175636, 4846921, 6837206, 7055873, 1652010, 6415336, 3791157, 7155264, 8295673, 2186219, 3164147, 87376, 2742152, 8056795, 2119776, 8311972, 4005148, 6171948, 4887256, 8103610, 2389717, 1383856, 6358586, 6486141, 5604022, 285688, 3347670, 4357173, 7341173, 1567798, 2429538, 6113502, 4951433, 3155733, 1929610, 5623314, 3306480, 6165109, 4112568, 8168340, 686471, 369853, 8175181, 7694550, 2418636, 8078459, 3410733, 1968151, 579140, 5194100, 2509076, 3405191, 314041, 2149075, 714188, 5452479, 1816541, 5928804, 2182734, 6582485, 3225490, 6060585, 222966, 2630928, 995190, 5103560, 62826, 4223504, 483293, 5884938, 6968099, 1099848, 1676243, 911537, 7223142, 962973, 2430073, 6552501, 2570608, 7585670, 4894811, 5774148, 3523012, 2315038, 8173419, 5291341, 954832, 2771795, 1556118, 3280489, 2624175, 5801436, 3092797, 1505446, 6823222, 6491708, 212362, 4036492, 6845778, 4316626, 6731375, 4309777, 3361505, 4896858, 2528519, 1378613, 6576194, 4735490, 4561679, 3830983, 1384762, 4014730, 8117499, 370552, 3562083], -[1478978, 6820865, 7335961, 2530722, 7985107, 6369229, 4331347, 3666406, 6966558, 6127326, 5938101, 5416577, 5982901, 3364499, 1055286, 7544712, 4391714, 724727, 7278553, 1461933, 5110743, 6059907, 3729963, 4439737, 8131624, 928468, 5560572, 8307808, 5239582, 7334211, 4975598, 2667345, 3051249, 2514513, 3939570, 5512793, 1100107, 2062910, 7228339, 287161, 6050788, 6970151, 778589, 4258838, 5873847, 4719723, 6434069, 6202730, 4142089, 606498, 6205926, 6464799, 5086498, 672265, 7017529, 4327909, 3563809, 1487139, 4759581, 4693614, 4604754, 3593858, 6535563, 6474302, 7427883, 1692464, 1945432, 7857435, 2336715, 5455037, 4221505, 619654, 5324892, 1152662, 8312960, 7848950, 761760, 3140046, 7193026, 243146, 1275009, 4723662, 7380218, 5891742, 4301273, 2520968, 6699156, 3358218, 1945928, 7939961, 1210512, 1983536, 4416010, 2236593, 5823954, 1930635, 7583673, 7783446, 7469367, 8082253, 4534000, 7481580, 7228569, 838391, 4740194, 6151573, 435708, 1281645, 6894067, 2147086, 3961460, 4610754, 5659403, 2629044, 6434503, 1150226, 1745339, 3460410, 7286278, 4005985, 3755498, 7177069, 5702016, 2887004, 3758162, 7033976, 7956548, 4979914, 4034367, 4812607, 7003726, 8200824, 3456872, 7829941, 4761555, 5776291, 4585968, 1717669, 2752355, 1810951, 7756062, 408940, 2451956, 905989, 4090866, 6260569, 6106627, 8039288, 2583155, 3676843, 2125258, 2271724, 4021050, 4309755, 137908, 4195283, 6947052, 7403334, 378320, 4529055, 3336457, 1079917, 6940937, 949355, 7471432, 1153282, 5265442, 2987119, 5588748, 2545338, 6245752, 9759, 1742359, 880130, 6288229, 1228474, 6833602, 4216552, 3335436, 4096267, 6359683, 1767549, 5117759, 1234585, 2615818, 1288726, 658180, 3753997, 5261265, 2513282, 2403747, 7530493, 1213454, 8345936, 4617790, 5850756, 6542731, 7142220, 6709761, 2130296, 4154138, 7329926, 1985151, 3282440, 6398316, 7372680, 6507513, 2215324, 5667579, 5060593, 3995550, 2704699, 664959, 462996, 7437148, 7325068, 7737942, 4225635, 687608, 5046390, 4830344, 7334678, 7010250, 2985838, 1908064, 2903922, 7612351, 3711923, 7337575, 3246095, 4995316, 2227719, 3576890, 4092758, 1336822, 4689123, 3604519, 5218548, 7551181, 2796811, 6428169, 3419394, 3672818, 3945061, 5092616, 5070394, 781029, 7864262, 8055098, 1323545, 2026071, 4674021, 1279717, 3463328, 6986797, 4572641]] -aHat * NTT(y): [[4946737, 845782, 1559526, 8335667, 3407129, 4933664, 2761395, 6672771, 874466, 5867726, 2523764, 2765908, 3497667, 1539861, 7683077, 4722136, 6858841, 7211166, 3562719, 2882723, 6248910, 472321, 6670792, 1913046, 3856250, 5929995, 150807, 4736183, 5352223, 6723871, 2280633, 1561864, 2100896, 519135, 915066, 6843621, 2357894, 2929465, 4320527, 5276221, 6656497, 1873276, 3201035, 6849237, 7994573, 5745780, 4114676, 7622475, 1777318, 4368203, 5465261, 5613018, 5497636, 7136683, 795994, 2777378, 4588710, 5493003, 2996020, 1789223, 5955445, 2576807, 3938630, 7010195, 5076035, 3997168, 4983322, 7905237, 6417185, 7999271, 8006, 6761598, 5505574, 4260583, 6600774, 7830212, 5882870, 4771662, 4790878, 5254779, 4755870, 4467430, 6282857, 1779331, 7325943, 4266007, 3824501, 5168151, 7252459, 408600, 6553433, 7033739, 7107435, 2774113, 2090424, 8346081, 4070443, 6590615, 5388604, 2972163, 3176509, 3575050, 871073, 5171238, 6034564, 3173694, 3054140, 5619210, 1171631, 4896615, 4342768, 220191, 3792269, 2156196, 2842568, 1935021, 5328539, 3866114, 1769682, 5588814, 7732816, 2231250, 1632133, 6950883, 1902644, 5930521, 1293356, 2097873, 3530525, 5401087, 1729109, 4613127, 7076361, 5684740, 7253529, 5680583, 3066257, 8344958, 922463, 1131181, 2999254, 1907012, 7416375, 3620789, 7163258, 623893, 4532111, 2647565, 4104861, 1740964, 1784912, 4987996, 6356033, 6193247, 5443522, 7079401, 5526497, 4705707, 7620683, 2526306, 6322050, 1663724, 4054203, 2120567, 6810554, 6942048, 522200, 3996688, 1460005, 15384, 2205386, 7786965, 5460260, 6981979, 1671354, 963357, 4074913, 8373224, 6492471, 6133984, 2739653, 6573893, 8075045, 7403250, 4169618, 2401844, 1217765, 8330038, 8378862, 2693721, 170122, 7696923, 7185482, 8119334, 4096712, 7291634, 1565455, 8216957, 5353402, 568336, 5869384, 6848083, 3374591, 2570617, 3629696, 2411900, 4859814, 4266005, 8278792, 7909137, 846162, 7877092, 2068332, 3047397, 5423389, 2102968, 7912992, 3718370, 5170029, 3274728, 4049041, 4062950, 7705442, 7734371, 3297273, 2155931, 6230075, 7956930, 2222954, 3044967, 89727, 4209169, 3349491, 7699952, 6359710, 7499918, 4995913, 7890109, 1591660, 2518401, 3943964, 6759184, 4756583, 3933237, 5566099, 5661894, 3326897, 3931476, 4373550, 6670646, 4977688, 1364389, 904723, 4386915, 5404205, 4442927], -[4605573, 2679427, 404012, 940066, 7637740, 1676227, 8084888, 3114169, 3976338, 1837544, 6231970, 6809652, 5463009, 6552581, 7829199, 7872777, 2983464, 3745627, 4392380, 3260364, 5984447, 6310103, 25878, 5878602, 1611835, 302380, 6910738, 8291423, 5789053, 5567456, 2665928, 6285164, 3472623, 4047396, 5817581, 8208680, 2081328, 405923, 7293143, 5609163, 4480725, 348652, 6935773, 3050572, 3257350, 846460, 706464, 5856077, 7629322, 3931963, 4815280, 8246688, 3747869, 8174101, 5205605, 3762498, 1307410, 1669129, 8038819, 2242360, 6815286, 3363459, 7314151, 7895811, 7761114, 1556415, 5243600, 5916542, 5435897, 576686, 8377882, 1543223, 6324508, 1832615, 2861404, 2014642, 3729254, 4139714, 4762771, 512045, 1038650, 744704, 6999505, 2668091, 1154531, 4583498, 2668264, 5438274, 1850982, 3240209, 3137392, 2052939, 1068718, 4867194, 3935809, 4869932, 470012, 7971616, 861606, 8141753, 2288658, 6826841, 6047961, 5365742, 1289312, 2537382, 5578627, 2932958, 7859280, 7243814, 3535084, 6739933, 7408914, 2233174, 517600, 7763076, 5161271, 4336390, 3736060, 1492836, 1304989, 8018531, 379168, 1539566, 2173612, 7475695, 6449565, 6599613, 7289685, 6125742, 3019422, 8038365, 5965519, 7697724, 3855485, 1500066, 40604, 5096865, 350563, 6359868, 4645571, 3937179, 6293248, 5732, 98370, 6588688, 2238215, 65125, 2470729, 8047910, 1695641, 5214471, 477813, 8006061, 4310506, 3277061, 2986716, 45492, 1637634, 5108691, 4760999, 7477987, 7791377, 5020050, 8281116, 1814548, 7799067, 1704337, 965011, 4272536, 4789569, 4390419, 2262768, 1061807, 7109018, 7278124, 6150614, 6480795, 4806144, 6730121, 236271, 6518161, 3997046, 1747996, 478128, 5956741, 7983358, 6912763, 5285898, 2920856, 991038, 4499848, 2376557, 3201092, 3029652, 3630729, 8187225, 7092757, 4433094, 831351, 5498766, 5866574, 3226576, 1925554, 5488555, 3193472, 1765031, 2659775, 2282062, 1260713, 1121511, 1365608, 3703262, 7744698, 5723891, 8077107, 7038760, 5571545, 3069108, 4850788, 318259, 1733410, 2406975, 8147430, 3096957, 8264233, 7216013, 6232052, 7041771, 4181490, 4852431, 1534923, 6604805, 3643599, 7725204, 3168227, 2591147, 2330103, 5823858, 3905266, 8135540, 2578399, 3567196, 799464, 4537184, 2492132, 4915372, 5418210, 50258, 5740322, 624675, 8030501, 4943890, 7613123, 7663494, 4451057], -[4292202, 7593859, 3868132, 380359, 7822885, 4608081, 7271579, 1375398, 836745, 4768796, 1978798, 7726269, 7608348, 314974, 2620810, 5013315, 1286845, 6194002, 2854092, 7765993, 809776, 3399176, 4237226, 6944250, 351271, 1329803, 807268, 7791231, 58545, 8041121, 6750574, 5781911, 5444423, 2101838, 4372463, 1777129, 3925462, 17424, 4668402, 1421752, 1021449, 6844194, 79079, 4649894, 6458774, 3696156, 6922562, 7111504, 3943902, 2310979, 5660779, 3448602, 6375417, 1594768, 2660191, 4418677, 4282990, 3376601, 5187418, 5823797, 2528814, 5588709, 5836485, 1464396, 4925654, 5023658, 4753890, 6590526, 7753374, 4215882, 7875656, 8179046, 4576755, 2302608, 1286914, 2167290, 2533904, 4685867, 4330099, 4021864, 3882933, 4010918, 7733958, 2827138, 1724888, 6132262, 3139321, 7580636, 787952, 2877526, 4827230, 5730584, 91364, 4446852, 4692501, 4392020, 6520186, 8326580, 2868, 3194118, 4247924, 5309565, 6185391, 2760744, 6677923, 2995590, 1551156, 4325302, 4336376, 7419080, 7885904, 3595355, 2905007, 3375623, 6376573, 1478234, 381943, 694281, 8010319, 6398546, 215234, 1055561, 3118602, 3062797, 151838, 4868577, 2371589, 1774965, 4698953, 7521752, 8066722, 4665959, 7023672, 6660962, 6505657, 6369767, 3988318, 632119, 5936041, 2883484, 2795090, 762373, 4316812, 4337691, 655846, 5686431, 7190697, 2613088, 5268816, 4589451, 1712184, 7732705, 471524, 2112644, 5544741, 598453, 2143891, 3968274, 1730932, 2435258, 2923592, 2435438, 7376510, 4217051, 6323223, 3779551, 721124, 5322193, 5899451, 766975, 6224397, 1438153, 4830321, 5040374, 1777152, 5118493, 4465519, 2307415, 2385551, 5800857, 90523, 4958736, 7377765, 2636478, 1722496, 7891837, 5533398, 5180269, 4662317, 2567031, 674980, 4317868, 6901778, 6654970, 3035201, 2169447, 3305997, 404079, 2362294, 3384682, 1468511, 4909800, 7696188, 6765414, 7301388, 3578462, 2533558, 2103976, 6836696, 6660432, 3115074, 967760, 6529589, 4106369, 3126983, 1570339, 7927499, 73241, 4161622, 3719494, 7417306, 3368542, 5037501, 2029119, 370672, 1592487, 7402769, 7055305, 3235499, 6555422, 1898657, 7396884, 3392703, 3968549, 3354854, 6687486, 7690991, 1592373, 8185725, 6616707, 8267547, 5356409, 3548333, 5447068, 2522019, 5053453, 2922624, 4603880, 6165346, 1682944, 4266643, 3221254, 6365164, 4211064, 6602062, 3627170], -[7097686, 5772172, 6321052, 3182582, 2110808, 860712, 6342209, 3216935, 4552338, 7648132, 3722804, 7803937, 3322249, 7607882, 3558076, 6326921, 6987016, 6254754, 7647570, 916542, 1222659, 5180066, 1462187, 7802405, 6562971, 5766078, 6590127, 2071076, 5644663, 3976799, 7395324, 4975070, 749347, 8013155, 5923698, 670011, 2984406, 163922, 4014024, 7416564, 1642509, 969215, 2360124, 6241495, 4298391, 4676157, 3686862, 6143857, 139607, 4065974, 1763406, 1639291, 5773961, 3241857, 331897, 4105943, 2642046, 5906633, 3972259, 4596620, 3703035, 6150575, 6665667, 1662674, 5611311, 4524744, 6261287, 7921600, 7407567, 614634, 268561, 4132726, 678656, 7726286, 840390, 1119872, 8270596, 1605901, 2591106, 3133776, 1658405, 3603409, 4346562, 6627060, 730596, 1775419, 7925123, 2719727, 7952386, 3534818, 373762, 4502967, 4443246, 5725809, 6730197, 7116943, 1189537, 6988535, 1216383, 4152184, 3378886, 445729, 1143909, 6507746, 3684813, 7585845, 3787975, 7432763, 1690595, 3406820, 1661260, 284538, 8373747, 1750689, 6071302, 6466070, 3481084, 7368442, 3766632, 7276783, 487766, 7562205, 3393553, 5721166, 5245866, 7380968, 5100882, 2583462, 4704416, 7676351, 554762, 7270111, 4784457, 7296183, 6898730, 6152438, 8129585, 4549616, 3443063, 4848414, 2382626, 1686907, 6234975, 5675689, 7668559, 5253337, 5775762, 6906616, 5621416, 2132091, 3133851, 6724597, 639065, 969465, 3571989, 81365, 4431021, 1767884, 6133972, 3148582, 6534699, 4529774, 5700901, 8281647, 7284504, 6672633, 4878359, 3249799, 4208108, 7924092, 4839897, 4878603, 2395663, 8285216, 6120886, 7184255, 2622658, 4663163, 3668667, 7395543, 181839, 3093999, 1090102, 1067559, 615631, 2953908, 5749199, 4059681, 5980055, 1543050, 1348013, 8076693, 4656592, 2938118, 560919, 6025345, 4173652, 2586383, 7496295, 4217735, 2636436, 7579416, 2621009, 377195, 8276265, 7436874, 7268540, 2647872, 6205091, 2800853, 1267723, 1627731, 4379255, 5581422, 7673834, 7526041, 3289133, 4255595, 4974322, 6069461, 1545651, 4944323, 6109316, 719196, 6369233, 1965310, 782848, 8133183, 1128949, 3440341, 2512558, 3179363, 5268201, 1250567, 5839351, 3523752, 7467749, 6933734, 5189916, 4681164, 4334883, 1566399, 603815, 4473908, 3253517, 6088136, 5518546, 3511593, 3149194, 3994414, 1082328, 1734872, 5536317, 6734692, 6277384, 2439371]] -w = NTTInverse(aHat * NTT(y)): [[384297, 6873945, 1386044, 2707825, 4559028, 2345590, 1683029, 1381050, 5089217, 3858970, 8019333, 3719928, 7464499, 7143460, 8105520, 1063256, 2548649, 1476973, 4350521, 2814281, 1508160, 4620286, 5180416, 7961135, 8225186, 3436312, 3714798, 7248949, 8298613, 8234534, 6859250, 4834875, 6723519, 2908776, 1765330, 6519002, 1012802, 7740560, 6984048, 7534774, 5825376, 2377367, 7942804, 4052306, 5218815, 1712928, 957401, 1780227, 7353810, 2118962, 7115201, 1880031, 6924059, 258994, 700325, 4238821, 2032152, 853084, 2577443, 8132969, 806977, 7437962, 1360762, 6068262, 5545002, 579247, 4573212, 6229825, 4742393, 3472733, 6512657, 5314650, 3505281, 1607405, 6208821, 5900245, 2082369, 5242485, 7341542, 2511261, 6318313, 2429960, 6747446, 3759011, 7754808, 4159981, 4276212, 1893140, 2578155, 3038470, 7861094, 1026404, 6559112, 2466912, 6577860, 1735792, 6954936, 7205356, 6971862, 1538204, 381363, 282689, 6010091, 5355177, 352437, 632023, 5694484, 3224744, 7926001, 1201795, 1133243, 6852869, 247980, 4419696, 1140960, 5448889, 3507329, 7238974, 4716909, 5819154, 4245481, 2047430, 1128026, 6358186, 3084430, 4292302, 1714621, 983565, 5290978, 7373954, 4630718, 4210511, 4017742, 4145022, 7587880, 1701233, 2900207, 5885413, 4970306, 4139781, 4769134, 1820499, 39552, 7446936, 2681521, 5467058, 2152606, 4386839, 943603, 1817360, 3637246, 2928438, 7963438, 1668737, 6793018, 2043501, 1957277, 2300163, 6189583, 114118, 916470, 5995015, 446183, 3129002, 6671328, 3739236, 4155878, 1055199, 5628665, 7249467, 5718543, 676044, 649659, 174601, 2359910, 796011, 4966122, 2256388, 5138789, 5032867, 5860372, 2961710, 338446, 8330407, 1937794, 4670589, 8181875, 2284908, 3484818, 1858094, 1810442, 2548024, 3420709, 3671454, 6324763, 452103, 7981056, 6500201, 7612513, 994103, 2026537, 3222001, 1420137, 8365497, 2643148, 3934467, 6763875, 5772453, 1272716, 2659307, 7484352, 1717158, 6652654, 5404123, 6214385, 8244224, 3289993, 4910941, 2557381, 5130820, 6678523, 4624846, 5941665, 655869, 344273, 5330639, 1185874, 6020131, 5949271, 8013347, 2593802, 7982732, 3743065, 6183643, 4322109, 2229748, 1460397, 5093994, 4556072, 2474659, 4354542, 4329187, 7590766, 7717689, 6825646, 7994716, 731457, 7260114, 5070493, 827616, 8187697, 5118243, 767756, 4731125, 4455502, 2724432], -[4375729, 7439167, 3741004, 1886693, 1886038, 6148879, 6420327, 5823617, 7588734, 5491129, 3941447, 7459102, 907971, 2932636, 7320602, 6151556, 2754533, 1452757, 7298727, 7811343, 7260762, 7372124, 1890897, 1512935, 4035424, 636215, 6782330, 14391, 4120340, 2807533, 1457370, 3581269, 5932781, 2582216, 5164738, 2447197, 7344078, 2081348, 2726366, 5258483, 2859472, 4778139, 244017, 6685948, 3096389, 666480, 3635688, 3913782, 1736555, 7672690, 8093754, 6075357, 1483173, 2094734, 7847997, 4424416, 4182903, 7629224, 2125874, 5034461, 6591862, 5255473, 2361374, 7857033, 7100619, 2955316, 1052630, 6398258, 7788249, 4058764, 8353847, 7457019, 4501579, 85371, 4239007, 6273003, 4123117, 5494390, 5451685, 5442571, 6261606, 3444287, 6983137, 5877098, 5505478, 8376825, 3031523, 792884, 3704347, 4121210, 1326477, 7033669, 7985759, 1707321, 6240665, 4531312, 1318788, 3169358, 6904979, 3779020, 7918033, 2057591, 191038, 3671904, 119722, 6809443, 985984, 2073322, 672727, 1588064, 5399652, 7204125, 6344018, 2266204, 143620, 4448025, 5188449, 3484541, 3974293, 1149989, 1324847, 420651, 5323245, 5743237, 4367141, 5025479, 6559694, 1900564, 5163359, 6193757, 6462432, 1542127, 774384, 2776429, 7345824, 5336336, 1994516, 8180, 5123510, 6904565, 4555318, 5566633, 2094622, 7943374, 6462657, 883830, 5482738, 5168862, 4754679, 4404613, 1747656, 2894766, 7733580, 3352159, 228494, 1622701, 4610268, 6352877, 3869070, 8211685, 3424230, 7191166, 1119509, 5831158, 5693105, 6105977, 1035656, 7031435, 5208705, 8213334, 336187, 6658784, 1079468, 5880972, 3138948, 7387614, 7385423, 800600, 7492640, 6044164, 4476929, 4264435, 7249733, 2976509, 6843294, 4563508, 7010334, 7496154, 5492750, 1683508, 1752661, 7924888, 5099963, 5859409, 8286133, 7002010, 2684969, 5169840, 6364688, 3507776, 1725102, 6279639, 5612464, 5320778, 338898, 5764610, 5049720, 4028314, 3183583, 7054350, 5158382, 7772870, 1236534, 480286, 610818, 6956002, 6348261, 1287288, 5521480, 469818, 1748412, 3991863, 8236167, 6895599, 4377997, 2046976, 1437917, 1416662, 2576018, 6885479, 2580688, 1455324, 3379450, 4889103, 2846401, 435823, 785363, 429797, 3954826, 7832774, 3534951, 7075297, 7919714, 7040635, 5104371, 8065211, 7036750, 7003062, 6979021, 5305892, 8320476, 3650734, 7609893, 5198060, 1536363, 745792], -[2698851, 3049565, 3397006, 276070, 1551113, 2337230, 3645300, 7221632, 57076, 3887966, 673162, 2123583, 1551611, 430202, 5028689, 5335813, 3189903, 1735532, 1040457, 4890447, 248923, 6001602, 4857081, 7224303, 6041259, 881857, 5553458, 7992637, 7118844, 4554387, 3685812, 1263871, 3719174, 4603451, 6019870, 6668906, 7564461, 675574, 2792297, 2756285, 7454723, 2997504, 2911741, 1445641, 7918905, 5346763, 2907758, 8068939, 4532213, 1033567, 27982, 6640797, 165694, 900523, 3124851, 6842326, 4698887, 5223919, 1958530, 6246649, 6694076, 1839754, 4513234, 1676482, 4551691, 6114252, 1891664, 8039721, 3251649, 5856305, 8013236, 5957477, 4335416, 7769169, 6239469, 4127012, 2910897, 2493887, 7307418, 8279530, 3816111, 457321, 5991611, 1787520, 6743233, 7760393, 5813997, 4437600, 1531092, 4476649, 333348, 3744481, 2174724, 8128846, 275206, 4895288, 1287483, 1002060, 4673268, 5166890, 2604888, 1231927, 205155, 4271359, 7940156, 7227319, 1424681, 5392224, 1400684, 2815822, 1880876, 1122856, 401054, 2302333, 3522513, 2701678, 2893700, 7663131, 7588481, 503177, 12726, 8343029, 5476189, 2842697, 6080438, 786883, 7239249, 4728193, 2143258, 6252050, 2449419, 3881814, 4944795, 1047613, 2805341, 553833, 5912935, 5617249, 2236798, 1277788, 5208866, 6588991, 7774048, 4467143, 5095140, 6054774, 4608055, 7261922, 7891823, 5840415, 7690960, 246219, 281146, 7085566, 4161289, 3391594, 2733122, 362986, 6124446, 3349913, 5271461, 4333323, 3832228, 4328236, 1598000, 8130543, 2342520, 7891685, 6230627, 2739793, 3815291, 5741109, 1911137, 643138, 5600719, 4338235, 7432247, 5227793, 1921737, 1656025, 4497609, 2208142, 2613052, 2336020, 7672741, 7616590, 2386804, 7482310, 4536213, 7265065, 1921708, 4325422, 2461667, 3786595, 4807016, 4269271, 3992526, 3375866, 93439, 6654297, 5424135, 7839836, 4421951, 7239601, 7623418, 420956, 2903112, 7173899, 8340209, 6338780, 7158233, 5584874, 3139912, 1349237, 4274920, 3503073, 1305554, 7371672, 2257655, 4333468, 6904726, 2957070, 4020698, 4145057, 1249615, 2956358, 1757400, 1495154, 4557162, 8014319, 3924221, 5902852, 4006547, 2948087, 2318767, 2917988, 437731, 4849575, 2158238, 2119441, 962036, 84805, 7759415, 7115567, 6135739, 5851086, 5467291, 941372, 2299584, 5548452, 2405087, 3880197, 5425856, 3573878, 5759010, 1388987], -[6910521, 3304264, 4498304, 2636842, 8219646, 5469904, 1708789, 5737812, 7852341, 7913499, 6084464, 292920, 6903633, 7479994, 4666719, 18111, 5379474, 1822434, 7701540, 2198050, 8238025, 4602932, 5669157, 5952239, 7937722, 2966990, 1000966, 5600939, 3872117, 7624329, 5835600, 5913897, 8346319, 1585668, 815309, 5702218, 5076816, 1542970, 4741766, 6014714, 737601, 4708826, 5206921, 5542655, 8314407, 8269713, 2250607, 3175601, 4195956, 5553725, 7563566, 6924573, 3301750, 8281445, 3266351, 5099462, 766629, 7685247, 5767859, 2255869, 1174906, 6738377, 2345832, 1361506, 2470640, 4262228, 2004274, 6220669, 1873097, 121019, 4500990, 6679878, 6357694, 2634822, 4456971, 8330009, 7396496, 2151699, 8157788, 3209467, 4807321, 684468, 6587124, 1885011, 886955, 1924390, 1150962, 7827322, 317405, 574941, 5345346, 4079391, 8293267, 6150241, 1989052, 5843251, 4144785, 2230573, 4981528, 3315095, 1012749, 1758352, 7227190, 6599828, 208034, 7575539, 7637830, 776299, 7401256, 3111108, 1342280, 947573, 974323, 6694529, 5132227, 6003543, 2666366, 6771352, 2620000, 8157533, 7417467, 3021897, 4942349, 432947, 2776763, 2558584, 4157921, 4944725, 3815014, 1826985, 399065, 689783, 568678, 1134545, 6114713, 7728280, 1861155, 5416297, 1268717, 4615996, 5856978, 4677177, 2475343, 313433, 7588761, 6439705, 4003738, 299284, 1770798, 2582766, 3590658, 709025, 7067457, 5939784, 6554114, 6715, 5996795, 3645441, 4004447, 2490598, 688808, 4733881, 8346294, 6851529, 6133482, 2405464, 182731, 1265544, 6528802, 1663204, 6709191, 7173655, 5094267, 5974513, 4929092, 3523487, 4613010, 1443970, 4419207, 6565394, 5153562, 1807705, 1459972, 6590553, 2285927, 5409126, 6911612, 3300307, 4965001, 162216, 4105495, 898212, 5888028, 2468647, 4387552, 1580214, 3092354, 6508643, 196376, 4172334, 4151091, 5695676, 1128201, 3865323, 536847, 5457188, 2674436, 4160791, 2223348, 4667696, 4891967, 112250, 3132052, 2705330, 7035745, 6457101, 7907302, 1187386, 5222609, 3056857, 2509782, 2735008, 3822237, 3385407, 7378607, 7073565, 4779633, 7224561, 4351890, 7318310, 3608529, 7791680, 1437883, 6015727, 3725065, 3745276, 3245117, 4886571, 5306739, 6240148, 3612694, 5047105, 7702361, 4202267, 1676310, 5706632, 2944779, 6805427, 7856852, 1294182, 453318, 1387262, 5566150, 3807069, 5555579, 2723152]] - -w1: [[2, 36, 7, 14, 24, 12, 9, 7, 27, 20, 42, 20, 39, 38, 43, 6, 13, 8, 23, 15, 8, 24, 27, 42, 43, 18, 20, 38, 0, 43, 36, 25, 35, 15, 9, 34, 5, 41, 37, 40, 31, 12, 42, 21, 27, 9, 5, 9, 39, 11, 37, 10, 36, 1, 4, 22, 11, 4, 14, 43, 4, 39, 7, 32, 29, 3, 24, 33, 25, 18, 34, 28, 18, 8, 33, 31, 11, 28, 39, 13, 33, 13, 35, 20, 41, 22, 22, 10, 14, 16, 41, 5, 34, 13, 35, 9, 37, 38, 37, 8, 2, 1, 32, 28, 2, 3, 30, 17, 42, 6, 6, 36, 1, 23, 6, 29, 18, 38, 25, 31, 22, 11, 6, 33, 16, 23, 9, 5, 28, 39, 24, 22, 21, 22, 40, 9, 15, 31, 26, 22, 25, 10, 0, 39, 14, 29, 11, 23, 5, 10, 19, 15, 42, 9, 36, 11, 10, 12, 32, 1, 5, 31, 2, 16, 35, 20, 22, 6, 30, 38, 30, 4, 3, 1, 12, 4, 26, 12, 27, 26, 31, 16, 2, 0, 10, 25, 43, 12, 18, 10, 10, 13, 18, 19, 33, 2, 42, 34, 40, 5, 11, 17, 7, 0, 14, 21, 36, 30, 7, 14, 39, 9, 35, 28, 33, 43, 17, 26, 13, 27, 35, 24, 31, 3, 2, 28, 6, 32, 31, 42, 14, 42, 20, 32, 23, 12, 8, 27, 24, 13, 23, 23, 40, 41, 36, 42, 4, 38, 27, 4, 43, 27, 4, 25, 23, 14], -[23, 39, 20, 10, 10, 32, 34, 31, 40, 29, 21, 39, 5, 15, 38, 32, 14, 8, 38, 41, 38, 39, 10, 8, 21, 3, 36, 0, 22, 15, 8, 19, 31, 14, 27, 13, 39, 11, 14, 28, 15, 25, 1, 35, 16, 3, 19, 21, 9, 40, 42, 32, 8, 11, 41, 23, 22, 40, 11, 26, 35, 28, 12, 41, 37, 16, 6, 34, 41, 21, 0, 39, 24, 0, 22, 33, 22, 29, 29, 29, 33, 18, 37, 31, 29, 0, 16, 4, 19, 22, 7, 37, 42, 9, 33, 24, 7, 17, 36, 20, 42, 11, 1, 19, 1, 36, 5, 11, 4, 8, 28, 38, 33, 12, 1, 23, 27, 18, 21, 6, 7, 2, 28, 30, 23, 26, 34, 10, 27, 33, 34, 8, 4, 15, 39, 28, 10, 0, 27, 36, 24, 29, 11, 42, 34, 5, 29, 27, 25, 23, 9, 15, 41, 18, 1, 9, 24, 33, 20, 43, 18, 38, 6, 31, 30, 32, 5, 37, 27, 43, 2, 35, 6, 31, 16, 39, 39, 4, 39, 32, 24, 22, 38, 16, 36, 24, 37, 39, 29, 9, 9, 42, 27, 31, 0, 37, 14, 27, 33, 18, 9, 33, 29, 28, 2, 30, 27, 21, 17, 37, 27, 41, 6, 3, 3, 37, 33, 7, 29, 2, 9, 21, 43, 36, 23, 11, 8, 7, 14, 36, 14, 8, 18, 26, 15, 2, 4, 2, 21, 41, 19, 37, 42, 37, 27, 42, 37, 37, 37, 28, 0, 19, 40, 27, 8, 4], -[14, 16, 18, 1, 8, 12, 19, 38, 0, 20, 4, 11, 8, 2, 26, 28, 17, 9, 5, 26, 1, 32, 26, 38, 32, 5, 29, 42, 37, 24, 19, 7, 20, 24, 32, 35, 40, 4, 15, 14, 39, 16, 15, 8, 42, 28, 15, 42, 24, 5, 0, 35, 1, 5, 16, 36, 25, 27, 10, 33, 35, 10, 24, 9, 24, 32, 10, 42, 17, 31, 42, 31, 23, 41, 33, 22, 15, 13, 38, 43, 20, 2, 31, 9, 35, 41, 31, 23, 8, 24, 2, 20, 11, 43, 1, 26, 7, 5, 25, 27, 14, 6, 1, 22, 42, 38, 7, 28, 7, 15, 10, 6, 2, 12, 18, 14, 15, 40, 40, 3, 0, 0, 29, 15, 32, 4, 38, 25, 11, 33, 13, 20, 26, 6, 15, 3, 31, 29, 12, 7, 27, 35, 41, 23, 27, 32, 24, 38, 41, 31, 40, 1, 1, 37, 22, 18, 14, 2, 32, 18, 28, 23, 20, 23, 8, 43, 12, 41, 33, 14, 20, 30, 10, 3, 29, 23, 39, 27, 10, 9, 24, 12, 14, 12, 40, 40, 13, 39, 24, 38, 10, 23, 13, 20, 25, 22, 21, 18, 0, 35, 28, 41, 23, 38, 40, 2, 15, 38, 0, 33, 38, 29, 16, 7, 22, 18, 7, 39, 12, 23, 36, 16, 21, 22, 7, 16, 9, 8, 24, 42, 21, 31, 21, 15, 12, 15, 2, 25, 11, 11, 5, 0, 41, 37, 32, 31, 29, 5, 12, 29, 13, 20, 28, 19, 30, 7], -[36, 17, 24, 14, 43, 29, 9, 30, 41, 42, 32, 2, 36, 39, 25, 0, 28, 10, 40, 12, 43, 24, 30, 31, 42, 16, 5, 29, 20, 40, 31, 31, 0, 8, 4, 30, 27, 8, 25, 32, 4, 25, 27, 29, 0, 43, 12, 17, 22, 29, 40, 36, 17, 43, 17, 27, 4, 40, 30, 12, 6, 35, 12, 7, 13, 22, 11, 33, 10, 1, 24, 35, 33, 14, 23, 0, 39, 11, 43, 17, 25, 4, 35, 10, 5, 10, 6, 41, 2, 3, 28, 21, 0, 32, 10, 31, 22, 12, 26, 17, 5, 9, 38, 35, 1, 40, 40, 4, 39, 16, 7, 5, 5, 35, 27, 32, 14, 36, 14, 43, 39, 16, 26, 2, 15, 13, 22, 26, 20, 10, 2, 4, 3, 6, 32, 41, 10, 28, 7, 24, 31, 25, 13, 2, 40, 34, 21, 2, 9, 14, 19, 4, 37, 31, 34, 0, 31, 19, 21, 13, 4, 25, 0, 36, 32, 13, 1, 7, 34, 9, 35, 38, 27, 31, 26, 18, 24, 8, 23, 34, 27, 9, 8, 35, 12, 28, 36, 17, 26, 1, 22, 5, 31, 13, 23, 8, 16, 34, 1, 22, 22, 30, 6, 20, 3, 29, 14, 22, 12, 25, 26, 1, 16, 14, 37, 34, 42, 6, 27, 16, 13, 14, 20, 18, 39, 37, 25, 38, 23, 38, 19, 41, 8, 32, 20, 20, 17, 26, 28, 33, 19, 26, 40, 22, 9, 30, 15, 36, 41, 7, 2, 7, 29, 20, 29, 14]] -w1Encode: 02793818931C1BA552A7B91A0D723D08B6A9AB4499C04A66E39388455AA21FA3565B5224E7522A6440580BE1ACC47980DD808599247212127E0B7736613352A965290E9416623326A55922420072C2E045AA6190C1657492997DD66284D09514DC8959958526CFA75999029C4EB75C85323D6A422E0A0306C527402365199EE91143C0101AB3691F24004AB63292A234D2140AAA88164B74004E457A8773262317AE91D66C23F60D0267809FEAA8147831C88635D785A6A44A981BB16E447639D749290A287E68579DC563820E62A6E6A920D54002D6834C9FB335E7E2704F168CD0305509AA82C8925E16BA6823C7A425648869059C18608556D775A1547E1D00119375946A1262474452EA124C01592C04C29921135C9B541987C07997262A5B2822C473720AB09158B7A862D16DD9953CA914245848AD92697C1E5894DB2A8CC6079D27718298654224569E5D92A8DB0794CE164A49D87182B75551B9A5C63094E1D10949B592D7821C0EE92092F6088450A553A9969B5A9625074CE886100E240508339900452C88A07151526801A89960D1A925361D14068E28F13827F4202AF7A858018C410191D9A684A3822518A8A8D1A77E571A5A4F63AE94F02563FA5D082650CB1A6847916D8E1158AA7970C7A3180223390F8A0E00D03D2061664BD8509AF10C5FC71CDB985E1B8899E987064169498E004ADC455DC8CAA4A14379CAD05DE7A62418E33028DA9C98A95C0D955995048C5C7A99A8F098406876D06149C7C95C245459079420985A7DD5C33C42B62C059096E0D7154CD750DCE41D6484396B9778A90A0AE499019C82322BE67D2A547414FA7D0042781B928144B675C0CA44568792D11A6D04EA31C6C81C8DB5844A808DA17301E7B24619312A8562A4C2C05500A87C16A34545628E018A12277414C5B8810EE9AC27A4094F63699422108301A60A77605FD608A85809893311E52702DF543544069060131C62329ADBA7491872895B828C0C47465A60155F732190185896675043E7584CA60590538AAAB1418D43496799999739A508485191C68593865A89F790E9211C1DD539 - -cTilde: 57784A952DCB8E648F8610F9EF0BF01F0AED20707F445BB525753E5D7096C63F -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, -1, 0] -cHat: [6650003, 5680140, 2216812, 1477582, 7668486, 4300053, 570741, 3379226, 1553795, 7094397, 6902915, 496978, 7445833, 7628371, 3727881, 1190485, 5678449, 4844396, 3993990, 1277305, 1223642, 5853017, 2263596, 6618335, 2121280, 3640231, 3692137, 7810648, 7829899, 5679632, 7927586, 5909972, 4827460, 4017130, 6707323, 36319, 7594177, 6591822, 5272639, 4733559, 2230761, 5715869, 3847228, 813326, 2405814, 4683512, 4518762, 2107241, 5756895, 4292283, 2098246, 2952367, 1821790, 5944650, 7231815, 4990466, 5465110, 4019243, 3698148, 1301860, 4677708, 322629, 390482, 2758833, 1275403, 6570430, 8062996, 1399841, 3346596, 3545425, 3636162, 1457175, 6106071, 2300875, 7223852, 5288274, 5722334, 2738687, 7114537, 1303008, 988829, 2692851, 5495393, 647595, 5475962, 5928683, 2353182, 5978397, 1255040, 1119337, 7833651, 1056964, 7894426, 1181934, 5292493, 3516512, 6145537, 3931135, 1180516, 3268381, 2541536, 4158485, 210737, 5172648, 6107669, 1069253, 2933674, 6747513, 868439, 964771, 4065460, 868386, 6772406, 519456, 5417869, 8061959, 2575422, 2294815, 6873138, 873336, 6377653, 1986360, 3051252, 6452819, 5869462, 3034275, 4231002, 2603750, 5704362, 3039080, 4428880, 5976213, 5684542, 3373817, 215069, 758260, 8373615, 7985135, 5029391, 871231, 3657572, 5878393, 7713039, 2592252, 7104134, 6564462, 2367500, 2096320, 7326337, 1971710, 961791, 2823757, 4621632, 6316868, 2227391, 807665, 2423125, 2575107, 8187494, 4525141, 5641055, 3735098, 7649635, 1385767, 6264642, 6234395, 4006739, 245437, 840144, 7124440, 6002786, 421655, 5960693, 7165196, 7951070, 557454, 4570277, 6768782, 3157813, 6865956, 3767128, 3703659, 8059094, 6253538, 663185, 2935094, 2812058, 3081568, 949433, 7202620, 4292560, 6103441, 250671, 3304549, 1241459, 3578820, 4593823, 2683604, 3553800, 5716030, 5560661, 305380, 7620994, 4638425, 5633904, 2156200, 5535912, 3230073, 5066959, 2720189, 3054550, 2958065, 2170035, 4007563, 3099722, 3896861, 153165, 2717003, 3033761, 2533320, 6287159, 4981316, 4629478, 8295159, 7651144, 3754686, 1680249, 5004679, 2132372, 4839907, 2484811, 1343984, 6342113, 6301078, 6602981, 5752221, 4794087, 6465319, 2164807, 7167897, 603677, 3874028, 7399301, 7675513, 3574909, 3626254, 5880641, 6702503, 183014, 1962782, 3570859, 3016068, 4055169, 4078926, 591975, 925882] -cs1: [[8380400, 2, 8380409, 8380407, 8380408, 12, 5, 9, 8, 4, 8380412, 8380413, 7, 8380415, 0, 8380415, 8380401, 3, 8380413, 1, 8380415, 7, 7, 7, 7, 6, 9, 8380410, 10, 6, 6, 0, 9, 8380406, 2, 8380407, 5, 1, 10, 15, 6, 1, 8380412, 6, 8380397, 8380415, 8380410, 1, 7, 8380409, 8380405, 8380413, 8380395, 8380405, 5, 8380410, 8, 6, 9, 8380416, 2, 5, 8380416, 2, 8380407, 8380416, 8380413, 8, 12, 14, 15, 8380407, 0, 8380408, 7, 8380416, 21, 8380409, 8380411, 8380412, 8380413, 18, 13, 8380416, 5, 8380416, 8380412, 8, 8380414, 8380416, 8380415, 8380415, 8380411, 8, 8, 11, 8380412, 8380398, 8380404, 0, 8380403, 3, 1, 6, 14, 8380408, 4, 18, 8380416, 7, 8380413, 0, 0, 3, 8380413, 8380409, 8380408, 8380406, 2, 1, 9, 2, 8380408, 8, 8380414, 8380396, 8, 7, 8380411, 11, 8380414, 8380410, 8380414, 1, 8380414, 17, 8380415, 10, 11, 8380409, 8380408, 16, 8380405, 7, 18, 5, 8380416, 14, 1, 8380416, 9, 10, 13, 8380415, 21, 8380416, 10, 8380401, 8380405, 8380404, 8380412, 8380402, 1, 2, 8380411, 15, 5, 1, 11, 13, 2, 8380410, 8380400, 8380390, 8380402, 8380409, 8380414, 8380415, 8380416, 8380408, 8380409, 1, 0, 3, 8380416, 8380415, 8380411, 8380415, 5, 10, 8380404, 4, 8380405, 12, 14, 8380413, 12, 6, 8380402, 8380409, 8380414, 8380414, 8380413, 8380408, 8380402, 8380402, 8380409, 8380411, 5, 9, 2, 17, 8380410, 14, 0, 8380409, 8380413, 8380407, 8380408, 0, 8380410, 8380401, 11, 2, 8380413, 8380414, 12, 15, 17, 0, 10, 14, 8380415, 8380416, 5, 3, 8380404, 8380404, 1, 3, 11, 0, 3, 8380401, 2, 2, 2, 4, 8380413, 8380412, 8380405, 8380406, 8380416, 2, 10, 4], -[5, 8380410, 8380407, 5, 12, 8380412, 8380414, 8380410, 8380415, 2, 15, 4, 9, 8380404, 8380407, 1, 8380407, 8380407, 12, 8380408, 9, 8380415, 8380408, 3, 0, 8380414, 13, 8380416, 19, 8380415, 7, 4, 9, 5, 8380413, 13, 4, 8380413, 8380410, 8380406, 8380411, 8380405, 8380409, 4, 8380411, 8380411, 16, 0, 8380414, 8380413, 5, 24, 8380408, 9, 5, 8380406, 11, 8380405, 8380411, 6, 8380410, 8380397, 8380409, 8380409, 8380401, 8380414, 6, 8380408, 1, 8380413, 8380413, 6, 5, 10, 16, 0, 8380415, 11, 11, 8380412, 8380410, 8380407, 8380410, 8380401, 3, 8380408, 8, 8380411, 8380406, 9, 4, 8380412, 8380416, 8380409, 11, 8380414, 8380415, 5, 24, 7, 2, 8380406, 8380408, 8380412, 11, 8380405, 12, 8380403, 8380416, 8380411, 8380404, 8, 8380413, 8380416, 8380413, 8, 8, 8, 8380409, 14, 8380413, 8380393, 2, 8380404, 3, 8380412, 8380415, 8380405, 13, 1, 8380397, 8, 8380413, 9, 8380411, 6, 8380413, 3, 8380410, 5, 8380412, 12, 8, 0, 9, 8380409, 4, 6, 8380402, 6, 8380413, 8380411, 8380413, 1, 8380412, 7, 3, 8380404, 7, 14, 8380408, 8380408, 7, 8380404, 4, 8380409, 4, 1, 8380400, 10, 8380405, 8380408, 20, 8380416, 3, 8380415, 2, 8380414, 8380407, 2, 8380414, 0, 8380405, 8380400, 8380415, 8380410, 8380414, 8380409, 8380404, 20, 11, 8380416, 8380412, 0, 4, 8380408, 8380403, 16, 2, 8380410, 8380412, 5, 8380406, 8380395, 3, 8380404, 8380414, 8380411, 8380405, 7, 0, 8380411, 4, 8380403, 8380411, 1, 6, 0, 0, 19, 0, 7, 13, 8380410, 12, 8380408, 5, 1, 5, 2, 8380414, 6, 8380416, 13, 0, 13, 14, 26, 14, 8380415, 15, 8380410, 0, 8380406, 8380414, 8380401, 8380406, 8380411, 9, 8380404, 12, 3, 3, 6, 10, 6], -[8380416, 9, 4, 10, 8380404, 19, 8380415, 8380413, 8, 8380410, 8380413, 10, 8380413, 8380409, 4, 8380413, 9, 6, 8380404, 1, 5, 0, 6, 5, 9, 10, 0, 8380402, 3, 8380412, 9, 8380410, 8380411, 8380412, 2, 8380407, 4, 5, 8380410, 8380415, 8380409, 0, 8380413, 12, 8380400, 8380416, 8380416, 8380416, 5, 8380402, 6, 3, 8380414, 8380415, 8380409, 7, 8380409, 8380403, 10, 10, 8380413, 11, 2, 1, 12, 8380403, 8380410, 8, 9, 8380404, 8380416, 8380411, 0, 3, 7, 8380411, 15, 5, 8380405, 8380410, 8380408, 5, 6, 5, 2, 2, 4, 17, 8380412, 7, 10, 8380403, 8380407, 3, 8380416, 5, 4, 14, 3, 8380407, 2, 8380411, 1, 8380412, 6, 17, 8380413, 8380411, 0, 5, 4, 0, 8380411, 8380404, 4, 8380414, 8380412, 21, 8380410, 8380407, 2, 8, 8380402, 8380412, 8380413, 5, 8380407, 7, 1, 15, 8380409, 8380405, 8380415, 7, 8380410, 22, 8380411, 3, 8380415, 8380412, 3, 8380411, 6, 13, 8380406, 8380414, 5, 4, 16, 17, 3, 8380415, 6, 2, 8380407, 8380416, 11, 3, 2, 8380405, 8380414, 8380415, 8380413, 6, 8380404, 8380415, 8380414, 1, 13, 8380413, 8380415, 7, 3, 1, 8380415, 0, 8380415, 3, 3, 8380415, 4, 5, 1, 8380402, 8380410, 8380416, 8380416, 1, 8380404, 9, 8, 8380403, 11, 6, 8, 10, 8380416, 0, 0, 5, 1, 2, 8380403, 8380413, 8380412, 8380416, 8380410, 7, 8380411, 9, 3, 8380405, 7, 10, 8380415, 11, 8380414, 8380407, 8, 8380402, 8380402, 5, 8380404, 8380408, 5, 3, 5, 8380409, 3, 13, 8380409, 4, 31, 8380408, 8380416, 8380415, 8380408, 17, 4, 8380410, 13, 8380408, 8380404, 10, 5, 8380406, 4, 6, 8380401, 8380406, 5, 3, 9, 0, 8380412, 7], -[8380406, 4, 8380416, 5, 8380411, 4, 13, 5, 8380403, 3, 8380412, 8380402, 2, 8380410, 8380411, 8380408, 8380409, 8380412, 4, 8380416, 6, 9, 8380415, 4, 8, 8380416, 4, 8380414, 8, 0, 8380404, 8380407, 0, 8380401, 8380412, 12, 8380412, 25, 8380414, 8380412, 8380414, 1, 8380411, 6, 20, 6, 4, 6, 8380414, 8380412, 0, 8, 8380408, 4, 9, 8380414, 13, 8380405, 8380412, 8380403, 8380408, 8380408, 2, 5, 22, 0, 8380416, 14, 6, 1, 5, 6, 9, 17, 8380407, 20, 8380399, 8380402, 8380402, 3, 11, 18, 14, 4, 5, 6, 8380402, 12, 8380409, 8380412, 0, 8380406, 8380412, 8380401, 8380416, 8380414, 8380411, 8380400, 1, 8380400, 8380410, 7, 8380416, 8, 12, 8380397, 5, 3, 8380415, 3, 12, 8380414, 5, 10, 8, 0, 8380405, 1, 8380411, 8380414, 1, 12, 8380401, 8380405, 3, 8380407, 8380416, 0, 19, 4, 1, 8380414, 4, 4, 8380414, 8380408, 8380416, 8380407, 8, 8380415, 5, 8380413, 12, 8380412, 8, 8380411, 18, 8380407, 5, 1, 8380408, 6, 8380408, 8380414, 8380408, 9, 8380401, 8380401, 8380403, 5, 6, 8380408, 8380403, 15, 8380413, 8380414, 1, 8, 8380415, 17, 8380414, 2, 7, 8380404, 8380412, 8380413, 8380402, 8380413, 3, 8380416, 8380408, 8380409, 5, 8380408, 8380412, 8380411, 5, 8380412, 3, 6, 11, 17, 8380408, 3, 1, 2, 0, 9, 8380408, 4, 8380410, 8380410, 9, 0, 8380406, 1, 1, 6, 4, 8380413, 10, 3, 8380416, 8380410, 7, 8380416, 8380413, 8380412, 8380398, 8380416, 8380404, 8380408, 12, 8380399, 8380401, 8380409, 11, 8380412, 10, 14, 8380411, 8380406, 0, 6, 8380406, 32, 6, 8380415, 12, 8380405, 8380404, 8380413, 8380399, 8380406, 8380414, 8380409, 0, 7, 8380407, 8380402, 0, 8380404, 8380405, 6, 8380408, 9]] -cs2: [[8380415, 8380415, 8380409, 8380416, 4, 2, 13, 9, 16, 4, 11, 8380404, 8380411, 8380401, 8380406, 1, 8380414, 12, 7, 0, 10, 7, 3, 8380403, 6, 3, 0, 1, 4, 0, 8380416, 4, 4, 6, 8380414, 2, 4, 8380416, 11, 3, 2, 8380416, 8380408, 21, 8380414, 2, 5, 8380407, 8380407, 0, 21, 10, 8380407, 1, 8380406, 10, 8380407, 8380416, 8380410, 8380412, 8380404, 0, 8380411, 9, 8380407, 8380410, 0, 1, 6, 16, 8380415, 5, 8380409, 8380407, 8380415, 8380415, 8380406, 2, 7, 1, 8380408, 6, 8380409, 5, 6, 8380415, 18, 8380410, 13, 8380413, 2, 8380408, 8380403, 8380410, 8380399, 8380413, 8380416, 8380408, 8380416, 8380415, 8380413, 8380414, 0, 13, 20, 8380405, 12, 4, 8380403, 8380407, 8380401, 2, 6, 13, 13, 5, 8380415, 8380408, 8380401, 7, 8380406, 7, 4, 8380416, 1, 10, 8380415, 8380409, 8380413, 8380410, 13, 9, 1, 13, 8380407, 8380413, 8380416, 8380410, 8380408, 8380409, 8380405, 8380407, 8380409, 4, 6, 11, 12, 12, 1, 10, 8380415, 8380416, 5, 8380404, 0, 8380411, 0, 8380405, 8380413, 0, 8380411, 15, 6, 11, 18, 8380411, 19, 8380415, 8380408, 8380401, 8380409, 8380398, 8380412, 8380415, 8380408, 8380410, 8380409, 4, 4, 8380401, 8380409, 8380408, 8380416, 2, 8380414, 12, 0, 4, 6, 8380405, 8380408, 8380416, 8380414, 8380415, 9, 8380415, 8380412, 2, 8380398, 8380402, 8380406, 8380412, 8380414, 0, 6, 12, 15, 2, 13, 21, 8380401, 11, 8380412, 8380409, 8380404, 8380397, 8380401, 8380400, 8380407, 7, 8380415, 8380410, 13, 2, 9, 5, 6, 11, 5, 11, 13, 8380408, 3, 8380410, 4, 8380406, 8380412, 8380407, 0, 8380406, 1, 5, 2, 8380416, 8380412, 1, 8380412, 8380412, 10, 8380413, 8, 14, 8380403, 8380409, 1, 8380408], -[8380408, 20, 18, 8380415, 4, 2, 8380412, 6, 1, 8380411, 15, 8380416, 1, 8380415, 2, 8380409, 8380416, 8380410, 10, 5, 8, 9, 7, 8380413, 8, 8380411, 14, 8, 6, 12, 21, 8380416, 3, 10, 8380408, 8380412, 8380413, 8380416, 8380409, 9, 11, 8380405, 5, 8, 8380405, 8380403, 11, 8380410, 6, 8380416, 8380406, 4, 0, 8380410, 9, 8380413, 8380408, 1, 8380398, 8380409, 0, 6, 14, 5, 8380411, 2, 8380410, 8380410, 4, 0, 8380412, 5, 8380401, 7, 14, 8380408, 8380403, 4, 8380404, 10, 8380400, 1, 5, 11, 8380393, 8, 15, 8380408, 8380405, 8380414, 8380410, 8380414, 8380413, 4, 7, 8380409, 8380411, 8380406, 8380406, 2, 8380416, 3, 2, 14, 8380399, 15, 10, 8380408, 7, 8380410, 8380414, 0, 16, 8380416, 2, 8380409, 8380405, 8380412, 8380403, 8380398, 8380410, 8380411, 8380407, 8380414, 1, 9, 8380414, 8380411, 4, 7, 13, 8380403, 13, 2, 3, 8380405, 8380412, 6, 8380415, 8380403, 8380416, 8380407, 8380410, 8380407, 8380414, 15, 8380415, 8, 1, 15, 0, 3, 8380415, 7, 8380409, 6, 1, 7, 8, 8380416, 8380408, 6, 8380414, 8380416, 8380402, 8380413, 8380415, 8380410, 0, 8380412, 8380415, 8380413, 1, 4, 7, 8, 3, 0, 0, 8380412, 8380415, 9, 8380406, 8380406, 1, 9, 8380410, 10, 8380413, 8380416, 0, 8380405, 8380409, 9, 8380410, 8380406, 4, 8380407, 10, 8380409, 8380402, 10, 4, 8380415, 1, 4, 6, 1, 8380415, 8380407, 7, 8380400, 0, 8380403, 0, 8380405, 10, 8380413, 13, 8, 5, 13, 5, 0, 8380409, 8, 8380406, 5, 19, 8380414, 8380414, 6, 12, 8380411, 1, 8380406, 0, 13, 8380409, 4, 4, 8380406, 8380399, 8380400, 8380414, 13, 0, 10, 13, 5, 0, 8380406, 8380413, 1, 5, 8380398], -[8380415, 0, 8, 0, 8380415, 8380410, 8, 8380401, 8380413, 8380404, 5, 8380413, 8380400, 8380415, 8380405, 3, 3, 8380411, 8380414, 8380397, 8380415, 16, 8380415, 3, 8380408, 7, 8380393, 1, 8380415, 1, 16, 8380415, 8380413, 8, 8380410, 8380415, 8380406, 8380414, 8380394, 8380416, 8380407, 18, 8380415, 8380411, 8, 1, 8380412, 7, 8380416, 13, 2, 3, 8380410, 0, 8380405, 4, 8380413, 8380411, 8380408, 8380407, 8380409, 4, 8380411, 6, 8380406, 8380401, 8380416, 8380414, 3, 8380407, 8380413, 0, 14, 8380412, 6, 8380411, 17, 8380402, 6, 8380407, 8380416, 8380406, 8380395, 8380402, 8380414, 8380411, 8380408, 8380408, 14, 15, 2, 7, 8380414, 1, 12, 8380407, 8380415, 8380412, 3, 8380400, 8380411, 2, 8380405, 11, 8380404, 6, 1, 5, 3, 10, 4, 0, 8380415, 8380412, 8380413, 4, 8, 3, 4, 8, 8380403, 7, 8380415, 2, 3, 1, 8380405, 8380415, 3, 6, 0, 17, 7, 3, 8380406, 0, 11, 3, 6, 8380410, 8380413, 13, 8380416, 8380410, 5, 8380415, 2, 4, 3, 17, 5, 4, 8, 2, 8380413, 8380407, 8380414, 18, 3, 8380414, 8, 8380416, 8380412, 2, 8, 8380411, 3, 11, 8380409, 24, 8380412, 9, 0, 8380399, 8380416, 22, 15, 0, 8380416, 8380402, 8380400, 8380405, 8380416, 13, 8380414, 2, 8380404, 8380416, 17, 2, 8380410, 8380405, 8380415, 3, 25, 3, 9, 8380412, 8380411, 8380416, 15, 8380405, 1, 4, 1, 6, 2, 3, 8380410, 8380407, 1, 8380408, 5, 0, 29, 8380415, 8, 8380407, 9, 0, 0, 0, 17, 8380415, 5, 8380413, 5, 6, 11, 8380403, 8380410, 0, 15, 8380412, 8380403, 12, 11, 8380410, 8380412, 4, 8380415, 8380414, 8380412, 2, 1, 11, 5, 8, 8380416, 14, 8380404, 24, 8380412, 7, 8380406, 8380414], -[8380412, 8380406, 8380414, 17, 8380412, 8380416, 8380413, 8380416, 8380412, 8380406, 3, 10, 7, 1, 8380415, 8380411, 8380416, 9, 2, 8380408, 1, 8380409, 8380409, 8380403, 8380402, 8380416, 8380403, 8380412, 8380415, 8380416, 8380410, 8380403, 8380411, 6, 7, 17, 8380404, 4, 6, 1, 7, 8380415, 2, 0, 8380409, 13, 8380411, 17, 8380411, 19, 8380413, 8380416, 8380405, 13, 6, 4, 2, 8380409, 8380411, 6, 3, 8380411, 14, 22, 7, 8380413, 8380412, 8380415, 5, 8380405, 8380415, 8380410, 4, 7, 3, 4, 6, 8380415, 8380396, 5, 2, 16, 1, 8380415, 8380415, 2, 8380414, 0, 8380407, 8380411, 10, 3, 15, 29, 1, 3, 3, 8380411, 8380406, 8380410, 8380408, 11, 8380406, 8380400, 8380404, 8380409, 6, 0, 8380403, 8380415, 14, 8380408, 13, 8380411, 6, 1, 8380403, 8380414, 14, 6, 8380415, 21, 8380414, 12, 8380413, 8380406, 8380408, 8, 8380414, 0, 5, 8380414, 8380415, 1, 8380400, 4, 8, 8380416, 19, 7, 2, 8380416, 2, 17, 8380413, 2, 0, 8380406, 1, 8380416, 8380409, 8380398, 0, 1, 8380410, 8380412, 9, 0, 12, 0, 8380416, 6, 8380409, 8380414, 9, 10, 22, 8380416, 2, 2, 8380408, 14, 8380412, 4, 7, 8380415, 8380408, 8380411, 8380414, 5, 8380413, 11, 8380401, 8380416, 3, 8380406, 1, 8380405, 6, 16, 8380416, 0, 7, 12, 8380411, 4, 8380415, 3, 0, 12, 3, 9, 8380416, 8380416, 2, 13, 11, 8380410, 8380413, 10, 4, 8380411, 0, 1, 8380409, 8380405, 5, 17, 14, 7, 8380402, 8380408, 8380409, 5, 3, 8380416, 8380411, 6, 8380404, 8380416, 4, 8380409, 8380416, 8380404, 8380416, 8380399, 8, 3, 8380403, 17, 8380416, 5, 8380416, 8380411, 3, 6, 8380409, 7, 11, 5, 8380413, 5, 8380412, 8380407, 6, 8380405]] -z: [[97090, 89551, 8335548, 8378012, 27435, 25635, 8334207, 44504, 8332343, 8362863, 102541, 8315356, 114467, 8292408, 124788, 5384, 101423, 8335085, 45469, 83720, 34883, 97091, 92902, 8373447, 8296980, 8353372, 69985, 100701, 8254347, 8350436, 42388, 8268097, 10334, 38846, 53704, 8352214, 84988, 8275561, 36905, 4859, 115886, 70793, 8350812, 8266132, 32832, 8319297, 8374379, 102062, 8264986, 58567, 41234, 8261684, 8364049, 81077, 29793, 45762, 88295, 8358408, 84601, 8324492, 128291, 108859, 8283930, 125818, 123118, 8312273, 8255101, 31604, 99640, 79241, 8351589, 100267, 29574, 8315475, 8254466, 8314252, 8259664, 11202, 11838, 110026, 89653, 27470, 8377333, 8258758, 8362873, 32874, 78157, 95822, 8291114, 8360156, 109961, 8348326, 836, 8369289, 8311321, 8270978, 8302006, 7724, 8323691, 8305180, 8293025, 64863, 5594, 28893, 47257, 6973, 8296201, 39786, 8333597, 8361042, 26206, 8262779, 8251254, 8253543, 8339306, 8328425, 8362748, 79091, 8302011, 55660, 8345345, 8326928, 8301267, 8378832, 8289605, 101001, 8355577, 8344441, 39775, 63199, 8311634, 65456, 72161, 8332955, 8345395, 8310113, 8310717, 80602, 20935, 130237, 128787, 64916, 8341289, 15752, 8279776, 63441, 8356932, 472, 8312054, 117366, 82389, 8345404, 8326198, 8269388, 15761, 8355232, 95444, 8263030, 8309964, 8348809, 8379097, 69098, 91193, 121600, 8367500, 8268710, 69460, 111102, 39946, 8320280, 8368328, 8326251, 120370, 129238, 60990, 56743, 106806, 8279119, 41559, 8323391, 20865, 8291048, 8270937, 127976, 8372370, 92375, 8269120, 7868, 107914, 7459, 8350965, 90113, 38713, 42673, 122155, 101703, 8323279, 8380372, 8306025, 72439, 18479, 107253, 8318475, 819, 8376572, 8334416, 112848, 8325713, 8280583, 8283177, 8318436, 53400, 8282305, 8273650, 117403, 97653, 71385, 8290395, 8373331, 49552, 8364889, 96984, 97152, 8297678, 8336884, 121361, 47587, 118459, 8378234, 371, 8308805, 114908, 8326550, 119894, 8321069, 8350502, 8299066, 35740, 12727, 8346542, 8353109, 50092, 43016, 8335725, 115924, 98495, 103689, 27079, 8371937, 60555, 8374028, 8257009, 8313927, 51458, 21673, 8317038], -[107080, 125323, 96667, 105029, 77146, 54024, 37191, 8311718, 125584, 8259023, 67606, 13819, 38059, 95102, 1018, 8349388, 8356774, 73277, 8252753, 71577, 8269018, 89759, 8294895, 8276238, 8348389, 8300397, 90355, 35843, 8357362, 8356931, 8256756, 8337587, 8314595, 115375, 7730, 8305823, 37983, 8259452, 49763, 100846, 8301854, 8317325, 8340816, 8249764, 11771, 8365505, 8257611, 67496, 8335485, 44790, 8317580, 8257289, 64376, 8303515, 8349186, 8378149, 8372044, 49232, 8278611, 8287063, 8333023, 8252228, 8330218, 8346273, 98123, 69793, 8365788, 8354716, 8293265, 128600, 8279499, 12402, 8328826, 8360712, 97904, 8346470, 8373309, 8273945, 8289372, 8294347, 55328, 8346010, 8362150, 8298319, 8257820, 8290030, 8373292, 8274544, 108112, 8363224, 8249400, 14305, 8316611, 8325694, 112333, 8291133, 8255657, 8272355, 78158, 8269312, 12344, 8295860, 8256449, 61220, 70798, 8267048, 6810, 8265125, 79015, 8324063, 8274095, 8281612, 21631, 34054, 98689, 8258094, 65218, 18553, 8299641, 8336997, 55455, 8311715, 71177, 124551, 8295045, 90095, 8365947, 64941, 8363228, 8255261, 96495, 8321506, 8262525, 28053, 8269756, 41243, 8255989, 8363796, 67580, 65515, 122328, 821, 8323894, 8256319, 8253293, 28717, 8337518, 8335964, 52708, 8261730, 8379632, 60410, 8251860, 41076, 8320517, 88480, 116475, 114851, 27525, 8324881, 8358811, 8356160, 17501, 61515, 8368809, 83608, 8273862, 100131, 21455, 30200, 43202, 8303514, 130790, 34134, 82103, 27401, 81857, 8268001, 8326564, 41627, 8289332, 8303035, 8253631, 68058, 49059, 24506, 8373301, 111258, 124688, 8325241, 8292785, 8289017, 13973, 59736, 88860, 8331740, 59382, 8258137, 1302, 13625, 752, 8319584, 18950, 104855, 8289092, 4812, 8293016, 8278400, 33789, 8333884, 109406, 8320379, 8309992, 8370738, 8369028, 34479, 13854, 8255876, 53430, 114069, 8308705, 59550, 64061, 8274156, 8275476, 8251146, 5894, 86258, 61093, 81361, 8364154, 78550, 94415, 8326706, 44243, 17113, 8350693, 129920, 8264942, 8353676, 8355107, 8305304, 8337693, 45528, 87051, 78611, 31293, 8348746, 8255816, 79639, 8321584, 8333053, 61268, 97760, 8364174, 8264681], -[118603, 36718, 37214, 33704, 34094, 104276, 8316137, 18640, 8265780, 8268397, 8309001, 5465, 8313300, 8262297, 8353852, 51769, 9012, 75562, 100509, 8251498, 8269897, 8251463, 8319428, 57669, 8370008, 8326533, 8257861, 64078, 20547, 13624, 8317273, 95264, 8259134, 48091, 8305616, 8361611, 67548, 8374352, 41761, 8290440, 21287, 8261804, 13307, 68671, 8260172, 3900, 36401, 16892, 83699, 8257675, 36286, 8284854, 47828, 8305636, 23384, 42486, 9102, 47524, 8369259, 1072, 47534, 25249, 96196, 128227, 8263528, 8253801, 127398, 8329699, 8305894, 8307640, 72689, 48105, 8346254, 84270, 33409, 16090, 8334605, 8371113, 8327410, 8355960, 8323, 84275, 87833, 76429, 8322478, 40491, 8279491, 8294536, 106461, 8374581, 8260789, 109093, 7447, 8303061, 8363195, 66968, 8370874, 8317300, 8276822, 83027, 8363324, 9700, 8378839, 8323399, 65984, 94742, 119906, 92546, 5382, 8287022, 8288058, 8263920, 8376371, 8339589, 8303616, 8357618, 57401, 8253164, 30644, 44129, 9991, 129978, 8312780, 87659, 8323034, 1535, 38942, 118043, 8274078, 22997, 8307729, 87863, 8342678, 8345642, 8262848, 67037, 8288757, 56295, 66815, 114508, 61797, 8264411, 94774, 65495, 8275347, 17455, 8299127, 109602, 36370, 44442, 8379490, 28248, 8325272, 35981, 63696, 8286796, 70376, 39815, 8376421, 8266242, 2081, 48193, 8309918, 8348101, 8345277, 8295146, 126177, 8267024, 15777, 51122, 17148, 8336770, 44981, 70808, 8332438, 35162, 114299, 8249572, 8253956, 8333009, 36764, 92620, 96094, 115033, 8260504, 39364, 74016, 8342170, 79697, 8258045, 80797, 56854, 113497, 13521, 13916, 8291753, 8362200, 121216, 8297705, 8356977, 8286502, 16897, 53054, 8339130, 8318644, 8370676, 120736, 8781, 8364379, 53833, 8318082, 71278, 8366037, 121311, 117419, 8367440, 101968, 8271627, 8257160, 56238, 8304244, 14666, 8296807, 117460, 106661, 99568, 24445, 105289, 118667, 41733, 10471, 121473, 8353787, 31411, 125492, 6114, 110027, 72530, 8253007, 8347327, 62413, 32140, 80614, 8294301, 16130, 18919, 8312095, 8250041, 8266490, 8331052, 8250226, 8307612, 114219, 8328639, 8258802, 8307898], -[90388, 8280072, 8253660, 8371326, 8360631, 59143, 48260, 96013, 50358, 8341797, 128824, 8287761, 41092, 8295282, 8354951, 78290, 77765, 8322783, 8371263, 8262308, 8316879, 8301524, 108075, 8259149, 8338008, 63974, 71816, 44065, 66859, 94271, 69883, 59669, 8376950, 8334474, 17676, 77287, 8360318, 8278726, 20854, 8285073, 48740, 8353301, 59373, 59313, 71887, 73121, 114910, 8362703, 37783, 52206, 79841, 116223, 23436, 81299, 8251755, 24621, 3446, 8369825, 8314670, 8366645, 68158, 39556, 121992, 8253427, 8299389, 8298443, 8280292, 57331, 8274456, 29521, 8374799, 80287, 8271685, 8342362, 69114, 70180, 8285011, 8367533, 8281882, 24269, 86195, 8254438, 30362, 95020, 8337699, 8377446, 8341081, 100013, 8361402, 8324078, 8310629, 9546, 8361054, 8282394, 55822, 51627, 106445, 8333466, 8282086, 52080, 26876, 8268273, 34475, 87499, 82541, 8294962, 8322244, 8362210, 8254533, 86859, 8378142, 8291529, 81457, 64054, 24474, 8331256, 32642, 8308501, 8337371, 34054, 8331115, 8341989, 22378, 3472, 8309735, 61978, 8250562, 8288729, 8347850, 73322, 104585, 8257565, 40337, 58117, 14370, 96010, 38328, 32756, 114203, 8338670, 60485, 46621, 90645, 8270696, 8251283, 8354447, 124708, 86748, 8377138, 8288848, 8349845, 540, 8279470, 8272653, 16277, 8307575, 8262636, 8312259, 8320828, 8378402, 8326529, 8349014, 60262, 8312654, 112566, 58436, 76958, 8374531, 23712, 8278962, 100199, 43613, 23074, 8369142, 8334143, 126232, 8367389, 66973, 36936, 62291, 53278, 8329624, 8348428, 116444, 61711, 8300106, 87822, 18400, 8342184, 57463, 94059, 130628, 8377283, 8360070, 8286090, 8362870, 8266499, 8293629, 8259034, 99186, 8342264, 8268147, 8375471, 6642, 8380201, 70256, 2753, 88910, 8319209, 8289142, 60173, 81678, 44000, 8373089, 8336063, 122694, 102374, 8372706, 8263443, 8280660, 35303, 46220, 126811, 3648, 8372091, 8287800, 8360998, 67363, 8330499, 58472, 48517, 130596, 13417, 109082, 8262649, 8357409, 8368344, 90766, 8339319, 73070, 8335297, 125392, 8267242, 8299021, 9921, 122250, 8332468, 8286493, 98387, 8335156, 7432, 8340171, 88730, 41862, 24839, 8333898]] -||z||: 131017, ||z|| too large -r0: [[3371, 17243, 52804, 41330, -12112, 60020, -31160, 47793, -53327, 49686, 19834, -89339, 36409, -94156, -84421, -79529, 72620, -46751, -30158, -42679, -15562, 49143, 37885, -38339, 35228, 7957, -94482, 11316, -81808, 44582, 2547, 73271, 57275, 51810, 51157, 43224, 60478, -68463, -63131, -83789, -79010, 91800, -56675, 52541, 76290, -1250, 5076, 66061, -74276, 23858, 68012, -24619, 67365, 68529, -61520, 48603, -62942, 91229, -89046, -56978, 45134, 9866, 27520, -26595, 21556, 7862, 2076, -55488, -19213, 44365, 36883, -18347, 76937, 83703, -76489, -4137, -12724, -90509, -86561, 35228, 33010, -46078, 81214, -50274, -54222, -30225, 85986, -11493, -88354, -8950, 52068, 74093, 83350, -9113, -88362, 21620, -92231, -32267, -75305, 14494, 439, 92228, -84757, 22172, -28511, 60643, -19448, -13148, -73473, 59021, -9525, -3837, 57510, 39011, -1837, -74572, 78979, 1351, -44675, -85237, 55284, -47681, -14762, 72875, 37005, -88380, 447, 31253, -42010, -54135, 59569, 20294, 17997, -45199, -30670, -12939, 43248, -18964, 18251, -50419, 7546, -84131, 39560, 18836, 15019, -56409, 57490, 6155, -8718, -87290, 18432, 71479, -36055, -45426, -63686, -51597, 52637, 14607, 94739, -76346, -35844, 90616, 65249, 81567, 5070, -70038, -34349, -87583, -85246, 11851, 4631, -85793, 78272, -15861, 74351, 34162, 14066, -29184, -3743, 80819, -44004, -85705, -42481, -50012, 33157, -91023, -8077, -664, 56460, -46534, -94189, 71993, -7640, 52640, 39442, 71177, -18427, 24423, -6028, 41798, -68556, -15882, 86892, -14920, -23354, -65289, -92844, 58531, -60545, -7210, 56272, 2971, -13581, 71139, -70914, 54292, 52121, -41106, 81359, -11715, 12285, 53717, 37268, 84475, -36664, -2358, 43084, -74728, 44882, 13848, -72707, -16747, -66218, 88802, -58567, -55809, -63310, -48524, -15064, -1362, -26131, -51490, -27796, -91334, -31053, -4773, -30394, 22487, -72045, 65764, -2263, -24299, 5914, -30467, 74829, 57945], -[-4934, 11051, -68294, -17945, -18606, 54029, -55444, -80773, -29827, -32321, -58312, 31007, -44350, 75678, 82968, 56716, 88038, -70948, 61085, 2314, 23122, -55981, -13750, -10773, 35672, 64829, -74388, 14383, -69874, -49439, -66363, -37546, 28394, -84290, 22219, -28830, -84014, -13755, 59878, -74518, 2501, 16551, 53548, 19700, 48977, 95102, 16861, -85955, 22373, 54131, 94277, -19495, -40539, -363, 38964, 43748, -7296, 10663, 30789, 82405, -74378, -77525, 75792, 48004, 53457, -92110, -90147, -77511, -20779, 59020, -26565, 28918, -69541, 85364, 48785, -12300, -67077, -29070, -71758, -80895, -23689, 15934, -64036, -27297, -17954, -3600, -15916, 31037, 85543, -68995, -6764, -13496, -13725, -6859, -44654, -39816, -14454, -68519, 48286, -30262, -81454, -37516, 572, 53074, -70724, -47276, 33654, -21773, -89136, 64359, 66663, -33507, 58690, -19363, -46846, 67361, 45933, 56194, -25437, 7224, -8394, 39729, -9737, 29320, -13532, 73406, 83921, -4070, 20827, -91562, -13357, 18429, 12515, -80533, -82275, 3356, 89881, 8174, -19016, 47875, -15817, 43187, -475, -56104, -13116, -68505, -40716, 26326, -6922, 23926, 33480, 37803, -75442, -76200, 38038, -91481, 39131, 67558, 59782, 21734, -4113, -46472, -23272, -73225, -20800, 11133, 83338, -15726, 66177, 23387, -44739, -7452, -63317, -23416, 91517, -40490, -42676, 38744, 64544, -50679, -94205, 74218, 12112, -70904, -13411, -7637, -36827, 68048, -30702, -30667, 38485, -74588, -42557, -44984, -94277, -45147, 18469, 27322, 79366, 79432, 10941, -5683, 89004, -12212, -42031, 50686, -92814, 28569, -54303, 7192, 15847, -36137, 93750, -91092, 39426, -91154, 62939, -45956, -1989, 88882, 34231, -7894, 46210, 38895, -2667, -48136, -85784, 83409, -90497, 28778, -85805, -68394, -48914, -62955, -10560, 54906, 23507, 48856, -44910, 23746, -83869, 28140, -79756, -6516, -38154, 65710, -10418, -44116, -68160, -27105, -59941, 31929, -8663, 55531, 12646, -16045], -[32357, 2141, -31354, 85606, 27403, 51669, 26476, -15984, 57080, 78699, -88699, 28483, 27916, 49276, 76637, 2818, -47988, 21362, 88140, -61597, 58461, -93262, -94981, -13332, -53580, -70470, 30026, -6852, 71678, -16750, 66980, -69375, -90102, 32307, -74971, 2668, -54088, -86279, -64640, 89790, 26637, -49938, 54783, -78065, -80591, 13770, 50803, 69444, -38922, 81234, 27980, -25446, -24763, -51797, 77439, -14382, -62709, 81397, 53899, -38653, 27844, -64890, -57896, -37700, -19434, 19420, -12975, 40236, 13758, -48069, 13752, 53093, -45270, -39850, -45849, -63190, 53920, 17870, 69780, 89588, 6832, 76404, 87249, 73359, 76996, -48625, -90378, 56937, 7366, -94502, -47582, -64806, 79623, -61107, 84730, -56766, -45763, 49745, -88335, 24379, -61602, 89141, 14703, 81140, -59319, -10319, 91432, 59227, 67433, -41148, -23768, -19928, 20128, 16770, 94165, 35178, 36732, 44568, -30083, -68223, 12740, -37395, -47265, -14265, -14413, 25026, 1629, -33405, 48151, -33268, -26613, 72517, -7276, -95174, -51608, -17559, 8540, 93790, -48776, -55453, 66342, -77262, -34975, 86478, -47393, -40072, 36917, 24286, 82796, -63986, 72395, 55751, 90674, 38396, -28915, -36748, 66629, -17960, 29595, -78436, -61539, -47348, 22953, -52438, 74280, -59403, 56949, 82650, -54677, 73273, 6016, 27180, 6497, 71764, 77264, -42459, 4136, 85265, 17098, -58136, -73510, -77414, -53443, 50439, 54184, -1972, -89215, 54215, -34940, 27431, 17075, -55238, -14363, -22688, 45391, 79060, -7227, -52481, 93445, -11942, 91128, 30824, 41278, 1965, 4857, 40022, 46150, -63736, -40201, 53478, -79400, 61427, 92483, 15989, 84683, 74723, -27702, -56414, -27922, -47204, 48022, -90354, 20937, -45149, -83638, -91062, 43219, -28564, -13985, 14845, -75516, -1532, 6788, 91132, 33213, 61016, 56792, 87982, 63139, 24333, 9718, 84808, -49604, 68397, 40890, -53309, -56170, -10956, 14017, 24982, -70932, 70893, 92869, -44945, 45101, 55742], -[53822, 66387, -72829, -29671, 29699, -53551, -5383, 23893, 43322, -85978, -10387, -88018, 46922, 51897, -94879, 18117, 46483, -82215, 82978, -87509, 48072, 31804, -44755, 47869, -61751, -80433, 48660, 77488, 62839, 5770, -68777, 9527, -34092, 61950, 53446, -11719, -65699, 19254, -19840, -80135, -24262, -52772, 64391, 19199, -66002, 79748, -34955, -62304, 5754, 30250, -54990, 67870, 63874, 91480, 28457, -43070, 4771, 66695, 53945, -29705, 32119, 72143, 60250, 28236, -5399, 72024, -90825, -64641, -31548, -69433, -70144, 13645, 72378, -31681, 76296, -50412, -31606, 56597, -32143, -28426, 45719, -77404, -79117, -19627, -65363, 19748, 8181, 18298, -63513, 3555, 12344, 79644, -87165, 55364, 84411, -61136, -45426, -54989, 29475, 77214, 60438, 44165, -10431, -66395, 17583, -43013, 19264, 14443, -26826, 63686, 9018, -4738, 21990, 28295, -10307, -91306, -116, -85349, -46510, -32425, -10627, -25548, -9712, 52007, -80193, 82563, -32278, -7347, 5737, -77655, 18132, -72070, -2712, -8240, 19882, -80748, -43493, 83306, -64550, 44853, -47408, -84422, -691, -67512, -29795, -36073, 3994, -81633, 56621, -83729, -28150, -52812, 20289, 35399, 78345, 6720, 92402, 26625, 4691, 14566, -73047, -27725, -34115, -5172, 38625, -70578, -7755, -67703, 53024, -50974, 42960, -63991, -48256, 70125, -22979, 95137, 41883, -79736, 38538, 89613, 11038, 93518, -63724, -75686, 356, 76145, 54907, 62431, 12931, -28264, -84712, -54108, -16363, -7397, 6886, 56498, 44932, 32864, 5912, -17886, -39120, -18253, -14582, 56044, -34547, -66281, 7929, -29410, -62216, -93914, -60101, -78208, 84628, 38833, -11415, -18663, -92191, 44585, 80067, 9426, 33765, 68521, 12965, -42950, -49492, 26398, 18039, -13077, -28769, 80679, -10291, -17336, -85828, -79108, -84214, -63986, 7221, -65496, -26239, -45181, -6121, 95036, 83802, 12065, -37869, -7294, 87827, -51284, 47817, -39071, 72394, 54009, 42699, -2201, 32117, 56668]] -||r0||95174, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-30934, -73939, 10117, 113716, 128867, 2954, 37123, -54489, -55691, -23532, -55759, -54298, 104141, 63192, -94715, 122164, -64091, -527, -43484, 117828, -77254, 85589, 56958, -73712, 63207, -83102, 58446, -107246, 102229, 20590, -118173, -42248, -67302, 50633, -62448, 129846, 114943, -120346, 26168, -49765, -7621, 30294, -94552, 2490, 95068, 86399, 65942, 34249, 40922, -116497, -106573, 17210, 33018, 6240, -87093, -129093, -86366, -113135, -43890, 17105, 19007, 118237, 22646, -72055, 17759, 38430, 40913, 124879, -33958, 125427, 127813, 59983, -102278, 115947, 92460, 8419, 58352, 27895, 55880, 115653, 67784, 115140, -56885, 86723, 42699, 115347, 118322, -11583, -41920, -127553, 22859, -105771, 84567, -8912, 14579, 97501, 116597, 2834, -84039, -100059, 13455, -50684, -98679, 113651, -860, -108658, -8569, -37605, -6267, -119419, -82681, 111551, 95612, -13180, 19723, -31726, 69797, -49341, -110931, 65383, -41132, 62557, 82142, 96800, 79418, -47169, -70907, 22628, -5742, 80481, 25412, 18326, -88363, -63266, -118455, 13396, 88233, 103284, -124131, 64215, 33074, 3376, -26811, -3464, -109360, -87047, -55494, -113465, 78346, 126456, 42065, 48997, -52505, -66422, -110467, 72376, -128208, 38325, -83785, -70130, 91712, 118754, 35616, -35479, 115082, 26080, 48439, -92341, 67151, 35288, 66122, -17670, 40647, 20394, -20199, -99928, -36290, -62485, 110436, 24472, 83194, 66670, -58613, 29052, -75277, -85749, -27823, -100933, -122222, 115643, 49570, 54229, -4353, -54083, -30367, 14845, 52326, 49453, -86288, 27514, 80249, -23630, 27905, -17257, -94847, 40898, 30657, -82668, -13650, 79318, -20152, 115005, -20640, -38465, -1832, 125228, -22254, -7378, -63882, -8548, 103023, 121400, -28296, -41240, -62822, -122246, -130281, -13809, 33289, -44592, 79349, 30751, 118537, 101787, -42915, 73887, -91607, 117442, -140, -130297, 32121, -37501, 47628, 116213, 130011, 30945, -60621, 51249, -40249, -64984, -73984, -39271, -55618, 33107, -18359, 19318], -[86577, 108999, 16222, 71673, -127580, -97698, 24527, -59801, 74621, 49489, 20500, 8100, -522, 105561, 77773, -113463, -119880, -54943, -45637, -90309, 18470, -86105, 104438, -130679, 73105, -83404, -13002, -74561, 110770, 87360, 58658, -76737, 203, 2927, 54476, -87326, -130631, 65499, -58266, -52989, -7306, 20723, 86535, -88796, -40129, 31494, -21420, 14340, 64443, -13493, -28125, -119947, -11015, -71201, -84264, 89516, 40821, 36236, -53380, -106363, 88732, 97602, -95952, -47712, -73102, -28240, -90964, -20169, -54215, 55974, -50822, 65728, -123147, -128660, 51003, -40235, -93159, 20347, -38860, 52383, -25928, -86183, 40869, 19393, -116874, 310, -51693, -47225, 28141, -100196, 107412, -27745, -45489, 19595, 10979, 21935, -50395, -78201, -107599, 40859, -16948, 51721, -112139, 74671, 69038, -124204, -83990, -49871, -35072, -73716, 86916, 53719, 72034, 84076, -3810, 40065, -86937, 25587, 91003, 26798, -97219, 81956, 31628, 73844, 79683, -306, 90702, 107716, -61004, -126656, 26348, 96941, 39514, -108150, 65492, -78364, -93849, -66820, 115471, -92814, -83068, 118891, 31578, -74892, -54809, 33279, -63281, -47647, -47412, 114172, 122755, -68997, -104419, -91664, 128754, -57252, 28309, 89235, 29224, 75797, -40158, 88889, -3716, 76164, -68710, 35812, 11684, -16026, 51895, -11082, 80421, -61197, 121333, -60107, -127376, 84399, -47503, 90039, -71728, -86594, -108134, 5210, 46574, -33856, -14877, 98108, -47327, -8221, 80556, 124050, 20790, 58100, -31646, -119675, -83480, 61216, 82580, -51631, -120542, 87385, -94002, -7991, 103168, -29812, 52523, -90776, 91128, 63864, 39135, 17513, 34005, -28366, 49127, 25140, -44781, -75878, 9770, -28897, 22079, 92773, -118840, 96654, 66978, 63754, -75131, 19758, -56684, 42113, 121894, -90386, 56455, 62841, -99146, -118973, -114779, -88362, -49634, 110456, 10676, 58199, -72269, 58384, 13577, 66930, 34417, -63091, 13692, 2476, -47828, 101976, -124925, -49396, -76234, 29332, 76040, 2503], -[-19533, 2019, -87932, 44741, 25991, -70772, -23076, 112153, -7838, -63413, 6057, -81829, -29066, -37200, 89505, 37520, 23869, -95301, 122012, 119090, 98476, 121074, -1719, 109670, -51339, -20389, 52278, 19203, 93774, 76204, -59447, -92013, -110706, 68504, 59080, -65195, -2542, -77205, -121714, -98202, -10049, -14692, 86978, 107750, -40245, 38973, 58537, -114241, 44055, 127191, 56111, -21574, 58246, -85945, 124687, -5192, -68759, -98379, -126487, -55738, 31086, -75568, 77869, -14223, -87507, -18041, 22835, -129959, 109218, -21103, 84297, 37058, 112127, 111074, 70548, -116933, 30704, -129646, -36923, 34980, -100625, -63407, 55535, -8531, -57910, 117889, -32418, -20613, 110301, -123271, -15373, 130319, -124413, -41593, 48459, -89401, 50387, -41874, -82722, -24696, 83124, 81170, -33331, 25941, -81536, 21507, 118827, -127053, 18417, 6676, 3869, -17030, 74549, 48622, 39440, -75, 2278, -15437, -58265, -104781, 129969, 33641, 5521, 36027, 19957, -112852, -73912, -27471, -12942, 120304, -43571, -23947, -117404, -57758, 7867, 33996, 5211, 38646, 40885, -127637, -12755, 89164, 21749, 23561, 106192, 63237, 20883, -32984, 94587, -11385, -82321, 18889, 14468, -102725, -33456, 46943, -116258, 97263, -5889, -5908, 102468, -27837, -9916, 62479, -62461, 92440, -41283, 129764, 130004, 59577, -21020, -92822, -128624, 54422, 122569, 14682, -39429, 37637, 43573, -105622, 103333, 106770, 38732, 51654, 25062, 22930, 94484, 121148, 66986, 114888, 31682, 72143, -3346, 106332, -5907, -47876, -62296, -3080, -33113, -44041, 63993, 49168, 38737, 10593, 93463, 22336, 57525, -79224, 73478, -58193, -59763, 109958, -94159, 71875, -121353, 113454, -101429, 17662, -107673, -128740, -116689, -22839, 92960, 63015, -74644, 110515, 86426, -53014, 64612, 17918, -101708, 126894, -105958, -72566, -97280, -97092, -88434, -88136, -58738, 117304, 120189, 68661, 2922, 93072, -127476, -114279, -124644, -38301, 30522, 46259, -78257, -76203, 100272, -99075, 48994, -46207], -[65906, -23452, 97072, 90565, -109303, 10812, -60348, 79474, -113709, -22277, -54355, -106394, -14884, 113845, 11651, 20755, 93144, -10467, -71452, 16222, -117984, -117462, -129594, 120014, -29694, -12463, 9384, 36180, 113639, -116102, -13627, 96407, 82965, 125892, -50621, -33074, -28860, -89709, 70662, 101177, 93240, -41676, -88018, -26388, -21048, -30756, 39529, -112952, -87621, -40597, 96216, 85594, 40581, 60992, 31870, -36952, -6344, -91870, -37385, 118216, 34011, -610, 83277, 31295, -45527, 36680, -69161, -32895, 122565, -24081, 21517, -93408, -64084, 98551, -27427, 34618, 38327, 100738, -21196, 38661, -110813, -60388, 90040, -13136, 79955, -71914, 50274, -73036, -122431, -111191, 97773, -53735, 40000, -32359, 20671, -8880, 96055, 3990, -13525, 126823, 117983, 117977, 86350, -96799, -53538, -18335, 45232, 118712, -81792, -119885, 127607, -111024, 59137, 100768, -123674, 118776, 120736, -45822, 22190, -52218, -95923, -85344, -4214, -123675, -59879, 45232, -33082, -107377, 26507, -48656, -114224, -76534, 116414, 50359, 80625, 91904, -22365, 87761, 94195, -62645, 92330, -50964, -39941, 8188, -118233, -93309, 122724, -8821, 20268, 20704, -95375, -28224, -88492, 16729, 46504, -118640, -125225, -68843, 106027, 30794, 97693, -22526, 67985, -6135, -20289, -104935, -48710, 53460, -101857, -16160, -53016, 62382, -70843, 89239, -111243, -91998, -27635, 58807, -18486, -108294, -14726, -49249, 94675, 95042, 124761, 108224, -103556, -89496, -83132, 51768, 63995, -107009, -101499, -72700, -117208, 118553, -114347, 41629, 12130, -60330, -78634, -30012, -36942, 128427, -127299, -95292, -2698, -23625, 97098, -13816, 150, -103914, -21139, 126524, 107303, 111485, -25461, -32000, 9356, -116383, -66691, -127507, 1921, 113462, -60617, -103759, -100247, 103205, -66997, 47803, -119068, 18776, 109033, 12218, -3590, 108343, 19374, -48743, 81402, -43906, 72953, -77627, -23917, 77358, -4482, 49684, -1993, -81455, 117638, 110370, -68138, -110814, 7900, 63796, 86350, 72295]] -NTT(y): [[4952836, 4758985, 4880291, 6215354, 7502055, 3359535, 2100082, 3751831, 6321015, 3500034, 6093736, 283428, 5114270, 2411694, 7905101, 3328331, 384489, 7771348, 7440665, 3826594, 3558279, 2012264, 1060375, 7532245, 4026935, 8335495, 3475989, 1271330, 2820397, 1079968, 4363706, 4924470, 5169959, 4765924, 2624748, 3739441, 2799010, 8278423, 3626210, 1894585, 4721756, 3413145, 5100704, 557563, 6930831, 4873779, 5765257, 2652106, 3558047, 2511702, 545068, 6391573, 7902520, 907582, 452365, 5838117, 1967221, 4366540, 6722876, 3964261, 4807854, 2040708, 2096986, 3760989, 7066200, 1743616, 6876666, 8143113, 4620929, 3174216, 1023483, 6179448, 6857507, 8036015, 241664, 8199268, 2116273, 8123757, 2039888, 7744353, 4227623, 5290763, 7510214, 1828122, 4175591, 2664662, 6120220, 4793455, 2115737, 758086, 8064372, 6442303, 2071763, 2792639, 4615795, 6223465, 3776615, 8286707, 2083958, 7259678, 1107122, 1342560, 5815825, 425736, 2753357, 2978427, 7466361, 7018813, 8056383, 4365093, 6262971, 1310584, 4653478, 7568133, 4784278, 1122282, 5967839, 6330915, 7472297, 7205878, 848360, 2670112, 2497737, 7849124, 5733767, 4677785, 3077701, 7476463, 5055688, 332827, 4406022, 8129692, 6922478, 4553144, 1132235, 2731648, 4250795, 2095408, 5911184, 1573771, 4049764, 2317346, 675512, 7763594, 5448966, 3496787, 7477472, 703127, 3552250, 2856446, 5091424, 3232487, 4294995, 4960895, 5485690, 1110034, 3025121, 4148853, 5394069, 6395429, 4343784, 527655, 3750336, 7128672, 3250730, 2260989, 3541647, 2426348, 5966983, 4558590, 7537411, 3539826, 7960721, 3693579, 5851144, 6523189, 3243237, 4692339, 3350561, 6333775, 7422663, 6735151, 3587669, 1957153, 6251861, 7717375, 290094, 2904894, 308952, 2947174, 4368670, 5783706, 7242988, 6141739, 1254743, 8090906, 6421959, 2357957, 580598, 2502770, 5411964, 3251752, 6614347, 6714865, 1451922, 5718026, 2479672, 388466, 1080782, 1561901, 3188758, 6416158, 2437968, 173426, 4753047, 4735723, 1663710, 3722901, 2060105, 1365734, 6828049, 7274125, 3261049, 4623858, 356782, 6851189, 1962658, 1452481, 425394, 4461238, 6987419, 1860442, 6217566, 4292840, 7904225, 8170255, 6562720, 2089033, 497219, 4611602, 1772992, 4456523, 3989498, 3637175, 3635620, 5278222, 1955618, 338315, 8377232, 5277553, 6004361, 2133264, 7769120, 563656, 3179762, 4120611], -[839695, 7867049, 3876023, 922579, 2503610, 5982783, 3325003, 1778322, 3845694, 6805159, 2763914, 335335, 1431194, 2032329, 4409590, 2682770, 5044719, 3629277, 5290959, 2990040, 7224181, 2234431, 7055956, 1303414, 630067, 6264661, 6468361, 3360586, 3267063, 3036501, 3534669, 7491813, 647527, 7819455, 5356515, 3088213, 6537100, 4993463, 4536996, 6540646, 7855374, 116548, 4175082, 6913228, 3932139, 5385021, 7294846, 3811509, 4936378, 7200615, 6558240, 3877189, 4746811, 4622950, 1123058, 2291340, 1631659, 5716370, 2457028, 3321727, 3756687, 3004426, 1628131, 1545479, 4126706, 6370966, 6399024, 6097717, 3684604, 3820185, 7172136, 1229742, 4110892, 1702534, 5538189, 2055363, 6923885, 728777, 7200705, 1695007, 1474917, 7344989, 527770, 685109, 2981957, 4423471, 7572169, 7210612, 7209549, 7587204, 3263244, 7915149, 1386126, 1780792, 6732197, 7458363, 6562166, 1826371, 7896216, 1279645, 6626695, 3469575, 4967433, 6206886, 4076050, 1403497, 958333, 8369950, 2250497, 4097720, 2616899, 7366985, 484173, 2157886, 4267398, 1202297, 6250823, 7115820, 2309248, 7681012, 1547534, 6028164, 4075723, 8159376, 1457825, 6830602, 2095548, 2831261, 3422024, 7439969, 1029533, 3998666, 4793280, 6783278, 4889004, 1716483, 5316507, 6025195, 6411242, 5915333, 2278728, 3143991, 421275, 4621405, 6082544, 8048537, 4279798, 7118714, 5838696, 6582187, 6247359, 4493448, 7325401, 7496280, 1894959, 6402959, 8281510, 6155379, 4937986, 6366360, 52798, 7868584, 8080913, 7850915, 7914785, 7904585, 8228602, 3187177, 8263716, 1234061, 4641758, 2622139, 5948559, 4993848, 4045115, 117150, 1890444, 1694952, 2594030, 1061237, 7337737, 347006, 1437503, 5301545, 6782001, 7538791, 7169568, 1095559, 7405808, 6776601, 4246760, 173558, 4624590, 7183427, 1876481, 3695073, 1651111, 7671467, 2452202, 2157225, 1782401, 3363787, 5054300, 201555, 5234375, 3433779, 2883279, 3238510, 5530951, 4965642, 7866708, 1315181, 909086, 7246417, 403840, 5403978, 1238034, 655271, 7948507, 7463222, 6520934, 6496508, 484593, 5644460, 5416074, 740362, 1335185, 3773694, 6657633, 3503547, 5157033, 3280377, 4714836, 4696526, 167422, 7196424, 6316585, 198975, 4258632, 1024650, 6049740, 3935164, 2250816, 2889300, 8332581, 6895970, 6264532, 6638210, 6793233, 3326281, 1877631, 6858083, 2350289, 3702560, 4346826, 5976867], -[8031885, 6166237, 4608356, 3476158, 4753718, 1135219, 734875, 805332, 8075847, 6586331, 3455563, 1804858, 6011497, 2311424, 8027603, 2428354, 3946427, 1945150, 5528804, 6663870, 5429612, 4740547, 1284857, 1877833, 7277337, 3716130, 1317179, 6850960, 7396384, 6731738, 1360345, 4753344, 8195424, 1192434, 7467949, 6494997, 3006304, 5752025, 7371870, 8077358, 83102, 5190838, 516889, 6008650, 8154948, 1159001, 4570243, 4776954, 457568, 2437622, 2015152, 262002, 3280955, 8119588, 6028113, 6571056, 6476612, 647056, 3893345, 1083139, 3031594, 3818232, 7512602, 1950594, 1729079, 8240750, 8360014, 4750747, 7459229, 7358514, 5500759, 6624639, 83631, 5284887, 4357472, 4870416, 76170, 1879442, 5739246, 127928, 4089742, 2390110, 1825420, 867953, 4112618, 667396, 503999, 8010357, 5432922, 1282819, 5820751, 7972708, 1957088, 7505920, 1397402, 6404610, 343603, 973404, 8068202, 582253, 2652862, 8246025, 3747227, 5531177, 4620135, 2527193, 2146298, 439230, 4546251, 3237954, 5909117, 7998754, 7697045, 4699800, 477259, 5908682, 5149015, 1719216, 3135625, 1125063, 1309764, 5974984, 860432, 7039862, 1915892, 5980484, 1921431, 4871735, 8362282, 1085384, 774768, 6296499, 627610, 1398100, 956818, 4704993, 592416, 4609203, 4237512, 3418754, 5572214, 4997475, 6070648, 3362627, 2061469, 2308202, 2439081, 7391325, 8192696, 8344767, 329692, 7357639, 7698380, 2284855, 6245727, 7621433, 7509627, 2716665, 7334200, 6478407, 1199555, 6321656, 192318, 1764734, 562576, 7572876, 375342, 4878479, 2568311, 1592007, 1397856, 6471821, 6893285, 4089122, 8064236, 2287902, 4748577, 118671, 3446719, 3328072, 6393190, 965533, 5975854, 6160564, 1523202, 1491564, 7904579, 5545537, 3181509, 8147880, 7020487, 130885, 909161, 1743899, 2566756, 4807318, 3311421, 3045763, 6669473, 3826586, 8302417, 3480454, 2716903, 3782684, 1646547, 2231413, 4440602, 5211872, 3968887, 7244111, 2777899, 2164929, 2571569, 7979116, 3501807, 4846957, 8214223, 425567, 3843056, 7497219, 2513606, 7686409, 6768940, 7390327, 2162652, 5242529, 1129108, 3291060, 6264645, 7105454, 1905940, 4247225, 3341444, 7792791, 4319758, 3403465, 6096396, 8293241, 6882923, 2700360, 5724543, 1588401, 2313458, 4135277, 917315, 1819548, 969019, 4858375, 1515308, 1099178, 436000, 846369, 758745, 4396205, 7940289, 4772113], -[6730386, 780226, 683581, 7188491, 2915393, 4800626, 1763926, 3610822, 7307737, 6814873, 5045310, 6324143, 6150199, 4904627, 2010115, 5148474, 2648585, 2395318, 7067012, 201257, 4436815, 251101, 1387994, 6085721, 2294319, 5997015, 7749864, 3636740, 2857492, 5796364, 6577028, 275761, 4900332, 5345009, 6254093, 1469944, 1584681, 71389, 7489872, 5269968, 3201287, 7605560, 8077197, 5062024, 50666, 100439, 1020878, 6712034, 4240159, 1520641, 4049, 862850, 2099357, 813954, 3615471, 14779, 6491150, 4584489, 7781500, 2465192, 2529253, 780153, 732715, 8083887, 4659650, 1672666, 8302551, 3505745, 8192349, 2670825, 3122753, 1714534, 8237058, 2667977, 874597, 7310010, 839424, 3092419, 5891979, 2914202, 2129932, 3368071, 1401327, 7837635, 6301483, 1389177, 3586605, 5785863, 7316376, 308764, 6649115, 8249731, 41934, 7640121, 2947011, 4204431, 4308205, 892991, 8173913, 350678, 2771795, 6029159, 7941030, 1208928, 4635209, 606261, 782907, 2385264, 1957103, 5007317, 4652008, 453275, 3625797, 5384989, 4977147, 1657802, 5980006, 1311057, 7006512, 5656673, 1389217, 3537483, 7077424, 538579, 2914184, 2164093, 1238647, 7344341, 1910445, 3315244, 4680306, 2195202, 6452652, 5434217, 8177754, 2409850, 442776, 2577860, 6563956, 5656955, 1859557, 5082769, 3410489, 7041370, 3647164, 4864139, 2721008, 4482142, 1726764, 5945138, 5483190, 6303610, 3510026, 7133760, 5983970, 3242689, 7423420, 2668553, 3785521, 1670720, 5231230, 7195900, 3338376, 5444058, 3543692, 4377174, 4112413, 3419530, 1222008, 3709602, 1767047, 5779650, 7705468, 1431984, 2362733, 2284688, 4723265, 1131429, 3826304, 5378024, 4364846, 8027451, 2304353, 4688839, 3744749, 5562633, 3269286, 8130160, 6258074, 7158387, 1587311, 141414, 3065179, 6386113, 845859, 876991, 5097576, 3749194, 6643011, 2637172, 2978400, 7115291, 1444159, 4027562, 410081, 2422211, 2276037, 2823179, 3593237, 2556049, 1899411, 2819316, 4915160, 687208, 2440626, 8324387, 7220542, 2012079, 4153788, 7536563, 5758195, 1254376, 7763564, 1225011, 2750564, 4437945, 6179335, 5241762, 1047797, 5818903, 1936751, 6216630, 3661633, 6197642, 3551532, 921744, 5366452, 5971446, 593391, 2182359, 6352401, 2795295, 272162, 2775597, 619762, 6599369, 3242167, 5909938, 2984154, 816330, 5458418, 2104496, 3162019, 59786, 7418875, 5292653]] -aHat * NTT(y): [[6533041, 4978568, 3370532, 6220292, 3901369, 6214572, 6998023, 716133, 6077287, 3371588, 1641879, 3983513, 3955445, 986729, 6954844, 7808485, 7615992, 4784384, 2273506, 5251509, 1650658, 2689858, 7923026, 6986888, 539118, 5074688, 3073707, 1735510, 3510830, 1438052, 3826115, 966673, 6964892, 111884, 3213582, 3893747, 2527836, 3551616, 7673060, 1003320, 8234706, 4233522, 332909, 2565736, 7983619, 8267085, 5619020, 884872, 5837840, 507974, 4325726, 150971, 654692, 6563968, 6251928, 8234231, 4748927, 3323408, 2142394, 1586430, 3130892, 6631469, 1859370, 7796618, 237977, 443393, 2544291, 888629, 7309188, 6366079, 4932192, 6709741, 5112339, 5976309, 360744, 3395692, 8128798, 2942396, 1283671, 5350247, 4686769, 2885742, 251649, 7979569, 5047314, 5108623, 3840666, 8071260, 7010538, 3035792, 6936554, 7240073, 1612734, 5576337, 805551, 4008321, 8038060, 93604, 1453154, 4673060, 1516622, 1054031, 7381111, 3435904, 4220341, 1896686, 735951, 4793369, 2992738, 4778101, 4073536, 5058825, 3282291, 7912741, 7833204, 6439701, 104308, 1762208, 7998391, 202249, 1975504, 6324511, 5992913, 2437577, 7526985, 5016077, 7878786, 5363826, 4552235, 4256743, 2190020, 5788940, 3017025, 7415010, 8032817, 2659571, 2870194, 7550703, 1012315, 4181781, 4636527, 1916780, 4563021, 3587252, 1896096, 2245647, 8157996, 2362183, 5706924, 2926869, 1877585, 5995487, 8289226, 8263843, 448340, 3130955, 7851088, 6175721, 1467954, 3017018, 7990704, 2753527, 490463, 2827201, 3333923, 6431425, 7167706, 7327028, 6199863, 698983, 5231059, 8002549, 5705935, 1774098, 2722494, 7728766, 7628580, 6086759, 5320544, 6573614, 4662815, 1998081, 1797426, 5137509, 4444260, 871225, 1629143, 6334782, 2681479, 7046293, 1463326, 4576918, 65603, 859158, 3145799, 8362192, 2951433, 3016486, 6616137, 3138220, 2620797, 6281896, 4238003, 4098585, 2369621, 8174965, 1902641, 1700464, 6419015, 4674669, 2181507, 491553, 4239209, 1145563, 4723270, 7774326, 7969732, 1614053, 5659464, 8172280, 6885516, 3244039, 2887656, 8326545, 3807638, 7999758, 4758900, 8216958, 2247160, 7397121, 6447949, 2827955, 4315566, 1258054, 6415657, 1723761, 2204062, 5017345, 6113323, 940113, 6059584, 6765072, 2655110, 242943, 2739807, 6769400, 4867737, 7905510, 7167983, 1433446, 3958473, 7460339, 6248184, 1648762, 4815250, 7661469], -[5997947, 1515225, 4316827, 7998978, 6878297, 2033169, 1118401, 799329, 3581586, 2700736, 1916404, 353780, 2589643, 2689272, 8316178, 7990969, 3515067, 7681249, 2239858, 7340218, 4815326, 5210440, 3007449, 3970808, 7770864, 3080751, 823925, 1750964, 3313110, 8021041, 4595997, 4564024, 2735356, 3993565, 5620570, 6514062, 4285326, 7610177, 1924336, 1701602, 4197192, 2074836, 3966348, 5770209, 34550, 639900, 7000511, 2907050, 8371624, 6917289, 5164827, 1752995, 7568956, 7430518, 7938167, 1238921, 1132712, 7990362, 8080384, 3232477, 7250037, 2461144, 5558690, 955943, 1081804, 3951480, 4718168, 7906118, 8206144, 5950656, 1056402, 4206314, 7872406, 470787, 3374422, 5668139, 7457583, 6123905, 845040, 7244628, 5967207, 3678274, 5026659, 4158636, 186940, 26847, 5081811, 1679161, 1524858, 5159942, 995987, 5799698, 1427642, 6209266, 5259501, 4452578, 1406637, 3450498, 785633, 7088968, 4804329, 7401936, 296325, 695062, 1265672, 7659218, 65723, 5709213, 3085512, 2365205, 7906275, 4347379, 5144491, 4840460, 5199763, 6705552, 2584648, 3672828, 7779005, 5447869, 2114769, 724552, 5848133, 6471327, 1715765, 3540192, 3204057, 6713779, 7885466, 4896144, 2925892, 3116577, 5570919, 4708773, 476331, 1826519, 7254410, 7084002, 3029855, 636994, 2048768, 2058908, 575515, 3818957, 3928357, 5414612, 610676, 3262262, 4131644, 2674051, 6054718, 2094251, 2964272, 7183574, 3893914, 3894991, 6474238, 4897982, 2297344, 8065480, 548199, 6221116, 6045456, 6729663, 117524, 7912726, 67182, 2709431, 5108122, 4565463, 1509894, 6830438, 841070, 937932, 4374317, 7079414, 7647498, 7507689, 1786520, 5533149, 4944611, 117844, 5959493, 4685906, 2653944, 5889876, 7054884, 74492, 6863076, 4829711, 1393017, 1808638, 1723044, 7539161, 6672272, 7621987, 6367885, 4987070, 1410344, 4067048, 5641007, 2507830, 4352403, 3944536, 3895246, 71638, 3080825, 6917472, 4833779, 861545, 3246835, 1582210, 7884942, 6489140, 7160292, 6941374, 5648570, 2707145, 5795504, 3404822, 1339737, 6107571, 6322978, 1340323, 1474437, 6645698, 2916533, 6805724, 2379277, 3062784, 3127748, 2616749, 2813634, 6314822, 8306245, 795843, 7324700, 5763497, 6301867, 1102199, 3154780, 3446743, 1120414, 5416612, 5943094, 6154020, 3613443, 3027822, 2624536, 2175560, 8137076, 1972249, 7181160, 4676384, 848497, 2072540], -[3617509, 1744543, 6429518, 5013462, 4049370, 6049662, 3223344, 6512319, 1960294, 2949491, 2624002, 3293926, 5534886, 3963970, 1618976, 5980423, 7970662, 3850580, 2315007, 3655678, 5123054, 2675918, 851659, 6668653, 6215848, 2728889, 481431, 3814810, 2359857, 7256020, 4970857, 3662691, 717487, 8243713, 601654, 2221267, 7546744, 5362799, 2948092, 1785061, 793984, 3373613, 1942921, 1339477, 3995712, 2574425, 6453580, 3028165, 6733287, 1712346, 3683495, 8258116, 6556403, 3047564, 703896, 3733726, 5019127, 6440936, 3854897, 717452, 6612034, 5159229, 2317009, 7418531, 7043722, 5296376, 1716591, 1366681, 7837744, 7027295, 1119571, 5364443, 2227752, 7377368, 8219643, 3302394, 4559446, 4347118, 5207121, 6033589, 3601493, 4044182, 3566321, 2878746, 2795584, 3862808, 7468422, 6662527, 168638, 6140206, 2866359, 5545890, 4722524, 4835586, 7348289, 8187676, 2172239, 5623094, 3698, 912089, 2796065, 2904162, 7389849, 4614595, 6250389, 2643671, 2427528, 5762748, 501448, 6150838, 4346574, 6666637, 7837385, 4589684, 1280560, 2975825, 4700203, 4110306, 4652121, 1229617, 7950204, 3299922, 2172101, 5110425, 7277322, 3529596, 6572812, 6703930, 4745614, 3876953, 531025, 5392764, 6452704, 1251769, 5768138, 518846, 3280792, 6576540, 5298599, 1574062, 4488975, 5236707, 6746187, 5392132, 1099925, 8005034, 4243387, 1885308, 3500307, 2718258, 7829418, 3860909, 2605961, 2874577, 917822, 5941469, 7536353, 4050247, 475758, 362498, 4136480, 3187160, 4934280, 8277653, 2765703, 4704117, 5386494, 3289580, 2732057, 3589983, 4647685, 1248959, 3504729, 5368827, 6468103, 3224728, 23724, 8139348, 2196077, 3014817, 6444477, 3172156, 7165588, 5473715, 831227, 556567, 2691642, 8209694, 2962474, 1082680, 6062054, 2656769, 8337293, 4838176, 5070631, 4498830, 4278272, 481009, 2961420, 1998678, 7210269, 1167563, 579271, 7821192, 1678175, 6127707, 5810055, 1814677, 169516, 6209804, 2607202, 2837644, 7692468, 6263949, 6590959, 2981974, 4358539, 2516657, 8047161, 7537265, 8096042, 6421227, 7971913, 4415092, 7346681, 6603430, 4130516, 81986, 2047131, 5930216, 4146769, 79330, 8159559, 5217431, 7670846, 158816, 3421109, 3025356, 2561693, 3835154, 6794382, 8224428, 7933056, 2027043, 3930869, 7527392, 7870119, 250227, 5216501, 3377538, 7451131, 3509093, 1864055, 926141, 2393693, 7221180], -[2736242, 1084111, 4997493, 6756170, 2756099, 2198779, 6811484, 8881, 1932126, 339333, 6842975, 3191711, 4641640, 6603589, 5994019, 2990644, 2825937, 3818297, 5574037, 3499781, 70605, 5169803, 7020232, 2637640, 8214696, 2480401, 457198, 8248975, 1143833, 2067843, 4244693, 3505871, 3438373, 6480402, 395411, 4754012, 7419863, 1995519, 2959797, 4174731, 7530785, 8214544, 3744636, 3269562, 1128985, 4275090, 4314988, 2011182, 6713200, 2748011, 5482600, 4547970, 312153, 5490519, 5232676, 1994287, 738455, 1549503, 5319790, 4876027, 6562727, 6593877, 3179311, 233391, 6148351, 6547336, 3297768, 5161188, 2859137, 8278004, 6559937, 4388055, 7608265, 2715925, 1883709, 1087711, 4989029, 215468, 7927437, 4071021, 1485402, 6117668, 861043, 6902985, 822840, 1757803, 6325885, 4881632, 8119243, 8361943, 1651287, 8022245, 685594, 6513409, 5243195, 6772497, 4795201, 1922133, 5395737, 6462710, 4807543, 2857744, 6329398, 7220915, 642665, 3554931, 3482343, 6349378, 2518633, 1884732, 1967909, 6657859, 5199749, 326816, 7928814, 4491839, 328846, 1635904, 3298336, 6067348, 1802088, 3691528, 7479392, 7111413, 3484280, 7607027, 7591951, 3455732, 727199, 5614847, 2567837, 4536582, 5430746, 5119460, 1472267, 1790589, 3208129, 5538387, 1615321, 8189125, 5235068, 1700688, 3461910, 855543, 5826332, 2503847, 1041239, 4066912, 8058283, 728216, 6811300, 1415703, 2425816, 2717949, 893420, 8364841, 6171865, 1004444, 2700755, 4807224, 5027894, 7025361, 1769791, 971385, 7922513, 7355489, 7130822, 3409395, 7557483, 5994738, 4401296, 8020074, 7086426, 3435750, 3003106, 4718048, 4273773, 7465540, 1006263, 4031456, 5817888, 6258636, 7410159, 4892332, 1127594, 7934906, 7691305, 7972729, 1610540, 4405371, 2753329, 6330892, 2371164, 3717015, 5578021, 6775955, 168965, 6102074, 984731, 5109024, 7506252, 2924601, 604747, 7863375, 4675744, 4536907, 7322760, 3613984, 2346417, 5416129, 2288322, 1599774, 530946, 3707368, 7285673, 3532114, 6053470, 1314873, 544698, 3344238, 8245115, 8187403, 1849353, 3161496, 792525, 6566350, 3985157, 303694, 6864284, 5406918, 7019725, 3041689, 1810915, 1477047, 975616, 6608494, 4834862, 7156978, 1959300, 8202179, 2031509, 5412877, 7018347, 827428, 1943304, 3174221, 1942727, 7077316, 105653, 6975485, 4782676, 1140243, 4881573, 7653966, 6326425, 7882916]] -w = NTTInverse(aHat * NTT(y)): [[3162481, 1697673, 4795824, 611569, 5434330, 1733082, 7251102, 4971247, 3910715, 2491782, 6324776, 81764, 2665637, 5536158, 273698, 1225182, 6230352, 7073809, 3597226, 7105208, 1714198, 8268058, 4370687, 4216584, 4389790, 930140, 434608, 7635755, 6653037, 4988225, 1234291, 778829, 7794607, 1618222, 1726968, 8330580, 8181288, 6394094, 273133, 7297185, 4150606, 3325362, 4174099, 2994253, 2846796, 884598, 1933530, 5047139, 4475193, 4730936, 8050743, 5261280, 8308984, 3839276, 5709353, 5743170, 4958291, 5166310, 6277131, 5757650, 2681421, 6960950, 2720794, 2111752, 7558120, 6242284, 5081355, 192063, 4958582, 4402889, 166667, 3428552, 5463493, 5364845, 2201207, 661550, 6637816, 5842826, 3744334, 2840855, 5316258, 8320816, 7934531, 596600, 1541260, 6202393, 203019, 4655597, 2866581, 7949499, 2482488, 6898190, 7232233, 983996, 7867320, 4350042, 3991883, 2151726, 6456207, 494293, 7168151, 5392469, 2838659, 582866, 369227, 4684167, 2925490, 292945, 8048522, 7535096, 6109971, 412070, 153460, 735813, 1787653, 6286676, 2215016, 6076533, 6034893, 4735293, 7938870, 6296716, 6598983, 890835, 1734070, 7033988, 4387759, 4020565, 7398045, 7761130, 4987117, 7903294, 4867071, 1835433, 1202809, 7827136, 3809059, 1867093, 1405503, 4748091, 192410, 2236245, 4469273, 6371849, 9000, 6450797, 637714, 2226263, 2194286, 245901, 4838381, 5383015, 7053864, 7212387, 469359, 1299197, 5481911, 1934165, 8204820, 1886399, 4482493, 7100018, 3790136, 8222512, 2735141, 1055554, 6696326, 4073299, 1855494, 5230127, 7539718, 3450311, 6043137, 2479912, 3379061, 5568654, 8350447, 7017046, 2960387, 1368758, 5033258, 4274834, 4722768, 514652, 2138907, 3335856, 6460563, 5711458, 5130436, 4041780, 6374381, 8118926, 6620680, 4794823, 3732926, 1541850, 6321160, 5960349, 2389128, 304966, 7685913, 5390282, 6614147, 3567881, 2359284, 4042383, 6742777, 7097351, 3331485, 4160548, 2296016, 871313, 764148, 7649489, 6620606, 1911616, 2168461, 686787, 4506565, 1166064, 4429880, 1273926, 1902954, 1986103, 1501688, 4079071, 293800, 6639059, 4142270, 5394062, 157287, 8158977, 6678748, 6410626, 7246992, 6005168, 3389693, 6609025, 7019943, 4503360, 1791885, 3431554, 1815826, 6083919, 1795930, 6629347, 4766500, 7849685, 5763989, 7396105, 2537326, 6773887, 806389, 7377076, 8295050, 523136], -[3153997, 4031653, 7038865, 7254512, 4452631, 3125965, 7383348, 386324, 5578751, 2810907, 6458952, 5201403, 4442585, 2650791, 6851838, 3656515, 2973259, 4153908, 3688927, 4691852, 4773510, 7852874, 6814033, 1149661, 7737247, 5417444, 3941860, 6902492, 5867201, 655142, 2297998, 2668573, 2554486, 2790748, 1813434, 2501316, 2007964, 2079832, 4135629, 2009677, 7599120, 6601328, 4497571, 4078206, 2145832, 7267927, 5618661, 2567328, 3398577, 3537722, 5304652, 1212097, 5813863, 4899397, 7942572, 3406070, 3957094, 5087295, 1827172, 5424807, 8172909, 6773862, 5318285, 5122072, 4801368, 3864005, 1666953, 3485774, 1306173, 3830450, 2354203, 5941708, 6852671, 4530605, 2569131, 2066322, 3700906, 7465179, 1351579, 4222549, 7360666, 4074141, 6811611, 3170457, 2812850, 4697757, 3407930, 439231, 7024648, 8049021, 1650435, 5851821, 1625169, 7074702, 8346385, 7102435, 7196343, 7983186, 553051, 7586606, 5297068, 6769353, 4784380, 5551123, 6064428, 6614331, 4537264, 814915, 5703812, 6749827, 3630454, 4946534, 1393641, 6723099, 3948272, 4457464, 7460994, 7939093, 2598812, 3214560, 2873441, 6757692, 6245347, 7680847, 1800565, 4916421, 6683406, 3692984, 6509441, 6558159, 4393804, 2735324, 656082, 3937778, 603603, 3596881, 4390372, 6352581, 1498026, 5898459, 7858050, 7545835, 7475425, 4903585, 6274035, 5783069, 128349, 2835300, 1546513, 6486974, 4725916, 1071631, 194596, 3712301, 7511426, 2788651, 7163357, 6081381, 5006107, 4140670, 6646324, 5361365, 8191218, 1978101, 3640585, 6766953, 7038694, 5476564, 6540134, 6759076, 6699923, 4962697, 2737528, 5595255, 652948, 2481541, 481017, 1798472, 541300, 2988939, 5620735, 3229075, 6692667, 2560429, 5609134, 5894448, 723654, 1920541, 2923100, 7723984, 610588, 8060276, 6954068, 4648608, 7656760, 3797691, 2458947, 776717, 3304111, 793135, 1213650, 3757370, 4587863, 1211598, 7519996, 260469, 6989509, 3581775, 5635603, 6401717, 1666984, 7310025, 3749345, 7065536, 272473, 1597130, 1565574, 5605123, 2024013, 2664993, 3977152, 3855560, 2948923, 6223197, 4444481, 1429422, 7818183, 5090356, 5014173, 6314566, 7102944, 5922485, 2251416, 4182924, 3268953, 7820354, 4624676, 7209753, 3025021, 4319597, 7580523, 1373988, 5455804, 3955557, 5100970, 1658122, 7849222, 1107830, 3929049, 1090857, 2382084, 1095599, 6329630, 7872638, 6414400, 2232569], -[2963436, 2979903, 3088068, 7043746, 858518, 4524786, 5048396, 4086214, 230804, 7183444, 170630, 3434048, 6601706, 1795329, 55983, 1255877, 5574913, 1999547, 1665830, 4345344, 1010305, 3450932, 4962191, 733985, 3284891, 6592992, 7235943, 985371, 864727, 868805, 4048414, 2813565, 6931467, 217331, 6684304, 4872820, 7300873, 6751150, 3612192, 5250822, 1219400, 4572513, 3017958, 7918548, 3574210, 5254816, 4308171, 2014335, 5548434, 2318191, 1753661, 1957667, 1362582, 160813, 997530, 4951280, 2054281, 6996670, 50185, 686570, 5189538, 5249109, 2505227, 6592106, 2891005, 3172465, 5642, 3403698, 6068547, 4798359, 6581691, 7126364, 5805992, 267785, 3249177, 5496441, 830371, 4842286, 2552877, 6855143, 7537784, 7889500, 4248149, 6841177, 7453694, 46965, 273431, 5196506, 228261, 2349364, 2220978, 6713385, 5470458, 4235833, 7819322, 2879488, 5365463, 4841326, 3403823, 3116431, 1789415, 7240642, 6463952, 2733250, 288192, 2956035, 2126700, 843084, 7160787, 5664888, 4150383, 7861800, 6026947, 3924449, 4058679, 4369170, 5871303, 1549545, 5547814, 4211418, 7541979, 2260456, 715217, 4658117, 2936856, 1606960, 963154, 4764716, 8057289, 1870055, 1875130, 5556883, 250151, 1442676, 2555607, 4685091, 2455952, 313259, 4244514, 3579582, 5073648, 7181649, 957188, 4078761, 3353303, 4781681, 2343266, 8346273, 516210, 2188682, 31163, 2999630, 5695869, 4592789, 270320, 864111, 3362371, 4354169, 6838693, 7763460, 6292976, 6444330, 6837140, 6734347, 1824392, 6424347, 5871839, 3967047, 4811849, 7203411, 6252062, 3021003, 295745, 5465888, 6462849, 4241317, 6571093, 5357391, 3470778, 1209148, 2700068, 5072185, 3992351, 5790131, 4279430, 1045168, 2683510, 7808388, 6937135, 2255934, 5572784, 5510642, 7155299, 1720444, 991691, 8025973, 1776995, 6636620, 234148, 7377310, 4269337, 7475262, 3471634, 4054346, 5339163, 2729100, 6967731, 12988, 6453319, 5722679, 4451074, 6641419, 8083483, 1168562, 4703592, 7745457, 2762398, 3679652, 4737698, 2243756, 3635730, 7749367, 1233127, 2430869, 777900, 8235053, 3142685, 6701803, 2909804, 3969820, 7466783, 3879914, 7129233, 2252841, 1772856, 2433688, 1385158, 4135693, 7493734, 3155134, 6902337, 7993462, 992731, 7388141, 7741518, 3897347, 1713145, 912824, 5833041, 4947070, 6043831, 4714895, 5637804, 3376120, 1972094, 6295298], -[564117, 2182653, 597265, 4126023, 7419452, 6841768, 5621151, 6584236, 1222045, 7948157, 1529042, 1406178, 61895, 1219153, 8095372, 3009116, 2719092, 7653102, 5025797, 6708738, 2496294, 2536696, 1803752, 3614852, 1763041, 6575385, 245002, 4021524, 928127, 3334913, 1641629, 599069, 138828, 4122487, 6255406, 4337906, 194142, 7091076, 4605722, 2296246, 7019235, 8146285, 4420512, 5670937, 2751071, 1085496, 5238345, 4474171, 4102490, 7946402, 860952, 6473783, 3881633, 2454540, 4183932, 8170357, 6172640, 3825425, 1963523, 342234, 179139, 5333874, 6327986, 7438331, 499089, 3539706, 4109204, 2557944, 2464045, 6154431, 4569934, 6177270, 4228500, 6480553, 7610018, 1086139, 4004129, 3777213, 4081863, 2342444, 2562664, 6145977, 5486758, 4608318, 7492624, 7734771, 2067002, 4985989, 7535362, 7646898, 2410385, 6860194, 2764850, 7552233, 902766, 232547, 7054234, 6437846, 5005449, 748563, 5318023, 1533330, 7967926, 5664103, 218361, 6191563, 8145259, 3870396, 2032739, 4332666, 7093594, 465056, 4659524, 4956470, 5122082, 5096617, 4823880, 1527384, 2454247, 5224144, 5217035, 7025589, 7741687, 4664510, 1265760, 743016, 68202, 7324610, 3284588, 4778742, 659942, 3220432, 5065790, 7544252, 504434, 3739831, 4886617, 410155, 354020, 4062136, 1471261, 2046530, 3048508, 2165892, 3666984, 6373277, 1089626, 2527809, 7128059, 923179, 7168452, 599150, 3403495, 1197486, 3503915, 6078943, 4448956, 5232530, 7359573, 3881643, 5152836, 3583441, 2682710, 5543775, 8355621, 8106138, 5449988, 2012580, 1070099, 5130775, 6903194, 7263829, 466339, 5292695, 7358722, 2185122, 3517624, 1489106, 4913853, 327537, 2829981, 7493266, 594293, 7469633, 4337828, 2298362, 6169957, 7129888, 753113, 3479672, 3588978, 1882706, 2001372, 513211, 6268032, 7715072, 2434641, 3516290, 2362936, 5448571, 7382685, 3458298, 8110154, 5180750, 4669744, 6210250, 3581748, 1547409, 7424554, 4485990, 3331978, 187238, 6061964, 3991332, 7195061, 2232864, 1670717, 7536081, 7342468, 6149621, 2808863, 2666936, 6781201, 1575054, 5427499, 2631577, 6423734, 6851997, 4531228, 2829130, 3192171, 4142677, 1114463, 4330958, 7435601, 5104190, 3818715, 6705984, 7794589, 4174938, 6996997, 462232, 2006658, 7989477, 977045, 7407323, 3765873, 6844914, 4626857, 1886400, 6156078, 5645030, 77571, 687104, 5994677, 7191420]] - -w1: [[17, 9, 25, 3, 29, 9, 38, 26, 21, 13, 33, 0, 14, 29, 1, 6, 33, 37, 19, 37, 9, 43, 23, 22, 23, 5, 2, 40, 35, 26, 6, 4, 41, 8, 9, 0, 43, 34, 1, 38, 22, 17, 22, 16, 15, 5, 10, 26, 23, 25, 42, 28, 0, 20, 30, 30, 26, 27, 33, 30, 14, 37, 14, 11, 40, 33, 27, 1, 26, 23, 1, 18, 29, 28, 12, 3, 35, 31, 20, 15, 28, 0, 42, 3, 8, 33, 1, 24, 15, 42, 13, 36, 38, 5, 41, 23, 21, 11, 34, 3, 38, 28, 15, 3, 2, 25, 15, 2, 42, 40, 32, 2, 1, 4, 9, 33, 12, 32, 32, 25, 42, 33, 35, 5, 9, 37, 23, 21, 39, 41, 26, 41, 26, 10, 6, 41, 20, 10, 7, 25, 1, 12, 23, 33, 0, 34, 3, 12, 12, 1, 25, 28, 37, 38, 2, 7, 29, 10, 43, 10, 24, 37, 20, 43, 14, 6, 35, 21, 10, 27, 40, 18, 32, 13, 18, 29, 0, 37, 16, 7, 26, 22, 25, 3, 11, 18, 34, 30, 27, 21, 33, 43, 35, 25, 20, 8, 33, 31, 13, 2, 40, 28, 35, 19, 12, 21, 35, 37, 17, 22, 12, 5, 4, 40, 35, 10, 11, 4, 24, 6, 23, 7, 10, 10, 8, 21, 2, 35, 22, 28, 1, 43, 35, 34, 38, 32, 18, 35, 37, 24, 9, 18, 10, 32, 9, 35, 25, 41, 30, 39, 13, 36, 4, 39, 0, 3], -[17, 21, 37, 38, 23, 16, 39, 2, 29, 15, 34, 27, 23, 14, 36, 19, 16, 22, 19, 25, 25, 41, 36, 6, 41, 28, 21, 36, 31, 3, 12, 14, 13, 15, 10, 13, 11, 11, 22, 11, 40, 35, 24, 21, 11, 38, 29, 13, 18, 19, 28, 6, 31, 26, 42, 18, 21, 27, 10, 28, 43, 36, 28, 27, 25, 20, 9, 18, 7, 20, 12, 31, 36, 24, 13, 11, 19, 39, 7, 22, 39, 21, 36, 17, 15, 25, 18, 2, 37, 42, 9, 31, 9, 37, 0, 37, 38, 42, 3, 40, 28, 36, 25, 29, 32, 35, 24, 4, 30, 35, 19, 26, 7, 35, 21, 23, 39, 42, 14, 17, 15, 35, 33, 40, 9, 26, 35, 19, 34, 34, 23, 14, 3, 21, 3, 19, 23, 33, 8, 31, 41, 40, 39, 26, 33, 30, 1, 15, 8, 34, 25, 6, 1, 19, 39, 15, 38, 32, 26, 22, 35, 28, 43, 10, 19, 36, 37, 29, 34, 35, 35, 26, 14, 29, 3, 13, 3, 9, 3, 16, 30, 17, 35, 13, 29, 31, 4, 10, 15, 41, 3, 42, 37, 24, 40, 20, 13, 4, 17, 4, 6, 20, 24, 6, 39, 1, 37, 19, 30, 34, 9, 38, 20, 37, 1, 8, 8, 29, 11, 14, 21, 20, 15, 33, 23, 8, 41, 27, 26, 33, 37, 31, 12, 22, 17, 41, 24, 38, 16, 23, 40, 7, 29, 21, 27, 9, 41, 6, 21, 6, 13, 6, 33, 41, 34, 12], -[16, 16, 16, 37, 5, 24, 27, 21, 1, 38, 1, 18, 35, 9, 0, 7, 29, 10, 9, 23, 5, 18, 26, 4, 17, 35, 38, 5, 5, 5, 21, 15, 36, 1, 35, 26, 38, 35, 19, 28, 6, 24, 16, 42, 19, 28, 23, 11, 29, 12, 9, 10, 7, 1, 5, 26, 11, 37, 0, 4, 27, 28, 13, 35, 15, 17, 0, 18, 32, 25, 35, 37, 30, 1, 17, 29, 4, 25, 13, 36, 40, 41, 22, 36, 39, 0, 1, 27, 1, 12, 12, 35, 29, 22, 41, 15, 28, 25, 18, 16, 9, 38, 34, 14, 2, 16, 11, 4, 38, 30, 22, 41, 32, 21, 21, 23, 31, 8, 29, 22, 40, 12, 4, 24, 15, 8, 5, 25, 42, 10, 10, 29, 1, 8, 13, 25, 13, 2, 22, 19, 27, 38, 5, 21, 18, 25, 12, 0, 3, 11, 0, 16, 30, 24, 1, 5, 18, 23, 36, 41, 33, 34, 36, 35, 10, 34, 31, 21, 25, 38, 33, 16, 2, 29, 34, 22, 35, 28, 18, 6, 14, 27, 21, 30, 22, 5, 14, 41, 36, 12, 29, 29, 38, 9, 5, 42, 9, 35, 1, 39, 22, 39, 18, 21, 28, 14, 37, 0, 34, 30, 23, 35, 42, 6, 25, 41, 15, 19, 25, 12, 19, 41, 6, 13, 4, 43, 17, 35, 15, 21, 39, 20, 37, 12, 9, 13, 7, 22, 39, 17, 36, 42, 5, 39, 41, 20, 9, 5, 31, 26, 32, 25, 30, 18, 10, 33], -[3, 11, 3, 22, 39, 36, 30, 35, 6, 42, 8, 7, 0, 6, 43, 16, 14, 40, 26, 35, 13, 13, 9, 19, 9, 35, 1, 21, 5, 18, 9, 3, 1, 22, 33, 23, 1, 37, 24, 12, 37, 43, 23, 30, 14, 6, 28, 23, 22, 42, 5, 34, 20, 13, 22, 43, 32, 20, 10, 2, 1, 28, 33, 39, 3, 19, 22, 13, 13, 32, 24, 32, 22, 34, 40, 6, 21, 20, 21, 12, 13, 32, 29, 24, 39, 41, 11, 26, 40, 40, 13, 36, 15, 40, 5, 1, 37, 34, 26, 4, 28, 8, 42, 30, 1, 33, 43, 20, 11, 23, 37, 2, 24, 26, 27, 27, 25, 8, 13, 27, 27, 37, 41, 24, 7, 4, 0, 38, 17, 25, 3, 17, 27, 40, 3, 20, 26, 2, 2, 21, 8, 11, 16, 11, 19, 33, 6, 13, 37, 5, 38, 3, 18, 6, 18, 32, 23, 27, 39, 20, 27, 19, 14, 29, 0, 43, 29, 11, 6, 27, 36, 38, 2, 28, 39, 11, 18, 8, 26, 2, 15, 39, 3, 39, 23, 12, 32, 37, 4, 18, 19, 10, 11, 3, 33, 41, 13, 18, 12, 29, 39, 18, 43, 27, 25, 33, 19, 8, 39, 24, 17, 1, 32, 21, 38, 12, 9, 40, 39, 32, 15, 14, 36, 8, 28, 14, 34, 36, 24, 15, 17, 22, 6, 23, 39, 27, 20, 35, 41, 22, 37, 2, 11, 42, 5, 39, 20, 36, 24, 10, 32, 30, 0, 4, 31, 38]] -w1Encode: 51920D5D626A5513024E1718613995C97A595721A0A36610299200AB18985664414FA16857A67200E579DA167A4EE92C68B805DA15481DC70CE3473D1CA00E4818608FDA9066915ED5220E26F70C42F6082A0A0A0191840C08666A381649795567AAA59A62A49472640173858038304C9071A5291C9DB22A5849AD8E3156CA864A60237540091D9A950D8B247A5B15AE634621E1D70828374E4C359691C514043A2A0B8119D7A12848258C1617ACA36882D2586289A480C998A5DED990C4090C51559A17740ADD236E97434E903565594A1A295791DFC038CDA334CB622DE888558BD935D2C4199FA64AD5A6702BC96D19954807C57C24D62CD379586745464F2609A59A7C490994A63AA01C9975E08811DE3869C7585DA7EA44CF18A289364EA2783943354C57887C297A6AA1173C889819C1743E26A85923B72A135976E2386A4E37344332405E3436DD47284F3AA82586520D111106851967504E9E989854192048B73815F58417926E5A587E8C15A598095DE8D1555B921A95D118612A3210049505B65581194863021C9D925C85A411D1681645513D64306AE638710606A913772D1D93284750684B09101BD78C4F04486036965E107544D690686A9127106C01C38C9D953E5C264189293A02B410A667A560555D1FD2592843600F5264AAA27401D2648D604D9B595452C600C302401E1614D245A6A1488E8AF85599194242275A232719CE567956E1A424D3756652A8C9189CD629559C5302A2778DAA91A5CF9431536A34C41A8D4F7552259334877546A45A9C2995149F06669EA484C3325827E98D868A1C80B1420EAA8D4D934CC9185485940C81155E418931E57A798EC15D965A885463AD20A50801179EC364350D888196881A1555310DD86167BA6828DA900F5A04A5A8111CA27A41B852CB550A98B66D19D26C5B99620701985136441B3A509A2054C8022D53683465610E922181D77652DBE474C0DA2DC6469A02772E12A209CF399C170396843429CB10A68DC474A7B46E593821271605606532097A828F43229C2392D81359C6756ED4985AA5B0A8C5499198027A00F199 - -cTilde: 6E7A396AD957637BEA3AB6D8BAF6CF363FF45829990B947C35890A827B9F8C76 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -cHat: [4727311, 2069090, 853580, 713432, 3478861, 307464, 1500763, 3557257, 2728112, 6077055, 3738440, 8166180, 2709211, 4558794, 5948939, 984609, 7211344, 1719758, 1618269, 7307419, 1876773, 2167854, 8231313, 6466789, 6090350, 4639663, 914085, 670846, 7523622, 7378803, 5743394, 2144071, 3959259, 6130390, 1102409, 5201091, 5633803, 979747, 1325945, 608332, 1243083, 6016569, 8257218, 5767370, 3405338, 7579247, 480096, 1375513, 6709870, 1102314, 2356812, 6088339, 1018992, 4613884, 3093941, 6696985, 8200798, 1775457, 1968303, 5402679, 4063213, 6344446, 7005693, 2081923, 8171425, 1653157, 2996776, 1558648, 1927609, 3598539, 1297386, 2766743, 2203928, 6897002, 7191175, 8197650, 7806547, 6065354, 8330501, 8227189, 3158195, 4281944, 1690525, 3958078, 4887514, 1065861, 7272490, 2565074, 5156202, 6212965, 1581303, 2573971, 6531454, 3961223, 5150430, 3435586, 3613789, 1144624, 2378516, 5329547, 3297445, 5385939, 4077045, 1447781, 778076, 1028377, 5078702, 483147, 3227452, 5802796, 7833656, 2038188, 6257550, 3642549, 6819631, 2106321, 3454881, 7284279, 6933948, 4220050, 1597360, 4123424, 3248773, 3468880, 4272748, 8333391, 772744, 6319291, 1940952, 6000138, 8228978, 4086383, 4350921, 4894968, 2784936, 8228557, 1162166, 978325, 3293304, 5114370, 1396565, 7279181, 6962951, 8116108, 3427283, 2827341, 2061549, 4896973, 1051322, 3666428, 4216129, 4884788, 4074818, 1750, 4842316, 5545246, 1371320, 5944769, 7700716, 2658429, 2415456, 2380864, 1338576, 2386729, 6220558, 4934825, 6202157, 593646, 1302835, 2693876, 4741615, 4786309, 2125987, 728483, 1841801, 4622608, 3971185, 5512259, 6083584, 543879, 7705704, 4882815, 3914829, 5722349, 3905097, 6806336, 8364992, 5303496, 1319409, 6241658, 3498363, 2710667, 5498157, 7369943, 3866553, 410328, 5132348, 599658, 600863, 7956203, 7309200, 4338613, 3571457, 2850753, 8098280, 1580094, 7691605, 1212062, 5118839, 6330076, 610952, 2752474, 2902029, 3856615, 4371629, 443166, 7646269, 2728263, 7760535, 5416579, 6032490, 5661190, 8361418, 2507692, 3293082, 7752685, 5255930, 493875, 3838109, 5302388, 8063125, 7491374, 5243880, 1939248, 680233, 1935425, 5386812, 4219583, 5516715, 2817761, 4964208, 94838, 1943562, 1888423, 1732799, 5851379, 4102445, 7609353, 4542855, 6420751, 429298, 7220879, 5454672, 5939291, 7208716, 1333734] -cs1: [[3, 8380407, 8380403, 8380411, 3, 7, 17, 8, 15, 6, 17, 8380408, 5, 8380408, 8380397, 0, 8380415, 8380409, 5, 9, 10, 24, 8380416, 4, 8380411, 8380409, 8380398, 8380409, 8380400, 8380411, 1, 8380409, 6, 7, 2, 8380415, 1, 0, 8380405, 8380400, 8380415, 8380402, 1, 8380412, 8380410, 8380399, 8, 8380414, 8380416, 11, 8380410, 8380407, 9, 1, 10, 6, 8380409, 9, 8380415, 8380402, 5, 10, 8380416, 8380415, 8380412, 8380410, 8380410, 8380414, 8380413, 8380402, 11, 0, 8380412, 4, 8380411, 8380394, 8380412, 8380395, 8380408, 8, 8380407, 8380409, 9, 2, 8380405, 0, 8380413, 8380408, 0, 8380410, 3, 11, 8380416, 4, 14, 23, 8380415, 17, 13, 18, 8380409, 8380410, 8380401, 8380407, 8380416, 14, 11, 17, 23, 2, 19, 8380411, 7, 8380408, 8380407, 8380415, 13, 8380412, 8380412, 6, 9, 3, 21, 18, 1, 7, 8380407, 8, 8380410, 8380405, 1, 14, 11, 3, 8380415, 8380415, 8380405, 2, 7, 8380413, 5, 8380413, 8380414, 8380402, 8380416, 8380405, 8380412, 8380402, 8380413, 5, 8380414, 3, 8, 8380409, 8380398, 3, 10, 8, 9, 8380409, 0, 5, 8380413, 10, 3, 0, 0, 8380416, 5, 3, 8380412, 11, 19, 16, 9, 20, 8380412, 1, 8380413, 3, 3, 8380410, 12, 9, 7, 7, 8380415, 0, 8380397, 8380398, 8380410, 8380400, 8380409, 2, 8, 3, 8380414, 6, 8380412, 8380410, 9, 8380411, 8380393, 8380409, 8380402, 4, 10, 8380413, 9, 8380414, 8380405, 8380411, 8380416, 8380399, 8380412, 8380413, 8380413, 20, 8, 16, 5, 1, 1, 8380409, 0, 8380409, 8380416, 5, 8380413, 8380402, 0, 8380414, 8380416, 9, 8380416, 8380414, 8380416, 3, 4, 5, 8380415, 8380407, 3, 8380400, 7, 10, 0, 8380410, 8380404, 0, 8380407, 13, 6, 7, 8380397, 8380409], -[7, 8380415, 8380415, 9, 8380411, 8380409, 8380408, 4, 8380411, 8380406, 8380403, 8380405, 6, 8380416, 14, 3, 8380412, 2, 9, 0, 0, 1, 8380404, 5, 8380409, 8380415, 8380402, 1, 4, 8380416, 8380400, 8380408, 4, 8380410, 8380411, 0, 8380400, 24, 0, 14, 0, 2, 3, 8380412, 8380408, 12, 8380393, 8380397, 8380404, 8380406, 8, 8380412, 8380413, 3, 8380408, 8380412, 8380411, 8, 4, 8380415, 6, 6, 8, 8380414, 3, 8380413, 8380416, 3, 8380406, 8380406, 8380413, 8380410, 3, 2, 8380408, 2, 8380412, 8380416, 8380408, 8380413, 8380416, 8380414, 1, 5, 7, 0, 7, 2, 8, 2, 8380414, 15, 7, 4, 5, 6, 8380416, 3, 6, 13, 1, 17, 19, 25, 8380413, 7, 8380405, 1, 3, 1, 8380410, 8380412, 2, 7, 5, 20, 8380413, 9, 8380416, 12, 5, 8380409, 8380415, 11, 8380416, 8380415, 9, 14, 16, 7, 12, 8380398, 8380410, 18, 8380411, 8380413, 7, 2, 13, 8380415, 6, 8380408, 8380415, 8380403, 8380408, 8380410, 8380413, 8380411, 5, 8380406, 8380416, 9, 8380395, 4, 8380413, 8380407, 8380411, 9, 8380411, 8380405, 8380410, 8380409, 1, 2, 1, 8, 10, 0, 13, 6, 8380406, 8380415, 8380398, 8380408, 8380395, 8380408, 10, 8380408, 0, 8380409, 18, 11, 8, 3, 8380413, 8380405, 8380415, 22, 3, 8380410, 1, 8380409, 8380413, 7, 8380411, 8380410, 8380414, 8380411, 5, 8380403, 1, 3, 8, 5, 1, 8380411, 8380409, 8380406, 7, 8380410, 8380406, 8380413, 13, 8380402, 0, 8380414, 8380410, 2, 8, 8380412, 8380416, 8380414, 1, 13, 8380412, 0, 8380409, 8380385, 8380410, 8380407, 5, 8380408, 8380415, 11, 5, 8380409, 4, 7, 8380405, 8380406, 0, 8380404, 23, 6, 8380399, 8380414, 8380415, 2, 12, 15, 11, 8380413, 8380411, 4, 8380415, 8380409], -[3, 5, 8, 0, 4, 8380413, 8380415, 8380410, 8380409, 8380412, 8380413, 11, 6, 6, 11, 6, 6, 8380413, 8380411, 6, 2, 8380411, 0, 7, 8380404, 8380416, 0, 8380407, 13, 8380409, 8380409, 6, 8380414, 8380416, 29, 8380407, 5, 6, 0, 8380408, 8380406, 8380416, 2, 2, 10, 6, 8380412, 4, 5, 8380413, 13, 8380409, 8380409, 8380412, 14, 5, 3, 5, 8380402, 8380416, 2, 8380413, 8380416, 8380407, 8380414, 8380413, 8, 8380406, 6, 8380414, 8380412, 8380412, 10, 8380415, 3, 8380413, 8380416, 8380412, 8380411, 8380404, 8380402, 7, 8380414, 8380399, 8380414, 8380415, 8380412, 8380412, 8380416, 4, 7, 8380410, 8380414, 10, 8380406, 8380415, 16, 8380414, 8380410, 7, 1, 2, 4, 8380416, 8380416, 8380409, 10, 7, 5, 8380411, 6, 10, 8380414, 8380408, 6, 1, 8380416, 8380403, 8380412, 8380413, 8380411, 5, 8380414, 8380413, 7, 3, 11, 1, 8380412, 20, 8380405, 8380406, 0, 8380412, 8380410, 6, 8380416, 8380405, 14, 17, 2, 8380406, 5, 8380403, 3, 8380413, 8380415, 8380404, 3, 8380409, 8380415, 0, 2, 8380408, 10, 8380411, 1, 13, 7, 8380405, 21, 17, 8380412, 11, 2, 6, 15, 0, 1, 5, 8380412, 3, 8380407, 12, 2, 8380408, 11, 15, 4, 11, 8380414, 9, 3, 8380383, 2, 11, 2, 8380413, 4, 8380407, 8380415, 22, 8380409, 5, 9, 8380400, 8380414, 1, 5, 11, 10, 8380414, 8380406, 3, 8380412, 8380409, 8380416, 8380413, 8380408, 8380413, 1, 10, 2, 8380414, 8380411, 8380401, 8380412, 0, 3, 7, 8380412, 8380408, 12, 0, 11, 8380412, 0, 0, 8380411, 0, 22, 8380411, 8380410, 8380413, 8380409, 8380416, 8380415, 8380409, 8380413, 11, 8380416, 15, 8380411, 8, 8380410, 8380412, 8380409, 8380412, 8380413, 1, 8380415, 10, 8380411, 2, 0, 4], -[8380408, 5, 8380407, 1, 8380407, 5, 8380415, 17, 8380416, 16, 6, 6, 8380416, 1, 9, 8380411, 8, 8380404, 2, 8380404, 10, 8380409, 8380400, 8380414, 5, 8380411, 8380415, 8380412, 8380412, 8380411, 2, 4, 18, 8380416, 15, 18, 8380413, 6, 8380411, 5, 8380401, 12, 8380412, 8380414, 8380401, 0, 8380411, 8380411, 7, 8380408, 8380415, 10, 8380406, 8380406, 6, 8380402, 8380405, 23, 6, 11, 8, 8380402, 2, 8380410, 8380406, 11, 20, 11, 18, 8380412, 8380416, 8380414, 0, 8380415, 8380412, 14, 8, 12, 8380415, 8380411, 8380405, 8380413, 8380411, 8380408, 8380413, 8380409, 8380416, 8380415, 8380413, 12, 8380398, 3, 8380416, 4, 17, 8380414, 16, 2, 13, 15, 16, 8380410, 8380414, 8380415, 8380399, 3, 8, 4, 19, 8380402, 8380416, 0, 3, 8380415, 8380408, 8380415, 8380407, 8380406, 8380404, 8380408, 8380410, 2, 8380403, 8380413, 3, 5, 8380414, 8, 0, 8380405, 7, 14, 18, 9, 4, 3, 4, 1, 8380414, 5, 8380415, 8380411, 11, 6, 8380411, 3, 6, 8380393, 8380406, 11, 8380413, 7, 11, 8380409, 1, 22, 8380412, 12, 6, 1, 8380413, 14, 8380409, 9, 14, 8380415, 8380415, 8380416, 8380414, 8380411, 8380407, 8380414, 8380414, 3, 3, 0, 0, 6, 5, 8380404, 2, 8380407, 20, 8380415, 7, 8380411, 8380411, 8380401, 8380409, 8380408, 8380414, 8380408, 8380403, 2, 7, 6, 8380398, 5, 6, 8380406, 10, 5, 8380394, 8380415, 8380402, 8380410, 8380406, 6, 1, 5, 8380414, 10, 4, 8380414, 7, 8380413, 17, 8, 9, 21, 7, 8380406, 10, 8380410, 3, 1, 0, 8380415, 11, 8380399, 8380413, 14, 2, 9, 11, 8380412, 8380399, 8380414, 8380398, 2, 8380410, 0, 13, 19, 5, 8380412, 1, 6, 8380413, 0, 15, 3, 8380415, 8380409, 8380403, 8380407]] -cs2: [[5, 8380410, 8380406, 8380409, 0, 0, 7, 22, 6, 8380402, 20, 1, 10, 8380415, 2, 8380412, 6, 12, 11, 8380414, 8380394, 6, 4, 3, 9, 8380412, 8380409, 8380409, 12, 25, 13, 17, 0, 8380416, 8380402, 8380412, 8380408, 8380408, 8380412, 8380404, 8380411, 8380413, 8, 8380412, 8380404, 8380411, 8380415, 15, 19, 8, 10, 8380403, 8380414, 8380407, 8380405, 8380403, 8380409, 1, 8380411, 26, 18, 4, 13, 8380406, 3, 8380412, 8380409, 4, 8380405, 8380409, 2, 8380416, 17, 7, 14, 8380415, 8380406, 8380410, 11, 8380405, 11, 8380411, 8380411, 5, 5, 0, 1, 8380394, 8380416, 8380416, 8, 6, 5, 0, 8380415, 7, 8380408, 11, 8380413, 12, 1, 12, 10, 8380413, 8380405, 8380403, 8380405, 6, 1, 2, 2, 9, 8380415, 8380415, 5, 8380413, 8380413, 8, 8380407, 3, 9, 8380409, 5, 4, 0, 1, 12, 8380416, 8380407, 8380397, 8380412, 8380416, 8380412, 10, 11, 11, 8380414, 8380416, 8380413, 8380413, 8380416, 8380401, 3, 8380404, 5, 8380416, 8380415, 8380416, 2, 8380408, 0, 0, 12, 0, 8380413, 4, 2, 8380413, 6, 0, 8380409, 8380408, 8380403, 0, 8380410, 0, 8380403, 8380416, 8380416, 7, 8380405, 5, 2, 15, 11, 16, 7, 11, 8380406, 2, 8, 2, 8380409, 8380412, 0, 8380416, 3, 17, 7, 10, 7, 0, 4, 0, 2, 14, 4, 10, 2, 8380408, 8380404, 0, 8380404, 8380411, 0, 8380416, 2, 8380413, 9, 8380415, 8380413, 8380409, 0, 6, 10, 1, 13, 9, 9, 8380415, 1, 8380413, 5, 8380415, 8380406, 8380415, 9, 3, 8380406, 12, 8380401, 2, 8380401, 4, 8380414, 3, 3, 15, 8380410, 8380410, 4, 8380411, 8380416, 5, 8380408, 8380411, 1, 15, 8380403, 0, 8380415, 8380410, 8380414, 8380414, 3, 4], -[13, 3, 8380411, 8380414, 8380415, 8380401, 4, 8380415, 13, 5, 8380415, 5, 3, 8380414, 4, 4, 4, 0, 12, 8380408, 1, 8380414, 15, 8, 10, 9, 20, 8380416, 8380416, 5, 3, 8380412, 4, 6, 0, 9, 8380409, 3, 0, 3, 9, 24, 3, 8380410, 2, 8380408, 10, 7, 8380416, 6, 18, 10, 4, 5, 2, 0, 1, 8380412, 21, 1, 1, 12, 8380416, 2, 8380415, 8380406, 7, 2, 8380407, 7, 8380414, 7, 2, 10, 0, 16, 8380409, 7, 14, 8380412, 8380410, 8380405, 8380416, 8380414, 8380416, 2, 8380409, 8380415, 3, 8380413, 14, 12, 25, 8380410, 8380414, 8380409, 8, 8380412, 3, 8380413, 13, 0, 6, 8380413, 9, 8380405, 8380403, 8380411, 8380398, 8380407, 8, 8380413, 8380411, 9, 0, 3, 10, 1, 8380403, 8380412, 8380405, 8380414, 8380411, 8380408, 11, 6, 8380407, 8380411, 8380401, 8380403, 8380416, 8380413, 8380413, 4, 3, 8380414, 8380415, 8380408, 8380408, 8380403, 8380399, 3, 8380413, 8380414, 4, 5, 8380416, 8380412, 8380402, 8380401, 8380405, 8380406, 8380400, 8380400, 4, 8380403, 8380413, 3, 8380406, 8380416, 8380409, 8380410, 6, 8380416, 8380413, 16, 18, 1, 8380408, 8380409, 12, 8380409, 8380409, 6, 0, 8, 23, 14, 3, 3, 8380415, 8380400, 8, 8380414, 9, 2, 8380416, 6, 6, 20, 8380411, 4, 3, 8, 1, 8380413, 11, 8380415, 12, 20, 11, 22, 8380411, 8380413, 8380412, 8380414, 1, 15, 1, 14, 4, 8380413, 2, 8380415, 6, 6, 18, 6, 15, 8380412, 12, 8380415, 8380405, 8380414, 8380401, 3, 14, 8380409, 8380409, 4, 8380413, 13, 9, 1, 8380415, 4, 8380411, 13, 8380410, 17, 3, 0, 7, 7, 3, 4, 8380409, 8380408, 3, 5, 19, 10, 8380412, 8380408, 3, 8380409], -[11, 9, 11, 2, 8, 13, 11, 4, 8380408, 8380416, 8380410, 5, 5, 21, 5, 9, 10, 26, 7, 8, 8380416, 8380399, 1, 4, 8380416, 0, 0, 10, 0, 2, 0, 8380402, 8, 8380410, 16, 8380416, 7, 3, 3, 8380412, 8380407, 8380413, 8380413, 8380411, 8380412, 8380408, 8380415, 8380405, 0, 8380405, 8380412, 8380407, 8380408, 8380414, 8380415, 8, 8380411, 8380401, 6, 8380416, 3, 3, 6, 8380395, 1, 0, 8380416, 8380414, 8380411, 8380412, 19, 8380414, 8380413, 8380404, 8380413, 14, 8380406, 1, 8380410, 8380414, 4, 8380402, 8380409, 1, 8380408, 0, 8380416, 8380416, 8380416, 13, 8380405, 6, 4, 8380409, 8380405, 8380407, 8380398, 8380414, 8380413, 8380412, 8380412, 4, 8380412, 8380416, 12, 8380414, 8380402, 8380415, 8380400, 8380405, 8380402, 0, 4, 8380416, 13, 8380403, 4, 1, 8380414, 8380414, 13, 8380415, 4, 3, 8380416, 8, 8380406, 8380406, 16, 8380404, 3, 4, 8, 0, 8380406, 1, 5, 9, 5, 7, 8380412, 8380414, 8380416, 20, 16, 5, 8380408, 4, 8380400, 5, 3, 8380393, 8380404, 1, 6, 17, 5, 6, 8380404, 8380415, 6, 26, 9, 8380409, 8380407, 8380415, 1, 4, 2, 8380414, 8380404, 10, 8380405, 1, 8, 6, 8380413, 8380416, 7, 12, 30, 13, 3, 8380401, 8380411, 7, 20, 1, 8380408, 8, 2, 5, 27, 3, 1, 8380400, 8380413, 8380411, 26, 18, 6, 8380398, 8380412, 8380408, 3, 8380416, 8380405, 1, 6, 9, 2, 13, 8380411, 9, 8380409, 8380416, 8380409, 8380416, 8380411, 0, 8380403, 11, 8380410, 15, 8380403, 8380415, 8380400, 5, 9, 8380409, 8380399, 1, 0, 8380416, 8, 9, 8380412, 4, 8380406, 4, 8380413, 2, 8380408, 8380407, 8380401, 2, 5, 7, 8380411, 8380411, 8380407, 8380410, 7, 0, 0, 1], -[8380413, 8380409, 2, 5, 8, 8380411, 8380413, 12, 13, 3, 12, 8380415, 8380416, 8380406, 8380404, 3, 8380410, 8380416, 8380414, 8380416, 5, 10, 8, 8380408, 11, 8380407, 3, 8380404, 4, 7, 8380409, 12, 2, 8380411, 10, 11, 2, 8380409, 8380415, 4, 9, 1, 8380412, 8380409, 8380414, 8380406, 8, 8380411, 8380413, 6, 8380406, 8380400, 3, 8380414, 8380416, 8380400, 6, 8380406, 8, 5, 16, 8, 0, 8380408, 8380407, 8380413, 11, 14, 15, 8380414, 4, 8380409, 7, 3, 8, 8380403, 3, 5, 10, 8380412, 0, 8380407, 9, 8380413, 8380415, 14, 8380412, 4, 2, 0, 8380414, 3, 8380414, 8380406, 5, 8380410, 8380411, 8380410, 8380411, 8380403, 8380406, 8380416, 6, 14, 9, 9, 2, 8380406, 3, 1, 5, 8380407, 8380410, 8380403, 8380416, 8380414, 10, 1, 14, 8380410, 8380405, 6, 7, 3, 10, 8380408, 8, 8380416, 8380413, 8380402, 8380404, 8380415, 10, 6, 0, 5, 8380413, 8380415, 8380410, 8380414, 8, 8380408, 12, 7, 10, 12, 0, 1, 8380406, 8380407, 16, 8380414, 24, 12, 8380408, 3, 11, 16, 8380415, 8380413, 8380406, 0, 8380409, 6, 8380407, 8380414, 8380407, 8380409, 0, 8380416, 6, 2, 8380408, 3, 8380416, 8380406, 8380407, 20, 3, 8380410, 2, 8380402, 8380414, 4, 8380407, 0, 11, 8380408, 8, 8380410, 8380415, 8380416, 8380414, 8380404, 7, 0, 8380412, 4, 8380409, 8380408, 8380409, 8380416, 8380409, 7, 0, 3, 8380415, 6, 8380401, 19, 5, 4, 8380412, 8380402, 8380403, 8380415, 8380413, 8380415, 8380412, 4, 10, 1, 2, 0, 3, 1, 14, 11, 8, 4, 7, 4, 7, 8, 8380412, 10, 4, 8, 8380410, 8380410, 8, 9, 6, 4, 8380408, 0, 8380415, 8380413, 2, 8380411, 8380409, 12, 8380409, 11, 8380413, 4]] -z: [[8349486, 8306468, 10103, 113710, 128870, 2961, 37140, 8325936, 8324741, 8356891, 8324675, 8326110, 104146, 63183, 8285682, 122164, 8316324, 8379882, 8336938, 117837, 8303173, 85613, 56957, 8306709, 63201, 8297307, 58427, 8273163, 102212, 20584, 8262245, 8338161, 8313121, 50640, 8317971, 129844, 114944, 8260071, 26156, 8330635, 8372794, 30279, 8285866, 2485, 95061, 86381, 65950, 34246, 40921, 8263931, 8273837, 17200, 33027, 6241, 8293334, 8251330, 8294043, 8267291, 8336525, 17090, 19012, 118247, 22645, 8308360, 17754, 38423, 40906, 124876, 8346455, 125412, 127824, 59983, 8278134, 115951, 92454, 8396, 58347, 27873, 55871, 115661, 67774, 115132, 8323541, 86725, 42687, 115347, 118318, 8368825, 8338497, 8252857, 22862, 8274657, 84566, 8371509, 14593, 97524, 116595, 2851, 8296391, 8280376, 13447, 8329726, 8281722, 113641, 8379556, 8271773, 8371859, 8342829, 8374173, 8261000, 8297755, 111545, 95619, 8367228, 19713, 8348689, 69810, 8331071, 8269481, 65389, 8339294, 62560, 82163, 96818, 79419, 8333255, 8309500, 22636, 8374668, 80469, 25413, 18340, 8292065, 8317154, 8261960, 13394, 88221, 103286, 8256293, 64211, 33079, 3372, 8353603, 8376938, 8271056, 8293358, 8324918, 8266937, 78342, 126461, 42062, 49000, 8327920, 8313987, 8269931, 72379, 8252219, 38333, 8296641, 8310279, 91712, 118759, 35612, 8344948, 115085, 26080, 48439, 8288075, 67156, 35291, 66117, 8362758, 40666, 20410, 8360227, 8280509, 8344122, 8317933, 110432, 24475, 83197, 66663, 8321816, 29061, 8305147, 8294675, 8352592, 8279484, 8258175, 115624, 49563, 54212, 8376056, 8326336, 8350058, 14848, 52323, 49459, 8294124, 27507, 80258, 8356781, 27881, 8363152, 8285555, 40902, 30667, 8297745, 8366776, 79315, 8360253, 114999, 8359776, 8341934, 8378580, 125224, 8358159, 8373059, 8316543, 8371885, 103028, 121401, 8352122, 8339169, 8317595, 8258163, 8250135, 8366613, 33285, 8335810, 79349, 30748, 118536, 101796, 8337501, 73884, 8288809, 117445, 8380281, 8250125, 32119, 8342906, 47631, 116196, 130018, 30955, 8319796, 51242, 8340155, 8315433, 8306423, 8341159, 8324805, 33114, 8362038, 19310], -[86584, 108997, 16220, 71682, 8252831, 8282711, 24518, 8320620, 74615, 49478, 20486, 8088, 8379901, 105560, 77787, 8266957, 8260532, 8325476, 8334789, 8290108, 18470, 8294313, 104425, 8249743, 73097, 8297011, 8367400, 8305857, 110774, 87359, 58641, 8303671, 207, 2920, 54470, 8293091, 8249769, 65523, 8322151, 8327442, 8373111, 20725, 86538, 8291616, 8340279, 31506, 8358973, 14320, 64430, 8366913, 8352300, 8260465, 8369398, 8309219, 8296144, 89511, 40815, 36244, 8327041, 8274052, 88738, 97608, 8284473, 8332702, 8307318, 8352173, 8289452, 8360251, 8326191, 55963, 8329591, 65721, 8257273, 8251759, 50994, 8340184, 8287253, 20346, 8341548, 52379, 8354488, 8294231, 40870, 19398, 8263550, 310, 8328731, 8333194, 28149, 8280223, 107409, 8352687, 8334935, 19599, 10984, 21941, 8330021, 8302219, 8272824, 40872, 8363470, 51738, 8268297, 74696, 69034, 8256220, 8296415, 8330547, 8345348, 8306702, 86909, 53714, 72036, 84083, 8376612, 40085, 8293476, 25596, 91002, 26810, 8283203, 81948, 31626, 73855, 79682, 8380109, 90711, 107730, 8319429, 8253768, 26360, 96922, 39507, 8272285, 65486, 8302049, 8286575, 8313599, 115484, 8287601, 8297355, 118882, 31576, 8305511, 8325599, 33272, 8317132, 8332764, 8333010, 114161, 122754, 8311429, 8275976, 8288757, 128750, 8323155, 28303, 89244, 29218, 75785, 8340252, 88881, 8376702, 76166, 8311708, 35820, 11694, 8364391, 51908, 8369341, 80410, 8319218, 121314, 8320301, 8253019, 84390, 8332924, 90030, 8308689, 8293815, 8272301, 5221, 46582, 8346564, 8365536, 98096, 8333088, 8372218, 80559, 124043, 20791, 58092, 8348767, 8260749, 8296931, 61209, 82577, 8328780, 8259880, 87371, 8286416, 8372429, 103176, 8350610, 52524, 8289635, 91120, 63853, 39142, 17506, 33994, 8352047, 49140, 25125, 8335636, 8304536, 9763, 8351522, 22087, 92768, 8261576, 96651, 66979, 63767, 8305281, 19758, 8323725, 42081, 121887, 8290021, 56460, 62832, 8281269, 8261455, 8265643, 8292047, 8330787, 110463, 10664, 58188, 8308148, 58371, 13600, 66936, 34399, 8317323, 13690, 2478, 8332601, 101991, 8255503, 8331017, 8304177, 29336, 76038, 2495], -[8360887, 2024, 8292493, 44741, 25995, 8309641, 8357339, 112146, 8372571, 8316999, 6053, 8298599, 8351357, 8343223, 89516, 37526, 23875, 8285112, 122006, 119096, 98478, 121068, 8378698, 109677, 8329065, 8360027, 52278, 19193, 93787, 76196, 8320962, 8288410, 8269708, 68503, 59109, 8315212, 8377880, 8303218, 8258703, 8282206, 8370357, 8365724, 86980, 107752, 8340182, 38979, 58532, 8266180, 44060, 127187, 56124, 8358835, 58238, 8294467, 124701, 8375230, 8311661, 8282043, 8253915, 8324678, 31088, 8304845, 77868, 8366184, 8292907, 8362372, 22843, 8250447, 109224, 8359311, 84292, 37053, 112137, 111072, 70551, 8263480, 30703, 8250766, 8343488, 34967, 8279777, 8317017, 55532, 8371868, 8322504, 117887, 8347994, 8359799, 110300, 8257150, 8365051, 130312, 8256001, 8338834, 48448, 8291014, 50403, 8338540, 8297688, 8355728, 83125, 81172, 8347090, 25940, 8298880, 21499, 118837, 8253371, 18422, 6670, 3875, 8363397, 74546, 48613, 39446, 8380343, 2277, 8364966, 8322147, 8275632, 129963, 33646, 5518, 36023, 19964, 8267568, 8306516, 8352947, 8367470, 120324, 8336834, 8356459, 8263013, 8322654, 7860, 34002, 5210, 38634, 40899, 8252797, 8367664, 89153, 21754, 23547, 106195, 63233, 20881, 8347420, 94590, 8369024, 8298094, 18889, 14470, 8277683, 8346971, 46937, 8264160, 97276, 8374535, 8374497, 102489, 8352597, 8370496, 62490, 8317958, 92446, 8339149, 129764, 130005, 59582, 8359392, 8287598, 8251783, 54434, 122571, 14673, 8340999, 37652, 43577, 8274806, 103330, 106779, 38735, 51620, 25064, 22941, 94486, 121144, 66990, 114878, 31680, 72165, 8377063, 106337, 8374519, 8332524, 8318118, 8377338, 8347309, 8336387, 64003, 49165, 38726, 10596, 93458, 22328, 57524, 8301189, 73469, 8322220, 8320655, 109968, 8286260, 71872, 8259058, 113438, 8278983, 17662, 8272747, 8251684, 8263723, 8357569, 92972, 63015, 8305784, 110510, 86426, 8327403, 64606, 17918, 8278731, 126888, 8274452, 8307847, 8283129, 8283324, 8291981, 8292273, 8321675, 117315, 120188, 68676, 2916, 93080, 8252934, 8266133, 8255765, 8342111, 30518, 46260, 8302158, 8304224, 100266, 8281344, 48994, 8334214], -[65897, 8356970, 97062, 90566, 8271104, 10817, 8320067, 79491, 8266707, 8358156, 8326068, 8274029, 8365532, 113846, 11660, 20749, 93152, 8369937, 8308967, 16209, 8262443, 8262947, 8250806, 120011, 8350728, 8367948, 9382, 36175, 113634, 8264309, 8366792, 96411, 82983, 125891, 8329811, 8347361, 8351553, 8290714, 70656, 101182, 93224, 8338753, 8292394, 8354026, 8359353, 8349661, 39523, 8267459, 8292803, 8339811, 96214, 85604, 40570, 60981, 31876, 8343450, 8374061, 8288570, 8343038, 118227, 34019, 8379792, 83279, 31288, 8334879, 36691, 8311276, 8347533, 122583, 8356331, 21516, 8287006, 8316333, 98549, 8352985, 34632, 38335, 100750, 8359219, 38655, 8269592, 8320025, 90034, 8367272, 79951, 8308495, 50273, 8307379, 8257982, 8269238, 97754, 8326685, 39999, 8348062, 20688, 8371534, 96071, 3992, 8366905, 126838, 117999, 117970, 86347, 8283616, 8326861, 8362085, 45240, 118716, 8298644, 8260517, 127606, 8269393, 59140, 100766, 8256734, 118774, 120726, 8334584, 22177, 8328190, 8284487, 8295075, 8376189, 8256738, 8320541, 45237, 8347332, 8273048, 26507, 8331749, 8266200, 8303897, 116432, 50368, 80629, 91907, 8358056, 87762, 94192, 8317777, 92328, 8329447, 8340487, 8194, 8262178, 8287111, 122730, 8371572, 20257, 20715, 8285038, 8352200, 8291936, 16721, 46505, 8261799, 8255187, 8311586, 106033, 30795, 97689, 8357905, 67977, 8374291, 8360142, 8275480, 8331705, 53459, 8278557, 8364251, 8327391, 62379, 8309571, 89242, 8269177, 8288419, 8352782, 58813, 8361936, 8272110, 8365693, 8331158, 94695, 95040, 124768, 108218, 8276855, 8290905, 8297277, 51759, 63992, 8273399, 8278904, 8307719, 8263216, 118559, 8266051, 41634, 12136, 8320076, 8301793, 8350410, 8343452, 128425, 8253103, 8285118, 8377708, 8356798, 97099, 8366606, 147, 8276513, 8359282, 126521, 107310, 111481, 8354973, 8348425, 9365, 8264055, 8313733, 8252899, 1931, 113455, 8319803, 8276659, 8280170, 103203, 8313431, 47785, 8261345, 18790, 109035, 12227, 8376838, 108338, 19356, 8331671, 81383, 8336513, 72946, 8302790, 8356513, 77377, 8375940, 49679, 8378425, 8298968, 117634, 110370, 8312294, 8269606, 7898, 63788, 86336, 72285]] -||z||: 130674, ||z|| check passed -r0: [[-75412, -16496, 34235, 40185, -89126, 18906, 13463, 19161, -89035, 15765, 39444, 81763, -869, 12704, 83232, 82403, -54966, 26629, -21601, 58043, 45, 78100, -9989, 26373, 9109, -22175, 53688, 17203, -13215, 36136, 91494, 16956, -14417, 94511, 12807, -49832, -8655, -81673, 82674, 59566, -39596, 87478, -16117, -53166, -10151, -67716, 28892, 95060, 94502, -30672, 51245, -71698, -71430, 30006, -4555, 29264, 6235, 23781, -8175, 43704, 14907, -86222, 54285, 16659, -60443, -43023, -61165, 1595, 6530, 22225, -23799, 201, -59980, 31846, -84375, 90160, -28413, -61551, -64957, -16093, -16745, -59595, -64951, 25203, 17543, -82919, 12554, 84484, 9622, -49988, 6448, 41480, -5404, 31676, 58298, -30637, -7852, 56611, -19565, -77111, -69482, 59465, -18311, 11478, -11689, -77419, 68542, -87989, 49033, -83466, 15121, 31133, -37002, -26041, 73472, 1368, -70548, -18323, -59945, -26310, -60627, 11412, -67262, -61489, 19894, -13181, 7075, 20822, -30041, -47874, 35058, 94271, -84988, -69217, 60014, 18101, -218, -37546, 72259, -13505, 1947, -49307, 88598, 86550, 8995, -24978, 66324, -59304, -91284, 55446, 76781, 50023, 6684, -25245, 88435, -34055, -41547, 29529, 14862, -18241, -88635, 52859, -19130, 32560, 68652, -87230, 30100, 73556, -49145, 87592, -78830, 21954, -51713, 3865, -49302, 45182, -29977, -30133, -87026, 35508, 81186, 84624, -38824, -56735, 43803, -92495, -15216, -2479, -12099, 42026, 89062, -71026, -45564, 33223, -76356, 18124, 35844, 55955, -86906, -75953, 67366, 57290, -52080, -50929, 73716, 42640, 76535, 50187, 93588, -29658, 10452, -80999, 2292, 30923, -45644, 6975, 73344, -75078, -64580, 23282, 49207, -59318, -1691, 81465, -22013, 79329, -87137, -27184, -47927, 61058, -33161, -30977, 12524, -65154, 9363, -89683, -38662, -57230, -27218, -67769, 77705, 3208, -88813, -10934, 81763, -36887, 4899, 40646, 50083, -31991, 61296, -82810, 44536, -51017, -85370, -48260], -[-83904, 31906, -8297, 16883, 71961, 78557, -44752, 5398, 55282, -46058, -16822, 58870, 61910, -15702, -4870, 37695, -74169, -36300, 70099, -69739, 11909, 43853, -42686, 6869, -71787, 84443, -57904, 45789, -37182, 83745, 12427, 2082, 78450, -66218, -91206, 25275, -87132, -15275, -54579, -85430, -19449, -64936, -73568, 78469, 50726, 30304, 95195, 91289, -29774, -81100, -28358, 69303, -90525, -52672, -56918, -22282, -42651, -55228, -77489, 91814, -17044, -82854, -14706, -20458, 39770, 54736, -47230, 57420, -27065, 21163, 68638, 37317, -4035, -40541, 93099, -28798, 82098, 37076, 18317, 32346, -67423, 74409, -45092, -67428, -44109, -63845, -20414, 58305, -22523, 49537, -63755, -52575, -89032, 27541, -34029, 55275, -41297, -16297, -18344, -31950, -35937, -87351, 22774, 27671, -30429, -51897, -33858, 53065, -10089, 83597, 11630, -5526, 60399, 56850, -51472, 76789, 32888, -60396, -67670, -23323, 16493, 91455, -39959, 62296, 86378, -35649, 17176, 74174, 33681, 82397, 13133, 68832, 84694, -61970, 32208, -21932, 9702, 67278, -25677, -5911, 49044, -72728, 47333, -48476, -11281, 69144, -62114, -21655, 22816, 11214, -35672, -71142, 4149, 93502, 83326, -68295, -74271, -13470, 54054, -49537, -19908, 28380, 1260, 73462, 21773, -89767, -8492, -46893, 64367, 92844, 33671, 10641, 71040, 71793, 81556, 5501, -90398, 84282, -30095, -58488, -93183, -8796, 26419, 84400, 85669, -9938, -38201, 15895, 66134, -85060, 39202, 60784, -93103, 77464, 38199, -11585, -17096, 14863, 66211, 31259, 70855, -51932, 16733, 68818, 91905, 70008, -57660, -37056, -78318, -74073, -47196, 72397, -59937, 18370, 82003, 73412, 41844, 81661, -71106, -1498, -22604, 46282, 91975, -62112, 63825, -94293, 9145, -52164, 62117, 29250, 55780, 18088, -34161, -7285, 31067, 11326, 53546, -27892, -22396, -61092, -38040, 40740, -67659, -44194, -41561, -56058, 40206, -34945, -70698, -51932, -93967, -47195, 44323, 63623, -61379, -52991], -[-83999, -67530, 40633, -3424, -93810, -46363, -94143, 86466, 40349, -54187, -19827, 5691, -64539, 81132, 55978, -77380, 51447, 94881, -48353, -35336, 57986, 22598, 10126, -27875, 47004, -73248, -1689, 33041, -87593, -83517, 48670, -43380, 74755, 26874, 18048, -79243, 63234, 84907, -6627, -82165, 76626, 1381, -29462, -80934, -44601, -78167, -72499, -80757, 24978, 32635, 39490, 53037, 29343, -29648, 45212, -792, -40817, -50482, 50179, -75285, 47007, -83886, 29189, -74112, 34044, -65423, 5643, -24651, -26295, 36764, -84568, 79199, 92076, 77334, 11293, -27029, 68526, 80685, 76852, -1558, -80780, 80491, 57949, -15528, 25607, 46965, 82968, 53979, 37798, 63783, -64578, 47139, -53002, 45633, 10310, 22538, 32490, 79729, -24525, 69012, 75244, 3006, -11819, 66755, -92748, -91386, 31611, 81230, -76828, -49020, -39810, 52776, -67905, -75294, 58922, -11488, -33085, 25832, 24361, 21213, -76594, -25110, -46643, 86978, 79897, 83240, 10845, 3127, 57785, -34572, -29513, 33423, 59679, -81036, 79586, -76510, -20085, -67678, 54301, -39241, -68875, -55980, 4869, 78997, -75065, 20076, 57707, -34148, -55165, 93573, 31160, -47770, -18038, 21652, 79850, -88226, -65986, -26509, -17998, -45562, 7658, -31472, -19573, 68115, -80238, -51427, -32546, -32701, 50247, -34218, -33237, -26431, -85171, -57569, -12935, 51103, -95143, 24400, 42419, 66352, 33542, -70356, -7396, 76227, 89228, 92841, 16994, -637, 80440, -29642, 49326, -12819, -82360, 6265, 39370, 26502, 62823, -29614, 43658, -50804, 79123, 47185, 43287, 54611, 6168, 62605, -79425, 12987, -22463, 8750, 70400, -24834, 84001, 25769, -58000, -63566, -94554, 60837, -23896, -41812, 16928, -59668, 90350, -45178, 16058, 45103, -95186, 35558, 52835, -29916, 38705, 70633, 82065, -32726, 58672, -42353, 51915, -54519, 65649, -82758, 45637, -6028, 40420, -39945, -67490, 88065, -1036, -39503, -71337, -4988, -51007, -46698, -76123, -52232, 67454, 9985], -[-7271, 87557, 25871, -64190, -8652, -14930, -92765, -82016, 79248, -51334, 5318, 72932, 61896, 76380, -94567, -38311, 52603, 34543, 73736, 42499, 20257, 60654, 89568, -3955, 48854, -90845, 54535, 21793, -24197, -93446, -72539, 27665, -51638, -67715, -29916, -42777, 3676, 43916, 34588, 10674, -27942, -43668, 39845, -42975, 84578, -57277, -94655, 93505, -87714, -53092, -91357, -1976, 72350, -21489, -6275, -19578, 77786, 16156, 58875, -38699, -11341, 874, 42674, 10244, -72293, -79106, -81015, 81898, -12002, 59586, -1206, 82430, 38285, 4774, -8550, -56631, 4382, -32072, 82109, 56881, 86632, 51139, -36707, 37186, 64530, -74267, -28097, 33921, -83200, 28338, -65644, 3487, -92107, -66316, -49559, 42090, 7072, -37923, 53391, -13279, -14958, 9619, -31568, -49831, 27888, -93758, -44695, 61127, -62368, -48007, 46421, 84138, 88395, 4420, -20445, -45908, 62270, 3671, -21799, 81623, 74519, -21585, -67344, 93371, -67498, -18831, 68194, 86979, 46704, 17157, 88563, -17454, -76748, -74314, -66958, -69454, -65443, 29229, -26901, 62395, -52459, -48565, 1072, 70781, 48158, 87953, -53158, 51776, 80902, -29131, -69196, 27761, -24881, 54690, 75572, -15908, 68273, 89986, -68521, 72367, 10319, -35375, 16222, 20313, -24786, -83811, -73458, -82516, -72685, -11752, 46484, 26195, 85420, -40300, -69373, 90029, 89282, -34626, -38214, -53384, -26981, 65185, 22904, 41533, -42834, 12794, 75098, 82729, -8751, 51327, -29836, -21933, -93729, -58168, -17287, -93952, -41386, 87934, 77376, -74876, -45403, 29947, -79790, 38215, -91856, -75065, -37066, 23691, -3526, -85165, 94085, -3230, -32879, -8397, -42557, -52702, -43455, -82477, -85623, 54769, -48107, 439, -75505, 51342, 94504, -34920, -52056, -4718, -39916, -27834, -45724, -47535, -28328, -49722, 7510, -38348, 9431, 39736, -14428, -15263, -50179, 81295, -88452, -10015, 24734, -20773, -43405, -11786, 55719, -18234, 61238, -68902, 77579, -74763, 90297, -46216]] -||r0||95195, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-113939, 127795, -22587, 26948, 25132, 96985, 23860, 127785, -19457, -26979, -3245, -4287, -76300, 69784, 31002, 12703, -63276, 120266, -89891, 71585, -41612, 97828, -118088, -59301, 60368, 1887, 53357, -129188, -54076, 32167, 84435, -92103, 66801, -19161, 97296, -49291, -13853, -8441, -117459, 93093, 76615, -67894, 53694, -122394, 38057, -126420, 64170, -33892, -1154, -114660, 6684, -69633, 35250, 17597, -18714, 110417, 74831, 55610, -45597, 79001, -54285, 17095, 55738, -19650, 98933, 44502, 94440, 52119, 50584, 123105, -128419, 118217, -42727, -64311, 119897, 49850, 66823, -128815, 26553, 83435, -97884, -104012, 79437, -49850, -118212, -99007, -86567, 84251, -50532, 84371, -30475, -50305, -125352, -66058, 44508, 76806, -122102, 127104, 91160, 107617, 6271, 89984, 102586, 98269, -115166, 2344, 82597, 112014, -119919, -8377, -41470, 83496, -68697, 61645, -118362, 75844, -74618, 33539, -111894, -8723, -83422, -50701, -60180, 77510, 108234, 73472, -21838, 29114, -109155, 83522, 4794, 31893, 129287, 77467, -8602, 81486, -20981, 72057, -114934, 52921, 23714, -58710, 110572, -66049, 85260, 30778, -20666, -26288, 42515, 113576, -58373, 130552, 78818, -93456, 40342, 37734, 15195, -76091, 117670, 126306, -127206, -15617, -76755, 16373, 71123, 58572, -43275, 96468, -22454, 106808, -72697, 121583, 57298, 54101, -46708, 65789, 2725, 68565, 92064, -51400, -73251, 22160, 75985, -46028, 516, -27357, -92875, 114324, -45301, -38565, 26573, 3769, -79496, 45651, 29189, 116954, 52049, -39434, -90229, 25527, 9439, 47031, -36778, -59257, 62500, 265, -50878, -102289, 105837, 11056, 42464, -13617, -77862, -101752, -23428, -120530, -3146, -126402, -128206, 19827, -11653, -14250, 78157, -119708, -96709, 27047, 15095, -74107, -98604, 1262, -109818, 90743, 91534, 93998, 5086, -106148, -18236, -15599, -90588, 96383, -112003, -112152, 39828, 102872, -50930, -17242, 39625, -110168, 58286, 86626, -99355, 96463, -2615, 99793, 6567, -77389], -[-42385, 8211, -72350, 98575, -11114, -126553, -105622, -127179, 128760, 124872, 91859, 5441, 5486, -42939, 98653, -31742, -58221, 91955, -3038, -100453, 9675, 67354, 51540, 16371, 1465, -6762, -66168, -20052, -26899, 64974, 73227, 88293, 12832, 25490, 118808, -58534, -121436, 25878, 39260, 1353, -74993, -5386, -50134, 80760, 105043, -18000, -54704, -14241, 18977, 29764, -98336, 44735, -94673, -7437, -7676, -103312, -94752, 101072, -106175, 85670, -129222, 77611, 105709, -96821, -69909, -70607, 74290, 82727, 13372, -45091, -16373, -4716, 123109, -20260, -64526, -86053, -64534, -18677, 82263, 43865, 51645, 32496, 46771, -99479, -124025, -10499, -15414, -116068, 94684, -117020, 59114, 25926, -127709, -55440, -126893, 58627, 53318, 62691, -73264, -27516, 4971, 104166, 91938, 77602, 116393, -62652, -51324, 123090, 10505, -15803, 91234, -78537, -54533, 10148, -76434, 50457, -125498, -52716, -88105, 48737, -104710, -91384, -8550, 105903, -70706, -115649, 50254, -33542, -7803, 4233, -22985, 119421, -19558, 102704, -7299, -73186, 51612, -88017, 47456, -39906, 77321, 99250, -12575, -53434, 59074, 45571, -110721, -89846, -89803, 124729, -29541, 74040, 103538, 59589, -14185, -57867, -128133, 107944, 76410, 53931, -16747, 100205, -14015, -101227, 13469, -44273, -51434, 95879, 71987, -93964, -108332, 14892, 8668, -13405, 21758, -91898, 34533, -44223, -97731, 96125, 1124, -53350, -83780, 109252, 50898, -52105, 120217, 50342, 88222, 84045, 77456, 109144, 102141, -20104, -118371, -33218, 12055, 96716, 56319, 18839, -39008, 40564, -39470, 20677, 86868, -116366, 163, -21201, 121021, 98888, -124733, -10029, -84744, -128824, 18055, -14600, -37571, -16296, -43808, 30897, 55917, 81928, 831, -15090, 5296, 47823, -93575, -116929, -47271, -81397, 49601, 99827, -127227, -66440, 42960, 103253, 98967, -44412, -87271, 66816, -3397, -99390, 60774, 50911, -3358, 103972, -9623, -84672, 124924, 88910, -17283, -32083, -102195, -39719, -40038, 124607], -[-89183, 92869, 5951, 95199, -92898, 774, 128681, -26373, -60550, -65939, -118452, 44179, -48290, -22359, 16701, -32089, -19206, 47278, -3245, 29254, -101045, 128198, -42703, -114030, 18707, -89711, -104219, -120355, -76219, -100708, 80679, -118057, -117669, -35403, -26374, 72290, 10452, -16704, 66450, 61618, 93215, 51094, -47113, 34222, -13372, 90090, 109909, -60646, 74902, -116100, 123371, -130448, -75964, 47645, -85282, -90427, -85846, -8253, -94970, 125806, -79503, -76682, 19211, -66702, 29720, 67281, 101285, -6803, 68614, -32158, -100834, -122649, 22379, 117683, -108281, 47807, -66743, -86676, -24507, 50958, -120188, 84049, -26158, -33520, 105843, -76067, 74539, -122870, 111800, 20490, -120333, 5980, -99686, 24675, -106650, 104256, -96808, 46607, 14858, -80785, -61428, 90939, -6860, -43772, 90473, 128220, -98415, 55869, -45373, 71936, -115232, 94201, -109933, -67088, -113972, 78896, -47778, 44794, -16242, -11646, 24007, 102870, 111735, 68367, -3713, 100096, 21179, 42561, -56015, 54119, -40894, -84815, 26937, 72085, -41113, 59589, -100360, -4726, -84055, -106998, -104928, 107934, -82491, -27746, 48697, -81956, -100881, 18248, 97848, 62767, 88442, 57779, 73864, 81163, 61707, -42081, -88619, -48273, 21611, -78353, -127540, 77296, 81146, -70324, -104943, -24768, -86025, 16017, -38732, -103207, 18908, 81217, 45961, 29706, 109707, 115234, 57573, -2238, -78343, 28409, -67954, -57448, 83785, -127279, 104059, 26969, 124799, 50421, 62234, -59111, 57059, 69761, 54010, 113851, 5687, 91268, 77180, 83819, 37381, 6546, 114897, 69963, 129071, 17092, -10361, 2418, 117263, -130450, -62897, -119792, 40593, -28063, 9571, 55208, -53454, 93548, -106093, 112092, -75839, -20354, 11774, -124994, 92941, -3779, -58261, -130379, 56210, 28976, -39261, 110330, -119778, 78538, 69999, -120264, -118681, 122702, 22662, -96855, 98151, 86028, 121784, -93793, 103372, -46261, 76047, 5580, -116936, -120322, -28862, -31182, 40620, -14106, -98271, -121785, 60839, 82283], -[-129938, 21584, 125499, 95013, 18237, 115395, 36756, -116940, -746, -15276, 77928, -32654, 69113, 52056, -56367, -20084, 65070, -32895, 77132, 83693, -108199, 122632, 50329, 37666, -70837, -30137, -66008, 47090, 64279, -18174, -45138, 77706, 3316, 85527, -117385, -43535, -131040, -109835, 45943, 52773, 36461, 106578, 118443, 7889, 36696, 27620, -117563, -107797, 21452, 121992, -26043, -42647, 38742, -30949, -29526, -5795, 93918, -75089, -124276, 45556, 80547, -69820, -24248, 3914, -113414, 94358, 71957, -109552, 112029, 51507, 62714, -89154, 101954, 87795, -125850, -108882, 90711, 50113, 116519, -15453, 96647, 22939, -12583, 75588, 4034, 40781, 38189, 118963, 108818, -60880, 99208, -110955, 58823, -33596, -127742, -794, 8114, 62881, 42868, -27481, -86367, 68030, -92876, -60006, -37517, 80869, -75144, -73269, 43173, -113199, -94527, -31812, -35461, 104994, 85004, 33685, 27189, 85954, -58534, 96550, 82839, 71253, 51231, -88344, 76800, -5292, 123697, 111802, 91236, -116644, -122081, 59023, -51868, -105766, 79363, 121805, -43720, -50789, 65210, 130415, -66605, 4369, -63339, 88095, -130424, 41236, -29613, 96117, 114583, 45022, 91428, 54425, 34738, 9535, -108192, -39087, 99154, -17181, 3196, 71678, -58000, -125547, 86093, -29924, 108925, 123207, -43792, -116504, 48289, -3546, -121965, 39723, 39028, 46993, 80501, -67241, -10012, -20560, -10258, -4235, 104480, 73619, 42602, 25904, -90133, 72610, -73609, -64274, 100768, -85909, 23786, 22352, 11631, -111450, 116613, -101486, -108522, -30537, -52131, 102254, 109692, -29165, -28104, 108242, 112165, -73699, -97508, 61928, 7378, 74602, -60162, 108891, 18434, -17357, -50076, -105716, -14040, -74420, 64461, 51757, -116974, 5056, -80240, -82917, -107866, 89405, -55341, -8735, 9394, 77190, -115469, 3210, 92700, 8059, -88210, -123341, -2818, -69248, 41340, 21938, 7807, -31313, -897, 71066, -32240, 119855, -26824, 3760, 80618, 101645, -124543, -104383, -82765, 56291, -74421, -112641]] -NTT(y): [[1214221, 8100728, 6338283, 6057688, 1028491, 5765377, 5727417, 3420399, 49501, 6352687, 4583654, 3654219, 6456827, 5432026, 7191403, 5922143, 3683305, 7356858, 5387239, 6078765, 4475275, 2885782, 4527603, 1569202, 4013712, 6215282, 6712211, 5481689, 5178549, 909992, 3572790, 1372708, 650366, 5380505, 4301694, 6962541, 7536696, 2002037, 3301300, 4410783, 6083029, 2765557, 987881, 832532, 991458, 3595385, 3599789, 6061628, 6306499, 485942, 4458062, 4351568, 4850628, 6470795, 6089503, 1003576, 7914342, 8047266, 7727710, 8342043, 7565601, 815665, 3287724, 7572207, 3727614, 4454489, 1697313, 5316871, 3354495, 2884464, 7411843, 4515763, 1542494, 2936524, 6359058, 6053836, 8293535, 8065832, 7244229, 1002029, 2559642, 4549247, 4036813, 8112665, 422691, 3175448, 6963726, 5971574, 7297848, 6065314, 6400061, 281776, 5692444, 2999498, 8009570, 329469, 2728711, 4676657, 4116550, 5911640, 467154, 7076995, 628888, 7014193, 4959860, 7328949, 1470835, 3555478, 4754199, 1693198, 7711175, 5699913, 3137326, 6963121, 7949098, 6859897, 4420914, 6007296, 4764526, 1021365, 4561152, 477850, 3699383, 1676550, 7576058, 3067061, 3766431, 4875761, 5025588, 4210098, 5980934, 1626626, 1530764, 5780030, 2457642, 4594904, 7610092, 8234307, 4160976, 8142885, 5395414, 260746, 159518, 4116376, 7640429, 511448, 4663257, 400798, 6463034, 2481125, 8071223, 6490873, 6788255, 62226, 2670826, 6259843, 5988424, 1019502, 6854932, 1311669, 7215293, 86761, 3679400, 7381851, 4042068, 5004208, 2946304, 2154941, 5828049, 6941868, 660294, 6704846, 7576651, 689707, 8034260, 7913967, 549505, 4920854, 5222413, 2519753, 5522458, 1740743, 4713910, 3680369, 3969459, 835168, 4943199, 8019986, 6088220, 3985484, 6802801, 1072247, 2558654, 3745870, 1509290, 2554773, 4001572, 5180811, 1152751, 7337017, 5892846, 6327960, 4142634, 4926001, 6242434, 5411792, 6987778, 2243486, 2046750, 3741787, 6945137, 311867, 1365417, 1527129, 673415, 6650097, 8154148, 4660583, 4657502, 3256791, 4630039, 6007756, 7098397, 5309976, 86584, 43287, 3866078, 5970225, 7696354, 6794110, 1522692, 7464723, 4411871, 6421408, 5768012, 610349, 1626353, 4924708, 4622592, 2741030, 7517346, 709470, 4340953, 1983696, 528704, 6124951, 7994473, 7199130, 7170230, 5841084, 5284857, 8208474, 5920060, 2093485, 2430175, 2313157], -[1450294, 7600335, 4969116, 640451, 5892376, 6733426, 4601938, 8377860, 6246432, 5409696, 1238813, 676860, 6419778, 429241, 85876, 2858934, 7829108, 6457799, 6712300, 4018771, 4710396, 5769143, 4535750, 8285250, 7078627, 4421203, 2117335, 3566136, 4795521, 3832217, 3052582, 6386610, 6459982, 7000881, 7220645, 831610, 4857509, 7959532, 6371064, 5838148, 1238444, 3001201, 8288065, 877459, 7639876, 5878440, 7717020, 6130367, 7819327, 5383181, 4579673, 3266758, 1633350, 62582, 626663, 7779807, 7227172, 287206, 7233778, 6164375, 2459087, 5952058, 2798544, 5203762, 609992, 2565686, 1930329, 5910152, 7928492, 8230797, 5007212, 6926363, 5524635, 8127809, 4469328, 2982846, 3137133, 2783827, 3528764, 7030262, 6853738, 3381157, 1174948, 7981468, 2887749, 5331850, 276081, 2028320, 3938458, 2357421, 3379591, 4445826, 5854896, 7895491, 6120656, 798033, 3438893, 2563395, 2992660, 5309288, 343092, 5780320, 6450758, 3788311, 7733789, 3230137, 7422135, 30993, 1849765, 5886407, 345125, 6799736, 7163422, 8147327, 2850507, 740038, 1825750, 3282952, 8289303, 5964182, 1411626, 3084420, 4658070, 7126747, 7988424, 2256593, 600124, 7905823, 4521652, 2249896, 3173042, 2318433, 3286481, 5511667, 5717025, 2383657, 7723080, 5023729, 5567598, 3963980, 2375425, 345397, 4121538, 6892843, 4422930, 586649, 7443271, 3317360, 3387363, 4102713, 5724656, 2292149, 889169, 913790, 7911091, 4447392, 5151084, 7800654, 7530021, 4450617, 2474829, 7506827, 6048347, 1907629, 3007232, 4117399, 7168452, 5988523, 7358370, 7798271, 8194360, 370202, 5827203, 6302895, 1715083, 2144303, 5989779, 7936983, 6558497, 3000978, 6294814, 6574192, 3535674, 8274971, 5731891, 5718458, 5551280, 1131387, 6343886, 7561450, 880696, 1192615, 2608113, 7273921, 7768336, 424203, 196828, 2416737, 7235486, 1927037, 3210382, 7674752, 4208181, 4980223, 1347686, 1559574, 3489116, 2168654, 2894937, 3625482, 3415697, 4006145, 8342323, 422714, 4048810, 7682033, 5291569, 6537823, 302165, 6176936, 8143509, 5340600, 6976485, 6142122, 6873427, 101931, 4630772, 871834, 5175983, 4335932, 6275119, 668296, 2152648, 5990254, 2435687, 1899989, 1593546, 1155976, 8100643, 2177257, 5330743, 4166419, 7994906, 4975180, 1551983, 6143258, 1761673, 5723383, 6535933, 6262999, 5823504, 6893429, 668523, 8278975, 3920904, 8316728], -[6792338, 8017915, 1323692, 7375684, 3355744, 5738116, 3521259, 5017319, 631657, 7094642, 4183379, 6548795, 2251912, 7895582, 4192978, 372639, 4769559, 7161503, 4679566, 6857082, 3774673, 7963502, 6546950, 3834522, 4414716, 6570064, 1228789, 3748636, 699934, 1306952, 5999144, 3007111, 7757451, 5833970, 1656962, 4315003, 4348791, 1287339, 2919988, 790738, 5630851, 4101964, 4922800, 3599341, 6702383, 639047, 211283, 2588773, 787044, 4644016, 2772192, 7342919, 4524242, 7872277, 2094574, 5289933, 1299867, 7694433, 4356097, 7213062, 60271, 5906270, 1463291, 4690221, 7466600, 3023983, 240254, 5576739, 3996289, 2302798, 3510162, 182795, 4884880, 8246434, 6255658, 6106148, 1773076, 6426100, 7171378, 469721, 7191359, 2453977, 2397661, 3177428, 541871, 5848992, 29088, 3609181, 4429119, 1341080, 5352094, 2009884, 2657019, 2616827, 1143376, 4786771, 4936599, 107644, 1462511, 4525974, 3220035, 3020095, 2345414, 3087150, 3867745, 3943787, 8245118, 7043288, 1563978, 4638156, 5792544, 1042737, 6321829, 4062512, 3054084, 2612302, 2878821, 7217808, 2815318, 4372925, 2988383, 577493, 5661676, 4119329, 6599303, 7043874, 8173230, 4037610, 5292258, 136309, 689721, 2063228, 1536564, 7436941, 6594623, 6095640, 982019, 5811976, 6709749, 740120, 3901333, 4702738, 696644, 4053805, 7848686, 4534540, 2858957, 5080877, 5381283, 6217059, 467913, 528254, 3926522, 757295, 1069890, 2341681, 1329209, 3207598, 6480383, 2655709, 2506601, 399729, 2827647, 2282081, 5310004, 4627543, 33355, 4121096, 4594474, 1629724, 2642687, 6238346, 2305421, 2689699, 4674290, 1933747, 5996811, 8044099, 5553334, 5333060, 6802808, 3369573, 8038312, 25306, 6946061, 1209123, 7070509, 6136031, 8029209, 6591490, 6596492, 8135950, 3311806, 6950767, 4183793, 1760760, 2691758, 6884374, 3944263, 8039169, 1420348, 2587695, 6444888, 4447749, 6830087, 3902879, 2066142, 2414675, 95397, 2527788, 7341181, 1376319, 3676487, 1642800, 4183850, 4393310, 3773089, 2862882, 1719060, 2077584, 3913029, 1722557, 4872784, 225597, 3990287, 3071375, 2866778, 7541207, 6552634, 5734495, 5892697, 4991323, 845649, 4016383, 1650686, 3041056, 6885310, 8333488, 1912811, 6766309, 6938368, 4926584, 3251078, 4663678, 3208508, 7244430, 4753846, 2984214, 1337911, 2263810, 3544897, 7508067, 2573675, 5150369, 3060357, 5698650], -[75531, 7144838, 3145086, 1275301, 1405848, 5563101, 2736491, 5008805, 2922303, 2642105, 206378, 5398703, 5192313, 2359343, 3801539, 6475596, 5782186, 510172, 4191245, 3999524, 6310287, 485773, 2124794, 429374, 3804973, 3000733, 2946475, 1782222, 7328156, 2999389, 4386848, 2550297, 5154009, 4757724, 1019441, 5190613, 3748187, 896151, 1706156, 3205839, 6890011, 5390811, 440181, 3302175, 727920, 4840156, 1453708, 7616661, 6816798, 7417902, 61893, 5157830, 6340579, 665145, 5076767, 1732769, 7178469, 800108, 2936131, 5485060, 4609253, 6558981, 473108, 7172555, 1281994, 245795, 5584019, 66018, 6981650, 5367788, 2853158, 6144544, 5685772, 246160, 7316595, 1176399, 159408, 3191813, 1363085, 3806192, 3497713, 5004638, 1522687, 5616622, 470730, 3974082, 190681, 3279896, 7033589, 6150650, 689093, 2088393, 4340605, 5514092, 7433773, 4474534, 407723, 4593155, 1846529, 8376990, 8041615, 4842570, 5549686, 3477467, 5010373, 3676078, 7010570, 2652258, 3879769, 3409568, 8242236, 4620263, 4392816, 933109, 1787640, 3731720, 5423774, 5818919, 8359963, 5056676, 6812515, 7704991, 6508530, 719577, 5376876, 5417416, 3074882, 1758225, 1513312, 5759543, 2559776, 7518946, 2995364, 8337365, 1432008, 3664551, 6628931, 5338849, 4598690, 8229160, 8331487, 3500632, 4419148, 4366767, 3488895, 346732, 3848414, 6004091, 4125467, 496236, 636059, 1587834, 6454098, 5670633, 557342, 5363837, 525956, 677544, 1439099, 5863531, 8194201, 2740396, 5979941, 1432733, 5634306, 1838542, 7338582, 1882372, 908499, 7811373, 3845515, 5848479, 868615, 2614833, 5080326, 1367001, 3716682, 3776475, 371710, 650219, 947867, 5325942, 6490006, 4514763, 3799343, 7607113, 7316826, 4826560, 7716632, 4888465, 5425846, 6148184, 4171867, 6299850, 3151590, 7355127, 312358, 2697461, 5027388, 927664, 6515648, 6793741, 5604708, 3028471, 2189060, 2205381, 7410957, 8148090, 5384505, 453607, 1451864, 105364, 6665090, 3435708, 4810287, 3443261, 230586, 17478, 1128420, 1382851, 183569, 2885316, 994323, 1599001, 600981, 1911590, 18633, 1510443, 1124329, 5203306, 2692118, 4792953, 7420566, 2668417, 1438461, 8357324, 1895277, 222575, 7864330, 1493559, 4099445, 7244308, 1886893, 7203743, 1505290, 2850621, 2381978, 39519, 7499402, 1858615, 6681129, 1649513, 1804081, 1315678, 301241, 3194475]] -aHat * NTT(y): [[4144274, 3882210, 6189089, 2800333, 7170079, 1955717, 2067521, 6335262, 3712617, 3998888, 6100077, 4572472, 1409300, 7600513, 2539865, 7696729, 7168397, 4059264, 1483606, 1202122, 7497155, 5306702, 8108071, 5084950, 2451769, 6850864, 825665, 2706020, 337052, 8085330, 8071026, 686285, 5128845, 7834920, 3786674, 5786834, 886303, 4349147, 6403963, 7738178, 8043410, 664146, 2224473, 3785684, 5453763, 7410122, 6576050, 4888548, 7204709, 1050302, 3890917, 2689953, 1023061, 8319709, 4721202, 7386291, 5379876, 2194838, 1297802, 675432, 3735745, 3523094, 4865252, 3471405, 5727577, 7174662, 4897457, 5057175, 1876580, 7432031, 3924620, 1701595, 649297, 1857091, 323528, 3165593, 2681704, 6047248, 3965532, 7814313, 2119878, 8067580, 4000374, 4554383, 6403311, 5948918, 3685423, 1908012, 420264, 5349926, 4654511, 3221351, 7681492, 3981112, 6388845, 3904716, 4797659, 4518555, 6706259, 564103, 6112714, 4361351, 5984502, 2272797, 4740989, 11816, 143248, 7463577, 347639, 6679251, 6705835, 6845785, 4054627, 6614122, 795643, 5774979, 4200013, 8078417, 1464582, 1441055, 298495, 3941806, 7202076, 1185948, 5540222, 4457463, 8132816, 6387087, 3492343, 3625822, 501026, 7976862, 4361016, 7427868, 3105685, 867213, 131258, 2905951, 6210916, 3101158, 763342, 8176843, 4032839, 5591695, 5314452, 6533064, 5579623, 4920002, 3933866, 5583038, 350131, 4389643, 8279051, 4437228, 6803463, 696486, 771147, 8311848, 1236218, 7099074, 7671952, 2779216, 5722795, 4182132, 7396608, 7972044, 8218885, 1088582, 5107062, 683038, 110671, 7822081, 1506962, 7239329, 6738873, 6300221, 341687, 1207159, 5115690, 6285552, 7140798, 7908220, 6844030, 3462309, 427478, 8220817, 7812996, 3017072, 8075507, 5014500, 5293767, 5196505, 330973, 277826, 5782650, 4815922, 603819, 8095184, 5815112, 3890090, 3599719, 6947198, 5529166, 5403879, 5967639, 1827159, 449565, 3226207, 7096242, 3148589, 288262, 4637948, 3903066, 1966570, 7544432, 1266919, 1871975, 2814281, 4832984, 7587970, 6539739, 3078897, 5852852, 5615308, 2280117, 1046783, 6464821, 1765079, 1102385, 6747240, 8308562, 4496111, 3375685, 2923931, 2633909, 158531, 6378761, 8118144, 8092436, 6889707, 7173652, 6524258, 2527895, 5395555, 5041932, 7972812, 4069069, 188182, 3275869, 790387, 485455, 6812533, 996658, 939364, 2552181, 1907716], -[3310673, 6584723, 4256821, 4423043, 5740081, 7152419, 1107188, 2857595, 3501440, 7926395, 238828, 6471303, 6091950, 2530605, 7739399, 32332, 6084313, 4682895, 4264754, 3328161, 4107367, 617806, 6862784, 1602423, 6148799, 199772, 4518004, 3273533, 4065189, 1376919, 746451, 7067797, 4841202, 6098944, 5202174, 596572, 7843656, 2518681, 2824115, 5421574, 6674394, 5108430, 3466094, 1465585, 7621319, 614772, 1475818, 1257007, 3537333, 4196340, 4074835, 2341140, 5248957, 3622460, 3645651, 872662, 6415900, 531990, 6874385, 6691947, 1949091, 7705466, 8283039, 5073405, 7626706, 7149173, 5016725, 503084, 618275, 6972755, 7476410, 2246886, 1862074, 2879809, 6450141, 4934657, 7640140, 1929716, 6089702, 6406014, 3912126, 1596082, 5730190, 4572350, 6465763, 522098, 6452647, 5470610, 5716945, 3752330, 7634172, 4912428, 6237447, 4397056, 37478, 7553062, 3406767, 4365124, 2825195, 3809909, 5793781, 7739563, 8270188, 1514790, 4597110, 6874705, 5100592, 1679612, 6818076, 2122654, 4351637, 1207094, 3295383, 738372, 6121733, 7855408, 3688859, 1862294, 7153220, 8042167, 4462015, 4495780, 4412720, 1814850, 92074, 6360041, 3673307, 2322117, 476052, 7906465, 7623357, 8207198, 423149, 3667806, 534277, 1207814, 5535931, 7188756, 406098, 5249190, 1505526, 7906197, 6470709, 4728109, 228471, 2570782, 6410928, 219006, 5172495, 766605, 754842, 2178103, 2248660, 8376797, 6741810, 2181779, 1110677, 8229268, 1090553, 124028, 5324052, 1524586, 4946426, 662925, 7164404, 7622807, 5730833, 4233721, 8254985, 719775, 3751417, 5608725, 3038436, 4972086, 5254433, 3438390, 861972, 1403151, 7515739, 4444154, 7309743, 4465965, 7481136, 7634920, 4196761, 2513661, 7218961, 7748591, 5102932, 3371344, 779501, 8013332, 444990, 617866, 47945, 1952276, 4620586, 1567141, 6884371, 4426593, 5288319, 2002666, 6635384, 2336825, 7314293, 5552410, 7161424, 2326526, 7385512, 5203089, 1278344, 2597734, 6669418, 716918, 7267912, 3972873, 3266810, 7514690, 8170177, 4168202, 7669663, 7116283, 3377758, 6841918, 4229241, 5648224, 3848207, 5908751, 5152678, 5100878, 2252324, 4689949, 1895267, 5205668, 6482314, 2675218, 3598946, 5241833, 7226258, 2702358, 4866154, 2472614, 1294442, 3355639, 6391995, 3867390, 499557, 8291174, 2832166, 414677, 7160097, 1563257, 8076795, 1899047, 5024272, 746138], -[1863462, 8228515, 4510511, 4521813, 291945, 2732465, 1561462, 4159181, 6089267, 7917695, 4066511, 1527438, 8077015, 2407716, 7251305, 6955545, 3737560, 3824978, 5354649, 6765640, 832991, 3310249, 3301881, 3842493, 6920664, 4096078, 2288058, 663410, 1940270, 5144295, 3144197, 1908700, 6111344, 4984527, 4583056, 232774, 4172557, 5953582, 2900140, 1321567, 781413, 1475216, 35758, 8269624, 200628, 7375241, 7751897, 8000001, 6376844, 7643741, 1782649, 2871982, 5685188, 6816062, 6265747, 3333818, 5339377, 6062400, 8231353, 5151547, 1303032, 7605467, 4219679, 3032562, 3051528, 6133923, 2938662, 2619875, 4687130, 3210914, 2820886, 3422846, 1113189, 3119335, 6497951, 3927393, 79714, 5741686, 36594, 4895530, 4190231, 2558019, 4043456, 1540910, 1587164, 6399679, 1677417, 6753898, 1686789, 3985346, 3554817, 7801860, 4532268, 5919789, 6821591, 7734612, 6888264, 2034397, 2471044, 1882894, 8231596, 5645462, 8232577, 1296774, 1103312, 1160597, 1381391, 3612644, 5779139, 2345767, 5201181, 6945911, 4684891, 5788782, 5808285, 8193565, 8152741, 3611692, 4142311, 5065162, 6998906, 3908297, 4175995, 3179810, 4281508, 2731089, 5994007, 191394, 3228014, 2884452, 5929987, 2942005, 3710162, 3020925, 3385861, 8032500, 3842892, 7907684, 401459, 5165860, 1932631, 7834403, 7088028, 4403901, 6819251, 716477, 1286410, 5810459, 5949895, 7032372, 8127872, 4674850, 3437902, 5245959, 4975012, 8131826, 2001019, 6819916, 6914547, 5772646, 2463634, 8181397, 4652644, 2755504, 2929339, 77362, 5370152, 185408, 4498664, 1879417, 6903199, 7299061, 257387, 7847557, 4306113, 5224341, 4322346, 4487204, 3603019, 1801132, 8257892, 4366050, 6605828, 1730509, 7430147, 4894290, 4095832, 3257758, 6023227, 621909, 1007919, 6655508, 1591725, 703111, 1079906, 3575857, 3294936, 638211, 781677, 6421764, 5395440, 3829719, 665702, 8965, 7054306, 6879192, 6166146, 3103988, 3627697, 5677764, 6529684, 3703970, 495370, 4853262, 3971411, 7673028, 6565599, 4298940, 5944960, 5391356, 3518962, 8361170, 7485150, 4149503, 7343899, 4288844, 2972189, 7742445, 7891923, 322846, 7892745, 7513844, 3160236, 2337094, 8342188, 4527148, 6736737, 4076970, 6181368, 3526924, 3071723, 7395158, 431786, 643529, 6405, 4968036, 2043582, 2502842, 6020143, 2084658, 3470467, 2138911, 1631425, 7017406, 4017458, 6873776], -[2893199, 4157094, 5114382, 624703, 3252593, 7160788, 794359, 3458378, 5232909, 4068826, 1104109, 6294713, 5605266, 3178350, 214573, 5987820, 1478815, 4367625, 7198071, 3046495, 2215954, 6460587, 5393865, 7750735, 6411944, 7321206, 1012716, 1449409, 55254, 2174016, 2865714, 6535046, 8319332, 7494330, 2848521, 4282859, 1310301, 5911919, 113557, 167062, 2009906, 3196461, 3058256, 1276542, 4260348, 7489333, 6611486, 5757423, 156404, 3696955, 4669080, 3420771, 2851837, 6670984, 6421205, 2418186, 1618023, 6202753, 3912907, 2281466, 7383963, 4032687, 1893353, 698123, 1241904, 6036994, 7621466, 444040, 7206733, 7475738, 4296405, 5394445, 5548077, 2270635, 2896415, 3971895, 4957889, 1044531, 3509764, 1057374, 142908, 189532, 4348456, 3855838, 2201429, 927945, 4730167, 2686192, 432497, 8152866, 7811321, 5283853, 1120740, 5684551, 2103035, 8096754, 1999760, 2703355, 5833296, 1743509, 5769198, 6154688, 5702154, 2879151, 1998827, 5354998, 1153545, 3236196, 2311514, 1091594, 6803587, 3035718, 7830864, 7365957, 118029, 5796654, 2898869, 5791908, 4248808, 3571860, 5786550, 1694033, 7880676, 6300836, 6752109, 2980795, 6555008, 7185482, 7096997, 666958, 8341240, 487708, 1203927, 1285412, 4247534, 6080137, 6420107, 7894228, 7575048, 3765019, 4733118, 3555864, 2527610, 2030926, 3834391, 4206352, 1648992, 5309696, 6173724, 7612515, 4009315, 2889966, 1950353, 3261490, 1559693, 3940970, 5809863, 194098, 2742500, 5909317, 399034, 3710235, 4527618, 3733296, 8232010, 2135703, 1212383, 7473109, 4716837, 2675752, 3595095, 5751270, 1509654, 6773794, 3140435, 7536971, 6242543, 5085144, 3373029, 8297294, 903555, 6141296, 7663413, 3595264, 6804962, 2418131, 8117535, 1168082, 3559354, 4288728, 6444103, 3261400, 1312794, 4148734, 6597991, 1210027, 2597178, 78583, 4420719, 7204203, 5577092, 4655560, 1010485, 7515016, 2217964, 4385486, 4383892, 1874480, 1610375, 3646462, 5189649, 5858396, 2556796, 6181906, 4213927, 7599387, 3776794, 5875577, 2817437, 1585748, 4632038, 3820162, 5878402, 2442252, 506218, 2501130, 2225710, 1968322, 4319111, 6905736, 2400751, 1605052, 6875547, 277138, 2544234, 1359483, 1109025, 974980, 1952090, 5985380, 571094, 4703785, 2144204, 1480602, 6507379, 7135800, 3706793, 6318609, 2826810, 456600, 6403527, 6126876, 4414789, 7990540, 4777506, 1969069]] -w = NTTInverse(aHat * NTT(y)): [[5240747, 5672693, 3227538, 5608643, 7376451, 6268395, 7842310, 742097, 1523549, 832881, 501924, 8067281, 6329495, 5504776, 3971888, 3801791, 4117407, 6478341, 2044156, 4245917, 6845811, 5187328, 7202402, 132576, 2973864, 3083763, 302412, 1720639, 7057094, 2524533, 5042064, 3599604, 6848856, 2731174, 7342942, 6450165, 1980970, 5897922, 4130069, 7389301, 7300570, 4744648, 2426563, 3852275, 3488525, 2280443, 7124268, 7590420, 2647237, 7998436, 5393177, 5633010, 6830940, 4848716, 4394142, 2495788, 6551700, 1688296, 548462, 3988400, 6527720, 4933464, 7665692, 1326029, 1516316, 3770183, 7816033, 5773859, 5063489, 8331669, 249865, 2543470, 4343337, 3966017, 1354714, 7497374, 757590, 8350046, 5989356, 1766692, 3196249, 3257950, 1102775, 6794739, 6709857, 7652958, 4962759, 4217553, 279543, 3996828, 5422508, 996570, 4230292, 1848464, 4362788, 5392107, 5452405, 5070186, 4205000, 5815772, 2596502, 784391, 4842747, 750757, 735549, 1580091, 7884651, 7809786, 1830210, 7939330, 7195384, 5256472, 4187312, 8089158, 2473883, 371460, 8367488, 1553296, 8135784, 31569, 929530, 3904674, 3604817, 3641032, 5216924, 1999566, 3020352, 230736, 6684437, 131984, 7940540, 3017812, 3704888, 7936164, 6134995, 3451266, 5394412, 193176, 6421784, 4609355, 2581791, 6067133, 2566648, 3216610, 166624, 2000942, 5056112, 8323814, 3908194, 8004673, 2632282, 2754041, 6884513, 2991808, 864632, 3663442, 4878602, 1016755, 4680101, 8213279, 1551614, 7035006, 4825567, 6221821, 460349, 4390147, 6216168, 4067523, 5040720, 3454257, 6810282, 4250322, 4437033, 8182814, 5415801, 6751259, 3754036, 5740963, 1658612, 3221233, 2787967, 7245169, 2938437, 6782459, 7376991, 3686538, 415207, 7442012, 5599946, 803012, 2662455, 4225029, 1532350, 839362, 4384986, 2927226, 4545225, 8052407, 2750653, 6448225, 5601627, 3556228, 5844593, 1394193, 5775775, 3999132, 2465249, 7126096, 5045765, 7056753, 5456519, 7031953, 8251598, 7902156, 2794665, 1770555, 5712115, 1588768, 2397968, 5079326, 831379, 5482259, 463048, 6307231, 5288168, 626211, 2831874, 1998765, 7987835, 5145889, 1892307, 3756507, 6304023, 8113079, 2862649, 705318, 3296139, 7281485, 7935359, 7029680, 1031804, 5814077, 1065813, 5413058, 5261434, 7031552, 524666, 5598565, 3519255, 7258729, 6343450, 5852651, 7410679, 6370965, 5275666, 2377834], -[2372408, 5148935, 2871099, 2339952, 942158, 6919222, 6738035, 4755467, 3688906, 3143494, 7888297, 6002947, 5360600, 133898, 7624213, 4333442, 2758162, 3938280, 4684260, 3361731, 6744937, 1025626, 4106406, 3133840, 2587414, 2317745, 2248246, 1491727, 7768858, 518974, 4890218, 1170283, 4044416, 8243589, 4880109, 3982734, 163778, 6180136, 642041, 3958715, 640528, 4500758, 936883, 3420855, 903676, 4279283, 2640041, 7037250, 2639949, 1021221, 8287786, 2236790, 5146386, 7814187, 2519268, 3027913, 2698240, 1436239, 5753935, 8331629, 8190721, 2884215, 4592001, 7115430, 1658135, 8055933, 3395864, 1055723, 1286332, 2266150, 4925780, 1342753, 7221629, 3275889, 420036, 4383787, 6596804, 4886364, 403728, 7403839, 4590800, 6241413, 979285, 5805919, 595049, 222061, 8296360, 2297330, 762009, 3711511, 4123904, 2236314, 1346340, 2496854, 6082325, 6285886, 639722, 7091728, 7790192, 3021490, 3162602, 1554899, 7959942, 264931, 2266931, 7907517, 2882008, 3835841, 7204516, 4131753, 4204147, 1688229, 2472738, 7043048, 2723839, 6618718, 6159021, 1917291, 2799286, 813030, 6562778, 2283152, 7531518, 3048208, 7886025, 5373703, 4602442, 5956585, 779518, 5276990, 359411, 6385168, 4082249, 8027961, 732873, 3848337, 6976544, 3318429, 1899046, 6614440, 3442407, 5616118, 2521541, 7103084, 7143073, 3338908, 7157962, 3655372, 2579438, 5406730, 7075296, 2214366, 7671568, 3623416, 2421205, 380746, 448692, 2157547, 6866378, 7334276, 7638301, 1761595, 1814677, 1102698, 1455103, 7151160, 6252901, 5405069, 3398018, 893065, 887005, 3177102, 8059571, 3308680, 4888893, 227522, 7390213, 2003790, 1200007, 3803506, 7589557, 8084676, 7091448, 5277859, 664533, 7286025, 4425325, 6503114, 6216497, 3216404, 8371159, 8144692, 4600578, 906457, 7670130, 8017550, 5357653, 5096774, 5100613, 7061785, 2503106, 7871969, 3504264, 350901, 5773984, 4568479, 5154200, 456180, 6150492, 1894436, 5146415, 5942729, 1197350, 1963713, 4963992, 189838, 7231182, 3010, 5231405, 7331436, 5306107, 11532, 7777916, 3846343, 5028605, 1720909, 3503617, 386350, 2110826, 2216524, 7217965, 5166180, 5935291, 7206917, 3388964, 3890310, 7959534, 2412120, 2421416, 894625, 4708212, 4941244, 3274949, 4808792, 7715243, 4972535, 1887560, 5520257, 6912844, 869584, 2380688, 4562925, 7629920, 3259665, 1755072, 3470501], -[3622494, 6849580, 8092213, 2176282, 6904567, 3383684, 1516101, 4569658, 4392041, 4746397, 384707, 1416563, 2912589, 3089735, 7588573, 6817864, 4989858, 921962, 6837918, 7653782, 370780, 7331204, 3899889, 852672, 7500533, 7847951, 3843392, 293214, 2311605, 645246, 2891830, 599168, 4129941, 1769792, 4637871, 8210557, 6621796, 3344046, 2692818, 5086533, 1167581, 479620, 4077095, 8133417, 7377655, 1500449, 6555264, 2770166, 250407, 1822035, 5862085, 3588964, 7176297, 4900688, 6225743, 5094498, 4432985, 1275089, 6057134, 4094413, 8262040, 5346419, 3865417, 3458155, 6437287, 4032994, 8180652, 2417033, 8015675, 1205608, 6349312, 435739, 6895282, 7722035, 3206064, 3440389, 4166859, 7992685, 4593815, 7432299, 4786788, 6757075, 1471102, 7515584, 2860714, 5557268, 3028178, 7457854, 2690909, 3929688, 2556162, 8264578, 3097217, 8196621, 4597343, 5600906, 66060, 242843, 3839856, 3736533, 8109556, 5776139, 7848546, 5273387, 7544859, 8155973, 3067151, 385241, 5448210, 2681498, 6324306, 1699867, 2061127, 5875578, 5481315, 761470, 4182775, 306710, 3919797, 6137526, 4685491, 2459267, 2541842, 1309515, 54707, 4115861, 6384958, 4810291, 174287, 4563127, 2374644, 985515, 7720036, 6044326, 7119367, 5875106, 1349751, 6703156, 7718450, 5136671, 3614071, 2694005, 8190231, 2113041, 3358374, 2319291, 5921987, 4609745, 3894305, 6133312, 5492359, 4291965, 7299498, 2132622, 3284134, 3667456, 4248642, 6794917, 6340304, 3815553, 1392962, 1358167, 3995327, 1753113, 7969634, 6981901, 8062522, 1575657, 2742903, 1783441, 5014424, 5600572, 6144808, 4913785, 5774805, 3057978, 1382027, 6998770, 7512962, 1634783, 7737997, 5834171, 3535265, 495038, 4368444, 3491532, 7256577, 2168522, 4410372, 7488221, 7502775, 2079786, 1689590, 8217265, 389526, 7692057, 664208, 4538111, 7640137, 1407809, 466377, 6923395, 4180491, 4355239, 6915708, 3376592, 4819809, 5850008, 435191, 788446, 4526079, 406052, 1297933, 1748696, 7312568, 6854101, 2960580, 2777276, 782110, 6657166, 89213, 1777360, 837904, 5691196, 6123731, 2450395, 2140829, 835885, 7372722, 4845784, 4459638, 6960650, 6482154, 5732863, 7671172, 834450, 8185890, 7854399, 4675607, 5371078, 932390, 3911429, 5507192, 5705134, 3050038, 2762170, 4515537, 8334988, 7161755, 7069872, 7340379, 4728511, 6659351, 6996066, 242550, 2250930], -[882108, 511705, 845173, 1559300, 1522215, 5680306, 2929296, 355960, 1660697, 8044881, 1202084, 3487501, 3016183, 3704534, 3797478, 2093828, 3145046, 7780597, 341953, 2356399, 2659543, 2459566, 263214, 8178617, 2516685, 2079118, 2710125, 3967245, 225744, 5173194, 6894647, 2194676, 6824368, 6360608, 2473485, 6679687, 7384007, 2616069, 5371742, 118010, 938139, 1938537, 509060, 3839143, 4652224, 2839677, 7990397, 5329606, 2600008, 6261443, 2978851, 3480065, 6089332, 5264862, 1723491, 1436502, 2352586, 7519934, 831696, 2364121, 4206141, 1977072, 666415, 4810798, 2987887, 6243866, 1205281, 4591008, 2945634, 1312375, 3265493, 6591275, 4583142, 624725, 2215596, 4731326, 1380294, 6064913, 6069760, 4934519, 5669881, 4949154, 2147281, 2659524, 7237966, 3502709, 8345051, 3215216, 5999220, 6508105, 8231826, 5836690, 4274766, 6144633, 607249, 363036, 73549, 2806452, 4770069, 3815458, 4763934, 7805658, 1142346, 7321343, 5990111, 7534253, 2257202, 2004873, 6363291, 5007230, 7648911, 3737281, 2336716, 6995648, 6498869, 5071227, 1735654, 3267753, 6569470, 4207762, 1850981, 67973, 7259357, 1094882, 7123714, 6354580, 1385379, 1400880, 4693889, 3935715, 5072713, 7413756, 4214246, 6182859, 4775054, 2703730, 602984, 151265, 7062311, 3709874, 3035746, 3680113, 7722638, 6841570, 2739151, 2719607, 1736021, 3417108, 6934077, 265492, 3084409, 6258644, 6473107, 6948633, 2896707, 4443152, 7948315, 6292580, 2358615, 1340536, 8052109, 4997192, 3525338, 6226753, 3870815, 2555135, 4601312, 5001999, 6588357, 136836, 3329409, 3022544, 4179507, 2195831, 342767, 7953085, 6790691, 4948438, 6050240, 1274475, 1008380, 6777100, 3834396, 103282, 2175452, 4517483, 2882968, 2036959, 6167178, 4123601, 6814078, 3042355, 4928589, 7659749, 6811725, 7924782, 4350315, 4277532, 8121446, 3906134, 7678818, 3039607, 329100, 3250147, 4536479, 8102324, 3122349, 3258331, 5543485, 1623554, 2961601, 531164, 6989857, 3155291, 3992890, 3249006, 6998705, 3427240, 5841005, 4726045, 5077683, 3684412, 7907166, 7851733, 6230450, 5620145, 1891732, 7588632, 5013068, 2240931, 3948644, 7779383, 1869245, 8353876, 8096887, 3859237, 6343444, 8023541, 4925356, 312282, 7807601, 1224819, 5099734, 5354219, 7401201, 8089955, 6744198, 1766930, 7923437, 2036298, 2238041, 3017653, 2149442, 221260, 5037404, 7018813]] - -w1: [[28, 30, 17, 29, 39, 33, 41, 4, 8, 4, 3, 42, 33, 29, 21, 20, 22, 34, 11, 22, 36, 27, 38, 1, 16, 16, 2, 9, 37, 13, 26, 19, 36, 14, 39, 34, 10, 31, 22, 39, 38, 25, 13, 20, 18, 12, 37, 40, 14, 42, 28, 30, 36, 25, 23, 13, 34, 9, 3, 21, 34, 26, 40, 7, 8, 20, 41, 30, 27, 0, 1, 13, 23, 21, 7, 39, 4, 0, 31, 9, 17, 17, 6, 36, 35, 40, 26, 22, 1, 21, 28, 5, 22, 10, 23, 28, 29, 27, 22, 31, 14, 4, 25, 4, 4, 8, 41, 41, 10, 42, 38, 28, 22, 42, 13, 2, 0, 8, 43, 0, 5, 21, 19, 19, 27, 10, 16, 1, 35, 1, 42, 16, 19, 42, 32, 18, 28, 1, 34, 24, 14, 32, 13, 17, 1, 11, 27, 0, 21, 42, 14, 14, 36, 16, 5, 19, 26, 5, 25, 43, 8, 37, 25, 33, 2, 23, 33, 21, 26, 18, 36, 22, 23, 43, 28, 35, 20, 30, 9, 17, 15, 38, 15, 36, 39, 19, 2, 39, 29, 4, 14, 22, 8, 4, 23, 15, 24, 42, 14, 34, 29, 19, 31, 7, 30, 21, 13, 37, 26, 37, 29, 37, 43, 41, 15, 9, 30, 8, 13, 27, 4, 29, 2, 33, 28, 3, 15, 10, 42, 27, 10, 20, 33, 43, 15, 4, 17, 38, 42, 37, 5, 31, 6, 28, 28, 37, 3, 29, 18, 38, 33, 31, 39, 33, 28, 12], -[12, 27, 15, 12, 5, 36, 35, 25, 19, 17, 41, 32, 28, 1, 40, 23, 14, 21, 25, 18, 35, 5, 22, 16, 14, 12, 12, 8, 41, 3, 26, 6, 21, 43, 26, 21, 1, 32, 3, 21, 3, 24, 5, 18, 5, 22, 14, 37, 14, 5, 0, 12, 27, 41, 13, 16, 14, 8, 30, 0, 43, 15, 24, 37, 9, 42, 18, 6, 7, 12, 26, 7, 38, 17, 2, 23, 35, 26, 2, 39, 24, 33, 5, 30, 3, 1, 0, 12, 4, 19, 22, 12, 7, 13, 32, 33, 3, 37, 41, 16, 17, 8, 42, 1, 12, 42, 15, 20, 38, 22, 22, 9, 13, 37, 14, 35, 32, 10, 15, 4, 34, 12, 40, 16, 41, 28, 24, 31, 4, 28, 2, 34, 21, 42, 4, 20, 37, 17, 10, 35, 18, 29, 13, 37, 38, 18, 38, 19, 14, 28, 37, 12, 40, 19, 13, 2, 2, 11, 36, 39, 40, 9, 10, 6, 8, 38, 33, 28, 18, 5, 5, 17, 42, 17, 26, 1, 39, 11, 6, 20, 40, 42, 37, 28, 3, 38, 23, 34, 33, 17, 0, 43, 24, 5, 40, 42, 28, 27, 27, 37, 13, 41, 18, 2, 30, 24, 27, 2, 32, 10, 27, 31, 6, 10, 26, 1, 38, 0, 27, 38, 28, 0, 41, 20, 26, 9, 18, 2, 11, 12, 38, 27, 31, 38, 18, 20, 42, 13, 13, 5, 25, 26, 17, 25, 41, 26, 10, 29, 36, 5, 12, 24, 40, 17, 9, 18], -[19, 36, 42, 11, 36, 18, 8, 24, 23, 25, 2, 7, 15, 16, 40, 36, 26, 5, 36, 40, 2, 38, 20, 4, 39, 41, 20, 2, 12, 3, 15, 3, 22, 9, 24, 43, 35, 18, 14, 27, 6, 3, 21, 43, 39, 8, 34, 15, 1, 10, 31, 19, 38, 26, 33, 27, 23, 7, 32, 21, 43, 28, 20, 18, 34, 21, 43, 13, 42, 6, 33, 2, 36, 41, 17, 18, 22, 42, 24, 39, 25, 35, 8, 39, 15, 29, 16, 39, 14, 21, 13, 43, 16, 43, 24, 29, 0, 1, 20, 20, 43, 30, 41, 28, 40, 43, 16, 2, 29, 14, 33, 9, 11, 31, 29, 4, 22, 2, 21, 32, 25, 13, 13, 7, 0, 22, 34, 25, 1, 24, 12, 5, 41, 32, 37, 31, 7, 35, 41, 27, 19, 14, 43, 11, 18, 12, 31, 24, 20, 32, 29, 23, 38, 11, 17, 19, 22, 36, 33, 20, 7, 7, 21, 9, 42, 37, 42, 8, 14, 9, 26, 29, 32, 26, 30, 16, 7, 37, 39, 9, 41, 31, 19, 3, 23, 18, 38, 11, 23, 39, 39, 11, 9, 43, 2, 40, 3, 24, 40, 7, 2, 36, 22, 23, 36, 18, 25, 31, 2, 4, 24, 2, 7, 9, 38, 36, 16, 15, 4, 35, 0, 9, 4, 30, 32, 13, 11, 4, 39, 25, 23, 37, 34, 30, 40, 4, 43, 41, 25, 28, 5, 21, 29, 30, 16, 15, 24, 0, 38, 37, 39, 25, 35, 37, 1, 12], -[5, 3, 4, 8, 8, 30, 15, 2, 9, 42, 6, 18, 16, 19, 20, 11, 17, 41, 2, 12, 14, 13, 1, 43, 13, 11, 14, 21, 1, 27, 36, 12, 36, 33, 13, 35, 39, 14, 28, 1, 5, 10, 3, 20, 24, 15, 42, 28, 14, 33, 16, 18, 32, 28, 9, 8, 12, 39, 4, 12, 22, 10, 3, 25, 16, 33, 6, 24, 15, 7, 17, 35, 24, 3, 12, 25, 7, 32, 32, 26, 30, 26, 11, 14, 38, 18, 0, 17, 31, 34, 43, 31, 22, 32, 3, 2, 0, 15, 25, 20, 25, 41, 6, 38, 31, 40, 12, 11, 33, 26, 40, 20, 12, 37, 34, 27, 9, 17, 34, 22, 10, 0, 38, 6, 37, 33, 7, 7, 25, 21, 27, 39, 22, 32, 25, 14, 3, 1, 37, 19, 16, 19, 41, 36, 14, 14, 9, 18, 36, 1, 16, 33, 34, 36, 15, 23, 42, 33, 12, 7, 42, 26, 19, 33, 20, 13, 24, 26, 35, 1, 17, 16, 22, 12, 2, 42, 36, 26, 32, 7, 5, 36, 20, 1, 11, 24, 15, 11, 32, 22, 36, 16, 26, 40, 36, 42, 23, 22, 43, 21, 40, 16, 2, 17, 24, 43, 16, 17, 29, 9, 16, 3, 37, 17, 21, 17, 37, 18, 31, 25, 27, 19, 42, 41, 33, 30, 10, 40, 26, 12, 21, 41, 10, 0, 43, 20, 33, 42, 26, 2, 41, 6, 27, 28, 39, 42, 35, 9, 42, 11, 12, 16, 11, 1, 26, 37]] -w1Encode: 9C17756798120831A861575196B858E4660610242465A34DA4738ACA679D66D6501253A28ECA79647635623254A2861E08957A1B103457759C04F02551649023AA5941C515967271DD667D0E91110492A68A6A7296DA0800B20245354D9B020563A042930A4A5C20620ED844C1B20195EA3824544C5A91AD489985C215569A445AD7CA8D9497448FF990E7249C1DE15808713D98EA88DDF41D5ED5945AD9956BFA241ED26C442784DCF028EAA650E1FA1091A996C567705C397492197E67C831CCF6300539665394825C805E4E95496361410EC320E9A019D5AA5501385403564885E5944E01305BDA400EE201EB8395892A1907A31D66245CA3269C585878430030C4643147038643994211A2068CFA50A665254DE98CA0F21022834229877D042788954A5065A48C52D794A6644E0E5732E8D408C2429E68A2188819725251446AA405E76250A85A728379896104AC5881AADCB6954D2A091EB609A0B27D86A20526B0991C90525A22090B636E9F29516AD314991665A9A67464C16068944813A92EA4846057261C0F84925A41A2824911674A09CCF00C5682ADA3E46CC650AD27223E81F24DA6166ED701562B474962B536AA110A641A49968A9DD9889C4F079D4ED5ACD08A75404051AB9772E80A099D1326CBD71196508159D31C80256601C61429587EC7986E93B32E12F36114D85DE6124D161952C751256AA9224EA275A0E641477926E9370D97642ED7792EC92AA003861E02695DA4947D028109476292D0438C40427860B310677695A287126B9A7145D579D08301667966631930C5402088F708896A48D0442D512A304E13ACCDE254C1463264D88CA7C305853250D8A3724E0849209720CC4930963264506860CF118DD8C06407086A9EB638A604449FB87E163808C09351596A981FCA2CA186524C296E49245A0A601A65781C59B59D16983943504ED094928E934864008522F95C6AC81CAA36855483696310411623A8A4061E0549050BF62CA045421A4AAA97B556282444D80A455D020D655445A5F465DBA4A6A1A7A01A53A50AB052A1AA09A9B171A73A26EAC2404BA095 - -cTilde: 46BAEB4009DF2B220F63EA24CA5D78B6DBE55E79A43FD7C75E388A7D452FB673 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, -1, -1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0] -cHat: [8110504, 2195769, 7566973, 2910762, 3505275, 6397897, 920962, 28410, 6598986, 3325059, 1145153, 4452863, 1584934, 7058133, 1066261, 1746632, 3585289, 3166284, 7781596, 3970761, 7075247, 5330288, 4962103, 3633816, 217062, 8117932, 4997044, 6343477, 7817485, 5434992, 4512542, 6809906, 5839438, 94740, 2636891, 6562079, 6671614, 5069468, 6885243, 350327, 6443213, 1886744, 1090774, 8175847, 7074731, 6608162, 316384, 1386027, 6276796, 149594, 7478900, 1214048, 1468380, 7916914, 1548103, 7155476, 3437696, 2842516, 3835414, 8345777, 6168324, 2945192, 1541311, 4767241, 3567756, 1196448, 6971448, 5171065, 2574561, 5635049, 4679109, 7233581, 1119849, 4837544, 4443136, 6980511, 6975530, 2639231, 2414260, 1544636, 466364, 2890317, 6721280, 7792751, 4080147, 3196631, 655656, 5788347, 5436759, 5534645, 3517194, 4251468, 3800478, 8063788, 6510714, 7657592, 4570077, 7159631, 4583726, 1654455, 5039134, 557175, 2332128, 2598376, 5210004, 6901770, 366465, 2344615, 6978013, 8090561, 7408721, 308107, 3364662, 2182763, 7639217, 8254501, 2053304, 2887774, 2490119, 5596991, 7159367, 310130, 1447993, 6519709, 3789856, 1627245, 3421697, 7357630, 2357534, 1879348, 2216282, 2857379, 5055550, 5387204, 3997724, 6733875, 2314522, 4118492, 5242252, 649327, 1559620, 7753949, 1759098, 5722165, 2094882, 6967191, 1094089, 121266, 1912749, 150960, 4487173, 7565554, 3650848, 4880874, 1188432, 299210, 487917, 6385094, 114848, 1442400, 2885870, 3347390, 2440064, 7030575, 1452060, 5410390, 1901664, 2424686, 4217219, 2659041, 8122400, 990061, 7286790, 1969977, 3085123, 2498207, 976008, 2275948, 5142636, 6686882, 2229822, 5654527, 6570724, 1796428, 4401718, 6514587, 7775605, 7208957, 4009802, 2822399, 6901678, 3514630, 7858984, 5911282, 3032251, 5300824, 1889584, 129942, 366928, 443241, 8114435, 374552, 6003794, 2436631, 6238948, 384228, 8304433, 6015748, 7291874, 484730, 2698073, 2215891, 3269857, 3640389, 4184859, 7652681, 5968899, 6497699, 1677880, 115890, 2043367, 659406, 6193083, 8211227, 3892219, 4816700, 7523799, 6657420, 2209508, 8123618, 6753311, 5466465, 5728007, 1391988, 938504, 7799864, 2102793, 8115356, 6735407, 1406325, 3622418, 6136133, 1529033, 7082590, 4364744, 6433168, 5911726, 4847497, 6324685, 3290444, 2433772, 7237518, 3320052, 5914698, 1053773, 1778616] -cs1: [[6, 4, 15, 8380412, 9, 3, 8380412, 13, 6, 15, 8, 3, 13, 3, 8380416, 25, 7, 8380416, 3, 16, 14, 8380413, 14, 8, 8380412, 8380404, 8380415, 2, 8380411, 1, 8380413, 8380413, 8380401, 8380398, 3, 2, 2, 6, 8380416, 8380390, 8380391, 8380403, 8380402, 8380412, 8380408, 8380405, 8380414, 1, 8380416, 5, 5, 8380411, 8380416, 2, 8380405, 8380414, 10, 8380402, 1, 8380413, 8380416, 8380407, 0, 13, 17, 15, 15, 6, 8, 6, 4, 6, 8380415, 8380404, 10, 8380415, 8380400, 15, 8, 1, 8380416, 7, 8380416, 8380416, 8380416, 9, 13, 10, 8380408, 8380412, 7, 7, 8380412, 5, 8380399, 8380411, 4, 0, 8380414, 8380415, 3, 8380406, 0, 8380393, 1, 8380404, 8380396, 8380413, 8, 8380414, 12, 8380416, 4, 8380405, 0, 2, 8380403, 8380412, 8380407, 2, 8380410, 10, 3, 3, 7, 15, 13, 12, 9, 5, 2, 8, 10, 3, 8380411, 2, 2, 11, 3, 8380414, 2, 0, 3, 8380411, 8380407, 8380404, 8380399, 8380413, 18, 8380415, 8380409, 8380413, 1, 8380398, 8380408, 12, 8380414, 8380399, 8380414, 8380408, 13, 8380409, 8380411, 1, 8380395, 8380407, 8380411, 10, 8380408, 8, 7, 8380415, 13, 20, 11, 6, 2, 2, 8380415, 8380404, 8380410, 8380414, 8380414, 2, 10, 13, 5, 13, 4, 8, 8380412, 8380413, 8380413, 8380414, 8380411, 8380408, 15, 8380414, 8380413, 6, 5, 8380412, 11, 3, 8380410, 8380397, 8380409, 8380409, 8380411, 8380413, 9, 5, 8380403, 8380402, 8380409, 8380415, 8380401, 8380415, 8380414, 3, 8380406, 0, 11, 8380399, 8380409, 8380409, 4, 11, 4, 9, 8380407, 2, 2, 17, 0, 8380405, 9, 23, 8380416, 8380414, 4, 8380401, 8380416, 5, 7, 9, 8380412, 8380410, 8, 0, 0, 11, 6, 8380414, 4, 11], -[6, 8380406, 8380413, 8380387, 8380405, 0, 8380406, 8380414, 8380416, 8380400, 10, 8380414, 8380405, 8380416, 0, 8, 8380416, 11, 8380414, 11, 3, 8380413, 8380411, 8380408, 8380412, 8380415, 8380405, 8380416, 0, 19, 3, 8380410, 8, 8380416, 8380413, 8, 8380399, 15, 8380405, 2, 4, 8380403, 8380410, 8380409, 8380411, 8380399, 8380415, 1, 8380406, 7, 8380413, 8380405, 13, 8380407, 0, 8380410, 8380413, 3, 8380406, 8380409, 19, 2, 8380404, 8380394, 8380406, 14, 8380409, 8380414, 2, 8380409, 2, 1, 8380413, 8380411, 1, 4, 8380411, 16, 11, 13, 8380406, 8380408, 9, 10, 1, 6, 8380403, 15, 10, 0, 10, 8380415, 3, 14, 8380413, 7, 8, 0, 1, 8380411, 8380412, 6, 8380414, 11, 8380403, 8380409, 8380416, 8380405, 5, 2, 8380408, 8380401, 1, 8380413, 0, 12, 8380412, 2, 0, 8, 11, 8380411, 8380412, 6, 1, 8380412, 2, 8380403, 8380415, 4, 2, 8380411, 5, 18, 0, 8380408, 8380413, 16, 11, 6, 8380415, 8380409, 8380411, 8380411, 8380401, 8380415, 0, 8380405, 8380413, 8380407, 2, 11, 5, 1, 8380397, 8380415, 4, 8380414, 8380412, 8380405, 8, 9, 8380415, 19, 5, 8380412, 2, 5, 14, 3, 7, 5, 8380406, 23, 8380414, 8380403, 5, 7, 28, 8380411, 0, 13, 8380403, 8380410, 8380407, 8380398, 8380411, 8380415, 0, 8380413, 8380413, 7, 8380416, 0, 16, 8380413, 2, 11, 16, 8380410, 8380409, 5, 8380407, 8380403, 8380414, 8380411, 4, 0, 0, 8380414, 8380409, 2, 0, 8380409, 2, 13, 9, 14, 13, 14, 8380414, 8380409, 8380414, 8380409, 3, 2, 8380413, 0, 2, 9, 1, 8380401, 24, 5, 8380416, 2, 8380401, 11, 8380416, 8380399, 5, 1, 6, 8380405, 8380413, 11, 1, 4, 2, 8380403, 8380411, 8380410, 6, 8380403, 8380409, 6], -[8380415, 8380405, 10, 12, 8380415, 4, 8380415, 9, 4, 8380411, 7, 10, 8380406, 12, 0, 8380410, 8380412, 5, 15, 8380402, 12, 7, 8380406, 8380415, 8380410, 1, 17, 8380405, 8, 7, 6, 4, 8380393, 5, 0, 8380407, 4, 8380412, 8380409, 8380416, 8380407, 8380415, 5, 8380409, 6, 8380412, 8380410, 4, 14, 2, 8380416, 6, 8380409, 8380413, 12, 8380405, 7, 18, 8380412, 3, 7, 8380411, 8380405, 8380410, 6, 7, 12, 8380405, 1, 12, 8380416, 4, 7, 8380402, 8380407, 8380412, 4, 6, 8380412, 3, 8380412, 14, 8380416, 0, 7, 8380415, 8380409, 8380410, 5, 3, 7, 8380409, 16, 5, 8, 12, 8380414, 8380413, 8380414, 8380405, 8380410, 8380415, 8380414, 8380412, 8380407, 8380412, 4, 8380413, 3, 8380416, 8380411, 8380407, 2, 8380413, 1, 10, 2, 8380401, 8380415, 5, 8380401, 11, 8380414, 8380413, 2, 21, 1, 8380410, 6, 0, 8, 9, 3, 7, 6, 8380409, 18, 8380415, 3, 5, 10, 8380403, 8380406, 3, 8380416, 8380406, 13, 8380413, 8380405, 2, 8380416, 4, 2, 8380414, 13, 1, 8380412, 8380410, 8380410, 8380407, 2, 2, 8380407, 8380411, 8380406, 2, 4, 10, 7, 5, 8380409, 7, 8380413, 8, 8380416, 2, 16, 8, 6, 8380405, 11, 8380406, 8380411, 11, 8380411, 8380412, 24, 7, 8380416, 12, 8380411, 13, 8380412, 8380405, 7, 8380409, 8380412, 8380407, 10, 8380412, 8380411, 8380410, 0, 8380413, 8380415, 2, 4, 8380410, 8380408, 8380416, 8380414, 0, 8380397, 8380413, 8380413, 8380403, 11, 8380413, 8380410, 8380412, 8380413, 9, 8380415, 8380413, 14, 8380411, 8, 9, 8380415, 14, 8380415, 4, 0, 8380416, 6, 18, 8380413, 13, 11, 10, 8380416, 8380414, 9, 6, 8380409, 8380407, 6, 8380410, 8380409, 8380414, 12, 8380405, 8380409, 8380411, 8380392, 2], -[8380409, 8380413, 10, 4, 8380408, 4, 8380414, 8380415, 8380410, 8380416, 1, 11, 16, 8380394, 8380413, 8380416, 8380416, 4, 0, 8380404, 8380412, 5, 8380396, 3, 15, 8380413, 8, 16, 8380412, 5, 5, 8380412, 8380409, 8380412, 5, 11, 8380402, 8380411, 8380400, 8380402, 8380411, 8380416, 7, 8380410, 8380415, 8380415, 18, 8380416, 8380411, 8380412, 8380401, 5, 16, 0, 8380414, 8380414, 8380416, 8380415, 8380413, 8380414, 14, 20, 4, 7, 6, 8380412, 2, 6, 8380412, 6, 4, 10, 8380413, 8380397, 8380414, 16, 8380412, 8380409, 8380409, 6, 8380407, 8380406, 4, 8380402, 8380405, 2, 0, 8380411, 9, 8380407, 3, 8380410, 8380408, 3, 8380404, 8380403, 8380413, 8380411, 8380414, 8380406, 8380416, 0, 8380410, 6, 8380406, 8380414, 6, 8, 0, 9, 21, 0, 9, 8380414, 8380403, 25, 8380415, 8380403, 8380410, 8380414, 8380409, 8380406, 8380413, 5, 8380408, 0, 13, 8380398, 11, 16, 8380416, 2, 8380408, 8380410, 13, 0, 11, 19, 21, 2, 8380399, 8380408, 8380412, 4, 8380409, 8380411, 5, 10, 8380408, 8380400, 8380406, 8380404, 8380415, 8, 8380397, 8380409, 8380414, 1, 8380410, 8380414, 8380404, 8380411, 8380408, 8380416, 10, 2, 5, 8380411, 8380416, 12, 12, 3, 7, 2, 23, 8380404, 8380416, 10, 8380414, 8380403, 3, 8380394, 8380404, 2, 8380408, 8380404, 8380414, 11, 8380416, 13, 8380398, 8380392, 10, 7, 8380402, 4, 8380414, 3, 8380413, 1, 8380414, 4, 3, 4, 8380407, 8380411, 3, 23, 1, 8380410, 11, 5, 7, 8380406, 7, 4, 1, 8380416, 8380410, 8380411, 8380416, 8380406, 8380409, 8380414, 8380415, 8380410, 8, 8380416, 5, 3, 5, 8380416, 8380416, 24, 2, 8380407, 1, 3, 8380416, 8380406, 8380406, 0, 5, 15, 1, 8380410, 8380415, 8380415, 5, 8380400, 8380411, 8380416, 8380406, 8380411, 8380414, 9]] -cs2: [[8380409, 8380410, 8380416, 8380415, 11, 14, 11, 1, 8380407, 8380396, 8380416, 0, 10, 8380408, 8380414, 16, 12, 14, 8380414, 8380398, 8380398, 8380415, 8, 14, 3, 12, 2, 8, 4, 5, 3, 8380396, 3, 8380412, 1, 8380414, 8380401, 8380401, 8380414, 8380414, 8380415, 8380408, 2, 1, 8380413, 6, 0, 16, 0, 8380406, 8380415, 8380404, 8380409, 8380413, 3, 8380408, 8380406, 8380414, 9, 2, 8380416, 12, 8380407, 8380409, 9, 0, 8380415, 8380405, 8380410, 0, 8380412, 8380409, 8380416, 8380406, 16, 2, 18, 5, 8380410, 2, 3, 8380400, 4, 2, 0, 8, 8380413, 19, 4, 2, 8380411, 8380405, 8380413, 7, 3, 4, 8380407, 8380413, 8380405, 8380416, 8380415, 8380405, 8380413, 5, 8380415, 8380412, 14, 2, 8380416, 24, 4, 0, 2, 8380404, 8380391, 8380394, 8380394, 8380411, 6, 8380400, 6, 8380412, 8380415, 4, 10, 6, 8380410, 8380408, 14, 8380415, 8380410, 8380408, 8380413, 8380408, 8380412, 0, 8380411, 8380411, 3, 6, 8380416, 8380414, 11, 8380407, 11, 8380411, 8380410, 15, 8380415, 7, 2, 8, 8380413, 8380414, 8380415, 8380416, 8380414, 8380415, 8380404, 8380413, 8380412, 7, 8380410, 8380416, 8380407, 8380415, 8380415, 2, 6, 8380407, 3, 2, 8380416, 5, 8380410, 8380407, 8380405, 8380408, 2, 6, 0, 8380413, 3, 2, 8, 4, 1, 8380416, 0, 4, 6, 1, 11, 8380411, 8380408, 6, 4, 3, 8380415, 8380411, 8380406, 10, 5, 12, 8380416, 2, 15, 8380389, 8380411, 8380411, 8380412, 17, 2, 7, 3, 8380416, 18, 8380415, 8380407, 2, 8380409, 1, 8380413, 8380413, 8380408, 2, 8380408, 8380413, 8380416, 14, 0, 8380410, 8380411, 8380411, 10, 8380410, 8380409, 4, 8380415, 8380415, 8380415, 3, 8380400, 8380398, 8380411, 8380415, 9, 13, 8380412, 5, 8380415, 19, 24, 0, 8, 0], -[8380416, 0, 5, 5, 8380407, 16, 5, 1, 4, 8380402, 7, 8380410, 8380412, 6, 7, 8380394, 14, 0, 8380411, 8380411, 8380410, 0, 2, 8380409, 8380411, 9, 8, 12, 11, 10, 6, 8380416, 8380402, 8, 8380411, 5, 11, 8380408, 8380415, 8380395, 8380413, 8380412, 8380404, 5, 1, 8380410, 5, 8380411, 10, 5, 8380410, 1, 8380409, 7, 8380414, 8380407, 8380411, 8, 11, 8380399, 3, 8, 1, 8380403, 8380398, 7, 0, 8380413, 0, 9, 2, 0, 6, 6, 8380416, 8380413, 8380416, 2, 8380414, 4, 1, 8380405, 8380411, 8380408, 18, 8380414, 4, 5, 5, 7, 3, 11, 2, 8380407, 8380413, 8380416, 1, 8380411, 8380413, 3, 8, 8380410, 10, 4, 1, 2, 8380400, 1, 8380407, 8380403, 8380413, 8380414, 0, 8380413, 8380407, 8380395, 8380410, 7, 8380406, 1, 4, 6, 8380415, 8380399, 8380408, 8380413, 8380403, 1, 0, 6, 7, 8380414, 8380412, 8380403, 8, 4, 8380414, 8380405, 8380406, 5, 2, 0, 8380415, 8380414, 8380405, 8380411, 10, 8380415, 8380416, 8380407, 8380413, 8380403, 2, 7, 3, 8380414, 0, 8380416, 0, 8380411, 8380410, 7, 6, 8380411, 9, 6, 8380414, 8380415, 5, 6, 8380410, 8, 11, 8380407, 8380414, 7, 5, 8380416, 8380408, 0, 8380412, 6, 8380415, 8380415, 8380407, 8380409, 8380413, 8380408, 8380409, 5, 4, 12, 8380414, 5, 19, 2, 4, 8380401, 3, 0, 8380407, 4, 10, 6, 8380416, 8, 8380414, 0, 6, 8380412, 5, 8380412, 11, 7, 8380407, 10, 13, 8380406, 8380411, 8380410, 8380415, 5, 8380410, 8380415, 13, 5, 8380411, 19, 8380404, 6, 8380414, 3, 8380408, 8380414, 8380415, 8380415, 14, 8380411, 8380416, 8380410, 8380416, 2, 7, 8380416, 10, 7, 9, 3, 4, 0, 8380403, 9, 6, 8, 10, 8380411], -[8380398, 8380397, 8380412, 8, 8380416, 8380409, 8380408, 8380416, 8380414, 17, 8380412, 8380411, 5, 8380416, 0, 2, 6, 0, 0, 8380416, 8, 8380406, 5, 8380407, 0, 5, 9, 14, 8, 2, 1, 4, 10, 8380410, 18, 8, 8380400, 8380412, 0, 12, 4, 8380408, 2, 8380405, 1, 9, 10, 8380414, 8380405, 1, 11, 3, 4, 2, 8380391, 8380416, 8380407, 8380411, 5, 8380405, 8380412, 8380397, 3, 0, 13, 4, 8380405, 2, 3, 9, 4, 8380410, 3, 0, 8380414, 8, 2, 9, 8380413, 8380411, 8380415, 10, 4, 8380416, 10, 8, 4, 8380414, 8380413, 11, 9, 5, 8380408, 9, 3, 16, 15, 8380409, 4, 4, 8, 8380413, 8380409, 7, 8380414, 8380416, 1, 8380413, 5, 8380404, 8380401, 8380409, 17, 0, 15, 8380415, 8380414, 8380416, 8380416, 8, 9, 8380402, 8380413, 4, 8380416, 8380415, 2, 8380407, 8380412, 4, 8, 2, 2, 8380416, 8380411, 5, 17, 24, 8380413, 9, 0, 1, 3, 14, 11, 4, 8380411, 8, 8, 28, 11, 8380413, 8380405, 8380413, 14, 16, 10, 8380411, 8380404, 6, 0, 1, 8380415, 8380414, 2, 8380416, 18, 18, 1, 8380406, 8380407, 0, 11, 8380415, 8380408, 1, 9, 8380405, 5, 8380415, 8380415, 5, 8380416, 3, 4, 8380412, 12, 8380411, 8380406, 5, 5, 18, 15, 16, 14, 4, 8, 6, 7, 8380408, 1, 6, 11, 25, 8380411, 6, 1, 12, 9, 14, 3, 10, 8380405, 8380416, 6, 6, 8380414, 8380405, 8380416, 12, 4, 8380412, 12, 8380415, 8, 0, 8380404, 8380412, 8380398, 8380406, 8380412, 2, 8380414, 0, 8380407, 8380416, 8, 5, 8380409, 8380415, 8380416, 2, 5, 8380409, 8380412, 8380410, 3, 8380407, 8380408, 9, 8, 8, 8380410, 6, 2, 4], -[0, 8380406, 8380392, 8380412, 12, 7, 8380408, 0, 15, 8380408, 3, 8380405, 8380415, 13, 6, 8380411, 0, 8380409, 8, 9, 8380415, 14, 8380416, 8380416, 6, 8380413, 8380411, 8380413, 8380409, 8380411, 8380412, 9, 8380405, 10, 5, 2, 21, 8380415, 7, 13, 8380416, 6, 10, 2, 3, 8380406, 19, 3, 8380416, 8380408, 8380397, 8380410, 8380415, 8380406, 21, 8380413, 8380412, 8380406, 8380411, 2, 11, 2, 3, 8380416, 9, 8380400, 8380414, 9, 16, 20, 8380415, 8380416, 10, 9, 7, 8380406, 8380400, 16, 8380411, 8380409, 8380410, 8, 11, 8380413, 8380412, 8380415, 8380410, 8380414, 8380406, 11, 15, 8380416, 0, 8380403, 8380413, 8380406, 0, 13, 15, 8380411, 8, 4, 6, 8380414, 3, 8380413, 8380412, 8380409, 8380414, 8380406, 16, 8380416, 0, 8380411, 8380407, 8380416, 6, 8, 20, 0, 9, 2, 8380408, 8380413, 8380404, 21, 8, 14, 8380412, 8380410, 8380408, 8380413, 24, 2, 8380401, 8380415, 1, 4, 25, 8380416, 4, 5, 8380411, 8380411, 2, 11, 6, 9, 7, 5, 4, 8380402, 10, 7, 7, 10, 8380409, 8380412, 8380399, 8380403, 7, 8380412, 0, 8380415, 0, 8380414, 8380411, 8, 8380408, 8380401, 8380407, 8380414, 2, 11, 8380406, 8380408, 8380416, 8380407, 8380414, 5, 15, 8380415, 1, 1, 7, 12, 8380416, 8380409, 1, 8380408, 10, 8380409, 8380406, 8380414, 8380412, 9, 2, 10, 8380412, 3, 7, 8, 6, 20, 8380412, 8380405, 7, 8380408, 15, 5, 8380414, 8, 8380400, 8380410, 11, 5, 8380407, 8380409, 8380410, 8380408, 8380415, 7, 11, 9, 3, 8380408, 8380414, 10, 8380416, 1, 8380410, 7, 6, 8380400, 10, 10, 4, 5, 10, 8380409, 8380401, 5, 8380409, 8380403, 7, 8380410, 8380404, 0, 8380401, 5, 8380411, 8380411, 4, 2, 1, 6]] -z: [[8266484, 127799, 8357845, 26943, 25141, 96988, 23855, 127798, 8360966, 8353453, 8377180, 8376133, 8304130, 69787, 31001, 12728, 8317148, 120265, 8290529, 71601, 8338819, 97824, 8262343, 8321124, 60363, 1874, 53355, 8251231, 8326335, 32168, 84431, 8288310, 66785, 8361237, 97299, 8331128, 8366566, 8371982, 8262957, 93066, 76589, 8312509, 53679, 8258018, 38048, 8253985, 64167, 8346526, 8379262, 8265762, 6689, 8310778, 35249, 17599, 8361691, 110414, 74841, 55595, 8334821, 78997, 8326131, 17085, 55738, 8360780, 98950, 44517, 94455, 52125, 50592, 123111, 8252002, 118223, 8337688, 8316093, 119907, 49848, 66806, 8251617, 26561, 83436, 8282532, 8276412, 79436, 8330566, 8262204, 8281419, 8293863, 84261, 8329876, 84366, 8349949, 8330119, 8255060, 8314364, 44490, 76800, 8258319, 127104, 91157, 107615, 6274, 89973, 102586, 98245, 8265252, 2331, 82576, 112010, 8260506, 8372037, 8338959, 83495, 8311724, 61633, 8262055, 75846, 8305785, 33534, 8268513, 8371696, 8296988, 8329726, 8320240, 77513, 108241, 73487, 8358592, 29126, 8271271, 83527, 4796, 31901, 129297, 77470, 8371809, 81488, 8359438, 72068, 8265486, 52918, 23716, 8321707, 110575, 8314362, 85250, 30765, 8359733, 8354125, 42533, 113574, 8322036, 130548, 78819, 8286942, 40333, 37746, 15192, 8304308, 117667, 126297, 8253224, 8364792, 8303656, 16374, 71101, 58562, 8337136, 96478, 8357954, 106816, 8307727, 121581, 57311, 54121, 8333720, 65795, 2727, 68567, 92062, 8329004, 8307159, 22157, 75982, 8334391, 526, 8353073, 8287547, 114337, 8335120, 8341860, 26568, 3765, 8300917, 45648, 29183, 116945, 52064, 8340980, 8290184, 25533, 9444, 47026, 8343650, 8321163, 62493, 245, 8329531, 8278120, 105831, 11052, 42473, 8366805, 8302541, 8278650, 8356981, 8259885, 8377255, 8254013, 8252208, 19830, 8368753, 8366167, 78168, 8260691, 8283700, 27039, 15099, 8306321, 8281817, 1271, 8270589, 90745, 91536, 94015, 5086, 8274257, 8362190, 8364841, 8289828, 96380, 8268418, 8268249, 39827, 102877, 8329494, 8363184, 39620, 8270242, 58294, 86626, 8281062, 96474, 8377808, 99790, 6571, 8303039], -[8338038, 8200, 8308063, 98545, 8369291, 8253864, 8274784, 8253235, 128759, 124855, 91869, 5438, 5474, 8337477, 98653, 8348683, 8322195, 91966, 8377376, 8279975, 9678, 67350, 51534, 16362, 1460, 8373653, 8314237, 8360364, 8353518, 64993, 73230, 88286, 12840, 25489, 118804, 8321891, 8258963, 25893, 39248, 1355, 8305428, 8375017, 8330276, 80752, 105037, 8362399, 8325711, 8366177, 18966, 29771, 8282077, 44723, 8285757, 8372970, 8372741, 8277098, 8285661, 101075, 8274231, 85662, 8251214, 77613, 105696, 8283573, 8310497, 8309824, 74282, 82724, 13374, 8335318, 8364046, 8375702, 123105, 8360151, 8315892, 8294368, 8315877, 8361756, 82274, 43878, 51634, 32487, 46780, 8280948, 8256393, 8369924, 8364989, 8264364, 94694, 8263397, 59124, 25924, 8252711, 8324991, 8253520, 58634, 53326, 62691, 8307154, 8352895, 4966, 104172, 91935, 77613, 116379, 8317757, 8329092, 123078, 10510, 8364616, 91225, 8301864, 8325885, 10144, 8303983, 50469, 8254914, 8327703, 8292312, 48745, 8275718, 8289027, 8371862, 105909, 8309712, 8264763, 50256, 8346861, 8372612, 4237, 8357434, 119415, 8360864, 102722, 8373118, 8307222, 51608, 8292416, 47467, 8340517, 77319, 99242, 8367836, 8326977, 59058, 45569, 8269696, 8290559, 8290610, 124719, 8350878, 74051, 103543, 59590, 8366212, 8322548, 8252288, 107941, 76405, 53919, 8363678, 100214, 8366400, 8279209, 13474, 8336139, 8328985, 95884, 72001, 8286456, 8272092, 14897, 8657, 8367035, 21755, 8288505, 34538, 8336201, 8282714, 96119, 1124, 8327080, 8296623, 109245, 50888, 8328293, 120211, 50340, 88222, 84041, 77452, 109151, 102140, 8360313, 8262062, 8347195, 12057, 96727, 56335, 18832, 8341401, 40569, 8340937, 20663, 86865, 8264045, 167, 8359216, 121021, 98885, 8255676, 8370390, 8295673, 8251585, 18057, 8365830, 8342855, 8364135, 8336622, 30911, 55914, 81920, 828, 8365319, 5299, 47825, 8286838, 8263488, 8333148, 8299029, 49602, 99811, 8253214, 8313982, 42959, 103255, 98951, 8336016, 8293145, 66798, 8377025, 8281028, 60780, 50899, 8377055, 103983, 8370795, 8295749, 124926, 88896, 8363128, 8348327, 8278228, 8340684, 8340371, 124613], -[8291232, 92857, 5961, 95211, 8287517, 778, 128679, 8354053, 8319871, 8314472, 8261972, 44189, 8332116, 8358070, 16701, 8348321, 8361206, 47283, 8377187, 29239, 8279384, 128205, 8337703, 8266385, 18700, 8290707, 8276215, 8260050, 8304206, 8279716, 80685, 8262364, 8262724, 8345019, 8354043, 72280, 10456, 8363708, 66442, 61617, 93205, 51092, 8333309, 34214, 8367051, 90085, 109902, 8319775, 74916, 8264319, 123370, 8249975, 8304445, 47641, 8295147, 8289978, 8294578, 8372182, 8285442, 125809, 8300921, 8303729, 19199, 8313708, 29726, 67288, 101297, 8373602, 68615, 8348271, 8279582, 8257772, 22386, 117668, 8272126, 47802, 8313678, 8293747, 8355905, 50961, 8260224, 84063, 8354258, 8346897, 105850, 8304348, 74531, 8257540, 111805, 20493, 8260091, 5972, 8280747, 24680, 8273775, 104268, 8283606, 46603, 14855, 8299620, 8318982, 90937, 8373554, 8336640, 90463, 128215, 8282006, 55865, 8335047, 71935, 8265179, 94191, 8270486, 8313325, 8266446, 78906, 8332641, 44778, 8364173, 8368776, 23991, 102881, 111732, 68363, 8376706, 100117, 21180, 42554, 8324408, 54119, 8339531, 8295611, 26940, 72092, 8339310, 59581, 8280075, 8375689, 8296365, 8273424, 8275499, 107920, 8297915, 8352674, 48696, 8298450, 8279549, 18244, 97836, 62769, 88441, 57783, 73866, 81160, 61720, 8338337, 8291793, 8332137, 21604, 8302054, 8252879, 77298, 81136, 8310087, 8275463, 8355651, 8294396, 16027, 8341692, 8277215, 18900, 81224, 45957, 29714, 109706, 115236, 57589, 8378187, 8302080, 28397, 8312474, 8322958, 83779, 8253149, 104053, 26964, 124823, 50428, 62233, 8321318, 57053, 69774, 54005, 113839, 5694, 91260, 77175, 83809, 37391, 6541, 114891, 69956, 129071, 17088, 8370054, 2420, 117267, 8249960, 8317511, 8260624, 40590, 8352354, 9551, 55204, 8326959, 93534, 8274335, 112088, 8304571, 8360058, 11770, 8255432, 92939, 8376634, 8322170, 8250032, 56218, 28985, 8341154, 110344, 8260637, 78542, 69999, 8260152, 8261742, 122720, 22658, 8283575, 98162, 86038, 121783, 8286621, 103381, 8334162, 76039, 5570, 8263487, 8260088, 8351547, 8349232, 40632, 8366299, 8282138, 8258626, 60814, 82285], -[8250471, 21580, 125509, 95017, 18228, 115399, 36753, 8263475, 8379664, 8365140, 77929, 8347774, 69129, 52033, 8324046, 8360332, 65069, 8347526, 77132, 83680, 8272213, 122637, 50308, 37669, 8309595, 8350276, 8314417, 47106, 64274, 8362248, 8335284, 77701, 3308, 85522, 8263037, 8336893, 8249362, 8270576, 45926, 52758, 36455, 106577, 118450, 7882, 36694, 27618, 8262872, 8272619, 21446, 121987, 8354358, 8337775, 38758, 8349468, 8350888, 8374619, 93917, 8305326, 8256137, 45553, 80561, 8310617, 8356173, 3921, 8267009, 94353, 71959, 8270871, 112024, 51513, 62718, 8291273, 101950, 87775, 8254564, 8271551, 90706, 50105, 116511, 8364970, 96637, 22928, 8367838, 75573, 4022, 40783, 38189, 118957, 108827, 8319527, 99211, 8269455, 58814, 8346824, 8252662, 8379609, 8110, 62875, 42865, 8352925, 8294049, 68030, 8287534, 8320417, 8342889, 80866, 8305279, 8307156, 43173, 8267227, 8285911, 8348605, 8344965, 104991, 84990, 33710, 27187, 85940, 8321876, 96547, 82831, 71242, 51227, 8292078, 76791, 8375125, 123710, 111783, 91247, 8263789, 8258335, 59025, 8328540, 8274644, 79376, 121805, 8336708, 8329647, 65231, 130417, 8313794, 4360, 8317073, 88099, 8249985, 41230, 8350809, 96127, 114574, 45005, 91417, 54412, 34736, 9543, 8272205, 8341322, 99151, 8363237, 3189, 71675, 8322404, 8254864, 86084, 8350492, 108935, 123209, 8336630, 8263907, 48288, 8376883, 8258464, 39726, 39035, 46995, 80524, 8313163, 8370404, 8359867, 8370156, 8376168, 104483, 73596, 42589, 25906, 8290275, 72597, 8306805, 8316154, 100767, 8294521, 23767, 22327, 11641, 8268974, 116598, 8278935, 8271892, 8349883, 8328282, 102255, 109689, 8351256, 8352316, 108246, 112155, 8306712, 8282912, 61951, 7379, 74595, 8320266, 108896, 18441, 8363049, 8330348, 8274705, 8366378, 8305996, 64454, 51751, 8263442, 5045, 8300169, 8297497, 8272549, 89398, 8325084, 8371681, 9399, 77193, 8264953, 3209, 92699, 8083, 8292209, 8257066, 8377600, 8311172, 41339, 21927, 7796, 8349104, 8379525, 71081, 8348178, 119848, 8353591, 3758, 80623, 101628, 8255868, 8276033, 8297641, 56285, 8305993, 8267785]] -||z||: 131055, ||z|| too large -r0: [[-92237, -41220, -10349, 85189, -51656, -16931, 33275, -19760, -153, 71046, -69467, 67793, 44173, -18671, -27853, -7505, -72813, 2551, -50945, 55728, -10874, 44802, -35238, -57902, -73563, 36327, -78518, 6455, 9922, 48496, 89997, -19191, -7851, 64683, -85155, -25608, 76346, -6446, -60136, -38792, 62940, -16943, -49471, 42994, 60177, -5131, 77100, -28156, -19259, -1041, 60187, -80897, -25756, 87120, 13467, 19765, 75935, -25877, -22939, -11346, 51945, -18612, 47142, -7211, -7405, -39097, 7011, 59951, -79032, -48748, 59406, 67446, -37334, -33716, 21450, 69276, -4284, -30376, 84979, 52514, -41642, 20079, -40013, -61967, 43617, 34390, 10699, 27326, 89075, -2918, 89522, 44262, 40088, -56183, -17887, 59111, -71041, -72338, 14804, -88611, -69992, 22547, 81151, -11104, -26305, 56384, 75613, 760, -74429, -60182, -42252, -76520, -2898, 89683, -2123, -9445, -12906, 29590, -54174, 31586, -22796, -95065, -13997, 22212, 74386, 94920, -27065, 40281, 18183, -58478, -58941, -29603, 86076, -63315, 40152, 22914, 61426, 2718, -53995, 38213, -84704, -27712, 90605, -21268, -23851, -94156, -86409, -56618, -91548, 5178, -34216, 87537, 27813, -55613, -87686, 44627, -73459, 64437, -81486, 23331, 27907, -12169, 63974, -63490, 79431, 9477, -69142, 67777, 88650, 25915, -46425, 60112, 56362, -7143, 82816, 85029, -55232, 27052, -55566, -16661, -68993, 7541, 81474, -74247, -51113, 67718, 34278, 13917, 76490, 41152, -4047, 34820, 8627, 77512, 4323, 70260, -25915, 52916, 84159, -27545, 78182, -62598, -59796, 60933, 61856, -614, -10798, 78956, 93707, 9591, -66932, -15232, 61644, 93125, -62298, 56380, -1823, 65058, -78054, -63204, 69531, -41198, 82124, 21923, -44815, 54817, -25077, 94129, -11652, 3347, -12333, -52766, 18717, -76867, 5679, -56531, 58259, 43849, -64127, -17486, 79486, -90310, -76954, 80085, -71552, -15614, -46735, 75096, 90908, 21092, 58140, -51752, -17441, 85653, -57334, 92266], -[86841, 6407, 14134, 54379, -10152, 62502, 71790, -6134, 70086, -94379, 79266, -91894, 27613, -56572, 5646, -47207, 91652, -61464, -77334, -66615, 78704, 73306, -83804, 86424, -79076, 32168, -37330, -31997, -40177, -52428, -61852, 27500, 44687, 53629, -71949, -17015, -26697, 85297, 70651, -41007, 69140, -70373, -15424, -7502, -48645, 89082, -26460, -9912, -26557, 68896, -92624, -48779, 3866, 5156, 43239, -19501, 31750, -87481, 40004, -48770, 766, 27247, 20864, 68276, -56022, 56438, -32488, -87057, -46916, -19427, -26286, 9505, -16009, 37995, 39109, 3119, -69435, -65702, 22803, -24261, 19663, -43887, 26971, 92008, 23639, 31600, -84061, 11757, 148, 92688, -66307, -49265, 13090, 20832, -12519, 575, 68329, 44566, -18828, -25937, -75294, 31194, -39556, 74463, -18638, -91973, 25065, 26560, -33106, -58441, 13943, -25944, -3294, -4116, 57353, -47500, 64180, 12644, -57663, 51173, 86998, -2422, -87040, 802, 77010, 40715, 31320, 52200, 17662, -56008, -21524, -90605, 82510, 28487, -28991, 39053, -70621, 80553, -5583, -51805, 14053, 92662, 45511, 55919, -94547, -89438, -79680, 36558, -87057, 73748, 28132, -71188, 53006, 4593, -54830, -179, 67764, 62444, 9674, -93814, 19748, 47412, -89969, -40080, -68618, -86478, -32408, 72079, -30339, -59261, -65308, -60794, 60072, 70802, -63168, 37051, -37888, -91313, 57232, -5774, -28998, 85182, 44282, -55131, 93151, 48401, 44657, 27347, -68807, -21489, -9262, -45272, 29445, -45868, 51551, 18060, 24657, -45738, -41918, 14617, 27084, 62941, 75902, -30033, 60065, -2665, 11675, 75252, 55638, -10199, 3882, 38350, 54555, 59066, 11938, -636, -6463, 3021, 88883, 93811, -26883, 11527, -31101, 37065, 76528, 6728, 75271, 5403, 15735, -69050, -19664, 23649, 30916, -30712, -39386, 81032, -39968, -63906, -54615, -57688, -53387, -10822, 37054, 47193, -93791, 20464, -17089, -3202, 56136, -82736, 95134, -8220, 11354, 21769, 40886, 42155], -[3697, -7104, 92730, 81170, 47864, -44660, -7602, -1477, 11372, -15220, 3784, 83321, 55624, 42312, -29987, -38842, 37788, -30358, -18786, 35223, -10156, 93583, 90604, 90826, 72437, 38922, 34103, -87728, 26029, 73852, 34869, 27772, -60277, 55623, 66717, 20597, -44427, -84301, 26322, -56007, 24793, -91763, 77349, -56523, -50442, -23272, 79478, -86791, 59955, -82606, -42310, -29855, -61339, -51378, -59543, -48029, 52323, -58153, -37719, 94681, 72093, 13447, 56134, 29803, -38502, 33246, -9288, -59001, 16184, 62815, 63996, 54818, 38575, -86989, -31821, 12029, -23351, -6812, 22683, 4209, 25190, 90825, -52614, 87489, 3744, 33804, -19250, 29761, 24417, -70067, 80121, 74621, 49802, 6660, 26204, 77434, 66045, 52387, 30572, -72751, -80404, 62223, 39530, -59612, -73698, -33978, 19726, 4317, -75251, 15015, 39010, -14301, -33994, -28806, -42156, -384, -7430, -74217, -79946, 42670, -76118, -16750, 65814, -23737, 54708, -74345, -90820, 48701, -16172, -8013, 89068, 33193, -88990, -50521, 72205, -29283, 16486, 36892, -90570, -5866, -4745, 27508, 276, 17923, -69989, 33719, 17609, 38601, 85017, 38436, -31108, -88703, 61878, 37522, 46232, 48624, 58424, -61781, 55005, 6267, 59714, 24918, -4415, 38940, -29856, -65266, 63016, 51927, 76406, 69276, 62370, 77116, 49949, -38277, 60894, 10553, 48770, -48386, 84861, -79391, -71025, -70218, -83550, -76357, -12232, 63185, 18933, 73424, 29711, 60120, 74674, -15336, -24601, 27297, 8584, 73493, 92808, -33031, 21570, 74570, 85448, 66685, -9728, -25458, 59010, -51766, 58208, -54388, 54254, 26576, -45060, 25114, -35303, 34521, 74930, -2609, -86841, -79672, 20255, -9086, 89209, 63189, 76036, -22722, 28875, -25637, 45738, 74034, -55355, 84195, 78971, -86520, 6381, 18943, 52622, 72595, -4070, 45370, -85985, 38088, -19929, -88317, -16269, -8778, 2619, -94783, -55602, -45419, -75868, 22695, -87725, -33097, -6882, -51108, 52084, -34642], -[-70212, -59676, 83342, 35593, -1509, -33621, 72345, -24968, -53494, 45402, 59297, 59161, -31239, 85705, -11808, -1270, -92842, -28419, -38983, 70822, -6951, -16480, 72751, -11334, 40647, -15982, 43635, -32495, 35288, 30672, 37948, -90901, -32324, 75286, -2552, 13445, -44110, -50425, 38743, -72467, -14180, 33891, -62342, 29861, 81085, -17272, -9110, -3389, -66487, -23860, -68553, 51720, -5514, -68119, 9294, -87206, 67023, 91849, 69846, 78551, 15922, 72430, 95020, 49199, -59546, -41429, 62500, 19863, 88658, -20893, 27607, -74964, 11996, 53324, -69979, -30263, 47063, -29951, -25082, -17537, -44032, -2918, 52166, -6968, 339, 74359, -35359, -22669, 94847, 32318, 41859, -67693, 84558, 49799, 35861, -17881, 73549, -50521, 8454, 6184, 2326, -3370, -444, 83714, 85724, -84303, -28361, -90223, 77982, 55177, 30335, -71998, 51148, -51514, 23103, -71300, 21472, 29857, 93674, 17554, -53668, 67971, 21734, -47898, 76559, 69247, 52123, 67618, -67706, -64022, -69806, -14336, 24014, 88009, 13470, 37236, 31591, -39203, 15118, 91059, -11682, 61292, -86380, -15128, 72653, 53100, 21839, -11253, 77366, 75023, 36981, -26653, -2679, 91922, 39740, 62470, -51165, 7273, 73065, 7302, 52614, 45133, -93478, -58557, 61535, 79106, 30182, 49927, -77874, -53612, 91531, -24877, -10703, -89748, -38150, -46394, -66012, -3616, -44605, -58778, 56045, -79602, 25115, -87183, 80341, -53665, 26009, -58137, 72329, -66598, -42636, -5061, -23464, 41192, -44974, -74715, -30359, 87314, -68501, -93613, 60251, -7825, -51834, 12239, -34652, -87616, 74918, 20452, 20014, -90627, -85820, -40236, -57294, -82590, -6865, 11113, -48453, -1104, -63372, -35546, -64843, 65589, -92333, 42700, -54865, -93766, -12905, -29938, 61005, -44638, -51093, -29648, -35401, -26524, -93075, 49947, 58128, 24048, -26718, -68638, -1407, 82030, -42786, 21241, -26902, 90474, 77971, 52754, -76035, -58811, -47521, -29765, 54334, 30794, 85339, -28361]] -||r0||95134, ||r0|| check passed -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-53328, 94588, -79612, -107803, 61859, 6717, -36418, 109110, 53373, 7453, -111650, -99536, -117962, -22677, -112889, -5564, 94842, -70020, 23022, -105459, -128679, 99451, 127564, -31220, -94366, 125737, -54784, 73374, 15597, 116126, -39225, 17378, 45490, -24292, -100175, -57249, 44650, 129408, -93323, 106461, 124396, -77790, 69566, 16771, -95527, 90503, -96334, 111072, -124517, 116595, 54322, 82992, -33315, 3289, 118459, 126632, 31253, 66518, -46014, 7888, -57099, -99667, -118845, -53823, -55611, -62720, -60055, 111061, -122577, -53812, -71534, -30081, -122483, 80307, 33621, -85460, 102640, -69322, -90363, 122327, 36441, -122407, 87930, 5279, 74408, -112972, -57228, 46139, 66243, 129909, 42487, -42721, -87531, -76091, 77818, -43188, 18100, -33989, -39333, -104731, 64185, -108301, 23499, -47842, -81970, -78812, -46329, 1527, -16674, 74642, 17120, 54402, -8479, 100225, 25713, -109078, -80689, 77855, 46236, 69830, 62030, 62160, 66187, 18951, 43892, 65636, -30875, 125276, -95414, 104851, 71425, -106875, -65734, -130007, 72316, -76243, -20046, -34503, 115439, -20213, -28687, 54946, 4315, 70510, -92095, 46677, 7304, -3571, -24383, -29549, -35723, 71410, 14133, -92464, 33142, -122672, -76965, -97740, -51533, -41604, 89557, -47956, 50684, -51803, -21884, 57251, 113271, -55413, -50650, 7207, -79463, -110227, -37734, 37304, 70349, -81378, 91462, -120570, 86268, 62485, -98878, 105860, 123522, 19055, 97090, 56869, 116418, -4988, -127020, 85673, 45431, 110135, 4883, 64913, 47563, 23885, 128654, -78968, 110437, 7352, 70522, -47592, 107276, 106222, -98161, -62747, 50839, 18698, 73316, -65556, -10610, -27717, -82908, 61905, 43683, 121993, 110720, 107537, 34524, 25669, -4278, -112804, -72124, 110012, 126120, 4600, 77096, 40500, -63530, 110631, 54302, 66646, 3047, -19010, 92753, 101624, -58665, -122697, 55572, 129151, -110862, 8208, 95595, -55263, -104375, 41751, -87185, 8606, 76757, -8704, 63798, 12678, -59852, 240, -119461, 49939], -[5932, 8987, 114757, -79537, 122023, -92973, -72327, 107817, -113144, -63470, -41304, -22268, 27500, 113204, 122726, 69457, -42663, -33653, 100054, 2466, 95950, -105283, -32730, -86377, -77115, 6033, -56117, 42868, -21242, 10551, -120402, 76106, -18764, -121066, -45699, -106949, 122322, 16696, 101530, 98272, -124429, 67613, 63741, -108624, -83824, 96765, -71351, 582, -40499, 100463, -15814, 70395, 57694, 28946, -84937, 68782, 123245, 16550, 41754, -128733, -11624, -130763, -57207, -109552, -63370, -125000, -68879, -45422, -22889, -89652, 18490, -92651, 87215, 49926, 120187, 40440, 87743, -42550, -27586, 9068, -74626, 72738, -123359, 130407, -117150, 95086, -17133, -2915, 121182, 97899, 2137, 8726, -19172, 79503, -9211, 36088, 59184, -60012, 60235, -116234, -112092, -1779, -53020, -114945, -36717, 89947, -53800, -40726, -124530, 16551, 49478, -32735, -103392, -43533, 103270, 119984, -23148, 44827, 109127, -27883, 54448, 120828, -7405, 22315, -28844, -43376, 127551, -128418, 73494, 67050, -66031, 101773, -106181, -53107, -21214, -117315, -95347, -47869, 83616, 55658, 60469, 33056, 63486, -106123, -126218, 34627, -51551, 113063, -77723, 53144, 19993, 27240, 28995, -41765, 26356, -50217, -28791, -54682, -30815, -46670, 16743, -76243, -57963, 121205, 106093, -58568, -64738, 48379, 9422, -19966, -52251, 124857, -113682, 54579, -101125, 52625, -34818, 82515, -47948, 86978, -89834, -119710, 16561, -34381, -15027, 35171, 118631, -94640, -87543, 48209, -101744, -94561, -129824, -38285, -53802, 89541, 2524, 71369, -73628, 115937, 20243, 27854, -78004, -91051, 128234, 113213, 48212, 97834, 81797, -18731, -95857, -121632, -40627, 42698, 22735, 111444, -43990, -82268, -18601, 119386, -129015, -57496, 113756, -13063, -86433, 102129, -27002, -50717, -50568, -98936, -85623, -35153, -57051, 76994, 33884, -36322, 21640, -71017, -26887, 64652, -8173, -107491, 122401, 1358, -122601, 72346, -63416, 55562, 16191, -17611, 54865, 126915, -42199, -86336, -89311, -87695], -[9185, -128272, -107018, -90100, -90259, 55876, 113557, 33061, -105518, 81669, -28023, 92319, 28456, 17299, -68951, -54919, -108067, 2538, -107610, -11484, -38948, -78013, 36444, 15330, -65128, -35892, -16576, -73412, 113383, 5659, -27463, -118512, -10609, -72711, 65448, -103129, -6060, -45179, 43780, 102667, 58412, 103256, -39372, -83256, -20688, -126290, -118467, -127293, -124720, -69071, -12094, 101886, 85536, 70299, -124961, -99002, 99204, 16171, -96619, -73273, 24815, -109044, 41634, -57906, -61194, 125107, -23912, 74851, 66657, -128358, -109076, -1573, -31701, -37886, -100006, -61530, -69092, -23550, 59217, 111994, 54333, -87588, 114345, 126229, 35818, -83501, 116140, -60563, -92426, 129382, -36684, 128253, 1546, -84285, 24295, 118704, 18720, 98088, 68409, 130987, -31932, -122281, -119468, 26895, 43841, -31963, -62347, 92428, -74519, 119297, 19670, 31961, -127823, -57540, 51939, -25463, -126137, -37987, 97215, -17936, -56720, 12225, -59760, -26521, 60287, 51444, -4890, 54204, 38790, -69052, -126952, -20739, 92319, 24801, 66402, 128731, -73949, 13892, -76285, -4679, -84971, -110399, -70081, -86618, -115923, 131054, -113848, -32619, -127586, 56895, -77878, 118412, -27185, 39822, 26652, -5221, 44734, -73559, -50948, 128701, 69737, -79147, 53471, -78785, 77350, 13297, -84236, -38747, -34435, -46110, 10299, -59787, -109822, -84029, 56544, -6506, -17438, 39072, -16328, 108964, 25925, -90851, -38655, -44171, -96148, -112027, 127132, -5217, -10274, 85134, -96975, -45372, -2164, 12892, 111797, -39844, 112636, -117438, 39952, -14177, 50572, 58512, -11956, 1013, 51728, 42607, -126801, 82457, 70779, -10261, -44566, -24820, 26624, -63213, 90627, 2766, 3057, -116903, 104987, -49026, -8186, 37974, 95852, -27322, -67320, -47580, -71202, -112089, 5450, 89252, 80904, 91236, -56106, 97763, 123132, -72128, 66540, -10898, -106619, -16733, 71704, 42857, 59089, -20566, -59898, -78097, 50207, 100027, 89528, 51091, -59337, 18256, -52685, 39363, -61955, 72978], -[-69238, -108157, -57485, 128567, 101451, 98950, 63872, -68191, 12785, -66804, -24455, 93650, 130655, 108612, -29131, 8137, -124552, -124738, -66741, 38129, -43731, 45558, -118863, -72592, -74287, 734, -51542, 419, 21266, -54913, 36345, 99690, 112620, 92097, 78364, -24631, -44793, 115581, -63723, -91562, 15953, 103647, 79668, 109107, 40000, 100640, -36241, 104069, 3279, -59193, -75414, 82421, -47417, 126209, -42688, -70722, -92105, 29541, -117796, 67213, 112145, 59598, 124345, 89982, -18828, -95654, -71883, 105690, 47773, 112441, -5482, 43631, -71919, 14012, 53061, -127279, -86935, -448, 84540, 69816, 7979, 23816, 92368, 8061, -123554, -37285, 34651, -69523, 29849, 26527, -89544, -63094, -32050, -73971, -74045, -120102, -56087, -113637, 62294, 71979, -120583, 122196, -41428, -92448, 128262, 90191, -69292, -64435, -23560, 110717, 63702, -79337, 31135, 81033, 107155, -90911, 69518, -63569, 25213, -107849, 20087, -73995, -105389, 98175, 110963, -77998, 49299, -27735, 102444, -116069, -80064, 112981, -127556, -103680, -48796, -37719, 52689, -84018, 53803, -58785, -97947, 118627, -82522, 122984, 10268, 79709, -48406, 115386, 4800, -114954, 107582, -102104, 128066, -88382, -46067, -31816, 100303, -12110, -97698, 118138, 52505, -129378, 6289, 2733, 36230, -56757, 101328, -48984, 55991, -23433, 120950, -59746, 59706, -130920, 34241, 37222, 128538, -120734, -115731, -103921, 85728, 129643, 26758, 130338, 98146, 79653, -106382, 65829, -54643, 86203, 46117, 66710, 111432, 103554, 36020, 52780, -26547, -22041, 37643, 59278, 96088, 50969, 110324, 75808, -104438, 113512, 31204, -46330, -59085, -12158, -105100, -31487, 48376, -28986, 58623, 82760, 10357, 130970, -40147, -39560, 88724, -85411, -30872, 105505, 32208, -117581, 96897, 111635, -24319, -109623, 41358, -51124, -26977, 63705, 91976, 109116, -127304, 66405, 34707, 39440, 79625, -59331, 81960, -94224, -24892, 118153, -64825, 51137, -48020, -46620, 106111, 26420, 68884, -109468, -103293, 4919]] -NTT(y): [[1605782, 3847675, 7153476, 4260583, 5906183, 5888340, 2002662, 4322855, 2822963, 205760, 4300789, 5663800, 5796082, 2872414, 5583829, 2419146, 6409324, 7304337, 3560207, 7171691, 2805227, 6728429, 2224949, 3623097, 6548408, 7205382, 1096179, 7744420, 1387039, 4846807, 5458641, 5715707, 4268640, 5110553, 3798122, 5472303, 991834, 2622018, 7141805, 6541270, 8236512, 138726, 1092447, 6537502, 1286804, 1825567, 7724614, 352964, 617053, 2678831, 766924, 6701640, 6138489, 3067836, 6527526, 6108958, 8083146, 1835333, 4903354, 3485784, 4766516, 1604904, 3329925, 4892826, 544657, 4002289, 4937840, 56974, 708534, 8221036, 4536674, 3327184, 8088360, 2547248, 2316541, 4783348, 6730405, 3642549, 5214172, 546985, 4719257, 4696994, 3122082, 3947255, 6655643, 1702593, 614814, 382595, 2225733, 3392812, 1290625, 6392025, 3579567, 7373639, 4604536, 7213366, 426213, 3850293, 6346768, 4633078, 4246107, 3900430, 2957836, 4545745, 3043782, 7845947, 8368165, 7345511, 7425129, 6140329, 7322384, 1337431, 3936234, 5016015, 2983306, 6369770, 4000524, 1079299, 4565341, 3234569, 1098056, 3406348, 6660186, 3170759, 3937728, 1143697, 3835554, 1962015, 2796366, 3062499, 2434819, 3483752, 2079773, 2669884, 4598668, 6672084, 6433910, 1109233, 1311095, 1004831, 7883369, 2197, 4847698, 8040986, 1861391, 4806084, 1692336, 3819836, 4132827, 4644250, 4357748, 1501845, 8100507, 7585284, 5795555, 3816518, 3267261, 4087993, 7292867, 2700647, 6496785, 7073038, 2251955, 7381762, 6541081, 5887338, 1284918, 2866440, 5572519, 818989, 2244270, 1407929, 3742409, 6053232, 5475433, 4222200, 6374221, 7070499, 6296074, 3891754, 1025161, 4368185, 387771, 4646406, 7828611, 5922257, 7922094, 1151213, 1599395, 864603, 4263440, 5088668, 5064179, 4182620, 8270502, 1289144, 1109159, 8159117, 886101, 92489, 7338320, 6875286, 57445, 1455193, 6838320, 6980966, 8278139, 3730840, 5422959, 2849333, 1326091, 5078531, 6571726, 2428550, 7523063, 3261989, 7111223, 2311653, 8293640, 6493190, 6751904, 3842853, 1970631, 3994127, 6258689, 7370978, 6027345, 3794842, 1458539, 7721742, 8041014, 3838251, 2714638, 5830955, 1168374, 2429543, 5668651, 5012058, 5313060, 7198836, 5862028, 1889672, 6868979, 2615196, 7494310, 519884, 1886191, 973016, 728302, 7099807, 582954, 7068111, 464393, 3563512, 5162366, 36170], -[2058395, 4905409, 5455448, 5854323, 8112605, 2932455, 3988197, 4612598, 8323332, 6732340, 4253552, 5090807, 5952539, 169264, 6551269, 791711, 515978, 6052368, 6765923, 6968498, 7652185, 1717898, 1306429, 8272952, 3377058, 5334328, 3011782, 6289331, 5431611, 6044783, 1061819, 6138864, 6540175, 7063879, 2999753, 3448563, 5322653, 4039553, 3201430, 543638, 5523460, 3682515, 6255328, 1198742, 8159715, 6721995, 4525566, 346628, 363285, 5519039, 5845613, 3711888, 2081718, 7256262, 767598, 1632529, 8293545, 181182, 6988096, 7604179, 1184921, 6563848, 675042, 2734791, 1506403, 5303104, 6594968, 1318270, 5395955, 6871808, 8305648, 2050452, 7655725, 5637812, 2539070, 2022342, 425404, 4825938, 5113904, 2658633, 1917507, 1203444, 587633, 2199374, 3690739, 5715769, 2588885, 322203, 7637857, 6419256, 4323883, 2378640, 5936743, 6887182, 3107711, 6144815, 8050596, 6362561, 965074, 3151486, 6464147, 8187104, 5341364, 2056166, 8200874, 3057654, 2668668, 1904912, 987874, 1070238, 105329, 5871212, 5375332, 4655092, 3050731, 4460573, 3925184, 844441, 3687475, 138754, 8042975, 8298265, 455037, 5973414, 4050767, 6795919, 8087904, 5385590, 2483922, 6669501, 7287206, 8151246, 2375805, 2257014, 2549916, 7299582, 2872105, 4662138, 3423395, 5390627, 1336152, 4820473, 3128702, 5795500, 3382328, 1665226, 4698338, 2438513, 2014484, 7246798, 4224603, 4350712, 6736252, 2348804, 1104038, 5432198, 5251227, 7207293, 2576352, 8011105, 7441068, 8066419, 4012470, 1056763, 1770158, 3636815, 574030, 557884, 5078988, 265893, 1339100, 1842633, 4313619, 7508980, 3449262, 1680646, 2258780, 8199180, 5673067, 4842343, 385402, 8065277, 6845068, 4542262, 7741753, 5534494, 2664836, 6075197, 4557325, 345876, 2512213, 2231684, 303777, 924291, 525844, 6653320, 3977858, 5364002, 5908126, 435018, 2806044, 409843, 3625336, 3820331, 3362253, 4195248, 2883462, 5806504, 7729534, 4033275, 2144572, 927392, 830149, 75962, 5578682, 7007393, 7691120, 4254917, 7269497, 6849440, 5182288, 571127, 2323850, 5288523, 954085, 8108692, 596696, 7832874, 7197421, 4329811, 5191278, 1672460, 6666002, 543358, 1585580, 1968960, 2276611, 5979815, 5454096, 6402122, 3926806, 3021516, 7007982, 6610388, 3575261, 6936123, 2543000, 4813573, 6025630, 2305533, 4489054, 673527, 2813501, 3752569, 5566642, 2327598], -[4544985, 7788989, 422543, 8283851, 2193981, 3218209, 6553852, 2218460, 2396719, 5834222, 3004086, 1540449, 750728, 3961140, 2144365, 5496590, 7478133, 801881, 370192, 3030236, 5234991, 7647117, 8139926, 2794730, 4578403, 7199620, 7716888, 2136221, 5987133, 2546274, 423430, 6257892, 8120451, 2725576, 3752060, 2341453, 1296550, 468359, 512849, 8162625, 3772304, 7818866, 2008018, 5832088, 1762645, 3788968, 924499, 735873, 5249955, 4324809, 5449834, 1748387, 185379, 6096783, 4421534, 4109637, 8059211, 571530, 7470956, 4793271, 4863722, 1695986, 7126966, 3097765, 690704, 8014798, 3470651, 6959570, 1839386, 3052155, 3552164, 8128090, 5954934, 6869881, 1150813, 5332740, 5175940, 347992, 2858993, 1207131, 8285733, 3225437, 7407818, 475046, 7506625, 7313204, 1133137, 1510724, 2899415, 2553288, 1655718, 4995381, 6772551, 2473815, 7267121, 910663, 5463510, 1949090, 5722162, 4567375, 1595503, 8009933, 6411886, 737175, 7530648, 7650019, 2319795, 8331784, 6470261, 6083938, 4365061, 2563199, 7817810, 3177974, 2523283, 5238128, 3930038, 6719767, 80474, 1142991, 6091213, 7196597, 1059883, 1069100, 4051870, 239421, 7413853, 4448495, 5983989, 5974757, 1095158, 6132067, 1976946, 4384114, 5130467, 1520614, 3693719, 4404389, 2372046, 3001699, 2985551, 132484, 5835305, 2895408, 2875585, 4048852, 4616478, 5718776, 7902324, 4540037, 1533454, 76586, 7192299, 4343785, 5517472, 5028108, 8227370, 2749644, 4757301, 4120539, 5799389, 137632, 2343348, 949384, 7213472, 5587204, 2136416, 843616, 4991103, 5591516, 6615247, 5029657, 139487, 5428799, 8162494, 346625, 4753161, 6547374, 5954793, 2357439, 2100122, 3548842, 3714045, 4623665, 5683321, 5515535, 1584064, 1437392, 6118961, 5721463, 3338741, 6031582, 6604969, 3929015, 4970691, 7833164, 5879125, 7604939, 4560482, 4342862, 4277751, 6367998, 593782, 2134932, 7890205, 1457229, 7608100, 2080370, 2415240, 6317801, 5392079, 2642265, 237026, 7262429, 2515480, 2747895, 2651322, 1901898, 136859, 7412963, 5990830, 6206755, 4084564, 6095401, 7764193, 4350171, 1770120, 6660963, 8363524, 3228286, 157969, 6086500, 8189617, 8040474, 132260, 1357843, 5372741, 4821053, 4342750, 5799478, 8019356, 5357872, 2915271, 220551, 8239036, 5840429, 3644512, 3916531, 1785432, 7970752, 758398, 1175866, 2314117, 6221377, 7083005, 935657], -[8029781, 3447488, 624981, 644054, 7932657, 158822, 3674902, 189573, 3083821, 7289480, 4113798, 4113600, 3492885, 76526, 6079520, 6886585, 4584468, 8081226, 3523769, 6937493, 3477263, 6561382, 2390565, 6166291, 5045585, 403605, 4203906, 7381896, 6631011, 8281740, 7355440, 4364553, 1675690, 4345869, 3948778, 3937767, 5159292, 2155101, 3833771, 1694535, 7484001, 2087123, 5255778, 5986788, 2961728, 2001225, 149104, 3687133, 5463257, 5573910, 1510438, 6135678, 1925652, 58737, 723582, 2598461, 4295490, 1205819, 5232451, 5573898, 367403, 7753009, 1507755, 6467289, 1140080, 5137006, 3103406, 849960, 4802982, 5489644, 4012434, 4325176, 2408138, 5291252, 5403513, 4670279, 4582228, 1490472, 2112496, 4403799, 2418516, 7520495, 2411266, 4510720, 2818077, 6478595, 191324, 4894134, 7275720, 623498, 134662, 2449174, 3976041, 7869690, 8284981, 6719546, 8162874, 4207716, 7111200, 6689557, 7728660, 3180333, 5171813, 842481, 5791756, 327827, 3427571, 1303113, 7425486, 7027273, 402742, 6882444, 3625946, 7951891, 5635699, 5120961, 3866715, 3404631, 5348204, 2495215, 5639403, 660233, 4864043, 6143820, 680479, 6162116, 4709787, 3344952, 744873, 3369160, 2689673, 2046329, 4020086, 3006656, 2386670, 7325522, 3512823, 3422311, 4976265, 4230329, 2865794, 6929489, 8266433, 5576788, 2486698, 5123903, 6295109, 7178026, 5498381, 5417464, 5934423, 1726322, 3881220, 4207535, 5677942, 5132654, 1246458, 77744, 924104, 1680874, 6520340, 3550573, 7025231, 6135203, 1900822, 7098673, 4775647, 1660285, 2271190, 5957212, 3298960, 5111597, 827814, 2929841, 6051760, 1278296, 7623519, 5238249, 7348742, 1726025, 1596466, 3252182, 6659402, 2976199, 1180663, 2641880, 7800277, 8111300, 8311921, 8122607, 1959521, 7454494, 8030184, 5886552, 4310039, 8058615, 6198130, 3093356, 7689772, 949865, 5298816, 2284612, 4373852, 3403758, 432281, 6199326, 5897790, 3130504, 2191957, 5947605, 4448929, 5345527, 6866521, 3464927, 178790, 2454718, 3417454, 5889345, 24272, 7070784, 2971596, 8008972, 1953104, 5619033, 4899078, 3799771, 6304372, 1813411, 3665745, 2294798, 4524785, 5400411, 1177684, 8085857, 1432248, 3648655, 3040518, 3853536, 2352663, 8016374, 8073683, 5424203, 7771419, 581494, 5913701, 5377096, 5015620, 5248855, 2691550, 4095029, 3825884, 1269718, 2503310, 5900315, 4370327, 7650648]] -aHat * NTT(y): [[890294, 2651520, 2688558, 387763, 2565296, 5517659, 523118, 6761937, 2699953, 6032617, 8351690, 7867921, 393475, 568812, 1446196, 5126390, 6988889, 5957197, 5855493, 5147597, 8166286, 3340190, 7321532, 403956, 3414109, 6191583, 2170064, 5895694, 4323695, 6769409, 2842479, 7423236, 1947672, 755642, 2623763, 7319359, 7283103, 4426245, 6115135, 6299944, 6344921, 3868329, 7849104, 7229146, 5986891, 5711199, 1208591, 2047997, 2633294, 7269318, 2592383, 2027824, 3734050, 3048838, 5484766, 2514494, 8030737, 7830600, 1446477, 5952047, 1071680, 383222, 5868099, 5871466, 960369, 714096, 5668986, 2013601, 2278618, 6778793, 3481509, 3297387, 1466487, 3558549, 1377572, 4031239, 3219136, 2847821, 1732277, 6710881, 832688, 3434098, 280725, 2828707, 8118553, 5042136, 7508725, 4518935, 1362531, 7195134, 6907737, 6033398, 1922437, 1837756, 6409319, 96986, 4771972, 4535942, 6194379, 7271698, 6029738, 594235, 8277108, 5638964, 7041126, 1523334, 1023926, 1638459, 6800518, 4318786, 7967306, 5677239, 2854982, 5406599, 1298997, 3964146, 2582515, 4061381, 2656381, 6806615, 2623706, 6252147, 2108757, 1712897, 1524211, 4664514, 4191526, 5604560, 7541555, 4313027, 2832422, 5543053, 1117871, 6134538, 852813, 2916525, 3479985, 5597661, 172981, 5346328, 7375386, 2647410, 1284525, 2340499, 5868367, 3444933, 4035072, 4168098, 6012657, 1990704, 804991, 7647327, 2324897, 6483554, 2360032, 2237996, 6111322, 342921, 4583467, 1047388, 5808981, 830471, 3293096, 6130438, 2791695, 4666794, 6213476, 5700024, 3195401, 1626564, 5000794, 6608156, 1697562, 7619996, 1092916, 5059756, 6033575, 7320364, 6380138, 1237120, 6758769, 8231223, 1081584, 3593918, 7217392, 8157915, 3879657, 6692399, 3203197, 2973059, 2152783, 1325226, 1524163, 1747596, 4937355, 1543934, 6787929, 7977554, 6802240, 6281156, 4722904, 3817259, 4865951, 2798518, 609140, 4923137, 7475480, 3637557, 2917269, 6693645, 7126995, 862322, 5611775, 3624547, 3972090, 2678014, 2667504, 307573, 3502753, 2552501, 1792377, 1171165, 6680757, 2335828, 1268549, 7194055, 8170340, 4764767, 94084, 198721, 4914224, 2297696, 8355441, 7346458, 47210, 2703528, 3069564, 1787844, 8029397, 7275989, 3181284, 4660125, 2318191, 2158331, 5236544, 7040114, 6319317, 1797415, 3782036, 4403737, 1170407, 726178, 573260, 6800791, 2136897, 7985912], -[680870, 3359763, 3056088, 2628723, 6784235, 1459663, 7578978, 8219844, 1400952, 6040450, 3161583, 3569554, 2131232, 5238433, 1300522, 719198, 7966490, 6738980, 4062912, 8035390, 2537562, 7626336, 1066379, 5425234, 1261999, 4019656, 2941961, 774199, 7638130, 1139041, 7029376, 5276688, 1570956, 2958716, 795138, 4159589, 1859322, 4710439, 3956063, 7133145, 279425, 6902661, 3132881, 3758259, 2274416, 1409771, 5121601, 4308928, 2599653, 6358630, 4048079, 4569326, 2845508, 1874780, 810551, 5282846, 717377, 5576662, 4265680, 3934626, 6145499, 3214883, 2483835, 1115074, 7113523, 6486719, 4703654, 6799736, 2933196, 743776, 8296502, 6147436, 7477211, 3567546, 5370628, 4753977, 6694849, 7598861, 7490741, 691393, 7250620, 2812165, 241634, 783271, 6153632, 5055310, 6096686, 5094352, 4851352, 6134452, 5231890, 6740359, 533303, 8363723, 7575286, 2625927, 5018696, 4229911, 4764537, 8215154, 7661651, 8322132, 7648754, 2138093, 4753661, 3645215, 5456858, 6336406, 480824, 6568241, 6238523, 8170280, 7207499, 5649146, 66227, 5797267, 2758278, 3490823, 1998504, 658612, 1383008, 4844626, 3932008, 5027738, 6385827, 6674895, 2340551, 6795203, 4888256, 3851274, 7467932, 6196403, 1107747, 4343860, 2157290, 5380900, 2353854, 2445596, 3526770, 3670617, 2934584, 7062990, 4801852, 2731257, 3082706, 7037999, 5202246, 2514471, 18570, 2830156, 2043303, 7208758, 2029522, 6777728, 352229, 1020430, 7050457, 7200429, 5891100, 6191111, 6586289, 3646212, 5055345, 7279497, 868308, 1320072, 3843313, 8331154, 4093899, 8201292, 8283835, 1988118, 3581956, 7636841, 4403358, 1173063, 876528, 5010148, 6591381, 1194954, 4879584, 3012122, 6411735, 7122278, 5562128, 1841129, 4275793, 7983122, 5712344, 5144476, 6504082, 1848021, 2556791, 4829830, 5040579, 5123989, 1622697, 5124467, 8039504, 6253462, 2787705, 8155617, 4296069, 399772, 7766740, 3160314, 3965434, 8146919, 7430269, 4160116, 3327075, 5915766, 186946, 6065621, 2575931, 2671676, 5933109, 6796772, 5536478, 6243885, 4402816, 800277, 1052819, 6585725, 6357635, 1641978, 662807, 856, 5918005, 4146696, 1676689, 4386682, 3646372, 5695857, 6578639, 6157049, 877822, 27676, 3002648, 3394563, 1254688, 6417385, 4257316, 3926961, 5101145, 456433, 2279782, 2116751, 3907006, 7431827, 5807803, 1110416, 4583117, 1210903, 8157377, 1911189], -[4422313, 375249, 8166979, 2482523, 1876203, 2569376, 1931688, 7061248, 7893603, 8027686, 6364007, 7537674, 6925837, 5864421, 4468757, 1998228, 5126868, 5745683, 5428125, 4278218, 1368916, 5024216, 6738141, 5753603, 540735, 6725110, 8237073, 402865, 2459405, 3053771, 4801222, 7305162, 7216850, 5517778, 6829921, 3692535, 617445, 5413038, 2318945, 1016161, 4226690, 8018313, 1159510, 4695563, 2452820, 865486, 2805567, 1946061, 7460939, 4655075, 8148555, 3428374, 1051306, 2083350, 4811328, 4247271, 235602, 6614120, 4671614, 4683239, 2657991, 1922058, 3664944, 4414903, 7683346, 4157480, 6987417, 4861928, 4739562, 2905116, 1511385, 5062274, 3529256, 6398452, 37451, 4438341, 4451627, 8189378, 7008546, 6233925, 1047205, 8353209, 797188, 7427845, 4919543, 6552512, 5773806, 3398009, 2183188, 8353689, 1851909, 1471440, 5446260, 4152368, 3283043, 3115657, 4776535, 6649177, 7252591, 7347172, 2623316, 6790642, 1848951, 3837668, 6679421, 5668108, 8055595, 3540357, 5726620, 3479669, 1758459, 876223, 2705620, 7332230, 7468180, 1225878, 105413, 684219, 5156194, 8041091, 4243184, 577545, 3661144, 2138316, 1806723, 2834393, 6600281, 1000339, 3577528, 7255194, 4148766, 7080628, 3346666, 5977398, 2691708, 7436165, 8244543, 5313710, 3745059, 8026047, 2308563, 2505689, 1256135, 8304535, 7171661, 4312584, 864514, 5085007, 6450478, 475145, 3056904, 3649472, 3487377, 7504224, 811988, 7097478, 6696323, 1168512, 3823087, 7343355, 7258656, 7344379, 2952111, 3358950, 2021867, 1894391, 6367412, 7437082, 6114520, 2570870, 4171727, 5991866, 4786507, 7835355, 8256044, 5380585, 3477183, 1557118, 1110038, 5454870, 830455, 8062672, 2143376, 7410434, 1508483, 5512567, 2405432, 993047, 7055933, 7128747, 1680892, 4999174, 6273988, 281526, 482638, 1985857, 4302324, 1608459, 3240476, 2249904, 5137322, 3817948, 6137297, 3978397, 8003501, 6702502, 3772212, 1576596, 3866333, 7062582, 4717397, 2786929, 8077201, 7140330, 682426, 3273204, 5600467, 7345580, 1379796, 6032882, 368660, 1894964, 6557598, 6169070, 2045903, 275715, 337714, 3255855, 157286, 3778803, 3723853, 3523842, 3255213, 2838019, 7112882, 5712607, 6287464, 5140560, 3630876, 2248561, 6871061, 418533, 7586509, 3459948, 6772162, 7577801, 2772203, 1713590, 6399654, 7692375, 1273751, 4393480, 4215842, 1728040, 4766630, 6761510], -[856731, 7411031, 1143034, 5424068, 2884189, 2462709, 5406124, 8195021, 1492401, 3633914, 3270390, 8205558, 5860125, 2432618, 3515642, 6118183, 7317662, 7497881, 5370987, 5011720, 571559, 6686375, 3657269, 1881818, 646146, 5280616, 3174217, 8033223, 8243000, 4271820, 1724622, 8313680, 4216850, 4955489, 4194192, 7779123, 2204625, 5790972, 4799103, 3766979, 1546175, 7230694, 7381771, 4113690, 2196021, 74146, 5871598, 7576029, 3948844, 2398480, 1384794, 1333311, 6914079, 4008942, 4380840, 2965748, 6194771, 3333293, 4634272, 6979816, 6284227, 4881612, 1581822, 1210672, 5985624, 6632242, 3752197, 7852454, 776732, 980165, 5639197, 7931373, 574937, 3226350, 531619, 6994454, 3556186, 4838480, 4742604, 178041, 6091733, 3530717, 6920874, 578526, 1486006, 4223938, 7512455, 4408449, 4347989, 4964516, 5074066, 5280787, 2987969, 3895087, 1543675, 6288114, 5873182, 1807441, 1529561, 201663, 1010057, 4113929, 5222396, 4487437, 1477005, 4652940, 8241782, 3135535, 7187213, 2681680, 4188250, 2871853, 8144498, 2644732, 5294724, 8350129, 1016932, 3691811, 3563313, 6272525, 7558992, 6381918, 2247063, 6962710, 7933574, 6246792, 3437037, 4347262, 5133426, 2505098, 3529912, 3206617, 5169320, 4014036, 4620077, 2022443, 356403, 7748986, 8077327, 5872251, 4626188, 879890, 5231109, 5070478, 4605038, 2790316, 8277556, 43219, 7183474, 2264516, 2509870, 3578689, 2253349, 8020712, 992136, 3793512, 8069406, 2602745, 4987010, 118391, 3889335, 2511678, 6924974, 4671333, 4252092, 6552979, 2980548, 3651857, 3972072, 6415710, 3972584, 4970913, 3700971, 6555306, 3688674, 4969620, 5276364, 1168083, 6219836, 1575199, 1054606, 2891453, 1962623, 4369941, 386619, 1112363, 1740723, 4711665, 8267849, 2513152, 953147, 3250790, 1837070, 6223789, 6251304, 7474003, 7516422, 8233260, 2625653, 1336883, 1238525, 4451554, 5426778, 6644579, 7627974, 2790754, 3486691, 6821850, 4398485, 4960747, 7220122, 6620928, 5227873, 2475610, 5863352, 6523628, 1532503, 5349569, 4558111, 4920649, 5581410, 5517414, 5974322, 2328240, 1579674, 1123515, 4927078, 7166419, 2212758, 549940, 8031113, 6442331, 3085499, 5504072, 7602678, 781602, 4465057, 8136539, 936848, 1916298, 6793598, 1607786, 8226388, 8328829, 3659614, 668103, 5394174, 1491841, 7499904, 2582761, 56126, 4184726, 5202333, 6070222, 4231930, 7161690]] -w = NTTInverse(aHat * NTT(y)): [[7624703, 240004, 2962974, 4152364, 6463756, 2415566, 3786264, 6154666, 3889519, 1100982, 7580840, 4326198, 4924153, 2874925, 7907723, 5555767, 6391451, 4049873, 8074931, 1893800, 950453, 2959143, 8019761, 4148133, 3883490, 3708927, 5271804, 7515854, 1051073, 7247763, 1518251, 408661, 5334341, 55737, 2018703, 5144345, 6612492, 7651462, 5931065, 8192531, 7758789, 2536827, 684454, 7236206, 4487486, 7831429, 7990553, 709177, 2987503, 751576, 2729366, 7972189, 2747989, 2522381, 4416254, 240891, 7576318, 7917005, 3022012, 3097114, 7206265, 5725099, 745443, 3752366, 3465657, 4814055, 6974705, 7666570, 3728792, 5220210, 5663196, 5871436, 583085, 6968732, 2416160, 4663658, 5193451, 6765677, 811614, 7963349, 3969626, 5799839, 7549898, 7902910, 6730593, 7387568, 8084618, 200118, 6497554, 1801143, 4562267, 1277537, 2661944, 2623191, 2033609, 8185038, 701178, 3928782, 8059066, 7938559, 5021973, 4757037, 1053131, 1156675, 2105683, 7212892, 6869130, 5409001, 5929304, 8346957, 4989430, 7363630, 2144236, 5532431, 5270856, 3738502, 2612255, 85507, 5909215, 145407, 1717007, 5712300, 5751460, 5887573, 1460586, 792283, 849969, 7643752, 7705537, 6321600, 163323, 7592530, 1428631, 1732255, 6705417, 1198038, 1719272, 1416901, 563851, 3191560, 6454580, 683784, 3049884, 3633252, 6140333, 4696610, 6526693, 6379638, 1034000, 3794140, 1030894, 5418727, 8340105, 3976177, 6141946, 5588294, 7528683, 6786432, 802743, 2646789, 8060558, 7768921, 7447134, 5587228, 6381403, 7394543, 4384605, 749440, 1602782, 6708673, 1241371, 436991, 4817036, 7911228, 4660309, 3695823, 1982806, 4475766, 7667611, 152376, 1005616, 8139280, 3862468, 2644328, 784232, 2261513, 1599481, 7408718, 1093615, 5067180, 5304027, 4080504, 3830757, 2672714, 249847, 2681896, 4020508, 1388114, 3064553, 2532220, 1252292, 2096422, 6283428, 6593878, 4521977, 4994046, 919551, 2667672, 2419080, 5287667, 1945394, 7206577, 3595768, 6313912, 6896908, 7363857, 6547309, 7430755, 7167386, 6687182, 2726835, 4750409, 3087703, 4664321, 3767946, 4493683, 6277434, 856225, 7383241, 7025367, 1526268, 1273430, 7129566, 7801230, 4723349, 3269582, 3896577, 1681312, 8305875, 3291839, 1663673, 206881, 8238073, 8249897, 258576, 4083472, 6336002, 2937834, 3966306, 2354150, 1907072, 2842675, 2290177, 2544452, 6202865, 1879107], -[7999206, 7767594, 5804783, 5621026, 7468503, 7601690, 2889310, 2111660, 6486008, 3674014, 954663, 6401907, 3343557, 1950187, 3388091, 7516222, 4646223, 4714332, 2260654, 3473899, 5781882, 8326388, 7559184, 8241477, 4748595, 6342608, 7712696, 2189541, 7028645, 1482987, 8146292, 2919300, 8041727, 5876120, 5113865, 515010, 45253, 3392840, 968326, 993968, 7108656, 7503227, 4862663, 3401959, 1903451, 5019759, 7007145, 6995864, 5207881, 822740, 7531812, 3476652, 5555632, 3132509, 5102257, 4410958, 6168196, 3502794, 5651370, 2841466, 7835890, 3753997, 5969676, 788835, 5254048, 4551773, 1767990, 6139884, 1890806, 2898909, 6393423, 7991042, 5653727, 4844667, 7423662, 7860577, 7874296, 7213402, 7668455, 3403384, 2583229, 2234189, 5139923, 1581860, 6827813, 1391326, 2227606, 5839537, 2580221, 5586963, 5748437, 5613338, 59817, 3335540, 7686002, 1654886, 445215, 2647817, 1415140, 206604, 3880977, 7284847, 532648, 7321673, 3350077, 2875224, 3239674, 2355424, 7719196, 1383667, 159904, 7205688, 330035, 3660690, 4784504, 7035365, 4049788, 3195766, 3272593, 3835044, 2758243, 4191336, 2012183, 5402613, 7135106, 7616231, 2407267, 6084962, 7339910, 7411384, 2144265, 273720, 4068409, 4660653, 754262, 3091598, 7625468, 2005595, 3337235, 5470168, 4744756, 5196434, 5723167, 2461893, 3502543, 6684132, 6962811, 6812215, 668598, 7491266, 4321757, 6700956, 1609211, 7857910, 1902696, 4117092, 3418675, 3003709, 1863373, 5503462, 6095149, 6246220, 1958265, 4153054, 4759159, 6722737, 7423007, 6699338, 1824802, 8143047, 542186, 7672094, 5572003, 8159978, 6345865, 5234454, 1072827, 782539, 5418797, 6678242, 7365089, 5670150, 5176020, 1012163, 491699, 3086875, 2741220, 5532586, 4079213, 5736399, 4976224, 7827337, 5115788, 3489836, 1225600, 5166442, 5152337, 7681816, 5104564, 4021773, 7290938, 3107132, 7809308, 6873873, 713473, 5335999, 5510116, 4236751, 1671936, 4996582, 6804633, 3560604, 947093, 2086246, 2901347, 4817061, 6184769, 5576869, 889223, 5409769, 2901988, 3589318, 7504909, 4678847, 4566482, 1962467, 1178890, 4753561, 4537599, 4752814, 1521620, 7127524, 3177361, 8337289, 6346550, 1735552, 4243794, 2554660, 4561061, 727636, 6246204, 1141969, 7324844, 2134982, 7293540, 1941430, 5461870, 5199008, 5385431, 3269938, 7030830, 4209717, 7181219, 998361, 5944831, 2671135], -[1843453, 1651637, 8292642, 8162068, 5735633, 3917334, 1637744, 8041465, 653957, 670249, 2526811, 4484870, 4766636, 1054872, 5656595, 1159967, 359223, 3093807, 2175155, 1505961, 7495806, 5685732, 1747799, 2082096, 6102940, 5365187, 4725544, 4813437, 1972038, 7421994, 1096349, 518861, 4921294, 2567203, 8238511, 1813802, 7886774, 1042649, 92163, 900853, 7974435, 5457650, 3902638, 4869951, 1819987, 7971515, 5407666, 1090268, 5490023, 7116213, 1560463, 4596713, 1525703, 7626827, 7093022, 5943795, 6821582, 7255377, 4004000, 5890962, 1022326, 4952398, 5958548, 2698572, 5888995, 7654819, 2998476, 3013645, 6827506, 5249965, 440516, 3846063, 5080584, 7071041, 5489535, 2009738, 6967830, 2651959, 8220776, 4769476, 2733390, 7455789, 2314602, 538231, 1004413, 7196220, 7140425, 7093311, 2124414, 855861, 8252938, 7856024, 6554555, 5336826, 1549482, 3889898, 1066587, 5488839, 8333880, 6289231, 3173128, 1413610, 7897558, 4396294, 4400585, 5250798, 5773253, 266702, 3128159, 7430696, 3622397, 7612000, 1147220, 1379492, 314898, 5981228, 7630327, 1870381, 1085858, 2104756, 4125178, 3476440, 3419246, 3950178, 3085306, 7749627, 5958453, 1411769, 5340788, 469789, 2218152, 3118327, 859682, 4920167, 3048300, 5758269, 3378085, 5415716, 4589674, 6044408, 5256937, 4987254, 4752911, 1248623, 5202860, 751399, 7359216, 3476893, 4204044, 3698083, 6725490, 7246132, 8315075, 8277795, 7496303, 5833778, 5158172, 4143976, 6911398, 4976247, 3612282, 3615886, 88355, 1785067, 233351, 2618364, 6620232, 1771456, 7315904, 2386995, 3419605, 200817, 5547982, 1289957, 2546806, 8336092, 4503662, 7091553, 3724884, 2017462, 6365803, 7128937, 4537172, 1936866, 7060306, 8088304, 7014796, 2798695, 5960959, 976813, 6464611, 809839, 3433534, 4235995, 7793879, 2241442, 3055972, 2971354, 5229900, 6717861, 8319508, 5877193, 172722, 7944353, 5082997, 5416807, 8220837, 3256025, 96997, 6282915, 4210859, 3973878, 1166414, 2931398, 7209591, 936897, 4348352, 2870763, 7146718, 7619774, 280906, 2069172, 180178, 4299059, 4438598, 5010649, 1303723, 2122592, 4892848, 6951752, 7993411, 2496720, 1815793, 2299579, 5317818, 5922401, 465153, 4363824, 1619525, 5904907, 6488511, 909925, 1383578, 6555276, 5306541, 6929713, 7542463, 6292210, 6099203, 8292056, 477133, 6961080, 7668156, 7228767, 6978685, 5824410], -[4386491, 1825204, 4474271, 4293312, 2026760, 3812337, 4512926, 737301, 2884739, 4899754, 7000258, 198158, 2399458, 5791564, 947946, 5705740, 7823337, 4440994, 7444362, 4052287, 2711554, 6268915, 3719582, 1680093, 1471428, 6288420, 1063531, 3491798, 1341374, 7979638, 7534703, 4905584, 4840233, 790992, 4910244, 2640317, 453856, 7124545, 3422239, 3779724, 7937816, 3059721, 358662, 2015546, 324411, 3470359, 2193271, 7072358, 5894398, 7317965, 2641833, 2305891, 6595902, 2484579, 1544377, 3693482, 7587563, 7731827, 1676404, 5392431, 7611699, 5976727, 5759282, 2514315, 7682044, 3573290, 8297207, 571753, 1755311, 2678557, 825219, 5259932, 1753014, 1976512, 2764657, 642266, 7745634, 8075565, 6309160, 196671, 6256156, 1310933, 3827265, 5400634, 2742904, 7911484, 257511, 5500185, 221297, 1070322, 4768589, 4360508, 56432, 2458252, 3581841, 7267388, 7949562, 6065672, 5918499, 256847, 4206595, 3275273, 6024973, 3652007, 6281534, 7094568, 1634936, 3288937, 3846071, 4827979, 4720706, 1405585, 4656403, 4359916, 4463516, 1223141, 4446800, 2500792, 2425945, 6985040, 576235, 2377258, 7100129, 7802023, 169988, 5754115, 6303457, 4166612, 2979611, 7705387, 4792512, 3543335, 7314616, 7957209, 237547, 1313229, 6172303, 8008999, 2675645, 2824579, 15099, 5286026, 6186222, 2366798, 7294448, 7356759, 5803023, 1893418, 7670462, 2569006, 7044483, 3331591, 8143457, 972771, 6591578, 5240598, 5999711, 4581707, 1982331, 6780711, 6332320, 5319909, 203961, 6109104, 3470339, 730302, 2817043, 6569814, 4486322, 535440, 1629657, 6300407, 3310888, 201462, 2104146, 2139650, 5083693, 8053814, 2183208, 7848316, 94266, 3427160, 3160240, 170055, 5300665, 5399352, 8354611, 6985811, 2808927, 1839130, 6184297, 3065617, 5444959, 2909870, 3490388, 5202071, 2269576, 3803002, 2769037, 7498114, 8330144, 6828329, 3705194, 2911479, 737178, 5787980, 1363059, 3922285, 1495739, 5707605, 3610028, 7227156, 3932974, 3095588, 6062955, 1028605, 6677154, 6282034, 3295822, 8319831, 8248323, 6167189, 2397537, 5775294, 285173, 1310789, 6945536, 3745837, 5191614, 3066113, 6368472, 1140242, 49155, 6751583, 521417, 458372, 6786223, 4649460, 2942491, 2445962, 6317948, 2448344, 6598652, 2009395, 6843236, 7239832, 5547738, 1442708, 3407243, 6671150, 7394562, 4355086, 7755340, 5486873, 7860391, 4022967]] - -w1: [[40, 1, 16, 22, 34, 13, 20, 32, 20, 6, 40, 23, 26, 15, 42, 29, 34, 21, 42, 10, 5, 16, 42, 22, 20, 19, 28, 39, 6, 38, 8, 2, 28, 0, 11, 27, 35, 40, 31, 43, 41, 13, 4, 38, 24, 41, 42, 4, 16, 4, 14, 42, 14, 13, 23, 1, 40, 42, 16, 16, 38, 30, 4, 20, 18, 25, 37, 40, 20, 27, 30, 31, 3, 37, 13, 24, 27, 36, 4, 42, 21, 30, 40, 41, 35, 39, 42, 1, 34, 9, 24, 7, 14, 14, 11, 43, 4, 21, 42, 42, 26, 25, 6, 6, 11, 38, 36, 28, 31, 0, 26, 39, 11, 29, 28, 20, 14, 0, 31, 1, 9, 30, 30, 31, 8, 4, 4, 40, 40, 33, 1, 40, 8, 9, 35, 6, 9, 7, 3, 17, 34, 4, 16, 19, 32, 25, 34, 33, 5, 20, 5, 28, 0, 21, 32, 29, 40, 36, 4, 14, 42, 41, 39, 29, 34, 39, 23, 4, 8, 35, 7, 2, 25, 42, 24, 19, 10, 23, 40, 1, 5, 43, 20, 14, 4, 12, 8, 39, 6, 27, 28, 21, 20, 14, 1, 14, 21, 7, 16, 13, 7, 11, 33, 35, 24, 26, 5, 14, 13, 28, 10, 38, 19, 33, 36, 39, 34, 39, 38, 35, 14, 25, 16, 24, 20, 24, 33, 4, 39, 37, 8, 7, 37, 41, 25, 17, 20, 9, 0, 17, 9, 1, 43, 43, 1, 21, 33, 15, 21, 12, 10, 15, 12, 13, 33, 10], -[42, 41, 30, 30, 39, 40, 15, 11, 34, 19, 5, 34, 18, 10, 18, 39, 24, 25, 12, 18, 30, 0, 40, 43, 25, 33, 40, 11, 37, 8, 43, 15, 42, 31, 27, 3, 0, 18, 5, 5, 37, 39, 26, 18, 10, 26, 37, 37, 27, 4, 40, 18, 29, 16, 27, 23, 32, 18, 30, 15, 41, 20, 31, 4, 28, 24, 9, 32, 10, 15, 34, 42, 30, 25, 39, 41, 41, 38, 40, 18, 14, 12, 27, 8, 36, 7, 12, 31, 14, 29, 30, 29, 0, 18, 40, 9, 2, 14, 7, 1, 20, 38, 3, 38, 18, 15, 17, 12, 41, 7, 1, 38, 2, 19, 25, 37, 21, 17, 17, 20, 14, 22, 11, 28, 37, 40, 13, 32, 39, 39, 11, 1, 21, 24, 4, 16, 40, 11, 18, 29, 25, 27, 30, 13, 18, 35, 37, 36, 4, 39, 23, 35, 8, 41, 10, 22, 18, 16, 10, 29, 32, 33, 10, 22, 25, 35, 39, 35, 10, 43, 3, 40, 29, 43, 33, 27, 6, 4, 28, 35, 39, 30, 27, 5, 3, 16, 14, 29, 21, 30, 26, 41, 27, 18, 6, 27, 27, 40, 27, 21, 38, 16, 41, 36, 4, 28, 29, 22, 9, 26, 36, 19, 5, 11, 15, 25, 32, 29, 5, 28, 15, 19, 39, 25, 24, 10, 6, 25, 24, 25, 8, 37, 17, 0, 33, 9, 22, 13, 24, 4, 33, 6, 38, 11, 38, 10, 29, 27, 28, 17, 37, 22, 38, 5, 31, 14], -[10, 9, 0, 43, 30, 21, 9, 42, 3, 4, 13, 24, 25, 6, 30, 6, 2, 16, 11, 8, 39, 30, 9, 11, 32, 28, 25, 25, 10, 39, 6, 3, 26, 13, 43, 10, 41, 5, 0, 5, 42, 29, 20, 26, 10, 42, 28, 6, 29, 37, 8, 24, 8, 40, 37, 31, 36, 38, 21, 31, 5, 26, 31, 14, 31, 40, 16, 16, 36, 28, 2, 20, 27, 37, 29, 11, 37, 14, 43, 25, 14, 39, 12, 3, 5, 38, 37, 37, 11, 4, 43, 41, 34, 28, 8, 20, 6, 29, 0, 33, 17, 7, 41, 23, 23, 28, 30, 1, 16, 39, 19, 40, 6, 7, 2, 31, 40, 10, 6, 11, 22, 18, 18, 21, 16, 41, 31, 7, 28, 2, 12, 16, 5, 26, 16, 30, 18, 28, 24, 32, 28, 26, 25, 7, 27, 4, 39, 18, 22, 19, 35, 38, 0, 43, 39, 31, 27, 22, 36, 26, 19, 19, 0, 9, 1, 14, 35, 9, 38, 13, 18, 1, 29, 7, 13, 0, 24, 37, 20, 11, 33, 37, 24, 10, 37, 42, 37, 15, 31, 5, 34, 4, 18, 22, 41, 12, 16, 16, 27, 35, 0, 31, 1, 42, 27, 28, 43, 17, 1, 33, 22, 21, 6, 15, 38, 5, 23, 15, 38, 40, 1, 11, 1, 23, 23, 26, 7, 11, 26, 36, 42, 13, 10, 12, 28, 31, 2, 23, 9, 31, 34, 5, 7, 34, 28, 36, 40, 33, 32, 0, 3, 37, 40, 38, 37, 31], -[23, 10, 23, 23, 11, 20, 24, 4, 15, 26, 37, 1, 13, 30, 5, 30, 41, 23, 39, 21, 14, 33, 20, 9, 8, 33, 6, 18, 7, 42, 40, 26, 25, 4, 26, 14, 2, 37, 18, 20, 42, 16, 2, 11, 2, 18, 12, 37, 31, 38, 14, 12, 35, 13, 8, 19, 40, 41, 9, 28, 40, 31, 30, 13, 40, 19, 0, 3, 9, 14, 4, 28, 9, 10, 15, 3, 41, 42, 33, 1, 33, 7, 20, 28, 14, 42, 1, 29, 1, 6, 25, 23, 0, 13, 19, 38, 42, 32, 31, 1, 22, 17, 32, 19, 33, 37, 9, 17, 20, 25, 25, 7, 24, 23, 23, 6, 23, 13, 13, 37, 3, 12, 37, 41, 1, 30, 33, 22, 16, 40, 25, 19, 38, 42, 1, 7, 32, 42, 14, 15, 0, 28, 32, 12, 38, 39, 30, 10, 40, 13, 37, 17, 43, 5, 35, 28, 32, 24, 10, 36, 33, 28, 1, 32, 18, 4, 15, 34, 24, 3, 9, 33, 17, 1, 11, 11, 27, 42, 11, 41, 0, 18, 17, 1, 28, 28, 0, 37, 15, 10, 32, 16, 29, 15, 18, 27, 12, 20, 15, 39, 0, 36, 19, 15, 4, 30, 7, 21, 8, 30, 19, 38, 21, 16, 32, 5, 35, 33, 17, 0, 43, 32, 13, 30, 1, 7, 36, 20, 27, 16, 33, 6, 0, 35, 3, 2, 36, 24, 15, 13, 33, 13, 35, 11, 36, 38, 29, 8, 18, 35, 39, 23, 41, 29, 41, 21]] -w1Encode: 68005962438194815EDAA37662A52A05A45AD4C49D8689081CB06C23FAAD69439858AA1210E1A84E7305A80A41A647505256A2D4E67D43D9601B49A89587A6E3A90662821D8EB3AC44A5AA5A66188B49721FA09D4BC7510EF00589E77D0841A06818A048321AC9314422014D6026860555704005762849386A7A76E27911C87808998A4DCA8506C54A3904839CC6C655941338D50135C7128E9856380DA79853489EE2698E4E066114161267891C659A4554024449B0AE41153E15A33C4C132A6AEA7927FA2CE2548892229D58C6481E80AE59882E25B23EEAB70D805414E5A9498A56961B814A1DB45DA0E43D29F5111C9680CA23AA5E76A6A9894A0EB321E4C17C4EE775808426827304943998D21331E91198C294955514518EB57025DA80E7B904154640E82275D9E635D25892C4798D48AA5812A47460A858D9788ECA3AA0DD1A6E06C18DA7B71503E47495A7A59B646C1BBA5526949204D75989464EC5F264605770CF7466986264588694111026568311A1612EA6D26D5C545A66F1394A02AC5E95A803D16099E11902B420A7972C209765CA690C5AB32A6901146A47698ACA195D8960085A7EA4597D85F6391F0A412427505BD92DA5B366CEC90C8559960BB1A6228750460784D1915E17E705D039A1C6217CA8622C96245550FA1D9CC0408506791287819C961D1B714AD6349AC07A7E9B456AD30424813326662305DDD10058492D618929A55A3E5F211292953210B48DC017A81BB746416855C66316D763A2C1125C97762C1AA9360AC37DC2957C6271881C8986203094A8597E97725D0B85118F56068D5778E975564E4825486848878A6A19A1394229512A242C82C4949FE93063834C689A70E8E735E8040C89437089F20CA91A06E141718E1A7481915D4033992AF80556044E61994454961DD8751957D3940353A681175A109A4DA61A1CA0EA3C000732E6E9296853466B317220A69021178012F188D8908451B02C9BBAA48014051C07948F0242DD236D0CF59C00393D8477548837991504166318012BD878C141521B141AC0380824F63461332EA4D921D2785E699756 - -cTilde: AD259CA6B31AF6C5932C3F672E3C5842F6BBCF530A9926AE0A733A08B67164D3 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] -cHat: [2351294, 5154594, 7619067, 780238, 4898984, 2160977, 4115292, 3545139, 2454475, 2601249, 423314, 8379775, 7676007, 2968393, 4757578, 3832556, 7026830, 3117567, 2003652, 3819097, 2017920, 191430, 1719161, 6391986, 215607, 3517295, 2623535, 3571947, 798448, 6542326, 8236818, 7151126, 4510222, 5029254, 4760646, 968159, 2959686, 3136122, 7176060, 8196795, 2796543, 4064055, 4164872, 3696373, 6704757, 5892744, 2179106, 6698434, 1403326, 1444986, 7824822, 5904499, 577770, 6026943, 1545210, 8088838, 431396, 3968599, 7421446, 5144732, 7997460, 3501350, 4062069, 1147237, 477237, 6344962, 5701392, 4601691, 7407865, 3205222, 4615600, 6687820, 3589180, 544027, 1898516, 6417966, 1605526, 1821517, 7893719, 8013419, 7670571, 94430, 3033416, 3686433, 1544858, 6558468, 3768692, 3369417, 4023882, 138178, 203460, 6804947, 5058007, 1810723, 3746727, 6410965, 6195760, 524269, 8049564, 5667085, 6064573, 2651677, 152795, 7372801, 6968536, 4105844, 6210108, 1209115, 7437496, 725989, 357689, 7411087, 919781, 3096921, 1791722, 7064242, 7098506, 7512747, 5740942, 3101016, 4514311, 4982256, 4812897, 523852, 7052250, 2329605, 1143020, 4340794, 3405069, 1891791, 5050834, 4467892, 3830798, 2503312, 8195380, 6348189, 2971968, 738591, 2812994, 4852282, 7730883, 5189063, 3217590, 3285949, 2948918, 142849, 6777106, 5831545, 6851410, 5742697, 5645835, 2113954, 8051228, 4366601, 1901297, 4020643, 6732445, 4441688, 5974940, 1257762, 97113, 3928529, 3571180, 3919398, 6579860, 2611966, 5764854, 8106418, 7173943, 6402582, 7642060, 2040252, 8358644, 189461, 3919578, 6986130, 772836, 111667, 7454225, 7154781, 8068544, 558943, 4218020, 2441411, 1794044, 7298924, 8159567, 7348614, 5790294, 2426200, 4223771, 2560111, 491067, 2852209, 3299639, 4453343, 1360684, 470444, 7694391, 4236357, 2088703, 2179263, 4067535, 5700090, 5262486, 5083018, 5106668, 7119736, 5010382, 5102988, 7279286, 916385, 8180800, 2581553, 5704551, 302104, 1029774, 2871666, 3049066, 738594, 5240661, 5746994, 6658287, 7001117, 3652423, 8002288, 3822883, 6066580, 4736500, 5536418, 6796558, 4885896, 1368717, 7854830, 505076, 6549079, 6119612, 5125463, 8005075, 2010614, 4437222, 2665472, 283992, 133844, 7641711, 1725074, 6097266, 3776282, 7302918, 6249998, 4292012, 4106090, 4402972, 5650080, 2347233, 3490497] -cs1: [[1, 3, 8380410, 8380400, 0, 10, 2, 7, 22, 8380406, 8380407, 8380408, 8380412, 10, 8380411, 9, 4, 6, 8380406, 13, 8380414, 8380411, 6, 8380416, 6, 8380414, 16, 6, 3, 3, 8380416, 17, 8380416, 16, 0, 14, 8380402, 8380408, 8380404, 24, 8380411, 4, 8380412, 8380410, 3, 3, 7, 3, 8380414, 8380410, 10, 1, 8380415, 11, 8380404, 8380381, 3, 0, 8380414, 8380410, 19, 8380416, 8380409, 8380413, 8380415, 8380413, 8380416, 9, 8380413, 8380408, 1, 0, 7, 8380414, 11, 9, 5, 8380415, 15, 0, 8380414, 1, 8380413, 20, 8380410, 12, 0, 18, 8380409, 8380409, 8380415, 8380411, 7, 5, 21, 1, 0, 8380412, 8380408, 8380403, 8380416, 0, 2, 8380404, 2, 8380414, 7, 2, 13, 13, 1, 8380414, 8380403, 5, 8380409, 5, 11, 8380402, 8380410, 1, 5, 8380409, 6, 3, 0, 8380412, 8380407, 19, 3, 8380415, 8380406, 8380413, 8380402, 8380412, 4, 13, 8380415, 3, 8380416, 0, 7, 6, 8380408, 8380404, 8380404, 8380403, 12, 8380406, 6, 8380410, 12, 6, 18, 6, 2, 8380411, 8380413, 7, 11, 20, 2, 4, 8380407, 8380416, 8380413, 2, 8380404, 8380410, 8380410, 8380413, 8380409, 6, 18, 0, 8380402, 8380410, 8380408, 8380407, 8380414, 6, 0, 6, 8380409, 8380410, 8380411, 13, 2, 8380411, 8380411, 8380416, 8380413, 8380406, 12, 8380410, 3, 8380408, 15, 18, 10, 8, 7, 8380397, 8380400, 8380407, 8380401, 8380406, 8380416, 8380416, 8380403, 5, 8380410, 8380407, 8380413, 2, 2, 8380412, 8380414, 8380405, 3, 8380405, 8380407, 16, 9, 3, 11, 3, 8380414, 8380404, 0, 7, 9, 8380414, 8380409, 14, 8380413, 11, 8380401, 0, 8380409, 2, 14, 4, 12, 5, 6, 8380411, 24, 8380414, 5, 8380413, 8380403, 2, 8380416, 8380406, 3, 7], -[8380397, 8380398, 8380412, 8380402, 8380414, 8380411, 8380415, 8380407, 8380404, 8380415, 8380414, 8380407, 2, 1, 8, 2, 13, 18, 8380415, 6, 2, 7, 7, 10, 6, 8380415, 8380405, 4, 8380408, 3, 8380409, 2, 6, 8380398, 3, 16, 8380413, 16, 5, 10, 8380414, 12, 8, 8380410, 11, 8380401, 8380416, 8380407, 8380408, 8380410, 8380411, 8380404, 7, 8380406, 8380403, 8380415, 2, 8, 9, 8380403, 8380414, 0, 7, 8380415, 8380414, 8380416, 4, 8380408, 2, 8380415, 8380415, 8380416, 2, 0, 7, 8380409, 8380416, 8380412, 25, 8380407, 8380415, 5, 0, 8380414, 8380386, 7, 8380415, 8380416, 12, 5, 3, 1, 8380408, 8380395, 8380415, 8380398, 8380413, 8380400, 7, 1, 8380411, 1, 6, 8380415, 8380415, 10, 9, 8380416, 8380409, 17, 8380413, 3, 4, 8380413, 8380412, 8380409, 14, 8380414, 6, 8380416, 8380406, 14, 7, 8380406, 5, 8, 2, 8380416, 8380415, 8380408, 9, 8380407, 0, 0, 8380405, 2, 8380404, 8380406, 8380416, 8380411, 8380408, 8380400, 1, 7, 8380414, 8380396, 8380416, 8380404, 1, 8380411, 8380411, 8380413, 4, 8380415, 8380415, 9, 4, 11, 2, 2, 17, 8, 8380408, 16, 1, 12, 8380415, 8380408, 8380414, 8380416, 8380415, 4, 8380398, 6, 6, 8380416, 0, 8, 8380406, 2, 8380399, 16, 8380406, 8380407, 8380399, 8380413, 8380412, 9, 5, 8380410, 16, 6, 8380406, 3, 2, 8380415, 9, 8380409, 8380408, 8380404, 8380414, 18, 2, 8380413, 8380413, 5, 8380401, 6, 8380413, 5, 8, 8380411, 10, 8380411, 8380405, 8380409, 8380402, 20, 9, 8380416, 7, 17, 8380416, 8380408, 3, 8380411, 12, 10, 8380411, 6, 8380416, 8380411, 8380413, 8380416, 8380411, 9, 8380411, 8, 13, 8380414, 5, 8380408, 3, 2, 21, 5, 2, 8380415, 2, 8380416, 8380415, 2, 8380402, 9, 8380414, 22], -[9, 8380416, 8380402, 8380412, 8380405, 8380416, 2, 8380408, 8380416, 8, 8380408, 8380408, 1, 8, 5, 0, 8380411, 9, 3, 8380403, 3, 12, 8380416, 4, 8380408, 1, 14, 13, 8380401, 22, 6, 8380412, 8380409, 13, 12, 8380411, 8380413, 15, 8380401, 1, 8380409, 6, 8380405, 8380411, 9, 7, 8380410, 1, 17, 8380412, 1, 5, 8380413, 8380401, 8380416, 8380416, 8380403, 2, 8380413, 8380411, 1, 8380401, 4, 8380413, 8380404, 8380405, 7, 11, 8380412, 7, 7, 8380412, 8380408, 8380416, 5, 3, 8380408, 2, 4, 11, 12, 8, 3, 3, 3, 10, 8380416, 6, 10, 6, 8380415, 8380412, 11, 3, 4, 3, 5, 8380402, 5, 8380405, 6, 8380415, 8380404, 6, 8380404, 5, 9, 8380415, 8380416, 8380416, 8380405, 1, 8380407, 14, 4, 8380408, 13, 7, 3, 6, 8380412, 14, 1, 8380401, 8380408, 14, 0, 8380415, 8380408, 9, 8380414, 2, 14, 8380412, 5, 4, 3, 8380411, 4, 12, 1, 8380415, 2, 8380408, 3, 8380406, 8380408, 8380414, 8380412, 2, 8380411, 8380414, 14, 8, 8380401, 3, 8380416, 8380411, 8380404, 3, 8380404, 2, 7, 15, 19, 11, 8380405, 8380413, 8380412, 1, 9, 8380414, 2, 11, 8380412, 18, 8380415, 8380416, 8, 1, 8380409, 3, 8380414, 12, 4, 8380408, 5, 4, 1, 8380409, 0, 8380413, 8380412, 8380410, 8380409, 8, 8380411, 9, 8380414, 8380408, 8, 8, 8380411, 8380412, 2, 8380407, 3, 8380408, 8380413, 2, 8380407, 8380408, 8380410, 8380405, 6, 8380414, 2, 8380414, 6, 8, 8380415, 8380413, 3, 9, 2, 8380413, 13, 16, 11, 8380413, 8380411, 8380414, 6, 8380413, 8380416, 0, 8380416, 6, 8380412, 8380413, 7, 8380415, 8380405, 8380413, 1, 8380416, 8380409, 8380413, 0, 8380412, 7, 8380401, 8380416, 2, 1, 5], -[8380413, 8380404, 4, 8380415, 3, 8380415, 3, 16, 6, 0, 5, 8380410, 6, 25, 8380408, 3, 3, 8380398, 4, 1, 20, 12, 8380414, 8380413, 8380401, 8380405, 8380405, 10, 8380404, 8380411, 18, 8380405, 8380412, 8380415, 11, 8380405, 8380408, 0, 8380407, 5, 4, 9, 8380415, 8380409, 3, 8380399, 8380415, 8380416, 10, 8380406, 1, 13, 5, 2, 1, 4, 8380413, 8380414, 8380414, 8380412, 8380413, 6, 8380401, 8380415, 15, 8380411, 8, 19, 8380408, 12, 8380411, 19, 5, 18, 8380412, 10, 5, 8380409, 18, 8380409, 8380411, 8380396, 0, 14, 8380414, 2, 1, 0, 8380409, 8380402, 8, 8380416, 0, 8380397, 8380406, 8380412, 4, 8380413, 0, 9, 6, 2, 8380414, 4, 8380415, 1, 8380399, 11, 8380409, 12, 8380409, 8380410, 1, 8380414, 8380403, 8380405, 1, 8380409, 4, 8380416, 8380408, 8380415, 8380404, 8380415, 8380411, 8380403, 13, 5, 5, 8380408, 8, 8380404, 16, 8380414, 16, 21, 8380408, 8380412, 11, 4, 8380408, 2, 8380408, 8380401, 8380399, 8380408, 8380413, 8380413, 8380412, 10, 8380410, 8380412, 8380415, 13, 8380410, 5, 14, 8380415, 2, 10, 12, 8380410, 5, 8380400, 8380408, 11, 8, 1, 9, 0, 8380409, 8380399, 6, 8380401, 8, 8380416, 8380416, 8380403, 8380408, 8380411, 8380407, 8380393, 8380406, 8380411, 8380415, 8380412, 4, 9, 8380398, 8380404, 8380409, 8380414, 8380402, 8, 3, 21, 15, 8, 15, 8380409, 8380409, 17, 1, 12, 10, 6, 8380410, 8380414, 8380407, 8380406, 3, 8380404, 8380412, 1, 8380415, 8380407, 8380400, 8380409, 6, 2, 8380399, 8, 8380416, 2, 2, 4, 7, 1, 8380408, 8, 8, 3, 8380416, 8380414, 11, 2, 8380411, 3, 8380407, 8380415, 8380412, 8380415, 8380408, 8380416, 3, 8380410, 8380415, 8380402, 6, 8380409, 8380400, 5, 8380415, 8380413, 2, 8380416]] -cs2: [[6, 11, 14, 10, 1, 8380412, 8380404, 14, 11, 2, 8380416, 8380412, 10, 15, 8380411, 8, 8380411, 2, 0, 8380411, 2, 8380407, 8380411, 8380415, 2, 7, 4, 1, 8380413, 1, 8380406, 4, 8380401, 8380410, 4, 8, 10, 6, 6, 8380416, 8380407, 0, 5, 8, 10, 11, 9, 8380413, 8380406, 6, 8380401, 8380411, 4, 6, 4, 8380412, 10, 8380409, 8380412, 8380402, 8380408, 1, 8, 8380413, 8380412, 2, 8380406, 8380415, 8380396, 8380406, 3, 8380413, 14, 2, 12, 2, 2, 8380407, 8380411, 4, 8380410, 8380398, 7, 2, 8380413, 4, 8380416, 6, 8380413, 8380411, 3, 8380410, 8380398, 1, 8380410, 9, 8380414, 8, 10, 4, 8380405, 5, 8380405, 2, 8380412, 3, 8380413, 8380406, 8380410, 12, 4, 8380415, 8380409, 8380413, 8380411, 3, 8380414, 0, 8380414, 8380415, 9, 9, 8380411, 8380413, 1, 8380405, 1, 8380410, 1, 8380403, 1, 7, 10, 8380416, 8380413, 5, 8, 8380406, 8380409, 8380402, 8380408, 8380411, 8380415, 8380414, 8380409, 8380416, 5, 9, 12, 9, 11, 1, 10, 8380405, 2, 8380406, 8380404, 3, 8380416, 6, 0, 8380415, 8380408, 8380404, 8380410, 0, 11, 4, 6, 11, 8380408, 8380412, 8380410, 8380412, 8380415, 8380404, 8380416, 2, 3, 8380413, 8380414, 11, 8380401, 8380416, 8380409, 8380407, 8380395, 8380403, 5, 8380408, 16, 6, 8, 8380412, 8380409, 12, 1, 8380412, 11, 8380414, 0, 2, 2, 8380402, 8380407, 8380404, 8380407, 8380407, 8380416, 8380416, 5, 8380408, 0, 8, 11, 8380410, 8, 9, 3, 8380411, 0, 8380409, 8380414, 8380398, 5, 8380405, 4, 8380404, 2, 4, 8380407, 8380416, 3, 5, 2, 8, 2, 3, 8380413, 8380411, 4, 2, 8380416, 10, 8380414, 1, 8380411, 0, 8380414, 0, 7, 4, 8380410, 16, 18, 1], -[3, 13, 7, 3, 8380402, 0, 7, 8380405, 8380398, 5, 1, 4, 2, 8380412, 25, 8380414, 8380412, 8380411, 12, 5, 8380407, 8380414, 9, 20, 8380408, 17, 9, 8380415, 8380411, 8380415, 7, 6, 12, 10, 8380411, 8380412, 10, 8380411, 8380415, 4, 8380413, 8380411, 8380410, 8380412, 1, 9, 4, 8380404, 5, 8380411, 6, 8380411, 8380409, 8, 8380415, 0, 8380411, 2, 1, 8380400, 8380405, 8380405, 1, 8380394, 8380413, 10, 1, 0, 8380405, 11, 1, 8380410, 2, 0, 8380414, 8, 8380405, 1, 8380414, 8380407, 8380404, 8380404, 8380404, 8380403, 1, 8380414, 6, 8380409, 2, 0, 8380411, 8380410, 4, 8380402, 4, 5, 8380403, 18, 4, 18, 8380412, 3, 3, 8380409, 8380398, 8380407, 3, 8380406, 10, 8380410, 8380412, 8380412, 8380399, 5, 5, 0, 7, 13, 8380412, 5, 8, 6, 8380410, 8380412, 8380410, 14, 8380398, 8380410, 2, 8380413, 8380412, 8380411, 8380408, 8380412, 8380414, 8380405, 8380408, 8380416, 8380412, 0, 0, 18, 8380412, 8380409, 16, 1, 8380403, 8380415, 8380411, 5, 8380409, 10, 5, 8380411, 0, 8380404, 10, 8380416, 7, 8380415, 15, 6, 2, 8380409, 4, 8380415, 0, 8380404, 11, 6, 8380410, 12, 8380414, 8380416, 8380406, 8380406, 8380409, 17, 2, 4, 3, 8380398, 8380412, 8380411, 0, 16, 8380415, 8380410, 1, 0, 2, 15, 1, 6, 5, 1, 8380411, 8380413, 8380403, 8380407, 7, 8380400, 5, 2, 3, 8380414, 4, 8380410, 8380411, 8380413, 8380407, 8380415, 8380416, 14, 2, 8380408, 8380415, 1, 8380407, 8380411, 8380405, 11, 8380406, 1, 8380414, 8380416, 8380409, 8380414, 19, 8380403, 4, 8380411, 12, 8, 5, 8380416, 4, 8380410, 5, 9, 10, 8380404, 8380413, 8380411, 12, 8380405, 2, 0, 8380409, 8380408, 9, 8380413, 10, 8380413, 8380413, 3], -[8380411, 18, 8380399, 8380399, 8380408, 8380415, 8380410, 12, 8380401, 5, 8380413, 8, 2, 11, 8380409, 8380410, 5, 8380407, 8380414, 8380408, 3, 8380416, 8380408, 8380410, 8380392, 8380408, 1, 8380415, 4, 8380416, 5, 8380407, 2, 1, 1, 8380407, 8380405, 6, 9, 8380413, 3, 8380402, 8380414, 2, 3, 8380413, 8380414, 5, 8, 8380409, 8380412, 8380409, 3, 8380408, 2, 4, 4, 12, 8380397, 4, 8380407, 8380415, 8, 8380413, 14, 0, 2, 8380401, 12, 8380414, 8380411, 8380404, 8380395, 3, 8380405, 18, 22, 8380416, 8380407, 1, 8380410, 13, 8380407, 2, 0, 0, 8380405, 16, 8380413, 8380410, 8380416, 1, 8380416, 8380414, 8380410, 11, 1, 8380410, 5, 10, 9, 9, 1, 8380416, 3, 8380407, 5, 10, 4, 0, 8380414, 8380399, 13, 8380412, 12, 0, 11, 8380412, 3, 8380407, 17, 7, 4, 0, 3, 8380415, 8380413, 8380415, 2, 8380413, 8380410, 8380406, 18, 14, 23, 2, 3, 2, 0, 5, 8, 9, 8380412, 3, 8, 9, 9, 8380414, 8380409, 8380405, 8380414, 18, 8380416, 22, 8380407, 18, 2, 11, 8380413, 7, 10, 8380416, 12, 14, 8, 8380413, 8380407, 9, 12, 1, 8380402, 4, 1, 4, 8380406, 8380406, 10, 4, 4, 8380413, 8380408, 7, 8380413, 8380411, 5, 8380411, 16, 0, 5, 14, 11, 8380414, 8380413, 1, 11, 6, 8380408, 8380400, 4, 8380415, 7, 8380412, 8380406, 2, 9, 10, 18, 4, 5, 8380409, 6, 8, 12, 8380402, 5, 13, 4, 8380410, 2, 1, 8, 3, 11, 9, 8380403, 8380415, 8380411, 3, 2, 8380407, 5, 4, 11, 3, 13, 5, 8380406, 15, 8380415, 6, 8380416, 8380416, 17, 0, 8380415, 8380401, 8380413, 7, 16, 8380414, 8380409, 6, 8, 8, 13, 8380407], -[10, 8, 8380416, 2, 4, 8380407, 16, 8380410, 15, 9, 1, 3, 8380413, 2, 8380414, 8380394, 5, 1, 2, 8380413, 8380399, 12, 8380404, 9, 8380405, 11, 8380409, 8380413, 1, 8380414, 7, 9, 8380411, 6, 1, 8380416, 8380411, 1, 8380404, 8380416, 8380401, 8380412, 1, 8380413, 4, 9, 8380416, 3, 8380398, 11, 0, 8380416, 1, 8380410, 2, 5, 17, 8380414, 21, 7, 3, 8380415, 12, 8380416, 10, 13, 8380409, 3, 8380396, 13, 8380411, 4, 8380397, 2, 8380401, 4, 3, 13, 8380413, 17, 13, 15, 2, 4, 1, 12, 5, 4, 0, 8380397, 3, 2, 2, 17, 8380395, 10, 8380411, 7, 7, 8380408, 8380412, 0, 4, 8380405, 8380416, 9, 5, 8380405, 9, 8380408, 8380414, 13, 3, 1, 8380411, 8380412, 8380394, 5, 8380414, 8, 8380392, 4, 8380416, 8380405, 8380410, 8380416, 5, 1, 18, 21, 6, 8380416, 8380415, 7, 10, 8380411, 8, 8380401, 15, 11, 6, 8, 13, 8380404, 8380400, 8380414, 8380412, 11, 8380408, 15, 12, 8380405, 4, 8380392, 8380408, 11, 12, 0, 8, 8380412, 5, 8380414, 4, 17, 11, 4, 8380404, 19, 8380413, 9, 0, 8380405, 8380415, 8380411, 8380407, 8, 15, 15, 8380413, 8380396, 3, 8380405, 7, 8380407, 16, 1, 8380414, 8380408, 4, 6, 8380412, 0, 8380404, 7, 8, 8380416, 14, 8380408, 15, 8380403, 8380398, 0, 8380412, 6, 12, 4, 7, 8380407, 2, 8380409, 15, 17, 11, 5, 8380414, 10, 8380413, 8380416, 8380401, 17, 15, 5, 8380411, 5, 11, 0, 7, 8380410, 8380405, 8380405, 8380410, 8380405, 16, 3, 2, 8380408, 8380405, 8380414, 8380407, 8380416, 7, 10, 8380407, 8380409, 4, 9, 3, 12, 8380413, 8380410, 8380416, 8380415, 13, 8380411, 14, 8380406]] -z: [[8327090, 94591, 8300798, 8272597, 61859, 6727, 8344001, 109117, 53395, 7442, 8268757, 8280872, 8262450, 8357750, 8267522, 8374862, 94846, 8310403, 23011, 8274971, 8251735, 99445, 127570, 8349196, 8286057, 125734, 8325649, 73380, 15600, 116129, 8341191, 17395, 45489, 8356141, 8280242, 8323182, 44635, 129399, 8287081, 106485, 124390, 8302631, 69561, 16764, 8284893, 90506, 8284090, 111075, 8255897, 116588, 54332, 82993, 8347100, 3300, 118446, 126596, 31256, 66518, 8334400, 7881, 8323337, 8280749, 8261564, 8326590, 8324804, 8317693, 8320361, 111070, 8257836, 8326596, 8308884, 8350336, 8257941, 80304, 33632, 8294966, 102645, 8311093, 8290069, 122327, 36438, 8258011, 87926, 5299, 74401, 8267457, 8323189, 46157, 66235, 129901, 42485, 8337690, 8292893, 8304331, 77839, 8337230, 18100, 8346423, 8341075, 8275672, 64184, 8272116, 23501, 8332562, 8298449, 8301602, 8334095, 1529, 8363756, 74655, 17121, 54399, 8371924, 100230, 25705, 8271344, 8299739, 77840, 46229, 69831, 62035, 62152, 66193, 18954, 43892, 65631, 8349532, 125295, 8285006, 104849, 71414, 8273538, 8314668, 8250405, 72320, 8304187, 8360369, 8345917, 115438, 8360204, 8351737, 54952, 4306, 70497, 8288309, 46663, 7316, 8376835, 8356040, 8350861, 8344706, 71416, 14151, 8287959, 33144, 8257739, 8303448, 8282684, 8328895, 8338833, 89559, 8332465, 50674, 8328613, 8358529, 57253, 113258, 8324997, 8329760, 7203, 8300946, 8270196, 8342701, 37304, 70334, 8299032, 91453, 8259837, 86265, 62491, 8281539, 105866, 123514, 19048, 97084, 56882, 116420, 8375423, 8253391, 85672, 45427, 110124, 4895, 64906, 47566, 23876, 128669, 8301467, 110447, 7360, 70529, 8332805, 107259, 106212, 8282240, 8317659, 50838, 18697, 73302, 8314866, 8369800, 8352690, 8297505, 61907, 43685, 121988, 110717, 107525, 34527, 25657, 8376129, 8267629, 8308302, 110015, 126131, 4603, 77093, 40487, 8316887, 110638, 54311, 66643, 3039, 8361421, 92749, 101635, 8321736, 8257720, 55564, 129153, 8269569, 8212, 95607, 8325159, 8276048, 41745, 8293256, 8603, 76762, 8371709, 63784, 12680, 8320564, 229, 8260959, 49946], -[5912, 8968, 114752, 8300865, 122020, 8287438, 8308088, 107807, 8267260, 8316945, 8339110, 8358139, 27502, 113205, 122734, 69459, 8337767, 8346782, 100052, 2472, 95952, 8275141, 8347694, 8294050, 8303308, 6031, 8324288, 42872, 8359166, 10554, 8260007, 76108, 8361659, 8259332, 8334721, 8273484, 122318, 16712, 101535, 98282, 8255985, 67625, 63749, 8271786, 8296604, 96749, 8309065, 572, 8339909, 100456, 8364597, 70382, 57701, 28935, 8295466, 68780, 123247, 16558, 41763, 8251670, 8368790, 8249654, 8323217, 8270863, 8317044, 8255416, 8311542, 8334986, 8357530, 8290763, 18488, 8287765, 87217, 49926, 120194, 40432, 87742, 8337862, 8352856, 9058, 8305789, 72743, 8257058, 130404, 8263236, 95093, 8363282, 8377501, 121194, 97904, 2140, 8727, 8361236, 79481, 8371204, 36069, 59180, 8320388, 60242, 8264184, 8268319, 8378639, 8327403, 8265470, 8343698, 89957, 8326626, 8339690, 8255879, 16568, 49474, 8347685, 8277029, 8336880, 103265, 119976, 8357283, 44824, 109133, 8352533, 54437, 120842, 8373019, 22304, 8351578, 8337049, 127553, 8251998, 73492, 67041, 8314395, 101763, 8274236, 8327310, 8359191, 8263104, 8285057, 8332537, 83615, 55652, 60460, 33039, 63487, 8274301, 8254196, 34606, 8328865, 113050, 8302695, 53138, 19987, 27236, 28999, 8338650, 26354, 8330209, 8351630, 8325746, 8349604, 8333749, 16760, 8304182, 8322445, 121221, 106094, 8321861, 8315677, 48370, 9419, 8360450, 8328164, 124861, 8266716, 54585, 8279298, 52624, 8345599, 82523, 8332458, 86980, 8290565, 8260723, 16550, 8346026, 8365372, 35167, 118626, 8285786, 8292879, 48202, 8278689, 8285862, 8250582, 8342135, 8326617, 89539, 2533, 71361, 8306780, 115924, 20240, 27872, 8302415, 8289362, 128230, 113218, 48196, 97840, 81793, 8361691, 8284568, 8258779, 8339800, 42692, 22723, 111436, 8336412, 8298169, 8361825, 119385, 8251409, 8322938, 113755, 8367345, 8293987, 102123, 8353427, 8329710, 8329843, 8281487, 8294793, 8345258, 8323362, 76993, 33878, 8344104, 21634, 8309408, 8353543, 64649, 8372249, 8272917, 122404, 1360, 8257837, 72351, 8317003, 55560, 16193, 8362805, 54863, 126917, 8338203, 8294090, 8291103, 8292744], -[9194, 8252144, 8273384, 8290312, 8290146, 55875, 113559, 33052, 8274898, 81677, 8352385, 92310, 28457, 17307, 8311471, 8325498, 8272344, 2547, 8272810, 8368919, 8341472, 8302416, 36443, 15334, 8315280, 8344526, 8363855, 8307018, 113367, 5681, 8352960, 8261900, 8369800, 8307719, 65460, 8277282, 8374353, 8335253, 43764, 102668, 58404, 103262, 8341033, 8297155, 8359738, 8254134, 8261943, 8253125, 8255714, 8311341, 8368324, 101891, 85532, 70283, 8255455, 8281414, 99190, 16173, 8283794, 8307138, 24816, 8271357, 41638, 8322507, 8319210, 125095, 8356512, 74862, 66652, 8252066, 8271348, 8378839, 8348707, 8342530, 8280416, 8318890, 8311316, 8356869, 59221, 112005, 54345, 8292837, 114348, 126232, 35821, 8296926, 116139, 8319860, 8288001, 129388, 8343731, 128248, 1557, 8296135, 24299, 118707, 18725, 98073, 68414, 130975, 8348491, 8258134, 8260936, 26901, 43828, 8348459, 8318079, 92426, 8305897, 119296, 19658, 31962, 8252584, 8322891, 51943, 8354945, 8254293, 8342437, 97218, 8362487, 8323692, 12239, 8320658, 8353880, 60278, 51458, 8375527, 54202, 38781, 8311374, 8253462, 8359680, 92333, 24796, 66407, 128735, 8306471, 13886, 8304136, 8375750, 8295447, 8270016, 8310338, 8293790, 8264497, 131043, 8266560, 8347795, 8252826, 56897, 8302533, 118409, 8353246, 39830, 26636, 8375199, 44733, 8306852, 8329456, 128704, 69724, 8301272, 53478, 8301647, 77369, 13308, 8296169, 8341666, 8345977, 8334308, 10308, 8320627, 8270597, 8296399, 56539, 8373929, 8362977, 39071, 8364097, 108965, 25917, 8289569, 8341759, 8336258, 8284273, 8268381, 127137, 8375204, 8370144, 85126, 8283442, 8335041, 8378248, 12885, 111789, 8340581, 112630, 8262988, 39949, 8366231, 50580, 58520, 8368455, 1008, 51730, 42597, 8253619, 82448, 70775, 8370158, 8335841, 8355588, 26617, 8317192, 90633, 2763, 3059, 8263511, 104993, 8331399, 8372229, 37970, 95855, 8353104, 8313099, 8332833, 8309228, 8268344, 5461, 89248, 80898, 91233, 8324317, 97759, 123131, 8308289, 66539, 8369525, 8273793, 8363680, 71711, 42855, 59077, 8359847, 8320520, 8302319, 50199, 100023, 89528, 51086, 8321087, 18240, 8327731, 39365, 8318463, 72983], -[8311175, 8272247, 8322936, 128565, 101454, 98948, 63875, 8312242, 12791, 8313613, 8355967, 93643, 130661, 108637, 8351277, 8140, 8255868, 8255660, 8313680, 38130, 8336706, 45570, 8261551, 8307821, 8306114, 722, 8328863, 429, 21253, 8325498, 36363, 99678, 112615, 92095, 78375, 8355774, 8335615, 115581, 8316684, 8288860, 15957, 103656, 79666, 109099, 40003, 100622, 8344174, 104068, 3289, 8321213, 8305004, 82434, 8333005, 126211, 8337730, 8309699, 8288308, 29538, 8262618, 67208, 112141, 59604, 124329, 89980, 8361604, 8284757, 8308542, 105709, 47764, 112453, 8374929, 43650, 8308503, 14030, 53056, 8253148, 8293487, 8379961, 84558, 69808, 7973, 23795, 92368, 8075, 8256860, 8343134, 34652, 8310894, 29841, 26512, 8290881, 8317322, 8348367, 8306426, 8306361, 8260310, 8324334, 8266776, 62294, 71988, 8259840, 122198, 8338986, 8287973, 128260, 90192, 8311107, 8315993, 8356849, 110729, 63694, 8301073, 31136, 81030, 107141, 8289494, 69519, 8316840, 25217, 8272567, 20078, 8306420, 8275015, 98173, 110957, 8302405, 49312, 8352687, 102449, 8264339, 8300361, 112968, 8252877, 8276734, 8331637, 8342719, 52680, 8296394, 53814, 8321636, 8282461, 118629, 8297886, 122968, 10250, 79700, 8332007, 115382, 4795, 8265473, 107575, 8278308, 128064, 8292048, 8334343, 8348606, 100317, 8368305, 8282721, 118148, 52517, 8251032, 6294, 2716, 36221, 8323671, 101336, 8331434, 56000, 8356984, 120942, 8320653, 59712, 8249481, 34249, 37221, 128537, 8259669, 8264677, 8276490, 85718, 129619, 26747, 130332, 98144, 79648, 8274039, 65838, 8325755, 86190, 46109, 66707, 111417, 103562, 36023, 52801, 8353885, 8358384, 37658, 59270, 96080, 50986, 110325, 75820, 8275989, 113518, 31197, 8334084, 8321322, 8368248, 8275320, 8348917, 48371, 8351432, 58621, 82750, 10340, 130962, 8340276, 8340859, 88706, 8295014, 8349544, 105507, 32210, 8262840, 96904, 111636, 8356089, 8270802, 41366, 8329296, 8353439, 63702, 91987, 109118, 8253107, 66408, 34697, 39438, 79620, 8321084, 81951, 8286192, 8355528, 118146, 8315590, 51122, 8332403, 8333789, 106094, 26425, 68882, 8270945, 8277126, 4918]] -||z||: 131043, ||z|| too large -r0: [[6137, 49529, -84464, -37854, -12021, -60461, -23003, 59804, 80228, -41804, -37719, -54469, -27921, 17950, -91759, 32303, -84319, 50127, 75443, -10834, -1869, -88271, 20279, -42073, 74208, 90104, -61192, 87757, -91707, 10130, -5450, 27729, 1365, 55744, -76405, 1809, -53758, 32896, 26675, 2580, -50225, 60795, -77407, -1434, -83660, 22394, -8944, -52675, -59910, -10286, 62886, -27293, 81489, 46343, 35578, 50432, -42252, -82475, -25407, 49705, -31358, 11178, -16421, -56910, 37310, 52453, -72452, 48012, -80467, 77693, -50727, -32944, 11679, -78438, -59884, 92520, 50921, -91017, 49764, -36143, -30111, 85938, -68669, 93884, 64357, -40532, 85131, 9648, 21782, 86973, -8872, -55704, -4533, -43306, -61488, -4923, -60675, -70970, 59568, -60933, 69921, -4568, -89641, 13889, 10584, -24743, 12430, 76020, 24927, -33472, 37362, -64464, 49140, 8979, -62130, -70781, -54238, 85507, 4834, -45055, 2822, -1629, 37546, -16807, -63127, 30439, 88112, 25199, 86976, 36302, -27142, -26037, -95091, 18080, 39181, 55249, 5088, 83664, -7533, -46313, -21187, -78066, 2462, 14439, 45493, -64989, 50912, 94317, 81668, -15149, 78563, 85734, -40322, -23555, 47096, 64849, -89864, -70275, 40888, -19713, 61070, -40101, 19047, 63785, -94366, -33553, 3922, -12420, 79064, 42422, -91868, 56068, 55443, -88255, 89175, 77020, 78167, 95092, 49048, -38084, 53299, -50683, 53204, -22167, 22384, -24045, 75791, -19364, -49174, -75339, -28981, 80754, 21469, 6223, 59391, 15388, 20763, 54871, 17118, 56191, -80956, 1316, -1886, -72347, -49149, 41995, -32759, 1186, -56951, -45324, 40749, -31046, -23048, 28592, 40193, -64232, 71525, 2650, -70249, 20948, 60339, -11183, 40282, 93204, -41339, -77441, -7882, 94382, -44857, -21805, 2566, -59817, 82395, -7799, -38253, 31686, 87295, -32867, -74538, 53957, -50507, 16415, 48122, 59935, 68115, 83727, 50696, 80874, -33435, 68582, 2425, -14289, 4616, 68404, -82465, -25534], -[-285, -41443, 90856, -92897, 40422, -16870, 32343, 16568, 10251, 55193, 2342, -73873, -84797, 45552, -40286, 88129, 75092, -47262, -24926, 45542, 67972, -54026, -59385, 51505, -12996, 57279, 94127, 94439, -18517, -40723, -43667, 62334, 42227, -28274, -28657, -56377, 45243, -35506, 16008, 41644, 61492, 75137, -89394, -26388, -1190, 67686, -40027, -51291, 65348, 60890, -86754, 48306, 32184, 85077, -40269, 30286, 73354, 74440, -62551, -15477, 26878, -55271, 65291, 27002, -78940, -19373, 53813, 45036, -13822, 41938, -82354, -8439, -60195, 83067, -4431, 51545, 65284, -24231, 49898, -24958, -83254, -51366, -2592, 58162, -28892, 58081, -57968, -64839, -86277, 63507, 34523, 89889, 59813, -92797, 67438, -59295, 64301, -18697, 81888, 16122, 71702, 47212, -38747, 84049, -78256, 18274, 1783, 69867, -89838, 50426, -30555, -31939, -50875, 41869, 22899, -11803, 50037, -42135, 34710, 25759, 91739, 1122, -82914, 69626, 87945, -2343, -68746, -9879, -88188, -16708, 49166, 83262, 68674, 89522, -7591, 44186, 6917, -89508, -91112, -53288, -16844, 53888, 9252, -14131, 74175, 17891, -84343, -44487, -93252, 63165, -58907, 34706, 85494, 48892, -1944, -73103, -9687, -43714, -41274, -19992, 286, -39098, 53623, -37146, -2445, 56499, -5089, 33111, -79849, -46911, -29199, 53522, 48550, -29973, 60564, 91937, -69949, 20666, 85803, 11998, -63010, -43751, 33497, 59849, -79693, 39435, 74726, 9137, 79468, 22479, 24158, 18298, -26741, 61478, 82811, 23913, 9815, 63260, -37950, 22039, 53299, 59725, 279, 17167, -48386, 3010, -13344, 46550, -42234, 44522, -52061, -58210, -5226, -8872, 44385, 55470, 89923, 53412, -63087, 76783, 45040, -29509, 76824, -82754, -4651, 57828, 36114, -8036, -33556, -8772, -2096, 80362, -60539, -43136, 61233, 21377, 53582, 78635, -10080, -34229, -39118, -802, 87216, 39884, 55896, 36802, -61588, 56480, 52447, 32059, -16347, 19513, -56423, 46045, 40451, 4636], -[-61181, -62557, -87757, -27866, 21722, -82408, -76425, 41965, 82581, -91612, 50783, -86274, 5034, -87923, -57317, 17190, -21710, 46393, 80054, -17742, 67707, -28187, 33632, -13001, 8117, 32204, -36057, 51839, 67394, -6101, -46440, -52521, -30772, 91170, 48558, -90828, 77762, 90323, 92154, -51463, -25056, -65791, 93361, -82115, -84656, -27969, 74677, -52521, -33441, 69053, 36756, 25585, 1988, 8276, 45852, 39407, -35126, 17733, 4276, -13426, 70016, 336, 54156, 32080, -15403, 36259, -48950, -33763, -29210, -83024, 59594, 36796, -61922, 23870, -33909, -85384, -79360, -14536, 30834, 7875, 66901, 27680, 29044, -33163, 52093, -41412, 93269, 46127, 29314, 94012, 62987, 46999, 78780, 3837, 25777, 80607, -76198, -34610, -46542, 3909, -64769, 80353, 88533, 15623, 19910, -82184, 59328, 76228, 80731, 2600, 3584, -6542, 4423, 46249, -66042, 76844, 11756, -34254, -56929, 9662, -65047, 48081, -9110, -49566, 37879, -59395, 54073, 78523, 7794, 88865, -67409, 70914, -92656, -31911, 853, 44347, -50270, 82722, 18538, -50445, -76063, 35181, -8684, -84628, 60324, -10466, -68889, 48544, 13844, 79279, 59253, 8482, -65341, 87821, 68217, -70624, 15642, -46243, 54698, 24176, -6544, -2929, 88343, 70877, 42879, -48128, -45998, 57271, 78260, -89038, -8732, 10349, 24525, -43295, 70785, -44314, -67484, 44381, -84400, -77638, 80500, 81762, -33960, 32232, 13133, 88822, -32388, -58265, 56570, 24479, -11176, 47986, 5186, 45786, -15156, -44132, 8557, -76053, 87368, 51623, -60916, -27186, -17731, -55137, -59540, 83805, 30867, 18133, -93472, -2389, 20645, -25874, 23618, 74453, -28046, -15436, -32324, 13810, -90916, 1213, 90434, -25935, -10297, -81622, 57940, 58587, -29519, 27485, -59218, 95058, -6082, 20684, -88858, 14008, -15187, 18012, 84236, -16863, -94649, 517, 12736, -42394, 50313, 79500, -26449, 73025, -76093, 6891, 4339, -88358, -94251, -86094, 49588, -8873, -68496, -79964], -[5809, -79444, 93600, -87362, -68348, 3067, -58226, -24548, 27764, -52319, -46911, 7691, -76570, 77642, -4371, -8157, 14308, 60321, 16264, 52547, 45076, -16409, -89685, -34092, -52272, 3097, -79245, 63450, 8125, -19847, -83864, -46489, 78639, 29130, -41821, -26178, 72934, 77376, -6100, -29555, -61656, 12302, -22267, -79554, -56521, 41998, -92296, 25187, -9967, 80322, -24663, 20324, -70339, 8554, 20663, 74661, -31014, -77194, -37793, 59432, -6864, 72345, 45350, 38284, 63474, -45539, -83202, 358, 41156, 12048, 63369, -73064, 38858, 71870, -92287, 70870, -63393, 76064, 23852, 6190, -29169, -22330, 17983, 67638, 76407, -88016, 67042, -23275, 30833, -72442, 6986, -20166, 56430, -17797, -36953, 29746, -49920, -29183, 14108, 66392, 16392, 37385, -69879, 33203, -3777, 47391, -79245, 51061, 36782, 66388, -40891, 72324, 85264, -20757, 82850, 80362, 66151, 24755, -50084, -62136, 4868, 91686, 52962, -6989, -20469, 40196, 18140, -23597, -67831, 86806, 30906, -75480, 76986, -42286, 47073, -20013, 77447, 9527, 9134, -32392, 15093, -46974, 91361, 81243, 56833, -71334, 89108, -11233, 51911, 92959, -2697, 93715, -46499, 20476, -74653, -92405, -95149, 10571, 77683, -75988, 47003, -13080, 13493, 14239, 41976, -31558, -39904, 94019, -84810, -35961, -84519, 15107, 73002, 11004, 9052, 44538, -58850, 54311, 88108, 39313, 94263, -1180, -77655, -20399, -32343, 66359, -25803, -61348, -48037, -65516, 89454, 18193, -78484, 52903, 62028, 59544, -16006, -6269, -87938, 70032, -50254, -28375, 86383, 54513, -24690, 74056, 29804, -77449, -27975, -6307, -8803, -10493, -66781, 48159, -31890, 76275, 10918, -3277, 57950, -60603, 58356, 72336, -78489, 61369, 94698, -22459, 88825, -63436, 49098, 18701, 83167, -2530, 49139, 85340, -49977, 77453, -70469, 78327, 85541, -30069, 32629, -27698, -67578, -85701, -13472, 2191, 24279, -81016, -21105, 4917, -33533, -25584, -53697, -36577, 51353, 23234]] -||r0||95149, ||r0|| check passed -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[117652, -88500, 99229, 103745, 129782, 115311, 112350, -110374, 28110, 108233, -9323, 27872, -111444, 26883, -106147, -95173, 3177, -61361, 99918, -129464, 102617, 87660, -18701, -15969, 51387, 74837, -112376, -70190, 30302, 69400, -32560, 80676, -4724, -74901, -4812, -109182, 7318, 94512, -79924, 121527, -93451, -7898, 45462, 4204, -116288, 20933, -119091, -65312, 51224, 15198, 94286, 68768, -82469, -65566, -7167, -120832, 89641, 74686, 127419, -17720, 78289, -16698, -106550, 103935, 79505, 37320, 94846, -28005, -12253, 96371, 21551, -7986, -123850, -96787, -25178, -60279, -127469, -40298, 46, 68926, -69363, 103362, 60917, -100334, -45583, 73662, -59555, 127677, -106814, -17769, 114757, -63912, -102271, -73582, 52605, -77545, 45466, 103673, 54271, 38675, 6886, 87737, -67713, -108070, 96654, 62012, 37108, -31672, -123176, 88597, -89573, -53018, -18842, 114162, 92829, -9850, -126040, 23352, 18867, 22545, -72364, 104917, 67410, 93109, 45481, 78530, 84571, -106966, 106891, 119018, -125338, -127117, 65690, -106530, -30317, 58156, 125920, 100792, 118920, 26863, 34338, -6821, 113955, -45820, 17580, -115868, 78689, -17656, 76507, 81617, -13810, -67132, 69398, 6280, 36656, -26748, -74806, 34913, 85681, 106227, 87890, 32514, -92123, 19053, -84235, 18999, 105298, -11192, 105051, -20164, -77178, -33084, -28552, 82610, -72090, 15844, -101166, -95396, 114977, 97273, 111897, 6154, 7879, 275, 48082, -119267, 104302, 4007, -14922, -107101, 95207, -87265, 31962, -129628, -123646, -2205, -67454, 92247, -8229, 116560, -59498, 23552, -85498, -98033, -124457, 122600, -55815, -34971, -31585, -93490, 108378, -41866, -27252, 3517, -15234, -12874, -83167, 44614, -73211, -110223, -53185, -12026, -92142, -8911, -113959, -57989, -13625, -68748, -51153, 68412, -18129, 10966, 109791, -106641, 32815, -116037, 44195, 111881, 17049, 13825, -12909, -15967, 124696, -78238, 62561, -7565, -50887, 126273, -108077, 63416, -44582, -29442, 25577, -6253, -35305, 116408], -[-51527, 7529, -68067, -88153, -53466, -50969, -99076, 13866, -75340, -44939, -10117, -52928, 57773, 103566, -28885, 76530, -51204, 59470, 30336, -58224, -10649, -2577, 71618, -4813, 11097, -77088, -127626, -4233, -98579, -113205, -46640, 82315, -118542, -113320, 21208, 90324, -128251, -19671, 21928, -40073, 22784, -52235, 124466, 84171, -123166, -3687, 42300, 120964, -91961, 52796, -96234, 52667, 6194, -109214, 34134, -66092, -27479, -91826, -92885, -126861, -14011, 9143, 15610, -63768, -102328, 65621, -119690, 57863, 16857, 45170, -38569, 23011, -120444, 57469, 106560, 104108, -93076, -84060, 72279, 45141, 4651, -114914, 105535, 122421, 125102, 80249, -44576, 33901, -116802, -11500, 105132, -70079, 118692, -55167, -65847, 108285, 102957, 4498, -29368, 90102, -49183, 57717, -36507, -58049, -6743, 129169, 15797, 3128, 12499, 14807, -27508, 87881, -101626, -128683, 21500, 118432, 1648, -6016, -21732, 60018, 9518, 35537, 45629, 16666, -3519, -56541, 111794, 6882, -38451, 49162, 40861, 111904, -86999, 31854, 18661, -316, 99694, 89965, 9673, 18303, 4650, 97464, -15688, -1807, -2858, -40301, -103024, 17182, 9328, -126621, -18374, -108950, 34084, 109566, -111501, 30215, -128404, 32384, 64232, -64652, -50901, 62038, -82534, 128097, -56494, 77429, 32103, -23760, -121312, 35943, 118311, -61232, -58056, -57887, 46317, 15545, -100804, -102314, 93500, 10671, 78871, -13603, -10400, -34633, 102403, 118966, -111173, -92272, 76784, -46365, -36552, -65089, 41131, -39437, 111957, 109590, -73871, -103558, 53545, -128108, 49517, -26193, 80905, -125589, -71987, -42107, -53396, -109891, 2243, -24744, 60275, 45176, 92618, 21981, -42399, -18077, 68506, 55495, 41261, -28763, 63048, -8336, 107262, -59752, 10172, 15279, -52046, 67501, -3283, 107844, -78588, 107440, -27792, -63222, 3688, -71739, 51548, 41550, -24348, -124116, -96747, 79432, -1470, -72162, -92709, -19029, 7422, 106047, -106205, -45038, -57278, 28846, 23473, -12579, -77890, -79440], -[110184, 102236, 25926, -109551, -25723, -86016, -3800, 67891, -117550, -27105, 128237, 89837, 89022, 118420, 95928, 16410, -79474, -113637, -14062, -96582, 56252, -100595, -59552, -95532, -38407, -129255, -86047, -114757, -49613, 41083, -130054, -120581, -47368, 33510, -123696, -130772, 126817, 32153, 65999, 17979, 29879, 117941, -20933, -87501, 41201, -3719, -86356, -123945, -76854, 51926, 80608, -53752, -89565, -39238, 16365, 116808, 127632, -61081, -8485, 24427, -98976, 111879, 76835, -94505, 86496, -32582, -81060, -79499, 44557, -110886, 126622, -30754, 17922, 16595, -111680, 8327, 124628, -40862, 121416, 64044, -32925, 44462, -39181, -58686, 108730, 99089, 124609, 56012, 87358, 75475, 3337, -123704, 14434, -59577, -43900, -86710, -63402, -13027, -15156, -33368, 34025, 62227, -34547, 35621, -17164, -79005, 92055, 121858, -20094, 6411, 121775, 47659, 39033, -106403, 70796, -65540, -43035, -35177, 77329, -126587, 29810, -26516, 33598, 5692, 79632, -19389, -97754, 31140, 122928, 116165, -34216, -30169, 23363, -47276, -54397, -115734, -26990, -6969, -89363, 27318, -77055, 129367, 111873, 108544, -63913, -77898, -22473, -33712, 17987, 96979, 105947, 31286, 101742, -126715, -105439, -56265, -129350, -60978, -41041, 110059, 101602, -78117, -26590, 6265, 31944, 48973, -39655, -56983, -16205, -60035, 56876, -112536, 41550, -80269, -26625, 26712, 40417, 76549, 77888, -98115, 110914, 49308, -40960, -5590, -10514, -70514, 15891, 60399, 112391, -62592, -108702, 77619, -130615, -118070, 75993, -5246, -43754, -3775, -6658, -104013, -30347, -20206, -3538, -129990, 49151, 70182, -130168, -54250, -12109, 126899, 102877, -74834, 54838, -56112, 5566, -62106, -34056, 54163, 126762, -37854, -119919, -44964, -70148, 115356, 12787, -125859, 9561, -58199, 9518, 124202, 19947, -114225, -64707, -104376, -13429, -115179, -5706, 60211, 33319, -74779, -42397, 101529, 36992, -13990, 89556, 15510, -58572, 54995, -69090, 97927, 57319, -80248, 56952, 108143, -72264, 41385], -[-16882, 41597, -29584, -9412, -15129, 533, 19572, 105022, 130325, 65557, -11222, 18061, -67242, -90943, -21315, -19770, -63292, -53278, 115872, -55281, 29563, 127892, -25706, 19889, 54930, 125187, -5631, -111739, 64301, 131047, 81614, -80531, -18326, 114022, -37320, -21292, -36571, -27771, -95074, -16715, 31553, -54361, 88446, 39737, -47903, 39922, -111522, -112964, -22849, 37069, 127691, 115841, 59558, 78860, 110605, -98997, 114732, 123019, -53151, 89274, -91525, 34945, -91135, -29459, -45201, 50747, 113651, -26727, 35486, 118761, 72000, 14728, -73225, -113128, 45205, 50886, 109355, -111405, -2907, 44191, 37677, 123285, -73577, 73691, 10166, 86194, 29627, 36643, -102185, 75315, -118453, -64281, 126519, -45831, -99263, -107435, -79735, -118553, -68753, 120694, 56332, 67333, 117128, 87435, -43743, 120626, -65103, -127639, -65412, 110904, -101587, -81146, 113836, 106003, 55033, -83189, 25543, -130872, 76263, -55798, -64759, 5807, -129806, 83987, -87658, -38370, -83868, -120350, 69220, 37433, 91677, 107118, 34259, -8552, -281, 74592, -117170, -737, -52315, 26898, -91260, 29073, -72006, -5898, -108020, 88287, 76429, -49937, -46773, 2076, 40128, -39287, 107097, -30948, 22457, -23169, 25029, 12014, -45124, 125116, -12139, -4075, 100748, -3909, 54856, -41607, -78, -35852, -83291, 14145, -33134, 20578, -130429, 69999, 20845, 104329, 49910, -48303, 13323, -76505, -59679, 117968, 68890, 100179, 67281, 44097, -14217, 11398, 102605, -110190, 101369, 126207, 78254, 93917, 110058, -60230, -110977, 68099, 82674, -116314, 110458, 104996, -75340, 41690, 59474, -15779, -28699, -23505, 473, -24111, -80508, -18893, -15453, -8900, 38483, 100551, -7762, 55607, -75502, 49205, -95344, -53611, 81598, 20093, 32578, -62966, -8768, 5129, -126034, -108862, -45768, -43005, 55368, -65085, 12676, 66109, 29646, -87857, -32522, -26957, 69906, -81017, -46429, -19650, -110943, -21980, 19295, 29128, -43611, 78926, 123631, -91729, -110997, 92109, -100009, 66177]] -NTT(y): [[6683481, 993445, 7236874, 409897, 1707198, 5818025, 3745001, 132698, 7312186, 2948753, 2551081, 5504579, 2802304, 2336958, 7750858, 7118507, 2445347, 1405287, 5295069, 1380482, 6361137, 2083734, 1465030, 4499791, 3424471, 4317842, 4622111, 7992940, 2742323, 6241994, 7542350, 3392381, 5584516, 322171, 4146227, 1957534, 2207044, 3306059, 4326644, 4293622, 4298059, 2399041, 7633491, 7814886, 2003016, 451260, 362854, 6919657, 6338947, 5757865, 5332386, 5239106, 7207839, 1852653, 15955, 1702462, 3627781, 286599, 7262026, 7414449, 4892981, 7770700, 3198105, 1944289, 3943464, 1604635, 6969188, 3092288, 6839523, 5172418, 5838075, 9300, 1877396, 1910511, 3749643, 323134, 4134012, 8009431, 617308, 3307263, 5370565, 2784298, 4805622, 7793962, 1294588, 4458665, 2707626, 5836650, 2316128, 6376043, 1801179, 5161989, 1234856, 1208301, 1244501, 978517, 3681310, 4641945, 7662618, 471374, 4603166, 4994935, 951120, 5061899, 1821827, 6297305, 3586838, 7352304, 988666, 7184892, 5876196, 2069263, 4600335, 3075217, 2947592, 2010016, 5059349, 7377890, 5549765, 6441661, 8337891, 2380931, 2091227, 6316845, 3263538, 2107664, 4527594, 8133441, 7842099, 3394343, 4459931, 3392585, 4850798, 3640850, 3538304, 1236943, 2060238, 4310050, 5399116, 3153480, 5218380, 1410897, 2828268, 5599762, 7870218, 4113448, 6176218, 1175441, 2194513, 4752428, 3464997, 2577540, 5242808, 5388695, 2860687, 2758207, 2494053, 2281341, 3295887, 4597035, 2704008, 6453642, 3668939, 5309515, 239135, 5754681, 4043482, 7425469, 4608875, 295340, 8021611, 5732398, 4677475, 1218989, 6283561, 2238181, 5072537, 4248302, 7147849, 7726824, 7704722, 5826947, 8253165, 555044, 3704340, 1441616, 3766600, 5392990, 4876405, 1377805, 5942637, 3007530, 1605991, 3423269, 7928080, 7008505, 1034470, 5884996, 6048908, 2983275, 3596996, 924384, 4922592, 3373786, 6963806, 3508190, 3926442, 7389513, 5895731, 3265902, 3035782, 5793891, 2750530, 273210, 3962589, 8038395, 3396855, 3743090, 3506661, 4244574, 3686349, 1111917, 6511523, 5980005, 1899860, 396139, 5915919, 7043285, 5444680, 4400629, 2527802, 4300209, 484121, 1934387, 5759562, 870821, 5573170, 2746554, 6664752, 4336800, 6046526, 2689659, 7005551, 1745751, 3231237, 5980769, 4198412, 511625, 445950, 2734935, 4242759, 5447102, 957392, 7208642, 8162984, 6848953], -[1015544, 7750779, 5626317, 7217650, 5908681, 2367728, 6183856, 5429519, 3332947, 2824974, 4893877, 5341776, 344341, 2673102, 6871665, 4312918, 7229037, 3298031, 2715617, 2542831, 3905274, 3882022, 1419076, 1936956, 7864815, 4708692, 5048892, 4821359, 5139649, 3628881, 7935292, 1357393, 2688850, 4711893, 295342, 2607319, 3672066, 2757448, 4294343, 6599043, 2192027, 7239823, 5914369, 2940086, 7292666, 7858858, 2916241, 3938916, 2841899, 331784, 99618, 212438, 5291709, 2949901, 5233659, 2147022, 3278047, 1327801, 8311096, 7449794, 5269957, 3461673, 8025424, 5116929, 5673099, 786011, 701668, 7599152, 2515102, 3193285, 7886446, 1251776, 4414640, 6143649, 7665684, 3845698, 4852200, 3670563, 7279789, 4805843, 7365973, 5942255, 1587944, 812548, 5451716, 6997326, 595506, 6976085, 6833059, 5443514, 7908038, 970486, 6010015, 3320708, 4123966, 8146731, 6401981, 3611269, 4881810, 6640891, 3093455, 6897524, 845992, 6048370, 97552, 619037, 511341, 5400061, 6551212, 1056144, 6256868, 88424, 2117259, 4225022, 4741905, 4598630, 8104106, 5980489, 601881, 4585102, 1451450, 6518561, 4972843, 1262150, 339465, 6323667, 4421727, 6183239, 7885777, 428878, 122517, 4816425, 1488542, 2675515, 8155513, 4098146, 2041960, 3530980, 2301286, 1911223, 246179, 345621, 2299703, 5507607, 5734658, 145629, 1948622, 2009706, 7886040, 2324849, 6291154, 3726950, 5946104, 3819848, 5036927, 4842162, 7633418, 2738746, 3106331, 589232, 7352964, 3686918, 292197, 5196222, 2012719, 5934977, 3065385, 7414555, 3183159, 2443970, 4688201, 3607350, 3740730, 6980141, 6057879, 1330294, 6178343, 205496, 8262884, 997366, 5025886, 4312721, 4822089, 3205045, 2902907, 7404801, 209247, 31552, 2967081, 1288008, 3652868, 702975, 1171747, 1876552, 3898890, 6261259, 7856877, 3836104, 2356709, 6898798, 2545098, 6258998, 1066666, 47529, 6832473, 2753442, 1693361, 4315219, 4862541, 7033941, 6984824, 5956837, 2520596, 6908685, 6279248, 415089, 4341972, 4625066, 5187224, 224732, 2888790, 5667484, 3307392, 4410226, 4411012, 3168594, 5736834, 7969872, 3519656, 7972612, 1696788, 7287975, 6490506, 6567940, 3235807, 3230774, 5554357, 742311, 4744597, 941101, 2064555, 7705705, 2756129, 6450956, 5406063, 1659160, 1427273, 7673546, 7195868, 3449402, 1187333, 2412775, 5330272, 5568447, 2430330, 8058516], -[460815, 824890, 5360372, 9075, 5588222, 201931, 7724273, 4253273, 1082878, 337968, 925327, 3227906, 4652474, 7786945, 4866469, 6457444, 4628194, 1616249, 476303, 6338937, 5535379, 764481, 5999161, 4625346, 3151566, 4891103, 2542054, 3766239, 6833040, 1934048, 2113223, 2777856, 941496, 3208472, 1544313, 1955019, 6181048, 1250296, 8264268, 2061778, 3352731, 2739640, 2002886, 3106193, 5227382, 6687342, 1448216, 1393896, 4536305, 8036939, 3039702, 645377, 7745129, 7604093, 8243428, 8144537, 95321, 687612, 5904840, 7228713, 5972137, 952266, 5688038, 4144595, 5568508, 4456806, 1473912, 6321813, 1873877, 4889551, 4614439, 2573606, 5274478, 1846028, 6911916, 4438774, 5668144, 1774988, 1959257, 2788442, 1992851, 3620109, 3343359, 2145430, 427080, 6474013, 1077955, 2942732, 7778956, 2723499, 5403096, 6089960, 6308224, 5556375, 1965188, 8108275, 7735847, 7223764, 6867140, 2644996, 2763278, 4592642, 6629962, 8235243, 2844033, 5703264, 4208924, 4926238, 2058658, 1464468, 4206261, 131662, 1353229, 3916882, 4879748, 7133686, 2752230, 2376061, 1049410, 7972504, 4145630, 5472755, 6646468, 5796185, 6709401, 5188955, 2989463, 1219274, 6009430, 1744868, 4054989, 6218690, 4677172, 4190914, 7640065, 8213652, 4277488, 2388299, 1444506, 5705262, 4115760, 3407455, 6693262, 5913869, 3902748, 3159790, 2612725, 5851693, 492735, 3254909, 6742253, 7444059, 3689518, 2145198, 4270944, 2265384, 5214907, 2207039, 5993222, 401399, 6291376, 801741, 4647938, 3662881, 6134077, 988682, 2529826, 7400153, 4943685, 3918001, 353079, 3893731, 6242086, 4631316, 3120929, 6033550, 4260634, 5670162, 7981279, 4298957, 8188822, 6938280, 2522294, 6043678, 4726380, 296219, 387621, 3866876, 2367161, 2790769, 6968773, 2309581, 4936923, 304791, 1764432, 2316973, 4022062, 6305561, 4025077, 3270065, 307381, 4418003, 608486, 1897504, 1520922, 6115271, 6252638, 8023506, 3964670, 2068056, 4630199, 7194167, 2636362, 2517702, 3045169, 5065576, 8116796, 6039004, 161965, 3397944, 6211415, 2310693, 1119629, 5585816, 681613, 1609750, 4959795, 5546608, 2250102, 4033925, 4069829, 1781605, 4979008, 7894562, 3188093, 1692664, 5173999, 7857306, 3834025, 3896871, 444172, 2338456, 7611987, 4371224, 3734289, 80777, 2520775, 937292, 5934715, 7752239, 7606468, 6493196, 2878016, 6095612, 3907015, 3974306], -[1445813, 6264146, 6459182, 4786729, 2376648, 6266816, 4155440, 2131077, 3465846, 4662079, 3256973, 1883223, 4460822, 1801170, 3577321, 2816824, 11651, 3373721, 2976188, 3552896, 3952875, 2277484, 3004494, 4230362, 3335966, 6772568, 4224233, 5045887, 1776465, 2223701, 6237943, 6057179, 10528, 5958073, 2945366, 2176695, 5638170, 2779159, 6126247, 724655, 4226605, 4851834, 278351, 2528254, 7576971, 6835789, 2288304, 1968867, 7022769, 503805, 3993284, 3064553, 34396, 2604162, 5966027, 2037300, 2407507, 4714626, 3360486, 170312, 7922508, 8112105, 5942162, 2932772, 1074393, 1746546, 5926282, 5531698, 6720511, 571010, 6625478, 4435024, 4685308, 19340, 2754122, 1118629, 2227805, 2239405, 6484651, 5574264, 2760057, 2487238, 1004407, 982460, 7533159, 5234330, 758017, 6547230, 2338173, 57549, 1220162, 6695046, 4604479, 3834190, 6567444, 2991810, 8195750, 3941366, 3645406, 6187277, 1522024, 2093959, 2534408, 2591117, 6030573, 2765561, 7798796, 6077174, 3714084, 1643649, 1810747, 1162050, 2952019, 597871, 7134460, 7916204, 4350860, 3072430, 384698, 1991324, 5980657, 2058878, 517822, 6961175, 5126189, 7378466, 3886786, 7978238, 1147968, 5263301, 195607, 5948363, 5355293, 6784846, 291529, 937580, 1554652, 4442117, 2627657, 3267921, 5282635, 5531962, 5716031, 7006501, 1864878, 2722724, 1094584, 3988823, 4981339, 7679497, 109446, 3395457, 4992890, 6984266, 7692851, 4207204, 7256443, 6004594, 8069313, 3365984, 1552383, 6532931, 667678, 4489817, 3474407, 5038086, 1620875, 3292726, 4308456, 1180987, 5769469, 6772146, 3539638, 8301559, 2924831, 1865316, 810513, 3031870, 6562418, 4652883, 4860620, 3855732, 4228130, 5208071, 94000, 6479624, 2549052, 4422931, 3978932, 3105052, 4480365, 671795, 320063, 4092852, 6942929, 6343704, 6073508, 2617845, 2320515, 5719010, 129968, 7137364, 2742164, 537344, 5959076, 919346, 3856319, 3472500, 1836242, 7601502, 3165499, 3050916, 1168035, 972169, 3839548, 643367, 2306123, 5977403, 8357648, 2767856, 3899058, 7724796, 7315276, 5462917, 4371062, 2308591, 4112988, 806055, 3443159, 632245, 766991, 3167391, 7091372, 836238, 1769416, 4133373, 5059471, 4675899, 1078945, 308116, 5359593, 1046446, 3605010, 5242261, 2554553, 4728511, 2803144, 1414849, 5911280, 6963879, 3907743, 1672156, 5458876, 6650577, 6351741, 6676056]] -aHat * NTT(y): [[328045, 4651046, 8207998, 398219, 1575939, 1224829, 6212378, 3091497, 161251, 532798, 2379498, 7450219, 3318485, 766241, 5920353, 1067651, 3200679, 7559325, 7710382, 3100021, 5892180, 3181805, 2385350, 462378, 1901399, 3627680, 480145, 91026, 689996, 7661746, 3594749, 4651390, 3416785, 7322146, 7372404, 2139715, 1351446, 2040859, 8159918, 2050230, 1607379, 6815058, 2682735, 6449057, 5427178, 1783289, 291987, 3829816, 53503, 59536, 4079875, 546162, 5753643, 2125114, 1348388, 4223405, 2207224, 3099968, 6835296, 7901157, 5729257, 6637005, 3043786, 617353, 5623668, 20881, 5171888, 3730385, 4728793, 7121754, 7932005, 2548428, 5262412, 1922241, 1296221, 1068520, 958705, 6531467, 1129871, 3314492, 5891765, 1228574, 4344938, 70083, 3458995, 3192681, 3933429, 8272769, 4580055, 3784423, 7015086, 6024757, 2483967, 4636992, 6099497, 4626335, 179470, 4722867, 6026489, 6635068, 1811781, 8244393, 4408277, 2628093, 7675603, 2812331, 8126035, 4271631, 4281260, 1742604, 5611707, 5809721, 7920454, 2874945, 3667977, 6936197, 8071199, 6136755, 4490147, 3026111, 8076429, 3518853, 7141297, 689665, 4811296, 3718147, 7923866, 5856300, 7934379, 1075813, 645446, 498940, 7452840, 49988, 8235221, 719087, 6241272, 4318742, 6295964, 6419844, 5670640, 4119276, 7179633, 1365020, 6636685, 7130126, 3794633, 3199491, 7253697, 2469505, 5116320, 7890224, 3017692, 1424390, 3226919, 2593279, 8109268, 4375045, 6350287, 4467294, 7658658, 8227658, 7048095, 7208166, 5315901, 8177317, 6502372, 2966247, 1618236, 2827076, 722675, 7648815, 8373780, 7318606, 8034246, 1352238, 3776847, 8249957, 750062, 548563, 2058987, 99140, 6795936, 3917453, 1823513, 598456, 1243526, 7007669, 1082411, 1098938, 5164443, 2561390, 32598, 2270429, 430474, 1568532, 348774, 5067425, 7027250, 6951505, 3271134, 7127820, 3742884, 236875, 5769554, 7724347, 1093052, 1395552, 2450542, 4507976, 2585414, 1487152, 5497449, 5494631, 7973376, 7197661, 3109390, 3178976, 5818549, 2663439, 1225682, 5636066, 7449409, 3624910, 5847996, 6692969, 5417547, 8379132, 6743486, 5301805, 185139, 8287890, 5705608, 103265, 4239931, 6998701, 2070720, 2470064, 5584042, 1785299, 4452002, 1332443, 1954644, 2744128, 3431789, 6122989, 7274603, 5012114, 4930350, 3032981, 5332426, 4287192, 7314728, 4299849, 4206291, 7596894], -[7736985, 5872658, 1317772, 3950066, 433846, 679465, 2360851, 2616283, 5637005, 5106948, 8241184, 2613146, 1391984, 8328939, 4742774, 7908826, 4389356, 2322929, 1223512, 5786799, 5706257, 3538547, 2076175, 4626715, 7336777, 4331503, 2937648, 3772165, 4845686, 5698427, 576305, 8303834, 2778036, 8086546, 3026641, 4871321, 1979610, 7499166, 7432581, 5949741, 8065117, 1080123, 6477925, 4048267, 2125555, 5088836, 577460, 1037549, 6954338, 5029149, 2260802, 4828127, 6764049, 2946315, 4978328, 5294927, 5795300, 6469527, 6800525, 925856, 5451408, 4315964, 6677794, 4390286, 5565587, 180834, 1126718, 7587643, 2100467, 3193310, 1659871, 1756068, 1886722, 2075711, 4194997, 2792271, 8233653, 4739418, 6892105, 1219674, 6209421, 4506220, 7817427, 6879139, 5212572, 7015555, 8146450, 7249467, 1347195, 1229434, 1795442, 1648432, 4449253, 6159469, 367827, 3965577, 4758630, 1895283, 4209190, 6567591, 8214267, 5978805, 6526821, 6376119, 2262991, 3393018, 2052936, 4916085, 5335606, 7674023, 2394825, 8140030, 4044292, 1520781, 1138818, 3800522, 3275257, 4659506, 979214, 6943546, 6370522, 4568907, 5933929, 211203, 317754, 6555366, 718473, 6508758, 5340265, 4498147, 8040934, 2723591, 1272289, 4451984, 2450298, 30431, 5533518, 506314, 969208, 7592332, 8288258, 3008360, 4310876, 4185824, 684796, 867166, 959369, 1093180, 5846196, 2269009, 2793181, 7118677, 172357, 1319745, 3718718, 7716142, 1954477, 2586030, 7520603, 7339302, 7987234, 8309093, 2869510, 226750, 7087568, 6972335, 4132194, 4662119, 604304, 6118329, 1557026, 8291869, 3312822, 6816756, 4795709, 5903006, 7468467, 3027636, 464216, 479843, 2367341, 3980874, 2726742, 4530369, 7507703, 3392347, 5114644, 8257637, 5697274, 4994252, 4780954, 4955045, 4854710, 2149320, 6731954, 5274035, 4421778, 194326, 3128342, 528278, 4765725, 3190492, 1043243, 76710, 1464122, 4741549, 6658895, 8007133, 8094033, 6462536, 3543429, 5325443, 8160606, 7021215, 7590303, 4160142, 1249093, 4173890, 5907932, 6446232, 436627, 7492036, 3053103, 5847181, 4606367, 5987568, 4443960, 4994671, 4385695, 3902381, 4691547, 3104849, 3476079, 6455482, 4396522, 7895298, 6018751, 4766298, 42193, 3706662, 4790313, 963788, 6364176, 7770834, 2045407, 2124484, 4888166, 7242918, 2552881, 4856684, 1047928, 6202422, 549056, 8056376, 5800752, 7051276], -[386500, 4262126, 541591, 7295369, 2770793, 4577893, 6122185, 5950702, 4346568, 1058900, 2995549, 360333, 586898, 7551934, 1138077, 7198003, 6650149, 7613422, 6798495, 3064766, 5401551, 2028051, 7003697, 8210690, 3665127, 7814543, 2828010, 3834015, 3265361, 2840782, 4066145, 1510257, 1954154, 622288, 8129638, 6629627, 795153, 6581753, 7545885, 1450259, 2311017, 520841, 1225038, 1478228, 517832, 6623112, 5650585, 289607, 4480900, 6072887, 1728089, 7329427, 7318115, 6910104, 4587392, 6500196, 7015177, 1735326, 4763202, 17129, 1939178, 2202515, 2484909, 2758320, 924229, 3197124, 5192192, 3701228, 6928744, 1125705, 313518, 7679122, 7129819, 3505740, 834054, 1468174, 5686688, 6786152, 4913392, 4372855, 648711, 6391684, 3821101, 999223, 4830114, 374112, 6472599, 3077894, 5759048, 2746263, 6475188, 2831876, 3732483, 3522275, 6508614, 4466359, 3292714, 4156853, 1748327, 3397679, 1145269, 2508148, 6062411, 5694888, 5755574, 6373347, 5660896, 8223427, 3075640, 2774926, 4051446, 8129537, 1816029, 6646551, 6662797, 2127010, 2200240, 7130915, 5116657, 502902, 8035980, 6516164, 4421742, 15504, 7013980, 7260064, 2469452, 541716, 6092116, 2382897, 1867020, 1118280, 4231018, 4137796, 7910679, 2586674, 548474, 874214, 1540074, 2745150, 5277369, 2237022, 3344833, 7052207, 326710, 2480515, 722184, 5767772, 5168737, 3324536, 12821, 4957194, 4834300, 4014352, 4501285, 75132, 8018132, 2867515, 4804863, 926485, 1668696, 639264, 489364, 7879818, 2997944, 1367662, 3446404, 1591885, 5232686, 2220198, 5176056, 6119492, 1367197, 4969204, 1436059, 6109850, 1220567, 1784920, 1539931, 2862903, 2655592, 189569, 6496119, 1241404, 6963193, 6551654, 3348318, 710729, 8074871, 93088, 431339, 5012392, 5339554, 625423, 4110891, 7810275, 4743227, 1752585, 3730869, 8353738, 8115852, 7386898, 8208666, 7232485, 4735746, 6911756, 5575841, 4333832, 4951329, 3760158, 2212068, 5539626, 6851793, 6802718, 5203133, 3032879, 351023, 3559477, 5366969, 4392425, 4355124, 2422406, 6779715, 5671690, 2066711, 3513648, 4606881, 4813386, 6517851, 7203611, 248962, 3406301, 6310370, 4742685, 6655172, 6198776, 7116196, 4387680, 1858149, 2358787, 1618811, 7717316, 780150, 2992123, 7631157, 3569122, 3907958, 7918406, 5410206, 2157765, 7038437, 1747757, 1527560, 2780782, 571497, 1369836], -[7996233, 8041750, 4344739, 7225364, 3577292, 3092452, 4408414, 3088128, 1483115, 3303674, 747912, 493701, 2484152, 3084643, 692941, 6815903, 2741903, 7591204, 2427207, 4313499, 6373246, 3698900, 7515747, 3354152, 6343110, 4821616, 4834556, 4395010, 619184, 3243961, 2875977, 4571724, 6101133, 1279232, 6501881, 6420720, 4091631, 4253255, 5343401, 7784801, 4779604, 7428256, 3070771, 2484172, 6509422, 3063683, 1297938, 3498108, 830473, 1270188, 7450979, 4578912, 858404, 6189970, 4398023, 7346824, 966978, 7060773, 4580606, 2155702, 8310141, 7189239, 7906766, 8307117, 3757837, 5540918, 739884, 5837061, 1743229, 6425755, 855096, 2781999, 295478, 4327361, 1685855, 1389067, 7857270, 7471785, 5382652, 3965192, 1259473, 1046935, 6466117, 3856855, 1208756, 3914099, 4356731, 1724220, 7301307, 3025982, 4274887, 5915847, 353210, 2549739, 2703727, 5530995, 4225069, 2713792, 869512, 2636671, 3931002, 6283862, 353186, 6893975, 7763337, 180462, 3478074, 1809491, 3263441, 5801826, 5198978, 7213138, 6205396, 4814923, 592775, 3997327, 5760141, 3694684, 2291749, 6606126, 6458268, 589861, 6476843, 3798943, 3074181, 7410757, 4214580, 820994, 3939137, 6761719, 1708000, 2594224, 4739827, 287918, 2414980, 2776943, 146116, 5716893, 4647003, 7047385, 4836924, 4108770, 5101373, 7720485, 6228210, 4209616, 6386721, 7797853, 7309310, 7526139, 5636573, 4964961, 4523426, 6298551, 154756, 7590936, 7102067, 4116488, 1387748, 6088797, 6497280, 5001047, 5015832, 5038053, 83579, 7252682, 1336557, 3714421, 5688166, 335652, 2551434, 6393124, 2735701, 2946667, 6245446, 6603973, 6710597, 4460719, 5486170, 132104, 2753643, 3406272, 4379116, 5532133, 4071929, 8122231, 7408593, 7153939, 6760301, 1783348, 1118910, 5057638, 5901770, 5348822, 8355526, 5961567, 4450814, 2749183, 4860444, 1365909, 3711430, 6843662, 5931597, 7260669, 1984402, 3035929, 5692960, 6351530, 8311971, 6953221, 3697473, 3769328, 5063944, 1358794, 7284336, 4005237, 8018046, 4500062, 7885605, 4912240, 7732545, 1511642, 7177288, 2011807, 4879331, 2758898, 6311214, 3985346, 8312431, 576083, 1811194, 2495207, 7120859, 1235898, 3614190, 2491057, 4641419, 2575179, 1085227, 4005839, 707228, 4622057, 6586148, 709127, 8001420, 7517935, 5225831, 3358016, 5758373, 899717, 5362925, 2909751, 6730688, 4609942, 3670761, 3805830]] -w = NTTInverse(aHat * NTT(y)): [[2914167, 7412710, 2516425, 5105571, 7653783, 5981531, 4720398, 5955779, 1632128, 3840053, 373831, 324036, 157512, 5578275, 7626230, 6579438, 5943553, 1170107, 1441779, 7269464, 3183179, 3574906, 3259883, 6086023, 1700055, 1942326, 8232690, 2896121, 6640707, 8161679, 3981478, 7852625, 8211569, 6743609, 3144731, 2071760, 5817433, 2527603, 2737149, 3548727, 1551088, 3456340, 534070, 4838785, 1963603, 8041274, 1068901, 1858667, 247192, 3924202, 373543, 5504466, 4485326, 1030581, 7125755, 6402242, 2527137, 7093859, 1474778, 6850523, 7934427, 2951053, 7242525, 2127112, 4789995, 1125680, 5355564, 829814, 5989152, 6965957, 5418497, 2454949, 4162481, 3533497, 6436173, 2120982, 399220, 5635447, 7148398, 5555980, 7306578, 2221290, 853887, 6163597, 6722104, 922798, 8179041, 565681, 7938467, 5187911, 3267885, 5535546, 4975445, 1447127, 3004757, 6855982, 7415057, 3502053, 826857, 5290859, 135584, 4334497, 6682018, 7568569, 3201825, 411330, 2067326, 2319054, 3125636, 5363770, 6122634, 1364271, 3076517, 4361845, 2150695, 3002902, 4974636, 156527, 1893824, 7168514, 6231279, 3706706, 3309057, 51484, 3755217, 1949025, 7920037, 3921138, 4720567, 5153154, 4164629, 4923096, 7040477, 5963637, 7188229, 5175240, 3917880, 2250351, 1627834, 2231045, 1290471, 728365, 2163955, 7716835, 6971971, 770738, 7785303, 2669491, 6971638, 714250, 673426, 2813389, 7222281, 2339984, 8224998, 1119976, 1283003, 5695544, 2553923, 83431, 7847940, 6065108, 6256129, 7102546, 5878002, 5980630, 3731596, 5657340, 4311498, 7426206, 2170348, 4503339, 4770566, 536216, 8317875, 3281052, 1430660, 6648496, 6784083, 3450666, 7065877, 643171, 6479721, 5920022, 5945975, 1036452, 5288663, 371311, 4900447, 3882412, 1398523, 6210154, 5781818, 5475239, 8073881, 5900808, 4370773, 3977402, 5754706, 4377952, 4819061, 6556576, 3578911, 873369, 3211315, 4636676, 6048813, 4121618, 1558561, 5777254, 7094946, 6674304, 7706422, 345284, 6332340, 6593524, 6147601, 4599304, 858498, 4931335, 6789890, 7678258, 6326718, 6340837, 6742375, 7621580, 5507587, 1055211, 5756440, 493306, 672063, 490753, 5368326, 6329957, 1818349, 407554, 4603551, 5414927, 2967857, 4476888, 7701170, 7856747, 1014362, 5622866, 5420390, 7405500, 5251110, 578247, 3253807, 2063851, 6905173, 1789719, 52263, 3954017, 1248277, 7981534], -[1872125, 6629093, 4899459, 5998232, 4122790, 941821, 7072293, 2640509, 7001782, 4479871, 2245278, 3892444, 2067122, 7903467, 5220193, 8124481, 6002226, 1019501, 5791699, 3102237, 5140989, 1471598, 3463235, 3954596, 3291550, 3430733, 7431003, 4112773, 3995632, 6364454, 1208018, 6810156, 4189218, 193305, 4448834, 5328808, 5671287, 5305871, 5616358, 8343469, 2436041, 6752451, 5639669, 5066176, 1361335, 1348223, 8250853, 2354159, 5963274, 6367751, 794440, 1311912, 7824289, 7051879, 6960063, 4325188, 4482857, 603685, 1816255, 7927179, 5734430, 4822867, 3618495, 165495, 5864273, 2999073, 5771140, 5170658, 2831908, 4583269, 7355354, 2177792, 8304412, 5584197, 4855449, 4246459, 4175971, 3202080, 6584535, 1292064, 365391, 767848, 5945858, 6870235, 6840782, 128664, 4575559, 1053894, 2715647, 7547105, 4197381, 126285, 4776797, 841580, 1761983, 3528173, 6291449, 8029728, 6005935, 6793949, 4141493, 3097535, 2103612, 1625441, 2874354, 5675978, 1145647, 8220244, 3614836, 6125768, 3452624, 8368240, 8016818, 3179482, 3091188, 1729983, 2284446, 2655906, 3801854, 1340317, 7492879, 2877122, 6122064, 1287404, 491524, 5065916, 1133123, 4225696, 2271076, 3128089, 2967251, 4914286, 2857926, 1621077, 4950472, 5976098, 6492766, 2138434, 2805043, 4923920, 5575033, 2962057, 6902190, 3575933, 341115, 6549494, 1677536, 4999709, 5993783, 626400, 7110926, 7709924, 6781687, 668329, 4218694, 4179384, 3906642, 3980381, 5744057, 7395601, 7557152, 848832, 5342271, 8339532, 1180057, 4290447, 2941095, 2943845, 1643877, 5820047, 1708149, 2075961, 106195, 4276388, 182822, 3230275, 1742298, 5543776, 7458012, 2929031, 1763778, 502921, 3731686, 5216335, 4213495, 3085058, 1939164, 7064209, 5423268, 7529396, 1933958, 4520321, 5397721, 3555309, 3274959, 730055, 8051031, 621093, 5335054, 1033096, 4933856, 3934047, 2519362, 1925500, 5936786, 4417163, 8320567, 6719907, 6671985, 1636443, 5804396, 2521380, 5644819, 5573374, 5865855, 5117781, 7788181, 3886943, 1856027, 7612607, 1866291, 2971246, 5455808, 927064, 2334341, 2314587, 943460, 2586035, 8078755, 2447794, 7532802, 377623, 661423, 6954274, 1978093, 5947575, 2966266, 6986507, 5684694, 5080857, 4194193, 6607653, 5443465, 5074496, 7659104, 2387213, 3131355, 1375856, 728353, 6981277, 7055232, 1544236, 6328529, 5603102, 4222526, 5846379], -[3265950, 2428271, 5435746, 7952416, 3470762, 5206195, 6998949, 6636840, 7342615, 2976694, 6426753, 3610797, 421980, 8221951, 5380600, 1512229, 3040553, 6349936, 6395355, 6220837, 2757509, 6758178, 4230512, 1190559, 2514389, 7328809, 4437720, 458062, 8333856, 2223507, 6923949, 2589391, 1162558, 5855103, 5251923, 6681911, 99181, 837789, 459003, 6840879, 5797147, 3484063, 2548263, 2746221, 6514743, 6643156, 7049988, 5064815, 6977044, 472606, 5280213, 2043395, 3787449, 3245150, 4862572, 3388109, 1324801, 2386755, 5944272, 7249288, 6325758, 1552147, 2456520, 4593222, 1463411, 544903, 4999167, 8069770, 8123843, 5259499, 8089695, 4434282, 3185191, 1933149, 5157309, 7581279, 2456412, 4739720, 192620, 3767104, 6726512, 2306029, 3670708, 2097057, 5706647, 6788362, 6077269, 4668665, 931360, 6891193, 1324328, 5886980, 7918104, 7858364, 7439518, 5660501, 2353663, 122963, 1196156, 8112257, 8187728, 6874716, 1518928, 7488167, 5712681, 1350083, 4048779, 3806236, 7493399, 7257688, 230910, 689037, 5738346, 4343720, 6655329, 7147720, 7668966, 6229581, 4165311, 5104728, 2645282, 3799451, 4230576, 6102079, 7993009, 6775012, 6177975, 5300977, 2481459, 2318396, 7497020, 3936785, 2453450, 162369, 3321127, 1491027, 7537011, 1917051, 7301219, 393527, 3317193, 6679552, 3612259, 5157603, 1603012, 8296179, 6487752, 2802907, 2319101, 1017819, 7483611, 1625485, 6010859, 1718279, 4137357, 5281251, 3794082, 5401533, 1199597, 28335, 5434361, 2726795, 3473857, 1141385, 1412799, 1299408, 2695925, 6422865, 6208794, 52656, 7756815, 6881804, 5842014, 8178668, 2299506, 2295804, 3005245, 6638054, 5574469, 5508377, 334795, 8357183, 8081740, 2156490, 2363210, 467708, 4061886, 1481707, 915500, 3108783, 7370033, 7898635, 1956030, 5503070, 7357147, 2736467, 8109245, 2601263, 7319010, 5537699, 969499, 2068676, 2010257, 7561854, 348943, 2686229, 4522970, 4799273, 7325484, 7112770, 2714850, 4678994, 2308114, 499130, 7780931, 4975077, 632254, 1791711, 1909045, 8131706, 7213296, 190862, 642740, 1067491, 5934076, 2215984, 6929923, 6970756, 3423286, 1115308, 4241846, 662427, 2013631, 7392806, 5165207, 5938919, 7583581, 6368301, 5078956, 2616819, 5460315, 5654686, 7861394, 3037140, 6389981, 1951859, 5170493, 6064378, 5666675, 6439843, 4806371, 3404417, 4712186, 5577025, 5394764, 1000078], -[6744811, 1875863, 3922689, 8286082, 2237596, 4147669, 4253272, 5487113, 5598453, 882780, 4500653, 1571044, 3539965, 8170446, 2203705, 2040110, 5664230, 477347, 8127165, 2288234, 5842064, 4127289, 7087384, 3902945, 3107861, 7785651, 883886, 2196183, 228912, 2003025, 767505, 7718544, 7029144, 4325383, 705131, 4578329, 2318555, 8322777, 8088602, 6783743, 5833374, 6590968, 360121, 8283228, 6243395, 1600272, 8299328, 1324592, 1413507, 2404809, 8214110, 1656507, 8063993, 7709600, 8366850, 5824711, 2620363, 6381021, 5281451, 7225076, 8165941, 7777236, 3226702, 2220702, 2375808, 8019808, 7676152, 3679214, 3513873, 3276419, 7009446, 6109842, 4926785, 5590826, 2110497, 4163592, 3342281, 5167017, 522569, 5602220, 8080357, 1504247, 1141198, 5246630, 5781555, 5161657, 634362, 2563104, 4243169, 3286596, 5453327, 1315307, 6004808, 5219325, 1179153, 95575, 1272056, 5143270, 1587457, 2110360, 7730719, 3551538, 5774111, 3481782, 5185520, 1136328, 4657281, 5028364, 3654624, 1179456, 1448510, 5919486, 2288930, 5444469, 6001978, 3876094, 2664392, 4134241, 3968351, 4506438, 5616566, 440734, 233102, 4162655, 1797434, 4801311, 7929903, 2180918, 1304887, 1432741, 3310889, 1682671, 4419298, 795160, 8005534, 1788040, 284129, 7016493, 7562716, 7486261, 7967539, 866012, 544246, 3784311, 3928479, 6061914, 8334101, 562636, 1692844, 5147680, 3851686, 6417900, 4300783, 4921390, 1709386, 7946288, 7733376, 7386796, 4036248, 5504228, 6722421, 3577671, 880721, 4608668, 6468146, 98830, 6619228, 7868216, 6940383, 7649326, 7743123, 7367549, 3333651, 1291205, 1615863, 2768003, 1655221, 1876293, 2412779, 8015934, 7007262, 5692226, 6760812, 6619700, 7219713, 334870, 3073922, 2714341, 1904313, 2495406, 4926270, 4188706, 5638094, 1293897, 923172, 1323720, 5177791, 743192, 274013, 4710570, 520274, 6474184, 4544243, 1347083, 4155561, 5676384, 6469319, 1950678, 4962887, 1126696, 6731045, 1260689, 311721, 7240342, 2131064, 7998177, 6552644, 7515088, 5363676, 1721860, 797027, 5956830, 3800360, 2081817, 1395335, 6482577, 5426750, 3741601, 3172917, 2613621, 6550694, 5491038, 5625756, 2124641, 4885272, 2345482, 7078866, 5865680, 5807578, 2608541, 1967522, 726347, 862044, 2006118, 902570, 8373123, 253388, 77421, 43995, 7817315, 497317, 2277168, 3873647, 2795719, 2873204, 2321696]] - -w1: [[15, 39, 13, 27, 40, 31, 25, 31, 9, 20, 2, 2, 1, 29, 40, 35, 31, 6, 8, 38, 17, 19, 17, 32, 9, 10, 43, 15, 35, 43, 21, 41, 43, 35, 17, 11, 31, 13, 14, 19, 8, 18, 3, 25, 10, 42, 6, 10, 1, 21, 2, 29, 24, 5, 37, 34, 13, 37, 8, 36, 42, 15, 38, 11, 25, 6, 28, 4, 31, 37, 28, 13, 22, 19, 34, 11, 2, 30, 38, 29, 38, 12, 4, 32, 35, 5, 43, 3, 42, 27, 17, 29, 26, 8, 16, 36, 39, 18, 4, 28, 1, 23, 35, 40, 17, 2, 11, 12, 16, 28, 32, 7, 16, 23, 11, 16, 26, 1, 10, 38, 33, 19, 17, 0, 20, 10, 42, 21, 25, 27, 22, 26, 37, 31, 38, 27, 21, 12, 9, 12, 7, 4, 11, 41, 37, 4, 41, 14, 37, 4, 4, 15, 38, 12, 43, 6, 7, 30, 13, 0, 41, 32, 33, 37, 31, 31, 20, 30, 23, 39, 11, 24, 25, 3, 0, 17, 8, 35, 36, 18, 37, 3, 34, 31, 31, 5, 28, 2, 26, 20, 7, 33, 30, 29, 42, 31, 23, 21, 30, 23, 25, 34, 19, 5, 17, 24, 32, 22, 8, 30, 37, 35, 40, 2, 33, 35, 32, 24, 5, 26, 36, 40, 33, 33, 35, 40, 29, 6, 30, 3, 4, 3, 28, 33, 10, 2, 24, 28, 16, 24, 40, 41, 5, 30, 28, 39, 28, 3, 17, 11, 36, 9, 0, 21, 7, 42], -[10, 35, 26, 31, 22, 5, 37, 14, 37, 24, 12, 20, 11, 41, 27, 43, 32, 5, 30, 16, 27, 8, 18, 21, 17, 18, 39, 22, 21, 33, 6, 36, 22, 1, 23, 28, 30, 28, 29, 0, 13, 35, 30, 27, 7, 7, 43, 12, 31, 33, 4, 7, 41, 37, 37, 23, 24, 3, 10, 42, 30, 25, 19, 1, 31, 16, 30, 27, 15, 24, 39, 11, 0, 29, 25, 22, 22, 17, 35, 7, 2, 4, 31, 36, 36, 1, 24, 6, 14, 40, 22, 1, 25, 4, 9, 19, 33, 42, 32, 36, 22, 16, 11, 9, 15, 30, 6, 43, 19, 32, 18, 0, 42, 17, 16, 9, 12, 14, 20, 7, 39, 15, 32, 7, 3, 27, 6, 22, 12, 16, 16, 26, 15, 9, 26, 31, 34, 11, 15, 26, 29, 16, 36, 19, 2, 34, 9, 26, 31, 3, 37, 40, 36, 4, 22, 22, 21, 21, 30, 39, 40, 4, 28, 0, 6, 23, 15, 15, 9, 31, 9, 11, 1, 22, 1, 17, 9, 29, 39, 15, 9, 3, 20, 27, 22, 16, 10, 37, 28, 40, 10, 24, 28, 19, 17, 4, 42, 3, 28, 5, 26, 21, 13, 10, 31, 23, 0, 35, 35, 9, 30, 13, 30, 29, 31, 27, 41, 20, 10, 40, 10, 16, 29, 5, 12, 12, 5, 14, 42, 13, 40, 2, 3, 37, 10, 31, 16, 37, 30, 27, 22, 35, 29, 27, 40, 13, 16, 7, 4, 37, 37, 8, 33, 29, 22, 31], -[17, 13, 29, 42, 18, 27, 37, 35, 39, 16, 34, 19, 2, 43, 28, 8, 16, 33, 34, 33, 14, 35, 22, 6, 13, 38, 23, 2, 0, 12, 36, 14, 6, 31, 28, 35, 1, 4, 2, 36, 30, 18, 13, 14, 34, 35, 37, 27, 37, 2, 28, 11, 20, 17, 26, 18, 7, 13, 31, 38, 33, 8, 13, 24, 8, 3, 26, 42, 43, 28, 42, 23, 17, 10, 27, 40, 13, 25, 1, 20, 35, 12, 19, 11, 30, 36, 32, 25, 5, 36, 7, 31, 42, 41, 39, 30, 12, 1, 6, 43, 43, 36, 8, 39, 30, 7, 21, 20, 39, 38, 1, 4, 30, 23, 35, 38, 40, 33, 22, 27, 14, 20, 22, 32, 42, 36, 32, 28, 13, 12, 39, 21, 13, 1, 17, 8, 40, 10, 38, 2, 17, 35, 19, 27, 8, 0, 34, 15, 12, 5, 39, 9, 32, 9, 22, 28, 20, 28, 6, 0, 29, 14, 18, 6, 7, 7, 14, 34, 33, 0, 41, 36, 31, 43, 12, 12, 16, 35, 29, 29, 2, 0, 42, 11, 12, 2, 21, 8, 5, 16, 39, 41, 10, 29, 39, 14, 43, 14, 38, 29, 5, 11, 11, 40, 2, 14, 24, 25, 38, 37, 14, 25, 12, 3, 41, 26, 3, 9, 10, 43, 38, 1, 3, 6, 31, 12, 36, 37, 18, 6, 22, 3, 11, 39, 27, 31, 40, 33, 27, 14, 29, 30, 41, 16, 34, 10, 27, 32, 30, 34, 25, 18, 25, 29, 28, 5], -[35, 10, 21, 0, 12, 22, 22, 29, 29, 5, 24, 8, 19, 43, 12, 11, 30, 3, 43, 12, 31, 22, 37, 20, 16, 41, 5, 12, 1, 11, 4, 41, 37, 23, 4, 24, 12, 0, 42, 36, 31, 35, 2, 43, 33, 8, 0, 7, 7, 13, 43, 9, 42, 40, 0, 31, 14, 34, 28, 38, 43, 41, 17, 12, 12, 42, 40, 19, 18, 17, 37, 32, 26, 29, 11, 22, 18, 27, 3, 29, 42, 8, 6, 28, 30, 27, 3, 13, 22, 17, 29, 7, 32, 27, 6, 1, 7, 27, 8, 11, 41, 19, 30, 18, 27, 6, 24, 26, 19, 6, 8, 31, 12, 29, 32, 20, 14, 22, 21, 24, 29, 2, 1, 22, 9, 25, 42, 11, 7, 8, 17, 9, 23, 4, 42, 9, 1, 37, 40, 39, 42, 5, 3, 20, 21, 32, 0, 3, 9, 27, 20, 34, 23, 26, 9, 42, 41, 39, 21, 29, 35, 19, 5, 24, 34, 1, 35, 41, 36, 40, 41, 39, 18, 7, 8, 15, 9, 10, 13, 42, 37, 30, 35, 35, 38, 2, 16, 14, 10, 13, 26, 22, 30, 7, 5, 7, 27, 4, 1, 25, 3, 34, 24, 7, 22, 30, 34, 10, 26, 6, 35, 7, 2, 38, 11, 42, 34, 39, 28, 9, 4, 31, 20, 11, 7, 34, 28, 20, 17, 14, 34, 29, 30, 11, 26, 12, 37, 31, 30, 14, 10, 4, 5, 11, 5, 0, 1, 0, 0, 41, 3, 12, 20, 15, 15, 12]] -w1Encode: CFD96CE8977D09250841878E9F8198D1148189B23EE35AA5EB182D5FE34C8834648A6A2841257458518A4D8990EA632E99C1115FC935D6242E82677626438063B10EEA16751A0291A74470C135A291B03010071ED0B5405AA098E1140194A256D96669E5676E15933007B1A425913A25413C26B31A87D700291896DF4779D7B960D90044C8484AE5207E5FC1091A75845EA77E57E55D99381511065A88578EA8108E205668241A8623DA19DE400C5CA808180761685A78DCC90DD142264075A8CAA87D56513A25C6504BBAAD60E1411B225591745A5568905670711ED701CDE86DC7B1325F481C69595ED8A0A85E36051FE46D0F762E40975956341E02F1916480190E6A0519914CA10A9216B4248F67AC1328016A04258C431DE7031EC366580C04694FA27DE2F2681D444E829868DF50A224615955E59D28C101C6F53CC9972C81154449773EC9406D16A4941CAA60DC1411EAC0155AD528DF058C63E2355EF76D29A5A00AD4150C53386A830A43A97C50E96DD6D86D68031D44592261677D51D3A9D2568E27244EC2CA21502886CE68198D790900433AC6C78D0121909ED438E2586EA5C02D54A44947F39921D260C8A0A92BA75E91B2A14D165023332D1E096605797C6A7A7A4C60AC2B899CDE5151A71910DE359A68686D0E65812A09720D73564D1021A8620AD1386D08203E4C71266062711467009D2319C7E188219092DFCA30D0D87502A02E8C50210574A64A773AAB6376C5B2A082836566E964CC906A43A2AC6630181F439692610DCBB97D68B8399D9742A2B2819E984959C715A352018C65755D8121D3CA2CDEB0329F5552505A30C142A4E545600CA092DF28AC21021C47B3262A0A7C8EC8996B1A318C8A4E5254825AB758D236742A6270DE363456D41DE06604C7862CE9E4499B816993817C4C07528E55619D105849A62E07122517A12641899E6A315015080CC946899796A8E95975E354606230A6249A9ED2813C89D2A8A5378EA600394AA359DE511C1B116483881D96272A9A311E82B9A8E2C925C4472D87C851912376DEA231E5E7390A512C051000403A30D4F330 - -cTilde: 809AE94EE60181B39FF0495A0F2D956F90BF26840547C60DC054F343C3EC669F -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [-1, 1, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] -cHat: [5151879, 3761338, 141333, 6782963, 5719991, 5067911, 7109550, 1122805, 4607435, 2431174, 7933133, 4683687, 1075479, 7833426, 7487302, 3905555, 5828401, 1263737, 5038397, 4223207, 2978095, 7294102, 5660061, 5343746, 2154592, 483674, 6251767, 3473426, 5624496, 7264532, 7810266, 5243322, 5930385, 372090, 4012389, 6217832, 6172529, 5875277, 4642794, 6033621, 1246184, 6302483, 146863, 52657, 6542880, 1828932, 50954, 4516993, 3769929, 524248, 547349, 1422545, 6748682, 3839052, 1244701, 8061585, 5633126, 6150571, 7795478, 7559755, 8044968, 420930, 4436955, 8038595, 4175971, 402538, 6640334, 7482029, 2553781, 4237889, 8325486, 6824395, 3019358, 5670974, 7788320, 2052085, 121880, 6758884, 5587932, 1102999, 5948652, 2061167, 1786694, 2371275, 7356729, 2763648, 7804238, 2411560, 6431423, 1285315, 2461946, 4803362, 6130134, 7217111, 4952986, 5816718, 1058829, 742554, 146346, 4742833, 1586091, 3461282, 1674230, 2302260, 5012843, 6618174, 4883875, 4820287, 8053875, 3516899, 1990516, 5326209, 96414, 5898486, 5387046, 1725058, 7358341, 4475679, 5048725, 4459217, 7349154, 6867950, 1103818, 7788216, 7501570, 3691593, 5378926, 2138588, 6876200, 4206879, 5245966, 2458077, 2523124, 1458756, 2423534, 6753368, 3889324, 1727789, 4891145, 5441445, 4559799, 210266, 1684704, 4459090, 1105230, 7286980, 1943285, 8137912, 6117361, 875916, 244290, 6825902, 4882028, 5395479, 2668985, 1834973, 2832483, 8006307, 5065115, 5557315, 8264739, 8025322, 5402011, 3279853, 553392, 3225843, 6841055, 2974222, 1609205, 1926853, 2920403, 6733409, 4627278, 6308403, 6550447, 5947500, 33181, 6762441, 1398345, 2293050, 3112508, 924101, 1099686, 2018114, 4070336, 6640640, 1916240, 7113591, 1693625, 8063507, 2464182, 7410354, 5485110, 2999371, 2307771, 806328, 7305849, 3295383, 7871339, 4792789, 7803459, 4998639, 4565504, 2011426, 5164811, 7517703, 1825839, 5024361, 7596117, 7801562, 5757998, 923360, 5226167, 4889898, 7226090, 3302021, 5377995, 2905347, 6640984, 3379973, 1889970, 2765963, 619451, 2293834, 5236524, 3188114, 6643915, 1169963, 1958794, 1770200, 4881923, 2427308, 5962530, 3420322, 2203688, 7978241, 2587458, 566912, 3431863, 1212668, 3126517, 67558, 2058146, 4223270, 4249382, 3951962, 5458075, 1639706, 2733423, 6808014, 1810578, 2872028, 1612798, 5916502, 1855305, 6016347] -cs1: [[0, 2, 8, 8, 4, 8380408, 7, 8380413, 8380397, 8, 8380412, 8380416, 8380411, 8380414, 8380401, 12, 2, 12, 8, 8380414, 8380414, 8380408, 8380402, 8380406, 8380415, 15, 8380400, 8, 7, 8380415, 8380404, 7, 8380409, 8380413, 8380415, 8380416, 2, 8380415, 8380393, 12, 3, 8380409, 17, 17, 18, 7, 6, 1, 8380405, 8380400, 1, 5, 1, 4, 8380410, 9, 8380415, 1, 8380407, 8380413, 8380407, 10, 8380406, 8380412, 8380414, 4, 13, 0, 7, 11, 8380411, 8380407, 8380411, 8380415, 8380404, 8380413, 8380415, 24, 7, 22, 3, 8380402, 8380413, 8380407, 0, 6, 8380409, 8380415, 8380414, 8380410, 6, 5, 9, 8380408, 8380415, 8380416, 0, 8380402, 4, 4, 8380415, 5, 13, 1, 1, 9, 6, 6, 8380390, 2, 2, 8380415, 9, 5, 6, 8380410, 1, 5, 3, 3, 2, 8380415, 8380405, 4, 0, 13, 10, 7, 13, 8380397, 8380414, 4, 5, 8380408, 0, 8380402, 8380413, 8380405, 8380392, 8380415, 6, 8380406, 8, 0, 1, 8380412, 0, 10, 3, 12, 4, 15, 8380414, 0, 1, 8, 8380407, 7, 10, 8380407, 8380407, 8380411, 8380411, 5, 22, 5, 9, 4, 19, 8380416, 8380402, 8380401, 12, 8380408, 8380413, 12, 2, 2, 11, 1, 13, 4, 8380413, 8380410, 11, 4, 0, 8380410, 8380415, 1, 0, 14, 10, 1, 8380407, 8380412, 8380404, 1, 8380412, 3, 8380415, 8, 2, 2, 2, 8380413, 3, 14, 8380416, 12, 8380406, 8380403, 8380410, 2, 8380412, 11, 2, 8380406, 10, 8380402, 8380414, 8380407, 8380408, 8380405, 9, 3, 2, 16, 8380416, 15, 11, 13, 0, 4, 2, 8380409, 4, 8380409, 8380410, 8380406, 8380414, 8380402, 25, 2, 8380416, 8, 8380399, 8380409, 4, 8380413, 4, 11, 11, 5, 6, 8380409], -[8380408, 8380405, 8380415, 8380412, 8380402, 8380404, 15, 15, 14, 1, 1, 2, 11, 1, 10, 8380413, 8380408, 8380410, 8380403, 8380402, 1, 1, 8380415, 8380416, 16, 8380413, 1, 8380411, 14, 8380411, 7, 12, 8, 8380407, 6, 7, 8380410, 8380415, 8380411, 8380407, 12, 2, 8, 8380408, 11, 8380415, 4, 15, 15, 13, 2, 8380412, 0, 8380411, 8380401, 6, 0, 7, 8380406, 5, 3, 0, 2, 0, 3, 8380415, 9, 8380410, 4, 1, 13, 8380403, 8380416, 7, 12, 5, 6, 6, 1, 8380404, 8380414, 8380413, 1, 8380408, 17, 8380415, 6, 9, 3, 8380416, 16, 8380413, 5, 1, 3, 10, 8380416, 3, 2, 8380399, 4, 8380393, 4, 8380401, 8380401, 8380412, 0, 4, 0, 0, 15, 5, 8, 1, 28, 13, 9, 3, 8380412, 8380399, 10, 8380402, 6, 8380404, 8380415, 3, 8380413, 8, 3, 8380412, 6, 8380414, 8380416, 8380415, 2, 8380406, 8, 3, 8, 8380405, 8380416, 8380414, 10, 1, 8380415, 11, 8380406, 5, 8380411, 8380410, 0, 7, 0, 8380412, 8380416, 2, 8380411, 5, 8380407, 5, 6, 8380414, 6, 5, 8380410, 2, 8380416, 8380406, 8380407, 8, 11, 8380416, 11, 11, 8380405, 5, 8380415, 3, 8380416, 7, 8380409, 3, 8380416, 1, 8380410, 8380405, 16, 2, 8380411, 8380415, 8380410, 8380416, 8380415, 14, 12, 5, 1, 24, 8380404, 4, 8380406, 8380400, 8380400, 7, 8380394, 6, 2, 8380416, 8380405, 7, 8380412, 9, 8380398, 17, 0, 8380416, 8380400, 7, 8380413, 0, 8380414, 8380416, 8380407, 0, 0, 8380412, 8380407, 6, 8380407, 11, 8380416, 8380410, 8380404, 8, 8380412, 15, 5, 8380410, 3, 8380410, 8380411, 3, 8380391, 8380413, 8380415, 10, 8380408, 8380416, 8380400, 2, 3, 8380416, 8380405, 6, 12, 8380414], -[8380410, 16, 8380407, 2, 3, 9, 2, 8380414, 5, 4, 8380402, 8380404, 8380414, 5, 8380406, 6, 8380391, 7, 0, 14, 8380414, 15, 0, 12, 8380406, 8380413, 6, 8380412, 8380408, 4, 3, 8380416, 8380398, 14, 8380416, 4, 8380406, 2, 0, 11, 8380400, 4, 4, 8380407, 13, 9, 8, 8380409, 0, 5, 8380410, 8, 8380409, 9, 8380411, 1, 8380412, 17, 8380409, 10, 6, 8380412, 8380404, 8380416, 8380393, 10, 2, 8380412, 8380410, 8380412, 8380404, 19, 1, 8380412, 8380415, 5, 8380395, 8380413, 8380416, 3, 2, 0, 8380407, 7, 9, 5, 7, 8380408, 8380413, 3, 11, 8380409, 8380405, 12, 8380416, 8380402, 2, 6, 1, 8380410, 8380409, 10, 8380415, 4, 8380411, 9, 4, 4, 8380410, 2, 8380413, 5, 3, 8380415, 6, 8380409, 8380410, 8380416, 15, 8380411, 8380411, 6, 8380409, 4, 12, 13, 8380406, 1, 8380402, 8380409, 9, 8380414, 8380416, 9, 8380414, 8380416, 8380415, 8380405, 9, 8380416, 8380403, 11, 8380416, 0, 8380396, 14, 8380415, 5, 9, 4, 8380402, 10, 8380415, 0, 0, 2, 10, 8380413, 8380411, 4, 8380412, 8380414, 5, 8380410, 4, 3, 8380403, 8380410, 8, 3, 7, 1, 8380407, 0, 8380415, 8, 1, 1, 0, 8380410, 8380416, 6, 8380413, 2, 0, 3, 7, 7, 1, 4, 8380408, 18, 8380408, 12, 8380415, 8380406, 8380415, 8, 8380405, 0, 1, 8380408, 4, 8380414, 8380411, 8380412, 2, 8380411, 2, 6, 8380414, 8380415, 5, 16, 0, 12, 8380415, 8380415, 8380414, 8380407, 8380408, 2, 5, 8380414, 8380414, 8380400, 13, 10, 8380414, 6, 8380411, 7, 8380412, 8380415, 17, 15, 0, 8, 8380416, 8380393, 4, 8380407, 8380412, 1, 3, 2, 9, 8380407, 8, 1, 3, 8380416, 8380415, 5, 2, 8380409], -[8380413, 8380408, 11, 8380415, 3, 13, 29, 8380407, 7, 8380414, 8380411, 8380410, 3, 8380404, 8380407, 1, 8, 3, 8380411, 8380416, 8380416, 0, 9, 8380414, 2, 23, 16, 8380406, 11, 8380410, 8380409, 8380415, 8380415, 8380416, 0, 0, 8380416, 1, 8380409, 8380410, 8, 8380410, 18, 8380410, 8, 8380413, 8380408, 5, 8380404, 8380407, 8380409, 12, 5, 0, 8380414, 2, 3, 6, 7, 8380415, 10, 13, 8380413, 10, 8380408, 8380408, 10, 8380406, 8380409, 10, 1, 8380401, 8, 8380394, 8380409, 1, 6, 3, 3, 7, 8380409, 0, 8, 8, 17, 21, 0, 7, 17, 8380411, 0, 17, 3, 10, 8380414, 9, 8380392, 8380399, 8380395, 8380416, 8380412, 17, 8380415, 12, 9, 8380416, 3, 8380413, 8380414, 9, 5, 10, 17, 8380403, 8380411, 8, 8380409, 5, 10, 8380403, 9, 8380410, 2, 7, 12, 8380415, 5, 5, 13, 8380412, 8380409, 6, 8380403, 8380413, 8380413, 1, 6, 8380412, 8380415, 26, 8380400, 8380414, 7, 2, 10, 4, 3, 3, 8380409, 8380411, 1, 8380413, 23, 8380413, 0, 5, 8380412, 8380401, 20, 8380407, 8380414, 11, 14, 5, 1, 5, 5, 8380416, 23, 16, 8380410, 8380416, 5, 2, 8380404, 0, 8380408, 9, 8380406, 8380415, 6, 8380403, 8380412, 8380416, 2, 8380411, 8380411, 9, 6, 8380416, 8380413, 12, 12, 8380415, 5, 8380412, 2, 8380411, 11, 8380407, 8380412, 3, 5, 8, 13, 8380411, 16, 8, 8380410, 0, 2, 8380414, 8380414, 11, 8380408, 8380411, 8380401, 8380405, 3, 17, 6, 8380409, 7, 3, 8380409, 16, 0, 2, 8, 12, 8, 12, 8380415, 7, 1, 8380415, 1, 8380406, 0, 8380411, 8380413, 8380414, 7, 8380411, 8380413, 8380415, 8380412, 4, 8380411, 0, 2, 12, 3, 6, 8380416, 0]] -cs2: [[2, 13, 3, 9, 1, 10, 8380410, 8, 8380415, 8380403, 8380405, 2, 1, 1, 8380412, 8380409, 8380415, 2, 2, 7, 8, 6, 8380412, 3, 9, 8380413, 8380407, 8380407, 7, 9, 8380416, 4, 8380406, 8380402, 16, 5, 8380414, 8380413, 8380412, 10, 2, 9, 0, 8380412, 8380416, 2, 7, 22, 8380410, 8380415, 2, 8380402, 10, 16, 8380409, 9, 2, 4, 8380415, 5, 8380409, 8380415, 8380413, 2, 7, 9, 8380416, 8380415, 8380412, 10, 8380416, 18, 8380409, 1, 13, 8380415, 3, 8380409, 8380406, 7, 2, 6, 12, 3, 13, 12, 8380413, 11, 8, 8380406, 8380401, 4, 8380410, 8380411, 0, 1, 8380402, 8380415, 9, 8380414, 9, 8380416, 13, 2, 6, 3, 4, 3, 0, 15, 8, 8380409, 8380403, 8380398, 3, 8380415, 8380414, 18, 8380410, 5, 12, 5, 2, 1, 8380411, 2, 8, 8, 6, 1, 8380404, 8380414, 8380407, 13, 8380413, 4, 5, 6, 6, 8380406, 8380408, 0, 3, 14, 22, 8380409, 8380416, 8380413, 8380413, 7, 6, 8380412, 14, 8380408, 8380412, 13, 8380397, 8380416, 8380412, 9, 8, 8380404, 12, 6, 1, 1, 13, 12, 10, 7, 15, 0, 8380410, 8380411, 4, 8380412, 4, 8380408, 8380416, 8380409, 2, 11, 8380413, 8380413, 21, 2, 11, 1, 8380415, 8380412, 5, 3, 7, 8380412, 0, 8380415, 8380414, 8380400, 8380412, 8380399, 15, 8, 8, 8, 19, 9, 0, 4, 3, 8380404, 8380415, 8380414, 8380413, 8380403, 1, 8380401, 13, 8380411, 8380414, 4, 8380412, 4, 11, 8380410, 8380412, 11, 0, 8380416, 8380416, 11, 8, 8380410, 3, 8380402, 8380413, 8380390, 8380415, 8380406, 7, 8380412, 15, 11, 2, 7, 13, 7, 23, 8380412, 8380413, 8380409, 4, 8380408, 10, 8380414, 10, 8380403], -[8380408, 0, 8380416, 1, 12, 3, 8380399, 13, 1, 12, 8380409, 6, 8380400, 8380413, 8380397, 10, 8380411, 8380413, 10, 7, 8380403, 5, 8380414, 15, 10, 5, 7, 16, 8380402, 8380414, 8380415, 8380413, 8380416, 8380416, 5, 7, 4, 8380415, 13, 8380416, 0, 8380416, 4, 9, 1, 6, 4, 8380411, 8380411, 20, 2, 4, 8380410, 0, 11, 8380400, 8380416, 1, 7, 10, 1, 18, 8380414, 0, 8380411, 10, 2, 7, 8380415, 8380413, 20, 0, 8380403, 8, 3, 5, 8380410, 3, 7, 8380405, 8380407, 6, 7, 2, 16, 8380414, 6, 5, 8380408, 0, 6, 0, 8380409, 15, 1, 10, 8380411, 0, 8380410, 11, 8380403, 8380407, 7, 8380415, 4, 8380409, 2, 3, 1, 8380414, 16, 13, 8380410, 1, 8380414, 8380415, 4, 8380407, 11, 12, 5, 11, 8380410, 8380416, 8380414, 5, 7, 3, 7, 8380416, 1, 8380410, 8380401, 4, 8, 8380408, 8380406, 19, 8380405, 8380404, 4, 8380415, 11, 2, 8380413, 15, 4, 5, 12, 1, 8380415, 8380416, 8380414, 5, 5, 8380394, 11, 8380413, 8380403, 9, 8380413, 2, 1, 10, 8380409, 12, 8380408, 10, 2, 16, 12, 18, 8380410, 0, 1, 8380395, 8380409, 1, 8, 8380409, 6, 8380414, 8380407, 13, 8380401, 9, 2, 4, 2, 15, 5, 8380410, 6, 0, 24, 1, 1, 6, 8380413, 8380412, 2, 0, 8380413, 7, 8380410, 8380413, 4, 8380405, 8380405, 8380414, 8380415, 8380413, 11, 8380406, 8380413, 8380416, 8380409, 7, 12, 8380412, 1, 6, 11, 8380414, 13, 8380412, 3, 8380399, 0, 8380415, 4, 8380402, 9, 8380415, 8380416, 2, 4, 8380410, 8380412, 8380407, 5, 8380416, 8380415, 8380413, 20, 4, 8380416, 1, 8380416, 8, 8380414, 8380414, 8, 8380416, 8380409, 8380411], -[8380411, 2, 8380416, 8380406, 7, 7, 0, 2, 8380410, 1, 0, 16, 9, 8380412, 8380415, 8380413, 18, 0, 7, 10, 8380410, 8380414, 7, 5, 8380411, 7, 8380407, 8380412, 8380416, 5, 8380399, 1, 8380402, 12, 4, 8380415, 8380396, 17, 1, 12, 0, 6, 8380413, 8380415, 8380412, 2, 8380413, 10, 8380403, 11, 8380413, 8380414, 2, 0, 8380407, 10, 8380401, 8380400, 4, 0, 8380416, 11, 8380416, 8380410, 5, 13, 3, 8380407, 8380413, 15, 0, 5, 6, 1, 8, 8380415, 8380414, 8380408, 8380401, 8380412, 8380413, 8380415, 0, 8380404, 2, 8380413, 12, 8380412, 8, 8380404, 5, 1, 21, 2, 8380416, 8380411, 8380408, 8380407, 8380411, 8380408, 8380405, 8380413, 8380416, 8380408, 8380416, 8380407, 8380410, 4, 9, 8380409, 4, 8380413, 8380413, 7, 0, 8380416, 8380407, 8380405, 8380416, 11, 8380409, 8380408, 8380414, 8380397, 8380412, 15, 8380414, 8380415, 3, 3, 0, 8380415, 10, 8380402, 8380404, 8380410, 8380414, 8380410, 2, 8380408, 16, 8380410, 8380402, 8380403, 8, 6, 8380414, 2, 8380415, 15, 8380405, 8380404, 8380414, 8380404, 1, 8380410, 14, 8380407, 8380409, 8380407, 4, 5, 1, 8380413, 8380399, 8380413, 8380412, 6, 8, 8380409, 8380404, 2, 23, 7, 8380414, 8380403, 8380412, 8380411, 8380413, 8380416, 3, 8380410, 8380409, 4, 8380416, 9, 8380415, 8380400, 8380408, 10, 1, 8380414, 1, 8380402, 8380413, 2, 5, 4, 0, 8380405, 8380410, 8380412, 0, 8380405, 0, 8380411, 5, 0, 0, 8380407, 0, 0, 4, 3, 8380403, 8380406, 17, 8380411, 8380409, 8380405, 8380402, 8380407, 8380412, 8380413, 9, 8380405, 10, 8380409, 1, 8380403, 4, 4, 15, 8380411, 4, 10, 8380412, 8380402, 0, 8380405, 6, 8380402, 8, 8380411, 8380416, 8380401, 1, 8380411, 10, 5, 8380412, 8380413, 5, 8380404, 5, 8380411], -[14, 8380407, 8380407, 8380407, 8380404, 8380409, 8380415, 8380416, 8380404, 6, 5, 1, 8380415, 14, 2, 19, 23, 11, 12, 7, 8380407, 10, 8380401, 2, 3, 8380414, 8380404, 8380409, 8380397, 8380412, 0, 3, 8380406, 8380412, 8380410, 0, 8, 7, 1, 8380411, 8380402, 0, 8380405, 16, 8380410, 14, 8380413, 11, 8380409, 8380407, 8380415, 11, 9, 8380415, 5, 8380407, 8380402, 0, 8380393, 10, 8380391, 1, 8380408, 12, 8380410, 12, 8380402, 17, 8380410, 1, 8, 6, 2, 8, 8380406, 8380412, 9, 8, 8380407, 5, 8380408, 4, 0, 8380411, 8380406, 8380414, 8380406, 8380405, 8380411, 14, 8380407, 15, 8380409, 7, 8380413, 4, 8380414, 24, 4, 10, 8380409, 15, 0, 16, 8380414, 3, 8380403, 8380411, 8380401, 2, 8380406, 8380414, 8380390, 6, 7, 2, 8380398, 10, 8380409, 5, 8380412, 8380412, 3, 8380412, 8380416, 8380411, 13, 16, 0, 5, 16, 2, 8380408, 8380412, 5, 5, 8380405, 5, 8380403, 8380409, 8380415, 6, 8380395, 8380411, 8380406, 8380414, 7, 8380411, 8380403, 13, 8, 9, 2, 0, 4, 12, 8380416, 1, 8380413, 8380411, 3, 3, 1, 8380402, 0, 8380411, 8380410, 1, 8380414, 8380398, 8380412, 8380397, 8380416, 11, 11, 8380410, 17, 8380404, 23, 6, 20, 16, 3, 8380402, 2, 8380416, 8380407, 8, 8380411, 8380410, 8380414, 8380396, 8380409, 8380399, 4, 8380412, 8380410, 2, 8380411, 8380405, 5, 6, 18, 15, 3, 1, 12, 8380403, 7, 6, 4, 1, 6, 8, 7, 8380410, 8380414, 8380404, 8380405, 8380413, 10, 8380400, 3, 8380413, 8380409, 8380410, 10, 8380412, 6, 1, 25, 5, 19, 4, 8380412, 8380414, 8380414, 15, 13, 8380408, 6, 8380402, 8380399, 5, 5, 8380391, 6, 5, 6, 8380408, 8380415, 8380393, 5, 2, 5, 6]] -z: [[117652, 8291919, 99237, 103753, 129786, 115302, 112357, 8270039, 28090, 108241, 8371089, 27871, 8268967, 26880, 8274254, 8285256, 3179, 8319068, 99926, 8250950, 102614, 87651, 8361701, 8364437, 51385, 74852, 8268024, 8310235, 30309, 69398, 8347844, 80683, 8375685, 8305512, 8375603, 8271234, 7320, 94510, 8300469, 121539, 8286969, 8372511, 45479, 4221, 8264147, 20940, 8261332, 8315106, 51212, 15181, 94287, 68773, 8297949, 8314855, 8373243, 8259594, 89639, 74687, 127409, 8362693, 78279, 8363729, 8273856, 103930, 79502, 37324, 94859, 8352412, 8368171, 96382, 21545, 8372421, 8256561, 8283628, 8355226, 8320134, 8252946, 8340143, 53, 68948, 8311057, 103347, 60913, 8280073, 8334834, 73668, 8320854, 127675, 8273600, 8362641, 114763, 8316510, 8278155, 8306826, 52603, 8302871, 45466, 103658, 54275, 38679, 6884, 87742, 8312717, 8272348, 96655, 62021, 37114, 8348751, 8257214, 88599, 8290846, 8327397, 8361584, 114167, 92835, 8370560, 8254378, 23357, 18870, 22548, 8308055, 104915, 67398, 93113, 45481, 78543, 84581, 8273458, 106904, 118998, 8255076, 8253304, 65695, 8273878, 8350100, 58141, 125916, 100780, 118895, 26861, 34344, 8373585, 113963, 8334597, 17581, 8264544, 78689, 8362771, 76510, 81629, 8366611, 8313300, 69395, 6280, 36657, 8353677, 8305601, 34920, 85691, 106217, 87880, 32508, 8288288, 19058, 8296204, 19004, 105307, 8369229, 105070, 8360252, 8303224, 8347317, 8351877, 82601, 8308323, 15856, 8279253, 8285023, 114988, 97274, 111910, 6158, 7875, 268, 48093, 8261154, 104302, 4000, 8365493, 8273317, 95207, 8293166, 31972, 8250790, 8256761, 8378207, 8312950, 92248, 8372183, 116563, 8320917, 23560, 8294921, 8282386, 8255962, 122596, 8324605, 8345460, 8348831, 8286939, 108367, 8338537, 8353158, 3519, 8365178, 8367554, 8297252, 44603, 8307216, 8270179, 8327229, 8368381, 8288266, 8371494, 8266467, 8322431, 8366794, 8311685, 8329263, 68427, 8362299, 10979, 109791, 8273780, 32817, 8264372, 44199, 111873, 17042, 13814, 8367505, 8364435, 124721, 8302181, 62560, 8372860, 8329512, 126265, 8272344, 63412, 8335839, 8350986, 25588, 8374169, 8345118, 116400], -[8328881, 7517, 8312348, 8292259, 8326936, 8329435, 8281356, 13881, 8305091, 8335479, 8370301, 8327491, 57784, 103567, 8351542, 76526, 8329204, 59463, 30322, 8322178, 8369769, 8377841, 71616, 8375603, 11113, 8303325, 8252792, 8376178, 8281852, 8267206, 8333784, 82327, 8261883, 8267087, 21214, 90331, 8252159, 8360744, 21922, 8340334, 22796, 8328184, 124474, 84162, 8257262, 8376728, 42304, 120979, 8288471, 52809, 8284185, 52662, 6194, 8271197, 34118, 8314331, 8352938, 8288598, 8287521, 8253561, 8366409, 9143, 15612, 8316649, 8278092, 65619, 8260736, 57856, 16861, 45171, 8341861, 22997, 8259972, 57476, 106572, 104113, 8287347, 8296363, 72280, 45128, 4648, 8265499, 105536, 122412, 125119, 80247, 8335847, 33910, 8263618, 8368916, 105148, 8310334, 118697, 8325251, 8314573, 108295, 102956, 4501, 8351051, 90084, 8331238, 57693, 8343914, 8322352, 8373658, 129164, 15797, 3132, 12499, 14807, 8352924, 87886, 8278799, 8251735, 21528, 118445, 1657, 8374404, 8358680, 60000, 9528, 35522, 45635, 16653, 8376896, 8323879, 111790, 6890, 8341969, 49157, 40867, 111901, 8293417, 31852, 18663, 8380090, 99702, 89968, 9681, 18291, 4649, 97461, 8364739, 8378611, 8377557, 8340127, 8277382, 17187, 9322, 8253789, 8362043, 8271474, 34084, 109561, 8268915, 30217, 8252007, 32389, 64222, 8315770, 8329522, 62035, 8297889, 128102, 8323916, 77431, 32102, 8356646, 8259095, 35951, 118322, 8319184, 8322372, 8322541, 46305, 15550, 8279611, 8278106, 93499, 10678, 78863, 8366817, 8370016, 8345785, 102396, 118954, 8269260, 8288147, 76778, 8334050, 8343858, 8315327, 41129, 8340994, 111969, 109595, 8306547, 8276883, 53532, 8252313, 49506, 8354207, 80888, 8254835, 8308407, 8338316, 8327023, 8270525, 2231, 8355680, 60270, 45185, 92599, 21998, 8338018, 8362339, 68489, 55502, 41257, 8351654, 63045, 8372080, 107252, 8320665, 10172, 15274, 8328361, 67507, 8377124, 107855, 8301828, 107433, 8352612, 8317203, 3683, 8308693, 51553, 41543, 8356072, 8256294, 8283664, 79435, 8378921, 8308251, 8287706, 8361398, 7413, 106046, 8274195, 8335381, 8323142, 28845, 23461, 8367844, 8302539, 8300974], -[110177, 102252, 25916, 8270868, 8354697, 8294410, 8376619, 67888, 8262872, 8353316, 128222, 89824, 89019, 118425, 95917, 16416, 8300917, 8266787, 8366355, 8283849, 56249, 8279837, 8320865, 8284897, 8341999, 8251158, 8294376, 8265655, 8330795, 41087, 8250366, 8259835, 8333030, 33524, 8256720, 8249649, 126806, 32155, 65999, 17990, 29862, 117945, 8359488, 8292906, 41214, 8376707, 8294069, 8256464, 8303563, 51931, 80601, 8326673, 8290844, 8341188, 16359, 116809, 127627, 8319353, 8371924, 24437, 8281447, 111874, 76822, 8285911, 86472, 8347845, 8299359, 8300913, 44550, 8269526, 126609, 8349682, 17923, 16590, 8268735, 8332, 124606, 8339551, 121415, 64047, 8347494, 44462, 8341226, 8321738, 108739, 99094, 124616, 56003, 87354, 75478, 3348, 8256705, 14422, 8320852, 8336516, 8293692, 8317017, 8367396, 8365262, 8347042, 34017, 62237, 8345868, 35625, 8363247, 8301421, 92059, 121862, 8360316, 6413, 121771, 47664, 39036, 8274012, 70802, 8314869, 8337375, 8345239, 77344, 8253824, 29804, 8353907, 33590, 5696, 79644, 8361041, 8282652, 31141, 122913, 116157, 8346210, 8350245, 23362, 8333150, 8326017, 8264682, 8353425, 8373436, 8291063, 27317, 8303348, 129378, 111872, 108544, 8316483, 8302533, 8357942, 8346710, 17996, 96983, 105932, 31296, 101740, 8253702, 8274978, 8324154, 8251077, 8319435, 8339370, 110063, 101597, 8302297, 8353832, 6258, 31948, 48976, 8340748, 8323427, 8364220, 8320385, 56883, 8267882, 41540, 8300148, 8353790, 26720, 40418, 76550, 77888, 8282295, 110913, 49314, 8339453, 8374829, 8369903, 8309906, 15898, 60406, 112392, 8317829, 8271706, 77637, 8249793, 8262359, 75991, 8375160, 8336661, 8376650, 8373747, 8276404, 8350071, 8360202, 8376883, 8250424, 49145, 70177, 8250251, 8326161, 8368310, 126905, 102874, 8305581, 54843, 8324321, 5566, 8318323, 8346359, 54161, 126759, 8342553, 8260489, 8335455, 8310274, 115353, 12784, 8254541, 9574, 8322228, 9515, 124208, 19941, 8266199, 8315705, 8276039, 8367005, 8265253, 8374711, 60219, 33318, 8305614, 8338024, 101519, 36987, 8366428, 89559, 15512, 8321854, 54985, 8311335, 97928, 57322, 8300168, 56950, 108148, 8308155, 41377], -[8363531, 41588, 8350844, 8371003, 8365291, 546, 19601, 105012, 130332, 65554, 8369189, 18054, 8313178, 8289461, 8359092, 8360648, 8317133, 8327142, 115866, 8325135, 29562, 127892, 8354720, 19886, 54932, 125210, 8374802, 8268667, 64312, 131040, 81606, 8299884, 8362089, 114021, 8343097, 8359125, 8343845, 8352647, 8285335, 8363695, 31561, 8326049, 88464, 39730, 8332522, 39918, 8268886, 8267458, 8357555, 37059, 127683, 115853, 59563, 78860, 110602, 8281422, 114735, 123025, 8327273, 89272, 8288902, 34958, 8289278, 8350968, 8335207, 50738, 113661, 8353679, 35478, 118771, 72001, 14712, 8307200, 8267266, 45197, 50887, 109361, 8269015, 8377513, 44198, 37669, 123285, 8306848, 73699, 10183, 86215, 29627, 36650, 8278249, 75309, 8261964, 8316153, 126522, 8334596, 8281151, 8272991, 8300657, 8261846, 8311642, 120693, 56327, 67350, 117126, 87447, 8336683, 120625, 8315317, 8252774, 8315002, 110913, 8278835, 8299281, 113853, 105989, 55027, 8297236, 25535, 8249550, 76273, 8324605, 8315667, 5800, 8250613, 83994, 8292771, 8342045, 8296554, 8260072, 69233, 37428, 91669, 107124, 34245, 8371861, 8380132, 74593, 8263253, 8379675, 8328100, 26924, 8289140, 29070, 8308418, 8374521, 8272407, 88291, 76432, 8330483, 8333636, 2070, 40129, 8341126, 107120, 8349465, 22457, 8357253, 25024, 11998, 8335313, 125106, 8368275, 8376353, 100762, 8376513, 54857, 8338815, 8380344, 8344564, 8297149, 14161, 8347276, 20577, 8249993, 70001, 20832, 104329, 49901, 8332123, 13312, 8303910, 8320744, 117954, 68885, 100178, 67283, 44091, 8366194, 11407, 102611, 8270226, 101365, 126219, 78266, 93915, 110063, 8320182, 8269442, 68093, 82685, 8264093, 110453, 104999, 8305082, 41698, 59487, 8364632, 8351734, 8356920, 466, 8356306, 8299911, 8361521, 8364961, 8371528, 38474, 100545, 8372639, 55595, 8304918, 49222, 8285079, 8326798, 81605, 20096, 32570, 8317467, 8371649, 5131, 8254391, 8271567, 8334657, 8337424, 55366, 8315339, 12677, 66107, 29647, 8292549, 8347895, 8353454, 69902, 8299397, 8333995, 8360761, 8269470, 8358435, 19290, 29132, 8336800, 78926, 123633, 8288700, 8269423, 92115, 8280407, 66177]] -||z||: 131040, ||z|| too large -r0: [[57205, -15399, 40390, -36966, 35222, 77137, -41195, 51387, -82046, 30787, -7085, -56894, -32953, 54818, 7675, -86794, 39171, 27321, -81935, 31825, -54717, -43916, 22000, -8828, -14130, 37690, 42748, 39171, -25540, -28282, -18265, 43597, 21628, 77384, -93173, -23349, -86948, 51575, 70658, -70099, 27374, 27979, -37322, 77190, 58964, 41784, -73890, -45995, 56735, -75540, -7387, -18975, -85820, 78245, 78595, -73543, 51103, 46687, -48932, -6186, -65053, 94095, 4897, 32006, 28388, -17113, 22573, 67960, 84773, -81221, 85506, -21101, -27719, -85320, -39616, 25880, 18289, -78465, -89223, 32517, 68944, -64284, 92019, 68746, 55851, -29534, -10907, -5722, -61029, 45394, 30013, 12086, 23388, -76579, -42667, -723, -13024, 73703, 64992, -42130, -54889, -46174, 15765, -49993, -36069, 30399, -27782, 33483, 78212, 30763, 27778, 31031, 29107, -18808, 55588, -44520, 22575, -33955, -10809, -69123, -54045, 87885, 71167, 51483, -54057, 44383, -79459, -78614, -41039, 10625, -25566, -28965, -6681, 59240, -49399, 32708, -81869, -35223, -86348, -54512, -42768, -33491, 68848, -92203, -75219, 8890, -23720, 2999, -75526, -47613, -88436, -43566, -15365, 54425, 35051, -22821, -50225, -18375, 77896, 83422, 38908, -29727, -29195, 55372, -26383, 76245, -77697, -56592, -69184, -1897, 75229, -67797, 8973, -35170, -62546, 43169, -93056, -17735, -72620, 22322, 18707, 71768, 3949, 15642, 41570, 84130, -44340, -9618, -51615, 73137, 65270, -75161, 67891, -48212, 74393, -3574, -9896, -22325, 40791, -2702, 57446, 80792, -39913, -78959, -26592, 65531, -46035, -68594, 34846, 63347, 47780, 8067, 87866, -35630, 47027, -72700, 52740, 28174, -93819, -20733, -66809, 59694, 41395, 55532, 76140, 3009, -15869, -87572, 42521, -78097, -89801, -80632, 35331, 44660, -86287, 26653, 32417, 81946, -79574, -94243, 82595, 47712, 62040, -91061, 87385, -22603, -81905, 6860, 15923, -31245, 48465, 75552, 52253, -45724, -84981, -17940], -[-32506, -37147, -52604, 93847, -67430, -10502, 25143, -26000, -45387, -91277, -40282, 83158, -27965, 94447, 77685, -65481, -92616, 67185, 77769, 54806, -1525, -52119, 34886, -45163, 53652, 2376, 2900, -77451, -4097, 79145, 65236, -46544, -989, 2842, 68157, -4191, -42637, -27119, 92889, -36947, -39991, 86212, -74255, -76361, 28086, 14969, 60897, 68597, 58896, 82419, 32582, -21340, 15272, 4711, -87116, -55467, -88278, 32292, -88392, -72319, 20509, 61249, -318, -24969, -40105, -48361, 57218, 28123, -25050, 12137, -72762, 82688, -75991, 60733, 93846, 56246, -14230, -35811, -81712, -41172, -15527, 5986, 41467, 13529, -15938, -61797, 4417, -88895, 49160, -71455, 7167, -64179, 15205, 79709, 47806, -90653, 6143, 30240, -88906, -62766, -48701, 50121, 8501, -88733, 17390, -37934, 2861, 30289, -3981, 30923, 24256, -12190, 17337, -58407, 43767, 15809, -1126, -10580, -7437, 7057, 64778, 20151, 27223, -45843, -79865, -76617, -9668, 35485, -14499, 80666, -80174, -37771, 982, -93103, -1600, 71723, 17001, 43311, -51905, -28131, 51573, -85365, 45475, -42885, -39809, 73703, -36644, 47640, 89387, 55007, 63760, 91365, -75014, -93532, 28481, -10801, -93113, -19359, 30151, -32504, -61404, 86974, 9278, -40895, 37281, -90237, 84144, 86875, -70301, -84353, -6039, -19161, -84262, 86180, -7643, -7591, 28130, 20319, 29908, 72079, 49596, -68468, -77584, 73794, 23303, 37625, 34522, 17037, 90274, -89179, 29313, -50808, 64723, -63507, 37047, -31802, 51542, 49695, 2066, 80781, -18210, -65697, 43334, 20853, 32409, 36495, -59854, 53679, 5757, -77730, 90478, 45352, -69112, 49929, -38525, -24746, -20835, 77656, -48625, -5948, -38350, -76184, -67659, -25253, 48760, 29024, -8863, -80443, 79267, -28236, -85762, -3290, 90022, -92892, 73454, 43189, -81162, -60654, -29221, -61661, 3980, -58586, -79989, -68028, 40524, -88823, 83932, 42607, -33502, -65899, 8067, 20527, 43209, 79647, 32326, -57999], -[28068, -47763, -87709, -47061, 42403, 63660, -48219, -29402, -85474, -70731, -49023, -8035, 41043, 32004, 47610, -11479, -6889, 64624, -80428, -64485, 91020, 91941, 40297, 47770, 38363, 91170, 57058, 77139, -46560, -62066, 67263, -77106, 19789, -49293, -81073, 15673, -91262, 75916, 78074, -15837, 83227, 55705, 72235, 79727, 38972, -23086, 2824, -77723, -70110, 91667, -52775, -51706, -21833, 7262, -89482, -40253, -8431, -89260, 39884, 11656, 40447, 28424, -19511, 22093, -60306, -26502, 47100, 70292, -66105, -73508, 90207, 53605, -52703, 28508, 14773, -37279, -19617, -21871, 2172, -42171, 60276, 20463, 51892, 1966, -7275, -68338, -17591, -92930, -20968, 34502, -8925, -17405, -81405, 49338, 11423, -53413, 68104, -67491, 53378, -77686, -2212, 18016, -4783, 60080, -1238, 16845, 49042, -3048, 65294, 20064, 40442, -72815, 24430, -36959, -10911, -89911, 50416, -55719, -24896, -37811, -21206, -9820, 40371, 7251, -6474, -81707, 83130, -32013, 5424, 32825, 68924, -62957, -22592, -28080, 83252, -32678, -81546, 12418, 63585, 12608, 79289, 13319, -6542, 15089, 79292, -84244, 11979, -54055, 33535, 65484, 55527, -88678, -83986, 4116, -52852, -51734, -15212, 68551, 56821, 28345, -89099, 60294, 45504, -1395, 79569, -33836, 29434, -52917, -76526, 52664, -52196, 25098, -62393, -11291, 13941, 10250, -42174, -28180, 51017, -15078, -46136, -23227, 82260, 61382, 77643, 86771, 62144, -41988, -36811, 61349, -58064, 89614, 51389, -20371, -70945, 69969, -80712, -65237, 81378, 14255, 17186, -26423, -84847, -56694, -31985, 19739, -48171, 37673, 87852, 65612, 48354, -82606, 22542, -72265, -28079, 23024, 60845, 77541, 4413, -58234, -24321, 408, 71353, -75289, 29683, -69572, 73209, -76404, -5067, -27462, 51634, 91031, -81488, -35284, 22675, 34525, -34974, 83004, -63572, -49665, -63147, -59219, 52362, -10278, -85794, 47235, 27964, -30464, -47255, -35938, 44776, -23931, -49419, 53582, 61767, 47764], -[78557, -28767, -77045, -94325, -47959, -42531, 63066, -36342, 75010, -69546, -70488, 47331, -78849, -19520, -81865, -55013, -49713, -94056, -62799, 2659, -62310, -62929, 40232, 93663, 60434, -23370, -68421, -89377, 38468, -92074, 5649, -90483, -18013, -55284, -56718, 7193, 32979, -57647, 89113, -72955, -70995, -75272, -20795, 93260, -41910, 76546, -81085, -8667, 80267, -71213, 24160, -57680, 64496, 91042, -13572, -79663, -46118, -94755, -51517, -12566, -23985, -31789, -11177, -64878, 90247, 20308, 57607, 60381, 85528, 38530, -37730, 14988, -25281, 67362, 15404, -26611, -86080, 24481, -48813, 78759, 80878, -19469, -1586, -86356, 67646, 19132, 62981, 87084, 52967, 48694, -70119, -17956, -90032, 76790, 36373, -94893, -61189, 718, 63741, 15246, -78297, -67293, 60191, 53414, 42995, -6459, 86159, 76306, 35824, 36670, -75191, 15105, 3389, -78993, -92877, 66812, -2085, -55977, -31385, -64703, 93115, 59811, 42635, -27548, 83259, 39717, -69598, 85798, -28361, -90976, 72985, -31507, 38635, 33309, 6041, 73859, 93677, -30680, -55830, 58173, -31947, -86314, -27124, -24963, -71254, -32931, -46323, -8750, -21318, 5139, 42398, -57885, -79891, -30674, -4794, -53212, -75647, -41301, 36508, -19222, 56178, -41148, -71600, 37547, -7630, -91628, -47005, 59191, 83682, 30785, -65896, -60527, -94700, -42054, 92140, -88950, -58972, -28334, -63276, 16440, -39926, -21710, 94569, -46525, -17921, -46057, 26508, 47837, -321, 19381, -25791, -1481, -75818, -39333, -29152, -9523, 35270, -18666, 83555, -51018, -51123, -1598, -26911, 13820, -34650, -37537, -6469, 46052, 10816, -16094, 64801, -72560, -69213, 2702, 35953, -1304, 76871, 87005, 30696, 7688, 35161, 52463, -8923, -13283, 62095, 6808, 93748, -67674, -64977, -52876, 74893, -32423, -88183, 29533, -66787, 59917, 31701, -38719, 93645, -57946, 62876, -35494, -90258, -88991, -49755, -7268, 62918, 77416, 43989, 8300, -74073, -8376, 64362, -61243, 16239, 36122]] -||r0||94893, ||r0|| check passed -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-54016, 57151, 7319, -1221, -121367, -8268, 75887, -124779, 12220, -96893, 110461, -24630, 87493, -2004, 23040, 73278, 103663, -34055, -40061, 11565, 13203, 99130, -22237, -93773, -23441, 58906, 188, -97644, -9009, 86888, -40911, -25602, -45558, -15216, 106671, 104047, -45734, 46102, -34630, 31591, -18861, -44758, -50554, -130870, 104191, 22949, 67711, 90559, -9436, -15081, -124317, -79589, 100138, 125058, -82911, -90906, -17425, 13974, -64167, 104588, 35954, 110689, 39463, -5381, -78500, -119048, -57811, 10733, -34211, -35278, 37839, 130164, 121134, 33538, -76522, -54407, -101848, 14022, -39189, 52188, 73035, -1750, 27433, -66336, 2075, 68103, -88149, 70158, -89739, 28084, 32716, 108305, -72814, 84624, -92877, 67215, -77180, -34413, -86, 127658, -126173, -122688, 62197, -88801, -6159, 56024, -3105, 51796, -11348, -59744, 36625, 93288, 67127, -13952, -55595, -12722, 44016, 38545, -80961, -11744, -49044, -44880, 2194, -32350, 23867, -53195, 121576, -12378, 87836, 58880, 5831, 59269, 15004, -48703, 106085, 48679, 129139, 74620, 117227, 37337, 71558, -63225, -26216, -73269, -84920, 103642, -71735, 4443, -20929, -86051, 64464, -74428, 53003, 18505, 122899, 18343, 7869, -27767, 88139, -1429, -63489, -59708, 6293, 107235, 86314, 17554, -98205, -45141, -106577, 59325, 85740, 85307, -51775, 32649, 108558, 58971, -9527, -62284, 78550, 24445, 54781, -70095, 127448, -74737, 93753, 1666, -23660, -38550, -21850, 55902, -130655, -74315, 126237, -35922, 33137, 42427, -111284, 29533, -127453, 59437, -116348, -47532, -53403, 124489, -129637, 97261, 84693, 3897, -65220, 99882, -6668, 73946, -113484, 7945, -64255, 29779, 117248, 35214, 35642, 123370, 33121, 97410, 100355, 102110, 127752, -69882, -116387, 75179, 34293, -59785, 44949, 111938, -73053, -113958, -15383, 50591, 95674, -48045, -45336, 58580, 18560, -17198, -27510, -90542, 114634, -59525, -91195, -106962, -78333, -113276, -77350, -81452, -50823, 75875, 76998, 114670], -[-29248, 56187, -92953, -5383, 29593, 10080, -55123, 90644, -91145, -64817, 2370, -92112, 22362, 55467, 61858, 104855, -3696, -32105, -94001, 98242, -33037, -85356, 113680, 204, 102373, -54146, 65621, -89257, -18571, -90636, -3750, -62334, -130932, -50938, -65751, 45881, 12567, 102826, -118700, 63915, 108405, -82061, 24613, 99928, 16833, 107805, -42855, -120820, -34969, -81354, 12450, -66772, 71202, 94360, -9732, 24469, 48483, -87376, 114191, 95492, 21140, -47378, 119498, 101682, 128043, 123761, 113116, -36047, 5741, -34920, -101333, -121373, -85521, 53910, 86199, 130420, 128613, -107044, -107262, -123068, -60505, 75461, -117925, 60586, 37306, 11230, 87892, 127320, -18090, 15936, -41898, 86035, 87007, -129029, -8217, 79272, -114792, 65422, 67859, 57087, 58638, -86021, 41345, 38610, -128921, 82969, 43651, 56906, -1548, 47909, 80392, 101645, 15205, 12291, -79016, 35138, 59939, 53305, -74227, 15634, -110804, 67998, 40486, -98211, 39804, -76980, -124289, 11308, -55170, 62172, 110594, 51193, -30028, -25813, 107122, -13144, -39433, -88780, 32641, -110171, -104293, 115934, -96060, 68025, -34712, -33062, 26866, -72703, 86745, 39050, 73437, 67579, 38460, 16741, -109544, -60487, 74819, -68457, 6598, 129759, 100489, 113351, -53772, -110679, -89568, 87067, 39695, -39231, -49838, 51388, -6168, -102409, 80622, 111430, -90568, -38061, -94414, 114092, -28207, 64682, -99087, 91076, -91101, 97435, -107177, 121921, 122485, -63510, 55935, -101487, -87551, -43812, 70884, -48365, 63481, 63009, 104348, -28473, 117932, 6113, -130108, -79033, 81678, -60097, -1530, 57977, -20183, -54626, -74213, 55755, 81438, -77155, 97845, 56188, -93609, 52393, -91126, 56342, 60850, -36112, -31015, -130066, -85761, -103263, 128532, -113182, 93053, -41989, -8677, 2662, -75551, 27312, 33384, -18709, 14411, -71684, -8868, -107703, 122102, -109609, 101427, -61454, -31755, -124219, 124330, -1599, -27521, 23662, 27479, -76319, -36396, -99388, 61858, -9551, 37660, -20705], -[-13691, 89927, -101188, -38894, -4441, -25708, 23843, -97024, 13762, 25626, 127025, 116145, 89972, -76945, -127740, 72856, -24798, -101731, 120929, -4575, 97409, -31376, -123143, 14880, -26677, 19932, -18509, -17397, -2543, -126268, 31778, -34628, -75282, 23698, 80655, -42512, -63486, -69233, 116319, 113676, 120420, 38416, 104935, 5233, 46024, -117716, 41460, 68683, 117243, -94340, -109392, 101765, -108659, 119995, -95495, -94792, -90396, -96645, -45429, 91732, 45573, -7154, -18721, 122994, 65350, 24828, -43513, -8374, -65704, 126051, 110375, 87058, -21475, 33578, 17787, -116732, 126394, 41158, -52557, 29324, -35943, -91617, -5337, -128547, -118211, 5981, 66063, 59974, -27578, -121645, -18116, -22404, 12222, 51433, -70999, -47063, -122994, 36034, -94642, -13978, -115516, -35308, 84670, 68819, 56897, -78933, -44640, 91004, -10113, -23215, -66833, -32834, 2930, -114273, -91857, 105783, 36130, -47369, 31978, 62767, -75927, 19855, 120696, -22091, 129082, 9273, -121590, 59407, 16572, -25639, 6418, -114312, -78327, 74111, 115069, 107989, -112832, -86839, 71106, 30038, -123579, -26815, -57433, 10781, 26526, 64693, -129351, -97011, -61409, 33332, 59453, -31235, 12645, 101880, 57839, 93024, 79274, -52737, -104914, 52395, -6965, -81631, -26841, 122842, -87988, -7747, -28304, 126940, -31595, -109863, -78774, 40710, -46736, -90080, 115433, 37367, 15359, -23165, -73994, 34121, 69190, -72191, -22690, -88871, -94127, -32951, -85166, -84153, -35761, 22452, 89238, -37848, -48306, -44839, 14710, -61062, -106478, -25499, 103586, 94419, 65810, 89058, 72910, -52029, -58108, -37128, 130162, 19905, -112155, -12259, 57534, -130978, -71832, -40452, 27722, 48704, 114066, -26256, 85781, -127438, -78180, -2392, 123275, 7102, 7022, 92128, 35298, -52899, -98708, -83319, -51002, -127379, 106842, 42879, 62731, 66444, 117612, 97183, -41063, 82675, 38398, 24610, -25191, -29382, -60726, 125619, 81021, 115096, -84592, 73600, 59558, -38156, 20844, -119581, 340, -57750], -[122411, -114569, 126096, -15602, 60730, -85979, -92801, -96588, -90323, 39522, 9459, 48319, -114916, 32791, 59968, -89000, 124900, 35073, -80370, -73021, 24611, -74589, 116890, -33323, -14809, -58861, -125643, -44731, -129438, -7366, 119668, 101643, 64609, -120990, -33614, 79023, -91323, -90462, -100252, -57813, 6004, 112588, 20037, 54577, 62678, 93511, -21762, -124725, 61395, -122196, 94969, 37688, 27282, -14783, -57852, -71925, -44117, 124094, -105847, 75316, -3937, 35078, -44595, -5747, 76258, 87882, 5521, 7663, 6797, 21124, 93119, -10423, -32264, -20185, -116578, -119739, 63057, 122912, 40144, 59456, 56594, -12373, -40130, -82372, 87051, 111501, -63061, 118157, 16472, -24594, 59752, -53475, 56851, 95985, 121059, 124008, -116081, 18883, 104459, 70625, -61607, 6464, 99142, -68596, 45740, 108031, -65081, -91226, 3004, -30272, -53579, 110013, -10063, -128425, -38586, 42192, 39545, 27012, -34420, -130914, 48699, -87204, 105143, 8338, 125621, 121403, -62760, 52997, -41503, 17569, 45632, 130993, 3132, 94170, 89822, 12702, -72600, 21138, -24659, 73305, -28141, 9448, 68852, 47693, 80768, 22248, 10554, 106646, -39000, -48603, 116701, 3750, -28211, 93785, -116828, -23498, -54883, 54990, -63985, 101640, -66816, -37313, 23240, -37830, -78828, -26075, 76827, 86266, 93699, -40739, 57936, 109060, -73308, -9497, -93448, -56881, -78452, 56550, 74770, 23872, 54166, -52888, -99928, -101675, -30155, 53924, -107863, -91500, 5396, 34511, -87918, 116189, -112315, 56800, -130865, 81138, 126533, -108972, -64582, -63615, 39657, 52832, 96420, 40772, 43033, 77095, 54316, -96895, -43870, -85837, 99480, 42305, 38763, -27318, -30415, 111819, 114338, 92318, 71168, 84657, 53016, -31403, -74248, 111599, -100057, 88605, -126472, -49012, -36676, -97133, 7588, -44240, -47052, 8465, -31708, -21488, 12844, 82893, 43298, -89192, -13858, 66269, -129843, 42600, -72772, -65450, -79470, -85562, -57290, 104702, -79639, 65521, 37485, 65186, 121394, -83867]] -NTT(y): [[3035491, 2809772, 6725498, 567655, 5447090, 6430497, 588219, 6597274, 7259775, 1642189, 5313552, 2601666, 2944974, 6295297, 3581905, 6874192, 210561, 5960622, 8253565, 1195910, 881601, 4493663, 2179253, 4108348, 2194037, 3996638, 1092261, 6030678, 7838006, 7178403, 7282500, 584553, 1196877, 6707165, 3199084, 341095, 2044660, 7260281, 7420712, 3935267, 5121238, 5061590, 4626576, 6810977, 4897094, 4376922, 2750335, 2672078, 4726553, 3835189, 7154356, 6007954, 348031, 8134029, 1086976, 1982084, 7887771, 7603668, 1137358, 2661850, 7083102, 5369091, 5136523, 2967271, 1090697, 1184083, 854006, 3047869, 4419322, 7632282, 1167593, 1602068, 5018103, 4849750, 1454288, 2691760, 1839621, 3047899, 6110858, 2913054, 1579439, 5043108, 2139766, 3158238, 875297, 4132116, 866980, 6627278, 4157724, 5458883, 2927175, 599965, 5480327, 1909569, 3517404, 1026413, 6227609, 4232653, 2602036, 6395209, 3269477, 3530197, 4957058, 1966457, 2010565, 8082568, 8356231, 5794772, 211493, 3943577, 3005661, 2208475, 2128484, 7280590, 4006397, 945258, 4386251, 4270003, 4562849, 4419605, 4085646, 1669095, 5338362, 6956914, 8088896, 2570387, 5809058, 3752494, 1528102, 8106951, 5281806, 1355547, 5718434, 647305, 3174723, 6294224, 6933676, 1820988, 5246163, 2993621, 7329355, 7635290, 4674588, 6794689, 1558704, 13104, 4121732, 70093, 3501674, 1710767, 904290, 5208425, 2010454, 4145847, 2139346, 3989361, 4896166, 5247669, 4844193, 4114924, 5978018, 2410798, 1287242, 1207752, 5599430, 1089814, 1328558, 2940340, 1825295, 6570469, 6499124, 4467027, 2388572, 1411007, 6084438, 4491391, 5830304, 1062451, 8160682, 5678304, 1537916, 6474149, 4327172, 2051369, 6153936, 3901731, 2262951, 4390798, 2300164, 1383317, 7253257, 2623464, 2264376, 3077163, 8031165, 213399, 7916711, 7842821, 4759366, 1218096, 3085194, 7688597, 2187444, 5973181, 426078, 4729405, 8226232, 7314396, 6955759, 3279731, 1027695, 812647, 8082499, 4609741, 6331955, 3230751, 1167788, 3865767, 563670, 3659339, 3426433, 2023447, 935587, 4310876, 3726513, 5038520, 598057, 3073178, 4581131, 6079904, 1641703, 8243976, 5950162, 2792072, 3029808, 5979230, 3124170, 680394, 6496266, 6795290, 8212648, 4230877, 7439539, 6670916, 7370223, 6232007, 81198, 7359779, 497921, 914519, 8230522, 2866914, 5483100, 2743711, 4173558, 1558382], -[1186428, 6627972, 5529664, 451697, 4448725, 4380951, 4173214, 3118588, 751528, 5748926, 6051368, 6781590, 953583, 8107394, 4197755, 1182276, 4062055, 2844100, 4363510, 3537638, 7543431, 1154558, 7117352, 2928636, 340752, 5847159, 709604, 1958223, 6502642, 5101909, 4425065, 6701502, 1079336, 2780009, 6486851, 5758804, 1345857, 4680259, 7377673, 7079910, 8193795, 727997, 6958211, 2862172, 2062715, 4429197, 5325071, 1733463, 1108995, 4943919, 7747091, 990058, 902401, 3260334, 3363612, 7694830, 679499, 5310055, 5904218, 4806363, 7333096, 221478, 2806330, 8190863, 5710816, 4335744, 6500470, 2115308, 1393603, 6701043, 1588719, 3521351, 6458609, 4530635, 6516460, 3383605, 7559248, 1774539, 7728592, 6132157, 2956918, 6536279, 2734523, 4997618, 985787, 4231548, 1738454, 747701, 1155399, 4629772, 1475765, 4213724, 4845566, 5354329, 8032064, 4632720, 4441462, 6863017, 4787851, 964021, 4504684, 6866409, 4983737, 8359426, 5860364, 7478991, 8341865, 4810079, 8141702, 7412131, 4356415, 6547825, 2080710, 2368070, 3289870, 5107999, 7890593, 3122266, 4937805, 1076767, 7040752, 5079734, 7470440, 1419176, 345820, 3859741, 2540625, 2166710, 3228053, 3871975, 6755666, 5932198, 7224849, 2006338, 3210489, 1573913, 2568058, 4548329, 214869, 1103487, 3332879, 2468670, 1901605, 7174020, 393843, 3095332, 3535521, 2438148, 1423335, 6601750, 6941722, 3660793, 2626552, 5520040, 3660544, 5647052, 1341814, 7573841, 5066044, 5372362, 7617898, 148220, 2108992, 2004430, 4405087, 7886688, 1627991, 4277625, 2953282, 519976, 3551293, 8177786, 1276523, 4597072, 6010558, 6015388, 5347706, 7523477, 3537809, 717282, 5879927, 2788403, 455822, 5881677, 2561966, 753112, 8076977, 1988529, 1109214, 8196384, 1096562, 991709, 463804, 1927501, 3735951, 1026548, 7611719, 2136647, 2348029, 3172069, 5809044, 7262133, 898002, 5921424, 8106193, 8226403, 2477200, 2896605, 6584820, 6593986, 1301298, 2355873, 3066108, 4424181, 297139, 7566634, 7822153, 6650268, 3841265, 7366836, 7367794, 3760305, 2834009, 944853, 3901382, 1446180, 7497169, 5460515, 2640353, 2878491, 6846218, 1567819, 7676730, 5476190, 1555358, 2662344, 4619935, 6022235, 6505176, 3325224, 4623238, 4399675, 7218765, 2349030, 5720788, 4763781, 1489403, 1162115, 1227458, 813570, 2238408, 2521134, 3086205, 6252868, 1662500, 5608584], -[3532585, 4924697, 1037304, 5507705, 7307075, 5989549, 8042933, 4279280, 4889520, 6020792, 857658, 7123262, 1696421, 841316, 2868754, 3895707, 5482347, 5322601, 7095490, 3804561, 4044827, 6035382, 2571766, 454103, 5899706, 5248583, 3497922, 3638435, 143152, 6312332, 5499213, 2025225, 5230663, 1961606, 38840, 4242261, 4004302, 5511156, 378626, 5745487, 2961599, 2248011, 4901933, 6029015, 4937870, 2215203, 3126148, 2769955, 1264534, 7905685, 327699, 7246859, 103040, 6637822, 4085095, 5350814, 531307, 4824778, 4238336, 4244879, 3633694, 5752997, 460370, 2218437, 1004732, 1657055, 4011241, 1164249, 215033, 2650120, 5194959, 8265348, 6396364, 2031504, 2681719, 2182102, 2174199, 7488410, 4532501, 2055341, 4249520, 6076267, 5165307, 3662882, 4132357, 4863570, 3076958, 2984697, 2801869, 3069179, 3667363, 3329341, 8283693, 7055793, 1891849, 4324657, 4897215, 7468131, 299786, 2005399, 6115735, 4712155, 839472, 7825892, 4196326, 2747995, 4858737, 5601880, 2293286, 8313998, 5199306, 2077038, 6124206, 2987288, 2966861, 1501015, 8119888, 1136756, 4819387, 4355689, 3761462, 499210, 4378829, 7588660, 7290266, 714165, 5849734, 3690213, 6880398, 237848, 5727381, 4117525, 773171, 2413313, 5020905, 6703198, 6318945, 664006, 2872545, 714742, 4794129, 3633410, 5118658, 2498733, 3651486, 6990869, 8230526, 5174087, 7356770, 2865328, 2795458, 3475629, 6253142, 6964594, 8278271, 5788631, 7917145, 3087008, 6142460, 5409656, 5825662, 7201245, 6364687, 28816, 1655525, 5270058, 4642936, 1678684, 6145296, 767970, 1634478, 1552348, 5566381, 6169119, 7038360, 3221426, 7094291, 1471319, 963147, 2063646, 152148, 308353, 8088201, 1079218, 1057501, 2747600, 403988, 6802177, 8228760, 1289765, 3542201, 5643496, 7980412, 4970687, 6018355, 4573903, 2169739, 2946451, 3946746, 4368230, 4666137, 481624, 2556853, 6576219, 46909, 4431750, 4002959, 410576, 1788765, 5597858, 5423557, 1403200, 7349202, 2275788, 1276147, 773033, 2513159, 2004915, 214260, 4374722, 526123, 4188339, 3114883, 1328813, 5047910, 5572936, 4643247, 2066107, 6131640, 4237385, 6458333, 1997664, 4912938, 4626838, 1443165, 4584426, 292127, 176806, 5956217, 7141764, 6176493, 2415920, 6221542, 5649897, 6181328, 2925818, 3137989, 840758, 5847081, 6738030, 8197003, 4190326, 1423942, 1024945, 3301171, 3499349], -[5891005, 3311385, 5414291, 4580860, 8340878, 5520282, 6364105, 7045576, 7815361, 810465, 7786775, 3706582, 6136129, 7748501, 1457512, 4498603, 7106653, 243797, 2818566, 816755, 8302875, 4810815, 6125676, 5567150, 5964403, 3625608, 2019205, 6298905, 5032809, 2019195, 976665, 5330626, 2420594, 3758067, 6733315, 1608452, 975406, 5510281, 7380414, 4431628, 2148731, 1707207, 5734022, 682449, 952513, 3945624, 6716646, 7348349, 1201981, 6902469, 5666693, 7113213, 3340395, 4285601, 4876080, 5080783, 103190, 4144036, 3201701, 3200875, 7533310, 715350, 3016238, 6491432, 1123396, 5079984, 7895729, 851142, 5176317, 1574433, 481528, 5147083, 1791107, 3814674, 3579569, 5443528, 3396608, 2664502, 3433834, 734274, 4217783, 4702440, 2718732, 5636240, 237289, 5783614, 7422803, 7097033, 1568524, 5418410, 6937331, 6610899, 4685873, 4744237, 7101943, 1955636, 5861030, 7253191, 3572227, 866250, 5922315, 8195855, 7242390, 7289975, 1243704, 5654169, 2499933, 2356997, 3942148, 287943, 7859341, 4643101, 7674222, 5335087, 7583992, 3996034, 6226290, 291681, 2466232, 7646282, 6047382, 2908814, 6063989, 5526057, 6115355, 6047948, 8266395, 2243064, 2566782, 971652, 7737369, 4844537, 3502238, 1111823, 7918408, 4148491, 6769860, 2554509, 2859262, 4120331, 1989962, 5699314, 6989194, 5485555, 1065194, 7698853, 1261568, 7397883, 8018059, 5945222, 7227970, 6638104, 3321887, 1077587, 4406450, 8029576, 7566551, 7724532, 2538758, 8306253, 2759844, 7930605, 4047373, 7129444, 3676126, 598887, 5695342, 4493941, 2678329, 5287927, 3471328, 6963634, 7465123, 3080530, 6424299, 7240826, 7557922, 2368265, 6160843, 6727952, 5882428, 5080113, 8145844, 440735, 1586851, 3706333, 2003924, 1692805, 6845500, 6129838, 2619952, 4170360, 7265826, 6552758, 8033101, 5121074, 1473226, 7057214, 5708279, 4037448, 3845540, 235103, 6494050, 540806, 2758593, 4402960, 6687811, 2634722, 1760459, 7525752, 8220701, 7299236, 4529060, 904271, 7627019, 5535973, 2361150, 2385128, 6689069, 2127271, 7002540, 4581157, 338422, 6185989, 4147871, 7566363, 4221355, 6669416, 7969626, 5422290, 2427966, 2275389, 255698, 3474631, 2289293, 2835534, 496895, 500128, 7194693, 6004505, 6634286, 7464498, 5705044, 2788095, 5336596, 6815260, 370576, 7973586, 4358652, 44895, 6918964, 5226649, 5701209, 7848187, 6306965, 1779202]] -aHat * NTT(y): [[6144420, 4965121, 7555555, 3905658, 6043149, 7189003, 8075652, 2203037, 2783350, 3674236, 2430017, 5393384, 4941164, 4296081, 6148283, 7660585, 2308491, 1400256, 5671721, 3907686, 5929147, 1265500, 3022283, 1128849, 15574, 1164226, 7675964, 7558208, 3796492, 1639674, 6566290, 314927, 4898735, 581906, 7454937, 3852529, 3924068, 348752, 4848573, 3055577, 7606360, 5403547, 300170, 4424597, 6359459, 5663745, 4166932, 7643757, 2658231, 7396270, 3515068, 6668595, 6816951, 1341650, 4326698, 5564663, 1551431, 540782, 7485380, 4301755, 7992433, 1982296, 5421315, 4601611, 1833982, 1233808, 451588, 6988939, 2623962, 725611, 1854355, 2299692, 8157936, 4660457, 1970445, 4882334, 1443783, 3442510, 5224830, 5740279, 2946669, 4274368, 1147247, 6032402, 344604, 6479211, 6386428, 6248897, 1114601, 1819988, 6627179, 7751680, 3368594, 3215054, 2934481, 8152614, 2127743, 6144216, 99341, 628249, 8185372, 4886275, 796140, 5659210, 7415036, 2166062, 6183401, 7168789, 1359981, 4034680, 3106993, 2687128, 4003063, 2830728, 2350180, 571473, 8076459, 7748540, 7779703, 4991982, 3704813, 4850252, 4730293, 2369138, 2195049, 3209146, 855317, 2293644, 1338310, 7730177, 5464760, 7470852, 6016224, 7824305, 8366169, 6185769, 2722279, 4360138, 3451312, 3121272, 1268389, 5342663, 7216470, 6790051, 5017975, 2871315, 486414, 3953334, 3338544, 380084, 881141, 1851686, 4299945, 2134416, 3936945, 2503968, 6908224, 1663979, 1675835, 7517557, 6186323, 565056, 4401910, 2164127, 393499, 4404266, 7991691, 4656990, 1120793, 7509848, 4117686, 271242, 1180957, 7773347, 4448666, 4650398, 8309537, 7543726, 7829590, 3909950, 5371264, 7541323, 3986488, 5523577, 7213719, 741439, 5468872, 5309732, 8039561, 448734, 2777779, 5602961, 3737664, 1512454, 157720, 8295211, 405669, 3071257, 650, 7329231, 7954557, 5088275, 8032917, 4428814, 2085589, 2088772, 6167589, 825826, 7315436, 6584515, 7778454, 6768870, 5115996, 4782261, 3478380, 2784376, 1299269, 5001761, 8371846, 2777149, 2884961, 824294, 204593, 5179108, 3273007, 1261457, 7006787, 7575163, 14721, 7531729, 859014, 2436426, 2605367, 980875, 71276, 557077, 120143, 6055730, 3055587, 1793017, 2909122, 6325769, 2611222, 3649877, 2495215, 3770115, 6269765, 3606572, 8207745, 8138614, 8063635, 5091973, 2111348, 7874593, 7039022, 6481524], -[3947975, 3650816, 8224516, 4685363, 3926342, 144489, 3132631, 907258, 6824604, 5556910, 2181192, 7208281, 4569563, 3179171, 1144616, 5741696, 1144035, 2523799, 8272894, 2323568, 5864400, 3244188, 3562273, 4572556, 1022028, 1467052, 41081, 894542, 6469379, 7086834, 2176087, 6344160, 4022893, 1913962, 2696802, 1459627, 132084, 7007601, 55223, 7554631, 988780, 7357688, 5628763, 6642524, 5826819, 6545530, 2200921, 2490576, 7048699, 3376723, 5881507, 7298653, 1255811, 2738046, 8129762, 7867716, 283783, 5514833, 3805389, 1996005, 7690544, 3508467, 620365, 5637038, 5458888, 185771, 8060501, 6291936, 3242249, 4459777, 557195, 2157124, 5718782, 6428901, 4469254, 3293491, 985541, 61658, 4127942, 4052645, 4142148, 866955, 6777963, 3153490, 7436271, 510136, 839901, 2183176, 1153488, 6176648, 451796, 7624929, 1094930, 1603053, 4172505, 1063600, 8259582, 8076657, 1486014, 7647992, 510183, 6499016, 1846712, 7804670, 3384284, 8275666, 6045428, 4313344, 7500522, 1205838, 2268614, 3188138, 2612853, 4757274, 1641117, 6273478, 995035, 4619824, 3062443, 3695369, 7267191, 3531437, 4710051, 1653184, 7346596, 1126347, 6607472, 6508013, 1720404, 100952, 7677762, 1901980, 2760797, 5846552, 3393042, 8189903, 7206498, 3475375, 3385805, 3506385, 1699627, 3871056, 2608573, 1190124, 7647731, 6894498, 2378975, 3357422, 3938034, 2069827, 4380269, 5925381, 5598651, 4885937, 5999117, 5223472, 2935863, 4995790, 3880280, 3546077, 2923648, 6569017, 1401455, 2973515, 1615696, 6653790, 7527312, 3223135, 7106953, 2442200, 7042884, 4367635, 1244854, 666729, 6524190, 8028384, 3714276, 6497549, 6415516, 7569317, 5664663, 7745839, 8324536, 2825480, 3517759, 1668621, 2004808, 2622296, 2228499, 1929246, 4188292, 3552273, 3354408, 3827261, 3774273, 2836523, 536696, 1873342, 7988891, 6841248, 5463779, 686049, 5943232, 3597105, 1883062, 6805400, 6700947, 92882, 31170, 6125691, 6873468, 8278182, 873415, 1025455, 8273319, 600210, 1587489, 2887871, 4728168, 7036479, 3831053, 4423762, 1565569, 7320093, 1275642, 3740975, 2163037, 1303858, 851893, 1301074, 296537, 4468289, 5094679, 6475677, 3811666, 1782112, 4215996, 6790489, 4130640, 2021317, 4720185, 8275286, 5753530, 6899040, 6636577, 4649704, 7886024, 6139880, 3571420, 8282842, 3952531, 5715365, 1523969, 4505545, 2890084, 4222129], -[4570944, 627762, 5756578, 4675500, 836083, 5598067, 5641604, 5537951, 5805924, 1180617, 3380506, 4345096, 5582818, 5533245, 1968659, 8240317, 2532568, 7335666, 7945304, 7978282, 4616187, 3061046, 2712855, 4608004, 2681085, 2056060, 1801107, 5128910, 8000612, 5688850, 6552442, 7247218, 4353989, 6051239, 2692834, 4802529, 3164722, 1973968, 6366851, 3731886, 7145245, 4516578, 7260135, 1690730, 1700738, 7993719, 804203, 8029909, 200474, 7965198, 4221508, 6821145, 1323870, 113300, 4733572, 1026605, 5321971, 499110, 3312489, 7139535, 4958106, 4625429, 7070047, 8319687, 1647355, 766455, 1846406, 4205959, 8075298, 2436673, 1418847, 7050505, 172174, 2365149, 2954817, 6471927, 3596052, 7555999, 3804777, 3125547, 915858, 6699085, 5984823, 1858429, 4189270, 4404735, 5948771, 5290284, 7926977, 5679163, 6744374, 350144, 3562322, 5537559, 8223626, 6595059, 7967900, 7929629, 2087354, 4138378, 7636601, 6259389, 1369221, 6355274, 756706, 2064399, 967974, 6447546, 3898200, 4651793, 884980, 7429573, 7340202, 4820978, 5097385, 4183687, 7485604, 2829566, 3093243, 3572296, 5594967, 6531945, 3392829, 991867, 11573, 3021116, 2919034, 6791926, 7503706, 6269270, 1393283, 5779945, 164587, 3505816, 6896881, 8293297, 6812157, 4206214, 7871361, 4480185, 3455661, 5654216, 4831123, 991252, 7004055, 7210886, 2095980, 4210739, 2348701, 7656589, 123266, 4266129, 3314451, 7286551, 3706932, 7867497, 2772532, 1305616, 2012689, 3273243, 4984569, 6444891, 3546365, 5506524, 3646517, 3865927, 3905141, 4579125, 241007, 1570397, 7169116, 581826, 7019705, 2850948, 8242711, 3010541, 4704324, 3963785, 8326805, 3933513, 1130326, 7867965, 5042410, 23871, 2995453, 6739510, 6881295, 4147580, 3726590, 386182, 2537051, 5698969, 6851252, 3767974, 4070165, 2197919, 5549993, 4415628, 6423687, 5429488, 4395092, 2065201, 1794319, 5622673, 7330693, 4833506, 7807042, 1870577, 7095671, 1625448, 3472119, 5038899, 6363099, 688035, 7241718, 5281658, 4545501, 1049449, 6682919, 4591705, 126023, 5903644, 7648773, 6187702, 4688194, 6035745, 1561501, 4609456, 6335178, 6617021, 4019700, 7393149, 7194227, 313757, 3848218, 8213043, 5002759, 6378495, 2811995, 3827767, 1025553, 608629, 8056934, 7048341, 2639595, 5618354, 7503502, 246109, 8071170, 4008640, 1510836, 7345818, 3702509, 1178137, 5020726, 1820487], -[2205174, 538673, 4505981, 4879551, 3213359, 1731252, 2120126, 3363074, 3771584, 5588762, 3902236, 1437007, 3268368, 897382, 6649813, 3210041, 351148, 6592297, 4212276, 1005098, 3459024, 7855081, 7032803, 4750968, 6430120, 3682124, 3727167, 890141, 6624637, 400159, 4228128, 3871817, 8011526, 2433991, 3037410, 7233474, 3962901, 6502125, 7957349, 4705974, 4740839, 4068487, 7914692, 3699814, 4066579, 3173264, 4017653, 4810135, 2094032, 225324, 6149661, 7165303, 734629, 8041992, 6489448, 7061802, 2799764, 7762477, 2894929, 2191960, 3222249, 7304958, 4351445, 5432323, 3997703, 80702, 1075732, 496345, 2645373, 6820097, 6913852, 3993012, 8007951, 2563581, 1693771, 8200416, 458651, 5419813, 3597061, 6790550, 7339074, 234504, 5560353, 3050910, 1185979, 2605314, 1180746, 1798391, 3593636, 5173162, 6281181, 1182754, 5016379, 450691, 8024469, 7762498, 2205599, 3483821, 6930547, 7326380, 6810970, 8067605, 2478599, 4534959, 5891850, 600441, 2268927, 5145227, 545218, 6450654, 7213028, 3352652, 5707265, 588505, 3354456, 1758005, 5279556, 6200112, 4039927, 5907345, 3069003, 5155988, 2257290, 7191346, 513589, 3455145, 885448, 3870692, 7412993, 5483216, 8031921, 4014093, 4841709, 3396175, 6809928, 540164, 2445690, 2318892, 985485, 475894, 3815467, 536926, 4242755, 2784068, 6555693, 4576224, 4016466, 2817427, 3562332, 6022546, 7216865, 7155797, 4896800, 6751918, 2912303, 3277582, 1310533, 4193506, 3583491, 3998810, 7111218, 149592, 2446193, 581958, 1398532, 561090, 917554, 4385178, 1776428, 2519051, 1907924, 7377719, 401818, 4440775, 5710435, 6409701, 6651631, 101552, 6674846, 1362754, 1570673, 6435295, 3840327, 3862566, 4191641, 4597739, 4225687, 8295919, 8013003, 3891838, 1808926, 7787062, 3219884, 6688174, 5463439, 5768522, 3286331, 1820458, 2314900, 4683951, 3937807, 4511389, 873091, 1005883, 4751537, 3020090, 3003985, 4038293, 6762138, 7761381, 4402757, 4194383, 4840763, 6658645, 6212284, 7662689, 6725697, 6222829, 3097939, 6066291, 867603, 6686851, 970079, 5381986, 2679161, 1475933, 1590741, 6334900, 8324748, 1230532, 6273253, 5160248, 4864214, 6451636, 2048475, 1048874, 4796820, 4319916, 121111, 5257718, 1031109, 3053068, 8199966, 8059189, 6438752, 5710720, 2328081, 7570864, 4501089, 2671987, 7129359, 6561998, 3371191, 3745249, 8026340, 1698312]] -w = NTTInverse(aHat * NTT(y)): [[4968407, 4718179, 462388, 1119871, 7817329, 3820487, 6327751, 947481, 6639094, 4489022, 8186388, 1912045, 4956263, 7739800, 7404478, 8379826, 6526201, 7074363, 147018, 6952946, 3810768, 902435, 2775266, 8296885, 8051764, 3503130, 5595609, 6009587, 5926137, 4615793, 1905308, 7592716, 3334031, 2416622, 3332599, 6060453, 2063166, 4166850, 7668372, 8279294, 4129102, 2637835, 4581014, 2641700, 4802458, 6272159, 7471382, 1331727, 7108704, 896577, 8144022, 1637019, 6049888, 5089185, 7135655, 6202969, 6642720, 7096641, 6949927, 4687866, 4885849, 205023, 2397822, 3773483, 6111363, 6802280, 7348888, 4460760, 109243, 3411852, 3890924, 2509281, 3441374, 6262583, 2222397, 2289879, 2075549, 1068443, 4816229, 884304, 2750057, 8127817, 4331398, 7959205, 4598115, 6521412, 7951783, 5153698, 7702003, 1185204, 8293833, 6757742, 5016210, 3526979, 2234260, 2757883, 4335009, 736029, 5229885, 6576540, 3778864, 6555783, 2588363, 27210, 7556893, 1316724, 5398479, 6786820, 5230203, 1126613, 8001284, 4382863, 744569, 5163386, 1971936, 807725, 1485084, 2918309, 3900433, 5996273, 1708259, 7456238, 5598718, 2190102, 6309214, 2442543, 2677703, 2729639, 379218, 488601, 2602470, 2504541, 8024695, 6578005, 415191, 7767667, 6168890, 7277026, 5630201, 6681978, 5813748, 5757346, 2291932, 6661532, 794880, 3078399, 121392, 6534939, 2918276, 441979, 3305227, 279035, 4535496, 6579245, 15012, 7428585, 7857467, 478553, 7630954, 4951768, 7436814, 7352666, 2788218, 507218, 3683945, 2257427, 39409, 2043676, 1652461, 4980483, 6269058, 4864680, 7684174, 5956878, 6745341, 7101225, 2356962, 5965385, 3499547, 3793402, 6779465, 5642537, 4772159, 5557066, 568502, 6249119, 407401, 7422643, 7296053, 2649263, 4894235, 5091122, 8241978, 2447280, 3659063, 2327933, 7017258, 3390164, 3554977, 5046435, 7855288, 2716298, 7470131, 8008490, 5971511, 3326059, 6615790, 6674938, 3971260, 2014564, 4457632, 6131577, 7567201, 2605656, 190061, 7420735, 3082400, 2204091, 7861956, 7179538, 5237500, 5034335, 5932748, 327340, 7214685, 1756388, 16316, 700202, 3071802, 4442605, 5333405, 2181761, 23180, 2749222, 4096557, 2656849, 4543861, 1336518, 4808334, 987034, 5117638, 6094840, 7172274, 6111208, 765447, 6263622, 879114, 113155, 144961, 2726877, 5166020, 5132711, 5782039, 7523653, 1503501, 4256400], -[3630454, 5624929, 2246792, 132343, 4322521, 4071699, 2673323, 4672357, 5664089, 578958, 6719380, 5325833, 3539196, 1512492, 8373427, 51420, 3989611, 8346944, 3406196, 6155063, 2144545, 944604, 7793352, 789926, 4642606, 574413, 4946472, 3383709, 3644025, 486333, 7438080, 7269381, 321699, 2588519, 2309143, 3556680, 4428265, 7422358, 7664689, 6491501, 5397625, 2136041, 1486729, 1024553, 3950595, 6681802, 7706605, 7765879, 4204000, 5078361, 3816485, 5457372, 3298466, 3317377, 3335756, 5715900, 6708640, 5571500, 7508550, 8354784, 1732969, 7025820, 4728402, 2838541, 29951, 429152, 6404211, 7902778, 1669851, 3363533, 2004848, 8044611, 6403488, 3016324, 819416, 1405027, 6511692, 444103, 5325225, 3079964, 2594167, 4071130, 356962, 5234311, 506202, 2553068, 1040589, 106871, 2831009, 6962910, 3332245, 7212619, 3152689, 5308286, 2627332, 863217, 4644074, 5028687, 8325780, 5051073, 1857897, 6272733, 5688634, 262357, 6332957, 5908514, 916233, 1189291, 3256723, 1370162, 4954320, 2415413, 7875540, 2284601, 6697891, 8194218, 7294765, 8168715, 3315323, 6399350, 2069260, 5396844, 7336286, 533705, 7585070, 4837931, 6966559, 5958739, 1807459, 1249264, 5341091, 4288214, 1234974, 7962245, 2009060, 1776184, 4555331, 1907546, 8334724, 4425483, 5564729, 3327608, 3084261, 5937768, 5564071, 584252, 5269487, 1750351, 5598541, 6822441, 1740984, 1697629, 3624617, 5623581, 3555451, 8340627, 8278479, 4394781, 2597538, 4472313, 2783339, 5392662, 6699440, 8099727, 3135730, 2398074, 637582, 7991479, 6427221, 6186397, 2035827, 7937249, 1643380, 5458435, 6168496, 7421666, 2823784, 4285013, 4669894, 6371450, 6050362, 5649400, 558957, 3746448, 1235144, 4424498, 4919285, 534884, 7981366, 2627223, 3495882, 6891545, 2207363, 7943290, 2359980, 7584958, 2698527, 7026683, 5585435, 3142264, 5433972, 6819046, 3242318, 3956818, 3661236, 2834572, 5221600, 111497, 345606, 192549, 1643098, 7870009, 759212, 4199263, 6129962, 6656772, 6398707, 3690547, 2409225, 1438328, 317304, 1884264, 4214305, 2612252, 2597576, 7643526, 6697677, 7943004, 3581394, 7291811, 4310811, 8093282, 163985, 1438926, 5377877, 4268579, 3106997, 4926758, 7481124, 3224126, 1528600, 3682459, 1710650, 6644715, 1143466, 3530902, 7193072, 8174802, 7643783, 588600, 3876542, 5660563, 5676603, 7004470, 2280079, 6024116], -[4180087, 6172391, 4813829, 1863491, 1606438, 784736, 7811099, 2734334, 1234685, 3971486, 6958897, 3641168, 448494, 7052068, 206469, 5585204, 2415087, 2675390, 323449, 4812098, 1859679, 5585323, 8067457, 2959351, 4066618, 6715414, 8071856, 4011977, 7844390, 3177058, 5053684, 1933299, 2403140, 7725993, 499498, 6226332, 580758, 7903604, 3159787, 5055403, 2143472, 1951472, 2575429, 5016299, 6210534, 6502559, 6939489, 7100917, 2683687, 3396853, 5091342, 260862, 3952244, 1505965, 1803657, 3797827, 3725486, 5669827, 5110704, 3726284, 698539, 4377123, 3888079, 3205234, 5644526, 7186943, 7085661, 6204976, 6618073, 6955049, 2122710, 5153575, 6497066, 8143271, 73518, 558108, 8306592, 4304165, 952478, 2645198, 3658648, 6013900, 2902512, 4724108, 960088, 5017625, 6351715, 2284771, 3633997, 2413145, 6398754, 1940314, 6473421, 4895173, 4254736, 5444428, 6564640, 6812551, 4429448, 5198720, 6874410, 4307863, 361940, 467150, 4277413, 885912, 3584721, 6307686, 3884466, 2049991, 4389540, 5758628, 2513921, 4258715, 2869576, 3990815, 7974986, 7048958, 6768331, 5054584, 4113099, 3072206, 4396882, 6990763, 7124166, 4083231, 7560468, 3607783, 448388, 6219800, 7317615, 1495118, 3898044, 110256, 2181675, 1255423, 7438811, 7809168, 6669353, 848130, 8115304, 2631358, 30825, 7690712, 2128623, 3022619, 3361293, 7796729, 24269, 5836051, 2734689, 1073196, 4624444, 7761512, 1075386, 6572825, 1706321, 4382934, 4724836, 7417054, 2876166, 3224712, 448617, 5527061, 2628729, 4493272, 3566878, 7746119, 214331, 5019567, 7950591, 1496469, 2013536, 4303698, 5415443, 2174532, 7007146, 6484046, 6318994, 6795487, 3326071, 3198765, 8298074, 7198711, 403536, 3203384, 4506023, 1724541, 2417442, 4068779, 5951630, 5654448, 2783699, 7267888, 3221889, 4322694, 1057056, 4371565, 862689, 2550451, 3724192, 7319727, 6406340, 3230227, 1588857, 861310, 3727911, 8303618, 4908298, 425696, 1026890, 1429452, 7864873, 6143945, 2328414, 1756984, 6167048, 4221885, 4552975, 2637999, 8201361, 3665288, 6356199, 3941571, 2778702, 7058689, 2364639, 33650, 3407044, 1008590, 2307268, 4375186, 5268232, 7670393, 7788582, 472781, 5618276, 5887344, 598201, 3934827, 1290555, 1986890, 7463628, 925557, 4874502, 3754096, 66648, 4238371, 6266958, 4361685, 6193969, 7732858, 651418, 2940170, 1231832, 7801741], -[3075011, 1782742, 3609275, 2285451, 5721724, 1975868, 4541321, 7349816, 1822499, 3892614, 2365141, 6626613, 7806763, 5523919, 1101957, 5963548, 2099901, 3623760, 7831180, 4648423, 4211469, 2294986, 3122816, 886992, 4573745, 8301168, 1003444, 8051681, 314657, 3898698, 434286, 1884814, 6119560, 972263, 5709488, 3888085, 385449, 380739, 3755972, 768755, 1875541, 7052100, 2709322, 4480669, 1157820, 1215448, 5020129, 6855192, 5212720, 2897196, 3366899, 2993743, 2453776, 2594240, 1668921, 5645045, 598284, 8175729, 1253407, 5978821, 3862284, 7975744, 6884593, 8293934, 6244988, 5853009, 3167933, 3611929, 1133566, 2786599, 1676146, 8059644, 437216, 7308278, 4819552, 8148630, 5416032, 2338597, 2986314, 905216, 5673752, 7127159, 4822579, 7085650, 6280528, 1207743, 4528461, 5726786, 8153370, 3421914, 3327357, 3569859, 273847, 3866036, 1201903, 5577110, 7884111, 7433383, 653228, 6567466, 728280, 3392644, 5883727, 4378605, 5002448, 521376, 7912530, 275877, 6926988, 3091461, 1364420, 236271, 259347, 2723176, 2283990, 5631848, 6042967, 8026943, 5275287, 7766801, 5298299, 450130, 6426796, 5651571, 7464239, 6776815, 4554714, 3456485, 2085743, 5021084, 3438590, 5557582, 1973615, 4914588, 7595663, 1913661, 858364, 6708223, 7830146, 5310470, 3604404, 1134161, 6075319, 3447750, 5596936, 6539051, 560681, 6482693, 3659898, 5149231, 5284969, 2482926, 7539867, 492230, 5606235, 4580197, 5597209, 6143315, 4469448, 4155788, 981312, 5910089, 6340518, 6109119, 94297, 6849152, 6450933, 4586280, 7996231, 2307069, 7209930, 7334461, 7926304, 3257024, 2349204, 831739, 7783733, 1230612, 6489055, 5840195, 702176, 369699, 6947689, 1184325, 1615942, 7042308, 5262490, 1266210, 6018643, 2418399, 6633493, 8261126, 3566734, 5718528, 7818325, 3380321, 7355400, 2484649, 2374021, 3519122, 1304322, 1725684, 3816436, 1824747, 1471619, 5297331, 5038676, 500326, 1885922, 3258971, 7033368, 5936768, 7694128, 5019629, 3438879, 6484238, 4208724, 1894219, 2850965, 6446660, 6774972, 1697917, 6097365, 7291355, 6460296, 3933178, 1111045, 2272538, 1903315, 7731366, 295356, 3729627, 4550147, 5161957, 5989917, 2251158, 6100444, 623567, 831761, 5018555, 209505, 8106791, 958822, 7285090, 1308955, 1165959, 7517911, 3985143, 3892213, 6305801, 1009611, 7764362, 4032278, 2720543, 452246, 5532705]] - -w1: [[26, 25, 2, 6, 41, 20, 33, 5, 35, 24, 43, 10, 26, 41, 39, 0, 34, 37, 1, 37, 20, 5, 15, 0, 42, 18, 29, 32, 31, 24, 10, 40, 18, 13, 17, 32, 11, 22, 40, 43, 22, 14, 24, 14, 25, 33, 39, 7, 37, 5, 43, 9, 32, 27, 37, 33, 35, 37, 36, 25, 26, 1, 13, 20, 32, 36, 39, 23, 1, 18, 20, 13, 18, 33, 12, 12, 11, 6, 25, 5, 14, 43, 23, 42, 24, 34, 42, 27, 40, 6, 0, 35, 26, 19, 12, 14, 23, 4, 27, 35, 20, 34, 14, 0, 40, 7, 28, 36, 27, 6, 42, 23, 4, 27, 10, 4, 8, 15, 20, 31, 9, 39, 29, 11, 33, 13, 14, 14, 2, 3, 14, 13, 42, 35, 2, 41, 32, 38, 30, 35, 31, 30, 12, 35, 4, 16, 1, 34, 15, 2, 17, 1, 24, 35, 0, 39, 41, 3, 40, 26, 39, 39, 15, 3, 19, 12, 0, 11, 9, 26, 33, 26, 40, 31, 35, 37, 12, 31, 18, 20, 36, 30, 25, 29, 3, 33, 2, 39, 38, 14, 26, 27, 43, 13, 19, 12, 37, 18, 19, 26, 41, 14, 39, 42, 31, 17, 35, 35, 21, 11, 23, 32, 40, 14, 1, 39, 16, 12, 41, 38, 27, 26, 31, 2, 38, 9, 0, 4, 16, 23, 28, 11, 0, 14, 22, 14, 24, 7, 25, 5, 27, 32, 38, 32, 4, 33, 5, 1, 1, 14, 27, 27, 30, 40, 8, 22], -[19, 30, 12, 1, 23, 21, 14, 25, 30, 3, 35, 28, 19, 8, 0, 0, 21, 0, 18, 32, 11, 5, 41, 4, 24, 3, 26, 18, 19, 3, 39, 38, 2, 14, 12, 19, 23, 39, 40, 34, 28, 11, 8, 5, 21, 35, 40, 41, 22, 27, 20, 29, 17, 17, 18, 30, 35, 29, 39, 0, 9, 37, 25, 15, 0, 2, 34, 41, 9, 18, 11, 42, 34, 16, 4, 7, 34, 2, 28, 16, 14, 21, 2, 27, 3, 13, 5, 1, 15, 37, 17, 38, 17, 28, 14, 5, 24, 26, 0, 27, 10, 33, 30, 1, 33, 31, 5, 6, 17, 7, 26, 13, 41, 12, 35, 43, 38, 43, 17, 34, 11, 28, 39, 3, 40, 25, 37, 31, 9, 7, 28, 23, 6, 42, 11, 9, 24, 10, 0, 23, 29, 17, 16, 31, 29, 3, 28, 9, 29, 36, 9, 9, 19, 30, 19, 0, 43, 23, 14, 23, 15, 28, 35, 43, 16, 13, 3, 42, 34, 32, 11, 42, 9, 29, 32, 39, 15, 22, 25, 33, 32, 30, 3, 20, 6, 23, 26, 3, 42, 14, 18, 36, 12, 42, 12, 40, 14, 37, 29, 16, 29, 36, 17, 21, 19, 15, 27, 1, 2, 1, 9, 41, 4, 22, 32, 35, 34, 19, 13, 8, 2, 10, 22, 14, 14, 40, 35, 42, 19, 38, 23, 42, 1, 8, 28, 22, 16, 26, 39, 17, 8, 19, 9, 35, 6, 19, 38, 43, 40, 3, 20, 30, 30, 37, 12, 32], -[22, 32, 25, 10, 8, 4, 41, 14, 6, 21, 37, 19, 2, 37, 1, 29, 13, 14, 2, 25, 10, 29, 42, 16, 21, 35, 42, 21, 41, 17, 27, 10, 13, 41, 3, 33, 3, 41, 17, 27, 11, 10, 14, 26, 33, 34, 36, 37, 14, 18, 27, 1, 21, 8, 9, 20, 20, 30, 27, 20, 4, 23, 20, 17, 30, 38, 37, 33, 35, 37, 11, 27, 34, 43, 0, 3, 0, 23, 5, 14, 19, 32, 15, 25, 5, 26, 33, 12, 19, 13, 34, 10, 34, 26, 22, 29, 34, 36, 23, 27, 36, 23, 2, 2, 22, 5, 19, 33, 20, 11, 23, 30, 13, 22, 15, 21, 42, 37, 36, 27, 22, 16, 23, 37, 37, 21, 40, 19, 2, 33, 38, 8, 20, 1, 11, 7, 39, 41, 35, 4, 43, 14, 0, 40, 11, 16, 18, 41, 0, 31, 14, 6, 24, 41, 6, 35, 9, 23, 25, 39, 15, 17, 2, 29, 14, 24, 19, 41, 1, 26, 42, 8, 11, 23, 28, 11, 37, 34, 33, 36, 17, 17, 0, 38, 2, 17, 24, 9, 13, 21, 31, 30, 15, 38, 17, 23, 6, 23, 5, 13, 20, 38, 34, 17, 8, 5, 20, 0, 26, 2, 5, 8, 41, 32, 12, 9, 32, 22, 24, 14, 43, 19, 33, 21, 15, 37, 12, 0, 18, 5, 12, 23, 28, 40, 41, 2, 29, 31, 3, 21, 7, 10, 39, 5, 26, 20, 0, 22, 33, 23, 33, 41, 3, 15, 6, 41], -[16, 9, 19, 12, 30, 10, 24, 39, 10, 20, 12, 35, 41, 29, 6, 31, 11, 19, 41, 24, 22, 12, 16, 5, 24, 0, 5, 42, 2, 20, 2, 10, 32, 5, 30, 20, 2, 2, 20, 4, 10, 37, 14, 24, 6, 6, 26, 36, 27, 15, 18, 16, 13, 14, 9, 30, 3, 43, 7, 31, 20, 42, 36, 0, 33, 31, 17, 19, 6, 15, 9, 42, 2, 38, 25, 43, 28, 12, 16, 5, 30, 37, 25, 37, 33, 6, 24, 30, 43, 18, 17, 19, 1, 20, 6, 29, 41, 39, 3, 34, 4, 18, 31, 23, 26, 3, 42, 1, 36, 16, 7, 1, 1, 14, 12, 30, 32, 42, 28, 41, 28, 2, 34, 30, 39, 36, 24, 18, 11, 26, 18, 29, 10, 26, 40, 10, 5, 35, 41, 28, 19, 6, 32, 18, 29, 34, 3, 34, 19, 27, 28, 13, 40, 3, 29, 24, 29, 32, 23, 22, 5, 31, 33, 32, 0, 36, 34, 24, 42, 12, 38, 39, 42, 17, 12, 4, 41, 6, 34, 31, 4, 2, 36, 6, 8, 37, 28, 7, 32, 13, 35, 43, 19, 30, 41, 18, 39, 13, 12, 18, 7, 9, 20, 10, 8, 28, 26, 3, 10, 17, 37, 31, 40, 26, 18, 34, 22, 10, 15, 34, 36, 9, 32, 38, 34, 21, 6, 12, 10, 41, 2, 20, 24, 27, 31, 12, 32, 3, 4, 26, 1, 43, 5, 38, 7, 6, 39, 21, 20, 33, 5, 41, 21, 14, 2, 29]] -w1Encode: 5A261829151623B62A5A7A0262199454F100AAD4811FA6A05213818B85AE96833959781E65B126E056866349665AD05020795E81443552C8308B9115CE7AA998A86EA8018CDAC43817B18D94E800E8C1919BA15EC4A610C8437DC9D92D61E338C2E034EA28A4A0E98D9FC78C0414888F1005D8089CE9806AE7F90C13032C89166AE83796CC2751A4977543289CA6A36D6B3331A53469A973AA5F348ED57281A8139C10939A9BF609660210D0C52D806339D891151B688244580481B36D1E8A5893C70457E564DE30721302001520814B9112D8A049D3709A82C34CD7898ADC8214D588A6D6467551247963770249993D8020A689B4A822441CA2C0414E256C4353044F199911E71498066C4AE805E15718D1A1352933AEE61A890B770E68567EC9C15D86BA2498025C5D047DDDC0251D9924933701EBE55C0F37AE5033A822B8A849079E8F9585A03750C6A50DAA23918CCAA04ED9411D1955D3B3054290A484058EE2D4208262390E3AAA9379A901C259907646C8948CC664AEE840795EC98016982908913A46554E4219748D23644AA742D5A85669B4294D3A84431A6D8BE268A148968EB40515925094B751C445459E598663B96CE20A0CC0553813F86485163253232AA2667522796DE42508563185D472798DF5546A496E16749565854E42682254B01C673A12AB03A00B24A5C0E718586A8CC9959D4F24740E36A581A622CBC52DA518925104984284254DF5798F195DC655349429464841019A502029C824A08539EB14564FC90052C15C1C9A0ADD37548772161A0558E115A6C363A45032319E829D0AC58C69677CCB94621603151850A802252860E1518240114AE96086A191DB23418D9378C37A7C944A02E1174DC693A88299AD1C03155E9995A18179AB144D016574E9398884F45DDAA00624740481C378A0CAA59C207A2789498B26758A862AC5987293014A9D3888D3C635E8D0611D7859C517820029622A639E6AC410A9217E84401A48C91D6033AE93974A67C34847422908A70D4A547EA8268996F28864029A6265304A2A50D8F631E04068C15A988771565458A4952374 - -cTilde: 3202542EF1E239D32BE1BCE5AE4AC8052D578899D653E368E11BC11C5480BA06 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, -1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -cHat: [3919627, 1297980, 1398134, 6081972, 7171056, 414117, 5281780, 4348975, 7918931, 7431142, 1215943, 8115251, 2501891, 2979933, 1056051, 4629893, 4230848, 5517032, 5010294, 1242908, 5704558, 7057835, 5167595, 3777103, 8332766, 3764182, 871542, 3030236, 4134337, 1499599, 629903, 3298916, 7043202, 5792054, 3761978, 5168375, 4405577, 1463501, 6362953, 3665400, 4924397, 1770910, 5888927, 6855914, 6623049, 4617569, 893857, 7522834, 4128327, 6149725, 5470819, 6466910, 859471, 7503366, 8189191, 7145621, 3367182, 5055752, 854574, 688683, 1350696, 7633586, 7780514, 149762, 3827204, 5243543, 7007255, 7896765, 4031704, 3198989, 6511362, 2625684, 707409, 4044804, 4380212, 6873917, 3249697, 6196180, 8144309, 2008643, 1114648, 8375160, 6021177, 1414223, 184153, 1233760, 7440749, 1651110, 5145946, 3429713, 711316, 4656673, 4762729, 2402979, 5522336, 7149217, 6635899, 3916596, 4977936, 3852446, 4974614, 8334524, 6947770, 2445586, 3965586, 5519074, 4007453, 844610, 4907943, 7013082, 1680850, 6478319, 5952188, 4840027, 4010586, 7362287, 906915, 7539708, 807586, 4024537, 7960143, 8176348, 3320526, 6332214, 4792130, 1852683, 3275370, 6462248, 7769861, 8215834, 906817, 3856094, 3635994, 4689596, 3290668, 6821150, 2541025, 3309849, 2872565, 6842164, 6780671, 3170069, 7933475, 3834565, 1969708, 787644, 8047519, 7450286, 5797943, 2767495, 765149, 3193315, 6533871, 3848948, 1152331, 5790716, 954647, 3094725, 5326363, 5378809, 6200227, 1107740, 6063450, 1702536, 6629231, 3690552, 6959494, 7952332, 175194, 1503127, 5354255, 5360654, 984093, 2124869, 6081779, 7193035, 2683375, 4570964, 25881, 89200, 2514996, 4845659, 6569486, 7047346, 4486053, 2436373, 4570647, 1958715, 4000349, 6684928, 7232339, 2339860, 8253972, 1575249, 5717662, 1879230, 5700637, 5242556, 4570431, 3907746, 822927, 1275549, 7424736, 3433068, 3382346, 1929665, 4595276, 7373262, 7737352, 1010544, 5750124, 1401902, 6707993, 3540847, 3101636, 1959639, 1207699, 5199160, 6959323, 7085234, 4460274, 8254126, 3614235, 172046, 4319194, 6411114, 956605, 1619461, 1563488, 4328722, 3707987, 8363476, 1363057, 7438031, 1713753, 4994919, 5105715, 5836002, 1636184, 4545900, 5938112, 2172036, 8199449, 2932876, 7570340, 1689477, 1601356, 4404103, 7173100, 4609631, 1471711, 6745208, 533902, 2577624, 5891929, 3217175] -cs1: [[2, 8380399, 8380416, 8380402, 8380407, 0, 1, 8380415, 6, 8380415, 9, 8380408, 0, 24, 7, 4, 5, 2, 8380406, 8380412, 6, 8, 3, 8380414, 8, 8380408, 8380414, 13, 8380402, 8380403, 8380404, 4, 8380414, 8, 12, 5, 8380407, 8380406, 8, 8380403, 8380413, 0, 8, 8380415, 8380416, 1, 7, 8380412, 8380412, 3, 1, 5, 8380405, 8380412, 10, 8380416, 5, 6, 9, 8380416, 8380406, 10, 8380414, 8380412, 16, 7, 8380413, 8380415, 0, 6, 1, 3, 17, 8380412, 8380400, 8, 8380398, 5, 7, 4, 0, 8380412, 8380410, 12, 11, 12, 13, 8380413, 8380411, 8380416, 8380403, 8380398, 8380413, 8380413, 8380411, 3, 8380414, 9, 16, 7, 10, 5, 8380407, 8380406, 8380404, 8380415, 5, 8380412, 0, 0, 8380411, 8380406, 13, 0, 8380414, 1, 8380413, 0, 8380406, 8380415, 8380415, 17, 8380413, 8380411, 8380405, 8380412, 8380413, 5, 1, 12, 3, 8380416, 9, 9, 12, 8380416, 8380396, 8380404, 8380410, 8380412, 8380416, 8380415, 12, 13, 9, 18, 20, 8380404, 11, 8380410, 8380407, 0, 8380400, 3, 8380400, 8380410, 8380410, 8380416, 8380415, 11, 9, 8380402, 8380405, 8380395, 8380413, 8380410, 2, 5, 8380412, 8380402, 8380411, 6, 8380403, 17, 8380412, 18, 8380401, 9, 2, 8380416, 8380416, 8380408, 1, 8380412, 8, 8380416, 16, 8380411, 8380406, 8380405, 8380412, 9, 5, 11, 19, 9, 4, 8380412, 8380392, 0, 1, 8380415, 3, 8380408, 9, 8380413, 8380410, 2, 21, 3, 16, 8380408, 8380414, 8380406, 8380407, 3, 8380415, 18, 8, 14, 3, 8380413, 8380416, 11, 8380406, 0, 11, 4, 8380411, 1, 3, 2, 8380402, 8380413, 6, 8380407, 8380415, 8380408, 8380411, 8380403, 8380412, 1, 10, 8380414, 5, 2, 8380404, 8380415, 4, 8380412, 10, 14, 2, 8, 8380412, 8380407], -[8380407, 12, 8380404, 0, 8380416, 8380413, 1, 8380403, 20, 8380416, 9, 1, 4, 8380414, 20, 8, 8380406, 13, 8380413, 8, 8380402, 8380410, 3, 8380414, 8380403, 5, 8380410, 6, 17, 8380414, 8380416, 8380414, 8380411, 8380404, 8380408, 8380415, 11, 8380415, 8380405, 3, 8380409, 8380414, 6, 0, 0, 8380415, 13, 8380408, 4, 9, 8, 5, 7, 8380408, 5, 8380413, 0, 8380416, 1, 6, 0, 8380405, 14, 8380414, 4, 1, 8380414, 8380410, 8380412, 8380406, 8380415, 8380406, 8380413, 1, 1, 23, 20, 10, 8380399, 8, 11, 8380414, 8380415, 6, 5, 8, 8380414, 8380411, 8380412, 8380406, 8, 8380411, 9, 14, 2, 8380416, 7, 8380408, 8380390, 8380406, 10, 8380414, 8380412, 2, 8380411, 8380412, 8380416, 13, 2, 1, 24, 8380403, 8380408, 1, 8380415, 8380411, 8380413, 3, 8380410, 8380409, 8380415, 8380413, 8380398, 20, 16, 8380401, 8380413, 7, 8380412, 8380409, 2, 8, 4, 8380387, 0, 8380414, 2, 11, 9, 4, 4, 4, 10, 6, 1, 8, 8380416, 8380413, 6, 8380407, 3, 8380411, 8380409, 8380406, 8380413, 8380414, 6, 8380411, 8, 13, 8380404, 1, 8380415, 8380411, 6, 8380405, 7, 8380414, 4, 8380414, 8380416, 8, 1, 3, 0, 12, 8380415, 8380405, 4, 8380405, 2, 4, 8380410, 8380409, 12, 8380414, 9, 0, 9, 5, 7, 8380412, 16, 4, 8380412, 15, 8380412, 8380412, 3, 8380402, 8380416, 8380409, 8380409, 5, 2, 3, 7, 8380408, 4, 12, 8380416, 8380416, 5, 11, 16, 13, 17, 8380403, 8380415, 8380410, 12, 8380397, 8380411, 24, 7, 20, 6, 5, 6, 8380413, 11, 9, 0, 8380409, 8380414, 8380409, 2, 8380406, 12, 8380414, 8380411, 4, 8380413, 8380406, 8380407, 4, 8380411, 13, 8380396, 8380413, 8380411, 6, 16, 8380410, 8380416, 17], -[8, 8380413, 8380415, 3, 2, 2, 8380413, 8380403, 19, 8380400, 1, 10, 8380403, 8380410, 9, 6, 7, 8380408, 4, 27, 8380399, 5, 1, 8380406, 21, 8380410, 8380406, 9, 9, 8380404, 8380404, 8380402, 11, 8380410, 8380405, 2, 8380408, 2, 9, 8380405, 2, 3, 2, 8380403, 8380412, 7, 0, 9, 2, 8380412, 4, 11, 4, 5, 9, 7, 7, 8380399, 8380415, 11, 8380403, 8380416, 16, 2, 0, 8380414, 2, 13, 8380407, 2, 8380407, 8380413, 8380412, 8380415, 8380415, 8380410, 11, 0, 0, 8380414, 13, 8380415, 5, 11, 8380413, 7, 4, 5, 8380414, 7, 8380415, 4, 3, 1, 8380411, 8380401, 8380404, 8380409, 8380416, 16, 6, 3, 8380412, 8380413, 0, 4, 8380402, 6, 8380414, 8380400, 8380411, 2, 17, 17, 8380409, 13, 8380416, 8380405, 0, 1, 7, 8380414, 8380406, 12, 2, 8380411, 4, 2, 8380413, 4, 8380410, 8380412, 8380415, 9, 3, 8380415, 2, 4, 4, 8380411, 8380415, 8380414, 8380413, 5, 14, 8380408, 12, 5, 8380416, 6, 7, 14, 8380415, 8380410, 8380412, 7, 8380406, 1, 3, 3, 8380404, 8380410, 8380406, 8380411, 2, 8380404, 7, 8380414, 8380405, 6, 8380410, 4, 8380413, 5, 0, 12, 8380394, 9, 8380414, 8380414, 1, 8380411, 2, 1, 10, 8380409, 17, 8380409, 2, 6, 8380405, 3, 8380408, 8380415, 3, 8380416, 8380415, 6, 8380411, 8380409, 1, 8380416, 18, 5, 8380413, 8380405, 1, 10, 1, 4, 8380407, 3, 8380408, 8380408, 7, 7, 8380405, 17, 8380409, 8380398, 17, 11, 8380408, 8380415, 5, 12, 8380404, 8380392, 6, 7, 8380413, 7, 8380410, 11, 8, 8380411, 6, 8380410, 8380414, 0, 1, 7, 8380414, 4, 8380411, 8380415, 0, 4, 8380412, 0, 8380407, 8380409, 3, 8380414, 8, 13], -[8380411, 18, 8380409, 8380408, 8380405, 8380410, 8380402, 8380402, 8380406, 3, 8380408, 8380407, 0, 8380410, 3, 22, 8380407, 8, 10, 2, 4, 5, 9, 6, 13, 16, 0, 2, 10, 8380409, 8380393, 8380410, 21, 8380411, 3, 8380414, 8380408, 8380406, 8380414, 1, 8380402, 2, 1, 8380411, 1, 1, 8380412, 0, 8380415, 11, 12, 8380414, 9, 8, 8380415, 8380415, 8380407, 4, 21, 13, 4, 9, 8380400, 8380406, 8380403, 8380410, 1, 8380407, 0, 8380416, 8380407, 8380403, 8, 8380396, 1, 4, 3, 1, 8380416, 1, 8380416, 8380414, 8380406, 19, 10, 0, 7, 8380411, 8380414, 8380410, 2, 8380402, 8380415, 1, 8380415, 8380408, 8380407, 8380408, 3, 8380403, 8380406, 19, 1, 7, 8380407, 12, 17, 8380401, 8, 4, 16, 6, 2, 8380405, 8380414, 8380409, 8380416, 3, 8380404, 7, 9, 3, 4, 8380405, 5, 8380413, 8380416, 8380415, 8380407, 10, 8380406, 8380409, 4, 10, 3, 5, 4, 12, 8380404, 8380403, 6, 8380415, 0, 11, 8380413, 14, 8380415, 8380396, 8380410, 8380401, 8380416, 8380410, 8380401, 2, 14, 8380412, 6, 0, 8380398, 14, 8380413, 8380415, 8380415, 8380409, 7, 8380411, 8380406, 13, 6, 8380413, 17, 11, 6, 0, 8380407, 8380413, 8380415, 8380415, 10, 8380402, 8380414, 8380411, 8380404, 8380412, 6, 7, 14, 8380415, 3, 1, 8380413, 11, 4, 15, 17, 8380415, 8380392, 3, 8380409, 5, 21, 6, 4, 8380413, 8380416, 6, 8380402, 1, 8380416, 0, 8380409, 8380405, 8380413, 8380402, 8380393, 8380406, 1, 8380407, 14, 1, 15, 9, 8380411, 3, 7, 8380416, 5, 2, 18, 0, 8380413, 3, 3, 0, 4, 2, 12, 7, 8380408, 8380410, 8380401, 3, 8380413, 8380407, 8380406, 8380414, 8380408, 8380416, 8380406, 8380406, 8380415, 13, 11, 10, 5, 12]] -cs2: [[7, 13, 8380415, 8380414, 8380406, 8380415, 5, 8380415, 8380415, 18, 8380405, 8380409, 8380415, 8380392, 5, 0, 2, 8380410, 8380407, 8, 4, 1, 11, 12, 8380406, 10, 8380404, 8380407, 8380404, 8380407, 8380409, 1, 3, 21, 8380414, 9, 8, 8380413, 8380413, 8380406, 6, 2, 8380405, 8380410, 8380409, 8380414, 3, 5, 8380407, 8380416, 5, 9, 2, 8380406, 3, 8380410, 8380404, 7, 8380412, 8380411, 8380406, 8, 8380407, 8380408, 7, 8380408, 8, 4, 4, 0, 3, 0, 4, 8, 3, 8380412, 8380413, 1, 4, 8380414, 10, 15, 8380416, 8380411, 8380416, 8380410, 8380400, 8380415, 8380397, 0, 8380409, 8380406, 3, 0, 8380415, 15, 8380414, 19, 8380402, 0, 6, 0, 3, 10, 8380409, 8380413, 6, 6, 16, 8380411, 8380416, 5, 8380403, 8380412, 8380409, 5, 14, 1, 6, 8380412, 8380401, 8380410, 8380408, 8380413, 11, 2, 8380411, 8380414, 3, 9, 8380412, 8380399, 10, 8380400, 8380410, 14, 8380402, 14, 8380415, 4, 14, 8380411, 19, 11, 8380416, 3, 8380412, 8380412, 8380414, 8380408, 8380407, 9, 8380410, 16, 1, 8380412, 8380410, 8380402, 8380412, 7, 3, 6, 8380411, 0, 3, 2, 8380413, 8380412, 8380408, 10, 12, 4, 8380408, 8380411, 8380415, 8380411, 8380414, 4, 2, 8380407, 5, 8380413, 3, 3, 8380413, 2, 4, 12, 7, 8, 8380405, 3, 8380399, 8380414, 8380415, 8380413, 12, 8380407, 8380416, 10, 8380407, 8380414, 20, 16, 2, 8380409, 8380407, 2, 8380404, 4, 4, 8380415, 10, 2, 8380412, 8380415, 0, 8380415, 9, 2, 8, 8380412, 8, 4, 8380411, 6, 8380411, 2, 8380412, 8380401, 8380403, 16, 8380409, 10, 11, 5, 11, 1, 0, 8380407, 8380407, 8380405, 8380412, 8380402, 8380416, 12, 8380408, 8, 6, 4, 5, 4, 10, 3, 8380405, 2], -[4, 0, 8380413, 1, 7, 1, 8380414, 1, 8380413, 8380404, 8380414, 3, 8380412, 1, 0, 8380407, 8, 2, 6, 4, 4, 8380407, 8380410, 8380411, 9, 6, 11, 0, 8380415, 8380405, 8380401, 0, 8380399, 11, 8380414, 8380412, 2, 8380405, 8380392, 8380415, 8380412, 0, 8380406, 7, 9, 8380411, 8380403, 8380415, 8, 8380412, 1, 10, 4, 8380409, 8380405, 8380416, 8380412, 8380415, 8380411, 11, 17, 8380402, 8380406, 9, 8380404, 4, 8380412, 1, 17, 8380413, 8380414, 8, 8380406, 8380402, 8380407, 8380404, 7, 18, 8380408, 8380411, 8380415, 8380397, 8, 8380416, 1, 5, 8380410, 3, 3, 8380416, 8380413, 17, 3, 11, 3, 8380409, 8380414, 8380407, 8380409, 8380412, 5, 8380411, 5, 8380408, 11, 8380413, 8380405, 3, 8380412, 2, 8380413, 7, 8380406, 8380416, 8380410, 11, 8380406, 8380412, 12, 8380415, 6, 1, 4, 8380415, 8380410, 4, 7, 19, 8380405, 2, 8380392, 5, 3, 8380416, 2, 10, 21, 8380411, 11, 11, 7, 8380399, 1, 20, 8380410, 8380403, 8380411, 4, 8380414, 0, 3, 8, 10, 5, 6, 2, 8380414, 8380404, 9, 12, 3, 8380411, 8380414, 7, 8380407, 10, 3, 7, 8380408, 6, 9, 8380410, 8380395, 4, 5, 8380408, 10, 8380412, 3, 5, 8380409, 8380412, 9, 8380409, 15, 8380409, 8380411, 23, 8380408, 5, 8380415, 8380409, 13, 0, 8380408, 8380414, 8380415, 8380412, 12, 8380409, 8380416, 8, 1, 3, 8380404, 8380411, 0, 8380404, 8380406, 10, 11, 13, 8380413, 10, 3, 0, 8380403, 1, 8380414, 10, 3, 10, 12, 8380405, 14, 8380416, 2, 8, 8380402, 8380411, 8380416, 8380407, 8380407, 8380415, 8380401, 16, 8380404, 8380415, 0, 8380415, 8380400, 8380410, 9, 1, 10, 8380408, 9, 8380412, 8380415, 3, 8380410, 8, 8380414, 2, 8380407, 8380411], -[8380401, 8380402, 8380411, 4, 4, 8380413, 5, 9, 0, 2, 8380413, 8380412, 8380415, 9, 3, 8380415, 8380394, 7, 3, 8380413, 8380406, 8380416, 6, 8380409, 8380414, 9, 13, 12, 8380415, 8380397, 8380411, 7, 5, 8380416, 8380405, 8380415, 12, 8380413, 5, 11, 8380413, 3, 2, 5, 4, 8380415, 4, 8380409, 2, 5, 9, 0, 0, 8380411, 8380409, 10, 8380412, 8380406, 8380412, 8380411, 8, 7, 12, 8380415, 8380413, 8380415, 6, 3, 8380407, 13, 11, 4, 8380413, 4, 8380413, 9, 8380399, 8380411, 2, 3, 5, 16, 8, 10, 8380412, 8380399, 2, 13, 2, 16, 8380403, 4, 5, 12, 7, 3, 8380401, 27, 8, 8380410, 8380416, 8380410, 8, 0, 0, 19, 4, 8380413, 9, 4, 8380413, 1, 1, 19, 10, 4, 1, 8380409, 7, 3, 5, 6, 8380416, 8380406, 8380416, 8380413, 7, 8, 8380405, 2, 8380412, 1, 8380412, 0, 13, 17, 8380412, 14, 8380411, 8380412, 13, 1, 8, 8380412, 8380394, 3, 8380413, 25, 1, 8380413, 8380403, 2, 3, 0, 8, 8380415, 8380416, 8380412, 6, 8380416, 8380415, 8380416, 4, 2, 9, 0, 10, 8380402, 0, 10, 4, 1, 8380411, 8380410, 1, 8380414, 8380407, 8380413, 8380412, 12, 11, 8380403, 0, 5, 8380411, 4, 8380416, 8380407, 4, 8380415, 10, 7, 8380409, 6, 8380411, 8380404, 8380414, 8380416, 6, 5, 8380416, 11, 0, 2, 8380416, 8380409, 9, 8380411, 8, 8380414, 8380408, 0, 8380413, 19, 8380413, 6, 8380401, 5, 8380409, 8380412, 8380407, 8380413, 23, 8380413, 2, 12, 8380414, 5, 5, 5, 7, 8380402, 8380411, 8, 8380411, 8380414, 8380411, 8380410, 8380408, 10, 8380408, 15, 8380415, 8380408, 10, 8380413, 3, 8380405, 0, 5, 9, 8380409, 8380414, 0, 4, 1], -[8380416, 8380411, 8380408, 8, 10, 9, 8380413, 8380407, 8380406, 8380411, 0, 26, 9, 5, 8380414, 0, 11, 1, 8380406, 3, 8380406, 8380411, 8380413, 8380402, 8380415, 8380415, 8380416, 15, 8380407, 7, 3, 9, 11, 10, 8380415, 8380408, 8380416, 0, 22, 15, 5, 3, 8380415, 6, 17, 0, 8380415, 2, 1, 8380397, 7, 0, 9, 8380408, 3, 8380409, 8380404, 8380408, 2, 4, 8380410, 20, 8380407, 1, 8380412, 8380416, 2, 10, 5, 6, 1, 0, 8380412, 8380402, 8380411, 7, 2, 8380410, 12, 15, 8380402, 8380405, 8380411, 1, 2, 8380414, 8380413, 6, 8380409, 11, 8380411, 8380405, 8380415, 8380416, 6, 11, 11, 8380413, 6, 1, 5, 8380400, 1, 11, 9, 8380402, 8380404, 8380407, 8380408, 22, 8380414, 2, 3, 10, 8380409, 1, 12, 14, 2, 8380407, 12, 8380415, 8380411, 12, 0, 14, 8, 8380409, 8380396, 8380416, 8, 11, 8380412, 6, 8380401, 6, 8380414, 1, 8380414, 8380400, 0, 8380410, 8380391, 5, 11, 8380416, 18, 12, 8380414, 8380415, 8380408, 6, 9, 8380413, 13, 8380414, 8380401, 3, 8380405, 1, 7, 14, 8380409, 6, 8380409, 8380413, 8380401, 13, 6, 6, 8380415, 1, 8380414, 8380407, 0, 4, 8380408, 0, 8380412, 5, 8380411, 16, 12, 12, 8380411, 8380407, 8380404, 4, 8380413, 8380408, 0, 8380416, 8380416, 8380413, 3, 13, 19, 5, 8380414, 12, 5, 4, 8380415, 9, 8380408, 2, 8380407, 4, 8380412, 8380416, 8380412, 8380408, 2, 0, 8380408, 8380413, 8380399, 8380416, 8380411, 4, 11, 8380411, 8380413, 8380408, 8380394, 0, 11, 2, 23, 6, 7, 12, 8380409, 6, 9, 3, 8380398, 0, 8380404, 2, 8380412, 8380398, 14, 8380401, 4, 9, 4, 8380416, 3, 4, 8380412, 8380413, 8380394, 16, 0, 22]] -z: [[8326403, 57133, 7318, 8379181, 8259040, 8372149, 75888, 8255636, 12226, 8283522, 110470, 8355778, 87493, 8378437, 23047, 73282, 103668, 8346364, 8340345, 11560, 13209, 99138, 8358183, 8286641, 8356984, 58897, 185, 8282786, 8371393, 86874, 8339493, 8354819, 8334856, 8365209, 106683, 104052, 8334673, 46091, 8345795, 31577, 8361552, 8335659, 8329871, 8249545, 104190, 22950, 67718, 90554, 8370976, 8365339, 8256101, 8300833, 100126, 125053, 8297516, 8289510, 8362997, 13980, 8316259, 104587, 35943, 110699, 39460, 8375031, 8301933, 8261376, 8322602, 10731, 8346206, 8345145, 37840, 130167, 121151, 33533, 8303878, 8326018, 8278550, 14027, 8341235, 52192, 73035, 8378662, 27426, 8314093, 2086, 68115, 8292281, 70154, 8290672, 28083, 32702, 108286, 8307599, 84620, 8287534, 67218, 8303234, 8346013, 8380347, 127665, 8254254, 8257734, 62187, 8291605, 8374245, 56022, 8377317, 51791, 8369069, 8320673, 36619, 93277, 67140, 8366465, 8324819, 8367696, 44012, 38545, 8299445, 8368671, 8331371, 8335554, 2190, 8348061, 23855, 8327217, 121572, 8368044, 87837, 58892, 5834, 59268, 15013, 8331723, 106097, 48678, 129118, 74607, 117220, 37332, 71557, 8317190, 8354213, 8307161, 8295506, 103660, 8308702, 4430, 8359499, 8294359, 64454, 8305989, 52986, 18508, 122882, 18336, 7862, 8352649, 88137, 8378999, 8316937, 8320694, 6281, 107213, 86310, 17547, 8282214, 8335281, 8273835, 59310, 85734, 85313, 8328628, 32666, 108553, 58989, 8370874, 8318142, 78552, 24444, 54780, 8310313, 127449, 8305675, 93761, 1665, 8356773, 8341861, 8358556, 55890, 8249757, 8306111, 126242, 8344506, 33156, 42436, 8269137, 29528, 8252939, 59437, 8264070, 8332883, 8327017, 124480, 8250789, 97257, 84686, 3899, 8315218, 99885, 8373765, 73937, 8266930, 7934, 8316152, 29782, 117246, 35232, 35650, 123384, 33124, 97406, 100354, 102121, 127741, 8310535, 8264041, 75183, 34287, 8320633, 44952, 111940, 8307349, 8266455, 8365040, 50581, 95672, 8332363, 8335075, 58566, 18555, 8363220, 8352917, 8289872, 114639, 8320894, 8289209, 8273453, 8302088, 8267136, 8303077, 8298979, 8329596, 75883, 76993, 114660], -[8351159, 56199, 8287451, 8375034, 29592, 10076, 8325295, 90630, 8289292, 8315599, 2379, 8288306, 22366, 55464, 61878, 104863, 8376710, 8348325, 8286412, 98250, 8347365, 8295054, 113683, 201, 102359, 8326276, 65614, 8291166, 8361863, 8289778, 8376666, 8318080, 8249479, 8329466, 8314657, 45879, 12578, 102824, 8261705, 63918, 108397, 8298353, 24619, 99928, 16833, 107803, 8337575, 8259588, 8345452, 8299072, 12458, 8313650, 71209, 94351, 8370690, 24465, 48483, 8293040, 114192, 95498, 21140, 8333027, 119512, 101679, 128047, 123762, 113113, 8344363, 5736, 8345486, 8279082, 8259033, 8294892, 53911, 86200, 130443, 128633, 8273383, 8273137, 8257357, 8319923, 75458, 8262490, 60592, 37311, 11238, 87889, 127314, 8362322, 15925, 8338527, 86029, 87016, 8251402, 8372202, 79271, 8265632, 65413, 67832, 57076, 58648, 8294393, 41340, 38612, 8251490, 82964, 43650, 56919, 8378871, 47910, 80416, 101631, 15196, 12292, 8301399, 35132, 59935, 53308, 8306183, 15626, 8269611, 67994, 40467, 8282226, 39820, 8303421, 8256124, 11315, 8325242, 62164, 110596, 51201, 8350393, 8354574, 107122, 8367270, 8340986, 8291648, 32650, 8270250, 8276128, 115938, 8284367, 68031, 8345706, 8347363, 26865, 8307710, 86751, 39040, 73440, 67573, 38452, 16730, 8270869, 8319927, 74825, 8311954, 6606, 129772, 100476, 113352, 8326643, 8269732, 8290855, 87055, 39702, 8341183, 8330583, 51385, 8374248, 8278016, 80623, 111433, 8289849, 8342368, 8286001, 114080, 8352214, 64670, 8281332, 91080, 8289309, 97427, 8273252, 121918, 122494, 8316907, 55944, 8278935, 8292873, 8336600, 70900, 8332056, 63476, 63024, 104343, 8351939, 117935, 6098, 8250308, 8301376, 81670, 8320325, 8378889, 57980, 8360241, 8325782, 8306208, 55767, 81437, 8303261, 97850, 56199, 8286824, 52406, 8289308, 56328, 60848, 8344298, 8349414, 8250331, 8294650, 8277178, 128539, 8267255, 93059, 8338433, 8371746, 2658, 8304877, 27321, 33384, 8361700, 14408, 8308725, 8371551, 8272703, 122114, 8270805, 101421, 8318967, 8348658, 8256187, 124320, 8378822, 8352890, 23675, 27458, 8304094, 8344015, 8281035, 61874, 8370859, 37659, 8359729], -[8366734, 89923, 8279227, 8341526, 8375978, 8354711, 23839, 8283379, 13781, 25609, 127026, 116155, 89958, 8303465, 8252686, 72862, 8355626, 8278677, 120933, 8375869, 97391, 8349046, 8257275, 14869, 8353761, 19925, 8361897, 8363029, 8377883, 8254136, 31765, 8345774, 8305146, 23691, 80643, 8337907, 8316922, 8311186, 116328, 113664, 120422, 38419, 104937, 5219, 46019, 8262708, 41460, 68692, 117245, 8286072, 8271029, 101776, 8271762, 120000, 8284931, 8285632, 8290028, 8283754, 8334986, 91743, 45559, 8373262, 8361712, 122996, 65350, 24825, 8336906, 8372056, 8314703, 126053, 110365, 87054, 8358937, 33576, 17785, 8263678, 126405, 41158, 8327860, 29321, 8344487, 8288798, 8375085, 8251881, 8262202, 5988, 66067, 59979, 8352836, 8258779, 8362299, 8358017, 12225, 51434, 8309412, 8333338, 8257410, 36026, 8285774, 8366455, 8264907, 8345112, 84665, 68815, 56897, 8301488, 8335762, 91010, 8370301, 8357185, 8313578, 8347585, 2947, 8266161, 8288552, 105796, 36129, 8333036, 31978, 62768, 8304497, 19852, 120685, 8358338, 129084, 9267, 8258831, 59409, 16568, 8354782, 6411, 8266100, 8302088, 74120, 115072, 107987, 8267587, 8293582, 71110, 30032, 8256836, 8353599, 8322980, 10786, 26540, 64684, 8251078, 8283411, 8319007, 33338, 59460, 8349196, 12643, 101873, 57834, 93031, 79263, 8327681, 8275506, 52398, 8373439, 8298779, 8353565, 122836, 8292431, 8372657, 8352120, 126937, 8348810, 8270560, 8301636, 40714, 8333677, 8290342, 115433, 37379, 15336, 8357261, 8306420, 34118, 69191, 8308220, 8357729, 8291547, 8286300, 8347458, 8295268, 8296256, 8344658, 22458, 89226, 8342572, 8332102, 8335576, 14713, 8319354, 8273937, 8354924, 103580, 94411, 65811, 89057, 72928, 8328393, 8322305, 8343277, 130163, 19915, 8268263, 8368162, 57524, 8249442, 8308576, 8339956, 27729, 48711, 114054, 8354178, 85773, 8252960, 8302254, 8378036, 123266, 7100, 7027, 92140, 35285, 8327493, 8281715, 8297105, 8329411, 8253045, 106835, 42890, 62739, 66438, 117618, 97176, 8339351, 82675, 38399, 24617, 8355223, 8351039, 8319685, 125617, 81021, 115100, 8295820, 73600, 59548, 8342253, 20847, 8260833, 348, 8322680], -[122405, 8265866, 126088, 8364806, 60718, 8294431, 8287601, 8283814, 8290083, 39525, 9450, 48309, 8265501, 32784, 59971, 8291439, 124890, 35081, 8300057, 8307398, 24615, 8305833, 116899, 8347100, 8365621, 8321572, 8254774, 8335688, 8250989, 8373043, 119644, 101636, 64630, 8259421, 8346806, 79020, 8289085, 8289944, 8280162, 8322605, 5989, 112590, 20038, 54571, 62679, 93512, 8358650, 8255692, 61393, 8258232, 94981, 37685, 27291, 8365642, 8322563, 8308490, 8336290, 124098, 8274591, 75329, 8376484, 35087, 8335805, 8374659, 76244, 87875, 5522, 7653, 6797, 21123, 93109, 8369980, 8348161, 8360211, 8263840, 8260682, 63060, 122913, 40143, 59457, 56593, 8368041, 8340276, 8298064, 87061, 111501, 8317363, 118151, 16469, 8355816, 59754, 8326927, 56849, 95986, 121057, 123999, 8264326, 18874, 104462, 70611, 8318799, 6483, 99143, 8311828, 45730, 108043, 8315353, 8289175, 3012, 8350149, 8326854, 110019, 8370356, 8251980, 8341828, 42184, 39544, 27015, 8345984, 8249510, 48708, 8293216, 105147, 8326, 125626, 121399, 8317656, 52995, 8338904, 17579, 45621, 130985, 3136, 94180, 89825, 12707, 8307821, 21150, 8355745, 73291, 8352282, 9446, 68852, 47704, 80764, 22262, 10552, 106625, 8341410, 8331798, 116700, 3743, 8352190, 93787, 8263603, 8356914, 8325540, 54990, 8316413, 101654, 8313597, 8343102, 23238, 8342579, 8301596, 8354336, 76816, 86279, 93705, 8339674, 57953, 109071, 8307115, 8370920, 8286959, 8323532, 8301963, 56548, 74780, 23857, 54163, 8327523, 8280476, 8278737, 8350268, 53931, 8272568, 8288915, 5399, 34512, 8292495, 116200, 8268106, 56815, 8249569, 81136, 126508, 8271448, 8315827, 8316807, 39678, 52838, 96424, 40768, 43032, 77101, 54301, 8283523, 8336546, 8294580, 99472, 42293, 38759, 8353084, 8349978, 111808, 114339, 92308, 71182, 84658, 53031, 8349023, 8306163, 111602, 8280367, 88604, 8253950, 8331407, 8343759, 8283284, 7584, 8336180, 8333368, 8465, 8348713, 8358931, 12856, 82900, 43289, 8291218, 8366543, 66272, 8250570, 42590, 8307634, 8314964, 8300938, 8294854, 8323116, 104691, 8300776, 65534, 37496, 65196, 121399, 8296562]] -||z||: 130985, ||z|| check passed -r0: [[16336, -43434, 81462, -22910, 8316, 11209, 42434, -4837, -27144, -82132, -3552, 7413, 4201, -69199, -23623, -591, 50423, 27202, -43436, -94230, 1484, -49886, -81705, -83544, 52287, 74768, 72166, -85251, 21766, 44667, 676, -25845, -94324, -59431, 94714, -34404, -31946, -23354, 49816, 89353, -61112, -28663, 9890, -24789, 40866, -13150, 43283, -1526, 61546, -55742, -45935, -77166, -44962, -53332, 88484, -82336, -23507, 49466, 93228, -73728, -66204, 14551, -78200, -35788, 16508, -54415, -79216, 80084, -81225, -16500, 81641, 33249, 13018, -22737, -63174, 4316, -19551, -74342, 54625, -68013, 83551, -62150, -49273, -40277, 26980, 45643, -47688, 11172, 83463, 42420, -86576, 91513, 64143, -91837, -51306, 91372, -45660, -25846, 87372, -89700, -30422, 80007, -78136, 27200, -61659, -16520, 65481, -69890, 87659, -16165, 1797, 2186, -17273, 20863, 67304, 45864, -38642, 61348, 91147, 91894, -5901, 28149, 75271, 95002, 23891, -33491, 11213, 63146, -1713, -82800, -64021, 28527, 25197, -88218, 34270, -41371, 74057, 39380, -83717, 15734, -90650, 43432, 6345, -4719, 33025, 30972, -69067, 59168, 61319, 61060, 67349, 88562, -35633, -87011, 15011, 494, 48450, -92824, 12399, -303, 8715, -75436, -68736, -64174, 65126, -28143, 39413, -51423, -61706, 28409, -16266, -87388, 65623, 52500, 79103, 54063, 71397, 60997, 71193, -15868, -77244, -71379, 10556, 33607, -2886, -36195, 26469, -5465, 58414, -17241, -57817, -51409, 52044, -28749, 40249, 42369, -29922, -38178, -63838, 94361, 46274, 49805, 42015, 8986, 67125, 88179, -50440, 8696, -28471, -80544, 76956, 36731, -51369, -60842, -398, -7359, 34976, -81475, 52923, -58096, 94964, 82276, 28356, -53592, -22941, 42206, 16322, -61656, 24383, 61949, 427, 86641, 23188, 82716, -93662, -9652, -27286, 3269, 46734, 34724, -24880, 4, -65353, 16375, 3592, -21702, -73197, -77317, -45509, 60377, 23487, -9821, 68109, -94910, -20199, 66190], -[11634, -88991, -38772, -58122, -58158, 71954, 6830, -89244, -49827, 7579, 53143, -7162, -79615, -11221, -6990, 51430, -10141, -33475, -22162, 60211, 49437, -7706, -15665, 28076, 71461, 3015, -5603, -44643, 25211, -85047, 10000, 31749, -59211, -77988, 23578, -62131, 47591, -5726, 46154, 15727, 64638, 40937, -36972, 72226, -49158, 15568, 88059, -43143, 13784, -64162, 7204, -66094, 60574, 79497, -92584, 1981, 42405, 48046, 80460, -25644, 18776, -21333, -33187, -18428, 29964, 48220, -71560, 93753, -44342, -64815, -90253, 45115, -72277, -31085, 57570, 71792, 35909, 63157, -7758, 32546, -72327, 71406, -23974, 91784, -65191, 77031, 88276, -83596, -25954, -84257, 94361, -25030, -85202, -24717, -39167, -89095, 72941, 76633, -54629, -91450, -46748, -12573, -25291, 71902, 47634, 4134, -36075, 46504, 18840, 36912, 2260, -60626, 66527, -966, 31658, 4255, 57144, -21232, 77423, -76424, -25850, 63851, -91814, -37685, -33483, 76327, -80616, 54336, 93295, -83986, 8124, -92463, 92187, -37242, -86046, 61998, -15826, 2912, -45704, 44800, 41266, 89738, 36836, 33364, 40622, 12874, -63499, 36171, 75088, -34263, 26805, -16555, 5791, -90344, -63371, -39792, 88530, 14122, -68967, 91629, -73624, 59676, 33203, -90232, 88316, -77968, 66187, -8016, -48546, 91543, -59286, -62232, -70774, -65025, 73643, -6421, -33186, 94810, -91709, 86133, -44478, -64515, -12444, -62824, 92345, 43834, -32773, -36531, -18113, -39278, 67532, 34849, -78218, -56198, 74421, -33599, 32033, -20480, 61967, 94848, -89483, -37666, 4429, -42929, 42433, -22382, 79072, -78954, -35311, 2075, -71089, 60972, -2640, 9045, 35111, -9468, -77055, 71730, -66804, -85394, -63627, -20386, 24085, -54232, -68934, 24967, 31435, -56492, -37407, 54185, -69860, 93804, -26469, -84784, 44901, 78355, 59586, -25304, 53028, -13760, 4905, 63650, -3535, -21526, 672, -87905, -44569, -15145, 25225, 17205, 67269, -53365, -37314, -42700, -5479, -70726], -[-10105, 77558, 52235, -41153, 82722, 22884, 2070, 67829, 91901, -28260, -88267, 22357, 67568, 4891, 16002, 61750, -60922, 8887, -57482, 50502, -44950, 61868, 67963, -88065, 66877, 49165, 72355, 12221, 35368, -60810, -88838, 28652, -72897, -83030, -71882, -58978, 9354, 94584, -78106, -87136, 48372, 46829, -91069, 64230, -74782, 26785, 82781, 53757, 17189, -31504, -51195, 70398, -47500, -17741, 89489, -11463, -83789, -44082, -31819, -82990, -63325, -3556, 78787, -32652, -69390, -50687, 38487, -80339, -48157, -92132, 27595, 11043, 21294, -46685, 73522, -13293, -73807, -76501, 156, -21301, 39827, -80964, 45544, -37502, 7773, 65579, 66401, -810, 15179, -62903, -77008, 35670, -2360, -56903, 64521, -79031, 88880, -44180, 48768, 56199, 17707, -72802, -18996, 86222, 87205, -66427, -34099, 22378, 75177, -45117, 8872, 44707, 37888, 68488, 12606, -8933, -24503, 1798, -88380, -87947, -77114, 24776, 16211, -56394, 76999, 83491, -58099, -11041, 67472, -65514, 79988, -28595, 88769, -80208, 86558, -77842, 10720, 130, 3119, 86279, -74661, -35139, 30817, 72157, 33542, -24808, -67055, -12320, 24268, -68329, 68207, -69590, 53305, -47512, -67406, -93413, -7854, 2267, -36770, -11041, 19208, -13175, 67685, 3603, -37776, -77864, -51948, -62890, 23867, 67493, -48901, -27244, -81562, -76967, 82450, 79431, -40012, 8274, 33687, -61229, 88172, -39109, -82343, -38926, 22614, -34508, -65112, 10375, -58594, 69037, 47236, -59479, -73253, 30250, -15993, -57965, -85725, -9106, -89637, 74414, -85087, 82084, -69436, -7663, 65146, -91002, -81378, -76793, -43774, 44771, 74579, -94260, 55853, 49078, 42850, 42802, 72216, 31672, -18153, -28492, 11419, 46476, 70864, -58169, -78260, 11509, 79074, 33645, -21313, 56265, 21693, -5471, -64754, 51825, -20436, 91856, 94826, -17033, 26818, -64927, -42684, 82235, 35534, -26754, -77572, -55180, 66645, 48175, -18354, -18992, -91352, -76158, 80029, 83210, 89044, -7284], -[27588, 68572, -9532, -125, 7794, 71219, -29811, -78270, -82130, 83340, 79573, -39653, -2270, 458, -40824, 59164, 4786, 4943, 22167, 77284, 21272, 9424, 75396, -65313, 2611, -79247, 51125, 52178, -66261, 89411, 53355, -19835, 24701, 19933, -4430, 78814, 4522, -189, -53330, 6884, -29104, 4929, 42828, -90473, 15019, 72664, 68067, -1514, 70191, 40256, -61460, -53681, -22265, -72247, -45258, -68867, 26905, -14214, -79843, 74433, 53011, -23764, 27899, -86484, -40319, -51374, -69957, -6897, -9223, -70367, -38031, 60156, 56293, 70661, 57958, -41329, 83038, 53036, -61122, -47119, -40153, 80003, 60985, 38481, -4786, 64962, -42671, 12860, -36574, -6449, 89475, -48945, 83385, 56757, 59113, 53643, 75076, 5291, 81830, 91689, -33581, -35691, -20658, -2078, 50375, -50001, -86945, 85423, 70293, 44015, 31175, 45805, 68880, 56670, -1570, -82073, -51893, 27441, -57707, -42213, -34705, 69204, -48974, -62361, 36143, -79903, -16430, 28141, -9340, 69021, 10230, 34115, 68980, -37482, -22881, 9015, -93953, 41982, 21125, -22505, -14412, -8616, -19503, 19393, 73469, 63276, -10729, 6905, 41085, 6705, -48014, 6888, -78702, -79158, 82766, 9064, 73769, 48464, 88788, -34421, 28985, 5691, 55214, 14265, 94305, -7548, -24827, 15131, -3263, 21495, -27700, -93636, -73181, 19146, 63636, 69879, -25282, 87828, 13284, -64194, -59674, -11245, 90973, 41529, 92236, -4850, -70489, -67042, -76201, -57624, -32747, 71175, -52081, 4612, 9298, -48044, -72715, 8612, 88456, 90758, -28931, 11504, 7158, -79902, -52084, -35663, 86622, -71070, -18713, 21084, -13795, 32393, 75566, 67565, 10536, 8466, 18534, -10420, -5989, -29120, -81743, -16253, 2521, 53732, -15457, -66566, -31750, -13032, -1348, -77664, -85579, -79665, -20981, 19423, 85524, -34413, 5615, 52175, 69918, 66489, 19046, -83142, 6488, 47474, -24297, 23166, 89811, -14600, 82930, 20485, 57296, -44658, 32557, 54031, 71318, 9227]] -||r0||95002, ||r0|| check passed -cHat * t0Hat: [[6685568, 3625903, 5012222, 7942920, 1902157, 4674810, 4210018, 6254152, 5621555, 4432127, 3161400, 2991916, 3326774, 463020, 6499212, 7545109, 1598396, 893422, 3163648, 5135103, 6373010, 3604652, 4524410, 4739349, 5400888, 8201760, 4132841, 7133472, 8207611, 5865764, 8187623, 6619652, 5873078, 816586, 5607839, 5521262, 1486689, 4790054, 7495330, 6792367, 4284229, 6447705, 4677784, 5727378, 3637327, 6239992, 6416001, 8244177, 3521273, 7866351, 1162684, 796876, 7193167, 5621796, 7872890, 4085570, 1937406, 7367082, 7419925, 4465483, 5833208, 2028702, 3579262, 8343516, 5972819, 3635698, 6909496, 3510491, 6188849, 7150162, 4334377, 7559412, 7575912, 2828153, 815803, 912994, 4845107, 7582661, 6018602, 2963398, 8101329, 8148423, 3077187, 3613418, 4894986, 7174916, 2122661, 4202334, 1638438, 1153711, 3636526, 6757059, 4768277, 1669914, 6919913, 7654547, 2822931, 4844561, 291170, 1609726, 3209356, 6825065, 3478963, 4226210, 6984364, 1708011, 1015730, 8012597, 1075022, 5394660, 3075880, 3295663, 5189888, 6648212, 7885222, 4462030, 7938940, 1685976, 5087381, 7424844, 6998526, 4048553, 4531914, 4457455, 3184986, 6704822, 1444012, 5604810, 3364295, 4042205, 646751, 2296249, 5532886, 5491991, 8221389, 1607092, 10719, 2437729, 5667453, 7496711, 3045522, 7811675, 295426, 6539280, 5360181, 3649788, 6749425, 251671, 4583273, 7325646, 8142349, 3008227, 8159953, 8325364, 5225204, 6512180, 1515680, 5407684, 3337980, 7760263, 5531107, 1017737, 2370678, 4199679, 6594891, 6155518, 8290083, 2408535, 7828841, 2063891, 5117968, 1748001, 7713528, 6737926, 7231922, 2244033, 5400646, 534305, 1931038, 3622972, 7672285, 7057117, 2954284, 1706675, 4874896, 4020626, 6185699, 6254840, 673693, 1842486, 1030324, 523369, 981961, 3259213, 7139107, 3515467, 5870652, 5372536, 4271429, 7708552, 790667, 4931534, 3287042, 4199681, 833310, 1429251, 5744840, 391512, 5766115, 4344744, 527685, 3247692, 6409157, 1837796, 4163043, 1870759, 3538947, 4953798, 5453154, 475685, 7386870, 697005, 7222579, 7789105, 6776799, 6584776, 2488765, 8202851, 19099, 6997181, 5751379, 5175618, 7556663, 7776793, 3358382, 1375303, 3765405, 5084620, 7354498, 1188967, 6718785, 2590437, 6515971, 4536811, 4751488, 486634, 8274819, 7051410, 7480138, 3756206, 5528785, 4337911, 1774785, 6940669, 4842811, 7522923], -[4777632, 90958, 8065217, 584878, 6688472, 5835341, 8057752, 7925126, 4307379, 1526365, 6347656, 5095628, 5273048, 3594180, 237683, 4235200, 2183933, 4287717, 2230703, 5797096, 5969514, 5009083, 4184842, 7150673, 1846937, 329124, 7836484, 6566958, 7698903, 6228067, 7026266, 7966099, 6455411, 6746516, 5854365, 7488526, 405408, 1690367, 1112905, 6257108, 6814315, 3092429, 2388725, 7409143, 1980823, 1356970, 5491680, 5331359, 400255, 5556751, 4963758, 8180156, 2648809, 4876436, 7591510, 6671759, 1472349, 1698645, 5766877, 2682509, 3994719, 4740754, 7394025, 1346248, 4156446, 554443, 7132228, 3104211, 5448113, 7475313, 5122591, 4778194, 1602838, 897997, 8066280, 7959512, 5781856, 4672166, 1251226, 2741628, 7392765, 3539539, 1414309, 3659044, 6436845, 839651, 7774321, 4133689, 3480116, 4175498, 7490220, 4262421, 824976, 7653312, 2140452, 3347915, 6591431, 7778504, 6849694, 7156045, 1907079, 5125734, 5171870, 3149764, 260707, 5540041, 836441, 2284900, 6416551, 2120903, 7473851, 518907, 7287610, 7250106, 3460051, 7976026, 7741345, 6014641, 6041382, 7521296, 4684126, 6159923, 8321636, 2189133, 7358395, 4934821, 1312244, 6482982, 519950, 6313820, 1673019, 4856593, 3370058, 5453333, 3096125, 190418, 6934446, 2798240, 6253558, 5575369, 7510445, 6769503, 4799043, 6814139, 2508501, 6256292, 5103841, 7495729, 4102569, 5958596, 3256313, 5121975, 496217, 2384396, 3794502, 1967788, 4032826, 3923388, 4821238, 8376512, 4470271, 3227481, 8087294, 1672895, 2515867, 7198770, 6965743, 6093207, 6201998, 2804490, 5987257, 3474132, 5818263, 1213221, 3992831, 6107321, 1681018, 1506046, 6950433, 2573581, 7107012, 633100, 437009, 440695, 7808299, 3847524, 2871743, 1131391, 1136901, 6588403, 5618339, 2118648, 3850726, 174386, 1787494, 5498702, 2117448, 6035646, 1781570, 2452991, 4203583, 4872548, 1741208, 4395634, 2332049, 5352181, 5729824, 2563876, 2666362, 7904344, 8161966, 276990, 7780010, 5811155, 7297876, 5577247, 7015500, 5171524, 5950108, 3925618, 1891888, 884027, 3917088, 6302190, 6686183, 3426558, 4314909, 5072645, 2569603, 1658980, 2702729, 5299574, 2191357, 5547989, 3909308, 6002106, 5468592, 2116062, 2901876, 285824, 7300454, 1399895, 6536839, 7372521, 6684107, 3150034, 8192747, 956305, 5597780, 605553, 704411, 3120592, 273238, 356569, 8379572, 7024314], -[6626149, 6184842, 4559639, 3664809, 1188987, 6544145, 2698182, 8118771, 4144600, 140242, 1139078, 2045111, 6709581, 8048885, 8220443, 5311540, 2355211, 658576, 853096, 375812, 3940529, 4646013, 7519588, 2887320, 6921424, 2238493, 3577417, 746623, 6541856, 4156930, 4692206, 1500810, 658764, 1428054, 2565263, 4024975, 5569604, 8101088, 3646769, 6054368, 224793, 561663, 71854, 1596386, 1138682, 5140215, 4210574, 6109889, 5343235, 1394516, 440936, 5431025, 1123755, 3137786, 2662307, 6823315, 4296587, 4047109, 4495054, 2927075, 688667, 842189, 6859979, 4361088, 4767130, 1245178, 4814003, 6190357, 8353255, 6603724, 772986, 5115712, 856662, 2150540, 793810, 2237476, 5928899, 6653313, 7657516, 2782105, 686286, 2359207, 3301788, 3746464, 1051369, 447586, 1253449, 3987005, 3452763, 2330946, 4806, 6798325, 5614695, 8128093, 6752975, 3131978, 515815, 649235, 7086866, 1422756, 1857907, 2924238, 6362976, 5887214, 366680, 4666326, 855542, 1173140, 4018289, 1590071, 4109395, 3054615, 5126555, 3404998, 5478808, 1895573, 3575087, 7215808, 3681348, 4420836, 4232529, 2540140, 4376506, 5177001, 1718798, 6650961, 147943, 2491141, 2092304, 7430238, 3899431, 7659853, 7911378, 491458, 2512576, 2778365, 8287290, 3110753, 6619471, 4761790, 1814791, 5177889, 3414072, 6842552, 7507014, 7453053, 2066170, 969144, 3829595, 1122217, 6025527, 4662191, 6980182, 2769374, 5371004, 4033030, 8322985, 4212617, 6233537, 2558895, 1342314, 5887145, 224970, 6614366, 841896, 7912198, 5672957, 1605759, 6510974, 6581695, 6426644, 6083466, 3416363, 1576642, 2670183, 6514419, 1156408, 7259730, 5391201, 6603898, 7871533, 291692, 6819461, 4559221, 7471441, 400585, 4825159, 4355524, 5202799, 3370376, 5873891, 8289272, 6603383, 690207, 681601, 4800681, 3136478, 3580323, 1931518, 6133002, 2038596, 2159437, 1977880, 6432249, 4752041, 2192026, 288762, 3078068, 436432, 2280837, 2347979, 2784279, 492756, 3566762, 2713446, 2637033, 170433, 7722196, 1887036, 1966639, 876086, 6638310, 2669262, 5781417, 5529962, 2374151, 6050285, 7512950, 2251075, 7164284, 3152770, 1461044, 3598619, 4892098, 6769977, 3144734, 5284387, 2781969, 7487799, 8182969, 8005301, 501576, 4358214, 1354692, 4903222, 266272, 3558940, 5645481, 398886, 4190637, 4838149, 821895, 1519097, 6665848, 6801050, 1133685], -[6774059, 2102179, 2377584, 6403672, 5836339, 2437038, 3875612, 1383305, 5749753, 439798, 4497464, 2573238, 8325184, 5985321, 5879206, 7991253, 3954615, 4532081, 7378153, 2897353, 7607669, 7871557, 2052344, 3770882, 8109866, 379854, 3495435, 6418489, 4172775, 6017183, 5594945, 3014871, 1577489, 5744290, 1439450, 8240558, 7802307, 4844235, 1595073, 5747436, 1684631, 1012762, 199424, 6714455, 4648534, 3259430, 1717246, 2588137, 5904817, 1475608, 1683897, 33138, 8167545, 5010214, 1388883, 7682189, 8205879, 4369014, 1199064, 2707376, 3803449, 3958018, 2558975, 6116094, 1517011, 2496041, 2102656, 5665246, 1795286, 4305313, 7471634, 4038680, 3469101, 4191788, 4017111, 961110, 1538375, 2787213, 2895046, 6533616, 3839690, 4580654, 598350, 6869323, 4675920, 184069, 6196217, 6474898, 7884053, 2174497, 4680432, 7921244, 4686801, 5798428, 6676079, 4881357, 6011674, 5515877, 6040897, 3569047, 1687014, 5947981, 8063414, 5100851, 1113929, 7799540, 6306723, 7360386, 5555529, 1599010, 3193158, 6961655, 7342684, 4348279, 2804512, 4791630, 4604154, 7336638, 4465571, 1839495, 593541, 3773884, 5861736, 3533220, 4204044, 6111158, 8134914, 682140, 3714906, 1563735, 444959, 6349686, 8227695, 713745, 7060829, 2352291, 3980655, 5676051, 8327641, 5255103, 5485292, 4369112, 2090874, 4811390, 345563, 1494132, 7908940, 3143429, 3356413, 2253455, 4516289, 3803896, 4430722, 276037, 7070464, 5016076, 1170365, 5810533, 1468888, 1805911, 371939, 7091434, 2495127, 3653956, 7694087, 4603531, 3559766, 5790063, 7130400, 5681892, 5177130, 1088404, 8031013, 1360481, 1343760, 4438259, 6508023, 2689194, 6219683, 6121896, 3240410, 2023915, 5793528, 7489391, 5695883, 3500173, 2483629, 2088389, 854427, 2295117, 4400093, 4979605, 1825057, 1637819, 4867287, 2066572, 197344, 3748422, 5962671, 6832411, 5366526, 221300, 1086318, 4293529, 3800139, 6844685, 6173862, 2216196, 2485989, 4437816, 1562014, 3073611, 1306858, 6646895, 11537, 5338420, 2292763, 1278488, 4367567, 3220101, 4021396, 6394718, 371771, 3458726, 4055644, 1430384, 3041433, 6757771, 5550262, 63244, 3341132, 5324686, 403668, 1003946, 4864365, 5212294, 633338, 6718525, 2024173, 3233684, 7506929, 7416754, 1752488, 4394426, 857108, 1666296, 7646414, 7564059, 821297, 4062920, 6489464, 5233336, 7451138, 5559688, 3935773, 911345]] -ct0: [[8373033, 8364566, 3534, 8346680, 8373079, 8358277, 11564, 24947, 21052, 4504, 8380387, 8379636, 8372277, 8368576, 8371438, 8379841, 13012, 8369219, 8377262, 18148, 14402, 14008, 1570, 8358254, 24215, 8361215, 8378023, 19158, 7485, 10057, 8353390, 8371328, 8362178, 8377995, 8375273, 15204, 12033, 3031, 1237, 8352033, 22929, 8376043, 24947, 43356, 41536, 8370519, 8341895, 8350821, 8359706, 8373709, 8428, 21087, 8344914, 8372783, 8374932, 3655, 16482, 13133, 6028, 11680, 8379205, 8345685, 8365730, 8359398, 11165, 9036, 8360553, 7294, 10200, 8468, 9238, 8377810, 83, 8376470, 8362395, 833, 3583, 8371307, 7415, 5166, 871, 8365664, 4021, 11776, 20300, 11126, 11823, 24035, 8357262, 8367754, 13005, 8360546, 8377143, 6652, 11964, 11867, 8341845, 8362226, 8810, 8352043, 3706, 20835, 20640, 8363521, 6124, 8377923, 11315, 8357859, 19554, 8373686, 8352240, 24214, 16232, 8369301, 8379044, 17703, 13019, 9847, 8373512, 8372273, 8373964, 8375599, 3003, 8365893, 510, 8359269, 8366825, 8387, 15478, 6580, 8380299, 8367944, 846, 8361221, 8350276, 16461, 5274, 8376061, 8349827, 4213, 8377575, 8376065, 6512, 8375008, 869, 965, 17201, 4277, 22, 8373354, 7935, 8358158, 30057, 18346, 8360907, 8369656, 4903, 8591, 8371169, 11892, 7944, 8376495, 8377815, 17283, 8379420, 8347089, 8076, 2921, 8379403, 8371720, 15132, 8380279, 8374923, 7337, 8373599, 8376300, 8351520, 20027, 3597, 16135, 8379562, 8368867, 357, 4506, 8373062, 3802, 27056, 6219, 14986, 3208, 8349811, 8376869, 8371054, 32537, 27945, 22487, 4340, 24274, 8371840, 8361054, 8380384, 8365921, 3141, 1108, 8374864, 8372238, 8354770, 8376796, 4032, 8367720, 1362, 7197, 9519, 8361049, 8380368, 5972, 8356804, 17954, 8367227, 13718, 551, 11006, 9747, 28301, 8378772, 6336, 12399, 6292, 12733, 8366357, 10851, 2293, 8369244, 8371470, 8358869, 4193, 20991, 25172, 8363144, 8363897, 8366419, 8375057, 8378349, 19085, 29589, 10748, 22264, 8358286, 8358376, 8359514, 8365319, 11552, 12840, 553, 4769, 8324], -[8350538, 8376421, 8363, 14916, 8356087, 15252, 8372461, 8363779, 32127, 8368940, 29451, 8372748, 4924, 18150, 5450, 8368354, 8373227, 8369870, 21516, 31989, 8354226, 24283, 5733, 8363948, 8361732, 8346530, 7251, 8372702, 8362560, 17729, 28436, 8370865, 31542, 8356455, 11884, 4477, 8375716, 8368284, 8379031, 8371883, 8363543, 11279, 2284, 8343820, 8352653, 34470, 19952, 8374265, 8358928, 20284, 2825, 8361776, 5511, 15846, 2476, 6202, 14441, 13885, 8361460, 8376552, 8369782, 5094, 8339670, 20434, 9930, 22023, 24905, 6779, 8374433, 5659, 8361257, 8355073, 8364937, 8368429, 4645, 8344934, 17644, 11796, 10412, 2577, 19920, 5109, 8372787, 6808, 8368535, 29299, 8334154, 8366352, 8379572, 8373201, 8378063, 8351629, 23284, 8719, 4075, 8368274, 8374685, 10259, 8358952, 28654, 18440, 16809, 8356790, 8366507, 8363894, 8372637, 8359933, 8377660, 8376371, 8365762, 8374105, 8377818, 34021, 8376080, 8380092, 8376669, 1781, 8356852, 8367328, 3374, 8374831, 6132, 811, 18337, 8360939, 8376580, 2049, 2012, 25145, 10923, 1023, 8345699, 17632, 8372893, 11657, 5567, 8370549, 6053, 8358776, 9921, 14139, 8377113, 8379356, 17351, 5902, 4109, 8376906, 1418, 21309, 8378050, 3058, 14711, 8353682, 8366335, 27209, 8374712, 8376129, 8371680, 8360869, 5045, 8372911, 37816, 585, 15459, 14977, 8376463, 8356622, 8374679, 8363398, 1289, 8375650, 17877, 13495, 14849, 8374124, 6803, 8375888, 15828, 4102, 8378155, 17044, 8376041, 8363550, 8363803, 5452, 20963, 8372680, 7904, 8379891, 3797, 8353824, 16310, 8350493, 8379608, 8380197, 8367171, 10178, 6856, 6646, 8366445, 8367599, 8372758, 8361649, 8369276, 6624, 35364, 8378480, 13004, 15584, 23118, 8364530, 16428, 8375527, 7008, 8366751, 3368, 11336, 8366193, 13734, 8369106, 18154, 17646, 17407, 10008, 8368500, 3381, 8350928, 8377487, 12412, 18564, 1139, 8373232, 29538, 1138, 8362341, 7711, 20643, 8370617, 8376, 8353649, 8368161, 5130, 8361239, 21734, 97, 13506, 13268, 5409, 8362467, 24679, 8371758, 8372656, 28815, 8363425, 14536, 3179], -[8352700, 9310, 7029, 3298, 8354288, 8368751, 8376483, 8376560, 8375645, 8161, 14353, 8378176, 17744, 2312, 8356471, 8370054, 8378039, 8380024, 19885, 8342, 18543, 2468, 8371682, 8373492, 11123, 24666, 14001, 9416, 8374681, 8366253, 3880, 8368687, 8379155, 8379559, 8369838, 8792, 8351226, 5256, 8366488, 8368839, 553, 15485, 335, 9454, 15894, 13095, 8370830, 8367130, 2256, 8368726, 8379032, 18600, 3944, 15361, 5210, 8378840, 15724, 1465, 16789, 12981, 10450, 11605, 8374786, 8371986, 8360241, 8358501, 8368684, 6151, 18250, 213, 11146, 8369515, 8378214, 8377086, 8370198, 31238, 30356, 12794, 16555, 26085, 8364778, 8370152, 8367759, 9674, 18227, 8373307, 5880, 25331, 8380340, 12431, 12227, 8379882, 2531, 5426, 8366160, 8370227, 8367991, 8350702, 1155, 8352565, 8361609, 9091, 20164, 13525, 3865, 20760, 39207, 10439, 27218, 17026, 8380015, 12179, 8368901, 8364608, 8369696, 11499, 11147, 20186, 8362765, 8555, 14054, 4488, 10131, 8367320, 8374254, 8374813, 8361647, 22828, 8361051, 8351477, 8370694, 8355570, 5047, 8350, 26736, 11095, 8380030, 13813, 13917, 8368859, 2419, 30836, 8335, 6643, 8667, 8359489, 8374148, 8354661, 8373216, 8366125, 986, 14027, 15228, 26476, 34871, 8378793, 8345391, 8371660, 8349408, 8356972, 7645, 74, 5254, 8377626, 8376242, 8356302, 8364923, 20218, 21623, 26645, 9109, 20276, 5157, 8365730, 8364542, 1371, 8377645, 5697, 11340, 8378115, 8356729, 8377130, 8359082, 17014, 8369150, 8363692, 30155, 8345100, 34783, 8369701, 8351899, 7155, 8369623, 8377737, 16293, 4455, 8378087, 8899, 8378240, 20598, 8351211, 8372015, 3177, 4102, 8378321, 4835, 8357809, 4383, 8356807, 8734, 8360705, 8361391, 20022, 8350166, 8368167, 8369260, 7549, 8365164, 13911, 1238, 8370884, 1769, 8364278, 21833, 8347177, 8376502, 13713, 8368256, 2178, 13092, 8363996, 2006, 8363697, 8362831, 11083, 8363490, 15598, 7851, 8364661, 8379653, 9797, 8367319, 32562, 8355549, 1835, 8289, 8368908, 9505, 8350105, 8361217, 8373930, 8355059, 218, 10508, 1503, 8374872], -[23885, 9067, 13870, 8374717, 8375006, 8363100, 8354061, 3065, 8372238, 8374739, 8353195, 8372532, 8367737, 8369738, 4557, 8378531, 22363, 8375058, 8369175, 8359640, 8369253, 8373150, 12381, 8378538, 26264, 3728, 24786, 13586, 14372, 19031, 8367998, 8362302, 8358739, 8355097, 4704, 8374171, 20998, 8377750, 144, 8371905, 8377346, 8358984, 8379752, 8375900, 8361520, 8349650, 8357126, 6235, 7080, 8380056, 23213, 7050, 8354402, 9573, 8363069, 8368231, 20014, 8375034, 32980, 8371673, 19552, 8368065, 16305, 11513, 8553, 8373670, 6739, 1242, 8353359, 8368636, 8369567, 16492, 8367002, 8351441, 17150, 8375226, 8344798, 8367286, 3416, 2259, 1411, 8353278, 8309, 8362033, 8373533, 11240, 5644, 2018, 15941, 9656, 16066, 12486, 8360459, 8378338, 12407, 38279, 4506, 8362739, 12067, 8379224, 3294, 8366880, 16283, 8379311, 8365794, 8369693, 8357296, 8365315, 8376306, 17136, 11091, 4079, 8794, 32301, 8364501, 8374779, 2086, 8380405, 8363403, 8359629, 12272, 29086, 22684, 19099, 8182, 8373860, 9198, 19700, 862, 8373808, 8373664, 9971, 1662, 12264, 127, 8376849, 23112, 1926, 872, 8368141, 8344572, 8378128, 8357565, 8372154, 29083, 18247, 8559, 16092, 8354085, 1488, 8364149, 8352749, 16948, 13686, 8379657, 8379916, 8337168, 8859, 16573, 3857, 22630, 8375377, 8358811, 8364063, 8347661, 8379052, 7868, 2935, 13979, 7715, 8365052, 8364807, 8369757, 8377062, 15795, 8369413, 20091, 478, 10561, 12384, 9255, 25700, 25153, 8359568, 1300, 8352617, 8371964, 19152, 8374831, 8364155, 8365743, 2727, 8379817, 8374036, 8360656, 1600, 10827, 8371125, 8374686, 8368125, 120, 480, 6734, 5323, 6816, 8375346, 1128, 8379032, 3866, 41101, 2834, 13960, 5794, 12285, 8359391, 19843, 8364600, 28343, 8367689, 11025, 10822, 8344191, 8378590, 10920, 28808, 8368097, 8376801, 8367728, 8372509, 8369839, 2540, 122, 8380250, 245, 8364368, 8373723, 8373715, 9119, 8365748, 8372717, 8364754, 11067, 9834, 8379580, 14533, 3097, 10255, 8357597, 8361963, 8362666, 8365855, 23344, 10598, 38560, 8368476, 9914]] --ct0: [[7384, 15851, 8376883, 33737, 7338, 22140, 8368853, 8355470, 8359365, 8375913, 30, 781, 8140, 11841, 8979, 576, 8367405, 11198, 3155, 8362269, 8366015, 8366409, 8378847, 22163, 8356202, 19202, 2394, 8361259, 8372932, 8370360, 27027, 9089, 18239, 2422, 5144, 8365213, 8368384, 8377386, 8379180, 28384, 8357488, 4374, 8355470, 8337061, 8338881, 9898, 38522, 29596, 20711, 6708, 8371989, 8359330, 35503, 7634, 5485, 8376762, 8363935, 8367284, 8374389, 8368737, 1212, 34732, 14687, 21019, 8369252, 8371381, 19864, 8373123, 8370217, 8371949, 8371179, 2607, 8380334, 3947, 18022, 8379584, 8376834, 9110, 8373002, 8375251, 8379546, 14753, 8376396, 8368641, 8360117, 8369291, 8368594, 8356382, 23155, 12663, 8367412, 19871, 3274, 8373765, 8368453, 8368550, 38572, 18191, 8371607, 28374, 8376711, 8359582, 8359777, 16896, 8374293, 2494, 8369102, 22558, 8360863, 6731, 28177, 8356203, 8364185, 11116, 1373, 8362714, 8367398, 8370570, 6905, 8144, 6453, 4818, 8377414, 14524, 8379907, 21148, 13592, 8372030, 8364939, 8373837, 118, 12473, 8379571, 19196, 30141, 8363956, 8375143, 4356, 30590, 8376204, 2842, 4352, 8373905, 5409, 8379548, 8379452, 8363216, 8376140, 8380395, 7063, 8372482, 22259, 8350360, 8362071, 19510, 10761, 8375514, 8371826, 9248, 8368525, 8372473, 3922, 2602, 8363134, 997, 33328, 8372341, 8377496, 1014, 8697, 8365285, 138, 5494, 8373080, 6818, 4117, 28897, 8360390, 8376820, 8364282, 855, 11550, 8380060, 8375911, 7355, 8376615, 8353361, 8374198, 8365431, 8377209, 30606, 3548, 9363, 8347880, 8352472, 8357930, 8376077, 8356143, 8577, 19363, 33, 14496, 8377276, 8379309, 5553, 8179, 25647, 3621, 8376385, 12697, 8379055, 8373220, 8370898, 19368, 49, 8374445, 23613, 8362463, 13190, 8366699, 8379866, 8369411, 8370670, 8352116, 1645, 8374081, 8368018, 8374125, 8367684, 14060, 8369566, 8378124, 11173, 8947, 21548, 8376224, 8359426, 8355245, 17273, 16520, 13998, 5360, 2068, 8361332, 8350828, 8369669, 8358153, 22131, 22041, 20903, 15098, 8368865, 8367577, 8379864, 8375648, 8372093], -[29879, 3996, 8372054, 8365501, 24330, 8365165, 7956, 16638, 8348290, 11477, 8350966, 7669, 8375493, 8362267, 8374967, 12063, 7190, 10547, 8358901, 8348428, 26191, 8356134, 8374684, 16469, 18685, 33887, 8373166, 7715, 17857, 8362688, 8351981, 9552, 8348875, 23962, 8368533, 8375940, 4701, 12133, 1386, 8534, 16874, 8369138, 8378133, 36597, 27764, 8345947, 8360465, 6152, 21489, 8360133, 8377592, 18641, 8374906, 8364571, 8377941, 8374215, 8365976, 8366532, 18957, 3865, 10635, 8375323, 40747, 8359983, 8370487, 8358394, 8355512, 8373638, 5984, 8374758, 19160, 25344, 15480, 11988, 8375772, 35483, 8362773, 8368621, 8370005, 8377840, 8360497, 8375308, 7630, 8373609, 11882, 8351118, 46263, 14065, 845, 7216, 2354, 28788, 8357133, 8371698, 8376342, 12143, 5732, 8370158, 21465, 8351763, 8361977, 8363608, 23627, 13910, 16523, 7780, 20484, 2757, 4046, 14655, 6312, 2599, 8346396, 4337, 325, 3748, 8378636, 23565, 13089, 8377043, 5586, 8374285, 8379606, 8362080, 19478, 3837, 8378368, 8378405, 8355272, 8369494, 8379394, 34718, 8362785, 7524, 8368760, 8374850, 9868, 8374364, 21641, 8370496, 8366278, 3304, 1061, 8363066, 8374515, 8376308, 3511, 8378999, 8359108, 2367, 8377359, 8365706, 26735, 14082, 8353208, 5705, 4288, 8737, 19548, 8375372, 7506, 8342601, 8379832, 8364958, 8365440, 3954, 23795, 5738, 17019, 8379128, 4767, 8362540, 8366922, 8365568, 6293, 8373614, 4529, 8364589, 8376315, 2262, 8363373, 4376, 16867, 16614, 8374965, 8359454, 7737, 8372513, 526, 8376620, 26593, 8364107, 29924, 809, 220, 13246, 8370239, 8373561, 8373771, 13972, 12818, 7659, 18768, 11141, 8373793, 8345053, 1937, 8367413, 8364833, 8357299, 15887, 8363989, 4890, 8373409, 13666, 8377049, 8369081, 14224, 8366683, 11311, 8362263, 8362771, 8363010, 8370409, 11917, 8377036, 29489, 2930, 8368005, 8361853, 8379278, 7185, 8350879, 8379279, 18076, 8372706, 8359774, 9800, 8372041, 26768, 12256, 8375287, 19178, 8358683, 8380320, 8366911, 8367149, 8375008, 17950, 8355738, 8659, 7761, 8351602, 16992, 8365881, 8377238], -[27717, 8371107, 8373388, 8377119, 26129, 11666, 3934, 3857, 4772, 8372256, 8366064, 2241, 8362673, 8378105, 23946, 10363, 2378, 393, 8360532, 8372075, 8361874, 8377949, 8735, 6925, 8369294, 8355751, 8366416, 8371001, 5736, 14164, 8376537, 11730, 1262, 858, 10579, 8371625, 29191, 8375161, 13929, 11578, 8379864, 8364932, 8380082, 8370963, 8364523, 8367322, 9587, 13287, 8378161, 11691, 1385, 8361817, 8376473, 8365056, 8375207, 1577, 8364693, 8378952, 8363628, 8367436, 8369967, 8368812, 5631, 8431, 20176, 21916, 11733, 8374266, 8362167, 8380204, 8369271, 10902, 2203, 3331, 10219, 8349179, 8350061, 8367623, 8363862, 8354332, 15639, 10265, 12658, 8370743, 8362190, 7110, 8374537, 8355086, 77, 8367986, 8368190, 535, 8377886, 8374991, 14257, 10190, 12426, 29715, 8379262, 27852, 18808, 8371326, 8360253, 8366892, 8376552, 8359657, 8341210, 8369978, 8353199, 8363391, 402, 8368238, 11516, 15809, 10721, 8368918, 8369270, 8360231, 17652, 8371862, 8366363, 8375929, 8370286, 13097, 6163, 5604, 18770, 8357589, 19366, 28940, 9723, 24847, 8375370, 8372067, 8353681, 8369322, 387, 8366604, 8366500, 11558, 8377998, 8349581, 8372082, 8373774, 8371750, 20928, 6269, 25756, 7201, 14292, 8379431, 8366390, 8365189, 8353941, 8345546, 1624, 35026, 8757, 31009, 23445, 8372772, 8380343, 8375163, 2791, 4175, 24115, 15494, 8360199, 8358794, 8353772, 8371308, 8360141, 8375260, 14687, 15875, 8379046, 2772, 8374720, 8369077, 2302, 23688, 3287, 21335, 8363403, 11267, 16725, 8350262, 35317, 8345634, 10716, 28518, 8373262, 10794, 2680, 8364124, 8375962, 2330, 8371518, 2177, 8359819, 29206, 8402, 8377240, 8376315, 2096, 8375582, 22608, 8376034, 23610, 8371683, 19712, 19026, 8360395, 30251, 12250, 11157, 8372868, 15253, 8366506, 8379179, 9533, 8378648, 16139, 8358584, 33240, 3915, 8366704, 12161, 8378239, 8367325, 16421, 8378411, 16720, 17586, 8369334, 16927, 8364819, 8372566, 15756, 764, 8370620, 13098, 8347855, 24868, 8378582, 8372128, 11509, 8370912, 30312, 19200, 6487, 25358, 8380199, 8369909, 8378914, 5545], -[8356532, 8371350, 8366547, 5700, 5411, 17317, 26356, 8377352, 8179, 5678, 27222, 7885, 12680, 10679, 8375860, 1886, 8358054, 5359, 11242, 20777, 11164, 7267, 8368036, 1879, 8354153, 8376689, 8355631, 8366831, 8366045, 8361386, 12419, 18115, 21678, 25320, 8375713, 6246, 8359419, 2667, 8380273, 8512, 3071, 21433, 665, 4517, 18897, 30767, 23291, 8374182, 8373337, 361, 8357204, 8373367, 26015, 8370844, 17348, 12186, 8360403, 5383, 8347437, 8744, 8360865, 12352, 8364112, 8368904, 8371864, 6747, 8373678, 8379175, 27058, 11781, 10850, 8363925, 13415, 28976, 8363267, 5191, 35619, 13131, 8377001, 8378158, 8379006, 27139, 8372108, 18384, 6884, 8369177, 8374773, 8378399, 8364476, 8370761, 8364351, 8367931, 19958, 2079, 8368010, 8342138, 8375911, 17678, 8368350, 1193, 8377123, 13537, 8364134, 1106, 14623, 10724, 23121, 15102, 4111, 8363281, 8369326, 8376338, 8371623, 8348116, 15916, 5638, 8378331, 12, 17014, 20788, 8368145, 8351331, 8357733, 8361318, 8372235, 6557, 8371219, 8360717, 8379555, 6609, 6753, 8370446, 8378755, 8368153, 8380290, 3568, 8357305, 8378491, 8379545, 12276, 35845, 2289, 22852, 8263, 8351334, 8362170, 8371858, 8364325, 26332, 8378929, 16268, 27668, 8363469, 8366731, 760, 501, 43249, 8371558, 8363844, 8376560, 8357787, 5040, 21606, 16354, 32756, 1365, 8372549, 8377482, 8366438, 8372702, 15365, 15610, 10660, 3355, 8364622, 11004, 8360326, 8379939, 8369856, 8368033, 8371162, 8354717, 8355264, 20849, 8379117, 27800, 8453, 8361265, 5586, 16262, 14674, 8377690, 600, 6381, 19761, 8378817, 8369590, 9292, 5731, 12292, 8380297, 8379937, 8373683, 8375094, 8373601, 5071, 8379289, 1385, 8376551, 8339316, 8377583, 8366457, 8374623, 8368132, 21026, 8360574, 15817, 8352074, 12728, 8369392, 8369595, 36226, 1827, 8369497, 8351609, 12320, 3616, 12689, 7908, 10578, 8377877, 8380295, 167, 8380172, 16049, 6694, 6702, 8371298, 14669, 7700, 15663, 8369350, 8370583, 837, 8365884, 8377320, 8370162, 22820, 18454, 17751, 14562, 8357073, 8369819, 8341857, 11941, 8370503]] -w - cs2 + ct0: [[4961016, 4702315, 465924, 1086137, 7810002, 3798349, 6339310, 972430, 6660148, 4493508, 8186370, 1911272, 4948125, 7727984, 7395494, 8379250, 6539211, 7063172, 143873, 6971086, 3825166, 916442, 2776825, 8274710, 8075990, 3483918, 5593228, 6028755, 5933635, 4625860, 1878289, 7583626, 3315789, 2414179, 3327458, 6075648, 2075191, 4169885, 7669613, 8250921, 4152025, 2633459, 4605973, 2685063, 4844002, 6262264, 7432857, 1302126, 7088003, 889870, 8152445, 1658097, 6014383, 5081562, 7130167, 6206631, 6659215, 7109767, 6955960, 4699552, 4884648, 170283, 2383145, 3752473, 6122521, 6811325, 7329016, 4468050, 119439, 3420320, 3900159, 2506674, 3441453, 6258628, 2204372, 2290717, 2079136, 1059332, 4823640, 889473, 2750918, 8113049, 4335420, 7970987, 4618416, 6532545, 7963623, 5177735, 7678868, 1172541, 8306846, 6737882, 5012933, 3533631, 2246226, 2769735, 4296440, 717819, 5238710, 6548166, 3782564, 6576618, 2609000, 10304, 7563025, 1314234, 5409788, 6764256, 5249741, 1119888, 7973108, 4407072, 760815, 5152275, 1970571, 825423, 1498089, 2928155, 3893522, 5988134, 1701822, 7451427, 5601730, 2175582, 6309713, 2421393, 2664117, 2738029, 394693, 495172, 2602357, 2492086, 8025531, 6558826, 385057, 7784114, 6174179, 7272656, 5599613, 6686187, 5810892, 5753000, 2298425, 6656112, 795750, 3079361, 138598, 6539221, 2918301, 434925, 3313172, 256767, 4565560, 6597575, 8375918, 7417829, 7862377, 487159, 7621711, 4963653, 7444755, 7348738, 2785622, 524501, 3682945, 2224097, 47489, 2046602, 1651456, 4971776, 6284178, 4864538, 7678689, 5964221, 6738525, 7097114, 2328068, 5985408, 3503142, 3809547, 6778605, 5630991, 4772513, 5561569, 561151, 6252919, 434453, 7428850, 7311032, 2652463, 4863641, 5087571, 8232633, 2479820, 3687010, 2350424, 7021586, 3414448, 3546401, 5027062, 7855265, 2701805, 7473252, 8009582, 5965956, 3317888, 6590153, 6671315, 3975305, 2001863, 4458990, 6138776, 7576710, 2586286, 190017, 7426709, 3058787, 2222047, 7848757, 7193254, 5238043, 5045346, 5942487, 355637, 7213046, 1762718, 28721, 706492, 3084540, 4428561, 5344270, 2184038, 12015, 2740265, 4074998, 2661037, 4564841, 1361689, 4791061, 970524, 5103650, 6089492, 7170211, 6130308, 795037, 6274358, 901387, 91016, 122914, 2705970, 5150917, 5144259, 5794869, 7524203, 1508282, 4264722], -[3600571, 5620933, 2255159, 147258, 4298184, 4086950, 2665370, 4655718, 5696220, 567494, 6748834, 5318161, 3544125, 1530641, 8378877, 39367, 3982413, 8336395, 3427706, 6187048, 2118350, 968897, 7799092, 773463, 4623912, 540520, 4953712, 3375994, 3626170, 504074, 7466532, 7259829, 353259, 2564546, 2321030, 3561162, 4423562, 7410237, 7663328, 6482969, 5380756, 2147320, 1489024, 987949, 3922822, 6716278, 7726571, 7759729, 4182503, 5098650, 3819309, 5438721, 3303973, 3333231, 3338244, 5722103, 6723086, 5585387, 7489599, 8350908, 1722317, 7030929, 4687666, 2858966, 39894, 451171, 6429121, 7909556, 1663850, 3369196, 1985691, 8019259, 6388019, 3004351, 824071, 1369557, 6529329, 455881, 5335646, 3082547, 2614089, 4076259, 349324, 5241120, 494319, 2582362, 994333, 92803, 2830161, 6955695, 3329895, 7183814, 3175970, 5316994, 2631404, 851082, 4638345, 5038956, 8304323, 5079732, 1876332, 6289548, 5665002, 248456, 6316423, 5900738, 895761, 1186531, 3252682, 1355505, 4948012, 2412807, 7909572, 2280265, 6697573, 8190459, 7296557, 8145155, 3302222, 6402726, 2063668, 5402975, 7337093, 552044, 7565599, 4834090, 6968601, 5960732, 1832616, 1260185, 5342139, 4253491, 1252603, 7954722, 2020715, 1781741, 4545442, 1913605, 8313072, 4435393, 5578861, 3324322, 3083199, 5955099, 5569980, 588375, 5265982, 1751765, 5619853, 6820074, 1744039, 1712332, 3597872, 5609494, 3582654, 8334920, 8274194, 4386057, 2577981, 4477346, 2775830, 5430484, 6700028, 8115179, 3150717, 2394110, 613784, 7985734, 6410211, 6187680, 2031051, 7955133, 1656897, 5473280, 6162198, 7428478, 2819245, 4300846, 4673993, 6369183, 6067414, 5645029, 542081, 3729842, 1240581, 4445469, 4911554, 542765, 7980849, 2631015, 3469291, 6907863, 2177426, 7942481, 2359769, 7571715, 2708707, 7033544, 5592069, 3128300, 5421155, 6811379, 3223549, 3945674, 3667873, 2869942, 5219663, 124514, 361201, 215657, 1627200, 7886424, 754326, 4206261, 6116293, 6660140, 6410057, 3676322, 2422962, 1427007, 335455, 1901900, 4231700, 2622272, 2585645, 7646908, 6668186, 7940066, 3593821, 7310381, 4311951, 8086107, 193533, 1440066, 5359817, 4276274, 3127653, 4916960, 7489500, 3197360, 1516361, 3687596, 1691463, 6666448, 1143553, 3544417, 7206331, 8180216, 7625835, 613276, 3867890, 5652794, 5705421, 6987476, 2294625, 6027301], -[4152386, 6181716, 4820864, 1866785, 1580305, 773074, 7807160, 2730468, 1229913, 3979645, 6973254, 3638932, 466240, 7054371, 182520, 5574843, 2412732, 2674990, 343331, 4820444, 1878233, 5587792, 8058716, 2952434, 4077744, 6740071, 8085844, 4021381, 7838656, 3162914, 5057570, 1921562, 2401873, 7725136, 488931, 6235126, 551555, 7908864, 3145853, 5043814, 2144029, 1966954, 2575762, 5025748, 6226424, 6515656, 6929898, 7087638, 2685941, 3385157, 5089948, 279462, 3956188, 1521332, 1808875, 3796240, 3741215, 5671303, 5127498, 3739271, 708981, 4388721, 3882436, 3196805, 5624354, 7165029, 7073922, 6211124, 6636333, 6955249, 2133845, 5142669, 6494867, 8139936, 63303, 589337, 8336966, 4316965, 969031, 2671280, 3643004, 6003619, 2889846, 4733772, 978320, 5010533, 6357593, 2310089, 3633918, 2425560, 6410995, 1939775, 6475947, 4900587, 4240472, 5434235, 6552230, 6782809, 4430595, 5170875, 6855603, 4316961, 382096, 480675, 4281278, 906653, 3623924, 6318129, 3911675, 2067013, 4389142, 5770806, 2502404, 4242887, 2858845, 4002310, 7986132, 7069152, 6750672, 5063136, 4127148, 3076688, 4407014, 6977677, 7118004, 4077631, 7541691, 3630603, 429034, 6190858, 7307897, 1470270, 3903096, 118606, 2208398, 1266501, 7438429, 7822967, 6683276, 836577, 8117710, 2662193, 39152, 7697360, 2137313, 3001688, 3355028, 7770948, 17067, 5821763, 2735689, 1087221, 4639669, 7787988, 1110249, 6571203, 1671296, 4374182, 4693821, 7393610, 2883813, 3224787, 453867, 5524268, 2624545, 4469157, 3551374, 7766352, 235954, 5046202, 7959696, 1516744, 2018699, 4289018, 5399567, 2175906, 7004384, 6489747, 6330339, 6793173, 3302372, 3195492, 8276739, 7215720, 392275, 3186655, 4536179, 1689234, 2452221, 4058065, 5923102, 5661596, 2772913, 7265202, 3238188, 4327162, 1054729, 4380465, 860506, 2571044, 3694987, 7311314, 6409517, 3234327, 1586762, 866153, 3705294, 8308007, 4884680, 434433, 1007187, 1410426, 7884899, 6113675, 2316168, 1745821, 6174613, 4206627, 4566894, 2639242, 8191838, 3667061, 6340037, 3963408, 2745460, 7054762, 2378355, 21484, 3409217, 1021677, 2290840, 4377207, 5251518, 7652799, 7799671, 455857, 5633880, 5895202, 582454, 3934053, 1300361, 1973777, 7496192, 900698, 4876327, 3762389, 55136, 4247888, 6236646, 4342480, 6187473, 7707508, 651639, 2950678, 1233331, 7796195], -[3098897, 1791815, 3623154, 2279743, 5716303, 1958542, 4514969, 7352891, 1814331, 3886942, 2337919, 6618702, 7794074, 5513235, 1106517, 5961662, 2122253, 3618400, 7819949, 4627643, 4200316, 2287725, 3135201, 885128, 4600011, 8304898, 1028231, 8065252, 329039, 3917722, 421864, 1866690, 6097871, 946933, 5714194, 3881848, 406448, 378072, 3756094, 760228, 1872465, 7030664, 2708659, 4476146, 1138906, 1184681, 4996840, 6861425, 5219799, 2896855, 3390105, 3000793, 2427752, 2603822, 1651570, 5632867, 618311, 8170355, 1286385, 5970073, 3881843, 7963372, 6900908, 8305446, 6253546, 5846263, 3174670, 3613161, 1106503, 2774812, 1665295, 8076136, 423806, 7279317, 4836708, 8143432, 5380411, 2325473, 2989718, 907460, 5675178, 7100032, 4830894, 7067265, 6273642, 1218986, 4534109, 5728798, 8169319, 3431559, 3343429, 3582357, 253891, 3863958, 1214304, 5615378, 7888606, 7415709, 665289, 6566272, 731569, 3379124, 5900009, 4377488, 4987816, 510667, 7889422, 260785, 6922886, 3108575, 1375514, 240348, 268138, 2755467, 2268082, 5626209, 6045041, 8026917, 5258271, 7746023, 5310559, 479218, 6449486, 5670658, 7472421, 6770244, 4563904, 3476193, 2086626, 5014476, 3431829, 5567542, 1975282, 4926846, 7595806, 1910087, 881479, 6710148, 7831021, 5298211, 3568559, 1131879, 6052493, 3439482, 5626008, 6557299, 569222, 6498773, 3633569, 5150721, 5268710, 2455252, 7556806, 505920, 5605462, 4579699, 5553976, 6152171, 4486033, 4159644, 1003935, 5905035, 6318920, 6092759, 61549, 6847791, 6458817, 4589202, 8010204, 2314778, 7194567, 7318850, 7915647, 3253679, 2364999, 820731, 7803833, 1231090, 6499621, 5852574, 711437, 395383, 6972830, 1163464, 1617248, 7014518, 5254050, 1285358, 6013061, 2402146, 6618819, 8263854, 3566135, 5712151, 7798561, 3381908, 7366208, 2475352, 2368293, 3506818, 1304437, 1726160, 3823172, 1830061, 1478444, 5292258, 5039814, 498937, 1889793, 3300073, 7036207, 5950737, 7699920, 5031914, 3417862, 6504085, 4192925, 1922563, 2838243, 6457681, 6785783, 1661697, 6095542, 7302284, 6489127, 3920858, 1107418, 2259847, 1895384, 7720782, 297889, 3729737, 4549988, 5162196, 5973859, 2244461, 6093761, 632686, 817105, 5010853, 193847, 8117877, 968642, 7284269, 1323484, 1169047, 7528162, 3962324, 3873756, 6288046, 995054, 7787710, 4042899, 2759087, 440305, 5542597]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] -||h||: 62, Hint check passed -||ct0||: 46263, ||ct0|| check passed - -signature: 3202542EF1E239D32BE1BCE5AE4AC8052D578899D653E368E11BC11C5480BA06FED24E83A4361E358121DA338108794DDBF93ED0FDE9AD07C50F983BAAF01E985F9A6F380C6B14148AC829B67467CCF9F2A16D2594DB895BBE6774F4DF57DF40239AB2C2FDA9FF98F9B1A2ED58F405631AB0B2D62FE573E82961B1495ABB2A572CCEFF02696899A6778F9127E1249AEBC8593EB8CDE2780C5E503DF4C6D80C449225E7A96FDD199973553EC15D964285943207447F1D6E8575A38522270AC356E200C1260CF4B5AFF21FB5EB8DD724E79029084DB5E26C1BE84D19C5C0DAF7B5D78384B57D3B915E37492604984016721CD3D532ADB65B3E7F2D93196A04E05303D3ECEF7C5FD110BBD61C18AA94C4C1606C4D542C82A55B0FD7E824BCF900DAE8926D6C8C1454BDA5C5C4B3788B96BFFEBC2A771F999FD1A2413FCB5142158CE3A8D06764931E1F465BC5D9F8FA18867650A2074472C361038B5B7BE8ECDBCB65268AC7AF4B53AC3182B1AC7BB651AA40AD4310AFC80631D1DEE6FF01186E4AE1E1B1797B8A6281F8F72EA57B77DE4C17DAAED4EDB6F93714AC56A04B61A411CBAF2C4DCA9A01767FC5644647250ECD8BD20C2168042A61477CE280FDC8BF91FCE5C7C525A7A56555BA9644E6BF90C8DE121C31CAE7178F56B0B2A332661FFFF4457BC6BBE68A092D70065CFA5F1022534B317CAFFE4EE7C19FE1CB374FBB0B8497B0AFEA62023680D9E54B1782079C7E090EE27FC7451C030DE8438C697C9436117A21A68B0615AF126C1DABF41EC1E39A4E488AD8EEEA11ABCE4685B7B50CC9B6666CD831400CA28B443675E8F93107EACEE1B287CF85C6565EF3330D07104A72E69164B2F64185688C91622775AD7E27F563CBF45B6BDFF3D9A2A8619DA4E45098197B0E72F559F3B60D201C81CE35DD3EC4CD7F2970F44D2BFBCF28D77A483E887DEA60E0BC7AFF1F1C0B0E703253DECE61B981FBBC9441935840025DFD196A1E3FBE956BA1756AFFF5958806F76CF5DC33C1D7E9C43DF25FE21B689D4245550D1F84BD226CAD79E48AD242B41CD10B387270628435A398E9CD217ABD388AF6154EA7B584F44A9D00870968880E313A2DF84EECFA6473CA3CD444416E6950F78A8AAB03AF462E07273AEAFC2B18ACDCDF7F0162963261C0EF0184700F4348E81A21404DE8154B5A9FF7B3EFE257556A480A066A13055E4CC01CA4C4F13FA74A33B15DE11511BFA41FB2BD70D6B09BD9D31ED6E3DF746411B35C587EF37487D7B234C4FFC4FF4D4875CE93E9D8C5D68C079A066B6D07D895EB61977BEC207377903D97877A04FA70D900C721AD009E0512CE023ECC6999FAC6BEBA12BBB7DBBC2D2C631E45018477E014E1206D17ECDA5DC7AFA24E9650A6AAC21EDD94816100E411C5DC32811C7628A5D0708309B1E2A6D8400D83E370423E76DB209DA20B8F20188205BE7825A9318E5F75CAAA0CEBA4F3CA801074426968F8BC1935830B7A3DFC07D3AC0F0CAFBAF805127604EDE45AB5E121A798341E0C59CBC681E49194D9B6D24CE563E38F0425D145A31B799AF07FF0F4D1E4E50928E8DE470900A9DF217AD64771F25165987D7524897B1C03C6A2220A93EE2F020BEBD37328C0FBC0A751F9601AEC1878B866E168BE948DA82CE3A80DE14E0E599558CE1634947335F68262B4F8FAA55711AA91192E9AC3DE2BCADD6FE6FC40910E9AA060B23C2FBFD838D760B235BE7902718491832CEA6910FE7A712068AEC8868524FB90E60926B5BF3ED8D4A10726D78DD64F8C83A907F8BE398C990300119A29B4A7756146E77A3D4C352FCFE015EB3C033624C2CDB43A9C1C6FA803ADE04F7790DC15615FE67D176B6826094ECD6F189124E307BA001D7C769F6A2A88B2006F4E300E85FC2AE85362F375A8DB00F23B12E87CD5D4EC5D635A8C8E974D4D2186FDC7CD73A2D7DE4F6D45BD6B9A6C6F6C24E0953FD059DCD455F1F9AD7FE01BCD351BB7A28D36C3A7277A544BCC3CBF2145D1FCE6AA1F278427026B79513010A07DF441F99E6D36AF18DF7255E46A3118B4429028D3C93689C28F95C407346F27AFFDFB4548BF8D90596F5EA3EFF931E37903E8438B16BEB8CF4CADA30EAC62BDE20BA3D905AE77755498510DB493BFBBDEE2EF1AF7C57B517D9E9DCE3DC861E151262561CA0038FB9CB9D44C421B9AFB4C8E260B08B257437998E8E60904777B86B4DE3BB33D5894B66E7F7DD1437F5B18C4D169D910B2AE5EB9F114680C8AA5C9D6A56FFF02DAC97430D2AF8B1AA166374AF5A4BBBCA6BC7A68DCA1BBF09F578E49B646CD23EDFE7C9002320ECEB200E35244DA38408D6C1AB67FBFC8F4D1E7FFA1183778FA3A596E507A42FC99390F4B78FC53313725E8E70111798DE45160B26217AFB38E81C315ED732C63FCAD5ED861D5AE901E3F8E34A011A2066A432F016A5D7FA626A6B09C3CED3E5530380C990F754A038243761145A591AE814C4FEA5F62B8DB21DCFD8E37C13E8FD212893F0DA9F656DEDE606F9665B1DDD250E4C0C3FFD55B91E4D62618DCDB859EF34EC7D99F618DDC754389A0CC397697BBAC7EAEAB94F93B7348CA02BF1C8A039162BF3428D532C464A785FD793875B89BE8C920A11B5BB54A290BE14A725065CDF92F102575BFCFC8325B6595DDE6E81FEE3DC65FACFA6C20D6F96F365D0FC6DB45E4AA9F852CD6F4A2E2A6DE867873E5F5B5B64449318A007EBA3B1976FCEDF4AC097D7F1033D6EF45EF2261C1D8CC696CD0EBABCC31E1646F9E0CABBF65806969913CB4EF213924F27142E8067BC51BD9267F460B3BB2F0B69A97CB47FBC25E4DD56781E2AF1AD93CF4F1D8B9136D8F144D27D6D6DF6B29CE568865E5591668E8D6FFBC4185525D5486DE774615249790526F3F4C29A256EDB6DCD41500C0F37140F2114A9773941B8BB50606666D38E76D6A6CC7300F6A5184C428A4866CDDDF175F98AEF74A8243587C436E9646E284FCF3965DD6CAA444A0AFBA1C04050F47AA539AF3A4E5338797093F4DBE2BF7919C7CFAD9517C15561E679428D1768DB77632738C44BECDB3686D2C793A5B66384CE3C57556B59454BA5BD9E9EAC1E4257735860EB7B6478804F23FC430D411A4A6EEC4AF1EBE026569C68475083058E8574D4B33BE929FDE5FAB363D0DB7C7B256996815AB796E27D0125D41B05D229F8E532DD93089EAE920B20313D286939732E0BEDCAF328FB6ED0D265E33ABC9B7BE7B87BDA7FB94C8CDB1F0726ED51BD7323682F473B3BF68564F1CB7FE7B67F38ED3D5DF369C9171B30040886D5105945CC2E3D117203A425F6263656C858ADCEAF707212E3543465355575F7080838494999FA1A4B1B8C0C8DB2527676C7686A5B6C8CED3E0ECFAFB1D5A6A79909EABB6F60000000000000000000000000000000000000E26353E diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt deleted file mode 100644 index 8bd9cd4f8..000000000 --- a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-65.txt +++ /dev/null @@ -1,273 +0,0 @@ -Signature Generation -- ML-DSA-65 -message: 4D3C4D952A1DAC151736AE9D0AD81CD37F7C492539FCC916A4B2251309E06CED54D7145868D145BC8D16F8B364E5D6026E113BEC4824F6BFAE3C9F6C8B888EC6B8254CE59E9E8E158EB04077841243EE3A89D25C0B30B4A64B723697330AA87663B20EA4513189558466D264C79088415EFA09DE9B64AB01B640B288D1D5562ED744E80CAF0B6E2C29FFA1C321129EBC70CAA73DCA7DCE899571260B2E7DA1B47CEC5BB00FD66AF8B89BB84392897BDD1A5EC7186670DB81604E0B949B5AB1D19522A3F0828D0E77B300A63EDCB74C48F9A01CA91816FBEE011A5B0145C6A0B4EFD5A3008A91E0B1AC96DD8CB9410D56A952E74B7FB684A0B166E5F0DF9AD100EE1C9E3B7B851B4CBF337A3328DB13977451E992C4A0B454BAC5E3A2D0E64D106DC47C216E0C0AC11B0F7C48589E573051133D01F29579C7E659F8FB8E6539B0F618D053F4323AD0237A58949F689458ACC109BEB7C81952A879A10BF8BC01CE057E936B62017E226DD66AB2470852C000A618B9B130050F6B047746D068FE7D3CC1277E4FF4400F372D50A85F469B4C7A35AA7FE88DD923ACEF5FFF47A95F971EFEA6B65D33E65F20173C5BA5A320DD16CAAB59AA7A7BB99956EB5ED54EB93E89C887A30D6D384345E21291B8E9C6CDCBE2671F810A058B858220146A2161B7412CE2DB817CC8C99528195F567A92E198330AAA418A5FAB754E27221A2165EC4D50B391BB8AB2BECCAA449CA1D4D3D5C17E28573048452EE4120693505515CF8D1E2F8984D363464DB786E9B8B7BDEDFA2301A21F3C469F013E27742405CFD0D15E70BE0560E8B18C82327861A8DF64200A51E69D2791D41E1E12BF371664270AFBBE1C84FF19D11D4C233ECDB8033BC79BC7967C410C13E8E3F9340F848510760DABCCAB6EF7BB87398B1421E5804F6D41ABC09E6542D72B87115F1281450C66AF3BF4FDC21CB9B8C27D0FC6DDFA73732A877CB7D7C09B8E9F4603D9865E4AF91C58E9EF6FD9A32C91EEAAEF170BF4F44BF586D789EF4571DEBE6FFF0C43E842617FA50FA6EAC8C7F70EB680BE717688188A430484F3388F6219A70EA38BF3C6DBBC7FF3A749D8C8E51A1365AE372988D248F9FC0F2B67E896CBC86D2AED35F7AD8D4E93C21DA09E0204C7DB92FAFA7119A63BD0CC00A029CE7DB93DF34C33ECF673D48CE3F40948DE86CA5467CC159960B329F560B20E5C8AC37AC4C8960B49B455075489E7217D6BC53AEE7C19B3FDE9FFF667EAE89AA6CE8C415E807B348A14598329A32D9E508C3409DF18EB426BDBFDDD88AEB3A9BCB9D84C2388AD79AABFA3445F80A9A68EF74096E34516CB5316DF599E5836F123271CF729472952E06C817A67C219382F22C4B0A16F7B7DDE9ECF4AF6927BBF4424F43FCEB1A48F1F2CBD98E7593464EBDE45D604B6AF95E32AE728D921B390F712ADC280257F4420741C0D29E0E6B98EC1708569381BC845420DB0C1BDC9A23DAEC209378A01703B9C16C10FC29763A52FEE64F0A728198513361CD981DAC739937FC472CCCF666E61DA3D90C3656F0BBDE6B942D8A0496C9BC703F7424BF00848800AAD519347A4747676C81088109A2B67848EE0A08BD1409E774434EFFE754BDECAFF2328EDC30FDB85B45488DE0A5D9052397F9DDB0F13865DCA85A36F6B43B84ED044E5F40BB960E56DD0CD6EC08C37B017FEEDBA4A7F20A174E1146C441DB99A2BF34BB8D8FCAEB874B2313AF2E20B01D38B56B42451047EAFF592236CB241857754F6E2DA3E4FAD070FD195B641567375B6F2744FE16996D7A73D095F5CFFDD50A96508FBECF802625E5F168DA08C8D5198BB2702F1CBDEA8221BCFC301195B717A0D174EEC9BB96E7C49E15CD2A26B933E0C6BB11D702F1A21D33BE48039E89E38C2A5E96F55A557359BBC8E191719EC5E5669B2F168912C9177B320A5762474CB2303F54E78F4DBB914EA354F8C9A3E81342A10ACF5FD4A3D8CD6F85A204E165D59E4FD12D5E5E900AC94DB984DD8A5A72372D8B5D8958EC7F9E64CEA4E560A8D9525CB24D3B2F36ED7D46F897229A776E7E422838D4E2B551B28D0127F2B7644F35FBC35BEF9D856EF447F699151F73AA70CEEA55F6193060762B28FA150A83344A2E23B9E5E1B103805DE85C520EACCFD67A5C390334B036028D4B696AE3D6F6DD80304F7CF915F564409AE65AB7504D8FED434966AA4D4DB3A3C90B160332FB8E6A33A392122E3C02F27C38E37B8B217958912D0AB987D232B65D7FDF3F28CD507D53F5CAACE75224AA3F63A4D4570627561AA146A32645C89BA18CD4C7D2AC0D9123C89AA7D4AEE9CF811DC877D7D0321AB5C7EAE86F2EBD61AAE681EB53EEA73D0D7532937AAF8F8A23E0AE64FCBAF782169422ADB6CE8F3F003CD2EE9EFC37E5EA1A8902D3D1246A89736C6C7C9A46FE2D2DB3BEC00E69166ABD213A6D30494244FEE28050BFAE566DCC91C9528883011F215995DC92E577421C9645478FD3C3D7D8FE06BD1824AA20B4A67CF9E8C2A69C031E4E1FCBCBB6170D60838C61AF3731C7FD4DE4D6277FD6652B63318CF093F7DF46D800368A71333BA657171ADCE4D360E249B32F49F93E38C22ECF79C89647564B7F83E26A59D403B239A25F7629CEC50EDE1EFB58D9017ED44CE34A3136518FA009C8BEC057BA054C794EA0F49F3C581FD91009835946742B806D115D4E2DD109E1797F7DB5575CF233980B2D072D247E704EF40A6DD6651369C67B576FA7DE4C794E469EB2DB8C0E424D07CA01753671116FDCB9B37C0517686D85111B8E12A530C25F0D01ECB20E259CCCDB0A081ACA5CD06E9FE50D79B9A7412E02F41B53CE3555E986833D253532CA5D27A4F0C72FB698CADE01B36CF94C5A05907AB3AC631455B4AE91803F2A3A83E9EE23EB0538840E1C9408F73205D7930AF7CAA7B4EEC2D47A71B99C07B09FB4BA1ECC036BAAF5230D600550CEBFCAF49A19D63B3B50016CC8077D97C27376E2AAA370BB3CA213968D242C11AC0A341 -deterministic: true -sk: D26EE59A89F67C98B20F890B03422C8027B776FC305BEF422CDED403AA705DA5DC380AD909E3C13A76F7F59BDD27A843F5F9A1B8E5B7B524EC445A916B7A44A15167716BC609B3EC0C653B210C6569BA2F8233E7F6E404B92EB21F39729FEBC06A644087C75FA7DA3DDC5B85A89F55C9F87A15014E27AB325EBEE0FE472B2F56205844860382534018828866441476575685641203648087665585183625516555420058871751602717711246115635711801273601127806468005021161768110481565564313804086156224775253365085726676702542128777015217656384221466167018541712560775653305356788352067346543727338426471425281415038533202656128851671300117755513452307351315370854301872372157587303156081110321112258736404438264705244308745330557358455160473004531650442427724303753273643545546151241081547412433078243311343703723518581388573234883002524138203118818106712726275005164485846703435423180316086652647174338637385102777331112452328027048826136833604027623520567678561007443300118026417762172470414100567684236755276750265038807023654313530500201746332586762137686700431224203777868426234607501375807606118643643343182854487118067375717216763686234631445727470521225615865012624304163885146650645168324156757125027631761181378335367286426405258178463767046744346405385558607416365312311607655783032614171118036426333182624236747864807656353823246577001576547601536137245648167881548355703441616635365661535127864121615460226475308628856173321321610874562553506784723735385386463056370235073236822680783606365575167372423481370273787321706274756640515832755317524417643527131782776733023626563226284344414664814180751873017473606630568447604505822478245472545717704487614714872060204431705604477512622755208754111644114533555057070674013756756613028602834613507528705643218236456378337317881601264762752721064334675027466164547381066466654324575825520882682277558861126808652842067242706502602822135413806761150412241623142132062854561462005282463527054222067084232463834703022563303120640700613028248186135862267807514517034808871887028651376603357053471356848232460123720236623604868157088117331708032612544633466027487881011822577840213584603838688167482874577534023608684717551178060878605807013607371146861810111452118252851727546664116442725718666627745565706128063346337837125850568444871521347471236266350161674306083251415448031242478881077307231468143328543380706263487802348512856658522881606460085147711847660265787214085344812640116713686701544018882508606025375436400485704788868344567583740386811256420867877166077712432136288331062381178450376522316153520153726880635206125157517874821078632831518110002578434628677277256811181641133083303108474041885821315177237034415740262877735530252155663683621050363812382062703541636072037888130651437727453164255777504346625374221717666355341021461642300018161635551232553767782843483040236111880701245700154018276321853454261144802277261072016656336147062500850107086111551067005227866654812551566680414042612307370316834001206560231706668641615317857425305313402768758031066346812502214187812016774121074448086641371280564240151566227543442570306101083513862873685631407576010245281712830883456301434255351012FADA607976F6837B0DBB68127C5D2CCA1E3BFE9CE0441DAA2FC7F0145F96BFA473054009EFB11184E4718B045758DAB9E41CC03A8A581F86F05C9D76F3BBEFCEE4A67DCD2CE920CD15B7241D7BF641B462A72E287C3DB90AFF454ED1C8B0794AC1055BC6B4BE81669FE7154ED8FAB43BB21E2D787FED316B81CE03DA5019A0948BF4F19CE09D317736CF91FDDD4B42B29B9AA0C87D58C81D2A74F22F44AFEFDF6DD0BB2689BC4E54C42DE56F5FC6796941631931525D7B51FED90894F88B20BC819BE6F19D080EFC03E23CB034D06EAA41D552CCB07B42AE79486825EBEAEE22CE193D5B9174E20491E23F376E3EA9731981FDEE6E0C837A07C9A6575A038522C8F36FF0E481625E1D693C69E2B4B4910B35CFCD7AFF76301F15E580C5F2E4118CB9754D90ADC4140E4AA8DA02FF7502514652F07D14B0AFDD6DE58EB896CF51E562E0B7972E85D334EE77E09E7882EF080275786B91E1BDB949E94BCFBE45333D0CFD6305746A24B4B2AF2311F964151D4F89D12D1D88A6149351CB3294926A3B05051FA1F613F4854A1727E3FC195F4F5F99D7A6F6766A250839C090B4D81E71C242A58DEBE5DDCA556B97DE9790DB89ED15CEDCF7EBC6D44DC61881BE060F905CBB77025694FB382A66A2809A759AE66DE102CF059E9339C26112F76C50B39EF61ADF393B92B69BD88F6AC5E7EED1FA1A8BA7201696DBECC8FB9AFC1946C744D92F3ED30F8834C398F42C53720510D16817A8074A2F12D27FF98CFCFFDFF7D94FF793993991FD44C799D8BAA5E0BCC789D3F3EF467104BDBF2092509E530F920DA1F663A5E58AECA50EC6F1DC82986D37EE6C195D64E2D4960BEFB09D3EEAADBF9873340A5B86D29DE380DFC41A99D7350D9A5055706E3C2037245DF35B9DF14B810772C3A40887CA02CF5CD42993E360852219A9A384647CE912D95DFF0E80706A2696296C7290214CEC72EEB016D34E03FBF5E65F4795E714B35DE183FEE6CC6C35E349289CC8DBB37AE9F968CF0BC3654D3B82175B0C5AFFD9B1D421B7DCE8015AFD77520A983E1C1E9EB0708118FA4BBEE072157E7CD8CE9381091D3F1D4FC3980E5F8C95D54F4E6BB7AF368AF6BC9B332B80D7F8E76C2E203049C3380C5E0F5299DD6E57CD59AED1CCDC998F2FAE72C29A0C1D4025C34E506AF77760228DC3B8B680AC8A2FAD784EA6B86EF34F1842E66F46FB0F68F0101425D16341825DD6605DF6310E7C9811F4CB81EC3C7AE7CC6F528C782C6D33D6883E895B3A06E3D3EA84B03E3603394B44A1A3C289871A59269F4B80F4C7CF404A4B99A529A574BE46AA6B52B4E544FB7022C90904BE1C767FB8DB744B9C69FBC503C234F6618794F71AD8C95E5087F54B4F82154454C0E7386F21EECC0DDBAF454382A973BE4ECEFE846E0C21B60B56448E6E5EDDBAE084132A1397F16314047144ACADD6CC342447DB6A65365747A63C404AE623BC3EF1703C18B14FDA178AB7392E9EB6D2C9045EEFC8A7368DBCBA7F09CC88D6EA54505BFB82373819FB990F0F64C6FBE421E35CEBD9B79CE77BDF3C8946C58C6071757284E5B53B56DFEDB2EEF928DC9AE02BA21A2B5E284E285C9A6CB05710E2634CB3627C52E577F7E5CA7475607A7D2CCF1452F9BA703D322F69A47F16BD9851C7528D89B59C03B426AEBB3B372328CA9102F624E901DC8A315524B941706ECFE0AA8AEB0AF8EC33D2E1CA203B489AE23C03D880B83D738CC277EB6FF1C7DD31886C639C6C658396F60920D8A0A4E58278D63E5B393295FE8887E8F9F6A64C10CA241F699B99D72D13722E42D4615D9F3D0545E320D38EF809076F4216428C29D130F2F83052B9D0BA4A8A1872A242BDC59722281DDECE5407CBBDDBDB0B8C04E9385AD9660D252DD28AA881166694207BB04F9A24FA92216ACAF264C9F1CC200A5E2CBD2694C91238A8972496097B3BD3785345EE7171A9EB96619722C64571DE6327CD0345B788871D7D5D0D84EF2A47DDE6680B7743AD61B164E558B672E4CC4B46D6E6C236C2133965C8B3C7D0F240AB0EDEC78E8EAB4C80040A037F0080FA3B15ACC3EEA34208065EB6E6E21DA65601454E6DB037C08B051A1942DAB90C92B0BDC8C572C52F0AEF84B85F0444A6C15E84801448DE8147804F796A1A05341E75DF015FEEA7E191C461D3D3D7B2D74A9C4C7E18EAFE0966C26731F0A960461DE0387A917A6BBD645C4668030642D70DE30D9954556CDACDE00F82219E7A3EECC8354FC5A4388195CE568016C7C63661559EF65E2FF09F1C98A6668C23AE4863B04287A3BB6210B3F5689A3E7978517B95B0D06A831F28A3FF55B6053E38535B2AA97FD66B42980CDAF9E5DB6F1212BC23CC740BB7DDF8CD40391C0190F62A0A2A287DCC2AB8FA65C71675619C451EC07F3D67EE81A6370EA2144D82CE63CAEB4FD76E6FE4979FBC149BC54A9236D4CF23CD5C09E83DE5BD888F2EB03008BB9FBA0CD5CB79DDB62E2F9F8F2E11B2210DDD11590E21214015085A3CD8DD1665AD81D28D552B214D91550FFB3010102098E6F7649A5E06057998E25B4F789B2FF356299C589B1CE03D4AADDC9177B47974FBE205516B3A9E88F0B3955F133C29C1EDB94969E89B2DA7B64EE423A51672521CB4E1008D0AFCF68D6172A174F0ECABB5FB7648444032E6443CF9C7FA4ED4E1728427C2804699A143EDF11CD6CF9F5AFF6341A69DE7B7710C223C799861242C0D68841F36D9200122381EBF94D22258B38375C0D25DC1E3EEE00E312433CF8032F46EA0A0BCA36C679F5FFC82898372D631FA7368595ED7CB6571E8C00C16AFA4F4791E63813141D800111C1EDCEFD8872BEA41B2DD159676F23BF85C7DE07A30D2459EB16B24BDAD322C177B174BA83EAEB352B2C0D8140B33D50B0C9F2DDD39F305F9AB4565D3ADF35550F023F346900C59903CB972579395840D6A89169DA96D7012A821632E66821591FD3731EB068CBAF5F18589E7541CB4AEB0C4859020D0A3B99887D12E78F690073D29A242682D4677E2F904DFD7266E0514F6E460AD2F1FC5CE875D106432C5F91D6246D80AE5C7D8C4E4EE122F5FC58380391ED536CA4F073E2B55F5ED19751479CB3A71E72E8F330E086981169140A8AD069A49B1FD4EB950F9FB9084D1E702B957D081709FC510D31CE2EB1E42AB474D73A793231EC274EE399257DEC4B9D0704265A77E745F4CD8F9E4909FB9299304CE6AC7FA95C3F47B210DA388EE748ABD41CDEB3CBB187A40BB3C3F4150ADA3472DDB398DF8D8D5865EF27F54CBD4164DB0465DF7443E1D7782A2403387EF0118E8EB10283A39072C36A46E724165F49ED170A8FCC00FADF037EBFC652810697CD7108A56989491BA2232BED54BA167DB9D526FAD348B7787AE71557C59B38D1054CBE9BCB45E17BB146ADFC04F6816334D3D815BF73FBECF1C9D437D3A47A7862C286884B638DD7FB64BE01B7981D7CC82A90938EBDD9664DEBAF0E03A595368B89338AB076BD22AD579D04F1C7EA075D220F8CCDC0B9E372F5194AFE834D28 -rho: D26EE59A89F67C98B20F890B03422C8027B776FC305BEF422CDED403AA705DA5 -k: DC380AD909E3C13A76F7F59BDD27A843F5F9A1B8E5B7B524EC445A916B7A44A1 -tr: 5167716BC609B3EC0C653B210C6569BA2F8233E7F6E404B92EB21F39729FEBC06A644087C75FA7DA3DDC5B85A89F55C9F87A15014E27AB325EBEE0FE472B2F56 -mu: FF253A11B6FB8185B2DD5713A30839ED8873037BD15F87FD4245F35C2602ED0062EDFF95E13CAFE61688DD4E3BC421904BC64F6F6CB0B0ACB706891C5AB1E749 -rnd: 0000000000000000000000000000000000000000000000000000000000000000 -aHat: [[[7070134, 1577377, 714885, 1093856, 3397558, 4823510, 416386, 2677182, 7683695, 4668145, 6900630, 2283364, 8186656, 2610993, 1791271, 4932385, 7777769, 7324490, 3763859, 4967778, 6252771, 5338587, 6369292, 6119713, 6927608, 5381550, 5204823, 5161654, 3364233, 6116458, 1093263, 7050711, 3072891, 754596, 6240735, 7976285, 7643032, 7677715, 5293315, 2705353, 157961, 2258470, 4131420, 7412157, 6010274, 2475260, 1247368, 4132148, 4425701, 1540943, 6581395, 6344713, 1635346, 1321960, 4017656, 720947, 5034045, 7076039, 6642482, 7345401, 4167553, 3924386, 2785696, 2280678, 6156209, 5174009, 8206167, 4544999, 6089892, 6114584, 7929603, 4787978, 3718623, 5961932, 7617187, 8334252, 1370275, 1201882, 5406198, 6585656, 7158507, 5499382, 4823835, 5949947, 684288, 4364299, 3229100, 6006999, 5487612, 4751791, 7820482, 7526494, 5941348, 6467601, 7071296, 5637739, 7831005, 7086466, 4396619, 955011, 7220606, 2368761, 4106716, 5252040, 7228202, 4432070, 2968966, 49471, 590903, 3285939, 281189, 7796736, 4141657, 5809408, 5847018, 568073, 2340243, 5192244, 4035953, 7165659, 2931115, 6169975, 5362495, 7918998, 5551360, 7306991, 1130479, 6520478, 1351430, 3661016, 5421526, 6653420, 1667517, 1576391, 4922551, 2112917, 5936905, 6156332, 6211337, 4631507, 3448511, 1580616, 5395030, 2097399, 5840546, 4846106, 7002268, 3392589, 7288967, 6920293, 6918964, 8202945, 2039960, 2555344, 476217, 5578231, 5557118, 3225898, 5104752, 775860, 3066826, 4131891, 7817361, 6358154, 3560607, 7559476, 4697643, 964817, 278186, 3789239, 2700828, 704179, 4735330, 4249857, 6391167, 7146078, 1900987, 2889062, 7922178, 5639842, 7781413, 258423, 4570650, 5372710, 6419056, 667146, 7043726, 4002367, 3929153, 2817541, 1116994, 7528299, 4579621, 3845190, 1340471, 6911382, 3893913, 4115090, 1848100, 4504340, 2088719, 8266421, 1051011, 469824, 5732015, 5353865, 5653453, 3856040, 5537923, 6728347, 3558197, 3446316, 7224753, 794316, 8046514, 5970859, 1414508, 5193651, 7534889, 139698, 2042677, 5956781, 8377287, 934274, 418688, 5939563, 6451912, 3662414, 5509430, 2412997, 5367001, 2811603, 7462125, 1396765, 6898485, 943966, 733426, 118871, 264329, 1758982, 6206336, 302489, 975495, 3287914, 4597453, 4120568, 1707565, 6067201, 4498297, 8182557, 2437779, 1715287, 7428063, 1044776, 7816011, 3165829], -[4600394, 5576201, 8016384, 4754202, 6787727, 592189, 4612121, 3394665, 7038485, 7473009, 6692465, 2051536, 6601222, 5197463, 4672049, 2025038, 1667946, 6052692, 7774795, 5688604, 7247763, 1428635, 5894966, 2914513, 5839959, 5734553, 7987834, 4799326, 2181784, 6550378, 4408623, 2258770, 8257748, 6166677, 142717, 6376651, 7744502, 5077355, 6520509, 75739, 1104942, 126571, 851844, 4102336, 3474371, 5027025, 2831056, 1366990, 289071, 3615416, 5434462, 5230839, 3292325, 6850488, 1257315, 999277, 4313023, 644692, 398461, 6615602, 1155298, 2696723, 2214961, 4945053, 6549262, 3714122, 5466750, 555748, 2274370, 1495559, 1805069, 1070000, 898692, 5133909, 6644258, 2345553, 3619006, 2122416, 3941136, 421279, 481001, 6853366, 4103202, 4978981, 4869144, 957457, 6743727, 5347573, 6414133, 2337889, 2326507, 8140605, 1035708, 7150185, 8339688, 5888756, 7466030, 5742694, 7887802, 2881573, 3225573, 6555422, 2383886, 105590, 301105, 2063062, 6488306, 7497115, 1254033, 2950238, 1736235, 24507, 7528756, 3912071, 5943519, 5057415, 3411750, 6030677, 5478015, 4981357, 5773280, 4666014, 47353, 2559833, 7917687, 6247301, 2978601, 4542059, 1142989, 3048192, 1745363, 1285088, 3637252, 197293, 6672651, 5870503, 2766404, 1188833, 587821, 7472671, 6203360, 7884389, 2546006, 5641590, 3377197, 5284348, 7247894, 4104048, 2718786, 5436886, 8102324, 1940845, 3771197, 7861884, 458464, 7801351, 5333681, 2598325, 870342, 3714639, 3234684, 5287739, 3012712, 3588566, 114530, 4169227, 1711214, 7681620, 5963941, 6222200, 2692964, 7118922, 971100, 4272009, 2156224, 1924359, 1050377, 971584, 2702083, 2355646, 3568399, 5737001, 3231290, 4899957, 5260201, 1488835, 5212057, 7268836, 7505957, 4191343, 6342250, 4487820, 3950755, 4353290, 2052974, 3253587, 4647627, 5519799, 2603523, 8349708, 8140359, 5702291, 6561273, 5125649, 2869237, 1904717, 2780151, 7997958, 4535572, 885804, 3658629, 2850997, 1018603, 3007571, 6521179, 1955586, 5331638, 971437, 6384475, 8205407, 4213799, 7957788, 8216007, 3679583, 5158657, 280069, 3822385, 5709964, 1538812, 5487960, 3720142, 1835618, 4655936, 58286, 5753407, 2542709, 290268, 5858428, 5458318, 852718, 5131948, 7555432, 8301049, 206141, 5130126, 7020904, 6707586, 5810176, 2445485, 6336048, 1032164, 1942014, 338743, 1029077, 6934368, 6468588], -[972540, 2699299, 6992252, 7518599, 1768119, 6369335, 4945635, 3994220, 7122543, 5589687, 909577, 6363532, 5980765, 39013, 7035863, 3743860, 5069334, 1839988, 3370968, 666144, 5511617, 7247538, 6108702, 5585177, 4071779, 1323965, 6689080, 8282554, 4778273, 1434908, 7977692, 510312, 2869585, 3776894, 6963287, 3762680, 4776150, 3713918, 3104329, 6672515, 3858734, 3131698, 11023, 5482889, 895810, 1326966, 5857099, 6776288, 1952598, 3324104, 3662162, 3611927, 6558610, 2167449, 4414099, 7901313, 3060391, 7021464, 7786345, 2691755, 3299926, 574058, 1697320, 3118193, 7221249, 7837166, 8379668, 2020127, 898776, 5960914, 7817860, 4495562, 6040508, 3382501, 3511900, 6405114, 26972, 7216770, 6173849, 4978644, 5320165, 7246859, 4216018, 4363277, 1138023, 3079114, 5248423, 5991608, 3932860, 2942558, 628487, 2413652, 4366476, 4673681, 2108140, 1057253, 2796924, 5112625, 7111647, 5093079, 3099365, 277612, 4311450, 2252487, 7864524, 3458, 1992314, 7582634, 994063, 5791621, 6399375, 7550203, 6336015, 8066386, 2745678, 6258621, 59068, 6258315, 4091618, 8048424, 8115559, 3539115, 2594410, 7626762, 2646855, 7750777, 2675159, 6518092, 7235079, 7980835, 3105870, 6887931, 3758908, 1235908, 2803632, 5491370, 384493, 6614281, 5069201, 7798449, 488482, 6647091, 4010539, 7971097, 6156655, 7108425, 2999824, 6879384, 1412221, 5925375, 6601723, 2670373, 5096232, 6033913, 1612790, 3671140, 5796874, 1395395, 6211142, 3787161, 2845271, 4479026, 8331376, 933790, 2768055, 532980, 6795975, 1422505, 2251528, 3955130, 3980811, 6000004, 654701, 2113823, 5309851, 1513651, 7654387, 1785155, 391208, 123272, 6765587, 3388981, 3520682, 5350176, 7739840, 5455245, 5380840, 4902637, 7910214, 7264112, 5808181, 2940726, 8024631, 6836332, 1858963, 4510273, 543016, 1372456, 7764804, 4273830, 6477514, 2082118, 1926085, 1609241, 4102493, 5181582, 5524896, 7564320, 6383955, 3488872, 1246262, 3428532, 3086341, 3294851, 7434087, 5494033, 4238181, 4119946, 7419729, 5732801, 3231033, 1626418, 8235140, 3737584, 7920005, 8137782, 521475, 2661358, 529050, 6854728, 2470389, 1974704, 34401, 8040544, 2967343, 2884554, 6051195, 8129410, 956705, 1322481, 5753314, 5814463, 6305566, 7043432, 5496717, 8097945, 2275989, 623632, 1271572, 7623544, 3977927, 1776856, 5375710, 4823342, 3075045, 1698896], -[5972107, 6909829, 3379538, 2413367, 1416819, 3881522, 4977221, 8163627, 8339231, 5841330, 3164909, 3818264, 699509, 5511477, 7897434, 6683877, 2033144, 6516310, 6501137, 1254724, 1179888, 3518485, 8047610, 7600957, 760188, 4137871, 5521751, 4476208, 8252960, 3932053, 2701612, 7545290, 7685184, 699340, 7071309, 1231863, 1098042, 2840983, 2362385, 398264, 6639042, 4124261, 6225453, 4327735, 6589835, 7294301, 993524, 8043353, 1248813, 1351244, 6606855, 5806755, 4162670, 6964316, 6283991, 3653272, 7316880, 1297541, 6687278, 7342668, 5390711, 1401619, 4597994, 1304472, 632345, 6993215, 3874486, 1754586, 7513700, 3224999, 608932, 5547340, 2747808, 8221735, 5502647, 5429395, 1736984, 3342902, 2240155, 505124, 1302903, 8248493, 6639528, 1835605, 7595258, 8169316, 2761999, 5195289, 3109234, 5596197, 2174190, 1946475, 900022, 6630572, 2209807, 1631072, 3632200, 6940815, 3444295, 6438226, 5845475, 6749119, 8102302, 7276799, 3071894, 5896879, 4437197, 7501455, 314375, 2423700, 6357442, 5877061, 5123980, 434290, 4045474, 1958302, 5628855, 8328222, 6732673, 6638496, 2082097, 6570351, 4526383, 5335945, 6813750, 7230688, 7455062, 2496154, 6270656, 3397844, 1511847, 5873485, 2949318, 3713761, 4709614, 1390335, 8322655, 25743, 7547783, 1259460, 4797995, 2993411, 8177022, 4129870, 792213, 7787284, 7838862, 2044096, 327915, 1884285, 6897191, 1550108, 3233028, 1723004, 4015377, 6814205, 5660776, 4038870, 2581711, 4282120, 6468791, 4542684, 7873460, 6647012, 3729263, 2907561, 8254443, 3508149, 8109887, 1152510, 4166692, 2435502, 262525, 4551375, 3725404, 3017465, 1097588, 1996871, 7389719, 2656686, 5442968, 3383783, 2176426, 5391279, 357399, 4044777, 4180211, 7839123, 1743844, 1279514, 2805428, 4538935, 750725, 3775534, 2915480, 3980704, 7562812, 4896244, 5586323, 2307723, 2544668, 476916, 8372877, 2996417, 5419712, 3528821, 3783845, 6019238, 5662568, 68720, 1247622, 3664839, 3472102, 4410524, 920010, 5253309, 2993530, 4744286, 7729440, 1339673, 1299214, 4549516, 5646506, 4126299, 2476700, 2386859, 1729965, 6897592, 2326252, 2707976, 7576752, 3554161, 4430940, 1366487, 5031951, 7046344, 5313068, 4511100, 1058298, 2945648, 5723150, 4867027, 5851263, 6624668, 3082492, 6658073, 252986, 2194080, 6240219, 2388749, 2457475, 2089692, 8030147, 3710718, 4418705, 7953275], -[5540048, 6431928, 4520140, 3607688, 7260986, 1555656, 1420144, 4740689, 7805648, 1053681, 6928727, 7387257, 7640489, 6578385, 2695980, 1776648, 5453283, 974087, 1164288, 305868, 7071233, 3675766, 6567652, 2789594, 5569208, 3228753, 1300411, 8333345, 2200068, 2329529, 958591, 2041262, 1973720, 4804504, 1915416, 3204916, 5510016, 5227687, 6433749, 6428626, 3877348, 2583885, 8102628, 992619, 3664149, 3092480, 1619666, 7792408, 2406676, 3896333, 7417072, 1205393, 1310661, 3436947, 2034307, 5059359, 3168707, 2913575, 6819048, 5073492, 4945171, 3479865, 2731087, 2678979, 6534408, 6373038, 2568611, 811564, 4881793, 152098, 7208050, 8227260, 6909975, 1976562, 768020, 2622494, 314269, 6253519, 7430809, 7266905, 2780613, 8313386, 2137963, 5439099, 1979073, 3109773, 2347208, 6970792, 3322457, 6471883, 6254123, 1759988, 3966716, 3262914, 6532485, 6534469, 2739252, 2127976, 6512270, 8314243, 2476408, 5881110, 6580132, 3293943, 5610536, 7378443, 12628, 3273903, 2263840, 6212143, 3949279, 1722468, 6389743, 3856924, 5759351, 5982056, 1747094, 8273559, 680513, 8019696, 2188548, 4893553, 1815112, 79638, 1929058, 5853563, 6390713, 7253270, 1196522, 4202311, 6334634, 3077922, 6681668, 6576554, 4206801, 629913, 7561973, 6362547, 7296816, 6101986, 8236614, 3356536, 6994571, 929090, 7964160, 7973755, 5424610, 6433301, 8007614, 3950770, 749601, 7759101, 5471056, 4387926, 2698040, 8232396, 3905290, 3344668, 918898, 5432028, 631641, 5565334, 5345041, 1622467, 4826500, 2324025, 1322489, 981037, 7690071, 1692104, 3619263, 5680974, 4288873, 3412683, 6846496, 4610307, 2041768, 151633, 2903726, 7425339, 3365295, 856787, 6160756, 7801828, 6932746, 510465, 3630964, 6803192, 4515031, 1968691, 1058129, 5282979, 6408800, 6173469, 2131889, 7679147, 5546028, 2355640, 5095342, 6146034, 2756280, 454153, 4517755, 4844354, 4623589, 6859868, 4225446, 7507287, 659357, 2542537, 6957926, 5921372, 8145409, 5369426, 3848963, 7479403, 13807, 4290493, 4820978, 3154197, 5886875, 3937350, 7541699, 790295, 2139682, 3865273, 6864811, 1625381, 6308908, 770500, 3590623, 3469918, 2289088, 725804, 7626622, 1334992, 4652194, 7116728, 7155231, 1364062, 2123876, 872174, 1285717, 7679430, 5516989, 6092067, 1148254, 6560247, 3228256, 6660234, 7692679, 6062510, 6462493, 8252954, 1158600, 5929690]], -[[7693815, 1882484, 167998, 7297973, 6736964, 4929570, 6173364, 3586617, 5884687, 1748356, 3958478, 585800, 8272285, 7394928, 4253234, 8081619, 8001842, 4862556, 2452673, 8219333, 1600163, 359825, 7082101, 5796579, 1825863, 4610247, 4508878, 2799529, 2082327, 2627255, 5184417, 2071591, 8173573, 26307, 6560694, 8257511, 2205991, 3633725, 195183, 7544409, 3636038, 488902, 5677811, 3494617, 2226346, 2631124, 2860900, 7541544, 5369562, 6077539, 7099136, 5837822, 1812140, 6457498, 5005971, 7289942, 8242991, 2004849, 299815, 1928652, 7809896, 2023930, 4304933, 3206119, 2046977, 7160694, 1666931, 6829733, 665196, 5688120, 7796254, 4728752, 3500865, 3953888, 7135376, 5060938, 7640093, 1189947, 5318512, 3986017, 549805, 1541556, 5801279, 8033885, 3854316, 5428577, 6405091, 1680009, 186189, 7488252, 3225890, 2000284, 1937243, 6629532, 1870652, 1293543, 7471158, 365231, 3283680, 896598, 1289920, 7599035, 3466017, 7568415, 2312291, 5605697, 6734233, 2982547, 2239497, 7374565, 7293493, 6010640, 4126370, 3171305, 1787695, 7907523, 7088243, 6066451, 219035, 485205, 4812440, 4425528, 4754285, 1459621, 4847568, 45111, 7219282, 5766748, 6780103, 817056, 1204877, 5091332, 2114728, 6073904, 6360684, 2099669, 8139714, 4000574, 5446966, 2673438, 2875704, 2989869, 7749150, 6399027, 5325314, 2120088, 2408395, 6286621, 5208901, 6476228, 660533, 5599865, 6734800, 4361538, 7039821, 5520358, 7188623, 5341164, 7191702, 3411656, 4351247, 4923980, 966671, 4747179, 561961, 1000559, 4382588, 7315692, 5100494, 4153344, 832702, 6291469, 2167824, 6794097, 2735430, 5163643, 1458049, 7933491, 6416720, 2780890, 1844064, 4606962, 4739506, 3642544, 6776759, 240495, 4435920, 1502123, 5998081, 6140373, 6545443, 2764530, 2950920, 1762135, 6356507, 7524461, 1651034, 3907084, 4327558, 4750211, 2007666, 4073125, 197162, 1726879, 6090561, 5473656, 6659062, 176763, 588658, 2642573, 1369347, 3752909, 4922845, 2973784, 3700489, 5370132, 1633652, 7736880, 4551565, 6852385, 5027866, 3670823, 7228556, 1743029, 1996195, 6144078, 6617034, 5700657, 5522881, 4933902, 2311223, 1405833, 2485769, 4596471, 1660051, 179276, 4415913, 7422425, 7832333, 6675773, 153330, 7674919, 6408569, 6567276, 4468493, 564681, 5337224, 5481650, 7889117, 5871641, 4584925, 643903, 2905210, 4384661, 1795662, 2959446], -[6322209, 3641383, 4061442, 4222050, 7955807, 6955885, 7866524, 6921045, 6540249, 2599322, 1359674, 779263, 520439, 1298739, 2483885, 406247, 3920846, 4870383, 7326149, 6104691, 6847808, 684952, 6955550, 3490063, 7218064, 8174201, 940272, 6862253, 128026, 4697463, 6802409, 116586, 4282723, 5284544, 7006832, 7832897, 4513465, 1816085, 41318, 92329, 1958176, 647713, 7696556, 4460996, 3869482, 6131656, 7036177, 3882551, 4251946, 6494439, 7340950, 260910, 5617524, 5011928, 4663769, 568818, 3858984, 4746144, 5040757, 2546151, 821229, 4999014, 2753041, 1231045, 4843429, 6701924, 7163628, 662706, 1357579, 4693787, 3858070, 6823788, 5927383, 5141298, 4048818, 1293972, 1254295, 4458189, 5381838, 6148908, 4038380, 3788600, 1170743, 1297459, 2373572, 6096908, 193087, 3420598, 4090697, 8174988, 1632445, 7600867, 4692251, 7568828, 4609312, 4535614, 2938424, 390705, 7244184, 2303642, 2018130, 1455422, 2150911, 6037543, 5098665, 955929, 6876240, 4048623, 2370806, 66087, 3903081, 4687271, 8085662, 1067769, 7574807, 2976993, 3744389, 4347833, 2387972, 4592672, 2152791, 247113, 6586150, 2120348, 7007578, 7756302, 7840423, 6376820, 1933533, 3775630, 4245076, 5515219, 1520554, 3566619, 1508089, 531643, 6350022, 5067717, 2676135, 6997572, 7207946, 864374, 7104084, 1623619, 3619163, 2120277, 938296, 5620579, 2991261, 2202835, 6361727, 4911816, 7873258, 5904408, 3619574, 2151546, 7047743, 5559566, 7990319, 2773318, 5317338, 5585690, 3899005, 7148722, 5273289, 6712889, 1870740, 1683743, 2936021, 5882527, 851580, 152857, 2646147, 934611, 2911380, 7068350, 3535600, 5032133, 5357603, 2412716, 2150167, 3740630, 4877645, 595288, 6652777, 7381927, 6565684, 713365, 1231386, 5419868, 6761803, 1782060, 5427622, 4107038, 2402049, 625204, 7349870, 4314120, 8114372, 4774291, 2084084, 2593208, 5576343, 5471719, 159188, 5881562, 5895398, 1676480, 2962096, 3071171, 3125356, 2190975, 3837693, 6701217, 317334, 5534985, 4107636, 7672832, 192002, 3681401, 1186509, 3932293, 3263250, 8106241, 4229724, 5596370, 3343337, 4595443, 457224, 1317477, 8366823, 3015643, 6133711, 4430180, 1681046, 412290, 6679244, 4091999, 3569755, 1288557, 7562480, 3644450, 3798596, 5572772, 3213447, 4622547, 6798378, 1333303, 2144264, 3555217, 3219746, 30188, 6053984, 3166014, 7723531, 5124311], -[3756672, 7736103, 2825780, 2943756, 2727290, 2561738, 1484911, 561739, 3096000, 7207241, 8069616, 2741085, 1636416, 4637829, 3443392, 3478709, 1819290, 4719933, 3770168, 7092075, 1019321, 5180817, 5455123, 4622116, 719498, 1736653, 2936988, 9387, 6455606, 5256153, 195582, 6320087, 5030526, 3989229, 4165343, 2017455, 761018, 6897417, 8363952, 2761283, 1782585, 5262849, 3497566, 7731736, 6835996, 2062971, 3495079, 1774629, 780273, 1215276, 7911639, 310156, 2001586, 5364660, 5821516, 6499960, 8366932, 1373905, 6073141, 4450215, 1056303, 207754, 8021044, 2598291, 461653, 2428221, 6629739, 3644919, 524949, 1745299, 4648795, 2160481, 3092495, 3595379, 6280876, 4619932, 26747, 1122340, 1272013, 6691410, 3877943, 6518188, 3679354, 5324912, 2421265, 7278907, 4777431, 479393, 6748856, 3380229, 5087260, 1166559, 5211690, 4239131, 4661653, 1563707, 3940838, 445288, 3416981, 4767077, 2218621, 3804273, 3736829, 2018266, 1569575, 7361787, 780888, 4876754, 4703319, 6124290, 7340628, 3649094, 6590588, 7720530, 6238131, 4136708, 2816946, 1983424, 4412260, 4194338, 1110737, 4061073, 7565434, 3100356, 4426980, 390680, 1190121, 7980855, 6514996, 7523964, 3699173, 748578, 4124545, 4875977, 2835927, 2702043, 7114400, 4742082, 2460943, 3448368, 2352829, 7519293, 6260861, 5490490, 1104243, 1510509, 7193332, 6203351, 3705552, 3704991, 7648980, 5791073, 621125, 3072467, 3588489, 5223225, 960313, 6319739, 5958466, 3784189, 8043021, 1622929, 1899237, 3702089, 6476633, 1167024, 6793044, 3679107, 2587333, 5698562, 5415190, 5682952, 1305364, 7304625, 8245036, 6455824, 3767514, 2021300, 7714850, 5276933, 1744660, 6046758, 2254730, 2283801, 2308265, 7790653, 8320823, 3354773, 6863690, 4564693, 5178961, 4822319, 6318902, 1506412, 3190632, 5259097, 3853857, 5530324, 7723450, 530507, 4369102, 7220371, 6368518, 5759618, 7341620, 1740302, 4523473, 3977819, 6526553, 4162646, 6961077, 3502207, 5360855, 5945530, 5363357, 7195389, 3586887, 2597499, 1878458, 3360362, 1736137, 3139438, 1172375, 1996672, 8136034, 2568680, 1065260, 392823, 5774940, 3668862, 2166047, 2447344, 7238524, 5568342, 7377980, 3528786, 5382220, 8068273, 782950, 339002, 2302524, 7875602, 2849279, 4714021, 5168868, 2521974, 3176807, 5656280, 2276804, 6779758, 494143, 6538752, 8172021, 5389904, 3071338, 229213], -[2358292, 7885884, 2619080, 6346122, 6834595, 3600178, 5974397, 3369626, 78273, 2728173, 149354, 1700462, 3882482, 5793306, 5220481, 5999073, 6077871, 6408969, 2313920, 706918, 1997558, 3595359, 5040032, 4145802, 1002088, 3662841, 1044884, 7240852, 7627909, 8335737, 5271511, 2809065, 4615252, 5491072, 7348200, 7134316, 892056, 4315106, 2095030, 116453, 2839605, 8168939, 1267469, 6080844, 614486, 4676441, 4895193, 1353833, 5420760, 5663510, 7565030, 7890505, 4793806, 7085374, 8035075, 2285947, 6850412, 1478307, 6806441, 1618642, 3675249, 1451767, 6723492, 4674510, 6366901, 7276568, 8321434, 422434, 3001747, 2161632, 6413809, 1403104, 1490244, 4289684, 7132551, 5008327, 6726388, 887250, 2540975, 1533585, 5649064, 2218456, 6103991, 1277866, 3015715, 533086, 2250567, 5948382, 990238, 481535, 6209169, 3550878, 3704493, 3182391, 3081558, 251514, 1771009, 6663074, 635375, 5710734, 1719980, 7112636, 7635906, 3235044, 890243, 3767858, 3871471, 848957, 6783749, 6393788, 3780983, 2983612, 1398257, 379364, 6304952, 1816175, 7890478, 3206007, 4102895, 3152700, 5729135, 2380559, 4607316, 7201524, 7000430, 3737477, 1898272, 461163, 2853736, 4034706, 6536824, 5938428, 6717627, 7345531, 7727663, 2455232, 683189, 1493814, 2325099, 5761267, 3620763, 2797755, 4905629, 6190654, 104046, 3729698, 5663825, 7476279, 4578690, 2770512, 5443005, 5074678, 6784027, 5158665, 4078965, 228749, 2694194, 5036274, 6313353, 7130628, 7462409, 6386713, 1700581, 4225626, 5598787, 5487370, 649719, 6927919, 7180844, 1793853, 3910772, 6448610, 2097613, 6162784, 448266, 4606395, 7819312, 5120210, 5811342, 7741218, 5602768, 8202048, 4836554, 4287499, 6761865, 5783623, 3799589, 856169, 5486457, 86375, 6377651, 5114007, 5307960, 201225, 8216304, 822361, 8270022, 3526704, 1761244, 138335, 5699744, 3913726, 5205161, 4234110, 8260224, 1376922, 5688707, 1512298, 6496912, 2995942, 1129037, 5094785, 2625858, 6891134, 5730945, 7664399, 1212625, 3731224, 6881542, 1595079, 7812953, 6600900, 6827071, 3541951, 4501427, 1036484, 4836218, 6226888, 233745, 3899899, 6504428, 6755630, 7058058, 2272315, 5686767, 649087, 7723701, 551380, 6742764, 7447128, 1200591, 6421714, 3944399, 1954637, 5505146, 6007249, 2932714, 4364963, 4077051, 4021706, 5064969, 6455512, 1822156, 2259294, 828607, 406191], -[4035469, 2801957, 171288, 4726722, 3288158, 8059965, 7103846, 983085, 3664218, 6895647, 4725799, 933159, 7665089, 7873980, 7188661, 1754032, 6765385, 2744063, 6473697, 6603300, 4019825, 7049088, 27735, 2603903, 5007594, 6698919, 4749724, 2970941, 764834, 1090298, 5632050, 2934895, 2154901, 8237956, 5297025, 8318516, 3302349, 4600209, 919622, 577203, 5388082, 1468723, 2752849, 1658076, 2430310, 1150554, 582769, 4226013, 1452138, 7856144, 4866856, 5268123, 7085876, 2650151, 7597544, 1238691, 6581657, 8144596, 1427984, 1989195, 8162508, 1142916, 8284421, 1858024, 3554196, 7142255, 7299230, 7425229, 3997055, 859566, 4709804, 7513118, 1747877, 709700, 4349065, 4002938, 7083359, 3562856, 6460455, 7208699, 7558680, 3769811, 6454770, 8229541, 6137983, 4047144, 7804011, 6284572, 1301356, 7100947, 1283269, 4390448, 8258350, 2366803, 249945, 5228757, 4821903, 4689548, 4972443, 1682084, 4970859, 24328, 161901, 1949687, 806110, 7608261, 6864235, 8360641, 1711159, 3806282, 2346341, 1749729, 7469462, 4661825, 271775, 1384486, 2063630, 3243088, 2272574, 7343921, 7167659, 4060211, 3915126, 6781780, 2329066, 4796015, 2610612, 3022006, 749208, 7094228, 5747174, 1260351, 8272435, 916440, 558066, 1327994, 2783898, 4064862, 2421588, 3470645, 1987582, 648294, 1406680, 6585273, 1854876, 7543310, 2879653, 7901754, 3848674, 7039494, 470087, 5480039, 8018121, 6424366, 8094720, 1473130, 4459546, 4007847, 412662, 8061230, 1132637, 1643113, 2118756, 4422556, 2981527, 4186777, 961917, 1161367, 6138904, 2507834, 5230225, 3343960, 4586757, 6485721, 3011705, 6364321, 6320810, 5702120, 3929687, 2592402, 3215581, 5788247, 3583302, 6787465, 7098911, 2405636, 1870338, 3287625, 5154229, 4985532, 7403400, 1468403, 8280488, 6963349, 7562028, 936845, 1326398, 8099005, 2254121, 2716850, 2186346, 4123578, 7115115, 7814420, 549474, 1974772, 5649664, 4536299, 6247305, 7893691, 2955440, 698400, 1436850, 2885211, 3126869, 6771994, 8320740, 4437202, 4006735, 5721579, 6944843, 8346331, 5532188, 6527433, 811661, 7401089, 1861972, 2202096, 7849519, 246527, 4568089, 436208, 8219038, 2756585, 206974, 445236, 3841676, 1957571, 3808239, 5188818, 2020073, 4497323, 6775618, 2840919, 1314046, 6936276, 3540045, 2390515, 4452041, 1490301, 667947, 2896248, 1053604, 6052970, 2458066, 2596887]], -[[3910367, 2228457, 6884424, 3462238, 1063668, 3561936, 5476453, 2654213, 2909876, 7106050, 957368, 6179922, 7084838, 7718859, 4539874, 603612, 2971058, 3232649, 3882157, 242143, 5966074, 2539005, 5131158, 223274, 4975229, 1619020, 5604115, 3884179, 8261362, 6165885, 8072385, 8146835, 5160565, 3102719, 7533302, 6729761, 3722903, 6858607, 2503266, 2382025, 8073865, 8168522, 1432024, 6407140, 7233118, 1705485, 6228732, 3090297, 3560107, 3583390, 6931711, 2844972, 3767623, 3067011, 4433148, 5497539, 3723625, 7081532, 7527914, 3461095, 7825067, 4532647, 4274854, 7163005, 3683963, 3003250, 7500148, 2146357, 6047390, 2064036, 5356383, 4795924, 2817643, 1935428, 7879908, 2101294, 3086759, 7718228, 167413, 1053616, 3315442, 1996249, 8256765, 3991153, 4735369, 6398679, 1026625, 2015589, 3683442, 486537, 5253956, 7459072, 1934341, 4411978, 637811, 1439557, 8156704, 5359234, 91909, 1557739, 3704089, 3789081, 4119816, 3860121, 575308, 7685137, 2564828, 1516816, 2532876, 7368096, 2227404, 5367387, 3853872, 7732649, 4195742, 2967018, 6582053, 4511117, 1792550, 4755844, 3445894, 4754027, 1866524, 346768, 6981533, 1016621, 6298342, 806420, 6968086, 306544, 2656678, 201127, 648044, 3115900, 6826525, 55627, 8191798, 893032, 596016, 6363503, 6779602, 6289454, 733550, 3318134, 356577, 2177969, 1107500, 4873590, 3733588, 5084957, 438461, 6513759, 3539737, 4989516, 1254692, 2238854, 5487899, 6805766, 1958863, 6677839, 106418, 7083910, 3790469, 6396790, 7451796, 1950029, 1103797, 1609133, 2052066, 7701577, 2159490, 3265741, 4844327, 1672224, 4132356, 6460005, 2716063, 3768134, 2393795, 5863915, 1583049, 1908150, 1031469, 2054794, 1838255, 3434711, 3432765, 6558554, 4308405, 1803407, 5309833, 6250761, 2296040, 4949718, 3201439, 4744356, 1072930, 7731718, 5348914, 6067356, 2648243, 6083542, 8140313, 3712827, 4493962, 7778298, 4998847, 36742, 5417447, 4244218, 7211730, 6586563, 6831326, 763957, 3627303, 6524902, 1152088, 2808044, 7096088, 4799186, 5349583, 7213968, 3753195, 1563369, 7616695, 633486, 7215467, 8301978, 4774382, 2001320, 1516480, 1004405, 2950346, 5647137, 5453897, 5628666, 4315157, 4376363, 600417, 6940487, 4730649, 5151519, 652210, 732903, 4250606, 6892214, 4303095, 5921039, 3746161, 3353434, 5721771, 4065668, 6478833, 6660046, 7936996, 4261083], -[5378232, 5519568, 2355810, 3621403, 5539526, 6187133, 2653144, 6109264, 1730233, 8189627, 499940, 7783460, 833940, 4477684, 2045325, 5885297, 6984345, 4388026, 1079881, 5874265, 122313, 1943074, 7594897, 1305742, 1862534, 6248389, 2691285, 4923809, 8130997, 7008875, 5698602, 7086629, 6178518, 6579692, 4606344, 2901588, 5303340, 6761970, 2984821, 4702431, 1728972, 7714698, 4341053, 2995356, 6957019, 4958529, 3863814, 977827, 5297520, 4642633, 549572, 5420178, 2908131, 6762098, 7215334, 3869182, 4217291, 8220278, 3463118, 2765199, 600163, 6813710, 1173334, 5683258, 381988, 7820562, 6506503, 7166247, 3342831, 3698129, 4310784, 2284071, 186716, 6566115, 6278221, 6856302, 5881026, 7406499, 3288717, 1050314, 6507863, 2287516, 3204019, 7633001, 7754103, 1463830, 7771401, 6410495, 891372, 4782273, 7479723, 2006984, 4929558, 388890, 4134533, 5335354, 954387, 7928970, 4459966, 5177744, 6408930, 3022173, 7553307, 7866347, 6207115, 3832721, 4238462, 6641491, 6067244, 6160973, 2899785, 6131915, 2781095, 4308389, 2977666, 7350224, 4806890, 635528, 2824939, 6976672, 1158457, 7259189, 3845871, 3083866, 785129, 8176387, 5636564, 2395814, 7344953, 3593714, 8358884, 2601000, 540222, 2639816, 3742184, 636046, 142634, 898643, 2537432, 5072039, 5986331, 6541054, 7837094, 4558652, 3250767, 7584036, 6294681, 6189173, 1582821, 2780369, 6062455, 4522430, 3841559, 2638465, 5228066, 3730307, 6638190, 6311935, 4636091, 2138840, 7866730, 7748280, 439873, 6098115, 7033343, 8266676, 3387673, 7843800, 5801100, 4818283, 7661043, 338985, 5618912, 5790698, 7332316, 4988265, 7270926, 1366668, 2972283, 6567252, 5181152, 7926761, 2122551, 8071258, 4143213, 2878259, 1309688, 914364, 5467523, 2912492, 200102, 2531388, 1235659, 2519176, 1477947, 4606921, 7296170, 8076122, 742207, 3818833, 5051033, 588625, 547456, 8258174, 7944609, 4277846, 5896672, 1771745, 6627981, 1767923, 8099791, 3091208, 7095235, 1772442, 2528699, 8303486, 4964405, 3916502, 5768158, 5575577, 2709084, 5233488, 4461827, 5341935, 1552101, 4093582, 3202478, 7261692, 7417357, 3549472, 7975921, 1546998, 4412096, 4174489, 3784283, 1949058, 1690762, 5073231, 7162061, 846725, 2034908, 8052784, 2453721, 5602524, 2245985, 6412959, 5795220, 4250156, 4940466, 3055634, 6639046, 5186132, 1434572, 37074, 614382, 3802312], -[5436353, 5274401, 4212034, 936401, 3815775, 5644067, 1365496, 7212505, 7623262, 7348927, 4429029, 6758201, 4210369, 1383162, 49214, 4227716, 6344440, 5701425, 733605, 6793090, 3206873, 6655299, 3234008, 2989593, 6230709, 7978148, 8291411, 6342949, 2040880, 4519697, 464252, 6067351, 221790, 4964161, 740625, 4177070, 168342, 898238, 4371996, 677710, 6635182, 7908077, 7615091, 6780788, 5873272, 7246868, 2207487, 1651751, 8326726, 4668667, 3230869, 4164443, 4774338, 4338492, 4876751, 1098402, 1078522, 5119349, 3057530, 8066207, 5095839, 528216, 8276836, 4360736, 4156767, 5986862, 8255635, 3780563, 2069353, 17919, 7120858, 6195475, 597983, 215615, 2665097, 7600860, 5851044, 3237114, 3349394, 3786690, 6622086, 3145294, 2788299, 7494984, 5527854, 1053149, 3487085, 939407, 8331201, 1807550, 2886683, 2972286, 2529737, 2557773, 5989245, 3172412, 1767779, 1563470, 5057859, 937549, 6585369, 7362223, 5853469, 1469596, 5050573, 36104, 3701261, 330682, 3116096, 4630492, 813079, 2130234, 3205887, 3596534, 7598404, 7629766, 3653200, 4274662, 4262627, 436270, 7684970, 1699282, 8263952, 1733120, 6364734, 2624342, 7422938, 4282363, 8270185, 2817614, 54422, 8125817, 17461, 6388071, 4506669, 2887562, 4916951, 4395622, 7244707, 3272383, 7348019, 985071, 5091114, 7225084, 6583593, 7400179, 727486, 6564146, 308586, 1048188, 8250425, 4735141, 4398457, 6775980, 5762240, 6935921, 1625074, 1507334, 3326439, 2174796, 3800220, 6354817, 3469442, 4740236, 7134547, 2600800, 3036585, 3332703, 2378565, 3025430, 1226150, 4584968, 1584386, 4183116, 552722, 1121406, 8039922, 6987828, 8324164, 6382626, 3027994, 7453037, 3769251, 1739495, 69340, 4751084, 7306130, 7014399, 4700566, 8062945, 7826860, 7394745, 591395, 2592720, 6421885, 6808176, 4661651, 7187771, 5441974, 164194, 309966, 425154, 3794776, 3854098, 8312524, 6630102, 6172682, 3364239, 6413624, 1067524, 4404191, 4274687, 1646184, 1274730, 7477107, 6946766, 7880989, 1961387, 8215781, 7546117, 4620949, 8057551, 655965, 7274095, 4283198, 2222040, 5407101, 4925800, 3906733, 1951352, 1867810, 2643711, 6675346, 7018179, 5682890, 7515128, 4953882, 5879585, 1772086, 3864228, 7407145, 8258523, 6131764, 5330660, 2475741, 6790557, 5268386, 6966218, 285605, 7352203, 3935001, 3690979, 239344, 5714330, 7402683, 3635018], -[4868571, 2112075, 3888661, 2844204, 7580130, 1181296, 3470083, 700792, 6026967, 5505833, 5544653, 1434462, 432836, 4320907, 4843976, 59541, 5586428, 3183362, 6455239, 5366173, 1084079, 7848185, 3896816, 2557875, 6198548, 4590575, 7060133, 162686, 2615161, 1918971, 7205994, 5178573, 5520375, 3978845, 5884665, 4162504, 745613, 501213, 4878715, 3242085, 8056748, 620794, 2320079, 8151017, 8197215, 3666991, 2050124, 7868455, 6526057, 4445020, 1609241, 6110839, 8085596, 4549261, 5621436, 7857957, 4187534, 6031927, 5702355, 1192339, 1959694, 6887757, 6855844, 294554, 938996, 7762509, 2020608, 596913, 3758436, 3991460, 577373, 5271042, 2194983, 7528222, 4153479, 6092217, 1598135, 2735556, 21180, 6224817, 7920225, 1959518, 3296883, 4548943, 578306, 3895072, 1921527, 6462541, 671817, 6803640, 1200407, 4174657, 7377920, 1786222, 2060466, 1760498, 5274434, 2551822, 8156246, 4718344, 7014539, 864132, 2413743, 832648, 5971725, 4692096, 203643, 414796, 1059343, 3344095, 8113893, 3739307, 6160714, 420883, 5661995, 5822678, 7262718, 4280344, 7384945, 6489499, 2087483, 2375128, 2195168, 3861342, 7840279, 5428816, 3612009, 8210268, 3847915, 2246453, 1486951, 2543940, 7988280, 4654624, 2710480, 8146317, 1277963, 3875790, 6469274, 2323723, 4371796, 6725450, 2775285, 1726688, 6173723, 4014490, 2250509, 4567166, 5015390, 4328935, 2307669, 7892718, 4503923, 4141122, 2379652, 6265269, 2495940, 2701991, 4424169, 5053846, 3255440, 7512386, 5392875, 5246897, 5926299, 7959528, 8228585, 2699079, 3295782, 2630977, 2502580, 2440697, 7480612, 6001043, 7083205, 4323683, 1934558, 4111227, 6769488, 3130183, 6197469, 2282524, 650130, 6039456, 813118, 1042901, 2239326, 713988, 5511280, 769356, 6447023, 2338001, 1940520, 3615476, 7780851, 6895020, 3730210, 7276099, 5465437, 3416882, 4158471, 8013608, 5154275, 2371114, 6451181, 7621580, 1170278, 7056972, 7990183, 2952654, 4133994, 7876696, 6311839, 864745, 6454862, 168047, 2306325, 1912511, 6632572, 4069327, 5873730, 804704, 8249667, 3945970, 2007521, 6114710, 1922092, 3094844, 6316281, 3785849, 461318, 2005180, 3984409, 6315913, 4719925, 5908530, 970374, 2711592, 158663, 3251054, 2233548, 1200644, 2493559, 5973230, 8369965, 1587871, 8117328, 7767154, 5252999, 2119863, 5178068, 3797695, 292757, 1385933, 2815883, 3820572], -[1455975, 7617044, 6476902, 6055551, 1343603, 4515127, 3948099, 4839790, 5385735, 2746859, 3925963, 98578, 7421098, 817772, 2516427, 1652567, 8218176, 1758473, 625106, 6937317, 6905812, 6869640, 1443970, 1467285, 1346589, 2014111, 7805292, 6259857, 7246507, 4564981, 7045751, 5796313, 7656873, 539995, 5378074, 1931521, 2106800, 3555888, 2466776, 4882888, 3865168, 829888, 6598063, 139406, 2316106, 8345094, 314666, 5545676, 8050720, 2101, 8277504, 4867492, 4273751, 5098854, 5692628, 3051206, 7441864, 8159258, 5869938, 6253981, 5650668, 4807537, 2830829, 2383669, 3968995, 745577, 5492235, 6095574, 121392, 6781178, 3309785, 2738250, 7590504, 4196881, 1027472, 2615057, 243908, 624530, 3598563, 7079612, 5947285, 526998, 4472426, 282327, 4050210, 4764226, 6172677, 6576325, 1010130, 6708952, 451403, 1421242, 7881636, 6171108, 7314482, 809506, 6463549, 489448, 672619, 2858380, 4321538, 2954945, 2806419, 7684200, 2676223, 6914942, 7814081, 6566590, 5012038, 8112003, 7025175, 4890020, 7833243, 4634271, 431983, 6524294, 5091213, 6709805, 2421300, 2321144, 7049893, 2086597, 3656856, 3380998, 967639, 175204, 1607906, 4186122, 6804190, 6617915, 379354, 4661933, 5327410, 3198556, 8279090, 3238863, 228733, 2057470, 4478494, 6260126, 5680331, 4958456, 1913878, 1683389, 2618488, 1650427, 5335236, 7914171, 2086005, 319422, 4201269, 8203991, 4322050, 5943000, 3895173, 4146035, 1653430, 2996318, 3774196, 5327031, 7024970, 2706738, 4345649, 488193, 222406, 4502510, 8112207, 491368, 5171991, 6565230, 4208345, 3270968, 2514842, 597645, 1589217, 332312, 4184298, 3271587, 4112324, 3156618, 5609699, 2697281, 4511068, 127519, 3190572, 2363768, 3398631, 8030276, 5261264, 7701974, 3084902, 1534471, 4564576, 2827373, 3296043, 2407668, 7851695, 5815286, 6705916, 2463877, 7007480, 7230111, 2942615, 5998681, 7854906, 5338053, 2399716, 7694259, 984730, 3847526, 5401956, 4651057, 5465961, 2569872, 5785033, 8209083, 7272007, 101195, 5958569, 1339422, 3916462, 421926, 4700976, 4482072, 4759531, 3501830, 4581476, 3672715, 3592595, 6254976, 574072, 242336, 4970725, 1045214, 6972040, 3659484, 6727442, 1999563, 5713105, 5979935, 3471699, 647430, 7824348, 8317082, 6249166, 216838, 5533718, 1333364, 2144559, 8075253, 3592196, 8184470, 3699292, 146503, 6489090, 7968488]], -[[211455, 5110739, 4010153, 1816649, 8238857, 64, 290833, 2776837, 1384620, 1232467, 2532554, 7695847, 1084507, 4063883, 5429493, 7859004, 6434758, 3592383, 109901, 4007253, 5323915, 5151790, 1840389, 202415, 157989, 7585285, 6592821, 3705493, 2585464, 1520219, 3816927, 8053479, 6806044, 903742, 4986828, 7463859, 4985825, 2452049, 2033248, 92232, 8220226, 2566188, 7492261, 7433593, 2303502, 3762015, 6691216, 3678125, 3947320, 2073553, 154768, 1583379, 2445923, 3888124, 1888684, 5149761, 2170266, 6943702, 3731815, 7227612, 965427, 5877129, 2189291, 3807866, 5010281, 779179, 5864549, 7045922, 1108785, 6438704, 130268, 3626884, 6501514, 1253173, 4376520, 934191, 8368094, 1206714, 1816947, 1412891, 7329113, 6062172, 4197377, 5931821, 4568950, 347147, 6788905, 3820907, 6571254, 1501583, 91246, 6426659, 6607828, 5787161, 7895756, 7487909, 4787802, 8343736, 2517461, 7795424, 5102461, 3213526, 143098, 2510703, 4067150, 5984942, 8359640, 6181802, 4135644, 2379441, 4640385, 8075595, 166923, 2223553, 2382291, 3265566, 2567207, 3408633, 1727100, 154784, 3723481, 1114749, 3038482, 2410835, 4401472, 1590922, 124248, 4258784, 6861877, 7655957, 3143406, 2441884, 5353512, 1889851, 4680168, 7408350, 7535522, 6694286, 4408842, 2228309, 5642791, 2244144, 3209022, 5852834, 4663288, 3224664, 6966917, 2307867, 1519912, 5431268, 2932763, 6333388, 6166831, 5842485, 2829454, 4052657, 1486725, 5377268, 677989, 1774381, 4011353, 4105984, 587010, 1584571, 1959905, 1020061, 3611119, 4638622, 7810086, 7539039, 4489990, 7344330, 1757066, 1024612, 5945592, 2562876, 7714648, 4047999, 723100, 5244614, 2633572, 6502064, 3934460, 3143179, 1696079, 3131920, 7506584, 6399455, 4223208, 1769592, 7381558, 1282280, 4284521, 2209873, 7622483, 2002686, 3451416, 2430236, 4778443, 8268653, 1250343, 514343, 1896423, 2261542, 6017733, 6971890, 337147, 8051217, 8136682, 1760774, 7958861, 1717732, 6303548, 7082373, 3863359, 6561436, 7613045, 2630273, 3239782, 7406239, 3547589, 2812086, 3940837, 4194550, 4916477, 5179760, 4131967, 7392612, 8353290, 4478699, 957910, 7592263, 8146789, 4684695, 5646212, 6281157, 3130395, 8075967, 6043183, 423745, 4535138, 1658381, 4443719, 2204637, 1548109, 1430750, 32905, 6364664, 7646520, 2919121, 3181257, 635085, 1071546, 5099860, 2534083, 2304975], -[2247242, 4979366, 1683095, 8098528, 4971454, 6741551, 2121295, 7003273, 8331843, 5522362, 2035899, 2167623, 549411, 3728812, 6480582, 8337303, 7874247, 200635, 6451686, 977534, 2503681, 2019608, 1938821, 5522510, 3558508, 5087213, 5715405, 630911, 1863937, 5839077, 1744417, 2815452, 2472926, 4601112, 4577894, 7662551, 4452700, 1397541, 5686523, 3782405, 3391582, 3330770, 3820268, 8313216, 7288365, 2810699, 7580267, 2272426, 5591991, 286930, 6431173, 1757181, 7602624, 7897941, 6936488, 7686464, 3989362, 4317259, 8004431, 383821, 1743192, 713246, 5936887, 4414066, 7139384, 4322596, 7266041, 1087730, 7262206, 1531610, 1783481, 1934616, 315536, 3316192, 332329, 7839907, 3874876, 2101050, 5453877, 7243570, 3387996, 5285306, 1715391, 2596433, 1242317, 7235138, 7534674, 8077609, 5566433, 6491416, 5628451, 6138334, 3347187, 3459850, 1815251, 174698, 6339315, 3575735, 6547746, 2634118, 3993082, 2543690, 7612339, 1487842, 1556105, 1188637, 337706, 2535754, 5210747, 5320900, 5395651, 488266, 4507838, 1220843, 2728288, 5370929, 5035483, 1851390, 3465354, 1546559, 2212736, 327060, 4392314, 5440996, 5335943, 2715353, 1068813, 2991090, 3752829, 2302112, 4206799, 8377732, 3541425, 5967333, 2024171, 423385, 6388068, 4570083, 1076313, 1042826, 76293, 251354, 2273277, 1036606, 3562410, 2996125, 8378846, 4450004, 7733315, 3123971, 7246223, 7673089, 2115748, 2853166, 8329895, 175729, 2236466, 2434050, 1368508, 1975084, 4393336, 4967847, 1137861, 3990219, 5484252, 3444076, 4311716, 5862762, 2486904, 554649, 3601440, 2314300, 7260555, 8368707, 1354939, 1335747, 3285744, 8043060, 6231519, 8192534, 8272985, 5165903, 3510357, 3704761, 1538679, 1903391, 3410398, 3314999, 1839507, 7673733, 1820058, 7237445, 2896179, 2668167, 6462756, 612124, 2345465, 6703244, 4487818, 5908110, 5817089, 16790, 3503689, 7344990, 8325039, 4804471, 3244319, 4123956, 2617552, 2550107, 8000910, 7714723, 6876053, 2325545, 4551463, 6754130, 7653668, 6254934, 1821010, 2735524, 1176303, 827506, 5354927, 4677520, 3565402, 2776524, 7288687, 4323423, 841826, 7411216, 4499836, 1314582, 6685565, 4813622, 4352880, 6777043, 7710397, 8174566, 2368505, 3959920, 1744817, 98403, 5372429, 4925764, 2181956, 337196, 133122, 1730692, 3985860, 2607309, 5432592, 1617941, 1946597, 1854545, 1789039, 1953223], -[813421, 1050099, 8332070, 3981790, 3797141, 2562948, 1862474, 4785049, 564305, 1425435, 4948651, 5186467, 54722, 4398015, 2889240, 3211316, 3594218, 2199024, 5814016, 3765930, 8089282, 5517716, 3090636, 3829674, 7778905, 1063267, 2960003, 8334303, 1059815, 2027010, 508643, 5665691, 65144, 1975858, 1878080, 5375826, 1105246, 2223170, 6934419, 6058819, 7058454, 4090997, 7641318, 5552662, 7542809, 3631663, 1758192, 2535846, 4549505, 2861784, 3924769, 5711664, 2052230, 7131330, 3558287, 1786119, 7111727, 7897869, 1894174, 4058832, 4819720, 6019633, 2791457, 6238083, 3124589, 4551405, 7144655, 6369695, 4723819, 4154603, 7798666, 4772806, 7205103, 904634, 3657439, 2142679, 3971677, 2537418, 5401822, 6304800, 5591858, 8307472, 1430067, 5283681, 3631874, 7965752, 5043976, 7957851, 3947426, 7059741, 4893851, 2846403, 1715617, 6866801, 2296048, 137729, 4389323, 2115288, 3703417, 8053325, 29744, 6703982, 4961918, 6284349, 1637714, 3488355, 7891208, 7450271, 3986982, 5586093, 2059196, 6519785, 2611506, 7897290, 3698472, 6007278, 4284393, 5274503, 5589053, 7599888, 2837675, 3131731, 5825031, 4663097, 2773722, 3758681, 145245, 4610108, 4043821, 4676720, 7934300, 7738816, 7355133, 400234, 502909, 6513530, 6073998, 1447953, 6018153, 3955103, 4157034, 7812563, 2345639, 1463144, 6244457, 2764801, 4458453, 7083288, 4133864, 3938357, 7197908, 6126720, 7312909, 5252537, 496253, 1252332, 615691, 8303558, 6193924, 5696773, 7341664, 7706105, 5849752, 7889195, 4027783, 1712369, 3790686, 3330592, 6363685, 4700691, 7545492, 2019756, 6780531, 7017426, 3619119, 2320334, 5966321, 8311298, 7687022, 2603392, 5316484, 2125259, 7695319, 4789840, 3294378, 1947272, 8044406, 1620276, 6993427, 5996335, 2285412, 733047, 8173669, 2752853, 6188289, 4501539, 4075745, 6407696, 6561051, 7745742, 5325351, 5365375, 2058100, 8089646, 6516059, 229377, 2581954, 569291, 6431279, 6590668, 5386247, 4910571, 6288046, 746989, 7680993, 3471913, 8229825, 2881113, 763817, 7721775, 6536664, 7887304, 6509682, 5517202, 4978401, 7462736, 6134, 5105597, 2516386, 3300946, 6416677, 492932, 1989438, 6178016, 7430928, 4697786, 6620976, 1757057, 535288, 1996103, 3700533, 4754028, 5354745, 8226008, 5497326, 1688654, 2511330, 8347714, 3381556, 2378793, 6611153, 7090836, 4569739, 8162115, 3982805, 2211832], -[4860380, 6528639, 7841259, 7146628, 2792115, 446910, 7578172, 7175575, 3954830, 3894110, 2538321, 1234155, 441437, 1625348, 5895167, 5025129, 6767204, 292851, 4154032, 5640025, 1197172, 1220708, 2529639, 1749550, 7122346, 4340406, 6360461, 6948095, 7130215, 4652884, 4966301, 6164386, 5803146, 7416270, 1200349, 7559267, 63180, 2484041, 2700910, 7844998, 4187182, 7382001, 3154531, 6370920, 2770036, 1195194, 6425620, 2289257, 7275828, 856739, 5125879, 723268, 8025344, 4184323, 5456825, 8201820, 4534009, 1686863, 3677307, 3128625, 4409319, 2897470, 798982, 7026121, 6443475, 105885, 7431729, 2643066, 79440, 2190167, 6960535, 5520082, 4127142, 6818715, 6277520, 7725658, 430115, 3678170, 2952319, 1065923, 398401, 7574999, 3501483, 3146897, 1173248, 7587193, 5547248, 545979, 2066924, 2388741, 3719816, 7640190, 2152915, 1115996, 3229074, 2358973, 5988169, 291122, 6969157, 3121707, 2714845, 2069024, 66472, 5135719, 3336192, 784746, 7320753, 7163246, 1276303, 3604612, 2669830, 4157783, 4273250, 4106187, 2744547, 4999139, 3804474, 3596899, 7538407, 1163874, 972183, 1319115, 8028051, 6010427, 7312919, 98785, 2168988, 3326354, 7790343, 5745705, 3085073, 5439533, 3521301, 8315006, 5511878, 7638633, 7169504, 5386075, 4620508, 5035583, 2153517, 4280216, 1807595, 4756436, 4908047, 8128617, 3958237, 4307172, 5162909, 5874223, 3841434, 4220729, 4495472, 1526808, 6344713, 2338014, 1770484, 369736, 4576203, 257422, 4283075, 6223474, 7230653, 3653112, 996583, 1463780, 7584491, 4271801, 2370222, 3926308, 3903696, 2076095, 1605055, 1290747, 7880434, 1280914, 1083462, 3973146, 5947907, 5856846, 7833157, 7976157, 7328159, 961861, 28357, 5787846, 6008929, 2526438, 2039903, 6146445, 1204339, 3350286, 3126006, 2520150, 4668957, 3643269, 8098116, 6365506, 2353184, 670351, 2486008, 3294858, 4991574, 8169349, 7878560, 8024566, 6059201, 1151958, 1798919, 6079075, 1203593, 2576546, 5553451, 4669787, 28031, 2303524, 130575, 7906165, 3176770, 2507171, 7183703, 3073924, 3420227, 1287440, 5681570, 7414411, 8339990, 103808, 5015564, 5251854, 3505679, 5271535, 6181121, 5535987, 3754380, 1317900, 2395383, 2708748, 3700589, 3444775, 5853171, 4338276, 7133605, 2409621, 3554000, 4795815, 5229021, 4612874, 5419447, 7641882, 6924517, 2383938, 3772614, 5981729, 7917706, 4961400], -[7269680, 247417, 4929082, 4703750, 4319874, 6022760, 7373390, 4352006, 4629384, 7301321, 6061868, 2272287, 995548, 8359395, 8029510, 159928, 5748511, 4800278, 5259862, 7630098, 8305185, 3222119, 7547448, 3620201, 5255968, 8245500, 1326024, 5976386, 61302, 6452906, 3769651, 1877396, 2588689, 7733319, 76155, 6939691, 7431806, 4430637, 6247037, 6142920, 661801, 3574349, 7963097, 338885, 1037896, 6901675, 7131345, 6389870, 700232, 373055, 8046235, 5970302, 7201278, 7076866, 2826110, 5091047, 7490100, 2860682, 52391, 7176464, 4171403, 2364082, 6834659, 1062875, 1473283, 5580683, 7466334, 6231786, 4516166, 7326354, 4385973, 3398233, 3418379, 6040177, 4383401, 7503783, 5040815, 7085882, 1223084, 4154483, 989671, 2416830, 3582649, 8049895, 6395684, 2350423, 2704187, 6380161, 1879394, 7407921, 7238859, 5016287, 87627, 1067356, 6814027, 4814818, 578014, 780327, 7077669, 2200180, 127318, 4541885, 378543, 1116298, 3420887, 8014537, 1721503, 2095828, 2381094, 2167113, 5911586, 6592880, 3689476, 1969777, 4445823, 4222844, 447652, 823265, 2988116, 102522, 1052431, 2788107, 4494377, 4973998, 8359119, 349931, 6867376, 8049072, 7388266, 1871559, 4608857, 7066415, 7887125, 3756424, 7063252, 6349679, 7506873, 7977509, 3249874, 4276752, 8020506, 3951026, 2025372, 1795489, 2930945, 6629604, 7074915, 2466133, 7543170, 7488653, 1318215, 4325519, 6564118, 5768732, 4778567, 2815070, 3742021, 1850809, 7625962, 4328407, 1190848, 225055, 3254216, 8141182, 5949499, 4115428, 2433771, 982126, 1798560, 6308044, 1658372, 6039434, 3901871, 4067067, 7504486, 6024995, 812274, 554802, 1248268, 3899937, 6908773, 4292449, 3709863, 2521645, 3602871, 1354587, 4128366, 4356734, 6388022, 5144742, 1392062, 4297363, 5160654, 7801466, 1331170, 5283162, 5869237, 6560708, 3425315, 3141984, 1603869, 6746917, 2348495, 1031109, 7479190, 6171523, 1087428, 7767256, 3884072, 2881270, 831831, 1622429, 6916271, 2754036, 7017604, 4132668, 8134368, 4628378, 1366821, 7888456, 1054264, 4419625, 4611609, 5213163, 483726, 916162, 735794, 183887, 2981611, 1200655, 1300642, 3997767, 5690112, 4196021, 6264999, 4205103, 2031842, 3236938, 1102795, 3721712, 7497206, 4510625, 6979898, 1037866, 2351170, 5075971, 5389091, 443033, 241708, 287793, 2564548, 2410503, 8254433, 1474945, 4297208, 1488956]], -[[2106789, 541302, 6506183, 4859176, 2110201, 6324623, 2431823, 4690463, 571522, 7280423, 951381, 1144531, 1314344, 4398443, 451207, 8106292, 7401324, 3972323, 11817, 8249077, 1511506, 4011918, 6785183, 8359245, 5352277, 7675231, 2446039, 3866758, 4036466, 2800613, 55354, 4980237, 7294364, 5915405, 6601106, 6789890, 2215404, 4009122, 370919, 7605395, 3321924, 3928533, 7240817, 6226172, 2542573, 2051529, 6184775, 8280198, 7853107, 7123206, 3869096, 5432064, 8374824, 6098701, 2749540, 7766372, 921541, 1925371, 5242034, 3059149, 8005775, 109578, 4472059, 4735543, 796485, 377484, 2977513, 8179994, 2550962, 2929097, 333351, 6892610, 7513912, 3538391, 963412, 6658944, 6388016, 3857242, 4060093, 6344507, 6087151, 733469, 1516250, 7577153, 7269303, 2663174, 6487629, 6132007, 1751555, 1932295, 4748508, 8219387, 3171557, 4442084, 5034898, 80015, 1941736, 3246713, 1596603, 7814663, 2874289, 1960519, 4088777, 2958403, 4208325, 3497358, 4406477, 7610650, 3693144, 242924, 3663905, 3820612, 2332435, 6625583, 8279182, 7344620, 7398313, 4558970, 765535, 6467962, 2158811, 4348748, 4178254, 4478928, 5509843, 4232792, 8088070, 3344778, 1099222, 7956912, 6724195, 6276453, 961347, 5685449, 6920970, 5182264, 2087883, 6950004, 4022256, 4836594, 5955756, 1638453, 5219858, 8082820, 4374352, 5680622, 2706476, 5874140, 6428834, 5835992, 4783247, 1139712, 3736002, 7697399, 7643540, 350976, 1633567, 3355863, 1131156, 109225, 2774053, 6894011, 2121580, 3210401, 4527713, 7035112, 759440, 2734141, 1736060, 7344472, 4044675, 7540230, 1521530, 8244467, 2072575, 2553724, 587371, 2073304, 4696332, 5473706, 6771601, 1734979, 6087167, 8194771, 7896554, 2628525, 6602843, 4808297, 1822775, 4311762, 7937262, 6132101, 3689858, 7585762, 1158245, 4164486, 1937767, 2566854, 3373100, 2127573, 158137, 2189317, 6389847, 3135445, 4433727, 5513298, 3266567, 7465438, 1202417, 1900029, 2260502, 6390157, 6433418, 7425334, 7726858, 4519798, 4921389, 3075201, 7225189, 3478080, 3456930, 1722789, 1164554, 6821480, 5547422, 3197972, 2115659, 6844335, 1961639, 7440813, 7963044, 1339878, 5331249, 2097517, 7276165, 4532010, 4499541, 5539143, 3611974, 3967476, 7666860, 7851423, 2925931, 7223037, 6301919, 5514525, 4551398, 5291117, 7524184, 7266223, 4975729, 6115672, 52755, 8144658, 643673, 7184751], -[1072825, 2185568, 6392306, 5265996, 8366217, 6120648, 2612265, 6945041, 2817725, 1117102, 5329626, 4190083, 429888, 387801, 3292810, 6945115, 1640401, 4495324, 4417586, 4712585, 7602615, 3462181, 4476951, 7447163, 4451691, 144285, 1987394, 1571724, 7521890, 7714151, 42423, 985708, 3932234, 5471747, 2116201, 5399709, 6188828, 2480136, 786315, 3414741, 3086884, 3008249, 7850025, 2809512, 7890347, 4328378, 7694704, 79364, 6010132, 4388099, 7794717, 6487720, 1395306, 7539365, 5988480, 5013934, 2066479, 900734, 1517696, 2580085, 7199347, 8361087, 311819, 4352404, 6155541, 1425215, 8161787, 7216107, 1116464, 932958, 4307574, 7956833, 1240884, 5504732, 4612051, 7693793, 4022002, 3112515, 4711500, 5930953, 3747057, 2275191, 2879701, 8293857, 6106871, 2572267, 4218754, 6802311, 315439, 2302677, 3294502, 6778447, 156698, 4291348, 1951377, 2592507, 4718846, 1468657, 2175634, 476128, 1887365, 6452413, 1688363, 302829, 6053470, 3599191, 2162390, 4037953, 3921530, 4353623, 6378645, 1628651, 2919517, 791848, 1772985, 3601029, 5093593, 8277068, 8131818, 3118364, 801723, 2834606, 3649396, 5804364, 5124791, 6487635, 4124870, 5265731, 305398, 7790818, 618430, 7397046, 695117, 2202755, 1453858, 4706111, 2850852, 6028033, 8232726, 7110078, 3889748, 8200561, 6064313, 5177596, 8331267, 2589241, 625866, 4439443, 389852, 3742845, 655862, 1341458, 7187689, 2918896, 8236363, 4724550, 5844329, 3530837, 1381176, 2203672, 6478995, 2358848, 4130720, 5294419, 6737635, 7468665, 7864301, 4974842, 5326688, 4378389, 5801750, 2588421, 6128624, 1761858, 6598969, 1889401, 3355253, 5989526, 2071384, 6036699, 1153712, 9679, 651367, 8017534, 7663959, 5412294, 7342116, 6384818, 6246131, 2065391, 1492396, 6703932, 3613240, 4712717, 7492491, 88145, 7591277, 1108840, 3862966, 2472869, 2500542, 2436392, 6157203, 5044955, 4404562, 2179770, 6483146, 2514842, 5469125, 6709762, 3180932, 4182367, 5937515, 1580713, 1100045, 113578, 1241056, 6407697, 4100952, 7219481, 5675287, 1522494, 664245, 5119892, 7840559, 4389436, 4882657, 4992049, 1769515, 3489560, 4526318, 7882646, 3352375, 6186495, 3824282, 4064712, 3362059, 3126551, 1564641, 7960916, 5074099, 7613161, 8194708, 3439511, 542154, 6583634, 2429101, 5738196, 5388586, 4857903, 5998402, 1366375, 2729841, 2021571, 6222365, 6619093], -[5796085, 5196732, 3553791, 3086621, 688862, 1478847, 98300, 5851938, 6404694, 7475276, 851592, 4458081, 3011638, 3879232, 120785, 2324718, 7935961, 2082185, 7942477, 911446, 1945689, 2381043, 5413220, 5157344, 4658679, 138732, 2458783, 7327808, 6386977, 4261653, 2028380, 7638758, 5329384, 1194987, 1020898, 6447312, 905871, 747470, 3337264, 2140625, 2336862, 3506937, 2845061, 1621936, 4153181, 1830916, 771504, 7355028, 3935553, 2403256, 2619796, 6692604, 2893124, 6563316, 1126208, 2373738, 7146679, 6406320, 4869563, 4548218, 5258986, 8313847, 6674292, 2990606, 1288533, 5285848, 5195654, 1823229, 483634, 766163, 810261, 7636418, 6338329, 7263549, 2736679, 5069429, 4733641, 1684760, 1667457, 7485615, 5431328, 7356629, 1530556, 2663945, 6940201, 6848050, 4646221, 56183, 1962036, 1318037, 6008568, 7447711, 1459203, 2705069, 3901025, 4291348, 1066941, 5716142, 3372573, 645825, 4619556, 3347172, 1004521, 6320980, 3527317, 4034194, 5425278, 1442777, 6054999, 6176377, 3108384, 1304530, 1361832, 5133243, 1652692, 1020866, 2786006, 7249364, 3781394, 1433587, 8349440, 2284581, 2715735, 240977, 296867, 6874433, 2527851, 3983255, 1815360, 6210203, 4357376, 5259594, 419193, 949806, 7553387, 3149622, 3008528, 1176044, 748508, 409708, 6528627, 6046615, 1252029, 1966745, 3028458, 1036604, 7232997, 1036064, 6409157, 1092054, 863024, 3418679, 5030402, 4342587, 106165, 2173632, 2673150, 165466, 6632859, 3821640, 3224460, 2544776, 5216632, 3448448, 3811914, 6981733, 828589, 8047373, 4853892, 3474037, 4295930, 502659, 6984976, 3768545, 439721, 507973, 263005, 3077483, 5889353, 7879839, 927337, 1385853, 3591502, 6627504, 7662900, 3370230, 4772300, 3124671, 1961633, 4024473, 5623175, 3889884, 5329214, 7559838, 7188984, 7092361, 6578873, 4452662, 2660290, 953405, 3756264, 2011766, 6195229, 903108, 3419366, 302008, 3687537, 6101837, 1207053, 1312575, 797960, 1400735, 4142579, 1931881, 1008564, 4587634, 4742131, 5813350, 5941320, 7582442, 2656529, 4102263, 6525500, 4263699, 758355, 6489233, 4182777, 6624923, 7546454, 2836965, 947600, 3907377, 333108, 4330459, 7948826, 7094838, 6428002, 6502794, 6568640, 1838174, 2129731, 6048020, 4037828, 4580987, 7911145, 7720137, 4677001, 2184294, 2359243, 7992275, 4870996, 7169241, 4731873, 6385417, 4925021, 7112804], -[5580830, 6593831, 6708724, 4246361, 5193168, 3971457, 7977360, 6997450, 1471475, 3710267, 5213820, 1104636, 709871, 1995369, 4848445, 6517980, 5261396, 1220887, 7941445, 4067179, 4484441, 208854, 6112432, 5062241, 5601054, 2748725, 6801198, 3519204, 1897507, 450193, 2971968, 2578914, 7807194, 4124986, 5981690, 5143700, 3372534, 3344946, 3356302, 4785714, 2713036, 6242376, 1619257, 3693297, 4202465, 4099685, 788629, 1747035, 1130576, 4864594, 8210937, 5750444, 4169753, 4447389, 506691, 5682718, 8118172, 1283387, 7365541, 3283191, 2199925, 5916461, 2879232, 3163038, 6535718, 3585851, 6137305, 1331361, 4489860, 6400385, 837122, 541458, 2945114, 4778836, 4785272, 1433751, 2156728, 8209047, 8355485, 1071056, 3454583, 1758281, 17092, 3335030, 5665435, 5201289, 3871351, 5182, 7547974, 6444960, 6001912, 4578951, 3346611, 843903, 4486425, 7649838, 2228948, 2288995, 5847232, 2954286, 2404146, 825471, 3501817, 6021855, 1822258, 3103793, 8117183, 930227, 998397, 6338944, 2116555, 2336713, 3348185, 1926884, 7610514, 4875543, 5966713, 2772765, 3191058, 5129090, 1007406, 3089031, 3763165, 5868776, 3507982, 3770478, 5245456, 146092, 7759745, 3965277, 7256470, 7237319, 4869243, 5293916, 1236049, 1040323, 2332870, 7053412, 2337104, 5909179, 1834768, 5299009, 3196456, 6463755, 5442246, 1553087, 7180081, 1901752, 3771539, 2276024, 2773288, 5065890, 5494597, 982233, 2663835, 1123650, 5992210, 4623727, 6153609, 5091795, 6546630, 2476035, 7872318, 1671050, 1661479, 6827363, 6502531, 2776756, 3955373, 2226073, 1457875, 6104034, 2867894, 138885, 2685853, 7206269, 1021439, 1764317, 8341230, 7258632, 2722199, 2443588, 5573436, 3311945, 2991961, 2390167, 5345970, 6463156, 420278, 5582951, 2661741, 7629580, 3269115, 5611463, 5293972, 682928, 7715981, 7616107, 4224309, 6053464, 3498882, 4859058, 6116457, 7598242, 4058132, 5248529, 8058947, 3100949, 6163812, 1070381, 6577374, 7327242, 7669032, 4001446, 4797739, 5805213, 7603669, 3200594, 4365493, 5607944, 6880757, 6615151, 2295418, 2500229, 4713825, 4537098, 157486, 971636, 20892, 7821409, 1390120, 1166426, 5738743, 5970753, 5045936, 6961792, 7338757, 2673340, 5607643, 3386331, 4267658, 7795004, 645395, 3543160, 6479384, 1890138, 2195171, 7067951, 3676274, 5242555, 6262342, 4672033, 1627809, 7545177, 617741, 5235341], -[1915730, 333195, 4073768, 1498602, 5468671, 979416, 7084808, 4741565, 5591581, 4769214, 6087932, 4847641, 8209736, 3131512, 4055782, 1668154, 4243336, 7129589, 6671773, 695251, 240270, 5148320, 2665048, 7229436, 3232022, 2688833, 8145814, 1476256, 3424206, 4277726, 3987817, 6630944, 5026080, 3101450, 4257662, 1110369, 977866, 6374346, 5525143, 1514789, 3828035, 5916702, 1907561, 6512026, 3837267, 5438338, 4777946, 7591612, 8086497, 875551, 2808449, 370353, 4272757, 4485057, 6803168, 1862133, 7831663, 6729411, 6806573, 8220846, 3806368, 6405154, 6006303, 1604828, 6362775, 7794975, 2416527, 5764266, 6720865, 7075456, 1140974, 1174731, 4308420, 4121550, 7347076, 198931, 3908163, 5041271, 1722121, 6801252, 3971623, 7681206, 2711039, 6060600, 6924609, 6492632, 786746, 4688854, 1386460, 3965926, 7264463, 5730035, 808705, 5408326, 5182188, 1548651, 5772603, 623014, 4678391, 2530847, 4800099, 6679649, 7313425, 2160474, 584417, 3342298, 3042912, 349820, 5146538, 1120439, 2624303, 83274, 3635364, 8290404, 7493296, 5536412, 2241071, 726486, 6642249, 1810047, 6460157, 2219494, 1193399, 8173054, 4819662, 6144152, 2804522, 2090285, 4449822, 2314221, 1085945, 8164908, 7972411, 252911, 2509679, 7904788, 1396504, 4534596, 1817773, 7130296, 953681, 5160085, 5708464, 9234, 2285536, 6596751, 6140245, 6374052, 7884619, 2156770, 4238557, 903126, 1193110, 6817505, 1351105, 7708801, 7135592, 4963558, 2544565, 2980261, 655882, 1328011, 3713801, 5555447, 6261019, 2274001, 2762465, 7214038, 4915228, 1058161, 7654861, 2549948, 6707301, 5157385, 3011314, 3522174, 5856095, 7263357, 5174442, 6689299, 6906020, 1826047, 212026, 7892293, 2741670, 4844882, 10179, 6428001, 4032630, 560575, 7420663, 3412518, 6416819, 6644072, 3885637, 4176132, 3777549, 1017880, 556078, 4281329, 8044808, 8036499, 981370, 4297713, 4511946, 3550342, 920613, 2315223, 6574932, 5211512, 1249973, 3949490, 800545, 7537526, 8117825, 5372524, 4473195, 6653625, 4904300, 4081150, 332691, 6866330, 5380797, 4323948, 2849402, 5738016, 3978837, 6705177, 1086631, 2959454, 3806017, 2390823, 7939129, 7366800, 73678, 2823467, 2219578, 556975, 1455561, 6129142, 6369091, 1535192, 5950588, 1475849, 5334305, 3766570, 3414397, 6054381, 2039782, 5964731, 926337, 2832036, 8365121, 1689074, 285733, 2926636]], -[[3738138, 763645, 7645767, 1997766, 7585129, 5796037, 2787182, 4058367, 8015229, 5565595, 3882391, 7084366, 3775399, 3504647, 66712, 6851599, 5770108, 3980154, 2191635, 4954880, 1214666, 8109610, 2835374, 5961451, 3567275, 1814192, 2004227, 6988545, 7246857, 4951513, 6550317, 3535726, 4350934, 5923044, 6256492, 6494779, 3826120, 6364355, 4357307, 6671945, 5522084, 6207890, 8139211, 5569595, 2508322, 6505650, 2512711, 284668, 7584709, 3304142, 7906955, 5652234, 4259472, 1801236, 495947, 5260134, 6061380, 433147, 4323715, 6917953, 5403232, 5069612, 7421292, 7251318, 2167729, 3668353, 7111019, 6275326, 57163, 6072358, 2939741, 1440392, 6893193, 5757369, 7074276, 6323089, 47789, 6118259, 7361266, 3414795, 8181884, 2460980, 7437212, 1393360, 3947641, 7289315, 5072326, 7266074, 4015977, 6820304, 4516817, 7656483, 3131696, 7222432, 1418720, 1213791, 292009, 4534999, 3540859, 6529441, 668558, 5738483, 4274511, 4608042, 7398542, 6750212, 4891138, 5515885, 2003502, 4241925, 1712409, 1166863, 4345740, 559747, 644229, 5278384, 6030062, 6994255, 7483260, 7668519, 739067, 516687, 7234734, 7843628, 6474112, 5089913, 6896416, 5163628, 2530151, 250255, 3439663, 2646847, 6396016, 6588941, 7418043, 5808705, 4233457, 7489792, 4184431, 5957390, 5709115, 5195522, 1518704, 4984691, 8310991, 6552070, 548811, 2863269, 6039370, 4120544, 7973473, 8058295, 7149611, 1565150, 1189897, 2781605, 2812832, 3104812, 4211668, 3407249, 7479001, 4274701, 3407414, 601245, 2533767, 1541431, 7792808, 4389664, 5406924, 1626965, 4089549, 1711279, 4449867, 4661788, 5141243, 2820020, 2662337, 3210595, 1822991, 1803113, 8119575, 2360211, 6115400, 123549, 5314945, 5430250, 7737803, 243246, 6833208, 8345919, 5677766, 1947154, 2923400, 7028148, 8233170, 6829912, 1732460, 1310162, 4813822, 1953103, 343586, 5269932, 5615860, 4401625, 7377116, 7706580, 8207628, 2291283, 6237818, 403976, 6454316, 7748902, 6473630, 3035645, 3946174, 6534803, 423599, 5933188, 2807168, 5812921, 2717109, 348061, 2589160, 5914090, 5932696, 550652, 4437666, 505977, 3447475, 880430, 2148810, 7319890, 4336472, 32618, 6996365, 762065, 644040, 6342019, 3121916, 8003553, 3096151, 3791855, 3003766, 8020176, 2944703, 8060735, 745653, 4129274, 7741709, 2389009, 5771322, 5829258, 6808603, 3641885, 7202891, 4791571], -[114065, 6246542, 2886221, 3670967, 5280732, 6632102, 1196119, 1032280, 4551989, 4149476, 1968925, 3348514, 7014795, 986849, 6237572, 4324883, 4073710, 6273104, 1074136, 866145, 3569676, 7357687, 3895925, 3803014, 2877118, 7916681, 321891, 3300885, 6082113, 1696059, 3592106, 6708192, 2469151, 4380593, 2500293, 2135876, 7702633, 4802352, 2798711, 7887244, 393736, 7732939, 3463248, 6321323, 6527941, 2124554, 5570464, 1602665, 1575471, 1650022, 4829838, 4054534, 4863757, 289752, 6610370, 2970512, 2959757, 6607289, 8237086, 1625913, 8239705, 1473831, 5171338, 3361000, 5114471, 4497351, 5815756, 7788498, 7517516, 413572, 4205074, 4960129, 2143884, 753828, 7198193, 1612757, 4925114, 472564, 6820282, 2783707, 3029089, 826781, 6873793, 1442383, 8101320, 5416551, 6441481, 2843356, 8364515, 8066042, 4594990, 1490274, 7793694, 4671455, 7357126, 8322324, 4041580, 1453251, 3376934, 903667, 1416013, 4074084, 7797876, 2321151, 7486968, 1940916, 1787527, 8375134, 4007395, 7505576, 1190255, 7816391, 1191893, 7784808, 4911339, 4106761, 6846508, 7842873, 7768217, 3942795, 3281766, 4873784, 4327222, 5263924, 7266856, 5421894, 5252575, 3669447, 5233253, 7617365, 3974678, 5539819, 7593323, 4677242, 4584643, 4334284, 4823444, 2592903, 7918368, 962735, 291018, 1969632, 7124828, 8095930, 6376147, 3164915, 5051597, 4238930, 7603519, 528437, 4960611, 4799375, 5278206, 2596389, 788558, 6098640, 2287251, 266024, 6359624, 3491156, 5067559, 1744306, 3373330, 5760485, 4198627, 3023406, 2774448, 3489338, 4258818, 1825699, 4393870, 6344312, 4022357, 6505584, 6038267, 1986641, 6074865, 4381131, 7794437, 7214049, 7525340, 5899746, 6195921, 4106463, 5111883, 2734273, 1933500, 568268, 132917, 3398585, 3305882, 5414699, 38219, 5526774, 3442953, 7261371, 7622444, 361498, 6267039, 5922660, 7728632, 1337556, 5973126, 2369856, 7649717, 7963924, 4380624, 7329875, 8233857, 6671906, 3747317, 6949035, 3244650, 3741505, 7703038, 6140513, 7789494, 723805, 3823695, 1218477, 853145, 6815464, 1951662, 1633168, 2000875, 5602631, 1821676, 4159657, 2753056, 4645782, 2692374, 3588104, 3624145, 4549284, 6131873, 6241172, 7720329, 6260051, 7643964, 4926049, 5187032, 944728, 971906, 5485429, 7968202, 3594155, 4278368, 2045923, 5298324, 218171, 5445922, 4135741, 7337105, 1918378, 8074571, 3303054], -[8051140, 3063488, 1777148, 3074988, 600192, 2998849, 7574065, 2536382, 8261201, 7458049, 7622427, 7309785, 6615147, 2191608, 1933387, 4452574, 131770, 6236847, 7699593, 5183216, 400620, 6194811, 5277337, 4549230, 4358084, 421975, 4572030, 3314740, 2927130, 6783471, 2722614, 1705449, 3436661, 4692686, 4740453, 4256132, 6692398, 1138780, 7016969, 6154818, 4498493, 3139481, 4131806, 3585792, 4319033, 6258215, 793309, 1223526, 744962, 5735472, 7223573, 2227068, 2635144, 11547, 4073333, 7179416, 6882911, 2288061, 2648146, 3396909, 2072397, 7467102, 3247621, 5404842, 3826496, 581510, 2721551, 762537, 3223624, 6487973, 8376293, 5767273, 1046934, 1835264, 6991913, 2998906, 7140297, 5843023, 4434623, 3744291, 4377514, 8200841, 3810344, 343873, 3241798, 4170273, 7725037, 7378396, 2748616, 4887019, 5729921, 97063, 4504987, 7607515, 4125379, 4256304, 6602017, 7703296, 7017309, 8274706, 649693, 3243364, 2793602, 2266427, 5110955, 5038697, 6451321, 2474210, 3360624, 1778141, 1069370, 2173120, 3258187, 8264498, 5943250, 7269428, 5575079, 7607203, 4998587, 4599935, 2862564, 7721940, 3774273, 4148699, 6498182, 5255214, 5319792, 6970847, 6527934, 7892497, 718511, 7071694, 7652356, 7212992, 6979264, 2073366, 2446321, 3638166, 4521535, 4194212, 7603856, 2641963, 6479831, 2271266, 4926918, 1300411, 4931715, 2938798, 5288392, 7742280, 6379382, 476754, 3669283, 3634978, 4463157, 7568660, 1245988, 4120907, 2334708, 5523996, 3430583, 4748919, 5520426, 5586466, 3310254, 6037035, 6980580, 5648396, 3412475, 7553569, 1134746, 3194278, 4008235, 7005529, 4382648, 2229702, 4832345, 6965645, 7151063, 3715372, 5398122, 4129271, 8294187, 5759952, 5985685, 2898302, 3432791, 6894701, 7793793, 2937963, 2748184, 6955670, 616472, 7628592, 3022213, 2103610, 4100573, 2261354, 4161746, 3893109, 6112480, 6491302, 3268934, 3245150, 609699, 5170802, 6168376, 7115404, 296407, 3050398, 6357168, 212949, 7642885, 2105316, 8102278, 8237237, 4481859, 6320713, 5293278, 4072925, 4091680, 2313799, 6123181, 3153477, 8217599, 3690532, 1129087, 1063209, 4182484, 2576150, 1524725, 4352432, 3438812, 7765782, 2249896, 4432984, 633967, 5402405, 8003867, 2382422, 6372362, 1933380, 4310167, 4480609, 3245177, 2860030, 4926348, 2366948, 7916974, 1562421, 1841930, 6673944, 401315, 6418994, 290594, 8070741], -[6567201, 4801411, 6261153, 4839058, 6079347, 8060730, 4944077, 7741807, 1125460, 6839567, 8100720, 8152952, 6283324, 3521255, 5623660, 1004288, 7749396, 6097191, 2725133, 2643395, 4238523, 3012124, 3844422, 5701859, 58458, 2661932, 5831016, 6372070, 2723433, 1324729, 5419547, 7935907, 3422202, 3943536, 4183506, 3867510, 8007046, 556719, 2699749, 1820463, 4687964, 5036446, 1672014, 7376223, 2007377, 5345035, 3192683, 2491702, 3904182, 7130809, 4106560, 4878309, 5885089, 545484, 8168079, 2903833, 361772, 173154, 7860145, 1907567, 554571, 6564193, 6384805, 3588490, 7703455, 688935, 748668, 4854187, 4174192, 4954209, 7618948, 3831502, 4760106, 1535370, 4764863, 4070847, 2175391, 1455070, 5772591, 5748897, 4677710, 2508333, 6857323, 6080141, 274956, 3345677, 4179601, 8195736, 2217472, 68896, 7720014, 2785883, 7259099, 7394889, 5356197, 8083127, 3484776, 2317639, 3921048, 3950923, 1139050, 8093164, 2872947, 5208059, 7821873, 3410006, 7379602, 1767702, 8364750, 2273399, 7503140, 6996265, 4002549, 1883981, 1389455, 5404804, 4779958, 1880326, 6157684, 4732061, 2245500, 2898135, 4120150, 1834833, 7349790, 6287947, 984464, 6043170, 2589276, 7180968, 170526, 666011, 935163, 4188400, 2741774, 1459371, 1855913, 4775333, 5037771, 7851195, 8032073, 2820517, 7451737, 1352211, 1287881, 7692642, 5092425, 7170805, 4024478, 3817283, 3317659, 7276484, 2519427, 5240595, 20400, 5432969, 1498021, 205081, 7806521, 4046612, 2884425, 4415502, 3304429, 8334797, 6023207, 1966858, 7882905, 2385647, 7105759, 4339091, 747894, 8247688, 3875369, 6926614, 474903, 5012736, 4887648, 7703360, 6409889, 3611214, 733355, 1268647, 5145501, 5741137, 3508795, 5428402, 7983428, 3165354, 3115466, 179817, 4097204, 3869460, 5316436, 3813784, 2735262, 5374011, 987500, 6593252, 7908823, 2505242, 2455123, 7746216, 5046493, 6347076, 5744157, 4002028, 7228607, 3561325, 523644, 3574645, 3027315, 552063, 5199505, 6779222, 6007256, 2184898, 3314796, 3149110, 3620194, 3711226, 5992850, 3799939, 4841803, 1328515, 4490254, 6470526, 1141096, 2596280, 6294285, 6503127, 4632979, 6337868, 5985080, 6762032, 6195504, 7231176, 4284860, 1998855, 1624470, 691712, 7543441, 1174363, 6136357, 5045021, 2713997, 8316761, 7292452, 4158814, 3020972, 3089997, 520082, 828659, 6370759, 8056821, 558210, 3557361], -[3346451, 2733440, 2513636, 5934841, 530835, 5040354, 6075253, 7765896, 1084896, 3674313, 5142814, 8369461, 7404264, 4702357, 7770367, 8133137, 2969050, 7387720, 143289, 2006448, 5137146, 7838645, 3968795, 5682810, 4250081, 4992163, 5933619, 8128534, 2379825, 4163649, 6050981, 5793528, 704545, 263011, 2960625, 7447161, 5424304, 5053717, 338422, 3126684, 6630993, 6958919, 2821662, 2135812, 6386798, 526619, 45393, 417005, 8261214, 2616572, 7150773, 119778, 2950618, 3831915, 5241111, 7274643, 898952, 6457563, 3699096, 1324304, 3776067, 8304973, 3545004, 3691388, 4712345, 6102559, 4100002, 6943502, 1362733, 8148730, 1165336, 2402399, 4437949, 5310832, 5195131, 7185250, 3625627, 5085497, 3579991, 2102547, 6828769, 8321889, 7388420, 4263820, 1543847, 2678869, 5642032, 68448, 5662032, 1393570, 7747763, 5015146, 8007064, 4355820, 4215729, 6657476, 5463456, 8107195, 850073, 3844932, 7947378, 2381686, 1796318, 5381348, 72063, 2469408, 3655645, 5640337, 306803, 1773691, 2197481, 2436365, 340894, 4503663, 6975548, 7359288, 6491799, 6628785, 7418281, 1530720, 3831786, 1724780, 3153222, 5645483, 7315731, 2210079, 2836882, 2480926, 4892474, 6789374, 1570926, 2247975, 2008501, 1046819, 7578597, 5813907, 994139, 7373314, 202298, 3921049, 7435793, 6613992, 3772486, 2729992, 3711359, 7828309, 1303379, 6780255, 3903279, 3298256, 4503440, 6764755, 4939607, 6317822, 6857604, 2553301, 7582281, 3568855, 7379506, 3912786, 2545263, 1779329, 5967901, 6227022, 5779265, 7534498, 3354517, 4681031, 6015976, 916540, 5767059, 7229460, 5525125, 6831440, 4986302, 2141869, 5920195, 3423325, 7067616, 8339472, 2484779, 3457826, 3618920, 8331028, 3569103, 7258085, 1163999, 6478726, 3719181, 871024, 7710644, 7625131, 3411550, 7046028, 6900129, 4999115, 1555891, 138753, 2027583, 1586058, 3083301, 1137769, 6516740, 5184777, 7808076, 5816845, 2358726, 7303180, 6328150, 576299, 6860216, 7887588, 7414874, 6019409, 1934235, 4690682, 5630582, 3686713, 7870315, 4219014, 4462127, 2962036, 3894867, 6100835, 6997508, 2237891, 2228672, 8378529, 4359467, 8029496, 7027042, 8151875, 7695969, 6661854, 41191, 2018282, 8182243, 7390051, 2804348, 2779065, 751047, 7532507, 2555291, 5126788, 3548454, 6238161, 6201602, 2442666, 7856417, 1812876, 5854465, 2779579, 5132733, 2763704, 501283, 4605035]]] -s1Hat: [[2499317, 1795259, 4800980, 869430, 521202, 2485579, 6071362, 6893228, 5482588, 4624568, 7180362, 1042863, 4704703, 5961819, 3878803, 1464267, 5349558, 125687, 1911866, 4959252, 6586021, 2789240, 5672943, 2562685, 3301923, 5245791, 3281478, 4876663, 7560914, 6846013, 5814281, 2873811, 2836529, 5104012, 4153621, 7766640, 2329649, 4447214, 7186740, 5909473, 3012478, 5201314, 2536809, 5094038, 4886166, 255364, 5813136, 6513945, 5249622, 6832201, 3852181, 1337700, 56921, 7405816, 4004806, 4503705, 3961845, 2970737, 3208991, 5161320, 6039814, 4982733, 8068997, 3110511, 4696081, 7546144, 8058120, 2376964, 18807, 3353850, 5647725, 6125614, 3829972, 1707112, 5566655, 4606649, 7610912, 3624329, 3666151, 1816760, 7365954, 3138467, 3627495, 1904802, 4077804, 1246870, 4707885, 7050957, 2348360, 892896, 6692625, 6593299, 5890947, 3690999, 439172, 1903112, 2112324, 437167, 5841490, 6341646, 250122, 2479284, 1532667, 1513791, 5697986, 6795323, 2466295, 2173840, 2881886, 5268264, 996653, 7376568, 6236322, 979786, 216770, 8087598, 3023587, 6248177, 450772, 7155218, 1700825, 2771430, 7382363, 7601624, 7601532, 5079850, 8241489, 6406334, 5909888, 4755139, 3588220, 8061308, 256344, 1158999, 8016107, 4478765, 733955, 5800847, 3285, 5491638, 3013839, 5944015, 5115729, 1121305, 4239374, 7936183, 5748161, 5758104, 7874012, 532783, 4668698, 533622, 3018336, 996369, 7873561, 2755532, 3594125, 6351864, 2831338, 6673409, 2337032, 3842692, 166620, 3066927, 5276706, 5492054, 6344323, 1289575, 8171484, 7093920, 3682812, 1822905, 3039183, 3855049, 1770740, 1493816, 2923344, 6157697, 4020314, 3806934, 8031275, 2873980, 5715708, 6292382, 4659042, 794757, 480131, 7247601, 7018713, 1064798, 3596127, 4530816, 3631153, 1020033, 2279949, 6404559, 5739349, 4203650, 6642603, 4429043, 5903089, 592672, 4357901, 3020178, 687323, 5127407, 625770, 5062114, 1351148, 7301194, 7559720, 2629945, 4502206, 3307209, 2112358, 6727192, 774171, 7566672, 859795, 2196300, 2059420, 100532, 763073, 6458377, 6368686, 3388729, 504051, 5473018, 7588962, 4976083, 7102547, 2159122, 807104, 1650415, 747698, 4936520, 4128700, 778229, 316121, 8159159, 2493094, 4404023, 184401, 2703402, 6234733, 3911324, 1134659, 4517577, 3561981, 1173750, 842181, 3548586, 6603552, 3224308, 1014501, 8362727], -[2379854, 6041593, 4102404, 3336186, 748390, 2744743, 5663207, 2128166, 8271852, 4550614, 6234160, 1847437, 5654729, 1744925, 1611310, 2002109, 6706628, 7877036, 8099159, 5595873, 1458176, 3763567, 5257320, 4613025, 1620503, 4045832, 4654547, 5843988, 161498, 1383498, 22784, 894335, 6691247, 8018554, 4030574, 1580416, 877654, 414157, 2268099, 5111387, 7999790, 3115400, 3173574, 861109, 4296754, 4206607, 7357709, 1318292, 1818823, 8237739, 533254, 6464491, 457166, 4669446, 68488, 6094033, 2023251, 4473214, 2920903, 433313, 1192534, 1678030, 4030753, 6983974, 1252438, 8165669, 478596, 3141768, 3037197, 6511582, 3864498, 3549256, 3773317, 3378469, 3928915, 6965296, 8379232, 1250335, 5477073, 1779140, 450628, 6359178, 5966209, 4033813, 1862142, 4610037, 4965188, 4199603, 8044885, 171528, 6424235, 5415578, 2091309, 1663691, 2342520, 3543799, 5818336, 7320640, 2638950, 1066189, 4778634, 8327997, 6594521, 2892385, 6569448, 8070309, 2100392, 220559, 6741328, 233657, 1376902, 2322014, 6204011, 6245602, 7398943, 3266657, 7421220, 6884863, 7093511, 2193024, 1948774, 3900796, 949272, 7172278, 2565999, 577217, 2747172, 3968106, 5554287, 6200681, 1222560, 5474201, 3289023, 6710851, 3690610, 2815315, 678846, 2313075, 1002268, 3098223, 6055798, 4784288, 3382091, 4766285, 1151589, 3940849, 2798410, 523666, 1306475, 3601697, 3619357, 5278495, 909354, 7780751, 2213132, 563341, 7288574, 2669395, 7986885, 1779475, 1465021, 4796946, 8265051, 6012186, 5092355, 5776451, 2819681, 3184873, 3829422, 1160989, 1861002, 16005, 6253324, 5279702, 2523364, 2047878, 1850929, 3438433, 3582509, 8007045, 7302057, 3441471, 5555231, 6528229, 6848948, 7877425, 3137167, 2243845, 548859, 5450611, 3641746, 3540469, 6025558, 6078671, 5186874, 4073755, 5740501, 4221206, 3801206, 940870, 3933451, 94306, 8002498, 2685670, 4993584, 5601642, 8350466, 3434558, 5222137, 6301215, 6144389, 927490, 304221, 2705345, 2764164, 5461827, 4961806, 509923, 3372141, 7135750, 2861840, 6222640, 6690758, 2610562, 479212, 1187011, 7304848, 4201165, 3332027, 4736157, 7688755, 6502048, 2708108, 2868784, 87571, 491298, 6348483, 5397539, 3290008, 3556374, 3512850, 5110262, 5809579, 4807149, 4670533, 7904502, 5460412, 8213669, 6507408, 4762901, 473103, 2392156, 5447729, 2667316, 7154735, 3000842], -[6349296, 6112582, 1734815, 1227186, 2003385, 1242596, 1101137, 6399070, 6957717, 1642627, 4892050, 3630307, 395737, 4027591, 4190884, 6310909, 5003944, 3949568, 1390219, 6128796, 4035941, 6561136, 2815808, 4290631, 6788139, 5305542, 2815103, 1425933, 1886367, 4249111, 5334874, 3003057, 6531276, 710563, 7871775, 3100442, 4413052, 8260360, 6468435, 1263959, 3796215, 923752, 7848772, 394311, 2719155, 3495480, 815819, 609250, 105839, 3426950, 4031928, 7282093, 1705440, 6762835, 2343609, 7684277, 636745, 3956282, 309989, 432980, 5587366, 7146766, 7096228, 6315222, 5369645, 7949523, 7958654, 4481475, 7135461, 5880522, 4458049, 2049329, 2398744, 1460667, 1651251, 7684145, 5411052, 627727, 2151041, 3365857, 4111095, 7613985, 6667212, 2687444, 3502968, 1310438, 2522894, 2337, 6032782, 7388343, 3437508, 5301387, 3020918, 6772298, 4405529, 1037684, 5355194, 5005615, 1393473, 7931028, 5981268, 6547137, 2013445, 6252648, 5997165, 6157891, 4104953, 4383323, 2627753, 744767, 1249514, 535699, 4926652, 7455887, 4132403, 2192215, 4174967, 4984539, 7204947, 7418832, 5630263, 178157, 206165, 5508309, 8276270, 2745384, 4411396, 8118446, 2649468, 7403526, 5491388, 3986329, 3521700, 2246803, 85393, 1279136, 2264366, 8064206, 6954323, 8063214, 1951292, 798097, 6826957, 6859012, 7433372, 1852525, 1391138, 1836879, 5106524, 5996580, 922887, 5436351, 3042958, 3656972, 367136, 1586846, 4377641, 4653933, 5604283, 2354514, 8110366, 6340960, 6174554, 8175794, 818650, 1791133, 5994765, 6542070, 3606413, 1038552, 3561934, 2030477, 3686271, 3797402, 3950179, 5367692, 1112158, 154784, 4496927, 973559, 733650, 7393293, 572839, 7156975, 4760671, 5418515, 7556806, 2007007, 2361174, 5367750, 4164617, 6845557, 3970145, 4364613, 5353011, 2567547, 333373, 3703862, 3915924, 6701381, 5159674, 3003079, 1799843, 7867899, 7752817, 1068394, 2278186, 3235867, 1787870, 8110699, 7762857, 5168041, 5119677, 2626959, 4847331, 7706462, 3444540, 951173, 2936445, 8069792, 2803161, 1850337, 2581475, 7157282, 6375649, 6042017, 4189124, 1924550, 6256620, 6367826, 408931, 2595224, 2876562, 3930579, 3671458, 1747034, 3784099, 5967342, 64864, 1123174, 1695110, 659263, 1294710, 6665312, 625600, 3478455, 687206, 5082876, 3016379, 7445229, 245409, 2523419, 5476789, 5527240, 4947175, 5024727], -[4363745, 2812325, 885232, 7413585, 5145924, 5080865, 3694601, 2091302, 2004338, 275662, 7876289, 7552250, 2477475, 5486858, 8281007, 6775861, 2220956, 5103349, 1729575, 7975334, 4912182, 3346608, 7373639, 8069830, 1218723, 3832441, 923853, 7954358, 8253476, 589791, 774392, 3085997, 3116048, 5233360, 5991045, 1818325, 2436869, 7600424, 4771187, 3950081, 1405748, 3236847, 4984153, 4964243, 7391651, 1505919, 7002442, 8201629, 5150794, 1416392, 5150808, 6013752, 6272945, 216440, 3789560, 8244012, 3208123, 7433430, 2286147, 4502390, 713133, 7883178, 6041397, 5176469, 1621345, 5398173, 3576345, 3253701, 3654581, 7719452, 1010073, 41073, 8145824, 7649499, 1475422, 651793, 539302, 3742700, 7956860, 6659589, 2244802, 5583808, 6098953, 1477195, 4837767, 600774, 3714844, 7926694, 2440096, 7012447, 4679197, 7776053, 3569290, 6745582, 4382797, 826852, 102251, 3731865, 1203922, 678789, 6615793, 6849042, 4821152, 5377986, 2917182, 3239138, 2603740, 6596065, 687874, 7823763, 5304649, 1769099, 491395, 4344863, 3548508, 371936, 2901391, 5842450, 4414012, 2635472, 6652924, 2641414, 5619641, 2321021, 7881947, 4374201, 540069, 1739359, 3297365, 7855301, 108419, 5718129, 7236556, 7879256, 1184308, 8095084, 4284900, 4412881, 4300555, 1628161, 5509820, 4591570, 1146897, 3663040, 7134371, 2321936, 1404024, 6757781, 125647, 5002556, 808542, 1765828, 1357222, 7192593, 222326, 2864273, 2809217, 6689014, 7361713, 1799029, 3686605, 3991337, 6236483, 6141671, 7356092, 1376879, 6924660, 250626, 2414768, 557940, 939073, 5982631, 1380139, 3064350, 658880, 5993262, 6257166, 4281291, 2596369, 5912859, 7311869, 4810822, 5615576, 7790050, 7415807, 1183696, 712907, 1029368, 2512402, 3914639, 5105102, 3497479, 2823791, 6332647, 3260691, 4051304, 6720525, 6445152, 1622534, 7680286, 1669072, 2719574, 2118864, 3939195, 4204579, 7184988, 1615037, 2880554, 1763729, 6982042, 154953, 4451744, 4840785, 3407982, 2124241, 3259613, 4100353, 6704846, 2413235, 501098, 1437064, 7185139, 2508065, 3829647, 2341997, 4147450, 6763225, 2054152, 1648756, 8357070, 3307066, 8290442, 7205153, 3121433, 1004756, 3124824, 1405794, 790057, 5523720, 5706831, 6274551, 3399650, 919808, 4125582, 1576794, 523616, 4445073, 3251671, 4300421, 967284, 2795083, 5372831, 2808743, 3005894, 2827701, 312189], -[7119500, 2742251, 7078689, 976113, 3930636, 5568082, 5778734, 403706, 1742113, 7211512, 2759301, 4499632, 6309005, 3830906, 8370273, 3428549, 1890009, 1171349, 7433909, 7500574, 302820, 2133009, 2744969, 401362, 6107026, 6751658, 3446390, 839841, 6179705, 6568193, 3677904, 3318013, 6205786, 2656937, 5887087, 4532708, 2049682, 29554, 2522821, 6900390, 8312884, 6254921, 989832, 7561197, 5475415, 2341362, 1170009, 1907051, 3272725, 1447039, 1756087, 3447206, 3702536, 2612978, 1690556, 3589999, 6346907, 6088517, 8012514, 7380338, 2287515, 2660501, 3937897, 7574327, 7062533, 5014845, 7424821, 3430314, 521210, 4843683, 5796707, 2610629, 6226510, 3034953, 7338881, 3833258, 2808696, 7017033, 1284099, 2763491, 6163967, 7316035, 5558332, 4563277, 2333607, 4615181, 2654409, 1551302, 30435, 50113, 1653402, 3755880, 5680755, 1364247, 6635458, 7272699, 8118201, 5128680, 802285, 2553088, 5802496, 292556, 1752086, 1094660, 2102089, 8242599, 592916, 5987322, 7070021, 2477434, 3762045, 7392504, 3636095, 3669967, 4766046, 558651, 5553927, 2972317, 3076390, 2613508, 2305945, 1894319, 7454248, 8099551, 2104808, 5020743, 2719096, 2889834, 713936, 7280006, 3602017, 6611346, 7772343, 2911062, 2518367, 618420, 2058499, 7471680, 1829360, 3787086, 7463442, 911726, 2614372, 3537329, 5781867, 378349, 7295132, 8347424, 2519795, 1265686, 870445, 1908375, 5443483, 6005773, 1634803, 5044468, 1671756, 701916, 3651794, 6303419, 5453441, 1861448, 7488088, 7883969, 5772066, 4941255, 7057661, 3984537, 1061386, 8177099, 6538435, 4372562, 2327837, 8069079, 7043438, 2103745, 6271736, 2696943, 4401612, 4455441, 1390731, 3135085, 6189984, 7707856, 8068411, 6486531, 776396, 1800534, 3502402, 7776165, 6505561, 5802205, 4315704, 6138960, 816478, 91615, 4828128, 3947881, 1716179, 2063571, 5962040, 207414, 3212494, 5376152, 6970096, 5855420, 1302778, 6642105, 4210127, 317575, 19513, 6854289, 6629966, 7486098, 6618456, 3298944, 5140371, 1934097, 1601962, 1701286, 4415776, 4896563, 4254020, 1989172, 7557889, 2643847, 4290545, 5161561, 7078367, 1365991, 6988264, 196704, 7252599, 427388, 3562626, 5533061, 4782814, 5305054, 6775289, 3189679, 6206080, 2568655, 2465859, 4005346, 6772850, 3628739, 3579737, 465398, 7937103, 532301, 3025586, 2540198, 4244935, 2985680, 682263, 3816404]] -s2Hat: [[5227188, 8196134, 7938228, 6128519, 7544880, 7734355, 4170169, 4191494, 6104760, 482583, 1223376, 7248944, 5636976, 3691739, 5815638, 380889, 7273457, 8249072, 1258447, 4480737, 3653833, 6607083, 3443966, 2075348, 1856333, 2468622, 7766355, 5824412, 7368459, 4619943, 161873, 3311293, 163775, 8296254, 7146990, 7052922, 2175191, 5767795, 6779110, 831316, 921939, 6041190, 3003390, 6214487, 6903694, 465811, 7630692, 1741209, 6699540, 7904398, 4073420, 5848868, 7522564, 5839311, 4401204, 7246313, 3737833, 7136519, 1379124, 5180393, 7459433, 5651301, 4597959, 5374880, 6761033, 236004, 1738855, 6864262, 1694822, 7677673, 3140568, 7952764, 4224527, 5496877, 2991606, 7314342, 3542706, 2368815, 1333084, 1602396, 3554924, 6991914, 6084398, 6886286, 6069039, 1780279, 7218380, 3250398, 5738770, 5508111, 6043049, 4272298, 6560204, 635797, 2775732, 3495714, 1348969, 4096311, 6411991, 1340585, 5031581, 701039, 6559698, 111270, 4613027, 5687602, 134838, 6250259, 5432759, 7739732, 8042972, 11590, 7075711, 3849565, 4858749, 1750994, 3966822, 2102418, 7308345, 4065141, 7191003, 5427509, 6840080, 3714051, 5705671, 5604789, 3013296, 1236799, 4309865, 4608643, 2244801, 666212, 2438467, 1262588, 3081714, 4094335, 3225383, 4504229, 623584, 1570371, 8215625, 7269790, 8301280, 5453909, 1913553, 370792, 435450, 1333180, 5118797, 7957299, 2094316, 6026008, 1705131, 5221128, 7370631, 2401088, 2077041, 866206, 835709, 6070217, 6818305, 792353, 4058830, 2488828, 7896329, 5759153, 902282, 8147719, 7614535, 5988831, 3579356, 129131, 8035615, 7005292, 7637878, 3340771, 5152929, 6050962, 4368555, 6512013, 4654063, 7571535, 3655776, 6076476, 6291776, 4649690, 3908453, 108921, 2766413, 2184279, 3223231, 3610498, 524549, 2536569, 5728394, 3121267, 8186775, 4835327, 4249365, 3165422, 7273748, 4781304, 615959, 48211, 6475075, 2827769, 6722026, 4281555, 295403, 4463816, 7352198, 7495023, 3783090, 5435406, 3887699, 7507451, 7176804, 3090244, 7272515, 1067798, 3872792, 2996101, 1811524, 8144880, 902149, 3986864, 5380212, 8251180, 8033495, 837815, 2153576, 516780, 7278307, 2677169, 3345689, 8099446, 6146772, 8375824, 7786353, 8253829, 1995661, 7489899, 2171448, 7747413, 7314206, 4571643, 4094113, 6814720, 6482851, 4588681, 6611959, 3244484, 1374742, 3890160, 136213, 7914735], -[1529957, 8373383, 8180333, 3335667, 7490716, 52263, 4946305, 1691137, 67053, 3629948, 2869925, 4697872, 1492533, 4592677, 7883419, 994710, 890373, 112535, 7710890, 4780442, 5907679, 2018475, 1873631, 5530463, 4526777, 7311615, 3875146, 6770369, 2226435, 6659813, 4390884, 2890707, 6782545, 7294514, 8123914, 4695585, 4792386, 604529, 1138486, 2034072, 6493553, 1375247, 4367210, 3666796, 2091346, 5093443, 4214980, 851877, 7301345, 1792589, 7129682, 7268402, 4464707, 5753532, 1310146, 6508591, 1102826, 4880633, 1264523, 2779131, 7226807, 1194588, 4315547, 4125905, 1658049, 3102336, 5135414, 2882912, 3069271, 4384176, 6070558, 8318144, 5071405, 8243061, 3921405, 3837170, 4911430, 1370612, 1706562, 316586, 1141008, 3502884, 1418366, 7702757, 934008, 3270281, 333936, 534618, 7832624, 8032689, 7884647, 3299111, 3153481, 5661661, 5836919, 573287, 5786014, 2418939, 2150812, 6235841, 7563159, 5593619, 1441954, 2869971, 7600741, 3881376, 4125588, 5926050, 7753333, 864485, 1939479, 5336733, 5419245, 2025151, 5490938, 6536126, 7611735, 6552739, 6799682, 4575867, 3315017, 5947900, 7183670, 92968, 6650295, 1932206, 825991, 3766248, 448374, 2661264, 1715067, 414227, 6152404, 1201665, 3387060, 1912259, 6539237, 5290564, 6644062, 708779, 5868967, 7462311, 5493221, 5817903, 1894527, 471991, 4810117, 280710, 7134504, 2400923, 7151878, 3631554, 6164195, 2941806, 6025183, 3521182, 5512130, 6586179, 3810193, 6813840, 1939341, 1243207, 2765604, 1546921, 4754431, 193795, 6507691, 5148358, 259209, 5027096, 5531337, 6540592, 3632852, 6616107, 3120896, 1236907, 5912495, 4888627, 29803, 172620, 5890409, 3594265, 5527886, 3195423, 1120151, 3929580, 781085, 2101727, 3398777, 876186, 7391904, 5185215, 7609414, 2151825, 4465093, 8244245, 2528651, 7746829, 3391816, 5880565, 7104812, 271312, 1816020, 7141340, 4345785, 6461571, 5365421, 7746669, 7945276, 2305358, 634268, 3695920, 7483847, 315699, 4278743, 946056, 2893639, 6062691, 4400568, 5813468, 5934629, 6542883, 4017733, 6845198, 1434184, 7679362, 2493729, 6846302, 268259, 7225745, 1125435, 6471581, 7866643, 3581550, 3534194, 7324725, 2045420, 3385094, 5589430, 7846244, 3209660, 1781774, 7342534, 272495, 517747, 8078721, 2707399, 4403644, 96947, 5898630, 2423779, 8189234, 5700649, 5384131, 1265898, 6337918], -[7845161, 3683011, 4412858, 7596066, 7056705, 2257634, 7398448, 1769649, 3335523, 3939644, 1702266, 2828940, 2208856, 2540533, 6462873, 4306577, 6744592, 5612676, 5314342, 891272, 7587812, 7766337, 7841571, 7008970, 5722716, 745319, 656165, 4403989, 4684511, 304332, 5404659, 745210, 7439433, 7028359, 792631, 4052830, 1175058, 856302, 3804213, 745416, 1563371, 6543465, 3444996, 1057012, 7349463, 1301886, 4302850, 3762058, 5127988, 7358615, 1834852, 3028198, 2364079, 7127446, 5337599, 7820725, 6511933, 8010162, 7858510, 1156518, 906916, 4411576, 1843817, 2723111, 1822036, 654967, 3594533, 1563219, 5701267, 5023689, 4794855, 6019881, 1643795, 4847856, 4442373, 2397980, 4107651, 1792148, 5224051, 4912364, 6660005, 4468636, 5958072, 2525112, 5868716, 5162223, 7244730, 8005230, 7593425, 5138644, 5652431, 8139449, 6940282, 1831607, 4687521, 1721912, 2606570, 2025878, 4191047, 328815, 634661, 3132976, 522137, 8149439, 4804957, 4968832, 5750216, 4521371, 1366526, 7588797, 5689049, 1544126, 1181152, 4314145, 7254689, 7478066, 8092288, 4315289, 5713790, 7587935, 2144640, 693295, 4533299, 4692905, 5292461, 6546365, 5869177, 4011492, 4718399, 1480039, 361680, 350194, 8219746, 2340277, 884062, 3278515, 30292, 7785152, 7010475, 2748868, 3669018, 8064865, 3669436, 5572519, 3792697, 4985402, 6858056, 6907648, 3729425, 224783, 2587977, 4387544, 7938651, 1875811, 1706706, 4292359, 2377559, 7354499, 5272727, 7046177, 3474161, 6726072, 5491120, 3026776, 1276594, 5596322, 89861, 3929654, 7835789, 2323801, 2878959, 5932909, 592918, 5716860, 8103710, 2518618, 4350761, 2807545, 5130168, 1387893, 4401331, 5086658, 3237998, 4044078, 3165456, 1202896, 7363313, 6481111, 6343381, 7002900, 4418330, 7795216, 4886251, 557561, 7473909, 1984748, 7976018, 3459861, 3036546, 5426269, 951899, 5138772, 1916580, 4038166, 861134, 7427872, 5834267, 1194869, 4219517, 1808688, 383359, 474010, 347458, 7863538, 3831810, 7627416, 6807161, 2434727, 7435935, 3038848, 3078250, 1184650, 4551213, 4608976, 6540176, 6206960, 3362462, 4942649, 2733538, 2582344, 121509, 6784762, 7635025, 3621450, 4143848, 3851794, 2763566, 1000144, 6810175, 5096725, 2106281, 2187550, 2507358, 2015740, 5330928, 6107150, 7911260, 4273814, 6819951, 1656491, 7032809, 1527183, 4922038, 1498872, 18571, 2357864], -[3175675, 1571759, 4112062, 2895282, 172355, 7715225, 4530213, 6243862, 29078, 1797132, 6654058, 4657907, 686772, 8287004, 3918555, 3480944, 7862445, 833601, 7662734, 953416, 3433751, 2838576, 4863191, 1274524, 2141465, 1576248, 4373154, 713207, 516442, 616883, 3260766, 114520, 5411773, 3903425, 7371374, 1892975, 6695912, 931270, 4670924, 1510851, 7040102, 3825988, 5369586, 727299, 1777934, 7978741, 4768800, 5815863, 3009603, 5225932, 7490589, 147819, 5664546, 3709020, 7783574, 4439345, 7764912, 6082760, 1046651, 4871319, 7891425, 2226598, 8000738, 4617248, 8305258, 898679, 1686328, 614756, 3981369, 6708331, 4637844, 8333019, 4758255, 6938403, 5467889, 778310, 3888758, 2505372, 3247711, 7747062, 6718652, 3664084, 366339, 3311489, 7015665, 4330464, 6962852, 7800854, 1490169, 2008195, 757553, 4303224, 8310028, 4872378, 4761621, 5340573, 708075, 3671199, 1193976, 1734284, 4903885, 2977634, 5141484, 4041834, 4356331, 7841181, 1351779, 572868, 6348829, 7906999, 2577736, 4420482, 3798607, 7258256, 935204, 3727640, 1977413, 2285432, 5136641, 5050287, 131507, 597593, 4956981, 5043568, 6447701, 210324, 5032854, 1072655, 2500995, 4645090, 1818728, 2298654, 5768773, 4080664, 1229340, 7516764, 5165910, 339895, 6836727, 1387070, 5011731, 8101350, 5006494, 2825372, 4320835, 6385878, 2441802, 7722176, 2846764, 2810130, 1074076, 2164669, 5931055, 7008336, 1157032, 8304552, 216227, 2874981, 6431699, 2737820, 4868746, 1498582, 2014000, 6302622, 3375215, 4920245, 8219340, 7184402, 7340564, 7993595, 6277808, 3815441, 4028574, 6410493, 534909, 2671323, 1133120, 3099408, 7403109, 4328346, 6871701, 1886032, 1743033, 3855183, 4929829, 7470280, 2890327, 1783059, 7470269, 8352204, 254715, 845149, 4186768, 1197392, 8109095, 764969, 6172208, 2526576, 1752136, 7081757, 5240613, 6028746, 2158962, 8043362, 7045484, 7447612, 164476, 6302282, 6922088, 2747495, 2482847, 7862924, 7484793, 3400534, 5030939, 3253748, 7768498, 7588851, 6511080, 8289929, 5782709, 4416241, 7331102, 8341457, 197572, 2764787, 2659314, 5787471, 7601864, 7818168, 7490768, 2010550, 887567, 5123940, 5310659, 4665240, 4899865, 1431857, 3003777, 1872387, 2301589, 416522, 4074528, 8320635, 7773473, 5792858, 804749, 5780622, 1258777, 2009950, 7123275, 4491497, 1072556, 3807313, 1548927, 3868497], -[3099830, 6814088, 588739, 5605532, 2409666, 5731691, 1212247, 4523953, 295554, 6455530, 6507052, 2789259, 8227335, 3680685, 6330435, 3330023, 3765960, 5424381, 5260527, 5549291, 6148041, 7834238, 6864361, 6581748, 6318225, 2186329, 7969809, 2864864, 7696792, 5186985, 5740470, 89938, 1505555, 6270466, 2751594, 656053, 3746873, 1368558, 4334890, 2796081, 8033063, 1414938, 1922892, 1097935, 4347860, 6753500, 6128804, 906232, 1502613, 2430439, 192950, 8306370, 4562165, 8270979, 2674762, 3453157, 3693896, 1831998, 2850248, 406345, 723085, 2778004, 4885213, 7251867, 5763810, 1452703, 8336580, 3342177, 7038939, 661077, 5700477, 2291981, 5082835, 8074557, 3426942, 3071158, 1884756, 3239267, 1521295, 1632494, 2443766, 5565329, 1407425, 3840759, 4555714, 5742910, 3614497, 6404821, 4130027, 4807350, 3280383, 3456080, 2650220, 185317, 1600021, 6613782, 5418821, 2137343, 5384418, 5769396, 5929483, 6903185, 2765344, 996773, 5150927, 819638, 8153019, 6421602, 6716716, 4697850, 346635, 6638824, 4754810, 5542591, 5971936, 354824, 1330503, 3650358, 2831480, 2402995, 5797860, 4813866, 5555322, 6061211, 126130, 2956079, 5225741, 1184639, 6048214, 2515291, 2987416, 7962073, 8242756, 8028289, 3849965, 1913529, 1959976, 7459363, 6958282, 7052325, 5346443, 5954952, 4662122, 7132608, 5414260, 6100279, 4032183, 3397105, 8031618, 1472435, 2509355, 4311848, 4522811, 2023000, 3864119, 7922002, 3758782, 7328567, 5094173, 2902215, 8051360, 7804174, 4711360, 164288, 50830, 7969449, 942867, 5481979, 1700655, 7918672, 3457599, 4085968, 858520, 3057606, 1963953, 5650270, 7355829, 3632843, 5962375, 2417197, 5829999, 3454025, 3903318, 7128875, 7471715, 8258241, 8275054, 3263819, 230724, 4829934, 6182329, 3558532, 2868920, 5390144, 4901467, 6866, 2399183, 3698355, 3386870, 1210399, 5488249, 2818256, 1532791, 6166909, 1743844, 314071, 800666, 4502995, 1872554, 5555334, 4551729, 922692, 1095984, 3579595, 6968999, 4455790, 2832277, 6887810, 1445066, 625105, 1315267, 5993266, 3407820, 651819, 4961247, 5875811, 6417613, 3047501, 8019168, 2337348, 8104900, 4282416, 2067885, 3346873, 1392716, 5225410, 4755348, 7732449, 2426609, 429539, 5347663, 3265495, 5927670, 4515565, 6766405, 2684384, 8124794, 4134012, 4227375, 4129525, 2437864, 99425, 908250, 3842192, 6899851, 6244142], -[5461891, 2165040, 2772851, 8358963, 4454998, 4414892, 1894519, 3049575, 5138620, 5376063, 7807073, 2917980, 1229493, 1246057, 1898158, 741979, 3093340, 3057411, 1266245, 4075299, 5882333, 3508108, 2943050, 8224154, 4290209, 978042, 3028140, 7266497, 1846773, 8321238, 6778775, 5956513, 6860021, 3189414, 7943188, 7770105, 40936, 4715774, 7206195, 5954336, 1963157, 6170248, 7734574, 559076, 6297933, 7747057, 321123, 2798709, 4410958, 7163709, 3151308, 5338961, 6824930, 1722960, 5611226, 5903724, 7970328, 8218772, 1080973, 4410490, 3776853, 2843198, 7958918, 5150323, 7954160, 7623593, 7506859, 7588978, 1812082, 7118595, 6195256, 5789254, 2067044, 2090755, 2948568, 2459255, 3539608, 5634265, 6770154, 3751556, 804126, 511098, 8158251, 5770010, 1079790, 6285424, 2571179, 2345450, 1038341, 7866538, 6511057, 262783, 8036279, 4970092, 697017, 6741974, 6426124, 4188494, 4405547, 7577942, 1124971, 291194, 1509928, 7851076, 3792736, 1096334, 7969303, 5232203, 2894535, 8377802, 3592317, 8254590, 7920781, 920393, 5449847, 40046, 1864654, 4842214, 5323568, 7367614, 7172323, 7143889, 6551924, 8178743, 771242, 7515990, 7526797, 7034325, 1580375, 3182843, 6420773, 4559057, 7303755, 2119440, 2697801, 8091913, 624201, 6975828, 6709697, 2916127, 4109331, 2381316, 4514526, 1532624, 7054672, 7297936, 3064607, 6760638, 1505555, 6608880, 1377293, 1244792, 2495709, 4388789, 3785253, 5676680, 1102651, 6443526, 5041913, 3792647, 7299277, 1294248, 6569763, 2679119, 1312518, 1541749, 5569723, 2566782, 2465795, 1289377, 3820379, 6916779, 5582339, 6355462, 1290517, 475460, 4594379, 2222916, 1766351, 1512525, 1216227, 6619972, 6237491, 6608884, 3538227, 6976397, 7969915, 1665385, 1670505, 3164717, 3637712, 7511352, 1350901, 6460174, 1407286, 2970903, 399941, 682826, 2161217, 3470482, 4073122, 2247201, 7560186, 476456, 768918, 498216, 7289255, 6386660, 3611874, 4650222, 4851550, 274320, 961515, 2847617, 2056524, 8301315, 7735624, 2293322, 2496367, 6707192, 7248300, 2686339, 7263377, 5282958, 1920660, 7161801, 321685, 3742937, 2385259, 5480811, 5943665, 380510, 2135050, 4358217, 1481295, 6751629, 7481820, 5961980, 7694274, 2216073, 837031, 3383190, 5991354, 7539125, 1066883, 8353084, 2409046, 7716285, 3428994, 6302885, 6383632, 3631782, 1343150, 6090903, 2129890, 6452513]] -t0Hat: [[144788, 8221339, 3635367, 6392957, 8097917, 58500, 1015198, 6109618, 3428568, 2306691, 2202273, 3726539, 3534818, 7177558, 7198145, 1437441, 8348522, 5803442, 1891479, 3154328, 4488877, 7070851, 7032272, 4554528, 912833, 4586437, 3065337, 5304808, 3034444, 5902813, 4463609, 2315636, 8162873, 4252834, 2277030, 1560408, 2204225, 2237446, 2376229, 267480, 5769547, 2778585, 5282982, 532912, 1760516, 6580330, 5979389, 4980838, 3779358, 5707355, 1363253, 4635541, 5229771, 2673700, 6418282, 2194351, 8346956, 6637313, 6365030, 3008305, 1363924, 777406, 5421138, 7590173, 644655, 7972466, 2003972, 7215300, 6768904, 2911400, 280140, 6580674, 4085738, 1627581, 3385996, 1728944, 6203652, 2111243, 4610117, 3223729, 3413566, 4674752, 3580959, 4680630, 7009729, 2645299, 5296138, 6216787, 6429026, 7077595, 85303, 8142746, 531777, 4102533, 5597415, 5030522, 466975, 1166425, 1687943, 5011902, 2025343, 4012320, 2419499, 4954401, 5802188, 1935869, 1998030, 2038253, 1333831, 2882727, 6806832, 1365918, 1830820, 2917905, 2144953, 4406583, 1851668, 7661001, 302765, 2862027, 3219835, 5065735, 2742327, 6507653, 6469275, 425567, 4225033, 5610893, 755132, 3129088, 6515113, 3473976, 1266233, 7680948, 2709453, 748540, 2961127, 3136866, 441771, 5389930, 2301871, 1678360, 93881, 2357064, 5386406, 288283, 2153501, 5528664, 6183013, 633388, 266700, 1180185, 4489959, 3621512, 3434583, 336176, 5741174, 6344563, 108352, 6050513, 3598246, 7580682, 820224, 6757350, 3819433, 156523, 8306011, 2996579, 4165062, 829632, 4764402, 704831, 5061867, 459202, 1042690, 7770621, 1653492, 4570532, 213354, 351615, 6953854, 4067030, 4927708, 857271, 8335740, 8053464, 7015414, 288282, 8202687, 4103038, 6880844, 2685231, 4767851, 1707745, 7107822, 6942373, 4892738, 7414765, 587872, 343431, 3607272, 7131629, 6692132, 1527766, 6268252, 6633174, 2198844, 363590, 5539035, 5512194, 701612, 1552477, 5831048, 159615, 1836031, 6586578, 5076740, 2709328, 3016449, 6206603, 3384898, 7775233, 7476523, 5757766, 6778743, 2059617, 1083708, 5569785, 6295999, 6668136, 6121158, 4249024, 7408070, 6347583, 3630563, 6628430, 6927604, 3963283, 7070639, 713350, 1715496, 5201935, 942064, 6170332, 1415480, 85292, 7383698, 5031683, 6080567, 4275012, 7578780, 8063256, 5911122, 8120525, 7050665, 7590449], -[4059942, 3950847, 6162127, 7515512, 7338337, 2854549, 3291766, 3909857, 3291400, 4976426, 5833013, 5471045, 3304570, 4820910, 2125034, 3595928, 6877900, 4685977, 7132438, 6086142, 8318247, 1980335, 2862991, 1375838, 7825946, 1699491, 5421183, 2061015, 131195, 2467589, 2401427, 2438235, 7274277, 2283868, 630870, 1115653, 1754991, 3617819, 486854, 3607658, 1348564, 5792475, 3634882, 3490537, 7115267, 2733861, 4194691, 1438526, 3959966, 2425357, 5828770, 7426165, 326004, 7250749, 1453533, 3919302, 595878, 4997191, 7659298, 5514096, 2755591, 4018786, 5477513, 8138878, 8371060, 1209630, 6549511, 5718084, 985851, 5182995, 8304778, 5058982, 5015224, 2467957, 1199585, 8182715, 3359627, 920478, 1869264, 2865121, 4558061, 601178, 4845680, 5792581, 905306, 4608963, 3314171, 1163806, 8115005, 1754524, 1547528, 2562450, 6811052, 793817, 464749, 8228330, 833292, 8301930, 3196919, 7603973, 569916, 6453979, 7703274, 5731199, 5049608, 2024583, 3302260, 7457108, 2088418, 2838176, 7834322, 3773420, 2747332, 179209, 3947078, 4857233, 1319207, 8213869, 1387417, 361140, 6674967, 5539964, 6325827, 959123, 367444, 4051216, 6665072, 498660, 7013214, 7758201, 6882027, 4407909, 5041344, 1421058, 3160325, 572842, 6748975, 3118787, 2760656, 1592498, 6621196, 7959017, 6105311, 1831029, 5362524, 3338455, 196112, 2427818, 4254964, 2109670, 3399467, 4330510, 551432, 3555154, 125669, 8376905, 4642351, 6907683, 6311551, 5144004, 6545639, 3128982, 2517863, 5477364, 1164406, 4088323, 2588493, 7227667, 5785230, 5800120, 6084928, 1184363, 3461606, 150710, 688626, 7152141, 3763413, 2697791, 3610593, 6496675, 6395850, 2917431, 1396728, 4233930, 7231195, 5047136, 7863516, 7851479, 3914555, 7863681, 4221473, 2372575, 737811, 3515881, 4569288, 500859, 3915882, 2325753, 189064, 7061470, 6014684, 1367216, 6811939, 5606008, 6970295, 452070, 6028626, 1022464, 8333135, 2580494, 2695227, 115365, 1558770, 6641895, 2959869, 1458862, 7348647, 1462335, 6990944, 5347935, 1263265, 198647, 6832993, 5694220, 3932951, 7635539, 2321375, 3119071, 1146818, 1271796, 7453657, 1552548, 4979482, 6879313, 8299313, 1698625, 2549009, 4944908, 5298919, 909675, 1844161, 934055, 7047637, 280216, 2637037, 5552340, 1708430, 3508873, 3414500, 603389, 377268, 7441647, 1834147, 6010895, 1246801, 505161], -[6334957, 7219104, 4183977, 5357028, 2775572, 6613045, 5995856, 727098, 5899235, 7309716, 5657994, 105394, 6763807, 5169981, 2266768, 818511, 813323, 7449575, 4949544, 2526679, 717587, 7725244, 6642750, 6843059, 7051109, 8376491, 2176880, 1402457, 7833907, 4275860, 1969775, 2719521, 3739151, 4563498, 8214421, 5539720, 908678, 1609537, 1211222, 2726927, 6995881, 3971268, 7130512, 7839671, 4258476, 7153669, 1753101, 2055394, 5195730, 7446830, 2945677, 8000719, 7888567, 87415, 1655980, 4921588, 663953, 5473602, 2999935, 2747701, 8204466, 3150194, 7942905, 6384145, 8237061, 443637, 964917, 3986799, 1142016, 3790195, 2769947, 8078434, 7379762, 4653343, 8192792, 2006650, 6388717, 2954313, 3050532, 3654643, 2884747, 5077756, 4972605, 4632366, 5827590, 8202506, 6349771, 3704421, 2534287, 1243178, 7210560, 2840642, 4555673, 7077559, 198273, 2345885, 910172, 469454, 7104165, 1090759, 3455757, 2686352, 3359937, 3770021, 2748066, 4285067, 8098068, 2464351, 7874524, 1100432, 4759256, 6558012, 7562524, 4184839, 7317856, 1630381, 3406918, 2708585, 1667934, 396911, 4515547, 5418029, 4231722, 7667456, 6397061, 287016, 2967894, 1632214, 7425981, 3540777, 2305497, 110318, 6936238, 2443175, 7420172, 2229503, 7370948, 8358202, 459764, 4033137, 7468211, 5759849, 647329, 2158719, 1548604, 3486701, 4240045, 1452530, 5465334, 6220700, 6949201, 8089880, 6784411, 2774812, 2581050, 4497113, 696274, 6805746, 593410, 6616569, 251563, 3976625, 7932341, 7805846, 4067521, 745823, 1186734, 225634, 7436721, 3729038, 3808013, 7294606, 5708952, 1232113, 7140685, 2283451, 7082953, 6778182, 240455, 1881448, 249353, 6246273, 2424902, 6370889, 3110529, 1878450, 715981, 835035, 1486712, 3656617, 2142266, 1274053, 7297572, 3299074, 3228942, 4564360, 488653, 3702914, 1386499, 834836, 6053879, 2633268, 2169257, 3768168, 7676540, 2569456, 5875939, 8005791, 4003507, 813984, 3727570, 2622322, 173733, 4710636, 7520013, 6806416, 2799431, 6123368, 3755091, 4945418, 3729225, 6779583, 3519373, 2807123, 1048091, 6090994, 544485, 3358218, 6365703, 439375, 8069688, 4783879, 832376, 6049947, 8051380, 1611544, 7274069, 1132136, 4265542, 6022512, 5970163, 7732672, 2766222, 7942423, 3588554, 7114007, 537724, 1519759, 6987047, 403964, 8090920, 6589492, 2015695, 6794086, 4867618, 5163768], -[4943662, 2075083, 4328044, 4778930, 1567165, 7377916, 674011, 6078949, 4360103, 6645200, 7186689, 251935, 1470885, 1755247, 7234625, 2131833, 8241176, 6935658, 5589259, 923283, 8232353, 3396697, 1281836, 3377654, 1401117, 7720604, 69554, 6800091, 221630, 2095525, 7990484, 7115256, 2062416, 2509807, 8376939, 3138137, 8105883, 1126016, 126407, 6026585, 5038087, 1083643, 5511979, 5105691, 555036, 5458127, 7737726, 7003597, 5665697, 976337, 4772860, 27710, 791450, 4134745, 6409940, 6739383, 6176144, 1933093, 7564879, 4506230, 1442504, 3715522, 5180031, 4523771, 8047664, 1149005, 395344, 4372633, 1303755, 4886859, 5182447, 8342151, 3109557, 3698646, 7814095, 588948, 1614266, 3701749, 5346388, 415076, 1355180, 8265382, 1519627, 1131909, 4533228, 2986263, 3462201, 4335590, 2627208, 6735851, 8096210, 4570933, 6975828, 2921506, 1419126, 1569601, 2035044, 7483741, 1422990, 7101943, 5671902, 650053, 7523327, 2989818, 8085977, 1072866, 828869, 5349124, 7199677, 5610840, 7382470, 8274305, 5739300, 4831205, 6674946, 3172221, 6941721, 4090819, 7085995, 6788789, 6959676, 1266514, 4880610, 6519284, 2497064, 4069039, 57506, 424120, 2034627, 4721508, 3276253, 3333602, 1295970, 5326519, 5383215, 7844622, 2648763, 6123135, 7171575, 4333651, 5757909, 1695896, 4631190, 5323298, 1089598, 4444641, 1648454, 582379, 2187024, 5982511, 8081838, 5692872, 4155401, 1153155, 1891999, 2479480, 2447434, 6984201, 7020569, 5040173, 3498307, 4668123, 7955317, 1858422, 2242877, 4330036, 5598451, 619134, 4194558, 3457163, 7049150, 4126446, 2596861, 6739035, 6275499, 2246045, 5434687, 5082014, 1753108, 6662440, 3466016, 4046906, 8146228, 2381127, 3623159, 7294889, 3781551, 1131898, 1610141, 2451591, 8331127, 6830276, 5333359, 2912569, 1230990, 8211398, 7876720, 7989320, 7958421, 1217440, 6432883, 3610760, 3204817, 3543539, 2578529, 191116, 64162, 6819133, 4472850, 6456173, 5513519, 2607742, 1282957, 4270727, 5256677, 6925350, 190895, 8285930, 3443522, 4536021, 3176666, 5187269, 6461517, 2800942, 72766, 3340213, 3139813, 8315942, 4430567, 3773230, 642236, 7745444, 7771796, 4768529, 4077431, 4828125, 4407086, 6640068, 6794814, 2866283, 5088592, 6638268, 3019323, 7428823, 6818844, 3319139, 5112533, 7681728, 6167691, 2755139, 980196, 5025564, 912377, 469314, 4863994, 5149739], -[3492587, 3434810, 5096509, 1590334, 3517835, 355808, 1116128, 7788352, 6606156, 2528461, 1068520, 4221610, 1123249, 1677736, 5237078, 5139998, 3005667, 3045252, 2466892, 5083666, 6877238, 6432592, 3747700, 4339077, 236033, 3892287, 3451079, 978072, 3735139, 1926212, 7376597, 4888305, 6535037, 7722734, 5365667, 2879236, 4492930, 5591887, 3455302, 5876222, 5388001, 7269463, 3623475, 8266599, 4757887, 1426159, 5760484, 2668807, 8357905, 2609862, 4476220, 392667, 1223367, 3246401, 4461290, 174539, 4444834, 1938957, 1676196, 739664, 1422086, 1060154, 3290663, 1610786, 716341, 4798154, 5782520, 4636996, 1287807, 5798376, 1107742, 7389726, 2533621, 3675871, 1209088, 2928601, 1209488, 8267215, 6774659, 1870572, 7440298, 5417360, 6444943, 8054302, 1811037, 6976067, 8107107, 4185268, 7236733, 4159763, 4901497, 3450727, 5259935, 2251815, 2769807, 1249726, 3592364, 5293425, 142743, 3268866, 7954621, 890564, 7719278, 5449748, 4453862, 6355695, 8023023, 4724279, 4602066, 2662088, 3913877, 2647997, 3375067, 8286636, 327925, 3541517, 6410166, 1310960, 1414438, 3946606, 2233366, 6451924, 2281764, 3112229, 6771541, 6682234, 1852451, 5051240, 2507331, 4832135, 185259, 1011391, 6108667, 7220979, 5309646, 1893298, 23575, 2431644, 4225630, 7975982, 5831263, 3390478, 4291858, 1970821, 6705703, 1470020, 1271442, 3077013, 2923557, 6554078, 1524224, 5907516, 2757583, 7687937, 1731402, 2475920, 6836218, 5028399, 598519, 2464010, 7024629, 1231523, 727324, 3237579, 7650488, 308034, 4013088, 489219, 1002104, 6657016, 331289, 1007860, 6944278, 1068362, 71503, 1163413, 2415383, 178345, 5252245, 870744, 7593142, 2548158, 1781397, 4647937, 6873620, 3839623, 2990355, 996025, 5598024, 4689691, 3437572, 570736, 744469, 3234271, 4130001, 7764000, 3000672, 7414480, 1830553, 6279749, 6641042, 3839894, 4871149, 4665947, 5221856, 3126192, 8317005, 4481011, 5126373, 7203116, 5289698, 8149367, 205394, 7225484, 7277121, 1941395, 7146290, 981406, 4533184, 6396231, 159141, 7867938, 6433659, 5056865, 2425350, 8118428, 5038407, 2510313, 7578144, 929563, 7179666, 289833, 255980, 1957272, 5451452, 8136206, 4858880, 6375154, 533336, 4366274, 2035809, 5527408, 2324594, 1262669, 7779552, 5989519, 3332743, 6517535, 1622396, 2150680, 481132, 7683911, 1413725, 8339128, 877864, 7489539], -[5304873, 4632900, 2299246, 3405659, 7320134, 6805607, 466102, 3416434, 637094, 4925133, 1792465, 4583252, 3576770, 6090238, 6039997, 6820178, 5244509, 2569427, 6855268, 4675498, 2869787, 3405120, 8069147, 2988548, 2292857, 341277, 3480605, 7057299, 2297402, 2600184, 1965412, 3221495, 1592844, 6018160, 4573560, 7568869, 8269147, 7588831, 2123918, 7845098, 2552619, 4083901, 3807141, 5479612, 5819874, 7635398, 1088659, 526719, 1808886, 7186299, 3174161, 6919114, 1805044, 3798000, 6102057, 6785483, 6834855, 7318267, 2620122, 7932309, 5489847, 1153618, 2228819, 1172324, 3217243, 2379154, 922109, 954867, 6684237, 2349774, 3564187, 2109242, 2708038, 5219681, 7285586, 6272451, 2142888, 1742923, 4530044, 6734652, 5654207, 5328747, 788112, 5060062, 6137433, 448114, 1691492, 7854578, 4066717, 2244499, 6051572, 4197248, 390761, 4958463, 1086206, 5351554, 3262351, 6675036, 2090202, 4864040, 5867914, 4557962, 4376621, 7587079, 5411109, 2181817, 3397771, 7847432, 4223933, 3789154, 7323366, 7519365, 5941166, 744704, 956953, 4691335, 4098343, 4453794, 7104156, 4005597, 7182128, 2322251, 3477547, 3862896, 2688330, 24065, 2353014, 675525, 5199110, 5535515, 4878658, 437597, 1716118, 3281681, 5582870, 4090382, 6753597, 2923839, 5973502, 5159054, 4197937, 5119801, 1984329, 7236853, 1012436, 4228339, 8025256, 4502354, 2517673, 3219636, 5886237, 5916180, 6029970, 1813508, 4554602, 5419717, 4165194, 4300945, 4679217, 4028006, 5963979, 1376037, 8212231, 6424160, 2836729, 1113678, 4065422, 7814388, 944827, 5602718, 2547118, 5772901, 7533755, 323036, 4442824, 2301597, 7644398, 6417045, 2132060, 5321551, 4234937, 6906554, 1635864, 7388064, 5097572, 7094150, 538568, 7347475, 1729328, 5868808, 6543302, 8010900, 6496537, 5603516, 8306973, 3486371, 5658120, 4091052, 5925283, 2766596, 1753098, 4010597, 5897730, 2271632, 5065704, 2410695, 180491, 2402833, 665806, 282295, 1835801, 8030085, 2551766, 5686863, 4693637, 1652731, 3208836, 2625650, 5325690, 8047746, 131943, 34086, 1657802, 7730283, 5576227, 6118126, 5474507, 4975484, 3338047, 5784070, 7632751, 7291807, 6106427, 7340785, 7029574, 1284002, 5298303, 2334085, 6693735, 6989442, 3565156, 4399390, 6335593, 7937856, 1097849, 828829, 847313, 2297582, 4329111, 7664653, 4207787, 5962989, 541268, 2586556, 878354, 1916402]] - -rhoPrime: 426BF2D193968547C76767C38B01FF4C7425BCE393D3AB9837C6EA5DBB0EBECFF4240FBBF3445DB2B1100B7544944E96C6DE50B91D6D9275EFE585A3EFF12B04 -y: [[143810, 123640, 293464, -417597, 162667, 130587, -125858, 454704, 117407, -351414, -443185, 24595, 281098, 332541, -422883, -320096, 55485, -394129, -420057, 405393, 400218, 387810, -356510, 310112, -54216, 151872, 519707, -273847, 441489, -388012, 29308, 398280, 380783, -69999, 243004, -349780, 12511, -49301, -255749, -79257, 259685, -104213, 162456, -133635, 11592, 182695, 470519, -379762, -499828, 110141, -363359, -405216, -134250, -324885, -414281, 59403, 38551, -430782, -447035, -190705, 159859, 284510, -8624, 286443, -309660, -375181, 284292, -492795, -10870, -353905, -161234, -375798, 517815, -428872, -445997, 109504, -464489, 482694, -199832, 22890, -169909, 23524, -22352, 69427, 389005, 249419, -40417, 147070, 107700, -498596, 136439, 518192, 92206, -453039, 74777, -108669, 445936, -425518, 113190, 309537, -424768, -191671, -344710, 296007, 441413, 103021, -28866, -296167, 412061, -377633, -2072, -37188, 516366, -381799, 150128, 439378, -455409, 500944, -369023, -208198, 18835, -454365, -134092, -109582, 198239, 383054, -111120, -352085, -133036, -384325, 433850, -411801, -365017, 456365, -513773, 268731, 6919, -98040, -486131, -52041, -152612, -410880, -350203, -225771, -37508, 60347, -126602, -1666, -219581, 189523, -112078, 451542, -522420, 15694, -28827, 297114, -508305, -374711, -43552, 169605, -19913, 473773, -229303, -55733, 306800, 418163, -114474, 136791, -181826, -524250, 205472, -513161, -478307, -190169, -225067, -473284, 169104, -193794, 228607, 63966, -278999, -126863, -209669, -326841, -350715, -329880, -505037, 519013, -187178, 390980, -391985, 406169, -423722, -218317, -33201, 443323, 393362, -265971, -293940, 363255, 210517, 303156, 441749, 396335, 215232, 164832, 72878, 363567, -336681, 402839, 148222, -316753, 306618, -466559, -27255, -496864, -45660, -197394, 260735, -205247, -349115, 40451, 443221, 64869, 469314, 441143, -481048, 291788, -343808, 226726, -477791, -106488, 440071, 122128, -428444, 20947, -358820, -409323, 344582, -349917, -268674, -168138, 51167, -121857, 196568, 293196, 448319, 379849, -517222, 491399, -239937, -418099, 150908, -168912, 518926, -427774], -[-321069, -326077, 478479, 190613, 96855, 440687, 411255, -242139, 306728, 161830, -172463, 277448, -842, -251970, -74016, -334819, 293700, -141163, -328948, -259848, 40022, 91633, -216281, -260190, 355601, -70258, 14066, 280732, -454074, -36617, 399189, -466513, -99537, 200252, 458878, 30003, 162644, -65978, -6116, -149861, 460376, -303281, 441363, 292260, 122053, 488687, -423874, 96799, -321218, 300364, -251995, 277775, 324181, 426098, 448921, -463641, -475041, 147033, 303280, -391735, 97575, 66749, -338124, -160967, -523476, 264042, 198035, 419624, -161134, -359179, 234477, -231429, 488098, 28132, 21724, -285108, -317166, 299509, -284572, -45758, -381871, 245167, -178956, 44509, -28034, -450511, 55717, -77158, -369056, -438860, -166468, 171030, -312474, -489965, -102294, -240830, 163401, -461713, 230586, 358213, -189741, -297554, -501264, 515308, -291624, 499136, 2347, -94354, -438759, 191369, -167424, -511444, -381544, -150296, 271669, -226781, -385963, -212481, -501533, -384457, -64755, 360360, -513289, 124833, 275888, -224637, 333863, -260164, 336857, 476698, -134172, 120736, 122309, 314256, -75328, 437461, -520253, -354996, -346086, 7324, -94229, 22319, 33716, -295518, -342321, 65876, 225034, 52701, 316982, -463212, 241497, -353454, 258279, -89827, 262195, 259575, -476200, -253947, -337824, 309613, -238157, 154308, -391172, -359271, -280217, 459488, 44344, -347845, 209884, -388816, -143552, -249604, 250020, -243883, 490756, 201421, -34895, -495058, -54803, 428106, 126976, 189035, -457855, 344735, -146993, 173358, -231139, -22864, 126559, 331842, -361319, 505916, 25849, 268425, -179748, 226301, -281133, -470550, -363151, -343, 6683, 107972, -282603, -455304, 124563, 148798, -341013, 484596, 398464, 446631, -185960, 53877, 465116, -78342, -164484, -418888, 127084, -371631, -52543, 63399, -299334, 227884, 373350, 79887, -43217, 109771, -307561, 287312, -129800, 237107, -149052, 482157, -416605, -901, -9833, 496811, -488452, 307745, 204193, -220602, -264008, 210733, -256666, 278582, -203321, 244972, -350578, -406711, -230555, 90675, -309502, 112450, 148360, 301540, -89544, 513847], -[134788, -275508, 229083, -466357, -491032, -258321, 306775, 85980, -225820, -289652, -312231, 155232, -394790, 481788, -140402, -26739, -321845, -15373, -343480, 268410, 477062, -405004, 514116, 475127, -517492, 332270, -49406, 11071, -109119, 167134, 291280, 93826, -486666, 197906, -140700, 427961, 278502, -256988, -81090, 237088, 30729, 122237, 366724, 433505, 269468, -429723, 101561, -462275, 473736, 308548, 448190, 219677, 14298, 338350, -256577, -53290, 403749, 222115, 451086, 65255, 443139, 65674, -416411, -444340, -366054, 53436, 104662, -320389, -211819, -303082, 499378, -456011, 476675, -205606, -65142, 375678, 349200, 368886, 398465, -458993, -317167, 343682, -469030, -386367, -147869, -482699, 309247, -4985, 366158, 271775, -355814, 429361, 183619, 482793, -15201, -505283, -411391, -437173, 43301, -252206, 344485, -354241, 246488, -375010, 291073, -120083, -352485, -54658, -165575, -248976, 342733, 82348, -274728, 162823, 111170, -54661, 345851, -52094, 293405, 163501, 85436, 170219, 429436, -387899, -524238, 233115, 346506, 212499, -372709, 499346, -248402, -51589, -413024, -246921, 50536, -238952, 381720, 297839, 389042, 267192, -443827, 230698, -43783, 266560, -442247, -283300, 133754, 241312, -269951, -512641, 410361, 221444, 76159, -107723, 155413, -85212, 237217, -50319, -146039, 459262, 287839, -151958, -218590, -142232, -483620, 306494, 165912, -224166, -308655, -1892, 132350, 130889, 105729, -120327, -154361, 257847, -317335, -516068, 405679, -449629, -71025, 122966, 195731, 18297, -441019, -321710, 310958, 329700, -265278, -132146, 44462, -314637, -65864, -87739, 73407, -389958, -504070, 131810, 426753, 252529, -302441, -235213, -455901, 103576, -43339, 284913, -220938, 367938, -409704, 57083, -111410, -499998, -299214, -38809, 6054, -53691, 258606, -288381, -207975, 96086, -288646, 359434, 314544, -208342, -236322, -490289, -389749, -214252, 356320, -209439, -140098, -138648, -263509, -227043, -71246, -63514, -180773, 146430, -179542, 125443, -398713, -508150, -20647, 521367, 66222, 342208, 176500, -176229, 475076, 342261, -76540, -174769, -99106, 335606, -70531, 263830], -[105084, 443910, -336307, -363732, -472944, -413077, 232065, -387908, 372505, -217659, 13520, 147668, -376021, 96113, 10472, -111190, -77391, -403916, 464756, -391804, -428088, -52129, -487538, -54461, -142409, -477947, -103250, 29780, -261761, 260422, -474460, 112110, -51646, -360415, -67528, -115982, -211417, -377299, -434437, -93567, 485446, 288996, -199408, 291721, 353085, 211524, -404090, 55955, 267451, 205655, -520588, -461635, 504153, 358621, 308647, 291091, -227961, 327213, -393861, 116378, -114786, -156053, -6142, -64473, -136391, -229682, 485891, 459333, -494684, -274463, -307968, 313289, 427917, -189491, 514829, 181537, -502782, 22630, 286244, -292396, -10147, -64843, 322460, 196891, -117696, 33494, -521687, 473803, 189571, -295414, 477702, 509578, -461783, -499182, -162313, -415614, -509561, -404225, 458575, -4831, -108704, 31092, -224901, 318087, -295845, 339693, 43355, -2618, 79988, -284270, 208881, -334301, 145468, -125660, 238740, 479006, -86896, -400290, 453187, -461181, 518998, 104073, -24457, -357716, -219049, -323717, 454387, -183088, -307935, 219622, 269073, -260548, -77685, -282207, 246924, -110172, 522510, -197, 300763, 33173, 358678, -255370, -409624, -321530, 80369, -98740, 267746, 115501, -294561, -127980, 420656, -53451, -197870, -273082, -264622, -64264, -139017, 136862, -301632, -346671, -212888, 14262, 193116, 9038, -389026, 349718, -88651, -202534, -279131, -45240, -95338, 142317, -325928, 389720, 19304, 379373, -258832, -318029, 270362, 159718, 202231, 385894, -444708, -477632, -436371, 318761, -27107, -78403, -352766, 326168, 162148, 508200, 103548, -156814, -463063, -421262, -326927, 138404, 465619, 185879, -70918, 162097, 252094, -473888, -66987, -509214, -300271, -248813, 307501, 268696, -74995, 32474, -346580, 185234, -21214, 513138, -144302, 190049, 47161, 217268, -35099, -388394, -220280, -505047, 277155, -221030, -57612, 269809, -246395, 222871, 124446, 303441, -17771, -249463, -495460, 356159, -360569, -262655, -483658, 110536, -33061, -17952, 318637, 300939, -342440, 95187, -371739, 283533, 249856, -277106, -500881, 11514, -467857, 182535, 343425, 509671], -[-100251, -197048, -399141, 140584, -248501, -43489, 169335, -120893, 6955, -6051, 396766, 323459, -145488, 140925, 1551, -353587, -23247, 381443, 211085, -215691, -313120, -223490, 251987, -341621, -252565, -271672, -516881, 213142, -293221, -146078, -259820, 476934, 469656, -260532, -128137, 242776, 455397, -53182, 315527, 500149, 238257, 362223, -236380, 397360, -259955, 361804, 215359, 117248, 326190, 121256, 329876, 422701, -282104, 349670, -172473, 521470, -462763, -158516, -362021, 329237, 418901, 273613, 222834, -434929, -394672, 500306, 341198, -375099, -338394, -175618, 4351, 251494, -330727, -47920, -171615, 80168, -267427, 336584, 486696, -107528, -421011, 275434, -243605, 122938, -34152, 209218, 325984, -198607, -473439, -488311, -184770, -70349, 401496, -403389, -370601, 352675, 484916, -261158, 9217, -193874, -323167, -45230, -497252, -45823, -380585, 471688, 67207, -100629, -441866, 264934, 346766, -339249, 273484, 445513, -499769, 232598, -443116, 122407, 206317, 497544, -308985, 254605, -297628, -78685, -391184, 173417, -395495, -362769, -200729, -181987, 2366, 138913, 22800, 382462, -226570, 74160, 373818, 429910, -41392, -341573, -132017, -116121, 306699, -192072, -378108, -311366, -523057, 476847, 184572, 120352, -410325, 316222, 101432, -135207, 52416, 39598, 478117, -310861, -465229, -216909, -37757, -108528, -267949, 25116, 489480, -156932, -518450, -132963, -520558, 113283, 103869, 483631, 103631, -376488, 201831, 442783, 470327, -285160, -284154, -447858, -12588, -119755, -102407, -251841, 338071, 370260, -377812, 202988, -274138, -516916, -30222, -25404, 329319, -239747, 374507, -122349, -337765, -172116, -33635, 389537, 75301, -122609, -189681, -439233, 323037, -295011, 101573, -117467, 126072, -184995, -498740, -95770, 124093, -352595, 382400, -369537, 170048, -154608, 144009, 224040, 515413, 213456, -336154, -127874, -1103, -478824, -28133, 300400, -254614, 139978, -465591, 348758, -66486, -95479, 151571, 17574, 128718, -218274, 283251, -153338, 234094, -391161, 256039, 91777, -393708, 505136, 433880, 363672, 236662, 266960, -511178, 464056, -87257, -430688, 122916, 351204]] -NTT(y): [[6647644, 3736536, 335764, 2137570, 2150431, 1873619, 5642660, 6512628, 6274882, 6704330, 1276914, 2654339, 5909824, 2882865, 3444360, 4761229, 7644160, 5673490, 4958112, 8163347, 6087001, 4455475, 2067215, 2988452, 1421840, 950378, 8288363, 4083514, 3632303, 2342387, 871251, 6101202, 5514150, 5568514, 3434462, 3339661, 6109743, 196298, 249549, 2116065, 8348724, 2322536, 1031772, 5060403, 2258042, 6532900, 5707188, 8199104, 7418648, 3032440, 681377, 7243063, 2268159, 7361912, 1703976, 7013230, 5370613, 1642650, 4770815, 7699101, 5405424, 4627585, 2292508, 4730763, 7967688, 7953819, 2477572, 5489843, 2113968, 2907325, 1144712, 4250388, 2318976, 3400101, 7098749, 2677751, 7734096, 482301, 4841160, 2716998, 6076729, 3235390, 2462679, 7769991, 2955221, 6956126, 3361302, 6782000, 8293161, 1971873, 6431832, 1291943, 6266730, 4390792, 1672228, 2142732, 3767782, 6090002, 7059823, 1113119, 3597009, 495379, 7457818, 143025, 2685266, 5999258, 594597, 853424, 3106543, 1973316, 2884557, 6458706, 7198978, 1160916, 6666186, 1353041, 3687675, 6642418, 319220, 1882809, 3740165, 4390773, 6881805, 6209002, 7446148, 3024387, 2368483, 2064656, 2859966, 5138226, 580742, 4061336, 3543054, 2901161, 1656665, 8327452, 5665897, 4417713, 2641378, 7186625, 4294509, 765361, 2552041, 2438431, 5399693, 3378497, 1638900, 1498735, 5675658, 339779, 6685023, 6024451, 4650832, 2645334, 1428536, 1600118, 1865804, 254589, 4615875, 4220444, 5648860, 3930921, 2055773, 7025359, 3161027, 6898753, 76084, 1046966, 1497015, 8282104, 945879, 930095, 6558266, 4975311, 2774339, 27147, 7981224, 3025792, 1762031, 6619717, 2144690, 6377124, 722206, 7635418, 7824359, 4419755, 7137018, 5251118, 230764, 1616670, 1108975, 6993432, 1218961, 5580547, 6565558, 1055682, 299272, 6657807, 6283095, 7918535, 950800, 6802273, 857245, 4841984, 1726801, 7496980, 2539323, 6596945, 3565352, 7027386, 2190004, 7372490, 7468674, 1692266, 3134102, 3853672, 7014636, 1728704, 4179764, 372338, 6577308, 3115736, 5163700, 8311905, 1425820, 7408293, 124144, 3995855, 1817358, 6780405, 6739484, 1927581, 7865613, 2347131, 1747023, 4409445, 1451139, 6277596, 1532860, 6540080, 3603924, 998824, 5476998, 2746594, 8248063, 2055457, 2641432, 3708760, 3884622, 4596541, 3089267, 3961020, 5325775, 7644350, 860713, 6178032], -[4542528, 8160725, 3765878, 2286588, 4474350, 8253963, 4169791, 2737175, 6209736, 5941507, 4776690, 3740617, 1897694, 6000633, 100469, 1705025, 2151690, 3146984, 2965526, 900959, 7868566, 2586654, 1998007, 8345369, 1599371, 2919031, 2651818, 2252244, 3415109, 572479, 7260274, 6648506, 661629, 7514366, 6572509, 7680820, 2245879, 4851576, 6136099, 5265523, 6893611, 637768, 3046882, 4041692, 7003973, 33364, 1053635, 1895353, 1497549, 2001037, 4543964, 2194666, 7890026, 7930137, 3706801, 6190015, 4202659, 3430133, 5271182, 7226543, 7980186, 1124815, 2216412, 2868667, 1091659, 5316493, 7632496, 1301403, 6888953, 8197884, 4890659, 2579775, 523780, 5328176, 3205255, 6925944, 2118068, 7285816, 7414385, 1657846, 7397485, 1773008, 4344052, 2229636, 5832615, 2324852, 5987191, 6653059, 2616796, 3836776, 1632306, 6404722, 2346042, 2839332, 2570860, 5881570, 8296043, 7131423, 5116890, 4681899, 5017151, 3279137, 7864539, 8088722, 3922814, 7509611, 4592404, 3548843, 353249, 1548926, 3537184, 1027643, 1002965, 4334978, 6527500, 6813212, 7128567, 8129338, 1100517, 6422873, 909690, 5452581, 5977891, 1638506, 7743850, 901172, 7751199, 4498272, 822792, 3179953, 5061479, 3490262, 3096015, 2664310, 2172062, 4725284, 1185888, 3774879, 1278333, 6303642, 3637886, 6981372, 4840557, 149496, 5755037, 654215, 7829263, 2850106, 2538855, 3401286, 3467638, 1366955, 2984858, 5260930, 7944596, 7642552, 7790668, 2388996, 4369273, 3707093, 7916184, 4187905, 192789, 971160, 1203935, 3043795, 4903920, 6404874, 1532994, 2899849, 7282738, 6468051, 3865020, 847164, 698133, 3436366, 7666393, 135771, 1776030, 1059700, 7302786, 118126, 5181349, 3603005, 5539933, 324544, 684881, 7743179, 7295883, 6912702, 409471, 3245105, 6113066, 91850, 6106742, 3599814, 1119575, 8145408, 7492085, 6730203, 1152035, 2666243, 2285435, 2574812, 3747282, 2129432, 2825793, 5244407, 3644502, 2943560, 997154, 7637690, 8082476, 4091675, 7931259, 2338196, 5282976, 5479386, 5723000, 2179939, 6552437, 5816947, 7939486, 6034277, 2791567, 1748964, 7957120, 505518, 6542313, 666523, 3139262, 7647295, 3074677, 1281636, 5347387, 7628596, 3606520, 2111698, 3786747, 7552849, 438711, 180128, 7064223, 4809077, 1982406, 2701510, 7005882, 4881982, 6636159, 5746176, 4221220, 809520, 6644759, 8133026, 2970399, 2706297], -[1983762, 3468525, 4074895, 2623883, 501889, 1526860, 3676148, 8075100, 1026694, 4037145, 6151506, 4189919, 4958148, 4200951, 3285564, 2103979, 7654297, 7855638, 4530778, 7741169, 2139143, 8320971, 3246931, 749652, 3988601, 487285, 403451, 7562654, 1437392, 3617613, 689148, 3134085, 4865320, 4162608, 1237304, 1535573, 6759847, 589844, 5439681, 6569535, 2505997, 3614415, 1593272, 5458736, 3284031, 2542034, 7067564, 6443098, 6678661, 3406216, 4169417, 8320858, 4639882, 262447, 6267757, 5271968, 8291063, 2879878, 5017783, 4716315, 2842308, 7789692, 5665891, 1368569, 5974573, 1050176, 1971699, 291689, 6528686, 676244, 624454, 6016026, 3287294, 1778348, 156058, 6813041, 5968930, 4475468, 3871853, 8284688, 414759, 5336928, 4544972, 2942199, 5989404, 2720298, 5734200, 3703472, 7171039, 5213756, 8067463, 3333312, 8152085, 6612425, 7371696, 1358317, 8264023, 2727283, 3868649, 6425905, 424920, 3952841, 695862, 7027741, 6565451, 7117760, 7065280, 1036136, 8161346, 6350133, 6127616, 5366036, 3228937, 474542, 700758, 3462845, 2603516, 6103555, 2067439, 6767028, 746112, 6622087, 7737338, 4124924, 958741, 6618648, 2077795, 3977224, 4188396, 4739722, 4268727, 5879584, 7749935, 2648738, 7892146, 4260421, 1807258, 6689826, 3375585, 660411, 3183625, 6281524, 7136127, 3190605, 5091751, 2427928, 381451, 3233175, 5459922, 3793609, 6569024, 5889130, 4190037, 1130915, 7852795, 3425508, 6861033, 1655096, 2598951, 3109887, 2235413, 3900478, 4405155, 6692971, 1677396, 285624, 5227561, 7349422, 7056235, 1040706, 6502638, 234303, 380383, 8176405, 3542711, 8005432, 4712424, 6462678, 7579477, 4014973, 4154059, 966496, 2142475, 6925836, 3424030, 1465169, 488381, 3677635, 696485, 2540915, 4670389, 7067093, 6727648, 5486985, 5697518, 7605710, 3598366, 2924764, 1730035, 2686113, 6541076, 6184164, 4391611, 1805135, 313705, 6161372, 1122576, 8193154, 1006871, 4993559, 7853212, 8233864, 3375358, 7330317, 4289960, 5757814, 8271863, 2035361, 4501928, 2989040, 747486, 5931390, 1310260, 6358297, 4729112, 6307753, 5484609, 1024159, 5661796, 3053583, 2375404, 826233, 5339435, 361749, 83179, 589614, 6827108, 189089, 3851646, 7393238, 2072648, 5284568, 4375003, 3689298, 3848129, 3302209, 2914409, 826678, 4321060, 2185568, 3571433, 1100697, 260778, 3525419, 7909026, 5565907], -[8048190, 68021, 5370941, 5846834, 5841984, 2365888, 6445319, 5052494, 1771742, 1276962, 3195414, 7458010, 4851066, 1470042, 6402258, 563278, 6391186, 1962130, 4396625, 2093018, 5569984, 1364861, 546743, 4467413, 4749534, 1987558, 7138435, 6721397, 8349878, 144379, 6552624, 6685207, 1269148, 5440603, 5242593, 188996, 7053941, 6884352, 2869260, 6429968, 2828836, 3909188, 7490475, 7050197, 6713074, 2384795, 3098938, 7080621, 5350016, 2073237, 5822440, 4833581, 3538733, 2384197, 6436895, 5753898, 5603397, 7193553, 1323402, 4434899, 6910958, 7349875, 8286653, 2264136, 2159551, 7049833, 563491, 5322833, 8276525, 7964494, 5626836, 3781339, 2870873, 6102346, 2325583, 8049873, 2737294, 6320917, 4505967, 2819524, 4805474, 2104945, 8258263, 6346063, 5949021, 7570263, 2904307, 241645, 2593019, 6841124, 5835090, 5861241, 5189521, 2339646, 151778, 7153875, 3814324, 7512499, 1492021, 8073055, 1940487, 2358618, 6470779, 6680092, 541041, 4838726, 8008313, 4888375, 6160089, 5042068, 176059, 6575678, 1439877, 4170782, 5575449, 7276733, 6598030, 6165923, 2422153, 3908602, 8271847, 6282428, 8117471, 1704849, 4259787, 7887122, 8014906, 2354487, 2854000, 930303, 5088064, 7576112, 3486561, 6223909, 3269611, 7800997, 3164579, 7845214, 4249481, 114871, 1374511, 7952475, 4921128, 3526690, 8306779, 3136965, 5921336, 3235145, 701593, 2534676, 5859745, 5001261, 1873122, 3930617, 7349568, 72871, 2443080, 727198, 8214213, 360561, 4280959, 4233957, 4252803, 3988864, 5406669, 6099986, 4555504, 8073746, 3377281, 8052522, 3047912, 5283352, 6323350, 3496080, 7010447, 7773357, 7308321, 1844496, 294506, 3055804, 4162153, 7711148, 4470366, 5048033, 3366332, 5966133, 294985, 2632573, 1831722, 499008, 1192035, 6660934, 6927290, 3723759, 7994598, 7446102, 3201296, 3308584, 5169902, 7518646, 3852198, 4622163, 5348834, 2276024, 3307425, 6218651, 6764656, 5844797, 3868605, 45020, 947985, 552028, 1491435, 5132855, 3212176, 6035816, 5919751, 1343185, 3188354, 4603233, 2585764, 2865343, 7122668, 6270933, 1059199, 8306104, 2926550, 7103625, 1793279, 7372984, 5665330, 5785405, 6104513, 4235884, 2361352, 1522858, 3800481, 3730149, 700382, 212339, 7906900, 6096411, 509082, 2503278, 1579323, 475525, 7478535, 5891178, 2691536, 5053434, 1123314, 3859810, 4634897, 4811317, 432282, 4747148], -[658397, 6875506, 192705, 6382226, 7722261, 8282313, 4607845, 3500461, 2531245, 2097569, 4335520, 4797631, 5455576, 8250533, 7102917, 1965533, 594004, 6656324, 5635228, 7381175, 4404732, 7310491, 1811496, 1956396, 4603034, 32226, 4773985, 7054348, 5319598, 810452, 5454530, 5057900, 6482017, 2495714, 5010033, 3755837, 4053231, 242949, 4156322, 983049, 2203988, 3660789, 2052964, 3988402, 5259861, 5933290, 2696710, 638651, 7631942, 2067046, 4702453, 2582864, 656735, 8339013, 3011483, 2734553, 4197057, 1496888, 1681443, 4997174, 1679313, 3205814, 7839642, 2847130, 3722522, 391223, 2859220, 3973303, 3907740, 6967824, 1519505, 594647, 7607559, 5401449, 4706574, 6704546, 6352874, 7190426, 2479233, 2719985, 4824234, 5112891, 5968983, 2585888, 5565965, 4977616, 8217851, 8377647, 3837027, 2550127, 8172942, 1161637, 7064868, 6557734, 5198356, 1551174, 2908101, 7052291, 489672, 5305025, 6992308, 369889, 4421323, 1573266, 7491644, 36599, 5499931, 5887550, 4325155, 3951169, 486464, 2359017, 5502082, 7471623, 771288, 7652279, 5770370, 5170016, 3956394, 4629286, 5661638, 5436771, 8192301, 7754195, 2577364, 632217, 2980661, 6518584, 5824295, 785873, 5123691, 3649848, 2078006, 7923119, 7790733, 2178278, 8223447, 6113891, 837389, 7948699, 8121968, 6737134, 5326341, 4916884, 49119, 1974068, 6029451, 770353, 5239484, 2737375, 93418, 766801, 2130942, 5079976, 1862557, 4350723, 1614932, 8236270, 5394401, 5680707, 7946919, 1086013, 1561597, 2950282, 3476870, 460136, 3839514, 2263795, 4516599, 2340804, 6093115, 4725345, 7438269, 313510, 4161280, 4227325, 5950029, 2830910, 7964857, 7130316, 3946871, 2194079, 2720004, 3559006, 5671148, 2334942, 7175689, 1612249, 3559015, 124304, 4594610, 3752837, 8142756, 138382, 5869190, 3237136, 7030705, 7906004, 7880232, 2414110, 836606, 4112530, 3291079, 759493, 6402483, 5323344, 5446099, 3219357, 4916824, 8238366, 411227, 7150123, 6721039, 4366983, 1095844, 5426516, 1533465, 4857477, 451193, 5230177, 7850733, 2952537, 645393, 4766513, 4116616, 2838455, 8143626, 3698772, 4649491, 7783759, 1038895, 3072, 8156282, 2965986, 7404197, 7904615, 5618961, 1973433, 7191053, 7327233, 3890208, 7825997, 6224119, 993940, 7460564, 2187662, 43902, 7790633, 3379652, 5456179, 6347256, 8133601, 598532, 3739093, 1493550, 266986]] -aHat * NTT(y): [[3030962, 8163160, 7615388, 8261104, 7974524, 2409962, 3629073, 6437734, 7307917, 3213063, 2293346, 70396, 3137848, 5209543, 5325091, 7138614, 4939934, 3670474, 4202986, 4662214, 4721740, 4445580, 7864969, 1076743, 7686369, 4501100, 5799899, 293292, 1053624, 3103024, 1519801, 3898029, 7699386, 7663597, 4275215, 2777998, 6140433, 6105163, 4925372, 6572594, 1171262, 8092114, 7661899, 7707877, 7726869, 1333347, 1420525, 7368945, 1176052, 3218251, 6099701, 2864543, 5954696, 5251601, 6659643, 2847757, 3303038, 7200575, 7801771, 1346663, 6016570, 2675096, 8344045, 95790, 5374594, 3898271, 6672564, 2135665, 5168766, 46261, 1464361, 6019049, 4844021, 1431199, 115585, 7286950, 4924150, 3601252, 1537190, 14109, 7308161, 2996320, 324302, 8370075, 7475094, 7007850, 843492, 553125, 4840607, 6043487, 3862902, 7328126, 6500889, 5157829, 5447907, 4424908, 7091305, 5745548, 1721312, 403708, 5954378, 7107480, 3111264, 153283, 3560733, 3239737, 5138969, 2586553, 6120107, 5223098, 6493454, 1946788, 7462675, 1668162, 1343275, 1266822, 2607493, 2408477, 1971912, 4269453, 6059056, 4054487, 4037053, 8076535, 6829055, 1958033, 1438537, 1575748, 97535, 7619686, 5977397, 6523685, 4285621, 4151438, 5383397, 4661993, 1210540, 800115, 5344539, 6065637, 545398, 4132071, 270952, 6863740, 7939381, 6112945, 71128, 6133789, 7777995, 5044893, 964387, 3693579, 1465636, 1426737, 834189, 6281488, 995728, 6017032, 4533737, 2076225, 264512, 2082531, 2942921, 621766, 6260115, 3772835, 4403858, 8134407, 304345, 6818090, 4527925, 625552, 5990065, 7190845, 1272898, 82753, 7454674, 6536513, 4526862, 4919559, 4764103, 3237803, 1812896, 7151103, 461700, 8031408, 3867252, 4110719, 7070780, 7525441, 1498561, 4610857, 5707009, 7654727, 2359121, 3844323, 645428, 1959214, 6002443, 2722841, 7557877, 6155879, 3498826, 1491714, 5198278, 5412084, 1910113, 4021798, 277796, 3809033, 4456542, 5093347, 2434636, 6802808, 5587053, 1078506, 2306715, 3588354, 2520850, 7198826, 6155522, 4981982, 1786696, 527385, 8246570, 3678366, 3591608, 1351781, 6812123, 5218997, 5900160, 7101052, 2474073, 1927984, 5141014, 5929704, 6892206, 2086828, 2734038, 931257, 5620262, 3542791, 5061767, 7220507, 3257745, 2784415, 5464079, 7273449, 5258527, 8237054, 7243169, 2655642, 8060812, 7438108, 6524376, 5487731], -[2283115, 2242425, 7717285, 1739848, 7631041, 1255290, 6551101, 6606948, 1222761, 7355026, 3906252, 7517176, 2262854, 3070470, 4517247, 392023, 23334, 6654188, 6997159, 2412888, 6152372, 6346775, 5526210, 8146769, 3212430, 6075101, 4402551, 7092918, 2881113, 6713862, 2415568, 2479780, 2039773, 1079634, 1827815, 111623, 2728106, 3266834, 5338865, 3052624, 7126541, 4154709, 8165321, 1911126, 2124864, 359287, 953281, 3599221, 1547224, 2005633, 925473, 5790045, 6768232, 2073172, 2138083, 7748239, 1203389, 3677135, 1338126, 5502778, 3992231, 7352771, 7724192, 7613048, 3977688, 7743138, 4280930, 4344774, 3501967, 4138846, 6588358, 1088062, 5402613, 4942348, 3348838, 1035803, 6294089, 5030750, 556568, 6004995, 3299244, 7135256, 2112285, 6820293, 8292545, 5874770, 6828581, 2096171, 527515, 1569079, 1743184, 7428129, 275538, 4493114, 1231703, 631658, 460846, 5151438, 8236504, 3257412, 5087941, 4528498, 1768057, 5098065, 7049578, 6846941, 7756584, 6329001, 3584897, 5123111, 6711221, 4817965, 443700, 1402960, 153110, 5582268, 5105838, 2810925, 7930654, 3245224, 4033440, 2692211, 4837942, 5902983, 5834802, 3815181, 3942413, 998936, 7089893, 1724397, 7307588, 1465588, 2204951, 5659262, 4732040, 8065579, 6496795, 7128070, 5871199, 7964831, 6500212, 900136, 4852965, 869934, 6837036, 4902021, 5489717, 6075177, 469366, 5774769, 611437, 2010937, 6198207, 4858872, 7613258, 4823001, 7483359, 7572830, 4931521, 2632040, 5415839, 4531590, 5402586, 4378224, 5417345, 4948355, 7946674, 4086802, 3972333, 1002874, 3950127, 2261108, 1283152, 2742628, 4977451, 1989561, 7434286, 1031567, 5110542, 5341270, 8046931, 7417845, 1163381, 444576, 1921903, 3685436, 4393622, 6857008, 5336355, 4475807, 5234626, 8169715, 6065054, 3756516, 6380649, 1062519, 5293422, 8037003, 4234448, 5257707, 3817669, 2204217, 3966050, 7342516, 2669286, 7541465, 1750968, 105914, 3507487, 4144134, 8296572, 1005515, 3521582, 98842, 6665436, 5919734, 6122568, 7470943, 7960274, 5398434, 6128852, 387833, 5648740, 6588328, 7458310, 577489, 5473254, 111864, 1796143, 6308161, 6303952, 3807229, 476372, 2177983, 2946120, 6537697, 3266146, 7953254, 1249328, 3757003, 2439580, 3311980, 3889910, 2811318, 4041100, 3883550, 4905475, 5432031, 3951425, 3547143, 5726106, 8363061, 2363045, 401235, 4490175, 2815662], -[6038520, 6549261, 7274156, 663731, 8329793, 5983116, 5175477, 7660958, 4708220, 3624908, 8299198, 7618214, 2805475, 6011274, 5072841, 7593957, 6353852, 2342824, 3882638, 6338748, 3266859, 2219384, 5989675, 5552964, 969863, 213522, 4688543, 301382, 7884137, 2239714, 6539163, 7965048, 1569881, 3828853, 4471499, 354644, 8091253, 1473475, 545987, 2129136, 3072245, 1794811, 3206483, 656616, 4809443, 1832682, 1165041, 5307903, 7530955, 8003082, 2530098, 6499550, 577959, 250880, 5914505, 3699777, 4066642, 2504623, 5390222, 4284947, 2101270, 2021702, 7322621, 1913924, 4613745, 868774, 380590, 9642, 8012710, 6048020, 2336229, 3953477, 2699748, 539956, 7813996, 3519677, 5651965, 2213153, 7672692, 3248266, 8115624, 1662674, 7872227, 2490906, 7801722, 5137464, 5275851, 7524375, 7290659, 927065, 1753407, 1596912, 5433332, 1618723, 7403553, 2143183, 169142, 7127496, 1228856, 3407087, 2543716, 5582550, 6859547, 522315, 1439284, 3345620, 6894248, 3952220, 715740, 1259, 8167061, 3110708, 1641560, 8151396, 3783414, 7233114, 7023962, 4429087, 3736045, 4118876, 6267967, 3731681, 3264627, 5271397, 1771122, 5670915, 3721598, 234072, 5522185, 565542, 233780, 7405065, 3305330, 3093775, 314617, 5993008, 3911238, 7611626, 4920649, 7629631, 4294498, 711449, 2171707, 1331618, 5968957, 4643167, 7184308, 5301969, 6011939, 2978012, 1989340, 2612444, 3512674, 5504276, 7530859, 2371685, 3106934, 7206819, 4117724, 6474355, 7442576, 4697391, 1070627, 2321212, 712359, 6251932, 4027985, 3704496, 7729905, 4411514, 6272478, 467794, 5671377, 8244588, 4326979, 2974618, 6748479, 8056830, 5483421, 6283614, 842955, 7088187, 2119738, 2682123, 5505226, 2767573, 3696751, 2569995, 79034, 3396438, 1416979, 6442508, 6110568, 165520, 3621268, 763770, 4943122, 3809936, 632685, 6243151, 3979092, 2716172, 3111816, 1588436, 3949294, 7637536, 1013743, 3114598, 3426140, 6554634, 8198013, 1427735, 734953, 1747495, 1146283, 2453244, 5225233, 2405080, 219070, 5500844, 4974549, 6843424, 5898186, 7547882, 8262076, 3556353, 6656424, 6315649, 8146509, 5903564, 6757747, 2740238, 6934013, 4547277, 7793994, 4857209, 7840482, 5302703, 6388141, 5674142, 6183398, 2094785, 4908307, 7460408, 2699770, 7758191, 5030519, 5530444, 3729840, 4377291, 4869679, 4391888, 6381782, 8303425, 2180012, 6931496], -[5578188, 3555640, 6998607, 530305, 4289043, 965980, 5701026, 4696390, 5655315, 6253867, 646017, 5890928, 3440616, 6235954, 4894939, 960093, 3802923, 670783, 2307471, 4322870, 4937296, 593064, 3585771, 8189482, 3164500, 675361, 5953791, 957055, 6821369, 1651646, 753178, 77625, 1852149, 2895876, 7624815, 8126568, 8315427, 5522307, 7236443, 7509982, 317607, 1179043, 7052382, 4917032, 7562400, 6711575, 5104127, 1057663, 5624003, 610261, 6761773, 2112370, 4953457, 4670379, 5654974, 7402890, 4226249, 7152637, 7145453, 3309509, 22056, 3801037, 497536, 4398191, 400931, 8293825, 1209921, 5559725, 6724770, 7950747, 5185053, 1449691, 7862351, 3620825, 4997682, 529079, 3209284, 2052005, 6867464, 2345305, 7750265, 229142, 4242384, 6645649, 6801237, 6465520, 1543887, 3813449, 3820033, 878553, 713698, 367440, 5062885, 7588117, 2757979, 4305588, 7517144, 6282771, 2346313, 3931595, 7588644, 5340542, 6151651, 774379, 4673031, 266579, 6156103, 5380007, 7535674, 872186, 3957088, 6677601, 6444240, 863416, 2130308, 5282025, 7442743, 1441448, 5363710, 5869382, 5000550, 3890682, 982448, 6793663, 8020652, 780526, 5697478, 8351754, 2202741, 3397087, 7255701, 3804458, 1667277, 5693210, 7732000, 4492357, 2814870, 6148178, 7457253, 2687217, 1918273, 8028129, 7777402, 1362653, 5822564, 7657187, 721265, 8101858, 5423782, 2201209, 8038368, 112986, 8230088, 4698491, 3474424, 2429818, 661572, 2590144, 7038448, 7581403, 1116510, 8042810, 160994, 4042710, 1629497, 2933680, 4667054, 1335598, 481500, 3093087, 4774430, 3057726, 1106953, 23746, 7283301, 1687855, 5496906, 6679959, 2302148, 2134316, 3744554, 2973159, 5015560, 6848965, 806823, 5846573, 3367159, 8013469, 304667, 3352768, 3370357, 3262752, 6035170, 6216021, 6374477, 1428962, 4570768, 832949, 5248054, 1270148, 7025838, 525047, 5623466, 1355616, 3686171, 2803396, 5147057, 2560275, 7011366, 5568697, 1628537, 6851434, 2338434, 2837799, 3331499, 4389380, 1986071, 7061550, 444426, 3941774, 2445480, 5816892, 7768894, 5668695, 4198240, 3307273, 4446357, 1458809, 2973741, 679809, 4213425, 6121419, 6994884, 3542131, 448659, 7510036, 3375262, 1754605, 5144744, 7787543, 4091440, 1577251, 6154408, 3475063, 6880374, 6589009, 4122509, 2803850, 1858227, 2592776, 874127, 2601120, 3754534, 4413971, 3577524, 5838008], -[6758145, 5922560, 2048600, 7571929, 3261726, 3044315, 7782520, 3651866, 1744036, 3922529, 835135, 7478696, 3024280, 7427146, 1711790, 1875610, 268315, 7894585, 1126935, 5958887, 2195252, 6069918, 7697858, 6618605, 3737868, 3476589, 5095915, 710859, 1177224, 6571115, 7824583, 3518847, 1767527, 2582854, 6841285, 7907162, 4707658, 6251580, 1952456, 2004724, 5598384, 3786963, 3134407, 5974879, 1683357, 7378244, 7720711, 2852021, 394392, 6656972, 6931090, 4342998, 6002128, 5948366, 553549, 6380641, 6530598, 2095902, 7787444, 6583736, 1403127, 2578087, 6500521, 1100987, 2558206, 7836377, 7768318, 8275435, 4844309, 219877, 8250893, 6533248, 3319737, 3015897, 310872, 4508045, 474136, 5363047, 6701232, 1461617, 4740239, 3697607, 1429953, 5500961, 5514545, 5386011, 7353319, 2179171, 6033060, 8019796, 3272599, 6995700, 6273262, 6512899, 2427604, 8292690, 3763758, 6097906, 5932976, 5294265, 781982, 7621206, 8299564, 5234238, 1175538, 4553761, 6995258, 5033115, 6623689, 1613989, 8103229, 1595831, 4392675, 5501327, 5739269, 2916783, 8239916, 2558459, 2325386, 1788006, 6116327, 1747451, 7875616, 7401527, 3955211, 449606, 5158104, 3520960, 7785684, 2547328, 5881470, 248889, 8256233, 5474898, 477526, 8210713, 7331926, 767443, 6181754, 7614880, 4025941, 4465288, 3108505, 7606480, 3995817, 4860131, 5655800, 3613499, 3453982, 1359577, 3404574, 1111617, 7853579, 2997156, 398181, 4361720, 8148580, 7233032, 4815786, 5462271, 6309879, 589910, 2382160, 1189322, 5619663, 7452693, 1995360, 2213823, 870698, 2099002, 7559846, 2059713, 8003742, 2348113, 287963, 6651794, 1205923, 4215059, 790071, 4579742, 3012418, 8094284, 6861422, 1372357, 655027, 3853052, 6701464, 433831, 3756371, 1027923, 4379552, 745074, 781506, 3381493, 5792387, 491947, 8262485, 7065658, 175997, 2566791, 4826104, 3507857, 4322769, 3885084, 508461, 6466889, 6571989, 7804531, 6007038, 7032582, 342039, 8215371, 2118152, 3404932, 6030803, 1593492, 152296, 3828787, 5944129, 1235534, 7137582, 1261219, 8260098, 3589276, 2915823, 6587619, 1358783, 4151648, 873194, 2677994, 6142149, 3864, 875369, 2874234, 394800, 5959067, 1245216, 1147201, 7624684, 3535448, 2016766, 6616128, 2013931, 2045121, 6913794, 1802232, 3864737, 4602785, 2471337, 5438200, 1400612, 8217320, 2670614, 8061685, 7598350, 6761546], -[4888731, 810472, 5895608, 3680701, 6133197, 2833490, 6754027, 4464140, 5704350, 7728508, 8357456, 7712443, 7295341, 659194, 4449085, 3870874, 3643523, 7327077, 7140369, 3434712, 4553581, 5573554, 1639043, 712979, 6250321, 3165607, 4475886, 5806768, 7674070, 602962, 839570, 1390748, 2372040, 3833492, 8061795, 3618772, 7055406, 687554, 7580845, 5171459, 2969319, 4533779, 4682951, 3122800, 1910969, 6310945, 5918757, 7356487, 1435969, 4768211, 6328588, 7217697, 767299, 2148911, 4199002, 3207214, 4190743, 1544358, 3849531, 2038747, 4344367, 2108713, 2350930, 1106857, 345784, 90248, 5954006, 98034, 3650481, 7232181, 723651, 5351799, 4766199, 7870087, 4267522, 1712965, 1536814, 1080872, 1419116, 5017850, 5628454, 6033331, 2319907, 5757390, 4886243, 7797718, 482795, 5587362, 1197686, 2026402, 5201533, 2166011, 4384874, 4472222, 6455470, 2371383, 8042944, 5319003, 4920931, 7883548, 6467778, 2309628, 983099, 7766063, 4683456, 3685612, 5202154, 7723734, 3695381, 7987601, 6818635, 6403168, 7593095, 2120483, 1944382, 6218629, 4931018, 1899402, 838461, 8131354, 6324225, 1865637, 2300287, 3656444, 4838607, 2656646, 4795961, 5226735, 5610745, 3581967, 8225771, 7553342, 2202496, 3948581, 5585489, 755660, 3073984, 1177524, 2330310, 2021395, 3387606, 2070192, 4915323, 2354287, 7891168, 2493128, 2520502, 3264126, 1601408, 4687615, 2950665, 5134626, 6087898, 1267492, 6683789, 8208395, 5138952, 2279538, 5532182, 6829204, 4751857, 7904465, 638734, 2196264, 1548798, 6150416, 5562831, 1111581, 7238043, 4911114, 7075957, 8287660, 7942807, 4735890, 8252586, 1120994, 3069873, 3303289, 7960406, 1958484, 3296983, 1237829, 8371690, 1811514, 1309629, 4503582, 8325469, 2464880, 2971885, 8072530, 7308458, 7880149, 2737073, 1079697, 2232407, 8205077, 7247408, 538191, 4429783, 6194127, 8357272, 1075210, 5635120, 2058478, 7516867, 6734978, 6665286, 4092516, 766396, 5947060, 2814049, 64961, 5768210, 7961527, 2821939, 6177222, 1483809, 3992047, 3914519, 3985173, 5890344, 8144479, 6216926, 5818061, 7334512, 948381, 1782388, 260024, 1489974, 2698786, 2041539, 20700, 489920, 5643562, 2907311, 7083022, 1382614, 5100647, 6409034, 6132724, 2002985, 8168005, 5489639, 3342669, 4729422, 5105581, 6202407, 2080249, 7489315, 7323518, 6256079, 3404167, 6372233, 7327484, 4606710, 5946574]] -w = NTTInverse(aHat * NTT(y)): [[1398502, 2912460, 1321383, 4677021, 5037058, 770457, 1975114, 1929754, 7527149, 6975674, 7408973, 3608183, 7516655, 2019037, 2575360, 1872448, 7669162, 752181, 5764812, 6035002, 2277848, 7687903, 5737979, 6804860, 1238237, 5565, 5784306, 8332228, 268170, 2868211, 3452699, 5632804, 3994348, 3863645, 6025339, 2672916, 876342, 4737290, 707832, 1806450, 1259726, 4014079, 4910408, 6085648, 6339010, 6307471, 7058887, 6518711, 415698, 3513779, 3277027, 3932836, 5788579, 4542047, 5141400, 2890456, 4742223, 7784002, 4903903, 1361795, 3030918, 5409401, 5294076, 7190464, 893437, 8306029, 8314424, 4908347, 1559527, 7347799, 19753, 7300999, 7872955, 1402006, 3591098, 945510, 6640529, 83131, 1394419, 856988, 6889187, 4414911, 5432132, 4716266, 1555042, 5752847, 7990724, 7019160, 6124647, 573749, 6351585, 2847186, 5603594, 7413897, 6382408, 7260047, 2707020, 4068074, 4108924, 511946, 7882619, 1973529, 7034447, 6347735, 3968544, 6148313, 4153262, 3697959, 7861276, 7300841, 7628281, 2396581, 6360633, 4462568, 3524058, 4375369, 2300928, 3723128, 2847051, 3045693, 7480174, 6960467, 6436219, 6058765, 4490192, 7219978, 4918766, 473314, 4009340, 3181010, 5228911, 4508560, 625940, 5331929, 7016399, 6756661, 1695450, 3561478, 2788678, 8319759, 1510251, 2337707, 528800, 3685714, 3879827, 1200795, 1104858, 5053594, 3931505, 4914525, 2717995, 2529614, 315125, 5641426, 6028516, 570013, 1696373, 4484677, 1285991, 1637224, 4500393, 3762399, 1410197, 3001875, 7307829, 3347405, 6823890, 5826209, 3000752, 2089494, 1896508, 1401788, 7960903, 5556290, 2020378, 5635088, 3432287, 5595321, 5577518, 2944611, 1623173, 1793647, 3498838, 7469718, 4045380, 4629346, 2683517, 790724, 4659817, 5778432, 4661588, 2254904, 6462906, 5233226, 3337730, 6527731, 2781262, 5731186, 6350654, 2485933, 5376945, 4419057, 846702, 6533115, 3579420, 2342898, 587953, 8138041, 8032078, 3078068, 1067586, 4406355, 6949698, 6967603, 308195, 5177076, 3933068, 5077730, 7685517, 3714665, 2986435, 1315337, 2699819, 5310962, 189758, 6744849, 6773281, 1115597, 3819264, 3077323, 7354116, 2283575, 1170076, 3869631, 5677829, 4399059, 2031922, 1218108, 5821288, 3926416, 4764401, 7018327, 5785718, 7819319, 6777266, 4102382, 5242905, 2055587, 8136576, 2720927, 2926958, 4395652, 4549232, 888111, 5671653, 257320], -[7491859, 8088505, 1665651, 3891088, 4063580, 4132058, 6543527, 2638803, 1773535, 1148810, 699174, 1076699, 709915, 6277404, 36639, 7449039, 2273951, 1929814, 6213553, 4332948, 3506625, 6810896, 326774, 6265881, 7116137, 3892893, 7474035, 1538437, 7450570, 1523099, 2455904, 3502584, 6394681, 7377197, 3012741, 6434932, 7725116, 3253611, 4736759, 6173971, 3349133, 1025992, 7224926, 5806128, 2376108, 8301402, 3920784, 6436236, 3304777, 3688454, 3250348, 3356623, 3822065, 1126519, 7309887, 1359258, 6496710, 7909561, 19274, 1556592, 7112048, 3215440, 7275370, 8129218, 6664220, 4701960, 2075196, 1046788, 6544078, 2995295, 5090244, 2634948, 4370079, 1148536, 1389915, 3021780, 7196594, 2179952, 6861706, 4028513, 7485354, 4266242, 5791389, 697462, 1951250, 4237964, 6410808, 5455525, 6717162, 2192273, 1836977, 5130763, 6717728, 5049768, 5942723, 1306317, 4544924, 5030292, 5345258, 7121075, 4721625, 1565965, 4117014, 2830749, 7107187, 4848216, 6918495, 3751237, 5091367, 4698270, 2254704, 6292895, 7583140, 4004953, 2481785, 3379541, 2433271, 6865801, 3105539, 2221740, 1999730, 4322106, 7399281, 2641175, 1639393, 1516896, 3729957, 1943686, 1540973, 2831577, 2001623, 2612206, 2939829, 7976849, 3358274, 303588, 3941997, 5836041, 6210767, 3142928, 1080540, 2486699, 7163866, 411210, 3826143, 3146979, 5194887, 7557465, 864196, 80923, 3195099, 4006305, 1113924, 1590136, 4393074, 7093319, 3611143, 2794130, 2586998, 7416999, 3936166, 2619601, 2740687, 1139634, 4634100, 7161687, 614731, 7057330, 4670493, 3583923, 233790, 329505, 5482756, 2169254, 4895047, 7761774, 7526046, 5921397, 6229959, 1526016, 5452387, 2940702, 551851, 3611522, 1800813, 2670204, 883166, 1222575, 800075, 2481457, 311472, 4177981, 7225104, 3776588, 2453912, 885446, 1032344, 184908, 8241345, 8220674, 3474149, 1505366, 7653176, 1049546, 6340670, 443723, 6026904, 268467, 6885125, 6578472, 2853006, 1906590, 1252177, 2478651, 8242234, 5532950, 7538236, 4926338, 1058326, 4791909, 4500516, 1731481, 4130254, 1589872, 5725072, 6659309, 4260306, 5650064, 6885632, 1752696, 5341951, 5701597, 5049760, 2798248, 6884609, 5795927, 2400998, 2509239, 7532867, 2006346, 2018049, 6193174, 5385053, 2620480, 1338235, 446838, 2128030, 4510721, 4134538, 4947976, 43716, 3104359, 5991899, 3931231, 3897220, 6338002], -[6216886, 2405060, 3403288, 8161322, 4098055, 917281, 2735971, 7054374, 627751, 8086504, 5581260, 631281, 1546330, 8146555, 4331626, 2747973, 2956509, 255375, 952974, 950284, 3308606, 666252, 1538727, 3839996, 356688, 5199160, 2855363, 4501670, 6809875, 5820687, 3432443, 1931376, 3270153, 40897, 8264005, 3324511, 7487743, 6567200, 3407654, 7382051, 7281015, 6490602, 2096442, 4738540, 263919, 373226, 739345, 1141887, 1690499, 5239053, 2929435, 981145, 7384833, 63523, 6921288, 6819043, 8240992, 5329917, 4310078, 2252434, 4892231, 6309731, 1770582, 3647778, 7618314, 7967251, 5044061, 2697238, 5595495, 5111358, 7683864, 6877814, 394790, 7224055, 3877093, 1417556, 5707694, 2959097, 808178, 3111775, 1767872, 4147781, 7451209, 4137490, 5297085, 6472378, 260958, 6353923, 4664515, 5588480, 6780489, 5952138, 554320, 2065970, 3611974, 5341100, 4927619, 6395411, 6343293, 2888666, 3511757, 1706305, 2920293, 5626485, 851558, 1650525, 7664558, 3569024, 2403856, 1984553, 143758, 1834270, 101220, 5021450, 116692, 5705920, 6931456, 5708000, 5047495, 2600641, 8272944, 4941936, 1479127, 7781944, 4743936, 3619484, 7077123, 5002063, 7474362, 5910614, 6740512, 2447311, 5093217, 2965187, 6895676, 1497105, 4456170, 160222, 3465211, 7751382, 6708867, 7024336, 7386154, 6033897, 2441325, 3005181, 1266164, 801797, 3293259, 2632243, 2068250, 6749229, 3570484, 7078932, 3675227, 7848328, 1951637, 4916159, 698185, 14792, 2234800, 4951038, 5888981, 634394, 5369336, 7205485, 7208516, 4398094, 315549, 5704115, 6293437, 1506657, 919383, 3715574, 7828323, 625261, 7717275, 2878366, 3230016, 562150, 1135564, 6871077, 420001, 6464379, 5472866, 7344337, 7347705, 6852384, 2606061, 6778269, 4306415, 2768960, 4223981, 2641863, 1108574, 3376710, 6493425, 8177430, 6112303, 6271170, 6829167, 1064530, 3246044, 1672185, 5868703, 4844165, 5090898, 8309740, 6836468, 2844247, 8378903, 4357096, 7630425, 5318459, 2371386, 5891188, 7240927, 2970862, 6701416, 426792, 3556170, 4997684, 4718174, 2289876, 146122, 2919148, 1506694, 5886202, 6414814, 5705196, 5632004, 7661726, 406106, 5966867, 1726047, 1478895, 7970822, 4160507, 3262281, 62706, 836973, 1330813, 710347, 4605368, 2844889, 1016221, 1932543, 6596460, 446484, 6078550, 7653721, 4072152, 3677183, 243049, 3223499, 5197311], -[6269526, 8057920, 5786623, 2493366, 548545, 8304627, 7127876, 6076101, 4425259, 2552036, 7516157, 5957264, 8251829, 2587065, 601141, 3261735, 4861825, 3552203, 6776872, 4460376, 7148219, 4676869, 5963663, 449276, 113158, 8268909, 5414068, 6004263, 130218, 71136, 1569921, 1967970, 3357208, 926224, 5704413, 5404187, 350783, 8065613, 4595441, 4227610, 1964413, 6235882, 5259539, 4620135, 5718800, 6097934, 2646342, 5526429, 6351173, 2121552, 407958, 7045206, 1311448, 7119674, 1485370, 8196225, 5630666, 4880780, 7775827, 2174636, 7722471, 4782481, 6568445, 5993144, 90000, 2266106, 3297701, 2876647, 3398479, 8070401, 2646103, 1329937, 2036019, 2029452, 7614420, 6021323, 488671, 2935075, 8264371, 6449573, 6838862, 1097062, 4871385, 7861921, 6585189, 87675, 7690677, 391684, 1012071, 4643995, 3834147, 4716172, 2120970, 1345976, 4894499, 169279, 7945921, 3936360, 5045247, 3908256, 7436570, 4443121, 7803787, 2471444, 3965338, 3758546, 1549270, 528494, 4222452, 1513227, 8365822, 4448104, 7834879, 6328623, 7202213, 109166, 1403598, 7691254, 6666294, 517392, 6260255, 7552206, 7607830, 3483251, 5451265, 1847388, 5542268, 2703943, 2896114, 1416565, 2531075, 6005139, 2647318, 363965, 3244583, 729433, 6038514, 3745866, 2137177, 8082086, 4675045, 3059706, 7152838, 5052067, 4054544, 2227679, 2167726, 6543090, 3886645, 2529097, 2189737, 4413902, 2702970, 5385810, 921969, 3020916, 6656460, 3738753, 6690408, 113526, 3299888, 982656, 3306363, 6841889, 3422719, 1824469, 856298, 3583562, 4466135, 1105878, 4153378, 5805380, 881284, 7124752, 1546339, 4253648, 2571147, 1173174, 4598963, 8341517, 4156159, 1026146, 5833095, 2103501, 982329, 1204193, 6347094, 2554560, 1582809, 5416617, 2687340, 5571444, 6120480, 6682352, 699160, 5486787, 6327175, 6432833, 3034600, 5935394, 3886622, 6733964, 813956, 2822441, 3229144, 6939406, 5308497, 3877092, 4474784, 5302205, 8309034, 3806299, 2080168, 7791564, 5869887, 266961, 1801378, 5942700, 5513187, 4060683, 4969341, 2775197, 7768188, 4937000, 1392562, 4993304, 7840416, 6802924, 146389, 1213093, 6155095, 6195530, 4922817, 8299183, 3334645, 4952149, 1069038, 2370588, 3256058, 6599755, 6942030, 74733, 1170868, 4593152, 3710091, 8145951, 701253, 698090, 6518555, 4729617, 4656656, 7932868, 5100815, 739066, 4940511, 1423593], -[6314287, 3841955, 4102893, 5821702, 3799001, 3674829, 7100631, 689339, 505173, 6775021, 1425053, 6867604, 8046729, 3317650, 1510462, 5218978, 5680810, 2061345, 1675624, 5278206, 215174, 4606925, 2203207, 3226035, 2467730, 1593062, 204839, 7863754, 5070198, 3054846, 1793988, 3378866, 2844145, 1094007, 3758107, 3155169, 924828, 8075598, 1773896, 929549, 1679324, 612338, 3780972, 3860253, 5505689, 7136419, 4929172, 841778, 5518366, 3805596, 8092731, 5169669, 6566867, 6449998, 6892744, 4547184, 2295004, 3483812, 171722, 3676128, 4893598, 3101880, 5856315, 4110195, 4493837, 4475529, 5311845, 6562685, 5726126, 2900517, 4481003, 6925068, 500005, 3009299, 1892731, 5437822, 6381495, 36580, 1423067, 7269813, 5465176, 6113280, 6089313, 4604890, 2240224, 6250063, 6846960, 1643923, 2176837, 1110858, 6555038, 1910395, 5638029, 2790732, 5455550, 7619386, 7499475, 1977925, 4316647, 2936273, 7743936, 6401909, 2826670, 4415503, 4189398, 4451701, 6295100, 4591718, 6996702, 3869546, 7825290, 6338387, 3217992, 3990904, 4255212, 3783358, 3931445, 4763593, 3517987, 3462722, 3857288, 2418742, 8024390, 628340, 1387100, 5757946, 4883838, 7079907, 4438949, 4379095, 1897461, 1914349, 7170333, 2259893, 1011705, 656999, 7214264, 3011852, 3201616, 5011651, 6115934, 6784933, 6010770, 314194, 1679979, 1312000, 7322972, 4234380, 870070, 4078977, 2485820, 4369716, 5566593, 5308917, 3237015, 7034399, 5838560, 3299714, 5710835, 4981705, 3026384, 7258302, 6261156, 1707229, 2966021, 8236532, 752990, 4462980, 4426856, 6067850, 4473994, 4086147, 3788809, 7118454, 7452765, 2778045, 252265, 5903488, 6965884, 5416466, 2638527, 5827343, 3458086, 1454216, 2751283, 2562038, 3712350, 3610472, 6065020, 4643890, 6165431, 3664724, 867243, 3308507, 3093833, 53242, 2880667, 3127687, 1370437, 3587554, 553964, 2972771, 6134809, 3737362, 8073405, 4383860, 3988139, 8185052, 3319285, 83478, 5077822, 1199785, 2179322, 4043456, 6160350, 5220915, 3826891, 2145632, 6121010, 1417933, 1571153, 6757924, 2975544, 3206630, 520072, 355744, 5835031, 5613524, 4770650, 5054086, 2595791, 2226896, 2212099, 4735366, 3417204, 6156485, 7881255, 5271940, 1589593, 5900149, 2511519, 8340583, 3678092, 7220426, 4583947, 8377720, 6730428, 3471863, 4247049, 8335553, 405145, 5179220, 6420846, 2802060, 7733815, 752622], -[2158890, 3906430, 4560810, 2532163, 8255397, 940635, 5450255, 4222428, 8306388, 516275, 2439887, 5598621, 7434351, 2953931, 7666484, 1791634, 2046337, 5397626, 5809988, 1115784, 4715891, 3020655, 7119158, 1914008, 4850218, 3424580, 1649813, 3800900, 6149572, 7295344, 2038866, 7228073, 8278933, 283807, 418024, 763921, 1901720, 15545, 3853288, 1245376, 52641, 3360248, 3431269, 2579689, 8039825, 5203766, 2551547, 4626119, 4686654, 5139942, 2890940, 3896588, 6039751, 6714698, 4097540, 2885195, 2114873, 728045, 5268965, 4385543, 1149574, 1887609, 5669685, 7533183, 2159858, 3741115, 5997454, 7032585, 7100032, 3197835, 2004060, 52420, 6400200, 4884930, 3101496, 6299012, 330766, 780038, 242503, 8296008, 8341381, 6787038, 5823993, 496014, 6338310, 5017516, 4104677, 6152969, 4645602, 6482986, 5027856, 6510252, 3064093, 5292560, 4913587, 1666974, 7684462, 7272151, 171699, 145186, 5569024, 7157817, 355412, 1617166, 158170, 5297423, 5649104, 349745, 3820939, 2310697, 3257777, 6796548, 5481732, 6346081, 350866, 4176191, 130824, 6480210, 7043701, 6942140, 7972996, 7576396, 1969887, 2192495, 2257476, 4102319, 4135970, 859439, 6146991, 2398496, 3923173, 457578, 7795525, 8182119, 6423270, 52570, 5590315, 6316566, 351218, 1696691, 5683987, 139461, 2880332, 8117175, 5444730, 3754643, 3520906, 2385541, 1128974, 2129195, 4033619, 2183503, 5286422, 5948611, 4536111, 8049146, 3480453, 3753440, 4084792, 1530235, 5166916, 3210201, 5301482, 4770470, 5877448, 509329, 1903416, 5549442, 6264411, 6476580, 6414661, 809266, 2108102, 2070477, 7029147, 5641472, 6057109, 932436, 839408, 1435622, 2658311, 4592974, 5604019, 3317839, 8220375, 6913903, 2281646, 6315005, 3488809, 8380077, 5758692, 2683089, 3043125, 2710173, 6197364, 590857, 4243376, 2713454, 8165514, 2592653, 3464149, 1931517, 1302033, 8038188, 3612111, 5783089, 3080353, 7565420, 1206069, 129611, 262305, 1686993, 3890910, 4568917, 7838469, 7925989, 4699117, 1535742, 8202194, 7444390, 1336009, 3074702, 2564883, 883678, 2648394, 1631900, 7002464, 4093586, 4977640, 5061051, 8235391, 1708016, 4445472, 1198984, 5418024, 998737, 6691385, 1584140, 4575229, 3418445, 6639511, 5325450, 490270, 4395632, 5797171, 5399003, 988824, 770592, 7427422, 7101561, 5986873, 7627960, 485417, 7763432, 106250, 3988890]] - -w1: [[3, 6, 3, 9, 10, 1, 4, 4, 14, 13, 14, 7, 14, 4, 5, 4, 15, 1, 11, 12, 4, 15, 11, 13, 2, 0, 11, 0, 1, 5, 7, 11, 8, 7, 12, 5, 2, 9, 1, 3, 2, 8, 9, 12, 12, 12, 13, 12, 1, 7, 6, 8, 11, 9, 10, 6, 9, 15, 9, 3, 6, 10, 10, 14, 2, 0, 0, 9, 3, 14, 0, 14, 15, 3, 7, 2, 13, 0, 3, 2, 13, 8, 10, 9, 3, 11, 15, 13, 12, 1, 12, 5, 11, 14, 12, 14, 5, 8, 8, 1, 15, 4, 13, 12, 8, 12, 8, 7, 15, 14, 15, 5, 12, 9, 7, 8, 4, 7, 5, 6, 14, 13, 12, 12, 9, 14, 9, 1, 8, 6, 10, 9, 1, 10, 13, 13, 3, 7, 5, 0, 3, 4, 1, 7, 7, 2, 2, 10, 8, 9, 5, 5, 1, 11, 12, 1, 3, 9, 2, 3, 9, 7, 3, 6, 14, 6, 13, 11, 6, 4, 4, 3, 15, 11, 4, 11, 7, 11, 11, 6, 3, 3, 7, 14, 8, 9, 5, 2, 9, 11, 9, 4, 12, 10, 6, 12, 5, 11, 12, 5, 10, 8, 2, 12, 7, 4, 1, 0, 15, 6, 2, 8, 13, 13, 1, 10, 8, 10, 15, 7, 6, 3, 5, 10, 0, 13, 13, 2, 7, 6, 14, 4, 2, 7, 11, 8, 4, 2, 11, 7, 9, 13, 11, 15, 13, 8, 10, 4, 0, 5, 6, 8, 9, 2, 11, 0], -[14, 15, 3, 7, 8, 8, 12, 5, 3, 2, 1, 2, 1, 12, 0, 14, 4, 4, 12, 8, 7, 13, 1, 12, 14, 7, 14, 3, 14, 3, 5, 7, 12, 14, 6, 12, 15, 6, 9, 12, 6, 2, 14, 11, 5, 0, 7, 12, 6, 7, 6, 6, 7, 2, 14, 3, 12, 15, 0, 3, 14, 6, 14, 0, 13, 9, 4, 2, 12, 6, 10, 5, 8, 2, 3, 6, 14, 4, 13, 8, 14, 8, 11, 1, 4, 8, 12, 10, 13, 4, 4, 10, 13, 10, 11, 2, 9, 10, 10, 14, 9, 3, 8, 5, 14, 9, 13, 7, 10, 9, 4, 12, 14, 8, 5, 6, 5, 13, 6, 4, 4, 8, 14, 5, 3, 3, 7, 4, 3, 5, 4, 5, 6, 15, 6, 1, 8, 11, 12, 6, 2, 5, 14, 1, 7, 6, 10, 14, 2, 0, 6, 8, 2, 3, 8, 14, 7, 5, 5, 14, 8, 5, 5, 2, 9, 14, 1, 13, 9, 7, 0, 1, 10, 4, 9, 15, 14, 11, 12, 3, 10, 6, 1, 7, 3, 5, 2, 2, 2, 5, 1, 8, 14, 7, 5, 2, 2, 0, 0, 0, 7, 3, 15, 2, 12, 1, 12, 1, 13, 13, 5, 4, 2, 5, 0, 11, 14, 9, 2, 9, 9, 3, 8, 3, 11, 13, 8, 11, 13, 3, 10, 11, 10, 5, 13, 11, 5, 5, 14, 4, 4, 12, 10, 5, 3, 1, 4, 9, 8, 9, 0, 6, 11, 8, 7, 12], -[12, 5, 6, 0, 8, 2, 5, 13, 1, 15, 11, 1, 3, 0, 8, 5, 6, 0, 2, 2, 6, 1, 3, 7, 1, 10, 5, 9, 13, 11, 7, 4, 6, 0, 0, 6, 14, 13, 7, 14, 14, 12, 4, 9, 1, 1, 1, 2, 3, 10, 6, 2, 14, 0, 13, 13, 0, 10, 8, 4, 9, 12, 3, 7, 15, 15, 10, 5, 11, 10, 15, 13, 1, 14, 7, 3, 11, 6, 2, 6, 3, 8, 14, 8, 10, 12, 0, 12, 9, 11, 13, 11, 1, 4, 7, 10, 9, 12, 12, 6, 7, 3, 6, 11, 2, 3, 15, 7, 5, 4, 0, 4, 0, 10, 0, 11, 13, 11, 10, 5, 0, 9, 3, 15, 9, 7, 14, 10, 14, 11, 13, 5, 10, 6, 13, 3, 9, 0, 7, 15, 13, 13, 14, 12, 5, 6, 2, 2, 6, 5, 4, 13, 7, 14, 7, 15, 4, 9, 1, 0, 4, 9, 11, 1, 10, 14, 14, 8, 1, 11, 12, 3, 2, 7, 15, 1, 15, 5, 6, 1, 2, 13, 1, 12, 10, 14, 14, 13, 5, 13, 8, 5, 8, 5, 2, 6, 12, 0, 12, 12, 13, 2, 6, 3, 11, 9, 10, 0, 13, 5, 0, 8, 15, 10, 5, 11, 14, 6, 13, 1, 7, 10, 9, 4, 0, 6, 3, 11, 12, 11, 11, 15, 1, 11, 3, 3, 15, 8, 6, 0, 2, 3, 1, 9, 5, 2, 4, 13, 1, 12, 15, 8, 7, 0, 6, 10], -[12, 15, 11, 5, 1, 0, 14, 12, 8, 5, 14, 11, 0, 5, 1, 6, 9, 7, 13, 9, 14, 9, 11, 1, 0, 0, 10, 11, 0, 0, 3, 4, 6, 2, 11, 10, 1, 15, 9, 8, 4, 12, 10, 9, 11, 12, 5, 11, 12, 4, 1, 13, 3, 14, 3, 0, 11, 9, 15, 4, 15, 9, 13, 11, 0, 4, 6, 5, 6, 15, 5, 3, 4, 4, 15, 11, 1, 6, 0, 12, 13, 2, 9, 15, 13, 0, 15, 1, 2, 9, 7, 9, 4, 3, 9, 0, 15, 8, 10, 7, 14, 8, 15, 5, 8, 7, 3, 1, 8, 3, 0, 8, 15, 12, 14, 0, 3, 15, 13, 1, 12, 14, 15, 7, 10, 4, 11, 5, 6, 3, 5, 11, 5, 1, 6, 1, 12, 7, 4, 15, 9, 6, 14, 10, 8, 4, 4, 12, 7, 5, 4, 8, 5, 10, 2, 6, 13, 7, 13, 0, 6, 2, 6, 13, 7, 3, 2, 7, 9, 2, 8, 11, 2, 14, 3, 8, 5, 2, 9, 0, 8, 2, 11, 4, 2, 2, 12, 5, 3, 10, 5, 11, 12, 13, 1, 10, 12, 12, 6, 11, 7, 13, 2, 5, 6, 13, 10, 7, 9, 10, 0, 7, 4, 15, 11, 1, 3, 11, 11, 8, 9, 5, 15, 9, 3, 10, 15, 13, 0, 2, 12, 12, 9, 0, 6, 9, 2, 5, 6, 13, 13, 0, 2, 9, 7, 0, 1, 1, 12, 9, 9, 15, 10, 1, 9, 3], -[12, 7, 8, 11, 7, 7, 14, 1, 1, 13, 3, 13, 15, 6, 3, 10, 11, 4, 3, 10, 0, 9, 4, 6, 5, 3, 0, 15, 10, 6, 3, 6, 5, 2, 7, 6, 2, 15, 3, 2, 3, 1, 7, 7, 11, 14, 9, 2, 11, 7, 15, 10, 13, 12, 13, 9, 4, 7, 0, 7, 9, 6, 11, 8, 9, 9, 10, 13, 11, 6, 9, 13, 1, 6, 4, 10, 12, 0, 3, 14, 10, 12, 12, 9, 4, 12, 13, 3, 4, 2, 13, 4, 11, 5, 10, 15, 14, 4, 8, 6, 15, 12, 5, 8, 8, 8, 12, 9, 13, 7, 15, 12, 6, 8, 8, 7, 8, 9, 7, 7, 7, 5, 15, 1, 3, 11, 9, 14, 8, 8, 4, 4, 14, 4, 2, 1, 14, 6, 6, 10, 12, 13, 11, 1, 3, 3, 14, 8, 2, 8, 5, 8, 11, 10, 6, 13, 11, 6, 11, 10, 6, 14, 12, 3, 6, 0, 1, 9, 8, 12, 9, 8, 7, 14, 14, 5, 0, 11, 13, 10, 5, 11, 7, 3, 5, 5, 7, 7, 12, 9, 12, 7, 2, 6, 6, 0, 5, 6, 3, 7, 1, 6, 12, 7, 15, 8, 8, 0, 6, 0, 10, 2, 4, 8, 12, 10, 7, 4, 12, 3, 3, 13, 6, 6, 1, 1, 11, 11, 9, 10, 5, 4, 4, 9, 7, 12, 15, 10, 3, 11, 5, 0, 7, 14, 9, 0, 13, 7, 8, 0, 1, 10, 12, 5, 15, 1], -[4, 7, 9, 5, 0, 2, 10, 8, 0, 1, 5, 11, 14, 6, 15, 3, 4, 10, 11, 2, 9, 6, 14, 4, 9, 7, 3, 7, 12, 14, 4, 14, 0, 1, 1, 1, 4, 0, 7, 2, 0, 6, 7, 5, 15, 10, 5, 9, 9, 10, 6, 7, 12, 13, 8, 6, 4, 1, 10, 8, 2, 4, 11, 14, 4, 7, 11, 13, 14, 6, 4, 0, 12, 9, 6, 12, 1, 1, 0, 0, 0, 13, 11, 1, 12, 10, 8, 12, 9, 12, 10, 12, 6, 10, 9, 3, 15, 14, 0, 0, 11, 14, 1, 3, 0, 10, 11, 1, 7, 4, 6, 13, 10, 12, 1, 8, 0, 12, 13, 13, 15, 14, 4, 4, 4, 8, 8, 2, 12, 5, 7, 1, 15, 0, 12, 0, 11, 12, 1, 3, 11, 0, 5, 15, 10, 7, 7, 5, 2, 4, 8, 4, 10, 11, 9, 15, 7, 7, 8, 3, 10, 6, 10, 9, 11, 1, 4, 11, 12, 12, 12, 2, 4, 4, 13, 11, 12, 2, 2, 3, 5, 9, 11, 6, 0, 13, 4, 12, 7, 0, 11, 5, 6, 5, 12, 1, 8, 5, 0, 5, 7, 4, 2, 15, 7, 11, 6, 14, 2, 0, 1, 3, 7, 9, 15, 15, 9, 3, 0, 14, 3, 6, 5, 2, 5, 3, 13, 8, 10, 10, 0, 3, 8, 2, 10, 2, 13, 3, 9, 7, 13, 10, 1, 8, 11, 10, 2, 1, 14, 14, 11, 15, 1, 15, 0, 8]] -w1Encode: 63931A44DE7E4E451FCBF4DB020B51B7785C923182C9CCCD71869B6AF939A6EA0290E3E03F270D238D9AB3DF1C5CEBEC85184FCDC878EF5F9C877465DECCE919689AA1DD7305437127A29855B11C933279636EBD4634BFB4B76B33E79825B949ACC6B55C8AC247016F82DDA1A87F36A5D02D674E728B247BD9FB8D4A5086290BFE73885C2321C1E0448CD7C17E3E3E75ECC66FC926BE05C77666273EFC306E0E9D246C5A28634E8D8E1B84AC4DA4AD2BA9EA39589E7D9AC48E65D546845E33475354F616B86C521E67EA028632E857E55825E9D179104AF9BE3C6A71532252817E250200372F1C1CDD4552B09E923938DBB83DBA5ABD554EC45A139498608BC75C0628D5F11B035806221673A195BD470660DEE7CE941121A3260EDDA048C973FF5AABDFE1376B62838ECAC0B9BD41A7C96C37B6327F4540A0B0BD5A90F379AEBE5D6A3D09F7DDCE652256D4E7F79401941BEA8EB13C721F5F16D2C1EADED55858620CCC2D369B0A5D80AFB56E1DA74960B3BCFBB1338F06329125D4C18F07A6FC5B01CE58BE5061799D9E1B00BA004326ABF189C49ACBB54CD1E3039B4F9FBD4056F63544BF61C02DF90D1F929734098F7A8E5F78133880CF0EF31DEC7F4A5B36B515167CF469AE48C45784A5627D0D26D6377229B8E2832509284B225CA3B5DCA1CCB6D752D67AA970F41BB38B599FA3DF20CC099652D60D9207119CF91A397CB8771ED1D36FA34BA3906435F06A632567F2231377EB297BAFCD9D7470698B99DA6BD961A40CE3CA9CC43D244D5BFA4E68CF85889C7DCF86789877571FB3E988444E126EA6DC1B338E8285ABD66BABE63C0691C889E75EB0ADB53755779C7C62066573617C8F08062A84AC473CD36611BBA94594C7AFB305E7097D08A15C1F7459208A10B56E3FA42B694E7973ECE4101104276057AF95A976DC68148A42EB74DB6E049CC61100D01BACC8C9CAA639EF00EB31A01B47D6CA81C0DDEF4484285C170F0CCB310BF57A574248BAF977386A9A1BB4CC2C44BD2C32956BD0C4075B561C585047F2B7E6023197FF39E06325358DAA30282A3D79AD81AB12EEFBF180 - -cTilde: 4C5CB1C3B116E450C025233F1B6BE3BB79385FBF9626D6F27958FC529590ADC03C1B9F58675DCE1F24CBFC85443F31DE -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [-1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 1, -1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, -1, 0, 0] -cHat: [5998204, 1033172, 4358473, 231018, 7119592, 4447599, 4459583, 3619279, 2165424, 6960342, 3508718, 4945897, 3751115, 556163, 3118658, 167655, 1690162, 5421749, 6704858, 4505899, 5648135, 6100757, 7158964, 6449354, 7456006, 6276301, 5592689, 8124092, 7473854, 5928963, 6428402, 3416474, 3586758, 2906690, 2563163, 4908248, 6508015, 7274901, 5033057, 887041, 7502267, 3833384, 4017436, 4173610, 635289, 5579380, 7267277, 3297587, 4607311, 295869, 3450093, 4154344, 3595004, 3183328, 4095403, 5356675, 4342996, 1701231, 2992268, 1410821, 298057, 2247920, 1433694, 4160860, 1227715, 1322180, 5546585, 18493, 2808790, 2799639, 5434285, 5710032, 4454142, 7567190, 8010268, 5843171, 1592022, 1699734, 3237332, 3862337, 4982052, 2121501, 538464, 1333840, 7502060, 6213805, 3386337, 3471433, 3723987, 3854106, 4649157, 7902552, 4692979, 3476667, 8271805, 4506795, 1503777, 3059605, 2096843, 7514191, 3377083, 7746890, 2988833, 7907207, 7449115, 3822676, 2348932, 1766084, 3817239, 6257654, 5936999, 3494379, 4052208, 48111, 2580456, 8323362, 5327957, 1532194, 1980559, 1353151, 409062, 2984494, 3675856, 4259398, 6524755, 751008, 6116518, 2378538, 6607598, 5696424, 1933202, 8176839, 5452864, 8283513, 3675093, 4232403, 1541223, 6333345, 5232171, 5323950, 5895466, 5261828, 5162143, 2579982, 7626622, 519163, 5505938, 6432582, 4951035, 1710770, 6735491, 2701184, 8255361, 102117, 2123535, 213845, 1040804, 151410, 5134042, 1688874, 5646642, 4874510, 5316025, 3618141, 2867587, 1428371, 1571326, 656545, 6734720, 242064, 4528668, 791863, 1245688, 6719045, 6715944, 1035643, 6530456, 6811242, 6182126, 2726193, 960793, 6387292, 7868790, 1306410, 8375319, 3880501, 452780, 2856450, 1737896, 3557991, 2597973, 3290893, 4206444, 1628906, 5011895, 2282119, 1943375, 5972552, 324958, 7571617, 6267101, 8346624, 1325184, 3583804, 5535809, 834705, 691330, 4629156, 4656748, 7525698, 5642234, 8378672, 1434589, 3399999, 2369752, 165304, 969968, 4815075, 219511, 5537548, 1647845, 2960053, 3471556, 4136606, 1958105, 816707, 730074, 8032673, 2772018, 4895806, 41885, 1685487, 2165109, 7418246, 8240552, 7885508, 7761781, 2216858, 5651524, 120286, 5702522, 7365345, 7279963, 2847086, 2835528, 825200, 7190002, 4847480, 2860462, 26486, 1936002, 2345379, 363091, 7930352, 7572394, 1543149] -cs1: [[8380379, 16, 8380416, 8380412, 8380388, 28, 8380406, 8380405, 11, 13, 8380398, 47, 3, 8380415, 8380406, 8380409, 8380403, 8380398, 8380385, 8380415, 7, 5, 9, 8380401, 8380397, 8380407, 8380412, 8380399, 2, 30, 8380406, 8380410, 17, 8380399, 8380396, 0, 4, 44, 8380405, 21, 8380404, 8380411, 8380396, 10, 8380408, 11, 32, 8380415, 8380407, 8380395, 8380414, 9, 8380406, 15, 14, 8380394, 29, 8380394, 16, 8380410, 11, 0, 8380400, 8380412, 8380416, 8380410, 4, 7, 8380410, 5, 25, 8380403, 8380406, 10, 8, 8380386, 24, 28, 8380412, 6, 18, 3, 22, 5, 12, 8380397, 2, 2, 8380412, 8380413, 8380398, 8380410, 19, 8, 3, 9, 24, 8380413, 6, 8380380, 12, 8380415, 18, 8380393, 42, 31, 8380416, 8380394, 8380414, 8380385, 19, 8380414, 8380403, 11, 5, 8380415, 8380415, 27, 1, 8380409, 8380402, 8380410, 13, 9, 8380406, 8380414, 8380384, 2, 21, 8380412, 8380406, 8380414, 6, 8380393, 8380405, 8380412, 8380411, 8380414, 8380412, 2, 42, 2, 8380395, 8380395, 17, 36, 8380402, 8380406, 8380414, 5, 8380415, 18, 8380409, 8380390, 8380396, 7, 8380403, 23, 8380383, 16, 17, 5, 7, 8, 8380409, 8380411, 8380398, 19, 5, 16, 8380415, 3, 8380416, 12, 8380396, 8380416, 8380408, 8380377, 8380392, 17, 4, 8, 4, 12, 29, 8380411, 8380396, 8380415, 8380392, 10, 8380412, 8380411, 3, 8380388, 2, 28, 9, 42, 8380410, 2, 8380379, 8380376, 8380403, 5, 8380383, 21, 19, 13, 35, 8380409, 8380416, 3, 31, 8380391, 8380414, 2, 8380402, 8380395, 5, 8380372, 8380414, 34, 5, 6, 26, 3, 7, 8380394, 8380387, 14, 4, 20, 2, 8380409, 3, 12, 12, 12, 8380397, 8380404, 8380412, 8380396, 8380411, 8380402, 6, 8380413, 4, 10, 24, 16, 8380400, 8380411, 8380402, 40, 11, 8380408], -[8380407, 8380402, 6, 3, 8380403, 29, 9, 3, 8380395, 16, 2, 21, 12, 8380381, 5, 9, 1, 8380406, 2, 8380407, 8380412, 1, 1, 8380411, 8380416, 8380407, 15, 28, 2, 3, 16, 0, 2, 26, 4, 8380411, 3, 14, 13, 19, 47, 8380388, 0, 16, 20, 8380409, 8380413, 8380405, 17, 8380400, 8380411, 8380412, 8380409, 8380401, 16, 8380400, 11, 8380401, 8380413, 8380394, 8380408, 12, 8380407, 2, 6, 8380392, 29, 2, 8380399, 8380402, 8380411, 7, 8380403, 21, 10, 6, 0, 8380407, 8380411, 18, 8380412, 27, 1, 13, 14, 16, 35, 11, 22, 14, 8380400, 18, 3, 8380405, 15, 15, 8380407, 9, 20, 21, 8380410, 8380385, 1, 8380387, 8380407, 8380409, 8380384, 13, 2, 8380392, 8, 1, 8380386, 16, 8380369, 12, 8380372, 8380382, 32, 3, 8380412, 3, 8380409, 8380416, 7, 8380410, 32, 8380394, 10, 5, 33, 38, 8380406, 7, 38, 7, 23, 17, 8380405, 35, 8380399, 12, 23, 8380412, 8380387, 31, 5, 9, 8380402, 14, 8380411, 8380399, 8380405, 1, 13, 17, 8380414, 8380405, 2, 8380412, 8380405, 9, 8380402, 8380406, 1, 8380410, 8380406, 8380397, 8380381, 8380414, 4, 8380391, 21, 33, 8380401, 9, 6, 8380407, 3, 8380396, 8, 8380413, 8380416, 27, 27, 13, 6, 20, 23, 22, 8380390, 8380410, 8380408, 8380414, 21, 8380413, 11, 11, 8380406, 30, 20, 8380416, 6, 8380393, 8380403, 11, 14, 3, 8380406, 8380397, 9, 8380398, 7, 8380415, 8380387, 8380402, 8380411, 24, 20, 4, 8380381, 26, 8380414, 8380405, 8380409, 8380402, 8380404, 3, 8380410, 22, 8380416, 8380401, 18, 2, 8, 8380393, 8380388, 4, 1, 8380399, 39, 8380386, 4, 4, 1, 27, 11, 8380395, 18, 8380411, 15, 12, 8380405, 2, 10, 8380399], -[36, 8380401, 10, 8380395, 8380415, 9, 15, 8380397, 4, 13, 8380411, 16, 38, 8380415, 21, 21, 8380414, 18, 8380385, 15, 8380403, 21, 11, 30, 8380409, 8380414, 8380395, 11, 8380381, 8380380, 8380404, 8380393, 3, 12, 8380399, 9, 8380410, 8380408, 23, 8380412, 15, 8380375, 10, 33, 8380391, 8380400, 8380393, 8380404, 8380402, 8380411, 8380397, 8380412, 8380397, 9, 8380416, 8380401, 5, 22, 14, 25, 23, 11, 10, 38, 49, 35, 12, 7, 26, 34, 8380395, 1, 5, 8380407, 24, 8380404, 8380408, 14, 8380374, 5, 8380387, 9, 36, 8380394, 15, 8380411, 8380383, 2, 8380409, 8380399, 46, 8380400, 8380388, 8380410, 8380354, 8380403, 8380403, 8380410, 11, 8380398, 8380407, 24, 8, 8, 1, 8380411, 8, 27, 32, 17, 8380408, 9, 8380413, 15, 28, 8380413, 6, 8380389, 8380415, 8380415, 1, 8380409, 8380409, 8380397, 18, 8380415, 45, 8380410, 27, 28, 34, 26, 19, 14, 2, 8380408, 8380399, 8380386, 8380390, 8380402, 8380389, 11, 8380416, 8380409, 8380412, 8380410, 8380413, 8380405, 8380411, 8380383, 8380411, 8380410, 25, 11, 8380416, 10, 30, 8380404, 18, 8380405, 8380382, 0, 0, 8380400, 8380402, 8380408, 15, 3, 8380403, 4, 4, 42, 15, 1, 36, 6, 15, 37, 1, 8380406, 0, 8380404, 6, 43, 8380391, 8380412, 8380377, 13, 8380414, 12, 7, 8380401, 8380415, 14, 8380413, 11, 8380409, 8380387, 30, 8, 13, 8380411, 8380392, 5, 8380391, 8380384, 8380412, 8380406, 8380412, 8380404, 8380410, 11, 8380398, 8380416, 8380391, 16, 11, 32, 8380414, 12, 8380403, 8, 9, 8380395, 3, 8380413, 6, 17, 11, 15, 8380376, 8380388, 8380411, 14, 8380410, 20, 8380415, 17, 3, 8380413, 34, 28, 33, 7, 8380411, 2, 21, 8380410, 11, 0, 3, 8380410, 8380406, 8380399, 8380408, 1], -[8380409, 9, 8380402, 8380414, 21, 4, 8380365, 23, 8380409, 7, 8380400, 0, 8380396, 8380409, 8380416, 17, 8380407, 8380403, 8380406, 8380400, 8380408, 8380413, 1, 31, 8380409, 14, 8, 10, 8380401, 0, 8380404, 8380410, 3, 1, 8380394, 24, 8380397, 16, 4, 8380409, 8380411, 8, 8380412, 8380413, 20, 13, 23, 8380390, 8380407, 15, 25, 8380402, 8380415, 16, 8380410, 16, 1, 3, 8380393, 13, 8380408, 9, 8380413, 12, 7, 8380414, 2, 8380412, 8380405, 7, 8380405, 8380402, 12, 4, 22, 8380370, 8380409, 8380392, 8380414, 8380397, 32, 0, 8380416, 8380399, 19, 8380404, 22, 8380411, 8, 8380399, 7, 0, 21, 8380405, 8380371, 20, 8380407, 17, 0, 8380392, 1, 20, 8380409, 8380397, 11, 8380380, 8380415, 8380402, 22, 7, 8380402, 6, 9, 8380406, 9, 8380404, 8380408, 8380399, 22, 8380397, 0, 1, 8, 8380416, 17, 8, 0, 8380411, 3, 13, 8380399, 8380405, 8380413, 8380413, 3, 8380403, 43, 15, 18, 18, 8380410, 8380404, 8380409, 8380395, 8380386, 8380411, 8380397, 18, 8, 17, 8380404, 4, 9, 11, 8380414, 8380393, 2, 8380396, 8380413, 0, 34, 17, 8380405, 36, 19, 11, 1, 8380386, 8380393, 7, 8380411, 8380397, 17, 22, 8380415, 22, 10, 8380411, 8380394, 8380415, 8380387, 4, 8380407, 18, 24, 15, 8380387, 15, 5, 5, 8380393, 8380405, 8380404, 1, 8380414, 8380408, 8380409, 9, 0, 8380409, 15, 8380414, 21, 8380395, 8380409, 8380412, 8380411, 8380403, 8380413, 8380376, 22, 31, 8380395, 2, 8380404, 24, 8380410, 3, 8380413, 8380402, 1, 20, 8380412, 15, 8380408, 23, 28, 8380416, 11, 12, 48, 8380407, 8380416, 8380409, 8380385, 8380410, 9, 8380413, 2, 8, 11, 8380414, 8380415, 8380398, 16, 8380410, 8380402, 3, 5, 10, 8380402, 17, 8380393, 12, 8380397, 8380390], -[1, 13, 8380413, 3, 8380406, 8380395, 33, 8380396, 4, 14, 2, 7, 8380411, 19, 40, 8380400, 15, 8380407, 17, 8380402, 8380404, 1, 8380376, 8380412, 4, 13, 5, 2, 8380401, 6, 12, 8380415, 8380404, 8380385, 2, 3, 25, 13, 2, 8380394, 17, 7, 1, 8380409, 8380416, 8380384, 3, 8380403, 12, 9, 4, 24, 8380412, 28, 8380385, 8380398, 8380413, 8380410, 3, 4, 8380403, 23, 8, 8380395, 0, 16, 3, 6, 8380411, 8380414, 4, 8380404, 8380395, 8380412, 8, 20, 11, 8380397, 10, 8380408, 3, 1, 10, 8380394, 8380410, 2, 8380416, 8380411, 8, 4, 8380410, 8380402, 8380403, 8380400, 8380398, 27, 8380385, 10, 3, 6, 8380407, 22, 8380389, 2, 8380415, 8380409, 11, 16, 8380387, 6, 4, 9, 20, 1, 8380408, 26, 8380416, 13, 6, 8380394, 8380415, 7, 9, 3, 8380399, 8380405, 0, 8380404, 8380396, 4, 8380380, 8380402, 8380416, 30, 8380401, 4, 8380375, 6, 8380403, 8380414, 3, 4, 8380398, 26, 16, 32, 28, 8380403, 4, 13, 8380402, 8380405, 29, 8380380, 16, 8380411, 13, 20, 8380404, 9, 11, 8380395, 3, 8380401, 8380407, 8, 8380410, 8380395, 10, 1, 16, 8380409, 8380410, 8380397, 6, 8380404, 8380414, 8380412, 8380397, 21, 1, 16, 8380396, 19, 8380415, 15, 8380406, 10, 8380391, 9, 0, 8380408, 12, 8380404, 16, 8380400, 14, 8380414, 8380408, 8380414, 8380402, 8380411, 17, 8380414, 21, 8380410, 8380393, 7, 20, 7, 12, 8380404, 8380416, 39, 2, 8380399, 8380412, 18, 8380410, 8380412, 8380408, 5, 11, 8380392, 8380413, 8380414, 12, 8380407, 8380407, 8380386, 46, 8380407, 19, 8380405, 11, 12, 34, 8380404, 8380413, 8380397, 23, 8380413, 13, 8380394, 8380412, 8380399, 8, 8380413, 8380415, 11, 8380407, 19, 11, 8380412, 11, 28]] -cs2: [[4, 3, 8380406, 31, 8380397, 22, 5, 8380403, 8380412, 8380397, 12, 19, 8380401, 8380405, 13, 8380396, 0, 9, 14, 8380401, 24, 15, 2, 8380412, 8380392, 16, 0, 8380400, 8380394, 34, 20, 8380406, 4, 8380402, 8380415, 8380402, 6, 3, 8380397, 8380415, 20, 8380407, 22, 8380402, 8380414, 34, 8380395, 8380408, 23, 13, 6, 8380408, 5, 2, 20, 8380408, 3, 0, 8380412, 1, 8380411, 5, 33, 8380400, 8380403, 28, 21, 8380396, 10, 8380411, 8380401, 8380414, 8380400, 8380415, 7, 6, 2, 24, 8380411, 12, 8380414, 8380411, 8380389, 8380392, 8380416, 22, 8380414, 7, 13, 14, 8380409, 3, 8380411, 6, 18, 8380412, 8380407, 8380407, 8380384, 48, 24, 8380410, 8380397, 8380398, 0, 8380407, 8380415, 2, 8380395, 8380391, 6, 9, 8380412, 3, 10, 8380406, 6, 15, 8380381, 17, 18, 8380385, 3, 20, 22, 8380413, 8380400, 8380394, 13, 8380413, 8380410, 20, 8, 0, 8380410, 4, 1, 8380380, 5, 12, 16, 8380413, 8380400, 8380416, 11, 8380410, 3, 8380397, 8380391, 15, 4, 6, 8380380, 8380412, 2, 30, 8, 8380407, 9, 11, 8380405, 8380407, 7, 4, 8380403, 9, 8380379, 4, 49, 8380397, 8380407, 1, 8380405, 0, 13, 8380390, 8380407, 8380414, 1, 22, 30, 20, 8380385, 8, 8380412, 8380381, 16, 7, 8380405, 8380416, 8380389, 8380410, 18, 8380371, 35, 8380403, 15, 8380390, 16, 8380379, 8380410, 8380401, 8380388, 10, 11, 19, 8380406, 8, 11, 8380415, 1, 8380380, 8380406, 8, 21, 16, 8380394, 8, 5, 0, 31, 8380400, 8380410, 31, 8380411, 8380413, 6, 8380390, 12, 8380411, 8380401, 10, 13, 8380413, 8380415, 8, 8380405, 8380411, 8380408, 11, 8380401, 8380397, 6, 27, 8380412, 19, 8, 8380398, 16, 8380416, 8380390, 20, 32, 8380403, 16, 9], -[8380408, 27, 8380398, 1, 8380411, 6, 8380406, 4, 1, 2, 8380399, 8380415, 8380410, 8380401, 38, 8380401, 8380411, 2, 5, 18, 12, 8380395, 24, 18, 8380403, 10, 8380403, 24, 8380395, 7, 8380415, 16, 12, 8380399, 8380416, 20, 8380397, 8380401, 38, 0, 8380409, 18, 23, 10, 0, 6, 33, 8380402, 8380390, 5, 8380402, 34, 8380397, 12, 11, 2, 13, 8380412, 8380413, 12, 8380406, 12, 8380413, 8380396, 8380414, 8380403, 8380412, 12, 14, 35, 24, 8380406, 28, 8380408, 8380401, 8380376, 8380407, 34, 8380406, 11, 20, 8380415, 24, 8380411, 8380415, 8380410, 8380400, 8380415, 8380412, 8380394, 8380412, 2, 2, 16, 8380410, 8380406, 25, 8380388, 1, 8380411, 9, 8, 24, 7, 14, 15, 27, 8380412, 10, 8380375, 13, 8, 8380409, 1, 8380411, 8380407, 8380415, 0, 8380395, 8380396, 8380409, 8380392, 8380400, 8380402, 8380414, 8380401, 17, 9, 27, 8380412, 2, 23, 8380391, 8380415, 9, 8380414, 15, 8380416, 8380407, 3, 8380409, 8380407, 8380414, 1, 12, 12, 4, 8380393, 8380406, 8380416, 8380388, 23, 12, 8380403, 18, 8, 8380411, 8380413, 28, 8380399, 19, 1, 22, 8380386, 8380416, 8380390, 8380410, 20, 3, 6, 37, 8380382, 8380408, 12, 6, 43, 8380410, 8380384, 13, 9, 1, 8380403, 13, 8380406, 8380376, 30, 8380416, 8380413, 8380412, 8380394, 16, 8380406, 8380411, 13, 8380409, 8380404, 20, 9, 0, 8380406, 8380405, 19, 8, 9, 8380398, 13, 8380407, 30, 8380397, 19, 8380389, 6, 8380414, 13, 8380400, 0, 7, 8380406, 8380402, 13, 9, 10, 6, 8380407, 28, 8380405, 1, 8380410, 8380400, 8380395, 8380407, 8380410, 8380404, 8380412, 16, 14, 8380413, 8380415, 8380391, 8380403, 8380400, 8380400, 8380396, 0, 5, 20, 8380402, 8380416, 8380405, 8380386, 8380416, 8380393, 8380414, 8380409, 5, 10], -[8380406, 8380385, 4, 20, 8380412, 8380411, 4, 8380411, 8380400, 4, 8, 8380374, 8380409, 8380415, 8380400, 8380392, 30, 16, 8380399, 42, 3, 2, 14, 8380387, 8380411, 17, 8380412, 13, 9, 16, 5, 19, 8380403, 9, 8380390, 8380402, 8380406, 8380409, 21, 8380383, 8380406, 14, 8380402, 7, 5, 19, 8380410, 23, 8, 8380403, 8380384, 27, 8380349, 25, 17, 13, 8380407, 8380399, 6, 12, 8380403, 38, 8380384, 8380388, 41, 8380388, 23, 1, 2, 37, 15, 0, 39, 8, 7, 8380407, 8380405, 8380414, 3, 8380390, 14, 8380405, 8380392, 8380411, 8380416, 8380398, 8380399, 8380401, 8380402, 8380413, 8380405, 8380414, 11, 15, 8380402, 1, 14, 8380402, 8380404, 15, 16, 8380400, 8380411, 8380391, 13, 8380395, 25, 8380384, 8380405, 8380409, 13, 8380412, 4, 8380412, 11, 29, 8380400, 8380410, 25, 3, 4, 8380396, 19, 10, 8380414, 16, 8380405, 1, 10, 8380406, 22, 8380407, 19, 8380402, 8380390, 14, 8380400, 8380386, 38, 8380403, 8380413, 24, 8380395, 8380388, 2, 8380396, 1, 8380391, 55, 8380380, 8380407, 8380409, 5, 8380406, 27, 8380414, 14, 26, 8380406, 8380409, 22, 8380407, 33, 8380411, 30, 25, 6, 23, 5, 8380406, 6, 8380400, 12, 8380412, 8380378, 9, 8380410, 13, 3, 35, 8380403, 6, 8380398, 20, 8380400, 8380390, 1, 8380410, 8380416, 6, 26, 8380381, 8, 0, 8380388, 17, 8380390, 8380412, 8380400, 19, 8380414, 8380379, 1, 33, 8380392, 8, 27, 30, 8380378, 40, 8380373, 25, 8380412, 9, 8380400, 8380411, 5, 8380400, 8380373, 4, 8380412, 17, 11, 7, 34, 5, 5, 8380402, 8380411, 13, 8380409, 8380411, 10, 1, 28, 8380414, 8380389, 28, 8380415, 22, 1, 8380409, 8380377, 12, 8380410, 17, 8380399, 14, 8380407, 1, 8380410, 26, 8380390, 1, 14, 8380415], -[8380411, 8380409, 32, 20, 6, 8380409, 8380409, 8380397, 25, 8380415, 8380400, 8380415, 42, 7, 8380396, 8, 33, 8380399, 8380411, 8380416, 1, 8380412, 8380413, 0, 8380386, 26, 13, 9, 8380391, 8380384, 8380411, 8380414, 32, 1, 6, 8380396, 8380399, 8380406, 8380407, 16, 19, 8380404, 15, 8380399, 8380414, 8380406, 8380400, 18, 8380415, 23, 27, 1, 0, 4, 4, 8380409, 8380399, 3, 5, 8380388, 8380398, 18, 8380380, 20, 8380406, 8380382, 19, 18, 8380391, 1, 8380395, 8380413, 7, 8380407, 13, 3, 12, 23, 8380403, 10, 8380409, 15, 8380405, 8380409, 8380403, 8380407, 8380400, 8380396, 19, 8380395, 12, 8380406, 8380403, 8380414, 8380390, 8380406, 16, 8380399, 8380377, 17, 8380405, 8380403, 6, 25, 8380406, 0, 21, 55, 19, 19, 8380405, 3, 14, 8380409, 8380414, 12, 8380409, 8380384, 5, 49, 8380415, 21, 4, 8380406, 8380389, 8380396, 8380397, 8380400, 8380390, 8380383, 8380413, 51, 8380387, 20, 18, 8380414, 8380396, 13, 8380409, 8380398, 22, 22, 25, 0, 8380403, 18, 4, 14, 12, 8380399, 8380411, 17, 8380402, 8380413, 28, 8380413, 8380407, 8380412, 8380414, 8380411, 34, 10, 8380406, 8380406, 30, 8380409, 8380398, 8380399, 8380414, 8380407, 19, 15, 8380412, 8, 8380408, 8380389, 30, 16, 18, 8380407, 8380395, 8380408, 8, 5, 8380398, 10, 32, 13, 8380414, 5, 8380386, 8380393, 9, 8380380, 8380405, 8380400, 22, 8380397, 8380413, 20, 8380414, 1, 8380393, 8380392, 8380412, 33, 8380414, 8380396, 4, 34, 44, 28, 28, 8380392, 8380405, 32, 8380403, 8380414, 10, 7, 8380388, 8380410, 18, 3, 8380408, 8380411, 8380414, 19, 8, 8380399, 8380397, 8380390, 8380389, 5, 8, 25, 8380402, 17, 8380411, 20, 8380416, 8380406, 16, 16, 8380406, 5, 6, 8380415, 8380413, 8380409, 30, 19, 14, 20, 8380411, 8380408], -[8380408, 8380404, 1, 18, 8380385, 19, 8380392, 8, 8380406, 9, 14, 2, 8380414, 19, 8380406, 8380407, 8380412, 1, 8380412, 14, 8380413, 5, 38, 8380412, 8380397, 13, 16, 0, 11, 8380402, 8380415, 39, 8380391, 2, 24, 21, 8380406, 15, 8380415, 12, 8380412, 8380399, 8380377, 27, 8380411, 8380416, 27, 8380400, 38, 8380410, 8380416, 18, 8380388, 0, 3, 2, 8380413, 8380394, 8380400, 8380415, 8380415, 8380411, 5, 8380416, 21, 8380392, 8380416, 8380402, 8380382, 7, 0, 8380407, 8380412, 8380411, 18, 8380406, 8380409, 9, 19, 8380413, 16, 8380403, 6, 8380410, 17, 8380390, 8380414, 8380414, 13, 17, 33, 8380404, 33, 26, 8380414, 11, 8, 13, 8380389, 14, 8380409, 8380409, 30, 8380413, 1, 18, 1, 8380399, 10, 8380371, 8380403, 8380399, 4, 8380399, 20, 2, 8380412, 8380389, 9, 8380410, 8380394, 8380411, 8380391, 23, 1, 24, 8380407, 8380402, 37, 2, 8, 8380416, 8380401, 8380400, 8, 8380406, 14, 32, 13, 8380405, 15, 30, 6, 8380411, 8380390, 3, 21, 43, 8380412, 27, 11, 8380415, 10, 8380405, 32, 8380406, 8380396, 23, 8380395, 5, 12, 8380409, 17, 25, 8380398, 23, 8380414, 8380362, 8380413, 9, 8380397, 3, 8380383, 10, 8380413, 8380401, 8380409, 8380400, 8380405, 7, 8380396, 11, 8380406, 8380410, 3, 5, 13, 13, 21, 22, 8380416, 19, 30, 8380404, 20, 1, 8380408, 25, 15, 31, 24, 8380399, 11, 15, 18, 8, 8380393, 0, 8380396, 9, 8380397, 8380410, 9, 24, 8380408, 17, 6, 8380405, 8380404, 8380364, 8380388, 8380402, 12, 8380401, 8380415, 8380392, 2, 8380412, 23, 5, 14, 17, 0, 8380408, 16, 8380384, 13, 1, 8, 21, 13, 8380398, 3, 8380408, 3, 8380403, 7, 16, 19, 12, 9, 8380391, 3, 8380410, 8380401, 30], -[8380400, 3, 8380411, 12, 6, 12, 5, 8, 6, 14, 19, 16, 21, 7, 13, 8380408, 6, 7, 8380398, 18, 8380399, 10, 12, 34, 16, 10, 24, 5, 8380401, 1, 8380387, 8380411, 8380403, 8380379, 8, 8380413, 5, 8380403, 8380391, 8380405, 8380394, 8380395, 8380414, 5, 4, 8380393, 8380394, 5, 25, 8380404, 12, 10, 3, 48, 34, 8380416, 23, 8380398, 0, 2, 8380394, 26, 5, 24, 1, 25, 6, 1, 8380402, 10, 8380407, 4, 8380409, 21, 23, 8380414, 8, 19, 6, 8380404, 8380415, 8380407, 8380414, 8380387, 8380410, 18, 30, 0, 8380387, 11, 8380414, 8380415, 8380406, 8380410, 8380407, 8380400, 8380400, 10, 15, 8380414, 15, 8380399, 4, 8380403, 8380400, 8380395, 8380391, 8380391, 18, 8380383, 25, 29, 6, 24, 8380397, 18, 22, 8380406, 8, 5, 7, 42, 0, 23, 42, 8380390, 8380415, 11, 8380407, 8380413, 11, 3, 8, 8380386, 8380413, 6, 18, 31, 8380414, 8380403, 7, 8380402, 34, 25, 8380387, 49, 8380413, 3, 8380405, 8380416, 2, 8380406, 8380376, 8380406, 8380408, 1, 8380406, 8380391, 8380411, 8380402, 8380387, 0, 8380416, 8380398, 3, 8380414, 8380409, 13, 11, 9, 8380414, 18, 12, 2, 8380392, 10, 22, 7, 23, 32, 7, 8380409, 21, 7, 12, 5, 8380396, 36, 26, 8380400, 25, 27, 33, 4, 7, 8380408, 8380408, 8380400, 8380399, 8380414, 8380407, 8380395, 8380403, 0, 8380377, 23, 8380406, 8380394, 9, 8380403, 2, 8380398, 8380381, 8380410, 8380399, 8380400, 8380413, 8380416, 8380403, 11, 2, 24, 6, 8380409, 0, 8380412, 2, 8380415, 8380384, 31, 11, 18, 29, 2, 5, 16, 7, 20, 29, 17, 13, 8380401, 8380401, 5, 38, 7, 31, 8380414, 8380409, 8380411, 7, 8380387, 8380398, 8380402, 8380413, 8380396]] -z: [[143772, 123656, 293463, 7962815, 162638, 130615, 8254548, 454692, 117418, 8029016, 7937213, 24642, 281101, 332539, 7957523, 8060313, 55471, 7986269, 7960328, 405391, 400225, 387815, 8023916, 310096, 8326181, 151862, 519702, 8106552, 441491, 7992435, 29297, 398273, 380800, 8310400, 242983, 8030637, 12515, 8331160, 8124656, 8301181, 259672, 8276198, 162435, 8246792, 11583, 182706, 470551, 8000653, 7880579, 110119, 8017055, 7975210, 8246156, 8055547, 7966150, 59380, 38580, 7949612, 7933398, 8189705, 159870, 284510, 8371776, 286438, 8070756, 8005229, 284296, 7887629, 8369540, 8026517, 8219208, 8004605, 517804, 7951555, 7934428, 109473, 7915952, 482722, 8180580, 22896, 8210526, 23527, 8358087, 69432, 389017, 249399, 8340002, 147072, 107695, 7881817, 136420, 518185, 92225, 7927386, 74780, 8271757, 445960, 7954895, 113196, 309500, 7955661, 8188744, 8035725, 295983, 441455, 103052, 8351550, 8084227, 412058, 8002752, 8378364, 8343226, 516352, 7998629, 150133, 439376, 7925006, 500971, 8011395, 8172211, 18820, 7926045, 8246338, 8270844, 198228, 383051, 8269264, 8028334, 8247402, 7996087, 433839, 7968613, 8015406, 456341, 7866632, 268726, 6913, 8282374, 7894281, 8328378, 8227847, 7969539, 8030192, 8154624, 8342926, 60383, 8253800, 8378740, 8160833, 189528, 8268337, 451560, 7857989, 15667, 8351569, 297121, 7872098, 8005729, 8336831, 169621, 8360521, 473778, 8151121, 8324692, 306792, 418157, 8265924, 136810, 8198596, 7856183, 205470, 7867259, 7902109, 8190260, 8155329, 7907132, 169095, 8186583, 228582, 63983, 8101422, 8253562, 8170752, 8053588, 8029731, 8050531, 7875359, 519011, 8193214, 390990, 7988427, 406163, 7956698, 8162071, 8347218, 443351, 393371, 8114488, 8086470, 363257, 210479, 303115, 441735, 396340, 215198, 164853, 72897, 363580, 8043771, 402831, 148221, 8063667, 306649, 7913832, 8353159, 7883555, 8334742, 8183001, 260740, 8175125, 8031299, 40485, 443226, 64875, 469340, 441146, 7899376, 291765, 8036579, 226740, 7902630, 8273949, 440073, 122120, 7951976, 20959, 8021609, 7971106, 344562, 8030487, 8111738, 8212258, 51161, 8258545, 196574, 293192, 448323, 379859, 7863219, 491415, 8140463, 7962312, 150893, 8211545, 518937, 7952634], -[8059338, 8054325, 478485, 190616, 96841, 440716, 411264, 8138281, 306706, 161846, 8207956, 277469, 8379587, 8128411, 8306406, 8045607, 293701, 8239243, 8051471, 8120559, 40017, 91634, 8164137, 8120221, 355600, 8310149, 14081, 280760, 7926345, 8343803, 399205, 7913904, 8280882, 200278, 458882, 29997, 162647, 8314453, 8374314, 8230575, 460423, 8077107, 441363, 292276, 122073, 488679, 7956539, 96787, 8059216, 300347, 8128416, 277770, 324173, 426082, 448937, 7916759, 7905387, 147017, 303276, 7988659, 97566, 66761, 8042283, 8219452, 7856947, 264017, 198064, 419626, 8219265, 8021223, 234471, 8148995, 488084, 28153, 21734, 8095315, 8063251, 299499, 8095839, 8334677, 7998541, 245194, 8201462, 44522, 8352397, 7929922, 55752, 8303270, 8011383, 7941571, 8213932, 171048, 8067946, 7890440, 8278138, 8139602, 163391, 7918713, 230606, 358234, 8190669, 8082831, 7879154, 515278, 8088783, 499128, 2314, 8286076, 7941660, 191344, 8213001, 7868974, 7998842, 8230137, 271621, 8153648, 7994409, 8167901, 7878916, 7995963, 8315657, 360363, 7867120, 124832, 275895, 8155773, 333895, 8120230, 336867, 476703, 8246278, 120774, 122298, 314263, 8305127, 437468, 7860187, 8025438, 8034319, 7359, 8286170, 22331, 33739, 8084894, 8038066, 65907, 225039, 52710, 316967, 7917219, 241491, 8026945, 258267, 8290591, 262208, 259592, 7904214, 8126458, 8042595, 309608, 8142248, 154317, 7989230, 8021135, 8100201, 459481, 44333, 8032552, 209848, 7991598, 8236869, 8130787, 250041, 8136567, 490740, 201430, 8345528, 7885349, 8325617, 428085, 126984, 189031, 7922561, 344762, 8233451, 173371, 8149284, 8357573, 126582, 331864, 8019071, 505909, 25840, 268422, 8200690, 226297, 8099295, 7909878, 8017255, 8380104, 6703, 107971, 8097820, 7925089, 124549, 148809, 8039418, 484599, 398453, 446611, 8194466, 53858, 465123, 8302073, 8215903, 7961514, 127078, 8008810, 8327894, 63403, 8081047, 227910, 373347, 79875, 8337192, 109756, 8072843, 287315, 8250610, 237129, 8231364, 482141, 7963830, 8379518, 8370592, 496787, 7891936, 307749, 204194, 8159797, 8116448, 210702, 8123755, 278586, 8177097, 244999, 8029850, 7973684, 8149880, 90669, 8070930, 112462, 148348, 301542, 8290883, 513829], -[134824, 8104893, 229093, 7914038, 7889383, 8122105, 306790, 85960, 8154601, 8090778, 8068180, 155248, 7985665, 481786, 8240036, 8353699, 8058569, 8365062, 8036905, 268425, 477048, 7975434, 514127, 475157, 7862917, 332267, 8330989, 11082, 8271262, 167097, 291267, 93802, 7893754, 197918, 8239699, 427970, 278495, 8123420, 8299350, 237083, 30744, 122195, 366734, 433538, 269442, 7950677, 101537, 7918129, 473721, 308542, 448170, 219672, 14278, 338359, 8123839, 8327111, 403754, 222137, 451100, 65280, 443162, 65685, 7964016, 7936115, 8014412, 53471, 104674, 8060035, 8168624, 8077369, 499356, 7924407, 476680, 8174801, 8315299, 375665, 349191, 368900, 398422, 7921429, 8063220, 343691, 7911423, 7994027, 8232563, 7897712, 309213, 8375434, 366150, 271757, 8024649, 429344, 183590, 482786, 8365153, 7875120, 7969012, 7943237, 43312, 8128192, 344475, 8026200, 246496, 8005415, 291074, 8260328, 8027940, 8325786, 8214874, 8131458, 342724, 82357, 8105685, 162838, 111198, 8325752, 345857, 8328295, 293403, 163499, 85437, 170211, 429428, 7992498, 7856197, 233113, 346551, 212492, 8007735, 499374, 8132049, 8328854, 7967412, 8133510, 50538, 8141456, 381702, 297808, 389015, 267177, 7936562, 230709, 8336633, 266552, 7938165, 8097110, 133750, 241300, 8110460, 7867742, 410355, 221437, 76184, 8272705, 155412, 8295215, 237247, 8330085, 8234396, 459250, 287804, 8228459, 8161827, 8238168, 7896782, 306485, 165927, 8156254, 8071748, 8378529, 132354, 130931, 105744, 8260091, 8226092, 257853, 8063097, 7864386, 405680, 7930777, 8309392, 122953, 195737, 18340, 7939372, 8058702, 310918, 329713, 8115136, 8248283, 44469, 8065764, 8314551, 8292692, 73403, 7990470, 7876339, 131780, 426783, 252537, 8077989, 8145198, 7924491, 103581, 8337052, 284880, 8159474, 367927, 7970708, 57070, 8269000, 7880430, 8081184, 8341607, 6028, 8326742, 258617, 8092068, 8172439, 96098, 8091757, 359442, 314553, 8172053, 8144098, 7890124, 7990674, 8166182, 356331, 8170993, 8240278, 8241740, 8116902, 8153388, 8309164, 8316923, 8199642, 146447, 8200878, 125439, 7981738, 7872295, 8359803, 521374, 66216, 342210, 176521, 8204181, 475087, 342261, 8303880, 8205641, 8281300, 335588, 8309877, 263831], -[105076, 443919, 8044095, 8016682, 7907494, 7967344, 232013, 7992532, 372497, 8162765, 13503, 147668, 8004375, 96105, 10471, 8269244, 8303016, 7976487, 464745, 7988596, 7952320, 8328284, 7892880, 8325987, 8238000, 7902484, 8277175, 29790, 8118640, 260422, 7905944, 112103, 8328774, 8020003, 8312866, 8264459, 8168980, 8003134, 7945984, 8286842, 485440, 289004, 8181004, 291717, 353105, 211537, 7976350, 55928, 267441, 205670, 7859854, 7918767, 504151, 358637, 308640, 291107, 8152457, 327216, 7986532, 116391, 8265622, 8224373, 8374271, 8315956, 8244033, 8150732, 485893, 459328, 7885721, 8105961, 8072437, 313274, 427929, 8190930, 514851, 181490, 7877627, 22605, 286241, 8088001, 8370302, 8315574, 322459, 196873, 8262740, 33481, 7858752, 473797, 189579, 8084985, 477709, 509578, 7918655, 7881223, 8218058, 7964823, 7870846, 7976209, 458575, 8375561, 8271714, 31112, 8155508, 318067, 8084583, 339656, 43353, 8377784, 80010, 8096154, 208866, 8046122, 145477, 8254746, 238749, 478993, 8293512, 7980109, 453209, 7919216, 518998, 104074, 8355968, 8022700, 8161385, 8056708, 454387, 8197323, 8072485, 219635, 269055, 8119857, 8302728, 8098206, 246927, 8270231, 522553, 8380235, 300781, 33191, 358671, 8125034, 7970785, 8058865, 80338, 8281671, 267726, 115519, 8085864, 8252454, 420643, 8326970, 8182556, 8107346, 8115792, 8316129, 8241402, 136841, 8078781, 8033746, 8167563, 14279, 193104, 9074, 7991410, 349729, 8291767, 8177852, 8101262, 8335184, 8285073, 142297, 8054506, 389742, 19302, 379395, 8121595, 8062382, 270339, 159716, 202201, 385898, 7935699, 7902803, 7944070, 318776, 8353280, 8302029, 8027656, 326173, 162124, 508188, 103535, 8223604, 7917351, 7959146, 8053482, 138413, 465619, 185871, 8309514, 162094, 252115, 7906507, 8313422, 7871198, 8080140, 8131590, 307497, 268655, 8305444, 32505, 8033815, 185236, 8359190, 513162, 8236108, 190052, 47157, 217253, 8345319, 7992043, 8160132, 7875385, 277146, 8159410, 8322833, 269808, 8134033, 222883, 124494, 303431, 8362645, 8130946, 7884925, 356152, 8019857, 8117758, 7896761, 110544, 8347367, 8362462, 318635, 300920, 8037993, 95180, 8008663, 283536, 249861, 8103321, 7879521, 11531, 7912536, 182547, 343405, 509644], -[8280167, 8183382, 7981272, 140587, 8131905, 8336906, 169368, 8259503, 6959, 8374380, 396768, 323466, 8234923, 140944, 1591, 8026813, 8357185, 381433, 211102, 8164711, 8067284, 8156928, 251946, 8038791, 8127856, 8108758, 7863541, 213144, 8087180, 8234345, 8120609, 476932, 469643, 8119853, 8252282, 242779, 455422, 8327248, 315529, 500126, 238274, 362230, 8144038, 397352, 8120461, 361771, 215362, 117234, 326202, 121265, 329880, 422725, 8098308, 349698, 8207912, 521451, 7917650, 8221894, 8018399, 329241, 418887, 273636, 222842, 7945466, 7985745, 500322, 341201, 8005324, 8042017, 8204796, 4355, 251481, 8049668, 8332492, 8208810, 80188, 8113001, 336564, 486706, 8272880, 7959409, 275435, 8136822, 122915, 8346258, 209220, 325983, 8181804, 7906986, 7892110, 8195640, 8310053, 401482, 7977011, 8009797, 352702, 484884, 8119269, 9220, 8186549, 8057240, 8335209, 7883137, 8334596, 7999830, 471680, 67218, 8279804, 7938521, 264940, 346770, 8041177, 273504, 445514, 7880639, 232624, 7937300, 122420, 206323, 497521, 8071430, 254612, 8082798, 8301735, 7989215, 173405, 7984922, 8017635, 8179667, 8198434, 2329, 138898, 22799, 382492, 8153831, 74164, 373776, 429916, 8339011, 8038841, 8248403, 8264300, 306680, 8188371, 8002325, 8069083, 7857388, 476833, 184576, 120365, 7970077, 316210, 101461, 8245173, 52432, 39592, 478130, 8069576, 7915175, 8163517, 8342671, 8271867, 8112471, 25100, 489470, 8223493, 7861960, 8247432, 7859869, 113284, 103885, 483623, 103624, 8003909, 201837, 442770, 470324, 8095252, 8096243, 7932580, 8367830, 8260678, 8277989, 8128595, 338069, 370275, 8002594, 202998, 8106253, 7863510, 8350195, 8355004, 329331, 8140657, 374523, 8258051, 8042666, 8208298, 8346773, 389534, 75286, 8257802, 8190753, 7941181, 323058, 8085399, 101549, 8262957, 126092, 8195429, 7881689, 8284634, 124092, 8027861, 382402, 8010862, 170043, 8225827, 144002, 224035, 515404, 213461, 8044274, 8252518, 8379310, 7901590, 8352296, 300390, 8125793, 139947, 7914872, 348748, 8313950, 8284926, 151582, 17586, 128752, 8162130, 283247, 8227059, 234117, 7989252, 256052, 91754, 7986704, 505118, 433888, 363668, 236660, 266971, 7869229, 464075, 8293171, 7949724, 122927, 351232]] -||z||: 524234, ||z|| too large -r0: [[-172830, -230199, -249934, -36994, -200682, 246659, -119995, -165336, 194290, 166606, 76097, -58268, 183807, -76055, -43533, -222635, -187478, 228396, 3262, -250294, 182720, -168752, -23559, -4223, 190710, 5549, 22770, -48172, -255583, 249297, -213753, -128721, -195864, 197228, -259971, 54051, -171216, 23303, 184076, 235124, 212154, -176119, 196402, -199649, 53701, 22125, 249821, 233408, -108101, -152666, 134365, -257363, 27038, -171939, -96380, -252191, 28236, -72638, 189924, -209534, -111732, 171636, 56283, -142383, -154101, -74416, -66014, 194384, -11811, 14941, 19769, -31862, 16332, -169320, -75341, -102048, -168561, 83107, -176903, -190576, 80102, 224709, 194400, 2307, -16285, -8711, 134087, 210065, -160678, 49959, 66281, 228303, -157936, 81027, 97078, -72812, 88150, -122124, -81251, -11878, 25955, -121568, 225379, 62442, -221664, -136989, -36944, 31525, 4658, -31997, -228365, -222308, 75326, -251419, -142384, 185172, 205818, 56681, 228207, -96980, 147292, 151411, 150904, -226567, -223814, -112882, 204799, -50439, -180881, 38358, -8842, -205444, 102156, 94169, 207318, -52431, 124121, -104917, 169793, -60670, -61093, 242607, 5041, 19283, 213384, 153250, 57303, -184146, -258677, 200526, 99111, -89272, -208614, -120105, -256798, 46207, 125037, -229297, 238430, 65885, -213579, 95977, -161138, -140785, -25021, 204740, 14840, 64669, -141953, -5590, -198586, -169541, 104275, -205246, -74739, -126421, -234135, -166212, -184019, -198067, 51815, 222299, -167562, 136846, -144823, -84602, 64621, -256835, -54155, 16897, -52368, 159807, 177576, -4488, 195039, 242433, 162367, -30323, 65326, -132909, 139192, 228865, -200821, 247793, -87023, 247775, 64188, -242384, 175427, -64586, 20033, 216184, 140621, 158507, -215602, -60700, -257117, -160038, -171128, 48233, -156252, -255974, 80946, 73171, 189764, -64235, -35813, 68072, 152820, -65327, 21268, 188461, 122511, 203203, -83705, 208843, -63170, 170562, 59761, 259973, 50433, 209259, 24176, -37348, -31817, -87845, 5137, -39498, -243857, 102048, -215671, 205424, -164784, -159427, -89899, 257311], -[159004, 231838, 94342, 224655, -126622, -58156, 258226, 19919, 202206, 101256, 175416, 29149, 186146, -7892, 36601, 116191, 178853, -165292, -71764, 142722, -159819, 1830, -197026, -19449, -216713, 226451, 141185, -32915, 117728, -48236, -162974, -163864, 109357, 44351, -129914, 149600, -131504, 110971, 22737, -111341, 206485, -21578, -107961, 44582, -242772, -79021, 254319, 150939, 162148, 22017, 107707, 213933, 155653, 78955, -22988, -212072, 211385, 52926, 19278, -14748, -220805, 72772, -57490, -251178, -144865, -12010, -19903, -776, 258752, -147396, -147540, 16079, 179843, 100993, -181397, -120835, -136260, 84814, 52629, -161706, 152470, 76036, 29829, 173692, -143852, 47763, 125513, 217767, -91921, 97192, -258122, -106999, -91362, -188008, 181194, 258776, -169085, -207439, 107497, -211783, 7632, -5371, -73218, 211862, -225691, 134217, 109380, 84810, -146403, -15672, 159587, 7575, 250284, -185256, -137089, 236895, -185607, 56713, -37095, 126657, -95366, 131923, 66434, 22310, 68068, -54416, 63508, -151427, -30382, 212702, -93483, -6697, -202801, 120211, 215609, -220185, -248226, 74506, -74535, 269, 32996, -132171, -168995, -112567, 159699, 4311, -42877, 224625, -183345, 80924, 52472, -183926, 66360, 18822, 202848, -239553, -55283, 175254, -31910, 84153, -254061, 720, 121785, 92113, -79883, -171150, 90962, 248222, -43494, -82515, 233753, -194236, 245005, 74138, 181057, -94909, 193189, 159894, -55366, -45321, 214626, -201940, 28062, -54899, 229526, 51294, -164385, 175027, -247472, -137400, -212320, -12216, -107754, 110143, -164960, -162093, -15228, 184899, -139072, -159732, -192271, -65981, -203472, 1985, 55377, -80066, -258398, -255339, 76057, -230635, 234154, -188520, 204628, -140242, -138166, -228586, 205365, 212365, 10789, 77912, -213477, 160143, -59960, 18554, -36492, -149767, 70097, -111465, 76561, 181390, 104201, -59932, -187987, 179373, 75505, 34377, -217878, -109639, 200029, -88744, -77038, -92121, 147314, 1600, -233098, -76958, 32941, -203262, -55658, 234023, 43717, -38273, 230366, -258969, 230783, 52680], -[-68415, -213788, 260628, -219115, -92148, -130265, 117087, 245292, 103992, 229860, -180284, 107548, -24990, -233860, 141435, 129118, -186177, 255359, -94560, -97310, 165947, 142474, -32615, 173594, -167082, -38617, 236488, -212327, 778, 59135, -233994, -163747, 127511, 40888, -116385, 181870, 154890, -241880, -258799, 49221, -51838, 205276, 1353, 24549, -259862, -150569, 215576, 94312, 119163, 1307, -213188, -66434, 52037, 63498, 112183, 9942, -139415, 92175, 119864, 157318, 178261, 24381, 199287, -18625, -238367, 110640, -193722, 78357, -166043, -126439, -172791, 68726, -129025, -108817, 210654, -153762, -53830, -183556, -239377, -30854, 196530, -42415, 118370, -52712, 59326, 187085, 260976, 68627, -49454, -173052, -28587, 190605, 30533, -29149, -54443, 103339, 213621, 110114, 57994, -254005, -154691, 134994, -222357, -135025, -196007, 79219, -192107, -97375, -215012, -110543, 143745, -260829, 101216, -216305, 116681, -55645, 122385, -53529, -190290, -18242, -107477, 227973, -92220, -74706, 29955, -46964, -255729, -235698, 141488, 149089, -68598, -171559, -144562, -177454, 86615, -74237, -257797, 160253, -201259, -105244, -100217, 215224, 53312, -251386, -177557, -137454, 218611, -245729, 150548, 13400, -26844, -59851, -95953, -253921, 8768, -8309, -143481, 202149, 174420, 14800, 139674, 237064, 127412, 110624, 131546, -127404, -124354, 207863, -208232, -57410, 8119, -64654, -128181, 49147, -28278, 101476, -139358, 259473, 87357, 38339, 88026, 61983, -103756, 179047, 235123, 11500, 14840, 43303, -12818, -30825, 116181, 150116, 33765, 22983, 61051, 234037, 208140, -202982, -172992, -14161, 20082, 17016, 103387, 100824, 107192, 130173, -146889, -70707, 27419, 225327, -1470, 166863, -226210, 80690, -247477, 129658, -91942, -171777, -107628, -96988, -110257, -240093, 4179, 194765, 146088, -223513, -64639, 124681, 129508, -56353, -129524, -194908, -117680, 205330, 154691, -92430, 114210, -29729, 119627, 62684, -210580, -240507, 186611, -108628, 226016, -31348, -162543, -212642, -77282, -206763, -202912, -118082, 10778, 243048, 80829, -40447], -[-15780, 201288, 25055, -125534, 24763, -75782, -204980, -209191, 235026, -66842, 183310, 195730, -128630, -31822, 77386, 119071, 147808, -114211, -32210, -253607, -184646, -37110, 202131, -74500, 113189, -111534, 176295, 242718, 130244, 71169, -1401, -127131, 214520, -121329, -57129, 166448, -172975, 208984, -118533, 37386, -130710, -49417, 21764, -93831, -42733, -187367, 27479, -235125, 65863, 26425, -115845, 236117, -259880, -213194, -85962, -184184, -130852, 166793, -80818, 79561, -134150, 68479, -240606, 231588, 90011, 171037, 155026, 257749, 255849, 213760, 27245, -241387, -59092, -65642, -242233, 259784, -35117, -207604, -116032, 164251, 29782, 49495, 157413, 5289, -223885, 87685, -165946, -132071, -35500, -69967, 167703, 2199, 25880, -225349, 180542, 169290, 89265, -253830, -192473, 241807, 103718, 252927, -52859, -147461, -224859, 92114, -22079, 4663, 32225, -58120, -14583, 257893, -21775, 43319, -130648, 109154, -167722, -165353, -142799, -6433, -25055, 219321, -248814, -183170, 213533, -247695, -219248, 85080, -246515, -154729, -87801, 243552, 28468, -159831, 101909, 205660, -246777, 79421, 42081, 225465, -38961, -82972, -180051, -185693, -135650, 132557, 72618, 257764, 220201, -89765, 94639, 223677, 84105, 148054, -125611, -121736, -152618, 72326, -118677, 113532, 157198, -64906, 163718, 32812, -243743, 253149, -191235, -82852, -247846, 58336, -36849, 43829, -166263, -208120, -24980, 63468, -47763, 125606, -115039, -38890, -34027, -21397, 71551, 8392, -65204, 156631, 61750, -64333, 11484, 178852, 68491, -190068, -164841, -126699, 175396, 249044, 41841, 147541, -108052, 173838, 220193, -75125, -233572, 203586, 86493, 130285, 70740, 210681, -239204, 64411, -71427, 139839, -14964, -65051, 108363, -256847, 230064, 181167, -248359, -129532, 255386, 156324, -88470, 223013, -178757, -244450, -16221, -6183, 146381, 165559, -130197, -89755, 208861, -81239, 191981, 238140, 21501, -248309, 113408, -209353, 132943, 74744, 123300, -120848, 43670, -234471, 177471, 174316, 233247, 15641, -57358, 76209, -136959, 215270, 226533, -147726], -[28984, 175536, -87316, 60148, 132601, 8378, -232208, 165555, -18592, -34076, -146289, 58514, 190092, 174975, -60855, -18772, -80721, -33760, 104301, 40432, 215178, -107064, 108065, 83384, -151130, 21721, 204823, 7114, -167573, -87795, 222662, 236171, 225291, 46453, 91651, 12492, -122713, 218943, 202570, -118015, 108001, 88580, 114580, 193794, -255841, -196444, 215161, -205757, -243208, 139171, 236092, -68109, -242192, 164686, 83653, -166802, 199904, -182597, 171739, 9698, 179616, -40770, 94774, -80012, -220168, -238430, 74086, -246388, -35375, -242146, -232981, 115990, -23766, -133351, -202391, 200073, 96191, 36571, -148280, -63047, 227400, -172018, -196005, -109087, 145103, -35222, 37875, 72598, 81720, 63289, -254083, -184696, -123540, 171826, 217793, -237265, 166603, -117192, 126467, -206397, -112696, 116605, 207760, 225299, -811, 261475, 9787, -122248, 187604, 203160, -31336, 53093, 75332, -199286, 64984, 116924, -258758, 49637, -148454, -203703, 190879, -200132, 167776, 104541, -184229, -3614, 169864, -252942, 248704, 188885, -197651, -180754, -162515, 164806, -35855, 133234, -118614, -130836, 58947, -226097, -169393, -24185, 249228, -209576, 108678, -259331, -9913, 44129, -177477, -111258, -133071, 179510, -194953, 71169, 94327, 225322, 77045, 157035, -50679, -256060, -116284, -74554, -24173, 135876, -176616, -143908, 229217, -250949, 236652, -217471, -239970, -104064, 122411, -214420, 119905, 159181, 252273, 141969, 156808, 178699, 19668, 65796, -208335, -117105, 132400, -56847, 45905, -55973, -220313, -70116, -119880, -1727, -180339, 165864, -48843, 53241, 261796, -14994, -200906, -78909, 30164, -169867, -150514, 70915, 216747, 193644, -202045, -195365, 176650, 83469, -159918, 152240, 84209, -146776, -124953, -16862, 160453, 50540, -164289, -153342, -146, -51149, -167124, 63990, -3702, -168007, 73493, -148007, 56643, -183679, -23103, 131775, 116995, 21391, -249244, -128794, 24602, 34179, 18257, 138592, -107374, -39815, 11657, -112429, -130040, -2683, -78667, -194585, 56822, -44876, -118640, -58514, 135531, 183187, -122809, 228816], -[63803, 239995, -153168, -86729, -125026, -106929, 212490, 32212, -74035, -7515, -179012, -162931, 101466, -188732, -190169, 220315, -48773, 159859, 48471, 68214, 1925, -122011, -213718, -181130, 136218, -241862, 78461, 134463, -135724, -37521, -56208, -104785, -101470, -239931, -105760, 240149, -193389, 15559, 186882, 197836, 52664, 217614, -235160, -39196, 183181, -33970, -67310, -87870, -27355, -97805, -251728, 230146, -245564, -94438, -92702, -257460, 19746, 204288, 31205, 195333, 102045, -207521, -91856, 200295, 64753, 74658, 235912, 223496, -232817, 55169, -91034, 52416, 114896, 170925, -41183, 13703, -193018, 256243, 242497, -84396, -39034, -22040, 62460, -27732, 53005, -220262, -85561, -132343, -68352, 197663, -209901, 224942, -78552, 54807, 199613, 95663, -172161, -60723, 171684, 145189, -192527, -175029, -168368, 45852, 158187, 59685, -112406, -174005, 154489, 215627, 115096, -12569, 243966, 60745, -172890, -14035, 130802, 194909, 234605, 133047, 116349, 243490, -125217, 97368, 162330, -87862, -54236, -188124, -138311, -220380, 256730, -66201, -61123, -198267, 137962, 52564, -171239, 31223, -172555, 125377, -77556, 139476, 261418, 260510, 207000, 88162, -145522, -233342, 81434, 34092, -156591, 88410, 48703, 187086, -177864, 192505, -185968, 87034, -105410, -41078, -70814, 67545, 63723, 56505, 115909, -14444, -191680, -212107, -20912, 191259, 129352, -238304, 12986, -24629, 220084, -120074, -228225, -115123, -208167, -135738, 39424, -121002, -157538, 175176, -160054, 104810, 186563, 29657, -177649, -323, -2869, 64182, -99564, 91289, -87955, 67090, 53177, 94591, -214885, -26224, -202273, -163565, 254495, 181548, -54281, 21530, -62292, 232579, 158508, 129625, -261473, 115684, 224514, -145060, -18153, 69366, -14863, -35585, -178209, 111515, -235321, -67978, -54003, -163866, 29514, 60577, 193374, -96620, -260087, -176740, -145037, 136670, 255235, 151430, 180259, -48831, -117710, 12792, -138784, -248004, -169590, 87706, -33490, 205419, 35597, 161236, -58759, 246819, 94566, -231297, 225330, -228650, -38340, -93193, 106254, -201297]] -||r0||261796, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-201659, 229740, -289229, 503274, 84816, 517884, 16167, 90087, -109900, 112949, 202968, -117516, -224481, 279096, -288761, -86933, 204501, 292285, -312247, 520445, 439706, 218627, -35448, 265158, 467161, -91174, 368895, 37966, 223046, 320840, 164436, -488084, 183244, 469942, 311465, -448812, -33067, -184833, -348036, -213874, 167541, -257506, 331600, 72590, 227101, -512223, 521095, 278087, 138476, 317084, 217401, -111427, 234829, -151377, -154908, -342852, 467432, 96856, -455255, -509601, -225181, -143053, 460649, -349841, -419978, -437576, -404490, 251362, -160128, -163652, -34510, 64654, 425122, 184046, 316785, 512956, 104531, -133267, -349173, -255563, 222630, 75631, -144475, -7100, -312909, -298932, 121645, -1739, 332421, 18841, 128410, -238160, 208459, -332647, 50428, 501935, 479505, 252718, -465651, 257395, 407311, 440348, -264081, -435714, -105048, 179561, -505697, 466770, 149208, -137405, -42308, -376585, 379015, 455655, 384850, 363184, 473646, 314608, -158284, 3898, 88338, 121357, 254585, -287009, -241031, 94707, -117977, -272274, 493095, 240769, -41707, 196490, 131270, -414862, 42571, -420711, -509561, 333979, -260690, -92932, 84010, -529, 513238, 253566, -401496, -315195, 131243, 348264, 387908, 297975, -176215, -77614, 103126, 84924, -217242, -447481, 473872, -243177, 394754, 492932, 248866, 95102, -24539, -483413, 13330, 408361, 417259, -6440, -161307, -17907, -491832, 237860, 16252, 14044, 384936, 141369, -181430, -334826, -492896, 273887, 451194, 134742, 411814, 125843, -251462, -40951, 406062, 463936, 86861, -240993, -61697, -345288, -18419, -1356, -57365, 358931, -137431, -317374, 343952, 61304, 516496, -89316, 85725, 65555, 82526, 210827, 291987, -4362, 46314, 385956, 269467, -399359, 265438, -412133, -36691, 230109, 167614, 369617, 71190, -323474, 519336, -285657, -493682, 362212, 347740, -102580, 370409, -135199, 345549, -58068, 222377, -77605, 27025, -198951, 445486, 7312, -268982, -315259, -350608, 272588, -306991, 135089, -392227, -264903, -146270, -422824, -354573, 167892, -144700, 102116, 75942, 293773, 442686, 53561, 9858, -240860], -[-515501, 346309, -172582, 194577, 173809, -327457, -370432, 35015, -389206, 4372, -110715, -273189, -519288, -237620, -411200, -262495, 439556, -207719, -142128, -112968, 103289, 246777, 478068, 345610, -83834, 429054, -396320, 513815, -336022, -62017, -135023, 519757, -202461, -56804, 3201, -414599, -90561, 492805, 259405, 492812, -404228, -517464, -376268, -323569, 71086, 295900, -250796, -411894, -469900, 473416, -2972, 402420, 126054, -88501, -326112, -174759, -48805, -170192, -521660, -19306, -490578, -225049, -456096, -500584, -1025, -485877, -385770, -139582, -267609, 440521, 16771, -518999, 214224, 432368, 233216, -410260, 508371, 183945, -512666, -45493, -168624, 117459, 261109, 346821, 15821, -316780, -402643, -293594, -481379, 417518, -442395, 246667, 374132, -305, 188858, 42550, 515750, -469240, -113643, -490026, 465250, -114127, -178884, -94953, -72637, 468932, -387715, -9853, 288555, 155239, -44306, 405220, 201583, 355048, 464307, -1308, -473833, 498969, 252050, -286784, -321173, -153244, 390653, -273595, -41230, 140620, -209204, 296590, -110146, -302107, -86322, 481385, 346588, -314756, -281504, 407780, -240305, -423112, 3924, 23429, 175075, 509423, -350998, -245191, -197130, 203387, -420308, -280923, 234920, 148185, 314523, -435385, 251111, -230943, 146154, 484950, 356547, -404636, -207193, 459093, -294950, -70761, 508483, 458106, 39679, -246582, -104681, 131801, -239237, -406584, 17529, 344756, 191711, 342453, -138799, 84022, 196017, -308863, 189816, 322569, -141330, -357580, -132626, 497499, 460937, 290752, -403319, 65490, 112896, -423594, 239250, -66309, -7802, -444124, 496133, 103565, -56859, -68234, 121156, -264502, -50995, -471, 26229, -149371, -121463, -395296, -513981, -149695, 162498, -305135, 448968, -474374, 5446, -201329, 306442, 56524, -451887, -301860, -26297, 65968, -489049, -365359, -460769, -454171, 300486, 60393, 448526, -346039, 51113, 435078, -207628, 289580, -160294, -25377, -448152, -58935, 340437, -39091, -127360, -226652, -233595, 521881, 520688, -54787, -230059, -351823, 384575, 376230, 66157, -132946, -507678, 182809, 419984, -188165, 130212, -458252], -[411033, 118432, -57884, 34774, 246514, -227729, 15408, 145618, 364149, 247840, 153092, 178403, 186981, -232581, 418980, 82216, -142006, -212994, 509863, -244214, -190796, 418035, 198565, 5382, 516419, 484689, -384467, -463227, 253180, -419693, 68434, -388968, -484828, 59019, 326624, 481660, 326047, -154838, 417907, 524126, -411030, 189968, -100540, -295221, 38880, -45614, -412923, -512812, -479096, -470766, 13637, -329463, -192134, 259632, 432612, 495344, 402214, -339079, 254688, 82490, 420949, -166964, -323505, -137427, -315502, -453798, 370987, 119337, 594, 431664, 523413, -273301, -256719, 350034, -264028, 442233, -138445, -3467, -198372, -296872, -367313, -255379, 121809, -477573, 102594, 223984, 269461, 72352, 337886, 16840, 462659, -115651, -170604, -32826, -380343, -98747, -38764, 13525, -493252, 178582, 355518, 346687, 332743, 415898, -285329, 144269, -54341, -56600, 222251, 124168, -420683, 324252, -25364, -7908, 509748, -153549, 388914, -51504, 372196, -198463, -514683, 411517, -85189, -179306, -37210, -7697, -348356, -129239, -266376, -88512, -452412, -335642, 217222, -122377, -261918, 103750, 70901, 82064, -380226, 31158, 134305, -130158, -454350, 196976, -423143, 96116, -68269, 504546, -181863, 521129, -158347, -46320, 176450, 410792, -259645, -37442, -478990, 167910, 105075, -50124, 213123, -230739, -493927, 203075, -62435, 491585, 52739, 446730, -510208, 51132, -401865, 205905, -168189, -287107, 17643, -108250, -42578, 237207, -108563, 150092, 340306, 112137, 416998, -169624, -201434, -512323, -331413, 421710, 23687, 296282, 160085, -250348, -10720, 339738, 154740, 264835, -82649, -507130, -424360, 476617, 62667, -433281, -425284, 391562, -371709, -57226, 307686, 132939, -326852, -36645, -34853, -145380, -332928, -416376, 462910, 20607, -127756, 72365, -66925, 62221, 204066, 451869, -111511, -226332, 296991, 153791, -348427, 307526, 318900, 198342, -81985, 276858, 33739, 385273, -465589, -209783, -148987, -422391, 90747, -310702, -335003, 472884, 344746, 454425, 205883, 226155, 59846, 23937, 227478, -64000, 112712, -139939, -423364, -278396, 93196, 95316], -[-425071, -8091, 334999, -479272, 420084, -283704, 150359, -269268, 265777, 221248, 418196, 261692, 391693, 74221, 182521, 124165, -366079, 225185, -388335, -396847, 234570, -357224, 202095, -64214, -124896, -517184, -362505, 57939, -361678, -489006, 263464, -122222, -493340, 322832, 135060, -370434, -515933, 414386, -241514, 147337, -262802, -80027, -38328, -297533, 182202, 221540, -332121, -443994, 275349, 241654, -32329, 503036, -87898, -287606, 448590, 20338, -142985, 140057, 501440, 231800, 89043, -56305, -309722, -273893, 64633, -97184, -242992, -329749, -356018, 394235, 124576, 33692, 389391, 267974, 4024, 440845, -332911, 17955, -252793, -216550, -162012, -83071, -115328, 459881, -160733, 216041, 379620, -45847, -190146, -326771, -215241, 200239, -57787, -224485, -168802, -223049, 217635, 497, 18775, 494926, 308847, -32661, 190271, 82666, 495047, -638, -74378, -485104, 269862, 495772, -341072, 315986, 84735, -59161, -285336, -505850, 292053, 447796, 84345, -142942, 394751, -313697, 409367, -89913, 71078, -113094, 36622, -468109, 314310, -111276, -184116, 441546, -486093, -75852, 286491, 43088, 168440, -333203, -439207, -458230, 265818, -322330, 421142, -424598, -385458, -237753, -192738, 223487, 169610, -52345, 78504, 445920, 300053, 121483, 262218, 415396, 13156, -76841, 513353, -40808, 304180, -518324, 142037, -339943, -73758, 517122, 107363, 437957, -96907, 100991, 385583, -159327, 43247, 158418, 505838, 437484, -252596, 28232, 500990, -321787, 86851, -73153, -253122, 435633, 402902, 265616, 409928, -72071, 335293, 155156, 106505, -10697, 312157, -198576, -445426, -210563, -247360, 108330, -128463, -224643, 177232, 198164, -381344, -255563, -141387, -415297, -63248, 438630, -79275, -268761, -459932, 519093, 310487, 373144, 438663, 16412, -22831, 447620, 155966, -128876, 303517, -343536, 218905, 95404, 403651, -50822, 342365, -368772, 168362, 51085, -173147, 37026, 379257, -193014, -187572, -147009, 381901, 235964, -281709, 456298, -416998, -29703, 402527, 164121, -198608, -141667, -376664, 385219, -396954, -334223, 265089, -30869, 197358, -83261, 483978, -471398], -[303224, -11846, -510477, -160274, 273368, -108071, -132161, -384581, 78928, 461825, -21469, 293493, 397455, -329275, 480596, -204583, -212077, 441036, 234681, 44858, -517993, -506701, -69149, 328241, -355204, 332661, 438134, 267291, 243178, 270003, 500558, -104068, -301510, -277056, -289963, -279456, -119438, -521855, 481448, 124944, 76312, 181477, -152807, -338064, 111796, 222159, 27095, 487843, -200572, -432043, -193271, 502598, -404451, -483015, 46206, 151805, 66390, 192104, 104579, 160330, -405093, -201744, -95001, 370515, 427500, -88233, 171615, 471014, 407619, 299505, -279593, -147844, -275594, 137893, -384383, 111392, 448054, 310464, -173102, -129940, 518630, -14594, 262644, -150986, 314484, -352108, 460227, -397517, 12792, 275860, 6134, 420029, -260968, -63378, 196191, -179423, 263757, -354945, -111969, 125171, -380705, 498352, -337991, -138556, 50141, 394826, -98621, -491095, 211042, -256989, -448812, -28188, -395830, 223650, 473431, -245284, -331218, 153049, 133138, 298992, -295320, -12070, -34584, 109623, 10213, 7583, -152235, -188333, 471646, 349392, -517510, -503746, -430786, 339513, 301593, -167466, 277483, 305255, 59338, -232125, 176824, 138790, 424600, -172424, -312713, -313529, -269850, 417658, 19770, 303356, 20500, 145603, -280293, -160031, -286632, -337408, 257558, -329590, -197557, -409330, -420878, -384710, -250806, -42913, 374915, 281594, -284199, -64458, 506084, 373239, 22005, 350796, -230311, -494470, 99493, 426748, 509137, -201552, -214414, 468608, 89778, -115848, -507684, 186442, 263324, -342686, -456805, -427199, -193895, -92805, 351209, -199074, 488975, -454915, 470212, -493062, 328933, 72208, 283579, -215771, -118915, -231259, 207755, 325586, 127630, -204627, -496230, -518914, -387379, 362419, 349829, -467391, -132512, -351724, 36185, 74521, -119374, 220487, 185920, 340677, 336479, 28521, 408982, -161480, -343248, 410824, -132082, -314457, 483277, 20392, 468983, -164621, -327367, -84924, 216648, 274337, -120834, -29557, 264169, -469414, 3111, 73204, -331130, 23389, -451608, -178575, -269680, 62829, 77172, 61557, 228320, -123969, 313320, -368695, -327547, -220570]] -NTT(y): [[7201786, 3449281, 6254867, 7825074, 1977123, 4799821, 5280827, 1894196, 8075650, 1657711, 5385752, 464853, 3813041, 1386845, 5691517, 2429777, 338890, 1263423, 5595470, 989811, 1408917, 4020424, 5403566, 683218, 5069632, 3181584, 840539, 2848374, 3031638, 4932898, 5523990, 572309, 8116844, 2751207, 1155868, 6295581, 7962798, 7552812, 2175641, 3270519, 3080919, 2651632, 4850794, 5629766, 7808423, 7907419, 3559437, 5411863, 6218969, 2341330, 4938141, 7332802, 5063123, 6308688, 5856207, 5983098, 6594913, 3054589, 408386, 4197788, 7469829, 724600, 1556506, 2000487, 5592277, 1201186, 4718137, 6029983, 8078956, 199587, 5122732, 1620705, 5242017, 5917, 4778240, 426494, 8366706, 1587007, 7837995, 1745822, 7702228, 4858631, 7952457, 6136782, 2253819, 2288240, 7062780, 4985033, 7716891, 3979764, 1661825, 3337126, 3836662, 3820071, 2923422, 3103472, 4042682, 7840413, 5753568, 4981119, 1606332, 5118455, 1687028, 4496189, 7400673, 1265544, 7805232, 6367198, 2540037, 4038887, 7827248, 4235184, 7783000, 694763, 4943664, 8238988, 1692300, 1717700, 8263657, 1327159, 2035981, 2672379, 5718135, 4607729, 8224545, 1379294, 7332671, 6519504, 435524, 1270912, 3738351, 5618172, 4077808, 6533147, 6710266, 5381879, 168720, 5385305, 2779134, 4583664, 1977865, 449081, 5694377, 3858033, 4698470, 8148545, 8119587, 2707017, 2803461, 122710, 8269457, 7762215, 7255170, 6129851, 6793552, 4710461, 7057695, 4756773, 6151506, 2598785, 3026059, 5338152, 3723084, 4761812, 3397330, 3035310, 8012796, 1682940, 2575908, 7636556, 164653, 717407, 1062269, 1748354, 7862856, 5434719, 2115309, 7415000, 3617008, 3713693, 767985, 5829947, 4801830, 5866644, 155647, 1983136, 6188716, 4382035, 1664617, 2563901, 1794840, 5065702, 2288878, 2432434, 2091993, 2336768, 3752205, 3705917, 453081, 8216529, 1702698, 5771096, 2935085, 1199278, 2067156, 8274276, 6402682, 3208619, 2625573, 5655829, 515148, 6689934, 6794230, 6373879, 2370446, 3285489, 4510339, 3406489, 3306611, 5418705, 6376114, 1622818, 888784, 2697530, 5937866, 2075805, 137942, 5172873, 4045317, 6612000, 2645903, 5678287, 2200378, 4377519, 6281484, 2681103, 4896601, 782622, 482355, 4321008, 4546069, 5192301, 7095978, 2402448, 7835100, 698915, 5753881, 5556028, 1308253, 2935783, 3813333, 5233827, 3368811, 5346022, 541146, 549056], -[6864270, 3414693, 8331767, 5615313, 7552214, 4809747, 1656411, 1300679, 6283763, 2203957, 7074871, 1676236, 301189, 2528813, 1633515, 1126621, 2613931, 8241862, 4804203, 7282380, 6151261, 5277303, 5515764, 2487850, 4888420, 5677478, 3371228, 4962627, 5113784, 3474961, 7099541, 4137740, 319294, 2051532, 4554803, 1785013, 359976, 3078960, 6516509, 2919388, 6845220, 6993135, 7022434, 6401006, 8190537, 458086, 7863814, 1133414, 4918678, 2716050, 6526422, 2306407, 626937, 7480737, 8064153, 3136431, 16971, 3420629, 4966268, 4287154, 5273403, 622838, 7845071, 727786, 96951, 7435128, 1218311, 5365163, 4715228, 6641653, 1462574, 7543400, 4652219, 4120798, 7421376, 1496821, 6543187, 3921637, 3726581, 6741272, 4953647, 7537687, 603506, 4744983, 6921533, 5208620, 3117085, 7361010, 1382490, 5180546, 2959796, 1652715, 8266681, 2088017, 1028350, 4370407, 2349226, 2050778, 4668658, 3383802, 2286225, 188036, 4772094, 8128911, 5816663, 5348967, 7625840, 1983213, 4855394, 2579518, 7363338, 2248636, 1814008, 978191, 8111079, 4179578, 2355142, 3390578, 7124314, 7421634, 2275415, 581064, 5897167, 1942433, 5575191, 108743, 2643397, 3561039, 7199158, 5399256, 4558366, 295499, 2208035, 1920857, 4671950, 5722669, 3510996, 10010, 4890474, 7522381, 1545259, 3641956, 213304, 6186841, 6317254, 7400069, 2653880, 3534443, 1002978, 8078666, 4413140, 783329, 2655104, 6912459, 5488857, 6051380, 5588021, 6897370, 4723543, 4931993, 7303180, 725425, 7081262, 5271010, 6691976, 6553641, 1099861, 6703825, 6113940, 1896282, 1635285, 7755885, 7617091, 6858199, 522467, 7033647, 370051, 6321469, 4000388, 109160, 2443332, 8163639, 3421161, 6450237, 5059172, 643704, 1926585, 941005, 5316184, 6255637, 5145989, 8304455, 874182, 3500745, 4485724, 3889902, 1751629, 4814079, 4007110, 2697585, 3666546, 2203132, 5665126, 6559981, 7091863, 2987883, 7595314, 5938965, 7970128, 4924444, 2752390, 815046, 552517, 5095443, 3068787, 8208054, 2100035, 3369128, 5590526, 1637343, 629381, 4068849, 662948, 3791456, 6577310, 3118335, 4172676, 6042490, 747083, 6641445, 1355208, 917017, 5609143, 127909, 1668513, 3865340, 2633474, 617031, 2639242, 2511919, 6833086, 3817741, 16493, 6016056, 4231696, 2778162, 1490399, 5441461, 1075825, 5267768, 4763173, 320874, 7916691, 3608943, 888693, 3337371], -[7247850, 2613821, 2753489, 2343097, 1207791, 3685947, 4828903, 7068786, 7658406, 2863104, 2567811, 5124603, 5176069, 7541964, 7457003, 879645, 425622, 7292789, 7893679, 5803915, 3370732, 6813799, 3653211, 3158167, 8076440, 3299003, 110438, 6814221, 1112684, 1997974, 1383670, 7836223, 5252264, 4965890, 7723591, 6507585, 6557865, 553622, 5342562, 1665156, 2497566, 4822774, 1367078, 698932, 5511982, 633196, 2698847, 4289686, 3489438, 2608624, 413481, 2327085, 3199655, 6128510, 241606, 1755723, 5933057, 2407993, 315171, 7277939, 7409161, 3646630, 2607946, 680711, 7738547, 907360, 2052037, 2957383, 3456957, 2164678, 2326591, 7239266, 2921858, 430009, 6000572, 6824523, 5023819, 5082664, 3606696, 7224344, 8186304, 1149529, 5524234, 1155209, 2338712, 3342099, 8355078, 2263193, 574521, 3331738, 2373094, 4840479, 8075946, 4801261, 3859240, 2420920, 6164906, 322966, 6246488, 2294947, 987465, 5000303, 2769479, 3819213, 636831, 8233358, 5312923, 4422607, 4616278, 1288490, 1382599, 566121, 6160127, 5297727, 2505857, 4712532, 1891141, 6653871, 1892775, 5333375, 7568530, 869859, 2216609, 3638869, 6489286, 1707300, 3118816, 5786258, 8076658, 5388235, 4133674, 2700677, 6693302, 2090269, 805356, 2499184, 6555591, 7325813, 5523402, 2690449, 117031, 3942522, 5402337, 203511, 8031678, 331126, 2165888, 7116626, 762212, 6329854, 4771340, 3445735, 2786013, 2941216, 6337539, 4449199, 8310004, 6046744, 2937380, 1397275, 4069817, 4666879, 1402663, 5648913, 4064332, 1513262, 5575158, 6998542, 5532954, 6631341, 1527544, 7816041, 2084402, 1768701, 1980766, 2027818, 2623653, 8238148, 713743, 7897386, 5669796, 7355960, 3509944, 1874023, 7838819, 2966097, 4322347, 7259048, 5423024, 7124972, 5167326, 624469, 1543660, 6200163, 4017861, 8226815, 1714147, 7909922, 4538588, 3110782, 813087, 278574, 2466134, 3259785, 5022099, 6195271, 7292277, 6667135, 5109944, 8266969, 1483473, 3444729, 2699417, 5072380, 1077581, 7886265, 6906584, 146520, 2415592, 2238455, 6842506, 1690613, 1181482, 5840650, 7229107, 3227835, 4826826, 6862353, 6104021, 8274708, 737353, 4827480, 7173943, 6581144, 4716537, 1934884, 4463675, 7737257, 617928, 10302, 1502478, 1920135, 5813403, 4770348, 1320439, 4111106, 8011522, 3877058, 2345418, 5588053, 3761994, 3852565, 4865217, 3354733, 6976999, 600194], -[973664, 3620268, 6465262, 4088998, 1225087, 7325921, 4883140, 1708371, 1129342, 5289567, 6585594, 8168700, 113682, 553667, 2224050, 7132790, 3174308, 6076626, 828372, 5077069, 2962260, 2417472, 1333796, 3297368, 3203725, 6329502, 5572764, 6567498, 633125, 2929555, 6484640, 465396, 4684113, 1027408, 6488665, 664505, 6347721, 3348625, 6651416, 7841774, 5549182, 7468420, 8137284, 2838361, 5842407, 6744813, 965575, 925640, 4078958, 8051261, 5520185, 4282074, 593245, 5881326, 717367, 2006993, 2156776, 7438868, 266290, 981094, 3549547, 3897443, 4962319, 5909675, 6907269, 4479713, 5561761, 1189819, 1632626, 4493705, 6223927, 5670737, 4657054, 2401868, 5762700, 7992676, 4496072, 6802854, 471145, 5974944, 7741281, 4685111, 1465478, 4833873, 2772420, 4566317, 7168217, 374281, 6615326, 3143718, 7506070, 5232536, 3945832, 1948181, 6003675, 3270537, 7255204, 6875089, 7972342, 1292542, 8130857, 5274548, 5965615, 736192, 1809441, 8008221, 5001018, 1558062, 4905031, 5659808, 5256396, 1454565, 3613820, 2830673, 4712145, 4282008, 4185050, 1671280, 1740807, 3284055, 4876607, 2982906, 1139307, 28814, 3729592, 3930989, 818185, 3332191, 4255281, 6821443, 5829999, 683249, 3335215, 2084887, 4784892, 2997012, 898200, 5222563, 6984547, 7857117, 7840140, 1254055, 2173892, 500873, 7957720, 2560602, 2021414, 3418837, 6168430, 5684938, 4644674, 4433757, 8374308, 5913765, 4048379, 4460942, 5198871, 4605212, 4463852, 7682295, 7139172, 6900251, 623009, 4096935, 1831640, 4320466, 737495, 5555839, 7743801, 7604291, 4115958, 7877210, 1048159, 4453758, 7357041, 2121758, 101317, 5871063, 4698497, 8193706, 5973795, 3072249, 4995669, 2206539, 4228577, 8027258, 6558097, 345323, 8314399, 1854727, 3606869, 7901679, 1636061, 5827231, 6240644, 3107656, 4148449, 87376, 7087876, 6376117, 8371120, 4947737, 3150067, 6395321, 101883, 6047948, 2444680, 2056021, 7337094, 5195116, 820213, 72394, 6591380, 3733809, 1115485, 2508284, 8127255, 833590, 2949183, 6589553, 5948247, 6583239, 4811577, 742610, 6843953, 2599306, 644696, 7611650, 4542889, 7487460, 6562135, 3146338, 238506, 5435648, 3810551, 6261260, 2123905, 6468092, 6372456, 6573557, 2331788, 1148312, 3143103, 7229221, 4162104, 7377989, 5096822, 1711004, 4857064, 5206965, 8245772, 4087905, 7390784, 2752971, 4941804, 8347163], -[2697336, 359868, 6682304, 4510575, 4939464, 5462763, 5009474, 471435, 2074562, 4335775, 5089740, 5577805, 3208610, 2696263, 2270204, 8194282, 376678, 3743581, 2411201, 8368713, 3457901, 5677672, 950168, 363705, 3527302, 5490583, 6516924, 2686920, 1396030, 6850570, 3879675, 5188354, 883124, 1078353, 2347819, 7289875, 1549916, 2556252, 7264835, 7899605, 6463501, 2080521, 6680465, 422772, 4210112, 6972914, 7138639, 109710, 5354813, 5881572, 4304970, 276344, 4901196, 4732868, 2743601, 1657321, 5020124, 2698173, 7208824, 2783711, 6719731, 7729534, 2631960, 2187699, 1820692, 5798321, 3628326, 5762166, 4275750, 1896030, 3051139, 6822845, 5290575, 1677111, 1610501, 4145977, 7903517, 1892930, 2125869, 7018820, 1066118, 8226501, 5531389, 811674, 3238555, 5936560, 7373992, 984250, 6295523, 3522836, 4239298, 3318262, 7696235, 8106159, 4565067, 4313073, 809795, 4994216, 3286428, 5632584, 186388, 4323813, 1909662, 4294970, 7444269, 3079308, 3480055, 623216, 3133238, 3539921, 8372888, 3392465, 2009332, 643450, 1845411, 6843560, 6527956, 5726715, 7109520, 2871265, 5301709, 7920140, 130307, 7450234, 2136713, 490955, 6960933, 7447170, 81731, 5804, 7829310, 7502714, 4536939, 948680, 5845455, 7432556, 6868247, 5340443, 7796841, 2813647, 4074138, 5779761, 6208549, 6664429, 563015, 6833301, 851779, 1858289, 7042569, 1713615, 1338367, 7754589, 1265735, 8120700, 8037838, 365979, 5652751, 1794454, 3292831, 5790592, 2920917, 6422130, 1352463, 6740790, 1547226, 2931642, 1681875, 348899, 2501497, 7726804, 7403302, 3524164, 55324, 4855468, 5997955, 1989604, 7250289, 7955284, 8297523, 7927323, 5725667, 7531042, 8219932, 7387402, 3564230, 8047569, 6825125, 4110484, 2349538, 5814220, 4399418, 1775668, 5787711, 8214704, 7399080, 1810681, 529070, 4634290, 830235, 3814861, 378669, 1213845, 4763240, 2292847, 7246455, 1150105, 4942002, 2436542, 2166874, 2451277, 7221312, 540629, 3579154, 2417257, 326285, 186876, 204943, 8067931, 1217454, 5435570, 1938599, 1339109, 539608, 5516089, 8166843, 6869267, 2049403, 3476348, 2124999, 4967753, 4318342, 3685562, 7353847, 2174134, 3496902, 7337134, 1690838, 7409778, 3984049, 2663719, 1095943, 8113763, 4059906, 3030030, 6343658, 1479749, 46810, 3953454, 4179560, 7327242, 7102775, 8027995, 6529160, 8248223, 5381176, 4314941]] -aHat * NTT(y): [[2753467, 534002, 434232, 4629917, 6092653, 6639983, 1250047, 5198985, 4438424, 6857051, 3668735, 105930, 2942107, 6104815, 3974798, 4011330, 4681128, 2559533, 4685866, 6153268, 2161780, 2860413, 1851559, 7948271, 8117305, 6195637, 3308465, 4779338, 5355243, 3844524, 2532208, 7500516, 4907650, 5977554, 7375693, 7127481, 6236002, 274693, 2294707, 2436618, 4507698, 7410294, 7847962, 2330093, 4002324, 3757820, 4377057, 4136729, 2249176, 1135239, 8282179, 6514350, 1286807, 2627793, 3386333, 5575744, 1436715, 5530259, 6849224, 7634436, 4658570, 5718651, 6546431, 7876447, 5648046, 2689976, 6565108, 3154699, 7372778, 2888577, 950962, 6596899, 4336771, 2778015, 1480608, 6227488, 5530148, 4215808, 6986830, 50306, 2430487, 2856715, 7120910, 1871196, 2933258, 7446308, 6732965, 5199214, 4490028, 1244830, 41126, 7437890, 2519834, 6202734, 3325133, 566399, 4499969, 8237112, 2731190, 2530918, 3036669, 5311151, 1542648, 6249693, 2861495, 4916165, 6300228, 7497608, 8309932, 6156321, 6487400, 8327638, 7371298, 5424612, 6663867, 5772210, 6629827, 7539007, 2514193, 5562023, 7068332, 5303117, 7707994, 8223, 3795723, 5478086, 2137588, 93822, 1638104, 1465221, 7329361, 1972062, 5138414, 4211961, 4468265, 4725477, 2651418, 6637244, 7985113, 4812949, 1271749, 929771, 559301, 4279472, 5629917, 1447503, 5998389, 2770958, 4641474, 6539054, 2659349, 1682418, 4441221, 616937, 707497, 5214798, 378973, 8098583, 7106900, 6398910, 6623818, 8358923, 6151615, 5488269, 4136087, 6478273, 3235936, 7798343, 673073, 7892010, 6327852, 4935689, 8115877, 2303200, 5632340, 3259233, 2615181, 1081444, 5918146, 3063766, 4188473, 5842080, 5811085, 327900, 6022066, 1763251, 3531723, 8358090, 3722438, 8351298, 6372689, 5875442, 1306913, 304229, 6166906, 7533690, 5513354, 5582126, 4376451, 3772240, 628409, 2377193, 8217663, 471967, 6283520, 4328352, 3835854, 813033, 1971779, 6443521, 848918, 1080191, 6969128, 1551203, 8259411, 1348926, 8327031, 3032129, 4785903, 6622204, 2691066, 1681069, 2286357, 2743601, 7624918, 7086407, 5473655, 290366, 6986130, 7944357, 6743012, 1051970, 4921902, 5626124, 1390814, 5606460, 6807058, 697693, 5992676, 4782714, 8221901, 4362453, 5408031, 2774289, 673142, 4562880, 8052447, 7726373, 8120915, 295912, 1051978, 4915487, 7957334, 4960889, 7380012, 7136705], -[7846773, 8162709, 8347187, 2063015, 1196673, 927161, 457152, 7553436, 5829571, 6986333, 6930569, 6731329, 5459988, 3942283, 5056821, 2774786, 6382794, 4548843, 5579897, 1056468, 846550, 195332, 7255290, 4221574, 5879568, 1693398, 963332, 4557934, 319504, 5698569, 1305516, 5230156, 6319514, 579159, 1528273, 5039317, 3287243, 1242787, 3397751, 4338213, 5640747, 6094696, 4381940, 6979513, 2743137, 4413422, 5378724, 5102355, 4353759, 4533942, 6754445, 7040408, 2241045, 4343392, 1647365, 4924843, 7820145, 4489397, 425347, 1823287, 745703, 1678346, 6811372, 7120690, 2369501, 2388826, 2260003, 4327180, 300116, 6108021, 6150586, 5484511, 3094553, 2645319, 162483, 4857690, 2006187, 2696197, 4983778, 5066142, 3089771, 1723080, 4299276, 3158842, 1208044, 58855, 131303, 7443525, 8180941, 223760, 1546883, 4695417, 3386409, 4610295, 102481, 869404, 2543051, 6350514, 3719013, 432148, 3876593, 700388, 7670197, 6314661, 7895188, 2192888, 2695537, 944940, 5469811, 5468504, 2766551, 4485943, 5911751, 765811, 2128993, 6050795, 63061, 3918430, 527273, 5626711, 5811825, 4094318, 4326925, 2047481, 7870587, 6089178, 6489393, 3785683, 3747740, 4210189, 7462417, 6370575, 7977048, 5247498, 147425, 15388, 7484408, 5897489, 5020674, 7632660, 2222486, 137875, 133331, 4536602, 660079, 82485, 1596064, 1003485, 4884695, 1967000, 2662850, 5230528, 4177034, 2183479, 7184697, 4101751, 353670, 4804217, 5688201, 3753395, 7349253, 3732339, 2770808, 3167477, 5428350, 5954990, 4134012, 7257936, 6945066, 447801, 7984599, 5041851, 2733024, 4272310, 2524029, 7560293, 7791760, 5658663, 7991654, 4370799, 3264101, 6411492, 4976112, 2471521, 606635, 5897965, 1291437, 4374075, 4693067, 6551526, 2566106, 7564658, 8304978, 5766003, 3057545, 3557167, 559327, 6611804, 6473956, 6270029, 1478165, 7574026, 8122177, 8005961, 3184129, 6882752, 933227, 8245873, 6190415, 2027754, 3216766, 6806951, 835660, 8129354, 1861489, 4096193, 1238455, 7670979, 762879, 185135, 4680821, 5893022, 3220010, 8229022, 4045031, 4072110, 6693702, 6059839, 5381035, 7590539, 97574, 8194802, 49736, 6411776, 6409640, 5531343, 355885, 5453374, 4955492, 5853115, 4819192, 2653370, 3398700, 3061506, 5571809, 2379084, 5884486, 6254662, 1362666, 8308299, 1978282, 449217, 3020366, 7641244, 6805872, 1712259], -[3601708, 1994715, 7241695, 6829094, 5880280, 6560843, 7196209, 2401869, 8152980, 214553, 2673432, 5451308, 399926, 2011330, 7562730, 5079233, 2925733, 3174912, 3328379, 6740019, 7730307, 7161628, 6032272, 3100783, 3446394, 4875725, 108911, 8273002, 4416413, 7879767, 3553955, 7454951, 993064, 7307133, 2907518, 6040241, 2279431, 6874393, 6764189, 7249798, 3349815, 589720, 4581831, 7121860, 8010918, 1127888, 6557982, 2506266, 7285941, 7644821, 5600421, 5739867, 8310486, 1891023, 3951662, 5642047, 6950383, 2851922, 6068222, 6489472, 6789928, 6421432, 7213874, 4358981, 8240568, 5611936, 3288902, 2679347, 4901585, 8175885, 4543325, 7242096, 1648109, 3963145, 106460, 1354320, 5440525, 2030561, 7507826, 3890832, 1579421, 8259196, 6166691, 5375662, 4421256, 2067801, 6818147, 1158340, 6937941, 7440494, 4451668, 4880725, 7079745, 5809160, 6083203, 2637931, 2086, 7858550, 7999020, 5805350, 540099, 8174679, 2224986, 2051663, 4747334, 1962946, 3939689, 7113804, 5976736, 1739661, 899549, 4470963, 2110255, 5334579, 8152121, 5060715, 819385, 3971676, 7780412, 4953980, 839552, 7651423, 1149519, 6675888, 1681861, 5526789, 2527593, 4678796, 6484160, 6435191, 2840097, 5114589, 3968689, 1292601, 2193905, 3138113, 3510916, 6593313, 382748, 2638276, 4831607, 520664, 411293, 7864577, 3972692, 5958299, 5212908, 5392628, 3850844, 7649981, 2081119, 2028025, 2213167, 6904375, 1165860, 1302905, 6712478, 4417226, 6689060, 5105791, 2130981, 1951822, 4115427, 8371045, 3466713, 5634739, 5676818, 2681761, 2283829, 5763899, 5071196, 6564657, 4892674, 4081600, 2127310, 6714530, 3256318, 4902023, 3911117, 1779208, 400663, 3827454, 3992220, 2101359, 1506073, 7201125, 5417283, 2203803, 1262258, 4139778, 271047, 4367666, 2260375, 6080926, 5823981, 2556633, 3105432, 4791828, 2707050, 5958155, 3956308, 6571850, 5165587, 6425200, 3325748, 4825662, 4335842, 7887365, 629137, 7542913, 7453015, 4589811, 8283281, 3036367, 341702, 1505867, 7450041, 7390832, 2645941, 798216, 2384848, 3483028, 5424462, 7569725, 5178226, 7886996, 3542793, 7565015, 6481139, 2372983, 1361670, 7047947, 1362557, 660472, 2152899, 6904483, 3838188, 2482476, 5680270, 305637, 6048625, 2347105, 1152057, 8013717, 3060628, 1643826, 2535233, 4259430, 350377, 2444443, 6199556, 5131144, 4828476, 6495968, 1306105, 3155761], -[3918565, 5971241, 1764749, 5338358, 7441993, 5773952, 562790, 6160104, 23542, 944781, 4941628, 5549968, 265384, 7329394, 7277009, 694316, 4622898, 6191746, 5927354, 4701758, 9898, 2798613, 904240, 3592583, 4508025, 6424837, 7091428, 5809992, 6321607, 6294948, 1588464, 1767958, 2266526, 5066598, 628971, 1528704, 3988719, 7675621, 1924701, 956201, 5894487, 2202967, 3721426, 31576, 2296753, 7289878, 2654334, 3097573, 5849876, 7334873, 5787258, 4144285, 4635310, 685606, 3994332, 3133928, 7795521, 2341525, 4188412, 6988048, 7440887, 1888581, 5958595, 4682223, 493188, 6388696, 5161371, 7322606, 961411, 3335760, 7344158, 456305, 3132338, 805085, 6995013, 1779019, 7439219, 2654111, 3469301, 8289304, 2526903, 4056502, 1127740, 547309, 2251974, 6459039, 5192796, 2672142, 4123288, 3696083, 5178942, 217058, 3797925, 6344251, 1059981, 382460, 4562194, 1740332, 6303302, 6927475, 1248196, 5864828, 7647620, 7778894, 7329507, 1546238, 4120725, 3440344, 3896109, 4878183, 1901393, 7694957, 1457839, 2856499, 611040, 7902178, 5054629, 4289935, 7234474, 2048466, 105819, 1692072, 2959026, 6726637, 1418817, 5930067, 6081567, 4439374, 3446020, 1262056, 3279150, 1800391, 5777498, 3878162, 4428744, 179549, 7786437, 6389493, 870072, 5606518, 786622, 8015378, 7441545, 7219377, 5979660, 8060688, 3474734, 4856331, 2679898, 2834090, 4559070, 6116854, 4429284, 5949379, 3874383, 2424550, 3642093, 7653803, 6286715, 6098774, 698753, 7633276, 3185280, 2161997, 591713, 2021545, 755085, 649866, 1800676, 4899097, 4402762, 5443452, 1354860, 575710, 3393616, 8364316, 8361077, 4234546, 5741955, 7346402, 677564, 1302157, 2331467, 390808, 145557, 2806951, 4000148, 1347837, 472240, 5544948, 3369463, 2311339, 6885342, 5225310, 8192012, 990075, 5504802, 679594, 507874, 3147003, 1605285, 2016347, 4297712, 4516778, 4242052, 4660532, 6727803, 2141884, 5051360, 3057100, 2333068, 1993445, 7200243, 6475497, 3022085, 3666859, 848320, 3714868, 4586616, 3412026, 7519501, 6304544, 2766331, 7674588, 4728228, 2213779, 2181478, 6894996, 3700707, 4019940, 796095, 877920, 5496885, 7225827, 2126049, 7381438, 6832817, 5357018, 3411344, 4023104, 4405132, 3487865, 307767, 5686616, 6801866, 5452247, 4019848, 2197126, 6833383, 6797733, 2505526, 376757, 8059039, 7537424, 1570598, 2774082], -[5313805, 6822608, 8178325, 8034389, 3619975, 3670940, 2019863, 6550148, 3338996, 3894367, 3954028, 6345117, 5594869, 4486438, 7509837, 233303, 6112001, 7487466, 6054465, 2324758, 5118687, 6594390, 7418722, 471263, 3568574, 4561619, 2946107, 6993778, 2905263, 4126487, 7380271, 7937898, 7151324, 7950776, 5772581, 6979591, 2242764, 1889425, 3132571, 6695929, 5881206, 7562073, 1708107, 2452154, 2270707, 1014804, 4715276, 8154933, 6179635, 35768, 5470564, 6277, 2603976, 4626394, 182189, 2353100, 2864784, 6832482, 1939959, 39187, 1813889, 7079187, 5948543, 2876855, 4973083, 5401420, 6874509, 3229038, 1427112, 6264609, 3268939, 1687110, 83363, 5056097, 594655, 5400137, 2579969, 227825, 7344207, 6101056, 2782584, 5295431, 941043, 1399534, 8067032, 1089869, 4524627, 3009288, 299253, 6740780, 7306854, 1642220, 6590008, 6697552, 7917390, 5883032, 2615357, 97764, 6494361, 1438782, 5114663, 6292478, 280152, 5505944, 3388533, 7208824, 899489, 6658094, 4313967, 146484, 837014, 5698872, 4021318, 6773239, 7407583, 1404110, 6159646, 5825141, 7151249, 3713650, 1226736, 3127097, 7186887, 2173051, 2274377, 3226325, 1404888, 5423625, 3412216, 7810852, 944445, 2117817, 4473804, 4809851, 7658186, 4345369, 3644011, 238677, 8148623, 285020, 288146, 6700579, 8364128, 837471, 7084057, 7494910, 1793216, 7083452, 1648275, 7075901, 952969, 5023765, 2341214, 1935999, 6698159, 3352076, 593306, 4588916, 2225660, 7787512, 5801919, 121120, 1215148, 6519921, 5443459, 7847105, 1949394, 2641467, 2038364, 2095834, 7246308, 2102112, 5471439, 650334, 3295265, 1492593, 6734014, 2275086, 6041039, 1838152, 6893049, 6981554, 4288393, 3305466, 2803013, 3070142, 4301483, 7446775, 205654, 373023, 3407593, 2415327, 3570856, 8088841, 3771630, 6540484, 6380957, 4377683, 4008627, 7015929, 6683886, 4365240, 5277719, 2391502, 8379439, 6541023, 6547643, 4312595, 6721430, 5918142, 6332259, 64892, 7820318, 2585617, 8056638, 337412, 3080249, 8340895, 87239, 7074083, 7306537, 4129560, 6405060, 2023986, 2072428, 2889357, 5586547, 2765648, 6109333, 661627, 1912217, 4787080, 1753005, 6758217, 6835396, 1689453, 3341813, 1891417, 1989092, 4388218, 759619, 2452756, 5033847, 283431, 3783385, 6312271, 4540195, 7407893, 6815253, 1960079, 775825, 7384698, 528780, 320928, 7882984, 6442086], -[3558269, 3064545, 2536539, 2805485, 375953, 5108601, 3767194, 2161469, 7331407, 1787268, 623534, 8231484, 5203509, 1689160, 2422170, 6606545, 2030389, 5919526, 7307161, 466138, 1273813, 7327236, 186379, 2613136, 1788182, 6905676, 2078758, 184401, 6957156, 4346068, 2277856, 3887952, 7138746, 5677913, 7520643, 4727485, 3106842, 4740340, 3220910, 252650, 2938082, 2364823, 3396909, 2304607, 4507699, 5864867, 6215542, 5829195, 843714, 7789555, 1796582, 2391027, 714333, 7877918, 5745327, 6591453, 3281473, 1515008, 6916463, 62, 4303544, 4292481, 60268, 7941737, 7454982, 954237, 2420168, 3398549, 2787902, 6793894, 486470, 2356617, 5833546, 455166, 3801788, 2624646, 7983274, 4136223, 5849463, 2803846, 4623708, 1941782, 4032108, 350346, 2989170, 5295300, 4529997, 2332389, 7026766, 7086595, 1112353, 4503311, 2559076, 7392965, 7515957, 5032507, 7412182, 6351541, 3095208, 1200745, 7552729, 1126408, 4194346, 3998557, 209639, 331986, 5863698, 6583447, 2053286, 7848961, 7185068, 6683897, 1922171, 1533091, 439055, 5276802, 5568476, 104172, 3243166, 2029203, 3744605, 1488583, 6403256, 6489833, 3030370, 6888676, 4215839, 2141182, 7466347, 5272667, 1701983, 3893082, 8189825, 7798055, 8221606, 3519664, 1967881, 2053295, 38548, 1856047, 6819604, 5099061, 7135475, 83029, 4425764, 7793424, 1464499, 3603555, 824315, 112290, 3570167, 6297149, 997267, 4286260, 118184, 682768, 3833045, 7402206, 4302894, 7778932, 1509986, 1075214, 4309, 8089324, 4644856, 3312074, 5506995, 2157592, 7490873, 6982737, 5393612, 1566314, 6746469, 2515528, 2646930, 7339250, 1567709, 4643119, 4431063, 6925757, 582390, 7633636, 7446123, 6920390, 6339387, 7155054, 2326703, 5253143, 6002605, 4979960, 3602950, 3730409, 5634398, 323045, 2645199, 4904277, 179534, 3184357, 1972184, 6067731, 4007171, 2968924, 6655352, 8173534, 5330878, 3962795, 4820596, 2005378, 476017, 843332, 4265525, 2591730, 3364100, 7499411, 6606275, 8306732, 3575165, 4591531, 1840818, 5242527, 6466207, 625948, 2862251, 3803846, 5469627, 1632030, 558531, 6392861, 3229655, 2511183, 3390691, 3629089, 4530469, 402537, 6399754, 1792047, 4364122, 8126214, 5965718, 131287, 2694135, 5616886, 3160660, 4829126, 7561966, 8224386, 5847075, 3814198, 2289612, 138266, 2313612, 1207398, 7008730, 3052060, 1262727, 6184747]] -w = NTTInverse(aHat * NTT(y)): [[7176087, 2453101, 5436844, 1773792, 493702, 1886538, 7305009, 3449455, 764704, 787763, 5933737, 1006010, 6146373, 4926946, 7666382, 1234820, 2375419, 5648044, 4132594, 717266, 6470094, 5005570, 1965663, 3489637, 7833836, 6813616, 2661938, 2741072, 6700763, 1048459, 1945196, 665206, 5577744, 7815672, 2448359, 1675067, 2794452, 5109846, 768073, 7483535, 1574531, 1552938, 8160946, 7212069, 1884280, 3440988, 3632538, 345082, 2478239, 5934944, 2622312, 3687127, 1885569, 2679541, 7200289, 6478821, 1543852, 1482036, 4019148, 7342209, 8055406, 5970613, 7146141, 1281083, 5163093, 3670561, 629689, 1209455, 2324529, 797997, 7037088, 3133583, 6438700, 5524943, 4842146, 19437, 7823774, 6138299, 4151114, 7074923, 4771609, 5670916, 6515954, 1528361, 3500001, 8028303, 1158123, 4226485, 7046893, 7667994, 6723813, 1562456, 5528398, 5427140, 4456183, 5184947, 4072329, 1643984, 7088264, 2676550, 1396467, 7725634, 4014071, 5039271, 4478659, 3194992, 7792468, 5686508, 5519398, 6339694, 3630933, 1077624, 2637947, 7925664, 5094737, 1484727, 5624143, 2602333, 7873128, 4500854, 5072396, 1468171, 7377284, 3113000, 6994116, 2992110, 2391631, 7681205, 4950169, 6383294, 2739315, 8191179, 3419122, 3620572, 1143545, 4022400, 2795366, 6938193, 8319723, 1448750, 6115511, 5378533, 4332279, 1443284, 8315182, 4589887, 4748955, 6813117, 5123771, 4228504, 3910640, 4297274, 480403, 480382, 4159005, 6374306, 5030816, 4738855, 5558835, 1305591, 1670801, 2892743, 6139922, 7387772, 2503570, 5838861, 475350, 5695459, 4572301, 2632371, 3353925, 3937693, 858117, 4058667, 5172007, 7539807, 1230123, 3689545, 1840361, 47995, 152057, 3941989, 4480510, 1604200, 5674458, 2685694, 687831, 3606883, 993428, 2435498, 3497605, 2232102, 4375300, 1322056, 6783200, 318814, 4807389, 3366101, 6578095, 5547656, 3538625, 4693856, 3526402, 7908033, 5997190, 1462844, 3392868, 1041757, 3279496, 4714710, 7809, 1667026, 421907, 3515396, 3450901, 3248073, 7151944, 461200, 5214070, 2319016, 2233993, 8207799, 368889, 6465439, 4849080, 7204912, 2742594, 51758, 8029524, 2952314, 269834, 2255974, 7886895, 517529, 8331980, 5782392, 2065141, 5581895, 5495316, 5607784, 4771909, 3624870, 1216713, 7008424, 3057071, 2728274, 1210611, 5508004, 7142777, 6772707, 7498684, 2017129, 2420765, 677233, 2505831, 7198796], -[6377515, 3958736, 4607720, 1254925, 2363935, 5704429, 4135435, 4815556, 3206264, 5003461, 5213844, 6327296, 6078449, 1970178, 2848291, 226503, 7403749, 5980877, 2423655, 4532136, 463449, 6769279, 5101808, 1132450, 7682951, 3152443, 6977898, 284693, 6027908, 3168441, 3506979, 430361, 8284816, 3995412, 7135979, 3372648, 3790561, 2687358, 1824742, 585805, 1685190, 7892142, 3193055, 4053255, 976132, 5171258, 7406956, 3035861, 677208, 4143736, 956647, 4839238, 930729, 6193047, 7454134, 453512, 4169507, 3541439, 4596238, 178082, 6497432, 1995468, 482855, 4891607, 6273288, 5820776, 4761364, 4391310, 6642786, 8191496, 7019176, 3133610, 856128, 4002086, 6998071, 7169546, 115478, 6533104, 5931622, 7633618, 8206996, 4168140, 6830497, 4236540, 2767875, 2370790, 367334, 6578828, 6920584, 5643082, 315642, 5474798, 3939551, 2182409, 5508002, 1618509, 1613156, 4212699, 1050887, 1035992, 1878838, 3791486, 4350337, 4536824, 2472150, 458603, 2534079, 5690371, 4558128, 7395710, 6077322, 579251, 5053545, 5479280, 3891665, 51998, 6472664, 2396080, 3100661, 2662095, 877425, 7036058, 6511610, 4044433, 649814, 4305592, 1754691, 83045, 1559649, 2603889, 222869, 3183707, 5117223, 426830, 2652743, 2583326, 8260091, 2589805, 3375832, 2656264, 8000770, 5751891, 2282085, 3241533, 1353201, 3606605, 5891162, 3268271, 3373652, 6176612, 3978840, 860104, 6634859, 2086019, 6696882, 5402580, 7216430, 432304, 1080296, 8131409, 7675526, 6770989, 6067548, 2757478, 6759027, 7502529, 5138945, 998661, 7517548, 3111672, 6554503, 3582922, 2074795, 7158441, 4282844, 2763850, 8109464, 7391453, 3485872, 2831409, 5101932, 6798391, 8043402, 7149016, 6428394, 238246, 6321798, 6675654, 5490213, 1647602, 1841786, 5835129, 381555, 3728654, 2802517, 729474, 3206965, 7368197, 5223221, 5732234, 6377443, 419957, 5431252, 2975167, 1984155, 2297920, 4609864, 4325573, 4772137, 6373118, 3323922, 6560030, 1747007, 1580559, 263031, 1937519, 3233458, 4550761, 2209916, 1355684, 3521474, 7542169, 8271309, 1774375, 6158684, 5174610, 5436139, 2051628, 756046, 3968454, 5791599, 764164, 7955428, 3011535, 3574811, 3174409, 8058391, 968090, 184228, 4295777, 642131, 6993285, 6850467, 335434, 1667574, 3078127, 1666854, 5917978, 849710, 1334194, 813377, 6927512, 7783049, 4131608, 2552119, 7710802], -[282263, 1389765, 709183, 6136513, 1851211, 3570839, 1288402, 2498300, 1707845, 6987998, 4507974, 6245672, 5311409, 3558059, 1897591, 7637943, 7438234, 950822, 3849800, 6773437, 4262807, 5947579, 2478475, 5146894, 5289065, 4972547, 964686, 7445431, 3728859, 6563081, 6776978, 8304349, 899925, 3189889, 2952473, 232843, 2119889, 7203095, 6053978, 1605855, 1258392, 8216036, 6420995, 1833484, 4663562, 5654968, 5943830, 6818824, 7970535, 4900100, 6431613, 2393829, 7350070, 8109667, 7448650, 7573984, 3174055, 1624964, 781737, 5130191, 6291693, 3202208, 1963630, 3006212, 3290694, 2133002, 6993631, 5164189, 2735846, 1469986, 4954265, 6849429, 4899232, 3655875, 6361182, 2414026, 6061635, 1606191, 777499, 6440339, 5490841, 6621891, 1527671, 5401681, 3927852, 3708282, 5653730, 2587534, 2625259, 7079239, 5022565, 7166640, 3425073, 6061523, 737801, 4046193, 962522, 5918418, 5613878, 5970694, 2158525, 2188257, 6412161, 352457, 5003480, 7573204, 3071268, 1705624, 6443224, 5082912, 8160703, 6395479, 7612815, 313407, 1319495, 6303972, 2461728, 5233484, 5656266, 2430686, 2802599, 4081404, 6833779, 5347309, 4033063, 7715077, 8327641, 679277, 4065761, 6729446, 5662796, 7002807, 765693, 4904289, 4239108, 8181561, 2356172, 1208373, 3145942, 6854198, 4489910, 7659120, 4309437, 224111, 61490, 200749, 4790357, 6841087, 6811635, 1801444, 1814974, 8371955, 1916399, 1171915, 4271051, 178740, 6767398, 8059756, 3036776, 4802708, 2578426, 6670691, 6044490, 1292338, 7027463, 1788702, 5235813, 7370008, 495359, 3461442, 2492638, 2615729, 2822886, 5352688, 7392691, 5189971, 4755135, 2297201, 1123597, 709186, 6336535, 4907706, 8317748, 1626501, 493480, 1987279, 2716966, 3850857, 7929426, 823607, 1085890, 3723172, 4451368, 3745556, 3481156, 3204498, 1475634, 3180581, 5364750, 5468619, 7886262, 7846947, 6069330, 5854616, 3772634, 254975, 8199123, 5673367, 3452052, 6589640, 2733895, 3975158, 3806013, 3333090, 4539876, 6943304, 2261177, 3817733, 4452145, 476428, 1225274, 7239138, 1989125, 3482705, 8079831, 2742937, 3290721, 6812125, 293541, 2195356, 833600, 2465489, 4370990, 6908032, 6843618, 7176723, 5611574, 1032161, 4112196, 3493516, 3322601, 6422249, 4484605, 765289, 2204722, 3402790, 7250870, 7009320, 4175337, 402585, 1723875, 7731025, 4828924, 4371877, 1695224, 1940803], -[5875287, 6632421, 2890532, 7079728, 5304461, 6335027, 1521557, 6903226, 2033895, 739559, 7545997, 2208961, 3106698, 5907509, 7332867, 5171025, 1750982, 2372551, 1855645, 1057883, 4158850, 3930316, 3349187, 6790809, 5642959, 1632828, 2161428, 818833, 4698797, 501585, 2560105, 6726317, 2882979, 697071, 2100206, 6301205, 112743, 945770, 5818529, 3463043, 5266162, 2751596, 7136182, 318285, 7441441, 3901923, 5660833, 8089413, 2910244, 998927, 7614477, 2991084, 4075245, 171800, 195550, 4516930, 2211323, 4714769, 6469176, 1676113, 464321, 7447405, 7093915, 160127, 6404386, 5524355, 2342460, 5564022, 1200700, 3502461, 4511815, 625812, 3567187, 1428322, 5212307, 5875686, 4607563, 7639855, 4426071, 544974, 836215, 3134583, 1179854, 1236007, 5239635, 8194401, 1675163, 5789095, 4470949, 5040026, 2780624, 8239614, 2969036, 6992234, 2990258, 2522551, 5451240, 3984997, 60886, 6139183, 4459006, 4311577, 4760882, 1479177, 2272060, 3792713, 5690789, 6300667, 2198868, 8024944, 4622500, 195666, 3383997, 5709021, 5036274, 742858, 346659, 4893511, 8280630, 2625779, 3858733, 3797288, 7807815, 4767127, 83134, 5533123, 59272, 2593912, 3792245, 2710874, 1990765, 5831517, 152145, 4891471, 2525978, 837873, 4431013, 3539938, 3606861, 4042614, 992279, 7644228, 867087, 467601, 7842585, 5699266, 8214904, 6112450, 7249856, 116973, 2065561, 6881607, 7725578, 1858494, 4578002, 2581426, 1403458, 1346799, 4052915, 6042884, 6578509, 2464386, 7423731, 3418538, 1624680, 1841758, 2664368, 183573, 3962821, 7816009, 2446019, 6452774, 5854843, 7835015, 839790, 1229682, 7823812, 5458833, 1891723, 1938073, 5973536, 5508114, 5325164, 6045257, 6558552, 53996, 2345343, 3989507, 4711289, 7108192, 2446219, 4159458, 1183474, 35264, 2812862, 14846, 4324006, 3859727, 2096085, 4930909, 1482643, 5880719, 3527377, 3323983, 4583217, 3648018, 3654069, 4979168, 4123344, 1542152, 6449444, 2615632, 5953026, 1205702, 5910009, 6934356, 2299154, 6965014, 6877408, 4993085, 6144236, 5020160, 5606844, 268231, 3035297, 6656338, 1547531, 5086352, 8268611, 298404, 4411647, 7569412, 7123552, 3362985, 6122328, 4852737, 1266578, 5155740, 8180530, 6190975, 3045121, 2525104, 2252904, 1273587, 3743130, 53546, 4173548, 1026578, 3139916, 2132116, 3309956, 6242873, 4647202, 3259576, 6518298, 7334298], -[6661874, 418668, 1739485, 2853440, 5701355, 2208473, 1260024, 8333215, 1767406, 33103, 2786797, 3238808, 3724250, 1888342, 4565153, 5041520, 6600542, 3229968, 6968313, 4219596, 7340820, 6578268, 6016955, 2214049, 912213, 2282835, 1561761, 3648099, 7780218, 3377776, 7323979, 7456984, 3574212, 2205252, 1682988, 1488939, 7084873, 6632791, 4057469, 6261115, 5200090, 1502407, 5416109, 4004784, 2147191, 995228, 2545399, 3605031, 1617922, 6963812, 5269957, 1945925, 5230130, 4916142, 3928800, 6151980, 5525877, 7592713, 7895814, 5966463, 4104914, 6803559, 5408359, 5249108, 76066, 2995704, 451753, 2767103, 3726137, 5666105, 2290001, 2367140, 6842449, 6600967, 3788867, 5368637, 1234117, 1256343, 201840, 1074249, 507261, 2457613, 6014024, 117389, 3845080, 6240686, 8261055, 808060, 5477419, 2943632, 3829619, 4642745, 6501280, 3105866, 5559994, 931155, 328597, 6116052, 7752377, 2817218, 6710976, 2979545, 5889695, 7464494, 7971605, 1136386, 1358218, 5516145, 1022818, 7946598, 2793272, 1606731, 5649054, 5448360, 3435619, 4085643, 4397308, 5372992, 7270778, 5101506, 7531031, 3342870, 5909817, 6011810, 8212831, 4612082, 5370560, 7209563, 7658778, 6761641, 3003613, 2257511, 3019570, 6460280, 8200331, 3563076, 5252803, 4995245, 8210020, 3844880, 1158155, 3995384, 8227214, 787033, 8215365, 1627477, 5297977, 1187880, 2316633, 1569381, 1136040, 6750701, 334135, 4491860, 2239683, 4606187, 841337, 3684570, 5682745, 1410481, 4532455, 1238752, 2700494, 4336909, 2055979, 755257, 4792744, 6987910, 1424901, 4872184, 4037194, 1226260, 4766612, 2401893, 2027177, 3394235, 7652085, 8173831, 5817641, 2247881, 5158731, 4370046, 3537235, 6729646, 6240829, 1532792, 6690949, 7360963, 5263752, 2585052, 6187699, 4650736, 5654961, 2651488, 6904953, 3052903, 5097928, 3668232, 3417467, 5785059, 7806639, 634494, 5590426, 5777171, 2988007, 1808913, 8159836, 6412506, 3068567, 2634245, 5532616, 6122439, 1333717, 8264011, 6735866, 2048416, 3456794, 7683767, 6613642, 5196208, 7068567, 6320096, 2342140, 5008828, 4963417, 6839520, 3522657, 6928741, 7589762, 8295245, 1583773, 4233034, 5173292, 1434332, 7233094, 4150187, 2496848, 4088799, 2556107, 1653179, 3496936, 945800, 6894421, 1219054, 107967, 1595686, 6654027, 1892916, 3943011, 6500852, 4284810, 6860888, 3553895, 3777658, 3231224, 1621951], -[857445, 871618, 6472249, 6675283, 8161359, 4388115, 1704194, 2307391, 6863427, 5622255, 1146191, 250180, 880790, 4924912, 6283047, 4010770, 6841398, 8268097, 3805646, 4330563, 51961, 6082612, 1851032, 1609934, 3792730, 494544, 204471, 127992, 3558413, 4165858, 1335542, 1023303, 6331839, 2312851, 1190669, 826057, 448978, 7385698, 1985891, 2637921, 438417, 2859213, 6565950, 8173013, 2936538, 2933508, 6652005, 6198364, 1932225, 4142005, 8173930, 2820559, 5463914, 6854585, 5158443, 3313969, 2380477, 2005106, 6273920, 1847834, 5034534, 1553021, 7062390, 728814, 3487472, 3716198, 2668981, 3122880, 1568838, 2310641, 8354522, 6869259, 3664673, 145224, 6475282, 8076008, 588270, 2111630, 4472590, 6441994, 3160899, 5889429, 6518742, 8226449, 1713959, 4151238, 3259081, 7288531, 5293303, 2600706, 468825, 7598393, 2416518, 8248771, 4604332, 3078967, 7907375, 4057723, 4221117, 2649395, 668505, 3556842, 20862, 630087, 3987812, 7170626, 773032, 6537727, 7299358, 2121511, 2986090, 5005226, 2398431, 4767648, 901234, 5716713, 2781612, 3249264, 5681029, 6609866, 6781270, 4985807, 4310612, 6411386, 2695497, 4640263, 4868381, 6937539, 936772, 1693862, 3161698, 3929397, 4090036, 3471933, 5857005, 4612527, 5636321, 5536094, 1874394, 4776833, 2104835, 967126, 4132323, 3994956, 7587631, 3877694, 6790304, 2357593, 5107419, 781201, 4792739, 2192528, 455595, 5760663, 2434968, 7987233, 2289581, 1095464, 1943812, 6552879, 7854472, 4879915, 4467248, 3358609, 6026078, 5890453, 8066632, 4236922, 4182713, 966484, 5255267, 1576411, 4215775, 1921845, 3123789, 296862, 5628749, 6118279, 5216610, 7259005, 6498344, 1662899, 2915894, 1389776, 1828729, 7575774, 1708037, 3718103, 3662039, 7652845, 5603433, 7749290, 1166626, 5954997, 805739, 1678187, 1014585, 4688167, 2481287, 761240, 8177842, 3182138, 2414811, 8225196, 7080213, 2251882, 7201385, 1859024, 3509042, 336666, 4503412, 8281871, 6421984, 2294112, 7414833, 8571, 626249, 4656341, 872386, 6621926, 3120540, 4822259, 8129814, 3518472, 4607726, 47868, 3524739, 6894346, 7020948, 580843, 8086402, 8165096, 2684300, 3342028, 3817344, 670178, 6138986, 892443, 8336433, 7119514, 4104217, 1003818, 748618, 2534025, 565538, 692984, 276395, 7516959, 4651712, 1964401, 7060298, 4292819, 3909497, 1286170, 5921717, 4228798]] - -w1: [[14, 5, 10, 3, 1, 4, 14, 7, 1, 2, 11, 2, 12, 9, 15, 2, 5, 11, 8, 1, 12, 10, 4, 7, 15, 13, 5, 5, 13, 2, 4, 1, 11, 15, 5, 3, 5, 10, 1, 14, 3, 3, 0, 14, 4, 7, 7, 1, 5, 11, 5, 7, 4, 5, 14, 12, 3, 3, 8, 14, 15, 11, 14, 2, 10, 7, 1, 2, 4, 2, 13, 6, 12, 11, 9, 0, 15, 12, 8, 14, 9, 11, 12, 3, 7, 15, 2, 8, 13, 15, 13, 3, 11, 10, 9, 10, 8, 3, 14, 5, 3, 15, 8, 10, 9, 6, 15, 11, 11, 12, 7, 2, 5, 15, 10, 3, 11, 5, 15, 9, 10, 3, 14, 6, 13, 6, 5, 15, 9, 12, 5, 0, 7, 7, 2, 8, 5, 13, 0, 3, 12, 10, 8, 3, 0, 9, 9, 13, 10, 8, 7, 8, 1, 1, 8, 12, 10, 9, 11, 2, 3, 6, 12, 14, 5, 11, 1, 11, 9, 5, 6, 8, 2, 8, 10, 14, 2, 7, 4, 0, 0, 8, 9, 3, 11, 5, 1, 7, 2, 5, 7, 4, 8, 3, 13, 1, 9, 6, 13, 11, 7, 9, 7, 15, 11, 3, 6, 2, 6, 9, 0, 3, 1, 7, 7, 6, 14, 1, 10, 4, 4, 0, 1, 12, 9, 14, 5, 0, 15, 6, 1, 4, 15, 1, 0, 11, 4, 11, 10, 11, 9, 7, 2, 13, 6, 5, 2, 11, 14, 13, 14, 4, 5, 1, 5, 14], -[12, 8, 9, 2, 5, 11, 8, 9, 6, 10, 10, 12, 12, 4, 5, 0, 14, 11, 5, 9, 1, 13, 10, 2, 15, 6, 13, 1, 12, 6, 7, 1, 0, 8, 14, 6, 7, 5, 3, 1, 3, 15, 6, 8, 2, 10, 14, 6, 1, 8, 2, 9, 2, 12, 14, 1, 8, 7, 9, 0, 12, 4, 1, 9, 12, 11, 9, 8, 13, 0, 13, 6, 2, 8, 13, 14, 0, 12, 11, 15, 0, 8, 13, 8, 5, 5, 1, 13, 13, 11, 1, 10, 8, 4, 11, 3, 3, 8, 2, 2, 4, 7, 8, 9, 5, 1, 5, 11, 9, 14, 12, 1, 10, 10, 7, 0, 12, 5, 6, 5, 2, 13, 12, 8, 1, 8, 3, 0, 3, 5, 0, 6, 10, 1, 5, 5, 0, 5, 6, 5, 15, 11, 4, 6, 3, 7, 11, 6, 6, 12, 8, 2, 13, 4, 13, 10, 14, 1, 2, 0, 15, 13, 12, 5, 13, 14, 10, 2, 14, 6, 13, 7, 4, 14, 8, 5, 15, 14, 7, 5, 10, 13, 15, 14, 12, 0, 12, 13, 10, 3, 4, 11, 1, 7, 5, 1, 6, 14, 10, 11, 12, 1, 10, 6, 4, 4, 9, 8, 9, 12, 6, 13, 3, 3, 1, 4, 6, 9, 4, 3, 7, 14, 0, 3, 12, 10, 10, 4, 1, 8, 11, 1, 15, 6, 7, 6, 15, 2, 0, 8, 1, 13, 13, 1, 3, 6, 3, 11, 2, 3, 2, 13, 15, 8, 5, 15], -[1, 3, 1, 12, 4, 7, 2, 5, 3, 13, 9, 12, 10, 7, 4, 15, 14, 2, 7, 13, 8, 11, 5, 10, 10, 9, 2, 14, 7, 13, 13, 0, 2, 6, 6, 0, 4, 14, 12, 3, 2, 0, 12, 4, 9, 11, 11, 13, 15, 9, 12, 5, 14, 15, 14, 14, 6, 3, 1, 10, 12, 6, 4, 6, 6, 4, 13, 10, 5, 3, 9, 13, 9, 7, 12, 5, 12, 3, 1, 12, 10, 13, 3, 10, 7, 7, 11, 5, 5, 14, 10, 14, 7, 12, 1, 8, 2, 11, 11, 11, 4, 4, 12, 1, 10, 14, 6, 3, 12, 10, 0, 12, 15, 1, 3, 12, 5, 10, 11, 5, 5, 8, 13, 10, 8, 15, 0, 1, 8, 13, 11, 13, 1, 9, 8, 0, 4, 2, 6, 13, 9, 15, 8, 0, 0, 0, 9, 13, 13, 3, 3, 0, 4, 2, 8, 0, 13, 15, 6, 9, 5, 13, 12, 2, 13, 3, 10, 14, 1, 7, 5, 5, 5, 10, 14, 10, 9, 4, 2, 1, 12, 9, 0, 3, 1, 4, 5, 7, 15, 2, 2, 7, 8, 7, 7, 6, 3, 6, 10, 10, 15, 15, 12, 11, 7, 0, 0, 11, 7, 13, 5, 8, 7, 6, 9, 13, 4, 7, 9, 1, 2, 14, 4, 7, 15, 5, 6, 13, 1, 4, 2, 5, 8, 13, 13, 14, 11, 2, 8, 7, 6, 12, 9, 1, 4, 6, 14, 13, 8, 1, 3, 15, 9, 8, 3, 4], -[11, 13, 6, 14, 10, 12, 3, 13, 4, 1, 14, 4, 6, 11, 14, 10, 3, 5, 4, 2, 8, 8, 6, 13, 11, 3, 4, 2, 9, 1, 5, 13, 6, 1, 4, 12, 0, 2, 11, 7, 10, 5, 14, 1, 14, 7, 11, 15, 6, 2, 15, 6, 8, 0, 0, 9, 4, 9, 12, 3, 1, 14, 14, 0, 12, 11, 4, 11, 2, 7, 9, 1, 7, 3, 10, 11, 9, 15, 8, 1, 2, 6, 2, 2, 10, 0, 3, 11, 9, 10, 5, 0, 6, 13, 6, 5, 10, 8, 0, 12, 9, 8, 9, 3, 4, 7, 11, 12, 4, 15, 9, 0, 6, 11, 10, 1, 1, 9, 0, 5, 7, 7, 15, 9, 0, 11, 0, 5, 7, 5, 4, 11, 0, 9, 5, 2, 8, 7, 7, 8, 2, 15, 2, 1, 15, 11, 0, 12, 14, 0, 4, 13, 15, 4, 9, 5, 3, 3, 8, 12, 13, 5, 14, 7, 3, 4, 5, 0, 8, 15, 5, 12, 11, 15, 2, 2, 15, 10, 4, 4, 11, 11, 10, 12, 13, 0, 4, 8, 9, 14, 5, 8, 2, 0, 5, 0, 8, 7, 4, 9, 3, 11, 7, 6, 9, 7, 7, 10, 8, 3, 12, 5, 11, 2, 11, 13, 4, 13, 13, 10, 12, 10, 11, 1, 6, 13, 3, 10, 0, 1, 8, 14, 14, 6, 12, 9, 2, 10, 0, 12, 6, 5, 4, 2, 7, 0, 8, 2, 6, 4, 6, 12, 9, 6, 12, 14], -[13, 1, 3, 5, 11, 4, 2, 0, 3, 0, 5, 6, 7, 4, 9, 10, 13, 6, 13, 8, 14, 13, 11, 4, 2, 4, 3, 7, 15, 6, 14, 14, 7, 4, 3, 3, 14, 13, 8, 12, 10, 3, 10, 8, 4, 2, 5, 7, 3, 13, 10, 4, 10, 9, 8, 12, 11, 14, 15, 11, 8, 13, 10, 10, 0, 6, 1, 5, 7, 11, 4, 5, 13, 13, 7, 10, 2, 2, 0, 2, 1, 5, 11, 0, 7, 12, 0, 2, 10, 6, 7, 9, 12, 6, 11, 2, 1, 12, 15, 5, 13, 6, 11, 14, 15, 2, 3, 11, 2, 15, 5, 3, 11, 10, 7, 8, 8, 10, 14, 10, 14, 6, 11, 11, 0, 9, 10, 14, 15, 13, 6, 4, 6, 12, 0, 7, 10, 10, 0, 7, 2, 8, 0, 2, 0, 3, 10, 2, 4, 3, 2, 13, 1, 9, 4, 9, 2, 7, 11, 3, 9, 2, 5, 8, 4, 1, 9, 13, 3, 9, 8, 2, 9, 5, 4, 6, 15, 0, 11, 4, 10, 8, 7, 13, 12, 3, 13, 14, 10, 5, 12, 9, 11, 5, 13, 6, 10, 7, 7, 11, 15, 1, 11, 11, 6, 3, 0, 12, 6, 5, 11, 12, 3, 0, 13, 4, 7, 15, 13, 10, 13, 12, 4, 10, 9, 13, 7, 13, 14, 0, 3, 8, 10, 3, 14, 8, 5, 8, 5, 3, 7, 2, 13, 2, 0, 3, 13, 4, 8, 12, 8, 13, 7, 7, 6, 3], -[2, 2, 12, 13, 0, 8, 3, 4, 13, 11, 2, 0, 2, 9, 12, 8, 13, 0, 7, 8, 0, 12, 4, 3, 7, 1, 0, 0, 7, 8, 3, 2, 12, 4, 2, 2, 1, 14, 4, 5, 1, 5, 13, 0, 6, 6, 13, 12, 4, 8, 0, 5, 10, 13, 10, 6, 5, 4, 12, 4, 10, 3, 13, 1, 7, 7, 5, 6, 3, 4, 0, 13, 7, 0, 12, 15, 1, 4, 9, 12, 6, 11, 12, 0, 3, 8, 6, 14, 10, 5, 1, 15, 5, 0, 9, 6, 15, 8, 8, 5, 1, 7, 0, 1, 8, 14, 1, 12, 14, 4, 6, 10, 5, 9, 2, 11, 5, 6, 11, 13, 13, 10, 8, 12, 5, 9, 9, 13, 2, 3, 6, 8, 8, 7, 11, 9, 11, 11, 4, 9, 4, 2, 8, 8, 14, 7, 13, 5, 10, 1, 9, 4, 1, 11, 5, 15, 4, 2, 4, 13, 15, 9, 9, 6, 12, 11, 15, 8, 8, 2, 10, 3, 8, 4, 6, 1, 11, 12, 10, 14, 12, 3, 6, 3, 3, 14, 3, 7, 7, 15, 11, 15, 2, 11, 2, 3, 2, 9, 5, 1, 0, 6, 5, 0, 14, 4, 14, 4, 7, 1, 9, 0, 12, 4, 14, 0, 1, 9, 2, 13, 6, 9, 0, 7, 9, 0, 7, 13, 13, 1, 15, 0, 5, 6, 7, 1, 12, 2, 0, 14, 8, 2, 1, 5, 1, 1, 1, 14, 9, 4, 13, 8, 7, 2, 11, 8]] -w1Encode: 5E3A417E212B9C2FB518AC74DF552D14FB35A5E133E07417B57554CE33E8BF2E7A21246DBC09CFE8B93CF782FD3DABA9385EF3A869BFCB27F53A5B9F3A6E6DF5C9057782D530AC3890D98A8711C89A2B63ECB5B1598682EA720480395B715247381D69BD97F73B26963071671E4A04C1E9056F411FB0B4BA79D256B2DE4E15E58C29B598A6CA4C05BE95D12A6F1D6C17806E5713F386A26E8192C21E78094C91BC890D6D82EDC0FB808D55D1BDA1483B8322749815B5E91CAA075C56D28C810353601A555056BF64736BC6284DAD1E02DF5CED2A6E7DE458EF57DAEF0CDC3AB47115E6BA1C6A4489C9D633419634E730AC4A811B6F672F80D11D63B332D28FF531C17452D3C97AF42ED7B8A59AE2D70D6206E43C024CB9DB9F5CFEEE36A16C6446AD35D9795C3CC1DAA3775BE5EAC781B2BB441CEA36ACC01FC3A55B85ADF810D8DB910824D6F90800D93D032408FD96D52C3DEA7155A5AE49129C3041752F72786763AAFFBC07B0D78567D97419E2745FD64152D8ED2B78C61964DE18F38943DBE6CAD3144EB6AE532488D63B2419D516C4207B5A1E7EFB266F0890943CE10EBCB4721937BAF91862220AB3A905D6568AC0893974CBF409B61A9150779FB05057B490257887F212BFC00ED44F5933C85D7E4305F8C5FB22AF44BBCA0D84E98502057894B36779A7385C2BDBD4ADAC1BD6A310E86E9CA2C05624072846C669EC1D534B02036547A96D8DDE4B42736FEE4733DEC83A8A2475D34A9AC8EBBFD8AA6051B754DDA72220510BC7206A976C2BC15F6DEB2FB3F235AB87A8AE6EBB90EADF46C670AA708220302A34D29194723B298514D9932859640F4B8AD73CED5A9C5B6D7AB71FBB36C056CB034DF7ADCDA4D9D70E833A8E8535272D304DC8D8773622DC8043BD02928C0D87C034170087234C22E154510D66CD8450DA6A454C3A1D776543D007FC41C9B60C83E65AF105698F587110E8C14EA695B265DBADC895D93286789BBB9424887E5D1A49B1F524D49F69BC8F283A4816CBEA3C36E373F7FBB232921560054E4E17094C0E91D2967009D71D0F65172CE0285111E1498D278B - -cTilde: 10B3206713C7850609621506110EDE8FF646EF118B2C6CB23A36A0771122EFBAD5FAB4B2425B0A8FF4EEB0F85084F578 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -cHat: [3645810, 7764467, 4545647, 6700250, 5211569, 7064580, 136201, 3754197, 6978672, 6615361, 964808, 4351899, 5876446, 3300010, 5854002, 4246643, 5286352, 5246453, 8233698, 3716177, 7557141, 5586754, 5482020, 549156, 8117854, 7477472, 6859174, 4665935, 4056248, 2138621, 2731257, 7686667, 1978666, 2154318, 5993959, 2476593, 6821691, 3548550, 647676, 5453922, 5206739, 8060447, 7770684, 5961383, 5099293, 6633544, 5646002, 3557095, 3512742, 206086, 5864240, 3588624, 6770431, 1781556, 5083792, 5605476, 7493036, 7805388, 6780731, 2910179, 3555113, 3024175, 8329352, 4699641, 7819072, 1611894, 1934923, 371131, 3264437, 2434068, 5958269, 579961, 1058992, 2334850, 4534149, 5143224, 871204, 2880275, 1533377, 6365899, 5212163, 6565294, 4980877, 4249337, 52601, 4516756, 3041068, 2716556, 3951992, 3200041, 7452226, 15289, 1175782, 7536250, 3218686, 7571641, 8320733, 3981485, 2395934, 3484697, 897601, 7095301, 7856197, 3371788, 7046495, 4864491, 2124696, 2456667, 5341980, 4099087, 4137909, 6361915, 837104, 2525714, 7936321, 6265789, 5284994, 2625186, 8032175, 5079229, 6182535, 5757387, 8125949, 4334955, 494803, 6803551, 1215230, 2336054, 2364952, 1212032, 3420765, 1736177, 386786, 7096632, 6970127, 6411757, 5188045, 3323532, 1970554, 2197874, 1207488, 6424620, 1708146, 184320, 3511793, 6255970, 5770042, 1780920, 4024826, 4624911, 3914672, 7348532, 6377081, 958746, 2692441, 2676610, 2302812, 4526757, 2048022, 1370089, 7840855, 7517013, 2810239, 1839442, 7738712, 1833397, 5925135, 938506, 2841593, 5644478, 554666, 6333849, 2593908, 4923561, 3983588, 5245699, 2601236, 6060554, 6278809, 7532190, 1606630, 4245840, 7597062, 1410424, 913214, 3877251, 6691546, 6216983, 7053344, 6136777, 1580377, 7142821, 457513, 8000803, 765682, 3268699, 5064478, 785242, 6506218, 3284042, 335399, 7519479, 6028018, 6971447, 372257, 1948709, 4810373, 1023287, 1059412, 7013597, 2278332, 7432780, 6779669, 5793474, 5632093, 2925853, 1368737, 3794375, 1622649, 7088496, 2377873, 4157614, 3267565, 2929544, 4655990, 1459002, 820207, 449629, 2614533, 152508, 7382441, 3888558, 2711356, 6244788, 2383798, 6898506, 1858282, 2678309, 4281789, 281533, 3116115, 5702026, 6125206, 4295173, 6357843, 6629311, 6499532, 6878147, 8032386, 4063742, 6763354, 2758753, 5373537, 1627092, 5905120, 2155560] -cs1: [[8380398, 8380390, 8380415, 8380413, 8380377, 8380406, 8380384, 0, 40, 6, 8380408, 8380396, 8380402, 8380408, 8380402, 50, 8, 8380408, 8380400, 8380395, 8380407, 8380413, 8380411, 8380404, 8380407, 11, 8, 5, 1, 8380404, 8380393, 8380399, 15, 8380414, 26, 8380393, 8380414, 0, 3, 9, 20, 16, 8380415, 8380383, 8380412, 8380396, 20, 2, 8380412, 8380395, 8380407, 22, 8380413, 4, 14, 20, 8380403, 8380411, 21, 8380405, 9, 34, 11, 8380408, 8380392, 8380406, 5, 8380393, 8380393, 11, 8380399, 10, 12, 8, 10, 8380402, 8380398, 8380404, 8380396, 27, 10, 24, 1, 7, 2, 8380416, 8380401, 8380403, 3, 18, 8380384, 8380403, 8380400, 45, 8380413, 8380405, 17, 1, 6, 8380414, 8380409, 8380414, 8380409, 36, 8380382, 3, 5, 7, 22, 8380414, 10, 3, 4, 8380395, 8380406, 8380403, 18, 8380408, 8380412, 41, 29, 7, 2, 14, 25, 8380397, 1, 10, 2, 7, 8380411, 7, 0, 33, 19, 8380395, 8380408, 8380416, 17, 7, 7, 5, 8380389, 8380408, 29, 10, 45, 11, 8, 8380391, 8380394, 8380402, 5, 8380406, 14, 31, 22, 19, 8380400, 8380377, 7, 2, 16, 8380410, 6, 10, 6, 8380401, 3, 2, 7, 8380414, 8380398, 8380407, 8380394, 8380393, 8380403, 8380412, 21, 17, 12, 8380405, 8380405, 14, 6, 10, 8380385, 2, 8380415, 8380378, 8380384, 8380414, 13, 3, 32, 35, 8380415, 8380414, 8380408, 8380385, 21, 5, 8380410, 8380397, 8380384, 19, 1, 2, 8380398, 8380403, 8380406, 8380416, 8380414, 2, 2, 31, 8380397, 8380412, 8380411, 30, 33, 8380395, 9, 7, 8380407, 8380390, 8380383, 8, 14, 2, 3, 8380392, 1, 8380392, 8380407, 0, 8380376, 5, 21, 24, 15, 4, 27, 10, 12, 8380415, 8380408, 22, 17, 8380379, 8380385, 8380410, 10, 8380385, 8380375, 27], -[7, 8380401, 18, 8380411, 16, 10, 8380395, 8380392, 2, 32, 27, 8380385, 6, 14, 6, 13, 9, 3, 8380404, 16, 0, 6, 56, 17, 10, 8380403, 14, 8380413, 8380402, 9, 23, 8, 32, 8380413, 8380405, 9, 8380407, 17, 8380379, 8380389, 8380412, 8380412, 5, 36, 8380402, 8, 8, 21, 8380387, 8380411, 8380410, 49, 2, 8380395, 8380405, 4, 4, 8380413, 10, 34, 8380386, 8380393, 15, 7, 8380386, 8380397, 8380402, 8380410, 21, 18, 28, 4, 8380387, 8, 8380414, 17, 10, 8380415, 2, 8380411, 3, 8380396, 22, 10, 4, 8380411, 11, 15, 4, 20, 12, 8380356, 18, 8380407, 23, 10, 9, 16, 15, 8380395, 8380411, 8380376, 8380408, 8380415, 24, 2, 8380416, 8380388, 5, 8380408, 1, 8380397, 8380413, 8380415, 8380415, 8380406, 12, 3, 8380413, 8380412, 8380393, 13, 4, 8380406, 8380404, 8380408, 8380401, 8380414, 8380408, 1, 21, 35, 8380397, 8380392, 9, 8380409, 8380407, 8380404, 8380415, 8380407, 8380406, 43, 5, 11, 16, 8380411, 2, 8380407, 8380396, 18, 2, 19, 8380384, 8380384, 8380396, 8380414, 8380409, 19, 17, 8380415, 8380385, 8380412, 11, 8380416, 8380400, 8380398, 8380414, 8380406, 16, 3, 9, 8380403, 8380402, 13, 8380406, 8380410, 3, 8380408, 1, 8380391, 8380416, 8380406, 8380409, 8380409, 8380415, 8380411, 37, 8380398, 19, 5, 1, 22, 8380403, 8380385, 17, 8380401, 8380404, 8380390, 8380413, 17, 8380401, 23, 9, 8380403, 18, 7, 8380416, 8380398, 8380403, 5, 8380414, 8380406, 8380390, 25, 8380414, 8380406, 11, 8380414, 8380397, 8380406, 1, 12, 21, 8380402, 8380389, 8380399, 8380407, 8380401, 8380401, 8380413, 0, 8380401, 3, 16, 14, 8380414, 8380410, 25, 10, 8380413, 2, 8380404, 8380408, 5, 8380416, 19, 8380406, 12, 13, 16, 3, 8380415, 10, 8380386, 8380376, 13], -[37, 23, 8380400, 0, 18, 12, 9, 8380403, 14, 8380414, 8380397, 8380414, 8380414, 8, 8380414, 8380390, 1, 8380402, 4, 30, 8380396, 11, 13, 20, 19, 16, 42, 1, 4, 8380412, 4, 8380398, 8, 8380415, 8380365, 8380404, 8380370, 8380400, 8380401, 8380415, 42, 6, 26, 14, 8380415, 18, 1, 28, 1, 8380402, 3, 8380401, 5, 8380406, 15, 8380413, 8380407, 7, 22, 8380412, 8380400, 8380402, 8380416, 8380395, 11, 32, 16, 10, 8380409, 19, 2, 8380413, 5, 3, 8380414, 20, 8380416, 8380397, 6, 8380407, 8380405, 8380375, 8380396, 8380409, 8380405, 34, 24, 28, 8380404, 8380403, 0, 8380407, 1, 8380402, 8380401, 5, 8380413, 8380401, 20, 2, 11, 8380376, 8380404, 34, 26, 8380408, 8380402, 8380395, 8380409, 8380413, 8380411, 10, 20, 27, 47, 40, 1, 24, 8380410, 1, 1, 11, 8380416, 8380410, 8380414, 8380399, 8380411, 3, 9, 8380401, 1, 1, 8380410, 8380410, 13, 8380408, 8380404, 9, 8380388, 25, 31, 16, 7, 8380374, 8380407, 15, 8380404, 35, 8380391, 8380383, 5, 0, 7, 8380405, 8380369, 8380389, 8380405, 20, 13, 24, 24, 16, 8380380, 8380407, 6, 8380408, 8380411, 8380400, 0, 11, 8380395, 8380413, 8380409, 8380410, 15, 9, 48, 11, 24, 8380390, 2, 8380415, 27, 11, 6, 21, 16, 8380393, 8380398, 8380398, 6, 1, 8380404, 8, 8380407, 8380377, 8380394, 10, 8, 15, 8380396, 8380393, 8380404, 8380408, 17, 8380392, 17, 9, 9, 8380400, 8380407, 8380407, 8380400, 8380409, 8380416, 8380410, 8380414, 8380392, 8380397, 8380410, 8380403, 31, 22, 12, 17, 8380403, 6, 8380400, 8380403, 38, 15, 2, 6, 3, 8380399, 8380397, 8380393, 8380397, 8380412, 11, 19, 4, 8380386, 14, 8380414, 39, 39, 8380400, 16, 8380403, 8380409, 17, 8380414, 4, 8380410, 8380395], -[8380394, 11, 2, 8380413, 8380390, 8380377, 8380401, 8380414, 11, 8380404, 7, 7, 14, 39, 20, 7, 8380393, 8380392, 14, 8380385, 0, 25, 13, 8380392, 3, 8380408, 8380410, 3, 0, 8, 5, 17, 12, 8380400, 1, 20, 22, 2, 8380414, 21, 7, 8380398, 6, 8380411, 8380401, 8380398, 8380415, 8380408, 8380416, 29, 26, 6, 8380397, 8380405, 8380416, 8380408, 7, 8380399, 3, 1, 29, 8380416, 2, 8380398, 8380392, 8380409, 8380381, 3, 8380396, 8380414, 8380412, 8380414, 9, 11, 6, 30, 0, 4, 8380407, 8380409, 8380391, 8, 8380409, 8380409, 8380375, 25, 8380412, 18, 8380411, 8380400, 8380397, 8380388, 8380396, 28, 5, 38, 19, 34, 21, 0, 8380416, 14, 8380411, 9, 7, 0, 0, 3, 3, 4, 8380414, 12, 7, 8380415, 5, 0, 8380415, 5, 21, 24, 8380390, 0, 2, 17, 31, 14, 0, 8380399, 8380384, 8380399, 8380400, 8380398, 17, 21, 16, 8380409, 18, 7, 8380386, 5, 14, 11, 16, 8380391, 18, 8380369, 8380412, 25, 8380405, 8380412, 8380385, 1, 8380410, 8380407, 16, 16, 8380398, 8380402, 9, 17, 24, 10, 8380416, 8380415, 16, 8380401, 8380407, 8380403, 12, 8380412, 5, 12, 12, 10, 8380408, 8380413, 8380409, 14, 8380406, 34, 5, 8380408, 8380413, 6, 28, 10, 3, 33, 8380408, 0, 8380411, 8380416, 8380386, 8380386, 8380400, 8380404, 13, 19, 22, 31, 6, 19, 13, 8380398, 4, 5, 0, 8380406, 5, 8, 8380404, 8380396, 7, 12, 5, 22, 14, 8380383, 5, 32, 8, 8380399, 8380397, 8380415, 11, 9, 10, 10, 8380391, 10, 1, 0, 8380416, 16, 8380408, 8380407, 31, 31, 8380407, 8380413, 16, 8, 8380407, 29, 19, 8380397, 8, 31, 22, 8380376, 8380401, 21, 8380416, 8380377, 0, 8380395], -[22, 8380408, 11, 8380397, 8380416, 8380393, 8380400, 8380388, 24, 1, 26, 8380399, 8380380, 10, 4, 8380405, 8380397, 8380388, 14, 22, 4, 8380409, 9, 27, 8380411, 8380402, 8380396, 16, 8380408, 2, 8380416, 8380415, 16, 34, 8380370, 18, 8380405, 24, 8380407, 16, 8380373, 2, 8380411, 8380416, 6, 8380404, 35, 20, 8380386, 8380401, 15, 8380410, 1, 8380413, 8380412, 21, 25, 8380404, 3, 8380396, 0, 8380407, 0, 8380411, 8, 8380411, 12, 8380405, 8380404, 17, 8380416, 8380405, 16, 8380393, 19, 8380404, 8380409, 8380394, 8380391, 8380411, 30, 27, 13, 8380415, 7, 8380401, 5, 8380404, 16, 21, 8380397, 8380416, 32, 8380415, 8380411, 8380386, 12, 8380406, 4, 8380392, 10, 18, 8380407, 12, 8380415, 28, 10, 8380388, 16, 1, 8380413, 14, 1, 23, 7, 3, 8380400, 5, 16, 11, 8380410, 1, 8380389, 8380405, 8380399, 18, 26, 29, 47, 8380399, 7, 7, 8380405, 2, 4, 8380402, 8380415, 8380389, 8380410, 8380402, 8380390, 9, 8380416, 8380395, 4, 17, 11, 14, 6, 5, 2, 19, 8380414, 27, 8380395, 8380397, 8380413, 8380393, 8380416, 17, 8380395, 5, 8380412, 7, 21, 14, 15, 6, 8380416, 20, 8380411, 8380415, 8380402, 7, 8380405, 12, 11, 1, 16, 8380393, 8380396, 8380398, 8380408, 9, 12, 0, 8380414, 25, 8380409, 24, 26, 11, 35, 0, 8380393, 9, 3, 15, 15, 17, 27, 8, 8380388, 8380389, 2, 8380413, 4, 3, 8380413, 9, 8, 8380392, 36, 8380399, 8380407, 4, 8380405, 17, 8380401, 6, 18, 8380399, 22, 21, 28, 38, 8380394, 8380416, 8380399, 32, 4, 8380399, 0, 8380400, 8380410, 17, 8380412, 38, 8380384, 13, 8380398, 8380393, 8380411, 23, 13, 11, 9, 33, 8380407, 6, 8380398, 26, 8, 6, 5, 8380395]] -cs2: [[8380391, 8380400, 8380408, 7, 8380383, 14, 3, 0, 0, 8380412, 3, 8, 5, 8380403, 8380403, 0, 8380412, 4, 8380413, 8380400, 12, 0, 8380386, 7, 1, 8380404, 13, 8380387, 23, 10, 8380400, 8380411, 8380413, 19, 14, 8380412, 11, 7, 8380404, 8380384, 8380390, 8380395, 8380398, 15, 18, 8380396, 8380405, 8380405, 25, 8380414, 8380408, 16, 9, 8, 8380403, 6, 8380415, 17, 8380402, 8380393, 8380410, 8, 8380399, 8380411, 8380416, 12, 8380406, 8380396, 13, 12, 8380382, 12, 20, 8380404, 8380405, 8380412, 8380390, 8380406, 8380406, 8380397, 8380415, 12, 24, 8380408, 8380401, 13, 8380378, 8380379, 8380413, 30, 13, 8380412, 16, 0, 21, 8380408, 15, 8380412, 8380402, 8380384, 18, 7, 18, 8, 8380395, 10, 8380410, 15, 15, 8380402, 8380410, 7, 24, 8380412, 8380413, 3, 8380400, 17, 8, 8380404, 14, 18, 8380399, 8380406, 8380411, 7, 8380403, 10, 28, 23, 2, 2, 18, 8380391, 8380379, 8380412, 10, 24, 19, 21, 8380390, 8380391, 8380395, 23, 26, 31, 8380405, 8380385, 8380385, 12, 8380408, 8380412, 2, 8380401, 8380416, 10, 7, 22, 8380368, 8380373, 8380412, 8380405, 23, 7, 8380413, 8, 8, 1, 8380403, 15, 8380400, 8380408, 8380408, 8380386, 18, 12, 8380412, 32, 8380410, 1, 3, 8380403, 2, 8380395, 24, 8380395, 8380413, 8380408, 8380405, 0, 8380411, 24, 8380414, 8380410, 26, 8380415, 8380414, 8380396, 8380412, 4, 5, 9, 0, 22, 8380392, 8380406, 19, 1, 8380404, 11, 8380407, 24, 8380413, 8380416, 8380407, 8380414, 8380402, 33, 12, 15, 8380391, 8380399, 8380405, 24, 16, 8380409, 4, 12, 2, 8380407, 8380392, 24, 8380416, 1, 2, 8380411, 11, 8380409, 32, 16, 15, 12, 8380404, 8380404, 8380395, 8380391, 8380403, 8380405, 20, 30, 11, 6, 1, 8380396, 0, 23], -[8380407, 8380407, 11, 27, 16, 8380410, 8380402, 8380397, 13, 1, 9, 2, 21, 8380393, 5, 8380411, 21, 8380416, 8380415, 11, 8380415, 8380413, 0, 8380373, 5, 39, 35, 26, 8380398, 8380399, 1, 10, 8380414, 8380411, 8380402, 10, 8380408, 21, 5, 38, 15, 12, 10, 1, 8380391, 7, 9, 8380413, 8380403, 0, 8380401, 8380391, 8380399, 36, 8380404, 7, 8380411, 8380412, 8380401, 8380394, 9, 8380403, 8380390, 4, 3, 20, 8380403, 4, 6, 8380408, 5, 9, 12, 8, 8380408, 8380415, 8380396, 7, 8380391, 8380396, 8380386, 8380380, 8380398, 0, 42, 20, 8380392, 8380414, 8380402, 15, 8380405, 7, 13, 3, 10, 0, 4, 8380400, 8380410, 0, 8380395, 8, 30, 10, 8380370, 8380391, 8380411, 8380403, 8380389, 26, 1, 8380398, 8380385, 8380408, 12, 8380408, 17, 13, 8380400, 25, 8380388, 8380403, 12, 8380397, 8380406, 8380395, 3, 8380372, 8380359, 4, 8380416, 14, 8380413, 8380415, 8380401, 8380371, 8380402, 15, 3, 8380388, 8380391, 8380409, 8380405, 24, 8380406, 20, 0, 7, 22, 8380402, 8380407, 8380410, 0, 8380399, 8380366, 14, 44, 13, 2, 8380416, 8380411, 8380374, 2, 8380410, 7, 8380403, 8380400, 5, 8380406, 11, 8380407, 2, 8380405, 8380413, 8380401, 11, 8380408, 10, 0, 33, 11, 3, 8380393, 8380411, 5, 8380399, 8380398, 8380389, 5, 14, 8380416, 16, 8380393, 8380404, 19, 8380415, 8380405, 8380398, 8380384, 8380391, 8380379, 24, 25, 8380390, 8380412, 8, 25, 8380406, 6, 8, 8380407, 8380395, 8380407, 8380415, 8380409, 8380388, 8380410, 8, 26, 11, 32, 8380401, 8380409, 8380396, 0, 5, 10, 8380403, 24, 8380411, 33, 8380413, 0, 3, 8380398, 8380415, 8380395, 6, 46, 8380384, 10, 8380414, 28, 16, 8380396, 6, 8380411, 5, 15, 8380389, 1, 14, 11, 35, 8380410, 24], -[8380397, 8380412, 35, 2, 10, 23, 16, 8380409, 10, 7, 8380413, 8380409, 25, 30, 8380387, 5, 8380408, 8380415, 8380392, 8380401, 2, 8380394, 8380399, 15, 2, 8380403, 8380398, 9, 8380399, 16, 3, 14, 1, 8380416, 8380400, 22, 25, 19, 8380406, 8380415, 30, 11, 32, 12, 8380404, 8380393, 8380385, 8380386, 1, 4, 8380414, 8380394, 11, 8380414, 12, 11, 8380409, 6, 13, 14, 8380406, 8380410, 14, 29, 8, 8380402, 9, 8380399, 8380391, 19, 8380412, 8380400, 8380401, 8380412, 18, 8380398, 20, 31, 8380369, 8, 16, 20, 2, 8380411, 8380390, 8380397, 8380405, 9, 4, 8380405, 2, 8380403, 8380398, 3, 5, 8380410, 21, 24, 8380380, 29, 8380394, 10, 8380387, 8380415, 50, 8380414, 6, 8380411, 8380390, 10, 8380397, 36, 8380412, 19, 8380416, 8380406, 13, 8380410, 23, 29, 0, 20, 15, 3, 32, 8380411, 2, 8380409, 8380415, 8380401, 13, 8380398, 8380412, 8380392, 2, 27, 44, 17, 5, 8380396, 8380412, 11, 8380416, 9, 9, 3, 2, 11, 17, 14, 0, 8380402, 8380397, 1, 8380407, 15, 1, 8380399, 8380416, 8380370, 19, 8380413, 8380402, 2, 8, 12, 8380402, 11, 8, 8380416, 5, 1, 2, 8380412, 8380407, 8380412, 1, 11, 27, 29, 8380409, 11, 8380405, 21, 8380389, 8380383, 9, 8380381, 2, 8380388, 20, 7, 9, 37, 5, 11, 7, 8380406, 10, 8380395, 18, 8380408, 19, 14, 2, 8380392, 36, 8380398, 28, 24, 23, 14, 8380413, 8380385, 20, 8380373, 21, 14, 6, 13, 8380400, 8380414, 39, 8380408, 2, 9, 8380400, 1, 54, 8380412, 31, 8380400, 22, 8380407, 8380382, 29, 3, 8380386, 8380407, 24, 34, 8380395, 30, 8380397, 8380400, 8380411, 8380399, 13, 8380400, 4, 17, 8380384, 31, 6, 8380416, 30], -[8380397, 8380412, 1, 8380412, 8380394, 9, 8380407, 2, 3, 8380413, 25, 8380405, 11, 8380403, 8380405, 2, 17, 5, 13, 15, 29, 0, 8, 8380415, 8380414, 2, 8380399, 8380389, 14, 8380411, 8380413, 8380397, 8380403, 8380390, 5, 32, 6, 8, 8380402, 8380406, 8380408, 8380387, 5, 18, 46, 8380403, 8380411, 8380413, 21, 2, 8380403, 14, 14, 16, 8380407, 8380414, 10, 8380407, 5, 8380402, 8380393, 8380404, 3, 35, 23, 8380413, 8380408, 8380406, 8380414, 8380408, 8380405, 19, 2, 8380399, 8380401, 13, 21, 9, 8380411, 8380409, 8380416, 8380382, 16, 5, 8380410, 27, 8380402, 8380397, 8380403, 8, 16, 0, 15, 1, 3, 9, 18, 8380405, 10, 8380404, 7, 8380403, 27, 11, 8380408, 0, 8380382, 14, 8380415, 0, 36, 8380382, 8380411, 8380416, 5, 8380404, 8380407, 8380413, 6, 9, 28, 21, 19, 20, 4, 4, 33, 20, 19, 8380398, 1, 8380398, 8380393, 8380415, 25, 8380410, 8380409, 8, 8380414, 8380389, 4, 8380412, 8380399, 8380413, 24, 3, 8380399, 8380404, 7, 10, 29, 13, 31, 6, 13, 8380400, 7, 17, 25, 27, 8380391, 8380397, 8380392, 8380408, 8380416, 8380405, 23, 19, 8380412, 8380398, 8380403, 38, 8380411, 8380416, 2, 18, 11, 8380402, 8380392, 8380416, 7, 8380415, 1, 34, 21, 12, 22, 17, 8380379, 14, 12, 29, 8380413, 8380414, 28, 8380404, 8380408, 33, 9, 31, 8380406, 8380413, 8380396, 9, 8380405, 8380407, 37, 8380399, 15, 10, 19, 22, 8380398, 20, 32, 8380386, 7, 8380398, 9, 8380405, 8380415, 12, 36, 8380411, 22, 29, 8380415, 8380412, 28, 8380398, 8380404, 11, 22, 8380407, 8380398, 8380414, 8380414, 8380398, 18, 8380397, 8380410, 12, 8380414, 8380401, 8380402, 8380397, 8380377, 8380391, 8, 40, 5, 0, 0, 8380388, 8380410, 39], -[19, 8380416, 17, 19, 12, 22, 8380409, 8380395, 6, 8380409, 8380408, 8380397, 1, 20, 31, 1, 25, 16, 1, 8380394, 1, 18, 8380409, 8380416, 8380405, 1, 3, 8380415, 17, 1, 8380394, 0, 8380411, 26, 23, 8380407, 1, 5, 17, 12, 14, 19, 8380407, 8380401, 8380388, 10, 8380414, 17, 13, 1, 7, 8380403, 7, 8380402, 8380383, 8380396, 8380400, 8, 15, 18, 1, 8, 31, 41, 5, 1, 37, 8380415, 8380373, 4, 8380406, 1, 13, 8380413, 0, 6, 22, 17, 8, 10, 13, 14, 8380406, 8, 8380407, 25, 26, 8380414, 11, 3, 8380414, 8380398, 8380382, 8380400, 10, 18, 8380404, 10, 4, 14, 2, 2, 8380405, 6, 8380403, 13, 8380390, 8380392, 8380405, 29, 8380404, 12, 8380409, 27, 8380412, 8380382, 8380399, 8380382, 8380411, 13, 9, 8380414, 8380415, 6, 8380388, 23, 48, 11, 16, 8380409, 8380416, 8380396, 8380405, 8380406, 0, 21, 8380389, 15, 23, 8380412, 10, 8380412, 23, 7, 9, 36, 0, 9, 5, 8380407, 8380402, 9, 6, 8380406, 8380400, 8380412, 8380408, 14, 11, 8380402, 8380405, 15, 2, 10, 8380413, 8380393, 8380414, 8380396, 10, 8380396, 2, 36, 8380402, 30, 8380407, 8380400, 8380406, 8380372, 8380399, 8380408, 21, 29, 8380378, 8380415, 8380413, 8380408, 16, 3, 7, 8380415, 8380391, 8380415, 2, 8380405, 8380409, 8380408, 23, 6, 18, 29, 8380415, 18, 8380409, 10, 20, 11, 21, 8380412, 8380397, 18, 8380404, 13, 18, 8380414, 21, 8380416, 8380386, 23, 8380389, 8380400, 12, 8380414, 8380391, 8380399, 8380416, 46, 8380414, 8380394, 8380405, 15, 9, 8380398, 12, 8380404, 3, 8380393, 8380388, 19, 8380400, 6, 8380393, 8, 3, 5, 4, 5, 2, 7, 8380397, 14, 2, 8380391, 15, 4, 8380407, 8380391], -[4, 17, 0, 8380391, 8380365, 3, 29, 19, 55, 17, 19, 6, 18, 0, 5, 8380393, 2, 8380414, 0, 13, 8380412, 11, 10, 8380400, 24, 18, 8380413, 8380408, 8380414, 8380400, 6, 8380396, 8380411, 8380403, 8380415, 7, 17, 8380413, 12, 8380408, 1, 8380413, 11, 0, 8380397, 8380401, 8380403, 21, 5, 4, 8380409, 3, 8380393, 8380372, 8380406, 45, 14, 29, 11, 35, 27, 3, 8380416, 8380401, 2, 2, 8380409, 8380413, 8, 46, 5, 2, 8380413, 6, 13, 8380402, 8380405, 8380411, 9, 22, 20, 8380415, 8380411, 8380390, 8380411, 8380385, 14, 19, 1, 8, 8380400, 8380378, 8380399, 8380403, 23, 8380380, 8380411, 8380407, 8380391, 8380411, 8, 9, 3, 19, 12, 12, 26, 8, 8380402, 8380391, 8380412, 14, 16, 2, 8380410, 8380392, 8380410, 8380410, 8380402, 45, 8380406, 8380404, 8380394, 8380403, 11, 13, 12, 5, 8380401, 14, 8380411, 36, 32, 10, 22, 8380411, 9, 8380416, 8380374, 8380388, 8380381, 16, 26, 8380411, 8380397, 8380387, 8380397, 8380403, 8380416, 7, 8380415, 8380408, 8380400, 7, 15, 8380405, 8380412, 8380399, 8380388, 8380404, 13, 31, 11, 8380396, 1, 8380415, 8380411, 8380404, 2, 8380399, 8380377, 8380398, 6, 49, 10, 8380409, 17, 8380384, 15, 8380397, 11, 16, 8380414, 8380399, 8380399, 8380407, 9, 42, 20, 8380415, 8380404, 8380411, 8380409, 2, 12, 29, 8380385, 0, 0, 8380392, 8380405, 8380402, 0, 8, 8380393, 25, 8380412, 7, 8380409, 8380396, 11, 5, 8380381, 8380408, 22, 21, 8380369, 8380411, 8380416, 8380401, 8380412, 8380384, 17, 3, 10, 10, 8380414, 18, 13, 9, 8380413, 8380401, 11, 10, 2, 8380409, 10, 37, 8380394, 8380412, 8380409, 8380411, 2, 8380400, 8380392, 8380410, 6, 12, 6, 8380404, 8380405, 8380394, 8380409, 2, 8380411, 9]] -z: [[8178739, 229713, 8091186, 503270, 84776, 517873, 16134, 90087, 8270557, 112955, 202959, 8262880, 8155921, 279087, 8091641, 8293534, 204509, 292276, 8068153, 520423, 439696, 218623, 8344963, 265145, 467151, 8289254, 368903, 37971, 223047, 320827, 164412, 7892315, 183259, 469939, 311491, 7931581, 8347347, 8195584, 8032384, 8166552, 167561, 8122927, 331598, 72556, 227096, 7868173, 521115, 278089, 138471, 317062, 217391, 8269012, 234825, 8229044, 8225523, 8037585, 467418, 96850, 7925183, 7870804, 8155245, 8237398, 460660, 8030567, 7960414, 7942830, 7975932, 251338, 8220265, 8216776, 8345889, 64664, 425134, 184054, 316795, 512941, 104512, 8247137, 8031223, 8124881, 222640, 75655, 8235943, 8373324, 8067510, 8081484, 121629, 8378664, 332424, 18859, 128377, 8142243, 208442, 8047815, 50424, 501923, 479522, 252719, 7914772, 257392, 407303, 440345, 8116328, 7944739, 8275334, 179564, 7874725, 466777, 149230, 8243009, 8338119, 8003835, 379019, 455633, 384839, 363170, 473664, 314599, 8222128, 3939, 88367, 121364, 254587, 8093422, 8139411, 94687, 8262441, 8108153, 493097, 240776, 8338704, 196497, 131270, 7965588, 42590, 7959684, 7870847, 333978, 8119744, 8287492, 84017, 8379893, 513210, 253557, 7978950, 8065232, 131288, 348275, 387916, 297949, 8204179, 8302788, 103131, 84913, 8163189, 7932967, 473894, 8137259, 394737, 492892, 248873, 95104, 8355894, 7896997, 13336, 408371, 417265, 8373961, 8219113, 8362512, 7888592, 237857, 16233, 14034, 384913, 141345, 8198973, 8045586, 7887542, 273904, 451206, 134730, 411802, 125857, 8128961, 8339476, 406030, 463938, 86859, 8139385, 8318687, 8035126, 8362011, 8379064, 8323084, 358966, 8242984, 8063040, 343943, 61272, 516517, 8291106, 85718, 65535, 82493, 210846, 291988, 8376057, 46295, 385942, 269456, 7981057, 265435, 7968286, 8343728, 230140, 167594, 369612, 71184, 8056973, 519369, 8094738, 7886744, 362219, 347730, 8277810, 370375, 8245226, 345563, 8322351, 222380, 8302787, 27026, 8181441, 445476, 7312, 8111394, 8065163, 8029830, 272612, 8073441, 135093, 7988217, 8115524, 8234159, 7957591, 8025835, 167914, 8235734, 102078, 75910, 293766, 442696, 53529, 9816, 8139584], -[7864923, 346293, 8207853, 194571, 173825, 8052970, 8009963, 34990, 7991213, 4404, 8269729, 8107196, 7861135, 8142811, 7969223, 8117935, 439565, 8172701, 8238276, 8267465, 103289, 246783, 478124, 345627, 8296593, 429040, 7984111, 513811, 8044380, 8318409, 8245417, 519765, 8177988, 8323609, 3189, 7965827, 8289846, 492822, 259367, 492784, 7976184, 7862948, 8004154, 8056884, 71071, 295908, 8129629, 7968544, 7910487, 473410, 8377438, 402469, 126056, 8291894, 8054293, 8205662, 8331616, 8210221, 7858767, 8361145, 7889808, 8155344, 7924336, 7879840, 8379361, 7894520, 7994632, 8240828, 8112829, 440539, 16799, 7861422, 214194, 432376, 233213, 7970174, 508381, 183943, 7867753, 8334918, 8211796, 117438, 261131, 346831, 15825, 8063631, 7977785, 8086838, 7899042, 417538, 7938034, 246606, 374150, 8380102, 188881, 42560, 515759, 7911193, 8266789, 7890369, 465244, 8266249, 8201524, 8285462, 8307804, 468934, 7992701, 8370535, 288560, 155230, 8336112, 405200, 201579, 355046, 464305, 8379098, 7906596, 498972, 252046, 8093628, 8059220, 8227186, 390657, 8106811, 8339174, 140611, 8171197, 296587, 8270262, 8078311, 8294116, 481420, 346568, 8065636, 8098922, 407772, 8140102, 7957292, 3922, 23419, 175064, 509466, 8029424, 8135237, 8183303, 203381, 7960111, 8099484, 234899, 148203, 314525, 7945051, 251078, 8149441, 146133, 484947, 356539, 7975800, 8173241, 459091, 8085435, 8309651, 508494, 458105, 39662, 8133816, 8275733, 131790, 8141196, 7973836, 17538, 344742, 191696, 342466, 8241607, 84015, 196020, 8071545, 189817, 322543, 8239086, 8022826, 8247783, 497491, 460935, 290746, 7977135, 65471, 112915, 7956828, 239251, 8314130, 8372601, 7936261, 496150, 103549, 8323545, 8312156, 121152, 8115932, 8329406, 8379969, 26238, 8231032, 8258972, 7985128, 7866435, 8230703, 162484, 8075287, 448965, 7906032, 5419, 8179113, 306439, 56513, 7928541, 8078554, 8354100, 65957, 7891369, 8015070, 7919669, 7926231, 300458, 60375, 448516, 8034362, 51097, 435074, 8172789, 289564, 8220126, 8355056, 7932279, 8321479, 340430, 8341351, 8253067, 8153761, 8146824, 521868, 520679, 8325635, 8150357, 8028613, 384564, 376242, 66170, 8247487, 7872742, 182807, 419994, 8192221, 130171, 7922178], -[411070, 118455, 8322516, 34774, 246532, 8152700, 15417, 145604, 364163, 247837, 153072, 178400, 186978, 8147844, 418977, 82189, 8238412, 8167408, 509867, 8136233, 8189600, 418046, 198578, 5402, 516438, 484705, 7995992, 7917191, 253184, 7960719, 68438, 7991430, 7895597, 59017, 326572, 481647, 326000, 8225562, 417891, 524124, 7969429, 189974, 8279903, 8085210, 38878, 8334821, 7967495, 7867633, 7901322, 7909636, 13640, 8050938, 8188288, 259621, 432627, 495340, 402204, 8041345, 254710, 82485, 420932, 8213438, 8056911, 8242968, 8064926, 7926651, 371003, 119347, 586, 431683, 523415, 8107112, 8123703, 350037, 8116386, 442253, 8241971, 8376930, 8182051, 8083535, 8013092, 8124996, 121788, 7902836, 102582, 224018, 269485, 72380, 337873, 16826, 462659, 8264756, 8209814, 8347576, 8000058, 8281675, 8341649, 13509, 7887185, 178584, 355529, 346646, 332730, 415932, 8095114, 144260, 8326061, 8323795, 222243, 124164, 7959728, 324262, 8355073, 8372536, 509795, 8226908, 388915, 8328937, 372189, 8181955, 7865735, 411528, 8295227, 8201104, 8343204, 8372702, 8032055, 8251181, 8114050, 8291889, 7928006, 8044776, 217215, 8258033, 8118512, 103741, 70888, 82073, 8000162, 31183, 134336, 8250275, 7926074, 196933, 7957264, 96131, 8312135, 504581, 8198528, 521095, 8222075, 8334097, 176457, 410780, 8120724, 8342947, 7901415, 167930, 105088, 8330317, 213147, 8149694, 7886453, 203065, 8317988, 491576, 52733, 446713, 7870209, 51143, 7978530, 205901, 8212220, 8093303, 17658, 8272176, 8337887, 237218, 8271878, 150065, 340308, 112135, 417025, 8210804, 8178989, 7868115, 8049020, 421686, 23668, 296263, 160091, 8130070, 8369684, 339746, 154730, 264795, 8297745, 7873297, 7956065, 476632, 62646, 7947112, 7955120, 391553, 8008725, 8323166, 307703, 132948, 8053574, 8343755, 8345554, 8235027, 8047472, 7964033, 462909, 20600, 8252658, 72340, 8313472, 62214, 204052, 451900, 8268928, 8154097, 297008, 153777, 8031996, 307509, 318886, 198380, 8298447, 276860, 33745, 385276, 7914810, 8170614, 8231406, 7958006, 90742, 8069726, 8045433, 472888, 344715, 454439, 205880, 226194, 59885, 23920, 227494, 8316403, 112704, 8240495, 7957050, 8102025, 93189, 95294], -[7955323, 8372337, 335001, 7901141, 420057, 8096673, 150343, 8111146, 265788, 221235, 418203, 261699, 391707, 74260, 182541, 124172, 8014314, 225160, 7992096, 7983538, 234570, 8023218, 202108, 8316178, 8255524, 7863224, 8017905, 57942, 8018739, 7891419, 263469, 8258212, 7887089, 322815, 135061, 8010003, 7864506, 414388, 8138900, 147358, 8117622, 8300371, 8342095, 8082878, 182186, 221521, 8048294, 7936414, 275348, 241683, 8348114, 503042, 8292499, 8092799, 448589, 20329, 8237439, 140039, 501443, 231801, 89072, 8324111, 8070697, 8106505, 64608, 8283225, 8137389, 8050671, 8024378, 394232, 124571, 33689, 389400, 267985, 4030, 440875, 8047506, 17959, 8127614, 8163859, 8218379, 8297354, 8265081, 459873, 8219642, 216066, 379615, 8334588, 8190265, 8053629, 8165156, 200210, 8322609, 8155960, 8211620, 8157406, 217654, 531, 18796, 494926, 308846, 8347770, 190265, 82675, 495054, 8379779, 8306039, 7895316, 269865, 495776, 8039342, 315998, 84742, 8321254, 8095086, 7874567, 292051, 447801, 84366, 8237499, 394724, 8066720, 409369, 8290521, 71109, 8267337, 36622, 7912290, 314277, 8269123, 8196284, 441527, 7894341, 8304586, 286507, 43080, 168458, 8047221, 7941179, 7922192, 265832, 8058098, 421158, 7955793, 7994977, 8142616, 8187674, 223512, 169598, 8328067, 78472, 445921, 300046, 121473, 262234, 415412, 13137, 8303561, 513362, 8339626, 304204, 7862103, 142036, 8040472, 8306675, 517106, 107353, 437943, 8283522, 100986, 385588, 8221102, 43259, 158428, 505829, 437480, 8127813, 28246, 500979, 8058664, 86856, 8307255, 8127291, 435639, 402930, 265626, 409931, 8308379, 335284, 155156, 106499, 8369719, 312126, 8181810, 7934974, 8169841, 8133070, 108349, 8251976, 8155805, 177238, 198183, 7999086, 8124835, 8239034, 7965125, 8317169, 438619, 8301147, 8111664, 7920472, 519072, 310494, 373156, 438668, 16434, 8357600, 447586, 155971, 8251573, 303525, 8036863, 218885, 95402, 403662, 8329604, 342375, 8011655, 168336, 51095, 8207271, 37026, 379256, 8187419, 8192836, 8233398, 381932, 235995, 8098698, 456294, 7963435, 8350722, 402517, 164150, 8181828, 8238730, 8003761, 385250, 7983485, 8046153, 265073, 8349569, 197357, 8297116, 483978, 7908997], -[303246, 8368562, 7869951, 8220123, 273367, 8272322, 8248239, 7995807, 78952, 461826, 8358974, 293475, 397418, 8051152, 480600, 8175822, 8168320, 441007, 234695, 44880, 7862428, 7873708, 8311277, 328268, 8025207, 332646, 438113, 267307, 243169, 270005, 500557, 8276347, 8078923, 8103395, 8090407, 8100979, 8260967, 7858586, 481438, 124960, 76268, 181479, 8227604, 8042352, 111802, 222146, 27130, 487863, 8179814, 7948358, 8187161, 502591, 7975967, 7897398, 46201, 151826, 66415, 192091, 104582, 160309, 7975324, 8178663, 8285416, 370509, 427508, 8292178, 171627, 471002, 407606, 299522, 8100823, 8232561, 8104839, 137869, 7996053, 111379, 448046, 310441, 8207289, 8250471, 518660, 8365850, 262657, 8229429, 314491, 8028293, 460232, 7982887, 12808, 275881, 6114, 420028, 8119481, 8317037, 196185, 8200963, 263769, 8025461, 8268452, 125146, 7999722, 498370, 8042416, 8241873, 50139, 394854, 8281806, 7889293, 211058, 8123429, 7931601, 8352243, 7984588, 223673, 473438, 8135136, 8049182, 153054, 133154, 299003, 8085090, 8368348, 8345805, 109611, 10195, 7601, 8228208, 8192113, 471693, 349374, 7862914, 7876678, 7949619, 339515, 301597, 8212936, 277481, 305227, 59331, 8148277, 176797, 138799, 424599, 8207971, 8067708, 8066905, 8110578, 417672, 19776, 303361, 20502, 145622, 8100121, 8220413, 8093763, 8042989, 257554, 8050803, 8182859, 7971104, 7959517, 7995712, 8129606, 8337511, 374936, 281608, 8096233, 8315965, 506083, 373259, 21999, 350794, 8150091, 7885954, 99481, 426760, 509148, 8178866, 8166019, 468584, 89757, 8264550, 7872724, 186451, 263336, 8037731, 7923609, 7953243, 8186514, 8287636, 351235, 8181354, 489010, 7925502, 470188, 7887364, 328936, 72223, 283594, 8164663, 8261529, 8149166, 207726, 325558, 127632, 8175786, 7884191, 7861506, 7993034, 362428, 349837, 7913001, 8247941, 8028675, 36175, 74525, 8261031, 220504, 185904, 340683, 336497, 28503, 409004, 8218958, 8037197, 410862, 8248312, 8065959, 483259, 20424, 468987, 8215778, 8053050, 8295476, 216641, 274354, 8259578, 8350898, 264136, 7911016, 3092, 73180, 8049281, 23412, 7928822, 8201853, 8110746, 62862, 77162, 61563, 228301, 8256474, 313328, 8011728, 8052875, 8159825]] -||z||: 524124, ||z|| too large -r0: [[-156751, -165762, 199093, 202457, -30040, -208580, -27858, -216977, 240928, -259784, 172198, -41550, -138944, 212976, -190244, 187268, -243456, -113496, -57610, 193507, 184770, -232190, -129410, -176802, -22805, 4541, 43045, 122222, -108348, 897, -149891, 141436, -183788, -40987, -170535, 103744, 175561, -127921, 244310, 150704, 3230, -18368, -219452, -120810, -210842, -225423, -33882, -178682, -140666, 173411, 3441, 20679, -209544, 60653, -132561, 193503, -27474, -89309, -171045, 9369, 198773, 209069, -186705, 233537, -74666, 4117, 105924, 161924, 229412, -249567, 228035, -9085, 153368, -236580, 128174, 19442, -32839, -147002, -39083, -257921, 57627, -90632, 230618, -42958, -166415, 171650, 110610, 36315, 237809, -188676, -85288, -8867, -233154, 189380, -257822, -52804, -117894, 72661, -244585, 57703, -174879, -131013, -176155, -198497, -235303, 52326, -64165, -75043, -242153, 54397, -35492, 30065, 19043, 69029, -143019, -86604, -137376, -16564, 16480, -213117, -165378, -103175, 44438, -29645, 185034, -150553, -227235, -175445, 236157, 97959, 120433, -189240, -247328, -45834, 96031, -167803, 176476, 129081, -60713, -122599, -169774, 140799, 142093, -128067, -65261, -124128, 34983, 4061, -113957, 38284, 244217, 107071, -43375, -43378, -31202, 88984, -206951, 24849, -202652, 258083, 99478, -249901, -145413, 54901, -115306, 77317, -48434, -66078, -141669, 13476, 211286, -252506, -189426, -131510, -65771, 206931, 182576, 23081, -254736, 47994, 152054, -248205, -233476, 32894, -87102, 66836, 164059, -59540, -54112, -183382, -168821, 136974, 185095, -249265, -25914, -204960, 93408, 223466, -230988, -213884, -127812, -20137, -140030, 51371, 235679, -108473, 250193, -5796, 136853, 715, 7819, 95674, -101865, -151035, -215521, 105420, -180905, -62609, -23702, 223897, 138915, -172600, -154875, 180103, 135080, -127944, 123710, 51746, 172882, -190332, -253917, 160846, 30256, -6248, -48439, 20862, -29974, -179633, 257524, -153768, 57910, -41574, 169174, 199349, -85563, 109420, 163073, -253520, -190107, -36411, 165809, -77981, -198116, 153478, -113049, -134091], -[92213, -231462, -106275, 207346, -254961, -57100, -54758, 101592, 63595, -234300, -23925, 41982, -206884, -124902, 229406, 226509, 70864, 219342, -195223, -181859, -60325, -39805, -135952, 84942, -173694, 9748, 168775, -239109, -257385, 25803, -159454, -93425, -95598, -194790, -196870, 229982, 124138, 68457, 253409, 61991, 113847, 35490, 50389, -136954, -71394, -66509, 74083, -106791, 153446, -46472, -90889, 125280, -116805, -92301, 121283, -70271, -20695, -124988, -117730, 178105, 212111, -99622, -40894, 177619, -12027, 59220, 47394, 201098, -166308, -188912, 210083, -9055, -191436, -188130, 188992, -163316, 115499, 247785, 170112, -223001, -173390, -22031, 21428, 46332, 148953, -248110, -156417, -230257, 111511, -118469, -208122, 237031, -250670, 87302, -253544, 47181, 41824, 22508, 3342, -11560, -216244, 125046, 160099, -177170, -146683, -65147, -84795, -71151, -155828, 62820, -207991, 55494, -184183, 241529, 225221, 52007, 187335, -222813, -41978, 43190, -170098, 226984, 226286, -145755, 126049, 115406, 183360, 83090, -11621, -14995, 222870, 41037, -120533, -96944, 33879, -35508, -120311, -29090, 233173, 37413, 144156, -9637, 186993, 98853, -218116, -59847, 129626, 125608, 230974, -108685, -211358, -187441, -174229, -9067, -112155, 164806, -116478, -91485, 32742, -249007, -181108, -38056, -217766, 138605, -50068, 169679, -98798, -48896, 184695, -30995, -254575, -83512, -20297, -174419, 92652, 144959, 252833, 58579, -180560, 212496, -135839, -10700, 186786, -183842, 143077, 238264, 36505, -133406, 252448, 76260, -253317, 73577, -142197, 62235, 183618, 205700, 64321, 35352, -14506, -29276, 92169, -103843, 193467, -167462, -110944, 202808, -104145, 135376, 58147, 87798, 181276, -249036, 175689, 9233, -260737, -157556, 90809, -163231, 114786, -215655, -144990, 209321, -109100, 203068, -126628, -63155, 198369, -43462, 232246, -221748, 30030, 240392, 98788, -131124, -91602, 31755, 201773, -79468, 184182, 105602, 118345, 184200, 41351, -188358, 96267, -64535, 95532, 156437, -197857, -237106, -234176, 118410, -73602, -58635, -66754, -145862], -[-241493, -181558, 185372, -148801, -243903, -95616, 240834, -120572, 136507, 178903, -206006, -39632, 73624, -108403, -197483, -218702, 105379, -96728, 183393, -35635, 72597, 186066, -140387, -90881, 51303, 258577, -82847, 112558, 62445, -246023, -32113, -76082, -147628, 47234, -190166, 232821, 24760, -129788, -231323, 34529, 210810, -164392, 135651, -261632, -50409, -106544, 182326, 9767, 113894, 186112, 146304, -225028, 17195, 253030, 115774, 241109, 31407, 53630, 257948, -107583, 6392, 59559, -131488, -136473, 148030, 37913, 184534, -73553, 116992, -101361, 240286, 40358, 185264, -10552, 75852, -204835, -223697, 34832, 253771, 155019, 253065, -187217, -43659, 163927, 261447, 41870, -107794, -31355, 6375, -253613, -215197, -166210, -241340, -223792, 214020, -144008, -85051, 156858, -147621, 209129, 63444, 93143, 126879, -171317, -234330, 240343, -71394, 134302, 157939, -154858, -219694, 110131, -243820, -210388, -251832, 18671, -157165, -4269, -105293, -188223, 183719, -108824, 24676, 109546, -157177, -141557, -52778, 155509, -124445, -79626, -98753, 193738, 241922, 190330, 48898, -198883, 261024, 160804, 3281, 45131, -224069, -197531, 119230, 224102, 61481, 200746, 76371, 31988, 2530, 230102, 243646, -8447, -178685, 124362, 80853, 178725, -41691, 203134, -105879, 88771, -40473, -138393, -240807, 244784, 218367, 217362, -1932, 37133, -28425, -204989, -126247, -3152, 204004, 114933, 59837, -47784, 41150, 202086, 76018, 185381, 51231, 193711, -62657, 55152, -30268, -107791, 98077, 184461, 72784, -223916, 38318, 56733, 261151, 79087, -185281, 61831, -95701, 37936, 126980, 230881, 29604, -9684, -216001, 93066, 106200, 255000, -181330, -88150, -214408, -219472, 114992, -215064, 139585, 190466, -174128, 134260, 166052, 151287, -261845, -47361, 177739, -93723, -106018, -183718, 223189, 124048, 148082, 3036, -230289, 100257, -213983, -153374, 180760, 98954, 34565, -156170, -149965, -15360, -78002, -172940, 179911, 136959, -229409, 241533, 109635, 260140, -81976, 200219, -14854, -121195, 152530, -125582, 114909, 181663, 123897, -154331], -[113771, -176662, -252125, -253131, 66724, 49706, -49761, 94136, -61212, 215787, 213108, 113869, -35969, 145987, 15, -66737, 179637, -246334, -239472, 10316, -31387, -259892, 206523, -18277, -118574, 61498, 66342, -228691, -15201, -22185, -58771, -82751, -259663, 173322, 5097, 15861, 112737, -101790, 57008, -203378, 28411, 132746, -196687, -205509, 108531, 235505, -100697, 232777, -232433, -48627, -242149, -151586, -114977, 171784, 195560, -197051, 116209, 795, 183859, 104800, -59431, 114554, -238952, 160092, 119051, -237177, 247365, -197503, 153151, -163962, -202157, 102017, -99247, -142988, -25437, 114137, -106442, -216794, 235869, 21206, -211336, -8038, 132286, 188450, 1882, -186043, 103850, 27579, -243021, -197742, 161728, -140803, -173635, 183145, -152401, -96338, 213462, -205199, 60876, -146116, -254985, 121383, 46871, -92162, 176965, 126281, -70712, 15341, 103766, 168304, -91520, 195701, 241347, -52514, -201491, 219095, -177107, 179531, -99793, 6890, 192273, 130835, -48844, 53123, 83130, -228417, 59239, -24988, 125794, 92013, -104340, 70000, 152169, 177489, -92927, -209672, 240813, -126502, -59568, -147566, -55277, -212407, -180447, -56171, -14079, -62273, -165495, -172849, -83015, 116963, -29572, 72506, -131093, -236616, -135995, -37437, -167877, -224546, -137318, -242455, -230553, -154474, 90892, -247885, 53353, -253334, 45465, 183554, -227382, -40612, -172847, 167424, 93313, -21624, -207764, 182112, -32839, 221088, -203356, -157030, 211993, -253420, 87403, -240089, -250557, 53984, 250217, -200718, -2657, -224686, -172673, -30779, 135926, 35267, 193954, 14859, 133807, 193262, 972, 216894, -88674, 119187, -139034, 181318, -130755, -18404, -12400, -258574, -66879, -29186, 164113, -3270, 191509, 158130, 148441, 125299, 204043, 155945, 68311, -244663, -141074, -217612, -154728, -255539, -107381, -152779, -23795, -151403, -111834, -225353, 221452, 236537, -209334, 220339, -162965, 138756, 219029, -82001, -199905, -94317, -97528, -93788, 157803, 226051, 76713, 53566, -16620, -20948, -2748, 36972, 167295, -42439, -66782, 116949, 232993, 1395], -[-147233, -105107, 168140, 234541, -60193, 113347, 212480, -47180, 196072, 33111, 167926, 96172, 57817, -206782, -148862, -196241, -208571, 87296, 159224, 29411, 7955, -230838, 255427, 118946, -135327, 187730, -9570, -18331, -76439, 235119, -8862, 124120, -92214, 110122, 111637, -82379, -247992, -176302, -132756, -24209, -37684, -68940, 178359, -185408, 52116, -52334, -73478, -61418, 46581, 154723, 32190, -149165, -7637, 202173, -261374, -133311, -235642, 259841, 39159, 204909, -85295, -5537, 170568, 11307, 76061, -146953, -72060, 148225, 59749, -95435, 194908, -251741, 33348, -208117, 122435, 130871, 186543, 208774, 201832, 26687, -16528, -161281, 252499, 117381, 178658, -44651, -119388, -239489, 239648, -199027, 163190, -71220, 216003, -36773, -201552, -116415, -195166, -169270, -104267, 198324, -98114, -163113, 128171, 131624, 114979, 88821, -213083, -245366, -24722, 89929, 174405, 35391, -112474, 210573, -230808, -104530, 207118, 135267, -62080, -136267, 198158, 200217, 148283, 250268, -167557, -101925, 132752, -123312, -197878, -47439, -139042, 162428, -123074, 174979, -180086, -103377, 15071, -242530, -170420, 178453, 110593, -194819, -153226, -260526, -165061, 56113, 60217, 140319, 221524, -1937, 88503, -58396, -189647, -222113, 144596, -107792, -206206, 18124, -78802, -160832, -181517, 191185, 81612, 146691, -39121, 231505, 78763, 178843, -146437, 158221, -153016, 178672, 52643, -217017, -67917, 251596, -204544, -206541, 56123, 152786, -79050, 179809, -129158, -79440, -44479, -38527, -118155, 28096, 25985, -33826, -97587, -63246, -106577, 32620, 95873, -89744, -139855, 1794, -248983, 23494, -49999, 110700, -171102, 15625, -154669, 237574, -220602, 127199, -74069, 15347, -228907, -162886, -237629, -116403, -73243, -46687, -209607, -172896, -195418, -41535, 259467, 34787, 247062, -228914, 249434, 30386, -143772, 119676, 256910, -85187, 12436, 42845, -64480, -136983, -99773, -39997, -122003, -101428, -62756, 81845, -169472, -101760, 85330, 171497, 107963, 24353, -155063, -202195, -247177, 215526, 94600, 51826, -112552, 111222, 88578, 50649], -[-190111, -175951, 186937, -133779, -219006, 197904, 132837, 212268, 54284, -139298, 98620, 250174, -166780, 210928, -2270, -179414, 32308, -112317, 139214, 140342, 51966, -202711, -244082, 38623, 126274, -29250, 204475, 128001, -108016, -24333, -235792, -24228, 46533, 217761, 143119, -221502, -74815, 52838, -109225, 19050, -85360, 240337, -243149, -207404, -206098, -209132, -157069, -86969, -162884, -48207, -206479, 201676, 226178, 45542, -79306, 171268, -238417, -90027, -11403, -247305, -203253, -18310, 253303, 205054, -178962, 49764, 50109, -19772, -2498, 215491, -25900, 60169, -1755, 145218, 189957, 219383, 64506, 16532, -241403, 156660, 18223, 127895, 233436, -153941, 142637, -38938, 116411, -44352, 55542, -18182, -54934, -258208, -202344, -131632, -109675, -63652, 50741, -132475, 30935, 30521, 144721, -109599, 20859, 106292, -202408, -162250, 249230, 252407, -33491, 26433, -156561, -232548, -220465, 53662, -146311, -44798, 162739, 106615, -80492, -199267, -27807, -251940, 120427, 126088, 76606, -73734, 154385, 128446, -110764, 122520, 19048, -260847, -100204, -194509, 95447, -101451, -125224, -225441, -220667, 62878, 9767, -80442, -57911, -195246, 254787, 211292, -18764, -261273, -130340, 257418, 78757, 97433, -68164, -880, -183927, 130605, 194482, 47930, -151263, -256196, -2181, 165900, -246747, 215974, -259235, 128919, 209998, 46727, -7497, -81050, 17547, 5102, 25561, -173308, -18877, -226906, -132804, -167000, -21165, -73839, 213021, 91555, -226759, -181534, 257419, 242920, 136700, 51629, -4413, -203793, -158090, -107344, 119082, 193459, -241825, 106830, -32935, -25817, -137593, 237489, -202563, 39497, -204069, -155229, -252627, 156753, -131474, -236087, -157382, -187089, -210583, -98551, 136708, 199017, 81947, 8550, 102521, -57637, -175165, -187146, -22111, 108308, -250620, -147963, -106268, 47858, -141690, 85240, 211847, 57058, 229766, -215305, 65409, 199362, 150910, 146410, -146336, -155146, -43961, -213345, -85983, -43728, 224840, -84838, 41787, 169215, -247387, 184083, -62278, -130690, 251222, 102634, 243073, 238616, 160187, 38581]] -||r0||261845, ||r0|| too large -Need new candidate round. ||z|| too large or ||r0|| too large. - -y: [[-341989, 66464, -128125, 119754, 9605, -224492, -271124, 454096, -374398, 307617, 449750, 105469, 466088, 129670, -139977, -204735, -501883, 162902, 421503, -297264, 65203, -518147, 222648, -179778, 37599, 425303, -211775, -331067, -220570, 274800, -370693, 400479, -328150, 110109, 158543, -279494, -389551, -76521, 245788, -431616, 182234, -156980, -41850, -245934, -8079, 470432, -235575, -101881, 101241, -125632, 491712, -243509, 123798, 380236, -56071, -296255, -115620, -181972, 51438, 159330, 277312, 429108, 287413, 395763, 345972, -165267, -293566, -443148, 76179, -387295, -446237, 98940, -212198, -91319, 159428, 315082, -10095, 385722, 410023, 432312, 389029, 405, 57416, -212533, 301027, 67323, -73642, 434438, 359528, 82130, -242127, 37398, -40065, 244967, -334641, 281404, -476106, 37699, 210800, 248885, 176486, 336180, 340398, -145235, 192079, 88414, -40905, 211399, -155957, -124943, 102567, 504593, -440798, 445337, -71618, -35431, -375812, -226307, 519313, -196194, 348191, 314479, -299101, 198298, 32761, 366353, -80897, -398634, -413167, 434265, 334341, -264377, 243348, -388504, -376176, -290760, -88046, -283248, 92136, 75263, 248989, 507739, 52837, 413151, -488820, 292773, 203218, -49813, -238294, 406263, 522793, 96724, -472402, -232368, 485981, -99494, 266256, 61913, -476273, 94603, -30971, 136967, 419707, 31273, 123783, -174657, -1882, 428823, 256787, 40892, -347766, 123053, 315108, 463410, -8298, 483446, -324626, -279306, -399029, -343879, 184426, -321375, -357183, 415784, 215883, 101518, -182789, -270770, -133189, 105517, -92633, 479101, -211577, 38974, 66155, 82904, -55619, -492062, -490549, 501607, -226023, -34105, -270971, -376431, -283438, 309691, 303532, 393849, 201824, -349511, -254313, 458279, 329331, 254193, 417654, -86525, 284505, -91365, 410178, -479387, -306679, -348816, -202677, -352920, -161103, -44442, -10077, 363468, 366011, 79782, -170688, 116693, 14263, -298064, -231147, 260346, -155584, 7054, 450937, 31742, 413488, 58064, 249549, 93808, -340566, 241423, -13854, 287089, -304350, -196874, 152370, -302019, -516612, -135720, -111066, 198382], -[476062, -440388, -274398, -386415, -152513, -399396, -353322, -164772, -329340, 352094, 507669, -247894, 446554, 431522, -508106, -283785, -493657, -403733, -180282, 137613, 330062, 481795, -498614, -373084, 370932, -228028, 103828, 446272, 216387, 61135, -397942, 385553, -77912, -154174, -159577, -431479, 102362, -419892, -416991, 16229, -260692, 56130, 490912, 462975, -136335, 399915, 191394, 389672, -124709, -150167, 339960, 364828, -201143, 290277, 507481, -175093, 362562, 264735, 343715, -77663, 403360, 314441, 283333, -221491, 505927, -85583, 94173, 421520, 37913, 199793, -326225, -118427, -96960, 153050, 441827, -416564, -63979, -431871, -219594, 83525, 306836, -434447, 89303, 25085, -472737, 184745, -436058, 371057, -343660, 164751, 372512, -87782, 92739, -506008, -351094, 88010, -171039, -335355, 332127, 416623, 356974, 303429, 57865, 227642, 54487, -161576, -452030, -510143, 488609, -82973, -520221, -418740, -480411, -208967, 508859, 93064, -366045, 205288, -374422, -368939, -145858, 433261, -328629, 65217, 211501, -405001, -43403, -414397, -504424, -203176, -139774, 111078, -123422, -280754, -283654, 29768, 381259, -124897, 510340, -234631, -114995, -276975, -313627, -430859, 346668, -255292, -20716, 243633, -392616, -70290, 92225, -322592, 255671, 205957, -392242, 374124, -85313, -31682, 61981, 258180, -523453, -196079, 72453, 355839, 283674, -332157, -315774, 74590, -90498, 307462, 464624, 186335, -388968, 417497, 436082, 56816, -113409, 416982, -172742, 319980, 63131, 10919, 339462, -347545, 237912, 432039, 496541, -283563, 485896, -12068, 420296, -495516, -122208, 158931, 87411, 307747, 243289, 405473, -144681, 113932, -149255, -193185, 350428, 469404, 274722, 357757, 78966, 242087, 404154, -234280, -202454, -171890, 92188, 340707, 4317, -160792, -491378, -387996, -316392, -480842, 180469, 422781, 43727, -446077, -169658, -130977, -523828, 215349, 510933, 441989, 287622, -459885, 184165, -447682, -276428, 448727, -191983, -68149, 410545, -64907, 53662, -164580, -347433, 503560, 132377, -366737, 452712, 159404, -50129, 420248, -50996, 163877, -262689, 441319, 151827, -365304], -[-435352, -47839, 103490, -156704, -42967, -130203, -298743, -310624, 424095, -10020, 161760, 259650, 201015, 86289, -401264, -482165, 421874, 467622, 318524, 104215, -465236, -342717, 194702, -142682, 156020, 317445, 389067, 29639, -406564, 119810, 126788, -228757, -517465, 451918, -152878, 479357, 54881, -35270, 285085, -290941, 496083, -514905, -199901, -249886, -467587, 258912, 93198, 448233, 493335, 237635, -211595, -133705, -245236, -218002, 280702, -18604, -34179, 184142, -125303, -489863, -57035, -140992, 257401, -413445, -25429, -420215, -130261, 327862, 238740, -379504, 193279, -361578, -120974, -80034, 522480, -103959, -113996, 458650, -186115, -399297, 105558, 235842, -118609, 342531, 231583, 359962, -459140, -327025, -360085, 513168, 102706, 150343, 498551, 523546, -39154, -108380, 455300, 92504, 330429, -100609, 142335, 95141, -207513, 300610, 65717, 506940, -488095, -349260, -112407, -332345, 144813, 136871, -262845, -81149, 470470, 169890, -355172, 66125, -219913, -37241, 315895, 413367, -48267, -158604, -298415, 260022, 361142, -144472, 160235, -451026, -104026, 222321, -256284, -22967, 193980, -172112, 171226, -523320, 163050, -489922, -19167, -348948, 465235, -142409, -421751, -308950, 468309, -115252, -492206, 370043, 52621, 512055, -205851, -328369, -465570, 458497, -384944, 364446, -384760, -252863, -204856, -337408, 40244, 472136, 376044, 134816, 448693, 299475, -105891, 27981, 374492, -31176, 62323, -140832, -53056, 195703, -314844, -54085, 490589, -229282, 463185, -251015, 229666, -356361, 42729, -418111, -83453, 458641, -446963, -507029, 321384, 329319, -389043, 123957, 477968, 451734, 269541, 460437, 108733, -416705, -372440, 335945, -372622, 58126, 50324, -393233, -118208, -18327, 43917, 345448, 457222, 242781, -288756, -233661, -55437, 279852, 383713, -304791, 427041, 401646, 82997, -61675, 226387, 301570, -306324, 428020, -43609, -412529, 438571, 319375, -141872, -319691, 260721, -271652, -254042, 71766, -76581, -463367, -155230, 40039, -188191, -140853, -201458, -431194, 155129, -396435, 265806, 408127, 188592, -202395, -484332, 435971, 213644, -51132, 366518, -484572], -[-519015, -322411, -357569, 286649, -82536, 73412, -254009, 68522, -263163, 482653, 131287, -12184, 197431, -409188, 129129, -113796, -495595, 141406, -52579, -386393, -238008, -127531, 356845, 457589, 208353, -135585, -239776, 494370, 64358, -225169, -504856, 251559, -270250, -393365, 399223, 261545, 151786, -306076, 252460, -14137, -145105, -473465, 345168, -376087, -58201, 449656, 310614, -488988, 189287, -266637, -396501, 114220, 385074, 394145, 258363, -304863, 289671, -71634, 227577, -374888, -473421, -264375, -198861, 187732, -223469, -320180, 479231, -105110, -508728, 255183, 518977, -62508, -473503, 69378, 115081, 498401, -134626, 287146, -37384, 441631, -449404, -81481, -471452, -452857, 336216, -329222, 292433, -154940, 445689, -214922, 198718, -238255, -86433, -384152, 429342, -114591, -24823, 43336, 56829, 461446, 255848, 194060, -12287, -176503, -270745, 142934, -159183, 337805, -117218, 155121, 40088, -347200, 25279, 129532, -401755, 151952, -341443, 513925, -493895, -460087, -458078, -218316, -246211, -194254, 199828, -18797, 375886, 520428, 356851, 147698, 237470, 179949, 450269, 304845, 295312, 69013, 107141, -401983, 186110, 324632, 379941, -89959, -374722, 414209, -469034, -524032, -204538, 268832, 245091, 446258, 449110, 102003, 207479, -8364, 414098, 199357, -17298, 68200, -478041, 193524, -272745, -411323, 481633, -269803, -282203, 324129, -342397, 192104, 81565, 500887, -519706, -523904, 140755, 276720, -394307, 5472, 397830, 391226, -243931, 520688, 28156, -278258, 244430, -403093, -63728, 208726, 165090, -498903, -367541, 306555, -165615, -480755, -158655, -18211, 495968, 136046, -152994, -251891, 171453, 292664, -519891, 225988, 319643, -44700, -107785, -383902, 455008, 66559, -423407, -304011, -395415, -18161, 274745, -418580, -30900, 21918, 347126, 104935, 203404, 123816, 373890, 292676, 187415, -270497, 320137, -438885, 71212, 278349, -64973, -465187, -492572, 520733, -391570, -97147, -205685, -477802, 471490, 275416, -376573, 15946, 73325, -222079, -161401, -294979, 453237, -79612, -403830, -462335, -495749, 208036, 446684, -238800, 11145, 215720, -77983, 460549], -[-229453, -96359, -32206, 256599, 198168, -501142, 381592, 329973, 180899, -24984, 179002, -428940, 280137, 471222, 155012, 110538, -309558, -507948, -357972, 254923, -191957, -284410, 283431, 452495, 364536, -346800, -320578, -117766, 257817, -198913, 230650, 231072, -143126, 495112, 297076, -449637, -139480, 51305, -271700, -276418, 261803, 275773, -341898, -202651, 488675, -260173, -424384, -461256, 6894, -327911, 313014, 209377, 398468, 233011, 85824, 215610, -425669, -7344, 104369, -315587, 406359, -296726, -1121, 361959, -104802, -451054, -25335, -468816, -83466, 431902, 500654, 90661, -4289, 112776, 170133, 24728, 100654, -327649, 130524, 343618, -235105, 323999, -66876, 92352, -137059, -268234, -155389, 479650, -77903, -180225, 12705, 144798, -304922, 331552, -371278, -41306, 283117, 432149, -99319, -387404, 46093, -152710, -153619, -283283, 315474, -367903, -419337, -121320, -395789, -88181, 282831, -55984, -149042, 269978, -294159, -322044, 37731, -297134, -330138, -414374, -80431, 385243, 267376, 272267, 39881, 228910, -457570, 361322, -6165, 84550, -33179, 296694, 510810, -93907, -363106, -298251, -498298, -438985, -307627, 243044, 66867, 283277, -401105, 415320, -448306, -328031, 443573, 7494, 60689, -35503, -347647, -384073, -284627, 134550, -371038, 420229, -410298, 168524, 391337, 494837, -331753, 440487, -86262, 205201, -50784, 351886, 107827, -94570, -489081, -488287, 424123, 267610, 44858, 209874, -285913, -239490, -272084, 246224, 49954, 359242, 61094, -91558, -196970, 255224, 221907, 475479, 168073, 463307, -518842, -85657, 306228, -402572, -452460, 211256, 483755, -151443, 136440, 328717, -203357, -403536, 372005, -152629, -207389, 249182, -403944, 24962, 146631, 5137, 362565, 110547, -186953, 425379, -204576, 521376, -296707, 239662, -501694, 54612, 208455, -80118, 48878, -295081, -369500, 465276, 433838, -504286, 471630, 354404, 205500, 200409, 295206, 234963, 318207, -286572, -289921, 161552, 372872, -160163, 344987, -111831, -51003, -68187, -485702, 90042, -116782, -166260, 89878, -145975, -334232, -416287, -131852, -516520, -26184, 246740, -91613, 100419]] -NTT(y): [[1160348, 1930630, 2168100, 5297506, 4565745, 445884, 1255355, 5644455, 4697489, 2006528, 783229, 6489857, 1973321, 4466817, 7236069, 1024033, 6099408, 2108572, 7577793, 3619421, 7239187, 5810589, 7065917, 5133517, 6048576, 2704419, 4384313, 7487926, 4332443, 7717418, 2018067, 1497461, 6534780, 7585636, 5193025, 1428990, 1409316, 5696708, 464625, 5315753, 2155090, 1055636, 1432464, 4731792, 2032007, 5523717, 7440289, 8321320, 3451952, 4306699, 7476008, 8230828, 816251, 6186301, 1570913, 8089116, 6663330, 250262, 2726494, 3888810, 4503896, 3378936, 3908943, 5297258, 6467405, 517899, 6435343, 6943425, 1422757, 5017573, 3241682, 6356087, 4895036, 2806698, 6571734, 3471769, 3736465, 8251275, 4125633, 5074400, 6580470, 2315559, 3977454, 925589, 2194253, 657919, 7073620, 8232268, 1446766, 2607061, 888403, 1717321, 1043731, 5600106, 546395, 7676672, 7523513, 5076714, 1544614, 480998, 2889874, 3978981, 2607444, 7574645, 2054581, 3792179, 2410492, 3740221, 6393926, 6448821, 5952769, 4906393, 1645679, 1186631, 228285, 7685683, 7783443, 3693749, 2414518, 6285128, 6733687, 1203592, 3154723, 1863687, 7169426, 214441, 6993006, 1434268, 6817436, 2790092, 8101324, 3443936, 1099407, 225349, 2032441, 554060, 657263, 2824334, 1092013, 5018900, 4818598, 7841114, 2910217, 1623682, 7566639, 2549198, 7378232, 6218689, 6752964, 5639819, 2848745, 6118499, 4339010, 1117655, 356076, 625116, 488992, 1875646, 7101154, 6905602, 2584573, 1211610, 1636833, 1641630, 7361328, 3087828, 4444202, 5726592, 6315272, 4917919, 6882725, 8134165, 5510556, 3438519, 1392645, 1701461, 405810, 5459327, 2545016, 3599582, 5471481, 1923370, 7373081, 1744633, 7547401, 5193430, 1683136, 8110212, 6557040, 2553173, 3577420, 4654239, 974951, 6914365, 7971, 2233862, 3465958, 6160709, 859314, 1230387, 2453529, 5304122, 808344, 3303511, 3325299, 8321660, 3649507, 627032, 1248017, 459613, 3837208, 2394758, 6053234, 2036199, 2790468, 6346731, 6326880, 6478737, 5968763, 3857155, 1506612, 6338907, 3045221, 4313648, 2258800, 48542, 6674581, 4602563, 3272476, 6828767, 4587616, 1737425, 1268488, 2654207, 7717249, 5524136, 324681, 8101939, 1700561, 2337680, 6678032, 3073948, 8376095, 3315014, 5996447, 5710853, 2956642, 8361140, 7335385, 6705413, 1552442, 5123869, 2885368, 1929504, 4842051, 860863], -[3060042, 1885637, 134490, 149529, 7075888, 3343833, 1434, 4188038, 1867630, 5199970, 5504915, 2905030, 2262972, 6183564, 2921497, 5313000, 1651530, 6974193, 4390297, 7677740, 6791341, 2513938, 495122, 2966283, 6987744, 6499211, 7703189, 2550513, 1937368, 103711, 4189119, 3611363, 5584007, 3316243, 4975955, 7222053, 2333120, 3992023, 7109988, 3551679, 2837642, 3437687, 3756978, 8283947, 2923012, 4958225, 7345762, 2765653, 2590992, 2509576, 1243406, 5959441, 7457239, 4718194, 6217477, 4024101, 7397652, 46155, 6283569, 1172362, 2448240, 6781638, 5165530, 6443491, 1338531, 2096210, 280759, 2793041, 1195776, 2003646, 4863065, 2058286, 3721125, 5068106, 2666963, 5101462, 1083870, 896423, 6735550, 1870914, 3639395, 1224807, 8320390, 6956943, 6076549, 1950506, 4233936, 4506291, 5885153, 5168582, 943453, 302754, 599363, 6732844, 317918, 7739887, 1839520, 6543296, 4499825, 7963610, 4965121, 7102726, 358727, 1742312, 5286969, 4276000, 7796754, 315486, 127232, 2110699, 690987, 4133565, 4160720, 4414282, 3213253, 4796022, 2206945, 7747966, 8284933, 2161242, 5423436, 7058518, 3914460, 4143117, 360169, 4170696, 1291206, 7256678, 2698637, 4519557, 7256582, 34103, 3645439, 7398048, 5507110, 2651165, 1359951, 3354059, 2335742, 7465799, 281236, 3987603, 4766523, 692102, 6222967, 627313, 4403719, 2592524, 6720112, 6930783, 6597269, 6125608, 5139060, 1606554, 4025931, 7481974, 7384249, 669685, 8072345, 4787405, 384628, 5835300, 5918420, 2020862, 748111, 2362374, 4234841, 2366947, 6724571, 6809263, 5505506, 7368080, 5702459, 2721853, 2320947, 2545486, 1329699, 6608796, 6949342, 4312991, 3749431, 6417803, 6229789, 5887677, 3007234, 114734, 1180733, 299491, 6544370, 6100629, 1678017, 6636832, 467065, 863810, 2470619, 911606, 416913, 6111997, 1597748, 4292206, 1570646, 1073737, 5838297, 6297722, 5341229, 1347526, 8111913, 1357011, 543839, 1002980, 5870602, 8089278, 7195546, 2887850, 2163003, 4434451, 6113137, 8182776, 996580, 4739634, 2101124, 7020662, 67800, 1624253, 7983021, 735882, 4299942, 677395, 7531277, 3637419, 1558671, 4236385, 4269542, 3204972, 7510626, 2213355, 7769931, 3221697, 2008656, 1004473, 5409487, 3839903, 433619, 8313890, 5979475, 305346, 7341880, 4920014, 7559211, 4298724, 5770084, 4173952, 4260018, 6285880, 247670, 5890026], -[5774149, 1066056, 4140412, 3289608, 8079364, 930707, 7562508, 4639369, 7172420, 3645866, 5601960, 4767320, 7171540, 846555, 5605802, 966835, 6319912, 7657299, 6724271, 4204592, 6199311, 1496140, 2600247, 6460036, 575333, 3140761, 2904946, 4189420, 128810, 6277829, 8287700, 2632100, 2328978, 2270411, 2002140, 8196219, 4838449, 7476699, 4839058, 7534547, 7603728, 2229654, 1538848, 5448552, 1222259, 2290175, 4588603, 5418479, 6888593, 67305, 3077630, 6559304, 8061856, 2653731, 2454480, 3716828, 4708789, 6096144, 5396258, 3681897, 7467156, 4935992, 2496386, 6248758, 7495139, 1666863, 7602076, 5390064, 5447301, 6336485, 3699481, 2211020, 2419868, 1453591, 2615131, 3925369, 825927, 5736430, 5423621, 6254954, 6821239, 2329018, 3028946, 3711979, 4371555, 6982840, 3047527, 3472949, 474076, 7036304, 281011, 7723295, 888135, 8070854, 4187236, 7339035, 4154604, 1910138, 5246081, 4995817, 615533, 7088701, 5231837, 5236370, 1829183, 7160374, 3121699, 1033463, 3826144, 7695547, 3099322, 2968862, 24303, 3138159, 6760871, 7837143, 1526795, 8145496, 7287541, 1340234, 7079702, 2083330, 2020024, 1214786, 4387985, 3409602, 8149466, 6633728, 3642563, 6694772, 3887305, 3810114, 7136633, 6632348, 1772669, 1943660, 4172689, 3520596, 3640142, 209007, 5509852, 7180105, 6866326, 8261673, 2898176, 6112304, 6078359, 69387, 5697492, 3110395, 1934616, 6024109, 3122875, 6622067, 4826977, 6924294, 5161335, 2584102, 6170187, 866542, 7774132, 3950266, 4999375, 443161, 6510817, 497947, 2674616, 1546069, 1046341, 5372414, 210093, 7364185, 3155144, 1456933, 7766600, 2333304, 31877, 1872636, 6110672, 492198, 1805611, 7741508, 4697577, 6993366, 6420912, 7252901, 7693800, 2056764, 6111668, 3968137, 5531450, 71296, 5998240, 5071713, 6417306, 4363567, 6115877, 4643270, 2301731, 7891196, 8014678, 331171, 7505871, 7066445, 6019200, 7083623, 5718159, 1343372, 2561800, 3683200, 7545830, 36815, 5741841, 7899689, 1260479, 4245183, 5225179, 1579746, 1870472, 5243726, 2235202, 6758748, 7246537, 4745341, 2341749, 1647664, 5213512, 5845293, 71654, 5892405, 540594, 8183201, 1385311, 8013194, 3128688, 8015745, 6146353, 3289, 278563, 6359999, 7882191, 6044578, 1717058, 6360372, 7548843, 3673434, 5081116, 6476909, 2737732, 6472586, 2037464, 1780154, 6277377, 2811130, 3371746, 4409392], -[4884018, 1834104, 1716750, 2134675, 738715, 6500881, 3749506, 7756242, 4798984, 839580, 4374288, 6594349, 4957820, 3833268, 4854717, 5026124, 4887971, 8266063, 2374510, 4534390, 4244940, 6700412, 5064932, 1740653, 3176286, 5407052, 2804426, 1549771, 4399965, 4171397, 6389351, 3622456, 6890740, 6265030, 7612059, 7563094, 2935736, 612148, 1658284, 7056162, 3627422, 46727, 4290518, 3832242, 764848, 69260, 6348056, 4659881, 7937436, 4467591, 2648158, 6169157, 190998, 7454502, 5029339, 4254842, 4537968, 7951857, 3783101, 2126483, 4547054, 7915148, 2423385, 7618507, 7677942, 5702247, 8177294, 7132576, 3483220, 6490409, 650210, 5023470, 7178639, 7851519, 3348538, 8262357, 5524369, 3337396, 5153700, 1261737, 618698, 548658, 284206, 4462996, 1314300, 7247478, 7985859, 4376482, 992439, 7046636, 2983925, 169681, 3196057, 3405797, 1124945, 1956314, 1077179, 5158564, 6840842, 3763672, 6245051, 3941601, 4456194, 1878173, 5185875, 4110884, 784991, 3986669, 6137913, 2215286, 6736283, 8224310, 7259680, 3256347, 5004191, 3055523, 148234, 3300753, 335896, 4456298, 2197933, 8149121, 3756425, 4384875, 1988363, 6597655, 2767942, 2778572, 6178698, 5954103, 2098717, 1929657, 1080781, 2430868, 4762626, 1921557, 5515714, 2614585, 1548034, 6946369, 4789019, 2479307, 7325766, 5050663, 8065239, 771043, 7696791, 1647168, 2463096, 8021411, 5972364, 1970237, 2621257, 3058563, 4687385, 4527811, 729552, 3593186, 1765160, 1390247, 5020568, 5849086, 2284479, 7126032, 4486257, 2506657, 5437624, 1458586, 2124866, 5632939, 2064428, 1403507, 7299445, 3619294, 7728761, 1801451, 5119570, 4028255, 4703594, 4642233, 6210484, 4454894, 8176971, 3046636, 1162585, 5164136, 1852596, 3782889, 2022539, 2789384, 6704683, 8311660, 3611938, 1901375, 161779, 6623672, 4972046, 7432013, 3888990, 3912506, 6401667, 586786, 4911268, 6063911, 4636930, 7467328, 5724121, 3194433, 679305, 6852234, 2698033, 4610376, 2397698, 1107943, 1720503, 7888978, 4155617, 6314998, 2903304, 725006, 984046, 7468695, 104672, 3636843, 1843773, 159582, 7714271, 989419, 7772945, 7420366, 4422276, 7245700, 7539715, 8108492, 404083, 4889689, 331663, 7651071, 3472997, 6204687, 3424557, 1293236, 3499656, 86280, 4174855, 2586568, 3291416, 8007273, 8297728, 2172045, 6273072, 4529772, 2253785, 1737799, 6210496, 4791729], -[6300625, 312709, 7578314, 4765512, 5751332, 4473565, 3955687, 3515825, 4594367, 5238976, 5518107, 5471968, 3280055, 7655980, 4331616, 3305848, 5170484, 6039557, 3529582, 3872605, 6968974, 878158, 4276178, 5398104, 2703136, 511500, 1843188, 5528909, 808888, 2649800, 736520, 1262056, 3168021, 5960115, 5966518, 1308195, 5139002, 8091225, 7510786, 2751482, 3943316, 1067330, 1092904, 324466, 1906433, 7580573, 2685963, 980522, 4633648, 3198832, 3494682, 5539354, 5443297, 228931, 7074133, 2117040, 4114490, 3068429, 1800101, 3026425, 1490119, 2663247, 2915700, 5884700, 1414492, 17814, 4345193, 6718994, 2454231, 101225, 8171875, 3159896, 2912813, 3356721, 5585506, 5406749, 4413548, 6033024, 3840004, 7309261, 3002178, 6415963, 2662900, 2358526, 6978814, 1116450, 832446, 4943467, 1834107, 4196476, 2082330, 2554159, 7311437, 7655818, 6660009, 7612985, 6127265, 99726, 7850133, 2440820, 4505669, 7136745, 8231094, 2055540, 5283729, 5215513, 305318, 7104242, 6418317, 4616753, 387723, 3533863, 3310249, 1381530, 443639, 2930808, 6782267, 6562021, 1978114, 856783, 3258832, 469270, 831083, 2220615, 5175299, 3121028, 4997764, 5234907, 2898491, 2300691, 7599061, 461501, 8284733, 4499695, 3896556, 4681300, 2143461, 7581633, 4784895, 4772926, 414363, 6311651, 6045824, 1820495, 3220247, 5435900, 1465383, 7601787, 5335546, 5813372, 2461461, 6024770, 7968758, 2526943, 2031286, 7289566, 3110973, 2249455, 695280, 4078542, 6641982, 5351834, 2393854, 3964745, 5790908, 4343694, 8374311, 7710563, 2451668, 2718810, 5978852, 1599885, 6005592, 6116176, 7043536, 4721455, 2413116, 7950752, 6405175, 4483383, 313775, 3941148, 7287860, 7553938, 6005005, 5332276, 1180785, 7515906, 4537302, 5123954, 7486283, 3181913, 4018585, 4247209, 5482573, 1987034, 2183623, 3837230, 2552000, 5388682, 3862657, 4306902, 3965088, 349803, 1666953, 3928016, 1930270, 2911743, 6529876, 1631003, 1988573, 2120731, 6820531, 445217, 5478013, 8374074, 8010527, 8105859, 8202009, 6634652, 2579927, 2676622, 3322662, 3405046, 2362947, 111194, 698365, 4050605, 2845439, 2125681, 2387255, 7967629, 7229835, 7998874, 5497650, 2981832, 1095984, 6617355, 4573597, 7222248, 2031925, 407883, 4419308, 3536144, 6549188, 6625328, 391764, 4067977, 4021279, 6441201, 3821424, 7964685, 6794320, 4969648, 7769158, 3263343]] -aHat * NTT(y): [[6383167, 5388895, 2753697, 7297636, 8193380, 949578, 3459689, 6103335, 829318, 4258269, 1698316, 3262886, 3590053, 1723822, 6050049, 2340081, 2218936, 259632, 1286750, 5466208, 988301, 8096862, 5400869, 7843951, 544667, 3729221, 3181090, 7477757, 7234999, 3144824, 3422397, 7496682, 7205760, 2031660, 1902463, 2490207, 3379182, 2377919, 8354703, 61079, 940468, 3886339, 171178, 7302, 5372084, 7149079, 6905624, 3290960, 7716549, 3730890, 7596310, 4278976, 2654522, 3090463, 5676014, 1642393, 1367713, 2171794, 3419248, 7527308, 2567194, 5900759, 6534760, 3978735, 784637, 7783178, 7573035, 316463, 8008707, 6597969, 3184917, 6689194, 3852923, 3158655, 4104357, 4568209, 509166, 5726701, 7643893, 6642698, 6182097, 2108793, 7581757, 1388000, 2917137, 5479500, 2989279, 2529343, 2061120, 4046367, 1750307, 4350690, 7714129, 3363587, 3034005, 663129, 5918737, 5246228, 6253675, 7806540, 971594, 3130342, 4162808, 6120696, 7032106, 3826217, 5802039, 7649684, 3156467, 5240308, 3459432, 7134258, 8286546, 2631657, 4038870, 5630242, 6224126, 2130379, 7616416, 5588551, 4354877, 6023940, 2240747, 6522625, 7826219, 4996770, 2114352, 1915659, 7529728, 3256594, 1309651, 2864241, 589743, 6127320, 722138, 2289674, 5630098, 2628131, 2152628, 194322, 2784820, 6400690, 4590700, 1982280, 6608424, 6401463, 7598923, 6983302, 4513353, 7887498, 5882936, 3943037, 986851, 5298858, 956212, 3992880, 2809729, 1813991, 4836414, 185443, 1434314, 3434373, 4825956, 1214105, 3520492, 7549833, 6070798, 4243209, 2655259, 1043873, 4111640, 1506852, 248628, 2643368, 1286258, 4940456, 4950386, 3640142, 8250262, 7317648, 8065174, 2681034, 532707, 5070762, 803901, 7375392, 2009538, 1621746, 5057476, 4018633, 3544149, 3073713, 4857797, 3511131, 4811242, 2201335, 7982771, 4773407, 8042258, 3042893, 3111363, 1317773, 716108, 5913349, 920281, 7604962, 683475, 5685011, 7155386, 7760488, 7158805, 5817109, 3937982, 4008700, 6587600, 2570949, 4897663, 6447709, 3875971, 3923382, 4189429, 1199558, 4864103, 7769414, 2984751, 1879171, 4396923, 885658, 6021467, 2225556, 3348034, 192503, 4392196, 7620587, 41616, 4239951, 1608337, 3876200, 5068357, 3186542, 1116787, 1312402, 2852819, 4374178, 3999669, 1030743, 218940, 4851045, 6836136, 306443, 7964414, 1089812, 6995773, 4833481, 4088502, 110861], -[5793986, 6902600, 4839869, 1261213, 2711946, 506657, 3827849, 5672508, 3750631, 7084312, 1015653, 8270028, 8068153, 7227542, 6804588, 3544048, 6854119, 4293689, 7138567, 1977861, 3526826, 4145215, 1047497, 2124417, 7562477, 1288891, 958637, 4349398, 7848641, 2646240, 2145125, 1186676, 3811205, 6464815, 1771375, 808596, 6886051, 7233550, 502795, 8024157, 712890, 3249628, 7960960, 6143486, 1754222, 74487, 108063, 5783563, 3430513, 8157026, 2638585, 75730, 7799412, 5909299, 639594, 7011278, 478257, 2643538, 4433917, 487377, 7814650, 2250363, 5720640, 836424, 4371993, 7969718, 1013177, 4287138, 176937, 7651853, 1513838, 656301, 8132741, 7548005, 3512998, 2917901, 6979858, 5859132, 1934510, 3705832, 6535028, 11512, 181023, 292694, 1629752, 7034193, 2131041, 5100432, 3347647, 8278231, 616283, 1826243, 4399060, 8149267, 5103285, 3209413, 3350252, 7064339, 7218063, 5966979, 6087801, 2253443, 4442952, 2614934, 4625841, 8346675, 2562989, 5206532, 5404807, 5763019, 3725826, 7928415, 1779421, 7865657, 1659185, 1310146, 8185468, 2689562, 6344988, 4007332, 6387721, 4118892, 6298201, 2999166, 4209452, 6743782, 1718916, 862703, 5666252, 1624297, 2587554, 6522551, 752, 4001327, 2927532, 5226134, 7591106, 6815112, 5462522, 1250844, 3652852, 3292605, 1928510, 8339124, 6107431, 2387249, 1154116, 2858652, 1970860, 1599260, 4235014, 884032, 4555033, 7601326, 2761366, 2484567, 6574928, 5775877, 3320815, 4710681, 8046937, 2099353, 4617623, 667310, 3249792, 8199409, 7958315, 4756773, 253126, 3521574, 7821009, 7021709, 4091628, 8357027, 4708139, 27197, 1737578, 2205643, 2756687, 5652735, 2094240, 7738568, 3858293, 7861911, 5598764, 47404, 2159839, 6618611, 7886497, 3817029, 3780821, 6800744, 544239, 993109, 3341063, 6061360, 7257567, 2793495, 5169212, 1331937, 7104982, 3442302, 4169922, 7161824, 7401011, 3714816, 136756, 5504753, 6882836, 6331987, 5798500, 1238678, 6356290, 4472767, 6870401, 354034, 751974, 4469861, 4149625, 2447129, 3845554, 3478916, 8149174, 6953642, 5330169, 1610268, 7578438, 5123733, 5335317, 3893807, 5299948, 1847630, 1098431, 5781978, 8258102, 7326373, 5662517, 7977819, 4567952, 718042, 7150706, 5331435, 8133645, 5238144, 7169390, 1415687, 131939, 3784623, 7816882, 8378356, 7703997, 6435528, 3664500, 5431220, 544829, 3250088], -[6620406, 1208938, 2483134, 4159659, 4242017, 2153241, 4688238, 85178, 4434058, 7370349, 107259, 2984188, 4557561, 7355519, 7582650, 4222455, 531967, 2338919, 3773193, 6326513, 45444, 6930578, 2776498, 2108715, 2675689, 4374398, 4089536, 1020221, 3814410, 3454860, 1430833, 4392253, 2927573, 2920781, 5873486, 6671816, 6152611, 5409260, 1927145, 1691262, 2242207, 78590, 4687686, 7248034, 6185562, 6890480, 3857614, 8167119, 1456238, 2790686, 5403540, 4141184, 4779354, 5848791, 3501984, 286755, 7404398, 7542145, 3084471, 428227, 7354232, 4295890, 6777404, 3293599, 2826983, 4232595, 7494886, 582273, 2670748, 1533550, 5618948, 6123072, 3401165, 1351274, 391116, 4952047, 2887173, 7379326, 3815131, 4265378, 5345258, 2818808, 2503356, 5931100, 4307332, 7690422, 2796910, 5105521, 2440158, 8211370, 5898216, 1983418, 5353500, 3139189, 722112, 3268746, 1233076, 6659561, 5246850, 2414724, 640747, 4260240, 3373968, 7357419, 6090269, 5366655, 3984808, 482294, 4706322, 7705587, 2011809, 3105124, 3979429, 6008877, 7522102, 703470, 1386029, 8004138, 8239622, 7798330, 6970283, 6586951, 2379280, 217546, 2246680, 3316593, 159975, 7296769, 7226031, 1377459, 4967249, 1334910, 5497582, 4214349, 98489, 4680946, 6767066, 7546405, 5627336, 7714574, 4962570, 6303796, 5366617, 496578, 1025896, 3908096, 3870619, 3787218, 4437520, 7037379, 4433508, 2651258, 4087734, 5560235, 1109368, 7777054, 3715094, 2244756, 1368685, 7247961, 753070, 6447420, 4642588, 4460071, 5932529, 1887745, 5027593, 81854, 6867933, 1576963, 7951284, 6362119, 329829, 1769716, 802392, 918154, 6248965, 2123985, 1835338, 6026940, 6668779, 6473678, 7824360, 3872735, 6654676, 4552204, 5045179, 3834912, 7278423, 4452364, 6594753, 251463, 3112166, 6532689, 2462479, 2664036, 2835749, 592268, 752290, 6949532, 1736710, 2261030, 421663, 4653007, 1261821, 2138407, 3245533, 8178667, 693264, 6101230, 1689913, 7673514, 6506189, 7008588, 7078334, 4838916, 7075484, 1836249, 7289778, 6098669, 2465569, 3724275, 6109653, 6988669, 2893268, 4288653, 7842298, 4540321, 3744338, 3863786, 6649425, 4965334, 4330105, 4533788, 4618018, 1063504, 3594989, 8077891, 242302, 2254372, 4869909, 6896494, 2501350, 5640858, 2602676, 6474793, 5662286, 4886610, 1330610, 7002374, 4695611, 1179242, 2121193, 5138098, 3401215, 2603542], -[333269, 6985229, 7829399, 2044999, 7494349, 2575821, 4228064, 3486301, 7088336, 7938171, 5932947, 3900646, 1235313, 420100, 6028493, 3184812, 1774290, 3861296, 4760124, 5856533, 1782609, 7506087, 4676519, 2018507, 758832, 4378820, 3152403, 3243819, 2247988, 2270578, 3696063, 966665, 1044500, 2387649, 4798962, 2503731, 2989366, 2575889, 8379453, 6597217, 2002454, 797454, 3292808, 2654019, 6020701, 1491569, 1714154, 6135966, 5874237, 2739563, 2247865, 6426262, 1211267, 848667, 4793729, 4382223, 5674089, 1555448, 5319165, 7580784, 3093352, 4265289, 7701453, 2080728, 2531871, 4332135, 7191074, 1654746, 6779582, 5096278, 4932905, 4202631, 8133658, 1344809, 6905317, 6344315, 5240022, 5384524, 7884117, 5630446, 3644020, 6903321, 8124046, 5346511, 3096251, 4099574, 5005381, 1671681, 567112, 1708632, 6116799, 7098378, 4577204, 6108672, 5034371, 4450274, 8089595, 69771, 250783, 7242483, 5826638, 2189811, 2259622, 6471961, 6807324, 2311094, 7601816, 4473107, 301870, 1155847, 3369821, 279831, 5202662, 7503844, 2500147, 6678856, 3914391, 1313764, 3567858, 118113, 2214764, 546045, 3828404, 7375457, 6259262, 2839116, 7511620, 4061989, 6520612, 3066830, 99, 2380562, 4573427, 41227, 6437796, 3727253, 7631734, 3364833, 4212888, 4882589, 7661673, 6649688, 6752186, 1403848, 3759092, 7181794, 453273, 1912763, 7515759, 2486028, 4701083, 4152407, 5785245, 258702, 3917604, 5102171, 445303, 7657292, 4550905, 6330029, 1844585, 7182890, 1943102, 1268355, 6182948, 3517994, 6501331, 4219213, 2314346, 3517583, 1945324, 6004228, 7623995, 2941871, 4394556, 1947980, 2207700, 3455089, 3069141, 1740526, 5446583, 5514836, 3245962, 3396104, 3133486, 8245093, 1738626, 920729, 7646709, 1769950, 8333748, 7881342, 424613, 2689209, 891151, 1872610, 797548, 6231512, 1817422, 257148, 7128854, 2386366, 7493453, 4270980, 665666, 4597083, 4162080, 877071, 1584948, 401058, 5863515, 6953058, 6521964, 5705932, 6277122, 6099733, 5870028, 8194636, 472218, 1928227, 6410077, 1465318, 3950810, 7599153, 5172774, 3105375, 2454814, 2108655, 6931233, 2704750, 2287054, 1680701, 4098766, 506508, 5501385, 3116557, 5689431, 6803397, 8007114, 8106903, 909301, 5800427, 2466851, 5560967, 5726254, 715695, 3327159, 5802348, 7591122, 7897997, 3420132, 3661269, 5962014, 5818429, 4824912, 7888478], -[8002922, 6356476, 3200704, 495403, 5361520, 5766923, 5502000, 2114204, 6581657, 3282423, 6757782, 38825, 6257035, 8056386, 7712436, 5855541, 3748426, 6506943, 8329139, 4464736, 6507534, 2755142, 5613066, 750993, 86661, 643315, 2372501, 6971248, 7225574, 2103651, 4958557, 4296738, 2358267, 3953711, 7408981, 7420558, 1405987, 4816642, 7917780, 1637588, 163113, 2746611, 7050095, 4273868, 6469559, 4756221, 7595366, 7836711, 4324483, 8032092, 5084901, 1803445, 3802007, 5106146, 8193263, 1297966, 371192, 4009023, 751843, 5168520, 960959, 2012265, 1545558, 3153065, 2155998, 6139555, 6175634, 4953204, 2037103, 4700911, 5542920, 8327103, 5556920, 5076642, 4337003, 3241027, 3250913, 6240628, 471278, 342677, 5597821, 5335341, 6363946, 2333691, 7875492, 7414343, 403850, 4101607, 4996111, 1526654, 1777407, 510032, 1084541, 6675366, 7589179, 5146888, 6618169, 6568566, 7851947, 6749223, 311456, 92078, 7456259, 6918398, 986611, 6764198, 3821153, 6775638, 5062655, 5313616, 1365167, 1058491, 2329189, 7096056, 531201, 7714036, 2964619, 366539, 4946754, 4880287, 7101834, 3658654, 4560025, 3268280, 7257937, 3519829, 197800, 7796453, 2513366, 5326129, 7361208, 7467539, 1021952, 271166, 3926680, 5693804, 4953979, 4785847, 8181723, 88166, 6396951, 3621240, 2958356, 7917715, 940434, 6199043, 1869959, 4560213, 4220883, 4993433, 3456257, 655933, 4942873, 7729710, 2889092, 99109, 4254805, 4397892, 566716, 7638269, 712702, 3021649, 7459784, 1474592, 6663551, 5497495, 1612528, 3951166, 3464720, 3082792, 8328908, 4906116, 4892144, 1064079, 292156, 4406608, 1372725, 4643784, 6815209, 2576189, 5219012, 4551660, 5759911, 4191285, 4924128, 6663549, 7369862, 2619701, 6693097, 3172635, 1825821, 2593380, 6689077, 1954577, 3525818, 3567008, 7020430, 5176667, 7753976, 7608986, 4888751, 5172767, 4266370, 2213132, 4133048, 1947774, 3093950, 2160885, 2160568, 5344784, 3190244, 1327760, 7765530, 7592291, 5390090, 5593052, 7258840, 7873222, 3441562, 4200566, 6601638, 6047736, 8140218, 3940247, 8160023, 5354035, 525909, 6019834, 6014077, 8130485, 2528636, 3101749, 5707436, 1271089, 1909479, 489462, 3962750, 4410120, 5522107, 738910, 8368031, 6637792, 4290537, 2657149, 4414023, 269274, 6354856, 326716, 8339688, 540728, 4790387, 4361147, 97487, 6036048, 945225, 5138131], -[5661106, 6573239, 2821408, 1276722, 389504, 2855086, 2901224, 6027529, 2089902, 5734306, 3917272, 4420067, 2741469, 7123306, 5328861, 7184809, 5922403, 3792987, 7131702, 6508181, 2565521, 7491204, 7133083, 547108, 1852366, 4524962, 1432494, 8290920, 4589713, 4495051, 221710, 5784450, 1736795, 1104784, 1835790, 1071539, 4068236, 523615, 7163351, 7839177, 7889739, 1951983, 6200379, 1539219, 3736368, 3682694, 4625534, 6025719, 6753962, 5822712, 5298992, 4395515, 2647628, 2291255, 336547, 571109, 8185190, 5155211, 1415484, 7409345, 1242353, 4197744, 1472701, 4417687, 2597418, 5229397, 733629, 8233169, 4858942, 1384871, 2892543, 225120, 5172733, 307803, 1338300, 6026762, 781775, 824139, 4026478, 7005871, 7689104, 6388512, 6823305, 4643865, 6944299, 2813514, 1473472, 4646648, 1987275, 6076897, 3062119, 3824871, 2109975, 395803, 7261372, 1730157, 3812823, 8349213, 1970837, 5109369, 4705527, 1617612, 295474, 1034626, 5947989, 2527807, 5567015, 738044, 5948512, 6398457, 3511141, 7698933, 8020920, 5436925, 2216585, 1675400, 6119146, 3032202, 593676, 4425066, 3989838, 2929091, 6032384, 713368, 6836074, 4577996, 1867829, 8309037, 2612140, 1009446, 2930066, 1556459, 7943715, 2546794, 7244935, 405521, 7302373, 4109582, 3144291, 5621685, 4226472, 5292180, 838588, 6774508, 5653012, 5209670, 6552046, 6066805, 1836991, 948331, 7986259, 1007182, 7359344, 3613107, 4180413, 6459660, 1341670, 6212693, 2871479, 4430008, 5649720, 2772868, 1029216, 4856589, 3699559, 7100015, 2238327, 3261094, 2419540, 5746032, 2752415, 6333743, 5167956, 4502061, 5055476, 5632396, 280655, 2089899, 3876685, 2717944, 8017917, 2162935, 7173919, 7752411, 5891939, 5432384, 3156272, 85495, 4537958, 5934925, 1102270, 7273041, 2908968, 6232318, 945818, 4273456, 347409, 298043, 4136190, 7843207, 2453465, 5912303, 720358, 4294949, 3462945, 549110, 2612011, 4542721, 1249730, 1633754, 905703, 5755286, 3826540, 5637689, 5822804, 6245349, 622956, 3114559, 4005669, 2168127, 3601606, 1668296, 6514298, 4874225, 5385419, 4731276, 3169463, 5791864, 139722, 1598059, 7784919, 2471949, 3648693, 1692137, 7220683, 4748937, 5943103, 6749762, 4239522, 748420, 7642073, 1720391, 2545623, 7905944, 2836641, 523160, 4322759, 2806726, 3140490, 5332117, 6124119, 6427564, 7998811, 3289837, 6726546, 5368865]] -w = NTTInverse(aHat * NTT(y)): [[3560581, 47893, 5288591, 8200619, 834849, 7173375, 1229664, 1212957, 5814018, 7972724, 865753, 2705887, 6967047, 1169987, 6299165, 2230927, 5747033, 968539, 7018837, 3963319, 2940446, 3297448, 471067, 6816052, 6537345, 2510066, 803714, 5477691, 4353991, 1779710, 3416902, 7795092, 352184, 5298713, 1075954, 2871019, 8292845, 7057442, 4601559, 2188293, 5575364, 7510678, 7555217, 1332707, 4508805, 8098440, 1394701, 1975635, 6945976, 1602371, 7817644, 2955713, 269908, 1914372, 4589100, 5937317, 1665225, 873525, 5321045, 4613091, 6430865, 2885704, 7140271, 7589428, 3646, 6681174, 6702006, 6113787, 1966082, 6076989, 3708196, 277882, 4253560, 2816010, 605068, 917566, 4857420, 3253206, 8215493, 6525914, 1667093, 6822873, 4342734, 2270832, 5890261, 6961974, 6619113, 6499398, 4720204, 1529218, 7927435, 203781, 3762654, 4114760, 3435889, 1711170, 6593691, 7410879, 167293, 2246084, 283037, 4536424, 6355651, 4549400, 6495131, 4078178, 2101613, 1417406, 439205, 7210791, 3215811, 6024296, 7379998, 1165848, 1601525, 3794345, 5657793, 2967781, 1982254, 5119236, 6609683, 5828617, 3427811, 6013991, 6638842, 5222433, 5300374, 3908028, 2166583, 6214637, 8324449, 647385, 4104189, 7168943, 5847217, 2795008, 2006675, 1619465, 4193706, 5402444, 6316706, 4028331, 211220, 809342, 6517500, 4166658, 19994, 4348610, 1677739, 7598879, 5980119, 4459704, 6001555, 3529244, 8089376, 5135326, 6438497, 1967075, 5287711, 5292117, 5052047, 1103132, 6140519, 5948513, 5995476, 6354, 1076114, 5085041, 478804, 4184563, 3752466, 2195167, 395822, 4019811, 5060103, 4648674, 2077720, 6682998, 6246277, 5968220, 6499937, 6008370, 1495549, 596465, 1140002, 5195674, 1596165, 7690383, 7132355, 8115414, 7240498, 8096549, 4024327, 8284365, 4749927, 1417427, 2608184, 7253097, 2985448, 221501, 5312702, 7829279, 4642597, 2920620, 1444049, 5767437, 5568386, 4488731, 5351482, 3188181, 5603141, 7893555, 474242, 359226, 1212081, 7973926, 7576472, 3913522, 1823000, 2702354, 3036837, 6110663, 1402859, 6688171, 3725517, 3381884, 2539286, 3221850, 4687665, 1135633, 4830850, 2518811, 8168301, 2930008, 344314, 7425812, 5972476, 3264369, 7274883, 6060673, 1825258, 2485475, 935043, 3201054, 7080142, 1311164, 5343774, 4198060, 7668976, 5190034, 3274382, 3364560, 937807, 4630638, 4105309, 1965713], -[6961642, 3484739, 2479972, 1449358, 8013470, 4837783, 7805497, 2836973, 1408896, 7993132, 3700401, 1086372, 2082514, 4723986, 3024999, 1584431, 5086733, 6534440, 6662558, 6686379, 3870275, 4677946, 4136813, 8270140, 879277, 3670254, 8345816, 336602, 7967744, 7726550, 3616238, 4050373, 1776309, 5580633, 4430706, 3399863, 278515, 347199, 7471497, 4590175, 2252110, 3611252, 2809445, 3175375, 6479949, 3987081, 1675252, 5670162, 1790023, 7067593, 3151621, 5531241, 2155057, 5858397, 2893870, 5917925, 6395490, 3991043, 8323549, 3426396, 3986170, 4252519, 4490997, 2592727, 7113470, 2982476, 5647700, 5145743, 8261597, 6921792, 7511841, 2447065, 873877, 3723981, 2712988, 2953526, 7638227, 7064500, 3521836, 3657185, 328989, 5486054, 1214093, 6384798, 1049971, 6339330, 7014976, 1320357, 231029, 4576685, 41902, 5588335, 7893691, 2948868, 7480709, 5660302, 2284937, 3446783, 6265836, 649368, 1278124, 173855, 3041040, 19969, 4413062, 6923047, 6589253, 3279261, 4182101, 8043041, 5823495, 3337812, 2393085, 5526652, 4779217, 1634990, 7682900, 7312253, 2261502, 3600536, 881105, 5057144, 5248203, 3430020, 4965277, 1489581, 4381682, 5689774, 4412375, 4980102, 6194320, 2563916, 1641029, 6195354, 8165958, 7866565, 2239219, 3295823, 6505220, 5601528, 3775603, 518322, 1056137, 2875427, 5891809, 6798457, 7792185, 5887914, 964893, 3253677, 4986017, 7808080, 7467912, 5625014, 6234290, 1823425, 2340269, 5836329, 2140921, 4347475, 5148510, 3487715, 590995, 4601511, 1614104, 239228, 3482779, 5563011, 510939, 1283481, 8347221, 2493439, 7070049, 6442850, 4901772, 5940119, 5395991, 2336639, 2848985, 3652179, 2065301, 2794226, 5191502, 4545973, 3651233, 531349, 2338577, 894736, 6920476, 4903608, 1405740, 6724784, 5187308, 5784424, 4172409, 4948190, 3354463, 7612631, 2506172, 5603382, 6713447, 2735253, 4879748, 7639983, 2424189, 5164997, 2726431, 2894678, 3483015, 1231417, 3943949, 7402314, 6951291, 7268549, 5582547, 4314671, 3415701, 1888974, 8172665, 6681366, 8333275, 4986530, 8063276, 3438475, 2851017, 7696109, 6696056, 7111145, 5786721, 2020099, 3988339, 6996409, 6653730, 4743711, 1944706, 6257845, 3208406, 5762026, 409630, 5814578, 4840761, 4971672, 2827966, 1128233, 5857920, 7301381, 6449539, 5458030, 897079, 4575349, 1215354, 2185679, 2751570, 153840, 1127663, 31614], -[5096358, 422070, 3170040, 6476022, 5911345, 7986735, 2113252, 7663839, 2065385, 7854462, 7812243, 3611040, 2679424, 4523455, 3713978, 4505890, 926983, 147714, 2925664, 1660502, 1015544, 654887, 204317, 2974297, 189811, 2540669, 5860645, 1293791, 2309477, 5948909, 6658992, 1289208, 3600121, 1839961, 744193, 1945126, 4048464, 3662296, 8102655, 1125312, 4664713, 6465638, 8306464, 1418408, 3866891, 2250370, 7509810, 4038944, 2889596, 2150982, 1857313, 4802959, 3318030, 4129799, 3784580, 2916867, 5238015, 479458, 5917104, 2225189, 3327893, 2318020, 6644540, 5216054, 945640, 1384138, 623374, 3547217, 2200796, 5782269, 5887322, 5793678, 576357, 1960632, 4159218, 5833760, 3695305, 3515657, 5769278, 5672041, 6366965, 5444125, 4361363, 8121299, 269831, 5878556, 2179526, 4806772, 4726746, 3887114, 6252576, 2763463, 7287204, 8239720, 5332741, 7467010, 1531080, 309107, 2825868, 4862944, 6866240, 4270958, 2185881, 1114348, 6903714, 8189693, 8061318, 2556445, 7376134, 3701575, 6684008, 6058225, 3672822, 4115488, 4752006, 145903, 6313143, 2532818, 7544706, 6287779, 6778084, 7076655, 7957409, 8017176, 2387687, 1162073, 6473806, 564878, 2147155, 7247584, 4324527, 3486663, 8349401, 42332, 6531065, 3817554, 1594275, 6232985, 4672619, 4737752, 6537235, 5965074, 3108576, 8134567, 3987056, 5016888, 4912676, 6629206, 1647598, 4206028, 1203621, 7867596, 7595540, 7533561, 7090887, 1595691, 3325617, 2435049, 5377599, 3424203, 6626239, 5097768, 5884191, 5151559, 3243445, 6762359, 4072641, 7768207, 3327939, 2841264, 5011722, 1530358, 2253580, 4293661, 2984613, 7183142, 2300536, 6773074, 7429307, 4740280, 4451160, 2600791, 4853681, 8338857, 4609106, 8228015, 695592, 1012199, 6337226, 169199, 7826370, 17044, 7329286, 6908146, 5156911, 2668033, 6825389, 4418449, 1387011, 4278996, 3577606, 2710166, 7054483, 3027135, 5144246, 354693, 5693778, 837278, 6042024, 6619496, 739186, 6228943, 7256241, 3595784, 5548110, 7320505, 4893032, 224626, 4144287, 8270774, 5585253, 2142355, 6958797, 8014502, 7734836, 905113, 7603650, 5216809, 7811624, 4062677, 289663, 6159566, 6060985, 2251615, 3930569, 5928478, 719498, 2079625, 468508, 2479217, 1673009, 6305862, 8029123, 7790039, 4855199, 1494007, 5943930, 4746973, 5289579, 5837713, 5570777, 660330, 5063442, 6816136, 7401711, 5839623], -[704273, 5776085, 2600625, 1078246, 3077689, 4016262, 6143076, 2814363, 2007902, 718889, 6315143, 5611001, 770448, 1006217, 2380057, 5993455, 1499884, 2510093, 3055077, 6383997, 7335234, 1897201, 7126676, 1060138, 3570341, 5621485, 4109110, 6774372, 5313807, 2322296, 179011, 8298742, 5857566, 6374357, 1146815, 6922826, 3110595, 2933514, 7831594, 4020690, 39560, 3620157, 7418598, 3864034, 1018115, 7206187, 4645005, 1376609, 2305551, 2753562, 4840839, 5201172, 1271620, 6623737, 5144377, 6150656, 5714850, 7852361, 3269106, 5460272, 6291934, 1883313, 7601969, 6166014, 7218828, 3016717, 2582125, 322787, 5354252, 352696, 6607577, 7704960, 4176995, 6368893, 725937, 6213310, 2060432, 3668989, 3976494, 1838006, 3970154, 6895099, 5596020, 7404413, 3642522, 4373247, 2334782, 2239907, 7344370, 931268, 3890890, 6849156, 3367981, 3199985, 8097010, 7198090, 6593243, 6086047, 1629682, 2605764, 231285, 7331630, 1856787, 4405266, 8180110, 232993, 3066755, 1110723, 1137087, 844480, 360130, 3130612, 3970194, 6295411, 7707905, 1586503, 3784741, 4916926, 7927390, 6043553, 1809522, 45024, 3981154, 684652, 5281117, 781944, 4482335, 5123982, 5675172, 3336658, 1018129, 5465053, 5502181, 1897364, 8075790, 2162090, 1317013, 7149635, 4400947, 6386109, 4466326, 2545059, 1517489, 5437827, 8267557, 5950926, 2827346, 6391776, 2817502, 323230, 4294534, 398434, 6767654, 7012504, 7811744, 5331354, 5006953, 3331026, 5195867, 1981906, 7708855, 6165657, 2974611, 7269533, 942973, 2073723, 3901212, 1691482, 37414, 3901020, 360184, 4107696, 6579878, 5701040, 5978545, 7461908, 6083150, 2627786, 641211, 2922861, 3126498, 7721401, 7632081, 2549884, 1726727, 3973143, 1909862, 6699946, 4005440, 1459097, 341886, 940931, 7155103, 7931745, 8135242, 4566384, 791477, 5707083, 4333437, 408252, 393997, 4752773, 7564053, 5308611, 6278397, 3456360, 1356824, 5091302, 1386904, 5952371, 6803713, 3292952, 5381139, 2616410, 1087287, 6702625, 5863702, 2295817, 969269, 2144980, 7800354, 3842637, 1098122, 2064427, 2846131, 2107047, 4760328, 4690298, 112343, 7952602, 1140400, 2440225, 5234035, 3413665, 7863268, 6616032, 3611122, 2385948, 7209573, 5463402, 4759871, 1880773, 236638, 4450394, 1593713, 3048047, 73828, 8184230, 6533947, 2234954, 1953596, 8062595, 1907606, 2189734, 395202, 4604308], -[3613665, 3422873, 1730137, 4425630, 1807693, 2072178, 5552526, 8069541, 1839440, 3881383, 3529565, 5943798, 4459292, 8360561, 4002504, 4938829, 6556823, 5231116, 1092411, 564561, 4387299, 7491967, 5300401, 5641994, 359422, 5732668, 1230552, 3361077, 1326898, 2974415, 6289856, 6206119, 6592133, 5498431, 7174769, 3616225, 788790, 5956531, 2192787, 439069, 6065035, 2716272, 7214867, 6273613, 7384407, 7434380, 7686243, 104554, 4765126, 5968179, 6057059, 6588805, 8117286, 6049247, 1771492, 4191016, 3611300, 3011553, 4420930, 4447018, 7124454, 6867246, 1749149, 2203846, 6703127, 1447917, 6436318, 1692011, 2291578, 2876848, 4130676, 4015780, 2326462, 1124561, 1900747, 920906, 3555623, 8309887, 5502508, 6813400, 5708917, 1316140, 1940846, 7912974, 5596430, 1671495, 6143436, 6713727, 6140098, 5898400, 532019, 3866667, 4946911, 6200001, 8352985, 1328075, 4774734, 2549466, 1075390, 6190731, 6158586, 4144719, 2738197, 6898525, 8188803, 6242611, 435252, 305708, 6722922, 5636074, 4610338, 6973490, 1478679, 2173633, 3567260, 4089162, 7936307, 3235472, 6685602, 3465068, 1069452, 3231388, 1473631, 279144, 2943212, 5576138, 5991558, 5827368, 8087992, 1265812, 1747692, 2087966, 8371997, 4766254, 3796463, 891130, 5865960, 1277452, 5879363, 8254700, 3980450, 6244336, 4083854, 4141485, 2488231, 4466629, 3263556, 2398503, 2796671, 862841, 165730, 3280413, 3685203, 3528368, 3894637, 229385, 4527799, 6132368, 67987, 5674424, 1528089, 3498247, 6661515, 4112767, 3384026, 5433189, 1062052, 7786653, 198027, 6546258, 415637, 6671155, 6288900, 6365882, 2436805, 1774041, 137863, 5362215, 1864283, 6028153, 8147904, 7896054, 1511383, 1405614, 1449602, 2930764, 2821658, 5379695, 4210407, 6220193, 3821030, 8040041, 3497992, 3570805, 8193286, 3181360, 5030155, 702118, 5610832, 4656790, 6269843, 3886761, 5643012, 6398921, 8012343, 1197002, 5905263, 559546, 5107350, 6662446, 1242427, 3849841, 1287793, 6947627, 6488924, 1535700, 1192573, 4695166, 2222302, 8029771, 8270055, 7640146, 2728890, 7303873, 722843, 5352439, 6497969, 7859722, 1472723, 694897, 3414080, 5286740, 6587156, 4921312, 8191030, 3323565, 355314, 6739809, 2462264, 1993441, 3945428, 4570654, 6680459, 8281205, 6795615, 6440093, 7756294, 7669209, 4775686, 7193631, 3709886, 3348792, 1587237, 6015981, 7366448, 6551765], -[3091295, 302460, 2319179, 3122367, 195581, 1653957, 2849648, 5808127, 3114670, 3607370, 3964281, 7728063, 3014534, 2250510, 4249954, 803192, 1090359, 5150345, 6966784, 2402593, 6287862, 1057218, 4314541, 4762512, 7170223, 3871709, 4099455, 1177180, 6473978, 4123591, 5947177, 8123569, 3262501, 966252, 4921457, 4179500, 121687, 5417066, 1344204, 2075093, 986674, 139857, 4024509, 667631, 7134233, 2658370, 6661809, 2911611, 346059, 7490518, 1357325, 188991, 5173577, 124296, 62955, 3575803, 1147827, 2808550, 3879413, 1316239, 1551728, 1612884, 1503550, 1581638, 4325252, 8267491, 2079654, 3775032, 4394182, 1705982, 663087, 6890226, 4288042, 7654884, 872629, 925007, 6379675, 261703, 1115376, 2328826, 576687, 2639328, 2090639, 3279025, 22171, 5945590, 2241826, 364298, 463703, 5489614, 627217, 652356, 1481830, 673709, 5795042, 6521338, 6707501, 7491103, 817257, 503570, 8044756, 7191420, 8102199, 3301042, 1175039, 3579581, 48366, 1665725, 1762058, 6266878, 7649525, 1732491, 7743552, 7280460, 8130751, 4654330, 6520048, 6919414, 2690958, 6181350, 1646868, 1384884, 1248670, 1050673, 7372059, 6209385, 4725695, 5354441, 6726069, 482663, 5094710, 7778712, 5245259, 600121, 7724059, 1081459, 4936424, 707986, 4658852, 8339672, 5060099, 5170933, 8315859, 8209185, 6963764, 3972477, 3142098, 6040064, 2134207, 352545, 1328796, 3131583, 5793515, 3859730, 2001804, 1120625, 516475, 3887911, 5708153, 4343385, 5923057, 2384733, 254505, 5936727, 6977748, 3095137, 4951127, 5678529, 5807105, 7959348, 2513922, 1603202, 1784340, 7169513, 818905, 2165469, 1171097, 1844403, 1474606, 3463776, 314806, 6200799, 5984361, 5175056, 2905720, 4769158, 8343819, 2676529, 4191877, 1468760, 5698425, 620062, 3423297, 1898007, 7420177, 3514014, 8038510, 5191428, 2158712, 4136628, 2327661, 1582861, 6981377, 829241, 3585017, 3070000, 3888781, 2598875, 7741465, 3741547, 1694808, 4155121, 6529649, 7651713, 4533788, 6355492, 1565749, 7811549, 5149638, 3506758, 1040557, 7489820, 3864747, 2044442, 3027174, 7559442, 1091508, 4726288, 5328101, 1693165, 8195524, 1792806, 5585489, 5905929, 3794503, 7180440, 5667120, 6919859, 791559, 5772061, 7755425, 4168604, 7309471, 12123, 8328017, 1651763, 5164827, 997835, 6895367, 249889, 4656083, 5246296, 1173750, 3712555, 6889404, 5969362]] - -w1: [[7, 0, 10, 0, 2, 14, 2, 2, 11, 15, 2, 5, 13, 2, 12, 4, 11, 2, 13, 8, 6, 6, 1, 13, 12, 5, 2, 10, 8, 3, 7, 15, 1, 10, 2, 5, 0, 13, 9, 4, 11, 14, 14, 3, 9, 15, 3, 4, 13, 3, 15, 6, 1, 4, 9, 11, 3, 2, 10, 9, 12, 6, 14, 14, 0, 13, 13, 12, 4, 12, 7, 1, 8, 5, 1, 2, 9, 6, 0, 12, 3, 13, 8, 4, 11, 13, 13, 12, 9, 3, 15, 0, 7, 8, 7, 3, 13, 14, 0, 4, 1, 9, 12, 9, 12, 8, 4, 3, 1, 14, 6, 12, 14, 2, 3, 7, 11, 6, 4, 10, 13, 11, 7, 11, 13, 10, 10, 7, 4, 12, 0, 1, 8, 14, 11, 5, 4, 3, 8, 10, 12, 8, 0, 2, 12, 8, 0, 8, 3, 15, 11, 9, 11, 7, 15, 10, 12, 4, 10, 10, 10, 2, 12, 11, 11, 0, 2, 10, 1, 8, 7, 4, 1, 8, 10, 9, 4, 13, 12, 11, 12, 11, 3, 1, 2, 10, 3, 15, 14, 15, 14, 15, 8, 0, 9, 3, 5, 14, 6, 0, 10, 15, 9, 6, 3, 11, 11, 9, 10, 6, 11, 15, 1, 1, 2, 15, 14, 7, 3, 5, 6, 12, 3, 13, 7, 6, 5, 6, 9, 2, 9, 5, 0, 6, 1, 14, 11, 6, 14, 12, 3, 5, 2, 6, 14, 3, 10, 8, 15, 10, 6, 6, 2, 9, 8, 4], -[13, 7, 5, 3, 15, 9, 15, 5, 3, 15, 7, 2, 4, 9, 6, 3, 10, 12, 13, 13, 7, 9, 8, 0, 2, 7, 0, 1, 15, 15, 7, 8, 3, 11, 8, 6, 1, 1, 14, 9, 4, 7, 5, 6, 12, 8, 3, 11, 3, 13, 6, 11, 4, 11, 6, 11, 12, 8, 0, 7, 8, 8, 9, 5, 14, 6, 11, 10, 0, 13, 14, 5, 2, 7, 5, 6, 15, 13, 7, 7, 1, 10, 2, 12, 2, 12, 13, 3, 0, 9, 0, 11, 15, 6, 14, 11, 4, 7, 12, 1, 2, 0, 6, 0, 8, 13, 13, 6, 8, 15, 11, 6, 5, 11, 9, 3, 15, 14, 4, 7, 2, 10, 10, 7, 9, 3, 8, 11, 8, 10, 12, 5, 3, 12, 0, 15, 4, 6, 12, 11, 7, 1, 2, 5, 11, 13, 15, 11, 2, 6, 10, 15, 14, 11, 12, 3, 4, 11, 4, 8, 10, 7, 1, 9, 3, 0, 7, 11, 1, 2, 0, 5, 13, 12, 9, 11, 10, 4, 5, 7, 4, 5, 10, 9, 7, 1, 4, 2, 13, 9, 3, 13, 10, 11, 8, 9, 6, 15, 5, 11, 13, 5, 9, 15, 5, 10, 5, 6, 7, 2, 8, 14, 13, 14, 11, 8, 7, 4, 0, 13, 0, 10, 15, 7, 5, 15, 13, 14, 11, 4, 8, 13, 13, 9, 4, 12, 6, 11, 1, 11, 9, 9, 5, 2, 11, 14, 12, 10, 2, 9, 2, 4, 5, 0, 2, 0], -[10, 1, 6, 12, 11, 15, 4, 15, 4, 15, 15, 7, 5, 9, 7, 9, 2, 0, 6, 3, 2, 1, 0, 6, 0, 5, 11, 2, 4, 11, 13, 2, 7, 4, 1, 4, 8, 7, 15, 2, 9, 12, 0, 3, 7, 4, 14, 8, 6, 4, 4, 9, 6, 8, 7, 6, 10, 1, 11, 4, 6, 4, 13, 10, 2, 3, 1, 7, 4, 11, 11, 11, 1, 4, 8, 11, 7, 7, 11, 11, 12, 10, 8, 0, 1, 11, 4, 9, 9, 7, 12, 5, 14, 0, 10, 14, 3, 1, 5, 9, 13, 8, 4, 2, 13, 0, 15, 5, 14, 7, 13, 12, 7, 8, 9, 0, 12, 5, 14, 12, 13, 14, 15, 15, 5, 2, 12, 1, 4, 14, 8, 7, 0, 0, 12, 7, 3, 12, 9, 9, 12, 11, 6, 0, 8, 10, 9, 13, 3, 8, 2, 15, 15, 14, 14, 3, 6, 5, 10, 7, 13, 10, 11, 10, 6, 13, 8, 15, 6, 5, 10, 3, 4, 8, 6, 14, 4, 13, 14, 9, 8, 5, 9, 0, 9, 0, 1, 2, 12, 0, 15, 0, 14, 13, 10, 5, 13, 8, 3, 8, 7, 5, 13, 6, 10, 1, 11, 2, 12, 13, 1, 12, 14, 7, 11, 14, 9, 0, 8, 0, 11, 4, 13, 15, 15, 2, 15, 10, 15, 8, 1, 12, 12, 4, 8, 11, 1, 4, 1, 5, 3, 12, 15, 15, 9, 3, 11, 9, 10, 11, 11, 1, 10, 13, 14, 11], -[1, 11, 5, 2, 6, 8, 12, 5, 4, 1, 12, 11, 1, 2, 5, 11, 3, 5, 6, 12, 14, 4, 14, 2, 7, 11, 8, 13, 10, 4, 0, 0, 11, 12, 2, 13, 6, 6, 15, 8, 0, 7, 14, 7, 2, 14, 9, 3, 4, 5, 9, 10, 2, 13, 10, 12, 11, 15, 6, 10, 12, 4, 15, 12, 14, 6, 5, 1, 10, 1, 13, 15, 8, 12, 1, 12, 4, 7, 8, 4, 8, 13, 11, 14, 7, 8, 4, 4, 14, 2, 7, 13, 6, 6, 15, 14, 13, 12, 3, 5, 0, 14, 4, 8, 0, 0, 6, 2, 2, 2, 1, 6, 8, 12, 15, 3, 7, 9, 15, 12, 3, 0, 8, 1, 10, 1, 9, 10, 11, 6, 2, 10, 11, 4, 15, 4, 3, 14, 8, 12, 9, 5, 3, 10, 0, 11, 5, 12, 5, 1, 8, 1, 13, 13, 15, 10, 10, 6, 10, 4, 15, 12, 6, 14, 2, 4, 7, 3, 0, 7, 1, 8, 13, 11, 11, 14, 12, 5, 1, 6, 6, 15, 15, 5, 3, 8, 4, 13, 8, 3, 1, 2, 14, 15, 0, 9, 2, 11, 8, 1, 1, 9, 14, 10, 12, 7, 3, 10, 3, 11, 13, 6, 10, 5, 2, 13, 11, 4, 2, 4, 15, 7, 2, 4, 5, 4, 9, 9, 0, 15, 2, 5, 10, 7, 15, 13, 7, 5, 14, 10, 9, 4, 0, 8, 3, 6, 0, 0, 12, 4, 4, 15, 4, 4, 1, 9], -[7, 7, 3, 8, 3, 4, 11, 15, 4, 7, 7, 11, 9, 0, 8, 9, 13, 10, 2, 1, 8, 14, 10, 11, 1, 11, 2, 6, 3, 6, 12, 12, 13, 10, 14, 7, 2, 11, 4, 1, 12, 5, 14, 12, 14, 14, 15, 0, 9, 11, 12, 13, 15, 12, 3, 8, 7, 6, 8, 8, 14, 13, 3, 4, 13, 3, 12, 3, 4, 5, 8, 8, 4, 2, 4, 2, 7, 0, 11, 13, 11, 3, 4, 15, 11, 3, 12, 13, 12, 11, 1, 7, 9, 12, 0, 3, 9, 5, 2, 12, 12, 8, 5, 13, 0, 12, 1, 1, 13, 11, 9, 13, 3, 4, 7, 8, 15, 6, 13, 7, 2, 6, 3, 1, 6, 11, 11, 11, 15, 2, 3, 4, 0, 9, 7, 2, 11, 2, 11, 0, 8, 12, 8, 8, 5, 9, 6, 5, 5, 2, 0, 6, 7, 7, 7, 0, 9, 12, 0, 11, 3, 7, 13, 8, 6, 10, 2, 15, 0, 12, 1, 13, 12, 12, 5, 3, 0, 10, 4, 12, 0, 15, 3, 3, 3, 6, 5, 10, 8, 12, 7, 15, 7, 7, 0, 6, 10, 1, 11, 9, 12, 7, 11, 12, 15, 2, 11, 1, 10, 13, 2, 7, 2, 13, 12, 3, 2, 9, 4, 15, 0, 15, 5, 14, 1, 10, 12, 15, 3, 1, 7, 10, 13, 9, 0, 6, 1, 13, 5, 4, 8, 9, 13, 0, 13, 12, 15, 15, 9, 14, 7, 6, 3, 11, 14, 13], -[6, 1, 4, 6, 0, 3, 5, 11, 6, 7, 8, 15, 6, 4, 8, 2, 2, 10, 13, 5, 12, 2, 8, 9, 14, 7, 8, 2, 12, 8, 11, 0, 6, 2, 9, 8, 0, 10, 3, 4, 2, 0, 8, 1, 14, 5, 13, 6, 1, 14, 3, 0, 10, 0, 0, 7, 2, 5, 7, 3, 3, 3, 3, 3, 8, 0, 4, 7, 8, 3, 1, 13, 8, 15, 2, 2, 12, 0, 2, 4, 1, 5, 4, 6, 0, 11, 4, 1, 1, 10, 1, 1, 3, 1, 11, 12, 13, 14, 2, 1, 15, 14, 15, 6, 2, 7, 0, 3, 3, 12, 15, 3, 15, 14, 0, 9, 12, 13, 5, 12, 3, 3, 2, 2, 14, 12, 9, 10, 13, 1, 10, 15, 10, 1, 15, 2, 9, 1, 9, 0, 10, 10, 0, 0, 13, 8, 6, 12, 4, 1, 3, 6, 11, 7, 4, 2, 1, 7, 11, 8, 11, 5, 0, 11, 13, 6, 9, 11, 11, 15, 5, 3, 3, 14, 2, 4, 2, 4, 3, 7, 1, 12, 11, 10, 6, 9, 0, 5, 8, 3, 11, 1, 7, 4, 14, 7, 15, 10, 4, 8, 4, 3, 13, 2, 7, 6, 7, 5, 15, 7, 3, 8, 12, 15, 9, 12, 3, 15, 10, 7, 2, 14, 7, 4, 6, 14, 2, 9, 10, 3, 0, 3, 11, 11, 7, 14, 11, 13, 2, 11, 15, 8, 14, 0, 0, 3, 10, 2, 13, 0, 9, 10, 2, 7, 13, 11]] -w1Encode: 070AE222FB522D4C2B8D66D15CA238F7A152D049EB3EF9433D6F41B9239A6CEED0CDC417582169C0D348DBCD390F8737ED40919C8C34E1C62E736BA4BDB7AD7AC410E85B34A88C208C80F39B7BAF4CAA2ABC0BA28147819AD4BCBC13A2F3FEFE0839E506FA69B39B6AFB11F27E53C6D36765295960E16BCE53623E8AAF6692487D359F5FF3279436CADD97087210FF87B368119E74658CB3D3B6B4B68C7088596EABD05E7265DF77A1C2C23D90B06FBE741C0206D86DF86BB539EF74A27A39B8A85CC3F064BC1752DBBF62FABE3CB4847A9103B72150CDB94A75549A17249DD3BA98F6B55DF9A56527E8ED8B47D0A07FF5ED4BD89DC4B6B19925EBAC924205021AC6FBF4F47F959702361260502BB42D4741782FC930478E469486671A4B46AD3271B4BB41B877BBAC08B194795C0EEA13958D240D5F7ECD87095CCEEDFF251CE478007CC399BC06A8D983F2EF3E567AADABD6F8563A84E6D49E580909210C0FDE5A8D83576D1A2BDCC17EEB09084BFD2FAF8FC14CB84151C3FF399BBA1BDABEB125865C14BC21B553C64E2EB7D84A00CBD2668F707EE23954A9D2CAFBA64CCF6E151AFDC8C17448D8EB87442ED766EFCD53E08400262261C83F97CF03181AA96BA24B4FE3C859A3B0C51518DDAF6A4ACFE642377081BDEB5C61F65F83D43821FE90B21891AE7CA3B36D5AD24B427F424599F0527ADF57AE498063004CF44491778343FB74B70998AD12E8BAB16263CCAD7EB2145CCEEE0FB9DCCF836788DE433D3C5488242407DB3BF43BDCBC71C93059C28CD5C011BDD943876F7D6213B6BB2F4390272B0BC888955625607707C9B0738DA6F2C0D1CC35A0C4F03363A5C8F777601A9B7CCB2F1BDA72D23C92F4F0E5A1FC13A79D60D145980DCDFFE967B3DE166430B576F84628A25D2C987E288C0B2689A04302185E6DE1030A7052373333087438D1F8220C425164B014A11113CBED12EF6F7230C33FEF90DCC53322CEA91DFA1A2F1909AA008DC614637B24718B5BB06DB9FB35E3424273C1AB9650381B477EAF84342D67577F83FCC9F37AE247E6923A30BBE7DBB28F0E302A0DA972BD - -cTilde: 765AB68AC204B255699618463D65D693A1845D574181D1403972888A76B3A553F79FEFD05FF22F37A99C525FCE21F283 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, 0, 1, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 1] -cHat: [7697636, 1304167, 3143043, 85116, 8042507, 4596675, 4883028, 3726575, 8346936, 3126137, 5967592, 3809195, 8123177, 5908107, 706054, 5801063, 2838270, 8239964, 4241496, 60602, 50092, 69397, 1948883, 1880956, 2845997, 8026707, 6877645, 8268845, 8275650, 6073602, 1340711, 7321070, 1760166, 2415040, 6907118, 4882128, 4911996, 1503219, 5765478, 1264484, 4741842, 2748186, 3716580, 984221, 4296663, 1349212, 7532645, 1195901, 2982898, 7128083, 6630759, 683299, 7245579, 794503, 6121664, 5644943, 418808, 3438417, 6712607, 7386647, 8083030, 5245429, 1864829, 4275295, 851434, 3629055, 6123265, 5826055, 138135, 4513773, 2021722, 4337747, 3674854, 4886678, 8312413, 5637757, 3145972, 2947478, 3479015, 1301260, 2861478, 117338, 4515896, 6037872, 1869025, 3820331, 873222, 1712911, 5809085, 1177662, 4860561, 6967091, 2583834, 4712152, 1802060, 3641516, 1682099, 6783366, 4392824, 3527811, 3887959, 8302943, 315084, 7170207, 4018559, 5033985, 212217, 5899680, 3089349, 7519477, 2985200, 3367707, 999188, 4834843, 3467509, 6670077, 6275668, 1400365, 3248508, 2861002, 2775686, 5405093, 7522027, 5767165, 4069683, 5528306, 628368, 1496816, 6461093, 2024183, 4059993, 892265, 8046234, 4593705, 4811641, 5312964, 3398982, 6055791, 7739228, 2597791, 5142163, 5638808, 3798159, 4137253, 2778395, 6380083, 3448622, 8298681, 101913, 7383430, 962108, 83596, 2604891, 70272, 5934110, 3519532, 1441675, 8361631, 2764042, 8320364, 6850205, 5741156, 2022274, 48444, 2215734, 3752657, 1502099, 2857379, 8125333, 2082959, 1427368, 185150, 4288283, 1078563, 7882134, 2755862, 555240, 5250242, 6047762, 2363257, 229707, 2536807, 4657452, 45750, 6715136, 7849401, 3335201, 6872402, 5262666, 7814443, 5715872, 2529210, 1833890, 8149650, 2602783, 3507212, 1495787, 175709, 1037870, 8055259, 3812733, 2826283, 7916225, 2095505, 7761282, 6552140, 5280086, 3652854, 1477474, 1737168, 1896077, 2102498, 6823468, 3934389, 1849891, 564637, 488022, 3976904, 8155982, 5076302, 6095157, 1362531, 2330093, 6026084, 6409827, 2879815, 1626977, 7393474, 7738584, 7828981, 5589091, 3432961, 2764021, 2144367, 1752218, 6173004, 4071607, 7921448, 3180477, 7187411, 3163155, 18859, 4489661, 4080780, 5664455, 1417835, 3490159, 1398652, 3588983, 1169145, 7827560, 4425621, 5129479, 584985, 382330, 7867952] -cs1: [[1, 33, 8380400, 8380409, 8380401, 2, 41, 8380409, 8380415, 8380408, 9, 8380396, 14, 8380411, 37, 30, 8380399, 7, 29, 5, 8380412, 8380397, 4, 8380398, 11, 0, 18, 7, 8380401, 48, 6, 8380394, 15, 15, 8380407, 5, 5, 13, 7, 8380408, 20, 22, 8380414, 8380390, 8380411, 11, 5, 5, 4, 24, 35, 21, 8380408, 8380395, 8380402, 16, 8380409, 14, 8380387, 6, 9, 8380391, 4, 8380409, 2, 35, 8380397, 8380394, 11, 17, 7, 0, 19, 9, 0, 8380414, 8380394, 8380415, 8380408, 16, 8380402, 7, 8380401, 8380403, 8380385, 8380408, 8380406, 10, 8380393, 8380416, 17, 6, 39, 13, 8380374, 8380413, 14, 5, 8380389, 8380401, 8380402, 4, 8380399, 8380404, 8380404, 5, 7, 11, 5, 22, 8380393, 8380400, 8380387, 12, 22, 6, 6, 8380406, 8380408, 8380415, 19, 8380397, 8380387, 8380410, 8380403, 3, 8380409, 8380414, 8380407, 8380382, 11, 30, 8380413, 2, 0, 8380401, 8380407, 19, 8380405, 8380402, 33, 8380406, 8380415, 19, 34, 8380406, 8380409, 8380405, 16, 8380400, 8380388, 8380398, 29, 21, 8380416, 8380403, 10, 8380403, 12, 8380406, 0, 11, 8380413, 8380386, 8380396, 6, 35, 8380410, 42, 8, 18, 17, 8380413, 8380399, 5, 8380408, 8380400, 8380409, 21, 8380399, 8380407, 3, 0, 39, 24, 8380399, 8380414, 14, 12, 8380387, 8380408, 9, 8380416, 4, 8380406, 1, 36, 8380398, 8380393, 0, 3, 20, 8380390, 8380415, 11, 37, 21, 8380366, 16, 38, 27, 8380400, 8380400, 9, 8380399, 12, 8380391, 8380406, 31, 31, 8, 8380385, 8380410, 4, 8380407, 8380412, 8380413, 18, 16, 8380407, 17, 12, 8, 2, 7, 8380405, 10, 21, 8380397, 6, 8380387, 8380412, 18, 13, 8380398, 10, 8, 8380413, 8380409, 1, 8380399, 23, 0, 4, 8380393, 32], -[9, 8380392, 8380375, 29, 8380405, 8380374, 2, 8380398, 47, 4, 8380386, 0, 8380405, 12, 16, 8380409, 21, 8380411, 8380402, 35, 7, 8, 8380414, 1, 8380376, 4, 10, 3, 8380369, 8380404, 26, 8380407, 4, 9, 8380406, 30, 1, 8380411, 8380401, 4, 7, 25, 4, 21, 8380412, 8380413, 8380401, 8380393, 8380379, 3, 5, 8380411, 0, 8380377, 23, 12, 8380401, 8380403, 8380412, 8380398, 1, 14, 10, 8380416, 8380407, 8380407, 26, 25, 8380414, 8380415, 0, 20, 9, 9, 5, 8380399, 8380410, 8380395, 0, 29, 8380378, 8380392, 10, 24, 17, 8380405, 1, 18, 8380415, 8380394, 8380414, 8380415, 8380413, 5, 12, 12, 1, 21, 8380404, 0, 8380412, 8380398, 8380411, 10, 8380408, 0, 7, 10, 5, 16, 12, 8380406, 8, 8380415, 8380416, 11, 8380415, 12, 24, 8380401, 7, 8380410, 16, 8380385, 8380415, 12, 8380408, 8380416, 8380404, 1, 19, 15, 23, 8380397, 41, 5, 8380397, 8380416, 8380412, 8380407, 5, 22, 16, 8380414, 25, 8380390, 5, 0, 10, 3, 8380394, 8380401, 31, 14, 12, 8380409, 8380398, 12, 14, 27, 8380393, 10, 53, 4, 8380374, 7, 8380405, 0, 24, 23, 8380401, 8380404, 8380394, 17, 6, 8380397, 8380411, 8380404, 6, 4, 8380393, 29, 8380412, 8380386, 8380407, 27, 8380405, 8380414, 23, 8380415, 34, 6, 8380416, 8380409, 15, 13, 8380406, 8380414, 12, 8380393, 6, 8380403, 9, 12, 0, 12, 11, 8380409, 8380409, 21, 8380414, 9, 4, 8380407, 30, 12, 3, 8380395, 8380382, 16, 0, 9, 9, 8380408, 13, 20, 8380397, 10, 8380415, 8380382, 20, 12, 8380398, 35, 8380390, 8380405, 8380397, 17, 8, 8380409, 8380391, 16, 7, 25, 8380411, 8380405, 8380398, 8380413, 9, 37, 1, 8380405, 8380416, 8380415, 0, 3], -[8380400, 8380396, 8380409, 8380389, 11, 8380396, 8380413, 8380402, 5, 37, 3, 5, 31, 18, 3, 5, 1, 12, 1, 8380414, 8380398, 8380409, 25, 8380391, 3, 8380391, 21, 8380391, 8380410, 8380396, 8380406, 15, 7, 21, 8380388, 9, 19, 5, 17, 8380414, 8380412, 10, 8380412, 36, 6, 6, 8380394, 8380386, 8380415, 8380383, 7, 8380404, 26, 8380396, 8380414, 9, 8380408, 8380405, 9, 8380371, 17, 75, 8380413, 10, 8380402, 8380415, 31, 3, 8380405, 8380406, 5, 0, 2, 8380388, 1, 8380406, 8380414, 8, 29, 0, 8380401, 8380405, 12, 4, 8380395, 8, 14, 1, 13, 7, 8380406, 1, 8380395, 5, 1, 8380391, 4, 8380404, 8380415, 25, 8380411, 8380395, 23, 27, 15, 8380387, 8380390, 45, 15, 8380405, 8380376, 6, 8380397, 8380416, 8380396, 8380413, 8380400, 11, 12, 8380408, 2, 8, 8380399, 8380414, 17, 16, 12, 4, 4, 22, 9, 9, 8380412, 8380410, 8380416, 12, 8380384, 29, 15, 13, 15, 8380402, 8380397, 0, 8380413, 6, 8380408, 8380397, 5, 8380385, 29, 35, 8380389, 8380382, 8380405, 8380408, 5, 15, 8380402, 39, 8380414, 8380395, 26, 8380414, 5, 9, 8380382, 30, 31, 9, 2, 8380395, 31, 8380392, 8380413, 8380405, 6, 8380408, 8380416, 12, 8380386, 27, 8380387, 8380396, 15, 15, 12, 3, 8, 10, 3, 8380398, 10, 8380414, 18, 8380414, 26, 52, 22, 8380379, 8380408, 1, 0, 8380400, 8380408, 6, 8380409, 8380415, 8380388, 8380408, 2, 7, 8380411, 8380403, 44, 0, 24, 8380412, 8380409, 12, 24, 8380411, 11, 8380399, 8380375, 8380403, 14, 0, 8380408, 8380400, 13, 14, 15, 25, 17, 21, 8380405, 17, 40, 0, 26, 8380407, 8380413, 8380399, 21, 8380409, 8380407, 8380400, 8380412, 13, 8380411, 8380410, 8380387, 7, 8380395, 8380410], -[7, 8380413, 6, 13, 7, 8380408, 9, 4, 1, 8380412, 1, 10, 10, 8380395, 44, 8380363, 8380415, 37, 24, 11, 8380415, 19, 8380415, 8380399, 8380408, 23, 16, 8380386, 10, 8380412, 6, 8380396, 0, 8380415, 8380412, 12, 8380412, 8380402, 18, 8380410, 8380397, 8380392, 20, 8380406, 8380407, 0, 8380403, 23, 8380415, 10, 4, 1, 8380403, 3, 3, 8380413, 8380408, 4, 8380402, 23, 6, 2, 8380407, 8380415, 8380416, 9, 8380406, 8380384, 0, 8380415, 7, 20, 18, 18, 8380390, 8380405, 8380395, 3, 8380406, 8380395, 8380399, 19, 8, 8380413, 23, 16, 2, 7, 8380411, 8380403, 8380402, 0, 2, 32, 8380415, 20, 8380414, 3, 8380409, 8380410, 8380404, 15, 8380374, 8380375, 8380407, 3, 6, 17, 10, 18, 19, 26, 8380414, 4, 8380403, 15, 5, 8380416, 8380393, 8380413, 8380411, 8380416, 15, 15, 8380416, 8380413, 8380414, 8380413, 8380406, 24, 12, 8380404, 4, 8380404, 11, 6, 8380406, 7, 8380395, 8380405, 10, 8380413, 8380402, 8380395, 8380408, 17, 8380407, 28, 7, 8380399, 2, 14, 31, 8380400, 8380405, 8380385, 1, 10, 32, 8380414, 8380407, 14, 9, 8380382, 8380406, 8380399, 1, 4, 4, 8380381, 37, 8380398, 13, 3, 0, 3, 8380414, 0, 8380413, 8380383, 8380387, 0, 8380413, 8380412, 5, 8380400, 9, 25, 10, 6, 8380394, 8380409, 2, 8380408, 18, 8380416, 8380416, 1, 8380414, 21, 14, 8380385, 8380380, 1, 11, 7, 8380405, 8380393, 33, 12, 8380393, 8380409, 15, 8380415, 8380416, 0, 8380409, 8380413, 31, 15, 8380412, 8380395, 22, 5, 7, 8380406, 8380413, 12, 5, 8380411, 16, 8380393, 8380402, 25, 6, 8380405, 14, 13, 8380374, 1, 1, 9, 8380385, 3, 4, 8380395, 8380415, 13, 0, 8380413, 7, 19, 8380393, 8380406, 25, 8380412], -[1, 8380412, 8380404, 12, 0, 8380408, 8380413, 17, 8380390, 8380415, 19, 0, 15, 1, 8380415, 8380398, 1, 2, 8380415, 28, 8380406, 7, 16, 3, 4, 8380397, 8, 8380407, 8380407, 8380415, 8380407, 8380398, 8380412, 8380414, 1, 8380413, 15, 26, 8380416, 1, 8380412, 17, 4, 8380411, 1, 14, 8, 8380411, 8380388, 18, 8380411, 8380408, 8380411, 8380396, 5, 18, 8380402, 14, 4, 8380411, 8380412, 8380402, 8380387, 17, 8380415, 8380410, 8380385, 23, 8380410, 17, 6, 8380410, 8380401, 10, 43, 4, 8380397, 15, 2, 23, 5, 8380372, 8380414, 8380407, 8380401, 10, 8380398, 5, 8380413, 8380395, 8380410, 0, 33, 6, 14, 10, 21, 4, 8380391, 8380406, 11, 8380411, 38, 8380390, 35, 8380403, 8380386, 8380387, 6, 4, 8380403, 8380406, 8380406, 14, 23, 8380386, 35, 12, 10, 8380399, 4, 22, 9, 8380400, 8380390, 1, 3, 8380390, 8380391, 8380408, 13, 19, 8380401, 5, 8380401, 16, 4, 8380405, 32, 13, 8380404, 4, 8380401, 0, 23, 31, 8380404, 8380416, 8380388, 19, 8380411, 8380396, 8380409, 15, 8380401, 27, 5, 8380390, 4, 8380388, 8380390, 8380416, 8380412, 8380402, 15, 3, 8380412, 13, 9, 8380414, 0, 8380393, 39, 31, 8380403, 8380408, 9, 1, 8380414, 8380393, 8380404, 17, 25, 2, 8380393, 8380411, 8, 2, 8380410, 8380404, 17, 15, 0, 8380382, 8380416, 8380414, 8380385, 8380399, 8380409, 16, 5, 11, 8380365, 6, 8380409, 3, 8380416, 8380408, 27, 30, 8380412, 45, 8380407, 6, 8380404, 24, 8380384, 8380404, 8380416, 8380404, 38, 8380402, 8380368, 24, 8380389, 39, 8380392, 8380408, 8380414, 11, 8380409, 8380405, 8380394, 8380409, 17, 11, 8380409, 8380416, 8380401, 8380416, 20, 8380407, 4, 8380416, 23, 8380410, 8380398, 14, 37, 8380395, 13, 8380410, 8380408, 8380414, 8380383, 8380362]] -cs2: [[8, 30, 8380413, 8380401, 11, 2, 18, 8380403, 8380410, 27, 14, 12, 4, 7, 8380415, 17, 2, 8380395, 16, 1, 8380413, 23, 1, 25, 8380413, 9, 8380389, 8380404, 8380407, 50, 2, 8380402, 0, 10, 8, 8380416, 8380410, 18, 8380407, 31, 12, 11, 8380408, 8380408, 8380401, 8380408, 14, 17, 17, 25, 8380391, 1, 8380412, 8380397, 23, 8380414, 8380398, 8380415, 16, 8380408, 4, 8380402, 8380388, 0, 28, 2, 8380397, 8380397, 19, 18, 4, 8380414, 10, 8380407, 8380403, 20, 30, 8380387, 8380415, 10, 16, 8380398, 8380402, 8380411, 0, 6, 8380409, 8380407, 24, 19, 8380409, 8380403, 27, 13, 8380360, 8380413, 4, 8380415, 8380413, 8380409, 1, 7, 8380405, 5, 1, 16, 10, 8380390, 15, 12, 2, 8380415, 8380399, 29, 7, 8380413, 8380381, 40, 23, 8380411, 0, 8380374, 8380410, 9, 6, 8380409, 6, 17, 20, 11, 8380376, 0, 24, 8380400, 8380412, 1, 22, 8380400, 8380409, 8380391, 8380401, 8380408, 20, 14, 4, 8380410, 8380412, 8380404, 28, 8, 10, 8380399, 4, 29, 12, 9, 8380412, 8380401, 8380401, 8380408, 30, 8380390, 8380416, 8380408, 8380416, 24, 3, 30, 8380403, 4, 8380398, 7, 8380381, 3, 8380413, 2, 8380404, 24, 8380390, 0, 23, 8, 8380397, 6, 17, 9, 8380408, 6, 15, 2, 8380402, 8380412, 19, 18, 7, 8380410, 8380406, 8380412, 8380393, 7, 8380392, 18, 26, 8380414, 7, 8380413, 10, 7, 4, 8380389, 10, 0, 5, 8380404, 5, 8380409, 4, 9, 8380410, 4, 8, 8380408, 8380410, 12, 33, 8380401, 8380415, 20, 13, 11, 8380392, 8, 8380411, 8380375, 8380400, 3, 8380410, 15, 5, 6, 8380416, 2, 8380403, 13, 26, 8380387, 8380401, 35, 2, 3, 8, 8380396, 8380393, 1, 8380403, 8380414], -[8380416, 38, 8380403, 4, 8380403, 8380389, 8380416, 8380415, 10, 8380385, 10, 2, 8380415, 1, 8380413, 27, 8380414, 28, 8380405, 8380386, 15, 8380408, 8380406, 8380409, 21, 0, 8380396, 12, 8380412, 29, 31, 8380374, 16, 8380386, 8380390, 0, 29, 8380398, 8380410, 8380415, 28, 19, 11, 8380416, 8380400, 8380399, 8380411, 16, 10, 8380395, 29, 8380415, 8380415, 25, 8380398, 8380390, 16, 22, 19, 21, 8, 8380406, 8380414, 4, 8380413, 8380403, 5, 5, 8380404, 10, 13, 8380412, 8380368, 8380406, 15, 0, 0, 27, 15, 11, 8380408, 8, 8380402, 23, 8380416, 0, 1, 8380412, 21, 17, 3, 12, 8380402, 8380408, 8380392, 11, 8380394, 5, 8380400, 29, 19, 8380404, 8380413, 8380410, 3, 52, 24, 8380402, 0, 2, 21, 8380393, 32, 8380416, 8380403, 26, 8380414, 8380416, 8380399, 10, 36, 8380396, 8380404, 8380413, 8, 8380411, 18, 13, 8380416, 8, 33, 7, 8380416, 14, 27, 7, 8380405, 42, 20, 5, 8380392, 16, 4, 11, 8380392, 8380396, 32, 26, 0, 21, 8380381, 8380410, 8380401, 8380414, 17, 21, 27, 10, 12, 17, 8380392, 8380415, 8380408, 9, 15, 22, 27, 6, 5, 8380412, 6, 11, 8380394, 8380413, 8380414, 8380411, 3, 8380408, 4, 8380396, 10, 8380401, 6, 8380414, 14, 8380399, 8380402, 8380405, 26, 8380395, 14, 8380393, 12, 8380399, 9, 16, 8380416, 3, 8380393, 13, 24, 9, 8380408, 8380380, 14, 18, 9, 8380380, 3, 25, 3, 8380402, 13, 8380402, 7, 8380408, 6, 8380414, 6, 1, 8380382, 8380414, 4, 8380406, 8380402, 8, 8380394, 8380403, 19, 8, 13, 48, 2, 8380415, 8380404, 8380388, 18, 14, 8380399, 8380411, 11, 38, 8380411, 1, 8380399, 8380402, 28, 8380370, 11, 8380398, 8380392, 7, 10, 9, 4, 8380416], -[8380408, 36, 1, 8380412, 8380413, 15, 38, 8380380, 8380404, 4, 21, 8380392, 8380415, 8380407, 19, 10, 8380416, 8380414, 12, 8380409, 15, 8380393, 29, 46, 8380403, 8380406, 18, 0, 25, 8380407, 23, 8380403, 28, 8380389, 19, 8380375, 8380389, 8380404, 8380380, 8380385, 33, 0, 8380400, 8380413, 25, 11, 3, 8380415, 23, 15, 2, 10, 22, 8380412, 2, 8380389, 6, 3, 8380412, 8380398, 8380412, 8380402, 6, 19, 8380390, 8, 8380396, 10, 4, 8380394, 8380413, 8380407, 8380416, 0, 6, 8380397, 1, 10, 8380399, 5, 8380413, 4, 8380410, 8380389, 12, 8380399, 7, 31, 8380415, 8380408, 6, 8380415, 8380403, 12, 20, 8380396, 8380403, 3, 16, 8380398, 21, 7, 15, 17, 32, 7, 8380357, 31, 8380412, 8380398, 8380407, 8380414, 28, 8380380, 10, 8380404, 8380410, 30, 8380388, 1, 8380395, 27, 6, 12, 32, 10, 8380390, 21, 8380415, 8380411, 8380414, 8380406, 8380393, 40, 8380410, 32, 8, 8380390, 8380407, 12, 8380411, 6, 8380384, 6, 8380390, 10, 8380410, 5, 8380390, 5, 8380403, 8380411, 12, 8380411, 30, 8380400, 8, 7, 16, 8380409, 8380415, 13, 8380392, 6, 8380394, 8380399, 20, 8380383, 25, 8380411, 8380404, 8380406, 8380388, 8380398, 8380416, 15, 23, 8380393, 8380415, 14, 21, 8380392, 4, 8380391, 10, 1, 11, 8380390, 17, 8380402, 8380401, 1, 14, 17, 8380406, 8380397, 37, 8380398, 11, 20, 8380404, 6, 13, 8380405, 10, 8380401, 8380375, 5, 8380405, 8380408, 8380415, 8380398, 8, 8380403, 30, 8380407, 0, 5, 16, 8380412, 8380414, 17, 8380408, 8380412, 5, 8380402, 19, 4, 20, 8380412, 7, 8380416, 3, 2, 1, 0, 10, 8380372, 28, 8380415, 2, 8380386, 51, 26, 8380383, 0, 2, 8380400, 0, 8380404, 29, 8380389, 19, 8, 8380404, 8], -[1, 32, 14, 21, 8380409, 24, 18, 8380409, 1, 8380399, 8380389, 41, 14, 8380382, 8380375, 22, 8380397, 8380372, 8380411, 5, 8, 12, 8380389, 8380410, 13, 3, 2, 8380394, 8380413, 16, 1, 21, 8380414, 1, 8380408, 8380406, 8380416, 8380416, 35, 8380408, 9, 8380407, 24, 14, 8380411, 8380412, 8380412, 8380412, 8380395, 8380395, 8380400, 6, 24, 8380389, 19, 3, 1, 8380378, 8380385, 17, 8380415, 9, 3, 8380397, 24, 8380402, 3, 24, 8380414, 8380403, 8380410, 23, 8380411, 8380408, 8380388, 13, 57, 8380415, 6, 8380415, 8380409, 17, 9, 8380412, 8380400, 4, 8380407, 8380397, 0, 1, 15, 8380394, 8380408, 3, 11, 27, 8380415, 8, 8380404, 8380404, 25, 8380412, 4, 8380387, 1, 3, 24, 9, 35, 8380408, 23, 16, 8380408, 4, 8380397, 8380391, 22, 13, 10, 6, 15, 8380384, 8380379, 8380408, 10, 8380376, 8380384, 32, 8380405, 8380394, 3, 8380390, 6, 18, 20, 10, 8380409, 12, 6, 8380407, 8380416, 1, 12, 12, 8380396, 7, 34, 8, 8380387, 10, 8380368, 5, 8380404, 8380360, 8380405, 5, 8380389, 14, 8380415, 8380398, 8380406, 8380401, 13, 8380410, 8380403, 24, 8380406, 8, 8380415, 18, 8380403, 8380416, 8380399, 5, 31, 19, 4, 8380395, 8380406, 5, 8380408, 0, 9, 8380414, 8380410, 6, 8380409, 8380414, 8380410, 8380404, 8380414, 8380394, 8380383, 8380401, 1, 25, 8380412, 16, 4, 4, 8380397, 8380409, 8380410, 20, 5, 8380372, 8380411, 46, 30, 8380405, 8380415, 8380415, 8, 7, 1, 8, 12, 12, 8380391, 8380388, 8380409, 10, 3, 8380401, 8380405, 25, 8380414, 8380390, 8380391, 8380402, 8380411, 5, 0, 8380390, 30, 26, 8380410, 7, 25, 37, 8380413, 8380394, 9, 2, 0, 8380410, 25, 8380414, 31, 5, 8380408, 1, 8380390, 8380415, 8380397, 4], -[8380402, 8380381, 5, 26, 8380400, 8380404, 8380407, 9, 8380404, 8380397, 8380413, 8380403, 33, 8380385, 18, 8380414, 7, 8380377, 8380392, 29, 12, 5, 8380389, 14, 43, 8380412, 8, 0, 8380404, 9, 8380405, 8380414, 8380412, 0, 8380411, 8380388, 6, 29, 23, 8380388, 2, 8380403, 8380389, 8380402, 8380400, 8380402, 26, 7, 8380407, 39, 8380395, 8380415, 17, 16, 8380382, 0, 25, 8380403, 8380412, 11, 8380373, 6, 6, 8380407, 8380385, 22, 11, 8380394, 8380381, 4, 8380408, 19, 8380406, 18, 10, 8380414, 8380398, 0, 4, 8380402, 8380411, 2, 36, 15, 0, 8380411, 8380381, 33, 8380398, 4, 8380416, 5, 8380416, 8380414, 18, 1, 8380396, 29, 10, 25, 7, 8380416, 1, 8380399, 8380410, 8380399, 8380407, 8380408, 8380407, 28, 8380409, 4, 8380407, 10, 8, 8380412, 12, 21, 8380408, 8380415, 8380406, 1, 5, 9, 8380408, 24, 14, 8380407, 8380412, 8380388, 8, 8380409, 0, 23, 5, 7, 8380415, 8380410, 9, 10, 8380402, 8380406, 4, 8380407, 8380411, 8380409, 8380403, 8380407, 19, 8380415, 23, 15, 7, 8380400, 8380411, 8380402, 8380397, 8380414, 39, 8380405, 28, 20, 8380405, 24, 8380388, 8380380, 8380416, 4, 3, 8, 8380405, 8380401, 27, 8380397, 2, 8380408, 3, 6, 19, 4, 8380408, 8380401, 8380404, 8380406, 40, 7, 21, 8380392, 0, 17, 8380400, 8380405, 17, 18, 1, 8380415, 8380416, 8380415, 7, 8380394, 8380401, 14, 29, 8380403, 4, 8380410, 8380387, 26, 8380409, 8380411, 18, 1, 8, 8380404, 8380389, 7, 8380414, 0, 8380415, 27, 34, 27, 8380410, 8380406, 0, 19, 8380400, 8380396, 20, 3, 8380388, 7, 8380406, 6, 8380413, 5, 8380403, 15, 15, 8380388, 2, 8380399, 8380403, 29, 8380392, 19, 8380398, 8380399, 27, 8380399, 3, 8380412, 8380411, 29, 15, 19], -[5, 8380402, 12, 8380409, 17, 2, 6, 5, 13, 8380412, 8380414, 23, 11, 8380409, 8380393, 8380405, 8380397, 21, 8380374, 8380405, 0, 13, 8, 6, 5, 8380415, 3, 19, 8380405, 9, 9, 8380395, 25, 32, 8380416, 8380408, 8380406, 8380405, 8380408, 8380391, 8380392, 0, 8380415, 8380394, 8380387, 6, 44, 8380414, 8380408, 8380394, 17, 8380408, 1, 8380414, 7, 14, 8380404, 8380405, 27, 18, 21, 8380384, 0, 8380415, 8380390, 3, 8380389, 8380404, 9, 8380412, 8380404, 0, 35, 5, 8380414, 3, 8380403, 16, 3, 21, 28, 3, 2, 30, 8380392, 8380395, 8380402, 40, 8380406, 11, 2, 1, 19, 8380401, 8380393, 8380413, 8380381, 8380414, 8380408, 29, 41, 9, 8380413, 8380387, 2, 8380411, 8380410, 8380391, 8380404, 42, 8380412, 22, 8380384, 5, 8380411, 8380415, 8380410, 11, 22, 13, 11, 16, 35, 8380413, 39, 9, 8380379, 8380407, 40, 5, 21, 8380404, 8380402, 8380406, 8380404, 9, 8380409, 8380381, 8380405, 18, 18, 30, 8380411, 8380400, 16, 8380386, 5, 7, 2, 8380405, 28, 23, 8380413, 8380415, 18, 24, 8380394, 8380410, 4, 4, 8380409, 8380404, 8380391, 10, 8380391, 8380407, 8380403, 6, 3, 19, 8380410, 26, 2, 8380409, 9, 8380379, 33, 38, 8380413, 24, 23, 24, 8380415, 8380389, 2, 31, 9, 8380377, 8380399, 8380409, 8380409, 8380414, 8380406, 13, 15, 8380412, 10, 1, 31, 8380400, 16, 3, 8380398, 8380409, 15, 4, 52, 8380392, 8380402, 8380415, 8380406, 8380416, 8380402, 8380411, 10, 17, 8380403, 12, 23, 5, 8380388, 8380387, 18, 13, 8380410, 8380416, 16, 10, 16, 8380399, 8380405, 10, 8380400, 9, 8380395, 24, 15, 8380415, 8380374, 8380414, 8380402, 4, 5, 8380413, 3, 33, 20, 33, 29, 25, 6, 8380415, 4, 3, 8380387, 8380397]] -z: [[8038429, 66497, 8252275, 119746, 9589, 8155927, 8109334, 454088, 8006017, 307608, 449759, 105448, 466102, 129664, 8240477, 8175712, 7878516, 162909, 421532, 8083158, 65198, 7862250, 222652, 8200620, 37610, 425303, 8168660, 8049357, 8159831, 274848, 8009730, 400456, 8052282, 110124, 158533, 8100928, 7990871, 8303909, 245795, 7948792, 182254, 8223459, 8338564, 8134456, 8372332, 470443, 8144847, 8278541, 101245, 8254809, 491747, 8136929, 123789, 380214, 8324331, 8084178, 8264789, 8198459, 51408, 159336, 277321, 429082, 287417, 395755, 345974, 8215185, 8086831, 7937246, 76190, 7993139, 7934187, 98940, 8168238, 8289107, 159428, 315079, 8370299, 385720, 410014, 432328, 389014, 412, 57400, 8167870, 300995, 67314, 8306764, 434448, 359504, 82129, 8138307, 37404, 8340391, 244980, 8045733, 281400, 7904325, 37704, 210772, 248869, 176471, 336184, 340380, 8235169, 192066, 88419, 8339519, 211410, 8224465, 8255496, 102543, 504576, 7939589, 445349, 8308821, 8344992, 8004611, 8154099, 519304, 8184221, 348210, 314459, 8081286, 198291, 32747, 366356, 8299512, 7981780, 7967240, 434230, 334352, 8116070, 243344, 7991915, 8004241, 8089641, 8292361, 8097188, 92124, 75248, 249022, 507728, 52835, 413170, 7891631, 292762, 203210, 8330592, 8142139, 406246, 522764, 96705, 7908044, 8148070, 485980, 8280909, 266266, 61899, 7904156, 94592, 8349446, 136978, 419703, 31242, 123762, 8205766, 8378570, 428816, 256829, 40900, 8032669, 123070, 315104, 463392, 8372124, 483437, 8055774, 8101103, 7981409, 8036520, 184416, 8059045, 8023234, 415823, 215907, 101500, 8197625, 8109661, 8247240, 105487, 8287775, 479110, 8168839, 38978, 66144, 82905, 8324834, 7888336, 7889844, 501607, 8154397, 8346332, 8109419, 8003984, 8096990, 309728, 303553, 393798, 201840, 8030944, 8126131, 458262, 329314, 254202, 417636, 8293904, 284479, 8289041, 410209, 7901061, 8073746, 8031569, 8177733, 8027501, 8219304, 8335970, 8370336, 363486, 366027, 79772, 8209746, 116705, 14271, 8082355, 8149277, 260334, 8224843, 7075, 450917, 31748, 413458, 58059, 249567, 93821, 8039832, 241433, 8366571, 287085, 8076059, 8183544, 152352, 8078421, 7863805, 8244701, 8269327, 198414], -[476071, 7940004, 8105977, 7994031, 8227892, 7980978, 8027097, 8215626, 8051124, 352098, 507638, 8132523, 446542, 431534, 7872327, 8096624, 7886781, 7976678, 8200120, 137648, 330069, 481803, 7881800, 8007334, 370891, 8152393, 103838, 446275, 216339, 61122, 7982501, 385543, 8302509, 8226252, 8220829, 7948968, 102363, 7960519, 7963410, 16233, 8119732, 56155, 490916, 462996, 8244077, 399911, 191378, 389648, 8255670, 8230253, 339965, 364822, 8179274, 290237, 507504, 8205336, 362546, 264721, 343710, 8302735, 403361, 314455, 283343, 8158925, 505917, 8294824, 94199, 421545, 37910, 199791, 8054192, 8262010, 8283466, 153059, 441832, 7963835, 8316431, 7948524, 8160823, 83554, 306797, 7945945, 89313, 25109, 7907697, 184733, 7944360, 371075, 8036755, 164728, 372509, 8292633, 92735, 7874414, 8029335, 88022, 8209379, 8045083, 332114, 416623, 356969, 303410, 57859, 227652, 54478, 8218841, 7928394, 7870284, 488614, 8297460, 7860208, 7961666, 7900014, 8171448, 508858, 93075, 8014370, 205300, 8006019, 8011462, 8234566, 433254, 8051804, 65185, 211499, 7975428, 8337005, 7966019, 7875980, 8177242, 8240662, 111093, 8257018, 8099643, 8096804, 29773, 381239, 8255519, 510335, 8145776, 8265427, 8103464, 8066806, 7949555, 346693, 8125098, 8359706, 243633, 7987811, 8310130, 92202, 8057809, 255702, 205971, 7988187, 374116, 8295085, 8348747, 61995, 258207, 7856940, 8184348, 72506, 355843, 283631, 8048267, 8064631, 74590, 8289943, 307485, 464608, 186322, 7991426, 417514, 436088, 56796, 8267002, 416969, 8207681, 319984, 63107, 10948, 339457, 8032841, 237902, 432066, 496529, 8096851, 485919, 8368347, 420330, 7884907, 8258208, 158923, 87426, 307760, 243278, 405470, 8235748, 113908, 8231168, 8187218, 350437, 469416, 274722, 357769, 78977, 242079, 404146, 8146158, 8177960, 8208536, 92192, 340697, 4347, 8219637, 7889042, 7992399, 8063990, 7899591, 180469, 422790, 43736, 7934331, 8210772, 8249460, 7856569, 215359, 510931, 441954, 287642, 7920544, 184146, 7932770, 8103962, 448715, 8188414, 8312285, 410553, 8315502, 53636, 8215853, 8032991, 503585, 132371, 8013668, 452693, 159400, 8330297, 420285, 8329422, 163865, 8117727, 441317, 151827, 8015116], -[7945048, 8332557, 103482, 8223685, 8337461, 8250193, 8081670, 8069778, 424100, 8370434, 161763, 259655, 201046, 86307, 7979156, 7898257, 421875, 467634, 318525, 104212, 7915162, 8037692, 194727, 8237709, 156023, 317419, 389088, 29613, 7973846, 119789, 126777, 8151675, 7862959, 451939, 8227510, 479366, 54900, 8345152, 285102, 8089473, 496078, 7865522, 8180511, 8130567, 7912836, 258918, 93175, 448202, 493333, 237601, 8168829, 8246699, 8135207, 8162394, 280699, 8361822, 8346229, 184130, 8255123, 7890508, 8323399, 8239500, 257397, 7966982, 8354973, 7960200, 8250187, 327865, 238728, 8000902, 193284, 8018839, 8259445, 8300354, 522481, 8276447, 8266418, 458658, 8194331, 7981120, 105542, 235830, 8261820, 342535, 231561, 359970, 7921291, 8053393, 8020345, 513175, 102695, 150344, 498529, 523551, 8341264, 8272011, 455304, 92491, 330427, 8279833, 142329, 95119, 8172927, 300637, 65732, 506910, 7892295, 8031202, 8268025, 8048060, 144772, 136877, 8117552, 8299267, 470449, 169886, 8025228, 66136, 8160516, 8343167, 315897, 413375, 8332132, 8221810, 8082019, 260038, 361154, 8235949, 160239, 7929413, 8276400, 222330, 8124128, 8357443, 193979, 8208317, 171193, 7857126, 163065, 7890508, 8361265, 8031454, 465215, 8238008, 7958662, 8071473, 468300, 8265145, 7888216, 370011, 52650, 512090, 8174538, 8052013, 7914835, 458488, 7995478, 364461, 7995642, 8127593, 8175558, 8042987, 40270, 472133, 376049, 134825, 448658, 299505, 8274557, 27990, 374494, 8349219, 62354, 8239560, 8327357, 195691, 8065579, 8326323, 490588, 8151147, 463154, 8129429, 229636, 8024035, 42744, 7962321, 8296976, 458644, 7933462, 7873398, 321387, 329300, 7991384, 123954, 477986, 451731, 269567, 460489, 108755, 7963674, 8007968, 335946, 8007795, 58109, 50315, 7987190, 8262201, 8362088, 43888, 345439, 457224, 242788, 8091655, 8146742, 8325024, 279852, 383737, 8075621, 427033, 401658, 83021, 8318736, 226398, 301552, 8074051, 428006, 8336822, 7967888, 438562, 319358, 8238558, 8060740, 260736, 8108790, 8126392, 71787, 8303824, 7917067, 8225227, 40039, 8192252, 8239554, 8178955, 7949205, 155150, 7983974, 265796, 408110, 188587, 8178035, 7896079, 435964, 213614, 8329292, 366496, 7895838], -[7861409, 8058002, 8022854, 286662, 8297888, 73403, 8126417, 68526, 8117255, 482648, 131288, 8368243, 197441, 7971207, 129173, 8266567, 7884820, 141443, 8327862, 7994035, 8142407, 8252905, 356843, 457571, 208344, 8244855, 8140657, 494339, 64368, 8155243, 7875567, 251538, 8110167, 7987050, 399218, 261557, 151781, 8074326, 252478, 8366273, 8235292, 7906927, 345188, 8004319, 8322206, 449656, 310600, 7891452, 189285, 8113790, 7983920, 114221, 385060, 394148, 258366, 8075550, 289662, 8308787, 227562, 8005552, 7907002, 8116044, 8181546, 187730, 8156947, 8060246, 479220, 8275274, 7871689, 255181, 518984, 8317929, 7906932, 69396, 115054, 498389, 8245769, 287149, 8343022, 441609, 7930995, 8298955, 7908973, 7927556, 336239, 8051211, 292435, 8225484, 445683, 8165481, 198703, 8142162, 8293986, 7996297, 429340, 8265846, 8355591, 43339, 56821, 461439, 255835, 194075, 8368087, 8203872, 8109662, 142937, 8221240, 337822, 8263209, 155139, 40107, 8033243, 25276, 129536, 7978648, 151967, 8038979, 513924, 7886498, 7920326, 7922333, 8162100, 8134221, 8186178, 199827, 8361616, 375883, 520424, 356840, 147722, 237482, 179936, 450273, 304832, 295323, 69019, 107130, 7978441, 186088, 324620, 379951, 8290454, 8005680, 414187, 7911374, 7856402, 8175869, 268860, 245098, 446240, 449112, 102017, 207510, 8372036, 414086, 199325, 8363120, 68210, 7902408, 193521, 8107662, 7969108, 481642, 8110579, 8098203, 324111, 8038021, 192108, 81569, 500851, 7860748, 7856494, 140768, 276723, 7986110, 5475, 397827, 391226, 8136482, 520654, 28126, 8102159, 244426, 7977319, 8316694, 208709, 165099, 7881539, 8012886, 306561, 8214779, 7899654, 8221764, 8362197, 495986, 136045, 8227422, 8128527, 171450, 292685, 7860540, 225956, 319606, 8335718, 8272643, 7996522, 454996, 66535, 7957043, 8076418, 7984978, 8362248, 274760, 7961835, 8349516, 21918, 347118, 104931, 203435, 123831, 373885, 292654, 187437, 8109925, 320144, 7941521, 71208, 278361, 8315449, 7915224, 7887861, 520709, 7988832, 8283295, 8174738, 7902603, 471504, 275429, 8003801, 15947, 73326, 8158347, 8218984, 8085441, 453241, 8300783, 7976585, 7918095, 7884668, 208032, 446691, 8141636, 11121, 215709, 8302459, 460544], -[8150965, 8284053, 8348198, 256611, 198168, 7879266, 381588, 329990, 180872, 8355431, 179021, 7951477, 280152, 471223, 155010, 110519, 8070860, 7872471, 8022443, 254951, 8188449, 8096014, 283447, 452498, 364540, 8033597, 8059847, 8262641, 257807, 8181502, 230640, 231053, 8237286, 495109, 297077, 7930776, 8240952, 51331, 8108716, 8104000, 261798, 275790, 8038523, 8177760, 488676, 8120258, 7956041, 7919155, 6865, 8052524, 313008, 209368, 398462, 232990, 85829, 215628, 7954733, 8373087, 104373, 8064824, 406354, 8083676, 8379266, 361976, 8275613, 7929356, 8355050, 7911624, 8296944, 431919, 500660, 90654, 8376112, 112786, 170176, 24732, 100634, 8052783, 130526, 343641, 8145317, 323954, 8313538, 92342, 8243342, 8112193, 8225009, 479655, 8302510, 8200170, 12698, 144798, 8075528, 331558, 8009153, 8339121, 283138, 432153, 8281072, 7993002, 46104, 8227701, 8226836, 8097107, 315509, 8012500, 7961049, 8259067, 7984634, 8292240, 282817, 8324422, 8231364, 269992, 8086281, 8058342, 37766, 8083295, 8050289, 7966025, 8299990, 385265, 267385, 272250, 39854, 228911, 7922850, 361295, 8374226, 84541, 8347251, 296713, 510794, 8286515, 8017295, 8082182, 7882123, 7941420, 8072822, 243057, 66854, 283281, 7979296, 415320, 7932134, 8052417, 443560, 7493, 60660, 8344933, 8032764, 7996323, 8095782, 134565, 8009363, 420256, 7970124, 168497, 391341, 494808, 8048637, 440486, 8294150, 205186, 8329648, 351889, 107822, 8285860, 7891345, 7892127, 424123, 267586, 44897, 209905, 8094490, 8140918, 8108342, 246225, 49951, 359218, 61081, 8288876, 8183472, 255226, 221883, 475473, 168081, 463309, 7861568, 8294747, 306245, 7977860, 7927957, 211221, 483754, 8228971, 136408, 328699, 8177052, 7976897, 372010, 8227799, 8172976, 249188, 7976465, 24965, 146630, 5128, 362592, 110577, 8193459, 425424, 8175831, 521382, 8083697, 239686, 7878690, 54599, 208454, 8300286, 48916, 8085321, 8010868, 465300, 433810, 7876170, 471605, 354395, 205497, 200420, 295198, 234951, 318184, 8093837, 8090513, 161563, 372864, 8220253, 344971, 8268585, 8329434, 8312220, 7894719, 90041, 8263658, 8214150, 89859, 8234456, 8046222, 7964108, 8248578, 7863890, 8354224, 246737, 8288770, 100364]] -||z||: 524015, ||z|| check passed -r0: [[-105859, 47863, 50835, -179782, -212714, -159491, 182094, 165419, 52489, 116057, -181813, 86995, 157955, 122428, 13855, 135806, -14505, -78991, 209733, -226890, -202206, 154769, -52710, 6939, 252037, -108823, -243810, 239944, 163793, 208332, -249532, -61533, -171592, 60943, 28394, 252140, -87565, 248336, -112415, 93158, -186184, 177803, 222362, -238612, -205163, 241809, -176641, -119486, 136871, 31018, -38970, -186944, -253863, -180712, -124907, 175784, 93916, -174025, 83269, -100884, 145549, -256937, -192564, 256564, 3618, -127916, -107062, -171505, -129041, -208341, 41760, -245891, 63342, 197140, 81306, -130006, 143406, 110580, -164922, 240592, 95749, 13804, 152541, 175734, 128725, 152880, -189967, 214096, 6196, -42129, 70803, 203795, 96195, -75461, -230486, 139846, -215401, 78017, 167297, 150988, -240740, -177567, 70351, -164589, 209818, -112046, 6499, -153895, -84586, -122085, 73153, -261014, 47152, 118267, 30190, 127917, -103707, -174915, -112873, -118518, -199405, 67124, -238614, 252446, -170252, -15319, 62608, 241579, 71459, -70686, -55927, 123609, -86043, -163904, 85686, 176127, -88451, 48154, 3506, 164710, 31410, -161868, 211200, -238224, 232184, -23543, 19999, 158415, 106383, -257769, 218573, -254262, 240015, -137217, 232724, -102443, 153190, -128013, 49967, 54366, -185743, 55607, -144792, 186986, 233941, 6330, 28559, -152749, -44958, -5649, 86053, 100056, -127918, -170400, -177653, -65312, -17371, -126114, -39008, 206684, 214602, 246826, -75759, 72683, 92433, -42095, 24846, -166263, -200524, 258772, -92351, 239914, -165900, -96070, 35936, -153894, -10685, -79762, -157184, 221494, 74967, -27379, -71413, -222033, -127286, 5905, -193160, -225260, 113718, 45553, -158405, 36915, -49539, -164537, 164524, 117294, 243604, 247081, 251679, 83470, -105827, -174640, -168462, -120929, 59052, 239244, -79592, 79174, -26332, 88070, 116891, -100077, -212110, -212606, -179445, 92945, 210947, 121698, -57986, -224645, 253931, -133407, -112495, 58385, -252748, -260134, 106030, 7817, -187666, -47729, 131718, 221925, -109721, -83347, -84885, -129388], -[152555, -181731, -138894, -121974, 156844, 123827, -51142, 218095, -162442, 136524, 33959, 38818, -12588, 10001, -117653, 13076, -151024, 249100, -146518, -122678, 203828, -36029, -53384, -110269, -168296, 3822, -34580, -187186, 111109, -130119, -50225, -139792, 204965, -180872, 240525, 257207, -245290, -176558, 138640, -123807, 156978, -55199, 190554, 32720, 194654, -203109, 103930, -91390, 218685, 258527, 8936, -230293, 59955, 96836, -248767, 156416, 110162, -199187, -56887, -240057, -204046, 62322, -222984, -26157, -219390, -160166, -113841, -92022, -118807, 112694, 178964, -171810, -173626, 57560, 94093, -189130, -218413, 255385, -144611, -9258, -194778, 248286, 166556, 99463, 2420, 54018, 205887, -250966, 231008, -137316, 41899, -173213, 37066, -193779, 147870, -101245, 189856, -219654, -19459, 125563, 230553, 173868, -101612, 19976, 222851, 113907, -219859, 136620, -8107, 186399, 61938, 195180, -225827, -234883, 65247, 63636, -173737, -20610, 166416, -65906, -166483, -180595, 10456, -236408, 251285, -81741, 191456, -71775, 222168, -257666, -91025, -54971, 69702, -89972, -214486, 9918, 144127, 153125, 219888, -160013, 109196, -5470, 8581, 256536, 130298, -10610, -64487, 126352, -82659, 111000, -251707, -48553, 135064, -136519, -51039, 252076, 245138, 74783, 45805, 157250, -89225, -178715, 67228, -112482, 42761, 239206, -183680, -198531, -12842, 235934, -33202, -125452, 260984, 157542, 187791, 178589, 158228, 241544, 230101, -14232, -29813, 175362, -46264, -168008, -15213, 7591, 243488, -152804, 111362, 189646, -165602, -84280, -50464, 22906, -17808, 234190, 211808, -244012, -112684, -158167, -95665, 116364, 165773, -216620, -194705, -72781, 107542, -247941, -183420, 183840, -246262, 69465, 142190, -64300, -178996, 124472, -250737, -206127, -207758, -127723, -47107, -251227, 206632, -227946, 232152, -160539, -113009, -221705, 25166, -75013, -201882, 187273, -155360, 29729, -150385, -27438, 65732, 476, -114128, 53048, 126766, 257650, 209092, 80680, 96402, -31468, 164199, 220317, -150484, -138616, 167827, 90568, 132680, 153831, 80107, 31615], -[-141393, -101742, 27383, 190715, 149813, 130080, 18110, -192764, -29706, -2182, -44418, -55367, 60546, -190519, 47527, -208104, -120568, 147717, -217004, 89182, -32023, 131135, 204288, -168405, 189825, -78200, 99091, 246239, 214348, 187383, -150119, 241670, -66339, -255115, 220398, -149936, -141716, -4123, 246052, 77792, -49304, 180326, -73936, -152916, 200434, 155255, 176943, -151262, -253083, 55863, -237793, 88965, 175352, -60404, 118146, -225761, 249, -44321, 155573, 130104, 185242, 222931, -164554, -21725, -101885, -187198, 99619, -119225, 105688, 20756, 125790, 32152, 52582, -134472, -30996, 72244, 28872, -150785, 7760, -89500, 81657, 206361, 171162, -259090, -253957, 117038, 84415, 92757, 12764, 220691, -32742, 144585, -45646, -140709, 94961, 134167, -40234, -214672, 206972, 148979, 57131, 80743, 90762, 66779, 94594, -190731, 204738, -62466, 43275, 35162, -125070, -227084, 6362, -74683, 38012, 145916, 27838, -86092, 211871, 2466, -30982, -256236, 100763, 160524, -231225, 114511, 188521, 41081, 52053, -85274, 134322, -179758, -30992, 42292, 245760, 151090, 22939, -52300, -41355, 23756, 251929, 203532, -34047, -245856, -203125, -220882, 198699, -179887, 76297, 15815, 156083, 10962, -261112, 200703, -242007, 24380, 182953, -183838, 139823, -242221, -182847, -140005, 122680, -86207, 100812, -46711, -117587, -88399, 185258, 222390, -226025, -40959, 158505, 103472, -158042, -149737, 205409, -35990, 96445, 26282, 260931, -18064, 139693, -41534, -104888, -152403, 171805, -35326, 51897, 169214, -30254, 17043, -3592, 99041, -80838, 49173, 16264, 228260, -184328, 88768, -88813, 91280, 245382, -115509, -93524, -169067, -67716, -210279, -243276, -189583, 215412, -56350, -76631, -70634, -213456, -12349, 179048, 224621, -45937, -109638, -176280, 47234, 149718, 157867, -121809, -142424, -253009, -20955, -45036, -127526, -234120, -125745, -224330, 156509, -259640, 166942, 195712, -15434, -55296, -139661, 101679, 20581, 172432, -66627, 141249, -77321, 182392, 33006, 51819, 76190, -190788, 136582, -174337, 7040, 68860, 78079], -[180496, 14517, -18269, 30673, -64959, -173970, -142254, 195491, -87203, 195131, 29859, -150576, 246658, -41300, -238781, 231897, -71424, -108742, -87573, 98680, 2362, -197915, -206160, 12593, -96104, -140054, -81100, -34693, 76051, 227176, 179010, -81696, 96033, 89044, 99272, 113749, -32060, -209141, -25081, -169509, 39551, -46265, 85710, 197588, -29431, -126672, -68974, -194714, 210469, 134704, 126872, -36594, 224044, -185323, -93402, -134659, -46687, -4240, 126482, 222495, 6624, -211800, -254674, -119278, -114060, -125924, -36758, -201013, 116495, -171066, -201504, -151703, -13207, 83590, 202190, -72015, -34729, 2559, -213720, -257096, -220046, 85994, -165525, 71554, -23893, 183035, 239688, 144823, 11506, -116285, 224443, 40091, 225334, 57326, 240359, -134801, -215843, -199273, 58367, -13103, 231260, -1229, -238321, 215088, -200308, 232990, -75925, 63162, 89500, -203063, -163669, -12060, -220005, 10095, -148715, 15201, 118287, 202929, 70740, -241765, 238179, 45057, -209016, 160885, 43347, 258209, -231616, -113810, -86352, 194025, -29426, 227320, -259361, -197758, 219130, 66976, -254307, -183241, 210733, 100807, -247657, -73822, -53851, 200055, -112839, 189383, 208432, 106456, 198652, -200556, 104375, -125347, -41421, 203473, -44884, 93589, -230779, 188356, -41891, -113179, -147774, -119639, -168058, -63324, -104565, -21405, 234791, 120146, 37416, 234570, -163578, -82511, -229192, -60501, 216978, 129025, -202166, 8928, 117446, -219800, -16149, -135239, -224568, -68993, 155406, -217071, -185234, -109139, -184761, -112218, -181887, -106598, -177727, 75121, -245176, -147625, -256070, -54469, 143225, -115528, -129759, 38797, 231196, 70831, -6920, -210027, -214498, -146504, -184454, 190847, -5373, 150298, 143371, -2477, 39734, -106471, 102154, 200701, -78257, 49905, -56278, 176195, 50567, -30661, 227263, 11918, 46347, -23659, 112369, 95977, 92854, -178660, -3725, -252740, 6598, -193082, -55303, -232939, -123316, 225605, 45891, -214308, 236629, 260184, 22385, -94602, 73803, -196184, 248604, 139845, -141499, 205954, -187471, 94632, -128554, -109680], -[-52752, -243523, 158804, 235396, 236382, -22913, -209000, 212892, -255651, 214971, -136863, 182276, -254725, -19824, -187722, 224848, -252272, -6604, 44884, 40756, 197079, 159098, 62669, -119556, -164397, -28863, 182992, 218421, -244417, -168250, 4556, -79190, -216950, 260671, -158089, -50178, -258768, 194966, 97660, -84678, -220279, 97406, -117969, -11684, 51560, 101531, -170423, 104547, 51152, 206604, -228231, -220281, 260629, -236081, 200199, 808, -55157, -131089, 230727, 256799, -208366, 58152, 177815, 108752, -105929, -123433, 150995, 120706, 196510, 257964, -59523, -174447, 231369, 76991, -194367, -126643, -110790, -70530, -259032, 4327, -52613, -255190, -154294, 56319, -165106, 100173, -141840, -95394, -145195, 136860, 8244, 200230, 232928, -85308, -27450, -243254, 60771, -69443, 27828, -94606, -126733, -45488, 119316, 89455, -191607, -42683, -88514, -218059, -86156, -125490, -103638, 164398, -92639, 78519, -99180, -101041, 79655, 92795, -123477, -201362, 21911, 88731, -97702, -244641, -199435, -185422, 230008, 65842, 231357, 218289, 176356, -7130, -8420, 52247, 130026, -156429, 104426, 229907, 117818, -125727, -209743, -40965, -106358, -48713, -130643, -247347, 120914, -220367, 177772, -184709, 165707, 137742, 18764, -138047, 228211, 229400, -186165, -152941, 67948, -87100, -43267, -168205, -147561, -77465, 241399, 195466, 14501, -69991, 198024, 260938, -108127, -137917, 3561, 80590, -182077, 202722, 137860, 124449, -230840, -257163, -232504, 39430, -59932, -165703, -121766, -211899, 202757, 141960, 20199, -65136, 154615, 183413, -168457, -95645, -187132, 38706, -207604, 178344, -150711, -57171, -15453, 220315, -118553, 113623, 155699, 149457, 143757, 35744, -130402, -146636, 194857, 183408, 240233, 138552, 203640, -35635, 145024, -18818, 127200, 173104, -110396, -216521, 110017, -28980, 199067, 114660, 212674, 3103, -98625, 171118, -252323, 48973, -221921, 207322, -189383, 180904, -168448, -69294, -156631, -101634, -244782, -143312, -128615, -99241, -13448, 154762, -100327, -187413, 61675, -139215, 43451, 206141, 15915, 254416, 33569, -257342], -[-51366, -221301, 224063, -20281, 195564, 82627, 230762, 46586, -27999, -59057, -225924, -128600, -128133, 155414, 59770, -244348, 42827, -87436, 157739, -216275, 2550, 9653, 124325, 48522, -162646, 205279, -90756, 129609, 188678, -66626, 185632, -256826, 119820, -81332, 207474, -10699, 121698, 179318, -227115, -19985, -60853, 139857, -165697, 143878, -198601, 39484, -147323, -231042, -177708, 157677, -214020, 189000, -64184, 124299, 62948, -90643, 100288, 189682, 212954, -255107, -19621, 41589, -67778, 10312, 135071, -112929, -15422, 108613, 203965, 134659, 139324, 81138, 97799, -201761, -174920, -122548, 94377, 261687, 67821, 233701, 52883, 20445, -4467, 136339, 22196, 184076, 146737, -159518, -60062, 251843, 103439, 128579, -89517, 149949, 33530, 236030, -101551, 158242, -230286, -20235, 188075, -141453, 245563, 158416, 127485, -86845, 48373, 94423, 190743, -18476, -207110, 161141, -113055, -52409, -249660, -59652, 234743, 110315, 72056, -103975, 75529, -186460, 201083, 3125, 39156, -75936, 11749, 116691, -83059, -41118, -143071, -77915, 7514, 76356, -132568, 33898, 222448, 184246, -55120, -40763, -177679, -66857, -64552, -171215, 154660, -217700, -563, -245255, 39101, -171219, -242560, -11096, 31983, 193300, -93318, 73049, -7278, 221486, -53387, 153173, 161529, -234134, 254531, 175181, 168686, -47509, 237157, -83013, 45566, 102689, -104951, 31848, 213010, -163343, -228656, 70403, 123512, -250739, -96718, -202680, -208993, -84537, 222827, -62676, -236938, 55143, -36607, 57689, 1687, -102560, -63103, 96289, -243124, -197110, 87298, -152413, 181860, -46333, 63577, -53563, 232541, 11530, 172308, -218303, -81430, -72660, 222297, -19980, -115160, 75117, 123491, -35086, 244352, -204921, -180206, 70163, -5565, -45103, -88145, -159679, -6966, 156986, 198297, -50675, -115475, 226579, 43940, 12294, 90325, 121855, -184881, 221468, -176030, 144384, 128093, -152448, -94431, 110773, -255950, 10528, -101200, -21608, -23398, 12127, -52403, 80402, -72953, -49750, 86250, 249864, -57907, 8538, 126194, 46120, 80346, 207846]] -||r0||261687, ||r0|| check passed -cHat * t0Hat: [[5283921, 1325226, 2851471, 2452202, 6625370, 3047221, 5713202, 7651499, 3066858, 1710013, 4612629, 3053574, 3803431, 7459755, 321431, 3276443, 7023201, 2039862, 1712229, 1273686, 1858157, 5670663, 1183303, 2251352, 7470335, 4111173, 3100311, 7292866, 1524347, 5101013, 4188801, 3332046, 4461260, 1701921, 1946466, 2459795, 5977031, 8301562, 8201704, 7311034, 6729058, 34750, 3785171, 6403190, 3585151, 4528075, 4824486, 6632280, 1906080, 475641, 7769066, 6500856, 1413966, 2950357, 3167622, 894714, 6703153, 4964526, 6279191, 8037811, 7296629, 869144, 5578711, 5369902, 5773855, 7850915, 2005087, 1481561, 2668516, 8151581, 8239803, 6320248, 1448380, 4370817, 7445925, 2560904, 7630553, 5553889, 6249313, 8065020, 7074113, 2616275, 281882, 7602353, 1435615, 6435337, 4616854, 8085065, 9066, 2782196, 7684325, 2729552, 3843366, 5895007, 6643692, 6352720, 1695115, 780170, 2787355, 5698254, 1221312, 4328101, 4029677, 4273444, 2848008, 1121183, 353978, 5246991, 1666285, 5511170, 818593, 718726, 5668898, 1825281, 6983743, 5252390, 8174101, 6842815, 405083, 2552447, 5504662, 2192611, 6018434, 8348868, 5583876, 4993841, 1332629, 5998470, 8247297, 2990257, 1867101, 457765, 7233359, 6580576, 3240493, 5663542, 3599050, 3601677, 7769298, 3105617, 2731586, 3539699, 4982563, 6808563, 7569361, 2587665, 2706060, 6345187, 5849639, 1579828, 2595894, 4476336, 1357180, 2768225, 2421296, 1395904, 4937234, 5710473, 6896872, 6663097, 5608354, 809381, 6873817, 5594963, 777210, 2084498, 4443335, 6053371, 3450801, 5553603, 5786359, 7986543, 5123054, 4022443, 6011479, 3016441, 1835313, 5215531, 6549509, 4742837, 7938910, 4717838, 3766318, 8177107, 6797528, 175259, 1599643, 551645, 4713190, 721688, 5859106, 6399876, 6193440, 6299427, 4144029, 2526863, 1434961, 4555731, 6833372, 8099844, 1732741, 1085380, 2075382, 4671992, 1486927, 5218668, 6556290, 4319283, 1302078, 95303, 2981544, 7931050, 3850637, 952340, 8299193, 6088011, 7848068, 1701944, 6875613, 2870173, 4300030, 789594, 937881, 3116187, 1736703, 375352, 3677669, 7170559, 6868731, 182543, 5932015, 6121123, 3824196, 7180225, 5196119, 5944556, 237291, 4137542, 2117420, 516250, 1079461, 2130763, 1822906, 22428, 700735, 565510, 3308379, 989728, 1563260, 3064689, 654281, 1661349, 7308580, 4603594, 2295562, 6527518], -[6315724, 7354088, 7631684, 4709365, 891294, 5617250, 3274359, 6364818, 3120150, 2348412, 7576824, 7110681, 11595, 4283223, 798241, 6091744, 2253617, 4901931, 8092292, 1844897, 3295484, 7230029, 3132955, 1210694, 1338096, 349800, 2476432, 7076900, 7357732, 1221960, 5850286, 8151859, 7121119, 2463251, 3528923, 905021, 1205403, 3212215, 775815, 4487441, 223038, 3859259, 5354973, 52114, 770932, 1329152, 4571328, 2680166, 2041219, 7782574, 1657899, 7287754, 161530, 1284862, 7182907, 2553122, 6415998, 7229045, 7455303, 1983955, 2135628, 4859888, 2982321, 1264569, 2908629, 527544, 6484919, 4698552, 7132052, 6988765, 4819058, 1156119, 2910896, 3919652, 6781155, 8007003, 2736631, 4074487, 2283377, 4198334, 4699961, 3054275, 2416811, 5178581, 8213099, 5284733, 6006769, 4405391, 3110389, 2529453, 2584441, 3237016, 3445878, 3997068, 229628, 993970, 4614156, 1844768, 1960672, 8373200, 2645393, 2011259, 111391, 5603673, 7081080, 2024960, 99629, 1506795, 3663258, 4080501, 6203342, 1923735, 3393479, 4445974, 182650, 4243714, 146397, 7395507, 5059151, 650350, 2179588, 2936454, 5893701, 1779198, 4132023, 7363025, 4566746, 426455, 4218481, 5440985, 734451, 1041198, 528392, 3798157, 7273072, 6403466, 4513103, 2723876, 1038339, 880702, 6473959, 6505814, 1247186, 2558689, 1701360, 2427067, 8125347, 8142512, 8229301, 3494370, 3912595, 4440811, 19278, 7551118, 2262845, 518691, 1133802, 3024407, 3686497, 6059242, 390013, 5216587, 1597934, 4658562, 2025550, 2620226, 2855904, 3835847, 4781044, 1877872, 852372, 2818228, 4584977, 3661598, 5544907, 217809, 7498506, 2768293, 988083, 3227293, 611680, 3619692, 3866227, 5719379, 394011, 6049343, 370637, 6728427, 3021720, 7728815, 8248453, 1485819, 3988055, 761128, 5853379, 7868155, 535324, 1459706, 4770042, 6709068, 1582147, 4483181, 1071650, 655950, 802244, 1062818, 7394890, 2887449, 1230444, 7884773, 4779130, 272539, 1468385, 7479006, 5773159, 7895747, 2516088, 674941, 2675768, 796145, 5454677, 367708, 7442567, 4356721, 871761, 7741086, 4443151, 8145406, 3148550, 1097589, 5403366, 468049, 7706763, 288532, 3222814, 7647432, 3062153, 8291254, 4374027, 7888033, 1846348, 8087128, 4676258, 329247, 4833197, 6427444, 503619, 2718158, 7619821, 2490179, 4944037, 1784082, 2037282, 2905464, 2926953, 2129682], -[4731210, 4771054, 3352283, 7067112, 834035, 214619, 7335764, 3663659, 5761238, 5679014, 202452, 2421445, 3704026, 7901873, 2096480, 6930831, 2506475, 5046226, 6906970, 3201751, 1759491, 5101961, 72905, 2033687, 6968319, 5896655, 127509, 4213820, 1204226, 7116845, 3342066, 2778469, 7870201, 2476139, 4411910, 5165080, 4226671, 1548784, 6394688, 7844767, 1244156, 7962833, 2163621, 1573553, 3656144, 5995758, 3492310, 4390558, 66173, 2385971, 3985283, 2066201, 776432, 2964066, 6867921, 4104861, 6591964, 3560276, 5247492, 67923, 6596706, 6602225, 7192421, 6874645, 2601101, 4402331, 5476912, 4023656, 7790969, 3277340, 8356407, 368135, 7287311, 7278839, 4255826, 3621989, 4228492, 8104177, 3823018, 5515190, 4754819, 7986913, 3895896, 7988486, 750688, 6431827, 7671618, 1802560, 1673078, 1400770, 1907225, 2894396, 2593750, 2292525, 763585, 8073127, 6170549, 3646334, 6090263, 5807161, 5018049, 5221347, 6212183, 8171649, 4376812, 4295671, 723817, 6929809, 693507, 215770, 1690683, 5271279, 4253705, 6032586, 2123084, 2493457, 4932885, 5758074, 5374458, 8280905, 5685876, 2436047, 7140236, 4071315, 1959070, 6022201, 1900314, 6203865, 4949651, 4959698, 4423796, 4892605, 236144, 3158635, 4331731, 2289910, 2030501, 1437036, 2309413, 7764882, 202913, 7798144, 3347434, 5414501, 1816525, 1968448, 1658467, 1375559, 928871, 4091618, 1953942, 7097831, 2643350, 4426525, 137126, 8261564, 2851107, 7277813, 3328397, 4273481, 1353122, 6422914, 143301, 5227750, 1101521, 1655804, 1835013, 7993059, 2652556, 1864907, 6379005, 8297180, 6953154, 3628678, 82252, 3953628, 1875211, 7007058, 2751785, 5971365, 6359793, 5552132, 4080071, 5648907, 5762800, 508642, 7766367, 4533312, 2437571, 2208609, 6033074, 1827877, 4995270, 1572607, 1200472, 6175924, 5975422, 4881397, 4314060, 4863376, 2056138, 5559739, 5639708, 1618266, 4821978, 7344123, 3019208, 970160, 3193961, 7577319, 979268, 698558, 1298892, 6277147, 5463178, 4020213, 8336142, 4702813, 2787020, 7836534, 6834225, 1942570, 2085930, 3477662, 4506377, 2389248, 4212443, 1371756, 3207245, 7423804, 6298822, 1492495, 3723635, 2161699, 2994283, 1373739, 2343353, 4047884, 4532258, 7281376, 1950627, 2825031, 6535924, 1421606, 6769967, 2582819, 6533885, 4996988, 6330781, 5710328, 1239063, 77082, 8373317, 495209, 5567167, 386302], -[733987, 230719, 1436820, 3105951, 6205497, 2133283, 6938566, 1069453, 6255597, 531533, 8003704, 2850404, 5370150, 7679119, 4149910, 8356166, 151816, 5699006, 2767269, 5132474, 8227574, 4592750, 4744407, 7668690, 4761709, 4603614, 5137553, 4539209, 2625297, 3631065, 8091348, 6321142, 7387081, 5234941, 3699135, 1470731, 8130857, 5541512, 2193558, 5999032, 826447, 4297312, 7826579, 3997252, 4140012, 4713429, 2623197, 2015255, 4295613, 2819742, 3348195, 2853287, 3656875, 2505654, 6507732, 1952398, 2809302, 2937737, 3991846, 3441020, 3228765, 693321, 5475, 3478590, 7920134, 155670, 3682289, 6496199, 7416012, 1199554, 1606990, 2692817, 96826, 4792003, 4145173, 7733402, 3499556, 6869208, 4505077, 3920110, 6060549, 2874957, 5422002, 7789978, 5930279, 38443, 1127204, 5669600, 5001393, 5005676, 5717319, 1980049, 6952211, 2291676, 7289091, 6207355, 4925783, 25933, 8344294, 82731, 2079639, 4100048, 3592265, 4441306, 6564270, 6474109, 3520160, 344254, 1028079, 1475455, 7631177, 3616530, 4139470, 1522573, 5779315, 6065664, 6273111, 4578577, 1050710, 7913617, 22279, 6905599, 4205404, 1006898, 6028589, 1417777, 6952521, 4633753, 6661929, 1072824, 7155906, 3363137, 427633, 2600489, 5707219, 500180, 7395749, 5365318, 8185642, 2583821, 1171580, 5136604, 3521230, 2559807, 178547, 1124372, 5336770, 7819033, 606380, 7932049, 7069811, 2587533, 2178249, 4256187, 1726820, 5557507, 5822857, 6988983, 7082220, 6392037, 7616006, 8032111, 2878877, 6955954, 6404467, 5787255, 6025412, 2841503, 5107603, 4065557, 1356992, 2380678, 781306, 4055933, 2146576, 5689173, 2099856, 5431529, 4322167, 5931233, 3381061, 7514134, 4006956, 7900084, 3941475, 2513937, 6786763, 4172090, 1917615, 497639, 5908243, 3507751, 675393, 1393811, 7198147, 3331467, 1205012, 156627, 364734, 5402309, 7810760, 3074589, 7691308, 1687677, 3505668, 119266, 2520707, 7817725, 7668878, 3729883, 5943317, 1843104, 7295425, 7147888, 3943338, 6275750, 4244318, 3789615, 3576087, 2736385, 3341839, 5771715, 5185144, 7206023, 5363347, 2020489, 3027113, 643644, 889214, 3454897, 6857619, 1101234, 1781454, 1478172, 7847782, 3722870, 7978478, 3554660, 720038, 2253480, 6469204, 4427066, 1581570, 4822804, 3112449, 1799383, 2708015, 898308, 6379465, 1245116, 3064916, 356426, 8309601, 7569787, 2772052, 7740418], -[754154, 6695511, 8372662, 2373360, 244098, 3176263, 5785889, 4799551, 3636845, 6735761, 8097297, 4935160, 3824983, 3903990, 1998970, 3955627, 7088855, 4943690, 1568001, 7817595, 804277, 2914685, 2089005, 225065, 124432, 2450407, 2647794, 4340990, 4264202, 8064875, 3791261, 7655388, 7452784, 1301273, 7150250, 6804262, 4267553, 4359909, 1294891, 911819, 7346622, 3389911, 6856516, 7348678, 7029204, 5191423, 2019681, 5808576, 1281645, 2375011, 5911671, 1537761, 1661925, 871945, 4826527, 2220838, 6770496, 2531723, 4954185, 7242624, 7854623, 2749044, 5345462, 2803371, 7094568, 1365206, 3591108, 4935819, 108286, 7916628, 5634729, 1979002, 2077249, 2638313, 5831252, 3572488, 4369324, 5898299, 5227583, 22653, 781952, 7558230, 6897948, 5390206, 6241791, 2460631, 5590923, 5774583, 2376784, 5295922, 8103877, 6626399, 88129, 4430079, 7178471, 3957353, 3833769, 1665330, 5315458, 1576140, 6944650, 417825, 6085110, 6749835, 355456, 2206153, 6071769, 1005031, 2174117, 3539691, 4792761, 879426, 4742711, 6050402, 2769014, 7993897, 2077889, 8352380, 6506161, 1759683, 2577921, 4356006, 2520029, 5192286, 4495792, 3072082, 6149919, 6536525, 6854670, 5623325, 7817437, 346804, 6634637, 7604058, 6904570, 1209755, 5833713, 3825109, 3244115, 6895788, 5207529, 787707, 7722706, 8092061, 24795, 6491114, 4874354, 1960019, 7879357, 6278169, 4074613, 3494560, 4130656, 3126959, 5723556, 4747002, 7921891, 556810, 3816330, 1830439, 3795370, 587279, 1427106, 1772921, 8173944, 1507860, 4762778, 5400150, 7163015, 3139642, 6288127, 6914078, 5244372, 5147140, 4803735, 599895, 7504827, 2037663, 8029339, 5600109, 6820435, 681058, 7342938, 6797209, 1098068, 3926630, 1279659, 1498535, 4269767, 2498206, 4225001, 1131144, 3760106, 5302580, 2550219, 7834920, 7573255, 4761168, 1986542, 3117959, 3487739, 3879836, 5435830, 7330582, 5357785, 27820, 1986969, 7698917, 4404291, 4101946, 29563, 5469339, 349397, 6971467, 6176278, 8144181, 2682162, 4500533, 2614011, 3647541, 6394889, 4580925, 8164432, 3080418, 6499851, 710058, 373753, 356219, 7324678, 2083754, 6750012, 3616354, 629521, 3903633, 7317681, 4212618, 538268, 7778490, 7817553, 7954212, 8331676, 5760826, 2907514, 150621, 7904720, 4951921, 2070979, 6673155, 4410000, 4832337, 5621873, 5020297, 5684588, 7296546, 6422687, 3817361], -[18089, 4147725, 2716887, 5827831, 640946, 5502429, 1946328, 983814, 5997468, 4302149, 2578816, 5267307, 6048047, 4827448, 4482214, 6755951, 2362362, 2166840, 5923149, 2631026, 4077603, 2494491, 4433969, 3361215, 2163877, 6819215, 6109737, 1876041, 2041323, 5927118, 3351039, 727392, 1344754, 6966636, 2631908, 3954699, 4621403, 8294496, 4225740, 731528, 3157337, 5314259, 6132895, 7265655, 4308757, 542037, 706462, 6495848, 7707012, 7820681, 6158962, 3046119, 1184855, 2405644, 6013720, 5116014, 1298567, 4068714, 2206826, 6069031, 5047232, 7130600, 6311214, 5222892, 5073757, 5257714, 3431718, 2485911, 6254603, 6877932, 2657985, 4376356, 8034373, 3335591, 1262696, 2232102, 6799826, 6435943, 4522715, 5498365, 5030240, 1603116, 2815124, 6475350, 1488229, 601391, 7911391, 3431414, 3645548, 2235785, 3103191, 6827019, 5678348, 1345109, 2766087, 6486983, 8118562, 3569350, 2950236, 7183920, 7098835, 2083141, 5633814, 3107375, 32440, 1997634, 5309210, 459021, 5596415, 2300413, 3289478, 4281742, 6347922, 6463677, 268093, 2070248, 5028444, 4632151, 7449235, 1910702, 4560625, 3552168, 4585653, 2784145, 8125473, 7944432, 1729842, 5795682, 3811102, 1276484, 619886, 478758, 7995384, 3199740, 1549113, 5230350, 1326032, 4483632, 109717, 5194557, 5459540, 2020163, 3108033, 1110160, 1491251, 4819947, 7047659, 4845177, 381160, 7506361, 3213591, 7054442, 7380587, 6213274, 2396277, 7529153, 2345272, 6427944, 4476512, 6892387, 4553614, 8342046, 1048981, 5221745, 6818248, 4627882, 7300384, 2440090, 2162035, 6765459, 6798731, 5855553, 5599734, 7220910, 4044362, 5877241, 3845445, 2947320, 6429767, 2554719, 4248516, 308275, 2507982, 4949556, 3319916, 7610938, 7474056, 7161506, 2599375, 2299792, 6974639, 6392687, 6595467, 146745, 6897535, 3164219, 1114225, 4387693, 6146772, 6660280, 8084306, 6640512, 2019732, 5271488, 8035793, 2305708, 3741820, 1912100, 945750, 5359388, 5471310, 7662045, 1808592, 610512, 1441543, 119029, 1080938, 307685, 2500309, 7747445, 3343480, 7341069, 5325691, 7428491, 4269389, 6902137, 5418565, 2996572, 1646733, 383595, 4299606, 7482770, 6918712, 5977396, 1938123, 1365910, 6314865, 4427162, 2461892, 1629012, 7749879, 1967710, 4270079, 2546754, 2681194, 7171807, 683058, 4858729, 5415704, 3018172, 7077154, 4588586, 7448106, 3791893, 1014796, 3736883]] -ct0: [[8352065, 11234, 8375999, 8341752, 8378553, 6922, 8379575, 8373695, 4764, 8371266, 8377810, 9960, 16746, 8365463, 8368640, 15037, 36637, 8377991, 8360965, 8356500, 7581, 7529, 13984, 8375264, 3125, 8379745, 2832, 8369650, 8358958, 9725, 13820, 8355623, 8379132, 8370404, 13139, 8374929, 8378505, 8360003, 16882, 11155, 8365535, 242, 7155, 20646, 13401, 6710, 17491, 8376426, 8366915, 8369454, 8366295, 8376160, 22347, 8357602, 8379278, 14047, 8376623, 18350, 8375016, 8380052, 1455, 8368844, 38432, 8370335, 18010, 8372216, 8368077, 11820, 15611, 15095, 8354547, 34675, 8376987, 8374369, 8373625, 8367085, 8371827, 7776, 8367794, 8360528, 9663, 21524, 15612, 8375139, 8378343, 38945, 14643, 4197, 8352459, 8369565, 13403, 45233, 8364796, 7519, 8365771, 5594, 229, 8369366, 8611, 8365163, 8362156, 8369178, 8364279, 12917, 11799, 15657, 8366972, 4796, 8352244, 6650, 184, 8370071, 8357121, 24182, 875, 9950, 8361968, 8363903, 8372643, 8374906, 2915, 6762, 13556, 8379180, 7582, 1169, 20101, 13195, 8375088, 8364953, 4404, 14294, 13897, 14672, 8364376, 25323, 8377072, 2755, 8378658, 8379730, 10123, 8366406, 8359002, 15703, 8369218, 8355975, 5717, 8380231, 8366493, 8373777, 9685, 8339385, 3911, 8373686, 8333833, 3359, 20411, 12242, 16852, 8331865, 8376417, 37632, 16791, 9985, 8365558, 6098, 10124, 4143, 8368939, 8356810, 8377959, 4404, 8364450, 827, 8358546, 8371535, 8360949, 8344534, 2458, 1755, 11366, 7940, 8377129, 247, 11259, 8375765, 16699, 8367513, 21275, 8361232, 8359466, 22734, 14923, 8376558, 8379009, 13445, 11483, 8348349, 8376539, 29906, 21612, 8346217, 17326, 14818, 3903, 8362834, 8364172, 8353979, 8046, 8377067, 8373251, 8373446, 8309, 2421, 3030, 8352032, 8375417, 67653, 8364590, 8360159, 12464, 19148, 23077, 8347573, 8364201, 5018, 8370911, 7787, 8374243, 2249, 7000, 29255, 8364894, 7902, 7399, 8375431, 8365702, 23701, 8378811, 8379531, 8358226, 27854, 19701, 8365407, 8373434, 29835, 4180, 8377606, 8350572, 11691, 8372008, 28216, 20654, 8375863, 2083, 13350], -[4997, 24605, 8354528, 8332814, 17430, 3943, 2613, 8356685, 8354655, 8364104, 8372115, 8367986, 8372874, 15704, 8352296, 8376312, 13198, 18760, 21827, 19209, 3527, 13291, 7348, 10497, 579, 8368809, 16720, 8913, 8365267, 12808, 508, 4857, 8356488, 8369081, 8370110, 24727, 8367654, 8366360, 8357604, 14041, 21434, 8375517, 8378190, 12896, 8356321, 13902, 14107, 8370502, 8673, 8355709, 8346069, 2204, 19914, 141, 8368404, 1803, 1910, 26788, 8353542, 11387, 8379667, 8356096, 4438, 15724, 7694, 8357408, 8360856, 7175, 8367885, 7544, 8357418, 5048, 4401, 17425, 8361291, 8365401, 26912, 9355, 8359137, 8373815, 8374770, 12053, 2811, 8364028, 8369279, 8373259, 22932, 7241, 8371452, 8369655, 8369096, 8365141, 8370388, 11544, 13282, 8575, 17666, 34739, 8375543, 8354, 8368912, 8379336, 8364300, 309, 8366029, 8374970, 13603, 6042, 8363122, 8364120, 8379646, 4967, 8373317, 2306, 10558, 13037, 8374498, 8369521, 55, 37548, 8374616, 8363967, 3261, 29273, 23871, 8358483, 8347210, 8368951, 8372629, 8349864, 8364003, 8373703, 40424, 8365423, 5545, 5789, 4972, 8351741, 8354309, 10974, 13306, 8363069, 12589, 8367628, 13033, 17624, 8379590, 8371013, 10719, 8509, 4951, 8364499, 13270, 14423, 12961, 8349161, 8371654, 27715, 8367529, 8364386, 22914, 8365575, 31662, 11673, 8376495, 8375569, 11438, 8378842, 8366475, 956, 8371728, 23220, 8372160, 8361457, 21049, 36239, 8348115, 8373619, 1934, 8348811, 8371667, 8371799, 8363513, 8379456, 16260, 2002, 9278, 8359813, 24591, 8356024, 8363683, 40540, 13410, 8374160, 8368093, 41942, 7326, 8358375, 4321, 32171, 8369282, 8371881, 22497, 8373903, 913, 10449, 8371367, 9462, 4859, 8368460, 29423, 8371319, 8378374, 23228, 8367045, 8366640, 16632, 8375881, 8376939, 733, 3919, 10842, 8378332, 8354339, 5434, 14850, 9409, 14673, 1050, 8374359, 18335, 8563, 8374771, 8364962, 14599, 8375530, 8352151, 2423, 15723, 4403, 8349587, 27021, 25846, 24645, 8335621, 8377760, 5742, 8376192, 6348, 3887, 8375624, 9239, 3183, 8373354, 8365815, 3928], -[8378221, 8369934, 3947, 8338150, 8368919, 8373174, 753, 30720, 3301, 12286, 28622, 540, 8368428, 9709, 4007, 8364672, 8355187, 9361, 8374787, 27624, 2115, 8371053, 8347408, 8379122, 8379282, 8344759, 14339, 8378841, 8347580, 8374916, 7467, 8360502, 6938, 22291, 528, 11792, 25825, 8353617, 166, 432, 7273, 8368237, 8362781, 10431, 22633, 8367796, 8375992, 422, 34695, 9219, 4285, 8359127, 8378946, 8377054, 8359543, 8371138, 20859, 6833, 8363754, 8366494, 17375, 8360334, 8376525, 8336301, 8344705, 6980, 8379735, 8370194, 8357382, 4417, 10577, 15931, 8357083, 6432, 31194, 8365812, 5918, 11378, 8344, 14908, 8358581, 8367498, 8376464, 17438, 5231, 8366321, 8356562, 18159, 8376240, 8371978, 8359619, 11368, 8375903, 18809, 8357371, 7289, 2932, 1231, 5831, 8371717, 8365420, 8369352, 8353751, 14382, 4600, 5209, 8374138, 8376372, 8059, 4998, 8362997, 4973, 21988, 16446, 8351507, 13437, 21390, 8376564, 16743, 8368297, 1020, 8344974, 3460, 8367782, 3359, 32654, 8367483, 8361110, 23224, 8352669, 8378304, 8369669, 8378169, 5329, 2249, 8370483, 8354193, 8365187, 17311, 8379162, 8371728, 48968, 11997, 8335432, 24405, 26946, 8435, 12647, 8373474, 8378410, 16690, 4869, 60, 481, 5345, 30012, 221, 8366780, 8365955, 8378580, 2923, 16495, 4986, 15200, 8361548, 8378877, 39104, 10704, 8368036, 18284, 8357085, 8369870, 25564, 8363409, 8373015, 5472, 11784, 8369257, 8375073, 8374152, 4551, 2229, 12708, 35949, 8379085, 9755, 649, 8369497, 22583, 8366051, 20942, 31320, 18486, 8371011, 8368727, 8365104, 8374837, 8369516, 8376410, 8335284, 26666, 8377898, 35868, 3285, 8369606, 13227, 8377369, 4979, 14443, 6745, 8363818, 8373239, 13411, 8362857, 14884, 4101, 12427, 6547, 30518, 18054, 13209, 8370525, 8362327, 2947, 1384, 8363712, 2362, 8367299, 8363577, 4050, 8374488, 11570, 8346975, 8377500, 8363343, 17886, 8355848, 6703, 8355460, 8366698, 8376957, 15980, 14059, 20642, 20362, 806, 8374079, 7906, 8376262, 12498, 8375456, 10896, 8375264, 56, 8369542, 8369440], -[8358998, 8374460, 23095, 8372778, 8350324, 8372276, 8372678, 11765, 8356729, 8354456, 8342075, 11969, 8367207, 8832, 8360949, 8374756, 18837, 8379872, 15031, 34746, 4576, 18157, 8363297, 8375243, 8372433, 19965, 8378276, 2251, 8370904, 8376615, 15752, 8358161, 8369143, 8352893, 8376176, 10700, 8355785, 8365839, 5268, 8366916, 8372403, 8379046, 1374, 4661, 8358843, 17303, 8373411, 8372100, 8369812, 8362224, 18577, 6178, 8363718, 3701, 15421, 13086, 8375992, 8913, 8367971, 32062, 109, 8334959, 12053, 8182, 4582, 8377389, 8379982, 8376363, 1989, 7200, 2642, 8365592, 8369464, 14975, 8375214, 8356925, 8380391, 19008, 31289, 8356940, 8379084, 15572, 1554, 16461, 8379370, 8363752, 8697, 8761, 17698, 27099, 4512, 8376613, 8358447, 18709, 8379567, 13330, 2094, 8366889, 8369832, 8376969, 6865, 11757, 8360924, 8359458, 4118, 6268, 26872, 8347816, 8372661, 17222, 11529, 8370051, 8363617, 15177, 20180, 13778, 32566, 8359095, 18942, 8279, 19873, 8373706, 8353196, 8380163, 11801, 12082, 12094, 8366544, 8377106, 1604, 11304, 8373096, 8376716, 6299, 26078, 8370546, 13983, 8379683, 15357, 23070, 8372249, 140, 15481, 8372980, 8366391, 5696, 8371511, 17729, 8363581, 8376744, 8366427, 16275, 14190, 8377465, 8367668, 8376667, 8372268, 13853, 2752, 8376706, 8350194, 31012, 8369507, 10054, 18610, 28325, 10832, 8355152, 6350, 15435, 8362795, 17075, 15483, 8360983, 3268, 8378550, 6808, 22044, 8378556, 8360248, 8351601, 2624, 8367045, 12124, 8360779, 35242, 4692, 12041, 8371852, 15468, 42283, 23984, 8375998, 20443, 8852, 8364965, 17692, 8373115, 8379272, 18266, 8361758, 1984, 8362275, 8367351, 21234, 11162, 8366978, 1880, 13120, 8371984, 5986, 8356582, 8380054, 26582, 8262, 15025, 8341687, 12438, 34901, 668, 8375947, 3785, 8373960, 5501, 8378704, 8379916, 8363552, 18482, 34044, 5696, 8350048, 8375873, 25069, 8368825, 8376938, 17709, 8358515, 26400, 8359738, 7334, 19264, 11677, 946, 6095, 8374787, 8378572, 14569, 8348360, 8374688, 2393, 8370786, 8376759, 32568, 12523, 16797, 8357256], -[3392, 25473, 8347605, 11687, 8356349, 29438, 8364685, 8360038, 22734, 18260, 8361007, 2048, 4038, 24733, 6710, 8375744, 8348524, 21335, 8475, 8354011, 8375271, 10066, 14311, 8350506, 8361823, 8362858, 27432, 8370112, 8373269, 26108, 8360560, 38546, 27288, 8374042, 12764, 22258, 5388, 8367023, 1433, 1850, 8375699, 8352629, 8358835, 8338838, 8377351, 8360303, 8364034, 8374148, 2736, 8376987, 1406, 28931, 32691, 8368160, 8363045, 8373898, 16612, 1800, 8355501, 40646, 8379886, 2428, 20200, 8346916, 20635, 29526, 8364737, 8352461, 8380265, 8363832, 22740, 5942, 8376988, 12704, 16220, 8373186, 106, 8371067, 3407, 8354161, 8377083, 8369114, 2298, 16369, 8369180, 6573, 8378274, 8372810, 12251, 8372563, 28452, 8367116, 17438, 604, 8377176, 8362937, 4463, 5181, 8380382, 8371087, 2429, 1807, 16950, 4024, 8368196, 8350724, 19081, 13135, 8360038, 8369598, 26876, 29136, 8380245, 8358333, 8369920, 14049, 22763, 8346337, 8376055, 8374857, 8371687, 8379956, 8359391, 31574, 14047, 8375608, 27180, 5081, 16901, 20620, 2078, 8370809, 4386, 8369109, 8374208, 8357862, 8365917, 15488, 8328437, 31101, 30665, 8373735, 8325800, 15577, 9993, 4532, 2943, 8373943, 19426, 8369017, 8354304, 24469, 8359412, 14306, 8373288, 8368881, 8359525, 14957, 8378292, 8374360, 8368206, 4528, 8366671, 40, 8379564, 36416, 8367732, 8363842, 8343985, 3582, 1408, 8371646, 6571, 8375526, 8375632, 15831, 8354114, 1924, 37767, 15635, 8342224, 5299, 26765, 30363, 8369394, 8360415, 8376308, 46882, 3389, 8362820, 6810, 174, 8378756, 3285, 8366646, 8360492, 6861, 1812, 8367480, 25181, 16489, 8355816, 8361466, 8369642, 30627, 10283, 8371002, 8378407, 7938, 8373168, 8365484, 5167, 8345247, 3777, 4445, 8361207, 8376957, 5657, 1539, 25282, 8377046, 392, 7803, 8371827, 10468, 23611, 8340852, 8361131, 23160, 8848, 32214, 8361859, 8377182, 14916, 21140, 8379066, 8373546, 8374001, 14191, 20040, 8376694, 7066, 34733, 8366980, 8376900, 8376268, 7110, 6581, 8358354, 8361587, 21591, 8356320, 16157, 8361125, 12101, 185], -[2134, 8355348, 17721, 9694, 29213, 43685, 4838, 8354709, 8375621, 8370910, 8376779, 8342477, 8379591, 8352488, 22678, 8371153, 615, 4605, 17846, 2630, 8354023, 9940, 8369561, 8347402, 18207, 5514, 762, 8378465, 1173, 13213, 15970, 14051, 8370083, 20364, 8358438, 14423, 5200, 8339761, 8504, 8866, 8365984, 8367316, 3891, 22518, 8344687, 8350353, 8371493, 6268, 8361035, 8360972, 5115, 6115, 21494, 12338, 2433, 27128, 8366655, 8373688, 8358970, 22418, 579, 8368562, 8357982, 18029, 9807, 8363079, 8367759, 8369616, 16411, 9645, 8377343, 8366326, 8363358, 7112, 8372155, 8357804, 2574, 18335, 16132, 18299, 8376394, 8367124, 8245, 3267, 8352832, 15251, 4152, 8377313, 8365645, 3867, 8364968, 8368253, 8373858, 8370778, 2718, 8369098, 13561, 6208, 7047, 25042, 8367510, 8369345, 7878, 12886, 8375217, 9985, 970, 106, 8355993, 27543, 8378228, 6311, 8376772, 1193, 3547, 8362300, 8379877, 8378800, 8370206, 8364831, 16693, 27259, 8353191, 8376478, 8374636, 678, 11380, 19647, 8368043, 34162, 63, 26742, 3051, 8372579, 8368545, 8362209, 6645, 16103, 21846, 8372112, 14652, 8366152, 8363118, 18561, 6190, 8366038, 4105, 8362960, 27201, 7024, 2126, 8354017, 8379806, 8364439, 9911, 563, 6996, 8375455, 8366268, 8375851, 8366945, 8358564, 39819, 8350012, 8346310, 8379714, 13269, 5045, 8360503, 8366440, 8373865, 18670, 5456, 29092, 16876, 8362253, 8376417, 31071, 5310, 8363344, 8371911, 8368572, 6359, 8368441, 389, 2290, 8370738, 8348395, 8369469, 30924, 32631, 1759, 8355913, 8377316, 3707, 4873, 8362742, 14461, 1748, 8378620, 8377462, 17298, 8367015, 8359786, 8374293, 8373300, 7628, 14253, 23611, 8353087, 8361123, 6501, 7268, 8374545, 8371333, 3919, 20316, 8359831, 8377830, 31027, 8365783, 8358202, 8370706, 126, 8370745, 30898, 8370982, 8369208, 12798, 8378118, 8374149, 8380246, 5131, 8110, 8377766, 11483, 3334, 18393, 8377118, 8341040, 8380331, 7690, 8374703, 8371916, 8377366, 3513, 8354384, 10827, 8373879, 18188, 4823, 8353098, 8377649, 6348, 2677, 6506]] --ct0: [[28352, 8369183, 4418, 38665, 1864, 8373495, 842, 6722, 8375653, 9151, 2607, 8370457, 8363671, 14954, 11777, 8365380, 8343780, 2426, 19452, 23917, 8372836, 8372888, 8366433, 5153, 8377292, 672, 8377585, 10767, 21459, 8370692, 8366597, 24794, 1285, 10013, 8367278, 5488, 1912, 20414, 8363535, 8369262, 14882, 8380175, 8373262, 8359771, 8367016, 8373707, 8362926, 3991, 13502, 10963, 14122, 4257, 8358070, 22815, 1139, 8366370, 3794, 8362067, 5401, 365, 8378962, 11573, 8341985, 10082, 8362407, 8201, 12340, 8368597, 8364806, 8365322, 25870, 8345742, 3430, 6048, 6792, 13332, 8590, 8372641, 12623, 19889, 8370754, 8358893, 8364805, 5278, 2074, 8341472, 8365774, 8376220, 27958, 10852, 8367014, 8335184, 15621, 8372898, 14646, 8374823, 8380188, 11051, 8371806, 15254, 18261, 11239, 16138, 8367500, 8368618, 8364760, 13445, 8375621, 28173, 8373767, 8380233, 10346, 23296, 8356235, 8379542, 8370467, 18449, 16514, 7774, 5511, 8377502, 8373655, 8366861, 1237, 8372835, 8379248, 8360316, 8367222, 5329, 15464, 8376013, 8366123, 8366520, 8365745, 16041, 8355094, 3345, 8377662, 1759, 687, 8370294, 14011, 21415, 8364714, 11199, 24442, 8374700, 186, 13924, 6640, 8370732, 41032, 8376506, 6731, 46584, 8377058, 8360006, 8368175, 8363565, 48552, 4000, 8342785, 8363626, 8370432, 14859, 8374319, 8370293, 8376274, 11478, 23607, 2458, 8376013, 15967, 8379590, 21871, 8882, 19468, 35883, 8377959, 8378662, 8369051, 8372477, 3288, 8380170, 8369158, 4652, 8363718, 12904, 8359142, 19185, 20951, 8357683, 8365494, 3859, 1408, 8366972, 8368934, 32068, 3878, 8350511, 8358805, 34200, 8363091, 8365599, 8376514, 17583, 16245, 26438, 8372371, 3350, 7166, 6971, 8372108, 8377996, 8377387, 28385, 5000, 8312764, 15827, 20258, 8367953, 8361269, 8357340, 32844, 16216, 8375399, 9506, 8372630, 6174, 8378168, 8373417, 8351162, 15523, 8372515, 8373018, 4986, 14715, 8356716, 1606, 886, 22191, 8352563, 8360716, 15010, 6983, 8350582, 8376237, 2811, 29845, 8368726, 8409, 8352201, 8359763, 4554, 8378334, 8367067], -[8375420, 8355812, 25889, 47603, 8362987, 8376474, 8377804, 23732, 25762, 16313, 8302, 12431, 7543, 8364713, 28121, 4105, 8367219, 8361657, 8358590, 8361208, 8376890, 8367126, 8373069, 8369920, 8379838, 11608, 8363697, 8371504, 15150, 8367609, 8379909, 8375560, 23929, 11336, 10307, 8355690, 12763, 14057, 22813, 8366376, 8358983, 4900, 2227, 8367521, 24096, 8366515, 8366310, 9915, 8371744, 24708, 34348, 8378213, 8360503, 8380276, 12013, 8378614, 8378507, 8353629, 26875, 8369030, 750, 24321, 8375979, 8364693, 8372723, 23009, 19561, 8373242, 12532, 8372873, 22999, 8375369, 8376016, 8362992, 19126, 15016, 8353505, 8371062, 21280, 6602, 5647, 8368364, 8377606, 16389, 11138, 7158, 8357485, 8373176, 8965, 10762, 11321, 15276, 10029, 8368873, 8367135, 8371842, 8362751, 8345678, 4874, 8372063, 11505, 1081, 16117, 8380108, 14388, 5447, 8366814, 8374375, 17295, 16297, 771, 8375450, 7100, 8378111, 8369859, 8367380, 5919, 10896, 8380362, 8342869, 5801, 16450, 8377156, 8351144, 8356546, 21934, 33207, 11466, 7788, 30553, 16414, 6714, 8339993, 14994, 8374872, 8374628, 8375445, 28676, 26108, 8369443, 8367111, 17348, 8367828, 12789, 8367384, 8362793, 827, 9404, 8369698, 8371908, 8375466, 15918, 8367147, 8365994, 8367456, 31256, 8763, 8352702, 12888, 16031, 8357503, 14842, 8348755, 8368744, 3922, 4848, 8368979, 1575, 13942, 8379461, 8689, 8357197, 8257, 18960, 8359368, 8344178, 32302, 6798, 8378483, 31606, 8750, 8618, 16904, 961, 8364157, 8378415, 8371139, 20604, 8355826, 24393, 16734, 8339877, 8367007, 6257, 12324, 8338475, 8373091, 22042, 8376096, 8348246, 11135, 8536, 8357920, 6514, 8379504, 8369968, 9050, 8370955, 8375558, 11957, 8350994, 9098, 2043, 8357189, 13372, 13777, 8363785, 4536, 3478, 8379684, 8376498, 8369575, 2085, 26078, 8374983, 8365567, 8371008, 8365744, 8379367, 6058, 8362082, 8371854, 5646, 15455, 8365818, 4887, 28266, 8377994, 8364694, 8376014, 30830, 8353396, 8354571, 8355772, 44796, 2657, 8374675, 4225, 8374069, 8376530, 4793, 8371178, 8377234, 7063, 14602, 8376489], -[2196, 10483, 8376470, 42267, 11498, 7243, 8379664, 8349697, 8377116, 8368131, 8351795, 8379877, 11989, 8370708, 8376410, 15745, 25230, 8371056, 5630, 8352793, 8378302, 9364, 33009, 1295, 1135, 35658, 8366078, 1576, 32837, 5501, 8372950, 19915, 8373479, 8358126, 8379889, 8368625, 8354592, 26800, 8380251, 8379985, 8373144, 12180, 17636, 8369986, 8357784, 12621, 4425, 8379995, 8345722, 8371198, 8376132, 21290, 1471, 3363, 20874, 9279, 8359558, 8373584, 16663, 13923, 8363042, 20083, 3892, 44116, 35712, 8373437, 682, 10223, 23035, 8376000, 8369840, 8364486, 23334, 8373985, 8349223, 14605, 8374499, 8369039, 8372073, 8365509, 21836, 12919, 3953, 8362979, 8375186, 14096, 23855, 8362258, 4177, 8439, 20798, 8369049, 4514, 8361608, 23046, 8373128, 8377485, 8379186, 8374586, 8700, 14997, 11065, 26666, 8366035, 8375817, 8375208, 6279, 4045, 8372358, 8375419, 17420, 8375444, 8358429, 8363971, 28910, 8366980, 8359027, 3853, 8363674, 12120, 8379397, 35443, 8376957, 12635, 8377058, 8347763, 12934, 19307, 8357193, 27748, 2113, 10748, 2248, 8375088, 8378168, 9934, 26224, 15230, 8363106, 1255, 8689, 8331449, 8368420, 44985, 8356012, 8353471, 8371982, 8367770, 6943, 2007, 8363727, 8375548, 8380357, 8379936, 8375072, 8350405, 8380196, 13637, 14462, 1837, 8377494, 8363922, 8375431, 8365217, 18869, 1540, 8341313, 8369713, 12381, 8362133, 23332, 10547, 8354853, 17008, 7402, 8374945, 8368633, 11160, 5344, 6265, 8375866, 8378188, 8367709, 8344468, 1332, 8370662, 8379768, 10920, 8357834, 14366, 8359475, 8349097, 8361931, 9406, 11690, 15313, 5580, 10901, 4007, 45133, 8353751, 2519, 8344549, 8377132, 10811, 8367190, 3048, 8375438, 8365974, 8373672, 16599, 7178, 8367006, 17560, 8365533, 8376316, 8367990, 8373870, 8349899, 8362363, 8367208, 9892, 18090, 8377470, 8379033, 16705, 8378055, 13118, 16840, 8376367, 5929, 8368847, 33442, 2917, 17074, 8362531, 24569, 8373714, 24957, 13719, 3460, 8364437, 8366358, 8359775, 8360055, 8379611, 6338, 8372511, 4155, 8367919, 4961, 8369521, 5153, 8380361, 10875, 10977], -[21419, 5957, 8357322, 7639, 30093, 8141, 7739, 8368652, 23688, 25961, 38342, 8368448, 13210, 8371585, 19468, 5661, 8361580, 545, 8365386, 8345671, 8375841, 8362260, 17120, 5174, 7984, 8360452, 2141, 8378166, 9513, 3802, 8364665, 22256, 11274, 27524, 4241, 8369717, 24632, 14578, 8375149, 13501, 8014, 1371, 8379043, 8375756, 21574, 8363114, 7006, 8317, 10605, 18193, 8361840, 8374239, 16699, 8376716, 8364996, 8367331, 4425, 8371504, 12446, 8348355, 8380308, 45458, 8368364, 8372235, 8375835, 3028, 435, 4054, 8378428, 8373217, 8377775, 14825, 10953, 8365442, 5203, 23492, 26, 8361409, 8349128, 23477, 1333, 8364845, 8378863, 8363956, 1047, 16665, 8371720, 8371656, 8362719, 8353318, 8375905, 3804, 21970, 8361708, 850, 8367087, 8378323, 13528, 10585, 3448, 8373552, 8368660, 19493, 20959, 8376299, 8374149, 8353545, 32601, 7756, 8363195, 8368888, 10366, 16800, 8365240, 8360237, 8366639, 8347851, 21322, 8361475, 8372138, 8360544, 6711, 27221, 254, 8368616, 8368335, 8368323, 13873, 3311, 8378813, 8369113, 7321, 3701, 8374118, 8354339, 9871, 8366434, 734, 8365060, 8357347, 8168, 8380277, 8364936, 7437, 14026, 8374721, 8906, 8362688, 16836, 3673, 13990, 8364142, 8366227, 2952, 12749, 3750, 8149, 8366564, 8377665, 3711, 30223, 8349405, 10910, 8370363, 8361807, 8352092, 8369585, 25265, 8374067, 8364982, 17622, 8363342, 8364934, 19434, 8377149, 1867, 8373609, 8358373, 1861, 20169, 28816, 8377793, 13372, 8368293, 19638, 8345175, 8375725, 8368376, 8565, 8364949, 8338134, 8356433, 4419, 8359974, 8371565, 15452, 8362725, 7302, 1145, 8362151, 18659, 8378433, 18142, 13066, 8359183, 8369255, 13439, 8378537, 8367297, 8433, 8374431, 23835, 363, 8353835, 8372155, 8365392, 38730, 8367979, 8345516, 8379749, 4470, 8376632, 6457, 8374916, 1713, 501, 16865, 8361935, 8346373, 8374721, 30369, 4544, 8355348, 11592, 3479, 8362708, 21902, 8354017, 20679, 8373083, 8361153, 8368740, 8379471, 8374322, 5630, 1845, 8365848, 32057, 5729, 8378024, 9631, 3658, 8347849, 8367894, 8363620, 23161], -[8377025, 8354944, 32812, 8368730, 24068, 8350979, 15732, 20379, 8357683, 8362157, 19410, 8378369, 8376379, 8355684, 8373707, 4673, 31893, 8359082, 8371942, 26406, 5146, 8370351, 8366106, 29911, 18594, 17559, 8352985, 10305, 7148, 8354309, 19857, 8341871, 8353129, 6375, 8367653, 8358159, 8375029, 13394, 8378984, 8378567, 4718, 27788, 21582, 41579, 3066, 20114, 16383, 6269, 8377681, 3430, 8379011, 8351486, 8347726, 12257, 17372, 6519, 8363805, 8378617, 24916, 8339771, 531, 8377989, 8360217, 33501, 8359782, 8350891, 15680, 27956, 152, 16585, 8357677, 8374475, 3429, 8367713, 8364197, 7231, 8380311, 9350, 8377010, 26256, 3334, 11303, 8378119, 8364048, 11237, 8373844, 2143, 7607, 8368166, 7854, 8351965, 13301, 8362979, 8379813, 3241, 17480, 8375954, 8375236, 35, 9330, 8377988, 8378610, 8363467, 8376393, 12221, 29693, 8361336, 8367282, 20379, 10819, 8353541, 8351281, 172, 22084, 10497, 8366368, 8357654, 34080, 4362, 5560, 8730, 461, 21026, 8348843, 8366370, 4809, 8353237, 8375336, 8363516, 8359797, 8378339, 9608, 8376031, 11308, 6209, 22555, 14500, 8364929, 51980, 8349316, 8349752, 6682, 54617, 8364840, 8370424, 8375885, 8377474, 6474, 8360991, 11400, 26113, 8355948, 21005, 8366111, 7129, 11536, 20892, 8365460, 2125, 6057, 12211, 8375889, 13746, 8380377, 853, 8344001, 12685, 16575, 36432, 8376835, 8379009, 8771, 8373846, 4891, 4785, 8364586, 26303, 8378493, 8342650, 8364782, 38193, 8375118, 8353652, 8350054, 11023, 20002, 4109, 8333535, 8377028, 17597, 8373607, 8380243, 1661, 8377132, 13771, 19925, 8373556, 8378605, 12937, 8355236, 8363928, 24601, 18951, 10775, 8349790, 8370134, 9415, 2010, 8372479, 7249, 14933, 8375250, 35170, 8376640, 8375972, 19210, 3460, 8374760, 8378878, 8355135, 3371, 8380025, 8372614, 8590, 8369949, 8356806, 39565, 19286, 8357257, 8371569, 8348203, 18558, 3235, 8365501, 8359277, 1351, 6871, 6416, 8366226, 8360377, 3723, 8373351, 8345684, 13437, 3517, 4149, 8373307, 8373836, 22063, 18830, 8358826, 24097, 8364260, 19292, 8368316, 8380232], -[8378283, 25069, 8362696, 8370723, 8351204, 8336732, 8375579, 25708, 4796, 9507, 3638, 37940, 826, 27929, 8357739, 9264, 8379802, 8375812, 8362571, 8377787, 26394, 8370477, 10856, 33015, 8362210, 8374903, 8379655, 1952, 8379244, 8367204, 8364447, 8366366, 10334, 8360053, 21979, 8365994, 8375217, 40656, 8371913, 8371551, 14433, 13101, 8376526, 8357899, 35730, 30064, 8924, 8374149, 19382, 19445, 8375302, 8374302, 8358923, 8368079, 8377984, 8353289, 13762, 6729, 21447, 8357999, 8379838, 11855, 22435, 8362388, 8370610, 17338, 12658, 10801, 8364006, 8370772, 3074, 14091, 17059, 8373305, 8262, 22613, 8377843, 8362082, 8364285, 8362118, 4023, 13293, 8372172, 8377150, 27585, 8365166, 8376265, 3104, 14772, 8376550, 15449, 12164, 6559, 9639, 8377699, 11319, 8366856, 8374209, 8373370, 8355375, 12907, 11072, 8372539, 8367531, 5200, 8370432, 8379447, 8380311, 24424, 8352874, 2189, 8374106, 3645, 8379224, 8376870, 18117, 540, 1617, 10211, 15586, 8363724, 8353158, 27226, 3939, 5781, 8379739, 8369037, 8360770, 12374, 8346255, 8380354, 8353675, 8377366, 7838, 11872, 18208, 8373772, 8364314, 8358571, 8305, 8365765, 14265, 17299, 8361856, 8374227, 14379, 8376312, 17457, 8353216, 8373393, 8378291, 26400, 611, 15978, 8370506, 8379854, 8373421, 4962, 14149, 4566, 13472, 21853, 8340598, 30405, 34107, 703, 8367148, 8375372, 19914, 13977, 6552, 8361747, 8374961, 8351325, 8363541, 18164, 4000, 8349346, 8375107, 17073, 8506, 11845, 8374058, 11976, 8380028, 8378127, 9679, 32022, 10948, 8349493, 8347786, 8378658, 24504, 3101, 8376710, 8375544, 17675, 8365956, 8378669, 1797, 2955, 8363119, 13402, 20631, 6124, 7117, 8372789, 8366164, 8356806, 27330, 19294, 8373916, 8373149, 5872, 9084, 8376498, 8360101, 20586, 2587, 8349390, 14634, 22215, 9711, 8380291, 9672, 8349519, 9435, 11209, 8367619, 2299, 6268, 171, 8375286, 8372307, 2651, 8368934, 8377083, 8362024, 3299, 39377, 86, 8372727, 5714, 8501, 3051, 8376904, 26033, 8369590, 6538, 8362229, 8375594, 27319, 2768, 8374069, 8377740, 8373911]] -w - cs2 + ct0: [[3532221, 59097, 5284177, 8161970, 832974, 7180295, 1228804, 1206249, 5818789, 7963546, 863132, 2715835, 6983789, 1155026, 6287390, 2245947, 5783668, 966135, 6999369, 3939401, 2948031, 3304954, 485050, 6810874, 6540474, 2509385, 806574, 5466937, 4332542, 1789385, 3430720, 7770313, 350899, 5288690, 1089085, 2865532, 8290940, 7037010, 4618451, 2199417, 5560470, 7510909, 7562381, 1353362, 4522222, 8105159, 1412178, 1971627, 6932457, 1591383, 7803548, 2951455, 292260, 1891577, 4587938, 5951367, 1661450, 891877, 5315628, 4612735, 6432316, 2874146, 7178732, 7579346, 21628, 6672971, 6689686, 6125627, 1981674, 6092066, 3682322, 312560, 4250120, 2809972, 598290, 904214, 4848800, 3261012, 8202872, 6506015, 1676740, 6844416, 4358361, 2265560, 5888187, 7000913, 6633764, 6503605, 4692222, 1518347, 7940846, 249028, 3747006, 4122266, 3421300, 1716768, 6593916, 7399830, 175908, 2230838, 264775, 4525178, 6339525, 4562312, 6506929, 4093819, 2088158, 1422229, 411017, 7217429, 3215993, 6013952, 7356720, 1190001, 1602393, 3804299, 5639380, 2951227, 1974457, 5113731, 6612598, 5835422, 3441374, 6012745, 6646418, 5223610, 5320469, 3921206, 2161234, 6199162, 8328894, 661679, 4118062, 7183632, 5831181, 2820330, 2003308, 1622237, 4191955, 5401783, 6326845, 4014329, 189785, 825031, 6506297, 4142223, 25716, 4348437, 1663787, 7592231, 5989794, 4418690, 6005462, 3522484, 8042780, 5138676, 6458913, 1979333, 5304579, 5243574, 5048017, 1140791, 6157311, 5958507, 5980618, 12428, 1086235, 5089154, 467340, 4160952, 3750027, 2199564, 379891, 4020635, 5038236, 4639790, 2058265, 6647091, 6248762, 5969975, 6511280, 6016302, 1492281, 596706, 1151244, 5191013, 1612873, 7677473, 7153615, 8096227, 7219562, 8119288, 4039231, 8280488, 4748512, 1430879, 2619678, 7221034, 2981594, 251400, 5334339, 7795061, 4659897, 2935441, 1447945, 5749858, 5552131, 4462286, 5359524, 3184859, 5595965, 7886584, 482546, 361660, 1215106, 7945549, 7571468, 3981166, 1807180, 2682092, 3049293, 6129820, 1425943, 6655315, 3709268, 3386918, 2529782, 3229617, 4681478, 1137871, 4837875, 2548058, 8152784, 2937952, 351730, 7420823, 5957768, 3288055, 7273272, 6059781, 1803068, 2513327, 954758, 3186031, 7073133, 1341029, 5347970, 4195214, 7639129, 5201722, 3265965, 3392797, 958485, 4626083, 4107406, 1979066], -[6966640, 3509306, 2454097, 1401751, 8030914, 4841754, 7808111, 2813243, 1383124, 7976851, 3692089, 1073939, 2074973, 4739689, 2996882, 1580299, 5099934, 6553172, 6684397, 6705619, 3873787, 4691246, 4144172, 8280645, 879835, 3658646, 8362557, 345503, 7952599, 7739329, 3616715, 4055273, 1752364, 5569328, 4420426, 3424590, 265723, 333161, 7448691, 4604218, 2273516, 3606333, 2807207, 3188272, 6455870, 4001001, 1689365, 5660231, 1798686, 7042907, 3117244, 5533447, 2174973, 5858513, 2881876, 5919755, 6397384, 4017809, 8296655, 3437762, 3985412, 4228209, 4495438, 2608447, 7121168, 2959481, 5628134, 5152913, 8249078, 6929326, 7488829, 2452118, 878327, 3741417, 2693847, 2938510, 7665139, 7073828, 3500541, 3650572, 323351, 5498099, 1216919, 6368386, 1038834, 6332172, 7037907, 1327603, 222043, 4565906, 30578, 5573047, 7883677, 2960421, 7494016, 5668866, 2302626, 3481517, 6260979, 657693, 1266600, 172787, 3024927, 20285, 4398671, 6917548, 6602832, 3285318, 4164806, 8026742, 5822703, 3342803, 2385953, 5528959, 4789789, 1648001, 7676984, 7301358, 2261575, 3638074, 875268, 5040715, 5251477, 3459297, 4989140, 1467653, 4348457, 5678295, 4404588, 4949541, 6177873, 2557195, 1681454, 6180346, 8171476, 7872347, 2244203, 3267105, 6479092, 5612497, 3788934, 500958, 1068722, 2862627, 5904867, 6816102, 7791326, 5878484, 975612, 3262165, 4991004, 7792169, 7481198, 5639440, 6247234, 1792148, 2331479, 5864034, 2128021, 4331427, 5171449, 3472875, 622666, 4613175, 1610167, 234358, 3494190, 5561430, 496992, 1284442, 8338526, 2516648, 7061815, 6423894, 4922824, 5976364, 5363686, 2329850, 2850915, 3620594, 2056541, 2785624, 5174592, 4545015, 3667479, 533369, 2347870, 874144, 6945041, 4879237, 1388992, 6765348, 5200706, 5778185, 4160076, 4990116, 3361790, 7590586, 2510517, 5635540, 6702288, 2726708, 4902254, 7633506, 2425088, 5175428, 2717372, 2904177, 3487871, 1219435, 3973369, 7393231, 6949235, 7291792, 5569168, 4300903, 3432327, 1884441, 8169181, 6682098, 8337229, 4997375, 8061187, 3412408, 2856466, 7710951, 6705488, 7125832, 5787752, 2014033, 4006661, 7004924, 6648082, 4728258, 1959318, 6252987, 3180122, 5764435, 425371, 5818987, 4809920, 4998655, 2853818, 1152877, 5813142, 7298739, 6455253, 5453852, 903416, 4579255, 1210586, 2194911, 2754743, 146768, 1113057, 35543], -[5094171, 411551, 3173986, 6433760, 5899851, 7979477, 2113967, 7694596, 2068699, 7866744, 7840844, 3611605, 2667437, 4533174, 3717966, 4490135, 901754, 157078, 2920022, 1688134, 1017644, 645547, 171279, 2972956, 188690, 2505022, 5874966, 1292215, 2276615, 5943418, 6666436, 1269307, 3607031, 1862280, 744702, 1956960, 4074317, 3635509, 8102858, 1125776, 4671953, 6453458, 8288845, 1428843, 3889499, 2237738, 7505382, 4039368, 2924268, 2160186, 1861596, 4781659, 3316537, 4126441, 3763704, 2907616, 5258868, 486288, 5900446, 2211285, 3345273, 2297952, 6640642, 5171919, 909955, 1391110, 622713, 3536984, 2177757, 5786709, 5897903, 5809619, 553024, 1967064, 4190406, 5819175, 3701222, 3527025, 5777640, 5686944, 6345133, 5431202, 4357417, 8138765, 275050, 5864478, 2155664, 4824900, 4722571, 3878684, 6231772, 2774833, 7282704, 8258517, 5309675, 7474320, 1534026, 310335, 2831683, 4854263, 6851222, 4259886, 2159200, 1128713, 6908282, 8194895, 8055099, 2552369, 7384198, 3706592, 6666598, 6063201, 3694782, 4131971, 4723086, 159353, 6334540, 2528935, 7561478, 6275658, 6779126, 7041185, 7960863, 8004529, 2391014, 1194717, 6460899, 545550, 2170381, 7219842, 4322417, 3475926, 8347177, 47621, 6533321, 3807588, 1568043, 6217782, 4689940, 4736485, 6528552, 6014036, 3120606, 8089576, 4011488, 5043824, 4921118, 6641848, 1640682, 4204016, 1220325, 7872471, 7595588, 7534048, 7096202, 1625720, 3325830, 2421405, 5363121, 3422374, 6629164, 5114250, 5889202, 5166753, 3224599, 6760837, 4111725, 7778945, 3315533, 2859554, 4988403, 1519822, 2279173, 4276672, 2977212, 7188599, 2312297, 6761938, 7423965, 4734001, 4455690, 2603045, 4866385, 8374832, 4607764, 8237769, 696230, 1001306, 6359792, 154848, 7847328, 48363, 7347758, 6898723, 5145232, 2652740, 6819772, 4407567, 1382993, 4233843, 3604285, 2707641, 7090338, 3030432, 5133425, 367936, 5690772, 842252, 6056479, 6626250, 722589, 6221784, 7269644, 3578238, 5562964, 7324616, 4905459, 231168, 4174789, 8288833, 5598465, 2132446, 6940716, 8017454, 7736215, 888423, 7605993, 5203687, 7794764, 4066732, 283727, 6171137, 6027540, 2248696, 3913494, 5946364, 694919, 2086373, 443523, 2465500, 1669547, 6321873, 8043131, 7810655, 4875595, 1494813, 5937590, 4754896, 5285424, 5850224, 5565787, 671254, 5058270, 6816184, 7390849, 5828638], -[682853, 5770096, 2623706, 1070586, 3047604, 4008097, 6135319, 2826136, 1984213, 692946, 6276829, 5622929, 757224, 1015084, 2360631, 5987772, 1518741, 2509593, 3070114, 6418738, 7339802, 1915346, 7109584, 1054971, 3562344, 5641447, 4106967, 6776646, 5304298, 2318478, 194762, 8276465, 5846295, 6346832, 1142583, 6933537, 3085964, 2918937, 7836827, 4007198, 31537, 3618796, 7419948, 3868681, 996547, 7223495, 4638004, 1368297, 2294968, 2735391, 4859433, 5207344, 1254897, 6627466, 5159779, 6163739, 5710424, 7861313, 3256692, 5492317, 6292045, 1837846, 7614019, 6174216, 7223386, 3013704, 2581687, 318709, 5356244, 359910, 6610226, 7690112, 4166048, 6383877, 720763, 6189805, 2060349, 3687999, 4007777, 1814531, 3968829, 6910654, 5597565, 7420879, 3641492, 4356578, 2343489, 2248688, 7362068, 958366, 3895387, 6845375, 3346020, 3218691, 8096149, 7211393, 6595339, 6072511, 1619110, 2602329, 238125, 7343392, 1837290, 4384337, 8184227, 239258, 3093603, 1078113, 1129296, 861711, 371636, 3120230, 3953403, 6310584, 7728105, 1600307, 3817285, 4895591, 7946322, 6051826, 1829380, 38346, 3953971, 684407, 5292908, 794067, 4494462, 5110077, 5671873, 3338285, 1029430, 5457759, 5498474, 1903645, 8101848, 2152209, 1331004, 7148889, 4416298, 6409189, 4458159, 2545198, 1532958, 5430378, 8253552, 5956615, 2818406, 6409497, 2800696, 319547, 4280593, 414704, 6781857, 7009609, 7799007, 5327599, 4998832, 3344865, 5198621, 1978214, 7678643, 6196685, 2963688, 7279594, 961597, 2102024, 3912055, 1666209, 43766, 3916437, 342576, 4124772, 6595379, 5681601, 5981782, 7460022, 6089954, 2649852, 639361, 2902687, 3097691, 7724025, 7618700, 2562011, 1707096, 4008379, 1914562, 6711990, 3996882, 1474578, 384172, 964938, 7150718, 7952204, 8144093, 4550907, 809174, 5699765, 4332288, 426514, 375358, 4754765, 7545918, 5295525, 6299626, 3467567, 1343391, 5093136, 1399994, 5943950, 6809701, 3269119, 5380768, 2642985, 1095548, 6717642, 5824960, 2308243, 1004196, 2145677, 7795892, 3846412, 1091662, 2069944, 2844430, 2106521, 4743466, 4708807, 146413, 7958313, 1110037, 2435676, 5259104, 3402100, 7859759, 6633715, 3589227, 2412341, 7188869, 5470699, 4779139, 1892473, 237575, 4456487, 1588083, 3046209, 88372, 8152176, 6528187, 2237342, 1943974, 8058936, 1940201, 2202259, 412019, 4581143], -[3617072, 3448382, 1697320, 4437291, 1783642, 2101629, 5536804, 8049153, 1862187, 3899663, 3510159, 5945860, 4463297, 4909, 4009196, 4934159, 6524923, 5252491, 1100911, 538126, 4382141, 7502028, 5314740, 5612069, 340785, 5715114, 1257976, 3350772, 1319763, 3000514, 6270011, 6244668, 6619426, 5492056, 7187539, 3638512, 794172, 5943108, 2194197, 440948, 6060315, 2688498, 7193313, 6232049, 7381358, 7414281, 7669834, 98278, 4767872, 5964710, 6058487, 6617738, 8149960, 6036974, 1754155, 4184497, 3627887, 3013367, 4396019, 4487653, 7123967, 6869668, 1769343, 2170355, 6723794, 1477421, 6420627, 1664078, 2291462, 2860259, 4153425, 4021703, 2323044, 1137247, 1916957, 913678, 3555748, 8300537, 5505911, 6787159, 5705589, 1304835, 1943108, 7929328, 5585193, 1678074, 6141329, 6706087, 6152368, 5890542, 560472, 3853361, 4964350, 6200608, 8349726, 1310594, 4779218, 2554618, 1075345, 6181376, 6161008, 4146527, 2755146, 6902567, 8176589, 6212936, 454343, 318852, 6702553, 5625227, 4637222, 7002622, 1478517, 2151539, 3556755, 4103216, 7959058, 3201371, 6681249, 3459510, 1060733, 3230926, 1452600, 310709, 2957268, 5571305, 6018724, 5832459, 8104898, 1286461, 1749762, 2078366, 8376383, 4754923, 3790249, 868568, 5851462, 1292947, 5827374, 8285791, 4011130, 6237665, 4029233, 4157072, 2498230, 4471169, 3266513, 2392039, 2816078, 851443, 139594, 3304867, 3664191, 3542691, 3887514, 217864, 4506927, 6147328, 65823, 5668379, 1515850, 3502755, 6647781, 4112783, 3383202, 5469642, 1049368, 7770074, 161592, 6549832, 417057, 6662400, 6295444, 6361011, 2432018, 1789881, 111557, 5364133, 1902031, 6043784, 8109720, 7901369, 1538161, 1435988, 1438539, 2910755, 2817528, 5426602, 4213796, 6202579, 3827857, 8040227, 3496314, 3574072, 8179514, 3161437, 5037017, 703932, 5597888, 4681994, 6286348, 3862146, 5624032, 6388160, 8042966, 1207292, 5895878, 557510, 5115296, 6655203, 1227476, 3855007, 1252615, 6951417, 6493397, 1516483, 1189116, 4700823, 2223843, 8055026, 8266650, 7640511, 2736700, 7295294, 733311, 5376031, 6458421, 7840457, 1495863, 703742, 3446323, 5268175, 6583932, 4936222, 8212174, 3322209, 348457, 6733378, 2476440, 2013510, 3941703, 4577738, 6715206, 8267739, 6792123, 6435925, 7763423, 7675808, 4753596, 7174819, 3731474, 3324700, 1603400, 5996660, 7378534, 6551931], -[3093424, 277406, 2336888, 3132069, 224777, 1697640, 2854480, 5782414, 3109861, 3597868, 3960646, 7690100, 3013697, 2222589, 4272656, 793940, 1090994, 5154929, 6984673, 2405235, 6261468, 1067145, 4303677, 4729491, 7188425, 3877225, 4100214, 1175209, 6475163, 4136795, 5963138, 8137642, 3252142, 986584, 4899479, 4193932, 126898, 5376422, 1352717, 2083985, 972266, 126756, 4028402, 690172, 7098533, 2628300, 6652841, 2917882, 326686, 7471096, 1362423, 195115, 5195070, 136637, 65381, 3602917, 1134078, 2801833, 3857939, 1338639, 1552286, 1601062, 1481115, 1599669, 4335086, 8250150, 2067024, 3764244, 4410584, 1715632, 660026, 6876135, 4270948, 7661991, 864370, 902391, 6382263, 280022, 1131505, 2347104, 572636, 2626032, 2098882, 3282262, 8375028, 5960863, 2245993, 361154, 448942, 5493470, 611766, 640191, 1475252, 664086, 5797784, 6510023, 6721098, 7497314, 824313, 528583, 8031808, 7180339, 8110081, 3313958, 1169837, 3589572, 49343, 1665857, 1737647, 6294379, 7647341, 1738780, 7739940, 7281648, 8134304, 4636215, 6519515, 6917786, 2680725, 6165751, 1663550, 1412127, 1221409, 1046738, 7366239, 6210054, 4737113, 5374098, 6713655, 516820, 5094752, 7805467, 5248325, 592294, 7712200, 1063242, 4943077, 724125, 4680710, 8331349, 5074733, 5156638, 8298566, 8227763, 6969938, 3958129, 3146198, 6022600, 2161406, 359581, 1330894, 3105160, 5792908, 3843754, 2011697, 1121164, 523494, 3882956, 5694000, 4338815, 5909593, 2362893, 294350, 5906312, 6943667, 3094444, 4964410, 5683568, 5787188, 7945352, 2507377, 1621846, 1789794, 7198613, 835772, 2147343, 1167064, 1875436, 1479920, 3446679, 306277, 6188930, 5990722, 5163108, 2906107, 4771417, 8334131, 2644547, 4180947, 1499692, 5731064, 621824, 3398804, 1894893, 7423869, 3518892, 8020825, 5205888, 2160429, 4134848, 2324690, 1600156, 6967994, 808618, 3578878, 3062879, 3896357, 2613153, 7765091, 3714219, 1675525, 4161623, 6536932, 7645847, 4524694, 6359394, 1586079, 7790951, 5147028, 3537780, 1025952, 7467635, 3855018, 2044555, 3017509, 7590341, 1082057, 4715069, 5340883, 1690884, 8189268, 1792625, 5590637, 5914030, 3791874, 7191899, 5670439, 6938254, 788303, 5732687, 7755354, 4176290, 7303752, 3626, 8324963, 1655243, 5138774, 1008629, 6888800, 268052, 4660900, 5218979, 1170978, 3718900, 6892111, 5975888]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]] -||h||: 35, Hint check passed -||ct0||: 67653, ||ct0|| check passed - -signature: 765AB68AC204B255699618463D65D693A1845D574181D1403972888A76B3A553F79FEFD05FF22F37A99C525FCE21F283E437FDC36F8EF4E9C3628BDAA7CEB6EB228C231180B68DE63421238141664AE3005860A4221AFAB18DA83F3A586491B192C852017781FE449A54E5AB166D972A182D3B4BD3D0AA5D0BE63CFFA78D3B1EC7014D1D65BB94153CC4AAF1CDAD92DD3F9460E91238E551A67DA3980CBC951F58250D32984BDF98837486AA9E1D7F0072BB731CA62C2316DBF852C8ACC3696CAC3037871959B7C4633E17479D53611F8AB80257A8D27A3C32EC62D6E68CDE16CF4ED867D33CEB4A963C91951333862788D42162BE8173166A1042E67FC81F37E4B33D68E3906FB51F09EF15B083F2F26BBEB14BDE765A9CC830445C1B8D4C3BBC438FCB76ACC8B43D43A94E85EC2D64CE0276A3BE11D5696AC29FE8624C30619A7F9E716F06D004FCB9BE4513AC1719A688FEBBED40B7781340E6AFCEAF523A337B90DC964F1580C78E26093CD952E1F94DAEFC15F0E5B289C0704964D9DE70BD8DFDC6F857D925C5249806A16D4233040B049D31E7201B52756F863836E6142A8CC6A2ABD11CF405F063683535BFB9B8A495404B98E6EF53E37065440FE868FB78E88E5E8998615F788E1CB6A3AA3707084F17C314C40376644E2DF461203103DE0E652038F90923F42C31C4A0169EF5D3A02FC575CE3F731D7B1A9DB444386708CA4A1AC239081A3F66E269A9070B7A3AEB7B76A0FD76C26B1FD91823F84D7C9F8905E4725B528896221CE7DB23530C62343F5EA3DB1F90EB1452D54EE1AB1E109EF962F0419CA0111F95C1A8034F969FBDC107F5EFAD0C2BD5BC174B29D65975FAD98A6127284227356A42866CAF9AFA816341C8E7C4C8E4862B7140B65FDA457E9B1EC13F78EEB051D371213134186969327D0E45163638E939E6A49C10B0E0ACC5BAC904E24F22A1F2B1298F4F59BCD085EB08302C55DECD53FA84E128647D3BA84D06ED092A0A416085BCB22F21A516BAC01F49C54488BF91E249C00A655EABF6525F0AB99BBF15DB355782ABB7626AD60B13EDB2E413715C129EDF21543059A3A5646F9A55E92570A683E6EF5C7E097C4DFA5B4A725C82C0F60E94149A5D1E6E1405DF204BE749A9A403D0A2EE26B7113B2439904190BEAACE77F25E3F62C122F7925FD8913A3331AD4313B6C34790E5940990761519EA6B17394F51FA7CE89CB77AD9A15A184261B4E5F2F95871E9CA59EB996B93518312EA1FA3B6DE7990363FE65259A7DE67256E3E8DC857E350826E95C1953689FB6A5BAD826A1E9C6ADED1AEEE12491A978DE2EC35FD1DC76B48322B8772A7B7E55E8BFC5A8BD0409411F0FF3BE693549F04B3463CD04669DF95CDE04D7EB6BD13DABB39AA3916A503FD1570D5C5D4DFE294A9E82BE575B27F9AB1EB21BAE06407E2698CC4DD533CBB78C92E227E9E81361049B92EC1999DC30BC9EC30E9BBB57255BEE750F884449EFDFD2891D69706C3CE2A19D4B64D26FCCDA924544D69BB87D50D17F640D5FC5FDEAFC6E4D61F2911AC6317D18AD12CCA6D6A6139EE3420E9E082527FEF6D111A885841227207BB79331AC0A20AE1317D09C7537DFFD182DBD4B25EE483166F6CE03AC5E19560F282169661F9F861DD5933597EAA06DD34B24924021D1D35CA30640147FA2AAF1BA782650DDECE73A7287FCB16E6444ED53131B9D9169BF6A9E09776D22C05EFC740A76F7F2FBBDE0BD4AC63F50B3FA5C718285567E8ECAD96DAF89F48FE1F6C4B2D34E01914669C1346F0AE30F549EDE7375C731203EE4AA29047BC31D98F7C2E472DA8224DFD0D05EDFAD589D9AB17811559C8C338641933C778FE572202BC4114EDAE552FD9A9A44EAF8BC66BC643A6CCA708CB9FFB8EFCD6CB5C87F16F821D88959B40AAEED4ED6A6D1F0EB7F50D90E1D40DC323C38E6667195FACD3590745D7A2899E558132201032C5782B343EC162C71066D8B752E5DFA9114B55AAF70A8C29179C8852A60308C7326EF0B4FDE20CABFFBC7D22AFC9400994669312EB78F0FD45843A6BA5A0DABD7B3AB585B7338A848C85E80B536EE9599BF7BADE5867A28B12B4EFE464639897E6B6FC79F42F785BB4A7DCFC0CA546D88CD8F98B930F072062994FBDE90510E6D61A7CE1BA63A66C4645CF995F2C7777E41D2876010FD7CF887E9DB602D96E864B5B9F64102E00F19868779A780D516B6945F5828E9807D415C768822A3B9A363CFF263E04BA72FF41D508B75924D17CCA35955ED102ECCF934FD2208656756B8DDA6FFD5A2B1889072E13141B9DBCF8B8A69E8DAC83403E7D4245A3118EC51BEE519669B84921E9EB9B85450A4504AA4763B5C1FF0783559BF7D04A3832D5C1E690C4A27B6F0E6DCBB4DA80249CA9825FAA25563267FA0237244B2DD0AE1A8F1010ABDF3D052707DF8DB9BD3B206B61D2B262B7BB0C0F4372155F6E27F1E036849DA92A792249E29D876E0C9763A244CF583950D6CDEC348DA48360F9B7CEEEC046BDFC7EE401D708590713E6F145C90610EBD1BEC8FB9518C39A2FA9EFEDBC61DEB4D0B61101E373930F2D5776BEE5E1AE6DFB2D8EAF3DD071753BB700E0C8CD997984905417AA2BF805C1B944FA67BC0CB961D848AD3B0725C269CAE77B61F01DB3BB160F8FA28B046136BEACAC81174BAA18B7E4DE4E210832232ADA0BCE8005B450C249E05B796E312B691FF1365E9A397605DFFA63A2F612CB46E9F2A1B5C9E0BCF1235D1C551FE568B1F2634F901592BD547B8C6068324EF660EBFFB6CEBB74AD033A614259146E30E02B456FFA038C2A0A28FFE5F882BFFCA4E7E36B07A6CB9BED8FDF775D4BCDE854DEBAA18B219F158ED2491028D2A418A190A8DB4F07900467F9B612B4EF9642AA1F7C09E08EE8B124401BAFB5BACAC225047483E5362A99F39CBB22D2DB63E3883812B8425360F79B1C3518C1D10C3E1D64DC1FC2C51FC20E346ECA8294E37C9116871485DB47395F8BC0D708EB2A52EE68BB2ACE0CB070AB9938C33FB341B81480418F8D39CF0E6F923EB65206F80D3AE5391392782F148EDB6EE3939431DF8FEE91DE625FD0AD8953D3A50D338179B4D1F7F42ABA9F5189C7DDE472B1F89BFA60586B750B2217580FA518549E502A30181AABA3217C1A5DC96D2A862DD8C9D91F5A556367C2D4449D07606069211EE65ABE35CD87025F89BF53F064FDDE4CB5B4C1FB6BAF6DF3149784B54382F100188E62EF5B56600412541F21019435657E53266F865D8623E2182945BF30D133B2F695D1B75DE11A3328FFEEFF041F4B5C3E9642040E13A825F117676AD5D40B827AAE31564F9143E8586F394BFFC0507329DC6AE496A6E0E0C1664E1CDF307C394D19515FC1D6B805F5ED3FE9FF20DAD5703C4304DEA97EFDED617C20DFB82BE300229227EFC33645A469E2EBF8B80B4D157BE5CBF9AB9BFD27350687BA5FF5BD6BCA72848E6E30C95EA3552A7FBD4662358B38C5EECFD5488A1FB3E98AFEA479B9DDAC0E91C16FCE75FE37CAAF089E6F84B8CE6331E6B57828A67A12B4D2616655E594C461834B228D38D323C509C2701D0327EBD8E9760A3CC8FD9892F10C84BFDF00A1F92DB6976F236BA7F430CEB0C13C28BF5D1B7C92E16637B699760A04C8871521719378292EDFF085900F364D1D2FD14BBA8FD437564B863009900F4C80CB8697DB7DD85941E8F9F459FA6C2DA26F2F783DA51986B344C5B8E8A8B993F40C7EA295046535B9AC02FC56769DC141E0ED3A6FC5C9ACE38611047042ACD43AE40CC19CF1103490B0107B3497471B2FBA1F078B7793C6EDC920DA777355251C7CC35A0124AB3C86371D7AB11C8BF083BFB879EE9CF02FE5570DD0503983E24C82EB211E47BBB0465B4BD47E2ECA814B68960CCDAECC5172C87F0488A0276499591FEE17639873F21146198D164C5C20DE69D110E87664406745F679E67626FDCF2202761A2C5C96EBE8303F05A9746973170A7CC1105F9AE50A53307901AC66CE27A65CF9A6AC0D2F40AA0D158AFEAD737E1611847995DEE84BC748A5ED57EA2AC58B2FD3D2D928666EA09D070A1E87953FAFB3AB8D3D468A153EF87CBCA1CE7A6C278AC890098D2BE52B3AF9F02187EB63883D5264171D485FFB1ECB272F18385C6B8E81788F37B634E0EC96728ABDCFC8769A5F2DEB8BB1FCA844DAFAF6D63AE11E8E9A1A1BD70E14D0583BB12B7E0C13C7A988054EEDC5DDDB57BC255F6EA90D6619B542FEDC5653078232070410AD7514FB50E9E74D51C6F8162AD25AD6159770762F36F74587E1AB3E9F50F7C04CE75CBC78BACB26FCE243E13CE74C28671157599651016BB041459DF4EA0B6F6F35E30EC1EA6FEA94BB53D347E26CE7BE6E4C569E60F9A428EB55C02F651A0B84E2D652A242A5512ACB2943F029BEE7793AC385BF7EA077F200654EDA0A23182A1FABB5001087AC7B45DFA79FAB72BAD1349093EC40870BC88DA3CD660E6E61711BFBCBCD507A2947DDC4114FE27E93A346182543F7C5706C5C8E58804F421AA775BC824D9B27C758A69042697F046A17C8B997A8FDA096A2A373195DA3E5FF02FA1AFE5166F8C243FF65497F673D6F9597BFD911234D7C81C3C5F1798FB4CAEA4F7D84E9F310343B51A9B44D93A2C0F90000000000000000000000000000000000000000060E13181E23 diff --git a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt deleted file mode 100644 index 074ebb7a2..000000000 --- a/tests/PQC Intermediate Values/Signature Generation -- ML-DSA-87.txt +++ /dev/null @@ -1,211 +0,0 @@ -Signature Generation -- ML-DSA-87 -message: 802CFBC8E848587F98DBEC233DBB54909D07F8618BCF2FE7E858FF059742251554A5CD255AA87FF73D8327DD46633397926362B78C66B289E30E7EC19DB39261FC7F6AE86D8CAEAD185A27363A580F75B3D2E9ECA8332FAC06D08F7A7FFE386AF28FF78FB32352071DCB8AABEB29C56FE0DEA9D939BD8E10EEE39C37BBE4580C8C5369591ACA24C1F8AE9DDAAC5696CF05E1D89D71698816923A912498B8869CBDCA80B1F1B1B32FA4BEA289471C2573EAC36CBA4390F7FBA389266EBFEF3934F1BF6BA92536C65DE59D1CAEBEEC5BE972CFB0C7E4FF45B51B805D64B72A7FB9E693C76C2A7279AA0A27FDDF344F6636187418F0C7B857BB0953B67F919C79AE9088A47E2CD97CF2ACD2D665236CAFA82DC16966D98ABF04CB20CCCA0859A90C007957EBA715AA56C682F1EE2026687A024F1A713E688093571F830D60346776733F14B344B5544487C1C74140EEC00301CAED1A4478B235A03FA1919EEE7A6B65502ECAE4037C12B93B8C1CC6C5E4A5FC1BC0592D3116E16E4AA4FD19A2E1AD1901F5D891A279F158B0F3A61D1FBF9F8DBA0F1BB032BA0105B0E21BDF8F0A2A413B4EDAF7DBA61351E1E97A1396EFCE7B0A6B453DD189881ABA27A5A7746A77946E5A075092C9B283BB8800F506C73326B8FD8C58CD143B483225FA630969408FF62EA5DE9E2F1D2CE20E8003F43A99A197EC9AD2E2AD99F443B20D03888D1ABC89ABA4B11CE70B4FD83FD76D16E217E3CA687897270FFEE03CDA625809F31336D6EA0578AACB860CB674052E5B28922AC92B8C89B1CB17572A74D6265A14483280F3446520EAD954BD327DF6D275E59AD9CA389C6390260B0D9E1EDA0DF517122CB77A818F802ABD3B61A37B6B4E03CD732B1DD9274A5FF55C918BF8F582B95C4ECA7C2B441CB1FF501A5831A90F7B8C1E2C2440B4BF286CF806CAC55E1A464763FD0743B32305991770796C5C0D1CDE024CB1708C5FCC49442B5CE1D599E615781B47DBF1695259E03CC2DC0A424627F369748A3F3246D9A1824EDEFCC2919838C1C5845A0921956768B9DFEC8BB320F8BEB2E72B03969F1362DF33F53E920E12B62AAE258679526EC39BCC2608068FD6A4A7F9E406D439EEF46969BBDBEF6AD5AD85CD648F0BE4FFE62990C8589523D64816682BF3C7E0983321D2272C9D76A218C468149092FBAE8757E5D1E152A7CF9396B7714E013A8234B22026299945245D89803F13A94DCE5DFB832FC9CC646E42473177E7B61B585A7D11A195CCEC39ACDFA40016ED9C3E161A61BFFB3739E05A371068B8CADE321A2AC1ACDE72C816F1B6373C68AA457686BE571745BD30EAA42264AD560F69176D58769CF5420A25DF869D4A1F1B3EE800DBB86B5D2AAEFC9A24001105758D02F8885C94502259B9F3072A65394B73F40F1C483AF92E1A69143B1C305B5A555DD5668504645B470487BA105CD91B3687990D2A413A78BD905DB5EF7A09C679A6C8AAE2D7A4A8B2FC9EF49903C748ABC3F1B72A45A88401AF8349EC12C4D8407B3A76F935F2FB09C49CCAF2D7A66808B103D0D5AA05AB431E805113A944451C3FCCD785AF6539F859A27B1B41D49C5E057835CCD21BDDA0C1A4A748C39F8E37ADF41DB811CB2A027FC39DB2ED4E3A98C1A0D9252FBC103426EBCFFBE25752D5674C28AB7FE18E9586F1FA782422784AD31CAFF5EFED0B0D694BA7F98E492B9F9364E603994AF55AED1486931FA4631E38EA7C20798182FBBDBF08287D8EE51B2D4724DF6D625580340A1E40FBF35F344C48924178F615C48BD529EE0302043559952A01F6AEED6DEDE1479C06B638E73F0A3A5538598BC958E46E68D4BADC6A0EF2743B1DCB874082D03346D2EA9FA445D006621B23998BE5213D5E2DB4E3A51039EC1EDC16F5C7098AE20FEC3495C3B35FB9FB4F06B267F01FD79085036D5477D0CBD6C7CA513C4B68195F7D63A81F71083CFA2DE23270D588F8641D443C9A23642833EDDDD4600D5EB138CAC283CDE3964C2C49932ED6019EA56976DEA8E39AFFCA7CBB9524C54A1D010F0BD58F69AE6D77DEFA0B96A7BF532CA9236B514CF12DC859F14B4ECCE46222763743CFD8966B0A77C0585D79CA6178985DAB8B61355DDCF9971F204E1C01460DDBA43BBBA92B1F20E9992DA2734F632DB4CE9FCF279B1ADB3F47381EA6454ED9E04F6EB28D28F7F12B99D0517129FE641356A7F7B3AB15125038C792F94C495A7FE6E52BEE569CF7DDFFEB4A4CDDBFB56B19A195A307FA91238C7F9C781E1FAEE386E60BE80807D98618782DFACD3F5E42B9E6F8C564BBA44DFCF63DF93B4FBAC416C2DE588DCFC079AFD0F0BF37801304A37B280D084A04E2CBD8618B2E61F91304AB8E7AC10263AE11D6532D6D1A82F26C2C7205AAC631E9EC522C1B15EBE6438D854A3E23AF3CDC5BA37F31597F43CA2EE94C25E75C59EBDF2128FA21D279DD891FB7D9103126872F110DAEEDB92DE68DA7859681062C9098186A9F18324E9C35AF960C539224F63C1C6CB412B63ADFF779CB487D02E7CCEAC3B7A90148D7CDECC185F5E6D587E351ABB460DD2E3E4F4BC0A77AC488BBC0C634394F32E926FBAF33B6086DD64302388B492E55F6C08388963C81B5F045202A5BC783F5EDAF7D7EB6351633D4838AD6F797B6CF8C66E12F804AC4179D31BD5D24ADF2DDD1A1DB43C22CF98020853FB34E314527E1249A22B8CC5FC471D2DC13DED0CD1D9740EFD671065723A05C46B33AA8B5DE6BC4DBD4F31432780DD6323C209F977B1412100B95CFAE7EA901160A1EB67A9BA88970517CC1D95D1003322C44DC73873677B63D7F41E2AB9B43F64DC87D70C110510D80198FA4B067A696D99D3A2EAA0B0B37482508C4387CB5ACDAF36C06799A4C184474BD2B100ED665DB48C1789DC5129795DF1A161978889D7B2B0B0858600D94CA1565487BC8317A2FFF9AB4FD649E9ECB24EB4FB7829E04A3E0F2087C518C30596E390D62530ED44CE64A754F57016C1BB3C91FEBD66D4770C8C7406B4A33D58DEB3EA43E70D3D217AE3FB841CC981289575ADCE06027DA7A86CB73E42628D1C33583BD907B1723D025 -deterministic: true -sk: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E04999404C03206AC3A871810224E2A6099142421A488614A149D3C0301B125051A00D833812C8264800148DC192888996118B321204922851B2448AC8001237902120081012090AA02DC90886200609D1A2251046881211444A46119CA48819412E0BA248E4A228C0406A60A4711C15710CC6112389115AC04C42348C08000559342A50020E2480044A1865D0326CE232260BA380DC182600306D623428A33281C9C22CE438801C819101846CD4C26C093922D28090E4844008862004466A4A061202B060C33884CB225100300D48B848093920CC146904008C11192D21358ADC9629D2A65153B06D19164421A0315C82310991440B48311C46521AB0488882604008490804065A447189C2650000900100645A360A08810508156CD4464C43B46064B8604AA62894422908062A59C24D498865044902D0264EE3A0652123801A890C63166109A00912388D0B0262A23000C3444E91B4210AB481DBC4050423208C96682034292184248434451C816154B06412226121004D58268924982551320C0B112684022D1101091BC46043446E22990D49A06014241221838C18B0709B844408A28059B44D63448C410049103889C3928DD3884150B22898406C9A8465E2448591C824948491C21211CC422C1B927100C5904B380E49068CE2480E21C18911448610008901B1644CA0899BB42964068614120A041026811485DB12884A344C21256618076204486D48368E24A020D0385161387112A5854A862D12812D22374614302D02B3404806000B3360E2926DE24266189625A2046D4146055034308C32294C068419C5819C8028C0A828A2366C049964C848450B4232A0987083386EE1408122817119958524002E6390619CA08498B6604A8445A408094CA6616228468B023021494920A664C1B8214B887082242A4A260D914249131724A4A8841CA50C80C66881980551484CDC00642113118AC06919158C52429114B6010226329A826810018E881261442884C406644A268198484991404CE0889022042D8C9844D020112422698C40011980852403224A104263028E0BC34C0C314241A82120C28599C82900058041442A4CA8000914880A378402052664944421C50922920C1B086D18270894B684192321D89868590269A0940C13B29013958D8904481C94710B28720A9069108281A4B64101240201C0050034611BA031C2942191160660988002354D593872D4A20193C00D1825051C946CD8326CE3482ED0C2211C230263C62460205004B609A2C088132468623642A13040491806C4848041360562A27053420814180A8CB48009325193182A80380A94A4700A2580D4160513944C4AC09100C26C1A184EDAA069203332034325C838610A05080C8764094629123709D8C20CA228288402840008021A892CE4202619098E4B826402A04D61C46549B845D10689141310598848D0A28512278660B42019974C43B231894030544690098591890621C4389241320019C444020900D302868CB8214912451C325024020AC1084D43988CC496081820626090309C000AE028506038819B22259902488244802008329B1065CA942D9CB2814A408D6148618B326113222C589810CB122999064E5CA08D1835660C0592A0242524152D0B090A02066113002200445004A10513C284523492D4C424E44424141732A34028DAC06101C03121364890A869809265939281E1300CDCB400C1424C03C424414624E006445A162D20010208473182160E9C1430C9044904122EE314010921818214055A4440CA06520042868AC4808B224952486010225008C4000B918454B49102B52101814DD1382012A780E2B86840A24448140813854558A881522291A12851D1404464C88821C5242122614408701CC328480202D9167119256999C28903188D20C0896140211308109C205063384923994C6396095B443253104A482601989884D01069D1066C0214611215218A088851124218192EA10481C9A00D23972CDC945184A46D02166D111432F0788FCE7E7F0EE474116D6706545275DA90CAD1D759D4A09832990245BBA7321755489F7D92AA7C662E1D4A38FF96C239099E511BC1D006E48E033CF6B2E09CD7F8220BAE963AE1E6AB53AA5ED38F954472A26FC644530DB78780F7CA5401243C53AEA1D660CDA71B493F8BCF93AE1CE14DED6B98CD5B05D8C737A53C79A2C632A4DCA846AD1BF916B289354D02464A14D4E9BCDADCF705D7604AA0C18E20439E485EF7E3B114107A6D80491A2541FB6D7BC81333A050C5D3B8E7A6F0DE7673F657F9AB0D03FA890B70957B5B3F9A27577916982A80F6DC8E1CB8E95F59763047A6388CCFA633D7845F7981E7A34353D5C91CE65ACBEA6E1C723918046CFFB9C4B3F4CD1B1F570B5C517D5398782052ED2AC30D98140A1509BE1EB315E45A7B04F0486F2E831C07D63E7ADE3434EF383808CABAF0044AD6783A1228DF5A8C2FD308FC95F59D719621E82F610D66B922A2BECD6A42A6D62666EF797DCF28CDD268177F4CAAD9D6C07BC7BC0002EFFF575977FD943967B6179A09153BDB5C62DF3ECB167F15EEBC521A66FABB3012730F40B2A5ACC1D5C0B649BDA549BB069C58DF5F17EDDB69731908A681D6CAD1961B8D592B810523DAEB6FD3D50E2A559DBB10FBD336ADDFAB2EC5F82F56D18E42970F424E69B87DB37FD085E2026FE20FBF8EEF4588526E9C6DE6EC11C2305BD1B7B166AC6A7E58A4843B5F62006E6F2C7DB6ABACDABDB87688256F2FD425AE70EF03843397F0D05319BEC5DE36143FF973CB88A2BD16C43E1E6D70851F7EDAA8BFF9AB9CAD55673C310BE0F47FE1389248BDA7D5795CD0B920512C4B7D0A9D1F2BF5234B83ED03DD8AA2F633F9A598261D75F71220738AD2A4CA6261848C0D692B55ACCE6FDA95D7AAAFFA79AB017A009B12DFA083CF57C5DCD73B0DC46E18C546EF424510AED9460648D0E330E1766030A175F189733C3A8DC4E72C61D3D804D159150BE96A42690186A3959805CB671EE3A9FD60BE3CD7FBEA3807B507DE39507362FCBDBFB86B205F1144C7B11414B71A918B74B55BFED381F239B31AD61CAED288842294F3922A7F3DFEFFE1443EA774830179FBFA4301F8E3BA74BF38F401D672DBCB22CB6A9E0F1984420AE9257AF1BA122EB230161D28BB4CCBDBF06B3C1C5C4F5B551DA818E8022F782CDCC64A55FE92CCDA962877AC69667AC304B85643C1098702265ABD659162A4FB5FBFADEFA39DE27F230FB40F4B7A08DBCDAF5E2AB579E703D62B3F4CFE4DF5D5C84AFE5C6C6C2D6287382683C6BB4AA2A02ACBDEA75DF548F336178EC5F0E4D45A1295FE29CF11516ADDB737E4D830102EA0FC16CF24929A00A144D702C61FDF8F12E282134AB2DCDF490271108A0B0B5A5145C384F7758D602B108C9F563DE0A3239F4AFEBF161051898C05030BB8D6BE832E398E5EE032AEA53057C85B3035939F88C9215D71E20B98C1DC4155DC74A4A41F33224DABCE76DD8C385BAD9C0CF4B16760A04BC6F23D9B4AAEB36A8AE39ED03CCF1465CA8D8725503F3C8CADCDAB4A872F25A583FE97889AC54822781173F9E5AE6FC9FFB3B23CA8A61E620F6D234B0DDA0366BF571DDF33A27289B87DFE30C2EACD665B5F58344E862C37FA65C1E960DDC210F2FEC6807E454D1C4546F28605A64C0748073DC0EE40F01A1BD55D69A7D8DC0A223ED4BEBF83878D64C63F15C95E4D212134073929E2E925A74066DC8EFC77B6D6D049B7F5516EE565C0A4315E8EFBC941A054F5E9C73CE00A5B7AAA4015F6B07447BD7A6E45BB66A49A760613AA751D2A01C76D34ECAAB559B0B1DA951A0597F029B4595F347261FECE8A4EC72C70941275D2983F43697DD841DA7F6B31EF22A04932F2857395176C0F331AEF9307296E2E0DC0AC598DAE7D16BF3D84FC1D5340AA75D2AB4CE0D5E24FD6A76BD0E40AFE3DFFC4503F859F2A7190F07CC643372F3B2748EBCC77AB5AD93F9E2C1A3C84C5821F5F4367B0FD3FD1E05808398D75C4BCD8D69B0F42D573609E1B1871365BEB68ED23645F75D878CAAC40722A934AEADF80AE6145A3B36844903CBD1B082D210B72F2638501C1537BBE084E051C0BE28EE589489A123309C89071DCC21042967D0574CCC55C946E2EB0F2CAD161C317C229712FD88BB7DF52FCF071963427B4F2520205115C89D5CAEB88AA0C7218403FCB720D72B7EE900540E89F0E6C6FEF1A0380EE643B4EE84CD7DA319034D452E3468337A54EA647AF1AC8721880C2FFB2D4CEB94DFBCAD4084DD6985451E48E7F8C55620EA005683004567A643C5E32163C68E9BB90A093366E27CB831C0D668D5C8EBF3BFC17A472E183237BBCF61B077476DE3A40200DCA000E1FC6CCC19ED348BC1CF2C2C6CF99052A09A8DE314C9938E57603B96EE9A52F2B37D48F89C16F8F28FAF9CC5F5655BC7BAEA98088853957156AFF3D10C81456415FB8FA584BCFA86519435D7AB2119C2EC968683857B604264D798627EC56B1F68DA21F9CC4FAB4E35970626185A60A4ED690F77ECA24734B652C51B0683AE397988D648C652E4A8323D1912613BE403E1A7F775075F9BC8804BFF23E5077C372663EABF0EA1B8884CBDF6FEF70436796EB7A97575250CC4DB9580A7266CC0C99E3061ACB9A37886DFA5D0E68C447B2D81F7E72337367BB8AF51C9AEC0D5659F196BAE1510A126DD2D8D3087734F21BA4DCCBE7E6DA79D8C722015CEBAA3C1C14549FA9FA384DF76A4B7A252CDDC3A7DBFAB8BE3CBCDF9C28A9F3637957B40949068D7184E9DDCE545B9EAA555BA94FDFFB94538C21D19C489B42ECB437ADA6F1B64318C8CE0167FE0950C1706D95FAA6C1661090434DBA6F8E1486143E76A6C06B0705D6CC85CD5366C58F0CE1AA31B121F1C5AC32BD65B2D46D5F53B4B6AB0B5EA8556230DB5EDDC69BF37D0DD919CEE40543BBB29C11FE6DB2A7873BFF976B3F3DEB95AA26F42504EDEC1FC793BC58E01DB60C966407764F259345C125230A3B1002DA094BAB0F101182C14AD0B2B801D775518D3B772E9C791F5F8DDC6BDEED7A7DA1D7F0A561BEFD8C1D2891771DB57F38254707A7D54CD57945D43C75790C25DCC2D1E45A1C98993C5A3E4EF0FD44BEA2860E97298C0F02427E5348FCE051706A54B44CC4A4CE8F4B397E472C7AAF8BFC5600912559DA30223EDAE65AB927CA3D467A09414670A8BD60ABE00F029C1512302027961B1E0BF8784A6CAA78B62EBDD102D06E04666E262EAFFD3F2700C2193F27A43B50B4773CC0B5184AEEF2561852997BAA75C3081111C3627629202FD1151F8F4296175D5C2F892DA7C140C4AC4E315F48F2C70A564A11245D61F4F10A1C933A4E67B341C946D99FF6B448B672435B39D377CF6AA2A5B4423C419BA2470A39912E0B35045AAF80DF3BC0EE7A971031C84B4A4202C501EDAB24CCBD4740623920750C6157F183245A1070992812F6A8A8115994BCFEE0D830FA2AAD7A7EB9DB1016C051CF3E7BA59ECBDEE39303642ACDDAD1327CFF02CA309089388620CCAD00C30AD60CD93DCE6A9BB43191232D0B75B7E1919238BAD92FDA382B8A01F22DC62CAB6CC86A3B57896DF669B1413102A2073261D5BA44FC19499A4E73513697FA16FA459EBFCD195F74EA3358ACC61996E6959331CCD8565C402583EE89C5F5C19BC94B66B239956FB1B727411EFC6632C46D7AA04C1405A1C64E0C8E6804A21E55E38855D9F56E268B0CB759229B9671C1CE3F099FFA70F727F11750750601D05B5302D252DE9F4585B9DB3AC499227FD64F0AA95760F9547C1DB5DE3974EB12CD24B596EC2927C52AE20910E87CF173780112CFF71AE4CC7D2B6F942E00C6E29ACCD0CB922E8241B7EFE1D579AD97CBA5DACFC76B2A97D4256AC5F86F05C4F38035930FFB1A7174F2B35BC19D97F8B0A25939BCD7DB31382B73123D1CAE9ABA6CEE945F46250C403E8D1D498DF461DF0B26705BF97AD1515F2EF495472FDD7D79513CD46E2DBDE020983439D51ED9595125A024B4ED280EF8D5D749AD9795AD90CFC99A7941F28722A5EDFE8716495597BF867A506601B89D6B8BA62E488681561B45B733596D4B77AFBF7947C4ABC756D48087F452E23C57E90C3AA1197B7543D7D7D1E645EA18F892E43CF656C60DA3FA1F0D574C89637875CD6178AE2DD35FF2CD22D01D93F4762DC2B60B0AF1E071EB71DB0C9CFEBBF7174A9AAB12764E89410CDC985F34DFBD283B7F9A9007694031A090B9CFE10FF42A6A80ABE3EDA818CA84589F02CE63EC08169D28A1E7F7FEE76CD2AB2836F2751F0BD2060D58CAF80B0389756CCA79E3D29098CC7FB37E82D94DAF337FB7F45D22812C66617D0DC046A19590A12455B405630F0838DEC509B4EECA3A61263555967062FEDDF475E627E149F9F5A4790621DC25D5AB637E09F6428D1240078467E7302F5386CD251A6C7685F121712B649B78B3B88DF801FC5D943D5EF968E9C0197F9B30C8FD199C6178DC19572FDB83F84DC88EC1E10103B9D58223D8BCCA95FDE199EA3F3D11862CE64C3F622E324AF3AF4352775FA2ACE2AC32B30C9632D30834CB90BDA8A2C635C69236892CE254847D00CDDDA467FA9B52FB1E13F397F9BA6B68E6A5CCFE16A9824FD3B73862BAF10CD43AD3E097258D5B9BDA93E87828A1DCE2EFDF969505E0E4F7E2D144984674D1BDD790FEA906D3B72B6A2A6325E040F5759A68120D2441095D6986B33D333892 -rho: A3E61204447E6C0C9438D5D349EEC3919F9C406DE5823B6B0C10102F4BB447B4 -k: 292101DF48738E3DB3E1B68947D346CFF9B9578F61DD718A51A9BE1ED6FFF1E5 -tr: DE1B58833F1677A5DE1215BE80CBF1456094A9C7029B228EDC3DCED21B1888A31DF46356C3B953250C0C85A62252245CE7CC1646E75CD6B35EABC4EEDE18E049 -mu: A73192754E30CBC88BC183A2C9378DF6470EFFD7AC7412A38D925E6B3FFA621BDBCFD9047F92DA946434F7ACF1CE1BDB5E494F1DAE1E0185B1BFFB68DD0B5D83 -rnd: 0000000000000000000000000000000000000000000000000000000000000000 -aHat: [[[4942817, 8033578, 6193969, 328164, 3123076, 5608360, 1966694, 6159093, 6759326, 6515321, 4110789, 2846010, 10361, 7650249, 7781336, 6041326, 3536117, 2317544, 2721408, 3046749, 6270459, 1299626, 1215811, 3133880, 2370213, 920527, 1371791, 6811904, 2145793, 6207375, 8116305, 6492100, 252579, 5753948, 2401968, 7443724, 6047272, 2583106, 4272483, 5642404, 7540939, 2340897, 8148728, 6414703, 3554582, 4848846, 6304416, 4682923, 4866938, 1589246, 5949669, 1816143, 4144854, 739672, 1612639, 3960420, 4823091, 5152652, 162563, 7250025, 7861187, 1075468, 2760719, 5325368, 2853995, 2491970, 184325, 8285647, 1101892, 8236541, 2352450, 4836362, 4400092, 1730566, 5875078, 1163328, 3799181, 1078400, 6473097, 176770, 4389290, 3930702, 2247381, 5252155, 5094297, 5798128, 1548908, 786346, 2167616, 3408943, 6482932, 8268308, 6846461, 311108, 3509443, 292335, 2139945, 5315971, 4034246, 3368750, 3185661, 850239, 4727176, 2835091, 1966568, 628972, 3540979, 5585861, 4851680, 6954667, 5585688, 7575029, 1022666, 1224100, 2117265, 8081556, 5564272, 6094337, 3512192, 4447560, 2593735, 7029115, 1615057, 6182604, 6007387, 440008, 6161124, 285274, 3999454, 1761041, 2682656, 403435, 2315983, 5882539, 1551338, 4646148, 4502297, 4745509, 3584078, 3034937, 318029, 2307385, 5511360, 5629585, 4943712, 1674374, 6932098, 404086, 3453431, 4041486, 4634031, 2114236, 2992967, 5097826, 427152, 1671710, 8117492, 8244909, 4947244, 7239291, 3863419, 784527, 7897835, 6455885, 132223, 5997318, 2639167, 475440, 4874364, 8341775, 5628523, 1704181, 1098470, 7942278, 3058693, 3581325, 7088671, 5471389, 5666382, 5936984, 738801, 4232882, 424231, 5718096, 2810555, 6995518, 7506366, 6192412, 1757809, 1852167, 8088408, 7915331, 3188672, 3633386, 2245020, 2109698, 8282768, 4928891, 4784934, 8234992, 313604, 3282379, 1182558, 1215938, 2941269, 6527348, 3668135, 7140353, 6666194, 2123640, 3890789, 4426242, 4754497, 7088400, 6357265, 1544629, 186145, 4633732, 5978430, 1508484, 6936717, 3072796, 3033893, 8284754, 7504959, 6804803, 7393696, 2806493, 5282554, 7253014, 7185358, 2664060, 5981318, 5057868, 2331017, 7531460, 2845195, 6326162, 4354426, 5894280, 1602267, 6299024, 6615246, 1498629, 5102463, 7208301, 2184276, 4872292, 6275357, 1334360, 2731352, 1632393, 2666965, 4482704, 3506670, 5714329], -[1550168, 7424210, 292109, 7423684, 1750345, 6974931, 5688264, 8172582, 770260, 1381627, 1430742, 693826, 1001472, 6715016, 1188195, 1888150, 3818556, 4676105, 6034536, 676245, 8304778, 2161621, 1600065, 4407112, 2158044, 835278, 6792695, 6929321, 6760175, 1439959, 1023596, 1154979, 1529259, 5763706, 8334783, 5823503, 4999957, 7234018, 6957958, 1228673, 2899197, 6071344, 501162, 6338780, 348247, 6966377, 8354104, 5109858, 8248876, 7506290, 2141176, 5088302, 2589322, 3257874, 35325, 3628863, 7891066, 3961938, 7778545, 4186932, 4544233, 7669253, 7142240, 4164782, 2509776, 5557977, 1239692, 629677, 6586379, 3360713, 1958463, 3764734, 1682603, 2598256, 1418342, 2138070, 3711210, 4332406, 5252160, 1253277, 6428406, 3393451, 4341410, 6485247, 2227999, 2690968, 875285, 1447394, 7206506, 1558323, 965728, 652347, 3011978, 2437239, 1823421, 144, 729592, 3499376, 2958953, 6006172, 771666, 6233402, 791991, 3989110, 7045738, 6702703, 4506662, 4675489, 5488081, 5637200, 3266530, 2294293, 5597871, 5543096, 7933404, 5422472, 6442413, 3556798, 6221072, 1330862, 3079373, 1215107, 4472703, 700557, 6503776, 3711232, 8016347, 2297024, 5321936, 7719190, 2619287, 6428343, 7931800, 339829, 1210465, 1083452, 7581552, 4333105, 7219062, 8349424, 2110987, 5827470, 1903192, 6042708, 1260469, 404345, 1308913, 3877033, 2156613, 3818187, 682298, 5693335, 8221670, 7241503, 4244003, 7377251, 7599163, 3143159, 6714452, 5889779, 4242052, 3780681, 1681893, 4207853, 3939263, 1254054, 4637554, 5677431, 7446000, 2908649, 5745245, 1125336, 2914898, 2246931, 6519697, 747492, 3807501, 4510429, 7516883, 7420863, 46634, 7519094, 5632365, 7495346, 4046425, 4648072, 7600501, 7802465, 3036604, 7028666, 5613020, 369226, 3095310, 4874432, 1079495, 6601707, 2555469, 4647714, 4287202, 6893076, 1130447, 7845836, 2725068, 1644341, 1445534, 2873352, 6836269, 1098473, 7034864, 186560, 5900811, 3032385, 1546486, 3120856, 5387893, 5268223, 3833296, 502334, 2324504, 1602597, 2153345, 2891768, 4175188, 5234338, 5254478, 5533199, 5364139, 3814120, 1196947, 706277, 7598811, 6387988, 5315995, 1287836, 1107367, 7834361, 2430011, 5174785, 6101375, 229022, 6316026, 4036416, 426020, 4898874, 7591, 507098, 5712767, 7951861, 3393251, 3246455, 4503296, 3783317, 7261701, 2807309, 6255617, 7918489], -[124268, 3454508, 4540277, 2184358, 7715163, 1896113, 7392215, 2245934, 1933423, 544210, 2362289, 1133934, 5522240, 7079493, 6220452, 6725585, 4287242, 7872520, 6621741, 3618444, 3504714, 4508259, 80298, 6477825, 450462, 2979288, 2311097, 8017037, 1898478, 1693384, 4568288, 825712, 659735, 2197465, 6608878, 5097441, 329414, 1492926, 7771628, 2764980, 8267025, 1045780, 6086304, 5728373, 1185312, 4403074, 1113298, 2528623, 636481, 6048978, 5522881, 5237844, 7252175, 6302111, 1737301, 7430134, 6042491, 6280648, 592171, 6568069, 7386665, 260177, 8162793, 5396531, 2080605, 2879094, 6550355, 4316630, 4693187, 7227018, 1878178, 4062968, 660982, 4107999, 7342087, 143367, 5924700, 5292073, 5963544, 6392840, 1479198, 1674589, 6104642, 4482736, 8249291, 6361729, 1378596, 4908681, 4536361, 4362312, 7063547, 6487585, 6293197, 5083317, 1023209, 7483314, 7347362, 8016708, 6258737, 841418, 5986694, 8187776, 7314254, 4069187, 4777966, 1282229, 6849823, 3651546, 5167237, 448982, 1617535, 6148062, 2563831, 341348, 462953, 2726092, 470426, 4389745, 1897006, 4198701, 922933, 4832433, 3998732, 1019961, 4704547, 3686639, 1630795, 7480248, 4423139, 6066099, 1658452, 6587344, 2406221, 2616268, 3370493, 945748, 7548847, 3540138, 5497123, 1777802, 2285179, 6059608, 1116857, 276355, 847199, 470378, 380991, 2090624, 5511114, 5338633, 3294702, 2758899, 6750230, 7849133, 2519388, 5952859, 2024128, 2765296, 4432592, 4002463, 5501721, 8048477, 3042065, 1048052, 3038342, 317406, 5628826, 5089941, 2414816, 97410, 2666506, 5195965, 4308509, 5255146, 3067360, 3058663, 3154174, 4210082, 1201494, 335802, 4732686, 5599873, 1517675, 5649550, 82666, 8196174, 3041934, 1141908, 2422690, 6366263, 2276637, 4975039, 4811690, 4288619, 546780, 4828023, 849944, 2754180, 5503830, 1260152, 6280854, 4347769, 1714217, 7055213, 1845288, 6519162, 162994, 3813822, 2123297, 4083321, 94343, 2805404, 8015229, 1940844, 970280, 5414903, 3027911, 5144950, 5266658, 8296429, 7608062, 2147950, 3858856, 6791048, 4115046, 2360009, 1007126, 1420551, 6999770, 5397107, 3240435, 3315224, 5647378, 6172666, 4887504, 4141035, 2861062, 3122658, 4093908, 715621, 1714512, 4633066, 767499, 4331334, 2272858, 7241032, 3107744, 7800848, 6296453, 3911231, 3540601, 2068866, 3927560, 1040826, 2201935, 664526], -[7090291, 1989201, 6118115, 1476146, 7536419, 8322799, 5950956, 8267461, 7609389, 1431325, 112675, 8267806, 2877813, 4587228, 577546, 6811694, 2846461, 6055685, 1172044, 7701176, 350602, 3345503, 1484354, 4957584, 6104233, 8114112, 6390720, 8160489, 5543073, 6161915, 6908779, 3470522, 5663216, 1025863, 5518546, 179031, 5319046, 6492566, 4387380, 328865, 2385300, 7509164, 4523830, 1769437, 7305191, 1799542, 2579784, 3379695, 5023935, 5119468, 6440062, 2478574, 5947135, 958864, 180362, 983875, 3631642, 3133879, 7769249, 5795411, 418829, 3861659, 7308043, 2791794, 5470605, 828605, 2531813, 1043049, 4853410, 7922908, 2008161, 392887, 6419330, 6961948, 6912016, 224530, 7823713, 3084620, 5966231, 5456628, 939767, 226305, 243958, 3042851, 4844383, 1859447, 4688504, 5537197, 5850555, 5348179, 4615676, 1784321, 8078674, 4808530, 743138, 4156228, 6846512, 6273431, 5871168, 7755251, 5252026, 1891973, 7255979, 3093452, 6088132, 4544061, 6903402, 7069266, 2713182, 1732214, 3097381, 7338844, 3829305, 8201661, 1264893, 7370864, 1319291, 7615276, 7261221, 5162860, 3374788, 487509, 2734496, 4436233, 6454810, 3515043, 901118, 8015800, 1048476, 3640805, 1445919, 2573951, 41572, 4724743, 310668, 2494134, 1127574, 3700120, 1140349, 6456036, 363970, 3869283, 3279457, 7762368, 2866833, 6299927, 1719650, 4131478, 3913974, 116163, 5214814, 723937, 6021159, 7621537, 3356650, 4600497, 1298750, 2427630, 1482432, 6759971, 6863640, 6354088, 7045221, 662877, 6594395, 978353, 3130181, 1412508, 2686843, 6669197, 3433059, 6682135, 2522990, 8345241, 4097226, 2199179, 5021392, 1997087, 4416448, 1851497, 3676944, 4864657, 1591364, 2453500, 6349615, 4985104, 273089, 6509201, 142979, 5212001, 6724389, 6847978, 192405, 6975782, 4255889, 2256402, 7721989, 1586571, 6669505, 6615576, 2454479, 6254706, 6553216, 678558, 6052126, 197972, 5932736, 6717340, 4478648, 610318, 6591033, 7963332, 58445, 7514386, 7185820, 1503190, 3721213, 7131565, 7114576, 5410511, 4436485, 4755765, 3078576, 5879490, 397700, 1948141, 196872, 2587143, 3256582, 536885, 8291646, 4951029, 497181, 3717800, 1439253, 1539922, 2107716, 4688967, 7120882, 7560935, 928356, 5989369, 917995, 2455435, 2352765, 2883184, 2695744, 7213419, 4429725, 4589005, 8187736, 7721735, 7801436, 7824046, 6971001, 1076175], -[6562658, 4589386, 6234799, 7747056, 5404545, 2851093, 6252981, 7600008, 5648332, 7563286, 6404145, 7446438, 1037168, 5590589, 304912, 6960005, 5744852, 2746386, 2898502, 3422249, 8167784, 1309529, 2758962, 2671454, 4194029, 1085914, 797984, 1647852, 206216, 4073375, 5435427, 1499910, 6729526, 2635710, 5632714, 7529680, 1428005, 4103599, 3821554, 7098260, 465711, 2757861, 5446148, 3440599, 4530016, 7700119, 6190804, 861232, 3944011, 6180181, 7139693, 6235623, 2983564, 1706716, 6738505, 5250519, 1738465, 1270613, 363412, 6579829, 4925248, 3329734, 6411381, 1783469, 6605643, 1721359, 7398433, 6872567, 160503, 171249, 2336352, 7364444, 4603427, 1956714, 2766079, 3050834, 2233409, 1364666, 8266683, 7161440, 8350339, 3670932, 1703959, 22757, 5317210, 6512134, 5242806, 4243750, 6531552, 7312805, 7511890, 3287607, 767868, 4987844, 1938322, 277307, 3685347, 7676723, 6628398, 6580532, 1230075, 3836024, 701948, 149399, 3755502, 3370574, 3267189, 200216, 1632788, 796172, 6374951, 6761509, 8073339, 5555301, 1367489, 3701593, 6876839, 7391291, 2042009, 6628353, 6453810, 7228110, 7245753, 8098564, 7201603, 1493223, 1693809, 623301, 3445276, 1016451, 1475111, 3382255, 1203580, 5943013, 3043118, 1644084, 5771140, 3522427, 131065, 1126935, 4217440, 4984877, 4872483, 7793824, 1260334, 5232320, 5184612, 6915124, 2335251, 7318959, 6655725, 494764, 2819970, 2159975, 4308005, 4871776, 5668657, 4555501, 3923486, 8042080, 3351893, 8165657, 5047625, 2086590, 7434653, 290308, 6596745, 5204995, 1611056, 8223486, 3545529, 6785072, 6380045, 1672801, 1761495, 7561702, 6328723, 3819929, 7100920, 7760954, 998438, 7106637, 640831, 6285002, 1555626, 5308276, 1431966, 7121865, 6685259, 6267600, 424532, 4442371, 3188000, 1131698, 3361174, 473970, 2028693, 4594364, 101879, 7911894, 7849749, 3702466, 1929498, 7602101, 6438906, 8290092, 4622910, 5379401, 8277555, 6076121, 687759, 6303932, 8014870, 4304568, 6836794, 1534152, 6135528, 3561472, 8091493, 7321206, 5416391, 1911962, 7726862, 2606264, 6310349, 4307424, 179712, 5888195, 730849, 175061, 4954712, 2800340, 7000348, 7002065, 3643029, 7336409, 8327667, 2405013, 4737561, 7978872, 7558159, 2966653, 7609329, 2694919, 5579629, 4894203, 2124591, 1588521, 6168078, 1981865, 2604210, 817321, 4997594, 6341282, 7888693, 2178309], -[3291489, 355298, 6318436, 2743739, 2683026, 2452262, 4419231, 4318992, 3175689, 6158679, 6560796, 5470575, 7202885, 2142351, 1162017, 833132, 7115046, 1024202, 4011955, 1243334, 1566406, 7291028, 1800528, 7434535, 4753067, 6669087, 5157910, 1225615, 733758, 5059269, 1405834, 5737760, 1827199, 7429041, 4945180, 7288049, 4592238, 4669567, 1540085, 6732701, 5121778, 1176156, 6513025, 634514, 7058789, 3658132, 7299854, 3960003, 6337720, 6944448, 1572149, 6614321, 2327214, 6448700, 8211235, 1310972, 2861913, 240787, 2120767, 5811986, 3496974, 7830062, 1777202, 8295596, 5670692, 4565177, 7762600, 7384213, 6073137, 758809, 1562827, 3650471, 3230719, 6276997, 6364453, 7790129, 2165338, 7405311, 2523061, 5370921, 7308988, 6428925, 7636941, 3852314, 404904, 5787905, 2404242, 7669057, 6630597, 2045477, 1538028, 7178786, 4031242, 6868106, 1006508, 2894804, 5252844, 1540351, 6641674, 4819286, 3346530, 2127824, 292560, 8241122, 7089843, 3993080, 5335622, 6190000, 7762219, 4082211, 7182135, 4871977, 6074725, 5973764, 3437891, 510067, 2579299, 1383156, 1804347, 1625094, 3296368, 1998359, 1111718, 5523524, 3928799, 6662714, 7046742, 4716316, 6110031, 7745795, 6745752, 2759022, 4656918, 3932306, 2031488, 3772845, 3911021, 3007748, 7322319, 2757657, 566202, 7266127, 6770431, 866924, 5989071, 2932644, 8066863, 144656, 5453890, 1244952, 3957526, 5526654, 1226544, 2137720, 1884574, 8012225, 7355529, 5641775, 3474075, 5009081, 1422018, 3757299, 3895970, 5861437, 8267021, 2572551, 5122437, 8305441, 2795997, 6490598, 7850818, 7333662, 3652637, 4191273, 7561082, 5225217, 3614063, 6607886, 3498001, 966846, 5942594, 7337788, 3191805, 4224922, 5202069, 1688596, 1981936, 3862115, 6326591, 7265125, 4742705, 2774314, 5329378, 7112644, 2536312, 6976007, 8356455, 4102683, 7647006, 5160465, 4374949, 4683296, 4124670, 2441640, 2545570, 5622816, 5459400, 2598296, 1708806, 7250218, 360980, 4055939, 6637525, 498900, 7474442, 6365726, 3736619, 6265007, 1782616, 2229228, 7113972, 1439365, 4304835, 2717545, 3850714, 2426070, 635255, 7178569, 3647900, 1304479, 3620126, 4314908, 380949, 5261176, 2220297, 6801588, 319274, 5555023, 762561, 4283760, 7707711, 4155486, 7717787, 6062317, 5256117, 1494618, 3461102, 2150123, 2693569, 6246660, 5150462, 1052373, 6150796, 6409892, 6156663, 4125505], -[2318043, 7634396, 4128865, 1470370, 8206572, 4934646, 1248748, 7691275, 6739257, 2035651, 1186985, 64591, 6787706, 2783456, 2005998, 7121044, 2615939, 7792539, 2107293, 6455128, 2905042, 4871871, 119937, 255218, 2463182, 1894493, 1153410, 3578021, 5361819, 7504103, 2063679, 6813131, 1375990, 1337553, 4671486, 7911246, 5814813, 7039830, 5267927, 4867866, 4627304, 1274635, 29492, 6802158, 857730, 4742465, 8139844, 3784980, 8178018, 5230085, 678155, 1866601, 5002198, 292759, 119103, 4862978, 914208, 4463045, 1980598, 3763875, 8289289, 537456, 1396433, 7223993, 6028806, 7404699, 5722404, 1571479, 4536443, 5470083, 7393180, 782089, 7410085, 2580657, 3277785, 7604831, 967464, 6362582, 5870678, 5918271, 7761026, 2469347, 3696925, 4597721, 2199906, 146141, 7742163, 4407167, 1837463, 192411, 6087419, 4704629, 3296522, 3746844, 7564947, 2349514, 7338993, 2606699, 6572041, 7386240, 3431541, 5693487, 2761404, 3718757, 6438353, 4047003, 1448719, 7618901, 6713099, 1916112, 6713348, 6394728, 6287415, 4908384, 5238618, 5035257, 682648, 7642357, 6338709, 4266467, 464443, 1948226, 7034213, 3799, 4819257, 603692, 286512, 4613495, 6413019, 8093545, 6472938, 2713773, 7684995, 2988502, 992015, 7651302, 7549382, 6820837, 1077546, 3172635, 5812266, 4075566, 7605044, 3121055, 4797932, 4550027, 7869895, 2597491, 4130894, 5780693, 7380796, 1634434, 93222, 7331275, 2519148, 6961480, 7254808, 4925813, 28176, 1339337, 761837, 3735627, 1138328, 6127790, 2607131, 1351154, 789103, 2268991, 1650990, 1953390, 8129282, 140889, 3695278, 2577608, 85218, 6634886, 5256301, 4190229, 2427849, 1201555, 2142420, 6071051, 8096546, 924908, 4372138, 787581, 4282091, 2832449, 8024845, 3929088, 1779977, 5160502, 2968631, 5928748, 2422370, 890621, 54158, 1544166, 7992931, 562184, 5369427, 782984, 2939808, 6263502, 1767407, 3093903, 5483480, 4159618, 2831389, 2815050, 545622, 8152053, 3137421, 8337969, 1329605, 2005251, 1800340, 5750814, 4246108, 3440553, 7525381, 3794399, 661566, 3212729, 4884181, 8271048, 667405, 2531805, 8157274, 1036172, 7043646, 1070459, 6789345, 4781654, 1824175, 7878106, 3336934, 4519946, 3671062, 1902593, 4200439, 1713694, 3405389, 6746655, 7336880, 7879513, 6707627, 1062511, 2028245, 1188314, 1792884, 752605, 7901641, 7147858, 6152594, 8343818]], -[[6751095, 4795203, 885047, 7940309, 3478932, 3238845, 863413, 7851412, 6543404, 1357512, 4757923, 3430655, 3676858, 1096643, 2035346, 1725087, 3507397, 879250, 2288486, 280410, 3000791, 1984678, 1373405, 7853247, 4736334, 2332728, 2350953, 2186166, 6808659, 7979162, 5080950, 8143904, 7268047, 5605829, 7908376, 7948657, 6561944, 3135604, 2691985, 3994273, 1821263, 6695907, 3712683, 7708795, 3716683, 433189, 4666287, 1892953, 1205689, 1884751, 7742487, 4865850, 7322163, 4706767, 6052298, 4627777, 3847127, 3228439, 7721549, 8117503, 2882600, 4816017, 1510540, 2317754, 291126, 5849360, 7724084, 7403677, 104336, 3619157, 1202556, 1110298, 7841957, 4238043, 7393146, 1968558, 3168770, 2877227, 2714562, 944233, 5588351, 2384955, 6110746, 1965275, 491269, 295712, 6818342, 291487, 5020579, 1971892, 2059733, 6497678, 4047600, 7556301, 6539029, 2338681, 4043349, 4364643, 347335, 3195915, 239945, 8332701, 517255, 5605823, 7357017, 2734022, 8202537, 6301241, 8111641, 3110622, 2239943, 2802622, 2202877, 1688656, 5280977, 6759869, 5804947, 787123, 5042862, 4689223, 3934824, 2819262, 1273265, 5904214, 489859, 4147976, 3948606, 431460, 2439562, 1903663, 2840047, 8287966, 5297735, 402689, 1502823, 3587927, 6606677, 4816862, 8047747, 5965768, 2650493, 4630375, 6813294, 7124647, 1033707, 2825313, 8177791, 235634, 3212471, 3215376, 3035029, 6311988, 1086544, 5212123, 217492, 4333461, 5296456, 238495, 6728832, 1018752, 7972486, 4044650, 4886825, 5510336, 2219791, 729333, 6868987, 536484, 5733946, 3233489, 774738, 1349325, 400438, 3636645, 7554378, 6015410, 3532873, 5538835, 401019, 2883838, 2723643, 6607023, 5519380, 3094919, 6027316, 2685918, 2909373, 1415425, 5240992, 278754, 2345667, 6235146, 7620696, 4121899, 4502119, 2555363, 664532, 5547725, 2628573, 7180606, 3391994, 5424680, 3210167, 2042474, 3769922, 5621045, 4201283, 6594107, 2133648, 6931021, 473998, 4046819, 1403445, 6255888, 2137075, 3652598, 824511, 5254020, 6063424, 6057342, 280780, 5740573, 3672971, 7403778, 119374, 848070, 3299338, 6886103, 1900989, 3833782, 1207252, 1822715, 4606129, 8294995, 933298, 5445054, 8026640, 5049098, 1682529, 5876662, 4810134, 1592882, 1511200, 7136876, 1331216, 3121004, 5162348, 2518345, 5177633, 1545182, 4734107, 4125372, 7565800, 2987938, 223471, 7434975], -[6476891, 1272736, 6895586, 5995035, 3702657, 1401339, 2764560, 2935833, 6056732, 5204200, 7883077, 6613066, 5655867, 3999117, 7461239, 25070, 661785, 6153359, 8246781, 7146281, 7007317, 1650728, 5956800, 2758622, 5034532, 7065320, 2124924, 3964137, 965414, 1625485, 1733553, 7504007, 6551472, 7900070, 7482544, 793905, 1026118, 1571976, 3913244, 2822754, 777321, 1024911, 483321, 6691468, 6102271, 3558611, 6695078, 2093271, 8278712, 5208811, 4569412, 3656736, 4554180, 377091, 7861784, 6083642, 6561199, 7078199, 7223561, 944610, 1137887, 4395992, 7543311, 4133130, 3287430, 7753270, 734286, 602206, 4091314, 4514852, 3320601, 4331908, 4309428, 4333282, 6969814, 2354487, 2453465, 728783, 4025949, 5329756, 1281858, 3912836, 5407965, 6967513, 2082577, 5564225, 86243, 8065043, 6542808, 6112996, 3334872, 8273080, 2332332, 2278327, 2140087, 461490, 5681877, 8086723, 7178764, 7215555, 1999691, 5462873, 4779520, 5038401, 2072430, 54234, 3458740, 6841286, 195726, 4711342, 2673222, 6133969, 8157160, 4522306, 3172419, 6118689, 3671789, 6016236, 6690747, 4767189, 7629121, 6638934, 3448050, 116322, 672154, 7126721, 4383307, 4043477, 3840265, 3429511, 1204334, 6102473, 5091034, 1963914, 8272802, 5960368, 1792045, 5960367, 7552500, 1008550, 5659021, 4128869, 3311842, 3127272, 3788843, 7450387, 3411140, 4866745, 3947284, 1004443, 7011341, 1282024, 1380404, 4314417, 2976249, 920749, 2695644, 4653367, 2153892, 680205, 3949025, 4846090, 3013192, 3437938, 5853869, 2110353, 2018090, 5642105, 2061456, 295805, 7281932, 2190730, 5469153, 2801403, 2644754, 659541, 6421762, 6108961, 3861817, 4543297, 6832299, 5496097, 2903780, 6527846, 5006095, 6477294, 5075665, 5529606, 1913399, 313944, 2485155, 8043278, 3403779, 2005266, 3388133, 3669212, 3135482, 341739, 292356, 6260799, 3101772, 6218234, 267767, 1689670, 963126, 1799986, 7748068, 2475689, 4814367, 4782406, 7834185, 3228347, 71406, 5096387, 1015713, 4204839, 4380399, 3017429, 5278885, 1329709, 2741256, 8352956, 1789673, 1705272, 1296461, 4014281, 2025872, 4521377, 4560695, 2745517, 3802749, 4941885, 4810271, 3945148, 7710417, 3894015, 4735556, 616183, 3133252, 1730823, 5185677, 6729885, 3704649, 6951087, 951499, 1629073, 3551815, 4971465, 5156933, 6963295, 3240860, 2262626, 7106398, 8294249, 3311636, 6982187], -[111619, 1676994, 1098033, 7710340, 4760347, 6602290, 7315031, 583574, 1626727, 114820, 4149543, 3038751, 7361786, 5735246, 3890677, 8012447, 2604931, 2684764, 6581247, 4394982, 7701225, 7909965, 7526721, 5118485, 5320434, 5698954, 5349329, 1473466, 3400943, 412228, 4770835, 3459174, 2095715, 27144, 4941901, 8140658, 7117633, 7432500, 8265263, 2725505, 7151706, 1165339, 2214439, 4267376, 4437403, 2692371, 4311270, 7136977, 2521293, 8227583, 401703, 8360516, 8261995, 5781447, 7086980, 24140, 4828655, 6050732, 7958, 5310267, 6805324, 3332368, 7096315, 2010763, 1779478, 5507514, 817253, 8003762, 3812905, 7138960, 6221024, 2603806, 5800256, 2699033, 1168661, 865306, 1017725, 1362241, 4594286, 2153557, 2753094, 636703, 1917776, 5222181, 3814607, 6597777, 8336267, 7372776, 4797723, 5145069, 4398226, 4477675, 7138360, 5104574, 92449, 1541680, 5146709, 4714944, 1340886, 2521418, 6210599, 6763988, 648010, 1210506, 4522327, 7220120, 2539632, 5502013, 5429101, 7297533, 2330200, 801829, 4307704, 1564563, 7660938, 1486554, 7085516, 2067582, 4177849, 7771615, 6902300, 3782060, 1780540, 3387065, 5338543, 3783816, 1808309, 5025146, 5497441, 6669583, 6440450, 1387637, 5308114, 5958104, 7962645, 5297694, 217910, 5818179, 8107471, 1742062, 3323546, 3205566, 5438963, 865402, 5244058, 2129686, 7648350, 7525973, 378679, 1639334, 8106734, 6638892, 5592849, 2137207, 2385452, 6482525, 4479444, 2617984, 2137320, 2658402, 4812798, 2509087, 5945382, 3670439, 4705473, 1142377, 8201723, 1045729, 2362050, 6678922, 207442, 4363495, 5593076, 3950996, 1424564, 1439296, 2428094, 575177, 1048, 2632687, 7183292, 517156, 2866908, 4019740, 5485492, 1630403, 3854222, 7494081, 2613643, 39814, 5570057, 2565918, 5594189, 8256879, 1437564, 4428191, 4695604, 3325202, 7999642, 7620225, 5072968, 1209312, 7771244, 6978854, 443972, 4372896, 4087611, 1887400, 229728, 7586330, 1123133, 5814707, 6081995, 3186047, 3477409, 3860170, 6503187, 4480135, 95838, 6350297, 1229136, 3623912, 3682561, 6224580, 5762404, 2480050, 247450, 1613365, 2351719, 6229159, 2065951, 8148746, 4567389, 4524949, 2421069, 7709944, 5273185, 978712, 3282297, 2052230, 96588, 7056422, 6939803, 3227456, 5376329, 656857, 1707491, 2361931, 4749949, 6452618, 309084, 6722262, 3919921, 2719174, 368589, 3099014], -[1440271, 5728915, 6744425, 5387316, 2224474, 3278861, 7884805, 2439391, 4207727, 7990031, 6602542, 6027830, 1622622, 420242, 3955074, 7508794, 3594656, 6506828, 5210271, 1641300, 2002611, 1890290, 7165934, 4864127, 7528599, 5159198, 7411610, 1600681, 8097738, 2775133, 5582741, 6756740, 1472117, 44100, 5121027, 4737891, 6721415, 8107516, 7749325, 4166297, 623411, 4332720, 6327763, 3851672, 1830623, 2567124, 2086122, 1655603, 4987454, 7553431, 7074153, 5497490, 4315022, 1170125, 2999857, 3513096, 3077743, 4365435, 2656943, 4567950, 8261950, 1428889, 1945783, 3505370, 827025, 5490949, 1463425, 6913993, 4490590, 3262197, 6723810, 5270961, 1693688, 3194706, 7870375, 282821, 8154936, 5439411, 7346416, 2322829, 4498397, 4448288, 4926603, 412709, 1467492, 1744393, 6324381, 6807702, 6698955, 2836148, 1098737, 7787632, 5600183, 371117, 4441500, 2874651, 6341038, 3413325, 2812055, 5535489, 624307, 6650283, 5199110, 2376768, 5823438, 6852952, 1630717, 6391776, 6510242, 1486924, 5867609, 4047369, 5837502, 4363815, 5387744, 8289435, 7811456, 1511827, 5326328, 142721, 6737079, 2641974, 4083182, 7422018, 7730845, 3724776, 4416264, 3890631, 6679547, 1921729, 4035936, 7817015, 5181126, 5020502, 7595951, 7975474, 4893442, 1576956, 7209064, 4364720, 2438984, 2032332, 4744565, 4688186, 5703513, 8100558, 7230920, 3311055, 4439061, 5635770, 3899831, 1885655, 617854, 1255288, 2395895, 3631106, 1570697, 4396400, 1695570, 4407054, 5299201, 7882535, 4034632, 2725065, 821406, 5826558, 7013710, 5380165, 2386136, 5192039, 5084403, 2421784, 2808044, 6011123, 3873461, 1249881, 6209740, 8219344, 6974819, 7235173, 8339928, 2076486, 1733701, 8084269, 6959599, 5771827, 5707238, 93481, 41310, 8061116, 2085879, 7141713, 7677783, 5843820, 5992287, 7737448, 802522, 7052498, 992924, 841287, 5500278, 1329849, 3629010, 5377923, 4811434, 5232705, 925726, 2674185, 4741592, 5814553, 6329610, 4618171, 3774201, 568387, 8148374, 3064425, 208034, 7527510, 5217180, 3572150, 5711951, 7035536, 6239242, 8294020, 8074928, 2103706, 6772843, 1083972, 5009329, 3177257, 6149619, 835559, 1011387, 7414590, 3597950, 2542614, 2691486, 7159129, 2652292, 849763, 6607563, 1830791, 728450, 4795880, 7201012, 6741918, 2307056, 6694005, 2205922, 6343351, 1940664, 8125548, 2213634, 519296, 6398731, 1742236], -[6370436, 182888, 7464879, 2196521, 3016161, 5710855, 2178731, 5242891, 7175646, 3376572, 692652, 115256, 4681265, 2327364, 2866131, 711001, 2543099, 3952645, 6873295, 5874177, 7842267, 7460562, 2103889, 5307755, 2748798, 5682641, 2064938, 994731, 7316148, 7724024, 6661771, 7891061, 3333696, 3505649, 6523273, 887444, 6717279, 2121048, 2210738, 4195354, 6759001, 1863853, 376520, 1308760, 7186525, 4452157, 783534, 134073, 2252782, 1339413, 1861831, 3241553, 5573493, 3828234, 2542644, 6324500, 1571161, 2652195, 2037112, 6669366, 4686981, 2056409, 1564989, 7246088, 3488787, 2424423, 623278, 140110, 3051064, 7864232, 768386, 1315674, 1511982, 7121946, 1538112, 7211115, 6300123, 3663354, 1726877, 28613, 4445831, 5273734, 3002191, 385451, 5009543, 4747052, 499099, 4633017, 3164423, 6692198, 1151832, 7368178, 1730215, 7593663, 4420845, 6559731, 1778274, 7733518, 3493353, 7115783, 1328832, 2776578, 4566058, 239026, 8259472, 6553016, 6416483, 2929324, 5498164, 6281446, 1943822, 4238161, 963731, 8064601, 2622570, 6355087, 4337091, 1503751, 4093881, 291377, 5411105, 6900748, 1285139, 2996804, 1639018, 4451582, 4467082, 8097000, 4047496, 2908878, 8338836, 2089162, 3783940, 1771450, 6799800, 4997128, 5100179, 1796653, 550299, 1219994, 4008138, 383514, 6311848, 7640655, 537625, 4510206, 1034153, 5330904, 4657692, 3396866, 6742694, 4497646, 4217863, 2007116, 3072597, 8067082, 1109224, 5139740, 7294832, 3383664, 2509457, 3744060, 6408599, 1302642, 8329512, 4588043, 1102524, 4964929, 2821649, 1823572, 6767145, 2586648, 308995, 4776529, 8157535, 4316630, 4735203, 1011890, 2695909, 5143059, 7353613, 724804, 3130264, 5338244, 8139815, 4239395, 6222159, 4321803, 8322735, 6234963, 6507140, 1842719, 5625545, 4511207, 3406794, 8020465, 3309806, 98342, 105605, 361485, 7289774, 7343717, 5474574, 3382938, 81991, 1648491, 6095443, 1708831, 5419209, 297297, 877589, 1901449, 7055875, 4390177, 7180193, 3813482, 623224, 2133247, 5237295, 2580078, 8297584, 8140553, 2207391, 1791402, 469374, 1258826, 4457375, 7059905, 3903672, 7032837, 2336308, 7562556, 549571, 3207520, 6897500, 2374073, 2525078, 2405454, 866625, 6922550, 4767212, 3713596, 6227576, 6905221, 1758141, 3361235, 6912194, 4383639, 5525742, 3496007, 5593733, 4665592, 7956024, 1706800, 7680460, 1302122], -[5188684, 5135238, 2297957, 6853152, 915652, 396775, 2807763, 1583950, 4150010, 3415769, 7391999, 6813601, 7072294, 5490506, 2824855, 49545, 8264355, 4098461, 4777510, 6500465, 1428602, 1855085, 5447637, 1145048, 4935218, 5419327, 1677402, 2990969, 1051297, 6256614, 5530434, 5012074, 8075416, 1304490, 7707684, 5299912, 5734297, 7846005, 5107826, 213311, 2703934, 8005644, 5214795, 7613563, 1212925, 8125766, 1361743, 4455087, 1496409, 4410391, 4436496, 8283312, 7151812, 5539885, 6707432, 7994726, 7095397, 6192040, 5077777, 5577855, 2869095, 4047545, 8189070, 6220763, 75955, 4385765, 636052, 4572864, 2066601, 4508464, 5945656, 3324303, 6189266, 1287276, 6926910, 8210694, 3218693, 929109, 2972097, 5072056, 769760, 5472836, 2286651, 6514537, 3099230, 1663793, 1719663, 8192586, 338385, 6428412, 7306278, 7668214, 2508447, 5775485, 2913751, 227433, 159552, 6590226, 5599974, 5442169, 4795632, 7948716, 2136690, 1391615, 5475437, 1731855, 1108447, 2259297, 1328225, 5226910, 860282, 8323024, 7020816, 714547, 5708399, 6831589, 2230688, 7522236, 7411356, 4143192, 1206109, 3603321, 5592645, 6391587, 4782316, 4232161, 5108558, 6948077, 2233238, 8371438, 4040646, 6319502, 6702108, 6942376, 2186013, 7048495, 6011145, 7920113, 6182143, 1142088, 3001344, 888009, 2366964, 3813796, 404752, 186801, 6710043, 989313, 2939002, 1540143, 203997, 3992775, 1019585, 7467304, 6273972, 8226276, 6835853, 5683825, 783467, 4779036, 6538227, 6581944, 1311199, 78493, 6255063, 2786811, 4880643, 1671827, 3209645, 3753049, 7382031, 3385531, 4736602, 4517108, 678625, 7688556, 7048041, 8268232, 4313694, 1346460, 509573, 4695861, 904968, 5515360, 4197105, 1429467, 4196332, 4508373, 5323233, 2096377, 1723206, 6385954, 7562597, 7740186, 5645050, 7979631, 1712487, 7263435, 4077406, 6099701, 3720423, 5030308, 5225176, 3492173, 6042577, 6819292, 4602024, 1753319, 6095055, 5107877, 7544405, 793939, 2432377, 5345564, 1069504, 3431216, 3026505, 5635957, 6427472, 4422110, 1516109, 3010762, 4798740, 1636871, 2261079, 666510, 4979533, 2771542, 1603972, 7448104, 4134703, 7842028, 3607408, 4855718, 6830817, 7330854, 1180320, 8342148, 8202896, 2103302, 4726766, 207074, 4336685, 5301805, 8017531, 3207765, 4800668, 4566823, 5510486, 477610, 1241002, 2889600, 7107733, 3843327, 808457, 6037945], -[7393218, 1010544, 3183488, 218660, 1441560, 7836839, 4983576, 4533836, 4969688, 3733928, 6869004, 5587507, 3764032, 4131977, 3851001, 1453460, 5118791, 3854553, 2073971, 2228573, 6929473, 4323941, 7733547, 1524685, 2865938, 399231, 5733417, 5736532, 417290, 2588427, 6919824, 71817, 6867722, 4383823, 6190831, 7968742, 2026367, 6042561, 2146353, 5878182, 4203143, 4541042, 6083522, 4939206, 3988980, 7283451, 2999672, 6853643, 8182666, 1151008, 6527229, 6864305, 2819138, 6714176, 1288565, 3207889, 2065181, 916640, 3059622, 1598106, 6112770, 429106, 969034, 5076607, 7130262, 2339937, 6908584, 749908, 6922910, 4837313, 6383853, 4326285, 750885, 6416544, 5486858, 2293387, 7413210, 6218001, 1596253, 1976809, 2120109, 4792013, 2612340, 5217977, 7350753, 5974215, 4446632, 140160, 2585069, 3101378, 2755997, 4206147, 4253155, 5845946, 8107194, 1963949, 3871759, 4881533, 1652782, 7983440, 7685161, 4284228, 5654027, 7044660, 1583462, 5104430, 7834647, 2532939, 2841082, 5057887, 1823885, 6823299, 2144802, 228342, 2805703, 573965, 3727947, 4627422, 1117472, 8300813, 2533346, 3635354, 4840010, 5144115, 8284731, 5033354, 2163030, 5590009, 7644617, 4960397, 3407240, 631099, 7524712, 96012, 3605586, 3082542, 7905016, 6199246, 718259, 7694530, 3956311, 6266425, 1150139, 8084362, 1915011, 2644793, 5243211, 3139878, 2689012, 1286078, 4451144, 481318, 4632259, 8335499, 6855889, 6500657, 8194073, 3641807, 3933466, 6943907, 4783841, 689874, 7223634, 2127663, 1553196, 3446462, 2093820, 6158213, 2446582, 2581522, 7758883, 8305768, 3764022, 8326987, 2982826, 6419194, 4128593, 658068, 7600883, 2259852, 2916371, 6336323, 4427505, 6009050, 6598145, 5442426, 8356766, 6331308, 1923665, 2062793, 8133521, 1321759, 1984376, 1476431, 832971, 4118161, 1757245, 6384005, 314822, 4708615, 3648245, 605737, 5968656, 2276625, 7434635, 1038395, 695736, 2330549, 3838059, 3828632, 3673039, 878015, 1331304, 8266234, 656965, 4365274, 1078122, 3717961, 2481642, 3895505, 8269144, 4792734, 6966191, 4643038, 4611752, 2812883, 1283788, 7402851, 2675286, 7957640, 3306450, 6993067, 5590700, 1584176, 5971990, 2948979, 2207517, 5592115, 3090390, 8238826, 3141801, 3497152, 5500832, 2763996, 2426928, 3522197, 6429592, 7644530, 6766918, 7615983, 7988132, 4084939, 3031288, 5365043, 4759102, 3014436]], -[[3370263, 1299342, 5032432, 7061446, 6126697, 6765940, 6437056, 7315301, 4981667, 2489899, 3182661, 1225959, 100414, 134135, 2004517, 3625453, 578729, 6939089, 4536144, 2456983, 3387733, 6724231, 5731499, 5173368, 4730278, 3814469, 8167680, 2279258, 8049541, 742775, 7581054, 7256159, 7971096, 5079182, 6344532, 508911, 7301600, 2795538, 5234115, 7367426, 6346625, 7453439, 2412006, 521226, 7980331, 392874, 7570550, 4793369, 3728966, 3234210, 3425449, 1022433, 2375398, 3377419, 4509020, 6722704, 7724484, 2351714, 1528176, 1073572, 7674001, 8110410, 500114, 303841, 8214655, 7101694, 826539, 2394823, 825759, 1586550, 5547245, 6992106, 1243916, 1890801, 1241774, 5360335, 7989979, 6152430, 7841138, 1770796, 3144485, 7808898, 664244, 4726379, 7416723, 1199638, 4059396, 573458, 4297269, 6586347, 5159968, 7751445, 13923, 7178485, 6174051, 3787674, 240725, 4186665, 4402460, 1591098, 288813, 2807572, 8290861, 5059356, 5063924, 5776449, 4436483, 5864031, 5409614, 1281189, 1295414, 2173938, 551794, 2051025, 776118, 4472346, 805703, 580048, 3225194, 7595431, 7108433, 272339, 6702207, 1142788, 63817, 6823331, 1916328, 2663113, 2711045, 1259772, 8131532, 8088118, 2963971, 3078835, 7413207, 8010696, 220298, 2297499, 4892617, 1879194, 2218141, 5853492, 7734517, 4957669, 6045751, 7552485, 1197893, 5406474, 6568777, 4209272, 5539442, 3502497, 4800896, 6527371, 7003313, 3254711, 3623152, 3820113, 378599, 3456670, 5306285, 5213009, 757733, 6552657, 7765895, 2487483, 7938810, 2860798, 3368951, 4464133, 627361, 6560682, 1662374, 1223048, 564743, 4435405, 3081744, 1490237, 4258025, 5994084, 8067940, 8074694, 5688845, 6084869, 652500, 1382884, 5414137, 2001653, 1272341, 6870987, 8271120, 5730142, 4481312, 1275364, 5380118, 7671022, 5982366, 4186302, 1357454, 5900277, 7381177, 1159252, 4699439, 3786881, 5363490, 6406565, 4617969, 8248384, 4929029, 5919827, 7562778, 165143, 2202408, 989063, 3686245, 5442312, 3393707, 5488221, 3934599, 3037552, 219778, 3432133, 7156069, 4045239, 6166246, 5141467, 6450221, 6664669, 4545185, 5563393, 6940125, 7815759, 5068078, 3999753, 6394938, 2149591, 1848783, 2658595, 4988305, 6439136, 6660796, 747320, 7512029, 2274920, 6997800, 1067768, 5919123, 4928164, 584410, 742930, 6419491, 8189549, 5784638, 6364383, 1279991, 5426589], -[6486891, 4134635, 6662125, 2267307, 1485590, 4866120, 1942594, 2315799, 4549479, 1310108, 2865296, 7414502, 4158063, 5585248, 6904333, 4709561, 6522755, 7391681, 662500, 6919424, 1242586, 7982493, 7840114, 2124013, 3424444, 6579333, 5367006, 4153374, 7163413, 6726895, 84724, 919943, 5497524, 7270822, 670241, 3864373, 3346706, 5996766, 2412285, 3829599, 4858004, 5057848, 780037, 5046363, 5183361, 3135466, 5577767, 818796, 5038430, 6809301, 7318763, 8125019, 4066804, 3466827, 4310899, 4287981, 3521391, 7907687, 6770724, 986189, 164639, 1475778, 5264157, 7908300, 5086771, 882803, 3612346, 2065187, 4710360, 3274338, 1295124, 2161795, 849661, 3174432, 5999437, 7487091, 900155, 1450944, 533484, 5211631, 666194, 5789488, 7530482, 4301058, 4783584, 7920266, 6702854, 5599039, 7273077, 1782238, 250705, 2442885, 1709783, 201696, 5569405, 2242299, 5760132, 7265903, 1737699, 6441095, 6089094, 5569757, 5917349, 5450989, 1063932, 3251013, 443637, 6124621, 7959269, 4991146, 5731727, 2615447, 2156300, 3178573, 285810, 7293436, 1844124, 5593131, 772619, 3425537, 8365223, 8149101, 6293446, 5880537, 460898, 1857027, 5221106, 1586575, 7251322, 3417109, 8059674, 5951072, 6849694, 1783382, 1403634, 7651653, 3478968, 249491, 4472553, 1726046, 7217115, 6111415, 5832718, 4082258, 4822680, 205835, 2593960, 4825894, 2836919, 8198750, 5698654, 4516557, 5665758, 4116568, 2599079, 6496023, 3940040, 2766724, 6274875, 7061605, 28616, 2509242, 5249922, 8297378, 2361152, 5057827, 6142467, 301752, 7061292, 5817479, 1253298, 6303816, 7775455, 5316596, 5341496, 8124618, 984136, 7503890, 1462637, 4485311, 4279213, 6224857, 934511, 1243241, 5967475, 5025962, 5379516, 3603492, 242553, 4151226, 41772, 890208, 1813771, 2011794, 5554248, 5881586, 7663788, 4130647, 4671251, 3634669, 521215, 5300628, 4615848, 4755718, 1176214, 4367269, 2461989, 696253, 3868849, 7148228, 3388382, 1505924, 6867076, 4168625, 5713705, 2486287, 2849323, 2640768, 4010455, 8239474, 326057, 6881231, 3209082, 6201440, 561880, 6246623, 4351250, 8192610, 7738037, 524215, 5374035, 185308, 4055774, 7980145, 7933828, 8001448, 3512516, 446900, 2421450, 1951241, 1269221, 4824212, 1632840, 4115509, 4040146, 3952078, 2277565, 5557504, 2420974, 5088619, 6694090, 6620405, 7294355, 687112, 2660872, 648892], -[3441553, 3979285, 133147, 5349434, 1017619, 2776213, 4142221, 3803179, 4540498, 5675471, 6470991, 4841527, 3357281, 7357435, 2894473, 7900698, 3169619, 5713251, 3118857, 1277342, 415609, 7220625, 6026701, 643116, 6097489, 7727734, 4065351, 6375860, 8117575, 4545678, 4333574, 5110984, 3598055, 7581953, 2439618, 1863069, 1449982, 1349515, 530357, 5619299, 5469847, 479772, 3081697, 7956057, 6309245, 1706839, 5622278, 2183376, 4213386, 2181687, 1396500, 5887806, 6740532, 5931761, 5967880, 1770294, 6007649, 7580694, 3430048, 4800265, 4891315, 5685215, 4919189, 5798984, 3538331, 8313848, 7969850, 7988911, 1608787, 3293872, 772400, 623896, 3728568, 5454949, 2814662, 5165114, 1742262, 2374598, 1642942, 7894219, 7322533, 1949042, 2448548, 4638378, 7962919, 6629587, 4951618, 4277901, 4652755, 2201231, 7749850, 8293548, 266824, 1888667, 3087474, 7102866, 2916373, 6522551, 6817945, 5223176, 1638848, 456022, 5003183, 6602242, 7404340, 4592256, 2167063, 6541547, 7976695, 386098, 5949474, 6177768, 2993831, 4216730, 3627729, 7464546, 872995, 6822210, 4862710, 3810456, 4994117, 3955423, 1509830, 2545105, 372891, 2509240, 2575381, 3430551, 1832096, 3427950, 771891, 7635736, 4430734, 7375712, 7150891, 3871714, 2369104, 5171594, 1359332, 4437796, 6942610, 3366405, 5931856, 4753520, 4961026, 5091945, 1885608, 6671291, 4423946, 5776029, 3298572, 8233382, 4931343, 5362711, 8111959, 2776709, 5390292, 717530, 6588152, 3095563, 3804043, 7346099, 2478173, 4461446, 2083375, 157666, 4793003, 3148614, 213230, 4593374, 10063, 3749586, 3835925, 3801118, 1127922, 2864566, 6785763, 7113581, 787089, 6465796, 7798302, 3835108, 3347848, 1305703, 6241286, 4328459, 8284094, 1327814, 1711177, 1795444, 665896, 1351202, 5885776, 5854065, 2797435, 1496487, 5102304, 668646, 6868654, 6333796, 3047870, 556935, 2479556, 8220176, 6155594, 7741281, 482135, 6960884, 1194451, 5715420, 3695884, 6075020, 8092721, 3222329, 3025710, 7599302, 1521787, 4912624, 6041466, 236583, 7253076, 4410617, 4101159, 2014830, 3109051, 2771533, 2807780, 3405961, 1293401, 7737756, 5592598, 3152558, 1464853, 5780958, 577125, 1681876, 3673899, 1739891, 8118368, 4230372, 2945845, 8260598, 6813870, 1723907, 7390798, 6010412, 754533, 425234, 6806744, 5113717, 361194, 7065522, 120535, 7426601, 1508200, 1582144], -[487068, 4872182, 3989539, 6199493, 95514, 2737219, 5857363, 6680601, 622058, 1133125, 5273818, 1409124, 1358525, 399396, 4353870, 3231532, 3310152, 6974637, 6200098, 5546740, 691227, 6643278, 354333, 7205498, 5548124, 1903322, 4247416, 2874696, 1186573, 7174683, 6107693, 4908518, 7164153, 5974054, 7028793, 3174692, 4392813, 5213258, 3705591, 2106541, 1319290, 5737421, 5688327, 5577885, 5337155, 2730292, 4246605, 2538795, 772522, 7508220, 5255561, 3312279, 4583530, 7160014, 6336223, 4594751, 3723083, 436532, 2369653, 1912121, 2535519, 1619808, 4779908, 6759677, 6276297, 2386901, 6087741, 1450686, 5165245, 1738944, 2672610, 4238194, 3590303, 4365412, 7218300, 2493194, 3879852, 2407856, 2644048, 1974150, 5152025, 7010351, 2354088, 4007288, 1047338, 983944, 513507, 1849449, 529633, 5994969, 4647398, 5379193, 7552795, 6049401, 8336049, 6279915, 4519899, 8310840, 1158628, 4696338, 4907405, 7236116, 7211083, 4811923, 5276319, 7742602, 3461985, 366427, 4378192, 1671837, 393983, 7094048, 3666886, 5354669, 1491114, 2712512, 328250, 6009111, 8104441, 6232089, 2698106, 3628631, 5255690, 6883789, 7316359, 3587755, 5963485, 4919045, 6687792, 4109601, 4412564, 1912747, 7262334, 5347955, 4426786, 311241, 332959, 3580117, 7276386, 6903712, 4781318, 2246500, 5811249, 1577361, 4858340, 3682371, 7810555, 1286787, 7171507, 4554132, 3627523, 6865068, 3273788, 6163772, 5856193, 1217427, 659399, 2272128, 437058, 2563401, 6672872, 3627954, 7473688, 5415216, 5271923, 5463356, 2128542, 8358876, 4291261, 5793229, 6260387, 3070863, 5090012, 3185548, 1932542, 4399391, 7598852, 4844478, 3259610, 2736770, 6860609, 3091564, 8240410, 7664840, 3747418, 6745269, 4081088, 2266090, 3306751, 6007412, 1039428, 1696325, 2427732, 8171600, 1787865, 1031445, 2893969, 5429540, 5990122, 3075135, 8014552, 2115921, 5038113, 5064367, 1414699, 5405798, 7454758, 3962826, 2159435, 3276562, 4616159, 4853070, 6260083, 5432963, 2240173, 4307068, 296823, 4571915, 620118, 5217500, 7037946, 7320181, 3770120, 7678233, 5514933, 4895649, 4257799, 3313641, 2227804, 5403601, 343819, 7346391, 7109382, 6279623, 2104229, 6555309, 937478, 8252972, 7190254, 2664726, 6348362, 4726872, 7110892, 7536209, 484507, 4761687, 3384015, 364756, 1971456, 7569751, 7382717, 3201109, 357990, 2987105, 8288771, 3630083], -[866447, 3947679, 1769457, 544454, 319297, 5389592, 3919245, 1952922, 3937569, 3387302, 4847677, 5140047, 1861483, 3601976, 414205, 4130652, 3626428, 6927278, 5260596, 7361355, 3627341, 5708923, 421046, 3703726, 1306583, 1837160, 3945516, 5411417, 4409756, 4215664, 2431852, 4063280, 921951, 47571, 947720, 8270019, 7197412, 3049706, 1270261, 4652623, 6912549, 5555621, 6696417, 2154647, 6040628, 7598532, 444172, 3049526, 5794903, 5920103, 6354485, 2717719, 2207372, 7556334, 7868006, 1461599, 3013143, 1801908, 4849285, 463172, 1739405, 5179098, 4289047, 7100056, 5813131, 6637292, 6170526, 446737, 5332989, 2674163, 3925636, 6804718, 2638722, 3748940, 6367884, 7322326, 1516153, 852415, 3451688, 1318027, 2645531, 2519773, 7598657, 184929, 4488231, 6768979, 1011689, 7290243, 2378310, 7475067, 7873783, 3656638, 8186730, 6743149, 4188385, 4051391, 7858336, 1381129, 7660103, 4685916, 1504622, 4384716, 2975229, 1474990, 4694943, 4094186, 8072676, 3294041, 8025753, 18461, 5690362, 45376, 4607830, 7530916, 3347828, 3690910, 2351029, 3669517, 2181843, 1110894, 8195706, 6841683, 32192, 2254708, 224086, 5930798, 3526744, 6536872, 5667114, 3226430, 3006410, 664562, 7917881, 693785, 6967946, 3552647, 5908198, 700826, 3161048, 5312239, 1797094, 6314893, 4667552, 7420950, 5090698, 3189713, 7192755, 919644, 3597773, 3931684, 6175687, 3920149, 325368, 8256184, 1287962, 4160480, 3325302, 6884333, 4452767, 6947824, 1330966, 1927529, 4150262, 2848542, 7887260, 7374041, 8268955, 6012176, 215748, 5791198, 5782089, 6301537, 6017312, 4065444, 2385270, 357938, 5847966, 882968, 4176509, 6192628, 3615277, 4844233, 4905553, 7067094, 5843983, 3494509, 4799205, 6141654, 5851709, 3640179, 6424051, 2432810, 2548809, 5307795, 6785641, 3191344, 725500, 2132647, 2069807, 7959108, 492023, 2928847, 2597774, 4648793, 8086471, 2731366, 4111957, 5296417, 2359449, 5718971, 95783, 7734177, 331516, 1420844, 3176128, 4010975, 139119, 40913, 350585, 2518210, 4472044, 4533156, 429368, 552783, 8018912, 4968601, 2911681, 1367732, 3751855, 2708915, 4003099, 6744823, 838092, 7668051, 4879005, 1670642, 6539701, 8318157, 4590938, 5320069, 4237749, 589813, 1786385, 1538608, 7363186, 4914439, 7984182, 5300400, 3960278, 3835028, 1758814, 7874135, 2523781, 359969, 2299194, 426777], -[1073395, 5657154, 6544594, 5142518, 3127479, 163603, 2031343, 5765489, 904245, 1034349, 7163678, 2500418, 2804720, 7733422, 6024520, 6211821, 6894846, 8358426, 7020469, 1159448, 2137158, 7325056, 3982222, 3726458, 4159121, 581021, 5855839, 4842745, 5493257, 2017884, 4938904, 1247342, 5084380, 4201598, 7289364, 3930204, 8111510, 3233383, 8123729, 5529036, 6108560, 7969165, 3802419, 1248697, 2669809, 582053, 7602678, 359827, 7102416, 7049899, 615644, 6710279, 2326573, 5676793, 709910, 4546315, 4440134, 2983390, 5603906, 6352893, 4012150, 88873, 7356523, 7922013, 5316083, 3218471, 1229305, 2331183, 1774526, 2468353, 6082168, 4467890, 2051974, 5311193, 2185199, 3983995, 636449, 7683173, 6976708, 2359199, 7630490, 5444850, 7099528, 4589720, 6207511, 6070601, 5252204, 7785845, 1598687, 417694, 3119547, 1302914, 1164756, 4471488, 2182031, 4990793, 7392796, 6221607, 2415649, 7043957, 1686557, 5308191, 1043068, 6913747, 2711492, 6832940, 7470813, 4105624, 7218337, 3729370, 3649877, 7898397, 7303069, 7999998, 7539544, 5504971, 5298476, 5315978, 335654, 6585163, 3847871, 104077, 2251840, 3784865, 2689769, 3322006, 7915242, 5033344, 7403842, 207817, 4047109, 5895551, 5314554, 805738, 2090200, 6101253, 1932159, 3213089, 5423322, 5555222, 2765815, 1003830, 6642836, 4989331, 1854998, 2726512, 1063926, 2314196, 4357559, 4941745, 1034470, 2172177, 236885, 6670628, 3538854, 564881, 5663550, 1498214, 4980961, 4150543, 3196640, 3326073, 2866721, 1275750, 5655474, 3177899, 3448846, 7446357, 6448869, 374180, 2296737, 8235941, 6957014, 5670644, 7680933, 7183947, 5354752, 5648560, 84742, 230321, 4951775, 4182627, 1014047, 5036690, 6523130, 2667668, 4074835, 3430880, 2069902, 6214553, 2211210, 2402142, 1799331, 7641195, 248846, 2870575, 4179921, 3999181, 2766387, 5361256, 2020385, 3936778, 3110820, 6843107, 541994, 6960644, 475677, 4049315, 1303632, 2209309, 8237298, 6784317, 2912388, 3576854, 5166596, 3875597, 7668509, 7551469, 5188298, 3340684, 3365695, 2934298, 5669260, 408513, 497445, 7710719, 2799603, 2127868, 2633101, 4208433, 2653519, 6011240, 3210626, 4527122, 2769037, 846747, 6850903, 6695043, 4534988, 4376037, 5658002, 4321125, 3444444, 7785273, 4819806, 3518442, 7660022, 1360830, 6388208, 3071767, 5747428, 6500875, 3906812, 5681769, 6368480, 7412897], -[1091497, 5888885, 5945547, 2880565, 1447085, 2690723, 108740, 983805, 1260361, 8032161, 2936029, 1785380, 6112095, 1994872, 79532, 3077177, 2964652, 5359618, 5359651, 2986548, 4032941, 59371, 3803946, 6243804, 8142756, 266347, 7430749, 4628145, 3684061, 7568280, 1727752, 3293707, 1176920, 1416086, 381956, 759510, 4638303, 307382, 7466831, 6420465, 3868486, 7212259, 3336735, 7785055, 3392653, 3319832, 1452478, 2634977, 6248949, 5163732, 1080444, 6039360, 5314580, 4252618, 5750481, 5223530, 1176312, 2877927, 914338, 24183, 7982210, 6586021, 8312315, 185610, 7660912, 6901543, 3734474, 108177, 1389719, 7074642, 6539600, 1569442, 1114271, 171575, 7945294, 742430, 3785546, 2458678, 4479547, 1723972, 8097353, 3521327, 2485040, 6424723, 2779848, 3405193, 813098, 2950085, 7206715, 6422772, 5244855, 6466051, 5512150, 6091835, 6251868, 997002, 5051077, 129099, 3966085, 6322269, 7136957, 1861223, 7216215, 7934179, 5763921, 2505075, 5045266, 541109, 8253516, 7957826, 5174331, 6109912, 5522359, 430725, 4348935, 7848288, 847964, 7579877, 1186688, 2795794, 8203186, 3717882, 273977, 6806558, 1931939, 5339534, 6657207, 2097390, 7787353, 2211503, 4033233, 3829874, 498898, 284839, 6528472, 5444690, 1190447, 6514354, 4106148, 1195303, 8323366, 8157369, 6721871, 3185748, 2359412, 479260, 6776310, 1504006, 3397140, 6280421, 5448049, 6321251, 4294833, 760819, 5665060, 5666810, 2139339, 593614, 3365896, 4223012, 706215, 5614132, 1015453, 5208741, 7125391, 2500415, 2190623, 7241064, 6774419, 985451, 2693600, 2585293, 3912648, 2763566, 4452648, 6897261, 2851520, 5564469, 6063664, 342509, 535117, 7457880, 610637, 2289616, 7072403, 1166571, 597267, 4342576, 6433689, 2053020, 4854467, 7122474, 3236606, 2852219, 1411019, 1067602, 4034975, 3307185, 6987468, 8188574, 2536672, 8317394, 3481082, 418944, 3168953, 6826194, 3305744, 8156918, 2727679, 5319840, 6903436, 99739, 5492437, 688023, 2023161, 5058813, 6477746, 6265546, 4248552, 3361626, 6360121, 3043848, 494761, 434014, 7762789, 6140129, 2452502, 7796445, 5206461, 5601787, 4843562, 5108236, 5611560, 5135291, 49356, 3082726, 222102, 2068422, 2887627, 2451878, 4084165, 5152179, 1751777, 7818436, 6248250, 532717, 688194, 3898514, 7879288, 6366190, 3584176, 7651835, 4213487, 1989911, 5042449, 4539840]], -[[7811034, 4101752, 4245472, 6073675, 1840404, 6250945, 1555058, 2120393, 1371489, 1671518, 4281717, 3309207, 6016120, 2526947, 2597507, 3488163, 1473549, 3896396, 7464922, 5062365, 720334, 2654250, 2806963, 2343272, 7959183, 5625930, 4238586, 2828879, 3218093, 8275971, 255241, 95652, 7358277, 2955752, 6588258, 5436651, 4310701, 4115484, 3997590, 1681180, 6377377, 4984026, 7728084, 1124172, 5151515, 7392587, 7212320, 1988786, 1469334, 6576597, 7671570, 2457976, 2032623, 7915765, 25792, 1993849, 5812670, 4145655, 7681746, 5613768, 5907693, 4310916, 2356521, 4579667, 5528002, 1081873, 3731128, 6821365, 5640258, 6908964, 6689436, 6691586, 1960130, 7978197, 1361321, 2204205, 4792675, 6751253, 6224912, 2714525, 7157068, 7773271, 3449774, 3704355, 1948548, 7333442, 4142247, 7190427, 2644876, 5893841, 4040484, 6436308, 6162570, 4586169, 1124328, 8122457, 7688341, 2198877, 3049460, 7538209, 7955893, 6706569, 3936421, 1182256, 1275366, 7542693, 8240356, 6695277, 8349688, 3857760, 48323, 3991311, 6045712, 1178717, 5180071, 4071305, 7031633, 3814811, 1042233, 3301709, 7651908, 2429255, 1194267, 6145474, 7142062, 168019, 2603243, 1929145, 712081, 8342879, 5792855, 6278775, 2615169, 7076719, 4476696, 4287465, 3661903, 5285781, 7800841, 7584498, 4088201, 1348969, 5369736, 2441916, 948390, 1353929, 7715351, 3431405, 3430793, 7588591, 619170, 1658274, 6969721, 4132746, 911100, 129925, 4738018, 4278712, 5533966, 6258744, 1520978, 6743151, 6468528, 5029792, 4775056, 5178178, 1137833, 8128756, 3935124, 1658609, 4297552, 302874, 5179623, 5821844, 251791, 2181799, 5885328, 4114299, 7910280, 2640821, 2630708, 5646095, 1572538, 6120953, 3006955, 2127227, 4920357, 1404365, 4804281, 5524336, 7553822, 7094073, 5635183, 3997367, 931747, 5483244, 4680653, 4228086, 8236395, 118522, 7617447, 7319084, 2974225, 1215473, 3555039, 6662272, 7110713, 5436233, 3979616, 6272857, 2003140, 1237529, 7266963, 5765861, 785352, 7206448, 8224950, 5224884, 3735985, 4149803, 2557395, 5401731, 797413, 944538, 691439, 7879378, 4427982, 1758520, 5266671, 2666997, 4760746, 4165771, 6017287, 2755530, 2999992, 642462, 1354184, 4126885, 7111344, 3700, 5555924, 6694733, 6452652, 1535625, 4307722, 3570299, 4056305, 7861196, 322078, 158368, 5079383, 3448260, 1313471, 6011413, 2035183, 6251261], -[1256704, 1488355, 7581873, 7558212, 7859489, 7092691, 7575430, 4205350, 1319598, 1739683, 623414, 6513847, 4614254, 5691051, 3896457, 3201893, 5354838, 1747765, 6887182, 5075088, 6633310, 674619, 5762972, 3983920, 7317707, 1288197, 2318301, 7236862, 1999326, 605736, 4887038, 1937153, 3701597, 926606, 4575448, 5383892, 2688188, 4901594, 4137514, 3877928, 5436773, 2536088, 4110745, 57030, 7657193, 6898520, 5187922, 7337738, 4067762, 5516933, 1579484, 3933838, 5110111, 959253, 8009430, 388313, 2920587, 449655, 6870454, 7317543, 7938387, 5961729, 6016667, 869106, 77445, 7966818, 595236, 7006559, 1386164, 296446, 5173226, 2273891, 5119728, 5299221, 2329867, 3571905, 1341274, 6108746, 3521510, 7151103, 6333391, 7746300, 690008, 2058189, 1538670, 518253, 2864732, 6847196, 436780, 781503, 7820175, 3555789, 2895884, 4329272, 4007871, 387699, 2146874, 4880718, 4813518, 169614, 2416606, 4371208, 1581503, 5450949, 7338913, 2413508, 974281, 6182988, 2007399, 2378714, 5566680, 2332982, 284428, 4079364, 2479613, 412453, 2958177, 2323915, 3073554, 6925681, 2838387, 7256803, 7963195, 5427935, 5753546, 1897883, 2599545, 1047633, 4656600, 1308018, 6616741, 1785945, 6386465, 5871322, 2717040, 1840926, 7406815, 4247873, 3539674, 4505060, 6457339, 2309193, 568925, 3979458, 690765, 7486625, 104640, 1028101, 7581807, 4692806, 7417001, 1989144, 979611, 4032945, 7204189, 5262250, 3927790, 599505, 6301276, 824057, 5381724, 2081592, 3943831, 1363517, 6158597, 4940388, 80763, 4144015, 292403, 936608, 78183, 5200365, 5380622, 6275487, 7205203, 7792195, 7862887, 5956808, 6917451, 3837513, 2652991, 6788080, 4547298, 6258780, 3013551, 1909177, 2751272, 8069917, 8350637, 6115312, 6420050, 1859334, 1134198, 477566, 5139461, 5246866, 6997939, 8226041, 2729740, 7422743, 2194665, 6475007, 8047526, 4429272, 6910083, 3942719, 6830983, 5712321, 3380462, 4901570, 4242386, 5844186, 1716794, 2789389, 4481338, 3741804, 751713, 72888, 2380303, 3100852, 1052470, 4755402, 7379879, 137045, 3045108, 1350904, 4366777, 5732703, 261014, 6270944, 7390063, 4739261, 3026858, 841503, 2073893, 5688322, 3191351, 3636487, 7246195, 7470765, 6000780, 809318, 5205086, 3461811, 3761188, 4553585, 1289828, 6146932, 7809159, 6804052, 7695660, 2315687, 4127215, 1115226, 6150121, 5731701], -[109922, 4185020, 646071, 4045549, 7361432, 7699670, 2954929, 5255748, 3714642, 6832145, 8037086, 8211787, 3834552, 7989652, 6418615, 3353711, 3600625, 2807706, 3532517, 7351418, 7076621, 7762202, 8151520, 2144508, 4589692, 4743880, 3194433, 680377, 2458095, 1483222, 8284513, 693750, 3318666, 5831973, 4370188, 145627, 4375869, 8144341, 2213926, 592792, 7681198, 7023921, 6950836, 7102755, 2199059, 8006675, 6526003, 6399429, 4991621, 3425378, 3868271, 7347478, 2631896, 6315997, 7252311, 3819053, 5724728, 3597198, 5190987, 4203206, 8215746, 2536959, 1303784, 6765998, 3614651, 2662547, 3633239, 7718348, 4512462, 497572, 2961067, 1090436, 6431850, 6685021, 4475041, 5640488, 6397796, 7208426, 2192549, 1406456, 6105572, 6592591, 6848068, 3269128, 7029944, 7391674, 2306085, 4668390, 7384417, 4973328, 6802039, 7503461, 6366739, 3548138, 520290, 2728819, 7686180, 848848, 4634200, 6976636, 2698139, 1500942, 531637, 1365438, 7378624, 2832560, 1547201, 3607022, 5182797, 1274524, 1120935, 4537781, 7285878, 7815823, 5448805, 3115927, 717397, 1342678, 8165940, 7751375, 6165536, 7606850, 8175106, 4819176, 2616014, 7209646, 6324214, 2618433, 590915, 3205647, 6405045, 5355917, 196609, 6788593, 5193005, 2954403, 7698605, 2330814, 2758946, 3834615, 2724704, 1919839, 6181472, 645634, 3209922, 5732551, 7457721, 4206286, 268221, 2018033, 5536207, 6243472, 4728415, 596017, 6162972, 2917444, 686065, 7448051, 7188144, 3698257, 6687114, 7277146, 2524804, 1089670, 5061967, 3331757, 2496812, 6140951, 3507352, 4342099, 8139096, 6780893, 4723825, 4489752, 622398, 259375, 7725254, 8087603, 3364148, 2642604, 4571747, 3475495, 8237459, 2653030, 3877743, 2267222, 2376385, 387997, 7879722, 6818908, 2888989, 2068812, 951382, 5258253, 3002237, 4330703, 2166667, 6671132, 6254560, 656374, 3715709, 4866989, 2312321, 2182911, 1999505, 763684, 7615860, 5723638, 2153463, 7622031, 4255488, 8341721, 3141229, 211020, 4644884, 6258259, 8092958, 7053192, 3382074, 748840, 4580928, 2958149, 6435024, 4649496, 7847275, 1158032, 6255740, 4134874, 5882852, 19161, 3701972, 7237434, 5767498, 389894, 2626734, 6917378, 8331028, 4312429, 1642940, 4871803, 2684100, 4110681, 6904038, 4254741, 454595, 7622610, 5514822, 6565493, 639234, 2697405, 8332752, 2268418, 1165456, 3930460, 4035883, 5306127], -[4483816, 3379592, 1203546, 2692844, 3427347, 3560702, 327826, 7632973, 8024956, 4331491, 6748621, 1459765, 2904956, 1951615, 4513228, 6971204, 5846516, 6030800, 3877016, 6434794, 2339897, 5552229, 4219454, 5405387, 3114314, 2225157, 396615, 92872, 1079978, 6884247, 1168789, 3510860, 1717039, 6275755, 2663979, 660714, 7922203, 3546608, 1205723, 4966453, 5866114, 5571988, 7879994, 7043226, 3062032, 3622844, 2092782, 2942763, 4795751, 4904374, 7744555, 1725917, 5860205, 475395, 1034126, 5066202, 4405744, 7050318, 530491, 8359120, 3358424, 1717516, 690729, 4676559, 1094250, 1695506, 4465868, 4740971, 2239327, 4966152, 4689145, 3284467, 1580817, 852538, 3741767, 6451186, 3778806, 6159023, 214477, 1237453, 3995042, 5226216, 4053200, 6275128, 6391361, 1609377, 3137151, 6800822, 1902869, 411819, 331183, 7567583, 3515536, 3968800, 3586825, 6690600, 2997817, 7192003, 7456641, 2132739, 2180485, 4079933, 1988700, 1026873, 3874858, 370845, 201437, 635322, 5198928, 3008997, 6276376, 5390774, 274788, 1442311, 839132, 4746707, 2263155, 8024317, 2668925, 4276631, 3075967, 7655496, 2396561, 1006296, 480569, 2741029, 6989234, 1040298, 2787738, 2908218, 7805540, 6996655, 430918, 4700629, 3018146, 6141364, 4086145, 8341757, 3506329, 6410534, 2202976, 88672, 7219552, 5657181, 7868798, 6668100, 8293960, 6093194, 5781844, 1915347, 2855028, 518222, 4840426, 6328358, 4896957, 2068139, 3181328, 2680058, 6603632, 4317271, 1837761, 6639253, 2201105, 2625448, 5508122, 5367425, 1595870, 7476458, 8106677, 5948865, 4695503, 7802511, 2242096, 7632432, 345069, 817086, 5464529, 4361594, 2017789, 5126058, 3597053, 7863302, 7637726, 8357340, 6803380, 6282652, 3199666, 7418499, 7010635, 7938770, 6626909, 2009459, 3142533, 5305210, 4370962, 1720330, 1495234, 4844605, 8096759, 7718297, 2066004, 1708289, 3218672, 4579767, 3994046, 4948983, 5809873, 1814558, 8140746, 4034502, 2227392, 6289371, 3407837, 2303869, 4896085, 3215749, 5993081, 4652499, 6402551, 3507036, 4284634, 2779926, 5053256, 4700734, 4624439, 5819197, 7579824, 6497464, 8301976, 759075, 6134726, 6616248, 2925808, 1628154, 5139381, 4649740, 2611764, 45664, 2438990, 1116980, 3415587, 4806248, 7230362, 3984018, 268676, 2174811, 4506765, 7764197, 3315762, 2609243, 5712324, 3243764, 2883906, 3038378, 2058201, 5999244], -[8051145, 5145816, 1776929, 1565352, 3826835, 255606, 7531483, 5409777, 78830, 80006, 5094255, 6403281, 6227379, 7122081, 4312321, 7267994, 6284531, 5630679, 1535142, 5621959, 6872447, 2949585, 6621261, 380618, 4972084, 536535, 8250887, 6369664, 6306588, 2816537, 3802017, 8282333, 5606907, 8254701, 2463360, 203279, 3885991, 6000707, 1186711, 3653237, 6599927, 4155527, 2283701, 6112953, 144165, 2849003, 3131070, 5774682, 7944174, 913848, 6412105, 2067794, 1806582, 3181323, 2808803, 1483852, 7356835, 1701030, 76715, 4976722, 1946731, 5556745, 735141, 2472958, 3034498, 5964770, 6461590, 3663453, 3579686, 7806684, 431355, 7447767, 1639772, 3948854, 3579701, 5996845, 4835117, 3761968, 1114643, 7803303, 5558087, 6130280, 6837251, 3240831, 2661974, 7265694, 6123, 7130221, 4047124, 2737230, 7687334, 3565149, 6329857, 2127526, 1939858, 2246148, 5026402, 1366582, 4408979, 5044312, 3056539, 7647688, 5601482, 3945656, 782895, 2563355, 4084915, 7886949, 1663457, 792218, 116788, 2650204, 6220050, 4767858, 2135096, 4383604, 6068199, 6980386, 8100125, 3717870, 1751799, 1169428, 6601735, 346037, 7721802, 6474309, 5035155, 7207522, 3305271, 2411038, 4694592, 4948476, 7531435, 4968575, 3436510, 665667, 7184482, 7646505, 4231544, 3857385, 3948538, 6813903, 7841245, 2820874, 2097148, 6662407, 3014948, 1351909, 7298755, 172484, 5062326, 7124626, 7917513, 4738864, 6039188, 2000501, 589729, 2022173, 5710600, 3707244, 5385622, 4067453, 5891045, 4453487, 5495426, 2090686, 7100792, 540553, 7258372, 4744151, 6477215, 4359700, 7198626, 5126790, 7102482, 6021695, 5631416, 2110081, 5606040, 7127673, 2732845, 1269337, 5385847, 6071973, 1648112, 4012618, 2554936, 7453012, 5869976, 5190781, 4984310, 8269436, 1053969, 6646070, 5448377, 1068431, 2780819, 2889768, 527531, 7713764, 1639612, 6918726, 4056204, 3420246, 3370180, 5077292, 1850388, 3456363, 3324234, 3869511, 6983293, 3264994, 6952813, 6629000, 1530196, 1269398, 2145320, 7586100, 9091, 5363502, 3434928, 1088026, 7444489, 884347, 7474044, 4081981, 2761150, 7607852, 5437025, 5566456, 4311956, 4521115, 4108533, 5923142, 6105850, 191156, 2785562, 5087888, 1896068, 4129716, 750810, 4120008, 6890438, 4691909, 2069278, 578527, 5023581, 2123017, 2309955, 5129166, 5187886, 4325504, 3130060, 2110730, 6731086, 6879866], -[1630276, 523180, 2797640, 2762571, 75733, 4223242, 6272299, 6599994, 3270576, 8299462, 2868060, 7091997, 1433287, 5825090, 6838783, 2199558, 3354990, 7115668, 4667311, 1661288, 400830, 18133, 5073934, 662345, 6174430, 5559616, 1296802, 6195848, 2709860, 4645106, 6870301, 6480242, 1783682, 5878939, 4848048, 6383603, 7796085, 3362918, 2320705, 7477367, 3790148, 2166149, 5184348, 3493576, 6660923, 8155232, 1437872, 1124258, 8037137, 3556598, 3888628, 3677225, 4839596, 880652, 5139752, 477012, 7226642, 2780778, 4436703, 6316265, 5409256, 206849, 3267902, 7318947, 4974291, 6870905, 6153128, 1679853, 3948769, 5540510, 6962514, 4275622, 4985516, 4799772, 1835328, 5465327, 2145165, 877519, 8254963, 2690654, 1903699, 4717278, 1455748, 1920264, 4614067, 2737606, 3001127, 1968039, 5874809, 5861629, 2233521, 3884365, 5162206, 3018088, 5278649, 8062625, 4241874, 7589272, 1096604, 7300491, 4527378, 1273497, 1433633, 7723238, 248133, 5997038, 5111139, 576518, 2608269, 582230, 4158483, 5220008, 1660209, 3555975, 2059227, 3055112, 1145482, 3179263, 3903974, 5007914, 1560801, 120909, 7016349, 5390387, 2466294, 4745506, 4701950, 4615508, 6395300, 4771558, 3646858, 2905980, 2936907, 222613, 2290260, 6649832, 2487272, 7606870, 3226133, 6286485, 752564, 5291910, 1717460, 7766798, 4391771, 7204765, 3937422, 6590678, 5714907, 755546, 5551649, 2544917, 3436186, 6901681, 1758541, 5006312, 5649748, 4660045, 4382653, 869434, 5972359, 5392261, 2784078, 6677345, 987288, 3999373, 6220372, 5220792, 7936016, 6864280, 6043212, 8139255, 3321310, 6230630, 6681532, 293740, 5880645, 1003359, 5025143, 1166524, 7521743, 1243824, 3397665, 7374145, 6787561, 6778317, 6162283, 2699401, 483819, 6707997, 2302692, 999784, 3257905, 2346885, 2655946, 2558008, 5397536, 4643384, 3325909, 7231049, 2569893, 5578458, 2336952, 3650104, 5078456, 4588238, 535103, 1428479, 5267909, 7110638, 648978, 3753595, 6739991, 3454160, 2467079, 4844239, 1259945, 2457759, 4223943, 6631487, 8356361, 1579483, 5126787, 2826789, 4443343, 601641, 2864994, 3274408, 2627862, 5822624, 7146096, 4050572, 3903430, 194490, 5498980, 5022682, 4621536, 2840691, 195461, 4834166, 6786792, 4525861, 565141, 1540056, 701331, 5619166, 6085163, 1491014, 7828941, 4586411, 3526621, 7966877, 515244, 5826290, 5540034, 1605806], -[751530, 5905843, 3672147, 4127071, 6938257, 7569913, 5720039, 5698380, 1076489, 6078155, 6140224, 976796, 4359689, 1431756, 2263584, 4458374, 5660321, 7100983, 5830682, 5039840, 3545504, 5360258, 5548835, 1822537, 894864, 1328328, 5334186, 8126709, 5662139, 6165209, 3552847, 6794949, 1284556, 646401, 1957098, 7612063, 2075893, 6426311, 7418949, 8250033, 5534641, 4933989, 836951, 4254844, 451369, 8213836, 6666052, 6881094, 6017598, 2906435, 7140232, 658296, 5831168, 2715854, 5569452, 4864739, 4223620, 5446283, 1444386, 4750472, 6430572, 5678195, 3742508, 1773619, 2419742, 6328743, 3495481, 5498585, 1168765, 7778401, 7783292, 2585518, 189877, 1519462, 2278452, 4308869, 1603426, 5967464, 6474730, 2177500, 2324828, 8014510, 3370896, 5440640, 4081174, 3287298, 76333, 7801033, 3380507, 5616079, 6779437, 6196679, 5020492, 5202345, 3224340, 6431670, 7397932, 5909088, 5461769, 779990, 4839690, 1857373, 3623298, 1369497, 1460706, 2943193, 5202106, 3483202, 4095858, 7951836, 1072067, 5593151, 6579328, 4484671, 3564098, 4039949, 406144, 5514184, 8237154, 2186454, 7515983, 898844, 1743549, 2529736, 5644280, 5375228, 2476243, 7091064, 3297269, 4770674, 6979279, 7559932, 2012394, 313989, 1485807, 1157859, 6874030, 173990, 5380925, 1777874, 2068217, 1978150, 1057131, 8134735, 3336236, 7358905, 1466324, 2290795, 8178763, 7489415, 1173640, 8268809, 6066941, 5011141, 6448773, 3367821, 4318769, 5476441, 543744, 313760, 5879783, 5781450, 4946107, 4357621, 1353832, 2580726, 5125600, 7950855, 8054853, 1423231, 6145445, 7360399, 8128706, 6444457, 1155444, 2560997, 7923929, 2347011, 6296431, 7347275, 2881346, 7477119, 3896982, 6639865, 536591, 3703725, 727079, 3641942, 2649035, 6752022, 6416050, 3646962, 3474762, 6224146, 7292612, 4317752, 6631707, 626905, 3832919, 1455118, 3531308, 1241716, 3039723, 2637620, 2201581, 3870412, 718136, 4144478, 2188112, 4102630, 4473449, 4332451, 4299788, 434455, 5464736, 2349781, 4800943, 4828454, 7697639, 1199874, 7104871, 5215017, 2710162, 372782, 1837242, 8097956, 7683642, 3840989, 7886703, 4614107, 1663442, 5735352, 6620824, 8158491, 3557378, 3695912, 7026647, 3973571, 7707159, 7523748, 7017564, 8230503, 2903301, 1683179, 2722733, 5797940, 4694416, 5042813, 720723, 4461916, 947782, 1117287, 6737929, 3069419, 7988813, 6706592]], -[[6065439, 8098530, 5023810, 3381156, 6754733, 8094528, 2177707, 3111036, 7726676, 629546, 484643, 3088074, 8083517, 3432654, 5947760, 7464840, 2809352, 1293705, 2161515, 5167235, 7588976, 5272972, 2507932, 4740874, 6713670, 2677670, 5944836, 6280256, 3504771, 5665806, 4261247, 5346554, 6855031, 2342557, 5386712, 374061, 5834168, 4738021, 924002, 1651429, 2817473, 3775056, 8191761, 3019257, 4873383, 6864721, 6005610, 1554003, 890595, 5017759, 129837, 1797130, 6927116, 7222023, 5456406, 2989326, 5239270, 4960563, 2804667, 5558044, 8248954, 7231731, 6851615, 2736490, 4381530, 1851355, 7327469, 2633801, 1188268, 6666886, 6009233, 7138474, 5855102, 6936599, 2208617, 7506787, 6935467, 3083477, 268341, 5051249, 685554, 1631620, 5502636, 5703894, 476211, 841551, 5578983, 5496622, 267959, 5083084, 1086771, 1813620, 1877396, 3046376, 3953948, 2812225, 1752363, 6287571, 2783914, 6861632, 907280, 1692098, 712059, 5579485, 4443683, 8225659, 8094792, 6219611, 3934896, 3058583, 682062, 4094924, 4572655, 4595098, 348239, 8194569, 7069956, 1158279, 4203848, 8159248, 7301504, 1376237, 3003634, 3139321, 3393982, 7678646, 5361024, 5600871, 5115313, 6164519, 5052485, 2125740, 187821, 7855321, 6141126, 6321742, 6663527, 3085067, 7177000, 1123310, 3035694, 1060155, 7565014, 5349429, 1442616, 807345, 5422688, 1909112, 4792902, 8077562, 8068234, 3876796, 3664755, 7997599, 7742808, 1596915, 6646805, 7029787, 6356840, 4550401, 1342566, 7172620, 1281840, 3033542, 1221120, 642163, 3649099, 8000533, 3943967, 7447439, 4935652, 5839684, 4628894, 1927890, 4487704, 2170724, 5682155, 178968, 4409051, 5818012, 8198602, 3963301, 5548696, 3533619, 1479720, 7758344, 7216034, 6520999, 5008243, 426108, 7910967, 1519116, 6430637, 7696642, 3230976, 5997069, 5676833, 3780721, 3757373, 4468243, 4757017, 7609122, 4958938, 4423267, 1159821, 4754098, 1880200, 3249813, 4596375, 3205560, 1475629, 892832, 2266101, 1369551, 5856215, 5169258, 808305, 8135676, 1723528, 8242694, 7000718, 5239617, 1439637, 3866441, 1672738, 1640374, 3451118, 3979491, 2727658, 3960102, 6885664, 5084531, 3139692, 2309980, 6745314, 3779889, 4473594, 787503, 962662, 7848557, 5524131, 5105164, 1112207, 129779, 7662914, 6864707, 1046269, 3598044, 7924894, 4919929, 5504571, 7644181, 6175045, 8347723, 6810483, 2845860], -[4007120, 5423943, 4306969, 4494957, 2761168, 800537, 6538318, 897473, 5377893, 2096060, 1890988, 3770397, 2216755, 4691747, 7702645, 6363843, 2625662, 7527301, 1503125, 5164199, 5842069, 2036053, 1992862, 5119892, 841022, 8308219, 5278310, 4113988, 3996346, 7495801, 2924478, 6829166, 3053315, 6290721, 3999812, 2369223, 1006380, 648489, 3345382, 2843439, 1332072, 3127630, 6085969, 1168473, 3281009, 1579820, 4532577, 3911106, 5704565, 4311750, 4973522, 7249092, 2690177, 6076057, 7146221, 6810693, 7229874, 4067772, 7589685, 5523885, 2285367, 7505433, 3337642, 2997313, 8242998, 5172400, 917219, 3211637, 8024970, 1373899, 6398327, 8334626, 2376275, 1040964, 6855672, 2097302, 19747, 1290176, 102349, 5686201, 7291506, 5016938, 6334176, 4196839, 1014297, 1042425, 3899853, 4340175, 5817727, 1299889, 1520217, 7379288, 3902502, 6287771, 3292794, 4996075, 6704117, 3732567, 5266808, 4248435, 7865397, 4312725, 1846977, 4708806, 5750892, 2099692, 8244241, 3643726, 881312, 465703, 7355745, 6934849, 4731372, 6529701, 7866754, 2146466, 4752091, 1196952, 3864527, 3888854, 6318296, 4503032, 989019, 988975, 7964009, 6765922, 6670523, 6000973, 7367533, 3028000, 380308, 7263464, 1053469, 904372, 2771224, 7045432, 841953, 8283212, 543359, 7116833, 7788957, 3377047, 1410397, 6638640, 5930780, 2848485, 805857, 1406190, 2988106, 5204346, 3666932, 7926941, 2488280, 4985040, 2865110, 3035363, 1497202, 2817796, 1993263, 1590887, 1844254, 7001652, 4194258, 6393088, 8003079, 3852112, 1727679, 3541710, 7503319, 7555829, 4955325, 2643206, 1369803, 6691658, 4943062, 3026882, 1142921, 7661220, 1678271, 3149574, 8167950, 7623039, 4896419, 6722398, 2939096, 5729350, 3568411, 1422175, 4604617, 784613, 6608734, 4650598, 5974213, 2397461, 5545194, 5198203, 2996451, 4597343, 4153035, 6772858, 2639233, 6847483, 2664030, 8190252, 6634332, 7274845, 4795777, 5385361, 5996962, 1739905, 8319401, 6223355, 3877982, 6956879, 2427708, 6002480, 5433573, 6775158, 5207754, 7121567, 6044217, 7430943, 3353263, 5479123, 2057020, 3965090, 5103532, 9620, 7894203, 195375, 3553067, 4562964, 3521892, 2639695, 7326355, 7694597, 4188489, 4077371, 3229382, 3455191, 2777309, 1065956, 4343354, 2983455, 7148309, 4548468, 3024992, 2040118, 7211470, 1920227, 7706345, 1668559, 3029285, 4463782, 3510335, 6700969], -[6323841, 5209833, 5157296, 466039, 2749828, 6970345, 1962517, 7353185, 3694630, 3683167, 5208263, 4427881, 5780948, 5375250, 5100008, 7179708, 5070481, 3838328, 4793520, 226234, 3680194, 7823751, 4272524, 2530644, 3256965, 7689738, 2369891, 6122504, 4686244, 3569148, 8317704, 7020426, 4220274, 887330, 692608, 5378003, 8285122, 134049, 2624513, 1868211, 987881, 665778, 1815333, 5586872, 2203713, 3377406, 3404010, 7127424, 8022483, 2303055, 954376, 7697690, 6403982, 986782, 104867, 2254228, 8306009, 4319806, 6171726, 4755601, 2243642, 5767709, 2867879, 7167377, 7719897, 7484176, 1566245, 3924729, 3445057, 5308767, 4588273, 2681809, 4248141, 7167510, 860789, 828580, 5868201, 4841612, 5615046, 2241199, 68068, 2089044, 2264942, 663786, 3776796, 7030236, 7492646, 1268409, 5505005, 4935375, 1030628, 4907225, 3986279, 7918597, 264305, 2122525, 2107495, 1543964, 7223646, 2459152, 4141351, 4836274, 435860, 1306531, 4277859, 6035603, 5067301, 624480, 2331879, 4749864, 6551227, 3908396, 3851233, 919087, 6562890, 3314476, 3067031, 6914429, 5470171, 6572362, 5474978, 3727388, 6693137, 1506493, 1633673, 787017, 591648, 2557564, 2570816, 6445452, 2016023, 5199010, 8051130, 3678378, 1172422, 6755164, 1114389, 3000723, 8190855, 1841795, 1330841, 4639722, 1099629, 7637507, 2118361, 928782, 6790090, 8362917, 3103942, 2233548, 374401, 2849666, 3590394, 6351470, 8073256, 752145, 7439588, 3757919, 7696535, 5786268, 4201353, 3897052, 275547, 2911786, 6912150, 8197144, 3021691, 279320, 7192665, 1805177, 8140386, 5870875, 2156492, 4339064, 8123514, 5483203, 2694781, 6821387, 793256, 3383296, 8000491, 5694434, 2650030, 4527299, 2052913, 7457517, 7866862, 5867514, 7431849, 7973790, 3977604, 6589365, 4253888, 1628453, 1537005, 7135886, 6545013, 3739472, 4760670, 2483672, 7276474, 2652710, 76150, 964432, 1590418, 7444807, 6778848, 3767619, 4630593, 9830, 1803185, 4072069, 6194467, 1422413, 5033131, 682879, 4652767, 2402001, 7809203, 208637, 8375957, 8070047, 2260867, 1706434, 2610320, 3542000, 3597433, 2890298, 6751982, 5330380, 779100, 1675140, 1353843, 3088832, 2629579, 6467217, 7778088, 564663, 5091190, 4345288, 2792860, 7793481, 6583310, 6796384, 39045, 7562747, 5550914, 4199782, 1017567, 6255493, 4139212, 8219736, 7585519, 7835405, 6977604, 7231492], -[8154847, 7566155, 6146913, 2462188, 5971340, 1798655, 6204442, 7607641, 3936291, 1606870, 7125553, 73749, 2568183, 5390254, 7182909, 4042384, 2765143, 6809397, 4729520, 4658091, 1692613, 4815224, 857808, 1850571, 4415706, 5828583, 1510374, 4333325, 840381, 4465684, 6648950, 7710895, 6094197, 1167586, 2150385, 868522, 8090466, 3543213, 6862447, 5414557, 6745364, 7873095, 7615115, 7248369, 5926609, 3836333, 6017410, 7145166, 3554046, 2304324, 1386528, 3258835, 4181051, 963172, 5627171, 7476731, 4313342, 4743085, 4092880, 661108, 4592973, 3021186, 6417065, 5896927, 6197897, 4550478, 6995515, 3522238, 1082938, 1235805, 7622564, 6515645, 2822702, 2913189, 2553916, 306480, 2596679, 3147894, 2003502, 5242706, 2518437, 5697984, 8258205, 6636021, 259943, 6890034, 7901191, 4552161, 6291357, 3503629, 2759818, 1969485, 3098650, 4051220, 5117605, 8225404, 4357592, 6705720, 8105378, 8250338, 3223284, 1310449, 492274, 2307000, 3961233, 7363485, 5577650, 8068442, 6695612, 3403410, 6060904, 1628342, 2009841, 7466363, 913053, 5191025, 489039, 6433274, 6416666, 7516965, 1234497, 866504, 537164, 6815340, 7380410, 2381525, 3432042, 5257016, 5940752, 6773508, 4181364, 804323, 4917649, 7679849, 2532945, 1833247, 6750930, 741532, 5705471, 594678, 8020641, 6827685, 2622621, 7709457, 2623542, 7924848, 1291259, 3755298, 1469448, 7537353, 6065121, 4824131, 1883842, 2475181, 1898269, 4502642, 2190114, 6648633, 3894977, 3072148, 970904, 231839, 3682422, 3654869, 1513149, 4386838, 7302344, 683068, 1458725, 5573891, 5293368, 6804543, 1242510, 2198628, 3617190, 3267290, 7987379, 6459326, 1908387, 6613312, 2029049, 6191882, 3892387, 3698734, 6964746, 3397539, 5716224, 6282650, 5956617, 2023007, 3861456, 2267203, 1979851, 6934881, 5854970, 3931281, 392332, 1392461, 4171168, 4721159, 6239800, 7787564, 1248320, 744301, 7498446, 2866748, 5909376, 5807494, 1193609, 965605, 3452681, 2631568, 2666659, 2645873, 960192, 810012, 3076060, 3026031, 7542342, 5816586, 708606, 4670334, 238456, 3303528, 125255, 3843602, 2607509, 966211, 2899406, 4887532, 7242203, 1821906, 992231, 1025328, 4068852, 4791641, 4188290, 2755045, 573124, 1751171, 2643011, 5419168, 3374866, 5916663, 1220910, 7534329, 2150395, 3468485, 3439803, 4644089, 7920444, 3154676, 8168607, 4522101, 6287873, 5750589], -[3012424, 4406492, 2546740, 5034037, 7784928, 8376615, 4586774, 4380561, 6402916, 8140939, 6443466, 3744222, 7553967, 7410966, 2482042, 6520029, 3303186, 1286771, 2292328, 3841531, 1636778, 4411532, 5693288, 1363128, 1736141, 3222265, 8005379, 1699184, 1257265, 8043985, 8082978, 2026893, 4852547, 3005247, 1525389, 1668353, 3874912, 6022074, 3273505, 654468, 642093, 2223334, 7502337, 5380851, 657264, 4037865, 7251145, 4212111, 6679634, 1943579, 6078682, 401147, 6533959, 4141494, 7135384, 5400916, 1652938, 3389236, 3727774, 6267994, 7519709, 4834477, 553194, 4007619, 5609838, 1786393, 1638799, 5160205, 8061976, 5625006, 4825203, 1419534, 2702679, 4650093, 7300915, 4485580, 4388954, 6367834, 3923510, 6017306, 3426495, 8009268, 7308311, 2499285, 790514, 6808118, 608123, 6295758, 6423865, 4759630, 3917677, 3419702, 7178834, 823783, 1485586, 5935385, 487631, 840516, 6722655, 2117490, 6275340, 6191135, 4893139, 4155211, 5333992, 1103425, 16580, 2547910, 4129018, 2986445, 5482707, 6868553, 4824018, 7833849, 7028073, 8252119, 7757600, 1261160, 7964682, 6386172, 5694990, 6535857, 3284294, 1570198, 2622184, 1429615, 6670897, 7364735, 4015211, 731626, 764562, 216213, 1513319, 8088547, 3053229, 2434054, 1518110, 3132242, 1310597, 6880613, 7369064, 5312815, 7839808, 4085736, 6663264, 3425227, 3688897, 7327407, 4412355, 3322230, 8079276, 4380264, 2845840, 8324985, 5412228, 8049379, 6978279, 2984319, 2931, 3879882, 7421619, 4462199, 6205925, 2307212, 2433541, 734802, 7411708, 739470, 2116407, 1654059, 490509, 5584903, 2741517, 2364361, 2738670, 2975393, 700217, 6075957, 4088927, 5813673, 3436721, 4332931, 5583951, 6551375, 3912310, 2259905, 2350513, 590624, 788849, 250945, 3698979, 7470226, 5796027, 6924870, 1122159, 6904221, 5444170, 6831056, 5300518, 1184024, 3304848, 4173966, 600504, 5244215, 268278, 2338377, 1086791, 4268868, 516080, 2306418, 4563883, 2097104, 3770710, 6574383, 7667401, 5084888, 2591342, 5437156, 2099151, 7804463, 4660469, 5073141, 6907634, 4255955, 5023475, 4058249, 5825964, 8185866, 2927171, 5565488, 97410, 6596410, 7440701, 4199496, 5769811, 7438274, 4671802, 4760803, 1987269, 8044167, 3095292, 5294419, 3640742, 7029844, 4929730, 3660095, 6309054, 6442179, 6520550, 3987381, 5989950, 7984765, 4911458, 4731245, 5836420, 7253460], -[1200975, 8294972, 6178632, 667223, 6306105, 1602816, 7266288, 1198660, 1611996, 1835252, 3104937, 7478491, 119976, 2811530, 1092120, 2344890, 3262023, 781322, 6636599, 5679588, 784842, 8285318, 4904312, 5156472, 1028975, 3590408, 8003281, 7434876, 4024121, 542526, 2123272, 8055066, 4864331, 3628644, 4653774, 1510572, 740902, 1024777, 5377874, 2742709, 956080, 1897066, 5580186, 725884, 791497, 5923539, 7165898, 4891983, 3566451, 1503607, 1230301, 4660205, 6707890, 4534136, 7925405, 3352078, 7415718, 4706861, 7555575, 8178537, 252523, 6739908, 5613889, 3779526, 3558819, 6210177, 3105543, 2795679, 1045114, 7844101, 7717405, 4860246, 4793041, 5995040, 5555415, 4694463, 2600659, 4220265, 2100962, 6636830, 3496220, 6946030, 6747615, 4990114, 7783185, 8017266, 3338364, 6024643, 6525385, 401113, 2128518, 4179736, 735853, 7754507, 232607, 8353222, 5831300, 8107928, 5742849, 1089107, 1150253, 5096851, 377956, 4785616, 3480720, 1957601, 4855281, 6376587, 5810343, 6607052, 4761022, 5139937, 5234553, 5061764, 4958843, 730534, 985272, 5921641, 2114478, 723322, 1020823, 8296367, 2913968, 882051, 6279296, 855590, 1921432, 5731488, 7594353, 6785515, 2181488, 5458463, 8048273, 3979383, 6783908, 6803903, 2872969, 7984094, 2995606, 7659849, 6818495, 4447457, 1150577, 4021049, 8093162, 7616850, 8016521, 1719806, 2512302, 258798, 7380299, 2471186, 3357367, 3535392, 4491835, 4560765, 4017763, 5807016, 6429446, 1117538, 5967637, 7897423, 4662486, 6120042, 5253149, 6542425, 1675433, 5314423, 1856179, 8052899, 979398, 5240186, 3593021, 5408479, 2452698, 6569240, 5750344, 7162286, 1901408, 7610249, 8047499, 878623, 6958425, 2368784, 4640386, 2628599, 5563328, 4184264, 1182730, 1148992, 7530228, 4193800, 1686875, 6526257, 1626523, 2557530, 719981, 4143524, 98280, 5445546, 908860, 7320267, 5614781, 2680102, 4051477, 7656240, 7565619, 4577163, 2241199, 4223826, 5520324, 6266248, 6669455, 5104042, 7979000, 5687279, 5984952, 4341664, 5622583, 4165678, 5034494, 3124982, 6987063, 6611500, 1504848, 6880616, 877733, 5201510, 3786331, 6399382, 5865555, 3183897, 6227623, 1432560, 909739, 5871071, 4236552, 7544582, 1543963, 7372744, 3788089, 6125649, 7908285, 2123918, 3700116, 5922065, 1970857, 6546629, 8153448, 5679421, 662072, 2701253, 6739043, 3667053, 2115351, 4952822], -[1110207, 247437, 6926931, 759266, 179, 2872777, 1627927, 1633244, 6758329, 2523719, 5435926, 868629, 7097254, 3694812, 961799, 3632419, 2482338, 3122158, 3041753, 4798795, 6062680, 4523031, 1221940, 1569028, 6139793, 646517, 4719057, 8047080, 660144, 5017165, 4177372, 3390288, 6900732, 5231594, 3099315, 589575, 1569259, 6932308, 226200, 2528806, 3470878, 4474637, 1100913, 3311646, 5058737, 3494823, 5271311, 4468048, 4262916, 1884375, 1306141, 2847164, 1372685, 6749769, 2369220, 6198477, 4672905, 1137811, 1219967, 4151529, 5411818, 1793961, 2693006, 5257651, 5397635, 5965885, 6101327, 181089, 1512830, 7749924, 2657493, 1916973, 7707444, 1140328, 6155562, 2912351, 226138, 6541107, 6501552, 638964, 5077425, 8290197, 8326432, 2693488, 2527993, 6106005, 3159702, 3379969, 5963216, 636009, 7893901, 8270926, 3597573, 3400254, 833667, 6987033, 7141436, 2726879, 5604107, 1931341, 1532279, 1607073, 2071695, 8278730, 3031706, 8305383, 7033001, 6509108, 1137086, 587822, 3174792, 5748092, 5604087, 5574221, 7815185, 4376829, 2230471, 3470758, 5401246, 1654278, 4725924, 1514222, 6382160, 5113718, 7937878, 1580311, 2879779, 6978018, 1503597, 4234207, 4489347, 3539647, 7964368, 1790915, 5684583, 1349298, 4870522, 5486435, 2746351, 6543101, 2925633, 7387373, 8113499, 4063237, 2754031, 1461855, 7429663, 7618697, 3314698, 7611427, 1636009, 2028195, 6861402, 111020, 1449528, 7229952, 2439655, 681019, 6482518, 6089687, 6352678, 1749691, 537978, 48724, 3888754, 954122, 3014340, 4089798, 6385135, 6495002, 4007464, 1776101, 112874, 6703560, 3936519, 2713100, 5845341, 2950865, 2959950, 7575819, 5894951, 2010816, 1963700, 307910, 1401599, 533523, 2992814, 5172325, 5904526, 6899275, 3739698, 4513442, 4504301, 4274890, 5525610, 6136740, 5711774, 6970910, 6514393, 2405723, 3663240, 2819312, 5610046, 578112, 6318028, 8235168, 2818108, 3189030, 3291646, 4309501, 858403, 539869, 7644290, 5427619, 5191510, 4261061, 1912718, 3888893, 3130066, 4954991, 5716329, 4184973, 7166603, 4897517, 6289440, 4058463, 3569250, 884235, 7776646, 2577166, 5582048, 5034505, 6450335, 8354142, 413939, 5786370, 5755357, 5216239, 5164226, 6001083, 2781595, 7334875, 3783840, 4533314, 5651216, 6990931, 5827191, 602334, 2667688, 6600632, 6019790, 6179058, 6921172, 4377416, 7570949, 423032]], -[[4388288, 497144, 2983146, 1570740, 4073113, 1504059, 1003568, 5651483, 5095800, 2831436, 7119888, 4974541, 2920629, 2654728, 7179884, 6671636, 6362431, 789803, 4618871, 6684088, 8277939, 1487583, 7556318, 7699884, 5776907, 5937795, 7322064, 2894382, 4841218, 7777089, 1437842, 4935259, 2248004, 5941399, 6733840, 2352903, 7256419, 832888, 1962971, 3747072, 6363768, 1561960, 2256890, 578707, 2019367, 5741516, 2026676, 3956084, 6409717, 7146411, 4892640, 4712965, 2172806, 2934575, 7727325, 7443271, 2314514, 827320, 2240087, 2201837, 1731606, 7840791, 2278291, 7456278, 4921109, 2984550, 6012301, 6324136, 6176775, 4761686, 5434479, 7406592, 5923578, 2352329, 2081716, 7511585, 6462049, 2628954, 3626780, 1573688, 5089133, 7853394, 1017126, 6616383, 6811389, 3762499, 4321213, 8258037, 384583, 5634400, 3491937, 2630391, 591453, 1974490, 4246951, 6529752, 4881550, 3884232, 6516929, 4745055, 4206681, 5169934, 6804510, 3385123, 6481489, 8122200, 1739482, 406587, 4059056, 8165991, 2283511, 7944880, 5223218, 2537541, 5998303, 7006843, 3268667, 6202276, 5132869, 2037770, 5008874, 2432729, 6689564, 5088550, 5244148, 4012711, 4513502, 7233819, 3321544, 6591286, 448686, 3314683, 2699086, 5376627, 5533349, 3690750, 7748559, 1416287, 2399111, 1945648, 6977420, 5303151, 6167988, 6565001, 1031107, 1708121, 2408401, 5079705, 7714974, 4077452, 7824356, 7716840, 3710457, 188952, 1824516, 6831727, 139480, 4850196, 7507467, 7208788, 4142273, 907916, 8033143, 4256614, 5892773, 1961945, 5286387, 8246953, 4316592, 1185705, 455270, 6781497, 494963, 1221179, 6863836, 3042112, 3051826, 5935136, 7263756, 8104497, 2008778, 7599509, 3014968, 8121844, 2410262, 2679694, 1677585, 3523574, 6897082, 2036337, 394569, 2782900, 7169456, 3090219, 6854123, 5170978, 1059557, 8280866, 3408289, 2164135, 4456763, 6510425, 4141118, 8176954, 810380, 8158406, 6994641, 2122221, 5562599, 4397184, 4495968, 3590537, 4946971, 2034930, 5536086, 1385996, 8034252, 1619980, 4887531, 1596246, 3159985, 2624227, 2817104, 838003, 5995979, 8336089, 6047556, 6924634, 6732327, 2802547, 2371319, 2756821, 3450215, 6481992, 6170484, 8327859, 1081603, 3790908, 6227758, 7849985, 1358497, 3722530, 1109346, 7345538, 6912963, 2746798, 4417344, 6903947, 5871831, 7933057, 7657550, 3576049, 78103, 4918836, 5572644, 1430029], -[1750910, 6951273, 8232392, 7393526, 636560, 7364581, 6958310, 7378466, 6633679, 5193564, 3168714, 200963, 265328, 515516, 5254982, 3614670, 2292436, 8047878, 4096052, 3217799, 4465900, 4027920, 6407331, 2845717, 2508952, 1459636, 6550777, 2553901, 419091, 1188539, 5300457, 4013389, 1418700, 7373795, 7048944, 1132807, 2191804, 3411503, 325832, 4101088, 4858390, 3868377, 5759145, 3046463, 3926241, 7726677, 5661229, 7159769, 2615255, 337690, 1138933, 4474394, 7076269, 5278210, 2086735, 3131557, 8271983, 4237277, 4207062, 311409, 5550960, 1224347, 4117558, 950597, 5417669, 7384514, 2623227, 7259247, 4739970, 5825506, 6668690, 3292970, 3220133, 3890839, 6922670, 7419166, 2122972, 3904503, 3423359, 8356437, 2079151, 1245806, 254939, 7189517, 7126374, 5232343, 6928761, 448424, 7889648, 6201813, 5932872, 6761070, 8053705, 3329052, 7350640, 2857512, 513075, 3247585, 5201098, 5205125, 6478236, 2346887, 3471787, 2704436, 200167, 5222735, 5167112, 3468804, 7460050, 4734734, 7107221, 716666, 1163790, 6384809, 227019, 6428189, 4165678, 916629, 3463413, 1987749, 7599401, 438125, 7899608, 5638627, 1119557, 4237370, 2141109, 1350612, 5018742, 4348999, 992843, 5771306, 1361967, 1370081, 126407, 5807955, 4964482, 7467516, 1454580, 8132157, 6155283, 7124004, 624270, 5824280, 4048721, 7364402, 3711001, 6938613, 2439112, 3901012, 5417732, 6690740, 4935835, 7993677, 887046, 6953436, 4145173, 3393255, 8332615, 120143, 7944423, 7202280, 6216415, 4896072, 3377205, 4633190, 3992741, 2666755, 3738850, 616582, 7481242, 2265791, 4246091, 846419, 3091519, 5727512, 4601564, 3219023, 2665042, 7782713, 6223576, 7320769, 2673377, 6901189, 2884698, 4420420, 3044829, 6097144, 1290116, 440763, 2481254, 1085366, 1937349, 46980, 4931638, 2197994, 168396, 4609138, 3118019, 1166656, 977282, 4823643, 188352, 1217000, 3198373, 135109, 652454, 2288221, 6685141, 7761935, 6279890, 6128261, 7740931, 1446550, 143615, 1697942, 4509352, 6214681, 4559273, 4743760, 4568772, 2848212, 247661, 5649908, 5069503, 233466, 6752497, 5878304, 1103412, 4273029, 5565128, 319492, 3595728, 5742835, 3973341, 1589084, 5308989, 3731961, 5641556, 1353323, 4128893, 6683095, 5209641, 7070660, 493748, 2298416, 6047563, 2425129, 391941, 2680536, 8241086, 2745936, 8282743, 2132676, 6113173, 1527866], -[68549, 1468933, 6381093, 2184999, 7461915, 3762500, 6017944, 6263114, 6054502, 5026470, 3489242, 2290266, 948767, 8297397, 7239339, 3168740, 6301781, 4129359, 7879401, 3999213, 5540787, 8241709, 5072866, 2841696, 2183988, 902985, 3924715, 5926149, 6681924, 5825783, 1833574, 4877516, 148387, 118220, 1952290, 4984706, 5498500, 5351671, 4023111, 4957255, 709634, 5997724, 227832, 640693, 7524742, 6073279, 1435369, 3138860, 715847, 3773392, 3270528, 3446566, 7468118, 5725515, 7495194, 7460807, 225616, 7602703, 3734373, 2243470, 3667699, 7618156, 915670, 2388810, 336754, 3183048, 6731736, 5072254, 3372722, 7879870, 1767187, 6907509, 5450430, 3966274, 1866890, 6481799, 8329982, 519548, 5692812, 3211030, 1467604, 6253800, 5503980, 5982830, 4179073, 7990800, 4295551, 8250912, 3607765, 73477, 1311827, 977238, 239676, 8100081, 577083, 2360024, 5792013, 2707035, 2031027, 5593208, 2622624, 535256, 4447976, 6035836, 1723062, 8355725, 5355326, 200865, 5997835, 1884944, 4826194, 5149592, 2463189, 5853701, 1753623, 2398150, 6288718, 3586003, 2940577, 3050408, 6762530, 862058, 2899737, 4327364, 7375183, 5833873, 569948, 6702133, 4314842, 2360071, 7290293, 1908892, 543441, 5411054, 6469658, 4735636, 854645, 3381997, 5311635, 7807019, 1019160, 1365310, 3504526, 3722874, 8219202, 8055219, 6728223, 5329803, 3215479, 3579077, 246425, 356737, 4992355, 8176147, 8183096, 7992820, 3277092, 5620023, 8133065, 3970990, 6932683, 5379523, 614387, 2170200, 1147671, 3694432, 2236786, 6457150, 3684798, 2884192, 4589407, 7944361, 4590692, 956261, 3358316, 3586828, 4363068, 1710504, 7502608, 2602531, 5132769, 7453275, 7117295, 1734959, 5292059, 4766078, 3793389, 8140885, 5846209, 4690408, 5459738, 1121280, 6434759, 487204, 7478247, 5849513, 5199191, 5181923, 1839284, 1239229, 2856552, 5744499, 2881097, 3892786, 4000423, 2753744, 5145955, 2928746, 1775469, 7719021, 5141358, 1070919, 1761094, 6347761, 2811869, 4328064, 8280718, 6880716, 5617548, 855542, 2923389, 2028182, 42349, 8341736, 6062979, 2366338, 4112637, 3395662, 258109, 374495, 453344, 4763043, 2618033, 925044, 4376153, 73930, 3169161, 2865844, 4581751, 6868307, 3032531, 891082, 701598, 5526005, 4296721, 3251571, 4630245, 4084525, 4640947, 3923723, 6532392, 2397905, 1629993, 3122931, 4923232, 498035], -[1013954, 3233436, 1912641, 2522565, 8174999, 493675, 4399449, 3766932, 3809737, 1507590, 8330073, 6585932, 1911700, 5908661, 2302698, 1937726, 2263048, 6269694, 6961156, 5356016, 6862280, 4469937, 3393050, 4772966, 5031906, 6102619, 2100545, 1826658, 3614014, 3630218, 5679021, 5449786, 2428031, 7870161, 1948904, 3849415, 4575028, 6342375, 4731316, 1651071, 2917738, 651139, 206169, 133239, 2797793, 2786796, 8377905, 2965827, 3852276, 4580204, 1667067, 4766596, 8145707, 5075894, 2736882, 7387464, 2647996, 4494544, 2218930, 4375199, 2155463, 7594721, 2024665, 2224481, 3434277, 6033659, 1016134, 2232946, 1529502, 1594817, 5965829, 400898, 4092621, 3399888, 58480, 7805510, 4299595, 1709481, 4031727, 6744054, 4307843, 1553668, 4425055, 412210, 4817030, 3816602, 619205, 1053470, 878182, 1099129, 1123043, 1238183, 8365733, 7802804, 2926473, 7947354, 5728898, 6037691, 7418090, 4001492, 6461185, 5692095, 6885865, 1607588, 7570125, 506017, 1836049, 1246379, 2498637, 3426812, 6318561, 3889305, 3511277, 5217940, 6074695, 7476544, 2378357, 4028078, 3942589, 6249310, 7383987, 3307549, 1538465, 1400401, 2967319, 1634879, 1689846, 131038, 1863605, 5499496, 3006157, 932748, 2074161, 7080595, 8003388, 3215935, 5153168, 3874737, 5170783, 2238204, 6997047, 6091899, 8343249, 5488701, 397808, 1256767, 1352603, 2587664, 2060077, 465278, 1665944, 7956370, 1898969, 4364106, 7794671, 3060346, 5466773, 3573196, 6407047, 7860187, 7442171, 1329410, 6435913, 4860460, 697593, 5117436, 52177, 2964431, 7384476, 2423436, 2739580, 956611, 1214725, 7319672, 5450380, 7790833, 721179, 3841071, 1932896, 2713944, 2515587, 2560788, 3800683, 8151942, 1652547, 4300571, 5702188, 6479999, 7915551, 1564437, 2817301, 6037461, 7951831, 5777006, 1181957, 5506392, 5763434, 4800686, 5704968, 3204301, 5503790, 1384828, 6218571, 2014758, 4259621, 4761796, 6611945, 2318983, 4554697, 3810678, 7168304, 3462584, 3458490, 8299110, 5169127, 8260870, 7496389, 6578045, 4826837, 8178737, 8072823, 5623390, 2232570, 3525911, 4996764, 2928741, 3543331, 2245710, 4591456, 4334082, 7616920, 6772356, 6214777, 1489097, 3849439, 1232786, 1587687, 4558593, 8376404, 3327296, 4746468, 6458494, 251244, 7741495, 6379952, 6968511, 353484, 4180329, 8008034, 3747904, 1112714, 3439194, 1762647, 4023730, 7522344, 7958134], -[5648881, 3781786, 3517480, 5728285, 1650729, 6213397, 3656094, 5452810, 2200149, 1099769, 31270, 1894560, 5327906, 2048487, 8192367, 883697, 832879, 2837250, 223884, 4312798, 2218625, 1813087, 5872070, 6660335, 2970713, 5257118, 6949191, 1951313, 1382289, 6231699, 5710347, 3984693, 1234513, 6856681, 8010440, 7366840, 868895, 93541, 1464609, 1106158, 4349789, 353290, 7720134, 3672417, 3170447, 741700, 4831358, 6546793, 7881942, 6261297, 6593493, 4325802, 3264171, 3297808, 7440009, 3946617, 6194846, 5206975, 3454237, 773208, 5165172, 3137150, 2130511, 192649, 494753, 7482632, 1524593, 4347465, 2751033, 6479011, 6148361, 4864402, 6355813, 4005090, 3747527, 5598436, 4768672, 334170, 3137115, 7387733, 6937122, 6504560, 4813170, 4111934, 4038848, 6576662, 2054875, 6932854, 2601973, 984992, 4466337, 1773640, 6138559, 5865861, 8092369, 2455254, 3026557, 7901906, 5906429, 1632268, 6739444, 795953, 2384382, 7554215, 7769022, 7088494, 2504817, 7937202, 5648077, 1166172, 1083104, 5513913, 8211921, 2543688, 8116413, 4719702, 6649444, 8160086, 916517, 4297516, 5824953, 1069705, 3885920, 3039646, 5448725, 6103888, 3631180, 3264789, 1046670, 2873130, 6674383, 5002328, 5677500, 7016677, 4733154, 7724558, 4670630, 5322897, 3100250, 24935, 2680488, 7271714, 6107847, 2930977, 2391299, 3650750, 5127422, 1657995, 4338777, 7095139, 723428, 5202319, 6511846, 7983709, 3017155, 3946856, 3040867, 8352471, 7387387, 3629103, 2759615, 7393440, 2358844, 8191782, 1456277, 6543875, 6275693, 2427920, 2876351, 7376096, 5219847, 5143526, 4466408, 8064012, 2784469, 3539129, 2838447, 5987963, 2330338, 2798880, 8076354, 7195860, 4160379, 6176190, 3421773, 6239816, 343464, 6357642, 4687988, 6730105, 328960, 7745247, 4720406, 6930127, 1866770, 666367, 323398, 2910821, 263571, 5681164, 1554271, 4021738, 5089858, 4179337, 1937642, 1028263, 3857335, 5797292, 2245354, 7730652, 1032088, 748909, 1697606, 1415513, 18819, 7163165, 5632886, 1706799, 8217135, 566844, 1633836, 7799239, 6604838, 899047, 314425, 2451697, 8066214, 5820318, 1400877, 1655029, 1788268, 7120600, 3171645, 5438772, 2530575, 2119142, 4056569, 6977459, 2505551, 98471, 7013420, 7870721, 3112903, 91085, 902130, 1146652, 1897864, 7246455, 1880281, 357582, 8219545, 2499442, 6792958, 2005935, 5081598, 3784585], -[6128253, 7915070, 2598082, 1643279, 6376975, 4206287, 2056122, 120138, 2512862, 2897316, 4643110, 75314, 986492, 7497241, 3445832, 1299098, 943893, 3118881, 275456, 1808617, 863429, 5065896, 7295041, 4854915, 5183173, 4800806, 2581027, 4895786, 7636878, 5582083, 6426355, 4552370, 8064347, 4307036, 172146, 1926291, 3183437, 2583157, 1981112, 3636139, 971442, 1796370, 7790843, 135702, 3763407, 1277277, 3803580, 1715528, 7873011, 7015998, 5243222, 7808672, 5603992, 6107520, 8179912, 4619831, 5497215, 1010662, 1970681, 2802202, 766787, 527571, 1379360, 1143208, 5283728, 917366, 8014933, 1759527, 960233, 3763166, 4096961, 6974227, 5860053, 5339025, 2310403, 6463909, 5932724, 2191500, 2353174, 1387328, 6925553, 3021390, 4405017, 5201159, 2940328, 291307, 1210912, 7808597, 436863, 5121959, 7266786, 4799888, 7807263, 2082986, 1213569, 7310657, 2997878, 3849605, 6532198, 5042995, 7071263, 1398088, 6516888, 2378817, 3785885, 6036533, 7312211, 1238009, 3093264, 1493503, 716565, 5150916, 7337371, 5196598, 2715288, 6699467, 30902, 4136569, 3355768, 349116, 3795679, 4541644, 1067333, 3140688, 4385781, 7632915, 353336, 4395983, 6469507, 2302264, 2784608, 392989, 2102863, 4719605, 6662527, 4994209, 440529, 7016041, 433514, 1418774, 2105224, 3865879, 92803, 3937115, 762019, 5276383, 5296168, 8288056, 1083769, 2201648, 6149320, 1400986, 3634019, 6558902, 4941783, 3656972, 1238307, 6871140, 2512946, 3721684, 5843749, 524120, 848060, 6004089, 5101416, 576610, 290617, 6854404, 5806583, 4890734, 216650, 3516954, 3406903, 618771, 765218, 7500844, 4511685, 7452585, 8192609, 3328167, 2884677, 1439478, 6346323, 1997887, 3711555, 4050657, 3775598, 7185691, 2317440, 3880325, 592817, 6738999, 4180615, 5533687, 8101325, 6639241, 978824, 3863338, 1652785, 3337898, 4641320, 7314497, 1697337, 5276793, 6837750, 3688788, 3083183, 650199, 5477877, 5739888, 2360861, 842418, 4233010, 5776965, 6934508, 3281500, 3197329, 3764944, 5618065, 7878879, 8105516, 4868332, 3781972, 908211, 8004603, 5632102, 7323156, 1865565, 80203, 5985627, 2686529, 3981144, 1863459, 4397308, 1919687, 5806665, 1237169, 7033650, 4093302, 6208367, 1520480, 6024587, 4174979, 718411, 1859488, 3153337, 5738138, 2052412, 5103675, 5451372, 3340224, 6088800, 2301536, 2880489, 5756886, 7294370], -[4811026, 2543527, 523859, 952036, 6081653, 7574093, 8220092, 73168, 295029, 1353722, 2484995, 10567, 51992, 3388257, 2111470, 2186645, 105565, 3407063, 7010059, 4684642, 6938576, 1591386, 3587272, 7223976, 6023349, 7448215, 3157205, 3497083, 7261541, 3374507, 1262644, 7436014, 5332801, 684969, 4620023, 7949677, 2605237, 833277, 628161, 6655422, 4008693, 1985280, 2622001, 3617288, 2147230, 6558266, 6827074, 5644960, 2803565, 8209731, 3591817, 5139823, 139398, 5205422, 2760195, 4593220, 3632612, 4241148, 2800975, 6857396, 6384876, 5469107, 7740838, 8147235, 5312906, 1986923, 1687889, 4409056, 1664789, 6936530, 4118246, 953892, 7263138, 6041387, 6205446, 4848152, 6807239, 319761, 2185413, 600141, 6448937, 3230682, 7975858, 7065145, 1542190, 4962614, 6267289, 8111822, 538336, 23458, 3540312, 6157754, 3318792, 2206119, 3445825, 4837399, 3045613, 2543093, 7024353, 4774664, 8205629, 1172146, 3330254, 7494359, 4964695, 3483179, 2385497, 7069758, 296966, 680993, 3426095, 1062070, 7379100, 3096237, 817370, 5965020, 7406395, 3652113, 370165, 5821054, 2264370, 6959640, 7648294, 556882, 7726437, 3107257, 8169520, 3572411, 3051063, 3820034, 6831913, 5653824, 1383155, 5913899, 6280358, 7787329, 1854646, 5989040, 4869405, 5612375, 2452709, 84341, 5610719, 4960952, 7042537, 7458704, 2875010, 1024429, 1412095, 213209, 5507069, 4332023, 8278424, 6124721, 6681806, 1030779, 6003120, 4219895, 2252407, 4562541, 8149541, 3974428, 1248299, 6578176, 5108529, 1872535, 5073630, 3490444, 9404, 7332060, 1865302, 1855165, 3364203, 7124500, 4107085, 7339141, 1847817, 7562332, 3945207, 5161534, 3784020, 7709475, 3792133, 2562723, 4285367, 4048580, 7384350, 5636154, 493219, 3503220, 564250, 5933649, 4830850, 6658194, 1691293, 5027947, 3465019, 8037576, 4192178, 2189905, 6862370, 6747669, 7757641, 5508590, 4852443, 946201, 5174684, 4384642, 8025731, 2983563, 7691614, 4054211, 6793529, 2732277, 1998925, 1355297, 260495, 7455108, 3107341, 1747359, 4431630, 5424534, 6812500, 1816766, 1625193, 3683346, 6464886, 3712843, 3030033, 2856032, 8018305, 4755437, 4911969, 225283, 156811, 5569275, 3478201, 2839459, 6438380, 1808839, 4903764, 4455862, 6045039, 6936245, 3350208, 3978082, 4632385, 1824829, 4322134, 5772210, 7794457, 1470465, 3404405, 584840, 130285, 1961599]], -[[7484207, 1398862, 3230161, 6236595, 5855087, 8324820, 3582388, 2987610, 878980, 3744099, 5495501, 4295584, 1630699, 975433, 3403837, 567054, 6178913, 2635493, 182352, 1182883, 1317627, 1981981, 6217975, 318145, 278352, 3761501, 5977213, 7802388, 4605824, 404040, 6026529, 5650251, 7582537, 1898589, 4866091, 1213926, 5834115, 2121386, 897884, 4310058, 592313, 5259203, 5118194, 5520969, 7532186, 3649534, 8108429, 2632133, 1791021, 3212587, 1225674, 6238574, 812108, 2651895, 8072686, 6434983, 3541236, 5017328, 836417, 7841899, 5492124, 6574288, 7681128, 3562937, 7879632, 6346353, 4287972, 2994701, 3865600, 3304091, 5799313, 3499595, 7929033, 2564463, 8097434, 585417, 1099562, 4800743, 907428, 956029, 2543491, 4218929, 7604487, 3530826, 2011780, 5186247, 7918053, 6536848, 5249085, 5570967, 4983205, 4556045, 5039343, 2739394, 5419798, 5908096, 1345135, 5441517, 8050114, 1418837, 4626884, 4850609, 7742925, 6615924, 7317040, 6011167, 1580549, 278825, 6695698, 5580034, 3722718, 3644219, 6232399, 1910876, 131721, 4967489, 6791751, 7666156, 5294938, 5779819, 1326103, 4414195, 8209884, 777715, 6988519, 6985284, 5226578, 2682348, 8318827, 5170013, 624072, 8271021, 2712893, 7978523, 5684887, 2830664, 1123957, 5339800, 7821894, 7819124, 1599392, 963017, 4441170, 994371, 1273152, 7278833, 446368, 7885392, 2730838, 8098316, 8353277, 679567, 7426641, 509902, 4429732, 4075644, 4722133, 5149737, 2882910, 38621, 3899091, 8046371, 4697469, 4864854, 4016787, 7339346, 4348201, 5890273, 7449167, 2115155, 7787532, 78333, 4169887, 5805246, 156531, 8345100, 3769431, 2509242, 1824424, 4627997, 7550733, 2361964, 3541547, 1649216, 7811161, 250431, 3642759, 3795799, 3343568, 1791532, 3652729, 4380298, 3753806, 3926810, 1312420, 2323382, 2990996, 2078773, 7463896, 7071316, 5217026, 140741, 3516754, 5247685, 6060717, 2111695, 27063, 2777134, 4776862, 1849426, 2457884, 5803292, 3191419, 5464522, 3604752, 4082224, 6048545, 822343, 5193295, 1404464, 7580984, 4164456, 6787285, 316202, 3416965, 1237421, 1112952, 1371158, 2950656, 2015113, 5729522, 504732, 2956961, 2140070, 1942284, 5023358, 292386, 990886, 2107381, 2593502, 2534615, 2327755, 1716549, 7007086, 3989533, 7964308, 4973205, 1713189, 6842091, 786515, 6150566, 4719827, 2513031, 3593021, 5850873, 5482748], -[2877996, 4124424, 1198751, 7004319, 9754, 6985264, 5563151, 461591, 4151903, 318273, 3142549, 2101869, 6318229, 4660153, 4796887, 5002479, 4145043, 3688597, 5270624, 8110572, 3912515, 1987450, 475904, 2492428, 7070600, 3709352, 3361941, 3527147, 54723, 3527445, 7219088, 6755642, 2677862, 7594805, 2266404, 3849156, 7884279, 3070867, 4362632, 1582761, 7081804, 1312980, 500997, 7098631, 2960254, 8320016, 1592378, 6070242, 7488822, 1474864, 2643899, 7142717, 6058441, 5425626, 3143584, 5003211, 2482339, 5825915, 6885694, 6491216, 888863, 356634, 1960766, 5568046, 4223430, 2184898, 862876, 2966036, 1476832, 4240072, 1077906, 6513602, 3158485, 972240, 2526847, 5933226, 2184223, 2742163, 8009622, 3706049, 4967759, 3887322, 2122217, 4872678, 828666, 1007206, 7507097, 3415482, 3633473, 220708, 444245, 4017084, 8355373, 3753870, 3055035, 2987874, 409766, 7256420, 7057501, 7940759, 2690686, 2555288, 8241921, 2689466, 4581371, 4092655, 1808073, 5362139, 4066252, 142254, 7923596, 1221139, 8292676, 7368029, 3456454, 7328921, 5870604, 6751249, 414935, 1543175, 1171538, 3142976, 6066702, 325271, 2153610, 4750561, 7587867, 7211362, 8055239, 1730914, 1432370, 3997397, 2552338, 6745947, 2797470, 6423769, 2630307, 5358144, 1600099, 3489502, 3889650, 7740521, 7452003, 761023, 5793556, 3414934, 6602437, 3469542, 2226750, 6733361, 3183289, 2681287, 4034796, 5332033, 878464, 2835838, 3708467, 7041138, 6052732, 1182108, 1533514, 2336008, 5312662, 6519757, 2396904, 278876, 6956104, 3108921, 7225567, 6188202, 6002441, 5952684, 1329229, 5540422, 7744193, 1875019, 2001280, 6183985, 6485066, 5598816, 1946068, 6334175, 8179784, 5355482, 4538998, 3304989, 7874706, 5772949, 6706700, 3715649, 6879477, 8022587, 1491951, 7600851, 2306834, 6484219, 707645, 4306917, 3142086, 3955916, 199527, 7182617, 6439526, 6621210, 2501404, 7069402, 1511317, 5200509, 1471358, 4015139, 3666356, 2135186, 7742381, 2476913, 380661, 1383781, 8344370, 4135237, 4537328, 3457866, 5818782, 4039639, 3803276, 2958981, 4633936, 7670898, 1499387, 6673606, 4117197, 6917479, 4071318, 59441, 8371370, 7115133, 8028244, 5139268, 6950913, 205569, 7373668, 2851878, 2348800, 1506044, 2473374, 8125477, 726436, 1638471, 1561341, 4804185, 3479065, 678630, 8030068, 3963928, 2344574, 2877594, 6549948, 3040866], -[1332294, 1431905, 6583020, 4445281, 3578159, 5090392, 884824, 5451892, 1176416, 3119898, 1022452, 2512096, 4130058, 1059205, 251496, 6591216, 3980721, 415723, 5957345, 1294891, 6345505, 2596805, 7904305, 7931242, 2571402, 6618399, 2554628, 1082870, 8146583, 1782641, 1931623, 7605154, 7465876, 4440983, 4270607, 3293215, 6386138, 2184084, 2394602, 7546735, 2978572, 6657218, 5718061, 4245378, 3585896, 6820466, 2038090, 306700, 4524788, 2973327, 5456369, 132840, 6038410, 5712542, 230369, 5012177, 5378128, 4891105, 5814072, 7164391, 1340347, 2987256, 1576420, 3945810, 1421929, 5635544, 7228704, 6667267, 3541133, 2931264, 280305, 6185265, 6292095, 7063421, 55808, 5576887, 265508, 8332387, 6599337, 6289587, 1491900, 4330973, 1063976, 282164, 1555035, 7231885, 6244819, 5702463, 4018324, 3343603, 531787, 2584725, 5520646, 426359, 6220922, 8341337, 2958022, 7166271, 283265, 3649084, 3745942, 5533797, 7217096, 1889512, 4432744, 918297, 633676, 7160965, 5577127, 4084535, 6818226, 3176622, 2348590, 6695795, 7907577, 1976928, 5282974, 6432613, 5043994, 1553265, 2692934, 327159, 3649826, 3379284, 4555753, 2156975, 3856993, 4700880, 4964085, 6963602, 1521740, 4764558, 2187255, 7586448, 5284316, 6682397, 5887195, 7648885, 6917702, 7349628, 8230586, 297712, 533435, 3933697, 6566398, 2154850, 8117744, 1865317, 5517779, 6482795, 4119335, 6480799, 7265454, 2560307, 4370374, 8046636, 7166055, 6077238, 7833474, 7718756, 4913452, 1894873, 2824449, 7545217, 1805908, 6548972, 5462165, 2429162, 7679812, 6946691, 1833962, 606919, 4215456, 2721033, 4491799, 5705027, 5658636, 2393764, 1467734, 79343, 2163936, 7489916, 6313348, 6955507, 4059353, 2194415, 8141719, 3742259, 1455297, 3717120, 6872234, 4883661, 5700475, 3002092, 3695588, 2651519, 770245, 4081512, 7250887, 293878, 895721, 945158, 6729347, 7855167, 4716394, 7881865, 8261158, 2270059, 5472597, 433292, 7643946, 4566741, 8104685, 8285640, 2543629, 3987008, 211691, 4193827, 6401168, 6244893, 8352337, 3028498, 6907330, 3151958, 7017104, 6486576, 209986, 3838610, 3440694, 5071909, 1731300, 3572011, 8213370, 6502601, 7684204, 273794, 1483125, 3316948, 6494624, 6371712, 8076921, 3001774, 5767612, 2810732, 8007981, 3067462, 3881865, 1964512, 2324657, 5683830, 911383, 2774338, 7041162, 6016112, 5488486, 3811906], -[7265270, 4634067, 6250786, 2524054, 6384266, 2802831, 4889491, 6532268, 2792783, 6546221, 3467516, 5768646, 6249036, 2363514, 5234784, 7244796, 5654292, 7691109, 3195777, 6203918, 4759157, 6429929, 1395667, 8350366, 6819675, 533977, 7609630, 1366958, 3794326, 2802526, 2807249, 4588340, 3958086, 1923206, 3982390, 1714889, 2381393, 3716510, 4560259, 7154489, 6404120, 2536620, 228135, 3547727, 7084963, 1832254, 2975548, 3743838, 5783634, 4203353, 4654283, 7636373, 4142420, 421285, 383645, 313612, 7172355, 6058592, 4389846, 4864869, 6367300, 2859845, 6908472, 3278018, 5994591, 5679912, 5659444, 568562, 8156651, 4168252, 8102567, 7484767, 5506082, 1345818, 7979888, 54441, 4523085, 2684838, 6708566, 3804048, 7901003, 4817162, 7740258, 6976533, 2453655, 2643600, 1051174, 6283829, 6976661, 6267874, 1004129, 4455265, 6985890, 6813555, 3957163, 4675037, 6560910, 2130707, 7939605, 1078726, 3886, 7819311, 1188382, 5505051, 3288712, 2176973, 1932854, 2402391, 6523184, 4330352, 6489598, 7346659, 118983, 3481388, 4228051, 4774911, 3031121, 6983129, 1722490, 4840118, 3655661, 4993731, 2356401, 6417051, 5000334, 2120005, 6275218, 2408072, 236114, 2518313, 8017520, 2371461, 6695011, 3662735, 2021718, 8122943, 4145453, 6873269, 2250544, 1993275, 2126658, 1706834, 7266911, 2235057, 932682, 2600429, 1434018, 7528685, 7823248, 943883, 8016206, 7500018, 5874570, 3513683, 7510666, 1674179, 704355, 5146378, 1633470, 3371650, 2788195, 7538775, 2502432, 1371893, 482977, 5181607, 5185165, 4206654, 3913603, 1958739, 8132496, 321943, 7662774, 1807112, 5736899, 390841, 4293434, 1861152, 1509708, 4684561, 5947058, 2240089, 45839, 7610075, 4561912, 3683030, 4275915, 1970359, 8260606, 85804, 8062366, 1847917, 2412330, 877897, 3008764, 4577642, 1005689, 7322501, 7826265, 7469509, 4662849, 4989945, 8016270, 3098903, 3244186, 1650960, 1396886, 6976436, 355995, 6364497, 367517, 2539474, 1002502, 350022, 4639391, 5787651, 4423980, 5311845, 7055269, 1438164, 7624894, 4795378, 1522004, 1171912, 3329714, 2755679, 2618705, 6809795, 4879321, 670061, 4933027, 3310811, 321465, 6137756, 3613010, 1127913, 496769, 8063181, 7159849, 6265544, 6799870, 1795581, 4869113, 3001644, 8090942, 678836, 5460105, 6894469, 6965185, 2383060, 2953086, 6090371, 3625443, 4668028, 5969818, 1742173], -[6892481, 5688825, 6408196, 6053802, 6888138, 5752874, 5091096, 6608290, 1333452, 3648184, 5767894, 4715836, 7108134, 1834216, 7743815, 6143360, 793608, 5524615, 4546628, 3046169, 1739769, 5245132, 6547813, 6820778, 7478310, 4415716, 1896850, 1341790, 7600673, 1044159, 6591195, 792179, 1027538, 1955082, 1849376, 396093, 7059280, 3866917, 2854651, 2281945, 1629317, 17372, 1550266, 2361983, 5225620, 6385609, 7534129, 4027952, 5305941, 8331529, 6981043, 2718245, 972460, 3804836, 2388676, 5180308, 6239950, 4144115, 222874, 32999, 6120759, 1264301, 1190914, 4955489, 2929740, 1677540, 3800173, 5797709, 7329819, 4182640, 4463307, 5412392, 6135130, 4631608, 1231335, 67938, 6961783, 4003520, 7948146, 1356864, 3400550, 4437243, 7489668, 4138868, 4510315, 4908919, 1325525, 1464288, 8287356, 7682976, 3162050, 8357323, 2341254, 5680266, 2371993, 7474532, 6855298, 904910, 2869944, 36775, 996194, 1069682, 3113290, 6899662, 496836, 5081132, 6871386, 7847766, 5055044, 4995816, 7103152, 1903773, 7332664, 549637, 7866981, 3814771, 5214528, 1941670, 83015, 8046463, 8080239, 4517507, 4920554, 1234036, 3470737, 4299252, 6089733, 2323130, 153798, 579035, 4232594, 1410715, 7789418, 7597450, 7471978, 1093754, 632816, 7561661, 1592964, 2249967, 5066137, 3945095, 1958855, 8351384, 934439, 3314682, 5836350, 5017833, 6679528, 5320586, 6825376, 8340941, 3466296, 2362265, 6787107, 4807170, 4333957, 1394245, 3599035, 4768545, 1575915, 6437081, 7040097, 55247, 1654745, 1390792, 7201639, 2418910, 5186367, 7332502, 4387306, 6839560, 543808, 5894877, 2483726, 7219110, 7935831, 1139525, 6992558, 846376, 5859530, 6317565, 7942679, 37947, 5183688, 1592401, 6529717, 4035494, 8108698, 4684617, 6844543, 3158350, 5395608, 6636334, 1662557, 746988, 1376241, 3236495, 5008172, 4505726, 3259166, 6684669, 942470, 331687, 3749291, 5126514, 5820265, 8159827, 126021, 6809820, 3343410, 5159888, 3598046, 501519, 5921345, 5314976, 1058325, 7434392, 3877895, 588078, 674273, 7305442, 3188365, 7685511, 5559671, 4192277, 861624, 7536334, 2319533, 3728647, 7756385, 8364501, 6598826, 1534742, 163375, 342504, 1646182, 767209, 7034769, 3821040, 4885333, 5246133, 3588668, 3401465, 417621, 6967607, 4812638, 3425124, 605222, 3003235, 5222469, 4520441, 4659020, 2592686, 7675923, 4624315], -[4189740, 5020560, 532067, 3830956, 3826880, 431460, 666573, 3263671, 5580150, 3275760, 5874585, 4959570, 1748071, 5176862, 1881136, 6465617, 691141, 2891199, 1100770, 8261023, 4113747, 3617881, 2975674, 7685858, 4041173, 1449957, 5553501, 4773514, 3810312, 3957007, 7853804, 3006438, 203971, 8113036, 4739447, 4336414, 2169449, 4501124, 424473, 781311, 7012922, 6565664, 8207031, 911624, 2316314, 1673663, 117393, 465249, 5395315, 2520947, 5119540, 8014618, 6861865, 1031718, 681877, 454634, 4121090, 4254389, 4620463, 883283, 3562913, 4115613, 5796672, 3179571, 7351785, 6654764, 4338181, 5416077, 3156093, 2808821, 4345210, 1283437, 7891884, 1125541, 2045285, 2075229, 1387447, 2007199, 7006868, 6657652, 7140287, 3205808, 8158172, 6508025, 8377681, 4862900, 1731077, 101048, 1465923, 847195, 6012757, 763714, 6294017, 3739163, 4307627, 706993, 981201, 8355418, 7260845, 2564600, 2166057, 4731318, 8189949, 4253209, 7924705, 7636080, 4365555, 772888, 1768142, 1306685, 7521374, 3213880, 2012313, 6641607, 6602243, 2760716, 5932003, 6531755, 6530631, 6410078, 5981003, 2578512, 7649702, 6414865, 4233752, 6116349, 1917413, 1478043, 8003833, 3265784, 1521867, 3984151, 389497, 2942633, 2792220, 3084710, 6454102, 6570969, 4802088, 5191150, 802476, 2588110, 5082202, 8252585, 7194656, 7888857, 7088224, 7126635, 7254545, 1107774, 5916083, 1094568, 1312316, 6718825, 7375921, 4613162, 7896364, 3346862, 6821061, 259908, 7109047, 4855916, 5786122, 4583498, 7768313, 4133565, 6996650, 1853155, 1863196, 5516844, 906200, 4477562, 6322379, 3956106, 6863253, 6383739, 7788789, 7908501, 714241, 8207061, 4733014, 437107, 8119278, 4488504, 5822922, 7767337, 5964811, 3773354, 747621, 2751000, 1831426, 2652748, 7277669, 4223765, 5506370, 5752223, 7270315, 7466047, 511634, 3237018, 7748887, 1268046, 3211163, 7700460, 762594, 5349376, 5317352, 5256109, 3452792, 4737441, 463937, 2840918, 5960491, 281990, 2809923, 5789978, 120369, 3752813, 2357812, 7567491, 3929786, 3282410, 1705967, 3403927, 672563, 2782935, 2302183, 5357036, 5538409, 8353718, 1317636, 7952312, 4629337, 4262269, 8192576, 4293275, 4646192, 1242987, 5504492, 6146023, 2349451, 6652976, 543701, 7479620, 5436338, 4190154, 3600015, 5926659, 3954491, 5714014, 3699285, 1770495, 7958478, 5087283, 1891295, 3569946], -[2064287, 7538397, 1701410, 6692398, 3431600, 5966918, 1719034, 2860070, 7963510, 8158351, 5253319, 566275, 2866288, 1676583, 1237647, 1522936, 7931959, 3295878, 7864774, 7501524, 1044599, 2132524, 4810773, 2340734, 679501, 1481389, 3545268, 2973722, 7366213, 2698372, 3459652, 3709749, 7456968, 5715018, 6636305, 3729062, 2833227, 5879416, 5406117, 781615, 175863, 3865580, 758176, 7744206, 1914882, 3120618, 2651096, 4603140, 7295198, 3506041, 8027845, 6210098, 1990501, 481437, 738205, 7897895, 6898338, 3479403, 6065228, 1841662, 4888726, 5598386, 4785758, 6837766, 2940975, 5510652, 5643773, 136423, 1407522, 6755845, 7179057, 2688261, 5710611, 590548, 4470456, 7024065, 4153270, 4541349, 1255524, 1645470, 2763645, 5237491, 4706300, 4660171, 6594112, 6630581, 2713007, 2041515, 1356921, 4779328, 4645766, 4886815, 2588029, 8021517, 6658728, 547034, 6488812, 695550, 7160167, 5918762, 2473293, 2593517, 8295315, 4903675, 6734028, 3719147, 6278945, 7178693, 5185274, 4658151, 6935036, 5215940, 7608510, 4824835, 8273998, 1182395, 1045103, 2682146, 4546469, 4300336, 4286538, 4879969, 5527623, 7244471, 7970328, 8244494, 3035012, 5959435, 406435, 7789343, 2657498, 4989012, 4216523, 1517667, 1305321, 2069601, 4984735, 2441342, 7585824, 808842, 5170240, 3292273, 8316001, 7809544, 2347137, 3664902, 6421568, 159731, 7118092, 6828866, 5760482, 7265976, 4698602, 3411936, 630024, 6698406, 3395223, 5958735, 6984905, 3132440, 5621114, 3995504, 665568, 860449, 6580675, 3448746, 2229821, 7529207, 2649775, 1186071, 6234692, 7451976, 5762821, 94247, 7157366, 2833082, 956459, 4569649, 7715883, 8347776, 3006275, 7370970, 3734708, 1919084, 1977095, 7337386, 3680085, 5355607, 3207798, 3311878, 5514375, 584253, 2992778, 8006776, 3190562, 2915892, 3330467, 4622787, 1403118, 1990601, 4541749, 1470908, 2429084, 8328944, 3586219, 4686514, 395647, 5842073, 7234799, 2799072, 8083849, 5322562, 6654064, 1847701, 3797747, 18947, 7948329, 4491608, 8137493, 1173344, 2517742, 7933058, 4604314, 721883, 8211781, 5384837, 5009467, 3658001, 426518, 1734177, 7951028, 3635905, 1247086, 3633795, 5283865, 6420083, 3145285, 7214906, 2035587, 5784531, 3303010, 6178688, 4631632, 6579312, 4227601, 4462950, 3101417, 2149614, 3336063, 2110448, 5784497, 1220553, 4096902, 1750082, 3145805, 3217584]], -[[5683391, 3710350, 92719, 1308362, 7290103, 3944071, 753228, 2477620, 5628327, 2844743, 646481, 1331593, 1103650, 3107746, 7647179, 4318608, 7294668, 2756838, 4884808, 8285339, 1269566, 1770852, 6974741, 7195195, 1683878, 104725, 7371601, 2657716, 4117127, 3054077, 230785, 1503264, 6762082, 7512641, 5998732, 3430376, 1376117, 5125504, 4495264, 4616177, 8234425, 5948466, 7945236, 2826866, 1747539, 5382666, 8271396, 2763986, 1798221, 5617535, 4514790, 3912812, 910278, 4430894, 4472792, 920498, 7831594, 3391036, 8159560, 4482961, 5644483, 3970881, 8317951, 3361483, 4832442, 5727054, 7668045, 6812533, 6952711, 746664, 5874158, 239779, 1366675, 3864332, 1890651, 1171664, 3421772, 6882534, 333444, 4431937, 3877383, 3518335, 3967629, 2426444, 3732139, 2315628, 2950494, 3869759, 966542, 6758356, 5071254, 7497892, 3562349, 2725540, 2100949, 4875092, 7950602, 7973212, 1293637, 7783907, 8184304, 6914214, 6956953, 678440, 3964167, 5019123, 2953816, 33134, 7103616, 4771436, 374294, 4967828, 2195906, 8286830, 1905910, 417751, 7106533, 6082346, 1943376, 1115236, 2587573, 2862562, 6824032, 3597436, 5275150, 7812016, 6019254, 5462659, 3384997, 5497100, 4397929, 687520, 6166316, 2144845, 2358303, 6942245, 8138531, 815541, 7603570, 5018190, 7009997, 710061, 1576455, 212713, 7094710, 2670726, 1384932, 2476995, 3000927, 627627, 2155112, 7340356, 1188666, 4001321, 764087, 7106602, 6550930, 5399850, 3375346, 3708768, 8144182, 4709848, 7340111, 6745872, 2635217, 1414146, 8165502, 3657014, 2963298, 6118933, 2423496, 1794421, 3722883, 2062261, 4583571, 6265227, 1970404, 8088295, 8002594, 8368139, 6288791, 7387656, 5171444, 7477085, 6576009, 5466034, 2704096, 8268019, 1925743, 174523, 2530070, 2560462, 518848, 5671761, 6596698, 5486552, 584502, 2382640, 7166679, 3495914, 4669506, 132828, 706321, 34309, 2170945, 1739874, 4124945, 8312651, 123306, 2794030, 5326396, 1432097, 3395293, 74078, 4861039, 6015628, 6213190, 4649215, 1570113, 5446964, 3260667, 7749376, 6487671, 3664254, 2236782, 7021557, 696484, 7911555, 1086990, 3198664, 17850, 3683312, 3288003, 4217996, 555822, 4614956, 6176937, 6459481, 7876317, 4893512, 7383955, 7940986, 1675795, 7770017, 4412811, 7626775, 7813763, 4350655, 2087956, 2026481, 5154897, 3610764, 6676835, 331133, 3184716, 637448], -[3845441, 5948345, 2526079, 3527655, 8340658, 3871182, 5148928, 5273305, 4432905, 1891173, 5260826, 6465732, 4540806, 2818528, 4544029, 4430633, 3482639, 2702517, 5146042, 6419635, 1109684, 2372543, 8311838, 2085052, 3507878, 26762, 7716435, 8042736, 2138382, 7979425, 76163, 4807471, 3606062, 7946765, 330929, 734329, 4104102, 1808857, 477449, 8163261, 6971057, 7843251, 4927691, 6677920, 7665717, 3750609, 4701258, 3058870, 1251659, 6129335, 3556202, 1283857, 7630073, 1124997, 3130214, 1734737, 6007745, 4348698, 1397023, 7082059, 1163772, 6078529, 3517091, 4020385, 897223, 3798751, 7959469, 5063932, 1267106, 52148, 5430708, 2714705, 2666072, 4875376, 1226832, 6721928, 5063888, 6380967, 933788, 2481579, 2263113, 7780343, 2048034, 987223, 2698835, 4314650, 4962142, 1974605, 4487825, 898178, 7427615, 2636860, 2146730, 384510, 5570125, 4600025, 2744349, 970545, 341361, 4100257, 2926654, 6861050, 4939857, 5174127, 2490985, 4322473, 6611647, 6683729, 4435760, 3273613, 4556997, 904654, 536191, 1109818, 6632377, 767075, 5487421, 1211712, 3135240, 4474932, 7124961, 2680467, 6172472, 637392, 1445508, 1741521, 1569219, 3534604, 7302355, 6016112, 545828, 4227739, 5696466, 5642100, 6919350, 8144659, 1677477, 5773615, 874454, 1757969, 5750019, 1593476, 6362379, 1713607, 2706621, 3233779, 6479540, 892299, 4636373, 6377149, 5664978, 13120, 8281728, 5159402, 5696454, 5605574, 4653622, 1817441, 171885, 4374113, 3492702, 4162724, 7346068, 4733212, 2311547, 2477432, 6274796, 5416878, 1617111, 222937, 725686, 7257772, 6728147, 6471494, 763061, 719071, 6524550, 5519922, 971694, 2743166, 1508664, 3216851, 1060612, 6929127, 574077, 3871271, 3989461, 1099586, 4101828, 2818783, 4684972, 4972365, 2089600, 43683, 4556841, 7602949, 3615224, 3810031, 3427704, 1895016, 3547470, 3704258, 7424605, 6413426, 3248473, 2785536, 1654293, 3783061, 3425238, 3710350, 7102589, 7479478, 822457, 5167322, 6826453, 87829, 5699697, 2120761, 6801762, 7653895, 4940055, 7463717, 6572931, 7651737, 1239232, 3285823, 5308731, 6587411, 635269, 8068897, 7814186, 7007527, 6594288, 4494652, 4786689, 6077348, 4353010, 3982747, 2629676, 6452340, 2511502, 5592118, 7629882, 7821505, 4997854, 4071122, 177996, 6561917, 3801074, 10598, 6352643, 3098145, 4116065, 1527167, 7537296, 1578787], -[3891096, 6185093, 4971478, 4257325, 1020462, 675281, 134694, 4822802, 5810277, 3955271, 1491528, 3794827, 253530, 6428696, 4818163, 2884145, 2903266, 298298, 4603064, 8160714, 5792499, 865799, 1619577, 533766, 6972000, 6098559, 2326570, 969769, 6130060, 4397918, 6968167, 3637012, 7283379, 6301530, 6195231, 7955036, 6469135, 4020548, 7853350, 7961177, 3028661, 5220419, 6277568, 4695048, 4029424, 8010317, 4689206, 7720318, 4002318, 1113351, 2234670, 7906967, 439390, 5063227, 7370501, 7895781, 4524, 795561, 3628925, 4723394, 5398137, 4562159, 807714, 5878753, 4272113, 1357717, 825704, 5887330, 4319744, 4196390, 6727146, 7306212, 7203743, 2697266, 4687508, 4697954, 2530266, 3688268, 7307078, 2964441, 3293843, 5911467, 8214149, 5127001, 671444, 6351888, 6998433, 3710780, 643318, 5062735, 8069513, 7433864, 1807428, 5642159, 2721109, 2096781, 5836671, 1518576, 5844253, 2863227, 2592012, 479290, 549486, 433947, 5491622, 2252945, 3090577, 4722684, 7096096, 5137542, 6307772, 5188696, 4497272, 7105336, 1756597, 5072162, 3158415, 4870493, 107132, 5609711, 1827485, 1840804, 3017463, 7261892, 5897131, 3893754, 2336067, 3534738, 3862427, 1668761, 2059021, 1408013, 2645537, 6802499, 7345627, 6877105, 4304158, 1135307, 3684153, 6344078, 5869579, 5248261, 6501, 4693562, 4705703, 41217, 7487942, 77835, 1222738, 2992465, 322889, 3158864, 6610809, 4150224, 1441527, 2152252, 7620592, 7839794, 7057093, 7546652, 3054583, 1998065, 5085277, 2923084, 5624592, 6130206, 3219899, 2027486, 7892198, 7381486, 5754551, 7300624, 4279935, 3771460, 2850110, 1323702, 3628136, 7404930, 5343431, 6826326, 7577609, 119856, 2490216, 3433424, 8281375, 7149694, 7470393, 7906970, 5758272, 1139062, 5235439, 5968308, 434025, 6653678, 8324197, 3846059, 3352235, 2432978, 461841, 718037, 1241021, 6979115, 218058, 3620647, 5247186, 1630029, 1422383, 405956, 4371450, 1083953, 3691402, 7412225, 2952833, 1155508, 4630029, 6642268, 2222359, 3074423, 4496171, 722030, 1933910, 7783306, 5363795, 4241947, 4478330, 6369040, 2701766, 2893780, 1619372, 6732951, 384933, 587101, 376500, 7168867, 4352422, 7298991, 5641566, 3365784, 7788116, 280828, 3611013, 127448, 6495127, 3602655, 4039854, 7342936, 6614505, 4220213, 2049870, 1984412, 1135319, 1485097, 1820592, 1367085, 5005544, 5806867], -[5490328, 6103382, 7375552, 1282221, 3029624, 3110897, 151679, 1735155, 5636900, 8126990, 1822332, 320718, 5264538, 6595771, 7535240, 1176690, 4927375, 5026013, 3009081, 6115026, 4933795, 3745120, 6615052, 4593525, 514722, 4739787, 5181504, 8049019, 4876778, 680977, 7823729, 7102549, 1731093, 2650587, 7288671, 7007274, 2329313, 5913831, 2625239, 1421543, 4096507, 5287827, 7741390, 4467290, 4934718, 5941948, 753373, 1958841, 6845215, 5533006, 5176679, 339157, 5901403, 4314943, 2052431, 4561751, 8256012, 311349, 8016485, 4340808, 5194472, 3475832, 5959032, 7415319, 7054535, 5058689, 5662985, 4728338, 1899776, 2812415, 7321986, 706825, 5980822, 8303324, 2917536, 7593600, 634645, 190380, 3762069, 3640030, 1337266, 2747661, 2134756, 6449709, 2186332, 8114154, 4930325, 1403549, 7856665, 6036945, 2567732, 557921, 6034843, 7263045, 2796676, 5289811, 2167016, 4190744, 2692845, 5648414, 3505129, 1677213, 3177843, 4018468, 6093027, 5311844, 7524766, 6330320, 4846043, 6672832, 6410792, 1134778, 1435678, 6954372, 8332817, 5592628, 6524481, 6584781, 2969407, 6682130, 7722806, 2292745, 6806724, 7580684, 1286847, 2361421, 4195108, 1821989, 2594429, 3725881, 8082694, 3927265, 6173582, 7435094, 7974320, 2663486, 7826202, 174879, 1787137, 7009547, 4990512, 5055362, 3292997, 7550092, 6894673, 2323713, 7943700, 5251060, 6784237, 6975398, 2847573, 631158, 2767586, 7384238, 3609378, 6410445, 7439884, 8325182, 5570429, 1838353, 6650691, 1047299, 3756663, 1947278, 367966, 1371153, 1193339, 3048657, 7415152, 8245192, 7239919, 5509247, 3838864, 7020648, 4552428, 7039101, 6660695, 8364395, 7548446, 1795311, 2262848, 7388484, 968001, 7165526, 6934633, 3201576, 3398382, 4326142, 4988619, 58103, 8206263, 7471474, 5800029, 4648766, 7643818, 2706946, 7690640, 4191529, 1932311, 7548429, 1618612, 3822340, 5674483, 398672, 2183801, 1417526, 7678333, 509238, 8288451, 3993762, 7699208, 4897923, 4062488, 5912152, 7263613, 2633162, 876336, 1318836, 7965983, 2964620, 3043715, 6108188, 712841, 4418616, 5403849, 2627894, 2517626, 5918639, 4777756, 150791, 81461, 6759800, 2272791, 3839455, 5446312, 6664687, 7620308, 2740215, 2187833, 6951716, 3506031, 4437310, 3800782, 5251191, 7359081, 5375135, 3263448, 1005779, 8174544, 1089636, 1270856, 6781891, 4956628, 6664988, 7957389, 5791918], -[1960391, 6492981, 2680159, 5794776, 2695689, 2994834, 4319039, 2802253, 5456051, 5880760, 380440, 994922, 1273115, 973634, 1330084, 551564, 4507054, 2810921, 583228, 2882919, 917977, 245061, 2491996, 3112425, 3368498, 1925914, 5961626, 6760898, 1678195, 1608615, 3952754, 2755186, 7601800, 950361, 3833227, 7413328, 3301678, 5924922, 6817243, 1431720, 91360, 2995101, 4507620, 2729246, 3477020, 4551907, 817811, 3127024, 2405339, 4054149, 5605307, 5248727, 6087820, 5749850, 7714642, 6728393, 3591532, 577585, 6473552, 7522817, 1392819, 6880935, 5312690, 506945, 8091145, 742929, 6799260, 2652586, 7452729, 4541860, 3381481, 3061014, 3376644, 5481519, 5731437, 1932141, 3621310, 5147332, 806862, 7357747, 4986069, 4576253, 5069876, 2652690, 8064760, 3839600, 4424535, 780086, 4691504, 1699483, 5974470, 8020211, 1201612, 809656, 4464587, 7252763, 6052120, 6076335, 3083068, 3168047, 4957750, 3478661, 835216, 584933, 4127478, 4942548, 2728615, 1054891, 4836533, 3177007, 2577866, 8073339, 3264847, 6210100, 1043897, 6918130, 2532474, 6341590, 413784, 6546039, 900589, 4908413, 3854232, 1298302, 8293745, 6435805, 5588713, 8162310, 5733943, 564722, 2568541, 5535776, 1334324, 1698880, 506678, 7038492, 6452016, 3572627, 148130, 3717450, 6821979, 2914494, 3924012, 1545574, 8276309, 2424409, 4448223, 7133022, 869513, 5849107, 8117963, 3771355, 8324513, 562863, 8346779, 7642036, 7777906, 6411315, 4438572, 2928891, 4155741, 5247557, 948670, 5148880, 2836540, 6068476, 2790331, 3860362, 6130088, 3493728, 318684, 1574949, 6425420, 6630654, 3591850, 5439494, 6254389, 5600976, 2534116, 4057493, 3751239, 4348479, 6989249, 2345693, 654691, 3403550, 691586, 1979429, 8064223, 4606604, 739758, 548107, 5179586, 2730203, 7257148, 2610058, 365507, 1384500, 1967234, 1705797, 6700681, 7225578, 7389586, 6165942, 922604, 5114800, 7891846, 1154582, 3049978, 3867059, 6029908, 4114632, 3496583, 6250390, 697990, 5041106, 4313626, 3439979, 4213705, 3476530, 7441723, 4038065, 5458545, 6069422, 5275723, 538502, 8104834, 1741116, 5251792, 1927295, 1078520, 2405168, 3132377, 6658912, 2024428, 135843, 894294, 978881, 156397, 5845025, 903581, 7596297, 5894171, 741065, 1568180, 1979423, 4668001, 5184514, 7454511, 6928227, 2360543, 2878160, 3997382, 7975802, 2949452, 5117284], -[24448, 911491, 7427273, 3055044, 6727997, 1380282, 1024871, 7315650, 1758021, 5081711, 3522078, 3823749, 641736, 4837778, 247446, 6899785, 7829133, 4293145, 5196979, 7771104, 7351477, 1468067, 3457945, 7194757, 7472864, 7116529, 1379297, 7875722, 4722927, 8125863, 2373250, 4752283, 7397445, 3101527, 8218504, 1096673, 2314375, 3296859, 7363912, 1815690, 2998871, 1200499, 8260569, 634424, 8258449, 6894614, 8285099, 141189, 1949477, 8040110, 1786560, 7358607, 5017383, 5295747, 5585198, 4398961, 3653257, 4645692, 6961420, 7294531, 5967803, 1051854, 2995747, 5678452, 7377075, 1447653, 6063890, 1270842, 3865195, 4744815, 7998826, 1064391, 3606436, 966076, 724279, 8196623, 985045, 3944293, 3044492, 7283955, 988148, 681120, 434246, 345234, 5945994, 3692422, 7323481, 3316639, 4844627, 5288159, 559594, 2447028, 1454464, 1765968, 3869036, 2189817, 407292, 8179694, 5477854, 227526, 925453, 7975518, 824609, 5699764, 7844466, 2053154, 3982992, 1350080, 4486299, 1319191, 3664229, 6996815, 7497336, 659671, 5732007, 6343583, 4360474, 4174342, 8106737, 7085598, 7445358, 4795540, 6007096, 7363100, 7571393, 2467383, 3261958, 750473, 2092204, 4523560, 5954472, 7733481, 767316, 1731503, 4690616, 7602015, 8267516, 173659, 6240898, 4452819, 948704, 1582705, 3485660, 5320108, 3364478, 5560344, 1652741, 805836, 2119977, 856448, 3545859, 6269842, 977818, 5482292, 8286115, 5928481, 5545946, 945323, 8064057, 5062629, 8101232, 2361444, 1342352, 5074037, 6451710, 3642825, 967000, 3068060, 5679383, 4875558, 1902169, 7646938, 7956660, 3764508, 7530686, 1489544, 4359946, 3577810, 2163531, 3112585, 6344303, 7437705, 3104641, 2903089, 7703074, 1986921, 6498273, 650936, 7190182, 4977232, 3735528, 1191251, 1268285, 3421582, 7161511, 1539658, 2827847, 5057412, 4975728, 5574462, 6753096, 5757133, 2298886, 7952150, 1147000, 172458, 7337009, 1366819, 1902206, 3817146, 3153154, 6804049, 7253881, 2060635, 1315198, 1301267, 1231714, 1867468, 184067, 3629133, 1075220, 8184728, 7934963, 6465061, 6187164, 3396129, 549001, 3820231, 7577133, 332606, 7740569, 6964709, 517732, 4604688, 5573216, 521069, 7563427, 4203692, 1143995, 1523296, 6740048, 6728098, 1281990, 1608403, 856636, 1488357, 2426433, 7966635, 8157559, 5277437, 4963441, 2998979, 151003, 5975265, 2337800, 4791086], -[853006, 3965114, 5798521, 2355536, 473987, 2094950, 1746940, 3439199, 2184668, 1528327, 2814729, 7208660, 739852, 2295255, 1239273, 770499, 1130010, 7149225, 965208, 2409132, 5887529, 4581272, 7786968, 6556903, 6112103, 5435067, 1716408, 2924294, 2646088, 3190283, 3499688, 1778366, 7772718, 4874214, 2787961, 457558, 254830, 942496, 767122, 5419708, 2192423, 7273882, 7413199, 3336916, 233451, 2108313, 5041745, 3389504, 6217239, 1702498, 4738958, 300807, 3472322, 3902738, 5011384, 3733792, 5222317, 6948108, 1111755, 6517087, 2914158, 7000117, 4428692, 4450110, 5443175, 877295, 3646490, 543826, 3563968, 5868858, 1436491, 3674677, 6746738, 6136970, 2441634, 3309425, 5499044, 4424694, 1161656, 2693751, 6636057, 1239961, 4920262, 5871366, 3502632, 5116544, 4911027, 1612766, 1034534, 509103, 3278852, 5908563, 623688, 8056947, 7735596, 1914792, 5900891, 7691411, 1316995, 6751492, 810226, 3353662, 2661343, 4458342, 5917673, 3109593, 2208143, 1009948, 4987592, 4786600, 6984048, 1898867, 6400767, 2620334, 3692795, 4464587, 5231992, 6303993, 1797052, 2853704, 6417686, 6782822, 3650870, 4488170, 4025408, 5710940, 616570, 4476180, 3569417, 2565452, 3734889, 911583, 5755623, 4754613, 5320042, 5568908, 4826025, 7685369, 984166, 2446207, 722936, 4592228, 3614133, 44202, 289014, 1906484, 8058444, 2875352, 7368410, 926432, 3777554, 7015834, 3606747, 3836257, 63917, 2656071, 2646224, 53954, 6673012, 2562718, 1420073, 1635984, 6575278, 2069706, 6629513, 2293698, 527493, 3846643, 2241747, 3736104, 3223765, 1533664, 1474159, 7819457, 7650427, 7950472, 3346343, 690335, 491626, 8119383, 3341691, 4319927, 8162307, 7444286, 3747712, 3440703, 3469757, 5985746, 4225955, 705945, 6439342, 8093677, 61798, 6626687, 4309974, 8262902, 844978, 452, 8044627, 4068662, 4044885, 7791150, 5185798, 2216436, 7238558, 8025482, 5205687, 5421381, 7276796, 3546405, 189627, 316710, 5752157, 2501730, 4811974, 4010658, 2011957, 6306560, 3965919, 3731480, 1399952, 7493624, 1997305, 6885143, 5167542, 5304802, 7896963, 4466286, 5230402, 7533362, 7552379, 2209957, 5255290, 2160918, 7922991, 1650354, 7646074, 2821172, 6992810, 1060641, 6475595, 3694520, 6826389, 684812, 6687845, 7118866, 6151799, 6938089, 5613508, 1617252, 3806555, 6052647, 3375998, 460657, 3113800, 6571280]]] -s1Hat: [[5795647, 3150302, 5761214, 72796, 2266350, 6924562, 6191710, 4214634, 1336751, 4238696, 7592796, 2159125, 5848504, 4844318, 6573695, 6686111, 8357433, 835445, 157395, 7303916, 6588758, 837730, 843272, 3312442, 5643095, 4080364, 4048366, 40873, 6396702, 4747670, 1570463, 2326475, 6561750, 8025716, 5633476, 4483686, 1462341, 8359766, 6737641, 1956744, 3404848, 488982, 5751175, 6906454, 594413, 8363428, 4389333, 69269, 3815336, 1348627, 8373909, 8365022, 3482251, 7041865, 7306425, 1550567, 1882569, 1912996, 4143590, 5074495, 1167162, 3102841, 7989002, 8149533, 965003, 3366442, 3684153, 1175633, 4883063, 3718574, 6246334, 419135, 6753720, 8152352, 8291950, 6602975, 17937, 4220092, 3027474, 5379264, 2275, 4097168, 2107701, 3391767, 5314207, 901476, 6010766, 5729071, 3941058, 3815443, 8116932, 1738505, 7047820, 1162479, 8072637, 6611116, 119081, 1003931, 164033, 8007953, 5333731, 1003603, 4807358, 1249177, 7575880, 450378, 6591435, 7369346, 3775550, 6506459, 5340081, 6999878, 7190151, 5226240, 6058982, 4368572, 4138180, 7381248, 8267598, 7793721, 5114279, 3283739, 2251895, 31698, 3922389, 6263873, 4184574, 2427319, 7835643, 4506324, 127266, 3526243, 341269, 650594, 5224491, 7269124, 6417481, 334377, 616254, 7992832, 6154385, 3077993, 4950088, 2362844, 1886191, 3040677, 2510860, 4119625, 2085030, 4844539, 2904940, 5945485, 4467886, 4119194, 2582006, 7176134, 1280915, 31882, 6730022, 744177, 2428141, 2200455, 6888105, 2288192, 3562211, 1551121, 5633473, 6685202, 2707345, 2233115, 5824472, 77656, 523169, 1414621, 3560903, 2469298, 5009442, 7898198, 429315, 7750314, 6367769, 4612983, 3327000, 2340908, 6568536, 6827196, 3399524, 7024260, 1375254, 5830403, 2319527, 3958281, 180585, 4394514, 2005930, 3666266, 5734950, 1688091, 4629570, 1305699, 4499339, 6296001, 4961620, 1882644, 2512083, 6741794, 827858, 1385426, 7712054, 712049, 328281, 6091668, 1355595, 2707459, 5816135, 36351, 5821274, 1804511, 6819135, 6253963, 7284305, 3071199, 2912600, 200908, 4689401, 1908853, 2322028, 4586006, 7818432, 6550217, 8120410, 2352478, 7213643, 1872281, 5294908, 7478978, 2193154, 2795257, 1499615, 1611547, 5515853, 6449513, 2335204, 3381388, 7342801, 164336, 6575088, 4012267, 8253357, 1915394, 6062895, 2950942, 5508741, 4385532, 3180426, 818743], -[7151875, 1460286, 3779147, 2797845, 4811306, 5419464, 6753226, 5694248, 2370198, 1786178, 931182, 7859667, 4212058, 1252827, 7958658, 1353091, 4208922, 4421226, 2746249, 4722939, 7755899, 4959990, 965729, 6519033, 3659620, 5159830, 6887304, 4009839, 1618838, 3429110, 4010083, 2883381, 5682293, 7114304, 8187150, 6030738, 6272538, 1801148, 7770281, 6220736, 6067318, 688099, 677184, 7548805, 2791915, 5556038, 7971323, 3794919, 7032458, 5825575, 4548090, 4995366, 2994003, 213799, 5634793, 2760494, 4801623, 4185089, 7725355, 4477619, 4494551, 2172618, 7718530, 6066283, 2144979, 7244906, 4148645, 713253, 6202226, 6222332, 6029876, 7831357, 6023837, 1308989, 7736208, 6539395, 1099109, 4187155, 364971, 3117229, 7409649, 4102620, 7357000, 3265697, 8089895, 4385210, 6246408, 7538926, 3462686, 2208874, 1368532, 5892036, 3946331, 3694260, 7208729, 817649, 1924077, 4256761, 2689823, 4165659, 900897, 6815584, 5327960, 4232581, 2277362, 3516382, 2494122, 546984, 1506704, 4063012, 2418940, 7495887, 871147, 5007958, 5369712, 6956562, 5521691, 1918109, 8366343, 1195651, 3514248, 846301, 5116585, 2975539, 2144316, 7622382, 6159253, 6692053, 1086452, 2052779, 8299643, 1160535, 1328966, 7427487, 4180778, 7718281, 185624, 2672762, 900197, 4636933, 4743192, 5325988, 5083166, 3213145, 2489648, 3807530, 3198620, 1029556, 1187414, 7984371, 8106531, 6186659, 296074, 3776452, 5632802, 5457021, 917438, 1935963, 1106681, 5121716, 5208847, 8188872, 7691062, 1216545, 8312888, 5129642, 4664147, 2989029, 88805, 3960967, 558279, 7079551, 8034422, 8306258, 6492685, 779099, 5719596, 1258639, 6852737, 4645572, 1550886, 1772755, 7676385, 295344, 1434580, 4308662, 1117011, 5379707, 2183429, 6827463, 3081078, 4353259, 6870390, 3228048, 2506658, 1359078, 789929, 3937603, 2346512, 5293653, 3775686, 6009227, 6089431, 2388938, 96981, 7919616, 5647575, 1362269, 4205221, 925980, 4139068, 2840967, 1148588, 6517475, 6164119, 2794406, 6208963, 7039692, 7639253, 4342331, 429917, 5224776, 5446088, 291586, 641054, 1881035, 446264, 3898200, 6589430, 6061339, 3754558, 6745543, 7046183, 5474018, 7447495, 5101052, 2821590, 5992416, 3866877, 5765950, 1596148, 7417539, 1430171, 5847174, 8349914, 697355, 3460737, 2294578, 3626548, 7912444, 5221528, 6085186, 3238008, 4173425, 4917828, 3073901], -[5165910, 7508523, 6136157, 7092897, 1989069, 5382216, 4537391, 7269969, 61242, 7729887, 2235094, 4825796, 1463414, 5391268, 7043218, 2056267, 4616504, 1333028, 2880498, 5343036, 4323425, 1190874, 6144562, 6417547, 1067841, 3085417, 3815701, 5988306, 8041686, 4181803, 6164865, 3594826, 4882806, 6916121, 3501199, 3563633, 7510370, 8108, 1777842, 2982607, 5095312, 4167266, 4465534, 7963731, 4141136, 3860294, 5313402, 4505358, 4987184, 5383760, 8027012, 5017245, 778248, 170575, 3380103, 2499811, 7443783, 6401947, 6404624, 924632, 2848401, 734228, 8195474, 324676, 2133477, 7902597, 6332337, 6059523, 4501988, 95105, 1553797, 337931, 5253085, 1645715, 5995282, 1238538, 1998690, 2765405, 1094983, 6263371, 4035926, 6292372, 8320046, 8012173, 1119137, 1898875, 5529768, 390697, 1266807, 6756123, 544335, 6591132, 1689751, 2141708, 5458817, 407063, 6093385, 7091704, 5794026, 1624416, 6634659, 6014887, 2068641, 5014960, 4902572, 384896, 7398651, 7470390, 4215288, 1418897, 7743411, 7483555, 5712419, 6342296, 3514360, 5654700, 2168407, 806193, 8046287, 6786917, 3470178, 7919698, 3117736, 8249459, 1106705, 134851, 8315549, 1824190, 5341004, 5384861, 2377042, 3764106, 3781293, 7232654, 5804693, 2570019, 5187771, 3291296, 1053566, 5390852, 1806844, 4176210, 1031824, 8037171, 1102287, 4549996, 1682869, 4086803, 2207521, 1476853, 6155709, 6021544, 527068, 6021873, 3420479, 3791561, 4564909, 6884226, 2297416, 1001014, 3456304, 7978168, 7864081, 6474704, 7294567, 189002, 6730217, 3844279, 5216942, 5246428, 1344024, 139635, 6787779, 5089428, 512388, 7568327, 2201671, 2612616, 3792887, 7967057, 4251140, 7612127, 3697913, 5951767, 5829773, 6842557, 7771544, 7174683, 4272439, 2821249, 740958, 3276280, 4691924, 4523318, 8291494, 1114377, 942976, 5930280, 6392889, 129435, 7493961, 7394628, 5811217, 8048889, 3454984, 5598482, 1823487, 6356935, 2428931, 2982560, 7522215, 4855245, 6180155, 7365317, 3477330, 4305342, 2715920, 5428577, 6688879, 6910687, 6007482, 6538858, 3581829, 4143429, 866402, 3662964, 3341130, 2942034, 4964150, 2376352, 7649915, 8237162, 3944038, 4736098, 6277242, 7393356, 2299012, 1211658, 6331808, 7544530, 3486398, 2180438, 1240594, 119391, 8373658, 2098556, 6702493, 2279223, 2636458, 1633123, 1366292, 624488, 4723119, 2743833, 4712575, 5402758], -[7026961, 2185768, 771806, 2120769, 3125969, 4544875, 5402957, 8030344, 7563176, 7342287, 2150838, 601073, 2617396, 4125810, 7853309, 6589193, 8959, 3712147, 3358323, 4776550, 7016772, 2964318, 7010311, 1660424, 7734119, 3365715, 5173906, 486936, 5594242, 969764, 2021290, 6996729, 5060171, 6697597, 6758739, 4889942, 6986108, 6361676, 6904128, 4594704, 7799568, 1539724, 2911783, 1103743, 2880017, 2045171, 1348006, 1504456, 7285949, 340418, 741003, 5908881, 1095654, 1463671, 7603542, 4091705, 1585982, 71557, 3623030, 3216250, 4259381, 5235021, 520420, 675712, 6629205, 1949355, 3470421, 6290423, 7451369, 4690422, 5284380, 4515335, 5935319, 153859, 4893579, 5340490, 4700627, 3909859, 7278600, 2837372, 2912009, 6293666, 8295140, 7236660, 2423974, 2085137, 2593864, 279419, 5167864, 6303428, 7487194, 761023, 6199022, 4479322, 5657905, 3128634, 1937528, 460640, 1248529, 1302242, 6746045, 6566765, 8285194, 2194889, 6972238, 6175678, 7870543, 6145773, 5043305, 5400229, 4630279, 6540563, 5930843, 7020425, 5595285, 5047063, 1781759, 6928296, 1338247, 5591596, 2741032, 2636007, 2345111, 190488, 2601299, 5756273, 5213801, 4168872, 4267666, 6921630, 6784253, 2751398, 6484197, 5662911, 2528542, 1508946, 329989, 6175241, 7748090, 3001740, 9818, 6329820, 775880, 2877728, 3084025, 7647566, 3684286, 7604994, 7996268, 2241346, 749932, 4171599, 5592726, 816871, 7574647, 2406175, 7382081, 1709372, 4000657, 3201538, 2550042, 5568818, 3842756, 7659492, 1716586, 5342806, 5887976, 2797303, 3126430, 7135256, 8309606, 8149823, 5957802, 6431071, 2712321, 8349006, 1919608, 1644339, 5554624, 5584696, 3485605, 2877607, 2967940, 2309440, 4109165, 2604769, 8195600, 6453514, 1424412, 2981345, 5812857, 3079824, 4769177, 2392579, 6894709, 211496, 1737234, 7559766, 3944753, 3951976, 7904260, 4422540, 685409, 1764823, 4526123, 6230055, 1443615, 6542238, 2207956, 2487931, 1534268, 984098, 2352007, 624699, 2864845, 1598074, 5669258, 4207264, 3516109, 867375, 2270006, 7192518, 8327083, 6000744, 775704, 4197481, 4063685, 7415846, 5358554, 3110982, 1431613, 2740900, 8056811, 7823520, 1825369, 3186987, 7456629, 4327904, 7223114, 1310325, 7467346, 4488442, 4311034, 8358601, 7543833, 2927441, 1133996, 2729071, 2477822, 944967, 5969230, 503031, 3554560, 7330726, 3495026, 8234914], -[6566183, 901367, 2269152, 8292510, 1269082, 7261436, 5166259, 1844722, 3308544, 2302256, 1847468, 3412069, 4618800, 3783586, 589875, 3149388, 1493546, 3054257, 3587331, 4242579, 5566465, 4004656, 3907398, 3386721, 7951057, 3703483, 5433244, 729306, 4447645, 938700, 8181275, 3941198, 2772777, 4605282, 264408, 7611068, 2332180, 7379542, 2644429, 553541, 4829457, 3074836, 5249797, 4422426, 7568354, 2154788, 1431233, 4658516, 4330003, 7852314, 210629, 6169362, 3661390, 6549808, 625479, 6925257, 1058095, 6186815, 2920319, 5391179, 2377458, 4425075, 4006271, 6336568, 3181977, 1064531, 1109405, 4701303, 3674475, 6826404, 1070590, 5406092, 7557045, 1687647, 2182774, 5416564, 5715716, 1950187, 3372938, 5526493, 513838, 6454315, 2690288, 3817220, 2739903, 6356034, 5738195, 2804915, 1740419, 962179, 5224932, 2467224, 7933513, 2189779, 4019734, 5493399, 6497170, 7177221, 2081757, 3905860, 5965021, 1660417, 7859251, 2179465, 7837722, 3253249, 4927275, 707373, 1730562, 479222, 7603177, 2079727, 6099948, 5658629, 5679252, 8242212, 7953675, 8009643, 6832543, 7249526, 724568, 3871205, 2124720, 2877659, 3617522, 592087, 3959253, 3150182, 6948062, 8347087, 1965646, 6855942, 2541747, 8214023, 7012450, 4844515, 6545379, 988839, 5348637, 5031618, 7026672, 4898913, 5268636, 57317, 1834392, 3575704, 6358870, 2722534, 5033800, 2466890, 1694408, 3502678, 2822948, 6723141, 6884537, 113724, 7482520, 2363175, 6769809, 8353865, 3631863, 5416185, 5865219, 6645725, 3066837, 5758482, 5052706, 4060678, 3902119, 2067721, 2334366, 73892, 4741400, 7103102, 6763010, 6798453, 6691505, 7372247, 2323302, 7330471, 8283747, 4232468, 6900784, 7280079, 3656169, 3088254, 8326620, 2954741, 8259674, 2307723, 3115399, 7806089, 5029624, 2946674, 7252704, 79025, 1346054, 1761752, 7400208, 467759, 6512935, 4410084, 3894827, 4689142, 5825154, 2713021, 7233580, 716227, 2605578, 6738749, 1384755, 2238191, 4384765, 8220875, 1866511, 6521235, 1375746, 2204286, 2984798, 3870519, 4402200, 6386181, 3729308, 8154795, 5591355, 6797872, 995958, 8338378, 5071538, 828690, 4608292, 372849, 432738, 7243132, 349202, 3505243, 528166, 2451964, 6504081, 3021087, 2919609, 788626, 6206825, 6360312, 4725916, 7957732, 5773545, 158962, 1084093, 4301838, 6472987, 6597182, 7933776, 2686475, 3254157, 6527269], -[4754400, 7297762, 1784184, 6577486, 901234, 3072649, 703734, 7142635, 6446904, 3978792, 1105978, 3460331, 328804, 4577883, 3789043, 1898530, 3246250, 1042023, 3543636, 3957541, 7246236, 706371, 6892937, 3442473, 6470, 6476042, 5211050, 6068272, 2098371, 6194879, 5422825, 2785782, 6132251, 4025838, 1498267, 5174312, 4850092, 4513768, 7723416, 6320191, 6828666, 1053379, 5740083, 2732436, 4328266, 1090238, 8347562, 7680568, 4570507, 2508104, 2502792, 7564902, 7639953, 3814116, 1041569, 7883164, 756249, 980071, 5594204, 693709, 3013934, 1961412, 7118020, 7384486, 1501117, 841099, 6818372, 2566942, 7220439, 5917103, 284079, 2459215, 7228428, 5176490, 6975454, 6079804, 2360216, 8058737, 5998455, 5059168, 5996385, 334917, 7250820, 391852, 3588934, 6138841, 4844744, 2541107, 1888105, 1780039, 7591768, 5703902, 4101594, 8282029, 843955, 7076446, 3675124, 1680432, 3253870, 5992913, 2951215, 2309858, 1197461, 3677159, 2375261, 4249435, 7993489, 4225831, 4322946, 2778853, 8072543, 5906409, 2418286, 2337160, 3531001, 1809944, 5086548, 1472920, 6120185, 2055130, 1870572, 6705124, 4261897, 6391245, 1167475, 142302, 1191884, 7589704, 293598, 1616521, 1863033, 1721361, 6362952, 1225806, 98811, 771108, 4943597, 4839603, 1438462, 5587494, 1719379, 515749, 2907436, 7695303, 8374642, 6807899, 2486959, 1391218, 6684534, 7536216, 7483032, 7411894, 2146027, 2062870, 8162450, 4435464, 6817738, 7580243, 6840705, 2917539, 7330450, 2707496, 6303219, 4107425, 943576, 8197060, 4434915, 1484207, 7482421, 3340948, 1746452, 1869957, 6757580, 2692360, 2707082, 6113317, 6755377, 6570807, 2336775, 1121018, 6868684, 7396036, 2105089, 6474261, 1200049, 194792, 2771268, 5929346, 5332695, 5391695, 167409, 4940274, 687476, 1353871, 1388817, 2898827, 4701431, 1067596, 4214096, 3066917, 5649900, 1590503, 6469683, 1398442, 2626668, 3558511, 2698313, 129431, 548579, 2463421, 5218934, 1869677, 4868108, 3343788, 7233175, 1311666, 7751777, 8297024, 7018583, 4902429, 8271601, 19671, 4844348, 5130145, 7805231, 8158353, 723817, 6111363, 1934882, 8172456, 5308646, 2439491, 1179394, 7556971, 7103189, 6605937, 7402526, 8206821, 7077839, 5352934, 420546, 5344376, 4141843, 5792143, 5997639, 5607885, 1679502, 8258754, 7857810, 4211555, 1728944, 6051236, 6515486, 1446972, 2348475, 4100761], -[4180256, 4430151, 2666320, 2063999, 3793431, 5042253, 4874051, 2908133, 3076555, 4839220, 7731176, 1748073, 3869518, 7461708, 444401, 8003022, 7652106, 7110979, 7306248, 309481, 7532431, 904459, 6853198, 1746848, 7971138, 1030445, 6348084, 2817255, 2569892, 6887987, 3075307, 6905165, 1829540, 7788168, 2361658, 2627737, 7452687, 2582402, 6369817, 7012970, 4231620, 4879563, 2196506, 115709, 750309, 6683681, 81279, 2467820, 6788999, 7276340, 6228591, 2371105, 3647487, 7098409, 3099116, 1532937, 900184, 1400246, 4075463, 6691598, 388408, 2802168, 4116545, 8315613, 3360274, 5403976, 6061133, 7856581, 2490199, 4081204, 8352901, 1247142, 5861748, 6847822, 1497612, 7288780, 1985562, 3204272, 7223782, 7139080, 6921679, 789868, 2353548, 3804159, 3404916, 5032412, 640182, 4019974, 1948087, 2245937, 7282954, 5498097, 3512955, 3974950, 1272959, 5346825, 688356, 2174310, 4639633, 3243152, 5999016, 5585961, 1568902, 3038709, 1170324, 4843198, 7062800, 471085, 5065362, 8140006, 4764303, 2980249, 2928108, 2714172, 3496555, 62834, 8000094, 4248362, 5657930, 3146768, 7963983, 4630848, 3303687, 5208522, 2678793, 3361654, 4023423, 6239433, 5049228, 6236682, 2044478, 3317147, 1971873, 684430, 3054978, 2258802, 4597204, 1510693, 4025531, 5081994, 3237172, 7438322, 2338501, 2243880, 4784011, 6754986, 3565544, 4757548, 185560, 1342875, 153027, 7969158, 7190555, 2217310, 706039, 5807232, 6723928, 7993995, 688043, 6774150, 313778, 4136987, 234085, 1068687, 3998044, 6265263, 3266286, 190253, 1557745, 6495130, 1859939, 6627746, 4847265, 937921, 1643988, 7479434, 7636005, 7690048, 678976, 5100305, 1272390, 2886631, 7860728, 4794748, 4287807, 6849071, 4622017, 6233667, 877935, 8223736, 6053379, 4624674, 7702858, 848981, 4836966, 3056477, 7559380, 100050, 5351493, 1462561, 5335426, 7528987, 6458902, 6557191, 4134163, 1061770, 5244219, 8366185, 6442328, 1136862, 4806844, 7219692, 637760, 2577205, 612586, 2119869, 3128725, 5394960, 6063875, 4317098, 7877548, 5463281, 7284286, 935179, 7618540, 2359366, 1144281, 5719589, 3272742, 5723623, 5763522, 886167, 3620419, 5644406, 2737553, 6451695, 7239177, 5588810, 83997, 4391023, 3648013, 2068894, 1402083, 4561848, 1244021, 5015440, 6895509, 8009243, 6745434, 3144483, 4597973, 2344958, 4901968, 7038808, 980775, 1154769]] -s2Hat: [[3209508, 7036837, 1019481, 8003814, 1430084, 2199474, 139020, 5901025, 742390, 7272417, 1353902, 7019145, 1838288, 5031980, 3807665, 3831085, 4252440, 5334906, 2792408, 7955961, 4013657, 2296986, 1197985, 6301629, 5250160, 2822912, 5997947, 6438894, 4331141, 6058012, 5119507, 3453772, 697252, 3546702, 6215960, 5834936, 6204667, 8308593, 923595, 4658536, 3635700, 4331008, 126464, 4756379, 2212579, 5925122, 2597882, 7487764, 2310893, 7046850, 1492034, 802987, 6350072, 3590050, 2797275, 440107, 8130253, 2913279, 1947061, 2629887, 1693333, 5203558, 1228369, 6509325, 3981760, 6169783, 5719282, 4779565, 3972073, 4757264, 492383, 5851811, 3605874, 4918368, 6761054, 6951712, 4033210, 2943796, 3428005, 2226090, 498275, 248783, 7215965, 6584312, 1027594, 1574669, 2157209, 1432094, 2628553, 1300526, 2998761, 6477673, 605871, 4186169, 929673, 239433, 2288836, 5764873, 6075498, 5067040, 5327677, 3259367, 3933144, 6603926, 731559, 3165408, 144130, 6868182, 4283923, 1168423, 6758550, 2778116, 2742141, 1136489, 4196713, 6189706, 1180509, 3445298, 5012921, 6714601, 4699306, 2848232, 4294096, 7777406, 587429, 4730081, 2587284, 5382989, 5322073, 6683548, 2311229, 6643831, 1713828, 5748350, 2197060, 2589284, 3717953, 3602858, 302512, 2558099, 5846624, 4499588, 3880649, 2331779, 831119, 5727833, 1754485, 5827428, 3612340, 1615856, 5635047, 377937, 2995426, 549246, 4864504, 1609006, 4441084, 5380887, 7583171, 2277605, 961697, 996465, 7563301, 7548585, 2071769, 330091, 7241601, 2518374, 3859089, 6101093, 5459019, 4605445, 8069406, 1083607, 7137176, 737996, 4313747, 3308720, 510782, 1417080, 6675933, 2565320, 6922732, 5169623, 2155814, 6608424, 7951224, 5624139, 5642099, 6975682, 5589524, 2731076, 3998758, 2150601, 244700, 1160160, 1157136, 4118443, 1534595, 3374801, 2375048, 3900613, 4103984, 7619186, 6090784, 5406031, 1865955, 5959790, 3597795, 1424423, 1618308, 7172343, 4247391, 7015810, 4360754, 662332, 4210265, 1294501, 4834461, 5414849, 547324, 1938305, 535442, 51833, 3779257, 4838499, 2482829, 7549512, 5480083, 4280709, 1824867, 155267, 3420916, 5649345, 1998397, 6321076, 7018184, 3525535, 6373299, 5890995, 6959323, 2683414, 586252, 6919875, 5021462, 7465560, 7088058, 3041656, 4537404, 2025897, 5567000, 282396, 5631388, 6256411, 4094897, 4609408], -[502979, 7136196, 2995446, 5524494, 3650260, 1096346, 2472865, 1099924, 2961830, 3911172, 5139786, 4353933, 3546805, 3342105, 6055513, 1826107, 4198443, 7705882, 5736653, 216435, 6982640, 4154192, 7319879, 846790, 857725, 7130536, 4839705, 6651809, 1918860, 5465019, 6203847, 2330896, 2827586, 1664610, 8244475, 4955111, 7683953, 2507839, 6907578, 1092359, 30387, 5870744, 3141642, 7265962, 5294301, 423766, 3970481, 5846785, 3703351, 5941829, 1206145, 4406585, 3515497, 5696455, 3029448, 3240901, 4352688, 4100689, 4783892, 7138516, 4419043, 5771858, 1982142, 6106737, 3932769, 4881039, 5541803, 1499834, 8089525, 3689223, 4349332, 424146, 3629370, 6447543, 4837033, 4633646, 3415298, 4972861, 3164796, 1952998, 2186311, 2271464, 4190594, 5387389, 6513, 1143786, 8172469, 3621508, 2447248, 1806380, 2844301, 3686883, 2464952, 1434602, 3882685, 6854124, 7682009, 3488313, 1415535, 7467525, 8016600, 5375799, 1724035, 2420023, 1600623, 8299591, 2214653, 4545011, 1754054, 8093238, 8246662, 4143922, 7040809, 1702698, 5097966, 4861408, 2424307, 7680756, 7841188, 6238676, 2889774, 4523497, 5781576, 4458286, 2248470, 6610452, 7711043, 3265984, 7693666, 1545999, 7000471, 1825508, 607713, 4574607, 791637, 7302802, 6580327, 5246908, 2401967, 1420993, 1357032, 2657700, 4505504, 816401, 6385211, 8130033, 3305506, 1687087, 5307814, 1025224, 5887296, 941706, 6932149, 2040230, 6605708, 6276570, 5616116, 4075033, 5302953, 2756220, 3264513, 3188348, 1052162, 5882647, 1928973, 2910350, 3119696, 4772514, 5636506, 4026615, 5098556, 8229892, 6386098, 3169690, 5629368, 2500799, 4207140, 8272165, 2736943, 3425940, 4321739, 5807688, 962603, 2756363, 4548392, 2448403, 8328248, 7297544, 1288128, 7117570, 4460745, 7668088, 1591239, 4515964, 2339338, 414118, 5721716, 4668398, 7308275, 1034848, 491462, 7704559, 2285929, 1288626, 341406, 8081418, 174006, 7230972, 6934642, 1235041, 585260, 4233864, 4515325, 5384799, 5150074, 5732220, 5169802, 3889685, 5533866, 6758455, 2874241, 4792843, 1494362, 2662770, 2746427, 8064095, 3143675, 7390554, 4228580, 564190, 633898, 3977448, 247325, 3389997, 3507490, 5759506, 4394248, 3898716, 686438, 5399825, 4791301, 2581808, 4940019, 4749775, 510770, 5303051, 4388493, 1157318, 5028404, 6919088, 6741052, 7553825, 7688935, 6406713, 6982223, 5705326], -[8098167, 2380968, 4358214, 2085500, 5703794, 3789915, 8029159, 7982287, 1429252, 6952001, 1338910, 2659359, 2042784, 4676641, 2556047, 1113111, 4597455, 7496797, 833088, 4567810, 5683500, 6434870, 7006155, 6589134, 6519177, 3595328, 6223949, 1229118, 5017526, 5516671, 1712988, 345023, 1627167, 5853448, 2759823, 1554328, 2732007, 4964979, 32157, 7877536, 3493476, 2159497, 2584086, 3143439, 1527673, 1511843, 2908426, 301255, 2409548, 2240196, 7648118, 3697066, 7499120, 6161730, 2456416, 3248927, 6327807, 1421089, 4892933, 6971293, 1220807, 1359701, 3303730, 5201669, 5366937, 4477056, 270518, 4461059, 6917349, 8301719, 2819834, 5413621, 469469, 4607401, 3204715, 5559228, 7133439, 4437889, 8152470, 2448206, 6924056, 1022750, 3692897, 1220724, 981281, 6351845, 6586745, 3388027, 2822054, 2293712, 1637578, 5277044, 4547385, 6891968, 2413424, 2424589, 4444441, 3098386, 4016024, 8170154, 2982924, 5517944, 3111698, 5208429, 772539, 973015, 7803086, 6685397, 1933739, 2867979, 6145691, 3353444, 7346809, 6911601, 4719940, 5983937, 117751, 370087, 4896045, 997062, 404559, 55830, 3962548, 4559036, 6875789, 7632940, 1820513, 5293379, 4709000, 8122714, 2983995, 7247718, 5898721, 3613915, 6193347, 4830044, 742730, 7867794, 1182447, 5970909, 5849906, 4553548, 5323973, 238554, 8052367, 7764601, 3856833, 8215043, 4551264, 6205609, 1094507, 5061411, 7238909, 2428368, 6640415, 2446257, 3455482, 1596597, 3184673, 268515, 263082, 6144897, 4765647, 1752135, 6350501, 5202164, 2413152, 7640916, 7693417, 2781785, 2843888, 3197790, 3837776, 6409944, 3191409, 7862834, 4032689, 6863375, 4946373, 3371273, 7867062, 4816021, 5333060, 4601279, 1990122, 2663159, 3283848, 736782, 1004885, 5152521, 1639349, 4872339, 413247, 3422527, 29485, 6316834, 6847244, 5671968, 1118585, 1230841, 5301377, 964045, 5531252, 2464680, 4808483, 7274421, 6296240, 6249144, 1547320, 983890, 322785, 1569861, 8000199, 3252318, 7392253, 3251055, 5166973, 7686284, 1508934, 2822755, 3628769, 7520266, 4443712, 657870, 7915514, 6376849, 160589, 1396248, 5608643, 4472148, 1381934, 3020675, 4312915, 5638256, 2371388, 5091233, 4808950, 3365501, 5530834, 2803606, 3646208, 326197, 2494953, 7646456, 7568920, 92702, 1303189, 5502244, 4485930, 764302, 1289507, 4651298, 5388640, 6019489, 2667874, 3252078], -[1694002, 880498, 1119878, 4927285, 4938206, 3457564, 5773796, 2095306, 3876182, 2817843, 2270980, 4743236, 334974, 5824594, 7598934, 7072245, 1741514, 4491226, 680218, 3225168, 6234183, 5099462, 124427, 4002647, 3665725, 3744712, 2882801, 5435372, 3349111, 7727366, 6417864, 764346, 4053126, 899, 7080556, 4690070, 7747619, 6326251, 7164209, 3191085, 874256, 5564614, 2514894, 5557274, 6021624, 7198034, 6643375, 8258910, 4709353, 5776967, 6057128, 560840, 5620758, 5128234, 4153273, 2452849, 8122837, 4263082, 5605247, 7193446, 1206973, 7631994, 8096847, 4548727, 5474534, 1079558, 2617089, 392109, 7167485, 7570139, 3310020, 1976901, 5202659, 2973169, 158282, 3329467, 608604, 6583065, 7910373, 7301293, 316459, 926430, 912326, 757680, 2794082, 2840439, 5441947, 8153729, 5831857, 6365607, 8371172, 4194593, 3933079, 1159942, 583558, 8340620, 6863952, 6115410, 5867789, 695623, 2297091, 1303596, 3733108, 2609331, 614610, 1032195, 2933837, 5581673, 4826407, 1552349, 6836893, 3173519, 6784362, 4576558, 5392247, 4288899, 546366, 1127955, 4379828, 179966, 3819458, 3654559, 151870, 4815470, 5073268, 6477318, 6618148, 7460968, 5642735, 234724, 328135, 643627, 4735870, 4055438, 1146013, 4977295, 3365044, 2059984, 144725, 2763123, 5613898, 4834681, 542553, 1351468, 123221, 4586596, 4773293, 3907179, 33010, 3140833, 3145330, 6469958, 6928332, 7809503, 5385025, 4650450, 157872, 1822796, 5162197, 4740657, 6864592, 4844461, 2252837, 6230547, 3348014, 8022090, 498403, 28762, 4051817, 1055912, 3813507, 4247464, 8189700, 8161140, 3516666, 6913101, 6689624, 3448422, 7249813, 2188735, 5971387, 87689, 7197796, 2171015, 2104936, 4465838, 3332024, 1632605, 6802123, 1496819, 4387317, 4346623, 110572, 8247529, 5538144, 4472180, 7962451, 6519538, 3633525, 1567756, 6017329, 1792056, 6870018, 7374805, 4867440, 4196033, 3695383, 418400, 862091, 6204332, 1828224, 4173141, 2594716, 3504973, 4665117, 2380166, 8179035, 1468751, 4987872, 4552991, 2491092, 7051067, 297353, 382141, 389018, 5863764, 2030483, 1487755, 4419747, 748749, 6219311, 339420, 2297662, 2244051, 3428107, 7064592, 1275370, 2916391, 5548997, 7726067, 603486, 7179915, 4601730, 1693714, 5892289, 2773919, 6227311, 1209518, 619702, 2710244, 6974413, 6253098, 4540240, 159659, 5028294, 4779970], -[6626760, 7560853, 7651761, 730691, 1985062, 4814045, 1231959, 77104, 4835176, 5868120, 3976174, 8186975, 1304673, 6844391, 8169325, 121550, 4204446, 4225076, 4444870, 4346099, 4983664, 5418535, 5761744, 6863993, 5118948, 6688814, 972446, 5231937, 2399462, 2012381, 4520750, 2433518, 4223012, 2654750, 4945725, 6600938, 7921619, 5094067, 7696453, 5790283, 2630594, 2526818, 3148378, 7226711, 4742848, 5027015, 1538729, 5464161, 8206142, 3268467, 3322940, 468597, 4668265, 1403244, 351181, 4872478, 3003616, 864993, 6939699, 1479327, 3223788, 6840358, 2608312, 2477379, 2389020, 3992330, 3304223, 1832450, 739125, 5304623, 2990174, 372812, 2129121, 3626376, 1072326, 4613660, 5239252, 1257074, 3519657, 432585, 4524807, 6084386, 698451, 4395001, 4700393, 7751379, 5061202, 1068222, 7575514, 1712100, 6190272, 99516, 6898760, 1782990, 7888228, 7261363, 6109888, 3652691, 808817, 1482771, 3551519, 5541786, 5658828, 2319117, 5891865, 7447039, 8023998, 3585649, 5743527, 2877538, 94421, 7272728, 4277277, 4372203, 1439863, 399212, 2802262, 6086930, 7014529, 612357, 7853916, 4503203, 3847267, 1039842, 1663305, 5551477, 1632531, 1721263, 403078, 2474180, 6890682, 638957, 3088303, 8022779, 5799435, 4736081, 6376336, 2118082, 102719, 1856772, 774787, 6755226, 1311830, 7283792, 6195711, 364641, 2127583, 2060274, 230174, 3507386, 6655673, 4987766, 1223093, 2819726, 1020771, 292285, 6787076, 1048828, 6691082, 4987815, 6275375, 6421459, 4961444, 5167898, 5784904, 6661036, 4267762, 1034687, 7589529, 6903417, 5922012, 750455, 7911288, 2555160, 1217795, 5195752, 3065193, 6873559, 7478374, 1440082, 6908665, 4692907, 4574178, 5371239, 728377, 4585956, 1625542, 6406953, 7584259, 3938375, 1642202, 6007364, 2648464, 2642610, 4578193, 3899989, 2815555, 1100482, 5776764, 3382859, 4524973, 3188117, 7236392, 3845796, 4795242, 1989680, 2612626, 2911101, 951032, 349954, 681058, 2594002, 136187, 1852500, 3219067, 6151995, 1478590, 3082473, 2878671, 1856362, 7141034, 2548889, 5657142, 5024064, 3132478, 6061717, 8271340, 4080986, 3029833, 3642783, 2415046, 2401308, 6853888, 2825465, 5344369, 1692253, 7317009, 2185448, 2137844, 3247689, 3849888, 5189358, 91514, 897106, 5181395, 595351, 838917, 5750388, 6777693, 538927, 7747057, 5057617, 3187628, 809255, 3828723, 5332422], -[5632872, 197214, 1468251, 2366152, 1487121, 1204162, 1410440, 2112217, 8003521, 756050, 5686711, 4549249, 6582846, 7818530, 3762898, 4823413, 3536939, 6476091, 7788128, 4909476, 819970, 5022762, 2665868, 2570431, 167574, 958009, 6350337, 6646318, 3728548, 1363153, 66419, 3165180, 5982062, 3360789, 4313367, 5023596, 2466855, 2951838, 7550964, 1743166, 1257309, 6001028, 6669592, 3412432, 762962, 5229258, 6323153, 1902272, 8370187, 6643542, 3260299, 1378225, 5778917, 4142516, 2089875, 3835810, 5644492, 2504300, 8227214, 1183607, 8340028, 7595451, 3534900, 430081, 5317004, 7016881, 553766, 6901781, 2749664, 6357288, 3434881, 4250107, 1674389, 4263782, 414294, 862027, 6349167, 1729561, 335658, 4272621, 7778956, 4442894, 134157, 1408966, 1566960, 7501475, 817031, 3010498, 8322634, 3705174, 297864, 7379488, 6588311, 2719157, 1517647, 4898344, 3909289, 778721, 3093342, 7936867, 5007097, 8224844, 3505096, 5059051, 2109519, 4046295, 5178034, 349628, 877262, 6490727, 2720925, 3744253, 7894835, 4686600, 6581584, 8133086, 3401855, 3829234, 6989602, 5772474, 8006740, 4929817, 3567748, 8315126, 7067391, 1223038, 7015210, 3263354, 7481406, 1272759, 24802, 6340371, 4107342, 6475453, 7014319, 8041331, 2543197, 3753479, 6511884, 6837778, 5459375, 3306548, 1436599, 420092, 2102581, 1770850, 1404657, 2979577, 7963618, 6259968, 5866947, 4075719, 7538869, 6396578, 5347071, 1938823, 8271842, 3427065, 452337, 2647674, 6905691, 875983, 5915229, 2424163, 1294861, 5390959, 3781199, 2812155, 2064563, 3503888, 3157845, 25817, 5853559, 5928976, 3375876, 7439211, 6068909, 2863074, 5625474, 1765903, 2930929, 4660207, 969833, 8322357, 635186, 823893, 5987472, 2881415, 901564, 1214587, 1993721, 7557902, 6372560, 615112, 483811, 4551315, 658582, 1944438, 4045388, 7001992, 3059003, 7922944, 4856366, 7766051, 8184934, 7581830, 1985291, 6117629, 4292987, 6552668, 809559, 508828, 7987527, 1490021, 2614772, 6768883, 2776370, 2136332, 3981882, 8214631, 6392973, 3226672, 4766767, 3102534, 6833882, 8173199, 3471542, 6267574, 5686284, 1447452, 8371564, 6477483, 7004690, 1550228, 7882212, 1135164, 1206524, 22542, 8244955, 3667063, 7417768, 4381796, 6596779, 7247774, 8104172, 699413, 5388015, 6229752, 2312245, 7796297, 1487787, 7526833, 4308764, 2040506, 1416750, 3814651], -[347032, 6094344, 4738108, 1644411, 1240303, 6695329, 7864269, 7537460, 8064562, 5570696, 7616149, 235154, 7265767, 8066590, 8251459, 2842161, 6891938, 3037221, 8185158, 1097189, 8015259, 5379628, 4140724, 3597776, 3703149, 2094079, 1108639, 3175954, 2234640, 2531914, 6706777, 4184150, 5501965, 6992324, 5580362, 1358700, 354191, 2361050, 5118680, 1719257, 5311476, 4746898, 1303004, 124397, 6924861, 5255599, 4508497, 5472808, 5463278, 5364524, 1196062, 861233, 157828, 6333391, 4876191, 7125553, 3751705, 5714945, 7823916, 2269820, 7798405, 5028534, 1762493, 5231112, 8180808, 6500707, 5603825, 4846035, 1456591, 4470498, 7102577, 5230444, 4342256, 2176, 4241625, 2900109, 5712345, 3092280, 4661711, 5715342, 2779045, 6859476, 7888119, 5603638, 2322467, 4493102, 643956, 3739697, 1603485, 4827817, 5151917, 6860213, 1890253, 4244208, 2328783, 4182711, 5040887, 3832847, 6539666, 1616224, 6104450, 2750898, 3335316, 7187032, 1599945, 4877928, 2768386, 8074195, 5670797, 3807617, 2449527, 6672875, 543935, 7628495, 2029424, 2044852, 4218157, 611659, 2754050, 4498300, 4981655, 3517062, 217977, 7200131, 4141370, 3685138, 4506273, 6194825, 5090859, 2894215, 3141069, 5970802, 5887916, 5491024, 3059928, 7078939, 5282737, 2452053, 2180287, 4177995, 1572986, 2604970, 2527361, 1801398, 3838957, 2212824, 488734, 3233859, 2363435, 1834866, 1280297, 8366593, 5042520, 6267281, 8261064, 2937021, 648984, 3029361, 1148863, 8014505, 6436416, 7691422, 5372021, 2098940, 7928311, 6074591, 4705175, 2089743, 5451196, 4427747, 5382160, 7578989, 5626535, 2640345, 686777, 6816074, 7336673, 8282838, 5356132, 4558973, 3536646, 8236909, 192734, 639193, 6625447, 3150847, 6002121, 597007, 3747076, 24492, 6373534, 8034213, 2679819, 5555893, 6091291, 998160, 8373544, 5895856, 7471790, 6660367, 2129561, 327327, 732082, 272951, 8253904, 6604677, 6892873, 7643692, 6927409, 4189155, 8126430, 4133131, 3421534, 2589792, 4976030, 6160089, 4066640, 177900, 6771346, 451090, 3201084, 7576250, 660041, 3275906, 4620936, 3935750, 2454612, 2252474, 7870550, 4145258, 4072683, 4927500, 5176748, 7406700, 6064418, 336751, 6510871, 58654, 3542249, 2846831, 8254430, 363385, 727566, 2796970, 1914591, 507347, 895605, 5399734, 1177477, 5588647, 8108610, 6173767, 2455862, 6619409, 4535009, 4789482], -[2354935, 2919514, 5890581, 3969390, 2843120, 218223, 1576194, 6654815, 3534384, 7286788, 8246086, 5465592, 3471194, 971373, 2937097, 7290145, 352918, 5116531, 7386223, 5563022, 531804, 3720093, 244896, 5981780, 123273, 8119759, 8117906, 46874, 5827183, 2728880, 7781107, 7317640, 3102020, 5706350, 1077330, 96494, 5199429, 4905969, 756266, 1490926, 6320629, 4931634, 7201749, 3153322, 1945523, 1789477, 1425225, 2134485, 3318494, 2229839, 4960913, 3261670, 7086748, 8106249, 2675821, 5293240, 1495313, 5528913, 8112029, 1597954, 1992867, 1144311, 8073186, 6143728, 2425580, 7367242, 1690898, 4424462, 1666938, 6847028, 7873609, 4435765, 3486369, 5369509, 5673016, 6995181, 7966578, 7320354, 7731353, 3347257, 5952746, 1791712, 1580799, 4416620, 995940, 4882345, 3754679, 2145776, 2424709, 8063364, 5172054, 1690179, 6953761, 1031101, 2418199, 7940964, 4371848, 7529869, 4466809, 898118, 6832215, 1134609, 1325162, 7210541, 2522730, 7243531, 1349757, 4374732, 6819151, 6955482, 542285, 6665137, 2380152, 7064748, 1018743, 7384006, 1714565, 1056498, 2600958, 3493358, 1374211, 2182464, 3102688, 3760725, 7540432, 65232, 7320824, 1957290, 6227825, 5170259, 1049797, 2182419, 2155551, 905123, 8004777, 7265388, 1572363, 314149, 3293445, 6516482, 7326881, 2367843, 3499353, 4104360, 6443139, 1141960, 2998561, 1062788, 6615347, 2957080, 1965988, 6046949, 8324992, 459922, 3173057, 946026, 3288334, 5153958, 6452873, 8289342, 6838064, 4177887, 7406649, 6117508, 5130684, 4872189, 687134, 7582697, 6401353, 2525443, 78737, 4165885, 3327277, 256707, 5931083, 7612940, 2359107, 4961421, 1498823, 5353760, 2045207, 789978, 7847961, 7743442, 1839522, 740048, 1149832, 3029226, 3445481, 3626094, 5259118, 6055486, 2595403, 5431664, 3685428, 5367065, 5471444, 6009220, 3800563, 7754246, 2706380, 8313181, 2150052, 1150468, 7813961, 1499320, 5301140, 6419480, 6258969, 3772950, 3460038, 5437043, 5556870, 5549042, 7641800, 8251033, 4308734, 7575468, 2417928, 6840008, 7036816, 910278, 6452972, 5610072, 6658892, 5884837, 2725479, 357265, 2908318, 1003088, 3376051, 5648804, 100921, 3225586, 5769727, 3070456, 6242565, 3005655, 989394, 356046, 6436654, 2469528, 4493579, 4569852, 247660, 2662977, 524656, 6258141, 4432705, 6928952, 875071, 8237883, 1726578, 3358619, 2482319, 1279282]] -t0Hat: [[4112057, 8121209, 1403003, 6071226, 5185576, 8278904, 6294117, 8314657, 6850720, 1215093, 2571757, 8276849, 4922022, 2083536, 7287377, 6065668, 4096450, 6759016, 7750402, 3961978, 729343, 686730, 5457200, 3104503, 7434497, 5640261, 7099088, 2789024, 573494, 8311672, 6798639, 6000461, 7958640, 6326276, 3087027, 3421620, 3860082, 2207494, 2223440, 2368372, 4752727, 5227439, 6730917, 3270023, 5468194, 3365637, 7847501, 1068476, 7938809, 1863782, 2631131, 1341586, 527733, 3946174, 1771084, 4298397, 8370351, 6271468, 1436437, 4582306, 6158533, 556897, 4991055, 7659172, 7072513, 4818545, 1190255, 715082, 1937175, 5874642, 6423957, 6871110, 2239756, 1752893, 3590051, 6569131, 6968211, 5306013, 7717380, 707518, 5828480, 2438251, 9269, 5582080, 3151090, 8290532, 4350910, 3999609, 673653, 6138554, 6230261, 4829833, 8048867, 569425, 5581649, 1034355, 4740774, 1743362, 2303207, 8076720, 3981354, 4050536, 6601070, 1260017, 6587418, 4149828, 2504835, 2563759, 985242, 6209990, 2355018, 3390359, 420533, 924485, 2187771, 5092972, 3231763, 963638, 6142644, 595984, 3953266, 891057, 6897300, 7006845, 2440937, 4216796, 7666953, 416418, 5908160, 1285559, 2690086, 8033570, 8064285, 6422849, 4715940, 5134701, 8231943, 7757133, 2517699, 7716564, 6333204, 3132857, 5851304, 6337326, 1498315, 3709093, 7264117, 8174787, 7390909, 3334248, 2852134, 1622372, 3800561, 7022915, 6965582, 1836348, 5395395, 5374013, 5040488, 6026306, 1556993, 5124668, 1227382, 6320593, 812427, 3851183, 3738093, 4249742, 67818, 1442492, 4402601, 1023550, 2987992, 5934952, 636819, 5333639, 3263228, 7482120, 3947439, 776745, 5676244, 8297958, 5781256, 5490345, 7787306, 3236645, 8134446, 2856352, 1539628, 1231473, 667129, 2886745, 3772023, 7530041, 1457716, 2986739, 2105232, 1355249, 2471849, 6031842, 3074203, 2624066, 3236455, 6155544, 7239029, 2298554, 5192754, 1354289, 5987176, 5974291, 1738259, 4008408, 5567211, 1778871, 3648330, 4502851, 2778635, 7574789, 6178352, 5304682, 1833260, 3269688, 7574684, 2691170, 6896796, 5774907, 3201738, 2288031, 2181497, 18071, 1947237, 6884517, 8261397, 1685638, 6588636, 5794397, 2474594, 312671, 55393, 8337882, 5688415, 1417484, 538198, 105536, 1910149, 5129904, 2763252, 8028189, 7838256, 4810021, 3846185, 3757900, 2364293, 6225791, 528841, 7870448], -[1298738, 3173550, 1130304, 7546795, 3522297, 6136909, 694842, 138805, 1005738, 3624058, 7232255, 1883576, 2034273, 414420, 2857625, 3854648, 2908001, 1090784, 6831334, 1685620, 4533707, 667909, 826884, 6255209, 2781144, 2410253, 582739, 6709320, 1488808, 4286307, 7633955, 3357879, 4697376, 7472574, 6264837, 2739415, 6552961, 4931575, 1147651, 4870726, 3737161, 5138153, 7024978, 2340854, 5296671, 3120351, 1332648, 754264, 6446783, 5870829, 5197422, 5237340, 4260668, 837133, 2034729, 3639118, 1739982, 3574160, 4038222, 7666871, 8265903, 1919554, 5987329, 4481626, 3196627, 5052383, 3417589, 1493460, 4866993, 7912666, 3358428, 1601079, 7325886, 991653, 2564454, 4711612, 1415043, 5698607, 1638362, 1383261, 5572281, 1140439, 6861098, 5026566, 7302759, 3192159, 959865, 1210525, 6640129, 2114053, 3513257, 7450331, 4141720, 2612928, 1248233, 7092833, 1196892, 6325050, 1314672, 5275644, 5345611, 5371238, 6597488, 3313708, 4656956, 5015228, 4258798, 289506, 1520505, 4879055, 6457832, 4545259, 3050785, 1125525, 6986183, 8361764, 1988393, 3357455, 1614771, 1826514, 8123765, 3261533, 6994470, 5950865, 672785, 6337490, 7430016, 8210716, 2877882, 2495724, 7126478, 7299867, 3554688, 1887852, 6376774, 2981140, 7888721, 3218179, 4958169, 5537126, 6963973, 4479476, 1018567, 6992613, 6739593, 5293930, 1706257, 8349094, 4389359, 8288324, 6744811, 3583680, 2886499, 7349006, 6927579, 6103128, 6551754, 1252284, 1979333, 2823127, 2835573, 879550, 4313185, 6364444, 5930773, 2484428, 5017501, 4738346, 1717709, 294286, 1647657, 284348, 140410, 4223054, 1509494, 8234198, 112104, 2602856, 7675394, 4561777, 676781, 4199678, 7601984, 672210, 3759237, 2926752, 33123, 8243469, 553776, 6801837, 3235043, 3684878, 5354954, 1886560, 7851108, 140550, 4625202, 5419541, 5783818, 5742538, 7676404, 4238086, 3952047, 4653950, 3935957, 5726551, 1300403, 1446537, 68408, 7833556, 7474512, 1438462, 3055628, 5181429, 951732, 1546126, 962790, 1310073, 4045289, 1181919, 8100038, 54197, 2894782, 3594545, 2872435, 1244110, 838815, 2616310, 3526273, 5039654, 1741468, 62170, 6124846, 8192198, 6884341, 2373517, 1426378, 5414203, 3998622, 4101029, 5464324, 4851193, 846636, 2745412, 2391595, 8292309, 8217346, 4633923, 6883884, 2185242, 5573684, 2146847, 6887937, 473593, 8062925, 7666692], -[7439273, 3858496, 4198292, 1416765, 8377589, 3968741, 119736, 4810206, 6185738, 4661978, 1405929, 6028679, 6247327, 5267471, 8126767, 1423839, 481420, 5780944, 107351, 1136343, 4824713, 158071, 1776400, 5517336, 5250374, 4931722, 293428, 6919645, 5549890, 6005109, 5443531, 4903503, 3956690, 1976424, 5595977, 6561451, 7433385, 6788449, 7470814, 292859, 6765821, 4828051, 3439165, 2890859, 6910538, 5282402, 5768078, 7950746, 3632114, 3748371, 6462903, 2971128, 1904989, 4861662, 64990, 1244401, 1558424, 6751610, 3666641, 2221653, 4030388, 1816618, 7737748, 8185845, 1519953, 2050888, 7861660, 5674920, 1575254, 1395007, 697868, 21282, 6883604, 1227680, 4156297, 1608186, 5465916, 4380847, 4279864, 3239089, 5034701, 7859113, 777673, 4994792, 3523135, 4010452, 5084738, 936924, 2188734, 2793823, 8101050, 2915084, 4923357, 3540247, 1787632, 83416, 8348961, 7798402, 3984348, 6902933, 1626966, 5651456, 3772061, 4512355, 6759348, 4361632, 1556784, 6820985, 4646193, 3085389, 8108852, 2092564, 3314214, 2136658, 6320052, 4171429, 448708, 8067727, 8015390, 1760066, 819394, 1949483, 3248740, 7696780, 2501880, 3875063, 186272, 2703204, 4084594, 5616482, 4484558, 117220, 2442893, 7985911, 3933858, 4703223, 3794823, 3538663, 2486793, 7095440, 1641599, 6126683, 1816591, 61673, 5606743, 4922652, 422079, 3302108, 7911892, 4976046, 7173130, 2537801, 3587047, 961611, 1460894, 7461341, 6534459, 7718003, 667927, 470577, 5789786, 4932013, 4193224, 324504, 6250387, 1111227, 3684232, 3091928, 311401, 5710041, 221171, 4719931, 2785153, 7172230, 2353766, 4656006, 4968289, 6725513, 6306869, 5069550, 6593780, 2485380, 1394604, 7527921, 6389792, 7888386, 6147726, 6035872, 7027959, 3078834, 5720666, 764782, 1919932, 3433869, 1879674, 12321, 667726, 2890273, 5981717, 4678296, 6230905, 3271835, 4738821, 5361957, 6763694, 3637993, 5327607, 1796000, 3949688, 7387729, 2233933, 5414843, 5411932, 4818001, 7213241, 8289651, 1633941, 768040, 6121018, 1403045, 379908, 4605594, 1539744, 4403829, 4192340, 2409317, 607082, 7321976, 5179790, 3513927, 8346587, 6889238, 2413015, 4335351, 4712666, 3788734, 1667023, 3023375, 6927870, 734210, 612412, 6358980, 7471613, 7378533, 8042311, 6741466, 1051497, 3945358, 1010569, 1101953, 3254288, 4007859, 3952070, 7664175, 4604492, 5262932], -[3983885, 5163953, 5698332, 591588, 7895003, 5636915, 3653185, 2709356, 7409590, 2779037, 2911711, 4252413, 390784, 4420555, 5815840, 2499872, 2154612, 2960344, 2272784, 2853801, 7214321, 5209808, 3633300, 6776510, 7112571, 3972161, 7214241, 3851902, 2158271, 538252, 233583, 5405993, 34236, 155065, 1494876, 4679343, 3399811, 3518375, 3175027, 5463568, 7271791, 7841627, 5707944, 6841866, 1615010, 1969803, 5218813, 3216343, 3705553, 3130510, 8115054, 4983992, 7811863, 5038159, 6918877, 7696128, 4769375, 5430011, 1187556, 1505193, 4440624, 1659363, 8338404, 5334214, 4709416, 5340991, 3914651, 699122, 2817286, 4985711, 7789286, 655074, 7621800, 3729247, 5899386, 3254390, 127813, 3513645, 1153005, 3630258, 5161126, 3483399, 5987435, 5475318, 69323, 7051276, 2126087, 3489884, 786183, 3359383, 7528920, 321855, 5298441, 7321929, 4735950, 2956033, 27251, 5900373, 3316792, 3577876, 6606717, 544229, 3435702, 6796424, 2304127, 938414, 5857386, 2979624, 4078774, 717940, 6519588, 7745117, 7673321, 7141478, 4746942, 792773, 3145674, 3565040, 1871690, 3171602, 7887671, 8201466, 739034, 4199623, 6932640, 6645707, 8014361, 4633898, 4875487, 4916157, 2415299, 7212228, 2655449, 1987661, 2677131, 4126823, 3038339, 4825846, 4587140, 7124976, 689134, 7151805, 5114034, 4644116, 313609, 7467782, 2023461, 4884733, 530071, 1391258, 5924424, 2036687, 3999687, 1604690, 1107312, 7357370, 1967413, 8110123, 4818428, 5984463, 5437755, 4934266, 2233589, 2682115, 603786, 1624135, 7123285, 7864056, 2352749, 8056032, 5211548, 3398279, 278292, 3415470, 6237786, 6186123, 2761656, 670841, 1578351, 3285669, 5224707, 3256051, 7017774, 8201157, 1087852, 8297855, 2659819, 3273532, 3954870, 4513977, 729243, 3175438, 4179546, 6830691, 3928778, 5117598, 4861653, 862344, 8285510, 5492639, 8176216, 279384, 7437010, 60895, 4292467, 5273213, 6429251, 5950288, 4339900, 7509678, 14686, 4154537, 4975254, 513746, 90209, 3002738, 1087780, 4854871, 8129057, 2742660, 558651, 7307598, 418630, 38535, 3943533, 7995949, 7891335, 4314531, 5174368, 2817465, 931473, 7273474, 4724450, 1218781, 6608883, 944415, 6171555, 5184407, 2067349, 6805394, 6074608, 8221012, 3326548, 6926488, 1121699, 2770644, 7634201, 8302934, 3767303, 7575927, 6270812, 8354002, 6082324, 8071388, 489126, 2785892], -[4513134, 4481748, 5120924, 79673, 1430522, 324408, 4852163, 4944123, 3133481, 1965478, 2008780, 3379666, 4209109, 8180169, 841299, 98091, 3513452, 4326944, 2923042, 7096549, 1541479, 7632124, 4275004, 7788376, 7225523, 1814238, 1520600, 3990318, 6003060, 391910, 7111597, 2405279, 2029662, 5176363, 2964538, 2322199, 3239474, 6769543, 6478256, 167998, 2507454, 767701, 460591, 7298955, 4696570, 2741847, 3579267, 1000890, 4621448, 6851099, 7456439, 4794073, 8330907, 968728, 6587186, 709315, 3226514, 286469, 4448126, 689954, 7231377, 2138691, 897100, 6069301, 7968897, 1896963, 6459600, 4603142, 5366426, 5825108, 4579987, 437881, 1006686, 3864430, 6537771, 3968538, 7765138, 265608, 3872457, 7826882, 4250521, 5862723, 3835039, 5803610, 5112818, 1582069, 5466327, 1862129, 6324183, 2443478, 7352872, 3938240, 1542297, 1504506, 2169964, 2264369, 5125113, 8102389, 3131894, 7861564, 5414008, 3944669, 6008936, 990956, 7540177, 2960203, 5802278, 6368428, 6841589, 1295930, 6869962, 3703052, 3894921, 4654516, 3940194, 7950629, 7287312, 8371148, 2470868, 7780888, 596962, 2516886, 5263310, 6946022, 203541, 7091200, 1288167, 5366632, 8083018, 2040647, 4497218, 4621424, 3892345, 7555924, 3380027, 5143907, 3325726, 6016680, 657783, 6901426, 1795083, 6137775, 2791071, 7505621, 5930261, 5519347, 5910705, 4272020, 2923621, 1753370, 4889920, 1709456, 3119093, 7899211, 3271181, 182276, 905833, 2149825, 6136025, 7279655, 2694729, 4714142, 2587070, 576594, 3724800, 1451874, 570416, 3474613, 3023135, 5707450, 93537, 2395976, 4206710, 3597179, 7011242, 4204619, 2354536, 5138823, 1534830, 6660557, 86662, 904150, 1415034, 3957311, 677226, 1635564, 2942814, 2867600, 8283005, 8047521, 7035648, 6879291, 1761964, 6784209, 6225668, 3787522, 7111363, 3006656, 2193318, 4067847, 7174307, 4831706, 5576257, 4081846, 5376073, 4362458, 5733666, 867532, 2719018, 5347737, 2494362, 3618486, 3779222, 4628033, 1368278, 6495741, 3949411, 6055372, 7473183, 1697661, 7775258, 1565260, 1242646, 2423073, 1838530, 3694775, 5108154, 3768907, 5542913, 2873878, 6105290, 7299848, 381013, 5540587, 1308953, 5987792, 5315964, 5659021, 6497793, 5749864, 287934, 5245196, 2391769, 4161645, 607439, 3218610, 7084342, 5838076, 6889328, 4364479, 6436346, 7618959, 5243642, 5747379, 5757057, 575949], -[7290979, 2979494, 256546, 6552502, 735623, 6754944, 6499340, 422544, 7351065, 5391670, 7491446, 1694601, 1833880, 4183312, 1108433, 1184957, 4534492, 2325636, 6707246, 7292507, 1249364, 5259479, 8259874, 5612377, 6573984, 3424233, 5761722, 3844349, 5827434, 7393118, 4210425, 6849610, 1205298, 5968736, 7968034, 2105828, 2466358, 4012958, 6062645, 3619756, 4366503, 5301665, 3763810, 6694660, 3547956, 5290548, 4588413, 1865269, 3957623, 1312172, 5647140, 3356186, 8239732, 2742991, 6749890, 1484293, 22663, 7120711, 7830653, 1232391, 8329459, 2736584, 2457319, 1610005, 5395393, 8139250, 456785, 8133969, 1071561, 5667671, 1744309, 3863801, 3186103, 5693755, 5659948, 4906980, 7512208, 4613552, 322209, 4956228, 2855653, 1580663, 1770126, 43555, 4806805, 3175833, 4234252, 3756528, 6539529, 5584778, 3953535, 3368197, 6109740, 8046777, 2719345, 5757702, 1875590, 4214140, 2623461, 449500, 8193138, 2642297, 1841672, 4496949, 873892, 968072, 1862499, 8284613, 3885220, 3893655, 3472658, 1833224, 5687141, 6815395, 8172190, 5178868, 980944, 6806933, 7456418, 2001344, 2964770, 5154551, 3528623, 6509199, 5402642, 71298, 4500483, 2415897, 4747996, 6242323, 1787407, 6121017, 1072251, 472681, 329241, 1820346, 1623226, 1039432, 816576, 6041676, 118533, 7565852, 1757758, 6634714, 7201257, 1914729, 8177638, 6307472, 1060488, 2288012, 716268, 3033703, 1295785, 6590291, 3330373, 6816617, 4606915, 7392195, 5865586, 3173767, 764120, 3565903, 2212501, 1084652, 1872309, 2494916, 8268946, 3091125, 556074, 4567018, 6158558, 5739265, 7748378, 2378895, 4110563, 6153235, 6133777, 2881993, 4284253, 7175165, 1888352, 4920944, 2766747, 5450152, 2788023, 7191290, 5170718, 5967175, 1292407, 6586715, 17592, 4637386, 6799919, 1393022, 2247982, 6016016, 1298976, 6069119, 3187375, 3787984, 2187212, 1903920, 5648508, 940870, 5664614, 8219507, 5786802, 8340033, 3682286, 8168536, 6343096, 3140169, 5520058, 7650895, 2346295, 5448410, 4399709, 5643972, 7670836, 1156496, 527236, 7185167, 5845215, 4563424, 3187466, 3833298, 948384, 7997060, 2446782, 6274653, 2580136, 7173802, 4403359, 2778110, 4527152, 984552, 2930676, 3031299, 3120875, 2227002, 4045379, 3270233, 2319960, 6571669, 7703199, 7670631, 3531463, 2018900, 7502821, 735501, 3274286, 4177821, 5387538, 1079222, 287528, 359467], -[2784403, 8098329, 2566647, 6953719, 7442982, 1766800, 4485932, 5465699, 4023652, 6588739, 8136927, 5170357, 5540125, 5615279, 2716227, 5127815, 1005293, 7988820, 4669643, 5780151, 4980678, 980623, 7918734, 96306, 35466, 7114540, 6262398, 6611397, 1297886, 5580098, 5799291, 4804508, 6436695, 1780794, 7892905, 5519673, 1082821, 3564079, 6620619, 2675434, 1220940, 5436571, 1535847, 886090, 6000469, 5336163, 2248271, 7064034, 1071171, 6128352, 819992, 5623370, 8022212, 1102692, 2539798, 4179543, 2409777, 3319042, 6262695, 1698649, 1956645, 5861115, 2772400, 5092737, 7342462, 7635679, 1572205, 4313170, 7383858, 7800588, 1842816, 1918422, 5936960, 1105336, 7880804, 7112602, 4880165, 52081, 4648239, 6075243, 1438089, 4952107, 2334235, 6541395, 3265178, 4948595, 1604445, 6397998, 8279554, 3209085, 3172018, 1819507, 7399987, 5183629, 5797494, 4441732, 8272249, 245000, 4714367, 1582080, 1014303, 4763159, 276768, 6922939, 2338585, 4249503, 4074170, 2229982, 2659904, 1948639, 744241, 4598096, 6666137, 7874912, 7968070, 6777223, 3392392, 4288146, 1836280, 3912336, 1549631, 1149388, 965468, 54109, 8324054, 7625454, 6792719, 5915509, 3939086, 2708874, 5027899, 7278079, 2161463, 2314995, 7312299, 3754037, 7343051, 1890174, 3344655, 7283361, 3858142, 1656384, 5784749, 6420086, 4668603, 6105758, 3181844, 2361478, 1746966, 1845504, 940540, 5931202, 1118593, 5672697, 4167083, 676541, 2961519, 2664350, 2725940, 3692848, 4494122, 1926084, 4488075, 544893, 1104060, 455034, 1359328, 2122285, 3132473, 3512532, 5608673, 317284, 5839771, 6238294, 5761293, 6026294, 1300805, 1497387, 4932953, 6993668, 3731076, 6029264, 1399839, 5587317, 790323, 1825165, 1671559, 5228657, 3290486, 5329060, 4487740, 2726841, 4681033, 3157379, 102955, 763530, 1042526, 4327244, 4240525, 6409888, 5860758, 4741148, 5471220, 3402690, 3083741, 847723, 1416555, 3316377, 6681189, 6737461, 8145846, 2237215, 6908614, 200361, 1816395, 8332998, 3872758, 7199639, 4824988, 7042489, 1110213, 3260203, 2351841, 4513665, 5800644, 728948, 5635100, 1571244, 2013980, 5084908, 2777896, 2572277, 3132346, 250800, 652671, 603971, 4625969, 5132235, 729743, 1271213, 3303588, 1489008, 7076891, 6150554, 5631416, 613061, 2942499, 5636777, 5139915, 1925801, 3109511, 1421017, 7652479, 4505273, 2225676, 1462742], -[7395922, 4571097, 2085889, 2277520, 351058, 1086227, 5619444, 1723829, 64871, 1896475, 691726, 7693895, 6052135, 1821130, 1695270, 2327018, 6601325, 711033, 2154544, 7664441, 3001197, 7888265, 6163356, 5656655, 4670306, 7946384, 8004258, 1616721, 1097474, 5360664, 8208452, 8338799, 509959, 5625899, 8290307, 7631273, 6101699, 4886341, 3750009, 708095, 7730403, 6953658, 5409945, 1288362, 1414813, 2689094, 2305733, 2831784, 5721206, 1016559, 7370, 6895818, 625316, 1565042, 3152863, 2637517, 4818508, 4547632, 3109038, 3997765, 5275964, 7943934, 2503660, 2860974, 2647284, 5822432, 808367, 1757350, 994048, 3377903, 2257443, 7873456, 8068532, 4865269, 2705746, 5972156, 3672806, 1711804, 3165080, 7227300, 5209427, 5912837, 7545113, 6785267, 1539398, 7364405, 960855, 1934300, 3794855, 1972703, 3070181, 1780028, 2449280, 135590, 8367342, 6116597, 3258361, 3853199, 62614, 4859398, 5670539, 4977542, 6085745, 5806517, 7741622, 2007381, 5591518, 490739, 4814031, 5032687, 2212338, 4987868, 7447044, 6839776, 7843577, 240616, 8279447, 5881691, 4167622, 4517217, 2983675, 848129, 998780, 5178472, 5786494, 5516914, 5306892, 5665085, 1356090, 4001804, 3955740, 416942, 4296968, 372945, 5982379, 348652, 8198908, 5123593, 322409, 1745251, 2572269, 5882480, 3707252, 5935735, 236967, 1137150, 3101890, 6983517, 3128627, 6924523, 6537496, 4701666, 6725131, 4482092, 1651544, 7586363, 5832959, 2619795, 1028973, 5777022, 6756714, 1620841, 7690496, 5930494, 5247338, 539614, 427522, 5131667, 2034438, 4317237, 4826606, 2553389, 2381729, 5344792, 6125691, 3691601, 5637465, 463050, 5912229, 2135950, 2668678, 1399829, 7271403, 5942073, 3040482, 5827147, 1947121, 3564976, 64384, 5852214, 799257, 6389153, 4494795, 4930572, 3052650, 7764978, 3158997, 5565870, 3859029, 6091022, 5274341, 4061300, 238381, 7824038, 2405492, 7269632, 1818743, 2160808, 2504800, 5715272, 7240827, 8154924, 5299324, 1955687, 1913264, 1615039, 8357743, 7542925, 5178040, 701298, 4010291, 2647124, 1595453, 7899739, 2277829, 4544139, 724313, 3570885, 5567960, 2513920, 3231674, 4250002, 2674426, 1845839, 2385941, 6321385, 2999267, 6958280, 6052958, 6403556, 6235636, 5423264, 3841129, 6902749, 4612504, 7537803, 2746649, 3878708, 4957794, 1124877, 1683493, 6598870, 3549804, 1537380, 2097556, 3517245]] - -rhoPrime: 7097E5DF24D66FB91F54751AA2FEBA9103BBCA43B407E93538D4D064913CAFAF2C2E974F22A855716B73399499CBE0285C00C6B916DA0A513EFF7DA22CA7513C -y: [[423557, -508962, 216023, 437402, -328094, 85853, 74363, 484136, 134091, 515679, -135046, 86516, 488540, -26857, 86096, 378295, 20005, -212135, -399187, -291913, 303910, 53618, 101916, -490827, -213698, -81729, 162375, -228574, 41755, 339753, 436742, 174521, -173795, 465077, 484411, 89695, -133316, -139953, 129839, -521364, 335126, 380065, 125875, 42873, -310600, -449779, -165313, 410418, 248780, 99883, 155439, 457059, -375166, -305210, -311159, 450277, 314628, 87325, -65185, 422264, -162406, 200653, 36964, -518831, -234657, -153285, 1009, 383431, -198014, 254011, 24888, -157225, -382269, 301691, -13746, 22633, 105168, -185413, -515858, 500263, 264289, 256359, -180906, -457490, -102657, 476589, 9170, -436929, -120882, -430556, -291530, 330220, -120000, 335209, -173041, -356047, 351487, 10246, -296249, 403769, 282548, -168155, 427543, -186668, -285250, 405627, -426490, -341015, -55313, -328781, -468462, -138691, 221412, -27183, -80382, 134387, 245228, 227825, 485924, -68900, -75431, -219923, -171852, 92762, 433531, -269075, -23051, -24120, -289253, 228297, -19014, -395510, 407572, -273040, 246323, 403388, -169722, 234148, -419128, 501246, -290978, -476433, 197933, -114969, 241055, -349284, 506205, 342902, 73853, 511023, 361610, -356550, 122541, 358627, 466920, -476792, 277796, -391146, 231554, 75517, 70970, 24831, -490374, -278009, 490169, -514935, 112105, -349291, -305136, 305834, -54324, 63128, 101908, -502338, -442355, 250317, 377752, 30998, 13518, -15110, -230213, -123223, 190753, -315671, -86362, 319161, -411573, -333867, 101317, 369049, -439679, 246616, 222793, -386306, -59267, 135104, 90688, 168459, 193215, -193572, -235784, 154608, 295018, 77769, 347011, 205720, 214019, 15671, 75288, 249031, 499499, -386544, -519305, 106432, -461096, -160822, -49854, 12797, 14372, 139032, -41224, 456083, -304643, -212461, 472887, -471689, 405038, -343918, 23202, 327952, -494684, -334416, -388570, -516849, -69136, -230476, 195894, -376647, -316708, -12138, -420741, 219887, 490593, 211795, -522152, -396692, -346948, -364941, -267286, -42442, -486941, -34824, 493548, 295333, 208002, 136865], -[110329, -289102, -392914, -180910, -369475, -207513, -2826, -182493, -67549, 90035, 72766, 354229, -95722, -332117, 389091, 341465, 297076, -363646, 495967, -452643, 369288, -420245, -167592, -404683, 124612, 51618, 473968, -146933, 447021, -84554, 116620, 477248, 339467, -214100, -346055, 382087, -242447, 23867, 132111, -29806, -56681, -513167, -265702, -6649, -501256, 505520, 148028, 28018, -515238, 206462, 431652, 5527, -335220, -38390, 400580, -357756, 523227, 465609, 53702, -305420, 8750, -521491, 89801, 520779, -153017, 167355, 14844, 261014, -112506, -189682, 171287, 146205, -126978, 233428, 19079, 150561, -352676, -101020, -493422, 487380, -299907, 151225, -267795, 421325, 181755, 375022, 432363, -521342, -258170, 165432, 217309, -336054, -7257, 178105, 102241, 89231, 244667, 214741, 9418, -442433, 2011, 492464, -390799, 456369, -359261, -248688, 153973, -301438, -431329, 243416, -228916, -174167, 498090, 211479, 167335, -211094, 185254, 201304, -272586, 141793, -62241, -250583, 367772, -289727, 229895, -120888, 198738, -159674, 206631, -7918, -383541, -106550, -174840, 230405, -326516, -72776, 515876, -251159, 484143, 257517, -409828, 203356, -410168, 266865, 461154, 341522, 54540, 348650, 272301, -224373, -8489, -469738, 98977, 301604, -492310, 178763, 132800, 294104, 301829, -132706, 286476, -500973, 60309, 199355, -412072, -76767, 191815, -310497, 275992, 223444, -317752, 417564, 231118, 260712, -347800, 456312, -12262, 142985, -413453, 462928, 493153, 375634, -123817, -460688, -147129, 45644, 503474, -444920, 188015, 267549, 138064, -58402, 439049, 393198, -368369, -211271, -244689, -21618, 75123, -317516, -112088, 393214, 125374, 388142, 150020, -31028, 167219, -267739, 46699, -53242, 197373, -232396, -152776, 159019, -198074, -348707, 427273, 99830, 407286, 248889, -382943, 490134, 333958, -214126, 406893, 409563, 236547, 325857, -204860, 253685, -488373, -313850, -262281, 502137, -100370, -131473, -81561, -198306, -205321, -394799, -127647, -76798, -417255, 63867, -105443, -174323, -377362, 67437, -117089, 309108, 409679, -295152, 107786, -110205, 467963, 392866], -[-204958, -52948, -36732, -142286, -515695, -327036, -470613, 458938, 204398, -25752, 352039, -400342, 308243, -493493, 109879, -40579, -102675, -114201, 73373, 408287, 441170, 88093, 155529, 132502, 498094, -356598, -4231, -12191, 345562, 501189, -99189, -320217, -482200, 265183, -516722, -495116, -290957, -421603, -389035, -149809, -193339, -192140, -167895, 158123, 341800, 158785, -476994, -452060, -123977, -222086, -446932, 425939, 499703, 155448, -56604, 424961, 93067, 98061, 410671, 299646, 108198, -308400, 159039, -141434, -19214, 102223, -469991, 142322, 465711, 27561, 190781, -101286, 219840, -439810, 335822, -239306, -370578, -212347, -254429, -225825, -504182, 18729, 249219, -313449, -82994, 504729, -356107, 33393, -118890, -226372, 95276, -32300, 446629, 138040, 434794, -130841, -380388, -247705, -71098, 522148, 100553, -430534, -425801, 495598, 122281, 257137, -135279, -303273, 509172, 105897, 306110, -411096, -237734, 469089, -53575, -84416, 121623, 406913, 153632, 227108, 48452, -408182, 87900, 47335, -83139, 331276, 482242, -170005, -432798, -270552, -40084, 318136, 122780, -514826, -302519, 520958, -227485, -107628, -197811, 931, 373337, 269743, -415835, -61016, -415133, -350771, 318020, -194440, -469497, -28289, 87748, 297572, -13433, 193736, 300710, 377374, 240861, -16044, 291107, -393572, 15346, 4777, -265681, 460715, 347515, 19398, -157143, -463131, 111407, -147316, 206474, 360076, 326275, 506798, -44619, 315538, -504467, -6393, -496590, -330559, 430704, -459958, 297965, -258162, -501038, 214487, 159399, 164705, -504393, 103448, -370346, 32923, -132135, -153847, -208199, 230780, 117640, -206259, 305657, 151527, 164157, -454985, -455704, 241540, 114277, 210798, 380403, 260270, -60363, 70541, 303223, -263149, 246351, -222437, 98053, -413322, -358814, 423025, 76505, 454160, 178667, -38882, -466607, -145555, 512855, 413455, 67675, -74708, -106486, -96593, 349523, 455582, 277102, -74060, 438664, -89389, -177128, -84060, 350401, -305462, 520823, 115008, -408225, 375786, -128917, -384175, 24145, -495877, -147830, -293369, -319636, -181569, 332697, -231529, -372626, 256284], -[99631, -389908, -426382, -181598, 438380, -427232, -212168, -78705, -6865, -23509, 300603, -475377, 476642, -515236, -317241, -425548, -91037, 459546, -285305, -212320, -361888, 392076, 417559, 40900, -173020, -470243, 257267, -455641, -61374, 385064, 93192, -750, -338298, 48441, 329324, -477879, 517502, -364948, 450326, 283676, 424225, -9513, -366790, -159568, 235763, -30697, 345522, 16609, -369849, 324230, 419809, -175959, 214712, 450822, -267274, 136331, -508984, 296387, -34422, -72374, 297861, -300172, -97953, -69852, 522046, -29749, 215364, 456095, -339512, 110965, 312964, -347905, 5709, -511916, 61368, 184617, 183897, -103509, -162122, -447454, 196275, -506517, -182290, 140326, -67934, 124152, -342977, 120448, -86920, -351336, 316855, 266656, 380304, -15131, 5502, -410666, 499388, 135015, 95039, -445470, 305820, -430281, 218058, -188112, 388253, 407603, 330589, -22174, -65809, 480841, 107736, -329866, -70568, 444542, 174443, 148191, -115587, 287294, 334987, 186858, -256037, -510871, -143648, 8621, -381205, 315832, -324553, -504230, 161086, -10630, -273173, 160245, -15627, 354254, 175726, 249471, -134206, -480335, 270816, 246679, -83956, -28784, -287847, -139277, -440162, 482869, 209989, -86377, -348944, 15095, 16695, 181083, 8681, 429938, -296438, -437591, 221446, -520410, 343023, 293393, 343885, 271353, -209328, -47467, -460034, -342659, 306544, -31377, -162020, -55994, 92784, 20510, -79299, -269135, 428670, -274358, 290267, 93024, 414768, 392807, -491552, 69185, 460478, -110405, 192874, -73829, -28158, 232302, 235036, -470739, -7198, 410209, 25096, 96029, -328747, 274138, -30635, -39695, 369026, -12391, -457455, 436286, 274626, -53820, -121095, -205437, 62768, 506758, 363097, -217904, -181313, 342186, 413595, -67182, -72411, -254226, -254529, 146758, 106867, -442798, -208824, 198170, 179936, 303061, 74443, -203086, 88029, 18484, 149661, -63340, 209300, -301539, 245442, -428478, 519596, -288001, -181698, -458545, -45669, -489770, 261645, -77599, -159360, -454173, -454918, -92325, -430507, -281105, 130543, 440810, -495310, -428190, -105587, 459770, -190074, 275270], -[228560, -471858, 380005, 521487, -111342, 243552, -208292, 107647, -286683, 191670, -237964, -261148, -215544, -463865, -69448, 217335, -34436, 486811, -111131, 343267, -303119, 429445, 365721, -487363, -194050, 11838, 387308, 296055, 286079, 203353, -131648, 156186, -445164, -470836, 135348, -21567, 163943, -260879, 241148, 434052, -64516, 445596, 352635, 485858, -52961, -85644, 472024, 477244, -379215, 162541, 111301, -17637, -275767, -256350, -431188, -479510, -485658, -19173, 477595, -316644, 60771, 474301, -353950, -123267, 111208, 115753, -450416, -504284, -115411, 222113, 243340, -287669, -40756, -310442, -4115, 456333, -33348, -250973, -60210, 50030, 473274, -382504, -439943, -356876, 125116, -101523, 510904, 274084, 126848, 290974, -336140, -281325, -199643, 90630, -91536, 467184, -289587, -412382, -311748, 146128, -511262, -379692, -50462, -152371, 463894, -41801, -365187, -345998, 249216, -117893, -513377, -118064, -433994, -331865, 450857, 394747, -324317, 424315, -361865, -153452, -14696, -240170, 382418, -288980, 244240, 449409, -158016, -241074, -38591, -392245, 384733, -511248, -429370, 499507, 291932, 52768, -101725, -240011, 84714, 229970, -274163, 59638, -423792, -49292, -33372, -374144, -170665, 100770, -199016, 244157, 286620, -310427, -280645, 57466, 344151, 46975, -239039, -7948, 252224, -193576, 100567, -288474, -214990, -121665, 415702, -352511, 178714, -288806, -58368, 170883, 171748, -410637, 369585, 419899, 406161, -128043, 73294, -284835, -247348, -457144, 343961, -511200, -107300, -195967, -67529, -350320, -276787, 155820, 119131, -36727, -177793, 343284, 474114, 518277, -352959, 228644, 105365, -209073, 3547, -129330, 116859, 508792, 208030, -168036, 475259, 400452, -485782, -516473, -159072, 329955, 147361, -413408, -183834, 440178, -313151, 164939, 263622, -510573, -441654, -287347, 225339, 231146, -240519, 373750, 521978, -511621, 523318, -233436, -479725, 166071, 303782, 297176, 237823, -218851, -23235, -41088, -316109, -108777, -178449, 364048, -248860, -347360, -91676, -146980, -201185, -85159, -303644, -415255, -144661, -452410, -308424, -323783, 217738, 208703, 226166, 470230], -[-165361, 197905, -362330, -262203, 204627, -88732, -495247, 285634, -48018, 80805, 413291, -142536, 27427, 383002, -468675, 231895, 349317, -360973, 310639, -356657, 241761, 105589, 100694, 183000, 499398, 394085, 184520, -435583, 295740, 214040, 276620, 411590, -306728, 275714, 133674, 459557, -305522, 130490, 488699, 30448, 178654, 416991, 430283, 375118, -202028, 21420, -248339, -441628, 4304, -115934, -56720, 414692, 255094, 512837, -361320, -488766, -109488, -6989, -96048, -99445, 136753, 356821, 174703, 505757, -403302, -51169, 225484, -197682, 353675, 465892, 476688, 516148, -193676, 393044, -383075, -31928, -140919, -520909, -145590, 196494, 173877, 391393, -482252, 383141, -414699, -482157, 405517, -385307, -102688, -300789, -13879, 210015, -14489, 137202, 12488, -326568, 108629, -497573, 423846, -209291, 64571, 481592, 238685, -186811, -113912, -388990, -58786, -138065, -398009, 320302, 135699, -138988, -150030, -210945, 224374, -404964, 305246, -41541, 211013, -235866, -365830, 188579, 30419, 371419, -251433, -321315, 357, 74468, 507190, -416082, -6164, 252074, 143593, 376847, 310118, 117460, -289536, -231237, 400221, 322790, 211276, 198022, 523203, 157160, 120761, -252523, 168342, 426978, 188363, -94807, 89742, 386844, 487897, -210733, 42803, -394499, -261521, 177935, -322819, 356439, -316471, -349620, 214436, -279467, 338614, 497010, -126958, -60019, -204070, 99551, -61199, 230215, 304456, 52737, 435580, -197677, 222597, -302221, -10613, -319385, 47237, 485029, 453282, 423709, -209462, -44959, -57667, -63064, -434895, -306333, -44152, -128947, -220706, -469752, -151007, -161249, -314604, 389119, -495206, 489673, 328956, 382350, 313932, 252508, -54658, 76122, -254921, 112056, 325691, -94666, -492600, 254686, -492894, -251, -22023, 507727, -447758, 464047, -22002, -209717, -178366, 132626, -295325, -274455, -108658, 520215, 42871, 495491, 478316, 247600, -253011, 131360, 85198, 350768, 137362, -209674, 152862, -85222, -333394, -426909, 393336, 365902, 142005, -70684, 261680, -98401, 251845, -507134, -43095, 371009, 393774, 464051, 370493, -134917, 410309, -58913], -[-113973, -13784, -261798, -77945, -443646, -239139, 381373, -102581, -200649, 176036, -62367, 235849, 371074, -37175, -228141, 435247, 422997, 25045, 159947, -296516, -178603, 421066, 341689, 164773, -156404, -449835, 408978, -312934, 82282, -86048, -485252, 496005, -469179, 65542, 100713, 168061, 520361, -273389, 39832, -166607, 294973, -475911, 189851, 68890, -160534, -186110, -135919, -153089, -325974, -259719, 373089, -498939, 42662, -322376, -166316, 298617, 406197, 247877, -381309, -214168, -466616, -500116, 182689, 154049, -201363, 499072, 75159, 208252, 282374, -68628, 74233, -9041, -223912, -517835, 376721, -236709, -100612, 267165, -423687, -88711, -340364, 69365, 415073, 423962, -58527, 54117, 132375, -477501, 38656, 269155, 33066, 512639, 521408, 481698, 140025, 369252, -44082, -520813, 394766, -209640, -347692, -491473, 236264, -134160, 353028, 21123, 343687, 398126, 409349, 223590, 450096, 426607, -520189, -53152, -315552, 485738, 326236, -488925, 92633, -212812, 214745, -451554, -296196, -294914, 239141, -290478, -505419, 62480, 78535, 21890, 75721, 126586, 185039, -252383, -248375, 336117, -214515, -86716, 152587, 185413, -110362, -448338, -406864, -237554, 379910, -20478, 193688, 257709, -236771, -160838, -501461, -331697, 260240, 279554, 474095, 409606, 346548, 120896, -499838, -137167, -495911, 494015, -276581, -81992, 57182, 189697, 461628, 94256, -276856, -310002, 133286, -361835, 520018, 465962, -32804, -318339, -269425, -5574, 50452, 426765, -244578, 273518, -395524, 418588, 349970, -8415, 132527, -67429, 52354, -368069, -216844, -181801, 22187, -427785, -445826, 429049, -188787, -73116, 508881, -362969, 300926, -269012, -239698, -76564, -504189, -391736, 85500, -57003, 242493, -328263, -435689, -268700, -60201, 195852, -185171, 181096, -306685, 7323, 487047, -123271, -18008, 99696, -133766, -111505, 43857, 381182, -167011, 177028, 268876, -336461, -49480, 428705, -28011, 339705, 54730, 198199, -508847, -515768, -358616, 196423, -290447, -340139, -115659, -92817, 85386, -381474, 242708, 513947, 381846, -144127, -310882, 312404, -298040, 186914, 416892, -29274]] -NTT(y): [[2276095, 3384441, 2676375, 7129156, 6375394, 4730470, 507736, 1343784, 3046856, 615748, 6453820, 2309566, 4121735, 7429936, 7192885, 5856786, 7216703, 3466174, 1144450, 5811370, 8201916, 1355431, 534186, 7699987, 6779777, 5536436, 5994726, 772709, 4019313, 1887803, 2933334, 5483503, 2202235, 1184990, 2203611, 2650155, 8199322, 8180784, 7464170, 3404936, 7076047, 5072853, 5253282, 5469606, 7722537, 4365977, 5332584, 8327696, 7360583, 2039599, 3753338, 927499, 2323220, 7807466, 7769501, 3590272, 3658200, 7331829, 4836950, 2157078, 643910, 7778854, 1136642, 3483926, 1361052, 1740622, 1429225, 2269513, 3681874, 1841384, 8143137, 4211076, 8241739, 1577431, 904779, 5608707, 752889, 2266805, 4313095, 5043737, 1233630, 1736552, 6598776, 1416806, 4118207, 4220485, 7151276, 6620011, 6735957, 4222454, 3684892, 7505130, 4846980, 5417160, 2982709, 1513885, 3683491, 7226003, 4149165, 4501163, 4871193, 1082385, 4239662, 963346, 2974007, 1849196, 868182, 6951485, 4037918, 1305251, 499397, 4781651, 7048460, 5362165, 1092234, 5230212, 3120495, 1677160, 8330646, 4655772, 5842416, 2491369, 6092565, 6474651, 7501318, 7168416, 540638, 5768056, 1955022, 6129910, 3441373, 1332033, 6603655, 1320824, 4986048, 3279690, 3609584, 4147477, 7336598, 1023620, 5326132, 7045264, 3462580, 1078665, 5067843, 2511308, 6010530, 2056255, 734261, 4759552, 6211342, 5041772, 6873794, 210973, 7341012, 7626579, 3071717, 734984, 5372155, 826548, 4295117, 5299169, 2147339, 4089160, 1720785, 4036046, 164900, 7376607, 3549294, 2449382, 7966106, 6548066, 2732991, 6792356, 3114885, 7447904, 31589, 5278098, 7953939, 1399518, 8100233, 3824570, 444227, 4222621, 5560176, 7900713, 2615324, 4301288, 3856018, 431797, 1206264, 95455, 2842445, 4592811, 748012, 2057164, 7699117, 2565722, 8252349, 7538308, 1057896, 7836139, 1672935, 7864690, 1847243, 7289778, 3119551, 3798591, 7671249, 6020495, 797207, 414614, 3307458, 2514295, 6484165, 770548, 2126447, 5856111, 6472338, 3382634, 4539169, 5882728, 6358430, 5613744, 6745158, 420552, 2806401, 3375630, 3681256, 5853632, 1368676, 4885792, 6074891, 7154671, 8077905, 3596344, 4218096, 5191461, 1075834, 438583, 8058676, 865938, 7063671, 6758507, 7125124, 5320939, 1802020, 2326594, 3854664, 8089946, 2442946, 2045558, 3729854, 3233726, 2796215, 73154], -[6140097, 2198057, 7678143, 7553696, 1259106, 7948034, 2652342, 6663838, 5220898, 5903918, 1233231, 5916909, 1149386, 8186519, 7048664, 5676677, 6256897, 5805460, 2170518, 6886180, 446081, 5099607, 561650, 1541090, 5967621, 8238175, 5244769, 1866459, 617105, 4663399, 8292385, 4265820, 1570691, 3562789, 5031332, 8247316, 4388496, 6997954, 3890026, 7102017, 7222279, 2895601, 6602449, 7579524, 2074891, 534525, 1715969, 6874483, 6425587, 2443854, 179, 508168, 565535, 4432513, 598264, 534179, 6862626, 1213876, 7141897, 2514837, 4116820, 6072065, 895557, 2516490, 3211034, 2590211, 8116998, 7287392, 2630419, 3446979, 3123402, 1868776, 6188181, 5585067, 2439861, 5800056, 3533347, 5329277, 1109972, 1659693, 8212750, 346845, 4874442, 1772160, 4729674, 3926957, 4250160, 8199876, 7418587, 6307907, 7309024, 7414644, 2686130, 5722639, 4018583, 2021421, 167721, 5412515, 7344324, 5986649, 4052103, 4766112, 5004674, 7520121, 2642151, 5878058, 645558, 4454784, 6824919, 812337, 5934375, 6839103, 984152, 29531, 704193, 5932111, 3156352, 7396872, 2427627, 1165109, 5554847, 2150834, 1425377, 4492418, 8194926, 32002, 4848630, 2000403, 6190595, 6319330, 1485359, 225048, 8142505, 7412563, 2454309, 815767, 6757859, 6333318, 3396810, 2653148, 5821255, 4119232, 8084147, 4116399, 2095658, 5877573, 5809210, 6476210, 1758142, 2828489, 5998262, 4680168, 4713617, 6298527, 1166958, 6069995, 1814852, 5306525, 1297846, 3909883, 4882513, 79176, 1428775, 940386, 2395542, 2427846, 2903001, 4148427, 7130420, 2085831, 8367224, 7175045, 791874, 6195652, 2830548, 978776, 7302450, 3892836, 7104771, 1136076, 4312411, 3300647, 205222, 4506232, 2143640, 3230678, 7241162, 7490488, 4020934, 2101832, 3175059, 1925133, 2712096, 1675951, 4546710, 4974088, 1612619, 6517227, 2302098, 885964, 1239223, 6450896, 662265, 4867639, 185664, 8254308, 1745565, 2008299, 4246614, 2209574, 7225933, 878355, 6881006, 6782799, 196930, 6708519, 74952, 5474690, 308496, 5948931, 2532473, 5963940, 1066961, 1035336, 5519299, 676710, 6462528, 381679, 1212218, 7467068, 6545534, 5520108, 7415893, 5606425, 7845630, 2182839, 5299472, 2916839, 5633381, 2581644, 6839718, 4573399, 5122295, 4608751, 7225721, 7320898, 4876460, 922725, 2325436, 5011680, 1448458, 5846508, 106888, 1250956, 1693423, 1978939], -[7334523, 648677, 1426429, 2293845, 504237, 1996863, 5081912, 5275653, 7081438, 5998148, 5012382, 6638808, 6354580, 159293, 3254434, 2122287, 6162340, 5567982, 6103123, 1564491, 5513935, 4683249, 2345582, 5012583, 954665, 4291193, 2026128, 5581072, 4471332, 2698064, 7212842, 7943121, 2761922, 2575225, 538695, 4664094, 2461091, 5261418, 6941400, 3852325, 7060540, 1651744, 7508075, 1859471, 6852893, 7459721, 570420, 3662819, 1344013, 636647, 2962339, 7820190, 942337, 7831405, 3473286, 1736759, 1814670, 7053508, 3539302, 4863817, 7851445, 7460926, 727503, 4061938, 1046596, 6705907, 1091698, 4795896, 5192988, 4609729, 6956095, 459131, 7954721, 864572, 1432276, 3306129, 4240428, 6059014, 6066757, 1418886, 6033319, 5352533, 5386373, 7482265, 961695, 3157760, 708631, 3510834, 7028104, 4432028, 1022752, 4048839, 5583810, 3771327, 5809509, 2868626, 2355983, 2652205, 7526228, 2991227, 3600411, 8032715, 2918618, 1028629, 7517190, 453762, 2975056, 6351283, 7693378, 3721171, 5221207, 75714, 4226874, 343249, 6716109, 6242318, 7604316, 6660874, 5131976, 6588043, 7230365, 1827682, 3215016, 4825265, 6219176, 8322223, 4416135, 500761, 65974, 5797520, 3894685, 3301633, 5944870, 5316855, 5463515, 7529104, 5948296, 674170, 515402, 5455285, 6329883, 2423619, 2208644, 6251952, 2554150, 2087208, 8230189, 6322488, 185472, 5621823, 766242, 3906619, 1707762, 6412923, 7969928, 2800717, 2761021, 4891196, 2602530, 1445140, 2368289, 7675666, 7519791, 5572523, 5736043, 3477853, 6601824, 2035888, 3304888, 300402, 3698790, 3086360, 4374638, 5146052, 1468504, 4730324, 6063841, 1542384, 1680924, 3209920, 4866373, 2061964, 1607892, 5888111, 27631, 5063625, 1225115, 2729470, 3057896, 1141818, 7325534, 6114637, 843940, 1289265, 4747542, 6405294, 8030838, 6665941, 7191721, 8109552, 7596732, 6273944, 5601710, 1411844, 4565298, 4270826, 6460080, 8194794, 8317914, 8079450, 58694, 6051439, 6900901, 3822208, 256087, 392972, 4443063, 7144525, 4329327, 8261559, 3487413, 6296753, 7173511, 8001047, 4545566, 8316437, 7234949, 6575833, 7904569, 4634248, 7166840, 6236435, 8117842, 5971560, 1185146, 1672447, 5121900, 6875708, 5417228, 1727679, 4827919, 843581, 4501520, 182415, 3124373, 5303453, 2633084, 7572651, 119695, 8044648, 7105618, 3063693, 2055320, 6633944, 218555, 2663937], -[267097, 1125583, 6771506, 6103680, 1707714, 5852757, 7529081, 1434367, 1502882, 7159019, 4692126, 5573074, 5841659, 2850359, 839925, 2946159, 2823010, 4750224, 3796031, 4068252, 3374671, 3400889, 3421204, 776538, 594694, 2415182, 4348822, 3067464, 4542492, 3765080, 7916243, 6838540, 5073124, 7948134, 1827281, 432449, 1131914, 3464543, 6681826, 4597737, 5172132, 6602953, 5482297, 1971949, 1723790, 2518648, 1735478, 1526315, 1937148, 1832482, 564174, 1967440, 7026693, 1712994, 1745719, 5176322, 151546, 7933192, 6598677, 7229966, 4043413, 2419825, 7573090, 3446115, 8153825, 365240, 270854, 5526706, 1097559, 1654713, 3263432, 7530369, 2514009, 7035814, 5304709, 4407669, 619449, 860984, 4182838, 2092919, 6671955, 4119625, 1433447, 5697672, 7932809, 12977, 4395117, 2509646, 1239393, 7698195, 6341340, 946624, 3459640, 590647, 1325681, 1398560, 7131039, 206338, 6515478, 6663196, 3844758, 3251951, 2776067, 7832901, 538371, 7492275, 1470791, 2739033, 7658900, 7854113, 5889314, 2627279, 4173619, 3933848, 2378878, 2975014, 6925018, 3433953, 5625453, 2916817, 5412346, 1006476, 1223255, 7602295, 2438049, 473566, 6709005, 6625675, 1361183, 821213, 4396722, 279732, 8188004, 1632752, 8342467, 2380439, 4549488, 1257136, 5324702, 3087644, 501350, 5825652, 4969656, 422701, 7254241, 2438567, 1776520, 6349773, 2471384, 5045529, 2479627, 5532677, 1537096, 4215897, 4119936, 6315585, 5046840, 6662874, 220238, 6143279, 6383691, 2948259, 7756943, 2766712, 1434818, 7970131, 2094307, 1089911, 5900605, 4100479, 5722760, 1224737, 7226527, 2421183, 8248832, 7317634, 378950, 4960982, 5970694, 3960214, 5589414, 6446446, 559215, 2501340, 6347712, 2211233, 6029955, 4623378, 2441317, 2018614, 682115, 5605600, 6722097, 5300377, 1893090, 8315199, 2385641, 649082, 5130488, 112776, 2946180, 6289745, 6988947, 2602944, 7708960, 6422575, 6560311, 4518683, 5917251, 4664066, 3550739, 4597839, 7398898, 5031595, 4077021, 7035645, 4177584, 4197849, 1913645, 6134572, 7225119, 7148936, 6080927, 7935269, 4334629, 3656086, 7274616, 6386201, 1249904, 7530675, 1316713, 6882890, 6077837, 2374958, 1747126, 421068, 6991797, 6189930, 8330808, 2143953, 5998821, 3436951, 1221867, 2312329, 7704431, 1820234, 2788986, 6900017, 6747194, 1148104, 7354651, 1256075, 6365607, 5719686, 5395708, 971718], -[1406111, 97529, 4076473, 6557308, 7323676, 7089273, 6942833, 3410742, 1353741, 2925202, 7938616, 4145744, 6623974, 6937238, 3787423, 7645706, 8031069, 4549713, 2485748, 1078033, 5843276, 2648406, 5822254, 3964661, 782447, 6941289, 3130339, 4573857, 7583987, 800162, 3469957, 4546451, 6247697, 940644, 992262, 2761931, 7405325, 6170005, 4668813, 5071706, 323641, 8078742, 7141958, 5328242, 2019653, 6087867, 7150558, 2095811, 3255646, 4956462, 3343696, 4892756, 7464195, 3766390, 1016741, 7597786, 3332037, 1457489, 2213848, 3455842, 1922813, 5074154, 6065155, 4991969, 1029623, 8032010, 3193782, 4669204, 3433619, 7234870, 2333715, 1553217, 5485978, 5039820, 3992927, 5635864, 4881958, 7813400, 597527, 4579134, 6833611, 6008213, 6141239, 6859859, 3983657, 3876177, 6243340, 4991559, 56723, 5993832, 3942527, 5275488, 7895859, 5313199, 5344411, 5147111, 2987980, 8036733, 973346, 1558375, 797069, 491153, 1823930, 11036, 8198459, 1389728, 5020517, 8274114, 6296547, 251550, 1997519, 7392840, 7141225, 1809862, 5441136, 4435870, 3187497, 4340870, 1585769, 1492795, 5666419, 5487425, 7445413, 3313843, 7801465, 7459899, 7403844, 3966097, 1837880, 3083227, 3320538, 4920132, 8312671, 6808659, 11679, 781346, 8060254, 3987245, 2684677, 7948347, 6429071, 3145672, 5643573, 7986268, 7379137, 7029529, 4473719, 6125235, 3557928, 2695913, 8090644, 5801476, 8149640, 2386399, 5398415, 7342332, 6994609, 3008459, 340900, 4514794, 7474489, 8199619, 1696816, 3885417, 6420147, 3642753, 2618632, 5035440, 4795593, 2765916, 7608687, 5252140, 3208726, 3132370, 2093303, 3990228, 8092341, 3614966, 6243418, 3713669, 7507439, 3167711, 8276344, 3834058, 5259326, 7891319, 2900522, 5790232, 6849799, 119244, 6730927, 5135513, 7979483, 2199998, 4313303, 3885086, 628657, 7795117, 3795802, 3093416, 8314477, 5623300, 7803580, 2018459, 5762786, 3784730, 2512815, 5740356, 5735659, 7100868, 4438845, 1552877, 1716734, 8196497, 5678861, 582507, 368654, 6533737, 8345348, 477533, 7448945, 786937, 7410577, 5346189, 122764, 486200, 5016587, 4679992, 4917897, 7706384, 3329695, 44801, 8319923, 6502038, 6494024, 2029222, 6883053, 6562549, 6134764, 1513471, 5067632, 3117181, 4561272, 501878, 2938467, 7724259, 4368100, 2410832, 364510, 6693210, 662718, 7538268, 5286544, 1764601, 3395839, 6719274], -[328115, 7569555, 2257151, 6523541, 151269, 1714574, 924246, 4582464, 7399633, 2719937, 3412904, 3393003, 3528962, 7599458, 5853955, 1240384, 463340, 5231620, 4286803, 3159072, 1135501, 6418298, 7124959, 2860070, 7528484, 2572169, 3779151, 5680020, 1690208, 4703066, 8041717, 7386880, 178197, 284284, 8195803, 2233011, 4502219, 807760, 8058586, 5503089, 4471321, 3520397, 7244979, 4267438, 7732816, 6505755, 790059, 8326686, 6282377, 1113817, 3567765, 5387287, 8329861, 140650, 2110746, 262944, 8092463, 2487631, 6434813, 5899440, 2563633, 99546, 5389914, 4434060, 1486864, 5525201, 2782702, 5412577, 6394423, 5491577, 3059221, 8023993, 2291360, 7780527, 438473, 3182696, 6115037, 4047239, 6932895, 174807, 4189485, 2987543, 4330531, 3396359, 3381346, 6034390, 2740979, 3768719, 7763822, 4186036, 3068737, 8360107, 294793, 3623494, 2529812, 8110180, 5418252, 4857500, 3182282, 4018768, 3204751, 288882, 7359550, 7434171, 3020761, 7697257, 8109614, 5506969, 3850893, 3765234, 623318, 7372268, 5780215, 6669995, 3510870, 4121956, 6392166, 7632156, 1411494, 1944426, 4628411, 513953, 3235340, 4477478, 3855036, 1923549, 7889731, 7698288, 5125896, 1160477, 1822966, 4109591, 3671367, 6848429, 6079490, 889614, 609756, 6400914, 4667345, 6642988, 2288078, 2481983, 2226084, 5307161, 5577394, 465102, 5426881, 3617746, 3828209, 8206725, 3586958, 1691173, 1180217, 3389527, 85178, 2964218, 117471, 7083894, 4746382, 3952848, 5219943, 3209999, 7924199, 796292, 783743, 6840241, 3296106, 4905308, 2902161, 8078283, 695434, 4077453, 3975083, 3858636, 5438893, 8048603, 6294604, 7271581, 6451954, 6413277, 706116, 5755948, 3182590, 6713651, 5730198, 6809004, 4869989, 1170579, 4396526, 2118364, 7303734, 1183018, 1313151, 850611, 3845663, 3902719, 7971403, 1771309, 5233206, 4339688, 5304186, 5365752, 7909472, 4434052, 1944175, 4438883, 366926, 1532030, 638720, 2872435, 1609805, 4440573, 7103732, 4826154, 3222796, 8359755, 7971371, 7938608, 7163137, 3529244, 2806335, 3292256, 7199922, 5416413, 1457378, 4871761, 993593, 3000450, 714684, 5635380, 826386, 341195, 1075113, 242256, 4402283, 1472855, 2685517, 5989526, 5558591, 364169, 6141282, 1550440, 6082124, 919529, 3441723, 8023530, 2433523, 182727, 3129400, 6685740, 72020, 6801790, 1665222, 5252469, 4798667, 5321519], -[7938504, 4075497, 7702455, 1563438, 199654, 3671120, 5112756, 2542838, 828502, 1734876, 242142, 6753918, 3378961, 6691248, 6421903, 7715597, 5096467, 1927583, 5615148, 5704610, 5205928, 6679053, 3041968, 7601180, 7803559, 3066243, 6103479, 8296621, 5885657, 1103736, 5595363, 3677091, 4459376, 1874241, 7653309, 1154527, 4111095, 6395274, 5437584, 7744809, 3958990, 109813, 4775361, 1050875, 6017863, 3237576, 4677654, 1493594, 7488430, 394120, 5247414, 7977296, 5581596, 8218295, 407141, 7930772, 5551333, 2184124, 3652222, 1252207, 582084, 2398670, 6883511, 5562163, 2641354, 3633451, 1489699, 4643682, 189283, 4867777, 1295280, 4560242, 6953602, 3786040, 7164755, 255410, 7167733, 810159, 4055319, 1966373, 398054, 3106923, 1077865, 6749576, 3745002, 3845340, 6259262, 363312, 6391489, 7087999, 4303830, 3283801, 1949902, 4118164, 163368, 907521, 2529195, 2571743, 6763834, 387978, 2037220, 2035065, 1684494, 6105088, 3902660, 2598413, 1521199, 5531332, 2983489, 2455153, 3856901, 1129230, 7557649, 2069630, 4205237, 63273, 5826260, 5247789, 3008648, 7151702, 2024882, 3000913, 577942, 592933, 6838047, 6120302, 1940863, 8089043, 3014966, 8281531, 5917753, 994134, 4894683, 4470659, 1169861, 4273216, 665041, 5825278, 7221468, 3082328, 6226721, 3992633, 655403, 5512215, 365509, 7559115, 7621784, 7258824, 1148947, 1366489, 228107, 2603832, 7056733, 158649, 2343651, 2314667, 813631, 7208449, 5117003, 7379908, 4442377, 2212881, 5663762, 2685413, 2569245, 4615690, 7183199, 1543868, 1829650, 5143202, 5536848, 632252, 1391637, 7359109, 7619758, 7557946, 6911183, 4522236, 5241822, 7690758, 6166096, 6734028, 4115969, 6794400, 4049757, 6265983, 7535712, 4832298, 1650777, 6323578, 8203367, 4532034, 7604642, 2763384, 6086932, 1403018, 448200, 4331556, 180982, 5272283, 2947085, 5783816, 7969712, 3813548, 3214465, 2779697, 7397182, 4783529, 4776227, 6149973, 7600048, 3030805, 155918, 6520732, 5735560, 2537705, 4997628, 1626079, 7541071, 3701463, 6051263, 2713334, 2881030, 3618808, 1266191, 5011231, 448493, 7987547, 1877926, 8251540, 1170770, 4843168, 6716942, 2847797, 7505338, 5708701, 3855824, 6974196, 589702, 1042118, 1801489, 3849915, 5051789, 3245868, 752873, 2385050, 7018216, 3253886, 7660618, 1286409, 1447502, 7688206, 1313081, 4610616, 6149059, 7867275]] -aHat * NTT(y): [[7729663, 6496623, 3202078, 7312259, 6566051, 6661652, 2360294, 3382531, 1302526, 4617712, 3014697, 4914671, 6579891, 4607037, 6660750, 2245445, 399551, 2376592, 3270819, 2570876, 7068776, 5172292, 1296870, 2912042, 5136116, 5893045, 7610679, 1247525, 5609243, 2103561, 4721428, 1865956, 4528001, 1629347, 1234834, 2058120, 4767707, 1405038, 6162708, 3298484, 3635538, 877634, 401712, 5038764, 8206260, 7709039, 2988614, 2236935, 7993206, 1030262, 7408435, 8215621, 6730383, 4361146, 2350287, 2093889, 3937711, 3246824, 1364665, 1914179, 6570093, 3215218, 2494493, 744636, 3766454, 31063, 4670167, 2011999, 2989325, 5700418, 2902156, 212355, 7598023, 7859597, 3623423, 1130645, 6081133, 5571311, 8309812, 4515293, 7071611, 2774601, 3668013, 4214053, 4207265, 1618927, 6957215, 7951242, 5760728, 4687719, 2446152, 6822868, 1578405, 7846476, 4700732, 6420866, 523075, 982025, 5266053, 803213, 5518833, 4818762, 7489612, 4259777, 3758944, 6397539, 640770, 4055793, 8018969, 1670030, 5492805, 6542472, 2186971, 3295506, 4196561, 1445182, 5155744, 4599021, 1080496, 487401, 414854, 466628, 3863862, 5430475, 5940234, 3699295, 7503643, 5478726, 1697118, 320038, 4480869, 7355949, 4307218, 87411, 4424401, 4483516, 2124410, 7378784, 5859499, 7959083, 3698483, 306137, 4082972, 8302427, 4161717, 7893541, 1742708, 4190575, 3592299, 7154, 910898, 4148322, 4943718, 7744964, 1204741, 3836257, 1348285, 3011687, 7427581, 8295473, 4740677, 4200779, 4108213, 5041317, 5730733, 3340200, 850215, 537159, 3134866, 6256322, 4569923, 2998531, 1439775, 2458807, 5824868, 1074926, 721479, 6362943, 5067648, 4018338, 2418440, 2203112, 957016, 1091780, 708656, 3955966, 2041870, 207788, 997748, 6037158, 6374917, 5288965, 6851280, 5124532, 6053058, 4459750, 1407776, 4862581, 4422415, 5831459, 3979920, 1365077, 4070354, 2335413, 4165605, 3732232, 2293510, 2070464, 4759510, 6570208, 5781618, 613061, 7971060, 656368, 3367600, 1505674, 4116592, 4580613, 154028, 1105512, 6834318, 4668486, 4493513, 6906046, 7984178, 2101262, 6866461, 3915098, 6214731, 854141, 7598191, 2045891, 8033208, 3140189, 4631674, 919971, 4925520, 1605330, 4941298, 1460230, 5182198, 7616759, 5573043, 5928490, 769357, 3363605, 6427145, 1201745, 5651340, 7356140, 2676153, 8038493, 7509800, 7387890, 2291077, 6924266], -[910493, 3869629, 351482, 4804624, 1493051, 7655411, 2966127, 2270061, 4287885, 1834898, 7968340, 6334783, 2162931, 3776334, 2367899, 6796636, 6128676, 4200348, 7270349, 8126200, 6161473, 6189497, 6665864, 1117609, 5923381, 4994817, 7685613, 2533866, 1465754, 1520173, 7132677, 6608226, 386180, 4496594, 598853, 3636227, 7687838, 4213868, 1255467, 3019610, 2216826, 5549638, 5173535, 4207148, 3392579, 5047216, 5533352, 281005, 6980974, 6904404, 6340306, 7566245, 1995522, 379294, 7376157, 3757073, 2795538, 3518971, 7122488, 1735104, 1850777, 4163588, 5624466, 6980970, 3147446, 7403990, 6089470, 8175782, 1047258, 1929865, 721619, 2615209, 546021, 7933794, 7986304, 2113631, 1956336, 3197654, 4739043, 4832473, 5785820, 4670904, 1058149, 4569099, 1683053, 5316554, 4822915, 2810449, 1086278, 4538571, 3046488, 1084367, 3339274, 2689326, 1400276, 7846761, 109342, 1267542, 6603402, 5486037, 7594170, 4307114, 3944029, 6928137, 8177798, 4557854, 4114887, 3162051, 4237395, 7984796, 1301466, 7722048, 8135853, 3525430, 3337025, 3400756, 1968677, 7808600, 1103063, 8300747, 1023124, 8332798, 62306, 102146, 5343592, 5004575, 388713, 4855567, 7431853, 330489, 1696838, 5741800, 6765773, 3611101, 1949399, 1277281, 7770444, 6018589, 3309468, 3777173, 5643132, 7764825, 6344813, 1714003, 5464646, 1406305, 2082513, 7284640, 480237, 5067330, 3172990, 3963704, 5541220, 2245487, 4577293, 102574, 3055864, 8054472, 5954110, 7214910, 3498617, 7256942, 2107760, 4273364, 8300553, 1857270, 1608998, 846424, 4406809, 8302606, 7312982, 6184179, 7860314, 3531758, 1455016, 3499757, 7106806, 2953094, 5125499, 15584, 1230069, 1136031, 1760680, 4378918, 6339029, 588589, 734521, 2056309, 1785778, 1780269, 843533, 1968493, 7270303, 1317020, 4784100, 4137122, 7545670, 7739908, 2958682, 7154037, 7595531, 2061215, 5507123, 5368473, 3574599, 5121977, 5322688, 1194532, 5297542, 6088945, 368706, 3013167, 6838881, 1458830, 6339911, 6920317, 4237442, 2839877, 6727844, 5063934, 3831295, 5444668, 3249600, 7045719, 1755217, 4380380, 5307234, 2875683, 5118896, 2678721, 3315023, 2927050, 6607024, 3206846, 4318742, 5344647, 7970947, 2904511, 2138845, 5511719, 2694983, 6341757, 3713384, 7650582, 7180623, 8279797, 6482569, 2040900, 7764133, 4034670, 8156253, 3140293, 8020340, 8142383, 2883348, 5163435], -[5587166, 6520522, 4331996, 4744688, 1904409, 1860230, 110786, 3259112, 8179795, 4690452, 3979060, 7335677, 4528564, 5334725, 458499, 6670952, 6219040, 554853, 1488354, 3212499, 5042470, 6699808, 7505078, 3649792, 2746425, 7891846, 3776496, 5217568, 415698, 5989483, 6510867, 6595391, 4997821, 1433651, 3573285, 5789622, 3286501, 5828791, 3160486, 3459963, 3505894, 6167154, 5219628, 219169, 3796071, 177987, 7927995, 6662216, 5151685, 7232531, 1319573, 3719072, 2769593, 2158725, 4431545, 2845528, 979609, 5879956, 4134839, 5146779, 1519252, 2097097, 4876890, 6978696, 3620872, 4072593, 3649349, 4487600, 7555782, 7237110, 7929651, 4174952, 6289750, 3414782, 4827763, 1217440, 6035428, 3057050, 3631126, 1865377, 6233403, 3343921, 6655403, 7712319, 5868559, 3480509, 5743789, 4534978, 3743514, 8038274, 1160674, 4131408, 3807293, 6028872, 6866103, 613803, 4937426, 3892508, 6698203, 5570262, 2581014, 8151908, 7382926, 4901325, 2630200, 3734534, 6620275, 6388040, 2844034, 1696120, 3146615, 2092444, 3891870, 2420481, 32238, 4738069, 943084, 8126372, 19492, 4921260, 6968506, 7226026, 1966262, 6783426, 8061460, 2721388, 2303731, 8062507, 2835129, 1555322, 6892843, 7714724, 8082206, 3736727, 5585259, 5049033, 1224018, 3672628, 3865507, 4295007, 1638426, 7817054, 871750, 8029700, 561787, 3997496, 341066, 8300351, 7699344, 2481057, 4499167, 4587050, 3251064, 1808000, 2895207, 1304194, 180394, 5944195, 3948631, 5576358, 2724434, 8233362, 8226598, 8172205, 2877841, 4921929, 7531253, 7043947, 43065, 111218, 7716871, 2027261, 3081321, 156466, 7314871, 5621386, 2521254, 1766388, 1248195, 6579235, 173171, 7483576, 6282695, 2912625, 6317152, 8325787, 6670299, 5358330, 4884545, 35398, 4956320, 808073, 8011816, 4658490, 4988766, 3376771, 4149916, 7019586, 6664769, 3505100, 2481621, 7330037, 4881686, 7482648, 745899, 2531452, 6225980, 4830202, 7223741, 7683488, 521685, 7919058, 6407119, 4422566, 645681, 4969338, 6000663, 7334978, 5720782, 5524801, 1925439, 4925866, 3174376, 3313847, 1840371, 68703, 5432058, 2558035, 6181138, 1039959, 1703779, 7219201, 999516, 2609787, 7144972, 5139765, 603984, 5211827, 5788810, 2765730, 6755294, 1807743, 2445628, 5092661, 2625995, 8251280, 3206012, 6094518, 513891, 5470618, 3020665, 1512068, 2698508, 1455745, 2145562, 2580381], -[462195, 3192828, 4817021, 4435354, 5915799, 6824611, 6837308, 2829160, 6382694, 38479, 3967710, 3257209, 5678744, 3628034, 8253959, 3910238, 5108258, 3669528, 3123571, 516197, 1010895, 1942993, 5839451, 7452235, 6918160, 7016967, 5502123, 314930, 3031480, 3544080, 4748042, 4262650, 7856508, 3955788, 5808094, 4946339, 7491006, 3264069, 217354, 4848883, 7599079, 4239577, 1723827, 5688715, 791072, 8063970, 915186, 7388638, 5706154, 7510129, 8300580, 248125, 7938220, 4887990, 4513772, 2965032, 3443648, 2594935, 12234, 1458652, 2033804, 928393, 4658157, 3845840, 6752468, 5387803, 2724300, 5023604, 3602839, 4234670, 445799, 3913288, 7022733, 3829121, 7556180, 3394936, 5349439, 2402051, 3232239, 6109098, 2528891, 2809407, 6045666, 856545, 3812352, 1288659, 1638576, 7517898, 6758836, 913387, 6613192, 8216577, 2629724, 7141715, 3248686, 2040797, 5239232, 1623580, 910632, 6473947, 7940322, 1448641, 2932172, 94205, 7493708, 2260164, 1037335, 5032582, 477273, 288657, 5071811, 2631384, 5758634, 3533643, 6865833, 1398638, 4382113, 5470624, 7477147, 7936037, 3549929, 8006913, 4950040, 5646452, 6901556, 4072528, 3066133, 122771, 541035, 6819951, 4934516, 4551459, 720574, 3482922, 2309430, 8106825, 3597871, 3464823, 3719163, 1407583, 4285426, 6109346, 6386191, 8368359, 7608393, 1924720, 2375443, 692907, 7648058, 6331195, 7317307, 6310988, 4772310, 4018901, 1751447, 6729623, 5198018, 3467388, 4228679, 6589605, 4090885, 6299261, 4762524, 4929066, 4285843, 1881583, 2389425, 2429488, 3670158, 742214, 5785674, 224406, 5985872, 4051015, 5993823, 639603, 7557326, 2536152, 2646570, 6493977, 4372872, 6333943, 6832967, 6400284, 4828497, 6649248, 2652596, 8007723, 2404308, 577339, 3856360, 2845390, 3011523, 1639412, 1417702, 2934398, 5759393, 1105794, 2886195, 5635581, 4145214, 3315458, 6106268, 6717985, 7152069, 5963543, 1376444, 2265304, 4679100, 2818521, 6778761, 5607306, 2316390, 7749805, 869818, 6038158, 4062834, 3024923, 6205854, 7915890, 2677444, 1307516, 5833645, 6459749, 5019895, 802410, 5068440, 1150573, 7552588, 4979563, 1745931, 1910432, 6135083, 2716081, 583381, 1335479, 4785572, 2232106, 253235, 7701844, 4663751, 2472920, 808656, 1780139, 220881, 5679187, 3035313, 4716622, 5305164, 5711581, 7813096, 8243194, 6953912, 902893, 7401379, 7440812], -[4474896, 4722391, 6180897, 6280287, 2037038, 5107162, 6278816, 7589399, 6930077, 957143, 8355161, 5158778, 3521387, 5025420, 4261006, 6021016, 3710339, 191230, 4898440, 5863299, 6029252, 4198404, 7162157, 8316873, 6364484, 2702177, 5794409, 699899, 1216845, 7316031, 7442084, 8226279, 2009873, 5775912, 7311486, 8245002, 7734193, 725131, 2813960, 6044444, 1406757, 6774733, 7621783, 2208254, 3341288, 3990773, 226334, 4287753, 822114, 7576357, 1235942, 7225231, 6610407, 6099109, 4933308, 672769, 3331531, 534512, 1856972, 4369990, 1684471, 2937947, 4681177, 5827230, 5641934, 2759667, 4007077, 6357919, 867075, 186756, 1810596, 834236, 1126347, 432642, 3953168, 2003186, 1084847, 6606669, 7149238, 8341823, 4096944, 7900409, 7582853, 595491, 2913651, 5436769, 156269, 2525123, 6431742, 2252920, 7971854, 1639009, 3023811, 4725594, 7753850, 8334896, 3469142, 2137344, 7793830, 325075, 6664010, 5611838, 2014087, 6975196, 1170777, 887415, 5600757, 7623390, 7423082, 1686049, 2702235, 1306864, 2164242, 1792406, 144913, 8042231, 4043231, 380825, 5671743, 7082612, 3439337, 3081256, 6021914, 8366160, 470155, 1280676, 5512989, 5812505, 5927020, 7777265, 875627, 1258126, 1440059, 1879492, 4412110, 6609646, 5613935, 7170969, 3208758, 2135231, 1567351, 1568241, 5709423, 456809, 2339887, 4222682, 3885204, 6726206, 40294, 5788877, 1100038, 1873152, 5968505, 523868, 7173357, 5025070, 2249816, 6879492, 6337810, 5845489, 7051575, 3068352, 263407, 5847025, 2776530, 4425938, 2878976, 1724871, 139262, 4085457, 3338581, 2067505, 2861155, 5414965, 2808111, 4047635, 1613724, 5430023, 6908650, 4309313, 369754, 2807382, 973808, 6445580, 2653023, 5167561, 258758, 1034227, 794379, 3056509, 5951245, 1964801, 3394881, 3772938, 2697805, 452025, 507397, 316371, 4813406, 3841479, 7086520, 7737719, 5027912, 1368092, 994441, 2916937, 4237297, 2001662, 4423336, 6612780, 4667391, 115888, 4324195, 7821555, 4345692, 2167803, 4355099, 3589783, 2255557, 6114647, 8290377, 1743903, 6381871, 5101549, 3974661, 562582, 5077717, 4177983, 8246594, 3641036, 7397265, 2746167, 707052, 7464696, 2300622, 2321935, 6221014, 121263, 3506671, 1630329, 2903387, 3702138, 1724206, 5613111, 8290876, 4491886, 5330095, 4232934, 4195684, 1378505, 7026438, 771172, 96567, 5206398, 7408765, 5863762], -[2900346, 1633235, 3549223, 1453425, 7152029, 3804074, 2641893, 1738267, 3003324, 3959952, 2038930, 4924861, 7707748, 3334695, 1624148, 8071190, 206406, 4264411, 2725737, 3526139, 7671056, 8291972, 1367245, 5440578, 7068627, 611340, 5590983, 6445950, 6237562, 5671559, 174985, 810924, 5782940, 6482026, 6681171, 3927085, 4536013, 7414191, 7331708, 5294732, 7950249, 3346725, 3230662, 1141861, 3127161, 2145579, 3367218, 4124045, 3806570, 5063323, 5196163, 719210, 6475916, 7920760, 5386774, 7128733, 6963558, 7007070, 6619222, 2050017, 3143947, 5252839, 5672248, 8223042, 1595892, 1373203, 687353, 8198722, 5177036, 7663100, 7502427, 7693444, 2331752, 6917651, 4750306, 1074759, 3540794, 7716060, 2912831, 6617879, 6698260, 8340294, 3806887, 3990880, 3513081, 3054668, 6908366, 100317, 7674350, 5521087, 1654445, 5949840, 3754156, 7084693, 7778178, 4045773, 1752409, 7537371, 3420884, 470364, 4970759, 7050067, 5892269, 3539613, 5575127, 6037929, 2579871, 7294548, 869774, 7741291, 2916527, 5155070, 5076028, 4573817, 7014440, 7686481, 886577, 3266774, 6763784, 2500065, 4014184, 4240638, 4618358, 6079617, 276556, 6091646, 6589848, 1406571, 5805712, 901059, 3247186, 6308016, 498688, 858533, 6247468, 621655, 11987, 4121898, 5007556, 693399, 3559818, 3453484, 2532024, 8148944, 7436349, 6433048, 4395331, 4783050, 970083, 2229570, 199362, 1899566, 5789648, 3008149, 6076592, 4467526, 8024006, 1126493, 2632488, 2849370, 4729786, 761609, 5475335, 1423608, 17016, 6250641, 2006105, 2800120, 3010277, 4237980, 4536118, 2503426, 1224575, 1377103, 1199373, 2314509, 7923636, 6675662, 4318114, 2097232, 5961135, 1713808, 6649241, 5546966, 1290306, 4959612, 7849408, 1795558, 4302087, 1922087, 7675471, 6859063, 1500216, 5156113, 4257846, 3061451, 5253593, 5764390, 2204334, 3052425, 150429, 5499614, 6662618, 2199360, 1384739, 4786820, 2006645, 4024810, 1564422, 839737, 7361476, 4888576, 5404267, 5203458, 376589, 2307744, 1248037, 1663590, 5011151, 2081223, 6530154, 7840266, 3475918, 2645298, 275416, 5294279, 3994751, 7855559, 5831998, 5450169, 3283224, 5729510, 5223164, 6721684, 1705346, 1546404, 8224316, 3976916, 1419779, 8330295, 7180711, 4300111, 2800026, 514484, 158457, 3678386, 7455508, 6488634, 4138533, 8032821, 2796605, 5151620, 8353961, 7597488, 6600225, 5699150], -[6662428, 3109606, 5726169, 5583854, 5346348, 1681286, 1767476, 2330215, 494461, 7924711, 6890475, 4336201, 6272576, 5438380, 3506851, 3030972, 5207405, 3326210, 7687219, 3933649, 7142457, 6048280, 5374569, 2940732, 5967072, 5040558, 3527081, 1908928, 3888962, 2791235, 7590695, 7372060, 4602116, 4973994, 2566856, 4196271, 2293795, 706732, 4820249, 4137586, 6948830, 3985494, 6923268, 5712050, 3633543, 7079513, 5038591, 985134, 3172222, 6408138, 8044558, 2479179, 2350875, 1351036, 1721074, 5145959, 487414, 2818036, 2149850, 5101843, 5751351, 4338407, 1178839, 3958902, 6113551, 5174935, 320829, 7329614, 638754, 7788144, 4990071, 3836363, 3131237, 1049347, 7557993, 3950793, 7428125, 1060415, 598281, 6220651, 6092599, 5590344, 8370192, 7406563, 3887265, 3517549, 1393070, 1640268, 6701423, 7001744, 5513137, 7889576, 5172993, 577931, 7055308, 281744, 6897147, 6867988, 2328953, 1219470, 1074806, 7734103, 2013284, 4502289, 4913368, 802696, 7521020, 1326243, 5694671, 6040038, 4340641, 3890965, 4504650, 2709814, 7611025, 1219391, 1373418, 1114293, 6045175, 1336789, 5030784, 4843569, 2119899, 3292633, 4877527, 6877052, 6869348, 463449, 5918460, 5936224, 6970743, 3426879, 6879659, 936302, 6835210, 5149656, 449795, 324396, 4858729, 6168812, 5460323, 5324217, 1590601, 1850558, 1035984, 6331114, 7672570, 2576774, 3102747, 6976930, 4086246, 5217042, 5456186, 3419824, 4570539, 2409418, 4133690, 2980277, 5057067, 2489185, 3418353, 2004521, 4650427, 5473820, 107071, 1810064, 7167391, 7401995, 8366485, 603617, 1611752, 7198869, 1641536, 1422659, 4741905, 3289259, 1072565, 7444295, 207736, 1597160, 2163120, 3605486, 8077958, 6043999, 5392701, 2616382, 2740919, 5946397, 6679695, 1616105, 3573331, 6143356, 7181589, 3876913, 7078646, 3305353, 7790595, 4858875, 1359807, 5159939, 671924, 6622757, 3853580, 6750703, 7190616, 2242413, 4949692, 995145, 3998447, 3705987, 6155058, 2305455, 6224955, 311752, 4392372, 5307845, 1493036, 8007973, 4217956, 7608910, 3489175, 1798314, 7046382, 7216759, 7964664, 2511691, 214299, 4033357, 8007375, 8372012, 2725310, 6471794, 5788177, 6213912, 2506293, 5697471, 6063502, 1917566, 2987276, 1680129, 1564352, 673379, 4131801, 3773193, 3570842, 6337699, 4565425, 214279, 3858912, 4239692, 868492, 6231548, 4328780, 466063, 8252955, 2189867], -[564921, 4529382, 117171, 1981, 1063286, 4786542, 4951541, 2584846, 2850869, 4156202, 502826, 6939001, 6483421, 117982, 7974683, 2075047, 2822159, 4196778, 1204541, 5550076, 8144561, 1177996, 1675552, 4402322, 749199, 3110311, 2126819, 6581, 3620819, 1559842, 4332940, 6641446, 2995763, 346906, 2697032, 6008288, 1935848, 5634090, 2951390, 3737766, 2439566, 1052877, 1556865, 3203974, 6180913, 6032070, 3069766, 6699812, 1790525, 3115783, 2752761, 7672068, 641231, 2191429, 2444582, 3685512, 2381656, 1091475, 6715531, 1404036, 2747766, 2548424, 1148512, 5478627, 4885724, 4550609, 5500126, 5279604, 1138397, 7753110, 4881841, 4018601, 1696529, 2492336, 5612503, 7112741, 4950362, 7569069, 2307263, 6386480, 2022739, 1937255, 2921267, 8145334, 5456586, 6640345, 5140239, 1649799, 2746792, 3791243, 6236244, 449369, 6944455, 4224132, 5130813, 4387788, 135488, 1696925, 2357707, 8215208, 1040301, 982624, 6581198, 39683, 5902478, 1489911, 6149474, 2339135, 5586020, 1689366, 8247267, 1269121, 7004054, 5093369, 999860, 6202677, 8173739, 7824350, 1732414, 1477122, 1217211, 7866960, 1582247, 1242107, 6344016, 167300, 5365465, 3441025, 4368913, 7575348, 1949485, 8242618, 8231606, 4707662, 7310572, 2371908, 5597614, 6838706, 3283765, 694612, 1080879, 6542247, 7967752, 2566178, 8306585, 8093129, 791135, 1956786, 5089416, 6992529, 4980871, 5344310, 4767941, 5058590, 1439488, 4271284, 5619432, 3366618, 4391745, 6165091, 4012684, 3462434, 4598806, 2817460, 979801, 820896, 2112612, 1069, 6790718, 3846635, 3475495, 7905854, 2618418, 2496054, 6513734, 2621178, 5661386, 4241941, 1716011, 6955991, 2051821, 7312506, 7160183, 1457211, 7283511, 1366154, 3404263, 5254324, 2221809, 6927115, 5586205, 3832291, 351131, 1096646, 1910566, 3147125, 3297425, 927817, 2756632, 6464315, 6704177, 5842806, 6234176, 7511538, 3833717, 7928712, 2850316, 5945246, 3630051, 2248269, 4735099, 5535957, 3898089, 6729253, 5800210, 3935446, 6111021, 6450172, 7722748, 57338, 3031184, 7531094, 7334669, 3059576, 493330, 2145848, 2683003, 6579559, 6496812, 3305570, 8009841, 1942880, 3397164, 1822560, 2994181, 8180296, 4553365, 7410334, 395623, 5025768, 7846910, 3096411, 2367022, 4301761, 3194944, 8014143, 2839264, 6558644, 1635516, 8114441, 6756209, 4199646, 4104937, 6425572, 4994654, 6432772]] -w = NTTInverse(aHat * NTT(y)): [[8082295, 4558021, 1491014, 332890, 2387320, 441072, 4232300, 1897976, 3860210, 1332958, 8166527, 5311251, 855473, 2494006, 5425522, 6176811, 7338411, 2004829, 7287722, 1284308, 6105170, 3562828, 1400725, 4619518, 775275, 2127563, 5808395, 604951, 1919156, 7422382, 6838134, 2435521, 3816290, 900395, 1307905, 5674484, 7057861, 5901164, 3196470, 3739859, 5810287, 7982922, 1204054, 188698, 7973240, 2853174, 8157609, 746989, 1223242, 5151698, 5811167, 5665380, 7488194, 5252884, 4003030, 6408385, 6207408, 5104704, 6416462, 2591570, 191450, 2735460, 8118246, 835904, 8070287, 3104410, 442681, 6679198, 4298676, 1144923, 4687638, 315512, 5497582, 1939451, 2524110, 4481611, 3875834, 7532641, 1178411, 4346268, 3194161, 6346568, 2820541, 7609199, 8119369, 7429367, 4945172, 8028520, 5678854, 3294584, 1975236, 4954019, 4537150, 1291753, 6158495, 261771, 7154056, 6673933, 2020316, 4119083, 7480019, 4298371, 1396660, 6901523, 4976814, 3271815, 5673605, 4423950, 2132792, 5484829, 6192031, 992775, 8100587, 6439524, 8057073, 7260410, 1710374, 2140123, 5190044, 977980, 6900632, 4041371, 1521224, 1851343, 1479136, 866082, 8277514, 2919052, 7595323, 2117261, 7054237, 578501, 8309380, 989284, 7164674, 4684811, 858345, 1247954, 1730521, 7797587, 5463225, 5879390, 3222418, 5298701, 4862976, 7378648, 8025199, 4528951, 3770479, 3374426, 7946224, 6191138, 2789750, 4699581, 2389211, 5700380, 2147305, 3035395, 6033363, 43694, 8228183, 849944, 7007308, 2929161, 4865754, 7611869, 1107701, 6128731, 3582588, 529562, 5165776, 5602602, 5370407, 3523446, 747820, 3523891, 2893108, 6352839, 749386, 6838313, 5917051, 7718115, 7089887, 347801, 6443933, 1617754, 13345, 3150650, 1370084, 3941894, 7408817, 407067, 1027092, 5441536, 4014492, 3466498, 1035461, 4766446, 2893010, 7379741, 4393507, 2106889, 2254185, 2896935, 1843885, 3201391, 6861496, 3647816, 6423683, 967471, 7028575, 315150, 1737067, 2976401, 209111, 2206534, 192611, 278728, 6003015, 5905015, 7553585, 6419486, 1129295, 1336909, 3401300, 2803853, 8354119, 5141839, 5560603, 1368959, 1985482, 7246537, 203280, 7732305, 4436369, 1766398, 971892, 715237, 7429180, 6417055, 5416729, 2688517, 7897161, 4899085, 2561129, 5281357, 4360904, 2057909, 1527030, 4019252, 481930, 664649, 609762, 5414998, 4900435, 416798], -[4314496, 280514, 1030516, 5936513, 8288859, 2417243, 76298, 5920524, 2863139, 4578535, 3034225, 2466980, 2055103, 7800993, 3587966, 506406, 2684454, 379143, 4755626, 4472209, 5021460, 5911630, 7476473, 4878114, 6201670, 1665473, 5625466, 6340073, 3475053, 925174, 4994590, 6527114, 1102880, 6538078, 157739, 4088396, 6648821, 4026046, 6590814, 4713999, 1127476, 3175062, 3425985, 6866629, 5161212, 2331666, 1632106, 2899213, 737837, 6371941, 7664834, 1234202, 7720941, 1605780, 2063070, 268100, 3403560, 6353768, 4555374, 1267812, 7577157, 7059192, 272114, 7734971, 4071919, 3986496, 3520001, 5265368, 5808484, 7148085, 6537231, 8358392, 1466666, 5941626, 4994019, 5901653, 3364035, 6249234, 6800916, 748173, 255632, 3313412, 531870, 2466683, 2306435, 3904842, 6307614, 4139816, 6563392, 5648102, 367898, 2932262, 6340794, 6044376, 2220886, 6501724, 7079195, 7471050, 5633892, 7886035, 5306592, 4496320, 5784808, 5828813, 6130598, 7628360, 8042357, 3288812, 5094881, 1180797, 913763, 7396474, 1920444, 7452550, 1203906, 6974465, 1906363, 4376657, 1327934, 1429115, 7763223, 2411820, 5405453, 2746269, 6477570, 616598, 7123510, 2752670, 557979, 5546297, 7302955, 2585132, 213981, 3762894, 2122613, 6473112, 5342010, 77782, 639338, 7601681, 2307698, 7945631, 7754362, 3683224, 2173214, 283569, 1930096, 3660078, 1090883, 6809063, 4025406, 1858741, 4216321, 4244295, 2038442, 6105539, 2579817, 3619368, 4762354, 7024189, 8132719, 6951082, 5873492, 4228334, 5666442, 3141181, 2730108, 7164098, 7447735, 3568063, 4811060, 5214397, 5693963, 2315467, 7763112, 2052612, 3746666, 6944991, 7088036, 6243405, 709419, 6421737, 1565982, 7689714, 6428925, 622739, 2572701, 1072011, 7063150, 3769594, 7727205, 3394607, 7342157, 1227828, 7246436, 3675272, 7609953, 6130876, 1626574, 1195122, 2480804, 2401179, 2159363, 3940674, 6035213, 5654742, 5361668, 6087921, 6318034, 7470375, 6368333, 1572923, 279057, 3393595, 3669278, 3974120, 2995823, 3519032, 1655918, 3411804, 2457206, 2279502, 2571413, 3890401, 1258973, 4432999, 4709439, 7179277, 4911719, 5617255, 4081672, 444039, 1172598, 2017445, 897648, 872598, 1052354, 2003406, 709365, 469997, 8011150, 8007354, 3868693, 3114326, 7777812, 7323175, 3416044, 3657506, 2557722, 2730418, 6144152, 99630, 5358436, 5127038, 2119768, 5339421], -[4639444, 2685286, 7297708, 1314538, 6455447, 4717314, 6617269, 4058553, 6856689, 3687912, 1246819, 7038456, 3167092, 268301, 754409, 315022, 2329937, 4212220, 8291930, 168029, 5105105, 3921988, 1273994, 7492220, 210356, 777683, 3744129, 4302348, 561139, 1656186, 7675043, 5195531, 7536904, 8336423, 4007393, 2660406, 6157245, 7395227, 6468202, 2628411, 3439270, 5093536, 3903436, 5257634, 8249262, 6093718, 2726731, 6761028, 5589171, 1711624, 3479091, 3268393, 2883026, 5033365, 6904904, 8013652, 8277540, 556839, 3740892, 3219109, 8244145, 127494, 3861172, 3559434, 5447881, 7438323, 6359885, 6733145, 7128181, 5791053, 4255231, 6003001, 1681079, 3002655, 3647522, 2087393, 2253013, 8072814, 5082030, 3861739, 2455564, 6186370, 7938979, 5307290, 2255898, 2466706, 2664579, 5017556, 8207442, 4524437, 1657703, 3661955, 2945749, 1397870, 1182813, 1176784, 1784894, 3230125, 3454841, 1083185, 1757034, 5536021, 7272580, 3388615, 8122415, 7474464, 3688051, 4375341, 6352828, 500133, 4590284, 5000277, 1880794, 969217, 3392779, 6087396, 5737542, 5992848, 4714644, 5219364, 3156771, 2024990, 540458, 438197, 193562, 3852122, 1844685, 5762375, 2659753, 5727507, 6902931, 4373427, 3603998, 8298133, 5045744, 5734361, 2251642, 4562777, 4595494, 1659114, 1983725, 1366684, 7239767, 6692107, 2730923, 5759602, 67944, 4785047, 4491703, 4033354, 5854424, 1311835, 2744297, 2972529, 1221261, 3819000, 6756784, 5216512, 6970174, 3477135, 36722, 2149410, 6245463, 5297839, 5900045, 6934651, 3585179, 2536415, 6202206, 613107, 1606566, 139610, 1615903, 171949, 6760205, 2219874, 2881937, 3198245, 2042395, 74167, 4447203, 3113778, 3318777, 2409140, 5018961, 676699, 516149, 1873999, 6886580, 3828860, 5528688, 7209391, 642890, 4874190, 4003064, 181596, 1951915, 5840336, 6388217, 3978807, 1058770, 8158765, 4858112, 4807667, 1420074, 4597970, 3790515, 459682, 1460365, 6764839, 2858493, 5054511, 413069, 6049396, 4742309, 6249575, 1050836, 5719901, 2780850, 883542, 4132677, 108715, 7435998, 7968434, 5631402, 6348922, 2694025, 8190344, 5142380, 1128925, 3883455, 4886041, 6205089, 4972192, 680910, 4183768, 7917029, 5409992, 2951215, 7580637, 4676006, 2553926, 8331073, 3548897, 5351047, 1377514, 1004527, 2346578, 5904110, 3298229, 8231524, 1280789, 4174361, 4710398, 5783581, 2250509], -[6335808, 7332057, 3366781, 1622278, 3046777, 5149424, 7948782, 1642067, 8177351, 4061088, 1459014, 6142844, 1124292, 1179424, 6285796, 7284029, 2200527, 6317695, 1898394, 750242, 2448935, 7828297, 2192975, 7748585, 902461, 1504507, 3504143, 7709124, 6907353, 5665008, 4542466, 4166470, 40651, 4726253, 4076098, 1452656, 2639751, 975782, 3299426, 3618422, 2044109, 9154, 1405347, 1437670, 3797292, 3470952, 3672277, 1941604, 4227891, 2404432, 2380069, 6639538, 1500744, 7428106, 4969979, 6216150, 836577, 4114118, 178286, 3391793, 5062471, 3142898, 1637821, 7503829, 6853270, 7903135, 1972663, 4308711, 5819142, 5379612, 7784858, 1450762, 2952306, 2582508, 2051220, 610535, 6805882, 4955670, 7940127, 1446379, 3357819, 4645761, 4812986, 7083586, 6248722, 1087620, 5120630, 3300939, 6073420, 2226045, 5298110, 2574085, 6474141, 1737275, 3246187, 446937, 7493220, 3120194, 7391582, 1665655, 1437966, 8136113, 2478011, 6738892, 5284979, 8067090, 1017243, 3688689, 6813611, 5832012, 5144368, 5903062, 4594871, 2480202, 2414292, 7015822, 4650376, 121816, 2198670, 7311786, 7985000, 7716369, 5600507, 4804597, 7814945, 4710547, 3341775, 3218805, 4844542, 7599280, 4585188, 1843007, 5138641, 6802571, 390800, 1655965, 4748926, 8262464, 4749357, 5480917, 3071400, 3457965, 2818627, 7693707, 534132, 2396544, 2440197, 3677352, 7106066, 5581041, 1144399, 275987, 7278775, 6675288, 5358679, 7454780, 3618093, 1581161, 11599, 5915478, 2210842, 2723050, 2051713, 2584908, 4743200, 7693970, 7101835, 1083614, 7677217, 6759639, 2883229, 6209471, 1799610, 6534369, 3868614, 206754, 3620843, 2883038, 7406667, 4737833, 1106784, 5198611, 4464087, 1833853, 7064084, 5210112, 5470029, 3727, 231763, 5092063, 7412545, 2671580, 7118873, 6932674, 1907619, 1405042, 7096473, 4560043, 6452272, 7504558, 5727050, 4468124, 6394349, 1112074, 917521, 6211870, 6743358, 8145231, 2889924, 6573712, 7159715, 5113027, 4860150, 5031012, 6607750, 4286717, 5410888, 171086, 915741, 4255326, 958569, 3108442, 1413842, 6793265, 5225922, 5303680, 1312540, 2840465, 2173377, 3645741, 640245, 5040598, 5970927, 7593419, 4778645, 5840646, 4910298, 6955973, 1164114, 7377937, 3923648, 2701314, 3934325, 1704788, 1226611, 8177364, 5798785, 1758250, 4383714, 4372156, 6764627, 6769427, 6718647, 2425634, 4558137, 3869929], -[1254442, 5747442, 2605370, 1066467, 1489044, 120592, 6777424, 4180104, 6599296, 3073144, 6957554, 3285562, 1972365, 746921, 1863121, 8124751, 5355671, 5295709, 7285801, 6213069, 7821876, 6749814, 1978675, 6726327, 624144, 3717095, 2632719, 6072384, 2965530, 3347510, 1243126, 4656494, 6194945, 2994869, 3972941, 450179, 6148349, 2933789, 3065127, 1557166, 5599606, 1092736, 7199548, 5169317, 7852837, 7922748, 2465981, 2476022, 7951800, 6930930, 3316727, 3689559, 1081846, 2997150, 4431228, 7970963, 2362177, 5328318, 3466066, 4989704, 2037492, 1245239, 3944741, 2785748, 2574552, 7482269, 3779874, 5333498, 5898005, 7109922, 7792708, 3485963, 2348588, 3438828, 5310600, 6073897, 1419109, 5970968, 2508943, 5065228, 1050018, 3846883, 6058513, 6493125, 2318972, 927275, 4911093, 770282, 5886727, 3336372, 384465, 8088992, 398256, 3910905, 4192366, 1520367, 5122053, 5966806, 7255443, 3251276, 7115682, 2697764, 2830659, 1985087, 7140272, 2328185, 7697743, 4366936, 1097326, 5519351, 2840189, 6092025, 2253520, 5227658, 6095728, 4216350, 3192621, 4579117, 7061244, 5697088, 7861795, 5807009, 2046944, 3066098, 1765894, 2169003, 8376789, 2897130, 4686698, 3476541, 8151649, 4225731, 2005133, 5398155, 465475, 3563660, 3977631, 4390829, 1080854, 5604740, 5759716, 3902778, 258282, 7687795, 5846803, 1554687, 1584301, 4438582, 4797000, 20132, 2894771, 4422000, 3319977, 5945686, 1516582, 7063001, 7653382, 876606, 1732063, 7719946, 1732515, 1383617, 3958855, 3090206, 4682318, 1939547, 7020798, 6009736, 7330097, 8001354, 2796786, 6242539, 3596721, 4403085, 589440, 7328003, 5259185, 1875255, 3420954, 7677387, 8311156, 6940483, 8359095, 743479, 8175338, 5195736, 3065162, 1306193, 7334486, 899281, 7335388, 6940242, 5032744, 8275559, 1422044, 2295451, 572135, 4378259, 2859798, 8294650, 6929929, 5703103, 6028962, 3228459, 3100809, 5881776, 1507734, 2662233, 159820, 4106398, 4809534, 2234295, 6634241, 2475386, 7036562, 6753424, 5771049, 5945717, 6272871, 784745, 1767969, 8343272, 430980, 6705887, 7865030, 7690438, 4202179, 2825939, 4980224, 5738064, 1469679, 969685, 4164585, 7837454, 3177552, 4593786, 8273943, 968028, 3448143, 7687640, 444586, 7513885, 2469989, 4962644, 6947943, 7139034, 6755704, 1939267, 1934192, 4042999, 3113375, 488624, 4888487, 7943412, 5573809, 1236035], -[7123951, 6597879, 6624195, 2988091, 1983435, 3685791, 34358, 4888657, 2634193, 6746086, 7121192, 1694288, 1907580, 2402712, 1808802, 6784903, 6807856, 137240, 6595055, 4778537, 1745095, 6006395, 5820922, 7468522, 4936081, 3084949, 6005318, 6967762, 7838538, 3276166, 7416359, 7907532, 7469911, 3512701, 7942109, 6076947, 8087350, 5265535, 195492, 2969004, 8114887, 563155, 1053014, 8070043, 4699892, 7902121, 1838386, 5971021, 583640, 1762506, 2961384, 3046135, 1824090, 6795420, 1602642, 1373898, 490108, 5772839, 5035656, 2910327, 7019831, 6263207, 2365922, 863571, 4688693, 7793006, 233546, 3753106, 7416461, 7403946, 5214336, 959404, 1057219, 5569323, 4956940, 5477363, 1798314, 7011669, 1411367, 4946478, 1558068, 246426, 4625373, 5156494, 1434841, 6729558, 266576, 3169576, 2874437, 6624672, 8200449, 2440039, 4437214, 511423, 7778632, 8283177, 2010035, 656728, 4460365, 97634, 2814805, 2566633, 4839539, 5018315, 4923926, 1676866, 5284254, 4456380, 5029457, 5467065, 4144411, 1391421, 7354283, 582307, 1576025, 789457, 8375347, 4371791, 6863029, 3919302, 1229491, 7065540, 5288302, 5467257, 4973745, 7921558, 7729805, 4695066, 3821837, 3247831, 6383686, 246021, 2950528, 5561044, 1823227, 1479493, 1961945, 5933871, 1020716, 2742337, 4299517, 7359308, 3971956, 7613265, 7078407, 5267323, 6050630, 6460904, 6645603, 6327907, 622816, 3957889, 5363871, 110077, 7489773, 871116, 5338979, 5890410, 2929799, 2500982, 7059678, 8161214, 7818056, 7672997, 6944946, 5048940, 1153582, 970124, 5301011, 7631051, 6317436, 7407661, 5526495, 3515243, 7547201, 3407038, 7666475, 7424177, 2303565, 7789589, 6327894, 2393870, 7005387, 8174221, 7343947, 6204709, 79264, 1457393, 2840799, 3403868, 900749, 8263796, 7960984, 8171228, 1020617, 2956889, 1498340, 1672914, 7990555, 2606445, 8378439, 7378435, 400057, 7693869, 5715631, 4902343, 4697756, 15043, 6371444, 3612939, 4712107, 4980513, 3713326, 1086023, 4100187, 1761461, 2389464, 6958369, 4201145, 2725522, 7774889, 8111670, 1619666, 4990963, 2270146, 7918043, 7350783, 8080064, 4618065, 4981138, 5365894, 7810251, 5799341, 899698, 7084870, 7760859, 1315509, 1516055, 3696027, 1483184, 3514948, 3144433, 1397066, 4205653, 317007, 52345, 6525451, 4004505, 4621598, 4920577, 2086096, 4947577, 7037846, 8077416, 5037895, 2724109], -[8132562, 4491608, 5536398, 1050896, 842724, 863206, 6063034, 6584002, 8230116, 5461772, 5109965, 6350075, 5989249, 7936185, 3610723, 4716122, 656763, 4278824, 7955464, 2006949, 6461064, 6802097, 3886603, 6968610, 5479552, 2985816, 1864138, 2015942, 1771464, 6465898, 3119424, 4224330, 5883206, 7037700, 4607843, 570739, 7200475, 1034557, 5616984, 7627635, 7384664, 2912934, 4686101, 5505111, 3140951, 3763168, 1672044, 7413632, 5290517, 4426618, 7544283, 5382571, 5210986, 5301770, 3702243, 1261232, 1552584, 6894492, 3690887, 8309157, 3782066, 6200131, 2070481, 5015503, 7838528, 5414799, 7906715, 8222477, 893046, 8359279, 3526653, 4657435, 3134628, 5203699, 99824, 1554231, 991703, 6118348, 90676, 3973954, 6454381, 3825234, 583729, 5069514, 5910108, 1597056, 4967436, 3274333, 1414465, 108713, 826258, 5231110, 7065864, 8241636, 8005985, 5796634, 7043914, 967271, 5214626, 3594158, 193542, 3243789, 300424, 6076524, 5760547, 980522, 2896402, 719116, 7904037, 7181778, 4509891, 6051705, 70950, 3550108, 6879472, 2120766, 4275524, 3255835, 1430400, 1051472, 6825533, 2226138, 7111492, 1861319, 315749, 5533375, 2386657, 3501782, 2057739, 2397760, 320241, 6476765, 1490431, 7134764, 1102264, 8027750, 614821, 3352252, 1454059, 4916669, 2674398, 1364612, 2725667, 6631485, 7224374, 8229622, 5405987, 4850166, 617044, 1897288, 5672061, 5408836, 4827180, 3558431, 6760464, 4760374, 7033440, 2523616, 4013519, 1929356, 7449993, 7764578, 5341774, 1934280, 3600313, 2332901, 4697088, 553570, 6266479, 1796248, 7235559, 4626745, 6725039, 7813237, 1618103, 1566984, 4839009, 988560, 2546919, 5912461, 1790013, 5314076, 1440757, 6062267, 6109558, 2986233, 7731074, 4678425, 3859303, 4350102, 6934034, 1516843, 2758723, 3485250, 2301739, 4352764, 7567243, 6110483, 1399925, 1734440, 3128474, 8040659, 7991008, 8228644, 7690226, 3565283, 2988889, 1274302, 4054440, 5562012, 32888, 1149842, 5561076, 4205760, 3316046, 6129649, 523241, 1299594, 3190569, 3075710, 6966994, 7106665, 7343854, 2561621, 5171900, 8367846, 5668844, 7068577, 1079146, 2862475, 7105568, 1523260, 3792547, 5833824, 1670496, 4723873, 4058194, 401378, 8146110, 1905754, 451689, 2631760, 7372889, 2226820, 8237199, 2722399, 194536, 717877, 1550699, 5879921, 1251050, 5907794, 241654, 4746318, 3386424, 5170646], -[2176284, 1773997, 7612141, 7136419, 2811950, 5686109, 756371, 1528655, 1853576, 1360817, 3154900, 1743676, 8104988, 2074105, 4476636, 3781430, 4214477, 8129143, 4247057, 5841221, 7756192, 3542437, 5036228, 7641835, 6769136, 3130833, 8177354, 6351279, 4568216, 1369382, 1615512, 7217581, 1671996, 892967, 3696805, 1389161, 6946845, 914804, 2691076, 3156142, 6197421, 3442987, 6196463, 7094793, 3636910, 5048746, 3610443, 4919791, 7759982, 597844, 1570332, 6048486, 3659398, 2375710, 823916, 1010124, 5394992, 5924144, 3045646, 652503, 8201605, 7699117, 3689166, 3995062, 2791511, 4234248, 860096, 6331010, 6500045, 698691, 1414007, 8335740, 4537936, 593047, 4434402, 4498155, 2816221, 2197830, 7055294, 1733162, 3126586, 1804407, 4476539, 5019262, 2401792, 7559250, 3337006, 5812675, 1192935, 3000922, 7476698, 7468044, 2757837, 7942249, 2863087, 428655, 3625465, 1581312, 4616253, 1953776, 7243334, 5226453, 720852, 6881329, 4094656, 6293263, 1930407, 4758510, 6899854, 4888400, 6779213, 3670391, 5793527, 6602267, 3221237, 1584538, 7475278, 473532, 3020467, 5179289, 4508194, 5685429, 5065372, 2176776, 7151328, 68732, 1403708, 439829, 5423888, 1468817, 2510296, 1677555, 6059525, 2092942, 3087899, 5744266, 6472954, 5502190, 5977, 6207749, 5751152, 595141, 3426013, 4344973, 6110109, 7338778, 3164429, 761097, 456506, 759757, 7207388, 6803045, 7414043, 6865136, 8324982, 4125097, 1139844, 572963, 8168936, 1445822, 3632395, 1823721, 6356495, 5262178, 2747180, 5758033, 1379452, 7654630, 388389, 6366780, 2240602, 3036901, 3734498, 3926868, 664091, 3177317, 6470605, 3726083, 1959366, 6269388, 6639790, 5689555, 6725064, 4096447, 4839441, 359052, 2469621, 192568, 2360784, 1284321, 7601334, 3101155, 2064123, 1267757, 898228, 6139365, 5222083, 1050985, 7173431, 2741712, 7583633, 5942287, 1639208, 6312963, 7271690, 5663205, 1658562, 7311792, 6415669, 7265483, 555361, 1362612, 4207151, 4819029, 495397, 7848118, 2260059, 7768915, 1855136, 5698552, 2669035, 2295409, 6515418, 1936661, 4025757, 8052114, 4314097, 2453619, 6504955, 2763190, 1964990, 6302335, 6954887, 7501978, 3955968, 938842, 3826417, 5364808, 5435712, 3107097, 3045901, 6871384, 1376666, 1526018, 8122125, 4806916, 811801, 5666954, 7162153, 7831041, 3427407, 2761985, 1234915, 3169799, 5129680, 5045920]] - -w1: [[15, 9, 3, 1, 5, 1, 8, 4, 7, 3, 0, 10, 2, 5, 10, 12, 14, 4, 14, 2, 12, 7, 3, 9, 1, 4, 11, 1, 4, 14, 13, 5, 7, 2, 2, 11, 13, 11, 6, 7, 11, 15, 2, 0, 15, 5, 0, 1, 2, 10, 11, 11, 14, 10, 8, 12, 12, 10, 12, 5, 0, 5, 15, 2, 15, 6, 1, 13, 8, 2, 9, 1, 10, 4, 5, 9, 7, 14, 2, 8, 6, 12, 5, 15, 0, 14, 9, 15, 11, 6, 4, 9, 9, 2, 12, 0, 14, 13, 4, 8, 14, 8, 3, 13, 10, 6, 11, 8, 4, 10, 12, 2, 15, 12, 15, 14, 3, 4, 10, 2, 13, 8, 3, 4, 3, 2, 0, 6, 15, 4, 13, 1, 0, 2, 14, 9, 2, 2, 3, 15, 10, 11, 6, 10, 9, 14, 15, 9, 7, 6, 15, 12, 5, 9, 5, 11, 4, 6, 12, 0, 0, 2, 13, 6, 9, 15, 2, 12, 7, 1, 10, 11, 10, 7, 1, 7, 6, 12, 1, 13, 11, 15, 14, 1, 12, 3, 0, 6, 3, 8, 14, 1, 2, 10, 8, 7, 2, 9, 6, 14, 8, 4, 4, 6, 4, 6, 13, 7, 12, 2, 13, 1, 3, 6, 0, 4, 0, 1, 11, 11, 14, 12, 2, 3, 6, 5, 0, 10, 11, 3, 4, 14, 0, 15, 8, 3, 2, 1, 14, 12, 10, 5, 15, 9, 5, 10, 8, 4, 3, 8, 1, 1, 1, 10, 9, 1], -[8, 1, 2, 11, 0, 5, 0, 11, 5, 9, 6, 5, 4, 15, 7, 1, 5, 1, 9, 9, 10, 11, 14, 9, 12, 3, 11, 12, 7, 2, 10, 12, 2, 12, 0, 8, 13, 8, 13, 9, 2, 6, 7, 13, 10, 4, 3, 6, 1, 12, 15, 2, 15, 3, 4, 1, 6, 12, 9, 2, 14, 13, 1, 15, 8, 8, 7, 10, 11, 14, 12, 0, 3, 11, 10, 11, 6, 12, 13, 1, 0, 6, 1, 5, 4, 7, 12, 8, 13, 11, 1, 6, 12, 12, 4, 12, 14, 14, 11, 15, 10, 9, 11, 11, 12, 15, 15, 6, 10, 2, 2, 14, 4, 14, 2, 13, 4, 8, 3, 3, 15, 5, 10, 5, 12, 1, 14, 5, 1, 11, 14, 5, 0, 7, 4, 12, 10, 0, 1, 15, 4, 15, 15, 7, 4, 1, 4, 7, 2, 13, 8, 4, 8, 8, 4, 12, 5, 7, 9, 13, 0, 13, 11, 8, 11, 6, 5, 14, 14, 7, 9, 10, 11, 4, 15, 4, 7, 13, 14, 12, 1, 12, 3, 15, 12, 1, 5, 2, 13, 7, 15, 6, 14, 2, 14, 7, 15, 12, 3, 2, 5, 5, 4, 8, 12, 11, 10, 12, 12, 14, 12, 3, 1, 6, 7, 8, 6, 7, 3, 7, 5, 4, 5, 7, 2, 8, 9, 14, 9, 11, 8, 1, 2, 4, 2, 2, 2, 4, 1, 1, 15, 15, 7, 6, 15, 14, 7, 7, 5, 5, 12, 0, 10, 10, 4, 10], -[9, 5, 14, 3, 12, 9, 13, 8, 13, 7, 2, 13, 6, 1, 1, 1, 4, 8, 0, 0, 10, 7, 2, 14, 0, 1, 7, 8, 1, 3, 15, 10, 14, 0, 8, 5, 12, 14, 12, 5, 7, 10, 7, 10, 0, 12, 5, 13, 11, 3, 7, 6, 6, 10, 13, 15, 0, 1, 7, 6, 0, 0, 7, 7, 10, 14, 12, 13, 14, 11, 8, 11, 3, 6, 7, 4, 4, 15, 10, 7, 5, 12, 15, 10, 4, 5, 5, 10, 0, 9, 3, 7, 6, 3, 2, 2, 3, 6, 7, 2, 3, 11, 14, 6, 0, 14, 7, 8, 12, 1, 9, 10, 4, 2, 6, 12, 11, 11, 9, 10, 6, 4, 1, 1, 0, 7, 4, 11, 5, 11, 13, 8, 7, 0, 10, 11, 4, 9, 9, 3, 4, 3, 14, 13, 5, 11, 0, 9, 9, 8, 11, 3, 5, 6, 2, 7, 13, 10, 13, 7, 0, 4, 12, 10, 11, 13, 7, 5, 12, 1, 3, 0, 3, 0, 13, 4, 6, 6, 4, 0, 8, 6, 6, 5, 10, 1, 1, 4, 13, 7, 11, 14, 1, 9, 8, 0, 4, 11, 12, 8, 2, 0, 9, 9, 3, 9, 7, 1, 3, 13, 5, 10, 1, 12, 9, 12, 2, 11, 5, 2, 8, 0, 14, 15, 11, 12, 5, 0, 10, 2, 7, 9, 12, 9, 1, 8, 15, 10, 6, 14, 9, 5, 0, 7, 10, 3, 2, 4, 11, 6, 0, 2, 8, 9, 11, 4], -[12, 14, 6, 3, 6, 10, 15, 3, 0, 8, 3, 12, 2, 2, 12, 14, 4, 12, 4, 1, 5, 15, 4, 15, 2, 3, 7, 15, 13, 11, 9, 8, 0, 9, 8, 3, 5, 2, 6, 7, 4, 0, 3, 3, 7, 7, 7, 4, 8, 5, 5, 13, 3, 14, 9, 12, 2, 8, 0, 6, 10, 6, 3, 14, 13, 15, 4, 8, 11, 10, 15, 3, 6, 5, 4, 1, 13, 9, 15, 3, 6, 9, 9, 14, 12, 2, 10, 6, 12, 4, 10, 5, 12, 3, 6, 1, 14, 6, 14, 3, 3, 0, 5, 13, 10, 15, 2, 7, 13, 11, 10, 11, 9, 5, 5, 13, 9, 0, 4, 14, 15, 15, 11, 9, 15, 9, 6, 6, 9, 15, 9, 4, 10, 13, 1, 3, 9, 0, 9, 10, 6, 7, 5, 15, 1, 5, 5, 7, 14, 11, 2, 1, 14, 13, 10, 14, 7, 3, 0, 11, 4, 5, 4, 5, 9, 15, 14, 2, 15, 13, 6, 12, 3, 12, 7, 0, 7, 6, 14, 9, 2, 10, 9, 4, 13, 10, 10, 0, 0, 10, 14, 5, 14, 13, 4, 3, 14, 9, 12, 14, 11, 9, 12, 2, 2, 12, 13, 0, 6, 13, 14, 10, 9, 10, 13, 8, 10, 0, 2, 8, 2, 6, 3, 13, 10, 10, 3, 5, 4, 7, 1, 10, 11, 14, 9, 11, 9, 13, 2, 14, 7, 5, 8, 3, 2, 0, 11, 3, 8, 8, 13, 13, 13, 5, 9, 7], -[2, 11, 5, 2, 3, 0, 13, 8, 13, 6, 13, 6, 4, 1, 4, 0, 10, 10, 14, 12, 15, 13, 4, 13, 1, 7, 5, 12, 6, 6, 2, 9, 12, 6, 8, 1, 12, 6, 6, 3, 11, 2, 14, 10, 15, 15, 5, 5, 15, 13, 6, 7, 2, 6, 8, 15, 5, 10, 7, 10, 4, 2, 8, 5, 5, 14, 7, 10, 11, 14, 15, 7, 4, 7, 10, 12, 3, 11, 5, 10, 2, 7, 12, 12, 4, 2, 9, 1, 11, 6, 1, 15, 1, 7, 8, 3, 10, 11, 14, 6, 14, 5, 5, 4, 14, 4, 15, 8, 2, 11, 5, 12, 4, 10, 12, 8, 6, 9, 13, 11, 15, 11, 4, 6, 3, 4, 0, 6, 9, 7, 0, 8, 4, 10, 1, 7, 8, 8, 2, 11, 11, 7, 0, 15, 11, 3, 3, 8, 9, 0, 6, 8, 6, 11, 3, 13, 15, 2, 3, 15, 3, 3, 8, 6, 9, 4, 13, 11, 14, 15, 5, 12, 7, 8, 1, 14, 10, 4, 7, 15, 0, 13, 0, 1, 0, 10, 6, 2, 14, 2, 14, 13, 10, 0, 3, 4, 1, 8, 5, 0, 13, 11, 12, 6, 6, 11, 3, 5, 0, 8, 9, 4, 13, 5, 13, 13, 11, 11, 12, 1, 3, 0, 1, 13, 15, 15, 8, 5, 10, 11, 3, 2, 8, 15, 6, 9, 0, 2, 7, 15, 1, 14, 5, 9, 13, 14, 13, 4, 4, 8, 6, 1, 9, 15, 11, 2], -[14, 13, 13, 6, 4, 7, 0, 9, 5, 13, 14, 3, 4, 5, 3, 13, 13, 0, 13, 9, 3, 11, 11, 14, 9, 6, 11, 13, 15, 6, 14, 15, 14, 7, 15, 12, 15, 10, 0, 6, 15, 1, 2, 15, 9, 15, 4, 11, 1, 3, 6, 6, 3, 13, 3, 3, 1, 11, 10, 6, 13, 12, 5, 2, 9, 15, 0, 7, 14, 14, 10, 2, 2, 11, 9, 10, 3, 13, 3, 9, 3, 0, 9, 10, 3, 13, 1, 6, 5, 13, 0, 5, 8, 1, 15, 0, 4, 1, 9, 0, 5, 5, 9, 10, 9, 3, 10, 9, 10, 10, 8, 3, 14, 1, 3, 2, 0, 8, 13, 7, 2, 13, 10, 10, 9, 15, 15, 9, 7, 6, 12, 0, 6, 11, 3, 3, 4, 11, 2, 5, 8, 14, 8, 15, 14, 10, 12, 12, 13, 12, 1, 8, 10, 0, 14, 2, 10, 11, 6, 5, 13, 0, 15, 15, 13, 10, 2, 2, 10, 15, 12, 14, 11, 7, 14, 7, 15, 14, 4, 15, 12, 5, 13, 0, 14, 12, 0, 3, 5, 6, 2, 0, 15, 0, 2, 6, 3, 3, 15, 5, 0, 14, 1, 15, 11, 9, 9, 0, 12, 7, 9, 10, 7, 2, 8, 3, 5, 13, 8, 5, 15, 15, 3, 10, 4, 15, 14, 15, 9, 10, 10, 15, 11, 2, 14, 15, 3, 3, 7, 3, 7, 6, 3, 8, 1, 0, 12, 8, 9, 9, 4, 9, 13, 15, 10, 5], -[0, 9, 11, 2, 2, 2, 12, 13, 0, 10, 10, 12, 11, 15, 7, 9, 1, 8, 15, 4, 12, 13, 7, 13, 10, 6, 4, 4, 3, 12, 6, 8, 11, 13, 9, 1, 14, 2, 11, 15, 14, 6, 9, 11, 6, 7, 3, 14, 10, 8, 14, 10, 10, 10, 7, 2, 3, 13, 7, 0, 7, 12, 4, 10, 15, 10, 15, 0, 2, 0, 7, 9, 6, 10, 0, 3, 2, 12, 0, 8, 12, 7, 1, 10, 11, 3, 9, 6, 3, 0, 2, 10, 13, 0, 15, 11, 13, 2, 10, 7, 0, 6, 1, 12, 11, 2, 6, 1, 15, 14, 9, 12, 0, 7, 13, 4, 8, 6, 3, 2, 13, 4, 14, 4, 1, 11, 5, 7, 4, 5, 1, 12, 3, 14, 2, 15, 1, 6, 3, 9, 5, 3, 5, 13, 14, 0, 10, 9, 1, 4, 11, 10, 9, 7, 13, 9, 13, 5, 8, 4, 14, 15, 10, 4, 7, 4, 9, 1, 12, 3, 14, 9, 13, 15, 3, 3, 9, 2, 5, 11, 3, 10, 3, 12, 12, 6, 15, 9, 7, 8, 13, 3, 5, 7, 4, 8, 14, 12, 3, 3, 6, 15, 15, 0, 15, 7, 6, 2, 8, 11, 0, 2, 11, 8, 6, 12, 1, 2, 6, 6, 13, 14, 14, 5, 10, 0, 11, 13, 2, 5, 14, 3, 7, 11, 3, 9, 8, 1, 0, 4, 1, 5, 14, 4, 0, 5, 0, 1, 3, 11, 2, 11, 0, 9, 6, 10], -[4, 3, 15, 14, 5, 11, 1, 3, 4, 3, 6, 3, 15, 4, 9, 7, 8, 0, 8, 11, 15, 7, 10, 15, 13, 6, 0, 12, 9, 3, 3, 14, 3, 2, 7, 3, 13, 2, 5, 6, 12, 7, 12, 14, 7, 10, 7, 9, 15, 1, 3, 12, 7, 5, 2, 2, 10, 11, 6, 1, 0, 15, 7, 8, 5, 8, 2, 12, 12, 1, 3, 0, 9, 1, 8, 9, 5, 4, 13, 3, 6, 3, 9, 10, 5, 14, 6, 11, 2, 6, 14, 14, 5, 15, 5, 1, 7, 3, 9, 4, 14, 10, 1, 13, 8, 12, 4, 9, 13, 9, 13, 7, 11, 13, 6, 3, 14, 1, 6, 10, 9, 11, 10, 4, 14, 0, 3, 1, 10, 3, 5, 3, 12, 4, 6, 11, 12, 11, 0, 12, 11, 1, 7, 8, 12, 14, 6, 1, 1, 1, 14, 13, 14, 13, 0, 8, 2, 1, 0, 3, 7, 3, 12, 10, 5, 11, 3, 15, 1, 12, 4, 6, 7, 7, 1, 6, 12, 7, 4, 12, 13, 11, 13, 8, 9, 1, 5, 0, 5, 2, 15, 6, 4, 2, 2, 12, 10, 2, 14, 5, 14, 11, 3, 12, 14, 11, 3, 14, 12, 14, 1, 3, 8, 9, 1, 15, 4, 15, 4, 11, 5, 4, 12, 4, 8, 15, 8, 5, 12, 5, 4, 12, 13, 14, 8, 2, 7, 10, 10, 6, 6, 13, 3, 3, 0, 9, 2, 11, 14, 15, 7, 5, 2, 6, 10, 10]] -w1Encode: 9F13154837A052CA4E2E7C93411BE45D27B2BD76FB025F10A2BBAEC8AC5C502F6FD128194A95E782C6F5E0F96B94290CDE848ED36A8BA42CCFEF432A8D4323604F1D209E22F3BAA6E99F67CF95B5640C206DF9C217BA7A71C6D1FB1E3C60831EA27892E64864647D2C1D634010BBCE3256A03BE4F03812CE5A9FA5488311A11918B250B09556F4171599BA9E3CCB27CAC2808D9D62D74A63C12F3F14C629DEF188A7EB0CB3BAC61D6051748CBD61CCC4EEFB9ABBFC6F2AE2E4D284335F5A1C5EB15E70C40AF1F47F1474D24888C475D9D08B6BE57EA94B4FD7CEC1F31C257D6F2E7ECF235584BCCAEC3C61877673457582E9B91842224211FF67EF77550CAAA4593E9C8D7DD2161184007AE2108731AF0E58EC5CA7A7C0D53B67A6FD10670077EADCBEB86347F47AC5AF54A5907336226327B36EE0871CA924C6BBA9461170B4B58D07BA943934DEB590893B6572AD7D40ACDB571C03034D660468561A417DEB9108B48C02999317D3A5C1C9B22508FECB052A979C81AFE659703A426B20984BEC36A63F80C322ECC414F5F432F7BD89903825760433774758D5E3C982606AE3FD84AB3F56149D3F96E92C6A4C5A3C166E3E03D5FA72BDBA59D509E4FF9B9F66F949DA3109A976F55175BE12DEEA37B05454F92EDFC6C307679EA249AD0AA05EDE349EEC9B2CC20DD6AEA98D0A8262D3AA5374A1EBB9D9E25738023B88DD5D79B225038D6D6D1404AACEDFD471C566926C186C362BAEFF55DF7662F8A5A72458E5A7EB7F74CAB3A572CC24196BF17138BA6E5E454E8FB2C5A48C96BDBF6443607980A47188B27BF03B830986B6D32FF3336849BDFEC587E14AF7D010A0262EDE0A438105BD6CB65380495DDDBB1C03D1FF58BA23F89620F7E195ED4D8416F92BDE6D7490D53E54D30D9DB3EB69DB6FFE7ECFAF601FF2F9B43166D333B16ACD25F970EE2AB2A9D39303A9D361D550180F140955A9399AAA381E23807DD2AAF99F670CB633B452E8F8AECCCD810A2EBA560DFFAD22FAEC7B7EEFF45C0DCE3065020F62335FE0F19B097CA92738D558FFA3F4FEA9FA2BFE33376783018C9994FD5A902B22DCA0CAFB97814FDCD76A44C386DB192EFB6EB976E38AAEAA27D307C7A4AF0F0297A630C2807CA13B6903A20DBF2D7A60C12B16EFC9704D68234D4EB17554C1E3F2619335D50E9A41AB799D5D48FE4A47193C9EFD3329B5A3C36C9F873D7584CE33F60F7F26B8208BC62166ED5E0ADB523EB7931840514E5010B3B290A634EFB53134364F7908B87FFA6DC039E323372D657CECA7971FC35722BA16F08785C21C031998453D36A9E5B662EEF5153749AED1C8949D7DDB361EA6B94A0E133A354CB6BCC01B87EC1611DEDE80123037ACB5F3C16477617CC4BD8D1905256F24C22A5EBEC3BEE3EC3198F1F4B4454CF8585CC4ED28A76AD63390B2FE5762AA - -cTilde: 1C3B7FB47134FC1211A4F8FA16D8F84D642DB8182BBF70D549362A3182E2D313885BE701B5FBA7B2A7EE0B19B04A8F4E1D4B689028B10EB196297F56E75A5D03 -c1Tilde: 0000000000000000000000000000000000000000000000000000000000000000 -c: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 1, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, -1, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0] -cHat: [481415, 7228810, 4226144, 714643, 2802019, 3283882, 2771710, 848672, 4311443, 2880514, 1990277, 1615416, 2479302, 3394055, 4332660, 8299628, 7867971, 2610466, 6188012, 1504376, 4831960, 6413365, 3516579, 5120860, 5853811, 2337192, 639406, 6012297, 4961085, 3189659, 2777741, 6173828, 370774, 527919, 655976, 4362908, 4779984, 563323, 508075, 737255, 7772764, 4512695, 3112458, 271454, 299548, 7503418, 1209213, 8351773, 6371006, 4193536, 5088060, 6162656, 7879985, 4369449, 5479155, 1621299, 5721799, 3820304, 6223510, 3838421, 1923321, 3039565, 7283719, 6869484, 4006025, 1530901, 358773, 7455420, 5270191, 1719215, 991785, 6092458, 5739978, 3563394, 4329488, 4323887, 2094183, 5973931, 356665, 1755205, 5303219, 7755175, 3169545, 1095075, 4476478, 5972965, 1421691, 3549120, 5096024, 7445834, 6081560, 3622834, 1268971, 7405926, 3835894, 4714053, 2575169, 137677, 4406770, 135280, 2181701, 4703003, 5819202, 3220835, 3315375, 2696603, 3575442, 673585, 3030320, 7502329, 2969923, 5761989, 5187529, 6224274, 2533042, 2326581, 6158095, 827577, 1339001, 6475000, 6139255, 4117414, 1700606, 2632815, 2081715, 629955, 6324234, 3802023, 5808932, 2387448, 1389325, 1180387, 5247230, 2032533, 8131248, 6494425, 2596578, 411602, 1829148, 7459530, 8007517, 2430018, 5090362, 7864833, 264516, 6398040, 734474, 1456073, 3052966, 917562, 8352401, 3749926, 7940025, 842058, 5861456, 6877817, 5446186, 1553878, 7946997, 2070236, 5824696, 4285094, 2220173, 1134747, 2795230, 2932048, 1432113, 123811, 5105362, 5470143, 6235837, 2963484, 5290026, 6342813, 686838, 3512612, 1653884, 2688011, 1769907, 7497892, 6575050, 2703084, 5665698, 4437632, 2820649, 1877743, 240723, 6168524, 7293771, 6415623, 6884662, 2590814, 909158, 2009686, 3340447, 4975243, 5394744, 1073173, 2001903, 1761630, 3512482, 3861913, 7862351, 307011, 850611, 6385889, 431321, 4347354, 3515795, 5425715, 3042565, 2308993, 5935125, 2866509, 4524175, 3164881, 2101288, 4057144, 2920703, 1621705, 5361632, 3274465, 1487710, 215180, 8297367, 5134669, 7396293, 877472, 806388, 2683687, 6593683, 8075585, 3963878, 5662935, 5401698, 5474685, 4608121, 3426028, 1625772, 7932264, 6120712, 5379693, 1727295, 2572078, 4701261, 3094765, 6896524, 2464280, 7192610, 2310724, 7719658, 7799363, 3966002, 3289155, 7479004, 4218866] -cs1: [[8380416, 7, 13, 5, 0, 15, 8380411, 0, 8380400, 8380405, 8380402, 2, 2, 8380404, 13, 8380412, 1, 8380416, 8380402, 3, 11, 11, 14, 9, 8380415, 8380404, 3, 8380403, 7, 8380408, 8380405, 8380410, 17, 8380403, 3, 12, 8380411, 8380405, 8380414, 8380413, 8380406, 8380407, 8380408, 8380403, 5, 2, 2, 8380411, 8380402, 9, 8380408, 8380394, 8380406, 5, 8380396, 14, 15, 8380415, 10, 8380414, 9, 8380415, 1, 8380415, 8380409, 11, 8380407, 8380411, 8380411, 8380416, 18, 8380403, 8380410, 8380405, 0, 8380411, 8380409, 8380415, 6, 8, 8380416, 10, 8380416, 8380408, 1, 8380409, 11, 8380399, 8380411, 8380406, 6, 8380413, 19, 8380408, 8380404, 7, 3, 2, 7, 8380402, 9, 8380415, 14, 8380414, 3, 11, 8380414, 3, 8380397, 16, 8380407, 1, 8380406, 3, 8380409, 7, 1, 8380406, 9, 8380413, 8380406, 3, 3, 5, 8380407, 7, 3, 24, 3, 8380410, 8380414, 5, 8380406, 10, 8380411, 13, 2, 3, 8380398, 10, 6, 4, 8380411, 8380416, 8380409, 8380415, 9, 0, 25, 8380399, 8380399, 3, 3, 10, 18, 6, 8, 4, 8380400, 18, 15, 4, 9, 8380413, 4, 0, 3, 7, 8380404, 6, 5, 1, 8380408, 13, 8380414, 21, 5, 4, 8380408, 13, 8380406, 4, 16, 8380406, 2, 8, 8380414, 4, 8380411, 8, 8380411, 10, 9, 18, 16, 3, 8380416, 16, 8380396, 7, 5, 8380408, 4, 8380412, 8380414, 8380412, 8380411, 11, 0, 8380402, 5, 8380401, 12, 8380402, 2, 8380402, 8380416, 14, 12, 8380404, 2, 8, 8380408, 8380414, 3, 8380406, 3, 8380405, 9, 8380414, 2, 8380411, 2, 8380411, 0, 14, 8380393, 6, 1, 8380399, 12, 8380391, 5, 8380405, 8380409, 8380401, 0, 8380408, 5, 8380412, 5, 8380410, 5, 7, 8380407, 8380413], -[12, 8380411, 8380394, 8380387, 8380404, 8380416, 8380406, 16, 5, 8380393, 6, 8380404, 8380407, 8380412, 8380394, 8380402, 8380400, 8380414, 8380395, 10, 7, 7, 6, 8380413, 1, 8380414, 8380411, 8380411, 8380403, 8380410, 8380410, 3, 6, 16, 8380416, 8380411, 8380394, 8380409, 8380415, 2, 1, 8380409, 8380405, 11, 7, 24, 8380411, 20, 8, 8380403, 8380407, 14, 6, 8380399, 8380414, 5, 8380411, 4, 4, 8380414, 8380409, 14, 8380416, 1, 2, 18, 7, 12, 18, 8380413, 8380413, 8380416, 8, 6, 8380407, 14, 8380398, 16, 4, 8, 8380407, 9, 16, 15, 10, 8380405, 13, 5, 9, 2, 3, 9, 3, 11, 6, 11, 8380416, 6, 8380398, 9, 1, 0, 0, 8380408, 5, 14, 9, 1, 8380416, 7, 8380395, 4, 15, 3, 28, 0, 8380413, 8380412, 6, 7, 5, 8380403, 6, 3, 8380395, 8380406, 8380402, 7, 5, 8380400, 20, 8380392, 7, 17, 11, 8380400, 10, 1, 6, 2, 8380416, 8380410, 8380407, 8380401, 8, 8380397, 4, 6, 8380410, 8380407, 8380409, 1, 15, 12, 2, 8380406, 8380416, 8380413, 17, 8380410, 6, 8380398, 8380408, 8380410, 8380412, 8, 8380389, 3, 8380401, 7, 3, 8380414, 2, 8380396, 8380404, 8380396, 1, 8380416, 8380416, 2, 8380409, 10, 8380416, 8380415, 10, 8380410, 8380404, 8380414, 8380411, 8380416, 12, 8380411, 12, 8380413, 8380416, 8380415, 8380398, 9, 11, 8380400, 8380404, 8380409, 8380407, 10, 27, 8380405, 8380407, 18, 8380399, 9, 8380415, 13, 8380413, 8380410, 8380414, 8380402, 10, 8380413, 8380401, 0, 14, 12, 8380415, 25, 8380414, 19, 8380406, 6, 8380409, 8380399, 8380404, 8380408, 8380412, 13, 8380415, 15, 8380385, 12, 11, 8380412, 8380414, 8380405, 5, 0, 22, 6, 20, 5, 8380414, 5, 8380392, 22, 2, 8380406, 8380410, 8380412], -[8380409, 2, 17, 8380413, 15, 20, 5, 8380408, 10, 25, 23, 0, 9, 3, 10, 19, 14, 15, 8380410, 8, 10, 8380413, 1, 26, 8380411, 8380392, 8380407, 5, 15, 15, 29, 8380407, 8380411, 8380413, 4, 8380405, 10, 6, 8380409, 8380403, 20, 11, 10, 8380411, 8380397, 8380402, 8380402, 2, 8380410, 8380411, 1, 4, 8380408, 8380401, 10, 7, 9, 8380404, 8380399, 6, 8380409, 10, 8380404, 3, 8380416, 4, 8380401, 1, 8380413, 8380393, 8380395, 8380410, 8380405, 8380402, 8380416, 4, 3, 12, 2, 12, 0, 15, 8380412, 1, 12, 8380410, 0, 8380408, 8380409, 8380415, 8380411, 8380405, 8380400, 8380410, 8380414, 3, 8380409, 8380411, 8380415, 8380404, 8380412, 8380398, 1, 21, 8380411, 8380404, 8380404, 8380413, 8380392, 8380415, 4, 7, 8380408, 8380403, 8380398, 8380400, 10, 2, 11, 4, 8380411, 8380413, 8380407, 8380413, 15, 13, 8380412, 8380412, 8380416, 10, 15, 8380409, 8380407, 8380408, 8380416, 10, 8380399, 21, 13, 8380405, 8380403, 9, 12, 8380413, 11, 8380407, 8380411, 4, 14, 17, 12, 12, 8380403, 8380416, 8, 8380415, 4, 4, 8380405, 8380403, 8380412, 8380416, 12, 4, 2, 3, 8380405, 8380416, 8, 17, 9, 8380396, 0, 11, 4, 13, 25, 8380414, 8380416, 5, 8380402, 8380415, 12, 2, 12, 5, 28, 10, 20, 22, 8380405, 2, 14, 25, 8380413, 0, 3, 3, 8380413, 4, 13, 8380412, 10, 8380415, 16, 9, 8380413, 8380410, 8, 8380413, 16, 9, 8380414, 8380401, 9, 8380411, 2, 8380401, 13, 9, 2, 8380413, 8380402, 1, 18, 8380400, 4, 5, 8380412, 8380416, 3, 8380406, 7, 8380416, 8380412, 8380402, 8380408, 1, 8380397, 8, 8380411, 8380412, 8380413, 13, 9, 8380393, 8380415, 8380415, 8380407, 26, 1, 3, 8380412, 5, 1, 9], -[8380412, 10, 8380411, 8380407, 1, 8380406, 4, 8380400, 1, 5, 8380410, 8380416, 8, 8380416, 8380411, 17, 8380413, 15, 8380412, 18, 5, 8380415, 1, 8, 2, 8380415, 8380372, 9, 8380394, 29, 8380400, 3, 8380403, 3, 8380414, 8380404, 3, 3, 8380410, 8380401, 15, 8, 5, 8380408, 11, 3, 7, 8380406, 8380402, 2, 6, 4, 8380392, 8380406, 8380404, 4, 1, 8380416, 8380413, 8380412, 19, 8380414, 9, 7, 9, 8380408, 5, 8380413, 8380412, 5, 8380414, 8380413, 8380411, 5, 9, 8380400, 9, 8380410, 8380414, 8380416, 8380410, 13, 8380407, 3, 7, 3, 8380416, 8380414, 8380415, 8380411, 3, 5, 8380410, 8380396, 18, 8, 8380404, 8380406, 6, 6, 5, 8380415, 19, 8380404, 26, 8380409, 6, 8380411, 0, 8380416, 3, 4, 1, 8380415, 8380410, 8380407, 8380408, 8380395, 3, 14, 6, 2, 17, 8380411, 8380414, 8380413, 2, 8380403, 8380416, 8380416, 2, 8380412, 9, 8380409, 18, 3, 5, 8380404, 8380412, 8380412, 8380396, 4, 1, 8380416, 9, 8380412, 2, 8380413, 10, 8380415, 9, 8380414, 8380414, 8380414, 2, 17, 12, 8380411, 8380403, 8380411, 8380398, 4, 8380409, 8380402, 8, 8380412, 1, 0, 8380416, 10, 8380409, 17, 1, 5, 8, 3, 1, 16, 8380415, 14, 8380408, 8380412, 2, 10, 8380415, 8380416, 8380405, 4, 8380401, 3, 8380405, 8380409, 20, 9, 12, 8380414, 8380409, 8380407, 8380399, 13, 11, 5, 0, 14, 8380410, 11, 8380396, 16, 8380415, 7, 8380412, 8380410, 8380416, 8380409, 17, 20, 1, 5, 8380403, 8380413, 13, 8380416, 11, 8380413, 4, 4, 8380407, 8380408, 1, 7, 8380407, 12, 8380394, 1, 8380415, 0, 7, 8380409, 30, 8380412, 8380407, 1, 11, 8, 5, 8380415, 8380410, 8380413, 5, 8380403, 8380412, 8380408, 8380416, 8380411, 8380413, 8380398], -[10, 8380386, 10, 10, 4, 8380414, 3, 8380408, 15, 4, 8380413, 8380400, 16, 2, 2, 5, 8380405, 11, 8380395, 8380411, 8380408, 8380404, 13, 0, 0, 0, 8380402, 8380414, 8380416, 14, 8380407, 8380410, 8380400, 4, 8380407, 8380414, 4, 1, 0, 17, 8, 8380414, 8380410, 8380416, 8, 8380413, 7, 8, 8380409, 3, 8380416, 7, 8380405, 8380406, 8380409, 8380411, 8380389, 1, 2, 7, 8380405, 8, 8380411, 15, 22, 10, 8380410, 8380402, 22, 0, 8380410, 2, 8380402, 18, 15, 0, 8380398, 7, 8380410, 22, 8380397, 8380413, 9, 5, 11, 1, 8380405, 5, 8380413, 16, 7, 8380392, 2, 8380407, 8380412, 10, 8380403, 8380406, 5, 21, 8380415, 5, 1, 11, 24, 4, 8380414, 7, 8380411, 24, 9, 8380409, 6, 8380409, 3, 8380412, 8380414, 8380414, 8380414, 0, 8380411, 8380409, 0, 4, 8380413, 19, 3, 6, 19, 8380413, 4, 0, 9, 8380408, 7, 8380405, 5, 8380409, 18, 4, 8380414, 3, 8380408, 8380396, 19, 8380407, 8380416, 10, 10, 8380412, 8380413, 17, 3, 8380409, 6, 8380410, 1, 8380408, 5, 8380388, 13, 8380410, 3, 2, 9, 14, 0, 8380415, 4, 9, 3, 5, 8380413, 8380409, 16, 8380410, 4, 8380402, 6, 11, 8380414, 8380409, 9, 8380408, 10, 8380416, 8380410, 8380411, 6, 7, 3, 8380410, 26, 8380415, 8380406, 8380415, 8380413, 8380410, 8380410, 16, 8380399, 8380412, 14, 8380402, 8380409, 8380410, 15, 8380402, 8380415, 21, 8380406, 7, 2, 8, 8380406, 1, 8380411, 8, 8380409, 0, 8380416, 6, 8380415, 8380406, 8380401, 8380391, 12, 6, 8380389, 1, 8380409, 7, 8380414, 7, 8380410, 8380415, 3, 13, 8380404, 0, 8380415, 4, 3, 19, 8380409, 8380413, 8380397, 13, 8380397, 8380410, 8380402, 8380410, 7, 23, 8380410, 8380406], -[8380406, 0, 8380414, 25, 8380411, 5, 1, 3, 7, 8380412, 5, 8380412, 8380413, 8380405, 8380401, 4, 8380406, 17, 8380415, 8380416, 8380404, 8380414, 4, 0, 0, 8380408, 0, 17, 5, 3, 2, 11, 2, 24, 8380410, 2, 8380412, 13, 12, 8380392, 21, 14, 13, 7, 3, 8380416, 16, 8380414, 13, 8380410, 8380414, 1, 9, 1, 19, 1, 8380409, 0, 8380416, 8380414, 6, 8380413, 8380410, 8380406, 8380416, 6, 8380413, 8380413, 2, 0, 8380409, 4, 8380395, 2, 8380415, 15, 8380412, 10, 23, 8380415, 8380414, 8, 8380409, 1, 0, 8380412, 8380407, 8, 8380415, 18, 8380408, 0, 0, 8380406, 2, 8380393, 3, 8380414, 17, 3, 8380416, 8380415, 1, 8380409, 8380416, 12, 5, 8380401, 4, 8380401, 2, 8380416, 8380416, 8380409, 8380407, 8380414, 21, 8380397, 8380411, 7, 8380401, 8380404, 2, 2, 8380410, 8380388, 8380396, 3, 8380405, 4, 8380406, 8380411, 9, 8380411, 8380406, 8380409, 8380413, 3, 5, 8380400, 4, 3, 12, 8380411, 14, 8380409, 1, 7, 8380407, 8380411, 8, 8380408, 8380416, 8380415, 19, 14, 7, 1, 8380413, 8380403, 6, 0, 2, 10, 4, 8380402, 8380415, 11, 3, 8380410, 5, 8, 8380405, 8380410, 19, 8380408, 6, 8380412, 8380412, 12, 18, 8, 8380414, 2, 8380400, 6, 8380407, 2, 4, 1, 8380398, 8380416, 13, 13, 5, 2, 8380390, 8380405, 7, 8380411, 12, 1, 30, 13, 1, 20, 0, 2, 8380405, 8380411, 8380411, 5, 10, 16, 8380414, 1, 3, 9, 5, 2, 0, 3, 8380415, 2, 8380411, 11, 8380405, 8380415, 9, 2, 3, 0, 8380393, 8380411, 8380414, 8380411, 7, 0, 8380407, 8380411, 8380412, 8380410, 5, 9, 20, 2, 8380407, 1, 8380399, 19, 8380405, 5, 8380413, 2, 12, 8380406], -[8380411, 8380411, 1, 8380404, 4, 8380412, 9, 8380413, 12, 29, 8380413, 8380410, 17, 8380407, 8380415, 11, 8380413, 4, 14, 6, 8380405, 8380413, 22, 8380413, 18, 8380396, 8380416, 5, 6, 8380410, 8380413, 4, 15, 8380411, 8380406, 8380404, 4, 9, 6, 8380400, 8380410, 4, 8, 8380412, 0, 15, 8380408, 6, 8380412, 10, 8380408, 9, 8380410, 8380392, 3, 8380405, 8380411, 2, 8380403, 13, 8380415, 8380396, 8380412, 16, 10, 8380415, 8380412, 8380408, 8380404, 8380403, 8380401, 5, 17, 8380416, 8380413, 8380411, 8380412, 2, 8380404, 8380410, 8380414, 3, 8, 7, 8380413, 8380399, 8380397, 5, 11, 8380413, 8380414, 4, 3, 8380407, 8380410, 8380398, 8380415, 21, 5, 4, 8380399, 1, 0, 4, 8380409, 3, 8380410, 22, 8380405, 18, 8380416, 14, 8380404, 8380393, 0, 8380408, 17, 8380416, 2, 8380413, 8, 8380407, 11, 8, 8380415, 10, 8, 1, 8380393, 16, 8380413, 11, 22, 8380409, 3, 8380403, 8380406, 8380416, 2, 5, 8380405, 8380412, 5, 0, 18, 8380415, 2, 8380411, 8380401, 9, 14, 8380408, 16, 8, 14, 10, 8380408, 3, 17, 8380394, 8380408, 1, 0, 8380396, 7, 2, 8380409, 2, 8380405, 5, 8380416, 5, 24, 8380409, 17, 8380396, 2, 14, 8380415, 8380406, 17, 0, 8, 8380415, 8380404, 8380407, 1, 9, 13, 8380409, 4, 8380408, 8380412, 8380411, 8380414, 1, 16, 16, 0, 2, 8380413, 8380416, 9, 8380400, 14, 8380402, 11, 8380399, 8380412, 2, 8380406, 8, 11, 8380403, 8380406, 13, 22, 8380398, 8380406, 6, 1, 2, 8, 8380410, 8380413, 10, 8380415, 8380400, 8380408, 8380409, 8380412, 12, 4, 8380410, 11, 8380413, 12, 8380415, 8380397, 26, 8380393, 8380410, 8, 8380396, 8380409, 8380405, 8380404, 18, 7, 8380412, 8380406, 0, 8380415, 8380405, 1, 8380415]] -cs2: [[17, 8380415, 8380414, 8380400, 14, 14, 8380416, 8380416, 8380403, 19, 8380413, 8380412, 8380407, 18, 6, 6, 8380402, 8380407, 13, 8380415, 8380407, 8380406, 8380415, 8380412, 14, 8380406, 17, 1, 8380390, 8380416, 23, 8380413, 18, 8380405, 5, 8380396, 8380394, 8380416, 8380389, 23, 11, 8380393, 6, 8380411, 7, 11, 0, 8380414, 8380412, 5, 8380407, 9, 0, 16, 8380403, 0, 12, 6, 8380406, 8380389, 8380406, 14, 2, 8380404, 8380415, 21, 8380409, 14, 8380403, 29, 10, 8380411, 8380400, 8, 11, 17, 8380404, 8380409, 8380406, 8380407, 8380414, 8380408, 12, 8380413, 8380414, 3, 10, 8380410, 11, 4, 8380413, 8380404, 8380395, 7, 5, 20, 1, 14, 8380400, 19, 7, 12, 14, 8380404, 6, 8380403, 10, 3, 8380392, 8, 8380394, 8380410, 8380415, 16, 7, 8380411, 8380415, 8380416, 0, 7, 25, 8380411, 8380415, 8380404, 6, 11, 8380413, 8380415, 8380415, 8380410, 8380411, 4, 10, 8380404, 9, 8380416, 8380396, 2, 12, 5, 4, 8380412, 8380416, 8380399, 8380412, 10, 9, 8380401, 1, 8380401, 8380409, 1, 20, 8380411, 5, 4, 5, 8380401, 0, 17, 3, 8380415, 8380409, 3, 8380407, 8380407, 8380413, 3, 19, 8380415, 8380412, 4, 27, 8380403, 0, 8380414, 23, 9, 8380415, 3, 6, 8380407, 9, 6, 8380413, 2, 8380404, 8380405, 8380410, 12, 3, 8380404, 1, 8380407, 15, 1, 8380411, 8380412, 7, 0, 8380397, 4, 12, 3, 6, 1, 7, 1, 14, 8380412, 8380414, 14, 8380410, 8380406, 7, 5, 8380409, 8380399, 8380405, 3, 8380404, 16, 9, 8380407, 9, 2, 8380409, 17, 8380410, 21, 8380406, 8380396, 17, 14, 0, 8380402, 8380409, 8380409, 1, 4, 8380416, 19, 1, 7, 8380400, 13, 1, 8380408, 8380387, 6, 12, 8380410, 1, 11, 11, 8380395], -[8380412, 8380412, 0, 24, 8380408, 6, 8380412, 8380401, 8380409, 2, 16, 11, 13, 1, 17, 8380413, 8, 8380415, 3, 8380411, 8380408, 6, 9, 7, 10, 8380404, 3, 13, 2, 8380403, 8380406, 8380415, 5, 8380412, 7, 25, 4, 9, 8380415, 8380390, 17, 13, 11, 2, 4, 12, 8380404, 8380412, 4, 8380411, 8380411, 8380408, 4, 4, 8380404, 3, 8380415, 8380409, 11, 8380416, 19, 14, 21, 8380402, 8380415, 6, 4, 8380412, 8380409, 8380410, 0, 8380414, 15, 4, 8380409, 5, 3, 8380412, 8380416, 8380406, 8, 0, 8380398, 8380411, 8380411, 8380406, 11, 8380403, 22, 6, 8380395, 3, 19, 13, 8380407, 14, 8380404, 9, 20, 8380396, 8380399, 8380409, 6, 8380410, 3, 8380411, 8380412, 8380409, 8380412, 8380415, 6, 15, 8380407, 3, 10, 8380409, 4, 9, 8, 10, 0, 0, 3, 8380401, 8380403, 6, 8380411, 8380407, 8380404, 8380395, 8380413, 8380409, 4, 8380409, 8380410, 18, 8380412, 14, 4, 8380404, 8380416, 3, 15, 8380410, 8380400, 8380404, 8380407, 2, 8380413, 15, 8380416, 8380413, 8380397, 8380402, 8380408, 8380414, 8380413, 8380410, 8380405, 7, 10, 2, 8380415, 8380409, 8380395, 8, 0, 17, 3, 8380413, 13, 1, 8380410, 8380407, 21, 8380403, 2, 8380393, 8380413, 6, 8380416, 24, 5, 7, 10, 7, 8380402, 19, 3, 8380400, 8380416, 0, 4, 8380406, 8380409, 3, 7, 4, 13, 1, 17, 8380412, 12, 5, 8380415, 21, 8380413, 18, 8380414, 1, 8380411, 11, 25, 8380416, 8380415, 8380408, 8380416, 2, 8, 6, 14, 8380415, 2, 0, 7, 23, 12, 8380408, 4, 8380410, 28, 8380406, 8, 8380412, 1, 5, 17, 8380414, 8380412, 8380392, 13, 5, 11, 6, 13, 8380415, 8380409, 1, 5, 4, 7, 1, 8380408, 8380407, 8380413, 8380403], -[8380414, 8380415, 0, 3, 5, 13, 8380412, 8380412, 10, 18, 8380405, 8380408, 8380412, 8380416, 23, 8380408, 11, 8380390, 13, 8, 8380408, 0, 8380411, 8380415, 13, 8380402, 8380404, 8380405, 8, 2, 10, 8380402, 8380402, 8380404, 8, 2, 21, 8380392, 8380408, 8380409, 8380413, 7, 8380405, 9, 9, 8380406, 8380410, 8380396, 3, 8380413, 3, 4, 8380407, 8380415, 8380406, 8380415, 20, 8380408, 8380409, 8380402, 8380408, 10, 2, 9, 3, 8380414, 16, 8, 8380409, 7, 8380406, 8380414, 8380402, 0, 8380411, 7, 8380414, 8380398, 2, 11, 2, 4, 8380415, 1, 8380404, 16, 8380411, 8380409, 4, 8380412, 8380413, 3, 8380393, 8380412, 5, 12, 8380411, 6, 8380403, 8380414, 11, 8380416, 8380408, 7, 8380415, 8380405, 2, 8380414, 8380415, 2, 9, 15, 8380400, 8380416, 0, 8380408, 25, 18, 0, 8380414, 8380406, 14, 7, 17, 8380406, 14, 8380414, 8380410, 22, 1, 6, 27, 8380402, 11, 8380416, 8380412, 10, 8380407, 3, 8380403, 1, 11, 8380410, 9, 8380412, 6, 4, 8380416, 8380401, 2, 24, 20, 3, 8380406, 8380399, 8, 14, 8380414, 8380409, 8380409, 2, 3, 8380408, 6, 3, 8380402, 9, 5, 12, 8380397, 8380416, 2, 14, 6, 10, 10, 14, 21, 0, 8380399, 8380414, 8380409, 8380411, 8380407, 8380414, 8380398, 8380414, 8380413, 5, 8, 1, 8380402, 11, 8380403, 16, 8380414, 6, 8380397, 13, 8380415, 8380406, 13, 8380407, 9, 8380397, 8380403, 6, 8380405, 8380409, 8380393, 8380411, 23, 3, 8380391, 8380391, 1, 8, 8380412, 3, 8380408, 8380416, 10, 12, 16, 8380396, 8380416, 8380409, 8380403, 0, 8380411, 8380411, 3, 13, 17, 8380407, 8380402, 9, 4, 12, 5, 8380413, 11, 3, 6, 8380404, 8380412, 4, 8380416, 8380409, 8380402, 14, 8380408, 8380410, 13, 8380414, 14], -[8380413, 8380410, 1, 8380411, 1, 23, 9, 8380411, 8380394, 9, 8380406, 8380413, 0, 8380408, 1, 8380398, 3, 8380408, 10, 9, 7, 8380406, 8380393, 8380411, 2, 8380413, 26, 8380415, 10, 8380395, 5, 5, 14, 1, 16, 8380399, 6, 8380400, 18, 8380392, 20, 8380391, 8380411, 8380414, 8380412, 8, 2, 8380409, 8380416, 8380416, 11, 2, 6, 5, 8380412, 8380404, 8380403, 8380403, 8380413, 8, 8380406, 8380407, 8, 8380414, 2, 8380410, 6, 5, 14, 8380416, 20, 15, 8380390, 20, 0, 12, 9, 3, 8380409, 8, 10, 3, 8380416, 8380395, 3, 8380408, 6, 14, 5, 11, 8380403, 15, 5, 8380407, 8380415, 8380408, 12, 20, 7, 4, 8380410, 8380413, 8380401, 1, 8380412, 22, 8380402, 11, 8380406, 4, 8380415, 8380413, 0, 14, 8380412, 6, 8380399, 8380394, 15, 21, 9, 8380412, 8380394, 7, 13, 12, 13, 1, 8380411, 8380415, 8380403, 0, 8380407, 14, 8380407, 1, 8380402, 10, 8380415, 8380415, 17, 22, 8380408, 15, 8380411, 9, 1, 8380411, 0, 8380416, 8380409, 17, 8380415, 8380414, 8380412, 8380407, 8380412, 8380411, 8, 1, 3, 8380402, 8380414, 3, 9, 9, 5, 8380397, 8380402, 3, 8380413, 6, 8380415, 8380408, 8380415, 8380406, 11, 8380408, 14, 8380407, 2, 8380410, 8380403, 8380404, 23, 19, 21, 8380396, 8380414, 8380415, 16, 6, 8380407, 0, 8380415, 4, 8380412, 8380416, 8, 8380411, 8380410, 8380405, 9, 8380408, 12, 16, 8380415, 1, 7, 8380388, 8380409, 8380415, 21, 5, 8380411, 8380400, 8380407, 8380400, 18, 8380400, 16, 8380384, 8380405, 8380414, 7, 16, 11, 8380404, 8380411, 0, 5, 0, 6, 7, 8380408, 6, 0, 8380402, 8, 1, 8380412, 4, 8380416, 8380396, 8380415, 8380412, 30, 8380416, 8380411, 8380415, 9, 14, 1, 14, 8380403, 10], -[8380406, 8380406, 11, 3, 8380415, 8380404, 22, 0, 4, 8380416, 8380414, 8380412, 8380399, 8380413, 21, 6, 5, 0, 2, 8380411, 16, 8380411, 7, 5, 8380397, 1, 8380406, 22, 8380408, 8380416, 8380411, 8380415, 7, 8380400, 5, 8380411, 21, 8380408, 8380413, 4, 37, 20, 8380413, 8380409, 2, 8380409, 0, 8380408, 8380415, 8380414, 18, 8380399, 1, 8, 1, 0, 8380398, 20, 8380404, 8380410, 5, 8380399, 20, 8380416, 8, 0, 4, 7, 8380415, 8380412, 2, 8380415, 8380405, 18, 8380404, 1, 17, 8380397, 8380411, 5, 14, 11, 8380401, 10, 17, 8380411, 8380409, 15, 0, 19, 8380413, 8380412, 12, 10, 8380404, 8380407, 8380414, 1, 4, 8380385, 8380409, 3, 6, 5, 7, 13, 6, 8380416, 8380416, 8380415, 6, 2, 8380397, 8380400, 3, 15, 8380414, 8380412, 3, 13, 8380409, 7, 8380415, 8380399, 22, 7, 8380411, 8, 7, 11, 7, 8380403, 8380415, 4, 8380397, 3, 8380398, 8380415, 8380405, 3, 8, 11, 14, 8, 8380403, 8380415, 23, 2, 8380414, 0, 8380406, 15, 3, 2, 6, 0, 8380416, 8380408, 8380409, 8380414, 1, 8380407, 31, 2, 8380410, 8380416, 8380413, 8380416, 8380409, 1, 5, 8380393, 8380407, 8380412, 8380416, 9, 1, 8380410, 8380408, 16, 8380413, 8380408, 15, 8380394, 8, 8380411, 8, 8380407, 8380406, 10, 2, 8380416, 3, 8380405, 17, 4, 8380404, 8380413, 8380413, 17, 24, 8380390, 1, 8380415, 0, 15, 8380399, 8380416, 8380415, 5, 10, 8380408, 21, 8, 8380416, 0, 8380411, 0, 8380411, 1, 1, 8380405, 15, 8380401, 15, 8380401, 3, 6, 2, 9, 6, 13, 8380412, 10, 8380416, 14, 12, 1, 8380413, 8380390, 22, 7, 8380411, 2, 8380412, 8380414, 8380405, 18, 8380415, 8380406, 8, 3, 14, 8380407, 19, 4], -[3, 8380406, 8380408, 8380404, 8380407, 16, 8380388, 6, 8380406, 9, 12, 8380404, 10, 8380402, 11, 6, 1, 31, 8380413, 8380404, 8380404, 4, 8380403, 8380415, 8380413, 5, 8380409, 24, 8380416, 8380415, 1, 8380412, 2, 11, 8380402, 28, 14, 8380398, 10, 5, 2, 8380416, 29, 8380402, 5, 10, 9, 8380405, 12, 12, 8, 12, 21, 8380401, 22, 8380410, 8380411, 8380412, 8380407, 8380408, 5, 2, 24, 14, 6, 8380398, 20, 0, 6, 8380404, 3, 8380403, 3, 11, 9, 14, 11, 8380411, 8380398, 3, 8380413, 8380404, 1, 8380416, 8380413, 8380395, 8380410, 30, 8380405, 3, 8380414, 8380414, 8380416, 6, 1, 8380403, 4, 13, 8380399, 3, 10, 8380398, 13, 8380399, 8380406, 8380408, 4, 8380405, 8380401, 1, 8380410, 8380414, 4, 8380408, 5, 8380415, 8380416, 4, 8380393, 8380416, 8380398, 3, 11, 8380409, 10, 8, 8380403, 12, 8380411, 0, 8380401, 8380401, 10, 8380407, 8380415, 8380416, 8380398, 9, 8380408, 8380416, 8380413, 6, 8380392, 17, 0, 8380415, 8380406, 10, 8380416, 16, 4, 8380406, 8380413, 10, 8380409, 16, 8380405, 1, 8380384, 8380410, 5, 8380416, 28, 4, 8380412, 0, 8380412, 8380412, 8380412, 8380412, 7, 5, 8380406, 9, 12, 8380414, 8380416, 1, 8380414, 8, 8380403, 8380412, 8380410, 20, 8380406, 2, 3, 17, 15, 13, 8380413, 8380398, 13, 8380390, 8380412, 11, 3, 8, 8, 0, 8380412, 8380413, 8380416, 8380409, 27, 2, 12, 8380416, 8380409, 8380413, 6, 13, 8380412, 8380416, 3, 8380405, 4, 8380413, 8380406, 6, 8380415, 8380414, 19, 8380416, 8, 0, 13, 8380410, 8380407, 8380414, 0, 8380407, 23, 8380416, 15, 14, 8380409, 10, 8380412, 22, 8380411, 8380410, 8380412, 8380406, 8380415, 8380409, 1, 8380414, 1, 21, 8380416, 10, 5, 11, 8380414, 15], -[8380414, 10, 8380409, 7, 6, 8380414, 8380406, 1, 8380401, 6, 8380406, 14, 8380402, 8380411, 12, 8, 2, 13, 2, 8380400, 8380411, 8380413, 8380412, 18, 1, 8380408, 8380413, 13, 6, 8380414, 12, 8, 8380414, 8380407, 8380411, 8380409, 20, 6, 5, 6, 8380393, 9, 4, 0, 0, 8380412, 8380410, 11, 8380403, 0, 8380406, 6, 8380413, 8380406, 1, 8380416, 8380413, 16, 11, 8380414, 8380403, 7, 8380405, 19, 6, 8380415, 13, 8380408, 8380411, 3, 8380415, 8380416, 8380412, 8380399, 20, 8380414, 11, 10, 10, 6, 8380409, 16, 14, 8380398, 11, 8380399, 8380389, 2, 8380410, 8380404, 13, 4, 8380416, 8380416, 0, 8380402, 18, 14, 8380412, 8380409, 15, 2, 8, 16, 8, 8380412, 8380415, 8380413, 13, 8380415, 8380412, 8380394, 8380411, 2, 8380408, 0, 8380414, 12, 8, 8380399, 8380414, 8380414, 8380409, 8380412, 8380414, 8380416, 2, 8380412, 10, 2, 3, 15, 6, 3, 8380409, 8380399, 13, 0, 4, 4, 8380411, 13, 5, 5, 1, 8380407, 8380407, 3, 5, 8380403, 3, 13, 8, 16, 5, 7, 8380411, 8380407, 8380410, 8380415, 8380410, 28, 2, 3, 3, 8380412, 6, 8380410, 10, 10, 8380414, 18, 8380406, 11, 2, 8380414, 8380409, 8380407, 0, 20, 8380411, 8380413, 9, 18, 6, 8380416, 5, 8380410, 8380400, 22, 8380412, 8380412, 8380411, 8380414, 8380402, 13, 2, 0, 7, 8380404, 8380402, 8380412, 20, 12, 8380411, 8380410, 12, 11, 8380413, 8380416, 8380408, 8380411, 2, 8380410, 8380414, 8380403, 17, 5, 1, 2, 3, 8380404, 8380415, 16, 8380406, 8380415, 8380414, 8380402, 8380399, 11, 18, 5, 8380400, 8380401, 24, 0, 11, 15, 8380404, 8380412, 16, 14, 8380413, 7, 8380416, 8380400, 5, 8380406, 9, 8380395, 0, 8380401, 8380397, 20, 2, 10], -[7, 15, 8380412, 8380413, 1, 8380413, 1, 5, 11, 8380402, 8380414, 13, 8380405, 8380405, 9, 9, 8380407, 8380384, 11, 9, 8380410, 8380403, 7, 8380395, 7, 8380412, 2, 13, 15, 11, 8380398, 0, 17, 4, 7, 8380408, 8380411, 8380411, 8380415, 18, 8380416, 8380406, 6, 0, 8380389, 7, 8380412, 1, 8380411, 9, 8380403, 1, 7, 8380415, 10, 14, 5, 8380411, 4, 0, 8380414, 8380403, 8, 2, 8380388, 8380394, 7, 8380408, 6, 8380399, 8380407, 8380394, 8380411, 8380415, 0, 8380409, 8380411, 8380402, 4, 0, 2, 8380415, 8380413, 8380395, 19, 8380407, 8380416, 2, 8380409, 8380406, 8380416, 2, 1, 10, 5, 8380396, 1, 0, 8380409, 10, 8380416, 8380410, 8380413, 8380413, 8380416, 9, 15, 8380409, 9, 10, 8380400, 8380412, 11, 3, 0, 6, 8380406, 22, 0, 8380413, 8380413, 2, 8380416, 8380408, 8380404, 8380411, 8380416, 1, 8380409, 25, 9, 1, 8380410, 8, 8380416, 7, 17, 8380414, 6, 18, 2, 11, 8380412, 1, 3, 2, 0, 12, 0, 7, 5, 3, 3, 8380409, 9, 8380413, 9, 5, 1, 8380415, 19, 11, 8380415, 25, 13, 22, 7, 3, 12, 8380394, 13, 8380407, 0, 5, 1, 8380403, 8380403, 8380415, 8380398, 1, 8380411, 12, 3, 8, 8380416, 8380405, 13, 5, 6, 8380407, 8380403, 5, 8, 8380401, 8, 8380411, 8380408, 8380397, 3, 1, 13, 18, 8380404, 8380396, 8380412, 8380406, 3, 12, 1, 8380405, 8380409, 0, 14, 8380405, 8380415, 8380410, 18, 2, 8380410, 8, 8380409, 4, 9, 8380400, 8380414, 17, 8380411, 8380413, 4, 8380394, 2, 8380408, 8380399, 8380394, 3, 8380403, 8380408, 8380413, 16, 3, 8380414, 8380413, 6, 8380409, 17, 8380408, 16, 8380407, 8380388, 8380405, 8380410, 12, 22, 8380406, 8380401, 7]] -z: [[423556, 7871462, 216036, 437407, 8052323, 85868, 74357, 484136, 134074, 515667, 8245356, 86518, 488542, 8353547, 86109, 378290, 20006, 8168281, 7981215, 8088507, 303921, 53629, 101930, 7889599, 8166717, 8298675, 162378, 8151829, 41762, 339744, 436730, 174514, 8206639, 465063, 484414, 89707, 8247095, 8240452, 129836, 7859049, 335115, 380055, 125866, 42859, 8069822, 7930640, 8215106, 410412, 248765, 99892, 155430, 457036, 8005240, 8075212, 8069237, 450291, 314643, 87323, 8315242, 422261, 8218020, 200651, 36965, 7861584, 8145752, 8227143, 999, 383425, 8182397, 254010, 24906, 8223178, 7998141, 301679, 8366671, 22627, 105160, 8195002, 7864565, 500271, 264288, 256369, 8199510, 7922918, 8277761, 476581, 9181, 7943470, 8259529, 7949850, 8088893, 330216, 8260436, 335200, 8207363, 8024377, 351490, 10248, 8084175, 403754, 282557, 8212260, 427557, 8193746, 8095170, 405638, 7953924, 8039405, 8325084, 8051652, 7911945, 8241727, 221401, 8353237, 8300027, 134394, 245229, 227814, 485933, 8311513, 8304975, 8160497, 8208568, 92767, 433521, 8111349, 8357369, 8356321, 8091167, 228290, 8361400, 7984912, 407561, 8107387, 246317, 403401, 8210697, 234151, 7961270, 501256, 8089445, 7903988, 197927, 8265447, 241047, 8031131, 506214, 342902, 73878, 511005, 361592, 8023870, 122544, 358637, 466938, 7903631, 277804, 7989275, 231537, 75535, 70985, 24835, 7890052, 8102404, 490173, 7865482, 112108, 8031133, 8075268, 305840, 8326098, 63129, 101899, 7878092, 7938059, 250338, 377757, 31002, 13509, 8365320, 8150193, 8257198, 190769, 8064735, 8294057, 319169, 7968841, 8046554, 101311, 369057, 7940732, 246626, 222802, 7994129, 8321166, 135107, 90687, 168475, 193194, 8186852, 8144638, 154599, 295022, 77764, 347008, 205715, 214013, 15682, 75288, 249016, 499504, 7993857, 7861124, 106417, 7919323, 8219580, 8330562, 12811, 14384, 139019, 8339195, 456091, 8075765, 8167953, 472890, 7908717, 405041, 8036487, 23211, 327949, 7885735, 8045995, 7991849, 7863562, 8311281, 8149955, 195870, 8003776, 8063710, 8368261, 7959688, 219861, 490598, 211783, 7858257, 7983709, 8033469, 8015467, 8113136, 8337970, 7893481, 8345586, 493553, 295340, 207992, 136861], -[110341, 8091309, 7987480, 8199477, 8010929, 8172903, 8377580, 8197940, 8312873, 90011, 72772, 354216, 8284685, 8048295, 389068, 341450, 297059, 8016768, 495945, 7927784, 369295, 7960179, 8212831, 7975730, 124613, 51615, 473962, 8233478, 447007, 8295856, 116613, 477251, 339473, 8166333, 8034361, 382081, 8137947, 23859, 132109, 8350613, 8323737, 7867242, 8114703, 8373779, 7879168, 505544, 148022, 28038, 7865187, 206448, 431642, 5541, 8045203, 8342009, 400577, 8022666, 523221, 465613, 53706, 8074994, 8742, 7858940, 89800, 520780, 8227402, 167373, 14851, 261026, 8267929, 8190731, 171283, 146204, 8253447, 233434, 19069, 150575, 8027722, 8279413, 7886999, 487388, 8080500, 151234, 8112638, 421340, 181765, 375010, 432376, 7859080, 8122256, 165434, 217312, 8044372, 8373163, 178116, 102247, 89242, 244666, 214747, 9399, 7937993, 2012, 492464, 7989618, 456360, 8021161, 8131743, 153982, 8078980, 7949087, 243423, 8151479, 8206254, 498105, 211482, 167363, 8169323, 185250, 201299, 8107837, 141800, 8318181, 8129820, 367778, 8090693, 229873, 8259518, 198723, 8220750, 206636, 8372482, 7996896, 8273842, 8205584, 230422, 8053912, 8307624, 515886, 8129259, 484149, 257519, 7970588, 203349, 7970239, 266849, 461162, 341502, 54544, 348656, 272294, 8156034, 8371920, 7910680, 98992, 301616, 7888109, 178752, 132799, 294100, 301846, 8247704, 286482, 7879425, 60300, 199348, 7968340, 8303658, 191787, 8069923, 275976, 223451, 8062668, 417561, 231120, 260691, 8032604, 456291, 8368156, 142984, 7966963, 462930, 493145, 375644, 8256599, 7919727, 8233298, 45637, 503461, 7935494, 188009, 267548, 138076, 8322009, 439061, 393194, 8012047, 8169144, 8135709, 8358808, 75134, 8062884, 8268316, 393206, 125364, 388152, 150047, 8349377, 167209, 8112696, 46681, 8327184, 197371, 8148034, 8227637, 159012, 8182340, 8031695, 427283, 99826, 407270, 248889, 7997488, 490146, 333956, 8166316, 406890, 409582, 236536, 325863, 8175549, 253667, 7892031, 8066558, 8118131, 502150, 8280045, 8248959, 8298824, 8182123, 8175107, 7985613, 8252767, 8303607, 7963167, 63867, 8274996, 8206100, 8003075, 67442, 8263325, 309113, 409654, 8085287, 107788, 8270201, 467956, 392861], -[8175451, 8327471, 8343702, 8238127, 7864737, 8053401, 7909809, 458929, 204408, 8354690, 352062, 7980075, 308252, 7886927, 109889, 8339857, 8277756, 8266231, 73366, 408295, 441180, 88089, 155530, 132528, 498088, 8023794, 8376176, 8368231, 345577, 501204, 8281257, 8060190, 7898211, 265179, 7863699, 7885289, 8089470, 7958820, 7991374, 8230594, 8187098, 8188288, 8212532, 158117, 341780, 158770, 7903408, 7928359, 8256433, 8158325, 7933486, 425943, 499694, 155432, 8323823, 424968, 93076, 98048, 410653, 299652, 108190, 8072027, 159026, 8238986, 8361202, 102227, 7910410, 142323, 465707, 27537, 190759, 8279124, 219828, 7940592, 335821, 8141115, 8009842, 8168082, 8125990, 8154604, 7876235, 18744, 249214, 8066969, 8297435, 504722, 8024310, 33384, 8261519, 8154043, 95270, 8348105, 446612, 138033, 434791, 8249579, 8000021, 8132706, 8309317, 522135, 100548, 7949864, 7954617, 495619, 122275, 257124, 8245125, 8077140, 509147, 105895, 306114, 7969328, 8142674, 469075, 8326823, 8295984, 121633, 406915, 153643, 227112, 48446, 7972231, 87890, 47331, 8297293, 331289, 482237, 8210407, 7947618, 8109875, 8340348, 318128, 122770, 7865582, 8077897, 520968, 8152914, 8272810, 8182619, 919, 373323, 269752, 7964594, 8319397, 7965295, 8029636, 318014, 8185981, 7910934, 8352145, 87760, 297584, 8366970, 193735, 300718, 377372, 240865, 8364377, 291095, 7986831, 15341, 4776, 8114748, 460719, 347517, 19401, 8223262, 7917285, 111415, 8233118, 206483, 360055, 326275, 506809, 8335802, 315551, 7875975, 8374021, 7883826, 8049863, 430689, 7920457, 297977, 8122257, 7879391, 214492, 159427, 164715, 7876044, 103470, 8010059, 32925, 8248296, 8226595, 8172214, 230780, 117643, 8174161, 305653, 151531, 164170, 7925427, 7924723, 241538, 114293, 210807, 380399, 260263, 8320062, 70537, 303239, 8117277, 246348, 8157964, 98062, 7967089, 8021605, 423009, 76518, 454169, 178669, 8341531, 7913795, 8234863, 512873, 413438, 67679, 8305714, 8273926, 8283823, 349526, 455571, 277109, 8306356, 438659, 8291013, 8203280, 8296358, 350381, 8074963, 520817, 115003, 7972188, 375799, 8251509, 7996218, 24143, 7884538, 8232577, 8087074, 8060782, 8198851, 332692, 8148893, 8007792, 256293], -[99626, 7990519, 7954029, 8198809, 438381, 7953174, 8168253, 8301695, 8373553, 8356913, 300596, 7905039, 476650, 7865180, 8063170, 7954886, 8289376, 459561, 8095107, 8168115, 8018534, 392074, 417560, 40908, 8207399, 7910172, 257222, 7924785, 8319020, 385093, 93175, 8379670, 8042105, 48444, 329321, 7902525, 517505, 8015472, 450319, 283660, 424240, 8370912, 8013632, 8220840, 235774, 8349723, 345529, 16598, 8010553, 324232, 419815, 8204462, 214687, 450811, 8113130, 136335, 7871434, 296386, 8345991, 8308038, 297880, 8080242, 8282473, 8310572, 522055, 8350659, 215369, 456091, 8040900, 110970, 312961, 8032508, 5703, 7868506, 61377, 184600, 183906, 8276901, 8218292, 7932962, 196268, 7873913, 8198117, 140329, 8312490, 124155, 8037439, 120445, 8293495, 8029075, 316858, 266661, 380297, 8365265, 5520, 7969759, 499375, 135004, 95045, 7934953, 305825, 7950134, 218077, 8192292, 388279, 407595, 330595, 8358237, 8314608, 480840, 107739, 8050555, 8309850, 444540, 174436, 148181, 8264821, 287272, 334990, 186872, 8124386, 7869548, 8236786, 8615, 7999209, 315828, 8055866, 7876173, 161085, 8369786, 8107246, 160240, 8364799, 354246, 175744, 249474, 8246216, 7900069, 270811, 246674, 8296440, 8351637, 8092571, 8241139, 7940264, 482864, 209991, 8294036, 8031483, 15093, 16704, 181080, 8678, 429935, 8083981, 7942843, 221458, 7860001, 343009, 293387, 343866, 271357, 8171081, 8332935, 7920391, 8037753, 306545, 8349040, 8218396, 8324433, 92776, 20527, 8301119, 8111287, 428678, 8106062, 290268, 93040, 414766, 392821, 7888856, 69180, 460480, 8270022, 192872, 8306587, 8352247, 232306, 235020, 7909681, 8373207, 410201, 25116, 96038, 8051682, 274135, 8349774, 8340712, 369008, 8368039, 7922973, 436291, 274626, 8326611, 8259315, 8174991, 62747, 506774, 363095, 8162520, 8199099, 342179, 413594, 8313227, 8308023, 8126211, 8125889, 146763, 106853, 7937615, 8171606, 198169, 179947, 303057, 74447, 8177335, 88019, 18475, 149662, 8317084, 209290, 8078890, 245419, 7951940, 519594, 8092416, 8198726, 7921864, 8334778, 7890642, 261635, 8302819, 8221068, 7926252, 7925504, 8288090, 7949903, 8099308, 130548, 440796, 7885102, 7952218, 8274829, 459764, 8190339, 275251], -[228570, 7908528, 380015, 521497, 8269079, 243549, 8172128, 107638, 8093749, 191674, 8142449, 8119252, 8164889, 7916554, 8310971, 217340, 8345969, 486822, 8269264, 343261, 8077289, 429432, 365734, 7893054, 8186367, 11838, 387293, 296052, 286078, 203367, 8248759, 156179, 7935236, 7909585, 135338, 8358847, 163947, 8119539, 241148, 434069, 8315909, 445593, 352628, 485857, 8327464, 8294769, 472031, 477252, 8001194, 162544, 111300, 8362787, 8104638, 8124056, 7949221, 7900901, 7894731, 8361245, 477597, 8063780, 60759, 474309, 8026461, 8257165, 111230, 115763, 7929994, 7876118, 8265028, 222113, 243333, 8092750, 8339646, 8069993, 8376317, 456333, 8347050, 8129451, 8320200, 50052, 473254, 7997909, 7940483, 8023546, 125127, 8278895, 510892, 274089, 126844, 290990, 8044284, 8099067, 8180776, 90620, 8288876, 467194, 8090816, 7968024, 8068674, 146149, 7869153, 8000730, 8329956, 8228057, 463918, 8338620, 8015227, 8034426, 249210, 8262548, 7867049, 8262345, 7946429, 8048544, 450860, 394742, 8056097, 424312, 8018549, 8226965, 8365715, 8140239, 382418, 8091441, 244236, 449428, 8222404, 8139349, 8341845, 7988168, 384737, 7869169, 7951056, 499498, 291939, 52756, 8278697, 8140398, 84732, 229974, 8106251, 59641, 7956616, 8331104, 8347064, 8006263, 8209751, 100780, 8181411, 244152, 286616, 8070007, 8099775, 57458, 344157, 46968, 8141379, 8372460, 252229, 8186812, 100580, 8091936, 8165430, 8258754, 415711, 8027920, 178714, 8091609, 8322053, 170892, 171751, 7969785, 369581, 419891, 406177, 8252367, 73298, 8095567, 8133075, 7923284, 343958, 7869209, 8273126, 8184441, 8312898, 8030096, 8103623, 155814, 119137, 8343697, 8202627, 343277, 474140, 518275, 8027447, 228642, 105361, 8171337, 3540, 8251103, 116841, 508787, 208044, 8212366, 475251, 400445, 7894650, 7863929, 8221343, 329976, 147350, 7967016, 8196585, 440186, 8067255, 164940, 263616, 7869852, 7938755, 8093070, 225338, 231152, 8139896, 373739, 521962, 7868770, 523330, 8146987, 7900664, 166072, 303774, 297183, 237820, 8161573, 8357175, 8339327, 8064311, 8271653, 8201955, 364048, 8131555, 8033061, 8288744, 8233456, 8179224, 8295254, 8076753, 7965175, 8235736, 7928000, 8071978, 8056627, 217745, 208726, 226159, 470219], -[8215045, 197905, 8018084, 8118239, 204621, 8291690, 7885171, 285637, 8332406, 80800, 413296, 8237876, 27423, 382990, 7911726, 231899, 349306, 8019461, 310637, 8023759, 241748, 105586, 100698, 183000, 499398, 394076, 184520, 7944851, 295745, 214043, 276622, 411601, 8073691, 275738, 133667, 459559, 8074890, 130503, 488711, 30423, 178675, 417005, 430296, 375125, 8178392, 21419, 8132094, 7938786, 4317, 8264476, 8323694, 414693, 255103, 512838, 8019116, 7891652, 8270921, 8373428, 8284368, 8280969, 136759, 356817, 174696, 505746, 7977114, 8329254, 225480, 8182731, 353677, 465892, 476680, 516152, 8186719, 393046, 7997340, 8348504, 8239493, 7859518, 8234850, 196492, 173874, 391401, 7898157, 383142, 7965718, 7898255, 405507, 7995118, 8277727, 8079646, 8366529, 210015, 8365928, 137191, 12490, 8053825, 108632, 7882841, 423863, 8171129, 64570, 481590, 238686, 8193598, 8266504, 7991439, 8321636, 8242336, 7982412, 320286, 135701, 8241428, 8230386, 8169464, 224364, 7975450, 305267, 8338856, 211007, 8144558, 8014571, 188566, 30421, 371421, 8128977, 8059073, 336, 74471, 507178, 7964339, 8374242, 252068, 143602, 376841, 310107, 117452, 8090877, 8149183, 400226, 322773, 211280, 198025, 523215, 157154, 120775, 8127886, 168343, 426985, 188353, 8285604, 89750, 386835, 487896, 8169682, 42822, 7985932, 8118903, 177936, 8057594, 356425, 8063952, 8030797, 214438, 8100960, 338618, 496995, 8253457, 8320409, 8176350, 99544, 8319223, 230223, 304444, 52730, 435599, 8182731, 222603, 8078191, 8369799, 8061044, 47255, 485037, 453279, 423711, 8170938, 8335464, 8322740, 8317355, 7945526, 8074085, 8336246, 8251469, 8159724, 7910678, 8229415, 8219170, 8065786, 389107, 7885218, 489667, 328968, 382351, 313962, 252521, 8325760, 76142, 8125496, 112058, 325679, 8285745, 7887811, 254691, 7887533, 8380182, 8358391, 507728, 7932662, 464056, 8358420, 8170702, 8202051, 132629, 8085090, 8105964, 8271753, 520226, 42859, 495489, 478325, 247602, 8127409, 131360, 85174, 350762, 137359, 8170737, 152869, 8295195, 8047013, 7953502, 393331, 365895, 142010, 8309742, 261700, 8282018, 251835, 7873284, 8337304, 371028, 393762, 464056, 370489, 8245502, 410321, 8321493], -[8266438, 8366627, 8118620, 8302459, 7936775, 8141273, 381382, 8277832, 8179780, 176065, 8318046, 235842, 371091, 8343232, 8152274, 435258, 422993, 25049, 159961, 8083907, 8201802, 421062, 341711, 164769, 8224031, 7930561, 408977, 8067488, 82288, 8294362, 7895161, 496009, 7911253, 65536, 100702, 168048, 520365, 8107037, 39838, 8213793, 294966, 7904510, 189859, 68885, 8219883, 8194322, 8244489, 8227334, 8054438, 8120708, 373080, 7881487, 42655, 8058016, 8214104, 298605, 406191, 247879, 7999094, 8166262, 7913799, 7880280, 182684, 154065, 8179064, 499070, 75154, 208243, 282361, 8311775, 74217, 8371381, 8156522, 7862581, 376717, 8143702, 8279800, 267167, 7956717, 8291699, 8040050, 69368, 415081, 423969, 8321886, 54099, 132355, 7902921, 38667, 269151, 33063, 512643, 521411, 481688, 140018, 369233, 8336333, 7859625, 394771, 8170781, 8032707, 7888945, 236264, 8246261, 353020, 21126, 343680, 398148, 409337, 223608, 450095, 426621, 7860215, 8327241, 8064865, 485729, 326253, 7891491, 92635, 8167601, 214753, 7928853, 8084232, 8085511, 239139, 8089949, 7875006, 62481, 78511, 21906, 75717, 126597, 185061, 8128026, 8132045, 336103, 8165891, 8293700, 152589, 185418, 8270043, 7932074, 7973558, 8142863, 379928, 8359937, 193690, 257703, 8143630, 8219588, 7878970, 8048711, 260256, 279562, 474109, 409616, 346539, 120899, 7880596, 8243227, 7884497, 494016, 8103836, 8298404, 57189, 189699, 461620, 94258, 8103549, 8070420, 133285, 8018587, 520042, 465954, 8347630, 8062057, 8110994, 8374857, 50450, 426754, 8135856, 273518, 7984901, 418586, 349957, 8371992, 132528, 8312997, 52367, 8012340, 8163577, 8198607, 22182, 7952626, 7934588, 429050, 8191646, 8307317, 508881, 8017450, 300922, 8111404, 8140728, 8303836, 7876242, 7988666, 85511, 8323396, 242488, 8052156, 7944717, 8111725, 8320227, 195838, 8195235, 181109, 8073754, 7304, 487036, 8257152, 8362410, 99698, 8246659, 8268905, 43853, 381192, 8213404, 177011, 268867, 8043948, 8330932, 428717, 8352410, 339698, 54741, 198195, 7871582, 7864647, 8021781, 196449, 8089946, 8040271, 8264766, 8287579, 85378, 7998931, 242695, 513965, 381853, 8236285, 8069524, 312404, 8082375, 186902, 416893, 8351141]] -||z||: 523330, ||z|| check passed -r0: [[225638, -155961, -80311, -190869, -231574, -82718, 42093, -197127, 193792, -238389, -213886, 73496, -192069, -124892, 187756, -108507, 5562, -90265, -45155, 236758, -180132, -103593, -170601, -94461, 251485, 32470, 46842, 81174, -175921, 89519, 29023, -183355, 149840, -147145, 260348, -87031, 248796, 139629, 53842, 73404, 48740, 126306, 156496, 188704, 116593, 234283, -222808, 223216, 175695, -86067, 49641, -96165, 155330, 15108, -187164, 123073, -77916, -133062, 131161, -27282, 191461, 116566, 261604, -211635, 213649, -38267, -81087, -129904, 108482, 97342, -26356, -208258, 259839, -155661, -94781, -232390, 209415, 199785, 130870, 156070, 51508, 61265, 201649, -247437, -261045, 96500, 231178, 171887, -82693, 151924, -119864, 240048, -176812, 244194, -126822, 261751, -178809, -135169, -74771, -71144, 147148, 108151, -174682, 92448, -260952, 129173, -87941, 233739, 37713, 247061, -93258, -54770, 243949, 154196, 200426, -72448, 139048, 45020, -47716, -69579, 91519, -148831, -50102, -243748, -92198, -181481, -102899, -223602, -261315, 22164, 245155, 54721, -71047, -58255, -168199, -29172, -189186, 200400, 159181, -59058, 225461, 117859, 79763, 60959, 148997, 45774, 168550, -185017, 104046, 231786, 89592, -94175, 170850, -14397, -229674, -61160, 52196, -107245, -251949, 43677, -152237, -197606, 198228, -213498, 151780, -244761, 60153, -156584, -83863, 5788, -71979, -158938, 132620, -142972, 224044, -142538, -249571, 67518, 225612, 29222, 155509, -138515, -242986, -175981, 158625, 46424, 13358, 8006, -201237, -248326, 75950, -116696, -20461, 203786, -175731, -199935, -12085, 52467, -249653, 46877, 203319, 11781, 159069, -245724, -251225, 58734, 52401, -18617, 138357, -80076, 219490, -208640, 165746, -166244, 209104, 111425, 192619, -245030, 241491, 143476, 220734, 134158, 81734, -234409, 258635, 184971, -26290, -95938, -200926, -202390, -109611, -86306, 203263, -124349, 246161, 195085, -75652, 191469, 96315, 131739, 178970, 69618, 40520, 185094, -57734, 43584, 170695, -37186, -44268, -170962, -41858, 140880, 85985, 177227, 186440, -106956], -[124293, -243257, -17036, 174953, -91549, -201643, 76303, 159004, 244267, -135451, -108447, -151911, -40014, -55648, -78483, -17366, 65566, -144631, 41639, -241769, -216291, 150088, 143600, 164123, -83652, 94158, -136073, 54748, -191381, -122364, -243159, 241804, 55323, 252771, 157732, -101837, -160271, -164171, -218272, 42, 79907, 32393, -240458, 57539, -76552, 236550, 60791, -243438, 214057, 86635, -191800, 186659, -135703, 34448, -32021, -255679, 260906, 68464, -158621, 220261, 244274, 250090, -251683, -121654, -118287, -203718, -146435, 27613, 46956, -184772, 251919, -22022, -104677, 180086, -243733, 140112, 221376, -36073, -8171, 224408, 255624, 170756, 8113, -152191, 211337, 238421, 22291, -50378, -245718, -113440, -155856, -210397, 55463, -240949, 125792, 216398, -253656, 138177, -127664, 29416, 68850, -217656, 23266, 67284, -154717, -228274, 185722, 146164, -142874, 133247, -133795, 63595, -174650, 119683, 156344, 165385, -188745, 186440, -243402, -142223, -93417, -207060, 167690, 127405, 192272, 92816, -209348, 133800, 34216, -215217, -29905, -33740, 213977, 96470, 27516, 187782, 104255, 77768, 115558, -254946, 212595, 88988, -102293, 16799, 78127, -240194, -164998, -6356, 43335, -40, -164801, -236359, 26133, 54102, -56653, -179770, -39059, -47057, 48382, 215094, -247708, 141992, 111958, 38134, -95072, -1483, 111228, -168783, 114868, -98365, 97063, -23364, -67566, 220373, -93549, -42478, 80232, 135927, -244824, -41913, 185644, 136401, -5351, -166933, 143603, 98956, -46164, 24440, 254059, 103179, -129434, 251951, 9289, 180287, -86420, 8837, -246694, -154440, 55233, 147569, -138093, -217696, 64247, -249539, -250097, -106815, 123912, -197409, 32725, 137510, 83027, 1584, -244744, 250940, 2848, -216079, -146832, -147402, 84582, -254634, -161688, 184400, -47469, 223969, 211414, 242768, -4557, -153578, 197731, -144274, -108564, -79726, 125038, -77654, -149905, -174959, 4785, -91695, 185594, -53754, 154497, 150709, 202250, -28336, -78841, -9687, -250380, -8927, -61163, 111534, -141167, 99629, 120685, -110712, 24668, 101675], -[-74537, 66408, -35156, -256793, 170130, 3317, -191814, -131650, 47591, 21462, 199279, 229377, 24441, -255474, 230610, -208745, 234822, 22039, -88500, 168021, -132646, 255556, 226448, 159358, 210343, 253922, 77710, 112152, 37355, 84856, -181607, -42214, 204055, -43981, -182823, 41524, -128088, 62388, 182899, 9539, -227158, -144231, 237016, 19865, -131164, -191583, 107858, -48039, -172368, 140300, -187344, 125733, -259620, -204393, 95827, 157014, -102897, 33072, 74468, 76468, -136263, 127484, 194738, -107007, 210118, 105462, 74557, -75951, -204675, 29510, 65034, 241468, 109766, -140001, -18904, -7718, 157912, 216193, -155732, 195296, -163318, -98946, 82341, 69529, 160807, -152190, 45705, -220196, -172979, -189542, 86379, -4480, -196883, -173453, 135256, 129220, 213572, 87463, -211577, 35636, 185695, -225514, -60275, 245952, -258000, 141612, 21617, 185136, 67518, -23645, -123709, -237498, -214293, -78334, 250123, -197907, -24019, 231294, 660, -18393, 14126, -70128, 16675, -85596, 193573, 185676, -250416, 846, 40851, -34030, 93837, 183192, -62419, -82295, -192015, -27170, 156528, -151197, -118493, 87800, -111380, -204655, -93090, -116990, 112048, -1940, 67940, 71064, -222265, -156856, 92864, -259513, 125414, -170116, 173727, 152560, -52318, -21245, 161094, -189289, 36720, 54303, -39840, 60073, 138506, 125578, -81262, -82470, -83118, 89351, 35239, 139608, 44561, 171943, -48893, 124760, -260733, 55568, -52709, 74185, 256998, -28870, 176127, -209730, -218796, 152942, -7624, -221101, 77487, 162420, -232849, -123458, 119103, 160220, -187160, 181599, -143195, 78820, 102892, -211399, 11229, -221665, 144138, 93674, -151234, -116000, 124077, -64082, -110955, -44225, 239619, -183272, -110710, -235890, 28351, -35738, 3276, -41630, 161967, -164001, -57530, 108705, 103122, 111778, -130113, 63611, 75153, -190059, -95380, 81379, 217029, 172054, -80236, 258191, 157144, -6425, 60380, 172228, -191453, 247768, -37974, -64965, -49347, -117541, 113300, -193809, -43029, 251475, 142582, 155588, -148907, 233246, -15840, -3599, 22048, 155391], -[50500, -800, 224124, 50956, -95880, -88359, 92133, 70745, -203043, -129129, -112303, -142464, 76740, 131881, 483, -48816, 105420, 32392, -196720, 226457, -169952, -28332, 97895, -108049, -145093, -66817, -162315, -147514, 98255, -96506, -171523, -23743, 40637, 12268, -114126, -118654, 20865, -71753, 156752, -47985, -51015, 9180, -165975, -133655, 130865, -195488, 5843, -153492, 37684, -214447, -238822, -169552, -70590, 95237, 256000, -69149, -210961, -76076, 178290, 249129, -175278, 252, 66485, 170968, 44180, 46502, -122447, 118498, 57592, 141853, -71802, -120581, -190323, -36392, -43884, 86747, -3215, 241683, 83495, -124957, 215153, -68226, 99003, -249256, -36593, 40077, -117136, 158269, -211897, 130930, 60364, -44810, 188824, 165957, 103533, -76830, 160344, -22482, 58711, 94323, -133355, -244300, -140853, -70197, 47224, 210428, -30294, 22246, 4534, 70472, -93390, 141530, -119113, -138692, -204583, 206728, -63590, 121839, 103551, -21099, 128351, -140266, -161006, 90606, -41708, -3449, 199106, 76148, 130564, -257358, -128782, -252097, -99109, -6531, -132966, 84636, 34957, -117963, 35375, 243159, -71273, -208489, 199756, -162948, 10362, -222345, -178684, 10926, -226798, -180494, 96855, -247806, -54087, -133797, 120924, 121926, -48334, 9839, 11591, 153941, 115735, 104185, -43388, -33975, 29207, -162679, -231034, 36082, -179408, -49452, -259423, -75847, 228284, 249066, 202184, 206765, -45600, -259609, 73789, 23859, 59230, -39142, -249883, -261238, 254973, -27667, 232248, 3748, 231766, -145695, 79665, 52694, -213981, 123586, -187483, -166290, -236386, -153940, 166952, 171700, -34479, -245848, 109028, 64531, -130043, -73458, -65728, -235187, -252739, -235347, -173141, -124731, 146145, -206753, -201332, 96526, 173138, 171103, -131829, 65135, -88999, -34181, -157474, -15820, -11845, 65904, -258799, 221598, 78279, -20691, 116464, -197162, 209385, 260548, 64670, 79104, 196314, 146900, 116554, 45072, 257221, 82430, -255882, 133481, 179061, -203048, 37219, 186923, 193512, 181950, -44470, -39675, -90442, -193260, -155833, 203487], -[206901, -14083, -13521, 18912, -82282, 120605, -31686, -10104, -209796, -69511, 148469, 142911, -122721, 223149, -232004, -255672, 117906, 57949, -47065, -72237, -34780, -59268, -116436, -82766, 100388, 50662, 13850, -212950, -177117, 204855, 195580, -57488, -90374, -147770, -217272, -73591, -136984, -208858, -77525, -14166, -161967, 45164, -133312, -68435, -3805, 66116, -152899, -142849, 95162, 121845, 174053, 23145, 34293, -145514, 241019, 114323, -256684, 90538, -200353, -248049, -57617, 197705, -245487, 166869, -44336, 149405, 113438, 95731, 136471, -222937, -63934, -180467, 253496, -227622, 72853, -211416, -152236, 209452, -109931, -172537, 2452, 180440, -226783, 207803, 223851, -120271, 197117, 246491, 125191, 193697, -139307, 232357, -125532, 244463, 2171, -50951, -115704, 205269, -77425, 108652, -217174, 78881, 211773, -110022, -192599, 233068, -158903, 176729, 49775, -242183, 221303, -193289, 158436, -10085, -189587, 26127, 49968, -134862, 252153, -64461, 5163, 45466, -48158, -76540, 194544, 73892, -3622, -245534, -27293, -189902, -228775, 35537, -89969, 160391, -58281, -102775, -212558, 200623, 33314, -156799, -1828, 236335, 258268, -168853, 85281, -16639, 12950, 248372, 83019, 20132, -247874, 231777, 177318, 184148, -54752, 253913, -203257, -170937, 160743, -136691, 161186, -187701, -231384, -52452, -31659, -155556, 211714, 248201, -2759, 144713, 177901, -42749, -69701, 212882, 65665, -4870, 21424, -219842, -245469, -179269, -69257, 131404, -21337, 219726, -205087, -42018, -77502, 258651, 1633, -148281, 2522, 131155, -205019, -104846, -149301, 200343, 48372, 188055, 240922, -85784, 120817, -58406, -256351, 85805, -41847, 120225, -63576, 43354, 159822, -83815, 95540, 139200, -174868, -143502, 227475, -55664, 9519, 184181, -12435, 260968, 196640, -37133, -92811, -103185, 8375, -166186, 11968, 207053, -257538, -23481, -101655, -77880, -25618, -19196, 34897, -120212, -106486, -79525, -218285, -168973, -79212, 181014, -148885, 248658, 138860, -193827, -53372, -155855, -160910, -147198, -29289, -35155, 174489, 86782, -187746, 188479], -[-208916, -211198, -184884, -154552, -111659, 19343, 34387, 174667, 15324, -63011, -211684, 122973, -187534, -216153, 237463, -24191, -1233, 137209, -214029, 64566, 173780, 244855, 59400, 135660, 222101, -57712, 243790, 158650, -18101, 133512, 83494, 50897, 137045, -153742, 85484, -208393, 230696, 27794, 195482, -173657, 258245, 39380, 5433, 213418, -14097, 45471, -256727, 209497, 59852, 191166, -181280, -96533, 252741, -13652, 31292, -197423, -33662, 11308, -202094, -232320, 210738, -22107, -252982, -183995, -25297, -63615, 233526, 86674, 83591, 71095, -23427, -88134, 9664, -192224, 242947, 239589, 226975, 202587, -159942, 232491, -13256, 246439, -88612, -81265, -136483, -79508, -257193, 26890, 255569, -184419, -179965, -178838, 247007, -12359, -78009, -97226, -85073, 132939, -253601, 97631, 195915, -52228, 125542, -219427, 209953, 105547, 46490, -257592, -208287, 229304, -45790, -179904, 21415, 58540, 4692, -258093, -5069, 181579, 53965, 252871, 181958, 256449, 50531, 229505, 259751, 64910, -126821, -18930, 155411, 105175, 98390, 246037, -192138, -200482, 251901, -91834, -133140, 172326, -26827, 123458, 109313, 26438, -218227, -243392, -254457, 29565, -234671, 175582, -163484, 42579, 99036, -232308, 126115, 110067, 156917, -176452, 101231, 128873, -212824, -117891, 250585, -219202, -38612, -183647, 135863, -188820, 106035, -77423, 63256, -225584, 32117, 74792, -235030, -151198, 214325, -259391, -190164, 91312, 208464, -67059, 42596, -225005, 196306, -206216, 11094, -80605, 79261, -113952, 221904, 261199, -146799, -116602, 104331, -209162, -26930, -185778, -72991, 101578, 133907, -12435, -1973, 45575, -123718, -162763, -45932, 188357, -16240, 15044, 86140, -53489, -1883, -257260, 46899, 38472, -90024, 190145, -229420, 149285, 10948, 106636, -81749, 255033, 48319, -246796, 175034, 61403, 17906, 223431, -95909, -256619, 128134, -46379, 37782, -147853, -248009, -95795, -255811, -55283, 29600, -88166, -151478, 1784, -174257, 15456, -206767, 52353, 240138, -185700, -92387, 206572, -9007, 233583, 228753, 220765, -199862, 105214], -[-247852, -222386, -225130, 3337, -204834, -184343, -222267, -225087, -150285, 224006, -127784, 64749, 227728, 79551, -55721, 2130, 132985, 88603, 98822, -88138, 175758, -6987, 220176, 159504, 241791, -156831, -230962, -79175, 200130, 180589, -23244, 34114, 121673, 228622, -106135, 46971, -132409, -13001, -144557, -229011, 51824, -229731, -27887, -256425, -1705, 96741, 100723, 80757, 52771, 236410, 211430, 144805, -26770, 64021, 35810, 213681, -18740, 85388, 24444, -71257, 115648, -85188, -24611, -222276, -18118, 177041, 50062, -157931, -154500, -21141, -139777, -56548, -8023, -34043, 99804, -17094, -55860, -166974, 90666, -216260, 169077, 158786, 59939, -168227, 148561, 25746, 253480, 131675, -156856, 108726, -221307, -6654, 256777, -138780, 149345, 35113, 234808, -80295, -23129, -72266, 193527, 101131, -223360, -208804, -997, -67025, -246252, 195344, 47384, -151084, -204088, -233584, 70956, -116326, 70393, 25662, 85319, 113167, -140936, 3938, 16448, 131037, -221364, -233780, -208024, -228160, -232225, -164645, -37375, -221122, -203538, 191438, -80903, -198103, 54720, 171128, 91032, 209596, -117273, 202681, 55524, -206729, 106782, -177608, -108491, -150785, 168237, 136179, 93263, -197802, -89478, 171063, 113188, -108017, -48629, 46383, 224358, -95254, -176682, -165746, 117136, -92090, 104012, -160827, -66122, 237802, -16902, 29801, -18843, 224910, -97302, -87257, -84038, -43414, 46773, -4341, 125033, -58982, -71961, 150905, 218691, 76320, -130580, -223063, -175760, -156422, -125571, -35552, 192888, 159872, 124951, -54480, 139849, -181179, 206650, 162543, 234377, -174829, -171410, 163125, -14167, 184024, 134348, -151785, -166408, -101142, -153779, 226739, -135764, -199523, 32897, 102296, -200462, 15559, 173393, -155649, -552, 252037, 47912, -66948, 157903, -226186, 10992, -57275, -65849, -12569, -92689, 259504, 31612, 243584, -227314, -48073, 126132, 72304, 99144, 9889, -132025, -122413, -234294, -189345, -72103, 12866, 40029, 131709, -143217, 103536, 194531, 194112, -20638, 118407, 203498, 146274, 241674, 32314, 243766, -67124], -[81173, 202654, -244494, -196441, 193069, -75423, 232594, -42678, -241539, -210496, 12247, 172335, 248360, -20987, -237357, 114989, 24279, -251241, 56838, 79676, -100441, -123981, -201539, -214783, -39959, -11818, -203065, 65954, -145783, -201957, 44203, -115283, 100651, -154589, 30366, -182158, 137763, -132742, 72198, 13468, -87890, -223434, -88855, -238071, -29494, -189021, -55984, 205806, -96652, 74059, -982, -236827, -7041, -243168, -223646, -37442, 157227, 162614, -97014, 128727, -178809, -157509, 22726, -195148, 172660, 44063, -187463, 45707, 214727, 174933, -157311, -44654, -176042, 69273, 244194, -215821, 197347, 102741, 246202, 161834, -16072, 233081, -237441, -218476, -217107, 226396, 194351, 51137, 145391, -141723, 143835, 135178, 138956, 85599, 244202, -95100, -40968, 9984, -97723, -141338, -89529, -11300, 197080, 72245, -95551, 7942, -164712, 44534, 90757, 174406, -29858, 3964, 31980, -206824, 78581, 13204, 142425, -50266, -122189, -58467, -205786, -76109, -172387, 81681, -181523, 68738, -167619, -83948, 186136, -102536, -108593, 106226, -225780, -2170, -54756, -17277, 187625, -259343, 5971, -77581, -10386, 71354, -240414, 154764, -175206, 5912, 21773, 237309, -67270, 235974, -125481, -6046, 81176, 56056, -55444, -65107, 92283, 49182, -211482, -125504, -34056, 252382, 71185, 24393, 128287, -3525, -191883, -202013, -135399, 81491, 145485, -105745, 68066, 260431, 140314, 34675, 185307, 59653, -135719, -15925, -169292, -71993, -84027, -93769, 125458, -164712, -149272, 192563, -258102, 236779, -255292, -41506, -30989, 220221, -149332, -145941, -15668, 3453, -159436, 122831, 250756, 180733, 67893, 27672, -61169, -98320, 87231, -21084, 130356, -67369, 31593, -208716, 16929, 105057, -28377, -8515, 164937, -87727, -239961, -62992, 50163, 200301, 230097, -158426, -164448, 195457, 123895, -165257, 219639, 144333, -130116, 17032, 145817, 169137, -234243, -108696, 159994, 127052, 197936, -35562, -96752, 62300, -194668, -45302, -258309, 92941, -235767, -94572, -170682, -25587, -239018, 143093, 187341, 27154, -108064, -191847]] -||r0||261751, ||r0|| check passed -cHat * t0Hat: [[577749, 3674133, 5215843, 7770993, 6537923, 7894377, 3243672, 4906500, 2387055, 2857335, 1515599, 1240700, 1252426, 5262204, 2960300, 5632023, 1237630, 1227154, 4466969, 1197822, 6484606, 5796270, 6052986, 7140244, 6305792, 2087363, 5256597, 5589909, 909490, 502850, 7605849, 4797451, 3016239, 5897221, 5181140, 480103, 7991873, 3966017, 2446817, 695242, 204307, 3154813, 3211123, 7054802, 551994, 6388207, 3210107, 8236757, 3138426, 226025, 4976708, 7479815, 5980682, 7006047, 6932206, 7969260, 2977307, 6038300, 4285792, 379226, 4742795, 6102060, 6087994, 5346990, 7630136, 4142301, 7208880, 848222, 6848515, 4153059, 5690663, 6285810, 3858178, 5152896, 7118158, 5392830, 6220351, 1502983, 4895718, 3798879, 4345595, 1485562, 5151020, 2770362, 1253292, 3075663, 5138191, 6762800, 6216209, 2233125, 5518837, 1041997, 3120018, 1393563, 6101760, 1126454, 4450218, 5707194, 4493933, 5054391, 6151828, 6229402, 2701171, 6117775, 370151, 770848, 407097, 7357327, 7937854, 1751938, 1519167, 6694533, 4022853, 2224180, 5860209, 6205760, 7735731, 4163406, 4291909, 7121091, 1403980, 4569002, 6153086, 6861162, 3405677, 665188, 3791228, 2433974, 4216279, 3243437, 5923294, 3202329, 2426620, 7682265, 2496212, 2616792, 1279, 4764653, 3818944, 7318712, 21502, 2392371, 4831915, 134912, 1609776, 6374233, 4770995, 3247586, 4917764, 7472522, 1889951, 2842905, 223328, 1840101, 7770513, 6074952, 1543034, 2998185, 696685, 7503235, 175489, 8130340, 7224532, 3000942, 3304967, 4123231, 3102994, 325417, 6892178, 5607504, 8097551, 7256301, 7831999, 2263081, 764258, 3902795, 3649135, 572109, 5493196, 4468641, 4392724, 347393, 7473022, 4111867, 7935837, 138414, 5149489, 1099462, 2320524, 3234678, 3095212, 12950, 6065647, 4555623, 6882453, 7518610, 4680123, 3645144, 341823, 7891480, 7581933, 4286429, 6254828, 2163816, 2501799, 1948589, 1981031, 3922543, 3436830, 1009591, 2151473, 3195842, 2929617, 1203519, 7934149, 4663061, 434227, 6573159, 6696623, 5566055, 87275, 1754817, 4284582, 7526317, 5833316, 7609691, 3878233, 3397776, 8050783, 7815015, 2606928, 2938996, 3195872, 3106599, 1075000, 5304841, 3546391, 1178180, 427314, 5119597, 3569952, 2389934, 3817434, 5117178, 6118203, 2148594, 129724, 4894518, 6247396, 2353950, 2002920, 8344418, 848205, 755020, 7488295, 5200839], -[2563568, 698016, 6538610, 4956750, 1440496, 1796235, 5269467, 4775608, 3456628, 7946009, 3306269, 5383673, 7515170, 3464237, 6782538, 3138448, 3890077, 6739586, 3042863, 1034341, 4283959, 2999656, 7721261, 681490, 7211398, 8287180, 5092797, 7994402, 5752896, 3503428, 4671798, 3021649, 4725999, 99096, 2207869, 110100, 8273825, 3290310, 127799, 314715, 3164276, 4737986, 5241240, 5823525, 1517017, 5040948, 1661928, 7957427, 2413362, 4621679, 3638638, 5762090, 4606232, 961310, 1132640, 8252521, 817039, 5098617, 8164175, 6313491, 6938600, 3610687, 8011951, 7362278, 4437489, 697350, 8227444, 7059911, 6872095, 3519021, 8255662, 2869194, 6089608, 5620147, 2498353, 2604690, 1641584, 4229211, 5046571, 7634018, 47139, 5799624, 5276685, 7746842, 7674190, 6906804, 6229520, 2289197, 1734087, 736604, 588995, 601134, 2711489, 5940381, 5265688, 4065557, 7508403, 4778380, 7814004, 4428183, 1350431, 8312120, 416686, 1494579, 3183971, 4947977, 1636388, 2975837, 4782081, 5512317, 668659, 7389281, 3654947, 8304785, 5291478, 4464250, 1908465, 138934, 7256520, 7408341, 408412, 8120267, 595283, 1836795, 2956818, 3419154, 2460821, 1199707, 5782501, 1828688, 665202, 7153299, 4919008, 5098577, 7521143, 7194003, 4372411, 201738, 4675948, 5753305, 7805758, 995106, 2937941, 1153659, 5975663, 4866231, 2226055, 6035152, 452033, 7087762, 7397957, 8181909, 865454, 5012374, 6342005, 4484045, 6831397, 5632037, 4018596, 2810504, 6996366, 4349039, 7689700, 8255910, 1876734, 2562136, 7461303, 5025355, 6494348, 581785, 3535654, 1438665, 7811533, 8268397, 2931234, 2651, 7046645, 5481545, 2187605, 3036539, 1573722, 3060420, 4143773, 2795153, 6247640, 3361727, 3691362, 4150099, 5747806, 561237, 4272501, 4931381, 4958003, 384773, 5239205, 28753, 2586241, 3491006, 7065944, 7965398, 1795175, 5789595, 6876585, 3027452, 108644, 4581376, 6573387, 2159217, 7297294, 8229903, 2402890, 4779990, 1670071, 8192678, 2529419, 4455957, 7746801, 1035517, 7093219, 5258157, 6943766, 2469213, 397924, 3606085, 1223572, 2865502, 6623108, 7335340, 1700488, 623010, 8181584, 5097814, 7220452, 8134214, 2701890, 2337795, 2134715, 4468301, 7371778, 4041999, 4806299, 3140697, 7363120, 7398600, 1256998, 73309, 3754945, 1859985, 5362427, 4958530, 4569081, 7794546, 2046727, 2393623, 175646, 7213918], -[6406345, 2079085, 3455332, 1110040, 3764750, 4591676, 574943, 1656558, 3238316, 3750471, 437701, 582683, 5170508, 231716, 3535129, 7455188, 962326, 5651324, 7142290, 7775223, 228123, 4735259, 4299630, 2006836, 3792000, 5945326, 7228389, 6478963, 1476332, 2394299, 8274124, 7650769, 3880125, 4723905, 2832544, 5412528, 1760900, 4613923, 8312074, 7078874, 1924164, 4545424, 265972, 1371523, 7794488, 8104751, 6583105, 5043968, 3155859, 6834215, 4906058, 1909348, 5261004, 2587634, 6365120, 2606234, 7305934, 5529342, 4263930, 3744474, 3381471, 5816542, 3976428, 227316, 1756718, 21872, 4675992, 8103552, 5341221, 842028, 4754767, 6259749, 5242039, 4165665, 5473528, 5435317, 1155502, 286520, 1497844, 7076279, 4495098, 1597187, 4559911, 8325176, 3859975, 7172392, 3689009, 6806284, 411219, 1902630, 8287558, 6391745, 4762564, 2285862, 7978596, 1518574, 594658, 3468199, 264665, 7290347, 2587565, 3551022, 2829323, 5483766, 1970812, 1512859, 1731298, 8223894, 7414663, 3292779, 4192585, 5791046, 4914200, 1306065, 5791007, 7656557, 3778437, 3844413, 7923081, 7217121, 6081382, 6531443, 3307522, 5932603, 6610376, 405069, 878375, 937896, 6119022, 6018754, 3720530, 4279470, 3766534, 215279, 3249569, 3041017, 2074183, 4293526, 6463938, 3734199, 3673082, 5083122, 2830636, 6070483, 7595732, 7711012, 6046199, 5276057, 3819661, 3549495, 8369997, 7439619, 1802076, 7964481, 6658570, 3060587, 2551190, 5796116, 204508, 7111173, 6740352, 1463606, 3168707, 2797925, 2163669, 7240385, 1422769, 5629465, 7825177, 4800993, 4318603, 4440750, 4460448, 507279, 6449272, 6794658, 8337644, 611409, 6994689, 6707955, 5162066, 4482619, 4348895, 7551834, 8213541, 8066966, 1207868, 5210332, 2868246, 3734999, 1059599, 779987, 6382411, 1609395, 7741198, 5599065, 5910532, 3006189, 5834483, 7178842, 4976941, 1910273, 4359130, 6088800, 7301113, 4592142, 6817864, 6014691, 1015879, 1551478, 7813214, 6656629, 5492649, 8197096, 652317, 345080, 7575278, 326735, 222898, 8354557, 7875087, 2651115, 6124294, 271945, 7348099, 7822345, 4342179, 7372873, 3339882, 6469174, 5643816, 5258848, 313807, 2194920, 1925583, 6494600, 1494069, 5514168, 7465146, 1898541, 4561584, 3554537, 5205175, 4150046, 5901558, 3773982, 7281741, 1453443, 8096812, 3342692, 5972187, 1294242, 6848206, 4828194, 3419560, 109041], -[1664740, 45733, 5300608, 7326685, 2428234, 5319835, 5979853, 2802108, 1040625, 5242865, 2795945, 4944742, 3162981, 3778336, 3867974, 5890692, 6019215, 1530009, 7236425, 2669080, 2239705, 4541183, 2722500, 3708753, 8336179, 2665567, 4431953, 7664831, 397730, 2968197, 4431029, 6576178, 5867326, 1846479, 1805389, 775327, 5709968, 4559208, 5374695, 3775207, 94233, 7064743, 6163882, 638458, 5063738, 7138349, 1393161, 5375606, 4784383, 8294111, 2877924, 6018153, 7458178, 6114196, 3830654, 4433134, 1816015, 3511151, 1465507, 4375449, 2634677, 4486479, 40408, 8197246, 1578915, 7008501, 5378610, 5886005, 240224, 1868431, 2353651, 4843982, 3021940, 7810337, 5547622, 6146728, 1673216, 1556518, 1085718, 6437365, 5455922, 2455738, 7131409, 5570779, 4423301, 7198541, 6710391, 3808173, 6622453, 421757, 5557737, 1156941, 1317196, 163997, 3520052, 5887485, 6698878, 6692460, 3909638, 4081445, 8007718, 5561632, 438742, 8265020, 1642530, 4431573, 6407859, 3964710, 6708975, 2370105, 5807402, 8055568, 2373865, 4690191, 6287215, 4621583, 294279, 2542396, 5936589, 3276087, 2541094, 7670760, 2897531, 1553540, 7028989, 377916, 7732227, 2594886, 4610894, 1874241, 7370954, 7084454, 1048718, 5430455, 6378227, 6277828, 1542227, 1427952, 652150, 7249349, 7418705, 7802902, 2263617, 4080662, 5230778, 5450601, 4724151, 882273, 5076635, 1692637, 3876318, 7925965, 7789841, 375774, 3588529, 2151473, 6036047, 5839074, 5233057, 2608399, 3331834, 1540004, 1459070, 5908015, 5321984, 3904902, 1523777, 3029522, 414872, 3636857, 3424295, 6715553, 822036, 7877098, 2736507, 730648, 5700649, 5280944, 6280577, 6291111, 6088962, 5634957, 1354764, 4410571, 873483, 7496934, 7369920, 2913175, 1214916, 2287447, 1072004, 6042219, 2245294, 2006176, 7575094, 2881501, 3547798, 3228619, 6206203, 1695038, 2412897, 3154093, 1171422, 7104935, 6047109, 3204042, 7746105, 7575712, 7010268, 3006612, 7106563, 1684685, 3119736, 374972, 3375092, 7750765, 5465141, 6032891, 1764371, 4818805, 2716794, 3311642, 967528, 3728887, 4661127, 248679, 4844607, 1624631, 5681820, 4857290, 6054516, 2538488, 3795973, 792711, 4812556, 942372, 272392, 6832661, 4837242, 2280277, 7660765, 1348111, 5757031, 8205116, 5604355, 1381774, 200678, 7994105, 3728050, 6509014, 589334, 3997883, 6780419, 8117018, 5964166, 4847648], -[254024, 1527086, 5767916, 1198641, 4753235, 7363233, 4452551, 6429845, 5889893, 3441751, 8235121, 1409317, 5136004, 7473477, 151190, 3200683, 2745105, 4652879, 4603473, 6119205, 1086746, 3180773, 2267109, 7621996, 1475368, 8091457, 1544094, 5217032, 1897192, 2737302, 6457483, 6750275, 1212622, 5622820, 6775072, 1940874, 3310844, 5939292, 5999199, 3182647, 6810559, 3119731, 7630241, 7202179, 2407319, 4353074, 4685970, 8293814, 1913074, 6487891, 7586814, 1211092, 3875668, 1431261, 3040586, 596943, 937293, 10546, 589913, 4824796, 1863979, 842515, 4799583, 6036502, 2702572, 5031070, 1173203, 4587535, 1182855, 6354803, 404038, 8316637, 7688906, 3351862, 7457068, 2669682, 7432944, 851519, 1730552, 7864803, 7590924, 7263502, 3132107, 6804213, 4023401, 1881223, 7421930, 5104442, 4190674, 5491575, 7637109, 5253413, 1101875, 1256453, 3267570, 453815, 6700392, 3683900, 3753837, 3938952, 1448626, 2365188, 6260742, 7192976, 6964136, 2630820, 2934210, 1905007, 7688018, 2720922, 1610131, 948412, 6241966, 7058639, 2503164, 6381195, 8194437, 5650759, 6656272, 1346489, 3122121, 5598944, 3243589, 4162453, 469295, 5896652, 7510459, 5614126, 2114180, 8317157, 2079747, 3973278, 6238229, 5995887, 439269, 4398464, 6832982, 5634941, 5990194, 6594594, 7737592, 7421706, 6165926, 5158341, 2464616, 3985296, 2008162, 78793, 1536530, 3510782, 7058396, 1689450, 2165597, 6560836, 608973, 870794, 1405880, 5848895, 7477365, 7772893, 913489, 7343783, 6281318, 4015277, 1851123, 5736547, 2261099, 3364282, 1321804, 2945627, 4462269, 2530879, 2940567, 3714922, 7075005, 776546, 1050434, 6061629, 2570677, 221545, 5670436, 4008473, 4239431, 1527805, 1349528, 5814479, 6365512, 3185071, 7693442, 5657825, 2408506, 3762711, 3717596, 4289823, 6383076, 5389994, 988051, 364480, 7722842, 5396829, 3595569, 1231803, 3048027, 5966211, 4686213, 7124596, 6256920, 4506567, 1739078, 5349114, 3165832, 986440, 2393918, 5951210, 16928, 3297028, 7920446, 5286222, 1083643, 4260833, 6190402, 1472453, 2031711, 824068, 1281240, 1116964, 3233690, 5065313, 1219209, 7458916, 8173530, 8099640, 3818342, 4489857, 2598877, 126636, 1160535, 3755760, 3652263, 198385, 1295993, 1352051, 4846782, 3565886, 1622825, 3636705, 6342228, 441797, 242626, 3609575, 3711712, 4101217, 4939606, 3672416, 3401539, 27186], -[8222758, 4746286, 650083, 7601364, 7398768, 3179879, 1081127, 3218138, 8194920, 7764806, 243324, 5595132, 5771329, 3594582, 6697011, 6392735, 6216660, 1740734, 717432, 2702604, 1585405, 6383094, 7650714, 944821, 1749858, 1249161, 6401847, 1884896, 1577638, 4057134, 3216818, 728801, 7424127, 5870052, 6509952, 7246971, 163522, 7575352, 5807523, 6459466, 5178911, 5566810, 554858, 7189607, 3781199, 4186181, 4628698, 4773556, 4957093, 55073, 6748038, 8166927, 7773120, 5344405, 8236914, 4112972, 2938496, 2972043, 2716533, 173540, 385297, 150525, 4144530, 7479593, 3291036, 4849885, 3070370, 7937839, 2773527, 630697, 1639838, 7067380, 4507901, 2282466, 2421944, 5726506, 1602822, 3567081, 14664, 4864894, 2251311, 5681364, 5961178, 3038478, 6524007, 6812426, 1961943, 5152145, 5349245, 2455864, 909507, 3492027, 7133326, 2519308, 5749113, 3305788, 71347, 5503453, 2849462, 54248, 449256, 5358198, 8137387, 5748813, 1924260, 5963916, 1812601, 5453977, 4776691, 3752684, 7456361, 3719056, 6748631, 2803428, 7329029, 2403137, 7681408, 3546860, 7278796, 4929981, 1081548, 6018197, 8233105, 8162286, 6625354, 3876887, 7423351, 6950117, 3891989, 7554758, 4064835, 757446, 3814274, 345676, 7631701, 5537073, 2755482, 3621797, 5015755, 7677186, 5743975, 4981145, 4145002, 8130169, 4053763, 2399726, 867678, 7165488, 2166547, 6223657, 4134427, 5471405, 2767478, 4066899, 2648725, 5898621, 2280724, 903662, 4256166, 7021421, 2662573, 5723357, 3840625, 7279922, 5771655, 6131587, 7875627, 6774236, 625451, 575732, 115526, 4469837, 7086225, 3986054, 3806247, 1995537, 2198449, 4932791, 2366616, 5734826, 2011250, 292633, 8087157, 2783902, 1821633, 3405119, 933772, 1902709, 1383938, 4644710, 1187420, 2979320, 658970, 8229740, 455521, 4492619, 5330080, 4834689, 7972910, 1891832, 5005859, 5033585, 7584200, 1226414, 3562085, 3051048, 4489081, 6192214, 2341183, 2923311, 2811106, 396838, 8006207, 836146, 2368992, 6509176, 5962051, 7137678, 1768657, 8303582, 5048797, 1295256, 3205515, 7355596, 1560896, 8119227, 7966091, 4904876, 3786604, 5406244, 393374, 6741967, 5696533, 1213762, 8066003, 3840477, 1710968, 808960, 8282854, 2994058, 4090822, 7778709, 8072144, 5092117, 509321, 3751248, 3426726, 8155363, 8123010, 8005958, 8031314, 7408639, 7126532, 1687052, 8059912, 6083268], -[5671095, 4411245, 3063975, 6934657, 5321130, 7278909, 4717083, 8131394, 6506075, 540703, 1827129, 1863798, 5443078, 5794119, 2567392, 6487943, 2617146, 991875, 3397461, 8141993, 7870798, 908328, 1823370, 7143961, 3190585, 8059462, 1330486, 6890355, 5353117, 3628221, 7020061, 4979302, 759504, 8189043, 541008, 1664973, 4189826, 6032576, 5701297, 3485631, 2082773, 8185932, 2381790, 6326543, 5030269, 7987554, 6104672, 2978569, 3511999, 2536719, 3033321, 1742729, 124930, 3310898, 4689263, 1025995, 1440808, 2519011, 8261255, 6339306, 5022944, 7089286, 5176153, 5550358, 4302347, 2062244, 3977446, 4191117, 1343633, 8268332, 503447, 6044720, 1043501, 1962886, 943726, 1755722, 6527027, 5319286, 8169910, 4016513, 2982645, 5482011, 4474216, 5851369, 2682959, 3692673, 1215350, 3214406, 4227566, 2208154, 2939116, 3983982, 2709456, 5484332, 4583841, 4381126, 5800271, 8066992, 1897837, 4693054, 6478051, 3110882, 3599242, 2808837, 989736, 7940849, 377902, 1623641, 8175344, 3499160, 3479693, 1432881, 2285430, 793029, 1003221, 3679063, 2237308, 7999839, 8310565, 809898, 4780250, 958562, 6135802, 278252, 2515872, 4328502, 6194384, 7433459, 519769, 2308397, 6513663, 699, 5868038, 1281847, 4991273, 2607325, 6757341, 3386553, 5366017, 5339322, 6936675, 4073565, 2526647, 3486436, 7083279, 5850504, 1844602, 7641211, 4716101, 521394, 6242825, 535971, 6644055, 2765430, 4144247, 7597168, 7617083, 6384211, 2654277, 6322627, 8264886, 5689863, 3884809, 150394, 4693133, 2382398, 7474300, 2633517, 196207, 2102832, 5349837, 30890, 1986537, 665931, 1282057, 4362964, 1826465, 4148412, 7147682, 6464630, 8189283, 599851, 5982162, 4129638, 7716376, 2509611, 5355319, 5435226, 3647681, 4646994, 3625794, 4405489, 4956772, 7076440, 168039, 4826694, 4371725, 7431334, 330168, 1707887, 8195467, 5676593, 5098888, 2378455, 1875168, 532925, 7237353, 4920083, 2180113, 5027692, 3938356, 7974861, 1259992, 1491488, 2786431, 1015497, 1125705, 3576265, 6927287, 7336145, 2015435, 1279694, 8135359, 2006485, 4787045, 2955587, 3232346, 1551579, 8293810, 7571761, 7779922, 1374141, 4320179, 1307342, 7529296, 7164283, 1203442, 1633621, 5243157, 2828071, 7055388, 1085928, 1073637, 8221146, 5082119, 3599367, 2816316, 5365558, 7333099, 1543341, 6217875, 1353424, 8190539, 2940737, 1788778, 8063448], -[3823010, 1353169, 7204720, 2657288, 2979893, 601334, 3211805, 4389815, 7962312, 6064615, 8204176, 3860543, 814606, 5302132, 3658133, 437359, 8154853, 7572967, 5764564, 4364366, 5910146, 7945315, 7769538, 1821549, 6234580, 5881263, 8026763, 4171930, 5439394, 8042638, 1157518, 1211516, 569912, 7569798, 5464158, 83418, 1904813, 6785825, 6398142, 5263044, 5523515, 3708506, 7824232, 7836521, 6716834, 399064, 7864731, 435247, 1770934, 1101813, 5016542, 4292713, 5014685, 1212360, 2205313, 3715746, 1497600, 3182849, 3292930, 114126, 3094913, 2126209, 911200, 4766113, 3389280, 4602526, 7542989, 6007540, 6265626, 5839740, 2660869, 5987297, 3260593, 20074, 4358351, 5191175, 6306149, 3517691, 5947049, 6166102, 410819, 8265077, 7721960, 5233230, 6848233, 7811634, 5793554, 1198357, 5126486, 3530483, 4690530, 6697435, 3277256, 2800149, 2481695, 6392846, 4760095, 8102206, 267055, 2691126, 5999346, 7414178, 3806465, 2419908, 3728613, 5536852, 1494513, 5641584, 2755093, 2669150, 310715, 3837976, 3742271, 4236786, 1716808, 758296, 2187165, 4869099, 5769075, 639114, 3302290, 3595757, 5103954, 808469, 4330584, 6726885, 7112873, 5561911, 1843803, 4555342, 6430653, 4547812, 2676820, 5921618, 1378739, 6156704, 3995461, 7850855, 3833242, 653789, 6658886, 4725238, 5433365, 7446654, 4424229, 5124114, 7672742, 5875536, 3201515, 7361457, 7906016, 2303359, 4139367, 1966467, 6540105, 430859, 1095818, 3974758, 3173829, 5251488, 768973, 1086130, 3501676, 1337346, 1818919, 1702374, 3308800, 3888499, 4474262, 5974729, 4220819, 5905883, 4482976, 223974, 2521876, 280623, 4806957, 7199876, 5131491, 3063311, 440559, 4912549, 4950233, 2613146, 7634617, 1413588, 85673, 6786574, 5485469, 6473436, 7352683, 6817138, 3134236, 5405013, 7933120, 2763030, 8262669, 7569177, 6505324, 386983, 1450401, 1069716, 5114183, 3566542, 482143, 2844275, 4735801, 3517558, 3241558, 145238, 3559562, 5169244, 1192399, 6619120, 1187491, 5547885, 6446950, 6049385, 6933495, 462437, 1614676, 7683475, 2636554, 7194991, 5834908, 1589012, 7702374, 5871007, 2014475, 3521360, 7402369, 434783, 4965700, 5675033, 6749356, 5964699, 1530907, 1077377, 8210492, 404578, 1209748, 3818739, 3537989, 983319, 4767534, 140095, 7159640, 4984226, 8227725, 1763811, 8260142, 761447, 7452381, 4539436, 295661, 8363537]] -ct0: [[32904, 26231, 8345994, 8366484, 5562, 8376985, 16091, 8219, 8374510, 8358317, 2995, 18298, 8336349, 14169, 8365961, 33437, 8368687, 8360809, 8359499, 8351167, 21877, 49414, 8359609, 8368196, 11252, 8348723, 1769, 8366251, 6328, 11824, 2161, 6431, 8378082, 8351322, 40151, 927, 3105, 8348322, 8368733, 20370, 8348046, 8366512, 6631, 8364194, 8362873, 8376327, 25464, 8371382, 27688, 8374744, 9305, 20936, 8377301, 774, 6225, 23481, 8353514, 8360576, 8362699, 8373639, 8378665, 13519, 8368787, 8374592, 8927, 8352075, 25687, 904, 8373930, 8364558, 8370866, 12499, 10431, 8361509, 27307, 5716, 8358360, 13886, 8366951, 8349242, 8365247, 8366677, 8366061, 8342334, 5044, 20763, 28932, 24485, 28341, 8365955, 26670, 5343, 8362812, 8380275, 19818, 18253, 26806, 8380092, 8374086, 42098, 8369114, 16319, 8371556, 1908, 8377276, 9883, 8355917, 8366790, 15893, 34061, 8359260, 11570, 39848, 2082, 8377863, 3726, 8361328, 8348755, 8379790, 4058, 2782, 35082, 23781, 13093, 8333278, 10038, 2304, 8358171, 23844, 20342, 4979, 4434, 16176, 3443, 8364583, 8349752, 31931, 5603, 8379211, 5262, 1668, 2458, 7112, 8372838, 8379867, 8376829, 10485, 9465, 5323, 8370388, 8245, 8367787, 8365315, 30798, 6678, 8376108, 8380297, 8362683, 27684, 13966, 13375, 20890, 8357565, 29041, 8377153, 2664, 22767, 8379383, 17385, 8366151, 8355011, 8359874, 8351283, 33812, 9633, 19634, 4483, 8354821, 8347091, 40403, 8378868, 8374079, 14973, 8350764, 8374766, 8366282, 23725, 8365420, 8366701, 14590, 8340357, 8358376, 8374323, 17108, 8361609, 8348310, 8355194, 8351299, 26067, 8378966, 26725, 8375389, 9982, 17288, 24196, 8348923, 8376633, 443, 8374121, 8373123, 16296, 8373018, 8375795, 8364532, 1720, 8345406, 8362813, 8347882, 1538, 21375, 6291, 21842, 8372787, 11633, 8377144, 8775, 8376296, 5172, 12963, 8344004, 8369176, 8354970, 2081, 4969, 8376251, 8374026, 8348144, 5043, 5204, 1895, 8359703, 8375676, 3224, 8374385, 8364331, 5877, 21933, 9661, 9679, 8372977, 8376599, 8372810, 8370336, 8346775, 10459, 15734], -[8361286, 1411, 16866, 8364867, 8338399, 8360548, 8360469, 8370777, 29947, 17287, 8363688, 8347575, 8377030, 3105, 8358036, 6639, 8329352, 8376085, 3039, 25747, 15497, 8376591, 27477, 8351416, 40544, 8353761, 8349702, 8353686, 8353167, 8377112, 5508, 8343874, 8350445, 8376873, 8380136, 10199, 8374824, 8349561, 8373706, 8358548, 862, 10137, 19365, 12727, 8373170, 8376749, 8359489, 8357201, 8365314, 10960, 2144, 8362169, 8366142, 8345269, 32466, 8369872, 4190, 11501, 8355127, 17740, 8321729, 22632, 1524, 21927, 8353251, 8363594, 13543, 22738, 29081, 4763, 8371572, 8358348, 8342082, 8367978, 3037, 48372, 26465, 8374520, 4560, 8376125, 14525, 4078, 38458, 8365142, 17793, 9417, 8360855, 6359, 8657, 28311, 8369849, 19976, 8365856, 8342403, 8372061, 11615, 20749, 8361429, 7942, 8379600, 24838, 31944, 3096, 3539, 2571, 27884, 8371831, 12425, 13331, 18885, 18186, 8359047, 8373464, 10731, 23669, 8378471, 8379079, 38944, 8327541, 32262, 8358587, 3721, 15277, 19474, 14502, 8378365, 2728, 6421, 12800, 30531, 8204, 7106, 15150, 20380, 10245, 18322, 169, 8356090, 8345786, 8370479, 12426, 10610, 8370921, 8366281, 8373801, 20999, 22535, 28618, 8345371, 8363457, 8363469, 12631, 10496, 8349815, 5281, 14583, 29690, 5639, 8365923, 8350876, 8378807, 9790, 16145, 8362496, 8365410, 8369632, 8359059, 7459, 8367413, 4868, 7559, 8373009, 8359311, 8369767, 8368755, 8368457, 8374725, 21667, 8378087, 1277, 29943, 23120, 8373971, 8376762, 8368605, 8328082, 8366471, 4305, 8361187, 16106, 24733, 8373301, 8369182, 8364733, 1522, 8355188, 8358858, 2349, 8350987, 8354486, 3799, 13137, 8372496, 10058, 8372363, 8369050, 337, 8369877, 8373494, 8350314, 8349655, 10819, 16378, 8364396, 38019, 8374623, 3585, 8345481, 8366110, 8347218, 8353106, 37850, 14979, 8362491, 8363557, 3493, 8375832, 8377888, 2119, 8357972, 8353262, 8371194, 1944, 10000, 8378773, 28035, 11881, 8369223, 14534, 17039, 8368897, 15535, 21685, 8364342, 16646, 428, 10543, 37280, 8358605, 9733, 8352216, 12963, 7561, 8332166, 20995, 8365777], -[11583, 5902, 30109, 8350695, 8375446, 8371773, 8344663, 8375347, 8341616, 10319, 8380152, 8379031, 8368092, 8340640, 742, 8361422, 12218, 5477, 6941, 19861, 191, 496, 8358344, 7771, 8350015, 8345724, 34990, 8342637, 8366469, 10864, 8359352, 8362183, 8368601, 8376852, 8370390, 8376200, 25347, 8373295, 8354615, 36898, 8357106, 8375780, 8365902, 22421, 14011, 25578, 8361860, 5998, 31249, 8354430, 15546, 8351703, 8370164, 28355, 8366651, 15891, 14218, 4898, 38509, 8350647, 14608, 26710, 8367095, 8376151, 8358753, 8361912, 17189, 8375272, 39137, 8377006, 8370701, 8377226, 5263, 8370324, 45868, 16640, 42565, 8364212, 18661, 20843, 18404, 33837, 8373316, 24276, 8378585, 167, 8367542, 8351460, 8001, 8363779, 30498, 8372163, 30319, 42441, 8380191, 8372286, 41871, 800, 8367455, 18491, 8365374, 50621, 20675, 28295, 2337, 8369230, 49293, 8357491, 8369141, 15829, 8379859, 16586, 8378573, 8369859, 8365363, 8364928, 8378505, 2034, 19837, 15142, 8375778, 8347141, 10274, 35648, 20275, 8344060, 8372068, 18673, 23951, 7009, 8348981, 7900, 8351025, 8368550, 7174, 8323498, 5563, 8370898, 19049, 8357210, 8345280, 14597, 8345554, 17186, 8371876, 175, 8372772, 8368796, 10916, 8352331, 8405, 8339093, 8362335, 8373181, 8376193, 24300, 8359330, 7510, 8378400, 17301, 8376253, 8349135, 8379763, 14306, 810, 8366522, 8348194, 8360419, 8365364, 13122, 8362973, 8378541, 8360063, 38838, 8364926, 8357090, 8373637, 8346089, 15106, 8357814, 14810, 10302, 13481, 17358, 8376867, 13805, 8359885, 8374458, 8366994, 41531, 8363430, 5437, 8357160, 8367998, 10190, 8363197, 8375054, 8366811, 8378828, 8379792, 8357751, 27634, 8360692, 16649, 9617, 8360203, 2376, 15008, 52423, 8345537, 11555, 17015, 8362165, 38850, 8378860, 5005, 11317, 8194, 14823, 8349472, 8367850, 17290, 8343647, 8357420, 9973, 8368950, 8949, 8376599, 12869, 33579, 8359100, 13740, 19421, 17360, 5354, 7852, 22814, 8369489, 39860, 7444, 8379692, 8331996, 8372298, 25720, 8365915, 14667, 8374448, 8362903, 19044, 31247, 5670, 9511, 8376440, 28367, 8376607, 12439], -[4641, 8363428, 8373020, 8374949, 7253, 4521, 8353858, 1923, 8356593, 8376460, 8369010, 8373505, 8363779, 16280, 8364919, 8376457, 7788, 8375090, 8363251, 7366, 8370897, 2849, 8362959, 42015, 3969, 7677, 8359907, 8364576, 8373881, 8193, 16448, 8368284, 8367322, 8371621, 8358321, 8370409, 2219, 8376575, 8355575, 8361081, 8349774, 8371716, 8355664, 8376163, 7438, 8317466, 8374182, 27675, 22707, 15164, 8353459, 2546, 1381, 5876, 9154, 8370625, 7516, 8370948, 32302, 8346351, 17571, 8349206, 8360068, 9155, 8366701, 8357127, 8365933, 8372424, 35698, 8365473, 3105, 26612, 8352888, 3636, 8378033, 8378037, 8373022, 8361943, 13626, 372, 8372454, 20119, 8371552, 8364050, 2294, 8379949, 9936, 8365273, 14590, 8376634, 30298, 8357813, 8371829, 8365023, 12128, 19516, 6375, 8341568, 15987, 9580, 14254, 8359009, 17232, 14120, 18135, 8363945, 22131, 8365156, 13055, 16784, 8347854, 8363, 32399, 8369123, 36775, 8340583, 23525, 10342, 40604, 3347, 16834, 8379201, 764, 1006, 21558, 16712, 8370763, 8372359, 23216, 12791, 14870, 7229, 8372343, 27706, 8361249, 19890, 8148, 19348, 9750, 10227, 8348947, 42086, 8366160, 8365097, 8377497, 1180, 368, 4258, 8379392, 18069, 8363840, 17161, 8359648, 2974, 5548, 17368, 8372883, 8375733, 1416, 6204, 9442, 8376968, 10381, 24265, 8354216, 7857, 8351955, 8369387, 11108, 30343, 8357876, 8317258, 8356513, 19445, 24367, 8379421, 11990, 8372645, 8371570, 8379151, 8373891, 8368026, 10130, 38173, 8357865, 13564, 8352993, 20067, 8366549, 17893, 8375442, 8376164, 8360184, 9529, 8370825, 12410, 8369262, 8366383, 8357459, 8352448, 8372336, 10713, 8355260, 8379860, 8337506, 8370546, 7616, 8137, 8374107, 8364612, 8378652, 4436, 1528, 8378612, 6541, 8338674, 16092, 8378155, 8359049, 4881, 994, 8373082, 8370501, 8379865, 31013, 6407, 8358, 8350054, 32832, 8347838, 19514, 2592, 8374456, 8370630, 22268, 5513, 8369110, 738, 9251, 8363755, 17682, 12239, 3927, 8363108, 33375, 8368350, 8379563, 3173, 24986, 13090, 8378503, 8368097, 61, 8374014, 8370692, 28738], -[8357374, 51949, 8363063, 10705, 5643, 3911, 11236, 8378571, 19082, 8356102, 22566, 8337203, 8374172, 8368626, 8363601, 2650, 8330988, 17448, 8367498, 8365639, 8362276, 8376427, 8379838, 1342, 19652, 11746, 12041, 29042, 8379465, 21902, 8348706, 3065, 18, 8370846, 8377590, 1485, 18462, 8367075, 1952, 8375513, 638, 16385, 8378182, 4586, 7965, 8367662, 12835, 7440, 31159, 8368020, 13386, 10765, 14399, 8372967, 7510, 8378968, 8373056, 27593, 20072, 27086, 4146, 8376047, 7070, 8344023, 8371461, 6483, 8368311, 11992, 8366434, 22809, 8372369, 3274, 3519, 8379443, 64344, 14717, 8375279, 8349417, 11646, 8350490, 8363300, 6504, 6404, 20471, 8367752, 19488, 8344651, 25385, 8367312, 8368607, 8379793, 1966, 10230, 8373767, 8359272, 8363874, 11402, 8364909, 16373, 1174, 8373095, 25118, 31024, 8371930, 8350411, 56, 15526, 923, 50498, 8377557, 8377038, 8354806, 8374564, 8370505, 8373459, 28876, 8373770, 8378316, 8356138, 8352468, 7731, 3779, 14587, 8338797, 4474, 1980, 8355424, 22860, 8345641, 14472, 9868, 199, 1362, 8366289, 13683, 3960, 2692, 8375159, 8358126, 23274, 8377527, 11235, 8364665, 6558, 8359545, 8364403, 8376916, 8372418, 12365, 8375020, 8356561, 17222, 19415, 26310, 8362078, 8352451, 8377494, 8371190, 8361705, 27377, 34818, 8359773, 33144, 21596, 33695, 8379589, 26671, 8376570, 8364188, 8359743, 8368859, 8366806, 9684, 26641, 8372508, 8321, 15140, 21874, 8363214, 8360026, 16863, 18700, 14015, 8344698, 8375389, 8379288, 8377713, 8380026, 3607, 8373733, 17461, 7349, 8326653, 8356662, 22594, 8379680, 22661, 18309, 18609, 8359863, 1063, 85, 8353405, 7183, 8371700, 8373896, 8362942, 8204, 8377357, 8349875, 1931, 8362901, 21020, 560, 27271, 9058, 4222, 2075, 8369306, 8369315, 8365834, 16412, 5968, 8367512, 8368476, 8357846, 4981, 2207, 8376263, 8376238, 1180, 8380110, 8378015, 2751, 8372095, 7289, 8365710, 7500, 8349907, 8380375, 20192, 2655, 6917, 4513, 8354590, 9887, 11210, 18921, 8367785, 710, 8356472, 1242, 8375741, 4019, 20221, 5477], -[8376757, 32629, 14147, 8377833, 8369181, 18072, 21035, 32201, 9370, 8378537, 14404, 8367186, 3401, 11856, 8362655, 638, 8365125, 8363189, 8359537, 8367356, 19339, 3051, 8376812, 27533, 8371534, 8367752, 3999, 31601, 8356363, 41032, 8376570, 8359795, 13804, 7107, 15619, 18047, 36458, 8367714, 8357956, 8770, 8360588, 8377276, 8372611, 8379832, 8364963, 8373361, 4613, 15187, 9927, 8369087, 8373485, 793, 8346424, 2729, 22012, 13025, 19176, 22007, 8050, 8375416, 5586, 47878, 6825, 8558, 14818, 11108, 8356945, 8365439, 21448, 8353493, 8355247, 17345, 8367976, 8377106, 8354308, 8375555, 8352660, 8193, 2782, 8360891, 8, 21974, 7218, 8374637, 8371477, 8358213, 13176, 1225, 8370545, 8362648, 8359844, 8373304, 8374119, 8373768, 8351314, 28959, 9670, 10138, 8352830, 15617, 18089, 8364939, 8347820, 8345844, 1438, 8375740, 8266, 8358761, 20142, 7432, 19063, 8374845, 8371608, 25341, 7959, 8373575, 22453, 8369631, 6328, 20196, 8376196, 8358029, 12155, 8346878, 8349092, 8353436, 8377574, 13375, 8378206, 8358173, 8368083, 8372398, 8379627, 8375878, 15571, 8380032, 6312, 23179, 9988, 8353897, 20080, 841, 8374997, 7078, 8373618, 8362921, 44421, 8358973, 14329, 8331763, 8367608, 8374340, 8372703, 8369134, 8374429, 1298, 5884, 2052, 8352813, 37094, 8363509, 28300, 18296, 8364555, 8362112, 22830, 45343, 8375810, 19968, 12099, 66991, 8380148, 8362119, 26122, 8363464, 15321, 8340149, 8371927, 22014, 16049, 23174, 8370822, 12356, 8369514, 8369060, 10471, 3873, 4143, 5958, 8374584, 8368165, 12114, 29932, 6031, 34396, 8374981, 8365259, 8366434, 5707, 8375927, 15349, 1115, 8353691, 10474, 8369730, 8368607, 8372296, 3441, 31319, 8346760, 884, 8362769, 2872, 3139, 8378804, 9886, 18579, 21853, 8367305, 23838, 2208, 73117, 8355950, 20041, 14289, 8367638, 30577, 8347920, 8336563, 6130, 8365302, 8379303, 8361023, 5203, 8366155, 39759, 15290, 8378878, 8365238, 9837, 8375754, 8368355, 8377147, 37516, 8362579, 12447, 6416, 8352414, 23136, 8376547, 8358718, 22517, 8362459, 8367323, 8359512, 8357798], -[16134, 8364707, 8366184, 34713, 8362963, 8342067, 8374259, 8358068, 2225, 8948, 17044, 8378036, 8335776, 19674, 3364, 8356976, 10461, 8371402, 22856, 8374564, 15911, 8374326, 8373275, 10427, 8376343, 8380088, 8343379, 15087, 8374143, 12471, 4872, 8380191, 8371279, 12396, 4280, 12416, 8365219, 8366379, 13310, 8359817, 8356377, 12873, 8379668, 8377006, 24877, 27792, 8370507, 8372638, 3454, 13717, 5259, 8373049, 8370326, 8374274, 13035, 25405, 8367045, 43309, 8356859, 8379849, 8357431, 8347348, 8357132, 8357640, 8362525, 15464, 1002, 8329, 9848, 8371228, 8371932, 6688, 8374569, 20777, 12573, 6240, 20558, 8369319, 5646, 27741, 8379453, 8380177, 8379644, 8375752, 8365127, 3242, 8364850, 2699, 8379131, 2026, 20906, 8359647, 25886, 14216, 5679, 8369561, 8366306, 8376393, 28090, 28070, 20499, 8364537, 8355504, 3227, 19492, 8376347, 12385, 8348297, 12719, 8376519, 16061, 8369811, 8379190, 8344997, 208, 8374395, 8363341, 1406, 8374233, 8373352, 25622, 8364175, 14007, 37655, 13339, 22566, 8351689, 8378545, 3485, 8365936, 20788, 8376673, 26781, 8354275, 8377901, 8372257, 575, 755, 8362973, 8375857, 7634, 8368020, 2165, 9893, 6644, 29496, 12249, 8346531, 5095, 11770, 9726, 8364033, 8367309, 8373055, 8372698, 32338, 12834, 27223, 713, 6329, 20562, 8377503, 8365060, 5320, 8370541, 8378373, 24591, 8362087, 21001, 13440, 7657, 33125, 8361834, 8374522, 8361750, 8356116, 3682, 8354210, 3076, 16155, 8377238, 8051, 18999, 14857, 8363845, 7482, 8328898, 20975, 8372558, 24561, 8364198, 8380364, 8375377, 34568, 8376102, 670, 8801, 8357401, 8377327, 8366574, 8369471, 12749, 6078, 8378245, 8368825, 50, 31019, 8370925, 8346817, 11602, 8376588, 8361850, 2924, 27420, 43, 44437, 8376884, 8378674, 8339720, 5123, 8369659, 8342518, 17181, 8351670, 8379348, 8355404, 15529, 8341267, 8376197, 3435, 25170, 8358849, 8374948, 27136, 8356812, 6719, 14664, 17181, 10804, 10510, 5095, 15385, 8366954, 5092, 8377090, 8370222, 8374921, 32713, 8341568, 8952, 27331, 8366722, 8362852, 8359334, 8369469, 8377715], -[8367437, 8371445, 1072, 8377901, 8330984, 19212, 8363036, 8369508, 11222, 3901, 8379028, 16620, 8378944, 46830, 8371263, 6701, 7581, 8346352, 8362810, 8338688, 8374209, 29683, 8371881, 8374694, 8380002, 2992, 4542, 8360048, 28932, 8362445, 9738, 8369348, 8368442, 8370889, 30734, 8372136, 8264, 8375373, 2818, 8371188, 152, 8377324, 8366811, 8368805, 7785, 8368294, 7854, 10326, 7720, 1487, 5542, 8375812, 8378705, 19340, 8351144, 8371546, 8371946, 8375905, 8350360, 19286, 20163, 14029, 8373279, 8352633, 21171, 8367916, 21758, 8368504, 8360663, 9087, 8362692, 8370253, 8373041, 20731, 8371429, 8358965, 8370110, 8374697, 21345, 8369134, 24497, 8352046, 11060, 15952, 20118, 8372067, 2837, 41282, 8372840, 8343792, 8372620, 4456, 8364331, 8370318, 8368638, 15944, 8376385, 31641, 8370341, 8342403, 18999, 8371659, 8364241, 25802, 8356366, 21352, 8352960, 10652, 23432, 8370280, 16771, 8352423, 580, 2516, 16218, 8359251, 8358033, 9384, 18802, 32607, 4471, 7607, 14254, 33479, 8354163, 8355301, 8371726, 8358388, 8377978, 15651, 23534, 8369282, 8370708, 22884, 1001, 17839, 697, 8378415, 8357060, 13499, 8352, 8367139, 8376875, 15677, 29592, 31289, 8368404, 22942, 21624, 18376, 12624, 10073, 8349507, 8402, 12662, 8368356, 8377844, 13849, 28336, 8373005, 8364923, 11436, 8345333, 20337, 8365353, 29019, 8379092, 8380016, 29417, 8368136, 9285, 8380017, 8371319, 3069, 9430, 8374728, 4565, 8345931, 8350768, 8379041, 7753, 9402, 8364262, 8350806, 4941, 20625, 14953, 8368960, 8362815, 13423, 8183, 8340047, 8374303, 26071, 8371941, 8375527, 8364049, 8354878, 19940, 13279, 8372135, 8350193, 14039, 8372204, 8366790, 8375551, 8358699, 8357979, 8364939, 8362380, 5968, 576, 33678, 8356816, 8373200, 370, 8377618, 8366548, 5546, 8379515, 1484, 26471, 8379011, 31696, 31538, 8181, 8340978, 8355255, 8373534, 7097, 8354478, 8363977, 8371315, 8363908, 8480, 27691, 8343358, 17882, 19098, 8377730, 16546, 8376778, 8366652, 6006, 8367964, 8960, 15157, 8362727, 2859, 8361242, 26554, 8364298, 15656, 8373179, 8359147, 33027]] --ct0: [[8347513, 8354186, 34423, 13933, 8374855, 3432, 8364326, 8372198, 5907, 22100, 8377422, 8362119, 44068, 8366248, 14456, 8346980, 11730, 19608, 20918, 29250, 8358540, 8331003, 20808, 12221, 8369165, 31694, 8378648, 14166, 8374089, 8368593, 8378256, 8373986, 2335, 29095, 8340266, 8379490, 8377312, 32095, 11684, 8360047, 32371, 13905, 8373786, 16223, 17544, 4090, 8354953, 9035, 8352729, 5673, 8371112, 8359481, 3116, 8379643, 8374192, 8356936, 26903, 19841, 17718, 6778, 1752, 8366898, 11630, 5825, 8371490, 28342, 8354730, 8379513, 6487, 15859, 9551, 8367918, 8369986, 18908, 8353110, 8374701, 22057, 8366531, 13466, 31175, 15170, 13740, 14356, 38083, 8375373, 8359654, 8351485, 8355932, 8352076, 14462, 8353747, 8375074, 17605, 142, 8360599, 8362164, 8353611, 325, 6331, 8338319, 11303, 8364098, 8861, 8378509, 3141, 8370534, 24500, 13627, 8364524, 8346356, 21157, 8368847, 8340569, 8378335, 2554, 8376691, 19089, 31662, 627, 8376359, 8377635, 8345335, 8356636, 8367324, 47139, 8370379, 8378113, 22246, 8356573, 8360075, 8375438, 8375983, 8364241, 8376974, 15834, 30665, 8348486, 8374814, 1206, 8375155, 8378749, 8377959, 8373305, 7579, 550, 3588, 8369932, 8370952, 8375094, 10029, 8372172, 12630, 15102, 8349619, 8373739, 4309, 120, 17734, 8352733, 8366451, 8367042, 8359527, 22852, 8351376, 3264, 8377753, 8357650, 1034, 8363032, 14266, 25406, 20543, 29134, 8346605, 8370784, 8360783, 8375934, 25596, 33326, 8340014, 1549, 6338, 8365444, 29653, 5651, 14135, 8356692, 14997, 13716, 8365827, 40060, 22041, 6094, 8363309, 18808, 32107, 25223, 29118, 8354350, 1451, 8353692, 5028, 8370435, 8363129, 8356221, 31494, 3784, 8379974, 6296, 7294, 8364121, 7399, 4622, 15885, 8378697, 35011, 17604, 32535, 8378879, 8359042, 8374126, 8358575, 7630, 8368784, 3273, 8371642, 4121, 8375245, 8367454, 36413, 11241, 25447, 8378336, 8375448, 4166, 6391, 32273, 8375374, 8375213, 8378522, 20714, 4741, 8377193, 6032, 16086, 8374540, 8358484, 8370756, 8370738, 7440, 3818, 7607, 10081, 33642, 8369958, 8364683], -[19131, 8379006, 8363551, 15550, 42018, 19869, 19948, 9640, 8350470, 8363130, 16729, 32842, 3387, 8377312, 22381, 8373778, 51065, 4332, 8377378, 8354670, 8364920, 3826, 8352940, 29001, 8339873, 26656, 30715, 26731, 27250, 3305, 8374909, 36543, 29972, 3544, 281, 8370218, 5593, 30856, 6711, 21869, 8379555, 8370280, 8361052, 8367690, 7247, 3668, 20928, 23216, 15103, 8369457, 8378273, 18248, 14275, 35148, 8347951, 10545, 8376227, 8368916, 25290, 8362677, 58688, 8357785, 8378893, 8358490, 27166, 16823, 8366874, 8357679, 8351336, 8375654, 8845, 22069, 38335, 12439, 8377380, 8332045, 8353952, 5897, 8375857, 4292, 8365892, 8376339, 8341959, 15275, 8362624, 8371000, 19562, 8374058, 8371760, 8352106, 10568, 8360441, 14561, 38014, 8356, 8368802, 8359668, 18988, 8372475, 817, 8355579, 8348473, 8377321, 8376878, 8377846, 8352533, 8586, 8367992, 8367086, 8361532, 8362231, 21370, 6953, 8369686, 8356748, 1946, 1338, 8341473, 52876, 8348155, 21830, 8376696, 8365140, 8360943, 8365915, 2052, 8377689, 8373996, 8367617, 8349886, 8372213, 8373311, 8365267, 8360037, 8370172, 8362095, 8380248, 24327, 34631, 9938, 8367991, 8369807, 9496, 14136, 6616, 8359418, 8357882, 8351799, 35046, 16960, 16948, 8367786, 8369921, 30602, 8375136, 8365834, 8350727, 8374778, 14494, 29541, 1610, 8370627, 8364272, 17921, 15007, 10785, 21358, 8372958, 13004, 8375549, 8372858, 7408, 21106, 10650, 11662, 11960, 5692, 8358750, 2330, 8379140, 8350474, 8357297, 6446, 3655, 11812, 52335, 13946, 8376112, 19230, 8364311, 8355684, 7116, 11235, 15684, 8378895, 25229, 21559, 8378068, 29430, 25931, 8376618, 8367280, 7921, 8370359, 8054, 11367, 8380080, 10540, 6923, 30103, 30762, 8369598, 8364039, 16021, 8342398, 5794, 8376832, 34936, 14307, 33199, 27311, 8342567, 8365438, 17926, 16860, 8376924, 4585, 2529, 8378298, 22445, 27155, 9223, 8378473, 8370417, 1644, 8352382, 8368536, 11194, 8365883, 8363378, 11520, 8364882, 8358732, 16075, 8363771, 8379989, 8369874, 8343137, 21812, 8370684, 28201, 8367454, 8372856, 48251, 8359422, 14640], -[8368834, 8374515, 8350308, 29722, 4971, 8644, 35754, 5070, 38801, 8370098, 265, 1386, 12325, 39777, 8379675, 18995, 8368199, 8374940, 8373476, 8360556, 8380226, 8379921, 22073, 8372646, 30402, 34693, 8345427, 37780, 13948, 8369553, 21065, 18234, 11816, 3565, 10027, 4217, 8355070, 7122, 25802, 8343519, 23311, 4637, 14515, 8357996, 8366406, 8354839, 18557, 8374419, 8349168, 25987, 8364871, 28714, 10253, 8352062, 13766, 8364526, 8366199, 8375519, 8341908, 29770, 8365809, 8353707, 13322, 4266, 21664, 18505, 8363228, 5145, 8341280, 3411, 9716, 3191, 8375154, 10093, 8334549, 8363777, 8337852, 16205, 8361756, 8359574, 8362013, 8346580, 7101, 8356141, 1832, 8380250, 12875, 28957, 8372416, 16638, 8349919, 8254, 8350098, 8337976, 226, 8131, 8338546, 8379617, 12962, 8361926, 15043, 8329796, 8359742, 8352122, 8378080, 11187, 8331124, 22926, 11276, 8364588, 558, 8363831, 1844, 10558, 15054, 15489, 1912, 8378383, 8360580, 8365275, 4639, 33276, 8370143, 8344769, 8360142, 36357, 8349, 8361744, 8356466, 8373408, 31436, 8372517, 29392, 11867, 8373243, 56919, 8374854, 9519, 8361368, 23207, 35137, 8365820, 34863, 8363231, 8541, 8380242, 7645, 11621, 8369501, 28086, 8372012, 41324, 18082, 7236, 4224, 8356117, 21087, 8372907, 2017, 8363116, 4164, 31282, 654, 8366111, 8379607, 13895, 32223, 19998, 15053, 8367295, 17444, 1876, 20354, 8341579, 15491, 23327, 6780, 34328, 8365311, 22603, 8365607, 8370115, 8366936, 8363059, 3550, 8366612, 20532, 5959, 13423, 8338886, 16987, 8374980, 23257, 12419, 8370227, 17220, 5363, 13606, 1589, 625, 22666, 8352783, 19725, 8363768, 8370800, 20214, 8378041, 8365409, 8327994, 34880, 8368862, 8363402, 18252, 8341567, 1557, 8375412, 8369100, 8372223, 8365594, 30945, 12567, 8363127, 36770, 22997, 8370444, 11467, 8371468, 3818, 8367548, 8346838, 21317, 8366677, 8360996, 8363057, 8375063, 8372565, 8357603, 10928, 8340557, 8372973, 725, 48421, 8119, 8354697, 14502, 8365750, 5969, 17514, 8361373, 8349170, 8374747, 8370906, 3977, 8352050, 3810, 8367978], -[8375776, 16989, 7397, 5468, 8373164, 8375896, 26559, 8378494, 23824, 3957, 11407, 6912, 16638, 8364137, 15498, 3960, 8372629, 5327, 17166, 8373051, 9520, 8377568, 17458, 8338402, 8376448, 8372740, 20510, 15841, 6536, 8372224, 8363969, 12133, 13095, 8796, 22096, 10008, 8378198, 3842, 24842, 19336, 30643, 8701, 24753, 4254, 8372979, 62951, 6235, 8352742, 8357710, 8365253, 26958, 8377871, 8379036, 8374541, 8371263, 9792, 8372901, 9469, 8348115, 34066, 8362846, 31211, 20349, 8371262, 13716, 23290, 14484, 7993, 8344719, 14944, 8377312, 8353805, 27529, 8376781, 2384, 2380, 7395, 18474, 8366791, 8380045, 7963, 8360298, 8865, 16367, 8378123, 468, 8370481, 15144, 8365827, 3783, 8350119, 22604, 8588, 15394, 8368289, 8360901, 8374042, 38849, 8364430, 8370837, 8366163, 21408, 8363185, 8366297, 8362282, 16472, 8358286, 15261, 8367362, 8363633, 32563, 8372054, 8348018, 11294, 8343642, 39834, 8356892, 8370075, 8339813, 8377070, 8363583, 1216, 8379653, 8379411, 8358859, 8363705, 9654, 8058, 8357201, 8367626, 8365547, 8373188, 8074, 8352711, 19168, 8360527, 8372269, 8361069, 8370667, 8370190, 31470, 8338331, 14257, 15320, 2920, 8379237, 8380049, 8376159, 1025, 8362348, 16577, 8363256, 20769, 8377443, 8374869, 8363049, 7534, 4684, 8379001, 8374213, 8370975, 3449, 8370036, 8356152, 26201, 8372560, 28462, 11030, 8369309, 8350074, 22541, 63159, 23904, 8360972, 8356050, 996, 8368427, 7772, 8847, 1266, 6526, 12391, 8370287, 8342244, 22552, 8366853, 27424, 8360350, 13868, 8362524, 4975, 4253, 20233, 8370888, 9592, 8368007, 11155, 14034, 22958, 27969, 8081, 8369704, 25157, 557, 42911, 9871, 8372801, 8372280, 6310, 15805, 1765, 8375981, 8378889, 1805, 8373876, 41743, 8364325, 2262, 21368, 8375536, 8379423, 7335, 9916, 552, 8349404, 8374010, 8372059, 30363, 8347585, 32579, 8360903, 8377825, 5961, 9787, 8358149, 8374904, 11307, 8379679, 8371166, 16662, 8362735, 8368178, 8376490, 17309, 8347042, 12067, 854, 8377244, 8355431, 8367327, 1914, 12320, 8380356, 6403, 9725, 8351679], -[23043, 8328468, 17354, 8369712, 8374774, 8376506, 8369181, 1846, 8361335, 24315, 8357851, 43214, 6245, 11791, 16816, 8377767, 49429, 8362969, 12919, 14778, 18141, 3990, 579, 8379075, 8360765, 8368671, 8368376, 8351375, 952, 8358515, 31711, 8377352, 8380399, 9571, 2827, 8378932, 8361955, 13342, 8378465, 4904, 8379779, 8364032, 2235, 8375831, 8372452, 12755, 8367582, 8372977, 8349258, 12397, 8367031, 8369652, 8366018, 7450, 8372907, 1449, 7361, 8352824, 8360345, 8353331, 8376271, 4370, 8373347, 36394, 8956, 8373934, 12106, 8368425, 13983, 8357608, 8048, 8377143, 8376898, 974, 8316073, 8365700, 5138, 31000, 8368771, 29927, 17117, 8373913, 8374013, 8359946, 12665, 8360929, 35766, 8355032, 13105, 11810, 624, 8378451, 8370187, 6650, 21145, 16543, 8369015, 15508, 8364044, 8379243, 7322, 8355299, 8349393, 8487, 30006, 8380361, 8364891, 8379494, 8329919, 2860, 3379, 25611, 5853, 9912, 6958, 8351541, 6647, 2101, 24279, 27949, 8372686, 8376638, 8365830, 41620, 8375943, 8378437, 24993, 8357557, 34776, 8365945, 8370549, 8380218, 8379055, 14128, 8366734, 8376457, 8377725, 5258, 22291, 8357143, 2890, 8369182, 15752, 8373859, 20872, 16014, 3501, 7999, 8368052, 5397, 23856, 8363195, 8361002, 8354107, 18339, 27966, 2923, 9227, 18712, 8353040, 8345599, 20644, 8347273, 8358821, 8346722, 828, 8353746, 3847, 16229, 20674, 11558, 13611, 8370733, 8353776, 7909, 8372096, 8365277, 8358543, 17203, 20391, 8363554, 8361717, 8366402, 35719, 5028, 1129, 2704, 391, 8376810, 6684, 8362956, 8373068, 53764, 23755, 8357823, 737, 8357756, 8362108, 8361808, 20554, 8379354, 8380332, 27012, 8373234, 8717, 6521, 17475, 8372213, 3060, 30542, 8378486, 17516, 8359397, 8379857, 8353146, 8371359, 8376195, 8378342, 11111, 11102, 14583, 8364005, 8374449, 12905, 11941, 22571, 8375436, 8378210, 4154, 4179, 8379237, 307, 2402, 8377666, 8322, 8373128, 14707, 8372917, 30510, 42, 8360225, 8377762, 8373500, 8375904, 25827, 8370530, 8369207, 8361496, 12632, 8379707, 23945, 8379175, 4676, 8376398, 8360196, 8374940], -[3660, 8347788, 8366270, 2584, 11236, 8362345, 8359382, 8348216, 8371047, 1880, 8366013, 13231, 8377016, 8368561, 17762, 8379779, 15292, 17228, 20880, 13061, 8361078, 8377366, 3605, 8352884, 8883, 12665, 8376418, 8348816, 24054, 8339385, 3847, 20622, 8366613, 8373310, 8364798, 8362370, 8343959, 12703, 22461, 8371647, 19829, 3141, 7806, 585, 15454, 7056, 8375804, 8365230, 8370490, 11330, 6932, 8379624, 33993, 8377688, 8358405, 8367392, 8361241, 8358410, 8372367, 5001, 8374831, 8332539, 8373592, 8371859, 8365599, 8369309, 23472, 14978, 8358969, 26924, 25170, 8363072, 12441, 3311, 26109, 4862, 27757, 8372224, 8377635, 19526, 8380409, 8358443, 8373199, 5780, 8940, 22204, 8367241, 8379192, 9872, 17769, 20573, 7113, 6298, 6649, 29103, 8351458, 8370747, 8370279, 27587, 8364800, 8362328, 15478, 32597, 34573, 8378979, 4677, 8372151, 21656, 8360275, 8372985, 8361354, 5572, 8809, 8355076, 8372458, 6842, 8357964, 10786, 8374089, 8360221, 4221, 22388, 8368262, 33539, 31325, 26981, 2843, 8367042, 2211, 22244, 12334, 8019, 790, 4539, 8364846, 385, 8374105, 8357238, 8370429, 26520, 8360337, 8379576, 5420, 8373339, 6799, 17496, 8335996, 21444, 8366088, 48654, 12809, 6077, 7714, 11283, 5988, 8379119, 8374533, 8378365, 27604, 8343323, 16908, 8352117, 8362121, 15862, 18305, 8357587, 8335074, 4607, 8360449, 8368318, 8313426, 269, 18298, 8354295, 16953, 8365096, 40268, 8490, 8358403, 8364368, 8357243, 9595, 8368061, 10903, 11357, 8369946, 8376544, 8376274, 8374459, 5833, 12252, 8368303, 8350485, 8374386, 8346021, 5436, 15158, 13983, 8374710, 4490, 8365068, 8379302, 26726, 8369943, 10687, 11810, 8121, 8376976, 8349098, 33657, 8379533, 17648, 8377545, 8377278, 1613, 8370531, 8361838, 8358564, 13112, 8356579, 8378209, 8307300, 24467, 8360376, 8366128, 12779, 8349840, 32497, 43854, 8374287, 15115, 1114, 19394, 8375214, 14262, 8340658, 8365127, 1539, 15179, 8370580, 4663, 12062, 3270, 8342901, 17838, 8367970, 8374001, 28003, 8357281, 3870, 21699, 8357900, 17958, 13094, 20905, 22619], -[8364283, 15710, 14233, 8345704, 17454, 38350, 6158, 22349, 8378192, 8371469, 8363373, 2381, 44641, 8360743, 8377053, 23441, 8369956, 9015, 8357561, 5853, 8364506, 6091, 7142, 8369990, 4074, 329, 37038, 8365330, 6274, 8367946, 8375545, 226, 9138, 8368021, 8376137, 8368001, 15198, 14038, 8367107, 20600, 24040, 8367544, 749, 3411, 8355540, 8352625, 9910, 7779, 8376963, 8366700, 8375158, 7368, 10091, 6143, 8367382, 8355012, 13372, 8337108, 23558, 568, 22986, 33069, 23285, 22777, 17892, 8364953, 8379415, 8372088, 8370569, 9189, 8485, 8373729, 5848, 8359640, 8367844, 8374177, 8359859, 11098, 8374771, 8352676, 964, 240, 773, 4665, 15290, 8377175, 15567, 8377718, 1286, 8378391, 8359511, 20770, 8354531, 8366201, 8374738, 10856, 14111, 4024, 8352327, 8352347, 8359918, 15880, 24913, 8377190, 8360925, 4070, 8368032, 32120, 8367698, 3898, 8364356, 10606, 1227, 35420, 8380209, 6022, 17076, 8379011, 6184, 7065, 8354795, 16242, 8366410, 8342762, 8367078, 8357851, 28728, 1872, 8376932, 14481, 8359629, 3744, 8353636, 26142, 2516, 8160, 8379842, 8379662, 17444, 4560, 8372783, 12397, 8378252, 8370524, 8373773, 8350921, 8368168, 33886, 8375322, 8368647, 8370691, 16384, 13108, 7362, 7719, 8348079, 8367583, 8353194, 8379704, 8374088, 8359855, 2914, 15357, 8375097, 9876, 2044, 8355826, 18330, 8359416, 8366977, 8372760, 8347292, 18583, 5895, 18667, 24301, 8376735, 26207, 8377341, 8364262, 3179, 8372366, 8361418, 8365560, 16572, 8372935, 51519, 8359442, 7859, 8355856, 16219, 53, 5040, 8345849, 4315, 8379747, 8371616, 23016, 3090, 13843, 10946, 8367668, 8374339, 2172, 11592, 8380367, 8349398, 9492, 33600, 8368815, 3829, 18567, 8377493, 8352997, 8380374, 8335980, 3533, 1743, 40697, 8375294, 10758, 37899, 8363236, 28747, 1069, 25013, 8364888, 39150, 4220, 8376982, 8355247, 21568, 5469, 8353281, 23605, 8373698, 8365753, 8363236, 8369613, 8369907, 8375322, 8365032, 13463, 8375325, 3327, 10195, 5496, 8347704, 38849, 8371465, 8353086, 13695, 17565, 21083, 10948, 2702], -[12980, 8972, 8379345, 2516, 49433, 8361205, 17381, 10909, 8369195, 8376516, 1389, 8363797, 1473, 8333587, 9154, 8373716, 8372836, 34065, 17607, 41729, 6208, 8350734, 8536, 5723, 415, 8377425, 8375875, 20369, 8351485, 17972, 8370679, 11069, 11975, 9528, 8349683, 8281, 8372153, 5044, 8377599, 9229, 8380265, 3093, 13606, 11612, 8372632, 12123, 8372563, 8370091, 8372697, 8378930, 8374875, 4605, 1712, 8361077, 29273, 8871, 8471, 4512, 30057, 8361131, 8360254, 8366388, 7138, 27784, 8359246, 12501, 8358659, 11913, 19754, 8371330, 17725, 10164, 7376, 8359686, 8988, 21452, 10307, 5720, 8359072, 11283, 8355920, 28371, 8369357, 8364465, 8360299, 8350, 8377580, 8339135, 7577, 36625, 7797, 8375961, 16086, 10099, 11779, 8364473, 4032, 8348776, 10076, 38014, 8361418, 8758, 16176, 8354615, 24051, 8359065, 27457, 8369765, 8356985, 10137, 8363646, 27994, 8379837, 8377901, 8364199, 21166, 22384, 8371033, 8361615, 8347810, 8375946, 8372810, 8366163, 8346938, 26254, 25116, 8691, 22029, 2439, 8364766, 8356883, 11135, 9709, 8357533, 8379416, 8362578, 8379720, 2002, 23357, 8366918, 8372065, 13278, 3542, 8364740, 8350825, 8349128, 12013, 8357475, 8358793, 8362041, 8367793, 8370344, 30910, 8372015, 8367755, 12061, 2573, 8366568, 8352081, 7412, 15494, 8368981, 35084, 8360080, 15064, 8351398, 1325, 401, 8351000, 12281, 8371132, 400, 9098, 8377348, 8370987, 5689, 8375852, 34486, 29649, 1376, 8372664, 8371015, 16155, 29611, 8375476, 8359792, 8365464, 11457, 17602, 8366994, 8372234, 40370, 6114, 8354346, 8476, 4890, 16368, 25539, 8360477, 8367138, 8282, 30224, 8366378, 8213, 13627, 4866, 21718, 22438, 15478, 18037, 8374449, 8379841, 8346739, 23601, 7217, 8380047, 2799, 13869, 8374871, 902, 8378933, 8353946, 1406, 8348721, 8348879, 8372236, 39439, 25162, 6883, 8373320, 25939, 16440, 9102, 16509, 8371937, 8352726, 37059, 8362535, 8361319, 2687, 8363871, 3639, 13765, 8374411, 12453, 8371457, 8365260, 17690, 8377558, 19175, 8353863, 16119, 8364761, 7238, 21270, 8347390]] -w - cs2 + ct0: [[8115182, 4584254, 1456594, 318974, 2392868, 437626, 4248392, 1906196, 3854317, 1310839, 8169526, 5329554, 811415, 2508157, 5411060, 6210242, 7326696, 1985231, 7266791, 1255060, 6127057, 3612253, 1379919, 4607302, 786513, 2095880, 5810147, 590784, 1925511, 7434207, 6840272, 2441956, 3813937, 871312, 1348051, 5675432, 7060989, 5869070, 3184814, 3760206, 5777905, 7969041, 1210679, 172481, 7955689, 2849073, 8183073, 737957, 1250935, 5146020, 5820482, 5686307, 7485078, 5253642, 4009269, 6431866, 6180493, 5084857, 6398755, 2584820, 189709, 2748965, 8106614, 830092, 8079216, 3076047, 468376, 6680088, 4292203, 1129035, 4678077, 328017, 5508030, 1920535, 2551406, 4487310, 3853790, 7546535, 1164956, 4315103, 3178994, 6332837, 2806173, 7571120, 8124416, 7450127, 4974094, 8053012, 5707184, 3280118, 2001910, 4959375, 4519567, 1291604, 6178308, 280004, 7180861, 6673594, 2014002, 4161162, 7468709, 4314678, 1387785, 6903444, 4973667, 3281712, 5649095, 4410320, 2148710, 5518882, 6170897, 1004352, 8140437, 6441590, 8054512, 7264142, 1691287, 2108462, 5189417, 982031, 6903389, 4076459, 1545007, 1864449, 1431991, 876109, 8279822, 2896808, 7619169, 2137610, 7059222, 582931, 8325546, 992740, 7148831, 4654147, 890297, 1253555, 1729303, 7802844, 5464889, 5881853, 3229531, 5291140, 4862431, 7375050, 8035675, 4538432, 3775801, 3364413, 7954477, 6178507, 2774628, 4730385, 2395884, 5696067, 2147180, 3017677, 6061047, 57643, 8241555, 870836, 6984464, 2958199, 4862500, 7614543, 1130472, 6127694, 3599954, 515298, 5140375, 5582055, 5341246, 3557272, 757453, 3543528, 2897568, 6327234, 716062, 6878713, 5915496, 7711787, 7104851, 318142, 6438286, 1603617, 37083, 3135665, 1356375, 3956472, 7368754, 385039, 1020997, 5458654, 3995669, 3434390, 1010244, 4737333, 2919070, 7378290, 4420252, 2101857, 2264155, 2914220, 1868075, 3169896, 6857705, 3648258, 6417373, 960182, 7044874, 307737, 1732452, 2960527, 210824, 2171518, 175015, 246211, 6004565, 5926387, 7559889, 6441312, 1121656, 1348552, 3398018, 2812626, 8350006, 5146994, 5573573, 1332525, 1974252, 7221111, 205344, 7737260, 4432203, 1760022, 939627, 720288, 7434383, 6418946, 5396016, 2683757, 7900384, 4893046, 2545060, 5287221, 4382836, 2067579, 1536739, 4011806, 478100, 657049, 599680, 5381345, 4910883, 432554], -[4295370, 281930, 1047382, 5920939, 8246850, 2397368, 56355, 5910900, 2893094, 4595820, 3017480, 2434127, 2051703, 7804097, 3565568, 513049, 2633381, 374813, 4758662, 4497962, 5036966, 5907798, 7503941, 4849106, 6242204, 1638830, 5594748, 6313329, 3447801, 921883, 5000109, 6490573, 1072903, 6534539, 157451, 4098570, 6643224, 3995181, 6584105, 4692157, 1128321, 3185186, 3445339, 6879354, 5153961, 2327986, 1611191, 2876002, 722730, 6382907, 7666984, 1215963, 7706662, 1570628, 2095549, 257552, 3407752, 6365277, 4530073, 1285553, 7518450, 7081810, 273617, 7756913, 4044755, 3969667, 3533540, 5288111, 5837573, 7152855, 6528386, 8336326, 1428316, 5929183, 4997064, 5950020, 3390497, 6243342, 6805477, 743892, 270149, 3317490, 570347, 2451414, 2324234, 3914270, 6288041, 4146189, 6572027, 5676407, 357352, 2952235, 6326214, 6006349, 2212540, 6513325, 7099957, 7452053, 5641814, 7885239, 5331448, 4528272, 5787898, 5832359, 6133166, 7656250, 8033776, 3301245, 5108217, 1199684, 931943, 7375089, 1913501, 7463278, 1227565, 6972527, 1905021, 4415592, 1275050, 1461367, 7741393, 2415541, 5420727, 2765759, 6492086, 614540, 7126244, 2759101, 570792, 5576850, 7311163, 2592246, 229127, 3783282, 2132865, 6491416, 5342184, 53441, 604703, 7591756, 2320125, 7956238, 7744851, 3669095, 2166615, 304581, 1952641, 3688694, 1055841, 6792088, 4008459, 1871376, 4226837, 4213708, 2043732, 6120125, 2609511, 3625014, 4747872, 6994641, 8131099, 6960870, 5889639, 4210421, 5651457, 3130388, 2708750, 7171540, 7434728, 3572935, 4818606, 5206988, 5672864, 2304827, 7751429, 2040666, 3740972, 6966682, 7085710, 6244676, 739363, 6444833, 1559531, 7686052, 6417103, 570397, 2558770, 1076297, 7043917, 3785717, 7751939, 3387491, 7330918, 1212155, 7247966, 3650040, 7588387, 6133221, 1597131, 1169190, 2484586, 2414321, 2151430, 3950727, 6027161, 5643354, 5362009, 6077363, 6311114, 7440271, 6337577, 1583731, 295410, 3377575, 3707299, 3968335, 2999409, 3484094, 1641603, 3378599, 2429881, 2317354, 2586390, 3872475, 1242106, 4436469, 4704842, 7176757, 4913834, 5594817, 4054489, 434827, 1174534, 2027450, 896003, 900628, 1064218, 1992215, 723904, 487061, 7999617, 8022884, 3890367, 3098245, 7794445, 7323605, 3426595, 3694785, 2535905, 2740147, 6115944, 112592, 5366006, 5078797, 2140767, 5324795], -[4651030, 2691190, 7327817, 1284813, 6450471, 4708657, 6581520, 4053488, 6817878, 3698213, 1246566, 7037079, 3154772, 228525, 755128, 296036, 2342144, 4217724, 8298858, 187882, 5105305, 3922484, 1251927, 7499993, 179941, 743005, 3779132, 4264580, 547183, 1667048, 7653968, 5177312, 7525103, 8332871, 3997358, 2656187, 6182571, 7388130, 6442409, 2665317, 3415963, 5088892, 3888933, 5280046, 8263264, 6119307, 2708181, 6767047, 5620417, 1685641, 3494634, 3239675, 2872783, 5061722, 6891149, 8029545, 8291738, 561746, 3779409, 3189354, 8258762, 154194, 3847848, 3555159, 5426214, 7419821, 6377058, 6727992, 7167326, 5787635, 4245526, 5999813, 1686357, 2992562, 3693396, 2104026, 2295581, 8056628, 5100689, 3882571, 2473966, 6220203, 7931880, 5331565, 2254079, 2466857, 2651710, 4988607, 8215439, 4507804, 1688205, 3653698, 2976092, 1440316, 1182582, 1168641, 1826771, 3230919, 3441893, 1101679, 1741980, 5586643, 7293264, 3416903, 8124754, 7463289, 3737342, 4352418, 6341554, 515960, 4589717, 5016848, 1878967, 958660, 3377725, 6071916, 5735605, 5994864, 4734481, 5234509, 3152143, 1991700, 550725, 473828, 213848, 3815751, 1836339, 5781055, 2683682, 5734515, 6871489, 4381300, 3574621, 8286255, 5052919, 5677447, 2257195, 4553268, 4614540, 1635921, 1948587, 1381270, 7204911, 6709284, 2722387, 5759771, 60295, 4773427, 4502635, 4005266, 5862805, 1270491, 2726212, 2965304, 1217055, 3843292, 6735683, 5224025, 6968165, 3494444, 32556, 2118125, 6244818, 5312139, 5900852, 6920771, 3552947, 2516412, 6187141, 626249, 1589123, 137732, 1595535, 210781, 6744704, 2196537, 2875143, 3163896, 2057501, 51582, 4462016, 3124088, 3332264, 2426508, 5015414, 690523, 495620, 1868044, 6873152, 3870383, 5511700, 7214843, 619622, 4861785, 4013238, 164379, 1946546, 5826750, 6386615, 3978184, 1036115, 8186386, 4838397, 4824307, 1429711, 4577770, 3792885, 474702, 1512796, 6729983, 2870054, 5071503, 394814, 6088272, 4740778, 6254579, 1062145, 5728100, 2795670, 852606, 4120111, 125995, 7399216, 7945421, 5641396, 6337456, 2702982, 8186540, 5155249, 1162510, 3862144, 4899778, 6224497, 4989535, 686274, 4191635, 7939834, 5399060, 2991063, 7588076, 4675285, 2505494, 8322951, 3574611, 5336558, 1392186, 998554, 2329065, 5923162, 3329491, 8237180, 1290309, 4170391, 4738752, 5779774, 2262934], -[6340453, 7315075, 3359383, 1616816, 3054029, 5153922, 7922214, 1643996, 8153550, 4057122, 1447618, 6135936, 1107654, 1195713, 6270297, 7280088, 2208312, 6312377, 1881218, 757599, 2439408, 7831157, 2175541, 7790606, 906428, 1512188, 3483607, 7693285, 6900807, 5673223, 4558909, 4154332, 27542, 4717456, 4053986, 1442666, 2641964, 971957, 3274566, 3599111, 2013446, 479, 1380600, 1433419, 3804735, 3407993, 3666040, 1969287, 4250599, 2419597, 2353100, 6642082, 1502119, 7433977, 4979138, 6206371, 844107, 4104663, 210592, 3357719, 5080053, 3111697, 1617464, 7512987, 6839552, 7879852, 1958173, 4300713, 5854826, 5364669, 7787943, 1477359, 2924804, 2586124, 2048836, 608143, 6798478, 4937193, 7953761, 1446743, 3349846, 4665877, 4804122, 7067241, 6251013, 1087161, 5130560, 3285781, 6088005, 2222251, 5328422, 2551466, 6465548, 1721891, 3258317, 466462, 7499583, 3081325, 7407562, 1675231, 1452227, 8114709, 2495259, 6753011, 5303119, 8050596, 1039389, 3673417, 6826677, 5848792, 5111807, 5911429, 4627270, 2468894, 2451072, 6975982, 4673919, 132181, 2239259, 7315112, 8001825, 7715158, 5601294, 4805596, 7836490, 4727247, 3332108, 3210746, 4867764, 7612073, 4600072, 1850236, 5130577, 6830263, 371642, 1675854, 4757089, 8281802, 4759109, 5491146, 3039913, 3500029, 2804379, 7678372, 531218, 2397715, 2440564, 3681616, 7105041, 5599111, 1127830, 293131, 7258008, 6678265, 5364232, 7472158, 3610564, 1576483, 13007, 5921681, 2220281, 2719616, 2062097, 2609170, 4716990, 7701818, 7073368, 1072604, 7688340, 6789979, 2860692, 6146306, 1775708, 6553823, 3892983, 205769, 3632822, 2875275, 7397806, 4736577, 1100256, 5186227, 4474231, 1872039, 7041509, 5223657, 5442584, 23815, 217898, 5109958, 7407554, 2667321, 7098650, 6942203, 1898029, 1417448, 7085323, 4546010, 6429306, 7476595, 5718976, 4478849, 6369183, 1111526, 874598, 6201983, 6750976, 8153367, 2883607, 6557936, 7157958, 5117465, 4861657, 5029202, 6614297, 4244991, 5426990, 168841, 894355, 4260224, 959547, 3101140, 1403938, 6792716, 5256928, 5310071, 1320887, 2810115, 2206215, 3613162, 659754, 5043190, 5964960, 7583625, 4800922, 5846153, 4898991, 6956726, 1173357, 7361274, 3941335, 2713549, 3938253, 1687500, 1259988, 8165302, 5797901, 1761424, 4408706, 4385248, 6762704, 6757093, 6718707, 2419217, 4548426, 3898657], -[1231410, 5799402, 2588005, 1077169, 1494689, 124516, 6788638, 4178258, 6618374, 3048830, 6980123, 3242353, 1966138, 735134, 1846284, 8127395, 5306237, 5313157, 7272880, 6198297, 7803719, 6745830, 1978089, 6727664, 643816, 3728840, 2644771, 6101404, 2964587, 3369413, 1211421, 4659561, 6194956, 2985315, 3970109, 451670, 6166790, 2920456, 3067083, 1552258, 5600207, 1109101, 7197317, 5173911, 7860800, 7910001, 2478816, 2483471, 7982961, 6918536, 3330095, 3700342, 1096244, 2989692, 4438737, 7969514, 2354835, 5355891, 3486151, 5016797, 2041633, 1240887, 3951791, 2749355, 2565588, 7488752, 3767764, 5345483, 5884024, 7132736, 7784658, 3489239, 2352119, 3437836, 5374957, 6088613, 1413954, 5939988, 2520595, 5035296, 1032887, 3853376, 6064933, 6513586, 2306290, 946769, 4875335, 795652, 5873622, 3324543, 383845, 8090963, 408474, 3904245, 4171234, 1503834, 5133458, 5951297, 7271812, 3252482, 7108368, 2722879, 2861677, 1976595, 7110259, 2328228, 7713263, 4367860, 1147825, 5516493, 2836804, 6066412, 2247687, 5217763, 6088767, 4245211, 3185977, 4577021, 7036962, 5669126, 7869534, 5810781, 2061533, 3024496, 1770346, 2170976, 8351802, 2919982, 4651915, 3491002, 8161510, 4225944, 2006497, 5384023, 479178, 3567617, 3980342, 4385573, 1058575, 5628011, 5756818, 3914002, 242516, 7694345, 5825945, 1538675, 1580777, 4430581, 4809368, 14735, 2870926, 4439207, 3339389, 5971994, 1498237, 7035035, 7650460, 867388, 1713359, 7747326, 1767332, 1362983, 3991968, 3111800, 4716020, 1938720, 7047473, 6005890, 7313876, 7980679, 2785223, 6228952, 3606415, 4429731, 581532, 7336315, 5274324, 1897136, 3403760, 7656980, 8328023, 6959192, 8373095, 707783, 8170302, 5194613, 3062450, 1305812, 7338104, 892587, 7352847, 6947592, 4978977, 8251816, 1444621, 2294710, 594809, 4396572, 2878411, 8274079, 6930968, 5703215, 6001949, 3235644, 3092092, 5875240, 1490277, 2670438, 156762, 4075851, 4811455, 2216788, 6655240, 2475938, 7063834, 6762482, 5775277, 5947792, 6261766, 773642, 1753385, 8359696, 436933, 6692998, 7853074, 7667883, 4207157, 2828140, 4976068, 5733876, 1470853, 969365, 4162188, 7840195, 3169231, 4601061, 8259224, 975527, 3417637, 7687625, 464756, 7516533, 2476912, 4967155, 6922121, 7148924, 6766926, 1958170, 1921562, 4043720, 3089422, 489863, 4883797, 7947441, 5594011, 1241508], -[7120288, 6630519, 6638351, 2985520, 1972209, 3703847, 55422, 4920852, 2643574, 6744197, 7135584, 1681070, 1910971, 2414583, 1791029, 6785535, 6792563, 119981, 6574179, 4765489, 1764447, 6009442, 5817331, 7496057, 4927202, 3072279, 6009325, 6999339, 7814485, 3317200, 7412511, 7886915, 7483713, 3519797, 7957743, 6094966, 8123794, 5252851, 173021, 2977769, 8095056, 560015, 1045179, 8069473, 4684433, 7895055, 1842990, 5986220, 593555, 1751164, 2954444, 3046916, 1790076, 6798165, 1624632, 1386930, 509290, 5794851, 5043716, 2905335, 7025412, 6311083, 2372723, 872115, 4703505, 7804133, 210054, 3738128, 7437903, 7377035, 5189163, 976763, 1044775, 5566001, 4930822, 5472487, 1770546, 7019868, 1414168, 4926949, 1558080, 268413, 4632590, 5150715, 1425905, 6707376, 279759, 3170771, 2864577, 6606900, 8179879, 2432929, 4430917, 504768, 7749528, 8312150, 2019701, 666853, 4432796, 113248, 2832884, 2551174, 4806929, 4983760, 4925375, 1672198, 5292516, 4434736, 5049615, 5474496, 4163481, 1385852, 7345470, 607657, 1583979, 782617, 17384, 4361001, 6869381, 3939499, 1225289, 7043149, 5300446, 5433726, 4942410, 7894569, 7726976, 4708429, 3819632, 3225587, 6371368, 238018, 2949728, 5556515, 1838800, 1479109, 1968276, 5957041, 1030713, 2715818, 4319601, 7360143, 3966561, 7620326, 7071608, 5249829, 6095062, 6439450, 6659933, 6279237, 610003, 3951823, 5356161, 98784, 7483793, 872398, 5344875, 5892461, 2902228, 2538083, 7042765, 8189515, 7836324, 7657131, 6926646, 5071770, 1198930, 965522, 5320984, 7643155, 6384420, 7407387, 5508208, 3541356, 7530236, 3422362, 7626208, 7415686, 2325582, 7805630, 6351082, 2384280, 7017750, 8163298, 7332601, 6215178, 83134, 1461519, 2846742, 3398022, 888501, 8275929, 7990903, 8177286, 1055018, 2951442, 1483179, 1658923, 7996254, 2601955, 13376, 7379554, 373332, 7704351, 5704917, 4890531, 4689623, 18485, 6402771, 3579286, 4712985, 4962852, 3716203, 1089163, 4098571, 1771359, 2408039, 6980226, 4188044, 2749354, 7777099, 8184790, 1595180, 5011005, 2284427, 7905264, 7381347, 8047574, 4574221, 4987271, 5350779, 7809147, 5779924, 904902, 7070593, 7800604, 1330807, 1514506, 3680853, 1492999, 3510291, 3132378, 1393801, 4243180, 299171, 64800, 6531866, 3976505, 4644733, 4916686, 2064398, 4970084, 7019883, 8064311, 5016993, 2701475], -[8148699, 4475888, 5522173, 1085602, 825264, 824859, 6056887, 6561652, 8232357, 5470714, 5127020, 6347680, 5944623, 7955865, 3614075, 4692673, 667222, 4269796, 7978318, 2001113, 6476981, 6796010, 3879466, 6979019, 5475477, 2985496, 1827104, 2031016, 1765184, 6478372, 3124284, 4224096, 5874071, 7050106, 4612129, 583163, 7185257, 1020513, 5630289, 7607029, 7360648, 2925798, 4685348, 5501700, 3165828, 3790965, 1662141, 7405842, 5293985, 4440335, 7549553, 5375197, 5200899, 5295638, 3715277, 1286638, 1539216, 6937785, 3667318, 8308592, 3759094, 6167055, 2047208, 4992707, 7820630, 5430265, 7907704, 8230815, 902900, 8350087, 3518170, 4664124, 3128785, 5224494, 112377, 1560474, 1012250, 6107240, 96312, 4001689, 6453425, 3824978, 582942, 5064868, 5894807, 1600316, 4951897, 3277030, 1413186, 110752, 847151, 5210336, 7091751, 8255853, 8011664, 5785793, 7029785, 963233, 5242721, 3622236, 214026, 3227907, 275503, 6079735, 5780031, 976457, 2908789, 687000, 7916743, 7177882, 4525957, 6041122, 69729, 3514686, 6879689, 2114744, 4258451, 3257229, 1424208, 1044425, 6851158, 2209899, 7125507, 1898979, 329091, 5555942, 2357927, 3499915, 2061214, 2383277, 341026, 6473006, 1517206, 7108619, 1099756, 8019608, 615383, 3353007, 1436611, 4912105, 2682038, 1352202, 2727827, 6641373, 7231017, 8259128, 5418246, 4816277, 622134, 1909072, 5681784, 5392439, 4814064, 3551053, 6752740, 4792705, 7046280, 2550849, 4014239, 1935687, 7470562, 7761636, 5326415, 1939597, 3590434, 2330862, 4721673, 535247, 6287470, 1809678, 7243219, 4659852, 6706467, 7807331, 1599434, 1542686, 4842699, 962363, 2549995, 5928596, 1786840, 5322131, 1459747, 6077106, 6092980, 2993716, 7679550, 4699407, 3851461, 4374641, 6917820, 1516795, 2753689, 3519821, 2297439, 4353421, 7576042, 6087467, 1396828, 1720610, 3117543, 8053413, 7997066, 8226460, 7678640, 3565340, 3019896, 1264799, 4020844, 5573615, 29068, 1131281, 5563998, 4233187, 3316092, 6174100, 519691, 1297846, 3149871, 3080831, 6956233, 7068779, 7361037, 2532858, 5170842, 8342835, 5684376, 7029442, 1074944, 2865899, 7130720, 1501687, 3787095, 5860976, 1646867, 4730592, 4072847, 418544, 8156927, 1916269, 456768, 2647131, 7359430, 2231905, 8233873, 2712221, 189035, 750601, 1511841, 5888895, 1278381, 5894115, 224109, 4725215, 3375474, 5167934], -[2163297, 1765010, 7613218, 7133907, 2762516, 5705325, 738989, 1517741, 1864787, 1364733, 3153514, 1760283, 8103527, 2120947, 4467473, 3788122, 4222068, 8095111, 4229439, 5799483, 7749991, 3572134, 5027685, 7636134, 6768714, 3133830, 8181894, 6330897, 4597133, 1351399, 1625269, 7206512, 1660004, 883435, 3727532, 1380889, 6955115, 909766, 2693896, 3146895, 6197574, 3439905, 6182851, 7083181, 3644723, 5036616, 3618302, 4930116, 7767708, 599322, 1575888, 6043880, 3657679, 2395052, 794633, 1001239, 5386516, 5919638, 3015585, 671789, 8221771, 7713160, 3682020, 3967276, 2812711, 4221770, 881847, 6319106, 6480285, 707796, 1396292, 8325599, 4530566, 613780, 4425414, 4476711, 2805920, 2192125, 7076635, 1721879, 3151081, 1776038, 4487603, 5035236, 2421891, 7550910, 3339844, 5853955, 1185366, 2964308, 7468902, 7472498, 2741750, 7932140, 2851303, 444620, 3621432, 1612953, 4606185, 1915752, 7262334, 5217702, 704680, 6907135, 4070606, 6314606, 1902935, 4769170, 6923277, 4878253, 6796001, 3642402, 5794096, 6604780, 3237455, 1563366, 7452905, 482894, 3039269, 5211900, 4512669, 5693034, 5079627, 2210264, 7125087, 43622, 1395018, 417799, 5421457, 1484443, 2533821, 1666419, 6049823, 2115818, 3088901, 5762098, 6473634, 5500191, 8363031, 6221230, 5759502, 581852, 3422476, 4360649, 6139698, 7370065, 3152416, 784027, 478130, 778126, 7220007, 6813115, 7383130, 6873546, 8337635, 4113040, 1137262, 586807, 8197271, 1438412, 3616882, 1835146, 6321413, 5282490, 2732103, 5787030, 1378120, 7654226, 417794, 6354522, 2249874, 3036511, 3725400, 3929932, 673520, 3171642, 6475184, 3691599, 1929736, 6268011, 6647549, 5698945, 6708906, 4066828, 4844383, 379689, 2484561, 181106, 2343176, 1297754, 7609531, 3060780, 2058001, 1293844, 889744, 6134481, 5205724, 1025466, 7193368, 2754990, 7575338, 5912045, 1653260, 6304771, 7258068, 5658350, 1636841, 7289342, 6400190, 7247458, 561337, 1363188, 4240815, 4795440, 488182, 7848495, 2257242, 7755044, 1860689, 5697642, 2670527, 2321876, 6514003, 1968374, 4057298, 8060278, 4274664, 2428461, 6498068, 2770310, 1939049, 6285904, 6945803, 7485492, 3964445, 966547, 3789367, 5382694, 5454794, 3104407, 3062450, 6867749, 1362895, 1532032, 8109655, 4815885, 826942, 5649274, 7165041, 7811878, 3453968, 2745854, 1250549, 3162572, 5108426, 5078940]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] -||h||: 60, Hint check passed -||ct0||: 73117, ||ct0|| check passed - -signature: 1C3B7FB47134FC1211A4F8FA16D8F84D642DB8182BBF70D549362A3182E2D313885BE701B5FBA7B2A7EE0B19B04A8F4E1D4B689028B10EB196297F56E75A5D037C89B141FC1CB41436159E014D096B8BDD86CD0946F4D51A02950FAAE06AA28B608F86A3AFE6A423DAB187CAB362176E44C7CF5C33E872D67126D4F7C442EBF493B685C5CEB7DE5C070E2D0656E16455D2A69A750EC29B50196ACA08DA2BA2D4048649FFF5E2923623561456897543BD1CCFEDBF854ACD1B4334C49C67DAA0456B1089B95D83CA8CBFDC1012ED3253AE6A97FEB8E8185D7A5A034F9B6F17ABFEA994AB6BA519FCF7632284056BFC41B69E7763A644D51D5936B235D8797A38657644AD0CDF1FDD05A0F7F36841ABC2BAB1EF0091B9A50B23DC37ADEA38D8791EE9C4728C612FADD4092A2EFEA38AECD6FEA2827F7D32856C6D1D43B0D30DA9DB79F192AD3F5AACF71CFD814E41D325D8D843D0F8252FDCA1279FC4A286063A69305F1342A46148D39580D290B22609B1B5499F1A5A698F62C1B0C1085A08E285E269EC4348494A188FE0F7C761A8C2D33D74831DF8969AD5464B658E9F059C70DC50F4D9FAA4119C69526446D59A46A0482C6ADF363E03887B320CD7502136712806E02067F4D4C2637EDF8F77148F6DB7EAD6EF797D7BDFDFC3438570B7FD144A4646D5FDA70C55352FD4789670F57156A3FAF6BFEEE142633C626E783BCB97AF8350833B159ECF162512CD5851F91332B8477E82D14174F6E52585B5EEC943AE99044FDE73E7D8035FC19D56DE56560DD541AF03999B415A927FC3036D80B4D2C64D03BCE42B7CE8D9863443D0600060DE7DECFF046626095F44A7BFC258DF7CD0C7570F5E06A158A6100CA60CDFB3C6C84029F3CFD1A1F7D355A537EF2F5A8C6FA5D1D8ED7D2FFE100EE943B8E20215F4DB23D5CCF782796BBE524A9A83904B4CB0F74FDAE0444B6D19D91114FC5C8A186EFF80880F7840E53788D334965EFB504695C6E9FECD2CAC50A3ADA9B2150BD88CACD80759066ABCE3868529F475A915D1341062A32C9D7713C8D8B76E9081EE715DE298E6A28EFACCE23B1916667396C4B0DFA3E12D11A5947B38D67B0BEFD14244B4C847FDB72226B3DB2C7AF3FBC5468768DD7849FDF20DEC9E8101A68F9304CABDA527799EDC0F994DE669B1A57E6E1D8D60893FE37157D72B0430530E362EF790CADADD5750FF38A146DB00B7553A2357FDC5E7454068B7694FAEED62454E5CFAEF69024783B5173D5BB761CDA8986A874F02098D93EC135B03164C2219FB39E5712408679147FF71F06B9C5720AFD40AD2561CC88354997066366A464454924B49DB8703EC24F807C5078FF68D9510587B2DB6BC82A6D597C9E2941E92444A7E3B85AA4766605E4C3D726589B35E2CD5DA4EC4288C615D1CF3582EBD5E63C2BBC60F7E34849DBDF734FBA6D4D8F4EF8121DAFD049AF1AAAABE4769FB9CC591D2206051BDCB9C102141E540BE5A4E4242FED93E96F620A02CF02A07E12A5AD8F3C7B6312198AEF2507D065D3614830F5C5441F9C53238EA649366A0EEA00350FA7414C7544FAD497EBD92D512E5CDCBF8C953724935D97C0E1A3079D45A40A54EDD9910E52F88175D0E4FEEFA0EA779404A24AAE32979F0AF3EBADB745B51B09FEC972145AE3EA4E485428EEB4C610120F29E9D94B3E4BB9B468582DAD685CDE5B5A900204C16863C21E1B5059487D772955CC1A74917FF8C05FDF4BBB8CC54CA2D59BD052B23D5ED7AE1A0671AC9713C43D1D7ED55087CE75245B496CA21011C08649471304420DB1142C2733FA0CC8E00AC670514882918A0B93E6969B0FE214B63E0A2F2A9C092E25D5E6870CD9BD98EAAFEC1ED886F64C9798834CABFA10DC8F45A86E89A0CDC301620A6202BED8C6B8F28BDA260DE8FD6CF502EFFF40F88E1F44786C2A062BDE1E44B237BF8BF5206E7890591A9E09B6AE196511CA444717E6A76A005A55F5866F010D79110A8F98217BAC2A2055883392ECE9E5B5F423F6EE28FE1F88370DCEDE6B3EFFD93A427F31AE8AECD8FBA6559ECC8E23C595147AF5DEE50E4C938B6D3D19E02181260800D5A12DD883F186C94061068E3BBC1D7366259664ACBCE927587A20F4BD80A67F72BDF405DD5E4F04679D916D5BA984CA51461EB33E0626CBA8FA7FDD6B3DBE15B21B776B18F6C7B82328486CC2644E9C6040B6F8DD97772D06944B7DA8B86E3876C2FF14C5E995D61F19FECCDFD79BCBC159986003C77961DE9487FDEFF065D22C639417C10DA0ACA253B9025663E54135DE4AFA0DB7A0D5AD1189D94DF24D6A71CD5A7858D48C242A7A7E3AEA8D67174B444791E2F43A4A081A99F9AEE0CC2859C0855326E2036B1FDB89D8CCF00AF787B459AA6049BC67FB54D82243E4F58CEE58E9255DEA3D5C2254378AFEB290FE78630A9065937873498B350526943DE231F5384EA83E98E2317E013C487D57EC50D1C850F83B272437BE365CA11F1C94C36F6A36DD99418287D0573440447AE18F6327AB2CF8F81CF93AFB3D09F6D814BF007740307BF22A54FA24B3D9155C95735B22FBD66B6A63DF6771904EA8DA54B2D4BA8477534065BB20B5653015BB67EE514EF0EF4EE07458B4196884C1132927540C3EB78C76E795F433EC0B43D544FB6F28006E9E49C79FDB9181AD5761E111346657E89BE1E2F89A3972C20101BA1F7F63C92FB9F299597AAAAD2C6108BC5D314927D4EC1D395F1B3BA859453A7E292CA8F0D50EC63A53A9E40248CF779CCDDB1A17710F98041FA9DC793E0EC53AC6CEC4286B891AFBD6D41D67AA630DF94818E56AC934FB14EE8C43C2B3893D01A08BD85CC69230FF416BA50CAFD3FD7BCE3E7A16379CD0F7E5AECD4B39B856D4720E8A0410376DAA35ACEF23A13043DEFD5EFB8FB210994B62E8088294D2C7497F942ACF47F1A1019D9F12041BF3AD086115282C1989DF5A60267647E8747BAA2F27BC8A48DD730199831F5AA61B954F01117141CB75E37C4EFA3377A86B8AB916874F348C9987E590D91B908E04387B7B654A6103D2E6DE8647F3953F0D4B9E977FAFC3F1087EE529E31C545994D79FA3DED540185A8FB1CC87ABD5D570959B061C23B3D98628A53E9C6D5462AB3E53E773202B38370EA2742E45161400A5FBB8C86C1EC5F55B30CE923ACD4EDAD4913527D1C9DF4426A851101899B0A255B6688D0A7134978139C56B5D25B8CC389DD3972E38260521FE85BB9FC0F319AE57D18D1CDE432C7F34C1BFBC38A759882132B0CE158023DA883298051E51743390CCA45F525DEE3C6430948C906876664EC00A259B70E1D0AB9CBD416950653BD507CC0BE87CA531ADE170917F4856CD4EAEE9E040EFF1FC4525F38C6C032C03DB831AB978BFA048FA8D38F5213A987E5780AAB8D989516FD7AC235A9B4C17A7531FBC22492034969D2ABB1182029804F1C6F40F9B0F39A980E6506920A6EE84847F46904EDF22A1C78DA1BE49DA78D681F049D123DB37798B189905EA20583E4FADE7B153ECFE3228D0ED92927B2E50AA74604A9759232B546C4DA752C66B0616790CA1AE90FBE40E25B2B5C9B5E261BECAB2F7B9E4F1541F5023631DDA694B12DA8567D7B62B755768F76CE749DC95541D49BE856121050C6BBC59AF3EF47B2F892F7FD01E4F192756E5AE1EE01F17E8A96B2915EA1C40C02466214D38E7F8AE8749CC9C00F7EE6DACC3C26831435F3913372AE00EAB2398A44A12DABB865CC5F6C345190A1DBC2BFE8497B3FF1460F49F04A9086A8250931B239322C18A08C28175A6B32FCF602F62A1C7D2317C2B83782A293594E4A02DADE59FDCA0EF3F256EF254485957FE5B0BF0452B40616FCFB7836138C9EF26109D9CE08E99421CCC07B0B57C90D51583C4DE64D8443359C96BE5C94CE11F536694FAE8463B6D04DCDA912B7330CA4664D179E824DD6BC6377DFBE1EFBBDC2F9C5497B49343BC6439F88C9CB041038971057826845BD39EBC8C7735AC7C062DD7EB67E20D7391726C998543470153D841026F53805216DB0C4D90B4BE069956569F00D416B9CAEE4BFC1BC515C20CD7FB2DC1DC58832A5D2EB50348A86927D78D48632D4C69C58D58FD39C449F1E06D1D41EA1A01FE0F28C68188C85CD76A56E3928A3BA2E2A028DC6F445C446123D69CADABAAC9698C3DF1F2102D1FC318D6E0D069D8BC31E73588D3999BA04B5A6DA47F62E7C707179771E0A8C4982A858DBAA9A4A65675E098B644468A0A3C8CB4248ECF871A3BF828874BEA55BF181BB265444AF1C77166EC6CB47FBB39D21A8110FD6E6458582C6FCE348475619618540E4535CD27C195FCD21439FAEE1268BC52EC6DB9AEF6AC082CEFC1BA389D8AFBF071987D53A39ACF5599F2E06F7887EB63A312CE4C3D07701CA62ED2D486F64860BB32CF227929F9737D6C80354D33407A98DBF303C1E87698F18FE626D8A702F6AC095EDE418CE6A88144AC74CBB5740FA53A6FC3EBD3E27C6C68F04914789AB5BC1241609F0E9FCBE0360FDB809528F7457625D137237045FC46DB5CA5A28088ACAD2CC8D9A1EB90A1F271ECCCBCDD4196619E1A3E911BBCA9430A2AC60E529351A74EED7B4EC0CCF6FADA40A4D918C54330DFC85FAAE4F5D872D02C0B3E074A9958E8EBF433A8BBB08466C90B1D1CCA2E194277F22D3265F624786ABC21FD893422313D7AC4FE43866A6768652533A6140CA1F382FE556EABF7C53BE4B72C7F3821B26AE6CAE3CDDF595CD0F77A99C2360F98A9092780D4635311A286FB16A2429155BC57A03CAFBD1EB23EF574E9C93DDB8C11A811BA4CB025583DD53F7B8ABD9B4813177894798C9E9F5E2289855E586046727BE7D8C388F6443B0739AC2410EF8B980FC01A2F4AA0A2065D89DCA877C263A2CFF9F384A0750CE58757120D45BAF7522EB532EB7F5FDCF3111DE2291396EC9403618BA4C993898815E36CF07BCCFA857867AF949888118B3C603A76C0AA25B349CADF9BC29F7DE9DE518B6A1B5122ECE31EBEDD5EEA10F4A9A80B3949374DEE28D5793258AC1C73495B91695ADF6512B8937522530D60B74CEB0FE97D16DD642E094E51F18C875420ECF75FF23A544435363046B2C74B89EE4B13231B0C674A74F3104E0A159392836A7BD696E75C1173F20D525976AA1D68E21288EF072B3BA58574FE08AFD0B8F5407ED7CFB2831D44C5BD55ABA143AC446D5D2A906F0EF89A68E231D8BB2670AEF18CB47C45A632073715A6143B0759A24C9C97A29D8F8CD69473795096115118E1847329BF98A4DE168658FCBA2CEC9CA8BAC487B9F155EBBAEF2DA4DFA5DA707CDDC00215F8EDF7308F8FA12A722963573594281D528696DC9E36BA464D107031D973E84DFD1415485BF0E800A56080B040BD58EB40EED553833B3BEB8BA9E5F9F815C01C378A8E9FD009558F707078BB3E08C4350DC0BEE5F4AB3665D2A71E70531B3DBAA65CE945C163D3AE88DFF91AB2646D5354191BC01F405984528D4CFFB69A8C86A25DEFD81B40EC75832F0A02FBDC1628E3BBDE95D83A5FE6B0893FAC48E62BA3A2E920B99BD0FFB0355A3F3E86B466D561214892F7B6BBC15AF8B71E279278FE563C8B7B9AA331931C9F2C557E2620AD4ED6FC21166CC90BE76029588677FE706AC280F0070A27606F956530F40BEC2626407AEA8CA7F3330F45D1AB52E6F1673FA6EADF812BA5FA55BF9DC67BFA84E22CFF9615917B6CEA9893A193751CD917B438BD1BD48B4BA1E9F1AFA6436F5625A89122B28066EDAD6284D07B123C29017DEC63482976ACB6CFE7340B2CAB9098919C63E1477EEA8958F318D106F97AAF17D18A3E4D8CA72FDFA8593F4F568174A3ED97ED7D7023D0B80660A0EDDF5DA2534AC8825FFEDF9412EB33E4E0DFDF71865C4C0A0049DA2D77A80C1C2CB1E07C1816849D12131D8170AF08FFB8CA0D0FC69099305E35DF7259606F5B31FB9C43EEEF984ACFFC7DD5944EAC643B6FFBE7051CDE6A67A3BD8B617611B2D759EBD34CA9BF12DFE45DB2B95F3AB65BB5226AF7975ED4B352EFFB9E833020085660B951541F39CDB43A7C7A6AFFBD0600764BF3B03C400FF1B55B6D27B626DA06F7EA130910F64076538DC05949B20D7AF51CCF4E0FC688439DCAECB5BF76556D89610E03D0E138088B9CD6F1C8C5B81EE3AE7CF1751BB2B393DFC086ECE19FBA8920E8250FAC575907133D7DCD9084F2B63AC5AA9F770E885CD6E401763E1CAD8912F3C709DD8866853ADC149A85BB2926FB17FA4DFF9B1D6EB8DC84C5424D0F4A54E99C11EEB2830505ED3BAC853E7AD8C377E849110189E5746E8A8677E0A8A399BB35487EF22658CDAC854BDE55325D24DC1385517676DE8102D2B2AD79C4FA3C3AFEBFDEC78FD0950A76E2C0BD3C3C369AA967EB2E622DDF94B348502632C4230A36DBECCBA333A8CAC5E5283A3C12587182248535F686D70D9082F37383D505D768BC4DB030D346797B0B4E932365365AAADB1F0385796B2CA2451626B737786D3DDEA1A5CDD114EA1ADBCF400000000000000000000000000000009141C242933363C diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt deleted file mode 100644 index a635a5a77..000000000 --- a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-44.txt +++ /dev/null @@ -1,75 +0,0 @@ -Signature Verification -- ML-DSA-44 -pk: 5B003CBFAF3E5166A85F8A45B9C1A4533FF216FB226CFEB83A81A20EE6E97E540FE2E3C6E44262A8C344330126E881551371383EA34EA2ADEDAD1185908B34905B09FC1E1304BD96225F36056C1B2099C624E770227D1E7CC310EC1D24A8F034FD91CD01FFDE608FAFAE157C6589DBD5F63DC8F57E857844AAA44E0B644E5F6BD684239D145F3D45A8454BE4BB588AEF4245DB3A0BB949322987B9C40A7DBD37A4526363FDE5EC3778C1F72E85230187A9E7B35028C3EE5CF8AEBE8748C45D50E8E22A81E70494C11C276375A8AD230411DB26C8100F07C471D69095575F09A1EEBCEC4C9C0E050B84DF0D4F95E558B921DDFC8F26B2067680998E9C99488EFC128D5BF927ABA361FB5E9CE7CE32C0524EE88FBA0F3BE5A1A7C55AE6C518AD4C7A33C05E2956CFC8DF6EB2A81FD1EDDA40F67AECFD715E4E3DC042AA939ADD3D275AE72CA7EB85F0F0B38884D0D7DE81CFC8487411F8A84247B82B2BC28F76BBA2D80BB7009697A7FE729DC123D11E695E60C024FD31D5F94F5C3CA6B76A13B7537FE6402DDF86EA6D8D77718D03B32505444ABF4BE76C01FD43CC86CDD5736E469DAF3B9A239DE67FD4C4D99319B0BA690C424DA2F3E68831E5CDBA77B49F20D138A3CAED4EAEC8968F33169C3A2A7A28B39B875A6C18F5A3A7F49E6AAD46D475C99FA980BCA322FC69633B576B30E1E98F771412A1267F0C82653562F755BF39DB93090235870598E405BE0F8A58F033F19BBDF126639FB85D6030CCBF4666384943E7F4DF69EA767982D82147D8F52955EBB3D3A8D90664AE9B9610CE8A8F66454B2C518BE42853BA93C434C8D9E072726BBC8EACE2A218F6DA2639737541FEB2016E3478E3443442381A4AF18004C49198D2A87154DC6D8975BBE20C22DBDC1B95DEB7EB74E61E5AFF999833B746221FA13BC442F9F25C6035861B7A5E75615CA6749716E8CEF56CAFEAF04CCF6B824FBE295C55C2D796AAA7992C49C4903D362AB50AFABC4AEAF6644106ED2F749CAE8C970D4D49B79A98ABF6CC3933563E499C07B52B80F963DE9A5C54FDC1EC4898B7713630D0C6F4CBC84DC245EFCF821FE382E0FA855AD32E3B70D38772341C0C3000D2595F749E26C5EA692A0BD42251A5A9C5653B995EB6B83A2FB8635C0EC0E29F9760A4684591D0CEF71D46F529204BC56087EDAD2D37939040F834610B9BD3B616C87E43B49E8B38D21B9E8B936B4DCD90D73C12F3F6F66A111738B16A2EAEEF8DF66C61E78D29AAA2D1378DA0039ECD56CE7231A5ECE7EC2ACAC469A42B9E323AC420D86A100DCFB78B1716A0365DA724EE0EDC9C4E1115E3BE71F4FF0794A10AB766D49E11EC1DB556816627DD54BFCC22CBAFB4F2A2568192638B9789E3020A2802A4B90F9DDAA36F650546D41600B2F33A86B1B10E802EF9B7C4DD1975970A930B0CB383E3916728CE1E2C698DB19AA027CFB620D88840C51DF17657BEFD3240510D95A0B6C480FDC1A1346E00C195CFFA6BA7822625F9A47CA029C29858F07AC0A86F4A1D0792635F82C15D5DFB19CCC415A2B9556AD67B1806E8AF681827B1C465D8646B481A00B7AB68C7CAFC623656D2FDD9431EAE0171B96885140196EB7F1ED76BE72AB001CDE7CBDB220DA5EECFE8D341EACBE12878011CF85681AE8F4BF0A9E8C40087FF51692207C57E0BD3C1F45E90F22B5D139008CCCDF10795EF0858C5DC3F6FD9F78858DFCA5D81510A9682EB45D0E094DEED0454101B0B28EAD2BFB7CF1230994E03BC98CE986F4CE7720577DA9C8406BAEFCB3F2A8B9EAC2D1A5C598A076E52BCAF2951CF1D4339757F5C6C522C3BC4B93C71E47B639A6FB8FFADB117C191B4B9D0D9 -signature: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A1523FA43A15CC894A81285C4BD0E5063267D317BD1EA3E3A2F0AEA6BFAADF074926F5E522140F00CA40BE0C60D492C7BF420EEA18F2C922A0570FBEFBF07CC3D084793D4D07F9FAADF386C6D1C24AC98F153313FD1C5957D02C884B21CED24B3BC5148F9F837EE94E9FD03371342353D627FB43FEF9472C832A1DCFAD355DABD974AC185C2FF7A7CEED63124BA86696F095D419810E381FA62B66C12D2B75E8CF59B0CB76E9D0546D71D9BF154D0D056603666212ABE8910E60C08DF738EF0EE8BB794B35C6E47E7BFEC734A6451909972093BC17E080518053EDE94905978F397DACABE24A6C4194F0305C0F6839F8D9993A6F6948B9EF3984A90B1C3B2E9991449D1B1BAC5DD54A2134608851662F6F25E8ED9BCC65D199A770F20D2A28C35BC56500E4BBF0823615FCD07452B8A558F8146081861DCA6A6EE9E24C688DC7367BEA1E00181D8F0FCFECD8D46A607C08CCADC32499BB73A9C664CF07817C7D496CBB428AF3A06ABB3C4A140C681CF8A6B7216A64AC4BD3505E4AC5C08C076C9F34F7DF9157BA1141628837B0F3BE1064D3F4908FF0DFBD83426C90ACA12D8FB9C9F9955B5959EF6DAEC31140CE117D9448C813F2A940D54DEBF844E28CEC621CEE34A9F336C0294572CD03AE5EA6A9B7199C6FCD9E20BE47214FC0F7E0125A6D8B8C397CA9D497671BC41CA08CCC153AEE53ED7F52D678E2C1873D70ECA96AB6A43ACF1786BB018057F98A4311751CE6C3D8B0C4601A370AC792B081CAE7581AC836F0C0BD3F11D2A78EBC5E268F8D19355F3B4995B57736C042F1B7B90EA55899011DE84A2CD0F6BD440D51DB2A6BFD93E5ABE620BD0CF9452ED0C5F4EEE9B724B06FE1981A16CD14D554859ED4A1B205E4527B66085587769ADFEFC289D07B09CABECDB95CE52587B7BE95D6D5068C05AAC009CDDC7AB550CD49C66EF55A86EA04765C46E74CC3ECB02650797966A6F125DB780C3C507C2E2B4EEB148B243673FB5FD2865533CEDA9938821221A01A8585EF76086E429A80A99AE31A2A6D4541AA3393FAF0A092B3744D8C742239C18F7AA3FA258FEE01736D446785BB9C0086B6BEB05AE13BFE5E5C462A87C35CC5731218EF2AC902B4505A593457F553F8F4DA1533B2B144DB83963663C3EC991C6F834DD9C75B21E40D0060646E323468C1D44F6071B6135CA41EADD17F4C36FF21C5DEA01775FB519597D4F9DDDAB30CD63DB37E8F5C0620EDCBCF2C84595C8DE1E10EA2D8D7A8A2B7D45BF84C0784392E0C7FC74FC8787C118782E57802DE412A1E99D002C2793AA614DAA5685C5D4253FADF0A630D1150DAA8D8D54F4EE0F6081E59434C6664A933167C61262FE7A16E3CFC18BF9AC42C49C5E0F9928F2DEAE020F5E105BF247E4432F4263E6BE8ACE9D8D8269B215E31782DC83B0805538BD75503C2DB6E90E99741D120951598493176499DFABDE262A16F28EA1FD183485478BD4E906DDA0FA037A7061BB28C7031BA4DE21CE4B1F736B1DCB12ECBB755A1DBD11469A924F417383E0B0AE22739C8888477FBE24336C2551040B3F044B02F28D4D5C3CB4852871DDA6584303882AAD3DEC7D6436E0089F2E2E4F6E2B5FF628DC565CAAD8775C1DB24CE7FEF3FCD524821CD58E43443D1669F3E4DEB508C7A2EAF0AE8742C06C537520EFFC894EE1F58EA2D335E9B8986783CFD4E3687D966A03BE25A8DA8F8565FDCA33EF9F5E8444F0966F73952354A985B61C2A4520F7758721FE9E667EA36A746F999B6E1906747555A361CAB9603A68795B065CEAFE7625F3EC8CCD9589C9E4800AE2ABCA461734BEDF46582E2820F129E4030D6A2E967BE349BA20DDBC5DD04EF8006351EB39AAB145E0E5FF648491C016AB7CA26E5789BB184DA0824F699AF597ED6A252C7AAE5F60B0119F74C439AF414545B2C1299DC546EC0C66589AD70C2DB8EB517E3CE2485C0F13D96E699B0C7C3AE607619637FE5732A31DBDE4565A894478A00DFE78BF559E0E9BB65125B1CB5F1A1A221C9C8BCFA3D294646AA9E21F4EDA1825880FCB7E1A4B7F42522442697A677ED9F3777F8CB8BE61DA12BB182C3148E9FA395E95311C0C374698C462407FE98E188FAB09057099915732CFE16DD35909F912A42E2C5EF0059139DF8AE6D85FAB29B33973E40EA0C592B066859611BDE45C96F2397FC0FB5F07A2E8F2177FC2C8EA2E3F357B5617892B071F6366488D0FA27FDA31D674997BBE9B0234459EEE7E5FB606B405448DF0322782B55D5DD83459B55F6041E62D47E2EA4389A2A29F2C4FC27CCB0AB9907952C9678650C57C0B909EFA205CA27F25C13FCA3E572E484F0F7EC947CD0955C1020FFC6F1612BDA856C8E540E6A41EA9D0A84C7E9DC6255BAF32C3D135A299F00354463C3E1CC0B3EDCC309F8F046BD329A19F9B747828807B958FFBB7D6F05D77B3D354948CFA9215EA79DD62E0EA95BFED33F9BAB1B92623AE9DBD4512B4A4F6B8C08A70CDFFB6A91609309752707C04D183651191B1C3964D6AE450334E0BFF52F7E1B64273955056E944D47041CAEF51385F01F0ECA4973BF2A56FFD8ABD679BA6983161B7EAB18758A5BD62C61693BA3C724395F5FD69D94E242C6F174FB26E7BF0B089BDF92FA03C4C1E663C99F2E22A23ABC3810B0EEB6953B1EAF7F2207616400CF79E530AF203873BCC0DDDA656BCAE9FBED9B20F870877002DCB79FFCD2CA91266FC8F8EABEBDBF71F7032EDEF77C3FDBBA35161A45C22F1248106A4AD3B2FF1132A24891FBD3E79DFD2E0F44F4CD5EFD5D07BAA5ED8E13A406FC9E813460FAAA196E4DFAAAB4A8F686A59ED6753DE8A7DFF287BF24BFD60FD7A84A431F80D84062F4157A4B0712B89A3743C80FC0B5D8BA8D4A6A6D113C029F5579CAF30A9E458BEF1903A989753237CBC69109DC435121FDDD10892547F41EF4DA88F35CACD6F5199E9973682440ED4AAA0F98106CF86B30766B31C55DA18EA8C0FB67B0C937FF4727CD8FE157F6E96E73138F1BF394E7AEA8162CBFDD548F3F4633CBE99CF91A9364D4C93E6ED58167670DAED4358D517D9CD0C9B5F771EB2F9198F91D833CD92ACBE244C6888F9577BC8CB4B514E89C03DF1AF38CD355426A21EDA4EEDB8791B41BB13ACA2A5B6637B9985C1B19AC3D5004B177B8DB3844D3A7D0573CC2F4237A712D2D4F42D3429C13E189913EFD4DC4B382B8E14873C8FB7D3B885F208DAABDF186601DAFE85E02D2B47DA258B5D554C2ACFF9D12C2260AC96D5E150C98A226E212151A49788186899AB4BEC6F707203D48526F75848C9AA0A6ABB2D1E200181D2C5758606873777C85CDD2DBDEE8EDFF09162527435861626AA1A4A7A9BFD5F900000000000000000000000000000000000C1C2F3F -message: DBAEDE95F7793725C9DB980AE6544EB2E2C4FC165C28A12B6EE675764F020C01C048BD0DC8064612E4B6858FB6871F71D104ECC4AA0FB27B9B79D1D95EF34E1072743826CA9E4AC0F1DC608D75695F1D39B5BC2B52758ABC11FE8BFCDAB36DA01B713B1434B9FA141ABA354EF1C50220757425B486682DF64FD3C584DFE147180657C15E6E21A9888219BDAEE8FD883A41177A6F6537F4DBE6809A0334D54582325C80119B6D4B37D45CDFCE93683FEFDD684F180119B88558D4737FCF1815063A06C0D0CC2F653DA98C272883B71BF463AC57A104F02C1944999E3788DB99F3F26D752F8D286049D0FBEFCA4BF5E1E5765FD0E3DDB9B72550A725DD96F2E017CC99937812D037FE476C613541DE88498A2CB72DB2120EA3232629709F551C4134372E58BD6EDF8366FC5F00DB38DF6E281962CB5C68FDA2CC4EBC135D438AE84E908E6DAFF39AA1A7E09785F8375D3E9950041679E86DEDC7398798EE624067A7D31E313A509E16BC25564DBD96F7FA811A6B5128819CB35396FD2BFDE8200EC146192AB727516FAD0FB85613B1C922203B4CC0617E076BDEFEA2A178DA9CFADC2044A89FF9034C23201F11D3C8B3EB98BADCB3E767812D8F71733885B6B6E13BBDE5811CA2DA120D8529FE5EBB21910E25ED49364F8E17EBD49901C0F235049258C97BD24186E5BC3ABE0D1FE6C448739760CC586BE39DBBF9043FAC6DCD5AAD1F5CCEA91994E75125F24DE6CC0495C2017EE37D35263294D1DCA2903A571D3511A1E38E575B0C1469E0B02ADA0EBE331CE290DB49F353C1C7ACFBD25C715D7B8154310B1042D73CC78145752A93B07BE7D1125F8B122A38849CE7AD7B69D0729822333DF209EDE90783CE95039E856002834F09BE1F41C213012B9569AB2F0AB29FFB084BE293B387B823F62E14F0F38DE03E4DE40F5A753C71A00DEC36750855A1771A06FCBD8B8448C67F08806812B72FD7C56EE3FCE1EBE2E2DABAA9196A2FCD9B4D479D553229D7C69B359ED53BD7132A2129130953F5EC0753703C202649F6D218776E6FB023A1188ACE6FDC49FD56BAD40D7936ED945FF0C5403F24377EABB1A3D97ADC8916EB8BF67B7C8DD0A48F8C3E62BF1A12A009FE4A3B3C6D7FDB87F64FA200285C6DE922BEE5C5CD28C0CEA9ECD6740C5966EE76C948195B626830725AE7D048955339A095DEEEF7C9DCDE9EE169B2FF233AD7213959231E74BF2132CC60566AB84806910894A0BD2ADFC562DBB4F64722280FFF3DCDAB54D5F96826DB5AF6BEF32068343A5F22F55FEA30A417C76B620BADA6A44B09228136516CBA30E70ABD4CDAA603A0FB5EC5E1268E47665D5AE9FF70468A3D19283A5276ECA45A847FDE13E3446F1F17CF057E581E071FBA06AC4321880B820C4E01329EED052A67ABA632B73896D0BE7C6DAFB5BC674CA11FAE0F1AF7A69CAE1C43A81733186902192F06ED2C73864D68B0584076353DFD8FA10F0556F8652C04520EF5712EBE2E4B9B4E62E308DB848D58106B1EB82FFA1DD6DF689B1C92C62C237200A38BAD10F5E622C9026329D48C0BEAE51BAE803DB0FCD68FAB0E0C1E00C8F0990D09D44DA36DE0C5B8BFF16D18E1AFCC465EDC575C9381334103B0098D209141F870E51D80813220A6408B4287C12228BC4403846E2A687A0DB1390BA6CBA6F0A16ADCE5E2EA6BF3FCEF7DE0DA0915638916AA437661F278A2652DC20FE96F84C8FB76612FA8B11D6E2FF0EACA6F1B1A4F680B4537471C24CD878EA34D725E6CB37A75F97DB8A4AB052518D798B0A8EC06A7094ECC524251CD06F5FAED9439299B0E988371E0AF0BBE7E97B1B601068BA3950E9F000D50CDADE4018A160A96ED4DB2FE500ADDEF749E1056FE8C6C9CA82E8D0FD9FA7F5EFAE2F196475BA73D4031E5BAECB0A83575D203D8CB9D6F49DB3B6FFFFA0864FEF2847BC36C3DAA3F19987B54784B84BCB8D5982FA6BB7145FA5BB9726813E24647D70C23401FB7FD4E1CA26D7E43E5FBA1E27FADBAC64D1B8004C201C7D29336DA4BAC7A18A850E42FFDA6E7C586B94021E3FC989864E2A40EF0233CFA7DAFCCCFA519FA6D8690D6DFA6948BD88D904BB9E6E9B9949A65F13D8F32F910C40A5410F8D71BCBF7B71716A73271D8355132776E6C56748CEE9ED6226FE340C704D1FBA5F58204AE56673C148B2C6C7D94020BE854D49F0E3FC5CCBA6981CFE3180521469E42FA3B458922F9BE4E23EC93324FD73BBCAB4C43C70E8FEA1D232A92FCCF4D7BEBA195D024C67A66E93F68618FAF32C943DB3622FBD22CF777084F54B638C774D6D3D8C91763C20693A92712456D42DF9D2FEAF0ADB1A6D9B4D500AB899A1AD2213A7008AA21E2FD7D00879FBBF765EBDC7526B8FA2D13BE83FD2717945670B5D73E96445A948AE028165CB3A73D3F2541238CF40C1B6EB26F33FC8F69D22BB899CEBCBB739BFD073EFC6993E221BA2EDEEBF35922FABE93B254C438A12A22E0BCF74D149043BDFECBCBB6EB1A55D928150F601EFC4DF082322B83C8395555135CA1936D690CF3ACFDC19E5164280905E3F3C5F62155184714EB9F61EEEFCCE338BC0217045AB2910F4E9DA330283CF93DB2D0B4EC2D81877266785BBB52AB0F81E0A06A7C5B736C1F58D234094F74DF7EE550C03404E9A192EE63163C079DF3C5ECA1214F20A2BC0683C66F22AF3F1AF532F5FD828EF3F2F9FF1724FC2BDEB2E7F706B2A219A2188D828D57255300CF6E29A7B992BED0D3BC532719B475A08D759CA7A888E0895683027D9A3AD3FDDA5F021E5193844382B1A963945AA49BCE0CF4231133C585807E0CA86D4779564801C05F2E474DF49A9C0AE7000D65B35B0896916CF18D584B24FC41A29AC67103A240025D316BBA272ADF68F06CFB19012F846DF8F5AA45EFC76B89FE08EC9CF0DFC7CDC63A392B83ABDD51DE93728996C99812052E83DA07DD3026A15E4186A19D2A7CA6232C9F54C886423B7ED35F9E8A97B804F401AAE8B3B7DDADF5D6851C4C4DD4FBC15D55520837123C11499A6F6B4C024F457C3D9AF50D7D82E31F433101834930C183DF8427922887CC36D9DFEC570C204E77E8C54119EA5D9210F82100E1C1E846F763397ED5DB39B7C086F3730617D91413CBEDB2AADC91C95B7997D45C8977D8D17E9BF86B97E3E388BBBFCD1264216C3BA773030FF49ACC1E79B2BFDF73C890E68A1EC42A638D2E5F57 -rho: 5B003CBFAF3E5166A85F8A45B9C1A4533FF216FB226CFEB83A81A20EE6E97E54 -t1: [[527, 248, 110, 915, 578, 536, 58, 275, 307, 384, 642, 519, 853, 68, 903, 248, 675, 147, 730, 950, 429, 324, 264, 558, 52, 740, 149, 1008, 798, 260, 976, 602, 802, 407, 83, 432, 27, 584, 105, 147, 231, 156, 978, 121, 892, 48, 705, 119, 36, 42, 847, 1012, 401, 115, 1008, 891, 864, 995, 746, 86, 380, 601, 440, 855, 502, 527, 860, 507, 133, 286, 676, 658, 846, 258, 230, 381, 619, 309, 568, 628, 788, 855, 83, 673, 837, 274, 958, 354, 906, 187, 84, 877, 826, 578, 155, 201, 809, 609, 75, 43, 381, 495, 579, 330, 867, 856, 607, 947, 55, 94, 892, 187, 901, 72, 112, 678, 999, 44, 645, 780, 238, 535, 751, 762, 135, 274, 476, 321, 744, 696, 18, 926, 4, 101, 460, 156, 355, 541, 730, 142, 260, 708, 621, 800, 784, 451, 64, 455, 214, 356, 377, 381, 265, 936, 974, 946, 76, 935, 80, 44, 900, 887, 240, 597, 229, 598, 539, 884, 1020, 419, 802, 26, 118, 608, 233, 626, 153, 914, 968, 75, 909, 598, 639, 684, 419, 728, 495, 625, 743, 179, 3, 331, 78, 1018, 936, 62, 315, 121, 634, 790, 602, 377, 396, 692, 588, 222, 3, 379, 553, 981, 140, 895, 622, 556, 506, 836, 749, 54, 868, 491, 492, 127, 487, 313, 61, 176, 676, 590, 410, 887, 627, 360, 231, 459, 698, 535, 240, 252, 139, 530, 976, 949, 29, 830, 200, 274, 279, 992, 680, 464, 900, 174, 555, 1008, 872, 749], -[162, 758, 880, 2, 918, 485, 1002, 459, 413, 240, 274, 123, 617, 23, 6, 147, 509, 332, 925, 319, 92, 399, 890, 426, 787, 237, 1013, 921, 320, 971, 109, 938, 365, 483, 791, 565, 771, 364, 82, 272, 842, 751, 628, 435, 257, 255, 196, 539, 461, 245, 743, 281, 925, 747, 419, 142, 669, 1017, 327, 787, 985, 612, 769, 746, 105, 131, 212, 649, 755, 569, 792, 916, 717, 494, 839, 638, 288, 564, 563, 810, 749, 915, 138, 603, 911, 396, 449, 234, 554, 542, 818, 622, 647, 790, 390, 980, 931, 297, 495, 426, 685, 273, 861, 805, 415, 42, 968, 654, 34, 639, 566, 237, 855, 26, 531, 935, 911, 285, 289, 644, 806, 799, 32, 406, 565, 472, 351, 765, 825, 246, 153, 8, 821, 353, 384, 914, 517, 1007, 160, 354, 1008, 76, 447, 758, 753, 201, 502, 738, 93, 24, 195, 767, 582, 537, 147, 269, 231, 1021, 669, 937, 374, 158, 392, 135, 71, 374, 671, 340, 1003, 236, 653, 870, 6, 921, 442, 602, 528, 691, 248, 410, 837, 786, 274, 557, 228, 202, 933, 590, 196, 525, 412, 899, 626, 732, 966, 570, 684, 184, 394, 984, 730, 585, 819, 469, 577, 191, 27, 440, 52, 222, 78, 209, 66, 654, 161, 965, 128, 257, 284, 610, 210, 106, 327, 881, 365, 354, 951, 906, 524, 712, 461, 111, 661, 503, 699, 467, 742, 647, 1013, 615, 920, 460, 107, 137, 287, 744, 67, 267, 761, 828, 517, 213, 902, 646, 487, 469], -[97, 407, 842, 605, 22, 954, 860, 435, 687, 58, 207, 829, 619, 992, 996, 166, 348, 149, 380, 603, 938, 617, 713, 292, 196, 868, 867, 168, 693, 642, 975, 298, 746, 317, 22, 25, 1005, 267, 455, 698, 908, 869, 208, 293, 695, 550, 697, 986, 460, 206, 355, 249, 73, 487, 848, 174, 384, 254, 486, 619, 92, 853, 31, 947, 72, 486, 795, 217, 48, 436, 844, 815, 456, 147, 92, 957, 719, 992, 561, 523, 736, 382, 424, 845, 814, 14, 311, 543, 114, 781, 193, 192, 512, 628, 501, 465, 670, 329, 684, 423, 810, 258, 557, 324, 421, 362, 604, 237, 665, 407, 907, 234, 47, 238, 454, 57, 704, 1016, 377, 386, 164, 346, 276, 834, 974, 893, 97, 981, 41, 712, 84, 387, 391, 891, 730, 220, 147, 36, 900, 211, 865, 706, 313, 731, 22, 946, 55, 721, 926, 546, 291, 111, 926, 226, 697, 309, 205, 484, 973, 72, 755, 445, 687, 69, 23, 78, 683, 185, 942, 891, 872, 435, 865, 889, 664, 680, 418, 500, 211, 642, 515, 871, 364, 825, 370, 332, 714, 927, 748, 650, 76, 423, 932, 906, 809, 232, 196, 520, 685, 65, 781, 499, 187, 94, 22, 424, 467, 669, 548, 955, 448, 627, 334, 324, 561, 763, 113, 1021, 127, 592, 673, 450, 619, 849, 414, 772, 478, 724, 342, 416, 630, 884, 852, 815, 556, 812, 175, 173, 559, 346, 641, 228, 182, 606, 905, 184, 160, 160, 2, 617, 251, 628, 986, 1000, 598, 21], -[70, 437, 1, 712, 755, 398, 792, 710, 14, 928, 914, 735, 452, 631, 849, 605, 778, 740, 192, 716, 899, 120, 633, 161, 718, 775, 658, 565, 689, 38, 634, 828, 182, 520, 141, 258, 453, 71, 879, 349, 446, 191, 3, 325, 269, 37, 874, 786, 384, 127, 540, 210, 110, 64, 348, 830, 1018, 474, 42, 154, 293, 318, 970, 641, 553, 560, 393, 961, 122, 560, 762, 297, 797, 129, 569, 381, 386, 880, 469, 1005, 25, 307, 348, 648, 441, 661, 358, 495, 536, 513, 766, 418, 792, 73, 75, 407, 216, 729, 134, 105, 768, 749, 650, 797, 202, 191, 870, 344, 466, 639, 61, 121, 430, 64, 919, 418, 133, 69, 352, 942, 639, 455, 701, 925, 42, 108, 208, 927, 971, 182, 210, 660, 1006, 563, 318, 263, 1002, 114, 654, 480, 1, 519, 367, 517, 942, 739, 772, 679, 232, 49, 112, 1022, 337, 154, 114, 788, 894, 194, 29, 979, 94, 164, 703, 372, 19, 548, 192, 823, 1009, 321, 761, 35, 344, 817, 1021, 444, 985, 573, 392, 893, 458, 87, 280, 41, 662, 736, 94, 833, 224, 933, 733, 19, 84, 708, 177, 160, 746, 1012, 891, 830, 18, 588, 233, 13, 188, 934, 396, 446, 844, 185, 87, 476, 218, 295, 104, 744, 1007, 1010, 675, 556, 158, 875, 418, 368, 601, 482, 736, 329, 956, 619, 274, 829, 797, 592, 851, 509, 92, 155, 709, 236, 452, 814, 787, 913, 891, 664, 761, 737, 511, 107, 379, 772, 145, 621, 267, 871]] -cTilde: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 -z: [[-42047, -66894, 87908, 89595, 111780, 18060, -29472, 106675, -73405, 83736, -61194, -65178, -122794, 28095, -24402, 110453, -15, -102450, -203, -19281, -49095, -33680, -74126, 95449, -87968, -61315, -118543, -82701, 34428, 11441, -110480, -118455, 14714, -45236, 66412, 78762, 66285, 10681, -52485, 53728, -52769, -54004, 45997, -32316, 33149, -119738, -81161, 77372, -21283, -51701, -123967, 57369, -33580, -116554, -88796, -44404, 101159, -67115, -94965, -80543, -25581, -4804, 39318, -22466, 58924, -928, -25075, 26450, -77249, -7498, 25346, -77505, 71306, -87348, 26858, 108801, 62131, 75391, -9824, -44105, -37352, 124925, -96476, -113891, -124942, -56942, 105644, 1133, -130683, 29391, 27558, -23588, 93408, 129553, 59378, 45567, 5651, 16046, -104697, -45556, -58027, 107758, -67908, 36669, 38897, -32270, -108957, 23108, -112968, 61829, 83304, 70544, 26322, -86308, 20039, 35152, 46379, 127736, 59258, 82535, 121489, -64378, -23753, -26437, -28839, -33660, 118142, -71023, 130971, 119047, -92207, -127060, -29904, 37356, -99722, 32685, 31103, -45703, -38630, 52341, -101736, -52657, 4441, 106496, -102173, -78787, 45682, 32341, 128900, 70797, 28084, 12562, 80215, 3111, -116752, 55819, -47980, 73072, -43535, 68883, 125878, -72195, -28545, 96546, 105366, 77077, 6899, -70953, -101568, -121601, -95049, -18303, 17833, 94140, -96390, -118464, 126786, 52007, 67313, -98242, -33725, 124144, -6857, -15542, 13895, -58750, 27243, 18499, 15442, -102404, -119068, 56751, -5064, 120196, 74412, -123821, 73148, 83165, -57798, -42195, 117005, 46480, 75996, -47119, 22946, -28138, -63937, -31541, -114208, -116817, -97284, 111741, -93530, -25378, -38851, -24402, 124057, 129231, 79670, 71593, 44050, 90117, -101733, -67465, 115321, -31516, -91818, 71022, -6095, 102687, 34816, -11237, 61117, 30947, 29634, -70339, -72288, 15731, -67884, -76294, -22759, 19962, 127229, 65801, -119313, -74665, -26091, -13884, -79129, -20183, -88404, 75298, 48448, -28156, -20715, -25954], -[123647, -70330, -93442, 60681, -86285, -51894, 49194, -44950, 57114, -17199, -58463, -71488, 4364, 53766, -64258, -25477, 59878, 47821, 109235, -86650, 19807, 83711, -26549, 43999, -30343, -128998, 91090, 4286, -51721, -29551, -21963, -7319, 16713, 35419, 81811, -43030, 63040, -46899, 62633, 55499, 37178, 26947, 110936, 36392, 71866, -78035, -27406, 6848, -26233, 33687, -101810, 69583, -31824, -101067, 45388, 93652, -95030, 92162, 42899, -80077, 91686, 89970, -529, -5226, -61317, -98845, 23514, -42498, -58266, -84614, 125866, 78167, 66925, 88004, -84793, -12597, 56716, -127054, -14248, 92182, 4465, -89280, -29766, -60949, -156, -109985, 21749, 69755, 106754, -37271, 116622, -71027, 126349, -48070, 119662, 48432, 108198, 43571, -99647, -93139, -13077, 54164, 115276, 75174, 81053, -75387, 117007, -91446, 42041, -96520, 0, 18031, 117710, 53158, -1277, -55749, 107501, -83881, -130330, 75471, 56833, 116815, -86394, 47123, 92267, -97909, -81325, -88114, -45885, -74719, -101, -77748, 119601, -71265, -6357, 115833, -120994, 87499, 46214, -123247, 129204, -101985, -127170, 49379, 100152, 15265, -22568, 128541, -16862, -18314, 119543, 6392, 88518, 35195, 14710, 63115, -129619, 81225, 61226, -92480, 10072, -103413, -93700, 100317, 113831, 58989, -80534, 4008, -75361, 99893, -116458, 105488, 91457, -19249, -3156, -19431, -11663, 116678, -8018, -64535, 98780, 62319, -123503, -106924, 71252, 18890, -6578, 80520, 119432, -3826, 53168, -89645, -853, -112368, -39174, 63905, 57135, -1381, -70809, 55848, 1379, 83793, -64022, -108705, -119071, 60896, -120709, -16698, -121453, 6141, 103821, -51308, 36724, -93836, 12764, -51088, 51465, 100564, 85269, 43297, 9311, -17716, -19094, 106544, -81464, 97662, -103038, -8992, -96132, 67394, 122012, 114345, 85184, 126660, -33531, -87888, 78909, 11118, 24104, -4503, -14384, 71008, 98835, 61605, 65426, 82782, -93774, -55179, 40193, 36509, -56486, 10722, 74815, -127881, -130807, 46284], -[57016, 59853, 117938, 25787, 49505, 116013, -108741, -48313, 71670, 29923, -97360, 116408, 79617, -129957, -42369, 78665, 25762, -8610, -119751, 75461, -55687, -59417, 20957, -41525, -87800, 67817, -103402, -107479, 45244, 9854, 56417, 55083, 42088, 53096, 68310, 40484, 57486, 1606, -93862, 58724, -39417, 116627, 100743, 38571, -72758, 72278, 99744, -49750, -118373, 83477, -124406, -78624, 108327, -10151, -57348, -61610, -90532, -86748, -24398, -100873, -3970, 120956, 40188, -108171, 82329, 88371, 20262, -96023, 69884, 48736, -78307, -44650, -24084, 26685, 93041, 129935, -46954, 46670, 18546, -4806, 128806, -32137, 25863, -88569, -86690, 38223, 82066, 105468, -85239, 55664, 48817, 85651, 91886, -103735, 103418, -9623, -28845, -112368, 33960, -80780, 96988, -97392, -26979, -49767, -50119, 26581, -12695, -103933, 54669, -112332, -21597, -21153, 95673, 2112, -88254, -98663, 17431, -50329, -86469, -34758, 56926, -78386, -122795, 59228, -43590, 63385, -7903, 40438, -130176, 51091, -84858, 96105, -75332, 5723, 297, 8994, -117752, -96674, -47633, -2756, -5315, 71709, -39258, 113329, 80960, -72285, -17512, -129052, 73320, 115038, 34549, -25637, 101611, 16501, -89553, -32320, -10897, 34672, 127236, 111260, -63645, 42133, -77736, 78226, 115049, -80528, -46480, 24552, -90457, 34938, -64660, -23693, 61444, -48173, 68889, 9082, -11516, 71517, 32962, 31019, 93576, 25492, -17263, -82465, 55302, -92415, 92559, -61021, -110825, -20744, -32485, -126871, 103584, -5392, 115212, 8056, 43733, 67723, 19368, -121174, -7684, -111896, -17127, -26850, -10538, -78140, 81281, -44739, 63591, 29915, -22409, 41935, 17984, 83006, 90022, -116895, 126116, 38657, -18222, -115219, 70409, 123099, 13987, 98239, 14593, -55420, 107102, -14770, -3668, -36954, 87586, -73232, -56553, -38232, -53051, 111372, -76122, 49113, -13379, -100109, -3020, 67825, -98460, 58429, -12989, -18022, 99457, -8713, 83705, -65494, -63451, -89109, 49797, -4685, -40180, 34682], -[-40359, -101301, 17776, -86009, -105279, 96534, -108073, -94116, -86484, -119434, 80204, -39970, -122636, 107842, 51703, 11226, 129241, -4976, 60575, 103323, 116452, -112025, 117670, -98512, -128447, -57227, -30273, 43804, 102907, 11419, 16316, -120504, 97005, -100348, 90976, -64973, -87594, -63039, -105834, 22807, -71299, -57222, -86410, 37335, 54058, -55896, 99789, 72557, -24415, 55435, 119255, -116505, -64372, -129481, 98117, -97900, -129682, 102144, -15980, -32549, -8750, -69288, 64629, -113344, -103862, -116622, -10234, 31716, -65636, 41357, -62222, 73598, 82829, -46960, -46685, -108329, -126459, -2086, 100593, 128574, -112604, 82137, 58195, 17254, -63688, -94138, -72699, 127011, -122414, -122685, -110003, 108330, -17690, 95248, 64383, 54872, -111315, 97153, 95709, -126533, 6189, -114535, 114446, -79825, 674, -33239, -55899, 111045, 129372, 104513, -840, -44009, 37351, -48787, -35658, -7130, -40613, -89461, -32387, -117630, 82041, 20535, 36611, 54621, 123069, 117216, -83492, 6057, -1867, -44548, 117895, 114911, 84544, -93878, -42152, 113227, -66108, -21863, -81063, -30763, -101189, 80261, 91504, 79402, -52023, -25713, 115264, 96955, 74243, 40380, -83058, -118907, -100570, -71484, -89450, -30823, 101479, 128742, 86316, 115031, 126824, -65051, -90886, 80467, 41531, -9128, -113674, -49567, -79817, 11777, 66350, 41082, -59894, 74533, 18191, -21452, 86297, -66986, 9230, -15699, -83519, -29388, -104910, -19563, 11164, -102322, 123562, 25186, 86515, -85365, -120088, -82545, -112073, -56445, 60674, -124514, 97507, -46671, -11442, -71955, 28792, -73189, -84171, 109866, -105704, -47040, 78031, 43186, 38334, 50360, 16662, -17951, 58444, -36524, 19796, 74343, 91975, -18135, -121537, 126656, 100431, -14062, 52157, -82591, -15447, 66256, -71586, 84811, -82511, -69812, -4409, -17959, 706, 69357, -100395, 56442, -116851, -57214, 1917, -13441, 16982, 122436, -61910, 33886, 77310, 90259, -87434, 44202, -109762, 88193, -27681, -74792, 41363, -773, -27177, 111736]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]] - -Proper number of hints provided. Provided: 63, expected: <=80 -||z||: 130971, ||z|| check passed -aHat: [[[2758750, 2429991, 2498833, 2173545, 8204600, 6778139, 1183134, 8086046, 462450, 3640781, 4260818, 97547, 7105425, 8135912, 7715776, 7341256, 5370857, 7268194, 2756124, 959600, 5974150, 3568867, 6051263, 4299302, 4130534, 1876032, 4389527, 3964037, 3540313, 5266374, 1853949, 2528120, 8275644, 3255053, 3416987, 63182, 8242380, 6226280, 89317, 5813171, 1543341, 347654, 7769082, 6800155, 3153960, 7336645, 7705276, 5336226, 546872, 8319903, 5271538, 837050, 973642, 1526705, 1106150, 5947350, 2372740, 3158098, 6041551, 3933020, 7312752, 7762674, 2427028, 6894184, 1581524, 5384269, 869952, 3887229, 2822574, 6564770, 4615359, 7851055, 711363, 6924745, 5378534, 7445664, 7649576, 3168669, 4191865, 1351115, 6762427, 7273784, 3666634, 5889459, 3488454, 4984480, 852534, 825044, 5268648, 5520260, 4706334, 1857555, 5807488, 4539623, 1868680, 7232201, 4041581, 6627808, 4509124, 3379237, 1066111, 2890841, 3275172, 2107872, 1802154, 4040522, 5662130, 402083, 7613422, 6162320, 444345, 5703066, 1089449, 7177863, 2152982, 2233733, 2444113, 5316132, 7358533, 2261562, 5676146, 679739, 4680871, 3680133, 6369442, 4329311, 7011394, 565722, 4271213, 6313901, 2564483, 6986300, 3134732, 7419790, 164438, 3844362, 7643986, 6940572, 8204297, 6154809, 2857827, 6612356, 7464984, 4835730, 5431671, 679204, 5644865, 5385559, 2279013, 3685635, 3503344, 315916, 5165382, 6999525, 6189281, 282578, 2510517, 2001560, 3588305, 6550861, 4041972, 5113727, 1536858, 6860596, 4159157, 4672751, 1540754, 3396681, 3260980, 2450833, 6728190, 824659, 7647312, 4509259, 7082814, 1923083, 964895, 4060075, 2590164, 6091039, 3687894, 5428017, 7220216, 6779158, 3101354, 3563794, 2677963, 6666150, 4809025, 3793669, 8118535, 2977776, 1660765, 6720029, 4517788, 538301, 7809312, 3029818, 1610581, 6003940, 8358747, 5122920, 6543204, 1623576, 3317583, 4512775, 40709, 6505326, 2865904, 7639949, 1749987, 6440360, 6655564, 4080760, 3425693, 7074229, 3259442, 3763743, 3046897, 2472077, 3801041, 6475709, 8111422, 652527, 333607, 869877, 6375008, 1062655, 7215029, 2854326, 5912774, 5457105, 3707255, 468265, 2131747, 3180871, 66852, 5764466, 3242789, 5947411, 1638616, 1883445, 2288666, 4663843, 8055913, 8105094, 528651, 3343559, 1905217, 4737428, 6596551, 1139271, 2946150, 147553, 5610898, 1784555], -[8332077, 8005590, 7055174, 5233073, 1846710, 2730459, 2948961, 2191187, 6818952, 2605391, 5681870, 2710406, 112916, 7898262, 2127584, 3443826, 658735, 8338831, 6225691, 3432324, 6909487, 2389878, 4906309, 4730256, 326811, 2037, 3800160, 609896, 2054032, 4042055, 2072321, 5713236, 4676811, 5542123, 7134144, 7140512, 6830606, 5049575, 5345057, 1086386, 4261015, 4390863, 6473579, 7446918, 687, 2548680, 2319369, 7084307, 6801752, 8076616, 2273541, 4634526, 7533806, 5248332, 3367485, 1135125, 6029570, 5120233, 4389674, 2354502, 6868803, 6701340, 4598223, 1411766, 3346003, 1318110, 7885753, 5611140, 7656895, 6368661, 4717844, 1275436, 5080805, 890855, 7097023, 661138, 6535000, 1494965, 6317661, 8118114, 368838, 4066514, 4820982, 5630347, 672317, 5494455, 6077469, 5277211, 897068, 8162125, 1188555, 791002, 4958364, 8252514, 2864381, 1350769, 5252978, 7334808, 5492015, 6632221, 3677163, 411310, 4364765, 1286649, 523205, 4478071, 4015272, 6056756, 8036612, 7015760, 1002553, 7193884, 1900693, 7853979, 3752907, 290835, 5833625, 440005, 8167066, 5665372, 1062034, 3650030, 750530, 5916203, 5425182, 1281390, 5396800, 4168286, 8375064, 42721, 3094559, 3043262, 20538, 1069875, 1177019, 7240011, 878701, 4695667, 1883130, 2803466, 3440568, 7182227, 7094877, 3680486, 7051228, 7192705, 6730974, 7104634, 1045795, 3996380, 8371770, 1635636, 4187913, 6168385, 5463873, 4256193, 2931856, 1925385, 7394441, 6189344, 4342698, 7291831, 1319257, 2349436, 6342367, 1923033, 6130085, 4639060, 6142811, 419990, 4059244, 1836562, 378089, 8282291, 4638485, 2781013, 12208, 2663288, 5549141, 6203998, 5947755, 2930425, 7761695, 2724214, 4126426, 7167660, 2686212, 31185, 6725467, 886287, 7036365, 6213778, 787444, 1401123, 4831343, 5264093, 1039183, 8123192, 8307321, 756596, 1356594, 5696147, 3229549, 2175396, 6854699, 466898, 505789, 5957993, 2955236, 7582595, 3361414, 7559551, 7218182, 1404584, 3523732, 6580258, 3029271, 7709898, 6373438, 1355861, 1599223, 7236143, 3544812, 2582265, 1881526, 60726, 5794292, 409411, 5369438, 5312126, 7520406, 4647016, 6126785, 2147215, 4040677, 954231, 3739005, 7270131, 384056, 7798804, 2918160, 1781242, 5457055, 4845593, 949754, 4804382, 4562121, 2698998, 5588074, 886252, 6380129, 848076, 5521194, 6943321, 802976, 5961475], -[7009549, 7600667, 4775169, 2160667, 3600757, 7091565, 7827571, 8288451, 1920413, 3246206, 4121206, 3881033, 1984606, 2323597, 6349627, 7370082, 4190371, 6857049, 4568562, 2367569, 3671337, 2950649, 1688891, 997916, 4581184, 4803258, 7093129, 1126477, 2729149, 1016683, 3503520, 6990058, 7724231, 4260180, 3499348, 792234, 4969643, 3850360, 261634, 3949323, 1762606, 4826118, 6372038, 7864740, 6859283, 1430905, 609035, 8160861, 7358624, 7487966, 3775504, 4914742, 2275759, 6036655, 233524, 8350452, 2161423, 2355706, 1315913, 1262384, 1172703, 1306247, 2964228, 4374431, 4517848, 4092371, 1820431, 5529460, 7247202, 7125767, 7230671, 7566177, 7798600, 2918849, 7024169, 6349208, 4782516, 1765277, 4945000, 8039248, 1299614, 4168236, 659000, 7634682, 3720599, 8194784, 3273552, 3385223, 5592061, 1793390, 4872903, 1894765, 2870309, 909276, 6755623, 6983389, 7975677, 4755702, 8336466, 2082688, 2503387, 6510481, 3664103, 1582149, 3604982, 5486628, 1694787, 452403, 689652, 7677975, 7074279, 3938307, 5125337, 2981649, 4405421, 4398290, 7703334, 5743258, 2896800, 3826212, 7713959, 3441829, 6881580, 5918855, 4999480, 4121658, 144778, 5124020, 6186641, 5738743, 4694797, 139828, 7969588, 6215363, 5652957, 7577360, 7306322, 34015, 8283967, 3798531, 6769433, 4238797, 689761, 5095212, 1211199, 2911343, 1723078, 8055894, 5121585, 1438800, 5361795, 8368278, 7675668, 1228040, 2751571, 6743692, 4899262, 1109411, 7555235, 876686, 2443643, 3689070, 6015109, 3969099, 2915356, 7151545, 3803865, 6935305, 6347223, 6537975, 6420359, 3977102, 2900049, 923812, 4846417, 1015491, 1554035, 5990007, 1118216, 1414567, 3667421, 7299591, 7664736, 1107338, 2144318, 5354332, 4162504, 3576484, 2573057, 6689353, 4015372, 4295948, 1909768, 1319740, 5030932, 6482166, 850501, 2885832, 6617129, 286229, 4668399, 5648799, 3672531, 5077161, 4981956, 2833012, 4769940, 7479357, 7513876, 3384858, 8015176, 586928, 6665471, 538191, 993026, 7344896, 8154181, 2176665, 4812838, 5742362, 6734117, 5989267, 1080308, 2281606, 5393073, 4319268, 6485634, 4202452, 3114603, 207434, 5239888, 7955427, 6428842, 7360147, 2503470, 2634955, 5707356, 5193260, 216854, 6894525, 2951499, 135147, 6700697, 3796934, 1606755, 1852241, 1709682, 1573705, 1713490, 1199502, 4306506, 6294358, 32998, 4168158, 1636532, 3982067], -[872863, 5061949, 3640109, 7504018, 2680244, 1574485, 3742144, 7401748, 3343495, 4529782, 1796863, 2509379, 5903433, 5714205, 6234191, 3890754, 2361813, 1152933, 73849, 1713342, 6696293, 3214551, 6063809, 1697771, 6220265, 890354, 965783, 7575700, 2947386, 269689, 739388, 7936098, 2013826, 5041395, 3916487, 1902445, 3416189, 7651885, 4126956, 5601464, 1468529, 4771678, 2380590, 1390619, 4653944, 1542749, 7115094, 1369464, 8085456, 2499902, 7122737, 7599748, 369166, 3676088, 4821464, 2401156, 271731, 1249207, 7940403, 3185603, 2941088, 290314, 2985905, 2599763, 8043076, 6949003, 7633037, 6167248, 6746752, 7180288, 8374494, 7222743, 3530565, 1796133, 2338417, 1679546, 250890, 7597893, 1369267, 5066173, 4418739, 1949683, 3654752, 3090983, 3978965, 4440039, 7818969, 2095689, 7742570, 1224457, 2089499, 2260732, 575838, 2298536, 1740390, 4646055, 1157008, 4930689, 320675, 1292701, 4066284, 4573270, 5057337, 8362003, 3454852, 5015848, 6362085, 3774429, 231890, 8263217, 7226138, 2506411, 2561077, 5207634, 678039, 3520283, 1864425, 7692111, 5829764, 2900934, 8020970, 6066588, 6536243, 6579473, 7535723, 3386663, 5871549, 1804065, 2397156, 1080768, 250561, 7460367, 1170418, 2206341, 7289109, 2757604, 8146574, 3825685, 8331811, 7906025, 3419700, 1380321, 7042839, 8103320, 4567908, 3227217, 213727, 1969814, 5043017, 1501879, 5636399, 5107521, 1026298, 1745207, 5650203, 4652808, 7640825, 4393965, 4778356, 7436455, 4976669, 4274418, 1078205, 6874667, 4505549, 1595632, 7483165, 4617680, 1367137, 1255524, 523805, 5737973, 756342, 3279600, 4000426, 4206352, 5107196, 3905694, 6289603, 1767684, 3676764, 4625147, 579788, 2209405, 1959139, 420562, 8269, 2242745, 805053, 6210068, 6597249, 6914581, 3976169, 907035, 8356333, 714991, 3823742, 5237929, 7969622, 7413108, 5758646, 3331206, 987990, 7908010, 2687761, 5563244, 5749205, 6652430, 4372896, 4439423, 5949673, 7762542, 2211194, 3875670, 3920909, 6000157, 7441231, 2325059, 8296594, 88663, 1830314, 6229058, 5324269, 8128486, 4262656, 5748900, 5829902, 2962594, 1509122, 7786461, 5731344, 7696008, 5960576, 2129840, 6184882, 537219, 2970449, 2425483, 3288608, 7846097, 7930627, 1300378, 6820733, 63401, 4758084, 747479, 1267856, 1786685, 6410647, 2843905, 4067597, 1062798, 7801065, 8332985, 2666354, 7596892]], -[[2718495, 8283619, 1425067, 6373195, 4688230, 1587563, 766062, 2029025, 2510679, 6479173, 2954143, 1256883, 2265905, 910481, 2381083, 7433215, 5978644, 486739, 7878474, 3959824, 6025164, 4184772, 1806234, 5639051, 7693356, 1340108, 5786178, 2279144, 3762395, 8115724, 1831568, 8185014, 1304707, 2768112, 757696, 2908249, 4979068, 2055928, 547339, 5581530, 1570005, 833495, 490452, 7707757, 6865582, 6644324, 2614931, 3380446, 2499151, 4038391, 5719646, 6746837, 3801945, 6255089, 3862584, 2873178, 3402917, 1671754, 2657017, 3183394, 1739831, 6994460, 46695, 1921195, 2214453, 4170376, 8103830, 5773941, 787175, 7223893, 7004740, 2682536, 7162044, 2673371, 3462308, 6811309, 2444641, 4837065, 5054337, 78353, 4008723, 1812722, 606689, 7871870, 1173348, 6177905, 3884180, 2574922, 3052405, 5866982, 3263924, 8322781, 7957830, 4039258, 4193429, 2454474, 8368082, 1717287, 3247049, 3392622, 2418342, 3607532, 4385582, 83211, 877243, 1206512, 6149962, 7309673, 3266660, 827295, 1902156, 2557530, 329751, 894355, 1704075, 5705583, 3178884, 1108279, 7720093, 252464, 2392301, 5041984, 4467069, 1730076, 1961828, 5086096, 6105986, 2144100, 494050, 1488412, 2707162, 2365633, 930254, 3935004, 6875462, 4253631, 3681925, 329002, 5948655, 5929739, 5445151, 3372180, 7586344, 1748520, 4580591, 3487539, 5214317, 854821, 5544, 7164239, 2250604, 213862, 8224587, 1207190, 388985, 258322, 5868226, 8302702, 3793475, 6022656, 3237076, 7510704, 2171441, 6613427, 4442840, 2358248, 2071564, 916375, 612612, 7145446, 4196923, 7186937, 3992297, 7896893, 7679195, 3833065, 938641, 5450858, 7778457, 5902297, 1959850, 7565422, 736268, 3940485, 5089228, 7210452, 5906958, 1061876, 1787249, 482197, 3422745, 5694968, 5964158, 7095570, 1921339, 4045668, 2503178, 490534, 4725395, 1347477, 8200051, 4266327, 7440904, 3988187, 3299258, 2353063, 1454990, 1474045, 7466713, 884710, 1558693, 108728, 4639728, 4293601, 7741326, 5873341, 5706309, 7412822, 3597921, 7121272, 493697, 5917200, 7024239, 4652791, 3555372, 7371496, 4992704, 5757682, 6946045, 2258796, 3214981, 7502921, 1813164, 6178750, 2288751, 3791730, 5414105, 7978348, 7921460, 1517317, 4528209, 4256836, 5366304, 6133327, 7184993, 3382106, 4213930, 6061103, 1355144, 2767485, 4043649, 4030942, 6150926, 4155854, 1083034, 3024703], -[6654982, 539205, 6901414, 4306406, 4323334, 3921318, 7110591, 5152702, 3609791, 3010945, 4371365, 2139674, 5260311, 1197618, 6908818, 4549945, 7765268, 6757965, 6592512, 7874641, 3563365, 8312473, 4016648, 4861898, 7381749, 5735335, 2484010, 6311382, 4053141, 1896647, 3894312, 3766752, 1949982, 2020464, 1795443, 92857, 305618, 6331650, 2818262, 3260344, 1398512, 7809670, 4251594, 2236967, 6334238, 1540198, 3637566, 5531525, 5196269, 2320271, 4170663, 1907662, 2844257, 8306707, 1422412, 6391288, 5457153, 3946427, 6249111, 7214125, 4747359, 604283, 1835975, 7147849, 3983093, 6073723, 723934, 7773302, 1731225, 652719, 4246550, 3551658, 3376431, 6095023, 6843957, 6106842, 4399843, 8378566, 2193484, 1053979, 1498116, 4321558, 4380495, 2103368, 5086802, 6687468, 3216952, 5122881, 3824484, 6882557, 6836883, 1956787, 1685902, 7849858, 2502209, 5462683, 4097280, 491504, 2806368, 920795, 47717, 5905963, 2930183, 6438020, 1194362, 2031576, 2133726, 779815, 5124076, 2387360, 5054418, 4877365, 7712456, 425830, 6533701, 3362174, 4758355, 2951183, 3615750, 7549961, 717891, 4730267, 1919873, 4745214, 2595334, 7064525, 6167385, 2013834, 1599040, 592100, 7887009, 7119364, 1223384, 1195974, 1502239, 796684, 2433962, 3793870, 1244591, 3526526, 6902238, 8028112, 7310430, 2821925, 5324348, 5889802, 2203792, 26213, 4216334, 1497964, 3627844, 770315, 4526582, 5829384, 3456788, 150102, 573607, 6495271, 803933, 1614554, 7016002, 4171166, 5073545, 7514170, 8115585, 8135467, 5936948, 74211, 2386698, 7553412, 7841748, 5457611, 2982658, 1640158, 3826896, 5750430, 8067886, 2733821, 1623614, 6425489, 4134574, 7293905, 5232540, 2338984, 1593276, 7862875, 1303498, 3254058, 157705, 3456210, 2524485, 1427859, 931988, 6398331, 7803551, 3135309, 7747422, 1576299, 4022062, 8005053, 4750684, 3815199, 6326549, 5908997, 7754029, 5022233, 162665, 3270598, 7516607, 5985944, 6965144, 7481194, 4745697, 7308152, 1958084, 4084268, 1295658, 139611, 126325, 5535060, 5590818, 6334339, 5520800, 2938221, 7656010, 7775216, 7697938, 3606671, 8194295, 3410617, 6860231, 7501326, 2616072, 1798433, 4168686, 6140427, 3086882, 6739997, 1803202, 868877, 4341394, 1188918, 2872873, 1625621, 5097603, 731894, 5982912, 6565414, 2583586, 493007, 3837323, 7397870, 5375472, 4099217, 4700104, 3802870], -[1486140, 8149136, 3503405, 4506612, 3862405, 4828041, 3654089, 486418, 3552090, 4332863, 6321532, 5126500, 7984196, 3193681, 7249164, 2182493, 8140482, 5327361, 125662, 6332292, 5142976, 316959, 2505584, 2182319, 7688548, 8195824, 2173806, 1111327, 5327936, 4242533, 7586660, 3489452, 1774243, 7862472, 1287643, 7764336, 5468369, 6785951, 1149385, 579886, 6727150, 7882027, 2848261, 3490760, 5210597, 7341045, 5030595, 1348456, 1642473, 6275795, 4819552, 4477833, 6010112, 3488714, 2799195, 3302697, 3569888, 1013682, 938087, 3092100, 5748548, 820308, 5002497, 7937141, 5597558, 943901, 3113018, 3197801, 7454318, 1067792, 4430927, 4719421, 2234870, 3833377, 4013506, 3437639, 1019552, 4365707, 1882491, 6028337, 7052842, 4436572, 2853066, 8075538, 1143158, 698825, 5673115, 6470867, 8293733, 6442882, 1144946, 4593443, 5263370, 5137426, 673691, 2150569, 3963177, 3305814, 1784887, 1254857, 6249154, 2928189, 6343534, 5627999, 2231202, 3230991, 2930745, 2704483, 4643592, 4543152, 7437608, 2978153, 5988198, 2889300, 1003796, 6633300, 8349655, 2897223, 3052365, 7116061, 2864847, 1279330, 3301933, 1744839, 4227622, 7216516, 1158810, 1484625, 105676, 6640355, 5112487, 2257069, 2958342, 609261, 2791503, 7703000, 6751742, 2238713, 4307051, 3109553, 4308909, 2870178, 2514200, 6340007, 2184998, 5306384, 1770202, 7239710, 1359319, 4351366, 2087646, 5009894, 2104964, 7152075, 3835520, 4125107, 7393443, 5064970, 4767380, 7955897, 3695642, 747189, 4831258, 2483219, 3014038, 2148196, 352634, 3617528, 4056563, 7872963, 6286847, 4727711, 603826, 2973886, 1432856, 7679968, 3991877, 6191910, 6210952, 1994620, 3662080, 557896, 4252282, 4646788, 4394854, 6168614, 4039207, 3875850, 8329670, 1644724, 6869178, 1153666, 5209575, 128130, 1846551, 1154763, 3256140, 7700699, 6599515, 3718797, 5528452, 7095760, 5680912, 4360389, 7454723, 5767061, 8312998, 2472645, 8003296, 6465243, 4409776, 68763, 699266, 4421054, 4011911, 1320409, 1542216, 8077566, 6482377, 1788415, 5952358, 2661309, 3716929, 3994122, 6931633, 1445719, 873561, 7293600, 1451425, 5277451, 1466740, 4294208, 5329495, 7578754, 520047, 2654889, 6248303, 8158014, 2971676, 7675799, 5119166, 990639, 5158003, 6850996, 1676706, 160974, 903236, 4015339, 6800849, 1440331, 6121157, 1230497, 2484963, 5821247, 6685986, 8066427], -[1115279, 4220009, 8014196, 7256285, 6397743, 1824649, 2765309, 6428064, 6452502, 7926922, 5878030, 3571021, 5157849, 5077780, 4627997, 5592870, 3854561, 454813, 7267527, 6132526, 701335, 4827958, 2485285, 2193855, 602176, 7781465, 117904, 4001660, 856409, 4192087, 6944747, 3695752, 3085879, 5883957, 6732592, 113772, 1235657, 4083377, 5315873, 5308291, 3039730, 903599, 5577640, 5487912, 2316590, 8161042, 7354739, 2285649, 5395756, 5805866, 8351169, 4966337, 1730209, 3362031, 629727, 4768603, 1577817, 4654378, 4142301, 5054253, 1355936, 4001219, 3949048, 4753482, 244090, 1076204, 7134919, 7054525, 522635, 6885318, 3555936, 5923167, 4950716, 3726545, 4722630, 2180072, 2234259, 1536266, 1297199, 8356212, 3185555, 2957570, 1244246, 7380522, 7045433, 2652480, 7355997, 7027968, 5121277, 4999341, 2163660, 7119927, 7323164, 1265660, 243032, 804345, 1743226, 1777876, 5552182, 380764, 6514087, 2408134, 6098052, 1673296, 8018816, 594214, 2335351, 6042104, 6527242, 3497219, 7969035, 4329000, 4826071, 3438745, 2740441, 6850212, 6472432, 5695583, 5767722, 3837496, 8124677, 6147027, 7334812, 2532889, 345627, 6715891, 4033489, 291275, 2910897, 768374, 8350890, 6911968, 777267, 1090688, 114594, 3574675, 1369255, 3942757, 17905, 2947101, 7288889, 338604, 6731305, 8377500, 2393302, 5915241, 7412156, 1796, 4001908, 4164638, 6094278, 1008565, 4346780, 2129108, 4639089, 4935627, 5740275, 3375681, 5699358, 1752881, 4891070, 3151005, 6842688, 5770570, 6200544, 8244458, 7762839, 3526971, 4576311, 5602354, 7461454, 1961495, 4164208, 2147585, 3798330, 4270559, 1807282, 7788409, 2237439, 3121497, 4504072, 7407097, 7952917, 5224831, 6208891, 5596979, 7957844, 507696, 6797097, 1076502, 8046459, 5124087, 5813864, 8286866, 1341719, 3242397, 4859160, 4282778, 6502531, 2963066, 8182175, 8147860, 7221283, 5501561, 6403067, 5090058, 5010493, 2179760, 8239227, 6663299, 3983947, 6455816, 1678150, 2060495, 6862793, 7411013, 2800887, 7039577, 4631398, 3962052, 7404665, 4306541, 7281928, 2872345, 1907989, 1691832, 347389, 4802469, 673962, 6449261, 4124133, 3179202, 6926036, 1997263, 1747417, 7195528, 5537723, 5235246, 4726176, 5583354, 7349260, 5985056, 6744411, 6375131, 6070733, 7116186, 7538856, 6988788, 106604, 508412, 4679619, 2244078, 7293023, 6794698, 2062934, 6666072]], -[[6950338, 2115386, 6928349, 327570, 3902349, 298487, 5782285, 8201882, 4150826, 2132911, 5243966, 927144, 8320127, 425757, 1624704, 3722774, 1209442, 1612492, 8342370, 2664514, 3834878, 189590, 675970, 8210480, 3703414, 1805216, 1781034, 527214, 5665219, 3275816, 4982239, 7360325, 2573398, 1705658, 7341358, 7729418, 2237508, 4500299, 1716518, 3308974, 3635234, 7643415, 8117797, 4945591, 3872538, 2326919, 6236007, 438304, 7896750, 2477868, 6668954, 2398930, 7139209, 2194809, 4837301, 2631761, 614331, 5073659, 5474528, 6310440, 8191910, 6890851, 5247790, 3636483, 7820803, 5841983, 146876, 1890746, 5044783, 1900967, 7005922, 2317751, 3210910, 4862815, 3708879, 5504197, 2795624, 5412449, 2984260, 4301670, 6771281, 6505847, 3908709, 3530868, 3305993, 591169, 796803, 3811288, 2736515, 4248720, 4109287, 7772888, 3078967, 3872677, 7505885, 6301343, 3331451, 7225591, 733064, 6423636, 5347672, 5218852, 7165588, 4369412, 580601, 142508, 2577898, 6559819, 8153692, 2879671, 5316370, 7920599, 7763271, 969058, 8163504, 979222, 4563547, 4714951, 3236434, 5888763, 6017843, 3644506, 7576382, 6609166, 3283032, 4191922, 2170772, 5810880, 7344287, 6301697, 6165698, 7087778, 7648687, 7681586, 4803714, 5060275, 1197589, 5055449, 5780261, 2686700, 4416773, 698260, 7089839, 4314105, 45909, 1329101, 1205466, 5644146, 7595315, 200616, 1692297, 736346, 2208144, 7827334, 2822959, 175112, 5598154, 5894280, 2615820, 7912719, 758946, 1694631, 5876887, 8080359, 6489003, 4333934, 6690525, 1015963, 559097, 8278060, 1376143, 2018104, 5597018, 6717466, 4107900, 5404675, 1042433, 7617789, 3242033, 3618173, 3196846, 922182, 5793301, 6282997, 5087550, 4378846, 846902, 3167545, 6471354, 2246584, 4942287, 906664, 2654731, 3374137, 4428998, 4920225, 7072967, 3200836, 7057084, 1554487, 5044343, 106917, 941319, 3130697, 1314615, 5433453, 5829860, 3356098, 2828209, 1453235, 3785304, 3078020, 346295, 1802710, 6447235, 2058816, 2001343, 2422933, 6980316, 3882780, 5956017, 6365096, 1046516, 4439500, 605888, 971147, 4679540, 8370061, 5773730, 3567459, 5543221, 935437, 5319128, 1982054, 3367432, 7261030, 5363679, 1241367, 3571010, 2599550, 3711734, 118118, 2719447, 4890859, 1675276, 1678935, 5835180, 6345851, 2031418, 751519, 7078194, 3913712, 3882941, 6981448, 4676499, 4877466], -[5852529, 919415, 5479291, 3781435, 6097879, 4997421, 7817984, 7656906, 5267745, 7345667, 6158925, 3188692, 2897107, 6262476, 2670056, 358741, 1579438, 854392, 5075932, 4042102, 5910638, 7702596, 754412, 7188851, 1413184, 6751323, 2133594, 4674258, 2255176, 6296540, 2695937, 2863911, 1079993, 7929477, 2335371, 7101945, 4889286, 3006208, 165296, 4673246, 2756378, 7293589, 2485405, 4711611, 1934111, 676908, 1817304, 6301562, 5301581, 6466342, 3553698, 5476227, 8227094, 2574853, 6787722, 3753939, 2436729, 6167624, 1541477, 4981049, 1627595, 3602581, 4887600, 5423862, 4311489, 8109057, 153332, 8289862, 1033337, 318092, 5625810, 2450130, 7239217, 924738, 1612167, 4546862, 2738330, 1385213, 5367156, 7901441, 422327, 228546, 4984232, 3290176, 4016637, 7148658, 3755959, 7709556, 8152385, 990025, 7099455, 3443675, 3951605, 7527162, 5563113, 5694999, 8331771, 4835524, 1353478, 1249311, 3399190, 6740852, 1394757, 2867286, 2325698, 6590132, 4102038, 3004556, 7132360, 8278500, 136908, 3358265, 6882202, 3544391, 3550670, 177957, 7835740, 1056825, 3906101, 703631, 963470, 7315146, 6558500, 7452788, 7924451, 1498128, 8023581, 221396, 4551551, 1149506, 5375661, 2538133, 5961278, 1691456, 7106247, 8215499, 1339335, 7437330, 1376801, 2470836, 7169017, 2120361, 3482432, 2267560, 7222572, 2479603, 1681579, 4220203, 5656987, 6653026, 7479982, 335810, 5566065, 3453683, 5310715, 8021657, 5846601, 3282800, 5260207, 5015458, 1843263, 2126453, 6359744, 1046125, 5201234, 1768474, 1942171, 3038886, 503461, 6558789, 3375465, 960573, 4042826, 5773858, 2996012, 6466482, 2030896, 7278042, 4905381, 393623, 7170821, 3770373, 4919466, 401710, 2350469, 7327663, 3973267, 5418632, 3200826, 1574217, 3293310, 1163805, 673566, 5275016, 3876271, 3371710, 5261461, 6158893, 4120037, 394604, 564095, 5493705, 6478720, 8271251, 7923538, 5027993, 5401209, 1615421, 7022725, 6790559, 5364742, 6510183, 6419924, 5481222, 8070218, 6973304, 3307638, 2696373, 8029003, 3576574, 8068819, 7386039, 3276176, 8375631, 730487, 6232511, 6819755, 2877500, 1390917, 2594864, 1167548, 1877499, 8084268, 4350464, 930167, 5663941, 6653229, 2181457, 82891, 1038371, 274122, 3437196, 4725870, 401847, 359828, 6196393, 985113, 328721, 3622734, 1090952, 414265, 2764881, 826030, 6215815, 5881649, 4911845], -[2689114, 309431, 5207970, 6047783, 4509433, 4055700, 7448908, 5426334, 5933344, 3849382, 6877084, 7636054, 4124963, 7221349, 5703021, 7101008, 5309984, 225313, 4813692, 2651654, 2969225, 5700160, 2964263, 486626, 823441, 289198, 5863788, 2584683, 1940871, 7087898, 4252313, 7364554, 6146874, 7212740, 7134075, 2797209, 3545881, 6245615, 6451226, 4428077, 131209, 3973489, 3789401, 1828397, 2734801, 7203742, 6166986, 1143787, 76629, 1967437, 4039978, 3779891, 2309218, 4554896, 7528417, 7769692, 6046951, 136389, 7500394, 1596821, 7778539, 2328807, 8156114, 7858684, 1434214, 1554934, 6224859, 198166, 110173, 1705130, 832603, 7596196, 787449, 4669586, 7445245, 4863899, 7338848, 3798871, 5408114, 3803637, 3667703, 2885832, 5630468, 1224092, 6381988, 5237848, 7916264, 7652661, 2008138, 888710, 5698621, 2323203, 6092936, 3830015, 6139733, 314303, 6048173, 8293436, 2025224, 1651107, 6170593, 5456943, 5879758, 7740893, 8340258, 4684260, 4913471, 7296614, 5087850, 7424377, 3654744, 2588663, 3233811, 6670840, 1286489, 904731, 3690185, 600174, 3964276, 1248077, 4523364, 6892727, 5049615, 2677776, 2539786, 1700726, 3855021, 3277095, 3044879, 6449013, 1263501, 608396, 3857792, 5544415, 1708141, 4749128, 3792454, 2150647, 4818885, 2656489, 912089, 6928154, 6032035, 6074957, 2259952, 6557696, 3824452, 1261555, 4082815, 2265011, 7407651, 2104875, 5150935, 5324245, 5698511, 3207878, 3007813, 8009167, 5459225, 3587819, 3941736, 4061266, 111690, 4300259, 2085047, 1900936, 3733077, 1049194, 6281739, 3699110, 8102098, 2390265, 2129309, 875916, 5909182, 5902829, 4170532, 3173924, 269495, 2787219, 1801429, 4659366, 7914442, 2973743, 7081798, 705548, 5344147, 763783, 5235514, 4887159, 2826814, 264600, 5671988, 4354379, 4635058, 3102126, 7563283, 7940454, 3695485, 3543738, 6087623, 7087421, 3818189, 4552980, 7143374, 1384887, 4082778, 634385, 6786575, 6721508, 593419, 1480203, 7273268, 4911757, 2231638, 3863107, 14878, 4280618, 7514362, 331265, 3004919, 745432, 854665, 5692830, 8111603, 602436, 4403085, 6108008, 3929829, 6398694, 6816228, 6128674, 2140034, 7424515, 939780, 7308423, 6455363, 3540116, 4830084, 1509063, 6378858, 3559999, 2157944, 3927138, 2259924, 6766492, 5843144, 7039175, 2330844, 4490355, 8120943, 3986952, 679820, 1169881, 799969, 252337], -[552833, 4429991, 8205740, 6871326, 6292004, 8174831, 1618170, 2844306, 3473762, 4973316, 3529343, 8149057, 5022386, 3969157, 20732, 4153278, 742133, 5162184, 4443546, 1427969, 4004863, 7667860, 7043901, 7203088, 7740452, 3055156, 3909777, 5604121, 4714695, 7860623, 2012052, 5768688, 2964364, 4519770, 6413904, 866486, 7180574, 1366494, 4086023, 4836166, 2429382, 6745427, 839726, 2389846, 4513204, 2729730, 5858052, 7283046, 5989639, 395378, 5944805, 128730, 2838265, 7824436, 4118321, 4084599, 5099811, 488812, 6215977, 4872039, 5298779, 3705172, 7504055, 2600287, 5049394, 5357980, 7170657, 6716870, 7490499, 6472915, 3844609, 2938393, 6974190, 6241921, 1410650, 3944213, 1641970, 705766, 5734493, 7830954, 673344, 1238288, 5584219, 5918354, 5503318, 5314116, 7236513, 5048247, 1122901, 4401727, 8127401, 410785, 5009016, 3316217, 4836382, 5593270, 1606900, 1093083, 1895810, 1351322, 4395875, 7669739, 1853325, 1575939, 3654092, 6218435, 7880041, 1406515, 1278854, 337219, 4159229, 7110354, 8261591, 845352, 6347667, 4418805, 7736784, 8301084, 7067920, 8028826, 6201026, 4662565, 1865897, 2626718, 8138363, 2845101, 5047547, 7688023, 4845167, 343361, 2875551, 7179701, 7394683, 5737008, 3557744, 4254753, 2930543, 1462815, 836198, 2218802, 3636145, 8293019, 2400959, 4643609, 3643496, 1971265, 1812884, 1882748, 2672874, 6707351, 387811, 4127622, 7962002, 3502121, 5082843, 279256, 4862926, 744185, 806399, 6883033, 342462, 8129277, 5229117, 4284976, 4181657, 5762070, 4282534, 6326846, 2814878, 4307137, 2787832, 3535314, 6784738, 8211271, 7272418, 6740448, 2734959, 3292318, 265220, 3709843, 6216091, 5652669, 1785603, 7501907, 1325156, 1005630, 5662933, 1745883, 968364, 4986345, 402011, 8090856, 4326188, 3506722, 1357337, 6657228, 1798907, 1484102, 4596541, 6582888, 845855, 5544885, 7306639, 5819104, 4452747, 7744455, 6286851, 6773348, 5767414, 2147926, 3834470, 1861007, 8051679, 7139366, 1114724, 668613, 777828, 7938984, 5600202, 1745155, 7333497, 668119, 5610198, 1592603, 8340841, 1614477, 859915, 3805409, 5422124, 3459213, 5247894, 7545134, 2665814, 4864510, 5938999, 6661078, 1869357, 6267135, 1794994, 2454956, 1234011, 3099003, 7633771, 1943096, 1631792, 3005519, 1978614, 387990, 7438975, 183749, 5058158, 811281, 7866722, 1291764, 5235971, 4714260]], -[[4472096, 7236352, 4221145, 8347497, 4249314, 5913183, 8153235, 479277, 224134, 6261561, 3243881, 154304, 5821916, 6075114, 1111272, 7489574, 5320869, 5511034, 1234444, 4494265, 6532931, 3955449, 2173200, 4623260, 5057417, 861988, 3821669, 6632699, 5414039, 5230746, 7480640, 2347261, 822865, 1019224, 5111704, 6250051, 693355, 3990877, 2360966, 6010851, 263695, 7851242, 3432207, 1116638, 6003050, 7991566, 3560057, 1802619, 2131976, 7556408, 960639, 3268946, 2667737, 4816040, 238298, 6591229, 1625633, 5415945, 288855, 7356728, 2580790, 1459768, 2758575, 905708, 5452507, 8270487, 8017868, 2569493, 1125841, 4890286, 4370548, 1210237, 7811933, 138884, 7117739, 3398172, 547290, 4873197, 7107319, 4660711, 6546620, 1227354, 7430958, 6819018, 1791015, 1463085, 6925275, 550396, 5706731, 1180018, 3704658, 696703, 7184938, 6342057, 7367912, 7027244, 1436161, 6198923, 7737335, 2012167, 7216437, 7526914, 4276117, 7476537, 4224221, 2212924, 4061481, 5194910, 4512487, 5703922, 4652037, 6508131, 7405575, 3985531, 2601038, 987642, 7109820, 6069146, 2296389, 2510508, 2523803, 2811594, 4528424, 2014903, 4187880, 3573241, 5539719, 5917448, 2386327, 1827886, 8362883, 4318839, 5244193, 4653422, 8228032, 4707811, 6832298, 8225009, 237016, 1976561, 3953997, 1857068, 1963442, 3491900, 466728, 7463505, 4131855, 5414287, 1337817, 1115808, 3215107, 8350568, 7427748, 125597, 5085225, 3351131, 6444526, 2755543, 1456775, 2915721, 1718986, 5043016, 2883781, 5218792, 6904498, 8361295, 6510504, 408047, 198085, 8038101, 5933607, 1598272, 3178578, 3979115, 1952108, 4791769, 2185352, 516218, 1164292, 7917038, 3485269, 763467, 1674443, 1790072, 1389074, 1491312, 6867030, 6292584, 3633493, 7678148, 3673158, 4655649, 2143767, 2641487, 7869916, 4708545, 71659, 7487010, 17778, 6143394, 3066283, 7207273, 5246473, 3636987, 4974840, 6784308, 3578703, 3406307, 3434797, 7982791, 6880131, 6219325, 5254906, 1068095, 6776483, 4742406, 6080901, 7224895, 232025, 3165221, 1066028, 1092753, 7639298, 61036, 1640076, 4743107, 1428415, 4664948, 5208326, 6271117, 6526776, 6493110, 3794907, 5850050, 3501654, 979899, 539313, 5364089, 7834583, 3102525, 5842243, 6319093, 8107103, 4499638, 6558396, 3140899, 4698380, 6281695, 8204816, 124858, 3203623, 4159110, 3325925, 5921770, 7919546, 7727102], -[7352069, 7918539, 188906, 427145, 441022, 2537168, 6789776, 6358894, 2292569, 3987766, 7604470, 6499864, 8032114, 3174361, 2240912, 6694442, 222061, 2750671, 6652327, 8183149, 6220640, 4706703, 8148644, 6151282, 5907906, 6773680, 2723700, 5198332, 5998200, 114194, 3041895, 7311218, 6838691, 818598, 6849413, 2817835, 2354668, 3805581, 1480936, 802277, 767834, 1863703, 2674017, 7855497, 5321363, 4777124, 6203233, 1023724, 2777924, 4681702, 5449264, 7003886, 4086427, 2035595, 273527, 2940313, 2374640, 3856139, 6489901, 6506489, 2040704, 5701943, 5993642, 4753990, 6425056, 8172319, 1842261, 6348190, 3221913, 6527505, 4683013, 4740369, 3742789, 697616, 216788, 521168, 4782966, 4427348, 2846895, 6139322, 3870296, 7014960, 2072428, 4507799, 8373690, 5947970, 2062290, 7886327, 782147, 2852196, 3281753, 3914060, 4211988, 8221474, 7917073, 8234207, 2793624, 5301730, 5896527, 7314077, 2143512, 5503399, 5108992, 7635386, 245446, 829228, 7159331, 5324733, 3676799, 4583021, 1822025, 1630264, 8058967, 932404, 2364840, 4148599, 2638803, 6393100, 2057158, 7048780, 7705368, 7412795, 7417484, 613516, 844219, 3784678, 8141878, 7494764, 5450756, 5049052, 3354330, 6014154, 64026, 4612914, 6289406, 7223380, 3635451, 2153539, 4864140, 3114019, 1065066, 7181239, 5691908, 4716812, 6496142, 3174721, 7691795, 6393463, 5306900, 1375277, 7047559, 1462207, 1134771, 4692125, 5270075, 5103486, 845921, 2086876, 3547037, 7465718, 3028643, 7488240, 2176874, 4517209, 1966509, 2169554, 3645940, 4735141, 6910902, 6060768, 7958768, 5848029, 6874962, 3929957, 3353591, 7331405, 1205679, 7000877, 4328649, 2330047, 4718867, 4353123, 5507526, 6407662, 3875157, 2862171, 1003442, 4709918, 3184005, 753014, 7057631, 1750794, 1944985, 7608844, 2394719, 7460898, 2688083, 5762596, 4520238, 3429841, 1237011, 8195295, 6409716, 2101667, 2696957, 3676844, 5167930, 923735, 6170869, 7046004, 7448468, 6328421, 1190191, 8278349, 4822387, 5178922, 7900530, 325292, 6534144, 5058750, 5968542, 6395401, 5046600, 6414563, 4340014, 5564435, 7458764, 6191628, 409391, 1451389, 7246495, 1365264, 1504644, 3289898, 2249598, 5235260, 4493671, 4031135, 7531814, 7155128, 6305604, 6133950, 4253586, 4428621, 7551636, 6765745, 6139967, 1788510, 3297658, 5823080, 4464221, 1930481, 38497, 4551868, 7978899, 2279575], -[8217507, 6872628, 6383570, 1673212, 8052859, 3354171, 2792420, 2904433, 2750832, 2213338, 6161318, 6768156, 4669374, 6370607, 7989007, 2396125, 3604793, 3874993, 4938805, 4608610, 4268184, 4742548, 63132, 1633585, 7072077, 3035511, 2178048, 5411378, 2563240, 1126030, 4683165, 1286038, 7507225, 4040027, 2692383, 1999321, 4043465, 1499150, 1191909, 3458112, 1227895, 4405661, 6807561, 3354607, 6411908, 4039737, 1730405, 7368645, 7115551, 868723, 694753, 565335, 905675, 157891, 4066211, 1157055, 2874871, 5298424, 7722175, 4766913, 7760534, 2614063, 6861204, 3276758, 7257285, 2899562, 6097815, 3770000, 4645753, 277811, 2178091, 7892900, 4718461, 2978042, 1724454, 5186795, 5467588, 4072570, 7363417, 5452756, 4418042, 4781251, 2506461, 3054386, 4136609, 3736932, 2121550, 6454655, 2698794, 1441331, 3517005, 3577438, 4559960, 4026104, 3233379, 3027871, 3414050, 6063041, 1336038, 6877434, 1035391, 4608091, 7983499, 5562805, 3936642, 4696008, 4580216, 927943, 3702195, 8087670, 768811, 4735088, 1587353, 7569615, 5550712, 1022145, 4654355, 7546612, 434123, 7974227, 3244350, 6615621, 3548743, 4839624, 496054, 4414619, 7622979, 862834, 1972400, 4735278, 5102283, 2780086, 6539343, 192406, 1313615, 7422333, 3927645, 5437931, 6183063, 1636954, 3595974, 1320927, 2809923, 7009550, 5600783, 3685535, 4815296, 2580849, 5781919, 4226063, 8006951, 1405697, 4206742, 271993, 4427393, 223778, 5279345, 2231181, 696944, 2588106, 7184089, 1025537, 1156831, 8154096, 1856590, 7103397, 925467, 5762090, 3829867, 2738590, 7144026, 1865713, 3666878, 5694294, 1359714, 3963338, 582994, 3456788, 2717775, 3551021, 2110123, 296341, 2761886, 7164644, 5311792, 1017952, 2816598, 476353, 1176382, 2286785, 2098978, 978461, 7966283, 490900, 280558, 1010298, 826879, 7162751, 235863, 7041347, 1342361, 7930374, 5146316, 3022161, 6989373, 873426, 284681, 4657955, 5814501, 1851110, 6445248, 3490532, 4973379, 5080677, 4467568, 6140122, 7622911, 2139361, 7523899, 6170252, 5084307, 4689494, 3436040, 3509020, 2422278, 6383265, 4504653, 1699044, 3083935, 1279986, 1026884, 4096864, 15324, 4379226, 7161346, 5188643, 1149743, 1475915, 5786490, 5364580, 4691151, 711497, 3584484, 6410119, 2742658, 3895767, 4465620, 6304976, 777554, 6505589, 7284366, 6503610, 7334026, 10415, 2416561, 4292463], -[4663440, 1941853, 5367071, 5014854, 4576328, 1084628, 472335, 5208558, 1100699, 6255907, 5606440, 1861394, 4814860, 2651636, 2945762, 7614198, 506607, 3481866, 333773, 5085976, 8238014, 751028, 2049396, 4761733, 3623400, 1805985, 2003467, 7132739, 8345198, 5057418, 398723, 3906649, 1257617, 4001215, 6301402, 5370674, 2870062, 5561142, 7441576, 4040708, 3206727, 5634539, 7408041, 8204061, 7569518, 1280993, 6280213, 4948884, 1444757, 6656650, 8079749, 2423338, 5836506, 822889, 4601101, 6028429, 1103479, 3773379, 919880, 752259, 181966, 4348875, 2038076, 4508586, 2507061, 7305442, 4753603, 7231406, 5577511, 7203409, 3341402, 2748091, 7904555, 7255031, 7607998, 1081870, 1091198, 185020, 4273869, 2394768, 543621, 2777774, 6346747, 7118120, 3348302, 6233275, 1901355, 2276261, 6879834, 1884974, 5523805, 2476181, 5927129, 6523996, 2661792, 218645, 2831509, 5467048, 7924252, 5660897, 154385, 6308910, 4234578, 7089378, 4934881, 4365111, 1885865, 3080120, 2701542, 3712611, 6996603, 5058483, 284530, 1079297, 622094, 2826027, 5472938, 725956, 6701063, 5448833, 4298965, 1148000, 5261050, 1592379, 3190383, 2947355, 2352626, 2486480, 5025205, 4805146, 6358006, 7397359, 376494, 1279959, 1311458, 1818960, 1268663, 261324, 542798, 6758274, 2534380, 4215919, 1174626, 3381182, 3866496, 1207435, 5211375, 1752155, 507262, 2609398, 195909, 1119599, 4152611, 8010027, 4260767, 7463141, 3344543, 92157, 6452483, 4620570, 6945583, 1997623, 954402, 6706345, 61993, 7591455, 194625, 4115328, 1009715, 5964421, 6810821, 334341, 8032601, 6664614, 964119, 2685716, 1529173, 7006221, 1841297, 743334, 5350015, 3867905, 3026787, 6615150, 8062339, 6437584, 1083260, 2583729, 2643875, 6166028, 2050780, 7744068, 7250569, 2796373, 5459371, 2860966, 181299, 6116776, 8296094, 5214800, 5826703, 3539222, 5196634, 828233, 22487, 7428456, 4468391, 505189, 3984935, 863867, 4818783, 5023402, 6607284, 6559028, 1416455, 7337370, 6241263, 5133417, 5510429, 3614428, 2816617, 6807628, 7585656, 5754419, 3791384, 3399504, 4586159, 5104113, 7330375, 4628494, 3901491, 7172552, 1692551, 1786009, 6014604, 6326089, 3899800, 1930325, 3226105, 1776481, 6100076, 1432963, 5451293, 4841960, 4617661, 7590352, 6734361, 4149386, 2512935, 6266894, 1101680, 6661884, 7398933, 7630093, 7080485, 6569653]]] -trCandidate: A9CBDF7C927F677A561B66AB5BCD6E1F267279AFCCA1576595E6BA6E4D1B225C95123962C9523C7276AF324071DFC205F88140E81C44199FE92964744959CE99 -muCandidate: BA55E8D45110BBFC1C9A23DDB43B93AC4DC6EB68780D5A1CE0FDF50895E1AB0E9F1EBCD34FE2E952B9C1BB8DE721E892A741C1C055190AB43563BF73479AB937 - -c: [0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 1, 0, 0, 0] - -NTT(z): [[6959427, 6929453, 6113881, 4981143, 3545954, 6943164, 1647500, 2087619, 7374489, 5817057, 7760820, 6107494, 6733654, 3414907, 3084396, 6976092, 4524195, 1134448, 5455403, 7615404, 5437795, 2388161, 6067566, 8106135, 5149580, 1197549, 715482, 1487487, 816214, 4654614, 4530571, 821539, 2286874, 6215522, 187743, 4607626, 8233428, 4965811, 312425, 4395327, 4126877, 1251027, 8215260, 8099878, 6689499, 3007890, 1351214, 4648513, 8322275, 4701207, 3680576, 579589, 7911362, 5888358, 7470897, 3336213, 3033214, 398788, 2394650, 7097412, 1273943, 6761361, 4471955, 5961848, 1867684, 5678828, 5092966, 2490753, 4030038, 8281514, 1590874, 3539002, 7467865, 7902152, 4568002, 1968104, 167503, 4305271, 882438, 7856953, 512003, 7490931, 2264092, 4685771, 1220359, 7936191, 5501422, 2310695, 4576202, 8211066, 5196061, 1215466, 126890, 2682026, 4055496, 7978979, 7664157, 4733521, 7620692, 2430348, 1824001, 1348423, 757005, 1205861, 2705179, 942779, 1553770, 6779698, 6092485, 5192092, 7511954, 3526928, 5193445, 3341250, 1845434, 5155232, 804251, 3216005, 5592583, 1631689, 102210, 1239036, 5457414, 3773927, 487202, 3023050, 7925802, 4071896, 6759401, 3472389, 5181442, 2528890, 3953392, 7182345, 1498246, 3190030, 4815814, 3543809, 6149794, 2491832, 755633, 263965, 8164688, 110699, 8171467, 1499998, 2479632, 1104838, 8380069, 7603633, 1738053, 1715766, 51128, 333608, 2165322, 7827135, 452579, 1687120, 1161120, 1493909, 8072589, 6419730, 8074608, 6349630, 7419021, 937495, 719739, 585924, 8252699, 4722738, 2131266, 6586423, 4047185, 5072429, 399897, 8073343, 6473068, 5420569, 6091475, 6334801, 585138, 80095, 6183567, 5180643, 2170908, 6380189, 4136323, 1117869, 1513395, 1426697, 7796431, 5691067, 4775042, 3237265, 2549690, 2233088, 7239136, 1476201, 2637861, 3898301, 2728371, 6396647, 73661, 831887, 1788640, 6126136, 69311, 2974319, 1968649, 1821869, 3896956, 1994098, 2678717, 4007338, 5630415, 5422460, 2514601, 7630006, 1538712, 5417019, 2450091, 4794665, 1959170, 7000235, 7260013, 7434864, 2786333, 8029627, 2329946, 399921, 7397779, 228492, 5501356, 6038344, 3695073, 2966569, 1596732, 3620179, 5369560, 4811951, 5028487, 894833, 1148098, 1990919, 5096888, 2902066, 5903058, 2299980, 2536359, 353393, 6160211, 3799526, 2932452, 13889, 4785163, 5719273], -[1231705, 7495344, 2673873, 4296704, 5139723, 2188749, 3314440, 134207, 4164366, 1010512, 4356688, 247311, 5471383, 5312157, 3555880, 5253388, 8256502, 5169005, 4910956, 8234515, 6504957, 3522977, 2362539, 1216721, 2475404, 4477561, 5934325, 5464874, 4368486, 510732, 5083311, 7273881, 5355731, 5668339, 4729119, 284431, 233571, 711975, 7678548, 6406475, 2568475, 8151453, 6432796, 7220478, 7511354, 5567326, 328409, 4266434, 7505748, 3049120, 4687583, 5939594, 3828249, 6235373, 3186880, 1302544, 2403825, 5667017, 5072834, 217060, 3045176, 3293858, 3744492, 1162784, 7902866, 3246314, 3413377, 728785, 729567, 6687362, 6866287, 8359379, 2238439, 846111, 1541812, 139009, 7956955, 1906305, 4238829, 3671276, 6111678, 5312249, 7731927, 2980138, 159752, 8024507, 7886403, 6361205, 6823416, 7629025, 95523, 8123413, 6066076, 5520818, 5687608, 7151664, 4832493, 2684260, 1276506, 797551, 1480893, 2388536, 1584078, 161984, 476679, 7188564, 7463456, 3300096, 2119061, 6092629, 60687, 5663713, 6664878, 6553835, 5375327, 4890442, 1722546, 4940790, 457142, 2272351, 2892939, 2090706, 4807212, 962402, 4871114, 4391886, 6963093, 1023447, 7423773, 2447767, 1762930, 233934, 7544529, 2819369, 7249681, 1944981, 6084499, 992925, 5041687, 6175388, 5319270, 3065612, 5062878, 140024, 907100, 6739202, 4233225, 6624452, 4741186, 229657, 7576115, 1655190, 6408094, 4029052, 197705, 2073317, 5105982, 6568106, 8222460, 7261074, 5395364, 23519, 7856675, 3237091, 2822996, 2499841, 5076379, 2927224, 2063892, 2279649, 6218793, 581339, 6421934, 4842269, 1598969, 1652057, 639280, 1279223, 3836532, 1965868, 662611, 1774345, 3890913, 1236973, 3525856, 7778253, 3737447, 77027, 6338940, 3280504, 5970625, 7475373, 3912353, 3549065, 2292974, 8357691, 4847861, 4471793, 7608309, 5184614, 576052, 786776, 1574410, 1085725, 1396864, 6697937, 3495738, 2019313, 5710621, 5405275, 1774891, 6719169, 6438077, 1002015, 760265, 4576261, 2569300, 4246295, 1883563, 7823183, 56531, 521551, 4532527, 3508206, 4109058, 6959738, 5365087, 8140707, 1826358, 6801611, 4023434, 1858566, 4135209, 7200393, 3574708, 7862995, 6133600, 7736710, 6392927, 5829141, 7695631, 8337322, 237940, 4183511, 1759233, 6501546, 6962283, 553456, 2825965, 747814, 5061920, 7424057, 7817300, 4043540, 3259620, 4428981], -[4766893, 1072408, 4924305, 4440602, 5910429, 173222, 5081017, 3446850, 3377581, 738231, 972604, 7542340, 1934563, 6243789, 1833524, 7196375, 2121851, 3643719, 1938134, 563507, 6624407, 8360400, 3833896, 5866989, 1151395, 5009863, 5555783, 6533639, 5044655, 1452008, 1241470, 5537308, 1464591, 1699846, 7916714, 222183, 8105753, 5493439, 6567168, 4800150, 2830473, 6600616, 582393, 6080945, 4518347, 3981231, 5654117, 1597165, 1434488, 3865426, 5835267, 5666221, 5437543, 6033223, 2088661, 7116645, 5745258, 2305179, 4493344, 3397803, 971849, 5853624, 1142563, 6362253, 2497712, 2120576, 703726, 8147382, 999620, 8239716, 613409, 8246689, 3126885, 512544, 599270, 4466115, 4058179, 6294401, 2263860, 2781162, 7398265, 7492135, 2738197, 3655614, 2813712, 3186440, 4302184, 1464199, 4839442, 4039979, 1956182, 2821563, 613888, 3290841, 4371929, 1953796, 2436540, 7614468, 3095936, 388977, 5873844, 2462362, 3704464, 5701976, 5879484, 5192769, 5721437, 5183438, 2002723, 4921215, 771135, 4024003, 3725898, 5419330, 6720479, 7183607, 8047245, 7536252, 71159, 4062166, 1034098, 3161703, 5291107, 7712399, 2990500, 3561192, 1048930, 7014115, 6351316, 2234522, 6265952, 3291054, 6612680, 4935522, 6433279, 7833928, 2343335, 1867033, 5906844, 5747626, 7586471, 4026477, 1709316, 3833447, 3861580, 493224, 1480770, 6802232, 7673676, 8241265, 2171029, 3962278, 4451470, 6953512, 2736854, 4866441, 6942787, 3701695, 79444, 8135089, 1187838, 6351736, 7852948, 2937560, 1643817, 2200354, 6034134, 4396467, 6867365, 7138273, 4538169, 3331096, 2581124, 1664269, 3457223, 7674766, 969369, 2371708, 4832573, 1231107, 2069034, 2726362, 4122229, 2528758, 4081575, 8180164, 4090351, 1141548, 4962493, 3286333, 7764331, 5525309, 6903596, 5803028, 939498, 5916650, 6026676, 5697931, 1635266, 7858243, 622735, 5804096, 7962138, 297088, 5659734, 4501472, 3494656, 1647711, 77902, 1022524, 6821524, 2064429, 6038221, 8208656, 7653794, 90724, 2374730, 6348190, 240912, 8235817, 2867026, 5205078, 2164223, 5336131, 4172560, 2653428, 6149085, 5363978, 3452385, 6715760, 4200603, 697513, 5233086, 6443433, 8362070, 5340106, 3469610, 6274880, 163018, 192168, 995461, 6826300, 946597, 3128830, 3100059, 5037389, 7082680, 3333487, 4117801, 182393, 986359, 6072176, 1500535, 2874817, 3798545, 7944964], -[4026856, 2807882, 1088349, 8124353, 276002, 2293700, 5377309, 2376131, 1418632, 5987554, 6752925, 7556578, 4355976, 3355939, 2487045, 6128779, 2551426, 3447835, 3449874, 5669560, 8108096, 4491083, 4700226, 7891834, 5248113, 4487846, 408703, 7485234, 1154141, 514783, 1611723, 4339788, 7099351, 4874302, 5151668, 1689653, 5139967, 6043105, 7362587, 1222376, 6055719, 969243, 8195899, 7804753, 7392940, 4824722, 2977085, 5824853, 1756585, 5428380, 7252596, 7729487, 2679236, 6564084, 6362055, 5975713, 7424502, 365009, 4973493, 4562482, 3711737, 5336047, 6337026, 6704314, 6536443, 7298324, 8109969, 1150288, 8240285, 7150442, 2484856, 2522069, 5247508, 2399998, 5900217, 1208457, 3211579, 4325516, 479883, 1467074, 6965389, 4666939, 7258359, 5850908, 4254297, 929750, 698875, 3015722, 2497057, 6334707, 3587127, 5490103, 3556935, 8049966, 393812, 3330246, 7526214, 272185, 3532845, 1018943, 3514065, 90912, 7680985, 2406674, 6345517, 7269883, 3814604, 2342597, 3172635, 2647291, 4517340, 7196830, 5129007, 7855783, 1147398, 984805, 3601847, 7545372, 2617212, 7768651, 7462170, 2227764, 603562, 8005508, 7968700, 6251380, 4566284, 1625040, 8218832, 1084600, 2698164, 1577652, 6005410, 7664872, 3603239, 4860897, 7150344, 7020091, 8117305, 7355015, 3085545, 1290893, 336598, 6308883, 2135782, 7729554, 2261222, 6054018, 5174759, 6645090, 4574208, 8312400, 985727, 8289013, 6386436, 6771766, 7970451, 4157736, 1487386, 4892779, 5297094, 3295584, 871725, 1151778, 6272289, 505133, 1706989, 4028424, 7347880, 5208452, 4159876, 683534, 7003455, 45093, 5658348, 3990036, 8091158, 7484305, 7785090, 1967522, 2900477, 4963897, 1544087, 6717334, 4155762, 6572196, 1616258, 3114121, 5442563, 4391765, 2356540, 7197662, 4109211, 2941308, 1920787, 7675350, 8166907, 2199984, 5461652, 7172509, 643274, 1592924, 4583187, 4216028, 2807455, 4325584, 2692784, 556039, 6906507, 5601088, 2815666, 5729146, 2227256, 453791, 3697738, 5415649, 7362598, 3904632, 5226411, 2528927, 3044317, 3684974, 3431607, 7482762, 6578998, 724875, 5988988, 4241604, 1666816, 2584692, 7980793, 7008403, 8338180, 75076, 1766232, 2969878, 5921914, 7778740, 1080256, 225978, 1770852, 3783349, 7647539, 2412872, 655070, 7225669, 6062735, 1375195, 5239746, 3941838, 2702402, 5087171, 3147857, 1193949, 75093, 1991721]] -aHat * NTT(z): [[8205148, 3682531, 6246060, 749942, 3179582, 6639911, 7079666, 4195088, 375904, 7358218, 7510083, 2890955, 2299967, 775515, 1123241, 4864387, 280980, 4284786, 5276268, 6092218, 2368962, 8257738, 7843599, 5429360, 2176683, 2458918, 6176321, 2979301, 326467, 6544070, 4426555, 5565838, 6861970, 6195233, 1082871, 8151208, 2158289, 5250476, 5201485, 6844098, 6126112, 6740678, 1710605, 2176198, 279888, 6912941, 2331073, 5737299, 6110144, 47639, 6244629, 2943723, 1731234, 3634703, 6494858, 4093016, 6975600, 1811896, 6672715, 3285103, 3321945, 1638046, 1853883, 1434631, 3395331, 6807804, 559718, 6285981, 2297818, 7357477, 3394232, 498557, 676323, 1307854, 7675005, 858948, 345405, 4901608, 4788313, 6491567, 2028266, 1140705, 203441, 5616498, 3987329, 8017384, 7786403, 7227827, 1145671, 8341405, 3720052, 1280588, 8180188, 5157924, 3633332, 7550204, 246437, 6685090, 5014940, 1231296, 7076501, 7585961, 3853999, 5705174, 5392746, 7172194, 6821750, 6545972, 5309344, 4377545, 4045993, 1940775, 2864877, 8363328, 4868314, 7241921, 4808661, 4868043, 1379402, 6533329, 8247864, 2906877, 2837650, 497706, 2653477, 5880621, 2957676, 2552364, 2564580, 2257177, 1108697, 2560451, 766181, 6945552, 15106, 4974383, 7615508, 552948, 5607119, 7322344, 3148564, 6899358, 1121988, 415891, 3050142, 4750775, 4959488, 3935466, 3461475, 3901617, 645458, 4630902, 7203359, 1274198, 4612419, 6942362, 4654875, 619745, 2836738, 7679402, 7679176, 7540638, 5269595, 7179282, 4682761, 2972404, 8026033, 335301, 4170618, 4980411, 1668531, 2818108, 7021901, 4660950, 1911829, 4994893, 1121019, 6485553, 3910961, 3587424, 8169754, 96829, 3891217, 5047221, 6703485, 6151051, 7370289, 1107370, 7157358, 3292390, 1039250, 5472165, 7727742, 4293032, 7316198, 6586981, 7800199, 4189193, 6614612, 5194276, 3538879, 4435297, 3714244, 3496842, 4110062, 5517404, 4206484, 7179608, 8173290, 7913226, 1959596, 2832537, 2853043, 7864057, 3434576, 3958180, 3707679, 8107789, 6472597, 5258825, 5446472, 2982864, 5855164, 5572520, 1461433, 7822388, 503843, 473872, 1827910, 1915065, 6602821, 399220, 6498754, 7783536, 205707, 3410635, 8012041, 3593088, 1865824, 2988308, 3075087, 7317604, 8105798, 579384, 116787, 4906619, 2954373, 2192972, 5712935, 3115715, 7727112, 2302792, 1101049, 2989417, 4439262, 1698749], -[198555, 3875383, 5473293, 1983473, 2018570, 7978287, 665150, 363524, 8164354, 6028711, 1364403, 4740059, 1911360, 7290277, 4965247, 4023333, 1408979, 7088204, 4279402, 8206536, 2953965, 4576707, 1625727, 3010528, 3026672, 2305168, 575959, 79113, 647349, 3750937, 7653527, 7084349, 2766418, 4870101, 4682485, 689205, 3546819, 3625707, 2526258, 1997128, 4549200, 587130, 1861002, 3515820, 6889638, 3736509, 4513429, 7640298, 4343031, 7286025, 628988, 929740, 978997, 566061, 7469705, 7060969, 2789224, 280137, 1643869, 3079172, 8192248, 1073830, 6925838, 3057661, 6169031, 409644, 4493873, 6131077, 6450758, 1345864, 469980, 4615800, 5281999, 289914, 65586, 8230015, 7856485, 6218748, 5395323, 7576525, 5576621, 3063639, 2974473, 4653416, 67053, 1067341, 589839, 524780, 964075, 2686868, 6974574, 2439360, 4118462, 2919751, 32987, 7032553, 3367078, 6362639, 1198434, 6400145, 3591320, 7775669, 6047444, 5410730, 5242292, 3996129, 1260994, 5183540, 65581, 2467478, 8299434, 5010055, 838698, 8127643, 8037082, 3474907, 7100881, 2838817, 4795038, 6677531, 8033971, 1722209, 3149810, 7157397, 7341620, 7839587, 1966793, 7021681, 6675606, 6194458, 2170348, 2425152, 5799898, 62653, 2428406, 2955855, 4696388, 328987, 3006934, 1992981, 4432703, 4765231, 3847238, 6203880, 3805734, 5243301, 3105703, 6403804, 6324240, 5433173, 6242584, 6995176, 1964295, 6629259, 2113946, 8149095, 5612100, 4945964, 6250469, 166881, 2905240, 5457384, 1321264, 7719968, 6630922, 5737455, 8054472, 854482, 6895513, 1743068, 6405584, 635832, 6397879, 6807721, 4146771, 4847489, 4352639, 5240747, 8047726, 7370547, 3783664, 5726431, 7611291, 8222543, 359337, 1911245, 6409680, 7874855, 3999133, 2304061, 6705207, 4963370, 277269, 5151916, 8358844, 1761465, 5291577, 2456813, 3174388, 6753713, 2519886, 2290778, 712547, 2175305, 5257352, 4386707, 1198979, 6666760, 1867330, 6960904, 265397, 6942283, 1196279, 2515326, 2064004, 5750094, 3453325, 3550306, 1711229, 161720, 3685474, 8181097, 4539453, 3231066, 1918339, 4770769, 6692429, 3808181, 2691821, 1753520, 7893637, 7630492, 7965827, 3325846, 7626041, 4194058, 2496335, 164516, 6953471, 933516, 3939531, 1068820, 951663, 2829780, 7077343, 8022308, 816008, 217040, 2555263, 3194582, 3677416, 4234811, 5094007, 2595768, 2315155, 1400150], -[4351705, 4966420, 3517333, 2886633, 3386198, 103045, 7302249, 56215, 7750504, 1780529, 6679151, 179266, 5238553, 5902511, 6542327, 5102217, 4161061, 6982302, 1335822, 3096365, 780578, 5464803, 5763422, 4345109, 851454, 398775, 3999021, 4462207, 7235918, 5176184, 4431370, 558144, 2908482, 1515274, 7223911, 822951, 4525676, 3564567, 3446878, 1986912, 3152873, 5881728, 4756471, 458025, 836178, 3477083, 6332545, 4655428, 8280090, 2198167, 4861686, 4654918, 5610130, 717489, 7470217, 7069594, 7739929, 627616, 4984842, 2089124, 4649129, 2446071, 2109511, 6304412, 6461359, 2192405, 2196087, 4205641, 5921868, 6113681, 3588157, 3414504, 1794487, 8224549, 6192711, 2314757, 2704982, 3215443, 1858645, 6586233, 3940260, 7147436, 5424436, 4776376, 6266755, 4122750, 1234875, 3450003, 1329119, 6997713, 2889906, 2004738, 300982, 7810009, 4383514, 3908512, 7627354, 4258303, 4020975, 2973638, 4850680, 5071056, 3408696, 4035673, 6546430, 1536447, 7402045, 6712924, 6461534, 502862, 6271512, 1756659, 3345825, 8101232, 1687814, 8338487, 5173630, 3269484, 3811004, 3983182, 617378, 2327643, 595077, 6065462, 1809548, 7677605, 8181000, 1610576, 51366, 1517685, 3145483, 6038010, 5212219, 7927230, 2123861, 5068582, 746843, 6463766, 2256853, 2376721, 4935406, 1557912, 7198673, 273610, 3677251, 1420565, 3650654, 18373, 126333, 6529613, 3396731, 2457939, 5798653, 3564636, 6364099, 4376916, 4404511, 8038987, 2084997, 4457581, 4541810, 5790253, 865588, 7955284, 6296105, 4636694, 3548051, 1355429, 2926399, 1781242, 7201991, 4431465, 6562324, 3253089, 1260596, 516086, 8236798, 5508071, 7113972, 4081228, 8371677, 6896860, 3016738, 5804259, 8165740, 8266006, 1568328, 441054, 1737899, 8222119, 8314822, 7232409, 5151995, 132067, 7033992, 7758810, 322979, 2365942, 4967080, 3408029, 7825260, 4355478, 6616391, 682537, 4431579, 3448715, 5108723, 8374923, 1014252, 1869136, 4918159, 7117093, 1876865, 2051720, 2446688, 7685454, 7112324, 158859, 4841004, 7001893, 1052214, 4047988, 3203773, 872315, 672637, 4195720, 4706803, 5469378, 3617979, 4847454, 1331664, 513084, 3572759, 1410161, 5825245, 5974554, 3317075, 2938641, 4293163, 4872932, 2590906, 4489, 713519, 5770519, 4945482, 7523309, 4752509, 2533379, 453818, 7379923, 3433500, 2140899, 2775583, 7768837, 117301, 3368520], -[3210973, 8123259, 4756226, 3262637, 1745097, 1913357, 5436248, 5333631, 41958, 3876465, 1247662, 6621239, 7970832, 4908562, 3270501, 595571, 8048017, 361522, 2507026, 106505, 7410625, 4008480, 477772, 5965628, 6656837, 5253843, 7757554, 4993275, 512329, 6902934, 3845079, 6077018, 5886221, 1899322, 192807, 6934574, 4021447, 1769919, 7114981, 6293034, 4560681, 1022484, 656381, 2275068, 6836549, 3453938, 2159295, 1173690, 6995374, 8370993, 7949901, 5532149, 8364652, 3518813, 6312063, 5749191, 2912298, 8195881, 50112, 7993007, 5636382, 68847, 1040018, 438672, 2503565, 3200524, 3052134, 6010730, 2219279, 6838040, 8263928, 5741528, 6562398, 4863535, 6569202, 3515046, 1602444, 3380186, 7875054, 7667961, 4521132, 5117901, 33107, 3377949, 7022551, 8054753, 4124468, 7189033, 224565, 3820736, 6551777, 331209, 7893571, 4415059, 2445581, 7457955, 7677389, 141933, 2258764, 102813, 7428722, 1795417, 3125030, 2292152, 4098602, 7096568, 6944779, 2168090, 3534347, 2172353, 678295, 2257640, 3623797, 6725194, 3042782, 6303617, 4288218, 7736421, 8013096, 709281, 6418965, 5752112, 2797657, 4478834, 6508801, 7325781, 6015008, 189098, 6460999, 3985556, 2252526, 7973345, 8208175, 565688, 6595211, 3164383, 3549065, 5321349, 7360519, 4822715, 1540621, 2255817, 6123380, 6674576, 384141, 6849650, 217769, 4077970, 8203489, 7556790, 5598713, 2482341, 8267746, 4795851, 4987987, 5332851, 3997283, 4038341, 8328399, 4148468, 3495644, 1639385, 7963812, 3989756, 4134540, 345021, 7621952, 7683594, 4339317, 1039644, 2814891, 7437541, 7649929, 5474324, 4106472, 22361, 3100418, 3244711, 5993395, 947235, 3540423, 8043057, 1344267, 5415118, 6226125, 4916216, 7651317, 5879302, 4727662, 1127547, 8191143, 6965590, 5689432, 7910728, 6693180, 7053654, 6960748, 3072312, 5369048, 7501361, 6261337, 3210173, 2982046, 6437615, 8286435, 5214786, 5126738, 5821910, 7024938, 7881582, 2683679, 1577222, 3671130, 556351, 4136703, 2549316, 7126433, 3238685, 5316314, 8104473, 5027672, 5323816, 2448182, 3981881, 2288968, 4570162, 1461279, 2250907, 3223291, 313318, 7292104, 6795536, 5402043, 2223376, 7508789, 1334106, 4275342, 3672475, 759818, 7887773, 6747962, 1309688, 3757351, 976944, 6569675, 5281881, 4048318, 4625011, 3762026, 7222069, 7971203, 5818097, 80999, 3155326, 5209731, 5040669]] -NTT(t1): [[5436534, 311483, 2358223, 1202317, 7183104, 878370, 7569206, 7369810, 3782687, 2912922, 4980011, 6733999, 6136647, 8007920, 4194504, 7002838, 4687700, 7823600, 1197438, 5076793, 5535813, 3986020, 6872559, 337892, 7206039, 993697, 7023044, 7534054, 6875265, 4309263, 6249472, 4882014, 6965417, 2534458, 4035958, 6796262, 3886091, 2304257, 2852356, 345898, 324723, 183298, 7959853, 2945518, 3043511, 130617, 3367019, 4835768, 3115514, 1006398, 3276232, 7774422, 4826938, 7593828, 1959519, 6267311, 3730701, 3354940, 5632392, 433286, 5520046, 1987516, 5865866, 6114102, 5776854, 7106180, 8328218, 3992540, 6967198, 3477515, 3774549, 836116, 1875719, 2109767, 2285100, 4852228, 5654177, 4202097, 6138278, 8180496, 2416447, 7838862, 4585998, 3358410, 4390153, 7896142, 5352107, 4554119, 918921, 3044328, 668535, 3717080, 3463463, 7994834, 5731073, 2808792, 7522013, 7376206, 254560, 1262775, 3790771, 5316077, 1091895, 4255387, 6087823, 1186409, 5750314, 4406918, 7813028, 6231454, 7710894, 2813585, 5704936, 7185707, 5203187, 4526248, 6116695, 4810521, 138425, 2303842, 290135, 4532878, 4889743, 777775, 2357718, 2651525, 2061755, 1162775, 5559768, 787392, 37040, 2519618, 3845321, 2743867, 6768359, 6339080, 5647839, 1439488, 1877674, 7381031, 7999578, 2168478, 323734, 1681028, 7993694, 2752880, 3640679, 306391, 2727085, 90416, 5079254, 330990, 6239548, 3575697, 482195, 7261279, 3212644, 4570554, 6068130, 5443448, 4624458, 1922495, 1232792, 4829358, 4722517, 7277310, 1898081, 246702, 1856541, 8196157, 1043409, 7812574, 1277435, 7132187, 8233461, 8179603, 2747462, 4478876, 4635182, 6600672, 2562886, 988959, 1514637, 5304575, 1063657, 2270096, 7781256, 300383, 968047, 879324, 3781339, 3986650, 7914775, 4093746, 398632, 5779994, 3380737, 1072920, 2175282, 3928748, 5164705, 1888599, 620714, 7180474, 6531097, 4648200, 3538600, 6579809, 2304931, 2957035, 3353512, 1223866, 3427099, 5917536, 7277850, 7072814, 745668, 1630204, 3298913, 4474933, 3475395, 5070284, 3863742, 7701173, 7197477, 2394362, 4713233, 2135762, 1049038, 6890651, 4805383, 3452718, 2452451, 6645029, 6848906, 6401786, 5207989, 5374682, 5507162, 5731392, 6658422, 3608503, 8363659, 3726461, 6951637, 7818421, 6015610, 1537100, 6816698, 2317720, 7013243, 1377602, 241563, 6689258, 738103, 2329080], -[3763656, 1959721, 2047761, 7444383, 545239, 5638797, 7894902, 3442018, 1074138, 4235419, 2951792, 7501614, 3471012, 6896109, 3721834, 4434209, 1391206, 854334, 840506, 294779, 2292542, 957810, 4607243, 7963872, 1518841, 5306972, 3466182, 1393327, 1413403, 6211406, 1782092, 1065567, 6414702, 6676033, 2406618, 4164506, 4668003, 1509968, 77342, 5217496, 5269288, 2504699, 5838701, 4820315, 2845047, 499516, 4881325, 212996, 3181187, 7721882, 7413135, 6094541, 970432, 4176621, 2799029, 553839, 7286015, 2810624, 2478720, 4693742, 292922, 7399991, 4161213, 3147550, 2379444, 6931224, 8036603, 4524558, 1625514, 3761924, 5523616, 2376145, 7822531, 4352947, 5118488, 3667879, 5808897, 5621755, 4193180, 4204896, 973840, 4799514, 3570973, 5039070, 4554259, 1543094, 7667065, 6705911, 6060130, 1428014, 4168460, 3012823, 6867896, 1592847, 544311, 2726429, 713413, 1211306, 605359, 2415130, 900474, 6724261, 2028811, 4283407, 6934488, 1598694, 3332512, 1437753, 6899997, 7646411, 4657556, 2581660, 4611058, 7583554, 1705728, 7088525, 1910759, 3980654, 5979407, 6710736, 6431978, 6944430, 3700637, 6768210, 5289024, 2637537, 7228860, 2490127, 8376392, 3243479, 8151713, 3802275, 2163874, 2985546, 6178478, 2784566, 7865377, 5222501, 1426617, 2456955, 3604027, 1717673, 7941262, 7024899, 4904682, 3252621, 3457484, 7236606, 6926573, 8111898, 7305827, 1346502, 7562404, 5476454, 5184053, 7152608, 6612823, 7652, 423984, 2356853, 238593, 3059563, 7922653, 8076648, 3616662, 3967209, 6265241, 5018600, 2552423, 5604838, 7711683, 7628338, 4720539, 4203467, 6136742, 7811940, 7652527, 6570958, 4849171, 7855713, 2818239, 3812062, 319891, 5558055, 5522790, 4319274, 7721840, 3624586, 4778172, 3119040, 4235515, 7279267, 296648, 1169111, 5903054, 5346312, 6342094, 3662237, 7007149, 4262747, 2389586, 5247649, 4279994, 1859511, 4223815, 3030688, 3834571, 6274124, 1257165, 3782570, 5450378, 5031428, 1103887, 6862047, 6218533, 5951578, 5809627, 1465301, 6053567, 5964267, 2124442, 7949688, 6902125, 7868168, 3544692, 2356109, 1819071, 3385628, 7879361, 7319958, 1362317, 5545158, 712446, 1834410, 2931786, 6195971, 2620416, 6965795, 6679694, 7872655, 2130813, 4672889, 3169050, 1541474, 2768776, 212532, 650823, 4347084, 405884, 1170644, 6016800, 5711613, 4911218, 8016391, 7260638, 1915251], -[4795173, 1191984, 4600702, 2008942, 4768908, 709219, 6925263, 1124933, 1206531, 5896368, 4542004, 4450041, 6083689, 1515801, 7670763, 6133828, 3670136, 6276840, 101311, 7817819, 2832949, 1985439, 6444928, 6709977, 3950556, 7087551, 6568058, 2613209, 8367843, 7195703, 1456796, 2541848, 8000698, 7636733, 4165868, 1953052, 8111316, 6783825, 1953274, 5863177, 8121187, 3292491, 4505093, 6320556, 3040204, 515726, 7338721, 3989970, 6916380, 7074335, 6629886, 7069006, 840174, 6444033, 6811181, 2774344, 1973095, 7515444, 3571853, 5978110, 277290, 4152173, 2430548, 95951, 679963, 7627651, 4281529, 2453691, 5348544, 214282, 1046033, 2466655, 7969868, 5472899, 3951651, 6249461, 66792, 8000229, 3346454, 3254353, 6718119, 4944219, 5674232, 7056210, 2685072, 1815607, 6084629, 6607531, 7227987, 2541585, 1252916, 55484, 1853343, 1081901, 483859, 6344734, 3985489, 3996040, 5618026, 7906609, 1908465, 8186898, 3423819, 2626339, 5435361, 1971543, 7202405, 6661046, 3842935, 827134, 6245313, 6826826, 5711565, 7037999, 6719560, 2605810, 1541639, 6525648, 2668926, 2817660, 6003060, 3016035, 4712826, 6436272, 382271, 7619137, 3893121, 862814, 7965110, 4568583, 4188320, 2522349, 4605791, 7007316, 766285, 6857459, 2935916, 3264133, 451351, 1864749, 4718332, 6959716, 7388075, 3079612, 3490407, 2380363, 5356258, 6180824, 7258207, 4022993, 7439003, 3292832, 7504605, 879373, 4405118, 3754121, 7178023, 7292943, 6572800, 4819020, 6539669, 3910479, 8230912, 4633390, 1363454, 6384514, 1841567, 719228, 266407, 2574309, 1794715, 8046434, 6311913, 1822679, 6532550, 233493, 2097699, 6293801, 4550518, 1938774, 5045209, 5336987, 4679964, 4018177, 5409185, 2273967, 5734507, 5731099, 1831315, 6032467, 1401651, 7555345, 1747087, 1496697, 2067212, 2841582, 1949677, 382009, 4256127, 4428097, 7123397, 7044411, 7396483, 4872867, 5997136, 2546212, 1062291, 2020220, 4374269, 3471004, 310629, 7401354, 6072701, 7695709, 5859564, 6931717, 6175070, 222354, 2337637, 3665626, 7871383, 7631303, 4222961, 6484805, 4875697, 1580148, 1602327, 2380491, 5164551, 2088167, 3613083, 2308479, 4186722, 2873243, 4171200, 2705067, 5928151, 445213, 69110, 3204218, 623202, 3753664, 6377328, 4658403, 3844813, 268119, 181215, 3332254, 6193544, 6713925, 4701253, 3606354, 6617926, 4510872, 946107, 4421360], -[3242704, 3240698, 3667167, 7522279, 6853824, 2381178, 703273, 198737, 2468163, 5161041, 6060504, 5781074, 254902, 5675382, 5133585, 8276894, 5890375, 4732925, 534433, 8056301, 8177611, 5595494, 3869224, 5804348, 3082845, 1634309, 7462246, 6523643, 1425592, 5276454, 6213007, 656613, 6086090, 3403372, 7892730, 7640658, 2380370, 456948, 3078661, 503476, 6614239, 846539, 6571047, 7660964, 7415698, 2259640, 3475308, 4596255, 1215062, 5640912, 7082945, 1173157, 7299108, 6407149, 4580255, 1529461, 671427, 6534465, 1205348, 5145167, 5547056, 6194310, 4890917, 2561960, 22905, 2004339, 2376232, 377289, 2687690, 3746291, 2247828, 6244003, 8316591, 661664, 1265216, 4723336, 8194941, 97299, 3939526, 1839146, 2109363, 3548490, 4249948, 4206182, 503686, 1426189, 1278179, 5778854, 3550339, 2955355, 7700607, 5577729, 6941331, 4456450, 392930, 5452465, 1804952, 5524437, 382213, 3621808, 6256000, 3350315, 1796521, 4277486, 7740897, 474177, 4503803, 6261671, 7447398, 1783313, 6489377, 5070415, 301191, 5037822, 1155644, 8194063, 2474806, 4561366, 5765547, 4849887, 4167992, 4495043, 8139978, 4730328, 1745898, 3456912, 6936702, 7847376, 7336497, 739094, 5509020, 7715190, 1873292, 2111471, 7882093, 4785460, 874374, 1692506, 807409, 401555, 3380125, 4735219, 3569473, 6871629, 6430863, 5917805, 4705609, 3414558, 6967536, 7019548, 767330, 7156019, 4526635, 7119154, 7940839, 8147137, 7261296, 2048997, 5537844, 5755876, 1733494, 4648173, 742957, 2642831, 4340279, 5753120, 7120210, 1002850, 2805705, 1797649, 6015590, 8125865, 4247679, 8084784, 8093240, 4305410, 1150742, 3815595, 3829021, 3254812, 4843178, 4605676, 3447269, 5224583, 8263219, 1151558, 5547813, 5383175, 2816694, 4964804, 8292873, 606367, 5643568, 2324205, 4629543, 1301438, 1048257, 2026759, 5803387, 4906193, 2374793, 844073, 1669237, 3375656, 8058354, 1464452, 8245924, 5787799, 5501887, 496010, 4881331, 5952039, 7881861, 7877269, 4231698, 5049459, 2739210, 7006015, 2495626, 8370910, 6851542, 6033338, 271991, 5025178, 2793282, 5026759, 115624, 4218270, 6281639, 2816981, 7020918, 8123280, 1931776, 1623881, 7289431, 7569885, 455713, 6735619, 5862612, 6141838, 2118531, 2115932, 383099, 7426898, 5219187, 4720284, 8274242, 1764856, 252747, 3960609, 2327009, 5155710, 500520, 2600826, 654075, 146760]] -NTT(t1) * 2^d: [[2550590, 4021968, 1701631, 2390889, 5080211, 5209254, 230169, 959452, 5370255, 3609825, 380156, 5015114, 5671058, 7356781, 1667068, 3294531, 2567706, 5882401, 4324206, 5459102, 2943709, 3371208, 361922, 2473654, 214140, 2980917, 1213743, 5579580, 5768640, 3166092, 8087588, 2108764, 6817128, 3987027, 1822871, 3868173, 6033706, 3774260, 1897756, 1015470, 3538627, 1482573, 7471516, 2462913, 701537, 5701505, 2667301, 380297, 3920923, 6462505, 4797310, 5276241, 3468690, 803585, 3881093, 3377170, 6902210, 4281137, 6359679, 4562521, 7867117, 6961258, 8243611, 5351592, 8153586, 3450078, 8167476, 6500546, 4646246, 2765497, 5747095, 2661583, 4585687, 2791410, 6068039, 1133945, 453225, 5206005, 2271376, 4808900, 988870, 5202450, 7466622, 7566126, 3764029, 5136858, 6499217, 6106781, 2186366, 7394401, 4226419, 4264399, 4977351, 721273, 1853982, 5379399, 7504712, 3072982, 7012104, 3218222, 4551047, 4656052, 2898901, 5976001, 7964866, 6159225, 248331, 7016237, 3080747, 2951221, 4440719, 2741570, 5630520, 1262736, 1707042, 4058808, 1452197, 3067298, 2621305, 374580, 5127909, 8089266, 6761813, 2415880, 5945088, 7632353, 3356705, 5299088, 6433478, 5774591, 1736668, 8124002, 7262546, 1480070, 1558056, 4679628, 7195248, 1038977, 3840213, 697297, 6062453, 6068153, 3817156, 1956245, 8143227, 8271230, 6918682, 4210389, 6469015, 3211176, 478363, 4595389, 2213933, 2552409, 2965033, 197702, 3470268, 6655629, 5867733, 527159, 4075096, 2275497, 629579, 6532496, 2854392, 5817399, 3406017, 1302287, 6707434, 7397557, 7961605, 7741996, 5987104, 6988997, 2916496, 5873861, 5789059, 1486566, 8121934, 2254540, 2217527, 6069306, 4889144, 2616255, 6224881, 481109, 2597450, 5275355, 2366542, 4644005, 2707856, 151751, 6930888, 5918815, 5611131, 354798, 6099736, 6683624, 3143602, 3502336, 4918344, 1153226, 6356386, 296085, 2164496, 5819969, 348797, 7333601, 915251, 4625590, 963378, 2931540, 398058, 4122984, 1860662, 6669567, 7568680, 4626887, 6230888, 2707178, 2159291, 2419876, 7319872, 230040, 5497989, 4437724, 2223617, 6232025, 3791871, 6104497, 2878887, 758481, 2619043, 5269153, 7726554, 7161743, 7523358, 7064443, 2886393, 4467230, 6039188, 3125817, 5185553, 5689798, 2876789, 5358118, 3025160, 4536866, 3671545, 5117735, 4728121, 5274302, 1105684, 7235190, 4259119, 5994268], -[315809, 5535877, 6043695, 91027, 8216044, 166520, 3359195, 5288668, 8281063, 1626068, 3577019, 8004444, 8155840, 533931, 1307082, 4312850, 7772849, 1055933, 5102795, 1269472, 8369984, 2309208, 5516905, 6873496, 5806644, 5491645, 2110148, 6830, 5241499, 6326345, 211250, 5110767, 4024194, 7841411, 4273872, 7335962, 437805, 162364, 5054389, 1600532, 6859746, 3233392, 3598773, 7875993, 685347, 2391576, 4844893, 1736496, 5567451, 2269828, 3900338, 4335803, 5143628, 6017038, 824656, 3243491, 1705006, 3626309, 8304266, 1781268, 2817762, 5170111, 5500957, 6566908, 7935723, 3261833, 7676241, 6975162, 8108492, 2888099, 3590889, 6051566, 5505570, 667489, 3427445, 3469823, 2476498, 3025545, 7581694, 2994162, 7920713, 5082541, 5755486, 6507715, 7253661, 3357212, 5751482, 1189477, 7375069, 7608973, 6205462, 717951, 4064711, 293355, 613868, 1095063, 3128647, 605024, 6274481, 6960840, 1916048, 665171, 1652801, 864165, 4859270, 6289894, 4920135, 3586691, 7243176, 4162254, 7040568, 5166629, 3247717, 443147, 3168637, 1287407, 6699189, 1315021, 8145196, 7194209, 3082097, 2499964, 3650015, 337448, 928718, 1988078, 2794598, 1185406, 548868, 4658078, 3670240, 6607228, 1873853, 3536026, 4753513, 8050015, 4522488, 699407, 4545166, 5994143, 8360510, 457073, 6021550, 8029486, 3435846, 4125589, 6279885, 7586911, 7062926, 4342023, 4776987, 1915612, 3171104, 2738967, 4189237, 6669489, 1230528, 4022265, 3784290, 7239425, 1916695, 6493266, 4424128, 508201, 2921009, 119002, 3180564, 6425815, 308801, 6908570, 2523790, 6955744, 3411450, 8048628, 6449298, 2548268, 3982024, 1869545, 1232252, 778753, 7345470, 2978162, 5856968, 780999, 5204714, 1372034, 1925764, 791081, 6237634, 7664664, 2412500, 5088309, 8199903, 6921098, 2812278, 928662, 4229065, 7533061, 5088575, 7606202, 7214817, 5581815, 6426537, 5896423, 7131104, 4600942, 3002716, 526347, 7543604, 4411791, 7015217, 2567370, 572361, 6432205, 6047810, 6441287, 76241, 2988648, 3893475, 1444154, 5683172, 8004006, 7914918, 2245109, 8352376, 1144577, 1448206, 4264723, 1753578, 3212301, 5765837, 4074196, 3587400, 1399039, 7296207, 5589080, 4199935, 1533287, 4310655, 5480945, 7591902, 6942249, 6706151, 6847006, 4404590, 6315825, 1596804, 2920295, 6356596, 2718600, 4393223, 1665585, 6696256, 1327460, 3327047, 1595568], -[3042737, 1547123, 2215535, 6494293, 5770699, 2293067, 4711823, 5372853, 3390309, 6703485, 7425705, 8302339, 7620806, 6044215, 2523830, 7719061, 5198333, 6014985, 278429, 426534, 2143535, 6707308, 223076, 976481, 6164715, 1688816, 3253996, 3823110, 5939213, 7726215, 359024, 5862988, 6857076, 303831, 1732632, 1185931, 7954696, 2549273, 3004555, 2976157, 5013758, 3904366, 6745805, 3778526, 7132261, 1097224, 6071291, 2207940, 7366040, 2368765, 6923952, 615682, 2383051, 1271653, 378366, 8115561, 6150264, 3973966, 4584029, 5900589, 466673, 6869030, 7558841, 6651811, 5660008, 1327840, 2240423, 4396706, 2452372, 3890991, 4316162, 1652373, 5710226, 7138075, 6754538, 7997476, 2432959, 3015028, 1807161, 1553299, 632409, 486687, 5515862, 4736271, 5895616, 6592786, 6940869, 8160966, 4023399, 3708492, 6257464, 1982410, 5650669, 4832223, 8216104, 714694, 7401673, 1650878, 5999245, 7078352, 4667575, 6971582, 7049966, 2438649, 1321791, 1816697, 3966080, 2393745, 4477268, 4504792, 7538728, 2835951, 1272369, 6399265, 4056664, 1873421, 8198686, 7808790, 7714256, 2602302, 780564, 1889404, 7269890, 4736877, 5668491, 7004905, 4960547, 3480757, 254358, 7270031, 1290242, 5355103, 2002538, 6456639, 474387, 2368977, 7607499, 6247306, 1703495, 6904034, 2092540, 2016621, 8119243, 3126334, 7811757, 7083754, 6982541, 7211111, 173129, 4559012, 6300569, 6697838, 7365465, 5045413, 651054, 6009259, 5358744, 8176680, 198375, 5647770, 5342984, 4690194, 7176339, 1822287, 6699724, 8136608, 1366264, 482625, 3497724, 3610156, 3053862, 4407623, 18406, 5863691, 5687055, 2039580, 4495358, 2492408, 1748640, 1546393, 6515901, 8342432, 6237730, 7008425, 4778841, 7051090, 4844059, 2066974, 1186050, 7031032, 1153702, 4006695, 6764885, 391753, 6158364, 5821735, 7059599, 3522187, 3657664, 4525848, 2024653, 263450, 1573826, 2600293, 2533658, 8091208, 3415026, 6699082, 7728973, 8090304, 5406417, 7955390, 1411280, 5751454, 6900129, 7300489, 1976428, 2973479, 669459, 1774081, 3441138, 6103773, 135136, 59197, 642402, 5208568, 2529762, 8132330, 3656776, 1832967, 7123509, 4839216, 4960260, 5395720, 3510291, 2086316, 7276894, 1703501, 4661181, 1487812, 1596831, 2265515, 7931815, 5598775, 3101010, 761594, 1179471, 2806599, 2467930, 8177246, 4648461, 2282043, 1132219, 3804871, 7003236, 7999263], -[6689695, 7017377, 6017536, 1303367, 6112725, 5379817, 3865937, 2252606, 5625492, 44107, 2058460, 821741, 1433351, 6556245, 1395814, 6742118, 7891331, 4312558, 3497462, 1433917, 6316231, 5786275, 1945914, 7113175, 4469819, 4733379, 3957634, 8144664, 4528783, 6900699, 2680903, 7126399, 2148547, 7156482, 2327005, 7316180, 7141098, 5652034, 3716159, 1310228, 4449983, 4242629, 2598633, 6054592, 8135600, 7010144, 1446587, 7687796, 6232925, 731766, 5858549, 6544262, 17441, 812937, 2322051, 621097, 2776432, 4613901, 2079590, 4090971, 2861778, 362585, 7998804, 3012152, 3268586, 2308185, 6764270, 6758032, 2201021, 528818, 2430827, 5187625, 5103679, 6602106, 6454060, 1183223, 5816502, 933793, 7991542, 6674683, 7862259, 5943924, 3321798, 5148657, 3030548, 1038990, 3701535, 7776752, 4330098, 7623864, 3973785, 2722484, 2254207, 2141948, 802432, 7351087, 3111196, 1936104, 5193355, 3174956, 2902045, 8295222, 1087780, 2641835, 7193202, 4324913, 4558542, 7456792, 8029073, 1833265, 3991353, 3493028, 3514074, 4664516, 5544855, 7004343, 1382029, 6811286, 7711229, 7097724, 2371606, 8220375, 8102124, 8179185, 5405014, 1594061, 6235524, 7905802, 4613117, 3996974, 1346295, 6111883, 1464537, 8370161, 7373288, 7278011, 5995690, 3799434, 2145515, 4415096, 1086232, 6344172, 1847903, 1123779, 2328434, 6326632, 6811145, 6607607, 7415142, 6096179, 654610, 1090733, 7229112, 787665, 2556334, 8085733, 336966, 7788590, 2820827, 3910150, 4356450, 5598785, 2121002, 3454441, 5836654, 6474249, 1058000, 2538540, 5231946, 1947939, 2861320, 1433849, 1494984, 114977, 2343193, 5123984, 7289756, 6779247, 7819618, 5313427, 2420098, 1060458, 6402775, 994317, 3661939, 5594011, 682705, 1215346, 3069247, 1510667, 3555414, 6151600, 5728884, 7960353, 3829331, 1489672, 5774336, 1603651, 7621080, 7433541, 3356399, 801991, 5929377, 6378269, 1491259, 4414057, 4448388, 5630439, 1575678, 7192092, 4894045, 1837382, 5472744, 1376748, 4665304, 7810233, 5232011, 4179264, 4331129, 5922826, 4179415, 5785847, 7339767, 1649872, 4027734, 6221007, 204687, 3608549, 3426308, 5420351, 558385, 5398780, 2881696, 3111373, 4547627, 5792537, 3915331, 1525320, 6728094, 6293645, 7542762, 3012588, 4071050, 7701413, 7072787, 1322490, 1777768, 1481027, 540425, 4714721, 5789470, 6655057, 2235927, 2946578, 3095937, 3858289]] -NTT(c): [6740534, 4045296, 2602173, 4057786, 3828614, 2205945, 8167143, 6593076, 3152783, 8270939, 5589630, 286975, 2981496, 6078868, 5695322, 4821040, 3400817, 1314165, 6916919, 7557989, 1846599, 4105184, 5776369, 4840805, 7760990, 7747766, 912494, 7667549, 6289738, 5097966, 2067219, 4308073, 5212698, 7306521, 4512398, 3281175, 5818272, 4994761, 5980882, 4218491, 8361027, 6294504, 7452914, 3906401, 375630, 1922874, 1461297, 1400371, 2857978, 3557489, 2019286, 6586919, 7656425, 3132691, 2829832, 6721617, 8046840, 2715316, 7328591, 2873021, 4584642, 7110958, 6529875, 1915054, 8366937, 6813065, 1697637, 7686310, 6760467, 7867530, 7591153, 2456768, 4196834, 3444292, 5335229, 2646134, 3005076, 4166756, 185197, 4267237, 3739858, 5271252, 7881540, 1372338, 4921204, 7485778, 8327496, 8118769, 5377216, 6659216, 5442299, 7921455, 4181906, 4037289, 7903765, 2577029, 1264520, 7646150, 7788316, 431555, 4032549, 3004849, 5584448, 7262803, 8107325, 7148810, 5927230, 3947731, 3637913, 6505681, 5789489, 6233059, 8133424, 7547652, 3807226, 6771971, 5052513, 1126737, 6428787, 6270833, 8347135, 5080926, 5443004, 1554467, 2620784, 4162411, 2677195, 8174155, 8167614, 8083736, 4103884, 6138475, 3868441, 3058591, 3287132, 3554264, 6051153, 4447803, 85723, 7811203, 1880235, 7257594, 1416016, 3643956, 6510808, 5622948, 2312829, 5667263, 6435933, 1460290, 715812, 1110571, 4478725, 2606905, 3308123, 855461, 7736072, 2691346, 1349031, 82963, 1226437, 3636801, 7629644, 4107021, 4662108, 3328979, 1921218, 7597867, 1231090, 2616761, 382219, 6863112, 2658847, 4571491, 1523666, 1145137, 4111354, 4594549, 4892337, 7318873, 4212052, 5245483, 6606989, 5636142, 5258319, 261093, 2462993, 1319192, 8218231, 81833, 1131088, 778267, 6573469, 7790901, 139901, 216918, 3161787, 496529, 317439, 6467255, 1573077, 2978028, 1854261, 4876274, 3929997, 5622067, 6534990, 7610339, 7840598, 7028975, 5470236, 1412610, 3491051, 2609731, 1019356, 3714433, 1692545, 4407518, 7468941, 8128921, 6829928, 6323993, 3439418, 4947990, 747233, 4254147, 4768115, 4953593, 6361340, 1205148, 5524342, 880353, 4969290, 4239383, 4135673, 2451652, 2297363, 4151280, 164558, 3840049, 8091764, 4638140, 3444910, 7491500, 2326591, 4783310, 2552869, 3417953, 5697174, 3354837, 8255872, 2914938, 4159237, 670649, 2634557, 4445631] -NTT(c) * (NTT(t1) * 2^d): [[5324147, 7803716, 2455124, 465449, 6859752, 7840043, 3419480, 72744, 7270387, 7283536, 1228177, 1426655, 7968572, 3683039, 4561167, 4989237, 4266806, 5272268, 5064962, 6263924, 1554062, 128055, 7815981, 495182, 1142496, 7018628, 2435573, 1100683, 923978, 4889791, 988610, 2007092, 4819155, 3263112, 6082486, 2616358, 8254692, 4881619, 2285166, 341216, 4876866, 6426357, 5497339, 4830097, 4511162, 5825553, 3763531, 6531088, 3560476, 7559667, 7399935, 4543706, 5469408, 6795439, 2992864, 7755990, 500576, 4145669, 6647214, 6156225, 8159170, 781240, 1231699, 8108328, 7210092, 2557045, 1147295, 693297, 951676, 6497828, 936923, 4536158, 7647802, 6108887, 5494065, 4013865, 6960094, 4653219, 5370174, 7922250, 5640862, 2049126, 1764666, 4222507, 419970, 2809364, 4011657, 30966, 2064019, 5098129, 7052393, 7394427, 3569758, 2151822, 2363969, 6565422, 8294112, 4481388, 2682138, 3568302, 2938418, 4133413, 297319, 3131123, 4427095, 7713817, 3652501, 7896960, 5929397, 7811578, 247489, 1725019, 6033539, 3999703, 5878239, 4872300, 4768387, 4458328, 8080500, 6685461, 124867, 2903431, 4552757, 6791588, 4026762, 2494463, 6422116, 7017752, 3404371, 5595256, 282947, 4473398, 2869144, 3506727, 3113765, 2953058, 3462897, 1953723, 3418822, 2095396, 2623480, 1634255, 2896338, 4200850, 2793155, 4906561, 923655, 4840381, 808319, 2629524, 2517553, 7792876, 5006863, 4294485, 2393749, 1155145, 4649063, 3876239, 5698122, 5676211, 2465828, 2064269, 1365067, 6129365, 1733194, 3535750, 3401762, 4297852, 3781701, 6739172, 4821706, 3735209, 7048414, 6582452, 7778001, 1467247, 531700, 1810815, 2219695, 2837934, 3930973, 8260162, 2170908, 6325034, 1327682, 121724, 8155888, 7271356, 3117788, 6091466, 7285087, 5959153, 7998312, 756912, 797224, 4703253, 2835707, 1530764, 3721003, 1124667, 7143833, 2529643, 4203189, 4966113, 4314832, 6933633, 3667617, 899584, 5985083, 4612864, 5493013, 6702186, 32018, 1978077, 4237398, 7371799, 923149, 5019909, 3165208, 5780043, 2887367, 531176, 2740610, 7382660, 5651446, 5637605, 2145656, 6834593, 1274789, 6243770, 3244770, 4538484, 4968887, 6421601, 4261510, 4958558, 3338733, 7785155, 2164985, 3711950, 5947657, 6297886, 7845111, 7859908, 7555079, 3414075, 6364779, 6355178, 2066417, 5296287, 2931394, 2837594, 6072273, 3114893, 7856886, 2253998], -[3199419, 1831771, 7504950, 1206947, 6645593, 3523456, 4514483, 4681694, 1624444, 6525827, 4323945, 3017200, 3130274, 2468093, 3873057, 4396976, 6130379, 7222417, 1778879, 8173095, 1011316, 5534297, 3638733, 6505411, 7479659, 8296463, 4398775, 133837, 44298, 1616875, 4864297, 6193737, 3548550, 985186, 1985057, 6191270, 7304142, 4802331, 6455787, 4414073, 3503684, 1955538, 5435196, 5031186, 7244204, 4143593, 1042119, 1419543, 6128688, 4384878, 7163319, 1968742, 1716395, 1938680, 1878721, 266953, 2974077, 3894494, 5956457, 1403740, 444870, 5339856, 7604542, 2846569, 2476965, 7773383, 6111687, 597655, 5044979, 3794605, 5429117, 6539421, 5579251, 2085927, 8359650, 6607831, 2995338, 4586835, 1637036, 6731777, 6485101, 7684449, 2122484, 462029, 7338830, 6764247, 2566518, 7648450, 7384273, 153930, 5342182, 5769578, 4866390, 4862487, 849619, 4248081, 1066663, 5128179, 4566106, 8071716, 5721943, 579262, 7845890, 6635272, 2888693, 4006385, 1689843, 6858265, 1783608, 4560011, 7014711, 5678859, 1769842, 2731557, 6334458, 977425, 6247321, 8330043, 1877804, 4520855, 6332143, 1083100, 2303593, 4719352, 2863517, 5251910, 7852941, 2834020, 5495142, 1045850, 6792639, 2002416, 5056930, 2324603, 3111544, 3519665, 6734747, 5382004, 2917854, 2581276, 5484594, 4660001, 6150652, 7467828, 1591290, 6032000, 6692374, 8372292, 5355663, 6025304, 4972019, 3996500, 562075, 2537714, 48425, 7651242, 3449044, 3723944, 757849, 5071136, 7077632, 140701, 3764087, 7423286, 7508227, 4466951, 892653, 5225511, 966719, 217293, 4210808, 1944451, 4399451, 1245431, 807280, 4490814, 5333065, 6576047, 4997302, 5660333, 7690480, 4714631, 4054755, 7236608, 1393028, 7548497, 3218409, 7919210, 1891065, 6899581, 2220630, 5872574, 5201215, 192469, 5067579, 3420287, 3253554, 2008161, 3543509, 1915165, 6405898, 1209227, 1633926, 352594, 5044061, 1824505, 6149008, 7383973, 6319713, 1543696, 7770674, 35614, 6996518, 5938758, 2013484, 7198619, 8042796, 4426307, 4265805, 8318396, 2728963, 3398059, 7887017, 6181139, 6262364, 545062, 556200, 3229042, 8229573, 6394483, 7342731, 4379775, 7903600, 6390361, 4092520, 2920557, 7299706, 957103, 748942, 6907068, 3474992, 1905298, 607935, 280837, 4980086, 398284, 3852285, 2431621, 2260924, 1764598, 3467395, 8126035, 5467212, 8023630, 7312454, 4288770], -[1123697, 8024472, 6427826, 3687539, 7960317, 1884200, 3224802, 7766844, 5152293, 5746694, 3481117, 2801008, 5394943, 7829698, 328196, 6482414, 5772391, 5274781, 731149, 2370651, 2649608, 1867804, 4753541, 5039606, 4750664, 4992948, 3039588, 5872256, 7799929, 4717856, 3124319, 5724140, 5077243, 259902, 7880977, 1644983, 5756910, 4898961, 3776503, 4442213, 4449997, 5248612, 6294366, 902409, 5971202, 3239524, 5726126, 5434841, 4024772, 2540488, 4157990, 4449535, 109866, 6024354, 4997341, 8151992, 6510608, 7196975, 4990660, 5211745, 8175966, 6020402, 2402886, 8206114, 6788945, 78100, 6246669, 3101927, 8277033, 6760027, 6323647, 6354830, 3900025, 2025834, 7139154, 4921461, 61578, 4014476, 462405, 5268721, 6952599, 3048416, 6756644, 5430985, 5801810, 7532014, 4329178, 4678381, 2079992, 1794996, 712273, 2634853, 3085202, 6334135, 5123211, 6159202, 3760931, 180539, 6487960, 2679192, 1066266, 6065384, 254059, 2572837, 7534086, 5651500, 2533785, 2568391, 1153828, 2453502, 3485652, 3934349, 7781500, 6491741, 5806833, 8124839, 2148602, 3657436, 3801135, 1862656, 561652, 3387098, 7509818, 8049598, 724797, 4332466, 5370769, 2424056, 967929, 4617013, 4626818, 5346676, 1856381, 8307242, 3355643, 5480105, 6990327, 5330158, 8316077, 6417036, 3632489, 4808564, 1239426, 1993342, 7012069, 3112897, 7781975, 8211187, 3160871, 944927, 923474, 37966, 6512523, 7123188, 7923059, 4838927, 2748826, 3924308, 2168564, 6828040, 846534, 2597602, 2050921, 6053509, 288318, 8345439, 1918063, 2059189, 3937054, 6557296, 2839184, 6817074, 5483019, 7687073, 5534804, 1445811, 4051272, 2831006, 5368072, 251585, 1271374, 3122837, 2162394, 3117708, 6814613, 5376061, 2181533, 7666135, 3386518, 4532104, 6995872, 755618, 6521475, 2870138, 4131862, 2455417, 978508, 667278, 3568397, 8335109, 7868933, 3597894, 5082344, 2618942, 456723, 7750920, 1343319, 1428464, 2790482, 1464018, 2637250, 824661, 3300980, 1931024, 3908824, 8298311, 7416621, 5752591, 7491537, 7506321, 4529487, 262755, 2883611, 2209463, 2068323, 7014322, 2157603, 7463540, 2669588, 2397086, 4850814, 8200047, 1870814, 7830920, 2580909, 321418, 558489, 3691251, 196239, 5497208, 1256774, 6647484, 5661482, 6825864, 5537857, 6447908, 1406701, 3164040, 7149321, 7248151, 1772366, 7582082, 1334178, 4900200, 6174665, 8377141], -[724829, 3485727, 3008317, 3761766, 3053529, 4855029, 3478807, 3537413, 1363367, 6754463, 2162978, 2569512, 3667282, 8314185, 5278827, 3359864, 2900396, 4940314, 3790265, 7170181, 8304032, 1431456, 7581263, 2214607, 3975164, 5829298, 2844305, 8267503, 5515028, 4885209, 1954572, 1210068, 3284334, 2678897, 3521585, 4317085, 119206, 1353496, 3416530, 6699853, 7983479, 7268808, 1547469, 7223891, 6086448, 7823534, 98425, 6340355, 5683361, 7041196, 4404636, 5177538, 2143947, 5783839, 4679485, 4381963, 7927491, 3758987, 5809830, 2935478, 5986199, 7612210, 6665324, 8345934, 3693306, 3838610, 255323, 7011654, 5008704, 8318639, 6524567, 3769906, 3632828, 6543646, 3308873, 916597, 3207669, 2439497, 2820323, 6426724, 3014, 5952446, 177985, 469026, 3999086, 1357362, 3313640, 2020721, 6588546, 5445442, 5260681, 3473092, 2107752, 2981259, 1414216, 6610772, 7946521, 3142444, 2199287, 3478748, 6473063, 6867961, 5017986, 3214082, 5726301, 8300426, 6558118, 4207238, 5534934, 4922830, 626161, 1670405, 8109208, 3319015, 2667137, 5547968, 5196971, 1858109, 3191160, 4164999, 3356831, 7063452, 2080161, 7322015, 5638378, 544240, 6815350, 3388153, 5290846, 2762206, 5570437, 5803651, 3009388, 7371952, 445984, 5248332, 1037490, 6302168, 3350863, 1756250, 5138701, 5734112, 712453, 2647261, 5111263, 5693658, 247208, 8107675, 8178027, 7469490, 3437599, 5824112, 8289805, 6433902, 5267216, 654453, 5866783, 4347546, 3317277, 212797, 1751551, 2353561, 5521292, 2378451, 6253053, 8227426, 3641901, 1470765, 644531, 2730333, 6450580, 3517923, 1375344, 4946884, 1494364, 5757837, 7878779, 2856533, 5122282, 3110562, 8120644, 3682043, 1182276, 1250859, 1181726, 1278429, 486683, 383328, 7875858, 2881444, 545893, 5892606, 5667797, 1507091, 699089, 4552210, 4380163, 2286541, 2756228, 7862775, 1849298, 8232501, 8246417, 4340525, 8277698, 8234168, 4617763, 8084469, 6261967, 4624523, 3821440, 5237950, 4019846, 5754378, 3910902, 5479402, 3402852, 7979918, 997701, 1791552, 3700481, 1067541, 3856915, 1588406, 4983229, 6314207, 4552019, 4453063, 4273282, 8006290, 3916225, 4374045, 4230009, 3128628, 7138648, 6261681, 354377, 5215242, 8041748, 6101487, 8217848, 1555548, 7657676, 3805494, 5833346, 5673620, 2370459, 7114719, 5476903, 5213847, 1537530, 5465696, 1562799, 499688, 5660902, 2875196]] -wPrimeApprox: [[7922246, 5265226, 5506507, 4646550, 2602037, 8056124, 4540058, 3683346, 947069, 5492323, 5072451, 2036902, 3275644, 360403, 1342966, 5373180, 7674721, 1297549, 2199143, 6894242, 343750, 2205389, 2116220, 6594064, 1118119, 1295454, 8091477, 4263775, 2523493, 1196616, 3661568, 952793, 6553128, 409094, 5843568, 7588096, 7206890, 1387541, 3910260, 1615866, 3204319, 6008770, 3207733, 2822546, 7390952, 217966, 3013480, 8147607, 377067, 6505514, 4938257, 6747540, 8350324, 241057, 5708389, 1401833, 3154492, 4642862, 1007346, 7096032, 2699631, 7095420, 1032206, 6518894, 2549201, 5311426, 2169241, 3587873, 8190761, 3055915, 2480486, 6320344, 5043359, 1812196, 4076521, 6763189, 3796329, 1151663, 2932163, 5249902, 3389035, 3598376, 1697664, 5135427, 143201, 2097652, 6227765, 3495314, 230338, 6131540, 2965605, 6401148, 5796656, 8011592, 3697362, 4055182, 1652999, 5859724, 4583350, 4118738, 6900549, 1979736, 3749765, 4896511, 2784731, 2974587, 7029353, 4644697, 811913, 529529, 5279632, 7193704, 8200892, 455819, 8084352, 5651871, 2324574, 4435168, 3984154, 7783985, 4083681, 5250368, 7193306, 2835143, 2541641, 7015314, 1496169, 3070010, 4736328, 4094833, 1649735, 8316439, 2107201, 5479837, 5420028, 5331640, 4812159, 2979855, 43743, 3851683, 1003852, 4274128, 4223552, 7053633, 735719, 6475447, 5182951, 6486366, 6291990, 5768144, 4814576, 5074815, 6039719, 8189702, 2552747, 6880843, 4440237, 6054553, 4148682, 3374626, 2351101, 6930949, 6718152, 2038927, 1131767, 5949083, 2712530, 4731930, 4889762, 2646679, 8309083, 1295165, 5096741, 4064525, 5698306, 5552877, 438386, 6662316, 1493238, 2760265, 4669231, 6667396, 348494, 5017208, 2859845, 3121936, 1626834, 8317021, 1376896, 7301378, 3722083, 1454327, 8332394, 6435160, 3463564, 4589233, 1762634, 7107619, 6973980, 567330, 405166, 3340814, 4132934, 5055395, 3052776, 5645452, 1330250, 753174, 162386, 7567049, 5282371, 1490773, 373754, 5518187, 5163937, 7090619, 2025712, 5860195, 2905493, 2939529, 4180014, 5893834, 2867324, 5959307, 7285421, 899898, 1473854, 7100562, 1991199, 4036436, 5760422, 1832317, 2640425, 2626744, 5032742, 7426912, 7427851, 1439988, 6723198, 1421273, 5180931, 6349612, 5179903, 4643329, 3669151, 2546371, 6082638, 2187263, 4253789, 3524114, 6182567, 384197, 5078545, 2991234, 585998, 4359249], -[4250175, 1134865, 2368947, 127674, 6593998, 5500651, 3684706, 2949331, 3638645, 5847886, 6124713, 2457891, 7691497, 4701413, 5167273, 4131020, 6801764, 7802904, 716220, 5713791, 2466728, 5659642, 4772272, 3462102, 4752824, 7742640, 1729950, 2548809, 7596257, 2615007, 1686890, 1802644, 2002399, 5430242, 7788354, 6946842, 4520011, 5490982, 2151624, 1839994, 5826039, 7555691, 6003838, 1397643, 3696625, 4056904, 6786392, 499922, 7431081, 2539513, 398455, 3130836, 5150657, 4342980, 6406120, 3978495, 7640192, 4621209, 6127092, 6937490, 1055422, 6196673, 837583, 7794063, 4904884, 1306941, 2952451, 1364857, 6529541, 8010590, 5911593, 4340153, 7345466, 2560340, 3637977, 2333908, 4495066, 2134147, 847560, 2909365, 1116617, 65429, 6567931, 8298561, 3742304, 2756102, 5248346, 2238325, 200210, 5386039, 5355741, 5784107, 127700, 2067447, 1522518, 5615600, 7973707, 7692132, 5685145, 3946398, 5760414, 194220, 5651709, 156854, 677688, 5670335, 2427385, 2331747, 2351624, 6238218, 6771950, 5821192, 7939226, 6574119, 2168982, 4499327, 3877359, 6606051, 5570479, 105072, 4600999, 4567489, 5572965, 7850403, 7885000, 739553, 2989443, 6895264, 7284183, 7152163, 1556271, 1819578, 7876803, 2607772, 1743106, 7339162, 7033333, 2835615, 4756406, 3213557, 6592112, 3165988, 3010340, 3993787, 2690531, 1083903, 1606711, 1894012, 7096965, 3959426, 1362560, 4116477, 8132554, 7996740, 2009071, 3716057, 2894675, 1073608, 834815, 3573039, 5636036, 3381914, 1129034, 6114337, 4196217, 5039286, 1618302, 6967855, 367992, 2488161, 6747488, 5618541, 1355099, 1223500, 6357329, 3191995, 2524377, 3630072, 460189, 2431536, 1560240, 5367443, 7585542, 3840813, 355853, 3040003, 5097722, 1033293, 2339731, 441261, 7825807, 5877407, 716303, 5991637, 8190737, 1100519, 1719353, 5209725, 8188956, 265084, 1912142, 3618487, 628501, 1490858, 3262085, 4515269, 3306940, 1979044, 3698701, 1812023, 7971469, 8231761, 928191, 231869, 7374374, 7999108, 148473, 3425421, 4163380, 3423346, 88998, 4032606, 483386, 7944809, 7991543, 6500721, 279847, 6629454, 7277543, 4435320, 6847114, 2229531, 2629956, 3049987, 5655558, 7952266, 5313137, 60231, 2305554, 5323929, 5477965, 3473216, 5705231, 2836719, 4383663, 1243216, 8030302, 1313877, 3999865, 4976917, 3564016, 4673321, 1482607, 1422978, 3558144, 4672729], -[5225532, 3184459, 3593619, 145438, 169419, 1461937, 7782223, 5828487, 8182468, 623885, 3445292, 1969565, 3946194, 4361076, 3330933, 8225361, 6162009, 8031970, 1515448, 7917196, 1629096, 4146211, 5095044, 7024770, 4106906, 58627, 8061693, 4962435, 79767, 6379739, 1676654, 7967481, 4184076, 6868553, 3428473, 7302339, 4470248, 6135830, 6649671, 3692979, 3924612, 1650718, 2465915, 4437858, 1205867, 5149844, 3058169, 4042689, 5903287, 6865102, 1552554, 2704783, 3098542, 2681987, 2950834, 3157693, 5314496, 5301502, 2880183, 4266988, 4388502, 1464677, 77614, 1951390, 1138936, 1519552, 7116725, 5355429, 3785847, 6811809, 3039379, 326095, 356582, 4314152, 2860911, 1888125, 1410076, 2325397, 6216984, 3437701, 3026021, 3315680, 4597860, 1490419, 3403931, 5888856, 2900334, 3534805, 1238541, 1003508, 4900784, 921650, 6632272, 2112543, 3856446, 1382173, 2002313, 8335869, 2537253, 1157355, 4894497, 7517278, 8169117, 8043424, 6960943, 6368445, 1091617, 4931351, 4632350, 7764669, 5591791, 3145850, 6898258, 7813079, 4282170, 1626231, 1510519, 3146973, 3268626, 669247, 1592887, 8063270, 1225386, 5903075, 1438636, 3331798, 5705594, 7240691, 6137987, 4808705, 995695, 3402199, 1343014, 5794021, 5264200, 2374205, 6724645, 3940597, 5519893, 5519823, 7919790, 5759031, 4685267, 2728913, 7828321, 6644277, 3810611, 5451993, 8038227, 5460011, 8178764, 4173049, 1335434, 4742163, 1691671, 4782863, 7681415, 3932659, 2980263, 1284903, 7338842, 4526188, 6719020, 7797131, 3118132, 8315974, 602168, 2144820, 6308352, 6486955, 779646, 1309173, 8316663, 4792060, 6821718, 7878200, 8061381, 491864, 6475844, 5136316, 288550, 4538470, 7083308, 3260084, 7527166, 2472861, 6369146, 5153064, 2871258, 4843150, 3489317, 165882, 5566564, 7771860, 3258140, 610094, 1669100, 5905293, 6238203, 5893438, 3220174, 1593511, 6868215, 1286724, 3878339, 5050797, 6272059, 5375083, 5770379, 8355698, 488195, 3047829, 4530771, 5559714, 231751, 2788769, 7610806, 1560806, 6233976, 3127845, 4108553, 6832372, 5811033, 1208553, 6247893, 1595634, 3947728, 7281141, 8250268, 1728148, 173541, 1095765, 6595535, 6562224, 1766119, 2447610, 6866931, 2956454, 5312432, 6638401, 7847708, 3658649, 1729535, 4443722, 3773751, 7300420, 3443234, 1911221, 698234, 3195516, 4180748, 1908994, 2643475, 7873994, 1631646, 3731121], -[2027829, 2889169, 1412751, 1398701, 4746044, 3334015, 7728514, 1145068, 2677181, 5837222, 1559867, 4891268, 1196552, 1846487, 7882602, 128082, 3264772, 4133859, 6369277, 2622526, 748189, 7798985, 2188359, 5054794, 1070758, 467471, 4725659, 3050707, 3829017, 93760, 2418606, 2617065, 2310841, 3364942, 4187970, 5678453, 198595, 1807016, 1276360, 4471779, 1925284, 5571289, 3722563, 1301216, 2447026, 3611377, 5636075, 3550431, 7199892, 5976070, 8208038, 3106023, 6424786, 5466424, 4607409, 214818, 3787055, 3985275, 808852, 2413504, 5890338, 1841358, 5081663, 7031867, 1148546, 7480381, 5269338, 3714231, 7769620, 4744384, 2109933, 2877723, 6909098, 6874262, 2816808, 3253074, 2689330, 2839225, 806732, 8291404, 2037996, 4040094, 674937, 6646757, 7633939, 7377452, 5262254, 3900905, 638668, 5157126, 5737431, 6278056, 840978, 4255799, 2084507, 1106041, 2387820, 471202, 3719951, 7039392, 2833568, 5131978, 4853535, 5314788, 3391190, 3840252, 853525, 4210266, 6064536, 5404724, 2084993, 8263555, 5781373, 7140883, 1348663, 962460, 2694212, 5945369, 6468937, 3108202, 1008147, 2917494, 7403501, 3311474, 2257193, 2050613, 3990629, 8121343, 6152274, 6424519, 8092882, 8173862, 459270, 268373, 3517398, 3476538, 7008309, 5041771, 3798871, 258672, 6070815, 7394723, 1616324, 748586, 4567820, 2890796, 4837255, 1683257, 3175257, 2286996, 6413861, 8033407, 354015, 7051243, 4189277, 7528333, 3861590, 1823025, 3268909, 1940090, 5895516, 6385981, 2210931, 3370085, 4448677, 1468955, 508508, 95040, 2737827, 6184872, 5172979, 7420249, 1781659, 138711, 4980486, 4534693, 570192, 227872, 3134992, 1219369, 2483902, 4683399, 2778948, 3245054, 2920026, 4055933, 7788988, 5661955, 3117113, 3893516, 1120668, 5239151, 6239356, 2443276, 5093983, 47133, 3352237, 5884388, 3937475, 2879705, 6884866, 3250804, 2336405, 5958187, 440043, 4943250, 2658728, 5532786, 5220409, 2845187, 1837264, 4990054, 8274221, 3723759, 6551066, 5798448, 5030815, 2310297, 4054429, 2563913, 1051590, 6902894, 4041225, 496160, 2639627, 2873759, 579420, 4797738, 5044611, 1483404, 6865609, 3994215, 5134669, 7944447, 8050685, 830030, 6417703, 4996646, 7055516, 6238859, 6100270, 2723230, 5637367, 2011319, 7872310, 376034, 2905457, 6619696, 6852110, 6960754, 3746979, 6137567, 4324172, 1768052, 5663591, 3431984]] -w1Prime: [[42, 28, 29, 24, 14, 42, 24, 19, 5, 29, 27, 11, 17, 2, 7, 28, 40, 7, 12, 36, 2, 11, 11, 35, 6, 7, 43, 22, 13, 6, 19, 5, 34, 2, 31, 40, 38, 7, 21, 8, 17, 32, 17, 15, 39, 1, 16, 43, 2, 34, 26, 35, 0, 1, 30, 7, 17, 24, 5, 37, 14, 37, 5, 34, 13, 28, 11, 19, 43, 16, 13, 33, 26, 9, 21, 36, 20, 6, 15, 28, 18, 19, 9, 27, 1, 11, 33, 18, 1, 32, 16, 34, 30, 42, 19, 21, 9, 31, 24, 22, 36, 10, 20, 26, 15, 16, 37, 24, 4, 3, 28, 38, 43, 2, 42, 30, 12, 23, 21, 41, 22, 28, 38, 15, 13, 37, 8, 16, 25, 22, 9, 0, 11, 29, 29, 28, 25, 15, 0, 20, 5, 22, 22, 37, 4, 34, 27, 34, 33, 30, 25, 27, 32, 43, 14, 36, 23, 32, 22, 18, 12, 36, 35, 11, 6, 31, 14, 25, 26, 14, 0, 7, 27, 21, 30, 29, 2, 35, 8, 14, 24, 35, 2, 26, 15, 16, 9, 0, 7, 38, 19, 8, 0, 34, 18, 24, 9, 37, 36, 3, 2, 18, 22, 27, 16, 30, 7, 4, 1, 40, 28, 8, 2, 29, 27, 37, 11, 31, 15, 15, 22, 31, 15, 31, 38, 5, 8, 37, 10, 21, 30, 10, 14, 14, 26, 39, 39, 8, 35, 7, 27, 33, 27, 24, 19, 13, 32, 12, 22, 19, 32, 2, 27, 16, 3, 23], -[22, 6, 12, 1, 35, 29, 19, 16, 19, 31, 32, 13, 40, 25, 27, 22, 36, 41, 4, 30, 13, 30, 25, 18, 25, 41, 9, 13, 40, 14, 9, 9, 10, 29, 41, 36, 24, 29, 11, 10, 31, 40, 32, 7, 19, 21, 36, 3, 39, 13, 2, 16, 27, 23, 34, 21, 40, 24, 32, 36, 6, 32, 4, 41, 26, 7, 16, 7, 34, 42, 31, 23, 38, 13, 19, 12, 24, 11, 4, 15, 6, 0, 35, 0, 20, 14, 28, 12, 1, 28, 28, 30, 1, 11, 8, 29, 42, 40, 30, 21, 30, 1, 30, 1, 4, 30, 13, 12, 12, 33, 36, 30, 42, 35, 11, 24, 20, 34, 29, 1, 24, 24, 29, 41, 41, 4, 16, 36, 38, 38, 8, 10, 42, 14, 9, 39, 37, 15, 25, 17, 34, 17, 16, 21, 14, 6, 8, 10, 37, 21, 7, 22, 43, 42, 10, 20, 15, 6, 4, 19, 29, 18, 6, 32, 22, 26, 9, 37, 2, 13, 35, 30, 7, 6, 33, 17, 13, 19, 3, 13, 8, 28, 40, 20, 2, 16, 27, 5, 12, 2, 41, 31, 4, 31, 43, 6, 9, 27, 43, 1, 10, 19, 3, 8, 17, 24, 17, 10, 19, 9, 42, 43, 5, 1, 39, 42, 1, 18, 22, 18, 0, 21, 3, 42, 42, 34, 2, 35, 38, 23, 36, 12, 14, 16, 30, 42, 28, 0, 12, 28, 29, 18, 30, 15, 23, 7, 42, 7, 21, 26, 19, 25, 8, 7, 19, 25], -[28, 17, 19, 1, 1, 8, 41, 31, 43, 3, 18, 10, 21, 23, 17, 43, 32, 42, 8, 42, 9, 22, 27, 37, 21, 0, 42, 26, 0, 34, 9, 42, 22, 36, 18, 38, 23, 32, 35, 19, 21, 9, 13, 23, 7, 27, 16, 21, 31, 36, 8, 14, 16, 14, 15, 17, 28, 28, 15, 22, 23, 8, 0, 10, 6, 8, 37, 28, 20, 36, 16, 2, 2, 23, 15, 10, 7, 12, 33, 18, 16, 17, 24, 8, 18, 31, 15, 18, 6, 5, 26, 5, 35, 11, 20, 7, 10, 0, 13, 6, 26, 39, 43, 42, 36, 33, 6, 26, 24, 41, 29, 17, 36, 41, 22, 8, 8, 17, 17, 3, 8, 42, 6, 31, 7, 17, 30, 38, 32, 25, 5, 18, 7, 31, 28, 12, 35, 21, 29, 29, 42, 30, 25, 14, 41, 35, 20, 29, 42, 29, 43, 22, 7, 25, 9, 25, 40, 21, 16, 7, 39, 24, 35, 41, 16, 0, 3, 11, 33, 34, 4, 7, 0, 25, 36, 41, 42, 3, 34, 27, 2, 24, 37, 17, 40, 13, 33, 27, 15, 25, 18, 1, 29, 41, 17, 3, 9, 31, 33, 31, 17, 8, 36, 7, 20, 26, 33, 28, 30, 0, 2, 16, 24, 29, 1, 15, 40, 8, 33, 17, 22, 36, 30, 6, 33, 8, 21, 38, 43, 9, 1, 6, 34, 34, 9, 13, 36, 15, 28, 35, 41, 19, 9, 23, 20, 38, 18, 10, 4, 17, 22, 10, 14, 41, 9, 19], -[11, 15, 7, 7, 25, 18, 41, 6, 14, 30, 8, 26, 6, 10, 41, 1, 17, 22, 33, 14, 4, 41, 12, 27, 6, 2, 25, 16, 20, 0, 13, 14, 12, 18, 22, 30, 1, 10, 7, 24, 10, 29, 20, 7, 13, 19, 30, 19, 38, 31, 43, 16, 34, 29, 24, 1, 20, 21, 4, 13, 31, 10, 27, 37, 6, 39, 28, 19, 41, 25, 11, 15, 36, 36, 15, 17, 14, 15, 4, 0, 11, 21, 4, 35, 40, 39, 28, 20, 4, 27, 30, 33, 4, 22, 11, 6, 13, 3, 19, 37, 15, 27, 25, 28, 18, 20, 5, 22, 32, 28, 11, 43, 30, 37, 7, 5, 14, 31, 34, 16, 5, 15, 39, 17, 12, 11, 21, 43, 32, 34, 42, 43, 2, 1, 18, 18, 37, 26, 20, 1, 32, 39, 8, 4, 24, 15, 25, 9, 17, 12, 34, 42, 2, 37, 22, 40, 20, 10, 17, 10, 31, 33, 12, 18, 24, 8, 3, 1, 14, 33, 27, 39, 9, 1, 26, 24, 3, 1, 16, 6, 13, 25, 15, 17, 15, 21, 41, 30, 16, 20, 6, 27, 33, 13, 27, 0, 18, 31, 21, 15, 36, 17, 12, 31, 2, 26, 14, 29, 27, 15, 10, 26, 43, 19, 34, 30, 26, 12, 21, 13, 6, 36, 21, 3, 14, 15, 3, 25, 26, 8, 36, 21, 27, 42, 42, 4, 34, 26, 37, 33, 32, 14, 30, 11, 41, 2, 15, 35, 36, 36, 20, 32, 23, 9, 30, 18]] -w1EncodeTemp: 2AD7618E8A4D45B72D917070E8C190C2B28CC6B15A8D3115A2F0A1E6512111183D6700AD82A88D40E01D1156944E59880DB74C2BD4845A529194F170D2946CC1124A0108899E3A55C98759A442690F5462C4C099ABA07ACC55A516673E4D89409995004BD771D9035085659584B889A1976DE0EA901768490C392EC6E7649A031C5BE575C28838D828680F940087392180286149490E82646D90771001CA2142B795CBF73CD6F77C6681944AE5298EA39D27321E5BB861530332D6040A1B345C96C104633741D3073668B659644A788D9749599A34A893244A979258B7281F0A1E53450E672340DB25562806920648A4DA011DA2FA5D663331D8423C06300294C33101C779C182742AEA555EE00584D7304C487AEAB86094D80518D6A5290191A68928AA939CE593456204558E8128657558ABAA508F414C9D648096969442337A871146CD343408875202B4158C907EC4B71AC9B606CA342011162953A2AE4570AA8164494035A8AA288CE645320EE4A91CC0709DE43DD7A11E953665C831655C340501927EEB2029D515ADA08AA889B59515A06A8098A816299917384E55D25CC706551F893890F3441CF758170228065272140909C2F52807134A508421D2F74846A115E3421D0AD018DAB9AA64686858DA45646A2148140D886A7C47E499605648C7C73163D575AA9739E948756AB75A47966468051D2736A610302CA1481C4046A6EA206E02564668136E4F26055D1A0DC9177E11421E9416721E204058173C28124616E9192152996B1218A29834E4C38DE9945C9429294464294E9A4CCB731C99941A8E876886920691153A44CA6C86904114D0388C64798172604A471DCDE44DE6B7426287055445349FB295C6C94D69B63C24F944CE43004B458CE8C951C4E68584B518CD3095CF967112555820B7AC5E7914CE2742C57346CC52ADA0A8AE422049A54605E08910D893251123AA4269A19412295FC8481832044EB89D49A0614300194DF6444F957A10656C61B301D2573D64C47C82E674DBA368EB247A1A533506590DCE33641A42569BAA12A25686A0E32DA9F08C24498157E249 -cTilde: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 -cTildePrime: E98901A3F79293983D935DCF3A4DC9BA8966F70CB2991E6E1E5942643D37A152 -cTilde == cTildePrime, signature verified diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt deleted file mode 100644 index 1028db71d..000000000 --- a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-65.txt +++ /dev/null @@ -1,107 +0,0 @@ -Signature Verification -- ML-DSA-65 -pk: 6C8414380856CB52D79C4B29139FB1839B8606F5948B9D72A956DCF10116DA9E2D79770186FC74D942C0F4A3B595FF6C19804B49901C6AD5FAF71601C2B600315E1F40C2054767B00925DF3AA490E8C76F05FBFB74911075E6518C5F1D91B8A0E5B59830D3DF3994760411EBB911ED4CC2C160E3849A93762DFCA7B9812BC7AEB2DDB2767BEF36505605AE069260BCC8DC4787C428CB3C076EF2A6B93561D8943F45CABE8F0553FF2EA1AC95C1CE21593A175459D7DF12C4070ADB0EEE55B4ABAE59BE69C3FF0DE5A9B027FC7D8E6E057B7152EE6AB480D105D30B0F5051B60C7901C525C4635FE668CC00E9D3097DB99D66323715CE4F0B79B426B4545E09F4DE39323DD14CCB0D17108CD46DEC6138CDFA2872C1C4C8AEAD5C8CE04157E553A37558C2346A06194CB50B4981BF4D090CE4E860126A8254A4D4C084C3E2020BC0753521049B0FD88997E027AC51E75CF1350C3F303A0ECE426487153DAF1FAAD6808B9D9907DA9F35185BD3BE8D9CEBE916CED1FA2928D885A9CBA88149703F5E4772E48523125DDD026E714C49F4FB4E544BBF617A40B00B68DF8F155F5880D411877E25B42B2448B36BEC2F1F8F9A770C545150A0278E9B724500AEAAEA471C11CFF04E30EAB2F473BC048E32CD31AEF21579B699225BF9E1B6700C57E509FCA1F236294A5974DAA15FBCAD62D4BDDC4532B2614144DBE28807368C281A770EA22B1E5A3FA5BA14926DC55A54F84A2A77C5A70841F07BC1DEEF7403B247AB42B84ADF141E030C98468424DAAEB99D2577F950C2373CCA1E2DC2761B8EDD6D08FF79E528880FFB51C36ED420AC5D50F2582AA664E54EA5F4189EA0176DAA6122F6235A70B15CEB4DDD65D3BE6EBF3DC43189EE0A2E3105638F23873695280F1B74274352D60A48E5D3DD02FB7A5ED83FE27A698251421C8E9C98806102396E537390ACFD8C1D0B4F99B702A9EA659878583D92758941B30ECE507C104B2CE487679ECF68B4D8B980698ACF6AA6A57E8ED6AF3FF18D2668950428B57D182F73BB49B9B038CCC82D561278A386D56645EC3FAFFB4125E0E7F36B48B14B452547A0B481AA6B334229249153E42EDF7E49DD6E7636BFC615A23A401EFD4034C81B4DCEF027D344DDCCE0A71618EB5910CEC62228819385033E8D0ABD493D983E4FC087D72B455E4DB63A2F82CEFF65C1E628EAE630596DEC27FB98B84DBFDCDFAB40E472244914AFF179326D542D401A3CBB86E5FF8351EFE53A73C51ABB63FF553E7D7957EF89135E0F5BB1BD0C24F9E45E3236413C60E1396A47567C9439510F00D4A43C149A5CCC04F3D47E67A8E294A461A5F693DB0CAE22CFAC61E853477D339A4E45F7B17C3C116D56F3A068FC5ADFEF38FF85332BD5153C4D8FB8F148F117659C2EA94DB42AA0B0BEBB475A110412F3CD3349FC1AD041B7D5304A8593144EFA3A361D1B0C7613B82C086EA7126E43C616CEE8F1444E9956E87F5CAB95C7C7FB1758EC7D97019E5BA93543EF3BAC1A174299CA48BF7859DBFBDFF243B114F6BF423CE98B4D4D091DA44F3274D573FDC904BD885E35C9152A65354888F11ED4F3D63F26A7BE2F5726EADAF48586592BBDF6CEE246769E0EDA2A80771FED347D67AFEEC68B89463FA0496DBC15C89E8D569983D1D674733F2BF9DF4A980EA8C5E3AF15560A0E28D672B580AB6552ED76AACB5F80260B9703769D33F4138ABC10BF5B0582DCC62DBE58C890F51B4100127734FB7DB7447A720AAE009D00BE8C610792C64F131F2D72115C7E058E48B9DE64F55B4D610C36D112716A31A3DFE26699E9C2ABA05658CEF1B2B0867CF8D5233DB74FA8DC3AD145F5D28574360A85E3B0B10AC0A6467A7B05984628ECA10463F348A3111E00578D3CE5480F5375A1EE23EE82087BAC41233A14AAA724734B1874A4ACE1133706258F5FEA3A0C1609E30C7FD210DA0C4FDE9162DF66FBAF792FA2AEAA512F0FF7837B9CC02EE9BD95539F001BBD60DD8B42D616B2CA95F3835F5E47D43B1434C4563FD81C15BEFA202CF3D9540873F684AFE19AB5C01FA92E95A8CD6F360730856E59C9C6AB770D6575962AF75878572A2A26413D01AB318C100DFC34DC1DEFA5927C4B459925D73E1EB91470E37A58455C22A961FD53F7D99026FF884BF4A2579F706335EFB6FB2250D52AE561898BA1606E51E96D37C9ED3EC6CFCB33BFBE9C3143FD3B6B334D5F61922B369AFBB31C3E6E9B5F3AEBF95CB708346FECF7159CAD94A93D8CD4B8C4894192DFE53EA436FBF3AF4E864E8C3991EA020A811F0AF50B4257436A3FF522BE7367391D0F950BA6452FBFD8FD8728F40BD2FCB894529985B432DFEF6230EB4DEE737A8D10A3BCDFB763E0869B225C1A8D0E1FBF2D161C2C65D6DFB958E982D11777ACBEAD8DFB6B1F5EB21EA942F7C40DC20D2E4EB3E729B4E29F7501DA34234561F6288812D612D41DFA83C5B8D90FF38BA548201B575B5293AD78120D91CEC059CAE2E76A9AB43EF1281E2BEF3E348D28F21947C88848960459489775176F8E40EE06427953687FB63E470F7D59FB60DF569F8A11E28E0937162C46AFC7D2210A885FFA21B3DBF5354B2941F4ED5D50790890840CC3B973D2C3D02602B29BACCB6CE17CEDB97B085A2AB310572BA7371D1F8120FFE37D0B0FCA35AFC5B562AA8499715A299CE059CCE3B0D11CEF0D9238961AD4BE11E9A6D1A4692177C8B0C53F11A8ED2650212E7A2F80EBFF6DCFE4672103658434D0327ADDCD66BCB6 -signature: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F46373045B9E540C73DFE91B61F0588D613593FCE1B00EEF1B227034C6FD3B18B3F221110FB345AA78631B8B59FBDFDCCDAE6A24D259D34AABAD218B3AE4E77186653B8563AA6120A0A531A4E913730DC914FE5E008BECE6869B02B07FDC16214540D316C43FA0C211B41AC7E52656729C773E4C4B88ED311886DD4D275417D70196644EED15FA315066003E309F832AF91262C949011FCB0AD2CCE65DD9EFF567EE29CC40A6FE0664E7D9F236568FC94295DBB34288233E8C511D28815EC721032296E1EDECA7F726A6EB0F76CC5828011C0E4013CC7EE4329B81ECC0D52ED1E491DD6D55C5265665ED8AD219B894F31C68C619AFCDB7358E5554C495B8B6E3325688FB8C1A25331D57BD348A27D390929BC46A1496AB35B46BA61B6B9D23CD06315FB72C24776016130ADB1CF2DC72959EA9CAD96AF5DA996126CDD85B134CC927A51FD23F84791A3FCDA077E15991748A0394F334EB8BC48A99AB9DFBB0F2AAD6FBE484961D3A4E8F8B21A6AC092B226D6E119FAD44D8E576FE96C6CDB6840EA614BAFC70786C519E1D5DC0F984443C8B1E54F8EE176D98B2C7027F57D7E3DE9B2A0A36911B8E47121DE0C07EBBA5D7B594EF244C68327EC6C6D1DD501F483FE9B9570597E70DF413E7AF03847F409ED61E2846E6C641E6A7FFA79DE6BFA373A0644B00BF41A034992A794DA17C88885239032C851764E3E4DBDE7F12A16C5A263E964C1E7FDD3CCE576DD6D56B18182848B7563645D4E42FF22742A996785169D7F503B48A7158B3CBD29935ED32049BEA1AD953EF707327B778BFDDDFC60511DA113A34F655712E4E59D6CCE404E94ABA61E8135388FC21C8E41344F324B01AC8C069F92575D34F88BCA22CB307E37070063320256B8BAD6EB7A81AFE9A254016E1C8A125089AAA3EDE84E5B6C2ECFAEFAA52B9F5709602C06AEA4A0384E9B09E5B88164B274EA3265FB5152397DFF5A3A0861E2BC12D2109289729747E83FDF243A1D17B98348379845A9E955E2D6F938DAA5918E2A14F97BA2BE501CCCAFD681910F4A4F06715CE84096F37A91DCCA2A8A4BE8DA7921DBF8D3F4EFB98C6B4F940ECEF832B549D068947C3DFB5809CB7B060A3A0EF3B21C0164501DDEA7C9E5E7897C6B1C46348B2C3E805F6F2287BA158CF925A7BA7F08254989C87D24979AD986AA97C51B01F45D4A1F24752991F04205EB551FD02D415F2DD1EFF142B0D70416C6D815EB91732B268FB20D0867442D71DEC057B286CD93811FF3F646EBD565D51D09A42D3ABAAC0F34CC817B18938ECCBB1FEF05BD3C2B494FA529ED4C634C9325A48173F20FFAC32DC101E6EE03B2FCBEC2468DBC8F76758C3215474F7EF24065F79060ACA3C8D5D74AF70F48301DDB30C05DB3EFA726CF88555901841282AA08F666A65351A6A24EED6BE211773107E185E1B488A2E491B6C141528462A86494B54FDCCECCB6AA21253686693AE798C9CE9E0BDDC6AE53D9B706DC4F4D81B9C73C461ECD7035C5172EFAE5602CAF88C64E79E5324030555DE211F89FD424C338C3883C83CA9405C2B5D1445F7C98C43ED3D2BECBE25F5F3F544CCC5B5AEAE47DDF3FB5649FF5D61EAA02EDEBC75CE478BA00426CAF474FA79E5B089EB1A882F15354592695952BA0A8EE91E649E3F2C382264DAA30F6A6D217F6129C1939B6DCACCDA5B637326E8A8361C3B56FCFFC485036865822B9BB87B43510BCDD55BC350DE7B2AE90A21E9E19978EDA10DF667614A44FE2A84D16BE043EA8773633EA6BADF65710052F341F65CBE928D3962A5A2FE64E46D6BFB8FD0D9978F0423CBD195F72F3CB19D7EFD9EBE33CD2F5709A57807DF944ECE568AACA4336422083B0697B6AA00586E4BF7DD673A3D596B8618AC3B4061750C6BE97CB53753D02395556075A26F140B93F577DAD505E1CF2B551A04C98C7F0901831B3CA61D75DA793AC72A44C7A07F7DBBAD60A55F49CBD79DEE4739FFD36778EBD08EBDB79EC07A16239C5B921599FEBFEA46DDF966AA4A01512E610943F5DC54B4C76B764B380BF2F84EDE32124912F54F7B6E207B7381F670F7AA0F3C3ED1015740384DD61A9765EE4696EACF82EA410691805CB688903535D7046100DCC2BA7D8302ACB0430D506CCC1C0DDEA7111A76F45B454E25CDDFB639B3D664C36D8843513A3FCAF9E6057E9BC068237FE2419A2D2D90B4A1FC2A71A146D2BD04364C79B8EBA8E3E88CE11E916E4A7528421328CF54FAAB2B19F44468781F8AB84B7DD972FF5615071430A4374DAFCAE1E6044AA98E985941BA6B9DB8C02F589603EEB8BE90A70EFC088D795E6DA1F1F2E6ECEDD031D8199E65912D434D09BFBE594406DC1150E99358CEA7FAD2E7C44C38B6E0CEEAB9BDE0DB97BCF5AC99410C9470E266B8BE45F6690831F4145E26379DB807C26DDF91E309D4F4A3E7ECAB7362F15D20EA433B7E70A7DDE7416CEA871498B2CE3F58D29D8628C531840F022DD3BD2F3809B1168D38E63C7F69308A31A2D4D5EEB974239B34A62BC85E4ECF90C336A0C37BD9E0EF4266B835AC8906A83CF0B35138A65E5D9A61FCC9B2D5A337B8ABEF88A7FB3C0945D7CAF35611AE0E44693A5BCE0A6E2FECAE9BDF4E356D6536B581A18F03A59164ED5447C7EC8BD997BE953DED932535B5F438A04319F5E0D8B0FEBC8DE8146658E52B9759C73935B120DC9B854F3C8F94EC9339057D7D7CD91F7E0B98D84EC7B2F92328D736018B03165A8745F8E77EB8029F9782670CBD86B4316C7BE4A880338BACFB015699BF30D3A4B05325435BA5FA3B9D2B2FE0B519C2CB246E53D1A343D661A66143C6F468C5538645CC26D4E2A8703EC9B10FC89BE6F859997708F31194F0DFEE92998B25E93B97070DE14409D5BA43DF88D15C2FBA97BDDE618CC3FC042F7748184BA9EC9CBA1B2006881D0514264198FB691C5C038E04950CF69099377FE66BA64E21952A44581719664F5D92397D22AA7032BF589AF8ACA48DF6D14EB43CEF0A9C8A8F9AD329525EF0AAA4F9E09C3513CF029F3DEFCBB4114FA0F668DB4722FCCD9C207B66F109ED95B454BB6195D59C4A678BA6F5A9B234121AD0516A1D4123D3826D92A61B35DEB295BAA2FE1B5EE25021DAEF857B5DF192E175E3A2A0D3F082F211CB5BDC236274F86C5DC74C39BE97CCF5F5794EB64EC645545210FC667D1E0740E66CBEDC20648CA1FA73414596BA08917A19A463AD3027C81836B8F4F02B99FC5083F06F34BD2309C2342AD88A84FA96E207C0108F6825414944F264ED6C4667C788D61A6BC2C456AF66C2F769E16901706912CC90D4B6C90DCA16CAC8FFED8397020E2975E24FF4C807C8AB731C81D36CA84C9121A8513E0C9D0F41BC68F88EACAA35599FAE3BBA6FCC6528D47E40C0764CF9C8383B3A44515E61D92CDAEC9CB9082B5A0C0379460D9179A7D9DF29E0B4B6A4118285215E87B6F118E9731E466FB3FEBD195E144FD2037D116627579AC55FED5E32585EC6638A0DFBE6ED6C5876CF8114C902AEFA363F4C9B72E7D5C852DCC1AF2B8852A9D0F995938865084CE5213B308A9CB37F681960D84EFE1DF5134A5915AE5878B10DA0FD4D9AC2AEF0C7E01C2E9E7C017E7BA740CEE1A899459BB75033EEAF3190D6779ED9EDD846A74E321528C03084A5D30874839718A53549B2EC6B2B730AA935CA6E1C4FD8BE0357D93F62174EEEDF8DAB7755B46657E59D7AA00B9F2F85E4C0F77FA11A5D69A23B1EF3A09F219D83B1F391F841318EEF35A326367BFA2B15FD714032092B9D02BF613AFF7696FADF1DE2C817077CB7C996776D69EC241A24254DA2D13987691EAC7EBA8CD8DCFB3947B1D99EDF962D215B318BB5F9AA04D1C82626A4173D02D410C586BCA4E51CA4F3E151B54F17A6BC9677609BBAF6C3038A67CADA66B4FDFB51029E07807D705969D96C9ABFB7162E45810A1DC4B56DA1477ED900A89CCAC298E17884269C39E8D7AB966F33DDADBE56A384CA20A7B1899EC18E2AE547000B904E34E46801D8574DB008417BCFDD1A74DC018E507B76B0FA08626235B1CE24BCFC320FAE3551C1C929B94C7C4965341829D8A1347D6A7385803B08BCDA84A27EA5E49CA1E6006EA232A53EE417EC881D3328A156382A6B293894DDF9B369CDE6B2FF59CB6A564E21C9279ECA0311F5D80CE39B98BF90DB327F74D3F762D117DF5F9132084FFB555A5D147221AF863ABF78715B72194529A0E334D4A191D42A99BEA52ADA2C7CC4A9774D5CB28D4ED82B61F94E89F60F0C8EA52DC079D4658BF8C856D6152D92251948B3BA014D8BAF3DCD36BC71F8E5B2CE6F535B7B9AE13DA4A1EAFFC253BE43A9F608EACE733CFCE52EA5CDA8359DB53FF3AF2CEFE8779BCC53C24A4B18D5E0D781BECF75B5477473A2024AD56C54A7F990EF6B1DFAC501088509D3A37F1C8D5C26487E420B7F4358E9269761FF1FA3AFCBECAEB68F5DDDE3AA8FD078CC4224CEA67132D7EBF5D232E43BADD218C0B4DBE1E16529866B9AB935885ACB415FBB1EEE69408A521B462EC59CD0D3C5496D985AEB0CE374F6772A4E6393A4EF007438090A8A9E52D2F55666D70F0000000000000000000000000000000000000000000000004080E121920 -message: DB8494BA19C4118FB15D0ACF4254FD37483FCF4748FD1844F717CE6F69589E61772CFEFA7F9758653409D4EE5A264B834E60D6BB96499EBEB2B06B0BA874BF31E641394CFAA6A2D30DDB8F045876208D2F51DE15E205E8C91B87ECEB05FF3183271B2649665DD3CC49BFDB998D539DA809305516BBBE9C906021191C5223E525A8FC3616A1765EC3F9C5DB53CC337E039F186ACFEA91148EE2A79CCA3689EDB62AAF28B5D752FDE265EE5280B519726C1CA9803295C674B7EFAFA4D61B306A79E3F6E7A887C2FB535B3B0FB3D9EBC87603EAFEF170C1F1D28E99BB -rho: 6C8414380856CB52D79C4B29139FB1839B8606F5948B9D72A956DCF10116DA9E -t1: [[301, 478, 23, 536, 252, 605, 45, 769, 1012, 360, 347, 1022, 364, 6, 184, 293, 144, 647, 342, 1003, 759, 69, 32, 731, 256, 908, 501, 256, 450, 449, 628, 705, 265, 969, 941, 656, 144, 506, 764, 21, 1019, 318, 279, 66, 629, 121, 197, 382, 285, 548, 523, 918, 181, 38, 307, 895, 57, 421, 71, 68, 491, 110, 721, 307, 450, 48, 566, 531, 922, 420, 727, 1008, 423, 110, 696, 796, 686, 876, 813, 474, 891, 443, 259, 345, 517, 427, 288, 386, 188, 818, 125, 541, 196, 714, 972, 28, 622, 444, 922, 214, 97, 310, 1017, 276, 714, 1007, 88, 332, 767, 75, 714, 598, 705, 115, 402, 233, 23, 597, 373, 895, 18, 497, 160, 876, 526, 379, 837, 686, 430, 918, 667, 781, 511, 323, 670, 706, 39, 895, 231, 442, 773, 94, 295, 953, 106, 45, 280, 23, 979, 962, 256, 325, 182, 579, 23, 788, 37, 241, 502, 921, 104, 51, 656, 847, 265, 607, 475, 410, 818, 333, 225, 319, 267, 286, 619, 720, 596, 599, 832, 891, 569, 844, 275, 307, 459, 451, 257, 560, 468, 795, 542, 225, 717, 574, 802, 773, 196, 946, 730, 370, 140, 120, 372, 917, 851, 360, 391, 777, 564, 410, 400, 304, 949, 578, 20, 766, 333, 770, 576, 931, 608, 644, 38, 338, 164, 53, 76, 782, 738, 704, 0, 471, 309, 264, 432, 62, 472, 482, 521, 159, 428, 468, 462, 965, 53, 963, 771, 232, 526, 179, 580, 541, 277, 975, 506, 680], -[214, 736, 472, 614, 519, 1014, 857, 96, 859, 948, 219, 626, 491, 442, 225, 839, 506, 522, 386, 535, 937, 562, 26, 294, 880, 911, 117, 457, 484, 225, 290, 372, 733, 896, 790, 305, 73, 765, 239, 337, 843, 111, 934, 257, 944, 514, 502, 575, 789, 535, 5, 850, 785, 929, 599, 720, 43, 521, 820, 430, 1004, 971, 241, 618, 119, 259, 277, 321, 928, 905, 440, 458, 69, 896, 682, 938, 71, 71, 241, 963, 78, 652, 814, 978, 115, 303, 224, 202, 461, 908, 810, 87, 633, 621, 553, 364, 505, 440, 779, 49, 343, 633, 960, 647, 754, 589, 162, 357, 628, 118, 506, 753, 685, 280, 989, 882, 581, 140, 539, 261, 836, 182, 142, 30, 54, 547, 418, 476, 526, 744, 482, 360, 319, 681, 331, 584, 365, 689, 325, 993, 586, 458, 87, 671, 264, 16, 959, 773, 990, 315, 55, 712, 839, 170, 900, 298, 223, 901, 49, 48, 664, 273, 584, 872, 430, 878, 601, 476, 249, 148, 892, 240, 714, 839, 34, 475, 539, 867, 733, 33, 511, 350, 654, 544, 783, 126, 53, 443, 212, 776, 474, 321, 242, 662, 610, 402, 741, 339, 842, 99, 158, 488, 721, 681, 609, 392, 575, 360, 368, 812, 693, 311, 477, 217, 1005, 442, 447, 271, 796, 548, 750, 898, 786, 20, 867, 227, 114, 218, 149, 970, 432, 464, 807, 144, 357, 43, 328, 249, 477, 11, 763, 926, 389, 255, 738, 606, 38, 326, 66, 903, 456, 610, 384, 152, 912, 440], -[851, 28, 713, 1014, 396, 711, 240, 613, 695, 576, 682, 407, 152, 542, 981, 584, 373, 98, 820, 58, 206, 788, 263, 300, 44, 505, 632, 633, 207, 282, 395, 743, 384, 666, 248, 427, 422, 937, 231, 858, 943, 79, 223, 154, 360, 293, 640, 724, 125, 966, 818, 749, 329, 46, 907, 816, 456, 395, 293, 480, 675, 353, 621, 277, 1004, 975, 954, 263, 37, 504, 830, 431, 328, 748, 84, 149, 71, 296, 27, 682, 875, 140, 660, 144, 913, 276, 750, 892, 382, 850, 749, 473, 822, 431, 348, 648, 58, 912, 977, 259, 52, 754, 209, 825, 1008, 201, 77, 885, 204, 504, 362, 96, 491, 22, 225, 795, 34, 74, 312, 534, 515, 847, 168, 756, 329, 527, 1001, 316, 960, 481, 701, 276, 350, 403, 939, 188, 642, 1011, 607, 773, 230, 650, 622, 195, 345, 795, 638, 1004, 152, 878, 1012, 882, 991, 42, 580, 459, 292, 274, 753, 966, 633, 844, 326, 181, 576, 774, 947, 538, 997, 255, 280, 957, 741, 206, 87, 107, 955, 984, 351, 249, 381, 478, 757, 551, 531, 983, 432, 709, 189, 259, 914, 915, 606, 396, 19, 241, 352, 632, 675, 285, 86, 287, 921, 324, 15, 256, 589, 242, 532, 806, 197, 19, 243, 949, 631, 673, 226, 293, 538, 661, 1014, 740, 205, 696, 802, 819, 538, 929, 851, 849, 823, 616, 334, 465, 799, 498, 316, 836, 358, 973, 160, 794, 431, 893, 239, 974, 95, 206, 299, 373, 961, 308, 143, 110, 143, 965], -[279, 793, 745, 676, 77, 685, 514, 706, 958, 494, 420, 69, 516, 196, 223, 207, 73, 703, 257, 263, 439, 53, 163, 533, 147, 901, 932, 235, 310, 711, 193, 472, 19, 814, 130, 440, 679, 900, 54, 793, 534, 563, 798, 275, 334, 422, 645, 511, 860, 362, 121, 799, 1019, 517, 709, 503, 407, 896, 441, 677, 821, 976, 958, 688, 794, 133, 404, 810, 840, 559, 407, 877, 1019, 183, 63, 709, 532, 1021, 43, 241, 1001, 866, 212, 37, 29, 1001, 804, 464, 981, 860, 159, 19, 189, 930, 853, 804, 533, 330, 854, 288, 392, 956, 321, 975, 982, 399, 626, 762, 815, 405, 674, 875, 500, 417, 408, 173, 701, 957, 556, 283, 630, 935, 416, 171, 896, 989, 721, 211, 893, 985, 746, 795, 395, 418, 1012, 640, 329, 795, 347, 800, 414, 419, 405, 526, 721, 309, 823, 253, 299, 1022, 173, 609, 14, 362, 572, 703, 533, 661, 224, 160, 726, 348, 11, 686, 613, 852, 878, 681, 971, 23, 616, 44, 919, 384, 471, 206, 1012, 644, 968, 66, 959, 342, 32, 882, 454, 907, 395, 801, 400, 765, 17, 1, 786, 285, 947, 503, 183, 657, 807, 41, 174, 832, 9, 760, 396, 472, 288, 794, 847, 964, 721, 456, 17, 919, 87, 568, 328, 942, 589, 981, 347, 83, 198, 216, 721, 68, 679, 197, 931, 183, 622, 613, 745, 752, 522, 346, 600, 115, 815, 706, 134, 543, 351, 143, 829, 1005, 644, 882, 314, 372, 852, 843, 133, 413, 163, 532], -[227, 108, 171, 768, 678, 657, 951, 21, 664, 529, 706, 647, 772, 216, 143, 653, 529, 7, 368, 565, 316, 569, 244, 332, 373, 936, 574, 952, 130, 706, 711, 262, 547, 270, 673, 670, 804, 732, 388, 464, 164, 107, 318, 220, 262, 969, 504, 937, 58, 387, 145, 908, 780, 159, 269, 872, 780, 915, 285, 394, 735, 729, 767, 486, 559, 936, 682, 326, 815, 451, 63, 494, 156, 944, 658, 759, 917, 980, 9, 108, 189, 856, 189, 266, 726, 133, 171, 599, 1011, 992, 485, 285, 980, 270, 833, 784, 854, 527, 461, 84, 702, 62, 706, 972, 217, 533, 816, 985, 900, 107, 430, 726, 960, 583, 746, 596, 424, 1011, 870, 28, 304, 929, 406, 805, 966, 490, 215, 404, 629, 677, 882, 355, 888, 661, 674, 152, 321, 79, 688, 198, 140, 836, 960, 211, 476, 967, 606, 586, 892, 338, 404, 150, 727, 911, 913, 82, 880, 696, 391, 277, 604, 584, 538, 1013, 851, 637, 269, 154, 255, 738, 836, 651, 855, 39, 567, 213, 751, 749, 559, 320, 725, 330, 542, 549, 395, 40, 742, 325, 489, 475, 147, 951, 574, 1009, 188, 207, 703, 815, 793, 268, 1021, 718, 822, 308, 351, 152, 697, 216, 922, 254, 459, 248, 878, 998, 933, 940, 249, 471, 139, 208, 111, 507, 351, 624, 173, 613, 986, 560, 212, 302, 156, 262, 914, 375, 1006, 656, 822, 254, 767, 314, 646, 787, 920, 580, 746, 640, 16, 126, 266, 765, 32, 349, 579, 986, 851, 139], -[958, 476, 918, 116, 271, 741, 608, 278, 815, 559, 989, 543, 40, 765, 288, 1011, 184, 165, 405, 534, 692, 972, 765, 395, 816, 890, 740, 463, 378, 35, 561, 754, 991, 237, 518, 539, 667, 776, 421, 564, 782, 967, 731, 88, 28, 331, 358, 895, 185, 598, 46, 838, 791, 797, 1002, 694, 909, 766, 502, 376, 690, 583, 42, 989, 452, 131, 220, 184, 846, 492, 670, 720, 994, 359, 23, 872, 820, 328, 532, 985, 40, 162, 353, 75, 468, 647, 63, 790, 440, 1014, 816, 559, 165, 18, 434, 348, 603, 212, 729, 482, 274, 67, 233, 771, 601, 178, 638, 427, 154, 941, 787, 163, 798, 970, 1006, 208, 141, 138, 415, 284, 200, 546, 356, 18, 89, 466, 857, 93, 623, 35, 740, 27, 322, 222, 645, 509, 694, 463, 244, 500, 857, 62, 502, 347, 671, 98, 545, 571, 777, 397, 705, 280, 943, 177, 541, 40, 904, 663, 543, 716, 475, 381, 179, 165, 65, 893, 478, 321, 121, 2, 73, 50, 451, 238, 295, 783, 720, 137, 800, 622, 940, 818, 534, 499, 493, 750, 135, 360, 810, 44, 369, 173, 935, 845, 497, 516, 800, 255, 990, 45, 527, 370, 755, 790, 693, 664, 74, 614, 625, 598, 450, 898, 89, 243, 782, 838, 796, 891, 288, 226, 662, 262, 1005, 70, 745, 105, 589, 422, 801, 541, 780, 790, 319, 516, 730, 155, 336, 904, 930, 189, 896, 1018, 735, 829, 996, 89, 50, 404, 132, 13, 813, 488, 477, 435, 966, 730]] -cTilde: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F -z: [[510138, -234579, 48923, -517084, -505489, -32849, -70614, -320501, -393243, -208670, -262951, -341748, -494513, 454109, 197872, -161187, -12678, -129883, -327101, -421292, 176734, 308782, 345430, -209293, 45394, 106105, 83885, -156581, -133650, 416464, 28338, -377603, 176239, 487922, -52926, -198294, -329515, 119777, -349204, 81136, -326211, 413168, -437313, 109273, 54937, -411452, -440516, 451272, 234104, 41683, 492223, 106089, 397756, -144893, 522731, -405558, 329719, -72435, 250842, 452343, -372988, -320202, -449893, 167943, -320126, 480183, 73617, 11034, 187489, -509574, -338324, 308299, 294360, -286339, -53777, -442712, 389006, 73069, -187934, 55300, 496022, 77957, 490811, -262424, -262628, -453747, -10563, -311787, -348685, 224786, 141795, 186931, -419429, -187781, -105249, 322312, 422714, -510374, -29659, 172459, -215372, 71499, -9523, -231670, 286015, -348949, -54139, 9692, -67897, 234558, -149921, 148682, 411066, -236390, 508718, 436675, 363781, 39812, 499455, -203475, 53809, 159076, -367850, -194922, 87715, 81623, 424483, -312139, 427374, 376875, 440328, -510521, -395226, -102743, 505833, 199782, -20019, 226357, -105129, -245243, -338447, -255738, 439992, -150838, 329496, 89685, 355648, -352875, -137697, 205489, -481166, 78186, -56172, -435206, -478049, 492422, -116102, -351761, -4060, 248759, 151096, -58622, -95969, 341827, 186512, 6177, 333507, -145931, -4457, 57781, -319009, -438384, -220602, 203369, 113422, 362436, -355564, -348630, 265215, -114664, -94357, 63515, -410079, -460707, 243912, -446623, 204191, 80152, -138852, -501750, -253561, 295002, 260550, 476412, 320780, -74896, -169127, -295293, 293496, 317182, 110136, 269081, 17075, 348386, 342762, -431674, 16028, -344030, 72244, 74281, 413354, -18472, 297589, 141754, -475726, 48593, 26326, 432042, 491619, 228427, -202151, -250824, -430889, 389835, 410039, -88794, 2242, 19680, -363383, -511455, -348512, 443887, 176221, 449162, -386532, -321225, 242112, -158393, 163554, -62339, -400578, 310248, -209487, -180244, -460428, 165591, -13405, -305343, 472286, 296989, 327673, 515290, -178262, -441707, -491898, -143002], -[-393556, -41414, -86034, -146088, -452845, 80460, -446254, -155562, 24789, 130923, -394796, -133706, -216632, -413849, 228936, 46298, 183574, 188490, -342354, 151561, 456646, -249382, 470510, -39201, 26766, 262524, -140511, 429613, -33721, -99188, -108869, -402782, -63958, -155043, -167569, -495938, -434811, 408309, 86068, -71709, -477711, 61340, 464804, -473444, -299386, 349011, -19338, 25170, -56097, -478527, -309743, 198984, -396948, 315508, 505419, -83597, -212348, 486001, 99381, 286560, 330994, 519733, -348260, -163297, 6711, 14178, 123797, -45892, 508372, 68104, -165666, -49499, 55815, 1110, -75016, -297108, 56195, -367017, 21882, 410535, -390145, 396123, -95524, -461074, -197954, 395938, 447024, 338444, 397359, -197679, 129833, -363617, 398571, 346311, 356570, 491301, -345191, -386834, 370752, -317547, -491923, -487217, 136378, -349789, 259811, 285990, -502970, -312128, -31617, -59697, -506828, 499983, -212157, 199534, -338341, 117554, 158900, -6722, -520819, -278432, 409299, -454240, -307715, -273391, -298310, 38661, 357259, 233133, 360881, 109553, 487177, -146118, 10808, -488621, 505841, -373203, -376880, -457525, -468647, 173940, 261799, -8488, 128854, -157295, 110253, 202198, 365587, 36578, 456911, -399454, 358220, -73290, 409162, -17700, 219038, -219462, -449615, -224460, 187990, -25442, 50583, -301454, -237262, -290256, -86958, 496771, -348124, -235540, 115513, -315876, 182928, 335492, 465414, -193222, -444040, -415636, 507854, 141997, -4578, -346623, -49956, -35891, -164668, 501428, 412222, 134067, 223108, -340972, -245458, 131540, 245921, -312517, -154203, 8626, 180257, -128587, -448245, 513375, 5139, -411084, 476552, 80864, -477103, -125556, -395355, -166681, 265854, 158395, 158426, -131769, 397656, 221591, 265501, 366548, 480691, -159587, 124974, -114991, 116455, -183755, 88627, 318597, 292242, -275992, -487349, 225332, 117168, 383608, 17479, 304312, -375824, -247133, 62155, -191278, -434832, 419359, -167575, -389389, 231834, 198079, -370914, -254308, -15876, 301190, -256563, -486102, 192425, 310544, -222495, 356708, -169683, 330334, 110874, -261476, -392632, 30320], -[-279280, 418861, 298401, 418625, -126935, -409277, 142788, -108303, -360535, 241769, -58860, -305830, 379325, -12804, -223664, -132775, 227835, 9218, 298026, -93530, -156088, -216120, 518394, -257125, 275561, 272555, 182014, 494235, 448934, -234511, -350015, 193833, 385954, 189601, -19616, -461945, 452464, -305971, -382817, -80501, 232788, 23350, -259847, -355245, 240374, -252367, 205191, -128830, 51459, -252135, -256776, -444317, 351993, -283542, -74169, -440821, -369918, -93686, 482198, 450214, 257818, 142343, -281541, -227172, 478364, 328712, 266876, 376290, 249967, -225141, 63518, 396405, -135015, -473607, 463421, 48815, -361475, -169501, 237962, 72034, -456876, 456126, 190359, 95056, 326775, 64043, -331846, 344896, 468825, -307875, 184316, -311405, -377025, 57683, -501521, -214102, -320084, -507349, -367459, 211357, 206794, 445608, -523427, 128534, -321879, -8299, 197065, -139666, -252370, 396128, -174018, 77503, 274389, -292420, -167579, 268053, 405880, 430447, 350236, 387003, 160718, -173311, -504242, 236471, -33159, -19135, 8777, -479993, 438175, 482249, -160835, -192461, 237538, -101028, 227863, -156089, -318393, -479272, -417929, -48819, 521495, -265975, 141432, -372329, -401183, -321250, -328669, -104465, 370202, 307903, -236496, -85599, 430784, 466596, -275865, 344, -274093, -275527, -290443, -179936, -384667, 17520, -88783, 456372, -411593, 85408, -517259, -67173, 450685, -402516, -227683, 14323, -122150, 327185, -151453, 7196, 84022, 437517, 258350, -226106, -330471, 45593, -52758, 223462, 316277, -57182, 337879, 182074, 507880, -381487, 273861, -112655, 301039, 116499, 264505, -143497, -339226, -439780, -82583, 218317, 148382, -446024, 324359, 473437, -441655, -475369, 300250, -296360, 300400, 475912, -135989, -415320, -501465, -113857, 304595, -42931, -194750, -210936, -365760, -194501, -155957, -413185, 158906, -396234, -451238, -433327, 265027, -353646, -27475, 425563, -80624, 204443, -279765, -296935, -235965, 180585, 337442, 150221, -148319, 323512, -351903, 460624, -444651, 235491, 356763, 42091, 298084, 449095, -51469, -472395, -457160, 312172, 43120, -318845, 460911, -56222], -[-257156, -74487, 291534, 424441, 183888, 46458, 29089, -3767, -63785, 64921, -252107, 433098, -179911, 509820, -506424, 435444, 287895, 286497, 391861, 305853, 303174, -338842, -261810, -115984, 85460, 270764, -341018, 416157, -267366, 235789, -21900, 145853, -421314, -29348, -257027, -508169, -507529, -104534, -487575, 421096, -396623, 352609, -438936, -235829, -422000, 261811, 238691, -492506, 387699, -171964, 74373, -311694, 344001, 45196, -164993, -301547, 351797, 98293, 405375, 113627, 94439, -284955, 509760, 195426, -92623, 34512, -157438, -403019, 241127, -5210, 223631, -368470, 354525, -160429, 185597, -194719, -51850, 74252, 267500, -462052, -51369, -188314, 158414, 479502, -413610, -274585, 508847, -471711, -261342, 441317, 126982, -215254, -274290, -273820, -505351, -123142, 173095, -222388, -89369, -158789, -506488, -112038, 442077, 501038, 220906, 274131, -75320, 126291, -220595, 150882, 446550, -453470, -328229, -494305, -505175, 335459, -155159, 470365, -460863, 409070, 344651, 363668, 162225, 45620, -105411, -325582, 239777, 110919, 170772, 388011, 14833, -396566, 127372, -449718, -1730, 394076, 248665, 84591, 30304, -109073, 312762, 16339, -230273, 198410, -506114, 488359, 326081, -337087, 287696, -185378, -501896, 71020, 426976, -483456, 240510, 198335, 111066, 103347, -358524, -157208, 185156, -485028, 118932, 431641, 125040, 341744, -200137, -67268, -303580, -64198, -121086, 391421, -432098, -520773, -294988, -227495, -378929, -303969, 341628, -20897, -122899, -478476, -509467, -436360, 154678, -502165, 82973, -290762, 29358, 471484, -484359, -14796, 216189, 437158, 385562, -191705, 472119, -219177, 16224, 128701, -137177, -120793, -237298, 88912, -6209, 436958, -490472, -57622, 249449, -505454, 398529, -399709, 459452, -332658, 171498, -182167, 131499, 369091, 70523, -131974, -442079, -286054, -27783, 212705, -469648, 116162, 13836, 11541, -361820, 414526, 149262, -119464, -104719, -25477, -427088, 445140, -67763, 295750, 97802, -16601, -516591, 309987, -168357, -32341, -135307, -344317, -175321, 471310, 392834, -425628, 59456, 46162, -192012, -84113, 148647, 270281], -[-127978, 102191, -454009, -19929, 297878, 187874, -908, 142176, -34608, 60524, 240758, 333387, 19770, -172811, 107373, -282138, 488451, 11426, 395629, -452418, -194797, 42115, 178597, 157722, 480553, -469904, -286456, 36620, 192006, -109930, -504099, 486482, -6642, 396355, 254151, 425672, -193518, 117979, 344217, 132326, 322345, -74240, -250041, 442526, -128943, -186102, -319217, 63470, -314231, 99945, -448118, 254935, 245086, 336475, 92141, -436503, -60359, -56538, 216113, 403527, -126361, -337455, -45845, 132175, -368794, -8644, 431518, -329524, -278829, 84608, 438582, 197467, -202046, -464193, -93050, 39300, -506633, 325942, -304696, -158423, -479083, 455843, -57385, -356471, -366085, -301417, 394325, -411175, 454568, 213558, 206250, -448369, -68240, -183496, 29143, 251775, -443241, 22311, 301383, -369631, -189915, 212090, -199330, -102791, 386836, 177426, -65648, -405579, 506290, -20952, 468108, 427968, 393796, 206211, 190272, -225406, 520341, 366486, -285475, 213471, 474161, -409506, -269397, -112929, 211052, 181908, -361025, 444247, 10681, 162934, -241667, -167128, -141130, 223762, 516406, -434278, 316893, 254235, 407426, 316104, 322166, -157734, -103346, -390360, -276123, 82455, -324911, -154473, -320100, 26335, 417556, 142861, -118400, -48019, 324103, -488059, 114867, 453929, -128381, 392897, 131196, -152923, 374831, -491938, 21661, 436097, 253513, -107817, -340750, 420700, -82461, -436666, 348846, -314490, 223414, -310615, -381992, -223278, -37919, 128514, -182512, -378158, 90873, -259460, -361868, 186858, 449831, -47429, 221125, -241025, 271117, -292541, -232991, -418501, 51723, -191387, -186899, -192996, -206332, 283069, -417951, -424648, -446259, -435500, 271780, -374168, -196435, -323363, -100350, -285639, 252868, -56090, -3422, -442807, 238601, 231563, 253894, 169262, -477893, 464489, -504310, 193843, 489456, 284203, -61751, -273756, 227484, -225806, -407028, 91864, 450698, 282705, -179964, 94532, -450037, -164781, -264189, 381880, 5556, 339658, -376702, 335307, -375363, -49693, -412939, 433685, 92078, -179094, 173933, -215752, 394475, -421611, 194412, -213530, -126050, 467755]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] - -Proper number of hints provided. Provided: 32, expected: <=55 -||z||: 523427, ||z|| check passed -aHat: [[[7362588, 5894154, 5880011, 8096833, 132283, 2283759, 7503937, 2007765, 6714067, 1163014, 3501190, 2442769, 8314130, 413036, 6424373, 2894874, 1160728, 2574248, 7858974, 2221584, 788444, 1217899, 6574777, 1365724, 8131316, 2407711, 749969, 6116699, 3722572, 4990263, 7895726, 4936703, 4443443, 3083631, 1401460, 6829426, 6635222, 1002550, 6868719, 590467, 3062155, 1034810, 2791300, 6684181, 864545, 4268112, 6668335, 4959758, 6103038, 7923878, 3789931, 5845212, 7743477, 279588, 2220977, 3677481, 6465489, 6272993, 7205613, 4566541, 4730453, 5990791, 2366814, 82511, 2928011, 1927602, 2156905, 6817467, 3985005, 6199611, 4281037, 385889, 8628, 1405045, 4379228, 4571305, 4558323, 6828423, 1861327, 1089384, 8003355, 2192764, 5182493, 7397374, 4412405, 5362547, 1275580, 6720126, 4347740, 1674157, 5130420, 7644083, 238361, 4338101, 5039806, 6496887, 5977108, 8024923, 3538949, 1018072, 4443580, 5642240, 5955981, 5772264, 5672318, 5847198, 4377188, 644312, 83535, 1043146, 7391445, 3104582, 3667978, 4731339, 7243530, 3768184, 4953869, 5393736, 6761022, 3212393, 5728202, 1328754, 4337985, 7470928, 5016408, 6307694, 4589681, 4145735, 5363868, 6646807, 5212200, 5502628, 2695363, 2216489, 2712097, 2058591, 7014228, 3272176, 752420, 1380621, 2346735, 3538273, 3898878, 7293582, 7376394, 2478102, 8029360, 5255727, 240535, 5559974, 3757353, 4635218, 1103238, 293420, 3825591, 1119631, 1378076, 731944, 2652510, 8337704, 5222020, 5366576, 2409169, 8059973, 5839850, 3501388, 7922628, 5421756, 2627560, 5865313, 2040681, 7354278, 4738951, 209133, 4056371, 4604652, 6516621, 3421599, 7053857, 5368637, 3752760, 2846019, 2382761, 5481618, 2348337, 2996413, 2126240, 8255689, 204169, 2247633, 1740745, 7498380, 1256707, 2351219, 5885287, 5113736, 2548338, 7145749, 3461299, 4160225, 5771799, 5799718, 7004055, 4114934, 4684975, 6956176, 5212552, 1920834, 2197509, 5279373, 996767, 8243318, 6434224, 8208305, 71818, 2638264, 7537229, 1662416, 6005920, 7377864, 456812, 2670945, 6816367, 8315745, 1958716, 93034, 744698, 7725220, 5902797, 3691912, 2657976, 3471679, 5882891, 310372, 4202355, 5624133, 3893956, 6965316, 5246078, 5629663, 4805644, 5970337, 2035740, 6463727, 2312018, 1363607, 3713025, 7622047, 3603965, 7773586, 3571800, 627625, 3130715, 549897, 7298176, 8359776], -[1165602, 3634040, 7110348, 6039535, 8209112, 8342684, 3376761, 2760752, 201874, 5788205, 6315920, 5758613, 4180208, 3498018, 4506185, 6197602, 4825715, 1413018, 4001908, 5200822, 2321616, 43264, 357657, 3357947, 5478400, 1625148, 7950715, 241908, 5817357, 6314876, 3963827, 2765806, 7187638, 5098494, 4495365, 4124864, 1563629, 6643348, 2155850, 813048, 5462957, 5416878, 5407763, 685417, 1482758, 2211367, 7400454, 5644271, 599228, 1192002, 3950753, 1943948, 4147278, 7709236, 4455786, 5969957, 4873849, 2497883, 7702897, 1951031, 2746827, 541648, 6820767, 4343169, 7809196, 3075663, 2498997, 7516711, 6073110, 3812366, 6180662, 2140253, 955825, 1183827, 3824805, 961270, 2848570, 553317, 945650, 846350, 7115358, 7684494, 3452277, 2829465, 7560733, 7765663, 8046459, 6122871, 2186559, 1063033, 8249483, 1394306, 664161, 7734307, 4722290, 3791427, 2435952, 263490, 1006165, 3331598, 1364040, 995391, 2074495, 1907554, 2358279, 2270487, 634762, 7962901, 5614697, 5786521, 5116667, 1430717, 7455972, 2533159, 7947550, 7739229, 4927600, 241260, 7369022, 6744571, 6680687, 1961030, 2093028, 4786791, 6246262, 4051533, 3634060, 2403470, 2802259, 3645990, 6976210, 4921899, 5421392, 2002756, 6710071, 2947573, 1575303, 4408913, 1184854, 3248924, 8314261, 5273575, 2035537, 3057717, 4276424, 5822730, 2723413, 7019988, 818534, 2429970, 1355058, 7224104, 2099984, 7006142, 1252024, 1322417, 4242718, 1761064, 2157891, 4952775, 2413792, 4326818, 7109905, 5383105, 6756494, 6255540, 2899390, 3086583, 7685346, 4041101, 5334956, 4513393, 6517963, 4356627, 2904889, 2415412, 7209635, 6858378, 3366617, 2446291, 206235, 1998054, 4488129, 4659437, 1338118, 4922652, 6007451, 5557143, 4798024, 86509, 3799432, 5945739, 1001428, 7172374, 2827278, 7428682, 963842, 7199121, 6413373, 6585976, 4442989, 8150284, 459638, 1681794, 4346128, 7943864, 6962572, 7466591, 3401623, 6306091, 4245753, 5519446, 1599041, 2410812, 1955008, 5812175, 7440355, 253888, 4607519, 700571, 7817367, 5129683, 8046724, 1180791, 5121466, 8184965, 6029940, 3191617, 5335654, 7208397, 7752286, 4052684, 1826096, 1681526, 5923139, 4148306, 4764105, 1496019, 8215829, 7787085, 2322997, 4716898, 7780010, 6832169, 5960634, 644622, 2145941, 7046161, 5644191, 5390778, 1364486, 3472707, 4379141, 897129, 6882711, 5430079], -[505114, 5838411, 458830, 7979075, 5670264, 428930, 2058328, 2485778, 858513, 4171598, 771049, 4557941, 7078960, 246752, 7657596, 7311947, 7436757, 1653825, 4568902, 3837170, 6749455, 5267730, 383035, 3909375, 5270349, 145041, 3920578, 5361952, 4096288, 6984536, 259924, 3272990, 884519, 98442, 2659246, 3976976, 6318032, 7515034, 4097893, 7421103, 6440169, 5112475, 827215, 2064256, 4377010, 3093679, 2450524, 3787473, 5776436, 276928, 3714652, 2110852, 5493568, 6075210, 4651349, 3731505, 726674, 1143540, 6882240, 7156679, 4538267, 4665241, 2801764, 7280180, 252381, 6983846, 682666, 745105, 2200604, 853536, 7165497, 7160843, 3730324, 4436126, 5617625, 5189944, 2914093, 4496979, 3516525, 13047, 2428412, 5364195, 1016854, 498020, 4142253, 2140607, 3152766, 1112431, 1234741, 6955238, 5169676, 4631628, 3054791, 2087732, 2465428, 463256, 7167142, 3603646, 2464664, 7639896, 3371774, 6442849, 8136564, 6870187, 7619253, 5091511, 5544448, 7282816, 2676623, 4346091, 7355838, 5624071, 8357150, 7743875, 3316444, 1125481, 2162453, 5269410, 2538916, 7800595, 6026549, 1027938, 4350245, 6420015, 6184288, 6310221, 513821, 7559827, 3953617, 7806425, 5631665, 8280539, 7310264, 2319526, 3949448, 7788157, 7304291, 4928684, 1680833, 823594, 4935571, 1167600, 3779509, 740800, 4440378, 8349898, 2763210, 4889870, 2000015, 7944716, 6271045, 1226933, 5970183, 5409407, 7578268, 8035409, 287674, 5050922, 5844110, 3363, 611252, 2169335, 4209434, 2939101, 1571908, 4275336, 2598254, 6241832, 1325770, 385487, 4351117, 1453115, 25983, 316062, 5096263, 630583, 4570252, 4936580, 777653, 1704006, 707311, 7275667, 5596671, 5821069, 4340668, 8138438, 1949494, 2708823, 5573315, 3015582, 3160028, 2104984, 2106968, 997833, 7668145, 3397302, 4011508, 8157055, 4272834, 6214778, 2211064, 5927928, 1509789, 2125254, 4311991, 5758295, 2999602, 436929, 7424939, 5140240, 7850182, 8208723, 3265879, 2990560, 3494414, 6411512, 1900577, 459225, 2630952, 6593861, 49107, 5564964, 5578656, 810329, 966231, 475707, 703117, 3318228, 3963650, 7675122, 7329663, 3802392, 5855827, 3823188, 2190891, 5445224, 3779374, 3656226, 685799, 5635990, 2857226, 6878675, 3196110, 1046190, 3346555, 3616861, 4973370, 4549612, 7920465, 6300767, 6214323, 5943331, 3155418, 6850125, 4388611, 8062733], -[4737550, 8048528, 4107210, 984588, 7828055, 3274280, 3026894, 5446031, 1903226, 4956883, 8190333, 4285655, 2638668, 2865996, 4366557, 3105262, 3050745, 4540210, 4219641, 5892592, 709806, 6565870, 4668530, 5135327, 275888, 7605568, 6673552, 1174721, 7568946, 4591818, 1071126, 8224313, 74878, 74221, 2650921, 4930059, 5880414, 4860806, 2147990, 5198647, 4458108, 2010112, 3173104, 1823603, 3789165, 5433558, 3378967, 6728625, 7750219, 7182116, 1083409, 4622439, 2706515, 3724290, 4638369, 3629000, 6883744, 5463586, 4104599, 7196998, 4588331, 7691203, 3385192, 5993936, 3219116, 6254121, 4654236, 1134965, 781900, 6078201, 2502042, 2931972, 1709475, 3753804, 4495032, 6564477, 2889019, 1836204, 4419335, 5745087, 1956861, 3165674, 4437600, 3788057, 1494209, 6957226, 3888012, 2305134, 7808636, 6002347, 703111, 6146887, 1123396, 5867795, 5863886, 6860181, 3344048, 6844232, 2344697, 4691877, 1789836, 5604384, 1562372, 7671115, 6494182, 1077688, 5226722, 2222305, 3448059, 6964631, 735555, 1806530, 5128669, 1247084, 6891051, 3774502, 7071578, 3121229, 1390498, 2776435, 6047796, 1999364, 1255580, 7607344, 7487697, 5815697, 863222, 1565596, 6748431, 1788600, 72186, 7635313, 5640986, 7492486, 3364616, 7606064, 409134, 6373849, 5230143, 7269209, 2543774, 7937739, 6835221, 6297779, 3076839, 8243484, 7723477, 1793471, 8167778, 8014589, 2403828, 5272056, 5922292, 5848470, 8119959, 450362, 308340, 6325036, 2715525, 6139470, 702951, 6830200, 1533969, 3208189, 1386152, 2695572, 57146, 3124851, 1632590, 4710462, 2775192, 3937636, 6035512, 2449625, 2783071, 6480750, 3948025, 263952, 5958995, 726354, 7321928, 114339, 2951138, 501832, 4168598, 5687147, 4092669, 716281, 6468313, 1362399, 417794, 6906556, 556054, 7136725, 52745, 7134021, 1704569, 3708079, 98924, 4655931, 3221713, 7343215, 5560813, 4012560, 4777943, 6446589, 6919466, 270230, 2721190, 366025, 2143534, 7839290, 6596444, 1110038, 6822107, 1065872, 3706207, 3491453, 3803748, 796242, 2519451, 6221889, 1420897, 4848962, 8184104, 8263501, 2413988, 6794431, 4461693, 974563, 7867085, 7222624, 1972281, 836427, 7662464, 3687427, 6341463, 6338951, 2921150, 666362, 2709451, 190938, 950143, 1638819, 6705582, 2585679, 1043943, 1029106, 4998840, 2916442, 1752930, 3870477, 6481668, 7946008, 4607663, 6870304], -[3182745, 7923767, 1881512, 5666672, 3725183, 7462747, 7512841, 3948754, 5560866, 7478113, 6686399, 7110333, 797427, 1413528, 4434905, 7426521, 1283785, 1070493, 1926052, 8278452, 8265172, 1683308, 542918, 7668523, 7927651, 5086113, 4245564, 317320, 5063224, 1953522, 4149499, 2179866, 1171448, 1348595, 2384817, 3328575, 5991176, 5141331, 796992, 8111744, 3228087, 3301218, 5012175, 1234729, 5215828, 1741330, 7922946, 6785795, 7014834, 6806591, 7910423, 7715642, 5790481, 4022203, 516672, 4836282, 2151373, 4058635, 6913047, 4275635, 7705427, 6604590, 7387829, 4974745, 7088812, 726735, 3962405, 8008208, 3429879, 1001561, 7385419, 7303017, 6466025, 6802630, 1311406, 7894483, 801809, 3657355, 2115056, 1344905, 3633466, 7685224, 96567, 264529, 1075988, 471700, 183406, 5781459, 8045067, 1116420, 3171056, 6637936, 5732809, 1887054, 93787, 3230012, 2221408, 6731629, 1491280, 6268918, 8069406, 5352542, 2545514, 7361499, 451578, 7885786, 877656, 4628491, 377192, 6953835, 315440, 4907243, 828374, 2615419, 1854080, 5685022, 2738003, 5161035, 877231, 1098777, 7032050, 2523581, 3054229, 7813041, 1301105, 6898779, 3840160, 2323483, 1844776, 3404360, 7510288, 6357935, 7146518, 6628141, 6328184, 2520575, 5841325, 866922, 7180389, 177690, 1900266, 3452835, 2801045, 565750, 7754166, 1207281, 6471304, 5121119, 1736165, 4541924, 2636272, 1752922, 1904579, 6224522, 1807637, 82904, 3077493, 8006917, 6490757, 5522252, 4050886, 3566680, 6799970, 491862, 1829545, 408681, 5167759, 1959073, 4349577, 5517453, 6466427, 6302192, 2422246, 2450064, 6908661, 8272082, 2438312, 577615, 1999103, 6918755, 332211, 711329, 167323, 3256704, 3837251, 7547988, 2158614, 7326568, 5929825, 794757, 7416099, 7528374, 7899484, 4632900, 39588, 3289222, 1066677, 1527274, 6664095, 6906679, 3396863, 2394333, 8096684, 5608590, 4118079, 586518, 4624671, 674078, 617689, 1932984, 6883298, 1980929, 3092564, 5677999, 5254077, 3137360, 965539, 7824182, 5587505, 8242425, 2839164, 360951, 6365190, 12294, 4257900, 1861151, 8334802, 1955050, 4610407, 3205026, 6050521, 3482675, 4673330, 3462746, 7699439, 5489040, 7570779, 6320951, 5133500, 1169752, 5126912, 1454446, 7050478, 4473394, 7308745, 4509160, 3086393, 7483219, 6966811, 4270475, 3829510, 3489376, 3900039, 1472046, 1058760, 4635091]], -[[4783728, 6971984, 6014887, 8177505, 2661206, 5057619, 7104070, 3267204, 2545438, 7808587, 3806208, 1770766, 2076486, 759003, 7539833, 5957880, 2470481, 7257792, 4742953, 4277194, 6602243, 1059796, 4449907, 8068219, 3526629, 1643952, 6556480, 827697, 3586264, 2296454, 7709521, 3871087, 2601231, 4725657, 3978602, 6732125, 4229320, 2053968, 8041951, 7480195, 8281206, 2895434, 4591112, 7379399, 779364, 5507469, 1000837, 7390737, 1666993, 2419123, 4704287, 3243057, 2378154, 4722433, 353944, 2499271, 5904704, 4714191, 2445013, 2827027, 4037839, 4250606, 6845118, 7338574, 2680409, 3271621, 4144600, 5730330, 6299637, 4456499, 1946830, 7962633, 6358559, 1840663, 661337, 3143481, 6856208, 1699830, 7503606, 503423, 4630460, 152989, 5237847, 1852456, 6345160, 818405, 3829701, 23091, 4606903, 783136, 1293595, 6016578, 5807955, 5188939, 5040811, 4049759, 6672616, 4135481, 771424, 4304911, 3339854, 2623875, 1065712, 2875069, 5038555, 2139921, 1368674, 1012534, 1936027, 7272741, 7757387, 4745078, 3661691, 1153798, 1255846, 199994, 1731000, 7662338, 3467728, 5538529, 2194099, 1523320, 5721876, 6925561, 2897407, 5464133, 1065994, 4422408, 5924958, 3441380, 2933156, 850645, 2104296, 6790780, 6426416, 7457680, 7263847, 6124308, 7207235, 8156450, 960128, 5440223, 8154437, 528374, 7583538, 1116435, 6455056, 2760370, 7118778, 1668287, 8090940, 5227125, 4035129, 39516, 3467642, 7472954, 5705942, 2431326, 2631238, 7663266, 563127, 6309747, 5962833, 7973041, 6713059, 1486236, 7200264, 4726754, 4356790, 1700066, 4037329, 5613675, 5401752, 7917892, 3807897, 3206110, 2577303, 2406821, 4512060, 6574960, 96202, 2439024, 210204, 924092, 6263422, 7741747, 4336261, 603309, 1378288, 994890, 546283, 7232013, 5160810, 1430806, 6877074, 6483400, 111382, 4582588, 1773061, 5139852, 4690217, 7689478, 719824, 7076728, 6832204, 8326250, 857254, 5440343, 2746930, 6003197, 5905397, 5111132, 6264746, 3532368, 5919685, 2442829, 6063805, 368540, 8273404, 2175101, 2550107, 6515260, 7028186, 4199062, 7775558, 5884433, 1631362, 2852704, 4100370, 6890550, 1329759, 8008976, 4332620, 6850824, 8324088, 4462596, 1489470, 5336156, 6394613, 2701408, 2903586, 3809008, 333561, 6178734, 5968284, 1644749, 4620162, 1735123, 551435, 5368725, 5238528, 6456315, 4157935, 1173210, 665836, 5654516], -[8066863, 2276547, 6953891, 1462440, 1176768, 1864632, 2710075, 5604281, 2414955, 6704923, 6283663, 639890, 2039091, 4836437, 5210445, 3247845, 6357339, 1958002, 1255963, 1428875, 2984969, 3889466, 6545848, 4486978, 3679093, 7966850, 1439790, 1277904, 3514871, 3145422, 6610604, 6005866, 3156548, 3352067, 4849802, 4988199, 4784287, 5210118, 2020445, 4169917, 1534423, 7100134, 3318134, 5572433, 7518875, 7198171, 2956025, 3171352, 1241811, 2463028, 3136555, 314147, 1805312, 770262, 1806058, 1398905, 708495, 5610281, 4607891, 2953617, 6605103, 5923007, 8038834, 6563577, 4189426, 325266, 8004516, 3649422, 875634, 4463363, 4581655, 8291003, 6045720, 1404232, 1398626, 5310796, 3879650, 2730511, 7226217, 7237437, 7890020, 5175883, 2383216, 5258581, 7548550, 7944568, 8058776, 1966785, 2059705, 8002221, 6688122, 5546498, 7386599, 5543666, 8166202, 634868, 7785138, 5112402, 4391601, 1405198, 3876236, 700375, 774524, 1067817, 3530973, 7103543, 1658058, 7099410, 3876423, 5221750, 2506199, 1724209, 2505794, 3098281, 3698308, 6709122, 8358058, 1385435, 7997912, 8253954, 2920582, 4834713, 6910866, 2306372, 1793155, 7657132, 5049787, 6595121, 3127920, 5591306, 2295253, 5963191, 73680, 3367601, 4053080, 4681502, 7238248, 562430, 4492708, 3607751, 8081555, 5924787, 4950987, 11133, 5363299, 6000270, 6084419, 2714066, 4947097, 164583, 4554139, 8268073, 107772, 5060501, 1275028, 6853258, 4992988, 3350803, 1354897, 6790678, 3139078, 1803038, 5791372, 6623993, 5723158, 3833357, 6459385, 3472174, 2658743, 1093908, 496510, 6388363, 4438387, 6808811, 6472602, 4250950, 1210704, 473341, 990, 4054888, 5717684, 7198170, 1266928, 8059271, 7621431, 1386190, 189584, 1723579, 7635318, 2899180, 260145, 7512010, 1228060, 6001604, 285320, 1334911, 6642978, 1488782, 2552255, 7007241, 3169970, 7348415, 8042986, 6565085, 1293318, 3652276, 2853254, 5192005, 5855669, 4877132, 2615501, 3590133, 2666689, 8148427, 4477653, 127761, 8318770, 1015078, 3768226, 2872895, 5412207, 7111904, 2186685, 7252906, 1955024, 7155630, 1064021, 6217860, 4795666, 6325131, 1605563, 7661337, 764032, 7809716, 4454657, 2572843, 601248, 4524304, 4625812, 2128539, 7750618, 4626730, 1457655, 2810869, 2557993, 4701640, 5409177, 3199315, 6993950, 736152, 1566925, 2974952, 2932134, 753397, 1063094, 2739865], -[6069280, 786561, 5788053, 7004517, 5662557, 6086849, 5955012, 6661186, 4502014, 6473239, 6286892, 7779376, 3960194, 5199936, 5904044, 3537710, 6432962, 7310589, 2630838, 6895247, 867362, 7735717, 3243253, 1043486, 5029787, 6048398, 6849665, 1503762, 5282307, 2131544, 5988162, 6409504, 5291448, 5925297, 6789632, 954809, 1203466, 4849304, 7822917, 471221, 4834366, 7157450, 6259952, 7654366, 430249, 2204218, 8005943, 5964295, 3259679, 4184293, 2663704, 3904292, 7661201, 6897985, 2044288, 8020374, 4594341, 3392810, 1160388, 5795120, 3554426, 4788605, 5800154, 5862918, 4672815, 7452081, 2218410, 5849841, 2197862, 2132099, 6402181, 8374792, 2125942, 921718, 4165551, 8260450, 7796138, 796494, 2886414, 5321119, 4947345, 3236877, 6951953, 6526592, 1628982, 6262455, 2660342, 7346294, 8229148, 6408207, 6282327, 4081341, 8072854, 5375475, 3615723, 5189720, 7467751, 4107131, 1373551, 5614974, 1914531, 6283994, 297571, 4145939, 7401335, 99382, 2214250, 1240172, 4665635, 783655, 7194557, 3989406, 2787997, 1351695, 5266414, 5529245, 5509100, 5094490, 18513, 4629590, 2975864, 4277507, 6727672, 4032433, 7425174, 2685773, 4580873, 2305987, 3801267, 5461311, 1286936, 887206, 4667145, 5849405, 3898691, 75545, 8152764, 7039378, 6765387, 2385854, 2354367, 3159157, 3957469, 1137864, 1644241, 2531833, 3795721, 5778535, 7174456, 363838, 3130965, 4897176, 1535548, 6912009, 3363853, 1977335, 6497406, 5744455, 1828820, 6428542, 3601627, 2055614, 5604306, 4380000, 8258168, 25927, 7036092, 6507512, 2017607, 358102, 5434520, 3438661, 113207, 6073558, 6639252, 4912358, 7591987, 113731, 4703841, 3520752, 5768651, 7245068, 3843634, 528159, 4613596, 5114216, 3970761, 6394271, 1340462, 5187874, 2379454, 1797350, 1236708, 2448333, 7898900, 2276396, 4830019, 5117577, 860621, 4367704, 2524593, 5376756, 3500069, 1565198, 3348738, 2240329, 5081492, 1979726, 5590062, 8046913, 1670529, 584010, 127627, 5686031, 5440992, 5305550, 4014619, 6275190, 5341203, 6330134, 554771, 4177209, 2776280, 5563010, 4266615, 7284994, 3612073, 1981711, 7714091, 5178552, 6367281, 8134955, 3320308, 5043133, 3278310, 2943552, 6868195, 523399, 4054288, 5040244, 7036937, 7942539, 1977036, 5206411, 8292922, 7705689, 4654827, 5197558, 4973709, 2810963, 7244980, 6707947, 7041430, 1906648, 6566226, 3336865], -[5498961, 3744343, 1744591, 5771093, 1864086, 4169853, 5658067, 4505424, 8150478, 7052887, 7870657, 1455412, 8302721, 7510991, 6598293, 2502409, 1335072, 7513612, 4113743, 7983594, 6490596, 3082834, 6248491, 2816095, 5491352, 6351453, 3296646, 7066756, 4723574, 4757057, 2113200, 5156556, 7460681, 6526525, 3419436, 6777718, 6280905, 5940362, 1094782, 5222245, 7930128, 3012655, 6716714, 6599948, 1583851, 3724142, 2818617, 2850875, 4138492, 8027402, 1516295, 2512587, 3812883, 8218814, 8162204, 5342183, 6750511, 4696407, 6803811, 1988193, 6091411, 7837713, 211996, 3448033, 1374581, 976456, 2812510, 1908666, 553685, 2500778, 817995, 1068761, 6448402, 6380704, 8275844, 3864181, 4302496, 6281736, 6763764, 5508602, 264175, 5574015, 5532235, 7389155, 2748919, 107113, 4663132, 6341737, 6870072, 5019670, 2096477, 3078101, 7832196, 8212188, 6002403, 3961224, 1022779, 3006576, 1456670, 807086, 4074388, 329339, 320394, 3570120, 700366, 20195, 3039428, 2769464, 5951510, 6652555, 3042228, 6138697, 3578518, 4472499, 1534404, 2329442, 7208779, 7899268, 8104804, 2483795, 126283, 4975627, 684731, 4440872, 7127495, 33891, 3289351, 655367, 6101208, 206382, 6542372, 5039864, 4823641, 4274797, 2726829, 663536, 7979752, 1555695, 6783797, 1229642, 7519661, 1286734, 2195679, 3117595, 4168892, 6606401, 1061616, 7993894, 869368, 903121, 2991582, 5284940, 6716780, 6641056, 5780271, 2915600, 1839726, 3001351, 4647152, 2946995, 6677256, 1172372, 6765190, 4063711, 7901806, 6386293, 8294540, 6018028, 1247505, 3323246, 8367651, 3268039, 4310569, 2209106, 1733101, 756094, 8028059, 6778338, 6874701, 5488160, 8300304, 2770662, 2311524, 6479013, 4057369, 4642291, 4362855, 7828383, 3687462, 4062397, 6279028, 5364579, 2024472, 3751830, 2711820, 3441194, 6676558, 6812744, 7244993, 209736, 6694137, 3154568, 3435127, 6042054, 1194914, 2951767, 403232, 5587109, 33729, 2708887, 1030025, 8132680, 2646203, 3914926, 836118, 910415, 1821453, 7722119, 6593151, 1205785, 7922844, 5807142, 4283310, 7294327, 1829714, 50252, 1990379, 5640297, 4490746, 4368218, 3251255, 1662411, 3745168, 3500747, 8336978, 5128531, 7320958, 7862469, 4072320, 5691883, 2571366, 3219349, 1510569, 2516773, 5940350, 3387660, 6337468, 6934862, 312194, 828437, 791029, 2742082, 1546571, 5373646, 6816652, 6956156], -[2706883, 6107658, 2033281, 149036, 7821344, 7618267, 686404, 3122621, 3424931, 8027036, 3253496, 4006038, 5827876, 2757145, 2872066, 3593383, 709073, 4114020, 5456743, 6845074, 3783977, 6261953, 7970062, 4667178, 8136437, 5750337, 4656847, 6952418, 2587384, 6887713, 7810529, 1780929, 753606, 2275676, 612064, 6448104, 808719, 801756, 2829692, 7711220, 1621088, 5280589, 5208048, 6393153, 2166081, 883875, 2952260, 7639185, 3355900, 6046584, 3780765, 3564901, 2865078, 303996, 1271372, 4155238, 7585920, 4988568, 798245, 7457732, 3762200, 1400054, 7181915, 523096, 1931365, 1351934, 1737272, 865423, 3172989, 6053719, 7636159, 467009, 4509368, 6447320, 1550112, 5947812, 499992, 692865, 4783736, 3650377, 5519076, 5961849, 358983, 7701352, 797875, 1095094, 3352836, 6015037, 7100354, 3647501, 665289, 4871147, 3042964, 3079407, 1312918, 475735, 6751692, 1882853, 7471407, 593463, 11529, 8074676, 4723326, 6864326, 6013734, 6886115, 8056384, 4349000, 6693745, 3658231, 4727183, 1971070, 792094, 733930, 4348085, 4274492, 316772, 6716258, 6008478, 5862368, 7049821, 5308795, 377484, 5088101, 7636168, 7977524, 7301851, 3156726, 5177329, 2376995, 6419290, 3736612, 7377811, 1306488, 3038888, 4000595, 2855928, 4837253, 4395901, 4576679, 7217788, 6185416, 1001037, 5191043, 3798707, 4149318, 364114, 5980282, 4587427, 3182283, 5645971, 5140737, 4236253, 2139408, 8186791, 5299901, 5312470, 8129822, 5039512, 6575348, 6478803, 6403735, 4002444, 1936281, 5000116, 6164144, 5136625, 7688293, 3440341, 2121264, 3082570, 3421380, 5767638, 6039803, 5869953, 7633856, 5134523, 1968935, 3550880, 7743494, 5236382, 7963736, 538658, 2280489, 2013995, 3077635, 4470065, 285895, 7145945, 8326914, 4326691, 690634, 813715, 5964350, 2949462, 2680371, 2410776, 4746615, 1998581, 5688363, 2363801, 1221648, 2275376, 356199, 857919, 467255, 5163249, 7059089, 576882, 2054238, 511790, 6716965, 6085599, 1217785, 2654120, 2123398, 2388468, 4442586, 6724623, 8134692, 5922416, 243561, 3617046, 2128155, 5505463, 4605385, 8074696, 5203530, 4218433, 2923506, 5188224, 3391883, 115376, 4208181, 1542787, 5187153, 6897608, 417467, 7675178, 5615279, 3425487, 6183386, 6412622, 3607594, 7309397, 6388238, 6805714, 3802317, 6495527, 2776801, 5618297, 7142175, 2039870, 7099895, 98307, 3001133]], -[[6330270, 1454956, 423737, 2159708, 1513591, 7712820, 115013, 5887469, 7164689, 3696178, 3506877, 2991733, 7361799, 3734448, 3001686, 552496, 4833882, 5442740, 3186992, 2546018, 3145068, 1456267, 3641653, 4939672, 2437722, 4892978, 7660632, 3404679, 3831172, 5633959, 4637762, 6548006, 6404029, 5138119, 1325226, 1743657, 5530757, 1548832, 3889476, 7964715, 1939371, 6307460, 2189375, 324282, 5822982, 5586623, 5720658, 7195023, 5866904, 4218349, 4549351, 2999240, 5235855, 3489149, 1408098, 4258620, 5301432, 2741642, 3654318, 4047127, 7720661, 4669693, 361599, 4426208, 5187429, 4952014, 3466344, 7144652, 8359724, 1624306, 4807431, 5234298, 1347029, 2531667, 8106340, 1956221, 4789762, 7496255, 7429973, 234768, 1472055, 1355311, 4997676, 5045709, 908721, 6825370, 4642962, 294904, 6254821, 5917487, 6000892, 2347302, 6904351, 641935, 4308009, 4449497, 6411961, 5002678, 8083598, 5077603, 3872456, 1225553, 7013437, 4638647, 3400976, 5650904, 305831, 4664881, 4290336, 90854, 158438, 876490, 2019619, 2501688, 909885, 1174293, 5979252, 7918656, 2240271, 3486929, 7005313, 2080094, 8313834, 7652267, 216296, 6093751, 2249792, 2176829, 7091446, 8087299, 3970149, 5606280, 1935193, 4466000, 6319863, 2903164, 1099999, 5289087, 6008611, 1341323, 4574467, 3698977, 6779774, 139285, 7075654, 2657246, 168183, 8096963, 5921968, 5559722, 2976993, 6413315, 7304274, 3245566, 1563612, 4510037, 1115062, 7623236, 4566826, 4406596, 5688285, 3420670, 7675720, 4912627, 7553466, 8284383, 3187125, 5780671, 6192043, 195955, 7542069, 2810170, 406156, 785539, 3673950, 1804554, 3016856, 7492345, 7336667, 2860266, 1126645, 5167401, 4448004, 6073815, 3561815, 2695219, 4958808, 2687906, 7488828, 2685417, 1336244, 6869406, 3120405, 3695941, 5604386, 6330750, 831509, 25129, 6871162, 5861696, 152639, 2359904, 4722231, 7073822, 8308080, 4967281, 5766956, 5240112, 3153127, 6616375, 1026933, 3708584, 2358726, 4465843, 1652766, 1096144, 4531127, 4429608, 6375569, 661834, 4918162, 1282278, 2461399, 6192681, 1939023, 5458632, 2632001, 3213576, 1034747, 1547586, 6460208, 6815552, 7071815, 1920284, 7359009, 1805220, 5795512, 3119817, 5260222, 798702, 5058639, 4104107, 3428298, 1875929, 4235280, 6510990, 7413056, 6698208, 4122961, 5356759, 4118102, 1537891, 6915895, 1690716, 7979033, 6968560], -[7778909, 2376505, 5705894, 7001665, 7006783, 3119948, 7174790, 3324582, 4879255, 2202767, 3223028, 3489505, 1002176, 802077, 987670, 8334799, 7671516, 1219791, 4902528, 7323348, 1408958, 8188387, 2694154, 6539988, 6877294, 987408, 7749589, 8117883, 3187316, 7247024, 7949907, 5066592, 4464910, 4039277, 6654077, 8355179, 4486096, 2573916, 1840967, 7879578, 7336711, 4887639, 1028949, 4553191, 417631, 4345900, 1474218, 8073757, 1065141, 3102695, 1238196, 6898487, 1286262, 7510350, 65158, 3485092, 2265654, 247118, 5459601, 4851987, 1923012, 8254284, 1736083, 392521, 1112755, 744483, 4433242, 3594617, 5950574, 1476868, 2905011, 5369434, 4323951, 1054651, 5022564, 2735151, 2473985, 8028893, 713727, 7661374, 7190702, 1511366, 7302453, 5915234, 7156667, 5524142, 5730767, 8164864, 4075995, 5937771, 8086714, 6277311, 6873804, 4717641, 3450221, 1101239, 6311607, 5437737, 1690483, 7446255, 7969006, 301218, 2534440, 7544895, 5450227, 5190944, 179586, 4976218, 6495715, 8194838, 3089964, 6251122, 2602138, 7870696, 432603, 5413960, 2382594, 1839889, 6628828, 4789381, 5421227, 6032337, 2660524, 3725236, 2375595, 5342963, 6521205, 4213417, 127186, 2786044, 1087252, 7334616, 7556590, 1969610, 2263517, 3983278, 6974102, 8101879, 1006484, 1624818, 304226, 6189820, 2594714, 4055729, 4082174, 1361946, 1073827, 7194312, 4055353, 7017060, 401660, 4980368, 225508, 1306914, 2052827, 5120555, 1981558, 2600708, 1507442, 329580, 6497387, 4717951, 3984310, 7735049, 6846575, 3205084, 8216244, 1404151, 7467268, 2807166, 4926364, 8002996, 558406, 5302746, 5815973, 4147201, 3938592, 4937725, 4803551, 3011727, 3016473, 3271680, 5659332, 2463357, 3468841, 1749698, 2471092, 7144971, 6853372, 5237373, 3246937, 5183478, 24281, 8304938, 7954491, 845176, 94984, 3175923, 4768148, 3926602, 3569357, 7750878, 6064424, 5417549, 6455730, 2846210, 2299373, 7714729, 3515480, 7849802, 6254766, 3362353, 89459, 5677227, 1734621, 3648915, 5402276, 5404272, 3154996, 6872897, 3034685, 6813239, 1078226, 6101522, 344678, 495751, 7995446, 5479386, 5961278, 4759670, 3566164, 4377043, 8007414, 5747008, 7561578, 4193586, 2449295, 6707004, 5073914, 6095819, 4994453, 5698380, 950247, 2371787, 5277843, 5637896, 7072035, 4519320, 4177253, 6456011, 3230181, 4709766, 6500089, 4159676, 4767674, 2090556], -[6733706, 926973, 7440093, 2663003, 2885064, 3493636, 6427357, 1756830, 5039307, 998353, 2988787, 4628476, 1053438, 5718420, 7992678, 6883699, 1556450, 85406, 1688332, 6903853, 4145683, 2748859, 3164167, 4643069, 3914397, 1302155, 3083963, 5254494, 4953560, 682047, 7131136, 4537490, 5718550, 5842111, 4523338, 6988827, 7811873, 5245118, 8017416, 2192129, 1374183, 4889032, 3431171, 2293299, 1457480, 4736841, 5354507, 5872480, 2154252, 6007014, 2564441, 8153442, 6260937, 2992747, 7203359, 2057538, 8221249, 2804693, 7060929, 7049215, 1431195, 64820, 564084, 2731283, 2704390, 7718181, 201478, 46170, 8230, 494290, 1373451, 4571303, 5528220, 2690226, 1371996, 5353841, 3331078, 5262318, 4885107, 3612338, 1976181, 5089590, 2018946, 5519631, 4993232, 3416794, 6128090, 6870638, 4208731, 2149022, 6410518, 5195682, 344330, 2950226, 1627439, 7488365, 3211341, 8035303, 4118832, 2398972, 148735, 5651689, 8214119, 6198613, 1023321, 2786768, 7540783, 311160, 4101310, 5528337, 5886986, 6638311, 6679982, 584065, 5181991, 7410612, 3364920, 1932601, 4777158, 5574736, 3285345, 7214832, 2647965, 4451462, 1406879, 6169307, 2147640, 3341243, 8051930, 3006111, 4535721, 3397273, 1314487, 8027588, 4079841, 6951762, 4256579, 1192584, 3907184, 7633046, 1081349, 2095698, 2277431, 6105975, 405985, 999111, 4841303, 7722159, 4455440, 5708294, 1801884, 6383790, 1053072, 5988091, 7074310, 5373736, 7547283, 5752115, 3756446, 3040104, 4813460, 1546330, 1375397, 4908092, 2348872, 6850981, 3424298, 3675312, 1972150, 1397566, 7689066, 799810, 2986955, 2074782, 169276, 1482743, 2854135, 2665423, 4381323, 7419214, 4860664, 1431499, 2906360, 7471026, 6768512, 5686479, 3720092, 7277753, 8079727, 1567202, 5577755, 4341379, 3009512, 4145172, 7165286, 2593006, 5273725, 5740670, 1150052, 161472, 2053638, 692045, 5807281, 6280107, 7369698, 6775551, 1292501, 7991234, 3077, 4142691, 7415860, 257257, 518440, 7681279, 6646880, 2017019, 2086642, 2028074, 3190464, 526045, 7157190, 5524062, 8047701, 2870297, 3035812, 4195318, 402281, 2105737, 5011264, 7881005, 4057032, 7532788, 5987844, 7312500, 4426194, 5359613, 7990876, 2687749, 7594478, 5199859, 461856, 1849978, 7894395, 6001856, 1454774, 539525, 3536419, 3571220, 4662650, 5395103, 5349732, 2861267, 583853, 6626729, 8053319, 748134], -[2454817, 2654111, 1548093, 3331115, 7110631, 5228083, 5381632, 5276749, 7956392, 5670417, 2663957, 4750473, 1362459, 2962448, 2393072, 4967961, 711658, 4644350, 273514, 7185683, 5437856, 7132513, 4912223, 1665383, 1243171, 127474, 364390, 5642901, 1395282, 5399613, 300887, 6316927, 5005855, 5514589, 5325362, 4103884, 4941082, 850095, 2775084, 7950590, 5585182, 4738665, 421994, 736676, 4446109, 5809950, 7893522, 259465, 1752710, 2093770, 7535098, 2037803, 1229871, 4952152, 2545739, 6405886, 3500575, 470314, 1963958, 5930725, 5966233, 8199, 7628113, 4324801, 3199543, 1244885, 5236963, 2677588, 8257582, 2439038, 3455394, 4600568, 1785185, 137921, 2315132, 1389906, 5354063, 3810729, 3558803, 4680613, 8149292, 7670013, 6686411, 4932944, 4808847, 4242739, 8277304, 3574825, 164905, 6305371, 6374874, 4645793, 4562891, 6434869, 5941350, 6659054, 7369577, 4392348, 6958802, 2476646, 4302330, 476360, 7681944, 2619043, 4023422, 7774336, 8304281, 2132253, 8284264, 6230539, 2565910, 6543489, 568236, 6630336, 7319376, 5644330, 5769111, 1578097, 7964882, 4528012, 1480245, 4916577, 2050127, 7847391, 959289, 4045223, 1659784, 2836440, 3510958, 4299979, 5824689, 92769, 3804707, 2052141, 4500964, 3000909, 4085247, 2933600, 4640594, 3129846, 1784480, 8053068, 4863506, 5708248, 5753904, 1396609, 2722747, 7356071, 4497561, 3470858, 5544708, 3158970, 1161014, 5441616, 6391013, 6773387, 4575582, 457951, 421591, 1860963, 2657400, 8225709, 6901474, 6964849, 1908143, 85442, 8075706, 2544810, 90829, 6855527, 2426331, 8030955, 6844494, 8197106, 2242622, 3011343, 4298175, 2837158, 1885921, 4204906, 8350276, 7177152, 5806262, 7932705, 7333929, 5915054, 5201159, 7628727, 6943460, 3144752, 5210493, 4176720, 3242375, 462009, 6638935, 6270784, 25279, 5262985, 2488123, 7622880, 145165, 1768500, 7938981, 5219326, 7274813, 748642, 8300935, 7756637, 5049200, 8258472, 2273281, 5898329, 4697463, 4665382, 2246597, 6733589, 1052983, 5997546, 4177345, 5110113, 6574075, 7632371, 7659434, 1935810, 7710511, 183803, 5249303, 3186020, 6405053, 7344182, 4538540, 4833452, 4057120, 3242452, 7895519, 7226931, 7934277, 2708217, 1044453, 2548320, 3340485, 988372, 6634324, 6532876, 2289995, 6862004, 3015559, 8236461, 919825, 6016163, 6328129, 3268893, 2154208, 988763, 931812, 7739737], -[3190135, 7552130, 1601955, 3921408, 4234491, 319172, 3982766, 1796468, 3882553, 4458250, 2867390, 2203516, 5759453, 8197200, 7887673, 2995827, 6663882, 5237458, 4968465, 5859994, 199073, 558308, 6772185, 7988335, 8347660, 7068531, 4107666, 3093546, 2781610, 4557541, 2273987, 8292276, 8207247, 7464896, 3838579, 4530350, 1966513, 7879485, 1533195, 5490519, 7850269, 5842343, 587729, 5174182, 729989, 7903980, 6828155, 373454, 5837869, 2493876, 7565005, 1469823, 2210100, 3701870, 3685948, 1476975, 6110433, 5220459, 512844, 6963587, 3105061, 8323615, 5371811, 6631756, 5736247, 6728753, 1995154, 3474744, 3568715, 4514388, 4215669, 5585756, 2751338, 7963133, 3331921, 5831353, 6329828, 6461770, 4426838, 4565127, 5472199, 5955742, 3211470, 5789758, 7541722, 6133672, 4331942, 2437080, 2695559, 6580250, 5177788, 3281125, 6108251, 3106393, 4706627, 7317195, 5181191, 5205190, 69069, 5518694, 6864461, 7399356, 5390356, 5802377, 4067571, 6270057, 2561689, 1280023, 7486364, 1575229, 1952027, 301150, 3288738, 7877139, 2896035, 4187940, 6321221, 2727052, 6338338, 6301255, 10521, 4998555, 1610093, 5493676, 8145784, 3688299, 4895726, 3785847, 1825123, 2029034, 5334857, 7969574, 1383624, 894253, 2053112, 4734139, 3085259, 2788864, 746607, 6480155, 3183676, 4143229, 2500876, 468320, 670146, 3176229, 7553264, 7981919, 3799821, 2056514, 38792, 718605, 3106793, 4429386, 5595766, 7113154, 2643131, 7788183, 2888436, 1095296, 3222375, 4745399, 2108271, 5043623, 8170855, 4821877, 6174654, 7041470, 5245348, 3074535, 3638435, 8050301, 2355645, 6124164, 4523011, 483255, 2364747, 6353621, 1835924, 6048351, 8306765, 2395107, 7009493, 7122411, 8112570, 6353850, 1007383, 6877894, 2097261, 5683910, 6913026, 5886720, 2951936, 1901371, 6639915, 6737895, 7557221, 4611566, 205354, 1985892, 3400026, 2648465, 7953012, 4661420, 2221717, 5558519, 872439, 2075264, 5157945, 846054, 8113103, 3945662, 2604934, 5636527, 3662793, 1066640, 5939313, 1320035, 6721312, 8313620, 7009337, 4040364, 6232471, 956787, 6278890, 4662552, 5360931, 7814362, 3791671, 6823707, 1707885, 1394806, 7447106, 3848695, 2319877, 7476950, 1976209, 8075311, 3456759, 5367907, 4541907, 7662872, 6910127, 1477730, 2782471, 2641709, 2838545, 6481096, 7078058, 4583203, 480204, 8036316, 1056789, 6111504, 4385333, 6740885]], -[[8296797, 52465, 3796610, 4724918, 6338244, 4474014, 6861150, 7123395, 6462707, 2156116, 302252, 5143124, 4672729, 2723696, 1513205, 4809722, 392635, 6260953, 4376325, 1621199, 7566820, 2402256, 2350919, 6901866, 6214530, 6146902, 4707007, 2846800, 6062097, 2556226, 2334820, 355844, 7943967, 2308723, 5828215, 3483839, 8369163, 2265685, 719419, 5479314, 8376888, 410826, 1954881, 5514184, 3014741, 4230103, 7882638, 2224932, 2579948, 1057999, 3106999, 678900, 1122746, 6061650, 915320, 1899937, 5306433, 6294680, 3708804, 1359341, 1920866, 4218462, 5174855, 539290, 8034540, 7952545, 3396743, 315786, 715585, 422636, 4708313, 5944192, 1504691, 4540995, 3976253, 8183573, 1883727, 7188374, 7480187, 6458377, 1833832, 1904657, 6573810, 6527718, 6797684, 2792119, 3372688, 197475, 3081304, 3326069, 933016, 6915525, 87157, 3566955, 5561823, 4391334, 6850825, 302461, 1819859, 3276938, 2205410, 591220, 2383039, 3145220, 6524616, 5501109, 2349847, 3308330, 3230333, 3744287, 67539, 1549072, 2517458, 1612670, 4082395, 7179385, 3980495, 7661295, 5737954, 7603431, 4616988, 6760561, 1078454, 1625653, 7391031, 7729592, 8203515, 1156572, 6693505, 3561135, 6317175, 2115265, 610583, 8049463, 2766019, 2759847, 6240704, 3597542, 6057458, 931019, 7686156, 5436057, 4355110, 868582, 4203800, 6900925, 6055936, 7268890, 7881802, 8236246, 3676117, 1630731, 676124, 3731037, 2070280, 3746310, 7057476, 127640, 7318853, 8288568, 6129911, 6297875, 3774744, 2915647, 3077752, 846593, 1269166, 7148232, 1961624, 4790554, 1262381, 6184733, 1233086, 5578104, 151828, 7150665, 261584, 4415038, 653358, 3204417, 6246525, 866475, 3141111, 5168344, 7938220, 7816082, 6287233, 4206433, 3692248, 7240662, 1025229, 1615594, 10434, 2016576, 7843666, 4803863, 3467860, 167290, 8228782, 6659193, 704168, 6980769, 7430686, 3259450, 1511381, 2139726, 8137077, 5040272, 7823792, 1678237, 8082110, 2973174, 7715844, 940139, 4645847, 5631332, 3489271, 2128100, 5168980, 2547952, 3215021, 5987665, 8242221, 7329471, 1078367, 4571157, 1239460, 4671571, 3275366, 996845, 7358108, 2252044, 2333546, 2414264, 3572730, 5520266, 136949, 7591197, 6978547, 1363458, 3528761, 2706727, 3638751, 8035696, 212784, 7175946, 913736, 8211430, 5698258, 75940, 7653532, 6994542, 136049, 1034039, 1189888, 7177394], -[4011397, 1880785, 7891850, 698409, 4245392, 1421663, 5599164, 1277510, 5558267, 1751136, 6596381, 2929773, 1809160, 7116539, 4458697, 5959246, 5808887, 2050918, 2856065, 6097737, 1710102, 3609626, 2001421, 6742971, 3495131, 4711150, 7094094, 3229215, 36568, 2512614, 2564507, 4854921, 802426, 4393624, 340352, 1622241, 7126958, 1563992, 8277097, 6809281, 3195081, 3580472, 2461629, 218079, 4034645, 1968235, 2147423, 8019177, 7320106, 8005276, 6123014, 7385593, 277936, 8194003, 5760304, 2107052, 2615622, 516367, 2312003, 5955034, 1787182, 8095172, 3887855, 4187687, 640638, 7978725, 8185562, 2516729, 540955, 6472775, 5193904, 2752296, 6582205, 942413, 2818961, 4866506, 2221951, 4277193, 2111115, 3432837, 6076292, 1741550, 7499069, 1426486, 4152569, 4014945, 6994698, 5650348, 6347341, 4425495, 5145315, 2069669, 8101131, 2357863, 5093044, 6421504, 3915715, 1648145, 573737, 7216611, 3304610, 543295, 1997414, 5258427, 3953101, 3737285, 485362, 8334765, 5846273, 4889181, 6509973, 2091367, 8316002, 2398968, 7094082, 4345092, 2023715, 5016001, 2066741, 7352303, 6327254, 8156523, 941660, 5927950, 2601983, 1781232, 4427151, 4959084, 2072580, 577716, 2082049, 3436341, 3014571, 6891829, 5585665, 5096306, 5294262, 2386899, 6163089, 908847, 1805291, 4173772, 3376741, 3427672, 482237, 1855052, 7040587, 4810549, 2986725, 473711, 97968, 5676435, 366074, 1089416, 1817365, 6764007, 3675336, 7204269, 7929132, 1899448, 4211272, 5632165, 3712828, 1730038, 7516713, 2693532, 8010246, 3973107, 7427354, 3072003, 1606352, 3225664, 5871929, 7627270, 5640982, 3307312, 1570649, 6117143, 6013270, 7594597, 4143351, 6339687, 4205094, 2251964, 1979594, 7168646, 6736897, 1969715, 6162236, 5064239, 2812894, 290395, 8374033, 2809324, 7309529, 3515116, 5566499, 6848541, 2722726, 6893953, 5697013, 1265653, 2070705, 7760124, 8051512, 5119045, 5477675, 7049558, 6093180, 414377, 4970539, 7689238, 715700, 5033886, 1760833, 1508880, 5611590, 4087846, 2404992, 3799644, 601293, 8142275, 1135114, 7300495, 4312734, 1279811, 5680751, 228961, 8206888, 2110767, 7133363, 615, 2784171, 1723225, 545532, 5256952, 2451367, 1057001, 3959077, 8367089, 3105540, 4260192, 7412107, 6198174, 190267, 6919189, 1641513, 39767, 401407, 1876430, 6020400, 349752, 1626705, 6360185, 3565951, 6461574], -[7242661, 2470069, 5236550, 4898683, 3901521, 1706173, 3238195, 2576925, 7946331, 3899093, 3958814, 5092598, 3460889, 5188442, 3344886, 7933696, 5618187, 3486648, 5401507, 7183732, 3072386, 3855609, 2166946, 8211287, 7847588, 346129, 7253175, 992541, 1885800, 6454056, 7212910, 411178, 6258102, 1472940, 6379857, 7894984, 7319067, 8251981, 4929366, 183176, 5274985, 6699842, 8130315, 224760, 7022522, 7131064, 2655671, 6171539, 1576773, 3208983, 7675099, 3808447, 2441782, 2540789, 3740587, 4814679, 127501, 1673257, 7808213, 1475951, 6173640, 1528466, 1715297, 4712258, 4570829, 5136737, 1440039, 1359130, 8279151, 4227998, 4933202, 5760163, 1501029, 6801753, 864623, 6596439, 4089098, 494110, 5677163, 5995642, 6273835, 7721657, 788909, 6528368, 7239432, 3569719, 4209787, 6636688, 5618759, 5585614, 6246865, 2579793, 1459357, 1104675, 7513439, 7183329, 3257485, 6997450, 2418496, 2061767, 5847786, 3386722, 4660701, 226639, 4955406, 3541723, 1691260, 5469643, 3834908, 5113344, 5645888, 2808875, 6367876, 6813493, 730558, 1491334, 6735300, 7895160, 3637955, 7564996, 2770288, 4197825, 6061488, 749232, 5913589, 6649071, 2325959, 5657166, 249478, 4609038, 1628047, 1253103, 4680937, 5959026, 7301248, 587358, 5777103, 4086938, 2839845, 1816696, 7298252, 5550779, 6727325, 7284704, 2002453, 6198037, 670468, 2048427, 4248366, 160229, 3324773, 2815931, 929610, 1902728, 4616306, 3534661, 7529627, 7067655, 1937002, 7794332, 6057953, 4337721, 4260293, 2380514, 6070674, 5401157, 7540558, 1674327, 6132784, 1526173, 5739052, 3910408, 7565682, 2283318, 3531899, 1053398, 3518631, 3714422, 5604765, 331482, 3558143, 1755623, 734583, 2760929, 6654248, 796839, 5883980, 6079034, 5440610, 1743370, 7927045, 4531030, 3033343, 1621609, 819428, 2825498, 6145759, 7378651, 1477412, 7963541, 4054114, 5301054, 1275412, 4163248, 908511, 8309056, 2220445, 1389824, 4032863, 5070161, 8308890, 14937, 5734199, 5918711, 2894529, 193871, 8134464, 2607961, 2564911, 5599637, 1550808, 5871491, 6401393, 1954686, 5952315, 1202311, 7031484, 7767178, 4034081, 8038307, 2844571, 525567, 6901753, 7960575, 4798256, 3736634, 2590754, 4860805, 7607562, 3860677, 2193824, 8267083, 7310705, 3283120, 2192055, 930838, 578606, 5876306, 3515389, 6906960, 2454694, 6012371, 4677636, 2412259, 4340453, 3332958], -[3505911, 7184931, 2529447, 2892114, 1629562, 2459739, 1895704, 5706753, 4492655, 4927066, 5213721, 3656744, 5019226, 7516993, 5454049, 8191433, 3813948, 3426775, 6513531, 2469736, 1562984, 5186466, 4665817, 4786742, 3415785, 6255127, 2554169, 5215110, 780494, 7871130, 375895, 3468077, 5318796, 7351551, 3124946, 6443316, 212321, 5503110, 5412495, 2536204, 7721384, 5019708, 8171830, 4245583, 5759120, 7682441, 1172316, 1697669, 2425142, 5543896, 4877947, 642232, 663137, 4874412, 4231703, 221093, 4555336, 4115713, 7251552, 1337221, 8289251, 2053093, 2885732, 2855875, 3149639, 6749170, 1659392, 4676314, 5772553, 5262624, 4724607, 5057009, 2758231, 5071162, 2535347, 5574263, 5300143, 5624747, 1889117, 20117, 6675353, 1986014, 181803, 6871879, 4557264, 3106176, 6816943, 5279412, 6076439, 2269644, 1066493, 8249304, 1109166, 4219414, 5919627, 6247029, 4202595, 7625770, 2281377, 2877828, 4319436, 962359, 5273366, 5981703, 7131647, 2099996, 6956147, 8350397, 5325773, 7155791, 2146080, 1575396, 1532020, 8363456, 3828239, 1174091, 732626, 7349323, 1781030, 7942615, 4726752, 2211115, 5830344, 8252253, 5426832, 5915924, 7428462, 1602400, 2117181, 102055, 6018886, 5100684, 5021393, 1672998, 2544832, 5906552, 241343, 1998955, 6472823, 6124461, 7347687, 6240982, 5908472, 2034293, 2608000, 841505, 6324289, 438669, 2700780, 4954901, 8163992, 5288267, 4322150, 7044808, 755691, 8176374, 951090, 2944246, 3035712, 4673144, 2270481, 1217372, 6335909, 6312263, 7106218, 3693369, 3000919, 1976092, 2394222, 2143225, 2088860, 2987214, 2091579, 6857401, 494799, 8105391, 4200858, 2005140, 1812145, 6624852, 4620221, 4570722, 6672221, 6834175, 4429758, 3007773, 2548817, 2107748, 3818931, 2955771, 4902632, 3354318, 4378419, 3964580, 6507955, 4631892, 2089157, 2334593, 867370, 3846517, 2526916, 5130749, 6834631, 7571674, 4948011, 7347184, 1796869, 4557037, 4454829, 4027642, 4159612, 4589377, 6151231, 1254383, 8355010, 405625, 6009586, 3936181, 7967204, 7934991, 8201408, 1069585, 641244, 6734521, 5111796, 1060467, 112613, 4731453, 6751114, 6588525, 7191414, 2645584, 2313006, 3744987, 5823595, 3596146, 7079604, 6295484, 2730757, 7238267, 5104939, 4322241, 3874663, 5944759, 5959364, 1158814, 4586884, 2865506, 2314004, 2562587, 327609, 7558572, 2587727, 4516592, 782658, 2374714], -[6154240, 8161227, 1989284, 1032823, 3770282, 4313432, 894454, 5407426, 4425522, 8204067, 4913215, 7547069, 7304786, 2301992, 348095, 7527717, 3808113, 3920770, 2083501, 3724409, 4100485, 7239949, 490753, 1167139, 5077771, 726561, 5503420, 4233409, 6525054, 3906085, 713267, 2698615, 7441514, 4884795, 2281440, 4460298, 7687557, 6561047, 2553713, 3410646, 1408349, 8281991, 2394833, 6759649, 4222522, 6188806, 7175228, 1190286, 638154, 7049699, 3773145, 7661603, 2227353, 704261, 2515917, 2452610, 1459786, 6963825, 2905124, 461491, 7136043, 1131818, 3683261, 2970970, 4905391, 5977164, 3701882, 2978278, 3805595, 4134999, 4583937, 2513828, 4820174, 7050428, 8069545, 102197, 1968458, 7818406, 4299114, 7515, 4818964, 7094493, 4127825, 5055201, 8250897, 7569772, 4840709, 3132201, 331053, 4505244, 6706392, 5770305, 7788677, 8027447, 5502719, 811225, 3836400, 3269461, 2804851, 1459783, 1673839, 7689794, 4083429, 7063986, 4371419, 3289764, 3461882, 2155159, 1422073, 5699703, 1926725, 4624875, 182223, 2349464, 6745080, 8216642, 421826, 4804320, 1367180, 6839134, 573159, 1194852, 1767000, 2822989, 6797943, 5938358, 7792049, 772187, 8010036, 4298904, 1080631, 6563672, 6369503, 1645315, 1260527, 1667032, 8185233, 2428027, 267963, 3900128, 3687897, 2608044, 2170066, 7732369, 2335704, 4991888, 4827652, 5408511, 4243649, 6743838, 1021939, 8127823, 498709, 812812, 3649154, 4785820, 53465, 139224, 407056, 2015216, 6972916, 7393262, 868994, 1983513, 4958237, 3552805, 2618798, 5861970, 7018071, 3387644, 5619011, 5221105, 4839035, 3234713, 7421800, 143374, 5228816, 6551470, 7020970, 2187954, 90063, 2619584, 7851879, 7038980, 7912038, 4921891, 360632, 256778, 1711198, 2778635, 1920775, 8161303, 1738076, 1638269, 5224387, 6961619, 6985735, 444258, 1404680, 1404545, 3753465, 7544669, 5222208, 2451112, 5407583, 5615888, 4023470, 5925234, 7943785, 5126170, 5062475, 7387155, 6819251, 1869650, 4425621, 583749, 794838, 643852, 5701412, 4006240, 6738597, 3202611, 31685, 1513662, 4337275, 3330330, 7422396, 2846327, 8283705, 6612658, 5772528, 5026842, 3774040, 3435572, 6045175, 1420524, 6300166, 7056615, 4088882, 2310628, 1775221, 1739665, 2050395, 1665453, 8314231, 4758613, 1509778, 1375601, 8359013, 977695, 6619493, 2405705, 3461656, 2849045, 5373646, 5108244]], -[[4123598, 3448406, 409178, 5239529, 209278, 3671193, 3643642, 2596393, 5298400, 2983678, 5157812, 1444846, 283343, 1520174, 6834720, 4262079, 5110560, 2426763, 3948636, 634725, 97289, 5146003, 2166085, 5365165, 1330288, 2617602, 3550644, 1472027, 8295525, 7645260, 3450572, 7176247, 1012166, 5910995, 1004783, 449953, 1943922, 5607533, 3686994, 7024177, 5022701, 1971203, 5892232, 80008, 8101920, 829482, 2475390, 1018230, 4077099, 641636, 5352337, 6250566, 3441343, 1156448, 518794, 7745530, 2028058, 4792750, 5850713, 594571, 7580202, 5616200, 4066597, 2016088, 1728687, 8064358, 3805310, 5760607, 3247037, 2013056, 2209595, 837861, 8129218, 6979696, 2988400, 5025307, 2546927, 6054250, 2881425, 3674257, 6523852, 2406871, 1516120, 3550300, 5871896, 1937255, 5240881, 8232859, 5354836, 2816386, 4413999, 4468819, 927849, 3855341, 4568972, 7715582, 6387547, 6125511, 8278269, 6145994, 5320938, 4659835, 6863759, 3231568, 1250250, 725286, 3314146, 958310, 8369979, 7565120, 1929370, 6508263, 8332666, 1655602, 3306590, 6912767, 7439730, 3466723, 2745751, 330516, 6490851, 7690926, 2005103, 223431, 7006174, 1155333, 3557365, 106083, 3757385, 6165340, 7397247, 437478, 5388882, 239171, 5194521, 1606449, 5823022, 4088534, 5931866, 8238717, 6869604, 6185814, 7088650, 5630624, 3004552, 1858827, 5036901, 4067288, 1207436, 5134367, 3484254, 879519, 2434205, 2749688, 2775397, 3050206, 6064647, 1878545, 3669867, 1964839, 5136285, 5351679, 16043, 7275296, 3061054, 1164118, 2104438, 6263990, 5634773, 759721, 6335552, 1213862, 7871378, 7678032, 8097538, 554176, 5283848, 4202148, 523569, 4044848, 7708947, 4274339, 492753, 5734967, 2630844, 5186067, 4263924, 1585355, 1064721, 7552641, 2260202, 6418520, 2777062, 3445214, 416070, 422444, 306004, 4703356, 1134153, 3356631, 2258779, 4108818, 576709, 2585881, 6171747, 7862623, 5896126, 5426582, 2469836, 1003451, 1334491, 4535612, 7997213, 5950880, 837686, 2383589, 738657, 402666, 5177602, 8010990, 1367751, 1392328, 5425255, 6109262, 3730113, 3425498, 1903454, 3874746, 1352306, 3628758, 5391774, 4461202, 7662152, 4462161, 3999953, 419736, 4132698, 1096386, 3740208, 2258929, 2116021, 2996533, 5964414, 5034264, 5157879, 5639518, 6308734, 1463336, 6155318, 5584067, 673956, 7785186, 1730492, 3623038, 6746927, 8327857], -[3185588, 488481, 3568944, 6712693, 3038580, 3399302, 2356845, 2988312, 1720275, 7843921, 3783605, 7793814, 2228015, 715506, 179352, 4579525, 3468987, 2958017, 1203831, 4818099, 5526682, 4801360, 2465844, 4609521, 936908, 3841796, 1400246, 4369381, 2970689, 4041005, 3723904, 4439576, 3487682, 1074105, 3808925, 7458931, 5218679, 7988633, 1572490, 7530654, 7826675, 1495455, 4745515, 3639789, 2964750, 7408789, 6467417, 1756164, 3833194, 7492869, 5750017, 321987, 1403817, 7844579, 4270895, 6196241, 6065428, 5424081, 1609779, 5555268, 821876, 3880951, 4303389, 6784567, 7508172, 2626536, 5910970, 6491338, 3755930, 434111, 4742022, 330526, 2600020, 740244, 2113852, 3987855, 447467, 2355259, 3617094, 959743, 3684343, 7681647, 3815841, 2953820, 5316435, 3472828, 1758947, 3804955, 1077119, 7391176, 7715164, 8286929, 5098629, 457848, 4386222, 1950300, 1735047, 4621724, 5957584, 6511521, 1660171, 1233346, 5307183, 2152001, 449989, 7485850, 8349334, 5730599, 1420643, 1737255, 8163645, 231902, 6367878, 7704868, 190373, 7273546, 1976464, 2306090, 315701, 7847998, 6671723, 6936917, 4520790, 2662017, 2219284, 1690757, 5984140, 7489744, 6783790, 5856912, 4219307, 4673108, 1437098, 4372043, 5021396, 1089645, 492102, 3860922, 1125168, 3283472, 5289231, 3485031, 4041006, 1309175, 2042426, 2700451, 4995969, 8345305, 1838285, 1947156, 5317271, 3136672, 4823237, 3021237, 5905597, 2803517, 4259469, 4651749, 4787257, 2206562, 1884876, 3978686, 502751, 6722374, 2782515, 2101518, 1304797, 2634176, 3956146, 3583849, 1539269, 6015308, 5343563, 1766547, 7613644, 1083113, 6832353, 6757958, 7359307, 2971553, 112489, 5476402, 2078742, 2814554, 1284809, 544592, 1405558, 6644712, 2136272, 6189329, 6595619, 7450101, 274601, 5455850, 2076841, 3547529, 6076927, 6040531, 2637603, 6948156, 6799036, 1780484, 4969497, 5849043, 2003889, 1660066, 2286193, 4820813, 4541356, 4547855, 8068842, 8051337, 7797428, 3941367, 6427095, 5779887, 6550171, 7212201, 6889058, 6629268, 6417638, 6968902, 4826353, 1643325, 7157630, 5390900, 7744198, 5306165, 4287474, 5764530, 2893992, 937735, 2736253, 4435118, 2089203, 997671, 1718857, 5449334, 5006265, 180474, 2429545, 1572388, 7854684, 4144968, 1381792, 7581323, 1236058, 6264179, 1576597, 338181, 3819790, 4637370, 3478861, 3842218, 3021586, 6921086], -[6552663, 1280010, 1169216, 5565237, 7336378, 7138113, 3680077, 1791355, 2777797, 2140176, 6059983, 4083330, 1628809, 7309540, 5678342, 3533241, 1447593, 948139, 6446717, 4748463, 903758, 4427875, 6622757, 6033037, 505563, 2982629, 5255780, 6558809, 6551671, 2903617, 7390305, 185073, 2978483, 1036594, 1895800, 552509, 3419732, 4541321, 2030304, 5208061, 3794427, 2798339, 4730715, 4029486, 567153, 835820, 3372801, 2146619, 7359721, 6324549, 5223353, 7138870, 2333131, 4502548, 7503677, 8102162, 1236299, 903173, 7312172, 7757503, 6851285, 2232335, 1167418, 1174598, 962181, 6918235, 6997289, 5032467, 1025834, 1629012, 2061567, 6999689, 3658364, 1344117, 5900806, 185798, 5302778, 4708164, 4121075, 293801, 4150892, 2602470, 4906926, 3629131, 4298552, 1831020, 2819659, 311999, 5054183, 2581534, 3746286, 3461614, 4883183, 3471737, 6673642, 2597790, 4817763, 3419693, 6593184, 1061106, 1588959, 1426272, 5149212, 3672802, 7609448, 1968781, 310953, 6189308, 1867278, 2811822, 8287296, 10195, 2982587, 7955958, 5011419, 7318909, 5406970, 6746527, 7043486, 8222975, 5981853, 1416455, 1445363, 8097299, 4991252, 5483231, 4573877, 7352686, 3191603, 2684578, 1766089, 4370575, 3793458, 6261541, 5776024, 5443223, 3862534, 7619607, 1873612, 5774996, 6993231, 8268105, 28072, 2825736, 7626778, 2252302, 6196282, 3858562, 2812735, 1281733, 800694, 1597656, 3804882, 6537303, 1231529, 4244657, 886175, 1527195, 8306011, 2051575, 6606310, 3131689, 1322514, 2004521, 5106163, 5845943, 977121, 3592983, 5166274, 4875953, 7122315, 6735578, 5171051, 409943, 568887, 4877752, 2951778, 363983, 2005203, 4952471, 6440868, 2149243, 726413, 4841599, 316288, 5756468, 5337985, 4895400, 7637215, 4928236, 7425657, 3713805, 5070325, 219511, 2125536, 6040392, 7089746, 1814703, 4773438, 5552985, 6421542, 245585, 3516448, 7474753, 5764155, 2399523, 4546609, 6103743, 6856673, 7824930, 778655, 5287374, 6048985, 1401386, 2697217, 8323030, 7127082, 1927224, 6662013, 6739578, 1507953, 1837563, 5753198, 8340383, 2338114, 6070860, 1729497, 3142242, 6179970, 2007187, 2198796, 6701707, 8173811, 5228840, 2693762, 7784040, 4166460, 1710578, 6138273, 1955424, 7260184, 235902, 3543881, 4994822, 3324208, 3215092, 4884428, 2569959, 5156810, 5343511, 5527783, 6759878, 4053003, 4195847, 211091, 3277845], -[2965831, 6464184, 6220847, 4639673, 4071494, 6052078, 1999211, 778783, 4861874, 6630001, 3070811, 3753690, 1741434, 3094164, 7569147, 4398394, 42081, 6317064, 8060020, 3967826, 6187996, 6394524, 4072532, 5978637, 1205528, 3832132, 3812774, 593054, 7328783, 8352738, 4342430, 5084221, 8213842, 1554792, 8176326, 3297673, 7948630, 5363361, 7440298, 7569979, 3401706, 5043617, 5206776, 2032918, 3422241, 6908037, 1199797, 8268800, 673784, 6373893, 8049886, 4994978, 3071116, 327989, 4640320, 489372, 1177168, 2829593, 8315926, 5949626, 1470636, 3427683, 4604436, 4425048, 2307002, 6867978, 475502, 3024359, 2021056, 981093, 987776, 7137459, 7501086, 4051622, 2132174, 6453532, 7561898, 7737305, 7755764, 1334781, 7713050, 2692930, 2841067, 503817, 7855654, 3345424, 3535557, 7678360, 6290046, 1918547, 8124207, 1523664, 8100762, 7195977, 3231302, 8310873, 5645080, 3559684, 1128187, 3891897, 3015627, 7478597, 8298570, 1251562, 6210145, 3007629, 3552333, 1668968, 4981441, 3372264, 6299985, 3194639, 7038928, 5624467, 2525976, 763101, 580453, 7174653, 7967082, 3604333, 7983896, 3677884, 1559651, 8307424, 4213601, 4045827, 1955831, 2391845, 4186029, 7245229, 6894608, 4808076, 6231238, 7560744, 1805759, 6689618, 5090615, 6860441, 6873901, 6754048, 5441655, 488540, 202765, 1612042, 8013229, 5596096, 6596955, 6213129, 8232359, 5682369, 2937800, 5729939, 4457651, 5558770, 933226, 6432813, 992336, 2124073, 2022624, 6571915, 7137115, 2069643, 2380853, 1372342, 7200675, 2361893, 1488869, 2248504, 85594, 3917010, 5863792, 3355277, 2811831, 2084618, 8372073, 6765822, 1787230, 4287599, 1706747, 1803615, 4247632, 6028413, 2136468, 2473945, 3430566, 6815475, 3144360, 7895, 6995547, 4465295, 4803469, 7810195, 1668094, 2883785, 3694501, 1038120, 2799891, 2102185, 7297303, 4577109, 3343111, 1729277, 5694159, 4048848, 360468, 6077984, 6308176, 909212, 1031483, 1433454, 3106136, 398199, 6405713, 7488648, 488550, 8226186, 4184984, 543623, 4183547, 3512018, 739176, 6989059, 400730, 591652, 2764072, 4574056, 4857244, 2428413, 6584201, 5272703, 5622580, 7435132, 5069049, 4104612, 7221237, 2306544, 7594042, 887902, 1797558, 3173212, 6271783, 1434674, 8303947, 8111691, 3412665, 3931247, 2819462, 2144686, 4865606, 5838132, 6120503, 2237882, 1202307, 4339660, 7090192, 2610504], -[5171774, 5528645, 7147189, 694376, 6300248, 1055924, 5096868, 1609486, 6983216, 5950987, 7490641, 6305492, 4152301, 4540158, 2393363, 5959418, 5698612, 5993755, 2462200, 5724300, 1193239, 2820171, 6276093, 1922836, 6103783, 1894028, 2497604, 3335189, 6065851, 2661408, 31243, 7108049, 6295766, 804279, 4812724, 4923796, 2085790, 2431822, 4151446, 3049153, 471097, 5714320, 6798582, 721542, 136747, 5295584, 5919325, 3868866, 2171645, 2432543, 3902147, 3957795, 7369654, 7192073, 3042823, 4476731, 6915565, 868694, 4045156, 3479017, 5777630, 42697, 2572683, 7249586, 2907578, 4179591, 520530, 7527254, 5554232, 7242836, 6345720, 4499015, 1230206, 738646, 8174481, 3436983, 6029173, 5264076, 7757728, 1647592, 7969805, 3068809, 1761444, 8180574, 1034042, 1429457, 4232485, 4937818, 3850132, 3028583, 617738, 2617117, 3484013, 1560101, 6387824, 6844402, 6535791, 7026894, 7467033, 1155954, 5402841, 1959569, 7569183, 747946, 1552365, 1229873, 3438493, 8161870, 592679, 5434633, 3047597, 4900112, 7448584, 4062938, 6316564, 4814622, 1430005, 2860760, 5152027, 6563896, 2362767, 5060318, 1069988, 6730612, 815508, 5998345, 4834409, 8065744, 1942659, 4829435, 3782488, 6569463, 2213526, 7331561, 5047502, 642400, 6009838, 4996498, 542568, 6252927, 5433748, 6741178, 2781026, 1282900, 1725100, 5374492, 4698334, 3245752, 6845253, 1195724, 5141169, 889262, 7934799, 7382205, 2219138, 4173949, 2979485, 4326332, 2803356, 2601740, 2215595, 7465296, 6052308, 2140978, 5849680, 4258951, 973630, 5934160, 3176647, 4351827, 1572722, 4701843, 1906531, 1591742, 4456761, 3299111, 456517, 6479359, 6843770, 5375150, 2214876, 4591930, 3993471, 1298360, 5138523, 2997131, 6185221, 319961, 2982420, 4401772, 4174447, 1527432, 288681, 4814121, 2978539, 2502590, 1828779, 7343302, 3825663, 4315460, 1536937, 4757983, 2178102, 4188256, 376383, 6160630, 1062086, 2318881, 1212361, 6889464, 6954949, 7129856, 2345292, 1166356, 5898347, 4974479, 888653, 4854837, 915893, 692280, 2723128, 684561, 2393399, 2514570, 6611440, 6419424, 1002208, 1004612, 8034182, 1175085, 2129937, 3071873, 2712968, 4035060, 4314614, 7482215, 3285279, 928303, 2413892, 7711025, 5714494, 4419320, 3722286, 557272, 6182142, 194323, 4331269, 6720331, 6174196, 6728339, 2147690, 2647344, 1625912, 267573, 3096528, 4250855]], -[[2941963, 4906494, 3816182, 2633411, 6817580, 1066628, 4034403, 3079405, 5757861, 5898895, 8114637, 1821109, 9226, 389653, 1921682, 6772061, 5467254, 2714212, 1361565, 8296248, 5058256, 835776, 1296532, 8333089, 4277294, 3009471, 8166104, 4537965, 1941493, 6542327, 5433245, 1874484, 8279042, 2272526, 7185446, 4313653, 3149739, 224625, 5501545, 5987940, 1156907, 585055, 7703853, 2462403, 4226775, 7883605, 1689972, 972813, 2715652, 4485448, 1497910, 4815474, 330097, 2674130, 5734767, 1710006, 7409709, 625496, 4839243, 5229172, 3201132, 6046052, 7193568, 6992064, 7384407, 2456603, 5870424, 2997216, 5533461, 6486557, 7901117, 5925707, 7665481, 5405023, 7000918, 1179971, 8254369, 4084681, 1739177, 2994980, 2574061, 2594944, 1998671, 1389416, 3942671, 7152749, 1659002, 7995826, 1181482, 6888231, 18391, 3655369, 3574704, 7194385, 8114959, 4068521, 3672314, 1958334, 1404388, 7227453, 6723366, 5143257, 8111799, 4193128, 7393542, 5548729, 6948619, 6064275, 1542342, 8374313, 1770054, 1811317, 3559694, 3725247, 7759082, 394878, 3789982, 2100146, 4883090, 2618941, 4533357, 1837690, 4588701, 2977315, 6797076, 1739422, 5031485, 6549877, 6700914, 4912553, 3007084, 6157040, 5104250, 3737932, 2779705, 1333558, 7038269, 555558, 4363657, 6039756, 7652300, 888829, 7155964, 2858345, 2505358, 6175130, 1278923, 5312413, 6372954, 6777569, 2691976, 7451595, 6159782, 403127, 5441604, 4525536, 1048516, 4353001, 5264453, 5203949, 3183905, 383849, 3088550, 5823423, 1686275, 1109303, 8365683, 8200435, 3078238, 5677043, 2218107, 3161278, 7413823, 423620, 3546765, 6508302, 8145474, 5483606, 8182398, 3932545, 5682246, 8206759, 2107610, 6823670, 3458918, 2021413, 1280965, 8302393, 1791190, 7253326, 5902115, 1225989, 1323834, 8011522, 7989784, 6159945, 4593282, 1883923, 1453887, 6735114, 956408, 735855, 4386316, 8274603, 6111581, 7572133, 3107685, 1024936, 4769201, 2107145, 2049843, 4127798, 6922073, 3094822, 1045263, 1361090, 3864671, 3360729, 5130963, 5009258, 1381583, 7663068, 3385089, 8239781, 5917865, 7140706, 3177511, 8224080, 6782166, 7221038, 3011399, 7063681, 518007, 7925332, 5188734, 7322190, 7029820, 6021497, 4613917, 7342742, 2039704, 4703136, 6056974, 1425963, 7059621, 3902133, 6649936, 2444131, 3991344, 3112611, 4285077, 5280722, 5086047, 5728445, 1556325, 7357531], -[3318031, 7263249, 6067456, 5572440, 5286758, 4756364, 5941133, 3853290, 1286825, 5275955, 2063909, 794596, 6100290, 3387868, 3523726, 488671, 3348517, 5522265, 62638, 5081048, 7185718, 7047547, 3108847, 318636, 3798230, 1722664, 1956836, 7394631, 1977483, 624227, 7875007, 4555688, 7578771, 3830913, 2144420, 4920123, 1249479, 5829104, 4595863, 1923232, 2844209, 2508850, 2485585, 2396989, 215600, 6995502, 6415924, 7710747, 4319506, 4476671, 1698979, 52777, 5555598, 6767068, 11263, 6905133, 810033, 5597588, 5841687, 4010359, 2159922, 612059, 4850787, 5526881, 3620600, 4802139, 1539207, 7295260, 2081086, 6067254, 6699221, 6599650, 7331679, 135097, 3432330, 7190985, 175510, 5615961, 1543660, 7791779, 6955941, 4350891, 7759036, 5443616, 7392223, 3608551, 5939286, 6825171, 6983724, 4833643, 7023295, 3642829, 1718665, 1732540, 4353546, 821223, 74564, 7624158, 3124516, 7621103, 6441342, 7851511, 1347050, 4169873, 7086617, 4408310, 6358477, 7090930, 2232973, 7578943, 5552474, 363405, 386622, 3820948, 7098886, 4612146, 3618811, 3731621, 5025968, 7886334, 5323745, 3860679, 547742, 2993614, 571164, 5283779, 6206835, 2494589, 1384221, 4741850, 2643711, 2650516, 4456474, 964124, 3467237, 4555051, 2737378, 7248509, 8244478, 2707521, 5868042, 3840342, 4097636, 544759, 4899486, 7648712, 3812582, 520357, 1274483, 3374597, 3498217, 7001293, 2072520, 445502, 1012694, 6024331, 1792373, 4257420, 4662905, 5135470, 1040504, 1551190, 2348171, 6845850, 7706501, 3794097, 6329511, 5679447, 2719495, 2781028, 2453345, 5242841, 6410101, 4103910, 6008180, 4950142, 5950641, 5907023, 4117529, 3063420, 6988757, 4233342, 1907404, 6691705, 2713388, 5404111, 5912961, 4619316, 6182250, 91567, 6423979, 6900112, 135229, 7030752, 6890571, 416188, 6664784, 4316783, 2480741, 7528309, 1683324, 4872621, 7664388, 2956869, 6406936, 2741828, 1561814, 447098, 1443814, 5479710, 3699067, 406794, 883298, 1417795, 5030668, 7768289, 4354493, 1764965, 8181010, 5507409, 6555513, 213248, 7316779, 5538503, 6672891, 7041123, 1941917, 4864348, 5619531, 3694604, 1940353, 3253664, 1164658, 2687764, 8207744, 7726475, 4222250, 516025, 2814668, 2606556, 4225241, 6605085, 6786768, 4931400, 7423443, 4113197, 2886338, 4422718, 4347952, 3854055, 1646715, 1039161, 6618308, 3987990, 277844, 5025591], -[506881, 4970359, 6738252, 6423443, 3871730, 3346046, 5480162, 8126568, 6397770, 2033150, 7120010, 3780202, 6352270, 2845839, 4280367, 4264186, 535564, 1446787, 958333, 5237752, 4009418, 5512419, 5073745, 201691, 8254374, 2207277, 325061, 4564040, 5216272, 8371667, 2330852, 3107288, 5389605, 3881694, 6722905, 1621308, 7413829, 8365669, 2462605, 183492, 3338213, 1938152, 1048959, 5495755, 5234219, 5326320, 2671357, 8198635, 3807741, 5615696, 7398160, 7166552, 8240671, 3879479, 1460940, 162244, 1639767, 2801666, 5646136, 6706561, 4183259, 3122812, 7606594, 7375062, 2876129, 366006, 229698, 1080556, 1900869, 350651, 2365328, 7459179, 4456307, 6200668, 803092, 4488424, 1409082, 3516159, 4012453, 5366198, 3538649, 5123232, 6579140, 5940190, 7838406, 5099518, 1217372, 7567847, 269993, 7573849, 7149458, 5845634, 85043, 7240572, 8028786, 93109, 6626471, 3610836, 7030114, 2594356, 8299226, 683463, 6988529, 464138, 5062242, 5797064, 5613439, 6488687, 6536306, 5881629, 6172075, 1567211, 3168812, 3844569, 4513626, 1048432, 3357271, 6237599, 1821115, 1632714, 7423810, 7867217, 4675698, 2544302, 5477623, 8062272, 8122415, 5472546, 3299238, 7462564, 8068696, 4481649, 5342038, 5033188, 389893, 3796944, 6944625, 1928162, 7206151, 5313900, 7619354, 6139312, 7873033, 8074724, 1231786, 7271668, 1206237, 4199249, 2405000, 4020298, 4541084, 6134245, 4782152, 1039258, 5683958, 360752, 1072139, 7654236, 3482850, 4562501, 7737412, 6790930, 7223341, 8145896, 2433887, 2792976, 6017162, 7467671, 5305901, 5185366, 838081, 2657613, 3980371, 571892, 3884058, 130063, 6540574, 2866810, 6599140, 4367637, 5653590, 4351071, 963540, 2448266, 3016290, 1675696, 7631763, 6489165, 8057500, 921581, 2794620, 2605132, 4120794, 5915418, 2576792, 629531, 6569735, 3898715, 3618462, 5989681, 6017584, 1265443, 2150403, 3605948, 6401763, 3461887, 6621831, 6709195, 5002772, 6806554, 282130, 7762381, 5255550, 6671316, 4059370, 649951, 5159215, 5730512, 561758, 6246360, 3977255, 640143, 1268152, 774605, 5084123, 5972801, 5937807, 8123409, 7182819, 8081083, 383099, 131835, 6777922, 1745461, 8262027, 6029722, 5079903, 4548819, 3542779, 8181959, 4338235, 2021363, 3037183, 758874, 5802859, 6258826, 8283821, 5299605, 7551387, 675025, 3481063, 4317285, 5529292, 6375260, 4150728, 4078723], -[7621243, 6577159, 7557357, 6085108, 5145785, 3459585, 4648298, 3165694, 4371587, 6494215, 843885, 6494893, 708085, 2263116, 5198727, 681907, 2140515, 7934983, 2818308, 7374287, 3158131, 7626845, 6044614, 7655853, 6677786, 1224760, 2586900, 5483256, 3316094, 4341995, 3981251, 7390940, 7749842, 4624324, 1910366, 753429, 4502234, 8098000, 8150364, 5879299, 696575, 4462259, 758980, 8340498, 4223945, 3368154, 715936, 7220902, 6547269, 7137505, 2863711, 936445, 5585682, 6058285, 4732606, 7916727, 5396972, 879133, 2896943, 8378787, 5770043, 3372853, 1857873, 287575, 4120615, 5077612, 6255748, 8098148, 2623475, 6432000, 5215998, 209862, 1061516, 5231530, 4831446, 1589722, 5643248, 2116923, 4723429, 2406537, 544032, 885854, 7531295, 3159680, 2850208, 7676088, 7811173, 2177616, 5614018, 4836909, 3990738, 1128189, 6624474, 6835563, 4549655, 6187966, 3431822, 1996432, 5993673, 5297409, 7107228, 192697, 3342873, 6889101, 5075392, 280343, 6750337, 3831151, 1833245, 5995214, 3038925, 4609911, 4570779, 1060211, 1199186, 6757682, 3251307, 2416742, 3757176, 2854319, 258741, 7850418, 7186071, 4568324, 8014605, 5221229, 5695542, 7308848, 1785078, 4556882, 3250917, 7720926, 4588619, 801807, 2171205, 2709127, 7994835, 3404424, 238604, 5866514, 7422482, 1644486, 2723401, 7879034, 4495024, 7643517, 1051301, 5702770, 86624, 2661618, 672899, 2888358, 6221138, 5887165, 7516703, 2055291, 7050682, 6178117, 3979861, 663400, 2800383, 5829403, 870758, 1718351, 7092888, 7899747, 2716600, 5076512, 7100674, 500421, 1461965, 4359331, 8357709, 1611169, 2168144, 2315299, 1647538, 906195, 5594423, 5012987, 6561962, 6448297, 4775887, 7656975, 3663632, 2613656, 1894207, 5086980, 4854532, 3999538, 4666441, 2806561, 8100506, 3649642, 533881, 3268912, 6078585, 3064439, 6114264, 127088, 5819265, 18776, 1582697, 1117502, 7811452, 7808618, 1279691, 6438230, 5862731, 7448229, 7153089, 385289, 7318227, 1929658, 5260475, 7932418, 6737967, 6667591, 269489, 6887105, 1058540, 5441073, 6428826, 7527141, 7026552, 2154562, 6470606, 6650124, 1948395, 8007155, 2996866, 4527087, 1856838, 6080714, 2128791, 3118479, 4536152, 5961313, 7927575, 954594, 7260493, 6122119, 3519256, 642811, 1985012, 2565446, 1010485, 4727514, 5947186, 1629822, 6322202, 4605249, 492560, 1393608, 7947862, 765160], -[2764987, 8265754, 4085653, 2571110, 5874556, 4816797, 4307803, 2903115, 2213523, 7564542, 609540, 3218825, 2966901, 6953123, 5040158, 3634905, 5146721, 1037657, 3730957, 838667, 230042, 6642499, 165410, 8179222, 698780, 5242489, 3420628, 178230, 3898587, 464125, 6347376, 8144542, 4076293, 1048449, 6149946, 4939334, 2693087, 6308445, 1085833, 6960106, 7244803, 4420512, 7956846, 5059881, 7078820, 8039565, 699220, 5893296, 896122, 5868065, 7640105, 6537027, 4880568, 5529625, 2061696, 2626772, 5799951, 7806434, 14084, 7932250, 4442369, 3943994, 4831760, 602700, 8152073, 7816638, 1359389, 6882576, 2763304, 2910766, 4646339, 1130064, 3414945, 5228190, 5002151, 3800008, 5298575, 2038122, 6276288, 7664888, 5574450, 6534336, 4785282, 6753578, 6591880, 4644286, 3504227, 2470756, 1796982, 6302889, 379217, 2708101, 1597582, 111366, 590930, 3766372, 6343003, 4151100, 6938387, 3575052, 7482105, 8325644, 8346687, 5084652, 2807324, 8089836, 3985020, 8067932, 5224509, 6791771, 5535586, 874381, 7177934, 6534199, 6713887, 1943324, 3857854, 4152662, 8317549, 6030090, 6712551, 5286076, 7572436, 478595, 6885836, 5641452, 3173931, 5623281, 3985962, 3694513, 981855, 1135237, 3919842, 6293519, 4793791, 7486070, 3367029, 6723767, 5026578, 6856587, 5147259, 4576874, 7795001, 5439877, 5628512, 92895, 2752363, 5546504, 1471928, 5915958, 5667211, 5663425, 735546, 5982127, 7345069, 4160592, 6146734, 4627332, 8196929, 7017553, 2694026, 2574703, 7543660, 4006984, 4331236, 5470194, 824121, 6676793, 4390051, 5928793, 211188, 4476257, 8111375, 750049, 1091232, 3613381, 5633748, 6176660, 2886483, 8178155, 8228572, 7440866, 4993137, 4500499, 2283872, 6101876, 2270564, 7809342, 5787031, 2520603, 4515582, 5945459, 7068686, 5924947, 1217119, 5165408, 1692462, 2473134, 4471647, 5336995, 2478154, 6241745, 5766193, 6354325, 4469677, 1533044, 4932803, 5106364, 1331374, 7358345, 5101658, 5502078, 4178800, 1485314, 6035300, 1437937, 4120042, 3713826, 3814953, 3584189, 4015595, 7139275, 1843053, 3775132, 7286957, 4877081, 5352435, 2182792, 1905248, 6759565, 2123526, 6755218, 5856818, 4176312, 7940722, 1916122, 1566401, 1234815, 7823963, 1280422, 6814404, 2758353, 7564833, 977365, 2282376, 5029440, 2756237, 1645766, 502738, 975553, 3676720, 483054, 3944675, 5879715, 6035883, 1178946]]] -trCandidate: D26AF4F24DE50EBEDA020DFC6F841B0A2D83D2781C06D8B3DF8EDA97A7EA4F9913ABEE9858F88F8A2F52C13DF2DE4BA023BAA5B3CB0ED941E077A08AE3F14035 -muCandidate: 6306E6ADBAAF5509B5C86CED5FAF3F5D168FB8BFD7C4704E751F7D7AEC3ECF2D988D9A64516854341789E6D53E8CB9C713E68B25F35C2BB99B34208CE29D1F43 - -c: [0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, -1] - -NTT(z): [[5355856, 836771, 5926131, 1698606, 3996443, 1349399, 2432415, 2945189, 991111, 7368239, 1969006, 5103307, 4606079, 1179943, 1117008, 1133122, 3831074, 7860746, 7310157, 6461064, 2724959, 5189982, 4947289, 1730930, 3216955, 4029963, 3892870, 3745414, 5021041, 3665806, 1088554, 6102570, 5661184, 2027827, 2673779, 3098961, 4914648, 2555543, 2027364, 5511540, 2618482, 2753042, 8220303, 5106732, 1696202, 2832871, 2865549, 4434898, 7410634, 94929, 8369290, 7396882, 6835275, 5998172, 7490361, 6380251, 1072478, 7538910, 6575077, 2299691, 357672, 6059918, 7761728, 2719, 2916725, 3903916, 711006, 1142325, 5487980, 1402978, 4348296, 7498675, 1361252, 6788577, 2013663, 5554585, 2426910, 2087852, 562976, 4283167, 1370205, 3799675, 2456657, 5508792, 6844323, 3160206, 8290459, 1849124, 7783578, 1705642, 7100589, 6784085, 4247287, 1934806, 6630959, 7844971, 3763131, 7277827, 6602672, 4177087, 2143611, 3493464, 793674, 3265316, 110118, 3241791, 5962332, 821315, 641226, 677919, 3160611, 4721079, 8059565, 7002344, 818282, 2829945, 1394081, 7785497, 1822035, 3095172, 6681800, 8070375, 8116877, 4318675, 2268327, 6683145, 363463, 8176146, 517683, 674472, 4465338, 8112234, 368252, 6441190, 5476993, 117273, 833422, 4145821, 2981377, 3646429, 4942671, 2953581, 819001, 8127360, 7464380, 3849563, 5124381, 6326402, 1816121, 1128029, 6312634, 1155416, 2183361, 3524156, 1124628, 7581748, 6929294, 4411460, 4726995, 3765962, 4322374, 8120351, 3695552, 8105266, 8083610, 5517226, 1578032, 4914359, 5527258, 4049156, 4801084, 1714222, 5864758, 6995161, 1654058, 5165759, 7535712, 259080, 563467, 1939936, 7994774, 7193002, 2856710, 6590944, 2338788, 6916463, 2369019, 4076049, 6422223, 1552037, 4796880, 2450700, 3103836, 3939607, 1742095, 1033026, 8005856, 4436813, 2921898, 7169992, 4681291, 7643996, 4674053, 2336273, 6315155, 7272719, 4456335, 7433433, 5860050, 5476622, 6451614, 1854352, 4427131, 6631114, 5225425, 3615943, 1288279, 759227, 91777, 1735378, 33874, 4961088, 32095, 7027260, 7847899, 4606074, 6480389, 4497425, 4440158, 5333828, 1231298, 5800474, 6925753, 7283067, 1214900, 3998968, 3800968, 4144474, 4684301, 6653901, 5732652, 3235856, 4183720, 8242042, 360930, 5704421, 5689570, 2278355, 5318049, 196867, 7131360, 1766897, 2038927, 8243437, 5117414, 6756360], -[6236195, 7431543, 1457893, 8100690, 3729271, 8106701, 5881850, 2312717, 568412, 6973925, 4003919, 3185729, 597396, 3897471, 7735953, 1930914, 4391910, 5951459, 4361046, 313392, 908233, 7667635, 3784333, 3603053, 553364, 6733734, 5636749, 1309855, 1843546, 4300530, 1286211, 5472645, 1552989, 5044949, 5786552, 535108, 7163675, 2900245, 3382266, 5157932, 4669105, 2557890, 8424, 6710468, 5270281, 3691475, 3082562, 3284881, 2178271, 1451547, 5375897, 5658364, 7648359, 218322, 991839, 3673381, 2100265, 1501528, 4736926, 7549873, 6751285, 30365, 4462361, 7657648, 633890, 3147264, 1388580, 7544591, 4244653, 6519485, 2657071, 170273, 5359892, 2707189, 4135658, 2693496, 6174855, 3060675, 6425192, 4024365, 3495922, 4739059, 3068639, 4928352, 4706142, 7253038, 3392229, 6855607, 6515226, 8010373, 4665336, 6579153, 4768005, 392895, 6333513, 5918832, 1113124, 901024, 3314774, 40077, 2038944, 1119757, 4877430, 1853578, 3233818, 555, 73873, 318065, 1960896, 1080021, 2622472, 2313294, 2003931, 7451336, 5311495, 2830497, 2398035, 8116945, 3872691, 2246729, 2437436, 2909235, 3659712, 4290499, 6398513, 1089317, 1554909, 1965035, 439147, 6900082, 3041317, 851387, 3980021, 2017247, 2363513, 874987, 6239323, 277719, 2066158, 3292405, 5212611, 1882004, 8086983, 8142073, 5319210, 489706, 6892263, 1573817, 2619385, 2845722, 5024413, 3711832, 6981549, 908923, 6032731, 4950531, 2118422, 4237040, 7644079, 1633789, 5954192, 8370633, 2907017, 5566607, 4659395, 6118732, 6840812, 1868534, 8238730, 6804768, 4032658, 5024393, 7857475, 5080550, 2895416, 7421612, 1695749, 253389, 4139639, 2438614, 2872645, 2669373, 1290961, 7888303, 2116931, 4518818, 1573158, 599, 3142471, 4619457, 1570462, 436457, 6905198, 2229516, 1946146, 5698275, 2136326, 6886720, 1110048, 3354710, 3539350, 1503417, 3012098, 7404425, 108397, 6011659, 2896412, 8183674, 5520462, 3657990, 2114073, 2713659, 6222415, 8054620, 3841470, 3244809, 1589834, 2459431, 3556047, 5194939, 1693985, 4474140, 7512620, 6369307, 6331202, 6236032, 3306436, 4878875, 994236, 4824136, 6685968, 6500460, 6067862, 909883, 7409715, 3766879, 3201989, 1703167, 7535423, 5119796, 1378583, 5068609, 7426595, 3828924, 6654022, 8307091, 1558886, 5625783, 7220155, 7563745, 6835869, 5545399, 48390, 6524038, 7414573, 4126936], -[6741552, 5514206, 3147992, 2211582, 6634065, 416486, 5799592, 4424550, 298775, 35766, 3342080, 4386467, 1431022, 5947835, 4595354, 3617540, 496744, 7819525, 7997227, 2788981, 1505392, 4281905, 6913620, 771438, 8138929, 2676344, 4845439, 7489097, 656773, 7596304, 7016403, 6835373, 1787639, 169249, 2897003, 3303288, 7276276, 640984, 3603968, 3515383, 2516757, 307909, 553655, 8159148, 7403267, 2844338, 1321477, 3704776, 5837883, 3580977, 7410828, 2934814, 4649644, 7910796, 3395283, 7434293, 3886747, 2341467, 3212262, 6392344, 2810572, 5659501, 1103997, 5288302, 3352415, 5886168, 1414923, 1168750, 1305812, 637664, 3913686, 5493274, 2698136, 4638453, 6971904, 7034786, 2353784, 168770, 155684, 1423764, 2925873, 4662644, 831119, 2431934, 482955, 3453844, 8171049, 809306, 406678, 7641180, 3608438, 3242264, 1761423, 135855, 4634575, 7752859, 160873, 2303417, 2594529, 7450278, 3825887, 3133939, 5976641, 143382, 7327504, 5028123, 6768980, 4239332, 5767570, 8259802, 7637946, 58598, 7577549, 6410440, 6693129, 988002, 584659, 4338536, 1138597, 4518317, 5297890, 7350655, 3404583, 4057226, 7268066, 4511484, 6611193, 4269050, 2287173, 3358585, 1040123, 2629126, 7785456, 4614760, 3783414, 1857004, 2988627, 2326977, 4457784, 4252697, 6896791, 6873893, 1685832, 612505, 6607773, 7798773, 3563997, 5142693, 869498, 7644349, 564065, 4422102, 609652, 8062989, 6097415, 4337738, 4713792, 4397661, 624298, 411636, 1513854, 1327928, 1388733, 3573211, 3488663, 7204030, 7461586, 4965381, 5162634, 4162725, 6380292, 5453737, 2864204, 3248690, 1585301, 2741652, 3045072, 2364450, 1446037, 320009, 3722270, 8004097, 6691002, 4149824, 339468, 1277144, 5469765, 7095671, 7903732, 7394246, 76790, 7235974, 7666900, 1504095, 6114532, 6257083, 1827174, 2776241, 2353419, 8322837, 5285458, 4260523, 4679271, 6291339, 7912946, 4193237, 131299, 8196707, 1313633, 631285, 2152850, 2452937, 1811793, 8131913, 4896793, 648310, 3680312, 2115260, 6152936, 7368743, 6179432, 4565948, 3399981, 5106380, 36510, 668989, 2535270, 4135684, 467277, 6106767, 6190890, 7792816, 62288, 2885981, 7888965, 5214484, 5650871, 831202, 6410542, 5554335, 1696037, 7744392, 5347427, 5909749, 2179597, 6960489, 5045896, 3451923, 1249141, 6723107, 3153271, 1853685, 7642491, 3599058, 1508352, 1587213], -[152114, 2214903, 5194789, 3784620, 4050224, 3256336, 221853, 5478604, 3871087, 1509069, 4981976, 6860938, 5289137, 6198347, 7403770, 2868886, 748029, 3147553, 8170854, 3261341, 4793607, 1666562, 5262650, 1820034, 2469365, 7719751, 6534725, 489374, 44543, 7764881, 4401149, 1363680, 3361706, 6351951, 2342251, 3023993, 6512508, 426293, 5517042, 6892908, 5128878, 7439047, 8125554, 5841619, 5444227, 5517379, 5060757, 2859386, 4917218, 6498532, 986589, 7007622, 5603099, 5471979, 7361654, 5451143, 2848603, 7213621, 4535555, 6941945, 5725748, 4722374, 1133101, 2634647, 6781148, 8262970, 7982575, 3516164, 2822127, 882625, 7367141, 5008526, 857092, 5284495, 7087232, 1642890, 5314218, 2990821, 2360176, 3059904, 5601185, 6724041, 2575920, 3580505, 4838672, 4236692, 1052119, 1186453, 7500538, 7958698, 2781722, 2915679, 3980853, 1247201, 5188414, 3382391, 5615055, 6499582, 4150090, 2943721, 1824963, 2523885, 2132891, 5965980, 1388904, 2958176, 5554774, 7828135, 2960772, 5067646, 4974938, 5434267, 5443125, 7897712, 5436036, 5898899, 5671323, 3505247, 362933, 6485536, 5100697, 1851743, 3610262, 1457633, 795503, 2991930, 2910238, 3876542, 4549047, 1448955, 6478023, 4563962, 4452252, 7179898, 5783900, 5138646, 6099473, 6237592, 520890, 1347313, 6437475, 6352020, 3216475, 3682880, 4683300, 7117026, 2923373, 4430939, 7496944, 5622976, 3213314, 3475950, 5854609, 2378194, 5485904, 4942298, 114678, 2734358, 2826801, 7202857, 4815575, 3273014, 7520420, 3126772, 680976, 48440, 3379477, 1320632, 4171609, 3991226, 8117536, 7470841, 5431565, 7290051, 6308529, 7622332, 1560656, 1765154, 1671309, 2335241, 1747154, 2603083, 2914077, 182952, 8247319, 2230828, 4827005, 5496887, 6119273, 5437829, 6536314, 6764939, 4871053, 4502090, 1497575, 2764538, 3351376, 6212496, 8244516, 4227050, 6760098, 1039645, 1963268, 3758501, 7798756, 4469859, 3038854, 3716108, 7926555, 4034396, 4118631, 2567202, 1538231, 8377310, 7559099, 3763652, 196914, 4665246, 5898591, 1349899, 1366657, 2030500, 2478115, 2937510, 8213891, 1192721, 8294702, 7629827, 2253835, 8280176, 114583, 5548057, 7305486, 5318127, 7060099, 4411343, 1269190, 3820424, 4246291, 7785200, 3386118, 3377071, 2622697, 8376151, 2060001, 77343, 7972656, 4059936, 2115502, 300263, 7897894, 7403934, 2654499, 2107787, 198425, 4682165], -[847441, 1112508, 5214273, 5712697, 1098878, 5421537, 5446584, 3698521, 7690566, 3829976, 4034642, 2760430, 7884336, 8168784, 7271536, 2201634, 8053845, 6251401, 2196870, 1159864, 5380695, 4258164, 7759252, 5990234, 8362466, 3000640, 2946643, 1351999, 7727481, 6609715, 4824329, 7825333, 7120516, 1282728, 5745334, 5563203, 3068049, 3091175, 5326475, 6343761, 3762198, 6997353, 908179, 1793342, 7977714, 2306172, 5511183, 6757789, 3892404, 1694081, 1058257, 7493238, 4785775, 6333345, 4859416, 6925434, 3402860, 7314839, 6976465, 2498707, 273459, 1692319, 1441275, 6124665, 7118845, 7601741, 2194861, 1864507, 8125645, 8379083, 5609959, 2128857, 3305123, 2175987, 3988656, 647978, 2875466, 3562303, 4941983, 733873, 6577817, 1977419, 1110825, 3856486, 1991089, 2248055, 7492661, 497254, 3302301, 244249, 799684, 3563120, 1909559, 5984676, 1599326, 4609508, 846504, 1399565, 5942152, 4990231, 338200, 6660654, 317501, 4464900, 7633013, 1478918, 259970, 6005231, 962514, 4221805, 6292404, 502072, 5485715, 5699212, 2803861, 1790766, 1739682, 6696008, 5940002, 1826330, 6601902, 2536308, 2300424, 5831673, 1226909, 2781640, 2869174, 3585759, 4403722, 2637476, 5481787, 4666610, 5183636, 989550, 3701937, 5950044, 4430445, 8052666, 7470833, 4380609, 5792855, 645783, 7998577, 7892458, 1097511, 1382569, 3916596, 5131467, 54853, 364241, 1230870, 1298065, 5289466, 3189726, 5741559, 5865735, 3985450, 5916671, 2668466, 5361938, 3101333, 3573081, 1625894, 1008380, 3346722, 6733010, 6175633, 1562486, 658709, 888902, 1482942, 7308668, 8226852, 6819912, 4277543, 6728011, 6797029, 1976522, 6856406, 2251021, 2692727, 7553549, 2492860, 4906022, 2011698, 6355644, 7473386, 4104674, 796180, 4121308, 4163803, 457129, 417543, 4661054, 4789029, 6764971, 4662554, 2717942, 6898760, 5824081, 2236949, 1276861, 5437542, 2895319, 5870740, 6664779, 4639537, 1910826, 5518169, 4867461, 5045440, 7819462, 847119, 4013479, 1990026, 3466835, 8179487, 799826, 8177691, 794895, 497262, 6503506, 5718439, 6163811, 3069409, 2676560, 1824232, 730342, 6550671, 126684, 2682296, 2996403, 5928466, 1019407, 381692, 5231174, 5018052, 667841, 4223090, 7522191, 3157450, 1749409, 4393306, 7207703, 650104, 4513150, 2288258, 2537867, 1683861, 7432701, 2540434, 4830782, 3979641, 64946, 5028240, 225331]] -aHat * NTT(z): [[1921421, 4549867, 4572561, 1346644, 5539201, 4193813, 6396665, 2367024, 7514888, 6357899, 2904798, 3076149, 1746584, 5854014, 20922, 3451673, 7051577, 7528886, 140308, 6142706, 2559681, 6072444, 402296, 4328574, 3098081, 835552, 4278663, 6567497, 5463153, 2979081, 5608742, 7160450, 8082368, 5969425, 5861442, 1060519, 4072784, 4987523, 2098217, 6814527, 5364818, 4690732, 345736, 1485338, 5431692, 7337934, 261324, 2378855, 958943, 982476, 157792, 8220009, 2135934, 3233003, 8312124, 5157883, 5026173, 250914, 61524, 701048, 3472724, 355382, 5762276, 2102143, 3348110, 1964196, 4646438, 8013904, 7332791, 3149513, 1194180, 7238024, 6435771, 5936372, 2467354, 2885402, 3121654, 7600901, 1211138, 6282126, 2977398, 7028639, 812232, 6983869, 2077797, 5519453, 7911481, 3350687, 3931163, 6702852, 6186519, 4006207, 2719557, 4217212, 2179661, 6265630, 581499, 502606, 2723894, 6873920, 6704712, 5739576, 6936288, 1945832, 4843596, 6807347, 7949910, 672272, 2691597, 8039211, 1983677, 2714692, 7474629, 7643401, 3731149, 4804731, 5145765, 2493782, 4902767, 7988645, 5639750, 5847499, 4498778, 3761819, 6053686, 5210491, 3843329, 6595276, 8346016, 2010365, 8054459, 6791174, 640683, 4188545, 3274702, 1956999, 2238420, 815950, 4841979, 4339070, 2617016, 8195438, 4819118, 3459402, 2780389, 3354566, 6311927, 4351921, 5743035, 5876728, 808506, 6800473, 5989957, 4474308, 1274414, 2052273, 2706261, 466481, 6524309, 7657751, 7241934, 3917377, 1339186, 4588548, 75003, 7817269, 390402, 6280184, 2067334, 8102458, 5682956, 3944665, 1386554, 2933703, 1418026, 3589197, 3004327, 7282757, 7735695, 2643135, 1949212, 3303199, 4221695, 5081073, 5160256, 6417424, 3413253, 4828093, 4307068, 7734289, 1871072, 7551456, 4888520, 7476328, 2757796, 3464752, 4254833, 2158926, 4960445, 7244685, 7798142, 4424226, 8301193, 3110785, 2937711, 7385119, 6226017, 3230458, 826209, 3399266, 6882732, 7859507, 1815255, 5419863, 413752, 7891538, 1778916, 1503379, 1384527, 1531093, 2766579, 147639, 690471, 2921473, 484696, 1780583, 1844929, 8044053, 5125259, 6433353, 1555732, 7016271, 7554443, 4208778, 881301, 5781032, 1333252, 3564186, 1549393, 2186853, 4431253, 440113, 6574103, 7865002, 1343267, 4767437, 5070957, 5260964, 194139, 7789439, 2147022, 594415, 5949982, 4798585, 4584341, 7671333], -[5808379, 3769867, 4323172, 1981885, 6898546, 5213668, 5250477, 4775505, 8037473, 1269239, 3951516, 1847605, 507604, 4153686, 6830046, 6086641, 3180929, 4126299, 3379266, 7698286, 2581846, 2508116, 4193265, 2465000, 3512669, 6092642, 8132748, 5155130, 7606584, 5418202, 1982434, 3320163, 5428999, 6829137, 6767206, 6772045, 1502137, 8215207, 3578444, 6602755, 3408242, 4513700, 5461165, 1589883, 4828323, 7610603, 2391924, 4024924, 7083823, 4487656, 4479740, 1769157, 4012812, 3138769, 7893197, 1626519, 1103297, 1965576, 3966775, 1711388, 5348371, 7564610, 6987936, 4975077, 3085161, 6219776, 3602596, 7982094, 5362917, 1946014, 149056, 3758596, 1643747, 4695343, 7466598, 2571402, 7772819, 7036861, 5893632, 4207625, 6725486, 4977803, 3786221, 8190818, 7865542, 5898130, 7017325, 2457270, 4591368, 2006720, 3861677, 8327692, 3158154, 936274, 7788066, 1299880, 1668230, 4313349, 2735729, 4090121, 1026473, 7725053, 7625378, 8261376, 734187, 6729344, 169941, 6652808, 1667931, 6830489, 3997963, 396643, 7053660, 6992819, 4287583, 4531107, 1287760, 6128455, 1378633, 7772725, 8353157, 3366419, 6558142, 814434, 2187714, 2074950, 6734156, 1178083, 4969220, 6480704, 5584255, 2155125, 313605, 2448143, 1298607, 1101597, 3582896, 1274298, 4688794, 134791, 2702410, 1121717, 2428476, 4597045, 1610746, 3298865, 6482154, 8084265, 6566162, 1799393, 5993849, 3817047, 726963, 8136955, 7625081, 473129, 740643, 3719077, 8152480, 8122354, 5893170, 7420445, 99075, 1332450, 4284957, 3370117, 7541101, 1518361, 1531494, 5238898, 2376098, 92618, 7543847, 5921384, 6451536, 3753247, 4471702, 6053271, 4947246, 8048290, 4884038, 2730378, 553689, 1433596, 8162377, 5746937, 7450264, 2289873, 3616092, 7545668, 4205676, 144993, 4178853, 4018803, 5441570, 6665618, 7716199, 2883514, 7857690, 7139766, 3699135, 6507479, 881352, 4347041, 4748682, 5397901, 6083263, 7579522, 6427267, 502787, 7371269, 2341979, 6727649, 3231640, 5958324, 4563487, 1157247, 2716422, 1418882, 466010, 308875, 3234765, 4426652, 8158647, 179324, 6398246, 1854468, 5627192, 2067898, 6182705, 490788, 1824714, 6229145, 4877837, 3824451, 6756532, 7709338, 5049605, 4822849, 7988818, 5995907, 5163229, 5457858, 6361441, 6776739, 4466338, 6179884, 3332377, 1404879, 7432434, 1038712, 6817581, 3634732, 6843366, 6834093, 7522635], -[3389016, 6045450, 1174858, 5715429, 6336124, 3043074, 70683, 3127896, 2617947, 449219, 2735576, 1171378, 6906726, 5207722, 1485521, 1350590, 5272361, 3986744, 930754, 761569, 3251968, 2042939, 2845622, 4290837, 1747377, 7039167, 3898995, 4748521, 7304312, 6250523, 5947442, 6608058, 1392946, 905762, 8088318, 7849817, 3848715, 6441054, 7984769, 1561740, 6491356, 2972610, 2294052, 2853926, 2060967, 3239627, 8107771, 4111573, 792919, 207748, 6907108, 1983220, 5980006, 1203356, 6956714, 1786435, 4343846, 7761917, 655011, 6887035, 1407582, 5511406, 3268265, 8272795, 3876196, 2889687, 7106753, 3021460, 406477, 3560677, 1480955, 6968628, 7956680, 5464746, 4435297, 7603207, 1510975, 4423194, 5055457, 7651339, 4198597, 5063919, 3369930, 8002095, 4789203, 1207850, 7643769, 2959548, 1409443, 6482317, 4340320, 2028403, 845953, 535715, 5610552, 2556836, 4394994, 4808034, 1139262, 2275041, 6396066, 7039924, 6998427, 6386842, 5451323, 2862983, 7413054, 3662384, 5199793, 7699607, 4493117, 1170878, 1389041, 3524798, 4717846, 1311715, 1279707, 2973960, 6144492, 4044054, 2212940, 1578237, 3298010, 1106008, 5683368, 6980110, 7531215, 1289564, 8099225, 1004693, 5407146, 4217338, 474252, 7534601, 2779335, 4379626, 1063611, 7680387, 83168, 6878731, 7747468, 7158197, 3136229, 2815127, 5976889, 1207219, 3399228, 2085545, 2821732, 3365143, 4867036, 4234306, 1804407, 6623665, 3332279, 5810121, 4618834, 2437669, 616116, 7925618, 3770047, 8228945, 5529956, 2437872, 4108753, 6139847, 724393, 4241267, 1829639, 3104872, 1366978, 3208525, 641241, 7370180, 7936078, 1964182, 6256501, 7547542, 1000016, 232455, 95455, 4570142, 6403173, 5373047, 5213003, 3076541, 1373370, 6402280, 1305747, 2247743, 7473048, 1120922, 425836, 5302859, 189672, 1998319, 4413126, 2601206, 2751528, 2465558, 5405832, 1651407, 3837840, 3505231, 7758552, 7600947, 1508687, 1670360, 7048261, 4304021, 1455088, 6158031, 687080, 5197178, 7974405, 1522969, 1564508, 4572070, 3045720, 7475468, 7977127, 7415060, 3013489, 145860, 3086, 2859455, 5729385, 4018951, 6987498, 2329719, 1650899, 2955697, 4195588, 3733840, 6808867, 4639171, 168098, 652891, 3181467, 6889732, 5891396, 207236, 3929324, 411061, 3752133, 339326, 4113747, 5851446, 8258915, 2416163, 5026933, 7180493, 3448147, 5384861, 3689756, 4582595], -[204560, 735344, 5587246, 959362, 6153771, 728074, 3987579, 1606941, 1203415, 722729, 3021020, 7979599, 7564868, 6483012, 2452714, 1626101, 3750880, 7874765, 996270, 4915085, 4176017, 174107, 6955473, 4495288, 5492007, 362584, 1747426, 2930146, 3402238, 4392158, 6055083, 4758642, 7084099, 2497044, 542545, 3202328, 3035242, 1208391, 7086738, 5020480, 1209855, 2719423, 4456733, 7939386, 4686699, 6418029, 1162726, 1656754, 134800, 6917287, 3394865, 782276, 4256424, 6201573, 658524, 4682891, 1532821, 6864898, 2334798, 4395362, 5754960, 5589367, 977796, 7738649, 5337641, 4535351, 6433880, 3393575, 7390215, 1596802, 861503, 5704381, 6028645, 1275000, 3449903, 5682417, 6502929, 2323109, 7889810, 3233590, 3081223, 4818255, 4578652, 3986825, 6341476, 1650066, 1808173, 2388342, 7892657, 8228497, 5491085, 6924243, 4062396, 2363203, 5061724, 2271216, 7692462, 4379988, 5218502, 3822440, 3145127, 4900134, 2578641, 5493328, 2132113, 2545040, 6030090, 1404515, 3872195, 3168449, 3199662, 3180156, 8181500, 4077736, 8020281, 6951563, 3056939, 6525093, 2524477, 4771061, 7828962, 1363298, 6630208, 6052866, 595407, 4152359, 3459101, 2874698, 5305281, 5274321, 1719917, 4946019, 7226328, 2457861, 1023305, 87038, 4272913, 7848704, 3113356, 7254427, 5861590, 4265193, 5311670, 268404, 4859147, 7738273, 3379532, 4466086, 4936863, 5278959, 1872536, 377035, 1836522, 2003548, 924952, 931240, 1162866, 2943468, 618817, 5110318, 5061440, 400501, 2277191, 4518723, 389235, 7561666, 6136162, 329901, 5047090, 2854993, 5131074, 7141930, 1937239, 5690544, 280290, 2571998, 2836354, 3426321, 4549828, 8244368, 7010141, 3591776, 6990602, 7816134, 6961131, 1072244, 224720, 4145935, 2484797, 7903533, 7036457, 2847231, 689482, 131087, 5543193, 8066198, 8289741, 4632489, 4787781, 6689016, 7336357, 8236356, 2833775, 238664, 3050326, 23136, 5075656, 6506092, 8200135, 3176608, 4661735, 191101, 1181674, 6494521, 4035079, 3968203, 4479067, 4500000, 7497362, 4419644, 1955199, 2035620, 4070831, 5411456, 2477735, 1475305, 5965975, 7821059, 120352, 3608944, 1275507, 6845385, 3585518, 7579652, 2049148, 242146, 472127, 5880369, 4466793, 7434346, 3925162, 6557602, 7313686, 4815212, 4461651, 2632665, 1641302, 1236710, 6759439, 482012, 1037645, 5201043, 3901415, 3953324, 3701452, 5456205], -[5462952, 1043296, 3578626, 1294625, 4856419, 4673395, 5969503, 2503087, 4228667, 743672, 4642468, 4397787, 1467341, 7803633, 7944641, 4211995, 7233503, 4597278, 5164442, 844881, 7138253, 5530576, 3787643, 7666584, 5356114, 2000792, 168153, 5404250, 1182624, 1084782, 5445085, 2322344, 5024620, 465588, 3213403, 6162283, 5448238, 283059, 7643310, 6848381, 4468879, 7775955, 6478347, 2465540, 3714266, 7408531, 2519460, 1279775, 1479813, 5595651, 5938654, 95109, 4241943, 3754453, 7438494, 6390217, 2045216, 2708896, 2517733, 8179307, 7689847, 5654306, 3885027, 5003725, 1316612, 603597, 7137466, 7335154, 5031917, 733439, 1472463, 3709367, 1895188, 1511819, 2851571, 663467, 3330009, 1634454, 4221035, 8068895, 1881401, 5842158, 4967268, 2573389, 1019079, 2920245, 3651959, 4004951, 6435769, 69266, 6099829, 3922770, 5080277, 5773136, 3930303, 7470548, 7126833, 382244, 6925695, 702507, 2349480, 1433943, 7341397, 3481782, 4877417, 8112161, 7406565, 8177507, 5159073, 2668163, 3038294, 5062380, 6973198, 5103666, 1696121, 4860897, 8160649, 1749202, 2275101, 3154765, 4293224, 7859915, 1930311, 3919091, 2986908, 1415439, 772064, 5270487, 11244, 1874643, 807847, 565045, 4650160, 2988834, 1941205, 4904363, 2264453, 4746482, 6129116, 5506223, 7323146, 129901, 4559894, 142521, 4410058, 3189062, 2886103, 6705600, 6638760, 2649688, 4956242, 497939, 1668070, 379980, 563635, 8361395, 2906224, 3728504, 2391793, 669507, 7017441, 3869488, 1439170, 7126426, 7372362, 6396906, 249232, 5174404, 7664934, 709336, 240686, 2504498, 4478867, 750483, 4351548, 8177436, 4235011, 2890185, 3624008, 373791, 631416, 1909231, 1794456, 7763859, 6011846, 2054820, 6833400, 4659406, 5573474, 6861181, 3541292, 4107783, 1155052, 1398827, 3540318, 2301571, 6083803, 4718217, 6910989, 5240607, 8074459, 1517792, 4888111, 1892227, 3371594, 6729967, 972437, 6798502, 4981093, 1742252, 6018024, 159481, 6074633, 4432553, 2373258, 634302, 1971470, 6093679, 7838557, 4448807, 6292068, 1322868, 1183313, 172349, 5979068, 381150, 388750, 3037499, 4246853, 5230697, 7822686, 7733158, 1996539, 6976532, 4291133, 631695, 7893526, 6333903, 4522824, 8244799, 3030729, 6268294, 5780837, 205735, 2558739, 2330047, 685774, 4968184, 5322104, 357030, 5627468, 6296906, 7984327, 3905848, 5491718, 357874], -[5288504, 499627, 4343506, 337774, 1471678, 4252574, 4690653, 1736836, 3682737, 7583299, 2601701, 1037933, 638666, 7767567, 3901022, 1638857, 3805095, 4120147, 4999127, 1632669, 7548907, 2918776, 7500139, 4653899, 6696914, 5334016, 1473696, 2282168, 7471659, 7320070, 1651110, 4503451, 3597806, 2381006, 2029865, 8049697, 958330, 1567194, 7648863, 5035382, 6008679, 6430754, 5360952, 7807464, 2960220, 4562532, 3927026, 7293206, 3265316, 3602315, 1007088, 1986200, 3178257, 5206512, 1473860, 4670922, 5833464, 4025411, 192774, 4211421, 6819128, 204240, 7414369, 4153818, 6890613, 5569303, 4755080, 5814864, 1146508, 611844, 2369514, 5903071, 2131628, 5197798, 5522951, 1101933, 3557879, 2563703, 1418496, 2419862, 3582744, 971238, 7060746, 5299502, 6730900, 480716, 7145298, 2844197, 1634317, 186432, 7314816, 6958047, 3702081, 431530, 3977163, 4405541, 3681903, 549803, 3029689, 6046676, 3191866, 1739820, 5691486, 3708426, 3679526, 414144, 1082904, 6352483, 5483823, 3402661, 6908486, 3500929, 6193276, 2580558, 5275721, 382226, 7060916, 3113322, 2589816, 5163902, 4359874, 6668719, 3099066, 3134180, 5141909, 4070787, 3287983, 4850742, 1529519, 5218251, 8166425, 126464, 1895644, 4048407, 8131220, 4887208, 8223539, 563052, 3585453, 3601668, 577797, 3160863, 7853123, 1647684, 3632294, 4237247, 6409516, 7727688, 6648916, 6210131, 2518766, 5328280, 3249229, 892768, 7585860, 1759442, 4224808, 1965660, 4926164, 485768, 1733379, 2552699, 7016291, 417084, 7195476, 3722244, 5790036, 1150563, 7614775, 4427998, 2844795, 3700917, 2038195, 7762549, 7352049, 437527, 772720, 6502775, 1398878, 6267402, 5257388, 4845156, 588533, 3272451, 5488234, 4519808, 3719919, 6149973, 5461667, 4018273, 1143312, 7703674, 8122159, 414070, 5080192, 2883456, 4455077, 7750240, 2976425, 1865193, 6950372, 2232608, 2816905, 5123792, 1767750, 6654925, 4422394, 7216114, 2108025, 3181187, 2424144, 2802905, 3911366, 4794831, 766799, 5952775, 3325506, 3710751, 4765842, 2980050, 7480002, 2956099, 7545562, 4731180, 2454499, 1324438, 6892522, 2242579, 5462283, 6350207, 6738995, 3840795, 7740498, 973926, 4828353, 3303128, 1847785, 1512419, 3750079, 5591017, 7495234, 3920840, 2631635, 5301978, 4175650, 6793844, 7986988, 2592077, 5378051, 3423808, 7642970, 105629, 5430412, 3579749, 7337121, 2461364]] -NTT(t1): [[2465103, 2822635, 2594302, 2910374, 1036426, 2094292, 618434, 5132084, 8210004, 1708789, 4084084, 5389518, 3845241, 4241152, 1096633, 4931405, 6811198, 1187541, 2493940, 4907330, 2540541, 4855926, 7450141, 5677353, 2141331, 4290553, 1194864, 3258203, 2624409, 7772397, 7291668, 5648877, 4641288, 2097607, 1482031, 5822315, 3562054, 3840902, 1928868, 4883382, 4601327, 7000987, 7247339, 2926730, 551439, 3022367, 1058829, 2715079, 1613054, 4976717, 5451463, 3084519, 7103168, 4027847, 4684692, 6882045, 3432886, 7139447, 6920229, 7077008, 1775903, 1636444, 6746543, 5010599, 578493, 1042930, 1814232, 3764155, 6351121, 7793658, 6953696, 6455464, 7544831, 4182288, 2342867, 2239519, 5820499, 6336676, 7214586, 6797948, 7162193, 6786824, 7471125, 4745380, 7166676, 3190191, 2974815, 7318032, 5364419, 7830175, 728984, 2223545, 6479411, 2551613, 7366355, 2917229, 1787355, 4257600, 7911122, 6458846, 272496, 2895842, 1563332, 4738741, 630128, 2677028, 7360090, 4960604, 6642604, 3348584, 7552848, 7556226, 6995055, 2001871, 6315219, 2760311, 525390, 2124427, 8002195, 3208106, 2030864, 676695, 6078178, 6270505, 3098120, 7411852, 1703069, 3358278, 4683254, 2798507, 7797677, 1424293, 6700691, 6759264, 5298931, 4869753, 6543357, 5742714, 507500, 6193230, 959556, 3048974, 6023896, 2669711, 2715833, 7153611, 5689153, 8308062, 1707578, 5024144, 7718170, 8309608, 3206757, 1432072, 781830, 7384796, 3479713, 5099252, 309708, 5369434, 6341509, 1525091, 8220284, 2521393, 3252951, 63123, 7184341, 5858651, 149170, 5732571, 61842, 5262372, 2384977, 7092043, 230620, 7841635, 2920731, 477260, 1439478, 7355284, 7828553, 8348717, 5617493, 638472, 2371278, 2922110, 2840881, 5546630, 3401537, 345345, 8068376, 2202145, 4857942, 7226326, 1629087, 5185240, 7577959, 5300769, 1445524, 4758323, 6212623, 6966642, 8065316, 3681542, 6635706, 8317961, 6738386, 6613130, 7513372, 7280664, 6453542, 4372651, 7484064, 7477587, 3337036, 3031044, 1026276, 143691, 3639865, 507770, 6422807, 7965295, 4342288, 4368466, 1345950, 1272043, 7384097, 2914668, 548728, 5625749, 4253044, 7000388, 7854240, 3897427, 1817094, 4072302, 5197687, 3906854, 3849422, 7128041, 4458333, 2737935, 1040230, 5657125, 4094833, 2760480, 389530, 3264779, 4762029, 3518246, 6780235, 5851286, 5539344, 2216881, 2376246, 1865118], -[699794, 2800210, 4919939, 160664, 8024568, 4992139, 2026687, 7911503, 6609409, 1101580, 2007299, 380412, 2584548, 5562993, 4010124, 3832417, 7356837, 1326544, 538047, 1177982, 3025914, 751210, 7345704, 5117511, 7977244, 6557990, 1187616, 3765792, 3442206, 1340189, 6766282, 6741937, 1865471, 2593384, 7701675, 8305332, 7041711, 3911985, 7955326, 6727556, 4150463, 3703120, 1169487, 3012574, 3965759, 5397844, 7774176, 1912508, 6599124, 7901817, 2332577, 7119441, 3730492, 8231196, 2562612, 1237719, 1636078, 1212542, 5358500, 4008275, 5229403, 915481, 4865886, 32994, 3163507, 2692844, 8220750, 870059, 3861268, 2529185, 3990492, 5034747, 4153075, 5002347, 4913556, 3139196, 5676684, 1765869, 5829928, 1531962, 2269834, 7196450, 8169017, 4237164, 6809485, 2816776, 6662070, 7716803, 4839372, 1393335, 2820615, 7234857, 5155583, 4365765, 5396960, 7418811, 5605680, 1644277, 6093278, 7794335, 4318830, 3515740, 1402645, 357941, 6209337, 5789189, 5369249, 1272472, 7686903, 114359, 3236731, 3404118, 7494734, 6543368, 7600940, 1792954, 2465533, 6834721, 7410763, 1783369, 4595619, 4715966, 154707, 279632, 1207935, 923641, 3216153, 5412135, 6496107, 210760, 7472789, 2327345, 19370, 3935543, 7701290, 5719550, 3533865, 3648027, 4677564, 456288, 7218379, 4101710, 4345314, 4101258, 3558641, 4885660, 6783341, 1507504, 7160785, 8055370, 2634956, 7484111, 2663268, 3328283, 536778, 2056373, 6190636, 4499415, 5314140, 236765, 2622774, 1869198, 3002023, 5896728, 7169178, 6457327, 2203851, 6151335, 7027042, 2636431, 8217935, 5997336, 5543393, 1462476, 6049623, 1000700, 6107159, 4733671, 5812596, 4505599, 7080256, 3892821, 1368318, 7438106, 8101011, 5909278, 2720225, 2385049, 6401827, 4921896, 7351395, 2198269, 3645059, 5049551, 3240737, 1910347, 8249516, 7444432, 2689084, 6950479, 872966, 4651351, 929574, 796564, 6478958, 4897355, 4354015, 2667439, 8248742, 8319386, 3919612, 5565317, 4864837, 7446783, 4476646, 4887045, 2259065, 1675416, 5195741, 6096177, 3036614, 6357472, 322624, 7333407, 1984147, 7878535, 1551387, 5956261, 8340173, 7755338, 5727584, 7242914, 3441516, 8124994, 7016615, 7957935, 5970699, 5536639, 7791305, 4629267, 2921358, 6546085, 7704635, 611706, 7788768, 5896766, 2308591, 155015, 5591056, 4871223, 7048725, 2615093, 3356678, 1077673, 3584664, 5167993], -[2521997, 3370917, 912088, 4127513, 3520874, 7108176, 400276, 3811249, 383955, 6199522, 3470112, 6573522, 2653874, 7252874, 3635003, 7409391, 4857696, 2490455, 5009560, 3437342, 2807372, 810599, 1089762, 5755749, 467317, 352658, 4539930, 1527038, 7765722, 2450047, 7686613, 7009123, 4492308, 7299073, 8248872, 2208718, 5308280, 8274760, 5680062, 3621075, 1958356, 4032393, 2254756, 1062333, 6067216, 7361232, 5165506, 6639480, 4689286, 1450462, 4248848, 3051201, 303527, 3791284, 6343150, 2604962, 3463190, 6341295, 6907115, 8269373, 3836158, 1023583, 5856370, 5989775, 2199604, 6919058, 8021925, 625411, 213237, 6846480, 5840865, 5860840, 5135369, 1266066, 873248, 4256729, 4731525, 5032743, 2416493, 4597357, 6427220, 6985242, 6606419, 2871154, 120267, 7053593, 295089, 1187510, 4189326, 5635230, 6630033, 6063448, 3695125, 4074593, 4119865, 1349385, 563649, 7603784, 8010493, 7179172, 816828, 3361887, 5383924, 860510, 2817656, 1117889, 1057760, 1989738, 2704211, 5284512, 6984540, 7802507, 7338603, 3948037, 7522807, 3554865, 5766672, 1924643, 8264061, 4347882, 1721126, 308039, 7352717, 3636277, 6561553, 6661432, 6411264, 7684024, 3217052, 756320, 5457372, 7447943, 7174845, 7572015, 5821166, 6176937, 4667965, 3591259, 67838, 7056554, 6015078, 3533644, 3012317, 4499950, 5279248, 3425248, 4825004, 3438211, 5639975, 5336286, 6198919, 702397, 6969478, 538324, 6225786, 4147883, 5313334, 3152940, 6744803, 639270, 2360233, 6700339, 4990079, 6401868, 7327506, 6455453, 3626918, 3428701, 1370394, 6506983, 7691033, 7933859, 3200930, 5185183, 6974711, 5821962, 1017258, 2145232, 3487507, 5752804, 401015, 3148439, 7619793, 2695454, 5643727, 7976781, 1412145, 3367460, 1463186, 6676787, 6353275, 6174450, 557009, 1945305, 4729179, 3124796, 3453114, 7882385, 717654, 1257513, 4336970, 7760808, 6714873, 5113048, 1556272, 3414761, 11836, 1476304, 1474532, 39627, 3555123, 2350732, 1530232, 3521549, 96451, 2879468, 7511453, 5996353, 7465007, 6417949, 2910590, 5589094, 2042198, 4396800, 1127649, 6639449, 4325621, 818654, 5146310, 7163005, 7604302, 4395746, 6878633, 2757996, 7616266, 3336779, 4288607, 7847490, 2312470, 6263, 8316010, 4226096, 537350, 4614512, 6348076, 5479712, 5006039, 2364876, 1917667, 1625224, 4871504, 236610, 1412405, 2862770, 333247, 3152664], -[5656882, 1546516, 6684076, 6736632, 2388573, 4302206, 6273344, 484690, 4004921, 1850729, 7854628, 2634196, 5752042, 1993361, 2803706, 1867998, 268288, 3288181, 4222426, 2361560, 4057123, 2562782, 3262591, 3951155, 1345207, 7269799, 825737, 5712882, 7340660, 8374864, 7677583, 7552123, 5455298, 619173, 8157193, 630442, 2276833, 915093, 8355742, 8362957, 7848712, 1347960, 2435688, 3620434, 5239527, 5132313, 771334, 4562045, 1940551, 2703796, 3475373, 4724177, 8257320, 1535055, 896792, 6619367, 8371623, 3015442, 1967302, 736885, 5127196, 1088021, 825578, 6276201, 4842227, 7043053, 840150, 1707067, 7167603, 969631, 2120190, 5892610, 7765107, 3345992, 636045, 463148, 6822698, 240903, 652014, 3538190, 822057, 3211335, 6880908, 4335711, 2699422, 1553692, 2233019, 3591311, 1060889, 2503231, 7960536, 7274138, 4920652, 2958390, 3275982, 2883454, 2321943, 6665265, 803914, 609652, 6004694, 2634190, 4767898, 5802020, 8296899, 6989028, 6888021, 2820324, 3060705, 2673532, 1329748, 4296433, 5615976, 2983663, 7996727, 6332142, 5758112, 1985095, 4318242, 3819420, 2663796, 7563912, 1454724, 813333, 4044355, 1672926, 427008, 2336078, 178592, 5484674, 601489, 3399933, 2506331, 574269, 2664357, 8133627, 768599, 5635506, 5002954, 5944846, 522795, 1887209, 56080, 2334943, 6658685, 8264071, 6662523, 3940415, 4123067, 6956355, 4478172, 529700, 3886328, 5736414, 2476510, 2400611, 3243593, 6953665, 3938466, 1349061, 6199103, 3887870, 7605763, 8365003, 899546, 5375249, 5722618, 6600156, 6765287, 3854154, 5044594, 6895789, 3968152, 3423979, 4735633, 3904425, 4762046, 3467728, 3341925, 5263470, 6652830, 4779801, 8077841, 3203536, 4799440, 7765892, 4004306, 7498229, 7519690, 3649357, 5433454, 7184019, 8373920, 287002, 2058366, 7110738, 4856755, 5048610, 6340885, 7054226, 5381519, 3303112, 2618690, 4644214, 8020545, 2808404, 282802, 5177082, 5080139, 8035367, 4671059, 2829418, 6052399, 8300342, 8193220, 7980694, 7905382, 4364061, 1865535, 8203074, 4584814, 6757245, 367074, 2319215, 3241074, 8267549, 6186874, 3650486, 4162839, 4715732, 8116511, 1023418, 1808378, 4171468, 638638, 1102695, 2358653, 5488846, 5000238, 5700038, 5172551, 3380099, 2233556, 5478157, 3865393, 7018839, 2575466, 22162, 6700855, 3549806, 5782172, 5802877, 611904, 4093417, 2808869, 5054593], -[5530332, 6656075, 2985085, 6425099, 5562827, 211989, 8111958, 4437937, 3433823, 6261319, 1485321, 6383811, 6089975, 7117748, 7060790, 5508289, 7190185, 6565558, 3076403, 954382, 5753268, 6339866, 4096172, 2781053, 2950010, 2377265, 569998, 1339333, 7497980, 5094837, 7655047, 3032659, 27582, 5297451, 455522, 4801861, 7379179, 7552979, 7586379, 7113717, 6325753, 3503450, 4011703, 5957161, 4686526, 7363743, 4048920, 557922, 4616548, 6808382, 498089, 657577, 5220151, 1641977, 31368, 5620335, 6558771, 589338, 2943246, 4537587, 4170530, 1998200, 6128707, 3286285, 6213454, 6560935, 7636692, 327437, 7591440, 7010590, 1994352, 5801622, 8041609, 7902493, 2866872, 1667388, 1706525, 571872, 197825, 5214079, 1423781, 7464114, 1806487, 5861013, 3013439, 8374536, 4705605, 4099992, 7026676, 91148, 4768456, 3672408, 3155411, 8314476, 7101633, 3391789, 1481008, 7291972, 6290285, 4266778, 4089707, 8334508, 4046751, 7449522, 2074752, 3911418, 5872688, 1388108, 4347790, 3753980, 1047109, 157563, 1676714, 1011117, 1151246, 4114859, 4106847, 6637911, 5438811, 1684428, 4635569, 2736476, 1469526, 3984852, 2318252, 8040253, 6712530, 4236613, 551295, 7832067, 1313966, 4989957, 6904024, 4557819, 7596729, 5250121, 6583940, 5041638, 6319648, 5312781, 2766288, 8136138, 5605528, 4716037, 1169400, 4443127, 3558772, 303423, 6830943, 3301198, 8189444, 7243342, 718820, 6298501, 6380511, 7380609, 4554794, 2828292, 3520237, 2320499, 57763, 1423211, 5846926, 3935371, 6597374, 6475312, 6550063, 6801386, 6333221, 6325267, 1567836, 7005641, 2376287, 5931706, 5355363, 6275036, 6488488, 1450773, 4762546, 3569674, 3285451, 313352, 8054832, 2702227, 2156289, 2333003, 200670, 5527117, 4056455, 1054116, 6267802, 2130280, 8157391, 7650345, 5397182, 5706547, 6069758, 5355618, 6482889, 162634, 1207038, 7135331, 6398446, 2959151, 5453548, 2319493, 3686911, 3003519, 7686791, 70578, 4207897, 207047, 4256553, 2291852, 6786142, 5768767, 7115064, 1613051, 3691659, 5311885, 3597109, 1694367, 7191422, 5267947, 7431104, 3506698, 3232692, 3440571, 8141132, 3367600, 8211231, 6515795, 7668910, 6027174, 7770237, 6996794, 2000179, 2524778, 1547181, 6473957, 1616269, 7002238, 6460041, 7159237, 1696155, 5205285, 876136, 1779666, 282086, 1013538, 5831896, 6145377, 8215099, 4246741, 8195369, 5729575], -[5963162, 5701763, 6163110, 8064739, 4804876, 4204734, 134920, 4002931, 549865, 2435200, 3578943, 5852619, 5102513, 2525367, 1952080, 7897081, 2828708, 6576433, 7794187, 2339082, 1615166, 3674745, 4360228, 3875937, 7986986, 1742553, 7131935, 581941, 1724125, 1288386, 659, 8130506, 3501623, 119775, 1633477, 7998280, 2926304, 6815464, 302222, 3585489, 5703237, 8308945, 3933285, 5787325, 5073992, 2281678, 7772495, 7348805, 1180249, 906476, 6534810, 6941758, 1338331, 1799462, 2886590, 6119686, 7403327, 3835762, 6508316, 6494400, 2625208, 3825097, 4737063, 5448968, 1948111, 4020652, 5445346, 216707, 6626092, 3622381, 664390, 5517270, 6492651, 454421, 1334328, 6784239, 997773, 1590507, 6927179, 1360413, 1793334, 3605038, 2224576, 6812092, 494591, 4409534, 3227074, 8096208, 7187822, 5455571, 7736845, 2717984, 453302, 4783573, 6915021, 3655651, 5708719, 2280412, 6426420, 7502522, 4192688, 4876799, 7315808, 1497718, 4195508, 1253808, 3574820, 6354055, 7470243, 4269035, 3607547, 8277164, 5598432, 6944489, 2777815, 6414652, 6311422, 2821703, 7883247, 4204426, 1561122, 1660760, 6598198, 1943695, 3760224, 42203, 875511, 6217844, 8329208, 722523, 3278755, 3099237, 6791053, 5801059, 1463478, 4994371, 6787400, 7111166, 2925247, 3988852, 6981638, 598465, 3448954, 600750, 5507658, 2565371, 5602143, 1966699, 5443082, 3338927, 7615728, 4206790, 5723474, 7881573, 1613901, 1753109, 4507331, 2361806, 4839642, 4719201, 5726954, 4625065, 8080577, 6186843, 871259, 7063791, 3927879, 6453773, 4103056, 2508618, 2448705, 6662443, 1717628, 7726937, 3141825, 3936773, 4319693, 4615508, 3842488, 4282003, 3931231, 5168789, 7641387, 623956, 1799841, 4901016, 3405720, 5463139, 1023159, 6256328, 3018211, 5664331, 7452483, 1503011, 4160288, 1255744, 8144043, 6568356, 2850367, 3805916, 1162447, 1660212, 2307528, 1040250, 2963164, 6054424, 2473204, 2717764, 8074390, 7884116, 2149769, 5803428, 8258696, 7239487, 1009747, 2125599, 3819518, 3629786, 4029308, 3444918, 6787020, 7416657, 162834, 3134579, 4569636, 6054726, 3737448, 4107907, 903076, 3955876, 5302491, 5535040, 640808, 7729042, 859112, 7861201, 6070387, 556930, 8334558, 5633950, 5126928, 4094150, 4459226, 6723073, 1063250, 719137, 586238, 5918024, 7324066, 2219801, 8220967, 926795, 7764031, 6695111, 2951606, 4005233]] -NTT(t1) * 2^d: [[5699223, 1455417, 8164889, 7877860, 1039371, 1726465, 4439460, 5860456, 3506343, 3103098, 2191464, 2894700, 6607186, 6688719, 8190929, 4459820, 517630, 7052152, 7280251, 8367428, 3536461, 6286710, 5358478, 5941843, 1570771, 741278, 8379249, 7951248, 3388923, 5448275, 6112297, 7318127, 7859784, 3741694, 5954136, 3451333, 8114791, 4583766, 4200611, 4935003, 7335535, 4891973, 3327060, 7779540, 343525, 3478646, 195573, 300450, 6601176, 6917376, 7523120, 1422393, 3917025, 2420895, 3067421, 2647481, 5903077, 7799998, 5375380, 7505147, 8173881, 5462465, 7210558, 7924959, 4079051, 4037637, 3709203, 4403617, 2754496, 3629630, 2983283, 2729818, 1680177, 2158600, 1611534, 1406835, 5335495, 1746894, 3187828, 919051, 1385639, 1975830, 1270649, 5778914, 4588707, 3904466, 7812261, 4195343, 6794117, 1081882, 4980024, 4634499, 6154051, 2053698, 6177760, 5371101, 1423661, 7344063, 2146763, 5293911, 3096310, 6157554, 1538568, 1674728, 8052121, 7042504, 5137382, 625935, 2164387, 2495287, 312105, 2843430, 6579531, 7231580, 1959907, 2102646, 4840959, 5560292, 2359666, 8197057, 1710143, 4029803, 4376779, 4401167, 3896364, 1770419, 6527360, 6484782, 8048159, 4928849, 3031610, 2267792, 329322, 2475569, 6663109, 2231656, 2033412, 5032467, 753168, 8276059, 8232023, 3552348, 3860736, 5764559, 6477218, 6505648, 2042439, 2277447, 1563003, 1559761, 5382792, 6561862, 5526466, 7330441, 2112772, 6398926, 4010679, 5074056, 6242002, 5974912, 7817162, 6724142, 3915933, 5903968, 6828949, 5898179, 6833298, 7801250, 6840175, 5745181, 3784644, 486376, 2979557, 4965612, 3645215, 2777615, 537817, 4439598, 957057, 7668715, 4555292, 106527, 1632909, 982416, 8083187, 3454168, 79143, 7752403, 504579, 4865711, 8167730, 5314456, 6040948, 7177321, 3856840, 5532724, 4891409, 4959171, 203387, 2862549, 7915592, 91494, 8241461, 6451698, 4318890, 7946302, 7431750, 3745472, 3760976, 8152116, 3745628, 2854734, 6701933, 3924851, 78658, 7517294, 1694741, 3858292, 250394, 2965008, 3377018, 1769878, 5533548, 2092882, 5774045, 3717925, 672718, 1152223, 3276264, 2222725, 3542979, 8365382, 5472771, 6713631, 2013456, 6238324, 6933544, 135445, 7336270, 6546633, 806650, 3167628, 7060488, 7842407, 6443102, 3487094, 6471300, 3158921, 8080850, 1217169, 6661661, 6130089, 6728410, 325513, 6878958, 1546465], -[507220, 2118991, 2714935, 434019, 1270108, 7548145, 1013827, 5267915, 6784708, 6814668, 1415254, 7200397, 3683874, 7711427, 8081585, 2117982, 3630057, 6028016, 7962099, 4168577, 7394419, 2686242, 4613108, 3804278, 7471499, 4581110, 7666552, 1053087, 6828764, 482018, 1304106, 2999874, 4438241, 644633, 4342424, 5054538, 3286301, 266512, 3908000, 2516560, 1241127, 7229917, 1620873, 7058560, 5001436, 4057956, 3261009, 4266163, 6334158, 1343956, 1120024, 3138769, 5190082, 1122450, 8353336, 7469895, 2464193, 2349919, 207754, 1314994, 6958089, 7527554, 4074860, 2113504, 3199980, 2520504, 7733405, 4168878, 3813698, 2692696, 6484164, 4615367, 5877797, 7367911, 707901, 5174276, 461395, 1399106, 7154110, 4348455, 6715222, 5465222, 2957519, 7540691, 3245568, 3740991, 2401936, 2564745, 4763014, 72366, 1668411, 1639520, 5614673, 5107541, 5196645, 115628, 5425817, 2587065, 2369724, 795197, 6115203, 5829268, 916133, 7487139, 6137931, 256485, 4459392, 7232293, 656038, 6602641, 8041381, 4887297, 1925986, 2123524, 402170, 5388584, 841366, 468455, 1229748, 2292017, 2477684, 7851519, 1916777, 2891503, 6511460, 7330938, 7074745, 3803990, 460594, 180018, 6521720, 161565, 7831534, 504057, 1188504, 8022570, 3461762, 70162, 3337764, 245314, 738416, 4116567, 5181289, 413783, 5296746, 6835545, 6964762, 5118527, 6612137, 2187582, 5985777, 7086957, 3266005, 3797835, 5946868, 1169446, 3786845, 2133714, 5548982, 3702553, 6755837, 1448157, 4428938, 1272188, 8324257, 1230680, 2529174, 288899, 443691, 1308143, 1433759, 4172058, 6376150, 4987499, 5105895, 1686574, 7137455, 2043373, 7637455, 2510540, 591095, 2502947, 4643527, 7332762, 7340306, 3516784, 554397, 3569381, 7497615, 1985845, 951278, 7083932, 897557, 183480, 7336865, 3324085, 352384, 492435, 5240252, 1770870, 2841771, 6491710, 5651572, 5487862, 2443075, 2075981, 1036128, 3913169, 2392193, 2859068, 4083977, 1608384, 3861869, 2990993, 8359657, 1420631, 2299744, 6265243, 7752746, 977081, 2864232, 4499386, 3104453, 4441088, 4503661, 3367403, 4250132, 2902338, 5537832, 8168036, 6793762, 599128, 1176284, 2679034, 7210294, 139677, 3852596, 1329884, 1114688, 1568339, 5674201, 7620354, 3449493, 7986603, 5472835, 1583484, 5756720, 4439913, 2951847, 5893479, 2082070, 2496004, 1757999, 3718115, 586320, 6712389], -[2471519, 1078049, 4873349, 5984318, 5984911, 3040476, 2317945, 4698483, 2702985, 1157204, 783040, 6112999, 1734110, 6767695, 2322975, 6751158, 4025716, 3872382, 7793888, 504544, 2127176, 3136744, 2186199, 2869766, 6790712, 6110888, 7196331, 5913132, 1049177, 8066726, 6660775, 4498749, 2576089, 8111138, 3457153, 497553, 7826364, 6021224, 2992720, 5550637, 2734214, 6140059, 522084, 3759090, 6760662, 6112229, 3099719, 1713830, 7179801, 7133815, 2691015, 5035098, 5889752, 373126, 4499400, 3307022, 2740935, 6064074, 6890913, 3793005, 7623003, 4774936, 5876132, 895265, 1259418, 4162965, 4759903, 2932125, 3710768, 4613596, 4565427, 592287, 7629925, 5036843, 5151915, 208831, 1224175, 4959433, 1365702, 8334963, 6006646, 1615188, 7431879, 5043466, 4718475, 58641, 3808992, 6798200, 1150977, 4467324, 8128176, 1034457, 397796, 8245362, 1994821, 391897, 8183258, 6939384, 3293546, 6390935, 3882210, 2528042, 7351154, 1367223, 2569534, 6331324, 8199159, 22631, 3454381, 5868499, 4244821, 696885, 5104635, 2289901, 5628743, 7885422, 166395, 3111079, 2179186, 1077094, 3602798, 949971, 3400685, 4379166, 247538, 5555857, 1001349, 2212521, 6058936, 2645277, 5647146, 4113296, 4465819, 6480663, 2419142, 510058, 126509, 4330058, 2621374, 7554319, 7047433, 1651330, 4953216, 6516434, 4647896, 1995500, 4386196, 7623392, 1436279, 2599840, 4597845, 5070162, 6563172, 1850866, 6801467, 5247018, 7326647, 439286, 1336895, 7519632, 1406717, 5826155, 7433459, 7833487, 6382598, 2639706, 3133991, 5141225, 4889285, 5752616, 967330, 4039093, 8074184, 5065780, 7529823, 559557, 3243038, 6095, 815791, 3885577, 8371833, 5469179, 3998440, 7140790, 7031412, 3678603, 3316380, 6279973, 2423402, 5637762, 3639230, 5277805, 4070880, 4765843, 7146994, 4535314, 4002513, 1384935, 4349251, 2014003, 3870577, 2695774, 7562845, 765050, 2365967, 8270583, 4775925, 940637, 3185247, 6168538, 1618541, 7378695, 6937129, 3134094, 2367394, 6108418, 4801362, 4499739, 1434495, 5482367, 1266915, 3639977, 2373684, 7933751, 2481074, 1459878, 3084156, 2079968, 5074010, 8037543, 2802423, 7679800, 8218045, 8279417, 246507, 6353731, 1560480, 459273, 4011820, 1023994, 344127, 675805, 2252275, 6401634, 2951107, 4287252, 4091107, 5920505, 4626606, 5732812, 8195431, 2432793, 5446300, 3405074, 6323899, 6558711], -[5851751, 6248985, 6686331, 1443399, 7296738, 4018067, 2517004, 6643239, 7360694, 997615, 270850, 8140274, 6023690, 4560996, 5616972, 8378591, 2146042, 2118514, 4132833, 3897084, 7598211, 1365559, 1995659, 2691306, 8067806, 2950206, 1440985, 3680816, 5194745, 4792326, 8110768, 2753322, 5417772, 2112931, 6660315, 2243992, 5388111, 4349058, 7372825, 7815186, 2089480, 5479131, 7763636, 299565, 6089727, 7736424, 8314127, 3993237, 7723160, 54701, 1979067, 8072695, 5619833, 4545060, 5274772, 4556474, 3383305, 5411965, 596093, 2661680, 7720045, 4684761, 138457, 780297, 3009923, 5899548, 2186443, 5757308, 3802274, 6962253, 4372456, 1059200, 4391514, 6402874, 6241683, 6159932, 2541043, 4079381, 2973059, 5370494, 4816093, 1127357, 1713594, 1937266, 6124978, 6371858, 6821754, 4756042, 310259, 7968370, 4686235, 4973626, 175414, 7345333, 2749310, 5240062, 6190883, 3434125, 7036143, 7921069, 5785875, 8091122, 5877196, 4803033, 3014738, 7488849, 1320371, 7664956, 7468113, 3544523, 7133933, 7008153, 5966479, 4871324, 7848312, 6506451, 5466628, 3889260, 1298307, 4591979, 7591381, 7144223, 146034, 392421, 3567759, 2627997, 3415647, 4658965, 4833106, 3033871, 8093109, 4125445, 8222319, 2997711, 3806676, 6357234, 2669841, 6728316, 3960038, 1575245, 343553, 6527180, 6864842, 3741462, 8193684, 2261106, 6112912, 6893813, 3084354, 8004977, 4099815, 6626811, 7975210, 3705369, 6960780, 5347030, 5591966, 2729331, 7688439, 6118106, 6105173, 3846440, 6390518, 7815184, 2694289, 3328890, 8014375, 6407885, 1533483, 4198729, 1477821, 6292908, 7844058, 8360686, 1355243, 5378328, 8220114, 6394563, 6607678, 1100775, 2131609, 2821568, 1900840, 4281285, 4476333, 2441817, 2322614, 5415775, 5235530, 2585105, 2460481, 4195474, 5439495, 4603624, 735268, 7267546, 4697461, 855225, 2705354, 5244177, 4410228, 7107428, 6821377, 6688325, 1835360, 2200903, 3718892, 5745724, 7728283, 5931346, 331306, 6739251, 2705636, 6078543, 98487, 2212231, 5407185, 7909207, 4962529, 5398702, 6147711, 2696755, 6880922, 603941, 1717152, 5611631, 6490209, 3453456, 2060315, 5934591, 229634, 3423256, 6035737, 5705747, 2342288, 7568331, 5224191, 3689227, 6851817, 7408189, 2149440, 873240, 2840441, 8309526, 4084030, 288051, 4707883, 5562347, 1672810, 8344179, 1436140, 3443160, 1228202, 3223647, 6010183, 7965876], -[8325859, 3573398, 8139931, 5392248, 6351555, 1867569, 4833543, 1330958, 5198564, 4573208, 7764565, 2377632, 452799, 6030547, 353546, 3738360, 4424844, 7915247, 1979457, 7748700, 7686665, 2738123, 651356, 4412770, 5739709, 6846189, 1531347, 1850083, 3375967, 2428044, 7865030, 3986540, 8060902, 2919366, 2350659, 7548331, 2286547, 1385257, 6824713, 6530263, 4450265, 5714592, 4255919, 1894721, 1330715, 1541090, 7442571, 3169759, 6319712, 2590209, 7462426, 6643070, 6589458, 506299, 5554146, 8153739, 2598645, 736704, 611523, 4763309, 6402068, 2299999, 7669914, 3347316, 6342727, 3565299, 8348376, 630464, 6382340, 8135996, 4298851, 1542617, 6783308, 6881748, 3486990, 7543203, 1317244, 122321, 3161919, 7130136, 6453905, 2499456, 7305499, 2009503, 5764223, 2105350, 6778377, 6803545, 5825836, 827303, 2067915, 7049723, 3920884, 4538433, 8103139, 4453133, 5954137, 222248, 7211004, 7106486, 6352995, 1032237, 6434957, 287630, 882708, 4002065, 5466516, 7535284, 323430, 4854187, 4750337, 171878, 137625, 3218468, 3038107, 2887754, 4296786, 5621416, 4442940, 4667794, 2911821, 7976334, 4078180, 2183369, 1095462, 4055373, 5129823, 3026899, 7544294, 8200729, 3554044, 6434035, 6710692, 2895513, 7807743, 691188, 7653085, 2403520, 4720607, 2796471, 783728, 1786095, 4180633, 52734, 908169, 1945353, 6369898, 5037784, 3040747, 8188774, 2687163, 4105304, 5520706, 7473140, 485283, 5620690, 3255964, 5895476, 766607, 2742052, 3891144, 1784465, 3934637, 7475450, 378575, 6096711, 6686462, 3941896, 6965202, 468953, 4913668, 1115456, 7214830, 2877786, 8031118, 7997451, 5089082, 1301110, 3935697, 3494495, 4895605, 2571982, 6160703, 3962287, 6780869, 4609816, 1326908, 7129830, 2125955, 3488762, 7399442, 3225566, 8282331, 2867914, 7015269, 2066998, 2443475, 1739661, 1124159, 8191842, 7543653, 7603394, 4941714, 5199028, 7842606, 2881317, 152044, 8303753, 8118951, 8306620, 2437103, 3284790, 7147456, 2717504, 4769303, 567801, 804053, 6576600, 5525992, 3836856, 1970756, 2283912, 6177931, 4254691, 254880, 7180957, 95144, 1815261, 794858, 7426853, 5177510, 2516767, 4104888, 5572861, 4514389, 4064585, 1751133, 112220, 3316248, 3376968, 7797205, 6759748, 6702934, 2311338, 170374, 2133024, 3669160, 5478709, 6233837, 6290466, 6515132, 1763465, 3342498, 2191305, 942261, 6343200], -[772411, 4778555, 4565112, 3514677, 7105960, 1667058, 7430013, 7819448, 4210151, 3765940, 4002390, 289191, 6646917, 4937308, 1603724, 4448729, 922931, 4818660, 7963198, 4126482, 7141846, 1053176, 1650522, 6656308, 3473793, 3144025, 4924613, 7183816, 3029355, 3513109, 5398528, 5931253, 7508642, 688011, 6298052, 3809654, 4289748, 1943034, 3579609, 7344720, 92729, 1130566, 7147772, 1747431, 7654561, 3176266, 6251091, 4875249, 5979007, 801930, 7440141, 5752191, 2022116, 39201, 5788923, 813218, 7357372, 4378971, 8292135, 3237684, 1553914, 815461, 4689386, 3844914, 2611344, 2142374, 7695158, 6995757, 984755, 7868972, 3792247, 1886959, 5670710, 1711684, 2751208, 5940761, 2849841, 6265326, 3646861, 6929103, 121127, 8262205, 4700034, 7841278, 3948061, 3305258, 4354990, 1515798, 1827982, 7654188, 7520886, 7337376, 925253, 200124, 4613529, 3863051, 3099188, 1185611, 7833463, 7062363, 3551230, 1289569, 2737169, 375368, 1511419, 5184311, 3748442, 1648573, 2425722, 454579, 3674682, 573541, 4713120, 2983292, 3028325, 3614594, 4376551, 2200890, 66022, 7524339, 195082, 3529129, 7128783, 8337557, 5722533, 2129879, 6929577, 403522, 7897139, 2334014, 324475, 4666411, 3098130, 5310938, 4815466, 691438, 6694422, 2393305, 4011221, 1429701, 5612888, 81335, 3445461, 2039221, 6949625, 5813813, 1591964, 4036734, 5909304, 7189313, 4219628, 1748976, 6646310, 3113448, 5159383, 5814607, 8318667, 5912316, 6974854, 830971, 1632802, 667223, 7553318, 6236257, 5618861, 8176904, 4763905, 5637980, 6762582, 1816172, 5453479, 5457552, 88433, 1778303, 1569793, 2199800, 4804482, 6180449, 815444, 6123431, 7082238, 4852804, 4907731, 7773599, 3143969, 6925642, 1250047, 2607908, 1301528, 5589021, 2954362, 8211040, 7783308, 1833539, 6303774, 4283189, 7880936, 5695212, 2364702, 2912632, 2612112, 7420330, 5429041, 7224328, 4551856, 2533602, 5019279, 5535136, 7151916, 7184870, 3651531, 7956952, 131191, 6046812, 375845, 6780899, 5394795, 1487396, 6008990, 3904217, 3581462, 7611311, 1449825, 873480, 7515790, 5007586, 3510715, 4599889, 6470798, 7844070, 2304961, 4991710, 3358094, 2261629, 6675641, 3834364, 7596243, 3423712, 1441837, 2361981, 5524589, 847966, 8122106, 7693909, 2890737, 8117570, 482755, 8120680, 3343369, 7485319, 1130652, 8027255, 3957339, 4900464, 2053307, 1536181]] -NTT(c): [2690945, 121052, 7150318, 8287206, 2288451, 4023453, 386463, 4521262, 5904397, 5688061, 1610498, 2897472, 5173858, 8251051, 8034129, 7307004, 6477731, 2295177, 528991, 4283125, 470886, 3547028, 2050126, 7303776, 5180635, 769698, 7387421, 2869360, 5073979, 3058669, 6532114, 2177912, 6060654, 3407581, 1478148, 5785466, 117003, 773842, 8241771, 6381157, 1795475, 5643469, 4726601, 4005097, 2571179, 5789247, 1044612, 4900179, 7487018, 7703584, 4283361, 330233, 3726039, 431351, 3077645, 1613222, 2973554, 5349121, 2336354, 1505297, 3779321, 15000, 3830462, 6224987, 2818120, 2170426, 7175285, 7794091, 8005785, 5475062, 709647, 7834526, 6619698, 5130004, 6829708, 369152, 6387976, 3150488, 3277421, 4986217, 3130106, 1250471, 948833, 5817332, 2511825, 740837, 1596072, 775148, 5088015, 88353, 7540862, 813331, 3153995, 3975035, 2679818, 7173989, 3351079, 6264111, 6604952, 6952938, 3139300, 6973618, 3349753, 775931, 3575628, 5517357, 8116002, 4032702, 2506165, 7738504, 7317489, 509466, 84119, 6325618, 2082735, 5475407, 3827229, 8013830, 4599652, 3848224, 6744686, 1575503, 7160724, 1515678, 2119631, 2311035, 5615841, 134650, 1247324, 1340879, 4982117, 1471381, 6021607, 4191164, 2735447, 779278, 7132637, 8113556, 842804, 4248715, 511975, 6538824, 2975967, 1497099, 7209604, 4670012, 379903, 5795198, 3691658, 3108828, 1317681, 2245383, 7237183, 7668045, 522328, 7316344, 7458823, 4165622, 7067295, 5396050, 5275326, 205471, 5327072, 5003556, 3028175, 6840495, 3822188, 7103192, 7395788, 4827882, 6435889, 3219844, 7235969, 791555, 1080428, 880785, 3100269, 7379364, 1530478, 1139597, 6950901, 4803728, 4529523, 2135258, 3640627, 3760935, 7250092, 1969467, 1098969, 731816, 5978393, 792890, 3431781, 4972484, 4418752, 6878239, 261186, 1188342, 695676, 7978030, 7724988, 6231179, 7222462, 5897322, 2494301, 3919195, 6645882, 7884412, 2018759, 7087781, 7488498, 2347667, 798029, 7441875, 8087807, 4318891, 8366135, 1123836, 3515485, 7836306, 2153853, 7144330, 7935307, 3785902, 3939509, 1899969, 7418347, 3990633, 2129103, 6268676, 3761213, 3695313, 7668190, 3939129, 336075, 3155205, 521333, 2933008, 6947827, 5156973, 4925548, 848825, 6994707, 6023374, 7366844, 4854418, 236585, 6158594, 4342136, 4993509, 3905646, 2503545, 6571886, 3694025, 7822459, 7341964] -NTT(c) * (NTT(t1) * 2^d): [[6819480, 8012510, 6285477, 5689914, 2890547, 7501519, 6159655, 7652394, 1400460, 2698837, 2812858, 6495626, 7735135, 1993930, 7135851, 641420, 4392911, 8057521, 146059, 4077838, 5692793, 3258426, 1639608, 1429672, 5182577, 4643850, 3321782, 3253391, 7415252, 2261058, 3482782, 7582710, 1374024, 8110908, 5427979, 2682796, 3927775, 6969135, 7547126, 3020907, 5781921, 6447067, 230900, 158153, 1835843, 3858955, 97050, 3882824, 8155267, 4356433, 1825009, 7115136, 5644289, 5238443, 2098466, 4015153, 7982895, 3526376, 6593741, 2714299, 2958158, 1637991, 709629, 648309, 4813560, 7027296, 1676336, 1054056, 301823, 8357045, 127727, 5912268, 1155405, 3403527, 3310960, 1512430, 536209, 6273283, 5318522, 8096127, 4313971, 3575990, 1771746, 2911122, 5678491, 4907156, 1899087, 7679748, 2755281, 484044, 2752814, 4226241, 4172130, 6382224, 1696273, 732593, 5070876, 3255254, 3266392, 2064794, 1434708, 2363655, 405376, 5911748, 5780553, 4191420, 6071251, 2584719, 2238435, 317596, 2043922, 406177, 4068675, 8116952, 8252034, 1741079, 7627760, 4541838, 5151609, 3997926, 7372982, 4698794, 7300570, 7107562, 3250686, 4705508, 1518400, 3488236, 3384309, 522480, 2908861, 5706364, 6346578, 6318794, 4211006, 1429779, 4225560, 1028580, 6697824, 3702666, 2842372, 571095, 5311384, 3989826, 4293823, 3901429, 2654221, 4609542, 4576968, 2068070, 3295734, 5701685, 2827758, 4524988, 1521405, 5198979, 7117609, 5990035, 6979108, 1506042, 6905390, 3873428, 6845946, 7052297, 3822219, 2244647, 1786751, 3923819, 4777813, 4292560, 764688, 6320554, 1725679, 5346988, 7002453, 3253799, 1226036, 4705495, 258735, 3293166, 6144506, 1709802, 2621134, 1063641, 1021081, 6294947, 3640000, 4516075, 1246995, 7879961, 677751, 4785236, 3167132, 1825820, 3452480, 8200206, 6501092, 6526329, 4874401, 2290519, 6485724, 4103333, 788580, 2080647, 4613240, 2541498, 1236895, 6381617, 5574707, 2087198, 6174416, 2863589, 5043159, 8306776, 4888119, 1031262, 6733751, 1029393, 2490661, 3847948, 1784378, 1431298, 527688, 4908157, 3424141, 4950855, 1037816, 7351352, 4758323, 1764973, 4852236, 3133755, 2381938, 2911758, 3834952, 5103516, 1931627, 4361509, 5539983, 6422814, 4072832, 5607654, 4423923, 4764824, 3049642, 6452984, 2509187, 2382849, 5769543, 5024686, 3987713, 4958826, 3407047, 5787414, 2675317, 8091065], -[7747361, 294996, 7628437, 5308267, 8275015, 6227976, 5368317, 1110961, 1140611, 2833636, 8203334, 1139888, 7170282, 8374398, 546500, 3632862, 4504537, 7547277, 6834164, 7662123, 7588823, 1817707, 1219602, 3334382, 7920613, 2371613, 7517595, 658715, 3437116, 272900, 885839, 4685718, 1863880, 6160818, 7981695, 4393649, 5163526, 4497151, 7293135, 1024103, 957106, 790420, 1949196, 3706698, 4934884, 5078878, 470514, 3756260, 4819127, 1831083, 5224427, 1606949, 7186423, 8098609, 5923237, 3467791, 1728389, 4102474, 1516693, 2027818, 36188, 3951759, 2679484, 950310, 3935993, 7185861, 4107070, 3044579, 2083109, 7188675, 6826667, 1259883, 4086014, 5865742, 2371021, 4550061, 4288454, 1973404, 6353115, 5796481, 5394565, 5642734, 612460, 5279519, 5172757, 1984648, 7517074, 4154018, 6307035, 7875444, 5241526, 5629331, 8166769, 4602225, 5425864, 3564598, 4314169, 5809214, 1191939, 464287, 8154733, 6760133, 2744336, 5437418, 3450222, 2095525, 2916637, 4354780, 2223874, 7762181, 4545991, 5958532, 1794890, 8347297, 7616634, 7834298, 546317, 1992079, 111044, 7065316, 3797115, 1237450, 5441029, 6511799, 7725203, 2163622, 7884415, 4546877, 7223855, 1204971, 5918030, 4762643, 3326066, 8132903, 7491142, 4461626, 945950, 6730513, 1134615, 5189637, 1540313, 1572807, 6332738, 2071294, 1125085, 4510581, 1679510, 5962664, 7292242, 7213392, 6218166, 4220340, 3030010, 3846741, 5727237, 7065521, 7224550, 851159, 5685935, 3955557, 2429885, 7561362, 955274, 842340, 1494181, 4673837, 8275289, 735235, 112571, 2368173, 4226391, 3249636, 563797, 7789334, 8346138, 4743587, 309830, 1031259, 1504392, 4912333, 925256, 131929, 1271446, 4511488, 1710185, 2902790, 5272567, 7756566, 3703701, 8271716, 3532131, 5479238, 5171084, 506781, 1260891, 3547316, 4027930, 1814911, 2633684, 3410403, 2075159, 7990474, 1580040, 2185373, 2856944, 4608760, 5286421, 3469857, 3950152, 4532501, 5088855, 2313272, 1865285, 7349867, 7161692, 4122428, 6290832, 4975003, 4191082, 4754072, 8037184, 6058217, 7123466, 2259697, 7070498, 7375610, 6667315, 2104687, 4917388, 7269149, 6196104, 1782753, 682605, 3653302, 1980500, 199589, 1170580, 4263843, 5957847, 94066, 1159237, 5926770, 162179, 4784248, 5929100, 6021564, 1752028, 5355139, 1289963, 7167676, 8057108, 398130, 433659, 1874486, 4403869, 3530120], -[6003421, 134024, 3298140, 4670839, 1396842, 7513299, 444571, 6134764, 6379002, 7636717, 7584177, 5837769, 6358265, 913037, 1100196, 469322, 2523573, 1134766, 7996769, 409878, 4816845, 633871, 2312802, 1164388, 5835735, 4089323, 3395722, 4361907, 1393956, 5385468, 3853187, 7081125, 187870, 6994482, 6636052, 3290202, 5042753, 6072693, 2549384, 5674023, 6505135, 1738909, 1927498, 376226, 1708673, 7214524, 3284819, 7617368, 2801120, 987906, 3931692, 5361281, 8012359, 2364741, 6274710, 3943518, 2342559, 5647912, 1432919, 4184551, 5159630, 4996318, 365627, 2159887, 650490, 2221621, 210134, 2761881, 4656252, 7568240, 5883737, 725560, 6512439, 3457118, 5992118, 7305746, 7145841, 329330, 8075259, 4870247, 6666644, 6593629, 2347144, 3071975, 3865876, 7721206, 2814280, 4924000, 3123557, 597506, 5435582, 3981552, 5985533, 1161095, 6544116, 2471973, 8311302, 7896547, 2779949, 4823752, 7681159, 887234, 2155514, 2102000, 3528159, 7185815, 8109664, 1337832, 1444104, 7066666, 1993159, 2847205, 985319, 7785172, 7460396, 3193588, 3881625, 1451740, 7305835, 3395775, 1424066, 6727549, 3519858, 6355127, 8070942, 629206, 6115003, 508717, 4617081, 1644067, 6135682, 5750214, 6425687, 3335542, 6050764, 2180231, 6515009, 1809690, 300237, 6142619, 4774995, 7952270, 6964394, 2830262, 6719502, 2002834, 424376, 5011882, 2926767, 4113955, 4613967, 2664643, 5754779, 2653292, 3802204, 7990260, 246169, 1852274, 6756136, 7223000, 6369991, 5227640, 3142421, 5147019, 2058222, 5064169, 2905852, 8161393, 7125802, 6269219, 1086244, 7055455, 7085861, 6702991, 7714822, 5468892, 2207310, 7905958, 2131770, 5820928, 2034856, 232235, 6200416, 6099433, 2030877, 7761015, 6822268, 3057026, 5812857, 7820854, 2986593, 7860002, 3987855, 1914748, 5467437, 2705841, 2002587, 4996059, 3784996, 2839990, 6280456, 35657, 1018021, 6237061, 2865586, 7635992, 7993374, 2300456, 2366875, 7555154, 3162241, 2935966, 2072294, 5613967, 2110880, 5286770, 3900227, 7170162, 4584074, 1620830, 1094125, 311463, 2207618, 361196, 7299311, 6046790, 4860517, 4922094, 3303751, 1435251, 6815681, 5017774, 4348261, 8268075, 4417980, 347884, 739565, 8295855, 5145217, 7528454, 7675010, 635475, 1387222, 5819821, 1201580, 1332362, 6668597, 7363435, 1207190, 5898251, 2679448, 4609763, 3409812, 814623, 3974604, 2629323], -[3595031, 2172132, 2242460, 6930746, 3468245, 518574, 5535245, 7259602, 2508700, 5678394, 2678450, 1644180, 1805562, 2211183, 4785764, 7414977, 5169017, 4761493, 6937462, 2347750, 6233468, 4493077, 7682383, 696689, 477682, 1487051, 5198771, 6445587, 6535291, 1881896, 1276240, 2965152, 5118941, 6927280, 2904202, 8044305, 8282508, 458223, 5429459, 3159529, 6487529, 5916786, 1209575, 4483000, 8185341, 3469604, 56191, 6349451, 2068604, 1240373, 6815760, 977316, 4755271, 1423080, 2292900, 6261856, 919980, 1810884, 1426611, 214179, 5838941, 1618455, 7967706, 7085854, 1334040, 1048561, 1526830, 6118860, 7866407, 4328502, 606280, 7504132, 3128152, 1353757, 4034656, 488467, 8207498, 985068, 4872437, 7596495, 3127084, 7009075, 4692381, 2886056, 2771246, 3638220, 5175548, 7201746, 56429, 7323274, 2343565, 2063557, 4889841, 4684882, 6820030, 1664997, 5088824, 5888490, 2197478, 656361, 7287955, 1725934, 5022443, 476321, 2065870, 4703216, 2274255, 2480806, 2913865, 7823001, 3958703, 6056784, 7833705, 3522175, 1017322, 4608128, 7717466, 8188590, 941219, 8128679, 7764397, 6696469, 735356, 540697, 3504052, 4281991, 3503252, 5142298, 4519811, 6751218, 6674232, 6128522, 2967297, 2400455, 7387494, 2609170, 782443, 4347425, 1274634, 6816052, 2355179, 224125, 5721707, 2382610, 1105233, 8070353, 7872249, 4713412, 8106036, 4193355, 5259556, 5065518, 2108929, 3958473, 8282475, 2456450, 6739929, 1492496, 4822091, 661925, 5669115, 8267638, 3935070, 6258527, 6861391, 3088984, 4137003, 4323075, 4658917, 4881945, 5817063, 1463335, 2961250, 2925583, 7645347, 2592392, 1447844, 1246441, 5203674, 408196, 732458, 2911805, 540609, 4248752, 7698004, 2657785, 7803206, 6024758, 931799, 725849, 3828200, 1514629, 2994354, 2429836, 4980891, 4749878, 1239112, 6617360, 940695, 350101, 7245079, 1594392, 5493894, 2556786, 3410438, 5944993, 1096769, 3815736, 3466075, 4536904, 3767623, 2216862, 3453479, 968444, 1972993, 5220793, 126485, 4169087, 6203908, 2242501, 5790475, 4389903, 7048736, 7128421, 4493049, 6454525, 3823645, 5427403, 2514216, 7861379, 8229605, 5969721, 3848021, 6850804, 3490373, 6309703, 8206607, 6047760, 3829398, 6913163, 4727846, 5200601, 2954280, 4381167, 2535875, 5480783, 6797753, 168817, 1315333, 3565139, 7826672, 695583, 4895422, 3649272, 2556653, 4465034], -[3948113, 3370824, 1248431, 7061664, 875246, 1463966, 7339943, 1119644, 2208364, 5788360, 2318071, 351454, 5677860, 2036162, 774705, 7610264, 3893471, 879876, 6974988, 3698246, 7311222, 7980889, 1084825, 6617568, 398734, 716743, 5219038, 4149481, 4934276, 8215542, 6098705, 3401638, 1473797, 2113796, 446328, 7957736, 4806750, 5767673, 5344455, 7191414, 5820974, 7090641, 4870782, 6756101, 92727, 623115, 2322382, 4293223, 5018901, 2406218, 4808649, 2416386, 508610, 7293346, 2263764, 5939696, 5837395, 3731691, 7195314, 2147160, 7757197, 6188628, 2439198, 5179845, 7915608, 382501, 5053293, 2758606, 4736224, 6759543, 2178006, 5465498, 2856604, 8210707, 6445834, 2176015, 6141371, 5747320, 1002877, 3068489, 944997, 3962792, 4219457, 1867692, 7072747, 8248412, 2985241, 8164062, 3766524, 704885, 709980, 2652168, 3511368, 6909259, 3478318, 7685181, 7856446, 6128237, 3540295, 1163034, 6175224, 297980, 2917828, 2148403, 2790084, 6446018, 354769, 3587445, 6633293, 7387541, 2079100, 7400332, 3521498, 682614, 4970131, 2397383, 652315, 6513108, 4166117, 5393801, 3843297, 1159490, 1868274, 152971, 4695915, 3675777, 259453, 7130389, 1469547, 5503415, 6788111, 3929536, 2688926, 5315270, 6833281, 1440840, 1444362, 6225209, 2154197, 5039679, 3157257, 3340663, 1236000, 4490526, 2857146, 5664135, 5766557, 4873745, 5405783, 3861377, 5261916, 7175618, 847836, 4211170, 2806242, 2588769, 6843987, 6952175, 7172986, 3330242, 1050225, 4183848, 1242504, 3568286, 587527, 4442720, 3516073, 6622073, 7893560, 4671243, 8205923, 7375591, 835001, 2850375, 2898789, 1075940, 5391753, 4341310, 5911080, 523034, 6472848, 4013302, 451405, 4750194, 1387113, 4397951, 5945390, 6348754, 7326216, 4291074, 3645510, 126514, 6538473, 2564488, 7222972, 4239775, 7565549, 5825251, 6682878, 3833007, 8142442, 8141216, 379402, 8359743, 7594913, 7261072, 6083450, 3775391, 3724051, 6752598, 5710386, 404866, 6126101, 4470612, 3190095, 1386568, 6066761, 3249037, 6283841, 3645522, 3990700, 5522863, 7362800, 2878505, 2391065, 260572, 4106811, 7995413, 1523811, 76496, 469641, 7003985, 5350295, 980747, 7730746, 4877740, 2694394, 1280085, 1153312, 7251014, 639084, 6227876, 3563389, 1668992, 386400, 6647759, 7864906, 1634333, 7775022, 2824960, 3881492, 1362404, 1422504, 6868155, 3397457, 1637821], -[4494055, 3736852, 1736855, 703517, 3567399, 4102405, 935224, 3480087, 7768531, 5863235, 1452585, 6831407, 7038740, 2075344, 3097244, 5672863, 1446348, 7766252, 1566083, 5806586, 996792, 6839842, 332848, 833203, 2535658, 3780696, 3156458, 2940791, 475914, 8251602, 2861815, 4711596, 7821804, 6414390, 8080327, 1272509, 1830697, 3659322, 6586160, 2532277, 7237153, 1016342, 4036678, 1952018, 4781259, 3136557, 2408211, 7331023, 5399339, 1780149, 3058394, 7690781, 2131338, 6089462, 2970189, 5549965, 3438653, 3100726, 819376, 2603713, 3371721, 4886597, 4502285, 1670782, 1933904, 6619708, 4497174, 881868, 1982014, 5930122, 3678101, 5020086, 2538314, 3497055, 4821139, 6001610, 3106052, 2437304, 5632992, 7344532, 1903965, 1497611, 638359, 3744268, 5951047, 138550, 511557, 8183453, 3538705, 4342132, 2601669, 3652922, 6147578, 5581449, 6748464, 7849378, 7687428, 6318085, 102901, 6985196, 8168904, 3151278, 1818314, 6655190, 965759, 7259141, 7627160, 2067312, 4519326, 5950313, 5605630, 8019984, 2173844, 106767, 4450088, 4513801, 6123441, 6984245, 5433932, 3919313, 7843584, 6440314, 7326391, 3033504, 2007446, 3750649, 6063470, 3993889, 7527155, 5531741, 6735109, 1215908, 7967874, 4448974, 3637281, 3510749, 6381173, 194382, 4505467, 6049688, 4964083, 5606803, 3949615, 5230532, 3178515, 3174168, 2345853, 6921176, 7230413, 67840, 1897346, 7289106, 1875684, 2843313, 7889351, 3372202, 5398070, 3555948, 6179274, 2187866, 2642512, 8115747, 5074456, 841266, 8067320, 71854, 6248224, 4866754, 834021, 1408944, 2972216, 5436272, 3326125, 7889760, 2758110, 6813017, 1038198, 3163291, 7402592, 4448079, 8110884, 4277339, 4198955, 44160, 2987878, 251748, 4072176, 7154493, 2872740, 5431950, 4882742, 7233312, 7102460, 3317402, 706282, 3148610, 506973, 2457644, 7332286, 4445283, 6574133, 4048715, 1402229, 493773, 2205643, 740851, 6806440, 2999188, 2874219, 7914590, 3200304, 5682138, 6053375, 6223045, 206841, 1446902, 1091708, 6054985, 5458667, 7728409, 3476262, 7423742, 2405335, 5511177, 6261090, 4266402, 5883460, 3442937, 526627, 4212160, 75780, 4506955, 3894377, 4187206, 2994422, 8212161, 6098569, 7058782, 2012245, 4307357, 3660339, 5865071, 8145323, 4439816, 5179073, 7943123, 4268799, 5745514, 48752, 7107651, 8190131, 2175461, 6423995, 6711321, 2599713, 2510042]] -wPrimeApprox: [[4758519, 960760, 4935710, 3304526, 5646329, 3801955, 7832341, 837485, 3649919, 4113435, 3451213, 365211, 7283435, 4186002, 642582, 595189, 7466745, 3706267, 7975728, 7353938, 2276138, 5658000, 8233178, 2183980, 4608632, 5474365, 2425574, 6559285, 2804609, 5597201, 2641918, 5544548, 1014922, 1578291, 3510017, 8336297, 1770798, 6225246, 3175092, 363064, 5775612, 8357939, 7012368, 1857795, 4816431, 2981862, 6365635, 345219, 861927, 3327281, 6291776, 7273761, 125994, 2939614, 515722, 1185805, 8103298, 4642804, 1191088, 7255921, 3401689, 4681503, 2685603, 8064073, 4874160, 1040989, 5526614, 1774182, 3827569, 2475072, 1808512, 5873015, 5537521, 5308641, 3446953, 3251726, 577868, 3998185, 8001698, 1193419, 3653031, 306323, 3670718, 2687952, 4437003, 3514480, 294569, 4598149, 1540863, 904047, 4382683, 5315922, 4359326, 7510500, 2976706, 207667, 820857, 1419026, 4693582, 1067202, 6825895, 2913886, 2198084, 6312548, 4847365, 4885859, 5385714, 7127874, 1706984, 4170363, 5404789, 2580613, 6077839, 695831, 4627762, 6339919, 634344, 2564633, 1572647, 6253418, 6289916, 4440931, 6240918, 1500492, 1427383, 7483141, 941869, 1048032, 7519468, 5821506, 2914323, 5818567, 399727, 6020921, 7171577, 5042607, 4988125, 6897478, 1043154, 4093185, 6875213, 7985618, 7812975, 523656, 4673218, 6904002, 1478383, 7540191, 6008615, 6877268, 4976149, 4639864, 5437728, 2316032, 7920620, 3135552, 1859893, 2962102, 4942708, 2604530, 6267321, 1608507, 5873358, 4484699, 861117, 2549994, 3381865, 1967159, 7158810, 4583027, 5345549, 6940002, 63549, 2154488, 2470260, 6776477, 7522593, 8356707, 1673423, 5906136, 6653428, 5031579, 7811789, 4336365, 5782332, 665530, 4911530, 1190227, 1171577, 8295892, 8181078, 5220968, 5641229, 1541547, 4536269, 6770939, 5465591, 2954758, 2469404, 2153593, 6164668, 5415927, 293027, 7504671, 1184865, 5613926, 3056131, 2035570, 6610621, 3963412, 7716911, 431402, 579731, 4547383, 501607, 1013302, 2661948, 1291077, 1087192, 5989300, 1325579, 7460582, 3655582, 1991023, 7458991, 7892419, 3281032, 6199113, 397945, 7238619, 1901786, 5106678, 7010865, 5619314, 7930764, 2074435, 5099130, 7326247, 4602993, 2668726, 6155015, 4849298, 3590550, 1361121, 3948653, 5236722, 3584499, 7789496, 1741671, 4857887, 726649, 8266945, 94022, 5081514, 607476, 2940254], -[4575140, 3628620, 6991943, 2364461, 7491971, 7649378, 7959176, 1450077, 4923388, 5154437, 7829539, 5750299, 2310686, 2331453, 2939618, 6441119, 976930, 7833676, 6325703, 1699575, 7766339, 4775427, 4339967, 3672552, 3269056, 581036, 4950590, 644466, 645566, 2656323, 1381262, 8032694, 1437953, 1274493, 4434493, 2171996, 6811451, 154955, 6020193, 3302501, 8142298, 615458, 4698720, 6964032, 188769, 6346477, 2745558, 2131857, 6872845, 2142070, 3276001, 5976172, 6154364, 325907, 1172807, 974710, 7286124, 3210797, 3421332, 6758637, 2493168, 5768980, 7000039, 3717756, 3110317, 2393031, 3152865, 6480557, 2770809, 5221236, 8334899, 6135994, 2638588, 3730399, 3780066, 1346048, 6978182, 468888, 6909885, 6712967, 688959, 1621861, 989666, 3335439, 1419116, 3325788, 6950816, 2580969, 7954552, 6055510, 5768186, 56088, 5610046, 3762737, 6282085, 5158209, 3423314, 4478078, 4170019, 5111643, 6479548, 2801004, 2998930, 5231146, 7362542, 5834718, 1985022, 6510420, 3693928, 5248807, 3060673, 339139, 3552956, 7133988, 889992, 4296378, 5225499, 2396168, 4334119, 3710497, 8373796, 3457465, 3174302, 2779972, 2508176, 6367593, 5551025, 2735778, 446010, 7617069, 1092561, 2043448, 5717631, 3918093, 1109893, 4242492, 7284596, 2923966, 2945424, 5845761, 132532, 4419447, 2375873, 2986980, 4695923, 7861533, 4320792, 5017218, 1378500, 6321453, 4174471, 5196148, 5907311, 5837953, 275047, 5614837, 2724517, 8197766, 2117779, 5833020, 2654519, 901838, 7965826, 3314227, 4431082, 3530244, 5986887, 8006689, 3766829, 1414188, 6485099, 1264890, 6664133, 3719186, 8100718, 1177022, 3926748, 5097633, 5986277, 3279856, 252700, 2582825, 2685313, 7440094, 6199053, 4256995, 2164369, 2765054, 5335974, 2057638, 5731022, 4769963, 2230308, 2869238, 2032353, 5874109, 1267053, 3663833, 4142814, 6548603, 6671404, 2253628, 1394559, 5382044, 3738664, 1910681, 4456506, 3814281, 4404803, 1176542, 3160494, 6254241, 4324302, 6214651, 2845493, 7674127, 7097689, 5875942, 1516393, 3361161, 8030700, 2642557, 4441611, 4434832, 1132361, 4971966, 6712095, 5071841, 92740, 2494787, 6813986, 1341916, 7826440, 2701870, 7296026, 2640458, 6866308, 1045578, 2940585, 6424459, 1608703, 4544318, 1319058, 591221, 3677992, 5418122, 357418, 1680200, 34536, 4332638, 4103914, 8246604, 1678954, 6082241, 6267539, 2321786], -[4548405, 5564275, 2079952, 1909722, 7280465, 7340170, 2314051, 2714236, 1984491, 6644267, 2288612, 5829011, 3844828, 5706010, 682088, 5701977, 6286406, 1988161, 2683955, 2440550, 5351718, 4745349, 2469601, 915940, 2590497, 6672625, 4593521, 5879633, 3831704, 4976839, 517099, 6628684, 3420840, 5894536, 793683, 3132360, 4996134, 585495, 246768, 2733469, 4175012, 465828, 248283, 5571594, 3153122, 1929677, 3556034, 4458578, 1421962, 4634619, 4835145, 6670113, 923385, 2251231, 6664664, 5478553, 3773103, 2208639, 2937788, 3177849, 6760501, 7457609, 6047263, 6364257, 440795, 7849198, 6942487, 292611, 6702626, 5238094, 1770177, 4263623, 3289565, 2854983, 3672481, 4302929, 756165, 8109786, 828601, 4961755, 7203092, 3463418, 5592321, 6241279, 5329421, 4631509, 7087090, 4675813, 2782001, 2293158, 7728285, 2677295, 162854, 4565924, 2385436, 7951733, 3847240, 2969685, 3306249, 3367877, 6914026, 7979751, 7730740, 798034, 6448415, 2569394, 2835250, 3376042, 6306021, 5746067, 2662061, 8277779, 6941554, 3416146, 5504092, 2721403, 7589771, 3329588, 5800190, 221448, 3367598, 716473, 3547654, 544366, 3266793, 3546665, 6091639, 1091948, 6830061, 2195976, 5928001, 7738239, 5268762, 1894003, 85106, 50767, 7983151, 19774, 5837497, 4551157, 5188730, 6840380, 3764680, 143572, 214983, 5657387, 4943420, 4787718, 2646515, 6882304, 1810767, 4880128, 3328311, 3031091, 2017318, 1228014, 5568480, 7887074, 5817102, 7944919, 3435329, 6742604, 3701232, 2370525, 2874795, 7045926, 7915303, 4177124, 2040448, 6823274, 7300343, 6246984, 326915, 1660874, 4573514, 3766576, 5461083, 6678563, 1062657, 3351990, 6232995, 2493311, 1823116, 6843536, 2524849, 3958210, 8064106, 5823985, 80225, 4087350, 1324262, 4500953, 2021524, 4527884, 307539, 577796, 1413302, 6237390, 4904401, 7674515, 1017140, 5218079, 358364, 5845446, 2957813, 2537260, 1923236, 6435967, 2994933, 7042132, 1911604, 1241748, 4216622, 926004, 7809410, 4363198, 1636668, 8193903, 3057821, 4311624, 4331550, 4127970, 7149448, 6214337, 7216301, 5629714, 7124219, 3597959, 7868871, 5064550, 5525976, 7248357, 56131, 1326101, 7507053, 591493, 6263002, 8089313, 6480900, 7698643, 1686827, 3881673, 5646022, 6637277, 2138980, 6888268, 3473801, 5127837, 2840172, 1058295, 1587850, 1163863, 3404555, 6843575, 3285438, 3631634], -[6871063, 8017117, 6397070, 4291496, 7466141, 1610329, 7200177, 7817341, 4014633, 7836615, 6607332, 644578, 7182533, 6896730, 6024781, 2218410, 8072750, 4958074, 1650185, 2301367, 2996096, 2962850, 3370355, 2776701, 6288756, 3841608, 8208305, 3526834, 7628209, 5527351, 7424063, 443024, 8347843, 2590508, 2664694, 2721036, 4982334, 1061568, 2236078, 6798443, 2117123, 3659513, 8050265, 7659195, 4192474, 627917, 7652308, 5027929, 4905425, 1059791, 5512850, 6491468, 7996584, 6913464, 1110277, 8272241, 2375853, 2900462, 278852, 1241652, 6354537, 4109934, 71271, 3686656, 2792870, 697762, 4105656, 1537319, 7509321, 3675418, 2049995, 3134492, 3433985, 7838424, 6004746, 5928560, 7179645, 2057730, 2339822, 8000943, 3806963, 2832508, 697191, 1057733, 1998333, 8222800, 1690808, 77452, 3246345, 3378035, 4316422, 2278748, 3541094, 1798932, 5751579, 7347445, 8186431, 6949022, 2180526, 323692, 6650386, 5919442, 374395, 7103097, 4821502, 6181196, 1163059, 3667160, 3079140, 2958979, 7977509, 5151244, 5103552, 7436689, 4497555, 3495681, 3857440, 1050012, 6043673, 6892241, 6412403, 2189577, 3510557, 2013400, 4298095, 2164814, 446299, 1557800, 7037144, 6003928, 8360683, 3050157, 4311852, 349423, 1962420, 2628809, 3142370, 4974505, 6705303, 2019688, 4803009, 2205196, 1186457, 4126247, 7735462, 4868648, 2370388, 8142950, 8235998, 3117085, 4642303, 6562549, 2167037, 614491, 1844066, 1430185, 3778739, 5307641, 3567876, 7122860, 4241183, 3167461, 4237069, 3320888, 2849070, 5528613, 225099, 4619911, 5016914, 3446506, 8124166, 7083113, 7275991, 1471163, 4815496, 3019710, 8246118, 6209151, 6396903, 1404838, 236016, 1290559, 6744425, 6082287, 5937807, 7637590, 2556007, 7493690, 5902339, 3534722, 5910366, 4084848, 2456266, 2372159, 5412490, 3451482, 2255954, 7707092, 2931015, 1394087, 5895301, 103837, 2861253, 7725436, 1706204, 5172440, 6892077, 5668352, 2652730, 3453482, 1575161, 466915, 7759592, 2147913, 1778708, 1787727, 7273918, 8079309, 563991, 6697606, 5385187, 4509798, 1355181, 5920781, 3169715, 4977809, 1178150, 7946938, 7752477, 7556116, 1569747, 4006177, 2512976, 2845782, 4009733, 5144659, 1410342, 7445250, 4636962, 6277633, 6549700, 3943432, 1994544, 4528971, 1664313, 3286177, 2842497, 4320750, 3389961, 6606944, 6172154, 4334749, 4533715, 5469776, 5083346, 7596029], -[5595749, 6889593, 1954500, 5039824, 3952028, 4107402, 3616353, 2872817, 5679256, 2187198, 5362646, 729712, 6646792, 2885262, 327434, 5146146, 2055155, 2922099, 2415462, 2253774, 310773, 3242220, 5760359, 1495077, 1907676, 8032998, 3256938, 7034984, 2819134, 5739344, 5457888, 7128617, 1533074, 5439388, 4550077, 5054309, 4317530, 2427727, 4327122, 6698375, 590002, 7370133, 800983, 5469617, 2705699, 3499459, 3470134, 1238656, 686528, 4727740, 1480521, 2493681, 2420683, 6426462, 6026502, 5309234, 5773111, 3527761, 5133064, 1803160, 2443838, 7688202, 4071495, 348119, 7230509, 7375103, 5847529, 2346907, 1423898, 2819880, 4794680, 7122970, 241845, 5237190, 2911427, 7100340, 6868090, 4286108, 5328458, 6858852, 527949, 8181432, 869391, 4179049, 4762437, 2696808, 7608662, 7847802, 7465995, 5606983, 1191813, 6583894, 959335, 5605194, 2802994, 3437820, 5210073, 8333482, 7265661, 2001854, 2672171, 2187756, 6134559, 5973878, 4271720, 4434483, 8297673, 5490451, 7181818, 5224902, 1946257, 6418621, 3019975, 4286695, 3382228, 6054776, 6508409, 7594881, 7469243, 3328290, 4231894, 288092, 1219249, 921919, 2247668, 714850, 693379, 1736487, 2888614, 2638598, 1203099, 1337671, 4857879, 1498076, 4862390, 6700417, 7015071, 7900226, 8128933, 5729602, 7791169, 2895633, 6701556, 1420248, 4467089, 3957447, 5055396, 6782655, 4631215, 2523314, 4441651, 227245, 7586887, 1524343, 3818312, 2153795, 4115858, 2655560, 1609285, 5124048, 5458508, 1060497, 5635191, 4998887, 5300886, 6707322, 3394923, 2906108, 5522677, 4948203, 7208401, 3111515, 2635734, 3046167, 4687513, 3938154, 7783176, 7535898, 3295728, 3524483, 4953164, 2506024, 5589487, 4529991, 4255640, 3099909, 6823488, 2878159, 2999026, 8037695, 3546625, 3616618, 5811028, 2071120, 3132746, 8056666, 5862287, 6795586, 5192206, 6116176, 2543113, 6119873, 3814202, 6296188, 5025406, 4086351, 4194741, 3644479, 1414235, 3240889, 3934948, 7070573, 2331064, 4827710, 7329446, 4638840, 4351624, 89560, 3551935, 1360140, 3821502, 5695459, 2363868, 56759, 6639094, 5539764, 2906067, 6250770, 7863087, 261721, 6766409, 6155631, 2020537, 5965648, 2638334, 597138, 7847056, 5743761, 1704402, 1740406, 1746353, 1660851, 6301629, 6099802, 2589232, 5031781, 4047070, 969482, 6654606, 3358191, 4799160, 6695746, 4135535, 7977457, 2451601, 7477406], -[5592471, 4577459, 5553834, 2487682, 2314501, 4003068, 8204143, 420861, 4049730, 773376, 7737452, 3744586, 6108957, 6800947, 34541, 2791688, 5275372, 4711732, 4101739, 4540077, 7985514, 2854015, 131009, 7987112, 3269031, 5210578, 6674670, 5937407, 6826525, 6869927, 828092, 3254539, 8360277, 983379, 67137, 7484747, 24602, 2625350, 8376909, 5603595, 6070602, 3578388, 8078665, 6668833, 2216855, 779249, 93681, 2882639, 2851381, 8035713, 8008242, 7699273, 1636399, 6010282, 803065, 4710233, 5615995, 1670338, 2958802, 4334172, 6369826, 6990186, 6118205, 1973157, 7310570, 3697010, 6991036, 5915009, 1273355, 7261235, 631715, 5641499, 7780677, 4846475, 7764632, 1966790, 5374581, 1759064, 4219636, 487538, 5019276, 8268702, 4284171, 3528279, 4248113, 274554, 8131791, 992479, 3720489, 7374753, 5156747, 3900712, 1301413, 4484049, 7591657, 3518277, 6508608, 4395082, 5307095, 5265026, 5011818, 7166097, 247687, 6464908, 706809, 3729653, 6702663, 1498758, 5718860, 7076924, 5357536, 7251849, 1301496, 1235625, 8196838, 4835876, 2657271, 4627595, 2065508, 1586472, 824787, 7253236, 7004603, 6393627, 7921756, 404141, 597838, 4837897, 1848399, 5994751, 1165818, 6130451, 2739319, 3690755, 1394985, 3583281, 8198761, 3442245, 4380828, 2442569, 7218461, 8019747, 3134434, 3220564, 5453283, 8375015, 1293851, 7229420, 2943425, 8229254, 544243, 8122979, 8075664, 546447, 1894926, 1722068, 1641632, 353997, 164819, 5250033, 6896600, 6391498, 3062108, 1493390, 1240031, 3004493, 3113425, 6198033, 3074022, 5279526, 6983053, 5753547, 4428246, 4857968, 7189447, 1663391, 7804732, 6716177, 742994, 4658459, 8178270, 2567062, 6890982, 5896432, 4182217, 2073209, 2399275, 323935, 8373194, 5251819, 55529, 4680175, 688911, 168988, 7004624, 2667940, 4612355, 6807498, 7725712, 6903394, 77210, 7900720, 6796518, 7875182, 3640661, 914135, 3376847, 636225, 7461816, 1770055, 5433771, 3515052, 4582278, 3171556, 1003805, 5570692, 3049189, 268819, 7446459, 619248, 6358697, 640267, 190378, 3955620, 6050848, 6085402, 6615842, 6047539, 4888294, 7949350, 3801226, 3205817, 3903714, 7009880, 822889, 5040977, 265282, 3580521, 346678, 6200910, 7066637, 5669763, 1784368, 3604964, 5570528, 626724, 7528016, 7869621, 6763999, 5204377, 6649831, 6767439, 7263780, 2720937, 8347901, 3210724]] -w1Prime: [[9, 2, 9, 6, 11, 7, 15, 2, 7, 8, 7, 1, 14, 8, 1, 1, 14, 7, 15, 14, 4, 11, 0, 4, 9, 10, 5, 13, 5, 11, 5, 11, 2, 3, 7, 0, 3, 12, 6, 1, 11, 0, 13, 4, 9, 6, 12, 1, 2, 6, 12, 14, 0, 6, 1, 2, 15, 9, 2, 14, 7, 9, 5, 15, 9, 2, 11, 3, 7, 5, 3, 11, 11, 10, 7, 6, 1, 8, 15, 2, 7, 1, 7, 5, 9, 7, 1, 9, 3, 2, 8, 10, 8, 14, 6, 0, 2, 3, 9, 2, 13, 6, 4, 12, 9, 9, 10, 14, 3, 8, 10, 5, 12, 1, 9, 12, 1, 5, 3, 12, 12, 8, 12, 3, 3, 14, 2, 2, 14, 11, 6, 11, 1, 11, 14, 10, 10, 13, 2, 8, 13, 15, 15, 1, 9, 13, 3, 14, 11, 13, 9, 9, 10, 4, 15, 6, 4, 6, 9, 5, 12, 3, 11, 9, 2, 5, 6, 4, 14, 9, 10, 13, 0, 4, 5, 13, 14, 0, 3, 11, 13, 10, 15, 8, 11, 1, 9, 2, 2, 0, 0, 10, 11, 3, 9, 13, 10, 6, 5, 4, 12, 10, 1, 14, 2, 11, 6, 4, 13, 8, 15, 1, 1, 9, 1, 2, 5, 3, 2, 11, 3, 14, 7, 4, 14, 15, 6, 12, 1, 14, 4, 10, 13, 11, 15, 4, 10, 14, 9, 5, 12, 9, 7, 3, 8, 10, 7, 15, 3, 9, 1, 0, 0, 10, 1, 6], -[9, 7, 13, 5, 14, 15, 15, 3, 9, 10, 15, 11, 4, 4, 6, 12, 2, 15, 12, 3, 15, 9, 8, 7, 6, 1, 9, 1, 1, 5, 3, 15, 3, 2, 8, 4, 13, 0, 11, 6, 0, 1, 9, 13, 0, 12, 5, 4, 13, 4, 6, 11, 12, 1, 2, 2, 14, 6, 7, 13, 5, 11, 13, 7, 6, 5, 6, 12, 5, 10, 0, 12, 5, 7, 7, 3, 13, 1, 13, 13, 1, 3, 2, 6, 3, 6, 13, 5, 15, 12, 11, 0, 11, 7, 12, 10, 7, 9, 8, 10, 12, 5, 6, 10, 14, 11, 4, 12, 7, 10, 6, 1, 7, 14, 2, 8, 10, 5, 8, 7, 0, 7, 6, 5, 5, 12, 11, 5, 1, 15, 2, 4, 11, 8, 2, 8, 14, 6, 6, 11, 0, 8, 5, 6, 9, 15, 8, 10, 3, 12, 8, 10, 11, 11, 1, 11, 5, 0, 4, 11, 5, 2, 15, 6, 8, 7, 11, 15, 7, 3, 12, 2, 13, 7, 0, 2, 8, 10, 11, 6, 0, 5, 5, 14, 12, 8, 4, 5, 10, 4, 11, 9, 4, 5, 4, 11, 2, 7, 8, 13, 13, 4, 3, 10, 7, 4, 8, 7, 8, 2, 6, 12, 8, 12, 5, 15, 14, 11, 3, 6, 15, 5, 8, 8, 2, 9, 13, 10, 0, 5, 13, 3, 15, 5, 14, 5, 13, 2, 6, 12, 3, 9, 3, 1, 7, 10, 1, 3, 0, 8, 8, 0, 3, 12, 12, 4], -[9, 11, 4, 4, 14, 14, 4, 5, 4, 13, 4, 11, 7, 11, 1, 11, 12, 4, 5, 5, 10, 9, 5, 2, 5, 13, 9, 11, 7, 10, 1, 13, 7, 11, 2, 6, 10, 1, 0, 5, 8, 1, 0, 11, 6, 4, 7, 9, 3, 9, 9, 13, 2, 4, 13, 11, 7, 4, 6, 6, 13, 14, 12, 12, 1, 15, 13, 1, 13, 10, 3, 8, 6, 5, 7, 8, 1, 15, 2, 10, 14, 7, 11, 12, 10, 9, 14, 9, 5, 4, 15, 5, 0, 9, 5, 15, 7, 6, 6, 6, 13, 15, 15, 1, 12, 5, 5, 6, 12, 11, 5, 0, 13, 7, 10, 5, 14, 6, 11, 0, 6, 1, 7, 1, 6, 7, 12, 2, 13, 4, 11, 15, 10, 4, 0, 0, 15, 0, 11, 9, 10, 13, 7, 0, 0, 11, 9, 9, 5, 13, 3, 9, 6, 6, 4, 2, 11, 15, 11, 15, 7, 13, 7, 5, 6, 13, 15, 8, 4, 13, 14, 12, 1, 3, 9, 7, 10, 13, 2, 6, 12, 5, 3, 13, 5, 8, 15, 11, 0, 8, 3, 9, 4, 9, 1, 1, 3, 12, 9, 15, 2, 10, 1, 11, 6, 5, 4, 12, 6, 13, 4, 2, 8, 2, 15, 8, 3, 0, 6, 8, 8, 8, 14, 12, 14, 11, 14, 7, 15, 10, 10, 14, 0, 3, 14, 1, 12, 15, 12, 15, 3, 7, 11, 13, 4, 13, 7, 10, 5, 2, 3, 2, 7, 13, 6, 7], -[13, 15, 12, 8, 14, 3, 14, 15, 8, 15, 13, 1, 14, 13, 12, 4, 15, 9, 3, 4, 6, 6, 6, 5, 12, 7, 0, 7, 15, 11, 14, 1, 0, 5, 5, 5, 10, 2, 4, 13, 4, 7, 15, 15, 8, 1, 15, 10, 9, 2, 11, 12, 15, 13, 2, 0, 5, 5, 0, 2, 12, 8, 0, 7, 5, 1, 8, 3, 14, 7, 4, 6, 7, 15, 11, 11, 14, 4, 5, 15, 7, 5, 1, 2, 4, 0, 3, 0, 6, 6, 8, 4, 7, 3, 11, 14, 0, 13, 4, 1, 13, 11, 1, 14, 9, 12, 2, 7, 6, 6, 15, 10, 10, 14, 9, 7, 7, 2, 12, 13, 12, 4, 7, 4, 8, 4, 1, 3, 13, 11, 0, 6, 8, 1, 4, 5, 6, 9, 13, 4, 9, 4, 2, 8, 15, 9, 5, 0, 0, 6, 9, 13, 4, 1, 4, 3, 7, 10, 7, 14, 8, 6, 8, 6, 5, 11, 0, 9, 10, 7, 0, 14, 14, 3, 9, 6, 0, 12, 12, 3, 0, 2, 13, 12, 11, 15, 5, 14, 11, 7, 11, 8, 5, 5, 10, 7, 4, 15, 6, 3, 11, 0, 5, 15, 3, 10, 13, 11, 5, 7, 3, 1, 15, 4, 3, 3, 14, 15, 1, 13, 10, 9, 3, 11, 6, 10, 2, 15, 15, 14, 3, 8, 5, 5, 8, 10, 3, 14, 9, 12, 12, 8, 4, 9, 3, 6, 5, 8, 6, 13, 12, 8, 9, 10, 10, 15], -[11, 13, 4, 10, 8, 8, 7, 6, 11, 4, 10, 1, 13, 6, 1, 10, 4, 6, 5, 4, 1, 6, 11, 3, 4, 15, 6, 13, 5, 11, 10, 14, 3, 10, 9, 10, 8, 5, 8, 13, 1, 14, 2, 10, 5, 7, 7, 2, 1, 9, 3, 5, 5, 12, 12, 10, 11, 7, 10, 3, 5, 15, 8, 1, 14, 14, 11, 5, 3, 5, 9, 14, 0, 10, 6, 14, 13, 8, 10, 13, 1, 0, 2, 8, 9, 5, 15, 15, 14, 11, 2, 13, 2, 11, 5, 7, 10, 0, 14, 4, 5, 4, 12, 11, 8, 8, 0, 10, 14, 10, 4, 12, 6, 8, 6, 12, 12, 15, 14, 6, 8, 1, 2, 2, 4, 1, 1, 3, 5, 5, 2, 3, 9, 3, 9, 13, 13, 15, 0, 11, 15, 6, 13, 3, 8, 8, 10, 13, 9, 5, 8, 0, 14, 3, 7, 4, 8, 5, 3, 10, 10, 2, 11, 10, 10, 13, 6, 6, 10, 10, 14, 6, 5, 6, 9, 8, 15, 14, 6, 7, 9, 5, 11, 9, 8, 6, 13, 5, 6, 15, 7, 7, 11, 4, 6, 15, 11, 13, 10, 12, 5, 12, 7, 12, 10, 8, 8, 7, 3, 6, 8, 13, 4, 9, 14, 9, 8, 0, 7, 3, 7, 11, 5, 0, 13, 11, 6, 12, 15, 1, 13, 12, 4, 11, 5, 1, 15, 11, 3, 3, 3, 3, 12, 12, 5, 10, 8, 2, 13, 6, 9, 13, 8, 15, 5, 14], -[11, 9, 11, 5, 4, 8, 0, 1, 8, 1, 15, 7, 12, 13, 0, 5, 10, 9, 8, 9, 15, 5, 0, 15, 6, 10, 13, 11, 13, 13, 2, 6, 0, 2, 0, 14, 0, 5, 0, 11, 12, 7, 15, 13, 4, 2, 0, 5, 5, 15, 15, 15, 3, 11, 2, 9, 11, 3, 6, 8, 12, 13, 12, 4, 14, 7, 13, 11, 2, 14, 1, 11, 15, 9, 15, 4, 10, 3, 8, 1, 10, 0, 8, 7, 8, 0, 0, 2, 7, 14, 10, 7, 2, 9, 14, 7, 12, 8, 10, 10, 10, 14, 1, 12, 1, 7, 13, 3, 11, 13, 10, 14, 3, 2, 0, 9, 5, 9, 4, 3, 2, 14, 13, 12, 15, 1, 1, 9, 4, 11, 2, 12, 5, 7, 3, 7, 0, 7, 8, 5, 14, 15, 6, 6, 10, 0, 2, 14, 6, 0, 1, 0, 15, 1, 4, 3, 3, 1, 0, 10, 13, 12, 6, 3, 2, 6, 6, 12, 6, 10, 13, 11, 8, 9, 14, 3, 15, 13, 1, 9, 0, 5, 13, 11, 8, 4, 5, 1, 0, 10, 0, 9, 1, 0, 13, 5, 9, 13, 15, 13, 0, 15, 13, 15, 7, 2, 6, 1, 14, 3, 10, 7, 9, 6, 2, 11, 6, 1, 14, 1, 12, 1, 0, 8, 12, 12, 13, 12, 9, 15, 7, 6, 7, 13, 2, 10, 1, 7, 1, 12, 14, 11, 3, 7, 11, 1, 14, 15, 13, 10, 13, 13, 14, 5, 0, 6]] -w1EncodeTemp: 29697B2F87178E117EEFB440A9D5B5B53207C3160B4D691C62EC60219FE297F5293B57B3AB67812F1757799123A8E80632296DC499EA835A1CC951C38C3CE322BEB6B1AEDA82FD1FD9E3DB994A6F64593C9B52469EDA40D50EB3AD8F1B2902A03BD96A45ACE1B2468D1F912135B2E347FEC6E1A4BD4FEA599C37A8F79301A061795DFE3FA9BF44C6F23C9F78161951F323480D6B10D9C0454DB61C226ED7B57D56C6A5C075371DDD3162635DCF0B7BAC97A85CA6BEC4A716E7825A787056C55BF1428B826EB68065F9A8C3A8BBB105B4256F78FB372C7D20A86B50E58C544A9B54B472D84DA3477828C6C8F5BE635F8892AD503D5F5E2DC69313A7318008C34CB944EE54D4B4B7B14C559A25D5B9A7D1B7621A5018B0469793D942BD4766EDCCF11DAD835687F1A27ECB9A9E455F90F56766FD1F5C65BC057D5A6E0B1617762C4DFB4A000F9BDA07B099D5936624FBFBD757D68FD4CE3179DA625CD385BF80939411C3F9A2B156C4D624288F038688CEBE7EAFEA301EFCFC73DBD4A72523D776FD8C3EFEF81DDE4C9F4366567C70BF1E50552AD474FF18AF29CBDF0255208C7015387E64F7BB4EF557210403664837EBD014BDE1C97266AFEA7927DC4C474831BD601854964D49829F0560D91434A7E76868B5907AE03E69C03C20CDFBE57B8B557AF4360BF5A3BD75134F33FED19AB3A6F2EF8355A8E3C98C946385D68CA9FADBA488674B1A6DA16445613BF4D6B5EAA3A958D8E1A275279153C5AC7B3AF518EE5B53E9A0E68DDA018259FFBED2B2750A4E45BC88A0AEC486C6FC6E18221431553239D9FDB06F3D88DA59083E4758A32AABDA66AA6E6589EF76599B685DF6774BF6DBCAC5C78A7863D8949E0837B705BDC61FCDB415BF3333CCA5286DD9F8E59B5B8410187FDC509A985FF0A6BDDD6220E050B07CDF2450F5FFB3923B86DC4C7EBDE2B19F4F3A180A780820E77A927E8CAAEAC1713DDBEA23909534E2CD1F91B4C275737058FE660AE206011F3413A0CD3662C6A6BD983EDF9150BD4815A090015DD9DFF0FD27163E7A69B2161E1C80CCCDF967D7A271C1BE731BFEADDD5E60 -cTilde: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F -cTildePrime: F7789A45A3587330E7FCF70695F7F69688A2B8D0CE54F090214F109F56484F98C3AD1A53A5441C2CA72A3B3191BC046F -cTilde == cTildePrime, signature verified diff --git a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt b/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt deleted file mode 100644 index 66805a563..000000000 --- a/tests/PQC Intermediate Values/Signature Verification -- ML-DSA-87.txt +++ /dev/null @@ -1,153 +0,0 @@ -Signature Verification -- ML-DSA-87 -pk: 2D1E6BED8452EBF126EDE70CA0A2B50D03342D5B13B2AE210F4562A3BF670CB15CE925FD22F26242BAE310B3AA413B6E78D442D935D1728A3248CC205CCD8D3FD834955520CDFB2C73E90E608B2C3FA8B7D179FDDCC88111C9E84171E9709B535933E492B6819C6A92EDA25AC407771A8FEDB4E711FB89EB7BDFCCEAC53B4EF46B6FBEE132A9D7ADB436E74A6D671183AF311A7A31429B012117527585F7920F348A6911885A0208B66DE30793B13FE1D57BD951F7AAC0349A785D26DBF1F0A91E5C9F4FA7435C44A943F1381145EDEB1C8A05EEFFAB202CF62CEE7742363EE69D8E450FF67C3962D6FF97BC3D02D6DF4A35DA3F89A48833CDF290F0E9372F65A58865FD4044AD090992AA159EEEF72B0DA7CB3A5E0AEDD67D828BBACFE59EE462AB696BBAD0E5A9BB1F5A51E0FA5DD44D8EC0DC4306DF2367B24AA2FB752F82D844E4C0CE159E3FD6B4705F3BD0563E0A7A4B94BFBA012B9C8B9135F2DB4C8C8DD6EEC8658DF30559BE3A17A772105614EFB8C1BE18110BE670F839A5727DF947FBACFD1FC37133584415D37C932E7092FABBF2D09D25C4CF4AB8ECBE5D8B7FA47CABADE71E938392861E8D15A41C5B4225DA3D16D393F28550860A86356B14AB5F22D0CF037CEBB40EAC87A24142A0219300B6476F96D041D1C30E3C52D245AB6AE7A1E5FD73C5829D60628B6D87FC889C3EEFAEAAB61C18EED7511A96C4932505D3833DD83316144488E2AFC4EC591812B999C1C95F31790003F6C95514AA29087824AF1D991236D94AD950EF66FC7FF4BC3BA0F6FDF262CAA59D2B55B833BCA67AA51EE1145F94E2DCF05BBD4307D8B1E0813F845490BF2359923CA598AB7D99D2F0ED8E0BC99FAFB013EDC7DDB86172073DCC3573A0CF0CD97E93DC63B882ECF430CE4392EA5ED8C8A1EC79DCAE64D433EB538CFC4979BF7A28651E8CD521B08ECAADF8969A981000356D589AEF84848672BACD3866969BC283B065C1ABCF638C2DC342B27DF6B8F03D26218FAE4E96F25566BC6FEDE719D38DC0CD55205F10CADA09ED914A4333D382115C2F5DECCD54F96CE4E5F268BCE927B21DCAB5CD04011E92F5F601862B20209BB0F956D933D50AEC1BF4CED2B2C2D43F9A25768E29875264864AA57B5A91726EBE6D730A8D89538233704420BEE0B01B763043A55B8FAB7EB8615F43701B1A716156F913312A643314009872EC328809FB64463D5602D976D3AA900FBDF0F996437B621926226A9391EC0734F52232B36566E06B117F979F1A8946CE8FBDFD2FCC3DBFF283A430E10272F874E6219677E1578AF79EB331AFD8C5D720DCFDCF79060F1FE5843D0B9CB3C7ABB8F1C0D0B5C701E20E3BAF7EAC445A75500A761C13DB25D40D19754C02D9F3DF6DBBCF47A6AEF6D1FBF4B455D3A587A155FBBFCDF6A1645712759A11A3CE427084549312E13A0FFACAF22591F14D8F84B1B535ACE98177344D6F5D149DB9E1F03F3CE7AD48E68C5186F44AB4D098EC3A4EAB582F089E5A9D4530B085DF4AE792C6C8189308CE9A8CE2918D91577B37C880A231100D4EEF5107948EF83C3C2ED50326B8727FB9BCD795C43108EC6FEE11AFC0A2ECD7C80BBE15AEC917BE37E2408365DEB34EB415B35C14F65FA91F70B5239378B947F91D2B1E8DB1257EE5853C169FD0C2678B0DD2724E7430E1AFB866CB53DFC4FBA56D03F2AEEE90FED730AF339809EB75C73EC82FE7225F2F0ABDA42288281935831286EE72B426892FC7116EDD149822E7733EFA4675F940C18422BC7536C782D3AE6E0DBF6FC34B674919F34B12F283FD395644053A246A356912CFE493FE26CCD601A04A84A81D85E6830F3CE66DD2CBB1148CEC10B3634B9CF511E0F9866FA7C03B9D25D754CA404D26BA718E25F5A7E39B25207F2905B6271417672610ADA30603FE82855D01044DE06438385E831E219A3902F8F9698552E5EC6AAC9686A78869B5B57E031DA968CA450FF914D67BCF9C036FD1D96F013DF8F311F3291790E89BED589BF0BCC7BAF460C8AA30B42F228FD3AC18C2B7C47B319E0F7E9DBFD463C28B1B585033536D79BBF80D9133D907E7B081D4B4476193F0FB68BC1B41C2F543307E76F9B1A3D6D426EA7775127AC8309BCF45BE747D8A8BECED11E6A1D1B8F190AD6D6AC654E9DBAD4C9739C8D844A91A37167E68450CBB10F4AE8E2B69FA953EA5C991D3F1A3893F9086931BF1A089C7F22357D48E2FD571CD36F190B3983E19EAC80F129DBF58EDDC6B9A7984FCF04CC3B40DB87A8DAD7540D5D5DEC8CA393E45E4BCF433EA64E15E944291ABBC422AB3D06023CE578EFFADA22B64D994A0800F8E5017081D16CF51D0B928B659EF78CCC996F9CA877AEED9155EDF5DBCC258E604EE17DCB3F990F988329EA1DB1C3856539030692E52002CF30FD5802E025B99BFCD1112645B56C60AE638E74D21E598789DE6CB60B42EE49856CBADE6DD53F4C567A29FA05C7CFB245AA772D0E763F25DBFD8E9F16BB429A628E693D387B6D93C398DEA28C0963DF5C23C29F280218A039D64F8BA81C1DDA2882A842E3CB50395EDAA6EE26F5E993C63EEB84F6632774223362989B0ED5FF25A65663FD28B486865DCE0B0C27273F1A4C6562C5DD8C65C41CE308959A9D64596D08E7B25E013FBFE7CEAF3670DB29A213CCE9975A913CEF4236E64003087709CAD6181710E951926CA55297199A608AE545875CDC38FE383C14562B48DCA6602EA34055D983F38E61CCE531AD93F58EC162845F538CE4843871D3C4ADF05F35E297EA62EFCDD5EF9401BA042A235150A09D9474A3FB03AAA19E7E37A228D5F5B07414C3DA2AD2E5C75ECF04C112B90769E19960E975E8D1917B3BFDA84FDC6D2326FB8A3B00F95D9C52650111572BEC21B12127CA570D8A98AB977EBD8D79A59375EE14F64B5B04FD969FEB03D0AF73489E3BAEFE7C7BC8DC7E85483EE62F02398580F83B96DD84477B9C48F0BB39F5406A37036D6F36E2B1B6B53FE6FF61C327B29D4E05DD2B81174C60B59C79CB1976BC06E7AC34DF3E38F7D2C1C0E3151B7147AB831774770143B927B5FEC5DF776C1D72DB6BC9981D65867713CF297C8B0F1E98D0E16F0CC227A39E47E50BA0116156D5B5467536604BE05CC2EF40ABCE852F15DFA2CACF86A789E5B7B0E5BB4B777CD7CC9F654779B102F78B5AA4B94C3B4FDE55FA7F7BF54AC225E1F26165B65F16D0321669FD9F6E47FCA1DD347096DF5DDA86466A57C5B068D9C67B7320366EA19C8993FF90BD8FB0693FBA370E66D2B203B997011B0D15B94E28BAA2EBF01774F7AE78F84EDBDAD9F65A450427A4774C60CC89A020B37DA21C791DAC8F7A7457E30D08B01375160039C301B6051A965E8A7CCA2AEF93BD52F82C020BECE90A129024EFEA4B2FA21270F8EB5ED6AAAE55929AAC599A577972957660CC47AC4E3CE772BBF10052DE7EDB1B8A44941F884C9F8BE13174669945629F46DE2467444F3106A73FA279CF02A800A047E20BD4D820B389C3BB6A868A5384CF5724C204CEFB1A6A1BEB9723E36DDDDD9C707C8F63E8BC26683CC8B43C7DFDAA408AC4DD2BA9AECBC3B6DDAEDCE094AAB58FF732B196638D8B8EFC428BBA9615793C4DD9F00F90D62C676D127A0E18C14C6EE9C990510B054ADB4B4170AC7127F93175C1EB22512 -signature: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBEB11EE5E070E6DA52E548DC04FDEF5472E7E5F18210AACBA04F4F18AE6686B9AF9657E38E3B9BDDB4AA84E67B4D8192D003873DD3EEE74700FBD81E381C2198B7CCC137C171B22F9353419C48C14B8D630F996340275F6E604B95C435208AED2BCA1B419F8363F0950E240D6F9EAB118E4BD3DA0EC3A2BE26A8A09857713C36DD69C34EDD2C619E88267071CF9EE5A60CA3142DF163F01D8D796AC850CFF3666078B318FB5BD17360C876C9C90D8A7F412C8A31616BE7A3745871548486715C94263A17B36CA49925450C578AD9D4B1C20043F45E8431994FA6D26A141BAD9E496E009E914616CA570C09F638D062BEC687333AC7283834537EFB6042F37D83F7295DEA30D50090B6384C1729EF17A0D58750C0037514E5E1227853BC5AA31E95BEEC37B1518269262EA35ADA4FDA77627EEDDAAF57971BA36D467B19A90B991CD255DB79B0154886523031D6C5B1AE8FCF9A4310BBC8197484B2923BFE0B1215A1C4D8C68390898AD53E3369B7053FB18B0D874070902A5D3B3D91D81D4DF1087EF7DC0584EBDC63D7BA3C0D31F86DA6C0FD08115C53F6AEFEC0829A68D2A3442EEE4736702D66810D62308A8CC82AA62182F598F44E253711B5D60788BD0D690EF98F9AD593E03CEF38B9C977983F6911BA1AB9F735E928CDA38C03E6AD8362F460AE4CD0F46E00EEEC74B6123498AB31E7A79D334D72A7A7EEF3B551E78D31BC2CAFFB139CACA4D79C8BBD52BD78F4906509BE42E7763AE6ACB898285EC9323E68676A8CC74A58C8DA8BE911ED6F513B6608707310FB45CBD97D5FF0D2ABA36FCEF73D46CB7F01C2CFE38E68E84F4A301916D2F510D82B4969BE7A0E9CC60EFF5C0A8717B822838C77AF4206B12545089BB2DD6A3FF012C86415BBA04FD7D4EC707AF3B17F25574766F1E92738E06210F48A5EF2550EBDF85A5CA34497CF1D4D3A758648EC41172443835E5091BE8F047823D9620C2AD51C9611AAEE39B21E6D6AEC870C8915E266476A50EECA599622F7091A34C23F14B40429D95E3EF98FED3E749437F04BB4A337522E6809FC104503E253B41C4F0301AF467F74D33125FA83EF712445A171FA40EBF4E6553E454AFE2568021D2B2A198DEC9BF720F9D72F81520BE87466AF70D00E0E860FF9ABD03978C3E429B5AA17B97F9AE93448853D6EFD168A30C6CBE8DE2D288D9A24EA5D2A5823332B84FD2CE793A22BEC439848D4E60F3BB9C75D7EB0871E803D61B07E749ED76072B27C87B69D6C014261F647AFA88C4F1EC55A75A50FB4C79D2C94C0503DB20DFDF71F628874188CDD7385C03381DABB854D4AA9F47B66438C43FF53EF5E78AB450B450191278AF6E26A7B5E6461F577F9852F81C90203C713F5B1F6C3EF558C9032516D8D62FD5E24E4F0F50718F56B5A59A009D5938DAD5591F61F4C659A760526EF41202FA7E5F6C7D5E0B0C0C43B524B66712C5A7C53C84C50B83EB9C98D2FD084C9C5F21FEE7742E6EFC8CBBE5718B70C062D82E2F986F38DF1E71589DC7987243562A2319D7C00B26E531E93C38444618CE758734FDECFD0C6853728C61000784EDFFED7B33086E168D6CB63E3DACAF3552F885B478262DE5E1E63CE7A4C6695D1193835E45A67918C42D39BF880385330310F2C7BF91E6C3E29B781D09870C26D76BD8AE209C42BC7432DBB4C16526357A5634EECDE93C51DD4D6F0065B2EC57AD3B58266539597C8F42B55271D6F90E986F6828D959EE800DBEBCF48236BA3DE2527E0ECA4A3C2A34BBCDD6CBB3A9C96DC3BE110D3499466E2857FBA98123A6DBA9014877E24EADCCA40F8AE94B2FED236CBE5BCA9DFE0CBA9A0F86241331859F9D6C087B276DEC9356F1FEF69B359F9FB384A84022DECB70108DAC8E93BB6C300C0345FC640C006EAEBC15113812FB37DD96E2A06A463AFCE66C59F8D714AA1FF494F086FB9EADA184563CA9D8808B16C19A824AD857DDE51E508B7041235F300ED2C799C182305389576CF393CAEB0D3BA3E4EE4B577A3E37B275FD8051942AE9154E5BD7C35E0F895523A29B0E6B7AE20BE21DFF567EC8252FF5BD0AA145015E11C6A1B941BCC7601BF039442F200619658D9D04021FACE6BAB5D49D8D7BC9A66C2BA3FDC490DA55CB4670838EB2D07245BB1227B024A8A5338E9428EA55741D671A79D6A14D27D13FB59D0DAE5239E1BC42187BB78E038011DA0D1363FD0A78F86261EB026DE7E173A90FCC017DD78F5A32D3E29CE384576A95511B6B4E56EDD014B160799BD1977F5D79E399EAA8E2B75C5EB33566CD8B63F3F4E817E290A68ED1E9FDC6BFA18E3E57D057F22FAA2F60FB634567255165EF418D182FADDF7B89F7D301069C485D8E83489D493BE56EEDC43D48200FD1E2B0669071BBF33613928CA31910BF2EA328EA864139AEF791A9ABE52133249937DA88C48D4C01D108A4685AD29DF2ECD4183820128440EE5378D6BCA6198DE89A97BBB4448A28D823A5740607C6E69989893FA7E299A7453D8DCB34BDB7EFE95B0C72314EFCB493C09D77BD0119BACF2C22E7CCBCD597F6A09FEFEDFA0A7AC3C90BA7519F4016056D5FB412BA02D0D45CFF3A63D36EEE1E468E6EA2F673A7A02926BB318BA73EE1B2C137DEF4A39E803FF573553E9A5C6AA1A1721CA54387CB1DFB8FA7DA726B2AE7A05453B400A19E53252789DC3206324B2584B861F00A250F99FD9DC7D513DD7A65A04034EB33D2D56A496B36ABA0A3008E30FC13824885D9E6F681A7DB62DDDE3501BD40775E2E2CC09CC8E4E67027202A81170A57F4AC198C17FBF95BBCED36D4930B9508CFA3E8BF6E554E91BD7D6E53233BB91ADC815761A0435DECCE167264C2F4E34343D1E5AF7BCE60C9B7B7EE5DF729A0DDD4BE66F82FB5E2CC07B038576110EFDC7D55026BE755EC1F02E4762D6F1DADFF41CEE6352C44537E685A50A075463217B92F7330CD929CFE3ABB5FCAA262093558A0733B27D95027A769E7DBBC1F36E8410304B5D597368EC2A632D46E8C2F8EA2BC44FA76EF474EB96A364409B2363424B8F85004304AD617693BDC388C3FC2961BDB15A1F5B20EF95ED998496B2938182FFE3B927EA9A23F6428DD35C8611C839E316E9A5327CC9EA82509B215CC966BE1C7848EF392DA1C6F369A336253AA1152B6DCFDAA7CADD4D9A1D589F73D3EF0FBF03882FDEB944B5B6CFE26F6AB5123829558C4C736F0B687AC7068380FE7F61BE6B40E3F04D7B36820FD86329B3109D02EC6390EAFC8CA730562B68082424FDA98D0B64BC9734B40B63F7E37AF6890AF7C2D92F79EEA3CCEAC60A6F380692F802B1556A78FE5583FF20A9C6A7BFCC863A9E7B62014D1605DE894FB585E2D4F94115E029E5857E6A0A7389275F530D3D80CFAB1F225D38335D24679197D48A018A34187DE3BCCEDE94FF8EC534C02DA724D4598D669E85A9C60E45214FAA6544D6A47D1C4ED7409D55B1A7F115AE15443A1C310640D116238493EF3EE2879BB8461F7D68736470D4B573AE454993F532301E35CB9EEEDFFEA82FAC497753F75019F2B3B02C70B64A579531C326072ACF1BD0AAA09F0A978B78AB22BD6119F88DD2D572F8919D474F591DAE9FCE4753C985FB250425F26561FFA9443F2376689FEB48C4CE514604526A100AF33F0D4337D1604222C4D9F93A8E69E4CCD36669090C5DFB0E95494229FF9B20CCB1AC81B81A36D63A850DDB33334DAA5146BF36FE18801E3BEBD0E91B5E1CFE7A9826850AF4397D1B07D3B719E57BB832AF4234C0CD9FD40B882FCEDA937EF9A2DA24592BCB5D1BE83EC5F03DBDFBCB335D90D5C8A02EE53D508EB5DE4A961B958F751E5F89A1D28895A3DB7B62EF4AE16D28FB789B3203AD2463D6EAB83A6D20CEA1314AE02A3FF6F653154AE144238186214741C236148183BC39AEDF44DA97F731CE3DCB61A4CFE14F9E84AA05AB1C1B951D20155233FAFAF16CF1BD0BAFE199E65D563453BFE55D5F474AB10594D738A8C106288D69D07A1688601463F3BD2146819C83726D14C6A80839B8790B5716E772F6C24C2BEB7E2CF37B3F42ACDD473E8CCDBE484D6E07B073DECB174AC3B8BB2EF54E6DF9E02071FA600AE55967EB6F702F719159F0EB065CC46048E875E7CF4271AD2EDAF910829AF613BA89FC612A00FDAE537B093AE8CBE6B70D0301FA2E13A916381C92ECB451A36E3FA8B7373620C071A30534EDCB4A3F113117A502D6A72DE6C77BBBF6AE99859AACE64A928C374BD2C4652AC97EB744D29A70CEA9A19D7013497BCAB69631433F9ED1FE20F80B5983E1288BB6A2BE91543ED47928BB5E462D01E9C0B7FFFAC06C10F152F43C329E89DF8A79996A09798A367640BE9FB53DCE27BD0BAA9BF021BF10D2FCFE5B13FD7D84D1C1EBC0BCEC26D08780D13B9947672661E0FA5FAE6F315B6DE40168C2351DE31F41FF6C533226E1BCE3F8E216AF3BE64C693372A066B175F726CFCD642BAE980292C1CB65E01F0729640AB009CB98892D6CFE40033455DEE73033B6D5E19C599F8A400EB141527DF2BBDDEF50BBD5FB55AA5EFDB35D08569B0297E2481469F17B87B508936A9C5C11089AE9E4B0CAC5749393C803E47039F51B5CBD42A6C9E19EC3F63C2332E87768A960FA02186B7A2B029265091146730463DF8B375F24AA83BDD41D1304FC2FB52DA10F1FED652908CF8C528FB2625F393FC8C7B33FAD45BAD47D383D2C04CF32E807425F93D2350721B7B2F596648EB5E1386B43D12EFDDB8FE2436AEC278EE76875B523C5431D99485773D9ADBCD014DD87BC68FB82EE474B22A5433AF9F991FC34B25834DF13099A46F568AFD1155F321B9DA9E9C06347AB3C1F59F7EA0ED6CF47B3E9AF657AA7AE9BF8260B969DE4AD24D3A8CE95E577D0441305064E07B9A2C75C3C43801FCEB736FE3D271BE1F36BFFC8E43DB14A162476BAEA9D346B5211ABD00608B15AF3B5E63A00FF928D1EA1A18D75FA7C6C1B0FB6272E55C3FE7E4D4205E5CF0A1F8718304E14F2B4CC543D0437341A4A311601A92E92566B7DFB4264E870E1B3A875EDBC003A561970CF8A669F3D1B69288CC6E359CE28CA65F9DAE8CECA743C1C8D9FFB5508824A8361E33B431A2E9E9A997847D2E6E43C83F02262E2946DF7726D54E3E6C9CCDB6D3F136346C11E5942E7A1BF850C2E99B4FACE75FD40886933907CCDFC0DE117702031941D001E2A683C5578FD3354212CEAD969BF1C81239EECC774FD0B883D0EEE824B10B879CF707CB268474522061E927B1243244115C669E9EB272B60A644F519EFEC063408B658472E9161A1F744FD66169F0CAE36B42E2379CBE81E6E51A0F53415184EA006B2270B33E2CA364CDB33AAAE77FFD953DB39704D490CE9AC6F2DD1C7A18E617419A9AAFB37E7239B236A4B74CE63E4A0ADFF855DCD78F6458E760BFD1D2AB95E83C03B6FAE0CD3C5CEEEEE1C69515965A335FCF78E80AA739339542127170B2C3EE10B0EAA099AC7AD4CD76E7FE4C1164E62F4E5807DC0061F77E4A8A528D710375930CB755B28BFFD928CB07BB4A107CDCABB308A48650DA4E574D9BF5607F583DAC340D72093EFB12BBF93410F1EF5C9516C744D2315EC9E000A8DC5D17A7B6F0D079D784B6D90193F6E3EE7EA0EABFC6F68C52B37CBCE8218AFA3670A80BC17B95D7B40536226358F04ACD92A1BE15B26A4E5817E628BA679B3527203CD3632628EC83AA4F2186D2F005D5DFE6F7FDB4FEDAC9E89D666E303BB568306156C56F09534E25C619AB3B95018F4896BACAA4834F6D2D8FE14A938AA10E53054F0008444AC2EEA2538C1230E6A18C92B01D9147FDCEFC9C8DAC1D4ECC8CF1F962EFA1B8CD3C969000B7EBAC598DCA45EB40BCFB19851483851CF340F3E8C237A9EFF1C9F21E4975541C61A8FEF2AC6057F59DCB23A80E80610CD85DB203C35D24BC82B9CD78246F59FEBB24832D7CD664C995188E0281CD7867900DC0DF44D409080268B79E95682885F228770734FA53518EC80CE2306CE1448524EF0184303D450C76EA63B733EB0C8DC48BF12423AD23889CFCDD891E5950047240DC0C38AB2DBC165B81E631002EA6F74119E27F9F86073BF2DF710818676980C4CB6BD53F9A5721778B89F59C68C8935F5031C8A93367D717057FD4D5EFABEDE702CC645EFB6D7F44C860FFF7637AAD972248C844D15133920073891C3135D297868B7DA86F097D8FB39C13BA14C4F247516ABA4C5F8CE3818482C8FF60CCA51FDB2CEE96BC1138DC04A86F857727591AAE6F87C30059B3E81B68055B24EA2FA983686498BFC9D9E7D595079EB646E85B212CEDD21D0087E0F2AF663EB772A9847B1DF2197AF13626B897C24637AF5BFE81816A8C90D3048375B699497143E577185A70E115058A3A9112B2C4351B6CAD009282B4F7CB8BDFC285777D7DFE8F5000000000000000000000000000000000000000000000000000000000003060B11171F272E -message: 14426334940960773BFF65F08D1DE489C4C3ED36 -rho: 2D1E6BED8452EBF126EDE70CA0A2B50D03342D5B13B2AE210F4562A3BF670CB1 -t1: [[348, 378, 978, 139, 754, 152, 932, 910, 784, 684, 26, 237, 110, 286, 45, 869, 309, 180, 167, 202, 72, 51, 450, 821, 909, 527, 845, 596, 85, 840, 956, 179, 371, 954, 512, 557, 812, 527, 890, 838, 377, 831, 141, 519, 273, 562, 30, 453, 233, 732, 313, 357, 51, 185, 873, 518, 668, 154, 729, 651, 90, 497, 880, 105, 399, 315, 635, 71, 507, 738, 958, 893, 716, 378, 956, 312, 1012, 986, 998, 902, 306, 490, 733, 722, 822, 697, 724, 413, 785, 992, 794, 104, 378, 140, 436, 6, 801, 133, 853, 533, 759, 996, 832, 552, 361, 516, 424, 9, 520, 877, 566, 31, 403, 1004, 531, 855, 379, 118, 885, 683, 192, 653, 905, 373, 806, 118, 783, 679, 30, 983, 249, 669, 67, 279, 660, 270, 241, 78, 81, 949, 235, 647, 88, 952, 1023, 42, 706, 984, 556, 507, 39, 217, 574, 889, 233, 278, 527, 829, 919, 392, 982, 511, 969, 246, 514, 1013, 173, 213, 986, 591, 584, 546, 307, 179, 271, 962, 1001, 973, 594, 661, 392, 857, 15, 273, 429, 578, 288, 682, 533, 935, 894, 175, 781, 745, 940, 376, 266, 443, 989, 521, 651, 1006, 604, 635, 740, 728, 666, 429, 186, 372, 670, 750, 543, 86, 517, 1003, 93, 885, 228, 770, 988, 400, 496, 143, 615, 684, 548, 1006, 885, 139, 392, 275, 228, 944, 348, 632, 575, 309, 779, 381, 59, 436, 997, 40, 890, 274, 1017, 746, 769, 778, 185, 582, 565, 764, 205, 561], -[653, 949, 142, 407, 909, 380, 400, 761, 826, 453, 810, 65, 86, 965, 910, 774, 190, 70, 177, 920, 112, 638, 595, 458, 381, 510, 948, 691, 1021, 199, 796, 205, 88, 337, 305, 499, 659, 11, 295, 1002, 699, 60, 477, 150, 964, 691, 900, 946, 446, 727, 1016, 657, 892, 874, 634, 123, 915, 160, 105, 122, 397, 261, 458, 364, 322, 649, 989, 88, 979, 164, 95, 322, 646, 386, 856, 428, 788, 1002, 549, 832, 975, 768, 695, 723, 14, 491, 552, 262, 66, 104, 306, 2, 950, 977, 358, 834, 321, 244, 236, 240, 594, 372, 692, 426, 487, 360, 990, 463, 709, 864, 521, 393, 395, 475, 968, 547, 668, 975, 750, 682, 182, 519, 737, 863, 593, 390, 73, 591, 293, 193, 61, 246, 984, 396, 321, 272, 648, 1016, 74, 947, 89, 134, 913, 614, 449, 1010, 789, 484, 768, 384, 159, 343, 532, 618, 130, 480, 804, 875, 401, 74, 310, 694, 404, 323, 751, 793, 1023, 977, 956, 14, 874, 1015, 754, 664, 604, 630, 299, 533, 827, 752, 678, 350, 490, 900, 788, 279, 553, 883, 1008, 854, 59, 29, 472, 44, 30, 254, 132, 21, 1017, 142, 601, 804, 595, 610, 427, 607, 297, 963, 749, 739, 144, 639, 175, 236, 721, 799, 221, 110, 806, 29, 61, 371, 819, 641, 207, 579, 1005, 589, 988, 536, 43, 946, 244, 908, 60, 585, 746, 535, 141, 647, 492, 798, 749, 402, 980, 716, 318, 561, 508, 594, 1015, 490, 296, 921, 193, 854], -[33, 940, 168, 695, 760, 677, 393, 66, 256, 845, 390, 617, 239, 289, 104, 458, 442, 563, 611, 601, 667, 240, 776, 406, 961, 1002, 572, 561, 813, 176, 804, 502, 246, 46, 991, 152, 801, 931, 234, 601, 498, 405, 966, 446, 1005, 633, 305, 567, 448, 371, 517, 380, 528, 690, 157, 948, 657, 210, 820, 844, 386, 772, 757, 372, 492, 307, 917, 435, 484, 185, 655, 753, 1001, 137, 475, 808, 437, 307, 16, 120, 402, 445, 31, 536, 43, 8, 434, 706, 761, 597, 829, 852, 10, 763, 833, 827, 722, 172, 332, 255, 410, 393, 231, 166, 647, 276, 102, 298, 933, 670, 277, 458, 622, 879, 822, 41, 397, 226, 37, 206, 112, 17, 994, 898, 944, 390, 775, 268, 933, 982, 696, 506, 440, 984, 53, 449, 539, 70, 535, 345, 1017, 68, 675, 400, 51, 5, 384, 458, 748, 524, 152, 1004, 612, 849, 355, 9, 729, 221, 685, 578, 271, 47, 927, 603, 835, 158, 406, 152, 546, 218, 281, 946, 7, 333, 559, 200, 435, 409, 518, 431, 785, 479, 505, 106, 649, 913, 252, 758, 1021, 779, 988, 764, 1010, 288, 778, 900, 514, 540, 847, 921, 545, 485, 535, 351, 906, 957, 825, 198, 175, 374, 380, 131, 476, 1023, 924, 25, 783, 327, 78, 246, 11, 231, 123, 687, 440, 60, 268, 727, 455, 128, 238, 236, 687, 799, 74, 361, 117, 660, 864, 113, 787, 374, 322, 55, 281, 797, 36, 868, 1011, 887, 950, 830, 583, 937, 874, 839], -[251, 317, 347, 845, 933, 97, 346, 1005, 447, 435, 543, 402, 599, 324, 423, 70, 675, 179, 772, 529, 852, 164, 529, 235, 527, 702, 812, 151, 401, 892, 244, 530, 433, 365, 707, 934, 897, 285, 211, 445, 93, 837, 921, 902, 1008, 783, 627, 695, 584, 825, 280, 537, 756, 274, 267, 611, 748, 910, 692, 354, 47, 898, 425, 629, 69, 12, 91, 894, 842, 185, 105, 803, 792, 548, 224, 619, 652, 120, 217, 582, 855, 478, 131, 515, 418, 12, 209, 312, 495, 468, 320, 570, 248, 783, 739, 852, 515, 521, 811, 509, 185, 495, 349, 786, 49, 770, 766, 953, 785, 43, 556, 946, 215, 754, 992, 86, 430, 498, 993, 222, 226, 208, 600, 889, 691, 275, 347, 716, 92, 389, 511, 677, 31, 348, 571, 588, 376, 494, 916, 119, 555, 839, 792, 150, 382, 377, 968, 88, 159, 180, 636, 557, 525, 180, 231, 465, 304, 1016, 906, 410, 971, 980, 77, 1007, 421, 219, 800, 699, 238, 932, 383, 195, 943, 524, 153, 940, 885, 945, 131, 191, 743, 968, 757, 40, 189, 169, 130, 162, 281, 205, 296, 536, 750, 284, 619, 548, 815, 113, 737, 885, 20, 166, 626, 463, 574, 446, 852, 997, 320, 304, 552, 752, 629, 461, 44, 846, 686, 859, 1008, 446, 963, 466, 150, 101, 1011, 146, 801, 527, 509, 398, 69, 21, 58, 649, 854, 420, 786, 307, 318, 1018, 38, 435, 29, 640, 74, 545, 474, 532, 998, 992, 960, 920, 621, 756, 796, 82], -[140, 59, 817, 398, 75, 359, 287, 896, 761, 993, 630, 770, 315, 359, 370, 339, 202, 848, 612, 744, 625, 355, 850, 671, 995, 358, 514, 508, 297, 385, 635, 80, 791, 409, 258, 692, 675, 193, 992, 523, 389, 87, 64, 308, 224, 537, 899, 376, 643, 71, 418, 230, 2, 638, 671, 533, 338, 825, 686, 689, 662, 481, 138, 422, 437, 941, 55, 116, 169, 666, 92, 61, 249, 389, 957, 829, 924, 960, 278, 871, 367, 832, 899, 975, 785, 636, 370, 576, 1000, 870, 398, 621, 240, 495, 940, 978, 96, 690, 778, 720, 559, 968, 312, 691, 536, 496, 75, 495, 561, 999, 992, 629, 191, 245, 38, 559, 27, 22, 821, 332, 365, 734, 907, 55, 913, 588, 125, 924, 432, 288, 845, 286, 865, 36, 959, 419, 956, 70, 36, 983, 67, 908, 871, 997, 945, 424, 333, 155, 1002, 349, 295, 488, 200, 716, 249, 279, 190, 861, 167, 558, 492, 123, 609, 647, 209, 110, 271, 694, 621, 410, 332, 933, 475, 811, 372, 230, 200, 310, 660, 106, 567, 901, 647, 277, 780, 46, 833, 699, 910, 586, 934, 599, 318, 617, 284, 846, 1009, 616, 1016, 576, 902, 740, 785, 643, 905, 177, 575, 348, 724, 995, 338, 455, 717, 77, 271, 718, 664, 591, 673, 803, 527, 836, 1017, 354, 237, 759, 422, 486, 132, 63, 207, 781, 436, 515, 939, 565, 429, 29, 340, 855, 222, 690, 924, 248, 69, 825, 843, 207, 234, 89, 494, 593, 322, 740, 970, 266], -[810, 44, 525, 141, 974, 917, 1016, 695, 930, 266, 406, 595, 160, 992, 224, 322, 23, 834, 353, 828, 81, 628, 651, 728, 857, 571, 199, 807, 406, 702, 124, 490, 494, 374, 481, 893, 93, 175, 396, 921, 516, 507, 449, 719, 249, 612, 143, 202, 414, 744, 461, 224, 854, 20, 777, 420, 558, 20, 704, 972, 271, 53, 744, 8, 347, 998, 219, 71, 18, 729, 357, 793, 522, 569, 627, 311, 289, 569, 905, 629, 998, 50, 838, 186, 228, 422, 181, 695, 486, 247, 837, 791, 615, 1000, 521, 370, 892, 318, 418, 669, 114, 500, 574, 969, 861, 559, 669, 967, 107, 621, 610, 162, 998, 228, 125, 730, 217, 591, 211, 938, 40, 432, 985, 980, 194, 591, 802, 515, 545, 226, 464, 402, 760, 110, 24, 887, 162, 674, 66, 186, 316, 237, 336, 950, 682, 155, 766, 377, 153, 207, 742, 739, 591, 153, 883, 265, 547, 589, 146, 706, 1005, 151, 431, 405, 870, 143, 189, 290, 360, 793, 525, 707, 706, 220, 791, 659, 710, 789, 466, 865, 198, 87, 228, 195, 393, 598, 362, 279, 150, 948, 952, 149, 992, 708, 1007, 499, 1002, 508, 214, 712, 410, 776, 227, 615, 373, 234, 225, 979, 547, 283, 6, 192, 135, 796, 729, 390, 385, 924, 336, 102, 550, 370, 661, 452, 665, 553, 736, 338, 344, 861, 60, 575, 995, 96, 92, 393, 436, 675, 620, 9, 234, 333, 464, 609, 63, 398, 462, 824, 595, 582, 1021, 352, 748, 517, 82, 981], -[568, 563, 52, 541, 29, 655, 500, 23, 755, 599, 994, 665, 46, 895, 493, 997, 832, 6, 42, 649, 309, 645, 144, 868, 583, 978, 771, 234, 426, 454, 574, 491, 290, 995, 437, 29, 65, 851, 547, 694, 46, 343, 711, 963, 332, 708, 258, 474, 414, 390, 233, 604, 350, 611, 369, 716, 703, 310, 984, 795, 722, 972, 902, 654, 944, 323, 409, 791, 38, 84, 337, 456, 702, 752, 289, 72, 380, 41, 391, 679, 394, 494, 695, 867, 727, 614, 885, 376, 993, 275, 854, 706, 335, 630, 998, 707, 573, 450, 847, 548, 739, 1006, 638, 799, 444, 483, 652, 339, 643, 187, 774, 143, 152, 982, 48, 742, 109, 310, 884, 741, 964, 739, 816, 638, 596, 193, 778, 217, 982, 956, 694, 108, 875, 916, 767, 985, 540, 716, 663, 848, 480, 151, 909, 70, 628, 753, 400, 797, 412, 492, 697, 769, 622, 222, 220, 973, 995, 867, 711, 112, 270, 76, 885, 82, 122, 110, 883, 285, 112, 709, 291, 494, 95, 891, 885, 475, 961, 885, 866, 754, 409, 416, 397, 413, 113, 143, 383, 802, 432, 636, 222, 58, 22, 828, 556, 488, 57, 953, 263, 745, 513, 325, 721, 365, 852, 217, 613, 17, 446, 769, 748, 976, 10, 559, 302, 965, 605, 830, 706, 994, 106, 926, 441, 493, 782, 278, 891, 478, 205, 607, 876, 339, 887, 38, 753, 480, 693, 746, 324, 782, 436, 383, 510, 669, 1015, 303, 709, 138, 862, 391, 354, 364, 357, 892, 54, 132], -[870, 615, 877, 915, 639, 882, 305, 287, 265, 347, 479, 675, 612, 345, 970, 365, 262, 803, 633, 733, 818, 384, 678, 103, 456, 998, 915, 47, 984, 446, 304, 1006, 163, 412, 734, 173, 800, 590, 777, 69, 432, 756, 325, 906, 651, 938, 1010, 6, 887, 659, 631, 575, 388, 891, 731, 638, 101, 41, 37, 489, 71, 413, 204, 800, 666, 704, 880, 872, 801, 113, 425, 803, 1015, 361, 996, 193, 976, 98, 880, 324, 864, 768, 777, 108, 352, 596, 602, 929, 167, 179, 746, 998, 315, 1013, 34, 770, 544, 943, 268, 646, 553, 896, 996, 659, 690, 126, 626, 60, 398, 877, 686, 681, 485, 598, 674, 790, 409, 489, 375, 166, 599, 793, 64, 491, 964, 952, 892, 173, 191, 324, 720, 924, 493, 556, 587, 294, 65, 318, 152, 995, 958, 452, 97, 421, 660, 597, 834, 439, 738, 273, 71, 973, 528, 218, 935, 159, 156, 700, 2, 42, 516, 31, 978, 310, 898, 514, 451, 238, 182, 554, 598, 226, 332, 189, 199, 129, 844, 123, 619, 646, 446, 174, 999, 216, 477, 631, 125, 31, 712, 957, 179, 778, 870, 800, 188, 270, 967, 695, 589, 34, 428, 147, 941, 618, 236, 751, 723, 873, 749, 627, 160, 685, 856, 255, 695, 100, 102, 526, 909, 958, 196, 714, 667, 390, 855, 292, 476, 639, 256, 894, 544, 793, 374, 500, 514, 902, 140, 389, 748, 627, 409, 1, 769, 338, 173, 301, 379, 40, 711, 964, 311, 94, 604, 135, 603, 72]] -cTilde: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE -z: [[188751, 61938, 337178, 225707, -328924, 176385, 137358, -12062, -240144, 198132, -399439, -26218, 86087, -406905, -211854, -216537, 97110, 206914, 486783, -28733, -447293, 229762, -64256, 294419, -8476, -314233, 444479, -206620, 290001, -115733, -246088, 116524, 288497, 363514, 496033, -87222, 510524, -448674, -248363, -128017, 498813, 464545, -462116, -178662, -232977, -372020, 343282, 365590, -41128, 60039, -341564, -276125, -318798, -124434, 514424, -325399, 72290, -143562, 447212, -460351, -101661, -296615, 274608, 129425, -45944, 147535, 494639, 37754, -379337, 1888, -142401, 126184, 268437, 161974, 240527, 59288, 93092, 429150, 234317, 370278, 62395, -366757, 347692, 249844, 237836, -103192, 350641, 440659, -437531, 72551, 418304, 433047, -284618, -483472, 339912, -289766, -144263, 357261, 314312, -505829, 310688, -14303, -338423, 323931, 524075, 291991, -71500, 426254, 10848, -263432, 232189, -400977, 296926, 152635, 188765, -445417, 413385, 92123, 315866, -370090, 9649, 6617, -514797, -95610, -369435, 19354, -239897, 407152, -218578, -198557, 112619, 326360, 141775, -191260, -184207, 457671, -116923, -18241, -234162, 475165, 453358, -363594, 490554, -43161, 311595, -226963, 442619, 468805, 507769, 349945, -342877, -362771, 439011, 8049, 140041, -440384, 39972, 275539, -12557, -157407, -64960, 147184, -456275, -266218, -39554, -146726, -405060, 301954, 119440, 468970, -143458, -297160, 416214, -481314, -455832, 298412, 84719, -32893, -69053, -495846, 157041, -395581, -61244, -301971, -497783, 452973, -72378, 303237, -338153, -51772, -386563, 120774, -418036, -328906, 495884, -446176, 346508, -99137, 52821, -121470, 373453, -162423, 134162, -423195, -274829, -193227, -267259, -150217, -236759, 185384, 231235, 108273, 344567, 37260, -321082, -101258, -89640, 269524, -157544, -293062, -22602, -48556, -332265, 190722, -26171, 51456, 132336, -367796, 499843, -179503, -421795, 270468, -510790, -270359, -451535, -427656, 505265, 433773, 461358, 344703, -420169, 464981, -444060, 143376, 30966, 382079, 29565, 251145, 151290, 490414, -373403, 264531, -4848, 436660, -499899, -347508], -[-159980, -204599, 55937, 105355, 5647, -394114, 257950, 137041, -415218, -494544, 304038, -95306, -335311, 44124, -280710, 429026, 310492, 195096, -507537, 32696, 337629, 352058, 123691, -172313, 378386, 77333, 5014, -37064, 73195, 88970, -192080, -91548, -128802, 310880, 245822, 505023, -448809, -496613, -454031, -83779, -258103, -146244, -414263, 485758, 192260, -401460, -308307, 510735, 86271, 47116, 183853, -16290, 232977, -136274, 460175, -478900, -415206, 220077, -9726, 405466, -76331, -444625, 460901, -360338, 360145, -426165, -484980, -329482, 127474, -495864, -118955, -276355, 185884, 427349, -163769, 307559, -361800, -513763, 488938, -310371, -384744, -53890, -140442, 350754, 318632, -17075, 54019, -141630, 267221, 226940, -517844, -234416, -417223, -31495, -360478, -198163, -423038, 127623, -307826, -223351, 430947, 125920, -477174, -51850, 188849, 43604, 258139, -121979, 486356, 273140, -331186, 393345, 227230, -49543, 166947, 312312, -252545, 206757, 218806, 104513, 291773, 180236, -24303, 238921, 441077, 362224, 330102, 18770, 433058, 32938, -493049, -301074, 64766, -479548, 264527, 172292, 356212, 76525, -352909, 375313, 134940, 425857, -158709, -132501, 273143, -186585, 93867, 212481, 91547, 368553, 507409, -160498, 2331, -396636, 212816, 187460, 432565, 154937, -21372, 195380, -81592, -56475, 208849, -285848, -401394, 252034, -61414, -257212, 59305, 499509, 359891, -28574, 422413, 434561, -121993, 374665, 368075, -119578, 393092, 182549, 290018, 243636, 29599, 51826, -515663, -290060, -14213, 455582, -423936, -519668, 478249, -399459, -251496, -407100, 275750, 330401, 42104, 120796, -417502, -321073, 111494, -334166, 182247, 151997, -299367, -341032, 460645, 183416, -471344, 19776, -270073, 355354, 491081, 63091, 102974, -43991, 259614, -291516, -208195, 432949, 40110, 116139, -453710, -284989, 76771, 495859, 184741, -341932, 97611, -87350, 210793, 175425, -466215, -432390, 330106, -88280, 464738, -441776, 309041, -145074, 55842, -445954, 351324, 214468, -318908, 283722, -300700, -398269, -119568, 104124, -493026, -101287, -342546, -68518, -427796, -434759], -[472356, -192388, -438932, 299729, -320971, -391835, -117728, -494090, 310942, 159357, 469255, -206972, -122486, 68772, -126751, 156874, -64505, -17571, -273666, 517250, -55816, 278884, 474186, 308224, 473505, 496636, 398358, 445156, 315519, -366555, 120210, 116160, 78161, -130134, -160141, -522772, -20297, -235248, -56042, 117679, -40394, -200840, -6508, -184906, -425349, -415005, 215288, 306912, -327923, 27954, 321380, 294830, -489109, 277604, 282450, 267347, 138162, -145275, 33821, -361970, 386811, -72420, -386388, 305205, 132896, 285399, 85975, -191358, 410080, -482802, 332697, -521512, -184411, 196278, -319765, 411999, -269204, 518292, 261185, -468009, 106240, -365961, 442160, -323490, -371563, -361621, -179415, -271977, -278458, 469859, 238427, 489861, -387896, 376718, 347813, 514126, 292278, -430981, 160190, 256646, 36394, 87590, -381460, -504119, -184409, 377251, 255074, -29212, 493381, 519282, 417763, 265363, -501712, 366488, 85986, 4638, 509417, -266185, -56599, -147287, -81453, 291614, -95813, 453286, 150346, -382702, 111871, -102513, 58947, -360279, -407966, -60073, 166613, 311620, -27734, 263315, 438721, 354328, -354314, -127470, -158684, -405903, 164379, 382992, 89350, -221439, 371148, 432809, -62558, -11537, 8710, -129935, 511875, -280209, -55429, -37710, -431060, -451947, 244772, 522195, -204541, 94110, -465671, 126149, -141369, -70428, -193035, -58158, 301912, -457121, -137849, 185367, -78355, 9932, -36008, -265540, -135197, -21608, -469421, -316141, 359615, 360424, 192956, -54142, 406933, -387462, -240009, 242761, -369224, 284632, 507817, 71738, -39017, -502073, -141694, 182455, 271144, -373947, 131458, -293641, -463907, 222018, 63172, -329661, -301841, -274218, -228398, 156452, -92799, -520160, 24353, 275766, 148848, -475543, 106495, -507221, 513215, 470310, 274619, 271761, 397770, 94642, -518886, 285070, 392582, -210617, 280040, 409881, -332588, 217353, 268231, 163856, -86837, -289374, 58710, -303633, -276564, -391959, -391864, 365961, -175794, 241577, -147515, -414096, -21042, -276951, 236768, 160990, -493131, -139265, -522576, -380313, -348541, -159091, 326566, -210144], -[119491, -92741, -158387, 327509, -516872, 291824, -362532, 67099, -334440, 337049, 465955, -344501, 363257, -314926, -445449, 101144, 364030, 451968, -501104, -267431, -508312, -89079, 274757, 223523, 476880, -501957, 95426, 176545, 58391, -417133, -209714, -186651, 125496, 507481, -319029, 98788, -478246, 310046, -408884, -488865, -321212, 18000, -517502, -108333, -253197, 65948, -457602, -262853, 195717, 452760, 754, 193188, 147930, -267751, 53520, -353828, -514801, 405683, 367634, 238523, 137673, 480680, 306169, 19946, 264302, -364739, 274647, -219838, 87300, -78338, 30123, -205616, 354947, 39008, -228766, -474139, 490386, 216319, 304803, -444039, -353066, -427106, -194754, -279230, -436047, 45242, 289045, 260534, 318565, 216026, 490097, 506832, 106067, -252215, 292669, 352308, 410271, 395861, -467035, -448862, 97127, -80681, -492161, -237119, -191015, -483897, 291518, -26061, -116753, 430541, 350743, -300995, 490774, 386635, 79524, 406554, -477304, 339042, 276831, -145055, -140598, 435693, -486699, -163244, -384458, 403036, 286888, -458039, 278769, 329600, 214562, -224084, -516815, -218790, -79890, -50514, -488268, 98122, 80006, -2096, 425986, 82970, 466112, 19233, -492086, 115328, 478423, 513583, 498708, -511657, 481396, 346781, 259992, -512578, -232873, -247360, 248681, 118597, -189431, -40807, 329974, 328292, 266631, -437450, -461510, 498810, 329582, 173296, -424042, -13663, -73983, -162922, 78657, -123816, 433541, 432944, -122373, -218360, 204155, 254051, -122901, -24146, -158334, -38704, 303321, 274219, -249728, 384518, 313251, 375341, 28313, -44361, 226815, 11901, -441571, -85484, 160001, -262988, 219347, 156350, -419469, -170073, 192826, 200172, 236118, -150884, -400509, 258700, 436835, -465531, 152043, 285631, 118500, -332800, 253162, -457016, 7618, -231864, -335686, 51577, 233372, 50339, -83374, -481588, -405554, -308049, -519838, -167917, -109615, 182412, -86263, -212769, 512848, 218265, 420521, 365517, -469511, -328124, -499882, -94377, -227467, -250410, -6497, -338143, -29397, -121119, -85831, -188885, 12641, -300340, 132219, 372670, 432654, -172022, 311484, 96414], -[-60319, -322628, 244143, 88800, 325104, 470017, 444605, 252403, -115746, 282723, 235122, -343246, -92518, 143168, 192773, 252775, -261929, -311817, 414543, 414840, -185910, 468909, 314405, -173267, -476753, -516971, -426008, -439217, -256464, 408095, -31486, -21097, -128010, 411693, 11513, -414107, 345989, 251149, -376884, -346620, -493579, -371938, -97939, -371247, -219428, 140110, -452635, -461907, -245053, 312129, 159651, -134285, -386350, -58627, -188085, 411292, 159851, 134681, 351863, -88205, -252835, -456231, -385354, -504454, 353416, -184371, 105692, -233133, 496326, -138466, 505295, 265554, 264458, 220843, 310047, -26642, 440543, 299996, 294636, 287800, 204882, -97700, -406007, -308188, -500833, 197092, -165022, -176218, 189668, 392743, 306667, -503715, 430863, 476193, -123311, 139671, 314282, -416757, 41123, -201892, 27643, -164749, -1729, 91950, 99632, 128895, 302316, 386081, -295238, 55239, 125843, 488820, -112697, 167753, 334058, -274279, -207692, 342034, -490483, -181283, -411613, -317635, -346302, 493852, -422832, 426819, -49994, 332869, -347893, -397206, -160032, 481777, 42523, 65866, 446608, 157417, 70672, -280000, -18528, -423774, 441649, 333097, 460326, -108577, -136182, -510107, 513439, -192464, -97107, -426912, 6453, 511781, -457217, -168242, -276502, -444705, 306764, 264470, 18520, 392349, 298560, 311206, -183277, 453644, 190671, -352298, 119385, 17282, -456379, -22938, 86886, -74926, -210828, -281892, -76389, -227308, -184900, -321289, -369065, 444663, -162633, -93036, -475953, -334307, -8446, 159553, -57731, -223410, 409950, 268983, -31188, 136270, 447162, -265872, -196535, 78833, 331504, 274619, -106034, -44536, -170361, 28522, 117110, -254983, -374175, 361245, -134077, -461242, 475359, -511265, 304130, 8239, 405116, -265916, 70468, -32002, -250240, 231021, 448921, -503302, -503391, 150762, 400275, -272000, 320203, 257538, 299777, 367835, 279327, -405390, -241430, 209309, 380055, 103929, 35407, -324207, -222413, -101090, 421374, 107332, 57376, 114032, -110602, -101552, -273801, 258074, 183293, -425445, 117968, -400731, -481692, 259927, 413426, 10972, -375794, 192771], -[-251323, -173407, 262818, 490021, 353450, -403824, -70728, 16618, -46471, 87760, 435044, -106625, 465687, -285867, 289932, 508791, -94436, 409773, 344740, -301668, 287007, 274580, -12835, 96386, -155817, 425937, -227947, -73762, 456347, 52127, -484100, 296771, -140383, -251962, 320044, -507969, -374063, 460270, 135905, 490858, 357169, -207093, -89954, -295923, -504775, 238893, -382138, 273529, -459820, -426796, -475655, -338229, 456907, -207730, 223499, -219366, -211169, -332854, -261422, -403709, -289347, -57982, 169753, 378025, -345029, 226927, -95063, -248541, -333008, -247933, 328856, 229656, 187829, 285638, 394759, 307255, 239438, 442893, 91639, 94380, 142929, 317967, -105755, -265882, -214883, 396342, -194393, -352494, 309297, -196251, 34203, -113386, -206584, -121184, 217628, -167218, 158258, -329598, 191676, 204704, 345849, 144262, 507076, -319992, -407223, 363553, 270053, -521919, -386248, 218349, 121834, -437159, -210077, 453338, 77653, -200832, 134310, 283029, 327936, 399143, -369057, -501592, -224380, -221425, 184793, -519221, 373378, -413780, -461519, 423823, 242128, -216865, -349388, 298941, -137780, 433388, -436481, 169694, -228715, 113617, 429848, -166718, -322933, 286709, 517802, -44279, -368486, 93773, 95192, 156100, -141518, -497244, -452826, 45908, -334908, -506360, 391083, -13480, -254817, 416717, -171566, 30311, 77241, 274866, 331645, -402978, 37484, 75985, 72876, -314526, -486875, 118477, -442694, 252527, -500199, 472997, 222930, -323499, 459403, 92028, -299059, -511191, 7923, 391423, -365617, 401407, -288810, 31405, 248835, 343531, -121322, 406538, -402305, -294601, -261492, 272256, 332274, 457544, -489912, 14580, 38734, 383916, 385530, 448583, 449469, -287060, -256361, 347522, 219552, 417964, 70417, 490688, 42826, -70372, 24223, -513103, -464486, -188617, -439350, 28110, -452811, 190751, 199264, 425645, 90034, 361696, 380149, 299858, 271540, -191139, -130935, -374077, -356409, 473964, -503017, -332502, -434631, 47592, -174361, 294982, -205799, 89543, -422987, -411196, -503200, 141217, 100147, -58463, -330614, 351777, 303431, 279544, -306799, -286000, -454350, 93746], -[173743, 304586, -456700, -174088, -103283, 387773, -202535, 269632, -396257, 484704, -378778, -357578, 229522, 431074, 236978, -3679, 81795, 36368, 153372, -357002, -79632, -307973, -23413, -515058, 488302, -214971, -329633, -244908, -35376, 469420, 203356, -261527, 194730, -370751, 48957, -78349, -242159, -80882, -397121, -302929, 234415, 379689, -453653, 483319, 408179, 18515, 62097, 30256, 496309, 265831, 49554, 463186, -523435, -284294, -210731, -11500, 282856, 481670, 17280, 140399, 311173, 367067, 225483, -367296, 451798, 367170, 399964, 120856, -108171, 185545, -328562, 318612, -36450, -148396, -334066, 523530, -417117, 2305, -348123, -125646, 76151, 508362, 305477, 438168, 502164, 308897, 434974, -211366, -20665, -40769, -175211, 310134, -54006, 438291, -145577, -413962, 502736, -16399, -437316, 368990, 278216, 89886, -248088, -364562, -294676, -302845, 402744, -445772, -511944, 333471, -269306, -302392, -196713, -239584, -301253, 136627, -461748, -101148, -18513, -324883, -397108, 378685, -499322, -127439, 7135, 256679, -465606, 348424, -460230, -378263, 509262, 495992, 144112, 389704, 379588, -296125, 25557, 235475, -237557, 226514, -382770, 211348, -20889, 356856, 76004, 522344, 258596, 260897, 98160, 26446, 370967, 132984, 489694, 198857, -13733, -3777, 121906, 439072, -414280, 422140, 261309, -292109, -239214, 268493, -313520, -259213, -147986, 291549, -380809, -73100, 485915, 375696, 278515, -207020, 146981, 398458, 389021, 65888, -397684, -496249, 302856, 336905, 454409, 38808, -265368, -252772, 132781, 428246, -505976, -288153, 161396, 508077, 292324, 11415, 36751, 204843, -457310, 61973, 145876, -225012, -324823, 460700, 35073, -367267, -271474, 206776, -70421, 495101, 290504, 143044, -30761, -371574, 3962, -507273, -246073, 210413, 187313, -176487, -50596, 291601, -280600, -485618, 407028, -208853, -256462, 443370, -180365, -493668, 167337, -174359, -325862, 503033, 442725, -2920, -438869, -502308, 117096, -46232, -433660, 157735, -227664, 72114, 347515, -384225, -53281, 460832, 264662, 33098, 26582, -391956, -497441, 122566, -297323, 118201, -521594, 422261]] -h: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], -[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] - -Proper number of hints provided. Provided: 46, expected: <=75 -||z||: 524075, ||z|| check passed -aHat: [[[6280731, 6739178, 1147796, 1070275, 2318684, 8332619, 369570, 1541265, 252050, 1572241, 7588397, 5443222, 7402198, 4049585, 2006554, 1498712, 8038694, 6002385, 6437014, 1552956, 595143, 931734, 816621, 3217424, 4044351, 3618795, 6599232, 6896932, 2083659, 1659028, 1262265, 7507458, 7675420, 434998, 6607470, 5575522, 2400889, 2730184, 8326754, 5525230, 5235746, 7779704, 749859, 7097752, 1937920, 3391441, 5941586, 6463690, 5428352, 6198831, 3090339, 278211, 3374725, 4257852, 7844464, 3419492, 7551627, 6083042, 5034903, 3160, 4577274, 3131542, 3034352, 7688245, 2991971, 3985474, 2672551, 2089580, 6992066, 3194074, 1998734, 1407270, 5942949, 3013678, 1596853, 1413765, 600890, 7466466, 5297315, 1932678, 651008, 5861578, 7407516, 5912615, 5367487, 2634045, 4315958, 3938521, 244716, 2273963, 8079820, 5341809, 6090711, 5228215, 1011427, 3299247, 7116577, 294374, 4074242, 4660818, 2607199, 6198431, 5916523, 5433191, 196273, 4318190, 5480767, 4619094, 3262223, 8190474, 6615132, 3198853, 3611727, 5907696, 4852227, 3414154, 2233121, 5866172, 2082338, 4767901, 731574, 2221999, 161939, 1186007, 5166042, 5865429, 8153579, 3932836, 2158462, 4205928, 1231221, 1302194, 4488613, 4139700, 3129980, 7451095, 3274107, 960945, 2769158, 1238142, 5636500, 1021077, 1291908, 3003308, 4244937, 6203226, 3389472, 4815508, 772312, 1113040, 4332147, 985311, 7566764, 2439545, 7941797, 6979091, 6256269, 7561130, 6021529, 3746076, 2192559, 219883, 2758409, 3326660, 4524781, 1746724, 7897868, 7510548, 2624256, 3404175, 102052, 4576400, 6498163, 143615, 2787695, 5835460, 759025, 1526712, 897465, 6008965, 7500786, 5287321, 7430364, 5781555, 4452568, 2317844, 7170911, 3124300, 3651318, 1499591, 7338407, 4048259, 81619, 2709957, 2064961, 2357869, 2854349, 2754839, 5813517, 7202624, 6213307, 7084194, 4703155, 6318247, 1927224, 2665178, 6381990, 7916962, 1501229, 679226, 5568947, 4751975, 5143972, 6249259, 4688093, 1463452, 1562804, 7923687, 6513949, 5485162, 8242725, 1388102, 5200849, 1620703, 7899432, 4375901, 6314621, 210581, 886021, 2399785, 6839765, 7217273, 8214070, 6432190, 1097681, 4463688, 4981226, 7950086, 2383576, 5127117, 2080303, 6394615, 3373883, 3314611, 2145532, 3474673, 5366669, 2103489, 6295818, 424747, 3465410, 1263184, 7811788, 2165577, 4771092, 5799399], -[3513950, 7886931, 2583784, 2934523, 7407054, 2649787, 314197, 2515218, 3532081, 4066319, 6686305, 5891566, 5963499, 139438, 7455907, 3949103, 1828671, 4337405, 7066663, 7043340, 4818884, 6034821, 5173665, 2186779, 2350974, 594438, 6195380, 8241088, 807406, 5843013, 8192760, 2845268, 1073211, 735641, 3979851, 5486481, 4578786, 6997516, 2084655, 6871391, 5237102, 3790032, 2186638, 6294104, 3246391, 1496716, 5847415, 2000372, 409964, 2059709, 471482, 2087474, 1987355, 1990371, 5923450, 2103662, 4603503, 4394075, 3187714, 1775971, 3076945, 245259, 2720069, 3561945, 8373226, 3830548, 4319488, 1849242, 1745672, 1087211, 4109887, 2791981, 1773272, 1525046, 7947705, 6201278, 3228305, 1545049, 1332479, 2144938, 644389, 2563663, 8006624, 1037931, 8142744, 737191, 7501529, 915249, 838643, 5867698, 2042908, 395960, 4066102, 5415545, 2729821, 4546112, 7891620, 5028591, 6622194, 1837295, 6287784, 1324106, 866961, 1979925, 6381017, 5214627, 7525442, 898366, 1733121, 4692528, 4355628, 1532039, 6093390, 6044858, 1764302, 904866, 711095, 345567, 5395855, 4664554, 2280668, 2303090, 3188584, 2593957, 968210, 616222, 7976615, 7194377, 8090477, 6906209, 8127633, 1134633, 8189847, 1960320, 6865240, 7853224, 1743830, 2366492, 8047435, 3171930, 6642750, 7523211, 5209695, 4582882, 5262419, 6222357, 6562848, 5545946, 4632594, 4878424, 3001136, 7600978, 4421646, 5233757, 2619150, 7295442, 4269427, 7628778, 5900659, 3095391, 4313103, 4289081, 2534015, 4508639, 3873314, 4223049, 8362964, 4358368, 4526961, 2738927, 4976774, 8287777, 3955855, 7884531, 7344120, 2350511, 1369943, 3245056, 601466, 8294724, 4368635, 6956037, 7996428, 6878504, 1076730, 7957356, 4264938, 2699594, 1040583, 6250550, 5272496, 800812, 3271409, 1963117, 3394363, 6359215, 725398, 4014821, 8139106, 6852668, 4802563, 2061878, 5300048, 7684291, 3150725, 3725430, 5547036, 6576304, 7453731, 3300635, 939782, 878573, 8219073, 1536899, 4860139, 6022749, 7686552, 4470367, 4735269, 326834, 1597920, 6768475, 4009653, 5188054, 7860124, 2362287, 1834544, 5698832, 3633538, 7890570, 6950925, 1459665, 3847838, 1277725, 2617584, 3872883, 4689947, 3792789, 7020465, 671274, 3860998, 1208957, 4737965, 4887544, 952593, 6948709, 2219462, 205518, 5812603, 3665338, 3239935, 390532, 1078943, 5294829, 3992367, 2382919], -[455776, 6057809, 3723508, 3042149, 3358531, 4779026, 6010920, 6575380, 1259053, 3523529, 7636547, 2720618, 5620207, 3257490, 2344424, 3810490, 5135070, 1493103, 7705221, 7421244, 141224, 1430215, 4641631, 5729368, 3345767, 7550147, 6338433, 6091081, 2903491, 7050077, 8305638, 7674967, 5045586, 5137001, 5165125, 3943371, 1287988, 5230690, 3558787, 2100012, 6754799, 2590571, 5302927, 2213508, 3813517, 6946998, 4998019, 4891567, 4788820, 7739302, 4323517, 1032960, 5429410, 2404107, 8080564, 7693428, 3161623, 2993427, 8254404, 1674609, 1703895, 7883925, 8193319, 1013557, 963636, 3056808, 5436634, 3824563, 1306876, 5917884, 2929560, 1745078, 2550205, 3544384, 4799655, 6217993, 7601962, 6985419, 3148204, 2104793, 3595964, 6467088, 1339322, 1568373, 2659222, 5514911, 5185961, 6078411, 2424652, 4723584, 1522088, 2811067, 39533, 472766, 2111933, 6202498, 5828756, 6339979, 4388060, 280194, 2787811, 4349103, 7429301, 4972442, 7895049, 7082973, 3823365, 1500772, 4126412, 6185056, 7918439, 932736, 3779770, 8212195, 5709950, 3706459, 3422268, 5088147, 2060752, 4660758, 6486427, 7328973, 920468, 8252681, 2861073, 1919256, 7513213, 800452, 8159178, 1837068, 2949311, 3271242, 8093123, 7483480, 2584723, 7199937, 1062639, 6768699, 8303079, 1274340, 7652902, 1646222, 815021, 120160, 1906918, 5979565, 4893995, 7396692, 237168, 3921541, 3952673, 1495973, 7377483, 5045369, 6566836, 323787, 2771699, 5984516, 7663675, 1860457, 6955367, 2535610, 3995464, 2303442, 6578213, 3794266, 1033825, 1293170, 7631788, 6402194, 299809, 2425489, 2713955, 3264066, 201713, 558303, 2213831, 4725675, 1516523, 7468593, 3095528, 4995154, 7508362, 4203250, 8369665, 8020792, 6924203, 2753033, 3386152, 1042065, 6005230, 5663289, 8212076, 6124672, 4756444, 1088514, 8147228, 6256015, 1871704, 4425974, 4938245, 5899705, 8054910, 4170126, 455273, 3886845, 4560751, 5344568, 871903, 2331493, 6047983, 1114413, 2169122, 2992397, 8077209, 802686, 7370380, 6193414, 1179713, 2461540, 7391613, 3978066, 4020663, 5445077, 2587024, 5049934, 4966534, 1848315, 1481061, 6364773, 6106895, 7650490, 8230294, 1166089, 6635410, 212467, 1366857, 444766, 8303513, 6503909, 2884754, 5441167, 2604410, 5613682, 1795725, 2764550, 4170371, 867886, 6768480, 7568319, 8206074, 6997746, 5735711, 7740739, 3618124, 1059614], -[1915102, 7204631, 518239, 8247096, 6543809, 4642834, 6904527, 6747313, 4588033, 6681363, 5379676, 6424469, 6532687, 4959092, 4410044, 6637917, 3371321, 6879346, 1328883, 3561235, 2518489, 3939169, 7682181, 3245144, 258492, 2669587, 4386448, 2875753, 5065071, 5310716, 7117817, 1601285, 116039, 3480991, 6614750, 4240888, 4660876, 1840215, 3546146, 3420187, 5155302, 6236830, 7635453, 4577972, 6442593, 2620922, 826138, 2652767, 3709864, 7878013, 1028220, 5816009, 1149118, 6050548, 3401190, 3801816, 5296634, 6002828, 6688321, 4058003, 7392635, 4524012, 4145243, 4195705, 6556757, 2917359, 4185746, 3317276, 3217756, 4796884, 3904401, 7988501, 5947902, 2511120, 4872472, 6773587, 5874761, 1177852, 880596, 6517628, 6543265, 4412238, 3850439, 8083528, 3033865, 1470521, 4840919, 7373934, 6549616, 2066311, 5166382, 7666366, 7703522, 4092340, 2582513, 2021715, 4012931, 1385862, 109669, 647920, 2156904, 2674553, 5461853, 188440, 1221743, 3528253, 1401688, 2424631, 7148308, 4309444, 5843836, 5926348, 1402364, 2898234, 5028022, 7899653, 5102060, 932142, 4077661, 3838324, 4723411, 68838, 7040767, 8058883, 8367079, 4550088, 7677784, 3013363, 1367115, 1535400, 2297477, 971908, 1924328, 8095631, 6576206, 4040159, 1355390, 4535002, 5218062, 2871807, 6314543, 494594, 8099559, 2295935, 2263183, 1968633, 664683, 4942638, 2842860, 5816325, 5891391, 7956930, 169844, 8263258, 225123, 1799831, 7506791, 178208, 4991265, 1114900, 8128705, 6339094, 1952843, 3230172, 7775735, 5503163, 4643362, 6492857, 3435042, 2866187, 3651406, 1962590, 2745983, 6096415, 306452, 1783430, 817918, 4204707, 7202967, 4926793, 686116, 4258615, 5242968, 789921, 7312880, 2228666, 526216, 3687032, 7142924, 1301683, 7492884, 2603622, 4163712, 3212073, 8021128, 4240365, 1131204, 1107016, 1583998, 5594656, 5423442, 5341490, 349785, 919519, 7512201, 6642775, 551816, 6361354, 6433803, 4173903, 4411641, 4826904, 7700716, 1175705, 4207430, 6650210, 2705542, 5102267, 904497, 175840, 8109293, 4702746, 4646844, 3109671, 5849785, 6536224, 2917818, 8064535, 4226251, 7128330, 4930342, 7469330, 1687198, 3933768, 6160217, 3040179, 14175, 7455009, 1098722, 680009, 245120, 1642883, 3829677, 112119, 2294604, 6254052, 3192069, 3224704, 6118592, 7878203, 3761539, 7963279, 141294, 3501050, 843884, 5575061], -[7826136, 7012328, 3927775, 2718959, 1776601, 7317192, 6996735, 149932, 1663366, 2332323, 6474879, 474046, 6503782, 316866, 4106761, 6046909, 2976698, 3804013, 5610415, 3640207, 7784316, 6553121, 2605950, 247124, 6302893, 4995563, 2302229, 4350978, 649619, 6433203, 2573781, 3206431, 8366386, 2628378, 7298554, 4450846, 3666790, 7992801, 2499017, 7375497, 1525838, 7997069, 1227857, 5123950, 6369366, 8266762, 8123062, 1402234, 4090518, 3224828, 1024361, 926572, 3863456, 6905463, 7001193, 4153821, 459083, 891252, 8218223, 1115612, 2207693, 8085980, 2866748, 430824, 4287153, 2802551, 7900929, 4716533, 2415042, 4987167, 7719079, 2047431, 861671, 1964040, 7170496, 7292865, 5094174, 343595, 6984986, 4633992, 4675797, 1218588, 66785, 6985058, 4392287, 466864, 8058686, 7997724, 1307799, 7721194, 6326600, 7095826, 6350227, 5147686, 6031395, 1642719, 7738377, 7598657, 7558807, 766766, 7667507, 5541433, 1491080, 6062448, 6183075, 7200159, 2274979, 902760, 2949546, 2250640, 6821937, 3104574, 4598030, 5767340, 1850047, 220957, 3822214, 4931762, 3151268, 5117409, 6460907, 4348913, 2834162, 8347726, 8099817, 711853, 7533142, 1384342, 8352020, 1466406, 1800862, 1899522, 8300036, 7479342, 6974912, 5423321, 2921809, 6917531, 7633600, 3510858, 5402325, 6120771, 3048614, 2955702, 3508548, 5090489, 3389260, 8169581, 3763090, 2922847, 3568078, 1326144, 3319068, 300518, 8335062, 2421776, 2842463, 4894258, 5595032, 4726815, 6513316, 4385333, 117246, 3569372, 3328974, 3340898, 2847369, 2271569, 4981560, 6480193, 5308871, 3596978, 8176985, 1279865, 2642689, 1957347, 2689138, 6487054, 3409256, 2523759, 2768419, 5002872, 6275948, 3529826, 2966821, 4527692, 2925119, 8357939, 2933022, 756868, 1578522, 2173622, 7979163, 4193895, 1858010, 6700278, 5965824, 6077935, 1671019, 4802, 1808944, 4502039, 1991811, 2853147, 4773535, 4359939, 6958043, 3826321, 963083, 4504741, 775053, 1084161, 4063396, 4187179, 5591422, 985325, 2844935, 51151, 4518170, 252250, 2232443, 2311072, 5081437, 799809, 4554902, 7726922, 378984, 8215778, 5168450, 4058721, 563510, 8228041, 6389229, 529215, 8350003, 1009528, 7256744, 1968066, 5628255, 6292858, 6554487, 7036165, 6480303, 7183891, 6539388, 6651315, 3566107, 1654989, 7125843, 8046154, 7064687, 8280083, 4420247, 7728504, 745904, 4630215], -[7919036, 2725142, 2480486, 454626, 1996021, 6200582, 5395444, 6287611, 3369232, 7592586, 1098739, 4310018, 2106178, 542292, 3677742, 616107, 128340, 2535615, 8326631, 1929063, 6449807, 6838800, 4521177, 5439350, 4276052, 7675885, 8155538, 3890783, 5169929, 7086859, 7682003, 4023565, 319644, 3846355, 7424202, 2799172, 1108697, 4764723, 7029828, 1310973, 1711866, 4703384, 6117551, 7189400, 2299206, 2870494, 4649513, 1925999, 7685823, 7025661, 1657504, 3147332, 528435, 7083591, 6845642, 4035667, 7816860, 1876407, 3923715, 8210682, 1604240, 1960858, 580038, 1323672, 4762871, 1790314, 5701129, 5877064, 7321528, 1109582, 2824182, 7003485, 269515, 721686, 2107910, 5218888, 5434569, 285706, 527987, 774847, 7893807, 2839886, 6162359, 891485, 2541179, 5340160, 7073992, 3891726, 3314077, 7800624, 175327, 1156896, 3989067, 8220553, 5997619, 2378056, 2190673, 4978284, 5997007, 5857673, 2043797, 8376464, 1272937, 5090733, 277952, 5619108, 5028550, 7800003, 2940031, 7364383, 6490369, 463794, 5940856, 4656127, 111764, 1189647, 3241718, 6083306, 1933363, 6653437, 6505117, 6438398, 4321033, 2628116, 635711, 1652935, 3992070, 4305815, 7388302, 2491021, 1945483, 1538687, 6410646, 8077916, 1619033, 5639514, 5430090, 3820222, 5313405, 3216769, 5771381, 522731, 4057043, 7655872, 243411, 2236847, 6173770, 1007579, 8175485, 6026180, 2171199, 796841, 7996562, 2100022, 2807651, 1103135, 7816934, 1247312, 155662, 3979717, 1142376, 7012991, 1349089, 5837712, 7635456, 434378, 837937, 5735577, 3450109, 720214, 7057737, 7609086, 6036235, 6082608, 5427480, 7944508, 6674465, 3050030, 8003835, 8165253, 4975137, 3670203, 2522390, 4235529, 8329391, 3831180, 587018, 2127482, 2617413, 47337, 189020, 5139565, 5457876, 3992001, 4255661, 3021656, 1038418, 3063478, 2893568, 2554388, 613480, 2081311, 471778, 5549395, 7693117, 7561715, 6908389, 2951698, 4542644, 1733462, 357549, 2021297, 3965622, 3718549, 4121861, 3702277, 1604591, 3042425, 6998966, 3321032, 3615801, 7560144, 5193757, 6396850, 992287, 7504429, 662415, 3496178, 5605242, 6153308, 4571130, 4526410, 6677376, 2255033, 5293606, 1071966, 1233557, 7932766, 5340055, 5947470, 6334732, 7865220, 7670806, 6719529, 1372177, 2786022, 1782169, 6143672, 1638700, 7575411, 5856160, 8287578, 3998256, 170171, 7543216, 6354969], -[664685, 7817131, 2261666, 5070694, 5212316, 65997, 6893508, 5533424, 4105224, 3841943, 4110784, 5814690, 7507392, 2938044, 8051297, 7816928, 925309, 4324496, 8155207, 6552242, 625780, 2628698, 434412, 6026688, 2588877, 4470814, 2208957, 7423381, 104879, 4736379, 4302849, 4974224, 6016789, 3252122, 7087571, 312073, 278013, 5743860, 6103696, 5172983, 6397371, 5702596, 3469235, 1995158, 4165061, 7264120, 2138647, 551024, 1081619, 5794581, 3023873, 1179944, 7512523, 7446049, 7948160, 3242128, 4094225, 6244153, 4847283, 832275, 2002965, 3505863, 2696628, 7102077, 113094, 6274630, 6359100, 4599242, 5736841, 4882819, 4537170, 207912, 2103616, 3213657, 3568538, 6084950, 7628491, 6771399, 6119076, 2920940, 5535493, 5509577, 4240784, 4362409, 2957781, 5338254, 7271795, 6447914, 5699551, 384220, 3468515, 4970389, 6383773, 6322374, 1462825, 6759749, 7160375, 4929309, 2285760, 224552, 1432886, 345544, 610540, 6779064, 4369322, 4834664, 3909086, 5333403, 6562315, 6248400, 4726420, 7449265, 2026986, 2224413, 1832321, 359164, 2609732, 508661, 2603729, 6517669, 4605043, 952212, 4760670, 3658407, 5459127, 6433496, 7126491, 6375591, 7632658, 8280819, 1137918, 3159853, 4900133, 6592235, 4424188, 3042589, 8004486, 2948651, 1089412, 6095336, 866471, 6093608, 7266831, 6358342, 4930021, 1188435, 2490955, 6656976, 3764198, 7496285, 7729861, 4070032, 3771291, 8352475, 7998883, 3980322, 2179778, 4635384, 5289060, 915983, 6909527, 6533186, 1288321, 1387066, 5715561, 2524521, 7891499, 5117686, 6946754, 7561893, 2285392, 4111081, 8096379, 7700627, 7391771, 2908452, 930350, 1044405, 1091540, 4720104, 7026078, 4935934, 4148249, 3509717, 3054330, 44616, 8131690, 5538941, 6451863, 7390340, 8215567, 323518, 4011830, 7030758, 467018, 2097600, 5665187, 1819482, 6973947, 1746158, 3110647, 7909297, 2334720, 1453339, 4444825, 2430367, 4146147, 287599, 7032690, 8269065, 4706016, 3663350, 3568734, 4895657, 5266428, 7010484, 3925683, 3564348, 5989859, 8207941, 6720104, 2555575, 924067, 660360, 5384975, 2075071, 6128688, 3771966, 816378, 3641219, 2533842, 1051177, 1908730, 7182955, 1884510, 3543431, 6966528, 1579714, 1531104, 6091577, 7369834, 946580, 6798238, 1490220, 6719369, 6318214, 7408054, 1571040, 5716645, 4732327, 8259992, 7256596, 822268, 2510757, 2645605, 655776]], -[[7731085, 492799, 6581182, 4578159, 6749254, 269089, 4033112, 7306361, 3169322, 6292337, 1513926, 1921998, 4495534, 3256221, 7731716, 1835920, 3048458, 5066241, 3817379, 4638599, 1345232, 2866585, 3056546, 2498938, 8122983, 3017199, 3704102, 2238229, 1733462, 218824, 789955, 4666510, 2547847, 3633301, 1333042, 4437013, 3959974, 5336280, 4278381, 739923, 4698970, 850049, 8088549, 2372897, 179891, 5566246, 2979491, 1065690, 5655584, 6892567, 2911558, 6244494, 5528913, 6332506, 2157098, 2590706, 5502878, 8347257, 6657460, 2575144, 1833123, 1934710, 6878769, 6242880, 6795485, 873966, 2745862, 6438182, 5276805, 8225888, 7797093, 1416802, 1710001, 4652861, 6323532, 5784929, 1868191, 4762951, 6549777, 1965739, 2976535, 4606047, 2332783, 3571999, 6267623, 3392944, 7726546, 1937741, 5009197, 155831, 6603492, 1575556, 9821, 4285053, 471044, 4936970, 133873, 1834064, 1993787, 644232, 3610198, 964635, 2281670, 6411830, 1272902, 7802843, 538751, 1446119, 2806597, 904952, 2270623, 5435772, 5420090, 5940607, 1999960, 2299166, 572634, 2299578, 1590895, 5757133, 2436409, 870560, 6531621, 4756505, 480336, 3448642, 404729, 1912150, 7706313, 48446, 1484808, 6708430, 6566235, 3700424, 3058464, 378193, 7318144, 1960021, 1186949, 7342665, 5976505, 2864671, 4244099, 3458202, 6708742, 2644474, 228322, 2131953, 7484770, 3771970, 5062071, 2132898, 4582300, 5972184, 7367291, 7062911, 3531173, 6077606, 5440153, 1436016, 4499979, 7709548, 5304298, 8245472, 4824616, 2844928, 812246, 710909, 3576965, 801273, 4674245, 759730, 7306808, 1862564, 1629008, 2520146, 3821669, 2184055, 2123830, 8074468, 5787611, 1440519, 8317792, 2096063, 1166448, 5686651, 3952315, 2637258, 42830, 4207538, 37773, 7081610, 2059818, 5192458, 135868, 5466353, 3863721, 2770679, 4925264, 8042640, 2411435, 3178118, 614635, 6532633, 3542984, 4037620, 8214685, 6310478, 7235459, 6134464, 1694134, 3660573, 3568925, 1473294, 142113, 1178198, 929009, 701075, 6304086, 4126523, 2360288, 1637634, 3991574, 7778761, 7632398, 4453433, 437400, 529188, 3833863, 3028554, 8297452, 1495997, 4562293, 2833396, 5299248, 3101828, 6347313, 352398, 1218651, 8253240, 5229810, 6965863, 5721595, 3985714, 6316532, 4725043, 4202295, 3174630, 667333, 565748, 6356928, 991967, 2561875, 2651371, 1155534, 5853536], -[7082314, 1395431, 4202401, 1595317, 8320514, 7083132, 4991996, 1585634, 920551, 1199507, 7966839, 944839, 2979983, 8336617, 5825381, 4084279, 2640364, 1278658, 5200252, 3321266, 894658, 7296765, 1074305, 2355198, 367238, 6483468, 6348770, 6323288, 7826766, 1429103, 2693683, 814067, 3474598, 136021, 7002205, 6958516, 6310564, 2253532, 3121217, 73857, 4008765, 5375582, 6612704, 4563423, 1190396, 4344991, 8214078, 4298487, 843838, 6028933, 3682911, 4209658, 3350493, 7526861, 7845009, 2566830, 2865234, 2604204, 5514762, 2525966, 1831095, 8013464, 5204939, 6859440, 3615773, 3366860, 2750908, 1226284, 7456726, 1695186, 5230540, 2787985, 1809998, 3387219, 3714028, 4408404, 6410962, 2878977, 515484, 6263512, 1651623, 878090, 4141215, 24800, 4932846, 659091, 536285, 8102784, 4020011, 1453464, 4848184, 4526000, 5954127, 4100713, 1620801, 5045662, 2469182, 3736537, 6822280, 4379960, 8070186, 1877811, 7164831, 6092783, 2805337, 4465534, 2877760, 6245734, 6292417, 3562885, 3389242, 7469307, 2684631, 3980128, 5696463, 8189926, 4995987, 5257658, 4826258, 6502305, 4962669, 4819966, 787317, 7135964, 4973123, 5123013, 4635906, 5009890, 6737981, 706032, 7488180, 4518910, 2580548, 5419292, 4181654, 1034904, 5404974, 5512238, 4425026, 4529519, 3099834, 3540354, 6967428, 3602146, 1507982, 7224532, 3268211, 5851523, 7443987, 7328808, 4912488, 102478, 7243910, 4420344, 1238248, 2675918, 817613, 794866, 1094634, 3358087, 6671304, 5534520, 4014255, 8050457, 294256, 1998875, 4099387, 2681096, 2101618, 40495, 2767805, 3383728, 1099474, 5003767, 1727708, 3109506, 4205989, 855836, 7664738, 1573675, 4408171, 3984292, 5638528, 1692122, 1014166, 6359926, 1787427, 167432, 2070835, 5480347, 3922586, 7709072, 5125299, 6163140, 7883284, 3305011, 1125039, 5952059, 6415, 4856086, 2022407, 6388227, 3835416, 7076154, 1651842, 6713286, 4287880, 3504734, 6074949, 1900974, 3505909, 7630458, 7783519, 6810028, 5581684, 6326010, 8052138, 3022923, 8049592, 7385314, 2765338, 7683092, 2560566, 2205482, 1237053, 7617287, 1865208, 4948678, 2157502, 5471062, 4914550, 3244557, 7021120, 1398684, 920329, 2873919, 2862285, 7848280, 250384, 8044696, 384807, 7991318, 5698568, 5578249, 2093223, 1548844, 1183358, 2183221, 4643666, 7800717, 402289, 5133528, 5571070, 1941324, 7353813, 4336980], -[3092337, 1202480, 4091546, 5403966, 8046764, 4619737, 3070309, 3138851, 3079890, 7178169, 1662558, 453023, 197152, 4320618, 6507114, 4654099, 5445090, 7579405, 6080135, 7841632, 1984864, 7202654, 1825315, 8356618, 2124338, 1485263, 1628609, 6747852, 6547628, 7434932, 6864120, 3885755, 222618, 4594139, 7035343, 5440663, 3974746, 508997, 7616092, 7818682, 1388711, 3883446, 4811960, 1667025, 4869720, 6994549, 2722376, 701454, 7220758, 1665115, 5664786, 4042623, 45351, 7676002, 8246133, 6365711, 4518697, 849889, 1095810, 7361954, 1729391, 1132323, 3588350, 5767406, 6465256, 857424, 1322368, 1055872, 4390734, 3454720, 2271844, 3504401, 1927920, 7319862, 1138169, 1812301, 1948101, 564884, 2455345, 7246659, 3235902, 5549945, 6503383, 2278752, 4583985, 7256418, 8050098, 6683542, 895784, 4855950, 1362976, 2269494, 4910792, 4142227, 2390894, 8015674, 1829559, 5149393, 439777, 6764069, 4170954, 1270246, 8048941, 6260661, 713357, 456554, 7896475, 3098558, 5380293, 4222779, 663239, 476953, 1265064, 5542380, 7118751, 2157825, 1113386, 2070679, 2774250, 2206513, 6845279, 7543105, 7078036, 4331414, 1342902, 715204, 6519894, 3862988, 2076822, 4863428, 2935, 204830, 113191, 2994430, 3475634, 3608172, 2703533, 7131946, 7797478, 2129250, 6492139, 266102, 5324666, 389212, 1093628, 2766361, 21454, 1484271, 758550, 1621234, 5081983, 337492, 1572426, 2091654, 4121915, 7443401, 6683472, 132919, 7489748, 6914965, 2037944, 3296045, 1826449, 5670086, 2169141, 5220192, 1034658, 1521552, 4789416, 4217338, 1064271, 4762297, 532736, 3917321, 6119616, 7913005, 1204315, 5544157, 3853055, 193021, 5025144, 5210102, 1256730, 7724581, 5026270, 4338438, 6740524, 1804049, 489750, 3953080, 4625799, 7630764, 2631620, 7083357, 7958185, 3027420, 6516195, 7787010, 6571757, 6882862, 6660214, 3835637, 3534664, 3944920, 1379264, 3432924, 5101240, 6280962, 1582541, 3054926, 3322246, 5404220, 6560476, 5562481, 5225793, 2499290, 230107, 862178, 6037909, 2834454, 4870182, 35923, 633069, 1487261, 977250, 2659072, 5300139, 3087252, 8212200, 6268252, 3449158, 3488881, 2937579, 1799185, 7766537, 6810614, 590420, 5514566, 7851117, 5811234, 4474840, 5220607, 197750, 5489622, 3529682, 7287661, 7155153, 1099115, 7447003, 752770, 915958, 1900065, 427231, 1632331, 7345902, 8334791], -[1834985, 7161747, 3917653, 3244045, 3320503, 3766488, 3664456, 1313583, 4800383, 5698539, 1587028, 2289912, 176122, 6902829, 6179477, 2034567, 4274196, 4161323, 7179282, 8054327, 3819413, 918000, 2330012, 3231577, 306932, 1303663, 399867, 6776949, 2388660, 3102130, 4841675, 3986797, 6695875, 1565056, 6042622, 2398786, 2653599, 8244065, 4238526, 4388386, 7405627, 6130658, 4756967, 4121184, 3148701, 6014287, 5050629, 80943, 6655052, 7333739, 7113360, 5103619, 980320, 7964501, 3510831, 4897497, 6894685, 5473874, 2235842, 6367384, 1742918, 5585318, 3223845, 3775698, 2364427, 7400357, 2607362, 7466748, 3601886, 5349429, 5769941, 7389134, 861901, 1040352, 8374905, 128575, 3328181, 358233, 7397252, 5057663, 7202762, 5283006, 8133657, 2310972, 21919, 6121146, 4964549, 7629379, 1097040, 3015660, 197209, 2514173, 3503331, 5056861, 7369897, 8051873, 6672483, 7840901, 4320303, 6438235, 5745910, 1389982, 1151981, 1173054, 5506831, 132757, 6585541, 1677750, 3635981, 1151384, 7153355, 2234107, 7052341, 1509859, 5166838, 3578870, 432927, 1256399, 3073427, 6829163, 5557078, 7829222, 6533082, 5195810, 701344, 992848, 2590964, 1171316, 7085933, 4008906, 6310891, 5488130, 2396344, 1382833, 3499903, 1921710, 8315746, 5142954, 4760296, 4018283, 5040892, 2486405, 5160218, 1983590, 8113733, 650614, 4169026, 75689, 3077495, 4509159, 5063968, 6616668, 3273926, 2605688, 4316022, 8341798, 1692623, 402652, 6315256, 4871090, 7748774, 7139998, 5419819, 3440102, 4507509, 1463157, 7017314, 710011, 5744304, 4262156, 1516680, 3980629, 2871330, 6883964, 3727417, 988300, 1574952, 2110460, 7427236, 5350536, 3312961, 7097006, 7515, 6088953, 5397091, 4027731, 2597297, 2203374, 2540196, 3338374, 6294882, 8039138, 2081489, 4075073, 3294546, 6450536, 4028930, 4348601, 3947521, 4112052, 3726430, 4981009, 5737790, 5267328, 3152683, 4350436, 7158832, 2521289, 2742063, 5824752, 3566685, 4146639, 2817121, 3659069, 8114909, 7320319, 355997, 3739659, 4984198, 2685972, 5090825, 6791195, 5604571, 3684974, 6098697, 2623328, 7562649, 871488, 3185625, 7458016, 7509129, 1356348, 1239715, 1697889, 1707605, 3345819, 6020314, 7323939, 4280054, 8110387, 6892556, 7828890, 7456729, 1370120, 683749, 7206507, 352761, 7070610, 4544122, 775934, 3366246, 6337961, 1707864, 2206883, 1228565, 6958655], -[6213084, 7962578, 5539844, 1356485, 5980456, 5737275, 6764543, 7209759, 7212958, 5837922, 7148887, 7952631, 7452147, 2859867, 7342066, 651369, 8247869, 7023732, 5995045, 4973861, 4933215, 1772939, 3352846, 6865051, 8343098, 3033929, 7007587, 4524845, 7785846, 6396341, 4856884, 4890826, 5534887, 6432153, 1635866, 606955, 7655914, 6587011, 7307522, 3032689, 7327299, 2683784, 1036670, 3321234, 5501393, 3603010, 2688040, 4096246, 7701731, 7192045, 4559776, 5327777, 4458482, 6471105, 1609904, 7582122, 657260, 6237156, 2263921, 2959674, 4438004, 1820196, 7873419, 4274656, 3117354, 8002160, 3299471, 3883217, 7745572, 4660711, 8121992, 5741530, 3386692, 5027528, 2154121, 2410752, 1071595, 4702828, 4059865, 3477852, 4786456, 6182987, 2314652, 7046734, 3780490, 3640775, 3016835, 6338898, 5586010, 1915499, 2140922, 3778658, 7393898, 6388921, 6744990, 2578311, 8340883, 291956, 3368873, 2061292, 3901062, 7578316, 5806181, 7190289, 3744674, 1968872, 5699978, 3967675, 6832993, 660214, 7416338, 7251178, 1857264, 2733718, 6148799, 5475824, 4790706, 1440783, 4241040, 6093610, 7675582, 2997395, 2395232, 3040185, 426195, 5037680, 4610114, 66635, 107788, 1040813, 8100547, 1574304, 8231222, 681822, 497137, 4778614, 751604, 7769698, 5637818, 1554793, 3159693, 8061542, 4446717, 4499966, 3845997, 6937454, 1694190, 1056455, 6994475, 4426486, 5610610, 6371881, 1416434, 1984424, 4345142, 6388627, 2847714, 890258, 4908427, 1666746, 6880202, 4441528, 3320647, 4882907, 1351558, 1543382, 1493208, 4422037, 1673357, 4726263, 6719335, 5941442, 6079320, 1258317, 488241, 4697206, 242419, 78378, 3244048, 604611, 5402225, 2586869, 4239537, 2494932, 3804677, 5708852, 317765, 7057356, 3762835, 688832, 7034428, 687450, 6052242, 7043382, 1845789, 3006795, 1730167, 991000, 713094, 5255359, 7525285, 4011987, 1919754, 8023354, 6411320, 7390730, 5988421, 466668, 5894121, 5984554, 1683230, 3235038, 1836829, 4317158, 8122497, 3225662, 2102128, 6752074, 3419472, 7184810, 4043449, 3612014, 64431, 7623715, 5444517, 6132428, 193511, 4540203, 6872123, 7149727, 3298862, 6575287, 21456, 1196428, 5727748, 174269, 1442861, 7141857, 2999260, 4211378, 3149521, 4887778, 3105810, 7014397, 590439, 2046580, 4718576, 3320074, 5283429, 1379971, 3742234, 3147235, 689153, 4526825, 3976879, 2266612], -[7686236, 5403954, 5775520, 4050072, 5064229, 4638616, 2719640, 936693, 4520890, 1640853, 2487849, 3291721, 1820912, 784134, 5149904, 4436976, 7997142, 3305960, 8371373, 3554596, 2041778, 1158518, 8196141, 2914418, 608335, 1579472, 3774621, 1992526, 2252362, 7191741, 7858893, 7364067, 503862, 1710099, 7835493, 6450015, 5319007, 1647394, 3484911, 3465609, 2747468, 2621007, 5066653, 2422066, 8209367, 6662632, 3047227, 1417880, 2793914, 1908545, 1956470, 1403160, 6093556, 8191450, 14127, 5636080, 415376, 3948750, 1854473, 7569706, 7568207, 5735675, 7326011, 2014763, 1447268, 17219, 5904070, 969207, 1985261, 1321598, 977534, 8133894, 7734727, 136030, 2916856, 4060134, 5044324, 6976047, 3295657, 4093734, 6473049, 3854402, 2585434, 1913825, 2702795, 6767563, 5915283, 1716126, 6445231, 2474787, 1363522, 4747036, 8113539, 7987112, 3961422, 4820043, 4765976, 3002209, 8291517, 7542771, 2931638, 5934612, 8131590, 2798706, 3121982, 3195985, 6747200, 6797876, 4402477, 4376356, 5928779, 5602946, 6031264, 6082038, 7730713, 330061, 2872730, 2862911, 5299205, 6122297, 4373159, 6261565, 1924852, 5752441, 6023985, 5624616, 550521, 2434961, 5898866, 3469324, 33975, 380735, 8263625, 8217824, 2244146, 2432773, 1479006, 6242077, 3785916, 8347895, 7754243, 4170225, 8110379, 5169290, 5607708, 3102544, 2506719, 1982733, 6074447, 6968649, 4848666, 2228231, 1160029, 6126660, 1304746, 5908327, 7062021, 5865093, 2578266, 110137, 7198425, 7870778, 3298495, 599229, 3046573, 1287146, 5515050, 4089508, 4706060, 2389420, 2133641, 6332301, 7537325, 2044845, 767599, 2176521, 3000388, 6812339, 2277827, 7873654, 7608227, 8055901, 7480189, 6643409, 7196285, 1562498, 1870572, 8241392, 1964031, 709621, 479864, 6656955, 179553, 5179335, 1118782, 2452037, 4148060, 2435541, 5111595, 3795167, 3336737, 1548703, 7923527, 7107767, 7142192, 3011389, 2292557, 7202561, 4537126, 5238090, 800110, 2625661, 3854533, 3560638, 193221, 2544272, 1156656, 6232509, 61108, 1696959, 6157505, 376717, 1097304, 6935561, 1045372, 2473091, 6173885, 368092, 4071827, 6644703, 2586403, 2732943, 7973941, 5389274, 8177058, 286115, 8019060, 2148626, 5147712, 6174215, 749880, 1564454, 7860001, 711998, 7716865, 3290701, 1396315, 1544479, 7445150, 997527, 6290112, 6572359, 1454132, 5443910, 1032611, 2133260], -[7600514, 4481790, 387179, 3987949, 285924, 8328483, 6053469, 3540376, 4165083, 1120241, 5585685, 6257349, 2491195, 6097006, 5077677, 6772352, 8343991, 1385565, 5747953, 6317470, 7612165, 3855461, 5957642, 1132203, 5509945, 1769513, 4129279, 120504, 5372210, 1633589, 6509271, 217962, 1233202, 639796, 7564982, 7876814, 5395493, 4747171, 2242777, 3465921, 7634304, 4404545, 103666, 8373929, 7666705, 7797370, 1221478, 2443528, 5796365, 7743680, 2245340, 861838, 1473164, 5499458, 4645082, 5480929, 2049463, 7592348, 1782247, 4123301, 4342884, 5702275, 3549622, 2128291, 1085192, 4250255, 6833351, 361024, 3454973, 5250962, 7621594, 3180127, 6780036, 6746928, 3416000, 3654436, 3968463, 592332, 5625419, 3665709, 6918283, 3576429, 2547181, 7089923, 6019352, 5137084, 5917453, 2606591, 4638613, 4279538, 3534616, 6386366, 1292093, 6908801, 1161260, 6236020, 297353, 932403, 7783145, 1077831, 1616677, 6101402, 6341998, 5197921, 89871, 3003922, 1702507, 4823155, 4825894, 4026656, 2098128, 3726246, 6176039, 8302835, 875025, 3407776, 3801372, 8358671, 1846566, 3927389, 2660990, 6368005, 3502263, 7713849, 55184, 2308629, 5083005, 7469275, 1426221, 4037761, 3526049, 6961779, 3886000, 3176591, 3182725, 1812660, 1583262, 7929452, 6446798, 2690860, 180866, 6515474, 6696931, 4185756, 5829731, 4246871, 812019, 3995874, 7886944, 5617065, 1649329, 768595, 746298, 4657727, 2683575, 6263345, 8003877, 3799011, 5777544, 7370251, 6353281, 5162359, 250429, 3290984, 1276699, 1055723, 5413670, 1005487, 2327076, 1997383, 2367486, 1411752, 6412077, 7786959, 6096922, 12474, 5477821, 3668203, 7864164, 2376991, 3107437, 4210473, 2931707, 7909772, 157576, 5401383, 5119246, 670375, 2128301, 1022541, 351417, 5786388, 4243196, 450992, 7935947, 153825, 5558880, 4521091, 7402620, 5781546, 1934309, 3372766, 8299935, 6043841, 4458252, 6806169, 3131967, 8088755, 5006801, 7404877, 1617157, 2958162, 5769463, 845289, 377907, 6125113, 5397484, 596963, 2169154, 5254424, 8374105, 2220571, 6771702, 5636311, 8109851, 3871527, 1385922, 3494167, 6309766, 8144159, 1916798, 183683, 2429610, 5597402, 8308548, 5808147, 4689430, 6884914, 1057700, 5401263, 8204109, 2064512, 863933, 3667666, 3222369, 3560580, 3105569, 2197702, 5627686, 5649219, 126964, 2179767, 4756703, 2285151, 3271579, 1129570]], -[[6961917, 8119250, 1707386, 5846099, 4143377, 992899, 7884436, 226428, 3660218, 1572339, 4183605, 7905649, 222277, 907880, 2744599, 6475735, 7547810, 1474254, 2482641, 2623663, 2834163, 4953137, 4124054, 4143523, 3886281, 7504970, 2125690, 7922157, 4129862, 6501267, 1728295, 4299491, 2292905, 3639488, 1835015, 4518837, 6156549, 1840942, 157054, 7910343, 5223943, 6701180, 2368055, 4287747, 2897289, 7917372, 2411289, 7173075, 1559300, 7352603, 8096165, 6040076, 3899807, 7000051, 1605, 3113574, 4247082, 708704, 4884285, 7805742, 7248713, 661004, 1572069, 3873421, 5009193, 3637673, 6358140, 26426, 3625820, 3219799, 4589471, 4858286, 6055795, 2359295, 252997, 3068099, 3193007, 2727509, 2393185, 4200587, 1673942, 1525617, 6223331, 5902894, 2678352, 1520714, 8032631, 3337429, 1619411, 13974, 2085277, 8187767, 1074780, 4716423, 5303244, 3463087, 2910096, 4077562, 5017562, 135572, 2502203, 44246, 5189001, 7555436, 791733, 2844847, 5823090, 2621654, 3188663, 3037360, 5485347, 8321905, 2977449, 2060984, 2637872, 3256248, 6660023, 1711878, 76206, 6071242, 5468848, 7063115, 1240662, 8319212, 2367738, 2628974, 5731332, 2448542, 8031278, 1901972, 7814299, 480954, 271261, 7035667, 1854866, 5037556, 7941084, 3659013, 5723544, 591277, 7807067, 7844057, 2238000, 2231585, 8229760, 7885670, 5302472, 3383861, 5015260, 446931, 3416371, 3904068, 4056079, 6853387, 4257125, 3580798, 6560294, 1660962, 2592513, 758845, 6892743, 4422072, 3173745, 4312408, 7155274, 2417665, 3370464, 312961, 1038163, 7044873, 673129, 1780739, 542733, 7739208, 5592731, 1296005, 1292211, 6846065, 8170452, 2050740, 5670177, 1699833, 955053, 2267620, 3165695, 7644669, 3442550, 1180335, 7103060, 6362067, 3264885, 936874, 778812, 449434, 3348189, 477257, 4394723, 5401671, 1850196, 5410333, 6054869, 1357922, 4838965, 4529277, 1522041, 8348526, 2362125, 2653874, 1350724, 5812239, 5372467, 2509240, 7502611, 6970816, 122990, 1582307, 872502, 7046102, 6513752, 7926573, 7883374, 7789304, 5131704, 5859978, 5300734, 6903170, 6086078, 366524, 5695790, 1582119, 210388, 4096545, 60916, 2731918, 903055, 7277540, 608767, 6739154, 5049217, 3198458, 5379735, 2916313, 2447990, 1908805, 7454634, 612238, 6218236, 1051439, 269647, 2638481, 2706862, 533723, 7661088, 5330324, 5670439, 3975210], -[3319743, 2076702, 6669108, 6444893, 7203367, 6661499, 7394894, 6166300, 5386398, 574570, 2675280, 4871331, 5003378, 7306347, 3780873, 2354657, 8200723, 1085156, 7067013, 7492785, 4307683, 5554133, 3383328, 1358258, 4043329, 8318054, 4821458, 3324465, 1549697, 619385, 2183059, 5100905, 5973229, 7259038, 4882792, 7617391, 5156808, 3172352, 1862277, 3797254, 6846948, 934021, 835774, 3037225, 7075811, 8211815, 1922274, 2593991, 4143127, 1768609, 6265647, 750083, 2163050, 7660698, 2760772, 3842153, 5919855, 2323601, 4952545, 1965041, 1148951, 5307511, 2565293, 1466790, 7729717, 1324130, 5424138, 5058836, 5084149, 1175118, 3639858, 4361167, 5279668, 1943345, 1873302, 4127080, 7049743, 4684616, 2979979, 4759746, 2931438, 2300809, 7240751, 7061377, 6653286, 7879184, 1835620, 274716, 6928226, 7499367, 4590420, 6704470, 8213619, 2625470, 7736001, 3107418, 7869566, 3982181, 6047255, 6756501, 5692321, 3069884, 3453994, 3340892, 5977637, 1127650, 5031167, 5911118, 6274455, 6100543, 1854937, 7100868, 7470982, 6623783, 4581446, 1424765, 2335681, 1655357, 1887125, 2816396, 2833050, 2090735, 7681795, 4172062, 5932977, 6012149, 1190300, 3588211, 3495402, 5245260, 303238, 1076199, 5462829, 2831833, 1886728, 6731482, 2090146, 6818486, 1152535, 25796, 34742, 711387, 2540102, 8320578, 597366, 1406706, 7796111, 8067162, 1186064, 7834090, 1118581, 6933734, 981125, 8330348, 5034471, 2216285, 5060792, 5414440, 8316839, 8297828, 3018132, 596421, 864246, 1305717, 8233704, 2358629, 4224747, 1361966, 1854168, 7595948, 785587, 7278542, 2691765, 7880605, 3942960, 7051650, 7383357, 2681619, 7692438, 2298214, 965886, 5193824, 5096623, 6867940, 6129850, 3828958, 8276728, 6800792, 4265379, 1047453, 3979160, 6381535, 4566659, 5526943, 1206675, 4884640, 1750862, 3009919, 4031511, 4003141, 1780454, 4380638, 4071003, 3375514, 1454968, 3725029, 6388730, 4504711, 7467906, 5334872, 3592616, 7920156, 6163288, 902215, 5288206, 1947024, 1119521, 3063581, 2743555, 6485865, 1374903, 1773201, 3009979, 6796944, 5740470, 1060049, 204371, 3317772, 2524231, 6646132, 6417959, 4914148, 5737382, 1884428, 4544810, 26918, 1173230, 1945683, 7763928, 6864543, 7338483, 791669, 4938223, 1820720, 5941005, 5985530, 2820638, 5000909, 2717250, 6242225, 1218052, 5407084, 1691368, 2557367, 4877323, 5502925], -[1656378, 6675234, 3297347, 3091414, 2129305, 2762022, 1853722, 627344, 1775484, 6598734, 544641, 1884030, 7407297, 2813538, 8063288, 7596782, 3949977, 7975913, 7198441, 3501683, 7926639, 8010249, 8042724, 3289666, 6592706, 5332489, 6994437, 7001506, 521717, 5982101, 3371228, 7166438, 1870958, 8046542, 4379240, 4368261, 3495977, 2838221, 4620246, 237866, 5003996, 6067165, 5513870, 4833082, 4597694, 6657645, 3366798, 5564322, 7009126, 4700670, 4599142, 143202, 619585, 3739796, 6816490, 5636006, 1223584, 829992, 5197674, 6170003, 7273700, 6398332, 7167912, 976150, 5867070, 1184732, 105830, 8321871, 2975979, 1547275, 6046845, 3031316, 1106557, 2497867, 1376787, 1689759, 533830, 6180130, 4442544, 555852, 6224167, 8249684, 5091525, 4542482, 6619171, 1042806, 7498053, 630567, 871049, 7008041, 3635905, 47031, 5144841, 953047, 6874029, 8074960, 4192596, 1378198, 4434958, 948662, 2333749, 516501, 7348206, 449969, 4184430, 3446065, 2950515, 8001122, 6094765, 2740135, 7645454, 4086481, 5973694, 3929976, 5914679, 4473048, 2289211, 6144459, 5363505, 3092517, 3788884, 2720585, 1626828, 1377583, 3703936, 3641374, 3772668, 6371196, 7601320, 6771616, 8085985, 5911921, 2679466, 6806159, 4499519, 107666, 5806409, 1167893, 339237, 453546, 7427405, 6068848, 6760255, 7215314, 4604619, 6500922, 8359422, 8068303, 6148402, 7793634, 412351, 3464746, 1820373, 5815303, 61510, 4775278, 5251296, 1726029, 5104181, 1218228, 252773, 451430, 2963528, 335702, 302107, 5242905, 7215707, 4012330, 7005860, 2284998, 1348433, 6126416, 2344607, 1353623, 941706, 4361310, 473014, 314002, 1135707, 2735434, 4041713, 1593565, 7388327, 922960, 2572606, 4436896, 4804450, 3703866, 4166387, 5061782, 2710676, 1529860, 4597949, 770903, 8332686, 3145587, 7377239, 5649201, 1793074, 3281786, 7470793, 7582571, 5520434, 7950305, 2158053, 1805774, 8011400, 7302537, 7023601, 2206837, 6278386, 499059, 1693311, 2047638, 652153, 7446185, 7249988, 146339, 5065081, 6176472, 1353785, 5820601, 5915249, 761849, 5098667, 7183494, 6067399, 4016164, 3829753, 6879867, 5447927, 6743681, 2166266, 3414656, 3371417, 1588640, 7575245, 2720171, 7056300, 6598673, 744175, 6155960, 5936178, 855201, 3596523, 696615, 1886016, 7681870, 4182761, 1279716, 2063131, 5667257, 4045010, 1153757, 601171, 8183801], -[2096411, 7904417, 6359118, 489486, 1613011, 758991, 6613453, 6565088, 1581044, 3446116, 2218451, 1213917, 8273790, 6679265, 4236199, 6910685, 4573839, 7318945, 2512876, 392110, 2267989, 2395209, 4710805, 7042308, 4773061, 1789589, 3832075, 1432709, 8117622, 5532892, 6650892, 8187489, 3660139, 5117381, 4375192, 2271396, 1402893, 422677, 8105651, 2953222, 8028218, 2334490, 372636, 8096609, 3032409, 2649388, 2572846, 6136554, 7166424, 1997130, 2952856, 1316699, 2838737, 1336651, 4709830, 4142474, 3484970, 8051029, 3181070, 333274, 8288063, 5156757, 8261945, 6236621, 5146915, 7143988, 426047, 368635, 2536724, 8204803, 3539919, 5863232, 1086404, 3407558, 6508069, 5801527, 4567185, 7432510, 8124542, 587215, 1537173, 3086350, 7779670, 1312505, 1849906, 1590463, 5111827, 4602691, 5797837, 1127870, 1474899, 666043, 19116, 880350, 1463244, 6649592, 6048875, 1680573, 7210943, 8173357, 645575, 7715754, 4034894, 7844141, 7009049, 7226079, 7743342, 532282, 908697, 6418014, 7667106, 7172659, 5329901, 7053810, 6417197, 4914444, 6031332, 5888649, 5507642, 7642167, 2121106, 5688961, 4676115, 8211963, 4679296, 2170954, 7191317, 2393473, 1042353, 4404370, 2667598, 1929293, 7703416, 2821085, 6763165, 6990497, 1782299, 3137310, 806905, 5115690, 3989103, 2253916, 2406426, 5348097, 6609363, 6348629, 7595337, 7391703, 5971744, 2446392, 2045017, 5373377, 1281781, 7937509, 4477987, 1229150, 4731326, 7925188, 282345, 8280237, 2202279, 4262243, 3261530, 1688225, 895985, 4890325, 6536682, 6262804, 1008868, 7388102, 1834037, 4793066, 2295995, 6188302, 7862293, 7745022, 6272317, 7711415, 1985817, 2105245, 6866288, 5149104, 6365005, 590960, 2014076, 7855268, 7373936, 8371569, 6138947, 1695602, 7031135, 5972791, 5510382, 3929071, 6444062, 5411931, 875398, 7487510, 4541311, 7936592, 397994, 7145966, 15357, 1310732, 604231, 3516316, 101941, 3192721, 4046739, 7366982, 798258, 6010488, 851161, 4512780, 7741112, 6835574, 2673356, 3481768, 3929655, 2888179, 7303301, 7190978, 7536875, 1346948, 5502271, 2845375, 7537689, 2445213, 1408004, 6687478, 5917364, 4208480, 97723, 888380, 6676910, 3652027, 3118368, 3650673, 5507737, 1241115, 1182651, 8313497, 4468450, 7673337, 6410288, 5746228, 4242656, 8177604, 4725682, 4107459, 1717620, 2306829, 2842622, 1655879, 6895219, 6834768], -[7769167, 3270836, 730073, 3013160, 1636480, 374114, 4791720, 7499929, 2422820, 6345273, 4101440, 5552993, 1537723, 37097, 736641, 7434569, 1754851, 3079873, 6642946, 5227626, 1858534, 7336752, 5123382, 7961379, 5058828, 4429557, 1605065, 4967370, 3712193, 2009516, 2035738, 7714949, 5471892, 6485789, 5271750, 6094456, 1780211, 2034746, 8102465, 7845765, 4563867, 8057662, 61950, 3473357, 1150237, 2624985, 771792, 7275686, 93228, 1904741, 7306037, 5691205, 1353325, 4893514, 2218731, 504220, 3818444, 6680519, 7994047, 3233396, 4536606, 5080446, 6735913, 1133126, 1874063, 838594, 7972188, 4074640, 8148813, 2381688, 8259188, 1562812, 7216267, 7403407, 3633946, 2844391, 3988496, 4699872, 7501850, 7369161, 5469948, 6340414, 3694217, 3618513, 1693412, 6075304, 1535524, 4162381, 2073218, 4696262, 3731404, 4621419, 2474394, 3158450, 2445975, 4217056, 2514198, 866473, 20629, 4029, 7452534, 6234977, 2694052, 384039, 4227488, 2880379, 5530686, 3400098, 7830945, 505751, 2771685, 865242, 6692131, 1795028, 6053800, 7531833, 8019244, 4998967, 3319886, 7161409, 8338908, 2430111, 4612401, 5131452, 7434615, 1963757, 4567736, 5933868, 3119786, 113333, 4551201, 1761089, 3862026, 2233921, 816785, 5341270, 3390806, 5951749, 7746301, 343341, 4795179, 671539, 7034508, 5805507, 7720119, 2380557, 1980622, 158129, 3320239, 388949, 4490164, 4880544, 4558431, 1330932, 8086381, 8021842, 7713457, 2327131, 3338515, 5673291, 4481631, 3689776, 7064593, 5554362, 6561039, 4373698, 1705514, 4528535, 3596326, 5301253, 6883767, 2719633, 6858994, 6190461, 4492854, 643406, 5524851, 7260896, 1538554, 2638546, 1411916, 2422135, 4885570, 2709470, 4766149, 4602792, 3462782, 6274901, 1195593, 1147516, 1167642, 986218, 6132731, 7227629, 1327469, 5731763, 8215221, 471134, 7908733, 4996979, 3925467, 363697, 3374099, 5822890, 6548511, 1346830, 980560, 7078505, 2783544, 3071246, 7486690, 8349675, 2565067, 4029663, 6816360, 2455439, 1216313, 4497087, 2519103, 5759575, 3885622, 2162141, 6042768, 3296942, 4333548, 6230868, 7050909, 6885906, 1576248, 5123469, 2785574, 1235698, 803341, 5653097, 1889301, 1820531, 7892978, 8282129, 1564585, 3766947, 1446803, 590320, 6883511, 1667056, 6750130, 5276987, 3529373, 2615894, 4683348, 4406005, 1415466, 2935962, 1795859, 308060, 2258812, 240179], -[4924361, 7607454, 5815450, 7993017, 1513360, 7871355, 111386, 7029837, 4378693, 8349636, 91181, 5137281, 8005607, 6900879, 8288989, 3083468, 6312306, 7801285, 915281, 5728000, 5379478, 702333, 3779207, 7264261, 8060340, 1611840, 1149460, 833726, 7881009, 4159984, 1123745, 2345529, 7021219, 6539493, 5671229, 4597256, 2197960, 7546252, 6527188, 211502, 1897650, 7058692, 970802, 6027116, 3420086, 4922403, 5023047, 1586528, 5436450, 412793, 4386508, 7476312, 6444472, 2098569, 7858057, 1250698, 6965543, 1457831, 7444710, 3561673, 4809367, 698847, 666427, 1488605, 432729, 2104970, 7404211, 4746445, 3097530, 7164186, 2557844, 1643946, 177184, 1720744, 1313197, 1697015, 8024494, 5908093, 6607592, 318517, 6819631, 8086832, 7499036, 7290602, 422217, 7631275, 5197883, 6775512, 6719549, 4120289, 2408868, 2494980, 373890, 5500967, 1309022, 7665556, 496769, 3936083, 3143068, 2394670, 1033269, 2408178, 7838349, 7864811, 7963747, 6020214, 7454699, 5191514, 2232666, 3624816, 3869594, 445795, 6621215, 2914650, 8271936, 5208051, 5616488, 5244241, 7429993, 8354183, 3808133, 2539327, 4517478, 6435170, 308273, 1920546, 114214, 3101334, 7656832, 3061826, 3808666, 6111743, 3868310, 83924, 5679085, 5767811, 8047634, 698804, 5738014, 6924211, 3599173, 8116933, 7688437, 1366740, 762408, 2341213, 81846, 7755407, 6198462, 5437279, 1052866, 5287390, 482643, 2250639, 5265228, 5947148, 6028405, 7747705, 4433449, 1551691, 6055671, 1504868, 7075270, 5993323, 4181979, 8027459, 1771408, 3300979, 460277, 6963257, 5865673, 1721630, 6722371, 5421453, 8008690, 2464703, 3921101, 521027, 2363865, 5164891, 4351054, 1068287, 1199795, 4855563, 7993897, 825135, 4618929, 7024957, 7554496, 1423196, 7446075, 354897, 4145709, 4339126, 1019937, 5311502, 1866237, 4095733, 1825288, 749614, 5039688, 5222701, 3813736, 4625876, 7983951, 3891735, 18620, 7438703, 7441581, 3810424, 4056537, 4954622, 350772, 3876380, 6922579, 6983976, 5753996, 7076878, 8248789, 4490902, 3410439, 1647876, 53872, 5879725, 4072600, 3726354, 3941161, 552859, 4351594, 5748751, 2731307, 4887890, 3115204, 8254925, 7826833, 6476019, 1252515, 1002310, 5353086, 2490466, 2700916, 2207940, 6841394, 3783622, 2462209, 2992219, 7846532, 7065885, 5344450, 2365493, 5100206, 6076937, 6840381, 671462, 3189204, 2544061], -[4948185, 7532904, 5924440, 7570418, 996127, 3577656, 5989264, 849648, 2972447, 539044, 6515327, 5912160, 2173419, 2167011, 2270754, 622751, 4909951, 493693, 5340513, 321594, 1653276, 4086796, 2793526, 4142048, 2927067, 4286271, 5557803, 4801459, 1128716, 8298927, 2544885, 6654872, 1979659, 531198, 1905487, 4840688, 1621782, 5022044, 2502748, 7682200, 2265884, 7283164, 3860785, 7459088, 4558723, 464557, 1717569, 3172108, 7189478, 1599111, 6385031, 1073627, 3442312, 5993510, 4913746, 6131814, 5423110, 5842912, 6900394, 944959, 6115424, 1860812, 5315882, 1342529, 3264941, 1850752, 6768875, 1953097, 3850094, 3771892, 525662, 3148924, 8228550, 809103, 3526153, 632012, 7618414, 7813637, 5439154, 4707421, 1410220, 4593074, 4761664, 5407779, 2531959, 7297426, 2533416, 6675728, 5446851, 5181635, 54496, 3997480, 6314003, 2051374, 7542734, 76490, 6272163, 4899443, 1930438, 5358321, 6526861, 5805541, 4689824, 5656301, 4610931, 4071710, 8214322, 5174261, 6836769, 7271327, 7060281, 8008249, 1664852, 5659179, 3390061, 1200824, 1404247, 423059, 2846032, 3821844, 6457179, 5605363, 4470847, 1958988, 1322552, 3475239, 4336796, 1435692, 7665258, 3444937, 737905, 6393106, 4325725, 6578027, 2787658, 1965289, 8344387, 8342201, 469186, 5793939, 5175905, 6030547, 638911, 6177715, 3662391, 3591735, 7522514, 2356960, 3376219, 6512848, 1222451, 6691600, 1249631, 1482796, 7962979, 4394519, 828770, 6589823, 8224506, 2404967, 5111433, 584353, 2002606, 7028156, 3981653, 7511150, 1694047, 8024435, 6684296, 2271925, 4544709, 6067561, 7150066, 4440749, 6790477, 5937314, 1166164, 6941254, 4386953, 4053207, 4465724, 6174364, 5174685, 5862103, 5856730, 6405673, 5505062, 4701968, 6497188, 541420, 4196271, 47692, 3199938, 6779800, 5329690, 2312742, 3700250, 1874298, 5889572, 3453122, 5368093, 7376643, 1710309, 974669, 989929, 1131971, 3444725, 3157053, 502551, 4353781, 4845810, 5028557, 2540126, 815276, 721777, 2423304, 328955, 8235514, 3594842, 5534614, 4319091, 3374408, 8231260, 1329567, 3265926, 4872447, 6292875, 6390521, 7988163, 4226127, 3539201, 5472984, 3051579, 2495323, 5277744, 3961655, 4631975, 4440058, 5314399, 5104697, 323736, 6245688, 5715299, 1525174, 877150, 2267935, 3473711, 5330639, 7529669, 6923676, 7663857, 280097, 4322476, 8350199, 448740, 3794499]], -[[7186428, 4190251, 4081845, 3351668, 1606185, 2592683, 7406197, 5550488, 3154181, 4326625, 6792866, 117440, 748927, 5426584, 6035964, 2867441, 4455743, 4138144, 7118483, 7321563, 214051, 4204525, 3012636, 5726764, 5201255, 6469705, 5062255, 2464099, 4102705, 2099084, 6995528, 6145807, 2970693, 3969885, 5272589, 3833222, 1827623, 4595614, 6342804, 4273663, 5259445, 576432, 3596807, 2329012, 2915403, 3260224, 2866853, 8241027, 5288606, 4671755, 5776793, 3850906, 386568, 1799914, 7235065, 1722795, 4737334, 3891876, 1595698, 7164309, 7651931, 2136000, 4546810, 2435238, 5974695, 5994505, 2629466, 7489398, 498940, 890033, 6653238, 4510050, 4223565, 6410856, 4940203, 1854025, 4038082, 5487282, 5814418, 7015656, 5432491, 4861716, 801406, 5372814, 5984778, 4160105, 1748019, 1609874, 6016005, 9010, 8371546, 2509799, 270164, 5768846, 6702588, 960610, 7147557, 1699819, 1192205, 7750695, 8055836, 4264112, 6617516, 6827455, 3328631, 2964146, 6199507, 4945484, 5609596, 2662201, 3004694, 7672469, 7704427, 6397001, 2901731, 2747879, 7725381, 7465516, 6979685, 3166427, 3027239, 1865917, 133462, 7343744, 1831809, 5469474, 735144, 6505049, 6720311, 2756868, 108877, 470452, 3540782, 3909217, 7158256, 8155174, 6706215, 971735, 5586801, 1081538, 5244617, 5998480, 3055471, 7533018, 344717, 1216295, 5920026, 3708589, 4976839, 5032515, 727720, 4122722, 1053929, 1424056, 2479514, 7527704, 5976676, 4617726, 5439923, 8318939, 6573777, 4121250, 4540343, 3970926, 3620463, 6268814, 3216618, 5051767, 1893736, 5875150, 4656997, 7618164, 3329310, 4980382, 1941728, 5622998, 4780035, 2863317, 7464037, 1641091, 698474, 5666930, 4917349, 4502826, 8111186, 666160, 5854537, 6992461, 1252832, 189442, 8292956, 3201455, 2543053, 6509757, 2789750, 5193054, 7215042, 1725423, 1082955, 5165203, 5115308, 2102531, 4026266, 1196090, 7626327, 3262355, 3034021, 1125866, 4655643, 940610, 3967025, 375868, 417452, 6867368, 1981342, 1422638, 7455639, 3958579, 7693723, 941913, 6106468, 3960507, 4454680, 908773, 3427404, 7701475, 1733810, 4449375, 6101735, 4699088, 5703752, 5124162, 5601362, 4310080, 8365156, 6019017, 5043194, 4904531, 8239818, 1073389, 6007626, 3511319, 6839682, 1652500, 5848620, 2070002, 8351411, 3555297, 326917, 6388871, 4444451, 1415673, 2766019, 6077481, 7810962, 6606172], -[6347156, 2715979, 244833, 7263725, 6015462, 3928578, 3650289, 8106037, 7996692, 5441158, 755139, 1141572, 4689104, 5488716, 4156905, 5310817, 7766222, 1267955, 5628911, 6548704, 2745772, 3066277, 3505003, 616580, 7841657, 2708162, 5738253, 4913530, 8098194, 6422503, 8365904, 2303056, 6624562, 8300563, 1043925, 145824, 996859, 1333338, 2095872, 2452215, 2222044, 480268, 4708503, 659783, 902053, 7913845, 3812581, 7825280, 8182744, 5578935, 755695, 2234638, 332208, 4561943, 6875997, 3800490, 6491174, 7349785, 2571882, 4498306, 3097198, 7808667, 653880, 3976057, 3765350, 4653150, 1149260, 5241151, 5179806, 2772000, 4358760, 6867261, 2514593, 4251951, 1264018, 6118224, 5949099, 5567979, 1151896, 5821711, 3463710, 7817733, 973944, 8053777, 819933, 7907716, 302949, 4854757, 4853241, 6569308, 4309209, 1430319, 1645141, 2053269, 3229107, 5780624, 6158286, 7873257, 7672559, 2829862, 3070530, 856797, 7483728, 6534482, 1497119, 4144244, 2342446, 1975405, 1280534, 1668345, 2253766, 8105108, 3906554, 238572, 7403996, 4359677, 965896, 4288638, 7222289, 2991975, 5163261, 3358949, 7478094, 7832848, 5056306, 3760318, 4706948, 4069374, 5658268, 4421054, 8155914, 2225305, 5405741, 4453279, 6009188, 3873045, 1742299, 742606, 2346101, 6214387, 6771577, 4798796, 4599810, 477382, 1737410, 1589110, 8141721, 2811962, 1966090, 5858889, 6142317, 2466769, 2530631, 293622, 3509284, 7108975, 1450872, 4303913, 6395565, 5752332, 5498054, 6389329, 1439240, 5377600, 1234669, 5502363, 4143623, 4958006, 6156895, 4583151, 2505667, 4333616, 1504630, 6763747, 929121, 1937710, 4912588, 994682, 1967547, 7153624, 1547520, 898633, 1981698, 3609109, 192635, 152584, 4354658, 5912447, 3337362, 575106, 6402652, 7386761, 5602291, 5935434, 6559165, 8081611, 977546, 7095886, 4793053, 214543, 8262616, 1613846, 1343907, 5884725, 2440607, 5387336, 391437, 348550, 3651404, 602769, 6612202, 2243527, 2140324, 3622288, 815005, 4080104, 1174991, 3241575, 6587319, 4828706, 7172618, 2144656, 2227874, 2948037, 1708528, 8055881, 568525, 6795038, 400512, 5204289, 4159163, 6766172, 3287854, 757676, 3012056, 3640504, 7637313, 5003240, 8071190, 1265312, 6396094, 5196418, 7424172, 6786128, 2617288, 2531101, 3175060, 7307343, 3183301, 3689740, 3533134, 2061342, 7732554, 6693431, 7136445, 476373], -[1565007, 6668810, 5441073, 6409040, 325933, 4621379, 3192264, 641692, 6198008, 6005869, 1195508, 4454881, 6100329, 2696015, 963870, 1441880, 1298299, 375054, 7439657, 1505439, 4016898, 7594997, 3752423, 4184494, 7240577, 5234262, 5758346, 1757703, 6464400, 3511533, 103723, 7631220, 5066165, 4389789, 1747369, 993312, 6199503, 3639391, 7272143, 3230860, 2534319, 4535898, 7327518, 1899469, 7732443, 3850075, 519833, 7055444, 7721082, 2293211, 48765, 7403189, 6698203, 1162781, 325293, 682049, 2420562, 4287678, 6898622, 1818217, 3650301, 2671732, 1673384, 5610241, 6312520, 3118138, 1453299, 278863, 3299340, 5251235, 8268967, 8210968, 7600275, 5455879, 5638182, 4576229, 394477, 6501620, 2451431, 7606775, 1437135, 4882152, 8144093, 4336924, 3785082, 6410110, 5506689, 1501952, 1632560, 6040110, 5923551, 4730730, 2570028, 709138, 673599, 4543757, 3591851, 7032681, 5593949, 4394161, 5840022, 1098043, 7623411, 4972452, 7194226, 7982095, 6210346, 8344733, 66143, 4963879, 2629392, 719, 4455244, 1269882, 4392082, 4161802, 6976914, 499715, 3653004, 5586976, 1928401, 4334495, 7770001, 1059166, 7452097, 6019246, 451657, 6310259, 808474, 8239871, 3286525, 3316044, 947420, 4233781, 7482963, 6926605, 7333681, 7173155, 1746026, 6755249, 1679379, 5688708, 1483234, 5945893, 2082314, 8137048, 5987051, 3917197, 3106969, 5289875, 5450428, 1425716, 175394, 3208243, 3682698, 6823123, 3604778, 1583316, 1098685, 1005655, 5191828, 2030019, 4205334, 547257, 4076152, 3344631, 1601515, 3664213, 4073343, 1125711, 1046047, 5535287, 646549, 29302, 1341662, 7093800, 7318937, 8373490, 8202518, 7470713, 3636963, 6755546, 6357336, 8056186, 243462, 2248657, 7095980, 5134315, 873136, 1972413, 5647472, 1781715, 1739674, 2279597, 6308672, 6665879, 8148673, 2556266, 5252265, 1984710, 25463, 2854631, 7302170, 1155000, 1276613, 3726146, 5013688, 1485015, 276161, 2025807, 5303579, 477467, 6125667, 5216603, 3543378, 2423360, 6097313, 4891596, 2832668, 8002147, 5337724, 1176463, 3769937, 573114, 4816849, 3127488, 4239716, 421379, 4340883, 6723561, 5339891, 5377934, 4471980, 18453, 2708638, 6671334, 2938485, 6067829, 3932351, 1883246, 2294771, 4288615, 2721121, 132466, 5704402, 4617239, 7692360, 3129997, 7849583, 2725886, 7215860, 2987628, 5283119, 150034, 8321482, 3767701], -[4873371, 1170100, 4615477, 3737294, 6926224, 3946234, 2118527, 1802892, 5157292, 7532281, 20072, 3711735, 3723340, 3952101, 323853, 4415462, 4786654, 5340095, 5411444, 5852424, 448256, 5436054, 2729131, 3779138, 1788556, 245503, 7068100, 5533479, 731241, 3264287, 4160335, 1591576, 5473437, 2387577, 4172119, 58961, 2439387, 6206953, 6362490, 7507464, 1940917, 7776583, 5942014, 4765341, 3308896, 1555727, 8037309, 6216684, 1393100, 7973894, 3221414, 3296996, 3752357, 3010260, 304114, 5935077, 6629820, 6273192, 5384934, 4672397, 2661279, 640775, 7928668, 1342858, 4309781, 365409, 5823579, 732438, 856230, 3288536, 942885, 1703031, 7771788, 5153971, 2994668, 3295454, 7386052, 263047, 2840644, 4140297, 2464184, 4094219, 2768189, 4474396, 7008868, 3183516, 6512192, 7877745, 4187094, 4632354, 976365, 5893047, 7091073, 3976664, 3211393, 2528068, 3139227, 3634528, 323729, 5284474, 1626491, 4944522, 1619431, 5526686, 439163, 8105554, 1816739, 360187, 5496385, 5749944, 433306, 4145854, 7755265, 3092614, 1122938, 2245980, 2524054, 7202645, 188972, 6669080, 7761544, 3033778, 4585338, 6526540, 6551983, 4186014, 6497629, 3675363, 4942873, 1678152, 2691984, 1921204, 2722940, 234574, 3323627, 5802773, 2936071, 7293563, 2821322, 2366313, 7928234, 3185173, 7617899, 73943, 893780, 7005097, 1235663, 2659632, 1757513, 4307375, 3444283, 1288938, 6099337, 2636044, 1241280, 2153433, 2779013, 6733795, 2449043, 2100030, 3055002, 6197413, 8305666, 2166540, 5778227, 5318380, 7642804, 633268, 4730370, 2665392, 5040554, 2747829, 6756182, 945685, 2213951, 5638932, 4130472, 6971083, 1386166, 1441324, 7742352, 1394833, 4232204, 1253473, 5808231, 3389509, 7097242, 5467207, 485414, 2870554, 6548278, 123166, 7524928, 6282891, 1503129, 3390240, 7739754, 4079071, 2771736, 5834707, 4394703, 5643516, 1959593, 8018437, 1608248, 3390424, 6860055, 4101475, 4187592, 6116675, 6590174, 7059673, 7355085, 1710334, 6743781, 3659905, 1705796, 2027012, 6600689, 6636894, 6050101, 1140931, 6713177, 8157907, 2183790, 5246975, 311834, 3059954, 6731489, 3547788, 8336430, 3907844, 4513008, 8207221, 2990809, 1263479, 7543395, 8021721, 2362446, 5177494, 4582068, 3982165, 7855826, 1441127, 4101113, 1238106, 7580991, 6451472, 903210, 8000952, 1839, 8335586, 6121511, 5151743, 7979879, 5845031], -[35273, 757065, 1776844, 5415327, 5266318, 7260902, 2361911, 8309708, 4481189, 1680992, 2311583, 3550812, 4636157, 4055655, 1196240, 7999744, 7105925, 4769802, 5763435, 6342156, 7696949, 6519041, 997589, 2847680, 3365308, 5206007, 1902351, 6370122, 5792534, 5155212, 3727037, 3477272, 838947, 5550580, 7058719, 2383735, 1649909, 2860962, 7847752, 3342752, 4529903, 4133915, 4046762, 915509, 3986948, 5966130, 7350138, 1552279, 7711001, 456756, 3363060, 7425187, 6023442, 2928168, 5155786, 6310757, 6203055, 5241162, 7524929, 4323714, 5687592, 6410589, 1175202, 5335732, 3519399, 7317472, 2737222, 3045269, 7314476, 7028921, 6561020, 2506976, 334488, 4722105, 1727449, 3013463, 3267694, 4686536, 776566, 2825390, 6417416, 5304903, 7013281, 4492947, 4608206, 460695, 5312731, 2578164, 7328557, 6032063, 3755521, 2183158, 2826251, 6020694, 6394872, 5682829, 1578495, 2604740, 3048952, 4003069, 7254435, 7356757, 777644, 3607294, 6805404, 6823227, 3853934, 6187573, 3059030, 2330781, 4243473, 90571, 5795693, 2824489, 7962860, 4791826, 4344340, 4213034, 4110141, 6210128, 5477104, 171949, 1413741, 323701, 5503605, 5635526, 5631646, 1424194, 5355840, 698813, 6698488, 5120974, 3189673, 4004360, 6888293, 4120395, 4281225, 6590335, 6971791, 8287830, 3482947, 7769409, 5623457, 6305728, 8266213, 783656, 1790663, 5796700, 7264871, 55733, 7952443, 3152071, 2503003, 8232698, 4587675, 5461573, 547105, 7277377, 1810310, 4239327, 3903149, 1835028, 2909349, 943400, 6099616, 6011334, 4047689, 88213, 8373027, 1298950, 7391375, 6095611, 8183475, 4175202, 3721527, 3781816, 794711, 1169216, 5453330, 5662363, 7355848, 6410260, 1496000, 735212, 8049992, 5274321, 5403569, 322150, 3143637, 478273, 546598, 359772, 6732301, 7637046, 7674937, 5312574, 635532, 1901291, 3483414, 7223205, 5458257, 3499678, 2479509, 5743522, 805911, 154460, 6660932, 805030, 5191848, 5954390, 2771096, 2661266, 3279704, 6940364, 1508107, 7506263, 526816, 372253, 3447184, 5368163, 2781716, 186834, 1839703, 6912981, 2473496, 6559299, 2140429, 819845, 3467407, 157520, 4166342, 7040736, 1111104, 5972858, 4026188, 7558574, 7773225, 8252234, 3071585, 191241, 7481358, 56506, 6011071, 5069599, 1021226, 5584543, 3079169, 2521665, 4547884, 60109, 3941206, 5343677, 4770353, 6684406, 2461665, 8346813], -[1171468, 2690084, 5464632, 6333015, 590286, 2992251, 7261509, 1593245, 6148131, 1446778, 7381562, 5068302, 4253181, 2876064, 8111237, 5878858, 4622692, 1383168, 8172734, 880188, 61631, 5334477, 6152544, 7260615, 584804, 1733705, 4767486, 6530910, 6324551, 7515879, 6188887, 2388444, 8314133, 8256351, 8278900, 8025312, 6111338, 4354154, 8185878, 4145910, 1206664, 6575152, 8310947, 6501455, 6494709, 5894054, 2793199, 1788438, 6994619, 228556, 6765537, 2510163, 2312924, 3078746, 2393785, 4577596, 3451129, 2727933, 6924829, 4935844, 7061602, 4299009, 2963158, 192991, 6852757, 5693357, 8333800, 379559, 3286551, 1847933, 3984012, 6922730, 414132, 4297974, 816064, 6883124, 361621, 312156, 8242630, 4045983, 1460531, 2131981, 1725953, 3195606, 2586248, 1796190, 5530168, 3436868, 310572, 2511016, 7333394, 3323451, 7803311, 4190592, 2752182, 3860391, 4549102, 1290084, 4314224, 922945, 4091531, 4915001, 6436971, 5932454, 2544184, 7396457, 835840, 3382244, 7389879, 635017, 2760648, 6791714, 2537546, 5277626, 5776895, 8119096, 2905620, 5878144, 2162821, 4086718, 5232551, 3791036, 575572, 79652, 3061560, 10169, 5045285, 6889515, 1314313, 5727032, 4377203, 3658512, 7751939, 4298046, 6035101, 8280926, 824643, 6109221, 1467980, 6715773, 2775400, 7850822, 2336102, 4546756, 6531103, 4659829, 121669, 6385455, 5578285, 7267435, 2991636, 3910849, 1731402, 190145, 6768672, 3048706, 1035097, 3847060, 5157411, 5388569, 1053009, 7967447, 5794735, 6732198, 7000054, 1591767, 393872, 6981365, 8181315, 6268675, 7043146, 3368442, 6026469, 7394554, 2367358, 921191, 5165479, 2595740, 1800975, 743306, 7937038, 4757766, 1131609, 6944602, 5117214, 582236, 7902839, 8360969, 6692182, 3401117, 6254941, 571817, 511880, 7144077, 3920437, 7877137, 3239495, 578250, 4599243, 7831383, 3816253, 2780086, 6829963, 415086, 5822003, 4533962, 7456875, 116881, 2762430, 7834877, 7704653, 6818103, 103596, 5190014, 6148083, 6658739, 3215439, 5164694, 3554522, 4797486, 3321309, 7519455, 5640373, 780600, 8000203, 5282971, 7531284, 7552476, 201957, 294272, 6036208, 786761, 3712035, 1594931, 8240861, 6084702, 5792498, 4484461, 4662068, 574513, 2610169, 656695, 6174535, 8068033, 4497724, 2614837, 7393824, 6241256, 5962774, 769542, 6982963, 3759844, 1148852, 3360040, 4321594, 4234060], -[4755044, 6675360, 1494904, 1904965, 8157688, 867275, 3276476, 2997980, 4898555, 5056777, 4051377, 1769575, 2186352, 3761653, 6278792, 1157643, 3469586, 1107451, 7414619, 7314829, 3792074, 271094, 5717886, 7322613, 5136910, 806282, 5725234, 1019742, 2977625, 1600557, 3630010, 801060, 4250613, 5480033, 7810245, 4616050, 6638059, 2351463, 1409205, 3762634, 1549903, 6974169, 2649679, 8128674, 4328261, 5218975, 2321504, 5018209, 6435642, 1104256, 6395020, 1486237, 3209737, 507266, 2404431, 4753634, 7185357, 8012385, 4533324, 5984263, 2168555, 4928921, 1007553, 5815535, 955558, 4701064, 7441599, 3255929, 147844, 5809197, 41406, 1856476, 2772956, 6284336, 295847, 3092608, 5572286, 2792956, 5788440, 3788234, 7557303, 465738, 4806169, 5568, 6576260, 5389550, 3511165, 6186233, 4271184, 7687124, 3541595, 1969282, 2989015, 6872929, 2997260, 7804010, 917436, 5542211, 4378312, 907764, 7136179, 1785919, 4926918, 7434781, 2114271, 4597382, 157503, 5459059, 3559167, 5884903, 3134001, 5663735, 6435653, 281641, 3551478, 3119733, 6939856, 3966313, 5097819, 2868637, 2322371, 2512514, 4972668, 7514111, 6392992, 6188345, 3736878, 208545, 1413456, 2061460, 1830499, 1157829, 5336461, 6177668, 6154387, 1311819, 8257554, 5973913, 3028451, 6343325, 3442706, 511233, 7706890, 6409733, 5887777, 1236588, 4520766, 6926744, 8261428, 2633607, 7401423, 6302918, 8279339, 6794742, 5188074, 6118317, 2042050, 1145177, 5540023, 651677, 5057957, 3716215, 5864835, 8134076, 6037833, 2106319, 541984, 7373906, 2602536, 410794, 6638745, 2203565, 5621249, 4281423, 367312, 6724086, 4235616, 3425776, 3908198, 5655780, 5452033, 1071150, 3752662, 7355598, 710931, 6208742, 7527552, 7708297, 6859659, 3028897, 8073572, 5170357, 8334676, 4423363, 536577, 2737969, 2564938, 7502348, 6999103, 4115790, 5821048, 8200651, 4118093, 3220367, 1038132, 44575, 6432576, 3727437, 6589918, 2318186, 2521457, 2481342, 1152536, 1702922, 3608924, 5464428, 5656499, 237340, 5993764, 812679, 1361983, 1832031, 3869884, 777995, 1657475, 3825481, 1897940, 1481589, 4730321, 7994656, 7933153, 3980415, 6770064, 7185850, 6995215, 6686307, 2705536, 7856472, 7704707, 7106489, 208737, 5343917, 2262330, 7955168, 8010568, 669616, 7861519, 562467, 6085618, 2926411, 1952808, 2859925, 3554261, 7436358, 4285336, 4458805]], -[[6523172, 1873180, 1689838, 900545, 3463637, 7117162, 1381380, 6971617, 3893897, 4149288, 7746586, 2740825, 4617499, 3621245, 2116001, 7353587, 6604683, 4428943, 7230155, 5625154, 7369059, 544887, 4588282, 621992, 7189186, 2757940, 5171285, 1404120, 8372463, 68879, 1022528, 121488, 5006207, 7066843, 3361552, 7272187, 2744977, 6148117, 8207472, 701748, 2341919, 7881734, 7211732, 1374144, 6510897, 2256331, 681387, 4340418, 6138902, 505185, 7996157, 4581893, 8084525, 5170653, 3862479, 6773158, 6520204, 2464381, 7477050, 4190468, 5231983, 2014650, 6935308, 2771662, 5377375, 5021327, 6888985, 5140899, 6959774, 2645158, 4450539, 3891501, 6417219, 4692755, 1811697, 1709236, 4785453, 440108, 3025779, 3374437, 5671096, 6576765, 7979103, 217306, 586416, 2110724, 7239820, 5709166, 1153503, 7525741, 6993922, 6341373, 1179091, 2368054, 5953867, 5647525, 2521708, 5748394, 6381118, 6192926, 3728914, 5488099, 406191, 319632, 6719655, 6351191, 1053537, 2426135, 125092, 2208590, 5711638, 6381249, 2843129, 6765410, 1281648, 4753615, 6072535, 7609686, 2898888, 2536845, 5557207, 7710255, 4888320, 7623795, 3430125, 4371129, 705990, 4855603, 4013310, 571145, 7527814, 2327452, 3862327, 7917971, 5040881, 7964652, 1574767, 3144765, 1688101, 6625819, 2732927, 2534105, 1813389, 4410191, 5090510, 1533271, 519348, 3132728, 2146074, 2411977, 3973868, 8115346, 3217323, 7126365, 6731366, 237482, 7858368, 7009180, 5118920, 8075415, 259620, 6483582, 506345, 3367627, 5609856, 3856455, 1595762, 4763366, 7222453, 1923877, 711552, 4217634, 4923617, 5323730, 1564311, 3241595, 4128189, 7495514, 4022248, 4182760, 6535716, 7814569, 1918843, 2597899, 6093117, 5834406, 3768614, 6545194, 7059836, 3279210, 7085689, 6257326, 3488245, 5645446, 6003072, 394008, 4887976, 1122786, 6000568, 5032931, 999856, 522796, 4020096, 4522305, 6376690, 3012989, 2306783, 2608337, 2264480, 4347020, 7065816, 7167465, 7680523, 2466086, 311504, 5844496, 7656963, 6061481, 6897698, 7471520, 2033733, 1037757, 1238363, 4063111, 6278084, 4333761, 2209790, 3782143, 361867, 1586494, 5606396, 6006269, 4116984, 3464551, 41071, 8161924, 5667108, 2901597, 4937793, 691036, 7672681, 5281960, 338756, 1283467, 2331273, 7135025, 839407, 7073291, 5572690, 3797036, 1212146, 5140424, 1442667, 373456, 2145125, 693501], -[6982380, 635923, 7492005, 1591032, 593936, 7009808, 3656893, 7697568, 4859818, 3163348, 6706986, 2053700, 3542660, 2426664, 6651409, 4786180, 897578, 7614508, 1532906, 5845324, 1240291, 1775388, 3201040, 2548775, 7623923, 3967083, 4449439, 3639514, 179876, 6827335, 4102432, 776302, 514150, 3188636, 8266724, 7192700, 7703392, 7724631, 6292077, 885901, 6745081, 7990152, 2865848, 2393445, 7712910, 513496, 4716890, 1118694, 924196, 3134733, 1131866, 7888134, 832542, 5122170, 5404616, 632277, 2623190, 7188050, 1061362, 3440341, 6328305, 6549353, 1910321, 1611483, 1459991, 4129736, 1175542, 2880063, 7661620, 6991078, 5217901, 770635, 2707306, 4287479, 4079002, 5208348, 3177778, 6389758, 2321056, 6809030, 3078661, 5304714, 1381146, 6676205, 610111, 2654179, 1741687, 4256583, 7857788, 6641187, 4580518, 6552474, 5321275, 7661723, 837738, 7972607, 3494865, 1619470, 1512981, 3473560, 5770141, 1857577, 3367273, 3884112, 576734, 5762646, 4695684, 1970194, 4440986, 7435117, 5706880, 7267666, 5238240, 2835448, 6348987, 7437802, 6509475, 1923958, 3645126, 313048, 8042199, 7989500, 3798250, 5481844, 5952536, 5280518, 2623015, 4755240, 7333301, 1125228, 1273838, 6591664, 4829914, 4682931, 1577987, 3118923, 7677663, 1425424, 1653881, 1169770, 47982, 3580203, 6548560, 1962922, 5795517, 77495, 4009653, 680039, 7821275, 5783084, 2004330, 6288789, 785763, 235753, 7149020, 2021062, 4351210, 681862, 3086272, 6443426, 1957875, 8190374, 4629028, 5223514, 750961, 3538658, 7714721, 1734051, 5222159, 1492753, 8228610, 5321490, 2769933, 6565481, 2809241, 4079231, 8183466, 6196399, 7237852, 3494845, 1307094, 1975638, 3765556, 2286312, 6106205, 7716682, 207687, 5243318, 3678858, 6957087, 333662, 1216149, 3504204, 39075, 419453, 7566062, 6689681, 5146198, 3768009, 1127125, 8248436, 5067418, 3156528, 1609251, 611563, 5887228, 4516424, 48228, 3143788, 6540766, 6180614, 993914, 6335378, 2092208, 2055421, 5109509, 594238, 7953071, 5160848, 2901885, 1703810, 7805839, 4987027, 5581403, 6880494, 2044698, 5151845, 4291901, 4810950, 8207590, 2075473, 3672778, 7731727, 2305166, 5894040, 3780884, 807696, 5845190, 1056345, 2161623, 1367150, 7004803, 2624597, 5909826, 3346533, 4239956, 3509369, 6388125, 6561158, 1739575, 7938360, 4248765, 4095750, 425723, 1035239, 1568819], -[7310371, 706549, 1367939, 2495834, 7765113, 5811361, 5398914, 771191, 7444074, 4431490, 4347748, 4962816, 5904426, 4620841, 5697133, 5020011, 1162369, 3646975, 6438705, 1339776, 6791310, 7665993, 3205846, 3401609, 6414587, 1942816, 1768686, 5427072, 7978938, 8137151, 3215450, 2517082, 1632340, 7910368, 6087263, 2537, 4487216, 1509331, 3118667, 3305625, 5947501, 7587963, 7270055, 4072691, 3421070, 6707207, 3150211, 7910561, 516753, 1948225, 463420, 8333030, 4024703, 7577369, 1424531, 4660506, 2007521, 8254145, 1438539, 4272591, 1944836, 1829864, 5166409, 7792035, 6341046, 5069930, 833712, 2194106, 200611, 4189986, 8245688, 1817270, 1487253, 4138891, 4396833, 6633603, 7724057, 35032, 6807484, 5930402, 3599801, 2316088, 5671850, 1827295, 6938643, 924110, 1449054, 4382176, 7446163, 2854247, 8312521, 2646722, 5806252, 1959320, 4135587, 2560005, 4052879, 7012367, 4487325, 96845, 1285370, 8379563, 6231811, 7937792, 1113288, 3843708, 593771, 1771337, 737843, 6708467, 2718002, 7191276, 5623545, 4410335, 6050597, 387489, 2458564, 5160591, 2512361, 91787, 2139877, 6722489, 4495591, 4060814, 290011, 4530373, 5913446, 2526511, 7414552, 8001253, 3013755, 7448892, 4844373, 3703551, 2455592, 6343996, 5187276, 6779613, 1003123, 1904579, 2875166, 4714151, 4745878, 7802812, 4041959, 7278086, 7646179, 8299599, 2999439, 3237636, 6017964, 8143085, 5689117, 3480612, 426791, 7821298, 3484675, 2867530, 3182395, 8235288, 1129300, 7722880, 4370520, 7323640, 810395, 7760119, 7282437, 7854282, 5485369, 8240933, 450423, 8277094, 5513532, 3741329, 5209736, 7028085, 6600361, 1774329, 2279705, 7260367, 3169769, 639998, 1216093, 295202, 6675241, 4305240, 7572719, 499132, 4076766, 3966737, 3533298, 387666, 597638, 5714638, 1705798, 6994905, 7725599, 1125453, 7976269, 6528291, 6145594, 2098897, 3563371, 2811796, 5183596, 980740, 2202937, 4517523, 576137, 2173657, 5727012, 5918359, 4597557, 6560115, 7583981, 5346288, 181910, 1602223, 7839868, 6929593, 961918, 64730, 3724461, 353507, 7849199, 2324581, 1397497, 2272745, 3174922, 7226428, 6828485, 3655179, 134736, 6067457, 1119725, 969660, 6171146, 4566372, 1047942, 5440513, 6980013, 4873027, 6635985, 5458837, 8154378, 1549166, 4571202, 2667576, 4357707, 2351364, 1719483, 43861, 1624663, 2146475, 170510, 3973132], -[7572117, 1253053, 1521143, 4691111, 3353716, 4501662, 8355645, 937062, 8069748, 7378539, 852798, 3673531, 2886408, 1140591, 7620352, 7883288, 947920, 1427313, 2796741, 2622448, 4864492, 7117479, 6757451, 7900152, 3947009, 7244012, 6221980, 3743761, 4597103, 5832177, 7093836, 270862, 2288242, 2573131, 1850342, 1263627, 4823819, 5893864, 4585582, 1152561, 3521901, 1980164, 6112107, 7721508, 4468888, 4847198, 4263499, 2265200, 5028418, 2330718, 3952337, 1439195, 3065237, 56760, 5515918, 3178691, 3505133, 1987494, 3362660, 4336528, 5031357, 5727143, 6511908, 5461006, 608821, 2078486, 998869, 5016552, 401662, 8333357, 4953522, 1638230, 6485867, 3113916, 4804154, 2999409, 3428573, 3485718, 4161227, 1810500, 332486, 8021906, 500160, 7844795, 7990121, 4486389, 3194349, 6149543, 8088688, 7016343, 7120408, 6750768, 4230873, 4350628, 5335372, 7667783, 7307875, 4095154, 3268190, 723290, 2156524, 2993112, 6611996, 1241628, 3725385, 3907302, 6698269, 4491850, 7734784, 1633354, 542823, 3777742, 4704867, 6155801, 2257107, 5403549, 84866, 5328163, 1599677, 5544260, 3207706, 5301892, 6141149, 7512871, 1991492, 6017197, 8104295, 7434585, 8316274, 6982727, 5255185, 2579040, 6394242, 3796377, 5316192, 2705928, 7848838, 3281479, 6398097, 1238761, 6947072, 6854933, 227021, 1112895, 6774390, 5882830, 4950176, 5202592, 5222245, 2413471, 154293, 5201716, 1465309, 3452017, 7871780, 4808373, 8325749, 7572959, 3448419, 3826067, 774155, 8302317, 6549089, 5841210, 670846, 997833, 6950270, 563660, 4464570, 8361225, 2711760, 4319159, 6714512, 3760397, 7867249, 1835, 6383668, 528107, 2450065, 165618, 7424851, 7003317, 2882470, 2800621, 1362327, 7684242, 4403375, 1798797, 4629927, 6266039, 6282644, 7285127, 7974624, 2866874, 5487618, 828591, 666319, 8276317, 4471427, 5200429, 5395964, 6317235, 2752838, 3827927, 3232832, 7379068, 6468101, 8007354, 656103, 2508436, 3055674, 3036559, 2929507, 3632908, 3037157, 6131940, 5301907, 5692611, 4233474, 7577331, 2999170, 3652774, 7794407, 5971301, 2722566, 3329514, 7584156, 1590306, 6848635, 8155296, 8156937, 4743661, 4046968, 5419597, 7234274, 1111835, 6337004, 5832518, 3889218, 139182, 7385096, 6440278, 894858, 2946162, 6973543, 4483978, 4789703, 1896722, 1746562, 6335459, 3045809, 2096312, 3605855, 499165, 7720122, 6975320], -[118516, 1701140, 599308, 1221094, 5744468, 2586747, 5690361, 3557963, 696712, 7304523, 7783122, 1306740, 244830, 2761209, 4634144, 7749366, 6236919, 3772784, 1213472, 3458005, 3082425, 7608576, 3887933, 3191479, 6843095, 4856078, 3794367, 5529686, 1581629, 5971730, 7710365, 3189731, 450164, 5125361, 5275263, 1955730, 7142828, 6426910, 907272, 1665753, 3812512, 5026948, 2603039, 1868533, 3003079, 2699370, 6288805, 7537660, 5103557, 4469383, 6373168, 1249787, 7159692, 1606921, 4521974, 4371036, 3840235, 5621837, 5659225, 8062662, 3390586, 4291120, 8290930, 3432876, 7327471, 3688776, 275997, 5709026, 6531345, 721412, 3554747, 7073522, 7785785, 6979394, 3427120, 4168153, 2523869, 5293930, 7126262, 1127936, 3647939, 4768160, 874386, 1332506, 5497475, 4975907, 2577246, 2840556, 1446802, 8078215, 6943953, 3816198, 3180868, 3043881, 7634863, 1285288, 1695970, 3083110, 297652, 4702643, 3390360, 3073783, 2581836, 310761, 2956774, 7609158, 7377193, 6465622, 8208283, 136904, 7941230, 7917095, 7547283, 2822073, 3694226, 417443, 5160017, 4983865, 6198006, 3871583, 7561792, 452376, 2845841, 632912, 2874930, 1671148, 6970221, 7590436, 5759185, 7243995, 5408005, 2926498, 2417507, 6302695, 5323371, 6658311, 666840, 7809459, 111268, 976713, 7530622, 4663307, 3591750, 4784230, 5003234, 4720706, 2590581, 5639507, 78662, 923664, 7531965, 5221683, 1026813, 5151658, 2921952, 1724377, 8152543, 1989110, 6087939, 1732249, 2257648, 4347410, 3927497, 5144407, 4598004, 4508672, 2156011, 6975380, 7070411, 6488909, 6608994, 5148434, 2843489, 4712749, 5943749, 142056, 2619958, 4876111, 5133304, 5251680, 3961849, 2539820, 4092292, 7629652, 1603165, 4270595, 7335930, 5144815, 6042312, 6898285, 4632639, 724692, 7301590, 3609164, 755919, 5698240, 2131169, 3577397, 2905682, 860818, 3512723, 480678, 1849757, 5385443, 2519918, 1054496, 1605802, 209889, 99407, 7510775, 1798173, 8240317, 103462, 7635741, 766903, 1541891, 289150, 5508190, 2470271, 6679918, 569989, 8240794, 7916176, 4060843, 387397, 7852328, 1974494, 2229841, 1805806, 1100489, 3344896, 1126470, 7084346, 3432907, 421239, 4992535, 4052937, 3098120, 3326669, 2139590, 5146057, 115218, 7537843, 105763, 8014030, 6291251, 4863378, 4802356, 2115898, 6179529, 3547290, 4908768, 4896060, 8124247, 5156850, 7394368], -[3168291, 6245369, 737608, 6022978, 7531545, 2986099, 3209564, 2448067, 507269, 4705925, 4924756, 6752904, 958635, 7941353, 4721544, 6174542, 4784793, 4296995, 6895380, 3657343, 7409177, 1640606, 3436639, 3376008, 6766614, 2350792, 5571701, 895335, 5147900, 6834486, 5946324, 5960585, 3748126, 4106383, 707328, 4370840, 8286591, 1843452, 8098092, 2646617, 1642413, 592572, 3965515, 1551467, 8164577, 2996823, 2382529, 4824121, 8274771, 6027851, 4854744, 2478254, 1065923, 3028315, 3143780, 1495512, 1684331, 4462634, 3253567, 5305819, 3932555, 2340807, 4076775, 1028604, 5826768, 7824189, 1377853, 4719840, 283359, 8345480, 5898545, 3391203, 6042494, 8255428, 12960, 6096030, 4973437, 1634197, 3853500, 6234473, 7543393, 4120920, 5953292, 3289093, 471191, 1752375, 1271208, 8024184, 274891, 8010954, 3841070, 8001143, 4942133, 2406732, 5406272, 5940372, 7473585, 7509826, 2687158, 6612458, 5597765, 3420932, 3458466, 7450482, 1233315, 2097241, 893624, 804709, 5910418, 6834090, 6580959, 408772, 90, 8197952, 324925, 2694058, 4845499, 1048042, 2218046, 8212475, 2215339, 3650612, 4595389, 1219387, 2297582, 4463532, 1868112, 5760052, 4195181, 2961337, 5268643, 6669906, 4293157, 2047531, 6885230, 4670267, 2390933, 5521911, 1738698, 3818456, 2139844, 3325835, 4757039, 4763642, 6752210, 5454899, 414215, 1855210, 6229674, 3926428, 5687159, 7572382, 6518069, 3333465, 7370118, 2388419, 5898558, 390372, 5971330, 3540254, 2594861, 6355787, 6677875, 7651702, 1225349, 2346922, 5871172, 159477, 6606709, 1173069, 4138214, 1030553, 6451652, 3361311, 6149533, 8080044, 4966238, 77721, 3436164, 790393, 1826082, 7462085, 6668150, 6325259, 5057026, 2755822, 8233957, 6740844, 4206261, 1076441, 2538241, 7279929, 5660799, 3226257, 2792806, 6022886, 6300851, 909717, 5890493, 3978629, 7416982, 6498605, 3528982, 8217137, 376428, 7597226, 6832872, 3343679, 2683014, 5472315, 4450004, 6513520, 2180627, 5667099, 1194715, 3147420, 4156364, 6257933, 383298, 7207639, 1971557, 2305420, 3000065, 7750296, 4160378, 6490620, 6911912, 626141, 5371997, 2165093, 4993085, 2667351, 4980525, 7660792, 6395291, 8087565, 3777485, 2786777, 804110, 610331, 6237201, 7908597, 4987799, 7567866, 5115239, 1597752, 2812289, 1984042, 1723372, 4415616, 3604514, 6345982, 2183759, 6367358, 376832, 3201724], -[7439903, 5357115, 327054, 4634013, 5245805, 6677839, 2754449, 5373986, 4041911, 6024600, 7542401, 4626586, 3146630, 448146, 4179237, 3609775, 863678, 5331728, 2735740, 7381126, 7097368, 5404865, 4643439, 2274459, 4781921, 6759526, 6948856, 5338333, 4151403, 774423, 3361214, 6673416, 1586043, 6474050, 808344, 8220709, 222402, 7054973, 3318599, 8009696, 3719056, 1440108, 5901900, 6916830, 1006825, 6777434, 3592018, 5132743, 4831118, 87148, 2455217, 1685546, 2137185, 966535, 1296654, 6910141, 6026445, 7057466, 2280292, 5241075, 1703607, 5921425, 1386664, 8307537, 4098761, 1223009, 236489, 1287616, 4778743, 774170, 3993787, 2256700, 738065, 3297675, 3370461, 6284666, 5856995, 6476318, 1718352, 1843181, 4095977, 5458539, 2967252, 7594126, 5176473, 5941643, 6231213, 2427103, 5368632, 8224044, 3493093, 682584, 7078970, 4234003, 3722111, 254470, 5282543, 7280514, 5563849, 3311155, 2632330, 7530271, 976125, 7061178, 4801523, 7581886, 7842505, 5971463, 651487, 2339571, 4770376, 4574993, 3667083, 7053201, 7818115, 8211462, 6332257, 2586943, 4484954, 343934, 4986449, 6358589, 7072395, 5430127, 2959260, 6403006, 6492666, 2803240, 765759, 3225770, 7941681, 2376714, 8104080, 8205709, 3359856, 628356, 1385105, 7051350, 3870732, 6600979, 5303955, 453383, 1261573, 8272034, 6790332, 2715910, 6660553, 3140084, 4560148, 1056774, 3583268, 7679654, 6803453, 2525800, 6054617, 1674657, 4535412, 4809658, 7030226, 7100215, 4496984, 39504, 2854560, 7283790, 7361822, 7451872, 2573643, 4848455, 7305364, 1376607, 6322979, 259141, 7370126, 2424316, 566026, 6659840, 4840437, 1911335, 6671134, 6517998, 6568968, 2320715, 7594351, 3098026, 5881657, 7534642, 2040999, 692890, 7420679, 29707, 3471119, 3591559, 1773474, 490133, 5385606, 2579327, 6312590, 4754265, 639468, 7890670, 430327, 7762685, 4666295, 4095330, 3534360, 5310560, 7977655, 3793424, 927958, 7730229, 4840707, 3523486, 3211341, 448265, 886079, 2132557, 1760123, 8284689, 6768148, 2561338, 8019813, 652153, 5355226, 1635151, 303692, 5959752, 2715389, 7988359, 1040846, 5950327, 7215096, 4615872, 4090898, 2448027, 6637646, 845901, 1599335, 1521050, 5262778, 7276699, 8297614, 4309034, 4258585, 5324160, 5168238, 5775244, 5197218, 2275555, 2828861, 8290759, 2405349, 2379085, 7376963, 4041328, 7734720, 3341052]], -[[6560282, 3201050, 6162746, 366304, 1923724, 713224, 412092, 652929, 7926524, 3232024, 3951287, 4513750, 158779, 7149944, 3323686, 7916538, 1177586, 3160845, 4650754, 4967630, 1051204, 217849, 7503958, 6026512, 7514606, 5060325, 7807763, 668545, 6281429, 5214618, 1677455, 1213931, 7331667, 312422, 1710578, 1280291, 4852556, 7485639, 5727946, 1146081, 1775233, 2994313, 7661719, 1056810, 7651951, 3736852, 1610476, 5098180, 4578553, 7164983, 5149429, 7617923, 2109948, 1997014, 5700209, 1930568, 2300255, 4083009, 7905876, 5447546, 4474779, 406612, 5119676, 1256407, 4825561, 6277668, 4642881, 5197110, 1809884, 7838741, 4945197, 192354, 134124, 1162718, 4809684, 4319267, 4824432, 1669116, 8108257, 352908, 380357, 3017386, 6248552, 1282196, 2835283, 4066238, 8192039, 6102006, 6877852, 1206456, 2975396, 3886703, 4769727, 6802954, 3768746, 7418331, 622962, 6295702, 7390012, 7266925, 7050045, 2348297, 2890537, 2907402, 263289, 7583839, 4830838, 2248858, 5040623, 5148319, 1217998, 3559138, 6435247, 5184465, 2064548, 6027755, 6961751, 7171968, 4199668, 3180118, 740831, 2047095, 491081, 4137584, 4324769, 2901873, 1432259, 2470050, 7653853, 6148490, 1824094, 1635570, 4313342, 4756063, 6737481, 3868817, 272519, 5028493, 968290, 2600955, 224282, 5119054, 7748076, 6115910, 2701431, 6118639, 7824360, 7229580, 79699, 2901219, 7804097, 5184886, 7714243, 3049729, 1646078, 1327799, 5760164, 3082499, 3010471, 5926887, 5864222, 7808696, 6091985, 4272941, 1900161, 3011039, 7413830, 4527955, 1754248, 3443919, 6816091, 5684205, 6295187, 6197853, 5614749, 6749270, 7555531, 3721837, 6744895, 4783292, 4685687, 6905202, 5421658, 4272954, 2679245, 56709, 5208951, 112821, 6375689, 535815, 7156586, 846437, 2437974, 6523789, 2690123, 6801002, 1510521, 6320204, 3195999, 1599784, 5083254, 4809099, 2276365, 2923868, 2604015, 2323378, 6165264, 4450039, 3479176, 5453761, 703644, 2058154, 1954661, 5537492, 4892079, 745964, 161841, 5274413, 5755791, 4115445, 23570, 5145996, 1456752, 2467497, 6417412, 5657864, 6662120, 821744, 3288811, 3113478, 5895543, 3353452, 6093921, 2586431, 1274203, 6228522, 4909353, 2920109, 5114903, 3480518, 5705868, 2013275, 3859385, 5811558, 3503564, 4653657, 6627708, 7719129, 6684209, 5536508, 4432697, 5125348, 5771296, 7851533, 7664682, 4324326], -[3549515, 6494746, 3129181, 7697556, 5145541, 3330514, 1750921, 6470665, 7733691, 3138866, 1333559, 8083934, 3914711, 5910853, 35756, 3295307, 5094890, 2558796, 1906301, 1861664, 4539512, 3030956, 3676409, 5359921, 1452568, 2036977, 5853752, 2844278, 4491862, 1605422, 8205650, 6018825, 6802484, 6050459, 6233724, 424085, 4912878, 5410120, 4238733, 5551587, 7547196, 7037901, 3318811, 5268791, 6913557, 7643662, 8138304, 6730211, 7275627, 2368472, 2037688, 1267784, 1280693, 3247899, 112610, 2224819, 7394675, 4058518, 8111282, 6445901, 5792303, 425620, 2049980, 4194185, 8169867, 3808044, 4574434, 1939730, 1148563, 3666463, 4630212, 6919167, 5766771, 4494096, 6788740, 2350746, 2701172, 2147666, 6259192, 5179971, 8124687, 7659220, 3362407, 5232896, 3085366, 3343734, 4744503, 2189818, 106357, 2220841, 2710933, 6238786, 7362111, 3895306, 4732040, 5830221, 2789243, 4782928, 7733404, 1766193, 5773267, 241176, 2615777, 5522403, 4721980, 1704977, 3690165, 8044162, 4401302, 324367, 5566510, 1031937, 2524813, 5115913, 6360475, 2978829, 2346795, 5174050, 5092469, 7106751, 1148775, 1110921, 4330366, 3084559, 4258400, 7905984, 1908476, 790609, 8267670, 7659381, 3863407, 3641413, 3451373, 3464533, 2808940, 7445327, 1637609, 586986, 4849587, 5785218, 997168, 2091706, 7644460, 2105709, 2044436, 3893111, 7060630, 7312762, 4159327, 1199376, 7030765, 5939347, 1795539, 6567224, 206868, 6231455, 7623327, 7144320, 5834418, 4754025, 5262100, 7291200, 1693999, 2854773, 4580861, 128181, 6880561, 1896793, 4882624, 2333334, 7374542, 8032151, 1639314, 286923, 4663847, 4551305, 7596481, 8352970, 3802016, 2899496, 1718012, 2546977, 5791288, 8213148, 8040930, 8181498, 2123029, 821310, 1314412, 7774407, 4462103, 7350760, 7335634, 3547042, 1115075, 825586, 6308028, 4498627, 1114097, 5169099, 5584996, 2893974, 346964, 3035602, 178209, 402825, 1972151, 5717285, 5391075, 4794362, 6887588, 1597337, 7742421, 1002780, 7782371, 4647518, 5934161, 2881732, 5956686, 6081180, 7983039, 3305882, 4162806, 4530121, 1552757, 6909535, 6424246, 6541222, 81972, 7896125, 6392519, 5393412, 5048687, 1394383, 6435344, 1370492, 4809669, 2654936, 3581835, 7601325, 3038330, 539564, 2256290, 2994168, 4131171, 5523053, 3470778, 372001, 886831, 287638, 3956532, 3591262, 8166346, 787099, 3437783, 7604186], -[588114, 6815989, 7086444, 3198499, 3952454, 3345439, 2331638, 6548655, 7968333, 882342, 5578940, 6176841, 330537, 1924344, 7839211, 5997913, 4325608, 3441774, 114720, 6594369, 815332, 718499, 642525, 6622078, 2830294, 455333, 5298258, 4912099, 7251169, 3846091, 2158209, 2931587, 6541629, 1381907, 3222695, 752702, 5972813, 2574483, 6661348, 1587848, 5021031, 1479395, 6056794, 3303769, 5575522, 1497161, 4314312, 3367653, 8023968, 6227712, 7257841, 7281098, 2766345, 2315031, 7510492, 2623502, 5330916, 5250918, 5979498, 7394954, 1001745, 3384132, 419249, 31152, 5821198, 5160876, 5627649, 646730, 508753, 6027486, 1015639, 2658772, 7064624, 6550443, 2531606, 4022923, 4647343, 4967335, 1933695, 6824440, 3575917, 4804026, 6251376, 4549803, 3582621, 6664956, 8112585, 8054790, 8330231, 2554894, 6518494, 2500318, 2557633, 6158188, 1908731, 3301488, 7479403, 908585, 4609871, 3145515, 1447643, 7239551, 333917, 2270904, 782848, 7679280, 6318182, 5959214, 119642, 1502843, 5639231, 52057, 2021566, 1640884, 4584855, 853912, 7825281, 2061408, 1287255, 1808993, 8061031, 2838399, 6600647, 7584074, 2176519, 184492, 7713217, 4956266, 1187744, 3666271, 730100, 8167666, 8046322, 5655528, 2684631, 5551754, 323335, 6307861, 2309627, 3886362, 6730917, 364677, 3880599, 2900880, 1459471, 1394302, 5024312, 8196976, 4976569, 3698636, 1188165, 4575409, 2998756, 6664772, 39811, 3981539, 7495584, 681683, 1924400, 1836052, 5954042, 3818394, 2875786, 970803, 2266563, 3087011, 5734607, 5137737, 4376315, 4066901, 6758965, 6998501, 8375955, 6928731, 5412174, 6587240, 8130609, 8101276, 5036869, 3339559, 4152853, 97987, 7473468, 4176415, 1287068, 1016236, 1319658, 3032787, 5352225, 716068, 1308371, 708341, 7258175, 3181936, 2792526, 2931361, 3202810, 1873169, 2955585, 1827005, 5338496, 3629476, 4377627, 5126229, 64383, 7904221, 475881, 47330, 4744478, 6363917, 8328167, 1279047, 3324956, 2290916, 6911316, 3405748, 7432798, 5404720, 3717570, 6873828, 1731585, 8320614, 4406064, 6914116, 1776296, 566695, 4447477, 1817857, 1973033, 3298231, 6226485, 1672811, 7919266, 6398000, 1258224, 485001, 4999071, 1954761, 2601742, 796689, 615301, 5047246, 1582302, 5102124, 4217785, 3175274, 8099631, 4691275, 2042231, 6676074, 6458548, 2411345, 2962655, 2084640, 7669048, 4292416], -[1380865, 8028581, 5671670, 4976794, 6498699, 1266971, 5520359, 5895001, 5820258, 5649259, 7080019, 6841930, 1365551, 4721654, 6724609, 4031316, 2092754, 3462442, 4452673, 1271106, 7652386, 2395974, 3032908, 5195933, 7289516, 7311720, 8286632, 5624601, 4796102, 3211157, 31666, 2184719, 2112046, 826531, 5886792, 852293, 446030, 4572823, 2279101, 5612674, 8234702, 4978831, 4372678, 7317068, 4005342, 1727162, 1591331, 1415010, 915332, 5270605, 7026843, 7692875, 876000, 5187031, 3401464, 7965905, 1891477, 274468, 5447791, 8365546, 1906086, 7341213, 7284684, 7825544, 7723898, 1876236, 2868739, 7466871, 7003265, 1060890, 4111841, 7219399, 5287445, 3777307, 6984165, 876148, 4196809, 2473937, 3712518, 7730788, 2712692, 2230510, 6416727, 7686888, 3153255, 6111193, 913279, 5598464, 5144241, 6638749, 1365568, 4680250, 6705771, 470257, 117559, 3994457, 1442799, 5839389, 4262516, 6697587, 4364607, 1938605, 347752, 3713621, 357056, 6179396, 1391890, 2919942, 4287611, 4888739, 4633957, 854259, 1857887, 3521209, 215045, 4532312, 7871630, 1720750, 7068823, 6856018, 4183564, 2960769, 2880063, 1139559, 317646, 7633491, 6519059, 5337344, 5321955, 8308206, 4977111, 6485918, 7775842, 7244728, 3847385, 4465550, 6836177, 758973, 5237611, 6361393, 6645784, 4876701, 2343895, 8115585, 878759, 3866096, 1837288, 789913, 6216065, 3295628, 7624795, 2312403, 7267475, 2945068, 5870992, 5256799, 7875436, 4945643, 5335515, 5952415, 6680110, 2686598, 1467845, 3479558, 5007537, 4078496, 6590073, 8037002, 3126999, 2521173, 3609739, 993251, 4905186, 8048901, 6995691, 987610, 519080, 2186199, 6185556, 5550878, 5553557, 8053190, 6671292, 5127336, 4971456, 1869973, 4213209, 394451, 2907184, 3889226, 1785032, 4948797, 1116911, 2202759, 739314, 7744411, 6460675, 1652916, 3112799, 4914797, 3634069, 7190757, 5090045, 3361830, 7365791, 385526, 5357961, 4394294, 6587636, 7818266, 2807567, 1341399, 4577711, 3619732, 634810, 8012974, 7939227, 5136622, 899984, 6860206, 2642638, 1559165, 874776, 4330217, 2567269, 6941591, 8056385, 7198251, 414535, 933807, 1559120, 8095592, 550669, 5304618, 1471941, 1175016, 4361767, 7891454, 2603398, 2070056, 2295626, 8065818, 4804672, 5800891, 6303411, 7804070, 5851939, 8013624, 640418, 2603179, 6848082, 4151413, 4267573, 474601, 7610842, 1367355], -[1184651, 6760422, 7321157, 3650876, 7785310, 4234663, 6428477, 2551940, 5353315, 8369334, 3454391, 7924743, 5938589, 3834955, 6858820, 3133116, 8194863, 3127777, 3397926, 1514597, 5909568, 2531198, 3244621, 3564834, 7738315, 7601094, 4430411, 3476583, 5030406, 2111007, 5768015, 654458, 3095355, 4827878, 3102944, 1960314, 4153703, 7461216, 7042487, 7539858, 5041445, 6112033, 1225691, 2991337, 8336802, 899478, 7345851, 3398708, 6573113, 7383585, 7291821, 966322, 6497494, 7245101, 3496540, 5115709, 8304049, 3622202, 8279930, 563023, 794457, 1184381, 5344953, 2977115, 3189450, 1640404, 6873797, 1052003, 3911176, 6861183, 2391580, 3659339, 1516039, 3526306, 5246000, 2579089, 2953678, 344771, 6795935, 4476297, 2440336, 2142356, 4298094, 933421, 2227861, 2530167, 2331794, 2415490, 1343216, 216091, 1532321, 3342594, 2396100, 6834414, 2316958, 4777194, 7538304, 5694405, 6534541, 4773150, 8061474, 2532780, 4968550, 1087998, 5029805, 6356220, 787610, 2961614, 7665715, 7962762, 8050452, 7983796, 4553075, 1664179, 4005666, 399220, 1957998, 2027801, 7312473, 1785556, 5357274, 859263, 1937161, 405964, 7981681, 4092156, 7535880, 501747, 8020917, 2376426, 7767258, 7641933, 1121600, 3079830, 4076945, 2047108, 1543300, 7452809, 6210992, 7100253, 8171337, 1909638, 7776092, 4062142, 1906484, 5416535, 1454131, 3016676, 8373910, 2450657, 7136670, 3572112, 6955355, 6610737, 2067288, 1986701, 8012590, 6059574, 5250749, 8105476, 859810, 5561655, 3716773, 3860443, 1799394, 2600020, 688138, 2715590, 2137092, 698224, 5005334, 7086287, 5431804, 3007034, 3642000, 6930815, 7983760, 2355668, 7328151, 2233726, 2443190, 1976823, 3576650, 3061799, 7341214, 8009258, 7108138, 2599588, 712841, 7701746, 7337136, 543992, 624351, 7834805, 5285592, 2987742, 4203956, 3283878, 5835504, 6195781, 1122664, 3519473, 4389154, 3725146, 1084972, 6344792, 220345, 4877674, 2884262, 114711, 6636685, 4185597, 3846535, 6697064, 1380662, 95168, 7997123, 5420903, 4880090, 1416251, 8312108, 6408429, 5122692, 5859146, 180887, 618213, 3650263, 3391112, 3314061, 410598, 3993794, 6458803, 5238126, 3233290, 1231639, 2281291, 7133825, 5197891, 2862661, 55176, 5754772, 1457308, 6998433, 6370116, 2157553, 6336055, 4401345, 5288328, 1200432, 2776871, 8283049, 7821315, 5997945, 980561, 7340541, 5998133], -[3867691, 3089308, 7176952, 274886, 2102231, 5857083, 980981, 2610035, 5447303, 1832203, 8205943, 1001719, 7783851, 3198494, 5267662, 3855994, 5446029, 230712, 7691428, 1289031, 2743096, 7910056, 1125798, 6146539, 2411467, 3967501, 2323086, 3849146, 7323274, 3545658, 1662944, 2690717, 2656594, 554410, 94676, 3700969, 104983, 1830255, 2110397, 5608626, 6837281, 7059281, 1917813, 7317681, 6201615, 8020912, 88185, 4877324, 2766595, 2420909, 3093780, 1284537, 4225983, 456030, 570885, 2147476, 4684220, 6498994, 1992604, 5565483, 1290324, 4483179, 1991214, 2018787, 6459723, 2447738, 5835425, 606716, 6992191, 5987755, 815408, 1472142, 1556487, 4827977, 5953349, 5388723, 7085823, 3173539, 2593128, 8199150, 1492884, 1153205, 1338182, 5127957, 6560307, 7280312, 149479, 7866833, 3847419, 5458138, 1344718, 6179557, 3020253, 2291684, 1620611, 788483, 217734, 2109316, 5191901, 5322241, 4337068, 6074137, 1662122, 2385046, 6181037, 39641, 145604, 623551, 3089294, 4692574, 141244, 783497, 5178564, 3408945, 2378824, 5095686, 6402470, 7057389, 4587559, 3226001, 2174188, 6422321, 7977141, 1504302, 7394408, 6140094, 1044484, 5392974, 5309413, 4025222, 2786500, 8218141, 768757, 4535499, 3813551, 7653226, 148043, 6888503, 3703024, 6621300, 4433601, 7516777, 5241591, 1015391, 6388006, 4194408, 6401018, 8142017, 7354262, 250958, 5959676, 4039571, 363390, 7352501, 8228045, 3517082, 8316112, 2083790, 1867771, 942995, 6835687, 6790403, 1385426, 916642, 1115772, 1227492, 122710, 440864, 4237758, 4652056, 7774063, 7078082, 856716, 596382, 7932339, 8140768, 4551386, 553142, 5783105, 4149666, 2786048, 6883390, 128950, 649209, 2278868, 3067188, 8163926, 6330567, 4055601, 3868939, 3511369, 955051, 3989287, 1425435, 838616, 8162308, 4363026, 2511771, 8354105, 2289324, 2248975, 697231, 5811936, 403569, 6695602, 7189027, 4747565, 5309632, 3943884, 7996533, 3018177, 7879973, 3438793, 2475142, 4506017, 5424502, 1334155, 3750172, 6324699, 3824655, 4735835, 6340232, 5036986, 5196904, 5979993, 2871866, 4440012, 1919701, 788014, 61035, 695323, 3920175, 7146697, 6664698, 5622277, 2567997, 1256750, 3214433, 5024675, 5425649, 3065938, 2887841, 547802, 3526363, 1652586, 3785163, 5059466, 1145401, 6135103, 1802951, 2593006, 605606, 1976537, 2969296, 5473653, 5727012], -[2516322, 8268791, 4157838, 6573353, 2404243, 4809871, 1415572, 8046432, 7832507, 6967614, 8084589, 2153092, 2160439, 7511087, 8271649, 6473732, 1004702, 6487182, 1755197, 6435522, 452625, 2603907, 5983017, 6687581, 2045096, 5515960, 7776846, 8197595, 6667866, 6652787, 7740728, 2910461, 3453085, 4249186, 5624977, 7124058, 6042319, 3531298, 6964871, 6009130, 5902794, 3671074, 7525313, 4326355, 1855468, 8175969, 727246, 8117505, 944314, 2935313, 4703999, 3810377, 7914788, 7813111, 6174466, 8366912, 1408324, 6327601, 6143422, 1138389, 7737373, 3433529, 1932499, 8339877, 5558649, 6278287, 1725675, 3999438, 6127890, 7715952, 6238468, 932047, 1703957, 6281378, 3291998, 7469283, 1708362, 5877947, 3768941, 3482958, 3090332, 2900551, 1786379, 1633004, 7756467, 5099838, 7150335, 5671424, 7356168, 7509229, 3579301, 1452172, 4023424, 3394577, 4828632, 1141998, 2048710, 5081215, 4998381, 1367084, 4886097, 4295759, 8367435, 1907171, 3791149, 6795566, 873371, 5125811, 1832655, 6240173, 6034658, 7339729, 2726713, 3065264, 2623988, 4220121, 2821956, 3022358, 5691894, 4509976, 675841, 4405404, 6756620, 1128041, 5730597, 1421086, 2469757, 1585728, 5481099, 7987560, 4368337, 8277552, 4021806, 4273646, 8345112, 1670273, 7307069, 4661457, 2083758, 2199525, 2849025, 2010259, 7765647, 374954, 596562, 4338587, 2020293, 4260659, 8312976, 7529446, 4227890, 4415456, 1025263, 405185, 191227, 3799070, 6972538, 142740, 1863153, 512161, 2906573, 1273568, 3666838, 2747054, 8245293, 1898586, 360662, 7158433, 2058819, 8377872, 6984663, 6917065, 4046874, 4756259, 3475520, 4457512, 296075, 2751983, 7121227, 6042687, 4490544, 1073697, 2211463, 4118255, 2878436, 301705, 8019051, 7148272, 4077673, 5637138, 7685623, 8313576, 595790, 5840138, 3044383, 6838454, 4423037, 6244324, 7195147, 7179643, 7100721, 2156755, 2891336, 1820211, 6370590, 3287287, 368374, 5276057, 8136797, 1432604, 2410061, 4458152, 6306542, 6622667, 648219, 3869376, 2793255, 7269797, 2293144, 1945458, 6826984, 4042670, 1131525, 6254350, 2980321, 417394, 4461348, 8136852, 7991742, 5713203, 6361548, 4451234, 684478, 5493737, 5307006, 4765578, 8191336, 3588572, 7871726, 412465, 2437007, 4353860, 1360131, 1437432, 1409484, 6549193, 4973950, 2990294, 4555338, 1296083, 1423009, 6169018, 7769478, 8373368, 1097601, 6560438]], -[[1416855, 1244121, 6342865, 7691165, 61692, 5986141, 7401239, 5863600, 2851801, 5853656, 6994019, 3356387, 5111802, 3957978, 1961477, 8126722, 7493644, 3613023, 8024934, 7089127, 8209767, 4617065, 1156382, 2711485, 2664853, 8162644, 4858359, 5249054, 1673850, 2811818, 5383948, 6422490, 1603657, 7957668, 7425726, 6071807, 5209185, 3897666, 7497174, 7933687, 784536, 5330227, 8276768, 2693234, 5380920, 5051418, 4355455, 459355, 622211, 179479, 5904134, 6216359, 6958193, 4044009, 5772515, 3473670, 4203974, 3341309, 529750, 5031857, 8248971, 4438328, 2507405, 6839992, 3887060, 7006896, 7566145, 3031418, 4320836, 138587, 364074, 7355229, 146991, 4851732, 1699949, 4194015, 5606046, 7498733, 7689899, 7084534, 123632, 580601, 6568661, 7079899, 7483101, 8052706, 228050, 6443600, 1165905, 5392253, 3960563, 1607656, 2437447, 4425571, 1202190, 6792125, 5217152, 5691123, 8302100, 2494319, 8021778, 6992971, 5504125, 5545449, 198916, 2095012, 8113205, 219573, 3130781, 4029414, 7735066, 2796398, 4575277, 7676894, 6872504, 55646, 3688773, 7499087, 2539121, 737840, 353764, 1789043, 6164097, 1537491, 6021767, 1105087, 6460945, 5723500, 4403060, 99349, 4582639, 5402826, 818937, 5812994, 7003379, 5890978, 870425, 7599881, 3525104, 1592883, 1386098, 7410459, 7608276, 1512182, 3562944, 4950106, 1015402, 6434072, 3572444, 697183, 7303902, 7274651, 6751265, 7478223, 7277052, 6615247, 6949745, 5551383, 6820494, 2098498, 6830885, 3075534, 3921525, 6684177, 1766234, 5905724, 7911604, 6447529, 6842865, 1584327, 3490531, 7148173, 7005182, 1877610, 498463, 1289919, 3228187, 7894284, 3856617, 6512081, 3941649, 1601003, 5223958, 794296, 5391196, 3069152, 1670910, 2348479, 3033172, 8224322, 3595794, 6522341, 2794231, 3255363, 939245, 4064757, 6868026, 7913755, 6308862, 5078820, 1440166, 3703577, 7114610, 4370783, 5273432, 2765665, 4022417, 7100878, 3281268, 4366584, 3478280, 4874955, 3718367, 6341252, 7086508, 5359540, 7604072, 2957172, 7289880, 2606882, 2383494, 4870439, 3753101, 5936945, 1130106, 4890784, 3646921, 2194741, 3063142, 1939531, 7452108, 3720205, 2245133, 8245297, 2343067, 6315888, 999805, 7939270, 6845922, 3253949, 7535338, 395564, 7118543, 8262971, 3193560, 3974787, 734716, 4883184, 8100688, 3501656, 8372756, 866918, 3912939, 630685, 7291427, 1101425], -[6464756, 711736, 6709213, 7865557, 6375591, 1485543, 4703147, 7936921, 2242085, 6819813, 3658831, 1068022, 3299609, 6534855, 6282555, 2220401, 5184470, 7778658, 5261876, 31497, 8282282, 7547366, 4499643, 6358915, 161875, 4372662, 3347202, 1335377, 962986, 638159, 7005745, 5176497, 7062724, 2098421, 3144196, 2853992, 2375594, 221785, 2469710, 1147230, 1605347, 7250816, 7635, 738260, 6391974, 4837746, 8269572, 1710664, 7677837, 3078084, 2802822, 6049258, 2060689, 5894411, 4485798, 4990150, 6556049, 8349367, 8083549, 6211102, 4536043, 1927865, 7603954, 4844931, 3511842, 7901767, 2987453, 1040781, 3300380, 3785905, 2244106, 3844454, 6065681, 875286, 901725, 1447812, 1454075, 2209087, 4566224, 2641054, 4664226, 7044503, 2907901, 5619522, 15945, 6491414, 3294380, 7855403, 1503768, 2517018, 7662868, 5577063, 565901, 8227092, 7834386, 4071581, 697604, 3225324, 6879809, 8212441, 7064852, 914071, 6635808, 7914132, 5999661, 2472779, 7078883, 5938287, 4525896, 3286465, 797441, 5121435, 6844183, 8089341, 6777533, 4401672, 4313878, 1782295, 2197072, 3879208, 1004022, 6638255, 7607848, 844911, 5613290, 2107778, 3601937, 7090359, 5642571, 2974518, 5977896, 3355098, 740591, 8036358, 7500501, 2383890, 5491408, 4137335, 4707631, 3721791, 7650689, 7834372, 7257687, 1104414, 8164728, 424126, 7057079, 982554, 3421796, 456716, 4384958, 3096385, 1203767, 6751910, 2198129, 6687063, 7114944, 3156645, 3923664, 8245694, 3230125, 5096148, 4175118, 7674836, 401741, 6719535, 3954303, 7535607, 6114881, 707366, 3720614, 3899987, 2982421, 2515717, 1647767, 8153554, 1080623, 2563678, 7734144, 6390882, 4032892, 6543545, 7190205, 7045366, 2802733, 7679671, 489932, 6164464, 2342980, 152728, 2915619, 6275564, 6587674, 7469193, 2127601, 4076300, 4068991, 6156442, 3948215, 6944247, 1299658, 8353476, 586037, 7606722, 6099682, 2483284, 503757, 1946033, 3232588, 5141017, 3848106, 4188602, 2887135, 6408521, 1929044, 5623900, 4124999, 6839935, 7646214, 7650100, 1172286, 476719, 1536126, 4996383, 6933525, 756964, 5622424, 729319, 3135099, 3196840, 361865, 526803, 6939463, 4709449, 4156075, 6121366, 8033388, 3363575, 3304423, 4498831, 7185572, 2190658, 1232610, 5988148, 2876804, 2557591, 4584204, 6766511, 2783031, 5188777, 2322330, 4374270, 2093177, 1545316, 5111136, 5006430], -[5849817, 1409740, 5486686, 444831, 694249, 6698493, 787873, 3079427, 2702129, 8320460, 6270177, 6950397, 3089861, 7787666, 1625940, 4461755, 962242, 6777636, 8001326, 1202442, 645133, 2441880, 6762279, 8260360, 1219783, 4798206, 3888428, 8353292, 2802273, 7896398, 2677029, 5285141, 6887782, 3292758, 789317, 1654710, 6859015, 6266076, 3878238, 5178619, 4437758, 126216, 7223634, 5758611, 3885346, 2073911, 5605751, 5545705, 4145292, 4550273, 2866408, 2087551, 8131149, 3670537, 4398938, 3599455, 5311172, 2420679, 6209447, 3851432, 5281705, 8053244, 4321982, 5046031, 3826712, 7702201, 8213721, 4748717, 739482, 5150647, 1428557, 3732861, 3436183, 6624124, 5321890, 1196402, 6298409, 6046471, 4892502, 3777602, 4750009, 3130605, 2072557, 7295730, 3870003, 4816584, 4902201, 2530739, 7723106, 5785460, 6190229, 1107498, 2431280, 7090234, 1549116, 7851327, 106763, 156373, 421919, 6040131, 5009725, 5245831, 8330926, 190343, 7293947, 7732268, 3108996, 6714905, 4062243, 1198468, 7981306, 248540, 809651, 7939220, 3142494, 2904613, 1238151, 3521300, 4411874, 1254130, 845623, 6284068, 6005995, 6912106, 7388413, 6919361, 866924, 5677158, 1400440, 3715304, 4695619, 3075395, 3362270, 2054771, 4348361, 6669519, 6194819, 3932970, 4341954, 1774674, 3675717, 6460668, 1149259, 2588291, 6686181, 591677, 7004797, 3042118, 20204, 3082896, 675557, 3247409, 4838568, 694477, 4462008, 8271309, 4188569, 5429358, 6570973, 1014750, 2168928, 1291070, 3132005, 1634052, 2034676, 3952640, 7966065, 8260647, 2733391, 5684091, 3295826, 4467753, 5224768, 6719505, 1764292, 3269428, 6780164, 2182883, 5128760, 8332670, 3822733, 3715748, 3574804, 5047317, 5702918, 1234608, 3988333, 2217896, 1220385, 1268040, 2752902, 5578898, 3569570, 1325549, 1279402, 3779552, 2644340, 8316969, 1862710, 1371761, 6726, 8178022, 5773778, 1620325, 3226860, 641410, 2435048, 2856008, 7815569, 2995934, 8146457, 8178032, 3709719, 3511782, 7033106, 969564, 1193570, 3434307, 4528896, 7589503, 536431, 3603814, 2790783, 4474437, 6862769, 3819027, 551159, 8079350, 959838, 1979737, 7606105, 6815197, 7112376, 2800781, 6058094, 3652150, 8212349, 5324213, 6870422, 5980014, 3179747, 7292980, 6391221, 4401099, 7427218, 6080222, 3194671, 3649322, 7975631, 3427547, 559851, 2895669, 1169992, 3295465, 360072, 7853803], -[2018662, 4444441, 5234908, 894674, 5040680, 6206295, 3273044, 1743001, 5428147, 4402165, 5595345, 2034197, 5597740, 4610020, 471364, 1533884, 4911833, 5720499, 1870429, 7126894, 7334594, 2756023, 1118792, 8123042, 2018743, 543986, 4998221, 2115139, 7860557, 1050000, 2330573, 3995461, 4115129, 7691108, 2059482, 586437, 611563, 8184718, 6726812, 3826816, 8205953, 1720676, 7079711, 8263794, 1903796, 8264046, 2187409, 1071182, 2858022, 1068744, 5771032, 7104028, 5973100, 5528563, 4422524, 7095928, 3614569, 1087028, 8105243, 2268638, 3454061, 1467962, 2295539, 7153066, 972242, 8230316, 4329852, 8305478, 231008, 5334926, 7736732, 3250187, 3933387, 3837210, 1448234, 3919522, 6000152, 4705704, 8100424, 6100007, 4340599, 3811603, 1123586, 6703190, 957434, 204266, 7540201, 4567959, 646657, 1770013, 3538461, 509265, 789753, 450470, 4511354, 5165022, 491946, 2802663, 4475535, 1778177, 2747021, 7684804, 2106443, 7157607, 3290015, 338784, 7113790, 575417, 7978204, 1845672, 5905467, 6113418, 8247141, 4110697, 5275518, 6495813, 5402206, 6101560, 2183852, 8305795, 1480098, 5223157, 179394, 877891, 4596113, 3848243, 7785546, 7425357, 2811537, 713270, 7279687, 4990735, 4085407, 6722097, 7573683, 6162822, 4956443, 3311520, 3672264, 3700573, 6821546, 6197097, 7043518, 2110246, 3051829, 1666017, 6021674, 7739671, 665610, 3507537, 971062, 1827281, 5771007, 6150878, 644262, 123577, 2184933, 95779, 1456182, 1468470, 6017552, 8281615, 1722984, 2169689, 4298362, 6508716, 7689894, 4856680, 1725488, 9233, 4516714, 6096395, 7053714, 7243416, 8098338, 1247353, 4701397, 6240392, 6000834, 5276837, 4386225, 270017, 5638388, 2583580, 6389780, 2130286, 2093267, 1216394, 2586234, 1058495, 8153941, 5781093, 927041, 155074, 4080960, 4953678, 3118619, 4944804, 177556, 8275821, 6041293, 2742470, 4048403, 3299339, 129093, 3518322, 5304643, 7549677, 6868216, 7967306, 5858227, 2193730, 7145363, 6912666, 3018005, 5003933, 1395642, 7976016, 7569070, 3992941, 3673614, 3118416, 1266480, 6901994, 1650712, 724328, 2025456, 8240004, 2807879, 8016821, 1142706, 3031965, 7450741, 6635786, 7025274, 1094707, 2630021, 85615, 5951300, 39069, 5620154, 977783, 6964460, 5239039, 7893137, 5753003, 7631935, 6035745, 5409322, 5591078, 2046944, 660858, 6604457, 476035, 7999781, 875224], -[7119756, 4972460, 1310253, 5799861, 6320057, 1838440, 2936013, 3280698, 8138122, 778289, 2404562, 2563837, 2678311, 6358510, 5801875, 670860, 6895569, 2960228, 2887199, 2193334, 5858100, 2294914, 1834682, 208631, 781613, 5663208, 4045660, 6908178, 6330799, 2237087, 5397812, 763552, 943973, 5962812, 5911667, 2624478, 2443225, 5813561, 334169, 1775638, 1496056, 4018526, 6927038, 5774359, 4759847, 6409585, 5362256, 3092377, 5159208, 3496481, 2464651, 511536, 4276612, 1928938, 7957408, 2796748, 941259, 6060318, 1392255, 1930180, 1862512, 6223000, 3362190, 5148269, 7931845, 7305546, 6619922, 743920, 692996, 835459, 6131829, 6437014, 6873163, 4010177, 7741843, 2503727, 907164, 3282489, 3480743, 5054557, 5485690, 5439016, 4241332, 6568008, 3180886, 3992487, 2557821, 512455, 7156096, 7284801, 5406937, 3082865, 3251066, 3640006, 7447880, 267118, 4204129, 4338699, 584520, 2183546, 3929257, 7956917, 5407418, 5854799, 176809, 6291879, 956485, 2729693, 5749400, 2437549, 6059559, 3423633, 3297020, 4024582, 2676623, 2744431, 375980, 797488, 5232420, 3219363, 7145759, 7396281, 6437252, 3744838, 3203616, 1123425, 1107772, 818992, 453409, 1049565, 4272033, 4160146, 8228715, 8097344, 538620, 2191016, 2785784, 497971, 4033363, 2352298, 7010989, 4016365, 2914639, 7978690, 3369852, 7950004, 167240, 6067894, 1477839, 5144465, 8126390, 7680303, 4017515, 2076874, 7732122, 4246604, 4551424, 4445837, 2629239, 509273, 4773678, 3634209, 3409809, 23041, 5284130, 4544389, 3705345, 4659784, 6498964, 5972053, 319312, 6691764, 6683588, 3961773, 8357927, 450976, 3989378, 4387933, 4995597, 6264808, 791108, 3149295, 5209691, 8175737, 1898665, 6572135, 4230489, 6142746, 5110757, 4789033, 1733887, 5687215, 5500314, 7634111, 1804532, 1793729, 2472771, 59479, 7893782, 1142792, 5854327, 1392613, 1803269, 1199175, 5191234, 5422057, 495452, 50482, 6338102, 401399, 7013836, 6276048, 4620970, 7628870, 7679866, 5890102, 7382457, 4620671, 5869886, 2254689, 7180297, 2549194, 1208525, 6590305, 2626928, 485012, 3627915, 2749053, 5459012, 6499299, 6227203, 376910, 4028881, 2841408, 8127679, 1931393, 7261836, 2698324, 3141828, 1170937, 5841775, 7192371, 2421016, 1761073, 931966, 259565, 184327, 533288, 4064296, 4665505, 3225289, 3169216, 1078868, 248876, 98981, 5300384], -[5177508, 4776410, 3466612, 1182707, 4458955, 1126918, 2827731, 3667699, 5421873, 3506339, 4722249, 2045790, 1321195, 182348, 3004003, 130811, 2013491, 2267613, 5038641, 2348182, 3223877, 2470941, 2338344, 5862561, 3284937, 2124441, 3464572, 2393869, 285605, 7674257, 5340088, 3009879, 5477399, 2184835, 84206, 3655215, 2314899, 4842462, 1967424, 4878961, 5833193, 3759660, 6997298, 1827775, 1545878, 6009719, 2156313, 515775, 1571907, 1569750, 7662364, 2137113, 4132701, 1615868, 6316382, 2368301, 1092224, 6055441, 34896, 6228995, 2695706, 3572932, 7476064, 1318398, 2528115, 7309219, 2198811, 824516, 1485894, 5662450, 5247739, 759354, 4408665, 3731447, 4950661, 5597168, 5228755, 1691269, 4387305, 2976090, 2902559, 286549, 4124495, 6098767, 784646, 4459979, 1057159, 5724495, 7613812, 8116897, 6444876, 4672518, 3522549, 5591399, 3896066, 4286835, 4538665, 6069381, 2136785, 1841375, 986095, 4694391, 4985968, 7441225, 5025372, 5378407, 3912488, 6363615, 3846513, 4251553, 6483429, 5082009, 4887066, 3270297, 1879318, 7945525, 111025, 6917402, 5344394, 2560465, 4243327, 2853742, 1933559, 2192439, 2412053, 234545, 5316870, 4106878, 3635574, 8375119, 7922074, 6667129, 6038994, 5192595, 7531250, 3082645, 5470326, 7355483, 2410756, 6425299, 4332588, 2469809, 7540049, 427118, 5729384, 5803213, 4331086, 7715894, 1021981, 4770022, 5990872, 8207185, 4528241, 7366497, 2991002, 81891, 1207679, 7622376, 5419719, 1386017, 5615498, 2094506, 1823991, 2478968, 5917970, 4184893, 2041561, 4734253, 4944684, 3172975, 8135893, 6975189, 1825075, 3134806, 335123, 1430163, 7735883, 8068839, 1146667, 3162021, 1632362, 3287625, 2013308, 1988557, 301092, 2590683, 580675, 8352, 6956901, 6972386, 3183970, 5944687, 3467416, 3487910, 3708279, 1156370, 5926557, 932764, 1419539, 3724793, 4501882, 280015, 6356156, 70593, 7984967, 7816915, 7947356, 6284393, 2702268, 2888149, 7800851, 2076671, 6539825, 1144332, 1888871, 5339219, 2393917, 7923153, 4950166, 4288575, 4643298, 6935428, 4986710, 2042174, 2753368, 8087650, 4579258, 2784124, 6384486, 3992791, 2903409, 3951219, 2077085, 3956285, 3381104, 3992194, 2430307, 1974045, 4275637, 1541608, 4835701, 196026, 7737307, 2795820, 7931339, 6675906, 4924320, 6370760, 3267323, 988487, 7594838, 3991009, 5999656, 3639180, 1038722, 2300126], -[6378596, 4275171, 3850147, 1464073, 4777634, 2358052, 3641981, 2875943, 6359496, 3778826, 6607657, 2737124, 5882230, 101699, 1818638, 5870675, 7669273, 3575424, 4751649, 4104732, 6127347, 7296627, 854007, 7126612, 6672807, 5379548, 3563253, 5048694, 939510, 6169284, 1879759, 4492204, 2187141, 6141986, 3003325, 6815253, 7993927, 1759924, 1865621, 5070056, 5989100, 957796, 1804368, 1725348, 5470228, 964230, 6547545, 4703917, 6207843, 2150493, 3364952, 6828058, 6098861, 88308, 144472, 3675367, 2471090, 4774328, 696875, 7530236, 2172088, 5868830, 8267286, 462595, 6821149, 6727847, 2684471, 1148473, 5108163, 4291715, 6070079, 8333095, 917028, 4411306, 465278, 8245017, 3049291, 7948215, 3895124, 7755885, 1664707, 6808259, 4085140, 6033301, 1896303, 8143273, 6683378, 7811508, 4856500, 1080763, 1074794, 637845, 2123075, 8277944, 99070, 718249, 7187345, 3939137, 4350944, 7555889, 218263, 5088506, 2691881, 6891842, 1367960, 3067251, 7527394, 3585711, 2669954, 5817539, 4951426, 1648300, 5609356, 4069022, 4784581, 4228237, 8118699, 56192, 4048333, 4541968, 2928358, 3999217, 5091589, 867464, 3709266, 2050135, 4871850, 4576553, 4796462, 3726929, 6313045, 2477316, 3339314, 7802358, 8134887, 7080875, 5337348, 5004614, 764308, 1516320, 1629248, 1934583, 6505736, 3339661, 2435348, 3458388, 7906449, 6434784, 7326626, 53688, 7137452, 3937925, 3272249, 1748908, 3186954, 4600961, 2562515, 5808926, 2929361, 1623276, 5640045, 2114991, 3895955, 1680803, 7498838, 1769522, 476121, 6367946, 5991074, 2922575, 7207618, 1412879, 1330380, 2516326, 1726628, 1346728, 205449, 4930714, 5218250, 6181930, 7229076, 8333043, 3564358, 1718281, 3822594, 8060605, 6290212, 2284424, 3073736, 558080, 6311642, 3440653, 2814066, 4644215, 1320736, 4499829, 4108863, 5432080, 467076, 4151210, 1996965, 1521950, 3579167, 7450801, 5326006, 2401171, 4256442, 6133709, 6825797, 1420880, 7315638, 310650, 6246380, 8087286, 2325733, 2523948, 7374554, 3562534, 2478600, 891204, 2067873, 4119663, 7465105, 692649, 663778, 4405899, 3084808, 5054051, 7744118, 5190042, 2080357, 1132985, 4095423, 3243766, 5285329, 156867, 6178983, 7452726, 5814434, 1774764, 2811808, 5237626, 4935391, 3604996, 1400391, 8204752, 7235941, 1079575, 6945033, 4670828, 4021343, 4839631, 4940658, 6467596, 7063850, 6554064]], -[[5859083, 2380613, 3181736, 4855084, 7240977, 6627881, 234825, 1993440, 5909801, 3413874, 1550049, 4493222, 4214738, 1410251, 4283048, 1587803, 7466096, 1718062, 1935426, 4727510, 6506653, 1551887, 3310767, 6292695, 6064738, 7120095, 423822, 5838864, 3496941, 598224, 7165892, 6306117, 7671044, 6775315, 176679, 751008, 1470465, 3855272, 7528367, 6687507, 7497656, 7681013, 5731609, 1172466, 8335984, 258007, 2041939, 3356238, 2753375, 3211716, 831207, 5930451, 7147863, 5795410, 5365832, 6867702, 6799851, 2995046, 6317462, 6229761, 4529916, 5224080, 7225665, 3790667, 4373900, 7024143, 5318404, 1810368, 5982736, 5693299, 814865, 7869529, 3816002, 7977798, 3572431, 2752604, 5919371, 728216, 1279856, 7144643, 1626218, 3889914, 190314, 369452, 949778, 7682726, 2112103, 6526206, 3600165, 6373208, 4629235, 5838036, 8193091, 8073343, 4570984, 8368660, 7070133, 859738, 5838593, 1713711, 7112589, 6780926, 7821463, 2990304, 1961579, 6163949, 6030854, 3297548, 7842288, 3340463, 8011705, 3308265, 3649417, 2757435, 5967292, 2157177, 4035756, 7450213, 2337074, 3559957, 8281739, 2693430, 3173192, 5628622, 6018509, 3592751, 3525292, 4954677, 2518466, 6773410, 298243, 7977579, 2296538, 3204119, 4493667, 4952377, 929562, 3531899, 2904771, 6990551, 79781, 8379049, 2418359, 8197906, 6224882, 2755092, 6437913, 7787888, 7975268, 5682446, 5468286, 1683185, 3936110, 7293278, 544463, 7677026, 1653263, 2389679, 5010202, 7305705, 3848720, 1572770, 2460501, 6526461, 1515019, 1930426, 5287942, 1162893, 1255101, 8306972, 7082157, 2372085, 3970815, 7351076, 1258471, 6439115, 5584015, 354924, 1863116, 1517889, 2929767, 7258613, 7058514, 6385992, 2388384, 6619669, 6522953, 1375484, 6269509, 7091450, 7540219, 7953765, 8138555, 1605059, 6760626, 2494242, 1879452, 3663579, 3533514, 3978516, 3409674, 7393674, 4528071, 4109473, 4670747, 8052949, 6903479, 1191934, 3075804, 1335284, 2864833, 3459605, 2534710, 8047550, 7158315, 329455, 6883133, 5705410, 3997626, 7059108, 5649088, 1197659, 3657559, 5286071, 6688553, 3288241, 2463841, 5622220, 6751755, 4842692, 5498767, 3813701, 7505181, 4491794, 2331256, 77241, 2469088, 8218016, 8281211, 2467663, 4968091, 3346351, 2841889, 1176921, 1669157, 6960123, 2076832, 957145, 3149259, 4381377, 3741365, 3036167, 7083303, 7593161, 2181259, 6416958], -[381379, 1538957, 5868052, 2166182, 3119054, 258953, 5491255, 6366893, 1414716, 3525246, 6444472, 6722661, 7325475, 4459637, 124364, 8282165, 1766611, 7609622, 2441765, 3212436, 7923099, 1710405, 2240741, 247421, 7495821, 1623081, 7515765, 5474234, 1887482, 225761, 2901488, 4300048, 2393858, 6484798, 7153092, 3439425, 265329, 31471, 7028743, 7681313, 1932067, 847513, 750320, 5214045, 946385, 1953365, 3254638, 7196961, 3333362, 2694987, 6680940, 354471, 4503652, 7056632, 443396, 5735286, 5218492, 5345453, 7487529, 1291648, 7337803, 6755087, 2178065, 6349972, 5556849, 3060160, 8025386, 8327116, 614866, 8380302, 8027239, 4114780, 7312813, 4209559, 401828, 4835572, 4762673, 6970494, 7470615, 3495529, 5413127, 7125316, 2871750, 3443337, 1667984, 2607092, 772134, 2753044, 4181315, 5715676, 5993710, 799177, 2512101, 3266292, 2223904, 7949423, 1665807, 3860794, 1192864, 5120622, 3979586, 7587507, 6382625, 8235008, 7574211, 7371053, 2662858, 4524726, 3007699, 335818, 1637500, 3120700, 4628065, 2462873, 7885430, 5011480, 1609661, 2781355, 4030229, 4921725, 1384357, 7652184, 4846672, 5909059, 1204691, 53894, 6431735, 2974040, 2110983, 2536253, 6488457, 2184406, 2104187, 2264422, 2255633, 2247372, 5203256, 8304560, 6734381, 6547246, 5655999, 590033, 6062064, 6070547, 4077299, 7516879, 477751, 2685988, 6992849, 7752138, 2890098, 4521973, 4733673, 3108556, 863969, 7979600, 2672320, 5753392, 244897, 3704082, 1331233, 1750842, 3544904, 7913973, 5737216, 1040095, 3666346, 7147860, 3761609, 1617881, 3778161, 8320483, 328781, 2735722, 6528669, 862661, 4165100, 5097641, 5324354, 1203319, 959896, 142021, 330124, 1667921, 6386561, 7652892, 3791818, 3232301, 418666, 5941532, 850235, 84286, 2188803, 2485066, 1645461, 3522073, 3591794, 3280572, 1592337, 4615954, 6748274, 4844136, 7755429, 7886130, 6819353, 1662016, 5000047, 6291780, 7889732, 7620764, 716588, 1380024, 6555879, 7811299, 8090024, 165432, 5824707, 3497011, 3416819, 2482443, 411358, 3288479, 40644, 6087998, 3337480, 5161399, 5106207, 5440739, 1674191, 3508546, 7492430, 5401107, 102588, 4769819, 4840023, 3041834, 6231482, 4929454, 1838760, 190340, 1822056, 3489323, 4307334, 676406, 6071881, 6806442, 1207359, 8027252, 2891866, 3945258, 1833795, 3614578, 2077077, 4344219, 4212116, 7333735], -[7195902, 5957485, 1712322, 4318438, 6379697, 4955326, 1035245, 3153962, 5056275, 7946584, 1814661, 1073359, 5342917, 7899536, 3319803, 2610186, 4910569, 3111223, 6441496, 2787479, 4600626, 7033155, 7198052, 7127907, 4417454, 1054012, 270724, 4571244, 5766151, 3278367, 382974, 4857897, 6076730, 2226601, 6216838, 3654281, 659657, 6087126, 4851900, 3935630, 6955415, 6803219, 7081309, 2098849, 706775, 2865046, 8140164, 4156076, 1842535, 2413568, 7447586, 2320911, 6782911, 7631439, 7721406, 3098388, 7138651, 2885652, 665930, 2837132, 1369913, 6277299, 836233, 6933114, 109460, 7342972, 5604065, 4804290, 629118, 131136, 3342659, 591014, 6965496, 3580533, 3520310, 3582117, 980831, 8277034, 6410625, 4598144, 4519325, 2459809, 4364493, 4807628, 6402732, 5545530, 4953750, 8221879, 119810, 1502353, 4098236, 4348832, 3178796, 1378329, 581471, 4021809, 1713213, 440952, 3359317, 5960468, 6536137, 2788869, 294247, 8078705, 6967016, 7006864, 2967848, 5478249, 5307985, 1420625, 5277060, 820901, 2271158, 1657791, 154263, 7240593, 7668076, 7842330, 1665286, 8003858, 2707660, 3749211, 3444389, 4114185, 4892356, 3492568, 2151355, 2121265, 1620230, 49414, 4926823, 1932271, 4095849, 177938, 1020231, 6879174, 363425, 6248680, 3210937, 737665, 2288682, 5745589, 733242, 1484884, 7258430, 6264072, 4288738, 6096106, 8011531, 7438418, 7939815, 226624, 2868436, 100780, 2715589, 3830350, 2931506, 439496, 7516365, 5489145, 425487, 1854194, 6978935, 5362433, 3928019, 5332625, 3057300, 4716308, 2051859, 4264814, 798338, 6459030, 6625178, 2762996, 3232791, 7336744, 2249881, 4088771, 7151263, 2167715, 2579144, 4708094, 8012422, 5899267, 4738817, 2210184, 863397, 3597999, 6143383, 7574393, 842821, 5160429, 3680196, 7456592, 2476037, 2949685, 8214690, 5526156, 4414816, 6818675, 7000882, 6326786, 2437159, 1819065, 5819320, 3999836, 4368959, 873192, 4571806, 1329183, 3128231, 7724617, 3004031, 531519, 365095, 6687631, 5658529, 6478932, 1441485, 7913444, 2841731, 5982124, 4742136, 6717075, 1282707, 1939363, 6534679, 2079367, 2771521, 1877185, 7352535, 1008023, 3230191, 7589078, 3373689, 8219620, 7140035, 615712, 2803258, 8140485, 3195087, 6529922, 5163162, 3976826, 1739513, 6863597, 7696942, 7589048, 8141807, 6501534, 1744310, 7101742, 2536378, 877208, 2993713, 5059523], -[4089041, 8370821, 4331249, 3699219, 4800103, 761441, 2057433, 374891, 7654074, 697252, 7144925, 3085921, 2864666, 2696801, 46268, 2115654, 4147153, 4954895, 4405053, 1777893, 3189159, 1920101, 591988, 2763797, 3840731, 7781282, 5522493, 6145984, 4046892, 776699, 6966519, 7605367, 2174168, 2610829, 1969039, 4437743, 5292914, 6550449, 6579839, 8102871, 4523379, 1490372, 4518633, 2536973, 7323784, 3662076, 1243647, 6149401, 3689480, 780545, 368278, 4834746, 3212978, 1163011, 5983892, 3628073, 8244415, 1603635, 5208299, 4072533, 3071924, 6870006, 6600611, 1865106, 2481288, 8124755, 2768757, 5335039, 7026676, 1445596, 6280188, 2937955, 7870811, 900000, 6050371, 7058485, 3637130, 3970976, 4397069, 5992682, 1171160, 830079, 2279841, 1351867, 2203912, 1873863, 4829789, 7011726, 3256805, 1465571, 5913691, 4166552, 2982104, 5412983, 2098308, 6694790, 4151444, 4910718, 7973151, 5015689, 4494156, 2924829, 4724830, 4337356, 8354666, 718063, 6288458, 8110627, 4795973, 888771, 3471796, 5696153, 7173736, 1242948, 7760274, 239464, 1102499, 2755021, 6126797, 3517018, 504802, 854522, 6295025, 5538304, 4634333, 3407246, 28751, 79743, 1569397, 6533844, 1194690, 105736, 6810520, 1378613, 1752146, 2235473, 1377085, 2206765, 1218671, 2053368, 6036045, 1941753, 6038168, 5081473, 59730, 420165, 4141060, 4238319, 6754777, 5145900, 7007907, 3182549, 7183682, 6075317, 5677522, 8198669, 3003059, 3135942, 5445495, 2572315, 3829845, 1757912, 5677276, 7342277, 5587702, 1291019, 1340510, 4231011, 7689193, 6971195, 5983829, 2008501, 541177, 5195455, 2812827, 3620720, 7095232, 4290818, 4493188, 1504539, 3284685, 6039964, 242206, 1049700, 7115619, 7362676, 2516863, 2997649, 1405825, 4534037, 186048, 4178097, 1364199, 1995727, 2258497, 4744265, 373260, 188461, 2300898, 4338066, 1647760, 3233587, 7716130, 456159, 3549062, 8341115, 914760, 6730646, 1414005, 3889533, 6021089, 3993494, 3175704, 4361207, 8267358, 3748995, 7957813, 5621839, 6817335, 1796199, 8186898, 3128884, 7193069, 3212026, 3319153, 950947, 3165264, 4441976, 4678836, 2102914, 920587, 7482661, 7394074, 335826, 6033334, 7946581, 7194383, 367606, 3808937, 3959537, 4022771, 665011, 1385085, 6887189, 569639, 4555290, 6953021, 1401752, 1491131, 7274537, 4107211, 3510045, 3314490, 681487, 960096, 3424151], -[4662832, 8252315, 1181811, 5118775, 3204487, 40799, 5259581, 5301282, 3379211, 2697338, 4752750, 5598409, 8206926, 8234691, 890723, 2665943, 1918415, 3408582, 6360407, 5241101, 6333355, 8196165, 313187, 7872894, 6835422, 3669531, 5568110, 3636202, 2109720, 7367963, 5437366, 1895994, 3225701, 5704534, 5460019, 1570259, 2112419, 4917632, 7404625, 2852341, 7297064, 2155720, 572626, 3263146, 1467389, 6473155, 1697107, 7822917, 131666, 717776, 3456608, 6984025, 1116773, 3523542, 1943488, 5775481, 5767915, 7323716, 7900762, 7460875, 1269909, 2237373, 6024667, 485188, 6210365, 1566445, 1699111, 1617804, 2272597, 2132852, 7838836, 6111614, 6889695, 1528880, 8041595, 1034699, 1319443, 5169383, 3101329, 1141303, 2157854, 3756605, 2879141, 4600519, 3339275, 1938843, 5943934, 7851249, 5227490, 1612758, 7622241, 2476834, 3501887, 5679100, 4923257, 3373051, 5796896, 1593538, 7967726, 6486929, 2354944, 4291005, 1412092, 3952695, 1251261, 1230041, 6460426, 2315819, 4830223, 627588, 2825749, 4138477, 4305360, 5468350, 1671512, 3322871, 475894, 5469283, 4479426, 922957, 6804536, 4944102, 6567996, 4402110, 7255749, 8311154, 4824802, 3844097, 6258218, 1206636, 2945035, 656880, 1952688, 7805759, 3910369, 366933, 2402018, 688583, 215940, 3067936, 628440, 3992455, 3341153, 3394525, 6748601, 8204279, 6899140, 1066808, 1414365, 7270648, 4549230, 6896962, 2876041, 1851369, 2816189, 1886857, 1635227, 1876740, 1275222, 1163473, 929602, 671508, 6972315, 4146348, 6558760, 7287943, 947435, 617937, 2418186, 4647418, 6154649, 7038149, 6313996, 3052907, 3634545, 313784, 8128103, 704090, 143686, 7652991, 6893466, 2339567, 1126636, 5796458, 1801140, 1651393, 5317586, 5376895, 1895095, 4184588, 1111174, 3199616, 5719696, 1629050, 8039898, 4460429, 8136494, 3970305, 786701, 7480245, 4349977, 4509975, 3519637, 4224000, 3639460, 1832641, 5992213, 2774841, 23560, 6167054, 8133755, 1887216, 358761, 158239, 3912711, 4254245, 3586350, 725243, 7952807, 3514673, 5112020, 221412, 2840435, 676966, 6409740, 1291077, 3731586, 8117728, 3837211, 6384570, 520001, 5513937, 1721673, 3828152, 894311, 3824501, 4369067, 5116198, 6887543, 7413011, 7782731, 1679619, 1991721, 932639, 5887535, 2592940, 7937616, 2856839, 6118364, 2968350, 4882638, 7418901, 7100342, 1731723, 8136783, 5944252], -[5415055, 6611039, 6430913, 264784, 6469906, 5367014, 7731004, 6163143, 2668380, 4663298, 371093, 1224877, 6732887, 2051284, 5838711, 902989, 4421834, 7117461, 3376491, 1031117, 471572, 1719301, 4674135, 5464619, 1986864, 742307, 6848729, 3352172, 841544, 1420337, 5156475, 5942528, 2129865, 5391430, 8094212, 5170002, 6484028, 6961727, 6669392, 4952877, 4221662, 6294407, 2791014, 2509789, 8049821, 289145, 3309916, 6777944, 5597273, 1276002, 2745605, 5711702, 7849371, 3158200, 6879398, 2059419, 6893191, 406256, 5319239, 4179733, 1285184, 4685787, 4845238, 4792126, 242480, 7031749, 2667846, 5051079, 3447486, 1744576, 6642956, 1470259, 535908, 2358483, 912132, 2498860, 5969408, 5516210, 5197136, 6638085, 5257014, 5722186, 6339219, 1502462, 3296244, 202110, 1727114, 4714226, 1749353, 2314073, 6030045, 5407718, 1309030, 7289947, 1997613, 988883, 2192896, 3658726, 3079675, 1676090, 1311073, 2002675, 4569482, 675825, 5715129, 361493, 2880403, 3557711, 3559556, 7754563, 6558947, 7622812, 5525514, 690194, 6401585, 2463205, 7196390, 7052734, 5128999, 7519151, 5703468, 2687315, 4309749, 6996957, 1745033, 115735, 3399899, 7751804, 6161591, 6307355, 4072099, 2354717, 1395125, 7459593, 6940328, 2605811, 1144922, 3458354, 1434424, 3500546, 771840, 7197682, 2001164, 8115638, 8331413, 1417605, 4796042, 7355157, 6295123, 3700591, 1684831, 3900047, 6475905, 5629778, 2545690, 5971433, 2240416, 3085758, 4727408, 6144570, 7533199, 5484819, 4829759, 6303214, 8024218, 5369320, 513544, 1735543, 7661414, 2675078, 6912531, 4328278, 1632645, 8026583, 4302288, 2211615, 1250784, 1607040, 2815046, 6427939, 7112153, 647377, 2545165, 5913052, 8041428, 7614741, 7961287, 5626086, 1955524, 6619302, 506259, 6255079, 8093569, 4313357, 2608549, 1924093, 3990606, 1439479, 4525367, 4935726, 7173439, 1100265, 3646961, 6056404, 1480455, 8231887, 168691, 5985626, 4335264, 6140773, 388324, 8296568, 5437622, 1289936, 2901627, 7636610, 8115126, 3103347, 734005, 3197176, 5001383, 2467180, 3007999, 7743344, 2646579, 5426503, 8001980, 1959453, 1305955, 3966582, 2474301, 7113313, 8266584, 1574621, 2389226, 7751014, 1107581, 3120047, 6864723, 5464672, 1311391, 5718813, 2596182, 959850, 458097, 4421981, 6242751, 6944710, 24636, 747968, 884007, 3447267, 6019650, 4292462, 4738079, 3660889], -[7044749, 2032043, 1530656, 2325583, 2850081, 7688371, 2130924, 5814255, 1094741, 6915147, 4332104, 5955564, 1246443, 2600910, 5088431, 6297690, 6304779, 1764365, 4778877, 1562932, 3667815, 3466130, 3403367, 6365801, 197530, 5988696, 1977410, 414846, 2577373, 3464475, 3880330, 1390123, 1192607, 6332808, 8255962, 1770991, 4405612, 3872842, 3658523, 3889896, 4090003, 247313, 5401649, 1820610, 7270235, 2061747, 8304280, 5525871, 4320691, 1914026, 6877008, 434608, 2570308, 2639643, 8101932, 4294877, 1842920, 5514247, 7669679, 5575409, 4380005, 8345091, 6705986, 7845558, 8190694, 7325332, 3447619, 3181028, 7043823, 2754696, 6944813, 2269464, 2700945, 4402631, 634049, 7588354, 6549500, 2690695, 1272526, 7144643, 8243700, 6348534, 6269579, 6831500, 1312759, 4573839, 1636847, 2228260, 3300897, 4085792, 8288145, 5606203, 57044, 6766902, 2021421, 1325343, 4266302, 3189433, 3429150, 6866224, 4067759, 4662335, 535139, 6173897, 5374349, 1066548, 7319229, 2825016, 998397, 3131211, 1799405, 5766071, 4520545, 553192, 8048973, 4687719, 6965725, 2775130, 4587773, 6950243, 4270772, 1390928, 5321665, 7184806, 6613371, 7067684, 4437205, 64388, 1378581, 1520929, 291491, 7698387, 578181, 3449773, 2470286, 8290159, 4367265, 3452157, 3575058, 5211419, 2502260, 442297, 123403, 6642349, 3723514, 5567087, 792334, 7277515, 3273221, 3227861, 5617946, 7784042, 3385046, 24475, 4251119, 3981344, 415042, 5228380, 7804136, 4475678, 3148141, 283299, 7385771, 4837723, 3525424, 1395899, 8061193, 2542055, 4284471, 4504980, 2014863, 6702493, 6610799, 1980072, 3523424, 4542824, 5947931, 1891869, 6293368, 6966124, 5914856, 7548184, 4297738, 7367111, 6727182, 6991130, 668294, 936698, 7182296, 5678277, 662869, 471910, 248946, 6504666, 5403475, 3645545, 7596811, 1875127, 2584886, 2434096, 99172, 4459480, 5610763, 7316639, 5435335, 6283619, 3382998, 6439440, 8220916, 5868145, 4511593, 1334036, 4518336, 3399263, 3617175, 3686894, 5935373, 4224838, 4855610, 6100250, 6186335, 2603825, 602067, 2744982, 1766990, 3439177, 973988, 3629233, 6556107, 8347774, 3916558, 7522113, 4314549, 4031295, 6487523, 3768852, 6308427, 2452346, 7710314, 5539181, 5368833, 2231471, 6307455, 7312901, 6032962, 7515759, 1028858, 4837312, 7482296, 2617700, 3504860, 1406005, 666986, 3473412, 7122711, 5612980]]] -trCandidate: B68B9A12161F20AD44AE46F610810BE9CE3C7493D0635251FB5E1DD7FF276C7B0424AD8222693CF69DC274D0E0D622638FACBFD64C94518CC6BDAAC5FF723395 -muCandidate: BBBDBB16EE19CB22D02CE874AB62B3AB4ED2EBC056752CAB9A971CD263F2143A607D9931B8B897976F489EC2C6387C2C5446821AC6ACB0048AAEBE6F4F4255BC - -c: [0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, -1, -1, 1, -1, -1, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0] - -NTT(z): [[4912434, 2048650, 2638353, 5330707, 4953177, 4417974, 1072030, 7401020, 3537854, 468343, 3644514, 6674999, 2804308, 367020, 3600796, 2644290, 2575299, 1918843, 1304441, 1379163, 4644252, 5494573, 1536631, 1109880, 27847, 5823027, 5481849, 882910, 5792337, 967804, 3463827, 2208051, 2293129, 7494138, 5848459, 7128059, 2464269, 3532086, 170967, 6951029, 4220996, 7936875, 1344793, 2168206, 2649143, 514206, 1283567, 2363316, 3451840, 4618254, 3722977, 2947420, 7710463, 8150308, 6637358, 2652026, 5581399, 2128769, 5308888, 7270426, 8311523, 3132399, 5677363, 4032756, 2324865, 933519, 3032221, 7962605, 2355405, 1821311, 5612676, 4406955, 4238652, 2739728, 610111, 5522727, 7964501, 8002591, 3261330, 1486773, 5737564, 3816336, 4412524, 2178024, 5237134, 5085058, 7217413, 1353414, 2055497, 2567014, 4924661, 8235218, 781305, 6592985, 7148324, 1987143, 5804255, 146985, 615649, 4993174, 2184120, 538946, 3579755, 4625648, 1081741, 6677179, 4765091, 7526448, 2670710, 7928124, 3909991, 7574990, 6477042, 393171, 1825725, 3442613, 1242673, 3101140, 3525856, 3819503, 980820, 4785891, 3036605, 1625472, 4320976, 7415044, 966256, 2930258, 403050, 7111964, 1122648, 822798, 4388487, 4775345, 1044079, 8322196, 7137877, 4135317, 7044501, 7519024, 5375291, 8033738, 8214517, 1757609, 7118350, 7349963, 462169, 143394, 6068612, 6064420, 8234623, 5516889, 3264211, 5777245, 7295916, 5129460, 5096224, 2938505, 5537548, 3994215, 5161476, 7788606, 3032891, 8073711, 934175, 5935854, 5889383, 6492667, 7066744, 8163798, 414697, 1689714, 6734655, 7371854, 6900053, 1467476, 2270896, 4041007, 2277, 1769573, 8300389, 5717554, 6263582, 2171813, 3095155, 7558247, 8184673, 3735978, 4092298, 6900592, 3552381, 1748516, 7606049, 610339, 1770423, 1438185, 5572216, 1693652, 2309727, 7593152, 4938012, 3383834, 7058969, 5976071, 4157593, 6254731, 6007198, 8320443, 4519927, 2387595, 8209165, 1727034, 3345810, 133080, 533373, 3190883, 2510642, 5749139, 2578608, 2419001, 6613206, 2648834, 683086, 4421291, 7379797, 356938, 2276788, 4458839, 5633699, 2149871, 7083889, 1579341, 3270706, 6780165, 2373128, 2946685, 5012256, 2986293, 6392465, 1488010, 7043691, 1717243, 2983103, 5734538, 96072, 5289970, 4904541, 5628302, 2047954, 2270627, 6210051, 1241211, 7175303, 3020816, 7456251, 5955570], -[1915053, 7558253, 2812144, 6506773, 4414942, 4845338, 8080230, 903152, 4048499, 7663862, 6782271, 2435790, 711208, 7208810, 7797545, 8277082, 2948805, 7072068, 3185987, 3288651, 842699, 5964171, 3773356, 4811143, 8044813, 5397933, 3454830, 5671487, 4691487, 6556247, 1451580, 390296, 1591925, 912927, 2124589, 4290388, 4390511, 1802361, 6849555, 7910671, 2244480, 7874641, 6541791, 7706143, 5041107, 527716, 4898307, 2222273, 231496, 7326273, 1480153, 1946080, 5169934, 5137468, 817010, 2421356, 3557100, 5204538, 2983453, 5321230, 616136, 5421806, 2850841, 1400616, 3519822, 6950152, 2786291, 6560685, 6356567, 3774004, 1845997, 2371168, 2121018, 6280333, 2495654, 1192751, 5041633, 7196924, 8317595, 378899, 6563526, 770957, 3431591, 5389295, 7238517, 3700076, 2666835, 979311, 1139924, 523456, 7474429, 498156, 7652919, 4734679, 1924312, 1088996, 3061020, 1919653, 2578958, 891558, 4077549, 2800081, 2128491, 6130242, 2337404, 1546489, 6146752, 2279889, 6454653, 7309502, 3803701, 5392582, 3395389, 7640908, 7530032, 5135896, 7097741, 7677861, 957811, 2068769, 7077356, 8231807, 6472485, 2152582, 3097557, 8356419, 5898588, 6678823, 2274853, 7523182, 5909447, 6964097, 5468800, 5554901, 6640268, 4489020, 1462051, 3237178, 4048660, 4473706, 819855, 7867231, 4474938, 6363528, 1411961, 2831884, 6411167, 7315292, 4543649, 6208551, 2247274, 7763375, 4246023, 7081477, 2137975, 8119271, 5892923, 4869864, 5009887, 7989800, 6772416, 2681908, 383842, 5693622, 5435460, 8367578, 5348869, 3745579, 774402, 440162, 5749042, 7203434, 4784342, 1347045, 7382638, 6674142, 8241281, 3688530, 7671632, 4583642, 3704687, 2295937, 2596649, 1616639, 1474091, 3691823, 3578288, 7554142, 8098785, 1705368, 2946557, 4338562, 6635014, 7968146, 7129292, 8124218, 2438085, 2715196, 7200807, 7268647, 3394490, 1138514, 4433781, 3272009, 4089322, 7404902, 4161701, 2733566, 4639154, 8083045, 7114754, 6809023, 3770821, 6766025, 3527539, 2347811, 1818027, 835353, 6151261, 5057581, 725156, 7148574, 5087945, 5230010, 1121805, 5689149, 3167993, 3184296, 3333719, 1988544, 7658759, 647405, 3870308, 6099916, 7251402, 1472837, 2856049, 4839816, 4726283, 3993834, 7298444, 5614329, 5061209, 24539, 6758544, 6596326, 1006265, 2322474, 5111441, 6584060, 7059136, 2270037, 4357653, 5969125, 8101446, 7587423], -[5088248, 5790785, 5252372, 6053519, 1260990, 2277344, 3027672, 5019385, 2985727, 565224, 4713727, 2003042, 1909758, 7918926, 2856432, 6454961, 4048005, 384663, 4356944, 3421455, 733663, 1328422, 7848820, 5032389, 6559556, 6061245, 3961833, 7383709, 2555656, 3912336, 5539549, 819150, 2466512, 3505707, 4995908, 4332455, 2986773, 4458152, 6302788, 803899, 6242004, 4007397, 3183084, 2849770, 3877542, 1545748, 6032490, 5228481, 2259830, 7417314, 4966550, 1257227, 2720511, 4678201, 673041, 1664699, 3259040, 8137540, 5095430, 3305791, 100181, 1378439, 4234130, 1161872, 362680, 2484556, 563686, 8199183, 2406739, 1438384, 7661003, 5162329, 6261108, 1724772, 4830673, 5576455, 34301, 2520962, 7847056, 4858284, 6306690, 2181744, 4239038, 6348046, 8061766, 2954015, 1871468, 4363004, 6282062, 3448037, 7679827, 614775, 8006017, 5183329, 6075864, 5139549, 3654573, 6891266, 5915114, 3720843, 6350220, 8105567, 7578664, 2291690, 3021596, 4844633, 3770747, 4395072, 5358383, 3396198, 4103502, 5595690, 6380540, 5629071, 5919510, 7626898, 4247034, 3734327, 1311545, 1167570, 7036194, 2030159, 5650714, 4637710, 6886696, 5006711, 6714777, 5815944, 4393951, 6179125, 1166970, 5353809, 4306454, 4604978, 3733794, 6187053, 2935099, 231928, 3140169, 6857760, 7651731, 3436723, 2462880, 7713300, 2676391, 4492253, 4246071, 3077647, 1195922, 2083037, 2642415, 4693652, 4814247, 2218242, 117235, 142215, 2974310, 6905172, 3040213, 5164098, 3911993, 1474644, 1308232, 4992474, 4724222, 1465593, 6319913, 4442227, 4471924, 7282847, 8308938, 5160687, 4395175, 8121300, 6079396, 4321588, 1216045, 7305665, 6233588, 5503023, 7811889, 4286745, 6111521, 6341560, 642083, 335470, 202329, 5571254, 4537440, 914280, 3895468, 6066438, 2645863, 6412873, 7348159, 3384206, 542230, 1834195, 5184192, 2694983, 1871224, 5528029, 7255210, 5304009, 2790334, 4655323, 235581, 1801264, 7655702, 6985707, 5524910, 5635738, 1973052, 6175687, 694513, 173491, 2544575, 519055, 1559939, 3524921, 7677796, 712270, 5492512, 8008505, 3283118, 4751259, 761985, 4768485, 2519170, 4049161, 2015593, 6206139, 4692899, 2224203, 660576, 5206166, 6832438, 1738512, 860848, 8155289, 6158180, 7748822, 6246841, 1699378, 4071780, 1257975, 8201470, 7702811, 6605251, 1278453, 2221198, 8131, 1341171, 7581364, 5409056, 2600702], -[1962823, 5987682, 7359598, 6994597, 5473338, 4941950, 7352012, 1507977, 5343597, 6145614, 6778899, 7027647, 1348093, 4561510, 6643439, 2749839, 5659946, 3784282, 7054230, 2535011, 5340471, 3756856, 7496628, 7397668, 771172, 6897912, 901426, 2180839, 642913, 4826231, 6828436, 189797, 3785155, 7782582, 4409882, 2152010, 1441573, 3082011, 2973395, 2303812, 7110168, 2272659, 5445229, 2350590, 7362149, 214754, 3629939, 3992590, 6981245, 5572562, 6894954, 6318008, 200267, 8215531, 4215856, 2435400, 2576091, 4619280, 5080305, 4949818, 985781, 2010799, 1706986, 675902, 8061507, 1029308, 1744980, 4852289, 6296122, 762284, 6108625, 5129019, 7039783, 1613755, 6025121, 2276502, 6477896, 1222090, 3917490, 7427246, 4441434, 740146, 5187024, 3061306, 6817598, 1503713, 3887449, 2414378, 5535706, 1776097, 4584902, 4429872, 4306200, 1708730, 514863, 6041559, 1373109, 4280694, 6690459, 2553579, 2372463, 1909020, 4160802, 5765456, 4738785, 2193419, 5121996, 499984, 3554541, 7842378, 5893078, 4279631, 939821, 8102484, 3089931, 1262163, 3843727, 7228097, 249810, 7117154, 3801609, 58921, 3024834, 1983091, 157963, 6589763, 8280024, 1973348, 867665, 6889746, 1933409, 7404409, 2483666, 6164037, 4789695, 5054463, 1117163, 1112025, 5559863, 4786214, 554503, 4266918, 3542869, 1602055, 3994850, 6518548, 562374, 6171789, 4451823, 7269724, 1027791, 7627682, 2432410, 6050778, 820800, 1438965, 3743870, 5540805, 5584940, 7443776, 478670, 4165291, 1230415, 3288480, 463287, 2742281, 7262534, 930753, 1858597, 6794866, 7102807, 6949937, 1295483, 4731793, 5575055, 7752159, 1780431, 5361029, 4194540, 945758, 1781779, 2387684, 3544178, 7780613, 4248702, 1266568, 114864, 3025278, 4183009, 5734055, 683822, 6302078, 7064634, 954535, 436680, 5746659, 6359721, 560436, 3809643, 2118228, 7557899, 6437512, 3721833, 3492323, 5988195, 6480003, 6016486, 3259564, 4426360, 5745249, 3533888, 7157016, 7268199, 2560948, 4589990, 2538447, 6555976, 4441889, 6753451, 2900423, 3802709, 8000381, 2672755, 4189796, 2297627, 2537488, 7614173, 5530253, 138228, 419559, 8258649, 813480, 6400148, 247019, 3925531, 7386627, 377209, 4417439, 4689263, 6803243, 7749661, 4934990, 5715493, 3970945, 2724350, 4051294, 7700794, 7574227, 7300250, 4050993, 1952206, 8113360, 4894174, 2609513, 3165096, 2672195], -[4159703, 1960505, 799988, 711560, 1730545, 3882282, 7589120, 3853642, 6030320, 4425991, 1831829, 1157315, 8367517, 451898, 3469199, 4198326, 1795527, 8027821, 1139451, 1859303, 6702516, 6978340, 6560370, 5515988, 3632770, 3463160, 1033723, 7595662, 4797850, 6916444, 1749472, 8289603, 7209012, 66800, 1949946, 4134890, 4655902, 2281021, 6823529, 4732396, 7973422, 4375546, 6650750, 5841087, 3268162, 500728, 2517153, 1596982, 7572199, 2026589, 5457362, 6245386, 4212405, 4449672, 763306, 2787805, 4645829, 6333402, 7860638, 1511665, 40795, 144860, 5303635, 821427, 6785679, 2564334, 4037423, 7128003, 4224812, 2006347, 6797482, 8001618, 5939918, 5818193, 2843674, 1387143, 472297, 343095, 6808856, 6916930, 6313057, 1324756, 5221556, 388379, 1883996, 5141897, 4709570, 8222993, 3180840, 6309978, 6145317, 7945093, 8248700, 4444463, 4281820, 8029677, 3636471, 1532555, 1599070, 3785748, 7693413, 24576, 3392722, 925832, 4626127, 6064980, 8189811, 6057986, 2796475, 7325536, 8226363, 1467400, 2952308, 6771757, 2834442, 5632379, 6407256, 7425440, 2526415, 3937217, 7911663, 2685140, 5766203, 3874715, 8276185, 396778, 1446723, 3092804, 8037502, 3506819, 212681, 1387913, 2046539, 4871745, 6683759, 1663996, 6598269, 3250762, 5526854, 2852938, 1844805, 2889363, 6638908, 3306345, 6486547, 2106994, 6424110, 810555, 5221272, 3795176, 4561237, 5957705, 7293505, 3927583, 6964478, 6877396, 2032194, 7361550, 7033863, 2106101, 3503867, 5659178, 2022094, 1918354, 3461696, 7890867, 5916279, 6503113, 6723644, 2624621, 5800265, 3704448, 8197575, 5105039, 5637603, 960913, 7415900, 617948, 930852, 6200548, 483092, 1371141, 2908851, 2220860, 5872677, 8040009, 992790, 6467083, 1252567, 7476699, 4646788, 4520439, 3292087, 5573833, 8172221, 7495587, 754786, 4058757, 5520191, 6757872, 5702934, 5495419, 5660922, 2163308, 2290719, 3090426, 5200802, 7183823, 5364625, 5314977, 2792420, 5639223, 5867817, 1023374, 433039, 762510, 6449434, 3664834, 2081610, 6122890, 8270522, 4660896, 1939512, 7539523, 3014208, 986237, 3502898, 6163348, 5144246, 1074846, 301521, 4824531, 3503014, 6224275, 1901089, 744735, 3796031, 7782102, 6257916, 1087936, 5812754, 8081099, 2728713, 5531697, 8147379, 8191097, 7630526, 4001829, 4661635, 5889124, 1471392, 7719673, 3143800, 1965868, 5155728, 7222800], -[1118737, 36602, 3743619, 701748, 3728357, 1476771, 5347173, 5474981, 4281747, 5815903, 7954033, 1658059, 3207516, 1232535, 6757737, 351933, 5244686, 4623533, 137306, 6304089, 5804401, 5441926, 7269519, 7117311, 7578590, 4139720, 5469549, 4543918, 6466503, 6252289, 3931560, 1394391, 1224086, 510506, 2267279, 778304, 6210178, 2409913, 6361613, 3011211, 556208, 1224690, 1974018, 5687066, 3185463, 1597947, 2731836, 3292276, 5969586, 5539654, 1838909, 8052539, 723528, 4081011, 4896431, 1873141, 2986886, 8076935, 2606388, 2778147, 11351, 7906961, 6855417, 3832036, 582088, 5976028, 880833, 7861736, 579941, 3571619, 3106233, 6730087, 1128763, 5713227, 7833169, 724203, 4984518, 5062414, 6703301, 136641, 699202, 4387153, 7478349, 1728173, 1124987, 4683190, 4411211, 496639, 7341226, 6190538, 2256150, 2209169, 6420595, 3460959, 554799, 6008977, 2814818, 1240527, 1364979, 4217495, 4597059, 4436304, 7767409, 1859352, 5452280, 7781974, 6964388, 8021882, 7831338, 298038, 6518713, 4339186, 7224137, 6958197, 5663570, 2418833, 8294489, 88789, 1704050, 4033039, 7489952, 5120389, 2720032, 6164575, 3396804, 7510502, 5139781, 3697935, 7238472, 643465, 1069085, 7269022, 6769241, 3633013, 5389159, 2360526, 3290788, 4246286, 3671495, 8280687, 7681884, 2367783, 5093429, 1983151, 6483407, 954986, 7429712, 3013929, 7451586, 4038381, 2363322, 5657536, 7867345, 4378362, 4705384, 4823732, 4518296, 360161, 7270045, 2821717, 4712119, 756800, 7769512, 1287661, 5020885, 1177290, 4165360, 3488586, 5690267, 3951281, 4587883, 1824034, 8191130, 2778945, 7712655, 7371891, 5863263, 2389044, 1368603, 817993, 2707701, 1122596, 1657413, 3043304, 4716356, 2080511, 4422454, 4682548, 3591133, 8170678, 7041765, 4733878, 130350, 6146553, 6620862, 2836243, 2432866, 6659173, 1960738, 4728641, 7335836, 5273372, 5664859, 3281435, 4913417, 2232642, 5263476, 30173, 3297661, 645915, 4709250, 3848240, 3085686, 3730026, 3578444, 4329319, 937447, 433558, 5568158, 5354589, 409437, 3248454, 8115850, 4359934, 423753, 369398, 6659524, 1056331, 7178225, 2102134, 5731303, 4225790, 849842, 1813263, 1344116, 3986691, 3913010, 3787681, 7197154, 4094447, 5521222, 2547538, 3625575, 5968428, 3853937, 1464562, 152933, 7171304, 882875, 884189, 7816442, 2422660, 7887261, 1012142, 3225701, 947371], -[5328819, 1018428, 1330802, 7207906, 7944746, 7198252, 1000698, 6559513, 5463896, 6523543, 1537450, 2838140, 2250665, 552554, 7008824, 5980362, 7065527, 4175344, 649166, 2386593, 5250947, 6520149, 4995858, 7072209, 2555468, 6249024, 1570072, 4902188, 5395076, 989566, 5274743, 3298689, 2732515, 6428666, 910494, 2201738, 8060223, 7055687, 7646056, 596598, 1257154, 5300570, 4846705, 1182881, 2571578, 1124349, 1508412, 4314751, 2068669, 1033177, 5027236, 3631956, 4336421, 1011475, 1163069, 1637931, 990553, 4865126, 2290698, 7306639, 7024515, 3303685, 6686857, 5087982, 200118, 4697506, 4531263, 394415, 676104, 1065452, 8141261, 8091413, 5925608, 6441264, 2919453, 285472, 2448390, 5654185, 6139664, 7059813, 1029874, 8083055, 7483082, 3747390, 3042799, 4044927, 6930838, 5360902, 6132330, 4824718, 1085684, 1661863, 365677, 5029851, 6457471, 2229448, 8192086, 6436910, 5503714, 4779472, 2446900, 8082587, 26626, 6885991, 1328420, 6142238, 2690424, 1420169, 4732071, 1965644, 8136903, 4991810, 866093, 4631859, 1872487, 4938535, 1975449, 6331611, 6645206, 4718397, 7679231, 1147545, 5084709, 2300368, 5220266, 6929435, 6768185, 4099316, 2199300, 1293863, 6906566, 6333405, 7472676, 7780567, 7990853, 7928642, 2006591, 3519923, 1607425, 275683, 6871457, 7957193, 2977400, 7190303, 479362, 5938034, 3998039, 748346, 58271, 204844, 287171, 6901078, 3853784, 3675456, 5214793, 5340669, 3819863, 7915960, 1053778, 2784472, 619731, 4933760, 3110303, 5228075, 710832, 5106786, 2774403, 2114409, 6622169, 4257487, 8148992, 2514052, 6324790, 4948181, 8263860, 5419287, 1662316, 2256631, 6851751, 4280697, 2185814, 6384400, 7681513, 5395616, 6786425, 3002689, 6293644, 3040315, 1718484, 6934431, 3444999, 1470397, 1207005, 6867670, 4199280, 2990171, 4950287, 1294517, 7714172, 7229159, 34859, 488538, 7558529, 2167, 6583608, 2483107, 7873647, 8321789, 3244811, 5446765, 1995241, 4290116, 408437, 4807604, 7413296, 4322802, 2925079, 5078959, 418914, 3264889, 309995, 787980, 957855, 276803, 359233, 1659906, 4151050, 3887689, 7143914, 8118768, 5961128, 6838831, 6830182, 6813767, 5847432, 340320, 4243397, 1170597, 5286922, 368585, 137373, 4966078, 1622128, 1152832, 1200662, 5801544, 747534, 6511043, 3695295, 2465350, 3903562, 7473274, 2208644, 7703748, 2758683, 1105773]] -aHat * NTT(z): [[6348976, 8115613, 4027425, 2376582, 5031263, 1710948, 5023185, 1982737, 4130939, 80434, 4197557, 1368789, 4648888, 3887579, 7467864, 6301591, 2941684, 7544866, 5457898, 2439163, 3771769, 5347844, 4742450, 5641714, 458570, 3902870, 3311757, 1229250, 4178187, 2000865, 4440698, 902819, 6212127, 6712284, 2371861, 8232702, 4973177, 1969480, 843040, 7665207, 3166441, 7494701, 87823, 1421306, 136615, 3855473, 3192205, 464330, 2137121, 128379, 1814568, 125790, 2031350, 1862659, 7085746, 3909328, 4032771, 6977375, 7901659, 5492685, 3206439, 2430469, 988961, 4084690, 4581717, 2784249, 2830642, 3197475, 4865746, 4401609, 5195838, 5617028, 6813824, 5033681, 2073222, 1597450, 2886423, 5581218, 7706196, 169878, 1044951, 4431460, 6636703, 5732444, 4611125, 6027939, 4870084, 3198762, 848567, 4963279, 6227739, 2665388, 5594380, 5365053, 6980311, 3777885, 3773488, 3299201, 5270582, 5824769, 6394047, 1700239, 4874238, 3512406, 6732573, 8301650, 20468, 6158594, 6929733, 6789389, 285576, 5893074, 6812854, 4839863, 2185094, 6341428, 2433198, 3662983, 6563663, 7917365, 5415941, 3527425, 1473288, 6921915, 7716291, 7101111, 714905, 7681778, 7044691, 6667429, 2699739, 7591109, 3314664, 345502, 3667205, 6484305, 7638164, 3696230, 1699700, 3011168, 5792680, 2483911, 474881, 7915094, 6278951, 3731970, 7791498, 7604082, 5924215, 8002243, 6056190, 362816, 6419513, 3205972, 2293336, 1529512, 5453837, 3504476, 2081147, 4451789, 8027332, 6177111, 4220930, 6826919, 690170, 3715605, 8068052, 2872726, 3653607, 7747000, 8058737, 6133313, 1428453, 4941302, 4350056, 2020114, 4457105, 399554, 322329, 6596326, 3997283, 3286708, 1306132, 107702, 651132, 2588052, 8012281, 2381062, 1852023, 3240660, 4853654, 3937148, 2729899, 2323947, 3377622, 1546364, 2010746, 3352531, 6959943, 6145412, 6113177, 3960140, 7205537, 7161795, 2354284, 5571992, 4776781, 1328190, 7068808, 6817300, 7530526, 3842167, 1550146, 6724105, 4251931, 4564981, 4046157, 854302, 3606817, 4627462, 4933969, 7995642, 892055, 8135206, 5045474, 7467265, 4583978, 844201, 7095359, 6927365, 7075066, 4264077, 669823, 7599380, 7920459, 5453492, 1499422, 2039027, 6680951, 3372342, 6658552, 8207428, 5013798, 3784378, 2370386, 5810918, 3605683, 5505611, 4832558, 5262649, 7194135, 4154367, 3904109, 1399985, 817360, 6303234], -[2126314, 7022009, 3840101, 4151863, 1803696, 2107460, 5452701, 4175356, 7050309, 2086464, 1765605, 1877029, 5788720, 3829922, 240922, 3069917, 7424389, 6546522, 14741, 3767816, 4234211, 7793066, 2875430, 7737834, 7534055, 6471476, 7471102, 3656858, 8118995, 2586690, 6684135, 3218829, 5891531, 7562635, 6169171, 973665, 907655, 1384735, 199556, 697175, 5703036, 7442282, 3711155, 2182752, 6150335, 1260047, 3936189, 4748380, 7197989, 4447044, 8117866, 2013755, 5758494, 14035, 5518659, 1712785, 2972350, 6523846, 7155963, 3579472, 8207174, 1499443, 6377717, 7949760, 238222, 4068704, 6402166, 8285655, 5791458, 7414908, 866064, 7327385, 6475764, 6573249, 6887921, 4759436, 8190930, 1933029, 4711200, 2671832, 4729065, 2360829, 1791700, 7372995, 1951384, 5637843, 6451789, 4516226, 86542, 999609, 1058778, 7094900, 6505659, 6790737, 431487, 4566250, 5799826, 6214810, 551122, 7063458, 4708430, 4862298, 6128119, 6228121, 7554644, 3896432, 2339131, 6895458, 607795, 7955767, 74645, 153438, 8335035, 7632034, 1010019, 1403088, 1789213, 3907042, 3572924, 4052227, 8273041, 3823850, 1443240, 18338, 6646209, 7186350, 921290, 3369496, 4089015, 4198394, 7766146, 7364129, 5768561, 5099646, 7324736, 3054518, 5432673, 6329211, 5137919, 7630568, 2084387, 5271858, 4354488, 3467729, 1735344, 2882171, 919797, 6793229, 5289383, 3573211, 4808577, 6840961, 3762666, 6672510, 881918, 8089962, 2764965, 4041288, 1744208, 1123823, 8059599, 4832349, 1912083, 5060893, 6405077, 1561063, 5672622, 6659368, 3098319, 81885, 2436352, 6029244, 2252083, 3008265, 2993499, 2605828, 7548195, 7254027, 2112675, 3037081, 3994080, 196882, 6704467, 5966852, 937266, 5247976, 6931578, 6352326, 4645684, 7666436, 5036930, 7986810, 2263421, 5835938, 5229712, 7334603, 6775031, 604271, 466360, 1059095, 6136568, 6239783, 3324573, 322162, 626766, 4666974, 5317326, 525570, 2088114, 7476644, 6261928, 4217492, 2154869, 5972743, 6296295, 4544266, 1983933, 6938212, 577628, 1386058, 4743224, 6759599, 6682746, 6668955, 6268383, 629357, 3672911, 6281988, 7411021, 7028793, 7315164, 776504, 312001, 3609117, 3798893, 5856138, 2154544, 4102685, 5587195, 2092798, 4075803, 3823403, 5242730, 8221341, 1221142, 3370873, 6658641, 8321542, 1817887, 4815798, 6272528, 7495658, 6833907, 362596, 5336151, 4460808], -[6115976, 6137435, 6482651, 8048110, 6475330, 3503323, 6159619, 7327430, 6266313, 4568477, 7568799, 6959597, 5338324, 8167427, 7385113, 7922740, 3664516, 7813523, 7535534, 5657726, 8043896, 5735211, 3867521, 4308625, 7157552, 7905006, 4643484, 5530371, 3393698, 7614271, 1113761, 2311618, 3690712, 1290693, 1683397, 2653524, 5744686, 262002, 5012316, 7158032, 6091833, 3939418, 4383600, 2651084, 5461663, 3627539, 5770810, 4685059, 8089505, 8309723, 3398932, 7131789, 3866160, 3278896, 1923038, 8243281, 5985499, 6504383, 3635053, 3186140, 3602320, 5458951, 6007574, 3326919, 5103514, 7880630, 953823, 2262123, 6432584, 1162383, 168213, 7331058, 7541549, 4609464, 4049696, 4321702, 6901317, 2179594, 2706715, 7719356, 4023444, 2630942, 4080581, 6714002, 7084878, 5313930, 6006670, 1802308, 2065246, 5632243, 6705159, 1586630, 781028, 7832955, 5514237, 1466625, 323031, 3985984, 8230380, 4082997, 5346988, 1586133, 3004333, 6104014, 1957662, 4357607, 4674539, 6507792, 2005042, 480689, 4550357, 856712, 8250871, 371773, 2665200, 6233151, 1729229, 3724938, 5311992, 1718507, 6170737, 5770612, 6703691, 7060475, 4305119, 1535168, 4184164, 7350913, 1555149, 4976197, 5772711, 4710521, 4632082, 778256, 4435331, 8218156, 5086357, 2889578, 6205280, 1175689, 2893331, 6379767, 4173438, 7295623, 4015008, 6918823, 7306606, 3241575, 1049928, 6980397, 7951982, 2543070, 1115264, 2767319, 3665032, 5735279, 4237008, 5042842, 3703881, 184672, 392543, 6556135, 5861888, 2177351, 6080544, 2319948, 3649440, 5890057, 1808914, 6691642, 3306711, 6383749, 2472125, 5114832, 8103697, 7989852, 3484904, 6767676, 3844661, 1294579, 7220499, 1301488, 7616139, 3654969, 2356885, 6984722, 6097650, 905003, 652198, 1997684, 6501942, 751024, 2910621, 5062475, 1451710, 2433528, 4381892, 1877914, 2880060, 2356355, 7089493, 3657757, 476489, 2447071, 1990066, 5602209, 5900148, 3005671, 4720163, 2823326, 1113630, 2904437, 6652664, 7586126, 4961762, 1022692, 4184331, 6622564, 6887626, 988560, 6804590, 4540365, 999191, 5593406, 7159654, 4843809, 8134904, 1845681, 7586108, 4262057, 243415, 3557782, 2093009, 2353200, 4350458, 1769485, 1944807, 87338, 606317, 5150544, 7761273, 7246609, 1117968, 2233498, 1565537, 3221369, 177600, 344477, 4107707, 5259908, 1556690, 4346603, 2639488, 894819, 5260926, 1643091], -[6036693, 443680, 3540726, 1161176, 6265593, 2068957, 5877762, 2470499, 3622687, 8054827, 417107, 8012713, 8306057, 4873501, 1940980, 14626, 4740879, 7528192, 1313435, 4999654, 7941764, 8038454, 7822115, 6738481, 1165573, 1301743, 5098059, 4482827, 3401976, 5551891, 3187351, 5581744, 2591783, 24393, 7896616, 6671059, 5492072, 1567128, 707300, 2570603, 3960070, 4945459, 1363857, 2376294, 5842548, 6594422, 134093, 5311592, 2424530, 426673, 2318897, 3312087, 5531742, 6041007, 5926227, 642727, 6531516, 4038397, 6702167, 3842011, 6445451, 1823668, 7028669, 7554631, 6648444, 3854486, 896145, 7694176, 6193557, 3351019, 3715834, 2478085, 2564973, 3551191, 5425724, 2743915, 6677674, 150120, 7580941, 5410643, 8125042, 2964335, 634130, 675479, 439226, 1612138, 6594224, 6151264, 8342499, 622506, 31275, 4902861, 1767871, 7391176, 798223, 8053007, 6252057, 3251914, 338365, 470672, 2713810, 1168377, 2786394, 999454, 6862183, 4917647, 7368524, 855892, 2036966, 4044237, 2066321, 2391381, 4164021, 3600506, 289730, 3266414, 3402426, 3100745, 6508868, 136836, 4840090, 6175369, 6767959, 4604933, 7139508, 7441756, 193885, 5461811, 254311, 4204809, 7690113, 8344498, 4685427, 8207546, 8193393, 2918952, 6976737, 1799717, 1451690, 3943906, 5724894, 163488, 7285441, 3618062, 475194, 504146, 3356721, 1385299, 8225282, 327479, 945763, 1610039, 859304, 8024398, 2617945, 5271304, 5144051, 5971956, 5738141, 7504529, 4076944, 371327, 6031293, 3213183, 5813674, 821864, 6407072, 1918895, 6692167, 6199399, 8313244, 7604640, 7311991, 1274068, 2737821, 685648, 1128476, 4744508, 348334, 7111931, 1712622, 5650041, 4039757, 699029, 7238273, 1781605, 5368497, 3108194, 3378524, 6163118, 6830275, 5881554, 3513399, 6075495, 5092611, 125904, 4622004, 1421756, 7084815, 7062585, 4901987, 3878192, 862305, 5738873, 6251934, 1276641, 4090050, 1657754, 4097169, 5884619, 2557822, 1015143, 3034706, 5092714, 8158805, 4312606, 1479173, 1110732, 142423, 6458331, 3521412, 7275800, 1808121, 7200350, 6950, 2560386, 5827688, 141493, 3709287, 5463042, 5026986, 7934110, 7529985, 1252287, 1315450, 648705, 2803178, 4025289, 8284839, 5642544, 7866925, 6664125, 7416219, 3337489, 6894231, 1527412, 3446578, 508835, 5922711, 2484317, 7305384, 1050905, 7573472, 5290490, 3947864, 2134627], -[7838458, 6604450, 8304947, 3281110, 1210303, 635428, 2354446, 5343680, 5482621, 5054206, 3994959, 4497286, 1060528, 6429299, 3060588, 3141989, 7262038, 3888408, 431631, 1878050, 1059656, 5636480, 2351755, 6859080, 1572786, 1839151, 1341766, 7262853, 5423169, 7187386, 7534697, 7682649, 2531386, 276383, 820959, 3663379, 3743201, 4886085, 7505163, 3051233, 5142489, 323310, 3345311, 6175065, 4623097, 5876285, 7493669, 3237100, 4399780, 2931914, 7221316, 1481387, 999864, 700712, 3092437, 7718259, 5190471, 7195911, 5296482, 7559004, 4399128, 2043303, 1791746, 5816185, 3530447, 4404951, 651047, 782536, 1547322, 145893, 4363988, 2427585, 8164539, 5300369, 1503313, 6795808, 1256157, 1402220, 6562903, 595799, 3031716, 4579258, 5627044, 209186, 7848579, 5050592, 3933773, 5521463, 7289822, 6658207, 3371687, 4592956, 231037, 2001862, 5227604, 5448557, 2538291, 8139774, 3677821, 4615506, 3505424, 3876766, 2411907, 5249252, 2037047, 7741319, 6358855, 6566600, 7923849, 1232366, 1453978, 4922299, 6913429, 5341394, 1800314, 1133810, 6507443, 2085777, 4657014, 669972, 5010340, 4032138, 6587200, 7323504, 7735921, 775620, 7721576, 2325923, 2330430, 7744617, 2936130, 373620, 3421494, 374015, 3511014, 4797072, 6577084, 6346475, 5795908, 7611508, 1040217, 457088, 4670289, 7711473, 7448973, 4265018, 4510803, 7915998, 1004651, 2659414, 7309591, 5736628, 6258218, 8162726, 601213, 4464523, 3467524, 6540805, 3504721, 1763982, 7371202, 6314390, 1826945, 7285608, 762092, 1182482, 7622179, 8376424, 8018267, 6011283, 3366294, 1348193, 3221903, 6485111, 880821, 6416980, 4936966, 2532854, 6236202, 986565, 7895814, 4953879, 6751088, 1413315, 6667553, 5895037, 1277347, 3213948, 2959068, 848777, 4972000, 3039441, 325985, 4611317, 5527287, 3922640, 2800445, 6223357, 792891, 2789653, 2697073, 3928501, 2944629, 5486331, 156008, 5307206, 4622653, 5003570, 1703239, 5823561, 2178901, 5285389, 878823, 6860312, 5344880, 7585261, 381252, 2188179, 5012633, 7118099, 3246477, 1416032, 6364541, 4629825, 4096204, 3630410, 7265240, 4837638, 7625940, 1508919, 5574935, 2836392, 7921927, 3345408, 5171115, 4145128, 6599880, 631464, 8309043, 6865554, 2612603, 7243710, 4978635, 7038699, 7964434, 5782156, 3440767, 4435785, 3391825, 7436162, 4053228, 4113035, 5859556, 3128543, 2953251, 87988], -[1967490, 7221567, 5449611, 1570912, 1277515, 1377963, 5566291, 2835007, 2420399, 3969953, 6805931, 1063263, 391609, 3895399, 4940761, 6424085, 1586550, 5256262, 6960186, 7338374, 6487737, 2906347, 4377746, 1143067, 298279, 7511664, 1467215, 7574200, 5593604, 1424977, 3007303, 1806887, 5444292, 1139015, 7888777, 4420109, 4010540, 3033148, 5802628, 307691, 95903, 4999415, 4342355, 558808, 5149958, 7283217, 426251, 5346426, 4284653, 8163355, 4936071, 1273220, 7778791, 6614252, 5642074, 6814616, 7718437, 710722, 1561894, 4189579, 504633, 3038388, 2569887, 7644342, 4577151, 2191353, 4236315, 2819562, 6594174, 2248915, 2875413, 6908813, 1041193, 7404738, 1628053, 7217137, 7479551, 268135, 6666201, 399434, 7758146, 1982896, 5524356, 6971377, 7673128, 5703915, 5672659, 3433480, 5124386, 1909883, 2988282, 2273453, 5900303, 6067481, 5627335, 8282507, 8134363, 271632, 4638000, 6941936, 1447373, 4972185, 3056810, 3625723, 165855, 3276223, 3927997, 7773523, 2198706, 599529, 996096, 2933910, 4122442, 6996590, 4483614, 710759, 329980, 3510693, 963682, 8182093, 2401297, 3762367, 5145580, 201763, 304524, 3372415, 3164683, 7103855, 6707523, 836378, 7055938, 2529812, 7009430, 5103740, 4453512, 1190081, 521954, 328911, 5007023, 296032, 978406, 5874698, 3168817, 8167849, 7602268, 7486496, 1336629, 2858931, 6635843, 2085013, 4478504, 4275845, 7052952, 3485920, 1910808, 3534531, 7302595, 2127618, 7136422, 2016245, 689038, 3943049, 5122131, 272614, 6221866, 1842130, 5930122, 7630, 853083, 5180887, 5274387, 7405154, 6093582, 6230058, 740658, 5472272, 778788, 2497510, 4534855, 2769209, 5970888, 4965530, 497331, 3571695, 7850850, 4101490, 1434976, 6018757, 3972607, 425127, 8211822, 5210175, 903971, 5363691, 5970464, 1409290, 4573513, 2520287, 5538805, 349076, 1012008, 4992531, 3875256, 5752523, 6871866, 5351564, 4711696, 116234, 4646437, 1866582, 7387487, 901303, 1554223, 995299, 4901320, 7777887, 957431, 6412622, 5938499, 5669660, 4426383, 767638, 6485300, 996438, 3562872, 1597429, 3442905, 7708584, 7949842, 1815644, 5439888, 5863495, 521170, 5482426, 7772744, 3502671, 667447, 6022671, 4842566, 7405096, 2680465, 5366195, 4096954, 3570784, 2134781, 4791115, 802850, 7442930, 941548, 6502610, 4499748, 3752027, 4618148, 6604700, 5463321, 7825701], -[4766582, 1640145, 2537872, 7879244, 864471, 817759, 4384955, 5544122, 6904915, 7845636, 7335454, 8234952, 1144664, 2274574, 7501060, 4716895, 6629150, 6126247, 4060966, 4035173, 8227874, 385272, 2516696, 4182588, 788615, 446807, 1139952, 6120857, 1262734, 5567068, 3142656, 5662554, 4887682, 1056585, 5972082, 6944089, 3607390, 5777245, 4781955, 5419014, 3414107, 3211175, 3184684, 4113675, 2293578, 5197274, 1012736, 444986, 1280581, 5727231, 8237100, 7721433, 1932597, 8047793, 1500465, 5446745, 2261524, 5588056, 6307266, 4710692, 8209439, 5792679, 1040019, 1032145, 6094542, 3127571, 5741539, 2283052, 5712095, 4783026, 6068569, 4883947, 5339494, 4075635, 3776224, 2233852, 484751, 3167319, 2307458, 1207966, 6790625, 3318441, 1770167, 2362390, 7070140, 1754362, 2655167, 6272961, 3074803, 7875730, 1753365, 7141856, 7077971, 3933974, 4802679, 4142520, 7124001, 7442794, 3682479, 2942144, 4321306, 3574893, 3600735, 2162274, 747180, 4214362, 3500937, 2402015, 3205392, 6939260, 5632233, 6860279, 3460798, 7594095, 6506645, 818935, 7054707, 6570497, 968130, 104752, 6076968, 4563059, 5864283, 5841753, 5051801, 935385, 7882706, 5341206, 4720096, 6979172, 4334199, 6485235, 1820048, 6743544, 5015566, 7704571, 515389, 5273500, 3596086, 3220111, 3904840, 4827496, 4706204, 2191414, 2696600, 5360457, 3871406, 6486093, 407243, 1404641, 3191954, 613044, 1625694, 7050713, 3693549, 5520398, 7008300, 5065818, 3857104, 8252796, 2753899, 147276, 6868855, 3449419, 4627701, 1879117, 3849761, 4021328, 7547390, 2588989, 1781620, 2700516, 5612878, 6082603, 3112809, 1130479, 1751445, 303766, 3075906, 2625758, 6402554, 3257990, 5343077, 100903, 5342896, 5286394, 4066191, 1775540, 2469805, 2929293, 6649237, 4305160, 5825045, 1819972, 3671983, 4763756, 1268251, 2821591, 2085899, 4893504, 2294536, 6196410, 6232654, 1613541, 2062243, 8200399, 3473787, 6800036, 605362, 6739077, 7827864, 7492836, 5427315, 7695666, 588389, 3410431, 3665677, 6249625, 6830989, 25975, 8360277, 5836206, 915215, 3211103, 6857529, 5582645, 4771326, 972293, 1941883, 6889711, 160533, 2589940, 498058, 4241299, 4314379, 7874761, 8283371, 34669, 8159798, 8035988, 7151925, 4914034, 8177236, 4069175, 876999, 7533114, 2797054, 1559342, 4484486, 1868384, 863544, 4492582, 2747836, 4096402, 5222568, 6471089], -[1059747, 4360866, 7108506, 5922838, 2635721, 5799108, 2544421, 7112151, 5543554, 8086116, 1581538, 1605789, 237106, 2803582, 4318997, 405019, 490944, 7268658, 3953816, 5399337, 760801, 2568999, 5373498, 2544165, 477236, 7674539, 7118864, 228773, 940801, 3883882, 8284945, 6465551, 7544525, 2103740, 742923, 7800038, 5882856, 503177, 7196508, 5485761, 1603745, 4780566, 4697368, 2011011, 1245907, 1474221, 4608026, 3622749, 383455, 5939389, 4980078, 6366471, 1159390, 7091867, 6882355, 1669847, 2496457, 3392274, 2916374, 3463272, 6886437, 1331415, 1245812, 3832930, 1741193, 6534042, 4886403, 3687895, 6844155, 7636338, 3609577, 2329688, 2989358, 257985, 3901737, 6649293, 3667963, 5543004, 7637674, 6402714, 4922134, 3165645, 7788369, 7260342, 4142396, 4175800, 5470074, 6146604, 8280136, 4947246, 7592364, 4437520, 7212789, 7368081, 8279638, 5332745, 7247363, 4222924, 1413629, 1359303, 2210951, 4394667, 4977229, 2778160, 6932698, 6611460, 2412423, 8057424, 6249780, 1922829, 8072999, 8225238, 6441736, 6095525, 5357271, 86949, 2868012, 1776730, 497547, 5105412, 916173, 4656445, 6148246, 244875, 186324, 4408043, 6722079, 3781481, 474453, 6400893, 4256700, 6910128, 3454289, 5331570, 4945966, 4538359, 1166488, 3127868, 1014485, 6154227, 2199635, 4377124, 558790, 2324565, 2812020, 6061616, 1670647, 6856979, 7767078, 6944180, 8131792, 5919898, 4459758, 3461283, 5229739, 4201711, 1074923, 850624, 6913978, 4374357, 6894556, 2624160, 6411854, 3935591, 4326893, 2581179, 115159, 7953384, 4265682, 4713819, 3054879, 6491042, 1596078, 1332639, 1547234, 1740602, 3968437, 2832785, 2997484, 1983651, 7374304, 6977795, 8362814, 6125642, 5751610, 7010668, 3416161, 1521446, 3676072, 5788513, 4746020, 6037537, 5282013, 2335169, 5342323, 6350707, 7535087, 1907122, 7797619, 3510838, 6759971, 3949786, 2465418, 6300786, 1327641, 2593488, 584477, 273514, 6884934, 7569617, 3614281, 7454530, 163023, 5800082, 8374706, 5035983, 445542, 6583828, 2621815, 5942582, 2271176, 2379578, 3736589, 3587123, 6755513, 4626563, 1339844, 6856965, 1842430, 2871322, 7194630, 395194, 5583164, 6044594, 4651759, 2593330, 7221807, 7231363, 5664874, 5427281, 6183144, 3429290, 8038794, 7212038, 4298573, 2954250, 1343298, 551499, 1306918, 5357649, 1040000, 6016924, 2270012, 2009414, 7914746, 2441319]] -NTT(t1): [[5566064, 8085207, 4830651, 8260903, 4504602, 4796337, 6780081, 91566, 1067423, 2397821, 3777971, 3201356, 1304096, 2661444, 3891915, 7762298, 7230537, 863050, 512092, 2270079, 7308503, 5735899, 4767024, 3575877, 8277944, 2170783, 6960604, 238624, 5005578, 2896999, 2252189, 2825609, 7503420, 6989246, 6381482, 5224093, 793703, 7453928, 1106901, 4030206, 5629689, 5971908, 5777301, 4833581, 8195479, 4602497, 6394948, 3742030, 462340, 1047572, 6379746, 5641673, 1245334, 3249485, 7944873, 1578392, 7395731, 8000191, 3341024, 897078, 6531754, 4865061, 6608139, 2225556, 1756208, 2621144, 2923779, 916700, 2319355, 5190517, 1788931, 2087918, 1050052, 4746317, 8144839, 7585675, 7347789, 3241731, 5499912, 2436634, 6634116, 3733319, 7687329, 7429901, 925567, 653281, 5955825, 3983095, 5925140, 3729545, 6466305, 3836865, 6504935, 3258996, 219549, 1177754, 5635978, 1857555, 1431492, 8124655, 408678, 5053872, 7984902, 2107505, 7222426, 3282818, 7050108, 3779919, 8229934, 1614646, 6388592, 4161617, 6899529, 8295717, 164327, 7618756, 6808624, 5950511, 3693787, 1012106, 7116425, 1516413, 2037404, 5017470, 3739995, 575135, 4302473, 3780496, 6378803, 4083698, 5837475, 7336535, 6823211, 2950526, 1351651, 6498703, 1769315, 3860459, 1990801, 7976835, 1201327, 7704553, 5594197, 4318064, 3799298, 4905538, 7419061, 4416753, 1092281, 3475, 6507356, 7112103, 6820751, 7781761, 5706058, 793648, 1343999, 3499119, 7812200, 5674782, 3058380, 4106162, 5104589, 88911, 5119928, 3990440, 558267, 6864635, 4659865, 7227802, 4234721, 748924, 6549151, 7685157, 2972898, 2982001, 4346421, 481699, 3127862, 4917189, 2838598, 1153902, 7945219, 4394199, 7590896, 8073874, 8099562, 5013866, 672885, 2683705, 3453890, 924352, 3487169, 785340, 5504653, 1648976, 6852999, 8153722, 5047851, 2594629, 1813212, 2288694, 2434228, 3333894, 8033558, 1225560, 616351, 1597251, 477607, 3386755, 5397293, 3384598, 7384229, 424913, 10215, 4799661, 4205825, 5783818, 294207, 5179936, 788962, 8009023, 1469980, 722956, 6556818, 878470, 3476442, 6432096, 5758389, 292584, 6528034, 2109041, 77849, 5846304, 2054260, 2576845, 7897402, 1090338, 268953, 478193, 1622293, 3503559, 897925, 3204180, 754421, 4721132, 1637344, 6698684, 6147481, 5500806, 5739234, 6689014, 5988750, 5060501, 3005729, 7178250], -[5031937, 5786420, 6892283, 7324881, 1888277, 7529900, 7891455, 5773489, 601174, 171778, 8013802, 1281504, 8060002, 1772326, 4309814, 4645568, 3234390, 1273560, 201559, 1878321, 1416976, 7593985, 5881508, 4595575, 7332809, 5447071, 4559557, 868592, 6235631, 6547816, 5562105, 5166263, 4092897, 5612518, 5253118, 6704020, 2719248, 3587485, 2470748, 6978992, 2003691, 6193822, 4741495, 5152015, 2080314, 2004495, 4637066, 401376, 1331579, 2883084, 1849768, 7498482, 4595019, 871107, 3898732, 4759626, 4340167, 7161962, 2351909, 3849665, 5821491, 18589, 3556289, 7430078, 4079535, 3431797, 428931, 3888610, 3947906, 2045836, 4656334, 627801, 5738203, 7681353, 5070085, 3499803, 2698887, 4474677, 7717694, 800472, 7409843, 1951855, 6779815, 3494654, 1594187, 7255259, 119675, 1086608, 7554477, 4704707, 1720878, 4746832, 6952131, 1354752, 952104, 2265973, 7256968, 1294956, 3147077, 4131202, 4285385, 7197246, 6704266, 2300021, 6852146, 2373912, 2852003, 6013309, 2498852, 1642796, 1725753, 6886401, 4209954, 6499524, 7260054, 2769158, 3600004, 360554, 7207437, 2910416, 7827798, 3451528, 3859677, 2549760, 7085786, 4288909, 3834578, 5894763, 1302145, 5583880, 4295354, 2836910, 3163757, 2964532, 2015915, 6690235, 5324219, 6480368, 1160020, 5629460, 1561753, 1756272, 2301064, 5894060, 4967369, 150594, 7989277, 1899750, 1955326, 8095919, 4324729, 7065876, 1468452, 7342282, 7431853, 1537611, 3911160, 2885949, 2772557, 7840782, 4608267, 1574205, 6563635, 7549703, 5591564, 7556750, 5662713, 8124999, 1699519, 3220553, 6514166, 3125153, 1586147, 5458462, 1652477, 57390, 6976055, 3122498, 776462, 5338842, 5747257, 6945297, 6556834, 3412929, 4017294, 2144804, 7372760, 6528444, 3928180, 4018638, 5829687, 6846023, 483301, 6968876, 6212926, 2359560, 5365849, 6423930, 6780975, 2774727, 3417223, 5313481, 7654732, 1950267, 1051032, 4706552, 7211554, 229147, 1296487, 2937850, 232933, 3606197, 3592792, 2606746, 7229349, 6539540, 2877923, 3195847, 7232479, 2306891, 1130283, 5487383, 6757907, 3937572, 3519792, 5969363, 7809029, 2029054, 5506377, 4018732, 4635805, 2006303, 2835404, 7889338, 1264923, 8083444, 4502433, 2370663, 120309, 6894540, 37871, 4038374, 896374, 5715858, 6013132, 7948873, 4925737, 201616, 5427304, 4404790, 1835354, 5810253, 145558, 2075024, 5740332, 4484095], -[1091527, 4148077, 1211674, 3902928, 3349942, 5280150, 390237, 610127, 2113615, 6753527, 2371127, 6666728, 1074309, 5844495, 5533743, 312294, 3296754, 4077971, 7940299, 7741957, 6751363, 7365490, 2074842, 6794537, 2177188, 6394751, 2888877, 7680786, 3776595, 1869455, 7670995, 6852092, 74424, 572187, 7717072, 435023, 524537, 3502593, 980750, 7908977, 320203, 3219300, 3094380, 3780364, 3948748, 154133, 5751852, 3075337, 54875, 7938991, 1304560, 3697491, 6406477, 3582316, 1988578, 7283408, 7750014, 5294467, 2428505, 2214655, 1993308, 6044204, 4345193, 1887938, 5748674, 6284864, 134271, 7392340, 3753584, 5974818, 7913911, 465192, 978780, 8344075, 6901253, 5158774, 8201965, 684554, 3750596, 2331267, 866614, 3643298, 2719151, 5561968, 5180143, 6751207, 4014236, 490666, 4482985, 4382977, 1705547, 733023, 5597994, 4530387, 5906607, 890281, 938245, 5995343, 1553339, 6676127, 3436289, 6255507, 2589997, 2411958, 2647593, 205088, 4384082, 3854683, 116268, 6090579, 6536797, 5175647, 7241053, 6347314, 8005605, 2893224, 1727360, 1987478, 4532524, 6646522, 7928782, 3649972, 125462, 5321977, 4422483, 7309403, 6985222, 4806674, 3120066, 7350136, 7149745, 4039684, 3942507, 5389843, 2996498, 3888836, 2388416, 7560290, 5851609, 4340744, 3365316, 5954664, 4872313, 7759474, 2657134, 232498, 4814319, 565229, 3090692, 7770109, 5229058, 2658995, 2050265, 4782122, 2689493, 6964316, 6155977, 2922619, 7934614, 7789686, 2252663, 7330706, 5277819, 362789, 1171192, 1759553, 3589521, 7906363, 7859542, 2758508, 4712351, 2127739, 1039495, 4055474, 3127693, 7054722, 5875274, 7570614, 3029004, 8107588, 6681891, 1144360, 2687362, 1024189, 1881102, 2763806, 2428872, 4089452, 1861835, 5816224, 7995336, 2474040, 5976724, 1901094, 6085441, 2034722, 4264976, 6858787, 4052128, 2554618, 2605234, 4949434, 7271834, 3755965, 748000, 3837990, 1308615, 5823714, 2504882, 8289251, 2820335, 3538316, 467757, 2421124, 3738955, 6768714, 5397629, 5567914, 2144222, 4777092, 3897348, 3475103, 4276267, 971820, 4949622, 1671852, 6650160, 5808811, 4045456, 4224941, 7146351, 4598297, 5783366, 3633765, 1880767, 5366687, 5728328, 2679266, 2845772, 5027525, 5347630, 7420227, 65075, 4638008, 6611764, 238824, 7268259, 8019784, 3371160, 8071015, 35919, 245553, 7855510, 1733808, 3669108, 2570118], -[3645497, 3858207, 1299714, 2977125, 3467581, 3026544, 7132453, 6227132, 2842101, 6312395, 1385664, 2052969, 2148393, 7413526, 6469531, 8103347, 7292693, 1059017, 3159911, 622422, 8281913, 1872153, 6053960, 3680464, 6093036, 1143401, 7510512, 117415, 589501, 2403167, 3636154, 7508954, 301904, 592978, 2322778, 6707812, 7128041, 2427940, 3538707, 3882531, 6605746, 489759, 4070027, 1887109, 3808436, 663357, 3540185, 544862, 4596266, 1868103, 1120495, 2150578, 4353826, 4130858, 4107200, 83286, 5240230, 3252756, 826400, 7099138, 5921833, 6743856, 5960911, 8003962, 3639612, 4182112, 1631726, 5913858, 5230122, 7713235, 7248908, 4804266, 767254, 7089452, 6143594, 5271875, 7567810, 3241538, 8089305, 7095725, 2100257, 8243645, 706776, 7220036, 116541, 4308596, 4822557, 1510757, 4989829, 3528410, 1866783, 3438510, 3798634, 6972222, 622796, 1313473, 1999276, 126204, 6738790, 7370907, 8118453, 2826738, 6729432, 8053835, 7116781, 6350260, 8053772, 299520, 7228441, 2018776, 7774988, 2151807, 3115425, 1925214, 8371973, 2825223, 894033, 5349021, 7500425, 5533995, 7328470, 5801833, 1071160, 4702833, 4351624, 1549374, 1160248, 2205924, 3970967, 2828284, 7041828, 6801453, 2117766, 7639421, 2088049, 6099966, 4445087, 7654857, 8352392, 5769896, 5743354, 1137412, 6812263, 4483073, 2381490, 6623162, 3142925, 2834434, 1600952, 5588834, 1911392, 1556272, 7483458, 8249306, 759634, 5312291, 2693394, 6928838, 891027, 3023566, 3657531, 585124, 3306404, 3631495, 1032255, 5605751, 4816140, 8362134, 1140041, 3880958, 3312606, 6760182, 858007, 8226903, 5246753, 3194750, 7050577, 997776, 3846275, 513308, 373420, 1856693, 2151484, 674951, 3519199, 8081444, 3394648, 1302185, 7858618, 6746079, 1861179, 1556490, 2244934, 7862980, 5608335, 301433, 6546675, 2337165, 1709486, 2014762, 2546709, 4797973, 5869505, 7587256, 8119365, 456577, 1941454, 4461951, 1799412, 333407, 7668482, 479912, 5536942, 1711971, 6196388, 3139468, 6234997, 1246791, 1733140, 508422, 7415737, 6830806, 3442683, 2861715, 7098319, 5844849, 6392467, 8004978, 6297814, 4105188, 5754316, 457505, 281770, 1616666, 2594451, 5599675, 868124, 6740711, 6236612, 3339209, 4431736, 4434059, 1554106, 5037575, 7414520, 6050026, 1886382, 2681938, 894706, 3123499, 7730718, 3737246, 7205279, 5127963, 2379245, 585802], -[2274589, 4563812, 2217109, 255156, 7266392, 4124139, 7018892, 1652531, 5600301, 4623519, 5725860, 1057656, 515044, 6984800, 6021929, 6493614, 3067273, 7581403, 7999630, 5723169, 7219512, 5122290, 4766814, 6104313, 6705611, 4427965, 3562691, 2756510, 7067140, 6569306, 3531942, 411333, 2633461, 2697987, 7444320, 7069172, 5644432, 2767621, 52204, 6640109, 3014026, 2695416, 7048560, 7920853, 4544476, 4363221, 4894580, 3255597, 2919103, 3531572, 3938847, 983384, 4478317, 2799731, 7054344, 5134242, 6952495, 525044, 3585171, 3474103, 2788537, 516016, 406130, 3169664, 3170518, 3080377, 3662585, 988944, 4923418, 3957588, 2555119, 7135605, 1302444, 3098086, 7075871, 4312966, 1663769, 8333396, 5873104, 7067336, 6627266, 505923, 5802136, 7131145, 5237031, 355057, 6241497, 7242768, 3877088, 6280947, 7659657, 951239, 1430074, 4349366, 7635901, 1911756, 7453573, 6320175, 2846128, 660516, 3397253, 4519204, 6948309, 4750058, 2060858, 3336821, 7810381, 7864399, 6150750, 5117908, 3685613, 2226237, 3993308, 4879129, 2347933, 5973036, 6863606, 2311481, 5775419, 7895647, 2370283, 761769, 5490953, 6272889, 4136588, 388759, 2693186, 5594415, 2875606, 3608946, 8192360, 4197492, 7365619, 6336441, 1235698, 8187332, 811431, 2476465, 131302, 3954135, 6099623, 6211226, 4527796, 6402603, 6687355, 3843722, 878030, 5470393, 3239083, 2611574, 4782399, 2298053, 2859650, 4169914, 4131821, 6645730, 4003032, 6997457, 2804033, 7236069, 7778323, 5281767, 7276281, 1525470, 3881466, 7354822, 2024054, 5656492, 6428602, 4033015, 3424924, 4702494, 4562511, 4211481, 6040880, 8066527, 1218428, 3515095, 2252900, 5053556, 6585651, 8192547, 5150392, 6015712, 8096678, 2947182, 7922549, 4197539, 1233795, 1003500, 3289301, 6075572, 4990449, 7313669, 132247, 6296743, 7284471, 2348543, 4940082, 2196484, 5091665, 3595621, 3213853, 6815771, 1990100, 1733938, 4553964, 4890566, 3493058, 6449636, 2175479, 7148814, 2987627, 3054237, 1898778, 2036656, 1157078, 5585097, 1242220, 7644910, 177823, 1039513, 6056354, 6096387, 5087712, 7494423, 4869246, 4710828, 6893526, 7990638, 7635070, 6923136, 2908022, 5908079, 7809200, 6172705, 8321366, 4262062, 4802210, 6595638, 4547330, 7670146, 775753, 7020872, 4862355, 208399, 6910061, 3090075, 7653069, 6771380, 3368674, 4446110, 2677892, 6724719, 8109473, 3117947], -[8139176, 3957293, 1362807, 2670427, 401888, 4797923, 4423905, 4312711, 388073, 1631860, 32940, 5080542, 5237387, 5789728, 6489837, 7973292, 7933205, 118973, 7883580, 1813053, 1351940, 6273479, 4124001, 6968120, 1073865, 1824776, 4192058, 1103991, 4283338, 1830566, 6050178, 4076864, 3155410, 2460665, 2466941, 6540994, 2730650, 7185414, 373549, 1387707, 1685756, 4772159, 7770179, 3595272, 7212342, 87896, 6985863, 1633112, 7083322, 4429782, 541684, 7065104, 1377319, 7325758, 5267345, 3420674, 5958855, 1398409, 4294758, 5232259, 7418762, 82915, 1832193, 6994767, 8237478, 7202105, 7918366, 6429068, 4039626, 1888757, 7182074, 5277742, 6206300, 1531581, 1569923, 7653727, 18326, 1345517, 305249, 795403, 5422631, 5049753, 4802015, 2046922, 8085770, 7602421, 422666, 1815842, 8010168, 2945450, 3031028, 4130496, 8304994, 8135181, 1658915, 5257160, 5890, 8124427, 7966827, 7754638, 3376907, 6718406, 7466129, 6222600, 483808, 2046792, 4560835, 2938010, 614274, 5711230, 6901654, 1060278, 1195873, 4686111, 4108065, 1326368, 949541, 8032730, 4424738, 4786183, 7992825, 6378263, 3625813, 7229363, 4808346, 4036006, 4069463, 969162, 5461078, 7724276, 1288649, 7270605, 1244352, 631286, 4466591, 3269449, 6886817, 3066999, 5919350, 5371666, 828475, 2337942, 3956963, 2228911, 3978443, 7528047, 3589214, 5894452, 7568202, 2201941, 4875486, 7541772, 5575677, 1447718, 6984155, 666589, 4519762, 1748037, 2768279, 8007466, 6721770, 1768642, 4315937, 3666342, 5000369, 1884102, 2121086, 2891222, 4958296, 2459699, 3812327, 1442666, 5202630, 4525428, 568894, 3162075, 1284756, 4826381, 763948, 1743923, 5835928, 1707331, 2080367, 1358756, 4708659, 5129368, 377252, 5292486, 1274475, 1087191, 1949067, 5417283, 3453188, 8007117, 3675875, 4454546, 577935, 2955186, 2511146, 5707005, 4204193, 3971833, 308724, 4211912, 917907, 2356773, 6973365, 6153874, 1443181, 4508636, 2296286, 8175456, 4215551, 1335598, 4510983, 6965498, 4788616, 7696936, 7793218, 5417767, 3101134, 2097919, 4210124, 8182378, 7142118, 3955554, 3444537, 5725198, 7615079, 3058114, 130398, 1198918, 2638025, 2044883, 5496663, 5441189, 6490486, 7412468, 1730187, 5627338, 4780805, 3987738, 5490056, 7365615, 6202890, 3562131, 6016494, 5139778, 92226, 6761478, 904740, 6050880, 7791222, 2610660, 7665682, 945387], -[4641210, 1102853, 1383161, 7548894, 1483664, 1527378, 6704863, 5571674, 8156612, 7940738, 1818133, 5992808, 1018065, 1599543, 3217047, 6069822, 7760811, 6475002, 3932214, 1997114, 6099971, 7838745, 212466, 5877555, 2791539, 3655072, 996688, 1154454, 1178829, 6762581, 8017577, 7058855, 1752060, 6253282, 97226, 5827718, 585360, 2729744, 3751025, 414878, 8212544, 4874659, 1950559, 4588551, 4965848, 4298774, 8210616, 6873201, 2545686, 575220, 4256156, 5778477, 6192232, 1105171, 1798147, 2087545, 7354693, 5794945, 1267089, 1983339, 7306715, 2849961, 3428837, 6352382, 5105015, 6257971, 8250760, 5696917, 3209454, 2444368, 2851390, 5862143, 2679162, 6744677, 5531642, 7240905, 3361989, 5652514, 6538170, 1815922, 5230431, 5113905, 2422766, 3339047, 4926340, 735629, 7502232, 1796915, 5637660, 718370, 6839287, 5582813, 5375096, 4275109, 3852925, 6110891, 2827427, 1027923, 4453423, 2913558, 1894401, 2703681, 4157474, 7885424, 6101598, 6573587, 4906362, 3851818, 1736686, 2022782, 1900965, 5603827, 5156940, 7346011, 6647885, 8167473, 6064895, 4984295, 4942383, 7019306, 6438500, 5690450, 6334023, 23313, 7709409, 7603692, 281269, 4459105, 3403906, 8286260, 3080737, 2622500, 6040278, 426233, 4060659, 1852038, 3856172, 462352, 3358351, 7069256, 6103282, 776695, 6948008, 7238772, 5951585, 8292805, 260088, 8289437, 600584, 7199020, 5874292, 6011207, 3451104, 6403915, 41486, 2676503, 8250489, 1347682, 6271860, 5577636, 184331, 3132226, 3933798, 1846217, 6587045, 2399001, 3509686, 6448099, 630953, 2703576, 6138887, 1405869, 1900641, 6845466, 3473290, 8299507, 8073919, 5694125, 862035, 221306, 5536365, 6855448, 8347554, 8378125, 1049372, 251054, 3291985, 5398894, 59585, 1206911, 3946950, 4184272, 4016014, 5568863, 2037670, 4563702, 2531808, 4388309, 5718850, 1105300, 1747316, 1135530, 5363276, 8045690, 5381725, 7668825, 4150155, 3599195, 5722526, 413218, 3212060, 2679392, 1049047, 3637189, 2845513, 6027431, 48586, 7637227, 5283786, 6543203, 1799246, 3815988, 8265941, 2459804, 1473058, 3162430, 3170159, 4966639, 7663543, 2273461, 1939893, 114117, 6105325, 7329791, 4513500, 7946939, 512801, 5149760, 183668, 238180, 2974128, 2232000, 181634, 4805485, 556885, 2725276, 5755183, 2812140, 4213494, 1631325, 5127961, 7579079, 1008177, 2289620, 2987574, 5710195], -[3923978, 7531956, 1984338, 7034115, 6290810, 88224, 5350580, 743116, 3835779, 2014601, 292142, 6839248, 4984587, 6074358, 4910855, 3161582, 6164708, 3569573, 6663533, 5900033, 2137939, 4061318, 7968656, 6687750, 3604867, 2456331, 7986381, 4453493, 3384670, 660364, 4320910, 467103, 660229, 7328809, 6420098, 7844818, 1195220, 2375736, 7714980, 7439921, 5476418, 248616, 4986104, 2362743, 6583669, 6803060, 7485412, 5567466, 1509002, 4887060, 1459131, 5128372, 359035, 3612615, 7659896, 6367481, 4917275, 5345288, 6794162, 3512970, 4339723, 1502065, 5338052, 2483712, 1874072, 3051574, 3760621, 1596580, 7193228, 2234888, 5757361, 8132363, 533405, 1691082, 5501243, 7608322, 7002032, 7670474, 1363088, 5975823, 4745200, 2440122, 3519182, 3501037, 670879, 7271941, 2536722, 1438733, 7408112, 2574328, 1938242, 5965668, 1388138, 7436749, 5744717, 4158706, 4159724, 7195262, 6412865, 694178, 441829, 8089917, 3743484, 3234255, 5189216, 3421259, 3684975, 5741060, 2601359, 2630662, 109442, 4341484, 3093486, 2385887, 4518527, 6177398, 3424642, 847104, 3104469, 3413606, 3108578, 5798744, 3454694, 3697993, 7845766, 5416198, 604156, 1551814, 6005864, 5269167, 3822285, 7081232, 7055824, 7367177, 2290923, 1906016, 4969760, 8060519, 1134459, 706210, 5102616, 2397771, 3523096, 6312871, 3511321, 1317492, 975474, 1184369, 8204163, 5402549, 1685580, 964945, 2273915, 4561478, 141141, 173441, 5487819, 8321272, 2737595, 6063645, 2357634, 5855910, 1839938, 7900202, 2505088, 4968216, 266315, 5687973, 360987, 196987, 5480751, 5799471, 7939730, 6672444, 7015598, 5623950, 5904311, 7766208, 4439875, 8063261, 7011528, 2895434, 6727258, 3719978, 7018645, 2925328, 3496462, 5249353, 2023110, 1510944, 5732670, 6460180, 5706188, 2424258, 1342295, 7113029, 2898496, 4159120, 6162231, 3462878, 6859186, 1664503, 5218126, 6208473, 2551560, 6985418, 1260809, 4362547, 1440397, 3973214, 6517356, 2102005, 3767739, 7859615, 6205234, 1767481, 2460534, 1061756, 4652830, 1265610, 6925747, 2725139, 4359177, 2493071, 3174952, 3078073, 3623891, 4085785, 2054520, 5623672, 7147948, 1674171, 6333728, 2389341, 3231339, 4368014, 111043, 2902765, 5541828, 3605927, 6698276, 4899684, 7896054, 5266363, 208021, 2062238, 3511985, 8162522, 640843, 1792338, 1900358, 1779099, 3880078, 7273125, 1266626, 7891621]] -NTT(t1) * 2^d: [[7727808, 3580193, 363918, 1450101, 2723533, 4197808, 5400093, 4251559, 3554285, 7632601, 258451, 3183559, 6503174, 5084631, 3461412, 6521437, 8152165, 5414069, 4849164, 341845, 1557528, 7866906, 7097805, 4026969, 6963301, 8189879, 910700, 2170647, 314595, 7255281, 4634471, 677174, 6038362, 894288, 59298, 5360654, 7191801, 2859914, 121798, 4984989, 977537, 5376307, 3434993, 7605644, 1843381, 159341, 1427349, 7524791, 7921213, 162816, 2598820, 6965878, 2808639, 3576728, 2081194, 7584250, 3793859, 2703732, 7607103, 7617684, 7546640, 5696877, 4761285, 4347777, 6060364, 1783294, 365782, 752768, 1750821, 6859823, 5953836, 8173576, 3718142, 5074401, 6021351, 1057545, 4932594, 7099296, 2157312, 7132851, 8054444, 3207615, 4145830, 7160738, 6347896, 4971906, 7711043, 4550859, 7752033, 5812675, 7735120, 5034330, 5736234, 6067087, 5136170, 2300801, 2214523, 6633705, 2579081, 8282363, 4103793, 2059444, 3162499, 1021940, 369772, 86903, 5031189, 7836050, 7544980, 2882006, 8021916, 430108, 3409320, 1712211, 5300064, 3883753, 4572673, 6080840, 6197734, 2939939, 3572948, 2677302, 5003321, 5549272, 7614905, 1711566, 6205331, 4182417, 3254181, 7409769, 1935798, 4924413, 6743539, 1586364, 2194135, 4966192, 4487487, 5566787, 350310, 4120971, 2661226, 2777749, 3541668, 8220548, 7360895, 2067781, 2163628, 3780387, 6061013, 3325949, 427815, 1688792, 3352053, 6734410, 6441527, 6741241, 6552287, 3756708, 4678188, 1641045, 5182547, 7065683, 6892675, 7643050, 6843508, 6058180, 5995999, 2491850, 814645, 2507879, 4288469, 720164, 7595775, 3113640, 488614, 8017054, 5869416, 7282218, 4510735, 5328186, 6518058, 8035225, 4915626, 3387193, 1925892, 2924844, 3850515, 1166555, 6339951, 3077569, 1979088, 4775033, 6427312, 5725441, 7473916, 7559605, 7734742, 3367134, 3017914, 2463256, 3733780, 1988419, 4183733, 7861062, 7872852, 47954, 4136358, 2849255, 7282222, 5116690, 7924581, 4207380, 1754062, 3014241, 8257527, 6286765, 2224113, 6539755, 4964065, 3984441, 1875197, 8012140, 7797348, 5881150, 3360503, 6028454, 2355898, 4048753, 7735812, 48866, 2213651, 5224435, 827316, 7219630, 620584, 7624234, 7078361, 6904791, 7593722, 3702317, 6863311, 6607520, 6175891, 1176516, 3849503, 8269306, 4454848, 648812, 2238599, 1100543, 1665558, 5236342, 878882, 6081710, 1266822, 7218328], -[6737098, 2714088, 2713007, 1639432, 6895819, 5071680, 262622, 5728757, 5512629, 7675737, 5259623, 5798684, 6611258, 4012348, 7679884, 1019459, 5624743, 7764772, 229179, 760020, 989847, 2089729, 2296203, 2117236, 7922689, 5065524, 372375, 531631, 3647537, 5039872, 436931, 920646, 7344224, 2779794, 101361, 2459239, 931230, 6935118, 1660561, 697690, 5380186, 4745306, 7474662, 1526868, 4544527, 3586137, 6794828, 2948728, 5372651, 2209022, 1505520, 7488351, 5942901, 4373677, 643357, 5156308, 4919150, 7873704, 259845, 946509, 5081542, 1433582, 2789996, 230305, 6828141, 5362406, 2408029, 1528103, 1216749, 7034929, 5410361, 5750171, 1600023, 5472940, 789668, 979619, 1742258, 610026, 1483400, 3980530, 2073525, 8140941, 3221021, 701096, 2890218, 1164364, 8249228, 1489882, 5276456, 7802378, 1571182, 912864, 6923637, 2456276, 5848158, 227161, 6784075, 7052047, 2692092, 2682938, 307107, 3605637, 4474471, 2594616, 746966, 4519664, 7386397, 936202, 5617270, 7215547, 7985514, 4810165, 2527213, 3311407, 6923336, 7533934, 545345, 3751584, 3286139, 8221924, 6750749, 7770835, 7541060, 3634756, 3990770, 4034464, 3060060, 1935742, 7281416, 2828974, 6549402, 1070379, 5247980, 7378095, 4954190, 6858357, 4311980, 5613378, 7871379, 7481986, 5364234, 6584652, 2758455, 4557183, 5762313, 1744749, 5480831, 317631, 3053705, 7528727, 4157309, 115973, 3660389, 1721335, 6390688, 342561, 1888529, 537851, 1856874, 4170256, 5525096, 6806014, 542448, 8069933, 7113383, 7136038, 3336801, 2719994, 2587011, 1217460, 5932833, 7459858, 4069874, 6196009, 2718129, 835528, 1779037, 2470932, 40201, 6777758, 346638, 1222011, 3491575, 1643256, 8155306, 4880336, 8365018, 5572371, 7229697, 2404520, 5179838, 869852, 3644968, 1631588, 2017351, 4273918, 1747843, 4196217, 4343324, 2872680, 3298036, 150454, 5284550, 3512462, 3365885, 6155784, 3490935, 8339233, 2833165, 6689993, 5832477, 995899, 127560, 1160716, 6800486, 4286216, 1832195, 8336333, 7300195, 210737, 7297968, 84748, 8119859, 364791, 5501584, 1288501, 3842607, 3643457, 4836090, 3174568, 4845133, 1636439, 5494061, 8061409, 4053804, 5898531, 1715919, 3045107, 5062539, 4441517, 163803, 4853909, 1850516, 2918957, 7866635, 1327526, 8310066, 696123, 2362183, 6344495, 751870, 5204433, 2391922, 3110932, 2279957, 2338529], -[8264662, 6836266, 3619680, 1495321, 5239606, 3656663, 3882627, 3431852, 792558, 5760567, 6846195, 7038604, 1301478, 780719, 2747103, 2285263, 5305194, 2396270, 6513071, 7496305, 4793913, 7472097, 1619988, 6497807, 1996720, 8193942, 7763193, 828076, 5747093, 3553501, 4424374, 304598, 6291384, 2702801, 4768393, 2031191, 6233600, 7074465, 5864514, 1335757, 32455, 7713718, 6779952, 3101073, 8114413, 5594986, 4467210, 1627202, 5373899, 4178352, 1923845, 3019234, 3688330, 6492755, 7280745, 5489713, 6455913, 3615689, 7583419, 7231372, 4126820, 2615532, 4190057, 4118731, 3574285, 4704257, 2113405, 1156038, 1610155, 4073776, 8233417, 6143546, 6487108, 3981348, 771494, 6614094, 4694191, 1367395, 2273710, 7149338, 1088689, 3232279, 136606, 7695044, 5680185, 3515961, 8245421, 5316129, 1625826, 3641156, 1685885, 4545844, 1125024, 4443828, 6777203, 2219162, 1260651, 4606236, 3480082, 231042, 258785, 7243806, 6419997, 6117067, 562660, 3997496, 4312899, 151880, 5480335, 5400767, 6956811, 2370621, 2114650, 5089220, 5153135, 1471732, 4389224, 6649962, 5189298, 738975, 4350394, 7623185, 5373830, 2706350, 438045, 549911, 1451348, 5074342, 7689239, 7398384, 8357044, 7205012, 7270643, 5557100, 1070223, 3379495, 6010594, 2614050, 395688, 1265517, 5477159, 6580548, 6442342, 148063, 3298779, 2268957, 658846, 4365784, 1709107, 3465813, 4131849, 1783257, 1415212, 5074366, 210363, 6178153, 4794495, 7623896, 1843636, 4612674, 137062, 7455747, 1321945, 5299870, 7207816, 8321353, 6853196, 5063120, 7004670, 4093304, 3378690, 7550945, 1039368, 2470020, 3126287, 926992, 1509777, 3384088, 7566448, 2556171, 5547645, 5290914, 7894462, 1358871, 6781138, 5592435, 2209466, 4264035, 8173797, 3836363, 4833657, 3487374, 2926894, 2947262, 5212356, 8173628, 724919, 4867536, 200839, 1529407, 5535246, 1305882, 2860092, 4354473, 1531173, 5869913, 1620737, 6531524, 4732528, 7405658, 7755068, 6402686, 2014775, 5781186, 7475642, 4466216, 2296676, 6122174, 112592, 5770691, 6066463, 8147644, 1036204, 8133707, 2845978, 2210206, 5400220, 1771986, 4206734, 7974879, 5694647, 7655026, 2836971, 561696, 4036818, 232322, 4508193, 234949, 6624547, 4115662, 3345301, 3335083, 5128129, 6131275, 935617, 3809047, 7095360, 3981665, 3068705, 4645167, 933853, 270096, 7496194, 6928738, 5157374, 2799152], -[4485653, 3879237, 4127498, 1594530, 5190339, 4174962, 787652, 1067065, 1692966, 3966950, 4274870, 6805546, 759756, 7103410, 640844, 1335567, 6128680, 1735669, 7263216, 3587488, 5955681, 514266, 7112931, 6001139, 387260, 5815203, 5473107, 6496142, 2072000, 1144531, 3371550, 1090388, 974553, 5414333, 4650786, 1635, 6546633, 2954939, 1225341, 2011437, 1918663, 6266402, 4362358, 5707980, 6795638, 3710328, 4952700, 5127660, 7777908, 858334, 2538425, 1898442, 7868257, 8245307, 7188562, 3465135, 3468286, 5231509, 6872281, 4424933, 5802340, 1959488, 7473470, 74096, 6558235, 716808, 334277, 7514476, 4467720, 6857357, 7799891, 2108840, 32018, 500974, 3917963, 2911199, 5554971, 5518240, 3629341, 1606888, 309243, 2539654, 7421262, 5932143, 7716751, 6082445, 1101206, 6625852, 5385459, 676487, 6805728, 1692383, 1921407, 3900769, 6651296, 7895805, 2734174, 3071877, 2360901, 1565659, 7758081, 1545525, 1123918, 6373696, 6489300, 4081601, 5857600, 6586076, 7742567, 3250251, 1532496, 3585993, 3191835, 7788711, 6250505, 5895479, 7814295, 6359956, 6644573, 4811487, 5899269, 3271129, 646121, 830987, 6590307, 4520470, 1358738, 2750356, 5763287, 5829940, 4244765, 4490760, 1275882, 5563093, 866311, 6875318, 1240839, 6308550, 5070876, 1436152, 1894930, 7035817, 861693, 2346722, 7935721, 2123446, 2200576, 5928238, 8026596, 1510057, 3504308, 2365967, 1737581, 7012481, 4652314, 7162808, 7026104, 476555, 8330394, 4920437, 2503177, 8117701, 553824, 7107107, 392207, 6007449, 7196061, 1073170, 3431334, 5886255, 1078106, 1615408, 6003898, 7856279, 6622200, 7730126, 492820, 2874417, 6697297, 6430219, 204435, 7952618, 939977, 6503789, 643728, 6275365, 2732810, 7609096, 7815679, 3409470, 2799845, 4151823, 3864430, 1647098, 2034326, 5496538, 4073217, 5183252, 432505, 3889231, 3782215, 839086, 4532631, 5628680, 6848768, 2612802, 6740119, 5304055, 8010018, 7634619, 598712, 1023531, 3812060, 4028791, 624727, 7402500, 6834226, 6363966, 1456482, 8306192, 74671, 1918443, 2355931, 3142931, 6096102, 3680687, 6244248, 16751, 1845236, 7467092, 7891464, 1834561, 3645165, 2669012, 1005080, 6515359, 5078192, 1336899, 3303472, 1119040, 814868, 3084050, 1382929, 2641092, 6865841, 26854, 8132813, 5363139, 4947094, 2290707, 7611004, 1855931, 2368637, 5622892, 6305515, 5291460], -[3766097, 1707667, 2193289, 3514119, 181313, 3485761, 722227, 3160497, 3263134, 4763225, 1051171, 7347191, 3890697, 6374741, 4507906, 5179189, 2610250, 7963406, 6488437, 4147750, 1639535, 1051761, 5377485, 583857, 7112294, 3444504, 4952678, 4486522, 2090244, 5097195, 4469380, 712302, 2119154, 2749875, 7955348, 1975554, 4426355, 3323247, 253901, 6866598, 2192510, 6829494, 730390, 6439362, 2535078, 1027927, 4484432, 3363730, 3962075, 1438340, 2429174, 2300991, 5287655, 6575440, 6210833, 6777958, 1525108, 2006527, 4739664, 8336061, 7058779, 3472904, 8371828, 3355622, 1971173, 1012797, 2003460, 5946426, 6073652, 5107940, 5633599, 1467585, 1350407, 3617836, 6571260, 8359817, 3037606, 303150, 493971, 3695876, 2221746, 4595218, 5753305, 6833350, 2403329, 622245, 1419307, 7783513, 7704883, 6137861, 3728065, 7142495, 7723659, 4853605, 1868504, 6486196, 8332171, 657374, 1160482, 5578107, 7312136, 5017279, 755064, 2199005, 4388898, 6697795, 6537774, 4891129, 3876996, 7056502, 6279662, 1546112, 4411585, 3616095, 1210121, 6236466, 2442699, 4290349, 4778483, 1081818, 8312564, 5381400, 4188937, 7170061, 4902965, 155268, 5322168, 5327524, 7992582, 6754873, 1433784, 1003513, 148448, 8202191, 7674697, 2146493, 1572071, 6592140, 2932608, 1962215, 4065462, 4851785, 8359607, 5474190, 26231, 2543955, 2423974, 3369757, 2167714, 7190024, 7343550, 3233594, 2987285, 1355796, 7753786, 2631328, 266423, 1115464, 8295756, 3187807, 3711565, 142293, 5768248, 1448493, 1667374, 3884011, 4585542, 2656871, 567156, 2855066, 7721709, 6434316, 7810709, 6655980, 526575, 1401139, 285529, 545428, 2078566, 7851189, 4908763, 2965688, 4992086, 3860744, 5366038, 7713984, 3572160, 1388537, 465738, 7863340, 2913137, 8169678, 2084082, 1975315, 2293631, 1452021, 5817392, 6207241, 118051, 841629, 1584271, 6541894, 4993979, 4457978, 2988135, 7993698, 4837021, 5123412, 4387498, 5269344, 4757426, 730292, 3822744, 4764759, 735424, 7256122, 531349, 4418221, 2440002, 246479, 6913875, 1186824, 1583328, 2697401, 2722963, 7758691, 6458729, 7663108, 4515246, 8249726, 3441369, 4048273, 5371110, 2074993, 5243439, 7743599, 2318394, 1994682, 2026922, 2918097, 773795, 5849783, 2612490, 181553, 290159, 5979957, 5883294, 5035060, 41671, 1164837, 7844644, 1240838, 5739975, 4417107, 1237257, 7091225], -[1532140, 2691300, 1399500, 3249614, 7143032, 429486, 3706652, 6270857, 2915973, 1432005, 1671136, 2649242, 5319681, 4671973, 7759673, 237966, 7061942, 2498444, 2793958, 2431252, 4561623, 3622924, 2355265, 3818853, 6044647, 6281481, 6770687, 1424329, 298917, 3430659, 1272038, 1708143, 3912692, 2864795, 3995285, 7816967, 2151827, 7242897, 1261203, 4250292, 7166353, 7261640, 4039253, 3682886, 1565814, 7708587, 6702420, 3307972, 566516, 1568534, 4234735, 2172166, 2955966, 443399, 7703524, 6427377, 7391552, 8116906, 1666970, 5213190, 8094637, 425903, 8378626, 4220235, 2302092, 1508480, 2826692, 4384628, 6729876, 2447562, 5022868, 691161, 6400078, 1227303, 5249538, 5432007, 7659503, 2226909, 3235542, 4357367, 5983052, 1838264, 429482, 7551024, 8192289, 4154105, 1367651, 137489, 631146, 1905857, 7386222, 5279803, 2285642, 2326768, 5175723, 8072174, 6348795, 6414587, 5939605, 2433636, 8246044, 2983513, 2245502, 5843006, 7798312, 6486064, 2461334, 8000713, 3882408, 6908466, 4056486, 3685364, 8264560, 6311452, 5894225, 4586224, 1612896, 1089876, 2150171, 4820410, 1024379, 7210918, 2462248, 6915174, 2010532, 2216087, 8122487, 3120205, 2485030, 5120642, 5667605, 1172541, 3144512, 777623, 1412850, 7893893, 8218037, 365642, 2222438, 7498622, 7109847, 3168019, 8368357, 6690686, 8343760, 6652738, 4338252, 7768447, 385818, 3643288, 7294307, 1762100, 2673334, 1415801, 1090901, 5045621, 1207998, 6166868, 333166, 3637613, 5400150, 7354688, 7556998, 7639553, 7924969, 6215887, 3332071, 1832182, 6860050, 3331740, 5149042, 1931902, 5524515, 5721785, 867796, 8229870, 7297817, 7286163, 6470934, 5986648, 6023608, 7919996, 4978703, 1735376, 6655494, 371818, 6454928, 4148171, 6880035, 6265818, 2062479, 4074321, 4608721, 778605, 1929719, 3305214, 7888332, 6239416, 5764714, 5818934, 5615603, 4477142, 6561491, 1806315, 2260095, 6584065, 4883808, 4327553, 6150782, 2248393, 5519164, 5423305, 6475752, 4774631, 4714183, 7480680, 7990712, 7422621, 25150, 8039249, 3445801, 6297598, 3919853, 3465410, 4539579, 5206246, 783065, 4008484, 7283437, 3003475, 3907457, 8067949, 5985774, 7608370, 682755, 7162682, 4695864, 6816691, 2406757, 6859396, 2665919, 684230, 5221130, 115680, 3606609, 365158, 1886471, 1846368, 1277862, 3851823, 3341452, 7022822, 434752, 8082953, 2802363, 1104996], -[7220808, 482250, 531128, 1442605, 2570838, 317995, 984678, 3402426, 1900763, 1728942, 2144527, 600350, 1473565, 4864485, 6017976, 2967763, 2720350, 3557191, 6754557, 1783904, 6916278, 4243986, 5775153, 3434895, 6509912, 7500300, 2341938, 4176792, 2726784, 4507182, 2662755, 1262860, 5601616, 5777440, 335777, 5810624, 1670596, 3110292, 5788078, 4611691, 7553189, 519523, 5904526, 3239547, 1682698, 1044374, 139430, 5621186, 3782216, 2407886, 3895232, 4688368, 100443, 2710472, 6027555, 5117960, 2827243, 5507552, 5036842, 6264942, 3671066, 7419167, 6255337, 4704191, 2002050, 2287643, 2162815, 6982208, 2479039, 3446443, 2364701, 2886046, 7763398, 304703, 2296545, 902234, 3363626, 3590763, 1443593, 792849, 6999048, 7785594, 2471616, 8172353, 4869425, 752945, 4686683, 4315428, 7613050, 1834306, 4351459, 2468527, 2075514, 8310702, 2511178, 4188331, 7189813, 6806548, 2486015, 439520, 6781125, 7493038, 12320, 1139172, 3483828, 6645479, 437572, 1823051, 5364063, 2545735, 1890494, 7006875, 8350800, 7128052, 3524254, 7069905, 4507864, 1953016, 2207009, 4113715, 6227819, 4287046, 5154769, 6610922, 656016, 6185720, 7921390, 7130874, 3150593, 8044637, 3961917, 4511229, 3975408, 5447264, 3043455, 3340526, 3969351, 8019517, 7082798, 2663682, 518322, 1948937, 6669689, 189532, 6498631, 2998358, 2014978, 548953, 679349, 1377411, 1845650, 477452, 4297427, 7841677, 4636632, 2741704, 8323200, 3201755, 7120910, 1960628, 1564492, 6738955, 2969851, 5937396, 7947994, 538327, 6517402, 1058657, 6430104, 6632878, 7260304, 2185890, 7616703, 4687325, 1675965, 7618640, 3293484, 870978, 5479606, 2768680, 7465693, 2655699, 7340065, 6365187, 6527999, 3432203, 8139631, 4279139, 2056134, 6503269, 1765614, 1650694, 6049963, 5515965, 7182393, 806547, 7419478, 5418815, 2288170, 3767240, 260436, 8379307, 5811078, 6693192, 6097780, 3408568, 7098408, 2298434, 7260711, 7773805, 7066557, 1267141, 3865599, 3469853, 4502819, 7678205, 4136913, 4350679, 8301524, 771844, 6650146, 1618286, 819312, 4191900, 7871073, 2757613, 7410662, 8162570, 2040509, 2905938, 2332824, 4620177, 493744, 8340484, 192196, 2245032, 2276875, 8195159, 4513613, 6913816, 2184357, 6854523, 4611919, 3714471, 3055072, 30104, 6613511, 7664964, 6385642, 5429702, 5606508, 5686032, 4275239, 1193794, 3388568, 6810163], -[6328581, 5153598, 6068333, 8103205, 3131387, 2015146, 2370450, 3423530, 4518235, 2570319, 4808419, 4031971, 4345080, 6605007, 3722560, 4191214, 895094, 2667103, 6006415, 3205497, 7305175, 61566, 4161939, 3262071, 6861373, 882335, 6898050, 3059455, 4797204, 4332923, 6393729, 5037624, 3227003, 295940, 6326141, 3711500, 2915184, 2701038, 4391563, 5440408, 2444055, 220941, 11510, 5207803, 5433053, 894470, 983915, 2452158, 629309, 1543511, 2726510, 593003, 8068770, 3289653, 5685953, 2688944, 6032698, 920471, 3425807, 8278679, 1281902, 2464324, 306078, 7296645, 7854297, 8090714, 594340, 5732840, 4211849, 5371768, 7694853, 4382963, 3456503, 514443, 4680447, 2212595, 5072196, 156342, 3701452, 3926319, 4304354, 2184879, 504464, 2708130, 6667633, 3736636, 5772881, 3234434, 4654007, 3765804, 5568666, 4540729, 7781044, 4596635, 4680209, 1724447, 1683486, 4113543, 5736324, 4783450, 7503441, 262428, 2675125, 4518823, 4582448, 2839280, 1053166, 8243733, 7312914, 4330997, 8224662, 7327597, 7836721, 2053860, 7851712, 4286570, 5411565, 490692, 5624870, 7189240, 5764130, 3107292, 185039, 7131618, 3097099, 3566418, 4799922, 7748116, 6990098, 5868514, 2920808, 206070, 1574159, 4531167, 3487553, 1366201, 208134, 2466105, 7986092, 2784590, 7490693, 7223001, 7426701, 7866342, 3150488, 7297785, 4545607, 6208379, 5939373, 699231, 5724561, 2096209, 6625106, 7728790, 8109943, 4538199, 3656460, 1548346, 382348, 2648281, 5256960, 2107812, 4782330, 4874710, 6420080, 4320520, 2744060, 756296, 7298720, 4677440, 4418323, 682459, 1851823, 3581574, 7259447, 4246151, 4729205, 5030489, 446220, 8167735, 7439675, 2815218, 75344, 2863564, 7079220, 4674773, 7131815, 2780149, 5232711, 8157756, 6556189, 7841622, 7506487, 6313663, 973536, 894167, 2757871, 5115935, 5744761, 185031, 8136144, 670117, 6761492, 7440460, 1619522, 3056980, 3873584, 3886936, 105088, 7409877, 6924062, 6248442, 242077, 7602686, 6047823, 6224193, 1791643, 7412723, 1846844, 1301291, 296334, 7288217, 1421147, 161403, 4772833, 7279680, 3478058, 7745639, 2750504, 1968775, 2016437, 4446620, 2738129, 5207777, 5772202, 6770515, 4579220, 4207851, 1936087, 7164476, 5686893, 4394315, 4415962, 8039397, 2883381, 7313441, 209559, 32981, 3644814, 342312, 5298367, 833845, 7057712, 5055547, 1243946, 1622494]] -NTT(c): [1425712, 8250935, 5651361, 4005257, 4867026, 2486117, 8363592, 445076, 3065022, 2470215, 5900485, 7590979, 3349882, 5200431, 3057972, 6724734, 3240091, 997831, 1220101, 7844037, 158671, 8295106, 6903450, 8066345, 3673215, 5359187, 13711, 2713135, 4298774, 5861870, 4724668, 6334698, 7421267, 3038247, 3447637, 6052773, 3226425, 4831176, 7760573, 4040335, 3448130, 5589934, 6313523, 2407450, 5520740, 6048288, 1830153, 7914002, 2639436, 7225063, 6320971, 5669345, 4547965, 1338645, 7413169, 1634395, 1700576, 4805462, 1553175, 6165285, 1328396, 2206099, 941819, 7994038, 5590823, 1075033, 3434435, 2438149, 7692282, 3398958, 6651473, 1777430, 7819180, 1815186, 2350748, 8288918, 4631936, 7212944, 2164739, 1172934, 3584938, 4700552, 295601, 7595728, 562675, 2844703, 189128, 1226356, 4899457, 732566, 3085923, 584318, 4169326, 3767548, 4166076, 5525018, 2580373, 6915785, 1480231, 313635, 2573186, 738177, 5012846, 39937, 2020560, 4927010, 2705828, 7114708, 7692510, 4247922, 4959577, 2629715, 4000693, 4081237, 52495, 3027171, 6251222, 6976104, 3700607, 310757, 2623160, 6902771, 1959797, 8205784, 155434, 5970376, 4392998, 4643989, 5250138, 2679405, 1796640, 4070766, 8240079, 51932, 8107370, 2590278, 3717623, 5869213, 5644783, 82144, 314884, 1191553, 5197991, 5123768, 8225670, 2312289, 6792396, 6238096, 1551304, 3274429, 7848359, 6188786, 3421448, 3142002, 2206644, 3499929, 8221194, 6704037, 6972891, 4056245, 2956452, 1686606, 2365778, 293122, 2179322, 7856460, 5364732, 4667847, 1923688, 5541510, 7484421, 3411218, 4188021, 477158, 2604004, 1167262, 5440294, 7603024, 4079543, 2291001, 3258580, 5972381, 7954540, 4610642, 2362469, 1941290, 5850585, 5617088, 865026, 5654779, 2315770, 7604445, 2710816, 8359371, 1069176, 7228922, 4016109, 7942825, 1444950, 2603345, 7552341, 7723067, 514415, 2833112, 3397339, 6022387, 6203413, 4837012, 6795184, 6772070, 5079185, 1154796, 6447763, 7770173, 857536, 6620665, 4432573, 235734, 1275959, 7758334, 2354097, 5735000, 4144829, 673331, 6254630, 1789826, 1645073, 87801, 1090043, 5670865, 7731271, 2625075, 2298210, 2351307, 5781577, 5970308, 6857169, 3605540, 4621281, 790177, 3097384, 795320, 731733, 4252125, 951124, 273121, 2181985, 1492898, 2565087, 437193, 7249058, 4990302, 350865, 5926952, 1533006, 4467958] -NTT(c) * (NTT(t1) * 2^d): [[3314817, 596746, 2236845, 4320358, 7604367, 7976432, 3916389, 2236552, 6248460, 3877619, 1767245, 5945539, 5055636, 3838796, 6904197, 5831750, 6168901, 7391127, 4388985, 4702860, 4408375, 3697262, 7476205, 5945455, 6945772, 8278010, 8166787, 4105765, 8154406, 3975514, 53862, 353245, 2895983, 2555064, 6086528, 936711, 7386821, 4653466, 3417241, 616867, 3895074, 3520864, 5534820, 2152840, 794654, 683625, 7271327, 1343250, 3380932, 5103535, 7102496, 4734940, 1050312, 2169784, 4092207, 1124876, 6111581, 1323230, 6153324, 3545637, 3400696, 6310016, 8105719, 6760252, 2628973, 4086199, 4853619, 7321347, 1060753, 2674524, 1541090, 3495160, 6873431, 6665967, 3660042, 4365144, 4278637, 4394409, 4907067, 414143, 5873474, 901266, 1213835, 8312597, 1613064, 8045103, 5593747, 1016986, 6927470, 2772597, 1072575, 5944102, 2774093, 1582658, 6125322, 5706713, 7460625, 392394, 3726697, 2964100, 2829895, 1408537, 2949092, 586990, 7195519, 8065083, 5575927, 5847131, 7484167, 4517082, 1097894, 6859232, 2785823, 3593310, 5395697, 6388884, 4569855, 7608404, 3426444, 7084151, 7315390, 5340430, 3335821, 263453, 6948775, 5958615, 1885564, 7190521, 2982005, 2746506, 400801, 7938018, 574377, 3556138, 5651568, 3492631, 6087339, 2294484, 5878661, 2857943, 2831120, 6220881, 3050493, 3812856, 6620909, 2808448, 465642, 7389322, 6194883, 5695362, 6493284, 2268298, 6194900, 7555111, 5925433, 7588437, 3319329, 3708035, 6763186, 7537512, 1520476, 3324562, 7281720, 845073, 6807943, 7967996, 4397820, 8293468, 1592594, 6677016, 3646044, 960372, 6799307, 1148526, 4379848, 1462681, 7241143, 2374583, 984671, 5954071, 8039079, 6341933, 1253849, 957147, 6051793, 3239584, 6005644, 2419957, 2145173, 5860460, 5027549, 524053, 4525244, 4384757, 2873708, 723846, 971233, 5635195, 1609184, 1722503, 679866, 6409840, 121425, 832015, 993219, 8376378, 7480906, 8315799, 5789774, 5635064, 7572181, 1512892, 1061790, 3622943, 1144735, 427343, 5043123, 6235101, 7483901, 6164653, 2596942, 5999425, 6593425, 4067725, 5272449, 4636917, 8164317, 4033847, 514933, 5620568, 7410944, 6428376, 5275817, 1131619, 4348673, 2549374, 2808583, 4870665, 3564143, 7871664, 7569536, 1479044, 5283938, 3168350, 786574, 7122943, 7737065, 1540316, 6508049, 4814578, 1109545, 8370503, 3108998, 2800014, 1413020, 6312258], -[5182145, 7244479, 7921019, 4840346, 1711018, 8327959, 6245026, 7139116, 580782, 2069704, 8284840, 721654, 6165656, 7937040, 274881, 7232890, 4212555, 41356, 533457, 5857365, 2618340, 8120539, 4616927, 4783124, 4565939, 3320872, 1959672, 7962064, 1023881, 1070973, 5794298, 6760855, 5722669, 332688, 925474, 2548517, 5030327, 2559440, 2423873, 5601111, 2486786, 48894, 6601757, 6340392, 2042469, 3614481, 8149056, 4405001, 5066209, 3311060, 7637655, 895224, 3858915, 6879789, 2092799, 4493873, 5898498, 7136280, 635989, 3872540, 8259804, 5288324, 8253208, 6632528, 8069542, 261353, 4562165, 2152738, 8269772, 3398732, 1886199, 4519006, 3094767, 6342530, 6204079, 2781351, 4436334, 4093613, 7548625, 1055980, 3546199, 4981522, 4331583, 6915655, 8353049, 2129229, 2901545, 2074401, 1389881, 2372519, 6133134, 6085536, 294640, 3596079, 3929762, 603144, 1529108, 740371, 4608501, 2349494, 3631470, 3005800, 8311897, 5703404, 1660511, 2433074, 5785505, 6525331, 642308, 7360846, 1899371, 3535260, 7366874, 7577911, 6979281, 6175246, 2830160, 1247760, 3203511, 7281925, 4322488, 2423978, 5961567, 1199866, 8019091, 4323720, 3299771, 184359, 1811945, 5610225, 7621248, 7088253, 5169971, 6564300, 6673542, 264553, 2973430, 1790657, 1288870, 5616455, 4890838, 5938731, 80257, 3178877, 860240, 6035410, 99490, 5538015, 1322479, 3212582, 6131475, 8025647, 1371800, 1815048, 2613079, 3200481, 489410, 6405650, 2216066, 1648815, 8084676, 4623568, 1528500, 1637572, 5287216, 4645103, 3086980, 8089161, 326539, 4243337, 4431436, 7003625, 5533896, 6611911, 2394486, 675544, 7766914, 6901128, 5327870, 1967717, 1529112, 2862482, 6184537, 6674413, 3503761, 2250770, 4704752, 1138579, 6451706, 3748588, 3572310, 3130287, 7475042, 4547818, 1827818, 4675840, 6919517, 2179406, 1232925, 1929221, 2594058, 4744534, 3741373, 6161766, 6905183, 4190589, 1697710, 3390299, 6426195, 5105571, 323350, 7176277, 5763066, 1250553, 5925957, 8196997, 1679290, 7999841, 8201092, 7338377, 1551552, 7496085, 7603791, 3446968, 3013155, 2397430, 3721377, 1890333, 3965943, 2935264, 5315350, 6875393, 8190671, 3480129, 1831680, 967237, 6453635, 3737744, 6283567, 25581, 1965755, 5336498, 986619, 3718277, 104719, 4867558, 7651871, 1883118, 4185998, 1623041, 2575421, 746985, 1612899, 2568374, 764220, 5231109], -[2259421, 8151413, 6551666, 4469694, 8156602, 55145, 151240, 3397498, 1371737, 8271743, 6632402, 1842711, 3107184, 6285482, 532648, 3371701, 3372278, 5433598, 8106593, 5718198, 6420618, 4351938, 7280440, 3146902, 124323, 1951008, 1462906, 1125981, 1408816, 5922095, 5113882, 3990073, 5340586, 7541555, 97198, 6510716, 4697947, 5163485, 5862104, 1014765, 5350949, 1553702, 6264134, 470234, 3450035, 4740053, 2750857, 4283941, 5578456, 4853323, 5137722, 2035477, 2233744, 4318352, 4636599, 104257, 5415038, 4570554, 2406837, 2858534, 1400170, 4295160, 3971719, 8121166, 6645885, 1833495, 5894139, 7244052, 4442313, 7635073, 1861641, 6094112, 89718, 1029110, 7075793, 446332, 7627685, 5652329, 2199250, 4954982, 5043544, 627016, 4021100, 8153856, 8181083, 4723423, 3607111, 5094944, 2794229, 920200, 7086174, 3404157, 5375588, 5254480, 5556983, 7946402, 7140103, 4550273, 254880, 5772288, 2384607, 2110642, 4059313, 8149229, 919380, 4831475, 5931613, 2502643, 3300273, 126565, 987004, 7863804, 969282, 2538162, 2341482, 3905466, 407457, 5793674, 2937143, 1467441, 6468217, 1079700, 4531529, 3977582, 4578822, 4609697, 6270623, 553343, 7721772, 2438461, 1402867, 375920, 1794084, 3277388, 3961309, 8309341, 6010529, 1341568, 7396030, 3935980, 5057207, 1588330, 2868375, 3212459, 186808, 8053893, 257016, 3365684, 6857987, 7404802, 1193866, 8047868, 3411048, 201985, 4954142, 3570656, 3448396, 8169370, 5378263, 94096, 7301240, 8112012, 7621316, 5453599, 7301373, 6496684, 71112, 4108430, 2552413, 3104731, 7209755, 3896482, 5855924, 1477948, 1073093, 4994949, 813572, 5801639, 1374245, 5200073, 5631315, 3058528, 2659720, 912646, 5281680, 1232245, 1121365, 1772821, 5861656, 2830901, 7068577, 7495525, 2345333, 3770582, 7296575, 3711334, 5234788, 5493076, 5233174, 4428047, 6048535, 1341444, 8217660, 6789697, 4547573, 982490, 5755060, 2471749, 6500210, 963932, 6967022, 5675466, 5611613, 3596774, 7012711, 7458346, 5433262, 4573729, 5667514, 3417601, 7260879, 5371015, 100369, 7515181, 5703869, 503893, 2890623, 8081598, 8179672, 2782770, 3280157, 951832, 7456744, 7919557, 6071581, 7838340, 2088110, 325849, 3612448, 5211571, 127112, 5948558, 5701637, 6769063, 4823946, 2520141, 3484634, 6697904, 4265911, 8044621, 4555380, 4621214, 134445, 8294820, 7138853, 3402917], -[2249730, 5688495, 3970731, 4539352, 4877864, 4233459, 5574794, 6790550, 8198026, 6176567, 8204500, 3009297, 2207977, 7618297, 6297088, 6393610, 7404627, 7356719, 1909000, 4255598, 1278197, 7316686, 684668, 7957377, 5639737, 797041, 3516259, 4949968, 562886, 6636531, 8044302, 4904752, 821813, 1237028, 3568250, 7391795, 7859800, 7909606, 5306323, 3447313, 4955795, 4925856, 976333, 5001088, 2531540, 1393362, 6779236, 2625394, 745830, 264625, 5194552, 3389892, 868248, 1833744, 822103, 5694312, 5111055, 8133882, 2843453, 460797, 515060, 4298704, 2466549, 6746505, 6042758, 4531097, 2542831, 2032435, 3376335, 1261096, 7922122, 6369610, 6308199, 1942494, 6740405, 8137461, 1545011, 7459145, 2112835, 1025258, 5138672, 5759180, 7471206, 6883706, 3114970, 4253947, 7145501, 1032112, 6447510, 3796764, 7414086, 643794, 5845127, 7791945, 6106498, 2925982, 628780, 8359692, 3057046, 3306767, 2460783, 2939630, 7588200, 7891611, 2808966, 4528126, 1691959, 3784935, 7987081, 297169, 4900629, 8309409, 483326, 161981, 1793174, 5472555, 3613429, 1864603, 5357779, 2786187, 1545362, 2430756, 1749571, 5928418, 2647494, 7299896, 6449525, 4319133, 3397584, 8314380, 1032928, 988785, 1261506, 4430435, 2030625, 3823797, 4589715, 7748839, 1562631, 139779, 5828137, 5958260, 7745607, 4385236, 3767925, 1550930, 5945568, 6366839, 8239665, 2696198, 5209547, 6114071, 358739, 6818918, 6710050, 5940160, 1268972, 1120876, 4789881, 6927294, 2666563, 7786562, 5100041, 3458109, 1472573, 6147839, 3083047, 7483657, 5730993, 4213881, 6862763, 7550679, 6966981, 144727, 2075406, 4676950, 5921606, 2733999, 168118, 4809931, 74553, 1013456, 1174427, 2221478, 1551859, 1203379, 522485, 5471165, 6594993, 4756521, 2509422, 2071188, 2773204, 4960621, 7487613, 6871604, 1653240, 1871449, 3643226, 8149137, 1494568, 723589, 3475623, 4363710, 4119961, 7567915, 6101824, 2601528, 3181279, 4510279, 614598, 3871413, 7566217, 639452, 7735947, 6287302, 1108161, 7953040, 3563986, 6393422, 3530512, 6624882, 2199063, 1591904, 1543591, 2149681, 6315273, 4181576, 2700978, 6342385, 1970680, 3305523, 4887272, 8089068, 8165445, 5565866, 5354643, 2950817, 1955412, 5111576, 3776171, 1057189, 7813624, 95897, 2196791, 1526459, 509216, 2606690, 6901191, 4473117, 28060, 4811944, 2627949, 5571276, 339440, 1498729], -[2992496, 5164051, 3772062, 5850415, 5555455, 4829511, 135375, 8369322, 2351966, 571205, 5052899, 1880378, 481848, 4677682, 1838328, 7286240, 6120103, 6342160, 4313921, 4297241, 1753471, 2342148, 4715415, 7149090, 7136082, 3782757, 8029524, 934804, 3453456, 8225368, 7201349, 411988, 8160497, 1403894, 8289254, 7056043, 7549916, 5020706, 5219816, 2512664, 1526430, 938252, 1229303, 3083203, 617295, 1818352, 2897486, 3738620, 5949578, 2916655, 4293882, 3871189, 2367640, 1632441, 2324696, 5323952, 7369882, 7721533, 1732060, 2386084, 5207184, 70505, 6199431, 821749, 4719120, 6420661, 3386833, 347968, 5808054, 5529705, 4370879, 7489462, 1398770, 8029207, 5058890, 7665992, 5538495, 2330794, 2220620, 4894841, 6301612, 5646188, 2787410, 4391794, 3916704, 7300329, 5937786, 4242709, 3724525, 1246231, 2397233, 7205742, 4386723, 2590702, 3351097, 2095711, 6799194, 6732345, 5456767, 2116442, 8155, 6851820, 4214094, 3272942, 179735, 6955779, 3788244, 2129111, 4740376, 683645, 5070028, 7567194, 4374729, 101256, 1741035, 7088025, 4857899, 7361909, 4379157, 2088271, 2401183, 4768552, 1292172, 5602191, 5861498, 133896, 7784291, 2471241, 2647260, 4743171, 4347466, 7193057, 821238, 4728153, 3800759, 795153, 6958522, 6482305, 5899377, 3628799, 6717990, 3728408, 4229926, 3227701, 5333688, 2003606, 5042654, 7908645, 6991134, 292358, 7292010, 4501734, 8291727, 5315403, 507802, 3043570, 1001525, 6046141, 1409363, 3696650, 5540507, 2225929, 8108322, 8098675, 4409645, 3810668, 1006681, 6664283, 1462932, 4296194, 485526, 6087200, 5934534, 2333099, 7957177, 7651366, 1132074, 3669328, 140143, 93498, 3954061, 6203620, 4998891, 8285045, 8110254, 3916639, 7712328, 6124611, 3692747, 4851985, 3389660, 486387, 5275366, 2769247, 834682, 7215526, 1877614, 4993534, 2784832, 7385189, 7206252, 4778063, 2778020, 495593, 5635645, 5068966, 6166675, 6040900, 3146278, 6108975, 3812520, 156888, 57952, 3891124, 1034763, 6388229, 2456880, 6684454, 835584, 6094092, 6084329, 3419689, 3062382, 6218823, 6859606, 3931252, 2520435, 6766663, 1771895, 7920514, 77982, 6197366, 3492950, 875123, 726252, 2843365, 1939254, 7857637, 8057425, 58538, 8033616, 2255091, 4984134, 7177336, 1676489, 747084, 2411318, 7595313, 5901959, 5782702, 4424314, 318448, 8036603, 2621965, 7766183, 6024172], -[1170962, 7973511, 2512831, 5762685, 580032, 3515892, 2643414, 2252869, 7795914, 2976209, 5313339, 4560524, 549668, 2905639, 5342251, 664060, 5627861, 1664970, 346251, 1741610, 5807994, 2890013, 3752526, 2101207, 1719880, 7432384, 3010348, 2213541, 7289148, 1037863, 8225170, 1886673, 1146221, 3435663, 4358669, 892551, 2247327, 8069651, 1326679, 6118942, 2442856, 4975949, 6092307, 40538, 1564358, 8224584, 4185692, 5672239, 6821751, 2862712, 6980912, 3843114, 7989883, 2439913, 3322339, 3361581, 7910648, 5672452, 8199685, 559491, 3881220, 5350025, 6046405, 1078293, 3136035, 4807838, 5375795, 6372943, 5495442, 4288666, 8287777, 4968200, 3475552, 211414, 933167, 2562943, 8307065, 634953, 2837448, 6032324, 6059725, 302619, 371549, 759974, 6505144, 2465783, 7908040, 4850461, 7760143, 5327696, 2783796, 1019144, 4936167, 628269, 2789879, 3458532, 2158093, 7938372, 8169885, 1807334, 902625, 3849035, 5875551, 7799674, 5066733, 509629, 3923401, 2996437, 2692840, 5033299, 6595372, 7555780, 4194952, 4051155, 3965318, 555926, 7462042, 5282356, 85641, 1752871, 4730343, 4871035, 3472137, 508558, 7661375, 4365784, 5067179, 4162227, 8303119, 5913116, 3410516, 6490720, 1473330, 6668530, 1281811, 6314371, 7335438, 7116054, 6067383, 6156068, 7324117, 4270861, 6128117, 2415458, 7398887, 1354167, 3841396, 3746890, 4949, 5055129, 1860145, 7537674, 1219654, 6904164, 5645496, 8373922, 6265430, 1190024, 3186753, 1308799, 3253610, 2317204, 1376668, 6588730, 362807, 7193017, 3807296, 3997399, 3497002, 7356368, 7468089, 5219095, 3874960, 6475936, 6713219, 1171759, 2598613, 2791820, 5866490, 951197, 5369665, 6315307, 5827222, 2721059, 1216367, 1249010, 4404513, 6673009, 5740858, 7977829, 1074271, 3580740, 3049408, 5574822, 858646, 3844369, 2939675, 4571494, 8017150, 7932937, 4856383, 2309194, 7500594, 7822064, 3223465, 3655578, 6268745, 4578210, 8208120, 4081631, 8158826, 7970842, 2165745, 5082179, 2558960, 1801414, 832326, 112550, 1752157, 752419, 585300, 1743031, 5952237, 94983, 6238499, 4986726, 3289590, 4911352, 4429505, 407994, 7492502, 6520026, 2213619, 4513026, 6306793, 1767213, 5397406, 8122633, 3702908, 1693338, 7518707, 7806122, 235913, 5624602, 1429157, 5355818, 104960, 2617326, 3083201, 3919608, 7554598, 3863280, 7290663, 517898, 2887302, 4455128], -[3438318, 8172984, 7249569, 7947997, 4068440, 6137720, 877059, 5182893, 7262977, 5209739, 6919789, 6999718, 2126322, 6902657, 1382279, 6772064, 2548347, 114873, 6715793, 444289, 5520805, 466005, 3727904, 6737970, 1658045, 4993563, 4934391, 7945929, 4818244, 1675707, 1622442, 7973918, 4297721, 3516160, 8306654, 7102274, 3136576, 3828631, 1380370, 430778, 2568148, 8237221, 3176508, 5093691, 4009935, 2461298, 2915557, 7990260, 5111853, 2505676, 125106, 8210068, 3098242, 7967788, 6642839, 5853156, 4174481, 2834652, 2945101, 3735061, 6074917, 1575598, 3989088, 2887490, 4351108, 8066067, 6263656, 2815038, 4182255, 515454, 1110208, 7691910, 6681646, 1858592, 977596, 1979101, 71900, 383177, 3230846, 1435310, 271850, 3983499, 7407156, 6628519, 1797478, 4401807, 3037168, 924034, 8098157, 625748, 6796711, 907214, 1595619, 4420794, 6172659, 1734951, 8174406, 4640354, 1843097, 7756384, 3407291, 4146305, 2969847, 6208688, 1397024, 1986288, 875439, 3578204, 4923129, 1996287, 6499770, 2769806, 2191382, 1191961, 8008455, 3019159, 3622288, 4933165, 3480441, 162241, 7059499, 4075750, 1442988, 1104294, 2657305, 1182610, 8006428, 4957117, 7228493, 5816969, 5108671, 7392225, 312620, 6338213, 4272752, 1508307, 2243644, 1707552, 100918, 1186755, 2683573, 6276376, 2785831, 3655033, 6388643, 1519864, 201236, 7138531, 5861678, 3039340, 7655526, 5403659, 6529047, 4750682, 4860635, 7504842, 749112, 5727005, 3817919, 6440536, 610493, 4619646, 632950, 3431088, 5695278, 7875447, 1311807, 1930757, 1650718, 2781294, 3168879, 4244934, 2921392, 3792139, 85272, 2420794, 5329122, 3591161, 3636327, 3205967, 3484555, 1991783, 6102748, 6717329, 7179026, 543518, 757473, 7308682, 8328323, 5353167, 760982, 4131380, 2897897, 4917311, 6328141, 8115426, 4925068, 516253, 7224575, 7771874, 849942, 562221, 2565053, 278013, 2591760, 1496154, 67109, 7842838, 5820064, 2823641, 4813834, 1506700, 8212410, 6228424, 1978732, 1343523, 3570700, 7530926, 1335617, 4960963, 488810, 2544601, 3941325, 3392883, 6977328, 853188, 3554256, 5307564, 4456334, 5531323, 6364013, 4047535, 2175606, 7830054, 2961394, 2505477, 7046284, 6007665, 454427, 3206051, 5224227, 2550107, 8345148, 7450149, 1934101, 845507, 6550355, 2554690, 1124346, 7547900, 5115005, 5973457, 4132071, 7184456, 1413371, 4778558], -[8194124, 907806, 6384230, 7764429, 7773449, 21729, 7963670, 3619340, 1431176, 1977709, 1864711, 199723, 3155361, 956781, 3479289, 7103935, 243615, 7689822, 1313508, 3772945, 7186321, 2264433, 6071321, 5956389, 6997144, 6632314, 6157705, 3587512, 1455980, 7099507, 2939181, 3261584, 1385245, 3877250, 1406309, 2723454, 3984339, 747903, 1171683, 8064044, 4988614, 6793770, 2053923, 2479500, 5208682, 451342, 6407788, 2516922, 5419490, 847204, 5547799, 226813, 3518021, 3058361, 5793076, 5389076, 6355158, 3754998, 186419, 5305869, 6276460, 6976253, 491916, 2445349, 7146487, 1151772, 3929210, 4968034, 4605750, 7680261, 725187, 7803558, 6694200, 5006339, 2510060, 3883981, 7212806, 418494, 1579405, 5735102, 5539203, 3363044, 7303183, 7658371, 7217800, 7661729, 4330591, 7230983, 6547656, 783336, 2028951, 6426456, 253883, 3455067, 1926425, 5192750, 7527077, 5917630, 4204359, 3469827, 6041722, 4974801, 6730281, 4334473, 7408430, 7408461, 674351, 5220825, 366179, 6868126, 2782174, 5057156, 1592273, 3591829, 1572129, 1373589, 95210, 3013646, 2703984, 4808318, 1965222, 2032162, 1472659, 6304593, 6572652, 1864989, 5108703, 7043524, 1734229, 7999989, 7728894, 8149171, 1846795, 7216118, 899719, 8185620, 8224289, 770904, 1600810, 2259362, 5868711, 816557, 3350543, 5930585, 2192439, 6579924, 3091705, 1222199, 7425912, 2057197, 5419193, 2831270, 3206884, 6340016, 5089067, 3469439, 3418827, 7428, 487441, 7771743, 5656485, 50919, 7794809, 6885286, 5328831, 1824902, 5424716, 6592628, 1622147, 3860922, 310671, 3625798, 1068807, 149967, 6203058, 7725588, 8277505, 4375371, 4637971, 7910949, 6428904, 7671128, 1340005, 7528774, 8325628, 3551206, 6519224, 4374968, 235446, 244412, 310387, 7590444, 5035267, 2540454, 13268, 5963789, 7839642, 2086358, 5564280, 1539952, 6864036, 6829238, 4635500, 8132238, 3035612, 7035235, 3504748, 611161, 5344039, 3485709, 4300630, 2704160, 2457501, 5900820, 4883678, 1330524, 3543227, 4953761, 7767166, 3751379, 4688901, 8078310, 558737, 395737, 2050240, 7769934, 5025237, 4010289, 6406586, 5920048, 459679, 5275965, 7367126, 2693321, 788490, 6793322, 1535884, 3374420, 704903, 6197493, 2971041, 1304290, 696120, 3886010, 3309079, 7068662, 2282261, 2319063, 4760282, 7303847, 6241841, 1537763, 8223218, 4549252, 4412909, 6733912]] -wPrimeApprox: [[5883707, 2589880, 1995189, 5932687, 6560885, 1918345, 3261487, 5929740, 6262902, 510166, 5619233, 4457849, 5833959, 7248443, 8283639, 5272010, 6159614, 4480943, 2516644, 3936440, 5637212, 4501054, 5503108, 2738628, 8035335, 1353405, 768130, 2132487, 7202819, 6137463, 4805307, 2305894, 7088975, 4346302, 6473617, 6570978, 3143444, 2107250, 3015317, 2016816, 3475854, 732250, 2221151, 4278018, 1712500, 1099395, 6376066, 7483656, 4907220, 6342508, 7654699, 4921278, 643089, 7516240, 1828542, 7384630, 7277891, 4199726, 13925, 4684828, 7122366, 2432218, 1329641, 3455841, 713857, 7629265, 3588657, 3787644, 2606893, 6003360, 944002, 2185836, 3441398, 8072092, 2029191, 6225254, 646895, 6543179, 4271230, 1578684, 2484572, 5654362, 3275546, 3997030, 1988589, 5576307, 5678338, 293247, 3457009, 3717231, 6320113, 7020818, 4248812, 4215177, 3921802, 6757021, 5716201, 2445237, 4113459, 7114162, 8009165, 3279802, 487977, 6197433, 7357078, 2892656, 3004424, 1664004, 4567727, 2398976, 6457913, 8181209, 8330177, 53223, 570684, 5239534, 2989417, 7039624, 3692155, 2442313, 5533795, 3579630, 113224, 2587793, 1482241, 6848836, 7831391, 5869474, 4731387, 5651347, 7268875, 5193209, 2505916, 6110335, 6239464, 1328114, 2550859, 3764614, 4192023, 2144676, 2629132, 5633312, 4892140, 703095, 4914160, 2714139, 7823080, 7657897, 6685363, 5704221, 1409218, 5724412, 1249485, 2785550, 5299072, 6604626, 1818458, 1857851, 734827, 6877965, 7296355, 6080553, 767569, 1758336, 3747252, 142000, 1936572, 1150296, 6540115, 1547881, 6010950, 5717066, 7387839, 3741066, 5580776, 1604219, 3827212, 1315646, 2288586, 5802063, 1376075, 4669831, 1733919, 8243842, 1180346, 3469011, 6155214, 7532909, 597781, 6666026, 7955203, 6839660, 7398578, 7423939, 7112793, 4329144, 5878933, 7571244, 5312775, 4605751, 3677050, 3937609, 3699149, 2032037, 5728553, 4249221, 5530773, 3767901, 7442325, 7524511, 802978, 6053660, 4967698, 7031152, 5723433, 8154594, 3391469, 3438332, 3935658, 2228393, 6395759, 806192, 2465254, 6246913, 7798446, 7336079, 2284573, 6363890, 824605, 3470676, 5296041, 3119374, 3118825, 2871505, 4712776, 1997490, 1440506, 1174905, 3326193, 2376493, 6067684, 1130451, 4259856, 6861916, 153053, 6019445, 3046782, 7653546, 4527502, 1598896, 2297435, 7842700, 7946176, 4414237, 3990968, 2187127], -[1527072, 7448419, 8036574, 2083952, 3676667, 6581566, 2526090, 3029708, 243341, 2345402, 39043, 4016585, 2603408, 7577959, 5979283, 7000309, 2441099, 4123927, 5724727, 4789201, 7103773, 8018870, 6216822, 7190020, 3622625, 1216934, 3994608, 4415048, 6098900, 4264955, 6565644, 5365246, 7904970, 7650410, 2164688, 7917936, 7206784, 8220298, 2205816, 2015120, 379097, 6266318, 6592140, 8327952, 4755956, 5751213, 7063595, 3604343, 1821808, 2305280, 2871212, 6241632, 6787982, 6440785, 3667293, 6939121, 8363835, 4826753, 480016, 4133597, 3885507, 1192953, 4669089, 5684760, 1971216, 6995643, 3862194, 2805735, 489168, 196850, 166096, 6263138, 3951736, 6249534, 7865500, 7437912, 8243611, 3894527, 6769593, 5139880, 3125431, 2588976, 4392079, 4537545, 7527359, 4362733, 5687472, 2339130, 5582435, 3430195, 4431767, 3477444, 2051148, 2174040, 7634828, 267812, 8161455, 4048436, 1078230, 3073175, 183935, 4663835, 7770089, 6650435, 4189287, 7048982, 3192397, 2734084, 6772672, 8049467, 3750660, 4696597, 1706457, 47531, 173804, 4011659, 354863, 2345995, 6276691, 5155891, 7190366, 2688468, 4805825, 3965055, 4912918, 5007160, 4596230, 4363409, 7297828, 7926308, 1692782, 316123, 5941033, 7654861, 6483745, 6109334, 6711500, 7375729, 1743965, 4607529, 3483046, 2221060, 5411722, 1713282, 6880742, 1452454, 1174850, 7383784, 2281715, 5918377, 8251496, 1385500, 1268853, 4719894, 7362915, 7354042, 3856366, 7675587, 3498524, 2982683, 3357721, 2881239, 2728248, 3486803, 3846902, 8352573, 2662833, 8197064, 4836188, 7290784, 4652448, 1823689, 4351898, 8297014, 3125234, 1721797, 2695929, 393339, 7340759, 2504095, 3150299, 4868912, 2276458, 1629987, 7547167, 8094512, 7417026, 1195462, 3925589, 8149734, 7185385, 4835009, 3855299, 3297964, 2104430, 1599427, 4713314, 5373480, 1560134, 146054, 5161360, 8334447, 1903579, 1545303, 3074720, 5595108, 5220574, 133227, 7772264, 1798162, 7070858, 995230, 2551104, 7400932, 3802144, 154541, 949484, 7013813, 7021856, 4814425, 5696659, 3165894, 838331, 2398229, 1321524, 3038785, 221523, 4991671, 5339867, 4119464, 3561621, 3816692, 1031543, 1637041, 8031679, 1140304, 1937112, 459213, 75931, 1239426, 7927879, 4460244, 57385, 7914573, 1146915, 4294315, 4024703, 8244514, 7972301, 1205939, 6892661, 1780844, 3270514, 1244592, 7109116, 7291387], -[7921525, 1656911, 4127995, 6279424, 2437830, 1833311, 6369033, 654036, 6444, 5407826, 6343197, 1525171, 8029546, 3675897, 3676987, 7773281, 6955552, 4434853, 301996, 6164759, 7512307, 3615208, 8097645, 4568619, 46995, 7436493, 5606921, 5959303, 6069875, 329200, 4803017, 7863190, 3034834, 6723708, 4876500, 2566339, 6397822, 524033, 4057510, 5096223, 5588376, 2037387, 220431, 7913511, 6642390, 2211649, 5955924, 716480, 7144953, 2577189, 2774273, 4568627, 983396, 5941938, 7558571, 263036, 5506744, 6498081, 3677033, 1340669, 332706, 4078999, 6304686, 7255135, 4601881, 6383429, 3551400, 6369324, 4909157, 2431258, 6969858, 1082392, 4921565, 7109987, 1585812, 1438872, 1712971, 3562076, 6771002, 2521004, 2083387, 5494059, 4134853, 6225516, 3701876, 2791285, 3205167, 5870863, 6193771, 8014026, 3980526, 7591137, 4479695, 2211472, 4883564, 1711595, 5648068, 3550248, 7721194, 3986841, 1572646, 4668547, 66235, 4444445, 2845581, 3397855, 6618717, 2927322, 5714430, 3477499, 4307453, 4928455, 645263, 2168136, 427701, 2794986, 982559, 7794166, 7298447, 756655, 7646305, 2981178, 2991372, 2797765, 1058076, 6820869, 2366759, 7600432, 2613113, 2327877, 3600588, 2697582, 6302080, 5744480, 5010971, 5749772, 4518297, 8243123, 4226621, 193706, 5710824, 5182661, 6652459, 4145969, 4959623, 2842833, 6989095, 4243631, 7065719, 4909830, 5664689, 4479894, 4484773, 1426693, 7001671, 1372367, 1137062, 4988965, 3393035, 8243990, 2195369, 4998159, 5677392, 1358595, 2588755, 2392960, 1577459, 4234119, 2695562, 465037, 1647386, 2635437, 5551112, 3583824, 1483346, 3713492, 6619612, 7955166, 2425151, 6047758, 7875813, 1720161, 1699835, 5955966, 3367383, 5093539, 3217278, 2583402, 951220, 7822267, 1854209, 5685611, 451200, 1040025, 7612328, 3494146, 1199171, 4368201, 868712, 879347, 2564907, 8052317, 4035406, 6564768, 2055075, 3149318, 2557512, 4473791, 725630, 3819121, 2562036, 6482205, 5027941, 4122403, 3184535, 5911552, 2369257, 7376966, 8203916, 8229326, 3384035, 6411416, 7664952, 1869363, 6422284, 2711548, 7487801, 6929789, 6167695, 8274611, 3342403, 3517242, 4183942, 5485819, 3900058, 5744525, 3816757, 6699191, 6687037, 5511396, 6267249, 4684788, 2252946, 5352815, 8317336, 7619213, 2893874, 7487944, 6468078, 735158, 3392491, 3489534, 3259393, 3624150, 4193376, 6835785], -[6364966, 1905480, 1239564, 5771930, 7217032, 7401658, 132589, 6037390, 6715658, 3568175, 3664367, 4627772, 6736742, 7274235, 79576, 3076676, 2368190, 7411001, 3430490, 2809932, 3405279, 6539981, 3185369, 2067268, 6467966, 1202315, 3653278, 3440856, 4285032, 7346247, 6814717, 5366024, 2699207, 7392103, 183400, 4279647, 2878621, 3258505, 4402703, 212743, 3242642, 5234546, 5035789, 1213079, 7176302, 4428972, 2516031, 90702, 1728568, 5607602, 7429269, 2284753, 7701213, 2718573, 1266861, 6652250, 7644259, 2842395, 2857542, 7562598, 4858471, 5950260, 7619326, 6954122, 1743816, 5649644, 7769688, 7949888, 7550544, 2157621, 2364969, 3568327, 2242877, 6734253, 1611552, 3767791, 2970247, 7390893, 4127279, 5136196, 5074626, 5438239, 1729071, 1313629, 6536562, 290232, 1466069, 7606787, 6987107, 2821545, 4116736, 6554039, 7588946, 2590195, 6023193, 3752969, 1511572, 4556614, 2563301, 1066351, 954365, 1014260, 7036080, 6747192, 7643079, 3970781, 4398730, 2512902, 8205840, 6762339, 2596945, 1836661, 1350042, 6554737, 6386789, 2521002, 3356336, 5746546, 5139523, 4458638, 3040025, 2295196, 6924777, 1962481, 7102135, 1043195, 3579659, 2979726, 82632, 852248, 3124494, 5899819, 6005951, 3878503, 2146754, 6617372, 6123100, 376157, 8281767, 8227419, 5592560, 729584, 6921574, 7816447, 7692166, 4280687, 3280614, 5988461, 2537213, 5410248, 1735871, 1095988, 2164003, 3757207, 8177583, 5724171, 6956657, 5648921, 3783231, 5961542, 8173975, 1758408, 1740386, 7025195, 3934803, 6304442, 7989459, 1339612, 478341, 4281595, 4880675, 3511434, 6850697, 7583950, 3727549, 7588607, 8190838, 2681068, 1941140, 1206458, 6430874, 4142552, 2373822, 3830389, 1260832, 1954751, 7740527, 2704280, 4931886, 4302761, 625278, 4465963, 7032224, 2813779, 5895008, 740340, 6646225, 5595053, 573763, 4537589, 1599353, 7422091, 3880833, 7374423, 714891, 3568024, 2986377, 3377583, 8121748, 2123491, 3374285, 4416390, 1474358, 4426259, 5774046, 4813975, 1087417, 4370548, 6608653, 1512758, 675093, 3867837, 4683201, 4587474, 219494, 304999, 554630, 1846979, 1157552, 7287573, 1078877, 6494471, 939735, 33726, 7836548, 949227, 4398182, 1353892, 2498835, 5428348, 990713, 5050324, 3873434, 5478434, 3134442, 7369444, 17953, 418163, 5329960, 1723033, 929838, 6770559, 5087868, 4542938, 6527878, 601132], -[1649559, 6283826, 711182, 4283678, 6999437, 7266209, 3775470, 2947887, 2258754, 2942988, 4604490, 7254901, 2564245, 4797647, 5487708, 3485918, 2207375, 3900213, 2270636, 8137730, 7863921, 3094451, 2931856, 1687438, 5197024, 1092362, 5179047, 6802943, 7833732, 5929719, 5679125, 1193846, 2129687, 2776789, 4139123, 320763, 6712705, 6332099, 4512272, 485084, 2558544, 848780, 2522197, 8020598, 5308843, 4759408, 6266675, 4649503, 2107441, 7861548, 2187736, 5900325, 7473748, 6165247, 7523375, 8331994, 7713023, 6718997, 3479232, 4642326, 7085144, 5940877, 6748263, 4697782, 3644399, 3679658, 4164280, 2957871, 8132226, 6770820, 7923220, 5079550, 7586497, 3080787, 6738463, 5958865, 6908394, 5997134, 6144147, 739542, 2365157, 4066819, 5053644, 7806591, 5413108, 4996036, 7215369, 1096505, 4467060, 7012975, 2664538, 3992759, 7556290, 5389779, 7434033, 2796515, 809732, 8063252, 2268602, 2684595, 7026863, 1072123, 6655872, 3439607, 6065867, 6800928, 6199865, 6126766, 4051421, 6988631, 973409, 3085291, 6450333, 6448952, 284022, 5517385, 629925, 7443927, 4894777, 473082, 5553976, 7945635, 7370277, 3847991, 7445351, 535955, 6590412, 587862, 4163205, 6844006, 7974417, 1359446, 3691831, 5948335, 7159843, 6151797, 6247024, 8262708, 1199834, 7963018, 1265295, 5082482, 634850, 1982287, 1855610, 7501745, 4479333, 2268273, 3974964, 11694, 7208751, 44400, 2504224, 3022805, 8285488, 83477, 4334981, 1961151, 2756643, 5200394, 5719413, 3871391, 8343868, 2878807, 4107117, 7579923, 5298503, 844509, 5373280, 2351769, 5418004, 2121306, 5204993, 4666293, 7959637, 343257, 7415602, 8191735, 3131276, 4343825, 4244605, 528113, 5146620, 3844219, 6510419, 1918352, 407853, 6412507, 3094160, 5820962, 3186842, 7355543, 5249179, 4811534, 8053767, 6066391, 7736118, 4789223, 2883244, 4322809, 5005404, 6798534, 6589944, 2033719, 5378751, 3949013, 3702809, 4381733, 38764, 6045692, 5673755, 2277432, 68193, 518650, 3660962, 6727774, 3251320, 4339676, 4792334, 6401434, 2980710, 6423744, 8081771, 5568765, 1635450, 3298451, 3246142, 2477734, 5778093, 4332260, 4496043, 5268103, 894552, 4818780, 1975834, 6858349, 2919442, 657572, 3760968, 730002, 3532307, 1558687, 6634287, 4213107, 3102460, 8365951, 1549733, 7424808, 4896715, 1719877, 478410, 4156900, 2061212, 1896041, 295351, 5683705], -[309581, 5898280, 3973974, 5522149, 6825963, 1138814, 5481109, 102849, 1649704, 5607249, 3175112, 852939, 251811, 6507694, 3158664, 6927536, 4430909, 7077865, 5067958, 5348558, 3782903, 2031547, 6455760, 1066281, 7464702, 1057464, 3398574, 2951688, 7527847, 4004276, 1419891, 6376194, 7980174, 6143087, 3580203, 4841613, 3582524, 5873036, 5619068, 853093, 1667769, 3466078, 3775975, 6542374, 2872999, 5474299, 6956761, 3842051, 1983957, 4797629, 5233947, 4596275, 795335, 156997, 6498163, 387344, 6394521, 4757058, 1178955, 1552294, 2830212, 873760, 987674, 1054739, 4581882, 1318307, 8240484, 805199, 2728660, 920505, 6019885, 4962570, 2332356, 5459070, 8140097, 8142736, 2454247, 2376948, 2861478, 798806, 5842752, 786833, 6548836, 5955856, 3991634, 3618112, 632508, 5276602, 7953635, 5887676, 7345733, 5084582, 2088256, 3271303, 3033926, 4106048, 6891281, 5615695, 3028368, 1969421, 3589442, 4803296, 3579368, 6350219, 2914904, 7285782, 7772399, 1017088, 2859707, 59507, 7381697, 2348038, 7141504, 6505701, 7677172, 7102667, 4790707, 739793, 3537826, 1442161, 3290057, 797379, 2890198, 5505122, 255114, 737545, 7093138, 228434, 84031, 5501692, 7454159, 5601362, 4690103, 1042225, 6320479, 2129778, 6626365, 7541935, 105411, 7236114, 6950664, 5813567, 6357897, 6420405, 715921, 184661, 2759623, 2900331, 980513, 2296052, 25902, 6747702, 6305423, 4420854, 5354727, 7432923, 199181, 169382, 8307997, 1134556, 432487, 6668275, 4083722, 4615697, 6257231, 6040215, 3301448, 1166143, 7751902, 4620317, 5601182, 7730508, 7523238, 4897826, 3506331, 2854830, 2081947, 6048643, 7282097, 3000042, 1676827, 5707723, 2877674, 552442, 6693042, 1658012, 6762642, 5835579, 5218686, 4397871, 3536841, 5187132, 3153717, 6537207, 8013997, 7022787, 2438597, 1700806, 97651, 3235265, 3843268, 1456901, 5503061, 4857426, 4028942, 7022331, 5909800, 2340975, 6543859, 564992, 118295, 3752128, 1927252, 5951456, 5455288, 6903213, 1213449, 2638630, 882694, 7299575, 4691100, 4788034, 6837241, 3961356, 4838814, 909466, 1790727, 5484749, 1776211, 6652243, 2282192, 6208326, 3661450, 6516601, 2121121, 7249292, 355576, 63074, 2571015, 3011092, 7071701, 6346279, 1179578, 5144306, 6530947, 5379162, 5417431, 1247094, 4071786, 4968094, 4342021, 3111863, 4421256, 7123930, 4797572, 26921], -[5882301, 1235740, 690560, 1922041, 152552, 849418, 2335484, 6199993, 971124, 779129, 4645037, 5113975, 8105905, 3110608, 5667568, 2659596, 5170930, 5366552, 4017128, 4935531, 5613899, 4993306, 481568, 2956664, 6773999, 8324519, 5454077, 5066007, 1216409, 4649845, 5032286, 4845131, 5196542, 5166610, 1318542, 954037, 3353682, 7314730, 2849637, 7737796, 4965161, 2235478, 18977, 5481917, 3171564, 6379103, 3269995, 3109062, 1966589, 4350805, 556313, 5220937, 7963858, 7563271, 1664700, 6077178, 532400, 5272964, 83480, 3616375, 6645863, 6125146, 6329894, 4321470, 291371, 8209917, 4776655, 5470375, 4704439, 5615196, 7370025, 33692, 2264410, 4925967, 3761196, 7929520, 2557964, 967183, 6593703, 293142, 1447695, 5519044, 4309687, 5640452, 7950657, 4013527, 2576434, 5885681, 1205675, 511598, 6884495, 6016493, 5114754, 263619, 1735926, 1111033, 659818, 5348935, 2638043, 7353084, 5888855, 6860879, 1494219, 2806118, 3235950, 5949771, 5720688, 5943045, 2127150, 3479786, 7838850, 4269571, 4598481, 6978979, 5910196, 1083995, 6238905, 29449, 7910848, 428598, 1196753, 1839932, 4297159, 2812983, 4463265, 406806, 3953979, 613572, 7270002, 3964376, 5608604, 5855209, 5945419, 4587422, 5157450, 1170509, 7070346, 6848357, 2276703, 7122508, 6582489, 3168863, 6408012, 4505650, 2903287, 1196366, 3282893, 1343853, 4283139, 4637379, 1445526, 1868875, 3193102, 2131251, 7005782, 5365490, 4703250, 1837862, 1166749, 3865835, 6699986, 5319383, 3416183, 7204176, 6473280, 5189079, 5600440, 4305195, 4700729, 8189775, 6532154, 777302, 233906, 4472662, 4545320, 490931, 682613, 1874081, 2987854, 2459634, 3318986, 6464960, 950353, 4092911, 6540502, 6712205, 1280195, 190629, 5789025, 6005560, 3045350, 1790551, 6889254, 7086260, 717440, 5569516, 4877312, 2732427, 8243669, 7553809, 501366, 7825530, 2889593, 7890253, 2271069, 61849, 940387, 6752745, 1237054, 5049556, 475551, 2005320, 3894817, 6967196, 3616270, 1348045, 3825026, 2210031, 2978919, 3162026, 1193511, 1911322, 2575608, 6180523, 6207003, 980705, 6766108, 1087154, 6959971, 395459, 6127183, 6048810, 7100719, 1586515, 3914437, 5758589, 5533136, 4545110, 5459505, 6843713, 3961056, 6861795, 5523141, 7723178, 4239685, 7104949, 2988143, 8369064, 1126491, 338326, 101106, 5632349, 259318, 2314769, 5464062, 7895497], -[1916637, 498467, 4237328, 2018036, 2441431, 6914979, 4809593, 3069521, 3899548, 8216592, 4411371, 2239065, 3976238, 3209777, 5461697, 7660643, 7945796, 7757152, 3756075, 5181598, 5204545, 7349978, 3346429, 530066, 2209358, 3034816, 5668618, 2238646, 2701377, 1042072, 7809716, 1891128, 2380133, 5946813, 1150790, 1581420, 1244846, 3802816, 4825735, 7227427, 7076756, 1654056, 4206464, 893235, 4212115, 5217792, 7856593, 6435066, 1171694, 1599371, 8216430, 259048, 5559815, 5475367, 487445, 7866522, 1987688, 2877776, 6804671, 2189297, 4352053, 3169268, 586785, 830084, 6199032, 4224327, 3018190, 1888540, 2381545, 4138725, 4912191, 878191, 2308366, 1300896, 3351022, 6417590, 7878147, 1927673, 650280, 476060, 7071018, 3667646, 5996400, 2600851, 6933469, 1509836, 3796881, 1816497, 997371, 7365544, 5134805, 7757629, 2267906, 1042761, 6792975, 5016208, 8165430, 1662196, 2749063, 1056713, 729312, 7027115, 8048253, 6684789, 5617587, 6668700, 5965932, 7934995, 4975450, 7667343, 1785168, 7379313, 3337724, 918495, 428458, 1606270, 3506341, 2834675, 5045787, 4984592, 6204567, 1985719, 3959413, 897484, 3919506, 3695769, 6977830, 2028369, 5376111, 5183438, 5517126, 4676154, 5356219, 1243315, 473270, 3045631, 6355064, 4951040, 5698279, 1544004, 392957, 5681980, 2194558, 4908179, 2083589, 5370038, 222052, 1609716, 5885429, 3522328, 7856896, 7890386, 7199113, 6951285, 519467, 2182082, 2561992, 844309, 959994, 596456, 5542789, 7515668, 3167297, 5260690, 8102336, 6420494, 3260456, 4168120, 232353, 2091024, 1187945, 1561895, 5808296, 6536865, 7348700, 8048805, 6760741, 3938239, 1194437, 730972, 3091198, 2537045, 3978413, 2381551, 2265393, 7813190, 6385920, 1479011, 2018425, 5354186, 3770970, 7375592, 370622, 3342537, 1649130, 5243122, 1087426, 1924824, 3795996, 4318505, 1045656, 3718398, 3230695, 2116203, 2287643, 7886655, 7978348, 3946539, 6389468, 3473910, 4139558, 7072759, 7575235, 7463165, 739301, 5475874, 6433352, 7573555, 7554691, 2684940, 5737098, 8367339, 5152571, 802403, 7510792, 2708566, 4460797, 6292995, 52384, 6162159, 1473800, 1501745, 776418, 3215203, 3566041, 992663, 5730667, 1354712, 2809384, 4023403, 7573509, 7200358, 6675720, 5712589, 144542, 4969589, 7480885, 5466485, 3287988, 2201861, 6116874, 6181858, 3620400, 5869112, 6482831, 72247]] -w1Prime: [[11, 5, 4, 11, 13, 4, 6, 11, 12, 1, 11, 9, 11, 14, 0, 10, 12, 9, 5, 8, 11, 9, 10, 5, 15, 3, 1, 4, 14, 12, 9, 4, 14, 8, 12, 13, 6, 4, 6, 4, 7, 1, 4, 8, 3, 2, 12, 14, 9, 12, 15, 9, 1, 14, 3, 14, 14, 8, 0, 9, 14, 5, 3, 7, 1, 15, 7, 7, 5, 11, 2, 4, 7, 15, 4, 12, 1, 12, 8, 3, 5, 11, 6, 8, 4, 11, 11, 1, 7, 7, 12, 13, 8, 8, 7, 13, 11, 5, 8, 14, 15, 6, 1, 12, 14, 6, 6, 3, 9, 5, 12, 0, 0, 0, 1, 10, 6, 13, 7, 5, 11, 7, 0, 5, 3, 13, 15, 11, 9, 11, 14, 10, 5, 12, 12, 3, 5, 7, 8, 4, 5, 11, 9, 1, 9, 5, 15, 15, 13, 11, 3, 11, 2, 5, 10, 13, 3, 4, 1, 13, 14, 12, 1, 3, 7, 0, 4, 2, 13, 3, 11, 11, 14, 7, 11, 3, 7, 3, 4, 11, 3, 9, 3, 0, 2, 7, 12, 14, 1, 13, 15, 13, 14, 14, 14, 8, 11, 14, 10, 9, 7, 7, 7, 4, 11, 8, 11, 7, 14, 14, 2, 12, 9, 13, 11, 0, 6, 7, 8, 4, 12, 2, 5, 12, 15, 14, 4, 12, 2, 7, 10, 6, 6, 5, 9, 4, 3, 2, 6, 5, 12, 2, 8, 13, 0, 11, 6, 15, 9, 3, 4, 15, 15, 8, 8, 4], -[3, 14, 15, 4, 7, 13, 5, 6, 0, 4, 0, 8, 5, 15, 11, 13, 5, 8, 11, 9, 14, 15, 12, 14, 7, 2, 8, 8, 12, 8, 13, 10, 15, 15, 4, 15, 14, 0, 4, 4, 1, 12, 13, 0, 9, 11, 13, 7, 4, 4, 5, 12, 13, 12, 7, 13, 0, 9, 1, 8, 7, 2, 9, 11, 4, 13, 7, 5, 1, 0, 0, 12, 7, 12, 15, 14, 0, 7, 13, 10, 6, 5, 8, 9, 14, 8, 11, 4, 11, 7, 8, 7, 4, 4, 15, 1, 0, 8, 2, 6, 0, 9, 15, 13, 8, 13, 6, 5, 13, 15, 7, 9, 3, 0, 0, 8, 1, 4, 12, 10, 14, 5, 9, 8, 9, 10, 9, 8, 14, 15, 3, 1, 11, 15, 12, 12, 13, 14, 3, 9, 7, 4, 10, 3, 13, 3, 2, 14, 4, 11, 0, 3, 2, 9, 14, 14, 7, 15, 7, 6, 6, 6, 5, 7, 7, 0, 5, 0, 9, 14, 9, 3, 8, 0, 6, 3, 5, 1, 14, 5, 6, 9, 4, 3, 14, 15, 14, 2, 7, 0, 14, 9, 7, 6, 4, 3, 9, 10, 3, 0, 10, 0, 4, 3, 6, 11, 10, 0, 15, 3, 13, 2, 5, 14, 7, 0, 2, 13, 13, 9, 11, 6, 2, 5, 3, 6, 0, 10, 10, 8, 7, 7, 2, 3, 15, 2, 4, 1, 0, 2, 15, 9, 0, 15, 2, 8, 8, 0, 15, 2, 13, 3, 6, 2, 14, 14], -[15, 3, 8, 12, 5, 4, 12, 1, 0, 10, 12, 3, 15, 7, 7, 15, 13, 8, 1, 12, 14, 7, 15, 9, 0, 14, 11, 11, 12, 1, 9, 15, 6, 13, 9, 5, 12, 1, 8, 10, 11, 4, 0, 15, 13, 4, 11, 1, 14, 5, 5, 9, 2, 11, 14, 0, 11, 12, 7, 3, 1, 8, 12, 14, 9, 12, 7, 12, 9, 5, 13, 2, 9, 14, 3, 3, 3, 7, 13, 5, 4, 10, 8, 12, 7, 5, 6, 11, 12, 15, 8, 15, 9, 4, 9, 3, 11, 7, 15, 8, 3, 9, 0, 8, 5, 7, 13, 6, 11, 7, 8, 9, 1, 4, 1, 5, 2, 15, 14, 1, 15, 6, 6, 5, 2, 13, 5, 15, 5, 4, 7, 5, 12, 11, 10, 11, 9, 0, 8, 0, 11, 10, 13, 8, 9, 5, 13, 8, 14, 9, 11, 8, 9, 3, 13, 3, 2, 10, 6, 0, 4, 10, 11, 3, 5, 5, 3, 8, 5, 1, 3, 5, 11, 7, 3, 7, 13, 15, 5, 12, 15, 3, 3, 11, 6, 10, 6, 5, 2, 15, 4, 11, 1, 2, 15, 7, 2, 8, 2, 2, 5, 15, 8, 13, 4, 6, 5, 9, 1, 7, 5, 12, 10, 8, 6, 11, 5, 14, 0, 0, 6, 12, 15, 4, 12, 5, 14, 13, 12, 0, 6, 7, 8, 10, 7, 11, 7, 13, 13, 11, 12, 9, 4, 10, 0, 15, 6, 14, 12, 1, 6, 7, 6, 7, 8, 13], -[12, 4, 2, 11, 14, 14, 0, 12, 13, 7, 7, 9, 13, 14, 0, 6, 5, 14, 7, 5, 6, 12, 6, 4, 12, 2, 7, 7, 8, 14, 13, 10, 5, 14, 0, 8, 5, 6, 8, 0, 6, 10, 10, 2, 14, 8, 5, 0, 3, 11, 14, 4, 15, 5, 2, 13, 15, 5, 5, 14, 9, 11, 14, 13, 3, 11, 15, 15, 14, 4, 5, 7, 4, 13, 3, 7, 6, 14, 8, 10, 10, 10, 3, 3, 12, 1, 3, 14, 13, 5, 8, 13, 14, 5, 11, 7, 3, 9, 5, 2, 2, 2, 13, 13, 15, 8, 8, 5, 0, 13, 5, 4, 3, 12, 12, 5, 6, 11, 10, 9, 6, 4, 13, 4, 14, 2, 7, 6, 0, 2, 6, 11, 11, 8, 4, 13, 12, 1, 0, 0, 11, 1, 13, 15, 15, 8, 6, 11, 5, 10, 3, 2, 4, 7, 0, 11, 13, 11, 7, 11, 0, 3, 3, 13, 8, 12, 15, 2, 1, 8, 9, 7, 13, 14, 7, 14, 0, 5, 4, 2, 12, 8, 5, 7, 2, 4, 15, 5, 9, 8, 1, 9, 13, 5, 11, 1, 13, 11, 1, 9, 3, 14, 7, 14, 1, 7, 6, 6, 0, 4, 6, 8, 3, 8, 11, 9, 2, 8, 13, 3, 1, 7, 9, 9, 0, 1, 1, 4, 2, 14, 2, 12, 2, 0, 15, 2, 8, 3, 5, 10, 2, 10, 7, 10, 6, 14, 0, 1, 10, 3, 2, 13, 10, 9, 12, 1], -[3, 12, 1, 8, 13, 14, 7, 6, 4, 6, 9, 14, 5, 9, 11, 7, 4, 8, 4, 0, 15, 6, 6, 3, 10, 2, 10, 13, 15, 11, 11, 2, 4, 5, 8, 1, 13, 12, 9, 1, 5, 2, 5, 15, 10, 9, 12, 9, 4, 15, 4, 11, 14, 12, 14, 0, 15, 13, 7, 9, 14, 11, 13, 9, 7, 7, 8, 6, 0, 13, 15, 10, 14, 6, 13, 11, 13, 11, 12, 1, 4, 8, 10, 15, 10, 10, 14, 2, 8, 13, 5, 8, 14, 10, 14, 5, 2, 15, 4, 5, 13, 2, 13, 7, 12, 13, 12, 12, 8, 13, 2, 6, 12, 12, 1, 11, 1, 14, 9, 1, 11, 15, 14, 7, 14, 1, 13, 1, 8, 13, 15, 3, 7, 11, 14, 12, 12, 0, 2, 15, 2, 10, 1, 4, 4, 14, 9, 4, 8, 0, 14, 0, 5, 6, 0, 0, 8, 4, 5, 10, 11, 7, 0, 6, 8, 14, 10, 2, 10, 5, 10, 4, 10, 9, 15, 1, 14, 0, 6, 8, 8, 1, 10, 7, 12, 4, 1, 12, 6, 11, 6, 14, 10, 9, 15, 12, 15, 9, 6, 8, 10, 13, 13, 4, 10, 8, 7, 8, 0, 12, 11, 4, 0, 1, 7, 13, 6, 8, 9, 12, 6, 12, 15, 11, 3, 6, 6, 5, 11, 8, 9, 10, 2, 9, 4, 13, 6, 1, 7, 1, 7, 3, 13, 8, 6, 0, 3, 14, 9, 3, 1, 8, 4, 4, 1, 11], -[1, 11, 8, 11, 13, 2, 10, 0, 3, 11, 6, 2, 0, 12, 6, 13, 8, 13, 10, 10, 7, 4, 12, 2, 14, 2, 6, 6, 14, 8, 3, 12, 15, 12, 7, 9, 7, 11, 11, 2, 3, 7, 7, 13, 6, 10, 13, 7, 4, 9, 10, 9, 2, 0, 12, 1, 12, 9, 2, 3, 5, 2, 2, 2, 9, 3, 0, 1, 5, 2, 11, 9, 4, 10, 0, 0, 5, 5, 5, 2, 11, 1, 13, 11, 8, 7, 1, 10, 15, 11, 14, 10, 4, 6, 6, 8, 13, 11, 6, 4, 7, 9, 7, 12, 6, 14, 15, 2, 5, 0, 14, 4, 14, 12, 15, 14, 9, 1, 7, 3, 6, 2, 6, 11, 0, 1, 14, 0, 0, 11, 14, 11, 9, 2, 12, 4, 13, 14, 0, 14, 13, 11, 12, 12, 1, 0, 5, 6, 2, 4, 0, 13, 12, 8, 10, 14, 0, 0, 0, 2, 1, 13, 8, 9, 12, 12, 6, 2, 15, 9, 11, 15, 14, 9, 7, 5, 4, 12, 14, 6, 3, 11, 6, 1, 13, 3, 13, 11, 10, 8, 7, 10, 6, 12, 15, 13, 5, 3, 0, 6, 7, 3, 10, 9, 8, 13, 11, 4, 13, 1, 0, 7, 4, 11, 10, 13, 2, 5, 2, 14, 9, 9, 13, 8, 9, 2, 3, 10, 3, 13, 4, 12, 7, 12, 4, 14, 1, 0, 5, 6, 14, 12, 2, 10, 12, 10, 10, 2, 8, 9, 8, 6, 8, 14, 9, 0], -[11, 2, 1, 4, 0, 2, 4, 12, 2, 2, 9, 10, 15, 6, 11, 5, 10, 10, 8, 9, 11, 10, 1, 6, 13, 0, 10, 10, 2, 9, 10, 9, 10, 10, 3, 2, 6, 14, 5, 15, 10, 4, 0, 11, 6, 12, 6, 6, 4, 8, 1, 10, 15, 14, 3, 12, 1, 10, 0, 7, 13, 12, 12, 8, 1, 0, 9, 10, 9, 11, 14, 0, 4, 9, 7, 15, 5, 2, 13, 0, 3, 11, 8, 11, 15, 8, 5, 11, 2, 1, 13, 11, 10, 1, 3, 2, 1, 10, 5, 14, 11, 13, 3, 5, 6, 11, 11, 11, 4, 7, 15, 8, 9, 13, 11, 2, 12, 0, 15, 1, 2, 4, 8, 5, 8, 1, 8, 1, 14, 8, 11, 11, 11, 9, 10, 2, 13, 13, 4, 14, 13, 6, 12, 9, 6, 2, 6, 3, 8, 9, 3, 4, 6, 4, 13, 10, 9, 4, 2, 7, 13, 10, 7, 14, 12, 10, 11, 8, 9, 0, 12, 1, 0, 9, 9, 1, 1, 4, 6, 5, 6, 12, 2, 8, 13, 13, 2, 0, 11, 12, 6, 3, 13, 14, 1, 11, 9, 5, 0, 14, 1, 15, 6, 15, 4, 0, 2, 13, 2, 10, 1, 4, 7, 13, 7, 3, 7, 4, 6, 6, 2, 4, 5, 12, 12, 2, 13, 2, 13, 1, 12, 12, 14, 3, 7, 11, 11, 9, 10, 13, 8, 13, 11, 15, 8, 14, 6, 0, 2, 1, 0, 11, 1, 4, 10, 15], -[4, 1, 8, 4, 5, 13, 9, 6, 7, 0, 8, 4, 8, 6, 10, 15, 15, 15, 7, 10, 10, 14, 6, 1, 4, 6, 11, 4, 5, 2, 15, 4, 5, 11, 2, 3, 2, 7, 9, 14, 13, 3, 8, 2, 8, 10, 15, 12, 2, 3, 0, 0, 11, 10, 1, 15, 4, 5, 13, 4, 8, 6, 1, 2, 12, 8, 6, 4, 5, 8, 9, 2, 4, 2, 6, 12, 15, 4, 1, 1, 14, 7, 11, 5, 13, 3, 7, 4, 2, 14, 10, 15, 4, 2, 13, 10, 0, 3, 5, 2, 1, 13, 15, 13, 11, 13, 11, 15, 9, 15, 3, 14, 6, 2, 1, 3, 7, 5, 10, 9, 12, 4, 8, 2, 7, 7, 13, 4, 10, 10, 11, 9, 10, 2, 1, 6, 12, 9, 11, 3, 1, 11, 4, 9, 4, 10, 0, 3, 11, 7, 15, 15, 14, 13, 1, 4, 5, 2, 2, 1, 11, 14, 6, 10, 15, 12, 6, 8, 0, 4, 2, 3, 11, 12, 14, 15, 13, 8, 2, 1, 6, 5, 8, 5, 4, 15, 12, 3, 4, 10, 7, 14, 1, 6, 3, 10, 2, 4, 7, 8, 2, 7, 6, 4, 4, 15, 15, 8, 12, 7, 8, 14, 14, 14, 1, 11, 12, 14, 14, 5, 11, 0, 10, 1, 14, 5, 9, 12, 0, 12, 3, 3, 2, 6, 7, 2, 11, 3, 5, 8, 14, 14, 13, 11, 0, 10, 14, 10, 6, 4, 12, 12, 7, 11, 12, 0]] -w1EncodeTemp: 5BB44DB61C9BEBA09C859B5A3F41CE498EDC4646178423ECC99FE1E38E905E73F177B542F7C4C138B586B41B77DC88D75BE86FC16E36590C00A1D6577B50D3BFB9AEC53C7548B51959FFBDB352DA43D1CE3107243DBB7E3B37B4930372ECD1DFEE8EEB9A77478B7BEEC2D90B76482CC5EFC4726A564923562CD8B0F639F48F48E34FD7654080F5DB859BFEEC27888CADFFF40E44C10DB97D44C5CDD7908127B9D45701C0C7EF70AD56988E4B7B78441F806290DFD856FD97038041AC5E89A989FE13FBCCED93473A3DE2B43092EEF76766750705E9390836155E9634FE2E079E6734A9030A34B60A3F2DE507D29D6B5263A08A77322F14209FF082082F3D26EE3FC8451CA03C7FF78DC17E9FE0BB1CF9D6591CA84BF04D1B5E95B20ECB3781ECC9C7592DE933735DA4C857B6FCF849397B8F9380756D7B984151F21E6F56D2F54557BCBA0908AB8D598D9E8B393DA206A43B558315537B73FDC53FB3A656F2B4217F8222F5D8649571C58AB6E500C64F5CDE0C76A8B7D7BD9CA4F0E61C7676D84CB2EEC07D97ED60E557C6462C77E8ADE5806508A62A8E05B34E5FD25FE5B9DEB3FF4E75D473E6A8AA331CE35DD85E7B932522DD8F58D045C35CB69A464D2E6720B68BD41C001BFD8FB6A52374B0BDB730D3C82F8179EDE750248C75425F89915D1BBD91E3E771664086839B823D71991041E2C2022F38A5A2A7E6103AD29A1CC381ED6764E9957B84046F362ADABF2B5418CD1925F59A9CF4B4CE0EDF97BE9D7768D0AF6EBDBD1C84FAAA2ED885AE5EF2542D7DDCCCD862CCB1E119FB7E1E1DD83FB7CE0CF2A241E449080E650048A57B60E82A5A4A9A1F0E86187A4CC1B6E69ACF9F86DA4D8A87C04B10D786C9C6BF63568BA992D41617378D06E3398144B1B1B82D0AB326C0D6D8AA472C2E668EC3CF97B72B73D7A67D949A021C9C3225223910259BA40055251BBD78A1BFAE6486BD4697C7E62F054ECEEF193726B6100EB0BE294CEDE0BDCC016542D08CEA0020D198CC269FFB9E57C46EB3163DBD8AA7C6DF3560379AD84B1D70B4DA52E2998D29A3D3C4C7E40165CEA2AC2A9868E8092B4120C422A96F5BAA98AB610DAA929AAA23E6F54AB0C66684A1EFC3A170CD8C01A9B90E94F7250DB3B88FB512BD1A23A1E5DB53B6BB748FD92B0C1F425818188EBB9B2ADDE46D9C2636984346AD4972ADE7AC8B091C90194156C682DD02CB36EDB159E0F1F604D2A241D737476642C52C2D1DCC3EB79BDAD8FBE80612B041FA1448D569074868FAFFA7EA16644B254FB53272E93D28A8CF3200ABF1544D68218C46852924C64F117E5B3D47E2FA24AD3025D1DFDBFBF9E32631579A4C28774DAA9B2A619C3BB194A4307BFFDE412512EBA6CF864032CBFE8D125658F43CA4E761A342877246F48F7CE8EEB1EC5E0B1A5EC9C03362273B85EEBDA0AE46CCB70C -cTilde: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE -cTildePrime: 13E899EEDCCC0FBA629144E4AC067906B5326B8F9A6CCBABE1444ADD4645160D2257828710D1EE106021B5641E78815575D4F095D015D8465C92D2DDF4ABDFBE -cTilde == cTildePrime, signature verified diff --git a/tests/PQC Intermediate Values/fetch_values.sh b/tests/PQC Intermediate Values/fetch_values.sh new file mode 100755 index 000000000..0f683eba2 --- /dev/null +++ b/tests/PQC Intermediate Values/fetch_values.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# SPDX-License-Identifier: MIT + +# This script fetches the NIST vectors for the ML-KEM-ipd and ML-DSA-ipd and extracts the values we use for testing + +wget https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip +unzip PQC\ Intermediate\ Values.zip + +file_keygen="PQC Intermediate Values/Key Generation -- " +file_signature="PQC Intermediate Values/Signature Generation -- " +file_verification="PQC Intermediate Values/Signature Verification -- " + +for VARIANT in "ML-DSA-44" "ML-DSA-65" "ML-DSA-87" +do + echo "Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip" >> "$VARIANT.txt" + grep "seed: " "$file_keygen$VARIANT.txt" >> "$VARIANT.txt" + grep "message: " "$file_signature$VARIANT.txt" | sed 's/message: /sig_message: /g' >> "$VARIANT.txt" + grep "sk: " "$file_signature$VARIANT.txt" | sed 's/sk: /sig_sk: /g' >> "$VARIANT.txt" + grep "rnd: " "$file_signature$VARIANT.txt" >> "$VARIANT.txt" + + grep "signature: " "$file_verification$VARIANT.txt" | sed "s/signature: /verif_signature: /g" >> "$VARIANT.txt" + grep "pk: " "$file_verification$VARIANT.txt" | sed "s/pk: /verif_pk: /g" >> "$VARIANT.txt" + grep "message: " "$file_verification$VARIANT.txt" | sed "s/message: /verif_message: /g" >> "$VARIANT.txt" + + grep "pk: " "$file_keygen$VARIANT.txt" | sed "s/pk: /keygen_pk: /g" >> "$VARIANT.txt" + grep "sk: " "$file_keygen$VARIANT.txt" | sed 's/sk: /keygen_sk: /g' >> "$VARIANT.txt" + grep "signature: " "$file_signature$VARIANT.txt" | sed "s/signature: /sig_signature: /g" >> "$VARIANT.txt" +done + +file_keygen="PQC Intermediate Values/Key Generation -- " +file_encaps="PQC Intermediate Values/Encapsulation -- " +file_decaps="PQC Intermediate Values/Decapsulation -- " + +for VARIANT in "ML-KEM-512" "ML-KEM-768" "ML-KEM-1024" +do + echo "Origin of the values: https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip" >> "$VARIANT.txt" + grep "z: " "$file_keygen$VARIANT.txt" | sed 's/z: /keygen_z: /g' >> "$VARIANT.txt" + grep "d: " "$file_keygen$VARIANT.txt" | sed 's/d: /keygen_d: /g' >> "$VARIANT.txt" + + grep "m: " "$file_encaps$VARIANT.txt" | sed 's/m: /encaps_m: /g' >> "$VARIANT.txt" + grep "ek: " "$file_encaps$VARIANT.txt" | sed 's/ek: /encaps_ek: /g' >> "$VARIANT.txt" + grep "K: " "$file_encaps$VARIANT.txt" | sed 's/K: /encaps_K: /g' >> "$VARIANT.txt" + + grep "dk: " "$file_decaps$VARIANT.txt" | sed 's/dk: /decaps_dk: /g' >> "$VARIANT.txt" + grep "c: " "$file_decaps$VARIANT.txt" | sed 's/c: /decaps_c: /g' >> "$VARIANT.txt" + grep "KPrime: " "$file_decaps$VARIANT.txt" | sed 's/KPrime: /decaps_KPrime: /g' >> "$VARIANT.txt" + + grep "ek: " "$file_keygen$VARIANT.txt" | sed 's/ek: /keygen_ek: /g' >> "$VARIANT.txt" + grep "dk: " "$file_keygen$VARIANT.txt" | sed 's/dk: /keygen_dk: /g' >> "$VARIANT.txt" + + grep "c: " "$file_encaps$VARIANT.txt" | sed 's/c: /encaps_c: /g' >> "$VARIANT.txt" + +done \ No newline at end of file diff --git a/tests/test_kem_vectors.sh b/tests/test_kem_vectors.sh index df45739af..a57d883e2 100644 --- a/tests/test_kem_vectors.sh +++ b/tests/test_kem_vectors.sh @@ -1,29 +1,27 @@ #!/bin/bash # SPDX-License-Identifier: MIT -file_keygen=$2 -file_encaps=$3 -file_decaps=$4 -build_dir=$5 +file=$2 +build_dir=$3 # input part -keygen_z=$(grep "z: " "$file_keygen" | sed 's/z: //g') -keygen_d=$(grep "d: " "$file_keygen" | sed 's/d: //g') +keygen_z=$(grep "keygen_z: " "$file" | sed 's/keygen_z: //g') +keygen_d=$(grep "keygen_d: " "$file" | sed 's/keygen_d: //g') -encaps_m=$(grep "m: " "$file_encaps" | sed 's/m: //g') -encaps_ek=$(grep "ek: " "$file_encaps" | sed 's/ek: //g') -encaps_k=$(grep "K: " "$file_encaps" | sed 's/K: //g') +encaps_m=$(grep "encaps_m: " "$file" | sed 's/encaps_m: //g') +encaps_ek=$(grep "encaps_ek: " "$file" | sed 's/encaps_ek: //g') +encaps_k=$(grep "encaps_K: " "$file" | sed 's/encaps_K: //g') -decaps_dk=$(grep "dk: " "$file_decaps" | sed 's/dk: //g') -decaps_c=$(grep "c: " "$file_decaps" | sed 's/c: //g') -decaps_kprime=$(grep "KPrime: " "$file_decaps" | sed 's/KPrime: //g') +decaps_dk=$(grep "decaps_dk: " "$file" | sed 's/decaps_dk: //g') +decaps_c=$(grep "decaps_c: " "$file" | sed 's/decaps_c: //g') +decaps_kprime=$(grep "decaps_KPrime: " "$file" | sed 's/decaps_KPrime: //g') # KAT part -keygen_pk=$(grep "ek: " "$file_keygen") -keygen_sk=$(grep "dk: " "$file_keygen") +keygen_pk=$(grep "keygen_ek: " "$file") +keygen_sk=$(grep "keygen_dk: " "$file") -encaps_c=$(grep "c: " "$file_encaps") -encaps_K=$(grep "K: " "$file_encaps") +encaps_c=$(grep "encaps_c: " "$file") +encaps_K=$(grep "encaps_K: " "$file") output=$($build_dir/tests/vectors_kem $1 "$keygen_z$keygen_d$encaps_m" "$encaps_ek" "$encaps_k" "$decaps_dk" "$decaps_c" "$decaps_kprime") if [ $? != 0 ]; then @@ -31,10 +29,10 @@ if [ $? != 0 ]; then fi # Parse output: pk, sk, signature -output_pk=$(echo "$output" | grep "ek: ") -output_sk=$(echo "$output" | grep "dk: ") -output_c=$(echo "$output" | grep "c: ") -output_K=$(echo "$output" | grep "K: ") +output_pk=$(echo "$output" | grep "ek: " | sed 's/ek: /keygen_ek: /g') +output_sk=$(echo "$output" | grep "dk: " | sed 's/dk: /keygen_dk: /g') +output_c=$(echo "$output" | grep "c: " | sed 's/c: /encaps_c: /g') +output_K=$(echo "$output" | grep "K: " | sed 's/K: /encaps_K: /g') if [ "$keygen_pk" != "$output_pk" ]; then echo "keygen_pk mismatch for $1" diff --git a/tests/test_sig_vectors.sh b/tests/test_sig_vectors.sh index 278348a5c..4e859394f 100644 --- a/tests/test_sig_vectors.sh +++ b/tests/test_sig_vectors.sh @@ -1,26 +1,24 @@ #!/bin/bash # SPDX-License-Identifier: MIT -file_keygen=$2 -file_signature=$3 -file_verification=$4 -build_dir=$5 +file=$2 +build_dir=$3 # input part -prng_output_stream=$(grep "seed: " "$file_keygen" | sed 's/seed: //g') +prng_output_stream=$(grep "seed: " "$file" | sed 's/seed: //g') -sig_msg=$(grep "message: " "$file_signature" | sed 's/message: //g') -sig_sk=$(grep "sk: " "$file_signature" | sed 's/sk: //g') -sig_rnd=$(grep "rnd: " "$file_signature" | sed "s/rnd: //g") +sig_msg=$(grep "sig_message: " "$file" | sed 's/sig_message: //g') +sig_sk=$(grep "sig_sk: " "$file" | sed 's/sig_sk: //g') +sig_rnd=$(grep "rnd: " "$file" | sed "s/rnd: //g") -verif_sig=$(grep "signature: " "$file_verification" | sed "s/signature: //g") -verif_pk=$(grep "pk: " "$file_verification" | sed "s/pk: //g") -verif_msg=$(grep "message: " "$file_verification" | sed "s/message: //g") +verif_sig=$(grep "verif_signature: " "$file" | sed "s/verif_signature: //g") +verif_pk=$(grep "verif_pk: " "$file" | sed "s/verif_pk: //g") +verif_msg=$(grep "verif_message: " "$file" | sed "s/verif_message: //g") # KAT part -keygen_pk=$(grep "pk: " "$file_keygen") -keygen_sk=$(grep "sk: " "$file_keygen") -sig_signature=$(grep "signature: " "$file_signature") +keygen_pk=$(grep "keygen_pk: " "$file") +keygen_sk=$(grep "keygen_sk: " "$file") +sig_signature=$(grep "sig_signature: " "$file") output=$($build_dir/tests/vectors_sig $1 "$prng_output_stream$sig_rnd" "$sig_msg" "$sig_sk" "$verif_sig" "$verif_pk" "$verif_msg") if [ $? != 0 ]; then @@ -28,9 +26,9 @@ if [ $? != 0 ]; then fi # Parse output: pk, sk, signature -output_pk=$(echo "$output" | grep "pk: ") -output_sk=$(echo "$output" | grep "sk: ") -output_signature=$(echo "$output" | grep "signature: ") +output_pk=$(echo "$output" | grep "pk: " | sed "s/pk: /keygen_pk: /g") +output_sk=$(echo "$output" | grep "sk: " | sed "s/sk: /keygen_sk: /g") +output_signature=$(echo "$output" | grep "signature: " | sed "s/signature: /sig_signature: /g") if [ "$keygen_pk" != "$output_pk" ]; then echo "keygen_pk mismatch for $1" diff --git a/tests/test_vectors.sh b/tests/test_vectors.sh index 727a2a705..99591eec9 100755 --- a/tests/test_vectors.sh +++ b/tests/test_vectors.sh @@ -9,72 +9,60 @@ fi if [ "$1" = "ML-DSA-44-ipd" ]; then + file=tests/PQC\ Intermediate\ Values/ML-DSA-44.txt scheme_name=ML-DSA-44-ipd - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-44.txt - file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-44.txt - file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-44.txt - sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi elif [ "$1" = "ML-DSA-65-ipd" ]; then - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-65.txt - file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-65.txt - file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-65.txt + file=tests/PQC\ Intermediate\ Values/ML-DSA-65.txt scheme_name=ML-DSA-65-ipd - sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi elif [ "$1" = "ML-DSA-87-ipd" ]; then - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-DSA-87.txt - file_signature=tests/PQC\ Intermediate\ Values/Signature\ Generation\ --\ ML-DSA-87.txt - file_verification=tests/PQC\ Intermediate\ Values/Signature\ Verification\ --\ ML-DSA-87.txt + file=tests/PQC\ Intermediate\ Values/ML-DSA-87.txt scheme_name=ML-DSA-87-ipd - sh tests/test_sig_vectors.sh "$scheme_name" "$file_keygen" "$file_signature" "$file_verification" "$build_dir" + sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi elif [ "$1" = "ML-KEM-512-ipd" ]; then - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-512.txt - file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-512.txt - file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-512.txt + file=tests/PQC\ Intermediate\ Values/ML-KEM-512.txt scheme_name=ML-KEM-512-ipd - sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi elif [ "$1" = "ML-KEM-768-ipd" ]; then - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-768.txt - file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-768.txt - file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-768.txt + file=tests/PQC\ Intermediate\ Values/ML-KEM-768.txt scheme_name=ML-KEM-768-ipd - sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi elif [ "$1" = "ML-KEM-1024-ipd" ]; then - file_keygen=tests/PQC\ Intermediate\ Values/Key\ Generation\ --\ ML-KEM-1024.txt - file_encaps=tests/PQC\ Intermediate\ Values/Encapsulation\ --\ ML-KEM-1024.txt - file_decaps=tests/PQC\ Intermediate\ Values/Decapsulation\ --\ ML-KEM-1024.txt + file=tests/PQC\ Intermediate\ Values/ML-KEM-1024.txt scheme_name=ML-KEM-1024-ipd - sh tests/test_kem_vectors.sh "$scheme_name" "$file_keygen" "$file_encaps" "$file_decaps" "$build_dir" + sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" if [ $? != 0 ]; then exit 1 fi From 75ecd0528f655d9d7f6a818bb048d3806232bc9b Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 24 Jan 2024 18:11:52 +0100 Subject: [PATCH 16/27] more friendly test folder name --- .../ML-DSA-44.txt | 0 .../ML-DSA-65.txt | 0 .../ML-DSA-87.txt | 0 .../ML-KEM-1024.txt | 0 .../ML-KEM-512.txt | 0 .../ML-KEM-768.txt | 0 .../fetch_values.sh | 14 +++++++------- tests/test_vectors.sh | 12 ++++++------ 8 files changed, 13 insertions(+), 13 deletions(-) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-DSA-44.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-DSA-65.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-DSA-87.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-KEM-1024.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-KEM-512.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/ML-KEM-768.txt (100%) rename tests/{PQC Intermediate Values => PQC_Intermediate_Values}/fetch_values.sh (87%) diff --git a/tests/PQC Intermediate Values/ML-DSA-44.txt b/tests/PQC_Intermediate_Values/ML-DSA-44.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-DSA-44.txt rename to tests/PQC_Intermediate_Values/ML-DSA-44.txt diff --git a/tests/PQC Intermediate Values/ML-DSA-65.txt b/tests/PQC_Intermediate_Values/ML-DSA-65.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-DSA-65.txt rename to tests/PQC_Intermediate_Values/ML-DSA-65.txt diff --git a/tests/PQC Intermediate Values/ML-DSA-87.txt b/tests/PQC_Intermediate_Values/ML-DSA-87.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-DSA-87.txt rename to tests/PQC_Intermediate_Values/ML-DSA-87.txt diff --git a/tests/PQC Intermediate Values/ML-KEM-1024.txt b/tests/PQC_Intermediate_Values/ML-KEM-1024.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-KEM-1024.txt rename to tests/PQC_Intermediate_Values/ML-KEM-1024.txt diff --git a/tests/PQC Intermediate Values/ML-KEM-512.txt b/tests/PQC_Intermediate_Values/ML-KEM-512.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-KEM-512.txt rename to tests/PQC_Intermediate_Values/ML-KEM-512.txt diff --git a/tests/PQC Intermediate Values/ML-KEM-768.txt b/tests/PQC_Intermediate_Values/ML-KEM-768.txt similarity index 100% rename from tests/PQC Intermediate Values/ML-KEM-768.txt rename to tests/PQC_Intermediate_Values/ML-KEM-768.txt diff --git a/tests/PQC Intermediate Values/fetch_values.sh b/tests/PQC_Intermediate_Values/fetch_values.sh similarity index 87% rename from tests/PQC Intermediate Values/fetch_values.sh rename to tests/PQC_Intermediate_Values/fetch_values.sh index 0f683eba2..ced9d554b 100755 --- a/tests/PQC Intermediate Values/fetch_values.sh +++ b/tests/PQC_Intermediate_Values/fetch_values.sh @@ -4,11 +4,11 @@ # This script fetches the NIST vectors for the ML-KEM-ipd and ML-DSA-ipd and extracts the values we use for testing wget https://csrc.nist.gov/csrc/media/Projects/post-quantum-cryptography/documents/example-files/PQC%20Intermediate%20Values.zip -unzip PQC\ Intermediate\ Values.zip +unzip PQC_Intermediate_Values.zip -file_keygen="PQC Intermediate Values/Key Generation -- " -file_signature="PQC Intermediate Values/Signature Generation -- " -file_verification="PQC Intermediate Values/Signature Verification -- " +file_keygen="PQC_Intermediate_Values/Key Generation -- " +file_signature="PQC_Intermediate_Values/Signature Generation -- " +file_verification="PQC_Intermediate_Values/Signature Verification -- " for VARIANT in "ML-DSA-44" "ML-DSA-65" "ML-DSA-87" do @@ -27,9 +27,9 @@ do grep "signature: " "$file_signature$VARIANT.txt" | sed "s/signature: /sig_signature: /g" >> "$VARIANT.txt" done -file_keygen="PQC Intermediate Values/Key Generation -- " -file_encaps="PQC Intermediate Values/Encapsulation -- " -file_decaps="PQC Intermediate Values/Decapsulation -- " +file_keygen="PQC_Intermediate_Values/Key Generation -- " +file_encaps="PQC_Intermediate_Values/Encapsulation -- " +file_decaps="PQC_Intermediate_Values/Decapsulation -- " for VARIANT in "ML-KEM-512" "ML-KEM-768" "ML-KEM-1024" do diff --git a/tests/test_vectors.sh b/tests/test_vectors.sh index 99591eec9..0261dbfc8 100755 --- a/tests/test_vectors.sh +++ b/tests/test_vectors.sh @@ -9,7 +9,7 @@ fi if [ "$1" = "ML-DSA-44-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-DSA-44.txt + file=tests/PQC_Intermediate_Values/ML-DSA-44.txt scheme_name=ML-DSA-44-ipd sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" @@ -19,7 +19,7 @@ if [ "$1" = "ML-DSA-44-ipd" ]; then elif [ "$1" = "ML-DSA-65-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-DSA-65.txt + file=tests/PQC_Intermediate_Values/ML-DSA-65.txt scheme_name=ML-DSA-65-ipd sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" @@ -29,7 +29,7 @@ elif [ "$1" = "ML-DSA-65-ipd" ]; then elif [ "$1" = "ML-DSA-87-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-DSA-87.txt + file=tests/PQC_Intermediate_Values/ML-DSA-87.txt scheme_name=ML-DSA-87-ipd sh tests/test_sig_vectors.sh "$scheme_name" "$file" "$build_dir" @@ -39,7 +39,7 @@ elif [ "$1" = "ML-DSA-87-ipd" ]; then elif [ "$1" = "ML-KEM-512-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-KEM-512.txt + file=tests/PQC_Intermediate_Values/ML-KEM-512.txt scheme_name=ML-KEM-512-ipd sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" @@ -49,7 +49,7 @@ elif [ "$1" = "ML-KEM-512-ipd" ]; then elif [ "$1" = "ML-KEM-768-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-KEM-768.txt + file=tests/PQC_Intermediate_Values/ML-KEM-768.txt scheme_name=ML-KEM-768-ipd sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" @@ -59,7 +59,7 @@ elif [ "$1" = "ML-KEM-768-ipd" ]; then elif [ "$1" = "ML-KEM-1024-ipd" ]; then - file=tests/PQC\ Intermediate\ Values/ML-KEM-1024.txt + file=tests/PQC_Intermediate_Values/ML-KEM-1024.txt scheme_name=ML-KEM-1024-ipd sh tests/test_kem_vectors.sh "$scheme_name" "$file" "$build_dir" From 9674fead316d2f6323bbfce0065b07b48687b0c0 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Thu, 25 Jan 2024 10:15:43 +0100 Subject: [PATCH 17/27] some improvements in test code --- tests/test_kem_vectors.sh | 1 + tests/vectors_kem.c | 48 ++++++++++++++++++++---------- tests/vectors_sig.c | 62 ++++++++++++++++++++++++++++----------- 3 files changed, 78 insertions(+), 33 deletions(-) diff --git a/tests/test_kem_vectors.sh b/tests/test_kem_vectors.sh index a57d883e2..0e64ade01 100644 --- a/tests/test_kem_vectors.sh +++ b/tests/test_kem_vectors.sh @@ -25,6 +25,7 @@ encaps_K=$(grep "encaps_K: " "$file") output=$($build_dir/tests/vectors_kem $1 "$keygen_z$keygen_d$encaps_m" "$encaps_ek" "$encaps_k" "$decaps_dk" "$decaps_c" "$decaps_kprime") if [ $? != 0 ]; then + echo "$output" exit 1 fi diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index 04296f17d..49b7db504 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -14,11 +14,11 @@ #include "system_info.c" -typedef struct { +struct { const uint8_t *pos; -} fixed_prng_state; - -fixed_prng_state prng_state = { .pos = 0 }; +} prng_state = { + .pos = 0 +}; /* Displays hexadecimal strings */ static void OQS_print_hex_string(const char *label, const uint8_t *str, size_t len) { @@ -228,22 +228,36 @@ int main(int argc, char **argv) { char *decaps_ciphertext = argv[6]; char *decaps_kprime = argv[7]; + uint8_t *prng_output_stream_bytes = NULL; + uint8_t *encaps_pk_bytes = NULL; + uint8_t *encaps_K_bytes = NULL; + uint8_t *decaps_sk_bytes = NULL; + uint8_t *decaps_ciphertext_bytes = NULL; + uint8_t *decaps_kprime_bytes = NULL; + + OQS_KEM *kem = OQS_KEM_new(alg_name); + if (kem == NULL) { + printf("[vectors_kem] %s was not enabled at compile-time.\n", alg_name); + rc = OQS_ERROR; + goto err; + } if (strlen(prng_output_stream) % 2 != 0 || - strlen(encaps_pk) % 2 != 0 || - strlen(encaps_K) % 2 != 0 || - strlen(decaps_sk) % 2 != 0 || - strlen(decaps_ciphertext) % 2 != 0 || - strlen(decaps_kprime) % 2 != 0) { - return EXIT_FAILURE; + strlen(encaps_pk) != 2 * kem->length_public_key || + strlen(encaps_K) != 2 * kem->length_shared_secret || + strlen(decaps_sk) != 2 * kem->length_secret_key || + strlen(decaps_ciphertext) != 2 * kem->length_ciphertext || + strlen(decaps_kprime) != 2 * kem->length_shared_secret ) { + rc = OQS_ERROR; + goto err; } - uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); // TODO: allocate real sizes and check before to real sizes! - uint8_t *encaps_pk_bytes = malloc(strlen(encaps_pk) / 2); - uint8_t *encaps_K_bytes = malloc(strlen(encaps_K) / 2); - uint8_t *decaps_sk_bytes = malloc(strlen(decaps_sk) / 2); - uint8_t *decaps_ciphertext_bytes = malloc(strlen(decaps_ciphertext) / 2); - uint8_t *decaps_kprime_bytes = malloc(strlen(decaps_kprime) / 2); + prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); + encaps_pk_bytes = malloc(kem->length_public_key); + encaps_K_bytes = malloc(kem->length_shared_secret); + decaps_sk_bytes = malloc(kem->length_secret_key); + decaps_ciphertext_bytes = malloc(kem->length_ciphertext); + decaps_kprime_bytes = malloc(kem->length_shared_secret); if ((prng_output_stream_bytes == NULL) || (encaps_pk_bytes == NULL) || (encaps_K_bytes == NULL) || (decaps_sk_bytes == NULL) || (decaps_ciphertext_bytes == NULL) || (decaps_kprime_bytes == NULL)) { fprintf(stderr, "[vectors_kem] ERROR: malloc failed!\n"); @@ -268,6 +282,8 @@ int main(int argc, char **argv) { OQS_MEM_insecure_free(decaps_ciphertext_bytes); OQS_MEM_insecure_free(decaps_kprime_bytes); + OQS_KEM_free(kem); + OQS_destroy(); if (rc != OQS_SUCCESS) { diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index 1cc2c08d1..fcbd6a582 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -14,11 +14,11 @@ #include "system_info.c" -typedef struct { +struct { const uint8_t *pos; -} fixed_prng_state; - -fixed_prng_state prng_state = { .pos = 0 }; +} prng_state = { + .pos = 0 +}; static void fprintBstr(FILE *fp, const char *S, const uint8_t *A, size_t L) { size_t i; @@ -175,6 +175,8 @@ OQS_STATUS sig_vector(const char *method_name, } int main(int argc, char **argv) { + OQS_STATUS rc; + OQS_init(); if (argc != 8) { @@ -203,21 +205,43 @@ int main(int argc, char **argv) { char *verif_msg = argv[7]; size_t verif_msg_len = strlen(verif_msg) / 2; + uint8_t *prng_output_stream_bytes = NULL; + uint8_t *sig_msg_bytes = NULL; + uint8_t *sig_sk_bytes = NULL; + uint8_t *verif_sig_bytes = NULL; + uint8_t *verif_pk_bytes = NULL; + uint8_t *verif_msg_bytes = NULL; + + OQS_SIG *sig = OQS_SIG_new(alg_name); + if (sig == NULL) { + printf("[vectors_sig] %s was not enabled at compile-time.\n", alg_name); + rc = OQS_ERROR; + goto err; + } + if (strlen(prng_output_stream) % 2 != 0 || - strlen(sig_msg) % 2 != 0 || - strlen(sig_sk) % 2 != 0 || - strlen(verif_sig) % 2 != 0 || - strlen(verif_pk) % 2 != 0 || - strlen(verif_msg) % 2 != 0) { - return EXIT_FAILURE; + strlen(sig_msg) % 2 != 0 || // variable length + strlen(sig_sk) != 2 * sig->length_secret_key || + strlen(verif_sig) != 2 * sig->length_signature || + strlen(verif_pk) != 2 * sig->length_public_key || + strlen(verif_msg) % 2 != 0) { // variable length + rc = OQS_ERROR; + goto err; + } + + prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); + sig_msg_bytes = malloc(strlen(sig_msg) / 2); + sig_sk_bytes = malloc(sig->length_secret_key); + verif_sig_bytes = malloc(sig->length_signature); + verif_pk_bytes = malloc(sig->length_public_key); + verif_msg_bytes = malloc(strlen(verif_msg) / 2); + + if ((prng_output_stream_bytes == NULL) || (sig_msg_bytes == NULL) || (sig_sk_bytes == NULL) || (verif_sig_bytes == NULL) || (verif_pk_bytes == NULL) || (verif_msg_bytes == NULL)) { + fprintf(stderr, "[vectors_sig] ERROR: malloc failed!\n"); + rc = OQS_ERROR; + goto err; } - uint8_t *prng_output_stream_bytes = malloc(strlen(prng_output_stream) / 2); - uint8_t *sig_msg_bytes = malloc(strlen(sig_msg) / 2); - uint8_t *sig_sk_bytes = malloc(strlen(sig_sk) / 2); - uint8_t *verif_sig_bytes = malloc(strlen(verif_sig) / 2); - uint8_t *verif_pk_bytes = malloc(strlen(verif_pk) / 2); - uint8_t *verif_msg_bytes = malloc(strlen(verif_msg) / 2); hexStringToByteArray(prng_output_stream, prng_output_stream_bytes); hexStringToByteArray(sig_msg, sig_msg_bytes); @@ -226,7 +250,9 @@ int main(int argc, char **argv) { hexStringToByteArray(verif_pk, verif_pk_bytes); hexStringToByteArray(verif_msg, verif_msg_bytes); - OQS_STATUS rc = sig_vector(alg_name, prng_output_stream_bytes, sig_msg_bytes, sig_msg_len, sig_sk_bytes, verif_sig_bytes, verif_pk_bytes, verif_msg_bytes, verif_msg_len); + rc = sig_vector(alg_name, prng_output_stream_bytes, sig_msg_bytes, sig_msg_len, sig_sk_bytes, verif_sig_bytes, verif_pk_bytes, verif_msg_bytes, verif_msg_len); + +err: OQS_MEM_insecure_free(prng_output_stream_bytes); OQS_MEM_insecure_free(sig_msg_bytes); OQS_MEM_insecure_free(sig_sk_bytes); @@ -234,6 +260,8 @@ int main(int argc, char **argv) { OQS_MEM_insecure_free(verif_pk_bytes); OQS_MEM_insecure_free(verif_msg_bytes); + OQS_SIG_free(sig); + OQS_destroy(); if (rc != OQS_SUCCESS) { From bfe973dd3e724d9e27b9d772a0e30b69bff281ea Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Thu, 25 Jan 2024 11:22:46 +0100 Subject: [PATCH 18/27] add ML-* licenses to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 80a401e6f..1f8b4695f 100644 --- a/README.md +++ b/README.md @@ -178,8 +178,10 @@ liboqs includes some third party libraries or modules that are licensed differen - `src/kem/classic_mceliece/pqclean_*`: public domain - `src/kem/kyber/pqcrystals-*`: public domain (CC0) or Apache License v2.0 - `src/kem/kyber/pqclean_*`: public domain (CC0), and public domain (CC0) or Apache License v2.0, and public domain (CC0) or MIT, and MIT +- `src/kem/ml_kem/pqcrystals-*`: public domain (CC0) or Apache License v2.0 - `src/sig/dilithium/pqcrystals-*`: public domain (CC0) or Apache License v2.0 - `src/sig/dilithium/pqclean_*`: public domain (CC0), and public domain (CC0) or Apache License v2.0, and public domain (CC0) or MIT, and MIT +- `src/sig/ml_dsa/pqcrystals-*`: public domain (CC0) or Apache License v2.0 - `src/sig/sphincs/pqclean_*`: CC0 (public domain) ## Acknowledgements From 6a8317f941f8ddb8d42b5f825bdbe925973c5fb3 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Thu, 25 Jan 2024 14:09:06 +0100 Subject: [PATCH 19/27] update list_standardized_algs --- .CMake/alg_support.cmake | 2 +- .../.CMake/alg_support.cmake/list_standardized_algs.fragment | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index 2177ebb6e..3e623010b 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -442,7 +442,7 @@ if(NOT ((OQS_MINIMAL_BUILD STREQUAL "") OR (OQS_MINIMAL_BUILD STREQUAL "OFF"))) filter_algs("${OQS_MINIMAL_BUILD}") elseif (${OQS_ALGS_ENABLED} STREQUAL "STD") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_START - filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44;SIG_ml_dsa_65;SIG_ml_dsa_87;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") + filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;KEM_ml_kem_512;KEM_ml_kem_768;KEM_ml_kem_1024;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44;SIG_ml_dsa_65;SIG_ml_dsa_87;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_END elseif(${OQS_ALGS_ENABLED} STREQUAL "NIST_R4") filter_algs("KEM_classic_mceliece_348864;KEM_classic_mceliece_348864f;KEM_classic_mceliece_460896;KEM_classic_mceliece_460896f;KEM_classic_mceliece_6688128;KEM_classic_mceliece_6688128f;KEM_classic_mceliece_6960119;KEM_classic_mceliece_6960119f;KEM_classic_mceliece_8192128;KEM_classic_mceliece_8192128f;KEM_hqc_128;KEM_hqc_192;KEM_hqc_256;KEM_bike_l1;KEM_bike_l3") diff --git a/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment b/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment index fc5a4fecb..bcf309937 100644 --- a/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment +++ b/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment @@ -1,6 +1,6 @@ filter_algs(" -{%- for family in instructions['kems'] if family['name'] == 'kyber' -%} +{%- for family in instructions['kems'] if family['name'] in ['kyber', 'ml_kem'] -%} {%- for scheme in family['schemes'] -%} KEM_{{ family['name'] }}_{{ scheme['scheme'] }}; {%- endfor -%} @@ -8,7 +8,7 @@ {%- for family in instructions['sigs'] -%} {%- set outer_loop = loop -%} {%- for scheme in family['schemes'] -%} - SIG_{{ family['name'] }}_{{ scheme['scheme'] }}{%- if not (outer_loop.last and loop.last) -%};{%- endif -%} + SIG_{{ family['name'] }}_{{ scheme['scheme'] if family['name'] in ['dilithium', 'ml_dsa', 'falcon', 'sphincs'] }}{%- if not (outer_loop.last and loop.last) -%};{%- endif -%} {%- endfor -%} {%- endfor -%} ") From 299e486acc860ade915ad0f84346932022c7a4bd Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Mon, 29 Jan 2024 16:13:19 +0100 Subject: [PATCH 20/27] consistent naming ml_*_ipd --- .CMake/alg_support.cmake | 26 +++--- .../copy_from_upstream/copy_from_upstream.yml | 12 +-- src/kem/kem.c | 36 ++++---- src/kem/kem.h | 6 +- src/kem/ml_kem/CMakeLists.txt | 84 +++++++++---------- src/kem/ml_kem/kem_ml_kem.h | 54 ++++++------ ...em_ml_kem_1024.c => kem_ml_kem_1024_ipd.c} | 34 ++++---- ...{kem_ml_kem_512.c => kem_ml_kem_512_ipd.c} | 34 ++++---- ...{kem_ml_kem_768.c => kem_ml_kem_768_ipd.c} | 34 ++++---- src/oqsconfig.h.cmake | 24 +++--- src/sig/ml_dsa/CMakeLists.txt | 84 +++++++++---------- src/sig/ml_dsa/sig_ml_dsa.h | 50 +++++------ .../{sig_ml_dsa_44.c => sig_ml_dsa_44_ipd.c} | 32 +++---- .../{sig_ml_dsa_65.c => sig_ml_dsa_65_ipd.c} | 32 +++---- .../{sig_ml_dsa_87.c => sig_ml_dsa_87_ipd.c} | 32 +++---- src/sig/sig.c | 36 ++++---- src/sig/sig.h | 6 +- tests/vectors_kem.c | 6 +- tests/vectors_sig.c | 6 +- 19 files changed, 314 insertions(+), 314 deletions(-) rename src/kem/ml_kem/{kem_ml_kem_1024.c => kem_ml_kem_1024_ipd.c} (69%) rename src/kem/ml_kem/{kem_ml_kem_512.c => kem_ml_kem_512_ipd.c} (69%) rename src/kem/ml_kem/{kem_ml_kem_768.c => kem_ml_kem_768_ipd.c} (69%) rename src/sig/ml_dsa/{sig_ml_dsa_44.c => sig_ml_dsa_44_ipd.c} (71%) rename src/sig/ml_dsa/{sig_ml_dsa_65.c => sig_ml_dsa_65_ipd.c} (71%) rename src/sig/ml_dsa/{sig_ml_dsa_87.c => sig_ml_dsa_87_ipd.c} (71%) diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index 3e623010b..628f2d4ce 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -233,24 +233,24 @@ endif() option(OQS_ENABLE_KEM_ML_KEM "Enable ml_kem algorithm family" ON) -cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_512" OFF) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_512_ipd" OFF) endif() endif() -cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_768" OFF) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_768_ipd" OFF) endif() endif() -cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_1024" OFF) + cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_1024_ipd" OFF) endif() endif() @@ -297,24 +297,24 @@ endif() option(OQS_ENABLE_SIG_ML_DSA "Enable ml_dsa algorithm family" ON) -cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_44" OFF) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_44_ipd" OFF) endif() endif() -cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_65" OFF) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_65_ipd" OFF) endif() endif() -cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) - cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_87" OFF) + cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_87_ipd" OFF) endif() endif() @@ -442,7 +442,7 @@ if(NOT ((OQS_MINIMAL_BUILD STREQUAL "") OR (OQS_MINIMAL_BUILD STREQUAL "OFF"))) filter_algs("${OQS_MINIMAL_BUILD}") elseif (${OQS_ALGS_ENABLED} STREQUAL "STD") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_START - filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;KEM_ml_kem_512;KEM_ml_kem_768;KEM_ml_kem_1024;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44;SIG_ml_dsa_65;SIG_ml_dsa_87;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") + filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;KEM_ml_kem_512_ipd;KEM_ml_kem_768_ipd;KEM_ml_kem_1024_ipd;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44_ipd;SIG_ml_dsa_65_ipd;SIG_ml_dsa_87_ipd;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_END elseif(${OQS_ALGS_ENABLED} STREQUAL "NIST_R4") filter_algs("KEM_classic_mceliece_348864;KEM_classic_mceliece_348864f;KEM_classic_mceliece_460896;KEM_classic_mceliece_460896f;KEM_classic_mceliece_6688128;KEM_classic_mceliece_6688128f;KEM_classic_mceliece_6960119;KEM_classic_mceliece_6960119f;KEM_classic_mceliece_8192128;KEM_classic_mceliece_8192128f;KEM_hqc_128;KEM_hqc_192;KEM_hqc_256;KEM_bike_l1;KEM_bike_l3") diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index a314894f9..21503f4f8 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -143,15 +143,15 @@ kems: upstream_location: pqcrystals-kyber-standard schemes: - - scheme: "512" + scheme: "512_ipd" pqclean_scheme: ml-kem-512-ipd pretty_name_full: ML-KEM-512-ipd - - scheme: "768" + scheme: "768_ipd" pqclean_scheme: ml-kem-768-ipd pretty_name_full: ML-KEM-768-ipd - - scheme: "1024" + scheme: "1024_ipd" pqclean_scheme: ml-kem-1024-ipd pretty_name_full: ML-KEM-1024-ipd sigs: @@ -185,17 +185,17 @@ sigs: upstream_location: pqcrystals-dilithium-standard schemes: - - scheme: "44" + scheme: "44_ipd" pqclean_scheme: ml-dsa-44-ipd pretty_name_full: ML-DSA-44-ipd signed_msg_order: sig_then_msg - - scheme: "65" + scheme: "65_ipd" pqclean_scheme: ml-dsa-65-ipd pretty_name_full: ML-DSA-65-ipd signed_msg_order: sig_then_msg - - scheme: "87" + scheme: "87_ipd" pqclean_scheme: ml-dsa-87-ipd pretty_name_full: ML-DSA-87-ipd signed_msg_order: sig_then_msg diff --git a/src/kem/kem.c b/src/kem/kem.c index 2498e73bf..91c5c52c7 100644 --- a/src/kem/kem.c +++ b/src/kem/kem.c @@ -34,9 +34,9 @@ OQS_API const char *OQS_KEM_alg_identifier(size_t i) { OQS_KEM_alg_kyber_512, OQS_KEM_alg_kyber_768, OQS_KEM_alg_kyber_1024, - OQS_KEM_alg_ml_kem_512, - OQS_KEM_alg_ml_kem_768, - OQS_KEM_alg_ml_kem_1024, + OQS_KEM_alg_ml_kem_512_ipd, + OQS_KEM_alg_ml_kem_768_ipd, + OQS_KEM_alg_ml_kem_1024_ipd, ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END OQS_KEM_alg_ntruprime_sntrup761, OQS_KEM_alg_frodokem_640_aes, @@ -175,20 +175,20 @@ OQS_API int OQS_KEM_alg_is_enabled(const char *method_name) { #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512)) { -#ifdef OQS_ENABLE_KEM_ml_kem_512 + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_512_ipd return 1; #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768)) { -#ifdef OQS_ENABLE_KEM_ml_kem_768 + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_768_ipd return 1; #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024)) { -#ifdef OQS_ENABLE_KEM_ml_kem_1024 + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd return 1; #else return 0; @@ -361,21 +361,21 @@ OQS_API OQS_KEM *OQS_KEM_new(const char *method_name) { #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512)) { -#ifdef OQS_ENABLE_KEM_ml_kem_512 - return OQS_KEM_ml_kem_512_new(); + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_512_ipd + return OQS_KEM_ml_kem_512_ipd_new(); #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768)) { -#ifdef OQS_ENABLE_KEM_ml_kem_768 - return OQS_KEM_ml_kem_768_new(); + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_768_ipd + return OQS_KEM_ml_kem_768_ipd_new(); #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024)) { -#ifdef OQS_ENABLE_KEM_ml_kem_1024 - return OQS_KEM_ml_kem_1024_new(); + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)) { +#ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd + return OQS_KEM_ml_kem_1024_ipd_new(); #else return NULL; #endif diff --git a/src/kem/kem.h b/src/kem/kem.h index 4fd5e57b1..8bac2cf26 100644 --- a/src/kem/kem.h +++ b/src/kem/kem.h @@ -71,11 +71,11 @@ extern "C" { /** Algorithm identifier for Kyber1024 KEM. */ #define OQS_KEM_alg_kyber_1024 "Kyber1024" /** Algorithm identifier for ML-KEM-512-ipd KEM. */ -#define OQS_KEM_alg_ml_kem_512 "ML-KEM-512-ipd" +#define OQS_KEM_alg_ml_kem_512_ipd "ML-KEM-512-ipd" /** Algorithm identifier for ML-KEM-768-ipd KEM. */ -#define OQS_KEM_alg_ml_kem_768 "ML-KEM-768-ipd" +#define OQS_KEM_alg_ml_kem_768_ipd "ML-KEM-768-ipd" /** Algorithm identifier for ML-KEM-1024-ipd KEM. */ -#define OQS_KEM_alg_ml_kem_1024 "ML-KEM-1024-ipd" +#define OQS_KEM_alg_ml_kem_1024_ipd "ML-KEM-1024-ipd" ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END /** Algorithm identifier for sntrup761 KEM. */ #define OQS_KEM_alg_ntruprime_sntrup761 "sntrup761" diff --git a/src/kem/ml_kem/CMakeLists.txt b/src/kem/ml_kem/CMakeLists.txt index d3c7d8f3e..a5890ab9c 100644 --- a/src/kem/ml_kem/CMakeLists.txt +++ b/src/kem/ml_kem/CMakeLists.txt @@ -5,58 +5,58 @@ set(_ML_KEM_OBJS "") -if(OQS_ENABLE_KEM_ml_kem_512) - add_library(ml_kem_512_ref OBJECT kem_ml_kem_512.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c) - target_compile_options(ml_kem_512_ref PUBLIC -DKYBER_K=2) - target_include_directories(ml_kem_512_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_ref) - target_include_directories(ml_kem_512_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_512_ref PUBLIC -DKYBER_K=2) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_512_ipd) + add_library(ml_kem_512_ipd_ref OBJECT kem_ml_kem_512_ipd.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_ref/verify.c) + target_compile_options(ml_kem_512_ipd_ref PUBLIC -DKYBER_K=2) + target_include_directories(ml_kem_512_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_ref) + target_include_directories(ml_kem_512_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_512_ipd_ref PUBLIC -DKYBER_K=2) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() -if(OQS_ENABLE_KEM_ml_kem_512_avx2) - add_library(ml_kem_512_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c) - target_include_directories(ml_kem_512_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2) - target_include_directories(ml_kem_512_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_512_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) - target_compile_options(ml_kem_512_avx2 PUBLIC -DKYBER_K=2) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2) + add_library(ml_kem_512_ipd_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-512-ipd_avx2/verify.c) + target_include_directories(ml_kem_512_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-512-ipd_avx2) + target_include_directories(ml_kem_512_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_512_ipd_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_512_ipd_avx2 PUBLIC -DKYBER_K=2) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() -if(OQS_ENABLE_KEM_ml_kem_768) - add_library(ml_kem_768_ref OBJECT kem_ml_kem_768.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c) - target_compile_options(ml_kem_768_ref PUBLIC -DKYBER_K=3) - target_include_directories(ml_kem_768_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_ref) - target_include_directories(ml_kem_768_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_768_ref PUBLIC -DKYBER_K=3) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_768_ipd) + add_library(ml_kem_768_ipd_ref OBJECT kem_ml_kem_768_ipd.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_ref/verify.c) + target_compile_options(ml_kem_768_ipd_ref PUBLIC -DKYBER_K=3) + target_include_directories(ml_kem_768_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_ref) + target_include_directories(ml_kem_768_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_768_ipd_ref PUBLIC -DKYBER_K=3) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() -if(OQS_ENABLE_KEM_ml_kem_768_avx2) - add_library(ml_kem_768_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c) - target_include_directories(ml_kem_768_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2) - target_include_directories(ml_kem_768_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_768_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) - target_compile_options(ml_kem_768_avx2 PUBLIC -DKYBER_K=3) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2) + add_library(ml_kem_768_ipd_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-768-ipd_avx2/verify.c) + target_include_directories(ml_kem_768_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-768-ipd_avx2) + target_include_directories(ml_kem_768_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_768_ipd_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_768_ipd_avx2 PUBLIC -DKYBER_K=3) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() -if(OQS_ENABLE_KEM_ml_kem_1024) - add_library(ml_kem_1024_ref OBJECT kem_ml_kem_1024.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c) - target_compile_options(ml_kem_1024_ref PUBLIC -DKYBER_K=4) - target_include_directories(ml_kem_1024_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref) - target_include_directories(ml_kem_1024_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_1024_ref PUBLIC -DKYBER_K=4) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_1024_ipd) + add_library(ml_kem_1024_ipd_ref OBJECT kem_ml_kem_1024_ipd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/ntt.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/reduce.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_ref/verify.c) + target_compile_options(ml_kem_1024_ipd_ref PUBLIC -DKYBER_K=4) + target_include_directories(ml_kem_1024_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_ref) + target_include_directories(ml_kem_1024_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_1024_ipd_ref PUBLIC -DKYBER_K=4) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() -if(OQS_ENABLE_KEM_ml_kem_1024_avx2) - add_library(ml_kem_1024_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c) - target_include_directories(ml_kem_1024_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2) - target_include_directories(ml_kem_1024_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_kem_1024_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) - target_compile_options(ml_kem_1024_avx2 PUBLIC -DKYBER_K=4) - set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) +if(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2) + add_library(ml_kem_1024_ipd_avx2 OBJECT pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/basemul.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/cbd.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/consts.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/fq.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/indcpa.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/invntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/kem.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/ntt.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/poly.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/polyvec.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/rejsample.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/shuffle.S pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/symmetric-shake.c pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2/verify.c) + target_include_directories(ml_kem_1024_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-kyber-standard_ml-kem-1024-ipd_avx2) + target_include_directories(ml_kem_1024_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_kem_1024_ipd_avx2 PRIVATE -mavx2 -mbmi2 -mpopcnt ) + target_compile_options(ml_kem_1024_ipd_avx2 PUBLIC -DKYBER_K=4) + set(_ML_KEM_OBJS ${_ML_KEM_OBJS} $) endif() set(ML_KEM_OBJS ${_ML_KEM_OBJS} PARENT_SCOPE) diff --git a/src/kem/ml_kem/kem_ml_kem.h b/src/kem/ml_kem/kem_ml_kem.h index 77d7e1435..cfe9d2f86 100644 --- a/src/kem/ml_kem/kem_ml_kem.h +++ b/src/kem/ml_kem/kem_ml_kem.h @@ -5,37 +5,37 @@ #include -#ifdef OQS_ENABLE_KEM_ml_kem_512 -#define OQS_KEM_ml_kem_512_length_public_key 800 -#define OQS_KEM_ml_kem_512_length_secret_key 1632 -#define OQS_KEM_ml_kem_512_length_ciphertext 768 -#define OQS_KEM_ml_kem_512_length_shared_secret 32 -OQS_KEM *OQS_KEM_ml_kem_512_new(void); -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#ifdef OQS_ENABLE_KEM_ml_kem_512_ipd +#define OQS_KEM_ml_kem_512_ipd_length_public_key 800 +#define OQS_KEM_ml_kem_512_ipd_length_secret_key 1632 +#define OQS_KEM_ml_kem_512_ipd_length_ciphertext 768 +#define OQS_KEM_ml_kem_512_ipd_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_512_ipd_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_ml_kem_768 -#define OQS_KEM_ml_kem_768_length_public_key 1184 -#define OQS_KEM_ml_kem_768_length_secret_key 2400 -#define OQS_KEM_ml_kem_768_length_ciphertext 1088 -#define OQS_KEM_ml_kem_768_length_shared_secret 32 -OQS_KEM *OQS_KEM_ml_kem_768_new(void); -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#ifdef OQS_ENABLE_KEM_ml_kem_768_ipd +#define OQS_KEM_ml_kem_768_ipd_length_public_key 1184 +#define OQS_KEM_ml_kem_768_ipd_length_secret_key 2400 +#define OQS_KEM_ml_kem_768_ipd_length_ciphertext 1088 +#define OQS_KEM_ml_kem_768_ipd_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_768_ipd_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_ml_kem_1024 -#define OQS_KEM_ml_kem_1024_length_public_key 1568 -#define OQS_KEM_ml_kem_1024_length_secret_key 3168 -#define OQS_KEM_ml_kem_1024_length_ciphertext 1568 -#define OQS_KEM_ml_kem_1024_length_shared_secret 32 -OQS_KEM *OQS_KEM_ml_kem_1024_new(void); -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +#ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd +#define OQS_KEM_ml_kem_1024_ipd_length_public_key 1568 +#define OQS_KEM_ml_kem_1024_ipd_length_secret_key 3168 +#define OQS_KEM_ml_kem_1024_ipd_length_ciphertext 1568 +#define OQS_KEM_ml_kem_1024_ipd_length_shared_secret 32 +OQS_KEM *OQS_KEM_ml_kem_1024_ipd_new(void); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif #endif diff --git a/src/kem/ml_kem/kem_ml_kem_1024.c b/src/kem/ml_kem/kem_ml_kem_1024_ipd.c similarity index 69% rename from src/kem/ml_kem/kem_ml_kem_1024.c rename to src/kem/ml_kem/kem_ml_kem_1024_ipd.c index 64aae5db0..8ac972eb7 100644 --- a/src/kem/ml_kem/kem_ml_kem_1024.c +++ b/src/kem/ml_kem/kem_ml_kem_1024_ipd.c @@ -4,28 +4,28 @@ #include -#if defined(OQS_ENABLE_KEM_ml_kem_1024) +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd) -OQS_KEM *OQS_KEM_ml_kem_1024_new(void) { +OQS_KEM *OQS_KEM_ml_kem_1024_ipd_new(void) { OQS_KEM *kem = malloc(sizeof(OQS_KEM)); if (kem == NULL) { return NULL; } - kem->method_name = OQS_KEM_alg_ml_kem_1024; + kem->method_name = OQS_KEM_alg_ml_kem_1024_ipd; kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; kem->claimed_nist_level = 5; kem->ind_cca = true; - kem->length_public_key = OQS_KEM_ml_kem_1024_length_public_key; - kem->length_secret_key = OQS_KEM_ml_kem_1024_length_secret_key; - kem->length_ciphertext = OQS_KEM_ml_kem_1024_length_ciphertext; - kem->length_shared_secret = OQS_KEM_ml_kem_1024_length_shared_secret; + kem->length_public_key = OQS_KEM_ml_kem_1024_ipd_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_1024_ipd_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_1024_ipd_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_1024_ipd_length_shared_secret; - kem->keypair = OQS_KEM_ml_kem_1024_keypair; - kem->encaps = OQS_KEM_ml_kem_1024_encaps; - kem->decaps = OQS_KEM_ml_kem_1024_decaps; + kem->keypair = OQS_KEM_ml_kem_1024_ipd_keypair; + kem->encaps = OQS_KEM_ml_kem_1024_ipd_encaps; + kem->decaps = OQS_KEM_ml_kem_1024_ipd_decaps; return kem; } @@ -34,14 +34,14 @@ extern int pqcrystals_ml_kem_1024_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_1024_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_1024_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); -#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2) extern int pqcrystals_ml_kem_1024_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_1024_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_1024_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); #endif -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -56,8 +56,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_keypair(uint8_t *public_key, uint8_t *sec #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -72,8 +72,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_encaps(uint8_t *ciphertext, uint8_t *shar #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_1024_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/kem/ml_kem/kem_ml_kem_512.c b/src/kem/ml_kem/kem_ml_kem_512_ipd.c similarity index 69% rename from src/kem/ml_kem/kem_ml_kem_512.c rename to src/kem/ml_kem/kem_ml_kem_512_ipd.c index f1623ada1..e08728a33 100644 --- a/src/kem/ml_kem/kem_ml_kem_512.c +++ b/src/kem/ml_kem/kem_ml_kem_512_ipd.c @@ -4,28 +4,28 @@ #include -#if defined(OQS_ENABLE_KEM_ml_kem_512) +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd) -OQS_KEM *OQS_KEM_ml_kem_512_new(void) { +OQS_KEM *OQS_KEM_ml_kem_512_ipd_new(void) { OQS_KEM *kem = malloc(sizeof(OQS_KEM)); if (kem == NULL) { return NULL; } - kem->method_name = OQS_KEM_alg_ml_kem_512; + kem->method_name = OQS_KEM_alg_ml_kem_512_ipd; kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; kem->claimed_nist_level = 1; kem->ind_cca = true; - kem->length_public_key = OQS_KEM_ml_kem_512_length_public_key; - kem->length_secret_key = OQS_KEM_ml_kem_512_length_secret_key; - kem->length_ciphertext = OQS_KEM_ml_kem_512_length_ciphertext; - kem->length_shared_secret = OQS_KEM_ml_kem_512_length_shared_secret; + kem->length_public_key = OQS_KEM_ml_kem_512_ipd_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_512_ipd_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_512_ipd_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_512_ipd_length_shared_secret; - kem->keypair = OQS_KEM_ml_kem_512_keypair; - kem->encaps = OQS_KEM_ml_kem_512_encaps; - kem->decaps = OQS_KEM_ml_kem_512_decaps; + kem->keypair = OQS_KEM_ml_kem_512_ipd_keypair; + kem->encaps = OQS_KEM_ml_kem_512_ipd_encaps; + kem->decaps = OQS_KEM_ml_kem_512_ipd_decaps; return kem; } @@ -34,14 +34,14 @@ extern int pqcrystals_ml_kem_512_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_512_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_512_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); -#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2) extern int pqcrystals_ml_kem_512_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_512_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_512_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); #endif -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -56,8 +56,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_512_keypair(uint8_t *public_key, uint8_t *secr #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -72,8 +72,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_512_encaps(uint8_t *ciphertext, uint8_t *share #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_512_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_512_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/kem/ml_kem/kem_ml_kem_768.c b/src/kem/ml_kem/kem_ml_kem_768_ipd.c similarity index 69% rename from src/kem/ml_kem/kem_ml_kem_768.c rename to src/kem/ml_kem/kem_ml_kem_768_ipd.c index bdce1aca2..9e44e0ff1 100644 --- a/src/kem/ml_kem/kem_ml_kem_768.c +++ b/src/kem/ml_kem/kem_ml_kem_768_ipd.c @@ -4,28 +4,28 @@ #include -#if defined(OQS_ENABLE_KEM_ml_kem_768) +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd) -OQS_KEM *OQS_KEM_ml_kem_768_new(void) { +OQS_KEM *OQS_KEM_ml_kem_768_ipd_new(void) { OQS_KEM *kem = malloc(sizeof(OQS_KEM)); if (kem == NULL) { return NULL; } - kem->method_name = OQS_KEM_alg_ml_kem_768; + kem->method_name = OQS_KEM_alg_ml_kem_768_ipd; kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; kem->claimed_nist_level = 3; kem->ind_cca = true; - kem->length_public_key = OQS_KEM_ml_kem_768_length_public_key; - kem->length_secret_key = OQS_KEM_ml_kem_768_length_secret_key; - kem->length_ciphertext = OQS_KEM_ml_kem_768_length_ciphertext; - kem->length_shared_secret = OQS_KEM_ml_kem_768_length_shared_secret; + kem->length_public_key = OQS_KEM_ml_kem_768_ipd_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_768_ipd_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_768_ipd_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_768_ipd_length_shared_secret; - kem->keypair = OQS_KEM_ml_kem_768_keypair; - kem->encaps = OQS_KEM_ml_kem_768_encaps; - kem->decaps = OQS_KEM_ml_kem_768_decaps; + kem->keypair = OQS_KEM_ml_kem_768_ipd_keypair; + kem->encaps = OQS_KEM_ml_kem_768_ipd_encaps; + kem->decaps = OQS_KEM_ml_kem_768_ipd_decaps; return kem; } @@ -34,14 +34,14 @@ extern int pqcrystals_ml_kem_768_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_768_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_768_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); -#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2) extern int pqcrystals_ml_kem_768_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_768_ipd_avx2_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_768_ipd_avx2_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); #endif -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -56,8 +56,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_768_keypair(uint8_t *public_key, uint8_t *secr #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -72,8 +72,8 @@ OQS_API OQS_STATUS OQS_KEM_ml_kem_768_encaps(uint8_t *ciphertext, uint8_t *share #endif } -OQS_API OQS_STATUS OQS_KEM_ml_kem_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_KEM_ml_kem_768_avx2) +OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_BMI2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index 53754c334..dd0218964 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -110,12 +110,12 @@ #cmakedefine OQS_ENABLE_KEM_kyber_1024_aarch64 1 #cmakedefine OQS_ENABLE_KEM_ML_KEM 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_512 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_512_avx2 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_768 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_768_avx2 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_1024 1 -#cmakedefine OQS_ENABLE_KEM_ml_kem_1024_avx2 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_512_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_512_ipd_avx2 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_768_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_768_ipd_avx2 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_1024_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_DILITHIUM 1 #cmakedefine OQS_ENABLE_SIG_dilithium_2 1 @@ -129,12 +129,12 @@ #cmakedefine OQS_ENABLE_SIG_dilithium_5_aarch64 1 #cmakedefine OQS_ENABLE_SIG_ML_DSA 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_44 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_44_avx2 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_65 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_65_avx2 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_87 1 -#cmakedefine OQS_ENABLE_SIG_ml_dsa_87_avx2 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_44_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_65_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_87_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_FALCON 1 #cmakedefine OQS_ENABLE_SIG_falcon_512 1 diff --git a/src/sig/ml_dsa/CMakeLists.txt b/src/sig/ml_dsa/CMakeLists.txt index 8ef4174c8..128cd0cf2 100644 --- a/src/sig/ml_dsa/CMakeLists.txt +++ b/src/sig/ml_dsa/CMakeLists.txt @@ -5,58 +5,58 @@ set(_ML_DSA_OBJS "") -if(OQS_ENABLE_SIG_ml_dsa_44) - add_library(ml_dsa_44_ref OBJECT sig_ml_dsa_44.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c) - target_compile_options(ml_dsa_44_ref PUBLIC -DDILITHIUM_MODE=2) - target_include_directories(ml_dsa_44_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref) - target_include_directories(ml_dsa_44_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_44_ref PUBLIC -DDILITHIUM_MODE=2) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_44_ipd) + add_library(ml_dsa_44_ipd_ref OBJECT sig_ml_dsa_44_ipd.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_44_ipd_ref PUBLIC -DDILITHIUM_MODE=2) + target_include_directories(ml_dsa_44_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_ref) + target_include_directories(ml_dsa_44_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_44_ipd_ref PUBLIC -DDILITHIUM_MODE=2) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() -if(OQS_ENABLE_SIG_ml_dsa_44_avx2) - add_library(ml_dsa_44_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c) - target_include_directories(ml_dsa_44_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2) - target_include_directories(ml_dsa_44_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_44_avx2 PRIVATE -mavx2 -mpopcnt) - target_compile_options(ml_dsa_44_avx2 PUBLIC -DDILITHIUM_MODE=2) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2) + add_library(ml_dsa_44_ipd_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_44_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-44-ipd_avx2) + target_include_directories(ml_dsa_44_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_44_ipd_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_44_ipd_avx2 PUBLIC -DDILITHIUM_MODE=2) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() -if(OQS_ENABLE_SIG_ml_dsa_65) - add_library(ml_dsa_65_ref OBJECT sig_ml_dsa_65.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c) - target_compile_options(ml_dsa_65_ref PUBLIC -DDILITHIUM_MODE=3) - target_include_directories(ml_dsa_65_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref) - target_include_directories(ml_dsa_65_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_65_ref PUBLIC -DDILITHIUM_MODE=3) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_65_ipd) + add_library(ml_dsa_65_ipd_ref OBJECT sig_ml_dsa_65_ipd.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_65_ipd_ref PUBLIC -DDILITHIUM_MODE=3) + target_include_directories(ml_dsa_65_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_ref) + target_include_directories(ml_dsa_65_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_65_ipd_ref PUBLIC -DDILITHIUM_MODE=3) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() -if(OQS_ENABLE_SIG_ml_dsa_65_avx2) - add_library(ml_dsa_65_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c) - target_include_directories(ml_dsa_65_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2) - target_include_directories(ml_dsa_65_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_65_avx2 PRIVATE -mavx2 -mpopcnt) - target_compile_options(ml_dsa_65_avx2 PUBLIC -DDILITHIUM_MODE=3) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2) + add_library(ml_dsa_65_ipd_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_65_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-65-ipd_avx2) + target_include_directories(ml_dsa_65_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_65_ipd_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_65_ipd_avx2 PUBLIC -DDILITHIUM_MODE=3) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() -if(OQS_ENABLE_SIG_ml_dsa_87) - add_library(ml_dsa_87_ref OBJECT sig_ml_dsa_87.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c) - target_compile_options(ml_dsa_87_ref PUBLIC -DDILITHIUM_MODE=5) - target_include_directories(ml_dsa_87_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref) - target_include_directories(ml_dsa_87_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_87_ref PUBLIC -DDILITHIUM_MODE=5) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_87_ipd) + add_library(ml_dsa_87_ipd_ref OBJECT sig_ml_dsa_87_ipd.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/ntt.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/reduce.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref/symmetric-shake.c) + target_compile_options(ml_dsa_87_ipd_ref PUBLIC -DDILITHIUM_MODE=5) + target_include_directories(ml_dsa_87_ipd_ref PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_ref) + target_include_directories(ml_dsa_87_ipd_ref PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_87_ipd_ref PUBLIC -DDILITHIUM_MODE=5) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() -if(OQS_ENABLE_SIG_ml_dsa_87_avx2) - add_library(ml_dsa_87_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c) - target_include_directories(ml_dsa_87_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2) - target_include_directories(ml_dsa_87_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) - target_compile_options(ml_dsa_87_avx2 PRIVATE -mavx2 -mpopcnt) - target_compile_options(ml_dsa_87_avx2 PUBLIC -DDILITHIUM_MODE=5) - set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) +if(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2) + add_library(ml_dsa_87_ipd_avx2 OBJECT pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/consts.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/invntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/ntt.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/packing.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/pointwise.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/poly.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/polyvec.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rejsample.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/rounding.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/shuffle.S pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/sign.c pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2/symmetric-shake.c) + target_include_directories(ml_dsa_87_ipd_avx2 PRIVATE ${CMAKE_CURRENT_LIST_DIR}/pqcrystals-dilithium-standard_ml-dsa-87-ipd_avx2) + target_include_directories(ml_dsa_87_ipd_avx2 PRIVATE ${PROJECT_SOURCE_DIR}/src/common/pqclean_shims) + target_compile_options(ml_dsa_87_ipd_avx2 PRIVATE -mavx2 -mpopcnt) + target_compile_options(ml_dsa_87_ipd_avx2 PUBLIC -DDILITHIUM_MODE=5) + set(_ML_DSA_OBJS ${_ML_DSA_OBJS} $) endif() set(ML_DSA_OBJS ${_ML_DSA_OBJS} PARENT_SCOPE) diff --git a/src/sig/ml_dsa/sig_ml_dsa.h b/src/sig/ml_dsa/sig_ml_dsa.h index 5f2ee9c50..be69ee5d6 100644 --- a/src/sig/ml_dsa/sig_ml_dsa.h +++ b/src/sig/ml_dsa/sig_ml_dsa.h @@ -5,37 +5,37 @@ #include -#ifdef OQS_ENABLE_SIG_ml_dsa_44 -#define OQS_SIG_ml_dsa_44_length_public_key 1312 -#define OQS_SIG_ml_dsa_44_length_secret_key 2560 -#define OQS_SIG_ml_dsa_44_length_signature 2420 - -OQS_SIG *OQS_SIG_ml_dsa_44_new(void); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd +#define OQS_SIG_ml_dsa_44_ipd_length_public_key 1312 +#define OQS_SIG_ml_dsa_44_ipd_length_secret_key 2560 +#define OQS_SIG_ml_dsa_44_ipd_length_signature 2420 + +OQS_SIG *OQS_SIG_ml_dsa_44_ipd_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_ml_dsa_65 -#define OQS_SIG_ml_dsa_65_length_public_key 1952 -#define OQS_SIG_ml_dsa_65_length_secret_key 4032 -#define OQS_SIG_ml_dsa_65_length_signature 3309 +#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd +#define OQS_SIG_ml_dsa_65_ipd_length_public_key 1952 +#define OQS_SIG_ml_dsa_65_ipd_length_secret_key 4032 +#define OQS_SIG_ml_dsa_65_ipd_length_signature 3309 -OQS_SIG *OQS_SIG_ml_dsa_65_new(void); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +OQS_SIG *OQS_SIG_ml_dsa_65_ipd_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_ml_dsa_87 -#define OQS_SIG_ml_dsa_87_length_public_key 2592 -#define OQS_SIG_ml_dsa_87_length_secret_key 4896 -#define OQS_SIG_ml_dsa_87_length_signature 4627 +#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd +#define OQS_SIG_ml_dsa_87_ipd_length_public_key 2592 +#define OQS_SIG_ml_dsa_87_ipd_length_secret_key 4896 +#define OQS_SIG_ml_dsa_87_ipd_length_signature 4627 -OQS_SIG *OQS_SIG_ml_dsa_87_new(void); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +OQS_SIG *OQS_SIG_ml_dsa_87_ipd_new(void); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif #endif diff --git a/src/sig/ml_dsa/sig_ml_dsa_44.c b/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c similarity index 71% rename from src/sig/ml_dsa/sig_ml_dsa_44.c rename to src/sig/ml_dsa/sig_ml_dsa_44_ipd.c index 79421a1f8..7a45eb12f 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_44.c +++ b/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c @@ -4,27 +4,27 @@ #include -#if defined(OQS_ENABLE_SIG_ml_dsa_44) +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd) -OQS_SIG *OQS_SIG_ml_dsa_44_new(void) { +OQS_SIG *OQS_SIG_ml_dsa_44_ipd_new(void) { OQS_SIG *sig = malloc(sizeof(OQS_SIG)); if (sig == NULL) { return NULL; } - sig->method_name = OQS_SIG_alg_ml_dsa_44; + sig->method_name = OQS_SIG_alg_ml_dsa_44_ipd; sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; sig->claimed_nist_level = 2; sig->euf_cma = true; - sig->length_public_key = OQS_SIG_ml_dsa_44_length_public_key; - sig->length_secret_key = OQS_SIG_ml_dsa_44_length_secret_key; - sig->length_signature = OQS_SIG_ml_dsa_44_length_signature; + sig->length_public_key = OQS_SIG_ml_dsa_44_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_44_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_44_ipd_length_signature; - sig->keypair = OQS_SIG_ml_dsa_44_keypair; - sig->sign = OQS_SIG_ml_dsa_44_sign; - sig->verify = OQS_SIG_ml_dsa_44_verify; + sig->keypair = OQS_SIG_ml_dsa_44_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_44_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_44_ipd_verify; return sig; } @@ -33,14 +33,14 @@ extern int pqcrystals_ml_dsa_44_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); -#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2) extern int pqcrystals_ml_dsa_44_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -55,8 +55,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_keypair(uint8_t *public_key, uint8_t *secre #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -71,8 +71,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_sign(uint8_t *signature, size_t *signature_ #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_44_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/sig/ml_dsa/sig_ml_dsa_65.c b/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c similarity index 71% rename from src/sig/ml_dsa/sig_ml_dsa_65.c rename to src/sig/ml_dsa/sig_ml_dsa_65_ipd.c index 9f2854560..d6892e51a 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_65.c +++ b/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c @@ -4,27 +4,27 @@ #include -#if defined(OQS_ENABLE_SIG_ml_dsa_65) +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd) -OQS_SIG *OQS_SIG_ml_dsa_65_new(void) { +OQS_SIG *OQS_SIG_ml_dsa_65_ipd_new(void) { OQS_SIG *sig = malloc(sizeof(OQS_SIG)); if (sig == NULL) { return NULL; } - sig->method_name = OQS_SIG_alg_ml_dsa_65; + sig->method_name = OQS_SIG_alg_ml_dsa_65_ipd; sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; sig->claimed_nist_level = 3; sig->euf_cma = true; - sig->length_public_key = OQS_SIG_ml_dsa_65_length_public_key; - sig->length_secret_key = OQS_SIG_ml_dsa_65_length_secret_key; - sig->length_signature = OQS_SIG_ml_dsa_65_length_signature; + sig->length_public_key = OQS_SIG_ml_dsa_65_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_65_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_65_ipd_length_signature; - sig->keypair = OQS_SIG_ml_dsa_65_keypair; - sig->sign = OQS_SIG_ml_dsa_65_sign; - sig->verify = OQS_SIG_ml_dsa_65_verify; + sig->keypair = OQS_SIG_ml_dsa_65_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_65_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_65_ipd_verify; return sig; } @@ -33,14 +33,14 @@ extern int pqcrystals_ml_dsa_65_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); -#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2) extern int pqcrystals_ml_dsa_65_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -55,8 +55,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_keypair(uint8_t *public_key, uint8_t *secre #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -71,8 +71,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_sign(uint8_t *signature, size_t *signature_ #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_65_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/sig/ml_dsa/sig_ml_dsa_87.c b/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c similarity index 71% rename from src/sig/ml_dsa/sig_ml_dsa_87.c rename to src/sig/ml_dsa/sig_ml_dsa_87_ipd.c index e1b5a32a5..54cd81941 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_87.c +++ b/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c @@ -4,27 +4,27 @@ #include -#if defined(OQS_ENABLE_SIG_ml_dsa_87) +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd) -OQS_SIG *OQS_SIG_ml_dsa_87_new(void) { +OQS_SIG *OQS_SIG_ml_dsa_87_ipd_new(void) { OQS_SIG *sig = malloc(sizeof(OQS_SIG)); if (sig == NULL) { return NULL; } - sig->method_name = OQS_SIG_alg_ml_dsa_87; + sig->method_name = OQS_SIG_alg_ml_dsa_87_ipd; sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; sig->claimed_nist_level = 5; sig->euf_cma = true; - sig->length_public_key = OQS_SIG_ml_dsa_87_length_public_key; - sig->length_secret_key = OQS_SIG_ml_dsa_87_length_secret_key; - sig->length_signature = OQS_SIG_ml_dsa_87_length_signature; + sig->length_public_key = OQS_SIG_ml_dsa_87_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_87_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_87_ipd_length_signature; - sig->keypair = OQS_SIG_ml_dsa_87_keypair; - sig->sign = OQS_SIG_ml_dsa_87_sign; - sig->verify = OQS_SIG_ml_dsa_87_verify; + sig->keypair = OQS_SIG_ml_dsa_87_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_87_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_87_ipd_verify; return sig; } @@ -33,14 +33,14 @@ extern int pqcrystals_ml_dsa_87_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); -#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2) extern int pqcrystals_ml_dsa_87_ipd_avx2_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); #endif -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_keypair(uint8_t *public_key, uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -55,8 +55,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_keypair(uint8_t *public_key, uint8_t *secre #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ @@ -71,8 +71,8 @@ OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_sign(uint8_t *signature, size_t *signature_ #endif } -OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { -#if defined(OQS_ENABLE_SIG_ml_dsa_87_avx2) +OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) { +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2) #if defined(OQS_DIST_BUILD) if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2) && OQS_CPU_has_extension(OQS_CPU_EXT_POPCNT)) { #endif /* OQS_DIST_BUILD */ diff --git a/src/sig/sig.c b/src/sig/sig.c index a2283bf4c..3604823b3 100644 --- a/src/sig/sig.c +++ b/src/sig/sig.c @@ -18,9 +18,9 @@ OQS_API const char *OQS_SIG_alg_identifier(size_t i) { OQS_SIG_alg_dilithium_2, OQS_SIG_alg_dilithium_3, OQS_SIG_alg_dilithium_5, - OQS_SIG_alg_ml_dsa_44, - OQS_SIG_alg_ml_dsa_65, - OQS_SIG_alg_ml_dsa_87, + OQS_SIG_alg_ml_dsa_44_ipd, + OQS_SIG_alg_ml_dsa_65_ipd, + OQS_SIG_alg_ml_dsa_87_ipd, OQS_SIG_alg_falcon_512, OQS_SIG_alg_falcon_1024, OQS_SIG_alg_sphincs_sha2_128f_simple, @@ -72,20 +72,20 @@ OQS_API int OQS_SIG_alg_is_enabled(const char *method_name) { #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_44 + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd return 1; #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_65 + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd return 1; #else return 0; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_87 + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd return 1; #else return 0; @@ -204,21 +204,21 @@ OQS_API OQS_SIG *OQS_SIG_new(const char *method_name) { #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_44 - return OQS_SIG_ml_dsa_44_new(); + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd + return OQS_SIG_ml_dsa_44_ipd_new(); #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_65 - return OQS_SIG_ml_dsa_65_new(); + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd + return OQS_SIG_ml_dsa_65_ipd_new(); #else return NULL; #endif - } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { -#ifdef OQS_ENABLE_SIG_ml_dsa_87 - return OQS_SIG_ml_dsa_87_new(); + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd + return OQS_SIG_ml_dsa_87_ipd_new(); #else return NULL; #endif diff --git a/src/sig/sig.h b/src/sig/sig.h index 4d65a4698..438bf4dd1 100644 --- a/src/sig/sig.h +++ b/src/sig/sig.h @@ -39,11 +39,11 @@ extern "C" { /** Algorithm identifier for Dilithium5 */ #define OQS_SIG_alg_dilithium_5 "Dilithium5" /** Algorithm identifier for ML-DSA-44-ipd */ -#define OQS_SIG_alg_ml_dsa_44 "ML-DSA-44-ipd" +#define OQS_SIG_alg_ml_dsa_44_ipd "ML-DSA-44-ipd" /** Algorithm identifier for ML-DSA-65-ipd */ -#define OQS_SIG_alg_ml_dsa_65 "ML-DSA-65-ipd" +#define OQS_SIG_alg_ml_dsa_65_ipd "ML-DSA-65-ipd" /** Algorithm identifier for ML-DSA-87-ipd */ -#define OQS_SIG_alg_ml_dsa_87 "ML-DSA-87-ipd" +#define OQS_SIG_alg_ml_dsa_87_ipd "ML-DSA-87-ipd" /** Algorithm identifier for Falcon-512 */ #define OQS_SIG_alg_falcon_512 "Falcon-512" /** Algorithm identifier for Falcon-1024 */ diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index 49b7db504..da99cc639 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -69,9 +69,9 @@ static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { /* HQC-specific functions */ static inline bool is_ml_kem(const char *method_name) { - return (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512)) - || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_768)) - || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024)); + return (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)); } static void MLKEM_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { diff --git a/tests/vectors_sig.c b/tests/vectors_sig.c index fcbd6a582..6b1e64679 100644 --- a/tests/vectors_sig.c +++ b/tests/vectors_sig.c @@ -60,9 +60,9 @@ static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { /* HQC-specific functions */ static inline bool is_ml_dsa(const char *method_name) { - return (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_44)) - || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_65)) - || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_87)); + return (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) + || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) + || (0 == strcmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)); } static void MLDSA_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { From 4f5d468692c60c04e08d112955438cf39cbece2e Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 30 Jan 2024 00:08:08 +0100 Subject: [PATCH 21/27] enable alias for KEMS & enable ML-KEM (non-ipd-alias) --- .CMake/alg_support.cmake | 3 + docs/algorithms/kem/ml_kem.yml | 3 + .../add_enable_by_alg.fragment | 3 + .../copy_from_upstream/copy_from_upstream.py | 4 +- .../copy_from_upstream/copy_from_upstream.yml | 6 ++ .../src/kem/family/kem_family.h | 12 ++- .../src/kem/family/kem_scheme.c | 28 +++++++ .../src/kem/kem.c/alg_identifier.fragment | 6 +- .../src/kem/kem.c/enabled_case.fragment | 11 ++- .../src/kem/kem.c/new_case.fragment | 11 ++- .../src/kem/kem.h/alg_identifier.fragment | 7 +- .../src/kem/kem.h/algs_length.fragment | 3 +- .../add_alg_enable_defines.fragment | 3 + .../classic_mceliece/kem_classic_mceliece.h | 20 ++--- src/kem/hqc/kem_hqc.h | 6 +- src/kem/kem.c | 83 +++++++++++++++++++ src/kem/kem.h | 9 +- src/kem/kyber/kem_kyber.h | 6 +- src/kem/ml_kem/kem_ml_kem.h | 33 +++++++- src/kem/ml_kem/kem_ml_kem_1024_ipd.c | 25 ++++++ src/kem/ml_kem/kem_ml_kem_512_ipd.c | 25 ++++++ src/kem/ml_kem/kem_ml_kem_768_ipd.c | 25 ++++++ src/oqsconfig.h.cmake | 3 + tests/KATs/kem/kats.json | 9 ++ tests/test_alg_info.py | 2 +- tests/test_vectors.py | 2 +- tests/test_vectors.sh | 6 +- tests/vectors_kem.c | 5 +- 28 files changed, 326 insertions(+), 33 deletions(-) diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index 628f2d4ce..a7d7f396f 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -234,6 +234,7 @@ endif() option(OQS_ENABLE_KEM_ML_KEM "Enable ml_kem algorithm family" ON) cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_512_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_512_ipd" OFF) @@ -241,6 +242,7 @@ endif() endif() cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_768_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_768_ipd" OFF) @@ -248,6 +250,7 @@ endif() endif() cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_ipd "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024 "" ON "OQS_ENABLE_KEM_ML_KEM" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_BMI2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2 "" ON "OQS_ENABLE_KEM_ml_kem_1024_ipd" OFF) diff --git a/docs/algorithms/kem/ml_kem.yml b/docs/algorithms/kem/ml_kem.yml index 405270749..38b0a3ef2 100644 --- a/docs/algorithms/kem/ml_kem.yml +++ b/docs/algorithms/kem/ml_kem.yml @@ -22,6 +22,7 @@ primary-upstream: spdx-license-identifier: CC0-1.0 or Apache-2.0 parameter-sets: - name: ML-KEM-512-ipd + alias: ML-KEM-512 claimed-nist-level: 1 claimed-security: IND-CCA2 length-public-key: 800 @@ -55,6 +56,7 @@ parameter-sets: no-secret-dependent-branching-checked-by-valgrind: true large-stack-usage: false - name: ML-KEM-768-ipd + alias: ML-KEM-768 claimed-nist-level: 3 claimed-security: IND-CCA2 length-public-key: 1184 @@ -88,6 +90,7 @@ parameter-sets: no-secret-dependent-branching-checked-by-valgrind: true large-stack-usage: false - name: ML-KEM-1024-ipd + alias: ML-KEM-1024 claimed-nist-level: 5 claimed-security: IND-CCA2 length-public-key: 1568 diff --git a/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment b/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment index b600b1e51..f5054b061 100644 --- a/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment +++ b/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment @@ -2,6 +2,9 @@ option(OQS_ENABLE_KEM_{{ family['name']|upper }} "Enable {{ family['name'] }} algorithm family" ON) {%- for scheme in family['schemes'] %} cmake_dependent_option(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_KEM_{{ family['name']|upper }}" OFF) +{%- if 'alias_scheme' in scheme %} +cmake_dependent_option(OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['alias_scheme'] }} "" ON "OQS_ENABLE_KEM_{{ family['name']|upper }}" OFF) +{%- endif -%} {%- for impl in scheme['metadata']['implementations'] if impl['name'] != family['default_implementation'] and impl['supported_platforms'] -%} {%- for platform in impl['supported_platforms'] if platform['architecture'] == 'x86_64' %} {% if platform['operating_systems'] %}if(CMAKE_SYSTEM_NAME MATCHES "{{ platform['operating_systems']|join('|') }}") diff --git a/scripts/copy_from_upstream/copy_from_upstream.py b/scripts/copy_from_upstream/copy_from_upstream.py index 1f3cdc4be..b38f9c3b2 100755 --- a/scripts/copy_from_upstream/copy_from_upstream.py +++ b/scripts/copy_from_upstream/copy_from_upstream.py @@ -549,7 +549,9 @@ def process_families(instructions, basedir, with_kat, with_generator): except KeyError: # new key print("Adding new KAT for %s" % (scheme['pretty_name_full'])) pass - kats['kem'][scheme['pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] + kats['kem'][scheme['pretty_name_full']] = scheme['metadata']['nistkat-sha256'] + if 'alias_pretty_name_full' in scheme: + kats['kem'][scheme['alias_pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] else: try: if kats['sig'][scheme['pretty_name_full']]['single'] != scheme['metadata']['nistkat-sha256']: diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index 21503f4f8..6d4b5ca8a 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -146,14 +146,20 @@ kems: scheme: "512_ipd" pqclean_scheme: ml-kem-512-ipd pretty_name_full: ML-KEM-512-ipd + alias_scheme: "512" + alias_pretty_name_full: ML-KEM-512 - scheme: "768_ipd" pqclean_scheme: ml-kem-768-ipd pretty_name_full: ML-KEM-768-ipd + alias_scheme: "768" + alias_pretty_name_full: ML-KEM-768 - scheme: "1024_ipd" pqclean_scheme: ml-kem-1024-ipd pretty_name_full: ML-KEM-1024-ipd + alias_scheme: "1024" + alias_pretty_name_full: ML-KEM-1024 sigs: - name: dilithium diff --git a/scripts/copy_from_upstream/src/kem/family/kem_family.h b/scripts/copy_from_upstream/src/kem/family/kem_family.h index f1e4ab4c4..caa7cd747 100644 --- a/scripts/copy_from_upstream/src/kem/family/kem_family.h +++ b/scripts/copy_from_upstream/src/kem/family/kem_family.h @@ -6,7 +6,7 @@ #include {% for scheme in schemes -%} -#ifdef OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }} +#if defined(OQS_ENABLE_KEM_{{ family }}_{{ scheme['scheme'] }}) {%- if 'alias_scheme' in scheme %} || defined(OQS_ENABLE_KEM_{{ family }}_{{ scheme['alias_scheme'] }}){%- endif %} #define OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_public_key {{ scheme['metadata']['length-public-key'] }} #define OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_secret_key {{ scheme['metadata']['length-secret-key'] }} #define OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_ciphertext {{ scheme['metadata']['length-ciphertext'] }} @@ -15,6 +15,16 @@ OQS_KEM *OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_new(void); OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); OQS_API OQS_STATUS OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); +{% if 'alias_scheme' in scheme %} +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_public_key OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_public_key +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_secret_key OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_secret_key +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_ciphertext OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_ciphertext +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_shared_secret OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_length_shared_secret +OQS_KEM *OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_new(void); +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_keypair OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_keypair +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_encaps OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_encaps +#define OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_decaps OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_decaps +{% endif -%} #endif {% endfor -%} diff --git a/scripts/copy_from_upstream/src/kem/family/kem_scheme.c b/scripts/copy_from_upstream/src/kem/family/kem_scheme.c index 027a88e76..058d829e8 100644 --- a/scripts/copy_from_upstream/src/kem/family/kem_scheme.c +++ b/scripts/copy_from_upstream/src/kem/family/kem_scheme.c @@ -31,6 +31,34 @@ OQS_KEM *OQS_KEM_{{ family }}_{{ scheme['scheme'] }}_new(void) { return kem; } +{%- if 'alias_scheme' in scheme %} + +/** Alias */ +OQS_KEM *OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_{{ family }}_{{ scheme['alias_scheme'] }}; + kem->alg_version = "{{ scheme['metadata']['implementations'][0]['version'] }}"; + + kem->claimed_nist_level = {{ scheme['metadata']['claimed-nist-level'] }}; + kem->ind_cca = {{ scheme['metadata']['ind_cca'] }}; + + kem->length_public_key = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_public_key; + kem->length_secret_key = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_secret_key; + kem->length_ciphertext = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_ciphertext; + kem->length_shared_secret = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_length_shared_secret; + + kem->keypair = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_keypair; + kem->encaps = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_encaps; + kem->decaps = OQS_KEM_{{ family }}_{{ scheme['alias_scheme'] }}_decaps; + + return kem; +} +{%- endif -%} + {%- for impl in scheme['metadata']['implementations'] if impl['name'] == scheme['default_implementation'] %} {%- if impl['signature_keypair'] %} diff --git a/scripts/copy_from_upstream/src/kem/kem.c/alg_identifier.fragment b/scripts/copy_from_upstream/src/kem/kem.c/alg_identifier.fragment index b11c40468..c6729cb65 100644 --- a/scripts/copy_from_upstream/src/kem/kem.c/alg_identifier.fragment +++ b/scripts/copy_from_upstream/src/kem/kem.c/alg_identifier.fragment @@ -1,3 +1,7 @@ {% for family in instructions['kems'] %}{% for scheme in family['schemes'] %} - OQS_KEM_alg_{{ family['name'] }}_{{ scheme['scheme'] }},{% endfor %}{% endfor %} + OQS_KEM_alg_{{ family['name'] }}_{{ scheme['scheme'] }}, +{%- if 'alias_scheme' in scheme %} + OQS_KEM_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }}, +{%- endif -%} +{% endfor %}{% endfor %} \ No newline at end of file diff --git a/scripts/copy_from_upstream/src/kem/kem.c/enabled_case.fragment b/scripts/copy_from_upstream/src/kem/kem.c/enabled_case.fragment index da1ff1d88..ba58364ee 100644 --- a/scripts/copy_from_upstream/src/kem/kem.c/enabled_case.fragment +++ b/scripts/copy_from_upstream/src/kem/kem.c/enabled_case.fragment @@ -4,5 +4,14 @@ return 1; #else return 0; -#endif{% endfor %}{% endfor %} +#endif +{% if 'alias_scheme' in scheme %} + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }})) { +#ifdef OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['alias_scheme'] }} + return 1; +#else + return 0; +#endif +{% endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/kem/kem.c/new_case.fragment b/scripts/copy_from_upstream/src/kem/kem.c/new_case.fragment index af0b40b04..63db6d636 100644 --- a/scripts/copy_from_upstream/src/kem/kem.c/new_case.fragment +++ b/scripts/copy_from_upstream/src/kem/kem.c/new_case.fragment @@ -4,5 +4,14 @@ return OQS_KEM_{{ family['name'] }}_{{ scheme['scheme'] }}_new(); #else return NULL; -#endif{% endfor %}{% endfor %} +#endif +{% if 'alias_scheme' in scheme %} + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }})) { +#ifdef OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['alias_scheme'] }} + return OQS_KEM_{{ family['name'] }}_{{ scheme['alias_scheme'] }}_new(); +#else + return NULL; +#endif +{% endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/kem/kem.h/alg_identifier.fragment b/scripts/copy_from_upstream/src/kem/kem.h/alg_identifier.fragment index 635a7d662..e3166e7cc 100644 --- a/scripts/copy_from_upstream/src/kem/kem.h/alg_identifier.fragment +++ b/scripts/copy_from_upstream/src/kem/kem.h/alg_identifier.fragment @@ -1,4 +1,9 @@ {% for family in instructions['kems'] %}{% for scheme in family['schemes'] %} /** Algorithm identifier for {{ scheme['pretty_name_full'] }} KEM. */ -#define OQS_KEM_alg_{{ family['name'] }}_{{ scheme['scheme'] }} "{{ scheme['pretty_name_full'] }}"{% endfor %}{% endfor %} +#define OQS_KEM_alg_{{ family['name'] }}_{{ scheme['scheme'] }} "{{ scheme['pretty_name_full'] }}" +{%- if 'alias_scheme' in scheme %} +/** Algorithm identifier for {{ scheme['alias_pretty_name_full'] }} KEM. */ +#define OQS_KEM_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }} "{{ scheme['alias_pretty_name_full'] }}" +{%- endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/kem/kem.h/algs_length.fragment b/scripts/copy_from_upstream/src/kem/kem.h/algs_length.fragment index e86a2a0fa..79e87d08b 100644 --- a/scripts/copy_from_upstream/src/kem/kem.h/algs_length.fragment +++ b/scripts/copy_from_upstream/src/kem/kem.h/algs_length.fragment @@ -1,4 +1,5 @@ {% set unary %}{% for family in instructions['kems'] %}{% for scheme in family['schemes'] %}1{% endfor %}{% endfor %}{% endset %} +{% set unary_alias %}{% for family in instructions['kems'] %}{% for scheme in family['schemes'] if 'alias_scheme' in scheme %}2{% endfor %}{% endfor %}{% endset %} /** Number of algorithm identifiers above. */ -#define OQS_KEM_algs_length {{ unary|length + non_upstream_kems }} +#define OQS_KEM_algs_length {{ unary|length + unary_alias|length + non_upstream_kems }} diff --git a/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment b/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment index 82d5d9b8d..3f1e04eae 100644 --- a/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment +++ b/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment @@ -3,6 +3,9 @@ #cmakedefine OQS_ENABLE_KEM_{{ family['name']|upper }} 1 {%- for scheme in family['schemes'] %} #cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }} 1 +{%- if 'alias_scheme' in scheme %} +#cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['alias_scheme'] }} 1 +{%- endif -%} {%- for impl in scheme['metadata']['implementations'] if impl['name'] != family['default_implementation'] %} #cmakedefine OQS_ENABLE_KEM_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} 1 {%- endfor -%} diff --git a/src/kem/classic_mceliece/kem_classic_mceliece.h b/src/kem/classic_mceliece/kem_classic_mceliece.h index 766b751c5..2bbd96982 100644 --- a/src/kem/classic_mceliece/kem_classic_mceliece.h +++ b/src/kem/classic_mceliece/kem_classic_mceliece.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_KEM_classic_mceliece_348864 +#if defined(OQS_ENABLE_KEM_classic_mceliece_348864) #define OQS_KEM_classic_mceliece_348864_length_public_key 261120 #define OQS_KEM_classic_mceliece_348864_length_secret_key 6492 #define OQS_KEM_classic_mceliece_348864_length_ciphertext 96 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_348864_encaps(uint8_t *ciphertext, u OQS_API OQS_STATUS OQS_KEM_classic_mceliece_348864_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_348864f +#if defined(OQS_ENABLE_KEM_classic_mceliece_348864f) #define OQS_KEM_classic_mceliece_348864f_length_public_key 261120 #define OQS_KEM_classic_mceliece_348864f_length_secret_key 6492 #define OQS_KEM_classic_mceliece_348864f_length_ciphertext 96 @@ -27,7 +27,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_348864f_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_348864f_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_460896 +#if defined(OQS_ENABLE_KEM_classic_mceliece_460896) #define OQS_KEM_classic_mceliece_460896_length_public_key 524160 #define OQS_KEM_classic_mceliece_460896_length_secret_key 13608 #define OQS_KEM_classic_mceliece_460896_length_ciphertext 156 @@ -38,7 +38,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_460896_encaps(uint8_t *ciphertext, u OQS_API OQS_STATUS OQS_KEM_classic_mceliece_460896_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_460896f +#if defined(OQS_ENABLE_KEM_classic_mceliece_460896f) #define OQS_KEM_classic_mceliece_460896f_length_public_key 524160 #define OQS_KEM_classic_mceliece_460896f_length_secret_key 13608 #define OQS_KEM_classic_mceliece_460896f_length_ciphertext 156 @@ -49,7 +49,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_460896f_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_460896f_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128 +#if defined(OQS_ENABLE_KEM_classic_mceliece_6688128) #define OQS_KEM_classic_mceliece_6688128_length_public_key 1044992 #define OQS_KEM_classic_mceliece_6688128_length_secret_key 13932 #define OQS_KEM_classic_mceliece_6688128_length_ciphertext 208 @@ -60,7 +60,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6688128_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6688128_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_6688128f +#if defined(OQS_ENABLE_KEM_classic_mceliece_6688128f) #define OQS_KEM_classic_mceliece_6688128f_length_public_key 1044992 #define OQS_KEM_classic_mceliece_6688128f_length_secret_key 13932 #define OQS_KEM_classic_mceliece_6688128f_length_ciphertext 208 @@ -71,7 +71,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6688128f_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6688128f_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119 +#if defined(OQS_ENABLE_KEM_classic_mceliece_6960119) #define OQS_KEM_classic_mceliece_6960119_length_public_key 1047319 #define OQS_KEM_classic_mceliece_6960119_length_secret_key 13948 #define OQS_KEM_classic_mceliece_6960119_length_ciphertext 194 @@ -82,7 +82,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6960119_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6960119_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_6960119f +#if defined(OQS_ENABLE_KEM_classic_mceliece_6960119f) #define OQS_KEM_classic_mceliece_6960119f_length_public_key 1047319 #define OQS_KEM_classic_mceliece_6960119f_length_secret_key 13948 #define OQS_KEM_classic_mceliece_6960119f_length_ciphertext 194 @@ -93,7 +93,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6960119f_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_6960119f_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128 +#if defined(OQS_ENABLE_KEM_classic_mceliece_8192128) #define OQS_KEM_classic_mceliece_8192128_length_public_key 1357824 #define OQS_KEM_classic_mceliece_8192128_length_secret_key 14120 #define OQS_KEM_classic_mceliece_8192128_length_ciphertext 208 @@ -104,7 +104,7 @@ OQS_API OQS_STATUS OQS_KEM_classic_mceliece_8192128_encaps(uint8_t *ciphertext, OQS_API OQS_STATUS OQS_KEM_classic_mceliece_8192128_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_classic_mceliece_8192128f +#if defined(OQS_ENABLE_KEM_classic_mceliece_8192128f) #define OQS_KEM_classic_mceliece_8192128f_length_public_key 1357824 #define OQS_KEM_classic_mceliece_8192128f_length_secret_key 14120 #define OQS_KEM_classic_mceliece_8192128f_length_ciphertext 208 diff --git a/src/kem/hqc/kem_hqc.h b/src/kem/hqc/kem_hqc.h index 1df06e1c1..b1f022374 100644 --- a/src/kem/hqc/kem_hqc.h +++ b/src/kem/hqc/kem_hqc.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_KEM_hqc_128 +#if defined(OQS_ENABLE_KEM_hqc_128) #define OQS_KEM_hqc_128_length_public_key 2249 #define OQS_KEM_hqc_128_length_secret_key 2305 #define OQS_KEM_hqc_128_length_ciphertext 4433 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_KEM_hqc_128_encaps(uint8_t *ciphertext, uint8_t *shared_s OQS_API OQS_STATUS OQS_KEM_hqc_128_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_hqc_192 +#if defined(OQS_ENABLE_KEM_hqc_192) #define OQS_KEM_hqc_192_length_public_key 4522 #define OQS_KEM_hqc_192_length_secret_key 4586 #define OQS_KEM_hqc_192_length_ciphertext 8978 @@ -27,7 +27,7 @@ OQS_API OQS_STATUS OQS_KEM_hqc_192_encaps(uint8_t *ciphertext, uint8_t *shared_s OQS_API OQS_STATUS OQS_KEM_hqc_192_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_hqc_256 +#if defined(OQS_ENABLE_KEM_hqc_256) #define OQS_KEM_hqc_256_length_public_key 7245 #define OQS_KEM_hqc_256_length_secret_key 7317 #define OQS_KEM_hqc_256_length_ciphertext 14421 diff --git a/src/kem/kem.c b/src/kem/kem.c index 91c5c52c7..0a340e4f3 100644 --- a/src/kem/kem.c +++ b/src/kem/kem.c @@ -35,8 +35,11 @@ OQS_API const char *OQS_KEM_alg_identifier(size_t i) { OQS_KEM_alg_kyber_768, OQS_KEM_alg_kyber_1024, OQS_KEM_alg_ml_kem_512_ipd, + OQS_KEM_alg_ml_kem_512, OQS_KEM_alg_ml_kem_768_ipd, + OQS_KEM_alg_ml_kem_768, OQS_KEM_alg_ml_kem_1024_ipd, + OQS_KEM_alg_ml_kem_1024, ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END OQS_KEM_alg_ntruprime_sntrup761, OQS_KEM_alg_frodokem_640_aes, @@ -85,114 +88,154 @@ OQS_API int OQS_KEM_alg_is_enabled(const char *method_name) { #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_348864f return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_460896 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_460896f return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6688128 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6688128f return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6960119 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6960119f return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_8192128 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_8192128f return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_128)) { #ifdef OQS_ENABLE_KEM_hqc_128 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_192)) { #ifdef OQS_ENABLE_KEM_hqc_192 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_256)) { #ifdef OQS_ENABLE_KEM_hqc_256 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512)) { #ifdef OQS_ENABLE_KEM_kyber_512 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768)) { #ifdef OQS_ENABLE_KEM_kyber_768 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024)) { #ifdef OQS_ENABLE_KEM_kyber_1024 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_512_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512)) { +#ifdef OQS_ENABLE_KEM_ml_kem_512 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_768_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768)) { +#ifdef OQS_ENABLE_KEM_ml_kem_768 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024)) { +#ifdef OQS_ENABLE_KEM_ml_kem_1024 + return 1; +#else + return 0; +#endif + ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_END } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ntruprime_sntrup761)) { #ifdef OQS_ENABLE_KEM_ntruprime_sntrup761 @@ -271,114 +314,154 @@ OQS_API OQS_KEM *OQS_KEM_new(const char *method_name) { #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_348864f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_348864f return OQS_KEM_classic_mceliece_348864f_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_460896 return OQS_KEM_classic_mceliece_460896_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_460896f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_460896f return OQS_KEM_classic_mceliece_460896f_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6688128 return OQS_KEM_classic_mceliece_6688128_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6688128f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6688128f return OQS_KEM_classic_mceliece_6688128f_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6960119 return OQS_KEM_classic_mceliece_6960119_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_6960119f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_6960119f return OQS_KEM_classic_mceliece_6960119f_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_8192128 return OQS_KEM_classic_mceliece_8192128_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_classic_mceliece_8192128f)) { #ifdef OQS_ENABLE_KEM_classic_mceliece_8192128f return OQS_KEM_classic_mceliece_8192128f_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_128)) { #ifdef OQS_ENABLE_KEM_hqc_128 return OQS_KEM_hqc_128_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_192)) { #ifdef OQS_ENABLE_KEM_hqc_192 return OQS_KEM_hqc_192_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_hqc_256)) { #ifdef OQS_ENABLE_KEM_hqc_256 return OQS_KEM_hqc_256_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_512)) { #ifdef OQS_ENABLE_KEM_kyber_512 return OQS_KEM_kyber_512_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_768)) { #ifdef OQS_ENABLE_KEM_kyber_768 return OQS_KEM_kyber_768_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_kyber_1024)) { #ifdef OQS_ENABLE_KEM_kyber_1024 return OQS_KEM_kyber_1024_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_512_ipd return OQS_KEM_ml_kem_512_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_512)) { +#ifdef OQS_ENABLE_KEM_ml_kem_512 + return OQS_KEM_ml_kem_512_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_768_ipd return OQS_KEM_ml_kem_768_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_768)) { +#ifdef OQS_ENABLE_KEM_ml_kem_768 + return OQS_KEM_ml_kem_768_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)) { #ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd return OQS_KEM_ml_kem_1024_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ml_kem_1024)) { +#ifdef OQS_ENABLE_KEM_ml_kem_1024 + return OQS_KEM_ml_kem_1024_new(); +#else + return NULL; +#endif + ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_END } else if (0 == strcasecmp(method_name, OQS_KEM_alg_ntruprime_sntrup761)) { #ifdef OQS_ENABLE_KEM_ntruprime_sntrup761 diff --git a/src/kem/kem.h b/src/kem/kem.h index 8bac2cf26..0e579c047 100644 --- a/src/kem/kem.h +++ b/src/kem/kem.h @@ -72,10 +72,16 @@ extern "C" { #define OQS_KEM_alg_kyber_1024 "Kyber1024" /** Algorithm identifier for ML-KEM-512-ipd KEM. */ #define OQS_KEM_alg_ml_kem_512_ipd "ML-KEM-512-ipd" +/** Algorithm identifier for ML-KEM-512 KEM. */ +#define OQS_KEM_alg_ml_kem_512 "ML-KEM-512" /** Algorithm identifier for ML-KEM-768-ipd KEM. */ #define OQS_KEM_alg_ml_kem_768_ipd "ML-KEM-768-ipd" +/** Algorithm identifier for ML-KEM-768 KEM. */ +#define OQS_KEM_alg_ml_kem_768 "ML-KEM-768" /** Algorithm identifier for ML-KEM-1024-ipd KEM. */ #define OQS_KEM_alg_ml_kem_1024_ipd "ML-KEM-1024-ipd" +/** Algorithm identifier for ML-KEM-1024 KEM. */ +#define OQS_KEM_alg_ml_kem_1024 "ML-KEM-1024" ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END /** Algorithm identifier for sntrup761 KEM. */ #define OQS_KEM_alg_ntruprime_sntrup761 "sntrup761" @@ -93,8 +99,9 @@ extern "C" { #define OQS_KEM_alg_frodokem_1344_shake "FrodoKEM-1344-SHAKE" // EDIT-WHEN-ADDING-KEM ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_START + /** Number of algorithm identifiers above. */ -#define OQS_KEM_algs_length 29 +#define OQS_KEM_algs_length 32 ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_END /** diff --git a/src/kem/kyber/kem_kyber.h b/src/kem/kyber/kem_kyber.h index 5d2480848..cb475aff2 100644 --- a/src/kem/kyber/kem_kyber.h +++ b/src/kem/kyber/kem_kyber.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_KEM_kyber_512 +#if defined(OQS_ENABLE_KEM_kyber_512) #define OQS_KEM_kyber_512_length_public_key 800 #define OQS_KEM_kyber_512_length_secret_key 1632 #define OQS_KEM_kyber_512_length_ciphertext 768 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_KEM_kyber_512_encaps(uint8_t *ciphertext, uint8_t *shared OQS_API OQS_STATUS OQS_KEM_kyber_512_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_kyber_768 +#if defined(OQS_ENABLE_KEM_kyber_768) #define OQS_KEM_kyber_768_length_public_key 1184 #define OQS_KEM_kyber_768_length_secret_key 2400 #define OQS_KEM_kyber_768_length_ciphertext 1088 @@ -27,7 +27,7 @@ OQS_API OQS_STATUS OQS_KEM_kyber_768_encaps(uint8_t *ciphertext, uint8_t *shared OQS_API OQS_STATUS OQS_KEM_kyber_768_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); #endif -#ifdef OQS_ENABLE_KEM_kyber_1024 +#if defined(OQS_ENABLE_KEM_kyber_1024) #define OQS_KEM_kyber_1024_length_public_key 1568 #define OQS_KEM_kyber_1024_length_secret_key 3168 #define OQS_KEM_kyber_1024_length_ciphertext 1568 diff --git a/src/kem/ml_kem/kem_ml_kem.h b/src/kem/ml_kem/kem_ml_kem.h index cfe9d2f86..b3e3d99cf 100644 --- a/src/kem/ml_kem/kem_ml_kem.h +++ b/src/kem/ml_kem/kem_ml_kem.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_KEM_ml_kem_512_ipd +#if defined(OQS_ENABLE_KEM_ml_kem_512_ipd) || defined(OQS_ENABLE_KEM_ml_kem_512) #define OQS_KEM_ml_kem_512_ipd_length_public_key 800 #define OQS_KEM_ml_kem_512_ipd_length_secret_key 1632 #define OQS_KEM_ml_kem_512_ipd_length_ciphertext 768 @@ -14,9 +14,18 @@ OQS_KEM *OQS_KEM_ml_kem_512_ipd_new(void); OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_512_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); + +#define OQS_KEM_ml_kem_512_length_public_key OQS_KEM_ml_kem_512_ipd_length_public_key +#define OQS_KEM_ml_kem_512_length_secret_key OQS_KEM_ml_kem_512_ipd_length_secret_key +#define OQS_KEM_ml_kem_512_length_ciphertext OQS_KEM_ml_kem_512_ipd_length_ciphertext +#define OQS_KEM_ml_kem_512_length_shared_secret OQS_KEM_ml_kem_512_ipd_length_shared_secret +OQS_KEM *OQS_KEM_ml_kem_512_new(void); +#define OQS_KEM_ml_kem_512_keypair OQS_KEM_ml_kem_512_ipd_keypair +#define OQS_KEM_ml_kem_512_encaps OQS_KEM_ml_kem_512_ipd_encaps +#define OQS_KEM_ml_kem_512_decaps OQS_KEM_ml_kem_512_ipd_decaps #endif -#ifdef OQS_ENABLE_KEM_ml_kem_768_ipd +#if defined(OQS_ENABLE_KEM_ml_kem_768_ipd) || defined(OQS_ENABLE_KEM_ml_kem_768) #define OQS_KEM_ml_kem_768_ipd_length_public_key 1184 #define OQS_KEM_ml_kem_768_ipd_length_secret_key 2400 #define OQS_KEM_ml_kem_768_ipd_length_ciphertext 1088 @@ -25,9 +34,18 @@ OQS_KEM *OQS_KEM_ml_kem_768_ipd_new(void); OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_768_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); + +#define OQS_KEM_ml_kem_768_length_public_key OQS_KEM_ml_kem_768_ipd_length_public_key +#define OQS_KEM_ml_kem_768_length_secret_key OQS_KEM_ml_kem_768_ipd_length_secret_key +#define OQS_KEM_ml_kem_768_length_ciphertext OQS_KEM_ml_kem_768_ipd_length_ciphertext +#define OQS_KEM_ml_kem_768_length_shared_secret OQS_KEM_ml_kem_768_ipd_length_shared_secret +OQS_KEM *OQS_KEM_ml_kem_768_new(void); +#define OQS_KEM_ml_kem_768_keypair OQS_KEM_ml_kem_768_ipd_keypair +#define OQS_KEM_ml_kem_768_encaps OQS_KEM_ml_kem_768_ipd_encaps +#define OQS_KEM_ml_kem_768_decaps OQS_KEM_ml_kem_768_ipd_decaps #endif -#ifdef OQS_ENABLE_KEM_ml_kem_1024_ipd +#if defined(OQS_ENABLE_KEM_ml_kem_1024_ipd) || defined(OQS_ENABLE_KEM_ml_kem_1024) #define OQS_KEM_ml_kem_1024_ipd_length_public_key 1568 #define OQS_KEM_ml_kem_1024_ipd_length_secret_key 3168 #define OQS_KEM_ml_kem_1024_ipd_length_ciphertext 1568 @@ -36,6 +54,15 @@ OQS_KEM *OQS_KEM_ml_kem_1024_ipd_new(void); OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_encaps(uint8_t *ciphertext, uint8_t *shared_secret, const uint8_t *public_key); OQS_API OQS_STATUS OQS_KEM_ml_kem_1024_ipd_decaps(uint8_t *shared_secret, const uint8_t *ciphertext, const uint8_t *secret_key); + +#define OQS_KEM_ml_kem_1024_length_public_key OQS_KEM_ml_kem_1024_ipd_length_public_key +#define OQS_KEM_ml_kem_1024_length_secret_key OQS_KEM_ml_kem_1024_ipd_length_secret_key +#define OQS_KEM_ml_kem_1024_length_ciphertext OQS_KEM_ml_kem_1024_ipd_length_ciphertext +#define OQS_KEM_ml_kem_1024_length_shared_secret OQS_KEM_ml_kem_1024_ipd_length_shared_secret +OQS_KEM *OQS_KEM_ml_kem_1024_new(void); +#define OQS_KEM_ml_kem_1024_keypair OQS_KEM_ml_kem_1024_ipd_keypair +#define OQS_KEM_ml_kem_1024_encaps OQS_KEM_ml_kem_1024_ipd_encaps +#define OQS_KEM_ml_kem_1024_decaps OQS_KEM_ml_kem_1024_ipd_decaps #endif #endif diff --git a/src/kem/ml_kem/kem_ml_kem_1024_ipd.c b/src/kem/ml_kem/kem_ml_kem_1024_ipd.c index 8ac972eb7..182b3b32e 100644 --- a/src/kem/ml_kem/kem_ml_kem_1024_ipd.c +++ b/src/kem/ml_kem/kem_ml_kem_1024_ipd.c @@ -30,6 +30,31 @@ OQS_KEM *OQS_KEM_ml_kem_1024_ipd_new(void) { return kem; } +/** Alias */ +OQS_KEM *OQS_KEM_ml_kem_1024_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_1024; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 5; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_1024_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_1024_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_1024_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_1024_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_1024_keypair; + kem->encaps = OQS_KEM_ml_kem_1024_encaps; + kem->decaps = OQS_KEM_ml_kem_1024_decaps; + + return kem; +} + extern int pqcrystals_ml_kem_1024_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_1024_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_1024_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); diff --git a/src/kem/ml_kem/kem_ml_kem_512_ipd.c b/src/kem/ml_kem/kem_ml_kem_512_ipd.c index e08728a33..ea228dd86 100644 --- a/src/kem/ml_kem/kem_ml_kem_512_ipd.c +++ b/src/kem/ml_kem/kem_ml_kem_512_ipd.c @@ -30,6 +30,31 @@ OQS_KEM *OQS_KEM_ml_kem_512_ipd_new(void) { return kem; } +/** Alias */ +OQS_KEM *OQS_KEM_ml_kem_512_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_512; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 1; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_512_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_512_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_512_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_512_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_512_keypair; + kem->encaps = OQS_KEM_ml_kem_512_encaps; + kem->decaps = OQS_KEM_ml_kem_512_decaps; + + return kem; +} + extern int pqcrystals_ml_kem_512_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_512_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_512_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); diff --git a/src/kem/ml_kem/kem_ml_kem_768_ipd.c b/src/kem/ml_kem/kem_ml_kem_768_ipd.c index 9e44e0ff1..281f505fa 100644 --- a/src/kem/ml_kem/kem_ml_kem_768_ipd.c +++ b/src/kem/ml_kem/kem_ml_kem_768_ipd.c @@ -30,6 +30,31 @@ OQS_KEM *OQS_KEM_ml_kem_768_ipd_new(void) { return kem; } +/** Alias */ +OQS_KEM *OQS_KEM_ml_kem_768_new(void) { + + OQS_KEM *kem = malloc(sizeof(OQS_KEM)); + if (kem == NULL) { + return NULL; + } + kem->method_name = OQS_KEM_alg_ml_kem_768; + kem->alg_version = "https://github.com/pq-crystals/kyber/tree/standard"; + + kem->claimed_nist_level = 3; + kem->ind_cca = true; + + kem->length_public_key = OQS_KEM_ml_kem_768_length_public_key; + kem->length_secret_key = OQS_KEM_ml_kem_768_length_secret_key; + kem->length_ciphertext = OQS_KEM_ml_kem_768_length_ciphertext; + kem->length_shared_secret = OQS_KEM_ml_kem_768_length_shared_secret; + + kem->keypair = OQS_KEM_ml_kem_768_keypair; + kem->encaps = OQS_KEM_ml_kem_768_encaps; + kem->decaps = OQS_KEM_ml_kem_768_decaps; + + return kem; +} + extern int pqcrystals_ml_kem_768_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_kem_768_ipd_ref_enc(uint8_t *ct, uint8_t *ss, const uint8_t *pk); extern int pqcrystals_ml_kem_768_ipd_ref_dec(uint8_t *ss, const uint8_t *ct, const uint8_t *sk); diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index dd0218964..035938c1a 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -111,10 +111,13 @@ #cmakedefine OQS_ENABLE_KEM_ML_KEM 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_512_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_512 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_512_ipd_avx2 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_768_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_768 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_768_ipd_avx2 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_1024_ipd 1 +#cmakedefine OQS_ENABLE_KEM_ml_kem_1024 1 #cmakedefine OQS_ENABLE_KEM_ml_kem_1024_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_DILITHIUM 1 diff --git a/tests/KATs/kem/kats.json b/tests/KATs/kem/kats.json index 9652b5ada..3dffdb9d3 100644 --- a/tests/KATs/kem/kats.json +++ b/tests/KATs/kem/kats.json @@ -99,12 +99,21 @@ "all": "b3a12005fe1ce49f5df510aea6a56bfa4bdc2d3d706afb0361d70dc88188a2a6", "single": "89e82a5bf2d4ddb2c6444e10409e6d9ca65dafbca67d1a0db2c9b54920a29172" }, + "ML-KEM-1024": { + "single": "03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7" + }, "ML-KEM-1024-ipd": { "single": "03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7" }, + "ML-KEM-512": { + "single": "76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f" + }, "ML-KEM-512-ipd": { "single": "76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f" }, + "ML-KEM-768": { + "single": "c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310" + } "ML-KEM-768-ipd": { "single": "c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310" } diff --git a/tests/test_alg_info.py b/tests/test_alg_info.py index 09b57fe80..d7546b7fb 100644 --- a/tests/test_alg_info.py +++ b/tests/test_alg_info.py @@ -23,7 +23,7 @@ def test_alg_info_kem(kem_name): # find the parameter set in the datasheet foundit = False for parameter_set in datasheet['parameter-sets']: - if parameter_set['name'] == kem_name: + if parameter_set['name'] == kem_name or ('alias' in parameter_set and parameter_set['alias'] == kem_name): foundit = True # check that the values match assert(alg_info['claimed-nist-level'] == parameter_set['claimed-nist-level']) diff --git a/tests/test_vectors.py b/tests/test_vectors.py index 820b9a054..2e3cc14b8 100644 --- a/tests/test_vectors.py +++ b/tests/test_vectors.py @@ -10,7 +10,7 @@ @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not needed on Windows") @pytest.mark.parametrize('kem_name', helpers.available_kems_by_name()) def test_vectors_kem(kem_name): - if not(helpers.is_kem_enabled_by_name(kem_name)): pytest.skip('Not enabled') + if not(helpers.is_kem_enabled_by_name(kem_name)): pytest.skip('Not enabled' + kem_name) result = helpers.run_subprocess( ['tests/test_vectors.sh', kem_name], ) diff --git a/tests/test_vectors.sh b/tests/test_vectors.sh index 0261dbfc8..2a5fa8e4b 100755 --- a/tests/test_vectors.sh +++ b/tests/test_vectors.sh @@ -37,7 +37,7 @@ elif [ "$1" = "ML-DSA-87-ipd" ]; then exit 1 fi -elif [ "$1" = "ML-KEM-512-ipd" ]; then +elif [[ "$1" = "ML-KEM-512-ipd" || "$1" = "ML-KEM-512" ]]; then file=tests/PQC_Intermediate_Values/ML-KEM-512.txt scheme_name=ML-KEM-512-ipd @@ -47,7 +47,7 @@ elif [ "$1" = "ML-KEM-512-ipd" ]; then exit 1 fi -elif [ "$1" = "ML-KEM-768-ipd" ]; then +elif [[ "$1" = "ML-KEM-768-ipd" || "$1" = "ML-KEM-768" ]]; then file=tests/PQC_Intermediate_Values/ML-KEM-768.txt scheme_name=ML-KEM-768-ipd @@ -57,7 +57,7 @@ elif [ "$1" = "ML-KEM-768-ipd" ]; then exit 1 fi -elif [ "$1" = "ML-KEM-1024-ipd" ]; then +elif [[ "$1" = "ML-KEM-1024-ipd" || "$1" = "ML-KEM-1024" ]]; then file=tests/PQC_Intermediate_Values/ML-KEM-1024.txt scheme_name=ML-KEM-1024-ipd diff --git a/tests/vectors_kem.c b/tests/vectors_kem.c index da99cc639..638652928 100644 --- a/tests/vectors_kem.c +++ b/tests/vectors_kem.c @@ -71,7 +71,10 @@ static void hexStringToByteArray(const char *hexString, uint8_t *byteArray) { static inline bool is_ml_kem(const char *method_name) { return (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512_ipd)) || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_768_ipd)) - || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)); + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024_ipd)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_512)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_768)) + || (0 == strcmp(method_name, OQS_KEM_alg_ml_kem_1024)); } static void MLKEM_randombytes_init(const uint8_t *entropy_input, const uint8_t *personalization_string) { From 38fa3aba8026dc99a53c89c65be2a1f84dcc70c0 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 30 Jan 2024 16:22:44 +0100 Subject: [PATCH 22/27] enable alias for SIGS & enable ML-DSA (non-ipd-alias) --- .CMake/alg_support.cmake | 3 + docs/algorithms/kem/bike.md | 10 +-- docs/algorithms/kem/classic_mceliece.md | 24 ++--- docs/algorithms/kem/frodokem.md | 16 ++-- docs/algorithms/kem/hqc.md | 10 +-- docs/algorithms/kem/kyber.md | 10 +-- docs/algorithms/kem/ml_kem.md | 10 +-- docs/algorithms/kem/ntruprime.md | 6 +- docs/algorithms/sig/dilithium.md | 10 +-- docs/algorithms/sig/falcon.md | 8 +- docs/algorithms/sig/ml_dsa.md | 10 +-- docs/algorithms/sig/ml_dsa.yml | 3 + docs/algorithms/sig/sphincs.md | 28 +++--- .../add_enable_by_alg.fragment | 3 + .../copy_from_upstream/copy_from_upstream.py | 4 +- .../copy_from_upstream/copy_from_upstream.yml | 6 ++ .../add_alg_enable_defines.fragment | 3 + .../src/sig/family/sig_family.h | 12 ++- .../src/sig/family/sig_scheme.c | 27 ++++++ .../src/sig/sig.c/alg_identifier.fragment | 7 +- .../src/sig/sig.c/enabled_case.fragment | 12 ++- .../src/sig/sig.c/new_case.fragment | 12 ++- .../src/sig/sig.h/alg_identifier.fragment | 7 +- .../src/sig/sig.h/algs_length.fragment | 3 +- .../combine_message_signature.fragment | 2 +- scripts/update_docs_from_yaml.py | 4 + src/oqsconfig.h.cmake | 3 + src/sig/dilithium/sig_dilithium.h | 6 +- src/sig/falcon/sig_falcon.h | 4 +- src/sig/ml_dsa/sig_ml_dsa.h | 33 ++++++- src/sig/ml_dsa/sig_ml_dsa_44_ipd.c | 24 +++++ src/sig/ml_dsa/sig_ml_dsa_65_ipd.c | 24 +++++ src/sig/ml_dsa/sig_ml_dsa_87_ipd.c | 24 +++++ src/sig/sig.c | 90 ++++++++++++++++++- src/sig/sig.h | 9 +- src/sig/sphincs/sig_sphincs.h | 24 ++--- tests/KATs/sig/kats.json | 11 ++- tests/constant_time/kem/passes.json | 3 + tests/constant_time/sig/passes.json | 3 + tests/kat_sig.c | 6 +- tests/test_alg_info.py | 2 +- tests/test_vectors.sh | 6 +- 42 files changed, 407 insertions(+), 115 deletions(-) diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index a7d7f396f..bc4f3aa93 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -301,6 +301,7 @@ endif() option(OQS_ENABLE_SIG_ML_DSA "Enable ml_dsa algorithm family" ON) cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_44_ipd" OFF) @@ -308,6 +309,7 @@ endif() endif() cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_65_ipd" OFF) @@ -315,6 +317,7 @@ endif() endif() cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_ipd "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) +cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87 "" ON "OQS_ENABLE_SIG_ML_DSA" OFF) if(CMAKE_SYSTEM_NAME MATCHES "Darwin|Linux") if(OQS_DIST_X86_64_BUILD OR (OQS_USE_AVX2_INSTRUCTIONS AND OQS_USE_POPCNT_INSTRUCTIONS)) cmake_dependent_option(OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2 "" ON "OQS_ENABLE_SIG_ml_dsa_87_ipd" OFF) diff --git a/docs/algorithms/kem/bike.md b/docs/algorithms/kem/bike.md index 10741ad39..841993739 100644 --- a/docs/algorithms/kem/bike.md +++ b/docs/algorithms/kem/bike.md @@ -13,11 +13,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| BIKE-L1 | IND-CPA | 1 | 1541 | 5223 | 1573 | 32 | -| BIKE-L3 | IND-CPA | 3 | 3083 | 10105 | 3115 | 32 | -| BIKE-L5 | IND-CPA | 5 | 5122 | 16494 | 5154 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| BIKE-L1 | NA | IND-CPA | 1 | 1541 | 5223 | 1573 | 32 | +| BIKE-L3 | NA | IND-CPA | 3 | 3083 | 10105 | 3115 | 32 | +| BIKE-L5 | NA | IND-CPA | 5 | 5122 | 16494 | 5154 | 32 | ## BIKE-L1 implementation characteristics diff --git a/docs/algorithms/kem/classic_mceliece.md b/docs/algorithms/kem/classic_mceliece.md index 29ba09307..68840c4b0 100644 --- a/docs/algorithms/kem/classic_mceliece.md +++ b/docs/algorithms/kem/classic_mceliece.md @@ -18,18 +18,18 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:-------------------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| Classic-McEliece-348864 | IND-CCA2 | 1 | 261120 | 6492 | 96 | 32 | -| Classic-McEliece-348864f | IND-CCA2 | 1 | 261120 | 6492 | 96 | 32 | -| Classic-McEliece-460896 | IND-CCA2 | 3 | 524160 | 13608 | 156 | 32 | -| Classic-McEliece-460896f | IND-CCA2 | 3 | 524160 | 13608 | 156 | 32 | -| Classic-McEliece-6688128 | IND-CCA2 | 5 | 1044992 | 13932 | 208 | 32 | -| Classic-McEliece-6688128f | IND-CCA2 | 5 | 1044992 | 13932 | 208 | 32 | -| Classic-McEliece-6960119 | IND-CCA2 | 5 | 1047319 | 13948 | 194 | 32 | -| Classic-McEliece-6960119f | IND-CCA2 | 5 | 1047319 | 13948 | 194 | 32 | -| Classic-McEliece-8192128 | IND-CCA2 | 5 | 1357824 | 14120 | 208 | 32 | -| Classic-McEliece-8192128f | IND-CCA2 | 5 | 1357824 | 14120 | 208 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:-------------------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| Classic-McEliece-348864 | NA | IND-CCA2 | 1 | 261120 | 6492 | 96 | 32 | +| Classic-McEliece-348864f | NA | IND-CCA2 | 1 | 261120 | 6492 | 96 | 32 | +| Classic-McEliece-460896 | NA | IND-CCA2 | 3 | 524160 | 13608 | 156 | 32 | +| Classic-McEliece-460896f | NA | IND-CCA2 | 3 | 524160 | 13608 | 156 | 32 | +| Classic-McEliece-6688128 | NA | IND-CCA2 | 5 | 1044992 | 13932 | 208 | 32 | +| Classic-McEliece-6688128f | NA | IND-CCA2 | 5 | 1044992 | 13932 | 208 | 32 | +| Classic-McEliece-6960119 | NA | IND-CCA2 | 5 | 1047319 | 13948 | 194 | 32 | +| Classic-McEliece-6960119f | NA | IND-CCA2 | 5 | 1047319 | 13948 | 194 | 32 | +| Classic-McEliece-8192128 | NA | IND-CCA2 | 5 | 1357824 | 14120 | 208 | 32 | +| Classic-McEliece-8192128f | NA | IND-CCA2 | 5 | 1357824 | 14120 | 208 | 32 | ## Classic-McEliece-348864 implementation characteristics diff --git a/docs/algorithms/kem/frodokem.md b/docs/algorithms/kem/frodokem.md index fbf5366b0..07f216a5a 100644 --- a/docs/algorithms/kem/frodokem.md +++ b/docs/algorithms/kem/frodokem.md @@ -12,14 +12,14 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:-------------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| FrodoKEM-640-AES | IND-CCA2 | 1 | 9616 | 19888 | 9720 | 16 | -| FrodoKEM-640-SHAKE | IND-CCA2 | 1 | 9616 | 19888 | 9720 | 16 | -| FrodoKEM-976-AES | IND-CCA2 | 3 | 15632 | 31296 | 15744 | 24 | -| FrodoKEM-976-SHAKE | IND-CCA2 | 3 | 15632 | 31296 | 15744 | 24 | -| FrodoKEM-1344-AES | IND-CCA2 | 5 | 21520 | 43088 | 21632 | 32 | -| FrodoKEM-1344-SHAKE | IND-CCA2 | 5 | 21520 | 43088 | 21632 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:-------------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| FrodoKEM-640-AES | NA | IND-CCA2 | 1 | 9616 | 19888 | 9720 | 16 | +| FrodoKEM-640-SHAKE | NA | IND-CCA2 | 1 | 9616 | 19888 | 9720 | 16 | +| FrodoKEM-976-AES | NA | IND-CCA2 | 3 | 15632 | 31296 | 15744 | 24 | +| FrodoKEM-976-SHAKE | NA | IND-CCA2 | 3 | 15632 | 31296 | 15744 | 24 | +| FrodoKEM-1344-AES | NA | IND-CCA2 | 5 | 21520 | 43088 | 21632 | 32 | +| FrodoKEM-1344-SHAKE | NA | IND-CCA2 | 5 | 21520 | 43088 | 21632 | 32 | ## FrodoKEM-640-AES implementation characteristics diff --git a/docs/algorithms/kem/hqc.md b/docs/algorithms/kem/hqc.md index 84dab7f6c..58d083481 100644 --- a/docs/algorithms/kem/hqc.md +++ b/docs/algorithms/kem/hqc.md @@ -14,11 +14,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| HQC-128 | IND-CCA2 | 1 | 2249 | 2305 | 4433 | 64 | -| HQC-192 | IND-CCA2 | 3 | 4522 | 4586 | 8978 | 64 | -| HQC-256 | IND-CCA2 | 5 | 7245 | 7317 | 14421 | 64 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| HQC-128 | NA | IND-CCA2 | 1 | 2249 | 2305 | 4433 | 64 | +| HQC-192 | NA | IND-CCA2 | 3 | 4522 | 4586 | 8978 | 64 | +| HQC-256 | NA | IND-CCA2 | 5 | 7245 | 7317 | 14421 | 64 | ## HQC-128 implementation characteristics diff --git a/docs/algorithms/kem/kyber.md b/docs/algorithms/kem/kyber.md index 9f2ad1f85..a75c144a2 100644 --- a/docs/algorithms/kem/kyber.md +++ b/docs/algorithms/kem/kyber.md @@ -17,11 +17,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| Kyber512 | IND-CCA2 | 1 | 800 | 1632 | 768 | 32 | -| Kyber768 | IND-CCA2 | 3 | 1184 | 2400 | 1088 | 32 | -| Kyber1024 | IND-CCA2 | 5 | 1568 | 3168 | 1568 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| Kyber512 | NA | IND-CCA2 | 1 | 800 | 1632 | 768 | 32 | +| Kyber768 | NA | IND-CCA2 | 3 | 1184 | 2400 | 1088 | 32 | +| Kyber1024 | NA | IND-CCA2 | 5 | 1568 | 3168 | 1568 | 32 | ## Kyber512 implementation characteristics diff --git a/docs/algorithms/kem/ml_kem.md b/docs/algorithms/kem/ml_kem.md index fc0bf8ada..92d1a5b4b 100644 --- a/docs/algorithms/kem/ml_kem.md +++ b/docs/algorithms/kem/ml_kem.md @@ -13,11 +13,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| ML-KEM-512-ipd | IND-CCA2 | 1 | 800 | 1632 | 768 | 32 | -| ML-KEM-768-ipd | IND-CCA2 | 3 | 1184 | 2400 | 1088 | 32 | -| ML-KEM-1024-ipd | IND-CCA2 | 5 | 1568 | 3168 | 1568 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| ML-KEM-512-ipd | ML-KEM-512 | IND-CCA2 | 1 | 800 | 1632 | 768 | 32 | +| ML-KEM-768-ipd | ML-KEM-768 | IND-CCA2 | 3 | 1184 | 2400 | 1088 | 32 | +| ML-KEM-1024-ipd | ML-KEM-1024 | IND-CCA2 | 5 | 1568 | 3168 | 1568 | 32 | ## ML-KEM-512-ipd implementation characteristics diff --git a/docs/algorithms/kem/ntruprime.md b/docs/algorithms/kem/ntruprime.md index 07a7ca899..5ff56716f 100644 --- a/docs/algorithms/kem/ntruprime.md +++ b/docs/algorithms/kem/ntruprime.md @@ -14,9 +14,9 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| -| sntrup761 | IND-CCA2 | 2 | 1158 | 1763 | 1039 | 32 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Ciphertext size (bytes) | Shared secret size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|--------------------------:|-----------------------------:| +| sntrup761 | NA | IND-CCA2 | 2 | 1158 | 1763 | 1039 | 32 | ## sntrup761 implementation characteristics diff --git a/docs/algorithms/sig/dilithium.md b/docs/algorithms/sig/dilithium.md index cd4ecb733..d26daa285 100644 --- a/docs/algorithms/sig/dilithium.md +++ b/docs/algorithms/sig/dilithium.md @@ -17,11 +17,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| -| Dilithium2 | EUF-CMA | 2 | 1312 | 2528 | 2420 | -| Dilithium3 | EUF-CMA | 3 | 1952 | 4000 | 3293 | -| Dilithium5 | EUF-CMA | 5 | 2592 | 4864 | 4595 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| +| Dilithium2 | NA | EUF-CMA | 2 | 1312 | 2528 | 2420 | +| Dilithium3 | NA | EUF-CMA | 3 | 1952 | 4000 | 3293 | +| Dilithium5 | NA | EUF-CMA | 5 | 2592 | 4864 | 4595 | ## Dilithium2 implementation characteristics diff --git a/docs/algorithms/sig/falcon.md b/docs/algorithms/sig/falcon.md index 122111062..df0580968 100644 --- a/docs/algorithms/sig/falcon.md +++ b/docs/algorithms/sig/falcon.md @@ -13,10 +13,10 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| -| Falcon-512 | EUF-CMA | 1 | 897 | 1281 | 666 | -| Falcon-1024 | EUF-CMA | 5 | 1793 | 2305 | 1280 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| +| Falcon-512 | NA | EUF-CMA | 1 | 897 | 1281 | 666 | +| Falcon-1024 | NA | EUF-CMA | 5 | 1793 | 2305 | 1280 | ## Falcon-512 implementation characteristics diff --git a/docs/algorithms/sig/ml_dsa.md b/docs/algorithms/sig/ml_dsa.md index 479b75d2e..ab2b43488 100644 --- a/docs/algorithms/sig/ml_dsa.md +++ b/docs/algorithms/sig/ml_dsa.md @@ -13,11 +13,11 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | -|:---------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| -| ML-DSA-44-ipd | EUF-CMA | 2 | 1312 | 2560 | 2420 | -| ML-DSA-65-ipd | EUF-CMA | 3 | 1952 | 4032 | 3309 | -| ML-DSA-87-ipd | EUF-CMA | 5 | 2592 | 4896 | 4627 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | +|:---------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| +| ML-DSA-44-ipd | ML-DSA-44 | EUF-CMA | 2 | 1312 | 2560 | 2420 | +| ML-DSA-65-ipd | ML-DSA-65 | EUF-CMA | 3 | 1952 | 4032 | 3309 | +| ML-DSA-87-ipd | ML-DSA-87 | EUF-CMA | 5 | 2592 | 4896 | 4627 | ## ML-DSA-44-ipd implementation characteristics diff --git a/docs/algorithms/sig/ml_dsa.yml b/docs/algorithms/sig/ml_dsa.yml index 33b1a3e1e..c93688358 100644 --- a/docs/algorithms/sig/ml_dsa.yml +++ b/docs/algorithms/sig/ml_dsa.yml @@ -20,6 +20,7 @@ primary-upstream: spdx-license-identifier: CC0-1.0 or Apache-2.0 parameter-sets: - name: ML-DSA-44-ipd + alias: ML-DSA-44 claimed-nist-level: 2 claimed-security: EUF-CMA length-public-key: 1312 @@ -51,6 +52,7 @@ parameter-sets: no-secret-dependent-branching-checked-by-valgrind: true large-stack-usage: false - name: ML-DSA-65-ipd + alias: ML-DSA-65 claimed-nist-level: 3 claimed-security: EUF-CMA length-public-key: 1952 @@ -82,6 +84,7 @@ parameter-sets: no-secret-dependent-branching-checked-by-valgrind: true large-stack-usage: false - name: ML-DSA-87-ipd + alias: ML-DSA-87 claimed-nist-level: 5 claimed-security: EUF-CMA length-public-key: 2592 diff --git a/docs/algorithms/sig/sphincs.md b/docs/algorithms/sig/sphincs.md index 3ce2b0ae9..a1660e483 100644 --- a/docs/algorithms/sig/sphincs.md +++ b/docs/algorithms/sig/sphincs.md @@ -17,20 +17,20 @@ ## Parameter set summary -| Parameter set | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | -|:--------------------------:|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| -| SPHINCS+-SHA2-128f-simple | EUF-CMA | 1 | 32 | 64 | 17088 | -| SPHINCS+-SHA2-128s-simple | EUF-CMA | 1 | 32 | 64 | 7856 | -| SPHINCS+-SHA2-192f-simple | EUF-CMA | 3 | 48 | 96 | 35664 | -| SPHINCS+-SHA2-192s-simple | EUF-CMA | 3 | 48 | 96 | 16224 | -| SPHINCS+-SHA2-256f-simple | EUF-CMA | 5 | 64 | 128 | 49856 | -| SPHINCS+-SHA2-256s-simple | EUF-CMA | 5 | 64 | 128 | 29792 | -| SPHINCS+-SHAKE-128f-simple | EUF-CMA | 1 | 32 | 64 | 17088 | -| SPHINCS+-SHAKE-128s-simple | EUF-CMA | 1 | 32 | 64 | 7856 | -| SPHINCS+-SHAKE-192f-simple | EUF-CMA | 3 | 48 | 96 | 35664 | -| SPHINCS+-SHAKE-192s-simple | EUF-CMA | 3 | 48 | 96 | 16224 | -| SPHINCS+-SHAKE-256f-simple | EUF-CMA | 5 | 64 | 128 | 49856 | -| SPHINCS+-SHAKE-256s-simple | EUF-CMA | 5 | 64 | 128 | 29792 | +| Parameter set | Parameter set alias | Security model | Claimed NIST Level | Public key size (bytes) | Secret key size (bytes) | Signature size (bytes) | +|:--------------------------:|:----------------------|:-----------------|---------------------:|--------------------------:|--------------------------:|-------------------------:| +| SPHINCS+-SHA2-128f-simple | NA | EUF-CMA | 1 | 32 | 64 | 17088 | +| SPHINCS+-SHA2-128s-simple | NA | EUF-CMA | 1 | 32 | 64 | 7856 | +| SPHINCS+-SHA2-192f-simple | NA | EUF-CMA | 3 | 48 | 96 | 35664 | +| SPHINCS+-SHA2-192s-simple | NA | EUF-CMA | 3 | 48 | 96 | 16224 | +| SPHINCS+-SHA2-256f-simple | NA | EUF-CMA | 5 | 64 | 128 | 49856 | +| SPHINCS+-SHA2-256s-simple | NA | EUF-CMA | 5 | 64 | 128 | 29792 | +| SPHINCS+-SHAKE-128f-simple | NA | EUF-CMA | 1 | 32 | 64 | 17088 | +| SPHINCS+-SHAKE-128s-simple | NA | EUF-CMA | 1 | 32 | 64 | 7856 | +| SPHINCS+-SHAKE-192f-simple | NA | EUF-CMA | 3 | 48 | 96 | 35664 | +| SPHINCS+-SHAKE-192s-simple | NA | EUF-CMA | 3 | 48 | 96 | 16224 | +| SPHINCS+-SHAKE-256f-simple | NA | EUF-CMA | 5 | 64 | 128 | 49856 | +| SPHINCS+-SHAKE-256s-simple | NA | EUF-CMA | 5 | 64 | 128 | 29792 | ## SPHINCS+-SHA2-128f-simple implementation characteristics diff --git a/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment b/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment index f5054b061..cb3b7d15d 100644 --- a/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment +++ b/scripts/copy_from_upstream/.CMake/alg_support.cmake/add_enable_by_alg.fragment @@ -40,6 +40,9 @@ endif() option(OQS_ENABLE_SIG_{{ family['name']|upper }} "Enable {{ family['name'] }} algorithm family" ON) {%- for scheme in family['schemes'] %} cmake_dependent_option(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} "" ON "OQS_ENABLE_SIG_{{ family['name']|upper }}" OFF) +{%- if 'alias_scheme' in scheme %} +cmake_dependent_option(OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['alias_scheme'] }} "" ON "OQS_ENABLE_SIG_{{ family['name']|upper }}" OFF) +{%- endif -%} {%- for impl in scheme['metadata']['implementations'] if impl['name'] != family['default_implementation'] and impl['supported_platforms'] -%} {%- for platform in impl['supported_platforms'] if platform['architecture'] == 'x86_64' %} {% if platform['operating_systems'] %}if(CMAKE_SYSTEM_NAME MATCHES "{{ platform['operating_systems']|join('|') }}") diff --git a/scripts/copy_from_upstream/copy_from_upstream.py b/scripts/copy_from_upstream/copy_from_upstream.py index b38f9c3b2..77dde913e 100755 --- a/scripts/copy_from_upstream/copy_from_upstream.py +++ b/scripts/copy_from_upstream/copy_from_upstream.py @@ -559,7 +559,9 @@ def process_families(instructions, basedir, with_kat, with_generator): except KeyError: # new key print("Adding new KAT for %s" % (scheme['pretty_name_full'])) pass - kats['sig'][scheme['pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] + kats['sig'][scheme['pretty_name_full']] = scheme['metadata']['nistkat-sha256'] + if 'alias_pretty_name_full' in scheme: + kats['sig'][scheme['alias_pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] if with_generator: generator( diff --git a/scripts/copy_from_upstream/copy_from_upstream.yml b/scripts/copy_from_upstream/copy_from_upstream.yml index 6d4b5ca8a..f55b8798b 100644 --- a/scripts/copy_from_upstream/copy_from_upstream.yml +++ b/scripts/copy_from_upstream/copy_from_upstream.yml @@ -195,16 +195,22 @@ sigs: pqclean_scheme: ml-dsa-44-ipd pretty_name_full: ML-DSA-44-ipd signed_msg_order: sig_then_msg + alias_scheme: "44" + alias_pretty_name_full: ML-DSA-44 - scheme: "65_ipd" pqclean_scheme: ml-dsa-65-ipd pretty_name_full: ML-DSA-65-ipd signed_msg_order: sig_then_msg + alias_scheme: "65" + alias_pretty_name_full: ML-DSA-65 - scheme: "87_ipd" pqclean_scheme: ml-dsa-87-ipd pretty_name_full: ML-DSA-87-ipd signed_msg_order: sig_then_msg + alias_scheme: "87" + alias_pretty_name_full: ML-DSA-87 - name: falcon default_implementation: clean diff --git a/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment b/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment index 3f1e04eae..2bc517ac2 100644 --- a/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment +++ b/scripts/copy_from_upstream/src/oqsconfig.h.cmake/add_alg_enable_defines.fragment @@ -17,6 +17,9 @@ #cmakedefine OQS_ENABLE_SIG_{{ family['name']|upper }} 1 {%- for scheme in family['schemes'] %} #cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }} 1 +{%- if 'alias_scheme' in scheme %} +#cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['alias_scheme'] }} 1 +{%- endif -%} {%- for impl in scheme['metadata']['implementations'] if impl['name'] != family['default_implementation'] %} #cmakedefine OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['scheme'] }}_{{ impl['name'] }} 1 {%- endfor -%} diff --git a/scripts/copy_from_upstream/src/sig/family/sig_family.h b/scripts/copy_from_upstream/src/sig/family/sig_family.h index 2af20417c..b17d62163 100644 --- a/scripts/copy_from_upstream/src/sig/family/sig_family.h +++ b/scripts/copy_from_upstream/src/sig/family/sig_family.h @@ -6,7 +6,7 @@ #include {% for scheme in schemes -%} -#ifdef OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme'] }} +#if defined(OQS_ENABLE_SIG_{{ family }}_{{ scheme['scheme'] }}) {%- if 'alias_scheme' in scheme %} || defined(OQS_ENABLE_SIG_{{ family }}_{{ scheme['alias_scheme'] }}){%- endif %} #define OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_public_key {{ scheme['metadata']['length-public-key'] }} #define OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_secret_key {{ scheme['metadata']['length-secret-key'] }} #define OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_signature {{ scheme['metadata']['length-signature'] }} @@ -15,6 +15,16 @@ OQS_SIG *OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_new(void); OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); +{% if 'alias_scheme' in scheme %} +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_length_public_key OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_public_key +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_length_secret_key OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_secret_key +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_length_ciphertext OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_ciphertext +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_length_shared_secret OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_shared_secret +OQS_SIG *OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_new(void); +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_keypair OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_keypair +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_encaps OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_encaps +#define OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_decaps OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_decaps +{% endif -%} #endif {% endfor -%} diff --git a/scripts/copy_from_upstream/src/sig/family/sig_scheme.c b/scripts/copy_from_upstream/src/sig/family/sig_scheme.c index 5b8927a83..928ef3d65 100644 --- a/scripts/copy_from_upstream/src/sig/family/sig_scheme.c +++ b/scripts/copy_from_upstream/src/sig/family/sig_scheme.c @@ -30,6 +30,33 @@ OQS_SIG *OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_new(void) { return sig; } +{%- if 'alias_scheme' in scheme %} + +/** Alias */ +OQS_SIG *OQS_SIG_{{ family }}_{{ scheme['alias_scheme'] }}_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_{{ family }}_{{ scheme['alias_scheme'] }}; + sig->alg_version = "{{ scheme['metadata']['implementations'][0]['version'] }}"; + + sig->claimed_nist_level = {{ scheme['metadata']['claimed-nist-level'] }}; + sig->euf_cma = {{ scheme['metadata']['euf_cma'] }}; + + sig->length_public_key = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_public_key; + sig->length_secret_key = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_secret_key; + sig->length_signature = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_length_signature; + + sig->keypair = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_keypair; + sig->sign = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_sign; + sig->verify = OQS_SIG_{{ family }}_{{ scheme['scheme'] }}_verify; + + return sig; +} +{%- endif -%} + {%- for impl in scheme['metadata']['implementations'] if impl['name'] == scheme['default_implementation'] %} {%- if impl['signature_keypair'] %} diff --git a/scripts/copy_from_upstream/src/sig/sig.c/alg_identifier.fragment b/scripts/copy_from_upstream/src/sig/sig.c/alg_identifier.fragment index 3b4e54ad2..87d9c6fa5 100644 --- a/scripts/copy_from_upstream/src/sig/sig.c/alg_identifier.fragment +++ b/scripts/copy_from_upstream/src/sig/sig.c/alg_identifier.fragment @@ -1,3 +1,6 @@ {% for family in instructions['sigs'] %}{% for scheme in family['schemes'] %} - OQS_SIG_alg_{{ family['name'] }}_{{ scheme['scheme'] }},{% endfor %}{% endfor %} - \ No newline at end of file + OQS_SIG_alg_{{ family['name'] }}_{{ scheme['scheme'] }}, +{%- if 'alias_scheme' in scheme %} + OQS_SIG_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }}, +{%- endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/sig/sig.c/enabled_case.fragment b/scripts/copy_from_upstream/src/sig/sig.c/enabled_case.fragment index c85d08adf..8ff702c3f 100644 --- a/scripts/copy_from_upstream/src/sig/sig.c/enabled_case.fragment +++ b/scripts/copy_from_upstream/src/sig/sig.c/enabled_case.fragment @@ -4,5 +4,13 @@ return 1; #else return 0; -#endif{% endfor %}{% endfor %} - +#endif +{% if 'alias_scheme' in scheme %} + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }})) { +#ifdef OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['alias_scheme'] }} + return 1; +#else + return 0; +#endif +{% endif -%} +{% endfor %}{% endfor %} \ No newline at end of file diff --git a/scripts/copy_from_upstream/src/sig/sig.c/new_case.fragment b/scripts/copy_from_upstream/src/sig/sig.c/new_case.fragment index e874f8e14..2600f9b35 100644 --- a/scripts/copy_from_upstream/src/sig/sig.c/new_case.fragment +++ b/scripts/copy_from_upstream/src/sig/sig.c/new_case.fragment @@ -4,5 +4,13 @@ return OQS_SIG_{{ family['name'] }}_{{ scheme['scheme'] }}_new(); #else return NULL; -#endif{% endfor %}{% endfor %} - +#endif +{% if 'alias_scheme' in scheme %} + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }})) { +#ifdef OQS_ENABLE_SIG_{{ family['name'] }}_{{ scheme['alias_scheme'] }} + return OQS_SIG_{{ family['name'] }}_{{ scheme['alias_scheme'] }}_new(); +#else + return NULL; +#endif +{% endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/sig/sig.h/alg_identifier.fragment b/scripts/copy_from_upstream/src/sig/sig.h/alg_identifier.fragment index dc940087b..9de830f9a 100644 --- a/scripts/copy_from_upstream/src/sig/sig.h/alg_identifier.fragment +++ b/scripts/copy_from_upstream/src/sig/sig.h/alg_identifier.fragment @@ -1,4 +1,9 @@ {% for family in instructions['sigs'] %}{% for scheme in family['schemes'] %} /** Algorithm identifier for {{ scheme['pretty_name_full'] }} */ -#define OQS_SIG_alg_{{ family['name'] }}_{{ scheme['scheme'] }} "{{ scheme['pretty_name_full'] }}"{% endfor %}{% endfor %} +#define OQS_SIG_alg_{{ family['name'] }}_{{ scheme['scheme'] }} "{{ scheme['pretty_name_full'] }}" +{%- if 'alias_scheme' in scheme %} +/** Algorithm identifier for {{ scheme['alias_pretty_name_full'] }} SIG. */ +#define OQS_SIG_alg_{{ family['name'] }}_{{ scheme['alias_scheme'] }} "{{ scheme['alias_pretty_name_full'] }}" +{%- endif -%} +{% endfor %}{% endfor %} diff --git a/scripts/copy_from_upstream/src/sig/sig.h/algs_length.fragment b/scripts/copy_from_upstream/src/sig/sig.h/algs_length.fragment index ea35d7ab5..0ac713314 100644 --- a/scripts/copy_from_upstream/src/sig/sig.h/algs_length.fragment +++ b/scripts/copy_from_upstream/src/sig/sig.h/algs_length.fragment @@ -1,4 +1,5 @@ {% set unary %}{% for family in instructions['sigs'] %}{% for scheme in family['schemes'] %}1{% endfor %}{% endfor %}{% endset %} +{% set unary_alias %}{% for family in instructions['sigs'] %}{% for scheme in family['schemes'] if 'alias_scheme' in scheme %}2{% endfor %}{% endfor %}{% endset %} /** Number of algorithm identifiers above. */ -#define OQS_SIG_algs_length {{ unary|length }} +#define OQS_SIG_algs_length {{ unary|length + unary_alias|length }} diff --git a/scripts/copy_from_upstream/tests/kat_sig.c/combine_message_signature.fragment b/scripts/copy_from_upstream/tests/kat_sig.c/combine_message_signature.fragment index c76d13512..25609f254 100644 --- a/scripts/copy_from_upstream/tests/kat_sig.c/combine_message_signature.fragment +++ b/scripts/copy_from_upstream/tests/kat_sig.c/combine_message_signature.fragment @@ -1,5 +1,5 @@ {% for family in instructions['sigs'] %}{% for scheme in family['schemes'] %} - } else if (0 == strcmp(sig->method_name, "{{ scheme['pretty_name_full'] }}")) { + } else if (0 == strcmp(sig->method_name, "{{ scheme['pretty_name_full'] }}"){%- if 'alias_scheme' in scheme %} || 0 == strcmp(sig->method_name, "{{ scheme['alias_pretty_name_full'] }}"){%- endif -%}) { {%- if scheme['signed_msg_order'] == 'sig_then_msg' %} // signed_msg = signature || msg *signed_msg_len = signature_len + msg_len; diff --git a/scripts/update_docs_from_yaml.py b/scripts/update_docs_from_yaml.py index 96a4b1887..478ba8dde 100644 --- a/scripts/update_docs_from_yaml.py +++ b/scripts/update_docs_from_yaml.py @@ -62,6 +62,7 @@ def do_it(liboqs_root): out_md.write('\n## Parameter set summary\n\n') table = [['Parameter set', + 'Parameter set alias', 'Security model', 'Claimed NIST Level', 'Public key size (bytes)', @@ -70,6 +71,7 @@ def do_it(liboqs_root): 'Shared secret size (bytes)']] for parameter_set in kem_yaml['parameter-sets']: table.append([parameter_set['name'], + parameter_set['alias'] if 'alias' in parameter_set else "NA", parameter_set['claimed-security'], parameter_set['claimed-nist-level'], parameter_set['length-public-key'], @@ -186,6 +188,7 @@ def do_it(liboqs_root): out_md.write('\n## Parameter set summary\n\n') table = [['Parameter set', + 'Parameter set alias', 'Security model', 'Claimed NIST Level', 'Public key size (bytes)', @@ -193,6 +196,7 @@ def do_it(liboqs_root): 'Signature size (bytes)']] for parameter_set in sig_yaml['parameter-sets']: table.append([parameter_set['name'].replace('_', '\_'), + parameter_set['alias'] if 'alias' in parameter_set else "NA", parameter_set['claimed-security'], parameter_set['claimed-nist-level'], parameter_set['length-public-key'], diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index 035938c1a..4abe5c2ae 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -133,10 +133,13 @@ #cmakedefine OQS_ENABLE_SIG_ML_DSA 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_44_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_44 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_44_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_65_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_65 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_65_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_87_ipd 1 +#cmakedefine OQS_ENABLE_SIG_ml_dsa_87 1 #cmakedefine OQS_ENABLE_SIG_ml_dsa_87_ipd_avx2 1 #cmakedefine OQS_ENABLE_SIG_FALCON 1 diff --git a/src/sig/dilithium/sig_dilithium.h b/src/sig/dilithium/sig_dilithium.h index b63ea73b4..2e24f58fe 100644 --- a/src/sig/dilithium/sig_dilithium.h +++ b/src/sig/dilithium/sig_dilithium.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_SIG_dilithium_2 +#if defined(OQS_ENABLE_SIG_dilithium_2) #define OQS_SIG_dilithium_2_length_public_key 1312 #define OQS_SIG_dilithium_2_length_secret_key 2528 #define OQS_SIG_dilithium_2_length_signature 2420 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_2_sign(uint8_t *signature, size_t *signatur OQS_API OQS_STATUS OQS_SIG_dilithium_2_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_dilithium_3 +#if defined(OQS_ENABLE_SIG_dilithium_3) #define OQS_SIG_dilithium_3_length_public_key 1952 #define OQS_SIG_dilithium_3_length_secret_key 4000 #define OQS_SIG_dilithium_3_length_signature 3293 @@ -27,7 +27,7 @@ OQS_API OQS_STATUS OQS_SIG_dilithium_3_sign(uint8_t *signature, size_t *signatur OQS_API OQS_STATUS OQS_SIG_dilithium_3_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_dilithium_5 +#if defined(OQS_ENABLE_SIG_dilithium_5) #define OQS_SIG_dilithium_5_length_public_key 2592 #define OQS_SIG_dilithium_5_length_secret_key 4864 #define OQS_SIG_dilithium_5_length_signature 4595 diff --git a/src/sig/falcon/sig_falcon.h b/src/sig/falcon/sig_falcon.h index 95b1d2bcf..dfd43e88b 100644 --- a/src/sig/falcon/sig_falcon.h +++ b/src/sig/falcon/sig_falcon.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_SIG_falcon_512 +#if defined(OQS_ENABLE_SIG_falcon_512) #define OQS_SIG_falcon_512_length_public_key 897 #define OQS_SIG_falcon_512_length_secret_key 1281 #define OQS_SIG_falcon_512_length_signature 666 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_SIG_falcon_512_sign(uint8_t *signature, size_t *signature OQS_API OQS_STATUS OQS_SIG_falcon_512_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_falcon_1024 +#if defined(OQS_ENABLE_SIG_falcon_1024) #define OQS_SIG_falcon_1024_length_public_key 1793 #define OQS_SIG_falcon_1024_length_secret_key 2305 #define OQS_SIG_falcon_1024_length_signature 1280 diff --git a/src/sig/ml_dsa/sig_ml_dsa.h b/src/sig/ml_dsa/sig_ml_dsa.h index be69ee5d6..e4b94a790 100644 --- a/src/sig/ml_dsa/sig_ml_dsa.h +++ b/src/sig/ml_dsa/sig_ml_dsa.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd +#if defined(OQS_ENABLE_SIG_ml_dsa_44_ipd) || defined(OQS_ENABLE_SIG_ml_dsa_44) #define OQS_SIG_ml_dsa_44_ipd_length_public_key 1312 #define OQS_SIG_ml_dsa_44_ipd_length_secret_key 2560 #define OQS_SIG_ml_dsa_44_ipd_length_signature 2420 @@ -14,9 +14,18 @@ OQS_SIG *OQS_SIG_ml_dsa_44_ipd_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_44_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); + +#define OQS_SIG_ml_dsa_44_length_public_key OQS_SIG_ml_dsa_44_ipd_length_public_key +#define OQS_SIG_ml_dsa_44_length_secret_key OQS_SIG_ml_dsa_44_ipd_length_secret_key +#define OQS_SIG_ml_dsa_44_length_ciphertext OQS_SIG_ml_dsa_44_ipd_length_ciphertext +#define OQS_SIG_ml_dsa_44_length_shared_secret OQS_SIG_ml_dsa_44_ipd_length_shared_secret +OQS_SIG *OQS_SIG_ml_dsa_44_new(void); +#define OQS_SIG_ml_dsa_44_keypair OQS_SIG_ml_dsa_44_ipd_keypair +#define OQS_SIG_ml_dsa_44_encaps OQS_SIG_ml_dsa_44_ipd_encaps +#define OQS_SIG_ml_dsa_44_decaps OQS_SIG_ml_dsa_44_ipd_decaps #endif -#ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd +#if defined(OQS_ENABLE_SIG_ml_dsa_65_ipd) || defined(OQS_ENABLE_SIG_ml_dsa_65) #define OQS_SIG_ml_dsa_65_ipd_length_public_key 1952 #define OQS_SIG_ml_dsa_65_ipd_length_secret_key 4032 #define OQS_SIG_ml_dsa_65_ipd_length_signature 3309 @@ -25,9 +34,18 @@ OQS_SIG *OQS_SIG_ml_dsa_65_ipd_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_65_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); + +#define OQS_SIG_ml_dsa_65_length_public_key OQS_SIG_ml_dsa_65_ipd_length_public_key +#define OQS_SIG_ml_dsa_65_length_secret_key OQS_SIG_ml_dsa_65_ipd_length_secret_key +#define OQS_SIG_ml_dsa_65_length_ciphertext OQS_SIG_ml_dsa_65_ipd_length_ciphertext +#define OQS_SIG_ml_dsa_65_length_shared_secret OQS_SIG_ml_dsa_65_ipd_length_shared_secret +OQS_SIG *OQS_SIG_ml_dsa_65_new(void); +#define OQS_SIG_ml_dsa_65_keypair OQS_SIG_ml_dsa_65_ipd_keypair +#define OQS_SIG_ml_dsa_65_encaps OQS_SIG_ml_dsa_65_ipd_encaps +#define OQS_SIG_ml_dsa_65_decaps OQS_SIG_ml_dsa_65_ipd_decaps #endif -#ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd +#if defined(OQS_ENABLE_SIG_ml_dsa_87_ipd) || defined(OQS_ENABLE_SIG_ml_dsa_87) #define OQS_SIG_ml_dsa_87_ipd_length_public_key 2592 #define OQS_SIG_ml_dsa_87_ipd_length_secret_key 4896 #define OQS_SIG_ml_dsa_87_ipd_length_signature 4627 @@ -36,6 +54,15 @@ OQS_SIG *OQS_SIG_ml_dsa_87_ipd_new(void); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_keypair(uint8_t *public_key, uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key); OQS_API OQS_STATUS OQS_SIG_ml_dsa_87_ipd_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); + +#define OQS_SIG_ml_dsa_87_length_public_key OQS_SIG_ml_dsa_87_ipd_length_public_key +#define OQS_SIG_ml_dsa_87_length_secret_key OQS_SIG_ml_dsa_87_ipd_length_secret_key +#define OQS_SIG_ml_dsa_87_length_ciphertext OQS_SIG_ml_dsa_87_ipd_length_ciphertext +#define OQS_SIG_ml_dsa_87_length_shared_secret OQS_SIG_ml_dsa_87_ipd_length_shared_secret +OQS_SIG *OQS_SIG_ml_dsa_87_new(void); +#define OQS_SIG_ml_dsa_87_keypair OQS_SIG_ml_dsa_87_ipd_keypair +#define OQS_SIG_ml_dsa_87_encaps OQS_SIG_ml_dsa_87_ipd_encaps +#define OQS_SIG_ml_dsa_87_decaps OQS_SIG_ml_dsa_87_ipd_decaps #endif #endif diff --git a/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c b/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c index 7a45eb12f..62130cfe0 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c +++ b/src/sig/ml_dsa/sig_ml_dsa_44_ipd.c @@ -29,6 +29,30 @@ OQS_SIG *OQS_SIG_ml_dsa_44_ipd_new(void) { return sig; } +/** Alias */ +OQS_SIG *OQS_SIG_ml_dsa_44_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_44; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 2; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_44_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_44_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_44_ipd_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_44_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_44_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_44_ipd_verify; + + return sig; +} + extern int pqcrystals_ml_dsa_44_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_44_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); diff --git a/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c b/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c index d6892e51a..142d20db0 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c +++ b/src/sig/ml_dsa/sig_ml_dsa_65_ipd.c @@ -29,6 +29,30 @@ OQS_SIG *OQS_SIG_ml_dsa_65_ipd_new(void) { return sig; } +/** Alias */ +OQS_SIG *OQS_SIG_ml_dsa_65_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_65; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 3; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_65_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_65_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_65_ipd_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_65_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_65_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_65_ipd_verify; + + return sig; +} + extern int pqcrystals_ml_dsa_65_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_65_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); diff --git a/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c b/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c index 54cd81941..2bd6542e5 100644 --- a/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c +++ b/src/sig/ml_dsa/sig_ml_dsa_87_ipd.c @@ -29,6 +29,30 @@ OQS_SIG *OQS_SIG_ml_dsa_87_ipd_new(void) { return sig; } +/** Alias */ +OQS_SIG *OQS_SIG_ml_dsa_87_new(void) { + + OQS_SIG *sig = malloc(sizeof(OQS_SIG)); + if (sig == NULL) { + return NULL; + } + sig->method_name = OQS_SIG_alg_ml_dsa_87; + sig->alg_version = "https://github.com/pq-crystals/dilithium/tree/standard"; + + sig->claimed_nist_level = 5; + sig->euf_cma = true; + + sig->length_public_key = OQS_SIG_ml_dsa_87_ipd_length_public_key; + sig->length_secret_key = OQS_SIG_ml_dsa_87_ipd_length_secret_key; + sig->length_signature = OQS_SIG_ml_dsa_87_ipd_length_signature; + + sig->keypair = OQS_SIG_ml_dsa_87_ipd_keypair; + sig->sign = OQS_SIG_ml_dsa_87_ipd_sign; + sig->verify = OQS_SIG_ml_dsa_87_ipd_verify; + + return sig; +} + extern int pqcrystals_ml_dsa_87_ipd_ref_keypair(uint8_t *pk, uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk); extern int pqcrystals_ml_dsa_87_ipd_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk); diff --git a/src/sig/sig.c b/src/sig/sig.c index 3604823b3..b953af756 100644 --- a/src/sig/sig.c +++ b/src/sig/sig.c @@ -19,8 +19,11 @@ OQS_API const char *OQS_SIG_alg_identifier(size_t i) { OQS_SIG_alg_dilithium_3, OQS_SIG_alg_dilithium_5, OQS_SIG_alg_ml_dsa_44_ipd, + OQS_SIG_alg_ml_dsa_44, OQS_SIG_alg_ml_dsa_65_ipd, + OQS_SIG_alg_ml_dsa_65, OQS_SIG_alg_ml_dsa_87_ipd, + OQS_SIG_alg_ml_dsa_87, OQS_SIG_alg_falcon_512, OQS_SIG_alg_falcon_1024, OQS_SIG_alg_sphincs_sha2_128f_simple, @@ -34,8 +37,7 @@ OQS_API const char *OQS_SIG_alg_identifier(size_t i) { OQS_SIG_alg_sphincs_shake_192f_simple, OQS_SIG_alg_sphincs_shake_192s_simple, OQS_SIG_alg_sphincs_shake_256f_simple, - OQS_SIG_alg_sphincs_shake_256s_simple, - ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END + OQS_SIG_alg_sphincs_shake_256s_simple,///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END }; if (i >= OQS_SIG_algs_length) { return NULL; @@ -60,121 +62,161 @@ OQS_API int OQS_SIG_alg_is_enabled(const char *method_name) { #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_3)) { #ifdef OQS_ENABLE_SIG_dilithium_3 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_5)) { #ifdef OQS_ENABLE_SIG_dilithium_5 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd return 1; #else return 0; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87 + return 1; +#else + return 0; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) { #ifdef OQS_ENABLE_SIG_falcon_512 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_1024)) { #ifdef OQS_ENABLE_SIG_falcon_1024 return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_128f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_128s_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_192f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_192s_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_256f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_256s_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_128f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_128s_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_192f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_192s_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_256f_simple return 1; #else return 0; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_256s_simple return 1; #else return 0; #endif - ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_END +///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ENABLED_CASE_END } else { return 0; } @@ -192,121 +234,161 @@ OQS_API OQS_SIG *OQS_SIG_new(const char *method_name) { #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_3)) { #ifdef OQS_ENABLE_SIG_dilithium_3 return OQS_SIG_dilithium_3_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_dilithium_5)) { #ifdef OQS_ENABLE_SIG_dilithium_5 return OQS_SIG_dilithium_5_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_44_ipd return OQS_SIG_ml_dsa_44_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_44)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_44 + return OQS_SIG_ml_dsa_44_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_65_ipd return OQS_SIG_ml_dsa_65_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_65)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_65 + return OQS_SIG_ml_dsa_65_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87_ipd)) { #ifdef OQS_ENABLE_SIG_ml_dsa_87_ipd return OQS_SIG_ml_dsa_87_ipd_new(); #else return NULL; #endif + + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_ml_dsa_87)) { +#ifdef OQS_ENABLE_SIG_ml_dsa_87 + return OQS_SIG_ml_dsa_87_new(); +#else + return NULL; +#endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_512)) { #ifdef OQS_ENABLE_SIG_falcon_512 return OQS_SIG_falcon_512_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_falcon_1024)) { #ifdef OQS_ENABLE_SIG_falcon_1024 return OQS_SIG_falcon_1024_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_128f_simple return OQS_SIG_sphincs_sha2_128f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_128s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_128s_simple return OQS_SIG_sphincs_sha2_128s_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_192f_simple return OQS_SIG_sphincs_sha2_192f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_192s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_192s_simple return OQS_SIG_sphincs_sha2_192s_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_256f_simple return OQS_SIG_sphincs_sha2_256f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_sha2_256s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_sha2_256s_simple return OQS_SIG_sphincs_sha2_256s_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_128f_simple return OQS_SIG_sphincs_shake_128f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_128s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_128s_simple return OQS_SIG_sphincs_shake_128s_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_192f_simple return OQS_SIG_sphincs_shake_192f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_192s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_192s_simple return OQS_SIG_sphincs_shake_192s_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256f_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_256f_simple return OQS_SIG_sphincs_shake_256f_simple_new(); #else return NULL; #endif + } else if (0 == strcasecmp(method_name, OQS_SIG_alg_sphincs_shake_256s_simple)) { #ifdef OQS_ENABLE_SIG_sphincs_shake_256s_simple return OQS_SIG_sphincs_shake_256s_simple_new(); #else return NULL; #endif - ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_END +///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_NEW_CASE_END // EDIT-WHEN-ADDING-SIG } else { return NULL; diff --git a/src/sig/sig.h b/src/sig/sig.h index 438bf4dd1..97a40cd88 100644 --- a/src/sig/sig.h +++ b/src/sig/sig.h @@ -40,10 +40,16 @@ extern "C" { #define OQS_SIG_alg_dilithium_5 "Dilithium5" /** Algorithm identifier for ML-DSA-44-ipd */ #define OQS_SIG_alg_ml_dsa_44_ipd "ML-DSA-44-ipd" +/** Algorithm identifier for ML-DSA-44 SIG. */ +#define OQS_SIG_alg_ml_dsa_44 "ML-DSA-44" /** Algorithm identifier for ML-DSA-65-ipd */ #define OQS_SIG_alg_ml_dsa_65_ipd "ML-DSA-65-ipd" +/** Algorithm identifier for ML-DSA-65 SIG. */ +#define OQS_SIG_alg_ml_dsa_65 "ML-DSA-65" /** Algorithm identifier for ML-DSA-87-ipd */ #define OQS_SIG_alg_ml_dsa_87_ipd "ML-DSA-87-ipd" +/** Algorithm identifier for ML-DSA-87 SIG. */ +#define OQS_SIG_alg_ml_dsa_87 "ML-DSA-87" /** Algorithm identifier for Falcon-512 */ #define OQS_SIG_alg_falcon_512 "Falcon-512" /** Algorithm identifier for Falcon-1024 */ @@ -75,8 +81,9 @@ extern "C" { ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALG_IDENTIFIER_END // EDIT-WHEN-ADDING-SIG ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_START + /** Number of algorithm identifiers above. */ -#define OQS_SIG_algs_length 20 +#define OQS_SIG_algs_length 23 ///// OQS_COPY_FROM_UPSTREAM_FRAGMENT_ALGS_LENGTH_END /** diff --git a/src/sig/sphincs/sig_sphincs.h b/src/sig/sphincs/sig_sphincs.h index 34a7381cd..a717a636e 100644 --- a/src/sig/sphincs/sig_sphincs.h +++ b/src/sig/sphincs/sig_sphincs.h @@ -5,7 +5,7 @@ #include -#ifdef OQS_ENABLE_SIG_sphincs_sha2_128f_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128f_simple) #define OQS_SIG_sphincs_sha2_128f_simple_length_public_key 32 #define OQS_SIG_sphincs_sha2_128f_simple_length_secret_key 64 #define OQS_SIG_sphincs_sha2_128f_simple_length_signature 17088 @@ -16,7 +16,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_sha2_128s_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_128s_simple) #define OQS_SIG_sphincs_sha2_128s_simple_length_public_key 32 #define OQS_SIG_sphincs_sha2_128s_simple_length_secret_key 64 #define OQS_SIG_sphincs_sha2_128s_simple_length_signature 7856 @@ -27,7 +27,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_128s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_sha2_192f_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192f_simple) #define OQS_SIG_sphincs_sha2_192f_simple_length_public_key 48 #define OQS_SIG_sphincs_sha2_192f_simple_length_secret_key 96 #define OQS_SIG_sphincs_sha2_192f_simple_length_signature 35664 @@ -38,7 +38,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_sha2_192s_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_192s_simple) #define OQS_SIG_sphincs_sha2_192s_simple_length_public_key 48 #define OQS_SIG_sphincs_sha2_192s_simple_length_secret_key 96 #define OQS_SIG_sphincs_sha2_192s_simple_length_signature 16224 @@ -49,7 +49,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_192s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_sha2_256f_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256f_simple) #define OQS_SIG_sphincs_sha2_256f_simple_length_public_key 64 #define OQS_SIG_sphincs_sha2_256f_simple_length_secret_key 128 #define OQS_SIG_sphincs_sha2_256f_simple_length_signature 49856 @@ -60,7 +60,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_sha2_256s_simple +#if defined(OQS_ENABLE_SIG_sphincs_sha2_256s_simple) #define OQS_SIG_sphincs_sha2_256s_simple_length_public_key 64 #define OQS_SIG_sphincs_sha2_256s_simple_length_secret_key 128 #define OQS_SIG_sphincs_sha2_256s_simple_length_signature 29792 @@ -71,7 +71,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_sign(uint8_t *signature, siz OQS_API OQS_STATUS OQS_SIG_sphincs_sha2_256s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_128f_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_128f_simple) #define OQS_SIG_sphincs_shake_128f_simple_length_public_key 32 #define OQS_SIG_sphincs_shake_128f_simple_length_secret_key 64 #define OQS_SIG_sphincs_shake_128f_simple_length_signature 17088 @@ -82,7 +82,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_sign(uint8_t *signature, si OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_128s_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_128s_simple) #define OQS_SIG_sphincs_shake_128s_simple_length_public_key 32 #define OQS_SIG_sphincs_shake_128s_simple_length_secret_key 64 #define OQS_SIG_sphincs_shake_128s_simple_length_signature 7856 @@ -93,7 +93,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_sign(uint8_t *signature, si OQS_API OQS_STATUS OQS_SIG_sphincs_shake_128s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_192f_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_192f_simple) #define OQS_SIG_sphincs_shake_192f_simple_length_public_key 48 #define OQS_SIG_sphincs_shake_192f_simple_length_secret_key 96 #define OQS_SIG_sphincs_shake_192f_simple_length_signature 35664 @@ -104,7 +104,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_sign(uint8_t *signature, si OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_192s_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_192s_simple) #define OQS_SIG_sphincs_shake_192s_simple_length_public_key 48 #define OQS_SIG_sphincs_shake_192s_simple_length_secret_key 96 #define OQS_SIG_sphincs_shake_192s_simple_length_signature 16224 @@ -115,7 +115,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_sign(uint8_t *signature, si OQS_API OQS_STATUS OQS_SIG_sphincs_shake_192s_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_256f_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_256f_simple) #define OQS_SIG_sphincs_shake_256f_simple_length_public_key 64 #define OQS_SIG_sphincs_shake_256f_simple_length_secret_key 128 #define OQS_SIG_sphincs_shake_256f_simple_length_signature 49856 @@ -126,7 +126,7 @@ OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_sign(uint8_t *signature, si OQS_API OQS_STATUS OQS_SIG_sphincs_shake_256f_simple_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key); #endif -#ifdef OQS_ENABLE_SIG_sphincs_shake_256s_simple +#if defined(OQS_ENABLE_SIG_sphincs_shake_256s_simple) #define OQS_SIG_sphincs_shake_256s_simple_length_public_key 64 #define OQS_SIG_sphincs_shake_256s_simple_length_secret_key 128 #define OQS_SIG_sphincs_shake_256s_simple_length_signature 29792 diff --git a/tests/KATs/sig/kats.json b/tests/KATs/sig/kats.json index 48089af2e..42fffecc4 100644 --- a/tests/KATs/sig/kats.json +++ b/tests/KATs/sig/kats.json @@ -19,15 +19,24 @@ "all": "f4f23c1153682007d5dec02c35e47061c17900fcf0adb3fd0437f1988fa13655", "single": "da27fe8a462de7307ddf1f9b00072a457d9c5b14e838c148fbe2662094b9a2ca" }, + "ML-DSA-44": { + "single": "e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1" + }, "ML-DSA-44-ipd": { "single": "e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1" }, + "ML-DSA-65": { + "single": "7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7" + }, "ML-DSA-65-ipd": { "single": "7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7" }, + "ML-DSA-87": { + "single": "f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f" + }, "ML-DSA-87-ipd": { "single": "f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f" - } + }, "SPHINCS+-SHA2-128f-simple": { "all": "4437eb44516630184c3cb5d3a4392e8bb955c2bf59ad17ab3c607fb7b7285780", "single": "cd1e13db3a56c0a6b3486a7b12bcddfda50cf5d1e4d14d3113e6456e969b8114" diff --git a/tests/constant_time/kem/passes.json b/tests/constant_time/kem/passes.json index 0e7959214..64f56c8ea 100644 --- a/tests/constant_time/kem/passes.json +++ b/tests/constant_time/kem/passes.json @@ -27,5 +27,8 @@ "ML-KEM-512-ipd": ["ml_kem"], "ML-KEM-768-ipd": ["ml_kem"], "ML-KEM-1024-ipd": ["ml_kem"], + "ML-KEM-512": ["ml_kem"], + "ML-KEM-768": ["ml_kem"], + "ML-KEM-1024": ["ml_kem"], "sntrup761": ["sntrup"] } diff --git a/tests/constant_time/sig/passes.json b/tests/constant_time/sig/passes.json index 8645bbaac..fee99dcfc 100644 --- a/tests/constant_time/sig/passes.json +++ b/tests/constant_time/sig/passes.json @@ -8,6 +8,9 @@ "ML-DSA-44-ipd": ["ml_dsa", "ml_dsa-avx2"], "ML-DSA-65-ipd": ["ml_dsa", "ml_dsa-avx2"], "ML-DSA-87-ipd": ["ml_dsa", "ml_dsa-avx2"], + "ML-DSA-44": ["ml_dsa", "ml_dsa-avx2"], + "ML-DSA-65": ["ml_dsa", "ml_dsa-avx2"], + "ML-DSA-87": ["ml_dsa", "ml_dsa-avx2"], "SPHINCS+-SHA2-128f-robust": ["sphincs", "sphincs-sha2-avx2"], "SPHINCS+-SHA2-128f-simple": ["sphincs", "sphincs-sha2-avx2"], "SPHINCS+-SHA2-128s-robust": ["sphincs", "sphincs-sha2-avx2"], diff --git a/tests/kat_sig.c b/tests/kat_sig.c index ef481c847..db70d1dd3 100644 --- a/tests/kat_sig.c +++ b/tests/kat_sig.c @@ -62,7 +62,7 @@ OQS_STATUS combine_message_signature(uint8_t **signed_msg, size_t *signed_msg_le memcpy(*signed_msg, signature, signature_len); memcpy(*signed_msg + signature_len, msg, msg_len); return OQS_SUCCESS; - } else if (0 == strcmp(sig->method_name, "ML-DSA-44-ipd")) { + } else if (0 == strcmp(sig->method_name, "ML-DSA-44-ipd") || 0 == strcmp(sig->method_name, "ML-DSA-44")) { // signed_msg = signature || msg *signed_msg_len = signature_len + msg_len; *signed_msg = malloc(*signed_msg_len); @@ -72,7 +72,7 @@ OQS_STATUS combine_message_signature(uint8_t **signed_msg, size_t *signed_msg_le memcpy(*signed_msg, signature, signature_len); memcpy(*signed_msg + signature_len, msg, msg_len); return OQS_SUCCESS; - } else if (0 == strcmp(sig->method_name, "ML-DSA-65-ipd")) { + } else if (0 == strcmp(sig->method_name, "ML-DSA-65-ipd") || 0 == strcmp(sig->method_name, "ML-DSA-65")) { // signed_msg = signature || msg *signed_msg_len = signature_len + msg_len; *signed_msg = malloc(*signed_msg_len); @@ -82,7 +82,7 @@ OQS_STATUS combine_message_signature(uint8_t **signed_msg, size_t *signed_msg_le memcpy(*signed_msg, signature, signature_len); memcpy(*signed_msg + signature_len, msg, msg_len); return OQS_SUCCESS; - } else if (0 == strcmp(sig->method_name, "ML-DSA-87-ipd")) { + } else if (0 == strcmp(sig->method_name, "ML-DSA-87-ipd") || 0 == strcmp(sig->method_name, "ML-DSA-87")) { // signed_msg = signature || msg *signed_msg_len = signature_len + msg_len; *signed_msg = malloc(*signed_msg_len); diff --git a/tests/test_alg_info.py b/tests/test_alg_info.py index d7546b7fb..bbe30c4b3 100644 --- a/tests/test_alg_info.py +++ b/tests/test_alg_info.py @@ -52,7 +52,7 @@ def test_alg_info_sig(sig_name): # find the parameter set in the datasheet foundit = False for parameter_set in datasheet['parameter-sets']: - if parameter_set['name'] == sig_name: + if parameter_set['name'] == sig_name or ('alias' in parameter_set and parameter_set['alias'] == sig_name): foundit = True # check that the values match assert(alg_info['claimed-nist-level'] == parameter_set['claimed-nist-level']) diff --git a/tests/test_vectors.sh b/tests/test_vectors.sh index 2a5fa8e4b..e74523457 100755 --- a/tests/test_vectors.sh +++ b/tests/test_vectors.sh @@ -7,7 +7,7 @@ else build_dir="${OQS_BUILD_DIR}" fi -if [ "$1" = "ML-DSA-44-ipd" ]; then +if [[ "$1" = "ML-DSA-44-ipd" || "$1" = "ML-DSA-44" ]]; then file=tests/PQC_Intermediate_Values/ML-DSA-44.txt scheme_name=ML-DSA-44-ipd @@ -17,7 +17,7 @@ if [ "$1" = "ML-DSA-44-ipd" ]; then exit 1 fi -elif [ "$1" = "ML-DSA-65-ipd" ]; then +elif [[ "$1" = "ML-DSA-65-ipd" || "$1" = "ML-DSA-65" ]]; then file=tests/PQC_Intermediate_Values/ML-DSA-65.txt scheme_name=ML-DSA-65-ipd @@ -27,7 +27,7 @@ elif [ "$1" = "ML-DSA-65-ipd" ]; then exit 1 fi -elif [ "$1" = "ML-DSA-87-ipd" ]; then +elif [[ "$1" = "ML-DSA-87-ipd" || "$1" = "ML-DSA-87" ]]; then file=tests/PQC_Intermediate_Values/ML-DSA-87.txt scheme_name=ML-DSA-87-ipd From 8ebbcb918e028d7f9e1dca598c0fe4a3fcf3028a Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 30 Jan 2024 17:31:40 +0100 Subject: [PATCH 23/27] update readme with aliases --- README.md | 4 ++-- scripts/update_docs_from_yaml.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f8b4695f..aebb3dbae 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ The list below indicates all algorithms supported by liboqs, but not all those a - **FrodoKEM**: FrodoKEM-640-AES, FrodoKEM-640-SHAKE, FrodoKEM-976-AES, FrodoKEM-976-SHAKE, FrodoKEM-1344-AES, FrodoKEM-1344-SHAKE - **HQC**: HQC-128, HQC-192, HQC-256 - **Kyber**: Kyber512, Kyber768, Kyber1024 -- **ML-KEM**: ML-KEM-512-ipd, ML-KEM-768-ipd, ML-KEM-1024-ipd +- **ML-KEM**: ML-KEM-512-ipd (alias: ML-KEM-512), ML-KEM-768-ipd (alias: ML-KEM-768), ML-KEM-1024-ipd (alias: ML-KEM-1024) - **NTRU-Prime**: sntrup761 @@ -55,7 +55,7 @@ The list below indicates all algorithms supported by liboqs, but not all those a - **CRYSTALS-Dilithium**: Dilithium2, Dilithium3, Dilithium5 - **Falcon**: Falcon-512, Falcon-1024 -- **ML-DSA**: ML-DSA-44-ipd, ML-DSA-65-ipd, ML-DSA-87-ipd +- **ML-DSA**: ML-DSA-44-ipd (alias: ML-DSA-44), ML-DSA-65-ipd (alias: ML-DSA-65), ML-DSA-87-ipd (alias: ML-DSA-87) - **SPHINCS+-SHA2**: SPHINCS+-SHA2-128f-simple, SPHINCS+-SHA2-128s-simple, SPHINCS+-SHA2-192f-simple, SPHINCS+-SHA2-192s-simple, SPHINCS+-SHA2-256f-simple, SPHINCS+-SHA2-256s-simple - **SPHINCS+-SHAKE**: SPHINCS+-SHAKE-128f-simple, SPHINCS+-SHAKE-128s-simple, SPHINCS+-SHAKE-192f-simple, SPHINCS+-SHAKE-192s-simple, SPHINCS+-SHAKE-256f-simple, SPHINCS+-SHAKE-256s-simple diff --git a/scripts/update_docs_from_yaml.py b/scripts/update_docs_from_yaml.py index 478ba8dde..ef152d376 100644 --- a/scripts/update_docs_from_yaml.py +++ b/scripts/update_docs_from_yaml.py @@ -295,13 +295,21 @@ def do_it(liboqs_root): parameter_sets = kem_yaml['parameter-sets'] if any(impl['large-stack-usage'] for impl in parameter_sets[0]['implementations']): readme.write('- **{}**: {}†'.format(kem_yaml['name'], parameter_sets[0]['name'])) + if 'alias' in parameter_sets[0]: + readme.write(' (alias: {})'.format(parameter_sets[0]['alias'])) else: readme.write('- **{}**: {}'.format(kem_yaml['name'], parameter_sets[0]['name'])) + if 'alias' in parameter_sets[0]: + readme.write(' (alias: {})'.format(parameter_sets[0]['alias'])) for parameter_set in parameter_sets[1:]: if any(impl['large-stack-usage'] for impl in parameter_set['implementations']): readme.write(', {}†'.format(parameter_set['name'])) + if 'alias' in parameter_set: + readme.write(' (alias: {})'.format(parameter_set['alias'])) else: readme.write(', {}'.format(parameter_set['name'])) + if 'alias' in parameter_set: + readme.write(' (alias: {})'.format(parameter_set['alias'])) readme.write('\n') readme.write(postamble) @@ -322,13 +330,21 @@ def do_it(liboqs_root): parameter_sets = sig_yaml['parameter-sets'] if any(impl['large-stack-usage'] for impl in parameter_sets[0]['implementations']): readme.write('- **{}**: {}†'.format(sig_yaml['name'], parameter_sets[0]['name'].replace('_','\_'))) + if 'alias' in parameter_sets[0]: + readme.write(' (alias: {})'.format(parameter_sets[0]['alias']).replace('_','\_')) else: readme.write('- **{}**: {}'.format(sig_yaml['name'], parameter_sets[0]['name'].replace('_','\_'))) + if 'alias' in parameter_sets[0]: + readme.write(' (alias: {})'.format(parameter_sets[0]['alias']).replace('_','\_')) for parameter_set in parameter_sets[1:]: if any(impl['large-stack-usage'] for impl in parameter_set['implementations']): readme.write(', {}†'.format(parameter_set['name'].replace('_', '\_'))) + if 'alias' in parameter_set: + readme.write(' (alias: {})'.format(parameter_set['alias']).replace('_','\_')) else: readme.write(', {}'.format(parameter_set['name'].replace('_', '\_'))) + if 'alias' in parameter_set: + readme.write(' (alias: {})'.format(parameter_set['alias']).replace('_','\_')) readme.write('\n') sphincs_yml = sig_yamls[-1] From cdd29e251586840137adac251dceecc3d76f7d23 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Tue, 6 Feb 2024 20:15:13 +0100 Subject: [PATCH 24/27] add 100 KATS for ML-DSA/KEM --- tests/KATs/kem/kats.json | 10 ++++++++-- tests/KATs/sig/kats.json | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/KATs/kem/kats.json b/tests/KATs/kem/kats.json index 3dffdb9d3..797a6e2a9 100644 --- a/tests/KATs/kem/kats.json +++ b/tests/KATs/kem/kats.json @@ -100,23 +100,29 @@ "single": "89e82a5bf2d4ddb2c6444e10409e6d9ca65dafbca67d1a0db2c9b54920a29172" }, "ML-KEM-1024": { + "all": "2a655868dcbb4d3f901b2eea4b7be06c7c218796a39701ad76612e5307354d63", "single": "03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7" }, "ML-KEM-1024-ipd": { + "all": "2a655868dcbb4d3f901b2eea4b7be06c7c218796a39701ad76612e5307354d63", "single": "03d6494b74c45d010e61b0328c1ab318c4df3b7f9dbd04d0e35b3468848584b7" }, "ML-KEM-512": { + "all": "03041d19a70df3695891e45f78a7b040cace4f065750f9e743265a4cd28f3063", "single": "76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f" }, "ML-KEM-512-ipd": { + "all": "03041d19a70df3695891e45f78a7b040cace4f065750f9e743265a4cd28f3063", "single": "76aae1fa3f8367522700b22da635a5bc4ced4298edb0eb9947aa3ba60d62676f" }, "ML-KEM-768": { + "all": "00f8b3a8059da63d0dc5c7767c3846033fceee14e6abd9f7aa96543b981a5cc1", "single": "c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310" - } + }, "ML-KEM-768-ipd": { + "all": "00f8b3a8059da63d0dc5c7767c3846033fceee14e6abd9f7aa96543b981a5cc1", "single": "c7e76b4b30c786b5b70c152a446e7832c1cb42b3816ec048dbeaf7041211b310" - } + }, "sntrup761": { "all": "36e1e53d4e6e295e8fb804449958ad9a3719aa350e91933c65791b9117382d57", "single": "afc42c3a5b10f4ef69654250097ebda9b9564570f4086744b24a6daf2bd1f89a" diff --git a/tests/KATs/sig/kats.json b/tests/KATs/sig/kats.json index 42fffecc4..7a5516978 100644 --- a/tests/KATs/sig/kats.json +++ b/tests/KATs/sig/kats.json @@ -20,21 +20,27 @@ "single": "da27fe8a462de7307ddf1f9b00072a457d9c5b14e838c148fbe2662094b9a2ca" }, "ML-DSA-44": { + "all": "183bc0c4398ade4fc17b6a7d876b82545a96331139a4f27269c95664b8c483f9", "single": "e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1" }, "ML-DSA-44-ipd": { + "all": "183bc0c4398ade4fc17b6a7d876b82545a96331139a4f27269c95664b8c483f9", "single": "e6f3ec4dc0b02dd3bcbbc6b105190e1890ca0bb3f802e2b571f0d70f3993a2e1" }, "ML-DSA-65": { + "all": "3af4bdd2567fca1016583f917067dd5624bba2df2210934f62b2f6127cf88547", "single": "7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7" }, "ML-DSA-65-ipd": { + "all": "3af4bdd2567fca1016583f917067dd5624bba2df2210934f62b2f6127cf88547", "single": "7225c4531086d88c9b7fa18101b0f78dda2d38df88812c65ddc1ae94fe3c01a7" }, "ML-DSA-87": { + "all": "cfd95d8ff8b92173685805ad8e3380095e4991bb3947b73f4c7e108ab47c5052", "single": "f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f" }, "ML-DSA-87-ipd": { + "all": "cfd95d8ff8b92173685805ad8e3380095e4991bb3947b73f4c7e108ab47c5052", "single": "f5cb5ed44a261a4118f9cfd5d55b4210939cb5b8531968a10c37060551a8927f" }, "SPHINCS+-SHA2-128f-simple": { From e0c688af19d9013d15fc00519a20c47e55ad03be Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 7 Feb 2024 09:47:47 +0100 Subject: [PATCH 25/27] fix after rebase --- scripts/copy_from_upstream/copy_from_upstream.py | 4 ++-- tests/KATs/kem/kats.json | 2 +- tests/KATs/sig/kats.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/copy_from_upstream/copy_from_upstream.py b/scripts/copy_from_upstream/copy_from_upstream.py index 77dde913e..32d897cdf 100755 --- a/scripts/copy_from_upstream/copy_from_upstream.py +++ b/scripts/copy_from_upstream/copy_from_upstream.py @@ -549,7 +549,7 @@ def process_families(instructions, basedir, with_kat, with_generator): except KeyError: # new key print("Adding new KAT for %s" % (scheme['pretty_name_full'])) pass - kats['kem'][scheme['pretty_name_full']] = scheme['metadata']['nistkat-sha256'] + kats['kem'][scheme['pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] if 'alias_pretty_name_full' in scheme: kats['kem'][scheme['alias_pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] else: @@ -559,7 +559,7 @@ def process_families(instructions, basedir, with_kat, with_generator): except KeyError: # new key print("Adding new KAT for %s" % (scheme['pretty_name_full'])) pass - kats['sig'][scheme['pretty_name_full']] = scheme['metadata']['nistkat-sha256'] + kats['sig'][scheme['pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] if 'alias_pretty_name_full' in scheme: kats['sig'][scheme['alias_pretty_name_full']]['single'] = scheme['metadata']['nistkat-sha256'] diff --git a/tests/KATs/kem/kats.json b/tests/KATs/kem/kats.json index 797a6e2a9..750b6752e 100644 --- a/tests/KATs/kem/kats.json +++ b/tests/KATs/kem/kats.json @@ -127,4 +127,4 @@ "all": "36e1e53d4e6e295e8fb804449958ad9a3719aa350e91933c65791b9117382d57", "single": "afc42c3a5b10f4ef69654250097ebda9b9564570f4086744b24a6daf2bd1f89a" } -} +} \ No newline at end of file diff --git a/tests/KATs/sig/kats.json b/tests/KATs/sig/kats.json index 7a5516978..73595b103 100644 --- a/tests/KATs/sig/kats.json +++ b/tests/KATs/sig/kats.json @@ -91,4 +91,4 @@ "all": "dadcf175289c25aaa530a389cc84154dc4331fabda06ffaf2a292944e4d03841", "single": "37d37c9b43d71341b7dd5da7f8ebbe8bbae3d7bfc53f5378446023cbcf6e04f2" } -} +} \ No newline at end of file From eff9bdfe85744fdc14dbb9a1b456f2c9e4da09b1 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Wed, 7 Feb 2024 22:29:28 +0100 Subject: [PATCH 26/27] update std algorithms [trigger downstream] --- .CMake/alg_support.cmake | 2 +- .../.CMake/alg_support.cmake/list_standardized_algs.fragment | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index bc4f3aa93..f2d2a8592 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -448,7 +448,7 @@ if(NOT ((OQS_MINIMAL_BUILD STREQUAL "") OR (OQS_MINIMAL_BUILD STREQUAL "OFF"))) filter_algs("${OQS_MINIMAL_BUILD}") elseif (${OQS_ALGS_ENABLED} STREQUAL "STD") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_START - filter_algs("KEM_kyber_512;KEM_kyber_768;KEM_kyber_1024;KEM_ml_kem_512_ipd;KEM_ml_kem_768_ipd;KEM_ml_kem_1024_ipd;SIG_dilithium_2;SIG_dilithium_3;SIG_dilithium_5;SIG_ml_dsa_44_ipd;SIG_ml_dsa_65_ipd;SIG_ml_dsa_87_ipd;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") + filter_algs("KEM_ml_kem_512_ipd;KEM_ml_kem_768_ipd;KEM_ml_kem_1024_ipd;SIG_dilithium_;SIG_dilithium_;SIG_dilithium_;SIG_ml_dsa_44_ipd;SIG_ml_dsa_65_ipd;SIG_ml_dsa_87_ipd;SIG_falcon_512;SIG_falcon_1024;SIG_sphincs_sha2_128f_simple;SIG_sphincs_sha2_128s_simple;SIG_sphincs_sha2_192f_simple;SIG_sphincs_sha2_192s_simple;SIG_sphincs_sha2_256f_simple;SIG_sphincs_sha2_256s_simple;SIG_sphincs_shake_128f_simple;SIG_sphincs_shake_128s_simple;SIG_sphincs_shake_192f_simple;SIG_sphincs_shake_192s_simple;SIG_sphincs_shake_256f_simple;SIG_sphincs_shake_256s_simple") ##### OQS_COPY_FROM_UPSTREAM_FRAGMENT_LIST_STANDARDIZED_ALGS_END elseif(${OQS_ALGS_ENABLED} STREQUAL "NIST_R4") filter_algs("KEM_classic_mceliece_348864;KEM_classic_mceliece_348864f;KEM_classic_mceliece_460896;KEM_classic_mceliece_460896f;KEM_classic_mceliece_6688128;KEM_classic_mceliece_6688128f;KEM_classic_mceliece_6960119;KEM_classic_mceliece_6960119f;KEM_classic_mceliece_8192128;KEM_classic_mceliece_8192128f;KEM_hqc_128;KEM_hqc_192;KEM_hqc_256;KEM_bike_l1;KEM_bike_l3") diff --git a/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment b/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment index bcf309937..d0bf2a61b 100644 --- a/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment +++ b/scripts/copy_from_upstream/.CMake/alg_support.cmake/list_standardized_algs.fragment @@ -1,6 +1,6 @@ filter_algs(" -{%- for family in instructions['kems'] if family['name'] in ['kyber', 'ml_kem'] -%} +{%- for family in instructions['kems'] if family['name'] in ['ml_kem'] -%} {%- for scheme in family['schemes'] -%} KEM_{{ family['name'] }}_{{ scheme['scheme'] }}; {%- endfor -%} @@ -8,7 +8,7 @@ {%- for family in instructions['sigs'] -%} {%- set outer_loop = loop -%} {%- for scheme in family['schemes'] -%} - SIG_{{ family['name'] }}_{{ scheme['scheme'] if family['name'] in ['dilithium', 'ml_dsa', 'falcon', 'sphincs'] }}{%- if not (outer_loop.last and loop.last) -%};{%- endif -%} + SIG_{{ family['name'] }}_{{ scheme['scheme'] if family['name'] in ['ml_dsa', 'falcon', 'sphincs'] }}{%- if not (outer_loop.last and loop.last) -%};{%- endif -%} {%- endfor -%} {%- endfor -%} ") From 0f5704750a744db9ae3dafa56c9b112b05912bc6 Mon Sep 17 00:00:00 2001 From: Basil Hess Date: Mon, 19 Feb 2024 09:45:02 +0100 Subject: [PATCH 27/27] resolve merge conflicts --- tests/constant_time/kem/issues.json | 3 +++ tests/constant_time/sig/issues.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/tests/constant_time/kem/issues.json b/tests/constant_time/kem/issues.json index ae2f88fa1..4431f4746 100644 --- a/tests/constant_time/kem/issues.json +++ b/tests/constant_time/kem/issues.json @@ -27,5 +27,8 @@ "ML-KEM-512-ipd": [], "ML-KEM-768-ipd": [], "ML-KEM-1024-ipd": [], + "ML-KEM-512": [], + "ML-KEM-768": [], + "ML-KEM-1024": [], "sntrup761": [] } diff --git a/tests/constant_time/sig/issues.json b/tests/constant_time/sig/issues.json index 88e4c1d75..2cb9f200b 100644 --- a/tests/constant_time/sig/issues.json +++ b/tests/constant_time/sig/issues.json @@ -8,6 +8,9 @@ "ML-DSA-44-ipd": [], "ML-DSA-65-ipd": [], "ML-DSA-87-ipd": [], + "ML-DSA-44": [], + "ML-DSA-65": [], + "ML-DSA-87": [], "SPHINCS+-SHA256-128f-robust": ["sphincs"], "SPHINCS+-SHA256-128f-simple": ["sphincs"], "SPHINCS+-SHA256-128s-robust": ["sphincs"],